Skip to content
Snippets Groups Projects
Commit d8c9e4a1 authored by Hahn Axel (hahn)'s avatar Hahn Axel (hahn)
Browse files

Update infoblock for found redirects; handle and show cookies

parent 56a31aa4
Branches handle-cookies
No related tags found
1 merge request!12Update infoblock for found redirects; handle and show cookies
...@@ -30,6 +30,9 @@ ...@@ -30,6 +30,9 @@
--txt-warning-bg: #fda; --txt-warning-bg: #fda;
--txt-warning-color: #651; --txt-warning-color: #651;
--txt-redirect-bg: #e0e8f0;
--txt-redirect-color: default;
--txt-alias-color: #89a; --txt-alias-color: #89a;
--http-301-color: #a55; --http-301-color: #a55;
...@@ -100,7 +103,7 @@ ol.error{padding-left: 2em;} ...@@ -100,7 +103,7 @@ ol.error{padding-left: 2em;}
.status{padding: 0.5em 1em; border-left: 5px solid; font-size: 125%; border-top-right-radius: 0.7em;} .status{padding: 0.5em 1em; border-left: 5px solid; font-size: 125%; border-top-right-radius: 0.7em;}
.status-ok{background: var(--txt-ok-bg); color: var(--txt-ok-color);} .status-ok{background: var(--txt-ok-bg); color: var(--txt-ok-color);}
.status-redirect{background: var(--txt-warning-bg); color: var(--txt-warning-color);} .status-redirect{background: var(--txt-redirect-bg); color: var(--txt-redirect-color);}
.status-error{background: var(--txt-error-bg); color: var(--txt-error-color);} .status-error{background: var(--txt-error-bg); color: var(--txt-error-color);}
.statuscode{background: var(--txt-statuscode-bg); font-size: 150%;} .statuscode{background: var(--txt-statuscode-bg); font-size: 150%;}
...@@ -108,6 +111,8 @@ ol.error{padding-left: 2em;} ...@@ -108,6 +111,8 @@ ol.error{padding-left: 2em;}
.location::before{content:' 🌐 '; background-color: var(--txt-location-before-bg);} .location::before{content:' 🌐 '; background-color: var(--txt-location-before-bg);}
.debug{color:var(--txt-debug-color);} .debug{color:var(--txt-debug-color);}
.allJumps{display: flex; overflow: auto; padding-bottom: 1em; margin-bottom: 2em;;}
.allJumps div.redirectstatus{display: inline-block;margin-top: 1em;}
.box{display: inline-block; border: 1px solid rgba(0,0,0,0.1); padding: 0.3em; margin: 0em; text-align: center; border-radius: 0.25em;} .box{display: inline-block; border: 1px solid rgba(0,0,0,0.1); padding: 0.3em; margin: 0em; text-align: center; border-radius: 0.25em;}
.overlay{position: fixed; margin: 0; width: 100%; height: 100%; top: 0; left: 0; background: var(--overlay-bg); overflow: scroll; display: none;} .overlay{position: fixed; margin: 0; width: 100%; height: 100%; top: 0; left: 0; background: var(--overlay-bg); overflow: scroll; display: none;}
......
...@@ -20,6 +20,7 @@ require_once 'redirect.class.php'; ...@@ -20,6 +20,7 @@ require_once 'redirect.class.php';
* 2023-08-28 v1.8 ah remove php warning if there is no config yet * 2023-08-28 v1.8 ah remove php warning if there is no config yet
* 2024-10-04 v1.9 ah php8 only: typed variables * 2024-10-04 v1.9 ah php8 only: typed variables
* 2025-01-13 v1.10 ah fetch curl error * 2025-01-13 v1.10 ah fetch curl error
* 2025-01-20 v1.11 ah Update infoblock for found redirects; handle and show cookies
*/ */
/** /**
...@@ -30,6 +31,12 @@ require_once 'redirect.class.php'; ...@@ -30,6 +31,12 @@ require_once 'redirect.class.php';
class redirectadmin extends redirect class redirectadmin extends redirect
{ {
/**
* Filename to collect cookies of a request
* @var string
*/
protected string $_sCookiefile='';
/** /**
* Get default curl options * Get default curl options
* @return array * @return array
...@@ -49,9 +56,6 @@ class redirectadmin extends redirect ...@@ -49,9 +56,6 @@ class redirectadmin extends redirect
'DNT: 1', 'DNT: 1',
], ],
// TODO: this is unsafe .. better: let the user configure it
// CURLOPT_SSL_VERIFYHOST => true,
// CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_TIMEOUT => 5, CURLOPT_TIMEOUT => 5,
]; ];
return $aReturn; return $aReturn;
...@@ -66,11 +70,19 @@ class redirectadmin extends redirect ...@@ -66,11 +70,19 @@ class redirectadmin extends redirect
public function httpGet(string $url, bool $bHeaderOnly = false): array public function httpGet(string $url, bool $bHeaderOnly = false): array
{ {
$aResult = []; $aResult = [];
$ch = curl_init($url); $ch = curl_init($url);
foreach ($this->_getCurlOptions() as $sCurlOption => $sCurlValue) { foreach ($this->_getCurlOptions() as $sCurlOption => $sCurlValue) {
curl_setopt($ch, $sCurlOption, $sCurlValue); curl_setopt($ch, $sCurlOption, $sCurlValue);
} }
// handle cookies
$this->_sCookiefile = sys_get_temp_dir() . '/redirect_admin__found_cookies__' . md5($url) . '.txt';
if(file_exists($this->_sCookiefile)){
unlink($this->_sCookiefile);
}
curl_setopt($ch, CURLOPT_COOKIEFILE, $this->_sCookiefile);
curl_setopt($ch, CURLOPT_COOKIEJAR, $this->_sCookiefile);
if ($bHeaderOnly) { if ($bHeaderOnly) {
curl_setopt($ch, CURLOPT_HEADER, 1); curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_NOBODY, 1); curl_setopt($ch, CURLOPT_NOBODY, 1);
...@@ -103,6 +115,31 @@ class redirectadmin extends redirect ...@@ -103,6 +115,31 @@ class redirectadmin extends redirect
return $aResult; return $aResult;
} }
/**
* Get html code to show found cookies.
* The cookie file will be deleted too.
*
* @return string
*/
public function renderCookies(): string{
$sReturn = '';
$iCounter=0;
if(file_exists($this->_sCookiefile))
{
$lines = explode(PHP_EOL, file_get_contents($this->_sCookiefile));
foreach ($lines as $line) {
if (substr_count($line, "\t") == 6) {
$iCounter++;
$sReturn.= $line . '<br>';
}
}
unlink($this->_sCookiefile);
}
return $sReturn ? "Found cookies: $iCounter<pre>$sReturn</pre>" : '';
}
/** /**
* Get html code for a response header of a request * Get html code for a response header of a request
* *
...@@ -117,6 +154,8 @@ class redirectadmin extends redirect ...@@ -117,6 +154,8 @@ class redirectadmin extends redirect
$iJump = 0; $iJump = 0;
$sBox = ''; $sBox = '';
$sReturn = ''; $sReturn = '';
$aHosts = [];
$aWebs = [];
if ($aResponse['curlerrorcode']) { if ($aResponse['curlerrorcode']) {
$sReturn .= '<br>' $sReturn .= '<br>'
...@@ -130,6 +169,7 @@ class redirectadmin extends redirect ...@@ -130,6 +169,7 @@ class redirectadmin extends redirect
} }
$sUrl=$aResponse['url']; $sUrl=$aResponse['url'];
foreach(explode("\r\n\r\n", $aResponse['response_header']."\r\n\r\n".$aResponse['response_body'] ) as $sBlock){ foreach(explode("\r\n\r\n", $aResponse['response_header']."\r\n\r\n".$aResponse['response_body'] ) as $sBlock){
if(strlen($sBlock)){ if(strlen($sBlock)){
$iJump++; $iJump++;
...@@ -160,19 +200,22 @@ class redirectadmin extends redirect ...@@ -160,19 +200,22 @@ class redirectadmin extends redirect
$sBlock = preg_replace('/(location:.*)\\r/i', '<span class="location">$1</span>', $sBlock); $sBlock = preg_replace('/(location:.*)\\r/i', '<span class="location">$1</span>', $sBlock);
$sReturn.="<span class=\"status $sStatus\">$sUrl ($iStatus) </span><pre>$sBlock</pre>"; $sReturn.="<span class=\"status $sStatus\">$sUrl ... $iStatus</span><pre>$sBlock</pre>";
// $sReturn .= '<strong>'.$iJump.') HTTP status: '.$iStatus.' - '.$sUrl.'</strong><pre>'.$sBlock.'</pre>'; // $sReturn .= '<strong>'.$iJump.') HTTP status: '.$iStatus.' - '.$sUrl.'</strong><pre>'.$sBlock.'</pre>';
$sWebhost=preg_replace('/_$/', '', parse_url($sUrl, PHP_URL_HOST)); $sWebhost=preg_replace('/_$/', '', parse_url($sUrl, PHP_URL_HOST));
$sIp=$this->_getIp($sWebhost);
$aHosts[$sIp]=1;
$aWebs[$sWebhost]=1;
$sBox.="<div class=\"box $sStatus\">" $sBox.="<div class=\"box $sStatus\">"
// .$sUrl.'<br>' // .$sUrl.'<br>'
.$sWebhost.'<br>' .$sWebhost.'<br>'
. $this->_getIp($sWebhost) . $sIp
.'</div>'; .'</div>';
if($sNextUrl){ if($sNextUrl){
$sBox.= " --- $iStatus ---&gt; "; $sBox.= "<div class=\"redirectstatus\"><nobr> --- $iStatus ---&gt; </nobr></div>";
$sUrl=$sNextUrl; $sUrl=$sNextUrl;
} }
...@@ -181,11 +224,19 @@ class redirectadmin extends redirect ...@@ -181,11 +224,19 @@ class redirectadmin extends redirect
$iHops = $iJump-1; $iHops = $iJump-1;
$sReturn = '<br>'.($iHops > 0 $sReturn = '<br>'.($iHops > 0
? 'Found hops: <strong>' . $iHops . '</strong> ' ? 'Found hops: <strong>' . $iHops . '</strong> '
. ($iHops > 1 ? '<span class="warning"> ⚠️ Verify your redirect to skip unneeded hops.</span>' : '') . '<br><br>' . ($iHops > 1
. '<div>'.$sBox.'</div><br><br><br>' ? '<span class="warning"> ⚠️ Verify your redirect to skip unneeded hops.</span><br>'
.'The configured redirect is not the final url - it continues redirecting from there.'
: ''
)
. '<br>'
.sprintf('Required webs to be online to reach the final url: <strong>%s</strong>; required number of hosts: <strong>%s</strong>', count($aWebs), count($aHosts))
. '<br><br>'
. '<div class="allJumps">'.$sBox.'</div>'
: '' : ''
) )
. $this->renderCookies()
. $sReturn; . $sReturn;
return $sReturn; return $sReturn;
......
...@@ -43,7 +43,7 @@ class redirect ...@@ -43,7 +43,7 @@ class redirect
* About message * About message
* @var string * @var string
*/ */
protected string $_version = '1.7'; protected string $_version = '1.8';
/** /**
* Flag: debug is enabled? * Flag: debug is enabled?
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment