예제 #1
0
def contacts_remote():
    """
    Return ID's list of all known peers.
    """
    allcontactslist = id_url.to_bin_list(contacts_full())
    if my_id.getLocalID().to_bin() in allcontactslist:
        allcontactslist.remove(my_id.getLocalID().to_bin())
    return id_url.fields_list(allcontactslist)
예제 #2
0
def contacts_remote(include_all=False, include_enabled=True):
    """
    Return ID's list of all known peers.
    """
    allcontactslist = id_url.to_bin_list(contacts(include_all=include_all, include_enabled=include_enabled))
    if my_id.getLocalID().to_bin() in allcontactslist:
        allcontactslist.remove(my_id.getLocalID().to_bin())
    return id_url.fields_list(allcontactslist)
예제 #3
0
 def _do_verify(dht_value, customer_idurl_bin):
     if customer_idurl_bin in rotated_idurls:
         rotated_idurls.remove(customer_idurl_bin)
     ret = {
         'suppliers': [],
         'ecc_map': None,
         'customer_idurl': customer_idurl,
         'revision': 0,
         'publisher_idurl': None,
         'timestamp': None,
     }
     if not dht_value or not isinstance(dht_value, dict):
         if not rotated_idurls:
             result.callback(ret)
             return ret
         another_customer_idurl_bin = rotated_idurls.pop(0)
         lg.warn(
             'found another rotated idurl %r and re-try reading customer suppliers'
             % another_customer_idurl_bin)
         d = dht_records.get_suppliers(another_customer_idurl_bin,
                                       return_details=True,
                                       use_cache=False)
         d.addCallback(_do_verify, another_customer_idurl_bin)
         d.addErrback(_on_error)
         return ret
     try:
         _ecc_map = strng.to_text(dht_value['ecc_map'])
         if as_fields:
             _customer_idurl = id_url.field(dht_value['customer_idurl'])
             _publisher_idurl = id_url.field(
                 dht_value.get('publisher_idurl'))
             _suppliers_list = id_url.fields_list(dht_value['suppliers'])
         else:
             _customer_idurl = id_url.to_bin(dht_value['customer_idurl'])
             _publisher_idurl = id_url.to_bin(
                 dht_value.get('publisher_idurl'))
             _suppliers_list = id_url.to_bin_list(dht_value['suppliers'])
         _revision = int(dht_value.get('revision'))
         _timestamp = int(dht_value.get('timestamp'))
     except:
         lg.exc()
         result.callback(ret)
         return ret
     ret.update({
         'suppliers': _suppliers_list,
         'ecc_map': _ecc_map,
         'customer_idurl': _customer_idurl,
         'revision': _revision,
         'publisher_idurl': _publisher_idurl,
         'timestamp': _timestamp,
     })
     return _do_identity_cache(ret)
예제 #4
0
def set_suppliers(idlist, customer_idurl=None):
    """
    Set suppliers ID's list.
    """
    global _SuppliersList
    if not customer_idurl:
        customer_idurl = my_id.getLocalID()
    customer_idurl = id_url.field(customer_idurl)
    if customer_idurl not in _SuppliersList:
        _SuppliersList[customer_idurl] = []
        lg.info('created new suppliers list in memory for customer %r' % customer_idurl)
    _SuppliersList[customer_idurl] = id_url.fields_list(idlist)
    if _Debug:
        lg.args(_DebugLevel, suppliers=_SuppliersList[customer_idurl], customer_idurl=customer_idurl)
예제 #5
0
 def test_dict_of_lists(self):
     self._cache_identity('alice')
     self._cache_identity('bob')
     self._cache_identity('carl')
     self._cache_identity('frank')
     d = {}
     d[id_url.field(alice_text)] = []
     d[id_url.field(bob)] = []
     d[id_url.field(alice_text)].append(id_url.field(carl))
     d[id_url.field(alice_text)].append(id_url.field(frank_1))
     d[id_url.field(bob)].append(id_url.field(''))
     d[id_url.field(bob)].append(id_url.field(frank_2))
     d[id_url.field(bob)].append(id_url.field(None))
     d[id_url.field(bob)].append(id_url.field(b''))
     self.assertIn(id_url.field(frank_1), d[id_url.field(alice_text)])
     self.assertIn(id_url.field(frank_1), d[id_url.field(bob)])
     self.assertFalse(id_url.is_some_empty(d[id_url.field(alice_text)]))
     self.assertTrue(id_url.is_some_empty(d[id_url.field(bob)]))
     self.assertEqual(len(id_url.fields_list(d[id_url.field(bob)])), 4)
예제 #6
0
 def _do_verify(dht_value):
     ret = {
         'suppliers': [],
         'ecc_map': None,
         'customer_idurl': customer_idurl,
         'revision': 0,
         'publisher_idurl': None,
         'timestamp': None,
     }
     if not dht_value or not isinstance(dht_value, dict):
         result.callback(ret)
         return ret
     try:
         _ecc_map = strng.to_text(dht_value['ecc_map'])
         if as_fields:
             _customer_idurl = id_url.field(dht_value['customer_idurl'])
             _publisher_idurl = id_url.field(
                 dht_value.get('publisher_idurl'))
             _suppliers_list = id_url.fields_list(dht_value['suppliers'])
         else:
             _customer_idurl = id_url.to_bin(dht_value['customer_idurl'])
             _publisher_idurl = id_url.to_bin(
                 dht_value.get('publisher_idurl'))
             _suppliers_list = id_url.to_bin_list(dht_value['suppliers'])
         _revision = int(dht_value.get('revision'))
         _timestamp = int(dht_value.get('timestamp'))
     except:
         lg.exc()
         result.callback(ret)
         return ret
     ret.update({
         'suppliers': _suppliers_list,
         'ecc_map': _ecc_map,
         'customer_idurl': _customer_idurl,
         'revision': _revision,
         'publisher_idurl': _publisher_idurl,
         'timestamp': _timestamp,
     })
     return _do_identity_cache(ret)
예제 #7
0
def write_customer_suppliers(
    customer_idurl,
    suppliers_list,
    ecc_map=None,
    revision=None,
    publisher_idurl=None,
):
    customer_idurl = id_url.field(customer_idurl)
    publisher_idurl = id_url.field(publisher_idurl)
    if customer_idurl == my_id.getIDURL():
        lg.warn(
            'skip writing my own suppliers list which suppose to be written to DHT'
        )
    else:
        contactsdb.set_suppliers(suppliers_list, customer_idurl=customer_idurl)
        contactsdb.save_suppliers(customer_idurl=customer_idurl)
    return dht_records.set_suppliers(
        customer_idurl=customer_idurl,
        suppliers_list=id_url.fields_list(suppliers_list),
        ecc_map=ecc_map,
        revision=revision,
        publisher_idurl=publisher_idurl,
    )
예제 #8
0
def set_customers(idlist):
    """
    Set customers list.
    """
    global _CustomersList
    _CustomersList = id_url.fields_list(idlist)
예제 #9
0
 def test_in_list(self):
     self._cache_identity('alice')
     self._cache_identity('bob')
     self._cache_identity('carl')
     l = [
         id_url.field(alice_text),
         id_url.field(bob),
         id_url.field(frank_1),
         id_url.field(frank_2),
     ]
     with self.assertRaises(KeyError):
         (id_url.field(carl) not in l)
     self.assertTrue(id_url.field(alice_text) in l)
     with self.assertRaises(KeyError):
         (id_url.field(b'http://fake.com/frank.xml') not in l)
     with self.assertRaises(KeyError):
         (id_url.field(ethan_not_exist) not in l)
     self.assertTrue(id_url.field(bob) in l)
     with self.assertRaises(KeyError):
         (id_url.field(frank_1) in l)
     with self.assertRaises(KeyError):
         (id_url.field(frank_2) in l)
     self.assertTrue(len(l), 4)
     with self.assertRaises(KeyError):
         (l[0] != l[3])
     with self.assertRaises(KeyError):
         (l[2] == l[3])
     self._cache_identity('frank')
     self.assertTrue(l[2] == l[3])
     self.assertTrue(l[0] != l[3])
     self.assertIn(id_url.field(frank_1), l)
     self.assertFalse(id_url.is_some_empty(l))
     self.assertEqual(l.count(None), 0)
     self.assertEqual(id_url.empty_count(l), 0)
     l += [
         id_url.field(b''),
     ] * 3
     self.assertEqual(l.count(None), 3)
     self.assertEqual(l.count(b''), 3)
     self.assertEqual(l.count(''), 3)
     self.assertEqual(l.count(id_url.field(None)), 3)
     self.assertEqual(l.count(id_url.field(b'')), 3)
     self.assertEqual(l.count(id_url.field('')), 3)
     self.assertEqual(id_url.fields_list([
         b'',
     ]), [
         b'',
     ])
     self.assertEqual(id_url.fields_list([
         b'',
     ]), [
         None,
     ])
     self.assertEqual(id_url.fields_list([
         id_url.field(''),
     ]), [
         None,
     ])
     self.assertEqual(id_url.fields_list([
         None,
     ]), [
         id_url.field(''),
     ])
     self.assertNotEqual(id_url.fields_list([None, None]), [
         id_url.field(''),
     ])
     self.assertEqual(len(id_url.fields_list([
         None,
     ])), 1)
예제 #10
0
    def _on_incoming_contacts_packet(self, newpacket, info):
        from twisted.internet import reactor  # @UnresolvedImport
        from logs import lg
        from lib import serialization
        from lib import strng
        from supplier import family_member
        from userid import my_id
        from userid import id_url
        try:
            json_payload = serialization.BytesToDict(newpacket.Payload,
                                                     keys_to_text=True)
            contacts_type = strng.to_text(json_payload['type'])
            contacts_space = strng.to_text(json_payload['space'])
        except:
            lg.exc()
            return False

        if contacts_space != 'family_member':
            return False

        if contacts_type == 'suppliers_list':
            try:
                customer_idurl = id_url.field(json_payload['customer_idurl'])
                ecc_map = strng.to_text(json_payload['customer_ecc_map'])
                suppliers_list = id_url.fields_list(
                    json_payload['suppliers_list'])
                transaction_revision = json_payload.get('transaction_revision')
            except:
                lg.exc()
                return False
            if customer_idurl.to_bin() == my_id.getLocalID().to_bin():
                lg.warn('received contacts for my own customer family')
                return False
            if not id_url.is_cached(customer_idurl):
                lg.warn('received contacts from unknown user: %r' %
                        customer_idurl)
                return False
            fm = family_member.by_customer_idurl(customer_idurl)
            if not fm:
                lg.warn(
                    'family_member() instance not found for incoming %s from %s for customer %r'
                    % (
                        newpacket,
                        info,
                        customer_idurl,
                    ))
                return False
            reactor.callLater(0, fm.automat, 'contacts-received', {  # @UndefinedVariable
                'type': contacts_type,
                'packet': newpacket,
                'customer_idurl': customer_idurl,
                'customer_ecc_map': ecc_map,
                'suppliers_list': suppliers_list,
                'transaction_revision': transaction_revision,
            })
            return True

        elif contacts_type == 'supplier_position':
            try:
                customer_idurl = id_url.field(json_payload['customer_idurl'])
                ecc_map = strng.to_text(json_payload['customer_ecc_map'])
                supplier_idurl = id_url.field(json_payload['supplier_idurl'])
                supplier_position = json_payload['supplier_position']
                family_snapshot = id_url.to_bin_list(
                    json_payload.get('family_snapshot'))
            except:
                lg.exc()
                return False
            if customer_idurl.to_bin() == my_id.getLocalID().to_bin():
                lg.warn('received contacts for my own customer family')
                return False
            fm = family_member.by_customer_idurl(customer_idurl)
            if not fm:
                lg.warn(
                    'family_member() instance not found for incoming %s from %s for customer %r'
                    % (
                        newpacket,
                        info,
                        customer_idurl,
                    ))
                return False
            reactor.callLater(0, fm.automat, 'contacts-received', {  # @UndefinedVariable
                'type': contacts_type,
                'packet': newpacket,
                'customer_idurl': customer_idurl,
                'customer_ecc_map': ecc_map,
                'supplier_idurl': supplier_idurl,
                'supplier_position': supplier_position,
                'family_snapshot': family_snapshot,
            })
            return True

        return False
예제 #11
0
def contacts_remote(include_all=False, include_enabled=True):
    """
    Return ID's list of all known peers.
    """
    l = id_url.to_bin_list(contacts(include_all=include_all, include_enabled=include_enabled))
    return [i for i in id_url.fields_list(l) if not id_url.is_the_same(i, my_id.getIDURL())]