glanced 0.3.2__tar.gz → 0.3.4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. {glanced-0.3.2/src/glanced.egg-info → glanced-0.3.4}/PKG-INFO +8 -2
  2. {glanced-0.3.2 → glanced-0.3.4}/README.md +7 -1
  3. {glanced-0.3.2 → glanced-0.3.4}/pyproject.toml +8 -1
  4. glanced-0.3.4/src/glanced/_data/hooks/repair-glance-lock.hook +51 -0
  5. glanced-0.3.4/src/glanced/_data/lock-faceid/FaceUnlockIndicator.qml +630 -0
  6. glanced-0.3.4/src/glanced/_data/lock-faceid/LockView.qml +230 -0
  7. glanced-0.3.4/src/glanced/_data/lock-faceid/README.md +167 -0
  8. glanced-0.3.4/src/glanced/_data/lock-faceid/Service.qml +780 -0
  9. glanced-0.3.4/src/glanced/_data/lock-faceid/apply.sh +20 -0
  10. glanced-0.3.4/src/glanced/_data/lock-faceid/lockview.diff +27 -0
  11. glanced-0.3.4/src/glanced/_data/lock-faceid/revert.sh +9 -0
  12. glanced-0.3.4/src/glanced/_data/lock-faceid/service.diff +315 -0
  13. glanced-0.3.4/src/glanced/_data/lock-faceid/unlock-spin.png +0 -0
  14. glanced-0.3.4/src/glanced/_data/pam/Makefile +21 -0
  15. glanced-0.3.4/src/glanced/_data/pam/pam_glance.c +148 -0
  16. {glanced-0.3.2 → glanced-0.3.4}/src/glanced/cli.py +50 -0
  17. {glanced-0.3.2 → glanced-0.3.4}/src/glanced/locksetup.py +25 -3
  18. {glanced-0.3.2 → glanced-0.3.4}/src/glanced/pamsetup.py +31 -4
  19. {glanced-0.3.2 → glanced-0.3.4/src/glanced.egg-info}/PKG-INFO +8 -2
  20. {glanced-0.3.2 → glanced-0.3.4}/src/glanced.egg-info/SOURCES.txt +13 -0
  21. glanced-0.3.4/tests/test_packaged_data.py +104 -0
  22. {glanced-0.3.2 → glanced-0.3.4}/LICENSE +0 -0
  23. {glanced-0.3.2 → glanced-0.3.4}/NOTICE +0 -0
  24. {glanced-0.3.2 → glanced-0.3.4}/setup.cfg +0 -0
  25. {glanced-0.3.2 → glanced-0.3.4}/src/glanced/__init__.py +0 -0
  26. {glanced-0.3.2 → glanced-0.3.4}/src/glanced/align.py +0 -0
  27. {glanced-0.3.2 → glanced-0.3.4}/src/glanced/attention.py +0 -0
  28. {glanced-0.3.2 → glanced-0.3.4}/src/glanced/camera.py +0 -0
  29. {glanced-0.3.2 → glanced-0.3.4}/src/glanced/daemon.py +0 -0
  30. {glanced-0.3.2 → glanced-0.3.4}/src/glanced/embed.py +0 -0
  31. {glanced-0.3.2 → glanced-0.3.4}/src/glanced/enroll.py +0 -0
  32. {glanced-0.3.2 → glanced-0.3.4}/src/glanced/gui/__init__.py +0 -0
  33. {glanced-0.3.2 → glanced-0.3.4}/src/glanced/gui/enroll_window.py +0 -0
  34. {glanced-0.3.2 → glanced-0.3.4}/src/glanced/gui/passphrase.py +0 -0
  35. {glanced-0.3.2 → glanced-0.3.4}/src/glanced/ipc.py +0 -0
  36. {glanced-0.3.2 → glanced-0.3.4}/src/glanced/landmarker.py +0 -0
  37. {glanced-0.3.2 → glanced-0.3.4}/src/glanced/liveness/__init__.py +0 -0
  38. {glanced-0.3.2 → glanced-0.3.4}/src/glanced/liveness/analyzer.py +0 -0
  39. {glanced-0.3.2 → glanced-0.3.4}/src/glanced/liveness/bezel.py +0 -0
  40. {glanced-0.3.2 → glanced-0.3.4}/src/glanced/liveness/cues.py +0 -0
  41. {glanced-0.3.2 → glanced-0.3.4}/src/glanced/liveness/features.py +0 -0
  42. {glanced-0.3.2 → glanced-0.3.4}/src/glanced/liveness/frame.py +0 -0
  43. {glanced-0.3.2 → glanced-0.3.4}/src/glanced/liveness/geometry.py +0 -0
  44. {glanced-0.3.2 → glanced-0.3.4}/src/glanced/liveness/glare.py +0 -0
  45. {glanced-0.3.2 → glanced-0.3.4}/src/glanced/liveness/planar.py +0 -0
  46. {glanced-0.3.2 → glanced-0.3.4}/src/glanced/liveness/scoring.py +0 -0
  47. {glanced-0.3.2 → glanced-0.3.4}/src/glanced/livetest.py +0 -0
  48. {glanced-0.3.2 → glanced-0.3.4}/src/glanced/models.py +0 -0
  49. {glanced-0.3.2 → glanced-0.3.4}/src/glanced/paths.py +0 -0
  50. {glanced-0.3.2 → glanced-0.3.4}/src/glanced/pipeline.py +0 -0
  51. {glanced-0.3.2 → glanced-0.3.4}/src/glanced/poses.py +0 -0
  52. {glanced-0.3.2 → glanced-0.3.4}/src/glanced/preview.py +0 -0
  53. {glanced-0.3.2 → glanced-0.3.4}/src/glanced/scan.py +0 -0
  54. {glanced-0.3.2 → glanced-0.3.4}/src/glanced/servicesetup.py +0 -0
  55. {glanced-0.3.2 → glanced-0.3.4}/src/glanced/store.py +0 -0
  56. {glanced-0.3.2 → glanced-0.3.4}/src/glanced.egg-info/dependency_links.txt +0 -0
  57. {glanced-0.3.2 → glanced-0.3.4}/src/glanced.egg-info/entry_points.txt +0 -0
  58. {glanced-0.3.2 → glanced-0.3.4}/src/glanced.egg-info/requires.txt +0 -0
  59. {glanced-0.3.2 → glanced-0.3.4}/src/glanced.egg-info/top_level.txt +0 -0
  60. {glanced-0.3.2 → glanced-0.3.4}/tests/test_attention.py +0 -0
  61. {glanced-0.3.2 → glanced-0.3.4}/tests/test_daemon.py +0 -0
  62. {glanced-0.3.2 → glanced-0.3.4}/tests/test_enroll.py +0 -0
  63. {glanced-0.3.2 → glanced-0.3.4}/tests/test_enroll_passphrase.py +0 -0
  64. {glanced-0.3.2 → glanced-0.3.4}/tests/test_enroll_window.py +0 -0
  65. {glanced-0.3.2 → glanced-0.3.4}/tests/test_gui_available.py +0 -0
  66. {glanced-0.3.2 → glanced-0.3.4}/tests/test_liveness.py +0 -0
  67. {glanced-0.3.2 → glanced-0.3.4}/tests/test_locksetup.py +0 -0
  68. {glanced-0.3.2 → glanced-0.3.4}/tests/test_pamsetup.py +0 -0
  69. {glanced-0.3.2 → glanced-0.3.4}/tests/test_passphrase_dialog.py +0 -0
  70. {glanced-0.3.2 → glanced-0.3.4}/tests/test_paths.py +0 -0
  71. {glanced-0.3.2 → glanced-0.3.4}/tests/test_poses.py +0 -0
  72. {glanced-0.3.2 → glanced-0.3.4}/tests/test_preview.py +0 -0
  73. {glanced-0.3.2 → glanced-0.3.4}/tests/test_servicesetup.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: glanced
3
- Version: 0.3.2
3
+ Version: 0.3.4
4
4
  Summary: Face unlock for Linux with real liveness detection
5
5
  License: MIT
6
6
  Requires-Python: >=3.11
@@ -89,10 +89,16 @@ From PyPI. `pipx` keeps the daemon in its own environment and puts
89
89
 
90
90
  ```bash
91
91
  pipx install 'glanced[runtime,gui]'
92
- glancectl install-service # ~16MB of models, the user unit, started
92
+ glancectl setup # models, service, PAM, lock indicator
93
93
  omarchy plugin add https://github.com/ayandexyz/omarchy-glance.git --enable
94
94
  ```
95
95
 
96
+ Then click the bar icon and **Enroll**, and `omarchy-restart-shell` to load the
97
+ indicator. `setup` asks for your password once and does what `install-service`,
98
+ `setup-pam` and `setup-lock` do separately; run those instead if you want to
99
+ watch each one. Enrolling is not part of it: it needs your face in front of the
100
+ camera and a passphrase you choose.
101
+
96
102
  The `gui` extra is PySide6, for the enrollment window: a camera preview that
97
103
  guides the sweep. Leave it out and nothing breaks -- `glancectl status`
98
104
  reports the window as unavailable and the plugin's **Enroll** button runs the
@@ -68,10 +68,16 @@ From PyPI. `pipx` keeps the daemon in its own environment and puts
68
68
 
69
69
  ```bash
70
70
  pipx install 'glanced[runtime,gui]'
71
- glancectl install-service # ~16MB of models, the user unit, started
71
+ glancectl setup # models, service, PAM, lock indicator
72
72
  omarchy plugin add https://github.com/ayandexyz/omarchy-glance.git --enable
73
73
  ```
74
74
 
75
+ Then click the bar icon and **Enroll**, and `omarchy-restart-shell` to load the
76
+ indicator. `setup` asks for your password once and does what `install-service`,
77
+ `setup-pam` and `setup-lock` do separately; run those instead if you want to
78
+ watch each one. Enrolling is not part of it: it needs your face in front of the
79
+ camera and a passphrase you choose.
80
+
75
81
  The `gui` extra is PySide6, for the enrollment window: a camera preview that
76
82
  guides the sweep. Leave it out and nothing breaks -- `glancectl status`
77
83
  reports the window as unavailable and the plugin's **Enroll** button runs the
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "glanced"
7
- version = "0.3.2"
7
+ version = "0.3.4"
8
8
  description = "Face unlock for Linux with real liveness detection"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.11"
@@ -33,5 +33,12 @@ glancectl = "glanced.cli:main"
33
33
  [tool.setuptools.packages.find]
34
34
  where = ["src"]
35
35
 
36
+ # The PAM module's source and the lock-screen patch. They are data, not code,
37
+ # but `setup-pam` and `setup-lock` cannot work without them, and a wheel that
38
+ # leaves them out is a face unlock that stops at the lock screen. Kept in step
39
+ # with the canonical top-level copies by tests/test_packaged_data.py.
40
+ [tool.setuptools.package-data]
41
+ glanced = ["_data/pam/*", "_data/lock-faceid/*", "_data/hooks/*"]
42
+
36
43
  [tool.pytest.ini_options]
37
44
  testpaths = ["tests"]
@@ -0,0 +1,51 @@
1
+ #!/bin/bash
2
+ # Installed by `glancectl setup-lock` via `omarchy hook install post-update`.
3
+ #
4
+ # `omarchy update` overwrites the package-owned lock plugin, and with it the
5
+ # Face ID-style indicator that `patches/omarchy-lock-faceid/apply.sh` put
6
+ # there. This runs at the end of that update, while sudo is still
7
+ # authenticated from its package step, and puts the indicator back.
8
+ #
9
+ # It only executes files from the root-owned copy the glanced package installs
10
+ # under /usr/share/glanced. A warm sudo timestamp must never be spent running
11
+ # whatever is sitting in a user-writable checkout; from a source checkout this
12
+ # hook can only tell you to rerun `glancectl setup-lock` yourself.
13
+ set -u
14
+
15
+ lock="${OMARCHY_PATH:-/usr/share/omarchy}/shell/plugins/lock/Service.qml"
16
+ [[ -f $lock ]] || lock=/usr/share/omarchy/shell/plugins/lock/Service.qml
17
+ [[ -f $lock ]] || exit 0 # no lock plugin here; nothing to repair
18
+
19
+ grep -q 'faceMessagePrefix' "$lock" && exit 0 # still patched
20
+
21
+ patch_dir=/usr/share/glanced/lock-faceid
22
+ notify() {
23
+ echo "glanced: $1"
24
+ command -v notify-send >/dev/null && notify-send -u critical "Glance face unlock" "$1" || true
25
+ }
26
+
27
+ # Root-owned, not writable by anyone else, on every path component we execute.
28
+ trusted() {
29
+ local f
30
+ for f in "$patch_dir" "$patch_dir/apply.sh"; do
31
+ [[ -e $f ]] || return 1
32
+ [[ $(stat -c '%u %a' "$f") =~ ^0\ [0-9]?[0-9][0145][0145]$ ]] || return 1
33
+ done
34
+ }
35
+
36
+ if ! trusted; then
37
+ notify "The lock screen indicator was reverted by the update. Run: glancectl setup-lock"
38
+ exit 0
39
+ fi
40
+
41
+ if ! sudo -n true 2>/dev/null; then
42
+ notify "The lock screen indicator was reverted by the update and sudo is not available here. Run: glancectl setup-lock"
43
+ exit 0
44
+ fi
45
+
46
+ if sudo -n bash "$patch_dir/apply.sh" >/dev/null; then
47
+ echo "glanced: lock screen indicator re-applied after update."
48
+ else
49
+ notify "Re-applying the lock screen indicator failed. Run: glancectl setup-lock"
50
+ fi
51
+ exit 0