From 2d6a7d952f88a7d6cbfe6f75f74e10db19fa2a23 Mon Sep 17 00:00:00 2001 From: V3ndetta Date: Thu, 22 Oct 2020 13:50:23 +0200 Subject: [PATCH] Added ablility to switch Server-Status-Overview page to public mode - without any login. --- src/lang/en_US.lang.php | 2 ++ src/psm/Module/AbstractController.php | 7 +++++++ .../Config/Controller/ConfigController.php | 2 ++ .../Controller/AbstractServerController.php | 18 +++++++++++++--- .../Server/Controller/StatusController.php | 21 ++++++++++++++++--- .../Module/User/Controller/UserController.php | 2 +- src/psm/Service/Database.php | 2 +- src/psm/Util/Install/Installer.php | 21 +++++++++++++++++++ src/templates/default/main/menu.tpl.html | 18 ++++++++++++++++ .../default/module/config/config.tpl.html | 2 ++ 10 files changed, 87 insertions(+), 8 deletions(-) diff --git a/src/lang/en_US.lang.php b/src/lang/en_US.lang.php index c8e6fbe5..8f2d5464 100644 --- a/src/lang/en_US.lang.php +++ b/src/lang/en_US.lang.php @@ -418,6 +418,7 @@ $sm_lang = array( 'log_retention_days' => 'days', 'user_agent' => 'User Agent', 'user_agent_key_note' => 'Custom user agent used by monitor within communication with external services.', + 'public_status' => 'Make Status-Page public?' ), 'notifications' => array( 'off_sms' => 'Server \'%LABEL%\' is DOWN: ip=%IP%, port=%PORT%. Error=%ERROR%', @@ -518,6 +519,7 @@ $sm_lang = array( 'error_reset_invalid_link' => 'The reset link you provided is invalid.', 'success_password_forgot' => 'An email has been sent to you with information how to reset your password.', 'success_password_reset' => 'Your password has been reset successfully. Please login.', + 'anonymous_username' => 'Anonymous', ), 'error' => array( '401_unauthorized' => 'Unauthorized', diff --git a/src/psm/Module/AbstractController.php b/src/psm/Module/AbstractController.php index 284a0fef..1411e820 100644 --- a/src/psm/Module/AbstractController.php +++ b/src/psm/Module/AbstractController.php @@ -278,8 +278,10 @@ abstract class AbstractController implements ControllerInterface 'label_help' => psm_get_lang('menu', 'help'), 'label_profile' => psm_get_lang('users', 'profile'), 'label_logout' => psm_get_lang('login', 'logout'), + 'label_login' => psm_get_lang('login', 'login'), 'url_profile' => psm_build_url(array('mod' => 'user_profile')), 'url_logout' => psm_build_url(array('logout' => 1)), + 'url_login' => psm_build_url(array('mod' => 'user_profile')), 'label_current' => psm_get_lang('system', 'current'), ); @@ -311,6 +313,11 @@ abstract class AbstractController implements ControllerInterface psm_get_lang('login', 'welcome_usermenu') ); } + else { + $tpl_data['label_usermenu'] = psm_get_lang('login','anonymous_username'); + } + + $tpl_data['ulvl'] = $ulvl; return $this->twig->render('main/menu.tpl.html', $tpl_data); } diff --git a/src/psm/Module/Config/Controller/ConfigController.php b/src/psm/Module/Config/Controller/ConfigController.php index df524c4d..59e05821 100644 --- a/src/psm/Module/Config/Controller/ConfigController.php +++ b/src/psm/Module/Config/Controller/ConfigController.php @@ -58,6 +58,7 @@ class ConfigController extends AbstractController 'log_jabber', 'show_update', 'combine_notifications', + 'public_status', ); /** @@ -641,6 +642,7 @@ class ConfigController extends AbstractController 'label_user_agent' => psm_get_lang('config', 'user_agent'), 'label_user_agent_key_note' => psm_get_lang('config', 'user_agent_key_note'), 'label_site_title' => psm_get_lang('config', 'site_title'), + 'label_public_status' => psm_get_lang('config','public_status'), ); } } diff --git a/src/psm/Module/Server/Controller/AbstractServerController.php b/src/psm/Module/Server/Controller/AbstractServerController.php index 8ae2968c..6debd9fd 100644 --- a/src/psm/Module/Server/Controller/AbstractServerController.php +++ b/src/psm/Module/Server/Controller/AbstractServerController.php @@ -46,12 +46,24 @@ abstract class AbstractServerController extends AbstractController $sql_where = ''; if ($this->getUser()->getUserLevel() > PSM_USER_ADMIN) { - // restrict by user_id - $sql_join = "JOIN `" . PSM_DB_PREFIX . "users_servers` AS `us` ON ( - `us`.`user_id`={$this->getUser()->getUserId()} + if ($this->getUser()->getUserLevel() == PSM_USER_ANONYMOUS && psm_get_conf(public_status) == true) { + // restrict by user_id of anonymous User - if configured to do so + $sql_join = "JOIN `" . PSM_DB_PREFIX . "users_servers` AS `us` ON ( + `us`.`user_id`= 0 AND `us`.`server_id`=`s`.`server_id` )"; + } + else { + // restrict by user_id + $sql_join = "JOIN `" . PSM_DB_PREFIX . "users_servers` AS `us` ON ( + `us`.`user_id`={$this->getUser()->getUserId()} + AND `us`.`server_id`=`s`.`server_id` + )"; + } } + + + if ($server_id !== null) { $server_id = intval($server_id); $sql_where = "WHERE `s`.`server_id`={$server_id} "; diff --git a/src/psm/Module/Server/Controller/StatusController.php b/src/psm/Module/Server/Controller/StatusController.php index d4ee083d..d556d33c 100644 --- a/src/psm/Module/Server/Controller/StatusController.php +++ b/src/psm/Module/Server/Controller/StatusController.php @@ -43,6 +43,12 @@ class StatusController extends AbstractServerController $this->setCSRFKey('status'); $this->setActions(array('index', 'saveLayout'), 'index'); + + /** + * Check for configuration of public available Status-Page + */ + if (psm_get_conf('public_status')) + $this->setMinUserLevelRequired(PSM_USER_ANONYMOUS,array('index')); } /** @@ -92,10 +98,19 @@ class StatusController extends AbstractServerController if ($server['last_offline_nice'] != psm_get_lang('system', 'never')) { $server['last_offline_duration_nice'] = "(" . $server['last_offline_duration'] . ")"; } - $server['url_view'] = psm_build_url( - array('mod' => 'server', 'action' => 'view', 'id' => $server['server_id'], 'back_to' => 'server_status') - ); + /** + * Link Server-Title with detailed Status-Page only when User is NOT Anonymous + */ + if ($this->getUser()->getUserLevel() != PSM_USER_ANONYMOUS) { + $server['url_view'] = psm_build_url( + array('mod' => 'server', 'action' => 'view', 'id' => $server['server_id'], 'back_to' => 'server_status') + ); + } + else + { + $server['url_view'] = psm_build_url(); + } if ($server['status'] == "off") { $layout_data['servers_offline'][] = $server; } elseif ($server['warning_threshold_counter'] > 0) { diff --git a/src/psm/Module/User/Controller/UserController.php b/src/psm/Module/User/Controller/UserController.php index 91f0e423..f6b225e0 100644 --- a/src/psm/Module/User/Controller/UserController.php +++ b/src/psm/Module/User/Controller/UserController.php @@ -102,7 +102,7 @@ class UserController extends AbstractController $users = $this->db->select( PSM_DB_PREFIX . 'users', - null, + 'user_id > 0', array('user_id', 'user_name', 'level', 'name', 'mobile', 'email'), null, array('name') diff --git a/src/psm/Service/Database.php b/src/psm/Service/Database.php index 5d69dd55..d8d04cf9 100644 --- a/src/psm/Service/Database.php +++ b/src/psm/Service/Database.php @@ -435,7 +435,7 @@ class Database } $query = substr($query, 0, -5); } else { - if (strpos($where, '=') === false) { + if ((strpos($where, '=') === false ) && (strpos($where, '>') === false) && (strpos($where, '<') === false)) { // no field given, use primary field $primary = $this->getPrimary($table); $query .= " WHERE `{$table}`.`{$primary}`={$this->quote($where)}"; diff --git a/src/psm/Util/Install/Installer.php b/src/psm/Util/Install/Installer.php index fa011771..20018e02 100644 --- a/src/psm/Util/Install/Installer.php +++ b/src/psm/Util/Install/Installer.php @@ -369,6 +369,9 @@ class Installer if (version_compare($version_from, '3.6.0', '<')) { $this->upgrade360(); } + if (version_compare($version_from, '3.7.0', '<')) { + $this->upgrade370(); + } psm_update_conf('version', $version_to); } @@ -756,4 +759,22 @@ class Installer ADD `discord` ENUM( 'yes','no' ) NOT NULL DEFAULT 'yes' AFTER `sms`;"; $this->execSQL($queries); } + + /** + * Upgrade for v3.7.0 release + * Added support for public Status-Pages + */ + protected function upgrade370() + { + $queries = array(); + $queries[] = "INSERT INTO `" . PSM_DB_PREFIX . "config` (`key`, `value`) VALUE + ('public_status', '0')"; + $queries[] = "INSERT INTO `" . PSM_DB_PREFIX . "users` + (`user_id`, `user_name`, `password`, `password_reset_hash`, `password_reset_timestamp`, `rememberme_token`, `level`, `name`, `mobile`, `discord`, `pushover_key`, `pushover_device`, `webhook_url`, `webhook_json`, `telegram_id`, `jabber`, `email`) + VALUES + ('0', 'anonymous', 'NO_PASSWORD_REQUIRED', NULL, NULL, NULL, '30', 'Anonymous / Public', '', '', '', '', '', '{\"text\":\"servermon: #message\"}', '', '', '')"; + $queries[] = "UPDATE `" . PSM_DB_PREFIX . "users` SET `user_id` = '0' WHERE `monitor_users`.`user_id` = 3"; + $this->execSQL($queries); + } + } diff --git a/src/templates/default/main/menu.tpl.html b/src/templates/default/main/menu.tpl.html index c3621554..bae44660 100644 --- a/src/templates/default/main/menu.tpl.html +++ b/src/templates/default/main/menu.tpl.html @@ -19,6 +19,7 @@ \ No newline at end of file diff --git a/src/templates/default/module/config/config.tpl.html b/src/templates/default/module/config/config.tpl.html index ffb36a54..ecdb4ac1 100644 --- a/src/templates/default/module/config/config.tpl.html +++ b/src/templates/default/module/config/config.tpl.html @@ -62,6 +62,8 @@ {{ macro.input_field("text", "password_encrypt_key", null, "password_encrypt_key", label_password_encrypt_key, password_encrypt_key, "cab03a766...", "40", "password_encrypt_key_help", label_password_encrypt_key_note) }} {{ macro.input_field("text", "user_agent", null, "user_agent", label_user_agent, user_agent, "Mozilla/5.0...", "255", "user_agent_key_help", label_user_agent_key_note) }} + + {{ macro.input_checkbox("public_status","public_status[]", label_public_status, public_status_checked) }}