mirror of
https://github.com/nicotsx/zerobyte.git
synced 2026-06-16 12:32:13 -04:00
* refactor(auth): mark desktop sessions with auth source Makes it easier to filter out on session type in backend paths that behave differently depending on the context * chore: fix un-used import * fix(auth): align desktop session guards * refactor(auth): gate desktop sessions by runtime features
63 lines
1.9 KiB
TypeScript
63 lines
1.9 KiB
TypeScript
import { eq } from "drizzle-orm";
|
|
import { UnauthorizedError } from "http-errors-enhanced";
|
|
import type { DateFormatPreference, TimeFormatPreference } from "~/lib/datetime";
|
|
import { config } from "~/server/core/config";
|
|
import { db } from "~/server/db/db";
|
|
import { usersTable } from "~/server/db/schema";
|
|
import { verifyUserPassword } from "~/server/modules/auth/helpers";
|
|
import { ensureDefaultOrg } from "~/server/lib/auth/helpers/create-default-org";
|
|
import { auth } from "~/server/lib/auth";
|
|
import { cryptoUtils } from "~/server/utils/crypto";
|
|
import { DESKTOP_USER_EMAIL, DESKTOP_USERNAME } from "./constants";
|
|
|
|
type DesktopDateTimePreferences = {
|
|
dateFormat: DateFormatPreference;
|
|
timeFormat: TimeFormatPreference;
|
|
};
|
|
|
|
export const ensureDesktopIdentity = async ({ dateFormat, timeFormat }: DesktopDateTimePreferences) => {
|
|
if (config.runtime !== "desktop") {
|
|
return;
|
|
}
|
|
|
|
let user = await db.query.usersTable.findFirst({ where: { email: DESKTOP_USER_EMAIL } });
|
|
const password = await cryptoUtils.deriveSecret("zerobyte:desktop-user-password");
|
|
|
|
if (!user) {
|
|
await auth.api.signUpEmail({
|
|
body: {
|
|
email: DESKTOP_USER_EMAIL,
|
|
password,
|
|
name: "Zerobyte",
|
|
username: DESKTOP_USERNAME,
|
|
rememberMe: false,
|
|
hasDownloadedResticPassword: false,
|
|
dateFormat,
|
|
timeFormat,
|
|
},
|
|
});
|
|
|
|
user = await db.query.usersTable.findFirst({ where: { email: DESKTOP_USER_EMAIL } });
|
|
} else if (!(await verifyUserPassword({ userId: user.id, password }))) {
|
|
throw new UnauthorizedError("Reserved desktop user is not trusted");
|
|
}
|
|
|
|
if (!user) {
|
|
throw new Error("Failed to bootstrap desktop user");
|
|
}
|
|
|
|
await ensureDefaultOrg(user.id);
|
|
|
|
await db
|
|
.update(usersTable)
|
|
.set({ role: "admin", emailVerified: true, updatedAt: new Date() })
|
|
.where(eq(usersTable.id, user.id));
|
|
|
|
const desktopUser = await db.query.usersTable.findFirst({ where: { id: user.id } });
|
|
if (!desktopUser) {
|
|
throw new Error("Failed to load desktop user");
|
|
}
|
|
|
|
return desktopUser;
|
|
};
|