Changeset 5

Show
Ignore:
Timestamp:
01/26/04 14:57:25 (5 years ago)
Author:
jajcus
Message:

- IRC case-insesitivity

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/jjigw.py

    r3 r5  
    5050 
    5151channel_re=re.compile(r"^[&#+!][^\000 \007 ,:\r\n]{1,49}$") 
     52nick_re=re.compile(r"^[a-zA-Z\x5b-\x60\x7b-\x7d\[\]\\`_^{|}][a-zA-Z\x5b-\x60\x7b-\x7d\[\]\\`_^{|}0-9-]{0,8}$") 
     53 
     54def escape_node_string(s): 
     55    s=s.replace(",quot,",'"') 
     56    s=s.replace(",amp,","&") 
     57    s=s.replace(",apos,","'") 
     58    s=s.replace(",slash,","/") 
     59    s=s.replace(",lt,","<") 
     60    s=s.replace(",gt,",">") 
     61    s=s.replace(",at,","@") 
     62    return s 
     63 
     64def unescape_node_string(s): 
     65    s=s.replace('"',",quot,") 
     66    s=s.replace("&",",amp,") 
     67    s=s.replace("'",",apos,") 
     68    s=s.replace("/",",slash,") 
     69    s=s.replace("<",",lt,") 
     70    s=s.replace(">",",gt,") 
     71    s=s.replace("@",",at,") 
     72    return s 
     73 
     74def node_to_channel(n,encoding): 
     75    s=n.encode(encoding,"strict") 
     76    s=escape_node_string(s) 
     77    if not channel_re.match(s): 
     78        raise ValueError,"Bad channel name: %r" % (s,) 
     79    return s 
     80 
     81def channel_to_node(ch,encoding): 
     82    s=unescape_node_string(ch) 
     83    n=unicode(s,encoding,"strict") 
     84    return n 
     85 
     86def node_to_nick(n,encoding): 
     87    s=n.encode(encoding,"strict") 
     88    s=escape_node_string(s) 
     89    if not nick_re.match(s): 
     90        raise ValueError,"Bad channel name: %r" % (s,) 
     91    return s 
     92 
     93def nick_to_node(ch,encoding): 
     94    s=unescape_node_string(ch) 
     95    n=unicode(s,encoding,"strict") 
     96    return n 
     97 
     98irc_translate_table=string.maketrans( 
     99        string.ascii_uppercase+"[]\\~", 
     100        string.ascii_lowercase+"{}|^") 
     101 
     102def normalize(s): 
     103    return s.translate(irc_translate_table) 
    52104 
    53105class IRCUser: 
     
    68120 
    69121    def join_channel(self,channel): 
    70         self.channels[channel.name]=channel 
     122        self.channels[normalize(channel.name)]=channel 
    71123 
    72124    def leave_channel(self,channel): 
    73125        try: 
    74             del self.channels[channel.name
     126            del self.channels[normalize(channel.name)
    75127        except KeyError: 
    76128            pass 
     
    85137        self.debug("Channel: %r" % (channel,)) 
    86138        if channel!="*": 
    87             channel=self.session.channels.get(channel
     139            channel=self.session.channels.get(normalize(channel)
    88140            if not channel: 
    89141                self.debug("Ignoring WHO reply: %r - unknown channel" % (params,)) 
     
    162214 
    163215    def nick_to_jid(self,nick): 
    164         return JID(self.room_jid.node,self.room_jid.domain,unicode(nick,self.encoding,"replace")) 
     216        return JID(self.room_jid.node,self.room_jid.domain, 
     217                unicode(nick,self.encoding,"replace")) 
    165218 
    166219    def get_user_presence(self,user): 
     
    197250 
    198251    def irc_cmd_JOIN(self,prefix,command,params): 
    199         if prefix==self.session.nick or prefix.startswith(self.session.nick+"!"): 
     252        nprefix=normalize(prefix) 
     253        nnick=normalize(self.session.nick) 
     254        if nprefix==nnick or nprefix.startswith(nnick+"!")): 
    200255            if self.state=="join": 
    201256                self.debug("Channel %r joined!" % (self.name,)) 
     
    251306        return self.session.debug(msg) 
    252307 
    253 nick_re=re.compile(r"^[a-zA-Z\x5b-\x60\x7b-\x7d\[\]\\`_^{|}][a-zA-Z\x5b-\x60\x7b-\x7d\[\]\\`_^{|}0-9-]{0,8}$") 
    254308 
    255309class IRCSession: 
     
    284338        self.lock.acquire() 
    285339        try: 
    286             self.users[user.nick]=user 
     340            self.users[normalize(user.nick)]=user 
    287341        finally: 
    288342            self.lock.release() 
     
    291345        self.lock.acquire() 
    292346        try: 
    293             if self.users.get(user.nick)==user: 
    294                 del self.users[user.nick] 
     347            nnick=normalize(user.nick) 
     348            if self.users.get(nnick)==user: 
     349                del self.users[nnick] 
    295350        finally: 
    296351            self.lock.release() 
     
    299354        self.lock.acquire() 
    300355        try: 
    301             self.users[new_nick]=user 
     356            self.users[normalize(new_nick)]=user 
    302357            try: 
    303                 del self.users[user.nick
     358                del self.users[normalize(user.nick)
    304359            except KeyError: 
    305360                pass 
     
    313368        else: 
    314369            nick=prefix 
    315         if self.users.has_key(nick): 
    316             return self.users[nick] 
     370        nnick=normalize(nick) 
     371        if self.users.has_key(nnick): 
     372            return self.users[nnick] 
    317373        user=IRCUser(self,prefix) 
    318374        self.register_user(user) 
     
    320376 
    321377    def check_nick(self,nick): 
    322         nick=nick.encode(self.default_encoding,"strict"
    323         if nick==self.nick
     378        nick=nick.encode(self.default_encoding
     379        if normalize(nick)==normalize(self.nick)
    324380            return 1 
    325381        else: 
     
    476532        if command in self.commands_dont_show: 
    477533            return 
    478         if prefix==self.nick or prefix and prefix.startswith(self.nick+"!"): 
    479             return 
    480         if prefix==self.server and len(params)==2 and params[0]==self.nick: 
     534        nprefix=normalize(prefix) 
     535        nnick=normalize(self.nick) 
     536        nserver=normalize(self.server) 
     537        if nprefix==nnick or prefix and nprefix.startswith(nnick+"!"): 
     538            return 
     539        if nprefix==nserver and len(params)==2 and params[0]==self.nick: 
    481540            body=u"(!) %s" % (unicode(params[1],self.default_encoding,"replace"),) 
    482541        elif command in ("004","005","252","253","254"): 
     
    491550        self.component.send(m) 
    492551 
    493     def join(self,channel,stanza): 
    494         channel=channel.encode(self.default_encoding) 
    495         if self.channels.has_key(channel): 
     552    def join(self,stanza): 
     553        to=stanza.get_to() 
     554        channel=node_to_channel(to,self.default_encoding) 
     555        if self.channels.has_key(normalize(channel)): 
    496556            return 
    497557        self.cond.acquire() 
     
    506566        channel=Channel(self,channel) 
    507567        channel.join(stanza) 
    508         self.channels[channel.name]=channel 
     568        self.channels[normalize(channel.name)]=channel 
    509569 
    510570    def message_to_channel(self,stanza): 
     
    512572            return 
    513573        channel=stanza.get_to().node 
    514         channel=channel.encode(self.default_encoding) 
     574        channel=node_to_channel(channel,self.default_encoding) 
    515575        if not channel_re.match(channel): 
    516576            debug("Bad channel name: %r" % (channel,)) 
     
    521581            body="\001ACTION "+body[4:]+"\001" 
    522582        self.send("PRIVMSG %s :%s" % (channel,body)) 
    523         channel=self.channels.get(channel
     583        channel=self.channels.get(normalize(channel)
    524584        if channel: 
    525585            channel.irc_cmd_PRIVMSG(self.nick,"PRIVMSG",[channel.name,body]) 
     
    666726            self.irc_sessions[fr.as_unicode()]=sess 
    667727        if to.node: 
    668             sess.join(to.node,stanza) 
     728            sess.join(stanza) 
    669729        else: 
    670730            p=Presence(