From eea479b3dfe115442734f03c7a381f0fb7a448cf Mon Sep 17 00:00:00 2001 From: Angoosh Date: Tue, 16 Sep 2025 13:47:28 +0200 Subject: [PATCH] added keyring auth, so we don't have to save credentials in file --- .../com.angoosh.RDPConnect.metainfo.xml | 6 ++ .../com.angoosh.RDPConnect.yml | 3 +- com.angoosh.RDPConnect/main.py | 81 ++++++++++++------- 3 files changed, 60 insertions(+), 30 deletions(-) diff --git a/com.angoosh.RDPConnect/com.angoosh.RDPConnect.metainfo.xml b/com.angoosh.RDPConnect/com.angoosh.RDPConnect.metainfo.xml index 0012b6b..21d718f 100644 --- a/com.angoosh.RDPConnect/com.angoosh.RDPConnect.metainfo.xml +++ b/com.angoosh.RDPConnect/com.angoosh.RDPConnect.metainfo.xml @@ -67,6 +67,12 @@

Updated to newest FreeRDP which seems to fix issues with hanging / freezing

+ + https://gitea.farmdash.org/angoosh/Flatpaks/src/tag/1.3.0 + +

Changed pasword storage from file to system keyring. Still using file for compatibility. Also added menu for credential selection.

+
+
diff --git a/com.angoosh.RDPConnect/com.angoosh.RDPConnect.yml b/com.angoosh.RDPConnect/com.angoosh.RDPConnect.yml index 48fe765..979a4b3 100644 --- a/com.angoosh.RDPConnect/com.angoosh.RDPConnect.yml +++ b/com.angoosh.RDPConnect/com.angoosh.RDPConnect.yml @@ -31,6 +31,7 @@ finish-args: - --filesystem=xdg-download - --socket=pcsc # - --socket=system-bus + - --socket=session-bus # - --talk-name=org.freedesktop.Flatpak add-build-extensions: @@ -68,7 +69,7 @@ modules: build-args: - --share=network build-commands: - - pip3 install PyGObject cryptography + - pip3 install PyGObject cryptography keyring - name: rdpconnect buildsystem: simple diff --git a/com.angoosh.RDPConnect/main.py b/com.angoosh.RDPConnect/main.py index 708191c..e8765a4 100755 --- a/com.angoosh.RDPConnect/main.py +++ b/com.angoosh.RDPConnect/main.py @@ -18,13 +18,15 @@ from cryptography.fernet import Fernet gi.require_version('Gtk', '4.0') gi.require_version('Adw', '1') from gi.repository import Gtk, Adw, Gdk, Gio +import keyring APPID = "com.angoosh.RDPConnect" HOMEDIR = os.path.expanduser('~') -VERSION = "1.2.0" +VERSION = "1.3.0" conn_info = {} +hist_info = {} settings = {} settings["extra_params"] = {} fernet = "" @@ -32,7 +34,7 @@ fernet = "" def load_keys(): global fernet cryptoKey = "" - try: + try: with open(HOMEDIR+"/.config/rdpconnect/.key", "r") as keyfile: cryptoKey = str.encode(keyfile.readline()) print("Encription key loaded") @@ -48,15 +50,27 @@ def load_config(): global conn_info, settings loaded_json = "" try: - with open(HOMEDIR+"/.config/rdpconnect/connection.json", "r") as connection_file: + with open(HOMEDIR+"/.config/rdpconnect/history.json", "r") as history_file: for line in connection_file: loaded_json += line - conn_info = json.loads(loaded_json) + hist_info = json.loads(loaded_json) + last_conn = conn_info[max(hist_info)] + conn_info["user"] = last_conn.split('@')[0] + conn_info["ip"] = last_conn.split('@')[1] + conn_info["passwd"] = keyring.get_password("rdpconnect", last_conn) - conn_info["passwd"] = fernet.decrypt(str.encode(conn_info["passwd"])).decode() except: - print("[WARN] FILE: "+HOMEDIR+"/.config/rdpconnect/connection.json doesn't exist") + try: + with open(HOMEDIR+"/.config/rdpconnect/connection.json", "r") as connection_file: + for line in connection_file: + loaded_json += line + + conn_info = json.loads(loaded_json) + + conn_info["passwd"] = fernet.decrypt(str.encode(conn_info["passwd"])).decode() + except: + print("[WARN] FILE: "+HOMEDIR+"/.config/rdpconnect/connection.json doesn't exist") loaded_json = "" try: @@ -72,10 +86,10 @@ class PreferencesWindow(Gtk.Window): global settings def __init__(self, **kwargs): super().__init__(**kwargs) - + self.builder = Gtk.Builder(self) self.builder.add_from_file("/app/preferences.ui") - + self.resx = self.builder.get_object("resx") self.resy = self.builder.get_object("resy") self.monitors = self.builder.get_object("monitors") @@ -85,7 +99,7 @@ class PreferencesWindow(Gtk.Window): self.mic = self.builder.get_object("mic") self.dynres = self.builder.get_object("dynres") self.clipboard = self.builder.get_object("clipboard") - + try: self.clipboard.set_state(settings["extra_params"]["clipboard"]) self.clipboard.set_active(settings["extra_params"]["clipboard"]) @@ -129,62 +143,62 @@ class PreferencesWindow(Gtk.Window): self.resy.get_buffer().set_text(str(settings["extra_params"]["h"]), len(settings["extra_params"]["h"])) except: pass - + pref_window = self.builder.get_object("pref_window") pref_window.show() - + def f_resx(self, app): settings["extra_params"]["w"] = self.resx.get_buffer().get_text() - + def f_resy(self, app): settings["extra_params"]["h"] = self.resy.get_buffer().get_text() - + def monconf(self, app): settings["extra_params"]["monitors"] = self.monitors.get_buffer().get_text() - + def clipboard(self, app, state): if state: settings["extra_params"]["clipboard"] = True else: settings["extra_params"]["clipboard"] = False - + def dynres(self, app, state): if state: settings["extra_params"]["dynamic-resolution"] = True else: settings["extra_params"]["dynamic-resolution"] = False - + def microphone(self, app, state): if state: settings["extra_params"]["microphone"] = True else: settings["extra_params"]["microphone"] = False - + def sound(self, app, state): if state: settings["extra_params"]["sound"] = True else: settings["extra_params"]["sound"] = False - + def xfree(self, app, state): if state: settings["rdp_bin"] = "xfreerdp" else: settings["rdp_bin"] = "sdl-freerdp" - + def fscr(self, app, state): if state: settings["extra_params"]["f"] = True else: settings["extra_params"]["f"] = False - + def on_destroy(self, app): print("Saving settings config to "+HOMEDIR+"/.config/rdpconnect/settings.json") with open(HOMEDIR+"/.config/rdpconnect/settings.json", "w") as settings_file: js = json.dumps(settings, sort_keys=True, indent=4, separators=(',', ': ')) settings_file.write(js) - + class MyApp(Adw.Application): def __init__(self, **kwargs): super().__init__(**kwargs) @@ -261,14 +275,23 @@ class MyApp(Adw.Application): def saveConnConf(self): if settings["save_conn"]: password = conn_info["passwd"] - conn_info["passwd"] = fernet.encrypt(password.encode()).decode("utf-8") + useratip = conn_info["user"] + "@" + conn_info["ip"] + with open(HOMEDIR+"/.config/rdpconnect/history.json", "a") as hist_file: + hist_id = str(int(max(hist_info)) + 1) + hist_info[hist_id] = useratip + js = json.dumps(hist_info, sort_keys=True, indent=4, separators=(',', ': ')) + hist_file.write(js) + try: + keyring.set_password("rdpconnect", useratip, password) + except: + conn_info["passwd"] = fernet.encrypt(password.encode()).decode("utf-8") - print("Saving connection config to "+HOMEDIR+"/.config/rdpconnect/connection.json") - with open(HOMEDIR+"/.config/rdpconnect/connection.json", "w") as connection_file: - js = json.dumps(conn_info, sort_keys=True, indent=4, separators=(',', ': ')) - connection_file.write(js) + print("Saving connection config to "+HOMEDIR+"/.config/rdpconnect/connection.json") + with open(HOMEDIR+"/.config/rdpconnect/connection.json", "w") as connection_file: + js = json.dumps(conn_info, sort_keys=True, indent=4, separators=(',', ': ')) + connection_file.write(js) - conn_info["passwd"] = password + conn_info["passwd"] = password else: with open(HOMEDIR+"/.config/rdpconnect/connection.json", "w") as connection_file: connection_file.write("") @@ -291,7 +314,7 @@ class MyApp(Adw.Application): settings["rdp_bin"] = "sdl-freerdp" self.saveConnConf() - + extra_params = [] for item in settings["extra_params"]: #check if is boolean @@ -302,7 +325,7 @@ class MyApp(Adw.Application): if str(settings["extra_params"][item]) != "": print(str(settings["extra_params"][item])) extra_params.append("/"+str(item)+":"+str(settings["extra_params"][item])) - + print(extra_params) try: