Example #1
0
    def update_txt(self, show=None):
        if show:
            self.txt['status'] = self._replace_show(show)

        txt = TXTRecord(self.txt, strict=True)
        try:
            DNSServiceUpdateRecord(self._service_sdref, None, 0, txt)
        except BonjourError as error:
            log.error('Error when updating TXT Record: %s', error)
            return False
        return True
Example #2
0
 def resolve_cb(sdRef, flags, interfaceIndex, errorCode,
                fullname, hosttarget, port, txtRecord):
     self.assertEqual(errorCode, pybonjour.kDNSServiceErr_NoError)
     self.assertEqual(sdRef, resolve_sdRef)
     self.assert_(isinstance(fullname, unicode))
     self.assertEqual(fullname, self.fullname)
     self.assert_(isinstance(hosttarget, unicode))
     self.assertEqual(port, self.port)
     self.assert_(isinstance(txtRecord, bytes))
     txt = TXTRecord.parse(txtRecord)
     self.assertEqual(txt['foo'], u'foobar')
     self.assert_(len(txtRecord) > 0)
     resolve_done.set()
 def resolve_cb(sdRef, flags, interfaceIndex, errorCode, fullname,
                hosttarget, port, txtRecord):
     self.assertEqual(errorCode, kDNSServiceErr_NoError)
     self.assertEqual(sdRef, resolve_sdRef)
     self.assertTrue(isinstance(fullname, str))
     self.assertEqual(fullname, self.fullname)
     self.assertTrue(isinstance(hosttarget, str))
     self.assertEqual(port, self.port)
     self.assertTrue(isinstance(txtRecord, str))
     txt = TXTRecord.parse(txtRecord)
     self.assertEqual(txt['foo'], 'foobar')
     self.assertTrue(len(txtRecord) > 0)
     resolve_done.set()
    def test_txtrecord(self):
        txt = TXTRecord()
        self.assertEqual(len(txt), 0)
        self.assertTrue(not txt)
        self.assertEqual(str(txt), '\0')

        txt = TXTRecord({
            'foo': 'bar',
            'baz': u'buzz',
            'none': None,
            'empty': ''
        })
        self.assertEqual(txt['foo'], 'bar')
        self.assertEqual(txt['BaZ'], 'buzz')
        self.assertTrue(txt['none'] is None)
        self.assertEqual(txt['empty'], '')

        self.assertEqual(len(txt), 4)
        self.assertTrue(txt)
        self.assertEqual(str(txt), str(TXTRecord.parse(str(txt))))

        txt['baZ'] = 'fuzz'
        self.assertEqual(txt['baz'], 'fuzz')
        self.assertEqual(len(txt), 4)

        self.assertTrue('foo' in txt)
        del txt['foo']
        self.assertTrue('foo' not in txt)

        self.assertRaises(KeyError, txt.__getitem__, 'not_a_key')
        self.assertRaises(KeyError, txt.__delitem__, 'not_a_key')
        self.assertRaises(ValueError, txt.__setitem__, 'foo\0', 'bar')
        self.assertRaises(ValueError, txt.__setitem__, '', 'bar')
        self.assertRaises(ValueError, txt.__setitem__, 'foo', 252 * 'b')

        # Example from
        # http://files.dns-sd.org/draft-cheshire-dnsext-dns-sd.txt
        data = '\x0Aname=value\x08paper=A4\x0EDNS-SD Is Cool'
        txt = TXTRecord.parse(data)
        self.assertEqual(str(txt), data)
        self.assertTrue(txt['DNS-SD Is Cool'] is None)

        data = '\x04bar=\nfoo=foobar\nfoo=barfoo\n=foofoobar'
        txt = TXTRecord.parse(data)
        self.assertEqual(len(txt), 2)
        self.assertEqual(txt['bar'], '')
        self.assertEqual(str(txt), '\x04bar=\nfoo=foobar')

        value = 254 * 'y'
        self.assertRaises(ValueError, TXTRecord().__setitem__, 'x', value)
        txt = TXTRecord(strict=False)
        txt['x'] = value
        self.assertEqual(len(str(txt)), 256)
Example #5
0
    def _create_service(self):
        txt = {}

        # remove empty keys
        for key, val in self.txt.items():
            if val:
                txt[key] = val

        txt['port.p2pj'] = self.port
        txt['version'] = 1
        txt['txtvers'] = 1

        # replace gajim's show messages with compatible ones
        if 'status' in self.txt:
            txt['status'] = self._replace_show(self.txt['status'])
        else:
            txt['status'] = 'avail'
        self.txt = txt
        try:
            self._service_sdref = DNSServiceRegister(
                flags=kDNSServiceFlagsNoAutoRename,
                name=self.name,
                regtype=self.stype,
                port=self.port,
                txtRecord=TXTRecord(self.txt, strict=True),
                callBack=self.service_added_callback)

            log.info('Publishing service %s of type %s', self.name, self.stype)

            ready = select.select([self._service_sdref], [], [])
            if self._service_sdref in ready[0]:
                DNSServiceProcessResult(self._service_sdref)

        except BonjourError as error:
            if error.errorCode == kDNSServiceErr_ServiceNotRunning:
                log.info('Service not running')
            else:
                self._error_cb(_('Error while adding service. %s') % error)
            self.disconnect()
Example #6
0
    def _getaddrinfo_callback(self, _sdref, _flags, interface, error_code,
                              hosttarget, address, _ttl):
        if error_code != kDNSServiceErr_NoError:
            log.error('Error in getaddrinfo_callback: %s', str(error_code))
            return

        fullname, port, txt_record = self._resolved_hosts[hosttarget]

        txt = TXTRecord.parse(txt_record)
        ip = address[1]

        name, bare_name, protocol, domain = self._parse_name(fullname)

        log.info('Service data for service %s on %i:', fullname, interface)
        log.info('Host %s, ip %s, port %i, TXT data: %s', hosttarget, ip, port,
                 txt)

        if not self.connected:
            return

        # we don't want to see ourselves in the list
        if name != self.name:
            resolved_info = [(interface, protocol, hosttarget, fullname, ip,
                              port)]
            self._contacts[name] = (name, domain, resolved_info, bare_name,
                                    txt_record)

            self._new_service_cb(name)
        else:
            # remember data
            # In case this is not our own record but of another
            # gajim instance on the same machine,
            # it will be used when we get a new name.
            self._invalid_self_contact[name] = \
                (name, domain,
                 (interface, protocol, hosttarget, fullname, ip, port),
                 bare_name, txt_record)

        self._queried.append(True)
    def register_record(self):
        done = threading.Event()

        def cb(_sdRef, flags, errorCode, name, regtype, domain):
            self.assertEqual(errorCode, kDNSServiceErr_NoError)
            self.assertEqual(_sdRef, sdRef)
            self.assertTrue(isinstance(name, str))
            self.assertEqual(name, self.service_name)
            self.assertTrue(isinstance(regtype, str))
            self.assertEqual(regtype, self.regtype)
            self.assertTrue(isinstance(domain, str))
            done.set()

        txt = TXTRecord()
        txt['foo'] = 'foobar'

        sdRef = DNSServiceRegister(name=self.service_name,
                                   regtype=self.regtype,
                                   port=self.port,
                                   txtRecord=txt,
                                   callBack=cb)

        return done, sdRef
Example #8
0
 def txt_array_to_dict(txt):
     if not isinstance(txt, TXTRecord):
         txt = TXTRecord.parse(txt)
     return dict((v[0], v[1]) for v in txt)
Example #9
0
    def test_txtrecord(self):
        txt = TXTRecord()
        self.assertEqual(len(txt), 0)
        self.assert_(not txt)
        self.assertEqual(bytes(txt), b'\x00')

        txt = TXTRecord({u'foo': u'bar',
                         u'baz': u'buzz',
                         u'none': None,
                         u'empty': u''})
        self.assertEqual(txt[u'foo'], u'bar')
        self.assertEqual(txt[u'BaZ'], u'buzz')
        self.assert_(txt[u'none'] is None)
        self.assertEqual(txt[u'empty'], u'')

        self.assertEqual(len(txt), 4)
        self.assert_(txt)
        self.assertEqual(bytes(txt), bytes(TXTRecord.parse(bytes(txt))))

        txt[u'baZ'] = u'fuzz'
        self.assertEqual(txt[u'baz'], u'fuzz')
        self.assertEqual(len(txt), 4)

        self.assert_(u'foo' in txt)
        del txt[u'foo']
        self.assert_(u'foo' not in txt)

        self.assertRaises(KeyError, txt.__getitem__, u'not_a_key')
        self.assertRaises(KeyError, txt.__delitem__, u'not_a_key')
        self.assertRaises(KeyError, txt.__getitem__, b'not_a_key')  # bytes
        self.assertRaises(KeyError, txt.__delitem__, b'not_a_key')  # bytes
        self.assertRaises(ValueError, txt.__setitem__, u'foo\x00', u'bar')
        self.assertRaises(ValueError, txt.__setitem__, b'foo\x00', u'bar')  # bytes
        self.assertRaises(ValueError, txt.__setitem__, u'', u'bar')
        self.assertRaises(ValueError, txt.__setitem__, u'foo', 252 * u'b')

        # Example from
        # http://files.dns-sd.org/draft-cheshire-dnsext-dns-sd.txt
        data = b'\x0Aname=value\x08paper=A4\x0EDNS-SD Is Cool'
        txt = TXTRecord.parse(data)
        self.assertEqual(bytes(txt), data)
        self.assert_(txt[u'DNS-SD Is Cool'] is None)

        data = b'\x04bar=\nfoo=foobar\nfoo=barfoo\n=foofoobar'
        txt = TXTRecord.parse(data)
        self.assertEqual(len(txt), 2)
        self.assertEqual(txt[u'bar'], u'')
        self.assertEqual(bytes(txt), b'\x04bar=\nfoo=foobar')

        value = 254 * u'y'
        self.assertRaises(ValueError, TXTRecord().__setitem__, u'x', value)
        txt = TXTRecord(strict=False)
        txt[u'x'] = value
        self.assertEqual(len(bytes(txt)), 256)

        ## Testing utf-8 strings in TXTRecord ...
        txt = TXTRecord(strict=False)
        txt[u'genshiken'] = u'げんしけん'

        self.assertEqual(bytes(txt), (
            b'\x19genshiken='
            b'\xe3\x81\x92\xe3\x82\x93\xe3\x81\x97\xe3\x81\x91\xe3\x82\x93'))

        txt[u'genshiken'] = u'げんしけん' * 17
        self.assertEqual(bytes(txt), (
            b'\xfdgenshiken='
            b'\xe3\x81\x92\xe3\x82\x93\xe3\x81\x97\xe3\x81\x91\xe3\x82\x93'
            b'\xe3\x81\x92\xe3\x82\x93\xe3\x81\x97\xe3\x81\x91\xe3\x82\x93'
            b'\xe3\x81\x92\xe3\x82\x93\xe3\x81\x97\xe3\x81\x91\xe3\x82\x93'
            b'\xe3\x81\x92\xe3\x82\x93\xe3\x81\x97\xe3\x81\x91\xe3\x82\x93'
            b'\xe3\x81\x92\xe3\x82\x93\xe3\x81\x97\xe3\x81\x91\xe3\x82\x93'
            b'\xe3\x81\x92\xe3\x82\x93\xe3\x81\x97\xe3\x81\x91\xe3\x82\x93'
            b'\xe3\x81\x92\xe3\x82\x93\xe3\x81\x97\xe3\x81\x91\xe3\x82\x93'
            b'\xe3\x81\x92\xe3\x82\x93\xe3\x81\x97\xe3\x81\x91\xe3\x82\x93'
            b'\xe3\x81\x92\xe3\x82\x93\xe3\x81\x97\xe3\x81\x91\xe3\x82\x93'
            b'\xe3\x81\x92\xe3\x82\x93\xe3\x81\x97\xe3\x81\x91\xe3\x82\x93'
            b'\xe3\x81\x92\xe3\x82\x93\xe3\x81\x97\xe3\x81\x91\xe3\x82\x93'
            b'\xe3\x81\x92\xe3\x82\x93\xe3\x81\x97\xe3\x81\x91\xe3\x82\x93'
            b'\xe3\x81\x92\xe3\x82\x93\xe3\x81\x97\xe3\x81\x91\xe3\x82\x93'
            b'\xe3\x81\x92\xe3\x82\x93\xe3\x81\x97\xe3\x81\x91\xe3\x82\x93'
            b'\xe3\x81\x92\xe3\x82\x93\xe3\x81\x97\xe3\x81\x91\xe3\x82\x93'
            b'\xe3\x81\x92\xe3\x82\x93\xe3\x81\x97\xe3\x81\x91\xe3\x82\x93'
            b'\xe3\x81\x92'))
        self.assertEqual(len(bytes(txt)), 254)