<?php
/* vim: set expandtab tabstop=4 shiftwidth=4: */
/**
* PHP versions 5
*
****************************************************************************
originally Copyright (C) 2009 Kuroneko Square.
All rights reserved.

This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
*****************************************************************************/

require_once('GeoIP.php');
require_once('proxy.cls.php');

class EnvChecker {
//----------------
public function __construct(){
	$this->remote_name = array(
		//user info
		'REMOTE_ADDR'			=> 'ユーザのIPアドレス',
		'REMOTE_HOST'			=> 'ユーザのホスト名',
		#'REMOTE_IDENT'			=> 'ユーザ名（IDENTプロトコルに対応している場合）',
		'REMOTE_PORT'			=> 'ユーザがサーバとの通信に使用したポート番号',
		#'REMOTE_USER'			=> 'ユーザ認証時のユーザID',
		
		//browser info
		'HTTP_ACCEPT'			=> 'ブラウザがサポートするMIMEタイプ',
		'HTTP_ACCEPT_CHARSET'	=> 'ブラウザがサポートする文字コードセット',
		'HTTP_ACCEPT_ENCODING'	=> 'エンコード方式',
		'HTTP_ACCEPT_LANGUAGE'	=> 'ブラウザがサポートする言語コード',
		'HTTP_CONNECTION'		=> '接続の状態',
		'HTTP_COOKIE'			=> 'このURLに対するcookie',
		'HTTP_EXTENSION'		=> 'CompuserveのRPAへの対応を示す拡張ヘッダ',
		'HTTP_FROM'				=> 'ブラウザに設定されているE-Mailアドレス',
		'HTTP_HOST'				=> '接続先ホスト名',
		'HTTP_KEEP_ALIVE'		=> '接続先との接続を維持する最長時間',
		'HTTP_PRAGMA'			=> 'キャッシュに関する動作方式（HTTP/1.0）',
		'HTTP_REFERER'			=> '参照元URL',
		'HTTP_UA_CPU'			=> 'クライアントのCPU',
		'HTTP_UA_OS'			=> 'クライアントのOS',
		'HTTP_USER_AGENT'		=> 'ブラウザに関する情報（UserAgent）',
		#'HTTP_WEFERER'			=> 'Norton製品専用の拡張ヘッダ（Referer関連）',
		#'HTTP_WSER_AGENT'		=> 'Norton製品専用の拡張ヘッダ（User-Agent関連）',
		
		//for proxy judge
		'HTTP_CACHE_CONTROL'	=> 'キャッシュに関する制御情報（最長時間等）',
		'HTTP_CACHE_INFO'		=> 'キャッシュの情報',
		'HTTP_CLIENT_IP'		=> '接続元のIPアドレス（TrafficServerやNetscapeProxyが付加）',
		'HTTP_FORWARDED'		=> 'プロキシのURIおよびクライアントのFQDN',
		'HTTP_IF_MODIFIED_SINCE'=> 'この時刻以降にコンテンツが更新されていればそのまま返す',
		'HTTP_MAX_FORWARDS'		=> '経由できるプロキシの最大数',
		'HTTP_PROXY_CONNECTION'	=> 'プロキシの接続形態',
		'HTTP_SP_HOST'			=> '接続元のIPアドレス',
		'HTTP_TE'				=> 'プロキシ等がサポートする転送エンコード方式',
		'HTTP_VIA'				=> 'プロキシの情報（種類，バージョン等）',
		'HTTP_X_FORWARDED_FOR'	=> '接続元のIPアドレス',
		'HTTP_X_LOCKING'		=> '接続元またはプロキシ自身のIPアドレス（DeleGateが付加）',
		'HTTP_XONNECTION'		=> 'CacheFlow専用の拡張ヘッダ（Connection関連）',
		'HTTP_XROXY_CONNECTION'	=> 'CacheFlow専用の拡張ヘッダ（Proxy-Connection関連）'
	);
}
//----------------
public function gettable(){
	echo '<table class="env">';
	echo '<tr><th>環境変数名</th><th>値</th><th>説明</th></tr>';
	
	$sv = $_SERVER;
	$sv[REMOTE_HOST] = gethostbyaddr($_SERVER["REMOTE_ADDR"]);//Enable when server did not support "REMOTE_HOST" value.
	
	foreach($this->remote_name as $key => $desc){
		$value = (empty($sv[$key]))? '(none)' :$sv[$key];
		switch($key){
			case 'REMOTE_ADDR':
				echo '<tr class="subhead"><th colspan="3">ユーザ関連の情報</th></tr>';
				break;
			case 'HTTP_ACCEPT':
				echo '<tr class="subhead"><th colspan="3">クライアント関連の情報</th></tr>';
				break;
			case 'HTTP_CACHE_CONTROL':
				echo '<tr class="subhead"><th colspan="3">プロキシ関連の情報</th></tr>';
				break;
			default:
		}
		echo '<tr><td class="envname">'.htmlspecialchars($key).'</td><td class="envvalue">'.htmlspecialchars($value).'</td><td class="envdesc">'.htmlspecialchars($desc).'</td></tr>';
	}
	echo '</table>';
}
//----------------
}

/**
 * PEAR Net_GeoIP(for GeoLite Country)
 * http://pear.php.net/package/Net_GeoIP/
 */
class geotools extends Net_GeoIP{
	//----------------
	public function get_geoip(){
		if ($this->is_ipaddr($_SERVER["REMOTE_ADDR"])) $this->geoip($_SERVER["REMOTE_ADDR"]);
	}
	//----------------
	private function geoip($ipadd){
		$geoip = $this->getInstance(GEOIPDIR.'/GeoIP.dat');
		$geo_value = array(
			'COUNTRY_NAME'	=> $geoip->lookupCountryName($ipadd),
			'COUNTRY_CODE'	=> $geoip->lookupCountryCode($ipadd)
		);
		echo '<table class="env">';
		echo '<tr class="subhead"><th colspan="3">接続元ホストの所在地</th></tr>';
		foreach($geo_value as $key => $value){
			$value = (empty($value))? '(unknown)':$value;
			echo '<tr><td class="envname">'.htmlspecialchars($key).'</td><td class="envvalue">'.htmlspecialchars($value).'</td></tr>';
		}
		echo '</table>';
	}
	/**
	 * is_ipaddr() Function
	 * Created by: Joshua H. (TRUSTAbyss)
	 *
	 * This function returns a boolean value.
	 * Usage: is_ipaddr("IP");
	 */
	private function is_ipaddr($ip){
		$result = FALSE;
		
		// Check to see if the IP Address is valid.
		if (preg_match("/^([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})\.([0-9]{1,3})$/", $ip, $matches)){
			// Check each of the IP digits to see if they're less than or equal to 255 (valid IP Range). 
			if (($matches[1] <= 255) && ($matches[2] <= 255) && ($matches[3] <= 255) && ($matches[4] <= 255)){
				$result = TRUE; // Valid IP.
			}
		}
		return $result;
	}
	//----------------
	public function geoip_newest(){
		$filename = 'GeoIP.dat';
		if (file_exists($filename)) {
			return date ("Y-m-d", filemtime($filename));
		}
	}
}
//----------------
class proxyjudge extends check_proxy{
	/**
	 * PukiWiki Plus! Proxy Judge class
	 * https://github.com/miko2u/pukiwiki-plus-i18n/blob/master/lib/proxy.cls.php
	*/
	public function output_result(){
		$proxy = ($this->is_proxy())?'プロキシ経由である':'プロキシ経由ではない';
		echo htmlspecialchars($proxy);
	}
}
//----------------
$ObjEVC = new EnvChecker();
$ObjPXJ = new proxyjudge();
$ObjGEO = new geotools();
//----------------
?>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja" lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<title>ENV Checker</title>
<style type="text/css">
table.env {font-size:90%;}
table.env {border-color:#efefef;}
.env td {background-color:#dbdbdb;}
.env tr.subhead{background-color:#8fba64;text-align:left;}
.env td.envname {width:16em;}
.env td.envdesc {width:28em;}
</style>
</head>
<body>
<h1>ENV Checker</h1>
<?php $ObjEVC->gettable();?>
<p><a href="https://github.com/miko2u/pukiwiki-plus-i18n/blob/master/lib/proxy.cls.php">Pukiwiki Plus!の判定基準</a>で<?php echo $ObjPXJ->output_result();?>と判定されました。</p>
<?php $ObjGEO->get_geoip();?>
<p>Powered by <a href="http://www.maxmind.com/app/geoip_country">GeoLite Country</a></p>
</body>
</html>