diff --git a/frontend/src/locales/ar/common.js b/frontend/src/locales/ar/common.js index fdb25fe82ba34cc5b017010b78efffbf533966da..a74e67b1c6ff6ec431fc5801894af9133e7889b5 100644 --- a/frontend/src/locales/ar/common.js +++ b/frontend/src/locales/ar/common.js @@ -2,12 +2,12 @@ const TRANSLATIONS = { onboarding: { home: { title: "مرØبا ÙÙŠ", - getStarted: "بسم الله", + getStarted: "بسم الله", }, llm: { title: "إعدادات نموذج التعلم العميق المÙضّلة", description: -"يمكن لـ٠إيني ثينك إلْلْمْ العمل مع عدة موÙرين لنماذج التعلم العميق لأداء خدمة المØادثات", + "يمكن لـ٠إيني ثينك إلْلْمْ العمل مع عدة موÙرين لنماذج التعلم العميق لأداء خدمة المØادثات", }, userSetup: { title: "إنشاء المستعمÙÙ„", @@ -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: { diff --git a/frontend/src/models/system.js b/frontend/src/models/system.js index 663cb21b76f7fdc29d6b9f3df99c0d8f586f77a6..2e4fd63bf1986196bb1791e0e4424daf5b72dac6 100644 --- a/frontend/src/models/system.js +++ b/frontend/src/models/system.js @@ -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(), }) diff --git a/server/endpoints/admin.js b/server/endpoints/admin.js index e4e556e57bcf7577919fefabdf25d75d1fb3b286..72a5b0796ae2a6930e094a804db8139af0295a06 100644 --- a/server/endpoints/admin.js +++ b/server/endpoints/admin.js @@ -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( diff --git a/server/endpoints/system.js b/server/endpoints/system.js index 3b578f94a212db52f601417d3c6889c39855d75a..a11edec62f2416d936209ffd2624c96cf53879aa 100644 --- a/server/endpoints/system.js +++ b/server/endpoints/system.js @@ -925,24 +925,31 @@ function systemEndpoints(app) { } ); - app.delete("/system/api-key", [validatedRequest], async (_, response) => { - try { - if (response.locals.multiUserMode) { - return response.sendStatus(401).end(); - } + // 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) + return response.sendStatus(401).end(); + const { id } = request.params; + if (!id || isNaN(Number(id))) return response.sendStatus(400).end(); - await ApiKey.delete(); - await EventLogs.logEvent( - "api_key_deleted", - { deletedBy: response.locals?.user?.username }, - response?.locals?.user?.id - ); - return response.status(200).end(); - } catch (error) { - console.error(error); - response.status(500).end(); + await ApiKey.delete({ id: Number(id) }); + await EventLogs.logEvent( + "api_key_deleted", + { deletedBy: response.locals?.user?.username }, + response?.locals?.user?.id + ); + return response.status(200).end(); + } catch (error) { + console.error(error); + response.status(500).end(); + } } - }); + ); app.post( "/system/custom-models",