#pragma once
#include "AuthenticateManager.h"
#include "Workspace.h"
#include "Request.h"
#include "Alias.h"

enum AUTH_PARSE_STATUS
{
	AUTH_PARSE_STATUS_NONE	= 0,
	AUTH_PARSE_STATUS_OK	= 1,
	AUTH_PARSE_STATUS_ERROR	= -1,
};

/*!
	ダイジェスト認証クラス
*/
class CDigestAuthenticate
{
public:
	/////////////////////////////////////////////////////////////////////////////////////////
	//	チェック
	/////////////////////////////////////////////////////////////////////////////////////////
	//!	認証方式を解析
	AUTH_PARSE_STATUS ParseAuthMethod(CAuthenticateManager *manager, CAlias &alias, CRequest &request);

	//!	認証チェック
	int CheckAuthUser(CAuthenticateManager *manager, CAlias &alias, CRequest &request);

	/////////////////////////////////////////////////////////////////////////////////////////
	//	生成
	/////////////////////////////////////////////////////////////////////////////////////////
	//!	認証ラインを取得
	CString GetBasicAuthOptionLine(CAlias &alias);

	//!	認証ラインを取得
	CString GetDigestAuthOptionLine(CAuthenticateManager *manager, CAlias &alias);

protected:
	/////////////////////////////////////////////////////////////////////////////////////////
	//	内部処理
	/////////////////////////////////////////////////////////////////////////////////////////
	//!	基本認証の処理
	int ParseBasicAuth(CString authLine, CRequest &request);

	//!	Authorization オプション文字列を分解
	int ParseAuthOptionLine(CString optionLine, CRequest &request);

	//!	ダイジェスト認証の詳細チェック
	int CheckDigestAuthRequest(CAuthenticateManager *manager, CAlias &alias, CRequest &request);

	//!	ハッシュチェック
	int CheckDigestAuthResponse(CAlias &alias, CRequest &request, CString passwd, CString tag = _T(""));

	//!	ユーザ名・パスワードを確認
	int GetUserPasswd(CAuthenticateManager *manager, CAlias &alias, CString userName, CString &passwd);

	//!	URIの一致を確認
	int CheckURIMatch(CString serverURI, CString clientURI);

	//!	realm取得
	CString GetRealm(CString realmSrc);
};
