Пример #1
0
 def _on_request_service_ack(self, response, info):
     self.router_connection_info = None
     if response.PacketID not in self.request_service_packet_id:
         lg.warn('wrong PacketID in response: %s, but outgoing was : %s' % (
             response.PacketID, str(self.request_service_packet_id)))
         self.automat('service-refused', (response, info))
         return
     if response.PacketID in self.request_service_packet_id:
         self.request_service_packet_id.remove(response.PacketID)
     else:
         lg.warn('%s was not found in pending requests: %s' % (response.PacketID, self.request_service_packet_id))
     if _Debug:
         lg.out(_DebugLevel, 'proxy_receiver._on_request_service_ack : %s' % str(response.Payload))
     if self.router_idurl != response.CreatorID:
         lg.err('received unexpected response from another node: %r ~ %r' % (self.router_idurl, response.CreatorID, ))
         self.automat('service-refused', (response, info))
         return
     service_ack_info = strng.to_text(response.Payload)
     if service_ack_info.startswith('rejected'):
         self.automat('service-refused', (response, info))
         return
     active_router_sessions = gateway.find_active_session(info.proto, host=info.host)
     if not active_router_sessions:
         active_router_sessions = gateway.find_active_session(info.proto, idurl=id_url.to_bin(response.CreatorID))
     if not active_router_sessions:
         lg.err('active connection with proxy router at %s:%s was not found' % (info.proto, info.host, ))
         if _Debug:
             lg.args(_DebugLevel, router_idurl=self.router_idurl, ack_packet=info, active_sessions=gateway.list_active_sessions(info.proto))
         self.automat('service-refused', (response, info))
         return
     self.router_connection_info = {
         'id': active_router_sessions[0].id,
         'index': active_router_sessions[0].index,
         'repr': repr(active_router_sessions[0]),
         'proto': info.proto,
         'host': info.host,
         'idurl': self.router_idurl,
         'global_id': global_id.UrlToGlobalID(self.router_idurl),
     }
     active_router_session_machine = automat.by_index(self.router_connection_info['index'])
     if active_router_session_machine is None:
         lg.err('did not found proxy router session state machine instance: %s' % self.router_connection_info)
         self.router_connection_info = None
         if _Debug:
             lg.args(_DebugLevel, automats=automat.objects())
         self.automat('service-refused', (response, info))
         return
     lg.info('found active session for proxy router: %s' % active_router_session_machine)
     self.automat('service-accepted', (response, info, active_router_session_machine))
Пример #2
0
 def doStopListening(self, *args, **kwargs):
     """
     Action method.
     """
     if _Debug:
         lg.args(_DebugLevel, router_idurl=self.router_idurl)
     if online_status.isKnown(self.router_idurl):
         online_status.remove_online_status_listener_callback(
             idurl=self.router_idurl,
             callback_method=self._on_router_contact_status_connected,
         )
         online_status.remove_online_status_listener_callback(
             idurl=self.router_idurl,
             callback_method=self._on_router_contact_status_offline,
         )
     active_router_session_machine_index = None
     if self.router_connection_info:
         active_router_session_machine = None
         active_router_session_machine_index = self.router_connection_info.get('index', None)
         if active_router_session_machine_index is not None:
             active_router_session_machine = automat.by_index(active_router_session_machine_index)
         if not active_router_session_machine:
             active_router_sessions = gateway.find_active_session(
                 proto=self.router_connection_info.get('proto'),
                 host=self.router_connection_info.get('host'),
             )
             if not active_router_sessions:
                 active_router_sessions = gateway.find_active_session(
                     proto=self.router_connection_info.get('proto'),
                     idurl=id_url.to_bin(self.router_idurl),
                 )
             if active_router_sessions:
                 active_router_session_machine = automat.by_index(active_router_sessions[0].index)
         if active_router_session_machine is not None:
             active_router_session_machine.removeStateChangedCallback(self._on_router_session_disconnected)
             lg.info('removed callback from router active session: %r' % active_router_session_machine)
         else:
             lg.err('did not found active router session state machine with index %s' % active_router_session_machine_index)
     WriteMyOriginalIdentitySource('')
     config.conf().setString('services/proxy-transport/current-router', '')
     callback.remove_inbox_callback(self._on_inbox_packet_received)
     self.router_identity = None
     self.router_idurl = None
     self.router_id = ''
     self.router_proto_host = None
     self.request_service_packet_id = []
     self.router_connection_info = None
     my_id.rebuildLocalIdentity()
Пример #3
0
 def doStartListening(self, *args, **kwargs):
     """
     Action method.
     """
     try:
         _, info = args[0]
         self.router_proto_host = (info.proto, info.host)
     except:
         try:
             s = config.conf().getString('services/proxy-transport/current-router').strip()
             _, router_proto, router_host = s.split(' ')
             self.router_proto_host = (router_proto, strng.to_bin(router_host), )
         except:
             lg.exc()
     self.router_identity = identitycache.FromCache(self.router_idurl)
     config.conf().setString('services/proxy-transport/current-router', '%s %s %s' % (
         strng.to_text(self.router_idurl),
         strng.to_text(self.router_proto_host[0]),
         strng.to_text(self.router_proto_host[1]),
     ))
     current_identity = my_id.getLocalIdentity().serialize()
     previous_identity = ReadMyOriginalIdentitySource()
     if previous_identity:
         lg.warn('my original identity is not empty, SKIP overwriting')
         lg.out(2, '\nPREVIOUS ORIGINAL IDENTITY:\n%s\n' % current_identity)
     else:
         WriteMyOriginalIdentitySource(current_identity)
         lg.warn('current identity was stored as my-original-identity')
     self.request_service_packet_id = []
     callback.insert_inbox_callback(0, self._on_inbox_packet_received)
     if contact_status.isKnown(self.router_idurl):
         contact_status.A(self.router_idurl).addStateChangedCallback(
             self._on_router_contact_status_connected, newstate='CONNECTED')
         contact_status.A(self.router_idurl).addStateChangedCallback(
             self._on_router_contact_status_offline, newstate='OFFLINE')
     active_router_sessions = gateway.find_active_session(info.proto, info.host)
     if active_router_sessions:
         self.router_connection_info = {
             'id': active_router_sessions[0].id,
             'index': active_router_sessions[0].index,
             'proto': info.proto,
             'host': info.host,
             'idurl': self.router_idurl,
             'global_id': global_id.UrlToGlobalID(self.router_idurl),
         }
         active_router_session_machine = automat.objects().get(self.router_connection_info['index'], None)
         if active_router_session_machine:
             active_router_session_machine.addStateChangedCallback(
                 self._on_router_session_disconnected, oldstate='CONNECTED')
             lg.info('connected to proxy router and set active session: %s' % self.router_connection_info)
         else:
             lg.err('not found proxy router session state machine: %s' % self.router_connection_info['index'])
     else:
         lg.err('active connection with proxy router at %s:%s was not found' % (info.proto, info.host, ))
     if _Debug:
         lg.out(2, 'proxy_receiver.doStartListening !!!!!!! router: %s at %s://%s' % (
             self.router_idurl, self.router_proto_host[0], self.router_proto_host[1]))
Пример #4
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)