• R/O
  • SSH
  • HTTPS

sf-04webserver: Commit


Commit MetaInfo

Revisión453 (tree)
Tiempo2011-08-28 00:05:41
Autoryuh

Log Message

(empty log message)

Cambiar Resumen

Diferencia incremental

--- 1xx/04WebServer/trunk/CGIResponse.cpp (revision 452)
+++ 1xx/04WebServer/trunk/CGIResponse.cpp (revision 453)
@@ -14,7 +14,7 @@
1414 throw new CSystemResponse(server,context,"指定されたファイルは存在しません",404);
1515
1616 // メソッドはGET/POST/HEAD
17- if(request.m_method != "GET" && request.m_method != "HEAD" && request.m_method != "POST")
17+ if(request.GetMethod() != "GET" && request.GetMethod() != "HEAD" && request.GetMethod() != "POST")
1818 throw new CSystemResponse(server,context,"対応していないメソッドです",405);
1919
2020 if(alias.IsExtarExist())
@@ -33,7 +33,7 @@
3333 */
3434 void CCGIResponse::PreCreateResponse()
3535 {
36- __int64 recvLen = m_request.m_options.GetConfig("Content-length",0,TRUE);
36+ __int64 recvLen = m_request.GetOptionAccess().GetConfig("Content-length",0,TRUE);
3737
3838 // 受信サイズを設定
3939 if(recvLen > 65536)
--- 1xx/04WebServer/trunk/FileMoveResponse.cpp (revision 452)
+++ 1xx/04WebServer/trunk/FileMoveResponse.cpp (revision 453)
@@ -25,7 +25,7 @@
2525 SetResponseCode(204);
2626
2727 // 出力先の取得
28- CString destUrl = m_request.m_options.GetConfig("Destination","",TRUE);
28+ CString destUrl = m_request.GetOptionAccess().GetConfig("Destination","",TRUE);
2929
3030 // 指定先が無い
3131 if(destUrl.GetLength() <= 7)
@@ -48,12 +48,12 @@
4848 if(destAlias.GetPathInfo().GetConfig("LocalPath","") != m_alias.GetPathInfo().GetConfig("LocalPath",""))
4949 throw CServerFatalException("移動不可能な組み合わせです");
5050
51- if(m_request.m_method == "MOVE")
51+ if(m_request.GetMethod() == "MOVE")
5252 {
5353 if(::MoveFile(m_alias.GetTarget(),destAlias.GetTarget())==0)
5454 throw CServerFatalException("ファイルの操作に失敗しました、システムエラーです");
5555 }
56- else if(m_request.m_method == "COPY")
56+ else if(m_request.GetMethod() == "COPY")
5757 {
5858 if(m_alias.IsDirectory())
5959 {
--- 1xx/04WebServer/trunk/Request.h (revision 452)
+++ 1xx/04WebServer/trunk/Request.h (revision 453)
@@ -9,28 +9,72 @@
99 class CRequest
1010 {
1111 public:
12- CRequest(CString &header,CWorkspaceAccess requestInfo);
12+ CRequest(CString &header, CWorkspaceAccess requestInfo);
1313 virtual ~CRequest(void);
1414
15+ /////////////////////////////////////////////////////////////////////////////////////
16+ // 取得
17+ /////////////////////////////////////////////////////////////////////////////////////
18+ //! メソッド
19+ CString GetMethod() { return m_requestInfo.GetKeyStr(_T("Method"), _T("")); };
20+
21+ //! URI
22+ CString GetURI() { return m_requestInfo.GetKeyStr(_T("URL"), _T("")); };
23+
24+ //! URI Object
25+ CString GetURIObject() { return m_requestInfo.GetKeyStr(_T("Object"), _T("")); };
26+
27+ //! Version
28+ CString GetVersion() { return m_requestInfo.GetKeyStr(_T("Version"), _T("")); };
29+
30+ //! Query
31+ CString GetQuery() { return m_requestInfo.GetKeyStr(_T("Query"), _T("")); };
32+
33+ //! QueryDecoded
34+ CString GetQueryDecoded() { return m_requestInfo.GetKeyStr(_T("QueryDecoded"), _T("")); };
35+
36+ //! User
37+ CString GetUser() { return m_requestInfo.GetKeyStr(_T("User"), _T("")); };
38+
39+ //! Passwd
40+ CString GetPasswd() { return m_requestInfo.GetKeyStr(_T("Passwd"), _T("")); };
41+
42+ /////////////////////////////////////////////////////////////////////////////////////
43+ // 設定
44+ /////////////////////////////////////////////////////////////////////////////////////
45+ //! User
46+ void SetUser(CString user) { return m_requestInfo.SetKeyStr(_T("User"), user); };
47+
48+ //! Passwd
49+ void SetPasswd(CString passwd) { return m_requestInfo.SetKeyStr(_T("Passwd"), passwd); };
50+
51+ /////////////////////////////////////////////////////////////////////////////////////
52+ // ワークスペースアクセス
53+ /////////////////////////////////////////////////////////////////////////////////////
54+ //! 全て
55+ CWorkspaceAccess GetRequestInfoAccess() { return(m_requestInfo); };
56+
57+ //! オプション
58+ CWorkspaceAccess GetOptionAccess() { return(m_requestInfo.GetAccess(_T("Options"))); };
59+
60+ //! ダイジェスト認証情報
61+ CWorkspaceAccess GetAuthDetailAccess() { return m_requestInfo.GetAccess(_T("AuthDetail")); };
62+
1563 protected:
16- int ParseHeader(CString &header,CWorkspaceAccess requestInfo); // ヘッダーの解析を行う
17- int GetToken(CString &str,CString &token,CString div);
18- int GetLine(CString &str,CString &line);
64+ //! ヘッダー解析
65+ int ParseHeader(CString &header, CWorkspaceAccess requestInfo);
1966
67+ //! トークン取得
68+ int GetToken(CString &str, CString &token, CString div);
2069
21-public:
70+ //! ライン取得
71+ int GetLine(CString &str, CString &line);
72+
73+
74+protected:
2275 /////////////////////////////////////////////////////////////////////////////////////
23- // 解析情報
76+ // メンバ変数
2477 /////////////////////////////////////////////////////////////////////////////////////
25- CString m_method;
26- CString m_uri;
27- CString m_uriObject;
28- CString m_version;
29- CString m_query;
30- CString m_queryDecoded;
31- CString m_user;
32- CString m_passwd;
33-
34- CWorkspaceAccess m_requestInfo; // リクエスト情報
35- CWorkspaceAccess m_options; // リクエスト情報
78+ //! リクエスト情報
79+ CWorkspaceAccess m_requestInfo;
3680 };
--- 1xx/04WebServer/trunk/AuthenticateManager.cpp (revision 452)
+++ 1xx/04WebServer/trunk/AuthenticateManager.cpp (revision 453)
@@ -25,6 +25,8 @@
2525 */
2626 void CAuthenticateManager::Start(CWorkspaceAccess setting)
2727 {
28+ m_setting = setting;
29+
2830 // スクランブルキーを設定
2931 srand((unsigned int)CTime::GetCurrentTime().GetTime() + GetTickCount());
3032 m_scrambleKey.AppendDoubleWord(rand());
@@ -37,15 +39,41 @@
3739 m_privateKey += (TCHAR)((rand() % 27) + _T('a'));
3840
3941 // Nonce利用可能期間
40- m_expireTime = setting.GetKeyInt(_T("Authenticate::NonceLifeTime"), 5); // 5分間
42+ m_expireTime = setting.GetKeyInt(_T("Authenticate::NonceLifeTime"), 60) * 60; // 60分間
43+/*
4144
42-
4345 CWorkspace test;
4446 CDigestAuthenticate::ParseAuthOptionLine("Digest username=\"\", realm=\"Secret, Zone,\", nonce=\"RMH1usDrAwA=6dc290ea3304de42a7347e0a94089ff5912ce0de\", uri=\"/~68user/net/sample/http-auth-digest/secret.html\", algorithm=MD5, qop=auth, nc=00000001, cnonce=\"e79e26e0d17c978d\", response=\"0d73182c1602ce8749feeb4b89389019\"", test.GetAccess(""));
4547 //CheckNonce(CreateNonce());
48+*/
4649 }
4750
51+
4852 /*!
53+ ユーザのパスワードを確認
54+
55+ \return FALSE:認証不可, TRUE:認証OK
56+*/
57+int CAuthenticateManager::GetUserPasswd(CString userName, CString &passwd)
58+{
59+ CWorkspaceAccess enableUser = m_setting.GetAccess("User::Enable");
60+
61+ // 有効なユーザを検索
62+ CStringArray userList;
63+ enableUser.GetAllSubNode(userList);
64+ for(int i=0;i<userList.GetSize();i++)
65+ {
66+ CWorkspaceAccess user = enableUser.GetAccess(userList[i]);
67+ if(user.GetConfig(_T("User"), _T("")) == userName)
68+ {
69+ passwd = user.GetConfig(_T("Passwd"), _T(""));
70+ return(TRUE);
71+ }
72+ }
73+ return(FALSE);
74+}
75+
76+/*!
4977 nonce生成
5078 */
5179 CString CAuthenticateManager::CreateNonce(CString tag)
@@ -68,6 +96,8 @@
6896
6997 /*!
7098 nonceチェック
99+
100+ \return FALSE:認証不可, TRUE:認証OK
71101 */
72102 int CAuthenticateManager::CheckNonce(CString nonce, CString tag)
73103 {
--- 1xx/04WebServer/trunk/OptionsResponse.cpp (revision 452)
+++ 1xx/04WebServer/trunk/OptionsResponse.cpp (revision 453)
@@ -24,7 +24,7 @@
2424
2525 CString allow = "OPTIONS";
2626
27- if(m_request.m_uriObject == "*")
27+ if(m_request.GetURIObject() == "*")
2828 {
2929 allow += ", GET, HEAD, DELETE, PUT, POST, COPY, MOVE, MKCOL, PROPFIND";
3030 }
--- 1xx/04WebServer/trunk/Workspace.cpp (revision 452)
+++ 1xx/04WebServer/trunk/Workspace.cpp (revision 453)
@@ -122,7 +122,7 @@
122122 {
123123 SCOPE_LOCK();
124124
125- return(CTextTools::ANSIToUTF8Str(ToXMLString(savePath).GetBuffer(0)));
125+ return(CTextTools::MBStrToUTF8Str(ToXMLString(savePath).GetBuffer(0)));
126126 }
127127
128128 /*!
@@ -132,7 +132,7 @@
132132 {
133133 SCOPE_LOCK();
134134
135- return(FromXMLString(CTextTools::UTF8ToANSIStr(xml.GetBuffer(0))));
135+ return(FromXMLString(CTextTools::UTF8ToMBStr(xml.GetBuffer(0))));
136136 }
137137
138138 /*!
--- 1xx/04WebServer/trunk/TextTools.h (revision 452)
+++ 1xx/04WebServer/trunk/TextTools.h (revision 453)
@@ -52,14 +52,14 @@
5252 //! Unicodeから、ANSI文字列へ
5353 static CStringA WideStrToMultiStr(const wchar_t *str);
5454
55- //! ANSIから、Unicode文字列へ
56- static CStringW MultiStrToWideStr(const char *str);
55+ //! MBから、Unicode文字列へ
56+ static CStringW MBStrToWideStr(const char *str);
5757
58- //! ANSIからUTF8へ
59- static CStringA ANSIToUTF8Str(const char *str);
58+ //! MBからUTF8へ
59+ static CStringA MBStrToUTF8Str(const char *str);
6060
61- //! UTF8からANSIへ
62- static CStringA UTF8ToANSIStr(const char *str);
61+ //! UTF8からMBへ
62+ static CStringA UTF8ToMBStr(const char *str);
6363
6464 //! UnicodeからUTF8へ
6565 static CStringA WideStrToUTF8Str(const wchar_t *str);
@@ -67,6 +67,7 @@
6767 //! 文字列をUTF8へ
6868 static CStringA StrToUTF8(CString str);
6969
70+
7071 private:
7172 //////////////////////////////////////////////////////////////
7273 // ワイルドカード比較
--- 1xx/04WebServer/trunk/DigestAuthenticate.cpp (revision 452)
+++ 1xx/04WebServer/trunk/DigestAuthenticate.cpp (revision 453)
@@ -4,11 +4,186 @@
44 #include "Base64.h"
55 #include "CryptTools.h"
66
7+/////////////////////////////////////////////////////////////////////////////////////////
8+// チェック
9+/////////////////////////////////////////////////////////////////////////////////////////
710 /*!
11+ 認証解析
12+
13+ \return AUTH_PARSE_STATUS_OK:OK, AUTH_PARSE_STATUS_NONE:認証無し、AUTH_PARSE_STATUS_ERROR:異常な要求
14+*/
15+AUTH_PARSE_STATUS CDigestAuthenticate::ParseAuthMethod(CAuthenticateManager *manager, CAlias &alias, CRequest &request)
16+{
17+ // 認証オプションを取得
18+ CString authOptionLine = request.GetOptionAccess().GetConfig(_T("Authorization"), _T(""));
19+ authOptionLine.Trim();
20+ TRACE("Authorization: %s\n", authOptionLine);
21+
22+ // 認証無し
23+ if(authOptionLine.IsEmpty())
24+ return(AUTH_PARSE_STATUS_NONE);
25+
26+ // 認証取得
27+ CString authMethod;
28+ CTextTools::GetToken(authOptionLine, authMethod, _T(" "), TRUE);
29+
30+ // 認証タイプ
31+ authMethod.MakeLower();
32+ request.GetAuthDetailAccess().SetKeyStr(_T("AuthMethod"), authMethod);
33+
34+ // 認証タイプ
35+ if(authMethod == _T("basic"))
36+ {
37+ // 分析
38+ if(ParseBasicAuth(authOptionLine, request))
39+ return(AUTH_PARSE_STATUS_ERROR);
40+ }
41+ else if(authMethod == _T("digest"))
42+ {
43+ // 分析
44+ if(ParseAuthOptionLine(authOptionLine, request))
45+ return(AUTH_PARSE_STATUS_ERROR);
46+
47+ // 要求をチェック
48+ if(CheckDigestAuthRequest(manager, alias, request))
49+ return(AUTH_PARSE_STATUS_ERROR);
50+ }
51+ else
52+ return(AUTH_PARSE_STATUS_ERROR);
53+
54+ return(AUTH_PARSE_STATUS_OK);
55+}
56+
57+/*!
58+ 認証チェック
59+
60+ \return FALSE:認証不可, TRUE:認証OK
61+*/
62+int CDigestAuthenticate::CheckAuthUser(CAuthenticateManager *manager, CAlias &alias, CRequest &request)
63+{
64+ if(request.GetAuthDetailAccess().GetKeyStr(_T("AuthMethod"), _T("")) == _T("basic"))
65+ {
66+ CString passwd;
67+ if(GetUserPasswd(manager, alias, request.GetUser(), passwd))
68+ {
69+ if(request.GetPasswd() == passwd)
70+ return(TRUE);
71+ }
72+ return(FALSE);
73+ }
74+ else if(request.GetAuthDetailAccess().GetKeyStr(_T("AuthMethod"), _T("")) == _T("digest"))
75+ {
76+ // ダイジェスト認証詳細
77+ CWorkspaceAccess digestAuthOption = request.GetAuthDetailAccess().GetAccess(_T("DigestAuth"));
78+
79+ // nonceをチェック
80+ if(!manager->CheckNonce(digestAuthOption.GetKeyStr(_T("nonce"), _T(""))))
81+ return(FALSE);
82+
83+ CString passwd;
84+ if(GetUserPasswd(manager, alias, request.GetUser(), passwd))
85+ {
86+ // ハッシュチェック
87+ if(CheckDigestAuthResponse(alias, request, passwd))
88+ return(TRUE);
89+ }
90+ return(FALSE);
91+ }
92+ else
93+ return(FALSE);
94+}
95+
96+
97+/////////////////////////////////////////////////////////////////////////////////////////
98+// 生成
99+/////////////////////////////////////////////////////////////////////////////////////////
100+/*!
101+ 認証ラインを取得(Basic)
102+*/
103+CString CDigestAuthenticate::GetBasicAuthOptionLine(CAlias &alias)
104+{
105+ CString line = CTextTools::GetFormat(_T("Basic realm=\"%s\""), alias.GetPathInfo().GetKeyStr(_T("Info"), _T("")));
106+ TRACE("%s\n", line);
107+ return(line);
108+}
109+
110+
111+/*!
112+ 認証ラインを取得(Digest)
113+*/
114+CString CDigestAuthenticate::GetDigestAuthOptionLine(CAuthenticateManager *manager, CAlias &alias)
115+{
116+ CString realm = GetRealm(alias.GetPathInfo().GetKeyStr(_T("Info"), _T("")));
117+
118+ CString line = CTextTools::GetFormat(_T("Digest realm=\"%s\", nonce=\"%s\", algorithm=MD5, qop=\"auth\""), realm, manager->CreateNonce());
119+ TRACE("%s\n", line);
120+ return(line);
121+}
122+
123+
124+
125+/////////////////////////////////////////////////////////////////////////////////////////
126+// 内部処理
127+/////////////////////////////////////////////////////////////////////////////////////////
128+/*!
129+ 基本認証の処理
130+*/
131+int CDigestAuthenticate::ParseBasicAuth(CString authLine, CRequest &request)
132+{
133+ // Base64を解析
134+ CString userpass = CBase64::Decode64(authLine);
135+
136+ // 分解
137+ int index = userpass.Find(":");
138+ if(index == -1)
139+ return(-1);
140+
141+ // ユーザ名
142+ request.SetUser(userpass.Left(index));
143+
144+ // パスワード
145+ request.SetPasswd(userpass.Mid(index + 1));
146+
147+ return(0);
148+}
149+
150+/*!
151+ ダイジェスト認証の詳細チェック
152+*/
153+int CDigestAuthenticate::CheckDigestAuthRequest(CAuthenticateManager *manager, CAlias &alias, CRequest &request)
154+{
155+ // ダイジェスト認証詳細
156+ CWorkspaceAccess digestAuthOption = request.GetAuthDetailAccess().GetAccess(_T("DigestAuth"));
157+
158+ // realm確認
159+ if(digestAuthOption.GetKeyStr(_T("realm"), _T("")) != GetRealm(alias.GetPathInfo().GetKeyStr(_T("Info"), _T(""))))
160+ return(-1);
161+
162+ // uri確認(後方一致で一致すればよい)
163+ if(!CheckURIMatch(request.GetURI(), digestAuthOption.GetKeyStr(_T("uri"), _T(""))))
164+ return(-1);
165+
166+ return(0);
167+}
168+
169+/*!
8170 ハッシュ取得
9171 */
10-CString CDigestAuthenticate::GetAuthDigestResponse(CString nonce, CString user, CString realm, CString passwd, CString nc, CString cnonce, CString qop, CString method, CString uri, CString tag)
172+int CDigestAuthenticate::CheckDigestAuthResponse(CAlias &alias, CRequest &request, CString passwd, CString tag)
11173 {
174+ // ダイジェスト認証詳細
175+ CWorkspaceAccess digestAuthOption = request.GetAuthDetailAccess().GetAccess(_T("DigestAuth"));
176+
177+ CString responseClient = digestAuthOption.GetKeyStr(_T("response"), _T(""));
178+ CString nonce = digestAuthOption.GetKeyStr(_T("nonce"), _T(""));
179+ CString user = digestAuthOption.GetKeyStr(_T("username"), _T(""));
180+ CString realm = digestAuthOption.GetKeyStr(_T("realm"), _T(""));
181+ CString nc = digestAuthOption.GetKeyStr(_T("nc"), _T(""));
182+ CString cnonce = digestAuthOption.GetKeyStr(_T("cnonce"), _T(""));
183+ CString qop = digestAuthOption.GetKeyStr(_T("qop"), _T(""));
184+ CString uri = digestAuthOption.GetKeyStr(_T("uri"), _T(""));
185+ CString method = request.GetMethod();
186+
12187 // A1文字列(MD5-HEX)
13188 CString a1 = CCryptTools::GetMD5HexFromStr(user + _T(":") + realm + _T(":") + passwd);
14189
@@ -16,8 +191,11 @@
16191 CString a2 = CCryptTools::GetMD5HexFromStr(method + _T(":") + uri);
17192
18193 // Response文字列(MD5-HEX)
19- CString response = CCryptTools::GetMD5HexFromStr(a1 + _T(":") + nonce + _T(":") + nc + _T(":") + cnonce + _T(":") + qop + _T(":") + a2);
20- return(response);
194+ CString responseServer = CCryptTools::GetMD5HexFromStr(a1 + _T(":") + nonce + _T(":") + nc + _T(":") + cnonce + _T(":") + qop + _T(":") + a2);
195+
196+ if(responseServer == responseClient)
197+ return(TRUE);
198+ return(FALSE);
21199 }
22200
23201
@@ -24,23 +202,16 @@
24202 /*!
25203 Authorization オプション文字列を分解
26204 */
27-void CDigestAuthenticate::ParseAuthOptionLine(CString optionLine, CWorkspaceAccess responseInfo)
205+int CDigestAuthenticate::ParseAuthOptionLine(CString optionLine, CRequest &request)
28206 {
29- // 前処理
30- optionLine.Trim();
207+ // ダイジェスト認証詳細
208+ CWorkspaceAccess digestAuthOption = request.GetAuthDetailAccess().GetAccess(_T("DigestAuth"));
31209
32- // 認証方法
33- CString authMethod;
34- CTextTools::GetToken(optionLine, authMethod, _T(" "), TRUE);
35- authMethod.MakeLower();
36- responseInfo.SetKeyStr(_T("AuthMethod"), authMethod);
37-
38210 // 詳細を取得
39211 CStringArray optionArray;
40212 CTextTools::GetAllTokenDoubleQuotation(optionLine, optionArray, _T(","), TRUE);
41213
42214 // 詳細を分解
43- CWorkspaceAccess options = responseInfo.GetAccess(_T("Options"));
44215 for(int i=0; i<optionArray.GetSize(); i++)
45216 {
46217 CString pair = optionArray[i];
@@ -59,11 +230,112 @@
59230
60231 // ダブルコーテーションが無ければ追加
61232 if(key.Find(_T("\"")) == -1 && pair.Find(_T("\"")) == -1)
62- options.SetKeyStr(key, pair);
233+ digestAuthOption.SetKeyStr(key.MakeLower(), pair);
63234 }
64235 }
65236 }
237+
238+ // チェック
239+ if(digestAuthOption.GetKeyStr(_T("username"), _T("")).IsEmpty())
240+ return(-1);
241+ if(!digestAuthOption.KeyIsExist(_T("realm")))
242+ return(-1);
243+ if(digestAuthOption.GetKeyStr(_T("nonce"), _T("")).IsEmpty())
244+ return(-1);
245+ if(digestAuthOption.GetKeyStr(_T("uri"), _T("")).IsEmpty())
246+ return(-1);
247+ if(digestAuthOption.GetKeyStr(_T("algorithm"), _T("")).CompareNoCase(_T("MD5")) != 0)
248+ return(-1);
249+ if(digestAuthOption.GetKeyStr(_T("qop"), _T("")).CompareNoCase(_T("auth")) != 0)
250+ return(-1);
251+ if(digestAuthOption.GetKeyStr(_T("nc"), _T("")).IsEmpty())
252+ return(-1);
253+ if(digestAuthOption.GetKeyStr(_T("cnonce"), _T("")).IsEmpty())
254+ return(-1);
255+ if(digestAuthOption.GetKeyStr(_T("response"), _T("")).IsEmpty())
256+ return(-1);
257+
258+ // ユーザ名
259+ request.SetUser(digestAuthOption.GetKeyStr(_T("username"), _T("")));
260+ return(0);
66261 }
67262
68263
264+/*!
265+ ユーザ名・パスワードチェック
69266
267+ \return FALSE:認証不可, TRUE:認証OK
268+*/
269+int CDigestAuthenticate::GetUserPasswd(CAuthenticateManager *manager, CAlias &alias, CString userName, CString &passwd)
270+{
271+ CWorkspaceAccess pathUser = alias.GetPathInfo().GetAccess("Users");
272+
273+ // パスに設定されてるユーザか確認
274+ CStringArray userList;
275+ pathUser.GetAllKey(userList);
276+ for(int i=0;i<userList.GetSize();i++)
277+ {
278+ if(pathUser.GetConfig(userList[i], _T("")) == userName)
279+ return(manager->GetUserPasswd(userName, passwd)); // ユーザ・パスワードが有効か確認
280+ }
281+
282+ // WindowsXP 対策
283+ int index = userName.Find("\\");
284+ if(index == -1)
285+ return(FALSE);
286+ userName = userName.Mid(index+1);
287+
288+ // もう一度確認
289+ for(int i=0;i<userList.GetSize();i++)
290+ {
291+ if(pathUser.GetConfig(userList[i], _T("")) == userName)
292+ return(manager->GetUserPasswd(userName, passwd)); // ユーザ・パスワードが有効か確認
293+ }
294+
295+ return(FALSE);
296+}
297+
298+
299+/*!
300+ URIの一致を確認
301+*/
302+int CDigestAuthenticate::CheckURIMatch(CString serverURI, CString clientURI)
303+{
304+ if(serverURI.GetLength() <= clientURI.GetLength())
305+ if(serverURI == clientURI.Right(serverURI.GetLength()))
306+ return(TRUE);
307+
308+ // IE6対策
309+ CString uriIE6;
310+ if(CTextTools::GetToken(serverURI, uriIE6, _T("?")))
311+ {
312+ if(uriIE6.GetLength() <= clientURI.GetLength())
313+ if(uriIE6 == clientURI.Right(serverURI.GetLength()))
314+ return(TRUE);
315+ }
316+
317+ return(FALSE);
318+}
319+
320+
321+/*!
322+ realm取得
323+*/
324+CString CDigestAuthenticate::GetRealm(CString realmSrc)
325+{
326+ CStringW str(realmSrc), ret;
327+ wchar_t *ptr = str.GetBuffer(0);
328+ int len = str.GetLength();
329+
330+ // 置き換え
331+ for(int i=0; i<len; i++)
332+ {
333+ if(*ptr >= 0x0080)
334+ ret += L"_";
335+ else
336+ ret += *ptr;
337+ *ptr++;
338+ }
339+ return(CStringA(ret));
340+}
341+
--- 1xx/04WebServer/trunk/DigestAuthenticate.h (revision 452)
+++ 1xx/04WebServer/trunk/DigestAuthenticate.h (revision 453)
@@ -1,7 +1,16 @@
11 #pragma once
22 #include "AuthenticateManager.h"
33 #include "Workspace.h"
4+#include "Request.h"
5+#include "Alias.h"
46
7+enum AUTH_PARSE_STATUS
8+{
9+ AUTH_PARSE_STATUS_NONE = 0,
10+ AUTH_PARSE_STATUS_OK = 1,
11+ AUTH_PARSE_STATUS_ERROR = -1,
12+};
13+
514 /*!
615 ダイジェスト認証クラス
716 */
@@ -8,9 +17,46 @@
817 class CDigestAuthenticate
918 {
1019 public:
11- //! ハッシュ取得
12- static CString GetAuthDigestResponse(CString nonce, CString user, CString realm, CString passwd, CString nc, CString cnonce, CString qop, CString method, CString uri, CString tag = _T(""));
20+ /////////////////////////////////////////////////////////////////////////////////////////
21+ // チェック
22+ /////////////////////////////////////////////////////////////////////////////////////////
23+ //! 認証方式を解析
24+ AUTH_PARSE_STATUS ParseAuthMethod(CAuthenticateManager *manager, CAlias &alias, CRequest &request);
1325
26+ //! 認証チェック
27+ int CheckAuthUser(CAuthenticateManager *manager, CAlias &alias, CRequest &request);
28+
29+ /////////////////////////////////////////////////////////////////////////////////////////
30+ // 生成
31+ /////////////////////////////////////////////////////////////////////////////////////////
32+ //! 認証ラインを取得
33+ CString GetBasicAuthOptionLine(CAlias &alias);
34+
35+ //! 認証ラインを取得
36+ CString GetDigestAuthOptionLine(CAuthenticateManager *manager, CAlias &alias);
37+
38+protected:
39+ /////////////////////////////////////////////////////////////////////////////////////////
40+ // 内部処理
41+ /////////////////////////////////////////////////////////////////////////////////////////
42+ //! 基本認証の処理
43+ int ParseBasicAuth(CString authLine, CRequest &request);
44+
1445 //! Authorization オプション文字列を分解
15- static void ParseAuthOptionLine(CString optionLine, CWorkspaceAccess responseInfo);
46+ int ParseAuthOptionLine(CString optionLine, CRequest &request);
47+
48+ //! ダイジェスト認証の詳細チェック
49+ int CheckDigestAuthRequest(CAuthenticateManager *manager, CAlias &alias, CRequest &request);
50+
51+ //! ハッシュチェック
52+ int CheckDigestAuthResponse(CAlias &alias, CRequest &request, CString passwd, CString tag = _T(""));
53+
54+ //! ユーザ名・パスワードを確認
55+ int GetUserPasswd(CAuthenticateManager *manager, CAlias &alias, CString userName, CString &passwd);
56+
57+ //! URIの一致を確認
58+ int CheckURIMatch(CString serverURI, CString clientURI);
59+
60+ //! realm取得
61+ CString GetRealm(CString realmSrc);
1662 };
--- 1xx/04WebServer/trunk/Request.cpp (revision 452)
+++ 1xx/04WebServer/trunk/Request.cpp (revision 453)
@@ -24,37 +24,48 @@
2424 * ヘッダー解析
2525 *
2626 */
27-int CRequest::ParseHeader(CString &header,CWorkspaceAccess requestInfo)
27+int CRequest::ParseHeader(CString &header, CWorkspaceAccess requestInfo)
2828 {
29+ // アクセスを設定
30+ m_requestInfo = requestInfo;
31+
32+ // 各情報
2933 CString line;
34+ CString passwd;
35+ CString user;
36+ CString method;
37+ CString uri;
38+ CString uriObject;
39+ CString version;
40+ CString query;
41+ CString queryDecoded;
3042
31-
3243 // リクエスト取り出し
3344 if(GetLine(header,line)==0)
3445 return(-1);
3546
3647 // メソッド
37- if(GetToken(line,m_method," ")==0)
48+ if(GetToken(line,method," ")==0)
3849 return(-1);
3950
4051 // URI
41- if(GetToken(line,m_uri," ")==0)
52+ if(GetToken(line,uri," ")==0)
4253 return(-1);
4354
4455 // URIObject
45- m_uriObject = CUrlUtility::GetUrlObject(m_uri);
46- m_uriObject = CUrlUtility::DecodeUrl(m_uriObject);
56+ uriObject = CUrlUtility::GetUrlObject(uri);
57+ uriObject = CUrlUtility::DecodeUrl(uriObject);
4758
4859 // Query
49- m_query = CUrlUtility::GetQuery(m_uri);
50- m_queryDecoded = CUrlUtility::Decode(m_query);
60+ query = CUrlUtility::GetQuery(uri);
61+ queryDecoded = CUrlUtility::Decode(query);
5162
5263 // バージョン
53- if(GetToken(line,m_version,"/")==0)
64+ if(GetToken(line,version,"/")==0)
5465 return(-1);
5566 if(line.GetLength() == 0)
5667 return(-1);
57- m_version = line;
68+ version = line;
5869
5970
6071 // 高速化のため、ロック
@@ -62,7 +73,7 @@
6273
6374
6475 // オプションヘッダー取得
65- CWorkspaceAccess options = requestInfo.GetAccess("Options");
76+ CWorkspaceAccess options = GetOptionAccess();
6677 CString key;
6778 while(1)
6879 {
@@ -96,8 +107,8 @@
96107 int index = userpass.Find(":");
97108 if(index != -1)
98109 {
99- m_user = userpass.Left(index);
100- m_passwd = userpass.Mid(index + 1);
110+ user = userpass.Left(index);
111+ passwd = userpass.Mid(index + 1);
101112 }
102113 }
103114 }
@@ -104,18 +115,15 @@
104115
105116
106117 // 環境へ設定
107- requestInfo.SetConfig("Method",m_method);
108- requestInfo.SetConfig("URL",m_uri);
109- requestInfo.SetConfig("Object",m_uriObject);
110- requestInfo.SetConfig("Version",m_version);
111- requestInfo.SetConfig("Query",m_query);
112- requestInfo.SetConfig("QueryDecoded",m_queryDecoded);
113- requestInfo.SetConfig("User",m_user);
114- requestInfo.SetConfig("Passwd",m_passwd);
118+ m_requestInfo.SetConfig("Method",method);
119+ m_requestInfo.SetConfig("URL",uri);
120+ m_requestInfo.SetConfig("Object",uriObject);
121+ m_requestInfo.SetConfig("Version",version);
122+ m_requestInfo.SetConfig("Query",query);
123+ m_requestInfo.SetConfig("QueryDecoded",queryDecoded);
124+ m_requestInfo.SetConfig("User",user);
125+ m_requestInfo.SetConfig("Passwd",passwd);
115126
116- m_requestInfo = requestInfo;
117- m_options = options;
118-
119127 return(0);
120128 }
121129
--- 1xx/04WebServer/trunk/AuthenticateManager.h (revision 452)
+++ 1xx/04WebServer/trunk/AuthenticateManager.h (revision 453)
@@ -24,10 +24,16 @@
2424 //! nonceチェック
2525 int CheckNonce(CString nonce, CString tag = _T(""));
2626
27+ //! ユーザのパスワードを取得
28+ int GetUserPasswd(CString userName, CString &passwd);
29+
2730 protected:
2831 /////////////////////////////////////////////////////////////////////////////////////////////////////
2932 // メンバ変数
3033 /////////////////////////////////////////////////////////////////////////////////////////////////////
34+ //! 設定
35+ CWorkspaceAccess m_setting;
36+
3137 //! nonce暗号化キー
3238 CBinaryData m_scrambleKey;
3339
--- 1xx/04WebServer/trunk/SubProcess.cpp (revision 452)
+++ 1xx/04WebServer/trunk/SubProcess.cpp (revision 453)
@@ -424,8 +424,8 @@
424424 env.SetConfig("SERVER_PORT",server->m_serverInfo.GetConfig("ServerPort",""));
425425
426426 // サーバ名(クライアントから取得)
427- if(!request.m_options.GetConfig("Host","").IsEmpty())
428- env.SetConfig("HTTP_HOST",request.m_options.GetConfig("Host",""));
427+ if(!request.GetOptionAccess().GetConfig("Host","").IsEmpty())
428+ env.SetConfig("HTTP_HOST",request.GetOptionAccess().GetConfig("Host",""));
429429
430430
431431
@@ -436,24 +436,24 @@
436436 //
437437
438438 // リクエストを送信した方法(メソッド)。GETやPOSTなど。
439- env.SetConfig("REQUEST_METHOD",request.m_method);
439+ env.SetConfig("REQUEST_METHOD",request.GetMethod());
440440
441441 // POSTから標準入力に送信されたデータのバイト数。
442- env.SetConfig("CONTENT_LENGTH",request.m_options.GetConfig("Content-length","0",TRUE));
442+ env.SetConfig("CONTENT_LENGTH",request.GetOptionAccess().GetConfig("Content-length","0",TRUE));
443443
444444 // POSTとPUTなどのクエリに添付されたデータのMIMEタイプ。
445- env.SetConfig("CONTENT_TYPE",request.m_options.GetConfig("Content-Type","",TRUE));
445+ env.SetConfig("CONTENT_TYPE",request.GetOptionAccess().GetConfig("Content-Type","",TRUE));
446446
447447 // クエリとして送られたURL情報のクエスチョン( ? )以降の情報。データは『URLエンコード』されています。
448- env.SetConfig("QUERY_STRING",request.m_query);
448+ env.SetConfig("QUERY_STRING",request.GetQuery());
449449
450450
451451
452452 // 仮想パス
453- env.SetConfig("SCRIPT_NAME",request.m_uriObject);
453+ env.SetConfig("SCRIPT_NAME",request.GetURIObject());
454454
455455 // URI
456- env.SetConfig("REQUEST_URI",request.m_uri);
456+ env.SetConfig("REQUEST_URI",request.GetURI());
457457
458458 // PATH_INFO,PATH_TRANSLATED
459459 if(alias.IsExtarExist())
@@ -474,7 +474,7 @@
474474 env.SetConfig("SCRIPT_FILENAME",str);
475475
476476 // 仮想パスの再設定
477- CString uri = request.m_uriObject;
477+ CString uri = request.GetURIObject();
478478 if(uri.GetLength() > alias.GetExtraPath().GetLength())
479479 uri = uri.Left(uri.GetLength() - alias.GetExtraPath().GetLength());
480480 env.SetConfig("SCRIPT_NAME", uri);
@@ -497,13 +497,13 @@
497497 env.SetConfig("AUTH_TYPE","basic");
498498
499499 // クライアントが受け付けることができるMIMEタイプのリスト。
500- env.SetConfig("HTTP_ACCEPT",request.m_options.GetConfig("Accept","*/*",TRUE));
500+ env.SetConfig("HTTP_ACCEPT",request.GetOptionAccess().GetConfig("Accept","*/*",TRUE));
501501
502502 // クライアントがリクエストを発行するときに使用するブラウザ名
503- env.SetConfig("HTTP_USER_AGENT",request.m_options.GetConfig("User-Agent","*/*",TRUE));
503+ env.SetConfig("HTTP_USER_AGENT",request.GetOptionAccess().GetConfig("User-Agent","*/*",TRUE));
504504
505505 // 呼び出し元のURL。アドレスバーからの直接入力、ブックマークからのアクセスの際には値がありません。
506- env.SetConfig("HTTP_REFERER",request.m_options.GetConfig("Referer","",TRUE));
506+ env.SetConfig("HTTP_REFERER",request.GetOptionAccess().GetConfig("Referer","",TRUE));
507507
508508 // リモートホストのIPアドレス情報。
509509 env.SetConfig("REMOTE_ADDR",context.GetConfig("Host",""));
@@ -516,20 +516,20 @@
516516 }
517517
518518 // ユーザの認証名。ウェブサーバとリモートホストがIDENTD認証デーモン(ユーザ認証プロトコル)を実行しているときだけ値があります。
519- env.SetConfig("REMOTE_USER",request.m_user);
519+ env.SetConfig("REMOTE_USER",request.GetUser());
520520
521521 // ユーザの認証名。ウェブサーバとリモートホストがIDENTD認証デーモン(ユーザ認証プロトコル)を実行しているときだけ値があります。
522- env.SetConfig("AUTH_USER",request.m_user);
522+ env.SetConfig("AUTH_USER",request.GetUser());
523523
524524 // ユーザのパスワード。ウェブサーバとリモートホストがIDENTD認証デーモン(ユーザ認証プロトコル)を実行しているときだけ値があります。
525- env.SetConfig("AUTH_PASSWORD",request.m_passwd);
525+ env.SetConfig("AUTH_PASSWORD",request.GetPasswd());
526526
527527
528528 // ユーザの認証名
529- env.SetConfig("PHP_AUTH_USER",request.m_user);
529+ env.SetConfig("PHP_AUTH_USER",request.GetUser());
530530
531531 // ユーザのパスワード
532- env.SetConfig("PHP_AUTH_PW",request.m_passwd);
532+ env.SetConfig("PHP_AUTH_PW",request.GetPasswd());
533533
534534
535535 //
@@ -537,13 +537,13 @@
537537 //
538538
539539 // プロキシサーバーの情報が設定されます
540- env.SetConfig("HTTP_VIA",request.m_options.GetConfig("Via","",TRUE));
540+ env.SetConfig("HTTP_VIA",request.GetOptionAccess().GetConfig("Via","",TRUE));
541541
542542 // ロキシサーバーの情報が設定されます。
543- env.SetConfig("HTTP_FORWARDED",request.m_options.GetConfig("Forwarded","",TRUE));
543+ env.SetConfig("HTTP_FORWARDED",request.GetOptionAccess().GetConfig("Forwarded","",TRUE));
544544
545545 // プロキシサーバーへの指示情報
546- env.SetConfig("HTTP_PROXY_CONNECTION",request.m_options.GetConfig("Proxy-Connection","",TRUE));
546+ env.SetConfig("HTTP_PROXY_CONNECTION",request.GetOptionAccess().GetConfig("Proxy-Connection","",TRUE));
547547
548548
549549 //
@@ -551,7 +551,7 @@
551551 //
552552
553553 // クッキー
554- env.SetConfig("HTTP_COOKIE",request.m_options.GetConfig("Cookie","",TRUE));
554+ env.SetConfig("HTTP_COOKIE",request.GetOptionAccess().GetConfig("Cookie","",TRUE));
555555
556556 }
557557
--- 1xx/04WebServer/trunk/FileResponse.cpp (revision 452)
+++ 1xx/04WebServer/trunk/FileResponse.cpp (revision 453)
@@ -20,7 +20,7 @@
2020 throw new CSystemResponse(server,context,"指定されたファイルは存在しません",404);
2121
2222 // メソッドはGET?
23- if(request.m_method != "GET" && request.m_method != "HEAD")
23+ if(request.GetMethod() != "GET" && request.GetMethod() != "HEAD")
2424 throw new CSystemResponse(server,context,"対応していないメソッドです",405);
2525 }
2626
--- 1xx/04WebServer/trunk/Server.cpp (revision 452)
+++ 1xx/04WebServer/trunk/Server.cpp (revision 453)
@@ -221,11 +221,11 @@
221221 catch(CConnectionException e)
222222 {
223223 // エラー?
224- m_log.WriteSystemLog("SystemError : %s",e.m_info);
224+ m_log.WriteSystemLog("SystemError : %s",e.GetErrorInfo());
225225 if(connect)
226226 delete connect;
227227
228- TRACE("SystemError : %s",e.m_info);
228+ TRACE("SystemError : %s",e.GetErrorInfo());
229229 }
230230 catch(CMemoryException *e)
231231 {
--- 1xx/04WebServer/trunk/SSIResponse.cpp (revision 452)
+++ 1xx/04WebServer/trunk/SSIResponse.cpp (revision 453)
@@ -12,7 +12,7 @@
1212 throw new CSystemResponse(server,context,"指定されたファイルは存在しません",404);
1313
1414 // メソッドはGET?
15- if(request.m_method != "GET" && request.m_method != "HEAD")
15+ if(request.GetMethod() != "GET" && request.GetMethod() != "HEAD")
1616 throw new CSystemResponse(server,context,"対応していないメソッドです",405);
1717 }
1818
@@ -269,8 +269,8 @@
269269 CSubProcess::GetCGIServerEnvironment(envAccess,m_server,m_context,m_request,m_alias);
270270
271271 envAccess.SetConfig("DOCUMENT_NAME",CDir::PathToName(m_alias.GetTarget()));
272- envAccess.SetConfig("DOCUMENT_URI",m_request.m_uri);
273- envAccess.SetConfig("QUERY_STRING_UNESCAPED",m_request.m_query);
272+ envAccess.SetConfig("DOCUMENT_URI",m_request.GetURI());
273+ envAccess.SetConfig("QUERY_STRING_UNESCAPED",m_request.GetQuery());
274274
275275 CTime local = CTime::GetCurrentTime();
276276 envAccess.SetConfig("DATE_LOCAL",local.Format(m_currentTimeFormat));
@@ -311,7 +311,7 @@
311311 {
312312 if(path.Left(1) != "/")
313313 {
314- CString dir = m_request.m_uriObject;
314+ CString dir = m_request.GetURIObject();
315315 int index = dir.ReverseFind('/');
316316 if(index != -1)
317317 dir = dir.Left(index + 1);
--- 1xx/04WebServer/trunk/Connection.h (revision 452)
+++ 1xx/04WebServer/trunk/Connection.h (revision 453)
@@ -7,8 +7,8 @@
77 #include "bandwidthmgr.h"
88 #include "ProtocolSocket.h"
99 #include "AcceptedSocketQueue.h"
10+#include "TextInfoExceptionBase.h"
1011
11-
1212 /*!
1313 接続の処理状態
1414 */
@@ -37,33 +37,16 @@
3737
3838
3939 /*!
40- 生成エラー
40+ 生成エラー例外
4141 */
42-class CConnectionException
43-{
44-public:
45- CConnectionException(CString info,int retry=0) {m_info = info;m_retry = retry;}
42+DEFINE_TEXT_INFO_EXCEPTION(CConnectionException);
4643
47- CString m_info;
48- int m_retry;
49-};
50-
51-
5244 /*!
53- 内部エラー
45+ 内部エラー例外
5446 */
55-class CServerFatalException
56-{
57-public:
58- CServerFatalException(CString info)
59- {
60- m_info = info;
61- }
47+DEFINE_TEXT_INFO_EXCEPTION(CServerFatalException);
6248
63- CString m_info;
64-};
6549
66-
6750 /*!
6851 レスポンス処理の中断を確認する
6952 */
--- 1xx/04WebServer/trunk/Server.h (revision 452)
+++ 1xx/04WebServer/trunk/Server.h (revision 453)
@@ -52,6 +52,9 @@
5252 //! コンテキストマネージャ取得
5353 CContextManager *GetContextManager() { return &m_contextMgr; };
5454
55+ //! 認証マネージャ取得
56+ CAuthenticateManager *GetAuthManager() { return &m_authMgr; };
57+
5558 //! 転送量を設定
5659 void AddTrans(__int64 send,__int64 recv) { m_bandWidthMgr.AddTrans(send,recv); };
5760
--- 1xx/04WebServer/trunk/TextInfoExceptionBase.h (nonexistent)
+++ 1xx/04WebServer/trunk/TextInfoExceptionBase.h (revision 453)
@@ -0,0 +1,28 @@
1+#pragma once
2+
3+/*!
4+ テキスト情報を持つ例外の基本クラス
5+*/
6+class CTextInfoExceptionBase
7+{
8+public:
9+ CTextInfoExceptionBase(CString info)
10+ {
11+ m_info = info;
12+ }
13+
14+ //! 情報取得
15+ CString GetErrorInfo() { return m_info; };
16+
17+protected:
18+ ///////////////////////////////////////////////////////////////////////////////////
19+ // メンバ変数
20+ ///////////////////////////////////////////////////////////////////////////////////
21+ //! エラー詳細
22+ CString m_info;
23+};
24+
25+
26+//! メソッド宣言
27+#define DEFINE_TEXT_INFO_EXCEPTION(claaName) class claaName : public CTextInfoExceptionBase { public: claaName(CString info) : CTextInfoExceptionBase(info) {} }
28+
--- 1xx/04WebServer/trunk/DirectoryResponse.cpp (revision 452)
+++ 1xx/04WebServer/trunk/DirectoryResponse.cpp (revision 453)
@@ -20,7 +20,7 @@
2020 throw new CSystemResponse(server,context,"指定されたディレクトリは存在しません",404);
2121
2222 // メソッドはGET?
23- if(request.m_method != "GET")
23+ if(request.GetMethod() != "GET")
2424 throw new CSystemResponse(server,context,"対応していないメソッドです",405);
2525
2626 m_done = 0;
@@ -43,7 +43,7 @@
4343 char stringBuf[MAX_LINE];
4444 CString iconPath;
4545 int sortMode = -1;
46- CString query = m_request.m_query;
46+ CString query = m_request.GetQuery();
4747
4848 if(query == "name")
4949 sortMode = 0;
--- 1xx/04WebServer/trunk/Connection.cpp (revision 452)
+++ 1xx/04WebServer/trunk/Connection.cpp (revision 453)
@@ -23,6 +23,7 @@
2323 #include "optionsresponse.h"
2424 #include "keyswapstring.h"
2525 #include "SSLProtocolSocket.h"
26+#include "DigestAuthenticate.h"
2627
2728 /*!
2829 接続を生成
@@ -129,7 +130,7 @@
129130 UpdateTransSize(context);
130131
131132 // 切断の必要のあるエラーが発生したので、ログにエラーを出力
132- UpdateConnectionStatus(context, e.m_info, CONNECTION_PROCESS_COMPLETE);
133+ UpdateConnectionStatus(context, e.GetErrorInfo(), CONNECTION_PROCESS_COMPLETE);
133134 WriteLog(context);
134135
135136 // 環境削除
@@ -214,10 +215,10 @@
214215 CRequest request(header, context.GetAccess("RequestInfo"));
215216
216217 // ターゲットホスト情報
217- context.SetConfig("TargetHost", request.m_options.GetConfig("Host", "", TRUE));
218+ context.SetConfig("TargetHost", request.GetOptionAccess().GetConfig("Host", "", TRUE));
218219
219220 // パスの解析
220- CAlias alias(request.m_uriObject, request.m_options.GetConfig("Host", "", TRUE), m_server->m_setting);
221+ CAlias alias(request.GetURIObject(), request.GetOptionAccess().GetConfig("Host", "", TRUE), m_server->m_setting);
221222
222223 // 帯域幅管理
223224 CBandWidthReference bandRef(m_server->GetCBandWidthMgr(), m_protocolSocket->GetPeerAddres(), context.GetConfig("ThreadName", ""));
@@ -227,7 +228,7 @@
227228
228229 // Keep-Aliveの解析
229230 int KeepAlive;
230- if(request.m_options.GetConfig("Connection", "", TRUE).CompareNoCase("keep-alive") == 0)
231+ if(request.GetOptionAccess().GetConfig("Connection", "", TRUE).CompareNoCase("keep-alive") == 0)
231232 KeepAlive = 1;
232233 else
233234 KeepAlive = 0;
@@ -331,7 +332,7 @@
331332
332333 // 致命的サーバエラー
333334 if(CanSendResponse(context)) // まだ送信してない場合のみ
334- SendFatalError(e.m_info);
335+ SendFatalError(e.GetErrorInfo());
335336
336337 // エラー登録
337338 context.SetConfig("ResponseInfo::ResponseCode", 500);
@@ -338,7 +339,7 @@
338339 context.SetConfig("ResponseInfo::ResponseText", CResponse::GetHTTPResponseString(500));
339340
340341 // 上に投げる
341- throw CServerFatalException(e.m_info);
342+ throw CServerFatalException(e.GetErrorInfo());
342343 }
343344 catch(CMemoryException *err)
344345 {
@@ -506,26 +507,39 @@
506507 */
507508 void CConnection::CheckAuthorize(CWorkspaceAccess &context, CRequest &request, CAlias &alias)
508509 {
509- DEBUG_SET_THREAD_FUNCTION_NAME("CConnection::CheckUser");
510+ DEBUG_SET_THREAD_FUNCTION_NAME("CConnection::CheckAuthorize");
510511
511512 if(alias.GetPathOptions().GetConfig("EnableAuthenticate", 0))
512513 {
513- CString username = request.m_user;
514- if(alias.GetPathOptions().GetConfig("EnableWebDAV", 0))
514+ CDigestAuthenticate auth;
515+
516+ AUTH_PARSE_STATUS ret = auth.ParseAuthMethod(m_server->GetAuthManager(), alias, request);
517+ if(ret == AUTH_PARSE_STATUS_ERROR)
515518 {
516- // WindowsXP 対策
517- int index = username.Find("\\");
518- if(index != -1)
519- username = username.Mid(index+1);
519+ throw new CSystemResponse(m_server, context, _T("認証の要求が異常です"), 400);
520520 }
521+ else
522+ {
523+ // 認証OK?
524+ if(ret == AUTH_PARSE_STATUS_OK)
525+ if(auth.CheckAuthUser(m_server->GetAuthManager(), alias, request))
526+ return;
521527
522- if(CheckUser(username, request.m_passwd, alias)==0)
523- {
528+ // 認証を要求
524529 CSystemResponse *move = new CSystemResponse(m_server, context, _T("認証が必要です"), 401);
525- CString str;
526- str.Format("Basic realm=\"%s\"", alias.GetPathInfo().GetKeyStr(_T("Info"), _T("")));
527- move->m_responseOptions.SetConfig("WWW-Authenticate", str);
528- throw move;
530+ switch(alias.GetPathOptions().GetConfig("AuthenticateType", 1))
531+ {
532+ case 0:
533+ default:
534+ move->m_responseOptions.SetConfig("WWW-Authenticate", auth.GetBasicAuthOptionLine(alias));
535+ throw move;
536+ break;
537+
538+ case 1:
539+ move->m_responseOptions.SetConfig("WWW-Authenticate", auth.GetDigestAuthOptionLine(m_server->GetAuthManager(), alias));
540+ throw move;
541+ break;
542+ }
529543 }
530544 }
531545 }
@@ -554,19 +568,19 @@
554568 DEBUG_SET_THREAD_FUNCTION_NAME("CConnection::WebDAV");
555569
556570 // Options
557- if(request.m_method == "OPTIONS")
571+ if(request.GetMethod() == "OPTIONS")
558572 throw new COptionsResponse(m_server, context, request, alias);
559573
560574 // WebDAVは有効?
561575 if(alias.GetPathOptions().GetConfig("EnableWebDAV", 0))
562576 {
563- if(request.m_method == "PROPFIND")
577+ if(request.GetMethod() == "PROPFIND")
564578 throw new CDAVPropfindResponse(m_server, context, request, alias);
565- else if(request.m_method == "PROPPATCH")
579+ else if(request.GetMethod() == "PROPPATCH")
566580 throw new CSystemResponse(m_server, context, _T("指定されたメソッドは、サポートしていません。"), 500);
567- else if(request.m_method == "LOCK")
581+ else if(request.GetMethod() == "LOCK")
568582 throw new CSystemResponse(m_server, context, _T("指定されたメソッドは、サポートしていません。"), 500);
569- else if(request.m_method == "UNLOCK")
583+ else if(request.GetMethod() == "UNLOCK")
570584 throw new CSystemResponse(m_server, context, _T("指定されたメソッドは、サポートしていません。"), 500);
571585 }
572586
@@ -573,15 +587,15 @@
573587 // 書き込みは有効か?
574588 if(alias.GetPathOptions().GetConfig("EnableWrite", 0))
575589 {
576- if(request.m_method == "PUT")
590+ if(request.GetMethod() == "PUT")
577591 throw new CFilePutResponse(m_server, context, request, alias);
578- else if(request.m_method == "MKCOL")
592+ else if(request.GetMethod() == "MKCOL")
579593 throw new CFilePutResponse(m_server, context, request, alias);
580- else if(request.m_method == "DELETE")
594+ else if(request.GetMethod() == "DELETE")
581595 throw new CFileDeleteResponse(m_server, context, request, alias);
582- else if(request.m_method == "COPY")
596+ else if(request.GetMethod() == "COPY")
583597 throw new CFileMoveResponse(m_server, context, request, alias);
584- else if(request.m_method == "MOVE")
598+ else if(request.GetMethod() == "MOVE")
585599 throw new CFileMoveResponse(m_server, context, request, alias);
586600 }
587601 }
@@ -632,9 +646,9 @@
632646
633647 // エクストラパス
634648 if(alias.IsExtarExist())
635- command = CSubProcess::GetCGICommand(m_server, alias.GetExtraTarget(), request.m_queryDecoded);
649+ command = CSubProcess::GetCGICommand(m_server, alias.GetExtraTarget(), request.GetQueryDecoded());
636650 else
637- command = CSubProcess::GetCGICommand(m_server, alias.GetTarget(), request.m_queryDecoded);
651+ command = CSubProcess::GetCGICommand(m_server, alias.GetTarget(), request.GetQueryDecoded());
638652
639653 if(!command.IsEmpty())
640654 {
@@ -793,7 +807,7 @@
793807 DEBUG_SET_THREAD_FUNCTION_NAME("CConnection::RecvData");
794808
795809 // 受信サイズは?
796- __int64 len = _atoi64(request.m_options.GetConfig("Content-Length", "0", TRUE));
810+ __int64 len = _atoi64(request.GetOptionAccess().GetConfig("Content-Length", "0", TRUE));
797811 __int64 orgLen;
798812
799813 // 2回目の呼び出しの可能性を考慮(残りのデータのみを取得する)
--- 1xx/04WebServer/trunk/TextTools.cpp (revision 452)
+++ 1xx/04WebServer/trunk/TextTools.cpp (revision 453)
@@ -264,9 +264,9 @@
264264 }
265265
266266 /*!
267- ANSIから、Unicode文字列へ
267+ MBから、Unicode文字列へ
268268 */
269-CStringW CTextTools::MultiStrToWideStr(const char *str)
269+CStringW CTextTools::MBStrToWideStr(const char *str)
270270 {
271271 CStringW ret;
272272 ret = str;
@@ -275,9 +275,9 @@
275275 }
276276
277277 /*!
278- ANSIからUTF8へ
278+ MBからUTF8へ
279279 */
280-CStringA CTextTools::ANSIToUTF8Str(const char *str)
280+CStringA CTextTools::MBStrToUTF8Str(const char *str)
281281 {
282282 // UTF16へ変換
283283 CStringW utf16(str);
@@ -292,9 +292,9 @@
292292 }
293293
294294 /*!
295- UTF8からANSIへ
295+ UTF8からMBへ
296296 */
297-CStringA CTextTools::UTF8ToANSIStr(const char *str)
297+CStringA CTextTools::UTF8ToMBStr(const char *str)
298298 {
299299 // 変換
300300 CStringW utf16;
@@ -330,7 +330,7 @@
330330 #ifdef _UNICODE
331331 return WideStrToUTF8Str(str);
332332 #else
333- return ANSIToUTF8Str(str);
333+ return MBStrToUTF8Str(str);
334334 #endif
335335 }
336336
@@ -444,3 +444,4 @@
444444
445445 return(itemIndex);
446446 }
447+
--- 1xx/04WebServer/trunk/FilePutResponse.cpp (revision 452)
+++ 1xx/04WebServer/trunk/FilePutResponse.cpp (revision 453)
@@ -29,11 +29,11 @@
2929 // レスポンスコード
3030 SetResponseCode(201); // OK
3131
32- if(m_request.m_method == "MKCOL")
32+ if(m_request.GetMethod() == "MKCOL")
3333 {
3434 CDir::MakeAllDirectory(m_alias.GetTarget());
3535 }
36- else if(m_request.m_method == "PUT")
36+ else if(m_request.GetMethod() == "PUT")
3737 {
3838 try
3939 {
--- 1xx/04WebServer/trunk/DAVPropfindResponse.cpp (revision 452)
+++ 1xx/04WebServer/trunk/DAVPropfindResponse.cpp (revision 453)
@@ -129,8 +129,8 @@
129129
130130 void CDAVPropfindResponse::FindAll(MSXML2::IXMLDOMDocumentPtr doc,MSXML2::IXMLDOMElementPtr res)
131131 {
132- CString url = m_request.m_uriObject;
133- CString depth = m_request.m_options.GetConfig("Depth","1",TRUE);
132+ CString url = m_request.GetURIObject();
133+ CString depth = m_request.GetOptionAccess().GetConfig("Depth","1",TRUE);
134134 int showHidden = m_alias.GetPathOptions().GetConfig("EnableHiddenFile",0);
135135
136136 int done=1;
Show on old repository browser