Moderate severityNVD Advisory· Published Feb 3, 2026· Updated Feb 4, 2026
CI4MS Vulnerable to User Email Enumeration via Password Reset Flow
CVE-2026-25509
Description
CI4MS is a CodeIgniter 4-based CMS skeleton that delivers a production-ready, modular architecture with RBAC authorization and theme support. Prior to version 0.28.5.0, the authentication implementation in CI4MS is vulnerable to email enumeration. An unauthenticated attacker can determine whether an email address is registered in the system by analyzing the application's response during the password reset process. This issue has been patched in version 0.28.5.0.
Affected packages
Versions sourced from the GitHub Security Advisory.
| Package | Affected versions | Patched versions |
|---|---|---|
ci4-cms-erp/ci4msPackagist | < 0.28.5.0 | 0.28.5.0 |
Affected products
1- Range: < 0.28.5.0
Patches
186be2930d1c5Improves file editor and auth security
17 files changed · +201 −182
app/Config/Filters.php+3 −3 modified@@ -63,8 +63,6 @@ class Filters extends BaseFilters //'pagecache', // Web Page Caching //'performance', // Performance Metrics 'toolbar', // Debug Toolbar - 'seofilter', - 'aifilter' ], ]; @@ -81,9 +79,11 @@ class Filters extends BaseFilters // 'invalidchars', ], 'after' => [ - 'toolbar' + 'toolbar', // 'honeypot', // 'secureheaders', + 'seofilter' => ['except' => ['backend', 'backend/*', 'install', 'install/*']], + 'aifilter' => ['except' => ['backend', 'backend/*', 'install', 'install/*']], ], ];
modules/Auth/Controllers/AuthController.php+4 −1 modified@@ -84,7 +84,10 @@ public function forgotPassword() $user = $this->commonModel->selectOne('users', ['email' => $this->request->getPost('email')]); - if (is_null($user)) return redirect()->back()->with('error', lang('Auth.forgotNoUser')); + /* THANK U LARS + You can also use `lang('Auth.forgotNoUser')`, but it will create a security vulnerability. + */ + if (is_null($user)) return redirect()->back()->with('error', lang('Auth.forgotEmailSent')); // Save the reset hash / $this->commonModel->edit('users', ['reset_hash' => $this->authLib->generateActivateHash(), 'reset_expires' => date('Y-m-d H:i:s', time() + $this->config->resetTime)], ['id' => $user->_id]);
modules/Auth/Libraries/AuthLibrary.php+1 −1 modified@@ -115,7 +115,7 @@ public function rememberUser(string $userID) public function isLoggedIn(): bool { - if ($userID = session($this->config->logged_in)) { + if (!empty(session($this->config->logged_in)) && $userID = session($this->config->logged_in)) { // Store our current user object if (session()->get('redirect_url') == null) { $this->user = $this->commonModel->selectOne($this->config->userTable, ['id' => $userID]);
modules/Fileeditor/Config/FileeditorConfig.php+3 −3 modified@@ -3,13 +3,13 @@ class FileeditorConfig extends \CodeIgniter\Config\BaseConfig { public $csrfExcept = [ - 'backend/Fileeditor', - 'backend/Fileeditor/*', + 'backend/fileeditor', + 'backend/fileeditor/*', ]; public $filters = [ 'backendAfterLoginFilter' => ['before' => [ - 'backend/Fileeditor', 'backend/Fileeditor/*' + 'backend/fileeditor', 'backend/fileeditor/*' ]] ]; }
modules/Fileeditor/Controllers/Fileeditor.php+13 −0 modified@@ -6,6 +6,8 @@ class Fileeditor extends \Modules\Backend\Controllers\BaseController { + protected $allowedExtensions = ['css', 'js', 'html', 'txt', 'json', 'sql', 'md']; + public function index() { return view('Modules\Fileeditor\Views\fileEditor', $this->defData); @@ -58,6 +60,11 @@ public function saveFile() $content = $this->request->getVar('content'); $fullPath = realpath(ROOTPATH . $path); + $extension = pathinfo($fullPath, PATHINFO_EXTENSION); + if (!in_array(strtolower($extension), $this->allowedExtensions)) { + return $this->response->setJSON(['error' => lang('Fileeditor.fileTypeEditNotAllowed')])->setStatusCode(403); + } + if (!$fullPath || !is_file($fullPath) || strpos($fullPath, realpath(ROOTPATH)) !== 0) { return $this->response->setJSON(['error' => lang('Backend.invalid', [lang('Fileeditor.path')])])->setStatusCode(400); } @@ -91,6 +98,12 @@ public function createFile() $name = $this->request->getVar('name'); $fullPath = realpath(ROOTPATH . $path); + $extension = pathinfo($name, PATHINFO_EXTENSION); + if (!in_array(strtolower($extension), $this->allowedExtensions)) { + return $this->response->setJSON(['error' => lang('Fileeditor.fileTypeNotAllowed')])->setStatusCode(403); + } + + if (!$fullPath || !is_dir($fullPath) || strpos($fullPath, realpath(ROOTPATH)) !== 0) { return $this->response->setJSON(['error' => lang('Backend.invalid', [lang('Fileeditor.path')])])->setStatusCode(400); }
modules/Fileeditor/Language/ar/Fileeditor.php+19 −20 modified@@ -1,31 +1,30 @@ <?php - return [ 'fileEditor' => 'محرر الملفات', - 'renameFailed' => 'لا يمكن تغيير اسم الملف', - 'invalidSource' => 'الملف المصدر أو المجلد غير صالح', - 'moveFailed' => 'لا يمكن نقل الملف أو المجلد', - 'invalidFileOrFolder' => 'الملف أو المجلد غير صالح', + 'renameFailed' => 'تعذر إعادة تسمية الملف', + 'invalidSource' => 'ملف أو مجلد مصدر غير صالح', + 'moveFailed' => 'تعذر نقل الملف أو المجلد', + 'invalidFileOrFolder' => 'ملف أو مجلد غير صالح', 'folderNotEmpty' => 'المجلد ليس فارغًا أو فشل الحذف!', - 'path' => 'طريق', + 'path' => 'مسار', 'file' => 'ملف', - 'create' => 'يخلق', - 'update' => 'تحديث', - 'delete' => 'يمسح', - 'invalidFile' => 'ملف غير صالح', - 'invalidPath' => 'مسار غير صالح', - 'renameSuccess' => 'تم تغيير اسم الملف بنجاح', - 'newFileName' => 'اسم الملف الجديد:', 'newFile' => 'ملف جديد', + 'newFolder' => 'مجلد جديد', + 'rename' => 'إعادة تسمية', + 'delete' => 'حذف', + 'renameSuccess' => 'تمت إعادة تسمية الملف بنجاح', + 'newFileName' => 'اسم الملف الجديد:', 'fileCreated' => 'تم إنشاء الملف بنجاح', - 'fileCreateFailed' => 'لا يمكن إنشاء الملف', + 'fileCreateFailed' => 'تعذر إنشاء الملف', 'newFolderName' => 'اسم المجلد الجديد:', 'folderCreated' => 'تم إنشاء المجلد بنجاح', - 'folderCreateFailed' => 'لا يمكن إنشاء المجلد', + 'folderCreateFailed' => 'تعذر إنشاء المجلد', 'deleteSuccess' => 'تم حذف الملف أو المجلد بنجاح', - 'deleteFailed' => 'لا يمكن حذف الملف أو المجلد', - 'fileReadFailed' => 'لا يمكن قراءة الملف', - 'fileContentLoadFailed' => 'لا يمكن تحميل محتوى الملف', + 'deleteFailed' => 'تعذر حذف الملف أو المجلد', + 'fileReadFailed' => 'تعذر قراءة الملف', + 'fileContentLoadFailed' => 'تعذر تحميل محتوى الملف', 'fileSaveSuccess' => 'تم حفظ الملف بنجاح', - 'fileSaveFailed' => 'لا يمكن حفظ الملف', -]; \ No newline at end of file + 'fileSaveFailed' => 'تعذر حفظ الملف', + 'fileTypeNotAllowed' => 'لا يمكنك إنشاء نوع الملف هذا!', + 'fileTypeEditNotAllowed' => 'لا يمكنك تعديل نوع الملف هذا!' +];
modules/Fileeditor/Language/de/Fileeditor.php+14 −15 modified@@ -1,31 +1,30 @@ <?php - return [ 'fileEditor' => 'Dateieditor', - 'renameFailed' => 'Der Dateiname konnte nicht geändert werden', - 'invalidSource' => 'Ungültige Quelldatei oder ungültiger Ordner', - 'moveFailed' => 'Datei oder Ordner konnten nicht verschoben werden', + 'renameFailed' => 'Datei konnte nicht umbenannt werden', + 'invalidSource' => 'Ungültige Quelldatei oder Ordner', + 'moveFailed' => 'Datei oder Ordner konnte nicht verschoben werden', 'invalidFileOrFolder' => 'Ungültige Datei oder Ordner', - 'folderNotEmpty' => 'Der Ordner ist nicht leer oder das Löschen ist fehlgeschlagen!', - 'path' => 'Weg', + 'folderNotEmpty' => 'Ordner ist nicht leer oder Löschen fehlgeschlagen!', + 'path' => 'Pfad', 'file' => 'Datei', - 'create' => 'Erstellen', - 'update' => 'Aktualisieren', + 'newFile' => 'Neue Datei', + 'newFolder' => 'Neuer Ordner', + 'rename' => 'Umbenennen', 'delete' => 'Löschen', - 'invalidFile' => 'Ungültige Datei', - 'invalidPath' => 'Ungültiger Pfad', - 'renameSuccess' => 'Dateiname erfolgreich geändert', + 'renameSuccess' => 'Datei erfolgreich umbenannt', 'newFileName' => 'Neuer Dateiname:', - 'newFile' => 'Neue Datei', 'fileCreated' => 'Datei erfolgreich erstellt', 'fileCreateFailed' => 'Datei konnte nicht erstellt werden', 'newFolderName' => 'Neuer Ordnername:', 'folderCreated' => 'Ordner erfolgreich erstellt', 'folderCreateFailed' => 'Ordner konnte nicht erstellt werden', 'deleteSuccess' => 'Datei oder Ordner erfolgreich gelöscht', - 'deleteFailed' => 'Datei oder Ordner konnten nicht gelöscht werden', + 'deleteFailed' => 'Datei oder Ordner konnte nicht gelöscht werden', 'fileReadFailed' => 'Datei konnte nicht gelesen werden', - 'fileContentLoadFailed' => 'Dateiinhalt konnte nicht geladen werden', + 'fileContentLoadFailed' => 'Dateinhalt konnte nicht geladen werden', 'fileSaveSuccess' => 'Datei erfolgreich gespeichert', 'fileSaveFailed' => 'Datei konnte nicht gespeichert werden', -]; \ No newline at end of file + 'fileTypeNotAllowed' => 'Sie können diesen Dateityp nicht erstellen!', + 'fileTypeEditNotAllowed' => 'Sie können diesen Dateityp nicht bearbeiten!' +];
modules/Fileeditor/Language/en/Fileeditor.php+15 −15 modified@@ -1,30 +1,30 @@ <?php return [ 'fileEditor' => 'File Editor', - 'renameFailed' => 'File name could not be changed', + 'renameFailed' => 'Could not rename file', 'invalidSource' => 'Invalid source file or folder', - 'moveFailed' => 'File or folder could not be moved', + 'moveFailed' => 'Could not move file or folder', 'invalidFileOrFolder' => 'Invalid file or folder', 'folderNotEmpty' => 'Folder is not empty or deletion failed!', - 'path'=>'Path', - 'file'=>'File', - 'create'=>'Create', - 'update'=>'Update', - 'delete'=>'Delete', - 'invalidFile' => 'Invalid file', - 'invalidPath' => 'Invalid path', - 'renameSuccess' => 'File name changed successfully', + 'path' => 'Path', + 'file' => 'File', + 'newFile' => 'New File', + 'newFolder' => 'New Folder', + 'rename' => 'Rename', + 'delete' => 'Delete', + 'renameSuccess' => 'File renamed successfully', 'newFileName' => 'New file name:', - 'newFile'=>'New File', 'fileCreated' => 'File created successfully', 'fileCreateFailed' => 'File could not be created', 'newFolderName' => 'New folder name:', 'folderCreated' => 'Folder created successfully', 'folderCreateFailed' => 'Folder could not be created', 'deleteSuccess' => 'File or folder deleted successfully', - 'deleteFailed' => 'File or folder could not be deleted', - 'fileReadFailed' => 'File could not be read', - 'fileContentLoadFailed' => 'File content could not be loaded', + 'deleteFailed' => 'Could not delete file or folder', + 'fileReadFailed' => 'Could not read file', + 'fileContentLoadFailed' => 'Could not load file content', 'fileSaveSuccess' => 'File saved successfully', - 'fileSaveFailed' => 'File could not be saved', + 'fileSaveFailed' => 'Could not save file', + 'fileTypeNotAllowed' => 'You cannot create this file type!', + 'fileTypeEditNotAllowed' => 'You cannot edit this file type!' ];
modules/Fileeditor/Language/es/Fileeditor.php+19 −20 modified@@ -1,31 +1,30 @@ <?php - return [ - 'fileEditor' => 'Editor de archivos', - 'renameFailed' => 'No se pudo cambiar el nombre del archivo', - 'invalidSource' => 'Carpeta o archivo fuente no válido', - 'moveFailed' => 'No se pudo mover el archivo o la carpeta', + 'fileEditor' => 'Editor de Archivos', + 'renameFailed' => 'No se pudo renombrar el archivo', + 'invalidSource' => 'Archivo o carpeta de origen no válido', + 'moveFailed' => 'No se pudo mover el archivo o carpeta', 'invalidFileOrFolder' => 'Archivo o carpeta no válido', - 'folderNotEmpty' => '¡La carpeta no está vacía o la eliminación falló!', - 'path' => 'Camino', + 'folderNotEmpty' => '¡La carpeta no está vacía o falló la eliminación!', + 'path' => 'Ruta', 'file' => 'Archivo', - 'create' => 'Crear', - 'update' => 'Actualizar', - 'delete' => 'Borrar', - 'invalidFile' => 'Archivo no válido', - 'invalidPath' => 'Ruta no válida', - 'renameSuccess' => 'El nombre del archivo se cambió correctamente.', + 'newFile' => 'Nuevo Archivo', + 'newFolder' => 'Nueva Carpeta', + 'rename' => 'Renombrar', + 'delete' => 'Eliminar', + 'renameSuccess' => 'Archivo renombrado con éxito', 'newFileName' => 'Nuevo nombre de archivo:', - 'newFile' => 'Nuevo archivo', - 'fileCreated' => 'Archivo creado exitosamente', + 'fileCreated' => 'Archivo creado con éxito', 'fileCreateFailed' => 'No se pudo crear el archivo', 'newFolderName' => 'Nuevo nombre de carpeta:', - 'folderCreated' => 'Carpeta creada exitosamente', + 'folderCreated' => 'Carpeta creada con éxito', 'folderCreateFailed' => 'No se pudo crear la carpeta', - 'deleteSuccess' => 'Archivo o carpeta eliminado exitosamente', - 'deleteFailed' => 'No se pudo eliminar el archivo o la carpeta', + 'deleteSuccess' => 'Archivo o carpeta eliminado con éxito', + 'deleteFailed' => 'No se pudo eliminar el archivo o carpeta', 'fileReadFailed' => 'No se pudo leer el archivo', 'fileContentLoadFailed' => 'No se pudo cargar el contenido del archivo', - 'fileSaveSuccess' => 'Archivo guardado exitosamente', + 'fileSaveSuccess' => 'Archivo guardado con éxito', 'fileSaveFailed' => 'No se pudo guardar el archivo', -]; \ No newline at end of file + 'fileTypeNotAllowed' => '¡No puedes crear este tipo de archivo!', + 'fileTypeEditNotAllowed' => '¡No puedes editar este tipo de archivo!' +];
modules/Fileeditor/Language/fr/Fileeditor.php+20 −21 modified@@ -1,31 +1,30 @@ <?php - return [ - 'fileEditor' => 'Éditeur de fichiers', - 'renameFailed' => 'Le nom du fichier n\'a pas pu être modifié', + 'fileEditor' => 'Éditeur de Fichiers', + 'renameFailed' => 'Impossible de renommer le fichier', 'invalidSource' => 'Fichier ou dossier source invalide', - 'moveFailed' => 'Le fichier ou le dossier n\'a pas pu être déplacé', + 'moveFailed' => 'Impossible de déplacer le fichier ou le dossier', 'invalidFileOrFolder' => 'Fichier ou dossier invalide', - 'folderNotEmpty' => 'Le dossier n\'est pas vide ou la suppression a échoué !', + 'folderNotEmpty' => 'Le dossier n\'est pas vide ou la suppression a échoué !', 'path' => 'Chemin', - 'file' => 'Déposer', - 'create' => 'Créer', - 'update' => 'Mise à jour', + 'file' => 'Fichier', + 'newFile' => 'Nouveau Fichier', + 'newFolder' => 'Nouveau Dossier', + 'rename' => 'Renommer', 'delete' => 'Supprimer', - 'invalidFile' => 'Fichier invalide', - 'invalidPath' => 'Chemin invalide', - 'renameSuccess' => 'Le nom du fichier a été modifié avec succès', - 'newFileName' => 'Nouveau nom de fichier :', - 'newFile' => 'Nouveau fichier', + 'renameSuccess' => 'Fichier renommé avec succès', + 'newFileName' => 'Nouveau nom de fichier :', 'fileCreated' => 'Fichier créé avec succès', - 'fileCreateFailed' => 'Le fichier n\'a pas pu être créé', - 'newFolderName' => 'Nouveau nom de dossier :', + 'fileCreateFailed' => 'Impossible de créer le fichier', + 'newFolderName' => 'Nouveau nom de dossier :', 'folderCreated' => 'Dossier créé avec succès', - 'folderCreateFailed' => 'Le dossier n\'a pas pu être créé', + 'folderCreateFailed' => 'Impossible de créer le dossier', 'deleteSuccess' => 'Fichier ou dossier supprimé avec succès', - 'deleteFailed' => 'Le fichier ou le dossier n\'a pas pu être supprimé', - 'fileReadFailed' => 'Le fichier n\'a pas pu être lu', - 'fileContentLoadFailed' => 'Le contenu du fichier n\'a pas pu être chargé', + 'deleteFailed' => 'Impossible de supprimer le fichier ou le dossier', + 'fileReadFailed' => 'Impossible de lire le fichier', + 'fileContentLoadFailed' => 'Impossible de charger le contenu du fichier', 'fileSaveSuccess' => 'Fichier enregistré avec succès', - 'fileSaveFailed' => 'Le fichier n\'a pas pu être enregistré', -]; \ No newline at end of file + 'fileSaveFailed' => 'Impossible d\'enregistrer le fichier', + 'fileTypeNotAllowed' => 'Vous ne pouvez pas créer ce type de fichier !', + 'fileTypeEditNotAllowed' => 'Vous ne pouvez pas modifier ce type de fichier !' +];
modules/Fileeditor/Language/hi/Fileeditor.php+10 −11 modified@@ -1,5 +1,4 @@ <?php - return [ 'fileEditor' => 'फ़ाइल संपादक', 'renameFailed' => 'फ़ाइल का नाम बदला नहीं जा सका', @@ -9,23 +8,23 @@ 'folderNotEmpty' => 'फ़ोल्डर खाली नहीं है या हटाना विफल रहा!', 'path' => 'पथ', 'file' => 'फ़ाइल', - 'create' => 'बनाएं', - 'update' => 'अद्यतन', - 'delete' => 'मिटाना', - 'invalidFile' => 'अमान्य लेख्यपत्र', - 'invalidPath' => 'अवैध्य मार्ग', - 'renameSuccess' => 'फ़ाइल का नाम सफलतापूर्वक बदला गया', - 'newFileName' => 'नया फ़ाइल नाम:', 'newFile' => 'नई फ़ाइल', + 'newFolder' => 'नया फ़ोल्डर', + 'rename' => 'नाम बदलें', + 'delete' => 'हटाएं', + 'renameSuccess' => 'फ़ाइल का नाम सफलतापूर्वक बदला गया', + 'newFileName' => 'नई फ़ाइल का नाम:', 'fileCreated' => 'फ़ाइल सफलतापूर्वक बनाई गई', 'fileCreateFailed' => 'फ़ाइल नहीं बनाई जा सकी', - 'newFolderName' => 'नये फ़ोल्डर का नाम:', + 'newFolderName' => 'नया फ़ोल्डर नाम:', 'folderCreated' => 'फ़ोल्डर सफलतापूर्वक बनाया गया', 'folderCreateFailed' => 'फ़ोल्डर नहीं बनाया जा सका', 'deleteSuccess' => 'फ़ाइल या फ़ोल्डर सफलतापूर्वक हटा दिया गया', 'deleteFailed' => 'फ़ाइल या फ़ोल्डर को हटाया नहीं जा सका', - 'fileReadFailed' => 'फ़ाइल पढ़ी नहीं जा सकी', + 'fileReadFailed' => 'फ़ाइल नहीं पढ़ी जा सकी', 'fileContentLoadFailed' => 'फ़ाइल सामग्री लोड नहीं की जा सकी', 'fileSaveSuccess' => 'फ़ाइल सफलतापूर्वक सहेजी गई', 'fileSaveFailed' => 'फ़ाइल सहेजी नहीं जा सकी', -]; \ No newline at end of file + 'fileTypeNotAllowed' => 'आप इस फ़ाइल प्रकार को नहीं बना सकते!', + 'fileTypeEditNotAllowed' => 'आप इस फ़ाइल प्रकार को संपादित नहीं कर सकते!' +];
modules/Fileeditor/Language/ja/Fileeditor.php+20 −21 modified@@ -1,31 +1,30 @@ <?php - return [ 'fileEditor' => 'ファイルエディタ', 'renameFailed' => 'ファイル名を変更できませんでした', - 'invalidSource' => '無効なソース ファイルまたはフォルダー', - 'moveFailed' => 'ファイルまたはフォルダーを移動できませんでした', - 'invalidFileOrFolder' => '無効なファイルまたはフォルダー', - 'folderNotEmpty' => 'フォルダーが空ではないか、削除に失敗しました。', + 'invalidSource' => '無効なソースファイルまたはフォルダ', + 'moveFailed' => 'ファイルまたはフォルダを移動できませんでした', + 'invalidFileOrFolder' => '無効なファイルまたはフォルダ', + 'folderNotEmpty' => 'フォルダが空でないか、削除に失敗しました!', 'path' => 'パス', 'file' => 'ファイル', - 'create' => '作成する', - 'update' => 'アップデート', - 'delete' => '消去', - 'invalidFile' => '無効なファイル', - 'invalidPath' => '無効なパス', - 'renameSuccess' => 'ファイル名が正常に変更されました', - 'newFileName' => '新しいファイル名:', 'newFile' => '新しいファイル', + 'newFolder' => '新しいフォルダ', + 'rename' => '名前変更', + 'delete' => '削除', + 'renameSuccess' => 'ファイル名が正常に変更されました', + 'newFileName' => '新しいファイル名:', 'fileCreated' => 'ファイルが正常に作成されました', 'fileCreateFailed' => 'ファイルを作成できませんでした', - 'newFolderName' => '新しいフォルダー名:', - 'folderCreated' => 'フォルダーが正常に作成されました', - 'folderCreateFailed' => 'フォルダーを作成できませんでした', - 'deleteSuccess' => 'ファイルまたはフォルダーが正常に削除されました', - 'deleteFailed' => 'ファイルまたはフォルダーを削除できませんでした', - 'fileReadFailed' => 'ファイルを読み取れませんでした', - 'fileContentLoadFailed' => 'ファイルの内容をロードできませんでした', - 'fileSaveSuccess' => 'ファイルは正常に保存されました', + 'newFolderName' => '新しいフォルダ名:', + 'folderCreated' => 'フォルダが正常に作成されました', + 'folderCreateFailed' => 'フォルダを作成できませんでした', + 'deleteSuccess' => 'ファイルまたはフォルダが正常に削除されました', + 'deleteFailed' => 'ファイルまたはフォルダを削除できませんでした', + 'fileReadFailed' => 'ファイルを読み込めませんでした', + 'fileContentLoadFailed' => 'ファイルの内容を読み込めませんでした', + 'fileSaveSuccess' => 'ファイルが正常に保存されました', 'fileSaveFailed' => 'ファイルを保存できませんでした', -]; \ No newline at end of file + 'fileTypeNotAllowed' => 'このファイルタイプは作成できません!', + 'fileTypeEditNotAllowed' => 'このファイルタイプは編集できません!' +];
modules/Fileeditor/Language/pt/Fileeditor.php+13 −14 modified@@ -1,31 +1,30 @@ <?php - return [ - 'fileEditor' => 'Editor de arquivos', - 'renameFailed' => 'O nome do arquivo não pôde ser alterado', + 'fileEditor' => 'Editor de Arquivos', + 'renameFailed' => 'Não foi possível renomear o arquivo', 'invalidSource' => 'Arquivo ou pasta de origem inválido', - 'moveFailed' => 'Não foi possível mover o arquivo ou a pasta', + 'moveFailed' => 'Não foi possível mover o arquivo ou pasta', 'invalidFileOrFolder' => 'Arquivo ou pasta inválido', 'folderNotEmpty' => 'A pasta não está vazia ou a exclusão falhou!', 'path' => 'Caminho', 'file' => 'Arquivo', - 'create' => 'Criar', - 'update' => 'Atualizar', + 'newFile' => 'Novo Arquivo', + 'newFolder' => 'Nova Pasta', + 'rename' => 'Renomear', 'delete' => 'Excluir', - 'invalidFile' => 'Arquivo inválido', - 'invalidPath' => 'Caminho inválido', - 'renameSuccess' => 'Nome do arquivo alterado com sucesso', - 'newFileName' => 'Novo nome de arquivo:', - 'newFile' => 'Novo arquivo', + 'renameSuccess' => 'Arquivo renomeado com sucesso', + 'newFileName' => 'Novo nome do arquivo:', 'fileCreated' => 'Arquivo criado com sucesso', 'fileCreateFailed' => 'Não foi possível criar o arquivo', 'newFolderName' => 'Novo nome da pasta:', 'folderCreated' => 'Pasta criada com sucesso', 'folderCreateFailed' => 'Não foi possível criar a pasta', 'deleteSuccess' => 'Arquivo ou pasta excluído com sucesso', - 'deleteFailed' => 'Não foi possível excluir o arquivo ou a pasta', + 'deleteFailed' => 'Não foi possível excluir o arquivo ou pasta', 'fileReadFailed' => 'Não foi possível ler o arquivo', 'fileContentLoadFailed' => 'Não foi possível carregar o conteúdo do arquivo', 'fileSaveSuccess' => 'Arquivo salvo com sucesso', - 'fileSaveFailed' => 'O arquivo não pôde ser salvo', -]; \ No newline at end of file + 'fileSaveFailed' => 'Não foi possível salvar o arquivo', + 'fileTypeNotAllowed' => 'Você não pode criar este tipo de arquivo!', + 'fileTypeEditNotAllowed' => 'Você não pode editar este tipo de arquivo!' +];
modules/Fileeditor/Language/ru/Fileeditor.php+14 −15 modified@@ -1,31 +1,30 @@ <?php - return [ 'fileEditor' => 'Редактор файлов', - 'renameFailed' => 'Имя файла не может быть изменено', + 'renameFailed' => 'Не удалось переименовать файл', 'invalidSource' => 'Неверный исходный файл или папка', - 'moveFailed' => 'Файл или папку не удалось переместить.', + 'moveFailed' => 'Не удалось переместить файл или папку', 'invalidFileOrFolder' => 'Неверный файл или папка', - 'folderNotEmpty' => 'Папка не пуста или удаление не удалось!', + 'folderNotEmpty' => 'Папка не пуста или ошибка удаления!', 'path' => 'Путь', 'file' => 'Файл', - 'create' => 'Создавать', - 'update' => 'Обновлять', + 'newFile' => 'Новый файл', + 'newFolder' => 'Новая папка', + 'rename' => 'Переименовать', 'delete' => 'Удалить', - 'invalidFile' => 'Неверный файл', - 'invalidPath' => 'Неверный путь', - 'renameSuccess' => 'Имя файла успешно изменено', + 'renameSuccess' => 'Файл успешно переименован', 'newFileName' => 'Новое имя файла:', - 'newFile' => 'Новый файл', 'fileCreated' => 'Файл успешно создан', - 'fileCreateFailed' => 'Файл не может быть создан', + 'fileCreateFailed' => 'Не удалось создать файл', 'newFolderName' => 'Новое имя папки:', 'folderCreated' => 'Папка успешно создана', 'folderCreateFailed' => 'Не удалось создать папку', 'deleteSuccess' => 'Файл или папка успешно удалены', 'deleteFailed' => 'Не удалось удалить файл или папку', - 'fileReadFailed' => 'Файл не может быть прочитан', - 'fileContentLoadFailed' => 'Содержимое файла не удалось загрузить.', + 'fileReadFailed' => 'Не удалось прочитать файл', + 'fileContentLoadFailed' => 'Не удалось загрузить содержимое файла', 'fileSaveSuccess' => 'Файл успешно сохранен', - 'fileSaveFailed' => 'Файл не удалось сохранить', -]; \ No newline at end of file + 'fileSaveFailed' => 'Не удалось сохранить файл', + 'fileTypeNotAllowed' => 'Вы не можете создать этот тип файла!', + 'fileTypeEditNotAllowed' => 'Вы не можете редактировать этот тип файла!' +];
modules/Fileeditor/Language/tr/Fileeditor.php+8 −6 modified@@ -6,12 +6,12 @@ 'moveFailed' => 'Dosya veya klasör taşınamadı', 'invalidFileOrFolder' => 'Geçersiz dosya veya klasör', 'folderNotEmpty' => 'Klasörün içi boş değil veya silme işlemi başarısız!', - 'path'=>'Yol', - 'file'=>'Dosya', - 'newFile'=>'Yeni Dosya', - 'newFolder'=>'Yeni Klasör', - 'rename'=>'Yeniden Adlandır', - 'delete'=>'Sil', + 'path' => 'Yol', + 'file' => 'Dosya', + 'newFile' => 'Yeni Dosya', + 'newFolder' => 'Yeni Klasör', + 'rename' => 'Yeniden Adlandır', + 'delete' => 'Sil', 'renameSuccess' => 'Dosya adı başarıyla değiştirildi', 'newFileName' => 'Yeni dosya adı:', 'fileCreated' => 'Dosya başarıyla oluşturuldu', @@ -25,4 +25,6 @@ 'fileContentLoadFailed' => 'Dosya içeriği yüklenemedi', 'fileSaveSuccess' => 'Dosya başarıyla kaydedildi', 'fileSaveFailed' => 'Dosya kaydedilemedi', + 'fileTypeNotAllowed' => 'Bu dosya tipini oluşturamazsınız!', + 'fileTypeEditNotAllowed' => 'Bu dosya tipini düzenleyemezsiniz!' ];
modules/Fileeditor/Language/zh/Fileeditor.php+15 −16 modified@@ -1,31 +1,30 @@ <?php - return [ 'fileEditor' => '文件编辑器', - 'renameFailed' => '文件名无法更改', - 'invalidSource' => '源文件或文件夹无效', + 'renameFailed' => '无法重命名文件', + 'invalidSource' => '无效的源文件或文件夹', 'moveFailed' => '无法移动文件或文件夹', - 'invalidFileOrFolder' => '文件或文件夹无效', + 'invalidFileOrFolder' => '无效的文件或文件夹', 'folderNotEmpty' => '文件夹不为空或删除失败!', - 'path' => '小路', + 'path' => '路径', 'file' => '文件', - 'create' => '创造', - 'update' => '更新', + 'newFile' => '新文件', + 'newFolder' => '新文件夹', + 'rename' => '重命名', 'delete' => '删除', - 'invalidFile' => '文件无效', - 'invalidPath' => '路径无效', - 'renameSuccess' => '文件名更改成功', + 'renameSuccess' => '文件重命名成功', 'newFileName' => '新文件名:', - 'newFile' => '新文件', 'fileCreated' => '文件创建成功', 'fileCreateFailed' => '无法创建文件', - 'newFolderName' => '新文件夹名称:', + 'newFolderName' => '新文件夹名:', 'folderCreated' => '文件夹创建成功', 'folderCreateFailed' => '无法创建文件夹', 'deleteSuccess' => '文件或文件夹删除成功', - 'deleteFailed' => '文件或文件夹无法删除', - 'fileReadFailed' => '文件无法读取', + 'deleteFailed' => '无法删除文件或文件夹', + 'fileReadFailed' => '无法读取文件', 'fileContentLoadFailed' => '无法加载文件内容', 'fileSaveSuccess' => '文件保存成功', - 'fileSaveFailed' => '文件无法保存', -]; \ No newline at end of file + 'fileSaveFailed' => '无法保存文件', + 'fileTypeNotAllowed' => '您无法创建此文件类型!', + 'fileTypeEditNotAllowed' => '您无法编辑此文件类型!' +];
README.md+10 −0 modified@@ -138,3 +138,13 @@ See `docs/architecture.md` for deeper architectural notes. - `docs/architecture.md` — Architecture, flow, permissions, and extension guidance. Questions or contributions? Open an issue or pull request. + +## 🏆 Security Hall of Fame + +A huge thank you to the security researchers who have helped make **ci4ms** more secure by finding and reporting vulnerabilities. + +| Contributor | Contribution | Date | +| :--- | :--- | :--- | +| **[Lars van Mil](https://github.com/Far-Horizons)** | Identified Critical RCE and Information Disclosure vulnerabilities. | Jan 2026 | + +> If you find a security vulnerability, please report it via [Security Policy](SECURITY.md).
Vulnerability mechanics
Generated by null/stub on May 9, 2026. Inputs: CWE entries + fix-commit diffs from this CVE's patches. Citations validated against bundle.
References
4- github.com/advisories/GHSA-654x-9q7r-g966ghsaADVISORY
- nvd.nist.gov/vuln/detail/CVE-2026-25509ghsaADVISORY
- github.com/ci4-cms-erp/ci4ms/commit/86be2930d1c54eb7575102563302b2f3bafcb653ghsax_refsource_MISCWEB
- github.com/ci4-cms-erp/ci4ms/security/advisories/GHSA-654x-9q7r-g966ghsax_refsource_CONFIRMWEB
News mentions
0No linked articles in our index yet.