def last_activity(self, stanza): log.debug("local last activity request: %s" % (stanza.toXml(), )) stanza.consumed = True 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") userid = util.jid_user(stanza['to']) d = self.parent.presencedb.get(userid) d.addCallback(_db, stanza)
def onVCardSet(self, stanza, sender=None): """ Handle vCards set IQs. This simply takes care of importing the key in the keyring for future signature verification. Actual key verification is done by c2s when accepting vCards coming from clients. WARNING/1 does this mean that we bindly accept keys from components? -- YES blindly :P c2s will filter invalid requests WARNING/2 importing the key means that keys coming from local c2s are imported twice because the keyring is the same. Unless we want to make a separated keyring only for resolver? -- YES USING .gnupg-cache """ # TODO parse vcard for interesting sections if stanza.vcard.key is not None: # we do this because of the uri member in domish.Element keydata = stanza.vcard.key.firstChildElement() if keydata.name == 'uri': keydata = str(keydata) if keydata.startswith(xmlstream2.DATA_PGP_PREFIX): keydata = base64.b64decode(keydata[len(xmlstream2.DATA_PGP_PREFIX):]) # import into cache keyring userid = util.jid_user(stanza['from']) # this chould take a lot of time (up to 500ms) if self.parent.keyring.check_user_key(keydata, userid): log.debug("key cached successfully") else: log.warn("invalid key")
def user_available(self, stanza): """Called when receiving a presence stanza.""" userid = util.jid_user(stanza['from']) try: stub = self.presence_cache[userid] stub.push(stanza) except KeyError: stub = PresenceStub.fromElement(stanza) self.presence_cache[userid] = stub
def last_activity(self, stanza): log.debug("local last activity request: %s" % (stanza.toXml(), )) stanza.consumed = True 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") userid = util.jid_user(stanza['to']) d = self.parent.presencedb.get(userid) d.addCallback(_db, stanza)
def probe(self, stanza): """Handle presence probes from router.""" #log.debug("local presence probe: %s" % (stanza.toXml(), )) stanza.consumed = True 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) userid = util.jid_user(stanza['to']) d = self.parent.presencedb.get(userid) d.addCallback(_db, stanza)
def test_jid_user(self): jidstring = '[email protected]/resource' user = util.jid_user(jidstring) self.assertEqual(user, 'user')
def probe(self, stanza): """Handle presence probes from router.""" #log.debug("local presence probe: %s" % (stanza.toXml(), )) stanza.consumed = True 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) userid = util.jid_user(stanza['to']) d = self.parent.presencedb.get(userid) d.addCallback(_db, stanza)