diff --git a/CHANGELOG.md b/CHANGELOG.md index f3474136..59743822 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ * Fix opening images in fullscreen dialog * Add support for blocked relays * Add authentication policy setting +* Add login with key if no signer is detected # 1.6.2 diff --git a/src/app/components/LogIn.svelte b/src/app/components/LogIn.svelte index bc94b34e..4750b10c 100644 --- a/src/app/components/LogIn.svelte +++ b/src/app/components/LogIn.svelte @@ -7,6 +7,7 @@ import Letter from "@assets/icons/letter.svg?dataurl" import Cpu from "@assets/icons/cpu-bolt.svg?dataurl" import Compass from "@assets/icons/compass-big.svg?dataurl" + import Key from "@assets/icons/key.svg?dataurl" import Icon from "@lib/components/Icon.svelte" import Link from "@lib/components/Link.svelte" import Button from "@lib/components/Button.svelte" @@ -14,6 +15,7 @@ import InfoNostr from "@app/components/InfoNostr.svelte" import LogInBunker from "@app/components/LogInBunker.svelte" import LogInEmail from "@app/components/LogInEmail.svelte" + import LogInKey from "@app/components/LogInKey.svelte" import {pushModal, clearModals} from "@app/util/modal" import {PLATFORM_NAME, POMADE_SIGNERS} from "@app/core/state" import {pushToast} from "@app/util/toast" @@ -78,6 +80,8 @@ const loginWithBunker = () => pushModal(LogInBunker) + const loginWithKey = () => pushModal(LogInKey) + const hasSigner = $derived(getNip07() || signers.length > 0) onMount(async () => { @@ -133,6 +137,12 @@ Log in with Email {/if} + {#if !hasSigner} + + {/if} {#if !hasSigner || !hasPomade} + import {bytesToHex} from "@welshman/lib" + import {loginWithNip01} from "@welshman/app" + import {decrypt} from "nostr-tools/nip49" + import {preventDefault} from "@lib/html" + import {nsecDecode} from "@lib/util" + import Spinner from "@lib/components/Spinner.svelte" + import Link from "@lib/components/Link.svelte" + import Button from "@lib/components/Button.svelte" + import FieldInline from "@lib/components/FieldInline.svelte" + import Key from "@assets/icons/key.svg?dataurl" + import Danger from "@assets/icons/danger-triangle.svg?dataurl" + import AltArrowLeft from "@assets/icons/alt-arrow-left.svg?dataurl" + import AltArrowRight from "@assets/icons/alt-arrow-right.svg?dataurl" + import Icon from "@lib/components/Icon.svelte" + import ModalHeader from "@lib/components/ModalHeader.svelte" + import ModalFooter from "@lib/components/ModalFooter.svelte" + import {clearModals} from "@app/util/modal" + import {setChecked} from "@app/util/notifications" + import {pushToast} from "@app/util/toast" + + let loading = $state(false) + let keyInput = $state("") + let password = $state("") + + const back = () => history.back() + + const isHex = $derived(keyInput.match(/^[0-9a-f]{64}$/i)) + + const isNsec = $derived(keyInput.startsWith("nsec1")) + + const isNcryptsec = $derived(keyInput.startsWith("ncryptsec1")) + + const canSubmit = $derived(!loading && (isHex || isNsec || isNcryptsec)) + + const onSubmit = async () => { + loading = true + + try { + let secret: string + + if (isNcryptsec) { + secret = bytesToHex(decrypt(keyInput, password)) + } else if (isNsec) { + secret = nsecDecode(keyInput) + } else if (isHex) { + secret = keyInput.toLowerCase() + } else { + return pushToast({ + theme: "error", + message: "Invalid key format. Please enter a hex key, nsec, or ncryptsec.", + }) + } + + loginWithNip01(secret) + pushToast({message: "Successfully logged in!"}) + setChecked("*") + clearModals() + } catch (e) { + console.error(e) + + pushToast({ + theme: "error", + message: isNcryptsec + ? "Failed to decrypt key. Please check your password." + : "Invalid key format. Please check your input.", + }) + } finally { + loading = false + } + } + + +
+ + {#snippet title()} +
Log In with Key
+ {/snippet} + {#snippet info()} +
Enter your nostr private key to log in.
+ {/snippet} +
+ + {#snippet label()} +

Your Key*

+ {/snippet} + {#snippet input()} + + {/snippet} +
+ {#if isNcryptsec} + + {#snippet label()} +

Password*

+ {/snippet} + {#snippet input()} + + {/snippet} +
+ {/if} +
+ + + Please note! + +

+ Logging in this way is not a best practice. For better security, please consider using a + signer app + to keep your keys safe. +

+
+ + + + +
diff --git a/src/app/components/RelayIcon.svelte b/src/app/components/RelayIcon.svelte index 24c95d06..630921cf 100644 --- a/src/app/components/RelayIcon.svelte +++ b/src/app/components/RelayIcon.svelte @@ -14,4 +14,8 @@ const relay = deriveRelay(url) - +{#if $relay?.icon} + +{:else} + +{/if} diff --git a/src/app/components/RoomForm.svelte b/src/app/components/RoomForm.svelte index b49b9d4e..14ea00b4 100644 --- a/src/app/components/RoomForm.svelte +++ b/src/app/components/RoomForm.svelte @@ -122,11 +122,11 @@ No icon selected {/if}
- + -