[6193] | 1 | <?php |
---|
| 2 | /* Functions */ |
---|
| 3 | |
---|
| 4 | if (!defined('PHPWG_ROOT_PATH')) die('Hacking attempt!'); |
---|
| 5 | if (!defined('IN_ADMIN') or !IN_ADMIN) die('Hacking attempt!'); |
---|
| 6 | |
---|
| 7 | |
---|
| 8 | if ( !function_exists('pwg_get_contents') ) { |
---|
| 9 | function pwg_get_contents($url, $mode='') { |
---|
| 10 | |
---|
| 11 | global $pwg_mode, $pwg_prev_host; |
---|
| 12 | $timeout = 5; // will be a parameter (only for the socket) |
---|
| 13 | |
---|
| 14 | $host = (strtolower(substr($url,0,7)) == 'http://') ? substr($url,7) : $url; |
---|
| 15 | $host = (strtolower(substr($host,0,8)) == 'https://') ? substr($host,8) : $host; |
---|
| 16 | $doc = substr($host, strpos($host, '/')); |
---|
| 17 | $host = substr($host, 0, strpos($host, '/')); |
---|
| 18 | |
---|
| 19 | if ($pwg_prev_host != $host) $pwg_mode = ''; // What was possible with one website could be different with another |
---|
| 20 | $pwg_prev_host = $host; |
---|
| 21 | if (isset($pwg_mode)) $mode = $pwg_mode; |
---|
| 22 | if ($mode == 'r') $mode = ''; |
---|
| 23 | // $mode = 'ch'; // Forcing a test '' all, 'fs' fsockopen, 'ch' cURL |
---|
| 24 | |
---|
| 25 | // 1 - The simplest solution: file_get_contents |
---|
| 26 | // Contraint: php.ini |
---|
| 27 | // ; Whether to allow the treatment of URLs (like http:// or ftp://) as files. |
---|
| 28 | // allow_url_fopen = On |
---|
| 29 | if ( $mode == '' ) { |
---|
| 30 | if ( true === (bool) ini_get('allow_url_fopen') ) { |
---|
| 31 | $value = file_get_contents($url); |
---|
| 32 | if ( $value !== false and substr($value,0,21) != '<!DOCTYPE HTML PUBLIC') { |
---|
| 33 | return $value; |
---|
| 34 | } |
---|
| 35 | } |
---|
| 36 | } |
---|
| 37 | if ( $mode == '' ) $mode = 'fs'; |
---|
| 38 | if ( $pwg_mode == '' ) $pwg_mode = 'fs'; // Remind it |
---|
| 39 | // 2 - Often accepted access: fsockopen |
---|
| 40 | if ($mode == 'fs') { |
---|
| 41 | $fs = fsockopen($host, 80, $errno, $errstr, $timeout); |
---|
| 42 | if ( $fs !== false ) { |
---|
| 43 | fwrite($fs, 'GET ' . $doc . " HTTP/1.1\r\n"); |
---|
| 44 | fwrite($fs, 'Host: ' . $host . "\r\n"); |
---|
| 45 | fwrite($fs, "Connection: Close\r\n\r\n"); |
---|
| 46 | stream_set_blocking($fs, TRUE); |
---|
| 47 | stream_set_timeout($fs,$timeout); // Again the $timeout on the get |
---|
| 48 | $info = stream_get_meta_data($fs); |
---|
| 49 | $value = ''; |
---|
| 50 | while ((!feof($fs)) && (!$info['timed_out'])) { |
---|
| 51 | $value .= fgets($fs, 4096); |
---|
| 52 | $info = stream_get_meta_data($fs); |
---|
| 53 | flush(); |
---|
| 54 | } |
---|
| 55 | if ( $info['timed_out'] === false and substr($value,0,21) != '<!DOCTYPE HTML PUBLIC') return $value; |
---|
| 56 | } |
---|
| 57 | } |
---|
| 58 | |
---|
| 59 | if ( $pwg_mode == 'fs' ) $pwg_mode = 'ch'; // Remind it |
---|
| 60 | // 3 - Sometime another solution: curl_exec |
---|
| 61 | // See http://fr2.php.net/manual/en/curl.installation.php |
---|
| 62 | if (function_exists('curl_init') and $pwg_mode == 'ch') { |
---|
| 63 | $ch = @curl_init(); |
---|
| 64 | @curl_setopt($ch, CURLOPT_URL, $url); |
---|
| 65 | @curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout); |
---|
| 66 | @curl_setopt($ch, CURLOPT_TIMEOUT, $timeout); |
---|
| 67 | @curl_setopt($ch, CURLOPT_HEADER, 1); |
---|
| 68 | @curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0'); |
---|
| 69 | @curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); |
---|
| 70 | @curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); |
---|
| 71 | $value = @curl_exec($ch); |
---|
| 72 | $header_length = @curl_getinfo($ch, CURLINFO_HEADER_SIZE); |
---|
| 73 | $status = @curl_getinfo($ch, CURLINFO_HTTP_CODE); |
---|
| 74 | @curl_close($value); |
---|
| 75 | if ($value !== false and $status >= 200 and $status < 400) { |
---|
| 76 | $value = substr($value, $header_length); |
---|
| 77 | // echo '<br/>-ch- ('. $value . ') <br/>'; |
---|
| 78 | return $value; |
---|
| 79 | } |
---|
| 80 | else $pwg_mode = 'failed'; // Sorry but remind it as well |
---|
| 81 | } |
---|
| 82 | |
---|
| 83 | // No other solutions |
---|
| 84 | return false; |
---|
| 85 | } |
---|
| 86 | } |
---|
| 87 | |
---|
[6201] | 88 | |
---|
| 89 | // Select the correct menu on loc_end_admin |
---|
[9145] | 90 | function whois_select_menu() { |
---|
[6201] | 91 | global $conf_whois, $template; |
---|
| 92 | if ($conf_whois['Add icon to History'] or !$conf_whois['Add to Plugins menu']) |
---|
| 93 | $template->assign('ACTIVE_MENU', 4); |
---|
| 94 | else $template->assign('ACTIVE_MENU', 3); |
---|
| 95 | } |
---|
| 96 | |
---|
[6193] | 97 | // Template function |
---|
| 98 | function Whois_most($text, $count, $when, $format) { |
---|
| 99 | return sprintf(l10n($text),$count,date(l10n($format),$when)); |
---|
| 100 | } |
---|
| 101 | |
---|
| 102 | function whois_country($trace, $bypass = false) { |
---|
| 103 | if (!isset($trace['country'])) { |
---|
| 104 | pwg_query('ALTER TABLE ' . WHOIS_ONLINE_TABLE . ' ADD `country` VARCHAR( 254 ) NOT NULL AFTER `lang` ;'); |
---|
| 105 | $trace['country']=''; |
---|
| 106 | } |
---|
| 107 | $c = array(); |
---|
| 108 | if ($trace['country']!='') $c = @unserialize(htmlspecialchars_decode($trace['country'])); |
---|
| 109 | if (isset($c['Code']) and $c['Code']!='' and $c['Code']!='__') return $c; |
---|
| 110 | if ($bypass and isset($c['Code'])) return $c; |
---|
| 111 | $result = pwg_get_contents ('http://api.hostip.info/get_html.php?ip=' . $trace['IP'], 'r'); |
---|
| 112 | if ( $result !== false ) { |
---|
| 113 | $tokens = preg_split("/[:]+/", $result); |
---|
| 114 | $c = array ('Name' => $tokens[1], 'City' => substr($tokens[3],0,-3)); |
---|
| 115 | if (strpos ($c['Name'], '?') === FALSE) { |
---|
| 116 | $c['Code'] = substr($c['Name'],-8,2); # " (Private Address) (XX) City" |
---|
| 117 | $c['Name'] = ucwords ( strtolower( substr($c['Name'],0,-5))); |
---|
| 118 | } |
---|
| 119 | else $c = Array('Code' => '__', 'Name' => l10n('Unknown country'), 'City' => 'N/A',); |
---|
| 120 | } |
---|
| 121 | if (stripos($c['Name'], 'Squid')!==false or $c['Code'] =='XX') |
---|
| 122 | $c = Array('Code' => '__', 'Name' => l10n('Unknown country'), 'City' => 'N/A',); |
---|
| 123 | $new = htmlspecialchars(serialize($c),ENT_QUOTES,'UTF-8'); |
---|
| 124 | if ($new == $trace['country']) return $c; |
---|
| 125 | pwg_query('UPDATE ' . WHOIS_ONLINE_TABLE . ' |
---|
| 126 | SET `country` = \'' . $new . '\' |
---|
| 127 | WHERE `session_id` = \'' . $trace['session_id'] . '\';'); |
---|
| 128 | return $c; |
---|
| 129 | } |
---|
| 130 | |
---|
| 131 | function whois_flag($trace, &$step, $limit = 10) { |
---|
| 132 | $flag = WHOIS_ONLINE_PATH . 'flags/' . $trace['Country']['Code'] . '.jpg'; |
---|
| 133 | if (file_exists($flag) and $trace['Country']['Code'] != '__' ) return $flag; |
---|
| 134 | if ($trace['Country']['Code'] == '__' ) { |
---|
| 135 | $flag = WHOIS_ONLINE_PATH . 'flags/' . substr($trace['lang'],-2, 2) . '.jpg'; |
---|
| 136 | if (file_exists($flag)) return $flag; |
---|
| 137 | return WHOIS_ONLINE_PATH . 'flags/__.jpg'; |
---|
| 138 | } |
---|
| 139 | if ( $step > $limit ) return WHOIS_ONLINE_PATH . 'flags/.jpg'; |
---|
| 140 | $f = fopen ('http://api.hostip.info/flag.php?ip=' . $trace['IP'], 'r'); |
---|
| 141 | $result=''; |
---|
| 142 | while ($l = fgets ($f, 1024)) $result .= $l; |
---|
| 143 | fclose ($f); |
---|
| 144 | $f = fopen($flag,"w+"); |
---|
| 145 | fputs($f,$result); |
---|
| 146 | fclose($f); |
---|
| 147 | return $flag; |
---|
| 148 | } |
---|
| 149 | |
---|
| 150 | /* |
---|
| 151 | returns (mixed): (string) 'bot agent name' || (bool) false |
---|
| 152 | @param (string) HTTP_USER_AGENT |
---|
| 153 | */ |
---|
| 154 | function is_a_bot($agent = '') |
---|
| 155 | { |
---|
| 156 | global $conf; |
---|
| 157 | if ($agent == '') $agent = $_SERVER['HTTP_USER_AGENT']; |
---|
| 158 | $botlist = array('Teoma', 'alexa', 'froogle', 'Gigabot', 'inktomi', |
---|
| 159 | 'looksmart', 'URL_Spider_SQL', 'Firefly', 'NationalDirectory', |
---|
| 160 | 'Ask Jeeves', 'TECNOSEEK', 'InfoSeek', 'WebFindBot', 'girafabot', |
---|
| 161 | 'crawler', 'www.galaxy.com', 'Googlebot', 'Scooter', 'Slurp', |
---|
| 162 | 'msnbot', 'appie', 'FAST', 'WebBug', 'Spade', 'ZyBorg', 'rabaz', |
---|
| 163 | 'Baiduspider', 'Feedfetcher-Google', 'TechnoratiSnoop', 'Rankivabot', |
---|
| 164 | 'Mediapartners-Google', 'Sogou web spider', 'WebAlta Crawler'); |
---|
| 165 | if (isset($conf['search_agents'])) |
---|
| 166 | $botlist = array_merge( $botlist, array_diff( $conf['search_agents'], $botlist ) ); |
---|
| 167 | foreach($botlist as $bot) { |
---|
| 168 | if (stripos($agent, $bot)!==false) return $bot; |
---|
| 169 | } |
---|
| 170 | return false; |
---|
| 171 | } |
---|
| 172 | ?> |
---|