X-Git-Url: https://jfr.im/git/irc/unrealircd/unrealircd-webpanel.git/blobdiff_plain/caf7fe32faf93fbfcad440b72a0ad4e68f0b4dff..7bcd30edb23fcc1872f0a6772ab91b3c9d8b4779:/inc/common.php diff --git a/inc/common.php b/inc/common.php index 213c142..3bd7823 100644 --- a/inc/common.php +++ b/inc/common.php @@ -1,13 +1,50 @@ ". - "If you already installed PHP8 but are still seeing this error, then it means ". - "apache/nginx/.. is loading an older PHP version. Eg. on Debian/Ubuntu you need ". - "apt-get install libapache2-mod-php8.2 (or a similar version) and ". - "apt-get remove libapache2-mod-php7.4 (or a similar version). ". - "You may also need to choose again the PHP module to load in apache via a2enmod php8.2"); +if (ini_get('output_buffering') == true) { + ini_set('output_buffering', 'off'); +} +if (ini_get('zlib.output_compression') == true) { + ini_set('zlib.output_compression', 'off'); +} + +function check_requirements() +{ + if (version_compare(PHP_VERSION, '8.0.0', '<')) + { + die("This webserver is using PHP version ".PHP_VERSION." but we require at least PHP 8.0.0.
". + "If you already installed PHP8 but are still seeing this error, then it means ". + "apache/nginx/.. is loading an older PHP version. Eg. on Debian/Ubuntu you need ". + "apt-get install libapache2-mod-php8.2 (or a similar version) and ". + "apt-get remove libapache2-mod-php7.4 (or a similar version). ". + "You may also need to choose again the PHP module to load in apache via a2enmod php8.2"); + } -define('UPATH', dirname(dirname(__FILE__))); + $loaded_extensions = get_loaded_extensions(); + $required_extensions = ["mbstring", "sodium"]; + $missing_extensions = []; + foreach ($required_extensions as $mod) + if (!in_array($mod, $loaded_extensions)) + $missing_extensions[] = $mod; + + if (count($missing_extensions) > 0) + { + $text = "The following PHP module(s) need to be loaded:
\n\n"; + $text .= "You need to install/enable these PHP packages and restart the webserver.
". + "If you are on Debian/Ubuntu then run $cmd ". + "and restart your webserver (eg: systemctl restart apache2 for apache)."; + die($text); + } +} + +check_requirements(); /* very early !! */ + +define('UPATH', dirname(__DIR__)); function get_config($setting) { @@ -24,10 +61,46 @@ function get_config($setting) return $item; } +function get_current_page_helper($name, $p, &$title) +{ + if (isset($p["script"])) + { + if (($p["script"] != '') && str_ends_with($_SERVER['SCRIPT_FILENAME'],$p["script"])) + { + // MATCH + if (isset($p["title"])) + $title = $p["title"]; + else + $title = $name; + return $p; + } + return null; + } + foreach ($p as $k=>$v) + { + $ret = get_current_page_helper($k, $v, $title); + if ($ret !== null) + return $ret; + } + return null; +} + +/** Get current page and title */ +function get_current_page(&$title) +{ + GLOBAL $pages; + foreach ($pages as $k=>$v) + { + $ret = get_current_page_helper($k, $v, $title); + if ($ret !== null) + return $ret; + } +} + function page_requires_no_config() { if (str_ends_with($_SERVER['SCRIPT_FILENAME'],"install.php") || - str_ends_with($_SERVER['SCRIPT_FILENAME'],"installation.php")) + str_ends_with($_SERVER['SCRIPT_FILENAME'],"installation.php")) { return TRUE; } @@ -37,7 +110,7 @@ function page_requires_no_config() function page_requires_no_login() { if (str_ends_with($_SERVER['SCRIPT_FILENAME'],"login/index.php") || - page_requires_no_config()) + page_requires_no_config()) { return TRUE; } @@ -59,6 +132,24 @@ function read_config_file() return false; if (isset($config['unrealircd'])) $config_transition_unreal_server = true; + /* Upgrade needed? */ + $plugins_modified = false; + foreach ($config["plugins"] as $k=>$v) + { + if ($v == "sql_auth") + { + $config["plugins"][$k] = "sql_db"; + $plugins_modified = true; + } else + if ($v == "file_auth") + { + $config["plugins"][$k] = "file_db"; + $plugins_modified = true; + } + } + if ($plugins_modified) + write_config_file(); + return true; } @@ -77,9 +168,9 @@ function read_config_db() function config_is_file_item($name) { if (($name == "plugins") || - ($name == "mysql") || - ($name == "base_url") || - ($name == "secrets")) + ($name == "mysql") || + ($name == "base_url") || + ($name == "secrets")) { return true; } @@ -107,10 +198,10 @@ function write_config_file() if ($str === null) die("Error while running write_config_file() -- weird!"); if (!fwrite($fd, ""); } @@ -143,7 +234,7 @@ function write_config($setting = null) /* Otherwise write the whole config. * TODO: avoid writing settings file if unneeded, - * as it is more noisy than db settings. + * as it is more noisy than db settings. */ $db_settings = []; @@ -191,6 +282,53 @@ function generate_secrets() $config['secrets']['key'] = rtrim(base64_encode(sodium_crypto_aead_xchacha20poly1305_ietf_keygen()),'='); } +function get_active_rpc_server() +{ + $servers = get_config("unrealircd"); + if (empty($servers)) + return; + // TODO: make user able to override this - either in user or in session + + foreach ($servers as $displayname=>$e) + { + if (isset($e["default"]) && $e["default"]) + return $displayname; + } + return null; +} + +/* Set a new default RPC server */ +function set_default_rpc_server($name) +{ + GLOBAL $config; + + /* Mark all other servers as non-default */ + foreach ($config["unrealircd"] as $n=>$e) + if ($n != $name) + $config["unrealircd"][$n]["default"] = false; + $config["unrealircd"][$name]["default"] = true; +} + +/* Ensure at least 1 server is default */ +function set_at_least_one_default_rpc_server() +{ + GLOBAL $config; + + $has_default_rpc_server = false; + foreach ($config["unrealircd"] as $name=>$e) + if ($e["default"]) + $has_default_rpc_server = true; + if (!$has_default_rpc_server) + { + /* Make first server in the list the default */ + foreach ($config["unrealircd"] as $name=>$e) + { + $config["unrealircd"][$name]["default"] = true; + break; + } + } +} + function secret_encrypt(string $text) { GLOBAL $config; @@ -236,8 +374,8 @@ function upgrade_check() } /* - encrypting rpc_password */ if (isset($config['unrealircd']) && - isset($config['unrealircd']['rpc_password']) && - !str_starts_with($config['unrealircd']['rpc_password'], "secret:")) + isset($config['unrealircd']['rpc_password']) && + !str_starts_with($config['unrealircd']['rpc_password'], "secret:")) { $ret = secret_encrypt($config['unrealircd']['rpc_password']); if ($ret !== false) @@ -246,6 +384,14 @@ function upgrade_check() write_config('unrealircd'); } } + /* $config["unrealircd"] should be an array now.. */ + if (isset($config['unrealircd']) && isset($config['unrealircd']['rpc_password'])) + { + $config["unrealircd"]["default"] = true; + $config['unrealircd'] = [ + "Primary" => $config['unrealircd']]; + write_config("unrealircd"); + } $version = get_version(); if (!isset($config['webpanel_version'])) @@ -320,7 +466,8 @@ require_once UPATH . "/Classes/class-log.php"; require_once UPATH . "/Classes/class-message.php"; require_once UPATH . "/Classes/class-rpc.php"; require_once UPATH . "/Classes/class-paneluser.php"; -require_once UPATH . "/plugins.php"; +require_once UPATH . "/Classes/class-notes.php"; +require_once UPATH . "/Classes/class-plugins.php"; /* Do various checks and reading, except during setup step 1. */ if (!page_requires_no_config()) @@ -337,44 +484,61 @@ if (!page_requires_no_config()) } $pages = [ - "Overview" => "", - "Users" => "users", - "Channels" => "channels", - "Servers" => "servers", + "Overview" => ["script"=>""], + "Users" => ["script"=>"users/index.php"], + "Channels" => ["script"=>"channels/index.php"], + "Servers" => ["script"=>"servers/index.php"], "Server Bans" => [ - "Server Bans" => "server-bans", - "Name Bans" => "server-bans/name-bans.php", - "Ban Exceptions" => "server-bans/ban-exceptions.php" + "Server Bans" => ["script" => "server-bans/index.php"], + "Name Bans" => ["script" => "server-bans/name-bans.php"], + "Ban Exceptions" => ["script" => "server-bans/ban-exceptions.php"], ], - "Spamfilter" => "spamfilter.php", + "Spamfilter" => ["script" => "server-bans/spamfilter.php"], + "Logs" => ["script" => "logs/index.php"], "Tools" => [ - "IP WHOIS" => "tools/ip-whois.php", + "IP WHOIS" => ["script" => "tools/ip-whois.php","no_irc_server_required"=>true], ], "Settings" => [ - "Plugins" => "settings/plugins.php", + "General Settings" => ["script" => "settings/general.php"], + "RPC Servers" => ["script" => "settings/rpc-servers.php","no_irc_server_required"=>true], ], - - "News" => "news.php", ]; + if (!panel_start_session()) { if (!page_requires_no_login()) { if (!is_auth_provided()) - die("No authentication plugin loaded. You must load either sql_auth, file_auth, or a similar auth plugin!"); + die("No authentication plugin loaded. You must load either sql_db, file_db, or a similar auth plugin!"); $current_page = $_SERVER['REQUEST_URI']; header("Location: ".get_config("base_url")."login/?redirect=".urlencode($current_page)); die; } } else { - $pages["Settings"]["Accounts"] = "settings"; - + $pages["Settings"]["Accounts"] = [ + "script" => "settings/index.php", + "no_irc_server_required"=>true + ]; + if (current_user_can(PERMISSION_MANAGE_USERS)) + { + $pages["Settings"]["Role Editor"] = [ + "script"=>"settings/user-role-edit.php", + "no_irc_server_required"=>true + ]; + } + if (current_user_can(PERMISSION_MANAGE_PLUGINS)) + { + $pages["Settings"]["Plugins"] = ["script" => "settings/plugins.php"]; + } $user = unreal_get_current_user(); if ($user) { /* Add logout page, if logged in */ - $pages["Logout"] = "login/?logout=true"; + $pages["Logout"] = [ + "script"=>"login/?logout=true", + "no_irc_server_required"=>true + ]; } } @@ -397,4 +561,24 @@ Hook::run(HOOKTYPE_NAVBAR, $pages); * $pages[$page_name] = $page_link; * } * } -*/ \ No newline at end of file +*/ + +$current_page = get_current_page($current_page_name); + + +global $rightClickMenu; +$rightClickMenu = [ + [ + "text" => "Copy", + "onclick" => "copy_to_clipboard(window.getSelection().toString())", + "icon" => "fa-clipboard" + ], + [ + "text" => "Paste", + "onclick" => "paste_from_clipboard()", + "icon" => "fa-paint-brush", + ], +]; + +// register our menu +Hook::run(HOOKTYPE_RIGHTCLICK_MENU, $rightClickMenu);