From 10f3074319f655aa39fedfc81e607f30285b9169 Mon Sep 17 00:00:00 2001 From: pavlov346346-source Date: Sat, 12 Sep 2026 08:52:57 +0300 Subject: [PATCH] fix: prevent employee accounts from becoming company owner --- supabase/functions/caterium-create-employee/index.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/supabase/functions/caterium-create-employee/index.ts b/supabase/functions/caterium-create-employee/index.ts index d756182..33b416d 100644 --- a/supabase/functions/caterium-create-employee/index.ts +++ b/supabase/functions/caterium-create-employee/index.ts @@ -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); } -}); +}); \ No newline at end of file