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

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

View File

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

View File

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

View File

@ -925,13 +925,19 @@ function systemEndpoints(app) {
}
);
app.delete("/system/api-key", [validatedRequest], async (_, response) => {
// TODO: This endpoint is replicated in the admin endpoints file.
// and should be consolidated to be a single endpoint with flexible role protection.
app.delete(
"/system/api-key/:id",
[validatedRequest],
async (request, response) => {
try {
if (response.locals.multiUserMode) {
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(
"api_key_deleted",
{ deletedBy: response.locals?.user?.username },
@ -942,7 +948,8 @@ function systemEndpoints(app) {
console.error(error);
response.status(500).end();
}
});
}
);
app.post(
"/system/custom-models",