Implement x11, mac, windows autotype

This commit is contained in:
Bernd Schoolmann 2024-05-03 23:37:18 +02:00
parent 1133553022
commit 77eec0bc41
No known key found for this signature in database
5 changed files with 132 additions and 107 deletions

View File

@ -6,6 +6,7 @@ import gc
import time import time
from gi.repository import Gtk, Adw, GLib, Notify, Gdk from gi.repository import Gtk, Adw, GLib, Notify, Gdk
from ..services import goldwarden from ..services import goldwarden
from ..services.autotype import autotype
from threading import Thread from threading import Thread
from .resource_loader import load_template from .resource_loader import load_template
import sys import sys
@ -71,19 +72,19 @@ class GoldwardenQuickAccessApp(Adw.Application):
# totp code # totp code
if keyval == Gdk.KEY_t or keyval == Gdk.KEY_T: if keyval == Gdk.KEY_t or keyval == Gdk.KEY_T:
if auto_type_combo: if auto_type_combo:
self.autotype(totp.totp(self.filtered_logins[self.selected_index]["totp"])) self.run_autotype(totp.totp(self.filtered_logins[self.selected_index]["totp"]))
if copy_combo: if copy_combo:
self.set_clipboard(totp.totp(self.filtered_logins[self.selected_index]["totp"])) self.set_clipboard(totp.totp(self.filtered_logins[self.selected_index]["totp"]))
if keyval == Gdk.KEY_u or keyval == Gdk.KEY_U: if keyval == Gdk.KEY_u or keyval == Gdk.KEY_U:
if auto_type_combo: if auto_type_combo:
self.autotype(self.filtered_logins[self.selected_index]["username"]) self.run_autotype(self.filtered_logins[self.selected_index]["username"])
if copy_combo: if copy_combo:
self.set_clipboard(self.filtered_logins[self.selected_index]["username"]) self.set_clipboard(self.filtered_logins[self.selected_index]["username"])
if keyval == Gdk.KEY_p or keyval == Gdk.KEY_P: if keyval == Gdk.KEY_p or keyval == Gdk.KEY_P:
if auto_type_combo: if auto_type_combo:
self.autotype(self.filtered_logins[self.selected_index]["password"]) self.run_autotype(self.filtered_logins[self.selected_index]["password"])
if copy_combo: if copy_combo:
self.set_clipboard(self.filtered_logins[self.selected_index]["password"]) self.set_clipboard(self.filtered_logins[self.selected_index]["password"])
@ -100,18 +101,18 @@ class GoldwardenQuickAccessApp(Adw.Application):
if keyval == Gdk.KEY_Return: if keyval == Gdk.KEY_Return:
if auto_type_combo: if auto_type_combo:
self.autotype(f"{self.filtered_logins[self.selected_index]['username']}\t{self.filtered_logins[self.selected_index]['password']}") self.run_autotype(f"{self.filtered_logins[self.selected_index]['username']}\t{self.filtered_logins[self.selected_index]['password']}")
def update(self): def update(self):
self.update_list() self.update_list()
self.render_list() self.render_list()
return True return True
def autotype(self, text): def run_autotype(self, text):
def perform_autotype(text): def perform_autotype(text):
self.window.hide() self.window.hide()
time.sleep(0.1) time.sleep(0.1)
goldwarden.autotype(text) autotype.autotype(text)
time.sleep(0.1) time.sleep(0.1)
os._exit(0) os._exit(0)
thread = Thread(target=perform_autotype, args=(text,)) thread = Thread(target=perform_autotype, args=(text,))

View File

@ -1,101 +0,0 @@
# TODO??!?!? for now using golang implementation
import dbus
import dbus.mainloop.glib
from dbus.mainloop.glib import DBusGMainLoop
from gi.repository import GLib
import random
import time
step = 0
def typestring(text):
step = 0
handle = ""
def handler(*args, **kwargs):
global step
if step == 0:
handle_xdp_session_created(*args, **kwargs)
elif step == 1:
handle_xdp_devices_selected(*args, **kwargs)
elif step == 2:
handle_session_start(*args, **kwargs)
else:
print(args, kwargs)
step += 1
def handle_session_start(code, results, object_path):
global handle
if code != 0:
raise Exception("Could not start session")
for sym in text:
if sym == "\t":
inter.NotifyKeyboardKeycode(handle, {}, 15, 1)
time.sleep(0.001)
inter.NotifyKeyboardKeycode(handle, {}, 15, 0)
time.sleep(0.001)
else:
inter.NotifyKeyboardKeysym(handle, {}, ord(sym), 1)
time.sleep(0.001)
inter.NotifyKeyboardKeysym(handle, {}, ord(sym), 0)
time.sleep(0.001)
bus
def handle_xdp_devices_selected(code, results, object_path):
global handle
if code != 0:
raise Exception("Could not select devices")
start_options = {
"handle_token": "krfb" + str(random.randint(0, 999999999))
}
reply = inter.Start(handle, "", start_options)
print(reply)
def handle_xdp_session_created(code, results, object_path):
global handle
if code != 0:
raise Exception("Could not create session")
print(results)
handle = results["session_handle"]
# select sources for the session
selection_options = {
"types": dbus.UInt32(7), # request all (KeyBoard, Pointer, TouchScreen)
"handle_token": "krfb" + str(random.randint(0, 999999999))
}
selector_reply = inter.SelectDevices(handle, selection_options)
print(selector_reply)
def main():
global bus
global inter
loop = GLib.MainLoop()
dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
bus = dbus.SessionBus()
obj = bus.get_object("org.freedesktop.portal.Desktop", "/org/freedesktop/portal/desktop")
inter = dbus.Interface(obj, "org.freedesktop.portal.RemoteDesktop")
bus.add_signal_receiver(
handler,
signal_name="Response",
dbus_interface="org.freedesktop.portal.Request",
bus_name="org.freedesktop.portal.Desktop",
path_keyword="object_path")
print(inter)
result = inter.CreateSession({
"session_handle_token": "sessionhandletoken"
})
print(result)
loop.run()
main()

View File

@ -0,0 +1,14 @@
import sys
import os
is_linux = sys.platform == 'linux'
is_wayland = os.environ.get('XDG_SESSION_TYPE') == 'wayland'
def autotype(text):
print("autotypeing, is_linux: {}, is_wayland: {}".format(is_linux, is_wayland))
if is_linux and is_wayland:
from .libportal_autotype import autotype_libportal
autotype_libportal(text)
from .pyautogui_autotype import autotype_pyautogui
autotype_pyautogui(text)

View File

@ -0,0 +1,106 @@
# TODO??!?!? for now using golang implementation
from ..goldwarden import autotype
def libportal_autotype(text):
print("autotypeing with libportal")
goldwarden.autotype(text)
# import dbus
# import dbus.mainloop.glib
# from dbus.mainloop.glib import DBusGMainLoop
# from gi.repository import GLib
# import random
# import time
# step = 0
# def typestring(text):
# step = 0
# handle = ""
# def handler(*args, **kwargs):
# global step
# if step == 0:
# handle_xdp_session_created(*args, **kwargs)
# elif step == 1:
# handle_xdp_devices_selected(*args, **kwargs)
# elif step == 2:
# handle_session_start(*args, **kwargs)
# else:
# print(args, kwargs)
# step += 1
# def handle_session_start(code, results, object_path):
# global handle
# if code != 0:
# raise Exception("Could not start session")
# for sym in text:
# if sym == "\t":
# inter.NotifyKeyboardKeycode(handle, {}, 15, 1)
# time.sleep(0.001)
# inter.NotifyKeyboardKeycode(handle, {}, 15, 0)
# time.sleep(0.001)
# else:
# inter.NotifyKeyboardKeysym(handle, {}, ord(sym), 1)
# time.sleep(0.001)
# inter.NotifyKeyboardKeysym(handle, {}, ord(sym), 0)
# time.sleep(0.001)
# bus
# def handle_xdp_devices_selected(code, results, object_path):
# global handle
# if code != 0:
# raise Exception("Could not select devices")
# start_options = {
# "handle_token": "krfb" + str(random.randint(0, 999999999))
# }
# reply = inter.Start(handle, "", start_options)
# print(reply)
# def handle_xdp_session_created(code, results, object_path):
# global handle
# if code != 0:
# raise Exception("Could not create session")
# print(results)
# handle = results["session_handle"]
# # select sources for the session
# selection_options = {
# "types": dbus.UInt32(7), # request all (KeyBoard, Pointer, TouchScreen)
# "handle_token": "krfb" + str(random.randint(0, 999999999))
# }
# selector_reply = inter.SelectDevices(handle, selection_options)
# print(selector_reply)
# def main():
# global bus
# global inter
# loop = GLib.MainLoop()
# dbus.mainloop.glib.DBusGMainLoop(set_as_default=True)
# bus = dbus.SessionBus()
# obj = bus.get_object("org.freedesktop.portal.Desktop", "/org/freedesktop/portal/desktop")
# inter = dbus.Interface(obj, "org.freedesktop.portal.RemoteDesktop")
# bus.add_signal_receiver(
# handler,
# signal_name="Response",
# dbus_interface="org.freedesktop.portal.Request",
# bus_name="org.freedesktop.portal.Desktop",
# path_keyword="object_path")
# print(inter)
# result = inter.CreateSession({
# "session_handle_token": "sessionhandletoken"
# })
# print(result)
# loop.run()
# main()

View File

@ -0,0 +1,5 @@
import pyautogui
def autotype_pyautogui(text):
print("autotypeing with pyautogui")
pyautogui.write(text, interval=0.02)