Changeset 45

Show
Ignore:
Timestamp:
02/11/04 22:48:18 (5 years ago)
Author:
jajcus
Message:

- working ident support

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/TODO

    r34 r45  
    33  which is not yet supported by PyXMPP, but with jabber:component:accept could 
    44  also be done). 
    5 - simple ident server with "uplink" capability 
    65- channel list browsing (using Service Discovery) 
    76- more IRC stream error handling 
     7- remove unneeded debuging code 
  • trunk/jjigw.dtd

    r36 r45  
    11 
    2 <!ELEMENT jjigw                 (connect,network+) > 
     2<!ELEMENT jjigw                 (connect,spidentd?,network+) > 
    33 
    44<!ELEMENT connect       (host,port,secret) > 
     
    66<!ELEMENT port          (#PCDATA) > 
    77<!ELEMENT secret        (#PCDATA) > 
     8 
     9<!ELEMENT spidentd      (socket) > 
     10<!ELEMENT socket        (#PCDATA) > 
    811 
    912<!ELEMENT network       (server+,channel*) > 
  • trunk/jjigw.py

    r40 r45  
    1212import random 
    1313import signal 
     14import Queue 
     15import time 
    1416 
    1517from pyxmpp import ClientStream,JID,Iq,Presence,Message,StreamError 
     
    9193        self.port=int(node.xpathEval("port")[0].getContent()) 
    9294        self.secret=node.xpathEval("secret")[0].getContent() 
     95 
     96class SPIdentDConfig: 
     97    def __init__(self,node): 
     98        node=node.xpathEval("socket")[0] 
     99        self.socket=node.getContent() 
    93100 
    94101class ServerConfig: 
     
    152159        self.connect=ConnectConfig(self.doc.xpathEval("jjigw/connect")[0]) 
    153160        self.network=NetworkConfig(self.doc.xpathEval("jjigw/network")[0]) 
     161        spidentd=self.doc.xpathEval("jjigw/spidentd") 
     162        if spidentd: 
     163            self.spidentd=SPIdentDConfig(spidentd[0]) 
     164        else: 
     165            self.spidentd=None 
    154166    def __del__(self): 
    155167        if self.doc: 
     
    581593        self.network=config.network 
    582594        self.default_encoding=self.network.default_encoding 
     595        self.conninfo=None 
    583596        nick=nick.encode(self.default_encoding,"strict") 
    584597        if not self.network.valid_nick(nick): 
     
    722735                self.socket.close() 
    723736                self.socket=None 
     737            if self.conninfo: 
     738                self.component.unregister_connection(self.conninfo) 
     739                self.conninfo=None 
    724740        finally: 
    725741            self.lock.release() 
     
    730746            self.exit="No servers left, quitting" 
    731747            return 
     748        if self.conninfo: 
     749            self.component.unregister_connection(self.conninfo) 
     750            self.conninfo=None 
    732751        if self.socket: 
    733752            self.socket.close() 
     
    743762                try: 
    744763                    self.socket.close() 
     764                    if self.conninfo: 
     765                        self.component.unregister_connection(self.conninfo) 
     766                        self.conninfo=None 
    745767                except: 
    746768                    pass 
     
    748770            return 
    749771        self._send("NICK %s" % (self.nick,)) 
    750         user=sha.new(self.jid.bare().as_string()).hexdigest() 
     772        user=sha.new(self.jid.bare().as_string()).hexdigest()[:64] 
     773        self.conninfo=ConnectionInfo(self.socket,user) 
     774        self.component.register_connection(self.conninfo) 
    751775        self._send("USER %s 0 * :JJIGW User %s" % (user,user)) 
    752776        self.server=server 
     
    10531077        self.component.print_exception() 
    10541078 
     1079class ConnectionInfo: 
     1080    def __init__(self,socket,user): 
     1081        self.localip,self.localport=socket.getsockname() 
     1082        self.remoteip,self.remoteport=socket.getpeername() 
     1083        self.user=user 
     1084 
     1085class SPIdentD: 
     1086    def __init__(self,component,config): 
     1087        self.socket_path=config.socket 
     1088        self.component=component 
     1089        self.socket=None 
     1090        self.queue=Queue.Queue(100) 
     1091        self.thread=threading.Thread(target=self.run_thread) 
     1092        self.thread.setDaemon(1) 
     1093        self.thread.start() 
     1094 
     1095    def run_thread(self): 
     1096        while not self.component.shutdown: 
     1097            self.socket=socket.socket(socket.AF_UNIX) 
     1098            try: 
     1099                try: 
     1100                    self.socket.connect(self.socket_path) 
     1101                    self.loop() 
     1102                except socket.error: 
     1103                    self.print_exception() 
     1104                    pass 
     1105            finally: 
     1106                try: 
     1107                    self.socket.close() 
     1108                except: 
     1109                    pass 
     1110                self.socket=None 
     1111                if not self.component.shutdown: 
     1112                    print >>sys.stderr,"Waiting before spidentd connection restart..." 
     1113                    time.sleep(10) 
     1114 
     1115    def loop(self): 
     1116        while not self.component.shutdown: 
     1117            try: 
     1118                item=self.queue.get(1,1) 
     1119            except Queue.Empty: 
     1120                continue 
     1121            while item: 
     1122                try: 
     1123                    if item[0]=="add": 
     1124                        ci=item[1] 
     1125                        self.socket.send("add %s:%i %s:%i %s\n" % ( 
     1126                            ci.localip,ci.localport,ci.remoteip,ci.remoteport,ci.user)) 
     1127                    elif item[0]=="remove": 
     1128                        ci=item[1] 
     1129                        self.socket.send("remove %s:%i %s:%i\n" % ( 
     1130                            ci.localip,ci.localport,ci.remoteip,ci.remoteport)) 
     1131                except socket.error: 
     1132                    self.queue.put(item) 
     1133                    raise 
     1134                try: 
     1135                    item=self.queue.get(0) 
     1136                except Queue.Empty: 
     1137                    break 
     1138 
     1139    def register_connection(self,conninfo): 
     1140        self.queue.put(("add",conninfo)) 
     1141 
     1142    def unregister_connection(self,conninfo): 
     1143        self.queue.put(("remove",conninfo)) 
     1144 
     1145    def debug(self,msg): 
     1146        self.component.debug(msg) 
     1147     
     1148    def print_exception(self): 
     1149        self.component.print_exception() 
     1150 
    10551151class Component(pyxmpp.jabberd.Component): 
    10561152    def __init__(self,config): 
     
    10641160        self.irc_sessions={} 
    10651161        self.config=config 
     1162        if config.spidentd: 
     1163            self.ident_handler=SPIdentD(self,config.spidentd) 
     1164        else: 
     1165            self.ident_handler=None 
    10661166 
    10671167    def signal_handler(self,signum,frame): 
     
    12811381        return 1 
    12821382 
     1383    def register_connection(self,conninfo): 
     1384        if self.ident_handler: 
     1385            self.ident_handler.register_connection(conninfo) 
     1386 
     1387    def unregister_connection(self,conninfo): 
     1388        if self.ident_handler: 
     1389            self.ident_handler.unregister_connection(conninfo) 
     1390 
    12831391try: 
    12841392    config=Config("jjigw.xml") 
  • trunk/spidentd.py

    r43 r45  
    130130                                return line 
    131131                        if len(self.buf)>1024: 
    132                                 print >>sys.stderr,"Input line too long" 
     132                                print >>sys.stderr,"Input line too long: %r" % (self.buf,) 
    133133                                return None 
    134134                        r=self.socket.recv(1024)