def _db(presence, stanza): log.debug("iq/last: presence=%r" % (presence, )) if type(presence) == list and len(presence) > 0: user = presence[0] response = xmlstream.toResponse(stanza, 'result') response_from = util.userid_to_jid(user['userid'], self.xmlstream.thisEntity.host) response['from'] = response_from.userhost() query = response.addElement((xmlstream2.NS_IQ_LAST, 'query')) if self.parent.sfactory.client_connected(response_from): query['seconds'] = '0' else: latest = None for user in presence: if latest is None or latest['timestamp'] > user['timestamp']: latest = user # TODO timediff from latest #log.debug("max timestamp: %r" % (max, )) query['seconds'] = '123456' self.send(response) log.debug("iq/last result sent: %s" % (response.toXml().encode('utf-8'), )) else: # TODO return error? log.debug("iq/last: user not found")
def _db(presence, stanza): log.debug("iq/last: presence=%r" % (presence, )) if type(presence) == list and len(presence) > 0: user = presence[0] response = xmlstream.toResponse(stanza, 'result') response_from = util.userid_to_jid( user['userid'], self.xmlstream.thisEntity.host) response['from'] = response_from.userhost() query = response.addElement((xmlstream2.NS_IQ_LAST, 'query')) if self.parent.sfactory.client_connected(response_from): query['seconds'] = '0' else: latest = None for user in presence: if latest is None or latest['timestamp'] > user[ 'timestamp']: latest = user # TODO timediff from latest #log.debug("max timestamp: %r" % (max, )) query['seconds'] = '123456' self.send(response) log.debug("iq/last result sent: %s" % (response.toXml().encode('utf-8'), )) else: # TODO return error? log.debug("iq/last: user not found")
def testRoster(): global count, num num = 400 count = 0 def _presence(stanza): global count, num count += 1 if count >= 400: print 'received all presence' xs.addObserver('/presence', _presence) _jid = jid.JID(tuple=(None, self.network, None)) r = domish.Element((None, 'iq')) r.addUniqueId() r['type'] = 'get' q = r.addElement((xmppim.NS_ROSTER, 'query')) for n in range(num): _jid.user = util.rand_str(util.USERID_LENGTH, util.CHARSBOX_HEX_LOWERCASE) item = q.addElement((None, 'item')) item['jid'] = _jid.userhost() xs.send(r) if self.peer is not None: _jid = util.userid_to_jid(self.peer, self.network) r = domish.Element((None, 'iq')) r['type'] = 'get' r['id'] = util.rand_str(8) q = r.addElement((xmppim.NS_ROSTER, 'query')) item = q.addElement((None, 'item')) item['jid'] = _jid.userhost() xs.send(r)
def broadcast_public_key(self, userid, keydata): """Broadcasts to all remote c2s the given public key.""" # create vcard iq_vcard = domish.Element((None, 'iq')) iq_vcard['type'] = 'set' iq_vcard['from'] = util.userid_to_jid( userid, self.xmlstream.thisEntity.host).full() # add vcard vcard = iq_vcard.addElement((xmlstream2.NS_XMPP_VCARD4, 'vcard')) if keydata: vcard_key = vcard.addElement((None, 'key')) vcard_data = vcard_key.addElement((None, 'uri')) vcard_data.addContent(xmlstream2.DATA_PGP_PREFIX + base64.b64encode(keydata)) # send vcard to remote c2s for server in self.keyring.hostlist(): if server != self.servername: iq_vcard['id'] = util.rand_str(8) # remote server iq_vcard['to'] = util.component_jid(server, util.COMPONENT_C2S) # consume any response (very high priority) self.xmlstream.addOnetimeObserver( "/iq[@id='%s']" % iq_vcard['id'], self.consume, 500) # send! self.send_wrapped(iq_vcard, self.xmlstream.thisEntity.full())
def testMessage(): jid = xs.authenticator.jid message = domish.Element((None, 'message')) message['id'] = 'kontalk' + util.rand_str(8, util.CHARSBOX_AZN_LOWERCASE) message['type'] = 'chat' if self.peer: message['to'] = util.userid_to_jid(self.peer, self.network).full() else: message['to'] = jid.userhost() message.addElement((None, 'body'), content='test message') message.addElement(('urn:xmpp:server-receipts', 'request')) xs.send(message)
def broadcast_public_key(self, userid, keydata): """Broadcasts to all remote c2s the given public key.""" # create vcard iq_vcard = domish.Element((None, 'iq')) iq_vcard['type'] = 'set' iq_vcard['from'] = util.userid_to_jid(userid, self.xmlstream.thisEntity.host).full() # add vcard vcard = iq_vcard.addElement((xmlstream2.NS_XMPP_VCARD4, 'vcard')) if keydata: vcard_key = vcard.addElement((None, 'key')) vcard_data = vcard_key.addElement((None, 'uri')) vcard_data.addContent(xmlstream2.DATA_PGP_PREFIX + base64.b64encode(keydata)) # send vcard to remote c2s for server in self.keyring.hostlist(): if server != self.servername: iq_vcard['id'] = util.rand_str(8) # remote server iq_vcard['to'] = util.component_jid(server, util.COMPONENT_C2S) # consume any response (very high priority) self.xmlstream.addOnetimeObserver("/iq[@id='%s']" % iq_vcard['id'], self.consume, 500) # send! self.send_wrapped(iq_vcard, self.xmlstream.thisEntity.full())
def _db(presence, to): from copy import deepcopy log.debug("presence: %r" % (presence, )) if type(presence) == list and len(presence) > 0: for user in presence: response_from = util.userid_to_jid( user['userid'], self.parent.xmlstream.thisEntity.host).full() num_avail = 0 try: streams = self.parent.sfactory.streams[user['userid']] for x in streams.itervalues(): presence = x._presence if presence and not presence.hasAttribute('type'): response = domish.Element((None, 'presence')) response['to'] = to response['from'] = presence['from'] # copy stuff for child in ('status', 'show', 'priority'): e = getattr(presence, child) if e: response.addChild(deepcopy(e)) self.send(response) num_avail += 1 except KeyError: pass # no available resources - send unavailable presence if not num_avail: response = domish.Element((None, 'presence')) response['to'] = to response['from'] = response_from if user['status'] is not None: response.addElement((None, 'status'), content=user['status']) if user['show'] is not None: response.addElement((None, 'show'), content=user['show']) response['type'] = 'unavailable' delay = domish.Element(('urn:xmpp:delay', 'delay')) delay['stamp'] = user['timestamp'].strftime( xmlstream2.XMPP_STAMP_FORMAT) response.addChild(delay) self.send(response) if self.parent.logTraffic: log.debug("presence sent: %s" % (response.toXml().encode('utf-8'), )) else: log.debug("presence sent: %s" % (response['from'], )) # send vcard iq_vcard = domish.Element((None, 'iq')) iq_vcard['type'] = 'set' iq_vcard['from'] = response_from iq_vcard['to'] = to # add vcard vcard = iq_vcard.addElement( (xmlstream2.NS_XMPP_VCARD4, 'vcard')) if user['fingerprint']: pub_key = self.parent.keyring.get_key( user['userid'], user['fingerprint']) if pub_key: vcard_key = vcard.addElement((None, 'key')) vcard_data = vcard_key.addElement((None, 'uri')) vcard_data.addContent( "data:application/pgp-keys;base64," + base64.b64encode(pub_key)) self.send(iq_vcard) if self.parent.logTraffic: log.debug("vCard sent: %s" % (iq_vcard.toXml().encode('utf-8'), )) else: log.debug("vCard sent: %s" % (iq_vcard['from'], ))
def _db(presence, stanza): log.debug("presence: %r" % (presence, )) if type(presence) == list and len(presence) > 0: chain = domish.Element( (xmlstream2.NS_XMPP_STANZA_GROUP, 'group')) chain['id'] = stanza['id'] chain['count'] = str(len(presence)) for user in presence: response = xmlstream.toResponse(stanza) response['id'] = util.rand_str(8, util.CHARSBOX_AZN_LOWERCASE) response_from = util.userid_to_jid( user['userid'], self.xmlstream.thisEntity.host) response['from'] = response_from.full() if user['status'] is not None: response.addElement((None, 'status'), content=user['status']) if user['show'] is not None: response.addElement((None, 'show'), content=user['show']) if not self.parent.sfactory.client_connected( response_from): response['type'] = 'unavailable' delay = domish.Element(('urn:xmpp:delay', 'delay')) delay['stamp'] = user['timestamp'].strftime( xmlstream2.XMPP_STAMP_FORMAT) response.addChild(delay) response.addChild(chain) self.send(response) if self.parent.logTraffic: log.debug("probe result sent: %s" % (response.toXml().encode('utf-8'), )) else: log.debug("probe result sent: %s" % (response['from'], )) elif presence is not None and type(presence) != list: chain = domish.Element( (xmlstream2.NS_XMPP_STANZA_GROUP, 'group')) chain['id'] = stanza['id'] chain['count'] = '1' response = xmlstream.toResponse(stanza) if presence['status'] is not None: response.addElement((None, 'status'), content=presence['status']) if presence['show'] is not None: response.addElement((None, 'show'), content=presence['show']) response_from = util.userid_to_jid(presence['userid'], self.parent.servername) if not self.parent.sfactory.client_connected(response_from): response['type'] = 'unavailable' delay = domish.Element(('urn:xmpp:delay', 'delay')) delay['stamp'] = presence['timestamp'].strftime( xmlstream2.XMPP_STAMP_FORMAT) response.addChild(delay) response.addChild(chain) self.send(response) if self.parent.logTraffic: log.debug("probe result sent: %s" % (response.toXml().encode('utf-8'), )) else: log.debug("probe result sent: %s" % (response['from'], )) else: log.debug("probe: user not found") # TODO return error? response = xmlstream.toResponse(stanza, 'error') chain = domish.Element( (xmlstream2.NS_XMPP_STANZA_GROUP, 'group')) chain['id'] = stanza['id'] chain['count'] = '1' response.addChild(chain) self.send(response)
def test_userid_to_jid(self): jid = util.userid_to_jid( '4bdd4f929f3a1062253e4e496bafba0bdfb5db75ABCDEFGH', 'localhost') self.assertEqual(jid.user, '4bdd4f929f3a1062253e4e496bafba0bdfb5db75') self.assertEqual(jid.host, 'localhost') self.assertEqual(jid.resource, 'ABCDEFGH')
def _db(presence, to): from copy import deepcopy log.debug("presence: %r" % (presence, )) if type(presence) == list and len(presence) > 0: for user in presence: response_from = util.userid_to_jid(user['userid'], self.parent.xmlstream.thisEntity.host).full() num_avail = 0 try: streams = self.parent.sfactory.streams[user['userid']] for x in streams.itervalues(): presence = x._presence if presence and not presence.hasAttribute('type'): response = domish.Element((None, 'presence')) response['to'] = to response['from'] = presence['from'] # copy stuff for child in ('status', 'show', 'priority'): e = getattr(presence, child) if e: response.addChild(deepcopy(e)) self.send(response) num_avail += 1 except KeyError: pass # no available resources - send unavailable presence if not num_avail: response = domish.Element((None, 'presence')) response['to'] = to response['from'] = response_from if user['status'] is not None: response.addElement((None, 'status'), content=user['status']) if user['show'] is not None: response.addElement((None, 'show'), content=user['show']) response['type'] = 'unavailable' delay = domish.Element(('urn:xmpp:delay', 'delay')) delay['stamp'] = user['timestamp'].strftime(xmlstream2.XMPP_STAMP_FORMAT) response.addChild(delay) self.send(response) if self.parent.logTraffic: log.debug("presence sent: %s" % (response.toXml().encode('utf-8'), )) else: log.debug("presence sent: %s" % (response['from'], )) # send vcard iq_vcard = domish.Element((None, 'iq')) iq_vcard['type'] = 'set' iq_vcard['from'] = response_from iq_vcard['to'] = to # add vcard vcard = iq_vcard.addElement((xmlstream2.NS_XMPP_VCARD4, 'vcard')) if user['fingerprint']: pub_key = self.parent.keyring.get_key(user['userid'], user['fingerprint']) if pub_key: vcard_key = vcard.addElement((None, 'key')) vcard_data = vcard_key.addElement((None, 'uri')) vcard_data.addContent("data:application/pgp-keys;base64," + base64.b64encode(pub_key)) self.send(iq_vcard) if self.parent.logTraffic: log.debug("vCard sent: %s" % (iq_vcard.toXml().encode('utf-8'), )) else: log.debug("vCard sent: %s" % (iq_vcard['from'], ))
def _db(presence, stanza): log.debug("presence: %r" % (presence, )) if type(presence) == list and len(presence) > 0: chain = domish.Element((xmlstream2.NS_XMPP_STANZA_GROUP, 'group')) chain['id'] = stanza['id'] chain['count'] = str(len(presence)) for user in presence: response = xmlstream.toResponse(stanza) response['id'] = util.rand_str(8, util.CHARSBOX_AZN_LOWERCASE) response_from = util.userid_to_jid(user['userid'], self.xmlstream.thisEntity.host) response['from'] = response_from.full() if user['status'] is not None: response.addElement((None, 'status'), content=user['status']) if user['show'] is not None: response.addElement((None, 'show'), content=user['show']) if not self.parent.sfactory.client_connected(response_from): response['type'] = 'unavailable' delay = domish.Element(('urn:xmpp:delay', 'delay')) delay['stamp'] = user['timestamp'].strftime(xmlstream2.XMPP_STAMP_FORMAT) response.addChild(delay) response.addChild(chain) self.send(response) if self.parent.logTraffic: log.debug("probe result sent: %s" % (response.toXml().encode('utf-8'), )) else: log.debug("probe result sent: %s" % (response['from'], )) elif presence is not None and type(presence) != list: chain = domish.Element((xmlstream2.NS_XMPP_STANZA_GROUP, 'group')) chain['id'] = stanza['id'] chain['count'] = '1' response = xmlstream.toResponse(stanza) if presence['status'] is not None: response.addElement((None, 'status'), content=presence['status']) if presence['show'] is not None: response.addElement((None, 'show'), content=presence['show']) response_from = util.userid_to_jid(presence['userid'], self.parent.servername) if not self.parent.sfactory.client_connected(response_from): response['type'] = 'unavailable' delay = domish.Element(('urn:xmpp:delay', 'delay')) delay['stamp'] = presence['timestamp'].strftime(xmlstream2.XMPP_STAMP_FORMAT) response.addChild(delay) response.addChild(chain) self.send(response) if self.parent.logTraffic: log.debug("probe result sent: %s" % (response.toXml().encode('utf-8'), )) else: log.debug("probe result sent: %s" % (response['from'], )) else: log.debug("probe: user not found") # TODO return error? response = xmlstream.toResponse(stanza, 'error') chain = domish.Element((xmlstream2.NS_XMPP_STANZA_GROUP, 'group')) chain['id'] = stanza['id'] chain['count'] = '1' response.addChild(chain) self.send(response)
def test_userid_to_jid(self): jid = util.userid_to_jid('4bdd4f929f3a1062253e4e496bafba0bdfb5db75ABCDEFGH', 'localhost') self.assertEqual(jid.user, '4bdd4f929f3a1062253e4e496bafba0bdfb5db75') self.assertEqual(jid.host, 'localhost') self.assertEqual(jid.resource, 'ABCDEFGH')