From ce0e21be9a9d122142b4bfe896c2a02a7cdfe9ed Mon Sep 17 00:00:00 2001 From: DecDuck Date: Mon, 12 May 2025 17:10:36 +1000 Subject: [PATCH 1/7] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index ca881d9..8777058 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,7 @@ # Drop [![Website](https://img.shields.io/badge/website-000000?style=for-the-badge&logo=About.me&logoColor=white)](https://droposs.org) +[![Static Badge](https://img.shields.io/badge/FORUM-blue?style=flat-square)](https://forum.droposs.org) [![GitHub License](https://img.shields.io/badge/AGPL--3.0-red?style=for-the-badge)](LICENSE) [![Discord](https://img.shields.io/badge/Discord-5865F2?style=for-the-badge&logo=discord&logoColor=white)](https://discord.gg/ACq4qZp4a9) [![Open Collective](https://img.shields.io/badge/OpenCollective-1F87FF?style=for-the-badge&logo=OpenCollective&logoColor=white)](https://opencollective.com/drop-oss) From 086664adfdbbdc453c6050effb6b4af179abe0cc Mon Sep 17 00:00:00 2001 From: DecDuck Date: Mon, 12 May 2025 17:11:19 +1000 Subject: [PATCH 2/7] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8777058..69ae307 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ # Drop [![Website](https://img.shields.io/badge/website-000000?style=for-the-badge&logo=About.me&logoColor=white)](https://droposs.org) -[![Static Badge](https://img.shields.io/badge/FORUM-blue?style=flat-square)](https://forum.droposs.org) +[![Static Badge](https://img.shields.io/badge/FORUM-blue?style=for-the-badge)](https://forum.droposs.org) [![GitHub License](https://img.shields.io/badge/AGPL--3.0-red?style=for-the-badge)](LICENSE) [![Discord](https://img.shields.io/badge/Discord-5865F2?style=for-the-badge&logo=discord&logoColor=white)](https://discord.gg/ACq4qZp4a9) [![Open Collective](https://img.shields.io/badge/OpenCollective-1F87FF?style=for-the-badge&logo=OpenCollective&logoColor=white)](https://opencollective.com/drop-oss) From 1dba112bce14a8baa3e9a6617d08048f5684d5bb Mon Sep 17 00:00:00 2001 From: DecDuck Date: Thu, 15 May 2025 14:55:05 +1000 Subject: [PATCH 3/7] feat: separate library and metadata pages, notification acls --- pages/admin/library/[id]/index.vue | 185 ++++++++++++------ pages/admin/library/index.vue | 2 +- pages/admin/metadata/games/[id]/index.vue | 2 +- pages/admin/metadata/index.vue | 6 +- .../migration.sql | 2 + prisma/models/user.prisma | 3 +- server/api/v1/client/capability/index.post.ts | 1 + server/api/v1/notifications/index.get.ts | 18 +- server/api/v1/notifications/readall.post.ts | 18 +- server/api/v1/notifications/ws.get.ts | 19 +- server/internal/acls/index.ts | 32 +++ server/internal/library/index.ts | 1 + server/internal/notifications/index.ts | 27 ++- 13 files changed, 209 insertions(+), 107 deletions(-) create mode 100644 prisma/migrations/20250515043254_add_acls_to_notifications/migration.sql diff --git a/pages/admin/library/[id]/index.vue b/pages/admin/library/[id]/index.vue index ed19f0c..83cb810 100644 --- a/pages/admin/library/[id]/index.vue +++ b/pages/admin/library/[id]/index.vue @@ -1,82 +1,141 @@ + diff --git a/server/internal/oidc/index.ts b/server/internal/oidc/index.ts index 24c4e33..ec5f43e 100644 --- a/server/internal/oidc/index.ts +++ b/server/internal/oidc/index.ts @@ -1,5 +1,6 @@ import { randomUUID } from "crypto"; import prisma from "../db/database"; +import type { User } from "~/prisma/client"; import { AuthMec } from "~/prisma/client"; import objectHandler from "../objects"; import type { Readable } from "stream"; @@ -12,10 +13,15 @@ interface OIDCWellKnown { scopes_supported: string[]; } +interface OIDCAuthSessionOptions { + redirect: string | undefined; +} + interface OIDCAuthSession { redirectUrl: string; callbackUrl: string; state: string; + options: OIDCAuthSessionOptions; } interface OIDCUserInfo { @@ -132,7 +138,7 @@ export class OIDCManager { }; } - generateAuthSession(): OIDCAuthSession { + generateAuthSession(options?: OIDCAuthSessionOptions): OIDCAuthSession { const stateKey = randomUUID(); const normalisedUrl = new URL( @@ -148,12 +154,16 @@ export class OIDCManager { redirectUrl: finalUrl, callbackUrl: redirectUrl, state: stateKey, + options: options ?? { redirect: undefined }, }; this.signinStateTable[stateKey] = session; return session; } - async authorize(code: string, state: string) { + async authorize( + code: string, + state: string, + ): Promise<{ user: User; options: OIDCAuthSessionOptions } | string> { const session = this.signinStateTable[state]; if (!session) return "Invalid state parameter"; @@ -191,7 +201,9 @@ export class OIDCManager { const user = await this.fetchOrCreateUser(userinfo); - return user; + if (typeof user === "string") return user; + + return { user, options: session.options }; } catch (e) { console.error(e); return `Request to identity provider failed: ${e}`; diff --git a/server/routes/auth/callback/oidc.get.ts b/server/routes/auth/callback/oidc.get.ts index e2a6854..0bedf34 100644 --- a/server/routes/auth/callback/oidc.get.ts +++ b/server/routes/auth/callback/oidc.get.ts @@ -21,15 +21,19 @@ export default defineEventHandler(async (h3) => { statusMessage: "No state in query params.", }); - const user = await manager.authorize(code, state); + const result = await manager.authorize(code, state); - if (typeof user === "string") + if (typeof result === "string") throw createError({ statusCode: 403, - statusMessage: `Failed to sign in: "${user}". Please try again.`, + statusMessage: `Failed to sign in: "${result}". Please try again.`, }); - await sessionHandler.signin(h3, user.id, true); + await sessionHandler.signin(h3, result.user.id, true); + + if (result.options.redirect) { + return sendRedirect(h3, result.options.redirect); + } return sendRedirect(h3, "/"); }); diff --git a/server/routes/auth/oidc.get.ts b/server/routes/auth/oidc.get.ts index be3cf94..a2b89e9 100644 --- a/server/routes/auth/oidc.get.ts +++ b/server/routes/auth/oidc.get.ts @@ -1,10 +1,16 @@ import { enabledAuthManagers } from "~/server/plugins/04.auth-init"; export default defineEventHandler((h3) => { - if (!enabledAuthManagers.OpenID) return sendRedirect(h3, "/auth/signin"); + const redirect = getQuery(h3).redirect?.toString(); + + if (!enabledAuthManagers.OpenID) + return sendRedirect( + h3, + `/auth/signin${redirect ? `?redirect=${encodeURIComponent(redirect)}` : ""}`, + ); const manager = enabledAuthManagers.OpenID; - const { redirectUrl } = manager.generateAuthSession(); + const { redirectUrl } = manager.generateAuthSession({ redirect }); return sendRedirect(h3, redirectUrl); });