diff --git a/Foxnouns.Backend/Controllers/Authentication/FediverseAuthController.cs b/Foxnouns.Backend/Controllers/Authentication/FediverseAuthController.cs index 1ae2ef9..edc7b6a 100644 --- a/Foxnouns.Backend/Controllers/Authentication/FediverseAuthController.cs +++ b/Foxnouns.Backend/Controllers/Authentication/FediverseAuthController.cs @@ -94,7 +94,8 @@ public class FediverseAuthController( public async Task RegisterAsync([FromBody] OauthRegisterRequest req) { FediverseTicketData? ticketData = await keyCacheService.GetKeyAsync( - $"fediverse:{req.Ticket}" + $"fediverse:{req.Ticket}", + true ); if (ticketData == null) throw new ApiError.BadRequest("Invalid ticket", "ticket", req.Ticket); diff --git a/Foxnouns.Backend/Controllers/Moderation/ReportsController.cs b/Foxnouns.Backend/Controllers/Moderation/ReportsController.cs index c5472b3..2bd2b2d 100644 --- a/Foxnouns.Backend/Controllers/Moderation/ReportsController.cs +++ b/Foxnouns.Backend/Controllers/Moderation/ReportsController.cs @@ -229,7 +229,6 @@ public class ReportsController( .Reports.Include(r => r.Reporter) .Include(r => r.TargetUser) .Include(r => r.TargetMember) - .Include(r => r.AuditLogEntry) .FirstOrDefaultAsync(r => r.Id == id, ct); if (report == null) throw new ApiError.NotFound("No report with that ID found."); @@ -244,9 +243,6 @@ public class ReportsController( ), Member: report.TargetMember != null ? memberRenderer.RenderMember(report.TargetMember) - : null, - AuditLogEntry: report.AuditLogEntry != null - ? moderationRenderer.RenderAuditLogEntry(report.AuditLogEntry) : null ) ); diff --git a/Foxnouns.Backend/Dto/Moderation.cs b/Foxnouns.Backend/Dto/Moderation.cs index 26fd0aa..3792e31 100644 --- a/Foxnouns.Backend/Dto/Moderation.cs +++ b/Foxnouns.Backend/Dto/Moderation.cs @@ -39,9 +39,7 @@ public record ReportResponse( public record ReportDetailResponse( ReportResponse Report, UserResponse User, - [property: JsonProperty(NullValueHandling = NullValueHandling.Ignore)] MemberResponse? Member, - [property: JsonProperty(NullValueHandling = NullValueHandling.Ignore)] - AuditLogResponse? AuditLogEntry + [property: JsonProperty(NullValueHandling = NullValueHandling.Ignore)] MemberResponse? Member ); public record AuditLogResponse( diff --git a/Foxnouns.Frontend/src/lib/actions/callback.ts b/Foxnouns.Frontend/src/lib/actions/callback.ts index 5c525ab..3df1070 100644 --- a/Foxnouns.Frontend/src/lib/actions/callback.ts +++ b/Foxnouns.Frontend/src/lib/actions/callback.ts @@ -4,12 +4,10 @@ import type { AddAccountResponse, CallbackResponse } from "$api/models"; import { setToken } from "$lib"; import log from "$lib/log"; import { isRedirect, redirect, type ServerLoadEvent } from "@sveltejs/kit"; -import type { TicketData } from "../../routes/auth/callback/register/[ticket]/+page.server"; export default function createCallbackLoader( callbackType: string, bodyFn?: (event: ServerLoadEvent) => Promise, - returnData?: boolean, ) { return async (event: ServerLoadEvent) => { const { parent, fetch, cookies } = event; @@ -55,23 +53,12 @@ export default function createCallbackLoader( redirect(303, `/@${resp.user!.username}`); } - if (returnData) - return { - ticket: resp.ticket!, - remoteUser: resp.remote_username!, - }; - - const ticket = btoa( - JSON.stringify({ - type: callbackType, - ticket: resp.ticket!, - remoteUsername: resp.remote_username!, - } satisfies TicketData), - ) - .replaceAll("+", "-") - .replaceAll("/", "_"); - - redirect(303, "/auth/callback/register/" + ticket); + return { + hasAccount: false, + isLinkRequest: false, + ticket: resp.ticket!, + remoteUser: resp.remote_username!, + }; } catch (e) { if (isRedirect(e)) throw e; if (e instanceof ApiError) return { isLinkRequest: false, error: e.obj }; diff --git a/Foxnouns.Frontend/src/routes/auth/callback/register/[ticket]/+page.server.ts b/Foxnouns.Frontend/src/lib/actions/register.ts similarity index 62% rename from Foxnouns.Frontend/src/routes/auth/callback/register/[ticket]/+page.server.ts rename to Foxnouns.Frontend/src/lib/actions/register.ts index b14c1a2..d3c126d 100644 --- a/Foxnouns.Frontend/src/routes/auth/callback/register/[ticket]/+page.server.ts +++ b/Foxnouns.Frontend/src/lib/actions/register.ts @@ -3,23 +3,10 @@ import ApiError, { ErrorCode, type RawApiError } from "$api/error"; import type { AuthResponse } from "$api/models/auth"; import { setToken } from "$lib"; import log from "$lib/log"; -import { isRedirect, redirect } from "@sveltejs/kit"; - -export type TicketData = { - type: string; - ticket: string; - remoteUsername: string; -}; - -export const load = async ({ params }) => { - const data = JSON.parse(atob(params.ticket)) as TicketData; - return data; -}; - -export const actions = { - default: async ({ request, fetch, cookies, params }) => { - const type = (JSON.parse(atob(params.ticket)) as TicketData).type; +import { isRedirect, redirect, type RequestEvent } from "@sveltejs/kit"; +export default function createRegisterAction(callbackUrl: string) { + return async function ({ request, fetch, cookies }: RequestEvent) { const data = await request.formData(); const username = data.get("username") as string | null; const ticket = data.get("ticket") as string | null; @@ -30,7 +17,7 @@ export const actions = { }; try { - const resp = await apiRequest("POST", `/auth/${type}/register`, { + const resp = await apiRequest("POST", callbackUrl, { body: { username, ticket }, isInternal: true, fetch, @@ -44,5 +31,5 @@ export const actions = { if (e instanceof ApiError) return { error: e.obj }; throw e; } - }, -}; + }; +} diff --git a/Foxnouns.Frontend/src/lib/api/models/moderation.ts b/Foxnouns.Frontend/src/lib/api/models/moderation.ts index eee9382..edd0865 100644 --- a/Foxnouns.Frontend/src/lib/api/models/moderation.ts +++ b/Foxnouns.Frontend/src/lib/api/models/moderation.ts @@ -75,7 +75,6 @@ export type ReportDetails = { report: Report; user: User; member?: Member; - audit_log_entry?: AuditLogEntry; }; export type QueriedUser = { diff --git a/Foxnouns.Frontend/src/lib/components/Footer.svelte b/Foxnouns.Frontend/src/lib/components/Footer.svelte index 6fd6564..f3315f2 100644 --- a/Foxnouns.Frontend/src/lib/components/Footer.svelte +++ b/Foxnouns.Frontend/src/lib/components/Footer.svelte @@ -23,8 +23,8 @@
    -
  • {meta.users.total.toLocaleString()} users
  • -
  • {meta.members.toLocaleString()} members
  • +
  • {meta.users.total} users
  • +
  • {meta.members} members
diff --git a/Foxnouns.Frontend/src/lib/components/admin/ClosedReportAuditLog.svelte b/Foxnouns.Frontend/src/lib/components/admin/ClosedReportAuditLog.svelte deleted file mode 100644 index 7f7f3b0..0000000 --- a/Foxnouns.Frontend/src/lib/components/admin/ClosedReportAuditLog.svelte +++ /dev/null @@ -1,37 +0,0 @@ - - -
-

- Closed by at - {idTimestamp(entry.id).toLocaleString(DateTime.DATETIME_MED)} -

-

- {#if entry.type === AuditLogEntryType.IgnoreReport} - Report was ignored - {:else if entry.type === AuditLogEntryType.WarnUser || entry.type === AuditLogEntryType.WarnUserAndClearProfile} - User was warned - {#if entry.cleared_fields && entry.cleared_fields.length > 0} -
Cleared fields: {entry.cleared_fields.join(", ")} - {/if} - {:else if entry.type === AuditLogEntryType.SuspendUser} - User was suspended - {/if} -

-

Reason

-

- {#if entry.reason} - {@html renderMarkdown(entry.reason)} - {:else} - (no reason given) - {/if} -

-
diff --git a/Foxnouns.Frontend/src/lib/i18n/locales/en.json b/Foxnouns.Frontend/src/lib/i18n/locales/en.json index 453e4dc..e7ceed3 100644 --- a/Foxnouns.Frontend/src/lib/i18n/locales/en.json +++ b/Foxnouns.Frontend/src/lib/i18n/locales/en.json @@ -46,7 +46,7 @@ "remote-fediverse-account-label": "Your Fediverse account", "register-username-label": "Username", "register-button": "Register account", - "register-with-fediverse": "Register with a Fediverse account", + "register-with-mastodon": "Register with a Fediverse account", "log-in-with-fediverse-error-blurb": "Is your instance returning an error?", "log-in-with-fediverse-force-refresh-button": "Force a refresh on our end", "register-with-discord": "Register with a Discord account", diff --git a/Foxnouns.Frontend/src/routes/admin/reports/[id]/+page.server.ts b/Foxnouns.Frontend/src/routes/admin/reports/[id]/+page.server.ts index 214049a..a9a2d44 100644 --- a/Foxnouns.Frontend/src/routes/admin/reports/[id]/+page.server.ts +++ b/Foxnouns.Frontend/src/routes/admin/reports/[id]/+page.server.ts @@ -7,12 +7,7 @@ export const load = async ({ params, fetch, cookies }) => { fetch, cookies, }); - return { - report: resp.report, - user: resp.user, - member: resp.member, - auditLogEntry: resp.audit_log_entry, - }; + return { report: resp.report, user: resp.user, member: resp.member }; }; export const actions = createModactions(); diff --git a/Foxnouns.Frontend/src/routes/admin/reports/[id]/+page.svelte b/Foxnouns.Frontend/src/routes/admin/reports/[id]/+page.svelte index 2e953d5..17bff1d 100644 --- a/Foxnouns.Frontend/src/routes/admin/reports/[id]/+page.svelte +++ b/Foxnouns.Frontend/src/routes/admin/reports/[id]/+page.svelte @@ -2,7 +2,6 @@ import type { Member } from "$api/models/member"; import type { User } from "$api/models/user"; import ActionForm from "$components/admin/ActionForm.svelte"; - import ClosedReportAuditLog from "$components/admin/ClosedReportAuditLog.svelte"; import PartialProfileCard from "$components/admin/PartialProfileCard.svelte"; import ProfileHeader from "$components/profile/ProfileHeader.svelte"; import MemberCard from "$components/profile/user/MemberCard.svelte"; @@ -11,21 +10,13 @@ type Props = { data: PageData; form: ActionData }; let { data, form }: Props = $props(); - let { report, user, auditLogEntry } = $derived(data); + let { report, user, member } = $derived(data); Report on @{user.username} • pronouns.cc -{#if report.status === "CLOSED"} -
- This report has already been handled. See audit log entry -
-{/if} -

Target user

@@ -64,26 +55,15 @@
-{#if report.status === "OPEN"} -
-

Take action

- -
-{:else if report.status === "CLOSED" && auditLogEntry} - -{:else} -
-

Closed by an unknown moderator

-

- This should not happen! -

-
-{/if} +
+

Take action

+ +
{#if report.snapshot}

Profile at time of report

diff --git a/Foxnouns.Frontend/src/routes/auth/callback/discord/+page.server.ts b/Foxnouns.Frontend/src/routes/auth/callback/discord/+page.server.ts index b297e25..dc66812 100644 --- a/Foxnouns.Frontend/src/routes/auth/callback/discord/+page.server.ts +++ b/Foxnouns.Frontend/src/routes/auth/callback/discord/+page.server.ts @@ -1,3 +1,8 @@ import createCallbackLoader from "$lib/actions/callback"; +import createRegisterAction from "$lib/actions/register"; export const load = createCallbackLoader("discord"); + +export const actions = { + default: createRegisterAction("/auth/discord/register"), +}; diff --git a/Foxnouns.Frontend/src/routes/auth/callback/discord/+page.svelte b/Foxnouns.Frontend/src/routes/auth/callback/discord/+page.svelte index 10fec06..e82f0f1 100644 --- a/Foxnouns.Frontend/src/routes/auth/callback/discord/+page.svelte +++ b/Foxnouns.Frontend/src/routes/auth/callback/discord/+page.svelte @@ -1,11 +1,12 @@ @@ -16,7 +17,15 @@ {#if data.error}

{$t("auth.register-with-discord")}

- {:else} + {:else if data.isLinkRequest} + {:else} + {/if} diff --git a/Foxnouns.Frontend/src/routes/auth/callback/google/+page.server.ts b/Foxnouns.Frontend/src/routes/auth/callback/google/+page.server.ts index d3e1b93..49f963c 100644 --- a/Foxnouns.Frontend/src/routes/auth/callback/google/+page.server.ts +++ b/Foxnouns.Frontend/src/routes/auth/callback/google/+page.server.ts @@ -1,3 +1,8 @@ import createCallbackLoader from "$lib/actions/callback"; +import createRegisterAction from "$lib/actions/register"; export const load = createCallbackLoader("google"); + +export const actions = { + default: createRegisterAction("/auth/google/register"), +}; diff --git a/Foxnouns.Frontend/src/routes/auth/callback/google/+page.svelte b/Foxnouns.Frontend/src/routes/auth/callback/google/+page.svelte index eeff070..284806a 100644 --- a/Foxnouns.Frontend/src/routes/auth/callback/google/+page.svelte +++ b/Foxnouns.Frontend/src/routes/auth/callback/google/+page.svelte @@ -1,11 +1,12 @@ @@ -16,7 +17,15 @@ {#if data.error}

{$t("auth.register-with-google")}

- {:else} + {:else if data.isLinkRequest} + {:else} + {/if} diff --git a/Foxnouns.Frontend/src/routes/auth/callback/mastodon/[instance]/+page.server.ts b/Foxnouns.Frontend/src/routes/auth/callback/mastodon/[instance]/+page.server.ts index c2d290e..b092b1e 100644 --- a/Foxnouns.Frontend/src/routes/auth/callback/mastodon/[instance]/+page.server.ts +++ b/Foxnouns.Frontend/src/routes/auth/callback/mastodon/[instance]/+page.server.ts @@ -1,5 +1,6 @@ import ApiError, { ErrorCode } from "$api/error"; import createCallbackLoader from "$lib/actions/callback"; +import createRegisterAction from "$lib/actions/register"; export const load = createCallbackLoader("fediverse", async ({ params, url }) => { const code = url.searchParams.get("code") as string | null; @@ -9,3 +10,7 @@ export const load = createCallbackLoader("fediverse", async ({ params, url }) => return { code: code || token, state, instance: params.instance! }; }); + +export const actions = { + default: createRegisterAction("/auth/fediverse/register"), +}; diff --git a/Foxnouns.Frontend/src/routes/auth/callback/mastodon/[instance]/+page.svelte b/Foxnouns.Frontend/src/routes/auth/callback/mastodon/[instance]/+page.svelte index fdc8d7a..99bd00c 100644 --- a/Foxnouns.Frontend/src/routes/auth/callback/mastodon/[instance]/+page.svelte +++ b/Foxnouns.Frontend/src/routes/auth/callback/mastodon/[instance]/+page.svelte @@ -1,11 +1,12 @@ @@ -16,7 +17,15 @@ {#if data.error}

{$t("auth.register-with-mastodon")}

- {:else} + {:else if data.isLinkRequest} + {:else} + {/if} diff --git a/Foxnouns.Frontend/src/routes/auth/callback/register/[ticket]/+page.svelte b/Foxnouns.Frontend/src/routes/auth/callback/register/[ticket]/+page.svelte deleted file mode 100644 index 6d1b6fc..0000000 --- a/Foxnouns.Frontend/src/routes/auth/callback/register/[ticket]/+page.svelte +++ /dev/null @@ -1,22 +0,0 @@ - - - - {$t(`auth.register-with-${data.type}`)} • pronouns.cc - - -
- -
diff --git a/Foxnouns.Frontend/src/routes/auth/callback/tumblr/+page.server.ts b/Foxnouns.Frontend/src/routes/auth/callback/tumblr/+page.server.ts index 813f19e..49346f1 100644 --- a/Foxnouns.Frontend/src/routes/auth/callback/tumblr/+page.server.ts +++ b/Foxnouns.Frontend/src/routes/auth/callback/tumblr/+page.server.ts @@ -1,3 +1,8 @@ import createCallbackLoader from "$lib/actions/callback"; +import createRegisterAction from "$lib/actions/register"; export const load = createCallbackLoader("tumblr"); + +export const actions = { + default: createRegisterAction("/auth/tumblr/register"), +}; diff --git a/Foxnouns.Frontend/src/routes/auth/callback/tumblr/+page.svelte b/Foxnouns.Frontend/src/routes/auth/callback/tumblr/+page.svelte index 7a43261..c7c53e9 100644 --- a/Foxnouns.Frontend/src/routes/auth/callback/tumblr/+page.svelte +++ b/Foxnouns.Frontend/src/routes/auth/callback/tumblr/+page.svelte @@ -1,11 +1,12 @@ @@ -16,7 +17,15 @@ {#if data.error}

{$t("auth.register-with-tumblr")}

- {:else} + {:else if data.isLinkRequest} + {:else} + {/if}