/*
このファイルの中身は、NTT オープンソースライセンス　バージョン 1.0（「本
契約」という）の適用を受けます。
本契約を遵守しない限り、このファイルを使用してはなりません。
本契約のコピーは、次のＵＲＬから入手できます。
【配布サイトのURL】 http://www.oss.ecl.ntt.co.jp/lms/

本契約に基づき頒布されるソフトウェアは、現状のまま、明示又は黙示のあらゆ
る種類の保証なしで、頒布されます。本契約に基づく権利及び制限を律する特定
の文言については、本契約を参照してください。

「オリジナルコード」は、 NTT Cyber Space Laboratories Code です。 
「オリジナルコード」の「初期開発者」は、日本電信電話株式会社です。  
日本電信電話株式会社により創作された部分は、Copyright (C) 2004 
日本電信電話株式会社 です。
全ての権利が留保されます。 
「コントリビュータ」：_____________________________________ 


The contents of this file are subject to the NTT Opensource License
Version 1.0 (the License); you may not use this file except in
compliance with the License. You may obtain a copy of the License at
【配布サイトのURL】 http://www.oss.ecl.ntt.co.jp/lms/

Software distributed under the License is distributed on an AS IS
basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
License for the specific language governing rights and limitations
under the License.

The Original Code is NTT Cyber Space Laboratories Code .

The Initial Developer of the Original Code is NIPPON TELEGRAPH AND 
TELEPHONE CORPORATION.
Portions created by the NIPPON TELEGRAPH AND TELEPHONE CORPORATION 
are Copyright (C) 2004 NIPPON TELEGRAPH AND TELEPHONE CORPORATION. 
All Rights Reserved.

Contributor(s) ______________________________________.
*/

//
//	ADLogin ADログインBeanクラス
//			変更履歴
//				2004/01/08	新規作成	柴田宗近
//
package jp.co.ntt.lms.xms.login.ad;


import java.io.File;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import jp.co.ntt.lms.xmo.Environment;
import jp.co.ntt.lms.xms.common.user.User;
import jp.co.ntt.lms.xms.framework.XmsException;
import jp.co.ntt.lms.xms.framework.XmsInnerException;
import jp.co.ntt.lms.xms.framework.XmsRequest;
import jp.co.ntt.lms.xms.framework.XmsResponse;
import jp.co.ntt.lms.xms.framework.XmsScreenAction;
import jp.co.ntt.lms.xms.framework.XmsSystemException;
import jp.co.ntt.lms.xms.framework.XmsWarningException;
import jp.co.ntt.lms.xms.login.base.OperateSession;

/**
 * ADログイン処理クラス。<BR>
 * 
 * Active Directoryを使用したログイン認証処理を行います。
 * ログオンユーザ名からログイン可能かどうかを判定し、基本画面へ遷移します。<BR>
 * 
 */
public class AdLoginAction extends XmsScreenAction {

	/**
	 * 初期化処理を行います。<BR>
	 * 処理はありません。<BR>
	 * @param xmsRequest リクエストオブジェクト
	 * @param xmsResponse レスポンスオブジェクト
	 * @return なし
	 */
	protected void initProcessRequest( XmsRequest xmsRequest, XmsResponse xmsResponse ) {}

	/**
	 * ADログイン処理を行います。<BR>
	 * @param xmsRequest パラメータオブジェクト
	 * @param xmsResponse レスポンス・オブジェクト
	 * @return XmsResponse 返却値オブジェクト
	 * @exception Exception 予期しない例外(RMI例外など)
	 * @exception XmsWarningException ワーニング
	 * @exception XmsInnerException 内部エラー（論理矛盾など）
	 * @exception XmsSystemException  システムエラー
	 */
	protected void processRequest( XmsRequest xmsRequest, XmsResponse xmsResponse )
		throws XmsException {


		// リクエスト情報を取得
		HttpServletRequest request = xmsRequest.getRequest();


		// ログオン名称
		//------------------------------------------------------------
		// 受け取るパラメータのフォーマット
		//   ドメイン名\\ログオンユーザ名
		//  注）ログオンユーザ名はADのユーザ名である
		//------------------------------------------------------------
		String logonName = request.getParameter( "LOGON_USER" );

		// ログオンユーザ名称
		String logonUser = null;

		// ドメイン名
		String domainName = null;

		// パラメータのnullチェックを行う
		if( ( logonName == null ) || ( logonName.length() <= 0 ) ) {
			throw new XmsInnerException( "パラメータエラー" );
		}

		// LOGON_USERからユーザ名の部分を取得
		int pointer = logonName.indexOf( "\\" );

		// "\\"が含まれているかどうか
		if( pointer > 0 ){
			// 含まれていた場合

			// ドメイン名取得
			domainName = logonName.substring( 0, pointer );
			// ログオンユーザ名称取得
			logonUser = logonName.substring( pointer + 1, logonName.length() );
		}
		else {
			// ログインオンユーザ名にドメイン情報が付与されていない場合は
			// ADログイン処理失敗
			// ワーニングとする
			throw new XmsWarningException( "base.w.login.adloginerror" );
		}


		// セッションを取得
		HttpSession session = request.getSession();

		// ユーザオブジェクトのインスタンス化
		User userObject = new User();

		// AD認証結果
		boolean checkResultADLogin = false;
		
		try {
			// 画面からのログイン処理の実行
			//--------------------------------------------------------------------------
			//  ADの認証処理とは
			//    AD同期処理が行われていることが前提。
			//    ログオンユーザ名とはAD内でのユーザIDのこと。
			//    以下、チェック内容
			//      AD同期処理が行われていない場合はNG。
			//        AD同期処理が行われているかどうかの判断基準：
			//          ADcorp.iniに設定されている最初（_01となっている）のADが存在するかどうか
			//      ドメイン名のAD内にログオンユーザ名が存在するかどうかをチェックし、
			//      存在する場合は、XMS2内のPeopleテーブル内に存在するかチェックする。
			//      AD内にログオンユーザ名が存在しない場合はNG。
			//      AD内にログオンユーザ名が存在するが、Peopleテーブル内に存在しない場合は
			//      ユーザ情報を作成する。
			//        →理由：管理者の手間を省く親切機能。
			//--------------------------------------------------------------------------
			checkResultADLogin = userObject.checkADLogin( logonUser, domainName );
		}
		catch(Exception ex) {
			throw new XmsSystemException(ex);
		}

		// ADログインチェック処理
		if( checkResultADLogin == false ) {

			// ログイン処理が失敗した場合は
			// 失敗した内容をチェックする

			// AD認証／登録ができたか
			if( userObject.isADLogin() == false ) {
				// できなかった場合
				// 以下のケースのいずれか
				// ・ADにユーザが存在しなかった
				// ・Peopleテーブルにユーザ登録ができなかった（何らかの理由で）

				// ワーニングとする
				throw new XmsWarningException( "base.w.login.adloginerror" );
			}

			// ログインIDがPeopleテーブルに存在していたか
			if( userObject.isExist() == false ) {
				// Peopleテーブルに存在しなかった場合
				// AD認証／登録がＯＫだった場合でこのルートに入る事は
				// かなりシビアなタイミングの場合
				// まずあり得ない

				// ワーニングとする
				throw new XmsWarningException( "base.w.login.usersearcherror" );
			}

			// 削除フラグチェック
			// 削除状態になっていたかどうか
			//-----------------------------------------------------------------------------
			// 削除状態とは
			//   ログインIDのレコードは存在するが、削除フラグが「1」になっていること。
			//   AD同期処理によって作られたユーザを削除した場合（未所属となる）が削除状態。
			//-----------------------------------------------------------------------------
			if( userObject.isDeleted() == true ) {
				// 削除済みだった場合

				// ワーニングとする
				throw new XmsWarningException( "base.w.login.adloginerror" );
			}
		}

		// ADログインチェック正常

		// 認証結果をセッションに格納する
		OperateSession.setSessionFromADLogin( session, userObject );

		//--------------------------------------------------------------------------
		// 次画面選択("./AdSelectMaterial.jsp"の存在チェック)
		// 設定ファイル（XMS.ini）の「ad_file」の項目にJSPが書かれているか。
		// 書かれている場合はそのJSPが存在するかチェックし、
		// 存在する場合はそのJSPを次画面URLとする。
		// 存在しない場合は基本画面を次画面URLとする。
		//--------------------------------------------------------------------------

		// ローカルパスを作成
		// システムディレクトリの取得
		Environment ev;

		// ファイルパス
		String filepath = null;
		// ファイル名
		String filename = null;
		
		try {
			ev = new Environment();
			// 設定ファイルよりシステムディレクトリを取得
			filepath = ev.getSystemDir();
			// 設定ファイルよりファイル名を取得
			filename = ev.getADFile();
		}
		catch(Exception ex) {
			throw new XmsSystemException(ex);	
		}

		// ファイルのフルパス
		filepath = filepath + "/view/xmo/Ad/" + filename;

		// 次画面URL
		String url = null;

		// DD用JSPが存在するかどうか
		boolean existFile = this.checkExistFile( filepath );
		if( existFile == true ) {
			// DD用JSPが存在する場合

			// 次画面はそのJSPとする
			url = "./" + filename;
		}
		else {

			// DD用JSPが存在しない場合
			// 次画面はメニュー画面とする

			// 権限が割り当てられているか
			// ユーザにアサインされている役割（Role）が１つ以上あればtrue
			if( userObject.isRolesAssignment() == false ) {
				// １つも割り当てられていない場合
				// ワーニングとする
				// 権限割り当て無しのメッセージ
				throw new XmsWarningException( "base.w.login.noroles" );
			}

			// デフォルトツリータイプの取得
			//--------------------------------------------------------------
			// ツリー表示タイプとは
			// 基本画面にてユーザツリー、LOツリーのどちらを表示させるのか
			// という値
			//   ユーザツリー：「1」
			//   L0ツリー    ：「2」
			//
			// デフォルトツリータイプとは
			//   ユーザに割り当てられている権限（XMOEntry）を
			//   まとめたもの（初期メニュー）に割り当てられている優先度が
			//   一番高い（値が一番小さい）もののツリー表示タイプのこと
			//--------------------------------------------------------------
			String defaultTreeType = userObject.getDefaultTreeType();

			// 学習者かどうかの判定
			boolean isLearner = userObject.isLearner();

			// URLパラメータに使う文字列
			String learner = null;
			//--------------------------------------------------------------
			// 学習者フラグ
			//   学習者                  ：「YES」
			//   学習者じゃない（管理者）：「NO」
			//
			// 学習者とは
			//   ユーザに割り当てられている権限（XMOEntry）のうち、
			//      学習のみを持つ場合
			//      ログ管理のみを持つ場合
			//      学習とログ管理のみを持つ場合
			//   のいずれか。  
			//--------------------------------------------------------------
			if( isLearner == true ) {
				learner = "YES";
			}
			else {
				learner = "NO";
			}

			// 次画面URLの作成
			// 基本画面へ遷移
			//--------------------------------------------------------------------------
			// URLパラメータ説明
			// tree_view_type ：ツリー表示タイプ（1：ユーザツリー　2：LOツリー）
			// learner        ：学習者フラグ（※１）
			// ini_menu       ：初期メニュー（※２）
			//
			// ※１　学習者の場合は基本画面の振る舞いが異なる
			//       １．表示ツリー切り換えボタンを非表示にする。
			//       ２．プロパティ画面のタグを非表示にする。
			// ※２  初期メニューの用途
			//       ShowSubGroupChildren.jspまでURLパラメータとして引き継いでいるが、
			//       結局使用していない
			//--------------------------------------------------------------------------
			url = "../Base/frameset.vm?tree_view_type=" + defaultTreeType + 
						"&learner=" + learner + 
						"&ini_menu=";
		}

		// 返却値オブジェクトにBean名を設定
		xmsResponse.setBusinessBeanName( "Login" );

		// 返却値タイプを設定　この場合はリダイレクト
		xmsResponse.setOutType( XmsResponse.REDIRECT );

		// リダイレクト先URLを設定
		xmsResponse.setUrl( url );

	}

// ------------------ 内部関数 ----------------------------------
	/**
	 * ファイルの存在チェックを行います。
	 *
	 * @param filepath ファイルのローカルフルパス
	 * @return ファイルの有無
	 */
	private boolean checkExistFile( String filepath ) {

		// ファイルオブジェクト生成
		File file = new File( filepath );
		// ファイルが存在しているかどうかの真偽値を返却
		return file.exists();
	}
}
