From 878f67013eb78e2375e4314c8cb6b9d4f7d2bbd9 Mon Sep 17 00:00:00 2001 From: vfedosevich Date: Tue, 11 Feb 2014 21:13:00 +0300 Subject: [PATCH 01/25] add default group for creating enterprise folder save enterprise settings for enterprise folder --- WebsitePanel/Database/update_db.sql | 129 ++++++++++++++++ .../EnterpriseStorageProxy.cs | 19 ++- .../Data/DataProvider.cs | 40 ++++- .../EnterpriseStorageController.cs | 85 +++++++++-- .../esEnterpriseStorage.asmx.cs | 4 +- .../EnterpriseStorage/IEnterpriseStorage.cs | 12 +- .../Web/WebDavFolderRule.cs | 1 - .../Web/WebDavSetting.cs | 28 ++++ .../WebsitePanel.Providers.Base.csproj | 1 + .../Windows2012.cs | 141 ++++++++++++------ .../WebDav.cs | 14 +- .../EnterpriseStorageProxy.cs | 108 ++++++++------ .../EnterpriseStorage.asmx.cs | 25 ++-- .../EnterpriseStorageCreateFolder.ascx.resx | 3 + .../EnterpriseStorageCreateFolder.ascx | 7 + .../EnterpriseStorageCreateFolder.ascx.cs | 2 +- ...rpriseStorageCreateFolder.ascx.designer.cs | 46 +++--- 17 files changed, 491 insertions(+), 174 deletions(-) create mode 100644 WebsitePanel/Sources/WebsitePanel.Providers.Base/Web/WebDavSetting.cs diff --git a/WebsitePanel/Database/update_db.sql b/WebsitePanel/Database/update_db.sql index 7d8add41..ed0eb6d3 100644 --- a/WebsitePanel/Database/update_db.sql +++ b/WebsitePanel/Database/update_db.sql @@ -3035,4 +3035,133 @@ END GO UPDATE [dbo].[Quotas] SET [QuotaDescription] = N'Disk Storage Space (Mb)' WHERE [QuotaName] = 'EnterpriseStorage.DiskStorageSpace' +GO + +--Enterprise Storage +IF NOT EXISTS(select 1 from sys.columns COLS INNER JOIN sys.objects OBJS ON OBJS.object_id=COLS.object_id and OBJS.type='U' AND OBJS.name='EnterpriseFolders' AND COLS.name='LocationDrive') +BEGIN +ALTER TABLE [dbo].[EnterpriseFolders] ADD + [LocationDrive] NVARCHAR(255) NULL +END +GO + +IF NOT EXISTS(select 1 from sys.columns COLS INNER JOIN sys.objects OBJS ON OBJS.object_id=COLS.object_id and OBJS.type='U' AND OBJS.name='EnterpriseFolders' AND COLS.name='HomeFolder') +BEGIN +ALTER TABLE [dbo].[EnterpriseFolders] ADD + [HomeFolder] NVARCHAR(255) NULL +END +GO + +IF NOT EXISTS(select 1 from sys.columns COLS INNER JOIN sys.objects OBJS ON OBJS.object_id=COLS.object_id and OBJS.type='U' AND OBJS.name='EnterpriseFolders' AND COLS.name='Domain') +BEGIN +ALTER TABLE [dbo].[EnterpriseFolders] ADD + [Domain] NVARCHAR(255) NULL +END +GO + +IF EXISTS (SELECT * FROM SYS.OBJECTS WHERE type = 'P' AND name = 'GetEnterpriseFolders') +DROP PROCEDURE GetEnterpriseFolders +GO + +CREATE PROCEDURE [dbo].[GetEnterpriseFolders] +( + @ItemID INT +) +AS + +SELECT DISTINCT LocationDrive, HomeFolder, Domain FROM EnterpriseFolders +WHERE ItemID = @ItemID +GO + + +IF EXISTS (SELECT * FROM SYS.OBJECTS WHERE type = 'P' AND name = 'GetEnterpriseFolder') +DROP PROCEDURE GetEnterpriseFolder +GO + +CREATE PROCEDURE [dbo].[GetEnterpriseFolder] +( + @ItemID INT, + @FolderName NVARCHAR(255) +) +AS + +SELECT LocationDrive, HomeFolder, Domain FROM EnterpriseFolders +WHERE ItemID = @ItemID AND FolderName = @FolderName +GO + +IF EXISTS (SELECT * FROM SYS.OBJECTS WHERE type = 'P' AND name = 'AddEnterpriseFolder') +DROP PROCEDURE [dbo].[AddEnterpriseFolder] +GO + +CREATE PROCEDURE [dbo].[AddEnterpriseFolder] +( + @FolderID INT OUTPUT, + @ItemID INT, + @FolderName NVARCHAR(255), + @LocationDrive NVARCHAR(255), + @HomeFolder NVARCHAR(255), + @Domain NVARCHAR(255) +) +AS + +INSERT INTO EnterpriseFolders +( + ItemID, + FolderName, + LocationDrive, + HomeFolder, + Domain +) +VALUES +( + @ItemID, + @FolderName, + @LocationDrive, + @HomeFolder, + @Domain +) + +SET @FolderID = SCOPE_IDENTITY() + +RETURN +GO + +DECLARE @serviceId int +SET @serviceId = (SELECT TOP(1) ServiceId FROM Services WHERE ProviderID = 600) + +DECLARE @locationDrive nvarchar(255) +SET @locationDrive = (SELECT TOP(1) PropertyValue FROM ServiceProperties WHERE PropertyName = 'locationdrive' AND ServiceID = @serviceId) +DECLARE @homeFolder nvarchar(255) +SET @homeFolder = (SELECT TOP(1) PropertyValue FROM ServiceProperties WHERE PropertyName = 'usershome' AND ServiceID = @serviceId) +DECLARE @domain nvarchar(255) +SET @domain = (SELECT TOP(1) PropertyValue FROM ServiceProperties WHERE PropertyName = 'usersdomain' AND ServiceID = @serviceId) + +UPDATE EnterpriseFolders SET + LocationDrive = @locationDrive, + HomeFolder = @homeFolder, + Domain = @domain +GO + +IF EXISTS (SELECT * FROM SYS.OBJECTS WHERE type = 'P' AND name = 'GetOrganizationGroupsByDisplayName') +DROP PROCEDURE [dbo].[GetOrganizationGroupsByDisplayName] +GO + +CREATE PROCEDURE [dbo].[GetOrganizationGroupsByDisplayName] +( + @ItemID int, + @DisplayName NVARCHAR(255) +) +AS +SELECT + AccountID, + ItemID, + AccountType, + AccountName, + DisplayName, + UserPrincipalName +FROM + ExchangeAccounts +WHERE + ItemID = @ItemID AND DisplayName = @DisplayName AND (AccountType IN (8, 9)) +RETURN GO \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/EnterpriseStorageProxy.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/EnterpriseStorageProxy.cs index a64f9834..113e48d2 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/EnterpriseStorageProxy.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/EnterpriseStorageProxy.cs @@ -304,20 +304,22 @@ namespace WebsitePanel.EnterpriseServer /// [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/CreateEnterpriseFolder", 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 ResultObject CreateEnterpriseFolder(int itemId, string folderName) + public ResultObject CreateEnterpriseFolder(int itemId, string folderName, bool addDefaultGroup) { object[] results = this.Invoke("CreateEnterpriseFolder", new object[] { itemId, - folderName}); + folderName, + addDefaultGroup}); return ((ResultObject)(results[0])); } /// - public System.IAsyncResult BeginCreateEnterpriseFolder(int itemId, string folderName, System.AsyncCallback callback, object asyncState) + public System.IAsyncResult BeginCreateEnterpriseFolder(int itemId, string folderName, bool addDefaultGroup, System.AsyncCallback callback, object asyncState) { return this.BeginInvoke("CreateEnterpriseFolder", new object[] { itemId, - folderName}, callback, asyncState); + folderName, + addDefaultGroup}, callback, asyncState); } /// @@ -328,13 +330,13 @@ namespace WebsitePanel.EnterpriseServer } /// - public void CreateEnterpriseFolderAsync(int itemId, string folderName) + public void CreateEnterpriseFolderAsync(int itemId, string folderName, bool addDefaultGroup) { - this.CreateEnterpriseFolderAsync(itemId, folderName, null); + this.CreateEnterpriseFolderAsync(itemId, folderName, addDefaultGroup, null); } /// - public void CreateEnterpriseFolderAsync(int itemId, string folderName, object userState) + public void CreateEnterpriseFolderAsync(int itemId, string folderName, bool addDefaultGroup, object userState) { if ((this.CreateEnterpriseFolderOperationCompleted == null)) { @@ -342,7 +344,8 @@ namespace WebsitePanel.EnterpriseServer } this.InvokeAsync("CreateEnterpriseFolder", new object[] { itemId, - folderName}, this.CreateEnterpriseFolderOperationCompleted, userState); + folderName, + addDefaultGroup}, this.CreateEnterpriseFolderOperationCompleted, userState); } private void OnCreateEnterpriseFolderOperationCompleted(object arg) diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Data/DataProvider.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Data/DataProvider.cs index 6dc8c467..b6e7a97a 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Data/DataProvider.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Data/DataProvider.cs @@ -3092,6 +3092,17 @@ namespace WebsitePanel.EnterpriseServer ); } + public static IDataReader GetOrganizationGroupsByDisplayName(int itemId, string displayName) + { + return SqlHelper.ExecuteReader( + ConnectionString, + CommandType.StoredProcedure, + "GetOrganizationGroupsByDisplayName", + new SqlParameter("@ItemID", itemId), + new SqlParameter("@DisplayName", displayName) + ); + } + public static IDataReader SearchOrganizationAccounts(int actorId, int itemId, string filterColumn, string filterValue, string sortColumn, bool includeMailboxes) { @@ -4158,7 +4169,7 @@ namespace WebsitePanel.EnterpriseServer #region Enterprise Storage - public static int AddEntepriseFolder(int itemId, string folderName) + public static int AddEntepriseFolder(int itemId, string folderName, string locationDrive, string homeFolder, string domain) { SqlParameter prmId = new SqlParameter("@FolderID", SqlDbType.Int); prmId.Direction = ParameterDirection.Output; @@ -4169,7 +4180,11 @@ namespace WebsitePanel.EnterpriseServer "AddEnterpriseFolder", prmId, new SqlParameter("@ItemID", itemId), - new SqlParameter("@FolderName", folderName)); + new SqlParameter("@FolderName", folderName), + new SqlParameter("@LocationDrive", locationDrive), + new SqlParameter("@HomeFolder", homeFolder), + new SqlParameter("@Domain", domain) + ); // read identity return Convert.ToInt32(prmId.Value); @@ -4197,6 +4212,27 @@ namespace WebsitePanel.EnterpriseServer new SqlParameter("@FolderQuota", folderQuota)); } + public static IDataReader GetEnterpriseFolders(int itemId) + { + return SqlHelper.ExecuteReader( + ConnectionString, + CommandType.StoredProcedure, + "GetEnterpriseFolders", + new SqlParameter("@ItemID", itemId) + ); + } + + public static IDataReader GetEnterpriseFolder(int itemId, string folderName) + { + return SqlHelper.ExecuteReader( + ConnectionString, + CommandType.StoredProcedure, + "GetEnterpriseFolder", + new SqlParameter("@ItemID", itemId), + new SqlParameter("@FolderName", folderName) + ); + } + #endregion } } diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/EnterpriseStorage/EnterpriseStorageController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/EnterpriseStorage/EnterpriseStorageController.cs index bc333377..8d1ee486 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/EnterpriseStorage/EnterpriseStorageController.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/EnterpriseStorage/EnterpriseStorageController.cs @@ -87,12 +87,12 @@ namespace WebsitePanel.EnterpriseServer public static ResultObject CreateFolder(int itemId) { - return CreateFolder(itemId, string.Empty); + return CreateFolder(itemId, string.Empty, false); } - public static ResultObject CreateFolder(int itemId, string folderName) + public static ResultObject CreateFolder(int itemId, string folderName, bool addDefaultGroup) { - return CreateFolderInternal(itemId, folderName); + return CreateFolderInternal(itemId, folderName, addDefaultGroup); } public static ResultObject DeleteFolder(int itemId) @@ -354,7 +354,10 @@ namespace WebsitePanel.EnterpriseServer EnterpriseStorage es = GetEnterpriseStorage(serviceId); - return es.GetFolders(org.OrganizationId); + var webDavSettings = ObjectUtils.CreateListFromDataReader( + DataProvider.GetEnterpriseFolders(itemId)).ToArray(); + + return es.GetFolders(org.OrganizationId, webDavSettings); } catch (Exception ex) { @@ -375,7 +378,10 @@ namespace WebsitePanel.EnterpriseServer EnterpriseStorage es = GetEnterpriseStorage(GetEnterpriseStorageServiceID(org.PackageId)); - return es.GetFolder(org.OrganizationId, folderName); + var webDavSetting = ObjectUtils.FillObjectFromDataReader( + DataProvider.GetEnterpriseFolder(itemId, folderName)); + + return es.GetFolder(org.OrganizationId, folderName, webDavSetting); } catch (Exception ex) { @@ -396,9 +402,12 @@ namespace WebsitePanel.EnterpriseServer EnterpriseStorage es = GetEnterpriseStorage(GetEnterpriseStorageServiceID(org.PackageId)); - if (es.GetFolder(org.OrganizationId, newFolder) == null) + var webDavSetting = ObjectUtils.FillObjectFromDataReader( + DataProvider.GetEnterpriseFolder(itemId, oldFolder)); + + if (webDavSetting == null) { - SystemFile folder = es.RenameFolder(org.OrganizationId, oldFolder, newFolder); + SystemFile folder = es.RenameFolder(org.OrganizationId, oldFolder, newFolder, webDavSetting); DataProvider.UpdateEnterpriseFolder(itemId, oldFolder, newFolder, folder.FRSMQuotaGB); @@ -413,7 +422,7 @@ namespace WebsitePanel.EnterpriseServer } } - protected static ResultObject CreateFolderInternal(int itemId, string folderName) + protected static ResultObject CreateFolderInternal(int itemId, string folderName, bool addDefaultGroup) { ResultObject result = TaskManager.StartResultTask("ENTERPRISE_STORAGE", "CREATE_FOLDER"); @@ -430,11 +439,46 @@ namespace WebsitePanel.EnterpriseServer EnterpriseStorage es = GetEnterpriseStorage(GetEnterpriseStorageServiceID(org.PackageId)); - if (es.GetFolder(org.OrganizationId, folderName) == null) + var webDavSetting = ObjectUtils.FillObjectFromDataReader( + DataProvider.GetEnterpriseFolder(itemId, folderName)); + + if (webDavSetting == null) { + int esId = PackageController.GetPackageServiceId(org.PackageId, ResourceGroups.EnterpriseStorage); + + StringDictionary esSesstings = ServerController.GetServiceSettings(esId); + es.CreateFolder(org.OrganizationId, folderName); - DataProvider.AddEntepriseFolder(itemId, folderName); + DataProvider.AddEntepriseFolder(itemId, folderName, esSesstings["LocationDrive"], + esSesstings["UsersHome"], esSesstings["UsersDomain"]); + + if (addDefaultGroup) + { + var groupName = string.Format("{0} Folder Users", folderName); + + var accountId = ObjectUtils.CreateListFromDataReader( + DataProvider.GetOrganizationGroupsByDisplayName(itemId, groupName)).Select(g => g.AccountId).FirstOrDefault(); + + if (accountId == null) + { + accountId = OrganizationController.CreateSecurityGroup(itemId, groupName); + } + + var securityGroup = OrganizationController.GetSecurityGroupGeneralSettings(itemId, accountId); + + var rules = new List() { + new WebDavFolderRule + { + Roles = new List() { securityGroup.AccountName }, + Read = true, + Write = true, + Pathes = new List() { "*" } + } + }; + + es.SetFolderWebDavRules(org.OrganizationId, folderName, webDavSetting, rules.ToArray()); + } } else { @@ -519,7 +563,10 @@ namespace WebsitePanel.EnterpriseServer EnterpriseStorage es = GetEnterpriseStorage(GetEnterpriseStorageServiceID(org.PackageId)); - es.DeleteFolder(org.OrganizationId, folderName); + var webDavSetting = ObjectUtils.FillObjectFromDataReader( + DataProvider.GetEnterpriseFolder(itemId, folderName)); + + es.DeleteFolder(org.OrganizationId, folderName, webDavSetting); DataProvider.DeleteEnterpriseFolder(itemId, folderName); } @@ -595,7 +642,11 @@ namespace WebsitePanel.EnterpriseServer if (CheckUsersDomainExistsInternal(itemId, org.PackageId)) { EnterpriseStorage es = GetEnterpriseStorage(GetEnterpriseStorageServiceID(org.PackageId)); - List folders = es.GetFolders(org.OrganizationId).Where(x => x.Name.Contains(filterValue)).ToList(); + + var webDavSettings = ObjectUtils.CreateListFromDataReader( + DataProvider.GetEnterpriseFolders(itemId)).ToArray(); + + List folders = es.GetFolders(org.OrganizationId, webDavSettings).Where(x => x.Name.Contains(filterValue)).ToList(); switch (sortColumn) { @@ -720,7 +771,10 @@ namespace WebsitePanel.EnterpriseServer EnterpriseStorage es = GetEnterpriseStorage(GetEnterpriseStorageServiceID(org.PackageId)); - es.SetFolderWebDavRules(org.OrganizationId, folder, rules); + var webDavSetting = ObjectUtils.FillObjectFromDataReader( + DataProvider.GetEnterpriseFolder(itemId, folder)); + + es.SetFolderWebDavRules(org.OrganizationId, folder, webDavSetting, rules); } catch (Exception ex) { @@ -754,7 +808,10 @@ namespace WebsitePanel.EnterpriseServer EnterpriseStorage es = GetEnterpriseStorage(GetEnterpriseStorageServiceID(org.PackageId)); - return es.GetFolderWebDavRules(org.OrganizationId, folder); + var webDavSetting = ObjectUtils.FillObjectFromDataReader( + DataProvider.GetEnterpriseFolder(itemId, folder)); + + return es.GetFolderWebDavRules(org.OrganizationId, folder, webDavSetting); } catch (Exception ex) { diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esEnterpriseStorage.asmx.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esEnterpriseStorage.asmx.cs index bfa15387..eed5ba06 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esEnterpriseStorage.asmx.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esEnterpriseStorage.asmx.cs @@ -76,9 +76,9 @@ namespace WebsitePanel.EnterpriseServer } [WebMethod] - public ResultObject CreateEnterpriseFolder(int itemId, string folderName) + public ResultObject CreateEnterpriseFolder(int itemId, string folderName, bool addDefaultGroup) { - return EnterpriseStorageController.CreateFolder(itemId, folderName); + return EnterpriseStorageController.CreateFolder(itemId, folderName, addDefaultGroup); } [WebMethod] diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.Base/EnterpriseStorage/IEnterpriseStorage.cs b/WebsitePanel/Sources/WebsitePanel.Providers.Base/EnterpriseStorage/IEnterpriseStorage.cs index dbcc97cc..155120b4 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.Base/EnterpriseStorage/IEnterpriseStorage.cs +++ b/WebsitePanel/Sources/WebsitePanel.Providers.Base/EnterpriseStorage/IEnterpriseStorage.cs @@ -38,13 +38,13 @@ namespace WebsitePanel.Providers.EnterpriseStorage /// public interface IEnterpriseStorage { - SystemFile[] GetFolders(string organizationId); - SystemFile GetFolder(string organizationId, string folderName); + SystemFile[] GetFolders(string organizationId, WebDavSetting[] settings); + SystemFile GetFolder(string organizationId, string folderName, WebDavSetting setting); void CreateFolder(string organizationId, string folder); - SystemFile RenameFolder(string organizationId, string originalFolder, string newFolder); - void DeleteFolder(string organizationId, string folder); - bool SetFolderWebDavRules(string organizationId, string folder, WebDavFolderRule[] rules); - WebDavFolderRule[] GetFolderWebDavRules(string organizationId, string folder); + SystemFile RenameFolder(string organizationId, string originalFolder, string newFolder, WebDavSetting setting); + void DeleteFolder(string organizationId, string folder, WebDavSetting setting); + bool SetFolderWebDavRules(string organizationId, string folder, WebDavSetting setting, WebDavFolderRule[] rules); + WebDavFolderRule[] GetFolderWebDavRules(string organizationId, string folder, WebDavSetting setting); bool CheckFileServicesInstallation(); } diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.Base/Web/WebDavFolderRule.cs b/WebsitePanel/Sources/WebsitePanel.Providers.Base/Web/WebDavFolderRule.cs index 44815d80..f0cc3f4a 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.Base/Web/WebDavFolderRule.cs +++ b/WebsitePanel/Sources/WebsitePanel.Providers.Base/Web/WebDavFolderRule.cs @@ -6,7 +6,6 @@ using WebsitePanel.Providers.HostedSolution; namespace WebsitePanel.Providers.Web { - public enum WebDavAccess { Read = 1, diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.Base/Web/WebDavSetting.cs b/WebsitePanel/Sources/WebsitePanel.Providers.Base/Web/WebDavSetting.cs new file mode 100644 index 00000000..3a0688a7 --- /dev/null +++ b/WebsitePanel/Sources/WebsitePanel.Providers.Base/Web/WebDavSetting.cs @@ -0,0 +1,28 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace WebsitePanel.Providers.Web +{ + public class WebDavSetting + { + public string LocationDrive { get; set; } + public string HomeFolder { get; set; } + public string Domain { get; set; } + + public WebDavSetting() { } + + public WebDavSetting(string locationDrive, string homeFolder, string domain) + { + LocationDrive = locationDrive; + HomeFolder = homeFolder; + Domain = domain; + } + + public bool IsEmpty() + { + return string.IsNullOrEmpty(LocationDrive) && string.IsNullOrEmpty(HomeFolder) && string.IsNullOrEmpty(Domain); + } + } +} diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.Base/WebsitePanel.Providers.Base.csproj b/WebsitePanel/Sources/WebsitePanel.Providers.Base/WebsitePanel.Providers.Base.csproj index 76bc8c69..3e0c109c 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.Base/WebsitePanel.Providers.Base.csproj +++ b/WebsitePanel/Sources/WebsitePanel.Providers.Base/WebsitePanel.Providers.Base.csproj @@ -332,6 +332,7 @@ + diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.EnterpriseStorage.Windows2012/Windows2012.cs b/WebsitePanel/Sources/WebsitePanel.Providers.EnterpriseStorage.Windows2012/Windows2012.cs index 28896298..6914ed20 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.EnterpriseStorage.Windows2012/Windows2012.cs +++ b/WebsitePanel/Sources/WebsitePanel.Providers.EnterpriseStorage.Windows2012/Windows2012.cs @@ -62,55 +62,63 @@ namespace WebsitePanel.Providers.EnterpriseStorage #endregion #region Folders - public SystemFile[] GetFolders(string organizationId) + public SystemFile[] GetFolders(string organizationId, WebDavSetting[] settings) { ArrayList items = new ArrayList(); - string rootPath = string.Format("{0}:\\{1}\\{2}", LocationDrive, UsersHome, organizationId); - var windows = new WebsitePanel.Providers.OS.Windows2012(); + var webDavSettings = GetWebDavSettings(settings); - if (Directory.Exists(rootPath)) + foreach (var setting in webDavSettings) { - DirectoryInfo root = new DirectoryInfo(rootPath); - IWebDav webdav = new Web.WebDav(UsersDomain); + string rootPath = string.Format("{0}:\\{1}\\{2}", setting.LocationDrive, setting.HomeFolder, organizationId); - // get directories - DirectoryInfo[] dirs = root.GetDirectories(); - foreach (DirectoryInfo dir in dirs) + var windows = new WebsitePanel.Providers.OS.Windows2012(); + + if (Directory.Exists(rootPath)) { - string fullName = System.IO.Path.Combine(rootPath, dir.Name); + DirectoryInfo root = new DirectoryInfo(rootPath); + IWebDav webdav = new Web.WebDav(setting); - SystemFile folder = new SystemFile(); - - folder.Name = dir.Name; - folder.FullName = dir.FullName; - folder.IsDirectory = true; - - Quota quota = windows.GetQuotaOnFolder(fullName, string.Empty, string.Empty); - - folder.Size = quota.Usage; - - if (folder.Size == -1) + // get directories + DirectoryInfo[] dirs = root.GetDirectories(); + foreach (DirectoryInfo dir in dirs) { - folder.Size = FileUtils.BytesToMb(FileUtils.CalculateFolderSize(dir.FullName)); - } + string fullName = System.IO.Path.Combine(rootPath, dir.Name); - folder.Url = string.Format("https://{0}/{1}/{2}", UsersDomain, organizationId, dir.Name); - folder.Rules = webdav.GetFolderWebDavRules(organizationId, dir.Name); - folder.FRSMQuotaMB = quota.Size; - folder.FRSMQuotaGB = windows.ConvertMegaBytesToGB(folder.FRSMQuotaMB); - folder.FsrmQuotaType = quota.QuotaType; - - items.Add(folder); + SystemFile folder = new SystemFile(); + + folder.Name = dir.Name; + folder.FullName = dir.FullName; + folder.IsDirectory = true; + + Quota quota = windows.GetQuotaOnFolder(fullName, string.Empty, string.Empty); + + folder.Size = quota.Usage; + + if (folder.Size == -1) + { + folder.Size = FileUtils.BytesToMb(FileUtils.CalculateFolderSize(dir.FullName)); + } + + folder.Url = string.Format("https://{0}/{1}/{2}", setting.Domain, organizationId, dir.Name); + folder.Rules = webdav.GetFolderWebDavRules(organizationId, dir.Name); + folder.FRSMQuotaMB = quota.Size; + folder.FRSMQuotaGB = windows.ConvertMegaBytesToGB(folder.FRSMQuotaMB); + folder.FsrmQuotaType = quota.QuotaType; + + items.Add(folder); + } } } return (SystemFile[])items.ToArray(typeof(SystemFile)); } - public SystemFile GetFolder(string organizationId, string folderName) + public SystemFile GetFolder(string organizationId, string folderName, WebDavSetting setting) { - string fullName = string.Format("{0}:\\{1}\\{2}\\{3}", LocationDrive, UsersHome, organizationId, folderName); + var webDavSetting = GetWebDavSetting(setting); + + string fullName = string.Format("{0}:\\{1}\\{2}\\{3}", webDavSetting.LocationDrive, webDavSetting.HomeFolder, organizationId, folderName); SystemFile folder = null; var windows = new WebsitePanel.Providers.OS.Windows2012(); @@ -134,8 +142,8 @@ namespace WebsitePanel.Providers.EnterpriseStorage folder.Size = FileUtils.BytesToMb(FileUtils.CalculateFolderSize(root.FullName)); } - folder.Url = string.Format("https://{0}/{1}/{2}", UsersDomain, organizationId, folderName); - folder.Rules = GetFolderWebDavRules(organizationId, folderName); + folder.Url = string.Format("https://{0}/{1}/{2}", webDavSetting.Domain, organizationId, folderName); + folder.Rules = GetFolderWebDavRules(organizationId, folderName, webDavSetting); folder.FRSMQuotaMB = quota.Size; folder.FRSMQuotaGB = windows.ConvertMegaBytesToGB(folder.FRSMQuotaMB); folder.FsrmQuotaType = quota.QuotaType; @@ -149,24 +157,28 @@ namespace WebsitePanel.Providers.EnterpriseStorage FileUtils.CreateDirectory(string.Format("{0}:\\{1}\\{2}\\{3}", LocationDrive, UsersHome, organizationId, folder)); } - public SystemFile RenameFolder(string organizationId, string originalFolder, string newFolder) + public SystemFile RenameFolder(string organizationId, string originalFolder, string newFolder, WebDavSetting setting) { - var oldPath = string.Format("{0}:\\{1}\\{2}\\{3}", LocationDrive, UsersHome, organizationId, originalFolder); - var newPath = string.Format("{0}:\\{1}\\{2}\\{3}", LocationDrive, UsersHome, organizationId, newFolder); + 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); FileUtils.MoveFile(oldPath,newPath); - IWebDav webdav = new WebDav(UsersDomain); + IWebDav webdav = new WebDav(webDavSetting); //deleting old folder rules webdav.DeleteAllWebDavRules(organizationId, originalFolder); - return GetFolder(organizationId, newFolder); + return GetFolder(organizationId, newFolder, webDavSetting); } - public void DeleteFolder(string organizationId, string folder) + public void DeleteFolder(string organizationId, string folder, WebDavSetting setting) { - string rootPath = string.Format("{0}:\\{1}\\{2}\\{3}", LocationDrive, UsersHome, organizationId, folder); + var webDavSetting = GetWebDavSetting(setting); + + string rootPath = string.Format("{0}:\\{1}\\{2}\\{3}", webDavSetting.LocationDrive, webDavSetting.HomeFolder, organizationId, folder); DirectoryInfo treeRoot = new DirectoryInfo(rootPath); @@ -176,7 +188,7 @@ namespace WebsitePanel.Providers.EnterpriseStorage while (dirs.Length > 0) { foreach (DirectoryInfo dir in dirs) - DeleteFolder(organizationId, folder != string.Empty ? string.Format("{0}\\{1}", folder, dir.Name) : dir.Name); + DeleteFolder(organizationId, folder != string.Empty ? string.Format("{0}\\{1}", folder, dir.Name) : dir.Name, webDavSetting); dirs = treeRoot.GetDirectories(); } @@ -189,7 +201,7 @@ namespace WebsitePanel.Providers.EnterpriseStorage File.Delete(file); } - IWebDav webdav = new WebDav(UsersDomain); + IWebDav webdav = new WebDav(webDavSetting); webdav.DeleteAllWebDavRules(organizationId, folder); @@ -197,7 +209,7 @@ namespace WebsitePanel.Providers.EnterpriseStorage } } - public bool SetFolderWebDavRules(string organizationId, string folder, WebDavFolderRule[] rules) + public bool SetFolderWebDavRules(string organizationId, string folder, WebDavSetting setting, WebDavFolderRule[] rules) { var users = new List(); @@ -224,20 +236,24 @@ namespace WebsitePanel.Providers.EnterpriseStorage } } - string path = string.Format("{0}:\\{1}\\{2}\\{3}", LocationDrive, UsersHome, organizationId, folder); + var webDavSetting = GetWebDavSetting(setting); + + 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(UsersDomain); + IWebDav webdav = new WebDav(webDavSetting); return webdav.SetFolderWebDavRules(organizationId, folder, rules); } - public WebDavFolderRule[] GetFolderWebDavRules(string organizationId, string folder) + public WebDavFolderRule[] GetFolderWebDavRules(string organizationId, string folder, WebDavSetting setting) { - IWebDav webdav = new WebDav(UsersDomain); + var webDavSetting = GetWebDavSetting(setting); + + IWebDav webdav = new WebDav(webDavSetting); return webdav.GetFolderWebDavRules(organizationId, folder); } @@ -326,5 +342,34 @@ namespace WebsitePanel.Providers.EnterpriseStorage return version == WebsitePanel.Server.Utils.OS.WindowsVersion.WindowsServer2012; } + protected WebDavSetting GetWebDavSetting(WebDavSetting setting) + { + if (setting == null || setting.IsEmpty()) + { + return new WebDavSetting(LocationDrive, UsersHome, UsersDomain); + } + + return setting; + } + + protected WebDavSetting[] GetWebDavSettings(WebDavSetting[] settings) + { + var webDavSettings = new ArrayList(); + + foreach (var setting in settings) + { + if (!setting.IsEmpty()) + { + webDavSettings.Add(setting); + } + } + + if (webDavSettings.Count == 0) + { + return new WebDavSetting[] { GetWebDavSetting(new WebDavSetting()) }; + } + + return settings; + } } } diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.Web.WebDav/WebDav.cs b/WebsitePanel/Sources/WebsitePanel.Providers.Web.WebDav/WebDav.cs index 1ec41b3d..48b947de 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.Web.WebDav/WebDav.cs +++ b/WebsitePanel/Sources/WebsitePanel.Providers.Web.WebDav/WebDav.cs @@ -13,13 +13,13 @@ namespace WebsitePanel.Providers.Web { #region Fields - private string _usersDomain; + protected WebDavSetting _Setting; #endregion - public WebDav(string domain) + public WebDav(WebDavSetting setting) { - _usersDomain = domain; + _Setting = setting; } public void CreateWebDavRule(string organizationId, string folder, WebDavFolderRule rule) @@ -28,7 +28,7 @@ namespace WebsitePanel.Providers.Web { Configuration config = serverManager.GetApplicationHostConfiguration(); - ConfigurationSection authoringRulesSection = config.GetSection("system.webServer/webdav/authoringRules", string.Format("{0}/{1}/{2}", _usersDomain, organizationId, folder)); + ConfigurationSection authoringRulesSection = config.GetSection("system.webServer/webdav/authoringRules", string.Format("{0}/{1}/{2}", _Setting.Domain, organizationId, folder)); ConfigurationElementCollection authoringRulesCollection = authoringRulesSection.GetCollection(); @@ -61,7 +61,7 @@ namespace WebsitePanel.Providers.Web { Configuration config = serverManager.GetApplicationHostConfiguration(); - ConfigurationSection authoringRulesSection = config.GetSection("system.webServer/webdav/authoringRules", string.Format("{0}/{1}/{2}", _usersDomain, organizationId, folder)); + ConfigurationSection authoringRulesSection = config.GetSection("system.webServer/webdav/authoringRules", string.Format("{0}/{1}/{2}", _Setting.Domain, organizationId, folder)); ConfigurationElementCollection authoringRulesCollection = authoringRulesSection.GetCollection(); @@ -107,7 +107,7 @@ namespace WebsitePanel.Providers.Web { Configuration config = serverManager.GetApplicationHostConfiguration(); - ConfigurationSection authoringRulesSection = config.GetSection("system.webServer/webdav/authoringRules", string.Format("{0}/{1}/{2}", _usersDomain, organizationId, folder)); + ConfigurationSection authoringRulesSection = config.GetSection("system.webServer/webdav/authoringRules", string.Format("{0}/{1}/{2}", _Setting.Domain, organizationId, folder)); ConfigurationElementCollection authoringRulesCollection = authoringRulesSection.GetCollection(); @@ -133,7 +133,7 @@ namespace WebsitePanel.Providers.Web Configuration config = serverManager.GetApplicationHostConfiguration(); - config.RemoveLocationPath(string.Format("{0}/{1}/{2}", _usersDomain, organizationId, folder)); + config.RemoveLocationPath(string.Format("{0}/{1}/{2}", _Setting.Domain, organizationId, folder)); serverManager.CommitChanges(); return true; } diff --git a/WebsitePanel/Sources/WebsitePanel.Server.Client/EnterpriseStorageProxy.cs b/WebsitePanel/Sources/WebsitePanel.Server.Client/EnterpriseStorageProxy.cs index 81bed424..063f7e10 100644 --- a/WebsitePanel/Sources/WebsitePanel.Server.Client/EnterpriseStorageProxy.cs +++ b/WebsitePanel/Sources/WebsitePanel.Server.Client/EnterpriseStorageProxy.cs @@ -112,18 +112,20 @@ namespace WebsitePanel.Providers.EnterpriseStorage /// [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) + public SystemFile[] GetFolders(string organizationId, WebDavSetting[] settings) { object[] results = this.Invoke("GetFolders", new object[] { - organizationId}); + organizationId, + settings}); return ((SystemFile[])(results[0])); } /// - public System.IAsyncResult BeginGetFolders(string organizationId, 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}, callback, asyncState); + organizationId, + settings}, callback, asyncState); } /// @@ -134,20 +136,21 @@ namespace WebsitePanel.Providers.EnterpriseStorage } /// - public void GetFoldersAsync(string organizationId) + public void GetFoldersAsync(string organizationId, WebDavSetting[] settings) { - this.GetFoldersAsync(organizationId, null); + this.GetFoldersAsync(organizationId, settings, null); } /// - public void GetFoldersAsync(string organizationId, object userState) + 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}, this.GetFoldersOperationCompleted, userState); + organizationId, + settings}, this.GetFoldersOperationCompleted, userState); } private void OnGetFoldersOperationCompleted(object arg) @@ -162,20 +165,22 @@ namespace WebsitePanel.Providers.EnterpriseStorage /// [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) + public SystemFile GetFolder(string organizationId, string folder, WebDavSetting setting) { object[] results = this.Invoke("GetFolder", new object[] { organizationId, - folder}); + folder, + setting}); return ((SystemFile)(results[0])); } /// - public System.IAsyncResult BeginGetFolder(string organizationId, string folder, 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}, callback, asyncState); + folder, + setting}, callback, asyncState); } /// @@ -186,13 +191,13 @@ namespace WebsitePanel.Providers.EnterpriseStorage } /// - public void GetFolderAsync(string organizationId, string folder) + public void GetFolderAsync(string organizationId, string folder, WebDavSetting setting) { - this.GetFolderAsync(organizationId, folder, null); + this.GetFolderAsync(organizationId, folder, setting, null); } /// - public void GetFolderAsync(string organizationId, string folder, object userState) + public void GetFolderAsync(string organizationId, string folder, WebDavSetting setting, object userState) { if ((this.GetFolderOperationCompleted == null)) { @@ -200,7 +205,8 @@ namespace WebsitePanel.Providers.EnterpriseStorage } this.InvokeAsync("GetFolder", new object[] { organizationId, - folder}, this.GetFolderOperationCompleted, userState); + folder, + setting}, this.GetFolderOperationCompleted, userState); } private void OnGetFolderOperationCompleted(object arg) @@ -266,19 +272,21 @@ namespace WebsitePanel.Providers.EnterpriseStorage /// [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) + public void DeleteFolder(string organizationId, string folder, WebDavSetting setting) { this.Invoke("DeleteFolder", new object[] { organizationId, - folder}); + folder, + setting}); } /// - public System.IAsyncResult BeginDeleteFolder(string organizationId, string folder, 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}, callback, asyncState); + folder, + setting}, callback, asyncState); } /// @@ -288,13 +296,13 @@ namespace WebsitePanel.Providers.EnterpriseStorage } /// - public void DeleteFolderAsync(string organizationId, string folder) + public void DeleteFolderAsync(string organizationId, string folder, WebDavSetting setting) { - this.DeleteFolderAsync(organizationId, folder, null); + this.DeleteFolderAsync(organizationId, folder, setting, null); } /// - public void DeleteFolderAsync(string organizationId, string folder, object userState) + public void DeleteFolderAsync(string organizationId, string folder, WebDavSetting setting, object userState) { if ((this.DeleteFolderOperationCompleted == null)) { @@ -302,7 +310,8 @@ namespace WebsitePanel.Providers.EnterpriseStorage } this.InvokeAsync("DeleteFolder", new object[] { organizationId, - folder}, this.DeleteFolderOperationCompleted, userState); + folder, + setting}, this.DeleteFolderOperationCompleted, userState); } private void OnDeleteFolderOperationCompleted(object arg) @@ -317,21 +326,23 @@ namespace WebsitePanel.Providers.EnterpriseStorage /// [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, WebDavFolderRule[] rules) + public bool SetFolderWebDavRules(string organizationId, string folder, WebDavSetting setting, WebDavFolderRule[] rules) { object[] results = this.Invoke("SetFolderWebDavRules", new object[] { organizationId, folder, + setting, rules}); return ((bool)(results[0])); } /// - public System.IAsyncResult BeginSetFolderWebDavRules(string organizationId, string folder, 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); } @@ -343,13 +354,13 @@ namespace WebsitePanel.Providers.EnterpriseStorage } /// - public void SetFolderWebDavRulesAsync(string organizationId, string folder, WebDavFolderRule[] rules) + public void SetFolderWebDavRulesAsync(string organizationId, string folder, WebDavSetting setting, WebDavFolderRule[] rules) { - this.SetFolderWebDavRulesAsync(organizationId, folder, rules, null); + this.SetFolderWebDavRulesAsync(organizationId, folder, setting, rules, null); } /// - public void SetFolderWebDavRulesAsync(string organizationId, string folder, WebDavFolderRule[] rules, object userState) + public void SetFolderWebDavRulesAsync(string organizationId, string folder, WebDavSetting setting, WebDavFolderRule[] rules, object userState) { if ((this.SetFolderWebDavRulesOperationCompleted == null)) { @@ -358,6 +369,7 @@ namespace WebsitePanel.Providers.EnterpriseStorage this.InvokeAsync("SetFolderWebDavRules", new object[] { organizationId, folder, + setting, rules}, this.SetFolderWebDavRulesOperationCompleted, userState); } @@ -373,20 +385,22 @@ namespace WebsitePanel.Providers.EnterpriseStorage /// [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) + public WebDavFolderRule[] GetFolderWebDavRules(string organizationId, string folder, WebDavSetting setting) { object[] results = this.Invoke("GetFolderWebDavRules", new object[] { organizationId, - folder}); + folder, + setting}); return ((WebDavFolderRule[])(results[0])); } /// - public System.IAsyncResult BeginGetFolderWebDavRules(string organizationId, string folder, 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}, callback, asyncState); + folder, + setting}, callback, asyncState); } /// @@ -397,13 +411,13 @@ namespace WebsitePanel.Providers.EnterpriseStorage } /// - public void GetFolderWebDavRulesAsync(string organizationId, string folder) + public void GetFolderWebDavRulesAsync(string organizationId, string folder, WebDavSetting setting) { - this.GetFolderWebDavRulesAsync(organizationId, folder, null); + this.GetFolderWebDavRulesAsync(organizationId, folder, setting, null); } /// - public void GetFolderWebDavRulesAsync(string organizationId, string folder, object userState) + public void GetFolderWebDavRulesAsync(string organizationId, string folder, WebDavSetting setting, object userState) { if ((this.GetFolderWebDavRulesOperationCompleted == null)) { @@ -411,7 +425,8 @@ namespace WebsitePanel.Providers.EnterpriseStorage } this.InvokeAsync("GetFolderWebDavRules", new object[] { organizationId, - folder}, this.GetFolderWebDavRulesOperationCompleted, userState); + folder, + setting}, this.GetFolderWebDavRulesOperationCompleted, userState); } private void OnGetFolderWebDavRulesOperationCompleted(object arg) @@ -473,22 +488,24 @@ namespace WebsitePanel.Providers.EnterpriseStorage /// [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) + public SystemFile RenameFolder(string organizationId, string originalFolder, string newFolder, WebDavSetting setting) { object[] results = this.Invoke("RenameFolder", new object[] { organizationId, originalFolder, - newFolder}); + newFolder, + setting}); return ((SystemFile)(results[0])); } /// - public System.IAsyncResult BeginRenameFolder(string organizationId, string originalFolder, string newFolder, 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}, callback, asyncState); + newFolder, + setting}, callback, asyncState); } /// @@ -499,13 +516,13 @@ namespace WebsitePanel.Providers.EnterpriseStorage } /// - public void RenameFolderAsync(string organizationId, string originalFolder, string newFolder) + public void RenameFolderAsync(string organizationId, string originalFolder, string newFolder, WebDavSetting setting) { - this.RenameFolderAsync(organizationId, originalFolder, newFolder, null); + this.RenameFolderAsync(organizationId, originalFolder, newFolder, setting, null); } /// - public void RenameFolderAsync(string organizationId, string originalFolder, string newFolder, object userState) + public void RenameFolderAsync(string organizationId, string originalFolder, string newFolder, WebDavSetting setting, object userState) { if ((this.RenameFolderOperationCompleted == null)) { @@ -514,7 +531,8 @@ namespace WebsitePanel.Providers.EnterpriseStorage this.InvokeAsync("RenameFolder", new object[] { organizationId, originalFolder, - newFolder}, this.RenameFolderOperationCompleted, userState); + newFolder, + setting}, this.RenameFolderOperationCompleted, userState); } private void OnRenameFolderOperationCompleted(object arg) diff --git a/WebsitePanel/Sources/WebsitePanel.Server/EnterpriseStorage.asmx.cs b/WebsitePanel/Sources/WebsitePanel.Server/EnterpriseStorage.asmx.cs index 002a4c98..5acdecd7 100644 --- a/WebsitePanel/Sources/WebsitePanel.Server/EnterpriseStorage.asmx.cs +++ b/WebsitePanel/Sources/WebsitePanel.Server/EnterpriseStorage.asmx.cs @@ -39,6 +39,7 @@ using WebsitePanel.Providers; using WebsitePanel.Providers.EnterpriseStorage; using WebsitePanel.Providers.OS; using WebsitePanel.Server.Utils; +using WebsitePanel.Providers.Web; namespace WebsitePanel.Server { @@ -58,12 +59,12 @@ namespace WebsitePanel.Server [WebMethod, SoapHeader("settings")] - public SystemFile[] GetFolders(string organizationId) + public SystemFile[] GetFolders(string organizationId, WebDavSetting[] settings) { try { Log.WriteStart("'{0}' GetFolders", ProviderSettings.ProviderName); - SystemFile[] result = EnterpriseStorageProvider.GetFolders(organizationId); + SystemFile[] result = EnterpriseStorageProvider.GetFolders(organizationId, settings); Log.WriteEnd("'{0}' GetFolders", ProviderSettings.ProviderName); return result; } @@ -75,12 +76,12 @@ namespace WebsitePanel.Server } [WebMethod, SoapHeader("settings")] - public SystemFile GetFolder(string organizationId, string folder) + public SystemFile GetFolder(string organizationId, string folder, WebDavSetting setting) { try { Log.WriteStart("'{0}' GetFolder", ProviderSettings.ProviderName); - SystemFile result = EnterpriseStorageProvider.GetFolder(organizationId, folder); + SystemFile result = EnterpriseStorageProvider.GetFolder(organizationId, folder, setting); Log.WriteEnd("'{0}' GetFolder", ProviderSettings.ProviderName); return result; } @@ -108,12 +109,12 @@ namespace WebsitePanel.Server } [WebMethod, SoapHeader("settings")] - public void DeleteFolder(string organizationId, string folder) + public void DeleteFolder(string organizationId, string folder, WebDavSetting setting) { try { Log.WriteStart("'{0}' DeleteFolder", ProviderSettings.ProviderName); - EnterpriseStorageProvider.DeleteFolder(organizationId, folder); + EnterpriseStorageProvider.DeleteFolder(organizationId, folder, setting); Log.WriteEnd("'{0}' DeleteFolder", ProviderSettings.ProviderName); } catch (Exception ex) @@ -124,12 +125,12 @@ namespace WebsitePanel.Server } [WebMethod, SoapHeader("settings")] - public bool SetFolderWebDavRules(string organizationId, string folder, Providers.Web.WebDavFolderRule[] rules) + public bool SetFolderWebDavRules(string organizationId, string folder, WebDavSetting setting, Providers.Web.WebDavFolderRule[] rules) { try { Log.WriteStart("'{0}' SetFolderWebDavRules", ProviderSettings.ProviderName); - return EnterpriseStorageProvider.SetFolderWebDavRules(organizationId, folder, rules); + return EnterpriseStorageProvider.SetFolderWebDavRules(organizationId, folder, setting, rules); Log.WriteEnd("'{0}' SetFolderWebDavRules", ProviderSettings.ProviderName); } catch (Exception ex) @@ -140,12 +141,12 @@ namespace WebsitePanel.Server } [WebMethod, SoapHeader("settings")] - public Providers.Web.WebDavFolderRule[] GetFolderWebDavRules(string organizationId, string folder) + public Providers.Web.WebDavFolderRule[] GetFolderWebDavRules(string organizationId, string folder, WebDavSetting setting) { try { Log.WriteStart("'{0}' GetFolderWebDavRules", ProviderSettings.ProviderName); - return EnterpriseStorageProvider.GetFolderWebDavRules(organizationId, folder); + return EnterpriseStorageProvider.GetFolderWebDavRules(organizationId, folder, setting); Log.WriteEnd("'{0}' GetFolderWebDavRules", ProviderSettings.ProviderName); } catch (Exception ex) @@ -172,12 +173,12 @@ namespace WebsitePanel.Server } [WebMethod, SoapHeader("settings")] - public SystemFile RenameFolder(string organizationId, string originalFolder, string newFolder) + public SystemFile RenameFolder(string organizationId, string originalFolder, string newFolder, WebDavSetting setting) { try { Log.WriteStart("'{0}' RenameFolder", ProviderSettings.ProviderName); - return EnterpriseStorageProvider.RenameFolder(organizationId, originalFolder, newFolder); + return EnterpriseStorageProvider.RenameFolder(organizationId, originalFolder, newFolder, setting); Log.WriteEnd("'{0}' RenameFolder", ProviderSettings.ProviderName); } catch (Exception ex) diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/EnterpriseStorageCreateFolder.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/EnterpriseStorageCreateFolder.ascx.resx index 82a41d20..a36ab7a7 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/EnterpriseStorageCreateFolder.ascx.resx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/EnterpriseStorageCreateFolder.ascx.resx @@ -141,4 +141,7 @@ Create New Folder + + Add Default Group + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/EnterpriseStorageCreateFolder.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/EnterpriseStorageCreateFolder.ascx index 396fa46e..26a80b92 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/EnterpriseStorageCreateFolder.ascx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/EnterpriseStorageCreateFolder.ascx @@ -32,6 +32,13 @@ ErrorMessage="Enter Folder Name" ValidationGroup="CreateFolder" Display="Dynamic" Text="*" SetFocusOnError="True"> + + + + + + +
diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/EnterpriseStorageCreateFolder.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/EnterpriseStorageCreateFolder.ascx.cs index 1d369fa8..0f4eb61e 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/EnterpriseStorageCreateFolder.ascx.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/EnterpriseStorageCreateFolder.ascx.cs @@ -69,7 +69,7 @@ namespace WebsitePanel.Portal.ExchangeServer ES.Services.EnterpriseStorage.CreateEnterpriseStorage(PanelSecurity.PackageId, PanelRequest.ItemID); } - ResultObject result = ES.Services.EnterpriseStorage.CreateEnterpriseFolder(PanelRequest.ItemID, txtFolderName.Text); + ResultObject result = ES.Services.EnterpriseStorage.CreateEnterpriseFolder(PanelRequest.ItemID, txtFolderName.Text, chkAddDefaultGroup.Checked); if (!result.IsSuccess && result.ErrorCodes.Count > 0) { diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/EnterpriseStorageCreateFolder.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/EnterpriseStorageCreateFolder.ascx.designer.cs index dc641ab6..2c020b89 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/EnterpriseStorageCreateFolder.ascx.designer.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/EnterpriseStorageCreateFolder.ascx.designer.cs @@ -1,31 +1,3 @@ -// Copyright (c) 2012, Outercurve Foundation. -// All rights reserved. -// -// 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. - //------------------------------------------------------------------------------ // // This code was generated by a tool. @@ -121,6 +93,24 @@ namespace WebsitePanel.Portal.ExchangeServer { /// protected global::System.Web.UI.WebControls.RequiredFieldValidator valRequireFolderName; + /// + /// locAddDefaultGroup control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locAddDefaultGroup; + + /// + /// chkAddDefaultGroup control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.CheckBox chkAddDefaultGroup; + /// /// btnCreate control. /// From 878d9186aacebbba44ac9a53bdeaacb4e07823b8 Mon Sep 17 00:00:00 2001 From: Virtuworks Date: Wed, 12 Feb 2014 16:37:25 -0500 Subject: [PATCH 02/25] Merge --- .../Web/WebDavSetting.cs | 30 ++++++++++++++++++- ...rpriseStorageCreateFolder.ascx.designer.cs | 29 ++++++++++++++++++ 2 files changed, 58 insertions(+), 1 deletion(-) diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.Base/Web/WebDavSetting.cs b/WebsitePanel/Sources/WebsitePanel.Providers.Base/Web/WebDavSetting.cs index 3a0688a7..c96007ee 100644 --- a/WebsitePanel/Sources/WebsitePanel.Providers.Base/Web/WebDavSetting.cs +++ b/WebsitePanel/Sources/WebsitePanel.Providers.Base/Web/WebDavSetting.cs @@ -1,4 +1,32 @@ -using System; +// Copyright (c) 2012, Outercurve Foundation. +// All rights reserved. +// +// 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. + +using System; using System.Collections.Generic; using System.Linq; using System.Text; diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/EnterpriseStorageCreateFolder.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/EnterpriseStorageCreateFolder.ascx.designer.cs index 2c020b89..e680a0c1 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/EnterpriseStorageCreateFolder.ascx.designer.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/EnterpriseStorageCreateFolder.ascx.designer.cs @@ -1,3 +1,32 @@ +// Copyright (c) 2012, Outercurve Foundation. +// All rights reserved. +// +// 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. + + //------------------------------------------------------------------------------ // // This code was generated by a tool. From d98cf3a90606523d8d7ffa99dc5c5c2fd291a901 Mon Sep 17 00:00:00 2001 From: Virtuworks Date: Wed, 12 Feb 2014 16:47:24 -0500 Subject: [PATCH 03/25] Added tag build-2.1.0.279 for changeset b8ef35df34b4 From 524c0f1a9ee7c49a03fae1ac134d8f35811dd82b Mon Sep 17 00:00:00 2001 From: vfedosevich Date: Thu, 13 Feb 2014 19:07:54 +0300 Subject: [PATCH 04/25] add folder quota --- WebsitePanel/Database/update_db.sql | 40 ++++++++++++ .../EnterpriseStorageProxy.cs | 16 +++-- .../Data/DataProvider.cs | 3 +- .../EnterpriseStorageController.cs | 31 +++++---- .../esEnterpriseStorage.asmx.cs | 4 +- .../EnterpriseStorageCreateFolder.ascx.resx | 21 +++++++ .../EnterpriseStorageCreateFolder.ascx | 18 ++++++ .../EnterpriseStorageCreateFolder.ascx.cs | 25 +++++++- ...rpriseStorageCreateFolder.ascx.designer.cs | 63 +++++++++++++++++++ 9 files changed, 200 insertions(+), 21 deletions(-) diff --git a/WebsitePanel/Database/update_db.sql b/WebsitePanel/Database/update_db.sql index ed0eb6d3..520a5841 100644 --- a/WebsitePanel/Database/update_db.sql +++ b/WebsitePanel/Database/update_db.sql @@ -3163,5 +3163,45 @@ FROM ExchangeAccounts WHERE ItemID = @ItemID AND DisplayName = @DisplayName AND (AccountType IN (8, 9)) +RETURN +GO + +IF EXISTS (SELECT * FROM SYS.OBJECTS WHERE type = 'P' AND name = 'AddEnterpriseFolder') +DROP PROCEDURE [dbo].[AddEnterpriseFolder] +GO + +CREATE PROCEDURE [dbo].[AddEnterpriseFolder] +( + @FolderID INT OUTPUT, + @ItemID INT, + @FolderName NVARCHAR(255), + @FolderQuota INT, + @LocationDrive NVARCHAR(255), + @HomeFolder NVARCHAR(255), + @Domain NVARCHAR(255) +) +AS + +INSERT INTO EnterpriseFolders +( + ItemID, + FolderName, + FolderQuota, + LocationDrive, + HomeFolder, + Domain +) +VALUES +( + @ItemID, + @FolderName, + @FolderQuota, + @LocationDrive, + @HomeFolder, + @Domain +) + +SET @FolderID = SCOPE_IDENTITY() + RETURN GO \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/EnterpriseStorageProxy.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/EnterpriseStorageProxy.cs index 113e48d2..b08a2233 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/EnterpriseStorageProxy.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/EnterpriseStorageProxy.cs @@ -304,21 +304,25 @@ namespace WebsitePanel.EnterpriseServer /// [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/CreateEnterpriseFolder", 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 ResultObject CreateEnterpriseFolder(int itemId, string folderName, bool addDefaultGroup) + public ResultObject CreateEnterpriseFolder(int itemId, string folderName, int quota, QuotaType quotaType, bool addDefaultGroup) { object[] results = this.Invoke("CreateEnterpriseFolder", new object[] { itemId, folderName, + quota, + quotaType, addDefaultGroup}); return ((ResultObject)(results[0])); } /// - public System.IAsyncResult BeginCreateEnterpriseFolder(int itemId, string folderName, bool addDefaultGroup, System.AsyncCallback callback, object asyncState) + public System.IAsyncResult BeginCreateEnterpriseFolder(int itemId, string folderName, int quota, QuotaType quotaType, bool addDefaultGroup, System.AsyncCallback callback, object asyncState) { return this.BeginInvoke("CreateEnterpriseFolder", new object[] { itemId, folderName, + quota, + quotaType, addDefaultGroup}, callback, asyncState); } @@ -330,13 +334,13 @@ namespace WebsitePanel.EnterpriseServer } /// - public void CreateEnterpriseFolderAsync(int itemId, string folderName, bool addDefaultGroup) + public void CreateEnterpriseFolderAsync(int itemId, string folderName, int quota, QuotaType quotaType, bool addDefaultGroup) { - this.CreateEnterpriseFolderAsync(itemId, folderName, addDefaultGroup, null); + this.CreateEnterpriseFolderAsync(itemId, folderName, quota, quotaType, addDefaultGroup, null); } /// - public void CreateEnterpriseFolderAsync(int itemId, string folderName, bool addDefaultGroup, object userState) + public void CreateEnterpriseFolderAsync(int itemId, string folderName, int quota, QuotaType quotaType, bool addDefaultGroup, object userState) { if ((this.CreateEnterpriseFolderOperationCompleted == null)) { @@ -345,6 +349,8 @@ namespace WebsitePanel.EnterpriseServer this.InvokeAsync("CreateEnterpriseFolder", new object[] { itemId, folderName, + quota, + quotaType, addDefaultGroup}, this.CreateEnterpriseFolderOperationCompleted, userState); } diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Data/DataProvider.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Data/DataProvider.cs index b6e7a97a..110a1fdf 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Data/DataProvider.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Data/DataProvider.cs @@ -4169,7 +4169,7 @@ namespace WebsitePanel.EnterpriseServer #region Enterprise Storage - public static int AddEntepriseFolder(int itemId, string folderName, string locationDrive, string homeFolder, string domain) + public static int AddEntepriseFolder(int itemId, string folderName, int folderQuota, string locationDrive, string homeFolder, string domain) { SqlParameter prmId = new SqlParameter("@FolderID", SqlDbType.Int); prmId.Direction = ParameterDirection.Output; @@ -4181,6 +4181,7 @@ namespace WebsitePanel.EnterpriseServer prmId, new SqlParameter("@ItemID", itemId), new SqlParameter("@FolderName", folderName), + new SqlParameter("@FolderQuota", folderQuota), new SqlParameter("@LocationDrive", locationDrive), new SqlParameter("@HomeFolder", homeFolder), new SqlParameter("@Domain", domain) diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/EnterpriseStorage/EnterpriseStorageController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/EnterpriseStorage/EnterpriseStorageController.cs index 8d1ee486..349d1257 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/EnterpriseStorage/EnterpriseStorageController.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/EnterpriseStorage/EnterpriseStorageController.cs @@ -87,12 +87,12 @@ namespace WebsitePanel.EnterpriseServer public static ResultObject CreateFolder(int itemId) { - return CreateFolder(itemId, string.Empty, false); + return CreateFolder(itemId, string.Empty, 0, QuotaType.Soft, false); } - public static ResultObject CreateFolder(int itemId, string folderName, bool addDefaultGroup) + public static ResultObject CreateFolder(int itemId, string folderName, int quota, QuotaType quotaType, bool addDefaultGroup) { - return CreateFolderInternal(itemId, folderName, addDefaultGroup); + return CreateFolderInternal(itemId, folderName, quota, quotaType, addDefaultGroup); } public static ResultObject DeleteFolder(int itemId) @@ -422,7 +422,7 @@ namespace WebsitePanel.EnterpriseServer } } - protected static ResultObject CreateFolderInternal(int itemId, string folderName, bool addDefaultGroup) + protected static ResultObject CreateFolderInternal(int itemId, string folderName, int quota, QuotaType quotaType, bool addDefaultGroup) { ResultObject result = TaskManager.StartResultTask("ENTERPRISE_STORAGE", "CREATE_FOLDER"); @@ -450,20 +450,22 @@ namespace WebsitePanel.EnterpriseServer es.CreateFolder(org.OrganizationId, folderName); - DataProvider.AddEntepriseFolder(itemId, folderName, esSesstings["LocationDrive"], + SetFolderQuota(org.PackageId, org.OrganizationId, folderName, quota, quotaType); + + DataProvider.AddEntepriseFolder(itemId, folderName, quota, esSesstings["LocationDrive"], esSesstings["UsersHome"], esSesstings["UsersDomain"]); if (addDefaultGroup) { var groupName = string.Format("{0} Folder Users", folderName); - var accountId = ObjectUtils.CreateListFromDataReader( - DataProvider.GetOrganizationGroupsByDisplayName(itemId, groupName)).Select(g => g.AccountId).FirstOrDefault(); + var account = ObjectUtils.CreateListFromDataReader( + DataProvider.GetOrganizationGroupsByDisplayName(itemId, groupName)).FirstOrDefault(); + + var accountId = account == null + ? OrganizationController.CreateSecurityGroup(itemId, groupName) + : account.AccountId; - if (accountId == null) - { - accountId = OrganizationController.CreateSecurityGroup(itemId, groupName); - } var securityGroup = OrganizationController.GetSecurityGroupGeneralSettings(itemId, accountId); @@ -473,6 +475,7 @@ namespace WebsitePanel.EnterpriseServer Roles = new List() { securityGroup.AccountName }, Read = true, Write = true, + Source = true, Pathes = new List() { "*" } } }; @@ -888,7 +891,6 @@ namespace WebsitePanel.EnterpriseServer if (permission.Access.ToLower().Contains("read-only")) { rule.Read = true; - rule.Source = true; } if (permission.Access.ToLower().Contains("read-write")) @@ -897,6 +899,8 @@ namespace WebsitePanel.EnterpriseServer rule.Read = true; } + rule.Source = true; + rule.Pathes.Add("*"); rules.Add(rule); @@ -960,6 +964,9 @@ namespace WebsitePanel.EnterpriseServer private static void SetFolderQuota(int packageId, string orgId, string folderName, int quotaSize, QuotaType quotaType) { + if (quotaSize == 0) + return; + int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); if (accountCheck < 0) return; diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esEnterpriseStorage.asmx.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esEnterpriseStorage.asmx.cs index eed5ba06..3af2cd32 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esEnterpriseStorage.asmx.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esEnterpriseStorage.asmx.cs @@ -76,9 +76,9 @@ namespace WebsitePanel.EnterpriseServer } [WebMethod] - public ResultObject CreateEnterpriseFolder(int itemId, string folderName, bool addDefaultGroup) + public ResultObject CreateEnterpriseFolder(int itemId, string folderName, int quota, QuotaType quotaType, bool addDefaultGroup) { - return EnterpriseStorageController.CreateFolder(itemId, folderName, addDefaultGroup); + return EnterpriseStorageController.CreateFolder(itemId, folderName, quota, quotaType, addDefaultGroup); } [WebMethod] diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/EnterpriseStorageCreateFolder.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/EnterpriseStorageCreateFolder.ascx.resx index a36ab7a7..4e4c8df5 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/EnterpriseStorageCreateFolder.ascx.resx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/EnterpriseStorageCreateFolder.ascx.resx @@ -144,4 +144,25 @@ Add Default Group + + Folder Limit Size (Gb): + + + Quota Type: + + + * + + + Hard + + + Soft + + + valRequireFolderSize + + + Enter Folder Size + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/EnterpriseStorageCreateFolder.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/EnterpriseStorageCreateFolder.ascx index 26a80b92..e853f47b 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/EnterpriseStorageCreateFolder.ascx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/EnterpriseStorageCreateFolder.ascx @@ -33,6 +33,24 @@ + + + + + + + + + + + + + + + diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/EnterpriseStorageCreateFolder.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/EnterpriseStorageCreateFolder.ascx.cs index 0f4eb61e..4080c20f 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/EnterpriseStorageCreateFolder.ascx.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/EnterpriseStorageCreateFolder.ascx.cs @@ -30,11 +30,18 @@ using System; using WebsitePanel.EnterpriseServer; using WebsitePanel.Providers.Common; using WebsitePanel.Providers.HostedSolution; +using WebsitePanel.Providers.OS; namespace WebsitePanel.Portal.ExchangeServer { public partial class EnterpriseStorageCreateFolder : WebsitePanelModuleBase { + #region Constants + + private const int OneGb = 1024; + + #endregion + protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) @@ -44,6 +51,17 @@ namespace WebsitePanel.Portal.ExchangeServer Response.Redirect(EditUrl("SpaceID", PanelSecurity.PackageId.ToString(), "enterprisestorage_folders", "ItemID=" + PanelRequest.ItemID)); } + + OrganizationStatistics organizationStats = ES.Services.Organizations.GetOrganizationStatisticsByOrganization(PanelRequest.ItemID); + + if (organizationStats.AllocatedEnterpriseStorageSpace != -1) + { + OrganizationStatistics tenantStats = ES.Services.Organizations.GetOrganizationStatistics(PanelRequest.ItemID); + + rangeFolderSize.MaximumValue = Math.Round((tenantStats.AllocatedEnterpriseStorageSpace - (decimal)tenantStats.UsedEnterpriseStorageSpace) / OneGb + + Utils.ParseDecimal(txtFolderSize.Text, 0), 2).ToString(); + rangeFolderSize.ErrorMessage = string.Format("The quota you’ve entered exceeds the available quota for tenant ({0}Gb)", rangeFolderSize.MaximumValue); + } } } @@ -69,7 +87,12 @@ namespace WebsitePanel.Portal.ExchangeServer ES.Services.EnterpriseStorage.CreateEnterpriseStorage(PanelSecurity.PackageId, PanelRequest.ItemID); } - ResultObject result = ES.Services.EnterpriseStorage.CreateEnterpriseFolder(PanelRequest.ItemID, txtFolderName.Text, chkAddDefaultGroup.Checked); + ResultObject result = ES.Services.EnterpriseStorage.CreateEnterpriseFolder( + PanelRequest.ItemID, + txtFolderName.Text, + (int)(decimal.Parse(txtFolderSize.Text) * OneGb), + rbtnQuotaSoft.Checked ? QuotaType.Soft : QuotaType.Hard, + chkAddDefaultGroup.Checked); if (!result.IsSuccess && result.ErrorCodes.Count > 0) { diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/EnterpriseStorageCreateFolder.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/EnterpriseStorageCreateFolder.ascx.designer.cs index 2c020b89..b2415b73 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/EnterpriseStorageCreateFolder.ascx.designer.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/EnterpriseStorageCreateFolder.ascx.designer.cs @@ -93,6 +93,69 @@ namespace WebsitePanel.Portal.ExchangeServer { /// protected global::System.Web.UI.WebControls.RequiredFieldValidator valRequireFolderName; + /// + /// locFolderSize control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locFolderSize; + + /// + /// txtFolderSize control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.TextBox txtFolderSize; + + /// + /// valRequireFolderSize control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.RequiredFieldValidator valRequireFolderSize; + + /// + /// rangeFolderSize control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.RangeValidator rangeFolderSize; + + /// + /// locQuotaType control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locQuotaType; + + /// + /// rbtnQuotaSoft control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.RadioButton rbtnQuotaSoft; + + /// + /// rbtnQuotaHard control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.RadioButton rbtnQuotaHard; + /// /// locAddDefaultGroup control. /// From 817aeee94148e894dab0b092bb6d6ff6d75e9b70 Mon Sep 17 00:00:00 2001 From: Virtuworks Date: Thu, 13 Feb 2014 22:45:26 -0500 Subject: [PATCH 05/25] Fix Webdav to set source on read-write permission --- .../EnterpriseStorage/EnterpriseStorageController.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/EnterpriseStorage/EnterpriseStorageController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/EnterpriseStorage/EnterpriseStorageController.cs index 8d1ee486..14d1fff7 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/EnterpriseStorage/EnterpriseStorageController.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/EnterpriseStorage/EnterpriseStorageController.cs @@ -895,6 +895,7 @@ namespace WebsitePanel.EnterpriseServer { rule.Write = true; rule.Read = true; + rule.Source = true; } rule.Pathes.Add("*"); From a65510cff8b0e66737c4c579f54e37e6673440cf Mon Sep 17 00:00:00 2001 From: Virtuworks Date: Thu, 13 Feb 2014 22:49:24 -0500 Subject: [PATCH 06/25] Fix Default Group Check Mark to False --- .../ExchangeServer/EnterpriseStorageCreateFolder.ascx | 2 +- .../EnterpriseStorageCreateFolder.ascx.designer.cs | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/EnterpriseStorageCreateFolder.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/EnterpriseStorageCreateFolder.ascx index 26a80b92..b3d2fa5b 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/EnterpriseStorageCreateFolder.ascx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/EnterpriseStorageCreateFolder.ascx @@ -36,7 +36,7 @@ - + diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/EnterpriseStorageCreateFolder.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/EnterpriseStorageCreateFolder.ascx.designer.cs index e680a0c1..51c94261 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/EnterpriseStorageCreateFolder.ascx.designer.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/EnterpriseStorageCreateFolder.ascx.designer.cs @@ -26,7 +26,6 @@ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - //------------------------------------------------------------------------------ // // This code was generated by a tool. From 57de63f92d87df245e1e8aadd0d438e56ad7366a Mon Sep 17 00:00:00 2001 From: Virtuworks Date: Thu, 13 Feb 2014 23:00:26 -0500 Subject: [PATCH 07/25] Added tag build-2.1.0.280 for changeset 6bebffc64850 From b875333df093586e9665e8a0c988a6f10d1510f8 Mon Sep 17 00:00:00 2001 From: Virtuworks Date: Fri, 14 Feb 2014 07:40:11 -0500 Subject: [PATCH 08/25] Added tag build-2.1.0.281 for changeset 0955c35ee90e From 5ff439130aeb58b9293fecf9bd9018bb1a29070d Mon Sep 17 00:00:00 2001 From: vfedosevich Date: Tue, 18 Feb 2014 17:50:31 +0300 Subject: [PATCH 09/25] fixed bug "Error creating folder" --- .../ExchangeServer/EnterpriseStorageCreateFolder.ascx.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/EnterpriseStorageCreateFolder.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/EnterpriseStorageCreateFolder.ascx.cs index 4080c20f..94e2f6a1 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/EnterpriseStorageCreateFolder.ascx.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/EnterpriseStorageCreateFolder.ascx.cs @@ -94,11 +94,11 @@ namespace WebsitePanel.Portal.ExchangeServer rbtnQuotaSoft.Checked ? QuotaType.Soft : QuotaType.Hard, chkAddDefaultGroup.Checked); - if (!result.IsSuccess && result.ErrorCodes.Count > 0) + /*if (!result.IsSuccess && result.ErrorCodes.Count > 0) { messageBox.ShowMessage(result, "ENTERPRISE_STORAGE_CREATE_FOLDER", "Enterprise Storage"); return; - } + }*/ Response.Redirect(EditUrl("SpaceID", PanelSecurity.PackageId.ToString(), "enterprisestorage_folder_settings", "FolderID=" + txtFolderName.Text, From a65ce29206aa4b68f31e4379a7491611c624fb51 Mon Sep 17 00:00:00 2001 From: Virtuworks Date: Tue, 18 Feb 2014 11:09:09 -0500 Subject: [PATCH 10/25] Added tag build-2.1.0.282 for changeset 78b66ce0021c From eed185b8948d23a58c34cda0deb51bbf3702a0db Mon Sep 17 00:00:00 2001 From: Virtuworks Date: Tue, 18 Feb 2014 11:12:39 -0500 Subject: [PATCH 11/25] Added tag build-2.1.0.283 for changeset d1cc059c31cc From 884183a2ce79a6d6423e35e911cce44e271e479d Mon Sep 17 00:00:00 2001 From: vfedosevich Date: Thu, 27 Feb 2014 20:41:52 +0300 Subject: [PATCH 12/25] replace menu --- .../App_Skins/Default/Browse2.ascx | 11 +++------ .../App_Skins/Default/Browse3.ascx | 7 ++---- .../App_Skins/Default/Storefront2.ascx | 5 +--- .../App_Themes/Default/Styles/Menus.css | 11 +++++++++ .../App_Themes/Default/Styles/SkinLayout.css | 4 ++-- .../WebsitePanel/SpaceMenu.ascx | 18 +++++++------- .../WebsitePanel/SpaceMenu.ascx.cs | 7 +++++- .../WebsitePanel/SpaceMenu.ascx.designer.cs | 24 +++++++++++++++---- .../WebsitePanel/UserAccountMenu.ascx | 18 +++++++------- .../WebsitePanel/UserAccountMenu.ascx.cs | 7 +++++- 10 files changed, 67 insertions(+), 45 deletions(-) diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/App_Skins/Default/Browse2.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/App_Skins/Default/Browse2.ascx index 5d7a7432..ae2563c2 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/App_Skins/Default/Browse2.ascx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/App_Skins/Default/Browse2.ascx @@ -34,20 +34,15 @@
+
-
- -
- -
-
- -
+
+