fix : suppression article — permissions répertoire et gestion d'erreur (v1.6.10)

- mkArticleDir() crée les répertoires avec chmod 0775 explicite (bypass umask)
- delete() retourne bool et détecte l'échec sans reconstruire les index
- removeDir() supprime les warnings PHP (@unlink, @rmdir, @scandir)
- post_view.php affiche un message d'erreur si delete_failed=1
- index.php redirige vers l'article avec ?delete_failed=1 si échec

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-05-15 22:27:24 +02:00
parent 8af2c8e20b
commit 996ab3e508
5 changed files with 44 additions and 12 deletions
+20 -10
View File
@@ -105,8 +105,8 @@ class ArticleManager
$publishedAt = $publishedAt !== '' ? $publishedAt : $now;
$dir = $this->dataDir . '/' . $uuid;
mkdir($dir, 0755, true);
mkdir($dir . '/files', 0755, true);
$this->mkArticleDir($dir);
$this->mkArticleDir($dir . '/files');
$meta = [
'uuid' => $uuid,
@@ -155,7 +155,7 @@ class ArticleManager
if ($contentChanged || $titleChanged) {
$revDir = $this->dataDir . '/' . $uuid . '/revisions';
if (!is_dir($revDir)) {
mkdir($revDir, 0755, true);
$this->mkArticleDir($revDir);
}
$n = count($revisions) + 1;
$revFile = sprintf('%s/%04d.md', $revDir, $n);
@@ -482,7 +482,7 @@ class ArticleManager
$isImage = str_starts_with($mime, 'image/');
$filesDir = $this->dataDir . '/' . $uuid . '/files';
if (!is_dir($filesDir)) {
mkdir($filesDir, 0755, true);
$this->mkArticleDir($filesDir);
}
if ($isImage) {
@@ -806,10 +806,10 @@ class ArticleManager
$this->git?->commit("featured: " . ($meta['title'] ?? $uuid) . " (" . ($featured ? 'on' : 'off') . ")");
}
public function delete(string $uuid): void
public function delete(string $uuid): bool
{
if (!$this->isValidUuid($uuid)) {
return;
return false;
}
$dir = $this->dataDir . '/' . $uuid;
$title = null;
@@ -823,9 +823,13 @@ class ArticleManager
@unlink($this->slugIndexPath());
$this->removeDir($dir);
}
if (is_dir($dir)) {
return false;
}
$this->rebuildSearchIndex();
$this->rebuildBacklinksCache();
$this->git?->commit("delete: " . ($title ?? $uuid));
return true;
}
// ------------------------------------------------------------------ //
@@ -1110,7 +1114,7 @@ class ArticleManager
}
$dir = $this->dataDir . '/' . $uuid . '/files';
if (!is_dir($dir)) {
mkdir($dir, 0755, true);
$this->mkArticleDir($dir);
}
$mime = mime_content_type($uploadedFile['tmp_name']) ?: 'application/octet-stream';
@@ -1370,13 +1374,19 @@ class ArticleManager
*/
private function removeDir(string $dir): void
{
foreach (scandir($dir) as $entry) {
foreach (@scandir($dir) ?: [] as $entry) {
if ($entry === '.' || $entry === '..') {
continue;
}
$path = $dir . '/' . $entry;
is_dir($path) ? $this->removeDir($path) : unlink($path);
is_dir($path) ? $this->removeDir($path) : @unlink($path);
}
rmdir($dir);
@rmdir($dir);
}
private function mkArticleDir(string $path): void
{
mkdir($path, 0777, true);
chmod($path, 0775);
}
}