From dd12a76bf998255a815282d655f7e76cb2fd3b27 Mon Sep 17 00:00:00 2001 From: Mark Qvist Date: Fri, 14 Mar 2025 15:05:51 +0100 Subject: [PATCH] Added option to block non-trusted callers --- sbapp/sideband/core.py | 16 ++++++++++ sbapp/sideband/voice.py | 6 ++++ sbapp/ui/voice.py | 66 ++++++++++++++++++++++++++++++++++------- 3 files changed, 77 insertions(+), 11 deletions(-) diff --git a/sbapp/sideband/core.py b/sbapp/sideband/core.py index 56f5249..e758455 100644 --- a/sbapp/sideband/core.py +++ b/sbapp/sideband/core.py @@ -853,6 +853,8 @@ class SidebandCore(): self.config["voice_input"] = None if not "voice_ringer" in self.config: self.config["voice_ringer"] = None + if not "voice_trusted_only" in self.config: + self.config["voice_trusted_only"] = False # Make sure we have a database if not os.path.isfile(self.db_path): @@ -1074,6 +1076,20 @@ class SidebandCore(): RNS.log("Error while checking trust for "+RNS.prettyhexrep(context_dest)+": "+str(e), RNS.LOG_ERROR) return False + def voice_is_trusted(self, identity_hash): + context_dest = identity_hash + try: + lxmf_destination_hash = RNS.Destination.hash_from_name_and_identity("lxmf.delivery", identity_hash) + existing_voice = self._db_conversation(context_dest) + existing_lxmf = self._db_conversation(lxmf_destination_hash) + if existing_lxmf: trust = existing_lxmf["trust"] + else: trust = existing_voice["trust"] + return trust == 1 + + except Exception as e: + RNS.log("Could not decode a valid peer name from data: "+str(e), RNS.LOG_DEBUG) + return False + def is_object(self, context_dest, conv_data = None): try: if conv_data == None: diff --git a/sbapp/sideband/voice.py b/sbapp/sideband/voice.py index 9222c10..67a91ca 100644 --- a/sbapp/sideband/voice.py +++ b/sbapp/sideband/voice.py @@ -51,6 +51,7 @@ class ReticulumTelephone(): self.telephone.set_speaker(self.speaker_device) self.telephone.set_microphone(self.microphone_device) self.telephone.set_ringer(self.ringer_device) + self.telephone.set_allowed(self.__is_allowed) RNS.log(f"{self} initialised", RNS.LOG_DEBUG) def set_ringtone(self, ringtone_path): @@ -155,6 +156,11 @@ class ReticulumTelephone(): self.state = self.STATE_IN_CALL RNS.log(f"Call established with {RNS.prettyhexrep(self.caller.hash)}", RNS.LOG_DEBUG) + def __is_allowed(self, identity_hash): + if self.owner.config["voice_trusted_only"]: + return self.owner.voice_is_trusted(identity_hash) + else: return True + def __spin(self, until=None, msg=None, timeout=None): if msg: RNS.log(msg, RNS.LOG_DEBUG) if timeout != None: timeout = time.time()+timeout diff --git a/sbapp/ui/voice.py b/sbapp/ui/voice.py index 68e13d0..60d19fd 100644 --- a/sbapp/ui/voice.py +++ b/sbapp/ui/voice.py @@ -200,6 +200,9 @@ class Voice(): if not self.app.sideband.config["voice_ringer"] in self.output_devices: self.output_devices.append(self.app.sideband.config["voice_ringer"]) def update_settings_screen(self, sender=None): + self.voice_settings_screen.ids.voice_trusted_only.active = self.app.sideband.config["voice_trusted_only"] + self.voice_settings_screen.ids.voice_trusted_only.bind(active=self.settings_save_action) + bp = 6; ml = 45; fs = 16; ics = 14 self.update_devices() @@ -257,6 +260,9 @@ class Voice(): self.voice_settings_screen.ids.ringer_devices.add_widget(device_button) self.listed_ringer_devices.append(device) + def settings_save_action(self, sender=None, event=None): + self.app.sideband.config["voice_trusted_only"] = self.voice_settings_screen.ids.voice_trusted_only.active + self.app.sideband.save_configuration() def output_device_action(self, sender=None): self.app.sideband.config["voice_output"] = sender.device @@ -377,7 +383,42 @@ MDScreen: orientation: "vertical" size_hint_y: None height: self.minimum_height - padding: [dp(28), dp(32), dp(28), dp(16)] + padding: [dp(28), dp(48), dp(28), dp(16)] + + MDLabel: + text: "Call Handling" + font_style: "H6" + height: self.texture_size[1] + padding: [dp(0), dp(0), dp(0), dp(12)] + + MDLabel: + id: voice_settings_info + markup: True + text: "You can block calls from all other callers than contacts marked as trusted, by enabling the following option." + size_hint_y: None + text_size: self.width, None + height: self.texture_size[1] + padding: [dp(0), dp(16), dp(0), dp(16)] + + MDBoxLayout: + orientation: "horizontal" + padding: [0,0,dp(24),0] + size_hint_y: None + height: dp(48) + + MDLabel: + text: "Block non-trusted callers" + font_style: "H6" + + MDSwitch: + id: voice_trusted_only + pos_hint: {"center_y": 0.3} + active: False + + MDLabel: + text: "Audio Devices" + font_style: "H6" + padding: [dp(0), dp(96), dp(0), dp(12)] MDLabel: id: voice_settings_info @@ -386,11 +427,12 @@ MDScreen: size_hint_y: None text_size: self.width, None height: self.texture_size[1] - padding: [dp(0), dp(0), dp(0), dp(48)] + padding: [dp(0), dp(64), dp(0), dp(32)] MDLabel: - text: "Output Device" - font_style: "H6" + text: "[b]Output[/b]" + font_size: dp(18) + markup: True MDBoxLayout: id: output_devices @@ -398,7 +440,7 @@ MDScreen: spacing: "12dp" size_hint_y: None height: self.minimum_height - padding: [dp(0), dp(35), dp(0), dp(48)] + padding: [dp(0), dp(24), dp(0), dp(48)] # MDRectangleFlatIconButton: # id: output_default_button @@ -411,8 +453,9 @@ MDScreen: # disabled: False MDLabel: - text: "Input Device" - font_style: "H6" + text: "[b]Input[/b]" + font_size: dp(18) + markup: True MDBoxLayout: id: input_devices @@ -420,11 +463,12 @@ MDScreen: spacing: "12dp" size_hint_y: None height: self.minimum_height - padding: [dp(0), dp(35), dp(0), dp(48)] + padding: [dp(0), dp(24), dp(0), dp(48)] MDLabel: - text: "Ringer Device" - font_style: "H6" + text: "[b]Ringer[/b]" + font_size: dp(18) + markup: True MDBoxLayout: id: ringer_devices @@ -432,6 +476,6 @@ MDScreen: spacing: "12dp" size_hint_y: None height: self.minimum_height - padding: [dp(0), dp(35), dp(0), dp(48)] + padding: [dp(0), dp(24), dp(0), dp(48)] """ \ No newline at end of file