Saltar a contenido

Gestor de archivos

El gestor de archivos es elFinder: el cliente va en src/statics/plugins/elfinder/ y el conector, por Composer (studio-42/elfinder). Los dos tienen que ir en la misma versión. Lo monta PiecesPHP\FileManager\Controllers\FileManagerController, y se apaga con la constante FILE_MANAGER_MODULE (src/app/config/constants.php).

Las dos rutas

Gestor general Gestor del editor
Vista filemanager-admin-filemanager filemanager-admin-filemanager-rich-editor
Conector filemanager-admin-filemanager-configuration filemanager-admin-filemanager-configuration-rich-editor
Quién entra Solo el usuario principal Todos los tipos de usuario
Carpetas files, documents y statics/uploads, con sus papeleras documents y su papelera
Tipos que se suben Todos Lista cerrada (abajo)
Comandos apagados chmod chmod, extract, archive, mkfile, put, edit
Subir por URL Sí No

El gestor del editor es el que abre CKEditor al insertar una imagen o enlazar un archivo. Si cambias su configuración, prueba insertar desde el editor de una publicación.

Qué se puede subir por el editor

FileManagerController::EDITOR_UPLOAD_ALLOWED: JPEG, PNG, GIF, WebP, PDF, texto plano, CSV, los formatos de Office (.doc, .docx, .xls, .xlsx, .ppt, .pptx), OpenDocument de texto y de hoja de cálculo, vídeo MP4 y WebM, y audio MP3, Ogg y WAV.

Decide el tipo detectado en el contenido, no la extensión. Un .jpg con HTML dentro se rechaza. SVG, HTML y XML no entran por esta ruta. Para ampliar la lista, añade el MIME tal como lo detecta el servidor: un .wav, por ejemplo, se detecta como audio/x-wav, y por eso están los dos.

Sin medir con archivos reales: .doc, .xls, .ppt y .mp3. Si uno legítimo se rechaza, mira qué tipo detecta el servidor y añádelo.

Lo activo no se activa

Los archivos con contenido activo (SVG, HTML, XML) se sirven con cabeceras que impiden que se ejecuten al abrirlos. Por eso statics/filemanager/ lleva el mismo .htaccess que las subidas, escrito por ProtectedUploads::writeDenyHtaccess() al arrancar y al abrir el conector. Lo ignora git.

  • .svg, .svgz, .html, .htm, .xhtml, .xml, .xsl y .xslt salen con Content-Security-Policy: sandbox.
  • Los mismos, salvo .svg y .svgz, salen además como descarga.
  • Un .svg en una etiqueta <img> se sigue viendo.

Limitaciones conocidas

  • Pide Apache con mod_headers y AllowOverride. Con nginx ese .htaccess no aplica: pide esas cabeceras en tu configuración; sin medir en nginx.
  • La carpeta documents es común: un usuario ve lo que subieron los demás en esa carpeta.
  • El usuario principal no tiene lista cerrada: su gestor ve las mismas carpetas y sube cualquier tipo.
  • netmount: su botón se ve, pero no hay controlador que montar. elFinder no da una forma limpia de apagarlo.
  • Un archivo de texto plano llamado .jpg entra como texto y se sirve como imagen, sin activar nada.

La apariencia

elFinder lleva el aspecto del panel, en claro y en oscuro, con una hoja propia del módulo: src/app/classes/PiecesPHP/FileManager/Statics/sass/elfinder-theme.scss, que gulp sass-modules compila a la carpeta css/ hermana y que el controlador carga en las dos vistas, detrás de import_elfinder(). Usa solo las variables del tema (--theme-*, --accent-*, --r-*, --shadow-*, --font-body), así que sigue al modo del usuario sin más trabajo, y sustituye los iconos de elFinder (barra, menú contextual, árbol y tipos de archivo) por la fuente de iconos del panel. Las miniaturas de las imágenes se quedan.

  • Vive fuera de src/statics/plugins/elfinder/ a propósito: esa carpeta se reemplaza entera al actualizar elFinder (abajo), y un tema escrito ahí se perdería.
  • elFinder carga además su propio src/statics/plugins/elfinder/css/theme.css (su opción cssAutoLoad, activa por omisión) aunque ya no esté en la lista de import_elfinder(), y lo carga DESPUÉS de nuestra hoja. Por eso todas sus reglas van dentro de :root: un punto más de especificidad que gana sin tocar el JS de las vistas. Una regla nueva de la hoja, también dentro de :root.
  • La vista del gestor es una tarjeta del panel (ui segment en file-manager.php) que ocupa el alto de la ventana: el alto lo calcula la opción height de file-manager.js al cargar (elFinder lo escribe en línea), con 420 px de mínimo. No se recalcula al redimensionar la ventana.
  • Lo que todavía viene de elFinder: los avisos flotantes (info, error, éxito) con sus colores fijos, las flechas del árbol, el asa de redimensionar y los iconos de la vista rápida.

Añadir una carpeta

structureOptions($dirs, $trashes) arma cada raíz con sus valores seguros: acceptedName (rechaza .php y compañía en cualquier posición del nombre), accessControl y la protección de lo privado. Añade la carpeta en el arreglo $dirs del método del conector que le toque, con alias y relativePath. Si la va a usar alguien que no sea el usuario principal, ponle lista cerrada y comandos apagados como las raíces del editor.

Al actualizar elFinder, copia js/, css/, img/ y sounds/ de src/vendor/studio-42/elfinder/ a src/statics/plugins/elfinder/.