Package spade :: Package xmppd :: Package modules :: Module dialback
[hide private]
[frames] | no frames]

Source Code for Module spade.xmppd.modules.dialback

 1  # Distributed under the terms of GPL version 2 or any later 
 2  # Copyright (C) Alexey Nezhdanov 2004 
 3  # Dialback module for xmppd.py 
 4   
 5  # $Id: dialback.py,v 1.2 2004/10/24 04:37:19 snakeru Exp $ 
 6   
 7  from xmpp import * 
 8  from xmppd import * 
 9  import socket,thread,hashlib 
10   
11 -class Dialback(PlugIn):
12 """ 4. <db:result from= to= /> -> 13 14 8. db:verify -> 15 9. <- db:verify 16 10. <- db:result 17 """ 18 NS=NS_DIALBACK
19 - def plugin(self,server):
20 server.Dispatcher.RegisterHandler('result',self.dialbackHandler,xmlns=NS_DIALBACK) 21 server.Dispatcher.RegisterHandler('verify',self.dialbackHandler,xmlns=NS_DIALBACK) 22 server.Dispatcher.RegisterHandler('features',self.FeaturesHandler,xmlns=NS_STREAMS) 23 self.waitlist={}
24
25 - def dialbackHandler(self,session,stanza):
26 frm=stanza['from'] 27 to=stanza['to'] 28 name=stanza.getName() 29 if to not in self._owner.servernames: 30 self.DEBUG('Received dialback key for unknown server.','error') 31 session.terminate_stream(STREAM_HOST_UNKNOWN) 32 elif not frm or frm<>frm.getDomain(): 33 self.DEBUG('Received dialback key from invalid server.','error') 34 session.terminate_stream(STREAM_INVALID_FROM) 35 elif name=='result' and session.TYP=='server': 36 # (4) Received an dialback key. We should verify it. 37 key=stanza.getData() 38 self.DEBUG('Received dialback key %s (%s->%s).'%(`key`,frm,to),'info') 39 # Now we should form a request and send it to authoritative server 40 req=Node('db:verify',{'from':session.ourname,'to':frm,'id':session.ID},[key]) 41 s=self._owner.getsession(frm) 42 if not s: 43 print "### db:No session for " + str(frm) 44 s=self._owner.S2S(session.ourname,frm.getDomain(),slave_session=session) 45 s.send(req) 46 if self.waitlist.has_key(frm): 47 self.waitlist[frm][1].terminate_stream(STREAM_CONFLICT) 48 self.waitlist[frm]=(key,session) 49 elif name=='verify' and session.TYP=='server': 50 # (8) Received the dialback key for verification 51 id=stanza['id'] 52 key=stanza.getData() 53 self.DEBUG('Received dialback key %s for verification against id %s.'%(key,id),'info') 54 if key.strip()==hashlib.sha1(id+self._owner.ID).hexdigest(): typ='valid' 55 else: typ='invalid' 56 rep=Node('db:verify',{'from':to,'to':frm,'id':id,'type':typ}) 57 session.send(rep) 58 elif name=='verify' and session.TYP=='client': 59 # (9) Received the verification reply 60 self.DEBUG('Received verified dialback key for id %s (%s->%s). Result is: %s.'%(stanza['id'],frm,to,stanza['type']),'info') 61 if self.waitlist.has_key(frm): 62 key,s=self.waitlist[frm] 63 if s.ID==stanza['id']: 64 rep=Node('db:result',{'from':to,'to':frm,'type':stanza['type']}) 65 s.send(rep) 66 if stanza['type']<>'valid': s.terminate_stream(STREAM_NOT_AUTHORIZED) 67 else: 68 s.peer=frm 69 s.set_session_state(SESSION_AUTHED) 70 else: 71 session.terminate_stream(STREAM_INVALID_ID) # it will terminate "initial stream" also 72 elif name=='result' and session.TYP=='client': 73 # (10) Received the result. Either we will be terminated now or authorized. 74 if stanza['type']=='valid': 75 session.set_session_state(SESSION_AUTHED) 76 session.push_queue() 77 raise NodeProcessed
78
79 - def __call__(self,session):
80 # Server connected, send request 81 key=hashlib.sha1(session.ID+self._owner.ID).hexdigest() 82 req=Node('db:result',{'from':session.ourname,'to':session.peer},[key]) 83 session.send(req)
84
85 - def FeaturesHandler(self,session,stanza):
86 if session._session_state>=SESSION_AUTHED: return # already authed. do nothing 87 if session.feature_in_process: return # another feature underway. Standby 88 self(session)
89