aboutsummaryrefslogtreecommitdiffstats
path: root/src/components
diff options
context:
space:
mode:
authorAdam Soltys <[email protected]>2022-12-24 05:22:50 -0800
committerAdam Soltys <[email protected]>2022-12-24 05:22:50 -0800
commit10c20c0c5b130c389680e37e4e4aba8e2abdbf1e (patch)
tree6862c7f94c899b3dad177b16698c08abc678eefb /src/components
parente1a34bbc86600c6dfb782ac936030379deb6365a (diff)
downloadcoinos-ui-10c20c0c5b130c389680e37e4e4aba8e2abdbf1e.tar.gz
coinos-ui-10c20c0c5b130c389680e37e4e4aba8e2abdbf1e.zip
password prompt and pin fixes
Diffstat (limited to 'src/components')
-rw-r--r--src/components/Feed.svelte74
-rw-r--r--src/components/Password.svelte77
-rw-r--r--src/components/Pin.svelte3
-rw-r--r--src/components/index.js1
4 files changed, 118 insertions, 37 deletions
diff --git a/src/components/Feed.svelte b/src/components/Feed.svelte
index 00226692..0ccda7b8 100644
--- a/src/components/Feed.svelte
+++ b/src/components/Feed.svelte
@@ -1,55 +1,51 @@
<script>
+ import { onMount } from 'svelte';
import { Avatar } from '$comp';
import { browser } from '$app/environment';
import VirtualScroll from 'svelte-virtual-scroll-list';
- import { punk } from '$lib/utils';
- import { Buffer } from 'buffer';
- import { entropyToMnemonic, mnemonicToSeedSync } from 'bip39';
import { enhance } from '$app/forms';
- import { bech32m } from 'bech32';
- import { calculateId, signId } from 'nostr';
- import { bip32, stretch, post } from '$lib/utils';
+ import { post, punk, failure } from '$lib/utils';
+ import { Password } from '$comp';
+ import { password, passwordPrompt } from '$lib/store';
+ import { send } from '$lib/nostr';
export let events;
export let user;
- const { decode, fromWords } = bech32m;
-
- let message;
+ let message, submitting;
+ $: submitting && $password && submit();
let submit = async () => {
- let mnemonic, key, password, seed, entropy, child, privkey;
- entropy = Buffer.from(
- await crypto.subtle.decrypt(
- { name: 'AES-GCM', iv: new Uint8Array(16) },
- await stretch(password, Buffer.from(user.salt, 'hex')),
- Uint8Array.from(fromWords(decode(user.cipher, 180).words))
- ),
- 'hex'
- ).toString('hex');
+ submitting = true;
+ try {
+ let mnemonic, key, seed, entropy, child, privkey;
+ if (!$password) return ($passwordPrompt = true);
+
+ try {
+ await post('/password', { password: $password });
+ } catch (e) {
+ return ($passwordPrompt = true);
+ }
- mnemonic = entropyToMnemonic(entropy);
- seed = mnemonicToSeedSync(mnemonic);
- key = bip32.fromSeed(seed);
- child = key.derivePath("m/44'/1237'/0'/0/0");
- privkey = child.privateKey;
+ let event = {
+ pubkey: user.pubkey,
+ created_at: Math.floor(Date.now() / 1000),
+ kind: 1,
+ content: message,
+ tags: []
+ };
- let event = {
- pubkey: user.pubkey,
- created_at: Math.floor(Date.now() / 1000),
- kind: 1,
- content: message,
- tags: []
- };
+ await send(event, user, $password);
- event.id = await calculateId(event);
- event.sig = await signId(privkey, event.id);
- await post(`/${user.username}`, { event });
+ event.user = user;
+ event.seen = event.created_at;
- event.user = user;
- event.seen = event.created_at;
- events[event.id] = event;
- events = events;
+ events[event.id] = event;
+ events = events;
+ } catch (e) {
+ failure('Problem posting event');
+ console.log(e);
+ }
};
let distance = (date) => {
@@ -78,6 +74,10 @@
<svelte:window bind:innerWidth={w} />
+{#if $passwordPrompt}
+ <Password {user} />
+{/if}
+
<form on:submit|preventDefault={submit} class="flex justify-center gap-4 max-w-2xl mx-auto">
<div class="grow">
<input
diff --git a/src/components/Password.svelte b/src/components/Password.svelte
new file mode 100644
index 00000000..c9318201
--- /dev/null
+++ b/src/components/Password.svelte
@@ -0,0 +1,77 @@
+<script>
+ import { Icon } from "$comp";
+ import { failure, post } from '$lib/utils';
+ import { password as pw, passwordPrompt } from '$lib/store';
+
+ export let user;
+
+ let password;
+ let { username } = user;
+ let revealPassword = false;
+
+ let cancel = () => ($passwordPrompt = false);
+
+ let submit = async () => {
+ try {
+ await post('/password', { password });
+ $passwordPrompt = false;
+ $pw = password;
+ } catch (e) {
+ failure('Invalid password, try again');
+ }
+ };
+</script>
+
+<div class="fixed inset-0 bg-gray-600 bg-opacity-50 overflow-y-auto h-full w-full z-20">
+ <div class="relative top-1/3 mx-auto p-5 border w-96 shadow-lg rounded-md bg-white space-y-5">
+ <h1 class="text-center text-2xl font-semibold">Please enter your password</h1>
+ <form on:submit|preventDefault={submit}>
+ <div class="relative mb-5">
+ {#if revealPassword}
+ <input
+ name="password"
+ type="text"
+ required
+ class="bg-primary"
+ bind:value={password}
+ autocapitalize="none"
+ autofocus
+ />
+ {:else}
+ <input
+ name="password"
+ type="password"
+ required
+ class="bg-primary"
+ bind:value={password}
+ autocapitalize="none"
+ autofocus
+ />
+ {/if}
+ <button
+ type="button"
+ on:click={() => (revealPassword = !revealPassword)}
+ class="absolute right-5 top-5"
+ >
+ <Icon icon={revealPassword ? 'eye' : 'eye-off'} />
+ </button>
+ </div>
+ <div class="w-full flex">
+ <button
+ type="button"
+ class="border-2 border-black rounded-xl font-semibold mx-auto py-3 w-40 hover:opacity-80 mx-auto"
+ on:click={cancel}
+ on:keydown={cancel}
+ >
+ <div class="my-auto">Cancel</div>
+ </button>
+ <button
+ type="submit"
+ class="border-2 border-black rounded-xl font-semibold mx-auto py-3 w-40 hover:opacity-80 mx-auto"
+ >
+ <div class="my-auto">Submit</div>
+ </button>
+ </div>
+ </form>
+ </div>
+</div>
diff --git a/src/components/Pin.svelte b/src/components/Pin.svelte
index 80e003b9..9b1bb4ea 100644
--- a/src/components/Pin.svelte
+++ b/src/components/Pin.svelte
@@ -4,6 +4,8 @@
let pinCode = '';
let pinInput;
+ let cancel = () => ($pin = '000000');
+
$: pinCode.length > 5 && ($pin = pinCode);
</script>
@@ -15,6 +17,7 @@
<button
type="submit"
class="border-2 border-black rounded-xl font-semibold mx-auto py-3 w-40 hover:opacity-80 mx-auto"
+ on:click={cancel}
>
<div class="my-auto">Cancel</div>
</button>
diff --git a/src/components/index.js b/src/components/index.js
index 90bc1e7e..b0802c25 100644
--- a/src/components/index.js
+++ b/src/components/index.js
@@ -1,3 +1,4 @@
+export { default as Password } from './Password.svelte';
export { default as Feed } from './Feed.svelte';
export { default as Invoice } from './Invoice.svelte';
export { default as Request } from './Request.svelte';