Você não pode fazer isso: se o usuário puder criar arquivos, eles pertencerão a ele e ele poderá modificá-los e apagá-los.
Eu propunha um esquema simples para ter um diretório intermediário (onde o usuário pode fazer o que ele deseja) e um diretório recebido (não acessível ao usuário), com um pequeno programa privilegiado para mover arquivos do diretório intermediário para o recebido diretório. Mas é realmente complicado fazer o certo: entre outras coisas, você precisa cuidar para que o programa privilegiado não mova arquivos em outros diretórios (cuidado com as condições de corrida, links simbólicos ../
), não substituirá os arquivos existentes ( rename(3)
é atômico, mas pode apagar o destino), não permitirá que o usuário mantenha um descritor de arquivo aberto e modifique o arquivo depois de movido (é melhor copiar do que mover). Em vez disso, vou recomendar uma solução robusta e existente:
- Peça ao usuário que faça o upload do arquivo por HTTP.
- Faça com que o usuário se comprometa com um sistema de controle de versão. Ele também poderá cometer novas versões.