<?php
/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
// +----------------------------------------------------------------------+
// | PHP version 4                                                        |
// +----------------------------------------------------------------------+
// | Copyright (c) 2007 S.Nakazato                                        |
// +----------------------------------------------------------------------+
// +----------------------------------------------------------------------+
// | 関連：DBに認証用テーブルが必要                                       |
// |       SYSTEM_ID、SYSTEM_SUB_IDの定義が必要                           |
// +----------------------------------------------------------------------+
// | Authors: S.Nakazato                                                  |
// +----------------------------------------------------------------------+
// 
// $Id:cmn_Login.class.php,v 1.0 2007/01/08 S.Nakazato
//
// Sessionを使用した共通のログイン、認証クラス
// ログイン処理、認証チェックを行う
//

// このクラスでの定数定義
define("AUTH_OK",0);		// 認証ＯＫ
define("AUTH_LOGIN_ERR",1);	// ログインエラー
define("AUTH_DEF_ERR",2);	// 定数未定義エラー
define("AUTH_PW1_ERR",3);	// パスワード１エラー
define("AUTH_PW2_ERR",4);	// パスワード２エラー
define("AUTH_ERR",5);		// 認証エラー

class cmnAuth {

	var $_request = null;
	var $_session = null;
	var $_result = null;
	var $_arAuthInfo = null;
	var $_chk_id = null;

	/**
	 * Controller
	 * コンストラクタ
	 * @param $request
	 * @param $session
	 * @param $result
	 * @return void
	 */
	function cmnAuth( $session, $request, $result ) {
		// 基本クラス引継ぎ
		$this->_request =& $request;
		$this->_session =& $session;
		$this->_result  =& $result;
	}

	/**
	 * chkAuth
	 * 認証チェック
	 * @return boolean
	 */
	function chkAuth() {

		$ret = true;
		$param = $this->_session->get("AUTH_ID");

		if ( empty($param) ) {
			$ret = false;
		}

		return $ret;
	}

	/**
	 * setSession
	 * 認証セット
	 * @param $id 認証に使用するID
	 * @return 
	 */
	function setSession( $id = "" ) {
		if ( $id != "" ) {
			$this->_session->add("AUTH_ID", $id);
		} else {
			if ( $this->_chk_id != null ) {
				$this->_session->add("AUTH_ID", $this->_chk_id);
//				$_SESSION["AUTH_ID"] = $this->_chk_id;
			}
		}

	}

	/**
	 * delSession
	 * 認証削除
	 * @return 
	 */
	function delSession() {
		$this->_session->del("AUTH_ID");
	}

	/**
	 * ログアウト
	 * 認証削除
	 * @return 
	 */
	function Logout() {
		$this->delSession();
	}


	/**
	 * getID
	 * 認証ID取得
	 * @return 
	 */
	function getID () {
		return $this->_session->get("AUTH_ID");
	}


	/**
	 * getSQL生成 ( php5の場合private 宣言)
	 * @param $id 認証に使用するID
	 * @return SQL文
	 */
	function getSQL( $id ) {
		$strSql = "select USER_ID, PW1, PW2, KEY_CODE1, KEY_CODE2 ";
		$strSql .= "from AUTH_MST ";
		$strSql .= "where USER_ID = '$id' ";
		$strSql .= "AND SYSTEM_ID = '" . SYSTEM_ID ."' ";
		$strSql .= "AND SYSTEM_SUB_ID = '" . SYSTEM_SUB_ID ."'";

		return $strSql;
	}

	/**
	 * ログイン処理
	 * @param $id 認証に使用するID
	 * @return 結果コード 0:ログイン  1:ログイン失敗  2:必須情報無し
	 */
	function exeLogin( $id ) {

		// 認証対象のIDを取得
		$this->_chk_id = $id;

		$log = &Log::getInstance(LOGLEVEL, LOGTYPE);

		$bRet = AUTH_OK;

		/////////// データベース接続 START ////////////////
			$dbClass =& new cmn_DB();
		// DBオブジェクトの取得
			$db = $dbClass->__get_db();
		/////////// データベース接続 END //////////////////		

		// 認証情報の取得
			$arRet = "";
			$arr = array();
			$sql = $db->prepare( $this->getSQL($id) );

			$dbRESULT = $db->execute( $sql, $arr );

		// Postgres Oracle両対応
			$arRet = $dbClass->__select($dbRESULT,1);
/*
			while ( $row = $dbRESULT->fetchRow( DB_FETCHMODE_ASSOC )) {
				$arRet[] = $row;
			}
*/

		// 変数の開放
			$dbRESULT->free();

		/////////// データベース切断 START ////////////////
			$dbClass->__disconn();
		/////////// データベース切断 END //////////////////

		if ( !is_array($arRet[0])) {

			if ( !defined("SYSTEM_ID") || !defined("SYSTEM_SUB_ID") )	{
				$bRet = AUTH_DEF_ERR;
				$this->delSession();

				$log->info(__FILE__." ".__LINE__."：システム識別文字列が定義されていません。-> [SYSTEM_ID] [SYSTEM_SUB_ID]");
			} else {
				$bRet = AUTH_LOGIN_ERR;
				$this->delSession();
				$log->info(__FILE__." ".__LINE__."：認証できませんでした -> ID:".$id );
			}

		} else {
			$this->_arAuthInfo = $arRet[0];
		}

		return $bRet;

	}
	
	/**
	 * 認証情報取得
	 * @return ログイン結果配列
	 */
	function getAuthInfo() {
		return is_array($this->_arAuthInfo) ? $this->_arAuthInfo : null;

	}

	/**
	 * パスワードチェック
	 * @param $PW1 パスワード１(必須)
	 * @param $PW2 パスワード２(任意)
	 * @return 結果コード 0:OK  3:PW1が違う  4:PW2が違う 5:認証されていない
	 */
	function chkPassword( $pw1, $pw2 = "" ) {

		$ret = AUTH_OK;
		if ( is_array($this->_arAuthInfo) ) {

			$ret_pw1 = $this->_arAuthInfo["PW1"];
			$ret_pw2 = $this->_arAuthInfo["PW2"];

			if ( trim($pw1) != trim($ret_pw1) ){
				$ret = AUTH_PW1_ERR;
				$this->delSession();

			} else if ( trim($pw2) != trim($ret_pw2) && trim($pw2) != "" ) {
				$ret = AUTH_PW2_ERR;
				$this->delSession();
			}

		} else {
			$ret = AUTH_ERR;
			$this->delSession();
		}

		return $ret;

	}

	/**
	 * 認証情報生成(データがある時は更新)
	 * @param $UPDATE_ID 更新者ID(必須)
	 * @param $ID 認証ID(必須)
	 * @param $PW1 パスワード１(必須)
	 * @param $PW2 パスワード２(任意)
	 * @param $KEY1 キーコード１(任意)
	 * @param $KEY2 キーコード２(任意)
	 * @return 結果コード 0:OK  1:パラメータが足りない 
	 */
	function makeUser( $update_id, $id, $pw1, $pw2="", $key1="", $key2="" ,$status = "0"){

		$log = &Log::getInstance(LOGLEVEL, LOGTYPE);

		if ( trim($update_id) == "" || trim($id) == "" || trim($pw1) == "") { return 1; }

		// 挿入、更新データ生成
			$arRet = "";
			$arParam = array(
				"user_id" => $id,
				"pw1" => $pw1,
				"pw2" => $pw2,
				"key_code1" => $key1,
				"key_code2" => $key2,
				"update_id" => $update_id,
				"status" => $status
			);


		/////////// データベース接続 START ////////////////
			$dbClass =& new cmn_DB();
		// DBオブジェクトの取得
			$db = $dbClass->__get_db();
		/////////// データベース接続 END //////////////////		

			$sql = $this->getSQL($id);

			$dbRESULT = $db->query( $sql );

			$arRet = $dbClass->__select($dbRESULT,0);
			$arRet = $arRet[0];
			$dbRESULT->free();

			$arr = array();

			if ( trim($arRet['user_id']) != "" ) { 
				$sql = $db->prepare( $this->getUpdateSQL($arParam) );

				$arr[] = $id;
			} else {

				$sql = $db->prepare( $this->getInsertSQL($arParam) );
			}

			$dbRESULT = $db->execute( $sql, $arr );


		/////////// データベース切断 START ////////////////
			$db->commit();
			$dbClass->__disconn();
		/////////// データベース切断 END //////////////////

		return 0;

	}


	/**
	 * 認証情報削除
	 * @param $ID 認証ID(必須)
	 * @return 結果コード 0:OK  1:パラメータが足りない 2:削除できない
	 */
	function removeUser( $id ){
		$log = &Log::getInstance(LOGLEVEL, LOGTYPE);
		if ( trim($id) == "" ) { return 1; }

		/////////// データベース接続 START ////////////////
			$dbClass =& new cmn_DB();
		// DBオブジェクトの取得
			$db = $dbClass->__get_db();
		/////////// データベース接続 END //////////////////		

			$sql = $this->getSQL($id);
			$dbRESULT = $db->query( $sql );

			$arRet = $dbClass->__select($dbRESULT,0);
			$arRet = $arRet[0];
			$dbRESULT->free();

			$arr = array();

			if ( trim($arRet['user_id']) != "" ) { 
				$sql = $db->prepare( $this->geDeleteSQL() );
				$arr[] = $id;
			} else {

				$dbRESULT->free();
				$dbClass->__disconn();
				return 2;
			}

			$dbRESULT = $db->execute( $sql, $arr );

		/////////// データベース切断 START ////////////////
			$db->commit();
			$dbClass->__disconn();
		/////////// データベース切断 END //////////////////
		
		return 0;


	}

	/**
	 * getInsertSQL生成 ( php5の場合private 宣言)
	 * @param $ar 挿入するデータ
	 * @return SQL文
	 */
	function getInsertSQL( $ar ) {
		$strSql = "INSERT INTO AUTH_MST (SYSTEM_ID,SYSTEM_SUB_ID, USER_ID, PW1, PW2, KEY_CODE1, KEY_CODE2, UPDATE_ID, INS_DATE )";
		$strSql .= " VALUES (";
		$strSql .= "'" . SYSTEM_ID ."'";
		$strSql .= ",'" . SYSTEM_SUB_ID ."'";
		$strSql .= ",'" . $ar["user_id"] ."'";
		$strSql .= ",'" . $ar["pw1"] ."'";
		$strSql .= ",'" . $ar["pw2"] ."'";
		$strSql .= ",'" . $ar["key_code1"] ."'";
		$strSql .= ",'" . $ar["key_code2"] ."'";
		$strSql .= ",'" . $ar["update_id"] ."'";
		$strSql .= ",current_timestamp )";

		return $strSql;
	}


	/**
	 * getUpdateSQL生成 ( php5の場合private 宣言)
	 * @param $ar 更新するデータ
	 * @return SQL文
	 */
	function getUpdateSQL( $ar ) {
		$strSql = <<< SQL
		UPDATE AUTH_MST
		SET 
SQL;
		$sep = "";
		foreach( $ar as $key => $val ) {
			if ( is_string( $val ) ){
				$strSql .= $sep.$key." = '".$val."'";
			} else {
				$strSql .= $sep.$key." = ".$val;
			}
			$sep = ",";
		}

		$strSql .= ",UPD_DATE = current_timestamp ";
		$strSql .= " WHERE SYSTEM_ID = '".SYSTEM_ID."' ";
		$strSql .= " AND SYSTEM_SUB_ID = '".SYSTEM_SUB_ID."' ";
		$strSql .= " AND USER_ID = ?";

		return $strSql;
	}

	/**
	 * getDeleteSQL生成 ( php5の場合private 宣言)
	 * @param $ar 削除するデータ
	 * @return SQL文
	 */
	function getDeleteSQL() {
		$strSql = <<< SQL
		DELETE FROM AUTH_MST
SQL;

		$strSql .= " WHERE SYSTEM_ID = '".SYSTEM_ID."' ";
		$strSql .= " AND SYSTEM_SUB_ID = '".SYSTEM_SUB_ID."' ";
		$strSql .= " AND USER_ID = ?";

		return $strSql;
	}




}

?>