diff --git a/LXMF/Handlers.py b/LXMF/Handlers.py index 5ce5571..7420ea5 100644 --- a/LXMF/Handlers.py +++ b/LXMF/Handlers.py @@ -2,8 +2,7 @@ import time import RNS import RNS.vendor.umsgpack as msgpack -from .LXMF import APP_NAME, stamp_cost_from_app_data - +from .LXMF import APP_NAME, stamp_cost_from_app_data, pn_announce_data_is_valid from .LXMessage import LXMessage class LXMFDeliveryAnnounceHandler: @@ -40,23 +39,24 @@ class LXMFPropagationAnnounceHandler: def received_announce(self, destination_hash, announced_identity, app_data): try: if type(app_data) == bytes: - data = msgpack.unpackb(app_data) - if self.lxmrouter.propagation_node and self.lxmrouter.autopeer: - node_timebase = data[1] - propagation_transfer_limit = None - if len(data) >= 3: - try: - propagation_transfer_limit = float(data[2]) - except: - propagation_transfer_limit = None + data = msgpack.unpackb(app_data) - if data[0] == True: - if RNS.Transport.hops_to(destination_hash) <= self.lxmrouter.autopeer_maxdepth: - self.lxmrouter.peer(destination_hash, node_timebase, propagation_transfer_limit) + if pn_announce_data_is_valid(data): + node_timebase = data[1] + propagation_transfer_limit = None + if len(data) >= 3: + try: + propagation_transfer_limit = float(data[2]) + except: + propagation_transfer_limit = None - elif data[0] == False: - self.lxmrouter.unpeer(destination_hash, node_timebase) + if data[0] == True: + if RNS.Transport.hops_to(destination_hash) <= self.lxmrouter.autopeer_maxdepth: + self.lxmrouter.peer(destination_hash, node_timebase, propagation_transfer_limit) + + elif data[0] == False: + self.lxmrouter.unpeer(destination_hash, node_timebase) except Exception as e: RNS.log("Error while evaluating propagation node announce, ignoring announce.", RNS.LOG_DEBUG) diff --git a/LXMF/LXMF.py b/LXMF/LXMF.py index c0d3039..184e530 100644 --- a/LXMF/LXMF.py +++ b/LXMF/LXMF.py @@ -83,6 +83,7 @@ AM_CUSTOM = 0xFF # handle and operate on LXMF data in client programs # ########################################################## +import RNS import RNS.vendor.umsgpack as msgpack def display_name_from_app_data(app_data=None): if app_data == None: @@ -104,8 +105,8 @@ def display_name_from_app_data(app_data=None): try: decoded = dn.decode("utf-8") return decoded - except: - RNS.log("Could not decode display name in included announce data. The contained exception was: {e}", RNS.LOG_ERROR) + except Exception as e: + RNS.log(f"Could not decode display name in included announce data. The contained exception was: {e}", RNS.LOG_ERROR) return None # Original announce format @@ -127,4 +128,25 @@ def stamp_cost_from_app_data(app_data=None): # Original announce format else: - return None \ No newline at end of file + return None + +def pn_announce_data_is_valid(data): + try: + if type(data) == bytes: + data = msgpack.unpackb(data) + + if len(data) < 3: + raise ValueError("Invalid announce data: Insufficient peer data") + else: + if data[0] != True and data[0] != False: + raise ValueError("Invalid announce data: Indeterminate propagation node status") + try: + int(data[1]) + except: + raise ValueError("Invalid announce data: Could not decode peer timebase") + + except Exception as e: + RNS.log(f"Could not validate propagation node announce data: {e}", RNS.LOG_DEBUG) + return False + + return True \ No newline at end of file