1
2
3
4
5
6
7 from xmpp import *
8 from xmppd import *
9 import socket,thread,hashlib
10
12 """ 4. <db:result from= to= /> ->
13
14 8. db:verify ->
15 9. <- db:verify
16 10. <- db:result
17 """
18 NS=NS_DIALBACK
24
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
37 key=stanza.getData()
38 self.DEBUG('Received dialback key %s (%s->%s).'%(`key`,frm,to),'info')
39
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
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
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)
72 elif name=='result' and session.TYP=='client':
73
74 if stanza['type']=='valid':
75 session.set_session_state(SESSION_AUTHED)
76 session.push_queue()
77 raise NodeProcessed
78
84
89