added keyring auth, so we don't have to save credentials in file
This commit is contained in:
@@ -67,6 +67,12 @@
|
|||||||
<p>Updated to newest FreeRDP which seems to fix issues with hanging / freezing</p>
|
<p>Updated to newest FreeRDP which seems to fix issues with hanging / freezing</p>
|
||||||
</description>
|
</description>
|
||||||
</release>
|
</release>
|
||||||
|
<release version="1.3.0" date="2025-02-19">
|
||||||
|
<url type="details">https://gitea.farmdash.org/angoosh/Flatpaks/src/tag/1.3.0</url>
|
||||||
|
<description>
|
||||||
|
<p>Changed pasword storage from file to system keyring. Still using file for compatibility. Also added menu for credential selection.</p>
|
||||||
|
</description>
|
||||||
|
</release>
|
||||||
</releases>
|
</releases>
|
||||||
|
|
||||||
<screenshots>
|
<screenshots>
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ finish-args:
|
|||||||
- --filesystem=xdg-download
|
- --filesystem=xdg-download
|
||||||
- --socket=pcsc
|
- --socket=pcsc
|
||||||
# - --socket=system-bus
|
# - --socket=system-bus
|
||||||
|
- --socket=session-bus
|
||||||
# - --talk-name=org.freedesktop.Flatpak
|
# - --talk-name=org.freedesktop.Flatpak
|
||||||
|
|
||||||
add-build-extensions:
|
add-build-extensions:
|
||||||
@@ -68,7 +69,7 @@ modules:
|
|||||||
build-args:
|
build-args:
|
||||||
- --share=network
|
- --share=network
|
||||||
build-commands:
|
build-commands:
|
||||||
- pip3 install PyGObject cryptography
|
- pip3 install PyGObject cryptography keyring
|
||||||
|
|
||||||
- name: rdpconnect
|
- name: rdpconnect
|
||||||
buildsystem: simple
|
buildsystem: simple
|
||||||
|
|||||||
@@ -18,13 +18,15 @@ from cryptography.fernet import Fernet
|
|||||||
gi.require_version('Gtk', '4.0')
|
gi.require_version('Gtk', '4.0')
|
||||||
gi.require_version('Adw', '1')
|
gi.require_version('Adw', '1')
|
||||||
from gi.repository import Gtk, Adw, Gdk, Gio
|
from gi.repository import Gtk, Adw, Gdk, Gio
|
||||||
|
import keyring
|
||||||
|
|
||||||
APPID = "com.angoosh.RDPConnect"
|
APPID = "com.angoosh.RDPConnect"
|
||||||
HOMEDIR = os.path.expanduser('~')
|
HOMEDIR = os.path.expanduser('~')
|
||||||
|
|
||||||
VERSION = "1.2.0"
|
VERSION = "1.3.0"
|
||||||
|
|
||||||
conn_info = {}
|
conn_info = {}
|
||||||
|
hist_info = {}
|
||||||
settings = {}
|
settings = {}
|
||||||
settings["extra_params"] = {}
|
settings["extra_params"] = {}
|
||||||
fernet = ""
|
fernet = ""
|
||||||
@@ -32,7 +34,7 @@ fernet = ""
|
|||||||
def load_keys():
|
def load_keys():
|
||||||
global fernet
|
global fernet
|
||||||
cryptoKey = ""
|
cryptoKey = ""
|
||||||
try:
|
try:
|
||||||
with open(HOMEDIR+"/.config/rdpconnect/.key", "r") as keyfile:
|
with open(HOMEDIR+"/.config/rdpconnect/.key", "r") as keyfile:
|
||||||
cryptoKey = str.encode(keyfile.readline())
|
cryptoKey = str.encode(keyfile.readline())
|
||||||
print("Encription key loaded")
|
print("Encription key loaded")
|
||||||
@@ -48,15 +50,27 @@ def load_config():
|
|||||||
global conn_info, settings
|
global conn_info, settings
|
||||||
loaded_json = ""
|
loaded_json = ""
|
||||||
try:
|
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:
|
for line in connection_file:
|
||||||
loaded_json += line
|
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:
|
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 = ""
|
loaded_json = ""
|
||||||
try:
|
try:
|
||||||
@@ -72,10 +86,10 @@ class PreferencesWindow(Gtk.Window):
|
|||||||
global settings
|
global settings
|
||||||
def __init__(self, **kwargs):
|
def __init__(self, **kwargs):
|
||||||
super().__init__(**kwargs)
|
super().__init__(**kwargs)
|
||||||
|
|
||||||
self.builder = Gtk.Builder(self)
|
self.builder = Gtk.Builder(self)
|
||||||
self.builder.add_from_file("/app/preferences.ui")
|
self.builder.add_from_file("/app/preferences.ui")
|
||||||
|
|
||||||
self.resx = self.builder.get_object("resx")
|
self.resx = self.builder.get_object("resx")
|
||||||
self.resy = self.builder.get_object("resy")
|
self.resy = self.builder.get_object("resy")
|
||||||
self.monitors = self.builder.get_object("monitors")
|
self.monitors = self.builder.get_object("monitors")
|
||||||
@@ -85,7 +99,7 @@ class PreferencesWindow(Gtk.Window):
|
|||||||
self.mic = self.builder.get_object("mic")
|
self.mic = self.builder.get_object("mic")
|
||||||
self.dynres = self.builder.get_object("dynres")
|
self.dynres = self.builder.get_object("dynres")
|
||||||
self.clipboard = self.builder.get_object("clipboard")
|
self.clipboard = self.builder.get_object("clipboard")
|
||||||
|
|
||||||
try:
|
try:
|
||||||
self.clipboard.set_state(settings["extra_params"]["clipboard"])
|
self.clipboard.set_state(settings["extra_params"]["clipboard"])
|
||||||
self.clipboard.set_active(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"]))
|
self.resy.get_buffer().set_text(str(settings["extra_params"]["h"]), len(settings["extra_params"]["h"]))
|
||||||
except:
|
except:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
pref_window = self.builder.get_object("pref_window")
|
pref_window = self.builder.get_object("pref_window")
|
||||||
pref_window.show()
|
pref_window.show()
|
||||||
|
|
||||||
def f_resx(self, app):
|
def f_resx(self, app):
|
||||||
settings["extra_params"]["w"] = self.resx.get_buffer().get_text()
|
settings["extra_params"]["w"] = self.resx.get_buffer().get_text()
|
||||||
|
|
||||||
def f_resy(self, app):
|
def f_resy(self, app):
|
||||||
settings["extra_params"]["h"] = self.resy.get_buffer().get_text()
|
settings["extra_params"]["h"] = self.resy.get_buffer().get_text()
|
||||||
|
|
||||||
def monconf(self, app):
|
def monconf(self, app):
|
||||||
settings["extra_params"]["monitors"] = self.monitors.get_buffer().get_text()
|
settings["extra_params"]["monitors"] = self.monitors.get_buffer().get_text()
|
||||||
|
|
||||||
def clipboard(self, app, state):
|
def clipboard(self, app, state):
|
||||||
if state:
|
if state:
|
||||||
settings["extra_params"]["clipboard"] = True
|
settings["extra_params"]["clipboard"] = True
|
||||||
else:
|
else:
|
||||||
settings["extra_params"]["clipboard"] = False
|
settings["extra_params"]["clipboard"] = False
|
||||||
|
|
||||||
def dynres(self, app, state):
|
def dynres(self, app, state):
|
||||||
if state:
|
if state:
|
||||||
settings["extra_params"]["dynamic-resolution"] = True
|
settings["extra_params"]["dynamic-resolution"] = True
|
||||||
else:
|
else:
|
||||||
settings["extra_params"]["dynamic-resolution"] = False
|
settings["extra_params"]["dynamic-resolution"] = False
|
||||||
|
|
||||||
def microphone(self, app, state):
|
def microphone(self, app, state):
|
||||||
if state:
|
if state:
|
||||||
settings["extra_params"]["microphone"] = True
|
settings["extra_params"]["microphone"] = True
|
||||||
else:
|
else:
|
||||||
settings["extra_params"]["microphone"] = False
|
settings["extra_params"]["microphone"] = False
|
||||||
|
|
||||||
def sound(self, app, state):
|
def sound(self, app, state):
|
||||||
if state:
|
if state:
|
||||||
settings["extra_params"]["sound"] = True
|
settings["extra_params"]["sound"] = True
|
||||||
else:
|
else:
|
||||||
settings["extra_params"]["sound"] = False
|
settings["extra_params"]["sound"] = False
|
||||||
|
|
||||||
def xfree(self, app, state):
|
def xfree(self, app, state):
|
||||||
if state:
|
if state:
|
||||||
settings["rdp_bin"] = "xfreerdp"
|
settings["rdp_bin"] = "xfreerdp"
|
||||||
else:
|
else:
|
||||||
settings["rdp_bin"] = "sdl-freerdp"
|
settings["rdp_bin"] = "sdl-freerdp"
|
||||||
|
|
||||||
def fscr(self, app, state):
|
def fscr(self, app, state):
|
||||||
if state:
|
if state:
|
||||||
settings["extra_params"]["f"] = True
|
settings["extra_params"]["f"] = True
|
||||||
else:
|
else:
|
||||||
settings["extra_params"]["f"] = False
|
settings["extra_params"]["f"] = False
|
||||||
|
|
||||||
def on_destroy(self, app):
|
def on_destroy(self, app):
|
||||||
print("Saving settings config to "+HOMEDIR+"/.config/rdpconnect/settings.json")
|
print("Saving settings config to "+HOMEDIR+"/.config/rdpconnect/settings.json")
|
||||||
with open(HOMEDIR+"/.config/rdpconnect/settings.json", "w") as settings_file:
|
with open(HOMEDIR+"/.config/rdpconnect/settings.json", "w") as settings_file:
|
||||||
js = json.dumps(settings, sort_keys=True, indent=4, separators=(',', ': '))
|
js = json.dumps(settings, sort_keys=True, indent=4, separators=(',', ': '))
|
||||||
settings_file.write(js)
|
settings_file.write(js)
|
||||||
|
|
||||||
|
|
||||||
class MyApp(Adw.Application):
|
class MyApp(Adw.Application):
|
||||||
def __init__(self, **kwargs):
|
def __init__(self, **kwargs):
|
||||||
super().__init__(**kwargs)
|
super().__init__(**kwargs)
|
||||||
@@ -261,14 +275,23 @@ class MyApp(Adw.Application):
|
|||||||
def saveConnConf(self):
|
def saveConnConf(self):
|
||||||
if settings["save_conn"]:
|
if settings["save_conn"]:
|
||||||
password = conn_info["passwd"]
|
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")
|
print("Saving connection config to "+HOMEDIR+"/.config/rdpconnect/connection.json")
|
||||||
with open(HOMEDIR+"/.config/rdpconnect/connection.json", "w") as connection_file:
|
with open(HOMEDIR+"/.config/rdpconnect/connection.json", "w") as connection_file:
|
||||||
js = json.dumps(conn_info, sort_keys=True, indent=4, separators=(',', ': '))
|
js = json.dumps(conn_info, sort_keys=True, indent=4, separators=(',', ': '))
|
||||||
connection_file.write(js)
|
connection_file.write(js)
|
||||||
|
|
||||||
conn_info["passwd"] = password
|
conn_info["passwd"] = password
|
||||||
else:
|
else:
|
||||||
with open(HOMEDIR+"/.config/rdpconnect/connection.json", "w") as connection_file:
|
with open(HOMEDIR+"/.config/rdpconnect/connection.json", "w") as connection_file:
|
||||||
connection_file.write("")
|
connection_file.write("")
|
||||||
@@ -291,7 +314,7 @@ class MyApp(Adw.Application):
|
|||||||
settings["rdp_bin"] = "sdl-freerdp"
|
settings["rdp_bin"] = "sdl-freerdp"
|
||||||
|
|
||||||
self.saveConnConf()
|
self.saveConnConf()
|
||||||
|
|
||||||
extra_params = []
|
extra_params = []
|
||||||
for item in settings["extra_params"]:
|
for item in settings["extra_params"]:
|
||||||
#check if is boolean
|
#check if is boolean
|
||||||
@@ -302,7 +325,7 @@ class MyApp(Adw.Application):
|
|||||||
if str(settings["extra_params"][item]) != "":
|
if str(settings["extra_params"][item]) != "":
|
||||||
print(str(settings["extra_params"][item]))
|
print(str(settings["extra_params"][item]))
|
||||||
extra_params.append("/"+str(item)+":"+str(settings["extra_params"][item]))
|
extra_params.append("/"+str(item)+":"+str(settings["extra_params"][item]))
|
||||||
|
|
||||||
print(extra_params)
|
print(extra_params)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
|
|||||||
Reference in New Issue
Block a user