Beispiel #1
0
    def on_description(self, iq):
#         print(
#             'Received description from %s: %s'
#             % (iq['from'], iq.toXml().encode('utf-8')))
        pause = IQ(self.xmlstream, 'set')
        pause['to'] = iq['from']
#         enveloppe = domish.Element(
#             ('http://schemas.xmlsoap.org/soap/envelope/', 'Envelope'))
        enveloppe = domish.Element(
            ('http://schemas.xmlsoap.org/soap/envelope/', 'Envelope'), localPrefixes={'s': 'http://schemas.xmlsoap.org/soap/envelope/'})
        enveloppe['s:encodingStyle'] = "http://schemas.xmlsoap.org/soap/encoding/"
        header = domish.Element((None, 's:Header'))
#         header = domish.Element(('http://schemas.xmlsoap.org/soap/envelope/', 'Header'))
        header['mustUnderstand'] = "1"
        uc = domish.Element(('urn:schemas-upnp-org:cloud-1-0', 'uc'))
        uc['serviceId'] = 'urn:av-openhome-org:serviceId:Playlist'
        header.addChild(uc)
        enveloppe.addChild(header)
        body = domish.Element((None, 's:Body'))
#         body = domish.Element(('http://schemas.xmlsoap.org/soap/envelope/', 'Body'))
        action = domish.Element(
            ('urn:av-openhome-org:service:Playlist:1', 'Read'), localPrefixes={'u': 'urn:av-openhome-org:service:Playlist:1'})
#         action = domish.Element(
#             ('urn:av-openhome-org:service:Playlist:1', 'Pause'))
        body.addChild(action)
        enveloppe.addChild(body)
        pause.addChild(enveloppe)
        pause.addCallback(self.paused)
        print('send pause')
        print(pause.toXml())
        pause.send()
Beispiel #2
0
    def dump_description(self, dest):
        def sent(res):
            self.log.debug('description sent')
            pass

        self.log.debug('send description')
        #         print(dest['id'])
        if self.description:
            self.log.debug('cached description')
            iq = IQ(self.xmlstream, 'result')
            iq.addRawXml(self.description)
            iq['id'] = dest['id']
        else:
            self.log.debug('generate description')
            iq = IQ(self.xmlstream, 'result')
            query = domish.Element(('urn:schemas-upnp-org:cloud-1-0', 'query'))
            query['type'] = 'described'
            query['name'] = self.device.uuid
            d = tostring(self.device.dump(), encoding='unicode')
            query.addRawXml(d)
            #         print(query.toXml())
            for service in self.device.services:
                s = tostring(service.dump(), encoding='unicode')
                #             print(s)
                query.addRawXml(s)

    #         print(query.toXml())
            self.description = query.toXml()
            iq.addChild(query)
            iq['id'] = dest['id']
#             self.description = iq
#         print(iq.toXml())
        iq.addCallback(sent)
        iq.send(to=dest['from'])
Beispiel #3
0
 def on_description(self, iq):
     #         print(
     #             'Received description from %s: %s'
     #             % (iq['from'], iq.toXml().encode('utf-8')))
     pause = IQ(self.xmlstream, 'set')
     pause['to'] = iq['from']
     #         enveloppe = domish.Element(
     #             ('http://schemas.xmlsoap.org/soap/envelope/', 'Envelope'))
     enveloppe = domish.Element(
         ('http://schemas.xmlsoap.org/soap/envelope/', 'Envelope'),
         localPrefixes={'s': 'http://schemas.xmlsoap.org/soap/envelope/'})
     enveloppe[
         's:encodingStyle'] = "http://schemas.xmlsoap.org/soap/encoding/"
     header = domish.Element((None, 's:Header'))
     #         header = domish.Element(('http://schemas.xmlsoap.org/soap/envelope/', 'Header'))
     header['mustUnderstand'] = "1"
     uc = domish.Element(('urn:schemas-upnp-org:cloud-1-0', 'uc'))
     uc['serviceId'] = 'urn:av-openhome-org:serviceId:Playlist'
     header.addChild(uc)
     enveloppe.addChild(header)
     body = domish.Element((None, 's:Body'))
     #         body = domish.Element(('http://schemas.xmlsoap.org/soap/envelope/', 'Body'))
     action = domish.Element(
         ('urn:av-openhome-org:service:Playlist:1', 'Read'),
         localPrefixes={'u': 'urn:av-openhome-org:service:Playlist:1'})
     #         action = domish.Element(
     #             ('urn:av-openhome-org:service:Playlist:1', 'Pause'))
     body.addChild(action)
     enveloppe.addChild(body)
     pause.addChild(enveloppe)
     pause.addCallback(self.paused)
     print('send pause')
     print(pause.toXml())
     pause.send()
Beispiel #4
0
 def on_presence(self, presence):
     print('received presence: %s' % presence.toXml().encode('utf-8'))
     user, host, res = parse(presence['from'])
     jid = '@'.join((user, host))
     if presence.hasAttribute('type'):
         if presence['type'] == 'subscribe':
             if jid in self.users:
                 print('received subscription')
                 if self.users[jid] is False:
                     iq = IQ(self.xmlstream, 'set')
                     query = domish.Element(('jabber:iq:roster', 'query'))
                     item = domish.Element((None, 'item'))
                     item['jid'] = jid
                     item['name'] = jid
                     item.addElement('group', content='controllers')
                     query.addChild(item)
                     iq.addChild(query)
                     iq.addCallback(self.subscribed, jid)
                     self.xmlstream.send(iq)
                     pres = domish.Element((None, 'presence'))
                     pres['type'] = 'subscribed'
                     pres['to'] = jid
                     self.xmlstream.send(pres)
                     
             else:
                 presence = domish.Element((None, 'presence'))
                 presence['type'] = 'unsubscribed'
                 presence['to'] = presence['from']
                 self.xmlstream.send(presence)
Beispiel #5
0
    def getStats(self, jid = "icq.netlab.cz"):
        iq = IQ(self.xmlstream, "get")
        iq['to'] = jid
        iq.addElement(("http://jabber.org/protocol/stats", "query"))

        iq.addCallback(self._statsReceived)
        iq.send()
Beispiel #6
0
    def on_presence(self, presence):
        print('received presence: %s' % presence.toXml().encode('utf-8'))
        user, host, res = parse(presence['from'])
        jid = '@'.join((user, host))
        if presence.hasAttribute('type'):
            if presence['type'] == 'subscribe':
                if jid in self.users:
                    print('received subscription')
                    if self.users[jid] is False:
                        iq = IQ(self.xmlstream, 'set')
                        query = domish.Element(('jabber:iq:roster', 'query'))
                        item = domish.Element((None, 'item'))
                        item['jid'] = jid
                        item['name'] = jid
                        item.addElement('group', content='controllers')
                        query.addChild(item)
                        iq.addChild(query)
                        iq.addCallback(self.subscribed, jid)
                        self.xmlstream.send(iq)
                        pres = domish.Element((None, 'presence'))
                        pres['type'] = 'subscribed'
                        pres['to'] = jid
                        self.xmlstream.send(pres)

                else:
                    presence = domish.Element((None, 'presence'))
                    presence['type'] = 'unsubscribed'
                    presence['to'] = presence['from']
                    self.xmlstream.send(presence)
Beispiel #7
0
	def getStats(self, jid = "icq.netlab.cz"):
		iq = IQ(self.xmlstream, "get")
		iq['to'] = jid
		iq.addElement(("http://jabber.org/protocol/stats", "query"))

		iq.addCallback(self._statsReceived)
		iq.send()
Beispiel #8
0
    def invalid_user(self, xs):
        iq = IQ(self.xmlstream, "set")
        iq.addElement(("jabber:iq:register", "query"))
        iq.query.addElement("username", content = self.jid.user)
        iq.query.addElement("password", content = self.password)

        iq.addCallback(self._registerResultEvent)

        iq.send()
Beispiel #9
0
    def authenticated(self, xs):

        presence = domish.Element((None, 'presence'))
        xs.send(presence)

        iq = IQ(self.xmlstream, "set")
        iq.addElement(("jabber:iq:register", "query"))
        iq.query.addElement("remove")

        iq.addCallback(self._result)

        iq.send()
Beispiel #10
0
 def moderate(self, jn, jid_nick, ra, set_to, reason=None):
  if not reason: reason = self.bot.nick
  packet = IQ(self.globalbot.wrapper.x, 'set')
  query = packet.addElement('query', 'http://jabber.org/protocol/muc#admin')
  i = query.addElement('item')
  i[jn] = jid_nick
  i[ra] = set_to
  i.addElement('reason').addContent(reason)
  d = Deferred()
  packet.addCallback(d.callback)
  #print packet.toXml()
  callFromThread(packet.send, self.jid)
  return d
Beispiel #11
0
	def _statsReceived(self, el):

		iq = IQ(self.xmlstream, "get")
		iq['to'] = el['from']
		q = iq.addElement(("http://jabber.org/protocol/stats", "query"))

		query = el.firstChildElement()
		for child in query.children:
			s = q.addElement('stat')
			s['name'] = child['name']

		iq.addCallback(self._statsDataReceived)
		iq.send()
Beispiel #12
0
    def _statsReceived(self, el):

        iq = IQ(self.xmlstream, "get")
        iq['to'] = el['from']
        q = iq.addElement(("http://jabber.org/protocol/stats", "query"))

        query = el.firstChildElement()
        for child in query.children:
            s = q.addElement('stat')
            s['name'] = child['name']

        iq.addCallback(self._statsDataReceived)
        iq.send()
Beispiel #13
0
    def registerAccount(self, username=None, password=None):
        if username:
            self.jid.user = username
        if password:
            self.password = password

        iq = IQ(self.xmlstream, "set")
        iq.addElement(("jabber:iq:register", "query"))
        iq.query.addElement("username", content=self.jid.user)
        iq.query.addElement("password", content=self.password)

        iq.addCallback(self._registerResultEvent)
        iq.send()
Beispiel #14
0
    def authenticated(self, xs):

        self.log.debug('Cloud Authenticated')
        presence = domish.Element((None, 'presence'))
        xs.send(presence)
        xs.addObserver('/presence', self.on_presence)
        xs.addObserver('/iq', self.on_iq)
        xs.addObserver('/message', self.on_event)
        disco = IQ(xs, 'get')
        disco.addElement(('http://jabber.org/protocol/disco#items', 'query'))
        disco.addCallback(self.cloud_discovered)
        disco.send()
#         self.reactor.callLater(120, xs.sendFooter)
        self.reactor.callLater(5, self.check_users)
Beispiel #15
0
    def authenticated(self, xs):
        self.xmlstream.addObserver("/presence[@type='subscribe']", self.onSubscribe, 1)
        self.xmlstream.addObserver("/presence[@type='subscribed']", self.onSubscribed, 1)

        presence = domish.Element((None, 'presence'))
        xs.send(presence)

        iq = IQ(self.xmlstream, "get")
        iq['to'] = transport
        iq.addElement(("jabber:iq:register", "query"))

        iq.addCallback(self._result)

        iq.send()
Beispiel #16
0
    def _result2(self, iq):
        if iq['type'] != 'result':
            self.failed()
        query = iq.firstChildElement()
        if query.name != "query":
            self.failed()

        iq = IQ(self.xmlstream, "get")
        iq['to'] = transport
        iq.addElement(("jabber:iq:register", "query"))

        iq.addCallback(self._result3)

        iq.send()
Beispiel #17
0
    def check_users(self):
        for user, value in self.users.items():
            if value['state'] is False:
                iq = IQ(self.xmlstream, 'set')
                query = domish.Element(('jabber:iq:roster', 'query'))
                item = domish.Element((None, 'item'))
                item['name'] = user
                item['jid'] = user
                item.addElement('group', content='hosts')
                query.addChild(item)
                iq.addChild(query)
                iq.addCallback(self.cloud_subscribe, user)
#                 print('send IQ: %s' % (iq.toXml().encode('utf-8')))
                iq.send()
Beispiel #18
0
 def check_users(self):
     for user, value in self.users.items():
         if value['state'] is False:
             iq = IQ(self.xmlstream, 'set')
             query = domish.Element(('jabber:iq:roster', 'query'))
             item = domish.Element((None, 'item'))
             item['name'] = user
             item['jid'] = user
             item.addElement('group', content='hosts')
             query.addChild(item)
             iq.addChild(query)
             iq.addCallback(self.subscribe, user)
             print('send IQ: %s' % (iq.toXml().encode('utf-8')))
             iq.send()
Beispiel #19
0
 def __call__(self, *args, **kwargs):
     d = defer.Deferred()
     self.ctx, = self.contexts
     self.get_out_object(self.ctx, args, kwargs)
     self.get_out_string(self.ctx)
     self.ctx.in_string = []
     action = IQ(self.url[0], 'set')
     for item in self.ctx.out_string:
         action.addRawXml(item)
     if action.callbacks:
         action.addCallback(self.on_response, d)
     else:
         print('wtf?')
     action.send(to=self.url[1])
     return d
Beispiel #20
0
 def moderate(self, jn, jid_nick, ra, set_to, reason=None):
  if not reason:
   try: reason = self.bot.nick
   except: reason = 'freQ'
  packet = IQ(self.globalbot.wrapper.x, 'set')
  query = packet.addElement('query', 'http://jabber.org/protocol/muc#admin')
  i = query.addElement('item')
  i[jn] = jid_nick
  i[ra] = set_to
  i.addElement('reason').addContent(reason)
  d = Deferred()
  packet.addCallback(d.callback)
  #print packet.toXml()
  callFromThread(packet.send, self.jid)
  return d
Beispiel #21
0
    def create_ps_node(self, node):
        def registered(node, iq):
            if iq['type'] == 'result':
                node_name = '/'.join((self._jid, node[1]))
                if node_name in self.registrations:
                    return
                event = XmppEvent(node_name, self, 'pubsub.' + self.jid.host)
                node[2].subscribe(event, 100)
                self.reactor.callLater(95, self.renew_subscription,
                                       *(node_name, node))
                self.registrations.append(node_name)
                self.log.debug('node {node} registered', node=node_name)
            else:
                self.log.error('node creation {name} failed:{iq}',
                               name=node,
                               iq=iq.toXml())

        iq = IQ(self.xmlstream, 'set')
        ps = domish.Element(('http://jabber.org/protocol/pubsub', 'pubsub'))
        create = domish.Element((None, 'create'))
        create['node'] = '/'.join((self._jid, node[1], node[0].name))
        ps.addChild(create)
        configure = domish.Element((None, 'configure'))
        x = domish.Element(('jabber:x:data', 'x'))
        x['type'] = 'submit'
        field = domish.Element((None, 'field'))
        field['var'] = 'FORM_TYPE'
        field['type'] = 'hidden'
        field.addElement(
            'value', content='http://jabber.org/protocol/pubsub#node_config')
        x.addChild(field)
        access = domish.Element((None, 'field'))
        access['var'] = 'pubsub#access_model'
        access.addElement('value', content='roster')
        x.addChild(access)
        #         expire = domish.Element((None, 'field'))
        #         expire['var'] = 'pubsub#item_expire'
        #         expire.addElement('value', content='60')
        #         x.addChild(expire)
        last = domish.Element((None, 'field'))
        last['var'] = 'pubsub#send_last_published_item'
        last.addElement('value', content='on_sub_and_presence')
        x.addChild(last)
        configure.addChild(x)
        ps.addChild(configure)
        iq.addChild(ps)
        iq.addCallback(registered, node)
        iq.send(to='pubsub.' + self.jid.host)
Beispiel #22
0
 def on_presence(self, presence):
     self.log.debug('received presence: %s' %
                    presence.toXml().encode('utf-8'))
     if presence.hasAttribute('from'):
         user, host, res = parse(presence['from'])
         if presence['from'] in self.active_controllers:
             if presence.hasAttribute('type'):
                 if presence['type'] == 'unavailable':
                     self.active_controllers.remove(presence['from'])
                     self.log.info('User {_from} disconnected',
                                   _from=presence['from'])
                     return
         elif 'ControlPoint' in res:
             if presence.hasAttribute('type'):
                 if presence['type'] == 'unavailable':
                     return
             self.log.info('control point %s added' % presence['from'])
             if len(self.active_controllers) == 0:
                 self.check_ps_nodes()
             self.active_controllers.append(presence['from'])
         del (res)
         jid = '@'.join((user, host))
         if presence.hasAttribute('type'):
             if presence['type'] == 'subscribe':
                 if jid in self.users:
                     self.log.info('received subscription from %s' % jid)
                     if self.users[jid] is False:
                         iq = IQ(self.xmlstream, 'set')
                         query = domish.Element(
                             ('jabber:iq:roster', 'query'))
                         item = domish.Element((None, 'item'))
                         item['jid'] = jid
                         item['name'] = jid
                         item.addElement('group', content='UPnPCloud')
                         query.addChild(item)
                         iq.addChild(query)
                         iq.addCallback(self.subscribed, jid)
                         iq.send()
                 else:
                     self.log.error('subscription for user %s failed: %s' %
                                    (jid, 'Not in user list'))
                     pres = domish.Element((None, 'presence'))
                     pres['type'] = 'unsubscribed'
                     pres['to'] = presence['from']
                     self.xmlstream.send(pres)
Beispiel #23
0
    def _result(self, iq):
        #<iq from='icq.localhost' to='t3@localhost/test' id='H_24' type='result'><query xmlns='jabber:iq:register'><instructions>Enter your Jabber ID and password:</instructions><username/><password/><x xmlns='jabber:x:data' type='form'><title>Registration</title><instructions>Enter your Jabber ID and password:</instructions><field type='hidden' var='FORM_TYPE'><value>jabber:iq:register</value></field><field type='text-single' var='username' label='Network username'><required/></field><field type='text-private' var='password' label='Password'><required/></field><field type='list-single' var='language' label='Language'><value>en</value><option label='Cesky'><value>cs</value></option><option label='English'><value>en</value></option></field></x></query></iq>
        # TODO: more tests
        if iq['type'] != 'result':
            self.failed()
        query = iq.firstChildElement()
        if query.name != "query":
            self.failed()
        
        iq = IQ(self.xmlstream, "set")
        iq['to'] = transport
        iq.addElement(("jabber:iq:register", "query"))
        iq.query.addElement("username", content = client_jid1.userhost())
        iq.query.addElement("password", content = secret1)

        iq.addCallback(self._result2)

        iq.send()
Beispiel #24
0
    def on_presence(self, resp):
        print('got presence: %s' % resp.toXml().encode('utf-8'))
        print('from :%s' % resp['from'])
        user, host, res = parse(resp['from'])
        jid = '@'.join((user, host))
        if resp.hasAttribute('type'):
            if resp['type'] == 'subscribed':
                if jid in self.users:
                    self.users[jid].update({'state': True})
                    if 'services' in self.users[jid]:
                        self.users[jid]['services'].append(res)
                    else:
                        self.users[jid].update({'services': [res]})
                    presence = domish.Element((None, 'presence'))
                    presence['type'] = 'subscribe'
                    presence['to'] = resp['from']
                    self.xmlstream.send(presence)
                else:
                    presence = domish.Element((None, 'presence'))
                    presence['type'] = 'denying'
                    presence['to'] = resp['from']
                    self.xmlstream.send(presence)
            elif resp['type'] == 'unsubscribed':
                if jid in self.users:
                    print('subscription failed: %s' % resp['from'])
                return
        for child in resp.elements():
            if child.name == 'ConfigIdCloud':
                print('Found UPnP Cloud device : %s type is: %s' % (
                    jid,
                    res))
#                 if jid == self._jid:
#                     return
                info = IQ(self.xmlstream, 'get')
                info['to'] = resp ['from']
                query = domish.Element(
                    ('urn:schemas-upnp-org:cloud-1-0', 'query'))
                query['type'] = 'description'
                query['name'] = ':'.join(res.split(':')[-2:])
                info.addChild(query)
                info.addCallback(self.on_description)
                info.send()
Beispiel #25
0
    def on_presence(self, resp):
        self.log.debug('got presence: %s' % resp.toXml().encode('utf-8'))
#         print('from :%s' % resp['from'])
        user, host, res = parse(resp['from'])
        jid = '@'.join((user, host))
        if resp.hasAttribute('type'):
            if resp['type'] == 'subscribed':
                if jid in self.users:
                    self.users[jid].update({'state': True})
                    if 'services' in self.users[jid]:
                        self.users[jid]['services'].append(res)
                    else:
                        self.users[jid].update({'services': [res]})
                    presence = domish.Element((None, 'presence'))
                    presence['type'] = 'subscribe'
                    presence['to'] = resp['from']
                    self.xmlstream.send(presence)
                else:
                    presence = domish.Element((None, 'presence'))
                    presence['type'] = 'denying'
                    presence['to'] = resp['from']
                    self.xmlstream.send(presence)
            elif resp['type'] == 'unsubscribed':
                if jid in self.users:
                    self.log.warn('subscription failed: %s' % resp['from'])
                return
        for child in resp.elements():
            if child.name == 'ConfigIdCloud':
                self.log.debug('Found UPnP Cloud device : %s type is: %s' % (
                    jid,
                    res))
                info = IQ(self.xmlstream, 'get')
#                 info['to'] = resp['from']
                query = domish.Element(
                    ('urn:schemas-upnp-org:cloud-1-0', 'query'))
                query['type'] = 'description'
                query['name'] = ':'.join(res.split(':')[-2:])
                info.addChild(query)
                info.addCallback(self.on_description, res)
#                 info.send()
                info.send(to=resp['from'])
Beispiel #26
0
    def authenticated(self, xs):
        #  print "Authenticated."

        xs.addObserver('/presence', self.on_presence)
        xs.addObserver('/iq', self.on_iq)

        presence = domish.Element((None, 'presence'))
        uc = domish.Element(
            ('urn:schemas-upnp-org:cloud-1-0', 'ConfigIdCloud'))
        uc['hash'] = 'uda'
        uc.addContent('1.0')
        #  print(uc.toXml())
        presence.addChild(uc)
        #  print(presence.toXml())
        xs.send(presence)
        disco = IQ(xs, 'get')
        disco.addElement(('http://jabber.org/protocol/disco#info', 'query'))
        disco.addCallback(self.check_server)
        disco.send(to='pubsub.xmpp.bertrandverdu.me')
        self.check_ps_nodes()
        self.reactor.callLater(30, self.ping)
Beispiel #27
0
 def authenticated(self, xs):
     print "Authenticated."
     #         bind = IQ(xs, 'set')
     # #         res = domish.Element((None, 'resource'), content=self.resource)
     #         res = domish.Element(('urn:ietf:params:xml:ns:xmpp-bind', 'bind'))
     #         res.addElement('resource', content=self.resource)
     #         bind.addChild(res)
     # #         bind['from'] = self._jid
     # #         bind['to'] = self.jid.host
     #         xs.send(bind)
     presence = domish.Element((None, 'presence'))
     xs.send(presence)
     xs.addObserver('/presence', self.on_presence)
     xs.addObserver('/iq', self.on_iq)
     disco = IQ(xs, 'get')
     #         disco['to'] = '[email protected]/urn:schemas-upnp-org:device:MediaRenderer:1:uuid:e70e9d0e-d9eb-4748-b163-636a323e7950'
     #         search = domish.Element(('http://jabber.org/protocol/disco#items', 'query'))
     disco.addElement(('http://jabber.org/protocol/disco#items', 'query'))
     disco.addCallback(self.discovered)
     disco.send()
     self.reactor.callLater(120, xs.sendFooter)
     self.reactor.callLater(5, self.check_users)
Beispiel #28
0
    def ping(self):
        def pong(res):
            if res['type'] == 'result':
                #                 log.debug('pong !')
                self.timeout = False
                self.reactor.callLater(30, self.ping)
            else:
                self.log.error('ping error: %s' % res.toXml())
                self.timeout = False
#                 self.startService()

        def check_timeout():
            if self.timeout:
                self.log.error('ping timeout !')
#                 self.connector.connect()

        iq = IQ(self.xmlstream, 'get')
        iq.addElement('ping', 'urn:xmpp:ping')
        self.reactor.callLater(10, check_timeout)
        iq.addCallback(pong)
        self.timeout = True
        iq.send(to=self.jid.host)
Beispiel #29
0
class TwistedQuery(Query):
    """Implementation of Query for TwistedModel"""
    
    def __init__(self, model, method, fetch, single_result, params):
        Query.__init__(self, params, single_result)
        
        self.__model = model
        self.__iq = IQ(model._xmlstream, "get")
        self.__single_result = single_result
        
        element = self.__iq.addElement(method)
    
        for name in self._params:
            param = element.addElement(("http://mugshot.org/p/system", "param"))
            param["name"] = name
            param.addContent(self._params[name])
        
        if fetch != None:
            element[("http://mugshot.org/p/system", "fetch")] = fetch

        self.__iq.addCallback(self.__on_reply)

    def __is_indirect(self, resource_element):
        indirect_attr = resource_element.getAttribute(("http://mugshot.org/p/system", "indirect"))
        return  indirect_attr != None and indirect_attr.lower() == "true"
    
    def __on_reply(self, iq):
        child = iq.firstChildElement()

        result = []
        for resource_element in child.elements():
            resource = self.__model._update_resource_from_element(resource_element)
            if resource != None and not self.__is_indirect(resource_element):
                result.append(resource)
                
        self._on_success(result)

    def execute(self):
        self.__iq.send()
Beispiel #30
0
    def unsubscribe_cloud(self, name):

        def unsubscribed(name, d, res):
            if res['type'] == 'result':
                #                 print('unsubscribed: %s' % name)
                del self.subscriptions_cloud[name]
                print('ok')
                d.callback(None)
            else:
                d.errback(Exception(res.toXml()))

        d = defer.Deferred()
        iq = IQ(self.xmlstream, 'set')
        ps = domish.Element(('http://jabber.org/protocol/pubsub', 'pubsub'))
        unsubscribe = domish.Element((None, 'unsubscribe'))
        unsubscribe['node'] = name
        unsubscribe['jid'] = self.jid.full()
        ps.addChild(unsubscribe)
        iq.addChild(ps)
        iq.addCallback(unsubscribed, name, d)
        iq.send(to='pubsub.' + self.jid.host)
        return d
Beispiel #31
0
    def authenticated(self, xs):
        print "Authenticated."
#         bind = IQ(xs, 'set')
# #         res = domish.Element((None, 'resource'), content=self.resource)
#         res = domish.Element(('urn:ietf:params:xml:ns:xmpp-bind', 'bind'))
#         res.addElement('resource', content=self.resource)
#         bind.addChild(res)
# #         bind['from'] = self._jid
# #         bind['to'] = self.jid.host
#         xs.send(bind)
        presence = domish.Element((None, 'presence'))
        xs.send(presence)
        xs.addObserver('/presence', self.on_presence)
        xs.addObserver('/iq', self.on_iq)
        disco = IQ(xs, 'get')
#         disco['to'] = '[email protected]/urn:schemas-upnp-org:device:MediaRenderer:1:uuid:e70e9d0e-d9eb-4748-b163-636a323e7950'
#         search = domish.Element(('http://jabber.org/protocol/disco#items', 'query'))
        disco.addElement(('http://jabber.org/protocol/disco#items', 'query'))
        disco.addCallback(self.discovered)
        disco.send()
        self.reactor.callLater(120, xs.sendFooter)
        self.reactor.callLater(5, self.check_users)
Beispiel #32
0
    def authenticated(self, xs):
        print "Authenticated."

        xs.addObserver('/presence', self.on_presence)
        xs.addObserver('/iq', self.on_iq)

        presence = domish.Element((None, 'presence'))
        uc = domish.Element(
            ('urn:schemas-upnp-org:cloud-1-0', 'ConfigIdCloud'))
        uc['hash'] = 'uda'
        uc.addContent('1.0')
        #  print(uc.toXml())
        presence.addChild(uc)
        #  print(presence.toXml())
        xs.send(presence)
        disco = IQ(xs, 'get')
#         disco['to'] = 'pubsub.xmpp.bertrandverdu.me'
#         search = domish.Element(('http://jabber.org/protocol/disco#items', 'query'))
        disco.addElement(('http://jabber.org/protocol/disco#info', 'query'))
        disco.addCallback(self.check_server)
        disco.send(to='pubsub.xmpp.bertrandverdu.me')

        self.reactor.callLater(120, xs.sendFooter)
Beispiel #33
0
    def publish(self, event):

        if len(self.parent.active_controllers) == 0:
            #             self.log.debug('event cancelled')
            self.parent.registrations = []
            return

        def success(res):
            #             print('event sent')
            if res['type'] == 'error':
                self.log.error('Publish Event failed :%s' % res.toXml())
            else:
                if 'Id' in res.children[0].children[0]['node']:
                    self.log.debug('Event Published: %s' % res.toXml())

        name, data = event
        if name == 'Seconds':
            return
        iq = IQ(self.parent.xmlstream, 'set')
        ps = domish.Element(('http://jabber.org/protocol/pubsub', 'pubsub'))
        publish = domish.Element((None, 'publish'))
        publish['node'] = '/'.join((self.nodeId, name))
        item = domish.Element((None, 'item'))
        propertyset = domish.Element(
            ('urn:schemas-upnp-org:event-1-0', 'propertyset'),
            localPrefixes={'e': 'urn:schemas-upnp-org:event-1-0'})
        prop = domish.Element((None, 'e:property'))
        evt = domish.Element((None, name))
        if isinstance(data.value, dict):
            ev = domish.Element((data.namespace, 'Event'))
            inst = domish.Element((None, 'InstanceID'))
            inst['val'] = '0'
            for k, v in data.value.items:
                if 'namespace' in v:
                    var = domish.Element((v['namespace'], k))
                else:
                    var = domish.Element((None, k))
                if 'attrib' in v:
                    attr = v['attrib']
                else:
                    attr = {}
                value = v['value']
                if isinstance(value, bool):
                    value = int(value)
                attr.update({'val': str(value).decode('utf-8')})
                for attname, attval in attr:
                    var[attname] = attval
                inst.addChild(var)
            ev.addChild(inst)
            evt.addChild(ev)
        else:
            #             print(str(data.value).decode('utf-8'))
            if isinstance(data.value, bool):
                data.value = int(data.value)
            evt.addContent(str(data.value).decode('utf-8'))
        prop.addChild(evt)
        propertyset.addChild(prop)
        item.addChild(propertyset)
        publish.addChild(item)
        ps.addChild(publish)
        iq.addChild(ps)
        iq.addCallback(success)
        iq.send(to=self.addr)
Beispiel #34
0
    def subscribe_cloud(
            self, device, svc, var, callback_fct=None, callback_args=()):
        #         print('suscribe to %s' % var)
        name = device.keys()[0]
        dev = device[name]
        if not callback_fct:
            callback_fct = self.log.debug
        d = defer.Deferred()

        def subscribe_failed(err, name):
            self.parent.remove_device(name.split('_')[0])

        def subscribed(node_name, deferred, iq):
            if iq['type'] == 'result':
                self.subscriptions_cloud[str(node_name)] = True
#                 print('%s suscribed !' % str(node_name))
#                 iq = IQ(self.xmlstream, 'get')
#                 ps = domish.Element(
#                     ('http://jabber.org/protocol/pubsub', 'pubsub'))
#                 items = domish.Element((None, 'items'))
#                 items['node'] = node_name
#                 items['max_items'] = '1'
#                 ps.addChild(items)
#                 iq.addChild(ps)
#                 iq.addCallback(self.on_event)
#                 iq.send(to='pubsub.' + self.jid.host)
#                 print(iq.toXml())
                deferred.callback(str(node_name))
            else:
                deferred.errback(Exception('subscription to %s failed: %s'
                                           % (node_name, iq.toXml())))

        if svc in dev['services']:
            #             print('service %s ok' % svc)
            #             print('subscriptions :%s' % self.subscriptions_cloud)
            if not self.cloud_event_catcher:
                self.cloud_event_catcher = CloudEventCatcher(
                    {}, {}, logger=self.log)
            subscription_name = '/'.join((dev['location'], svc, var))
            #  subscription_service = svc
            if subscription_name in self.cloud_event_catcher.callbacks:
                self.cloud_event_catcher.callbacks[subscription_name].update(
                    {var: (callback_fct, callback_args,)})
            else:
                self.cloud_event_catcher.callbacks.update(
                    {subscription_name: {var: (callback_fct, callback_args,)}})
#             if var in self.cloud_event_catcher.callbacks:
#                 self.cloud_event_catcher.callbacks[var].update(
#                     {var: (callback_fct, callback_args,)})
#             else:
#                 self.cloud_event_catcher.callbacks.update(
#                     {var: {var: (callback_fct, callback_args,)}})
    #         log.error(self.event_catcher.catcher.childs)
            if subscription_name in self.subscriptions_cloud:
                if self.subscriptions_cloud[subscription_name]:
                    #                     print('already subscribed: %s' % subscription_name)
                    for k, value in\
                            self.cloud_event_catcher.unfiltered_dict.items():
                        #                         print('is %s == %s ?' % (k, var))
                        if k == var:
                            if value == 'False':
                                value = False
                            elif value == 'True':
                                value = True
                            if isinstance(callback_args, str)\
                                    or isinstance(callback_args, bool):
                                callback_fct(value, callback_args)
                            else:
                                callback_fct(value, *callback_args)
                            del self.cloud_event_catcher.unfiltered_dict[k]
                    return defer.succeed(None)
            self.subscriptions_cloud.update({str(subscription_name): False})
#             print(subscription_name)
#             print(subscription_service)
            iq = IQ(self.xmlstream, 'set')
            ps = domish.Element(
                ('http://jabber.org/protocol/pubsub', 'pubsub'))
            subscribe = domish.Element((None, 'subscribe'))
            subscribe['node'] = subscription_name
            subscribe['jid'] = self.jid.full()
            ps.addChild(subscribe)
            iq.addChild(ps)
            iq.addCallback(subscribed, subscription_name, d)
            iq.send(to='pubsub.' + self.jid.host)
            return d
        return defer.fail(Exception('Service unknow'))
Beispiel #35
0
    def publish(self, event):

        if len(self.parent.active_controllers) == 0:
            #             self.log.debug('event cancelled')
            self.parent.registrations = []
            return

        def success(res):
            #             print('event sent')
            if res['type'] == 'error':
                self.log.error('Publish Event failed :%s' % res.toXml())
            else:
                if 'Id' in res.children[0].children[0]['node']:
                    self.log.debug('Event Published: %s' % res.toXml())
        name, data = event
        if name == 'Seconds':
            return
        iq = IQ(self.parent.xmlstream, 'set')
        ps = domish.Element(('http://jabber.org/protocol/pubsub', 'pubsub'))
        publish = domish.Element((None, 'publish'))
        publish['node'] = '/'.join((self.nodeId, name))
        item = domish.Element((None, 'item'))
        propertyset = domish.Element(
            ('urn:schemas-upnp-org:event-1-0', 'propertyset'),
            localPrefixes={'e': 'urn:schemas-upnp-org:event-1-0'})
        prop = domish.Element((None, 'e:property'))
        evt = domish.Element((None, name))
        if isinstance(data.value, dict):
            ev = domish.Element((data.namespace, 'Event'))
            inst = domish.Element((None, 'InstanceID'))
            inst['val'] = '0'
            for k, v in data.value.items:
                if 'namespace' in v:
                    var = domish.Element((v['namespace'], k))
                else:
                    var = domish.Element((None, k))
                if 'attrib' in v:
                    attr = v['attrib']
                else:
                    attr = {}
                value = v['value']
                if isinstance(value, bool):
                    value = int(value)
                attr.update(
                    {'val': str(value)
                     .decode('utf-8')})
                for attname, attval in attr:
                    var[attname] = attval
                inst.addChild(var)
            ev.addChild(inst)
            evt.addChild(ev)
        else:
            #             print(str(data.value).decode('utf-8'))
            if isinstance(data.value, bool):
                data.value = int(data.value)
            evt.addContent(str(data.value).decode('utf-8'))
        prop.addChild(evt)
        propertyset.addChild(prop)
        item.addChild(propertyset)
        publish.addChild(item)
        ps.addChild(publish)
        iq.addChild(ps)
        iq.addCallback(success)
        iq.send(to=self.addr)