Example #1
0
    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)
Example #2
0
    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")
Example #3
0
    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
Example #4
0
    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)
Example #5
0
    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)
Example #6
0
 def test_jid_user(self):
     jidstring = '[email protected]/resource'
     user = util.jid_user(jidstring)
     self.assertEqual(user, 'user')
Example #7
0
    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)
Example #8
0
 def test_jid_user(self):
     jidstring = '[email protected]/resource'
     user = util.jid_user(jidstring)
     self.assertEqual(user, 'user')