From 73f58f2c648a48019c611a4659d882223e4432d4 Mon Sep 17 00:00:00 2001 From: Owen Jacobson Date: Wed, 30 Oct 2024 17:42:36 -0400 Subject: Index to support mass invalidation of tokens during password change. --- migrations/20241030213852_token_login_index.sql | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 migrations/20241030213852_token_login_index.sql diff --git a/migrations/20241030213852_token_login_index.sql b/migrations/20241030213852_token_login_index.sql new file mode 100644 index 0000000..7e57846 --- /dev/null +++ b/migrations/20241030213852_token_login_index.sql @@ -0,0 +1,2 @@ +create index token_login +on token (login); -- cgit v1.2.3 From 1eec6338e1146439b1dbc6207843fbc44dd13088 Mon Sep 17 00:00:00 2001 From: Owen Jacobson Date: Wed, 30 Oct 2024 18:01:48 -0400 Subject: Don't leave field binding vars uninitialized. This was causing problems for changing passwords: if the user didn't type anything in the "original password" field, the code path to sending that field to the server was just straight-up omitting the field from the message, rather than setting it to empty string, causing a 422 Unprocessable Entity. On investigation we had latent bugs related to this in a bunch of spots. --- ui/lib/apiServer.js | 18 +++++------------- ui/lib/components/CreateChannelForm.svelte | 9 +++++---- ui/lib/components/MessageInput.svelte | 10 +++++----- ui/routes/(app)/me/+page.svelte | 2 +- ui/routes/(login)/invite/[invite]/+page.svelte | 10 +++++----- ui/routes/(login)/login/+page.svelte | 10 +++++----- ui/routes/(login)/setup/+page.svelte | 10 +++++----- 7 files changed, 31 insertions(+), 38 deletions(-) diff --git a/ui/lib/apiServer.js b/ui/lib/apiServer.js index 19dcf60..5c6e5ef 100644 --- a/ui/lib/apiServer.js +++ b/ui/lib/apiServer.js @@ -10,20 +10,12 @@ export async function boot() { return apiServer.get('/boot'); } -export async function setup(username, password) { - const data = { - name: username, - password, - }; - return apiServer.post('/setup', data); +export async function setup(name, password) { + return apiServer.post('/setup', { name, password }); } -export async function logIn(username, password) { - const data = { - name: username, - password, - }; - return apiServer.post('/auth/login', data); +export async function logIn(name, password) { + return apiServer.post('/auth/login', { name, password }); } export async function logOut() { @@ -46,7 +38,7 @@ export async function deleteMessage(messageId) { // TODO } -export async function createInvite(inviteId) { +export async function createInvite() { return apiServer.post(`/invite`, {}); } diff --git a/ui/lib/components/CreateChannelForm.svelte b/ui/lib/components/CreateChannelForm.svelte index ddcf486..b716736 100644 --- a/ui/lib/components/CreateChannelForm.svelte +++ b/ui/lib/components/CreateChannelForm.svelte @@ -1,16 +1,17 @@ diff --git a/ui/lib/components/MessageInput.svelte b/ui/lib/components/MessageInput.svelte index b2746e0..03ac7fa 100644 --- a/ui/lib/components/MessageInput.svelte +++ b/ui/lib/components/MessageInput.svelte @@ -5,16 +5,16 @@ export let channel = null; let input; let value = ''; - let sending = false; + let pending = false; - $: disabled = (channel === null); + $: disabled = pending || (channel === null); async function handleSubmit() { if (channel !== null) { - sending = true; + pending = true; // TODO try/catch: await postToChannel(channel, value); - sending = false; + pending = false; value = ''; await tick(); input.focus(); @@ -23,6 +23,6 @@
- +
diff --git a/ui/routes/(app)/me/+page.svelte b/ui/routes/(app)/me/+page.svelte index 7559dbe..82af3c7 100644 --- a/ui/routes/(app)/me/+page.svelte +++ b/ui/routes/(app)/me/+page.svelte @@ -3,7 +3,7 @@ import Invites from '$lib/components/Invites.svelte'; - let currentPassword, newPassword, confirmPassword, passwordForm; + let currentPassword = "", newPassword = "", confirmPassword = "", passwordForm; let pending = false; $: valid = (newPassword === confirmPassword) && (newPassword !== currentPassword); $: disabled = pending || !valid; diff --git a/ui/routes/(login)/invite/[invite]/+page.svelte b/ui/routes/(login)/invite/[invite]/+page.svelte index 798dfb7..7ae388a 100644 --- a/ui/routes/(login)/invite/[invite]/+page.svelte +++ b/ui/routes/(login)/invite/[invite]/+page.svelte @@ -6,19 +6,19 @@ export let data; - let disabled; - let username; - let password; + let username = "", password = ""; + let pending = false; + $: disabled = pending; async function onSubmit() { - disabled = true; + pending = true; const response = await acceptInvite(data.invite.id, username, password); if (200 <= response.status && response.status < 300) { username = ''; password = ''; goto('/'); } - disabled = false; + pending = false; } diff --git a/ui/routes/(login)/login/+page.svelte b/ui/routes/(login)/login/+page.svelte index 29dba54..0387e4a 100644 --- a/ui/routes/(login)/login/+page.svelte +++ b/ui/routes/(login)/login/+page.svelte @@ -4,19 +4,19 @@ import LogIn from '$lib/components/LogIn.svelte'; - let disabled; - let username; - let password; + let username = "", password = ""; + let pending = false; + $: disabled = pending; async function onSubmit() { - disabled = true; + pending = true; const response = await logIn(username, password); if (200 <= response.status && response.status < 300) { username = ''; password = ''; goto('/'); } - disabled = false; + pending = false; } diff --git a/ui/routes/(login)/setup/+page.svelte b/ui/routes/(login)/setup/+page.svelte index 2503502..a1974b8 100644 --- a/ui/routes/(login)/setup/+page.svelte +++ b/ui/routes/(login)/setup/+page.svelte @@ -4,19 +4,19 @@ import LogIn from '$lib/components/LogIn.svelte'; - let disabled; - let username; - let password; + let username = "", password = ""; + let pending = false; + $: disabled = pending; async function onSubmit() { - disabled = true; + pending = true; const response = await setup(username, password); if (200 <= response.status && response.status < 300) { username = ''; password = ''; goto('/'); } - disabled = false; + pending = false; } -- cgit v1.2.3 From a356546fc706b2ade758e7f42069e6d669330421 Mon Sep 17 00:00:00 2001 From: Owen Jacobson Date: Wed, 30 Oct 2024 18:50:01 -0400 Subject: Coalesce adjacent messages by the same author into runs, to consolidate message display. --- ui/lib/components/ActiveChannel.svelte | 27 +++++++++++++++++++++++++-- ui/lib/components/Message.svelte | 21 +++++---------------- ui/lib/components/MessageRun.svelte | 20 ++++++++++++++++++++ ui/lib/store/messages.js | 3 --- 4 files changed, 50 insertions(+), 21 deletions(-) create mode 100644 ui/lib/components/MessageRun.svelte diff --git a/ui/lib/components/ActiveChannel.svelte b/ui/lib/components/ActiveChannel.svelte index ece9f55..1b23bc1 100644 --- a/ui/lib/components/ActiveChannel.svelte +++ b/ui/lib/components/ActiveChannel.svelte @@ -1,10 +1,33 @@
- {#each messageList as message} + {#each chunkBy(messageList, msg => msg.sender) as [sender, messages]}
- +
{/each}
diff --git a/ui/lib/components/Message.svelte b/ui/lib/components/Message.svelte index d040433..ef8ea0b 100644 --- a/ui/lib/components/Message.svelte +++ b/ui/lib/components/Message.svelte @@ -1,33 +1,22 @@ -
- - - @{name}: - +
{at} -
+
diff --git a/ui/lib/components/MessageRun.svelte b/ui/lib/components/MessageRun.svelte new file mode 100644 index 0000000..b998a8b --- /dev/null +++ b/ui/lib/components/MessageRun.svelte @@ -0,0 +1,20 @@ + + +
+ + + @{name}: + + {#each messages as { at, body }} + + {/each} +
diff --git a/ui/lib/store/messages.js b/ui/lib/store/messages.js index 931b8fb..7d1fbe1 100644 --- a/ui/lib/store/messages.js +++ b/ui/lib/store/messages.js @@ -17,9 +17,6 @@ export class Messages { for (let { channel, id, at, sender, body } of messages) { this.inChannel(channel).push({ id, at, sender, body, }); } - for (let channel in this.channels) { - this.channels[channel].sort((a, b) => a.at - b.at); - } return this; } -- cgit v1.2.3 From 35b8a914b867237c9c64f33838b1e1f85fc46fb8 Mon Sep 17 00:00:00 2001 From: Owen Jacobson Date: Wed, 30 Oct 2024 18:55:32 -0400 Subject: Nicer margins --- ui/lib/components/Message.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/lib/components/Message.svelte b/ui/lib/components/Message.svelte index ef8ea0b..004a484 100644 --- a/ui/lib/components/Message.svelte +++ b/ui/lib/components/Message.svelte @@ -7,7 +7,7 @@
{at} -
+
-- cgit v1.2.3