thePR0M3TH3AN and Claude Opus 4.8
1b79ab9d09
[auth] Re-unlock the signer on demand instead of blanket-erroring encryption ops ( #57 )
...
A persisted nsec session restores the pubkey + UI on reload but NOT the in-memory
signer (the private key is only passphrase-encrypted — TODO #36 ). So after a refresh,
adding/editing a hashtag on an nsec account dead-ended with "Connect a Nostr signer
that supports encryption before managing hashtag preferences" — even though the user
looks logged in. Same class blocks subscriptions/blocks/DMs/reactions.
New reusable gate app.ensureEncryptionCapableSigner({ pubkey, need, promptMessage }):
checks the active signer's capabilities; if it can't encrypt/sign AND a MATCHING
locked nsec key exists for the account, prompts once for the passphrase and re-unlocks
the signer app-wide via unlockStoredSessionActor. One unlock re-enables every signing
flow until the next reload. Never unlocks a different account's key (pubkey-mismatch
guard); "no-stored-key" leaves non-nsec cases (e.g. an unresponsive NIP-07 extension)
to the caller's own error. Branching lives in js/nostr/ensureSignerDecision.js (pure,
unit-testable without the app shell).
Wired hashtag add/edit through it (ProfileHashtagController.persistHashtagPreferences):
a cancelled prompt aborts silently, a bad passphrase shows its own toast, and publish
never runs until the signer is confirmed. Exposed to the modal as
services.ensureEncryptionCapableSigner.
This is the shared machinery for the whole reloaded-nsec cluster (#51/#54/#56/#57);
subscriptions/blocks/DM-send/reactions are mechanical fast-follows against the same
gate (tracked in TODO #57 ).
Tests: tests/ensure-signer-decision.test.mjs (9 — capability + recoverable/fail
branching, never-wrong-key), + 2 wiring tests (gate blocks publish until ok) in
tests/profile-modal-controller.test.mjs. Lint + build green.
Co-Authored-By: Claude Opus 4.8 <[email protected] >
2026-07-01 19:11:19 -04:00
..
2026-06-23 21:22:03 -04:00
2026-02-08 00:33:13 +00:00
2026-02-26 21:40:23 -05:00
2026-02-08 00:41:34 +00:00
2026-02-05 03:00:29 +00:00
2026-06-17 05:56:38 -04:00
2026-02-21 20:45:47 -05:00
2026-07-01 10:14:03 -04:00
2026-02-08 01:29:09 +00:00
2026-06-14 15:04:40 -04:00
2026-06-23 14:53:11 -04:00
2026-02-18 17:07:47 +00:00
2026-02-11 12:01:39 +00:00
2026-02-14 13:22:43 +00:00
2026-06-30 16:02:37 -04:00
2026-02-08 00:33:27 +00:00
2026-06-25 10:21:53 -04:00
2026-02-05 23:04:21 +00:00
2026-06-24 21:57:11 -04:00
2026-06-23 21:01:04 -04:00
2026-02-23 01:16:32 +00:00
2026-02-26 17:44:51 +00:00
2026-03-04 12:25:23 -05:00
2026-02-12 14:36:45 +00:00
2026-06-25 10:39:11 -04:00
2026-06-30 15:19:34 -04:00
2026-06-22 18:47:00 -04:00
2026-06-30 17:00:57 -04:00
2026-06-14 16:15:06 -04:00
2026-01-24 11:44:16 +00:00
2026-02-12 14:36:45 +00:00
2026-06-30 22:19:13 -04:00
2026-02-05 17:00:13 +00:00
2026-06-22 19:20:48 -04:00
2026-07-01 08:47:54 -04:00
2026-06-22 20:23:51 -04:00
2026-06-24 08:19:37 -04:00
2026-02-08 02:00:10 +00:00
2026-02-26 17:36:00 +00:00
2026-01-13 20:32:06 +00:00
2026-06-18 13:55:03 -04:00
2026-06-30 16:49:42 -04:00
2026-06-22 19:51:43 -04:00
2026-06-18 12:15:14 -04:00
2026-06-20 12:38:51 -04:00
2026-06-20 12:21:49 -04:00
2025-10-14 13:31:22 -04:00
2026-06-18 12:15:46 -04:00
2026-02-21 16:45:16 -05:00
2026-06-23 20:26:51 -04:00
2026-06-16 15:07:14 -04:00
2026-02-08 03:41:19 +00:00
2026-06-16 14:52:11 -04:00
2026-06-23 21:36:15 -04:00
2025-10-26 19:23:40 -04:00
2026-01-20 12:39:19 +00:00
2025-10-27 18:19:14 -04:00
2026-06-20 09:09:07 -04:00
2026-06-20 09:32:30 -04:00
2026-01-24 21:42:37 +00:00
2026-06-21 17:17:35 -04:00
2026-06-20 07:39:05 -04:00
2026-07-01 19:11:19 -04:00
2026-01-23 05:33:57 +00:00
2025-10-26 12:05:03 -04:00
2026-06-20 12:14:03 -04:00
2026-06-23 15:00:10 -04:00
2026-06-30 15:50:27 -04:00
2026-06-14 16:57:05 -04:00
2026-06-24 08:46:30 -04:00
2026-02-08 00:22:16 +00:00
2026-06-17 12:13:58 -04:00
2026-02-26 17:38:30 +00:00
2026-06-23 14:53:51 -04:00
2026-02-17 04:52:40 +00:00
2026-02-09 23:22:49 -05:00
2025-10-14 08:48:17 -04:00
2026-06-30 15:35:18 -04:00
2026-02-15 20:18:30 +00:00
2026-02-27 03:43:14 +00:00
2026-02-14 18:58:02 +00:00
2026-02-01 21:47:29 +00:00
2025-10-26 16:06:40 -04:00
2026-06-24 18:48:49 -04:00
2026-06-19 08:52:11 -04:00
2026-06-16 20:15:17 -04:00
2026-06-30 11:39:57 -04:00
2026-06-20 14:26:32 -04:00
2026-06-20 14:58:29 -04:00
2026-06-20 14:24:51 -04:00
2026-06-20 14:55:41 -04:00
2026-06-29 21:45:23 -04:00
2026-06-20 14:48:54 -04:00
2026-02-21 16:08:33 -05:00
2026-06-14 09:52:33 -04:00
2026-07-01 09:29:43 -04:00
2026-06-30 22:40:22 -04:00
2026-06-18 15:53:56 -04:00
2026-01-06 15:32:21 -05:00
2026-01-06 15:32:21 -05:00
2025-10-08 16:39:30 -04:00
2026-06-22 21:48:51 -04:00
2026-06-22 21:00:30 -04:00
2026-06-23 14:53:24 -04:00
2026-06-29 20:57:04 -04:00
2026-06-23 14:53:24 -04:00
2026-06-22 11:30:12 -04:00
2026-06-29 10:11:52 -04:00
2026-06-29 10:55:27 -04:00
2026-06-23 14:53:11 -04:00
2025-10-22 07:18:25 -04:00
2026-02-21 15:53:09 -05:00
2026-01-27 11:54:02 +00:00
2026-02-09 21:32:29 +00:00
2026-06-20 08:27:21 -04:00
2026-06-16 20:28:27 -04:00
2026-01-06 15:32:21 -05:00
2025-10-22 15:48:59 -04:00
2026-03-04 12:25:23 -05:00
2026-06-12 14:31:38 -04:00
2026-01-31 10:33:50 +00:00
2026-01-29 11:53:42 +00:00
2026-02-09 15:33:21 +00:00
2025-10-22 22:17:30 -04:00
2026-01-06 15:36:37 -05:00
2026-06-18 15:40:16 -04:00
2025-10-29 06:52:30 -04:00
2026-06-23 14:53:38 -04:00
2025-10-21 17:46:41 -04:00
2026-06-30 22:49:02 -04:00
2026-06-30 22:11:43 -04:00
2026-06-18 12:15:27 -04:00
2026-01-14 03:52:53 +00:00
2026-06-19 08:04:54 -04:00
2026-07-01 10:56:38 -04:00
2026-02-05 22:59:50 +00:00
2026-07-01 19:11:19 -04:00
2026-07-01 15:34:20 -04:00
2026-06-20 12:19:09 -04:00
2026-02-26 17:42:43 +00:00
2026-06-30 11:07:11 -04:00
2025-10-29 22:14:20 -04:00
2026-06-20 08:27:41 -04:00
2026-06-20 08:27:41 -04:00
2026-06-14 22:51:36 -04:00
2026-01-27 03:20:08 +00:00
2025-10-02 12:48:24 -04:00
2026-06-30 22:33:03 -04:00
2026-07-01 16:11:41 -04:00
2026-01-22 22:50:00 -05:00
2026-01-25 03:34:10 +00:00
2026-01-29 11:53:42 +00:00
2026-06-16 14:18:46 -04:00
2026-02-26 17:42:07 +00:00
2026-06-30 10:05:53 -04:00
2026-06-30 10:58:30 -04:00
2026-06-30 15:19:22 -04:00
2026-06-16 22:09:57 -04:00
2026-06-16 16:56:12 -04:00
2026-06-17 05:35:02 -04:00
2026-06-21 21:21:54 -04:00
2026-06-30 09:35:40 -04:00
2026-06-30 22:11:43 -04:00
2026-07-01 15:20:58 -04:00
2025-10-20 21:15:47 -04:00
2026-06-16 09:53:52 -04:00
2026-06-21 21:21:54 -04:00
2026-07-01 16:04:33 -04:00
2026-01-27 02:09:22 +00:00
2026-06-24 13:06:34 -04:00
2026-06-30 15:24:29 -04:00
2026-06-22 21:48:51 -04:00
2026-06-24 07:07:57 -04:00
2026-06-14 22:51:36 -04:00
2026-02-08 03:34:20 +00:00
2026-06-25 08:31:45 -04:00
2026-06-25 09:48:55 -04:00
2026-06-22 11:44:02 -04:00
2026-06-22 11:30:12 -04:00
2026-02-26 17:41:34 +00:00
2026-02-08 03:44:38 +00:00
2026-02-28 19:48:57 +00:00
2026-01-30 03:40:36 +00:00
2026-01-27 03:54:41 +00:00
2026-01-27 02:09:22 +00:00
2025-10-23 13:43:05 -04:00
2026-06-23 20:11:38 -04:00
2026-06-18 20:32:50 -04:00
2025-10-29 17:06:19 -04:00
2026-06-22 11:44:02 -04:00
2026-01-06 15:32:21 -05:00
2026-01-29 03:19:06 +00:00
2026-06-14 15:49:50 -04:00
2026-06-24 13:51:41 -04:00
2026-06-24 17:29:53 -04:00
2026-06-24 12:01:25 -04:00
2026-06-21 20:52:20 -04:00
2026-06-21 21:21:54 -04:00
2026-06-21 21:07:00 -04:00
2026-06-23 14:53:24 -04:00
2026-06-20 17:47:21 -04:00
2026-06-17 18:23:10 -04:00
2026-06-20 19:00:51 -04:00
2026-06-20 17:29:35 -04:00
2025-10-04 17:25:43 -04:00
2026-06-21 14:10:21 -04:00
2026-06-20 18:45:42 -04:00
2026-06-20 19:13:32 -04:00
2026-06-21 10:55:27 -04:00
2026-06-20 12:52:15 -04:00
2026-06-23 14:53:24 -04:00
2026-06-13 08:00:28 -04:00
2026-06-18 16:05:54 -04:00
2026-02-01 19:35:02 +00:00
2026-06-23 14:53:38 -04:00
2026-06-23 14:53:38 -04:00
2026-06-25 08:56:00 -04:00