No puede hacer eso: si el usuario puede crear archivos, serán de su propiedad y podrá modificarlos y borrarlos.
Iba a proponer un esquema simple para tener un directorio provisional (donde el usuario puede hacer lo que quiera) y un directorio entrante (no accesible para el usuario), con un pequeño programa privilegiado para mover archivos desde el directorio provisional al entrante directorio. Pero en realidad es difícil hacer lo correcto: entre otras cosas, debe tener cuidado de que el programa privilegiado no mueva archivos en otros directorios (tenga cuidado con las condiciones de carrera, enlaces simbólicos, ../
), no sobrescribirá los archivos existentes ( rename(3)
es atómico pero puede borrar el destino), no permitirá que el usuario mantenga abierto un descriptor de archivo y modifique el archivo después de moverlo (por lo que es mejor copiarlo que moverlo). En cambio, recomendaré tomar una solución sólida existente:
- Haga que el usuario cargue el archivo a través de HTTP.
- Haga que el usuario se comprometa con un sistema de control de versiones. También podrá cometer nuevas versiones.