]> jfr.im git - irc/unrealircd/unrealircd-webpanel.git/blobdiff - common.php
Setup major reshuffle: split up in pre-auth: backend & user creation, and
[irc/unrealircd/unrealircd-webpanel.git] / common.php
index e4844b682cfefd9aa6f679ec3f8ee4edb3b07b8d..620d7a06b49ee6cd8de677ee03b11ab5268b6b8b 100644 (file)
@@ -24,24 +24,149 @@ function get_config($setting)
        return $item;
 }
 
-/* Load config defaults */
-$config = Array();
-require_once UPATH . "/config/config.defaults.php";
+function page_requires_no_config()
+{
+       if (str_ends_with($_SERVER['SCRIPT_FILENAME'],"install.php") ||
+           str_ends_with($_SERVER['SCRIPT_FILENAME'],"installation.php"))
+       {
+               return TRUE;
+       }
+       return FALSE;
+}
 
-if (!file_exists(UPATH."/config/config.php") && file_exists(UPATH."/config.php"))
+function read_config_file()
 {
-       require_once UPATH . "/config.php";
-       require_once UPATH . "/config/compat.php";
-} else
-if (str_ends_with($_SERVER['SCRIPT_FILENAME'],"install.php"))
+       GLOBAL $config;
+
+       $config = Array();
+       if (!file_exists(UPATH."/config/config.php") && file_exists(UPATH."/config.php"))
+       {
+               require_once UPATH . "/config.php";
+               require_once UPATH . "/config/compat.php";
+       }
+}
+
+function read_config_db()
 {
-       /* Allow empty conf */
-} else
+       GLOBAL $config;
+
+       if (page_requires_no_config())
+               return;
+
+       $merge = DbSettings::get();
+       /* DB settings overwrite config.php keys: */
+       $config = array_merge($config, $merge);
+}
+
+function config_is_file_item($name)
 {
-       require_once UPATH . "/config/config.php";
+       // TODO: move 'unrealircd' and 'plugins' probably ;)
+       if (($name == "unrealircd") ||
+           ($name == "plugins") ||
+           ($name == "mysql") ||
+           ($name == "base_url"))
+       {
+               return true;
+       }
+       return false;
+}
+
+function write_config_file()
+{
+       GLOBAL $config;
+
+       $file_settings = [];
+       foreach($config as $k=>$v)
+       {
+               if (config_is_file_item($k))
+                       $file_settings[$k] = $v;
+       }
+
+       $cfg_filename = UPATH.'/config/config.php';
+       $tmpfile = UPATH.'/config/config.tmp.'.bin2hex(random_bytes(8)).'.php';
+       $fd = fopen($tmpfile, "w");
+       if (!$fd)
+               die("Could not write to temporary config file $tmpfile.<br>We need write permissions on the config/ directory!<br>");
+
+       $str = var_export($file_settings, true);
+       if ($str === null)
+               die("Error while running write_config_file() -- weird!");
+       if (!fwrite($fd, "<?php\n".
+                   "/* This config file is written automatically by the UnrealIRCd webpanel.\n".
+                   " * You are not really supposed to edit it manually.\n".
+                   " */\n".
+                   '$config = '.$str.";\n"))
+       {
+               die("Error writing to config file $tmpfile (on fwrite).<br>");
+       }
+       if (!fclose($fd))
+               die("Error writing to config file $tmpfile (on close).<br>");
+       /* Now atomically rename the file */
+       if (!rename($tmpfile, $cfg_filename))
+               die("Could not write (rename) to file ".$cfg_filename."<br>");
+       opcache_invalidate($cfg_filename);
+
+       /* Do not re-read config, as it would reinitialize config
+        * without having the DB settings read. (And it also
+        * serves no purpose)
+        */
+       return true;
+}
+
+// XXX: handle unsetting of config items :D - explicit unset function ?
+
+function write_config($setting = null)
+{
+       GLOBAL $config;
+
+       /* Specific request? Easy, write only this setting to the DB (never used for file) */
+       if ($setting !== null)
+       {
+               return DbSettings::set($k, $v);
+       }
+
+       /* Otherwise write the whole config.
+        * TODO: avoid writing settings file if unneeded,
+        *       as it is more noisy than db settings.
+        */
+       $db_settings = [];
+
+       foreach($config as $k=>$v)
+       {
+               if (!config_is_file_item($k))
+                       $db_settings[$k] = $v;
+       }
+
+       if (!write_config_file())
+               return false;
+
+       foreach($db_settings as $k=>$v)
+       {
+               $ret = DbSettings::set($k, $v);
+               if (!$ret)
+                       return $ret;
+       }
+
+       return true;
+}
+
+/* Now read the config, and redirect to install screen if we don't have it */
+if (!read_config_file())
+{
+       if (page_requires_no_config())
+       {
+               /* Allow empty conf */
+       } else
+       if (!file_exists(UPATH."/config/config.php") && !file_exists(UPATH."/config.php"))
+       {
+               header("Location: settings/install.php");
+               die();
+       } else
+       {
+               require_once UPATH . "/config/config.php";
+       }
 }
 
-if (!get_config("base_url")) die("You need to define the base_url in config/config.php");
 require_once "Classes/class-hook.php";
 if (!is_dir(UPATH . "/vendor"))
        die("The vendor/ directory is missing. Most likely the admin forgot to run 'composer install'\n");
@@ -59,6 +184,13 @@ require_once UPATH . "/Classes/class-rpc.php";
 require_once UPATH . "/Classes/class-paneluser.php";
 require_once UPATH . "/plugins.php";
 
+/* Now that plugins are loaded, read config from DB */
+read_config_db();
+
+/* And a check... */
+if (!page_requires_no_config() && !get_config("base_url"))
+       die("The base_url was not found in your config. Setup went wrong?");
+
 $pages = [
        "Overview"     => "",
        "Users"        => "users",
@@ -82,7 +214,7 @@ $pages = [
 
 if (is_auth_provided())
 {
-       $pages["Settings"]["Panel Access"] = "settings";
+       $pages["Settings"]["Accounts"] = "settings";
 
        $user = unreal_get_current_user();
        if ($user)