diff --git a/ui/src/linux/autotype/autotype.py b/ui/src/linux/autotype/libportal_autotype.py similarity index 100% rename from ui/src/linux/autotype/autotype.py rename to ui/src/linux/autotype/libportal_autotype.py diff --git a/ui/src/linux/main.py b/ui/src/linux/main.py index 0e92bab..29858ad 100644 --- a/ui/src/linux/main.py +++ b/ui/src/linux/main.py @@ -13,10 +13,10 @@ import time import os root_path = os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(__file__)), os.pardir, os.pardir)) +is_flatpak = os.path.exists("/.flatpak-info") def main(): token = secrets.token_hex(32) - print("token", token) if not os.environ.get("GOLDWARDEN_DAEMON_AUTH_TOKEN") == None: token = os.environ["GOLDWARDEN_DAEMON_AUTH_TOKEN"] @@ -33,27 +33,20 @@ def main(): exit() # start daemons - dbus_autofill_monitor.run_daemon() # todo: remove after migration + dbus_autofill_monitor.run_daemon(token) # todo: remove after migration dbus_monitor.run_daemon(token) if not "--hidden" in sys.argv: - subprocess.Popen(["python3", "-m", "src.ui.settings"], cwd=root_path, start_new_session=True) + p = subprocess.Popen(["python3", "-m", "src.ui.settings"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, cwd=root_path, start_new_session=True) + p.stdin.write(f"{token}\n".encode()) + p.stdin.flush() - # try: - # subprocess.Popen(["python3", f'{source_path}/background.py'], start_new_session=True) - # except Exception as e: - # pass + if is_flatpak: + # to autostart the appes + try: + subprocess.Popen(["python3", f'{source_path}/background.py'], start_new_session=True) + except Exception as e: + pass while True: time.sleep(60) - - -# def run_daemon(): -# # todo: do a proper check -# if is_hidden: -# time.sleep(20) -# print("IS daemon running", goldwarden.is_daemon_running()) -# if not goldwarden.is_daemon_running(): -# print("running daemon") -# goldwarden.run_daemon() -# print("daemon running") diff --git a/ui/src/linux/monitors/dbus_autofill_monitor.py b/ui/src/linux/monitors/dbus_autofill_monitor.py index 1090074..4311cbb 100644 --- a/ui/src/linux/monitors/dbus_autofill_monitor.py +++ b/ui/src/linux/monitors/dbus_autofill_monitor.py @@ -7,7 +7,7 @@ import dbus.service from dbus.mainloop.glib import DBusGMainLoop from threading import Thread -on_autofill = lambda: None +daemon_token = None class GoldwardenDBUSService(dbus.service.Object): def __init__(self): @@ -16,7 +16,9 @@ class GoldwardenDBUSService(dbus.service.Object): @dbus.service.method('com.quexten.Goldwarden.Autofill') def autofill(self): - on_autofill() + p = subprocess.Popen(["python3", "-m", "src.ui.quickaccess"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, cwd=root_path, start_new_session=True) + p.stdin.write(f"{daemon_token}\n".encode()) + p.stdin.flush() return "" def daemon(): @@ -25,7 +27,9 @@ def daemon(): from gi.repository import GLib, GObject as gobject gobject.MainLoop().run() -def run_daemon(): +def run_daemon(token): + global daemon_token + daemon_token = token thread = Thread(target=daemon) thread.start() \ No newline at end of file diff --git a/ui/src/linux/monitors/dbus_monitor.py b/ui/src/linux/monitors/dbus_monitor.py index 0af5791..e70ecda 100644 --- a/ui/src/linux/monitors/dbus_monitor.py +++ b/ui/src/linux/monitors/dbus_monitor.py @@ -17,15 +17,15 @@ class GoldwardenDBUSService(dbus.service.Object): @dbus.service.method('com.quexten.Goldwarden.ui.QuickAccess') def quickaccess(self): p = subprocess.Popen(["python3", "-m", "src.ui.quickaccess"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, cwd=root_path, start_new_session=True) - print("writing token") p.stdin.write(f"{daemon_token}\n".encode()) p.stdin.flush() - print("reading token") return "" @dbus.service.method('com.quexten.Goldwarden.ui.Settings') def settings(self): - subprocess.Popen(["python3", "-m", "src.ui.settings"], cwd=root_path, start_new_session=True) + subprocess.Popen(["python3", "-m", "src.ui.settings"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, cwd=root_path, start_new_session=True) + p.stdin.write(f"{daemon_token}\n".encode()) + p.stdin.flush() return "" def daemon(): diff --git a/ui/src/services/goldwarden.py b/ui/src/services/goldwarden.py index c217118..5c4728b 100644 --- a/ui/src/services/goldwarden.py +++ b/ui/src/services/goldwarden.py @@ -9,10 +9,12 @@ BINARY_PATHS = [ str(Path.home()) + "/go/src/github.com/quexten/goldwarden/goldwarden" ] +BINARY_PATH = "" authenticated_connection = None def create_authenticated_connection(token): global authenticated_connection + global BINARY_PATH BINARY_PATH = None for path in BINARY_PATHS: if os.path.exists(path): @@ -123,16 +125,16 @@ def get_runtime_config(): except Exception as e: return None -# def autotype(username, password): -# # environment -# env = os.environ.copy() -# env["PASSWORD"] = password -# restic_cmd = f"{BINARY_PATH} autotype --username {username}" -# result = subprocess.run(restic_cmd.split(), capture_output=True, text=True, env=env) -# print(result.stderr) -# print(result.stdout) -# if result.returncode != 0: -# raise Exception("Failed to initialize repository, err", result.stderr) +def autotype(username, password): + env = os.environ.copy() + # todo convert to stdin + env["PASSWORD"] = password + goldwarden_cmd = f"{BINARY_PATH} autotype --username {username}" + result = subprocess.run(goldwarden_cmd.split(), capture_output=True, text=True, env=env) + print(result.stderr) + print(result.stdout) + if result.returncode != 0: + raise Exception("Failed to initialize repository, err", result.stderr) def is_daemon_running(): result = send_authenticated_command(f"vault status") diff --git a/ui/src/ui/quickaccess.py b/ui/src/ui/quickaccess.py index a5be6b7..2163349 100644 --- a/ui/src/ui/quickaccess.py +++ b/ui/src/ui/quickaccess.py @@ -20,15 +20,20 @@ class MyApp(Adw.Application): super().__init__(**kwargs) self.connect('activate', self.on_activate) - def on_activate(self, app): - self.autofill_window = MainWindow(application=app) - self.autofill_window.logins = [] - self.autofill_window.present() + def update_logins(self): logins = goldwarden.get_vault_logins() if logins == None: os._exit(0) return - app.autofill_window.logins = logins + self.app.autofill_window.logins = logins + + def on_activate(self, app): + self.autofill_window = MainWindow(application=app) + self.autofill_window.logins = [] + self.autofill_window.present() + self.app = app + thread = Thread(target=self.update_logins) + thread.start() class MainWindow(Gtk.ApplicationWindow): def __init__(self, *args, **kwargs): diff --git a/ui/src/ui/settings.py b/ui/src/ui/settings.py index 563460f..d5c3e49 100644 --- a/ui/src/ui/settings.py +++ b/ui/src/ui/settings.py @@ -12,6 +12,8 @@ import subprocess from . import components import os +root_path = os.path.abspath(os.path.join(os.path.dirname(os.path.abspath(__file__)), os.pardir, os.pardir)) +token = sys.stdin.readline() goldwarden.create_authenticated_connection(None) class SettingsWinvdow(Gtk.ApplicationWindow): @@ -48,7 +50,11 @@ class SettingsWinvdow(Gtk.ApplicationWindow): self.autotype_button = Gtk.Button() self.autotype_button.set_label("Quick Access") self.autotype_button.set_margin_top(10) - self.autotype_button.connect("clicked", lambda button: subprocess.Popen(["python3", "/app/bin/autofill.py"], start_new_session=True)) + def quickaccess_button_clicked(): + p = subprocess.Popen(["python3", "-m", "src.ui.quickaccess"], stdin=subprocess.PIPE, stdout=subprocess.PIPE, cwd=root_path, start_new_session=True) + p.stdin.write(f"{token}\n".encode()) + p.stdin.flush() + self.autotype_button.connect("clicked", lambda button: quickaccess_button_clicked()) self.autotype_button.get_style_context().add_class("suggested-action") self.action_preferences_group.add(self.autotype_button)