From 0c29b6791a18f14f06bd32a3013149f4a09a9d01 Mon Sep 17 00:00:00 2001 From: Nls Date: Wed, 24 Aug 2016 15:24:56 +0200 Subject: [PATCH 1/4] Add header_name & header_value to the server object --- src/includes/psmconfig.inc.php | 2 +- .../Controller/AbstractServerController.php | 2 ++ .../Server/Controller/ServerController.php | 4 ++++ src/psm/Util/Install/Installer.php | 16 +++++++++++++++- src/psm/Util/Server/UpdateManager.php | 4 ++-- src/psm/Util/Server/Updater/StatusNotifier.php | 2 +- src/psm/Util/Server/Updater/StatusUpdater.php | 2 +- .../default/module/server/server/update.tpl.html | 7 +++++++ 8 files changed, 33 insertions(+), 6 deletions(-) diff --git a/src/includes/psmconfig.inc.php b/src/includes/psmconfig.inc.php index 6b8b0b03..0460e887 100644 --- a/src/includes/psmconfig.inc.php +++ b/src/includes/psmconfig.inc.php @@ -29,7 +29,7 @@ /** * Current PSM version */ -define('PSM_VERSION', '3.2.0'); +define('PSM_VERSION', '3.2.1'); /** * URL to check for updates. Will not be checked if turned off on config page. diff --git a/src/psm/Module/Server/Controller/AbstractServerController.php b/src/psm/Module/Server/Controller/AbstractServerController.php index 79069e9c..7dfdb954 100644 --- a/src/psm/Module/Server/Controller/AbstractServerController.php +++ b/src/psm/Module/Server/Controller/AbstractServerController.php @@ -64,6 +64,8 @@ abstract class AbstractServerController extends AbstractController { `s`.`type`, `s`.`label`, `s`.`pattern`, + `s`.`header_name`, + `s`.`header_value`, `s`.`status`, `s`.`error`, `s`.`rtime`, diff --git a/src/psm/Module/Server/Controller/ServerController.php b/src/psm/Module/Server/Controller/ServerController.php index 0fd9a4d1..0af84e6d 100644 --- a/src/psm/Module/Server/Controller/ServerController.php +++ b/src/psm/Module/Server/Controller/ServerController.php @@ -198,6 +198,8 @@ class ServerController extends AbstractServerController { 'edit_value_timeout' => $edit_server['timeout'], 'default_value_timeout' => PSM_CURL_TIMEOUT, 'edit_value_pattern' => $edit_server['pattern'], + 'edit_value_header_name' => $edit_server['header_name'], + 'edit_value_header_value' => $edit_server['header_value'], 'edit_value_warning_threshold' => $edit_server['warning_threshold'], 'edit_website_username' => $edit_server['website_username'], 'edit_website_password' => empty($edit_server['website_password']) ? '' : sha1($edit_server['website_password']), @@ -263,6 +265,8 @@ class ServerController extends AbstractServerController { 'port' => intval(psm_POST('port', 0)), 'type' => psm_POST('type', ''), 'pattern' => psm_POST('pattern', ''), + 'header_name' => psm_POST('header_name', ''), + 'header_value' => psm_POST('header_value', ''), 'warning_threshold' => intval(psm_POST('warning_threshold', 0)), 'active' => in_array($_POST['active'], array('yes', 'no')) ? $_POST['active'] : 'no', 'email' => in_array($_POST['email'], array('yes', 'no')) ? $_POST['email'] : 'no', diff --git a/src/psm/Util/Install/Installer.php b/src/psm/Util/Install/Installer.php index 6c3ee490..2bd1b834 100644 --- a/src/psm/Util/Install/Installer.php +++ b/src/psm/Util/Install/Installer.php @@ -126,7 +126,7 @@ class Installer { $this->log('Populating database...'); $queries = array(); - $queries[] = "INSERT INTO `" . PSM_DB_PREFIX . "servers` (`ip`, `port`, `label`, `type`, `pattern`, `status`, `error`, `rtime`, `last_online`, `last_check`, `active`, `email`, `sms`, `pushover`) VALUES ('http://sourceforge.net/index.php', 80, 'SourceForge', 'website', '', 'on', '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', 'yes', 'yes', 'yes', 'yes'), ('smtp.gmail.com', 465, 'Gmail SMTP', 'service', '', 'on', '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', 'yes', 'yes', 'yes', 'yes')"; + $queries[] = "INSERT INTO `" . PSM_DB_PREFIX . "servers` (`ip`, `port`, `label`, `type`, `pattern`,`status`, `error`, `rtime`, `last_online`, `last_check`, `active`, `email`, `sms`, `pushover`) VALUES ('http://sourceforge.net/index.php', 80, 'SourceForge', 'website', '', 'on', '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', 'yes', 'yes', 'yes', 'yes'), ('smtp.gmail.com', 465, 'Gmail SMTP', 'service', '', 'on', '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', 'yes', 'yes', 'yes', 'yes')"; $queries[] = "INSERT INTO `" . PSM_DB_PREFIX . "users_servers` (`user_id`,`server_id`) VALUES (1, 1), (1, 2);"; $queries[] = "INSERT INTO `" . PSM_DB_PREFIX . "config` (`key`, `value`) VALUE ('language', 'en_US'), @@ -220,6 +220,8 @@ class Installer { `label` varchar(255) NOT NULL, `type` enum('service','website') NOT NULL default 'service', `pattern` varchar(255) NOT NULL, + `header_name` varchar(255) NOT NULL default '', + `header_value` varchar(255) NOT NULL default '', `status` enum('on','off') NOT NULL default 'on', `error` varchar(255) NULL, `rtime` FLOAT(9, 7) NULL, @@ -290,6 +292,9 @@ class Installer { if(version_compare($version_from, '3.2.0', '<')) { $this->upgrade320(); } + if(version_compare($version_from, '3.2.1', '<')) { + $this->upgrade321(); + } psm_update_conf('version', $version_to); } @@ -469,4 +474,13 @@ class Installer { // Drop old user_id('s) column $this->execSQL("ALTER TABLE `" . PSM_DB_PREFIX . "log` DROP COLUMN `user_id`;"); } + + /** + * Upgrade for v3.2.1 release + */ + protected function upgrade321() { + $queries = array(); + $queries[] = "ALTER TABLE `" . PSM_DB_PREFIX . "servers` ADD COLUMN `header_name` VARCHAR(255) AFTER `pattern`, ADD COLUMN `header_value` VARCHAR(255) AFTER `header_name`"; + $this->execSQL($queries); + } } diff --git a/src/psm/Util/Server/UpdateManager.php b/src/psm/Util/Server/UpdateManager.php index 13ea2d04..341eadd4 100644 --- a/src/psm/Util/Server/UpdateManager.php +++ b/src/psm/Util/Server/UpdateManager.php @@ -56,13 +56,13 @@ class UpdateManager extends ContainerAware { )"; } - $sql = "SELECT `s`.`server_id`,`s`.`ip`,`s`.`port`,`s`.`label`,`s`.`type`,`s`.`pattern`,`s`.`status`,`s`.`active`,`s`.`email`,`s`.`sms`,`s`.`pushover` + $sql = "SELECT `s`.`server_id`,`s`.`ip`,`s`.`port`,`s`.`label`,`s`.`type`,`s`.`pattern`,`s`.`header_name`,`s`.`header_value`,`s`.`status`,`s`.`active`,`s`.`email`,`s`.`sms`,`s`.`pushover` FROM `".PSM_DB_PREFIX."servers` AS `s` {$sql_join} WHERE `active`='yes' "; $servers = $this->container->get('db')->query($sql); - + $updater = new Updater\StatusUpdater($this->container->get('db')); $notifier = new Updater\StatusNotifier($this->container->get('db')); diff --git a/src/psm/Util/Server/Updater/StatusNotifier.php b/src/psm/Util/Server/Updater/StatusNotifier.php index 0edfde98..be8b332a 100755 --- a/src/psm/Util/Server/Updater/StatusNotifier.php +++ b/src/psm/Util/Server/Updater/StatusNotifier.php @@ -121,7 +121,7 @@ class StatusNotifier { $this->server = $this->db->selectRow(PSM_DB_PREFIX . 'servers', array( 'server_id' => $server_id, ), array( - 'server_id', 'ip', 'port', 'label', 'type', 'pattern', 'status', 'error', 'active', 'email', 'sms', 'pushover', + 'server_id', 'ip', 'port', 'label', 'type', 'pattern', 'status', 'header_name', 'header_value', 'error', 'active', 'email', 'sms', 'pushover', )); if(empty($this->server)) { return false; diff --git a/src/psm/Util/Server/Updater/StatusUpdater.php b/src/psm/Util/Server/Updater/StatusUpdater.php index 84b147e1..31ee1c69 100644 --- a/src/psm/Util/Server/Updater/StatusUpdater.php +++ b/src/psm/Util/Server/Updater/StatusUpdater.php @@ -82,7 +82,7 @@ class StatusUpdater { $this->server = $this->db->selectRow(PSM_DB_PREFIX . 'servers', array( 'server_id' => $server_id, ), array( - 'server_id', 'ip', 'port', 'label', 'type', 'pattern', 'status', 'active', 'warning_threshold', + 'server_id', 'ip', 'port', 'label', 'type', 'pattern', 'header_name', 'header_value', 'status', 'active', 'warning_threshold', 'warning_threshold_counter', 'timeout', 'website_username', 'website_password' )); if(empty($this->server)) { diff --git a/src/templates/default/module/server/server/update.tpl.html b/src/templates/default/module/server/server/update.tpl.html index 2378d21e..d9ce466c 100644 --- a/src/templates/default/module/server/server/update.tpl.html +++ b/src/templates/default/module/server/server/update.tpl.html @@ -63,6 +63,13 @@ +
+ +
+ + +
+
From d9fce758293f3bf5e8d5059dc1d1c21b9652c141 Mon Sep 17 00:00:00 2001 From: Nls Date: Thu, 25 Aug 2016 15:35:32 +0200 Subject: [PATCH 2/4] Add optionnal header check on StatusUpdater --- src/lang/en_US.lang.php | 3 +++ .../Server/Controller/ServerController.php | 3 +++ src/psm/Util/Server/Updater/StatusUpdater.php | 18 ++++++++++++++++++ .../module/server/server/update.tpl.html | 4 ++-- 4 files changed, 26 insertions(+), 2 deletions(-) diff --git a/src/lang/en_US.lang.php b/src/lang/en_US.lang.php index 07c1d5d1..ddbc2259 100755 --- a/src/lang/en_US.lang.php +++ b/src/lang/en_US.lang.php @@ -137,6 +137,9 @@ $sm_lang = array( 'type_service' => 'Service', 'pattern' => 'Search string/pattern', 'pattern_description' => 'If this pattern is not found on the website, the server will be marked offline. Regular expressions are allowed.', + 'header' => 'Header', + 'header_name_description' => 'Header name (case-sensitive)', + 'header_value_description' => 'Header value. Regular expressions are allowed.', 'last_check' => 'Last check', 'last_online' => 'Last online', 'monitoring' => 'Monitoring', diff --git a/src/psm/Module/Server/Controller/ServerController.php b/src/psm/Module/Server/Controller/ServerController.php index 0af84e6d..f86c992f 100644 --- a/src/psm/Module/Server/Controller/ServerController.php +++ b/src/psm/Module/Server/Controller/ServerController.php @@ -452,6 +452,9 @@ class ServerController extends AbstractServerController { 'label_service' => psm_get_lang('servers', 'type_service'), 'label_pattern' => psm_get_lang('servers', 'pattern'), 'label_pattern_description' => psm_get_lang('servers', 'pattern_description'), + 'label_header' => psm_get_lang('servers', 'header'), + 'label_header_name_description' => psm_get_lang('servers', 'header_name_description'), + 'label_header_value_description' => psm_get_lang('servers', 'header_value_description'), 'label_last_check' => psm_get_lang('servers', 'last_check'), 'label_rtime' => psm_get_lang('servers', 'latency'), 'label_last_online' => psm_get_lang('servers', 'last_online'), diff --git a/src/psm/Util/Server/Updater/StatusUpdater.php b/src/psm/Util/Server/Updater/StatusUpdater.php index 31ee1c69..62f91c44 100644 --- a/src/psm/Util/Server/Updater/StatusUpdater.php +++ b/src/psm/Util/Server/Updater/StatusUpdater.php @@ -216,6 +216,24 @@ class StatusUpdater { $result = false; } } + + // Should we check a header ? + if($this->server['header_name'] != '') { + $header_text = substr($curl_result, 0, strpos($curl_result, "\r\n\r\n")); + foreach (explode("\r\n", $header_text) as $i => $line) { + if ($i === 0) + continue; // We skip the status code + else { + list ($key, $value) = explode(': ', $line); + if ($key == $this->server['header_name']) { + if(!preg_match("/{$this->server['header_value']}/i", $value)) { // The value doesn't match what we needed + $result = false; + } + break; // No need to go further + } + } + } + } } } diff --git a/src/templates/default/module/server/server/update.tpl.html b/src/templates/default/module/server/server/update.tpl.html index d9ce466c..a6e62bc9 100644 --- a/src/templates/default/module/server/server/update.tpl.html +++ b/src/templates/default/module/server/server/update.tpl.html @@ -66,8 +66,8 @@
- - + +
From a771bf9392c00505b4b557d0f415ac9d394801c0 Mon Sep 17 00:00:00 2001 From: Nls Date: Fri, 26 Aug 2016 21:50:51 +0200 Subject: [PATCH 3/4] Refactor header checking to be sure that we can't crash this ! --- src/psm/Util/Server/Updater/StatusUpdater.php | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/src/psm/Util/Server/Updater/StatusUpdater.php b/src/psm/Util/Server/Updater/StatusUpdater.php index 62f91c44..b87babd5 100644 --- a/src/psm/Util/Server/Updater/StatusUpdater.php +++ b/src/psm/Util/Server/Updater/StatusUpdater.php @@ -218,21 +218,26 @@ class StatusUpdater { } // Should we check a header ? - if($this->server['header_name'] != '') { - $header_text = substr($curl_result, 0, strpos($curl_result, "\r\n\r\n")); + if($this->server['header_name'] != '' && $this->server['header_value'] != '') { + $header_flag = false; + $header_text = substr($curl_result, 0, strpos($curl_result, "\r\n\r\n")); // Only get the header text if the result also includes the body foreach (explode("\r\n", $header_text) as $i => $line) { - if ($i === 0) - continue; // We skip the status code - else { + if ($i === 0 || strpos($line, ':') == false) { + continue; // We skip the status code & other non-header lines. Needed for proxy or redirects + } else { list ($key, $value) = explode(': ', $line); - if ($key == $this->server['header_name']) { + if (strcasecmp($key, $this->server['header_name']) == 0) { // Header found (case-insensitive) if(!preg_match("/{$this->server['header_value']}/i", $value)) { // The value doesn't match what we needed $result = false; + } else { + $header_flag = true; + break; // No need to go further } - break; // No need to go further } } } + + if(!$header_flag) $result = false; // Header was not present } } } From e23a7c12240ffc67b782700b5245ebfec55b67d6 Mon Sep 17 00:00:00 2001 From: Guillaume Moigneu Date: Fri, 26 Aug 2016 21:58:00 +0200 Subject: [PATCH 4/4] Fix typo on Installer.php --- src/psm/Util/Install/Installer.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/psm/Util/Install/Installer.php b/src/psm/Util/Install/Installer.php index 2bd1b834..e113444e 100644 --- a/src/psm/Util/Install/Installer.php +++ b/src/psm/Util/Install/Installer.php @@ -126,7 +126,7 @@ class Installer { $this->log('Populating database...'); $queries = array(); - $queries[] = "INSERT INTO `" . PSM_DB_PREFIX . "servers` (`ip`, `port`, `label`, `type`, `pattern`,`status`, `error`, `rtime`, `last_online`, `last_check`, `active`, `email`, `sms`, `pushover`) VALUES ('http://sourceforge.net/index.php', 80, 'SourceForge', 'website', '', 'on', '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', 'yes', 'yes', 'yes', 'yes'), ('smtp.gmail.com', 465, 'Gmail SMTP', 'service', '', 'on', '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', 'yes', 'yes', 'yes', 'yes')"; + $queries[] = "INSERT INTO `" . PSM_DB_PREFIX . "servers` (`ip`, `port`, `label`, `type`, `pattern`, `status`, `error`, `rtime`, `last_online`, `last_check`, `active`, `email`, `sms`, `pushover`) VALUES ('http://sourceforge.net/index.php', 80, 'SourceForge', 'website', '', 'on', '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', 'yes', 'yes', 'yes', 'yes'), ('smtp.gmail.com', 465, 'Gmail SMTP', 'service', '', 'on', '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', 'yes', 'yes', 'yes', 'yes')"; $queries[] = "INSERT INTO `" . PSM_DB_PREFIX . "users_servers` (`user_id`,`server_id`) VALUES (1, 1), (1, 2);"; $queries[] = "INSERT INTO `" . PSM_DB_PREFIX . "config` (`key`, `value`) VALUE ('language', 'en_US'),