diff --git a/src/includes/functions.inc.php b/src/includes/functions.inc.php index ebadaa30..15b44abf 100644 --- a/src/includes/functions.inc.php +++ b/src/includes/functions.inc.php @@ -351,7 +351,7 @@ function psm_parse_msg($status, $type, $vars, $combi = false) { * @param string|bool $website_password Password website * @param string|null $request_method Request method like GET, POST etc. * @param string|null $post_field POST data - * @return string cURL result + * @return array ["result" => cURL result, "info" => cURL info array] */ function psm_curl_get($href, $header = false, $body = true, $timeout = null, $add_agent = true, $website_username = false, $website_password = false, $request_method = null, $post_field = null) { ($timeout === null || $timeout > 0) ? PSM_CURL_TIMEOUT : intval($timeout); @@ -401,6 +401,8 @@ function psm_curl_get($href, $header = false, $body = true, $timeout = null, $ad } $result = curl_exec($ch); + $info = curl_getinfo($ch); + curl_close($ch); if(defined('PSM_DEBUG') && PSM_DEBUG === true && psm_is_cli()) { @@ -409,7 +411,7 @@ function psm_curl_get($href, $header = false, $body = true, $timeout = null, $ad echo PHP_EOL.'==============END cURL Resul for: '.$href.'==========================================='.PHP_EOL; } - return $result; + return ["result" => $result, "info" => $info]; } /** @@ -477,7 +479,7 @@ function psm_update_available() { // been more than a week since update, lets go // update last check date psm_update_conf('last_update_check', time()); - $latest = psm_curl_get(PSM_UPDATE_URL); + $latest = psm_curl_get(PSM_UPDATE_URL)["result"]; // extract latest version from Github. preg_match('/"tag_name":"[v](([\d][.][\d][.][\d])(-?\w*))"/', $latest, $latest); // add latest version to database diff --git a/src/psm/Util/Server/Updater/StatusUpdater.php b/src/psm/Util/Server/Updater/StatusUpdater.php index 2b1f26b8..2ee3faf8 100644 --- a/src/psm/Util/Server/Updater/StatusUpdater.php +++ b/src/psm/Util/Server/Updater/StatusUpdater.php @@ -246,30 +246,22 @@ class StatusUpdater { $this->server['request_method'], $this->server['post_field'] ); - $this->header = $curl_result; + $this->header = $curl_result["result"]; + $code = $curl_result["info"]["http_code"]; + $redirectUrl = $curl_result["info"]["redirect_url"]; $this->rtime = (microtime(true) - $starttime); - // the first line would be the status code.. - $status_code = strtok($curl_result, "\r\n"); - // keep it general - // $code[2][0] = status code - // $code[3][0] = name of status code - $code_matches = array(); - preg_match_all("/[A-Z]{2,5}\/\d(\.\d)?\s(\d{3})\s?(.*)/", $status_code, $code_matches); - - if(empty($code_matches[0])) { + if(empty($code)) { // somehow we dont have a proper response. $this->error = 'TIMEOUT ERROR: no response from server'; $result = false; } else { - $code = $code_matches[2][0]; - $msg = $code_matches[3][0]; $allow_http_status = explode("|", $this->server['allow_http_status']); // All status codes starting with a 4 or higher mean trouble! if (substr($code, 0, 1) >= '4' && !in_array($code ,$allow_http_status)) { - $this->error = "HTTP STATUS ERROR: ".$code.' '.$msg; + $this->error = "HTTP STATUS ERROR: ".$code; $result = false; } else { $result = true; @@ -278,7 +270,7 @@ class StatusUpdater { if ($this->server['pattern'] != '') { // Check to see if the body should not contain specified pattern // Check to see if the pattern was [not] found. - if (($this->server['pattern_online'] == 'yes') == !preg_match("/{$this->server['pattern']}/i", $curl_result)) { + if (($this->server['pattern_online'] == 'yes') == !preg_match("/{$this->server['pattern']}/i", $this->header)) { $this->error = "TEXT ERROR : Pattern '{$this->server['pattern']}' ". ($this->server['pattern_online'] == 'yes' ? 'not' : 'was'). ' found.'; @@ -286,24 +278,23 @@ class StatusUpdater { } } - // Check if the website redirects to another domain - if ($this->server['redirect_check'] == 'bad'){ - $location_matches = array(); - preg_match('/([Ll]ocation: )(https*:\/\/)(www.)?([a-zA-Z.:0-9]*)([\/][[:alnum:][:punct:]]*)/', $curl_result, $location_matches); - if(!empty($location_matches)) { - $ip_matches = array(); - preg_match('/(https*:\/\/)(www.)?([a-zA-Z.:0-9]*)([\/][[:alnum:][:punct:]]*)?/', $this->server['ip'], $ip_matches); - if (strtolower($location_matches[4]) !== strtolower($ip_matches[3])) { - $this->error = "The IP/URL redirects to another domain."; - $result = false; - } - } - } + // Check if the website redirects to another domain + if ($this->server['redirect_check'] == 'bad') { + if (!empty($redirectUrl)) { + $redirectPieces = parse_url($redirectUrl); + $ipPieces = parse_url($this->server['ip']); + + if (strtolower($redirectPieces['host']) !== strtolower($ipPieces['host'])) { + $this->error = "The IP/URL redirects to another domain."; + $result = false; + } + } + } - // Should we check a header ? + // Should we check a header ? 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 + $header_text = substr($this->header, 0, strpos($this->header, "\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 || strpos($line, ':') == false) { continue; // We skip the status code & other non-header lines. Needed for proxy or redirects