Ejemplo n.º 1
0
 def _on_inbox_packet_received(self, newpacket, info, status, error_message):
     from logs import lg
     from contacts import contactsdb
     from userid import my_id
     from userid import global_id
     from storage import backup_control
     from p2p import commands
     from p2p import p2p_service
     if newpacket.Command == commands.Files():
         list_files_global_id = global_id.ParseGlobalID(newpacket.PacketID)
         if not list_files_global_id['idurl']:
             lg.warn('invalid PacketID: %s' % newpacket.PacketID)
             return False
         if list_files_global_id['idurl'] != my_id.getLocalIDURL():
             # lg.warn('skip %s which is from another customer' % newpacket)
             return False
         if not contactsdb.is_supplier(newpacket.OwnerID):
             lg.warn('%s came, but %s is not my supplier' % (newpacket, newpacket.OwnerID, ))
             # skip Files() if this is not my supplier
             return False
         lg.out(self.debug_level, "service_backups._on_inbox_packet_received: %r for us from %s at %s" % (
             newpacket, newpacket.CreatorID, info))
         if backup_control.IncomingSupplierListFiles(newpacket, list_files_global_id):
             # send ack packet back
             p2p_service.SendAck(newpacket)
         else:
             p2p_service.SendFail(newpacket)
         return True
     return False
Ejemplo n.º 2
0
 def _on_my_dht_relations_discovered(self, discovered_suppliers_list):
     from p2p import p2p_service
     from contacts import contactsdb
     from logs import lg
     suppliers_to_be_dismissed = set()
     # clean up old suppliers
     for idurl in discovered_suppliers_list:
         if not idurl:
             continue
         if not contactsdb.is_supplier(idurl):
             lg.warn('dht relation with %s is not valid anymore' % idurl)
             suppliers_to_be_dismissed.add(idurl)
     for idurl in suppliers_to_be_dismissed:
         p2p_service.SendCancelService(
             remote_idurl=idurl,
             service_name='service_supplier',
         )
         p2p_service.SendCancelService(
             remote_idurl=idurl,
             service_name='service_supplier_relations',
         )
     if suppliers_to_be_dismissed:
         lg.info(
             'found %d suppliers to be cleaned and sent CancelService() packets'
             % len(suppliers_to_be_dismissed))
Ejemplo n.º 3
0
def on_files_received(newpacket, info):
    list_files_global_id = global_id.ParseGlobalID(newpacket.PacketID)
    if not list_files_global_id['idurl']:
        lg.warn('invalid PacketID: %s' % newpacket.PacketID)
        return False
    if list_files_global_id['idurl'] != my_id.getLocalID():
        # ignore Files() if this is another customer
        if _Debug:
            lg.dbg(
                _DebugLevel,
                'ignore incoming %r which is owned by another customer' %
                newpacket)
        return False
    if not contactsdb.is_supplier(newpacket.OwnerID):
        # ignore Files() if this is not my supplier
        if _Debug:
            lg.dbg(
                _DebugLevel,
                'incoming %r received, but %r is not my supplier' % (
                    newpacket,
                    newpacket.OwnerID,
                ))
        return False
    if _Debug:
        lg.args(
            _DebugLevel,
            "service_backups._on_inbox_packet_received: %r for us from %s at %s"
            % (newpacket, newpacket.CreatorID, info))
    if IncomingSupplierListFiles(newpacket, list_files_global_id):
        p2p_service.SendAck(newpacket)
    else:
        p2p_service.SendFail(newpacket)
    return True
Ejemplo n.º 4
0
    def _on_my_dht_relations_discovered(self, dht_result):
        from p2p import p2p_service
        from contacts import contactsdb
        from logs import lg
        if not (dht_result and isinstance(dht_result, dict) and len(dht_result.get('suppliers', [])) > 0):
            lg.warn('no dht records found for my customer family')
            return
        suppliers_to_be_dismissed = set()
        # clean up old suppliers
        for idurl in dht_result['suppliers']:
            if not idurl:
                continue
            if not contactsdb.is_supplier(idurl):
                lg.warn('dht relation with %s is not valid anymore' % idurl)
                suppliers_to_be_dismissed.add(idurl)
        for supplier_idurl in suppliers_to_be_dismissed:
            p2p_service.SendCancelService(
                remote_idurl=supplier_idurl,
                service_name='service_supplier',
            )
#             p2p_service.SendCancelService(
#                 remote_idurl=idurl,
#                 service_name='service_p2p_notifications',
#             )
        if suppliers_to_be_dismissed:
            lg.info('found %d suppliers to be cleaned and sent CancelService() packets' % len(suppliers_to_be_dismissed))
Ejemplo n.º 5
0
 def _supplier_connector_state(self, supplier_idurl, newstate):
     if supplier_idurl != self.target_idurl:
         return
     if newstate is 'CONNECTED':
         if not contactsdb.is_supplier(self.target_idurl):
             self.automat('supplier-connected', self.target_idurl)
     elif newstate in ['DISCONNECTED', 'NO_SERVICE', ]:
         self.automat('supplier-not-connected')
Ejemplo n.º 6
0
 def _supplier_connector_state(self, supplier_idurl, newstate):
     if supplier_idurl != self.target_idurl:
         return
     if newstate is 'CONNECTED':
         if not contactsdb.is_supplier(self.target_idurl):
             self.automat('supplier-connected', self.target_idurl)
     elif newstate in ['DISCONNECTED', 'NO_SERVICE', ]:
         self.automat('supplier-not-connected')
Ejemplo n.º 7
0
 def _on_my_dht_relations_discovered(self, dht_result):
     from p2p import p2p_service
     from contacts import contactsdb
     from userid import my_id
     from userid import id_url
     from crypt import my_keys
     from logs import lg
     if not (dht_result and isinstance(dht_result, dict)
             and len(dht_result.get('suppliers', [])) > 0):
         lg.warn('no dht records found for my customer family')
         return
     if id_url.is_some_empty(contactsdb.suppliers()):
         lg.warn(
             'some of my suppliers are not hired yet, skip doing any changes'
         )
         return
     suppliers_to_be_dismissed = set()
     dht_suppliers = id_url.to_bin_list(dht_result['suppliers'])
     # clean up old suppliers
     for idurl in dht_suppliers:
         if not idurl:
             continue
         if not contactsdb.is_supplier(idurl):
             lg.warn('dht relation with %r is not valid anymore' % idurl)
             suppliers_to_be_dismissed.add(idurl)
     for supplier_idurl in suppliers_to_be_dismissed:
         service_info = {}
         my_customer_key_id = my_id.getGlobalID(key_alias='customer')
         if my_keys.is_key_registered(my_customer_key_id):
             service_info['customer_public_key'] = my_keys.get_key_info(
                 key_id=my_customer_key_id,
                 include_private=False,
                 include_signature=False,
                 generate_signature=False,
             )
         p2p_service.SendCancelService(
             remote_idurl=supplier_idurl,
             service_name='service_supplier',
             json_payload=service_info,
         )
     if suppliers_to_be_dismissed:
         lg.info(
             'found %d suppliers to be cleaned and sent CancelService() packets'
             % len(suppliers_to_be_dismissed))
Ejemplo n.º 8
0
 def _on_inbox_packet_received(self, newpacket, info, status,
                               error_message):
     from logs import lg
     from main import settings
     from contacts import contactsdb
     from userid import my_id
     from userid import global_id
     from storage import backup_control
     from p2p import commands
     if newpacket.Command == commands.Data():
         if newpacket.OwnerID != my_id.getLocalID():
             # only catch data belongs to me
             return False
         lg.out(
             self.debug_level,
             "service_backups._on_inbox_packet_received: %r for us from %s"
             % (
                 newpacket,
                 newpacket.RemoteID,
             ))
         if newpacket.PacketID == global_id.MakeGlobalID(
                 idurl=my_id.getLocalID(),
                 path=settings.BackupIndexFileName(),
         ):
             # TODO: move to service_backup_db
             backup_control.IncomingSupplierBackupIndex(newpacket)
             return True
     if newpacket.Command == commands.Files():
         if not newpacket.PacketID.startswith(my_id.getGlobalID() + ':'):
             # skip Files() which are from another customer
             return False
         if not contactsdb.is_supplier(newpacket.OwnerID):
             # skip Files() if this is not my supplier
             return False
         lg.out(
             self.debug_level,
             "service_backups._on_inbox_packet_received: %r for us from %s"
             % (
                 newpacket,
                 newpacket.RemoteID,
             ))
         return backup_control.IncomingSupplierListFiles(newpacket)
     return False
Ejemplo n.º 9
0
 def _supplier_connector_state(self, supplier_idurl, newstate, **kwargs):
     if id_url.field(supplier_idurl) != self.target_idurl:
         return
     if newstate in [
             'DISCONNECTED',
             'NO_SERVICE',
     ]:
         self.automat('supplier-not-connected')
         return
     if newstate != 'CONNECTED':
         return
     if contactsdb.is_supplier(self.target_idurl):
         return
     family_position = kwargs.get('family_position', None)
     ecc_map = kwargs.get('ecc_map')
     self.automat('supplier-connected',
                  self.target_idurl,
                  family_position=family_position,
                  ecc_map=ecc_map,
                  family_snapshot=self.family_snapshot)
Ejemplo n.º 10
0
 def _do_process_request(self, *args, **kwargs):
     global _MaxRoutesNumber
     json_payload, request, info = args[0]
     user_id = request.CreatorID
     #--- commands.RequestService()
     if request.Command == commands.RequestService():
         if len(self.routes) >= _MaxRoutesNumber:
             if _Debug:
                 lg.out(
                     _DebugLevel,
                     'proxy_server.doProcessRequest RequestService rejected: too many routes'
                 )
                 lg.out(_DebugLevel, '    %r' % self.routes)
             p2p_service.SendAck(request, 'rejected', wide=True)
         else:
             try:
                 # idsrc = strng.to_bin(json_payload['identity'])
                 idsrc = json_payload['identity']
                 cached_id = identity.identity(xmlsrc=idsrc)
             except:
                 lg.out(_DebugLevel, 'payload: [%s]' % request.Payload)
                 lg.exc()
                 return
             if not cached_id.Valid():
                 lg.warn('incoming identity is not valid')
                 return
             if not cached_id.isCorrect():
                 lg.warn('incoming identity is not correct')
                 return
             if user_id != cached_id.getIDURL():
                 lg.warn(
                     'incoming identity is not belong to request packet creator'
                 )
                 return
             if contactsdb.is_supplier(user_id):
                 if _Debug:
                     lg.out(
                         _DebugLevel,
                         'proxy_server.doProcessRequest RequestService rejected: this user is my supplier'
                     )
                 p2p_service.SendAck(request, 'rejected', wide=True)
                 return
             oldnew = ''
             if user_id not in list(self.routes.keys()):
                 # accept new route
                 oldnew = 'NEW'
                 self.routes[user_id] = {}
             else:
                 # accept existing routed user
                 oldnew = 'OLD'
             if not self._is_my_contacts_present_in_identity(cached_id):
                 if _Debug:
                     lg.out(_DebugLevel,
                            '    DO OVERRIDE identity for %s' % user_id)
                 identitycache.OverrideIdentity(user_id,
                                                cached_id.serialize())
             else:
                 if _Debug:
                     lg.out(
                         _DebugLevel,
                         '        SKIP OVERRIDE identity for %s' % user_id)
             self.routes[user_id]['time'] = time.time()
             self.routes[user_id]['identity'] = cached_id.serialize(
                 as_text=True)
             self.routes[user_id]['publickey'] = strng.to_text(
                 cached_id.publickey)
             self.routes[user_id][
                 'contacts'] = cached_id.getContactsAsTuples(as_text=True)
             self.routes[user_id]['address'] = []
             self._write_route(user_id)
             active_user_sessions = gateway.find_active_session(
                 info.proto, info.host)
             if active_user_sessions:
                 user_connection_info = {
                     'id': active_user_sessions[0].id,
                     'index': active_user_sessions[0].index,
                     'proto': info.proto,
                     'host': info.host,
                     'idurl': user_id,
                 }
                 active_user_session_machine = automat.objects().get(
                     user_connection_info['index'], None)
                 if active_user_session_machine:
                     active_user_session_machine.addStateChangedCallback(
                         lambda o, n, e, a: self.
                         _on_user_session_disconnected(user_id, o, n, e, a),
                         oldstate='CONNECTED',
                     )
                     if _Debug:
                         lg.out(
                             _DebugLevel,
                             'proxy_server.doProcessRequest connected %s routed user, set active session: %s'
                             % (oldnew.capitalize(), user_connection_info))
                 else:
                     lg.err('not found session state machine: %s' %
                            user_connection_info['index'])
             else:
                 if _Debug:
                     lg.out(
                         _DebugLevel,
                         'proxy_server.doProcessRequest active connection with user %s at %s:%s not yet exist'
                         % (
                             user_id,
                             info.proto,
                             info.host,
                         ))
                     lg.out(
                         _DebugLevel, '    current active sessions: %d' %
                         len(gateway.list_active_sessions(info.proto)))
             self.acks.append(
                 p2p_service.SendAck(request, 'accepted', wide=True))
             if _Debug:
                 lg.out(
                     _DebugLevel,
                     'proxy_server.doProcessRequest !!!!!!! ACCEPTED %s ROUTE for %s  contacts=%s'
                     % (
                         oldnew.capitalize(),
                         user_id,
                         self.routes[user_id]['contacts'],
                     ))
     #--- commands.CancelService()
     elif request.Command == commands.CancelService():
         if user_id in self.routes:
             # cancel existing route
             self._remove_route(user_id)
             self.routes.pop(user_id)
             identitycache.StopOverridingIdentity(user_id)
             p2p_service.SendAck(request, 'accepted', wide=True)
             if _Debug:
                 lg.out(
                     _DebugLevel,
                     'proxy_server.doProcessRequest !!!!!!! CANCELLED ROUTE for %s'
                     % user_id)
         else:
             p2p_service.SendAck(request, 'rejected', wide=True)
             if _Debug:
                 lg.out(
                     _DebugLevel,
                     'proxy_server.doProcessRequest CancelService rejected : %s is not found in routes'
                     % user_id)
                 lg.out(_DebugLevel, '    %r' % self.routes)
     else:
         p2p_service.SendFail(request, 'rejected', wide=True)