fix: bug where in single user mode deletion of an api key deletes all (#3358)

* fix: bug where in single user mode deletion of an api key deletes all
resolves #3352

* linting
This commit is contained in:
Timothy Carambat 2025-02-26 12:17:00 -08:00 committed by GitHub
parent 7c787f8959
commit 2f5ed6c705
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 38 additions and 34 deletions

View File

@ -2,12 +2,12 @@ const TRANSLATIONS = {
onboarding: { onboarding: {
home: { home: {
title: "مرحبا في", title: "مرحبا في",
getStarted: "بسم الله", getStarted: "بسم الله",
}, },
llm: { llm: {
title: "إعدادات نموذج التعلم العميق المفضّلة", title: "إعدادات نموذج التعلم العميق المفضّلة",
description: description:
"يمكن لـِ إيني ثينك إلْلْمْ العمل مع عدة موفرين لنماذج التعلم العميق لأداء خدمة المحادثات", "يمكن لـِ إيني ثينك إلْلْمْ العمل مع عدة موفرين لنماذج التعلم العميق لأداء خدمة المحادثات",
}, },
userSetup: { userSetup: {
title: "إنشاء المستعمِل", title: "إنشاء المستعمِل",
@ -18,8 +18,7 @@ const TRANSLATIONS = {
instancePassword: "كلمة مرورالمثيل", instancePassword: "كلمة مرورالمثيل",
setPassword: "هل تريد إنشاء كلمة مرور ؟", setPassword: "هل تريد إنشاء كلمة مرور ؟",
passwordReq: "يجب أن تحتوي كلمة المرور على ثمانية حروف على الأقل", passwordReq: "يجب أن تحتوي كلمة المرور على ثمانية حروف على الأقل",
passwordWarn: passwordWarn: "من المهم حفظ كلمة المرور هذه لأنه لا يمكن استردادها.",
"من المهم حفظ كلمة المرور هذه لأنه لا يمكن استردادها.",
adminUsername: "اسم مستعمل حساب المشرف", adminUsername: "اسم مستعمل حساب المشرف",
adminUsernameReq: adminUsernameReq:
@ -33,12 +32,12 @@ const TRANSLATIONS = {
title: "معالجة البيانات والخصوصية", title: "معالجة البيانات والخصوصية",
description: description:
"نحن ملتزمون بالشفافية والمراقبة عندما يتعلق الأمر ببياناتك الشخصية.", "نحن ملتزمون بالشفافية والمراقبة عندما يتعلق الأمر ببياناتك الشخصية.",
settingsHint: settingsHint: "يمكن إعادة ضبط هذه الإعدادات في أي وقت.",
"يمكن إعادة ضبط هذه الإعدادات في أي وقت.",
}, },
survey: { survey: {
title: "مرحباً في إيني ثينك إلْلْمْ", title: "مرحباً في إيني ثينك إلْلْمْ",
description: " بما يتناسب مع احتياجاتك ساعدنا إذا أحببت في تصميم إيني ثينك إلْلْمْ", description:
" بما يتناسب مع احتياجاتك ساعدنا إذا أحببت في تصميم إيني ثينك إلْلْمْ",
email: "ما هو بريدك الالكتروني؟", email: "ما هو بريدك الالكتروني؟",
useCase: "لماذا ستستخدم إيني ثينك إلْلْمْ؟", useCase: "لماذا ستستخدم إيني ثينك إلْلْمْ؟",
@ -167,7 +166,8 @@ const TRANSLATIONS = {
general: { general: {
vector: { vector: {
title: "عدد المتجهات", title: "عدد المتجهات",
description: "العدد الإجمالي للمتجهات في قاعدة بيانات المتجهات الخاصة بك.", description:
"العدد الإجمالي للمتجهات في قاعدة بيانات المتجهات الخاصة بك.",
}, },
names: { names: {
description: "سيؤدي هذا فقط إلى تغيير اسم العرض لمساحة العمل الخاصة بك.", description: "سيؤدي هذا فقط إلى تغيير اسم العرض لمساحة العمل الخاصة بك.",
@ -183,8 +183,7 @@ const TRANSLATIONS = {
}, },
pfp: { pfp: {
title: "صورة الملف الشخصي للمساعد", title: "صورة الملف الشخصي للمساعد",
description: description: "تخصيص صورة الملف الشخصي للمساعد لمساحة العمل هذه.",
"تخصيص صورة الملف الشخصي للمساعد لمساحة العمل هذه.",
image: "صورة مساحة العمل", image: "صورة مساحة العمل",
remove: "إزالة صورة مساحة العمل", remove: "إزالة صورة مساحة العمل",
}, },
@ -324,8 +323,7 @@ const TRANSLATIONS = {
}, },
scrape: { scrape: {
title: "جمع محتوى المواقع الإلكترونية", title: "جمع محتوى المواقع الإلكترونية",
description: description: "السماح للوكيل بزيارة مواقع الويب وجمع محتواها.",
"السماح للوكيل بزيارة مواقع الويب وجمع محتواها.",
}, },
generate: { generate: {
title: "إنشاء المخططات البيانية", title: "إنشاء المخططات البيانية",
@ -388,8 +386,7 @@ const TRANSLATIONS = {
}, },
icons: { icons: {
title: "أيقونات التذييل المخصصة", title: "أيقونات التذييل المخصصة",
description: description: "تخصيص أيقونات التذييل المعروضة في أسفل الشريط الجانبي.",
"تخصيص أيقونات التذييل المعروضة في أسفل الشريط الجانبي.",
icon: "أيقونة", icon: "أيقونة",
link: "رابط", link: "رابط",
}, },
@ -425,8 +422,7 @@ const TRANSLATIONS = {
"يمكن أن يؤدي استخدام نموذج الهمس المحلي على الأجهزة ذات ذاكرة الوصول العشوائي أو وحدة المعالجة المركزية المحدودة إلى تعطيل إني ثينك إلْلْم عند معالجة ملفات الوسائط.", "يمكن أن يؤدي استخدام نموذج الهمس المحلي على الأجهزة ذات ذاكرة الوصول العشوائي أو وحدة المعالجة المركزية المحدودة إلى تعطيل إني ثينك إلْلْم عند معالجة ملفات الوسائط.",
"warn-recommend": "warn-recommend":
"نوصي بذاكرة وصول عشوائي بسعة 2 جيجابايت على الأقل وتحميل ملفات أقل من 10 ميجا بايت.", "نوصي بذاكرة وصول عشوائي بسعة 2 جيجابايت على الأقل وتحميل ملفات أقل من 10 ميجا بايت.",
"warn-end": "warn-end": "سيتم تنزيل النموذج المدمج تلقائيًا عند الاستخدام الأول.",
"سيتم تنزيل النموذج المدمج تلقائيًا عند الاستخدام الأول.",
}, },
embedding: { embedding: {

View File

@ -493,8 +493,8 @@ const System = {
return { apiKey: null, error: e.message }; return { apiKey: null, error: e.message };
}); });
}, },
deleteApiKey: async function () { deleteApiKey: async function (apiKeyId = "") {
return fetch(`${API_BASE}/system/api-key`, { return fetch(`${API_BASE}/system/api-key/${apiKeyId}`, {
method: "DELETE", method: "DELETE",
headers: baseHeaders(), headers: baseHeaders(),
}) })

View File

@ -537,6 +537,7 @@ function adminEndpoints(app) {
async (request, response) => { async (request, response) => {
try { try {
const { id } = request.params; const { id } = request.params;
if (!id || isNaN(Number(id))) return response.sendStatus(400).end();
await ApiKey.delete({ id: Number(id) }); await ApiKey.delete({ id: Number(id) });
await EventLogs.logEvent( await EventLogs.logEvent(

View File

@ -925,24 +925,31 @@ function systemEndpoints(app) {
} }
); );
app.delete("/system/api-key", [validatedRequest], async (_, response) => { // TODO: This endpoint is replicated in the admin endpoints file.
try { // and should be consolidated to be a single endpoint with flexible role protection.
if (response.locals.multiUserMode) { app.delete(
return response.sendStatus(401).end(); "/system/api-key/:id",
} [validatedRequest],
async (request, response) => {
try {
if (response.locals.multiUserMode)
return response.sendStatus(401).end();
const { id } = request.params;
if (!id || isNaN(Number(id))) return response.sendStatus(400).end();
await ApiKey.delete(); await ApiKey.delete({ id: Number(id) });
await EventLogs.logEvent( await EventLogs.logEvent(
"api_key_deleted", "api_key_deleted",
{ deletedBy: response.locals?.user?.username }, { deletedBy: response.locals?.user?.username },
response?.locals?.user?.id response?.locals?.user?.id
); );
return response.status(200).end(); return response.status(200).end();
} catch (error) { } catch (error) {
console.error(error); console.error(error);
response.status(500).end(); response.status(500).end();
}
} }
}); );
app.post( app.post(
"/system/custom-models", "/system/custom-models",