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.
- {basic_password_manager-0.4.2 → basic_password_manager-0.4.4}/PKG-INFO +27 -10
- {basic_password_manager-0.4.2 → basic_password_manager-0.4.4}/README.md +26 -9
- {basic_password_manager-0.4.2 → basic_password_manager-0.4.4}/basic_password_manager.egg-info/PKG-INFO +27 -10
- {basic_password_manager-0.4.2 → basic_password_manager-0.4.4}/pw_manager/cli.py +9 -1
- {basic_password_manager-0.4.2 → basic_password_manager-0.4.4}/pw_manager/tui.py +49 -3
- {basic_password_manager-0.4.2 → basic_password_manager-0.4.4}/pyproject.toml +1 -1
- {basic_password_manager-0.4.2 → basic_password_manager-0.4.4}/LICENSE +0 -0
- {basic_password_manager-0.4.2 → basic_password_manager-0.4.4}/basic_password_manager.egg-info/SOURCES.txt +0 -0
- {basic_password_manager-0.4.2 → basic_password_manager-0.4.4}/basic_password_manager.egg-info/dependency_links.txt +0 -0
- {basic_password_manager-0.4.2 → basic_password_manager-0.4.4}/basic_password_manager.egg-info/entry_points.txt +0 -0
- {basic_password_manager-0.4.2 → basic_password_manager-0.4.4}/basic_password_manager.egg-info/requires.txt +0 -0
- {basic_password_manager-0.4.2 → basic_password_manager-0.4.4}/basic_password_manager.egg-info/top_level.txt +0 -0
- {basic_password_manager-0.4.2 → basic_password_manager-0.4.4}/pw_manager/__init__.py +0 -0
- {basic_password_manager-0.4.2 → basic_password_manager-0.4.4}/pw_manager/crypto.py +0 -0
- {basic_password_manager-0.4.2 → basic_password_manager-0.4.4}/pw_manager/logo.py +0 -0
- {basic_password_manager-0.4.2 → basic_password_manager-0.4.4}/pw_manager/mobile.py +0 -0
- {basic_password_manager-0.4.2 → basic_password_manager-0.4.4}/pw_manager/vault.py +0 -0
- {basic_password_manager-0.4.2 → basic_password_manager-0.4.4}/pw_manager/web/argon2.umd.min.js +0 -0
- {basic_password_manager-0.4.2 → basic_password_manager-0.4.4}/pw_manager/web/page.html +0 -0
- {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.
|
|
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
|

|
|
76
76
|
|
|
77
|
-
And themes. `t` opens the theme picker
|
|
78
|
-
|
|
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
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
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
|

|
|
60
60
|
|
|
61
|
-
And themes. `t` opens the theme picker
|
|
62
|
-
|
|
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
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
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.
|
|
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
|

|
|
76
76
|
|
|
77
|
-
And themes. `t` opens the theme picker
|
|
78
|
-
|
|
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
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
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
|
-
|
|
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", "
|
|
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(
|
|
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
|
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{basic_password_manager-0.4.2 → basic_password_manager-0.4.4}/pw_manager/web/argon2.umd.min.js
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|