/*
 * @(#)CooperationAuthenticator.java
 *
 * Copyright (C) 2006 Infocity Inc. All Rights Reserved.
 */
package info.dragonlady.sso.helper;

import javax.servlet.http.HttpServletRequest;

import info.dragonlady.sso.ArtifactReceiver;
import info.dragonlady.system.service.CooperationClient;

/**
 * 他サーバとの連携サービスを使用した認証クラス。
 * 
 * @author Hiroshi.Ebata(INFOCITY)
 * @version $Revision: 1.0 $ $Date: 2006/12/01 14:24:42 $
 */
public class CooperationAuthenticator implements Authenticator {

	/**
	 * コンストラクタ。
	 */
	public CooperationAuthenticator() {
	}

	/**
	 * アカウント認証処理。
	 * 中央連携サーバに問い合わせ、ログイン中のサーバからアーティファクトを取得し、シングルサインオン認証を行う。
	 * アーティファクトを取得できなければ、未認証とする。
	 * 
	 * @param request HTTP要求オブジェクト
	 * @return boolean 認証結果 true：認証OK／false：認証NG
	 * @throws AuthenticationException
	 * @see info.dragonlady.sso.helper.Authenticator#authenticate(javax.servlet.http.HttpServletRequest)
	 */
	public boolean authenticate(HttpServletRequest request) throws AuthenticationException {
		try {
			String id = request.getParameter(SSOServletConfig.getRequestParamLoginKey());
			boolean result = LoginManager.getInstance().isLoggedIn(id);

			if(!result) {
				String serviceAddress = SSOServletConfig.getCooperationService();
				CooperationClient cc = new CooperationClient(serviceAddress);
				String artifact = cc.getArtifact(id);

				if(artifact != null && artifact.length() > 0) {
					// 認証処理
					ArtifactReceiver receiver = new ArtifactReceiver(request, null);
					receiver.receive(artifact);
					if(id.equals(receiver.getAuthId())) {
						// 認証OK
						LoginManager.getInstance().add(id, request.getSession().getId());
						result = true;
					}
				}
			}

			return result;
		} catch(Exception e) {
			throw new AuthenticationException(e);
		}
	}

}
