WebDavDb _webDavDb; //WevDAVのDethプロパテイを管理するクラス #endregion Fields #region Constructors //通常のServerThreadの子クラスと違い、オプションはリストで受け取る //親クラスは、そのリストの0番目のオブジェクトで初期化する //コンストラクタ public Server(Kernel kernel,Conf conf,OneBind oneBind) : base(kernel, conf,oneBind) { //同一ポートで待ち受けている仮想サーバのオプションをすべてリストする WebOptionList = new List<OneOption>(); foreach (var o in kernel.ListOption) { if (o.NameTag.IndexOf("Web-") == 0) { if((int)o.GetValue("port") == (int)Conf.Get("port")){ WebOptionList.Add(o); } } } //WebDAVリストの初期化 foreach (var o in WebOptionList) { if(o.UseServer) { _webDavDbList.Add(new WebDavDb(kernel,NameTag)); } } _webDavDb = _webDavDbList[0]; //Ver5.1.2「Cgiパス」「WebDAVパス」「別名」のオプションの修正 var tagList = new List<string> { "cgiPath", "webDavPath", "aliaseList" }; foreach(string tag in tagList) { var dat = (Dat)Conf.Get(tag); var changed = false; foreach(var o in dat) { var str = o.StrList[0]; if(str[0] != '/') { changed = true; str = '/' + str; } if(str.Length > 1 && str[str.Length - 1] != '/') { changed = true; str = str + '/'; } o.StrList[0] = str; } if(changed) Conf.Set(tag, dat); } //当初、opBase及びloggerは、weboptionList[0]で暫定的に初期化される var protocol = (int)Conf.Get("protocol"); if (protocol==1) {//HTTPS var op = kernel.ListOption.Get("VirtualHost"); var privateKeyPassword = (string)op.GetValue("privateKeyPassword"); var certificate = (string)op.GetValue("certificate"); //サーバ用SSLの初期化 ssl = new Ssl(Logger, certificate, privateKeyPassword); } var useAutoAcl = (bool)Conf.Get("useAutoAcl");// ACL拒否リストへ自動追加する if (useAutoAcl) { const int max = 1; //発生回数 const int sec = 120; // 対象期間(秒) _attackDb = new AttackDb(sec, max); } }
public WebDav(Logger logger, WebDavDb webDavDb, Target target, Document document, string urlStr, string depthStr, ContentType contentType, bool useEtag) { _logger = logger; _webDavDb = webDavDb; _document = document; _webDavKind = target.WebDavKind; _targetKind = target.TargetKind; _contentType = contentType; _useEtag = useEtag; if (depthStr != null) { if (depthStr == "0") { _depth = Depth.Depth0; } else if (depthStr == "1") { _depth = Depth.Depth1; } else if (depthStr == "infinity") { _depth = Depth.DepthInfinity; } } _fullPath = target.FullPath; _hrefHost = urlStr + target.Uri; //hrefをhttp://hostname と uri部分に分解する var index = _hrefHost.IndexOf("://"); if (index != -1) { _hrefUri = _hrefHost.Substring(index + 3); var pos = _hrefUri.IndexOf('/'); if (pos != -1) { _hrefUri = _hrefUri.Substring(pos); _hrefHost = _hrefHost.Substring(0, index + pos + 3); } } if (_hrefUri != "") { if (_targetKind == TargetKind.Dir && _hrefUri[_hrefUri.Length - 1] != '/') _hrefUri = _hrefUri + "/"; } //RFC 2518(5.2) コレクションに対するリクエストで最後に/(スラッシュ)なし //で参照されるとき自動的にこれを付加して処理することができる //この際、Content-Locationで見なしたURLをクライアントに返すべき //document.AddHeader("Content-Location",hrefHost+Util.SwapStr("%2f","/",HttpUtility.UrlEncode(hrefUri))); //document.AddHeader("Content-Location",HttpUtility.UrlPathEncode(hrefHost + hrefUri)); var href = Uri.EscapeDataString(_hrefUri); //Ver5.4.6 href = Util.SwapStr("%2F", "/", href); href = Util.SwapStr("%2f", "/", href); href = Util.SwapStr("+", "%20", href); document.AddHeader("Content-Location", _hrefHost + href); }
//******************************************************** // Host:ヘッダを見て、バーチャルホストの設定にヒットした場合は // オプション等を置き換える //******************************************************** void ReplaceVirtualHost(string host, IPAddress ip, int port) { //Ver5.0.0-b12 if (host == null) { return; } //Ver5.0.0-a6 仮想Webの検索をホスト名(アドレス)+ポート番号に修正 for (int n = 0; n < 2; n++) { if (n == 0) //1回目はホスト名で検索する //Ver5.0.0-a6 「ホスト名:ポート番号」の形式で検索する { if (host.IndexOf(':') < 0) { host = string.Format("{0}:{1}", host, port); } host = host.ToUpper(); //ホスト名は、大文字・小文字を区別しない } else //2回目はアドレスで検索する { host = string.Format("{0}:{1}", ip, port); } //バーチャルホスト指定の場合オプションを変更する foreach (var op in WebOptionList) { //先頭のWeb-を削除する string name = op.NameTag.Substring(4).ToUpper(); if (name == host) { if (op.NameTag != Conf.NameTag) { //Ver5.1.4 webDavDbを置き換える foreach (var db in _webDavDbList) { if (db.NameTag == op.NameTag) { _webDavDb = db; } } //オプション及びロガーを再初期化する //OneOption = op; Conf = new Conf(op); Logger = Kernel.CreateLogger(op.NameTag, (bool)Conf.Get("useDetailsLog"), this); } return; } } } }
public PropFindResponce(WebDavDb webDavDb) { _webDavDb = webDavDb; }
public WebDav(Logger logger, WebDavDb webDavDb, Target target, Document document, string urlStr, string depthStr, ContentType contentType, bool useEtag) { _logger = logger; _webDavDb = webDavDb; _document = document; _webDavKind = target.WebDavKind; _targetKind = target.TargetKind; _contentType = contentType; _useEtag = useEtag; if (depthStr != null) { if (depthStr == "0") { _depth = Depth.Depth0; } else if (depthStr == "1") { _depth = Depth.Depth1; } else if (depthStr == "infinity") { _depth = Depth.DepthInfinity; } } _fullPath = target.FullPath; _hrefHost = urlStr + target.Uri; //hrefをhttp://hostname と uri部分に分解する var index = _hrefHost.IndexOf("://"); if (index != -1) { _hrefUri = _hrefHost.Substring(index + 3); var pos = _hrefUri.IndexOf('/'); if (pos != -1) { _hrefUri = _hrefUri.Substring(pos); _hrefHost = _hrefHost.Substring(0, index + pos + 3); } } if (_hrefUri != "") { if (_targetKind == TargetKind.Dir && _hrefUri[_hrefUri.Length - 1] != '/') { _hrefUri = _hrefUri + "/"; } } //RFC 2518(5.2) コレクションに対するリクエストで最後に/(スラッシュ)なし //で参照されるとき自動的にこれを付加して処理することができる //この際、Content-Locationで見なしたURLをクライアントに返すべき //document.AddHeader("Content-Location",hrefHost+Util.SwapStr("%2f","/",HttpUtility.UrlEncode(hrefUri))); //document.AddHeader("Content-Location",HttpUtility.UrlPathEncode(hrefHost + hrefUri)); var href = Uri.EscapeDataString(_hrefUri); //Ver5.4.6 href = Util.SwapStr("%2F", "/", href); href = Util.SwapStr("%2f", "/", href); href = Util.SwapStr("+", "%20", href); document.AddHeader("Content-Location", _hrefHost + href); }
//******************************************************** // Host:ヘッダを見て、バーチャルホストの設定にヒットした場合は // オプション等を置き換える //******************************************************** void ReplaceVirtualHost(string host, IPAddress ip,int port) { //Ver5.0.0-b12 if(host == null) { return; } //Ver5.0.0-a6 仮想Webの検索をホスト名(アドレス)+ポート番号に修正 for (int n = 0; n < 2; n++) { if (n == 0) {//1回目はホスト名で検索する //Ver5.0.0-a6 「ホスト名:ポート番号」の形式で検索する if (host.IndexOf(':') < 0) { host = string.Format("{0}:{1}",host,port); } host = host.ToUpper();//ホスト名は、大文字・小文字を区別しない } else {//2回目はアドレスで検索する host = string.Format("{0}:{1}",ip,port); } //バーチャルホスト指定の場合オプションを変更する foreach (var op in WebOptionList) { //先頭のWeb-を削除する string name = op.NameTag.Substring(4).ToUpper(); if (name == host) { if (op.NameTag != Conf.NameTag) { //Ver5.1.4 webDavDbを置き換える foreach(var db in _webDavDbList) { if(db.NameTag == op.NameTag) { _webDavDb = db; } } //オプション及びロガーを再初期化する //OneOption = op; Conf = new Conf(op); Logger = Kernel.CreateLogger(op.NameTag, (bool)Conf.Get("useDetailsLog"), this); } return; } } } }
//通常のServerThreadの子クラスと違い、オプションはリストで受け取る //親クラスは、そのリストの0番目のオブジェクトで初期化する //コンストラクタ public Server(Kernel kernel, Conf conf, OneBind oneBind) : base(kernel, conf, oneBind) { //同一ポートで待ち受けている仮想サーバのオプションをすべてリストする WebOptionList = new List <OneOption>(); foreach (var o in kernel.ListOption) { if (o.NameTag.IndexOf("Web-") == 0) { if ((int)o.GetValue("port") == (int)Conf.Get("port")) { WebOptionList.Add(o); } } } //WebDAVリストの初期化 foreach (var o in WebOptionList) { if (o.UseServer) { _webDavDbList.Add(new WebDavDb(kernel, NameTag)); } } _webDavDb = _webDavDbList[0]; //Ver5.1.2「Cgiパス」「WebDAVパス」「別名」のオプションの修正 var tagList = new List <string> { "cgiPath", "webDavPath", "aliaseList" }; foreach (string tag in tagList) { var dat = (Dat)Conf.Get(tag); var changed = false; foreach (var o in dat) { var str = o.StrList[0]; if (str[0] != '/') { changed = true; str = '/' + str; } if (str.Length > 1 && str[str.Length - 1] != '/') { changed = true; str = str + '/'; } o.StrList[0] = str; } if (changed) { Conf.Set(tag, dat); } } //当初、opBase及びloggerは、weboptionList[0]で暫定的に初期化される var protocol = (int)Conf.Get("protocol"); if (protocol == 1)//HTTPS { var op = kernel.ListOption.Get("VirtualHost"); var privateKeyPassword = (string)op.GetValue("privateKeyPassword"); var certificate = (string)op.GetValue("certificate"); //サーバ用SSLの初期化 ssl = new Ssl(Logger, certificate, privateKeyPassword); } var useAutoAcl = (bool)Conf.Get("useAutoAcl");// ACL拒否リストへ自動追加する if (useAutoAcl) { const int max = 1; //発生回数 const int sec = 120; // 対象期間(秒) _attackDb = new AttackDb(sec, max); } }