Files
send/AGENTS.md
Julien Cabillot 06a31cd59e
All checks were successful
web/send/pipeline/head This commit looks good
feat: import
2025-12-18 14:35:48 -05:00

33 lines
2.7 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Send.cabillot.eu
Ce projet est une application PHP dont le but est simple :
* Une page HTML d'index principale avec un simple champ pour ajouter un fichier et un boutton `upload`.
* Une page PHP d'administration, ou je peux consulter tout les fichiers envoyes.
Seul les fichiers de moins de 10G sont acceptes.
Les fichiers doivent ensuite etre accessible publiquement via un path hashé qui n'est pas fourni a l'utilisateur qui envoyé le fichier.
Seul la page d'administration permet de voir les liens des fichiers.
## Implementation
L'application tourne via un container dans un cluster kubernetes.
Le serveur utilise doit etre frankenphp.
Les 2 pages web (index et admin) doivent jolies mais ne doivent pas avoir de dependances exterieurs (css, js).
Je pense que seul la page d'administration a besoin de PHP, surement tout le code peut aller dans ce fichier sans besoin d'eclater la logique sur differents fichiers.
## MVP livré
- [`public/index.html`](public/index.html) : page statique avec styles inline, formulaire `multipart/form-data` pointant vers `/admin.php?action=upload`, texte explicatif sur la limite de 10GB et bannière de statut alimentée par `?status=`.
- [`public/admin.php`](public/admin.php) : unique point d'entrée PHP, protège l'accès via HTTP Basic Auth (variables d'environnement `ADMIN_USER` / `ADMIN_PASS`), assure la création de `/upload`, gère `POST action=upload`, stocke les fichiers sous `/upload/YYYY/MM/DD/<hash>/<timestamp-nom>` (hash aléatoire hex), valide les erreurs PHP et la taille <10GB, puis redirige vers la page précédente sans révéler le hash. La vue GET affiche formulaire, état des uploads (nom original, date UTC, taille lisible, MIME `finfo`, slug hashé, lien `/files/...`).
- [`public/php.ini`](public/php.ini) : règles d'upload (10GB) et réglages runtime (`memory_limit`, `max_execution_time`, etc.).
- [`public/files/.gitkeep`](public/files/.gitkeep) : marqueur du répertoire monté côté serveur pour exposer les fichiers uploadés.
## Notes d'exploitation
- Volume : `/upload` doit être persistant et monté également sous `/app/public/files` dans le container FrankenPHP afin que les URLs `/files/...` servent les documents.
- Sécurité : ne jamais exposer l'URL hashée à l'uploadeur. Seule la page admin affiche les liens.
- Limites : `MAX_FILE_BYTES` défini à 10GiB. Les formulaires refusent les fichiers plus gros et redirigent avec `status=toolarge`.
- Authentification : sans variables d'environnement, l'app retourne 500. Fournir `ADMIN_USER` et `ADMIN_PASS` via Kubernetes secrets.
- Journalisation / suivi : les erreurs d'upload utilisent les codes PHP standards et redirigent avec un statut générique pour éviter les fuites d'information.