|
@@ -1,19 +1,24 @@
|
|
|
import crypto from 'node:crypto';
|
|
import crypto from 'node:crypto';
|
|
|
|
|
|
|
|
import type { Handle, HandleServerError } from '@sveltejs/kit';
|
|
import type { Handle, HandleServerError } from '@sveltejs/kit';
|
|
|
|
|
+import { redirect } from '@sveltejs/kit';
|
|
|
|
|
|
|
|
import { resolve } from '$app/paths';
|
|
import { resolve } from '$app/paths';
|
|
|
|
|
|
|
|
import {
|
|
import {
|
|
|
|
|
+ ForbiddenError,
|
|
|
isAppError,
|
|
isAppError,
|
|
|
logger as rootLogger,
|
|
logger as rootLogger,
|
|
|
NotFoundError,
|
|
NotFoundError,
|
|
|
runWithContext,
|
|
runWithContext,
|
|
|
server,
|
|
server,
|
|
|
serverLogger as log,
|
|
serverLogger as log,
|
|
|
|
|
+ UnauthorizedError,
|
|
|
ValidationError,
|
|
ValidationError,
|
|
|
} from '$lib/server';
|
|
} from '$lib/server';
|
|
|
|
|
+import type { User } from '$lib/types/user';
|
|
|
|
|
|
|
|
|
|
+const LOGIN = resolve('/auth/login');
|
|
|
const WORKSPACE_RESOURCES = resolve('/api/workspaces');
|
|
const WORKSPACE_RESOURCES = resolve('/api/workspaces');
|
|
|
|
|
|
|
|
const ready = server.init();
|
|
const ready = server.init();
|
|
@@ -35,12 +40,36 @@ const handle: Handle = async ({ event, resolve: resolveRequest }) => {
|
|
|
event.locals.requestId = requestId;
|
|
event.locals.requestId = requestId;
|
|
|
|
|
|
|
|
return runWithContext({ requestId }, async () => {
|
|
return runWithContext({ requestId }, async () => {
|
|
|
|
|
+ const auth = server.auth;
|
|
|
|
|
+ let user: User | undefined;
|
|
|
|
|
+ if (auth) {
|
|
|
|
|
+ const token = event.cookies.get('session');
|
|
|
|
|
+ user = token ? await auth.verifyToken(token) : undefined;
|
|
|
|
|
+ if (!user && event.url.pathname !== LOGIN) {
|
|
|
|
|
+ redirect(302, LOGIN);
|
|
|
|
|
+ }
|
|
|
|
|
+ } else {
|
|
|
|
|
+ user = {
|
|
|
|
|
+ id: 'admin',
|
|
|
|
|
+ name: 'Admin',
|
|
|
|
|
+ email: 'admin@locostack.com',
|
|
|
|
|
+ workspaces: ['*'],
|
|
|
|
|
+ };
|
|
|
|
|
+ }
|
|
|
|
|
+ event.locals.user = user || null;
|
|
|
|
|
+
|
|
|
const { pathname } = event.url;
|
|
const { pathname } = event.url;
|
|
|
if (pathname.startsWith(WORKSPACE_RESOURCES) && pathname !== WORKSPACE_RESOURCES) {
|
|
if (pathname.startsWith(WORKSPACE_RESOURCES) && pathname !== WORKSPACE_RESOURCES) {
|
|
|
|
|
+ if (!user) {
|
|
|
|
|
+ throw new UnauthorizedError('Authentication required');
|
|
|
|
|
+ }
|
|
|
const workspaceId = event.params.workspaceId;
|
|
const workspaceId = event.params.workspaceId;
|
|
|
if (workspaceId === undefined) {
|
|
if (workspaceId === undefined) {
|
|
|
throw new ValidationError('Workspace ID is required');
|
|
throw new ValidationError('Workspace ID is required');
|
|
|
}
|
|
}
|
|
|
|
|
+ if (!user.workspaces.includes(workspaceId) && !user.workspaces.includes('*')) {
|
|
|
|
|
+ throw new ForbiddenError('User does not have access to this workspace');
|
|
|
|
|
+ }
|
|
|
const workspace = server.ws.list().find((ws) => ws.id === workspaceId);
|
|
const workspace = server.ws.list().find((ws) => ws.id === workspaceId);
|
|
|
if (!workspace) {
|
|
if (!workspace) {
|
|
|
throw new NotFoundError('Workspace not found');
|
|
throw new NotFoundError('Workspace not found');
|
|
@@ -50,7 +79,6 @@ const handle: Handle = async ({ event, resolve: resolveRequest }) => {
|
|
|
} else {
|
|
} else {
|
|
|
event.locals.workspaceId = event.cookies.get('workspaceId') || null;
|
|
event.locals.workspaceId = event.cookies.get('workspaceId') || null;
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
return resolveRequest(event);
|
|
return resolveRequest(event);
|
|
|
});
|
|
});
|
|
|
};
|
|
};
|