aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAdam Soltys <[email protected]>2023-01-03 00:22:30 -0800
committerAdam Soltys <[email protected]>2023-01-05 07:41:32 -0800
commita657fab89a7de41f0a33389023166a6f7af6dbe6 (patch)
tree77a485e5539be24542b38de582338946d317a4ce
parent9849f6c4431214665c47c43098d86112c93d8001 (diff)
downloadcoinos-ui-a657fab89a7de41f0a33389023166a6f7af6dbe6.tar.gz
coinos-ui-a657fab89a7de41f0a33389023166a6f7af6dbe6.zip
generate pubkey on register
-rw-r--r--src/components/RegisterOrLogin.svelte44
-rw-r--r--src/hooks.server.js40
-rw-r--r--src/lib/nostr.js29
-rw-r--r--src/routes/(app)/+layout.server.js27
-rw-r--r--src/routes/(app)/[username]/generate/+page.svelte42
-rw-r--r--src/routes/(app)/[username]/generate/+server.js5
-rw-r--r--src/routes/(app)/login/+server.js6
-rw-r--r--src/routes/(app)/register/+page.server.js7
8 files changed, 106 insertions, 94 deletions
diff --git a/src/components/RegisterOrLogin.svelte b/src/components/RegisterOrLogin.svelte
index b2070e9c..cc23d8ad 100644
--- a/src/components/RegisterOrLogin.svelte
+++ b/src/components/RegisterOrLogin.svelte
@@ -1,15 +1,18 @@
<script>
+ import { applyAction, deserialize } from '$app/forms';
import { tick } from 'svelte';
import { Pincode, PincodeInput } from 'svelte-pincode';
import { fly } from 'svelte/transition';
import { enhance } from '$app/forms';
- import { Icon } from '$comp';
+ import { Icon, Spinner } from '$comp';
import { focus } from '$lib/utils';
import { password } from '$lib/store';
import { t } from '$lib/translations';
import { page } from '$app/stores';
+ import { generate } from '$lib/nostr';
+ import { invalidateAll } from '$app/navigation';
- let token, tokenInput;
+ let token, tokenInput, formElement;
let code = [];
let redirect;
@@ -32,6 +35,33 @@
register: '/register',
signIn: '/login'
}[pageID];
+
+ let loading;
+ async function handleSubmit(e) {
+ loading = true;
+
+ let data = new FormData(this);
+ let user = Object.fromEntries(data);
+ await generate(user);
+
+ for (let k in user) {
+ data.set(k, user[k]);
+ }
+
+ const response = await fetch(action, {
+ method: 'POST',
+ body: data
+ });
+
+ const result = deserialize(await response.text());
+
+ if (result.type === 'success') {
+ await invalidateAll();
+ }
+
+ applyAction(result);
+ loading = false;
+ }
</script>
<div class="pt-10">
@@ -81,7 +111,7 @@
</div>
{/if}
- <form class="space-y-5" {action} method="POST" use:enhance>
+ <form class="space-y-5" on:submit|preventDefault={handleSubmit} method="POST">
<div>
<label for="username" class="font-semibold">{$t('login.username')}</label>
<input
@@ -141,7 +171,13 @@
<button
type="submit"
class="bg-black text-white w-full rounded-2xl p-4 font-semibold hover:opacity-80"
- >{$t('login.' + pageID)}
+ disabled={loading}
+ >
+ {#if loading}
+ <Spinner />
+ {:else}
+ {$t('login.' + pageID)}
+ {/if}
</button>
</form>
diff --git a/src/hooks.server.js b/src/hooks.server.js
deleted file mode 100644
index b97daa5a..00000000
--- a/src/hooks.server.js
+++ /dev/null
@@ -1,40 +0,0 @@
-import { auth, get, protectedRoutes } from '$lib/utils';
-
-let users = {};
-
-export async function handle({ event, resolve }) {
- let token = event.cookies.get('token');
- let {
- params,
- request,
- url: { pathname, origin }
- } = event;
-
- let user;
- if (token && pathname !== '/logout') {
- try {
- user = users[token] || (await get('/me', auth(event.cookies)));
- users[token] = user;
-
- setTimeout(() => {
- delete users[token];
- }, 60000);
-
- event.locals.user = user;
-
- if (['/', '/login', '/register'].includes(pathname) && request.method === 'GET')
- return Response.redirect(origin + `/${user.username}/dashboard`, 307);
- } catch (e) {
- return Response.redirect(origin + '/logout', 307);
- }
- }
-
- if (protectedRoutes.find((p) => pathname.match(p))) {
- if (!user || user.username !== params.username)
- return Response.redirect(origin + '/login', 307);
- }
-
- const response = await resolve(event);
-
- return response;
-}
diff --git a/src/lib/nostr.js b/src/lib/nostr.js
index 0d21971e..048738bc 100644
--- a/src/lib/nostr.js
+++ b/src/lib/nostr.js
@@ -11,25 +11,11 @@ import { goto, invalidate } from '$app/navigation';
const { encode, decode, fromWords, toWords } = bech32m;
export let generate = async (user) => {
+ let password = get(pw);
let mnemonic, key, seed, entropy, cipher, salt, child;
if (!get(pin)?.length === 6) return;
- let password = get(pw);
-
- if (!password) {
- passwordPrompt.set(true);
- }
-
- try {
- await post('/password', { password });
- } catch (e) {
- console.log(e);
- passwordPrompt.set(true);
- }
-
- await wait(() => !!get(pw));
- password = get(pw);
mnemonic = generateMnemonic();
seed = mnemonicToSeedSync(mnemonic);
@@ -49,19 +35,6 @@ export let generate = async (user) => {
user.pubkey = Buffer.from(ecc.xOnlyPointFromPoint(child.publicKey)).toString('hex');
user.cipher = encode('en', toWords(bytes), 180);
user.salt = Buffer.from(salt).toString('hex');
- user.pin = get(pin);
-
- try {
- await post(`/${user.username}/generate`, user);
- } catch (e) {
- if (e.message?.startsWith('Pin')) {
- pin.set('');
- failure('Wrong pin, try again');
- }
- }
-
- invalidate('app:user');
- setTimeout(() => goto(get(loginRedirect) || `/${user.username}/dashboard`), 10);
};
export let sign = async ({ event, user }) => {
diff --git a/src/routes/(app)/+layout.server.js b/src/routes/(app)/+layout.server.js
index 88ca1539..eef1bdec 100644
--- a/src/routes/(app)/+layout.server.js
+++ b/src/routes/(app)/+layout.server.js
@@ -1,18 +1,35 @@
import { error, redirect } from '@sveltejs/kit';
-import { get, post, auth } from '$lib/utils';
+import { get, post, auth, protectedRoutes } from '$lib/utils';
import { PUBLIC_BTC as btc } from '$env/static/public';
-export async function load({ cookies, locals, request, url, params }) {
- url.pathname;
+export async function load({ cookies, request, url, params }) {
+ let { pathname } = url;
let token = cookies.get('token');
let rate,
rates = { USD: 1 },
subject;
- let { user } = locals;
+ let user;
+ if (token) {
+ try {
+ user = await get('/me', auth(cookies));
+ } catch (e) {}
+ }
+
+ if (user && ['/', '/login', '/register'].includes(pathname) && request.method === 'GET')
+ throw redirect(307, `/${user.username}/dashboard`);
+
+ if (
+ protectedRoutes.find((p) => pathname.match(p)) &&
+ (!user || user.username !== params.username)
+ ) {
+ throw redirect(307, '/login');
+ }
+
if (user) {
- if (!user.pubkey && !url.pathname.includes('gen'))
+ if (!user.pubkey && !url.pathname.includes('gen')) {
throw redirect(307, `/${user.username}/generate`);
+ }
let account = user.accounts.find((a) => a.asset === btc && !a.pubkey);
if (account) {
let { id } = account;
diff --git a/src/routes/(app)/[username]/generate/+page.svelte b/src/routes/(app)/[username]/generate/+page.svelte
index f2e53be7..91c3d189 100644
--- a/src/routes/(app)/[username]/generate/+page.svelte
+++ b/src/routes/(app)/[username]/generate/+page.svelte
@@ -1,14 +1,14 @@
<script>
- import { failure } from '$lib/utils';
+ import { failure, post, wait } from '$lib/utils';
import { Buffer } from 'buffer';
import { onMount } from 'svelte';
import { bech32m } from 'bech32';
import { generateMnemonic, mnemonicToEntropy, mnemonicToSeedSync } from 'bip39';
import { goto, invalidate } from '$app/navigation';
- import { loginRedirect, password } from '$lib/store';
import { Pin } from '$comp';
- import { pin } from '$lib/store';
+ import { loginRedirect, pin, password, passwordPrompt } from '$lib/store';
import { generate } from '$lib/nostr';
+ import { browser } from '$app/environment';
export let data;
let { user } = data;
@@ -16,8 +16,42 @@
let loaded;
onMount(async () => {
+ if (!browser) return;
setTimeout(() => (loaded = true), 50);
- generate(user);
+
+ if (!$password) $passwordPrompt = true;
+
+ try {
+ await post('/password', { password: $password });
+ } catch (e) {
+ $passwordPrompt = true;
+ }
+
+ await wait(() => $password);
+
+ try {
+ await generate(user);
+ } catch (e) {
+ console.log('error generating', e);
+ }
+
+ try {
+ user.pin = $pin;
+ } catch (e) {
+ if (e.message?.startsWith('Pin')) {
+ $pin = '';
+ failure('Wrong pin, try again');
+ }
+ }
+
+ try {
+ await post(`/${user.username}/generate`, user);
+ goto($loginRedirect || `/${user.username}/dashboard`, { invalidateAll: true });
+ } catch (e) {
+ console.log(e);
+ failure('Failed to generate keys');
+ goto('/');
+ }
});
$: $pin?.length === 6 && generate(user);
diff --git a/src/routes/(app)/[username]/generate/+server.js b/src/routes/(app)/[username]/generate/+server.js
index 608f0575..4cc248bd 100644
--- a/src/routes/(app)/[username]/generate/+server.js
+++ b/src/routes/(app)/[username]/generate/+server.js
@@ -3,10 +3,9 @@ import { error, json } from '@sveltejs/kit';
export async function POST({ cookies, request }) {
try {
- let body = await request.json();
- let user = await post(`/user`, body, auth(cookies));
- return json(user);
+ return json(await post(`/user`, await request.json(), auth(cookies)));
} catch (e) {
+ console.log(e);
throw error(500, e.message);
}
}
diff --git a/src/routes/(app)/login/+server.js b/src/routes/(app)/login/+server.js
deleted file mode 100644
index 32d2244d..00000000
--- a/src/routes/(app)/login/+server.js
+++ /dev/null
@@ -1,6 +0,0 @@
-import { json } from '@sveltejs/kit';
-import { post } from '$lib/utils';
-
-export async function POST({ request }) {
- return json(await post('/checkPassword', await request.json()));
-}
diff --git a/src/routes/(app)/register/+page.server.js b/src/routes/(app)/register/+page.server.js
index 33cad4d0..793bd7f6 100644
--- a/src/routes/(app)/register/+page.server.js
+++ b/src/routes/(app)/register/+page.server.js
@@ -9,9 +9,8 @@ export const load = async ({ parent }) => {
export const actions = {
default: async ({ cookies, request }) => {
let form = Object.fromEntries(await request.formData());
- let { username, password } = form;
-
- let user = { username, password };
+ let { username, password, cipher, salt, pubkey } = form;
+ let user = { username, password, cipher, salt, pubkey };
let error;
try {
@@ -28,6 +27,6 @@ export const actions = {
}
if (error) return invalid(400, { error });
- throw redirect(307, `/${user.username}/generate`);
+ throw redirect(307, `/${user.username}/dashboard`);
}
};