예제 #1
0
    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)
예제 #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()
예제 #3
0
 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()
예제 #4
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)
예제 #5
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)
예제 #6
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)