- Upgrade vault encryption from PBKDF2 (1000 iterations) to Argon2id
(256MB memory, 8 iterations, 4 threads, ~3 second derivation)
- Add automatic migration from v1 to v2 vault format on unlock
- Add WebAssembly CSP support for hash-wasm Argon2id implementation
- Add NIP-42 relay authentication support for auth-required relays
- Add profile edit feature with pencil icon on identity page
- Add direct NIP-05 validation (removes NDK dependency for validation)
- Add deriving modal with progress timer during key derivation
- Add client tag "plebeian-signer" to profile events
- Fix modal colors (dark theme for visibility)
- Fix NIP-05 badge styling to include check/error indicator
- Add release zip packages for Chrome and Firefox
New files:
- projects/common/src/lib/helpers/argon2-crypto.ts
- projects/common/src/lib/helpers/websocket-auth.ts
- projects/common/src/lib/helpers/nip05-validator.ts
- projects/common/src/lib/components/deriving-modal/
- projects/{chrome,firefox}/src/app/components/profile-edit/
- releases/plebeian-signer-{chrome,firefox}-v1.0.0.zip
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
76 lines
1.9 KiB
HTML
76 lines
1.9 KiB
HTML
<app-deriving-modal #derivingModal></app-deriving-modal>
|
|
|
|
<div class="sam-text-header">
|
|
<span class="brand">Plebeian Signer</span>
|
|
</div>
|
|
|
|
<div class="content-login-vault">
|
|
<div class="sam-flex-column gap" style="align-items: center">
|
|
<div class="logo-frame">
|
|
<img src="logo.svg" height="120" width="120" alt="" />
|
|
</div>
|
|
|
|
<div class="sam-mt-2 input-group">
|
|
<input
|
|
#passwordInputElement
|
|
type="password"
|
|
class="form-control"
|
|
placeholder="vault password"
|
|
[(ngModel)]="loginPassword"
|
|
(keyup.enter)="loginPassword && loginVault()"
|
|
/>
|
|
<button
|
|
class="btn btn-outline-secondary"
|
|
type="button"
|
|
(click)="toggleType(passwordInputElement)"
|
|
>
|
|
<i
|
|
class="bi bi-eye"
|
|
[class.bi-eye]="passwordInputElement.type === 'password'"
|
|
[class.bi-eye-slash]="passwordInputElement.type === 'text'"
|
|
></i>
|
|
</button>
|
|
</div>
|
|
|
|
<button
|
|
[disabled]="!loginPassword"
|
|
type="button"
|
|
class="sam-mt btn btn-primary"
|
|
(click)="loginVault()"
|
|
>
|
|
<div class="sam-flex-row gap-h">
|
|
<i class="bi bi-box-arrow-in-right"></i>
|
|
<span>Sign in</span>
|
|
</div>
|
|
</button>
|
|
|
|
<button
|
|
class="sam-mt"
|
|
(click)="
|
|
confirm.show(
|
|
'Do you really want to reset the extension? All data will be lost.',
|
|
onClickResetExtension.bind(this)
|
|
)
|
|
"
|
|
type="button"
|
|
class="btn btn-link"
|
|
>
|
|
Reset Extension
|
|
</button>
|
|
</div>
|
|
</div>
|
|
|
|
<!----------->
|
|
<!-- ALERT -->
|
|
<!----------->
|
|
@if(showInvalidPasswordAlert) {
|
|
<div style="position: absolute; bottom: 0; align-self: center">
|
|
<div class="alert alert-danger sam-flex-row gap" role="alert">
|
|
<i class="bi bi-exclamation-triangle"></i>
|
|
<span>Invalid password</span>
|
|
</div>
|
|
</div>
|
|
}
|
|
|
|
<lib-confirm #confirm> </lib-confirm>
|