Browse Source

improved writable directory checking

Roman 1 week ago
parent
commit
fcccf18644
2 changed files with 33 additions and 5 deletions
  1. 25 5
      Core/Documents/Install.class.php
  2. 8 0
      Core/core.php

+ 25 - 5
Core/Documents/Install.class.php

@@ -235,11 +235,31 @@ namespace Documents\Install {
       $success = true;
       $failedRequirements = array();
 
-      // TODO: rather give a list of directories which have to be writable
-      // this should be: /Site/Cache, /Site/Logs, /Core/External/vendor, /react/dist/
-      // also likely: /react and /Site/API for cli.php
-      if (!is_writeable(WEBROOT)) {
-        $failedRequirements[] = sprintf("<b>%s</b> is not writeable. Try running <b>chmod 700 %s</b>", WEBROOT, WEBROOT);
+      $requiredDirectories = [
+        "/Site/Cache",
+        "/Site/Logs",
+        "/Site/Configuration",
+        "/Core/External/vendor",
+        "/files/uploaded",
+      ];
+
+      $nonWritableDirectories = [];
+      foreach ($requiredDirectories as $directory) {
+        if (!is_writeable(WEBROOT . $directory)) {
+          $nonWritableDirectories[] = $directory;
+        }
+      }
+
+      if (!empty($nonWritableDirectories)) {
+        $currentUser = getCurrentUsername();
+        if (function_exists("posix_getuid")) {
+          $currentUser .= " (uid: " . posix_getuid() . ")";
+        }
+
+        $failedRequirements[] = "One or more directories are not writable. " .
+          "Make sure the current user $currentUser has write-access to following locations:" .
+          $this->createUnorderedList($nonWritableDirectories);
+
         $success = false;
       }
 

+ 8 - 0
Core/core.php

@@ -298,6 +298,14 @@ function isClass(string $str): bool {
   return is_file($path) && class_exists($str);
 }
 
+function getCurrentUsername(): string {
+  if (function_exists("posix_getpwuid") && function_exists("posix_geteuid")) {
+    return posix_getpwuid(posix_geteuid())['name'];
+  }
+
+  return exec('whoami') ?? "Unknown";
+}
+
 function rrmdir(string $dir): void {
   if (is_dir($dir)) {
     $objects = scandir($dir);