diff --git a/Makefile b/Makefile index 0819f69..279f0d4 100644 --- a/Makefile +++ b/Makefile @@ -1,10 +1,10 @@ .PHONY: python_clean_online_fxreader_vpn host_deps: - ./m host_deps + ./m.py host_deps python_lint: - ./m mypy -- -f vscode 2>&1 | less + ./m.py mypy -- -f vscode 2>&1 | less #python_clean_online_fxreader_vpn: # rm -fr \ diff --git a/deps/com.github.aiortc.aiortc b/deps/com.github.aiortc.aiortc index 7552bcd..41fb87d 160000 --- a/deps/com.github.aiortc.aiortc +++ b/deps/com.github.aiortc.aiortc @@ -1 +1 @@ -Subproject commit 7552bcde773823c51c82daa5d9b23ea045df9ec2 +Subproject commit 41fb87dc48ca2b0710e8489fc2de64f1fc82cf15 diff --git a/python/online/fxreader/pr34/commands.py b/python/online/fxreader/pr34/commands.py index 9ec6b05..a2b124e 100644 --- a/python/online/fxreader/pr34/commands.py +++ b/python/online/fxreader/pr34/commands.py @@ -971,23 +971,34 @@ def resilient_vlc(stream=None): pass time.sleep(1.0) -def sway_sock(): - import glob - uid = os.stat(os.environ['HOME']).st_uid - t1 = glob.glob( - os.path.join( - '/run', - 'user', - '%d' % uid, - 'sway-ipc.%d*.sock' % uid, +def sway_sock( + wait: bool = False, +) -> Optional[str]: + while True: + import glob + uid = os.stat(os.environ['HOME']).st_uid + t1 = glob.glob( + os.path.join( + '/run', + 'user', + '%d' % uid, + 'sway-ipc.%d*.sock' % uid, + ) ) - ) - t2 = [ - os.stat(o).st_mtime - for o in t1 - ] - t3 = sorted(enumerate(t1), key=lambda x: t2[x[0]])[-1][0] - return t1[t3] + t2 = [ + os.stat(o).st_mtime + for o in t1 + ] + sorted_entries = sorted(enumerate(t1), key=lambda x: t2[x[0]]) + if len(sorted_entries) > 0: + t3 = sorted_entries[-1][0] + return t1[t3] + else: + if wait: + time.sleep(0.1) + continue + else: + return None def eternal_firefox( tabs=None, @@ -2084,6 +2095,25 @@ def scrap_yt_music(argv: list[str]) -> None: for o in context['workers']: o.join() +def loginctl(argv: list[str]) -> None: + parser = argparse.ArgumentParser() + parser.add_argument( + '--action', + choices=[ + 'lock-session', + ], + ) + + options = parser.parse_args(argv) + + if options.action == 'lock-session': + subprocess.check_call(r''' + loginctl list-sessions -j | jq -r ".[] | select(.uid==$UID) | \ + .session" | loginctl lock-session + ''', shell=True, timeout=1) + else: + raise NotImplementedError + def desktop_services(argv): parser = optparse.OptionParser() parser.add_option( @@ -2606,7 +2636,15 @@ echo 6500 > /sys/bus/platform/devices/applesmc.768/fan1_output; else: pass - os.environ['SWAYSOCK'] = sway_sock() + #logger.info(dict( + # environ=os.environ, + # #session=subprocess.check_output(['loginctl', 'show-session'], timeout=1,), + #)) + + sway_sock_res = sway_sock(True) + + if sway_sock_res: + os.environ['SWAYSOCK'] = sway_sock_res assert all([ env_name in os.environ @@ -2614,7 +2652,8 @@ echo 6500 > /sys/bus/platform/devices/applesmc.768/fan1_output; 'GTK_IM_MODULE', 'XMODIFIERS', 'QT_IM_MODULE', - 'I3SOCK', + #'I3SOCK', + #'XDG_SEAT', 'SWAYSOCK', 'WAYLAND_DISPLAY', ] @@ -2684,7 +2723,8 @@ echo 6500 > /sys/bus/platform/devices/applesmc.768/fan1_output; unlock='echo unlock; pkill --signal SIGINT swaylock; swaymsg "output * dpms on";', unlock2='pkill --signal SIGINT swaylock;', resume='echo resume; swaymsg "output * dpms on";', - before_sleep='echo before_sleep; loginctl lock-session;', + before_sleep='echo before_sleep; commands loginctl lock-session;', + #before_sleep='echo blah;', after_resume='echo after_resume; pkill --signal SIGUSR1 swayidle;', ) self.last_force_idle = None @@ -3886,6 +3926,7 @@ class Command(enum.StrEnum): socat_ssh = 'socat-ssh' gnome_shortcuts = 'gnome-shortcuts' sway_sock = 'sway_sock' + loginctl = 'loginctl' suspend_timer = 'suspend-timer' desktop_services = 'desktop-services' pm_service = 'pm-service' @@ -4027,6 +4068,8 @@ def commands_cli( gnome_shortcuts(args) elif options.command is Command.sway_sock: print(sway_sock()) + elif options.command is Command.loginctl: + loginctl(args) elif options.command is Command.suspend_timer: suspend_timer(args) elif options.command is Command.desktop_services: diff --git a/python/online/fxreader/pr34/commands_typed/crypto.py b/python/online/fxreader/pr34/commands_typed/crypto.py new file mode 100644 index 0000000..68832ef --- /dev/null +++ b/python/online/fxreader/pr34/commands_typed/crypto.py @@ -0,0 +1,45 @@ +from typing import (Literal,) + +class PasswordUtils: + @classmethod + def encrypt( + cls, + key: str, + mode: Literal['bytes', 'base64'], + ) -> tuple[str, str]: + import os + + from cryptography.hazmat.primitives.kdf.scrypt import Scrypt + + salt = os.urandom(16) + + # derive + kdf = Scrypt( + salt=salt, + length=32, + n=2**14, + r=8, + p=1, + ) + + key = kdf.derive(key.encode('utf-8')) + + if mode == 'bytes': + return (salt, key) + elif mode == 'base64': + return ':'.join([ + base64.b64encode(o, width=0).decode('utf-8') + for o in [salt, key,] + ]) + + # # verify + # kdf = Scrypt( + # salt=salt, + # length=32, + # n=2**14, + # r=8, + # p=1, + # ) + # + # kdf.verify(b"my great password", key) + # diff --git a/python/pyproject.toml b/python/pyproject.toml index 003c373..53430da 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -12,7 +12,12 @@ dependencies = [ [project.optional-dependencies] early = [ - 'numpy' + 'numpy', + 'cryptography', +] + +crypto = [ + 'cryptography', ] [tool.online-fxreader-pr34]