Beispiel #1
0
 def process_reliable_message(
         self, msg: ReliableMessage) -> Optional[ReliableMessage]:
     # check message delegate
     if msg.delegate is None:
         msg.delegate = self.transceiver
     receiver = msg.receiver
     if receiver.is_group:
         # deliver group message
         res = self.transmitter.deliver_message(msg=msg)
         if receiver.is_broadcast:
             # if this is a broadcast, deliver it, send back the response
             # and continue to process it with the station.
             # because this station is also a recipient too.
             if res is not None:
                 self.messenger.send_message(msg=res, callback=None)
         else:
             # or, this is is an ordinary group message,
             # just deliver it to the group assistant
             # and return the response to the sender.
             return res
     # try to decrypt and process message
     try:
         return super().process_reliable_message(msg=msg)
     except LookupError as error:
         if str(error).startswith('receiver error'):
             # not mine? deliver it
             return self.transmitter.deliver_message(msg=msg)
         else:
             raise error
Beispiel #2
0
 def __attach_key_digest(self, msg: ReliableMessage):
     # check message delegate
     if msg.delegate is None:
         msg.delegate = self.transceiver
     if msg.encrypted_key is not None:
         # 'key' exists
         return
     keys = msg.encrypted_keys
     if keys is None:
         keys = {}
     elif 'digest' in keys:
         # key digest already exists
         return
     # get key with direction
     sender = msg.sender
     group = msg.group
     if group is None:
         receiver = msg.receiver
         key = self.key_cache.cipher_key(sender=sender, receiver=receiver)
     else:
         key = self.key_cache.cipher_key(sender=sender, receiver=group)
     # get key data
     data = key.data
     if data is None or len(data) < 6:
         return
     # get digest
     pos = len(data) - 6
     digest = sha256(data[pos:])
     base64 = base64_encode(digest)
     # set digest
     pos = len(base64) - 8
     keys['digest'] = base64[pos:]
     msg['keys'] = keys
 def process_reliable_message(
         self, msg: ReliableMessage) -> Optional[ReliableMessage]:
     # check message delegate
     if msg.delegate is None:
         msg.delegate = self
     receiver = msg.receiver
     if receiver.is_group:
         # FIXME: check group meta/profile
         meta = self.facebook.meta(identifier=receiver)
         if meta is None:
             self.suspend_message(msg=msg)
             self.info('waiting for meta of group: %s' % receiver)
             return None
         # process group message
         return self.__process_group_message(msg=msg)
     # try to decrypt and process message
     return super().process_reliable_message(msg=msg)
Beispiel #4
0
 def arrival(self, msg: ReliableMessage) -> Optional[ReliableMessage]:
     # check message delegate
     if msg.delegate is None:
         msg.delegate = self
     sid = g_station.identifier
     if self.__traced(msg=msg, station=g_station):
         self.debug(
             'current station %s in traces list, ignore this message: %s' %
             (sid, msg))
         return None
     if not self.__deliver_message(msg=msg, neighbor=sid):
         self.error('failed to send income message: %s' % msg)
         return None
     if g_released:
         # FIXME: how to let the client knows where the message reached
         return None
     # response
     sender = msg.sender
     text = 'Message reached station: %s' % g_station
     self.debug('income: %s, %s | %s | %s' %
                (text, msg['signature'][:8], sender.name, msg.receiver))
     res = TextContent(text=text)
     res.group = msg.group
     return self.__pack_message(content=res, receiver=sender)