Esempio n. 1
0
 def initialize(self):
     iq = client.IQ(self._xs, "set")
     iq.addElement(("jabber:iq:register", "query"))
     iq.query.addElement("username", content=self._jid_obj.user)
     iq.query.addElement("password", content=self._password)
     iq.addCallback(self._registerResultEvent)
     iq.send()
Esempio n. 2
0
 def testUpload():
     cmd = client.IQ(xs, 'set')
     ch = cmd.addElement((xmlstream2.NS_MESSAGE_UPLOAD, 'upload'))
     ch['node'] = 'kontalkbox'
     media = ch.addElement((None, 'media'))
     media['type'] = 'image/png'
     cmd.send(self.network)
Esempio n. 3
0
    def sync(self, share, peerId=None, name=None):

        if share is None:
            repoId = None
            uuid = None
            version = 0
        else:
            peerId = share.conduit.peerId
            repoId = share.repoId
            collection = share.contents
            name = collection.displayName
            uuid = collection.itsUUID
            version = share.remoteVersion

        iq = client.IQ(self.xmlstream, "get")
        iq.addElement(("jabber:x:chandler", "query"))
        sync = iq.query.addElement('sync')
        sync['fromRepoId'] = self._repoId.str64()
        if repoId is not None:
            sync['toRepoId'] = repoId.str64()
        sync['name'] = name
        if uuid is not None:
            sync['uuid'] = uuid.str64()
        sync['version'] = str(version)

        reactor.callFromThread(iq.send, peerId)
        self.worker.ops[iq['id']] = ('sync', name)
Esempio n. 4
0
    def validate(self, code, publickey, delay=0):
        reg = client.IQ(self.client.xmlstream, 'set')
        query = reg.addElement((xmlstream2.NS_IQ_REGISTER, 'query'))
        form = query.addElement(('jabber:x:data', 'x'))
        form['type'] = 'submit'

        hidden = form.addElement((None, 'field'))
        hidden['type'] = 'hidden'
        hidden['var'] = 'FORM_TYPE'
        hidden.addElement((None, 'value'),
                          content='http://kontalk.org/protocol/register#code')

        vcode = form.addElement((None, 'field'))
        vcode['type'] = 'text-single'
        vcode['label'] = 'Validation code'
        vcode['var'] = 'code'
        vcode.addElement((None, 'value'), content=code)

        pkey = form.addElement((None, 'field'))
        pkey['type'] = 'text-single'
        pkey['label'] = 'Public key'
        pkey['var'] = 'publickey'
        pkey.addElement((None, 'value'), content=publickey)

        reg.send(self.client.network)
Esempio n. 5
0
 def keepAlive(self):
     if not self.kaResponseTimer and self.xmlstream:
         iq = client.IQ(self.xmlstream, "get")
         iq["to"] = self.me.host
         iq.addElement('ping', "urn:xmpp:ping")
         iq.addCallback(self.reinitKeepAlive)
         self.kaResponseTimer = reactor.callLater(30, self.reconnect)
         iq.send()
Esempio n. 6
0
    def vcardSet(self, publickey=None):
        if not publickey:
            publickey = self.config['publickey']['key']

        iq = client.IQ(self.client.xmlstream, 'set')
        vcard = iq.addElement((xmlstream2.NS_XMPP_VCARD4, 'vcard'))
        vcard_key = vcard.addElement((None, 'key'))
        vcard_data = vcard_key.addElement((None, 'uri'))
        vcard_data.addContent("data:application/pgp-keys;base64," + publickey)

        iq.send(self.client.xmlstream.authenticator.jid.userhost())
Esempio n. 7
0
 def sendAuth(self, jid, passwd, callback, errback=None):
     self.jid = jid
     self.passwd = passwd
     if errback:
         self.xmlstream.addObserver(INVALID_USER_EVENT, errback)
         self.xmlstream.addObserver(AUTH_FAILED_EVENT, errback)
     if self.version != '1.0':
         iq = client.IQ(self.xmlstream, "get")
         iq.addElement(("jabber:iq:auth", "query"))
         iq.query.addElement("username", content=jid.user)
         iq.addCallback(callback)
         iq.send()
Esempio n. 8
0
        def testValidate():
            reg = client.IQ(xs, 'set')
            query = reg.addElement((xmlstream2.NS_IQ_REGISTER, 'query'))
            form = query.addElement(('jabber:x:data', 'x'))
            form['type'] = 'submit'

            hidden = form.addElement((None, 'field'))
            hidden['type'] = 'hidden'
            hidden['var'] = 'FORM_TYPE'
            hidden.addElement((None, 'value'), content='http://kontalk.org/protocol/register#code')

            code = form.addElement((None, 'field'))
            code['type'] = 'text-single'
            code['label'] = 'Validation code'
            code['var'] = 'code'
            code.addElement((None, 'value'), content='686129')

            reg.send(self.network)
Esempio n. 9
0
    def register(self, delay=0):
        reg = client.IQ(self.client.xmlstream, 'set')
        query = reg.addElement((xmlstream2.NS_IQ_REGISTER, 'query'))
        form = query.addElement(('jabber:x:data', 'x'))
        form['type'] = 'submit'

        hidden = form.addElement((None, 'field'))
        hidden['type'] = 'hidden'
        hidden['var'] = 'FORM_TYPE'
        hidden.addElement((None, 'value'), content=xmlstream2.NS_IQ_REGISTER)

        phone = form.addElement((None, 'field'))
        phone['type'] = 'text-single'
        phone['label'] = 'Phone number'
        phone['var'] = 'phone'
        phone.addElement((None, 'value'), content='+39123456')

        reg.send(self.client.network)
Esempio n. 10
0
    def _bindResultEvent(self, iq):
        if iq["type"] == "result":
            self.bind = 1
            if self.session == 1:
                iq = client.IQ(self.xmlstream, "set")
                iq.addElement((SESSION_XMLNS, "session"), content=self.jid)

                iq.addCallback(self._sessionResultEvent)
                iq.send()
                return

        else:
            self.bind = 0
            # TODO - make a BIND_FAILED_EVENT?
            self.xmlstream.dispatch(self.xmlstream,
                                    xmlstream.AUTH_FAILED_EVENT)

        if self.bind == 1 and self.session == 1:
            self.xmlstream.dispatch(self.xmlstream,
                                    xmlstream.STREAM_AUTHD_EVENT)
        else:
            self.xmlstream.dispatch(iq, self.AUTH_FAILED_EVENT)
Esempio n. 11
0
    def authQueryResultEvent(self, iq, callback):
        if iq["type"] == "result":
            # Construct auth request
            iq = client.IQ(self.xmlstream, "set")
            iq.addElement(("jabber:iq:auth", "query"))
            iq.query.addElement("username", content = self.jid.user)
            iq.query.addElement("resource", content = self.jid.resource)

            # Prefer digest over plaintext
            if client.DigestAuthQry.matches(iq):
                digest = xmlstream.hashPassword(self.xmlstream.sid, self.passwd)
                iq.query.addElement("digest", content = digest)
            else:
                iq.query.addElement("password", content = self.passwd)

            iq.addCallback(callback)
            iq.send()
        else:
            # Check for 401 -- Invalid user
            if iq.error["code"] == "401":
                self.xmlstream.dispatch(iq, INVALID_USER_EVENT)
            else:
                self.xmlstream.dispatch(iq, AUTH_FAILED_EVENT)
Esempio n. 12
0
    def _processGet(self, view, iq, inResponseTo):

        self.client.output("processing request")

        to = iq['from']
        id = iq['id']
        responses = []

        try:
            for elem in iq.query.elements():
                method = getattr(self, '_get_' + elem.name, None)
                if method is not None:
                    responses.append(method(view, iq, elem.attributes))
                else:
                    raise NotImplementedError, elem.name

        except Exception, e:
            iq = client.IQ(self.client.xmlstream, "error")
            iq.addElement(("jabber:x:chandler", "query"))
            cls = e.__class__
            error = iq.query.addElement("error", None, traceback.format_exc())
            error['class'] = "%s.%s" % (cls.__module__, cls.__name__)
            error['args'] = ','.join(map(str, e.args))
            responses = [iq]
Esempio n. 13
0
 def _execute():
     iq = client.IQ(self.client.xmlstream, 'set')
     cmd = iq.addElement((xmlstream2.NS_PROTO_COMMANDS, 'command'))
     cmd['node'] = 'serverlist'
     cmd['action'] = 'execute'
     iq.send()
Esempio n. 14
0
 def registerRequest(self, delay=0):
     reg = client.IQ(self.client.xmlstream, 'get')
     reg.addElement((xmlstream2.NS_IQ_REGISTER, 'query'))
     reg.send(self.client.network)
Esempio n. 15
0
 def testCommand():
     cmd = client.IQ(xs, 'set')
     ch = cmd.addElement((xmlstream2.NS_PROTO_COMMANDS, 'command'))
     ch['node'] = 'serverlist'
     ch['action'] = 'execute'
     cmd.send(self.network)
Esempio n. 16
0
 def testRegisterRequest():
     reg = client.IQ(xs, 'get')
     reg.addElement((xmlstream2.NS_IQ_REGISTER, 'query'))
     reg.send(self.network)
Esempio n. 17
0
    def authenticated(self, xs):
        print "Authenticated."
        xs.addObserver('/*', self.stanza, xs=xs)
        xs.addObserver('/message', self.message, xs=xs)

        presence = xmppim.AvailablePresence(statuses={None: 'status message'}, priority=0)
        xs.send(presence)

        ver = client.IQ(xs, 'get')
        ver.addElement((xmlstream2.NS_IQ_VERSION, 'query'))
        ver.send(self.network)

        info = client.IQ(xs, 'get')
        info.addElement((xmlstream2.NS_DISCO_INFO, 'query'))
        info.send(self.network)

        items = client.IQ(xs, 'get')
        q = items.addElement((xmlstream2.NS_DISCO_ITEMS, 'query'))
        q['node'] = xmlstream2.NS_PROTO_COMMANDS
        items.send(self.network)

        items = client.IQ(xs, 'get')
        q = items.addElement((xmlstream2.NS_DISCO_ITEMS, 'query'))
        q['node'] = xmlstream2.NS_MESSAGE_UPLOAD
        items.send(self.network)

        def testProbe():
            if self.peer is not None:
                userid, resource = util.split_userid(self.peer)
                presence = xmppim.Presence(jid.JID(tuple=(userid, self.network, resource)), 'probe')
                presence['id'] = util.rand_str(8)
                xs.send(presence)

        def testMassProbe():
            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)

            for n in range(num):
                userid = util.rand_str(util.USERID_LENGTH, util.CHARSBOX_HEX_LOWERCASE)
                presence = xmppim.Presence(jid.JID(tuple=(userid, self.network, None)), 'probe')
                xs.send(presence)

        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 testSubscribe():
            # subscription request
            self.index = 0
            if self.peer is not None:
                userid, resource = util.split_userid(self.peer)
                presence = xmppim.Presence(jid.JID(tuple=(userid, self.network, None)), 'subscribe')
                presence['id'] = util.rand_str(8)
                xs.send(presence)
            else:
                def pres():
                    self.index += 1
                    presence = xmppim.AvailablePresence(statuses={None: 'status message (%d)' % (self.index, )})
                    xs.send(presence)

                LoopingCall(pres).start(2, False)

        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)
            #xs.sendFooter()

        def testMsgLoop():
            global counter
            counter = 0
            def _loop():
                global counter
                counter += 1
                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=('%d' % counter))
                message.addElement(('urn:xmpp:server-receipts', 'request'))
                xs.send(message)
            LoopingCall(_loop).start(1)

        def testRegisterRequest():
            reg = client.IQ(xs, 'get')
            reg.addElement((xmlstream2.NS_IQ_REGISTER, 'query'))
            reg.send(self.network)

        def testRegister():
            reg = client.IQ(xs, 'set')
            query = reg.addElement((xmlstream2.NS_IQ_REGISTER, 'query'))
            form = query.addElement(('jabber:x:data', 'x'))
            form['type'] = 'submit'

            hidden = form.addElement((None, 'field'))
            hidden['type'] = 'hidden'
            hidden['var'] = 'FORM_TYPE'
            hidden.addElement((None, 'value'), content=xmlstream2.NS_IQ_REGISTER)

            phone = form.addElement((None, 'field'))
            phone['type'] = 'text-single'
            phone['label'] = 'Phone number'
            phone['var'] = 'phone'
            phone.addElement((None, 'value'), content='+39123456')

            reg.send(self.network)

        def testValidate():
            reg = client.IQ(xs, 'set')
            query = reg.addElement((xmlstream2.NS_IQ_REGISTER, 'query'))
            form = query.addElement(('jabber:x:data', 'x'))
            form['type'] = 'submit'

            hidden = form.addElement((None, 'field'))
            hidden['type'] = 'hidden'
            hidden['var'] = 'FORM_TYPE'
            hidden.addElement((None, 'value'), content='http://kontalk.org/protocol/register#code')

            code = form.addElement((None, 'field'))
            code['type'] = 'text-single'
            code['label'] = 'Validation code'
            code['var'] = 'code'
            code.addElement((None, 'value'), content='686129')

            reg.send(self.network)

        def testCommand():
            cmd = client.IQ(xs, 'set')
            ch = cmd.addElement((xmlstream2.NS_PROTO_COMMANDS, 'command'))
            ch['node'] = 'serverlist'
            ch['action'] = 'execute'
            cmd.send(self.network)

        def testUpload():
            cmd = client.IQ(xs, 'set')
            ch = cmd.addElement((xmlstream2.NS_MESSAGE_UPLOAD, 'upload'))
            ch['node'] = 'kontalkbox'
            media = ch.addElement((None, 'media'))
            media['type'] = 'image/png'
            cmd.send(self.network)

        def testBad():
            receipt = domish.Element((None, 'message'))
            receipt['id'] = util.rand_str(8)
            receipt['type'] = 'chat'
            receipt['to'] = self.peer + '@' + self.network
            child = receipt.addElement(('urn:xmpp:server-receipts', 'received'))
            #child['id'] = util.rand_str(40)
            xs.send(receipt)
Esempio n. 18
0
    def _get_sync(self, view, iq, args):

        try:
            if 'toRepoId' in args and UUID(args['toRepoId']) != self._repoId:
                raise RepositoryMismatchError, args['toRepoId']

            view.refresh(None, None, False)

            repoId = UUID(args['fromRepoId'])
            name = args['name']
            version = int(args.get('version', '0'))
            uuid = args.get('uuid')
            if uuid is not None:
                uuid = UUID(uuid)

            collection, name, uuid = self.findCollection(view, name, uuid)
            share = self.findShare(view, collection, repoId, iq['from'])

            iq = client.IQ(self.client.xmlstream, "result")
            query = iq.addElement(("jabber:x:chandler", "query"))
            sync = query.addElement('sync')
            sync['name'] = name

            changes = self.computeChanges(view, version, collection, share)
            keys = set()
            compressed = len(changes) > 16

            if compressed:
                builder = TreeBuilder()
                dom = formats.ElementTreeDOM()
                data = dom.openElement(builder, 'data')
            else:
                dom = DomishDOM()
                data = dom.openElement(sync, 'data')

            for key, (_changes, status) in changes.iteritems():
                if key not in keys:
                    if status & CItem.DELETED:
                        dom.openElement(data,
                                        'item',
                                        uuid=key.str64(),
                                        status='deleted')
                    else:
                        attrs = {'uuid': key.str64()}
                        if key in collection:
                            attrs['status'] = 'member'
                        item = dom.openElement(data, 'item', **attrs)
                        share.format.exportProcess(dom, key, item, changes,
                                                   keys)
                    dom.closeElement(data, 'item')
                elif key in collection:
                    dom.openElement(data,
                                    'item',
                                    uuid=key.str64(),
                                    status='member')
                    dom.closeElement(data, 'item')

            dom.closeElement(data, 'data')

            sync['fromRepoId'] = self._repoId.str64()
            sync['toRepoId'] = repoId.str64()
            sync['version'] = str(view.itsVersion)
            sync['uuid'] = collection.itsUUID.str64()

            if compressed:
                sync['compressed'] = 'true'
                out = StringIO()
                ElementTree(builder.close()).write(out, 'utf-8')
                sync.children.append(b64encode(compress(out.getvalue())))
                out.close()

        except:
            view.cancel()
            raise

        share.localVersion = view.itsVersion + 1
        share.established = True
        share.ackPending = True
        view.commit()

        return iq
Esempio n. 19
0
    def _result_sync(self, view, iq, sync, args):

        try:
            view.refresh(None, None, False)

            if 'toRepoId' in args and UUID(args['toRepoId']) != self._repoId:
                raise RepositoryMismatchError, args['toRepoId']

            repoId = UUID(args['fromRepoId'])
            uuid = UUID(args['uuid'])
            version = int(args['version'])
            collection = view.find(uuid)

            if collection is None:
                collection = pim.SmartCollection(itsView=view,
                                                 _uuid=uuid,
                                                 displayName=args['name'])
                schema.ns("osaf.app", view).sidebarCollection.add(collection)

                # for now, grant READ to everyone
                acl = ACL()
                acl.append(
                    ACE(schema.ns('p2p', view).all.itsUUID, Permissions.READ))
                collection.setACL(acl, 'p2p')
                isNew = True
            else:
                isNew = False

            share = self.findShare(view, collection, repoId, iq['from'])
            format = share.format

            if isNew:
                share.localVersion = view.itsVersion + 1
            else:
                changes = self.computeChanges(view, share.localVersion,
                                              collection, share)
                if not changes:
                    share.localVersion = view.itsVersion + 1

            if sync.attributes.get('compressed') == 'true':
                dom = formats.ElementTreeDOM()
                input = StringIO(decompress(b64decode(sync.children[0])))
                data = ElementTree(file=input).getroot()
                input.close()
            else:
                dom = DomishDOM()
                data = sync.firstChildElement()

            share.remoteVersion = version
            view.deferDelete()

            for itemElement in dom.iterElements(data):
                attributes = dom.getAttributes(itemElement)
                status = attributes.get('status')
                if status == 'deleted':
                    item = view.findUUID(attributes['uuid'])
                    if item is not None:
                        item.delete()
                else:
                    child = dom.getFirstChildElement(itemElement)
                    if child is not None:
                        item = format.importProcess(dom, child)
                    else:
                        item = view.findUUID(attributes['uuid'])

                    if status == 'member':
                        collection.inclusions.add(item)

            # Kludge until masterEvents filter patch on bug 6970 is checked in
            for item in collection.inclusions:
                if pim.has_stamp(item, pim.EventStamp):
                    event = pim.EventStamp(item)
                    if event.rruleset is not None:
                        event.getMaster().getFirstOccurrence()

        except:
            view.cancel()
            raise

        share.established = True
        view.commit()
        self.client.output("'%s' synchronized" % (collection.displayName))

        to = iq['from']
        iq = client.IQ(self.client.xmlstream, 'result')
        iq.addElement(('jabber:x:chandler', 'query'))
        receipt = iq.query.addElement('receipt')
        receipt['fromRepoId'] = self._repoId.str64()
        receipt['toRepoId'] = repoId.str64()
        receipt['uuid'] = collection.itsUUID.str64()
        receipt['version'] = str(share.localVersion)
        reactor.callFromThread(iq.send, to)
Esempio n. 20
0
 def _execute():
     iq = client.IQ(self.client.xmlstream, 'get')
     iq.addElement((xmlstream2.NS_IQ_BLOCKING, 'blocklist'))
     iq.send()
Esempio n. 21
0
 def _execute():
     iq = client.IQ(self.client.xmlstream, 'set')
     block = iq.addElement((xmlstream2.NS_IQ_BLOCKING, 'block'))
     item = block.addElement((None, 'item'))
     item['jid'] = peer
     iq.send()
Esempio n. 22
0
 def vcardGet(self, peer):
     iq = client.IQ(self.client.xmlstream, 'get')
     iq.addElement((xmlstream2.NS_XMPP_VCARD4, 'vcard'))
     iq.send(peer)
Esempio n. 23
0
    def _featureParse(self, f):
        self.bind = 0
        self.session = 0
        # TODO - check for tls
        if self.success == 1:
            for f in f.elements():
                if f.name == "bind":
                    self.bind = 1
                if f.name == "session":
                    self.session = 1

            if self.bind:
                iq = client.IQ(self.xmlstream, "set")
                iq.addElement((BIND_XMLNS, "bind"))

                iq.bind.addElement("resource", content=self.jid)
                iq.addCallback(self._bindResultEvent)
                iq.send()
        else:
            if f.starttls:
                if SSL:
                    # look for required
                    #starttls = Element((TLS_XMLNS,"starttls"),TLS_XMLNS)
                    starttls = Element((None, "starttls"))
                    # why? --- should not be here!!!!!
                    starttls['xmlns'] = TLS_XMLNS
                    self.xmlstream.addOnetimeObserver("/proceed",
                                                      self._proceed)
                    self.xmlstream.addOnetimeObserver("/failue",
                                                      self._tlsError)
                    self.xmlstream.send(starttls)
                else:
                    self.xmlstream.dispatch(f, self.AUTH_FAILED_EVENT)
            else:
                # Look for SASL
                m = f.mechanisms

                if m.uri == SASL_XMLNS:
                    ms = 'DIGEST-MD5'
                    for mech in m.elements():
                        ms = str(mech)
                        if ms == 'DIGEST-MD5':
                            break
                        if ms == 'PLAIN':
                            break
                    #auth = Element((SASL_XMLNS,"auth"),SASL_XMLNS,{'mechanism' : ms})
                    auth = Element((None, "auth"), attribs={'mechanism': ms})
                    # why?
                    auth['xmlns'] = SASL_XMLNS
                    # auth['mechanism'] = ms
                    if ms == 'DIGEST-MD5':
                        self.xmlstream.addOnetimeObserver(
                            "/challenge", self._saslStep1)
                    if ms == 'PLAIN':
                        # TODO add authzid
                        auth_str = ""
                        auth_str = auth_str + "\000"
                        auth_str = auth_str + self.username.encode('utf-8')
                        auth_str = auth_str + "\000"
                        auth_str = auth_str + self.password.encode('utf-8')
                        auth.addContent(binascii.b2a_base64(auth_str))
                        self.xmlstream.addOnetimeObserver(
                            "/success", self._saslSuccess)

                    self.xmlstream.addObserver("/failure", self._saslError)
                    self.xmlstream.send(auth)
                else:
                    self.xmlstream.dispatch(f, self.AUTH_FAILED_EVENT)