modtype="core_after_decode"; $this->modname="Nanoweb mod_proxy"; } function main(){ global $http_action, $http_uri, $add_errmsg, $pri_redir, $conf, $pri_err, $lf, $http_action, $query_string, $htreq_headers; global $out_contenttype; if (substr($GLOBALS["real_uri"], 0, 7)=="http://") { if (strpos($GLOBALS["remote_ip"], $conf["global"]["proxyallowip"][0])===0) { // A setter en fait en fonction de la réponse du serveur distant (200 le + souvent) $pri_err=200; if($conf["global"]["proxyanonyme"][0]==1){ if(isset($conf["global"]["proxyuseragent"][0])) $this->user_agent = $conf["global"]["proxyuseragent"][0]; else $this->user_agent = "aEGiS nanoweb mod_proxy"; if(isset($conf["global"]["proxyreferer"][0])) $this->referer = $conf["global"]["proxyreferer"][0]; else $this->referer = "http://dtc.fr.st/"; if(isset($conf["global"]["proxyip"][0])) $this->forward = $conf["global"]["proxyip"][0]; else $this->forward = "192.168.100.1"; }else{ $this->user_agent = $htreq_headers["USER-AGENT"]; $this->referer = $htreq_headers["REFERER"]; } $this->url = $http_uri; $this->cache_d = strtolower($conf["global"]["proxycachedir"][0]); $deny_access = $this->_deny_access(); if ($deny_access == false){ $this->url_parse = parse_url($this->url); $this->encoded_path = urlencode($this->url_parse['path']); $this->ask_path = str_replace(" ", "%20", $this->url_parse['path']); $this->cache_exist = false; $this->not_create_cache = false; $this->_check_cache(); if (! $this->cache_exist){ $this->_read_page(); // séparer dans le buffer (ou stocker séparément?) les headers du contenu, mettre les headers // dans $out_add_headers (et $out_contenttype pour le cas spécial du header content-type. // le contenu lui va dans $lf $this->_get_header($this->bufcach); if ($this->not_create_cache == false){ $this->_create_cache(); } } $this->_write_cache_log($this->url); $lf_str = $this->_remove_header($this->bufcach); if ($out_contenttype == "text/plain" || $out_contenttype == "text/html") $lf_str = $this->_deny_pub($lf_str); if (version_compare(VERSION, "1.9")<0) { // nanoweb 1.8.x and < $lf = $lf_str; } else { // nanoweb 1.9.x and > $lf = new static_response($lf_str); } }else{ $pri_err = 500; $add_errmsg = "the remote page could not be processed.
You are not allowed to see this bad sites
"; } }else{ $pri_err = 500; $add_errmsg = "you are not allowed to use this proxy"; } } } function _open_page(){ global $add_errmsg, $pri_err; if(!$this->url_parse['port']) $this->url_parse['port'] = 80; $fp = fsockopen ($this->url_parse['host'], $this->url_parse['port'], $errno, $errstr, 10); if (!$fp){ $add_errmsg = "the remote page could not be processed
reason : $errno ($errstr).
"; $pri_err = 500; } return $fp; } function _read_page(){ global $htreq_content, $http_action, $query_string, $htreq_headers, $sck_connected, $dp, $pn, $htreq_headers; global $mime, $rq_file, $mimetype, $conf, $out_contenttype, $pri_err; if ($mimetype=$mime[strtolower($rq_file["extension"])]) $out_contenttype=$mimetype; else $out_contenttype=$conf["global"]["defaultcontenttype"][0]; if ($query_string) $query="?$query_string"; if ($http_action == "POST" || $http_action == "PUT"){ $command = $http_action." ".$this->ask_path.$query.$this->url_parse['fragment']." HTTP/1.0\r\n"; $command .= "Host: ".$this->url_parse['host']."\r\n"; $command .= "User-agent: ".$this->user_agent."\r\n"; $command .= "Cookie: ".$htreq_headers['COOKIE']."\r\n"; $command .= "Content-type: application/x-www-form-urlencoded\r\n"; $command .= "Referer: ".$this->referer."\r\n"; $command .= "Via: aEGiS nanoweb mod_proxy\r\n"; $command .= "X-Forwarded-For: ".$this->forward."\r\n"; $command .= "Content-Length: ".strlen($htreq_content)."\r\n\r\n"; $command .= $htreq_content."\r\n"; }else{ $command = $http_action." ".$this->ask_path.$query." HTTP/1.0\r\nHost: ".$this->url_parse['host']."\r\n"; $command .= "Content-type: ".$out_contenttype."\r\n"; $command .= "Cookie: ".$htreq_headers['COOKIE']."\r\n"; $command .= "Referer: ".$this->referer."\r\n"; $command .= "User-agent: ".$this->user_agent."\r\n"; $command .= "Via: aEGiS nanoweb mod_proxy\r\n"; $command .= "X-Forwarded-For: ".$this->forward."\r\n\r\n"; } $no_dns = false; @exec("nslookup -sil ".$this->url_parse['host'], $output ); $tmp = join(" ",$output); if (strstr("not found",$tmp)) $no_dns = true; if (!$no_dns){ $fp = $this->_open_page(); if ($fp){ fputs ($fp, $command); unset ($this->bufcach); while(! feof($fp)){ $tmp = fread($fp, 4096); $this->bufcach .= $tmp; } } }else{ $add_errmsg = "the remote page could not be processed."; $pri_err = 500; } $this->_close_page($fp); } function _close_page($fp){ fclose($fp); } function _get_header($file){ global $out_contenttype, $http_action, $out_add_headers, $pri_err; $headerend = strpos($file,"\r\n\r\n"); $headers = substr($file,0,$headerend); $this->not_create_cache = $this->check_pub = false; $tmp = explode("\r\n",$headers); for ($i=0;$i $this->cache_date) $last_modif = true; else $this->cache_exist = false; } else if (preg_match("/set-cookie/i",$tmp[$i])){ $out_add_headers["cookies"][] = eregi_replace("set-cookie: ","",$tmp[$i]); } else if (preg_match("/WWW-Authenticate/i",$tmp[$i])){ $realm = explode("\"",$tmp[$i]); } else if (preg_match("/^location/i",$tmp[$i])){ $location = eregi_replace("location: ","",$tmp[$i]); $http_action = "GET"; $pri_err = 302; if (substr($location, 0, 7)=="http://") { $url_parse = parse_url($location); $out_add_headers["Location"] = $location; }elseif (substr($location,0,1)=="/"){ $out_add_headers["Location"] = $location; }else{ $out_add_headers["Location"] = "/".$location; } } else if (preg_match("/X-Cache/i",$tmp[$i])){ $this->not_create_cache = true; } else if (preg_match("/cache-control/i",$tmp[$i])){ if (strstr($tmp[$i],"no-cache") || strstr($tmp[$i],"no-store") || strstr($tmp[$i],"private")){ $this->not_create_cache = true; } } } } function _remove_header($file){ $headerend = strpos($file,"\r\n\r\n"); if (is_bool($headerend)){ $result = $file; }else{ $result = substr($file,$headerend+4,strlen($file) - ($headerend+4)); } return $result; } function _check_cache(){ global $query_string; if (is_dir($this->cache_d."/".$this->url_parse['host'])){ if ($query_string) $query = urlencode("?".$query_string); if (file_exists($this->cache_d."/".$this->url_parse['host']."/".$this->encoded_path.$query)){ $stat_f = stat($this->cache_d."/".$this->url_parse['host']."/".$this->encoded_path); $this->cache_date = $stat_f[8]; $fp = $this->_open_page(); fputs ($fp,"GET ".$this->url_parse['path']." HTTP/1.0\r\nHost: ".$this->url_parse['host']."\r\nUser-agent: ".$this->user_agent."\r\nIf-Modified-Since: ".$this->cache_date."\r\nConnection: close\r\n\r\n"); while (!feof($fp)){ $tmp = fgets($fp,128); if (preg_match("/^last-modified/i",$tmp)){ $xp_date = explode(":",$tmp); $timestamp = strtotime($xp_date[1]); if ($timestamp > $this->cache_date) $last_modif = true; } $header .= $tmp; } $this->_close_page($fp); if ($last_modif){ $this->cache_exist = false; }else{ $time = time(); if ($time > $this->cache_date + $conf["global"]["proxycachemaxage"][0] ){ $this->cache_exist = false; }else{ $cache = fopen($this->cache_d."/".$this->url_parse['host']."/".$this->encoded_path.$query,"rb"); while (!feof($cache)) { $this->bufcach .= fread($cache, 4096); } fclose ($cache); $this->cache_exist = true; $this->_get_header($this->bufcach); } } } } } function _create_cache(){ global $query_string; if ($query_string) $query = urlencode("?".$query_string); mkdir($this->cache_d."/".$this->url_parse['host'], 0755); $cache = fopen($this->cache_d."/".$this->url_parse['host']."/".$this->encoded_path.$query,"wb"); fwrite($cache, $this->bufcach); fclose($cache); } function _write_cache_log($file){ $str = date("m/d H:i")." ".$file." ".$GLOBALS["remote_ip"]."\n"; $log = fopen(strtolower($conf["global"]["proxyaccesslog"][0])); fputs($log,$str); fclose($log); } function _deny_pub($str){ global $conf; $tmp = explode("\n",$str); $find = false; unset ($str); for ($i=0;$iurl,$buf)){ $block = true; break; } } fclose ($fp); } return $block; } } ?>