From 1bbfacee9435cb8f2eda0317c49a12d02b2b2e16 Mon Sep 17 00:00:00 2001 From: Mark Qvist Date: Wed, 11 Sep 2024 00:20:35 +0200 Subject: [PATCH] Add stamp configuration options --- nomadnet/Conversation.py | 6 ++++- nomadnet/NomadNetworkApp.py | 49 ++++++++++++++++++++++++++++++++++--- nomadnet/ui/textui/Guide.py | 21 ++++++++++++---- 3 files changed, 67 insertions(+), 9 deletions(-) diff --git a/nomadnet/Conversation.py b/nomadnet/Conversation.py index 8e2e523..057e040 100644 --- a/nomadnet/Conversation.py +++ b/nomadnet/Conversation.py @@ -217,7 +217,11 @@ def send(self, content="", title=""): if self.app.message_router.get_outbound_propagation_node() != None: desired_method = LXMF.LXMessage.PROPAGATED - lxm = LXMF.LXMessage(dest, source, content, title=title, desired_method=desired_method) + dest_is_trusted = False + if self.app.directory.trust_level(dest.hash) == DirectoryEntry.TRUSTED: + dest_is_trusted = True + + lxm = LXMF.LXMessage(dest, source, content, title=title, desired_method=desired_method, include_ticket=dest_is_trusted) lxm.register_delivery_callback(self.message_notification) lxm.register_failed_callback(self.message_notification) diff --git a/nomadnet/NomadNetworkApp.py b/nomadnet/NomadNetworkApp.py index c14ed82..84fdcd5 100644 --- a/nomadnet/NomadNetworkApp.py +++ b/nomadnet/NomadNetworkApp.py @@ -134,6 +134,10 @@ def __init__(self, configdir = None, rnsconfigdir = None, daemon = False, force_ self.lxmf_sync_interval = 360*60 self.lxmf_sync_limit = 8 self.compact_stream = False + + self.required_stamp_cost = None + self.accept_invalid_stamps = False + if not os.path.isdir(self.storagepath): os.makedirs(self.storagepath) @@ -296,8 +300,9 @@ def __init__(self, configdir = None, rnsconfigdir = None, daemon = False, force_ for destination_hash in self.ignored_list: self.message_router.ignore_destination(destination_hash) - self.lxmf_destination = self.message_router.register_delivery_identity(self.identity, display_name=self.peer_settings["display_name"]) - self.lxmf_destination.set_default_app_data(self.get_display_name_bytes) + self.lxmf_destination = self.message_router.register_delivery_identity(self.identity, display_name=self.peer_settings["display_name"], stamp_cost=self.required_stamp_cost) + if not self.accept_invalid_stamps: + self.message_router.enforce_stamps() RNS.Identity.remember( packet_hash=None, @@ -492,7 +497,9 @@ def cancel_lxmf_sync(self): self.message_router.cancel_propagation_node_requests() def announce_now(self): - self.lxmf_destination.announce() + self.message_router.set_inbound_stamp_cost(self.lxmf_destination.hash, self.required_stamp_cost) + self.lxmf_destination.display_name = self.peer_settings["display_name"] + self.message_router.announce(self.lxmf_destination.hash) self.peer_settings["last_announce"] = time.time() self.save_peer_settings() @@ -738,6 +745,24 @@ def applyConfig(self): else: self.lxmf_sync_limit = None + if option == "required_stamp_cost": + value = self.config["node"]["node_name"] + if value.lower() == "none": + self.required_stamp_cost = None + else: + value = self.config["client"].as_int(option) + + if value > 0: + if value > 255: + value = 255 + self.required_stamp_cost = value + else: + self.required_stamp_cost = None + + if option == "accept_invalid_stamps": + value = self.config["client"].as_bool(option) + self.accept_invalid_stamps = value + if option == "max_accepted_size": value = self.config["client"].as_float(option) @@ -1017,6 +1042,24 @@ def quit(self): # the limit, and download everything every time. lxmf_sync_limit = 8 +# You can specify a required stamp cost for +# inbound messages to be accepted. Specifying +# a stamp cost will require untrusted senders +# that message you to include a cryptographic +# stamp in their messages. Performing this +# operation takes the sender an amount of time +# proportional to the stamp cost. As a rough +# estimate, a stamp cost of 8 will take less +# than a second to compute, and a stamp cost +# of 20 could take several minutes, even on +# a fast computer. +required_stamp_cost = None + +# You can signal stamp requirements to senders, +# but still accept messages with invalid stamps +# by setting this option to True. +accept_invalid_stamps = False + # The maximum accepted unpacked size for mes- # sages received directly from other peers, # specified in kilobytes. Messages larger than diff --git a/nomadnet/ui/textui/Guide.py b/nomadnet/ui/textui/Guide.py index 7a3b5c8..69305cf 100644 --- a/nomadnet/ui/textui/Guide.py +++ b/nomadnet/ui/textui/Guide.py @@ -521,6 +521,18 @@ def focus_reader(self): On low-bandwidth networks, it can be useful to limit the amount of messages downloaded in each sync. The default is 8. Set to 0 to download all available messages every time a sync occurs. < +>>> +`!required_stamp_cost = None`! +>>>> +You can specify a required stamp cost for inbound messages to be accepted. Specifying a stamp cost will require untrusted senders that message you to include a cryptographic stamp in their messages. Performing this operation takes the sender an amount of time proportional to the stamp cost. As a rough estimate, a stamp cost of 8 will take less than a second to compute, and a stamp cost of 20 could take several minutes, even on a fast computer. +< + +>>> +`!accept_invalid_stamps = False`! +>>>> +You can signal stamp requirements to senders, but still accept messages with invalid stamps by setting this option to True. +< + >>> `!max_accepted_size = 500`! >>>> @@ -739,12 +751,11 @@ def focus_reader(self): The Testnet also runs the latest version of Reticulum, often even a short while before it is publicly released, which means strange behaviour might occur. If none of that scares you, add the following interface to your Reticulum configuration file to join: >> -[[RNS Testnet Zurich]] +[[RNS Testnet Dublin]] type = TCPClientInterface - interface_enabled = yes - outgoing = True - target_host = zurich.connect.reticulum.network - target_port = 4242 + enabled = yes + target_host = dublin.connect.reticulum.network + target_port = 4965 < If you connect to the testnet, you can leave nomadnet running for a while and wait for it to receive announces from other nodes on the network that host pages or services, or you can try connecting directly to some nodes listed here: