<?php
// PukiWiki - Yet another WikiWikiWeb clone.
// $Id: expan.php,v 1.0 2010/06/01 00:00:00 acompass.net Exp $
//                v 1.1 2012/10/06 00:00:00 acompass.net Exp $
// Expansion functions for Pukiwiki library.
// License: GPL v2 or (at your option) any later version
// Modify the values of $auth_ips,$log_file,$login_status
// as your configuration.
// Locate prohibit_action.lst & prohibit_convert.lst in plugin directory.

//To use IP address for authentication, set IP address and username
$auth_ips = array(
//      IP Address     => Username
//       '192.168.1.100' => 'foo',   
//       '192.168.1.101' => 'bar'
);
$log_file = '/var/log/httpd/pukiwiki.log';
$login_status = 'yyyyyyyy';
$action_filename = 'plugin/prohibit_action.lst';
$convert_filename = 'plugin/prohibit_convert.lst';


// Basic Authentication input request for userid and password.
function basic_HTTP_auth( $force = FALSE )
{

	if (!isset($_SERVER['PHP_AUTH_PW']) || $force == TRUE) {
		// Authentication
		$text = 'Administration Login';
		pkwk_common_headers();
		header('WWW-Authenticate: Basic realm="' . $text . '"');
		header('HTTP/1.0 401 Unauthorized');
		echo "ログインがキャンセルされました\n";
		exit;

	} else {
		$userid = $_SERVER['PHP_AUTH_USER'];
		$passwd = $_SERVER['PHP_AUTH_PW'];
	}
	return array('userid' => $userid, 'passwd' => $passwd);

}


// References of this function:
// Logging function using erro_log().
// Timestamp is set automatically.
// Set Logfile name with full path as below,
// and give write permission on directory for apache.
// ex. $log_file = /var/log/pukiwiki/pukiwiki.log
//     mkdir /var/log/pukiwiki
//     chown apache. /var/log/pukiwiki
function expan_log( $id1, $log1,$id2,$log2 )
{
	global $log_file;

	if ( $log1 == '' ) {
		$msg = date("Y.m.d.H:i:s") . ":" . $id1;
	} else if ( $id2 == '' ) { 
		$msg = date("Y.m.d.H:i:s") . ":" . $id1 . "=[" . $log1 . "]";
	} else if ( $log2 != '' ) { 
		$msg = date("Y.m.d.H:i:s") . ":" . $id1 . "=[" . $log1 . "]:" . $id2 . "=[" . $log2 . "]";
	} else {
		$msg = date("Y.m.d.H:i:s") . ":" . $id1 . "=[" . $log1 . "]:" . $id2;
	}

	error_log($msg."\n", 3, $log_file);
	return;
}


// logoff by unsetting login_id.
function expan_logoff()
{
	$obj = new expan_session();
	$obj->un_set();
}


// References of this class:
// Session Management
// Currently functioning only $login_id.
// Set $login_status.
class expan_session
{
	var $sid, $login_id;

	function expan_session() {
		$sid = session_id();
		if ( $sid == '' ) {
			session_start();
			$sid = session_id();
		}
		return $sid;
	}

	function set() {
		global $login_status;
		if (!isset($_SESSION[$login_status])) {
			$login_id = rand(1, 99999999);
			$_SESSION[$login_status] = $login_id;
		}
	}

	function get() {
		global $login_status;
		if (isset($_SESSION[$login_status])) {
			return $_SESSION[$login_status];
		}
		return 0;
	}

	function check() {
		if ( $this->get() != 0 ) {
			return TRUE;
		}
		return FALSE;
	}

	function un_set() {
		global $login_status;
		if (isset($_SESSION[$login_status])) {
			unset($_SESSION[$login_status]);
		}
	}

	function destroy() {
		$_SESSION=array();
		session_destroy();
	}

}

// References of this function:
// Check Login and Plugins.
// Set action plugin in $action_filename & convert plugin name in $convert_filename
// Locate plugin list files in plugin directory.
function check_plugin_action( $tgtplugin ) {
	global $action_filename;
	$obj = new expan_session();
	if (!$obj->check()) {  //Not Login
		if ( $flag = check_prohibit_plugin( $action_filename, $tgtplugin ) != FALSE ) {
//				$flag == '0' == FALSE  -> return FALSE;
			if ($flag == '1') {
//				return TRUE;  // die_messageを表示しないで単に処理をSkipする場合。
				die_message('Not Login');
			} else {
				return $flag;    // For future use
			}
		}
	}
	return FALSE;
}


function check_plugin_convert( $tgtplugin ) {
	global $convert_filename;
	$obj = new expan_session();
	if (!$obj->check()) {  //Not Login
		if ( $flag = check_prohibit_plugin( $convert_filename, $tgtplugin ) != FALSE ) {
//				$flag == '0' == FALSE  -> return FALSE;
			if ($flag == '1') {
				die_message('Not Login');
			} else {
				return $flag;    // For future use
			}
		}
	}
	return FALSE;
}


function check_prohibit_plugin( $filename, $tgtplugin )
{
	$plugins = @file( $filename );
	foreach( $plugins as $line ) {
		list($plugin,$flag) = explode(":", $line);
		if ( $tgtplugin == trim($plugin) ) {
			return trim($flag);
		}
	}
	return FALSE;
}


?>
