basic-password-manager 0.4.2__tar.gz → 0.4.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 (20) hide show
  1. {basic_password_manager-0.4.2 → basic_password_manager-0.4.4}/PKG-INFO +27 -10
  2. {basic_password_manager-0.4.2 → basic_password_manager-0.4.4}/README.md +26 -9
  3. {basic_password_manager-0.4.2 → basic_password_manager-0.4.4}/basic_password_manager.egg-info/PKG-INFO +27 -10
  4. {basic_password_manager-0.4.2 → basic_password_manager-0.4.4}/pw_manager/cli.py +9 -1
  5. {basic_password_manager-0.4.2 → basic_password_manager-0.4.4}/pw_manager/tui.py +49 -3
  6. {basic_password_manager-0.4.2 → basic_password_manager-0.4.4}/pyproject.toml +1 -1
  7. {basic_password_manager-0.4.2 → basic_password_manager-0.4.4}/LICENSE +0 -0
  8. {basic_password_manager-0.4.2 → basic_password_manager-0.4.4}/basic_password_manager.egg-info/SOURCES.txt +0 -0
  9. {basic_password_manager-0.4.2 → basic_password_manager-0.4.4}/basic_password_manager.egg-info/dependency_links.txt +0 -0
  10. {basic_password_manager-0.4.2 → basic_password_manager-0.4.4}/basic_password_manager.egg-info/entry_points.txt +0 -0
  11. {basic_password_manager-0.4.2 → basic_password_manager-0.4.4}/basic_password_manager.egg-info/requires.txt +0 -0
  12. {basic_password_manager-0.4.2 → basic_password_manager-0.4.4}/basic_password_manager.egg-info/top_level.txt +0 -0
  13. {basic_password_manager-0.4.2 → basic_password_manager-0.4.4}/pw_manager/__init__.py +0 -0
  14. {basic_password_manager-0.4.2 → basic_password_manager-0.4.4}/pw_manager/crypto.py +0 -0
  15. {basic_password_manager-0.4.2 → basic_password_manager-0.4.4}/pw_manager/logo.py +0 -0
  16. {basic_password_manager-0.4.2 → basic_password_manager-0.4.4}/pw_manager/mobile.py +0 -0
  17. {basic_password_manager-0.4.2 → basic_password_manager-0.4.4}/pw_manager/vault.py +0 -0
  18. {basic_password_manager-0.4.2 → basic_password_manager-0.4.4}/pw_manager/web/argon2.umd.min.js +0 -0
  19. {basic_password_manager-0.4.2 → basic_password_manager-0.4.4}/pw_manager/web/page.html +0 -0
  20. {basic_password_manager-0.4.2 → basic_password_manager-0.4.4}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: basic-password-manager
3
- Version: 0.4.2
3
+ Version: 0.4.4
4
4
  Summary: The Paladin — a local encrypted password manager that lives in your terminal
5
5
  License-Expression: MIT
6
6
  Project-URL: Repository, https://github.com/Daisentaur/password-manager
@@ -74,8 +74,10 @@ changing the master password all live there, along with others.
74
74
 
75
75
  ![the command palette](assets/palette.gif)
76
76
 
77
- And themes. `t` opens the theme picker; the bundled ones muted-slate (default),
78
- dawn, matrix are lifted with love from
77
+ And themes. `t` opens the theme picker your current one is marked and
78
+ preselected, and arrowing through them previews each live before you commit
79
+ (Enter keeps it, Esc puts back what you had). The bundled ones — muted-slate
80
+ (default), dawn, matrix — are lifted with love from
79
81
  [tuxedo](https://github.com/webstonehq/tuxedo)'s palettes, and all of
80
82
  Textual's built-ins are in there too. Your pick sticks across runs. Even the
81
83
  knight on the unlock screen dresses to match your theme, try it ;)
@@ -138,12 +140,25 @@ install. The page opens in whatever TUI theme you had set when you generated
138
140
  the QR, knight and all (it won't follow later theme changes — scan again for
139
141
  that).
140
142
 
141
- Have your own domain? `paladin mobile --url https://vault.you.dev` serves at
142
- your subdomain instead of a random tunnel, so a bookmark keeps working (the
143
- path rotates every 30 days on its own). It serves on `127.0.0.1:8787` by
144
- default point your reverse proxy or named tunnel there. Set
145
- `PALADIN_MOBILE_URL` (and optionally `PALADIN_MOBILE_PORT`) and plain
146
- `paladin mobile` uses it.
143
+ ### Want it at your own subdomain?
144
+
145
+ By default every session gets a fresh random URL. If you own a domain and
146
+ want the QR to always point at *your* address instead, set one variable:
147
+
148
+ ```bash
149
+ export PALADIN_MOBILE_URL=https://passwords.yourdomain.com # in your ~/.bashrc
150
+ ```
151
+
152
+ and point that subdomain at `127.0.0.1:8787` through whatever you already
153
+ use (reverse proxy, named tunnel — `PALADIN_MOBILE_PORT` changes the port).
154
+ From then on plain `paladin mobile` serves at your subdomain, every time, so
155
+ a phone bookmark keeps working.
156
+
157
+ To be clear about what this does and doesn't change: a session still only
158
+ lives while `paladin mobile` is running — closing it still ends access, and
159
+ the secret path at the end of the URL still expires every 30 days (your
160
+ bookmark needs refreshing then, on purpose). The only difference is that
161
+ every new session opens at *your* address instead of a random one.
147
162
 
148
163
  The one thing crossing the internet is the encrypted blob, which is useless
149
164
  without the master password that never leaves your phone. The tunnel provider
@@ -251,7 +266,9 @@ and restore from a backup.
251
266
  unexpected.
252
267
 
253
268
  **Password prints instead of copying** — no clipboard tool found. Install
254
- one: `sudo apt install wl-clipboard` (Wayland) or `xclip` (X11).
269
+ one: `sudo apt install wl-clipboard` (Wayland) or `xclip` (X11). This is a
270
+ Linux-only situation — macOS (`pbcopy`) and Windows (`clip`) have theirs
271
+ built in and are used automatically.
255
272
 
256
273
  **Unlock feels slow (~1s)** — that's Argon2 doing its job. The delay *is*
257
274
  the brute-force resistance. Per command, not per keystroke.
@@ -58,8 +58,10 @@ changing the master password all live there, along with others.
58
58
 
59
59
  ![the command palette](assets/palette.gif)
60
60
 
61
- And themes. `t` opens the theme picker; the bundled ones muted-slate (default),
62
- dawn, matrix are lifted with love from
61
+ And themes. `t` opens the theme picker your current one is marked and
62
+ preselected, and arrowing through them previews each live before you commit
63
+ (Enter keeps it, Esc puts back what you had). The bundled ones — muted-slate
64
+ (default), dawn, matrix — are lifted with love from
63
65
  [tuxedo](https://github.com/webstonehq/tuxedo)'s palettes, and all of
64
66
  Textual's built-ins are in there too. Your pick sticks across runs. Even the
65
67
  knight on the unlock screen dresses to match your theme, try it ;)
@@ -122,12 +124,25 @@ install. The page opens in whatever TUI theme you had set when you generated
122
124
  the QR, knight and all (it won't follow later theme changes — scan again for
123
125
  that).
124
126
 
125
- Have your own domain? `paladin mobile --url https://vault.you.dev` serves at
126
- your subdomain instead of a random tunnel, so a bookmark keeps working (the
127
- path rotates every 30 days on its own). It serves on `127.0.0.1:8787` by
128
- default point your reverse proxy or named tunnel there. Set
129
- `PALADIN_MOBILE_URL` (and optionally `PALADIN_MOBILE_PORT`) and plain
130
- `paladin mobile` uses it.
127
+ ### Want it at your own subdomain?
128
+
129
+ By default every session gets a fresh random URL. If you own a domain and
130
+ want the QR to always point at *your* address instead, set one variable:
131
+
132
+ ```bash
133
+ export PALADIN_MOBILE_URL=https://passwords.yourdomain.com # in your ~/.bashrc
134
+ ```
135
+
136
+ and point that subdomain at `127.0.0.1:8787` through whatever you already
137
+ use (reverse proxy, named tunnel — `PALADIN_MOBILE_PORT` changes the port).
138
+ From then on plain `paladin mobile` serves at your subdomain, every time, so
139
+ a phone bookmark keeps working.
140
+
141
+ To be clear about what this does and doesn't change: a session still only
142
+ lives while `paladin mobile` is running — closing it still ends access, and
143
+ the secret path at the end of the URL still expires every 30 days (your
144
+ bookmark needs refreshing then, on purpose). The only difference is that
145
+ every new session opens at *your* address instead of a random one.
131
146
 
132
147
  The one thing crossing the internet is the encrypted blob, which is useless
133
148
  without the master password that never leaves your phone. The tunnel provider
@@ -235,7 +250,9 @@ and restore from a backup.
235
250
  unexpected.
236
251
 
237
252
  **Password prints instead of copying** — no clipboard tool found. Install
238
- one: `sudo apt install wl-clipboard` (Wayland) or `xclip` (X11).
253
+ one: `sudo apt install wl-clipboard` (Wayland) or `xclip` (X11). This is a
254
+ Linux-only situation — macOS (`pbcopy`) and Windows (`clip`) have theirs
255
+ built in and are used automatically.
239
256
 
240
257
  **Unlock feels slow (~1s)** — that's Argon2 doing its job. The delay *is*
241
258
  the brute-force resistance. Per command, not per keystroke.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: basic-password-manager
3
- Version: 0.4.2
3
+ Version: 0.4.4
4
4
  Summary: The Paladin — a local encrypted password manager that lives in your terminal
5
5
  License-Expression: MIT
6
6
  Project-URL: Repository, https://github.com/Daisentaur/password-manager
@@ -74,8 +74,10 @@ changing the master password all live there, along with others.
74
74
 
75
75
  ![the command palette](assets/palette.gif)
76
76
 
77
- And themes. `t` opens the theme picker; the bundled ones muted-slate (default),
78
- dawn, matrix are lifted with love from
77
+ And themes. `t` opens the theme picker your current one is marked and
78
+ preselected, and arrowing through them previews each live before you commit
79
+ (Enter keeps it, Esc puts back what you had). The bundled ones — muted-slate
80
+ (default), dawn, matrix — are lifted with love from
79
81
  [tuxedo](https://github.com/webstonehq/tuxedo)'s palettes, and all of
80
82
  Textual's built-ins are in there too. Your pick sticks across runs. Even the
81
83
  knight on the unlock screen dresses to match your theme, try it ;)
@@ -138,12 +140,25 @@ install. The page opens in whatever TUI theme you had set when you generated
138
140
  the QR, knight and all (it won't follow later theme changes — scan again for
139
141
  that).
140
142
 
141
- Have your own domain? `paladin mobile --url https://vault.you.dev` serves at
142
- your subdomain instead of a random tunnel, so a bookmark keeps working (the
143
- path rotates every 30 days on its own). It serves on `127.0.0.1:8787` by
144
- default point your reverse proxy or named tunnel there. Set
145
- `PALADIN_MOBILE_URL` (and optionally `PALADIN_MOBILE_PORT`) and plain
146
- `paladin mobile` uses it.
143
+ ### Want it at your own subdomain?
144
+
145
+ By default every session gets a fresh random URL. If you own a domain and
146
+ want the QR to always point at *your* address instead, set one variable:
147
+
148
+ ```bash
149
+ export PALADIN_MOBILE_URL=https://passwords.yourdomain.com # in your ~/.bashrc
150
+ ```
151
+
152
+ and point that subdomain at `127.0.0.1:8787` through whatever you already
153
+ use (reverse proxy, named tunnel — `PALADIN_MOBILE_PORT` changes the port).
154
+ From then on plain `paladin mobile` serves at your subdomain, every time, so
155
+ a phone bookmark keeps working.
156
+
157
+ To be clear about what this does and doesn't change: a session still only
158
+ lives while `paladin mobile` is running — closing it still ends access, and
159
+ the secret path at the end of the URL still expires every 30 days (your
160
+ bookmark needs refreshing then, on purpose). The only difference is that
161
+ every new session opens at *your* address instead of a random one.
147
162
 
148
163
  The one thing crossing the internet is the encrypted blob, which is useless
149
164
  without the master password that never leaves your phone. The tunnel provider
@@ -251,7 +266,9 @@ and restore from a backup.
251
266
  unexpected.
252
267
 
253
268
  **Password prints instead of copying** — no clipboard tool found. Install
254
- one: `sudo apt install wl-clipboard` (Wayland) or `xclip` (X11).
269
+ one: `sudo apt install wl-clipboard` (Wayland) or `xclip` (X11). This is a
270
+ Linux-only situation — macOS (`pbcopy`) and Windows (`clip`) have theirs
271
+ built in and are used automatically.
255
272
 
256
273
  **Unlock feels slow (~1s)** — that's Argon2 doing its job. The delay *is*
257
274
  the brute-force resistance. Per command, not per keystroke.
@@ -25,7 +25,15 @@ def generate(length: int = 20) -> str:
25
25
 
26
26
  def to_clipboard(text: str) -> bool:
27
27
  # ponytail: no auto-clear timer; clear manually or copy something else over it
28
- for cmd in (["wl-copy"], ["xclip", "-selection", "clipboard"], ["xsel", "-b"]):
28
+ # linux needs a tool installed; macOS (pbcopy) and Windows (clip) ship theirs
29
+ for cmd in (
30
+ ["wl-copy"],
31
+ ["xclip", "-selection", "clipboard"],
32
+ ["xsel", "-b"],
33
+ ["pbcopy"],
34
+ ["clip"],
35
+ ["clip.exe"], # windows tool as seen from inside WSL
36
+ ):
29
37
  if shutil.which(cmd[0]):
30
38
  subprocess.run(cmd, input=text.encode(), check=True)
31
39
  return True
@@ -17,7 +17,8 @@ from textual.command import DiscoveryHit, Hit, Hits, Provider
17
17
  from textual.containers import Vertical
18
18
  from textual.screen import ModalScreen, Screen
19
19
  from textual.theme import Theme
20
- from textual.widgets import DataTable, Footer, Input, Label, Static
20
+ from textual.widgets import DataTable, Footer, Input, Label, OptionList, Static
21
+ from textual.widgets.option_list import Option
21
22
 
22
23
  from . import logo, vault
23
24
  from .cli import VAULT_PATH, generate, import_csv, to_clipboard
@@ -277,6 +278,45 @@ class PasswdModal(ModalScreen):
277
278
  self.dismiss(new)
278
279
 
279
280
 
281
+ class ThemeModal(ModalScreen):
282
+ """Theme picker: cursor starts on the current theme, moving it previews
283
+ the theme live, Enter keeps it, Esc reverts to what you had."""
284
+
285
+ BINDINGS = [Binding("escape", "cancel", "cancel")]
286
+
287
+ def __init__(self) -> None:
288
+ super().__init__()
289
+ self.original = None
290
+
291
+ def compose(self) -> ComposeResult:
292
+ with Vertical(classes="modal-box", id="theme-box"):
293
+ yield Label("theme", classes="modal-title")
294
+ yield OptionList(id="theme-list")
295
+ yield Static("↑↓ preview · enter keeps · esc cancels", classes="modal-hint")
296
+
297
+ def on_mount(self) -> None:
298
+ self.original = self.app.theme
299
+ names = sorted(self.app.available_themes)
300
+ option_list = self.query_one(OptionList)
301
+ for name in names:
302
+ label = f"{name} ✓" if name == self.original else name
303
+ option_list.add_option(Option(label, id=name))
304
+ option_list.highlighted = names.index(self.original) # start on current
305
+
306
+ def on_option_list_option_highlighted(self, event: OptionList.OptionHighlighted) -> None:
307
+ if event.option.id:
308
+ self.app.theme = event.option.id # live preview
309
+
310
+ def on_option_list_option_selected(self, event: OptionList.OptionSelected) -> None:
311
+ if event.option.id:
312
+ self.app.theme = event.option.id # commit (persists via theme signal)
313
+ self.dismiss()
314
+
315
+ def action_cancel(self) -> None:
316
+ self.app.theme = self.original # revert the preview
317
+ self.dismiss()
318
+
319
+
280
320
  class ConfirmModal(ModalScreen):
281
321
  """y/n confirmation."""
282
322
 
@@ -308,7 +348,7 @@ class MainScreen(Screen):
308
348
  Binding("e", "edit", "edit"),
309
349
  Binding("d", "delete", "delete"),
310
350
  Binding("slash", "search", "search"),
311
- Binding("t", "app.change_theme", "theme"),
351
+ Binding("t", "theme", "theme"),
312
352
  Binding("escape", "clear_search", show=False),
313
353
  Binding("q", "quit", "quit"),
314
354
  ]
@@ -381,7 +421,10 @@ class MainScreen(Screen):
381
421
  if to_clipboard(self.app.entries[name]["pw"]):
382
422
  self.notify(f"password for '{name}' copied", severity="information")
383
423
  else:
384
- self.notify("no clipboard tool (install wl-clipboard)", severity="error")
424
+ self.notify(
425
+ "no clipboard tool found (on Linux: install wl-clipboard)",
426
+ severity="error",
427
+ )
385
428
 
386
429
  def action_new(self) -> None:
387
430
  def done(entry: dict | None) -> None:
@@ -429,6 +472,9 @@ class MainScreen(Screen):
429
472
 
430
473
  self.app.push_screen(ConfirmModal(f"delete '{name}'?"), done)
431
474
 
475
+ def action_theme(self) -> None:
476
+ self.app.push_screen(ThemeModal())
477
+
432
478
  def action_search(self) -> None:
433
479
  self.query_one("#search", Input).focus()
434
480
 
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "basic-password-manager"
7
- version = "0.4.2"
7
+ version = "0.4.4"
8
8
  description = "The Paladin — a local encrypted password manager that lives in your terminal"
9
9
  readme = "README.md"
10
10
  license = "MIT"