fix: prevent employee accounts from becoming company owner

This commit is contained in:
pavlov346346-source 2026-09-12 08:52:57 +03:00
parent 3a54721594
commit 10f3074319

View File

@ -10,7 +10,7 @@ const WORKERS_DEV_ORIGIN = /^https:\/\/[a-z0-9-]+(?:\.[a-z0-9-]+)*\.workers\.dev
const LOCAL_ORIGIN = /^http:\/\/(?:localhost|127\.0\.0\.1)(?::\d{1,5})?$/i;
const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i;
const EMAIL_RE = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
const ALLOWED_ROLES = new Set(["admin", "manager", "kitchen", "courier", "viewer"]);
const ALLOWED_ROLES = new Set(["manager", "kitchen", "courier", "viewer"]);
function allowedOrigin(origin: string) {
if (!origin) return true;
@ -42,7 +42,7 @@ type PrepData = {
function publicError(error: unknown) {
const message = error instanceof Error ? error.message : String(error || "");
if (/access denied|permission|not allowed|недостаточно прав|сначала войдите/i.test(message)) return { status: 403, error: "Недостаточно прав для добавления сотрудника.", code: "forbidden" };
if (/access denied|permission|not allowed|недостаточно прав|сначала войдите|только владелец/i.test(message)) return { status: 403, error: "Только владелец компании может добавлять сотрудников.", code: "forbidden" };
if (/subscription|blocked|plan|подписк|тариф/i.test(message)) return { status: 403, error: "Добавление сотрудника недоступно для текущего тарифа.", code: "plan_restricted" };
if (/limit|maximum|max_members|лимит/i.test(message)) return { status: 409, error: "Достигнут лимит сотрудников для текущего тарифа.", code: "member_limit" };
if (/already registered|already exists|duplicate|уже существует/i.test(message)) return { status: 409, error: "Аккаунт с этим email уже существует.", code: "account_exists" };
@ -82,7 +82,7 @@ Deno.serve(async (req: Request) => {
if (!UUID_RE.test(workspaceId)) return reply(req, { error: "Некорректная компания.", code: "invalid_workspace" }, 400);
if (!EMAIL_RE.test(email) || email.length > 254) return reply(req, { error: "Введите корректный email.", code: "invalid_email" }, 400);
if (displayName.length > 120) return reply(req, { error: "Имя сотрудника слишком длинное.", code: "invalid_display_name" }, 400);
if (!ALLOWED_ROLES.has(role)) return reply(req, { error: "Некорректная роль сотрудника.", code: "invalid_role" }, 400);
if (!ALLOWED_ROLES.has(role)) return reply(req, { error: "Для сотрудника выберите рабочую роль: менеджер, кухня, курьер или просмотр.", code: "invalid_role" }, 400);
const caller = createClient(url, anon, {
global: { headers: { Authorization: auth } },
@ -183,4 +183,4 @@ Deno.serve(async (req: Request) => {
const safe = publicError(error);
return reply(req, { error: safe.error, code: safe.code }, safe.status);
}
});
});