Exemple #1
0
        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")
Exemple #2
0
        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")
Exemple #3
0
        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)
Exemple #4
0
    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())
Exemple #5
0
 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)
Exemple #6
0
    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())
Exemple #7
0
        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'], ))
Exemple #8
0
        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)
Exemple #9
0
 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')
Exemple #10
0
        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'], ))
Exemple #11
0
        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)
Exemple #12
0
 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')