diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Files/FilesController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Files/FilesController.cs
index 4314bcd0..3e58f78a 100644
--- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Files/FilesController.cs
+++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/Files/FilesController.cs
@@ -983,5 +983,42 @@ namespace WebsitePanel.EnterpriseServer
}
+ public static int DeleteDirectoryRecursive(int packageId, string rootPath)
+ {
+
+ // check account
+ int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive);
+ if (accountCheck < 0) return accountCheck;
+
+ // check package
+ int packageCheck = SecurityContext.CheckPackage(packageId, DemandPackage.IsActive);
+ if (packageCheck < 0) return packageCheck;
+
+ // place log record
+ TaskManager.StartTask("FILES", "DELETE_DIRECTORY_RECURSIVE", rootPath);
+ TaskManager.ItemId = packageId;
+
+ try
+ {
+
+ OS.OperatingSystem os = GetOS(packageId);
+ os.DeleteDirectoryRecursive(rootPath);
+
+ return 0;
+ }
+ catch (Exception ex)
+ {
+ //Log and return a generic error rather than throwing an exception
+ TaskManager.WriteError(ex);
+ return BusinessErrorCodes.ERROR_FILE_GENERIC_LOGGED;
+ }
+ finally
+ {
+ TaskManager.CompleteTask();
+ }
+
+
+ }
+
}
}
diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/WebServers/WebServerController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/WebServers/WebServerController.cs
index a703fa4f..8966ac3a 100644
--- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/WebServers/WebServerController.cs
+++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/Code/WebServers/WebServerController.cs
@@ -599,6 +599,14 @@ namespace WebsitePanel.EnterpriseServer
//
web.DeleteSite(siteItem.SiteId);
+ // Delete WebManagementAccess Account
+ WebServerController.RevokeWebManagementAccess(siteItemId);
+
+ // Delete website directory from file server
+ // This will remove the hard quota as well
+ FilesController.DeleteDirectoryRecursive(siteItem.PackageId, new DirectoryInfo(siteItem.DataPath).Parent.FullName);
+
+
// delete service item
PackageController.DeletePackageItem(siteItemId);
diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.Base/OS/IOperatingSystem.cs b/WebsitePanel/Sources/WebsitePanel.Providers.Base/OS/IOperatingSystem.cs
index 73088563..add15c94 100644
--- a/WebsitePanel/Sources/WebsitePanel.Providers.Base/OS/IOperatingSystem.cs
+++ b/WebsitePanel/Sources/WebsitePanel.Providers.Base/OS/IOperatingSystem.cs
@@ -28,6 +28,7 @@
using System;
using System.Collections;
+using System.IO;
namespace WebsitePanel.Providers.OS
{
@@ -82,5 +83,7 @@ namespace WebsitePanel.Providers.OS
FolderGraph GetFolderGraph(string path);
void ExecuteSyncActions(FileSyncAction[] actions);
void SetQuotaLimitOnFolder(string cmdFilePath, string virtualFileClusterName, string folderPath, string quotaLimit, int mode, string wmiUserName, string wmiPassword);
+ void DeleteDirectoryRecursive(string rootPath);
+
}
}
diff --git a/WebsitePanel/Sources/WebsitePanel.Providers.OS.Windows2003/Windows2003.cs b/WebsitePanel/Sources/WebsitePanel.Providers.OS.Windows2003/Windows2003.cs
index 0965df57..1d37b8b3 100644
--- a/WebsitePanel/Sources/WebsitePanel.Providers.OS.Windows2003/Windows2003.cs
+++ b/WebsitePanel/Sources/WebsitePanel.Providers.OS.Windows2003/Windows2003.cs
@@ -215,9 +215,9 @@ namespace WebsitePanel.Providers.OS
FileUtils.SetQuotaLimitOnFolder(cmdFilePath, virtualFileClusterName, folderPath, quotaLimit, mode, wmiUserName, wmiPassword);
}
- public static void DeleteDirRecursive(DirectoryInfo treeRoot)
+ public virtual void DeleteDirectoryRecursive(string rootPath)
{
- FileUtils.DeleteDirectoryRecursive(treeRoot);
+ FileUtils.DeleteDirectoryRecursive(rootPath);
}
#endregion
diff --git a/WebsitePanel/Sources/WebsitePanel.Server.Client/OperatingSystemProxy.cs b/WebsitePanel/Sources/WebsitePanel.Server.Client/OperatingSystemProxy.cs
index d641b6f1..34be86c2 100644
--- a/WebsitePanel/Sources/WebsitePanel.Server.Client/OperatingSystemProxy.cs
+++ b/WebsitePanel/Sources/WebsitePanel.Server.Client/OperatingSystemProxy.cs
@@ -63,6 +63,8 @@ namespace WebsitePanel.Providers.OS {
private System.Threading.SendOrPostCallback FileExistsOperationCompleted;
private System.Threading.SendOrPostCallback SetQuotaLimitOnFolderOperationCompleted;
+
+ private System.Threading.SendOrPostCallback DeleteDirectoryRecursiveOperationCompleted;
private System.Threading.SendOrPostCallback DirectoryExistsOperationCompleted;
@@ -146,7 +148,11 @@ namespace WebsitePanel.Providers.OS {
///
public event FileExistsCompletedEventHandler FileExistsCompleted;
+ ///
public event SetQuotaLimitOnFolderCompletedEventHandler SetQuotaLimitOnFolderCompleted;
+
+ ///
+ public event DeleteDirectoryRecursiveCompletedEventHandler DeleteDirectoryRecursiveCompleted;
///
public event DirectoryExistsCompletedEventHandler DirectoryExistsCompleted;
@@ -370,9 +376,9 @@ namespace WebsitePanel.Providers.OS {
///
public void SetQuotaLimitOnFolderAsync(string cmdFilePath, string virtualFileClusterName, string folderPath, string quotaLimit, int mode, string wmiUserName, string wmiPassword, object userState)
{
- if ((this.FileExistsOperationCompleted == null))
+ if ((this.SetQuotaLimitOnFolderOperationCompleted == null))
{
- this.FileExistsOperationCompleted = new System.Threading.SendOrPostCallback(this.OnFileExistsOperationCompleted);
+ this.SetQuotaLimitOnFolderOperationCompleted = new System.Threading.SendOrPostCallback(this.OnSetQuotaLimitOnFolderOperationCompleted);
}
this.InvokeAsync("SetQuotaLimitOnFolder", new object[] {
cmdFilePath, virtualFileClusterName, folderPath, quotaLimit, mode, wmiUserName, wmiPassword}, this.SetQuotaLimitOnFolderOperationCompleted, userState);
@@ -386,6 +392,57 @@ namespace WebsitePanel.Providers.OS {
this.SetQuotaLimitOnFolderCompleted(this, new SetQuotaLimitOnFolderCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState));
}
}
+
+ ///
+ [System.Web.Services.Protocols.SoapHeaderAttribute("ServiceProviderSettingsSoapHeaderValue")]
+ [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/server/DeleteDirectoryRecursive", 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 DeleteDirectoryRecursive(string rootPath)
+ {
+ object[] results = this.Invoke("DeleteDirectoryRecursive", new object[] {
+ rootPath });
+ return ((bool)(results[0]));
+ }
+
+ ///
+ public System.IAsyncResult BeginDeleteDirectoryRecursive(string rootPath, System.AsyncCallback callback, object asyncState)
+ {
+ return this.BeginInvoke("DeleteDirectoryRecursive", new object[] {
+ rootPath}, callback, asyncState);
+ }
+
+ ///
+ public bool EndDeleteDirectoryRecursive(System.IAsyncResult asyncResult)
+ {
+ object[] results = this.EndInvoke(asyncResult);
+ return ((bool)(results[0]));
+ }
+
+ ///
+ public void DeleteDirectoryRecursiveAsync(string rootPath)
+ {
+ this.DeleteDirectoryRecursiveAsync(rootPath, null);
+ }
+
+ ///
+ public void DeleteDirectoryRecursiveAsync(string rootPath, object userState)
+ {
+ if ((this.DeleteDirectoryRecursiveOperationCompleted == null))
+ {
+ this.DeleteDirectoryRecursiveOperationCompleted = new System.Threading.SendOrPostCallback(this.OnDeleteDirectoryRecursiveOperationCompleted);
+ }
+ this.InvokeAsync("DeleteDirectoryRecursive", new object[] {
+ rootPath}, this.DeleteDirectoryRecursiveOperationCompleted, userState);
+ }
+
+ private void OnDeleteDirectoryRecursiveOperationCompleted(object arg)
+ {
+ if ((this.DeleteDirectoryRecursiveCompleted != null))
+ {
+ System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg));
+ this.DeleteDirectoryRecursiveCompleted(this, new DeleteDirectoryRecursiveCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState));
+ }
+ }
+
///
[System.Web.Services.Protocols.SoapHeaderAttribute("ServiceProviderSettingsSoapHeaderValue")]
@@ -1984,6 +2041,37 @@ namespace WebsitePanel.Providers.OS {
}
}
}
+
+ ///
+ [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")]
+ public delegate void DeleteDirectoryRecursiveCompletedEventHandler(object sender, DeleteDirectoryRecursiveCompletedEventArgs e);
+
+ ///
+ [System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")]
+ [System.Diagnostics.DebuggerStepThroughAttribute()]
+ [System.ComponentModel.DesignerCategoryAttribute("code")]
+ public partial class DeleteDirectoryRecursiveCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs
+ {
+
+ private object[] results;
+
+ internal DeleteDirectoryRecursiveCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) :
+ base(exception, cancelled, userState)
+ {
+ this.results = results;
+ }
+
+ ///
+ public bool Result
+ {
+ get
+ {
+ this.RaiseExceptionIfNecessary();
+ return ((bool)(this.results[0]));
+ }
+ }
+ }
+
///
[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.42")]
diff --git a/WebsitePanel/Sources/WebsitePanel.Server.Utils/FileUtils.cs b/WebsitePanel/Sources/WebsitePanel.Server.Utils/FileUtils.cs
index 77d6d45e..06433897 100644
--- a/WebsitePanel/Sources/WebsitePanel.Server.Utils/FileUtils.cs
+++ b/WebsitePanel/Sources/WebsitePanel.Server.Utils/FileUtils.cs
@@ -846,30 +846,35 @@ namespace WebsitePanel.Providers.Utils
cat = null;
}
- public static void DeleteDirectoryRecursive(DirectoryInfo treeRoot)
+ public static void DeleteDirectoryRecursive(string rootPath)
{
- if (treeRoot.Exists)
- {
-
- DirectoryInfo[] dirs = treeRoot.GetDirectories();
- while (dirs.Length > 0)
+ // This code is done this way to force folder deletion
+ // even if the folder was opened
+
+ DirectoryInfo treeRoot = new DirectoryInfo(rootPath);
+ if (treeRoot.Exists)
{
- foreach (DirectoryInfo dir in dirs)
- DeleteDirectoryRecursive(dir);
- dirs = treeRoot.GetDirectories();
+ DirectoryInfo[] dirs = treeRoot.GetDirectories();
+ while (dirs.Length > 0)
+ {
+ foreach (DirectoryInfo dir in dirs)
+ DeleteDirectoryRecursive(dir.FullName);
+
+ dirs = treeRoot.GetDirectories();
+ }
+
+ // DELETE THE FILES UNDER THE CURRENT ROOT
+ string[] files = Directory.GetFiles(treeRoot.FullName);
+ foreach (string file in files)
+ {
+ File.SetAttributes(file, FileAttributes.Normal);
+ File.Delete(file);
+ }
+
+ Directory.Delete(treeRoot.FullName, true);
}
-
- // DELETE THE FILES UNDER THE CURRENT ROOT
- string[] files = Directory.GetFiles(treeRoot.FullName);
- foreach (string file in files)
- {
- File.SetAttributes(file, FileAttributes.Normal);
- File.Delete(file);
- }
-
- Directory.Delete(treeRoot.FullName, true);
- }
+
}
diff --git a/WebsitePanel/Sources/WebsitePanel.Server/OperatingSystem.asmx.cs b/WebsitePanel/Sources/WebsitePanel.Server/OperatingSystem.asmx.cs
index 3e24a15e..d226536f 100644
--- a/WebsitePanel/Sources/WebsitePanel.Server/OperatingSystem.asmx.cs
+++ b/WebsitePanel/Sources/WebsitePanel.Server/OperatingSystem.asmx.cs
@@ -550,6 +550,22 @@ namespace WebsitePanel.Server
throw;
}
}
+
+ [WebMethod, SoapHeader("settings")]
+ public void DeleteDirectoryRecursive(string rootPath)
+ {
+ try
+ {
+ Log.WriteStart("'{0}' DeleteDirectoryRecursive", ProviderSettings.ProviderName);
+ OsProvider.DeleteDirectoryRecursive(rootPath);
+ Log.WriteEnd("'{0}' DeleteDirectoryRecursive", ProviderSettings.ProviderName);
+ }
+ catch (Exception ex)
+ {
+ Log.WriteError(String.Format("'{0}' DeleteDirectoryRecursive", ProviderSettings.ProviderName), ex);
+ throw;
+ }
+ }
#endregion
#region Synchronizing