diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/EnterpriseStorageProxy.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/EnterpriseStorageProxy.cs index e54c99e8..3cc19dab 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/EnterpriseStorageProxy.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/EnterpriseStorageProxy.cs @@ -73,6 +73,8 @@ namespace WebsitePanel.EnterpriseServer { private System.Threading.SendOrPostCallback UpdateWebDavPortalUserSettingsOperationCompleted; + private System.Threading.SendOrPostCallback SearchFilesOperationCompleted; + private System.Threading.SendOrPostCallback GetDirectoryBrowseEnabledOperationCompleted; private System.Threading.SendOrPostCallback SetDirectoryBrowseEnabledOperationCompleted; @@ -155,6 +157,9 @@ namespace WebsitePanel.EnterpriseServer { /// public event UpdateWebDavPortalUserSettingsCompletedEventHandler UpdateWebDavPortalUserSettingsCompleted; + /// + public event SearchFilesCompletedEventHandler SearchFilesCompleted; + /// public event GetDirectoryBrowseEnabledCompletedEventHandler GetDirectoryBrowseEnabledCompleted; @@ -1022,6 +1027,59 @@ namespace WebsitePanel.EnterpriseServer { } } + /// + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/SearchFiles", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public SystemFile[] SearchFiles(int itemId, string searchPath, string searchText, string userPrincipalName, bool recursive) { + object[] results = this.Invoke("SearchFiles", new object[] { + itemId, + searchPath, + searchText, + userPrincipalName, + recursive}); + return ((SystemFile[])(results[0])); + } + + /// + public System.IAsyncResult BeginSearchFiles(int itemId, string searchPath, string searchText, string userPrincipalName, bool recursive, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("SearchFiles", new object[] { + itemId, + searchPath, + searchText, + userPrincipalName, + recursive}, callback, asyncState); + } + + /// + public SystemFile[] EndSearchFiles(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((SystemFile[])(results[0])); + } + + /// + public void SearchFilesAsync(int itemId, string searchPath, string searchText, string userPrincipalName, bool recursive) { + this.SearchFilesAsync(itemId, searchPath, searchText, userPrincipalName, recursive, null); + } + + /// + public void SearchFilesAsync(int itemId, string searchPath, string searchText, string userPrincipalName, bool recursive, object userState) { + if ((this.SearchFilesOperationCompleted == null)) { + this.SearchFilesOperationCompleted = new System.Threading.SendOrPostCallback(this.OnSearchFilesOperationCompleted); + } + this.InvokeAsync("SearchFiles", new object[] { + itemId, + searchPath, + searchText, + userPrincipalName, + recursive}, this.SearchFilesOperationCompleted, userState); + } + + private void OnSearchFilesOperationCompleted(object arg) { + if ((this.SearchFilesCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.SearchFilesCompleted(this, new SearchFilesCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + /// [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/GetDirectoryBrowseEnabled", RequestNamespace="http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace="http://smbsaas/websitepanel/enterpriseserver", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] public bool GetDirectoryBrowseEnabled(int itemId, string site) { @@ -1935,6 +1993,32 @@ namespace WebsitePanel.EnterpriseServer { [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] public delegate void UpdateWebDavPortalUserSettingsCompletedEventHandler(object sender, System.ComponentModel.AsyncCompletedEventArgs e); + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] + public delegate void SearchFilesCompletedEventHandler(object sender, SearchFilesCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class SearchFilesCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal SearchFilesCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public SystemFile[] Result { + get { + this.RaiseExceptionIfNecessary(); + return ((SystemFile[])(this.results[0])); + } + } + } + /// [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] public delegate void GetDirectoryBrowseEnabledCompletedEventHandler(object sender, GetDirectoryBrowseEnabledCompletedEventArgs e); diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/EnterpriseStorage/EnterpriseStorageController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/EnterpriseStorage/EnterpriseStorageController.cs index 79ed21b8..f2f94ed2 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/EnterpriseStorage/EnterpriseStorageController.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/EnterpriseStorage/EnterpriseStorageController.cs @@ -172,6 +172,50 @@ namespace WebsitePanel.EnterpriseServer return ObjectUtils.FillObjectFromDataReader(DataProvider.GetWebDavAccessTokenByAccessToken(accessToken)); } + public static SystemFile[] SearchFiles(int itemId, string searchPath, string searchText, string userPrincipalName, bool recursive) + { + try + { + // load organization + Organization org = OrganizationController.GetOrganization(itemId); + if (org == null) + { + return new SystemFile[0]; + } + + int serviceId = GetEnterpriseStorageServiceID(org.PackageId); + + if (serviceId == 0) + { + return new SystemFile[0]; + } + + EnterpriseStorage es = GetEnterpriseStorage(serviceId); + + var rootFolders = GetRootFolders(userPrincipalName).ToList(); + + var searchResult = es.Search(Path.Combine(org.OrganizationId, searchPath ?? string.Empty), searchText, userPrincipalName, recursive); + + var result = new List(); + + foreach (var systemFile in searchResult) + { + if (rootFolders.All(x => !systemFile.FullName.Contains(x.FullName))) + { + continue; + } + + result.Add(systemFile); + } + + return result.ToArray(); + } + catch (Exception ex) + { + throw ex; + } + } + #region Directory Browsing public static bool GetDirectoryBrowseEnabled(int itemId, string siteId) @@ -202,6 +246,33 @@ namespace WebsitePanel.EnterpriseServer #endregion + private static IEnumerable GetRootFolders(string userPrincipalName) + { + var rootFolders = new List(); + + var account = ExchangeServerController.GetAccountByAccountName(userPrincipalName); + + var userGroups = OrganizationController.GetSecurityGroupsByMember(account.ItemId, account.AccountId); + + foreach (var folder in GetFolders(account.ItemId)) + { + var permissions = GetFolderPermission(account.ItemId, folder.Name); + + foreach (var permission in permissions) + { + if ((!permission.IsGroup + && (permission.DisplayName == account.UserPrincipalName || permission.DisplayName == account.DisplayName)) + || (permission.IsGroup && userGroups.Any(x => x.DisplayName == permission.DisplayName))) + { + rootFolders.Add(folder); + break; + } + } + } + + return rootFolders; + } + protected static void StartESBackgroundTaskInternal(string taskName, int itemId, SystemFile folder, ESPermission[] permissions, bool directoyBrowsingEnabled, int quota, QuotaType quotaType) { // load organization diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esEnterpriseStorage.asmx.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esEnterpriseStorage.asmx.cs index 066ad302..28d0ffaa 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esEnterpriseStorage.asmx.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esEnterpriseStorage.asmx.cs @@ -170,6 +170,12 @@ namespace WebsitePanel.EnterpriseServer EnterpriseStorageController.UpdateUserSettings(accountId,settings); } + [WebMethod] + public SystemFile[] SearchFiles(int itemId, string searchPath, string searchText, string userPrincipalName, bool recursive) + { + return EnterpriseStorageController.SearchFiles(itemId, searchPath, searchText, userPrincipalName, recursive); + } + #region Directory Browsing [WebMethod] diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.Base/EnterpriseStorage/IEnterpriseStorage.cs b/WebsitePanel/Sources/WebsitePanel.Providers.Base/EnterpriseStorage/IEnterpriseStorage.cs index 5693ea5e..980581be 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.Base/EnterpriseStorage/IEnterpriseStorage.cs +++ b/WebsitePanel/Sources/WebsitePanel.Providers.Base/EnterpriseStorage/IEnterpriseStorage.cs @@ -46,6 +46,6 @@ namespace WebsitePanel.Providers.EnterpriseStorage bool SetFolderWebDavRules(string organizationId, string folder, WebDavSetting setting, WebDavFolderRule[] rules); WebDavFolderRule[] GetFolderWebDavRules(string organizationId, string folder, WebDavSetting setting); bool CheckFileServicesInstallation(); - + SystemFile[] Search(string searchPath, string searchText, string userPrincipalName, bool recursive); } } diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.Base/OS/SystemFile.cs b/WebsitePanel/Sources/WebsitePanel.Providers.Base/OS/SystemFile.cs index 27478af4..830bccab 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.Base/OS/SystemFile.cs +++ b/WebsitePanel/Sources/WebsitePanel.Providers.Base/OS/SystemFile.cs @@ -144,6 +144,8 @@ namespace WebsitePanel.Providers.OS set { this.url = value; } } + public string RelativeUrl { get; set; } + public string DriveLetter { get { return this.driveLetter; } diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.EnterpriseStorage.Windows2012/Windows2012.cs b/WebsitePanel/Sources/WebsitePanel.Providers.EnterpriseStorage.Windows2012/Windows2012.cs index fbd7b157..1363acab 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.EnterpriseStorage.Windows2012/Windows2012.cs +++ b/WebsitePanel/Sources/WebsitePanel.Providers.EnterpriseStorage.Windows2012/Windows2012.cs @@ -27,9 +27,12 @@ // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. using System; +using System.Data.OleDb; using System.IO; using System.Collections; using System.Collections.Generic; +using System.Linq; +using System.Security.Principal; using System.Text; using Microsoft.Win32; @@ -62,6 +65,7 @@ namespace WebsitePanel.Providers.EnterpriseStorage #endregion #region Folders + public SystemFile[] GetFolders(string organizationId, WebDavSetting[] settings) { ArrayList items = new ArrayList(); @@ -70,7 +74,8 @@ namespace WebsitePanel.Providers.EnterpriseStorage foreach (var setting in webDavSettings) { - string rootPath = string.Format("{0}:\\{1}\\{2}", setting.LocationDrive, setting.HomeFolder, organizationId); + string rootPath = string.Format("{0}:\\{1}\\{2}", setting.LocationDrive, setting.HomeFolder, + organizationId); var windows = new WebsitePanel.Providers.OS.Windows2012(); @@ -114,16 +119,17 @@ namespace WebsitePanel.Providers.EnterpriseStorage } } - return (SystemFile[])items.ToArray(typeof(SystemFile)); + return (SystemFile[]) items.ToArray(typeof (SystemFile)); } public SystemFile GetFolder(string organizationId, string folderName, WebDavSetting setting) { var webDavSetting = GetWebDavSetting(setting); - string fullName = string.Format("{0}:\\{1}\\{2}\\{3}", webDavSetting.LocationDrive, webDavSetting.HomeFolder, organizationId, folderName); + string fullName = string.Format("{0}:\\{1}\\{2}\\{3}", webDavSetting.LocationDrive, webDavSetting.HomeFolder, + organizationId, folderName); SystemFile folder = null; - + var windows = new WebsitePanel.Providers.OS.Windows2012(); if (Directory.Exists(fullName)) @@ -151,7 +157,7 @@ namespace WebsitePanel.Providers.EnterpriseStorage folder.FRSMQuotaGB = windows.ConvertMegaBytesToGB(folder.FRSMQuotaMB); folder.FsrmQuotaType = quota.QuotaType; } - + return folder; } @@ -159,17 +165,21 @@ namespace WebsitePanel.Providers.EnterpriseStorage { var webDavSetting = GetWebDavSetting(setting); - FileUtils.CreateDirectory(string.Format("{0}:\\{1}\\{2}\\{3}", webDavSetting.LocationDrive, webDavSetting.HomeFolder, organizationId, folder)); + FileUtils.CreateDirectory(string.Format("{0}:\\{1}\\{2}\\{3}", webDavSetting.LocationDrive, + webDavSetting.HomeFolder, organizationId, folder)); } - public SystemFile RenameFolder(string organizationId, string originalFolder, string newFolder, WebDavSetting setting) + public SystemFile RenameFolder(string organizationId, string originalFolder, string newFolder, + WebDavSetting setting) { var webDavSetting = GetWebDavSetting(setting); - var oldPath = string.Format("{0}:\\{1}\\{2}\\{3}", webDavSetting.LocationDrive, webDavSetting.HomeFolder, organizationId, originalFolder); - var newPath = string.Format("{0}:\\{1}\\{2}\\{3}", webDavSetting.LocationDrive, webDavSetting.HomeFolder, organizationId, newFolder); + var oldPath = string.Format("{0}:\\{1}\\{2}\\{3}", webDavSetting.LocationDrive, webDavSetting.HomeFolder, + organizationId, originalFolder); + var newPath = string.Format("{0}:\\{1}\\{2}\\{3}", webDavSetting.LocationDrive, webDavSetting.HomeFolder, + organizationId, newFolder); - FileUtils.MoveFile(oldPath,newPath); + FileUtils.MoveFile(oldPath, newPath); IWebDav webdav = new WebDav(webDavSetting); @@ -183,17 +193,20 @@ namespace WebsitePanel.Providers.EnterpriseStorage { var webDavSetting = GetWebDavSetting(setting); - string rootPath = string.Format("{0}:\\{1}\\{2}\\{3}", webDavSetting.LocationDrive, webDavSetting.HomeFolder, organizationId, folder); + string rootPath = string.Format("{0}:\\{1}\\{2}\\{3}", webDavSetting.LocationDrive, webDavSetting.HomeFolder, + organizationId, folder); DirectoryInfo treeRoot = new DirectoryInfo(rootPath); - + if (treeRoot.Exists) { DirectoryInfo[] dirs = treeRoot.GetDirectories(); while (dirs.Length > 0) { foreach (DirectoryInfo dir in dirs) - DeleteFolder(organizationId, folder != string.Empty ? string.Format("{0}\\{1}", folder, dir.Name) : dir.Name, webDavSetting); + DeleteFolder(organizationId, + folder != string.Empty ? string.Format("{0}\\{1}", folder, dir.Name) : dir.Name, + webDavSetting); dirs = treeRoot.GetDirectories(); } @@ -207,14 +220,15 @@ namespace WebsitePanel.Providers.EnterpriseStorage } IWebDav webdav = new WebDav(webDavSetting); - + webdav.DeleteAllWebDavRules(organizationId, folder); - + Directory.Delete(treeRoot.FullName, true); } } - public bool SetFolderWebDavRules(string organizationId, string folder, WebDavSetting setting, WebDavFolderRule[] rules) + public bool SetFolderWebDavRules(string organizationId, string folder, WebDavSetting setting, + WebDavFolderRule[] rules) { var users = new List(); @@ -243,14 +257,15 @@ namespace WebsitePanel.Providers.EnterpriseStorage var webDavSetting = GetWebDavSetting(setting); - string path = string.Format("{0}:\\{1}\\{2}\\{3}", webDavSetting.LocationDrive, webDavSetting.HomeFolder, organizationId, folder); + string path = string.Format("{0}:\\{1}\\{2}\\{3}", webDavSetting.LocationDrive, webDavSetting.HomeFolder, + organizationId, folder); SecurityUtils.ResetNtfsPermissions(path); SecurityUtils.GrantGroupNtfsPermissions(path, users.ToArray(), false, new RemoteServerSettings(), null, null); IWebDav webdav = new WebDav(webDavSetting); - + return webdav.SetFolderWebDavRules(organizationId, folder, rules); } @@ -270,6 +285,58 @@ namespace WebsitePanel.Providers.EnterpriseStorage #endregion + public SystemFile[] Search(string searchPath, string searchText, string userPrincipalName, bool recursive) + { + var settings = GetWebDavSetting(null); + var result = new List(); + + using (new WindowsIdentity(userPrincipalName).Impersonate()) + { + using (var conn = new OleDbConnection("Provider=Search.CollatorDSO;Extended Properties='Application=Windows';")) + { + var searchDirectory = Path.Combine(settings.LocationDrive + ":\\", settings.HomeFolder); + searchDirectory = Path.Combine(searchDirectory, searchPath); + + var searchDirectoryUrl = new Uri(searchDirectory).AbsoluteUri; + + var wsSql = string.Format(@"SELECT System.FileName, System.DateModified, System.Size, System.Kind, System.ItemPathDisplay, System.ItemType FROM SYSTEMINDEX WHERE System.FileName LIKE '%{0}%' AND {1} = '{2}'", + searchText, recursive ? "SCOPE" : "DIRECTORY", searchDirectoryUrl); + + + conn.Open(); + + var cmd = new OleDbCommand(wsSql, conn); + + using (OleDbDataReader reader = cmd.ExecuteReader()) + { + while (reader!= null && reader.Read()) + { + var file = new SystemFile {Name = reader[0] as string}; + + file.Changed = file.CreatedDate = reader[1] is DateTime ? (DateTime)reader[1] : new DateTime(); + file.Size = reader[2] is long ? (long) reader[2] : 0; + + var kind = reader[3] is IEnumerable ? ((IEnumerable)reader[3]).Cast().ToList() : null; + var itemType = reader[5] as string ?? string.Empty; + + if (kind != null && kind.Any() && itemType.ToLowerInvariant() != ".zip") + { + file.IsDirectory = kind.Any(x => x == "folder"); + } + + file.FullName = (reader[4] as string ?? string.Empty); + file.RelativeUrl = file.FullName.Replace(searchDirectory, string.Empty).Trim('\\'); + + result.Add(file); + } + } + } + } + + return result.ToArray(); + } + + #region HostingServiceProvider methods public override string[] Install() diff --git a/WebsitePanel/Sources/WebsitePanel.Server.Client/EnterpriseStorageProxy.cs b/WebsitePanel/Sources/WebsitePanel.Server.Client/EnterpriseStorageProxy.cs index 1984ec72..1775fa5c 100644 --- a/WebsitePanel/Sources/WebsitePanel.Server.Client/EnterpriseStorageProxy.cs +++ b/WebsitePanel/Sources/WebsitePanel.Server.Client/EnterpriseStorageProxy.cs @@ -1,197 +1,167 @@ -// Copyright (c) 2015, Outercurve Foundation. -// All rights reserved. +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.7905 // -// Redistribution and use in source and binary forms, with or without modification, -// are permitted provided that the following conditions are met: -// -// - Redistributions of source code must retain the above copyright notice, this -// list of conditions and the following disclaimer. -// -// - Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. -// -// - Neither the name of the Outercurve Foundation nor the names of its -// contributors may be used to endorse or promote products derived from this -// software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR -// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ // -// This source code was auto-generated by wsdl, Version=2.0.50727.42. +// This source code was auto-generated by wsdl, Version=2.0.50727.3038. // using WebsitePanel.Providers.OS; using WebsitePanel.Providers.Web; -namespace WebsitePanel.Providers.EnterpriseStorage -{ +namespace WebsitePanel.Providers.EnterpriseStorage { using System.Xml.Serialization; using System.Web.Services; using System.ComponentModel; using System.Web.Services.Protocols; using System; using System.Diagnostics; - - + + /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] - [System.Web.Services.WebServiceBindingAttribute(Name = "EnterpriseStorageSoap", Namespace = "http://smbsaas/websitepanel/server/")] + [System.Web.Services.WebServiceBindingAttribute(Name="EnterpriseStorageSoap", Namespace="http://smbsaas/websitepanel/server/")] [System.Xml.Serialization.XmlIncludeAttribute(typeof(ServiceProviderItem))] - public partial class EnterpriseStorage : Microsoft.Web.Services3.WebServicesClientProtocol - { - + public partial class EnterpriseStorage : Microsoft.Web.Services3.WebServicesClientProtocol { + public ServiceProviderSettingsSoapHeader ServiceProviderSettingsSoapHeaderValue; - + private System.Threading.SendOrPostCallback GetFoldersOperationCompleted; - + private System.Threading.SendOrPostCallback GetFolderOperationCompleted; - + private System.Threading.SendOrPostCallback CreateFolderOperationCompleted; - + private System.Threading.SendOrPostCallback DeleteFolderOperationCompleted; - + private System.Threading.SendOrPostCallback SetFolderWebDavRulesOperationCompleted; - + private System.Threading.SendOrPostCallback GetFolderWebDavRulesOperationCompleted; - + private System.Threading.SendOrPostCallback CheckFileServicesInstallationOperationCompleted; - + + private System.Threading.SendOrPostCallback SearchOperationCompleted; + private System.Threading.SendOrPostCallback RenameFolderOperationCompleted; - + /// - public EnterpriseStorage() - { - this.Url = "http://localhost:9004/EnterpriseStorage.asmx"; + public EnterpriseStorage() { + this.Url = "http://localhost:9003/EnterpriseStorage.asmx"; } - + /// public event GetFoldersCompletedEventHandler GetFoldersCompleted; - + /// public event GetFolderCompletedEventHandler GetFolderCompleted; - + /// public event CreateFolderCompletedEventHandler CreateFolderCompleted; - + /// public event DeleteFolderCompletedEventHandler DeleteFolderCompleted; - + /// public event SetFolderWebDavRulesCompletedEventHandler SetFolderWebDavRulesCompleted; - + /// public event GetFolderWebDavRulesCompletedEventHandler GetFolderWebDavRulesCompleted; - + /// public event CheckFileServicesInstallationCompletedEventHandler CheckFileServicesInstallationCompleted; - + + /// + public event SearchCompletedEventHandler SearchCompleted; + /// public event RenameFolderCompletedEventHandler RenameFolderCompleted; - + /// [System.Web.Services.Protocols.SoapHeaderAttribute("ServiceProviderSettingsSoapHeaderValue")] - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/server/GetFolders", RequestNamespace = "http://smbsaas/websitepanel/server/", ResponseNamespace = "http://smbsaas/websitepanel/server/", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public SystemFile[] GetFolders(string organizationId, WebDavSetting[] settings) - { + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/server/GetFolders", RequestNamespace="http://smbsaas/websitepanel/server/", ResponseNamespace="http://smbsaas/websitepanel/server/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public SystemFile[] GetFolders(string organizationId, WebDavSetting[] settings) { object[] results = this.Invoke("GetFolders", new object[] { organizationId, settings}); return ((SystemFile[])(results[0])); } - + /// - public System.IAsyncResult BeginGetFolders(string organizationId, WebDavSetting[] settings, System.AsyncCallback callback, object asyncState) - { + public System.IAsyncResult BeginGetFolders(string organizationId, WebDavSetting[] settings, System.AsyncCallback callback, object asyncState) { return this.BeginInvoke("GetFolders", new object[] { organizationId, settings}, callback, asyncState); } - + /// - public SystemFile[] EndGetFolders(System.IAsyncResult asyncResult) - { + public SystemFile[] EndGetFolders(System.IAsyncResult asyncResult) { object[] results = this.EndInvoke(asyncResult); return ((SystemFile[])(results[0])); } - + /// - public void GetFoldersAsync(string organizationId, WebDavSetting[] settings) - { + public void GetFoldersAsync(string organizationId, WebDavSetting[] settings) { this.GetFoldersAsync(organizationId, settings, null); } - + /// - public void GetFoldersAsync(string organizationId, WebDavSetting[] settings, object userState) - { - if ((this.GetFoldersOperationCompleted == null)) - { + public void GetFoldersAsync(string organizationId, WebDavSetting[] settings, object userState) { + if ((this.GetFoldersOperationCompleted == null)) { this.GetFoldersOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetFoldersOperationCompleted); } this.InvokeAsync("GetFolders", new object[] { organizationId, settings}, this.GetFoldersOperationCompleted, userState); } - - private void OnGetFoldersOperationCompleted(object arg) - { - if ((this.GetFoldersCompleted != null)) - { + + private void OnGetFoldersOperationCompleted(object arg) { + if ((this.GetFoldersCompleted != null)) { System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); this.GetFoldersCompleted(this, new GetFoldersCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); } } - + /// [System.Web.Services.Protocols.SoapHeaderAttribute("ServiceProviderSettingsSoapHeaderValue")] - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/server/GetFolder", RequestNamespace = "http://smbsaas/websitepanel/server/", ResponseNamespace = "http://smbsaas/websitepanel/server/", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public SystemFile GetFolder(string organizationId, string folder, WebDavSetting setting) - { + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/server/GetFolder", RequestNamespace="http://smbsaas/websitepanel/server/", ResponseNamespace="http://smbsaas/websitepanel/server/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public SystemFile GetFolder(string organizationId, string folder, WebDavSetting setting) { object[] results = this.Invoke("GetFolder", new object[] { organizationId, folder, setting}); return ((SystemFile)(results[0])); } - + /// - public System.IAsyncResult BeginGetFolder(string organizationId, string folder, WebDavSetting setting, System.AsyncCallback callback, object asyncState) - { + public System.IAsyncResult BeginGetFolder(string organizationId, string folder, WebDavSetting setting, System.AsyncCallback callback, object asyncState) { return this.BeginInvoke("GetFolder", new object[] { organizationId, folder, setting}, callback, asyncState); } - + /// - public SystemFile EndGetFolder(System.IAsyncResult asyncResult) - { + public SystemFile EndGetFolder(System.IAsyncResult asyncResult) { object[] results = this.EndInvoke(asyncResult); return ((SystemFile)(results[0])); } - + /// - public void GetFolderAsync(string organizationId, string folder, WebDavSetting setting) - { + public void GetFolderAsync(string organizationId, string folder, WebDavSetting setting) { this.GetFolderAsync(organizationId, folder, setting, null); } - + /// - public void GetFolderAsync(string organizationId, string folder, WebDavSetting setting, object userState) - { - if ((this.GetFolderOperationCompleted == null)) - { + public void GetFolderAsync(string organizationId, string folder, WebDavSetting setting, object userState) { + if ((this.GetFolderOperationCompleted == null)) { this.GetFolderOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetFolderOperationCompleted); } this.InvokeAsync("GetFolder", new object[] { @@ -199,53 +169,45 @@ namespace WebsitePanel.Providers.EnterpriseStorage folder, setting}, this.GetFolderOperationCompleted, userState); } - - private void OnGetFolderOperationCompleted(object arg) - { - if ((this.GetFolderCompleted != null)) - { + + private void OnGetFolderOperationCompleted(object arg) { + if ((this.GetFolderCompleted != null)) { System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); this.GetFolderCompleted(this, new GetFolderCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); } } - + /// [System.Web.Services.Protocols.SoapHeaderAttribute("ServiceProviderSettingsSoapHeaderValue")] - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/server/CreateFolder", RequestNamespace = "http://smbsaas/websitepanel/server/", ResponseNamespace = "http://smbsaas/websitepanel/server/", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public void CreateFolder(string organizationId, string folder, WebDavSetting setting) - { + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/server/CreateFolder", RequestNamespace="http://smbsaas/websitepanel/server/", ResponseNamespace="http://smbsaas/websitepanel/server/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public void CreateFolder(string organizationId, string folder, WebDavSetting setting) { this.Invoke("CreateFolder", new object[] { organizationId, folder, setting}); } - + /// - public System.IAsyncResult BeginCreateFolder(string organizationId, string folder, WebDavSetting setting, System.AsyncCallback callback, object asyncState) - { + public System.IAsyncResult BeginCreateFolder(string organizationId, string folder, WebDavSetting setting, System.AsyncCallback callback, object asyncState) { return this.BeginInvoke("CreateFolder", new object[] { organizationId, folder, setting}, callback, asyncState); } - + /// - public void EndCreateFolder(System.IAsyncResult asyncResult) - { + public void EndCreateFolder(System.IAsyncResult asyncResult) { this.EndInvoke(asyncResult); } - + /// - public void CreateFolderAsync(string organizationId, string folder, WebDavSetting setting) - { + public void CreateFolderAsync(string organizationId, string folder, WebDavSetting setting) { this.CreateFolderAsync(organizationId, folder, setting, null); } - + /// - public void CreateFolderAsync(string organizationId, string folder, WebDavSetting setting, object userState) - { - if ((this.CreateFolderOperationCompleted == null)) - { + public void CreateFolderAsync(string organizationId, string folder, WebDavSetting setting, object userState) { + if ((this.CreateFolderOperationCompleted == null)) { this.CreateFolderOperationCompleted = new System.Threading.SendOrPostCallback(this.OnCreateFolderOperationCompleted); } this.InvokeAsync("CreateFolder", new object[] { @@ -253,53 +215,45 @@ namespace WebsitePanel.Providers.EnterpriseStorage folder, setting}, this.CreateFolderOperationCompleted, userState); } - - private void OnCreateFolderOperationCompleted(object arg) - { - if ((this.CreateFolderCompleted != null)) - { + + private void OnCreateFolderOperationCompleted(object arg) { + if ((this.CreateFolderCompleted != null)) { System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); this.CreateFolderCompleted(this, new System.ComponentModel.AsyncCompletedEventArgs(invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); } } - + /// [System.Web.Services.Protocols.SoapHeaderAttribute("ServiceProviderSettingsSoapHeaderValue")] - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/server/DeleteFolder", RequestNamespace = "http://smbsaas/websitepanel/server/", ResponseNamespace = "http://smbsaas/websitepanel/server/", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public void DeleteFolder(string organizationId, string folder, WebDavSetting setting) - { + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/server/DeleteFolder", RequestNamespace="http://smbsaas/websitepanel/server/", ResponseNamespace="http://smbsaas/websitepanel/server/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public void DeleteFolder(string organizationId, string folder, WebDavSetting setting) { this.Invoke("DeleteFolder", new object[] { organizationId, folder, setting}); } - + /// - public System.IAsyncResult BeginDeleteFolder(string organizationId, string folder, WebDavSetting setting, System.AsyncCallback callback, object asyncState) - { + public System.IAsyncResult BeginDeleteFolder(string organizationId, string folder, WebDavSetting setting, System.AsyncCallback callback, object asyncState) { return this.BeginInvoke("DeleteFolder", new object[] { organizationId, folder, setting}, callback, asyncState); } - + /// - public void EndDeleteFolder(System.IAsyncResult asyncResult) - { + public void EndDeleteFolder(System.IAsyncResult asyncResult) { this.EndInvoke(asyncResult); } - + /// - public void DeleteFolderAsync(string organizationId, string folder, WebDavSetting setting) - { + public void DeleteFolderAsync(string organizationId, string folder, WebDavSetting setting) { this.DeleteFolderAsync(organizationId, folder, setting, null); } - + /// - public void DeleteFolderAsync(string organizationId, string folder, WebDavSetting setting, object userState) - { - if ((this.DeleteFolderOperationCompleted == null)) - { + public void DeleteFolderAsync(string organizationId, string folder, WebDavSetting setting, object userState) { + if ((this.DeleteFolderOperationCompleted == null)) { this.DeleteFolderOperationCompleted = new System.Threading.SendOrPostCallback(this.OnDeleteFolderOperationCompleted); } this.InvokeAsync("DeleteFolder", new object[] { @@ -307,21 +261,18 @@ namespace WebsitePanel.Providers.EnterpriseStorage folder, setting}, this.DeleteFolderOperationCompleted, userState); } - - private void OnDeleteFolderOperationCompleted(object arg) - { - if ((this.DeleteFolderCompleted != null)) - { + + private void OnDeleteFolderOperationCompleted(object arg) { + if ((this.DeleteFolderCompleted != null)) { System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); this.DeleteFolderCompleted(this, new System.ComponentModel.AsyncCompletedEventArgs(invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); } } - + /// [System.Web.Services.Protocols.SoapHeaderAttribute("ServiceProviderSettingsSoapHeaderValue")] - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/server/SetFolderWebDavRules", RequestNamespace = "http://smbsaas/websitepanel/server/", ResponseNamespace = "http://smbsaas/websitepanel/server/", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public bool SetFolderWebDavRules(string organizationId, string folder, WebDavSetting setting, WebDavFolderRule[] rules) - { + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/server/SetFolderWebDavRules", RequestNamespace="http://smbsaas/websitepanel/server/", ResponseNamespace="http://smbsaas/websitepanel/server/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public bool SetFolderWebDavRules(string organizationId, string folder, WebDavSetting setting, WebDavFolderRule[] rules) { object[] results = this.Invoke("SetFolderWebDavRules", new object[] { organizationId, folder, @@ -329,35 +280,30 @@ namespace WebsitePanel.Providers.EnterpriseStorage rules}); return ((bool)(results[0])); } - + /// - public System.IAsyncResult BeginSetFolderWebDavRules(string organizationId, string folder, WebDavSetting setting, WebDavFolderRule[] rules, System.AsyncCallback callback, object asyncState) - { + public System.IAsyncResult BeginSetFolderWebDavRules(string organizationId, string folder, WebDavSetting setting, WebDavFolderRule[] rules, System.AsyncCallback callback, object asyncState) { return this.BeginInvoke("SetFolderWebDavRules", new object[] { organizationId, folder, setting, rules}, callback, asyncState); } - + /// - public bool EndSetFolderWebDavRules(System.IAsyncResult asyncResult) - { + public bool EndSetFolderWebDavRules(System.IAsyncResult asyncResult) { object[] results = this.EndInvoke(asyncResult); return ((bool)(results[0])); } - + /// - public void SetFolderWebDavRulesAsync(string organizationId, string folder, WebDavSetting setting, WebDavFolderRule[] rules) - { + public void SetFolderWebDavRulesAsync(string organizationId, string folder, WebDavSetting setting, WebDavFolderRule[] rules) { this.SetFolderWebDavRulesAsync(organizationId, folder, setting, rules, null); } - + /// - public void SetFolderWebDavRulesAsync(string organizationId, string folder, WebDavSetting setting, WebDavFolderRule[] rules, object userState) - { - if ((this.SetFolderWebDavRulesOperationCompleted == null)) - { + public void SetFolderWebDavRulesAsync(string organizationId, string folder, WebDavSetting setting, WebDavFolderRule[] rules, object userState) { + if ((this.SetFolderWebDavRulesOperationCompleted == null)) { this.SetFolderWebDavRulesOperationCompleted = new System.Threading.SendOrPostCallback(this.OnSetFolderWebDavRulesOperationCompleted); } this.InvokeAsync("SetFolderWebDavRules", new object[] { @@ -366,55 +312,47 @@ namespace WebsitePanel.Providers.EnterpriseStorage setting, rules}, this.SetFolderWebDavRulesOperationCompleted, userState); } - - private void OnSetFolderWebDavRulesOperationCompleted(object arg) - { - if ((this.SetFolderWebDavRulesCompleted != null)) - { + + private void OnSetFolderWebDavRulesOperationCompleted(object arg) { + if ((this.SetFolderWebDavRulesCompleted != null)) { System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); this.SetFolderWebDavRulesCompleted(this, new SetFolderWebDavRulesCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); } } - + /// [System.Web.Services.Protocols.SoapHeaderAttribute("ServiceProviderSettingsSoapHeaderValue")] - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/server/GetFolderWebDavRules", RequestNamespace = "http://smbsaas/websitepanel/server/", ResponseNamespace = "http://smbsaas/websitepanel/server/", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public WebDavFolderRule[] GetFolderWebDavRules(string organizationId, string folder, WebDavSetting setting) - { + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/server/GetFolderWebDavRules", RequestNamespace="http://smbsaas/websitepanel/server/", ResponseNamespace="http://smbsaas/websitepanel/server/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public WebDavFolderRule[] GetFolderWebDavRules(string organizationId, string folder, WebDavSetting setting) { object[] results = this.Invoke("GetFolderWebDavRules", new object[] { organizationId, folder, setting}); return ((WebDavFolderRule[])(results[0])); } - + /// - public System.IAsyncResult BeginGetFolderWebDavRules(string organizationId, string folder, WebDavSetting setting, System.AsyncCallback callback, object asyncState) - { + public System.IAsyncResult BeginGetFolderWebDavRules(string organizationId, string folder, WebDavSetting setting, System.AsyncCallback callback, object asyncState) { return this.BeginInvoke("GetFolderWebDavRules", new object[] { organizationId, folder, setting}, callback, asyncState); } - + /// - public WebDavFolderRule[] EndGetFolderWebDavRules(System.IAsyncResult asyncResult) - { + public WebDavFolderRule[] EndGetFolderWebDavRules(System.IAsyncResult asyncResult) { object[] results = this.EndInvoke(asyncResult); return ((WebDavFolderRule[])(results[0])); } - + /// - public void GetFolderWebDavRulesAsync(string organizationId, string folder, WebDavSetting setting) - { + public void GetFolderWebDavRulesAsync(string organizationId, string folder, WebDavSetting setting) { this.GetFolderWebDavRulesAsync(organizationId, folder, setting, null); } - + /// - public void GetFolderWebDavRulesAsync(string organizationId, string folder, WebDavSetting setting, object userState) - { - if ((this.GetFolderWebDavRulesOperationCompleted == null)) - { + public void GetFolderWebDavRulesAsync(string organizationId, string folder, WebDavSetting setting, object userState) { + if ((this.GetFolderWebDavRulesOperationCompleted == null)) { this.GetFolderWebDavRulesOperationCompleted = new System.Threading.SendOrPostCallback(this.OnGetFolderWebDavRulesOperationCompleted); } this.InvokeAsync("GetFolderWebDavRules", new object[] { @@ -422,68 +360,108 @@ namespace WebsitePanel.Providers.EnterpriseStorage folder, setting}, this.GetFolderWebDavRulesOperationCompleted, userState); } - - private void OnGetFolderWebDavRulesOperationCompleted(object arg) - { - if ((this.GetFolderWebDavRulesCompleted != null)) - { + + private void OnGetFolderWebDavRulesOperationCompleted(object arg) { + if ((this.GetFolderWebDavRulesCompleted != null)) { System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); this.GetFolderWebDavRulesCompleted(this, new GetFolderWebDavRulesCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); } } - + /// [System.Web.Services.Protocols.SoapHeaderAttribute("ServiceProviderSettingsSoapHeaderValue")] - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/server/CheckFileServicesInstallation", RequestNamespace = "http://smbsaas/websitepanel/server/", ResponseNamespace = "http://smbsaas/websitepanel/server/", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public bool CheckFileServicesInstallation() - { + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/server/CheckFileServicesInstallation", RequestNamespace="http://smbsaas/websitepanel/server/", ResponseNamespace="http://smbsaas/websitepanel/server/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public bool CheckFileServicesInstallation() { object[] results = this.Invoke("CheckFileServicesInstallation", new object[0]); return ((bool)(results[0])); } - + /// - public System.IAsyncResult BeginCheckFileServicesInstallation(System.AsyncCallback callback, object asyncState) - { + public System.IAsyncResult BeginCheckFileServicesInstallation(System.AsyncCallback callback, object asyncState) { return this.BeginInvoke("CheckFileServicesInstallation", new object[0], callback, asyncState); } - + /// - public bool EndCheckFileServicesInstallation(System.IAsyncResult asyncResult) - { + public bool EndCheckFileServicesInstallation(System.IAsyncResult asyncResult) { object[] results = this.EndInvoke(asyncResult); return ((bool)(results[0])); } - + /// - public void CheckFileServicesInstallationAsync() - { + public void CheckFileServicesInstallationAsync() { this.CheckFileServicesInstallationAsync(null); } - + /// - public void CheckFileServicesInstallationAsync(object userState) - { - if ((this.CheckFileServicesInstallationOperationCompleted == null)) - { + public void CheckFileServicesInstallationAsync(object userState) { + if ((this.CheckFileServicesInstallationOperationCompleted == null)) { this.CheckFileServicesInstallationOperationCompleted = new System.Threading.SendOrPostCallback(this.OnCheckFileServicesInstallationOperationCompleted); } this.InvokeAsync("CheckFileServicesInstallation", new object[0], this.CheckFileServicesInstallationOperationCompleted, userState); } - - private void OnCheckFileServicesInstallationOperationCompleted(object arg) - { - if ((this.CheckFileServicesInstallationCompleted != null)) - { + + private void OnCheckFileServicesInstallationOperationCompleted(object arg) { + if ((this.CheckFileServicesInstallationCompleted != null)) { System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); this.CheckFileServicesInstallationCompleted(this, new CheckFileServicesInstallationCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); } } - + /// [System.Web.Services.Protocols.SoapHeaderAttribute("ServiceProviderSettingsSoapHeaderValue")] - [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/server/RenameFolder", RequestNamespace = "http://smbsaas/websitepanel/server/", ResponseNamespace = "http://smbsaas/websitepanel/server/", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public SystemFile RenameFolder(string organizationId, string originalFolder, string newFolder, WebDavSetting setting) - { + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/server/Search", RequestNamespace="http://smbsaas/websitepanel/server/", ResponseNamespace="http://smbsaas/websitepanel/server/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public SystemFile[] Search(string searchPath, string searchText, string userPrincipalName, bool recursive) { + object[] results = this.Invoke("Search", new object[] { + searchPath, + searchText, + userPrincipalName, + recursive}); + return ((SystemFile[])(results[0])); + } + + /// + public System.IAsyncResult BeginSearch(string searchPath, string searchText, string userPrincipalName, bool recursive, System.AsyncCallback callback, object asyncState) { + return this.BeginInvoke("Search", new object[] { + searchPath, + searchText, + userPrincipalName, + recursive}, callback, asyncState); + } + + /// + public SystemFile[] EndSearch(System.IAsyncResult asyncResult) { + object[] results = this.EndInvoke(asyncResult); + return ((SystemFile[])(results[0])); + } + + /// + public void SearchAsync(string searchPath, string searchText, string userPrincipalName, bool recursive) { + this.SearchAsync(searchPath, searchText, userPrincipalName, recursive, null); + } + + /// + public void SearchAsync(string searchPath, string searchText, string userPrincipalName, bool recursive, object userState) { + if ((this.SearchOperationCompleted == null)) { + this.SearchOperationCompleted = new System.Threading.SendOrPostCallback(this.OnSearchOperationCompleted); + } + this.InvokeAsync("Search", new object[] { + searchPath, + searchText, + userPrincipalName, + recursive}, this.SearchOperationCompleted, userState); + } + + private void OnSearchOperationCompleted(object arg) { + if ((this.SearchCompleted != null)) { + System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); + this.SearchCompleted(this, new SearchCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); + } + } + + /// + [System.Web.Services.Protocols.SoapHeaderAttribute("ServiceProviderSettingsSoapHeaderValue")] + [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/server/RenameFolder", RequestNamespace="http://smbsaas/websitepanel/server/", ResponseNamespace="http://smbsaas/websitepanel/server/", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] + public SystemFile RenameFolder(string organizationId, string originalFolder, string newFolder, WebDavSetting setting) { object[] results = this.Invoke("RenameFolder", new object[] { organizationId, originalFolder, @@ -491,35 +469,30 @@ namespace WebsitePanel.Providers.EnterpriseStorage setting}); return ((SystemFile)(results[0])); } - + /// - public System.IAsyncResult BeginRenameFolder(string organizationId, string originalFolder, string newFolder, WebDavSetting setting, System.AsyncCallback callback, object asyncState) - { + public System.IAsyncResult BeginRenameFolder(string organizationId, string originalFolder, string newFolder, WebDavSetting setting, System.AsyncCallback callback, object asyncState) { return this.BeginInvoke("RenameFolder", new object[] { organizationId, originalFolder, newFolder, setting}, callback, asyncState); } - + /// - public SystemFile EndRenameFolder(System.IAsyncResult asyncResult) - { + public SystemFile EndRenameFolder(System.IAsyncResult asyncResult) { object[] results = this.EndInvoke(asyncResult); return ((SystemFile)(results[0])); } - + /// - public void RenameFolderAsync(string organizationId, string originalFolder, string newFolder, WebDavSetting setting) - { + public void RenameFolderAsync(string organizationId, string originalFolder, string newFolder, WebDavSetting setting) { this.RenameFolderAsync(organizationId, originalFolder, newFolder, setting, null); } - + /// - public void RenameFolderAsync(string organizationId, string originalFolder, string newFolder, WebDavSetting setting, object userState) - { - if ((this.RenameFolderOperationCompleted == null)) - { + public void RenameFolderAsync(string organizationId, string originalFolder, string newFolder, WebDavSetting setting, object userState) { + if ((this.RenameFolderOperationCompleted == null)) { this.RenameFolderOperationCompleted = new System.Threading.SendOrPostCallback(this.OnRenameFolderOperationCompleted); } this.InvokeAsync("RenameFolder", new object[] { @@ -528,205 +501,204 @@ namespace WebsitePanel.Providers.EnterpriseStorage newFolder, setting}, this.RenameFolderOperationCompleted, userState); } - - private void OnRenameFolderOperationCompleted(object arg) - { - if ((this.RenameFolderCompleted != null)) - { + + private void OnRenameFolderOperationCompleted(object arg) { + if ((this.RenameFolderCompleted != null)) { System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg)); this.RenameFolderCompleted(this, new RenameFolderCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState)); } } - + /// - public new void CancelAsync(object userState) - { + public new void CancelAsync(object userState) { base.CancelAsync(userState); } } - + /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] public delegate void GetFoldersCompletedEventHandler(object sender, GetFoldersCompletedEventArgs e); - + /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class GetFoldersCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs - { - + public partial class GetFoldersCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + private object[] results; - - internal GetFoldersCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) - { + + internal GetFoldersCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { this.results = results; } - + /// - public SystemFile[] Result - { - get - { + public SystemFile[] Result { + get { this.RaiseExceptionIfNecessary(); return ((SystemFile[])(this.results[0])); } } } - + /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] public delegate void GetFolderCompletedEventHandler(object sender, GetFolderCompletedEventArgs e); - + /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class GetFolderCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs - { - + public partial class GetFolderCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + private object[] results; - - internal GetFolderCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) - { + + internal GetFolderCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { this.results = results; } - + /// - public SystemFile Result - { - get - { + public SystemFile Result { + get { this.RaiseExceptionIfNecessary(); return ((SystemFile)(this.results[0])); } } } - + /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] public delegate void CreateFolderCompletedEventHandler(object sender, System.ComponentModel.AsyncCompletedEventArgs e); - + /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] public delegate void DeleteFolderCompletedEventHandler(object sender, System.ComponentModel.AsyncCompletedEventArgs e); - + /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] public delegate void SetFolderWebDavRulesCompletedEventHandler(object sender, SetFolderWebDavRulesCompletedEventArgs e); - + /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class SetFolderWebDavRulesCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs - { - + public partial class SetFolderWebDavRulesCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + private object[] results; - - internal SetFolderWebDavRulesCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) - { + + internal SetFolderWebDavRulesCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { this.results = results; } - + /// - public bool Result - { - get - { + public bool Result { + get { this.RaiseExceptionIfNecessary(); return ((bool)(this.results[0])); } } } - + /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] public delegate void GetFolderWebDavRulesCompletedEventHandler(object sender, GetFolderWebDavRulesCompletedEventArgs e); - + /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class GetFolderWebDavRulesCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs - { - + public partial class GetFolderWebDavRulesCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + private object[] results; - - internal GetFolderWebDavRulesCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) - { + + internal GetFolderWebDavRulesCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { this.results = results; } - + /// - public WebDavFolderRule[] Result - { - get - { + public WebDavFolderRule[] Result { + get { this.RaiseExceptionIfNecessary(); return ((WebDavFolderRule[])(this.results[0])); } } } - + /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] public delegate void CheckFileServicesInstallationCompletedEventHandler(object sender, CheckFileServicesInstallationCompletedEventArgs e); - + /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class CheckFileServicesInstallationCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs - { - + public partial class CheckFileServicesInstallationCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + private object[] results; - - internal CheckFileServicesInstallationCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) - { + + internal CheckFileServicesInstallationCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { this.results = results; } - + /// - public bool Result - { - get - { + public bool Result { + get { this.RaiseExceptionIfNecessary(); return ((bool)(this.results[0])); } } } - + /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] - public delegate void RenameFolderCompletedEventHandler(object sender, RenameFolderCompletedEventArgs e); - + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] + public delegate void SearchCompletedEventHandler(object sender, SearchCompletedEventArgs e); + /// - [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")] + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] [System.Diagnostics.DebuggerStepThroughAttribute()] [System.ComponentModel.DesignerCategoryAttribute("code")] - public partial class RenameFolderCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs - { - + public partial class SearchCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + private object[] results; - - internal RenameFolderCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : - base(exception, cancelled, userState) - { + + internal SearchCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { this.results = results; } - + /// - public SystemFile Result - { - get - { + public SystemFile[] Result { + get { + this.RaiseExceptionIfNecessary(); + return ((SystemFile[])(this.results[0])); + } + } + } + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] + public delegate void RenameFolderCompletedEventHandler(object sender, RenameFolderCompletedEventArgs e); + + /// + [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")] + [System.Diagnostics.DebuggerStepThroughAttribute()] + [System.ComponentModel.DesignerCategoryAttribute("code")] + public partial class RenameFolderCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs { + + private object[] results; + + internal RenameFolderCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : + base(exception, cancelled, userState) { + this.results = results; + } + + /// + public SystemFile Result { + get { this.RaiseExceptionIfNecessary(); return ((SystemFile)(this.results[0])); } diff --git a/WebsitePanel/Sources/WebsitePanel.Server/EnterpriseStorage.asmx.cs b/WebsitePanel/Sources/WebsitePanel.Server/EnterpriseStorage.asmx.cs index 3643dc96..c5a9f699 100644 --- a/WebsitePanel/Sources/WebsitePanel.Server/EnterpriseStorage.asmx.cs +++ b/WebsitePanel/Sources/WebsitePanel.Server/EnterpriseStorage.asmx.cs @@ -175,6 +175,23 @@ namespace WebsitePanel.Server } } + [WebMethod, SoapHeader("settings")] + public SystemFile[] Search(string searchPath, string searchText, string userPrincipalName, bool recursive) + { + try + { + Log.WriteStart("'{0}' Search", ProviderSettings.ProviderName); + var searchResults = EnterpriseStorageProvider.Search(searchPath, searchText, userPrincipalName, recursive); + Log.WriteEnd("'{0}' Search", ProviderSettings.ProviderName); + return searchResults; + } + catch (Exception ex) + { + Log.WriteError(String.Format("'{0}' Search", ProviderSettings.ProviderName), ex); + throw; + } + } + [WebMethod, SoapHeader("settings")] public SystemFile RenameFolder(string organizationId, string originalFolder, string newFolder, WebDavSetting setting) { diff --git a/WebsitePanel/Sources/WebsitePanel.WebDav.Core/IResource.cs b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/IResource.cs index 1cc1f475..5beead86 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDav.Core/IResource.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/IResource.cs @@ -251,14 +251,14 @@ namespace WebsitePanel.WebDav.Core { get { - string displayName = _href.AbsoluteUri.Replace(_baseUri.AbsoluteUri, ""); + string displayName = _href.AbsoluteUri.Trim('/').Replace(_baseUri.AbsoluteUri.Trim('/'), ""); displayName = Regex.Replace(displayName, "\\/$", ""); Match displayNameMatch = Regex.Match(displayName, "([\\/]+)$"); if (displayNameMatch.Success) { displayName = displayNameMatch.Groups[1].Value; } - return HttpUtility.UrlDecode(displayName); + return HttpUtility.UrlDecode(displayName.Trim('/')); } } @@ -473,15 +473,10 @@ namespace WebsitePanel.WebDav.Core public void SetHref(Uri href) { _href = href; - string baseUri = _href.Scheme + "://" + _href.Host; - for (int i = 0; i < _href.Segments.Length - 1; i++) - { - if (_href.Segments[i] != "/") - { - baseUri += "/" + _href.Segments[i]; - } - } - _baseUri = new Uri(baseUri); + + var baseUrl = href.AbsoluteUri.Remove(href.AbsoluteUri.Length - href.Segments.Last().Length); + + _baseUri = new Uri(baseUrl); } /// diff --git a/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Interfaces/Managers/IWebDavManager.cs b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Interfaces/Managers/IWebDavManager.cs index c2b8f360..fd1fdc3a 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Interfaces/Managers/IWebDavManager.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Interfaces/Managers/IWebDavManager.cs @@ -14,6 +14,7 @@ namespace WebsitePanel.WebDav.Core.Interfaces.Managers void UploadFile(string path, HttpPostedFileBase file); void UploadFile(string path, byte[] bytes); void UploadFile(string path, Stream stream); + IEnumerable SearchFiles(int itemId, string pathPart, string searchValue, string uesrPrincipalName, bool recursive); IResource GetResource(string path); string GetFileUrl(string path); void DeleteResource(string path); diff --git a/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Managers/WebDavManager.cs b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Managers/WebDavManager.cs index b5bd354c..c878cd25 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Managers/WebDavManager.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebDav.Core/Managers/WebDavManager.cs @@ -14,6 +14,7 @@ using WebsitePanel.WebDav.Core.Config; using WebsitePanel.WebDav.Core.Exceptions; using WebsitePanel.WebDav.Core.Extensions; using WebsitePanel.WebDav.Core.Interfaces.Managers; +using WebsitePanel.WebDav.Core.Interfaces.Security; using WebsitePanel.WebDav.Core.Resources; using WebsitePanel.WebDav.Core.Security.Cryptography; using WebsitePanel.WebDav.Core.Wsp.Framework; @@ -24,15 +25,17 @@ namespace WebsitePanel.WebDav.Core.Managers { private readonly ICryptography _cryptography; private readonly WebDavSession _webDavSession; + private readonly IWebDavAuthorizationService _webDavAuthorizationService; private readonly ILog Log; private bool _isRoot = true; private IFolder _currentFolder; - public WebDavManager(ICryptography cryptography) + public WebDavManager(ICryptography cryptography, IWebDavAuthorizationService webDavAuthorizationService) { _cryptography = cryptography; + _webDavAuthorizationService = webDavAuthorizationService; Log = LogManager.GetLogger(this.GetType()); _webDavSession = new WebDavSession(); @@ -84,6 +87,36 @@ namespace WebsitePanel.WebDav.Core.Managers return sortedChildren; } + public IEnumerable SearchFiles(int itemId, string pathPart, string searchValue, string uesrPrincipalName, bool recursive) + { + pathPart = (pathPart ?? string.Empty).Replace("/","\\"); + + var items = WspContext.Services.EnterpriseStorage.SearchFiles(itemId, pathPart, searchValue, uesrPrincipalName, recursive); + + var resources = Convert(items, new Uri(WebDavAppConfigManager.Instance.WebdavRoot).Append(WspContext.User.OrganizationId, pathPart)); + + if (string.IsNullOrWhiteSpace(pathPart)) + { + var rootItems = ConnectToWebDavServer().ToArray(); + + foreach (var resource in resources) + { + var rootItem = rootItems.FirstOrDefault(x => x.Name == resource.DisplayName); + + if (rootItem == null) + { + continue; + } + + resource.ContentLength = rootItem.Size; + resource.AllocatedSpace = rootItem.FRSMQuotaMB; + resource.IsRootItem = true; + } + } + + return FilterResult(resources); + } + public bool IsFile(string path) { string folder = GetFileFolder(path); @@ -290,6 +323,7 @@ namespace WebsitePanel.WebDav.Core.Managers } } } + return rootFolders; } @@ -307,6 +341,33 @@ namespace WebsitePanel.WebDav.Core.Managers return pathPart.StartsWith('/' + toRemove) ? pathPart.Substring(toRemove.Length + 1) : pathPart; } + private IEnumerable Convert(IEnumerable files, Uri baseUri) + { + var convertResult = new List(); + + var credentials = new NetworkCredential(WspContext.User.Login, + _cryptography.Decrypt(WspContext.User.EncryptedPassword), + WebDavAppConfigManager.Instance.UserDomain); + + foreach (var file in files) + { + var webDavitem = new WebDavResource(); + + webDavitem.SetCredentials(credentials); + + webDavitem.SetHref(baseUri.Append(file.RelativeUrl.Replace("\\","/"))); + + webDavitem.SetItemType(file.IsDirectory? ItemType.Folder : ItemType.Resource); + webDavitem.SetLastModified(file.Changed); + webDavitem.ContentLength = file.Size; + webDavitem.AllocatedSpace = file.FRSMQuotaMB; + + convertResult.Add(webDavitem); + } + + return convertResult; + } + private byte[] ReadFully(Stream input) { var buffer = new byte[16 * 1024]; diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/App_Start/BundleConfig.cs b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/App_Start/BundleConfig.cs index 311a7d1c..8b6dd2c9 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/App_Start/BundleConfig.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/App_Start/BundleConfig.cs @@ -36,8 +36,7 @@ namespace WebsitePanel.WebDavPortal )); bundles.Add(new ScriptBundle("~/bundles/bigIconsScripts").Include( - "~/Scripts/appScripts/recalculateResourseHeight.js", - "~/Scripts/appScripts/uploadingData2.js" + "~/Scripts/appScripts/recalculateResourseHeight.js" )); bundles.Add(new ScriptBundle("~/bundles/authScripts").Include( diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/Site.css b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/Site.css index e89dc814..1d465903 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/Site.css +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Content/Site.css @@ -248,6 +248,15 @@ tr.selected-file { width: 200px; } +.search-block { +} + +.search-block input, .search-block label { + display: inline-block; + width: initial; + font-weight: normal; +} + /* Theme Mods */ input,div{border-radius:0px!important;} diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Controllers/FileSystemController.cs b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Controllers/FileSystemController.cs index 4816eba6..e6c80e1f 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Controllers/FileSystemController.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Controllers/FileSystemController.cs @@ -48,6 +48,7 @@ namespace WebsitePanel.WebDavPortal.Controllers private readonly IAccessTokenManager _tokenManager; private readonly IWebDavAuthorizationService _webDavAuthorizationService; private readonly IUserSettingsManager _userSettingsManager; + private readonly FileOpenerManager _openerManager; private readonly ILog Log; public FileSystemController(ICryptography cryptography, IWebDavManager webdavManager, IAuthenticationService authenticationService, IAccessTokenManager tokenManager, IWebDavAuthorizationService webDavAuthorizationService, FileOpenerManager openerManager, IUserSettingsManager userSettingsManager) @@ -60,6 +61,7 @@ namespace WebsitePanel.WebDavPortal.Controllers _userSettingsManager = userSettingsManager; Log = LogManager.GetLogger(this.GetType()); + _openerManager = new FileOpenerManager(); } [HttpGet] @@ -70,8 +72,7 @@ namespace WebsitePanel.WebDavPortal.Controllers return RedirectToRoute(FileSystemRouteNames.ShowContentPath, new { org, pathPart }); } - [HttpGet] - public ActionResult ShowContent(string org, string pathPart = "") + public ActionResult ShowContent(string org, string pathPart = "", string searchValue = "") { if (org != WspContext.User.OrganizationId) { @@ -92,7 +93,8 @@ namespace WebsitePanel.WebDavPortal.Controllers { UrlSuffix = pathPart, Permissions =_webDavAuthorizationService.GetPermissions(WspContext.User, pathPart), - UserSettings = _userSettingsManager.GetUserSettings(WspContext.User.AccountId) + UserSettings = _userSettingsManager.GetUserSettings(WspContext.User.AccountId), + SearchValue = searchValue }; return View(model); @@ -104,24 +106,26 @@ namespace WebsitePanel.WebDavPortal.Controllers } [ChildActionOnly] - public ActionResult ContentList(string org, FolderViewTypes viewType, string pathPart = "") + public ActionResult ContentList(string org, ModelForWebDav model, string pathPart = "") { try { - IEnumerable children = _webdavManager.OpenFolder(pathPart); - - var model = new ModelForWebDav - { - UrlSuffix = pathPart, - Permissions = _webDavAuthorizationService.GetPermissions(WspContext.User, pathPart), - UserSettings = _userSettingsManager.GetUserSettings(WspContext.User.AccountId) - }; - if (Request.Browser.IsMobileDevice == false && model.UserSettings.WebDavViewType == FolderViewTypes.Table) { return PartialView("_ShowContentTable", model); } + IEnumerable children; + + if (string.IsNullOrEmpty(model.SearchValue)) + { + children = _webdavManager.OpenFolder(pathPart); + } + else + { + children = _webdavManager.SearchFiles(WspContext.User.ItemId, pathPart, model.SearchValue, WspContext.User.Login, true); + } + model.Items = children.Take(WebDavAppConfigManager.Instance.ElementsRendering.DefaultCount); return PartialView("_ShowContentBigIcons", model); @@ -136,9 +140,20 @@ namespace WebsitePanel.WebDavPortal.Controllers [HttpGet] public ActionResult GetContentDetails(string org, string pathPart, [ModelBinder(typeof (JqueryDataTableModelBinder))] JqueryDataTableRequest dtRequest) { - var folderItems = _webdavManager.OpenFolder(pathPart); + IEnumerable folderItems; - var tableItems = Mapper.Map, IEnumerable>(folderItems).ToList(); + if (string.IsNullOrEmpty(dtRequest.Search.Value) == false) + { + folderItems = _webdavManager.SearchFiles(WspContext.User.ItemId, pathPart, dtRequest.Search.Value, WspContext.User.Login, true).Select(x => new WebDavResource(null, x)); + } + else + { + folderItems = _webdavManager.OpenFolder(pathPart).Select(x=>new WebDavResource(null, x)); + } + + var tableItems = Mapper.Map, IEnumerable>(folderItems).ToList(); + + FillContentModel(tableItems); var orders = dtRequest.Orders.ToList(); orders.Insert(0, new JqueryDataTableOrder{Column = 3, Ascending = false}); @@ -146,7 +161,7 @@ namespace WebsitePanel.WebDavPortal.Controllers dtRequest.Orders = orders; var dataTableResponse = DataTableHelper.ProcessRequest(tableItems, dtRequest); - + return Json(dataTableResponse, JsonRequestBehavior.AllowGet); } @@ -304,5 +319,27 @@ namespace WebsitePanel.WebDavPortal.Controllers } #endregion + private void FillContentModel(IEnumerable items) + { + foreach (var item in items) + { + var opener = _openerManager[Path.GetExtension(item.DisplayName)]; + + switch (opener) + { + case FileOpenerType.OfficeOnline: + { + var pathPart = item.Href.AbsolutePath.Replace("/" + WspContext.User.OrganizationId, "").TrimStart('/'); + item.Url = string.Concat(Url.RouteUrl(FileSystemRouteNames.EditOfficeOnline, new {org = WspContext.User.OrganizationId, pathPart = ""}), pathPart); + break; + } + default: + { + item.Url = item.Href.LocalPath; + break; + } + } + } + } } } \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/FileOperations/FileOpenerManager.cs b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/FileOperations/FileOpenerManager.cs index cf5d2467..d068a277 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/FileOperations/FileOpenerManager.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/FileOperations/FileOpenerManager.cs @@ -15,7 +15,6 @@ namespace WebsitePanel.WebDavPortal.FileOperations public class FileOpenerManager { private readonly IDictionary _operationTypes = new Dictionary(); - private UrlHelper _urlHelper; public FileOpenerManager() { @@ -23,10 +22,8 @@ namespace WebsitePanel.WebDavPortal.FileOperations _operationTypes.AddRange(WebDavAppConfigManager.Instance.OfficeOnline.ToDictionary(x => x.Extension, y => FileOpenerType.OfficeOnline)); } - public string GetUrl(IHierarchyItem item) + public string GetUrl(IHierarchyItem item, UrlHelper urlHelper) { - _urlHelper =_urlHelper ?? new UrlHelper(HttpContext.Current.Request.RequestContext); - var opener = this[Path.GetExtension(item.DisplayName)]; string href = "/"; @@ -35,7 +32,7 @@ namespace WebsitePanel.WebDavPortal.FileOperations case FileOpenerType.OfficeOnline: { var pathPart = item.Href.AbsolutePath.Replace("/" + WspContext.User.OrganizationId, "").TrimStart('/'); - href = string.Concat(_urlHelper.RouteUrl(FileSystemRouteNames.EditOfficeOnline, new { org = WspContext.User.OrganizationId, pathPart = "" }), pathPart); + href = string.Concat(urlHelper.RouteUrl(FileSystemRouteNames.EditOfficeOnline, new { org = WspContext.User.OrganizationId, pathPart = "" }), pathPart); break; } default: diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Mapping/Profiles/Webdav/ResourceTableItemProfile.cs b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Mapping/Profiles/Webdav/ResourceTableItemProfile.cs index 0ec471bb..b38bad24 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Mapping/Profiles/Webdav/ResourceTableItemProfile.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Mapping/Profiles/Webdav/ResourceTableItemProfile.cs @@ -36,18 +36,18 @@ namespace WebsitePanel.WebDavPortal.Mapping.Profiles.Webdav { var openerManager = new FileOpenerManager(); - Mapper.CreateMap() + Mapper.CreateMap() .ForMember(ti => ti.DisplayName, x => x.MapFrom(hi => hi.DisplayName.Trim('/'))) - .ForMember(ti => ti.Url, x => x.MapFrom(hi => openerManager.GetUrl(hi))) + .ForMember(ti => ti.Href, x => x.MapFrom(hi => hi.Href)) + .ForMember(ti => ti.Type, x => x.MapFrom(hi => hi.ItemType.GetDescription().ToLowerInvariant())) + .ForMember(ti => ti.IconHref, x => x.MapFrom(hi => hi.ItemType == ItemType.Folder ? WebDavAppConfigManager.Instance.FileIcons.FolderPath.Trim('~') : WebDavAppConfigManager.Instance.FileIcons[Path.GetExtension(hi.DisplayName.Trim('/'))].Trim('~'))) .ForMember(ti => ti.IsTargetBlank, x => x.MapFrom(hi => openerManager.GetIsTargetBlank(hi))) - .ForMember(ti => ti.Type, x => x.MapFrom(hi => (new WebDavResource(null, hi)).ItemType.GetDescription().ToLowerInvariant())) - .ForMember(ti => ti.IconHref, x => x.MapFrom(hi => (new WebDavResource(null, hi)).ItemType == ItemType.Folder ? WebDavAppConfigManager.Instance.FileIcons.FolderPath.Trim('~') : WebDavAppConfigManager.Instance.FileIcons[Path.GetExtension(hi.DisplayName.Trim('/'))].Trim('~'))) - .ForMember(ti => ti.LastModified, x => x.MapFrom(hi => (new WebDavResource(null, hi)).LastModified)) + .ForMember(ti => ti.LastModified, x => x.MapFrom(hi => hi.LastModified)) .ForMember(ti => ti.LastModifiedFormated, - x => x.MapFrom(hi => (new WebDavResource(null, hi)).LastModified == DateTime.MinValue ? "--" : (new WebDavResource(null, hi)).LastModified.ToString("dd/MM/yyyy hh:mm tt"))) + x => x.MapFrom(hi => hi.LastModified == DateTime.MinValue ? "--" : (new WebDavResource(null, hi)).LastModified.ToString("dd/MM/yyyy hh:mm tt"))) - .ForMember(ti => ti.Size, x => x.MapFrom(hi => (new WebDavResource(null,hi)).ContentLength)) - .ForMember(ti => ti.IsFolder, x => x.MapFrom(hi => (new WebDavResource(null, hi)).ItemType == ItemType.Folder)); + .ForMember(ti => ti.Size, x => x.MapFrom(hi => hi.ContentLength)) + .ForMember(ti => ti.IsFolder, x => x.MapFrom(hi => hi.ItemType == ItemType.Folder)); } } } \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Models/FileSystem/ResourceTableItemModel.cs b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Models/FileSystem/ResourceTableItemModel.cs index 2240f40c..24ac5e13 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Models/FileSystem/ResourceTableItemModel.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Models/FileSystem/ResourceTableItemModel.cs @@ -8,6 +8,7 @@ namespace WebsitePanel.WebDavPortal.Models.FileSystem { public string DisplayName { get; set; } public string Url { get; set; } + public Uri Href { get; set; } public bool IsTargetBlank { get; set; } public bool IsFolder { get; set; } public long Size { get; set; } diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Models/ModelForWebDav.cs b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Models/ModelForWebDav.cs index b84fb560..c54e50ac 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Models/ModelForWebDav.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Models/ModelForWebDav.cs @@ -11,6 +11,7 @@ namespace WebsitePanel.WebDavPortal.Models public IEnumerable Items { get; set; } public string UrlSuffix { get; set; } public string Error { get; set; } + public string SearchValue { get; set; } public WebDavPermissions Permissions { get; set; } public UserPortalSettings UserSettings { get; set; } } diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Resources/UI.Designer.cs b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Resources/UI.Designer.cs index 75a72681..e3836593 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Resources/UI.Designer.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Resources/UI.Designer.cs @@ -249,6 +249,15 @@ namespace WebsitePanel.WebDavPortal.Resources { } } + /// + /// Looks up a localized string similar to Search. + /// + public static string Search { + get { + return ResourceManager.GetString("Search", resourceCulture); + } + } + /// /// Looks up a localized string similar to Select files to upload. /// diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Resources/UI.resx b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Resources/UI.resx index 6d826aa3..5cb4b1a3 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Resources/UI.resx +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Resources/UI.resx @@ -180,6 +180,9 @@ Processing... + + Search + Select files to upload diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Scripts/appScripts/fileBrowsing.js b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Scripts/appScripts/fileBrowsing.js index 6ab29cc2..f17d9672 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Scripts/appScripts/fileBrowsing.js +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Scripts/appScripts/fileBrowsing.js @@ -83,7 +83,6 @@ WspFileBrowser.prototype = { "ajax": ajaxUrl, "processing": true, "serverSide": true, - "searching": false, "columnDefs": [ { "render": function(data, type, row) { @@ -118,6 +117,14 @@ WspFileBrowser.prototype = { }); $(tableId).removeClass('dataTable'); + + var oTable = this.table; + $(tableId+'_filter input').unbind(); + $(tableId+'_filter input').bind('keyup', function (e) { + if (e.keyCode == 13) { + oTable.fnFilter(this.value); + } + }); }, refreshDataTable: function () { @@ -136,6 +143,40 @@ WspFileBrowser.prototype = { sequentialUploads: true }); }); + }, + + initBigIcons: function (elementId, url) { + $(document).ready(function () { + $(window).load(function () { + getResources(); + }); + $(window).scroll(function () { + if (($(window).scrollTop() + 1) >= ($(document).height() - $(window).height())) { + getResources(); + }; + }); + }); + + var oldResourcesDivHeight = $(elementId).height(); + + function getResources() { + $.ajax({ + type: 'POST', + url: url,//'/storage/show-additional-content', + data: { path: window.location.pathname, resourseRenderCount: $(".element-container").length }, + dataType: "html", + success: function (result) { + var domElement = $(result); + $(elementId).append(domElement); + if ($(document).height() == $(window).height() && oldResourcesDivHeight != $('#resourcesDiv').height()) { + getResources(); + oldResourcesDivHeight = $(elementId).height(); + }; + + recalculateResourseHeight(); + } + }); + }; } }; diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Scripts/appScripts/wsp.js b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Scripts/appScripts/wsp.js index 204be19b..41f36ed8 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Scripts/appScripts/wsp.js +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Scripts/appScripts/wsp.js @@ -41,9 +41,9 @@ $(document).on('touchstart', '.element-container', function(e) { $(document).on('dblclick', '.element-container', function (e) { wsp.fileBrowser.openItem(this); - var links = $(item).find('.file-link'); + var links = $(this).find('.file-link'); - if (links.length != 0 && links[0].hasClass('processing-dialog')) { + if (links.length != 0 && $(links[0]).hasClass('processing-dialog')) { wsp.dialogs.showProcessDialog(); } }); diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Views/FileSystem/ShowContent.cshtml b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Views/FileSystem/ShowContent.cshtml index 8917e24f..c7e77f2c 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Views/FileSystem/ShowContent.cshtml +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Views/FileSystem/ShowContent.cshtml @@ -20,7 +20,7 @@ else { @Html.Partial("_ShowContentTopMenu", Model) - @Html.Action("ContentList", "FileSystem", new { viewType = Request.Browser.IsMobileDevice ? FolderViewTypes.BigIcons : Model.UserSettings.WebDavViewType }); + @Html.Action("ContentList", "FileSystem", new { model = Model }); } @@ -34,17 +34,22 @@ else @Scripts.Render("~/bundles/bigIconsScripts") } else { } } diff --git a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Views/FileSystem/_ShowContentBigIcons.cshtml b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Views/FileSystem/_ShowContentBigIcons.cshtml index 3e663548..e87f9c2d 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Views/FileSystem/_ShowContentBigIcons.cshtml +++ b/WebsitePanel/Sources/WebsitePanel.WebDavPortal/Views/FileSystem/_ShowContentBigIcons.cshtml @@ -1,10 +1,26 @@ @using WebsitePanel.WebDav.Core.Client +@using WebsitePanel.WebDavPortal.Resources @using WebsitePanel.WebDavPortal.UI.Routes @model WebsitePanel.WebDavPortal.Models.ModelForWebDav + + + + + @using (Html.BeginRouteForm(FileSystemRouteNames.ShowContentPath)) + { + + @UI.Search: + + @Html.TextBoxFor(x => x.SearchValue, new { @class = "form-control input-sm"}) + } + + + + @if (Model != null) {