Initial project's source code check-in.
This commit is contained in:
commit
b03b0b373f
4573 changed files with 981205 additions and 0 deletions
|
@ -0,0 +1,69 @@
|
|||
// Copyright (c) 2011, 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.Data;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace WebsitePanel.EnterpriseServer
|
||||
{
|
||||
public class CommentsController
|
||||
{
|
||||
public static DataSet GetComments(int userId, string itemTypeId, int itemId)
|
||||
{
|
||||
return DataProvider.GetComments(SecurityContext.User.UserId, userId, itemTypeId, itemId);
|
||||
}
|
||||
|
||||
public static int AddComment(string itemTypeId, int itemId,
|
||||
string commentText, int severityId)
|
||||
{
|
||||
// check account
|
||||
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive);
|
||||
if (accountCheck < 0) return accountCheck;
|
||||
|
||||
// add comment
|
||||
DataProvider.AddComment(SecurityContext.User.UserId, itemTypeId,
|
||||
itemId, commentText, severityId);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
public static int DeleteComment(int commentId)
|
||||
{
|
||||
// check account
|
||||
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive);
|
||||
if (accountCheck < 0) return accountCheck;
|
||||
|
||||
// delete comment
|
||||
DataProvider.DeleteComment(SecurityContext.User.UserId, commentId);
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,78 @@
|
|||
// Copyright (c) 2011, 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.Configuration;
|
||||
using System.Web;
|
||||
|
||||
namespace WebsitePanel.EnterpriseServer
|
||||
{
|
||||
/// <summary>
|
||||
/// Summary description for ConfigSettings.
|
||||
/// </summary>
|
||||
public class ConfigSettings
|
||||
{
|
||||
public static string DataProviderType
|
||||
{
|
||||
get { return ConfigurationManager.AppSettings["WebsitePanel.EnterpriseServer.DataProvider"]; }
|
||||
}
|
||||
|
||||
public static string WebApplicationsPath
|
||||
{
|
||||
get
|
||||
{
|
||||
string path = ConfigurationManager.AppSettings["WebsitePanel.EnterpriseServer.WebApplicationsPath"];
|
||||
if (path.StartsWith("~") && HttpContext.Current != null)
|
||||
path = HttpContext.Current.Server.MapPath(path);
|
||||
|
||||
return path;
|
||||
}
|
||||
}
|
||||
|
||||
public static string BackupsPath
|
||||
{
|
||||
get
|
||||
{
|
||||
SystemSettings settings = SystemController.GetSystemSettingsInternal(
|
||||
SystemSettings.BACKUP_SETTINGS,
|
||||
false
|
||||
);
|
||||
|
||||
return settings["BackupsPath"];
|
||||
}
|
||||
}
|
||||
|
||||
#region Communication
|
||||
public static int ServerRequestTimeout
|
||||
{
|
||||
get { return Utils.ParseInt(
|
||||
ConfigurationManager.AppSettings["WebsitePanel.EnterpriseServer.ServerRequestTimeout"], -1); }
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
|
@ -0,0 +1,203 @@
|
|||
// Copyright (c) 2011, 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.IO;
|
||||
using System.Text;
|
||||
using System.Security.Cryptography;
|
||||
using System.Configuration;
|
||||
|
||||
namespace WebsitePanel.EnterpriseServer
|
||||
{
|
||||
/// <summary>
|
||||
/// Summary description for CryptoUtils.
|
||||
/// </summary>
|
||||
public class CryptoUtils
|
||||
{
|
||||
public static string CryptoKey
|
||||
{
|
||||
get { return ConfigurationManager.AppSettings["WebsitePanel.CryptoKey"]; }
|
||||
}
|
||||
|
||||
public static bool EncryptionEnabled
|
||||
{
|
||||
get
|
||||
{
|
||||
return (ConfigurationManager.AppSettings["WebsitePanel.EncryptionEnabled"] != null)
|
||||
? Boolean.Parse(ConfigurationManager.AppSettings["WebsitePanel.EncryptionEnabled"]) : true;
|
||||
}
|
||||
}
|
||||
|
||||
public static string Encrypt(string InputText)
|
||||
{
|
||||
string Password = CryptoKey;
|
||||
|
||||
if(!EncryptionEnabled)
|
||||
return InputText;
|
||||
|
||||
if (InputText == null)
|
||||
return InputText;
|
||||
|
||||
// We are now going to create an instance of the
|
||||
// Rihndael class.
|
||||
RijndaelManaged RijndaelCipher = new RijndaelManaged();
|
||||
|
||||
// First we need to turn the input strings into a byte array.
|
||||
byte[] PlainText = System.Text.Encoding.Unicode.GetBytes(InputText);
|
||||
|
||||
|
||||
// We are using salt to make it harder to guess our key
|
||||
// using a dictionary attack.
|
||||
byte[] Salt = Encoding.ASCII.GetBytes(Password.Length.ToString());
|
||||
|
||||
|
||||
// The (Secret Key) will be generated from the specified
|
||||
// password and salt.
|
||||
PasswordDeriveBytes SecretKey = new PasswordDeriveBytes(Password, Salt);
|
||||
|
||||
|
||||
// Create a encryptor from the existing SecretKey bytes.
|
||||
// We use 32 bytes for the secret key
|
||||
// (the default Rijndael key length is 256 bit = 32 bytes) and
|
||||
// then 16 bytes for the IV (initialization vector),
|
||||
// (the default Rijndael IV length is 128 bit = 16 bytes)
|
||||
ICryptoTransform Encryptor = RijndaelCipher.CreateEncryptor(SecretKey.GetBytes(32), SecretKey.GetBytes(16));
|
||||
|
||||
|
||||
// Create a MemoryStream that is going to hold the encrypted bytes
|
||||
MemoryStream memoryStream = new MemoryStream();
|
||||
|
||||
|
||||
// Create a CryptoStream through which we are going to be processing our data.
|
||||
// CryptoStreamMode.Write means that we are going to be writing data
|
||||
// to the stream and the output will be written in the MemoryStream
|
||||
// we have provided. (always use write mode for encryption)
|
||||
CryptoStream cryptoStream = new CryptoStream(memoryStream, Encryptor, CryptoStreamMode.Write);
|
||||
|
||||
// Start the encryption process.
|
||||
cryptoStream.Write(PlainText, 0, PlainText.Length);
|
||||
|
||||
|
||||
// Finish encrypting.
|
||||
cryptoStream.FlushFinalBlock();
|
||||
|
||||
// Convert our encrypted data from a memoryStream into a byte array.
|
||||
byte[] CipherBytes = memoryStream.ToArray();
|
||||
|
||||
|
||||
|
||||
// Close both streams.
|
||||
memoryStream.Close();
|
||||
cryptoStream.Close();
|
||||
|
||||
|
||||
|
||||
// Convert encrypted data into a base64-encoded string.
|
||||
// A common mistake would be to use an Encoding class for that.
|
||||
// It does not work, because not all byte values can be
|
||||
// represented by characters. We are going to be using Base64 encoding
|
||||
// That is designed exactly for what we are trying to do.
|
||||
string EncryptedData = Convert.ToBase64String(CipherBytes);
|
||||
|
||||
|
||||
|
||||
// Return encrypted string.
|
||||
return EncryptedData;
|
||||
}
|
||||
|
||||
|
||||
public static string Decrypt(string InputText)
|
||||
{
|
||||
try
|
||||
{
|
||||
if(!EncryptionEnabled)
|
||||
return InputText;
|
||||
|
||||
if (InputText == null || InputText == "")
|
||||
return InputText;
|
||||
|
||||
string Password = CryptoKey;
|
||||
RijndaelManaged RijndaelCipher = new RijndaelManaged();
|
||||
|
||||
|
||||
byte[] EncryptedData = Convert.FromBase64String(InputText);
|
||||
byte[] Salt = Encoding.ASCII.GetBytes(Password.Length.ToString());
|
||||
|
||||
|
||||
PasswordDeriveBytes SecretKey = new PasswordDeriveBytes(Password, Salt);
|
||||
|
||||
// Create a decryptor from the existing SecretKey bytes.
|
||||
ICryptoTransform Decryptor = RijndaelCipher.CreateDecryptor(SecretKey.GetBytes(32), SecretKey.GetBytes(16));
|
||||
|
||||
|
||||
MemoryStream memoryStream = new MemoryStream(EncryptedData);
|
||||
|
||||
// Create a CryptoStream. (always use Read mode for decryption).
|
||||
CryptoStream cryptoStream = new CryptoStream(memoryStream, Decryptor, CryptoStreamMode.Read);
|
||||
|
||||
|
||||
// Since at this point we don't know what the size of decrypted data
|
||||
// will be, allocate the buffer long enough to hold EncryptedData;
|
||||
// DecryptedData is never longer than EncryptedData.
|
||||
byte[] PlainText = new byte[EncryptedData.Length];
|
||||
|
||||
// Start decrypting.
|
||||
int DecryptedCount = cryptoStream.Read(PlainText, 0, PlainText.Length);
|
||||
|
||||
|
||||
memoryStream.Close();
|
||||
cryptoStream.Close();
|
||||
|
||||
// Convert decrypted data into a string.
|
||||
string DecryptedData = Encoding.Unicode.GetString(PlainText, 0, DecryptedCount);
|
||||
|
||||
|
||||
// Return decrypted string.
|
||||
return DecryptedData;
|
||||
}
|
||||
catch
|
||||
{
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
public static string SHA1(string plainText)
|
||||
{
|
||||
// Convert plain text into a byte array.
|
||||
byte[] plainTextBytes = Encoding.UTF8.GetBytes(plainText);
|
||||
|
||||
HashAlgorithm hash = new SHA1Managed();;
|
||||
|
||||
// Compute hash value of our plain text with appended salt.
|
||||
byte[] hashBytes = hash.ComputeHash(plainTextBytes);
|
||||
|
||||
// Return the result.
|
||||
return Convert.ToBase64String(hashBytes);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,65 @@
|
|||
// Copyright (c) 2011, 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.Text;
|
||||
using System.Security;
|
||||
using System.Security.Principal;
|
||||
|
||||
namespace WebsitePanel.EnterpriseServer
|
||||
{
|
||||
public class EnterpriseServerIdentity : IIdentity
|
||||
{
|
||||
string name;
|
||||
|
||||
public EnterpriseServerIdentity(string name)
|
||||
{
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
#region IIdentity Members
|
||||
|
||||
public string AuthenticationType
|
||||
{
|
||||
get { return "Enterprise Server"; }
|
||||
}
|
||||
|
||||
public bool IsAuthenticated
|
||||
{
|
||||
get { return true; }
|
||||
}
|
||||
|
||||
public string Name
|
||||
{
|
||||
get { return name; }
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
|
@ -0,0 +1,100 @@
|
|||
// Copyright (c) 2011, 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.Text;
|
||||
using System.Security;
|
||||
using System.Security.Principal;
|
||||
|
||||
namespace WebsitePanel.EnterpriseServer
|
||||
{
|
||||
public class EnterpriseServerPrincipal : IPrincipal
|
||||
{
|
||||
private int userId;
|
||||
private int ownerId;
|
||||
private bool isPeer;
|
||||
private bool isDemo;
|
||||
private UserStatus status;
|
||||
|
||||
private List<string> roles = new List<string>();
|
||||
private IIdentity identity;
|
||||
|
||||
public EnterpriseServerPrincipal(IIdentity identity, string[] roles)
|
||||
{
|
||||
this.identity = identity;
|
||||
this.roles.AddRange(roles);
|
||||
}
|
||||
|
||||
#region IPrincipal Members
|
||||
|
||||
public IIdentity Identity
|
||||
{
|
||||
get { return identity; }
|
||||
}
|
||||
|
||||
public bool IsInRole(string role)
|
||||
{
|
||||
return roles.Contains(role);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Public properties
|
||||
public int UserId
|
||||
{
|
||||
get { return this.userId; }
|
||||
set { this.userId = value; }
|
||||
}
|
||||
|
||||
public int OwnerId
|
||||
{
|
||||
get { return this.ownerId; }
|
||||
set { this.ownerId = value; }
|
||||
}
|
||||
|
||||
public bool IsPeer
|
||||
{
|
||||
get { return this.isPeer; }
|
||||
set { this.isPeer = value; }
|
||||
}
|
||||
|
||||
public bool IsDemo
|
||||
{
|
||||
get { return this.isDemo; }
|
||||
set { this.isDemo = value; }
|
||||
}
|
||||
|
||||
public UserStatus Status
|
||||
{
|
||||
get { return this.status; }
|
||||
set { this.status = value; }
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
|
@ -0,0 +1,121 @@
|
|||
// Copyright (c) 2011, 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.IO;
|
||||
using System.Collections.Generic;
|
||||
using Ionic.Zip;
|
||||
|
||||
namespace WebsitePanel.EnterpriseServer
|
||||
{
|
||||
public class FileUtils
|
||||
{
|
||||
#region Zip/Unzip Methods
|
||||
|
||||
public static void ZipFiles(string zipFile, string rootPath, string[] files)
|
||||
{
|
||||
using (ZipFile zip = new ZipFile())
|
||||
{
|
||||
//use unicode if necessary
|
||||
zip.UseUnicodeAsNecessary = true;
|
||||
//skip locked files
|
||||
zip.ZipErrorAction = ZipErrorAction.Skip;
|
||||
foreach (string file in files)
|
||||
{
|
||||
string fullPath = Path.Combine(rootPath, file);
|
||||
if (Directory.Exists(fullPath))
|
||||
{
|
||||
//add directory with the same directory name
|
||||
zip.AddDirectory(fullPath, file);
|
||||
}
|
||||
else if (File.Exists(fullPath))
|
||||
{
|
||||
//add file to the root folder
|
||||
zip.AddFile(fullPath, "");
|
||||
}
|
||||
}
|
||||
zip.Save(zipFile);
|
||||
}
|
||||
}
|
||||
|
||||
public static List<string> UnzipFiles(string zipFile, string destFolder)
|
||||
{
|
||||
using (ZipFile zip = ZipFile.Read(zipFile))
|
||||
{
|
||||
foreach (ZipEntry e in zip)
|
||||
{
|
||||
e.Extract(destFolder, ExtractExistingFileAction.OverwriteSilently);
|
||||
}
|
||||
}
|
||||
|
||||
// return extracted files names
|
||||
return GetFileNames(destFolder);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Helper Functions
|
||||
|
||||
/// <summary>
|
||||
/// This function enumerates all directories and files of the <paramref name="direcrotyPath"/> specified.
|
||||
/// </summary>
|
||||
/// <param name="direcrotyPath">Path to the directory.</param>
|
||||
/// <returns>
|
||||
/// List of files and directories reside for the <paramref name="direcrotyPath"/> specified.
|
||||
/// Empty, when no files and directories are or path does not exists.
|
||||
/// </returns>
|
||||
public static List<string> GetFileNames(string direcrotyPath)
|
||||
{
|
||||
List<string> items = new List<string>();
|
||||
|
||||
DirectoryInfo root = new DirectoryInfo(direcrotyPath);
|
||||
if (root.Exists)
|
||||
{
|
||||
// list directories
|
||||
foreach (DirectoryInfo dir in root.GetDirectories())
|
||||
{
|
||||
items.Add(
|
||||
System.IO.Path.Combine(direcrotyPath, dir.Name)
|
||||
);
|
||||
}
|
||||
|
||||
// list files
|
||||
foreach (FileInfo file in root.GetFiles())
|
||||
{
|
||||
items.Add(
|
||||
System.IO.Path.Combine(direcrotyPath, file.Name)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
return items;
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
|
@ -0,0 +1,143 @@
|
|||
// Copyright (c) 2011, 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.Text;
|
||||
using System.Net;
|
||||
using System.Net.Mail;
|
||||
|
||||
namespace WebsitePanel.EnterpriseServer
|
||||
{
|
||||
public class MailHelper
|
||||
{
|
||||
public static int SendMessage(string from, string to, string subject, string body, bool isHtml)
|
||||
{
|
||||
return SendMessage(from, to, null, subject, body, MailPriority.Normal, isHtml);
|
||||
}
|
||||
|
||||
public static int SendMessage(string from, string to, string bcc, string subject, string body, bool isHtml)
|
||||
{
|
||||
return SendMessage(from, to, bcc, subject, body, MailPriority.Normal, isHtml);
|
||||
}
|
||||
|
||||
public static int SendMessage(string from, string to, string bcc, string subject, string body,
|
||||
MailPriority priority, bool isHtml, Attachment[] attachments)
|
||||
{
|
||||
// Command line argument must the the SMTP host.
|
||||
SmtpClient client = new SmtpClient();
|
||||
|
||||
// load SMTP client settings
|
||||
SystemSettings settings = SystemController.GetSystemSettingsInternal(
|
||||
SystemSettings.SMTP_SETTINGS,
|
||||
true
|
||||
);
|
||||
|
||||
client.Host = settings["SmtpServer"];
|
||||
client.Port = settings.GetInt("SmtpPort");
|
||||
if (!String.IsNullOrEmpty(settings["SmtpUsername"]))
|
||||
{
|
||||
client.Credentials = new NetworkCredential(
|
||||
settings["SmtpUsername"],
|
||||
settings["SmtpPassword"]
|
||||
);
|
||||
}
|
||||
|
||||
if (!String.IsNullOrEmpty(settings["SmtpEnableSsl"]))
|
||||
{
|
||||
client.EnableSsl = Utils.ParseBool(settings["SmtpEnableSsl"], false);
|
||||
}
|
||||
|
||||
// create message
|
||||
MailMessage message = new MailMessage(from, to);
|
||||
message.Body = body;
|
||||
message.BodyEncoding = System.Text.Encoding.UTF8;
|
||||
message.IsBodyHtml = isHtml;
|
||||
message.Subject = subject;
|
||||
message.SubjectEncoding = System.Text.Encoding.UTF8;
|
||||
if (!String.IsNullOrEmpty(bcc))
|
||||
message.Bcc.Add(bcc);
|
||||
message.Priority = priority;
|
||||
|
||||
if (attachments != null)
|
||||
{
|
||||
foreach(Attachment current in attachments)
|
||||
{
|
||||
message.Attachments.Add(current);
|
||||
}
|
||||
}
|
||||
|
||||
// send message
|
||||
try
|
||||
{
|
||||
client.Send(message);
|
||||
|
||||
return 0;
|
||||
}
|
||||
catch (SmtpException ex)
|
||||
{
|
||||
switch (ex.StatusCode)
|
||||
{
|
||||
case SmtpStatusCode.BadCommandSequence: return BusinessErrorCodes.SMTP_BAD_COMMAND_SEQUENCE;
|
||||
case SmtpStatusCode.CannotVerifyUserWillAttemptDelivery: return BusinessErrorCodes.SMTP_CANNOT_VERIFY_USER_WILL_ATTEMPT_DELIVERY;
|
||||
case SmtpStatusCode.ClientNotPermitted: return BusinessErrorCodes.SMTP_CLIENT_NOT_PERMITTED;
|
||||
case SmtpStatusCode.CommandNotImplemented: return BusinessErrorCodes.SMTP_COMMAND_NOT_IMPLEMENTED;
|
||||
case SmtpStatusCode.CommandParameterNotImplemented: return BusinessErrorCodes.SMTP_COMMAND_PARAMETER_NOT_IMPLEMENTED;
|
||||
case SmtpStatusCode.CommandUnrecognized: return BusinessErrorCodes.SMTP_COMMAND_UNRECOGNIZED;
|
||||
case SmtpStatusCode.ExceededStorageAllocation: return BusinessErrorCodes.SMTP_EXCEEDED_STORAGE_ALLOCATION;
|
||||
case SmtpStatusCode.GeneralFailure: return BusinessErrorCodes.SMTP_GENERAL_FAILURE;
|
||||
case SmtpStatusCode.InsufficientStorage: return BusinessErrorCodes.SMTP_INSUFFICIENT_STORAGE;
|
||||
case SmtpStatusCode.LocalErrorInProcessing: return BusinessErrorCodes.SMTP_LOCAL_ERROR_IN_PROCESSING;
|
||||
case SmtpStatusCode.MailboxBusy: return BusinessErrorCodes.SMTP_MAILBOX_BUSY;
|
||||
case SmtpStatusCode.MailboxNameNotAllowed: return BusinessErrorCodes.SMTP_MAILBOX_NAME_NOTALLOWED;
|
||||
case SmtpStatusCode.MailboxUnavailable: return BusinessErrorCodes.SMTP_MAILBOX_UNAVAILABLE;
|
||||
case SmtpStatusCode.MustIssueStartTlsFirst: return BusinessErrorCodes.SMTP_MUST_ISSUE_START_TLS_FIRST;
|
||||
case SmtpStatusCode.ServiceClosingTransmissionChannel: return BusinessErrorCodes.SMTP_SERVICE_CLOSING_TRANSMISSION_CHANNEL;
|
||||
case SmtpStatusCode.ServiceNotAvailable: return BusinessErrorCodes.SMTP_SERVICE_NOT_AVAILABLE;
|
||||
case SmtpStatusCode.SyntaxError: return BusinessErrorCodes.SMTP_SYNTAX_ERROR;
|
||||
case SmtpStatusCode.TransactionFailed: return BusinessErrorCodes.SMTP_TRANSACTION_FAILED;
|
||||
case SmtpStatusCode.UserNotLocalTryAlternatePath: return BusinessErrorCodes.SMTP_USER_NOT_LOCAL_TRY_ALTERNATE_PATH;
|
||||
case SmtpStatusCode.UserNotLocalWillForward: return BusinessErrorCodes.SMTP_USER_NOT_LOCAL_WILL_FORWARD;
|
||||
default: return BusinessErrorCodes.SMTP_UNKNOWN_ERROR;
|
||||
}
|
||||
}
|
||||
finally
|
||||
{
|
||||
// Clean up.
|
||||
message.Dispose();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static int SendMessage(string from, string to, string bcc, string subject, string body,
|
||||
MailPriority priority, bool isHtml)
|
||||
{
|
||||
return SendMessage(from, to, bcc, subject, body, priority, isHtml, null);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,659 @@
|
|||
// Copyright (c) 2011, 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.Reflection;
|
||||
using System.Data;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
|
||||
using WebsitePanel.Providers;
|
||||
|
||||
namespace WebsitePanel.EnterpriseServer
|
||||
{
|
||||
/// <summary>
|
||||
/// Summary description for ObjectUtils.
|
||||
/// </summary>
|
||||
public class ObjectUtils
|
||||
{
|
||||
public static DT ConvertObject<ST, DT>(ST so)
|
||||
{
|
||||
Dictionary<string, PropertyInfo> sProps = GetTypePropertiesHash(typeof(ST));
|
||||
Dictionary<string, PropertyInfo> dProps = GetTypePropertiesHash(typeof(DT));
|
||||
|
||||
DT dobj = (DT)Activator.CreateInstance(typeof(DT));
|
||||
|
||||
// copy properties
|
||||
foreach (string propName in sProps.Keys)
|
||||
{
|
||||
if (dProps.ContainsKey(propName) && sProps[propName].Name != "Item")
|
||||
{
|
||||
if (sProps[propName].CanRead)
|
||||
{
|
||||
object val = sProps[propName].GetValue(so, null);
|
||||
if (dProps[propName] != null)
|
||||
{
|
||||
if (val != null && dProps[propName].CanWrite)
|
||||
{
|
||||
dProps[propName].SetValue(dobj, val, null);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return dobj;
|
||||
}
|
||||
|
||||
private static Hashtable typeProperties = new Hashtable();
|
||||
|
||||
public static Hashtable GetObjectProperties(object obj, bool persistentOnly)
|
||||
{
|
||||
Hashtable hash = new Hashtable();
|
||||
|
||||
Type type = obj.GetType();
|
||||
PropertyInfo[] props = type.GetProperties(BindingFlags.Instance
|
||||
| BindingFlags.Public);
|
||||
foreach (PropertyInfo prop in props)
|
||||
{
|
||||
// check for persistent attribute
|
||||
object[] attrs = prop.GetCustomAttributes(typeof(PersistentAttribute), false);
|
||||
if (!persistentOnly || (persistentOnly && attrs.Length > 0))
|
||||
{
|
||||
object val = prop.GetValue(obj, null);
|
||||
string s = "";
|
||||
if (val != null)
|
||||
{
|
||||
if (prop.PropertyType == typeof(string[]))
|
||||
s = String.Join(";", (string[])val);
|
||||
else if (prop.PropertyType == typeof(int[]))
|
||||
{
|
||||
int[] ivals = (int[])val;
|
||||
string[] svals = new string[ivals.Length];
|
||||
for (int i = 0; i < svals.Length; i++)
|
||||
svals[i] = ivals[i].ToString();
|
||||
s = String.Join(";", svals);
|
||||
}
|
||||
else
|
||||
s = val.ToString();
|
||||
}
|
||||
|
||||
// add property to hash
|
||||
hash.Add(prop.Name, s);
|
||||
}
|
||||
}
|
||||
|
||||
return hash;
|
||||
}
|
||||
|
||||
public static void FillCollectionFromDataSet<T>(List<T> list, DataSet ds)
|
||||
{
|
||||
if(ds.Tables.Count == 0)
|
||||
return;
|
||||
|
||||
FillCollectionFromDataView<T>(list, ds.Tables[0].DefaultView);
|
||||
}
|
||||
|
||||
public static void FillCollectionFromDataView<T>(List<T> list, DataView dv)
|
||||
{
|
||||
Type type = typeof(T);
|
||||
|
||||
PropertyInfo[] props = GetTypeProperties(type);
|
||||
|
||||
foreach(DataRowView dr in dv)
|
||||
{
|
||||
// create an instance
|
||||
T obj = (T)Activator.CreateInstance(type);
|
||||
list.Add(obj);
|
||||
|
||||
// fill properties
|
||||
for(int i = 0; i < props.Length; i++)
|
||||
{
|
||||
string propName = props[i].Name;
|
||||
if(dv.Table.Columns[propName] == null)
|
||||
continue;
|
||||
|
||||
object propVal = dr[propName];
|
||||
if(propVal == DBNull.Value)
|
||||
props[i].SetValue(obj, GetNull(props[i].PropertyType), null);
|
||||
else
|
||||
{
|
||||
try
|
||||
{
|
||||
// try implicit type conversion
|
||||
props[i].SetValue(obj, propVal, null);
|
||||
}
|
||||
catch
|
||||
{
|
||||
// convert to string and then set property value
|
||||
try
|
||||
{
|
||||
string strVal = propVal.ToString();
|
||||
props[i].SetValue(obj, Cast(strVal, props[i].PropertyType), null);
|
||||
}
|
||||
catch
|
||||
{
|
||||
// skip property init
|
||||
}
|
||||
}
|
||||
}
|
||||
} // for properties
|
||||
} // for rows
|
||||
}
|
||||
|
||||
public static List<T> CreateListFromDataReader<T>(IDataReader reader)
|
||||
{
|
||||
List<T> list = new List<T>();
|
||||
FillCollectionFromDataReader<T>(list, reader);
|
||||
return list;
|
||||
}
|
||||
|
||||
public static List<T> CreateListFromDataSet<T>(DataSet ds)
|
||||
{
|
||||
List<T> list = new List<T>();
|
||||
FillCollectionFromDataSet<T>(list, ds);
|
||||
return list;
|
||||
}
|
||||
|
||||
public static void FillCollectionFromDataReader<T>(List<T> list, IDataReader reader)
|
||||
{
|
||||
Type type = typeof(T);
|
||||
|
||||
try
|
||||
{
|
||||
// get type properties
|
||||
PropertyInfo[] props = GetTypeProperties(type);
|
||||
|
||||
// iterate through reader
|
||||
while(reader.Read())
|
||||
{
|
||||
T obj = (T)Activator.CreateInstance(type);
|
||||
list.Add(obj);
|
||||
|
||||
// set properties
|
||||
for(int i = 0; i < props.Length; i++)
|
||||
{
|
||||
string propName = props[i].Name;
|
||||
|
||||
try
|
||||
{
|
||||
|
||||
object propVal = reader[propName];
|
||||
if(propVal == DBNull.Value)
|
||||
props[i].SetValue(obj, GetNull(props[i].PropertyType), null);
|
||||
else
|
||||
{
|
||||
try
|
||||
{
|
||||
// try implicit type conversion
|
||||
props[i].SetValue(obj, propVal, null);
|
||||
}
|
||||
catch
|
||||
{
|
||||
// convert to string and then set property value
|
||||
try
|
||||
{
|
||||
string strVal = propVal.ToString();
|
||||
props[i].SetValue(obj, Cast(strVal, props[i].PropertyType), null);
|
||||
}
|
||||
catch
|
||||
{
|
||||
// skip property init
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch{} // just skip
|
||||
} // for properties
|
||||
}
|
||||
}
|
||||
finally
|
||||
{
|
||||
reader.Close();
|
||||
}
|
||||
}
|
||||
|
||||
public static T FillObjectFromDataView<T>(DataView dv)
|
||||
{
|
||||
Type type = typeof(T);
|
||||
T obj = default(T);
|
||||
|
||||
// get type properties
|
||||
PropertyInfo[] props = GetTypeProperties(type);
|
||||
|
||||
// iterate through reader
|
||||
foreach(DataRowView dr in dv)
|
||||
{
|
||||
obj = (T)Activator.CreateInstance(type);
|
||||
|
||||
// set properties
|
||||
for(int i = 0; i < props.Length; i++)
|
||||
{
|
||||
string propName = props[i].Name;
|
||||
|
||||
try
|
||||
{
|
||||
// verify if there is such a column
|
||||
if (!dr.Row.Table.Columns.Contains(propName.ToLower()))
|
||||
{
|
||||
// if not, we move to another property
|
||||
// because this one we cannot set
|
||||
continue;
|
||||
}
|
||||
|
||||
object propVal = dr[propName];
|
||||
if(propVal == DBNull.Value)
|
||||
props[i].SetValue(obj, GetNull(props[i].PropertyType), null);
|
||||
else
|
||||
{
|
||||
try
|
||||
{
|
||||
string strVal = propVal.ToString();
|
||||
|
||||
//convert to DateTime
|
||||
if (props[i].PropertyType.UnderlyingSystemType.FullName == typeof(DateTime).FullName)
|
||||
{
|
||||
DateTime date = DateTime.MinValue;
|
||||
if (DateTime.TryParse(strVal, out date))
|
||||
{
|
||||
props[i].SetValue(obj, date, null);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
//Convert generic
|
||||
props[i].SetValue(obj, Cast(strVal, props[i].PropertyType), null);
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
// skip property init
|
||||
}
|
||||
}
|
||||
}
|
||||
catch{} // just skip
|
||||
} // for properties
|
||||
}
|
||||
|
||||
return obj;
|
||||
}
|
||||
|
||||
public static T FillObjectFromDataReader<T>(IDataReader reader)
|
||||
{
|
||||
Type type = typeof(T);
|
||||
|
||||
T obj = default(T);
|
||||
|
||||
try
|
||||
{
|
||||
// get type properties
|
||||
PropertyInfo[] props = GetTypeProperties(type);
|
||||
|
||||
// iterate through reader
|
||||
while(reader.Read())
|
||||
{
|
||||
obj = (T)Activator.CreateInstance(type);
|
||||
|
||||
// set properties
|
||||
for(int i = 0; i < props.Length; i++)
|
||||
{
|
||||
string propName = props[i].Name;
|
||||
|
||||
try
|
||||
{
|
||||
if (!IsColumnExists(propName, reader.GetSchemaTable()))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
object propVal = reader[propName];
|
||||
|
||||
if(propVal == DBNull.Value)
|
||||
props[i].SetValue(obj, GetNull(props[i].PropertyType), null);
|
||||
else
|
||||
{
|
||||
try
|
||||
{
|
||||
//try string first
|
||||
if (props[i].PropertyType.UnderlyingSystemType.FullName == typeof(String).FullName)
|
||||
{
|
||||
props[i].SetValue(obj, propVal.ToString(), null);
|
||||
}
|
||||
else
|
||||
{
|
||||
// then, try implicit type conversion
|
||||
props[i].SetValue(obj, propVal, null);
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
// convert to string and then set property value
|
||||
try
|
||||
{
|
||||
string strVal = propVal.ToString();
|
||||
props[i].SetValue(obj, Cast(strVal, props[i].PropertyType), null);
|
||||
}
|
||||
catch
|
||||
{
|
||||
// skip property init
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch{} // just skip
|
||||
} // for properties
|
||||
}
|
||||
}
|
||||
finally
|
||||
{
|
||||
reader.Close();
|
||||
}
|
||||
|
||||
return obj;
|
||||
}
|
||||
|
||||
private static Hashtable propertiesCache = new Hashtable();
|
||||
|
||||
public static object CreateObjectFromDataview(Type type, DataView dv,
|
||||
string nameColumn, string valueColumn, bool persistentOnly)
|
||||
{
|
||||
// create hash of properties from datareader
|
||||
Hashtable propValues = new Hashtable();
|
||||
foreach (DataRowView dr in dv)
|
||||
{
|
||||
if (propValues[dr[nameColumn]] == null)
|
||||
propValues.Add(dr[nameColumn], dr[valueColumn]);
|
||||
}
|
||||
|
||||
return CreateObjectFromHash(type, propValues, persistentOnly);
|
||||
}
|
||||
|
||||
public static object CreateObjectFromDataReader(Type type, IDataReader reader,
|
||||
string nameColumn, string valueColumn, bool persistentOnly)
|
||||
{
|
||||
// create hash of properties from datareader
|
||||
Hashtable propValues = new Hashtable();
|
||||
while (reader.Read())
|
||||
{
|
||||
if (propValues[reader[nameColumn]] == null)
|
||||
propValues.Add(reader[nameColumn], reader[valueColumn]);
|
||||
}
|
||||
reader.Close();
|
||||
|
||||
return CreateObjectFromHash(type, propValues, persistentOnly);
|
||||
}
|
||||
|
||||
public static object CreateObjectFromHash(Type type, Hashtable propValues, bool persistentOnly)
|
||||
{
|
||||
// create object
|
||||
object obj = Activator.CreateInstance(type);
|
||||
|
||||
CreateObjectFromHash(obj, propValues, persistentOnly);
|
||||
|
||||
return obj;
|
||||
}
|
||||
|
||||
public static void CopyPersistentPropertiesFromSource<T>(T source, T target)
|
||||
where T : ServiceProviderItem
|
||||
{
|
||||
//
|
||||
var typeSource = source.GetType();
|
||||
var typeTarget = target.GetType();
|
||||
// get all property infos
|
||||
Hashtable props = null;
|
||||
if (propertiesCache[typeSource.Name] != null)
|
||||
{
|
||||
// load properties from cache
|
||||
props = (Hashtable)propertiesCache[typeSource.Name];
|
||||
}
|
||||
else
|
||||
{
|
||||
// create properties cache
|
||||
props = new Hashtable();
|
||||
//
|
||||
PropertyInfo[] objProps = typeSource.GetProperties(BindingFlags.Instance
|
||||
//| BindingFlags.DeclaredOnly
|
||||
| BindingFlags.Public);
|
||||
foreach (PropertyInfo prop in objProps)
|
||||
{
|
||||
// check for persistent attribute
|
||||
object[] attrs = prop.GetCustomAttributes(typeof(PersistentAttribute), false);
|
||||
// Persistent only
|
||||
if (attrs.Length > 0)
|
||||
{
|
||||
// add property to hash
|
||||
props.Add(prop.Name, prop);
|
||||
}
|
||||
}
|
||||
// add to cache
|
||||
propertiesCache.Add(typeSource.Name, props);
|
||||
}
|
||||
|
||||
// Copy the data
|
||||
foreach (PropertyInfo propertyInfo in props.Values)
|
||||
{
|
||||
propertyInfo.SetValue(target, propertyInfo.GetValue(source, null), null);
|
||||
}
|
||||
}
|
||||
|
||||
public static void CreateObjectFromHash(object obj, Hashtable propValues, bool persistentOnly)
|
||||
{
|
||||
Type type = obj.GetType();
|
||||
|
||||
// get all property infos
|
||||
Hashtable props = null;
|
||||
if (propertiesCache[type.Name] != null)
|
||||
{
|
||||
// load properties from cache
|
||||
props = (Hashtable)propertiesCache[type.Name];
|
||||
}
|
||||
else
|
||||
{
|
||||
// create properties cache
|
||||
props = new Hashtable();
|
||||
PropertyInfo[] objProps = type.GetProperties(BindingFlags.Instance
|
||||
//| BindingFlags.DeclaredOnly
|
||||
| BindingFlags.Public);
|
||||
foreach (PropertyInfo prop in objProps)
|
||||
{
|
||||
// check for persistent attribute
|
||||
object[] attrs = prop.GetCustomAttributes(typeof(PersistentAttribute), false);
|
||||
if (!persistentOnly || (persistentOnly && attrs.Length > 0))
|
||||
{
|
||||
// add property to hash
|
||||
props.Add(prop.Name, prop);
|
||||
}
|
||||
}
|
||||
|
||||
// add to cache
|
||||
propertiesCache.Add(type.Name, props);
|
||||
}
|
||||
|
||||
// fill properties
|
||||
foreach (string propName in propValues.Keys)
|
||||
{
|
||||
// try to locate specified property
|
||||
if (props[propName] != null)
|
||||
{
|
||||
// set property
|
||||
// we support:
|
||||
// String
|
||||
// Int32
|
||||
// Boolean
|
||||
// Float
|
||||
PropertyInfo prop = (PropertyInfo)props[propName];
|
||||
string val = propValues[propName].ToString();
|
||||
if (prop.PropertyType == typeof(String))
|
||||
prop.SetValue(obj, val, null);
|
||||
else if (prop.PropertyType == typeof(Int32))
|
||||
prop.SetValue(obj, Int32.Parse(val), null);
|
||||
else
|
||||
if (prop.PropertyType == typeof(long))
|
||||
prop.SetValue(obj, long.Parse(val), null);
|
||||
else
|
||||
if (prop.PropertyType == typeof(Boolean))
|
||||
prop.SetValue(obj, Boolean.Parse(val), null);
|
||||
else if (prop.PropertyType == typeof(Single))
|
||||
prop.SetValue(obj, Single.Parse(val), null);
|
||||
else if (prop.PropertyType.IsEnum)
|
||||
prop.SetValue(obj, Enum.Parse(prop.PropertyType, val, true), null);
|
||||
else
|
||||
if (prop.PropertyType == typeof(Guid))
|
||||
prop.SetValue(obj, new Guid(val), null);
|
||||
else
|
||||
if (prop.PropertyType == typeof(string[]))
|
||||
{
|
||||
if (val == "")
|
||||
prop.SetValue(obj, new string[0], null);
|
||||
else
|
||||
prop.SetValue(obj, val.Split(';'), null);
|
||||
}
|
||||
else if (prop.PropertyType == typeof(int[]))
|
||||
{
|
||||
string[] svals = val.Split(';');
|
||||
int[] ivals = new int[svals.Length];
|
||||
|
||||
for (int i = 0; i < svals.Length; i++)
|
||||
ivals[i] = Int32.Parse(svals[i]);
|
||||
|
||||
if (val == "")
|
||||
ivals = new int[0];
|
||||
|
||||
prop.SetValue(obj, ivals, null);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static Dictionary<string, PropertyInfo> GetTypePropertiesHash(Type type)
|
||||
{
|
||||
Dictionary<string, PropertyInfo> hash = new Dictionary<string, PropertyInfo>();
|
||||
PropertyInfo[] props = GetTypeProperties(type);
|
||||
foreach (PropertyInfo prop in props)
|
||||
hash.Add(prop.Name, prop);
|
||||
return hash;
|
||||
}
|
||||
|
||||
private static PropertyInfo[] GetTypeProperties(Type type)
|
||||
{
|
||||
string typeName = type.AssemblyQualifiedName;
|
||||
if(typeProperties[typeName] != null)
|
||||
return (PropertyInfo[])typeProperties[typeName];
|
||||
|
||||
PropertyInfo[] props = type.GetProperties(BindingFlags.Instance | BindingFlags.Public);
|
||||
typeProperties[typeName] = props;
|
||||
return props;
|
||||
}
|
||||
|
||||
public static object GetNull(Type type)
|
||||
{
|
||||
if(type == typeof(string))
|
||||
return null;
|
||||
if(type == typeof(Int32))
|
||||
return 0;
|
||||
if(type == typeof(Int64))
|
||||
return 0;
|
||||
if(type == typeof(Boolean))
|
||||
return false;
|
||||
if(type == typeof(Decimal))
|
||||
return 0M;
|
||||
else
|
||||
return null;
|
||||
}
|
||||
|
||||
public static object Cast(string val, Type type)
|
||||
{
|
||||
if(type == typeof(string))
|
||||
return val;
|
||||
if(type == typeof(Int32))
|
||||
return Int32.Parse(val);
|
||||
if(type == typeof(Int64))
|
||||
return Int64.Parse(val);
|
||||
if(type == typeof(Boolean))
|
||||
return Boolean.Parse(val);
|
||||
if(type == typeof(Decimal))
|
||||
return Decimal.Parse(val);
|
||||
if(type == typeof(string[]) && val != null)
|
||||
{
|
||||
return val.Split(';');
|
||||
}
|
||||
if (type.IsEnum)
|
||||
return Enum.Parse(type, val, true);
|
||||
|
||||
if (type == typeof(int[]) && val != null)
|
||||
{
|
||||
string[] sarr = val.Split(';');
|
||||
int[] iarr = new int[sarr.Length];
|
||||
for (int i = 0; i < sarr.Length; i++)
|
||||
iarr[i] = Int32.Parse(sarr[i]);
|
||||
return iarr;
|
||||
}
|
||||
else
|
||||
return val;
|
||||
}
|
||||
|
||||
public static string GetTypeFullName(Type type)
|
||||
{
|
||||
return type.FullName + ", " + type.Assembly.GetName().Name;
|
||||
}
|
||||
|
||||
|
||||
#region Helper Functions
|
||||
|
||||
/// <summary>
|
||||
/// This function is used to determine whether IDataReader contains a Column.
|
||||
/// </summary>
|
||||
/// <param name="columnName">Name of the column.</param>
|
||||
/// <param name="schemaTable">The schema <see cref="DataTable"/> that decribes result-set <see cref="IDataReader"/> contains.</param>
|
||||
/// <returns>True, when required column exists in the <paramref name="schemaTable"/>. Otherwise, false.</returns>
|
||||
/// <remark>
|
||||
/// The followin example shows how to look for the "Role" column in the <see cref="IDataReader"/>.
|
||||
/// <example>
|
||||
/// IDataReader reader = ....
|
||||
/// if (!IsColumnExists("Role", reader.GetSchemaTable())
|
||||
/// {
|
||||
/// continue;
|
||||
/// }
|
||||
///
|
||||
/// object roleValue = reader["Role"];
|
||||
/// </example>
|
||||
/// </remark>
|
||||
static bool IsColumnExists(string columnName, DataTable schemaTable)
|
||||
{
|
||||
foreach (DataRow row in schemaTable.Rows)
|
||||
{
|
||||
if (String.Compare(row[0].ToString(), columnName, StringComparison.OrdinalIgnoreCase) == 0)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
|
@ -0,0 +1,196 @@
|
|||
// Copyright (c) 2011, 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.Threading;
|
||||
using System.Diagnostics;
|
||||
using System.Security;
|
||||
using System.Security.Principal;
|
||||
using System.Web;
|
||||
using WebsitePanel.Providers.Common;
|
||||
|
||||
namespace WebsitePanel.EnterpriseServer
|
||||
{
|
||||
/// <summary>
|
||||
/// Provides security utilities.
|
||||
/// </summary>
|
||||
public class SecurityContext
|
||||
{
|
||||
public const string ROLE_ADMINISTRATOR = "Administrator";
|
||||
public const string ROLE_RESELLER = "Reseller";
|
||||
public const string ROLE_USER = "User";
|
||||
|
||||
public const string CONTEXT_USER_INFO = "CONTEXT_USER_INFO";
|
||||
|
||||
public static void SetThreadPrincipal(int userId)
|
||||
{
|
||||
UserInfo user = UserController.GetUserInternally(userId);
|
||||
if (user == null)
|
||||
throw new Exception(String.Format("User '{0}' can not be loaded", userId));
|
||||
|
||||
SetThreadPrincipal(user);
|
||||
}
|
||||
|
||||
public static void SetThreadPrincipal(UserInfo user)
|
||||
{
|
||||
// set roles array
|
||||
List<string> roles = new List<string>();
|
||||
roles.Add(SecurityContext.ROLE_USER);
|
||||
if (user.Role == UserRole.Reseller || user.Role == UserRole.Administrator)
|
||||
roles.Add(SecurityContext.ROLE_RESELLER);
|
||||
if (user.Role == UserRole.Administrator)
|
||||
roles.Add(SecurityContext.ROLE_ADMINISTRATOR);
|
||||
|
||||
// create a new generic principal/identity and place them to context
|
||||
EnterpriseServerIdentity identity = new EnterpriseServerIdentity(user.UserId.ToString());
|
||||
EnterpriseServerPrincipal principal = new EnterpriseServerPrincipal(identity, roles.ToArray());
|
||||
|
||||
principal.UserId = user.UserId;
|
||||
principal.OwnerId = user.OwnerId;
|
||||
principal.IsPeer = user.IsPeer;
|
||||
principal.IsDemo = user.IsDemo;
|
||||
principal.Status = user.Status;
|
||||
|
||||
Thread.CurrentPrincipal = principal;
|
||||
}
|
||||
|
||||
public static void SetThreadSupervisorPrincipal()
|
||||
{
|
||||
UserInfo user = new UserInfo();
|
||||
user.UserId = -1;
|
||||
user.OwnerId = 0;
|
||||
user.IsPeer = false;
|
||||
user.IsDemo = false;
|
||||
user.Status = UserStatus.Active;
|
||||
user.Role = UserRole.Administrator;
|
||||
|
||||
SetThreadPrincipal(user);
|
||||
}
|
||||
|
||||
public static EnterpriseServerPrincipal User
|
||||
{
|
||||
get
|
||||
{
|
||||
EnterpriseServerPrincipal principal = Thread.CurrentPrincipal as EnterpriseServerPrincipal;
|
||||
if(principal != null)
|
||||
return principal;
|
||||
|
||||
// Username Token Manager was unable to set principal
|
||||
// or authentication is disabled
|
||||
// create supervisor principal
|
||||
SetThreadSupervisorPrincipal();
|
||||
|
||||
return (EnterpriseServerPrincipal)Thread.CurrentPrincipal;
|
||||
}
|
||||
}
|
||||
|
||||
public static bool CheckAccount(ResultObject res, DemandAccount demand)
|
||||
{
|
||||
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive);
|
||||
if (accountCheck < 0)
|
||||
{
|
||||
res.ErrorCodes.Add(BusinessErrorCodes.ToText(accountCheck));
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public static int CheckAccount(DemandAccount demand)
|
||||
{
|
||||
if ((demand & DemandAccount.NotDemo) == DemandAccount.NotDemo)
|
||||
{
|
||||
// should make a check if the account is not in demo mode
|
||||
if (User.IsDemo)
|
||||
return BusinessErrorCodes.ERROR_USER_ACCOUNT_DEMO;
|
||||
}
|
||||
|
||||
if ((demand & DemandAccount.IsActive) == DemandAccount.IsActive)
|
||||
{
|
||||
// check is the account is active
|
||||
if (User.Status == UserStatus.Pending)
|
||||
return BusinessErrorCodes.ERROR_USER_ACCOUNT_PENDING;
|
||||
else if (User.Status == UserStatus.Suspended)
|
||||
return BusinessErrorCodes.ERROR_USER_ACCOUNT_SUSPENDED;
|
||||
else if (User.Status == UserStatus.Cancelled)
|
||||
return BusinessErrorCodes.ERROR_USER_ACCOUNT_CANCELLED;
|
||||
}
|
||||
|
||||
if ((demand & DemandAccount.IsAdmin) == DemandAccount.IsAdmin)
|
||||
{
|
||||
// should make a check if the account has Admin role
|
||||
if (!User.IsInRole(ROLE_ADMINISTRATOR))
|
||||
return BusinessErrorCodes.ERROR_USER_ACCOUNT_SHOULD_BE_ADMINISTRATOR;
|
||||
}
|
||||
|
||||
if ((demand & DemandAccount.IsReseller) == DemandAccount.IsReseller)
|
||||
{
|
||||
// should make a check if the account has Admin role
|
||||
if (!User.IsInRole(ROLE_RESELLER))
|
||||
return BusinessErrorCodes.ERROR_USER_ACCOUNT_SHOULD_BE_RESELLER;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
public static bool CheckPackage(ResultObject res, int packageId, DemandPackage demand)
|
||||
{
|
||||
int packageCheck = SecurityContext.CheckPackage(packageId, DemandPackage.IsActive);
|
||||
if (packageCheck < 0)
|
||||
{
|
||||
res.ErrorCodes.Add(BusinessErrorCodes.ToText(packageCheck));
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
public static int CheckPackage(int packageId, DemandPackage demand)
|
||||
{
|
||||
// load package
|
||||
PackageInfo package = PackageController.GetPackage(packageId);
|
||||
if (package == null)
|
||||
return BusinessErrorCodes.ERROR_PACKAGE_NOT_FOUND;
|
||||
|
||||
return CheckPackage(package, demand);
|
||||
}
|
||||
|
||||
public static int CheckPackage(PackageInfo package, DemandPackage demand)
|
||||
{
|
||||
if ((demand & DemandPackage.IsActive) == DemandPackage.IsActive)
|
||||
{
|
||||
// should make a check if the package is active
|
||||
if (package.StatusId == (int)PackageStatus.Cancelled)
|
||||
return BusinessErrorCodes.ERROR_PACKAGE_CANCELLED;
|
||||
else if (package.StatusId == (int)PackageStatus.Suspended)
|
||||
return BusinessErrorCodes.ERROR_PACKAGE_SUSPENDED;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,119 @@
|
|||
// Copyright (c) 2011, 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.DirectoryServices;
|
||||
using System.Collections;
|
||||
using System.Collections.Specialized;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
using Microsoft.Web.Services3;
|
||||
using WebsitePanel.Server.Client;
|
||||
|
||||
namespace WebsitePanel.EnterpriseServer
|
||||
{
|
||||
public class ServiceProviderProxy
|
||||
{
|
||||
public static WebServicesClientProtocol Init(WebServicesClientProtocol proxy, int serviceId)
|
||||
{
|
||||
ServerProxyConfigurator cnfg = new ServerProxyConfigurator();
|
||||
|
||||
// get service
|
||||
ServiceInfo service = ServerController.GetServiceInfo(serviceId);
|
||||
|
||||
if (service == null)
|
||||
throw new Exception(String.Format("Service with ID {0} was not found", serviceId));
|
||||
|
||||
// set service settings
|
||||
StringDictionary serviceSettings = ServerController.GetServiceSettings(serviceId);
|
||||
foreach (string key in serviceSettings.Keys)
|
||||
cnfg.ProviderSettings.Settings[key] = serviceSettings[key];
|
||||
|
||||
// get provider
|
||||
ProviderInfo provider = ServerController.GetProvider(service.ProviderId);
|
||||
cnfg.ProviderSettings.ProviderGroupID = provider.GroupId;
|
||||
cnfg.ProviderSettings.ProviderCode = provider.ProviderName;
|
||||
cnfg.ProviderSettings.ProviderName = provider.DisplayName;
|
||||
cnfg.ProviderSettings.ProviderType = provider.ProviderType;
|
||||
|
||||
// init service on the server level
|
||||
return ServerInit(proxy, cnfg, service.ServerId);
|
||||
}
|
||||
|
||||
public static WebServicesClientProtocol ServerInit(WebServicesClientProtocol proxy, ServerProxyConfigurator cnfg, int serverId)
|
||||
{
|
||||
// get server info
|
||||
ServerInfo server = ServerController.GetServerByIdInternal(serverId);
|
||||
|
||||
if (server == null)
|
||||
throw new Exception(String.Format("Server with ID {0} was not found", serverId));
|
||||
|
||||
// set AD integration settings
|
||||
cnfg.ServerSettings.ADEnabled = server.ADEnabled;
|
||||
cnfg.ServerSettings.ADAuthenticationType = AuthenticationTypes.Secure;
|
||||
try
|
||||
{
|
||||
cnfg.ServerSettings.ADAuthenticationType = (AuthenticationTypes)Enum.Parse(typeof(AuthenticationTypes), server.ADAuthenticationType, true);
|
||||
}
|
||||
catch { /* ignore */ }
|
||||
cnfg.ServerSettings.ADRootDomain = server.ADRootDomain;
|
||||
cnfg.ServerSettings.ADUsername = server.ADUsername;
|
||||
cnfg.ServerSettings.ADPassword = server.ADPassword;
|
||||
|
||||
// set timeout
|
||||
cnfg.Timeout = ConfigSettings.ServerRequestTimeout;
|
||||
|
||||
return ServerInit(proxy, cnfg, server.ServerUrl, server.Password);
|
||||
}
|
||||
|
||||
private static WebServicesClientProtocol ServerInit(WebServicesClientProtocol proxy,
|
||||
ServerProxyConfigurator cnfg, string serverUrl, string serverPassword)
|
||||
{
|
||||
// set URL & password
|
||||
cnfg.ServerUrl = serverUrl;
|
||||
cnfg.ServerPassword = serverPassword;
|
||||
|
||||
// configure proxy!
|
||||
cnfg.Configure(proxy);
|
||||
|
||||
return proxy;
|
||||
}
|
||||
|
||||
public static WebServicesClientProtocol ServerInit(WebServicesClientProtocol proxy,
|
||||
string serverUrl, string serverPassword)
|
||||
{
|
||||
return ServerInit(proxy, new ServerProxyConfigurator(), serverUrl, serverPassword);
|
||||
}
|
||||
|
||||
public static WebServicesClientProtocol ServerInit(WebServicesClientProtocol proxy, int serverId)
|
||||
{
|
||||
return ServerInit(proxy, new ServerProxyConfigurator(), serverId);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,81 @@
|
|||
// Copyright (c) 2011, 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.Threading;
|
||||
using System.Web;
|
||||
using System.Xml;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Security.Principal;
|
||||
using System.Security.Permissions;
|
||||
|
||||
using Microsoft.Web.Services3.Security;
|
||||
using Microsoft.Web.Services3.Security.Tokens;
|
||||
|
||||
namespace WebsitePanel.EnterpriseServer
|
||||
{
|
||||
/// <summary>
|
||||
/// Summary description for UsernameTokenManager.
|
||||
/// </summary>
|
||||
public class ServiceUsernameTokenManager : UsernameTokenManager
|
||||
{
|
||||
/// <summary>
|
||||
/// Constructs an instance of this security token manager.
|
||||
/// </summary>
|
||||
public ServiceUsernameTokenManager()
|
||||
{
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Constructs an instance of this security token manager.
|
||||
/// </summary>
|
||||
/// <param name="nodes">An XmlNodeList containing XML elements from a configuration file.</param>
|
||||
public ServiceUsernameTokenManager(XmlNodeList nodes)
|
||||
: base(nodes)
|
||||
{
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns the password or password equivalent for the username provided.
|
||||
/// </summary>
|
||||
/// <param name="token">The username token</param>
|
||||
/// <returns>The password (or password equivalent) for the username</returns>
|
||||
protected override string AuthenticateToken(UsernameToken token)
|
||||
{
|
||||
// try to load user account
|
||||
UserInfo user = UserController.GetUserInternally(token.Username);
|
||||
if (user == null)
|
||||
return null;
|
||||
|
||||
SecurityContext.SetThreadPrincipal(user);
|
||||
|
||||
return user.Password;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,407 @@
|
|||
// Copyright (c) 2011, 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.Data;
|
||||
using System.Configuration;
|
||||
using System.Xml;
|
||||
using System.Diagnostics;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using System.Web;
|
||||
|
||||
using WSE = Microsoft.Web.Services3.Security;
|
||||
using Microsoft.Web.Services3;
|
||||
using Microsoft.Web.Services3.Design;
|
||||
using Microsoft.Web.Services3.Security;
|
||||
using Microsoft.Web.Services3.Security.Tokens;
|
||||
|
||||
namespace WebsitePanel.EnterpriseServer
|
||||
{
|
||||
public class UsernameAssertion : SecurityPolicyAssertion
|
||||
{
|
||||
#region Public properties
|
||||
private bool signRequest = true;
|
||||
public bool SignRequest
|
||||
{
|
||||
get { return signRequest; }
|
||||
set { signRequest = value; }
|
||||
}
|
||||
|
||||
private bool encryptRequest = true;
|
||||
public bool EncryptRequest
|
||||
{
|
||||
get { return encryptRequest; }
|
||||
set { encryptRequest = value; }
|
||||
}
|
||||
|
||||
private int serverId = 0;
|
||||
public int ServerId
|
||||
{
|
||||
get { return serverId; }
|
||||
set { serverId = value; }
|
||||
}
|
||||
|
||||
private string password;
|
||||
public string Password
|
||||
{
|
||||
get { return password; }
|
||||
set { password = value; }
|
||||
}
|
||||
#endregion
|
||||
|
||||
public UsernameAssertion()
|
||||
{
|
||||
}
|
||||
|
||||
public UsernameAssertion(int serverId, string password)
|
||||
{
|
||||
this.serverId = serverId;
|
||||
this.password = password;
|
||||
}
|
||||
|
||||
public override SoapFilter CreateServiceInputFilter(FilterCreationContext context)
|
||||
{
|
||||
return new ServiceInputFilter(this, context);
|
||||
}
|
||||
|
||||
public override SoapFilter CreateServiceOutputFilter(FilterCreationContext context)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
public override SoapFilter CreateClientInputFilter(FilterCreationContext context)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
public override SoapFilter CreateClientOutputFilter(FilterCreationContext context)
|
||||
{
|
||||
return new ClientOutputFilter(this, context);
|
||||
}
|
||||
|
||||
public override void ReadXml(XmlReader reader, IDictionary<string, Type> extensions)
|
||||
{
|
||||
if (reader == null)
|
||||
throw new ArgumentNullException("reader");
|
||||
if (extensions == null)
|
||||
throw new ArgumentNullException("extensions");
|
||||
|
||||
// find the current extension
|
||||
string tagName = null;
|
||||
foreach (string extName in extensions.Keys)
|
||||
{
|
||||
if (extensions[extName] == typeof(UsernameAssertion))
|
||||
{
|
||||
tagName = extName;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// read the first element (maybe empty)
|
||||
reader.ReadStartElement(tagName);
|
||||
}
|
||||
|
||||
public override void WriteXml(XmlWriter writer)
|
||||
{
|
||||
// Typically this is not needed for custom policies
|
||||
}
|
||||
|
||||
#region ServiceInputFilter
|
||||
public class ServiceInputFilter : ReceiveSecurityFilter
|
||||
{
|
||||
UsernameAssertion parentAssertion;
|
||||
FilterCreationContext filterContext;
|
||||
|
||||
public ServiceInputFilter(UsernameAssertion parentAssertion, FilterCreationContext filterContext)
|
||||
: base(parentAssertion.ServiceActor, false, parentAssertion.ClientActor)
|
||||
{
|
||||
this.parentAssertion = parentAssertion;
|
||||
this.filterContext = filterContext;
|
||||
}
|
||||
|
||||
public override void ValidateMessageSecurity(SoapEnvelope envelope, WSE.Security security)
|
||||
{
|
||||
if (security != null)
|
||||
ProcessWSERequest(envelope, security);
|
||||
//else if (envelope.Header != null)
|
||||
// ProcessSoapRequest(envelope);
|
||||
else// if (HttpContext.Current.Request.Headers["Authorization"] != null)
|
||||
ProcessBasicAuthRequest();
|
||||
}
|
||||
|
||||
private void ProcessBasicAuthRequest()
|
||||
{
|
||||
string authStr = HttpContext.Current.Request.Headers["Authorization"];
|
||||
|
||||
if (authStr == null || authStr.Length == 0)
|
||||
{
|
||||
// No credentials; anonymous request
|
||||
DenyAccess();
|
||||
return;
|
||||
}
|
||||
|
||||
authStr = authStr.Trim();
|
||||
if (authStr.IndexOf("Basic", 0) != 0)
|
||||
{
|
||||
// Don't understand this header...we'll pass it along and
|
||||
// assume someone else will handle it
|
||||
DenyAccess();
|
||||
return;
|
||||
}
|
||||
|
||||
string encodedCredentials = authStr.Substring(6);
|
||||
|
||||
byte[] decodedBytes = Convert.FromBase64String(encodedCredentials);
|
||||
string s = new ASCIIEncoding().GetString(decodedBytes);
|
||||
|
||||
string[] userPass = s.Split(new char[] { ':' });
|
||||
string username = userPass[0];
|
||||
string password = userPass[1];
|
||||
|
||||
UserInfo user = UserController.GetUserByUsernamePassword(
|
||||
username, password, System.Web.HttpContext.Current.Request.UserHostAddress);
|
||||
|
||||
if (user == null)
|
||||
{
|
||||
// Invalid credentials; deny access
|
||||
DenyAccess();
|
||||
return;
|
||||
|
||||
//throw new Exception("Wrong BASIC credentials have been supplied");
|
||||
}
|
||||
|
||||
SecurityContext.SetThreadPrincipal(user);
|
||||
}
|
||||
|
||||
private void DenyAccess()
|
||||
{
|
||||
HttpResponse response = HttpContext.Current.Response;
|
||||
response.Clear();
|
||||
response.StatusCode = 401;
|
||||
response.StatusDescription = "Access Denied";
|
||||
response.Write("401 Access Denied");
|
||||
string realm = "WebsitePanel Enterprise Server";
|
||||
string val = String.Format("Basic Realm=\"{0}\"", realm);
|
||||
response.AppendHeader("WWW-Authenticate", val);
|
||||
response.End();
|
||||
}
|
||||
|
||||
private void ProcessSoapRequest(SoapEnvelope envelope)
|
||||
{
|
||||
XmlNode authNode = envelope.Header.SelectSingleNode("Authentication");
|
||||
|
||||
if (authNode == null)
|
||||
throw new Exception("Couldn't find authentication token specified");
|
||||
|
||||
XmlNode userNode = authNode.SelectSingleNode("Username");
|
||||
XmlNode passwordNode = authNode.SelectSingleNode("Password");
|
||||
|
||||
if (userNode == null || passwordNode == null)
|
||||
throw new Exception("Authentication token is invalid or broken");
|
||||
|
||||
UserInfo user = UserController.GetUserByUsernamePassword(
|
||||
userNode.InnerText,
|
||||
passwordNode.InnerText,
|
||||
System.Web.HttpContext.Current.Request.UserHostAddress
|
||||
);
|
||||
|
||||
if (user == null)
|
||||
throw new Exception("Authentication token is invalid or borken");
|
||||
|
||||
SecurityContext.SetThreadPrincipal(user);
|
||||
}
|
||||
|
||||
private void ProcessWSERequest(SoapEnvelope envelope, WSE.Security security)
|
||||
{
|
||||
// by default we consider that SOAP messages is not signed
|
||||
bool IsSigned = false;
|
||||
|
||||
// if security element is null
|
||||
// the call is made not from WSE-enabled client
|
||||
if (security != null)
|
||||
{
|
||||
foreach (ISecurityElement element in security.Elements)
|
||||
{
|
||||
if (element is MessageSignature)
|
||||
{
|
||||
// The given context contains a Signature element.
|
||||
MessageSignature sign = element as MessageSignature;
|
||||
|
||||
if (CheckSignature(envelope, security, sign))
|
||||
{
|
||||
// The SOAP message is signed.
|
||||
if (sign.SigningToken is UsernameToken)
|
||||
{
|
||||
UsernameToken token = sign.SigningToken as UsernameToken;
|
||||
|
||||
// The SOAP message is signed
|
||||
// with a UsernameToken.
|
||||
IsSigned = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// throw an exception if the message did not pass all the tests
|
||||
if (!IsSigned)
|
||||
throw new SecurityFault("SOAP response should be signed.");
|
||||
|
||||
// check encryption
|
||||
bool IsEncrypted = false;
|
||||
foreach (ISecurityElement element in security.Elements)
|
||||
{
|
||||
if (element is EncryptedData)
|
||||
{
|
||||
EncryptedData encryptedData = element as EncryptedData;
|
||||
System.Xml.XmlElement targetElement = encryptedData.TargetElement;
|
||||
|
||||
if (SoapHelper.IsBodyElement(targetElement))
|
||||
{
|
||||
// The given SOAP message has the Body element Encrypted.
|
||||
IsEncrypted = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!IsEncrypted)
|
||||
throw new SecurityFault("SOAP response should be encrypted.");
|
||||
}
|
||||
|
||||
private bool CheckSignature(SoapEnvelope envelope, WSE.Security security, MessageSignature signature)
|
||||
{
|
||||
//
|
||||
// Now verify which parts of the message were actually signed.
|
||||
//
|
||||
SignatureOptions actualOptions = signature.SignatureOptions;
|
||||
SignatureOptions expectedOptions = SignatureOptions.IncludeSoapBody;
|
||||
|
||||
if (security != null && security.Timestamp != null)
|
||||
expectedOptions |= SignatureOptions.IncludeTimestamp;
|
||||
|
||||
//
|
||||
// The <Action> and <To> are required addressing elements.
|
||||
//
|
||||
expectedOptions |= SignatureOptions.IncludeAction;
|
||||
expectedOptions |= SignatureOptions.IncludeTo;
|
||||
|
||||
if (envelope.Context.Addressing.FaultTo != null && envelope.Context.Addressing.FaultTo.TargetElement != null)
|
||||
expectedOptions |= SignatureOptions.IncludeFaultTo;
|
||||
|
||||
if (envelope.Context.Addressing.From != null && envelope.Context.Addressing.From.TargetElement != null)
|
||||
expectedOptions |= SignatureOptions.IncludeFrom;
|
||||
|
||||
if (envelope.Context.Addressing.MessageID != null && envelope.Context.Addressing.MessageID.TargetElement != null)
|
||||
expectedOptions |= SignatureOptions.IncludeMessageId;
|
||||
|
||||
if (envelope.Context.Addressing.RelatesTo != null && envelope.Context.Addressing.RelatesTo.TargetElement != null)
|
||||
expectedOptions |= SignatureOptions.IncludeRelatesTo;
|
||||
|
||||
if (envelope.Context.Addressing.ReplyTo != null && envelope.Context.Addressing.ReplyTo.TargetElement != null)
|
||||
expectedOptions |= SignatureOptions.IncludeReplyTo;
|
||||
//
|
||||
// Check if the all the expected options are the present.
|
||||
//
|
||||
return ((expectedOptions & actualOptions) == expectedOptions);
|
||||
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region ClientOutputFilter
|
||||
public class ClientOutputFilter : SendSecurityFilter
|
||||
{
|
||||
UsernameAssertion parentAssertion;
|
||||
FilterCreationContext filterContext;
|
||||
|
||||
public ClientOutputFilter(UsernameAssertion parentAssertion, FilterCreationContext filterContext)
|
||||
: base(parentAssertion.ServiceActor, false, parentAssertion.ClientActor)
|
||||
{
|
||||
this.parentAssertion = parentAssertion;
|
||||
this.filterContext = filterContext;
|
||||
}
|
||||
|
||||
public override void SecureMessage(SoapEnvelope envelope, WSE.Security security)
|
||||
{
|
||||
// get server password from database
|
||||
string password = parentAssertion.Password;
|
||||
|
||||
if (password == null)
|
||||
return;
|
||||
|
||||
// hash password
|
||||
password = CryptoUtils.SHA1(password);
|
||||
|
||||
// create username token
|
||||
UsernameToken userToken = new UsernameToken(parentAssertion.ServerId.ToString(), password,
|
||||
PasswordOption.SendNone);
|
||||
|
||||
if (parentAssertion.signRequest || parentAssertion.encryptRequest)
|
||||
{
|
||||
// Add the token to the SOAP header.
|
||||
security.Tokens.Add(userToken);
|
||||
}
|
||||
|
||||
if (parentAssertion.signRequest)
|
||||
{
|
||||
// Sign the SOAP message by using the UsernameToken.
|
||||
MessageSignature sig = new MessageSignature(userToken);
|
||||
security.Elements.Add(sig);
|
||||
}
|
||||
|
||||
if (parentAssertion.encryptRequest)
|
||||
{
|
||||
// we don't return any custom SOAP headers
|
||||
// so, just encrypt a message Body
|
||||
EncryptedData data = new EncryptedData(userToken);
|
||||
|
||||
// encrypt custom headers
|
||||
for (int index = 0; index < envelope.Header.ChildNodes.Count; index++)
|
||||
{
|
||||
XmlElement child = envelope.Header.ChildNodes[index] as XmlElement;
|
||||
|
||||
// find all SecureSoapHeader headers marked with a special attribute
|
||||
if (child != null && child.NamespaceURI == "http://com/websitepanel/server/")
|
||||
{
|
||||
// create ID attribute for referencing purposes
|
||||
string id = Guid.NewGuid().ToString();
|
||||
child.SetAttribute("Id", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd", id);
|
||||
|
||||
// Create an encryption reference for the custom SOAP header.
|
||||
data.AddReference(new EncryptionReference("#" + id));
|
||||
}
|
||||
}
|
||||
|
||||
security.Elements.Add(data);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
|
@ -0,0 +1,160 @@
|
|||
// Copyright (c) 2011, 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.IO;
|
||||
using System.Data;
|
||||
using System.Collections;
|
||||
using System.Web;
|
||||
using System.Reflection;
|
||||
using System.Text;
|
||||
using System.Globalization;
|
||||
using System.Security.Cryptography;
|
||||
using System.Text.RegularExpressions;
|
||||
|
||||
namespace WebsitePanel.EnterpriseServer
|
||||
{
|
||||
/// <summary>
|
||||
/// Summary description for Utils.
|
||||
/// </summary>
|
||||
public class Utils
|
||||
{
|
||||
public static int ParseInt(string val, int defaultValue)
|
||||
{
|
||||
int result = defaultValue;
|
||||
try { result = Int32.Parse(val); }
|
||||
catch { /* do nothing */ }
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
public static bool ParseBool(object val, bool defaultValue)
|
||||
{
|
||||
bool result = defaultValue;
|
||||
try { result = Boolean.Parse(val.ToString()); }
|
||||
catch { /* do nothing */ }
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
public static bool ParseBool(string val, bool defaultValue)
|
||||
{
|
||||
bool result = defaultValue;
|
||||
try { result = Boolean.Parse(val); }
|
||||
catch { /* do nothing */ }
|
||||
return result;
|
||||
}
|
||||
|
||||
public static decimal ParseDecimal(string val, decimal defaultValue)
|
||||
{
|
||||
decimal result = defaultValue;
|
||||
try { result = Decimal.Parse(val); }
|
||||
catch { /* do nothing */ }
|
||||
return result;
|
||||
}
|
||||
|
||||
public static string[] ParseDelimitedString(string str, params char[] delimiter)
|
||||
{
|
||||
if (String.IsNullOrEmpty(str))
|
||||
return new string[] { };
|
||||
|
||||
string[] parts = str.Split(delimiter);
|
||||
ArrayList list = new ArrayList();
|
||||
foreach (string part in parts)
|
||||
if (part.Trim() != "" && !list.Contains(part.Trim()))
|
||||
list.Add(part);
|
||||
return (string[])list.ToArray(typeof(string));
|
||||
}
|
||||
|
||||
public static string ReplaceStringVariable(string str, string variable, string value)
|
||||
{
|
||||
if (String.IsNullOrEmpty(str) || String.IsNullOrEmpty(value))
|
||||
return str;
|
||||
|
||||
Regex re = new Regex("\\[" + variable + "\\]+", RegexOptions.IgnoreCase);
|
||||
return re.Replace(str, value);
|
||||
}
|
||||
|
||||
public static string CleanIdentifier(string str)
|
||||
{
|
||||
if (String.IsNullOrEmpty(str))
|
||||
return str;
|
||||
|
||||
return Regex.Replace(str, "\\W", "_");
|
||||
}
|
||||
|
||||
public static string GetRandomHexString(int length)
|
||||
{
|
||||
byte[] buf = new byte[length];
|
||||
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
|
||||
rng.GetBytes(buf);
|
||||
|
||||
StringBuilder sb = new StringBuilder();
|
||||
for(int i = 0; i < length; i++)
|
||||
sb.AppendFormat("{0:X2}", buf[i]);
|
||||
|
||||
return sb.ToString();
|
||||
}
|
||||
|
||||
public static string GetRandomString(int length)
|
||||
{
|
||||
string ptrn = "abcdefghjklmnpqrstwxyzABCDEFGHJKLMNPQRSTWXYZ0123456789";
|
||||
StringBuilder sb = new StringBuilder();
|
||||
|
||||
byte[] randomBytes = new byte[4];
|
||||
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
|
||||
rng.GetBytes(randomBytes);
|
||||
|
||||
// Convert 4 bytes into a 32-bit integer value.
|
||||
int seed = (randomBytes[0] & 0x7f) << 24 |
|
||||
randomBytes[1] << 16 |
|
||||
randomBytes[2] << 8 |
|
||||
randomBytes[3];
|
||||
|
||||
|
||||
Random rnd = new Random(seed);
|
||||
|
||||
for (int i = 0; i < length; i++)
|
||||
sb.Append(ptrn[rnd.Next(ptrn.Length - 1)]);
|
||||
|
||||
return sb.ToString();
|
||||
}
|
||||
|
||||
public static DateTime ParseDate(object value)
|
||||
{
|
||||
try
|
||||
{
|
||||
return (DateTime) value;
|
||||
}
|
||||
catch(Exception )
|
||||
{
|
||||
return DateTime.MinValue;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
@ -0,0 +1,981 @@
|
|||
// Copyright (c) 2011, 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.IO;
|
||||
using System.Data;
|
||||
using System.Collections.Specialized;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using System.Linq;
|
||||
using System.Linq.Expressions;
|
||||
using System.Xml;
|
||||
using System.Xml.Serialization;
|
||||
using System.Web;
|
||||
|
||||
using WebsitePanel.Providers;
|
||||
using WebsitePanel.Providers.Database;
|
||||
using WebsitePanel.Providers.Common;
|
||||
using WebsitePanel.Providers.ResultObjects;
|
||||
|
||||
namespace WebsitePanel.EnterpriseServer
|
||||
{
|
||||
public class DatabaseServerController : IImportController, IBackupController
|
||||
{
|
||||
private const int FILE_BUFFER_LENGTH = 5000000; // ~5MB
|
||||
|
||||
public static DatabaseServer GetDatabaseServer(int serviceId)
|
||||
{
|
||||
DatabaseServer db = new DatabaseServer();
|
||||
ServiceProviderProxy.Init(db, serviceId);
|
||||
return db;
|
||||
}
|
||||
|
||||
#region Databases
|
||||
public static DataSet GetRawSqlDatabasesPaged(int packageId,
|
||||
string groupName, string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows)
|
||||
{
|
||||
return PackageController.GetRawPackageItemsPaged(packageId, groupName, typeof(SqlDatabase),
|
||||
true, filterColumn, filterValue, sortColumn, startRow, maximumRows);
|
||||
}
|
||||
|
||||
public static List<SqlDatabase> GetSqlDatabases(int packageId, string groupName, bool recursive)
|
||||
{
|
||||
List<ServiceProviderItem> items = PackageController.GetPackageItemsByType(
|
||||
packageId, groupName, typeof(SqlDatabase), recursive);
|
||||
|
||||
return items.ConvertAll<SqlDatabase>(
|
||||
new Converter<ServiceProviderItem, SqlDatabase>(ConvertItemToSqlDatabase));
|
||||
}
|
||||
|
||||
private static SqlDatabase ConvertItemToSqlDatabase(ServiceProviderItem item)
|
||||
{
|
||||
return (SqlDatabase)item;
|
||||
}
|
||||
|
||||
public static SqlDatabase GetSqlDatabase(int itemId)
|
||||
{
|
||||
// load meta item
|
||||
SqlDatabase item = (SqlDatabase)PackageController.GetPackageItem(itemId);
|
||||
|
||||
// load service item
|
||||
DatabaseServer sql = GetDatabaseServer(item.ServiceId);
|
||||
SqlDatabase database = sql.GetDatabase(item.Name);
|
||||
|
||||
if (database == null)
|
||||
return item;
|
||||
|
||||
// add common properties
|
||||
database.Id = item.Id;
|
||||
database.PackageId = item.PackageId;
|
||||
database.ServiceId = item.ServiceId;
|
||||
database.GroupName = item.GroupName;
|
||||
|
||||
return database;
|
||||
}
|
||||
|
||||
public static int AddSqlDatabase(SqlDatabase item, string groupName)
|
||||
{
|
||||
// check account
|
||||
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive);
|
||||
if (accountCheck < 0) return accountCheck;
|
||||
|
||||
// check package
|
||||
int packageCheck = SecurityContext.CheckPackage(item.PackageId, DemandPackage.IsActive);
|
||||
if (packageCheck < 0) return packageCheck;
|
||||
|
||||
// check quota
|
||||
QuotaValueInfo quota = PackageController.GetPackageQuota(item.PackageId, groupName + ".Databases");
|
||||
if (quota.QuotaExhausted)
|
||||
return BusinessErrorCodes.ERROR_MSSQL_DATABASES_RESOURCE_QUOTA_LIMIT;
|
||||
|
||||
// check if mail resource is available
|
||||
int serviceId = PackageController.GetPackageServiceId(item.PackageId, groupName);
|
||||
if (serviceId == 0)
|
||||
return BusinessErrorCodes.ERROR_MSSQL_RESOURCE_UNAVAILABLE;
|
||||
|
||||
// check package items
|
||||
if (PackageController.GetPackageItemByName(item.PackageId, groupName, item.Name, typeof(SqlDatabase)) != null)
|
||||
return BusinessErrorCodes.ERROR_MSSQL_DATABASES_PACKAGE_ITEM_EXISTS;
|
||||
|
||||
// place log record
|
||||
TaskManager.StartTask("SQL_DATABASE", "ADD", item.Name);
|
||||
TaskManager.WriteParameter("Provider", groupName);
|
||||
|
||||
int itemId = default(int);
|
||||
//
|
||||
try
|
||||
{
|
||||
// check service items
|
||||
DatabaseServer sql = GetDatabaseServer(serviceId);
|
||||
if (sql.DatabaseExists(item.Name))
|
||||
return BusinessErrorCodes.ERROR_MSSQL_DATABASES_SERVICE_ITEM_EXISTS;
|
||||
|
||||
// calculate database location
|
||||
StringDictionary settings = ServerController.GetServiceSettings(serviceId);
|
||||
UserInfo user = PackageController.GetPackageOwner(item.PackageId);
|
||||
if (settings["UseDefaultDatabaseLocation"] != null &&
|
||||
!Utils.ParseBool(settings["UseDefaultDatabaseLocation"], false))
|
||||
{
|
||||
item.Location = Utils.ReplaceStringVariable(settings["DatabaseLocation"], "user_name", user.Username);
|
||||
}
|
||||
|
||||
// set database size
|
||||
item.DataSize = GetMaxDatabaseSize(item.PackageId, groupName);
|
||||
|
||||
|
||||
// set log size
|
||||
item.LogSize = GetMaxLogSize(item.PackageId, groupName);
|
||||
|
||||
// add service item
|
||||
sql.CreateDatabase(item);
|
||||
|
||||
// save item
|
||||
item.ServiceId = serviceId;
|
||||
itemId = PackageController.AddPackageItem(item);
|
||||
|
||||
TaskManager.ItemId = itemId;
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.WriteError(ex);
|
||||
//
|
||||
if (ex.Message.Contains("INVALID_DATABASE_NAME"))
|
||||
return BusinessErrorCodes.ERROR_MYSQL_INVALID_DATABASE_NAME;
|
||||
// Return a generic error instead of default(int)
|
||||
itemId = BusinessErrorCodes.FAILED_EXECUTE_SERVICE_OPERATION;
|
||||
}
|
||||
finally
|
||||
{
|
||||
TaskManager.CompleteTask();
|
||||
}
|
||||
return itemId;
|
||||
}
|
||||
|
||||
public static int UpdateSqlDatabase(SqlDatabase item)
|
||||
{
|
||||
// check account
|
||||
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive);
|
||||
if (accountCheck < 0) return accountCheck;
|
||||
|
||||
// load original meta item
|
||||
SqlDatabase origItem = (SqlDatabase)PackageController.GetPackageItem(item.Id);
|
||||
if (origItem == null)
|
||||
return BusinessErrorCodes.ERROR_MSSQL_DATABASES_PACKAGE_ITEM_NOT_FOUND;
|
||||
|
||||
// check package
|
||||
int packageCheck = SecurityContext.CheckPackage(origItem.PackageId, DemandPackage.IsActive);
|
||||
if (packageCheck < 0) return packageCheck;
|
||||
|
||||
// place log record
|
||||
TaskManager.StartTask("SQL_DATABASE", "UPDATE", origItem.Name);
|
||||
TaskManager.ItemId = item.Id;
|
||||
TaskManager.WriteParameter("Provider", origItem.GroupName);
|
||||
|
||||
try
|
||||
{
|
||||
// get service
|
||||
DatabaseServer sql = GetDatabaseServer(origItem.ServiceId);
|
||||
|
||||
// update service item
|
||||
sql.UpdateDatabase(item);
|
||||
return 0;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.WriteError(ex);
|
||||
// Return a generic error instead of re-throwing an exception
|
||||
return BusinessErrorCodes.FAILED_EXECUTE_SERVICE_OPERATION;
|
||||
}
|
||||
finally
|
||||
{
|
||||
TaskManager.CompleteTask();
|
||||
}
|
||||
}
|
||||
|
||||
public static int DeleteSqlDatabase(int itemId)
|
||||
{
|
||||
// check account
|
||||
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo);
|
||||
if (accountCheck < 0) return accountCheck;
|
||||
|
||||
// load original meta item
|
||||
SqlDatabase origItem = (SqlDatabase)PackageController.GetPackageItem(itemId);
|
||||
if (origItem == null)
|
||||
return BusinessErrorCodes.ERROR_MSSQL_DATABASES_PACKAGE_ITEM_NOT_FOUND;
|
||||
|
||||
// place log record
|
||||
TaskManager.StartTask("SQL_DATABASE", "DELETE", origItem.Name);
|
||||
TaskManager.ItemId = itemId;
|
||||
TaskManager.WriteParameter("Provider", origItem.GroupName);
|
||||
|
||||
try
|
||||
{
|
||||
// get service
|
||||
DatabaseServer sql = GetDatabaseServer(origItem.ServiceId);
|
||||
|
||||
// delete service item
|
||||
sql.DeleteDatabase(origItem.Name);
|
||||
|
||||
// delete meta item
|
||||
PackageController.DeletePackageItem(origItem.Id);
|
||||
|
||||
return 0;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.WriteError(ex);
|
||||
// Return a generic error instead of re-throwing an exception
|
||||
return BusinessErrorCodes.FAILED_EXECUTE_SERVICE_OPERATION;
|
||||
}
|
||||
finally
|
||||
{
|
||||
TaskManager.CompleteTask();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private static int GetMaxSize(int packageId, string groupName, string prefix)
|
||||
{
|
||||
// load package context
|
||||
int maxSize = 0; // unlimited
|
||||
string quotaName = groupName + prefix;
|
||||
PackageContext cntx = PackageController.GetPackageContext(packageId);
|
||||
if (cntx != null && cntx.Quotas.ContainsKey(quotaName))
|
||||
{
|
||||
maxSize = cntx.Quotas[quotaName].QuotaAllocatedValue;
|
||||
if (maxSize == -1)
|
||||
maxSize = 0;
|
||||
}
|
||||
return maxSize;
|
||||
}
|
||||
|
||||
private static int GetMaxDatabaseSize(int packageId, string groupName)
|
||||
{
|
||||
return GetMaxSize(packageId, groupName, ".MaxDatabaseSize");
|
||||
}
|
||||
|
||||
private static int GetMaxLogSize(int packageId, string groupName)
|
||||
{
|
||||
return GetMaxSize(packageId, groupName, ".MaxLogSize");
|
||||
}
|
||||
|
||||
public static string BackupSqlDatabase(int itemId, string backupName,
|
||||
bool zipBackup, bool download, string folderName)
|
||||
{
|
||||
// check account
|
||||
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo);
|
||||
if (accountCheck < 0) return null;
|
||||
|
||||
// load original meta item
|
||||
SqlDatabase item = (SqlDatabase)PackageController.GetPackageItem(itemId);
|
||||
if (item == null)
|
||||
return null;
|
||||
|
||||
// place log record
|
||||
TaskManager.StartTask("SQL_DATABASE", "BACKUP", item.Name);
|
||||
TaskManager.ItemId = itemId;
|
||||
|
||||
try
|
||||
{
|
||||
DatabaseServer sql = GetDatabaseServer(item.ServiceId);
|
||||
string backFile = sql.BackupDatabase(item.Name, backupName, zipBackup);
|
||||
|
||||
if (!download)
|
||||
{
|
||||
// copy backup files to space folder
|
||||
string relFolderName = FilesController.CorrectRelativePath(folderName);
|
||||
if (!relFolderName.EndsWith("\\"))
|
||||
relFolderName = relFolderName + "\\";
|
||||
|
||||
// create backup folder if not exists
|
||||
if (!FilesController.DirectoryExists(item.PackageId, relFolderName))
|
||||
FilesController.CreateFolder(item.PackageId, relFolderName);
|
||||
|
||||
string packageFile = relFolderName + Path.GetFileName(backFile);
|
||||
|
||||
// delete destination file if exists
|
||||
if (FilesController.FileExists(item.PackageId, packageFile))
|
||||
FilesController.DeleteFiles(item.PackageId, new string[] { packageFile });
|
||||
|
||||
byte[] buffer = null;
|
||||
|
||||
int offset = 0;
|
||||
do
|
||||
{
|
||||
// read remote content
|
||||
buffer = sql.GetTempFileBinaryChunk(backFile, offset, FILE_BUFFER_LENGTH);
|
||||
|
||||
// write remote content
|
||||
FilesController.AppendFileBinaryChunk(item.PackageId, packageFile, buffer);
|
||||
|
||||
offset += FILE_BUFFER_LENGTH;
|
||||
}
|
||||
while (buffer.Length == FILE_BUFFER_LENGTH);
|
||||
|
||||
}
|
||||
|
||||
return backFile;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw TaskManager.WriteError(ex);
|
||||
}
|
||||
finally
|
||||
{
|
||||
TaskManager.CompleteTask();
|
||||
}
|
||||
}
|
||||
|
||||
public static byte[] GetSqlBackupBinaryChunk(int itemId, string path, int offset, int length)
|
||||
{
|
||||
// load original meta item
|
||||
SqlDatabase item = (SqlDatabase)PackageController.GetPackageItem(itemId);
|
||||
if (item == null)
|
||||
return null;
|
||||
|
||||
DatabaseServer sql = GetDatabaseServer(item.ServiceId);
|
||||
|
||||
return sql.GetTempFileBinaryChunk(path, offset, length);
|
||||
}
|
||||
|
||||
public static string AppendSqlBackupBinaryChunk(int itemId, string fileName, string path, byte[] chunk)
|
||||
{
|
||||
// load original meta item
|
||||
SqlDatabase item = (SqlDatabase)PackageController.GetPackageItem(itemId);
|
||||
if (item == null)
|
||||
return null;
|
||||
|
||||
DatabaseServer sql = GetDatabaseServer(item.ServiceId);
|
||||
return sql.AppendTempFileBinaryChunk(fileName, path, chunk);
|
||||
}
|
||||
|
||||
public static int RestoreSqlDatabase(int itemId, string[] uploadedFiles, string[] packageFiles)
|
||||
{
|
||||
// check account
|
||||
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive);
|
||||
if (accountCheck < 0) return accountCheck;
|
||||
|
||||
// load original meta item
|
||||
SqlDatabase item = (SqlDatabase)PackageController.GetPackageItem(itemId);
|
||||
if (item == null)
|
||||
return BusinessErrorCodes.ERROR_MSSQL_DATABASES_PACKAGE_ITEM_NOT_FOUND;
|
||||
|
||||
// check package
|
||||
int packageCheck = SecurityContext.CheckPackage(item.PackageId, DemandPackage.IsActive);
|
||||
if (packageCheck < 0) return packageCheck;
|
||||
|
||||
// place log record
|
||||
TaskManager.StartTask("SQL_DATABASE", "RESTORE", item.Name);
|
||||
TaskManager.ItemId = itemId;
|
||||
|
||||
try
|
||||
{
|
||||
|
||||
DatabaseServer sql = GetDatabaseServer(item.ServiceId);
|
||||
|
||||
List<string> backupFiles = new List<string>();
|
||||
if (packageFiles != null && packageFiles.Length > 0)
|
||||
{
|
||||
// copy package files to the remote SQL Server
|
||||
foreach (string packageFile in packageFiles)
|
||||
{
|
||||
string path = null;
|
||||
byte[] buffer = null;
|
||||
|
||||
int offset = 0;
|
||||
do
|
||||
{
|
||||
// read package file
|
||||
buffer = FilesController.GetFileBinaryChunk(item.PackageId, packageFile, offset, FILE_BUFFER_LENGTH);
|
||||
|
||||
// write remote backup file
|
||||
string tempPath = sql.AppendTempFileBinaryChunk(Path.GetFileName(packageFile), path, buffer);
|
||||
if (path == null)
|
||||
{
|
||||
path = tempPath;
|
||||
backupFiles.Add(path);
|
||||
}
|
||||
|
||||
offset += FILE_BUFFER_LENGTH;
|
||||
}
|
||||
while (buffer.Length == FILE_BUFFER_LENGTH);
|
||||
}
|
||||
}
|
||||
else if (uploadedFiles != null && uploadedFiles.Length > 0)
|
||||
{
|
||||
// upladed files
|
||||
backupFiles.AddRange(uploadedFiles);
|
||||
}
|
||||
|
||||
// restore
|
||||
if (backupFiles.Count > 0)
|
||||
sql.RestoreDatabase(item.Name, backupFiles.ToArray());
|
||||
|
||||
return 0;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw TaskManager.WriteError(ex);
|
||||
}
|
||||
finally
|
||||
{
|
||||
TaskManager.CompleteTask();
|
||||
}
|
||||
}
|
||||
|
||||
public static int TruncateSqlDatabase(int itemId)
|
||||
{
|
||||
// check account
|
||||
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo);
|
||||
if (accountCheck < 0) return accountCheck;
|
||||
|
||||
// load original meta item
|
||||
SqlDatabase origItem = (SqlDatabase)PackageController.GetPackageItem(itemId);
|
||||
if (origItem == null)
|
||||
return BusinessErrorCodes.ERROR_MSSQL_DATABASES_PACKAGE_ITEM_NOT_FOUND;
|
||||
|
||||
// place log record
|
||||
TaskManager.StartTask("SQL_DATABASE", "TRUNCATE", origItem.Name);
|
||||
TaskManager.ItemId = itemId;
|
||||
|
||||
try
|
||||
{
|
||||
// get service
|
||||
DatabaseServer sql = GetDatabaseServer(origItem.ServiceId);
|
||||
|
||||
// truncate database
|
||||
sql.TruncateDatabase(origItem.Name);
|
||||
|
||||
return 0;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw TaskManager.WriteError(ex);
|
||||
}
|
||||
finally
|
||||
{
|
||||
TaskManager.CompleteTask();
|
||||
}
|
||||
}
|
||||
|
||||
private static string[] GetSqlDatabasesArray(int packageId, string groupName)
|
||||
{
|
||||
List<SqlDatabase> databases = GetSqlDatabases(packageId, groupName, false);
|
||||
string[] arr = new string[databases.Count];
|
||||
for (int i = 0; i < databases.Count; i++)
|
||||
arr[i] = databases[i].Name;
|
||||
|
||||
return arr;
|
||||
}
|
||||
|
||||
public static DatabaseBrowserConfiguration GetDatabaseBrowserConfiguration(int packageId, string groupName)
|
||||
{
|
||||
DatabaseBrowserConfiguration config = new DatabaseBrowserConfiguration();
|
||||
|
||||
int serviceId = PackageController.GetPackageServiceId(packageId, groupName);
|
||||
if (serviceId == 0)
|
||||
return config;
|
||||
|
||||
StringDictionary settings = ServerController.GetServiceSettings(serviceId);
|
||||
config.Enabled = !String.IsNullOrEmpty(settings["BrowseURL"]);
|
||||
|
||||
return config;
|
||||
}
|
||||
|
||||
public static DatabaseBrowserConfiguration GetDatabaseBrowserLogonScript(int packageId,
|
||||
string groupName, string username)
|
||||
{
|
||||
int serviceId = PackageController.GetPackageServiceId(packageId, groupName);
|
||||
if (serviceId == 0)
|
||||
return null;
|
||||
|
||||
StringDictionary settings = ServerController.GetServiceSettings(serviceId);
|
||||
string url = settings["BrowseURL"];
|
||||
string method = settings["BrowseMethod"];
|
||||
string prms = settings["BrowseParameters"];
|
||||
|
||||
DatabaseBrowserConfiguration config = new DatabaseBrowserConfiguration();
|
||||
config.Enabled = !String.IsNullOrEmpty(url);
|
||||
config.Method = method;
|
||||
|
||||
prms = Utils.ReplaceStringVariable(prms, "server", settings["InternalAddress"]);
|
||||
|
||||
// load database user
|
||||
SqlUser user = (SqlUser)PackageController.GetPackageItemByName(packageId, groupName, username, typeof(SqlUser));
|
||||
if (user != null)
|
||||
{
|
||||
prms = Utils.ReplaceStringVariable(prms, "user", username);
|
||||
prms = Utils.ReplaceStringVariable(prms, "password", CryptoUtils.Decrypt(user.Password));
|
||||
|
||||
string[] lines = Utils.ParseDelimitedString(prms, '\n', '\r');
|
||||
|
||||
StringBuilder sb = new StringBuilder();
|
||||
if (String.Compare(method, "get", true) == 0)
|
||||
{
|
||||
// GET
|
||||
sb.Append(url).Append("?");
|
||||
foreach (string line in lines)
|
||||
sb.Append(line).Append("&");
|
||||
|
||||
config.GetData = sb.ToString();
|
||||
}
|
||||
else
|
||||
{
|
||||
// POST
|
||||
sb.Append("<html><body>");
|
||||
sb.Append("<form id=\"AspForm\" method=\"POST\" action=\"").Append(url).Append("\">");
|
||||
|
||||
foreach (string line in lines)
|
||||
{
|
||||
//
|
||||
var indexOfSplit = line.IndexOf('=');
|
||||
//
|
||||
if (indexOfSplit == -1)
|
||||
continue;
|
||||
//
|
||||
sb.Append("<input type=\"hidden\" name=\"").Append(line.Substring(0, indexOfSplit))
|
||||
.Append("\" value=\"").Append(line.Substring(indexOfSplit + 1)).Append("\"></input>");
|
||||
}
|
||||
|
||||
sb.Append("</form><script language=\"javascript\">document.getElementById(\"AspForm\").submit();</script>");
|
||||
sb.Append("</body></html>");
|
||||
|
||||
config.PostData = sb.ToString();
|
||||
}
|
||||
}
|
||||
|
||||
return config;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Users
|
||||
public static DataSet GetRawSqlUsersPaged(int packageId,
|
||||
string groupName, string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows)
|
||||
{
|
||||
return PackageController.GetRawPackageItemsPaged(packageId, groupName, typeof(SqlUser),
|
||||
true, filterColumn, filterValue, sortColumn, startRow, maximumRows);
|
||||
}
|
||||
|
||||
public static List<SqlUser> GetSqlUsers(int packageId, string groupName, bool recursive)
|
||||
{
|
||||
List<ServiceProviderItem> items = PackageController.GetPackageItemsByType(
|
||||
packageId, groupName, typeof(SqlUser), recursive);
|
||||
|
||||
return items.ConvertAll<SqlUser>(
|
||||
new Converter<ServiceProviderItem, SqlUser>(ConvertItemToSqlUser));
|
||||
}
|
||||
|
||||
private static SqlUser ConvertItemToSqlUser(ServiceProviderItem item)
|
||||
{
|
||||
return (SqlUser)item;
|
||||
}
|
||||
|
||||
public static SqlUser GetSqlUser(int itemId)
|
||||
{
|
||||
// load meta item
|
||||
SqlUser item = (SqlUser)PackageController.GetPackageItem(itemId);
|
||||
|
||||
// load service item
|
||||
DatabaseServer sql = GetDatabaseServer(item.ServiceId);
|
||||
SqlUser user = sql.GetUser(item.Name, GetSqlDatabasesArray(item.PackageId, item.GroupName));
|
||||
|
||||
// add common properties
|
||||
user.Id = item.Id;
|
||||
user.PackageId = item.PackageId;
|
||||
user.ServiceId = item.ServiceId;
|
||||
user.Password = CryptoUtils.Decrypt(item.Password);
|
||||
user.GroupName = item.GroupName;
|
||||
|
||||
return user;
|
||||
}
|
||||
|
||||
public static int AddSqlUser(SqlUser item, string groupName)
|
||||
{
|
||||
// check account
|
||||
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive);
|
||||
if (accountCheck < 0) return accountCheck;
|
||||
|
||||
// check package
|
||||
int packageCheck = SecurityContext.CheckPackage(item.PackageId, DemandPackage.IsActive);
|
||||
if (packageCheck < 0) return packageCheck;
|
||||
|
||||
// check quota
|
||||
QuotaValueInfo quota = PackageController.GetPackageQuota(item.PackageId, groupName + ".Users");
|
||||
if (quota.QuotaExhausted)
|
||||
return BusinessErrorCodes.ERROR_MSSQL_USERS_RESOURCE_QUOTA_LIMIT;
|
||||
|
||||
// check if mail resource is available
|
||||
int serviceId = PackageController.GetPackageServiceId(item.PackageId, groupName);
|
||||
if (serviceId == 0)
|
||||
return BusinessErrorCodes.ERROR_MSSQL_RESOURCE_UNAVAILABLE;
|
||||
|
||||
// check package items
|
||||
if (PackageController.GetPackageItemByName(item.PackageId, groupName, item.Name, typeof(SqlUser)) != null)
|
||||
return BusinessErrorCodes.ERROR_MSSQL_USERS_PACKAGE_ITEM_EXISTS;
|
||||
|
||||
// place log record
|
||||
TaskManager.StartTask("SQL_USER", "ADD", item.Name);
|
||||
TaskManager.WriteParameter("Provider", groupName);
|
||||
|
||||
int itemId = default(int);
|
||||
try
|
||||
{
|
||||
// check service items
|
||||
DatabaseServer sql = GetDatabaseServer(serviceId);
|
||||
if (sql.UserExists(item.Name))
|
||||
return BusinessErrorCodes.ERROR_MSSQL_USERS_SERVICE_ITEM_EXISTS;
|
||||
|
||||
// add service item
|
||||
sql.CreateUser(item, item.Password);
|
||||
|
||||
// save item
|
||||
item.Password = CryptoUtils.Encrypt(item.Password);
|
||||
item.ServiceId = serviceId;
|
||||
itemId = PackageController.AddPackageItem(item);
|
||||
|
||||
TaskManager.ItemId = itemId;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.WriteError(ex);
|
||||
//
|
||||
if (ex.Message.Contains("INVALID_USERNAME"))
|
||||
return BusinessErrorCodes.ERROR_MYSQL_INVALID_USER_NAME;
|
||||
// Return a generic error instead of default(int)
|
||||
itemId = BusinessErrorCodes.FAILED_EXECUTE_SERVICE_OPERATION;
|
||||
}
|
||||
finally
|
||||
{
|
||||
TaskManager.CompleteTask();
|
||||
}
|
||||
return itemId;
|
||||
}
|
||||
|
||||
public static int UpdateSqlUser(SqlUser item)
|
||||
{
|
||||
// check account
|
||||
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive);
|
||||
if (accountCheck < 0) return accountCheck;
|
||||
|
||||
// load original meta item
|
||||
SqlUser origItem = (SqlUser)PackageController.GetPackageItem(item.Id);
|
||||
if (origItem == null)
|
||||
return BusinessErrorCodes.ERROR_MSSQL_USERS_PACKAGE_ITEM_NOT_FOUND;
|
||||
|
||||
// check package
|
||||
int packageCheck = SecurityContext.CheckPackage(origItem.PackageId, DemandPackage.IsActive);
|
||||
if (packageCheck < 0) return packageCheck;
|
||||
|
||||
// place log record
|
||||
TaskManager.StartTask("SQL_USER", "UPDATE", origItem.Name);
|
||||
TaskManager.ItemId = item.Id;
|
||||
|
||||
try
|
||||
{
|
||||
// get service
|
||||
DatabaseServer sql = GetDatabaseServer(origItem.ServiceId);
|
||||
|
||||
// update service item
|
||||
sql.UpdateUser(item, GetSqlDatabasesArray(origItem.PackageId, origItem.GroupName));
|
||||
|
||||
// update meta item
|
||||
if (item.Password == "")
|
||||
item.Password = CryptoUtils.Decrypt(origItem.Password);
|
||||
|
||||
item.Password = CryptoUtils.Encrypt(item.Password);
|
||||
PackageController.UpdatePackageItem(item);
|
||||
return 0;
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.WriteError(ex);
|
||||
|
||||
// Return a generic error instead of re-throwing an exception
|
||||
return BusinessErrorCodes.FAILED_EXECUTE_SERVICE_OPERATION;
|
||||
}
|
||||
finally
|
||||
{
|
||||
TaskManager.CompleteTask();
|
||||
}
|
||||
}
|
||||
|
||||
public static int DeleteSqlUser(int itemId)
|
||||
{
|
||||
// check account
|
||||
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo);
|
||||
if (accountCheck < 0) return accountCheck;
|
||||
|
||||
// load original meta item
|
||||
SqlUser origItem = (SqlUser)PackageController.GetPackageItem(itemId);
|
||||
if (origItem == null)
|
||||
return BusinessErrorCodes.ERROR_MSSQL_USERS_PACKAGE_ITEM_NOT_FOUND;
|
||||
|
||||
// place log record
|
||||
TaskManager.StartTask("SQL_USER", "DELETE", origItem.Name);
|
||||
TaskManager.ItemId = itemId;
|
||||
|
||||
try
|
||||
{
|
||||
// get service
|
||||
DatabaseServer sql = GetDatabaseServer(origItem.ServiceId);
|
||||
|
||||
// delete service item
|
||||
sql.DeleteUser(origItem.Name, GetSqlDatabasesArray(origItem.PackageId, origItem.GroupName));
|
||||
|
||||
// delete meta item
|
||||
PackageController.DeletePackageItem(origItem.Id);
|
||||
|
||||
return 0;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.WriteError(ex);
|
||||
// Return a generic error instead of re-throwing an exception
|
||||
return BusinessErrorCodes.FAILED_EXECUTE_SERVICE_OPERATION;
|
||||
}
|
||||
finally
|
||||
{
|
||||
TaskManager.CompleteTask();
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region IImportController Members
|
||||
|
||||
public List<string> GetImportableItems(int packageId, int itemTypeId,
|
||||
Type itemType, ResourceGroupInfo group)
|
||||
{
|
||||
List<string> items = new List<string>();
|
||||
|
||||
// get service id
|
||||
int serviceId = PackageController.GetPackageServiceId(packageId, group.GroupName);
|
||||
if (serviceId == 0)
|
||||
return items;
|
||||
|
||||
DatabaseServer db = GetDatabaseServer(serviceId);
|
||||
if (itemType == typeof(SqlDatabase))
|
||||
items.AddRange(db.GetDatabases());
|
||||
else if (itemType == typeof(SqlUser))
|
||||
items.AddRange(db.GetUsers());
|
||||
|
||||
return items;
|
||||
}
|
||||
|
||||
public void ImportItem(int packageId, int itemTypeId,
|
||||
Type itemType, ResourceGroupInfo group, string itemName)
|
||||
{
|
||||
// get service id
|
||||
int serviceId = PackageController.GetPackageServiceId(packageId, group.GroupName);
|
||||
if (serviceId == 0)
|
||||
return;
|
||||
|
||||
if (itemType == typeof(SqlDatabase))
|
||||
{
|
||||
// import database
|
||||
SqlDatabase db = new SqlDatabase();
|
||||
db.ServiceId = serviceId;
|
||||
db.PackageId = packageId;
|
||||
db.Name = itemName;
|
||||
db.GroupName = group.GroupName;
|
||||
PackageController.AddPackageItem(db);
|
||||
}
|
||||
else if (itemType == typeof(SqlUser))
|
||||
{
|
||||
// import user
|
||||
SqlUser user = new SqlUser();
|
||||
user.ServiceId = serviceId;
|
||||
user.PackageId = packageId;
|
||||
user.Name = itemName;
|
||||
user.GroupName = group.GroupName;
|
||||
user.Password = "";
|
||||
PackageController.AddPackageItem(user);
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region IBackupController Members
|
||||
|
||||
public int BackupItem(string tempFolder, XmlWriter writer, ServiceProviderItem item, ResourceGroupInfo group)
|
||||
{
|
||||
if (item is SqlDatabase)
|
||||
{
|
||||
// backup database
|
||||
DatabaseServer sql = GetDatabaseServer(item.ServiceId);
|
||||
|
||||
string backupName = String.Format("DatabaseBackup_{0}.zip", item.Id);
|
||||
string remoteBackupFile = sql.BackupDatabase(item.Name, backupName, true);
|
||||
|
||||
// download remote backup
|
||||
string localBackupPath = Path.Combine(tempFolder, backupName);
|
||||
|
||||
byte[] buffer = null;
|
||||
FileStream stream = new FileStream(localBackupPath, FileMode.Create, FileAccess.Write);
|
||||
|
||||
int offset = 0;
|
||||
long length = 0;
|
||||
do
|
||||
{
|
||||
// read remote content
|
||||
buffer = sql.GetTempFileBinaryChunk(remoteBackupFile, offset, FILE_BUFFER_LENGTH);
|
||||
|
||||
// write remote content
|
||||
stream.Write(buffer, 0, buffer.Length);
|
||||
|
||||
length += buffer.Length;
|
||||
offset += FILE_BUFFER_LENGTH;
|
||||
}
|
||||
while (buffer.Length == FILE_BUFFER_LENGTH);
|
||||
stream.Close();
|
||||
|
||||
// add file pointer
|
||||
|
||||
BackupController.WriteFileElement(writer, "DatabaseBackup", backupName, length);
|
||||
|
||||
// store meta item
|
||||
SqlDatabase database = sql.GetDatabase(item.Name);
|
||||
XmlSerializer serializer = new XmlSerializer(typeof(SqlDatabase));
|
||||
serializer.Serialize(writer, database);
|
||||
}
|
||||
else if (item is SqlUser)
|
||||
{
|
||||
// backup user
|
||||
DatabaseServer sql = GetDatabaseServer(item.ServiceId);
|
||||
|
||||
SqlUser userItem = item as SqlUser;
|
||||
|
||||
// store user info
|
||||
SqlUser user = sql.GetUser(item.Name, GetSqlDatabasesArray(item.PackageId, item.GroupName));
|
||||
user.Password = userItem.Password;
|
||||
|
||||
XmlSerializer serializer = new XmlSerializer(typeof(SqlUser));
|
||||
serializer.Serialize(writer, user);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
public int RestoreItem(string tempFolder, XmlNode itemNode, int itemId, Type itemType, string itemName, int packageId, int serviceId, ResourceGroupInfo group)
|
||||
{
|
||||
if (itemType == typeof(SqlDatabase))
|
||||
{
|
||||
DatabaseServer sql = GetDatabaseServer(serviceId);
|
||||
|
||||
// extract meta item
|
||||
XmlSerializer serializer = new XmlSerializer(typeof(SqlDatabase));
|
||||
SqlDatabase db = (SqlDatabase)serializer.Deserialize(
|
||||
new XmlNodeReader(itemNode.SelectSingleNode("SqlDatabase")));
|
||||
|
||||
// create database if required
|
||||
if (!sql.DatabaseExists(itemName))
|
||||
{
|
||||
sql.CreateDatabase(db);
|
||||
}
|
||||
|
||||
// copy database backup to remote server
|
||||
XmlNode fileNode = itemNode.SelectSingleNode("File[@name='DatabaseBackup']");
|
||||
string backupFileName = fileNode.Attributes["path"].Value;
|
||||
long backupFileLength = Int64.Parse(fileNode.Attributes["size"].Value);
|
||||
string localBackupFilePath = Path.Combine(tempFolder, backupFileName);
|
||||
|
||||
if (new FileInfo(localBackupFilePath).Length != backupFileLength)
|
||||
return -3;
|
||||
|
||||
FileStream stream = new FileStream(localBackupFilePath, FileMode.Open, FileAccess.Read);
|
||||
byte[] buffer = new byte[FILE_BUFFER_LENGTH];
|
||||
|
||||
int readBytes = 0;
|
||||
long length = 0;
|
||||
string remoteBackupPath = null;
|
||||
do
|
||||
{
|
||||
// read package file
|
||||
readBytes = stream.Read(buffer, 0, FILE_BUFFER_LENGTH);
|
||||
length += readBytes;
|
||||
|
||||
if (readBytes < FILE_BUFFER_LENGTH)
|
||||
// resize buffer
|
||||
Array.Resize<byte>(ref buffer, readBytes);
|
||||
|
||||
// write remote backup file
|
||||
string tempPath = sql.AppendTempFileBinaryChunk(backupFileName, remoteBackupPath, buffer);
|
||||
if (remoteBackupPath == null)
|
||||
remoteBackupPath = tempPath;
|
||||
}
|
||||
while (readBytes == FILE_BUFFER_LENGTH);
|
||||
stream.Close();
|
||||
|
||||
// restore database
|
||||
sql.RestoreDatabase(itemName, new string[] { remoteBackupPath });
|
||||
|
||||
// add meta-item if required
|
||||
if (PackageController.GetPackageItemByName(packageId, group.GroupName,
|
||||
itemName, typeof(SqlDatabase)) == null)
|
||||
{
|
||||
db.PackageId = packageId;
|
||||
db.ServiceId = serviceId;
|
||||
db.GroupName = group.GroupName;
|
||||
PackageController.AddPackageItem(db);
|
||||
}
|
||||
}
|
||||
else if (itemType == typeof(SqlUser))
|
||||
{
|
||||
DatabaseServer sql = GetDatabaseServer(serviceId);
|
||||
|
||||
// extract meta item
|
||||
XmlSerializer serializer = new XmlSerializer(typeof(SqlUser));
|
||||
SqlUser user = (SqlUser)serializer.Deserialize(
|
||||
new XmlNodeReader(itemNode.SelectSingleNode("SqlUser")));
|
||||
|
||||
// create user if required
|
||||
if (!sql.UserExists(itemName))
|
||||
{
|
||||
sql.CreateUser(user, CryptoUtils.Decrypt(user.Password));
|
||||
}
|
||||
|
||||
// add meta-item if required
|
||||
if (PackageController.GetPackageItemByName(packageId, group.GroupName,
|
||||
itemName, typeof(SqlUser)) == null)
|
||||
{
|
||||
user.PackageId = packageId;
|
||||
user.ServiceId = serviceId;
|
||||
user.GroupName = group.GroupName;
|
||||
PackageController.AddPackageItem(user);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
|
@ -0,0 +1,478 @@
|
|||
// Copyright (c) 2011, 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.Collections.Specialized;
|
||||
using System.Xml;
|
||||
using System.Xml.Serialization;
|
||||
using WebsitePanel.Providers;
|
||||
using WebsitePanel.Providers.DNS;
|
||||
|
||||
namespace WebsitePanel.EnterpriseServer
|
||||
{
|
||||
public class DnsServerController : IImportController, IBackupController
|
||||
{
|
||||
private static DNSServer GetDNSServer(int serviceId)
|
||||
{
|
||||
DNSServer dns = new DNSServer();
|
||||
ServiceProviderProxy.Init(dns, serviceId);
|
||||
return dns;
|
||||
}
|
||||
|
||||
public static int AddZone(int packageId, int serviceId, string zoneName)
|
||||
{
|
||||
return AddZone(packageId, serviceId, zoneName, true);
|
||||
}
|
||||
|
||||
public static int AddZone(int packageId, int serviceId, string zoneName, bool addPackageItem)
|
||||
{
|
||||
// get DNS provider
|
||||
DNSServer dns = GetDNSServer(serviceId);
|
||||
|
||||
// check if zone already exists
|
||||
if (dns.ZoneExists(zoneName))
|
||||
return BusinessErrorCodes.ERROR_DNS_ZONE_EXISTS;
|
||||
|
||||
//
|
||||
TaskManager.StartTask("DNS_ZONE", "ADD", zoneName);
|
||||
//
|
||||
int zoneItemId = default(int);
|
||||
//
|
||||
try
|
||||
{
|
||||
// get secondary DNS services
|
||||
StringDictionary primSettings = ServerController.GetServiceSettings(serviceId);
|
||||
string[] primaryIPAddresses = GetExternalIPAddressesFromString(primSettings["ListeningIPAddresses"]);
|
||||
|
||||
List<string> secondaryIPAddresses = new List<string>();
|
||||
List<int> secondaryServiceIds = new List<int>();
|
||||
string strSecondaryServices = primSettings["SecondaryDNSServices"];
|
||||
if (!String.IsNullOrEmpty(strSecondaryServices))
|
||||
{
|
||||
string[] secondaryServices = strSecondaryServices.Split(',');
|
||||
foreach (string strSecondaryId in secondaryServices)
|
||||
{
|
||||
int secondaryId = Utils.ParseInt(strSecondaryId, 0);
|
||||
if (secondaryId == 0)
|
||||
continue;
|
||||
|
||||
secondaryServiceIds.Add(secondaryId);
|
||||
StringDictionary secondarySettings = ServerController.GetServiceSettings(secondaryId);
|
||||
|
||||
// add secondary IPs to the master array
|
||||
secondaryIPAddresses.AddRange(
|
||||
GetExternalIPAddressesFromString(secondarySettings["ListeningIPAddresses"]));
|
||||
}
|
||||
}
|
||||
|
||||
// add "Allow zone transfers"
|
||||
string allowTransfers = primSettings["AllowZoneTransfers"];
|
||||
if (!String.IsNullOrEmpty(allowTransfers))
|
||||
{
|
||||
string[] ips = Utils.ParseDelimitedString(allowTransfers, '\n', ' ', ',', ';');
|
||||
foreach (string ip in ips)
|
||||
{
|
||||
if (!secondaryIPAddresses.Contains(ip))
|
||||
secondaryIPAddresses.Add(ip);
|
||||
}
|
||||
}
|
||||
|
||||
// add primary zone
|
||||
dns.AddPrimaryZone(zoneName, secondaryIPAddresses.ToArray());
|
||||
|
||||
// get DNS zone records
|
||||
List<GlobalDnsRecord> records = ServerController.GetDnsRecordsTotal(packageId);
|
||||
|
||||
// get name servers
|
||||
PackageSettings packageSettings = PackageController.GetPackageSettings(packageId, PackageSettings.NAME_SERVERS);
|
||||
string[] nameServers = new string[] { };
|
||||
if (!String.IsNullOrEmpty(packageSettings["NameServers"]))
|
||||
nameServers = packageSettings["NameServers"].Split(';');
|
||||
|
||||
// build records list
|
||||
List<DnsRecord> zoneRecords = new List<DnsRecord>();
|
||||
|
||||
string primaryNameServer = "ns." + zoneName;
|
||||
|
||||
if (nameServers.Length > 0)
|
||||
primaryNameServer = nameServers[0];
|
||||
|
||||
// update SOA record
|
||||
|
||||
string hostmaster = primSettings["ResponsiblePerson"];
|
||||
if (String.IsNullOrEmpty(hostmaster))
|
||||
{
|
||||
hostmaster = "hostmaster." + zoneName;
|
||||
}
|
||||
else
|
||||
{
|
||||
hostmaster = Utils.ReplaceStringVariable(hostmaster, "domain_name", zoneName);
|
||||
}
|
||||
|
||||
dns.UpdateSoaRecord(zoneName, "", primaryNameServer, hostmaster);
|
||||
|
||||
// add name servers
|
||||
foreach (string nameServer in nameServers)
|
||||
{
|
||||
DnsRecord ns = new DnsRecord();
|
||||
ns.RecordType = DnsRecordType.NS;
|
||||
ns.RecordName = "";
|
||||
ns.RecordData = nameServer;
|
||||
|
||||
zoneRecords.Add(ns);
|
||||
}
|
||||
|
||||
// add all other records
|
||||
zoneRecords.AddRange(
|
||||
BuildDnsResourceRecords(records, zoneName, ""));
|
||||
|
||||
// add zone records
|
||||
dns.AddZoneRecords(zoneName, zoneRecords.ToArray());
|
||||
|
||||
|
||||
// add secondary zones
|
||||
foreach (int secondaryId in secondaryServiceIds)
|
||||
{
|
||||
try
|
||||
{
|
||||
// add secondary zone
|
||||
DNSServer secDns = GetDNSServer(secondaryId);
|
||||
secDns.AddSecondaryZone(zoneName, primaryIPAddresses);
|
||||
RegisterZoneItems(packageId, secondaryId, zoneName, false);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.WriteError(ex, "Error adding secondary zone (service ID = " + secondaryId + ")");
|
||||
}
|
||||
}
|
||||
|
||||
if (!addPackageItem)
|
||||
return 0;
|
||||
// add service item
|
||||
zoneItemId = RegisterZoneItems(packageId, serviceId, zoneName, true);
|
||||
//
|
||||
TaskManager.ItemId = zoneItemId;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.WriteError(ex);
|
||||
}
|
||||
finally
|
||||
{
|
||||
TaskManager.CompleteTask();
|
||||
}
|
||||
//
|
||||
return zoneItemId;
|
||||
}
|
||||
|
||||
|
||||
private static int RegisterZoneItems(int spaceId, int serviceId, string zoneName, bool primaryZone)
|
||||
{
|
||||
// zone item
|
||||
DnsZone zone = primaryZone ? new DnsZone() : new SecondaryDnsZone();
|
||||
zone.Name = zoneName;
|
||||
zone.PackageId = spaceId;
|
||||
zone.ServiceId = serviceId;
|
||||
int zoneItemId = PackageController.AddPackageItem(zone);
|
||||
return zoneItemId;
|
||||
}
|
||||
|
||||
public static int DeleteZone(int zoneItemId)
|
||||
{
|
||||
// delete DNS zone if applicable
|
||||
DnsZone zoneItem = (DnsZone)PackageController.GetPackageItem(zoneItemId);
|
||||
//
|
||||
if (zoneItem != null)
|
||||
{
|
||||
TaskManager.StartTask("DNS_ZONE", "DELETE", zoneItem.Name);
|
||||
//
|
||||
try
|
||||
{
|
||||
//
|
||||
TaskManager.ItemId = zoneItemId;
|
||||
// delete DNS zone
|
||||
DNSServer dns = new DNSServer();
|
||||
ServiceProviderProxy.Init(dns, zoneItem.ServiceId);
|
||||
|
||||
// delete secondary zones
|
||||
StringDictionary primSettings = ServerController.GetServiceSettings(zoneItem.ServiceId);
|
||||
string strSecondaryServices = primSettings["SecondaryDNSServices"];
|
||||
if (!String.IsNullOrEmpty(strSecondaryServices))
|
||||
{
|
||||
string[] secondaryServices = strSecondaryServices.Split(',');
|
||||
foreach (string strSecondaryId in secondaryServices)
|
||||
{
|
||||
try
|
||||
{
|
||||
int secondaryId = Utils.ParseInt(strSecondaryId, 0);
|
||||
if (secondaryId == 0)
|
||||
continue;
|
||||
|
||||
DNSServer secDns = new DNSServer();
|
||||
ServiceProviderProxy.Init(secDns, secondaryId);
|
||||
|
||||
secDns.DeleteZone(zoneItem.Name);
|
||||
}
|
||||
catch (Exception ex1)
|
||||
{
|
||||
// problem when deleting secondary zone
|
||||
TaskManager.WriteError(ex1, "Error deleting secondary DNS zone");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
dns.DeleteZone(zoneItem.Name);
|
||||
}
|
||||
catch (Exception ex2)
|
||||
{
|
||||
TaskManager.WriteError(ex2, "Error deleting primary DNS zone");
|
||||
}
|
||||
|
||||
// delete service item
|
||||
PackageController.DeletePackageItem(zoneItemId);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.WriteError(ex);
|
||||
}
|
||||
finally
|
||||
{
|
||||
TaskManager.CompleteTask();
|
||||
}
|
||||
}
|
||||
//
|
||||
return 0;
|
||||
}
|
||||
|
||||
public static List<DnsRecord> BuildDnsResourceRecords(List<GlobalDnsRecord> records,
|
||||
string domainName, string serviceIP)
|
||||
{
|
||||
List<DnsRecord> zoneRecords = new List<DnsRecord>();
|
||||
|
||||
foreach (GlobalDnsRecord record in records)
|
||||
{
|
||||
DnsRecord rr = new DnsRecord();
|
||||
rr.RecordType = (DnsRecordType)Enum.Parse(typeof(DnsRecordType), record.RecordType, true);
|
||||
rr.RecordName = record.RecordName;
|
||||
|
||||
if (record.RecordType == "A")
|
||||
{
|
||||
rr.RecordData = String.IsNullOrEmpty(record.RecordData) ? record.ExternalIP : record.RecordData;
|
||||
rr.RecordData = Utils.ReplaceStringVariable(rr.RecordData, "ip", record.ExternalIP);
|
||||
|
||||
if (String.IsNullOrEmpty(rr.RecordData) && !String.IsNullOrEmpty(serviceIP))
|
||||
rr.RecordData = serviceIP;
|
||||
}
|
||||
else
|
||||
{
|
||||
rr.RecordData = record.RecordData;
|
||||
}
|
||||
|
||||
// substitute variables
|
||||
rr.RecordData = Utils.ReplaceStringVariable(rr.RecordData, "domain_name", domainName);
|
||||
|
||||
// add MX priority
|
||||
if (record.RecordType == "MX")
|
||||
rr.MxPriority = record.MxPriority;
|
||||
|
||||
if (!String.IsNullOrEmpty(rr.RecordData))
|
||||
zoneRecords.Add(rr);
|
||||
}
|
||||
|
||||
return zoneRecords;
|
||||
}
|
||||
|
||||
public static string[] GetExternalIPAddressesFromString(string str)
|
||||
{
|
||||
List<string> ips = new List<string>();
|
||||
|
||||
if (str != null && str.Trim() != "")
|
||||
{
|
||||
string[] sips = str.Split(',');
|
||||
foreach (string sip in sips)
|
||||
{
|
||||
IPAddressInfo ip = ServerController.GetIPAddress(Int32.Parse(sip));
|
||||
if (ip != null)
|
||||
ips.Add(ip.ExternalIP);
|
||||
}
|
||||
}
|
||||
|
||||
return ips.ToArray();
|
||||
}
|
||||
|
||||
#region IImportController Members
|
||||
|
||||
public List<string> GetImportableItems(int packageId, int itemTypeId, Type itemType, ResourceGroupInfo group)
|
||||
{
|
||||
List<string> items = new List<string>();
|
||||
|
||||
// get service id
|
||||
int serviceId = PackageController.GetPackageServiceId(packageId, group.GroupName);
|
||||
if (serviceId == 0)
|
||||
return items;
|
||||
|
||||
// Mail provider
|
||||
DNSServer dns = new DNSServer();
|
||||
ServiceProviderProxy.Init(dns, serviceId);
|
||||
|
||||
if (itemType == typeof(DnsZone))
|
||||
items.AddRange(dns.GetZones());
|
||||
|
||||
return items;
|
||||
}
|
||||
|
||||
public void ImportItem(int packageId, int itemTypeId, Type itemType,
|
||||
ResourceGroupInfo group, string itemName)
|
||||
{
|
||||
// get service id
|
||||
int serviceId = PackageController.GetPackageServiceId(packageId, group.GroupName);
|
||||
if (serviceId == 0)
|
||||
return;
|
||||
|
||||
if (itemType == typeof(DnsZone))
|
||||
{
|
||||
// add DNS zone
|
||||
DnsZone zone = new DnsZone();
|
||||
zone.Name = itemName;
|
||||
zone.ServiceId = serviceId;
|
||||
zone.PackageId = packageId;
|
||||
int zoneId = PackageController.AddPackageItem(zone);
|
||||
|
||||
// add/update domains/pointers
|
||||
RestoreDomainByZone(itemName, packageId, zoneId);
|
||||
}
|
||||
}
|
||||
|
||||
private void RestoreDomainByZone(string itemName, int packageId, int zoneId)
|
||||
{
|
||||
DomainInfo domain = ServerController.GetDomain(itemName);
|
||||
if (domain == null)
|
||||
{
|
||||
domain = new DomainInfo();
|
||||
domain.DomainName = itemName;
|
||||
domain.PackageId = packageId;
|
||||
domain.ZoneItemId = zoneId;
|
||||
ServerController.AddDomainItem(domain);
|
||||
}
|
||||
else
|
||||
{
|
||||
domain.ZoneItemId = zoneId;
|
||||
ServerController.UpdateDomain(domain);
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region IBackupController Members
|
||||
|
||||
public int BackupItem(string tempFolder, XmlWriter writer, ServiceProviderItem item, ResourceGroupInfo group)
|
||||
{
|
||||
if (!(item is DnsZone))
|
||||
return 0;
|
||||
|
||||
// DNS provider
|
||||
DNSServer dns = GetDNSServer(item.ServiceId);
|
||||
|
||||
// zone records serialized
|
||||
XmlSerializer serializer = new XmlSerializer(typeof(DnsRecord));
|
||||
|
||||
try
|
||||
{
|
||||
// get zone records
|
||||
DnsRecord[] records = dns.GetZoneRecords(item.Name);
|
||||
|
||||
// serialize zone records
|
||||
foreach (DnsRecord record in records)
|
||||
serializer.Serialize(writer, record);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.WriteError(ex, "Could not read zone records");
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
public int RestoreItem(string tempFolder, XmlNode itemNode, int itemId, Type itemType,
|
||||
string itemName, int packageId, int serviceId, ResourceGroupInfo group)
|
||||
{
|
||||
if (itemType != typeof(DnsZone))
|
||||
return 0;
|
||||
|
||||
// DNS provider
|
||||
DNSServer dns = GetDNSServer(serviceId);
|
||||
|
||||
// check service item
|
||||
if (!dns.ZoneExists(itemName))
|
||||
{
|
||||
// create primary and secondary zones
|
||||
AddZone(packageId, serviceId, itemName, false);
|
||||
|
||||
// restore records
|
||||
XmlSerializer serializer = new XmlSerializer(typeof(DnsRecord));
|
||||
List<DnsRecord> records = new List<DnsRecord>();
|
||||
foreach (XmlNode childNode in itemNode.ChildNodes)
|
||||
{
|
||||
if (childNode.Name == "DnsRecord")
|
||||
{
|
||||
records.Add((DnsRecord)serializer.Deserialize(new XmlNodeReader(childNode)));
|
||||
}
|
||||
}
|
||||
|
||||
dns.AddZoneRecords(itemName, records.ToArray());
|
||||
}
|
||||
|
||||
// check if meta-item exists
|
||||
int zoneId = 0;
|
||||
DnsZone item = (DnsZone)PackageController.GetPackageItemByName(packageId, itemName, typeof(DnsZone));
|
||||
if (item == null)
|
||||
{
|
||||
// restore meta-item
|
||||
item = new DnsZone();
|
||||
item.Name = itemName;
|
||||
item.PackageId = packageId;
|
||||
item.ServiceId = serviceId;
|
||||
zoneId = PackageController.AddPackageItem(item);
|
||||
}
|
||||
else
|
||||
{
|
||||
zoneId = item.Id;
|
||||
}
|
||||
|
||||
// restore domains
|
||||
RestoreDomainByZone(itemName, packageId, zoneId);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
|
@ -0,0 +1,135 @@
|
|||
// Copyright (c) 2011, 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.Data;
|
||||
|
||||
using ES = WebsitePanel.EnterpriseServer;
|
||||
|
||||
namespace WebsitePanel.Ecommerce.EnterpriseServer
|
||||
{
|
||||
public class CategoryController
|
||||
{
|
||||
#region Category routines
|
||||
|
||||
public static DataSet GetWholeCategoriesSet(int userId)
|
||||
{
|
||||
return EcommerceProvider.GetWholeCategoriesSet(
|
||||
ES.SecurityContext.User.UserId,
|
||||
userId
|
||||
);
|
||||
}
|
||||
|
||||
public static int GetCategoriesCount(int userId, int parentId)
|
||||
{
|
||||
return EcommerceProvider.GetCategoriesCount(
|
||||
ES.SecurityContext.User.UserId,
|
||||
userId,
|
||||
parentId
|
||||
);
|
||||
}
|
||||
|
||||
public static List<Category> GetCategoriesPaged(int userId, int parentId, int maximumRows, int startRowIndex)
|
||||
{
|
||||
return ES.ObjectUtils.CreateListFromDataReader<Category>(
|
||||
EcommerceProvider.GetCategoriesPaged(
|
||||
ES.SecurityContext.User.UserId,
|
||||
userId,
|
||||
parentId,
|
||||
maximumRows,
|
||||
startRowIndex
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
public static int AddCategory(int userId, string categoryName, string categorySku, int parentId, string shortDescription, string fullDescription)
|
||||
{
|
||||
SecurityResult result = StorehouseController.CheckAccountNotDemoAndActive();
|
||||
//
|
||||
if (!result.Success)
|
||||
return result.ResultCode;
|
||||
//
|
||||
return EcommerceProvider.AddCategory(
|
||||
ES.SecurityContext.User.UserId,
|
||||
userId,
|
||||
categoryName,
|
||||
categorySku,
|
||||
parentId,
|
||||
shortDescription,
|
||||
fullDescription
|
||||
);
|
||||
}
|
||||
|
||||
public static Category GetCategory(int userId, int categoryId)
|
||||
{
|
||||
return ES.ObjectUtils.FillObjectFromDataReader<Category>(
|
||||
EcommerceProvider.GetCategory(
|
||||
ES.SecurityContext.User.UserId,
|
||||
userId,
|
||||
categoryId
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
public static int UpdateCategory(int userId, int categoryId, string categoryName, string categorySku, int parentId, string shortDescription, string fullDescription)
|
||||
{
|
||||
SecurityResult result = StorehouseController.CheckAccountNotDemoAndActive();
|
||||
//
|
||||
if (!result.Success)
|
||||
return result.ResultCode;
|
||||
|
||||
return EcommerceProvider.UpdateCategory(
|
||||
ES.SecurityContext.User.UserId,
|
||||
userId,
|
||||
categoryId,
|
||||
categoryName,
|
||||
categorySku,
|
||||
parentId,
|
||||
shortDescription,
|
||||
fullDescription
|
||||
);
|
||||
}
|
||||
|
||||
public static int DeleteCategory(int userId, int categoryId)
|
||||
{
|
||||
SecurityResult result = StorehouseController.CheckAccountNotDemoAndActive();
|
||||
//
|
||||
if (!result.Success)
|
||||
return result.ResultCode;
|
||||
|
||||
return EcommerceProvider.DeleteCategory(
|
||||
ES.SecurityContext.User.UserId,
|
||||
userId,
|
||||
categoryId
|
||||
);
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
|
@ -0,0 +1,218 @@
|
|||
// Copyright (c) 2011, 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.Data;
|
||||
|
||||
using ES = WebsitePanel.EnterpriseServer;
|
||||
|
||||
namespace WebsitePanel.Ecommerce.EnterpriseServer.ContractSystem
|
||||
{
|
||||
public class ContractController
|
||||
{
|
||||
public static GenericResult AddContract(int resellerId, ContractAccount accountSettings)
|
||||
{
|
||||
try
|
||||
{
|
||||
ES.SecurityContext.SetThreadPrincipal(resellerId);
|
||||
//
|
||||
ES.TaskManager.StartTask(SystemTasks.SOURCE_ECOMMERCE, SystemTasks.TASK_ADD_CONTRACT);
|
||||
//
|
||||
GenericResult result = new GenericResult();
|
||||
//
|
||||
int customerId = -1;
|
||||
int contractStatus = (int)ContractStatus.Pending;
|
||||
//
|
||||
if (accountSettings.PropertyExists(ContractAccount.CUSTOMER_ID))
|
||||
{
|
||||
customerId = accountSettings.GetProperty<int>(ContractAccount.CUSTOMER_ID);
|
||||
//
|
||||
contractStatus = (int)ContractStatus.Active;
|
||||
}
|
||||
|
||||
// Ensure customer not specified and then check requested username availability
|
||||
if (customerId == -1)
|
||||
{
|
||||
if (ES.UserController.UserExists(accountSettings[ContractAccount.USERNAME]))
|
||||
{
|
||||
result.Succeed = false;
|
||||
result.SetProperty("ResultCode", ES.BusinessErrorCodes.ERROR_USER_ALREADY_EXISTS);
|
||||
return result;
|
||||
}
|
||||
// EXIT
|
||||
}
|
||||
//
|
||||
string strNames = null;
|
||||
string strValues = null;
|
||||
//
|
||||
if (customerId == -1)
|
||||
{
|
||||
strNames = strValues = String.Empty;
|
||||
SecurityUtils.SerializeGenericProfile(ref strNames, ref strValues, accountSettings);
|
||||
}
|
||||
// emit the new contract
|
||||
string contractId = EcommerceProvider.AddContract(customerId, resellerId, accountSettings[ContractAccount.USERNAME],
|
||||
contractStatus, 0m, accountSettings[ContractAccount.FIRST_NAME], accountSettings[ContractAccount.LAST_NAME],
|
||||
accountSettings[ContractAccount.EMAIL], accountSettings[ContractAccount.COMPANY_NAME],
|
||||
strNames, strValues);
|
||||
//
|
||||
result.Succeed = true;
|
||||
result.SetProperty("ContractId", contractId);
|
||||
// Add contract object
|
||||
ES.TaskManager.TaskParameters[SystemTaskParams.PARAM_CONTRACT] = GetContract(contractId);
|
||||
//
|
||||
return result;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw ES.TaskManager.WriteError(ex);
|
||||
}
|
||||
finally
|
||||
{
|
||||
ES.TaskManager.CompleteTask();
|
||||
}
|
||||
}
|
||||
|
||||
public static bool CheckCustomerContractExists()
|
||||
{
|
||||
return EcommerceProvider.CheckCustomerContractExists(ES.SecurityContext.User.UserId);
|
||||
}
|
||||
|
||||
public static GenericResult DeleteContract(string contractId)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
public static void ImpersonateAsContractReseller(string contractId)
|
||||
{
|
||||
Contract contract = ContractSystem.ContractController.GetContract(contractId);
|
||||
// Impersonate
|
||||
ImpersonateAsContractReseller(contract);
|
||||
}
|
||||
|
||||
public static void ImpersonateAsContractReseller(Contract contractInfo)
|
||||
{
|
||||
// Impersonate
|
||||
ES.SecurityContext.SetThreadPrincipal(contractInfo.ResellerId);
|
||||
}
|
||||
|
||||
public static Contract GetCustomerContract(int customerId)
|
||||
{
|
||||
Contract contractInfo = ES.ObjectUtils.FillObjectFromDataReader<Contract>(
|
||||
EcommerceProvider.GetCustomerContract(customerId));
|
||||
//
|
||||
if (contractInfo == null)
|
||||
throw new Exception("Could not find customer contract.");
|
||||
//
|
||||
return contractInfo;
|
||||
}
|
||||
|
||||
public static Contract GetContract(string contractId)
|
||||
{
|
||||
Contract contractInfo = ES.ObjectUtils.FillObjectFromDataReader<Contract>(EcommerceProvider.GetContract(contractId));
|
||||
//
|
||||
if (contractInfo == null)
|
||||
throw new Exception("Could not find the contract specified. ContractID: " + contractId);
|
||||
//
|
||||
return contractInfo;
|
||||
}
|
||||
|
||||
public static int UpdateContract(string contractId, int customerId, string accountName,
|
||||
ContractStatus status, decimal balance, string firstName, string lastName, string email,
|
||||
string companyName, string propertyNames, string propertyValues)
|
||||
{
|
||||
return EcommerceProvider.UpdateContract(contractId, customerId, accountName, (int)status, balance,
|
||||
firstName, lastName, email, companyName, propertyNames, propertyValues);
|
||||
}
|
||||
|
||||
public static ContractAccount GetContractAccountSettings(string contractId)
|
||||
{
|
||||
return GetContractAccountSettings(contractId, false);
|
||||
}
|
||||
|
||||
public static ContractAccount GetContractAccountSettings(string contractId, bool internally)
|
||||
{
|
||||
//
|
||||
ContractAccount account = new ContractAccount();
|
||||
//
|
||||
IDataReader dr = null;
|
||||
//
|
||||
try
|
||||
{
|
||||
int customerId = -1;
|
||||
dr = EcommerceProvider.GetContract(contractId);
|
||||
//
|
||||
if (dr.Read())
|
||||
{
|
||||
string propertyNames = Convert.ToString(dr["PropertyNames"]);
|
||||
string propertyValues = Convert.ToString(dr["PropertyValues"]);
|
||||
if (dr["CustomerID"] != DBNull.Value)
|
||||
customerId = Convert.ToInt32(dr["CustomerID"]);
|
||||
else
|
||||
SecurityUtils.DeserializeGenericProfile(propertyNames, propertyValues, account);
|
||||
}
|
||||
//
|
||||
if (customerId > -1)
|
||||
{
|
||||
ES.UserInfo userInfo = (internally) ? ES.UserController.GetUserInternally(customerId) :
|
||||
ES.UserController.GetUser(customerId);
|
||||
//
|
||||
if (internally)
|
||||
account[ContractAccount.PASSWORD] = userInfo.Password;
|
||||
//
|
||||
account[ContractAccount.USERNAME] = userInfo.Username;
|
||||
account[ContractAccount.FIRST_NAME] = userInfo.FirstName;
|
||||
account[ContractAccount.LAST_NAME] = userInfo.LastName;
|
||||
account[ContractAccount.EMAIL] = userInfo.Email;
|
||||
account[ContractAccount.COMPANY_NAME] = userInfo.CompanyName;
|
||||
account[ContractAccount.COUNTRY] = userInfo.Country;
|
||||
account[ContractAccount.CITY] = userInfo.City;
|
||||
account[ContractAccount.ADDRESS] = userInfo.Address;
|
||||
account[ContractAccount.FAX_NUMBER] = userInfo.Fax;
|
||||
account[ContractAccount.INSTANT_MESSENGER] = userInfo.InstantMessenger;
|
||||
account[ContractAccount.PHONE_NUMBER] = userInfo.PrimaryPhone;
|
||||
account[ContractAccount.STATE] = userInfo.State;
|
||||
account[ContractAccount.ZIP] = userInfo.Zip;
|
||||
account[ContractAccount.MAIL_FORMAT] = userInfo.HtmlMail ? "HTML" : "PlainText";
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw ex;
|
||||
}
|
||||
finally
|
||||
{
|
||||
if (dr != null)
|
||||
dr.Close();
|
||||
}
|
||||
//
|
||||
return account;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,591 @@
|
|||
// Copyright (c) 2011, 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.Data;
|
||||
using System.Configuration;
|
||||
using System.Xml;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using System.Net;
|
||||
using System.Web;
|
||||
using System.Web.Caching;
|
||||
using System.Globalization;
|
||||
|
||||
using WebsitePanel.EnterpriseServer;
|
||||
|
||||
namespace WebsitePanel.Ecommerce.EnterpriseServer
|
||||
{
|
||||
public class SettingsHelper
|
||||
{
|
||||
public static string ConvertObjectSettings(string[][] settings)
|
||||
{
|
||||
XmlDocument doc = new XmlDocument();
|
||||
XmlElement root = doc.CreateElement("settings");
|
||||
|
||||
foreach (string[] pair in settings)
|
||||
{
|
||||
XmlElement s_item = doc.CreateElement("setting");
|
||||
s_item.SetAttribute("name", pair[0]);
|
||||
s_item.SetAttribute("value", pair[1]);
|
||||
root.AppendChild(s_item);
|
||||
}
|
||||
|
||||
return root.OuterXml;
|
||||
}
|
||||
|
||||
public static string ConvertObjectSettings(string[][] settings, string rootName, string childName)
|
||||
{
|
||||
XmlDocument doc = new XmlDocument();
|
||||
XmlElement root = doc.CreateElement(rootName);
|
||||
// exit
|
||||
if (settings == null)
|
||||
return root.OuterXml;
|
||||
// iterate
|
||||
foreach (string[] pair in settings)
|
||||
{
|
||||
XmlElement s_item = doc.CreateElement(childName);
|
||||
s_item.SetAttribute("name", pair[0]);
|
||||
s_item.SetAttribute("value", pair[1]);
|
||||
root.AppendChild(s_item);
|
||||
}
|
||||
//
|
||||
return root.OuterXml;
|
||||
}
|
||||
|
||||
public static string ConvertControlsBunch(string[][] bunch)
|
||||
{
|
||||
XmlDocument doc = new XmlDocument();
|
||||
XmlElement root = doc.CreateElement("Controls");
|
||||
|
||||
foreach (string[] pair in bunch)
|
||||
{
|
||||
XmlElement s_item = doc.CreateElement("Control");
|
||||
s_item.SetAttribute("Key", pair[0]);
|
||||
s_item.SetAttribute("Src", pair[1]);
|
||||
root.AppendChild(s_item);
|
||||
}
|
||||
|
||||
return root.OuterXml;
|
||||
}
|
||||
|
||||
public static KeyValueBunch FillSettingsBunch(IDataReader reader)
|
||||
{
|
||||
return FillSettingsBunch(
|
||||
reader,
|
||||
"SettingName",
|
||||
"SettingValue"
|
||||
);
|
||||
}
|
||||
|
||||
public static T FillSettingsBunch<T>(IDataReader reader, string keyNameColumn, string keyValueColumn)
|
||||
{
|
||||
Type type = typeof(T);
|
||||
|
||||
KeyValueBunch bunch = (KeyValueBunch)Activator.CreateInstance(type);
|
||||
|
||||
try
|
||||
{
|
||||
while (reader.Read())
|
||||
bunch[(String)reader[keyNameColumn]] = (String)reader[keyValueColumn];
|
||||
}
|
||||
catch
|
||||
{
|
||||
bunch = null;
|
||||
}
|
||||
finally
|
||||
{
|
||||
if (reader != null)
|
||||
reader.Close();
|
||||
}
|
||||
|
||||
return (T)Convert.ChangeType(bunch, typeof(T));
|
||||
}
|
||||
|
||||
public static KeyValueBunch FillSettingsBunch(IDataReader reader,
|
||||
string keyNameColumn, string keyValueColumn)
|
||||
{
|
||||
KeyValueBunch bunch = null;
|
||||
|
||||
try
|
||||
{
|
||||
bunch = new KeyValueBunch();
|
||||
|
||||
while (reader.Read())
|
||||
bunch[(String)reader[keyNameColumn]] = (String)reader[keyValueColumn];
|
||||
}
|
||||
catch
|
||||
{
|
||||
bunch = null;
|
||||
}
|
||||
finally
|
||||
{
|
||||
if (reader != null)
|
||||
reader.Close();
|
||||
}
|
||||
|
||||
return bunch;
|
||||
}
|
||||
|
||||
public static KeyValueBunch FillControlsBunch(IDataReader reader)
|
||||
{
|
||||
KeyValueBunch bunch = null;
|
||||
|
||||
try
|
||||
{
|
||||
bunch = new KeyValueBunch();
|
||||
|
||||
while (reader.Read())
|
||||
bunch[(String)reader["ControlKey"]] = (String)reader["ControlSrc"];
|
||||
}
|
||||
catch
|
||||
{
|
||||
bunch = null;
|
||||
}
|
||||
finally
|
||||
{
|
||||
if (reader != null)
|
||||
reader.Close();
|
||||
}
|
||||
|
||||
return bunch;
|
||||
}
|
||||
|
||||
public static KeyValueBunch FillProperties(IDataReader reader)
|
||||
{
|
||||
KeyValueBunch settings = null;
|
||||
|
||||
try
|
||||
{
|
||||
settings = new KeyValueBunch();
|
||||
|
||||
while (reader.Read())
|
||||
{
|
||||
string name = (string)reader["PropertyName"];
|
||||
string value = (string)reader["PropertyValue"];
|
||||
//
|
||||
settings[name] = value;
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
settings = null;
|
||||
}
|
||||
finally
|
||||
{
|
||||
if (reader != null)
|
||||
reader.Close();
|
||||
}
|
||||
|
||||
return settings;
|
||||
}
|
||||
|
||||
public static KeyValueBunch FillSettings(IDataReader reader)
|
||||
{
|
||||
KeyValueBunch settings = null;
|
||||
|
||||
try
|
||||
{
|
||||
settings = new KeyValueBunch();
|
||||
|
||||
while (reader.Read())
|
||||
{
|
||||
settings[(string)reader["SettingName"]] = (string)reader["SettingValue"];
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
settings = null;
|
||||
}
|
||||
finally
|
||||
{
|
||||
if (reader != null)
|
||||
reader.Close();
|
||||
}
|
||||
|
||||
return settings;
|
||||
}
|
||||
}
|
||||
|
||||
class Currency
|
||||
{
|
||||
public string ISOCode;
|
||||
public string Symbol;
|
||||
public decimal Rate;
|
||||
|
||||
public Currency()
|
||||
{
|
||||
}
|
||||
|
||||
public Currency(string isocode, string symbol, decimal rate)
|
||||
{
|
||||
this.ISOCode = isocode;
|
||||
this.Symbol = symbol;
|
||||
this.Rate = rate;
|
||||
}
|
||||
}
|
||||
|
||||
public class CurrenciesHelper
|
||||
{
|
||||
private const string ServiceUrl = "http://www.ecb.int/stats/eurofxref/eurofxref-daily.xml";
|
||||
public const string HttpCacheKey = "__Currencies";
|
||||
|
||||
private Dictionary<string, Currency> _currencies;
|
||||
|
||||
public CurrenciesHelper()
|
||||
{
|
||||
Initialize();
|
||||
}
|
||||
|
||||
public string[] GetSupportedCurrencies()
|
||||
{
|
||||
string[] array = new string[_currencies.Count];
|
||||
|
||||
_currencies.Keys.CopyTo(array, 0);
|
||||
|
||||
return array;
|
||||
}
|
||||
|
||||
public string GetCurrencySymbol(string ISOCode)
|
||||
{
|
||||
ISOCode = ISOCode.ToUpper();
|
||||
|
||||
if (_currencies.ContainsKey(ISOCode))
|
||||
return _currencies[ISOCode].Symbol;
|
||||
|
||||
return ISOCode;
|
||||
}
|
||||
|
||||
public decimal GetCurrencyRate(string ISOCode)
|
||||
{
|
||||
ISOCode = ISOCode.ToUpper();
|
||||
|
||||
if (_currencies.ContainsKey(ISOCode))
|
||||
return _currencies[ISOCode].Rate;
|
||||
|
||||
return Decimal.Zero;
|
||||
}
|
||||
|
||||
private XmlDocument GetServiceResponse()
|
||||
{
|
||||
WebClient ecb = new WebClient();
|
||||
|
||||
try
|
||||
{
|
||||
TaskManager.StartTask("CURRENCY_HELPER", "LOAD_CURRENCIES_RATES");
|
||||
|
||||
XmlDocument xmlDoc = new XmlDocument();
|
||||
|
||||
xmlDoc.LoadXml(
|
||||
ecb.DownloadString(
|
||||
ServiceUrl
|
||||
)
|
||||
);
|
||||
|
||||
return xmlDoc;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.WriteError(ex, "Failed to get response from www.ecb.int");
|
||||
}
|
||||
finally
|
||||
{
|
||||
TaskManager.CompleteTask();
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
private Currency ConvertFromXml(XmlElement element, RegionInfo region)
|
||||
{
|
||||
string ISOCode = element.GetAttribute("currency");
|
||||
|
||||
Currency currency = new Currency();
|
||||
currency.Rate = Decimal.Parse(element.GetAttribute("rate"));
|
||||
currency.ISOCode = ISOCode;
|
||||
|
||||
if (region != null)
|
||||
currency.Symbol = region.CurrencySymbol;
|
||||
else
|
||||
currency.Symbol = ISOCode;
|
||||
|
||||
return currency;
|
||||
}
|
||||
|
||||
private void Initialize()
|
||||
{
|
||||
/*Cache cache = new Cache();
|
||||
_currencies = (Dictionary<string, Currency>)cache[HttpCacheKey];*/
|
||||
|
||||
if (_currencies == null)
|
||||
_currencies = LoadRatesFromService();
|
||||
}
|
||||
|
||||
private void OnCacheItem_Removed(string key, object value, CacheItemRemovedReason reason)
|
||||
{
|
||||
// if currencies rates were expired - renew them
|
||||
if (String.Compare(HttpCacheKey, key) == 0)
|
||||
_currencies = LoadRatesFromService();
|
||||
}
|
||||
|
||||
private Dictionary<string, Currency> LoadRatesFromService()
|
||||
{
|
||||
XmlDocument ecbXml = GetServiceResponse();
|
||||
|
||||
Dictionary<string, Currency> currencies = new Dictionary<string, Currency>();
|
||||
// add euro first
|
||||
currencies.Add("EUR", new Currency("EUR", "ˆ", 1));
|
||||
|
||||
if (ecbXml != null)
|
||||
{
|
||||
XmlNode cube = ecbXml.SelectSingleNode("*[local-name()='Envelope']/*[local-name()='Cube']/*[local-name()='Cube']");
|
||||
|
||||
if (cube != null)
|
||||
{
|
||||
CultureInfo[] cultures = CultureInfo.GetCultures(CultureTypes.SpecificCultures);
|
||||
|
||||
IEnumerator iterator = cultures.GetEnumerator();
|
||||
|
||||
// load symbols for currencies
|
||||
while (iterator.MoveNext() && cube.ChildNodes.Count > 0)
|
||||
{
|
||||
CultureInfo culture = (CultureInfo)iterator.Current;
|
||||
|
||||
RegionInfo region = new RegionInfo(culture.LCID);
|
||||
|
||||
string ISOCode = region.ISOCurrencySymbol;
|
||||
|
||||
// find currency by ISO code
|
||||
XmlElement element = (XmlElement)cube.SelectSingleNode(
|
||||
String.Format(
|
||||
"*[local-name()='Cube' and @currency='{0}']",
|
||||
ISOCode
|
||||
)
|
||||
);
|
||||
|
||||
if (element != null)
|
||||
{
|
||||
currencies.Add(ISOCode, ConvertFromXml(element, region));
|
||||
cube.RemoveChild(element);
|
||||
}
|
||||
}
|
||||
|
||||
// we still have an unrecognized currencies
|
||||
if (cube.ChildNodes.Count > 0)
|
||||
{
|
||||
foreach (XmlElement element in cube.ChildNodes)
|
||||
currencies.Add(element.GetAttribute("currency"), ConvertFromXml(element, null));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// calculate 12.00 time span
|
||||
DateTime expire = DateTime.Now.AddDays(1).Subtract(DateTime.Now.TimeOfDay);
|
||||
|
||||
// add currencies to the cache
|
||||
/*Cache cache = new Cache();
|
||||
cache.Add(
|
||||
HttpCacheKey,
|
||||
currencies,
|
||||
null,
|
||||
expire,
|
||||
Cache.NoSlidingExpiration,
|
||||
CacheItemPriority.Default,
|
||||
new CacheItemRemovedCallback(OnCacheItem_Removed)
|
||||
);*/
|
||||
|
||||
return currencies;
|
||||
}
|
||||
}
|
||||
|
||||
public class SecurityUtils
|
||||
{
|
||||
internal static void SerializeProfile(ref string propertyNames, ref string propertyValues,
|
||||
bool encrypt, CheckoutDetails profile)
|
||||
{
|
||||
// names
|
||||
StringBuilder namesBuilder = new StringBuilder();
|
||||
// string values
|
||||
StringBuilder valsBuilder = new StringBuilder();
|
||||
//
|
||||
string[] allKeys = profile.GetAllKeys();
|
||||
//
|
||||
foreach (string keyName in allKeys)
|
||||
{
|
||||
//
|
||||
int length = 0, position = 0;
|
||||
// get serialized property value
|
||||
string keyValue = profile[keyName];
|
||||
//
|
||||
if (String.IsNullOrEmpty(keyValue))
|
||||
{
|
||||
length = -1;
|
||||
}
|
||||
else
|
||||
{
|
||||
//
|
||||
length = keyValue.Length;
|
||||
//
|
||||
position = valsBuilder.Length;
|
||||
//
|
||||
valsBuilder.Append(keyValue);
|
||||
}
|
||||
//
|
||||
namesBuilder.Append(keyName + ":S:" + position.ToString(CultureInfo.InvariantCulture) + ":" + length.ToString(CultureInfo.InvariantCulture) + ":");
|
||||
}
|
||||
//
|
||||
propertyNames = (encrypt) ? CryptoUtils.Encrypt(namesBuilder.ToString()) : namesBuilder.ToString();
|
||||
//
|
||||
propertyValues = (encrypt) ? CryptoUtils.Encrypt(valsBuilder.ToString()) : valsBuilder.ToString();
|
||||
}
|
||||
|
||||
internal static void DeserializeProfile(string propertyNames, string propertyValues,
|
||||
bool encrypted, CheckoutDetails details)
|
||||
{
|
||||
// Input format:
|
||||
// PROPERTY_NAME:S:START_INDEX:PROP_VALUE_LENGTH
|
||||
//
|
||||
if ((propertyNames != null && propertyValues != null) && details != null)
|
||||
{
|
||||
//
|
||||
try
|
||||
{
|
||||
// decrypt
|
||||
propertyNames = (encrypted) ? CryptoUtils.Decrypt(propertyNames) : propertyNames;
|
||||
//
|
||||
propertyValues = (encrypted) ? CryptoUtils.Decrypt(propertyValues) : propertyValues;
|
||||
//
|
||||
string[] names = propertyNames.Split(':');
|
||||
// divide names length by 4 parts
|
||||
int count = names.Length / 4;
|
||||
// iterate through
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
// get property name
|
||||
string keyName = names[i * 4];
|
||||
//
|
||||
string keyValue = String.Empty;
|
||||
// calculate property value start index
|
||||
int startIndex = Int32.Parse(names[(i * 4) + 2], CultureInfo.InvariantCulture);
|
||||
// calculate property value length
|
||||
int length = Int32.Parse(names[(i * 4) + 3], CultureInfo.InvariantCulture);
|
||||
// ensure check property value not empty
|
||||
if (length != -1)
|
||||
{
|
||||
keyValue = propertyValues.Substring(startIndex, length);
|
||||
}
|
||||
//
|
||||
details[keyName] = keyValue;
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
internal static void SerializeGenericProfile(ref string propertyNames, ref string propertyValues, IKeyValueBunch source)
|
||||
{
|
||||
// names
|
||||
StringBuilder namesBuilder = new StringBuilder();
|
||||
// string values
|
||||
StringBuilder valsBuilder = new StringBuilder();
|
||||
//
|
||||
string[] allKeys = source.GetAllKeys();
|
||||
//
|
||||
foreach (string keyName in allKeys)
|
||||
{
|
||||
//
|
||||
int length = 0, position = 0;
|
||||
// get serialized property value
|
||||
string keyValue = source[keyName];
|
||||
//
|
||||
if (String.IsNullOrEmpty(keyValue))
|
||||
{
|
||||
length = -1;
|
||||
}
|
||||
else
|
||||
{
|
||||
//
|
||||
length = keyValue.Length;
|
||||
//
|
||||
position = valsBuilder.Length;
|
||||
//
|
||||
valsBuilder.Append(keyValue);
|
||||
}
|
||||
//
|
||||
namesBuilder.Append(keyName + ":S:" + position.ToString(CultureInfo.InvariantCulture) + ":" + length.ToString(CultureInfo.InvariantCulture) + ":");
|
||||
}
|
||||
//
|
||||
propertyNames = namesBuilder.ToString();
|
||||
//
|
||||
propertyValues = valsBuilder.ToString();
|
||||
}
|
||||
|
||||
internal static void DeserializeGenericProfile(string propertyNames, string propertyValues, IKeyValueBunch target)
|
||||
{
|
||||
// Input format:
|
||||
// PROPERTY_NAME:S:START_INDEX:PROP_VALUE_LENGTH
|
||||
//
|
||||
if ((propertyNames != null && propertyValues != null) && target != null)
|
||||
{
|
||||
//
|
||||
try
|
||||
{
|
||||
//
|
||||
string[] names = propertyNames.Split(':');
|
||||
// divide names length by 4 parts
|
||||
int count = names.Length / 4;
|
||||
// iterate through
|
||||
for (int i = 0; i < count; i++)
|
||||
{
|
||||
// get property name
|
||||
string keyName = names[i * 4];
|
||||
//
|
||||
string keyValue = String.Empty;
|
||||
// calculate property value start index
|
||||
int startIndex = Int32.Parse(names[(i * 4) + 2], CultureInfo.InvariantCulture);
|
||||
// calculate property value length
|
||||
int length = Int32.Parse(names[(i * 4) + 3], CultureInfo.InvariantCulture);
|
||||
// ensure check property value not empty
|
||||
if (length != -1)
|
||||
{
|
||||
keyValue = propertyValues.Substring(startIndex, length);
|
||||
}
|
||||
//
|
||||
target[keyName] = keyValue;
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,375 @@
|
|||
// Copyright (c) 2011, 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.Globalization;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
using System.Xml;
|
||||
using System.Data;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Configuration;
|
||||
using System.Web;
|
||||
using System.Web.Security;
|
||||
using System.Web.UI;
|
||||
using System.Web.UI.WebControls;
|
||||
using System.Web.UI.WebControls.WebParts;
|
||||
using System.Web.UI.HtmlControls;
|
||||
|
||||
using ES = WebsitePanel.EnterpriseServer;
|
||||
using System.Threading;
|
||||
using WebsitePanel.EnterpriseServer;
|
||||
using WebsitePanel.Templates;
|
||||
|
||||
namespace WebsitePanel.Ecommerce.EnterpriseServer
|
||||
{
|
||||
public class InvoiceController
|
||||
{
|
||||
private InvoiceController()
|
||||
{
|
||||
}
|
||||
|
||||
#region Ecommerce v2.1.0 routines
|
||||
|
||||
#region Helper methods
|
||||
|
||||
public static string BuildAddXmlForInvoiceItems(List<InvoiceItem> items)
|
||||
{
|
||||
XmlDocument xml = new XmlDocument();
|
||||
XmlElement root = xml.CreateElement("items");
|
||||
|
||||
foreach (InvoiceItem item in items)
|
||||
{
|
||||
XmlElement node = xml.CreateElement("item");
|
||||
|
||||
node.SetAttribute("serviceid", item.ServiceId.ToString());
|
||||
node.SetAttribute("itemname", item.ItemName);
|
||||
node.SetAttribute("typename", item.TypeName);
|
||||
node.SetAttribute("quantity", item.Quantity.ToString());
|
||||
node.SetAttribute("total", item.Total.ToString(CultureInfo.InvariantCulture));
|
||||
node.SetAttribute("subtotal", item.SubTotal.ToString(CultureInfo.InvariantCulture));
|
||||
node.SetAttribute("unitprice", item.UnitPrice.ToString(CultureInfo.InvariantCulture));
|
||||
|
||||
root.AppendChild(node);
|
||||
}
|
||||
|
||||
return root.OuterXml;
|
||||
}
|
||||
|
||||
public static List<InvoiceItem> CalculateInvoiceLinesForServices(List<int> services)
|
||||
{
|
||||
List<InvoiceItem> lines = new List<InvoiceItem>();
|
||||
|
||||
foreach (int serviceId in services)
|
||||
{
|
||||
ProductType svc_type = ServiceController.GetServiceItemType(serviceId);
|
||||
//
|
||||
IServiceProvisioning controller = (IServiceProvisioning)Activator.CreateInstance(
|
||||
Type.GetType(svc_type.ProvisioningController));
|
||||
//
|
||||
InvoiceItem[] ilines = controller.CalculateInvoiceLines(serviceId);
|
||||
foreach (InvoiceItem iline in ilines)
|
||||
{
|
||||
iline.SubTotal = iline.UnitPrice * iline.Quantity;
|
||||
iline.Total = iline.SubTotal;
|
||||
}
|
||||
//
|
||||
lines.AddRange(ilines);
|
||||
}
|
||||
//
|
||||
return lines;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
public static int VoidCustomerInvoice(int invoiceId)
|
||||
{
|
||||
SecurityResult result = StorehouseController.CheckAccountIsAdminOrReseller();
|
||||
if (!result.Success)
|
||||
return result.ResultCode;
|
||||
// void
|
||||
EcommerceProvider.VoidCustomerInvoice(ES.SecurityContext.User.UserId, invoiceId);
|
||||
//
|
||||
return 0;
|
||||
}
|
||||
|
||||
public static Taxation GetCustomerTaxation(string contractId, string country, string state)
|
||||
{
|
||||
return ES.ObjectUtils.FillObjectFromDataReader<Taxation>(
|
||||
EcommerceProvider.GetCustomerTaxation(contractId, country, state));
|
||||
}
|
||||
|
||||
public static void CalculateInvoiceChargeAmounts(Taxation tax, List<InvoiceItem> items,
|
||||
out decimal totalAmount, out decimal subTotalAmount, out decimal taxAmount)
|
||||
{
|
||||
totalAmount = subTotalAmount = taxAmount = 0;
|
||||
// calculate all invoice items
|
||||
foreach (InvoiceItem item in items)
|
||||
subTotalAmount += item.SubTotal;
|
||||
//
|
||||
totalAmount = subTotalAmount;
|
||||
// tax applies
|
||||
if (tax != null)
|
||||
{
|
||||
switch (tax.Type)
|
||||
{
|
||||
case TaxationType.Fixed:
|
||||
taxAmount = tax.Amount;
|
||||
totalAmount += taxAmount;
|
||||
break;
|
||||
case TaxationType.Percentage:
|
||||
taxAmount = (subTotalAmount / 100) * tax.Amount;
|
||||
totalAmount += taxAmount;
|
||||
break;
|
||||
case TaxationType.TaxIncluded:
|
||||
taxAmount = totalAmount - totalAmount * 100 / (100M + tax.Amount);
|
||||
subTotalAmount -= taxAmount;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static int AddInvoice(string contractId, List<InvoiceItem> invoiceLines, KeyValueBunch extraArgs)
|
||||
{
|
||||
ContractAccount account = ContractSystem.ContractController.GetContractAccountSettings(contractId);
|
||||
// read customer tax
|
||||
Taxation tax = GetCustomerTaxation(contractId, account[ContractAccount.COUNTRY], account[ContractAccount.STATE]);
|
||||
int taxationId = (tax == null) ? -1 : tax.TaxationId;
|
||||
|
||||
// Calculate invoice amounts
|
||||
decimal totalAmount = 0, subTotalAmount = 0, taxAmount = 0;
|
||||
CalculateInvoiceChargeAmounts(tax, invoiceLines, out totalAmount, out subTotalAmount, out taxAmount);
|
||||
|
||||
// align svcs suspend date
|
||||
int[] svcs = new int[invoiceLines.Count];
|
||||
for (int i = 0; i < invoiceLines.Count; i++)
|
||||
svcs[i] = invoiceLines[i].ServiceId;
|
||||
DateTime sdateAligned = ServiceController.GetSvcsSuspendDateAligned(svcs, DateTime.Now);
|
||||
//
|
||||
StoreSettings settings = StorehouseController.GetStoreSettings(ES.SecurityContext.User.UserId,
|
||||
StoreSettings.SYSTEM_SETTINGS);
|
||||
// get invoice grace period in days
|
||||
int gracePeriod = Common.Utils.Utils.ParseInt(settings["InvoiceGracePeriod"], 0);
|
||||
//
|
||||
if (gracePeriod < 0) gracePeriod = 0;
|
||||
//
|
||||
DateTime created = DateTime.Now;
|
||||
DateTime dueDate = sdateAligned.AddDays(gracePeriod);
|
||||
//
|
||||
return AddInvoice(contractId, created, dueDate, taxationId, totalAmount, subTotalAmount, taxAmount,
|
||||
invoiceLines, extraArgs);
|
||||
}
|
||||
|
||||
public static int AddInvoice(string contractId, DateTime created, DateTime dueDate,
|
||||
int taxationId, decimal totalAmount, decimal subTotalAmount, decimal taxAmount, List<InvoiceItem> invoiceLines, KeyValueBunch extraArgs)
|
||||
{
|
||||
//
|
||||
try
|
||||
{
|
||||
Contract contract = ContractSystem.ContractController.GetContract(contractId);
|
||||
//
|
||||
ES.TaskManager.StartTask(SystemTasks.SOURCE_ECOMMERCE, SystemTasks.TASK_ADD_INVOICE);
|
||||
// build xml representation
|
||||
string invoiceLinesXml = BuildAddXmlForInvoiceItems(invoiceLines);
|
||||
// add invoice
|
||||
int result = EcommerceProvider.AddInvoice(contractId, created, dueDate,
|
||||
taxationId, totalAmount, subTotalAmount, taxAmount, invoiceLinesXml,
|
||||
StorehouseController.GetBaseCurrency(contract.ResellerId));
|
||||
|
||||
// check error
|
||||
if (result < 1)
|
||||
return result; // EXIT
|
||||
|
||||
// build invoice number
|
||||
Invoice invoice = GetCustomerInvoiceInternally(result);
|
||||
StoreSettings settings = StorehouseController.GetStoreSettings(contract.ResellerId, StoreSettings.SYSTEM_SETTINGS);
|
||||
if (!String.IsNullOrEmpty(settings["InvoiceNumberFormat"]))
|
||||
{
|
||||
Hashtable options = new Hashtable();
|
||||
options["ID"] = result;
|
||||
invoice.InvoiceNumber = StorehouseController.ApplyStringCustomFormat(
|
||||
settings["InvoiceNumberFormat"], options);
|
||||
}
|
||||
else
|
||||
{
|
||||
invoice.InvoiceNumber = result.ToString();
|
||||
}
|
||||
// update invoice
|
||||
InvoiceController.UpdateInvoice(invoice.InvoiceId, invoice.InvoiceNumber, invoice.DueDate,
|
||||
invoice.Total, invoice.SubTotal, invoice.TaxationId, invoice.TaxAmount, invoice.Currency);
|
||||
//
|
||||
ES.TaskManager.TaskParameters[SystemTaskParams.PARAM_CONTRACT] = contract;
|
||||
ES.TaskManager.TaskParameters[SystemTaskParams.PARAM_INVOICE] = invoice;
|
||||
ES.TaskManager.TaskParameters[SystemTaskParams.PARAM_INVOICE_LINES] = invoiceLines;
|
||||
ES.TaskManager.TaskParameters[SystemTaskParams.PARAM_EXTRA_ARGS] = extraArgs;
|
||||
//
|
||||
return result;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw ES.TaskManager.WriteError(ex);
|
||||
}
|
||||
finally
|
||||
{
|
||||
ES.TaskManager.CompleteTask();
|
||||
}
|
||||
}
|
||||
|
||||
public static int UpdateInvoice(int invoiceId, string invoiceNumber, DateTime dueDate,
|
||||
decimal total, decimal subTotal, int taxationId, decimal taxAmount, string currency)
|
||||
{
|
||||
return EcommerceProvider.UpdateInvoice(ES.SecurityContext.User.UserId, invoiceId,
|
||||
invoiceNumber, dueDate, total, subTotal, taxationId, taxAmount, currency);
|
||||
}
|
||||
|
||||
internal static Invoice GetCustomerInvoiceInternally(int invoiceId)
|
||||
{
|
||||
return ES.ObjectUtils.FillObjectFromDataReader<Invoice>(
|
||||
EcommerceProvider.GetCustomerInvoice(ES.SecurityContext.User.UserId, invoiceId));
|
||||
}
|
||||
|
||||
public static List<InvoiceItem> GetCustomerInvoiceItems(int invoiceId)
|
||||
{
|
||||
return ES.ObjectUtils.CreateListFromDataReader<InvoiceItem>(
|
||||
EcommerceProvider.GetCustomerInvoiceItems(ES.SecurityContext.User.UserId, invoiceId));
|
||||
}
|
||||
|
||||
internal static string GetCustomerInvoiceFormattedInternally(int invoiceId, string cultureName)
|
||||
{
|
||||
Invoice invoice = GetCustomerInvoiceInternally(invoiceId);
|
||||
//
|
||||
return GetCustomerInvoiceFormattedInternally(invoice.ContractId, invoiceId, cultureName);
|
||||
}
|
||||
|
||||
internal static string GetCustomerInvoiceFormattedInternally(string contractId, int invoiceId, string cultureName)
|
||||
{
|
||||
Contract contract = ContractSystem.ContractController.GetContract(contractId);
|
||||
ContractAccount accountSettings = ContractSystem.ContractController.GetContractAccountSettings(contractId);
|
||||
//
|
||||
return GetCustomerInvoiceFormattedInternally(contract, invoiceId, accountSettings, cultureName);
|
||||
}
|
||||
|
||||
internal static string GetCustomerInvoiceFormattedInternally(Contract contract, int invoiceId, ContractAccount accountSettings, string cultureName)
|
||||
{
|
||||
//
|
||||
Invoice invoiceInfo = GetCustomerInvoiceInternally(invoiceId);
|
||||
// impersonate
|
||||
ES.SecurityContext.SetThreadPrincipal(contract.ResellerId);
|
||||
// load settings
|
||||
StoreSettings settings = StorehouseController.GetStoreSettings(contract.ResellerId, StoreSettings.NEW_INVOICE);
|
||||
//
|
||||
string templateBody = settings["HtmlBody"];
|
||||
//
|
||||
Taxation invoiceTax = StorehouseController.GetTaxation(contract.ResellerId, invoiceInfo.TaxationId);
|
||||
//
|
||||
List<InvoiceItem> invoiceLines = GetCustomerInvoiceItems(invoiceId);
|
||||
Dictionary<int, Service> invoiceServices = ServiceController.GetServicesDictionary(invoiceLines);
|
||||
//
|
||||
Template tm = new Template(templateBody);
|
||||
tm["Invoice"] = invoiceInfo;
|
||||
tm["InvoiceLines"] = invoiceLines;
|
||||
tm["InvoiceServices"] = invoiceServices;
|
||||
tm["Customer"] = accountSettings;
|
||||
tm["Tax"] = invoiceTax;
|
||||
|
||||
StringWriter writer = new StringWriter();
|
||||
try
|
||||
{
|
||||
// Preserve an original thread culture
|
||||
CultureInfo originalCulture = Thread.CurrentThread.CurrentCulture;
|
||||
//
|
||||
if (!String.IsNullOrEmpty(cultureName))
|
||||
{
|
||||
try
|
||||
{
|
||||
CultureInfo formattingCulture = new CultureInfo(cultureName);
|
||||
// Empty currency symbol to supporty 3-letters ISO format
|
||||
// hardcorded in HTML templates
|
||||
formattingCulture.NumberFormat.CurrencySymbol = String.Empty;
|
||||
// Set formatting culture
|
||||
Thread.CurrentThread.CurrentCulture = formattingCulture;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.WriteWarning("Wrong culture name has been provided. Culture name: {0}.", cultureName);
|
||||
TaskManager.WriteWarning(ex.StackTrace);
|
||||
TaskManager.WriteWarning(ex.Message);
|
||||
}
|
||||
}
|
||||
|
||||
// Process template
|
||||
tm.Evaluate(writer);
|
||||
templateBody = writer.ToString();
|
||||
|
||||
// Revert the original thread's culture back
|
||||
Thread.CurrentThread.CurrentCulture = originalCulture;
|
||||
}
|
||||
catch (ParserException ex)
|
||||
{
|
||||
return String.Format("Error in template (Line {0}, Column {1}): {2}",
|
||||
ex.Line, ex.Column, ex.Message);
|
||||
}
|
||||
|
||||
return templateBody;
|
||||
}
|
||||
|
||||
public static List<Invoice> GetUnpaidInvoices(int resellerId)
|
||||
{
|
||||
return ES.ObjectUtils.CreateListFromDataReader<Invoice>(
|
||||
EcommerceProvider.GetUnpaidInvoices(ES.SecurityContext.User.UserId, resellerId));
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region New implementation
|
||||
|
||||
public static List<InvoiceItem> GetInvoicesItemsToActivate(int resellerId)
|
||||
{
|
||||
return ES.ObjectUtils.CreateListFromDataReader<InvoiceItem>(
|
||||
EcommerceProvider.GetInvoicesItemsToActivate(ES.SecurityContext.User.UserId, resellerId));
|
||||
}
|
||||
|
||||
public static List<InvoiceItem> GetInvoicesItemsOverdue(int resellerId, DateTime dueDate)
|
||||
{
|
||||
return ES.ObjectUtils.CreateListFromDataReader<InvoiceItem>(
|
||||
EcommerceProvider.GetInvoicesItemsOverdue(ES.SecurityContext.User.UserId, resellerId, dueDate));
|
||||
}
|
||||
|
||||
public static int SetInvoiceItemProcessed(int invoiceId, int itemId)
|
||||
{
|
||||
return EcommerceProvider.SetInvoiceItemProcessed(invoiceId, itemId);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Provisioning routines
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
|
@ -0,0 +1,172 @@
|
|||
// Copyright (c) 2011, 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.IO;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using System.Configuration;
|
||||
using System.Web;
|
||||
using System.Web.Security;
|
||||
using System.Web.UI;
|
||||
|
||||
using ES = WebsitePanel.EnterpriseServer;
|
||||
using WebsitePanel.Templates;
|
||||
|
||||
namespace WebsitePanel.Ecommerce.EnterpriseServer
|
||||
{
|
||||
public class MiscController
|
||||
{
|
||||
private MiscController()
|
||||
{
|
||||
}
|
||||
|
||||
public static int SendNewInvoiceNotification(int invoiceId)
|
||||
{
|
||||
Invoice invoice = InvoiceController.GetCustomerInvoiceInternally(invoiceId);
|
||||
List<InvoiceItem> invoiceLines = InvoiceController.GetCustomerInvoiceItems(invoiceId);
|
||||
|
||||
return SendNewInvoiceNotification(invoice, invoiceLines, null);
|
||||
}
|
||||
|
||||
public static int SendNewInvoiceNotification(Invoice invoice)
|
||||
{
|
||||
List<InvoiceItem> invoiceLines = InvoiceController.GetCustomerInvoiceItems(invoice.InvoiceId);
|
||||
|
||||
return SendNewInvoiceNotification(invoice, invoiceLines, null);
|
||||
}
|
||||
|
||||
public static int SendNewInvoiceNotification(Invoice invoice, List<InvoiceItem> invoiceLines, KeyValueBunch extraArgs)
|
||||
{
|
||||
Contract contract = ContractSystem.ContractController.GetContract(invoice.ContractId);
|
||||
ContractAccount account = ContractSystem.ContractController.GetContractAccountSettings(invoice.ContractId);
|
||||
Dictionary<int, Service> invoiceServices = ServiceController.GetServicesDictionary(invoiceLines);
|
||||
Hashtable items = new Hashtable();
|
||||
|
||||
items["Invoice"] = invoice;
|
||||
items["InvoiceLines"] = invoiceLines;
|
||||
items["InvoiceServices"] = invoiceServices;
|
||||
items["Tax"] = StorehouseController.GetTaxation(contract.ResellerId, invoice.TaxationId);
|
||||
items["Customer"] = account;
|
||||
items["IsEmail"] = "1";
|
||||
if (extraArgs != null)
|
||||
items["ExtraArgs"] = extraArgs;
|
||||
|
||||
return SendSystemNotification(StoreSettings.NEW_INVOICE, account, items, "HtmlBody", "TextBody");
|
||||
}
|
||||
|
||||
public static int SendServiceActivatedNotification(int serviceId)
|
||||
{
|
||||
Hashtable items = new Hashtable();
|
||||
//
|
||||
Service serviceInfo = ServiceController.GetService(serviceId);
|
||||
//
|
||||
ContractAccount account = ContractSystem.ContractController.GetContractAccountSettings(serviceInfo.ContractId);
|
||||
|
||||
items["Service"] = serviceInfo;
|
||||
items["Customer"] = account;
|
||||
|
||||
return SendSystemNotification(StoreSettings.SERVICE_ACTIVATED, account, items, "HtmlBody", "TextBody");
|
||||
}
|
||||
|
||||
public static int SendServiceSuspendedNotification(int serviceId)
|
||||
{
|
||||
Hashtable items = new Hashtable();
|
||||
|
||||
Service serviceInfo = ServiceController.GetService(serviceId);
|
||||
ContractAccount account = ContractSystem.ContractController.GetContractAccountSettings(serviceInfo.ContractId);
|
||||
|
||||
items["Service"] = serviceInfo;
|
||||
items["Customer"] = account;
|
||||
|
||||
return SendSystemNotification(StoreSettings.SERVICE_SUSPENDED, account, items, "HtmlBody", "TextBody");
|
||||
}
|
||||
|
||||
public static int SendServiceCanceledNotification(int serviceId)
|
||||
{
|
||||
Hashtable items = new Hashtable();
|
||||
|
||||
Service serviceInfo = ServiceController.GetService(serviceId);
|
||||
ContractAccount account = ContractSystem.ContractController.GetContractAccountSettings(serviceInfo.ContractId);
|
||||
|
||||
items["Service"] = serviceInfo;
|
||||
items["Customer"] = account;
|
||||
|
||||
return SendSystemNotification(StoreSettings.SERVICE_CANCELLED, account, items, "HtmlBody", "TextBody");
|
||||
}
|
||||
|
||||
public static int SendPaymentReceivedNotification(CustomerPayment payment)
|
||||
{
|
||||
ContractAccount account = ContractSystem.ContractController.GetContractAccountSettings(payment.ContractId);
|
||||
|
||||
Hashtable items = new Hashtable();
|
||||
items["Payment"] = payment;
|
||||
items["Customer"] = account;
|
||||
|
||||
return SendSystemNotification(StoreSettings.PAYMENT_RECEIVED, account, items, "HtmlBody", "TextBody");
|
||||
}
|
||||
|
||||
protected static int SendSystemNotification(string settingsName, ContractAccount recipient, Hashtable items,
|
||||
string htmlKeyName, string textKeyName)
|
||||
{
|
||||
// load e-mail template
|
||||
StoreSettings settings = StorehouseController.GetStoreSettings(ES.SecurityContext.User.UserId,
|
||||
settingsName);
|
||||
//
|
||||
bool htmlMail = (recipient[ContractAccount.MAIL_FORMAT] == "HTML");
|
||||
string email = recipient[ContractAccount.EMAIL];
|
||||
//
|
||||
string messageBody = htmlMail ? settings[htmlKeyName] : settings[textKeyName];
|
||||
|
||||
Template tmp = new Template(messageBody);
|
||||
|
||||
if (items != null)
|
||||
{
|
||||
foreach (string key in items.Keys)
|
||||
tmp[key] = items[key];
|
||||
}
|
||||
|
||||
StringWriter writer = new StringWriter();
|
||||
try
|
||||
{
|
||||
tmp.Evaluate(writer);
|
||||
}
|
||||
catch (ParserException ex)
|
||||
{
|
||||
writer.WriteLine(String.Format("Error in template (Line {0}, Column {1}): {2}",
|
||||
ex.Line, ex.Column, ex.Message));
|
||||
}
|
||||
// evaluate message body
|
||||
messageBody = writer.ToString();
|
||||
|
||||
return ES.MailHelper.SendMessage(settings["From"], email, settings["CC"], settings["Subject"],
|
||||
messageBody, htmlMail);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,165 @@
|
|||
// Copyright (c) 2011, 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.Data;
|
||||
using System.Configuration;
|
||||
using System.Xml;
|
||||
using System.Web;
|
||||
using System.Web.Security;
|
||||
using System.Web.UI;
|
||||
using System.Web.UI.WebControls;
|
||||
using System.Web.UI.WebControls.WebParts;
|
||||
using System.Web.UI.HtmlControls;
|
||||
|
||||
using ES = WebsitePanel.EnterpriseServer;
|
||||
|
||||
namespace WebsitePanel.Ecommerce.EnterpriseServer
|
||||
{
|
||||
public class PaymentGatewayController
|
||||
{
|
||||
public const string TASK_SOURCE = "PAYMENT_CONTROLLER";
|
||||
public const string CHECKOUT_TASK = "CHECKOUT";
|
||||
public const string GENERAL_FAILURE = "CHECKOUT_GENERAL_FAILURE";
|
||||
|
||||
private PaymentGatewayController()
|
||||
{
|
||||
}
|
||||
|
||||
#region Payment Gateway routines
|
||||
|
||||
/// <summary>
|
||||
/// Performs checkout operation
|
||||
/// </summary>
|
||||
/// <param name="spaceId">Space.</param>
|
||||
/// <param name="gatewayId">Gateway.</param>
|
||||
/// <param name="invoiceId">Invoice.</param>
|
||||
/// <param name="details">Array of parameters.</param>
|
||||
/// <returns>Checkout result object.</returns>
|
||||
public static CheckoutResult CheckOut(string contractId, int invoiceId, string methodName,
|
||||
CheckoutDetails details)
|
||||
{
|
||||
CheckoutResult result = new CheckoutResult();
|
||||
|
||||
try
|
||||
{
|
||||
Contract contractInfo = ContractSystem.ContractController.GetContract(contractId);
|
||||
// impersonate
|
||||
ContractSystem.ContractController.ImpersonateAsContractReseller(contractInfo);
|
||||
// TRACE
|
||||
ES.TaskManager.StartTask(TASK_SOURCE, CHECKOUT_TASK, methodName);
|
||||
ES.TaskManager.Write("Start accepting payment for invoice");
|
||||
ES.TaskManager.WriteParameter("ContractID", contractId);
|
||||
ES.TaskManager.WriteParameter("InvoiceID", invoiceId);
|
||||
|
||||
// get user details
|
||||
ContractAccount account = ContractSystem.ContractController.GetContractAccountSettings(contractId);
|
||||
|
||||
// try to load plugin type and throw an exception if type not found
|
||||
IPaymentGatewayProvider provider = (IPaymentGatewayProvider)SystemPluginController.GetContractPaymentMethod(
|
||||
contractInfo, methodName);
|
||||
|
||||
// add invoice details
|
||||
Invoice invoice = InvoiceController.GetCustomerInvoiceInternally(invoiceId);
|
||||
|
||||
// append information for the provider
|
||||
details[CheckoutKeys.ContractNumber] = contractId;
|
||||
details[CheckoutKeys.Amount] = invoice.Total.ToString("0.00");
|
||||
details[CheckoutKeys.InvoiceNumber] = invoice.InvoiceNumber;
|
||||
details[CheckoutKeys.Currency] = invoice.Currency;
|
||||
|
||||
ES.TaskManager.Write("Submitting payment transaction");
|
||||
// call checkout routine
|
||||
TransactionResult pgResult = provider.SubmitPaymentTransaction(details);
|
||||
// log provider response
|
||||
SystemPluginController.LogContractPayment(contractInfo, methodName, pgResult.RawResponse);
|
||||
// ERROR
|
||||
if (!pgResult.Succeed)
|
||||
{
|
||||
result.Succeed = false;
|
||||
result.StatusCode = pgResult.StatusCode;
|
||||
//
|
||||
ES.TaskManager.WriteError("Transaction failed");
|
||||
ES.TaskManager.WriteParameter("StatusCode", result.StatusCode);
|
||||
ES.TaskManager.WriteParameter("RawResponse", pgResult.RawResponse);
|
||||
// EXIT
|
||||
return result;
|
||||
}
|
||||
// OK
|
||||
ES.TaskManager.Write("Transaction is OK");
|
||||
|
||||
// check whether the transaction already exists
|
||||
CustomerPayment tran = StorehouseController.LookupForTransaction(pgResult.TransactionId);
|
||||
|
||||
// lookup for pending transaction
|
||||
if (tran == null)
|
||||
{
|
||||
// add payment record
|
||||
result.PaymentId = StorehouseController.AddCustomerPayment(contractId, invoice.InvoiceId,
|
||||
pgResult.TransactionId, invoice.Total, invoice.Currency, methodName,
|
||||
pgResult.TransactionStatus);
|
||||
// ERROR
|
||||
if (result.PaymentId < 1)
|
||||
{
|
||||
result.Succeed = false;
|
||||
result.StatusCode = result.PaymentId.ToString();
|
||||
//
|
||||
ES.TaskManager.WriteError("Could not add customer payment record to the db");
|
||||
ES.TaskManager.WriteParameter("ResultCode", result.StatusCode);
|
||||
// EXIT
|
||||
return result;
|
||||
}
|
||||
}
|
||||
// if transaction is already submitted just update it's status
|
||||
if (tran != null)
|
||||
StorehouseController.UpdateTransactionStatus(tran.PaymentId, pgResult.TransactionStatus);
|
||||
// OK
|
||||
result.Succeed = true;
|
||||
// ensure user requests to persist his payment details for credit card
|
||||
if (details.Persistent && methodName == PaymentMethod.CREDIT_CARD)
|
||||
StorehouseController.SetPaymentProfile(contractId, details);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
result.Succeed = false;
|
||||
result.StatusCode = GENERAL_FAILURE;
|
||||
//
|
||||
ES.TaskManager.WriteError(ex);
|
||||
}
|
||||
finally
|
||||
{
|
||||
ES.TaskManager.CompleteTask();
|
||||
}
|
||||
// EXIT
|
||||
return result;
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
|
@ -0,0 +1,543 @@
|
|||
// Copyright (c) 2011, 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.Data;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
|
||||
using WebsitePanel.EnterpriseServer;
|
||||
|
||||
namespace WebsitePanel.Ecommerce.EnterpriseServer
|
||||
{
|
||||
public class DomainNameController : ServiceProvisioningBase, IServiceProvisioning
|
||||
{
|
||||
public const string SOURCE_NAME = "SPF_DOMAIN_NAME";
|
||||
|
||||
public static Dictionary<int, string> ApiErrorCodesMap;
|
||||
|
||||
static DomainNameController()
|
||||
{
|
||||
ApiErrorCodesMap = new Dictionary<int, string>();
|
||||
ApiErrorCodesMap.Add(BusinessErrorCodes.ERROR_DOMAIN_QUOTA_LIMIT, ERROR_DOMAIN_QUOTA_EXCEEDED);
|
||||
}
|
||||
|
||||
#region Trace Messages
|
||||
|
||||
public const string START_ACTIVATION_MSG = "Starting domain name activation";
|
||||
public const string START_SUSPENSION_MSG = "Starting domain name suspension";
|
||||
public const string START_CANCELLATION_MSG = "Starting domain name cancellation";
|
||||
public const string START_ROLLBACK_MSG = "Trying rollback operation";
|
||||
|
||||
public const string TLD_PROVISIONED_MSG = "Domain name has been provisioned";
|
||||
|
||||
#endregion
|
||||
|
||||
#region Error Messages
|
||||
|
||||
public const string ERROR_UPDATE_USR_SETTINGS_MSG = "Could not update user settings";
|
||||
public const string ERROR_ADD_INTERNAL_DOMAIN = "Could not add internal domain";
|
||||
public const string ERROR_DOMAIN_QUOTA_EXCEEDED = "Domain quota has been exceeded in the customer's hosting plan";
|
||||
public const string ERROR_ROLLBACK_DOM_MSG = "Could not rollback added internal domain";
|
||||
|
||||
#endregion
|
||||
|
||||
protected DomainNameSvc GetDomainNameSvc(int serviceId)
|
||||
{
|
||||
// assemble svc instance
|
||||
DomainNameSvc domainSvc = ObjectUtils.FillObjectFromDataReader<DomainNameSvc>(
|
||||
EcommerceProvider.GetDomainNameSvc(SecurityContext.User.UserId, serviceId));
|
||||
// deserialize svc properties
|
||||
SecurityUtils.DeserializeGenericProfile(domainSvc.PropertyNames, domainSvc.PropertyValues, domainSvc);
|
||||
// return result
|
||||
return domainSvc;
|
||||
}
|
||||
|
||||
protected InvoiceItem GetDomainSvcSetupFee(DomainNameSvc service)
|
||||
{
|
||||
InvoiceItem line = new InvoiceItem();
|
||||
|
||||
line.ItemName = service.ServiceName;
|
||||
line.Quantity = 1;
|
||||
line.UnitPrice = service.SetupFee;
|
||||
line.TypeName = "Setup Fee";
|
||||
|
||||
return line;
|
||||
}
|
||||
|
||||
protected InvoiceItem GetDomainSvcFee(DomainNameSvc service)
|
||||
{
|
||||
InvoiceItem line = new InvoiceItem();
|
||||
|
||||
line.ItemName = service.ServiceName;
|
||||
line.ServiceId = service.ServiceId;
|
||||
line.Quantity = 1;
|
||||
line.UnitPrice = service.RecurringFee;
|
||||
// define line type
|
||||
if (service.Status != ServiceStatus.Ordered)
|
||||
{
|
||||
line.TypeName = "Recurring Fee";
|
||||
}
|
||||
else
|
||||
{
|
||||
switch (service["SPF_ACTION"])
|
||||
{
|
||||
case DomainNameSvc.SPF_TRANSFER_ACTION:
|
||||
line.TypeName = String.Concat(Product.TOP_LEVEL_DOMAIN_NAME, " Transfer");
|
||||
break;
|
||||
case DomainNameSvc.SPF_REGISTER_ACTION:
|
||||
line.TypeName = String.Concat(Product.TOP_LEVEL_DOMAIN_NAME, " Registration");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return line;
|
||||
}
|
||||
|
||||
#region IServiceProvisioning Members
|
||||
|
||||
public ServiceHistoryRecord[] GetServiceHistory(int serviceId)
|
||||
{
|
||||
List<ServiceHistoryRecord> history = ObjectUtils.CreateListFromDataReader<ServiceHistoryRecord>(
|
||||
EcommerceProvider.GetDomainNameSvcHistory(SecurityContext.User.UserId, serviceId));
|
||||
//
|
||||
if (history != null)
|
||||
return history.ToArray();
|
||||
//
|
||||
return new ServiceHistoryRecord[] { };
|
||||
}
|
||||
|
||||
public InvoiceItem[] CalculateInvoiceLines(int serviceId)
|
||||
{
|
||||
List<InvoiceItem> lines = new List<InvoiceItem>();
|
||||
//
|
||||
DomainNameSvc domainSvc = GetDomainNameSvc(serviceId);
|
||||
//
|
||||
if (domainSvc["SPF_ACTION"] != DomainNameSvc.SPF_UPDATE_NS_ACTION)
|
||||
{
|
||||
// domain svc fee
|
||||
lines.Add(GetDomainSvcFee(domainSvc));
|
||||
// setup fee
|
||||
if (domainSvc.SetupFee > 0M && domainSvc.Status == ServiceStatus.Ordered)
|
||||
lines.Add(GetDomainSvcSetupFee(domainSvc));
|
||||
}
|
||||
//
|
||||
return lines.ToArray();
|
||||
}
|
||||
|
||||
public Service GetServiceInfo(int serviceId)
|
||||
{
|
||||
return GetDomainNameSvc(serviceId);
|
||||
}
|
||||
|
||||
public int UpdateServiceInfo(Service serviceInfo)
|
||||
{
|
||||
DomainNameSvc domainSvc = (DomainNameSvc)serviceInfo;
|
||||
// serialize props & values
|
||||
string propertyNames = null;
|
||||
string propertyValues = null;
|
||||
SecurityUtils.SerializeGenericProfile(ref propertyNames, ref propertyValues, domainSvc);
|
||||
// update svc
|
||||
return EcommerceProvider.UpdateDomainNameSvc(SecurityContext.User.UserId, domainSvc.ServiceId,
|
||||
domainSvc.ProductId, (int)domainSvc.Status, domainSvc.DomainId, domainSvc.Fqdn,
|
||||
propertyNames, propertyValues);
|
||||
}
|
||||
|
||||
public int AddServiceInfo(string contractId, string currency, OrderItem orderItem)
|
||||
{
|
||||
string propertyNames = null;
|
||||
string propertyValues = null;
|
||||
// deserialize
|
||||
SecurityUtils.SerializeGenericProfile(ref propertyNames, ref propertyValues, orderItem);
|
||||
//
|
||||
return EcommerceProvider.AddDomainNameSvc(contractId, orderItem.ParentSvcId,
|
||||
orderItem.ProductId, orderItem.ItemName, orderItem.BillingCycle, currency, propertyNames, propertyValues);
|
||||
}
|
||||
|
||||
public GenericSvcResult ActivateService(ProvisioningContext context)
|
||||
{
|
||||
GenericSvcResult result = new GenericSvcResult();
|
||||
|
||||
// remeber svc state
|
||||
SaveObjectState(SERVICE_INFO, context.ServiceInfo);
|
||||
|
||||
// concretize service to be provisioned
|
||||
DomainNameSvc domainSvc = (DomainNameSvc)context.ServiceInfo;
|
||||
// concretize parent service
|
||||
HostingPackageSvc packageSvc = (HostingPackageSvc)context.ParentSvcInfo;
|
||||
|
||||
try
|
||||
{
|
||||
// LOG INFO
|
||||
TaskManager.StartTask(SystemTasks.SOURCE_ECOMMERCE, SystemTasks.SVC_ACTIVATE);
|
||||
TaskManager.WriteParameter(CONTRACT_PARAM, domainSvc.ContractId);
|
||||
TaskManager.WriteParameter(SVC_PARAM, domainSvc.ServiceName);
|
||||
TaskManager.WriteParameter(SVC_ID_PARAM, domainSvc.ServiceId);
|
||||
|
||||
// 0. Do security checks
|
||||
if (!CheckOperationClientPermissions(result))
|
||||
{
|
||||
// LOG ERROR
|
||||
TaskManager.WriteError(ERROR_CLIENT_OPERATION_PERMISSIONS);
|
||||
TaskManager.WriteParameter(RESULT_CODE_PARAM, result.ResultCode);
|
||||
// EXIT
|
||||
return result;
|
||||
}
|
||||
//
|
||||
if (!CheckOperationClientStatus(result))
|
||||
{
|
||||
// LOG ERROR
|
||||
TaskManager.WriteError(ERROR_CLIENT_OPERATION_STATUS);
|
||||
TaskManager.WriteParameter(RESULT_CODE_PARAM, result.ResultCode);
|
||||
// EXIT
|
||||
return result;
|
||||
}
|
||||
|
||||
// error: hosting addon should have parent svc assigned
|
||||
if (packageSvc == null || packageSvc.PackageId == 0)
|
||||
{
|
||||
result.Succeed = false;
|
||||
//
|
||||
result.Error = PARENT_SVC_NOT_FOUND_MSG;
|
||||
//
|
||||
result.ResultCode = EcommerceErrorCodes.ERROR_PARENT_SVC_NOT_FOUND;
|
||||
|
||||
// LOG ERROR
|
||||
TaskManager.WriteError(result.Error);
|
||||
TaskManager.WriteParameter(RESULT_CODE_PARAM, result.ResultCode);
|
||||
|
||||
// EXIT
|
||||
return result;
|
||||
}
|
||||
|
||||
// first of all - create internal domain in WebsitePanel
|
||||
if (domainSvc.Status == ServiceStatus.Ordered)
|
||||
{
|
||||
// create domain info object
|
||||
DomainInfo domain = ServerController.GetDomain(domainSvc.Fqdn);
|
||||
//
|
||||
if (domain != null)
|
||||
domainSvc.DomainId = domain.DomainId;
|
||||
//
|
||||
if (domain == null)
|
||||
{
|
||||
domain = new DomainInfo();
|
||||
domain.DomainName = domainSvc.Fqdn;
|
||||
domain.HostingAllowed = false;
|
||||
domain.PackageId = packageSvc.PackageId;
|
||||
// add internal domain
|
||||
domainSvc.DomainId = ServerController.AddDomain(domain);
|
||||
// check API result
|
||||
if (domainSvc.DomainId < 1)
|
||||
{
|
||||
// ASSEMBLE ERROR
|
||||
result.Succeed = false;
|
||||
// try to find corresponding error code->error message mapping
|
||||
if (ApiErrorCodesMap.ContainsKey(domainSvc.DomainId))
|
||||
result.Error = ApiErrorCodesMap[domainSvc.DomainId];
|
||||
else
|
||||
result.Error = ERROR_ADD_INTERNAL_DOMAIN;
|
||||
// copy result code
|
||||
result.ResultCode = domainSvc.DomainId;
|
||||
|
||||
// LOG ERROR
|
||||
TaskManager.WriteError(result.Error);
|
||||
TaskManager.WriteParameter(RESULT_CODE_PARAM, result.ResultCode);
|
||||
|
||||
// EXIT
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// update nameservers only
|
||||
if (domainSvc["SPF_ACTION"] == "UPDATE_NS")
|
||||
{
|
||||
// remove service here...
|
||||
ServiceController.DeleteCustomerService(domainSvc.ServiceId);
|
||||
//
|
||||
result.Succeed = true;
|
||||
// EXIT
|
||||
return result;
|
||||
}
|
||||
|
||||
// load registrar wrapper
|
||||
IDomainRegistrar registrar = (IDomainRegistrar)SystemPluginController.GetSystemPluginInstance(
|
||||
domainSvc.ContractId, domainSvc.PluginId, true);
|
||||
|
||||
#region Commented operations
|
||||
// prepare consumer account information
|
||||
/*CommandParams cmdParams = PrepeareAccountParams(context.ConsumerInfo);
|
||||
// copy svc properties
|
||||
foreach (string keyName in domainSvc.GetAllKeys())
|
||||
cmdParams[keyName] = domainSvc[keyName];
|
||||
|
||||
// check registrar requires sub-account to be created
|
||||
if (registrar.SubAccountRequired)
|
||||
{
|
||||
// 1. Load user's settings
|
||||
UserSettings userSettings = LoadUserSettings(context.ConsumerInfo.UserId, registrar.PluginName);
|
||||
// 2. Ensure user has account on registrar's side
|
||||
if (userSettings.SettingsArray == null || userSettings.SettingsArray.Length == 0)
|
||||
{
|
||||
// 3. Check account exists
|
||||
bool exists = registrar.CheckSubAccountExists(context.ConsumerInfo.Username, context.ConsumerInfo.Email);
|
||||
//
|
||||
AccountResult accResult = null;
|
||||
//
|
||||
if (!exists)
|
||||
{
|
||||
// 4. Create user account
|
||||
accResult = registrar.CreateSubAccount(cmdParams);
|
||||
// copy keys & values
|
||||
foreach (string keyName in accResult.AllKeys)
|
||||
{
|
||||
userSettings[keyName] = accResult[keyName];
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// 4a. Get sub-account info
|
||||
accResult = registrar.GetSubAccount(context.ConsumerInfo.Username,
|
||||
context.ConsumerInfo.Email);
|
||||
//
|
||||
foreach (string keyName in accResult.AllKeys)
|
||||
userSettings[keyName] = accResult[keyName];
|
||||
}
|
||||
// 5. Update user settings
|
||||
int apiResult = UserController.UpdateUserSettings(userSettings);
|
||||
// check API result
|
||||
if (apiResult < 0)
|
||||
{
|
||||
// BUILD ERROR
|
||||
result.Error = ERROR_UPDATE_USR_SETTINGS_MSG;
|
||||
result.Succeed = false;
|
||||
result.ResultCode = apiResult;
|
||||
// LOG ERROR
|
||||
TaskManager.WriteError(result.Error);
|
||||
TaskManager.WriteParameter(RESULT_CODE_PARAM, result.ResultCode);
|
||||
// ROLLBACK
|
||||
RollbackOperation(domainSvc.DomainId);
|
||||
// EXIT
|
||||
return result;
|
||||
}
|
||||
}
|
||||
// copy registrar-specific data
|
||||
foreach (string[] pair in userSettings.SettingsArray)
|
||||
{
|
||||
// copy 2
|
||||
cmdParams[pair[0]] = pair[1];
|
||||
}
|
||||
}*/
|
||||
#endregion
|
||||
|
||||
// load NS settings
|
||||
PackageSettings nsSettings = PackageController.GetPackageSettings(packageSvc.PackageId, PackageSettings.NAME_SERVERS);
|
||||
// build name servers array
|
||||
string[] nameServers = null;
|
||||
if (!String.IsNullOrEmpty(nsSettings[PackageSettings.NAME_SERVERS]))
|
||||
nameServers = nsSettings[PackageSettings.NAME_SERVERS].Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
|
||||
|
||||
// register or renew domain
|
||||
if (domainSvc.Status == ServiceStatus.Ordered)
|
||||
// try to register domain
|
||||
registrar.RegisterDomain(domainSvc, context.ConsumerInfo, nameServers);
|
||||
else
|
||||
// try to renew domain
|
||||
registrar.RenewDomain(domainSvc, context.ConsumerInfo, nameServers);
|
||||
|
||||
// change svc status to active
|
||||
domainSvc.Status = ServiceStatus.Active;
|
||||
// update service info
|
||||
int updResult = UpdateServiceInfo(domainSvc);
|
||||
// check update result for errors
|
||||
if (updResult < 0)
|
||||
{
|
||||
// BUILD ERROR
|
||||
result.ResultCode = updResult;
|
||||
result.Succeed = false;
|
||||
result.Error = ERROR_SVC_UPDATE_MSG;
|
||||
// LOG ERROR
|
||||
TaskManager.WriteError(result.Error);
|
||||
TaskManager.WriteParameter(RESULT_CODE_PARAM, result.ResultCode);
|
||||
// ROLLBACK
|
||||
RollbackOperation(domainSvc.DomainId);
|
||||
// EXIT
|
||||
return result;
|
||||
}
|
||||
//
|
||||
result.Succeed = true;
|
||||
//
|
||||
SetOutboundParameters(context);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
// LOG ERROR
|
||||
TaskManager.WriteError(ex);
|
||||
result.Succeed = false;
|
||||
// ROLLBACK
|
||||
RollbackOperation(result.ResultCode);
|
||||
}
|
||||
finally
|
||||
{
|
||||
TaskManager.CompleteTask();
|
||||
}
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
public GenericSvcResult SuspendService(ProvisioningContext context)
|
||||
{
|
||||
GenericSvcResult result = new GenericSvcResult();
|
||||
//
|
||||
result.Succeed = true;
|
||||
//
|
||||
DomainNameSvc service = (DomainNameSvc)context.ServiceInfo;
|
||||
service.Status = ServiceStatus.Suspended;
|
||||
//
|
||||
UpdateServiceInfo(service);
|
||||
//
|
||||
SetOutboundParameters(context);
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
public GenericSvcResult CancelService(ProvisioningContext context)
|
||||
{
|
||||
GenericSvcResult result = new GenericSvcResult();
|
||||
//
|
||||
result.Succeed = true;
|
||||
//
|
||||
DomainNameSvc service = (DomainNameSvc)context.ServiceInfo;
|
||||
service.Status = ServiceStatus.Cancelled;
|
||||
//
|
||||
UpdateServiceInfo(service);
|
||||
//
|
||||
SetOutboundParameters(context);
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
public void LogServiceUsage(ProvisioningContext context)
|
||||
{
|
||||
// concretize svc to be provisioned
|
||||
DomainNameSvc domainSvc = (DomainNameSvc)context.ServiceInfo;
|
||||
//
|
||||
base.LogServiceUsage(context.ServiceInfo, domainSvc.SvcCycleId,
|
||||
domainSvc.BillingPeriod, domainSvc.PeriodLength);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private void RollbackOperation(int domainId)
|
||||
{
|
||||
if (domainId < 1)
|
||||
return;
|
||||
|
||||
try
|
||||
{
|
||||
// restore
|
||||
DomainNameSvc domainSvc = (DomainNameSvc)RestoreObjectState(SERVICE_INFO);
|
||||
|
||||
int apiResult = 0;
|
||||
|
||||
switch (domainSvc.Status)
|
||||
{
|
||||
// Service
|
||||
case ServiceStatus.Ordered:
|
||||
apiResult = ServerController.DeleteDomain(domainId);
|
||||
break;
|
||||
}
|
||||
|
||||
// check API result
|
||||
if (apiResult < 0)
|
||||
{
|
||||
// LOG ERROR
|
||||
TaskManager.WriteError(ERROR_ROLLBACK_DOM_MSG);
|
||||
TaskManager.WriteParameter(RESULT_CODE_PARAM, apiResult);
|
||||
}
|
||||
|
||||
// rollback service changes in EC metabase
|
||||
apiResult = UpdateServiceInfo(domainSvc);
|
||||
// check API result
|
||||
if (apiResult < 0)
|
||||
{
|
||||
// LOG ERROR
|
||||
TaskManager.WriteError(ERROR_ROLLBACK_SVC_MSG);
|
||||
TaskManager.WriteParameter(RESULT_CODE_PARAM, apiResult);
|
||||
// EXIT
|
||||
return;
|
||||
}
|
||||
//
|
||||
TaskManager.Write(ROLLBACK_SUCCEED_MSG);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.WriteError(ex);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Loads user's plugin-specific settings
|
||||
/// </summary>
|
||||
/// <param name="userId"></param>
|
||||
/// <param name="pluginName"></param>
|
||||
/// <returns></returns>
|
||||
private UserSettings LoadUserSettings(int userId, string pluginName)
|
||||
{
|
||||
// build settings name
|
||||
string settingsName = pluginName + "Settings";
|
||||
// load user settings
|
||||
UserSettings settings = UserController.GetUserSettings(userId, settingsName);
|
||||
// set settings name
|
||||
settings.SettingsName = settingsName;
|
||||
//
|
||||
return settings;
|
||||
}
|
||||
|
||||
private CommandParams PrepeareAccountParams(UserInfo userInfo)
|
||||
{
|
||||
CommandParams args = new CommandParams();
|
||||
|
||||
args[CommandParams.USERNAME] = userInfo.Username;
|
||||
args[CommandParams.PASSWORD] = userInfo.Password;
|
||||
args[CommandParams.FIRST_NAME] = userInfo.FirstName;
|
||||
args[CommandParams.LAST_NAME] = userInfo.LastName;
|
||||
args[CommandParams.EMAIL] = userInfo.Email;
|
||||
args[CommandParams.ADDRESS] = userInfo.Address;
|
||||
args[CommandParams.CITY] = userInfo.City;
|
||||
args[CommandParams.STATE] = userInfo.State;
|
||||
args[CommandParams.COUNTRY] = userInfo.Country;
|
||||
args[CommandParams.ZIP] = userInfo.Zip;
|
||||
args[CommandParams.PHONE] = userInfo.PrimaryPhone;
|
||||
args[CommandParams.FAX] = userInfo.Fax;
|
||||
|
||||
return args;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,673 @@
|
|||
// Copyright (c) 2011, 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;
|
||||
using System.Collections.Generic;
|
||||
|
||||
using WebsitePanel.EnterpriseServer;
|
||||
|
||||
namespace WebsitePanel.Ecommerce.EnterpriseServer
|
||||
{
|
||||
public class HostingAddonController : ServiceProvisioningBase, IServiceProvisioning
|
||||
{
|
||||
public const string SOURCE_NAME = "SPF_HOSTING_ADDN";
|
||||
|
||||
#region Trace Messages
|
||||
|
||||
public const string START_ACTIVATION_MSG = "Starting addon activation";
|
||||
public const string START_SUSPENSION_MSG = "Starting addon suspension";
|
||||
public const string START_CANCELLATION_MSG = "Starting addon cancellation";
|
||||
public const string START_ROLLBACK_MSG = "Trying rollback operation";
|
||||
|
||||
public const string ADDON_PROVISIONED_MSG = "Addon has been provisioned";
|
||||
|
||||
#endregion
|
||||
|
||||
#region Error Messages
|
||||
|
||||
public const string ERROR_CREATE_ADDON_MSG = "Could not create hosting addon";
|
||||
|
||||
public const string ERROR_ACTIVATE_ADDON_MSG = "Could not activate hosting addon";
|
||||
public const string ERROR_SUSPEND_ADDON_MSG = "Could not suspend hosting addon";
|
||||
public const string ERROR_CANCEL_ADDON_MSG = "Could not cancel hosting addon";
|
||||
|
||||
public const string ERROR_ROLLBACK_ORDER_MSG = "Could not rollback operation and delete addon";
|
||||
public const string ERROR_ROLLBACK_MSG = "Could not rollback operation and revert addon state";
|
||||
|
||||
public const string ADDON_NOT_FOUND_MSG = "Could not find hosting addon";
|
||||
|
||||
|
||||
#endregion
|
||||
|
||||
protected HostingAddonSvc GetHostingAddonSvc(int serviceId)
|
||||
{
|
||||
return ObjectUtils.FillObjectFromDataReader<HostingAddonSvc>(
|
||||
EcommerceProvider.GetHostingAddonSvc(SecurityContext.User.UserId, serviceId));
|
||||
}
|
||||
|
||||
protected InvoiceItem GetAddonSvcFee(HostingAddonSvc service)
|
||||
{
|
||||
InvoiceItem line = new InvoiceItem();
|
||||
|
||||
line.ItemName = service.ServiceName;
|
||||
line.ServiceId = service.ServiceId;
|
||||
line.Quantity = service.Quantity;
|
||||
line.UnitPrice = service.CyclePrice;
|
||||
|
||||
if (service.Recurring && service.Status != ServiceStatus.Ordered)
|
||||
line.TypeName = "Recurring Fee";
|
||||
else
|
||||
line.TypeName = Product.HOSTING_ADDON_NAME;
|
||||
|
||||
return line;
|
||||
}
|
||||
|
||||
protected InvoiceItem GetAddonSvcSetupFee(HostingAddonSvc service)
|
||||
{
|
||||
InvoiceItem line = new InvoiceItem();
|
||||
|
||||
line.ItemName = service.ServiceName;
|
||||
line.Quantity = service.Quantity;
|
||||
line.UnitPrice = service.SetupFee;
|
||||
line.TypeName = "Setup Fee";
|
||||
|
||||
return line;
|
||||
}
|
||||
|
||||
#region IServiceProvisioning Members
|
||||
|
||||
public ServiceHistoryRecord[] GetServiceHistory(int serviceId)
|
||||
{
|
||||
List<ServiceHistoryRecord> history = ObjectUtils.CreateListFromDataReader<ServiceHistoryRecord>(
|
||||
EcommerceProvider.GetHostingAddonSvcHistory(SecurityContext.User.UserId, serviceId));
|
||||
//
|
||||
if (history != null)
|
||||
return history.ToArray();
|
||||
//
|
||||
return new ServiceHistoryRecord[] { };
|
||||
}
|
||||
|
||||
public InvoiceItem[] CalculateInvoiceLines(int serviceId)
|
||||
{
|
||||
List<InvoiceItem> lines = new List<InvoiceItem>();
|
||||
//
|
||||
HostingAddonSvc addonSvc = GetHostingAddonSvc(serviceId);
|
||||
// addon svc fee
|
||||
lines.Add(GetAddonSvcFee(addonSvc));
|
||||
// addon svc setup fee
|
||||
if (addonSvc.SetupFee > 0M && addonSvc.Status == ServiceStatus.Ordered)
|
||||
lines.Add(GetAddonSvcSetupFee(addonSvc));
|
||||
//
|
||||
return lines.ToArray();
|
||||
}
|
||||
|
||||
public int AddServiceInfo(string contractId, string currency, OrderItem orderItem)
|
||||
{
|
||||
// get hosting addon product
|
||||
HostingAddon addon = StorehouseController.GetHostingAddon(SecurityContext.User.UserId,
|
||||
orderItem.ProductId);
|
||||
// uncountable addons always have 1 for quantity
|
||||
int quantity = addon.Countable ? orderItem.Quantity : 1;
|
||||
// add hosting addon
|
||||
return EcommerceProvider.AddHostingAddonSvc(contractId, orderItem.ParentSvcId, orderItem.ProductId,
|
||||
quantity, orderItem.ItemName, orderItem.BillingCycle, currency);
|
||||
}
|
||||
|
||||
public Service GetServiceInfo(int serviceId)
|
||||
{
|
||||
return GetHostingAddonSvc(serviceId);
|
||||
}
|
||||
|
||||
public int UpdateServiceInfo(Service serviceInfo)
|
||||
{
|
||||
HostingAddonSvc addonSvc = (HostingAddonSvc)serviceInfo;
|
||||
//
|
||||
return EcommerceProvider.UpdateHostingAddonSvc(SecurityContext.User.UserId, addonSvc.ServiceId,
|
||||
addonSvc.ProductId, addonSvc.ServiceName, (int)addonSvc.Status, addonSvc.PlanId,
|
||||
addonSvc.PackageAddonId, addonSvc.Recurring, addonSvc.DummyAddon);
|
||||
}
|
||||
|
||||
public GenericSvcResult ActivateService(ProvisioningContext context)
|
||||
{
|
||||
GenericSvcResult result = new GenericSvcResult();
|
||||
|
||||
// remeber svc state
|
||||
SaveObjectState(SERVICE_INFO, context.ServiceInfo);
|
||||
|
||||
// concretize service to be provisioned
|
||||
HostingAddonSvc addonSvc = (HostingAddonSvc)context.ServiceInfo;
|
||||
// concretize parent svc
|
||||
HostingPackageSvc packageSvc = (HostingPackageSvc)context.ParentSvcInfo;
|
||||
|
||||
//
|
||||
try
|
||||
{
|
||||
//
|
||||
TaskManager.StartTask(SystemTasks.SOURCE_ECOMMERCE, SystemTasks.SVC_ACTIVATE);
|
||||
|
||||
// LOG INFO
|
||||
TaskManager.Write(START_ACTIVATION_MSG);
|
||||
TaskManager.WriteParameter(CONTRACT_PARAM, addonSvc.ContractId);
|
||||
TaskManager.WriteParameter(SVC_PARAM, addonSvc.ServiceName);
|
||||
TaskManager.WriteParameter(SVC_ID_PARAM, addonSvc.ServiceId);
|
||||
|
||||
// 0. Do security checks
|
||||
if (!CheckOperationClientPermissions(result))
|
||||
{
|
||||
// LOG ERROR
|
||||
TaskManager.WriteError(ERROR_CLIENT_OPERATION_PERMISSIONS);
|
||||
TaskManager.WriteParameter(RESULT_CODE_PARAM, result.ResultCode);
|
||||
// EXIT
|
||||
return result;
|
||||
}
|
||||
//
|
||||
if (!CheckOperationClientStatus(result))
|
||||
{
|
||||
// LOG ERROR
|
||||
TaskManager.WriteError(ERROR_CLIENT_OPERATION_STATUS);
|
||||
TaskManager.WriteParameter(RESULT_CODE_PARAM, result.ResultCode);
|
||||
// EXIT
|
||||
return result;
|
||||
}
|
||||
|
||||
// dummy addon should be just updated in metabase
|
||||
if (addonSvc.DummyAddon)
|
||||
goto UpdateSvcMetaInfo;
|
||||
|
||||
if (addonSvc.Status == ServiceStatus.Ordered)
|
||||
{
|
||||
// error: hosting addon should have parent svc assigned
|
||||
if (packageSvc == null || packageSvc.PackageId == 0)
|
||||
{
|
||||
result.Succeed = false;
|
||||
//
|
||||
result.Error = PARENT_SVC_NOT_FOUND_MSG;
|
||||
//
|
||||
result.ResultCode = EcommerceErrorCodes.ERROR_PARENT_SVC_NOT_FOUND;
|
||||
|
||||
// LOG ERROR
|
||||
TaskManager.WriteError(result.Error);
|
||||
TaskManager.WriteParameter(RESULT_CODE_PARAM, result.ResultCode);
|
||||
|
||||
// EXIT
|
||||
return result;
|
||||
}
|
||||
|
||||
// fill package add-on fields
|
||||
PackageAddonInfo addon = new PackageAddonInfo();
|
||||
//
|
||||
addon.PackageId = packageSvc.PackageId;
|
||||
//
|
||||
addon.PlanId = addonSvc.PlanId;
|
||||
// set addon quantity
|
||||
addon.Quantity = addonSvc.Quantity;
|
||||
//
|
||||
addon.StatusId = (int)PackageStatus.Active;
|
||||
//
|
||||
addon.PurchaseDate = DateTime.Now;
|
||||
|
||||
// Create hosting addon through WebsitePanel API
|
||||
PackageResult apiResult = PackageController.AddPackageAddon(addon);
|
||||
// Failed to create addon
|
||||
if (apiResult.Result < 1)
|
||||
{
|
||||
result.Succeed = false;
|
||||
//
|
||||
result.ResultCode = apiResult.Result;
|
||||
|
||||
// LOG ERROR
|
||||
TaskManager.WriteError(ERROR_CREATE_ADDON_MSG);
|
||||
TaskManager.WriteParameter(RESULT_CODE_PARAM, result.ResultCode);
|
||||
|
||||
// EXIT
|
||||
return result;
|
||||
}
|
||||
// store package id
|
||||
addonSvc.PackageAddonId = apiResult.Result;
|
||||
}
|
||||
else
|
||||
{
|
||||
// load package addon
|
||||
PackageAddonInfo addonInfo = PackageController.GetPackageAddon(addonSvc.PackageAddonId);
|
||||
// package addon not found
|
||||
if (addonInfo == null)
|
||||
{
|
||||
result.Succeed = false;
|
||||
//
|
||||
result.ResultCode = EcommerceErrorCodes.ERROR_PCKG_ADDON_NOT_FOUND;
|
||||
//
|
||||
result.Error = ADDON_NOT_FOUND_MSG;
|
||||
|
||||
// LOG ERROR
|
||||
TaskManager.WriteError(result.Error);
|
||||
TaskManager.WriteParameter(RESULT_CODE_PARAM, result.ResultCode);
|
||||
|
||||
// EXIT
|
||||
return result;
|
||||
}
|
||||
|
||||
// workaround for bug in GetPackageAddon routine
|
||||
//addonInfo.PackageAddonId = addonSvc.PackageAddonId;
|
||||
// change package add-on status
|
||||
addonInfo.StatusId = (int)PackageStatus.Active;
|
||||
|
||||
// save hosting addon changes
|
||||
PackageResult apiResult = PackageController.UpdatePackageAddon(addonInfo);
|
||||
// check returned result
|
||||
if (apiResult.Result < 0)
|
||||
{
|
||||
result.Succeed = false;
|
||||
//
|
||||
result.ResultCode = apiResult.Result;
|
||||
|
||||
// LOG ERROR
|
||||
TaskManager.WriteError(ERROR_ACTIVATE_ADDON_MSG);
|
||||
TaskManager.WriteParameter(RESULT_CODE_PARAM, result.ResultCode);
|
||||
|
||||
// EXIT
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
UpdateSvcMetaInfo:
|
||||
// update status only if necessary
|
||||
if (addonSvc.Status != ServiceStatus.Active)
|
||||
{
|
||||
// change service status to active
|
||||
addonSvc.Status = ServiceStatus.Active;
|
||||
// put data into metabase
|
||||
int svcResult = UpdateServiceInfo(addonSvc);
|
||||
// failed to update metabase
|
||||
if (svcResult < 0)
|
||||
{
|
||||
result.ResultCode = svcResult;
|
||||
//
|
||||
result.Succeed = false;
|
||||
//
|
||||
result.Error = ERROR_SVC_UPDATE_MSG;
|
||||
|
||||
// LOG ERROR
|
||||
TaskManager.WriteError(result.Error);
|
||||
TaskManager.WriteParameter(RESULT_CODE_PARAM, result.ResultCode);
|
||||
|
||||
// ROLLBACK CHANGES
|
||||
RollbackOperation(addonSvc.PackageAddonId);
|
||||
|
||||
// EXIT
|
||||
return result;
|
||||
}
|
||||
}
|
||||
//
|
||||
SetOutboundParameters(context);
|
||||
// LOG INFO
|
||||
TaskManager.Write(ADDON_PROVISIONED_MSG);
|
||||
//
|
||||
result.Succeed = true;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
//
|
||||
TaskManager.WriteError(ex);
|
||||
|
||||
// ROLLBACK CHANGES
|
||||
RollbackOperation(addonSvc.PackageAddonId);
|
||||
|
||||
//
|
||||
result.Succeed = false;
|
||||
//
|
||||
result.Error = ex.Message;
|
||||
}
|
||||
finally
|
||||
{
|
||||
// complete task
|
||||
TaskManager.CompleteTask();
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
public GenericSvcResult SuspendService(ProvisioningContext context)
|
||||
{
|
||||
GenericSvcResult result = new GenericSvcResult();
|
||||
//
|
||||
SaveObjectState(SERVICE_INFO, context.ServiceInfo);
|
||||
// concretize service to be provisioned
|
||||
HostingAddonSvc addonSvc = (HostingAddonSvc)context.ServiceInfo;
|
||||
//
|
||||
try
|
||||
{
|
||||
//
|
||||
TaskManager.StartTask(SystemTasks.SOURCE_ECOMMERCE, SystemTasks.SVC_SUSPEND);
|
||||
// LOG INFO
|
||||
TaskManager.Write(START_SUSPENSION_MSG);
|
||||
TaskManager.WriteParameter(CONTRACT_PARAM, addonSvc.ContractId);
|
||||
TaskManager.WriteParameter(SVC_PARAM, addonSvc.ServiceName);
|
||||
TaskManager.WriteParameter(SVC_ID_PARAM, addonSvc.ServiceId);
|
||||
|
||||
// 0. Do security checks
|
||||
if (!CheckOperationClientPermissions(result))
|
||||
{
|
||||
// LOG ERROR
|
||||
TaskManager.WriteError(ERROR_CLIENT_OPERATION_PERMISSIONS);
|
||||
TaskManager.WriteParameter(RESULT_CODE_PARAM, result.ResultCode);
|
||||
// EXIT
|
||||
return result;
|
||||
}
|
||||
//
|
||||
if (!CheckOperationClientStatus(result))
|
||||
{
|
||||
// LOG ERROR
|
||||
TaskManager.WriteError(ERROR_CLIENT_OPERATION_STATUS);
|
||||
TaskManager.WriteParameter(RESULT_CODE_PARAM, result.ResultCode);
|
||||
// EXIT
|
||||
return result;
|
||||
}
|
||||
|
||||
// dummy addon should be just updated in metabase
|
||||
if (addonSvc.DummyAddon)
|
||||
goto UpdateSvcMetaInfo;
|
||||
|
||||
PackageAddonInfo addonInfo = PackageController.GetPackageAddon(addonSvc.PackageAddonId);
|
||||
addonInfo.StatusId = (int)PackageStatus.Suspended;
|
||||
// suspend hosting addon
|
||||
int apiResult = PackageController.UpdatePackageAddon(addonInfo).Result;
|
||||
|
||||
// check WebsitePanel API result
|
||||
if (apiResult < 0)
|
||||
{
|
||||
result.ResultCode = apiResult;
|
||||
//
|
||||
result.Succeed = false;
|
||||
|
||||
// LOG ERROR
|
||||
TaskManager.WriteError(ERROR_SUSPEND_ADDON_MSG);
|
||||
TaskManager.WriteParameter(RESULT_CODE_PARAM, result.ResultCode);
|
||||
|
||||
// exit
|
||||
return result;
|
||||
}
|
||||
|
||||
UpdateSvcMetaInfo:
|
||||
// change addon status to Suspended
|
||||
addonSvc.Status = ServiceStatus.Suspended;
|
||||
// put data into metabase
|
||||
int svcResult = UpdateServiceInfo(addonSvc);
|
||||
//
|
||||
if (svcResult < 0)
|
||||
{
|
||||
result.ResultCode = svcResult;
|
||||
//
|
||||
result.Succeed = false;
|
||||
|
||||
// LOG ERROR
|
||||
TaskManager.WriteError(ERROR_SVC_UPDATE_MSG);
|
||||
TaskManager.WriteParameter(RESULT_CODE_PARAM, result.ResultCode);
|
||||
|
||||
// ROLLBACK CHANGES
|
||||
RollbackOperation(addonSvc.PackageAddonId);
|
||||
|
||||
// EXIT
|
||||
return result;
|
||||
}
|
||||
//
|
||||
SetOutboundParameters(context);
|
||||
// LOG INFO
|
||||
TaskManager.Write(ADDON_PROVISIONED_MSG);
|
||||
//
|
||||
result.Succeed = true;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
//
|
||||
TaskManager.WriteError(ex);
|
||||
|
||||
// ROLLBACK CHANGES
|
||||
RollbackOperation(addonSvc.PackageAddonId);
|
||||
|
||||
//
|
||||
result.Succeed = false;
|
||||
//
|
||||
result.Error = ex.Message;
|
||||
}
|
||||
finally
|
||||
{
|
||||
// complete task
|
||||
TaskManager.CompleteTask();
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
public GenericSvcResult CancelService(ProvisioningContext context)
|
||||
{
|
||||
GenericSvcResult result = new GenericSvcResult();
|
||||
//
|
||||
SaveObjectState(SERVICE_INFO, context.ServiceInfo);
|
||||
// concretize service to be provisioned
|
||||
HostingAddonSvc addonSvc = (HostingAddonSvc)context.ServiceInfo;
|
||||
//
|
||||
try
|
||||
{
|
||||
//
|
||||
TaskManager.StartTask(SystemTasks.SOURCE_ECOMMERCE, SystemTasks.SVC_CANCEL);
|
||||
// LOG INFO
|
||||
TaskManager.Write(START_CANCELLATION_MSG);
|
||||
TaskManager.WriteParameter(CONTRACT_PARAM, addonSvc.ContractId);
|
||||
TaskManager.WriteParameter(SVC_PARAM, addonSvc.ServiceName);
|
||||
TaskManager.WriteParameter(SVC_ID_PARAM, addonSvc.ServiceId);
|
||||
|
||||
// 0. Do security checks
|
||||
if (!CheckOperationClientPermissions(result))
|
||||
{
|
||||
// LOG ERROR
|
||||
TaskManager.WriteError(ERROR_CLIENT_OPERATION_PERMISSIONS);
|
||||
TaskManager.WriteParameter(RESULT_CODE_PARAM, result.ResultCode);
|
||||
// EXIT
|
||||
return result;
|
||||
}
|
||||
//
|
||||
if (!CheckOperationClientStatus(result))
|
||||
{
|
||||
// LOG ERROR
|
||||
TaskManager.WriteError(ERROR_CLIENT_OPERATION_STATUS);
|
||||
TaskManager.WriteParameter(RESULT_CODE_PARAM, result.ResultCode);
|
||||
// EXIT
|
||||
return result;
|
||||
}
|
||||
|
||||
// dummy addon should be just updated in metabase
|
||||
if (addonSvc.DummyAddon)
|
||||
goto UpdateSvcMetaInfo;
|
||||
|
||||
PackageAddonInfo addonInfo = PackageController.GetPackageAddon(addonSvc.PackageAddonId);
|
||||
addonInfo.StatusId = (int)PackageStatus.Cancelled;
|
||||
// cancel hosting addon
|
||||
int apiResult = PackageController.UpdatePackageAddon(addonInfo).Result;
|
||||
|
||||
// check WebsitePanel API result
|
||||
if (apiResult < 0)
|
||||
{
|
||||
result.ResultCode = apiResult;
|
||||
//
|
||||
result.Succeed = false;
|
||||
|
||||
// LOG ERROR
|
||||
TaskManager.WriteError(ERROR_CANCEL_ADDON_MSG);
|
||||
TaskManager.WriteParameter(RESULT_CODE_PARAM, result.ResultCode);
|
||||
|
||||
// exit
|
||||
return result;
|
||||
}
|
||||
|
||||
UpdateSvcMetaInfo:
|
||||
// change addon status to Cancelled
|
||||
addonSvc.Status = ServiceStatus.Cancelled;
|
||||
// put data into metabase
|
||||
int svcResult = UpdateServiceInfo(addonSvc);
|
||||
//
|
||||
if (svcResult < 0)
|
||||
{
|
||||
result.ResultCode = svcResult;
|
||||
//
|
||||
result.Succeed = false;
|
||||
|
||||
// LOG ERROR
|
||||
TaskManager.WriteError(ERROR_SVC_UPDATE_MSG);
|
||||
TaskManager.WriteParameter(RESULT_CODE_PARAM, result.ResultCode);
|
||||
|
||||
// ROLLBACK CHANGES
|
||||
RollbackOperation(addonSvc.PackageAddonId);
|
||||
|
||||
// EXIT
|
||||
return result;
|
||||
}
|
||||
//
|
||||
SetOutboundParameters(context);
|
||||
// LOG INFO
|
||||
TaskManager.Write(ADDON_PROVISIONED_MSG);
|
||||
//
|
||||
result.Succeed = true;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
//
|
||||
TaskManager.WriteError(ex);
|
||||
|
||||
// ROLLBACK CHANGES
|
||||
RollbackOperation(addonSvc.PackageAddonId);
|
||||
|
||||
//
|
||||
result.Succeed = false;
|
||||
//
|
||||
result.Error = ex.Message;
|
||||
}
|
||||
finally
|
||||
{
|
||||
// complete task
|
||||
TaskManager.CompleteTask();
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
public void LogServiceUsage(ProvisioningContext context)
|
||||
{
|
||||
// concretize service to be logged
|
||||
HostingAddonSvc addonSvc = (HostingAddonSvc)context.ServiceInfo;
|
||||
|
||||
// addon is recurring
|
||||
if (addonSvc.Recurring)
|
||||
{
|
||||
// log service usage
|
||||
base.LogServiceUsage(context.ServiceInfo, addonSvc.SvcCycleId,
|
||||
addonSvc.BillingPeriod, addonSvc.PeriodLength);
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
protected void RollbackOperation(int packageAddonId)
|
||||
{
|
||||
// check input parameters first
|
||||
if (packageAddonId < 1)
|
||||
return; // exit
|
||||
|
||||
//
|
||||
try
|
||||
{
|
||||
TaskManager.Write(START_ROLLBACK_MSG);
|
||||
// restore service
|
||||
HostingAddonSvc addonSvc = (HostingAddonSvc)RestoreObjectState(SERVICE_INFO);
|
||||
PackageAddonInfo addonInfo = PackageController.GetPackageAddon(addonSvc.PackageAddonId);
|
||||
//
|
||||
int apiResult = 0;
|
||||
|
||||
// during rollback addon should be reverted to its original state
|
||||
// compensation logic - revert back addon status
|
||||
switch (addonSvc.Status)
|
||||
{
|
||||
// Active State
|
||||
case ServiceStatus.Active:
|
||||
addonInfo.StatusId = (int)PackageStatus.Active;
|
||||
apiResult = PackageController.UpdatePackageAddon(addonInfo).Result;
|
||||
break;
|
||||
// Suspended State
|
||||
case ServiceStatus.Suspended:
|
||||
addonInfo.StatusId = (int)PackageStatus.Suspended;
|
||||
apiResult = PackageController.UpdatePackageAddon(addonInfo).Result;
|
||||
break;
|
||||
// Cancelled State
|
||||
case ServiceStatus.Cancelled:
|
||||
addonInfo.StatusId = (int)PackageStatus.Cancelled;
|
||||
apiResult = PackageController.UpdatePackageAddon(addonInfo).Result;
|
||||
break;
|
||||
// service has been just ordered & during rollback should be removed
|
||||
case ServiceStatus.Ordered:
|
||||
// compensation logic - remove created package
|
||||
apiResult = PackageController.DeletePackageAddon(packageAddonId);
|
||||
break;
|
||||
}
|
||||
// check WebsitePanel API result
|
||||
if (apiResult < 0)
|
||||
{
|
||||
//
|
||||
if (addonSvc.Status == ServiceStatus.Ordered)
|
||||
TaskManager.WriteError(ERROR_ROLLBACK_ORDER_MSG);
|
||||
else
|
||||
TaskManager.WriteError(ERROR_ROLLBACK_MSG);
|
||||
//
|
||||
TaskManager.WriteParameter(RESULT_CODE_PARAM, apiResult);
|
||||
}
|
||||
|
||||
// rollback service changes in EC metabase
|
||||
apiResult = UpdateServiceInfo(addonSvc);
|
||||
// check API result
|
||||
if (apiResult < 0)
|
||||
{
|
||||
// LOG ERROR
|
||||
TaskManager.WriteError(ERROR_ROLLBACK_SVC_MSG);
|
||||
TaskManager.WriteParameter(RESULT_CODE_PARAM, apiResult);
|
||||
|
||||
//
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
TaskManager.Write(ROLLBACK_SUCCEED_MSG);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.WriteError(ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,676 @@
|
|||
// Copyright (c) 2011, 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;
|
||||
using System.Collections.Generic;
|
||||
|
||||
using WebsitePanel.EnterpriseServer;
|
||||
|
||||
namespace WebsitePanel.Ecommerce.EnterpriseServer
|
||||
{
|
||||
public class HostingPackageController : ServiceProvisioningBase, IServiceProvisioning
|
||||
{
|
||||
//
|
||||
public const string SOURCE_NAME = "SPF_HOSTING_PKG";
|
||||
|
||||
#region Trace Messages
|
||||
|
||||
public const string START_ACTIVATION_MSG = "Starting package activation";
|
||||
public const string START_SUSPENSION_MSG = "Starting package suspension";
|
||||
public const string START_CANCELLATION_MSG = "Starting package cancellation";
|
||||
|
||||
public const string CREATE_PCKG_MSG = "Creating new hosting package";
|
||||
public const string CREATE_PCKG_ERROR_MSG = "Could not create hosting package";
|
||||
|
||||
public const string ERROR_ACTIVATE_PCKG_MSG = "Could not activate hosting package";
|
||||
public const string ERROR_SUSPEND_PCKG_MSG = "Could not suspend hosting package";
|
||||
public const string ERROR_CANCEL_PCKG_MSG = "Could not cancel hosting package";
|
||||
|
||||
public const string START_USR_ACTIVATION_MSG = "Activating service consumer account";
|
||||
public const string START_CHANGE_USR_ROLE_MSG = "Changing consumer user role";
|
||||
public const string ERROR_USR_ACTIVATION_MSG = "Could not activate consumer account";
|
||||
public const string ERROR_CHANGE_USR_ROLE_MSG = "Could not change consumer user role";
|
||||
|
||||
public const string PCKG_PROVISIONED_MSG = "Package has been provisioned";
|
||||
|
||||
#endregion
|
||||
|
||||
protected HostingPackageSvc GetHostingPackageSvc(int serviceId)
|
||||
{
|
||||
return ObjectUtils.FillObjectFromDataReader<HostingPackageSvc>(
|
||||
EcommerceProvider.GetHostingPackageSvc(SecurityContext.User.UserId, serviceId));
|
||||
}
|
||||
|
||||
protected InvoiceItem GetSetupFeeInvoiceLine(HostingPackageSvc service)
|
||||
{
|
||||
InvoiceItem line = new InvoiceItem();
|
||||
|
||||
line.ItemName = service.ServiceName;
|
||||
line.Quantity = 1;
|
||||
line.UnitPrice = service.SetupFee;
|
||||
line.TypeName = "Setup Fee";
|
||||
|
||||
return line;
|
||||
}
|
||||
|
||||
protected InvoiceItem GetRecurringFeeInvoiceLine(HostingPackageSvc service)
|
||||
{
|
||||
InvoiceItem line = new InvoiceItem();
|
||||
|
||||
line.ItemName = service.ServiceName;
|
||||
line.ServiceId = service.ServiceId;
|
||||
line.Quantity = 1;
|
||||
line.UnitPrice = service.RecurringFee;
|
||||
line.TypeName = (service.Status == ServiceStatus.Ordered) ? Product.HOSTING_PLAN_NAME : "Recurring Fee";
|
||||
|
||||
return line;
|
||||
}
|
||||
|
||||
#region IServiceProvisioning Members
|
||||
|
||||
public ServiceHistoryRecord[] GetServiceHistory(int serviceId)
|
||||
{
|
||||
List<ServiceHistoryRecord> history = ObjectUtils.CreateListFromDataReader<ServiceHistoryRecord>(
|
||||
EcommerceProvider.GetHostingPackageSvcHistory(SecurityContext.User.UserId, serviceId));
|
||||
|
||||
if (history != null)
|
||||
return history.ToArray();
|
||||
|
||||
return new ServiceHistoryRecord[] { };
|
||||
}
|
||||
|
||||
public InvoiceItem[] CalculateInvoiceLines(int serviceId)
|
||||
{
|
||||
List<InvoiceItem> lines = new List<InvoiceItem>();
|
||||
// load svc
|
||||
HostingPackageSvc packageSvc = GetHostingPackageSvc(serviceId);
|
||||
|
||||
// recurring fee
|
||||
lines.Add(GetRecurringFeeInvoiceLine(packageSvc));
|
||||
// setup fee
|
||||
if (packageSvc.Status == ServiceStatus.Ordered && packageSvc.SetupFee > 0M)
|
||||
lines.Add(GetSetupFeeInvoiceLine(packageSvc));
|
||||
|
||||
return lines.ToArray();
|
||||
}
|
||||
|
||||
public int AddServiceInfo(string contractId, string currency, OrderItem orderItem)
|
||||
{
|
||||
return EcommerceProvider.AddHostingPlanSvc(contractId, orderItem.ProductId,
|
||||
orderItem.ItemName, orderItem.BillingCycle, currency);
|
||||
}
|
||||
|
||||
public Service GetServiceInfo(int serviceId)
|
||||
{
|
||||
return GetHostingPackageSvc(serviceId);
|
||||
}
|
||||
|
||||
public int UpdateServiceInfo(Service service)
|
||||
{
|
||||
HostingPackageSvc packageSvc = (HostingPackageSvc)service;
|
||||
//
|
||||
return EcommerceProvider.UpdateHostingPlanSvc(SecurityContext.User.UserId, packageSvc.ServiceId,
|
||||
packageSvc.ProductId, packageSvc.ServiceName, (int)packageSvc.Status, packageSvc.PlanId,
|
||||
packageSvc.PackageId, (int)packageSvc.UserRole, (int)packageSvc.InitialStatus);
|
||||
}
|
||||
|
||||
public GenericSvcResult ActivateService(ProvisioningContext context)
|
||||
{
|
||||
GenericSvcResult result = new GenericSvcResult();
|
||||
|
||||
//
|
||||
SaveObjectState(SERVICE_INFO, context.ServiceInfo);
|
||||
//
|
||||
SaveObjectState(CONSUMER_INFO, context.ConsumerInfo);
|
||||
|
||||
// concretize service to be provisioned
|
||||
HostingPackageSvc packageSvc = (HostingPackageSvc)context.ServiceInfo;
|
||||
//
|
||||
try
|
||||
{
|
||||
//
|
||||
TaskManager.StartTask(SystemTasks.SOURCE_ECOMMERCE, SystemTasks.SVC_ACTIVATE);
|
||||
|
||||
// LOG INFO
|
||||
TaskManager.Write(START_ACTIVATION_MSG);
|
||||
TaskManager.WriteParameter(USERNAME_PARAM, context.ConsumerInfo[ContractAccount.USERNAME]);
|
||||
TaskManager.WriteParameter(SVC_PARAM, context.ServiceInfo.ServiceName);
|
||||
TaskManager.WriteParameter(SVC_ID_PARAM, context.ServiceInfo.ServiceId);
|
||||
TaskManager.TaskParameters[SystemTaskParams.PARAM_SEND_EMAIL] = context.SendEmail;
|
||||
|
||||
// 0. Do security checks
|
||||
if (!CheckOperationClientPermissions(result))
|
||||
{
|
||||
// LOG ERROR
|
||||
TaskManager.WriteError(ERROR_CLIENT_OPERATION_PERMISSIONS);
|
||||
TaskManager.WriteParameter(RESULT_CODE_PARAM, result.ResultCode);
|
||||
// EXIT
|
||||
return result;
|
||||
}
|
||||
//
|
||||
if (!CheckOperationClientStatus(result))
|
||||
{
|
||||
// LOG ERROR
|
||||
TaskManager.WriteError(ERROR_CLIENT_OPERATION_STATUS);
|
||||
TaskManager.WriteParameter(RESULT_CODE_PARAM, result.ResultCode);
|
||||
// EXIT
|
||||
return result;
|
||||
}
|
||||
|
||||
// 1. Hosting package is just ordered
|
||||
if (context.ServiceInfo.Status == ServiceStatus.Ordered && context.ContractInfo.CustomerId > 0)
|
||||
{
|
||||
// LOG INFO
|
||||
TaskManager.Write(CREATE_PCKG_MSG);
|
||||
// create new package
|
||||
PackageResult apiResult = PackageController.AddPackage(context.ContractInfo.CustomerId, packageSvc.PlanId,
|
||||
packageSvc.ServiceName, String.Empty, (int)packageSvc.InitialStatus, DateTime.Now, true, true);
|
||||
|
||||
// failed to instantiate package
|
||||
if (apiResult.Result <= 0)
|
||||
{
|
||||
result.ResultCode = apiResult.Result;
|
||||
//
|
||||
result.Succeed = false;
|
||||
|
||||
// LOG ERROR
|
||||
TaskManager.WriteError(CREATE_PCKG_ERROR_MSG);
|
||||
TaskManager.WriteParameter(RESULT_CODE_PARAM, result.ResultCode);
|
||||
|
||||
// EXIT
|
||||
return result;
|
||||
}
|
||||
// save result PackageId
|
||||
packageSvc.PackageId = apiResult.Result;
|
||||
}
|
||||
else // 2. Package requires only to update its status
|
||||
{
|
||||
// LOG INFO
|
||||
TaskManager.Write(START_ACTIVATION_MSG);
|
||||
|
||||
//
|
||||
int apiResult = PackageController.ChangePackageStatus(packageSvc.PackageId,
|
||||
PackageStatus.Active, false);
|
||||
//
|
||||
if (apiResult < 0)
|
||||
{
|
||||
result.ResultCode = apiResult;
|
||||
//
|
||||
result.Succeed = false;
|
||||
|
||||
// LOG ERROR
|
||||
TaskManager.WriteError(ERROR_ACTIVATE_PCKG_MSG);
|
||||
TaskManager.WriteParameter(RESULT_CODE_PARAM, result.ResultCode);
|
||||
|
||||
// EXIT
|
||||
return result;
|
||||
}
|
||||
}
|
||||
// check user role
|
||||
if (context.ContractInfo.CustomerId > 0)
|
||||
{
|
||||
UserInfo user = UserController.GetUserInternally(context.ContractInfo.CustomerId);
|
||||
// check user status
|
||||
//
|
||||
if (user.Status != UserStatus.Active)
|
||||
{
|
||||
// LOG INFO
|
||||
TaskManager.Write(START_USR_ACTIVATION_MSG);
|
||||
|
||||
// trying to change user status
|
||||
int userResult = UserController.ChangeUserStatus(context.ContractInfo.CustomerId,
|
||||
UserStatus.Active);
|
||||
// failed to activate user account
|
||||
if (userResult < 0)
|
||||
{
|
||||
result.ResultCode = userResult;
|
||||
//
|
||||
result.Succeed = false;
|
||||
|
||||
// LOG ERROR
|
||||
TaskManager.WriteError(ERROR_USR_ACTIVATION_MSG);
|
||||
TaskManager.WriteParameter(RESULT_CODE_PARAM, result.ResultCode);
|
||||
|
||||
// ROLLBACK CHANGES
|
||||
RollbackOperation(result.ResultCode);
|
||||
|
||||
// EXIT
|
||||
return result;
|
||||
}
|
||||
}
|
||||
// check user role
|
||||
if (user.Role != packageSvc.UserRole)
|
||||
{
|
||||
// LOG INFO
|
||||
TaskManager.Write(START_CHANGE_USR_ROLE_MSG);
|
||||
//
|
||||
user.Role = packageSvc.UserRole;
|
||||
// trying to change user role
|
||||
int roleResult = UserController.UpdateUser(user);
|
||||
// failed to change user role
|
||||
if (roleResult < 0)
|
||||
{
|
||||
result.ResultCode = roleResult;
|
||||
//
|
||||
result.Succeed = false;
|
||||
|
||||
//
|
||||
TaskManager.WriteError(ERROR_CHANGE_USR_ROLE_MSG);
|
||||
TaskManager.WriteParameter(RESULT_CODE_PARAM, result.ResultCode);
|
||||
|
||||
// ROLLBACK CHANGES
|
||||
RollbackOperation(result.ResultCode);
|
||||
|
||||
// EXIT
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
// update plan status if necessary
|
||||
if (packageSvc.Status != ServiceStatus.Active)
|
||||
{
|
||||
// change service status to active
|
||||
packageSvc.Status = ServiceStatus.Active;
|
||||
// put data into metabase
|
||||
int svcResult = UpdateServiceInfo(packageSvc);
|
||||
|
||||
// error updating svc details
|
||||
if (svcResult < 0)
|
||||
{
|
||||
result.ResultCode = svcResult;
|
||||
//
|
||||
result.Succeed = false;
|
||||
|
||||
// ROLLBACK CHANGES
|
||||
RollbackOperation(packageSvc.PackageId);
|
||||
|
||||
// LOG ERROR
|
||||
TaskManager.WriteError(ERROR_SVC_UPDATE_MSG);
|
||||
TaskManager.WriteParameter(RESULT_CODE_PARAM, result.ResultCode);
|
||||
|
||||
// EXIT
|
||||
return result;
|
||||
}
|
||||
}
|
||||
//
|
||||
SetOutboundParameters(context);
|
||||
// LOG INFO
|
||||
TaskManager.Write(PCKG_PROVISIONED_MSG);
|
||||
|
||||
//
|
||||
result.Succeed = true;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
//
|
||||
TaskManager.WriteError(ex);
|
||||
|
||||
// ROLLBACK CHANGES
|
||||
RollbackOperation(packageSvc.PackageId);
|
||||
|
||||
//
|
||||
result.Succeed = false;
|
||||
//
|
||||
result.Error = ex.Message;
|
||||
}
|
||||
finally
|
||||
{
|
||||
// complete task
|
||||
TaskManager.CompleteTask();
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
public GenericSvcResult SuspendService(ProvisioningContext context)
|
||||
{
|
||||
GenericSvcResult result = new GenericSvcResult();
|
||||
|
||||
//
|
||||
SaveObjectState(SERVICE_INFO, context.ServiceInfo);
|
||||
//
|
||||
SaveObjectState(CONSUMER_INFO, context.ConsumerInfo);
|
||||
|
||||
// concretize service to be provisioned
|
||||
HostingPackageSvc packageSvc = (HostingPackageSvc)context.ServiceInfo;
|
||||
|
||||
//
|
||||
try
|
||||
{
|
||||
//
|
||||
TaskManager.StartTask(SystemTasks.SOURCE_ECOMMERCE, SystemTasks.SVC_SUSPEND);
|
||||
// LOG INFO
|
||||
TaskManager.Write(START_SUSPENSION_MSG);
|
||||
TaskManager.WriteParameter(CONTRACT_PARAM, context.ConsumerInfo[ContractAccount.USERNAME]);
|
||||
TaskManager.WriteParameter(SVC_PARAM, context.ServiceInfo.ServiceName);
|
||||
TaskManager.WriteParameter(SVC_ID_PARAM, context.ServiceInfo.ServiceId);
|
||||
|
||||
// 0. Do security checks
|
||||
if (!CheckOperationClientPermissions(result))
|
||||
{
|
||||
// LOG ERROR
|
||||
TaskManager.WriteError(ERROR_CLIENT_OPERATION_PERMISSIONS);
|
||||
TaskManager.WriteParameter(RESULT_CODE_PARAM, result.ResultCode);
|
||||
// EXIT
|
||||
return result;
|
||||
}
|
||||
//
|
||||
if (!CheckOperationClientStatus(result))
|
||||
{
|
||||
// LOG ERROR
|
||||
TaskManager.WriteError(ERROR_CLIENT_OPERATION_STATUS);
|
||||
TaskManager.WriteParameter(RESULT_CODE_PARAM, result.ResultCode);
|
||||
// EXIT
|
||||
return result;
|
||||
}
|
||||
|
||||
// suspend hosting package
|
||||
int apiResult = PackageController.ChangePackageStatus(packageSvc.PackageId,
|
||||
PackageStatus.Suspended, false);
|
||||
|
||||
// check WebsitePanel API result
|
||||
if (apiResult < 0)
|
||||
{
|
||||
result.ResultCode = apiResult;
|
||||
//
|
||||
result.Succeed = false;
|
||||
|
||||
// LOG ERROR
|
||||
TaskManager.WriteError(ERROR_SUSPEND_PCKG_MSG);
|
||||
TaskManager.WriteParameter(RESULT_CODE_PARAM, result.ResultCode);
|
||||
|
||||
// exit
|
||||
return result;
|
||||
}
|
||||
|
||||
// change service status to Suspended
|
||||
packageSvc.Status = ServiceStatus.Suspended;
|
||||
// put data into metabase
|
||||
int svcResult = UpdateServiceInfo(packageSvc);
|
||||
|
||||
//
|
||||
if (svcResult < 0)
|
||||
{
|
||||
result.ResultCode = svcResult;
|
||||
//
|
||||
result.Succeed = false;
|
||||
|
||||
// LOG ERROR
|
||||
TaskManager.WriteError(ERROR_SVC_UPDATE_MSG);
|
||||
TaskManager.WriteParameter(RESULT_CODE_PARAM, result.ResultCode);
|
||||
|
||||
// ROLLBACK CHANGES
|
||||
RollbackOperation(packageSvc.PackageId);
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
//
|
||||
SetOutboundParameters(context);
|
||||
// LOG INFO
|
||||
TaskManager.Write(PCKG_PROVISIONED_MSG);
|
||||
//
|
||||
result.Succeed = true;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
//
|
||||
TaskManager.WriteError(ex);
|
||||
|
||||
// ROLLBACK CHANGES
|
||||
RollbackOperation(packageSvc.PackageId);
|
||||
|
||||
//
|
||||
result.Succeed = false;
|
||||
//
|
||||
result.Error = ex.Message;
|
||||
}
|
||||
finally
|
||||
{
|
||||
// complete task
|
||||
TaskManager.CompleteTask();
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
public GenericSvcResult CancelService(ProvisioningContext context)
|
||||
{
|
||||
GenericSvcResult result = new GenericSvcResult();
|
||||
|
||||
//
|
||||
SaveObjectState(SERVICE_INFO, context.ServiceInfo);
|
||||
//
|
||||
SaveObjectState(CONSUMER_INFO, context.ConsumerInfo);
|
||||
|
||||
// concretize service to be provisioned
|
||||
HostingPackageSvc packageSvc = (HostingPackageSvc)context.ServiceInfo;
|
||||
|
||||
//
|
||||
try
|
||||
{
|
||||
//
|
||||
TaskManager.StartTask(SystemTasks.SOURCE_ECOMMERCE, SystemTasks.SVC_CANCEL);
|
||||
// LOG INFO
|
||||
TaskManager.Write(START_CANCELLATION_MSG);
|
||||
TaskManager.WriteParameter(CONTRACT_PARAM, context.ConsumerInfo[ContractAccount.USERNAME]);
|
||||
TaskManager.WriteParameter(SVC_PARAM, context.ServiceInfo.ServiceName);
|
||||
TaskManager.WriteParameter(SVC_ID_PARAM, context.ServiceInfo.ServiceId);
|
||||
|
||||
// 0. Do security checks
|
||||
if (!CheckOperationClientPermissions(result))
|
||||
{
|
||||
// LOG ERROR
|
||||
TaskManager.WriteError(ERROR_CLIENT_OPERATION_PERMISSIONS);
|
||||
TaskManager.WriteParameter(RESULT_CODE_PARAM, result.ResultCode);
|
||||
// EXIT
|
||||
return result;
|
||||
}
|
||||
//
|
||||
if (!CheckOperationClientStatus(result))
|
||||
{
|
||||
// LOG ERROR
|
||||
TaskManager.WriteError(ERROR_CLIENT_OPERATION_STATUS);
|
||||
TaskManager.WriteParameter(RESULT_CODE_PARAM, result.ResultCode);
|
||||
// EXIT
|
||||
return result;
|
||||
}
|
||||
|
||||
// cancel hosting package
|
||||
int apiResult = PackageController.ChangePackageStatus(packageSvc.PackageId,
|
||||
PackageStatus.Cancelled, false);
|
||||
|
||||
// check WebsitePanel API result
|
||||
if (apiResult < 0)
|
||||
{
|
||||
//
|
||||
result.ResultCode = apiResult;
|
||||
//
|
||||
result.Succeed = false;
|
||||
|
||||
// LOG ERROR
|
||||
TaskManager.WriteError(ERROR_CANCEL_PCKG_MSG);
|
||||
TaskManager.WriteParameter(RESULT_CODE_PARAM, result.ResultCode);
|
||||
|
||||
// EXIT
|
||||
return result;
|
||||
}
|
||||
|
||||
// change service status to Cancelled
|
||||
packageSvc.Status = ServiceStatus.Cancelled;
|
||||
// put data into metabase
|
||||
int svcResult = UpdateServiceInfo(packageSvc);
|
||||
|
||||
//
|
||||
if (svcResult < 0)
|
||||
{
|
||||
result.ResultCode = svcResult;
|
||||
//
|
||||
result.Error = ERROR_SVC_UPDATE_MSG;
|
||||
//
|
||||
result.Succeed = false;
|
||||
|
||||
// ROLLBACK CHANGES
|
||||
RollbackOperation(packageSvc.PackageId);
|
||||
|
||||
// LOG ERROR
|
||||
TaskManager.WriteError(result.Error);
|
||||
TaskManager.WriteParameter(RESULT_CODE_PARAM, result.ResultCode);
|
||||
|
||||
// EXIT
|
||||
return result;
|
||||
}
|
||||
//
|
||||
SetOutboundParameters(context);
|
||||
// LOG INFO
|
||||
TaskManager.Write(PCKG_PROVISIONED_MSG);
|
||||
//
|
||||
result.Succeed = true;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
//
|
||||
TaskManager.WriteError(ex);
|
||||
|
||||
// ROLLBACK CHANGES
|
||||
RollbackOperation(packageSvc.PackageId);
|
||||
|
||||
//
|
||||
result.Succeed = false;
|
||||
//
|
||||
result.Error = ex.Message;
|
||||
}
|
||||
finally
|
||||
{
|
||||
// complete task
|
||||
TaskManager.CompleteTask();
|
||||
}
|
||||
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
public void LogServiceUsage(ProvisioningContext context)
|
||||
{
|
||||
// concretize service to be logged
|
||||
HostingPackageSvc packageSvc = (HostingPackageSvc)context.ServiceInfo;
|
||||
|
||||
// log service usage
|
||||
base.LogServiceUsage(context.ServiceInfo, packageSvc.SvcCycleId,
|
||||
packageSvc.BillingPeriod, packageSvc.PeriodLength);
|
||||
}
|
||||
|
||||
protected void RollbackOperation(int packageId)
|
||||
{
|
||||
// check input parameters first
|
||||
if (packageId < 1)
|
||||
return; // exit
|
||||
|
||||
//
|
||||
try
|
||||
{
|
||||
TaskManager.Write("Trying rollback operation");
|
||||
// restore service
|
||||
HostingPackageSvc packageSvc = (HostingPackageSvc)RestoreObjectState("ServiceInfo");
|
||||
// restore consumer
|
||||
UserInfo consumer = (UserInfo)RestoreObjectState("ConsumerInfo");
|
||||
|
||||
//
|
||||
int apiResult = 0;
|
||||
|
||||
// rollback consumer changes first
|
||||
apiResult = UserController.UpdateUser(consumer);
|
||||
// check WebsitePanel API result
|
||||
if (apiResult < 0)
|
||||
{
|
||||
//
|
||||
TaskManager.WriteError("Could not rollback consumer changes");
|
||||
//
|
||||
TaskManager.WriteParameter("ResultCode", apiResult);
|
||||
}
|
||||
|
||||
// during rollback package should be reverted to its original state
|
||||
// compensation logic - revert back package status
|
||||
switch (packageSvc.Status)
|
||||
{
|
||||
// Active State
|
||||
case ServiceStatus.Active:
|
||||
apiResult = PackageController.ChangePackageStatus(packageId, PackageStatus.Active, false);
|
||||
break;
|
||||
// Suspended State
|
||||
case ServiceStatus.Suspended:
|
||||
apiResult = PackageController.ChangePackageStatus(packageId, PackageStatus.Suspended, false);
|
||||
break;
|
||||
// Cancelled State
|
||||
case ServiceStatus.Cancelled:
|
||||
apiResult = PackageController.ChangePackageStatus(packageId, PackageStatus.Cancelled, false);
|
||||
break;
|
||||
// service has been just ordered & during rollback should be removed
|
||||
case ServiceStatus.Ordered:
|
||||
// compensation logic - remove created package
|
||||
apiResult = PackageController.DeletePackage(packageId);
|
||||
break;
|
||||
}
|
||||
// check WebsitePanel API result
|
||||
if (apiResult < 0)
|
||||
{
|
||||
//
|
||||
if (packageSvc.Status == ServiceStatus.Ordered)
|
||||
TaskManager.WriteError("Could not rollback operation and delete package");
|
||||
else
|
||||
TaskManager.WriteError("Could not rollback operation and revert package state");
|
||||
//
|
||||
TaskManager.WriteParameter("ResultCode", apiResult);
|
||||
}
|
||||
|
||||
// rollback service changes in EC metabase
|
||||
apiResult = UpdateServiceInfo(packageSvc);
|
||||
// check API result
|
||||
if (apiResult < 0)
|
||||
{
|
||||
//
|
||||
TaskManager.WriteError("Could not rollback service changes");
|
||||
//
|
||||
TaskManager.WriteParameter("ResultCode", apiResult);
|
||||
}
|
||||
|
||||
//
|
||||
TaskManager.Write("Rollback succeed");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.WriteError(ex);
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
|
@ -0,0 +1,50 @@
|
|||
// Copyright (c) 2011, 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.Text;
|
||||
|
||||
using WebsitePanel.EnterpriseServer;
|
||||
|
||||
namespace WebsitePanel.Ecommerce.EnterpriseServer
|
||||
{
|
||||
public interface IServiceProvisioning
|
||||
{
|
||||
ServiceHistoryRecord[] GetServiceHistory(int serviceId);
|
||||
InvoiceItem[] CalculateInvoiceLines(int serviceId);
|
||||
ProvisioningContext GetProvisioningContext(int serviceId, bool sendEmail);
|
||||
int AddServiceInfo(string contractId, string currency, OrderItem orderItem);
|
||||
int UpdateServiceInfo(Service serviceInfo);
|
||||
Service GetServiceInfo(int serviceId);
|
||||
GenericSvcResult ActivateService(ProvisioningContext context);
|
||||
GenericSvcResult SuspendService(ProvisioningContext context);
|
||||
GenericSvcResult CancelService(ProvisioningContext context);
|
||||
void LogServiceUsage(ProvisioningContext context);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,102 @@
|
|||
// Copyright (c) 2011, 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.Data;
|
||||
using System.Configuration;
|
||||
using System.Web;
|
||||
using System.Web.Security;
|
||||
using System.Web.UI;
|
||||
using System.Web.UI.WebControls;
|
||||
using System.Web.UI.WebControls.WebParts;
|
||||
using System.Web.UI.HtmlControls;
|
||||
|
||||
using WebsitePanel.EnterpriseServer;
|
||||
|
||||
namespace WebsitePanel.Ecommerce.EnterpriseServer
|
||||
{
|
||||
/// <summary>
|
||||
/// Represents context for provisioning controllers
|
||||
/// </summary>
|
||||
public class ProvisioningContext
|
||||
{
|
||||
private Contract contractInfo;
|
||||
private ContractAccount consumerInfo;
|
||||
private Service serviceInfo;
|
||||
private Service parentSvcInfo;
|
||||
private bool sendEmail;
|
||||
|
||||
public bool SendEmail
|
||||
{
|
||||
get { return sendEmail; }
|
||||
set { sendEmail = value; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets service consumer contract information
|
||||
/// </summary>
|
||||
public Contract ContractInfo
|
||||
{
|
||||
get { return contractInfo; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets service consumer information
|
||||
/// </summary>
|
||||
public ContractAccount ConsumerInfo
|
||||
{
|
||||
get { return consumerInfo; }
|
||||
}
|
||||
/// <summary>
|
||||
/// Get service information
|
||||
/// </summary>
|
||||
public Service ServiceInfo
|
||||
{
|
||||
get { return serviceInfo; }
|
||||
}
|
||||
/// <summary>
|
||||
/// Get parent service information
|
||||
/// </summary>
|
||||
public Service ParentSvcInfo
|
||||
{
|
||||
get { return parentSvcInfo; }
|
||||
}
|
||||
/// <summary>
|
||||
/// Ctor.
|
||||
/// </summary>
|
||||
/// <param name="service"></param>
|
||||
/// <param name="consumer"></param>
|
||||
public ProvisioningContext(Contract contract, Service service, ContractAccount consumer, Service parentSvc)
|
||||
{
|
||||
this.contractInfo = contract;
|
||||
this.serviceInfo = service;
|
||||
this.consumerInfo = consumer;
|
||||
this.parentSvcInfo = parentSvc;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,362 @@
|
|||
// Copyright (c) 2011, 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.Reflection;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.Specialized;
|
||||
using System.Text;
|
||||
|
||||
using WebsitePanel.EnterpriseServer;
|
||||
|
||||
namespace WebsitePanel.Ecommerce.EnterpriseServer
|
||||
{
|
||||
public class Memento
|
||||
{
|
||||
private string mStateObjectType;
|
||||
private Hashtable mementoState;
|
||||
|
||||
public Memento()
|
||||
{
|
||||
//
|
||||
mementoState = new Hashtable();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Saves object public properties state using reflection. Does not support indexed properties.
|
||||
/// </summary>
|
||||
/// <param name="objectKey"></param>
|
||||
/// <param name="value"></param>
|
||||
public void SaveObjectState(object value)
|
||||
{
|
||||
//
|
||||
Type valueType = value.GetType();
|
||||
//
|
||||
PropertyInfo[] properties = valueType.GetProperties(BindingFlags.Instance | BindingFlags.Public);
|
||||
//
|
||||
if (properties != null && properties.Length > 0)
|
||||
{
|
||||
//
|
||||
Hashtable stateHash = new Hashtable();
|
||||
//
|
||||
foreach (PropertyInfo property in properties)
|
||||
{
|
||||
// copy property value
|
||||
if (property.GetIndexParameters() == null || property.GetIndexParameters().Length == 0)
|
||||
mementoState.Add(property.Name, property.GetValue(value, null));
|
||||
}
|
||||
// save object full-qualified name
|
||||
mStateObjectType = valueType.AssemblyQualifiedName;
|
||||
}
|
||||
}
|
||||
|
||||
public object RestoreObjectState()
|
||||
{
|
||||
// create object instance
|
||||
object keyObject = Activator.CreateInstance(Type.GetType(mStateObjectType));
|
||||
//
|
||||
Type objectType = keyObject.GetType();
|
||||
//
|
||||
PropertyInfo[] properties = objectType.GetProperties(BindingFlags.Instance | BindingFlags.Public);
|
||||
//
|
||||
if (properties != null && properties.Length > 0)
|
||||
{
|
||||
// load object state back
|
||||
foreach (PropertyInfo property in properties)
|
||||
{
|
||||
// restore property value back
|
||||
if (property.GetIndexParameters() == null || property.GetIndexParameters().Length == 0)
|
||||
property.SetValue(keyObject, mementoState[property.Name], null);
|
||||
}
|
||||
}
|
||||
//
|
||||
return keyObject;
|
||||
}
|
||||
}
|
||||
|
||||
public abstract class ServiceProvisioningBase
|
||||
{
|
||||
// Contants
|
||||
public const string SERVICE_INFO = "ServiceInfo";
|
||||
public const string CONSUMER_INFO = "ConsumerInfo";
|
||||
|
||||
#region Error Messages
|
||||
|
||||
public const string ERROR_SVC_UPDATE_MSG = "Could not update service data";
|
||||
public const string PARENT_SVC_NOT_FOUND_MSG = "Could not find parent service assigned";
|
||||
public const string ERROR_ROLLBACK_SVC_MSG = "Could not rollback service changes";
|
||||
public const string ERROR_CLIENT_OPERATION_PERMISSIONS = "Account does not have enough permissions to do this operation";
|
||||
public const string ERROR_CLIENT_OPERATION_STATUS = "Account is demo or suspended and not allowed to do this operation";
|
||||
|
||||
#endregion
|
||||
|
||||
#region Trace Messages
|
||||
|
||||
public const string ROLLBACK_SUCCEED_MSG = "Rollback succeed";
|
||||
|
||||
#endregion
|
||||
|
||||
#region Trace Parameters
|
||||
|
||||
public const string CONTRACT_PARAM = "ContractID";
|
||||
public const string USERNAME_PARAM = "Username";
|
||||
public const string SVC_PARAM = "Service";
|
||||
public const string SVC_ID_PARAM = "ServiceID";
|
||||
public const string RESULT_CODE_PARAM = "ResultCode";
|
||||
public const string PCKG_PARAM = "Package";
|
||||
public const string PCKG_ID_PARAM = "PackageID";
|
||||
|
||||
#endregion
|
||||
|
||||
public bool CheckOperationClientPermissions(GenericSvcResult result)
|
||||
{
|
||||
// 1. Do security checks
|
||||
SecurityResult secResult = StorehouseController.CheckAccountIsAdminOrReseller();
|
||||
// ERROR
|
||||
if (!secResult.Success)
|
||||
{
|
||||
result.Succeed = false;
|
||||
result.ResultCode = secResult.ResultCode;
|
||||
//
|
||||
return false;
|
||||
}
|
||||
//
|
||||
return true;
|
||||
}
|
||||
|
||||
public bool CheckOperationClientStatus(GenericSvcResult result)
|
||||
{
|
||||
// 2. Check account status
|
||||
SecurityResult secResult = StorehouseController.CheckAccountNotDemoAndActive();
|
||||
// ERROR
|
||||
if (!secResult.Success)
|
||||
{
|
||||
result.Succeed = false;
|
||||
result.ResultCode = secResult.ResultCode;
|
||||
//
|
||||
return false;
|
||||
}
|
||||
//
|
||||
return true;
|
||||
}
|
||||
|
||||
public ProvisioningContext GetProvisioningContext(int serviceId, bool sendEmail)
|
||||
{
|
||||
IServiceProvisioning controller = (IServiceProvisioning)this;
|
||||
Service serviceInfo = controller.GetServiceInfo(serviceId);
|
||||
Contract contractInfo = ContractSystem.ContractController.GetContract(serviceInfo.ContractId);
|
||||
ContractAccount consumerInfo = ContractSystem.ContractController.GetContractAccountSettings(
|
||||
serviceInfo.ContractId, true);
|
||||
// load parent svc
|
||||
Service parentSvcInfo = (serviceInfo.ParentId == 0) ? null :
|
||||
ServiceController.GetService(serviceInfo.ParentId);
|
||||
// return prepeared context
|
||||
ProvisioningContext ctx = new ProvisioningContext(contractInfo, serviceInfo, consumerInfo, parentSvcInfo);
|
||||
//
|
||||
ctx.SendEmail = sendEmail;
|
||||
//
|
||||
return ctx;
|
||||
}
|
||||
|
||||
//
|
||||
private Dictionary<string, Memento> undoSteps = new Dictionary<string, Memento>();
|
||||
|
||||
protected void SaveObjectState(string objectKey, object value)
|
||||
{
|
||||
//
|
||||
Memento memento = new Memento();
|
||||
//
|
||||
memento.SaveObjectState(value);
|
||||
//
|
||||
undoSteps.Add(objectKey, memento);
|
||||
}
|
||||
|
||||
protected object RestoreObjectState(string objectKey)
|
||||
{
|
||||
//
|
||||
if (!undoSteps.ContainsKey(objectKey))
|
||||
return null;
|
||||
//
|
||||
Memento memento = undoSteps[objectKey];
|
||||
//
|
||||
return memento.RestoreObjectState();
|
||||
}
|
||||
|
||||
protected void LogServiceUsage(Service service, int svcCycleId, string billingPeriod, int periodLength)
|
||||
{
|
||||
// define start date
|
||||
DateTime startDate = ServiceController.GetServiceSuspendDate(service.ServiceId);
|
||||
//
|
||||
DateTime endDate = startDate;
|
||||
//
|
||||
switch (billingPeriod)
|
||||
{
|
||||
case "day":
|
||||
endDate = startDate.AddDays(periodLength);
|
||||
break;
|
||||
case "month":
|
||||
endDate = endDate.AddMonths(periodLength);
|
||||
break;
|
||||
case "year":
|
||||
endDate = endDate.AddYears(periodLength);
|
||||
break;
|
||||
}
|
||||
// add service usage record
|
||||
EcommerceProvider.AddServiceUsageRecord(SecurityContext.User.UserId, service.ServiceId,
|
||||
svcCycleId, startDate, endDate);
|
||||
}
|
||||
|
||||
protected void SetOutboundParameters(ProvisioningContext context)
|
||||
{
|
||||
// set task outbound parameters
|
||||
TaskManager.TaskParameters[SystemTaskParams.PARAM_SERVICE] = context.ServiceInfo;
|
||||
TaskManager.TaskParameters[SystemTaskParams.PARAM_CONTRACT] = context.ContractInfo;
|
||||
TaskManager.TaskParameters[SystemTaskParams.PARAM_CONTRACT_ACCOUNT] = context.ConsumerInfo;
|
||||
TaskManager.TaskParameters[SystemTaskParams.PARAM_SEND_EMAIL] = context.SendEmail;
|
||||
}
|
||||
}
|
||||
|
||||
/*public abstract class ProvisioningController
|
||||
{
|
||||
// user info (context)
|
||||
// product general info
|
||||
// cart prov settings
|
||||
// product prov settings
|
||||
// product type prov settings
|
||||
//
|
||||
#region Private vars
|
||||
|
||||
private string notificationTemplate;
|
||||
private bool notificationLoaded;
|
||||
|
||||
private UserInfo userInfo;
|
||||
private Service serviceInfo;
|
||||
private KeyValueBunch serviceSettings;
|
||||
|
||||
#endregion
|
||||
|
||||
#region Public properties
|
||||
|
||||
public string NotificationTemplate
|
||||
{
|
||||
get
|
||||
{
|
||||
if (!notificationLoaded)
|
||||
|
||||
return notificationTemplate;
|
||||
}
|
||||
}
|
||||
|
||||
public UserInfo UserInfo
|
||||
{
|
||||
get { return userInfo; }
|
||||
}
|
||||
|
||||
public Service ServiceInfo
|
||||
{
|
||||
get { return serviceInfo; }
|
||||
}
|
||||
|
||||
public KeyValueBunch ServiceSettings
|
||||
{
|
||||
get { return serviceSettings; }
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Abstract routines
|
||||
|
||||
//
|
||||
public abstract GenericSvcResult ActivateService(Service service);
|
||||
//
|
||||
public abstract GenericSvcResult SuspendService();
|
||||
//
|
||||
public abstract GenericSvcResult CancelService();
|
||||
//
|
||||
public abstract void RollbackOperation();
|
||||
|
||||
#endregion
|
||||
|
||||
protected ProvisioningController(Service serviceInfo)
|
||||
{
|
||||
this.serviceInfo = serviceInfo;
|
||||
|
||||
Initialize();
|
||||
}
|
||||
|
||||
protected virtual void Initialize()
|
||||
{
|
||||
// get user profile
|
||||
userInfo = UserController.GetUser(serviceInfo.UserId);
|
||||
}
|
||||
|
||||
protected DateTime CalculateNextSuspendDate(DateTime startDate, string cyclePeriod, int cycleLength)
|
||||
{
|
||||
// calculate next suspend date
|
||||
switch (cyclePeriod)
|
||||
{
|
||||
case "day":
|
||||
return startDate.AddDays(cycleLength);
|
||||
|
||||
case "month":
|
||||
return startDate.AddMonths(cycleLength);
|
||||
|
||||
case "year":
|
||||
return startDate.AddYears(cycleLength);
|
||||
}
|
||||
//
|
||||
return startDate;
|
||||
}
|
||||
|
||||
public virtual void LoadProvisioningSettings()
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
// get service settings
|
||||
/*serviceSettings = ServiceController.GetServiceSettings(
|
||||
serviceInfo.SpaceId,
|
||||
serviceInfo.ServiceId
|
||||
);*/
|
||||
/*}
|
||||
|
||||
public virtual void SaveProvisioningSettings()
|
||||
{
|
||||
if (ServiceSettings.HasPendingChanges)
|
||||
{
|
||||
/*int result = ServiceController.SetServiceSettings(
|
||||
serviceInfo.SpaceId,
|
||||
serviceInfo.ServiceId,
|
||||
serviceSettings
|
||||
);
|
||||
|
||||
if (result < 0)
|
||||
throw new Exception("Unable to save provisioning settings. Status code: " + result);*/
|
||||
/*}
|
||||
}
|
||||
}*/
|
||||
}
|
|
@ -0,0 +1,304 @@
|
|||
// Copyright (c) 2011, 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.Xml;
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using System.Data.SqlClient;
|
||||
|
||||
using ES = WebsitePanel.EnterpriseServer;
|
||||
using Common.Utils;
|
||||
using Microsoft.ApplicationBlocks.Data;
|
||||
|
||||
namespace WebsitePanel.Ecommerce.EnterpriseServer
|
||||
{
|
||||
public class ServiceController
|
||||
{
|
||||
private ServiceController()
|
||||
{
|
||||
}
|
||||
|
||||
public static int SetUsageRecordsClosed(int[] serviceIds)
|
||||
{
|
||||
return EcommerceProvider.SetSvcsUsageRecordsClosed(
|
||||
ES.SecurityContext.User.UserId, serviceIds);
|
||||
}
|
||||
|
||||
#region Ecommerce v 2.1.0 routines
|
||||
|
||||
public static DateTime GetSvcsSuspendDateAligned(int[] services, DateTime defaultValue)
|
||||
{
|
||||
string svcsXml = Utils.BuildIdentityXmlFromArray(services, "Svcs", "Svc");
|
||||
return EcommerceProvider.GetSvcsSuspendDateAligned(ES.SecurityContext.User.UserId,
|
||||
svcsXml, defaultValue);
|
||||
}
|
||||
|
||||
public static int ChangeHostingPlanSvcCycle(int serviceId, int productId, int cycleId, string currency)
|
||||
{
|
||||
return EcommerceProvider.ChangeHostingPlanSvcCycle(ES.SecurityContext.User.UserId, serviceId,
|
||||
productId, cycleId, currency);
|
||||
}
|
||||
|
||||
public static ProductType GetServiceItemType(int serviceId)
|
||||
{
|
||||
return ES.ObjectUtils.FillObjectFromDataReader<ProductType>(
|
||||
EcommerceProvider.GetServiceItemType(serviceId));
|
||||
}
|
||||
|
||||
public static Service GetRawCustomerService(int serviceId)
|
||||
{
|
||||
return ES.ObjectUtils.FillObjectFromDataReader<Service>(
|
||||
EcommerceProvider.GetCustomerService(ES.SecurityContext.User.UserId, serviceId));
|
||||
}
|
||||
|
||||
public static Service GetService(int serviceId)
|
||||
{
|
||||
// read service type
|
||||
ProductType svcType = GetServiceItemType(serviceId);
|
||||
// create svc controller
|
||||
IServiceProvisioning controller = (IServiceProvisioning)Activator.CreateInstance(
|
||||
Type.GetType(svcType.ProvisioningController));
|
||||
//
|
||||
return controller.GetServiceInfo(serviceId);
|
||||
}
|
||||
|
||||
public static Dictionary<int, Service> GetServicesDictionary(List<InvoiceItem> invoiceLines)
|
||||
{
|
||||
List<int> serviceIds = new List<int>();
|
||||
//
|
||||
foreach (InvoiceItem invoiceLine in Array.FindAll<InvoiceItem>(
|
||||
invoiceLines.ToArray(), x => x.ServiceId > 0))
|
||||
{
|
||||
serviceIds.Add(invoiceLine.ServiceId);
|
||||
}
|
||||
//
|
||||
return GetServicesDictionary(serviceIds);
|
||||
}
|
||||
|
||||
public static Dictionary<int, Service> GetServicesDictionary(List<int> serviceIds)
|
||||
{
|
||||
Dictionary<int, Service> hash = new Dictionary<int, Service>();
|
||||
//
|
||||
foreach (int serviceId in serviceIds)
|
||||
hash.Add(serviceId, GetService(serviceId));
|
||||
//
|
||||
return hash;
|
||||
}
|
||||
|
||||
public static int UpdateService(Service service)
|
||||
{
|
||||
// read service type
|
||||
ProductType svcType = GetServiceItemType(service.ServiceId);
|
||||
// create svc controller
|
||||
IServiceProvisioning controller = (IServiceProvisioning)Activator.CreateInstance(
|
||||
Type.GetType(svcType.ProvisioningController));
|
||||
//
|
||||
return controller.UpdateServiceInfo(service);
|
||||
}
|
||||
|
||||
public static void AddServiceUsageRecord(int serviceId)
|
||||
{
|
||||
// read service type
|
||||
ProductType svcType = GetServiceItemType(serviceId);
|
||||
// create svc controller
|
||||
IServiceProvisioning controller = (IServiceProvisioning)Activator.CreateInstance(
|
||||
Type.GetType(svcType.ProvisioningController));
|
||||
//
|
||||
controller.LogServiceUsage(controller.GetProvisioningContext(serviceId, false));
|
||||
}
|
||||
|
||||
public static ServiceHistoryRecord[] GetServiceHistory(int serviceId)
|
||||
{
|
||||
// read service type
|
||||
ProductType svcType = GetServiceItemType(serviceId);
|
||||
// create svc controller
|
||||
IServiceProvisioning controller = (IServiceProvisioning)Activator.CreateInstance(
|
||||
Type.GetType(svcType.ProvisioningController));
|
||||
//
|
||||
return controller.GetServiceHistory(serviceId);
|
||||
}
|
||||
|
||||
public static GenericSvcResult ActivateService(int serviceId, bool sendEmail)
|
||||
{
|
||||
GenericSvcResult result = new GenericSvcResult();
|
||||
|
||||
try
|
||||
{
|
||||
Service svc = GetRawCustomerService(serviceId);
|
||||
//
|
||||
ES.TaskManager.StartTask(SystemTasks.SOURCE_SPF, SystemTasks.SVC_ACTIVATE);
|
||||
ES.TaskManager.WriteParameter("Service", svc.ServiceName);
|
||||
//
|
||||
ActivatePaidInvoicesTask task = new ActivatePaidInvoicesTask();
|
||||
// obtain result
|
||||
result = task.ActivateService(serviceId, sendEmail, false);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
ES.TaskManager.WriteError(ex);
|
||||
}
|
||||
finally
|
||||
{
|
||||
ES.TaskManager.CompleteTask();
|
||||
}
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
public static List<GenericSvcResult> ActivateInvoice(int invoiceId, bool sendEmail)
|
||||
{
|
||||
List<GenericSvcResult> results = new List<GenericSvcResult>();
|
||||
|
||||
try
|
||||
{
|
||||
Invoice invoice = InvoiceController.GetCustomerInvoiceInternally(invoiceId);
|
||||
//
|
||||
ES.TaskManager.StartTask("SPF", "ACTIVATE_INVOICE");
|
||||
ES.TaskManager.WriteParameter("InvoiceID", invoiceId);
|
||||
//
|
||||
ActivatePaidInvoicesTask task = new ActivatePaidInvoicesTask();
|
||||
// load invoice lines
|
||||
List<InvoiceItem> lines = InvoiceController.GetCustomerInvoiceItems(invoiceId);
|
||||
// iterate and activate
|
||||
foreach (InvoiceItem line in lines)
|
||||
{
|
||||
if (!line.Processed && line.ServiceId > 0)
|
||||
results.Add(task.ActivateInvoiceItem(line));
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
ES.TaskManager.WriteError(ex);
|
||||
}
|
||||
finally
|
||||
{
|
||||
ES.TaskManager.CompleteTask();
|
||||
}
|
||||
//
|
||||
return results;
|
||||
}
|
||||
|
||||
public static GenericSvcResult SuspendService(int serviceId, bool sendEmail)
|
||||
{
|
||||
GenericSvcResult result = new GenericSvcResult();
|
||||
|
||||
try
|
||||
{
|
||||
Service svc = GetRawCustomerService(serviceId);
|
||||
//
|
||||
ES.TaskManager.StartTask(SystemTasks.SOURCE_SPF, SystemTasks.SVC_SUSPEND);
|
||||
ES.TaskManager.WriteParameter("Service", svc.ServiceName);
|
||||
//
|
||||
SuspendOverdueInvoicesTask task = new SuspendOverdueInvoicesTask();
|
||||
// obtain result
|
||||
result = task.SuspendService(serviceId, sendEmail);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
ES.TaskManager.WriteError(ex);
|
||||
}
|
||||
finally
|
||||
{
|
||||
ES.TaskManager.CompleteTask();
|
||||
}
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
public static GenericSvcResult CancelService(int serviceId, bool sendEmail)
|
||||
{
|
||||
GenericSvcResult result = new GenericSvcResult();
|
||||
|
||||
try
|
||||
{
|
||||
Service svc = GetRawCustomerService(serviceId);
|
||||
//
|
||||
ES.TaskManager.StartTask(SystemTasks.SOURCE_SPF, SystemTasks.SVC_CANCEL);
|
||||
ES.TaskManager.WriteParameter("Service", svc.ServiceName);
|
||||
//
|
||||
CancelOverdueInvoicesTask task = new CancelOverdueInvoicesTask();
|
||||
// obtain result
|
||||
result = task.CancelService(serviceId, sendEmail);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
ES.TaskManager.WriteError(ex);
|
||||
}
|
||||
finally
|
||||
{
|
||||
ES.TaskManager.CompleteTask();
|
||||
}
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
public static DateTime GetServiceSuspendDate(int serviceId)
|
||||
{
|
||||
// get service suspend date
|
||||
DateTime date = EcommerceProvider.GetServiceSuspendDate(ES.SecurityContext.User.UserId, serviceId);
|
||||
|
||||
// check returned result
|
||||
if (date == DateTime.MinValue)
|
||||
date = DateTime.UtcNow;
|
||||
|
||||
// return service suspend date
|
||||
return date;
|
||||
}
|
||||
|
||||
public static List<Service> GetServicesToInvoice(int resellerId, DateTime todayDate, int daysOffset)
|
||||
{
|
||||
return ES.ObjectUtils.CreateListFromDataReader<Service>(EcommerceProvider.GetServicesToInvoice(
|
||||
ES.SecurityContext.User.UserId, resellerId, todayDate,daysOffset));
|
||||
}
|
||||
|
||||
public static int GetCustomersServicesCount(int userId, bool isReseller)
|
||||
{
|
||||
return EcommerceProvider.GetCustomersServicesCount(ES.SecurityContext.User.UserId, userId, isReseller);
|
||||
}
|
||||
|
||||
public static List<Service> GetCustomersServicesPaged(int userId, bool isReseller,
|
||||
int maximumRows, int startRowIndex)
|
||||
{
|
||||
return ES.ObjectUtils.CreateListFromDataReader<Service>(EcommerceProvider.GetCustomersServicesPaged(
|
||||
ES.SecurityContext.User.UserId, userId, isReseller, maximumRows, startRowIndex));
|
||||
}
|
||||
|
||||
public static int DeleteCustomerService(int serviceId)
|
||||
{
|
||||
SecurityResult result = StorehouseController.CheckAccountNotDemoAndActive();
|
||||
//
|
||||
if (!result.Success)
|
||||
return result.ResultCode;
|
||||
//
|
||||
return EcommerceProvider.DeleteCustomerService(ES.SecurityContext.User.UserId, serviceId);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,55 @@
|
|||
// Copyright (c) 2011, 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.Data;
|
||||
|
||||
using ES = WebsitePanel.EnterpriseServer;
|
||||
|
||||
namespace WebsitePanel.Ecommerce.EnterpriseServer
|
||||
{
|
||||
public class ServiceHandlerController
|
||||
{
|
||||
public static void AddServiceHandlerTextResponse(string serviceId, string contractId, int invoiceId, string dataReceived)
|
||||
{
|
||||
EcommerceProvider.AddServiceHandlerTextResponse(serviceId, contractId, invoiceId, dataReceived);
|
||||
}
|
||||
|
||||
public static void UpdateServiceHandlersResponses(int resellerId, string xmlData)
|
||||
{
|
||||
EcommerceProvider.UpdateServiceHandlersResponses(resellerId, xmlData);
|
||||
}
|
||||
|
||||
internal static List<HandlerResponse> GetServiceHandlersResponsesByReseller(int resellerId)
|
||||
{
|
||||
return ES.ObjectUtils.CreateListFromDataReader<HandlerResponse>(
|
||||
EcommerceProvider.GetServiceHandlersResponsesByReseller(resellerId));
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,373 @@
|
|||
// Copyright (c) 2011, 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;
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
|
||||
using ES = WebsitePanel.EnterpriseServer;
|
||||
|
||||
namespace WebsitePanel.Ecommerce.EnterpriseServer
|
||||
{
|
||||
public sealed class StorefrontController
|
||||
{
|
||||
public const int EMPTY_ORDER_ITEMS_CODE = -15;
|
||||
|
||||
private StorefrontController()
|
||||
{
|
||||
}
|
||||
|
||||
public static string GetContractInvoiceFormatted(string contractId, int invoiceId, string cultureName)
|
||||
{
|
||||
//
|
||||
ContractSystem.ContractController.ImpersonateAsContractReseller(contractId);
|
||||
//
|
||||
return InvoiceController.GetCustomerInvoiceFormattedInternally(contractId, invoiceId, cultureName);
|
||||
}
|
||||
|
||||
#region Ecommerce v 2.1.0 routines
|
||||
|
||||
public static TopLevelDomain GetResellerTopLevelDomain(int resellerId, string tld)
|
||||
{
|
||||
return ES.ObjectUtils.FillObjectFromDataReader<TopLevelDomain>(
|
||||
EcommerceProvider.GetResellerTopLevelDomain(resellerId, tld));
|
||||
}
|
||||
|
||||
public static List<Product> GetStorefrontProductsByType(int resellerId, int typeId)
|
||||
{
|
||||
return ES.ObjectUtils.CreateListFromDataReader<Product>(
|
||||
EcommerceProvider.GetStorefrontProductsByType(resellerId, typeId)
|
||||
);
|
||||
}
|
||||
|
||||
public static Product GetStorefrontProduct(int resellerId, int productId)
|
||||
{
|
||||
return ES.ObjectUtils.FillObjectFromDataReader<Product>(
|
||||
EcommerceProvider.GetStorefrontProduct(resellerId, productId));
|
||||
}
|
||||
|
||||
public static List<HostingAddon> GetHostingPlanAddons(int resellerId, int planId)
|
||||
{
|
||||
return ES.ObjectUtils.CreateListFromDataReader<HostingAddon>(
|
||||
EcommerceProvider.GetStorefrontHostingPlanAddons(resellerId, planId));
|
||||
}
|
||||
|
||||
public static OrderResult SubmitCustomerOrder(string contractId, OrderItem[] orderItems, KeyValueBunch extraArgs)
|
||||
{
|
||||
//
|
||||
Contract contract = ContractSystem.ContractController.GetContract(contractId);
|
||||
// Impersonate
|
||||
ContractSystem.ContractController.ImpersonateAsContractReseller(contract);
|
||||
//
|
||||
OrderResult oResult = new OrderResult();
|
||||
// check account
|
||||
SecurityResult sResult = StorehouseController.CheckAccountActive();
|
||||
//
|
||||
if (!sResult.Success)
|
||||
{
|
||||
//
|
||||
oResult.Succeed = false;
|
||||
//
|
||||
oResult.ResultCode = sResult.ResultCode;
|
||||
//
|
||||
return oResult;
|
||||
}
|
||||
// check order items not empty
|
||||
if (orderItems == null || orderItems.Length == 0)
|
||||
{
|
||||
//
|
||||
oResult.Succeed = false;
|
||||
//
|
||||
oResult.ResultCode = EMPTY_ORDER_ITEMS_CODE;
|
||||
//
|
||||
return oResult;
|
||||
}
|
||||
//
|
||||
ES.TaskManager.StartTask("Storefront", "SUBMIT_CUSTOMER_ORDER");
|
||||
|
||||
//
|
||||
try
|
||||
{
|
||||
string currency = StorehouseController.GetBaseCurrency(contract.ResellerId);
|
||||
// ordered services
|
||||
List<int> orderedSvcs = new List<int>();
|
||||
// build services to be ordered
|
||||
for (int i = 0; i < orderItems.Length; i++)
|
||||
{
|
||||
//
|
||||
OrderItem orderItem = orderItems[i];
|
||||
//
|
||||
int orderedSvcId = 0;
|
||||
//
|
||||
orderItem.ParentSvcId = (orderItem.ParentIndex > -1) ? orderedSvcs[orderItem.ParentIndex] : orderItem.ParentSvcId;
|
||||
// load svc type
|
||||
ProductType svcType = StorehouseController.GetProductType(orderItem.TypeId);
|
||||
//
|
||||
IServiceProvisioning controller = (IServiceProvisioning)Activator.CreateInstance(
|
||||
Type.GetType(svcType.ProvisioningController));
|
||||
// add service
|
||||
orderedSvcId = controller.AddServiceInfo(contractId, currency, orderItem);
|
||||
// check service controller result
|
||||
if (orderedSvcId < 1)
|
||||
{
|
||||
// ROLLBACK HERE
|
||||
StorehouseController.BulkServiceDelete(contractId, orderedSvcs.ToArray());
|
||||
oResult.Succeed = false;
|
||||
oResult.ResultCode = orderedSvcId;
|
||||
return oResult;
|
||||
// EXIT
|
||||
}
|
||||
//
|
||||
orderedSvcs.Add(orderedSvcId);
|
||||
}
|
||||
// build invoice lines
|
||||
List<InvoiceItem> invoiceLines = InvoiceController.CalculateInvoiceLinesForServices(orderedSvcs);
|
||||
//
|
||||
int resultCode = InvoiceController.AddInvoice(contractId, invoiceLines, extraArgs);
|
||||
// ERROR
|
||||
if (resultCode < 1)
|
||||
{
|
||||
// ROLLBACK HERE
|
||||
StorehouseController.BulkServiceDelete(contractId, orderedSvcs.ToArray());
|
||||
oResult.Succeed = false;
|
||||
oResult.ResultCode = resultCode;
|
||||
return oResult;
|
||||
}
|
||||
//
|
||||
oResult.OrderInvoice = resultCode;
|
||||
//
|
||||
oResult.Succeed = true;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
//
|
||||
oResult.ResultCode = -1;
|
||||
//
|
||||
oResult.Succeed = false;
|
||||
//
|
||||
ES.TaskManager.WriteError(ex);
|
||||
}
|
||||
finally
|
||||
{
|
||||
//
|
||||
ES.TaskManager.CompleteTask();
|
||||
}
|
||||
//
|
||||
return oResult;
|
||||
}
|
||||
|
||||
public static List<PaymentMethod> GetResellerPaymentMethods(int resellerId)
|
||||
{
|
||||
return ES.ObjectUtils.CreateListFromDataReader<PaymentMethod>(
|
||||
EcommerceProvider.GetResellerPaymentMethods(resellerId));
|
||||
}
|
||||
|
||||
public static PaymentMethod GetContractPaymentMethod(string contractId, string methodName)
|
||||
{
|
||||
Contract contract = ContractSystem.ContractController.GetContract(contractId);
|
||||
|
||||
return ES.ObjectUtils.FillObjectFromDataReader<PaymentMethod>(
|
||||
EcommerceProvider.GetResellerPaymentMethod(contract.ResellerId, methodName));
|
||||
}
|
||||
|
||||
public static ES.UserInfo GetCustomerProfile(int resellerId, int userId, string sessionId)
|
||||
{
|
||||
//
|
||||
ES.SecurityContext.SetThreadPrincipal(resellerId);
|
||||
//
|
||||
return ES.UserController.GetUser(userId);
|
||||
}
|
||||
|
||||
public static string GetCustomerInvoiceFormatted(int resellerId, int userId, int invoiceId, string sessionId)
|
||||
{
|
||||
return null;// InvoiceController.GetCustomerInvoiceFormattedInternally(resellerId, userId, invoiceId);
|
||||
}
|
||||
|
||||
public static Invoice GetCustomerInvoice(int resellerId, int userId, int invoiceId, string sessionId)
|
||||
{
|
||||
return InvoiceController.GetCustomerInvoiceInternally(invoiceId);
|
||||
}
|
||||
|
||||
public static CheckoutResult CompleteCheckout(string contractId, int invoiceId,
|
||||
string methodName, CheckoutDetails details)
|
||||
{
|
||||
//
|
||||
return PaymentGatewayController.CheckOut(contractId, invoiceId, methodName, details);
|
||||
}
|
||||
|
||||
public static KeyValueBunch GetHostingPlansQuotas(int resellerId, int planId)
|
||||
{
|
||||
KeyValueBunch hpQuotas = new KeyValueBunch();
|
||||
//
|
||||
ES.SecurityContext.SetThreadPrincipal(resellerId);
|
||||
//
|
||||
ES.HostingPlanContext ctx = ES.PackageController.GetHostingPlanContext(planId);
|
||||
//
|
||||
if (ctx != null)
|
||||
{
|
||||
//
|
||||
ES.QuotaValueInfo[] quotasArray = ctx.QuotasArray;
|
||||
//
|
||||
for (int i = 0; i < ctx.GroupsArray.Length; i++)
|
||||
{
|
||||
//
|
||||
ES.HostingPlanGroupInfo group = ctx.GroupsArray[i];
|
||||
//
|
||||
if (group.Enabled)
|
||||
{
|
||||
//
|
||||
List<string> planQuota = new List<string>();
|
||||
//
|
||||
foreach (ES.QuotaValueInfo quota in quotasArray)
|
||||
{
|
||||
//
|
||||
if (quota.QuotaName.StartsWith(group.GroupName))
|
||||
{
|
||||
// boolean quota
|
||||
if (quota.QuotaTypeId == 1)
|
||||
{
|
||||
// only enabled quotas will be displayed
|
||||
if (quota.QuotaAllocatedValue == 1)
|
||||
planQuota.Add(quota.QuotaName + "=Enabled");
|
||||
}
|
||||
// numeric
|
||||
else
|
||||
{
|
||||
if (quota.QuotaAllocatedValue > 0)
|
||||
planQuota.Add(quota.QuotaName + "=" + quota.QuotaAllocatedValue);
|
||||
else if (quota.QuotaAllocatedValue == -1)
|
||||
planQuota.Add(quota.QuotaName + "=Unlimited");
|
||||
}
|
||||
}
|
||||
}
|
||||
// only filled-up groups are allowed to display
|
||||
if (planQuota.Count > 0)
|
||||
hpQuotas[group.GroupName] = String.Join(",", planQuota.ToArray());
|
||||
}
|
||||
}
|
||||
}
|
||||
//
|
||||
return hpQuotas;
|
||||
}
|
||||
|
||||
public static CheckDomainResult CheckDomain(int resellerId, string domain, string tld)
|
||||
{
|
||||
//
|
||||
CheckDomainResult result = new CheckDomainResult();
|
||||
//
|
||||
try
|
||||
{
|
||||
//
|
||||
TopLevelDomain rslTld = GetResellerTopLevelDomain(resellerId, tld);
|
||||
//
|
||||
if (rslTld != null && !rslTld.WhoisEnabled)
|
||||
{
|
||||
//
|
||||
result.Succeed = true;
|
||||
//
|
||||
result.ResultCode = 0;
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
//
|
||||
WhoisResult wResult = WhoisLookup.Query(domain, tld);
|
||||
// query error
|
||||
if (!wResult.Success)
|
||||
{
|
||||
//
|
||||
result.ErrorMessage = wResult.ErrorMessage;
|
||||
//
|
||||
result.Succeed = false;
|
||||
//
|
||||
result.ResultCode = CheckDomainResult.QUERY_ERROR;
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
// whois record found
|
||||
if (wResult.RecordFound)
|
||||
{
|
||||
//
|
||||
result.ResultCode = CheckDomainResult.DOMAIN_BUSY;
|
||||
//
|
||||
result.Succeed = true;
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
// whois record not found - domain is available for purchase
|
||||
result.Succeed = true;
|
||||
//
|
||||
result.ResultCode = 0;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
//
|
||||
result.ErrorMessage = ex.StackTrace;
|
||||
//
|
||||
result.Succeed = false;
|
||||
//
|
||||
result.ResultCode = CheckDomainResult.UNSPECIFIED_ERROR;
|
||||
}
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region Storefront Categories routines
|
||||
|
||||
public static List<Category> GetStorefrontPath(int resellerId, int categoryId)
|
||||
{
|
||||
return ES.ObjectUtils.CreateListFromDataReader<Category>(
|
||||
EcommerceProvider.GetStorefrontPath(resellerId, categoryId));
|
||||
}
|
||||
|
||||
public static List<Category> GetStorefrontCategories(int resellerId, int parentId)
|
||||
{
|
||||
return ES.ObjectUtils.CreateListFromDataReader<Category>(
|
||||
EcommerceProvider.GetStorefrontCategories(resellerId, parentId));
|
||||
}
|
||||
|
||||
public static Category GetStorefrontCategory(int resellerId, int categoryId)
|
||||
{
|
||||
return ES.ObjectUtils.FillObjectFromDataReader<Category>(
|
||||
EcommerceProvider.GetStorefrontCategory(resellerId, categoryId));
|
||||
}
|
||||
|
||||
public static List<Product> GetStorefrontProductsInCategory(int resellerId, int categoryId)
|
||||
{
|
||||
return ES.ObjectUtils.CreateListFromDataReader<Product>(
|
||||
EcommerceProvider.GetStorefrontProductsInCategory(resellerId, categoryId));
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
File diff suppressed because it is too large
Load diff
|
@ -0,0 +1,320 @@
|
|||
// Copyright (c) 2011, 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.Data;
|
||||
using System.Configuration;
|
||||
using System.Reflection;
|
||||
using System.Collections.Generic;
|
||||
|
||||
using WebsitePanel.EnterpriseServer;
|
||||
|
||||
namespace WebsitePanel.Ecommerce.EnterpriseServer
|
||||
{
|
||||
public class SystemPluginController
|
||||
{
|
||||
#region Ecommerce v 2.1.0
|
||||
|
||||
/// <summary>
|
||||
/// Gets contracts' payment provider
|
||||
/// </summary>
|
||||
/// <param name="contractInfo"></param>
|
||||
/// <param name="methodName"></param>
|
||||
/// <returns></returns>
|
||||
internal static SystemPluginBase GetContractPaymentMethod(Contract contractInfo, string methodName)
|
||||
{
|
||||
// Load supported plugin
|
||||
SupportedPlugin plugin = GetResellerPMPlugin(contractInfo.ResellerId, methodName);
|
||||
//
|
||||
return GetSystemPluginInstance(contractInfo, plugin, true);
|
||||
}
|
||||
|
||||
internal static void SetupSystemPlugin(int resellerId, SystemPluginBase pluginObj)
|
||||
{
|
||||
// load plugin settings
|
||||
pluginObj.PluginSettings = GetPluginPropertiesInternal(resellerId, pluginObj.PluginId,
|
||||
false, pluginObj.SecureSettings);
|
||||
// check whether plugin settings should be decrypted
|
||||
if (pluginObj.SecureSettings != null && pluginObj.SecureSettings.Length > 0)
|
||||
{
|
||||
// decrypt secret settings
|
||||
foreach (string keyName in pluginObj.SecureSettings)
|
||||
{
|
||||
// call WebsitePanel Crypto API
|
||||
pluginObj.PluginSettings[keyName] = CryptoUtils.Decrypt(pluginObj.PluginSettings[keyName]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
internal static SystemPluginBase GetSystemPluginInstance(string contractId, SupportedPlugin plugin,
|
||||
bool setupPlugin)
|
||||
{
|
||||
Contract contract = ContractSystem.ContractController.GetContract(contractId);
|
||||
//
|
||||
return GetSystemPluginInstance(contract, plugin, setupPlugin);
|
||||
}
|
||||
|
||||
internal static SystemPluginBase GetSystemPluginInstance(Contract contract, SupportedPlugin plugin,
|
||||
bool setupPlugin)
|
||||
{
|
||||
// load plugin
|
||||
SystemPluginBase pluginObj = GetSystemPluginInstance(plugin);
|
||||
//
|
||||
if (setupPlugin)
|
||||
SetupSystemPlugin(contract.ResellerId, pluginObj);
|
||||
//
|
||||
return pluginObj;
|
||||
}
|
||||
|
||||
internal static SystemPluginBase GetSystemPluginInstance(int resellerId, int pluginId, bool setupPlugin)
|
||||
{
|
||||
// load plugin
|
||||
SystemPluginBase pluginObj = GetSystemPluginInstance(pluginId);
|
||||
//
|
||||
if (setupPlugin)
|
||||
SetupSystemPlugin(resellerId, pluginObj);
|
||||
//
|
||||
return pluginObj;
|
||||
}
|
||||
|
||||
internal static SystemPluginBase GetSystemPluginInstance(string contractId, int pluginId, bool setupPlugin)
|
||||
{
|
||||
Contract contract = ContractSystem.ContractController.GetContract(contractId);
|
||||
// load plugin
|
||||
SystemPluginBase pluginObj = GetSystemPluginInstance(pluginId);
|
||||
//
|
||||
if (setupPlugin)
|
||||
SetupSystemPlugin(contract.ResellerId, pluginObj);
|
||||
//
|
||||
return pluginObj;
|
||||
}
|
||||
|
||||
internal static SystemPluginBase GetSystemPluginInstance(int pluginId)
|
||||
{
|
||||
// load plugin
|
||||
SupportedPlugin plugin = GetSupportedPluginById(pluginId);
|
||||
//
|
||||
return GetSystemPluginInstance(plugin);
|
||||
}
|
||||
|
||||
internal static SystemPluginBase GetSystemPluginInstance(SupportedPlugin plugin)
|
||||
{
|
||||
// check plugin not empty
|
||||
if (plugin == null)
|
||||
throw new ArgumentNullException("plugin");
|
||||
// create system plugin instance
|
||||
SystemPluginBase pluginObj = (SystemPluginBase)Activator.CreateInstance(Type.GetType(plugin.TypeName));
|
||||
// copy fields
|
||||
pluginObj.PluginId = plugin.PluginId;
|
||||
pluginObj.PluginName = plugin.PluginName;
|
||||
// return
|
||||
return pluginObj;
|
||||
}
|
||||
|
||||
internal static SupportedPlugin GetResellerPMPlugin(int resellerId, string methodName)
|
||||
{
|
||||
SupportedPlugin plugin = ObjectUtils.FillObjectFromDataReader<SupportedPlugin>(
|
||||
EcommerceProvider.GetResellerPMPlugin(resellerId, methodName));
|
||||
//
|
||||
if (plugin == null)
|
||||
throw new Exception("RESELLER_PM_PLUGIN_NOT_FOUND");
|
||||
//
|
||||
return plugin;
|
||||
}
|
||||
|
||||
internal static KeyValueBunch GetPluginPropertiesInternal(int userId, int pluginId, bool skipSensitive,
|
||||
string[] secureSettings)
|
||||
{
|
||||
// load plugin settings
|
||||
KeyValueBunch properties = SettingsHelper.FillProperties(EcommerceProvider.GetPluginProperties(
|
||||
SecurityContext.User.UserId, userId, pluginId));
|
||||
// cleanup plugin settings
|
||||
if (skipSensitive && secureSettings != null)
|
||||
{
|
||||
// iterate through secure settings
|
||||
foreach (string keyName in secureSettings)
|
||||
{
|
||||
// remove secure setting
|
||||
properties.RemoveKey(keyName);
|
||||
}
|
||||
}
|
||||
// return plugin settings
|
||||
return properties;
|
||||
}
|
||||
|
||||
public static KeyValueBunch GetPluginProperties(int userId, int pluginId)
|
||||
{
|
||||
// get plugin
|
||||
SystemPluginBase pluginObj = GetSystemPluginInstance(pluginId);
|
||||
// get settings
|
||||
return GetPluginPropertiesInternal(userId, pluginId, true, pluginObj.SecureSettings);
|
||||
}
|
||||
|
||||
public static int SetPluginProperties(int userId, int pluginId, KeyValueBunch props)
|
||||
{
|
||||
string xmlText = String.Empty;
|
||||
string[][] pluginProps = null;
|
||||
SecurityResult result = StorehouseController.CheckAccountNotDemoAndActive();
|
||||
//
|
||||
if (!result.Success)
|
||||
return result.ResultCode;
|
||||
if (props != null)
|
||||
{
|
||||
// create system plugin
|
||||
SystemPluginBase pluginObj = GetSystemPluginInstance(userId, pluginId, false);
|
||||
// crypt sensitive data
|
||||
foreach (string keyName in props.GetAllKeys())
|
||||
{
|
||||
//
|
||||
string keyValue = props[keyName];
|
||||
//
|
||||
if (pluginObj.SecureSettings != null)
|
||||
{
|
||||
int indexOf = Array.IndexOf(pluginObj.SecureSettings, keyName);
|
||||
// crypt sensitive data
|
||||
if (indexOf > -1)
|
||||
keyValue = CryptoUtils.Encrypt(keyValue);
|
||||
}
|
||||
//
|
||||
props[keyName] = keyValue;
|
||||
}
|
||||
|
||||
// load old properties
|
||||
KeyValueBunch oldProps = GetPluginPropertiesInternal(userId, pluginId,
|
||||
false, pluginObj.SecureSettings);
|
||||
// merge old props with new props
|
||||
foreach (string keyName in props.GetAllKeys())
|
||||
{
|
||||
// copy
|
||||
oldProps[keyName] = props[keyName];
|
||||
}
|
||||
//
|
||||
pluginProps = oldProps.KeyValueArray;
|
||||
}
|
||||
// build update xml
|
||||
xmlText = SettingsHelper.ConvertObjectSettings(pluginProps, "properties", "property");
|
||||
//
|
||||
return EcommerceProvider.SetPluginProperties(SecurityContext.User.UserId, userId, pluginId, xmlText);
|
||||
}
|
||||
|
||||
public static int LogContractPayment(Contract contract, string methodName, string rawData)
|
||||
{
|
||||
SupportedPlugin plugin = GetResellerPMPlugin(contract.ResellerId, methodName);
|
||||
//
|
||||
return EcommerceProvider.WriteSupportedPluginLog(contract.ContractId, plugin.PluginId, 0, rawData);
|
||||
}
|
||||
|
||||
private static int WriteSupportedPluginLog(string contractId, int pluginId, int recordType, string rawData)
|
||||
{
|
||||
return EcommerceProvider.WriteSupportedPluginLog(contractId, pluginId, recordType, rawData);
|
||||
}
|
||||
|
||||
public static List<SupportedPlugin> GetSupportedPluginsByGroup(string groupName)
|
||||
{
|
||||
return ObjectUtils.CreateListFromDataReader<SupportedPlugin>(
|
||||
EcommerceProvider.GetSupportedPluginsByGroup(groupName));
|
||||
}
|
||||
|
||||
public static SupportedPlugin GetSupportedPlugin(string pluginName, string groupName)
|
||||
{
|
||||
return ObjectUtils.FillObjectFromDataReader<SupportedPlugin>(
|
||||
EcommerceProvider.GetSupportedPlugin(pluginName, groupName));
|
||||
}
|
||||
|
||||
public static SupportedPlugin GetSupportedPluginById(int pluginId)
|
||||
{
|
||||
return ObjectUtils.FillObjectFromDataReader<SupportedPlugin>(
|
||||
EcommerceProvider.GetSupportedPluginById(pluginId));
|
||||
}
|
||||
|
||||
internal static CheckoutFormParams GetCheckoutFormParams(string contractId, int invoiceId,
|
||||
string methodName, KeyValueBunch options)
|
||||
{
|
||||
Contract contractInfo = ContractSystem.ContractController.GetContract(contractId);
|
||||
// Impersonate
|
||||
ContractSystem.ContractController.ImpersonateAsContractReseller(contractInfo);
|
||||
//
|
||||
SupportedPlugin pmPlugin = GetResellerPMPlugin(contractInfo.ResellerId, methodName);
|
||||
//
|
||||
if (pmPlugin == null)
|
||||
throw new Exception("Incorrect payment method has been specified");
|
||||
// create instance of plugin
|
||||
IInteractivePaymentGatewayProvider provider = (IInteractivePaymentGatewayProvider)
|
||||
SystemPluginController.GetSystemPluginInstance(contractInfo, pmPlugin, true);
|
||||
//
|
||||
Invoice userInvoice = InvoiceController.GetCustomerInvoiceInternally(invoiceId);
|
||||
//
|
||||
List<InvoiceItem> invoiceLines = InvoiceController.GetCustomerInvoiceItems(invoiceId);
|
||||
// load contract account
|
||||
ContractAccount account = ContractSystem.ContractController.GetContractAccountSettings(contractId);
|
||||
|
||||
// build form parameters
|
||||
FormParameters formParams = new FormParameters();
|
||||
// copy reseller id
|
||||
formParams[FormParameters.CONTRACT] = userInvoice.ContractId;
|
||||
// copy invoice number
|
||||
formParams[FormParameters.INVOICE] = userInvoice.InvoiceId.ToString();
|
||||
// copy invoice amount
|
||||
formParams[FormParameters.AMOUNT] = userInvoice.Total.ToString("0.00");
|
||||
// copy invoice tax amount
|
||||
formParams[FormParameters.TAX_AMOUNT] = userInvoice.TaxAmount.ToString("0.00");
|
||||
// copy invoice currency
|
||||
formParams[FormParameters.CURRENCY] = userInvoice.Currency;
|
||||
|
||||
// copy first name
|
||||
formParams[FormParameters.FIRST_NAME] = account[ContractAccount.FIRST_NAME];
|
||||
// copy last name
|
||||
formParams[FormParameters.LAST_NAME] = account[ContractAccount.LAST_NAME];
|
||||
// copy email
|
||||
formParams[FormParameters.EMAIL] = account[ContractAccount.EMAIL];
|
||||
// copy address
|
||||
formParams[FormParameters.ADDRESS] = account[ContractAccount.ADDRESS];
|
||||
// copy country
|
||||
formParams[FormParameters.COUNTRY] = account[ContractAccount.COUNTRY];
|
||||
// copy phone number
|
||||
formParams[FormParameters.PHONE] = account[ContractAccount.PHONE_NUMBER];
|
||||
// copy city
|
||||
formParams[FormParameters.CITY] = account[ContractAccount.CITY];
|
||||
// copy state
|
||||
formParams[FormParameters.STATE] = account[ContractAccount.STATE];
|
||||
// copy zip
|
||||
formParams[FormParameters.ZIP] = account[ContractAccount.ZIP];
|
||||
// copy options if any
|
||||
if (options != null)
|
||||
{
|
||||
foreach (string keyName in options.GetAllKeys())
|
||||
formParams[keyName] = options[keyName];
|
||||
}
|
||||
|
||||
// return result
|
||||
return provider.GetCheckoutFormParams(formParams, invoiceLines.ToArray());
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
|
@ -0,0 +1,165 @@
|
|||
// Copyright (c) 2011, 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 WebsitePanel.EnterpriseServer;
|
||||
|
||||
namespace WebsitePanel.Ecommerce.EnterpriseServer.TaskEventHandlers
|
||||
{
|
||||
public class SendEmailNotification : TaskEventHandler
|
||||
{
|
||||
public override void OnStart()
|
||||
{
|
||||
// Nothing to do
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Sends corresponding notifications.
|
||||
/// </summary>
|
||||
public override void OnComplete()
|
||||
{
|
||||
if (!TaskManager.HasErrors)
|
||||
{
|
||||
switch (TaskManager.TaskName)
|
||||
{
|
||||
case SystemTasks.SVC_SUSPEND:
|
||||
case SystemTasks.SVC_CANCEL:
|
||||
case SystemTasks.SVC_ACTIVATE:
|
||||
SendServiceStatusChangedNotification();
|
||||
break;
|
||||
case SystemTasks.TASK_ADD_INVOICE:
|
||||
SendInvoiceNotification();
|
||||
break;
|
||||
case SystemTasks.TASK_UPDATE_PAYMENT:
|
||||
case SystemTasks.TASK_ADD_PAYMENT:
|
||||
SendPaymentNotification();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void SendServiceStatusChangedNotification()
|
||||
{
|
||||
// send an e-mail notification
|
||||
try
|
||||
{
|
||||
bool sendNotification = (bool)TaskManager.TaskParameters[SystemTaskParams.PARAM_SEND_EMAIL];
|
||||
// Ensure notification is required
|
||||
if (!sendNotification)
|
||||
{
|
||||
TaskManager.Write("Notification send is not required, thus skipped");
|
||||
return;
|
||||
}
|
||||
|
||||
Service service = (Service)TaskManager.TaskParameters[SystemTaskParams.PARAM_SERVICE];
|
||||
int smtpResult = 0;
|
||||
switch (service.Status)
|
||||
{
|
||||
case ServiceStatus.Active:
|
||||
smtpResult = MiscController.SendServiceActivatedNotification(service.ServiceId);
|
||||
break;
|
||||
case ServiceStatus.Suspended:
|
||||
smtpResult = MiscController.SendServiceSuspendedNotification(service.ServiceId);
|
||||
break;
|
||||
case ServiceStatus.Cancelled:
|
||||
smtpResult = MiscController.SendServiceCanceledNotification(service.ServiceId);
|
||||
break;
|
||||
}
|
||||
//
|
||||
if (smtpResult != 0)
|
||||
{
|
||||
TaskManager.WriteWarning("Unable to send e-mail notification");
|
||||
TaskManager.WriteParameter("SMTP Status", smtpResult);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.WriteError(ex);
|
||||
}
|
||||
}
|
||||
|
||||
private void SendPaymentNotification()
|
||||
{
|
||||
//
|
||||
try
|
||||
{
|
||||
// Read task parameters
|
||||
Invoice invoice = (Invoice)TaskManager.TaskParameters[SystemTaskParams.PARAM_INVOICE];
|
||||
CustomerPayment payment = (CustomerPayment)TaskManager.TaskParameters[SystemTaskParams.PARAM_PAYMENT];
|
||||
//
|
||||
if (payment.Status == TransactionStatus.Approved)
|
||||
{
|
||||
//
|
||||
int smtpResult = MiscController.SendPaymentReceivedNotification(payment);
|
||||
//
|
||||
if (smtpResult != 0)
|
||||
{
|
||||
TaskManager.WriteWarning("Unable to send e-mail notification");
|
||||
TaskManager.WriteParameter("SMTP Status", smtpResult);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.WriteError(ex);
|
||||
}
|
||||
}
|
||||
|
||||
private void SendInvoiceNotification()
|
||||
{
|
||||
//
|
||||
try
|
||||
{
|
||||
// Read task parameters
|
||||
Contract contract = (Contract)TaskManager.TaskParameters[SystemTaskParams.PARAM_CONTRACT];
|
||||
Invoice invoice = (Invoice)TaskManager.TaskParameters[SystemTaskParams.PARAM_INVOICE];
|
||||
List<InvoiceItem> invoiceLines = (List<InvoiceItem>)TaskManager.TaskParameters[SystemTaskParams.PARAM_INVOICE_LINES];
|
||||
KeyValueBunch extraArgs = (KeyValueBunch)TaskManager.TaskParameters[SystemTaskParams.PARAM_EXTRA_ARGS];
|
||||
// modify invoice direct url
|
||||
if (extraArgs != null && !String.IsNullOrEmpty(extraArgs["InvoiceDirectURL"]))
|
||||
extraArgs["InvoiceDirectURL"] += "&InvoiceId=" + invoice.InvoiceId;
|
||||
//
|
||||
int smtpResult = MiscController.SendNewInvoiceNotification(invoice, invoiceLines, extraArgs);
|
||||
//
|
||||
if (smtpResult != 0)
|
||||
{
|
||||
TaskManager.WriteWarning("Unable to send e-mail notification");
|
||||
TaskManager.WriteParameter("SMTP Status", smtpResult);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.WriteError(ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,106 @@
|
|||
// Copyright (c) 2011, 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;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.Specialized;
|
||||
|
||||
using WebsitePanel.EnterpriseServer;
|
||||
|
||||
namespace WebsitePanel.Ecommerce.EnterpriseServer.TaskEventHandlers
|
||||
{
|
||||
public class SystemTriggersAgent : TaskEventHandler
|
||||
{
|
||||
public override void OnStart()
|
||||
{
|
||||
// Nothing to do
|
||||
}
|
||||
|
||||
public override void OnComplete()
|
||||
{
|
||||
if (!TaskManager.HasErrors)
|
||||
{
|
||||
switch (TaskManager.TaskName)
|
||||
{
|
||||
case SystemTasks.TASK_ADD_INVOICE:
|
||||
RegisterInvoiceActivationTrigger();
|
||||
break;
|
||||
case SystemTasks.TASK_ADD_CONTRACT:
|
||||
RegisterContractActivationTrigger();
|
||||
break;
|
||||
case SystemTasks.TASK_UPDATE_PAYMENT:
|
||||
case SystemTasks.TASK_ADD_PAYMENT:
|
||||
ActivatePaymentSystemTriggers();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void RegisterInvoiceActivationTrigger()
|
||||
{
|
||||
// Read contract invoice
|
||||
Invoice invoice = (Invoice)TaskManager.TaskParameters[SystemTaskParams.PARAM_INVOICE];
|
||||
//
|
||||
TriggerSystem.TriggerController.AddSystemTrigger(invoice.InvoiceId.ToString(),
|
||||
ActivateInvoiceTrigger.STATUS_AWAITING_PAYMENT, typeof(ActivateInvoiceTrigger));
|
||||
}
|
||||
|
||||
private void RegisterContractActivationTrigger()
|
||||
{
|
||||
// Ensure the contract has been registered successfully
|
||||
if (TaskManager.TaskParameters.ContainsKey(SystemTaskParams.PARAM_CONTRACT))
|
||||
{
|
||||
Contract contract = (Contract)TaskManager.TaskParameters[SystemTaskParams.PARAM_CONTRACT];
|
||||
//
|
||||
if (contract.Status == ContractStatus.Pending)
|
||||
{
|
||||
TriggerSystem.TriggerController.AddSystemTrigger(contract.ContractId,
|
||||
ActivateContractTrigger.STATUS_AWAITING_PAYMENT, typeof(ActivateContractTrigger));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void ActivatePaymentSystemTriggers()
|
||||
{
|
||||
CustomerPayment payment = (CustomerPayment)TaskManager.TaskParameters[SystemTaskParams.PARAM_PAYMENT];
|
||||
Contract contract = (Contract)TaskManager.TaskParameters[SystemTaskParams.PARAM_CONTRACT];
|
||||
|
||||
// Run activate contract trigger if the transaction was approved
|
||||
if (payment.Status == TransactionStatus.Approved)
|
||||
{
|
||||
// Activate contract
|
||||
TriggerSystem.TriggerController.ExecuteSystemTrigger(contract.ContractId,
|
||||
ActivateContractTrigger.NAMESPACE, null);
|
||||
// Activate invoice
|
||||
TriggerSystem.TriggerController.ExecuteSystemTrigger(payment.InvoiceId.ToString(),
|
||||
ActivateInvoiceTrigger.NAMESPACE, null);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,153 @@
|
|||
// Copyright (c) 2011, 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.Data;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
|
||||
using ES = WebsitePanel.EnterpriseServer;
|
||||
|
||||
namespace WebsitePanel.Ecommerce.EnterpriseServer
|
||||
{
|
||||
public class ActivateInvoiceTrigger : TriggerHandlerBase
|
||||
{
|
||||
public const string NAMESPACE = "INVOICE";
|
||||
public const string STATUS_AWAITING_PAYMENT = "AWAITING_PAYMENT";
|
||||
|
||||
public override string TriggerNamespace
|
||||
{
|
||||
get { return NAMESPACE; }
|
||||
}
|
||||
|
||||
public override void ExecuteTrigger(TriggerEventArgs eventArgs)
|
||||
{
|
||||
//
|
||||
try
|
||||
{
|
||||
ActivatePaidInvoicesTask activator = new ActivatePaidInvoicesTask();
|
||||
// Load invoice items to activate
|
||||
List<InvoiceItem> items = InvoiceController.GetCustomerInvoiceItems(Convert.ToInt32(ReferenceId));
|
||||
//
|
||||
foreach (InvoiceItem item in items)
|
||||
{
|
||||
try
|
||||
{
|
||||
ES.TaskManager.Write("Activating service");
|
||||
// activating
|
||||
GenericSvcResult result = activator.ActivateInvoiceItem(item);
|
||||
// LOG ERROR
|
||||
if (!result.Succeed)
|
||||
{
|
||||
ES.TaskManager.WriteError(result.Error);
|
||||
if (!String.IsNullOrEmpty(result.ErrorCode))
|
||||
ES.TaskManager.WriteParameter("Error code", result.ErrorCode);
|
||||
ES.TaskManager.WriteParameter("Result code", result.ResultCode);
|
||||
// go to next item
|
||||
continue;
|
||||
}
|
||||
//
|
||||
ES.TaskManager.Write("Activated");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
ES.TaskManager.WriteError(ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TriggerStatus = "ERROR";
|
||||
ES.TaskManager.WriteError(ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public class ActivateContractTrigger : TriggerHandlerBase
|
||||
{
|
||||
public const string NAMESPACE = "CONTRACT";
|
||||
public const string STATUS_AWAITING_PAYMENT = "AWAITING_PAYMENT";
|
||||
|
||||
public override string TriggerNamespace
|
||||
{
|
||||
get { return NAMESPACE; }
|
||||
}
|
||||
|
||||
public override void ExecuteTrigger(TriggerEventArgs eventArgs)
|
||||
{
|
||||
//
|
||||
try
|
||||
{
|
||||
Contract contract = ContractSystem.ContractController.GetContract(ReferenceId);
|
||||
//
|
||||
if (contract.Status == ContractStatus.Pending)
|
||||
{
|
||||
//
|
||||
ContractAccount account = ContractSystem.ContractController.GetContractAccountSettings(ReferenceId);
|
||||
//
|
||||
// create user account
|
||||
ES.UserInfo userInfo = new ES.UserInfo();
|
||||
userInfo.Username = account[ContractAccount.USERNAME];
|
||||
userInfo.Password = account[ContractAccount.PASSWORD];
|
||||
userInfo.Email = account[ContractAccount.EMAIL];
|
||||
userInfo.FirstName = account[ContractAccount.FIRST_NAME];
|
||||
userInfo.LastName = account[ContractAccount.LAST_NAME];
|
||||
userInfo.HtmlMail = (account[ContractAccount.MAIL_FORMAT] == "HTML");
|
||||
userInfo.Address = account[ContractAccount.ADDRESS];
|
||||
userInfo.City = account[ContractAccount.CITY];
|
||||
userInfo.CompanyName = account[ContractAccount.COMPANY_NAME];
|
||||
userInfo.Country = account[ContractAccount.COUNTRY];
|
||||
userInfo.State = account[ContractAccount.STATE];
|
||||
userInfo.PrimaryPhone = account[ContractAccount.PHONE_NUMBER];
|
||||
userInfo.Fax = account[ContractAccount.FAX_NUMBER];
|
||||
userInfo.InstantMessenger = account[ContractAccount.INSTANT_MESSENGER];
|
||||
userInfo.Zip = account[ContractAccount.ZIP];
|
||||
userInfo.Role = ES.UserRole.User;
|
||||
userInfo.Status = ES.UserStatus.Active;
|
||||
// set account parent
|
||||
userInfo.OwnerId = contract.ResellerId;
|
||||
userInfo.Created = DateTime.Now;
|
||||
// create account
|
||||
int resultCode = ES.UserController.AddUser(userInfo, true);
|
||||
//
|
||||
if (resultCode > 0)
|
||||
{
|
||||
ContractSystem.ContractController.UpdateContract(ReferenceId, resultCode, contract.AccountName,
|
||||
ContractStatus.Active, 0m, contract.FirstName, contract.LastName, contract.Email,
|
||||
contract.CompanyName, null, null);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TriggerStatus = "ERROR";
|
||||
ES.TaskManager.WriteError(ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,111 @@
|
|||
// Copyright (c) 2011, 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.Data;
|
||||
|
||||
using ES = WebsitePanel.EnterpriseServer;
|
||||
|
||||
namespace WebsitePanel.Ecommerce.EnterpriseServer.TriggerSystem
|
||||
{
|
||||
public class TriggerController
|
||||
{
|
||||
public static void AddSystemTrigger(string referenceId, string triggerStatus, Type triggerType)
|
||||
{
|
||||
//
|
||||
ITriggerHandler trigger = (ITriggerHandler)Activator.CreateInstance(triggerType);
|
||||
//
|
||||
EcommerceProvider.AddSystemTrigger(ES.SecurityContext.User.UserId, ES.SecurityContext.User.UserId,
|
||||
triggerType.AssemblyQualifiedName, referenceId, trigger.TriggerNamespace, triggerStatus);
|
||||
}
|
||||
|
||||
public static void ExecuteSystemTrigger(string referenceId, string triggerNamespace, TriggerEventArgs eventArgs)
|
||||
{
|
||||
//
|
||||
IDataReader dr = null;
|
||||
try
|
||||
{
|
||||
ES.TaskManager.StartTask(SystemTasks.SOURCE_ECOMMERCE, SystemTasks.TASK_EXEC_SYSTEM_TRIGGER);
|
||||
|
||||
List<ITriggerHandler> triggers = new List<ITriggerHandler>();
|
||||
dr = EcommerceProvider.GetSystemTrigger(ES.SecurityContext.User.UserId, referenceId, triggerNamespace);
|
||||
//
|
||||
while(dr.Read())
|
||||
{
|
||||
int ownerId = Convert.ToInt32(dr["OwnerID"]);
|
||||
string triggerId = Convert.ToString(dr["TriggerID"]);
|
||||
string triggerHandler = Convert.ToString(dr["TriggerHandler"]);
|
||||
string triggerStatus = (dr["Status"] == DBNull.Value) ? null : Convert.ToString(dr["Status"]);
|
||||
// Instantiate trigger handler
|
||||
ITriggerHandler trigger = (ITriggerHandler)Activator.CreateInstance(Type.GetType(triggerHandler));
|
||||
//
|
||||
trigger.TriggerId = triggerId;
|
||||
trigger.OwnerId = ownerId;
|
||||
trigger.TriggerStatus = triggerStatus;
|
||||
trigger.ReferenceId = referenceId;
|
||||
//
|
||||
triggers.Add(trigger);
|
||||
//
|
||||
}
|
||||
dr.Close();
|
||||
//
|
||||
foreach (ITriggerHandler trigger in triggers)
|
||||
{
|
||||
try
|
||||
{
|
||||
trigger.ExecuteTrigger(eventArgs);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
ES.TaskManager.WriteError(ex);
|
||||
continue;
|
||||
}
|
||||
//
|
||||
DeleteSystemTrigger(trigger.TriggerId);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw ES.TaskManager.WriteError(ex);
|
||||
}
|
||||
finally
|
||||
{
|
||||
if (dr != null)
|
||||
dr.Close();
|
||||
//
|
||||
ES.TaskManager.CompleteTask();
|
||||
}
|
||||
}
|
||||
|
||||
private static void DeleteSystemTrigger(string triggerId)
|
||||
{
|
||||
EcommerceProvider.DeleteSystemTrigger(ES.SecurityContext.User.UserId, triggerId);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,896 @@
|
|||
// Copyright (c) 2011, 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.Web;
|
||||
using WebsitePanel.Providers.ExchangeHostedEdition;
|
||||
using WebsitePanel.Providers.ResultObjects;
|
||||
using WebsitePanel.Providers.Common;
|
||||
using WebsitePanel.Providers;
|
||||
using System.Collections.Specialized;
|
||||
using System.Collections;
|
||||
using System.Net.Mail;
|
||||
|
||||
namespace WebsitePanel.EnterpriseServer
|
||||
{
|
||||
public class ExchangeHostedEditionController
|
||||
{
|
||||
// messages
|
||||
public const string GeneralError = "GeneralError";
|
||||
public const string ExchangeServiceNotEnabledError = "ExchangeServiceNotEnabledError";
|
||||
public const string ProgramIdIsNotSetError = "ProgramIdIsNotSetError";
|
||||
public const string OfferIdIsNotSetError = "OfferIdIsNotSetError";
|
||||
public const string CreateOrganizationError = "CreateOrganizationError";
|
||||
public const string OrganizationNotFoundError = "OrganizationNotFoundError";
|
||||
public const string SendOrganizationSummaryError = "SendOrganizationSummaryError";
|
||||
public const string SendOrganizationTemplateNotSetError = "SendOrganizationTemplateNotSetError";
|
||||
public const string AddDomainError = "AddDomainError";
|
||||
public const string AddDomainQuotaExceededError = "AddDomainQuotaExceededError";
|
||||
public const string AddDomainExistsError = "AddDomainExistsError";
|
||||
public const string AddDomainAlreadyUsedError = "AddDomainAlreadyUsedError";
|
||||
public const string DeleteDomainError = "DeleteDomainError";
|
||||
public const string UpdateQuotasError = "UpdateQuotasError";
|
||||
public const string UpdateQuotasWrongQuotaError = "UpdateQuotasWrongQuotaError";
|
||||
public const string UpdateCatchAllError = "UpdateCatchAllError";
|
||||
public const string UpdateServicePlanError = "UpdateServicePlanError";
|
||||
public const string DeleteOrganizationError = "DeleteOrganizationError";
|
||||
|
||||
public const string TempDomainSetting = "temporaryDomain";
|
||||
public const string ExchangeControlPanelUrlSetting = "ecpURL";
|
||||
|
||||
// other constants
|
||||
public const string TaskManagerSource = "ExchangeHostedEdition";
|
||||
|
||||
public static IntResult CreateOrganization(int packageId, string organizationId,
|
||||
string domain, string adminName, string adminEmail, string adminPassword)
|
||||
{
|
||||
IntResult result = new IntResult();
|
||||
result.IsSuccess = true;
|
||||
|
||||
try
|
||||
{
|
||||
// initialize task manager
|
||||
TaskManager.StartTask(TaskManagerSource, "CREATE_ORGANIZATION");
|
||||
TaskManager.WriteParameter("packageId", packageId);
|
||||
TaskManager.WriteParameter("organizationId", organizationId);
|
||||
TaskManager.WriteParameter("domain", domain);
|
||||
TaskManager.WriteParameter("adminName", adminName);
|
||||
TaskManager.WriteParameter("adminEmail", adminEmail);
|
||||
TaskManager.WriteParameter("adminPassword", adminPassword);
|
||||
|
||||
// get Exchange service ID
|
||||
int serviceId = PackageController.GetPackageServiceId(packageId, ResourceGroups.ExchangeHostedEdition);
|
||||
if(serviceId < 1)
|
||||
return Error<IntResult>(ExchangeServiceNotEnabledError);
|
||||
|
||||
#region Check Space and Account
|
||||
// Check account
|
||||
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive);
|
||||
if (accountCheck < 0)
|
||||
return Warning<IntResult>((-accountCheck).ToString());
|
||||
|
||||
// Check space
|
||||
int packageCheck = SecurityContext.CheckPackage(packageId, DemandPackage.IsActive);
|
||||
if (packageCheck < 0)
|
||||
return Warning<IntResult>((-packageCheck).ToString());
|
||||
#endregion
|
||||
|
||||
// get Exchange service
|
||||
ExchangeServerHostedEdition exchange = GetExchangeService(serviceId);
|
||||
|
||||
// load service settings to know ProgramID, OfferID
|
||||
StringDictionary serviceSettings = ServerController.GetServiceSettings(serviceId);
|
||||
string programId = serviceSettings["programID"];
|
||||
string offerId = serviceSettings["offerID"];
|
||||
|
||||
// check settings
|
||||
if(String.IsNullOrEmpty(programId))
|
||||
result.ErrorCodes.Add(ProgramIdIsNotSetError);
|
||||
if (String.IsNullOrEmpty(offerId))
|
||||
result.ErrorCodes.Add(OfferIdIsNotSetError);
|
||||
|
||||
if (result.ErrorCodes.Count > 0)
|
||||
{
|
||||
result.IsSuccess = false;
|
||||
return result;
|
||||
}
|
||||
|
||||
#region Create organization
|
||||
int itemId = -1;
|
||||
ExchangeOrganization org = null;
|
||||
try
|
||||
{
|
||||
// create organization
|
||||
exchange.CreateOrganization(organizationId, programId, offerId, domain, adminName, adminEmail, adminPassword);
|
||||
|
||||
// save item into meta-base
|
||||
org = new ExchangeOrganization();
|
||||
org.Name = organizationId;
|
||||
org.PackageId = packageId;
|
||||
org.ServiceId = serviceId;
|
||||
itemId = PackageController.AddPackageItem(org);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
// log error
|
||||
TaskManager.WriteError(ex);
|
||||
return Error<IntResult>(CreateOrganizationError);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Update organization quotas
|
||||
// update max org quotas
|
||||
UpdateOrganizationQuotas(org);
|
||||
|
||||
// override quotas
|
||||
ResultObject quotasResult = ExchangeHostedEditionController.UpdateOrganizationQuotas(itemId,
|
||||
org.MaxMailboxCountQuota,
|
||||
org.MaxContactCountQuota,
|
||||
org.MaxDistributionListCountQuota);
|
||||
|
||||
if (!quotasResult.IsSuccess)
|
||||
return Error<IntResult>(quotasResult, CreateOrganizationError);
|
||||
#endregion
|
||||
|
||||
#region Add temporary domain
|
||||
// load settings
|
||||
PackageSettings settings = GetExchangePackageSettings(org);
|
||||
string tempDomainTemplate = settings[TempDomainSetting];
|
||||
if (!String.IsNullOrEmpty(tempDomainTemplate))
|
||||
{
|
||||
// add temp domain
|
||||
string tempDomain = String.Format("{0}.{1}", domain, tempDomainTemplate);
|
||||
AddOrganizationDomain(itemId, tempDomain);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
result.Value = itemId;
|
||||
return result;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
// log error
|
||||
TaskManager.WriteError(ex);
|
||||
|
||||
// exit with error code
|
||||
return Error<IntResult>(GeneralError, ex.Message);
|
||||
}
|
||||
finally
|
||||
{
|
||||
TaskManager.CompleteTask();
|
||||
}
|
||||
}
|
||||
|
||||
public static List<ExchangeOrganization> GetOrganizations(int packageId)
|
||||
{
|
||||
List<ServiceProviderItem> items = PackageController.GetPackageItemsByType(
|
||||
packageId, typeof(ExchangeOrganization), false);
|
||||
|
||||
return items.ConvertAll<ExchangeOrganization>(i => { return (ExchangeOrganization)i; });
|
||||
}
|
||||
|
||||
public static ExchangeOrganization GetOrganizationDetails(int itemId)
|
||||
{
|
||||
// load organization item
|
||||
ExchangeOrganization item = PackageController.GetPackageItem(itemId) as ExchangeOrganization;
|
||||
if (item == null)
|
||||
return null; // organization item not found
|
||||
|
||||
// get Exchange service
|
||||
ExchangeServerHostedEdition exchange = GetExchangeService(item.ServiceId);
|
||||
|
||||
// get organization details
|
||||
ExchangeOrganization org = exchange.GetOrganizationDetails(item.Name);
|
||||
|
||||
//ExchangeOrganization org = new ExchangeOrganization
|
||||
//{
|
||||
// Id = item.Id,
|
||||
// PackageId = item.PackageId,
|
||||
// ServiceId = item.ServiceId,
|
||||
// Name = item.Name,
|
||||
// AdministratorEmail = "admin@email.com",
|
||||
// AdministratorName = "Administrator Mailbox",
|
||||
// CatchAllAddress = "",
|
||||
// ContactCount = 1,
|
||||
// ContactCountQuota = 2,
|
||||
// MaxContactCountQuota = 3,
|
||||
// DistinguishedName = "DN=....",
|
||||
// DistributionListCount = 2,
|
||||
// DistributionListCountQuota = 3,
|
||||
// MaxDistributionListCountQuota = 3,
|
||||
// MaxDomainsCountQuota = 4,
|
||||
// ExchangeControlPanelUrl = "http://ecp.domain.com",
|
||||
// MailboxCount = 3,
|
||||
// MailboxCountQuota = 4,
|
||||
// MaxMailboxCountQuota = 4,
|
||||
// ProgramId = "HostedExchange",
|
||||
// OfferId = "2",
|
||||
// ServicePlan = "HostedExchange_Basic",
|
||||
// Domains = GetOrganizationDomains(item.Id).ToArray()
|
||||
//};
|
||||
|
||||
// update item props
|
||||
org.Id = item.Id;
|
||||
org.PackageId = item.PackageId;
|
||||
org.ServiceId = item.ServiceId;
|
||||
org.Name = item.Name;
|
||||
org.CatchAllAddress = item.CatchAllAddress;
|
||||
|
||||
// update max quotas
|
||||
UpdateOrganizationQuotas(org);
|
||||
|
||||
// process summary information
|
||||
org.SummaryInformation = GetExchangeOrganizationSummary(org);
|
||||
|
||||
// process domains
|
||||
PackageSettings settings = GetExchangePackageSettings(org);
|
||||
if(settings != null)
|
||||
{
|
||||
// get settings
|
||||
string tempDomain = settings[TempDomainSetting];
|
||||
string ecpUrl = settings[ExchangeControlPanelUrlSetting];
|
||||
|
||||
// iterate through domains
|
||||
foreach (ExchangeOrganizationDomain domain in org.Domains)
|
||||
{
|
||||
if (tempDomain != null && domain.Name.EndsWith("." + tempDomain, StringComparison.InvariantCultureIgnoreCase))
|
||||
domain.IsTemp = true;
|
||||
if (domain.IsDefault && ecpUrl != null)
|
||||
org.ExchangeControlPanelUrl = Utils.ReplaceStringVariable(ecpUrl, "domain_name", domain.Name);
|
||||
}
|
||||
}
|
||||
|
||||
// return org
|
||||
return org;
|
||||
}
|
||||
|
||||
public static void UpdateOrganizationQuotas(ExchangeOrganization org)
|
||||
{
|
||||
// load default package quotas
|
||||
PackageContext cntx = PackageController.GetPackageContext(org.PackageId);
|
||||
if (!cntx.Groups.ContainsKey(ResourceGroups.ExchangeHostedEdition))
|
||||
return;
|
||||
|
||||
org.MaxMailboxCountQuota = cntx.Quotas[Quotas.EXCHANGEHOSTEDEDITION_MAILBOXES].QuotaAllocatedValue;
|
||||
org.MaxContactCountQuota = cntx.Quotas[Quotas.EXCHANGEHOSTEDEDITION_CONTACTS].QuotaAllocatedValue;
|
||||
org.MaxDistributionListCountQuota = cntx.Quotas[Quotas.EXCHANGEHOSTEDEDITION_DISTRIBUTIONLISTS].QuotaAllocatedValue;
|
||||
org.MaxDomainsCountQuota = cntx.Quotas[Quotas.EXCHANGEHOSTEDEDITION_DOMAINS].QuotaAllocatedValue;
|
||||
}
|
||||
|
||||
public static List<ExchangeOrganizationDomain> GetOrganizationDomains(int itemId)
|
||||
{
|
||||
// load organization item
|
||||
ExchangeOrganization item = PackageController.GetPackageItem(itemId) as ExchangeOrganization;
|
||||
if (item == null)
|
||||
return null; // organization item not found
|
||||
|
||||
// get Exchange service
|
||||
ExchangeServerHostedEdition exchange = GetExchangeService(item.ServiceId);
|
||||
|
||||
// get organization domains
|
||||
List<ExchangeOrganizationDomain> domains = new List<ExchangeOrganizationDomain>();
|
||||
domains.AddRange(exchange.GetOrganizationDomains(item.Name));
|
||||
return domains;
|
||||
|
||||
//return new List<ExchangeOrganizationDomain>
|
||||
//{
|
||||
// new ExchangeOrganizationDomain { Identity = "org101\\domain1.com", Name = "domain1.com", IsDefault = true, IsTemp = false },
|
||||
// new ExchangeOrganizationDomain { Identity = "org101\\org101.tempdomain.com", Name = "org101.tempdomain.com", IsDefault = false, IsTemp = true },
|
||||
// new ExchangeOrganizationDomain { Identity = "org101\\myseconddomain.com", Name = "myseconddomain.com", IsDefault = false, IsTemp = false }
|
||||
//};
|
||||
}
|
||||
|
||||
public static string GetExchangeOrganizationSummary(int itemId)
|
||||
{
|
||||
// load organization details
|
||||
ExchangeOrganization org = GetOrganizationDetails(itemId);
|
||||
if (org == null)
|
||||
return null; // organization not found
|
||||
|
||||
return GetExchangeOrganizationSummary(org);
|
||||
}
|
||||
|
||||
private static string GetExchangeOrganizationSummary(ExchangeOrganization org)
|
||||
{
|
||||
// evaluate template
|
||||
MailTemplate template = EvaluateOrganizationSummaryTemplate(org);
|
||||
if (template == null || template.Body == null)
|
||||
return null;
|
||||
|
||||
return template.IsHtml ? template.Body : template.Body.Replace("\n", "<br/>");
|
||||
}
|
||||
|
||||
private static MailTemplate EvaluateOrganizationSummaryTemplate(ExchangeOrganization org)
|
||||
{
|
||||
#region create template context
|
||||
Hashtable items = new Hashtable();
|
||||
|
||||
// add organization
|
||||
items["org"] = org;
|
||||
|
||||
// add package information
|
||||
PackageInfo space = PackageController.GetPackage(org.PackageId);
|
||||
items["space"] = space;
|
||||
|
||||
// add user information
|
||||
UserInfo user = UserController.GetUser(space.UserId);
|
||||
items["user"] = user;
|
||||
#endregion
|
||||
|
||||
#region load template
|
||||
// load template settings
|
||||
UserSettings settings = UserController.GetUserSettings(user.UserId, UserSettings.EXCHANGE_HOSTED_EDITION_ORGANIZATION_SUMMARY);
|
||||
if(settings == null)
|
||||
return null;
|
||||
|
||||
// create template
|
||||
MailTemplate template = new MailTemplate();
|
||||
|
||||
// from
|
||||
template.From = settings["From"];
|
||||
|
||||
// BCC
|
||||
template.Bcc = settings["CC"];
|
||||
|
||||
// subject
|
||||
template.Subject = settings["Subject"];
|
||||
|
||||
// body
|
||||
template.IsHtml = user.HtmlMail;
|
||||
string bodySetting = template.IsHtml ? "HtmlBody" : "TextBody";
|
||||
template.Body = settings[bodySetting];
|
||||
|
||||
// priority
|
||||
string priority = settings["Priority"];
|
||||
template.Priority = String.IsNullOrEmpty(priority)
|
||||
? MailPriority.Normal
|
||||
: (MailPriority)Enum.Parse(typeof(MailPriority), priority, true);
|
||||
#endregion
|
||||
|
||||
#region evaluate template
|
||||
if(template.Subject != null)
|
||||
template.Subject = PackageController.EvaluateTemplate(template.Subject, items);
|
||||
|
||||
if(template.Body != null)
|
||||
template.Body = PackageController.EvaluateTemplate(template.Body, items);
|
||||
#endregion
|
||||
|
||||
return template;
|
||||
}
|
||||
|
||||
private static PackageSettings GetExchangePackageSettings(ExchangeOrganization org)
|
||||
{
|
||||
// load package settings
|
||||
return PackageController.GetPackageSettings(org.PackageId, PackageSettings.EXCHANGE_HOSTED_EDITION);
|
||||
}
|
||||
|
||||
public static ResultObject SendExchangeOrganizationSummary(int itemId, string toEmail)
|
||||
{
|
||||
ResultObject result = new ResultObject();
|
||||
result.IsSuccess = true;
|
||||
|
||||
try
|
||||
{
|
||||
// initialize task manager
|
||||
TaskManager.StartTask(TaskManagerSource, "SEND_SUMMARY");
|
||||
TaskManager.WriteParameter("Item ID", itemId);
|
||||
TaskManager.WriteParameter("To e-mail", toEmail);
|
||||
|
||||
// load organization item
|
||||
ExchangeOrganization item = PackageController.GetPackageItem(itemId) as ExchangeOrganization;
|
||||
if (item == null)
|
||||
return Error<ResultObject>(OrganizationNotFoundError);
|
||||
|
||||
#region Check Space and Account
|
||||
// Check account
|
||||
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive);
|
||||
if (accountCheck < 0)
|
||||
return Warning<ResultObject>((-accountCheck).ToString());
|
||||
|
||||
// Check space
|
||||
int packageCheck = SecurityContext.CheckPackage(item.PackageId, DemandPackage.IsActive);
|
||||
if (packageCheck < 0)
|
||||
return Warning<ResultObject>((-packageCheck).ToString());
|
||||
#endregion
|
||||
|
||||
// load organization details
|
||||
ExchangeOrganization org = GetOrganizationDetails(item.Id);
|
||||
if(org == null)
|
||||
return Error<ResultObject>(OrganizationNotFoundError);
|
||||
|
||||
// get evaluated summary information
|
||||
MailTemplate msg = EvaluateOrganizationSummaryTemplate(org);
|
||||
if (msg == null)
|
||||
return Error<ResultObject>(SendOrganizationTemplateNotSetError);
|
||||
|
||||
// send message
|
||||
int sendResult = MailHelper.SendMessage(msg.From, toEmail, msg.Bcc, msg.Subject, msg.Body, msg.Priority, msg.IsHtml);
|
||||
if (sendResult < 0)
|
||||
return Error<ResultObject>((-sendResult).ToString());
|
||||
|
||||
return result;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
// log error
|
||||
TaskManager.WriteError(ex);
|
||||
|
||||
// exit with error code
|
||||
return Error<ResultObject>(SendOrganizationSummaryError, ex.Message);
|
||||
}
|
||||
finally
|
||||
{
|
||||
TaskManager.CompleteTask();
|
||||
}
|
||||
}
|
||||
|
||||
public static ResultObject AddOrganizationDomain(int itemId, string domainName)
|
||||
{
|
||||
ResultObject result = new ResultObject();
|
||||
result.IsSuccess = true;
|
||||
|
||||
try
|
||||
{
|
||||
// initialize task manager
|
||||
TaskManager.StartTask(TaskManagerSource, "ADD_DOMAIN");
|
||||
TaskManager.WriteParameter("itemId", itemId);
|
||||
TaskManager.WriteParameter("domain", domainName);
|
||||
|
||||
// load organization item
|
||||
ExchangeOrganization item = PackageController.GetPackageItem(itemId) as ExchangeOrganization;
|
||||
if (item == null)
|
||||
return Error<ResultObject>(OrganizationNotFoundError);
|
||||
|
||||
#region Check Space and Account
|
||||
// Check account
|
||||
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive);
|
||||
if (accountCheck < 0)
|
||||
return Warning<ResultObject>((-accountCheck).ToString());
|
||||
|
||||
// Check space
|
||||
int packageCheck = SecurityContext.CheckPackage(item.PackageId, DemandPackage.IsActive);
|
||||
if (packageCheck < 0)
|
||||
return Warning<ResultObject>((-packageCheck).ToString());
|
||||
#endregion
|
||||
|
||||
// get organization details
|
||||
ExchangeOrganization org = GetOrganizationDetails(item.Id);
|
||||
if (org == null)
|
||||
return Error<ResultObject>(OrganizationNotFoundError);
|
||||
|
||||
// check domains quota
|
||||
if(org.MaxDomainsCountQuota > -1 && org.Domains.Length >= org.MaxDomainsCountQuota)
|
||||
return Error<IntResult>(AddDomainQuotaExceededError);
|
||||
|
||||
// check if the domain already exists
|
||||
DomainInfo domain = null;
|
||||
int checkResult = ServerController.CheckDomain(domainName);
|
||||
if (checkResult == BusinessErrorCodes.ERROR_DOMAIN_ALREADY_EXISTS)
|
||||
{
|
||||
// domain exists
|
||||
// check if it belongs to the same space
|
||||
domain = ServerController.GetDomain(domainName);
|
||||
if (domain == null)
|
||||
return Error<ResultObject>((-checkResult).ToString());
|
||||
|
||||
if (domain.PackageId != org.PackageId)
|
||||
return Error<ResultObject>((-checkResult).ToString());
|
||||
|
||||
// check if domain is already used in this organization
|
||||
foreach (ExchangeOrganizationDomain orgDomain in org.Domains)
|
||||
{
|
||||
if(String.Equals(orgDomain.Name, domainName, StringComparison.InvariantCultureIgnoreCase))
|
||||
return Error<ResultObject>(AddDomainAlreadyUsedError);
|
||||
}
|
||||
}
|
||||
else if (checkResult == BusinessErrorCodes.ERROR_RESTRICTED_DOMAIN)
|
||||
{
|
||||
return Error<ResultObject>((-checkResult).ToString());
|
||||
}
|
||||
|
||||
// create domain if required
|
||||
if (domain == null)
|
||||
{
|
||||
domain = new DomainInfo();
|
||||
domain.PackageId = org.PackageId;
|
||||
domain.DomainName = domainName;
|
||||
domain.IsInstantAlias = false;
|
||||
domain.IsSubDomain = false;
|
||||
|
||||
int domainId = ServerController.AddDomain(domain);
|
||||
if (domainId < 0)
|
||||
return Error<ResultObject>((-domainId).ToString());
|
||||
|
||||
// add domain
|
||||
domain.DomainId = domainId;
|
||||
}
|
||||
|
||||
// get Exchange service
|
||||
ExchangeServerHostedEdition exchange = GetExchangeService(item.ServiceId);
|
||||
|
||||
// add domain
|
||||
exchange.AddOrganizationDomain(item.Name, domainName);
|
||||
|
||||
return result;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
// log error
|
||||
TaskManager.WriteError(ex);
|
||||
|
||||
// exit with error code
|
||||
return Error<ResultObject>(AddDomainError, ex.Message);
|
||||
}
|
||||
finally
|
||||
{
|
||||
TaskManager.CompleteTask();
|
||||
}
|
||||
}
|
||||
|
||||
public static ResultObject DeleteOrganizationDomain(int itemId, string domainName)
|
||||
{
|
||||
ResultObject result = new ResultObject();
|
||||
result.IsSuccess = true;
|
||||
|
||||
try
|
||||
{
|
||||
// initialize task manager
|
||||
TaskManager.StartTask(TaskManagerSource, "DELETE_DOMAIN");
|
||||
TaskManager.WriteParameter("itemId", itemId);
|
||||
TaskManager.WriteParameter("domain", domainName);
|
||||
|
||||
// load organization item
|
||||
ExchangeOrganization item = PackageController.GetPackageItem(itemId) as ExchangeOrganization;
|
||||
if (item == null)
|
||||
return Error<ResultObject>(OrganizationNotFoundError);
|
||||
|
||||
#region Check Space and Account
|
||||
// Check account
|
||||
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive);
|
||||
if (accountCheck < 0)
|
||||
return Warning<ResultObject>((-accountCheck).ToString());
|
||||
|
||||
// Check space
|
||||
int packageCheck = SecurityContext.CheckPackage(item.PackageId, DemandPackage.IsActive);
|
||||
if (packageCheck < 0)
|
||||
return Warning<ResultObject>((-packageCheck).ToString());
|
||||
#endregion
|
||||
|
||||
// get Exchange service
|
||||
ExchangeServerHostedEdition exchange = GetExchangeService(item.ServiceId);
|
||||
|
||||
// delete domain
|
||||
exchange.DeleteOrganizationDomain(item.Name, domainName);
|
||||
|
||||
return result;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
// log error
|
||||
TaskManager.WriteError(ex);
|
||||
|
||||
// exit with error code
|
||||
return Error<ResultObject>(DeleteDomainError, ex.Message);
|
||||
}
|
||||
finally
|
||||
{
|
||||
TaskManager.CompleteTask();
|
||||
}
|
||||
}
|
||||
|
||||
public static ResultObject UpdateOrganizationQuotas(int itemId, int mailboxesNumber, int contactsNumber, int distributionListsNumber)
|
||||
{
|
||||
ResultObject result = new ResultObject();
|
||||
result.IsSuccess = true;
|
||||
|
||||
try
|
||||
{
|
||||
// initialize task manager
|
||||
TaskManager.StartTask(TaskManagerSource, "UPDATE_QUOTAS");
|
||||
TaskManager.WriteParameter("itemId", itemId);
|
||||
TaskManager.WriteParameter("mailboxesNumber", mailboxesNumber);
|
||||
TaskManager.WriteParameter("contactsNumber", contactsNumber);
|
||||
TaskManager.WriteParameter("distributionListsNumber", distributionListsNumber);
|
||||
|
||||
// load organization item
|
||||
ExchangeOrganization item = PackageController.GetPackageItem(itemId) as ExchangeOrganization;
|
||||
if (item == null)
|
||||
return Error<ResultObject>(OrganizationNotFoundError);
|
||||
|
||||
#region Check Space and Account
|
||||
// Check account
|
||||
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive);
|
||||
if (accountCheck < 0)
|
||||
return Warning<ResultObject>((-accountCheck).ToString());
|
||||
|
||||
// Check space
|
||||
int packageCheck = SecurityContext.CheckPackage(item.PackageId, DemandPackage.IsActive);
|
||||
if (packageCheck < 0)
|
||||
return Warning<ResultObject>((-packageCheck).ToString());
|
||||
#endregion
|
||||
|
||||
// check quotas
|
||||
UpdateOrganizationQuotas(item);
|
||||
|
||||
if(item.MaxMailboxCountQuota > -1 && mailboxesNumber > item.MaxMailboxCountQuota)
|
||||
return Error<ResultObject>(UpdateQuotasWrongQuotaError);
|
||||
if (item.MaxContactCountQuota > -1 && contactsNumber > item.MaxContactCountQuota)
|
||||
return Error<ResultObject>(UpdateQuotasWrongQuotaError);
|
||||
if (item.MaxDistributionListCountQuota > -1 && distributionListsNumber > item.MaxDistributionListCountQuota)
|
||||
return Error<ResultObject>(UpdateQuotasWrongQuotaError);
|
||||
|
||||
// get Exchange service
|
||||
ExchangeServerHostedEdition exchange = GetExchangeService(item.ServiceId);
|
||||
|
||||
// update quotas
|
||||
exchange.UpdateOrganizationQuotas(item.Name, mailboxesNumber, contactsNumber, distributionListsNumber);
|
||||
|
||||
return result;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
// log error
|
||||
TaskManager.WriteError(ex);
|
||||
|
||||
// exit with error code
|
||||
return Error<ResultObject>(UpdateQuotasError, ex.Message);
|
||||
}
|
||||
finally
|
||||
{
|
||||
TaskManager.CompleteTask();
|
||||
}
|
||||
}
|
||||
|
||||
public static ResultObject UpdateOrganizationCatchAllAddress(int itemId, string catchAllEmail)
|
||||
{
|
||||
ResultObject result = new ResultObject();
|
||||
result.IsSuccess = true;
|
||||
|
||||
try
|
||||
{
|
||||
// initialize task manager
|
||||
TaskManager.StartTask(TaskManagerSource, "UPDATE_CATCHALL");
|
||||
TaskManager.WriteParameter("itemId", itemId);
|
||||
TaskManager.WriteParameter("catchAllEmail", catchAllEmail);
|
||||
|
||||
// load organization item
|
||||
ExchangeOrganization item = PackageController.GetPackageItem(itemId) as ExchangeOrganization;
|
||||
if (item == null)
|
||||
return Error<ResultObject>(OrganizationNotFoundError);
|
||||
|
||||
#region Check Space and Account
|
||||
// Check account
|
||||
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive);
|
||||
if (accountCheck < 0)
|
||||
return Warning<ResultObject>((-accountCheck).ToString());
|
||||
|
||||
// Check space
|
||||
int packageCheck = SecurityContext.CheckPackage(item.PackageId, DemandPackage.IsActive);
|
||||
if (packageCheck < 0)
|
||||
return Warning<ResultObject>((-packageCheck).ToString());
|
||||
#endregion
|
||||
|
||||
// get Exchange service
|
||||
ExchangeServerHostedEdition exchange = GetExchangeService(item.ServiceId);
|
||||
|
||||
// update catch-all
|
||||
exchange.UpdateOrganizationCatchAllAddress(item.Name, catchAllEmail);
|
||||
|
||||
// save new catch-all in the item
|
||||
item.CatchAllAddress = catchAllEmail;
|
||||
PackageController.UpdatePackageItem(item);
|
||||
|
||||
return result;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
// log error
|
||||
TaskManager.WriteError(ex);
|
||||
|
||||
// exit with error code
|
||||
return Error<ResultObject>(UpdateCatchAllError, ex.Message);
|
||||
}
|
||||
finally
|
||||
{
|
||||
TaskManager.CompleteTask();
|
||||
}
|
||||
}
|
||||
|
||||
public static ResultObject UpdateOrganizationServicePlan(int itemId, int newServiceId)
|
||||
{
|
||||
ResultObject result = new ResultObject();
|
||||
result.IsSuccess = true;
|
||||
|
||||
try
|
||||
{
|
||||
// initialize task manager
|
||||
TaskManager.StartTask(TaskManagerSource, "UPDATE_SERVICE");
|
||||
TaskManager.WriteParameter("itemId", itemId);
|
||||
TaskManager.WriteParameter("newServiceId", newServiceId);
|
||||
|
||||
// load organization item
|
||||
ExchangeOrganization item = PackageController.GetPackageItem(itemId) as ExchangeOrganization;
|
||||
if (item == null)
|
||||
return Error<ResultObject>(OrganizationNotFoundError);
|
||||
|
||||
#region Check Space and Account
|
||||
// Check account
|
||||
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsAdmin | DemandAccount.IsActive);
|
||||
if (accountCheck < 0)
|
||||
return Warning<ResultObject>((-accountCheck).ToString());
|
||||
|
||||
// Check space
|
||||
int packageCheck = SecurityContext.CheckPackage(item.PackageId, DemandPackage.IsActive);
|
||||
if (packageCheck < 0)
|
||||
return Warning<ResultObject>((-packageCheck).ToString());
|
||||
#endregion
|
||||
|
||||
// get Exchange service
|
||||
ExchangeServerHostedEdition exchange = GetExchangeService(item.ServiceId);
|
||||
|
||||
// load service settings to know ProgramID, OfferID
|
||||
StringDictionary serviceSettings = ServerController.GetServiceSettings(newServiceId);
|
||||
string programId = serviceSettings["programID"];
|
||||
string offerId = serviceSettings["offerID"];
|
||||
|
||||
// check settings
|
||||
if(String.IsNullOrEmpty(programId))
|
||||
result.ErrorCodes.Add(ProgramIdIsNotSetError);
|
||||
if (String.IsNullOrEmpty(offerId))
|
||||
result.ErrorCodes.Add(OfferIdIsNotSetError);
|
||||
|
||||
// update service plan
|
||||
exchange.UpdateOrganizationServicePlan(item.Name, programId, offerId);
|
||||
|
||||
// move item between services
|
||||
int moveResult = PackageController.MovePackageItem(itemId, newServiceId);
|
||||
if (moveResult < 0)
|
||||
return Error<ResultObject>((-moveResult).ToString());
|
||||
|
||||
return result;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
// log error
|
||||
TaskManager.WriteError(ex);
|
||||
|
||||
// exit with error code
|
||||
return Error<ResultObject>(UpdateServicePlanError, ex.Message);
|
||||
}
|
||||
finally
|
||||
{
|
||||
TaskManager.CompleteTask();
|
||||
}
|
||||
}
|
||||
|
||||
public static ResultObject DeleteOrganization(int itemId)
|
||||
{
|
||||
ResultObject result = new ResultObject();
|
||||
result.IsSuccess = true;
|
||||
|
||||
try
|
||||
{
|
||||
// initialize task manager
|
||||
TaskManager.StartTask(TaskManagerSource, "DELETE_ORGANIZATION");
|
||||
TaskManager.WriteParameter("itemId", itemId);
|
||||
|
||||
// load organization item
|
||||
ExchangeOrganization item = PackageController.GetPackageItem(itemId) as ExchangeOrganization;
|
||||
if (item == null)
|
||||
return Error<ResultObject>(OrganizationNotFoundError);
|
||||
|
||||
#region Check Space and Account
|
||||
// Check account
|
||||
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive);
|
||||
if (accountCheck < 0)
|
||||
return Warning<ResultObject>((-accountCheck).ToString());
|
||||
|
||||
// Check space
|
||||
int packageCheck = SecurityContext.CheckPackage(item.PackageId, DemandPackage.IsActive);
|
||||
if (packageCheck < 0)
|
||||
return Warning<ResultObject>((-packageCheck).ToString());
|
||||
#endregion
|
||||
|
||||
// get Exchange service
|
||||
ExchangeServerHostedEdition exchange = GetExchangeService(item.ServiceId);
|
||||
|
||||
// delete organization
|
||||
exchange.DeleteOrganization(item.Name);
|
||||
|
||||
// delete meta-item
|
||||
PackageController.DeletePackageItem(itemId);
|
||||
|
||||
return result;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
// log error
|
||||
TaskManager.WriteError(ex);
|
||||
|
||||
// exit with error code
|
||||
return Error<ResultObject>(DeleteOrganizationError, ex.Message);
|
||||
}
|
||||
finally
|
||||
{
|
||||
TaskManager.CompleteTask();
|
||||
}
|
||||
}
|
||||
|
||||
#region Private helpers
|
||||
public static ExchangeServerHostedEdition GetExchangeService(int serviceId)
|
||||
{
|
||||
ExchangeServerHostedEdition ws = new ExchangeServerHostedEdition();
|
||||
ServiceProviderProxy.Init(ws, serviceId);
|
||||
return ws;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Result object routines
|
||||
private static T Warning<T>(params string[] messageParts)
|
||||
{
|
||||
return Warning<T>(null, messageParts);
|
||||
}
|
||||
|
||||
private static T Warning<T>(ResultObject innerResult, params string[] messageParts)
|
||||
{
|
||||
return Result<T>(innerResult, false, messageParts);
|
||||
}
|
||||
|
||||
private static T Error<T>(params string[] messageParts)
|
||||
{
|
||||
return Error<T>(null, messageParts);
|
||||
}
|
||||
|
||||
private static T Error<T>(ResultObject innerResult, params string[] messageParts)
|
||||
{
|
||||
return Result<T>(innerResult, true, messageParts);
|
||||
}
|
||||
|
||||
private static T Result<T>(ResultObject innerResult, bool isError, params string[] messageParts)
|
||||
{
|
||||
object obj = Activator.CreateInstance<T>();
|
||||
ResultObject result = (ResultObject)obj;
|
||||
|
||||
// set error
|
||||
result.IsSuccess = !isError;
|
||||
|
||||
// add message
|
||||
if (messageParts != null)
|
||||
result.ErrorCodes.Add(String.Join(":", messageParts));
|
||||
|
||||
// copy errors from inner result
|
||||
if (innerResult != null)
|
||||
result.ErrorCodes.AddRange(innerResult.ErrorCodes);
|
||||
|
||||
return (T)obj;
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
File diff suppressed because it is too large
Load diff
|
@ -0,0 +1,916 @@
|
|||
// Copyright (c) 2011, 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.Threading;
|
||||
using System.IO;
|
||||
using System.Data;
|
||||
using System.Collections.Specialized;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Web;
|
||||
|
||||
using WebsitePanel.Providers;
|
||||
using OS = WebsitePanel.Providers.OS;
|
||||
using WebsitePanel.Providers.OS;
|
||||
using WebsitePanel.Providers.Web;
|
||||
|
||||
namespace WebsitePanel.EnterpriseServer
|
||||
{
|
||||
public class FilesController
|
||||
{
|
||||
public static OS.OperatingSystem GetOS(int packageId)
|
||||
{
|
||||
int sid = PackageController.GetPackageServiceId(packageId, ResourceGroups.Os);
|
||||
if (sid <= 0)
|
||||
return null;
|
||||
|
||||
OS.OperatingSystem os = new OS.OperatingSystem();
|
||||
ServiceProviderProxy.Init(os, sid);
|
||||
|
||||
return os;
|
||||
}
|
||||
|
||||
public static string GetHomeFolder(int packageId)
|
||||
{
|
||||
// check context
|
||||
string key = "HomeFolder" + packageId.ToString();
|
||||
if (HttpContext.Current != null && HttpContext.Current.Items[key] != null)
|
||||
return (string)HttpContext.Current.Items[key];
|
||||
|
||||
List<ServiceProviderItem> items = PackageController.GetPackageItemsByType(packageId, typeof(HomeFolder));
|
||||
string path = (items.Count > 0) ? items[0].Name : null;
|
||||
|
||||
// place to context
|
||||
if (HttpContext.Current != null)
|
||||
HttpContext.Current.Items[key] = path;
|
||||
|
||||
return path;
|
||||
}
|
||||
|
||||
public static string GetFullPackagePath(int packageId, string path)
|
||||
{
|
||||
string homeFolder = GetHomeFolder(packageId);
|
||||
string correctedPath = CorrectRelativePath(path);
|
||||
return Path.Combine(homeFolder, correctedPath);
|
||||
}
|
||||
|
||||
public static string GetFullUncPackagePath(int packageId, int serviceId, string path)
|
||||
{
|
||||
return ConvertToUncPath(serviceId, GetFullPackagePath(packageId, path));
|
||||
}
|
||||
|
||||
public static string GetVirtualPackagePath(int packageId, string fullPath)
|
||||
{
|
||||
if (String.IsNullOrEmpty(fullPath))
|
||||
return fullPath;
|
||||
|
||||
// check for UNC
|
||||
int signIdx = fullPath.IndexOf("$");
|
||||
if (signIdx > -1)
|
||||
{
|
||||
fullPath = fullPath.Substring(signIdx - 1).Replace("$", ":");
|
||||
}
|
||||
|
||||
string homeFolder = GetHomeFolder(packageId);
|
||||
string path = "\\";
|
||||
if(fullPath.Length >= homeFolder.Length)
|
||||
path = fullPath.Substring(homeFolder.Length);
|
||||
if (path == "")
|
||||
path = "\\";
|
||||
return path;
|
||||
}
|
||||
|
||||
public static string CorrectRelativePath(string relativePath)
|
||||
{
|
||||
// clean path
|
||||
string correctedPath = Regex.Replace(relativePath.Replace("/", "\\"),
|
||||
@"\.\\|\.\.|\\\\|\?|\:|\""|\<|\>|\||%|\$", "");
|
||||
if (correctedPath.StartsWith("\\"))
|
||||
correctedPath = correctedPath.Substring(1);
|
||||
return correctedPath;
|
||||
}
|
||||
|
||||
public static List<SystemFile> GetFiles(int packageId, string path, bool includeFiles)
|
||||
{
|
||||
OS.OperatingSystem os = GetOS(packageId);
|
||||
|
||||
string fullPath = GetFullPackagePath(packageId, path);
|
||||
List<SystemFile> filteredFiles = new List<SystemFile>();
|
||||
SystemFile[] files = os.GetFiles(fullPath);
|
||||
|
||||
foreach (SystemFile file in files)
|
||||
{
|
||||
if (file.IsDirectory || includeFiles)
|
||||
filteredFiles.Add(file);
|
||||
}
|
||||
|
||||
return filteredFiles;
|
||||
}
|
||||
|
||||
public static List<SystemFile> GetFilesByMask(int packageId, string path, string filesMask)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
public static byte[] GetFileBinaryContent(int packageId, string path)
|
||||
{
|
||||
OS.OperatingSystem os = GetOS(packageId);
|
||||
string fullPath = GetFullPackagePath(packageId, path);
|
||||
|
||||
// create file
|
||||
return os.GetFileBinaryContent(fullPath);
|
||||
}
|
||||
|
||||
public static byte[] GetFileBinaryContentUsingEncoding(int packageId, string path, string encoding)
|
||||
{
|
||||
OS.OperatingSystem os = GetOS(packageId);
|
||||
string fullPath = GetFullPackagePath(packageId, path);
|
||||
|
||||
// create file
|
||||
return os.GetFileBinaryContentUsingEncoding(fullPath, encoding);
|
||||
}
|
||||
|
||||
public static int UpdateFileBinaryContent(int packageId, string path, byte[] content)
|
||||
{
|
||||
|
||||
// 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", "UPDATE_BINARY_CONTENT", path);
|
||||
TaskManager.ItemId = packageId;
|
||||
|
||||
try
|
||||
{
|
||||
OS.OperatingSystem os = GetOS(packageId);
|
||||
string fullPath = GetFullPackagePath(packageId, path);
|
||||
|
||||
// create file
|
||||
os.UpdateFileBinaryContent(fullPath, content);
|
||||
|
||||
return 0;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw TaskManager.WriteError(ex);
|
||||
}
|
||||
finally
|
||||
{
|
||||
TaskManager.CompleteTask();
|
||||
}
|
||||
}
|
||||
|
||||
public static int UpdateFileBinaryContentUsingEncoding(int packageId, string path, byte[] content, string encoding)
|
||||
{
|
||||
|
||||
// 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", "UPDATE_BINARY_CONTENT", path);
|
||||
TaskManager.ItemId = packageId;
|
||||
|
||||
try
|
||||
{
|
||||
OS.OperatingSystem os = GetOS(packageId);
|
||||
string fullPath = GetFullPackagePath(packageId, path);
|
||||
|
||||
// create file
|
||||
os.UpdateFileBinaryContentUsingEncoding(fullPath, content, encoding);
|
||||
|
||||
return 0;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw TaskManager.WriteError(ex);
|
||||
}
|
||||
finally
|
||||
{
|
||||
TaskManager.CompleteTask();
|
||||
}
|
||||
}
|
||||
|
||||
public static byte[] GetFileBinaryChunk(int packageId, string path, int offset, int length)
|
||||
{
|
||||
OS.OperatingSystem os = GetOS(packageId);
|
||||
string fullPath = GetFullPackagePath(packageId, path);
|
||||
|
||||
return os.GetFileBinaryChunk(fullPath, offset, length);
|
||||
}
|
||||
|
||||
public static int AppendFileBinaryChunk(int packageId, string path, byte[] chunk)
|
||||
{
|
||||
// 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;
|
||||
|
||||
OS.OperatingSystem os = GetOS(packageId);
|
||||
string fullPath = GetFullPackagePath(packageId, path);
|
||||
|
||||
os.AppendFileBinaryContent(fullPath, chunk);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
public static int DeleteFiles(int packageId, string[] files)
|
||||
{
|
||||
// check account
|
||||
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo);
|
||||
if (accountCheck < 0) return accountCheck;
|
||||
|
||||
// place log record
|
||||
TaskManager.StartTask("FILES", "DELETE_FILES");
|
||||
TaskManager.ItemId = packageId;
|
||||
if (files != null)
|
||||
{
|
||||
foreach (string file in files)
|
||||
TaskManager.Write(file);
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
OS.OperatingSystem os = GetOS(packageId);
|
||||
for (int i = 0; i < files.Length; i++)
|
||||
files[i] = GetFullPackagePath(packageId, files[i]);
|
||||
|
||||
// delete files
|
||||
os.DeleteFiles(files);
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
public static int CreateFile(int packageId, string path)
|
||||
{
|
||||
// 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", "CREATE_FILE", path);
|
||||
TaskManager.ItemId = packageId;
|
||||
|
||||
try
|
||||
{
|
||||
OS.OperatingSystem os = GetOS(packageId);
|
||||
string fullPath = GetFullPackagePath(packageId, path);
|
||||
|
||||
// cannot create a file with the same name as a directory
|
||||
if (os.DirectoryExists(fullPath))
|
||||
return BusinessErrorCodes.ERROR_FILE_CREATE_FILE_WITH_DIR_NAME;
|
||||
|
||||
// create file
|
||||
os.CreateFile(fullPath);
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
public static bool FileExists(int packageId, string path)
|
||||
{
|
||||
OS.OperatingSystem os = GetOS(packageId);
|
||||
string fullPath = GetFullPackagePath(packageId, path);
|
||||
return os.FileExists(fullPath);
|
||||
}
|
||||
|
||||
public static bool DirectoryExists(int packageId, string path)
|
||||
{
|
||||
OS.OperatingSystem os = GetOS(packageId);
|
||||
string fullPath = GetFullPackagePath(packageId, path);
|
||||
return os.DirectoryExists(fullPath);
|
||||
}
|
||||
|
||||
public static int CreateFolder(int packageId, string path)
|
||||
{
|
||||
// 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", "CREATE_FOLDER", path);
|
||||
TaskManager.ItemId = packageId;
|
||||
|
||||
try
|
||||
{
|
||||
|
||||
OS.OperatingSystem os = GetOS(packageId);
|
||||
string fullPath = GetFullPackagePath(packageId, path);
|
||||
|
||||
// create folder
|
||||
os.CreateDirectory(fullPath);
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
public static int CopyFiles(int packageId, string[] files, string destFolder)
|
||||
{
|
||||
// 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;
|
||||
|
||||
// check dest folder exists
|
||||
if (!DirectoryExists(packageId, destFolder)) return BusinessErrorCodes.ERROR_FILE_DEST_FOLDER_NONEXISTENT;
|
||||
|
||||
// place log record
|
||||
TaskManager.StartTask("FILES", "COPY_FILES");
|
||||
TaskManager.ItemId = packageId;
|
||||
TaskManager.WriteParameter("Destination folder", destFolder);
|
||||
if (files != null)
|
||||
{
|
||||
foreach (string file in files)
|
||||
TaskManager.Write(file);
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
OS.OperatingSystem os = GetOS(packageId);
|
||||
string destFullFolder = GetFullPackagePath(packageId, destFolder);
|
||||
|
||||
for (int i = 0; i < files.Length; i++)
|
||||
{
|
||||
string srcFilePath = GetFullPackagePath(packageId, files[i]);
|
||||
string destFilePath = Path.Combine(destFullFolder,
|
||||
srcFilePath.Substring(srcFilePath.LastIndexOf("\\") + 1));
|
||||
|
||||
if (srcFilePath == destFilePath)
|
||||
{
|
||||
return BusinessErrorCodes.ERROR_FILE_COPY_TO_SELF;
|
||||
}
|
||||
//Check that we're not trying to copy a folder into its own subfolder
|
||||
else if (destFilePath.StartsWith(srcFilePath + "\\"))
|
||||
{
|
||||
return BusinessErrorCodes.ERROR_FILE_COPY_TO_OWN_SUBFOLDER;
|
||||
}
|
||||
else
|
||||
{
|
||||
os.CopyFile(srcFilePath, destFilePath);
|
||||
}
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
public static int MoveFiles(int packageId, string[] files, string destFolder)
|
||||
{
|
||||
// check account
|
||||
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo);
|
||||
if (accountCheck < 0) return accountCheck;
|
||||
|
||||
// check dest folder exists
|
||||
if (!DirectoryExists(packageId, destFolder)) return BusinessErrorCodes.ERROR_FILE_DEST_FOLDER_NONEXISTENT;
|
||||
|
||||
// place log record
|
||||
TaskManager.StartTask("FILES", "MOVE_FILES");
|
||||
TaskManager.ItemId = packageId;
|
||||
TaskManager.WriteParameter("Destination folder", destFolder);
|
||||
if (files != null)
|
||||
{
|
||||
foreach (string file in files)
|
||||
TaskManager.Write(file);
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
OS.OperatingSystem os = GetOS(packageId);
|
||||
string destFullFolder = GetFullPackagePath(packageId, destFolder);
|
||||
|
||||
for (int i = 0; i < files.Length; i++)
|
||||
{
|
||||
string srcFilePath = GetFullPackagePath(packageId, files[i]);
|
||||
string destFilePath = Path.Combine(destFullFolder,
|
||||
srcFilePath.Substring(srcFilePath.LastIndexOf("\\") + 1));
|
||||
if (srcFilePath == destFilePath)
|
||||
{
|
||||
return BusinessErrorCodes.ERROR_FILE_COPY_TO_SELF;
|
||||
}
|
||||
//Check that we're not trying to copy a folder into its own subfolder
|
||||
else if (destFilePath.StartsWith(srcFilePath + "\\"))
|
||||
{
|
||||
return BusinessErrorCodes.ERROR_FILE_COPY_TO_OWN_SUBFOLDER;
|
||||
}
|
||||
else if (os.FileExists(destFilePath) || os.DirectoryExists(destFilePath))
|
||||
{
|
||||
return BusinessErrorCodes.ERROR_FILE_MOVE_PATH_ALREADY_EXISTS;
|
||||
}
|
||||
else
|
||||
{
|
||||
os.MoveFile(srcFilePath, destFilePath);
|
||||
}
|
||||
}
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
public static int RenameFile(int packageId, string oldPath, string newPath)
|
||||
{
|
||||
// check account
|
||||
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo);
|
||||
if (accountCheck < 0) return accountCheck;
|
||||
|
||||
// place log record
|
||||
TaskManager.StartTask("FILES", "RENAME_FILE", oldPath);
|
||||
TaskManager.ItemId = packageId;
|
||||
TaskManager.WriteParameter("New name", newPath);
|
||||
|
||||
try
|
||||
{
|
||||
OS.OperatingSystem os = GetOS(packageId);
|
||||
string oldFullPath = GetFullPackagePath(packageId, oldPath);
|
||||
string destFullPath = GetFullPackagePath(packageId, newPath);
|
||||
|
||||
os.MoveFile(oldFullPath, destFullPath);
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
public static string[] UnzipFiles(int packageId, string[] files)
|
||||
{
|
||||
// check account
|
||||
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive);
|
||||
if (accountCheck < 0) return null;
|
||||
|
||||
// check package
|
||||
int packageCheck = SecurityContext.CheckPackage(packageId, DemandPackage.IsActive);
|
||||
if (packageCheck < 0) return null;
|
||||
|
||||
// place log record
|
||||
TaskManager.StartTask("FILES", "UNZIP_FILES");
|
||||
TaskManager.ItemId = packageId;
|
||||
if (files != null)
|
||||
{
|
||||
foreach (string file in files)
|
||||
TaskManager.Write(file);
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
|
||||
List<string> unzippedFiles = new List<string>();
|
||||
|
||||
OS.OperatingSystem os = GetOS(packageId);
|
||||
|
||||
for (int i = 0; i < files.Length; i++)
|
||||
{
|
||||
string zipFilePath = GetFullPackagePath(packageId, files[i]);
|
||||
string destFolderPath = zipFilePath.Substring(0, zipFilePath.LastIndexOf("\\"));
|
||||
unzippedFiles.AddRange(os.UnzipFiles(zipFilePath, destFolderPath));
|
||||
}
|
||||
|
||||
return unzippedFiles.ToArray();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw TaskManager.WriteError(ex);
|
||||
}
|
||||
finally
|
||||
{
|
||||
TaskManager.CompleteTask();
|
||||
}
|
||||
}
|
||||
|
||||
public static int ZipFiles(int packageId, string[] files, string archivePath)
|
||||
{
|
||||
// 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", "ZIP_FILES", archivePath);
|
||||
TaskManager.ItemId = packageId;
|
||||
if (files != null)
|
||||
{
|
||||
foreach (string file in files)
|
||||
TaskManager.Write(file);
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
|
||||
OS.OperatingSystem os = GetOS(packageId);
|
||||
string zipFilePath = GetFullPackagePath(packageId, archivePath);
|
||||
|
||||
List<string> archFiles = new List<string>();
|
||||
string rootFolder = "";
|
||||
foreach (string file in files)
|
||||
{
|
||||
string archFile = GetFullPackagePath(packageId, file);
|
||||
int idx = archFile.LastIndexOf("\\");
|
||||
rootFolder = archFile.Substring(0, idx);
|
||||
archFiles.Add(archFile.Substring(idx + 1));
|
||||
}
|
||||
|
||||
os.ZipFiles(zipFilePath, rootFolder, archFiles.ToArray());
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
public static int ZipRemoteFiles(int packageId, string rootFolder, string[] files, string archivePath)
|
||||
{
|
||||
// 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", "ZIP_FILES", archivePath);
|
||||
TaskManager.ItemId = packageId;
|
||||
if (files != null)
|
||||
{
|
||||
foreach (string file in files)
|
||||
TaskManager.Write(file);
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
|
||||
OS.OperatingSystem os = GetOS(packageId);
|
||||
string zipFilePath = GetFullPackagePath(packageId, archivePath);
|
||||
|
||||
List<string> archFiles = new List<string>();
|
||||
string root = String.IsNullOrEmpty(rootFolder) ? "" : GetFullPackagePath(packageId, rootFolder);
|
||||
foreach (string file in files)
|
||||
{
|
||||
string archFile = GetFullPackagePath(packageId, file);
|
||||
if (!String.IsNullOrEmpty(rootFolder))
|
||||
{
|
||||
|
||||
archFiles.Add(archFile.Substring(root.Length + 1));
|
||||
}
|
||||
else
|
||||
{
|
||||
int idx = archFile.LastIndexOf("\\");
|
||||
root = archFile.Substring(0, idx);
|
||||
archFiles.Add(archFile.Substring(idx + 1));
|
||||
}
|
||||
}
|
||||
|
||||
os.ZipFiles(zipFilePath, root, archFiles.ToArray());
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
public static int CreateAccessDatabase(int packageId, string dbPath)
|
||||
{
|
||||
// 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", "CREATE_ACCESS_DATABASE", dbPath);
|
||||
TaskManager.ItemId = packageId;
|
||||
|
||||
try
|
||||
{
|
||||
OS.OperatingSystem os = GetOS(packageId);
|
||||
string fullPath = GetFullPackagePath(packageId, dbPath);
|
||||
|
||||
os.CreateAccessDatabase(fullPath);
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
||||
public static int CalculatePackageDiskspace(int packageId)
|
||||
{
|
||||
// check account
|
||||
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo);
|
||||
if (accountCheck < 0) return accountCheck;
|
||||
|
||||
// place log record
|
||||
TaskManager.StartTask("SPACE", "CALCULATE_DISKSPACE");
|
||||
TaskManager.ItemId = packageId;
|
||||
|
||||
try
|
||||
{
|
||||
// create thread parameters
|
||||
ThreadStartParameters prms = new ThreadStartParameters();
|
||||
prms.UserId = SecurityContext.User.UserId;
|
||||
prms.Parameters = new object[] { packageId };
|
||||
|
||||
Thread t = new Thread(new ParameterizedThreadStart(CalculatePackageDiskspaceAsync));
|
||||
t.Start(prms);
|
||||
return 0;
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw TaskManager.WriteError(ex);
|
||||
}
|
||||
finally
|
||||
{
|
||||
TaskManager.CompleteTask();
|
||||
}
|
||||
}
|
||||
|
||||
private static void CalculatePackageDiskspaceAsync(object objPrms)
|
||||
{
|
||||
ThreadStartParameters prms = (ThreadStartParameters)objPrms;
|
||||
|
||||
// impersonate thread
|
||||
SecurityContext.SetThreadPrincipal(prms.UserId);
|
||||
|
||||
int packageId = (int)prms.Parameters[0];
|
||||
try
|
||||
{
|
||||
// calculate
|
||||
CalculatePackagesDiskspaceTask calc = new CalculatePackagesDiskspaceTask();
|
||||
calc.CalculatePackage(packageId);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
// write to audit log
|
||||
TaskManager.WriteError(ex);
|
||||
}
|
||||
}
|
||||
|
||||
public static UserPermission[] GetFilePermissions(int packageId, string path)
|
||||
{
|
||||
try
|
||||
{
|
||||
// get all accounts
|
||||
UserPermission[] users = GetAvailableSecurityAccounts(packageId);
|
||||
|
||||
OS.OperatingSystem os = GetOS(packageId);
|
||||
string fullPath = GetFullPackagePath(packageId, path);
|
||||
|
||||
// get users OU defined on web server
|
||||
string usersOU = WebServerController.GetWebUsersOU(packageId);
|
||||
|
||||
users = os.GetGroupNtfsPermissions(fullPath, users, usersOU);
|
||||
|
||||
return users;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw TaskManager.WriteError(ex);
|
||||
}
|
||||
}
|
||||
|
||||
public static int SetFilePermissions(int packageId, string path, UserPermission[] users, bool resetChildPermissions)
|
||||
{
|
||||
// check account
|
||||
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive);
|
||||
if (accountCheck < 0) return accountCheck;
|
||||
|
||||
// place log record
|
||||
TaskManager.StartTask("FILES", "SET_PERMISSIONS", path);
|
||||
TaskManager.ItemId = packageId;
|
||||
|
||||
try
|
||||
{
|
||||
OS.OperatingSystem os = GetOS(packageId);
|
||||
string fullPath = GetFullPackagePath(packageId, path);
|
||||
|
||||
// get users OU defined on web server
|
||||
string usersOU = WebServerController.GetWebUsersOU(packageId);
|
||||
|
||||
os.GrantGroupNtfsPermissions(fullPath, users, usersOU, resetChildPermissions);
|
||||
|
||||
return 0;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw TaskManager.WriteError(ex);
|
||||
}
|
||||
finally
|
||||
{
|
||||
TaskManager.CompleteTask();
|
||||
}
|
||||
}
|
||||
|
||||
// Synchronizing
|
||||
public static FolderGraph GetFolderGraph(int packageId, string path)
|
||||
{
|
||||
OS.OperatingSystem os = GetOS(packageId);
|
||||
string fullPath = GetFullPackagePath(packageId, path);
|
||||
|
||||
// get graph
|
||||
return os.GetFolderGraph(fullPath);
|
||||
}
|
||||
|
||||
public static void ExecuteSyncActions(int packageId, FileSyncAction[] actions)
|
||||
{
|
||||
// check account
|
||||
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive);
|
||||
if (accountCheck < 0) return;
|
||||
|
||||
OS.OperatingSystem os = GetOS(packageId);
|
||||
|
||||
// update actions
|
||||
foreach (FileSyncAction action in actions)
|
||||
{
|
||||
if (!String.IsNullOrEmpty(action.SrcPath))
|
||||
action.SrcPath = GetFullPackagePath(packageId, action.SrcPath);
|
||||
if (!String.IsNullOrEmpty(action.DestPath))
|
||||
action.DestPath = GetFullPackagePath(packageId, action.DestPath);
|
||||
}
|
||||
|
||||
// perform sync
|
||||
os.ExecuteSyncActions(actions);
|
||||
}
|
||||
|
||||
public static string ConvertToUncPath(int serviceId, string path)
|
||||
{
|
||||
// load web service info
|
||||
ServiceInfo svc = ServerController.GetServiceInfo(serviceId);
|
||||
// load web server info
|
||||
ServerInfo srv = ServerController.GetServerByIdInternal(svc.ServerId);
|
||||
|
||||
return "\\\\" + srv.ServerName + "\\" + path.Replace(":", "$");
|
||||
}
|
||||
|
||||
private static UserPermission[] GetAvailableSecurityAccounts(int packageId)
|
||||
{
|
||||
List<UserPermission> users = new List<UserPermission>();
|
||||
|
||||
// all web sites
|
||||
List<WebSite> sites = WebServerController.GetWebSites(packageId, false);
|
||||
int webServiceId = PackageController.GetPackageServiceId(packageId, ResourceGroups.Web);
|
||||
if (webServiceId > 0)
|
||||
{
|
||||
List<string> siteIds = new List<string>();
|
||||
foreach (WebSite site in sites)
|
||||
siteIds.Add(site.SiteId);
|
||||
|
||||
WebServer web = WebServerController.GetWebServer(webServiceId);
|
||||
string[] siteAccounts = web.GetSitesAccounts(siteIds.ToArray());
|
||||
|
||||
for (int i = 0; i < sites.Count; i++)
|
||||
{
|
||||
UserPermission user = new UserPermission();
|
||||
user.DisplayName = sites[i].Name;
|
||||
user.AccountName = siteAccounts[i];
|
||||
users.Add(user);
|
||||
}
|
||||
}
|
||||
|
||||
// add "network service"
|
||||
UserPermission ns = new UserPermission();
|
||||
ns.DisplayName = "NETWORK SERVICE";
|
||||
ns.AccountName = "NETWORK SERVICE";
|
||||
users.Add(ns);
|
||||
|
||||
return users.ToArray();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,416 @@
|
|||
// Copyright (c) 2011, 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.Data;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.Specialized;
|
||||
using System.Text;
|
||||
using System.Xml;
|
||||
using System.Xml.Serialization;
|
||||
|
||||
using WebsitePanel.Providers;
|
||||
using WebsitePanel.Providers.FTP;
|
||||
|
||||
namespace WebsitePanel.EnterpriseServer
|
||||
{
|
||||
public class FtpServerController : IImportController, IBackupController
|
||||
{
|
||||
public static FTPServer GetFTPServer(int serviceId)
|
||||
{
|
||||
FTPServer ftp = new FTPServer();
|
||||
ServiceProviderProxy.Init(ftp, serviceId);
|
||||
return ftp;
|
||||
}
|
||||
|
||||
public static FtpSite[] GetFtpSites(int serviceId)
|
||||
{
|
||||
FTPServer ftp = new FTPServer();
|
||||
ServiceProviderProxy.Init(ftp, serviceId);
|
||||
return ftp.GetSites();
|
||||
}
|
||||
|
||||
public static DataSet GetRawFtpAccountsPaged(int packageId,
|
||||
string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows)
|
||||
{
|
||||
return PackageController.GetRawPackageItemsPaged(packageId, typeof(FtpAccount),
|
||||
true, filterColumn, filterValue, sortColumn, startRow, maximumRows);
|
||||
}
|
||||
|
||||
public static List<FtpAccount> GetFtpAccounts(int packageId, bool recursive)
|
||||
{
|
||||
List<ServiceProviderItem> items = PackageController.GetPackageItemsByType(
|
||||
packageId, typeof(FtpAccount), recursive);
|
||||
|
||||
return items.ConvertAll<FtpAccount>(
|
||||
new Converter<ServiceProviderItem, FtpAccount>(ConvertItemToFtpAccount));
|
||||
}
|
||||
|
||||
private static FtpAccount ConvertItemToFtpAccount(ServiceProviderItem item)
|
||||
{
|
||||
FtpAccount account = (FtpAccount)item;
|
||||
|
||||
string homeFolder = FilesController.GetHomeFolder(account.PackageId);
|
||||
if(!String.IsNullOrEmpty(account.Folder) && account.Folder.IndexOf(":") != -1)
|
||||
account.Folder = account.Folder.Substring(homeFolder.Length);
|
||||
account.Folder = (account.Folder == "") ? "\\" : account.Folder;
|
||||
|
||||
// decode password
|
||||
account.Password = CryptoUtils.Decrypt(account.Password);
|
||||
|
||||
return account;
|
||||
}
|
||||
|
||||
public static bool FtpAccountExists(string name)
|
||||
{
|
||||
return PackageController.CheckServiceItemExists(name, typeof(FtpAccount));
|
||||
}
|
||||
|
||||
public static bool FtpAccountExists(int serviceId, string name)
|
||||
{
|
||||
return PackageController.CheckServiceItemExists(serviceId, name, typeof(FtpAccount));
|
||||
}
|
||||
|
||||
public static FtpAccount GetFtpAccount(int itemId)
|
||||
{
|
||||
// load meta item
|
||||
FtpAccount item = (FtpAccount)PackageController.GetPackageItem(itemId);
|
||||
|
||||
// load service item
|
||||
FTPServer ftp = new FTPServer();
|
||||
ServiceProviderProxy.Init(ftp, item.ServiceId);
|
||||
FtpAccount account = ftp.GetAccount(item.Name);
|
||||
|
||||
// truncate home folder
|
||||
account.Folder = FilesController.GetVirtualPackagePath(item.PackageId, account.Folder);
|
||||
|
||||
account.Id = item.Id;
|
||||
account.PackageId = item.PackageId;
|
||||
account.ServiceId = item.ServiceId;
|
||||
account.Password = CryptoUtils.Decrypt(item.Password);
|
||||
|
||||
return account;
|
||||
}
|
||||
|
||||
public static int AddFtpAccount(FtpAccount item)
|
||||
{
|
||||
// check account
|
||||
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive);
|
||||
if (accountCheck < 0) return accountCheck;
|
||||
|
||||
// check package
|
||||
int packageCheck = SecurityContext.CheckPackage(item.PackageId, DemandPackage.IsActive);
|
||||
if (packageCheck < 0) return packageCheck;
|
||||
|
||||
// check quota
|
||||
QuotaValueInfo quota = PackageController.GetPackageQuota(item.PackageId, Quotas.FTP_ACCOUNTS);
|
||||
if (quota.QuotaExhausted)
|
||||
return BusinessErrorCodes.ERROR_FTP_RESOURCE_QUOTA_LIMIT;
|
||||
|
||||
// check if FTP account already exists
|
||||
int serviceId = PackageController.GetPackageServiceId(item.PackageId, ResourceGroups.Ftp);
|
||||
if(serviceId == 0)
|
||||
return BusinessErrorCodes.ERROR_FTP_RESOURCE_UNAVAILABLE;
|
||||
|
||||
// place log record
|
||||
TaskManager.StartTask("FTP_ACCOUNT", "ADD", item.Name);
|
||||
TaskManager.WriteParameter("Folder", item.Folder);
|
||||
TaskManager.WriteParameter("CanRead", item.CanRead);
|
||||
TaskManager.WriteParameter("CanWrite", item.CanWrite);
|
||||
|
||||
|
||||
try
|
||||
{
|
||||
// check package items
|
||||
if (PackageController.GetPackageItemByName(item.PackageId, item.Name, typeof(FtpAccount)) != null)
|
||||
return BusinessErrorCodes.ERROR_FTP_PACKAGE_ITEM_EXISTS;
|
||||
|
||||
// check service items
|
||||
FTPServer ftp = new FTPServer();
|
||||
ServiceProviderProxy.Init(ftp, serviceId);
|
||||
if (ftp.AccountExists(item.Name))
|
||||
return BusinessErrorCodes.ERROR_FTP_SERVICE_ITEM_EXISTS;
|
||||
|
||||
// store original path
|
||||
string origFolder = item.Folder;
|
||||
|
||||
// convert folder
|
||||
StringDictionary ftpSettings = ServerController.GetServiceSettings(serviceId);
|
||||
if (Utils.ParseBool(ftpSettings["BuildUncFilesPath"], false))
|
||||
{
|
||||
// UNC
|
||||
// get OS service
|
||||
int osServiceId = PackageController.GetPackageServiceId(item.PackageId, ResourceGroups.Os);
|
||||
item.Folder = FilesController.GetFullUncPackagePath(item.PackageId, osServiceId, item.Folder);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Absolute
|
||||
item.Folder = FilesController.GetFullPackagePath(item.PackageId, item.Folder);
|
||||
}
|
||||
|
||||
item.Enabled = true;
|
||||
|
||||
// add service item
|
||||
ftp.CreateAccount(item);
|
||||
|
||||
// save item
|
||||
item.Password = CryptoUtils.Encrypt(item.Password);
|
||||
item.ServiceId = serviceId;
|
||||
item.Folder = (origFolder == "") ? "\\" : origFolder;
|
||||
int itemId = PackageController.AddPackageItem(item);
|
||||
TaskManager.ItemId = itemId;
|
||||
return itemId;
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.WriteError(ex);
|
||||
throw;
|
||||
}
|
||||
finally
|
||||
{
|
||||
TaskManager.CompleteTask();
|
||||
}
|
||||
}
|
||||
|
||||
public static int UpdateFtpAccount(FtpAccount item)
|
||||
{
|
||||
// check account
|
||||
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive);
|
||||
if (accountCheck < 0) return accountCheck;
|
||||
|
||||
// load original meta item
|
||||
FtpAccount origItem = (FtpAccount)PackageController.GetPackageItem(item.Id);
|
||||
if (origItem == null)
|
||||
return BusinessErrorCodes.ERROR_FTP_PACKAGE_ITEM_NOT_FOUND;
|
||||
|
||||
// check package
|
||||
int packageCheck = SecurityContext.CheckPackage(origItem.PackageId, DemandPackage.IsActive);
|
||||
if (packageCheck < 0) return packageCheck;
|
||||
|
||||
// place log record
|
||||
TaskManager.StartTask("FTP_ACCOUNT", "UPDATE", origItem.Name);
|
||||
TaskManager.ItemId = item.Id;
|
||||
TaskManager.WriteParameter("Folder", item.Folder);
|
||||
TaskManager.WriteParameter("CanRead", item.CanRead);
|
||||
TaskManager.WriteParameter("CanWrite", item.CanWrite);
|
||||
|
||||
try
|
||||
{
|
||||
// get service
|
||||
FTPServer ftp = new FTPServer();
|
||||
ServiceProviderProxy.Init(ftp, origItem.ServiceId);
|
||||
|
||||
// store original folder
|
||||
string origFolder = item.Folder;
|
||||
|
||||
// convert folder
|
||||
StringDictionary ftpSettings = ServerController.GetServiceSettings(origItem.ServiceId);
|
||||
if (Utils.ParseBool(ftpSettings["BuildUncFilesPath"], false))
|
||||
{
|
||||
// UNC
|
||||
// get OS service
|
||||
int osServiceId = PackageController.GetPackageServiceId(origItem.PackageId, ResourceGroups.Os);
|
||||
item.Folder = FilesController.GetFullUncPackagePath(origItem.PackageId, osServiceId, item.Folder);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Absolute
|
||||
item.Folder = FilesController.GetFullPackagePath(origItem.PackageId, item.Folder);
|
||||
}
|
||||
|
||||
item.Enabled = true;
|
||||
|
||||
// add service item
|
||||
ftp.UpdateAccount(item);
|
||||
|
||||
// save item
|
||||
item.Password = String.IsNullOrEmpty(item.Password) ? origItem.Password : CryptoUtils.Encrypt(item.Password);
|
||||
item.Folder = (origFolder == "") ? "\\" : origFolder;
|
||||
PackageController.UpdatePackageItem(item);
|
||||
|
||||
return 0;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw TaskManager.WriteError(ex);
|
||||
}
|
||||
finally
|
||||
{
|
||||
TaskManager.CompleteTask();
|
||||
}
|
||||
}
|
||||
|
||||
public static int DeleteFtpAccount(int itemId)
|
||||
{
|
||||
// check account
|
||||
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo);
|
||||
if (accountCheck < 0) return accountCheck;
|
||||
|
||||
// load original meta item
|
||||
FtpAccount origItem = (FtpAccount)PackageController.GetPackageItem(itemId);
|
||||
if (origItem == null)
|
||||
return BusinessErrorCodes.ERROR_FTP_PACKAGE_ITEM_NOT_FOUND;
|
||||
|
||||
// place log record
|
||||
TaskManager.StartTask("FTP_ACCOUNT", "DELETE", origItem.Name);
|
||||
TaskManager.ItemId = itemId;
|
||||
|
||||
try
|
||||
{
|
||||
// get service
|
||||
FTPServer ftp = new FTPServer();
|
||||
ServiceProviderProxy.Init(ftp, origItem.ServiceId);
|
||||
|
||||
// delete service item
|
||||
ftp.DeleteAccount(origItem.Name);
|
||||
|
||||
// delete meta item
|
||||
PackageController.DeletePackageItem(origItem.Id);
|
||||
|
||||
return 0;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw TaskManager.WriteError(ex);
|
||||
}
|
||||
finally
|
||||
{
|
||||
TaskManager.CompleteTask();
|
||||
}
|
||||
}
|
||||
|
||||
#region IImportController Members
|
||||
|
||||
public List<string> GetImportableItems(int packageId, int itemTypeId, Type itemType, ResourceGroupInfo group)
|
||||
{
|
||||
List<string> items = new List<string>();
|
||||
|
||||
// get service id
|
||||
int serviceId = PackageController.GetPackageServiceId(packageId, group.GroupName);
|
||||
if (serviceId == 0)
|
||||
return items;
|
||||
|
||||
// FTP provider
|
||||
FTPServer ftp = new FTPServer();
|
||||
ServiceProviderProxy.Init(ftp, serviceId);
|
||||
|
||||
FtpAccount[] accounts = ftp.GetAccounts();
|
||||
|
||||
foreach (FtpAccount account in accounts)
|
||||
items.Add(account.Name);
|
||||
|
||||
return items;
|
||||
}
|
||||
|
||||
public void ImportItem(int packageId, int itemTypeId,
|
||||
Type itemType, ResourceGroupInfo group, string itemName)
|
||||
{
|
||||
// get service id
|
||||
int serviceId = PackageController.GetPackageServiceId(packageId, group.GroupName);
|
||||
if (serviceId == 0)
|
||||
return;
|
||||
|
||||
// FTP provider
|
||||
FTPServer ftp = new FTPServer();
|
||||
ServiceProviderProxy.Init(ftp, serviceId);
|
||||
|
||||
if (itemType == typeof(FtpAccount))
|
||||
{
|
||||
// load FTP account
|
||||
FtpAccount account = ftp.GetAccount(itemName);
|
||||
account.Folder = FilesController.GetFullPackagePath(packageId, "\\"); // root space folder
|
||||
|
||||
// update FTP account
|
||||
ftp.UpdateAccount(account);
|
||||
|
||||
// save account
|
||||
account.ServiceId = serviceId;
|
||||
account.PackageId = packageId;
|
||||
PackageController.AddPackageItem(account);
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region IBackupController Members
|
||||
|
||||
public int BackupItem(string tempFolder, System.Xml.XmlWriter writer, ServiceProviderItem item, ResourceGroupInfo group)
|
||||
{
|
||||
if (item is FtpAccount)
|
||||
{
|
||||
// backup FTP account
|
||||
FTPServer ftp = GetFTPServer(item.ServiceId);
|
||||
|
||||
// read FTP account info
|
||||
FtpAccount account = ftp.GetAccount(item.Name);
|
||||
account.Password = ((FtpAccount)item).Password;
|
||||
|
||||
XmlSerializer serializer = new XmlSerializer(typeof(FtpAccount));
|
||||
serializer.Serialize(writer, account);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
public int RestoreItem(string tempFolder, System.Xml.XmlNode itemNode, int itemId, Type itemType, string itemName, int packageId, int serviceId, ResourceGroupInfo group)
|
||||
{
|
||||
if (itemType == typeof(FtpAccount))
|
||||
{
|
||||
FTPServer ftp = GetFTPServer(serviceId);
|
||||
|
||||
// extract meta item
|
||||
XmlSerializer serializer = new XmlSerializer(typeof(FtpAccount));
|
||||
FtpAccount account = (FtpAccount)serializer.Deserialize(
|
||||
new XmlNodeReader(itemNode.SelectSingleNode("FtpAccount")));
|
||||
|
||||
// create DSN if required
|
||||
if (!ftp.AccountExists(itemName))
|
||||
{
|
||||
account.Password = CryptoUtils.Decrypt(account.Password);
|
||||
ftp.CreateAccount(account);
|
||||
|
||||
// restore password
|
||||
account.Password = CryptoUtils.Encrypt(account.Password);
|
||||
}
|
||||
|
||||
// add meta-item if required
|
||||
if (PackageController.GetPackageItemByName(packageId, itemName, typeof(FtpAccount)) == null)
|
||||
{
|
||||
account.PackageId = packageId;
|
||||
account.ServiceId = serviceId;
|
||||
PackageController.AddPackageItem(account);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
|
@ -0,0 +1,534 @@
|
|||
// Copyright (c) 2011, 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.Data;
|
||||
using WebsitePanel.Providers.Common;
|
||||
using WebsitePanel.Providers.HostedSolution;
|
||||
using WebsitePanel.Providers.ResultObjects;
|
||||
|
||||
namespace WebsitePanel.EnterpriseServer.Code.HostedSolution
|
||||
{
|
||||
public class BlackBerryController
|
||||
{
|
||||
private static bool CheckQuota(int itemId)
|
||||
{
|
||||
Organization org = OrganizationController.GetOrganization(itemId);
|
||||
PackageContext cntx = PackageController.GetPackageContext(org.PackageId);
|
||||
|
||||
IntResult userCount = GetBlackBerryUsersCount(itemId, string.Empty, string.Empty);
|
||||
|
||||
int allocatedBlackBerryUsers = cntx.Quotas[Quotas.BLACKBERRY_USERS].QuotaAllocatedValue;
|
||||
|
||||
return allocatedBlackBerryUsers == -1 || allocatedBlackBerryUsers > userCount.Value;
|
||||
}
|
||||
|
||||
private static BlackBerry GetBlackBerryProxy(int itemId)
|
||||
{
|
||||
Organization org = OrganizationController.GetOrganization(itemId);
|
||||
int serviceId = PackageController.GetPackageServiceId(org.PackageId, ResourceGroups.BlackBerry);
|
||||
|
||||
BlackBerry blackBerry = new BlackBerry();
|
||||
ServiceProviderProxy.Init(blackBerry, serviceId);
|
||||
|
||||
return blackBerry;
|
||||
}
|
||||
|
||||
internal static bool CheckBlackBerryUserExists(int accountId)
|
||||
{
|
||||
return DataProvider.CheckBlackBerryUserExists(accountId);
|
||||
}
|
||||
|
||||
public static ResultObject CreateBlackBerryUser(int itemId, int accountId)
|
||||
{
|
||||
ResultObject res = TaskManager.StartResultTask<ResultObject>("BLACBERRY", "CREATE_BLACKBERRY_USER");
|
||||
|
||||
|
||||
bool isBlackBerryUser;
|
||||
|
||||
try
|
||||
{
|
||||
isBlackBerryUser = DataProvider.CheckBlackBerryUserExists(accountId);
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
TaskManager.CompleteResultTask(res, BlackBerryErrorsCodes.CANNOT_CHECK_IF_BLACKBERRY_USER_EXISTS, ex);
|
||||
return res;
|
||||
}
|
||||
|
||||
if (isBlackBerryUser)
|
||||
{
|
||||
TaskManager.CompleteResultTask(res, BlackBerryErrorsCodes.USER_IS_ALREADY_BLAKBERRY_USER);
|
||||
return res;
|
||||
}
|
||||
|
||||
OrganizationUser user;
|
||||
try
|
||||
{
|
||||
user = OrganizationController.GetAccount(itemId, accountId);
|
||||
|
||||
if (user == null)
|
||||
throw new ApplicationException(
|
||||
string.Format("User is null. ItemId={0}, AccountId={1}", itemId,
|
||||
accountId));
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.CompleteResultTask(res, ErrorCodes.CANNOT_GET_ACCOUNT, ex);
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
if (user.AccountType != ExchangeAccountType.Mailbox)
|
||||
{
|
||||
TaskManager.CompleteResultTask(res, BlackBerryErrorsCodes.ACCOUNT_TYPE_IS_NOT_MAILBOX);
|
||||
return res;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
user = OrganizationController.GetUserGeneralSettings(itemId, accountId);
|
||||
if (string.IsNullOrEmpty(user.FirstName))
|
||||
{
|
||||
TaskManager.CompleteResultTask(res, BlackBerryErrorsCodes.USER_FIRST_NAME_IS_NOT_SPECIFIED);
|
||||
return res;
|
||||
}
|
||||
if (string.IsNullOrEmpty(user.LastName))
|
||||
{
|
||||
TaskManager.CompleteResultTask(res, BlackBerryErrorsCodes.USER_LAST_NAME_IS_NOT_SPECIFIED);
|
||||
return res;
|
||||
}
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
TaskManager.CompleteResultTask(res, BlackBerryErrorsCodes.CANNOT_GET_USER_GENERAL_SETTINGS, ex);
|
||||
return res;
|
||||
}
|
||||
|
||||
BlackBerry blackBerry;
|
||||
|
||||
try
|
||||
{
|
||||
blackBerry = GetBlackBerryProxy(itemId);
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
TaskManager.CompleteResultTask(res, BlackBerryErrorsCodes.CANNOT_GET_BLACKBERRY_PROXY, ex);
|
||||
return res;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
bool quota = CheckQuota(itemId);
|
||||
if (!quota)
|
||||
{
|
||||
TaskManager.CompleteResultTask(res, BlackBerryErrorsCodes.USER_QUOTA_HAS_BEEN_REACHED);
|
||||
return res;
|
||||
}
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
TaskManager.CompleteResultTask(res, BlackBerryErrorsCodes.CANNOT_CHECK_QUOTA, ex);
|
||||
return res;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
ResultObject userRes = blackBerry.CreateBlackBerryUser(user.PrimaryEmailAddress);
|
||||
res.ErrorCodes.AddRange(userRes.ErrorCodes);
|
||||
if (!userRes.IsSuccess)
|
||||
{
|
||||
TaskManager.CompleteResultTask(res);
|
||||
return res;
|
||||
}
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
TaskManager.CompleteResultTask(res, BlackBerryErrorsCodes.CANNOT_ADD_BLACKBERRY_USER, ex);
|
||||
return res;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
DataProvider.AddBlackBerryUser(accountId);
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
TaskManager.CompleteResultTask(res, BlackBerryErrorsCodes.CANNOT_ADD_BLACKBERRY_USER_TO_DATABASE, ex);
|
||||
return res;
|
||||
}
|
||||
|
||||
TaskManager.CompleteResultTask();
|
||||
return res;
|
||||
|
||||
}
|
||||
|
||||
public static OrganizationUsersPagedResult GetBlackBerryUsers(int itemId, string sortColumn, string sortDirection, string name, string email, int startRow, int count)
|
||||
{
|
||||
OrganizationUsersPagedResult res = TaskManager.StartResultTask<OrganizationUsersPagedResult>("BLACKBERRY", "GET_BLACKBERRY_USERS");
|
||||
|
||||
try
|
||||
{
|
||||
IDataReader reader =
|
||||
DataProvider.GetBlackBerryUsers(itemId, sortColumn, sortDirection, name, email, startRow, count);
|
||||
List<OrganizationUser> accounts = new List<OrganizationUser>();
|
||||
ObjectUtils.FillCollectionFromDataReader(accounts, reader);
|
||||
res.Value = new OrganizationUsersPaged {PageUsers = accounts.ToArray()};
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.CompleteResultTask(res, CrmErrorCodes.GET_CRM_USERS, ex);
|
||||
return res;
|
||||
}
|
||||
|
||||
IntResult intRes = GetBlackBerryUsersCount(itemId, name, email);
|
||||
res.ErrorCodes.AddRange(intRes.ErrorCodes);
|
||||
if (!intRes.IsSuccess)
|
||||
{
|
||||
TaskManager.CompleteResultTask(res);
|
||||
return res;
|
||||
}
|
||||
res.Value.RecordsCount = intRes.Value;
|
||||
|
||||
TaskManager.CompleteResultTask();
|
||||
return res;
|
||||
}
|
||||
|
||||
public static IntResult GetBlackBerryUsersCount(int itemId, string name, string email)
|
||||
{
|
||||
IntResult res = TaskManager.StartResultTask<IntResult>("BLACKBERRY", "GET_BLACKBERRY_USERS_COUNT");
|
||||
try
|
||||
{
|
||||
res.Value = DataProvider.GetBlackBerryUsersCount(itemId, name, email);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.CompleteResultTask(res, CrmErrorCodes.GET_CRM_USER_COUNT, ex);
|
||||
return res;
|
||||
}
|
||||
|
||||
TaskManager.CompleteResultTask();
|
||||
return res;
|
||||
}
|
||||
|
||||
public static ResultObject DeleteBlackBerryUser(int itemId, int accountId)
|
||||
{
|
||||
ResultObject res = TaskManager.StartResultTask<ResultObject>("BLACKBERRY", "DELETE_BLACKBERRY_USER");
|
||||
|
||||
BlackBerry blackBerry;
|
||||
|
||||
try
|
||||
{
|
||||
blackBerry = GetBlackBerryProxy(itemId);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.CompleteResultTask(res, BlackBerryErrorsCodes.CANNOT_GET_BLACKBERRY_PROXY, ex);
|
||||
return res;
|
||||
}
|
||||
|
||||
OrganizationUser user;
|
||||
try
|
||||
{
|
||||
user = OrganizationController.GetAccount(itemId, accountId);
|
||||
|
||||
if (user == null)
|
||||
throw new ApplicationException(
|
||||
string.Format("User is null. ItemId={0}, AccountId={1}", itemId,
|
||||
accountId));
|
||||
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.CompleteResultTask(res, ErrorCodes.CANNOT_GET_ACCOUNT, ex);
|
||||
return res;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
ResultObject bbRes = blackBerry.DeleteBlackBerryUser(user.PrimaryEmailAddress);
|
||||
res.ErrorCodes.AddRange(bbRes.ErrorCodes);
|
||||
if (!bbRes.IsSuccess)
|
||||
{
|
||||
TaskManager.CompleteResultTask(res);
|
||||
return res;
|
||||
}
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
TaskManager.CompleteResultTask(res, BlackBerryErrorsCodes.CANNOT_DELETE_BLACKBERRY_USER, ex);
|
||||
return res;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
DataProvider.DeleteBlackBerryUser(accountId);
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
TaskManager.CompleteResultTask(res, BlackBerryErrorsCodes.CANNOT_DELETE_BLACKBERRY_USER_FROM_METADATA, ex);
|
||||
return res;
|
||||
}
|
||||
|
||||
TaskManager.CompleteResultTask();
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
public static BlackBerryUserStatsResult GetBlackBerryUserStats(int itemId, int accountId)
|
||||
{
|
||||
BlackBerryUserStatsResult res = TaskManager.StartResultTask<BlackBerryUserStatsResult>("BLACKBERRY",
|
||||
"DELETE_BLACKBERRY_USER");
|
||||
BlackBerry blackBerry;
|
||||
|
||||
try
|
||||
{
|
||||
blackBerry = GetBlackBerryProxy(itemId);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.CompleteResultTask(res, BlackBerryErrorsCodes.CANNOT_GET_BLACKBERRY_PROXY, ex);
|
||||
return res;
|
||||
}
|
||||
|
||||
OrganizationUser user;
|
||||
try
|
||||
{
|
||||
user = OrganizationController.GetAccount(itemId, accountId);
|
||||
|
||||
if (user == null)
|
||||
throw new ApplicationException(
|
||||
string.Format("User is null. ItemId={0}, AccountId={1}", itemId,
|
||||
accountId));
|
||||
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.CompleteResultTask(res, ErrorCodes.CANNOT_GET_ACCOUNT, ex);
|
||||
return res;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
BlackBerryUserStatsResult tmp = blackBerry.GetBlackBerryUserStats(user.PrimaryEmailAddress);
|
||||
res.ErrorCodes.AddRange(tmp.ErrorCodes);
|
||||
if (!tmp.IsSuccess)
|
||||
{
|
||||
TaskManager.CompleteResultTask(res, BlackBerryErrorsCodes.CANNOT_GET_USER_STATS);
|
||||
return res;
|
||||
}
|
||||
|
||||
res.Value = tmp.Value;
|
||||
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
TaskManager.CompleteResultTask(res, BlackBerryErrorsCodes.CANNOT_GET_USER_STATS, ex);
|
||||
return res;
|
||||
}
|
||||
|
||||
TaskManager.CompleteResultTask();
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
public static ResultObject SetActivationPasswordWithExpirationTime(int itemId, int accountId, string password, int time)
|
||||
{
|
||||
BlackBerryUserStatsResult res = TaskManager.StartResultTask<BlackBerryUserStatsResult>("BLACKBERRY",
|
||||
"DELETE_BLACKBERRY_USER");
|
||||
BlackBerry blackBerry;
|
||||
|
||||
try
|
||||
{
|
||||
blackBerry = GetBlackBerryProxy(itemId);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.CompleteResultTask(res, BlackBerryErrorsCodes.CANNOT_GET_BLACKBERRY_PROXY, ex);
|
||||
return res;
|
||||
}
|
||||
|
||||
OrganizationUser user;
|
||||
try
|
||||
{
|
||||
user = OrganizationController.GetAccount(itemId, accountId);
|
||||
|
||||
if (user == null)
|
||||
throw new ApplicationException(
|
||||
string.Format("User is null. ItemId={0}, AccountId={1}", itemId,
|
||||
accountId));
|
||||
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.CompleteResultTask(res, ErrorCodes.CANNOT_GET_ACCOUNT, ex);
|
||||
return res;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
ResultObject tmp = blackBerry.SetActivationPasswordWithExpirationTime(user.PrimaryEmailAddress, password, time);
|
||||
res.ErrorCodes.AddRange(tmp.ErrorCodes);
|
||||
if (!tmp.IsSuccess)
|
||||
{
|
||||
TaskManager.CompleteResultTask(res, BlackBerryErrorsCodes.CANNOT_SET_ACTIVATION_PASSWORD);
|
||||
return res;
|
||||
}
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.CompleteResultTask(res, BlackBerryErrorsCodes.CANNOT_SET_ACTIVATION_PASSWORD, ex);
|
||||
return res;
|
||||
}
|
||||
|
||||
TaskManager.CompleteResultTask();
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
public static ResultObject SetEmailActivationPassword(int itemId, int accountId)
|
||||
{
|
||||
ResultObject res = TaskManager.StartResultTask<BlackBerryUserStatsResult>("BLACKBERRY",
|
||||
"DELETE_BLACKBERRY_USER");
|
||||
BlackBerry blackBerry;
|
||||
|
||||
try
|
||||
{
|
||||
blackBerry = GetBlackBerryProxy(itemId);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.CompleteResultTask(res, BlackBerryErrorsCodes.CANNOT_GET_BLACKBERRY_PROXY, ex);
|
||||
return res;
|
||||
}
|
||||
|
||||
OrganizationUser user;
|
||||
try
|
||||
{
|
||||
user = OrganizationController.GetAccount(itemId, accountId);
|
||||
|
||||
if (user == null)
|
||||
throw new ApplicationException(
|
||||
string.Format("User is null. ItemId={0}, AccountId={1}", itemId,
|
||||
accountId));
|
||||
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.CompleteResultTask(res, ErrorCodes.CANNOT_GET_ACCOUNT, ex);
|
||||
return res;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
ResultObject tmp = blackBerry.SetEmailActivationPassword(user.PrimaryEmailAddress);
|
||||
res.ErrorCodes.AddRange(tmp.ErrorCodes);
|
||||
if (!tmp.IsSuccess)
|
||||
{
|
||||
TaskManager.CompleteResultTask(res, BlackBerryErrorsCodes.CANNOT_SET_EMAIL_ACTIVATION_PASSWORD);
|
||||
return res;
|
||||
}
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.CompleteResultTask(res, BlackBerryErrorsCodes.CANNOT_SET_EMAIL_ACTIVATION_PASSWORD, ex);
|
||||
return res;
|
||||
}
|
||||
|
||||
TaskManager.CompleteResultTask();
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
public static ResultObject DeleteDataFromBlackBerryDevice(int itemId, int accountId)
|
||||
{
|
||||
ResultObject res = TaskManager.StartResultTask<BlackBerryUserStatsResult>("BLACKBERRY",
|
||||
"DELETE_BLACKBERRY_USER");
|
||||
BlackBerry blackBerry;
|
||||
|
||||
try
|
||||
{
|
||||
blackBerry = GetBlackBerryProxy(itemId);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.CompleteResultTask(res, BlackBerryErrorsCodes.CANNOT_GET_BLACKBERRY_PROXY, ex);
|
||||
return res;
|
||||
}
|
||||
|
||||
OrganizationUser user;
|
||||
try
|
||||
{
|
||||
user = OrganizationController.GetAccount(itemId, accountId);
|
||||
|
||||
if (user == null)
|
||||
throw new ApplicationException(
|
||||
string.Format("User is null. ItemId={0}, AccountId={1}", itemId,
|
||||
accountId));
|
||||
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.CompleteResultTask(res, ErrorCodes.CANNOT_GET_ACCOUNT, ex);
|
||||
return res;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
ResultObject tmp = blackBerry.DeleteDataFromBlackBerryDevice(user.PrimaryEmailAddress);
|
||||
res.ErrorCodes.AddRange(tmp.ErrorCodes);
|
||||
if (!tmp.IsSuccess)
|
||||
{
|
||||
TaskManager.CompleteResultTask(res, BlackBerryErrorsCodes.CANNOT_DELETE_DATA_FROM_BLACKBERRY_DEVICE);
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.CompleteResultTask(res, BlackBerryErrorsCodes.CANNOT_DELETE_DATA_FROM_BLACKBERRY_DEVICE, ex);
|
||||
return res;
|
||||
}
|
||||
|
||||
TaskManager.CompleteResultTask();
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
File diff suppressed because it is too large
Load diff
|
@ -0,0 +1,447 @@
|
|||
// Copyright (c) 2011, 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.Collections.Specialized;
|
||||
using System.Data;
|
||||
using WebsitePanel.Providers.Common;
|
||||
using WebsitePanel.Providers.HostedSolution;
|
||||
using WebsitePanel.Providers.ResultObjects;
|
||||
using WebsitePanel.Providers.OCS;
|
||||
|
||||
namespace WebsitePanel.EnterpriseServer.Code.HostedSolution
|
||||
{
|
||||
public class OCSController
|
||||
{
|
||||
|
||||
private static OCSServer GetOCSProxy(int itemId)
|
||||
{
|
||||
Organization org = OrganizationController.GetOrganization(itemId);
|
||||
int serviceId = PackageController.GetPackageServiceId(org.PackageId, ResourceGroups.OCS);
|
||||
|
||||
OCSServer ocs = new OCSServer();
|
||||
ServiceProviderProxy.Init(ocs, serviceId);
|
||||
|
||||
|
||||
return ocs;
|
||||
}
|
||||
|
||||
private static bool CheckQuota(int itemId)
|
||||
{
|
||||
Organization org = OrganizationController.GetOrganization(itemId);
|
||||
PackageContext cntx = PackageController.GetPackageContext(org.PackageId);
|
||||
|
||||
IntResult userCount = GetOCSUsersCount(itemId, string.Empty, string.Empty);
|
||||
|
||||
int allocatedBlackBerryUsers = cntx.Quotas[Quotas.OCS_USERS].QuotaAllocatedValue;
|
||||
|
||||
return allocatedBlackBerryUsers == -1 || allocatedBlackBerryUsers > userCount.Value;
|
||||
}
|
||||
|
||||
private static void SetUserGeneralSettingsByDefault(int itemId, string instanceId, OCSServer ocs)
|
||||
{
|
||||
Organization org = OrganizationController.GetOrganization(itemId);
|
||||
PackageContext cntx = PackageController.GetPackageContext(org.PackageId);
|
||||
|
||||
|
||||
|
||||
ocs.SetUserGeneralSettings(instanceId, !cntx.Quotas[Quotas.OCS_FederationByDefault].QuotaExhausted,
|
||||
!cntx.Quotas[Quotas.OCS_PublicIMConnectivityByDefault].QuotaExhausted,
|
||||
!cntx.Quotas[Quotas.OCS_ArchiveIMConversationByDefault].QuotaExhausted,
|
||||
!cntx.Quotas[Quotas.OCS_ArchiveFederatedIMConversationByDefault].QuotaExhausted,
|
||||
!cntx.Quotas[Quotas.OCS_PresenceAllowedByDefault].QuotaExhausted);
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
private static OCSEdgeServer[] GetEdgeServers(string edgeServices)
|
||||
{
|
||||
List<OCSEdgeServer> list = new List<OCSEdgeServer>();
|
||||
string[] services = edgeServices.Split(';');
|
||||
foreach (string current in services)
|
||||
{
|
||||
string[] data = current.Split(',');
|
||||
try
|
||||
{
|
||||
int serviceId = int.Parse(data[1]);
|
||||
OCSEdgeServer ocs = new OCSEdgeServer();
|
||||
ServiceProviderProxy.Init(ocs, serviceId);
|
||||
list.Add(ocs);
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
TaskManager.WriteError(ex);
|
||||
}
|
||||
}
|
||||
|
||||
return list.ToArray();
|
||||
}
|
||||
|
||||
public static void DeleteDomain(int itemId, string domainName)
|
||||
{
|
||||
Organization org = OrganizationController.GetOrganization(itemId);
|
||||
if (org.IsOCSOrganization)
|
||||
{
|
||||
int serviceId = PackageController.GetPackageServiceId(org.PackageId, ResourceGroups.OCS);
|
||||
StringDictionary settings = ServerController.GetServiceSettings(serviceId);
|
||||
string edgeServersData = settings[OCSConstants.EDGEServicesData];
|
||||
OCSEdgeServer[] edgeServers = GetEdgeServers(edgeServersData);
|
||||
DeleteDomain(domainName, edgeServers);
|
||||
}
|
||||
}
|
||||
|
||||
public static void DeleteDomain(string domainName, OCSEdgeServer[] edgeServers)
|
||||
{
|
||||
foreach (OCSEdgeServer currentEdgeServer in edgeServers)
|
||||
{
|
||||
try
|
||||
{
|
||||
currentEdgeServer.DeleteDomain(domainName);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.WriteError(ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void AddDomain(string domainName, OCSEdgeServer[] edgeServers)
|
||||
{
|
||||
foreach (OCSEdgeServer currentEdgeServer in edgeServers)
|
||||
{
|
||||
try
|
||||
{
|
||||
currentEdgeServer.AddDomain(domainName);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.WriteError(ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void AddDomain(string domainName, int itemId)
|
||||
{
|
||||
Organization org = OrganizationController.GetOrganization(itemId);
|
||||
if (!org.IsOCSOrganization)
|
||||
{
|
||||
int serviceId = PackageController.GetPackageServiceId(org.PackageId, ResourceGroups.OCS);
|
||||
StringDictionary settings = ServerController.GetServiceSettings(serviceId);
|
||||
string edgeServersData = settings[OCSConstants.EDGEServicesData];
|
||||
OCSEdgeServer[] edgeServers = GetEdgeServers(edgeServersData);
|
||||
AddDomain(domainName, edgeServers);
|
||||
}
|
||||
}
|
||||
|
||||
private static void CreateOCSDomains(int itemId)
|
||||
{
|
||||
Organization org = OrganizationController.GetOrganization(itemId);
|
||||
if (!org.IsOCSOrganization)
|
||||
{
|
||||
List<OrganizationDomainName> domains = OrganizationController.GetOrganizationDomains(itemId);
|
||||
int serviceId = PackageController.GetPackageServiceId(org.PackageId, ResourceGroups.OCS);
|
||||
StringDictionary settings = ServerController.GetServiceSettings(serviceId);
|
||||
string edgeServersData = settings[OCSConstants.EDGEServicesData];
|
||||
OCSEdgeServer[] edgeServers = GetEdgeServers(edgeServersData);
|
||||
foreach (OrganizationDomainName currentDomain in domains)
|
||||
{
|
||||
AddDomain(currentDomain.DomainName, edgeServers);
|
||||
}
|
||||
|
||||
org.IsOCSOrganization = true;
|
||||
|
||||
PackageController.UpdatePackageItem(org);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static OCSUserResult CreateOCSUser(int itemId, int accountId)
|
||||
{
|
||||
OCSUserResult res = TaskManager.StartResultTask<OCSUserResult>("OCS", "CREATE_OCS_USER");
|
||||
|
||||
OCSUser retOCSUser = new OCSUser();
|
||||
bool isOCSUser;
|
||||
|
||||
try
|
||||
{
|
||||
isOCSUser = DataProvider.CheckOCSUserExists(accountId);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.CompleteResultTask(res, OCSErrorCodes.CANNOT_CHECK_IF_OCS_USER_EXISTS, ex);
|
||||
return res;
|
||||
}
|
||||
|
||||
if (isOCSUser)
|
||||
{
|
||||
TaskManager.CompleteResultTask(res, OCSErrorCodes.USER_IS_ALREADY_OCS_USER);
|
||||
return res;
|
||||
}
|
||||
|
||||
OrganizationUser user;
|
||||
try
|
||||
{
|
||||
user = OrganizationController.GetAccount(itemId, accountId);
|
||||
|
||||
if (user == null)
|
||||
throw new ApplicationException(
|
||||
string.Format("User is null. ItemId={0}, AccountId={1}", itemId,
|
||||
accountId));
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.CompleteResultTask(res, ErrorCodes.CANNOT_GET_ACCOUNT, ex);
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
try
|
||||
{
|
||||
user = OrganizationController.GetUserGeneralSettings(itemId, accountId);
|
||||
if (string.IsNullOrEmpty(user.FirstName))
|
||||
{
|
||||
TaskManager.CompleteResultTask(res, OCSErrorCodes.USER_FIRST_NAME_IS_NOT_SPECIFIED);
|
||||
return res;
|
||||
}
|
||||
|
||||
if (string.IsNullOrEmpty(user.LastName))
|
||||
{
|
||||
TaskManager.CompleteResultTask(res, OCSErrorCodes.USER_LAST_NAME_IS_NOT_SPECIFIED);
|
||||
return res;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.CompleteResultTask(res, OCSErrorCodes.CANNOT_GET_USER_GENERAL_SETTINGS, ex);
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
try
|
||||
{
|
||||
bool quota = CheckQuota(itemId);
|
||||
if (!quota)
|
||||
{
|
||||
TaskManager.CompleteResultTask(res, OCSErrorCodes.USER_QUOTA_HAS_BEEN_REACHED);
|
||||
return res;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.CompleteResultTask(res, OCSErrorCodes.CANNOT_CHECK_QUOTA, ex);
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
OCSServer ocs;
|
||||
|
||||
try
|
||||
{
|
||||
ocs = GetOCSProxy(itemId);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.CompleteResultTask(res, OCSErrorCodes.CANNOT_GET_OCS_PROXY, ex);
|
||||
return res;
|
||||
}
|
||||
|
||||
string instanceId;
|
||||
try
|
||||
{
|
||||
CreateOCSDomains(itemId);
|
||||
|
||||
instanceId = ocs.CreateUser(user.PrimaryEmailAddress, user.DistinguishedName);
|
||||
retOCSUser.InstanceId = instanceId;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.CompleteResultTask(res, OCSErrorCodes.CANNOT_ADD_OCS_USER, ex);
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
try
|
||||
{
|
||||
SetUserGeneralSettingsByDefault(itemId, instanceId, ocs);
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
TaskManager.CompleteResultTask(res, OCSErrorCodes.CANNOT_SET_DEFAULT_SETTINGS, ex);
|
||||
return res;
|
||||
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
DataProvider.AddOCSUser(accountId, instanceId);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.CompleteResultTask(res, OCSErrorCodes.CANNOT_ADD_OCS_USER_TO_DATABASE, ex);
|
||||
return res;
|
||||
}
|
||||
|
||||
res.Value = retOCSUser;
|
||||
TaskManager.CompleteResultTask();
|
||||
return res;
|
||||
|
||||
}
|
||||
|
||||
|
||||
public static OCSUsersPagedResult GetOCSUsers(int itemId, string sortColumn, string sortDirection, string name, string email, int startRow, int count)
|
||||
{
|
||||
OCSUsersPagedResult res = TaskManager.StartResultTask<OCSUsersPagedResult>("OCS", "GET_OCS_USERS");
|
||||
|
||||
try
|
||||
{
|
||||
IDataReader reader =
|
||||
DataProvider.GetOCSUsers(itemId, sortColumn, sortDirection, name, email, startRow, count);
|
||||
List<OCSUser> accounts = new List<OCSUser>();
|
||||
ObjectUtils.FillCollectionFromDataReader(accounts, reader);
|
||||
res.Value = new OCSUsersPaged { PageUsers = accounts.ToArray() };
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.CompleteResultTask(res, OCSErrorCodes.GET_OCS_USERS, ex);
|
||||
return res;
|
||||
}
|
||||
|
||||
IntResult intRes = GetOCSUsersCount(itemId, name, email);
|
||||
res.ErrorCodes.AddRange(intRes.ErrorCodes);
|
||||
if (!intRes.IsSuccess)
|
||||
{
|
||||
TaskManager.CompleteResultTask(res);
|
||||
return res;
|
||||
}
|
||||
res.Value.RecordsCount = intRes.Value;
|
||||
|
||||
TaskManager.CompleteResultTask();
|
||||
return res;
|
||||
}
|
||||
|
||||
public static IntResult GetOCSUsersCount(int itemId, string name, string email)
|
||||
{
|
||||
IntResult res = TaskManager.StartResultTask<IntResult>("OCS", "GET_OCS_USERS_COUNT");
|
||||
try
|
||||
{
|
||||
res.Value = DataProvider.GetOCSUsersCount(itemId, name, email);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.CompleteResultTask(res, OCSErrorCodes.GET_OCS_USER_COUNT, ex);
|
||||
return res;
|
||||
}
|
||||
|
||||
TaskManager.CompleteResultTask();
|
||||
return res;
|
||||
}
|
||||
|
||||
public static ResultObject DeleteOCSUser(int itemId, string instanceId)
|
||||
{
|
||||
ResultObject res = TaskManager.StartResultTask<ResultObject>("OCS", "DELETE_OCS_USER");
|
||||
|
||||
OCSServer ocsServer;
|
||||
|
||||
try
|
||||
{
|
||||
ocsServer = GetOCSProxy(itemId);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.CompleteResultTask(res, OCSErrorCodes.CANNOT_GET_OCS_PROXY, ex);
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
try
|
||||
{
|
||||
ocsServer.DeleteUser(instanceId);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.CompleteResultTask(res, OCSErrorCodes.CANNOT_DELETE_OCS_USER, ex);
|
||||
return res;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
DataProvider.DeleteOCSUser(instanceId);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.CompleteResultTask(res, OCSErrorCodes.CANNOT_DELETE_OCS_USER_FROM_METADATA, ex);
|
||||
return res;
|
||||
}
|
||||
|
||||
TaskManager.CompleteResultTask();
|
||||
return res;
|
||||
}
|
||||
|
||||
public static OCSUser GetUserGeneralSettings(int itemId, string instanceId)
|
||||
{
|
||||
TaskManager.StartTask("OCS", "GET_OCS_USER_GENERAL_SETTINGS");
|
||||
|
||||
OCSUser user;
|
||||
|
||||
try
|
||||
{
|
||||
OCSServer ocs = GetOCSProxy(itemId);
|
||||
user = ocs.GetUserGeneralSettings(instanceId);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw TaskManager.WriteError(ex);
|
||||
|
||||
}
|
||||
TaskManager.CompleteTask();
|
||||
return user;
|
||||
|
||||
}
|
||||
|
||||
public static void SetUserGeneralSettings(int itemId, string instanceId, bool enabledForFederation, bool enabledForPublicIMConnectivity, bool archiveInternalCommunications, bool archiveFederatedCommunications, bool enabledForEnhancedPresence)
|
||||
{
|
||||
TaskManager.StartTask("OCS", "SET_OCS_USER_GENERAL_SETTINGS");
|
||||
try
|
||||
{
|
||||
OCSServer ocs = GetOCSProxy(itemId);
|
||||
ocs.SetUserGeneralSettings(instanceId, enabledForFederation, enabledForPublicIMConnectivity,
|
||||
archiveInternalCommunications, archiveFederatedCommunications,
|
||||
enabledForEnhancedPresence);
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
throw TaskManager.WriteError(ex);
|
||||
}
|
||||
TaskManager.CompleteTask();
|
||||
|
||||
}
|
||||
}
|
||||
}
|
File diff suppressed because it is too large
Load diff
|
@ -0,0 +1,559 @@
|
|||
// Copyright (c) 2011, 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.Data;
|
||||
using System.Text;
|
||||
using WebsitePanel.EnterpriseServer.Code.SharePoint;
|
||||
using WebsitePanel.Providers.CRM;
|
||||
using WebsitePanel.Providers.HostedSolution;
|
||||
using WebsitePanel.Providers.ResultObjects;
|
||||
using WebsitePanel.Providers.SharePoint;
|
||||
|
||||
namespace WebsitePanel.EnterpriseServer.Code.HostedSolution
|
||||
{
|
||||
public class ReportController
|
||||
{
|
||||
private static void PopulateOrganizationStatisticsReport(Organization org, EnterpriseSolutionStatisticsReport report, string topReseller)
|
||||
{
|
||||
OrganizationStatisticsRepotItem item = new OrganizationStatisticsRepotItem();
|
||||
PopulateBaseItem(item, org, topReseller);
|
||||
|
||||
if (report.ExchangeReport != null)
|
||||
{
|
||||
try
|
||||
{
|
||||
List<ExchangeMailboxStatistics> mailboxStats =
|
||||
report.ExchangeReport.Items.FindAll(
|
||||
delegate(ExchangeMailboxStatistics stats)
|
||||
{ return stats.OrganizationID == org.OrganizationId; });
|
||||
|
||||
item.TotalMailboxes = mailboxStats.Count;
|
||||
foreach (ExchangeMailboxStatistics current in mailboxStats)
|
||||
{
|
||||
item.TotalMailboxesSize += current.TotalSize;
|
||||
}
|
||||
|
||||
Providers.Exchange.ExchangeServer exchange;
|
||||
if (!string.IsNullOrEmpty(org.GlobalAddressList))
|
||||
{
|
||||
try
|
||||
{
|
||||
|
||||
int exchangeServiceId = GetExchangeServiceID(org.PackageId);
|
||||
exchange =
|
||||
ExchangeServerController.GetExchangeServer(exchangeServiceId, org.ServiceId);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw new ApplicationException(
|
||||
string.Format("Could not get exchange server. PackageId: {0}", org.PackageId), ex);
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
item.TotalPublicFoldersSize = exchange.GetPublicFolderSize("\\" + org.OrganizationId);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw new ApplicationException(
|
||||
string.Format("Could not get public folder size. OrgId: {0}", org.OrganizationId), ex);
|
||||
}
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
org.DiskSpace = (int)(item.TotalPublicFoldersSize + item.TotalMailboxesSize);
|
||||
PackageController.UpdatePackageItem(org);
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
throw new ApplicationException(string.Format("Could not calcualate diskspace. Org Id: {0}", org.Id), ex);
|
||||
}
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
TaskManager.WriteError(ex);
|
||||
}
|
||||
}
|
||||
|
||||
if (report.SharePointReport != null)
|
||||
{
|
||||
List<SharePointStatistics> sharePoints =
|
||||
report.SharePointReport.Items.FindAll(
|
||||
delegate(SharePointStatistics stats) { return stats.OrganizationID == org.OrganizationId; });
|
||||
|
||||
item.TotalSharePointSiteCollections = sharePoints.Count;
|
||||
foreach (SharePointStatistics current in sharePoints)
|
||||
{
|
||||
item.TotalSharePointSiteCollectionsSize += current.SiteCollectionSize;
|
||||
}
|
||||
}
|
||||
|
||||
if (report.CRMReport != null)
|
||||
{
|
||||
List<CRMOrganizationStatistics> crmOrganizationStatistics =
|
||||
report.CRMReport.Items.FindAll(
|
||||
delegate(CRMOrganizationStatistics stats) { return stats.OrganizationID == org.OrganizationId; });
|
||||
|
||||
item.TotalCRMUsers = crmOrganizationStatistics.Count;
|
||||
}
|
||||
|
||||
report.OrganizationReport.Items.Add(item);
|
||||
}
|
||||
|
||||
|
||||
private static HostedSharePointServer GetHostedSharePointServer(int serviceId)
|
||||
{
|
||||
HostedSharePointServer sps = new HostedSharePointServer();
|
||||
ServiceProviderProxy.Init(sps, serviceId);
|
||||
return sps;
|
||||
}
|
||||
|
||||
private static int GetHostedSharePointServiceId(int packageId)
|
||||
{
|
||||
return PackageController.GetPackageServiceId(packageId, ResourceGroups.HostedSharePoint);
|
||||
}
|
||||
|
||||
|
||||
private static void PopulateBaseItem(BaseStatistics stats, Organization org, string topReseller)
|
||||
{
|
||||
PackageInfo package;
|
||||
UserInfo user;
|
||||
|
||||
try
|
||||
{
|
||||
package = PackageController.GetPackage(org.PackageId);
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
throw new ApplicationException(string.Format("Could not get package {0}", org.PackageId), ex);
|
||||
}
|
||||
|
||||
|
||||
try
|
||||
{
|
||||
user = UserController.GetUser(package.UserId);
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
throw new ApplicationException(string.Format("Could not get user {0}", package.UserId), ex);
|
||||
}
|
||||
|
||||
stats.HostingSpace = package.PackageName;
|
||||
stats.OrganizationID = org.OrganizationId;
|
||||
stats.OrganizationName = org.Name;
|
||||
|
||||
stats.CustomerName = UserController.GetUser(package.UserId).Username;
|
||||
stats.CustomerCreated = user.Created;
|
||||
stats.ResellerName = UserController.GetUser(user.OwnerId).Username;
|
||||
stats.TopResellerName = topReseller;
|
||||
|
||||
stats.OrganizationCreated = org.CreatedDate;
|
||||
stats.HostingSpaceCreated = package.PurchaseDate;
|
||||
|
||||
}
|
||||
|
||||
|
||||
private static int GetCRMServiceId(int packageId)
|
||||
{
|
||||
int serviceId = PackageController.GetPackageServiceId(packageId, ResourceGroups.HostedCRM);
|
||||
return serviceId;
|
||||
}
|
||||
|
||||
private static CRM GetCRMProxy(int packageId)
|
||||
{
|
||||
int crmServiceId = GetCRMServiceId(packageId);
|
||||
CRM ws = new CRM();
|
||||
ServiceProviderProxy.Init(ws, crmServiceId);
|
||||
return ws;
|
||||
}
|
||||
|
||||
private static void PopulateCRMReportItems(Organization org, EnterpriseSolutionStatisticsReport report, string topReseller)
|
||||
{
|
||||
if (org.CrmOrganizationId == Guid.Empty)
|
||||
return;
|
||||
|
||||
List<OrganizationUser> users;
|
||||
|
||||
try
|
||||
{
|
||||
users = CRMController.GetCRMOrganizationUsers(org.Id);
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
throw new ApplicationException(
|
||||
string.Format("Could not get CRM Organization users. OrgId : {0}", org.Id), ex);
|
||||
}
|
||||
|
||||
CRM crm;
|
||||
try
|
||||
{
|
||||
crm = GetCRMProxy(org.PackageId);
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
throw new ApplicationException(string.Format("Could not get CRM Proxy. PackageId: {0}", org.PackageId),
|
||||
ex);
|
||||
}
|
||||
|
||||
foreach (OrganizationUser user in users)
|
||||
{
|
||||
try
|
||||
{
|
||||
CRMOrganizationStatistics stats = new CRMOrganizationStatistics();
|
||||
|
||||
PopulateBaseItem(stats, org, topReseller);
|
||||
|
||||
stats.CRMOrganizationId = org.CrmOrganizationId;
|
||||
stats.CRMUserName = user.DisplayName;
|
||||
|
||||
Guid crmUserId = CRMController.GetCrmUserId(user.AccountId);
|
||||
CrmUserResult res = crm.GetCrmUserById(crmUserId, org.OrganizationId);
|
||||
if (res.IsSuccess && res.Value != null)
|
||||
{
|
||||
stats.ClientAccessMode = res.Value.ClientAccessMode;
|
||||
stats.CRMDisabled = res.Value.IsDisabled;
|
||||
}
|
||||
else
|
||||
{
|
||||
StringBuilder sb = new StringBuilder("Could not get CRM user by id.");
|
||||
foreach (string str in res.ErrorCodes)
|
||||
{
|
||||
sb.AppendFormat("\n{0};", str);
|
||||
}
|
||||
throw new ApplicationException(sb.ToString());
|
||||
}
|
||||
|
||||
report.CRMReport.Items.Add(stats);
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
TaskManager.WriteError(ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void PopulateOrganizationData(Organization org, EnterpriseSolutionStatisticsReport report, string topReseller)
|
||||
{
|
||||
if (report.ExchangeReport != null)
|
||||
{
|
||||
try
|
||||
{
|
||||
PopulateExchangeReportItems(org, report, topReseller);
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
TaskManager.WriteError(ex);
|
||||
}
|
||||
}
|
||||
|
||||
if (report.CRMReport != null)
|
||||
{
|
||||
try
|
||||
{
|
||||
PopulateCRMReportItems(org, report, topReseller);
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
TaskManager.WriteError(ex);
|
||||
}
|
||||
}
|
||||
|
||||
if (report.SharePointReport != null)
|
||||
{
|
||||
try
|
||||
{
|
||||
PopulateSharePointItem(org, report, topReseller);
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
TaskManager.WriteError(ex);
|
||||
}
|
||||
}
|
||||
|
||||
if (report.OrganizationReport != null)
|
||||
{
|
||||
try
|
||||
{
|
||||
PopulateOrganizationStatisticsReport(org, report, topReseller);
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
TaskManager.WriteError(ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static int GetExchangeServiceID(int packageId)
|
||||
{
|
||||
return PackageController.GetPackageServiceId(packageId, ResourceGroups.Exchange);
|
||||
}
|
||||
|
||||
|
||||
|
||||
private static void PopulateSharePointItem(Organization org, EnterpriseSolutionStatisticsReport report, string topReseller)
|
||||
{
|
||||
List<SharePointSiteCollection> siteCollections;
|
||||
|
||||
try
|
||||
{
|
||||
siteCollections = HostedSharePointServerController.GetSiteCollections(org.Id);
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
throw new ApplicationException(string.Format("Could not get site collections. OrgId: {0}", org.Id), ex);
|
||||
}
|
||||
|
||||
if (siteCollections == null || siteCollections.Count == 0)
|
||||
return;
|
||||
|
||||
HostedSharePointServer srv;
|
||||
try
|
||||
{
|
||||
int serviceId = GetHostedSharePointServiceId(org.PackageId);
|
||||
srv = GetHostedSharePointServer(serviceId);
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
throw new ApplicationException(
|
||||
string.Format("Could not get sharepoint server. PackageId: {0}", org.PackageId), ex);
|
||||
}
|
||||
|
||||
foreach (SharePointSiteCollection siteCollection in siteCollections)
|
||||
{
|
||||
try
|
||||
{
|
||||
SharePointStatistics stats = new SharePointStatistics();
|
||||
PopulateBaseItem(stats, org, topReseller);
|
||||
|
||||
stats.SiteCollectionUrl = siteCollection.PhysicalAddress;
|
||||
stats.SiteCollectionOwner = siteCollection.OwnerName;
|
||||
stats.SiteCollectionQuota = siteCollection.MaxSiteStorage;
|
||||
|
||||
stats.SiteCollectionCreated = siteCollection.CreatedDate;
|
||||
|
||||
stats.SiteCollectionSize = srv.GetSiteCollectionSize(siteCollection.PhysicalAddress);
|
||||
|
||||
report.SharePointReport.Items.Add(stats);
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
TaskManager.WriteError(ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private static void PopulateExchangeReportItems(Organization org, EnterpriseSolutionStatisticsReport report, string topReseller)
|
||||
{
|
||||
//Check if exchange organization
|
||||
if (string.IsNullOrEmpty(org.GlobalAddressList))
|
||||
return;
|
||||
|
||||
List<ExchangeAccount> mailboxes;
|
||||
Providers.Exchange.ExchangeServer exchange;
|
||||
try
|
||||
{
|
||||
mailboxes = ExchangeServerController.GetExchangeMailboxes(org.Id);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw new ApplicationException(
|
||||
string.Format("Could not get mailboxes for current organization {0}", org.Id), ex);
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
int exchangeServiceId = GetExchangeServiceID(org.PackageId);
|
||||
exchange = ExchangeServerController.GetExchangeServer(exchangeServiceId, org.ServiceId);
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
throw new ApplicationException(
|
||||
string.Format("Could not get exchange server. PackageId: {0}", org.PackageId), ex);
|
||||
}
|
||||
|
||||
ExchangeMailboxStatistics stats;
|
||||
foreach (ExchangeAccount mailbox in mailboxes)
|
||||
{
|
||||
try
|
||||
{
|
||||
stats = null;
|
||||
try
|
||||
{
|
||||
|
||||
stats = exchange.GetMailboxStatistics(mailbox.AccountName);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.WriteError(ex, "Could not get mailbox statistics. AccountName: {0}",
|
||||
mailbox.AccountName);
|
||||
}
|
||||
|
||||
|
||||
if (stats != null)
|
||||
{
|
||||
PopulateBaseItem(stats, org, topReseller);
|
||||
stats.MailboxType = mailbox.AccountType;
|
||||
|
||||
stats.BlackberryEnabled = BlackBerryController.CheckBlackBerryUserExists(mailbox.AccountId);
|
||||
report.ExchangeReport.Items.Add(stats);
|
||||
}
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
TaskManager.WriteError(ex);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
private static void PopulateSpaceData(int packageId, EnterpriseSolutionStatisticsReport report, string topReseller)
|
||||
{
|
||||
List<Organization> organizations;
|
||||
|
||||
try
|
||||
{
|
||||
organizations = OrganizationController.GetOrganizations(packageId, false);
|
||||
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
throw new ApplicationException(string.Format("Cannot get organizations in current package {0}", packageId), ex);
|
||||
}
|
||||
|
||||
foreach(Organization org in organizations)
|
||||
{
|
||||
try
|
||||
{
|
||||
PopulateOrganizationData(org, report, topReseller);
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
TaskManager.WriteError(ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void PopulateUserData(UserInfo user, EnterpriseSolutionStatisticsReport report, string topReseller)
|
||||
{
|
||||
DataSet ds;
|
||||
try
|
||||
{
|
||||
ds = PackageController.GetRawMyPackages(user.UserId);
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
throw new ApplicationException(string.Format("Cannot get user's spaces {0}", user.UserId), ex);
|
||||
}
|
||||
|
||||
foreach(DataRow row in ds.Tables[0].Rows)
|
||||
{
|
||||
int packageId = (int) row["PackageID"];
|
||||
try
|
||||
{
|
||||
PopulateSpaceData(packageId, report, topReseller);
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
TaskManager.WriteError(ex);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private static void GetUsersData(EnterpriseSolutionStatisticsReport report, int userId, bool generateExchangeReport, bool generateSharePointReport, bool generateCRMReport, bool generateOrganizationReport, string topReseller)
|
||||
{
|
||||
List<UserInfo> users;
|
||||
try
|
||||
{
|
||||
users = UserController.GetUsers(userId, false);
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
throw new ApplicationException("Cannot get users for report", ex);
|
||||
}
|
||||
|
||||
|
||||
foreach (UserInfo user in users)
|
||||
{
|
||||
try
|
||||
{
|
||||
PopulateUserData(user, report, topReseller);
|
||||
|
||||
if (user.Role == UserRole.Reseller || user.Role == UserRole.Administrator)
|
||||
{
|
||||
GetUsersData(report, user.UserId, generateExchangeReport, generateSharePointReport,
|
||||
generateCRMReport,
|
||||
generateOrganizationReport,
|
||||
string.IsNullOrEmpty(topReseller) ? user.Username : topReseller);
|
||||
}
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
TaskManager.WriteError(ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static EnterpriseSolutionStatisticsReport GetEnterpriseSolutionStatisticsReport(int userId, bool generateExchangeReport, bool generateSharePointReport, bool generateCRMReport, bool generateOrganizationReport)
|
||||
{
|
||||
EnterpriseSolutionStatisticsReport report = new EnterpriseSolutionStatisticsReport();
|
||||
|
||||
if (generateExchangeReport || generateOrganizationReport)
|
||||
report.ExchangeReport = new ExchangeStatisticsReport();
|
||||
|
||||
if (generateSharePointReport || generateOrganizationReport)
|
||||
report.SharePointReport = new SharePointStatisticsReport();
|
||||
|
||||
if (generateCRMReport || generateOrganizationReport)
|
||||
report.CRMReport = new CRMStatisticsReport();
|
||||
|
||||
if (generateOrganizationReport)
|
||||
report.OrganizationReport = new OrganizationStatisticsReport();
|
||||
|
||||
|
||||
try
|
||||
{
|
||||
GetUsersData(report, userId, generateExchangeReport, generateSharePointReport, generateCRMReport,
|
||||
generateOrganizationReport, null);
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
TaskManager.WriteError(ex, "Cannot get enterprise solution statistics report");
|
||||
}
|
||||
|
||||
return report;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,111 @@
|
|||
// Copyright (c) 2011, 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.Data;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace WebsitePanel.EnterpriseServer
|
||||
{
|
||||
public class AuditLog
|
||||
{
|
||||
public static DataSet GetAuditLogRecordsPaged(int userId, int packageId, int itemId, string itemName, DateTime startDate, DateTime endDate,
|
||||
int severityId, string sourceName, string taskName, string sortColumn, int startRow, int maximumRows)
|
||||
{
|
||||
return DataProvider.GetAuditLogRecordsPaged(SecurityContext.User.UserId,
|
||||
userId, packageId, itemId, itemName, GetStartDate(startDate), GetEndDate(endDate),
|
||||
severityId, sourceName, taskName, sortColumn, startRow, maximumRows);
|
||||
}
|
||||
|
||||
public static DataSet GetAuditLogSources()
|
||||
{
|
||||
return DataProvider.GetAuditLogSources();
|
||||
}
|
||||
|
||||
public static DataSet GetAuditLogTasks(string sourceName)
|
||||
{
|
||||
return DataProvider.GetAuditLogTasks(sourceName);
|
||||
}
|
||||
|
||||
public static LogRecord GetAuditLogRecord(string recordId)
|
||||
{
|
||||
return ObjectUtils.FillObjectFromDataReader<LogRecord>(
|
||||
DataProvider.GetAuditLogRecord(recordId));
|
||||
}
|
||||
|
||||
public static int DeleteAuditLogRecords(int userId, int itemId, string itemName,
|
||||
DateTime startDate, DateTime endDate, int severityId, string sourceName, string taskName)
|
||||
{
|
||||
// check account
|
||||
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo);
|
||||
if (accountCheck < 0) return accountCheck;
|
||||
|
||||
DataProvider.DeleteAuditLogRecords(SecurityContext.User.UserId,
|
||||
userId, itemId, itemName, GetStartDate(startDate), GetEndDate(endDate), severityId, sourceName, taskName);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
public static int DeleteAuditLogRecordsComplete()
|
||||
{
|
||||
// check account
|
||||
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsAdmin);
|
||||
if (accountCheck < 0) return accountCheck;
|
||||
|
||||
DataProvider.DeleteAuditLogRecordsComplete();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
public static void AddAuditLogRecord(string recordId, int severityId, int userId, string username,
|
||||
int packageId, int itemId, string itemName, DateTime startDate, DateTime finishDate,
|
||||
string sourceName, string taskName, string executionLog)
|
||||
{
|
||||
try
|
||||
{
|
||||
DataProvider.AddAuditLogRecord(recordId, severityId, userId, username, packageId, itemId, itemName,
|
||||
startDate, finishDate, sourceName, taskName, executionLog);
|
||||
}
|
||||
catch
|
||||
{
|
||||
// skip error
|
||||
}
|
||||
}
|
||||
|
||||
private static DateTime GetStartDate(DateTime d)
|
||||
{
|
||||
return new DateTime(d.Year, d.Month, d.Day, 0, 0, 0);
|
||||
}
|
||||
|
||||
private static DateTime GetEndDate(DateTime d)
|
||||
{
|
||||
return new DateTime(d.Year, d.Month, d.Day, 23, 59, 59);
|
||||
}
|
||||
}
|
||||
}
|
File diff suppressed because it is too large
Load diff
|
@ -0,0 +1,58 @@
|
|||
// Copyright (c) 2011, 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.Data;
|
||||
using System.Configuration;
|
||||
using System.Web;
|
||||
using System.Web.Security;
|
||||
using System.Web.UI;
|
||||
using System.Web.UI.HtmlControls;
|
||||
using System.Web.UI.WebControls;
|
||||
using System.Web.UI.WebControls.WebParts;
|
||||
|
||||
namespace WebsitePanel.EnterpriseServer.Code.MailServers
|
||||
{
|
||||
public class QuotaLimit
|
||||
{
|
||||
private bool isExceeded;
|
||||
private string message;
|
||||
|
||||
public bool IsExceeded
|
||||
{
|
||||
get { return this.isExceeded; }
|
||||
set { isExceeded = value; }
|
||||
}
|
||||
|
||||
public string Message
|
||||
{
|
||||
get { return this.message;}
|
||||
set { message = value; }
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,689 @@
|
|||
// Copyright (c) 2011, 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.IO;
|
||||
using System.Data;
|
||||
using System.Collections.Generic;
|
||||
using System.Collections.Specialized;
|
||||
using System.Text;
|
||||
using System.Xml;
|
||||
using System.Xml.Serialization;
|
||||
|
||||
using WebsitePanel.Server;
|
||||
using WebsitePanel.Providers;
|
||||
using WebsitePanel.Providers.OS;
|
||||
using OS = WebsitePanel.Providers.OS;
|
||||
|
||||
namespace WebsitePanel.EnterpriseServer
|
||||
{
|
||||
public class OperatingSystemController : IImportController, IBackupController
|
||||
{
|
||||
private const int FILE_BUFFER_LENGTH = 5000000; // ~5MB
|
||||
|
||||
private static OS.OperatingSystem GetOS(int serviceId)
|
||||
{
|
||||
OS.OperatingSystem os = new OS.OperatingSystem();
|
||||
ServiceProviderProxy.Init(os, serviceId);
|
||||
return os;
|
||||
}
|
||||
|
||||
#region ODBC DSNs
|
||||
public static DataSet GetRawOdbcSourcesPaged(int packageId,
|
||||
string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows)
|
||||
{
|
||||
return PackageController.GetRawPackageItemsPaged(packageId, ResourceGroups.Os, typeof(SystemDSN),
|
||||
true, filterColumn, filterValue, sortColumn, startRow, maximumRows);
|
||||
}
|
||||
|
||||
public static List<SystemDSN> GetOdbcSources(int packageId, bool recursive)
|
||||
{
|
||||
List<ServiceProviderItem> items = PackageController.GetPackageItemsByType(
|
||||
packageId, ResourceGroups.Os, typeof(SystemDSN), recursive);
|
||||
|
||||
return items.ConvertAll<SystemDSN>(
|
||||
new Converter<ServiceProviderItem, SystemDSN>(ConvertItemToSystemDSN));
|
||||
}
|
||||
|
||||
private static SystemDSN ConvertItemToSystemDSN(ServiceProviderItem item)
|
||||
{
|
||||
return (SystemDSN)item;
|
||||
}
|
||||
|
||||
public static string[] GetInstalledOdbcDrivers(int packageId)
|
||||
{
|
||||
// load service item
|
||||
int serviceId = PackageController.GetPackageServiceId(packageId, ResourceGroups.Os);
|
||||
OS.OperatingSystem os = GetOS(serviceId);
|
||||
return os.GetInstalledOdbcDrivers();
|
||||
}
|
||||
|
||||
public static SystemDSN GetOdbcSource(int itemId)
|
||||
{
|
||||
// load meta item
|
||||
SystemDSN item = (SystemDSN)PackageController.GetPackageItem(itemId);
|
||||
|
||||
// load service item
|
||||
OS.OperatingSystem os = GetOS(item.ServiceId);
|
||||
SystemDSN dsn = os.GetDSN(item.Name);
|
||||
|
||||
// add common properties
|
||||
dsn.Id = item.Id;
|
||||
dsn.PackageId = item.PackageId;
|
||||
dsn.ServiceId = item.ServiceId;
|
||||
|
||||
if(dsn.Driver == "MsAccess" || dsn.Driver == "Excel" || dsn.Driver == "Text")
|
||||
dsn.DatabaseName = FilesController.GetVirtualPackagePath(item.PackageId, dsn.DatabaseName);
|
||||
|
||||
return dsn;
|
||||
}
|
||||
|
||||
public static int AddOdbcSource(SystemDSN item)
|
||||
{
|
||||
// check account
|
||||
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive);
|
||||
if (accountCheck < 0) return accountCheck;
|
||||
|
||||
// check package
|
||||
int packageCheck = SecurityContext.CheckPackage(item.PackageId, DemandPackage.IsActive);
|
||||
if (packageCheck < 0) return packageCheck;
|
||||
|
||||
// check quota
|
||||
QuotaValueInfo quota = PackageController.GetPackageQuota(item.PackageId, Quotas.OS_ODBC);
|
||||
if (quota.QuotaExhausted)
|
||||
return BusinessErrorCodes.ERROR_OS_DSN_RESOURCE_QUOTA_LIMIT;
|
||||
|
||||
// check if mail resource is available
|
||||
int serviceId = PackageController.GetPackageServiceId(item.PackageId, ResourceGroups.Os);
|
||||
if (serviceId == 0)
|
||||
return BusinessErrorCodes.ERROR_OS_RESOURCE_UNAVAILABLE;
|
||||
|
||||
// check package items
|
||||
if (PackageController.GetPackageItemByName(item.PackageId, item.Name, typeof(SystemDSN)) != null)
|
||||
return BusinessErrorCodes.ERROR_OS_DSN_PACKAGE_ITEM_EXISTS;
|
||||
|
||||
// place log record
|
||||
TaskManager.StartTask("ODBC_DSN", "ADD", item.Name);
|
||||
|
||||
try
|
||||
{
|
||||
// check service items
|
||||
OS.OperatingSystem os = GetOS(serviceId);
|
||||
if (os.GetDSN(item.Name) != null)
|
||||
return BusinessErrorCodes.ERROR_OS_DSN_SERVICE_ITEM_EXISTS;
|
||||
|
||||
string[] dbNameParts = item.DatabaseName.Split('|');
|
||||
string groupName = null;
|
||||
if (dbNameParts.Length > 1)
|
||||
{
|
||||
item.DatabaseName = dbNameParts[0];
|
||||
groupName = dbNameParts[1];
|
||||
}
|
||||
|
||||
// get database server address
|
||||
item.DatabaseServer = GetDatabaseServerName(groupName, item.PackageId);
|
||||
|
||||
if (item.Driver == "MsAccess" || item.Driver == "Excel" || item.Driver == "Text")
|
||||
item.DatabaseName = FilesController.GetFullPackagePath(item.PackageId, item.DatabaseName);
|
||||
|
||||
// add service item
|
||||
os.CreateDSN(item);
|
||||
|
||||
// save item
|
||||
item.DatabasePassword = CryptoUtils.Encrypt(item.DatabasePassword);
|
||||
item.ServiceId = serviceId;
|
||||
int itemId = PackageController.AddPackageItem(item);
|
||||
|
||||
TaskManager.ItemId = itemId;
|
||||
|
||||
return itemId;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw TaskManager.WriteError(ex);
|
||||
}
|
||||
finally
|
||||
{
|
||||
TaskManager.CompleteTask();
|
||||
}
|
||||
}
|
||||
|
||||
public static int UpdateOdbcSource(SystemDSN item)
|
||||
{
|
||||
// check account
|
||||
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive);
|
||||
if (accountCheck < 0) return accountCheck;
|
||||
|
||||
// load original meta item
|
||||
SystemDSN origItem = (SystemDSN)PackageController.GetPackageItem(item.Id);
|
||||
if (origItem == null)
|
||||
return BusinessErrorCodes.ERROR_OS_DSN_PACKAGE_ITEM_NOT_FOUND;
|
||||
|
||||
// check package
|
||||
int packageCheck = SecurityContext.CheckPackage(origItem.PackageId, DemandPackage.IsActive);
|
||||
if (packageCheck < 0) return packageCheck;
|
||||
|
||||
// place log record
|
||||
TaskManager.StartTask("ODBC_DSN", "UPDATE", origItem.Name);
|
||||
TaskManager.ItemId = item.Id;
|
||||
|
||||
try
|
||||
{
|
||||
// get service
|
||||
OS.OperatingSystem os = GetOS(origItem.ServiceId);
|
||||
|
||||
// password
|
||||
item.Driver = origItem.Driver;
|
||||
item.Name = origItem.Name;
|
||||
|
||||
if (item.DatabasePassword == "")
|
||||
item.DatabasePassword = CryptoUtils.Decrypt(origItem.DatabasePassword);
|
||||
|
||||
string[] dbNameParts = item.DatabaseName.Split('|');
|
||||
string groupName = null;
|
||||
if (dbNameParts.Length > 1)
|
||||
{
|
||||
item.DatabaseName = dbNameParts[0];
|
||||
groupName = dbNameParts[1];
|
||||
}
|
||||
|
||||
// get database server address
|
||||
item.DatabaseServer = GetDatabaseServerName(groupName, item.PackageId);
|
||||
|
||||
if (item.Driver == "MsAccess" || item.Driver == "Excel" || item.Driver == "Text")
|
||||
item.DatabaseName = FilesController.GetFullPackagePath(origItem.PackageId, item.DatabaseName);
|
||||
|
||||
// update service item
|
||||
os.UpdateDSN(item);
|
||||
|
||||
// update meta item
|
||||
if (item.DatabasePassword != "")
|
||||
{
|
||||
item.DatabasePassword = CryptoUtils.Encrypt(item.DatabasePassword);
|
||||
PackageController.UpdatePackageItem(item);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw TaskManager.WriteError(ex);
|
||||
}
|
||||
finally
|
||||
{
|
||||
TaskManager.CompleteTask();
|
||||
}
|
||||
}
|
||||
|
||||
private static string GetDatabaseServerName(string groupName, int packageId)
|
||||
{
|
||||
int sqlServiceId = PackageController.GetPackageServiceId(packageId, groupName);
|
||||
if (sqlServiceId > 0)
|
||||
{
|
||||
StringDictionary sqlSettings = ServerController.GetServiceSettings(sqlServiceId);
|
||||
return sqlSettings["ExternalAddress"];
|
||||
}
|
||||
return "";
|
||||
}
|
||||
|
||||
public static int DeleteOdbcSource(int itemId)
|
||||
{
|
||||
// check account
|
||||
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo);
|
||||
if (accountCheck < 0) return accountCheck;
|
||||
|
||||
// load original meta item
|
||||
SystemDSN origItem = (SystemDSN)PackageController.GetPackageItem(itemId);
|
||||
if (origItem == null)
|
||||
return BusinessErrorCodes.ERROR_OS_DSN_PACKAGE_ITEM_NOT_FOUND;
|
||||
|
||||
// place log record
|
||||
TaskManager.StartTask("ODBC_DSN", "DELETE", origItem.Name);
|
||||
TaskManager.ItemId = itemId;
|
||||
|
||||
try
|
||||
{
|
||||
// get service
|
||||
OS.OperatingSystem os = GetOS(origItem.ServiceId);
|
||||
|
||||
// delete service item
|
||||
os.DeleteDSN(origItem.Name);
|
||||
|
||||
// delete meta item
|
||||
PackageController.DeletePackageItem(origItem.Id);
|
||||
|
||||
return 0;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw TaskManager.WriteError(ex);
|
||||
}
|
||||
finally
|
||||
{
|
||||
TaskManager.CompleteTask();
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
private static WindowsServer GetServerService(int serverId)
|
||||
{
|
||||
WindowsServer winServer = new WindowsServer();
|
||||
ServiceProviderProxy.ServerInit(winServer, serverId);
|
||||
return winServer;
|
||||
}
|
||||
|
||||
#region Terminal Services Sessions
|
||||
public static TerminalSession[] GetTerminalServicesSessions(int serverId)
|
||||
{
|
||||
return GetServerService(serverId).GetTerminalServicesSessions();
|
||||
}
|
||||
|
||||
public static int CloseTerminalServicesSession(int serverId, int sessionId)
|
||||
{
|
||||
// check account
|
||||
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsAdmin
|
||||
| DemandAccount.IsActive);
|
||||
if (accountCheck < 0) return accountCheck;
|
||||
|
||||
// load server info
|
||||
ServerInfo server = ServerController.GetServerById(serverId);
|
||||
|
||||
// place log record
|
||||
TaskManager.StartTask("SERVER", "RESET_TERMINAL_SESSION", sessionId);
|
||||
TaskManager.ItemId = serverId;
|
||||
|
||||
try
|
||||
{
|
||||
GetServerService(serverId).CloseTerminalServicesSession(sessionId);
|
||||
return 0;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw TaskManager.WriteError(ex);
|
||||
}
|
||||
finally
|
||||
{
|
||||
TaskManager.CompleteTask();
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Windows Processes
|
||||
public static WindowsProcess[] GetWindowsProcesses(int serverId)
|
||||
{
|
||||
return GetServerService(serverId).GetWindowsProcesses();
|
||||
}
|
||||
|
||||
public static int TerminateWindowsProcess(int serverId, int pid)
|
||||
{
|
||||
// check account
|
||||
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsAdmin
|
||||
| DemandAccount.IsActive);
|
||||
if (accountCheck < 0) return accountCheck;
|
||||
|
||||
// load server info
|
||||
ServerInfo server = ServerController.GetServerById(serverId);
|
||||
|
||||
// place log record
|
||||
TaskManager.StartTask("SERVER", "TERMINATE_SYSTEM_PROCESS", pid);
|
||||
TaskManager.ItemId = serverId;
|
||||
|
||||
try
|
||||
{
|
||||
GetServerService(serverId).TerminateWindowsProcess(pid);
|
||||
return 0;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw TaskManager.WriteError(ex);
|
||||
}
|
||||
finally
|
||||
{
|
||||
TaskManager.CompleteTask();
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Windows Services
|
||||
public static WindowsService[] GetWindowsServices(int serverId)
|
||||
{
|
||||
return GetServerService(serverId).GetWindowsServices();
|
||||
}
|
||||
|
||||
public static int ChangeWindowsServiceStatus(int serverId, string id, WindowsServiceStatus status)
|
||||
{
|
||||
// check account
|
||||
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsAdmin
|
||||
| DemandAccount.IsActive);
|
||||
if (accountCheck < 0) return accountCheck;
|
||||
|
||||
// load server info
|
||||
ServerInfo server = ServerController.GetServerById(serverId);
|
||||
|
||||
// place log record
|
||||
TaskManager.StartTask("SERVER", "CHANGE_WINDOWS_SERVICE_STATUS", id);
|
||||
TaskManager.ItemId = serverId;
|
||||
TaskManager.WriteParameter("New Status", status);
|
||||
|
||||
try
|
||||
{
|
||||
GetServerService(serverId).ChangeWindowsServiceStatus(id, status);
|
||||
return 0;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw TaskManager.WriteError(ex);
|
||||
}
|
||||
finally
|
||||
{
|
||||
TaskManager.CompleteTask();
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Event Viewer
|
||||
public static string[] GetLogNames(int serverId)
|
||||
{
|
||||
return GetServerService(serverId).GetLogNames();
|
||||
}
|
||||
|
||||
public static SystemLogEntry[] GetLogEntries(int serverId, string logName)
|
||||
{
|
||||
return GetServerService(serverId).GetLogEntries(logName);
|
||||
}
|
||||
|
||||
public static SystemLogEntriesPaged GetLogEntriesPaged(int serverId, string logName, int startRow, int maximumRows)
|
||||
{
|
||||
return GetServerService(serverId).GetLogEntriesPaged(logName, startRow, maximumRows);
|
||||
}
|
||||
|
||||
public static int ClearLog(int serverId, string logName)
|
||||
{
|
||||
// check account
|
||||
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsAdmin
|
||||
| DemandAccount.IsActive);
|
||||
if (accountCheck < 0) return accountCheck;
|
||||
|
||||
TaskManager.StartTask("SERVER", "CLEAR_EVENT_LOG", logName);
|
||||
TaskManager.ItemId = serverId;
|
||||
|
||||
try
|
||||
{
|
||||
GetServerService(serverId).ClearLog(logName);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw TaskManager.WriteError(ex);
|
||||
}
|
||||
finally
|
||||
{
|
||||
TaskManager.CompleteTask();
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Server Reboot
|
||||
public static int RebootSystem(int serverId)
|
||||
{
|
||||
// check account
|
||||
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsAdmin
|
||||
| DemandAccount.IsActive);
|
||||
if (accountCheck < 0) return accountCheck;
|
||||
|
||||
// load server info
|
||||
ServerInfo server = ServerController.GetServerById(serverId);
|
||||
|
||||
// place log record
|
||||
TaskManager.StartTask("SERVER", "REBOOT");
|
||||
TaskManager.ItemId = serverId;
|
||||
|
||||
try
|
||||
{
|
||||
GetServerService(serverId).RebootSystem();
|
||||
return 0;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw TaskManager.WriteError(ex);
|
||||
}
|
||||
finally
|
||||
{
|
||||
TaskManager.CompleteTask();
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region IImportController Members
|
||||
|
||||
public List<string> GetImportableItems(int packageId, int itemTypeId, Type itemType,
|
||||
ResourceGroupInfo group)
|
||||
{
|
||||
List<string> items = new List<string>();
|
||||
|
||||
// get service id
|
||||
int serviceId = PackageController.GetPackageServiceId(packageId, group.GroupName);
|
||||
if (serviceId == 0)
|
||||
return items;
|
||||
|
||||
OS.OperatingSystem os = GetOS(serviceId);
|
||||
if (itemType == typeof(SystemDSN))
|
||||
items.AddRange(os.GetDSNNames());
|
||||
|
||||
return items;
|
||||
}
|
||||
|
||||
public void ImportItem(int packageId, int itemTypeId, Type itemType,
|
||||
ResourceGroupInfo group, string itemName)
|
||||
{
|
||||
// get service id
|
||||
int serviceId = PackageController.GetPackageServiceId(packageId, group.GroupName);
|
||||
if (serviceId == 0)
|
||||
return;
|
||||
|
||||
if (itemType == typeof(SystemDSN))
|
||||
{
|
||||
// save DSN info
|
||||
SystemDSN dsn = new SystemDSN();
|
||||
dsn.Name = itemName;
|
||||
dsn.ServiceId = serviceId;
|
||||
dsn.PackageId = packageId;
|
||||
PackageController.AddPackageItem(dsn);
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region IBackupController Members
|
||||
|
||||
public int BackupItem(string tempFolder, System.Xml.XmlWriter writer, ServiceProviderItem item, ResourceGroupInfo group)
|
||||
{
|
||||
if (item is HomeFolder)
|
||||
{
|
||||
// backup home folder files
|
||||
string backupName = String.Format("SpaceFiles_{0}_{1}.zip",
|
||||
item.Id, DateTime.Now.Ticks);
|
||||
|
||||
// get the list of remote files
|
||||
List<SystemFile> files = FilesController.GetFiles(item.PackageId, "\\", true);
|
||||
|
||||
string[] zipFiles = new string[files.Count];
|
||||
for(int i = 0; i < zipFiles.Length; i++)
|
||||
zipFiles[i] = files[i].Name;
|
||||
|
||||
// zip remote files
|
||||
FilesController.ZipFiles(item.PackageId, zipFiles, backupName);
|
||||
|
||||
// download zipped file
|
||||
string localBackupPath = Path.Combine(tempFolder, backupName);
|
||||
|
||||
byte[] buffer = null;
|
||||
FileStream stream = new FileStream(localBackupPath, FileMode.Create, FileAccess.Write);
|
||||
|
||||
int offset = 0;
|
||||
long length = 0;
|
||||
do
|
||||
{
|
||||
// read remote content
|
||||
buffer = FilesController.GetFileBinaryChunk(item.PackageId, backupName, offset, FILE_BUFFER_LENGTH);
|
||||
|
||||
// write remote content
|
||||
stream.Write(buffer, 0, buffer.Length);
|
||||
|
||||
length += buffer.Length;
|
||||
offset += FILE_BUFFER_LENGTH;
|
||||
}
|
||||
while (buffer.Length == FILE_BUFFER_LENGTH);
|
||||
stream.Close();
|
||||
|
||||
// delete zipped file
|
||||
if (FilesController.FileExists(item.PackageId, backupName))
|
||||
FilesController.DeleteFiles(item.PackageId, new string[] { backupName });
|
||||
|
||||
// add file pointer
|
||||
BackupController.WriteFileElement(writer, "SpaceFiles", backupName, length);
|
||||
|
||||
// store meta item
|
||||
XmlSerializer serializer = new XmlSerializer(typeof(HomeFolder));
|
||||
serializer.Serialize(writer, item);
|
||||
}
|
||||
else if (item is SystemDSN)
|
||||
{
|
||||
// backup ODBC DSN
|
||||
OS.OperatingSystem os = GetOS(item.ServiceId);
|
||||
|
||||
// read DSN info
|
||||
SystemDSN itemDsn = item as SystemDSN;
|
||||
SystemDSN dsn = os.GetDSN(item.Name);
|
||||
dsn.DatabasePassword = itemDsn.DatabasePassword;
|
||||
|
||||
XmlSerializer serializer = new XmlSerializer(typeof(SystemDSN));
|
||||
serializer.Serialize(writer, dsn);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
public int RestoreItem(string tempFolder, System.Xml.XmlNode itemNode, int itemId, Type itemType, string itemName, int packageId, int serviceId, ResourceGroupInfo group)
|
||||
{
|
||||
if (itemType == typeof(HomeFolder))
|
||||
{
|
||||
OS.OperatingSystem os = GetOS(serviceId);
|
||||
|
||||
// extract meta item
|
||||
XmlSerializer serializer = new XmlSerializer(typeof(HomeFolder));
|
||||
HomeFolder homeFolder = (HomeFolder)serializer.Deserialize(
|
||||
new XmlNodeReader(itemNode.SelectSingleNode("HomeFolder")));
|
||||
|
||||
// create home folder if required
|
||||
if (!os.DirectoryExists(homeFolder.Name))
|
||||
{
|
||||
os.CreatePackageFolder(homeFolder.Name);
|
||||
}
|
||||
|
||||
// copy database backup to remote server
|
||||
XmlNode fileNode = itemNode.SelectSingleNode("File[@name='SpaceFiles']");
|
||||
string backupFileName = fileNode.Attributes["path"].Value;
|
||||
long backupFileLength = Int64.Parse(fileNode.Attributes["size"].Value);
|
||||
string localBackupFilePath = Path.Combine(tempFolder, backupFileName);
|
||||
|
||||
if (new FileInfo(localBackupFilePath).Length != backupFileLength)
|
||||
return -3;
|
||||
|
||||
FileStream stream = new FileStream(localBackupFilePath, FileMode.Open, FileAccess.Read);
|
||||
byte[] buffer = new byte[FILE_BUFFER_LENGTH];
|
||||
|
||||
int readBytes = 0;
|
||||
long length = 0;
|
||||
string remoteBackupPath = Path.Combine(homeFolder.Name, backupFileName);
|
||||
do
|
||||
{
|
||||
// read package file
|
||||
readBytes = stream.Read(buffer, 0, FILE_BUFFER_LENGTH);
|
||||
length += readBytes;
|
||||
|
||||
if (readBytes < FILE_BUFFER_LENGTH)
|
||||
// resize buffer
|
||||
Array.Resize<byte>(ref buffer, readBytes);
|
||||
|
||||
// write remote backup file
|
||||
os.AppendFileBinaryContent(remoteBackupPath, buffer);
|
||||
}
|
||||
while (readBytes == FILE_BUFFER_LENGTH);
|
||||
stream.Close();
|
||||
|
||||
// unzip files
|
||||
os.UnzipFiles(remoteBackupPath, homeFolder.Name);
|
||||
|
||||
// delete archive
|
||||
if (os.FileExists(remoteBackupPath))
|
||||
os.DeleteFile(remoteBackupPath);
|
||||
|
||||
// add meta-item if required
|
||||
if (PackageController.GetPackageItemByName(packageId, itemName, typeof(HomeFolder)) == null)
|
||||
{
|
||||
homeFolder.PackageId = packageId;
|
||||
homeFolder.ServiceId = serviceId;
|
||||
PackageController.AddPackageItem(homeFolder);
|
||||
}
|
||||
}
|
||||
else if (itemType == typeof(SystemDSN))
|
||||
{
|
||||
OS.OperatingSystem os = GetOS(serviceId);
|
||||
|
||||
// extract meta item
|
||||
XmlSerializer serializer = new XmlSerializer(typeof(SystemDSN));
|
||||
SystemDSN dsn = (SystemDSN)serializer.Deserialize(
|
||||
new XmlNodeReader(itemNode.SelectSingleNode("SystemDSN")));
|
||||
|
||||
// create DSN if required
|
||||
if (os.GetDSN(itemName) == null)
|
||||
{
|
||||
dsn.DatabasePassword = CryptoUtils.Decrypt(dsn.DatabasePassword);
|
||||
os.CreateDSN(dsn);
|
||||
|
||||
// restore password
|
||||
dsn.DatabasePassword = CryptoUtils.Encrypt(dsn.DatabasePassword);
|
||||
}
|
||||
|
||||
// add meta-item if required
|
||||
if (PackageController.GetPackageItemByName(packageId, itemName, typeof(SystemDSN)) == null)
|
||||
{
|
||||
dsn.PackageId = packageId;
|
||||
dsn.ServiceId = serviceId;
|
||||
PackageController.AddPackageItem(dsn);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
|
@ -0,0 +1,235 @@
|
|||
// Copyright (c) 2011, 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.Threading;
|
||||
using WebsitePanel.Providers;
|
||||
|
||||
namespace WebsitePanel.EnterpriseServer
|
||||
{
|
||||
public class PackageAsyncWorker
|
||||
{
|
||||
private int userId = -1;
|
||||
private List<PackageInfo> packages = new List<PackageInfo>();
|
||||
private PackageStatus itemsStatus = PackageStatus.Active;
|
||||
|
||||
#region Public properties
|
||||
public int UserId
|
||||
{
|
||||
get { return this.userId; }
|
||||
set { this.userId = value; }
|
||||
}
|
||||
|
||||
public System.Collections.Generic.List<PackageInfo> Packages
|
||||
{
|
||||
get { return this.packages; }
|
||||
set { this.packages = value; }
|
||||
}
|
||||
|
||||
public PackageStatus ItemsStatus
|
||||
{
|
||||
get { return this.itemsStatus; }
|
||||
set { this.itemsStatus = value; }
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Delete Packages Service Items
|
||||
public void DeletePackagesServiceItemsAsync()
|
||||
{
|
||||
// start asynchronously
|
||||
Thread t = new Thread(new ThreadStart(DeletePackagesServiceItems));
|
||||
t.Start();
|
||||
}
|
||||
|
||||
public void DeletePackagesServiceItems()
|
||||
{
|
||||
// impersonate thread
|
||||
if(userId != -1)
|
||||
SecurityContext.SetThreadPrincipal(userId);
|
||||
|
||||
|
||||
// delete package by package
|
||||
foreach (PackageInfo package in packages)
|
||||
{
|
||||
TaskManager.StartTask("SPACE", "DELETE_ITEMS", package.PackageName);
|
||||
TaskManager.WriteParameter("User", package.UserId);
|
||||
|
||||
// get package service items
|
||||
List<ServiceProviderItem> items = PackageController.GetServiceItemsForStatistics(
|
||||
0, package.PackageId, false, false, false, true); // disposable items
|
||||
|
||||
// order items by service
|
||||
Dictionary<int, List<ServiceProviderItem>> orderedItems =
|
||||
PackageController.OrderServiceItemsByServices(items);
|
||||
|
||||
// delete service items by service sets
|
||||
foreach (int serviceId in orderedItems.Keys)
|
||||
{
|
||||
|
||||
ServiceInfo service = ServerController.GetServiceInfo(serviceId);
|
||||
//Delete Exchange Organization
|
||||
if (service.ProviderId == 103 /*Organizations*/)
|
||||
{
|
||||
OrganizationController.DeleteOrganization(orderedItems[serviceId][0].Id);
|
||||
//int exchangeId = PackageController.GetPackageServiceId(package.PackageId, ResourceGroups.Exchange2007);
|
||||
//ExchangeServerController.DeleteOrganization(orderedItems[serviceId][0].Id);
|
||||
}
|
||||
else
|
||||
ProcessServiceItems(false, false, serviceId, orderedItems[serviceId] );
|
||||
}
|
||||
|
||||
// delete package from database
|
||||
DataProvider.DeletePackage(SecurityContext.User.UserId, package.PackageId);
|
||||
}
|
||||
|
||||
// add log record
|
||||
TaskManager.CompleteTask();
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Change Packages Service Items State
|
||||
public void ChangePackagesServiceItemsStateAsync()
|
||||
{
|
||||
// start asynchronously
|
||||
Thread t = new Thread(new ThreadStart(ChangePackagesServiceItemsState));
|
||||
t.Start();
|
||||
}
|
||||
|
||||
public void ChangePackagesServiceItemsState()
|
||||
{
|
||||
// impersonate thread
|
||||
if (userId != -1)
|
||||
SecurityContext.SetThreadPrincipal(userId);
|
||||
|
||||
TaskManager.StartTask("SPACE", "CHANGE_ITEMS_STATUS");
|
||||
|
||||
// collect required service items
|
||||
List<ServiceProviderItem> items = new List<ServiceProviderItem>();
|
||||
foreach (PackageInfo package in packages)
|
||||
{
|
||||
items.AddRange(PackageController.GetServiceItemsForStatistics(
|
||||
0, package.PackageId, false, false, true, false)); // suspendable items
|
||||
}
|
||||
|
||||
// order items by service
|
||||
Dictionary<int, List<ServiceProviderItem>> orderedItems =
|
||||
PackageController.OrderServiceItemsByServices(items);
|
||||
|
||||
// process items
|
||||
bool enabled = (ItemsStatus == PackageStatus.Active);
|
||||
foreach (int serviceId in orderedItems.Keys)
|
||||
{
|
||||
ProcessServiceItems(true, enabled, serviceId, orderedItems[serviceId]);
|
||||
}
|
||||
|
||||
// add log record
|
||||
TaskManager.CompleteTask();
|
||||
}
|
||||
#endregion
|
||||
|
||||
private void ProcessServiceItems(bool changeState, bool enabled,
|
||||
int serviceId, List<ServiceProviderItem> items)
|
||||
{
|
||||
string methodName = changeState ? "ChangeServiceItemsState" : "DeleteServiceItems";
|
||||
|
||||
int PACKET_SIZE = 10;
|
||||
int ATTEMPTS = 3;
|
||||
|
||||
TaskManager.Write(String.Format("Start analyze {0} service ({1} items)",
|
||||
serviceId, items.Count));
|
||||
|
||||
try
|
||||
{
|
||||
// convert items to SoapObjects by packets of 0
|
||||
int startItem = 0;
|
||||
List<SoapServiceProviderItem> objItems = new List<SoapServiceProviderItem>();
|
||||
|
||||
for (int i = 0; i < items.Count; i++)
|
||||
{
|
||||
// add to the packet
|
||||
objItems.Add(SoapServiceProviderItem.Wrap(items[i]));
|
||||
|
||||
if (((i > 0) && (i % PACKET_SIZE == 0))
|
||||
|| i == (items.Count - 1)) // packet is ready
|
||||
{
|
||||
if (objItems.Count == 0)
|
||||
continue;
|
||||
|
||||
int attempt = 0;
|
||||
bool success = false;
|
||||
while (attempt < ATTEMPTS)
|
||||
{
|
||||
// increment attempt
|
||||
attempt++;
|
||||
|
||||
try
|
||||
{
|
||||
// send packet for calculation
|
||||
// invoke service provider
|
||||
TaskManager.Write(String.Format("Invoke {0} method ('{1}' - '{2}' items) - {3} attempt",
|
||||
methodName, items[startItem].Name, items[i].Name, attempt));
|
||||
|
||||
ServiceProvider prov = new ServiceProvider();
|
||||
ServiceProviderProxy.Init(prov, serviceId);
|
||||
|
||||
if (changeState)
|
||||
prov.ChangeServiceItemsState(objItems.ToArray(), enabled);
|
||||
else
|
||||
prov.DeleteServiceItems(objItems.ToArray());
|
||||
|
||||
// exit from the loop
|
||||
success = true;
|
||||
break;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.WriteWarning(ex.ToString());
|
||||
}
|
||||
}
|
||||
|
||||
if (!success)
|
||||
throw new Exception("The number of attemtps has been reached. The whole operation aborted.");
|
||||
|
||||
// reset packet counter
|
||||
startItem = i + 1;
|
||||
objItems.Clear();
|
||||
}
|
||||
} // end for items
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
// log exception
|
||||
TaskManager.WriteWarning(ex.ToString());
|
||||
}
|
||||
|
||||
TaskManager.Write(String.Format("End analyze {0} service ({1} items)",
|
||||
serviceId, items.Count));
|
||||
}
|
||||
}
|
||||
}
|
File diff suppressed because it is too large
Load diff
|
@ -0,0 +1,54 @@
|
|||
// Copyright (c) 2011, 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.Text;
|
||||
|
||||
using WebsitePanel.Providers;
|
||||
|
||||
namespace WebsitePanel.EnterpriseServer
|
||||
{
|
||||
public class ServiceItemsPaged
|
||||
{
|
||||
int recordsCount;
|
||||
ServiceProviderItem[] pageItems;
|
||||
|
||||
public int RecordsCount
|
||||
{
|
||||
get { return this.recordsCount; }
|
||||
set { this.recordsCount = value; }
|
||||
}
|
||||
|
||||
public WebsitePanel.Providers.ServiceProviderItem[] PageItems
|
||||
{
|
||||
get { return this.pageItems; }
|
||||
set { this.pageItems = value; }
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,92 @@
|
|||
// Copyright (c) 2011, 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.Threading;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace WebsitePanel.EnterpriseServer
|
||||
{
|
||||
public class BackupAsyncWorker
|
||||
{
|
||||
public int threadUserId = -1;
|
||||
public string taskId;
|
||||
public int userId;
|
||||
public int packageId;
|
||||
public int serviceId;
|
||||
public int serverId;
|
||||
public string backupFileName;
|
||||
public int storePackageId;
|
||||
public string storePackageFolder;
|
||||
public string storeServerFolder;
|
||||
public string storePackageBackupPath;
|
||||
public string storeServerBackupPath;
|
||||
public bool deleteTempBackup;
|
||||
|
||||
#region Backup
|
||||
public void BackupAsync()
|
||||
{
|
||||
// start asynchronously
|
||||
Thread t = new Thread(new ThreadStart(Backup));
|
||||
t.Start();
|
||||
}
|
||||
|
||||
public void Backup()
|
||||
{
|
||||
// impersonate thread
|
||||
if (threadUserId != -1)
|
||||
SecurityContext.SetThreadPrincipal(threadUserId);
|
||||
|
||||
// perform backup
|
||||
BackupController.BackupInternal(taskId, userId, packageId, serviceId, serverId, backupFileName, storePackageId,
|
||||
storePackageFolder, storeServerFolder, deleteTempBackup);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Restore
|
||||
public void RestoreAsync()
|
||||
{
|
||||
// start asynchronously
|
||||
Thread t = new Thread(new ThreadStart(Restore));
|
||||
t.Start();
|
||||
}
|
||||
|
||||
public void Restore()
|
||||
{
|
||||
// impersonate thread
|
||||
if (threadUserId != -1)
|
||||
SecurityContext.SetThreadPrincipal(threadUserId);
|
||||
|
||||
// perform restore
|
||||
BackupController.RestoreInternal(taskId, userId, packageId, serviceId, serverId,
|
||||
storePackageId, storePackageBackupPath, storeServerBackupPath);
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
|
@ -0,0 +1,922 @@
|
|||
// Copyright (c) 2011, 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.IO;
|
||||
using System.Data;
|
||||
using System.Text;
|
||||
using System.Collections.Generic;
|
||||
using System.Xml;
|
||||
using System.Security.Cryptography;
|
||||
using System.Security.Cryptography.Xml;
|
||||
|
||||
using WebsitePanel.Providers;
|
||||
using OS = WebsitePanel.Providers.OS;
|
||||
using WebsitePanel.Ecommerce.EnterpriseServer;
|
||||
|
||||
namespace WebsitePanel.EnterpriseServer
|
||||
{
|
||||
public class BackupController
|
||||
{
|
||||
public const string BACKUP_CATALOG_FILE_NAME = "BackupCatalog.xml";
|
||||
private const int FILE_BUFFER_LENGTH = 5000000; // ~5MB
|
||||
private const string RSA_SETTINGS_KEY = "RSA_KEY";
|
||||
|
||||
public static int Backup(bool async, string taskId, int userId, int packageId, int serviceId, int serverId,
|
||||
string backupFileName, int storePackageId, string storePackageFolder, string storeServerFolder,
|
||||
bool deleteTempBackup)
|
||||
{
|
||||
// check demo account
|
||||
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive);
|
||||
if (accountCheck < 0) return accountCheck;
|
||||
|
||||
// check admin account
|
||||
accountCheck = SecurityContext.CheckAccount(DemandAccount.IsAdmin);
|
||||
if ((serviceId > 0 || serverId > 0) && accountCheck < 0) return accountCheck;
|
||||
|
||||
if (accountCheck < 0)
|
||||
deleteTempBackup = true;
|
||||
|
||||
// check if backup temp folder is available
|
||||
string tempFolder = GetTempBackupFolder();
|
||||
if (!FolderWriteAccessible(tempFolder))
|
||||
return BusinessErrorCodes.ERROR_BACKUP_TEMP_FOLDER_UNAVAILABLE;
|
||||
|
||||
// check destination folder if required
|
||||
if (!String.IsNullOrEmpty(storePackageFolder) &&
|
||||
!RemoteServerFolderWriteAccessible(storePackageId, storePackageFolder))
|
||||
return BusinessErrorCodes.ERROR_BACKUP_DEST_FOLDER_UNAVAILABLE;
|
||||
|
||||
// check server folder if required
|
||||
if (!String.IsNullOrEmpty(storeServerFolder) &&
|
||||
!FolderWriteAccessible(storeServerFolder))
|
||||
return BusinessErrorCodes.ERROR_BACKUP_SERVER_FOLDER_UNAVAILABLE;
|
||||
|
||||
// check/reset delete flag
|
||||
accountCheck = SecurityContext.CheckAccount(DemandAccount.IsAdmin);
|
||||
if (accountCheck < 0 && !deleteTempBackup)
|
||||
deleteTempBackup = true;
|
||||
|
||||
if (async)
|
||||
{
|
||||
BackupAsyncWorker worker = new BackupAsyncWorker();
|
||||
worker.threadUserId = SecurityContext.User.UserId;
|
||||
worker.taskId = taskId;
|
||||
worker.userId = userId;
|
||||
worker.packageId = packageId;
|
||||
worker.serviceId = serviceId;
|
||||
worker.serverId = serverId;
|
||||
worker.backupFileName = backupFileName;
|
||||
worker.storePackageId = storePackageId;
|
||||
worker.storePackageFolder = storePackageFolder;
|
||||
worker.storeServerFolder = storeServerFolder;
|
||||
worker.deleteTempBackup = deleteTempBackup;
|
||||
|
||||
// run
|
||||
worker.BackupAsync();
|
||||
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
return BackupInternal(taskId, userId, packageId, serviceId, serverId,
|
||||
backupFileName, storePackageId, storePackageFolder, storeServerFolder,
|
||||
deleteTempBackup);
|
||||
}
|
||||
}
|
||||
|
||||
public static int BackupInternal(string taskId, int userId, int packageId, int serviceId, int serverId,
|
||||
string backupFileName, int storePackageId, string storePackageFolder, string storeServerFolder,
|
||||
bool deleteTempBackup)
|
||||
{
|
||||
try
|
||||
{
|
||||
TaskManager.StartTask(taskId, "BACKUP", "BACKUP", backupFileName);
|
||||
TaskManager.ItemId = SecurityContext.User.UserId;
|
||||
|
||||
// get the list of items to backup
|
||||
TaskManager.Write("Calculate items to backup");
|
||||
List<ServiceProviderItem> items = GetBackupItems(userId, packageId, serviceId, serverId);
|
||||
|
||||
if (items.Count == 0)
|
||||
return 0;
|
||||
|
||||
// group items by item types
|
||||
Dictionary<int, List<ServiceProviderItem>> groupedItems = new Dictionary<int, List<ServiceProviderItem>>();
|
||||
|
||||
// sort by groups
|
||||
foreach (ServiceProviderItem item in items)
|
||||
{
|
||||
// add to group
|
||||
if (!groupedItems.ContainsKey(item.TypeId))
|
||||
groupedItems[item.TypeId] = new List<ServiceProviderItem>();
|
||||
|
||||
groupedItems[item.TypeId].Add(item);
|
||||
}
|
||||
|
||||
// temp backup folder
|
||||
string tempFolder = GetTempBackupFolder();
|
||||
|
||||
// create backup catalog file
|
||||
StringWriter sw = new StringWriter();
|
||||
XmlTextWriter writer = new XmlTextWriter(sw);
|
||||
|
||||
// write backup file header
|
||||
writer.WriteProcessingInstruction("xml", "version=\"1.0\" encoding=\"utf-8\"");
|
||||
writer.WriteStartElement("Backup");
|
||||
writer.WriteStartElement("Info");
|
||||
writer.WriteElementString("Name", backupFileName);
|
||||
writer.WriteElementString("Created", DateTime.Now.ToString("r"));
|
||||
writer.WriteElementString("User", GetLoggedUsername());
|
||||
writer.WriteEndElement(); // Info
|
||||
|
||||
// determine the number of items to backup
|
||||
int totalItems = 0;
|
||||
foreach (int itemTypeId in groupedItems.Keys)
|
||||
{
|
||||
// load item type
|
||||
ServiceProviderItemType itemType = PackageController.GetServiceItemType(itemTypeId);
|
||||
if (!itemType.Backupable)
|
||||
continue;
|
||||
|
||||
totalItems += groupedItems[itemTypeId].Count;
|
||||
}
|
||||
|
||||
TaskManager.IndicatorMaximum = totalItems + 2;
|
||||
TaskManager.IndicatorCurrent = 0;
|
||||
|
||||
// backup grouped items
|
||||
writer.WriteStartElement("Items");
|
||||
foreach (int itemTypeId in groupedItems.Keys)
|
||||
{
|
||||
// load item type
|
||||
ServiceProviderItemType itemType = PackageController.GetServiceItemType(itemTypeId);
|
||||
if (!itemType.Backupable)
|
||||
continue;
|
||||
|
||||
// load group
|
||||
ResourceGroupInfo group = ServerController.GetResourceGroup(itemType.GroupId);
|
||||
|
||||
// instantiate controller
|
||||
IBackupController controller = null;
|
||||
try
|
||||
{
|
||||
controller = Activator.CreateInstance(Type.GetType(group.GroupController)) as IBackupController;
|
||||
if (controller != null)
|
||||
{
|
||||
// backup items
|
||||
foreach (ServiceProviderItem item in groupedItems[itemTypeId])
|
||||
{
|
||||
TaskManager.Write(String.Format("Backup {0} of {1} - {2} '{3}'",
|
||||
TaskManager.IndicatorCurrent + 1,
|
||||
totalItems,
|
||||
itemType.DisplayName,
|
||||
item.Name));
|
||||
|
||||
try
|
||||
{
|
||||
int backupResult = BackupItem(tempFolder, writer, item, group, controller);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.WriteError(ex, "Can't backup item");
|
||||
}
|
||||
|
||||
// increment progress
|
||||
TaskManager.IndicatorCurrent += 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.WriteError(ex);
|
||||
}
|
||||
}
|
||||
writer.WriteEndElement(); // Items
|
||||
|
||||
// close catalog writer
|
||||
writer.WriteEndElement(); // Backup
|
||||
writer.Close();
|
||||
|
||||
// convert to Xml document
|
||||
XmlDocument doc = new XmlDocument();
|
||||
doc.LoadXml(sw.ToString());
|
||||
|
||||
// sign XML document
|
||||
//SignXmlDocument(doc);
|
||||
|
||||
// save signed doc to file
|
||||
try
|
||||
{
|
||||
doc.Save(Path.Combine(tempFolder, BACKUP_CATALOG_FILE_NAME));
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.WriteError(ex, "Can't save backup catalog file: "
|
||||
+ Path.Combine(tempFolder, BACKUP_CATALOG_FILE_NAME));
|
||||
return 0;
|
||||
}
|
||||
|
||||
TaskManager.Write("Packaging backup...");
|
||||
|
||||
// compress backup files
|
||||
string[] zipFiles = Directory.GetFiles(tempFolder);
|
||||
string[] zipFileNames = new string[zipFiles.Length];
|
||||
for (int i = 0; i < zipFiles.Length; i++)
|
||||
zipFileNames[i] = Path.GetFileName(zipFiles[i]);
|
||||
|
||||
string backupFileNamePath = Path.Combine(tempFolder, backupFileName);
|
||||
|
||||
try
|
||||
{
|
||||
FileUtils.ZipFiles(backupFileNamePath, tempFolder, zipFileNames);
|
||||
|
||||
// delete packed files
|
||||
foreach (string zipFile in zipFiles)
|
||||
File.Delete(zipFile);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.WriteError(ex, "Can't zip backed up files");
|
||||
return 0;
|
||||
}
|
||||
|
||||
TaskManager.IndicatorCurrent += 1;
|
||||
|
||||
TaskManager.Write("Copying backup...");
|
||||
// move/copy backup file
|
||||
if (!String.IsNullOrEmpty(storeServerFolder))
|
||||
{
|
||||
// copy to local folder or UNC
|
||||
try
|
||||
{
|
||||
string destFile = Path.Combine(storeServerFolder, backupFileName);
|
||||
File.Copy(backupFileNamePath, destFile, true);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.WriteError(ex, "Can't copy backup to destination location");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
else if (storePackageId > 0)
|
||||
{
|
||||
try
|
||||
{
|
||||
// copy to space folder
|
||||
int osServiceId = PackageController.GetPackageServiceId(storePackageId, ResourceGroups.Os);
|
||||
if (osServiceId > 0)
|
||||
{
|
||||
OS.OperatingSystem os = new OS.OperatingSystem();
|
||||
ServiceProviderProxy.Init(os, osServiceId);
|
||||
|
||||
string remoteBackupPath = FilesController.GetFullPackagePath(storePackageId,
|
||||
Path.Combine(storePackageFolder, backupFileName));
|
||||
|
||||
FileStream stream = new FileStream(backupFileNamePath, FileMode.Open, FileAccess.Read);
|
||||
byte[] buffer = new byte[FILE_BUFFER_LENGTH];
|
||||
|
||||
int readBytes = 0;
|
||||
do
|
||||
{
|
||||
// read package file
|
||||
readBytes = stream.Read(buffer, 0, FILE_BUFFER_LENGTH);
|
||||
|
||||
if (readBytes < FILE_BUFFER_LENGTH)
|
||||
// resize buffer
|
||||
Array.Resize<byte>(ref buffer, readBytes);
|
||||
|
||||
// write remote backup file
|
||||
os.AppendFileBinaryContent(remoteBackupPath, buffer);
|
||||
}
|
||||
while (readBytes == FILE_BUFFER_LENGTH);
|
||||
stream.Close();
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.WriteError(ex, "Can't copy backup to destination hosting space");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
TaskManager.IndicatorCurrent += 1;
|
||||
|
||||
// delete backup file if required
|
||||
if (deleteTempBackup)
|
||||
{
|
||||
try
|
||||
{
|
||||
// delete backup folder and all its contents
|
||||
Directory.Delete(tempFolder, true);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.WriteError(ex, "Can't delete temporary backup folder");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.WriteError(ex);
|
||||
}
|
||||
finally
|
||||
{
|
||||
TaskManager.CompleteTask();
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
public static List<ServiceProviderItem> GetBackupItems(int userId,
|
||||
int packageId, int serviceId, int serverId)
|
||||
{
|
||||
List<ServiceProviderItem> items = new List<ServiceProviderItem>();
|
||||
|
||||
if (packageId > 0)
|
||||
{
|
||||
items.AddRange(PackageController.GetPackageItems(packageId));
|
||||
}
|
||||
else if (serviceId > 0)
|
||||
{
|
||||
items.AddRange(PackageController.GetServiceItems(serviceId));
|
||||
}
|
||||
else if (serverId > 0)
|
||||
{
|
||||
// get server services
|
||||
List<ServiceInfo> services = ServerController.GetServicesByServerId(serverId);
|
||||
foreach (ServiceInfo service in services)
|
||||
items.AddRange(PackageController.GetServiceItems(service.ServiceId));
|
||||
}
|
||||
else if (userId > 0)
|
||||
{
|
||||
List<PackageInfo> packages = new List<PackageInfo>();
|
||||
|
||||
// get own spaces
|
||||
packages.AddRange(PackageController.GetMyPackages(userId));
|
||||
|
||||
// get user spaces
|
||||
packages.AddRange(PackageController.GetPackages(userId));
|
||||
|
||||
// build collection
|
||||
foreach (PackageInfo package in packages)
|
||||
items.AddRange(PackageController.GetPackageItems(package.PackageId));
|
||||
}
|
||||
return items;
|
||||
}
|
||||
|
||||
public static KeyValueBunch GetBackupContentSummary(int userId, int packageId,
|
||||
int serviceId, int serverId)
|
||||
{
|
||||
Dictionary<string, List<string>> summary = new Dictionary<string, List<string>>();
|
||||
// Get backup items
|
||||
List<ServiceProviderItem> items = GetBackupItems(userId, packageId, serviceId, serverId);
|
||||
// Prepare filter for in-loop sort
|
||||
ServiceProviderItemType[] itemTypes = PackageController.GetServiceItemTypes().ToArray();
|
||||
// Group service items by type id
|
||||
foreach (ServiceProviderItem si in items)
|
||||
{
|
||||
ServiceProviderItemType itemType = Array.Find<ServiceProviderItemType>(itemTypes,
|
||||
x => x.ItemTypeId == si.TypeId && x.Backupable);
|
||||
// Sort out item types without backup capabilities
|
||||
if (itemType != null)
|
||||
{
|
||||
// Mimic a grouping sort
|
||||
if (!summary.ContainsKey(itemType.DisplayName))
|
||||
summary.Add(itemType.DisplayName, new List<string>());
|
||||
//
|
||||
summary[itemType.DisplayName].Add(si.Name);
|
||||
}
|
||||
}
|
||||
//
|
||||
KeyValueBunch result = new KeyValueBunch();
|
||||
// Convert grouped data into serializable format
|
||||
foreach (string groupName in summary.Keys)
|
||||
result[groupName] = String.Join(",", summary[groupName].ToArray());
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
public static int Restore(bool async, string taskId, int userId, int packageId, int serviceId, int serverId,
|
||||
int storePackageId, string storePackageBackupPath, string storeServerBackupPath)
|
||||
{
|
||||
// check demo account
|
||||
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo);
|
||||
if (accountCheck < 0) return accountCheck;
|
||||
|
||||
// check admin account
|
||||
accountCheck = SecurityContext.CheckAccount(DemandAccount.IsAdmin);
|
||||
if ((serviceId > 0 || serverId > 0) && accountCheck < 0) return accountCheck;
|
||||
|
||||
// check if backup temp folder is available
|
||||
string tempFolder = GetTempBackupFolder();
|
||||
if (!FolderWriteAccessible(tempFolder))
|
||||
return BusinessErrorCodes.ERROR_BACKUP_TEMP_FOLDER_UNAVAILABLE;
|
||||
|
||||
// check server source path if required
|
||||
if (!String.IsNullOrEmpty(storeServerBackupPath))
|
||||
{
|
||||
try
|
||||
{
|
||||
if (!File.Exists(storeServerBackupPath))
|
||||
return BusinessErrorCodes.ERROR_RESTORE_BACKUP_SOURCE_NOT_FOUND;
|
||||
}
|
||||
catch
|
||||
{
|
||||
return BusinessErrorCodes.ERROR_RESTORE_BACKUP_SOURCE_UNAVAILABLE;
|
||||
}
|
||||
}
|
||||
|
||||
if (async)
|
||||
{
|
||||
BackupAsyncWorker worker = new BackupAsyncWorker();
|
||||
worker.threadUserId = SecurityContext.User.UserId;
|
||||
worker.taskId = taskId;
|
||||
worker.userId = userId;
|
||||
worker.packageId = packageId;
|
||||
worker.serviceId = serviceId;
|
||||
worker.serverId = serverId;
|
||||
worker.storePackageId = storePackageId;
|
||||
worker.storePackageBackupPath = storePackageBackupPath;
|
||||
worker.storeServerBackupPath = storeServerBackupPath;
|
||||
|
||||
// run
|
||||
worker.RestoreAsync();
|
||||
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
return RestoreInternal(taskId, userId, packageId, serviceId, serverId,
|
||||
storePackageId, storePackageBackupPath, storeServerBackupPath);
|
||||
}
|
||||
}
|
||||
|
||||
public static int RestoreInternal(string taskId, int userId, int packageId, int serviceId, int serverId,
|
||||
int storePackageId, string storePackageBackupPath, string storeServerBackupPath)
|
||||
{
|
||||
try
|
||||
{
|
||||
// copy backup from remote or local server
|
||||
string backupFileName = (storePackageId > 0)
|
||||
? Path.GetFileName(storePackageBackupPath) : Path.GetFileName(storeServerBackupPath);
|
||||
|
||||
TaskManager.StartTask(taskId, "BACKUP", "RESTORE", backupFileName);
|
||||
TaskManager.ItemId = SecurityContext.User.UserId;
|
||||
|
||||
// create temp folder
|
||||
string tempFolder = GetTempBackupFolder();
|
||||
|
||||
string backupFileNamePath = Path.Combine(tempFolder, backupFileName);
|
||||
if (storePackageId > 0)
|
||||
{
|
||||
try
|
||||
{
|
||||
int osServiceId = PackageController.GetPackageServiceId(storePackageId, ResourceGroups.Os);
|
||||
if (osServiceId > 0)
|
||||
{
|
||||
OS.OperatingSystem os = new OS.OperatingSystem();
|
||||
ServiceProviderProxy.Init(os, osServiceId);
|
||||
|
||||
string remoteBackupPath = FilesController.GetFullPackagePath(storePackageId,
|
||||
storePackageBackupPath);
|
||||
|
||||
FileStream stream = new FileStream(backupFileNamePath, FileMode.Create, FileAccess.Write);
|
||||
|
||||
byte[] buffer = new byte[FILE_BUFFER_LENGTH];
|
||||
int offset = 0;
|
||||
do
|
||||
{
|
||||
// read remote content
|
||||
buffer = os.GetFileBinaryChunk(remoteBackupPath, offset, FILE_BUFFER_LENGTH);
|
||||
|
||||
// write remote content
|
||||
stream.Write(buffer, 0, buffer.Length);
|
||||
|
||||
offset += FILE_BUFFER_LENGTH;
|
||||
}
|
||||
while (buffer.Length == FILE_BUFFER_LENGTH);
|
||||
stream.Close();
|
||||
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.WriteError(ex, "Can't copy source backup set");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
backupFileNamePath = storeServerBackupPath;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
// unpack archive
|
||||
FileUtils.UnzipFiles(backupFileNamePath, tempFolder);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.WriteError(ex, "Can't unzip backup set");
|
||||
return 0;
|
||||
}
|
||||
|
||||
// load backup catalog
|
||||
XmlDocument doc = new XmlDocument();
|
||||
|
||||
try
|
||||
{
|
||||
doc.Load(Path.Combine(tempFolder, BACKUP_CATALOG_FILE_NAME));
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.WriteError(ex, "Can't find/open backup catalog file");
|
||||
return 0;
|
||||
}
|
||||
|
||||
// validate XML document
|
||||
//if (!ValidateXmlDocument(doc))
|
||||
//{
|
||||
// TaskManager.WriteError("Corrupted or altered backup catalog file has been read");
|
||||
// return 0;
|
||||
//}
|
||||
|
||||
// get the list of items to restore
|
||||
string condition = "";
|
||||
if (userId > 0)
|
||||
{
|
||||
// get user spaces
|
||||
List<PackageInfo> packages = new List<PackageInfo>();
|
||||
packages.AddRange(PackageController.GetMyPackages(userId));
|
||||
packages.AddRange(PackageController.GetPackages(userId));
|
||||
List<string> parts = new List<string>();
|
||||
foreach (PackageInfo package in packages)
|
||||
parts.Add("@packageId = " + package.PackageId.ToString());
|
||||
condition = "[" + String.Join(" or ", parts.ToArray()) + "]";
|
||||
}
|
||||
else if (packageId > 0)
|
||||
{
|
||||
condition = "[@packageId = " + packageId + "]";
|
||||
}
|
||||
else if (serviceId > 0)
|
||||
{
|
||||
condition = "[@serviceId = " + serviceId + "]";
|
||||
}
|
||||
else if (serverId > 0)
|
||||
{
|
||||
// get server services
|
||||
List<ServiceInfo> services = ServerController.GetServicesByServerId(serverId);
|
||||
List<string> parts = new List<string>();
|
||||
foreach (ServiceInfo service in services)
|
||||
parts.Add("@serviceId = " + service.ServiceId.ToString());
|
||||
condition = "[" + String.Join(" or ", parts.ToArray()) + "]";
|
||||
}
|
||||
|
||||
XmlNodeList itemNodes = doc.SelectNodes("Backup/Items/Item" + condition);
|
||||
|
||||
TaskManager.IndicatorMaximum = itemNodes.Count;
|
||||
TaskManager.IndicatorCurrent = 0;
|
||||
|
||||
// group items by item types
|
||||
Dictionary<int, List<XmlNode>> groupedItems = new Dictionary<int, List<XmlNode>>();
|
||||
|
||||
// sort by groups
|
||||
foreach (XmlNode itemNode in itemNodes)
|
||||
{
|
||||
int itemTypeId = Utils.ParseInt(itemNode.Attributes["itemTypeId"].Value, 0);
|
||||
// add to group
|
||||
if (!groupedItems.ContainsKey(itemTypeId))
|
||||
groupedItems[itemTypeId] = new List<XmlNode>();
|
||||
|
||||
groupedItems[itemTypeId].Add(itemNode);
|
||||
}
|
||||
|
||||
// restore grouped items
|
||||
foreach (int itemTypeId in groupedItems.Keys)
|
||||
{
|
||||
// load item type
|
||||
ServiceProviderItemType itemTypeInfo = PackageController.GetServiceItemType(itemTypeId);
|
||||
if (!itemTypeInfo.Backupable)
|
||||
continue;
|
||||
|
||||
Type itemType = Type.GetType(itemTypeInfo.TypeName);
|
||||
|
||||
// load group
|
||||
ResourceGroupInfo group = ServerController.GetResourceGroup(itemTypeInfo.GroupId);
|
||||
|
||||
// instantiate controller
|
||||
IBackupController controller = null;
|
||||
try
|
||||
{
|
||||
controller = Activator.CreateInstance(Type.GetType(group.GroupController)) as IBackupController;
|
||||
if (controller != null)
|
||||
{
|
||||
// backup items
|
||||
foreach (XmlNode itemNode in groupedItems[itemTypeId])
|
||||
{
|
||||
int itemId = Utils.ParseInt(itemNode.Attributes["itemId"].Value, 0);
|
||||
string itemName = itemNode.Attributes["itemName"].Value;
|
||||
int itemPackageId = Utils.ParseInt(itemNode.Attributes["packageId"].Value, 0);
|
||||
int itemServiceId = Utils.ParseInt(itemNode.Attributes["serviceId"].Value, 0);
|
||||
|
||||
TaskManager.Write(String.Format("Restore {0} '{1}'",
|
||||
itemTypeInfo.DisplayName, itemName));
|
||||
|
||||
try
|
||||
{
|
||||
int restoreResult = controller.RestoreItem(tempFolder, itemNode,
|
||||
itemId, itemType, itemName, itemPackageId, itemServiceId, group);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.WriteError(ex, "Can't restore item");
|
||||
}
|
||||
|
||||
TaskManager.IndicatorCurrent++;
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.WriteError(ex);
|
||||
}
|
||||
}
|
||||
|
||||
// delete backup folder and all its contents
|
||||
try
|
||||
{
|
||||
Directory.Delete(tempFolder, true);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.WriteError(ex, "Can't delete temporary backup folder");
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.WriteError(ex);
|
||||
}
|
||||
finally
|
||||
{
|
||||
TaskManager.CompleteTask();
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
public static int BackupItem(string tempFolder, XmlWriter writer, ServiceProviderItem item)
|
||||
{
|
||||
// load item type
|
||||
ServiceProviderItemType itemType = PackageController.GetServiceItemType(item.TypeId);
|
||||
if (!itemType.Backupable)
|
||||
return -1;
|
||||
|
||||
// load group
|
||||
ResourceGroupInfo group = ServerController.GetResourceGroup(itemType.GroupId);
|
||||
|
||||
// create controller
|
||||
IBackupController controller = null;
|
||||
try
|
||||
{
|
||||
controller = Activator.CreateInstance(Type.GetType(group.GroupController)) as IBackupController;
|
||||
if (controller != null)
|
||||
{
|
||||
return BackupItem(tempFolder, writer, item, group, controller);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.WriteError(ex);
|
||||
}
|
||||
|
||||
return -2;
|
||||
}
|
||||
|
||||
private static int BackupItem(string tempFolder, XmlWriter writer,
|
||||
ServiceProviderItem item, ResourceGroupInfo group, IBackupController controller)
|
||||
{
|
||||
writer.WriteStartElement("Item");
|
||||
writer.WriteAttributeString("itemId", item.Id.ToString());
|
||||
writer.WriteAttributeString("itemTypeId", item.TypeId.ToString());
|
||||
writer.WriteAttributeString("itemName", item.Name);
|
||||
writer.WriteAttributeString("packageId", item.PackageId.ToString());
|
||||
writer.WriteAttributeString("serviceId", item.ServiceId.ToString());
|
||||
|
||||
try
|
||||
{
|
||||
return controller.BackupItem(tempFolder, writer, item, group);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.WriteError(ex);
|
||||
}
|
||||
finally
|
||||
{
|
||||
writer.WriteEndElement(); // Item
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
public static int RestoreItem()
|
||||
{
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
public static void WriteFileElement(XmlWriter writer, string fileName, string filePath, long size)
|
||||
{
|
||||
writer.WriteStartElement("File");
|
||||
writer.WriteAttributeString("name", fileName);
|
||||
writer.WriteAttributeString("path", filePath);
|
||||
writer.WriteAttributeString("size", size.ToString());
|
||||
writer.WriteEndElement();
|
||||
}
|
||||
|
||||
#region Utility Methods
|
||||
public static bool FolderWriteAccessible(string path)
|
||||
{
|
||||
try
|
||||
{
|
||||
string tempFile = Path.Combine(path, "check");
|
||||
StreamWriter writer = File.CreateText(tempFile);
|
||||
writer.Close();
|
||||
File.Delete(tempFile);
|
||||
return true;
|
||||
}
|
||||
catch
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public static bool RemoteServerFolderWriteAccessible(int packageId, string path)
|
||||
{
|
||||
try
|
||||
{
|
||||
// copy to space folder
|
||||
int osServiceId = PackageController.GetPackageServiceId(packageId, ResourceGroups.Os);
|
||||
if (osServiceId > 0)
|
||||
{
|
||||
OS.OperatingSystem os = new OS.OperatingSystem();
|
||||
ServiceProviderProxy.Init(os, osServiceId);
|
||||
|
||||
string remoteServerPathCheck = FilesController.GetFullPackagePath(packageId,
|
||||
Path.Combine(path, "check.txt"));
|
||||
|
||||
//
|
||||
os.CreateFile(remoteServerPathCheck);
|
||||
os.AppendFileBinaryContent(remoteServerPathCheck, Encoding.UTF8.GetBytes(remoteServerPathCheck));
|
||||
os.DeleteFile(remoteServerPathCheck);
|
||||
}
|
||||
//
|
||||
return true;
|
||||
}
|
||||
catch
|
||||
{
|
||||
//
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public static void SignXmlDocument(XmlDocument doc)
|
||||
{
|
||||
// Create a SignedXml object.
|
||||
SignedXml signedXml = new SignedXml(doc);
|
||||
|
||||
// Add the key to the SignedXml document.
|
||||
signedXml.SigningKey = GetUserRSAKey();
|
||||
|
||||
// Create a reference to be signed.
|
||||
Reference reference = new Reference();
|
||||
reference.Uri = "";
|
||||
|
||||
// Add an enveloped transformation to the reference.
|
||||
XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform();
|
||||
reference.AddTransform(env);
|
||||
|
||||
// Add the reference to the SignedXml object.
|
||||
signedXml.AddReference(reference);
|
||||
|
||||
// Compute the signature.
|
||||
signedXml.ComputeSignature();
|
||||
|
||||
// Get the XML representation of the signature and save
|
||||
// it to an XmlElement object.
|
||||
XmlElement xmlDigitalSignature = signedXml.GetXml();
|
||||
|
||||
// Append the element to the XML document.
|
||||
doc.DocumentElement.AppendChild(doc.ImportNode(xmlDigitalSignature, true));
|
||||
}
|
||||
|
||||
public static bool ValidateXmlDocument(XmlDocument doc)
|
||||
{
|
||||
// Create a new SignedXml object and pass it
|
||||
// the XML document class.
|
||||
SignedXml signedXml = new SignedXml(doc);
|
||||
|
||||
// Find the "Signature" node and create a new
|
||||
// XmlNodeList object.
|
||||
XmlNodeList nodeList = doc.GetElementsByTagName("Signature");
|
||||
|
||||
// Throw an exception if no signature was found.
|
||||
if (nodeList.Count <= 0)
|
||||
{
|
||||
throw new CryptographicException("Verification failed: No Signature was found in the document.");
|
||||
}
|
||||
|
||||
// This example only supports one signature for
|
||||
// the entire XML document. Throw an exception
|
||||
// if more than one signature was found.
|
||||
if (nodeList.Count >= 2)
|
||||
{
|
||||
throw new CryptographicException("Verification failed: More that one signature was found for the document.");
|
||||
}
|
||||
|
||||
// Load the first <signature> node.
|
||||
signedXml.LoadXml((XmlElement)nodeList[0]);
|
||||
|
||||
// Check the signature and return the result.
|
||||
return signedXml.CheckSignature(GetUserRSAKey());
|
||||
}
|
||||
|
||||
public static RSA GetUserRSAKey()
|
||||
{
|
||||
int userId = SecurityContext.User.UserId;
|
||||
if(SecurityContext.User.IsPeer)
|
||||
userId = SecurityContext.User.OwnerId;
|
||||
|
||||
UserSettings settings = UserController.GetUserSettings(userId, RSA_SETTINGS_KEY);
|
||||
string keyXml = settings[RSA_SETTINGS_KEY];
|
||||
RSA rsa = RSA.Create();
|
||||
if (String.IsNullOrEmpty(keyXml) || settings.UserId != userId)
|
||||
{
|
||||
// generate new key
|
||||
keyXml = rsa.ToXmlString(true);
|
||||
|
||||
// store to settings
|
||||
settings[RSA_SETTINGS_KEY] = keyXml;
|
||||
settings.UserId = userId;
|
||||
UserController.UpdateUserSettings(settings);
|
||||
}
|
||||
else
|
||||
{
|
||||
rsa.FromXmlString(keyXml);
|
||||
}
|
||||
return rsa;
|
||||
}
|
||||
|
||||
private static string GetLoggedUsername()
|
||||
{
|
||||
string username = SecurityContext.User.Identity.Name;
|
||||
UserInfo user = UserController.GetUser(SecurityContext.User.UserId);
|
||||
if (user != null)
|
||||
username = user.Username;
|
||||
return username;
|
||||
}
|
||||
|
||||
public static string GetTempBackupFolder()
|
||||
{
|
||||
string timeStamp = DateTime.Now.Ticks.ToString();
|
||||
string tempFolder = Path.Combine(ConfigSettings.BackupsPath, GetLoggedUsername() + "_" + timeStamp);
|
||||
|
||||
// create folder
|
||||
if (!Directory.Exists(tempFolder))
|
||||
Directory.CreateDirectory(tempFolder);
|
||||
|
||||
return tempFolder;
|
||||
}
|
||||
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
|
@ -0,0 +1,50 @@
|
|||
// Copyright (c) 2011, 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.Data;
|
||||
using System.Configuration;
|
||||
using System.Web;
|
||||
using System.Web.Security;
|
||||
using System.Web.UI;
|
||||
using System.Web.UI.WebControls;
|
||||
using System.Web.UI.WebControls.WebParts;
|
||||
using System.Web.UI.HtmlControls;
|
||||
using System.Xml;
|
||||
|
||||
using WebsitePanel.Providers;
|
||||
|
||||
namespace WebsitePanel.EnterpriseServer
|
||||
{
|
||||
public interface IBackupController
|
||||
{
|
||||
int BackupItem(string tempFolder, XmlWriter writer, ServiceProviderItem item, ResourceGroupInfo group);
|
||||
int RestoreItem(string tempFolder, XmlNode itemNode, int itemId, Type itemType,
|
||||
string itemName, int packageId, int serviceId, ResourceGroupInfo group);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,42 @@
|
|||
// Copyright (c) 2011, 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;
|
||||
|
||||
namespace WebsitePanel.EnterpriseServer
|
||||
{
|
||||
public interface IImportController
|
||||
{
|
||||
List<string> GetImportableItems(int packageId, int itemTypeId,
|
||||
Type itemType, ResourceGroupInfo group);
|
||||
|
||||
void ImportItem(int packageId, int itemTypeId,
|
||||
Type itemType, ResourceGroupInfo group, string itemName);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,60 @@
|
|||
// Copyright (c) 2011, 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.Text;
|
||||
using System.Threading;
|
||||
|
||||
namespace WebsitePanel.EnterpriseServer
|
||||
{
|
||||
public class ImportAsyncWorker
|
||||
{
|
||||
public int threadUserId = -1;
|
||||
public string taskId;
|
||||
public int packageId;
|
||||
public string[] items;
|
||||
|
||||
public void ImportAsync()
|
||||
{
|
||||
// start asynchronously
|
||||
Thread t = new Thread(new ThreadStart(Import));
|
||||
t.Start();
|
||||
}
|
||||
|
||||
public void Import()
|
||||
{
|
||||
// impersonate thread
|
||||
if (threadUserId != -1)
|
||||
SecurityContext.SetThreadPrincipal(threadUserId);
|
||||
|
||||
// perform import
|
||||
ImportController.ImportItemsInternal(taskId, packageId, items);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,234 @@
|
|||
// Copyright (c) 2011, 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.Data;
|
||||
using System.Collections.Generic;
|
||||
|
||||
using WebsitePanel.Providers;
|
||||
|
||||
namespace WebsitePanel.EnterpriseServer
|
||||
{
|
||||
public class ImportController
|
||||
{
|
||||
public static List<ServiceProviderItemType> GetImportableItemTypes(int packageId)
|
||||
{
|
||||
// load all service item types
|
||||
List<ServiceProviderItemType> itemTypes = PackageController.GetServiceItemTypes();
|
||||
|
||||
// load package context
|
||||
PackageContext cntx = PackageController.GetPackageContext(packageId);
|
||||
|
||||
// build importable items list
|
||||
List<ServiceProviderItemType> importableTypes = new List<ServiceProviderItemType>();
|
||||
foreach (ServiceProviderItemType itemType in itemTypes)
|
||||
{
|
||||
if (!itemType.Importable)
|
||||
continue;
|
||||
|
||||
// load group
|
||||
ResourceGroupInfo group = ServerController.GetResourceGroup(itemType.GroupId);
|
||||
if (cntx.Groups.ContainsKey(group.GroupName))
|
||||
importableTypes.Add(itemType);
|
||||
}
|
||||
return importableTypes;
|
||||
}
|
||||
|
||||
public static List<string> GetImportableItems(int packageId, int itemTypeId)
|
||||
{
|
||||
List<string> items = new List<string>();
|
||||
|
||||
// check account
|
||||
int accountCheck = SecurityContext.CheckAccount(DemandAccount.IsAdmin | DemandAccount.NotDemo);
|
||||
if (accountCheck < 0) return items;
|
||||
|
||||
// load item type
|
||||
ServiceProviderItemType itemType = PackageController.GetServiceItemType(itemTypeId);
|
||||
|
||||
// load group
|
||||
ResourceGroupInfo group = ServerController.GetResourceGroup(itemType.GroupId);
|
||||
|
||||
// get service id
|
||||
int serviceId = PackageController.GetPackageServiceId(packageId, group.GroupName);
|
||||
if (serviceId == 0)
|
||||
return items;
|
||||
|
||||
DataTable dtServiceItems = PackageController.GetServiceItemsDataSet(serviceId).Tables[0];
|
||||
DataTable dtPackageItems = PackageController.GetPackageItemsDataSet(packageId).Tables[0];
|
||||
|
||||
// instantiate controller
|
||||
IImportController ctrl = null;
|
||||
try
|
||||
{
|
||||
List<string> importableItems = null;
|
||||
ctrl = Activator.CreateInstance(Type.GetType(group.GroupController)) as IImportController;
|
||||
if (ctrl != null)
|
||||
{
|
||||
importableItems = ctrl.GetImportableItems(packageId, itemTypeId, Type.GetType(itemType.TypeName), group);
|
||||
}
|
||||
|
||||
foreach (string importableItem in importableItems)
|
||||
{
|
||||
|
||||
// filter items by service
|
||||
bool serviceContains = false;
|
||||
foreach (DataRow dr in dtServiceItems.Rows)
|
||||
{
|
||||
string serviceItemName = (string)dr["ItemName"];
|
||||
int serviceItemTypeId = (int)dr["ItemTypeId"];
|
||||
|
||||
if (String.Compare(importableItem, serviceItemName, true) == 0
|
||||
&& serviceItemTypeId == itemTypeId)
|
||||
{
|
||||
serviceContains = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// filter items by package
|
||||
bool packageContains = false;
|
||||
foreach (DataRow dr in dtPackageItems.Rows)
|
||||
{
|
||||
string packageItemName = (string)dr["ItemName"];
|
||||
int packageItemTypeId = (int)dr["ItemTypeId"];
|
||||
|
||||
if (String.Compare(importableItem, packageItemName, true) == 0
|
||||
&& packageItemTypeId == itemTypeId)
|
||||
{
|
||||
packageContains = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!serviceContains && !packageContains)
|
||||
items.Add(importableItem);
|
||||
}
|
||||
|
||||
}
|
||||
catch { /* do nothing */ }
|
||||
|
||||
return items;
|
||||
}
|
||||
|
||||
public static int ImportItems(bool async, string taskId, int packageId, string[] items)
|
||||
{
|
||||
// check account
|
||||
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsAdmin);
|
||||
if (accountCheck < 0) return accountCheck;
|
||||
|
||||
|
||||
if (async)
|
||||
{
|
||||
ImportAsyncWorker worker = new ImportAsyncWorker();
|
||||
worker.threadUserId = SecurityContext.User.UserId;
|
||||
worker.taskId = taskId;
|
||||
worker.packageId = packageId;
|
||||
worker.items = items;
|
||||
|
||||
// import
|
||||
worker.ImportAsync();
|
||||
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
return ImportItemsInternal(taskId, packageId, items);
|
||||
}
|
||||
}
|
||||
|
||||
public static int ImportItemsInternal(string taskId, int packageId, string[] items)
|
||||
{
|
||||
PackageInfo package = PackageController.GetPackage(packageId);
|
||||
|
||||
TaskManager.StartTask(taskId, "IMPORT", "IMPORT", package.PackageName);
|
||||
TaskManager.ItemId = packageId;
|
||||
|
||||
TaskManager.IndicatorMaximum = items.Length;
|
||||
TaskManager.IndicatorCurrent = 0;
|
||||
|
||||
Dictionary<int, List<string>> groupedItems = new Dictionary<int, List<string>>();
|
||||
|
||||
// sort by groups
|
||||
foreach (string item in items)
|
||||
{
|
||||
string[] itemParts = item.Split('|');
|
||||
int itemTypeId = Utils.ParseInt(itemParts[0], 0);
|
||||
string itemName = itemParts[1];
|
||||
|
||||
// add to group
|
||||
if (!groupedItems.ContainsKey(itemTypeId))
|
||||
groupedItems[itemTypeId] = new List<string>();
|
||||
|
||||
groupedItems[itemTypeId].Add(itemName);
|
||||
}
|
||||
|
||||
// import each group
|
||||
foreach (int itemTypeId in groupedItems.Keys)
|
||||
{
|
||||
// load item type
|
||||
ServiceProviderItemType itemType = PackageController.GetServiceItemType(itemTypeId);
|
||||
|
||||
// load group
|
||||
ResourceGroupInfo group = ServerController.GetResourceGroup(itemType.GroupId);
|
||||
|
||||
// instantiate controller
|
||||
IImportController ctrl = null;
|
||||
try
|
||||
{
|
||||
ctrl = Activator.CreateInstance(Type.GetType(group.GroupController)) as IImportController;
|
||||
if (ctrl != null)
|
||||
{
|
||||
foreach (string itemName in groupedItems[itemTypeId])
|
||||
{
|
||||
TaskManager.Write(String.Format("Import {0} '{1}'",
|
||||
itemType.DisplayName, itemName));
|
||||
|
||||
try
|
||||
{
|
||||
// perform import
|
||||
ctrl.ImportItem(packageId, itemTypeId,
|
||||
Type.GetType(itemType.TypeName), group, itemName);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.WriteError(ex, "Can't import item");
|
||||
}
|
||||
|
||||
TaskManager.IndicatorCurrent++;
|
||||
}
|
||||
}
|
||||
}
|
||||
catch { /* do nothing */ }
|
||||
}
|
||||
|
||||
TaskManager.CompleteTask();
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,201 @@
|
|||
// Copyright (c) 2011, 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.Xml;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
|
||||
using WebsitePanel.EnterpriseServer;
|
||||
|
||||
namespace WebsitePanel.Ecommerce.EnterpriseServer
|
||||
{
|
||||
public class ActivatePaidInvoicesTask : SchedulerTask
|
||||
{
|
||||
public override void DoWork()
|
||||
{
|
||||
//
|
||||
PickupReceivedTransactions();
|
||||
// activate paid services
|
||||
ActivatePaidServices();
|
||||
}
|
||||
|
||||
public void PickupReceivedTransactions()
|
||||
{
|
||||
TaskManager.Write("Start looking for transactions submitted");
|
||||
//
|
||||
List<HandlerResponse> transactions = ServiceHandlerController.GetServiceHandlersResponsesByReseller(SecurityContext.User.UserId);
|
||||
//
|
||||
if (transactions.Count > 0)
|
||||
{
|
||||
XmlDocument xmldoc = new XmlDocument();
|
||||
XmlElement root = xmldoc.CreateElement("Result");
|
||||
XmlElement succeedNode = xmldoc.CreateElement("Succeed");
|
||||
XmlElement failedNode = xmldoc.CreateElement("Failed");
|
||||
root.AppendChild(succeedNode);
|
||||
root.AppendChild(failedNode);
|
||||
//
|
||||
List<HandlerResponse> succeedItems = new List<HandlerResponse>();
|
||||
List<HandlerResponse> failedItems = new List<HandlerResponse>();
|
||||
//
|
||||
TaskManager.Write("Found {0} transactions pending", transactions.Count.ToString());
|
||||
foreach (HandlerResponse transaction in transactions)
|
||||
{
|
||||
XmlElement responseNode = xmldoc.CreateElement("Response");
|
||||
responseNode.SetAttribute("ID", Convert.ToString(transaction.ResponseId));
|
||||
//
|
||||
try
|
||||
{
|
||||
CheckoutDetails details = new CheckoutDetails();
|
||||
//
|
||||
string[] dataPairs = transaction.TextResponse.Split('&');
|
||||
foreach (string dataPair in dataPairs)
|
||||
{
|
||||
string[] data = dataPair.Split('=');
|
||||
if (data.Length >= 2)
|
||||
details[data[0]] = data[1];
|
||||
}
|
||||
//
|
||||
CheckoutResult result = PaymentGatewayController.CheckOut(transaction.ContractId, transaction.InvoiceId,
|
||||
transaction.MethodName, details);
|
||||
//
|
||||
if (result.Succeed)
|
||||
{
|
||||
succeedNode.AppendChild(responseNode);
|
||||
succeedItems.Add(transaction);
|
||||
}
|
||||
else
|
||||
{
|
||||
responseNode.SetAttribute("Error", result.StatusCode);
|
||||
failedNode.AppendChild(responseNode);
|
||||
//
|
||||
transaction.ErrorMessage = result.StatusCode;
|
||||
failedItems.Add(transaction);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
//
|
||||
if (!failedItems.Contains(transaction))
|
||||
{
|
||||
responseNode.SetAttribute("Error", ex.StackTrace);
|
||||
failedNode.AppendChild(responseNode);
|
||||
//
|
||||
transaction.ErrorMessage = ex.StackTrace;
|
||||
failedItems.Add(transaction);
|
||||
}
|
||||
//
|
||||
TaskManager.WriteError(ex);
|
||||
}
|
||||
}
|
||||
// peform transactions update
|
||||
ServiceHandlerController.UpdateServiceHandlersResponses(SecurityContext.User.UserId, root.InnerXml);
|
||||
}
|
||||
else
|
||||
{
|
||||
TaskManager.Write("No transactions found");
|
||||
}
|
||||
TaskManager.Write("End looking for transactions submitted");
|
||||
}
|
||||
|
||||
public void ActivatePaidServices()
|
||||
{
|
||||
// load paid invoice items
|
||||
List<InvoiceItem> items = InvoiceController.GetInvoicesItemsToActivate(SecurityContext.User.UserId);
|
||||
// TRACE
|
||||
TaskManager.Write("Activate paid services");
|
||||
TaskManager.WriteParameter("Items found", items.Count);
|
||||
// iterate
|
||||
foreach (InvoiceItem item in items)
|
||||
{
|
||||
try
|
||||
{
|
||||
TaskManager.Write("Activating service");
|
||||
// activating
|
||||
GenericSvcResult result = ActivateInvoiceItem(item);
|
||||
// LOG ERROR
|
||||
if (!result.Succeed)
|
||||
{
|
||||
TaskManager.WriteError(result.Error);
|
||||
if (!String.IsNullOrEmpty(result.ErrorCode))
|
||||
TaskManager.WriteParameter("Error code", result.ErrorCode);
|
||||
TaskManager.WriteParameter("Result code", result.ResultCode);
|
||||
// go to next item
|
||||
continue;
|
||||
}
|
||||
//
|
||||
TaskManager.Write("Activated");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.WriteError(ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public GenericSvcResult ActivateInvoiceItem(InvoiceItem item)
|
||||
{
|
||||
GenericSvcResult svc_result = ActivateService(item.ServiceId, true, true);
|
||||
//
|
||||
if (svc_result.Succeed)
|
||||
InvoiceController.SetInvoiceItemProcessed(item.InvoiceId, item.ItemId);
|
||||
//
|
||||
return svc_result;
|
||||
}
|
||||
|
||||
public GenericSvcResult ActivateService(int serviceId, bool sendEmail, bool logSvcUsage)
|
||||
{
|
||||
GenericSvcResult result = null;
|
||||
// load svc type
|
||||
ProductType svc_type = ServiceController.GetServiceItemType(serviceId);
|
||||
//
|
||||
if (svc_type == null)
|
||||
{
|
||||
result = new GenericSvcResult();
|
||||
result.Succeed = true;
|
||||
return result;
|
||||
}
|
||||
// instantiate svc controller
|
||||
IServiceProvisioning controller = (IServiceProvisioning)Activator.CreateInstance(
|
||||
Type.GetType(svc_type.ProvisioningController));
|
||||
// create context
|
||||
ProvisioningContext context = controller.GetProvisioningContext(serviceId, sendEmail);
|
||||
// activate svc
|
||||
result = controller.ActivateService(context);
|
||||
// check result
|
||||
if (result.Succeed)
|
||||
{
|
||||
// log svc usage
|
||||
if (logSvcUsage)
|
||||
controller.LogServiceUsage(context);
|
||||
}
|
||||
//
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,106 @@
|
|||
// Copyright (c) 2011, 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.IO;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
using WebsitePanel.Providers.Database;
|
||||
|
||||
namespace WebsitePanel.EnterpriseServer
|
||||
{
|
||||
public class BackupDatabaseTask : SchedulerTask
|
||||
{
|
||||
public override void DoWork()
|
||||
{
|
||||
// Input parameters:
|
||||
// - DATABASE_GROUP
|
||||
// - DATABASE_NAME
|
||||
// - BACKUP_FOLDER
|
||||
// - BACKUP_NAME
|
||||
// - ZIP_BACKUP
|
||||
|
||||
string databaseGroup = (string)TaskManager.TaskParameters["DATABASE_GROUP"];
|
||||
string databaseName = (string)TaskManager.TaskParameters["DATABASE_NAME"];
|
||||
string backupFolder = (string)TaskManager.TaskParameters["BACKUP_FOLDER"];
|
||||
string backupName = (string)TaskManager.TaskParameters["BACKUP_NAME"];
|
||||
string strZipBackup = (string)TaskManager.TaskParameters["ZIP_BACKUP"];
|
||||
|
||||
// check input parameters
|
||||
if (String.IsNullOrEmpty(databaseName))
|
||||
{
|
||||
TaskManager.WriteWarning("Specify 'Database Name' task parameter.");
|
||||
return;
|
||||
}
|
||||
|
||||
bool zipBackup = (strZipBackup.ToLower() == "true");
|
||||
|
||||
if (String.IsNullOrEmpty(backupName))
|
||||
{
|
||||
backupName = databaseName + (zipBackup ? ".zip" : ".bak");
|
||||
}
|
||||
else
|
||||
{
|
||||
// check extension
|
||||
string ext = Path.GetExtension(backupName);
|
||||
if (zipBackup && String.Compare(ext, ".zip", true) != 0)
|
||||
{
|
||||
// change extension to .zip
|
||||
backupName = Path.GetFileNameWithoutExtension(backupName) + ".zip";
|
||||
}
|
||||
}
|
||||
|
||||
// try to find database
|
||||
SqlDatabase item = (SqlDatabase)PackageController.GetPackageItemByName(TaskManager.PackageId, databaseGroup,
|
||||
databaseName, typeof(SqlDatabase));
|
||||
|
||||
if (item == null)
|
||||
{
|
||||
TaskManager.WriteError("Database with the specified name was not found in the current hosting space.");
|
||||
return;
|
||||
}
|
||||
|
||||
if (String.IsNullOrEmpty(backupFolder))
|
||||
backupFolder = "\\";
|
||||
|
||||
// substitute parameters
|
||||
DateTime d = DateTime.Now;
|
||||
string date = d.ToString("yyyyMMdd");
|
||||
string time = d.ToString("HHmm");
|
||||
|
||||
backupFolder = Utils.ReplaceStringVariable(backupFolder, "date", date);
|
||||
backupFolder = Utils.ReplaceStringVariable(backupFolder, "time", time);
|
||||
backupName = Utils.ReplaceStringVariable(backupName, "date", date);
|
||||
backupName = Utils.ReplaceStringVariable(backupName, "time", time);
|
||||
|
||||
// backup database
|
||||
DatabaseServerController.BackupSqlDatabase(item.Id, backupName, zipBackup, false, backupFolder);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,83 @@
|
|||
// Copyright (c) 2011, 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.Data;
|
||||
using System.Configuration;
|
||||
using System.Web;
|
||||
using System.Web.Security;
|
||||
using System.Web.UI;
|
||||
using System.Web.UI.WebControls;
|
||||
using System.Web.UI.WebControls.WebParts;
|
||||
using System.Web.UI.HtmlControls;
|
||||
|
||||
namespace WebsitePanel.EnterpriseServer
|
||||
{
|
||||
/// <summary>
|
||||
/// Represents scheduler task that performs hosting space backup.
|
||||
/// </summary>
|
||||
public class BackupTask : SchedulerTask
|
||||
{
|
||||
/// <summary>
|
||||
/// Performs actual backup.
|
||||
/// </summary>
|
||||
public override void DoWork()
|
||||
{
|
||||
string backupFileName;
|
||||
int storePackageId;
|
||||
string storePackageFolder;
|
||||
string storeServerFolder;
|
||||
bool deleteTempBackup;
|
||||
try
|
||||
{
|
||||
backupFileName = (string)TaskManager.TaskParameters["BACKUP_FILE_NAME"];
|
||||
storePackageId = Convert.ToInt32(TaskManager.TaskParameters["STORE_PACKAGE_ID"]);
|
||||
storePackageFolder = (string)TaskManager.TaskParameters["STORE_PACKAGE_FOLDER"];
|
||||
storeServerFolder = (string)TaskManager.TaskParameters["STORE_SERVER_FOLDER"];
|
||||
deleteTempBackup = Convert.ToBoolean(TaskManager.TaskParameters["DELETE_TEMP_BACKUP"]);
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
TaskManager.WriteError(ex, "Some parameters are absent or have incorrect value.");
|
||||
return;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
PackageInfo package = PackageController.GetPackage(TaskManager.PackageId);
|
||||
// We do not take into account service id as long as scheduled tasks run against packages.
|
||||
BackupController.Backup(false, "BackupTask", package.UserId, package.PackageId, 0, 0,
|
||||
backupFileName, storePackageId, storePackageFolder, storeServerFolder, deleteTempBackup);
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
TaskManager.WriteError(ex, "Failed to do backup.");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,57 @@
|
|||
// Copyright (c) 2011, 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.Diagnostics;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
using WebsitePanel.Providers.Exchange;
|
||||
using WebsitePanel.Providers.HostedSolution;
|
||||
|
||||
namespace WebsitePanel.EnterpriseServer
|
||||
{
|
||||
public class CalculateExchangeDiskspaceTask : SchedulerTask
|
||||
{
|
||||
public override void DoWork()
|
||||
{
|
||||
CalculateDiskspace();
|
||||
}
|
||||
|
||||
public void CalculateDiskspace()
|
||||
{
|
||||
// get all space organizations recursively
|
||||
List<Organization> items = ExchangeServerController.GetExchangeOrganizations(TaskManager.PackageId, true);
|
||||
|
||||
foreach (Organization item in items)
|
||||
{
|
||||
ExchangeServerController.CalculateOrganizationDiskspaceInternal(item.Id);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,189 @@
|
|||
// Copyright (c) 2011, 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.Diagnostics;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using System.Globalization;
|
||||
|
||||
using WebsitePanel.Providers;
|
||||
|
||||
namespace WebsitePanel.EnterpriseServer
|
||||
{
|
||||
public class CalculatePackagesBandwidthTask : SchedulerTask
|
||||
{
|
||||
private readonly bool suspendOverused = false;
|
||||
|
||||
public override void DoWork()
|
||||
{
|
||||
// Input parameters:
|
||||
// - SUSPEND_OVERUSED_PACKAGES
|
||||
|
||||
CalculateBandwidth();
|
||||
}
|
||||
|
||||
public void CalculateBandwidth()
|
||||
{
|
||||
// get all owned packages
|
||||
List<PackageInfo> packages = PackageController.GetPackagePackages(TaskManager.PackageId, true);
|
||||
TaskManager.Write("Packages to calculate: " + packages.Count.ToString());
|
||||
|
||||
foreach (PackageInfo package in packages)
|
||||
{
|
||||
// calculating package bandwidth
|
||||
CalculatePackage(package.PackageId);
|
||||
}
|
||||
}
|
||||
|
||||
public void CalculatePackage(int packageId)
|
||||
{
|
||||
DateTime since = PackageController.GetPackageBandwidthUpdate(packageId);
|
||||
DateTime nextUpdate = DateTime.Now;
|
||||
|
||||
try
|
||||
{
|
||||
// get all package items
|
||||
List<ServiceProviderItem> items = PackageController.GetServiceItemsForStatistics(
|
||||
0, packageId, false, true, false, false);
|
||||
|
||||
// order items by service
|
||||
Dictionary<int, List<ServiceProviderItem>> orderedItems =
|
||||
PackageController.OrderServiceItemsByServices(items);
|
||||
|
||||
// calculate statistics for each service set
|
||||
List<ServiceProviderItemBandwidth> itemsBandwidth = new List<ServiceProviderItemBandwidth>();
|
||||
foreach (int serviceId in orderedItems.Keys)
|
||||
{
|
||||
ServiceProviderItemBandwidth[] serviceBandwidth = CalculateItems(serviceId,
|
||||
orderedItems[serviceId], since);
|
||||
if (serviceBandwidth != null)
|
||||
itemsBandwidth.AddRange(serviceBandwidth);
|
||||
}
|
||||
|
||||
// update info in the database
|
||||
string xml = BuildDiskBandwidthStatisticsXml(itemsBandwidth.ToArray());
|
||||
PackageController.UpdatePackageBandwidth(packageId, xml);
|
||||
|
||||
// if everything is OK
|
||||
// update date
|
||||
PackageController.UpdatePackageBandwidthUpdate(packageId, nextUpdate);
|
||||
|
||||
// suspend package if requested
|
||||
if (suspendOverused)
|
||||
{
|
||||
// disk space
|
||||
QuotaValueInfo dsQuota = PackageController.GetPackageQuota(packageId, Quotas.OS_BANDWIDTH);
|
||||
|
||||
if (dsQuota.QuotaExhausted)
|
||||
PackageController.ChangePackageStatus(null, packageId, PackageStatus.Suspended, false);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
// load package details
|
||||
PackageInfo package = PackageController.GetPackage(packageId);
|
||||
|
||||
// load user details
|
||||
UserInfo user = PackageController.GetPackageOwner(package.PackageId);
|
||||
|
||||
// log error
|
||||
TaskManager.WriteError(String.Format("Error calculating bandwidth for '{0}' space of user '{1}': {2}",
|
||||
package.PackageName, user.Username, ex.ToString()));
|
||||
}
|
||||
}
|
||||
|
||||
public ServiceProviderItemBandwidth[] CalculateItems(int serviceId, List<ServiceProviderItem> items,
|
||||
DateTime since)
|
||||
{
|
||||
// convert items to SoapObjects
|
||||
List<SoapServiceProviderItem> objItems = new List<SoapServiceProviderItem>();
|
||||
foreach (ServiceProviderItem item in items)
|
||||
objItems.Add(SoapServiceProviderItem.Wrap(item));
|
||||
|
||||
int attempt = 0;
|
||||
int ATTEMPTS = 3;
|
||||
while (attempt < ATTEMPTS)
|
||||
{
|
||||
// increment attempt
|
||||
attempt++;
|
||||
|
||||
try
|
||||
{
|
||||
// send packet for calculation
|
||||
// invoke service provider
|
||||
//TaskManager.Write(String.Format("{0} - Invoke GetServiceItemsDiskSpace method ('{1}' items) - {2} attempt",
|
||||
// DateTime.Now, objItems.Count, attempt));
|
||||
|
||||
ServiceProvider prov = new ServiceProvider();
|
||||
ServiceProviderProxy.Init(prov, serviceId);
|
||||
return prov.GetServiceItemsBandwidth(objItems.ToArray(), since);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.WriteError(ex.ToString());
|
||||
}
|
||||
}
|
||||
|
||||
throw new Exception("The number of attemtps has been reached. The package calculation has been aborted.");
|
||||
}
|
||||
|
||||
private string BuildDiskBandwidthStatisticsXml(ServiceProviderItemBandwidth[] itemsBandwidth)
|
||||
{
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.Append("<items>");
|
||||
|
||||
if (itemsBandwidth != null)
|
||||
{
|
||||
CultureInfo culture = CultureInfo.InvariantCulture;
|
||||
|
||||
if (itemsBandwidth != null)
|
||||
{
|
||||
foreach (ServiceProviderItemBandwidth item in itemsBandwidth)
|
||||
{
|
||||
if (item != null && item.Days != null)
|
||||
{
|
||||
foreach (DailyStatistics day in item.Days)
|
||||
{
|
||||
string dt = new DateTime(day.Year, day.Month, day.Day).ToString("MM/dd/yyyy", culture);
|
||||
sb.Append("<item id=\"").Append(item.ItemId).Append("\"")
|
||||
.Append(" date=\"").Append(dt).Append("\"")
|
||||
.Append(" sent=\"").Append(day.BytesSent).Append("\"")
|
||||
.Append(" received=\"").Append(day.BytesReceived).Append("\"")
|
||||
.Append("></item>\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sb.Append("</items>");
|
||||
return sb.ToString();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,238 @@
|
|||
// Copyright (c) 2011, 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.Diagnostics;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using WebsitePanel.EnterpriseServer.Code.SharePoint;
|
||||
using WebsitePanel.Providers;
|
||||
using WebsitePanel.Providers.HostedSolution;
|
||||
using WebsitePanel.Providers.SharePoint;
|
||||
|
||||
namespace WebsitePanel.EnterpriseServer
|
||||
{
|
||||
public class CalculatePackagesDiskspaceTask : SchedulerTask
|
||||
{
|
||||
private readonly bool suspendOverused = false;
|
||||
|
||||
public override void DoWork()
|
||||
{
|
||||
// Input parameters:
|
||||
// - SUSPEND_OVERUSED_PACKAGES
|
||||
|
||||
CalculateDiskspace();
|
||||
}
|
||||
|
||||
public void CalculateDiskspace()
|
||||
{
|
||||
// get all owned packages
|
||||
List<PackageInfo> packages = PackageController.GetPackagePackages(TaskManager.PackageId, true);
|
||||
TaskManager.Write("Packages to calculate: " + packages.Count.ToString());
|
||||
|
||||
foreach (PackageInfo package in packages)
|
||||
{
|
||||
// calculating package diskspace
|
||||
CalculatePackage(package.PackageId);
|
||||
}
|
||||
}
|
||||
|
||||
public void CalculatePackage(int packageId)
|
||||
{
|
||||
try
|
||||
{
|
||||
// get all package items
|
||||
List<ServiceProviderItem> items = PackageController.GetServiceItemsForStatistics(
|
||||
0, packageId, true, false, false, false);
|
||||
|
||||
//TaskManager.Write("Items: " + items.Count);
|
||||
|
||||
// order items by service
|
||||
Dictionary<int, List<ServiceProviderItem>> orderedItems =
|
||||
PackageController.OrderServiceItemsByServices(items);
|
||||
|
||||
// calculate statistics for each service set
|
||||
List<ServiceProviderItemDiskSpace> itemsDiskspace = new List<ServiceProviderItemDiskSpace>();
|
||||
foreach (int serviceId in orderedItems.Keys)
|
||||
{
|
||||
ServiceProviderItemDiskSpace[] serviceDiskspace = CalculateItems(serviceId, orderedItems[serviceId]);
|
||||
if (serviceDiskspace != null)
|
||||
itemsDiskspace.AddRange(serviceDiskspace);
|
||||
}
|
||||
|
||||
// update info in the database
|
||||
string xml = BuildDiskSpaceStatisticsXml(itemsDiskspace.ToArray());
|
||||
PackageController.UpdatePackageDiskSpace(packageId, xml);
|
||||
//TaskManager.Write("XML: " + xml);
|
||||
|
||||
// suspend package if requested
|
||||
if (suspendOverused)
|
||||
{
|
||||
// disk space
|
||||
QuotaValueInfo dsQuota = PackageController.GetPackageQuota(packageId, Quotas.OS_DISKSPACE);
|
||||
|
||||
if (dsQuota.QuotaExhausted)
|
||||
PackageController.ChangePackageStatus(null, packageId, PackageStatus.Suspended, false);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
// load package details
|
||||
PackageInfo package = PackageController.GetPackage(packageId);
|
||||
|
||||
// load user details
|
||||
UserInfo user = PackageController.GetPackageOwner(package.PackageId);
|
||||
|
||||
// log error
|
||||
TaskManager.WriteError(String.Format("Error calculating diskspace for '{0}' space of user '{1}': {2}",
|
||||
package.PackageName, user.Username, ex.ToString()));
|
||||
}
|
||||
}
|
||||
|
||||
private static int GetExchangeServiceID(int packageId)
|
||||
{
|
||||
return PackageController.GetPackageServiceId(packageId, ResourceGroups.Exchange);
|
||||
}
|
||||
|
||||
|
||||
public ServiceProviderItemDiskSpace[] CalculateItems(int serviceId, List<ServiceProviderItem> items)
|
||||
{
|
||||
// convert items to SoapObjects
|
||||
List<SoapServiceProviderItem> objItems = new List<SoapServiceProviderItem>();
|
||||
|
||||
//hack for organization... Refactoring!!!
|
||||
|
||||
|
||||
List<ServiceProviderItemDiskSpace> organizationDiskSpaces = new List<ServiceProviderItemDiskSpace>();
|
||||
foreach (ServiceProviderItem item in items)
|
||||
{
|
||||
long size = 0;
|
||||
if (item is Organization)
|
||||
{
|
||||
Organization org = (Organization) item;
|
||||
|
||||
//Exchange DiskSpace
|
||||
if (!string.IsNullOrEmpty(org.GlobalAddressList))
|
||||
{
|
||||
int exchangeServiceId = GetExchangeServiceID(org.PackageId);
|
||||
ServiceProvider exchangeProvider = ExchangeServerController.GetExchangeServiceProvider(exchangeServiceId, item.ServiceId);
|
||||
|
||||
SoapServiceProviderItem soapOrg = SoapServiceProviderItem.Wrap(org);
|
||||
ServiceProviderItemDiskSpace[] itemsDiskspace =
|
||||
exchangeProvider.GetServiceItemsDiskSpace(new SoapServiceProviderItem[] {soapOrg});
|
||||
|
||||
if (itemsDiskspace != null && itemsDiskspace.Length > 0)
|
||||
{
|
||||
size += itemsDiskspace[0].DiskSpace;
|
||||
}
|
||||
}
|
||||
|
||||
// Crm DiskSpace
|
||||
if (org.CrmOrganizationId != Guid.Empty)
|
||||
{
|
||||
//CalculateCrm DiskSpace
|
||||
}
|
||||
|
||||
//SharePoint DiskSpace
|
||||
|
||||
int res;
|
||||
|
||||
PackageContext cntx = PackageController.GetPackageContext(org.PackageId);
|
||||
|
||||
if (cntx.Groups.ContainsKey(ResourceGroups.HostedSharePoint))
|
||||
{
|
||||
SharePointSiteDiskSpace[] sharePointSiteDiskSpaces =
|
||||
HostedSharePointServerController.CalculateSharePointSitesDiskSpace(org.Id, out res);
|
||||
if (res == 0)
|
||||
{
|
||||
foreach (SharePointSiteDiskSpace currecnt in sharePointSiteDiskSpaces)
|
||||
{
|
||||
size += currecnt.DiskSpace;
|
||||
}
|
||||
}
|
||||
}
|
||||
ServiceProviderItemDiskSpace tmp = new ServiceProviderItemDiskSpace();
|
||||
tmp.ItemId = item.Id;
|
||||
tmp.DiskSpace = size;
|
||||
organizationDiskSpaces.Add(tmp);
|
||||
}
|
||||
else
|
||||
objItems.Add(SoapServiceProviderItem.Wrap(item));
|
||||
}
|
||||
|
||||
|
||||
int attempt = 0;
|
||||
int ATTEMPTS = 3;
|
||||
while (attempt < ATTEMPTS)
|
||||
{
|
||||
// increment attempt
|
||||
attempt++;
|
||||
|
||||
try
|
||||
{
|
||||
// send packet for calculation
|
||||
// invoke service provider
|
||||
//TaskManager.Write(String.Format("{0} - Invoke GetServiceItemsDiskSpace method ('{1}' items) - {2} attempt",
|
||||
// DateTime.Now, objItems.Count, attempt));
|
||||
|
||||
ServiceProvider prov = new ServiceProvider();
|
||||
ServiceProviderProxy.Init(prov, serviceId);
|
||||
ServiceProviderItemDiskSpace[] itemsDiskSpace = prov.GetServiceItemsDiskSpace(objItems.ToArray());
|
||||
if (itemsDiskSpace != null && itemsDiskSpace.Length > 0)
|
||||
organizationDiskSpaces.AddRange(itemsDiskSpace);
|
||||
|
||||
return organizationDiskSpaces.ToArray();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.WriteError(ex.ToString());
|
||||
}
|
||||
}
|
||||
|
||||
throw new Exception("The number of attemtps has been reached. The package calculation has been aborted.");
|
||||
}
|
||||
|
||||
private string BuildDiskSpaceStatisticsXml(ServiceProviderItemDiskSpace[] itemsDiskspace)
|
||||
{
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.Append("<items>");
|
||||
|
||||
if (itemsDiskspace != null)
|
||||
{
|
||||
foreach (ServiceProviderItemDiskSpace item in itemsDiskspace)
|
||||
{
|
||||
sb.Append("<item id=\"").Append(item.ItemId).Append("\"")
|
||||
.Append(" bytes=\"").Append(item.DiskSpace).Append("\"></item>\n");
|
||||
}
|
||||
}
|
||||
|
||||
sb.Append("</items>");
|
||||
return sb.ToString();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,105 @@
|
|||
// Copyright (c) 2011, 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;
|
||||
using System.Collections.Generic;
|
||||
|
||||
using WebsitePanel.EnterpriseServer;
|
||||
|
||||
namespace WebsitePanel.Ecommerce.EnterpriseServer
|
||||
{
|
||||
public class CancelOverdueInvoicesTask : SchedulerTask
|
||||
{
|
||||
public override void DoWork()
|
||||
{
|
||||
// cancel overdue services
|
||||
CancelOverdueServices();
|
||||
}
|
||||
|
||||
public void CancelOverdueServices()
|
||||
{
|
||||
// load store settings
|
||||
StoreSettings settings = StorehouseController.GetStoreSettings(SecurityContext.User.UserId,
|
||||
StoreSettings.SYSTEM_SETTINGS);
|
||||
//
|
||||
int threshold = Convert.ToInt32(settings["SvcCancelThreshold"]);
|
||||
//
|
||||
TimeSpan ts = new TimeSpan(threshold, 0, 0, 0);
|
||||
// calculate actual suspend date
|
||||
DateTime dueDate = DateTime.Now.Subtract(ts);
|
||||
// lookup for overdue invoices
|
||||
List<InvoiceItem> items = InvoiceController.GetInvoicesItemsOverdue(SecurityContext.User.UserId, dueDate);
|
||||
// TRACE
|
||||
TaskManager.Write("Cancel overdue services");
|
||||
TaskManager.WriteParameter("Items found", items.Count);
|
||||
//
|
||||
foreach (InvoiceItem item in items)
|
||||
{
|
||||
try
|
||||
{
|
||||
TaskManager.Write("Cancelling service");
|
||||
// cancelling
|
||||
GenericSvcResult result = CancelService(item.ServiceId, true);
|
||||
// LOG ERROR
|
||||
if (!result.Succeed)
|
||||
{
|
||||
TaskManager.WriteError(result.Error);
|
||||
if (!String.IsNullOrEmpty(result.ErrorCode))
|
||||
TaskManager.WriteParameter("Error code", result.ErrorCode);
|
||||
TaskManager.WriteParameter("Result code", result.ResultCode);
|
||||
// go to next item
|
||||
continue;
|
||||
}
|
||||
//
|
||||
TaskManager.Write("Cancelled");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.WriteError(ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public GenericSvcResult CancelService(int serviceId, bool sendEmail)
|
||||
{
|
||||
GenericSvcResult result = null;
|
||||
// load svc type
|
||||
ProductType svc_type = ServiceController.GetServiceItemType(serviceId);
|
||||
// instantiate svc controller
|
||||
IServiceProvisioning controller = (IServiceProvisioning)Activator.CreateInstance(
|
||||
Type.GetType(svc_type.ProvisioningController));
|
||||
// create context
|
||||
ProvisioningContext context = controller.GetProvisioningContext(serviceId, sendEmail);
|
||||
// cancel svc
|
||||
result = controller.CancelService(context);
|
||||
//
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,222 @@
|
|||
// Copyright (c) 2011, 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.IO;
|
||||
using System.Net;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace WebsitePanel.EnterpriseServer
|
||||
{
|
||||
public class CheckWebSiteTask : SchedulerTask
|
||||
{
|
||||
private class WebSiteResponse
|
||||
{
|
||||
public int Status;
|
||||
public string Text;
|
||||
}
|
||||
|
||||
public override void DoWork()
|
||||
{
|
||||
// Input parameters:
|
||||
// - URL
|
||||
// - USERNAME
|
||||
// - PASSWORD
|
||||
// - RESPONSE_STATUS
|
||||
// - RESPONSE_CONTAIN
|
||||
// - RESPONSE_DOESNT_CONTAIN
|
||||
// - MAIL_FROM
|
||||
// - MAIL_TO
|
||||
// - MAIL_SUBJECT
|
||||
// - MAIL_BODY
|
||||
|
||||
// get input parameters
|
||||
string url = (string)TaskManager.TaskParameters["URL"];
|
||||
string username = (string)TaskManager.TaskParameters["USERNAME"];
|
||||
string password = (string)TaskManager.TaskParameters["PASSWORD"];
|
||||
string strResponseStatus = (string)TaskManager.TaskParameters["RESPONSE_STATUS"];
|
||||
string responseContains = (string)TaskManager.TaskParameters["RESPONSE_CONTAIN"];
|
||||
string responseNotContains = (string)TaskManager.TaskParameters["RESPONSE_DOESNT_CONTAIN"];
|
||||
|
||||
bool useResponseStatus = Convert.ToBoolean(TaskManager.TaskParameters["USE_RESPONSE_STATUS"]);
|
||||
bool useResponseContains = Convert.ToBoolean(TaskManager.TaskParameters["USE_RESPONSE_CONTAIN"]);
|
||||
bool useResponseDoesntContain = Convert.ToBoolean(TaskManager.TaskParameters["USE_RESPONSE_DOESNT_CONTAIN"]);
|
||||
|
||||
// check input parameters
|
||||
if (String.IsNullOrEmpty(url))
|
||||
{
|
||||
TaskManager.WriteWarning("Specify 'Web Site URL' task parameter.");
|
||||
return;
|
||||
}
|
||||
|
||||
if ((String.IsNullOrEmpty(strResponseStatus) || !useResponseStatus)
|
||||
&& (String.IsNullOrEmpty(responseContains) || !useResponseContains)
|
||||
&& (String.IsNullOrEmpty(responseNotContains) || !useResponseDoesntContain))
|
||||
{
|
||||
TaskManager.WriteWarning("Specify one of 'Response Status', 'Response Contain' or 'Response Doesn't Contain' parameters.");
|
||||
return;
|
||||
}
|
||||
|
||||
int responseStatus = Utils.ParseInt(strResponseStatus, -1);
|
||||
if (!String.IsNullOrEmpty(strResponseStatus) && responseStatus == -1)
|
||||
{
|
||||
TaskManager.WriteWarning("Specify correct response HTTP status, e.g. 404, 500, 503, etc.");
|
||||
return;
|
||||
}
|
||||
|
||||
// load web site
|
||||
WebSiteResponse resp = GetWebDocument(url, username, password);
|
||||
|
||||
// check if there was a generic error
|
||||
if (resp.Status == -1)
|
||||
{
|
||||
SendMailMessage(url, resp.Text, "");
|
||||
}
|
||||
|
||||
bool sendMessage = false;
|
||||
|
||||
// check status
|
||||
if (responseStatus != -1)
|
||||
{
|
||||
sendMessage |= ((resp.Status == responseStatus) && useResponseStatus);
|
||||
}
|
||||
|
||||
// check "contains"
|
||||
if (!String.IsNullOrEmpty(responseContains))
|
||||
{
|
||||
sendMessage |= ((resp.Text.ToLower().IndexOf(responseContains.ToLower()) != -1) && useResponseContains);
|
||||
}
|
||||
|
||||
// check "not contains"
|
||||
if (!String.IsNullOrEmpty(responseNotContains))
|
||||
{
|
||||
sendMessage |= ((resp.Text.ToLower().IndexOf(responseNotContains.ToLower()) == -1) && useResponseDoesntContain);
|
||||
}
|
||||
|
||||
if (sendMessage)
|
||||
SendMailMessage(url, "", resp.Text);
|
||||
}
|
||||
|
||||
private void SendMailMessage(string url, string message, string content)
|
||||
{
|
||||
// input parameters
|
||||
string mailFrom = (string)TaskManager.TaskParameters["MAIL_FROM"];
|
||||
string mailTo = (string)TaskManager.TaskParameters["MAIL_TO"];
|
||||
string mailSubject = (string)TaskManager.TaskParameters["MAIL_SUBJECT"];
|
||||
string mailBody = (string)TaskManager.TaskParameters["MAIL_BODY"];
|
||||
|
||||
if (String.IsNullOrEmpty(mailTo))
|
||||
{
|
||||
TaskManager.WriteWarning("The e-mail message has not been sent because 'Mail To' is empty.");
|
||||
}
|
||||
else
|
||||
{
|
||||
if (String.IsNullOrEmpty(mailFrom))
|
||||
mailFrom = "automatic@localhost";
|
||||
|
||||
if (!String.IsNullOrEmpty(mailSubject))
|
||||
{
|
||||
mailSubject = Utils.ReplaceStringVariable(mailSubject, "url", url);
|
||||
}
|
||||
|
||||
if (!String.IsNullOrEmpty(mailBody))
|
||||
{
|
||||
mailBody = Utils.ReplaceStringVariable(mailBody, "url", url);
|
||||
mailBody = Utils.ReplaceStringVariable(mailBody, "message", message);
|
||||
mailBody = Utils.ReplaceStringVariable(mailBody, "content", content);
|
||||
}
|
||||
else
|
||||
{
|
||||
mailBody = message;
|
||||
}
|
||||
|
||||
// send mail message
|
||||
MailHelper.SendMessage(mailFrom, mailTo, mailSubject, mailBody, false);
|
||||
}
|
||||
}
|
||||
|
||||
private WebSiteResponse GetWebDocument(string url, string username, string password)
|
||||
{
|
||||
WebSiteResponse result = new WebSiteResponse();
|
||||
HttpWebResponse resp = null;
|
||||
StringBuilder sb = new StringBuilder();
|
||||
try
|
||||
{
|
||||
WebRequest req = WebRequest.Create(url);
|
||||
|
||||
// set site credentials if required
|
||||
if (!String.IsNullOrEmpty(username))
|
||||
{
|
||||
req.Credentials = new NetworkCredential(username, password);
|
||||
}
|
||||
|
||||
resp = (HttpWebResponse)req.GetResponse();
|
||||
Stream respStream = resp.GetResponseStream();
|
||||
string charSet = !String.IsNullOrEmpty(resp.CharacterSet) ? resp.CharacterSet : "utf-8";
|
||||
Encoding encode = System.Text.Encoding.GetEncoding(charSet);
|
||||
|
||||
StreamReader sr = new StreamReader(respStream, encode);
|
||||
|
||||
Char[] read = new Char[256];
|
||||
int count = sr.Read(read, 0, 256);
|
||||
|
||||
while (count > 0)
|
||||
{
|
||||
String str = new String(read, 0, count);
|
||||
sb.Append(str);
|
||||
count = sr.Read(read, 0, 256);
|
||||
}
|
||||
|
||||
result.Status = (int)resp.StatusCode;
|
||||
result.Text = sb.ToString();
|
||||
}
|
||||
catch (WebException ex)
|
||||
{
|
||||
result.Status = (int)((HttpWebResponse)ex.Response).StatusCode;
|
||||
result.Text = ex.ToString();
|
||||
TaskManager.WriteError(ex.ToString());
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
result.Status = -1;
|
||||
result.Text = ex.ToString();
|
||||
TaskManager.WriteError(ex.ToString());
|
||||
}
|
||||
finally
|
||||
{
|
||||
if (resp != null)
|
||||
{
|
||||
resp.Close();
|
||||
}
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,134 @@
|
|||
// Copyright (c) 2011, 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.IO;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
using WebsitePanel.Server;
|
||||
|
||||
namespace WebsitePanel.EnterpriseServer
|
||||
{
|
||||
public class FTPFilesTask : SchedulerTask
|
||||
{
|
||||
public override void DoWork()
|
||||
{
|
||||
// Input parameters:
|
||||
// - FILE_PATH
|
||||
// - FTP_SERVER
|
||||
// - FTP_USERNAME
|
||||
// - FTP_PASSWORD
|
||||
// - FTP_FOLDER
|
||||
|
||||
// get input parameters
|
||||
string filePath = (string)TaskManager.TaskParameters["FILE_PATH"];
|
||||
string ftpServer = (string)TaskManager.TaskParameters["FTP_SERVER"];
|
||||
string ftpUsername = (string)TaskManager.TaskParameters["FTP_USERNAME"];
|
||||
string ftpPassword = (string)TaskManager.TaskParameters["FTP_PASSWORD"];
|
||||
string ftpFolder = (string)TaskManager.TaskParameters["FTP_FOLDER"];
|
||||
|
||||
// check input parameters
|
||||
if (String.IsNullOrEmpty(filePath))
|
||||
{
|
||||
TaskManager.WriteWarning("Specify 'File' task parameter");
|
||||
return;
|
||||
}
|
||||
|
||||
if (String.IsNullOrEmpty(ftpServer))
|
||||
{
|
||||
TaskManager.WriteWarning("Specify 'FTP Server' task parameter");
|
||||
return;
|
||||
}
|
||||
|
||||
// substitute parameters
|
||||
DateTime d = DateTime.Now;
|
||||
string date = d.ToString("yyyyMMdd");
|
||||
string time = d.ToString("HHmm");
|
||||
|
||||
filePath = Utils.ReplaceStringVariable(filePath, "date", date);
|
||||
filePath = Utils.ReplaceStringVariable(filePath, "time", time);
|
||||
|
||||
// build FTP command file
|
||||
StringBuilder sb = new StringBuilder();
|
||||
StringWriter writer = new StringWriter(sb);
|
||||
|
||||
// FTP server
|
||||
writer.WriteLine("open " + ftpServer);
|
||||
|
||||
// check if anonymous mode
|
||||
if (String.IsNullOrEmpty(ftpUsername))
|
||||
{
|
||||
ftpUsername = "anonymous";
|
||||
ftpPassword = "anonymous@email.com";
|
||||
}
|
||||
|
||||
// FTP username/password
|
||||
writer.WriteLine(ftpUsername);
|
||||
writer.WriteLine(ftpPassword);
|
||||
|
||||
// check if we need to change remote folder
|
||||
if (!String.IsNullOrEmpty(ftpFolder))
|
||||
{
|
||||
writer.WriteLine("cd " + ftpFolder.Replace("\\", "/"));
|
||||
}
|
||||
|
||||
// file to send
|
||||
writer.WriteLine("binary");
|
||||
writer.WriteLine("put " + FilesController.GetFullPackagePath(TaskManager.PackageId, filePath));
|
||||
|
||||
// bye
|
||||
writer.WriteLine("bye");
|
||||
|
||||
string cmdBatch = sb.ToString();
|
||||
|
||||
// create temp file in user space
|
||||
string cmdPath = Utils.GetRandomString(10) + ".txt";
|
||||
string fullCmdPath = FilesController.GetFullPackagePath(TaskManager.PackageId, cmdPath);
|
||||
|
||||
// upload batch
|
||||
FilesController.UpdateFileBinaryContent(TaskManager.PackageId, cmdPath, Encoding.UTF8.GetBytes(cmdBatch));
|
||||
|
||||
// execute system command
|
||||
// load OS service
|
||||
int serviceId = PackageController.GetPackageServiceId(TaskManager.PackageId, ResourceGroups.Os);
|
||||
|
||||
// load service
|
||||
ServiceInfo service = ServerController.GetServiceInfo(serviceId);
|
||||
if (service == null)
|
||||
return;
|
||||
|
||||
WindowsServer winServer = new WindowsServer();
|
||||
ServiceProviderProxy.ServerInit(winServer, service.ServerId);
|
||||
TaskManager.Write(winServer.ExecuteSystemCommand("ftp.exe", "-s:" + fullCmdPath));
|
||||
|
||||
// delete batch file
|
||||
FilesController.DeleteFiles(TaskManager.PackageId, new string[] { cmdPath });
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,103 @@
|
|||
// Copyright (c) 2011, 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;
|
||||
using System.Collections.Generic;
|
||||
|
||||
using WebsitePanel.EnterpriseServer;
|
||||
|
||||
namespace WebsitePanel.Ecommerce.EnterpriseServer
|
||||
{
|
||||
public class GenerateInvoicesTask : SchedulerTask
|
||||
{
|
||||
public override void DoWork()
|
||||
{
|
||||
// invoice active services
|
||||
InvoiceActiveServices();
|
||||
}
|
||||
|
||||
public void InvoiceActiveServices()
|
||||
{
|
||||
DateTime dateTimeNow = DateTime.Now;
|
||||
// load store settings
|
||||
StoreSettings settings = StorehouseController.GetStoreSettings(SecurityContext.User.UserId,
|
||||
StoreSettings.SYSTEM_SETTINGS);
|
||||
//
|
||||
int threshold = Convert.ToInt32(settings["SvcInvoiceThreshold"]);
|
||||
// get expiring services today
|
||||
List<Service> services = ServiceController.GetServicesToInvoice(SecurityContext.User.UserId,
|
||||
dateTimeNow, threshold);
|
||||
// group services by users
|
||||
Dictionary<string, List<int>> usersServices = new Dictionary<string, List<int>>();
|
||||
// iterate
|
||||
foreach (Service service in services)
|
||||
{
|
||||
if (!usersServices.ContainsKey(service.ContractId))
|
||||
usersServices.Add(service.ContractId, new List<int>());
|
||||
|
||||
usersServices[service.ContractId].Add(service.ServiceId);
|
||||
}
|
||||
// generate invoice per contract
|
||||
foreach (string contractId in usersServices.Keys)
|
||||
{
|
||||
try
|
||||
{
|
||||
TaskManager.Write("Creating invoice");
|
||||
// TRACE
|
||||
Contract contract = ContractSystem.ContractController.GetContract(contractId);
|
||||
ContractAccount account = ContractSystem.ContractController.GetContractAccountSettings(contractId);
|
||||
TaskManager.WriteParameter("ContractID", contractId);
|
||||
TaskManager.WriteParameter("Username", account[ContractAccount.USERNAME]);
|
||||
//
|
||||
List<int> userSvcs = usersServices[contractId];
|
||||
// build invoice items
|
||||
List<InvoiceItem> invoiceLines = InvoiceController.CalculateInvoiceLinesForServices(userSvcs);
|
||||
//
|
||||
int resultCode = InvoiceController.AddInvoice(contractId, invoiceLines, null);
|
||||
//
|
||||
if (resultCode < 1)
|
||||
{
|
||||
TaskManager.WriteParameter("ResultCode", resultCode);
|
||||
continue;
|
||||
}
|
||||
//
|
||||
if (ServiceController.SetUsageRecordsClosed(userSvcs.ToArray()) != 0)
|
||||
TaskManager.WriteWarning("Unable to close usage records automatically");
|
||||
// TRACE
|
||||
TaskManager.WriteParameter("InvoiceID", resultCode);
|
||||
TaskManager.Write("Succeed");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.WriteError(ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,119 @@
|
|||
// Copyright (c) 2011, 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.IO;
|
||||
using System.Net.Mail;
|
||||
using System.Net.Mime;
|
||||
using System.Text;
|
||||
using WebsitePanel.EnterpriseServer.Code.HostedSolution;
|
||||
using WebsitePanel.Providers.HostedSolution;
|
||||
|
||||
namespace WebsitePanel.EnterpriseServer
|
||||
{
|
||||
public class HostedSolutionReportTask : SchedulerTask
|
||||
{
|
||||
private static readonly string EXCHANGE_REPORT = "EXCHANGE_REPORT";
|
||||
private static readonly string ORGANIZATION_REPORT = "ORGANIZATION_REPORT";
|
||||
private static readonly string SHAREPOINT_REPORT = "SHAREPOINT_REPORT";
|
||||
private static readonly string CRM_REPORT = "CRM_REPORT";
|
||||
private static readonly string EMAIL = "EMAIL";
|
||||
|
||||
|
||||
public override void DoWork()
|
||||
{
|
||||
try
|
||||
{
|
||||
bool isExchange = Utils.ParseBool(TaskManager.TaskParameters[EXCHANGE_REPORT], false);
|
||||
bool isSharePoint = Utils.ParseBool(TaskManager.TaskParameters[SHAREPOINT_REPORT], false);
|
||||
bool isCRM = Utils.ParseBool(TaskManager.TaskParameters[CRM_REPORT], false);
|
||||
bool isOrganization = Utils.ParseBool(TaskManager.TaskParameters[ORGANIZATION_REPORT], false);
|
||||
|
||||
string email = TaskManager.TaskParameters[EMAIL].ToString();
|
||||
|
||||
|
||||
UserInfo user = PackageController.GetPackageOwner(TaskManager.PackageId);
|
||||
EnterpriseSolutionStatisticsReport report =
|
||||
ReportController.GetEnterpriseSolutionStatisticsReport(user.UserId, isExchange, isSharePoint, isCRM,
|
||||
isOrganization);
|
||||
|
||||
|
||||
SendMessage(user, email, isExchange && report.ExchangeReport != null ? report.ExchangeReport.ToCSV() : string.Empty,
|
||||
isSharePoint && report.SharePointReport != null ? report.SharePointReport.ToCSV() : string.Empty,
|
||||
isCRM && report.CRMReport != null ? report.CRMReport.ToCSV() : string.Empty,
|
||||
isOrganization && report.OrganizationReport != null ? report.OrganizationReport.ToCSV() : string.Empty);
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
TaskManager.WriteError(ex);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
private static void PrepareAttament(string name, string csv, List<Attachment> attacments)
|
||||
{
|
||||
if (!string.IsNullOrEmpty(csv))
|
||||
{
|
||||
UTF8Encoding encoding = new UTF8Encoding();
|
||||
|
||||
byte[] buffer = encoding.GetBytes(csv);
|
||||
MemoryStream stream = new MemoryStream(buffer);
|
||||
Attachment attachment = new Attachment(stream, name, MediaTypeNames.Text.Plain);
|
||||
|
||||
attacments.Add(attachment);
|
||||
}
|
||||
}
|
||||
|
||||
private void SendMessage(UserInfo user,string email, string exchange_csv, string sharepoint_csv, string crm_csv, string organization_csv)
|
||||
{
|
||||
List<Attachment> attacments = new List<Attachment>();
|
||||
PrepareAttament("exchange.csv", exchange_csv, attacments);
|
||||
PrepareAttament("sharepoint.csv", sharepoint_csv, attacments);
|
||||
PrepareAttament("crm.csv", crm_csv, attacments);
|
||||
PrepareAttament("organization.csv", organization_csv, attacments);
|
||||
|
||||
|
||||
|
||||
|
||||
// get letter settings
|
||||
UserSettings settings = UserController.GetUserSettings(user.UserId, UserSettings.HOSTED_SOLUTION_REPORT);
|
||||
|
||||
string from = settings["From"];
|
||||
string cc = settings["CC"];
|
||||
string subject = settings["Subject"];
|
||||
string body = user.HtmlMail ? settings["HtmlBody"] : settings["TextBody"];
|
||||
bool isHtml = user.HtmlMail;
|
||||
|
||||
MailPriority priority = MailPriority.Normal;
|
||||
|
||||
MailHelper.SendMessage(from, email, cc, subject, body, priority, isHtml, attacments.ToArray());
|
||||
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,267 @@
|
|||
// Copyright (c) 2011, 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.Text;
|
||||
using System.Data;
|
||||
|
||||
namespace WebsitePanel.EnterpriseServer
|
||||
{
|
||||
public class NotifyOverusedDatabasesTask : SchedulerTask
|
||||
{
|
||||
public const string DISKSPACE_FORMAT_STRING = "{0} - {1}Mb ({2}%)";
|
||||
public const string ALLOC_FORMAT_STRING = "{0} - {1}Mb";
|
||||
|
||||
public override void DoWork()
|
||||
{
|
||||
// Input parameters:
|
||||
// - DISKSPACE_OVERUSED
|
||||
// - BANDWIDTH_OVERUSED
|
||||
|
||||
// get the list of all packages
|
||||
List<PackageInfo> packages = PackageController.GetPackagePackages(TaskManager.PackageId, false);
|
||||
TaskManager.Write("Packages to verify: " + packages.Count.ToString());
|
||||
|
||||
bool checkMSSQL = (String.Compare((string)TaskManager.TaskParameters["MSSQL_OVERUSED"], "true", true) == 0);
|
||||
bool checkMySQL = (String.Compare((string)TaskManager.TaskParameters["MYSQL_OVERUSED"], "true", true) == 0);
|
||||
|
||||
bool sendWarningEmail = Convert.ToBoolean(TaskManager.TaskParameters["SEND_WARNING_EMAIL"]);
|
||||
bool sendOverusedEmail = Convert.ToBoolean(TaskManager.TaskParameters["SEND_OVERUSED_EMAIL"]);
|
||||
int warningUsageThreshold = Convert.ToInt32(TaskManager.TaskParameters["WARNING_USAGE_THRESHOLD"]);
|
||||
int overusedUsageThreshold = Convert.ToInt32(TaskManager.TaskParameters["OVERUSED_USAGE_THRESHOLD"]);
|
||||
string warningMailFrom = Convert.ToString(TaskManager.TaskParameters["WARNING_MAIL_FROM"]);
|
||||
string warningMailBcc = Convert.ToString(TaskManager.TaskParameters["WARNING_MAIL_BCC"]);
|
||||
string warningMailSubject = Convert.ToString(TaskManager.TaskParameters["WARNING_MAIL_SUBJECT"]);
|
||||
string warningMailBody = Convert.ToString(TaskManager.TaskParameters["WARNING_MAIL_BODY"]);
|
||||
string overusedMailFrom = Convert.ToString(TaskManager.TaskParameters["OVERUSED_MAIL_FROM"]);
|
||||
string overusedMailBcc = Convert.ToString(TaskManager.TaskParameters["OVERUSED_MAIL_BCC"]);
|
||||
string overusedMailSubject = Convert.ToString(TaskManager.TaskParameters["OVERUSED_MAIL_SUBJECT"]);
|
||||
string overusedMailBody = Convert.ToString(TaskManager.TaskParameters["OVERUSED_MAIL_BODY"]);
|
||||
|
||||
int overusedPackages = 0;
|
||||
|
||||
foreach (PackageInfo package in packages)
|
||||
{
|
||||
UserInfo userInfo = UserController.GetUser(package.UserId);
|
||||
|
||||
List<DatabaseQuota> quotaMSSQL = new List<DatabaseQuota>();
|
||||
List<DatabaseQuota> quotaMYSQL = new List<DatabaseQuota>();
|
||||
|
||||
if (checkMSSQL || checkMySQL)
|
||||
{
|
||||
QuotaValueInfo dsQuota = null;
|
||||
DataSet Diskspace = PackageController.GetPackageDiskspace(package.PackageId);
|
||||
foreach (DataRow spaceRow in Diskspace.Tables[0].Rows)
|
||||
{
|
||||
string groupName = spaceRow["GroupName"].ToString();
|
||||
if (checkMSSQL && groupName.ToUpper().Contains("MSSQL"))
|
||||
{
|
||||
dsQuota = PackageController.GetPackageQuota(package.PackageId, groupName + ".MaxDatabaseSize");
|
||||
if (dsQuota.QuotaAllocatedValue > 0)
|
||||
{
|
||||
int databaseSpaceUsage = Convert.ToInt32(spaceRow["Diskspace"]) * 100 / dsQuota.QuotaAllocatedValue;
|
||||
quotaMSSQL.Add(new DatabaseQuota(groupName.ToUpper().Replace("MSSQL","SQL Server "),
|
||||
Convert.ToInt32(spaceRow["Diskspace"]), dsQuota.QuotaAllocatedValue,
|
||||
databaseSpaceUsage < warningUsageThreshold,
|
||||
databaseSpaceUsage < overusedUsageThreshold));
|
||||
}
|
||||
}
|
||||
if (checkMySQL && groupName.ToUpper().Contains("MYSQL"))
|
||||
{
|
||||
dsQuota = PackageController.GetPackageQuota(package.PackageId, groupName + ".MaxDatabaseSize");
|
||||
if (dsQuota.QuotaAllocatedValue > 0)
|
||||
{
|
||||
int databaseSpaceUsage = Convert.ToInt32(spaceRow["Diskspace"]) * 100 / dsQuota.QuotaAllocatedValue;
|
||||
quotaMYSQL.Add(new DatabaseQuota(groupName.ToUpper().Replace("MYSQL", "MySQL "),
|
||||
Convert.ToInt32(spaceRow["Diskspace"]), dsQuota.QuotaAllocatedValue,
|
||||
databaseSpaceUsage < warningUsageThreshold,
|
||||
databaseSpaceUsage < overusedUsageThreshold));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
string userName = String.Format("{0} {1} ({2})/{3}", userInfo.FirstName, userInfo.LastName, userInfo.Username, userInfo.Email);
|
||||
bool notifyOverusedByMail = false;
|
||||
bool notifyWarningByMail = false;
|
||||
List<string> formatItems = new List<string>();
|
||||
List<string> formatWarningThreshold = new List<string>();
|
||||
List<string> formatOverusedThreshold = new List<string>();
|
||||
// add Microsoft SQL usage if enabled
|
||||
if (checkMSSQL)
|
||||
{
|
||||
foreach (DatabaseQuota q in quotaMSSQL)
|
||||
{
|
||||
if (!q.BelowWarningThreshold || !q.BelowUsageThreshold)
|
||||
{
|
||||
formatItems.Add(String.Format(DISKSPACE_FORMAT_STRING, q.ProviderName, q.SpaceUsed, q.SpaceUsed * 100 / q.SpaceAllocated));
|
||||
}
|
||||
if (!q.BelowWarningThreshold)
|
||||
{
|
||||
formatWarningThreshold.Add(String.Format(ALLOC_FORMAT_STRING, q.ProviderName, q.SpaceAllocated));
|
||||
notifyWarningByMail = true;
|
||||
}
|
||||
if (!q.BelowUsageThreshold)
|
||||
{
|
||||
formatOverusedThreshold.Add(String.Format(ALLOC_FORMAT_STRING, q.ProviderName, q.SpaceAllocated));
|
||||
notifyOverusedByMail = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// add MySQL usage if enabled
|
||||
if (checkMySQL)
|
||||
{
|
||||
foreach (DatabaseQuota q in quotaMYSQL)
|
||||
{
|
||||
if (!q.BelowWarningThreshold || !q.BelowUsageThreshold)
|
||||
{
|
||||
formatItems.Add(String.Format(DISKSPACE_FORMAT_STRING, q.ProviderName, q.SpaceUsed, (q.SpaceUsed * 100) / q.SpaceAllocated));
|
||||
}
|
||||
if (!q.BelowWarningThreshold)
|
||||
{
|
||||
formatWarningThreshold.Add(String.Format(ALLOC_FORMAT_STRING, q.ProviderName, q.SpaceAllocated));
|
||||
notifyWarningByMail = true;
|
||||
}
|
||||
if (!q.BelowUsageThreshold)
|
||||
{
|
||||
formatOverusedThreshold.Add(String.Format(ALLOC_FORMAT_STRING, q.ProviderName, q.SpaceAllocated));
|
||||
notifyOverusedByMail = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
// build usage strings
|
||||
string usage = String.Join("\n", formatItems.ToArray());
|
||||
string usageWarning = String.Join("\n", formatWarningThreshold.ToArray());
|
||||
string usageOverused = String.Join("\n", formatOverusedThreshold.ToArray());
|
||||
|
||||
string warningMailSubjectProcessed = ReplaceVariables(warningMailSubject, usageWarning, usage, package.PackageName, userName);
|
||||
string warningMailBodyProcessed = ReplaceVariables(warningMailBody, usageWarning, usage, package.PackageName, userName);
|
||||
|
||||
string overusedMailSubjectProcessed = ReplaceVariables(overusedMailSubject, usageOverused, usage, package.PackageName, userName);
|
||||
string overusedMailBodyProcessed = ReplaceVariables(overusedMailBody, usageOverused, usage, package.PackageName, userName);
|
||||
|
||||
|
||||
// Send email notifications
|
||||
if (sendWarningEmail && notifyWarningByMail)
|
||||
{
|
||||
// Send warning email.
|
||||
this.SendEmail(warningMailFrom, userInfo.Email, warningMailBcc, warningMailSubjectProcessed, warningMailBodyProcessed, false);
|
||||
}
|
||||
|
||||
if (sendOverusedEmail && notifyOverusedByMail)
|
||||
{
|
||||
// Send overused email.
|
||||
this.SendEmail(overusedMailFrom, userInfo.Email, overusedMailBcc, overusedMailSubjectProcessed, overusedMailBodyProcessed, false);
|
||||
}
|
||||
if (notifyOverusedByMail)
|
||||
{
|
||||
overusedPackages++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// log results
|
||||
TaskManager.Write("Total packages overused: " + overusedPackages.ToString());
|
||||
}
|
||||
|
||||
private string ReplaceVariables(string content, string threshold, string usage, string spaceName, string customerName)
|
||||
{
|
||||
if (!String.IsNullOrEmpty(content))
|
||||
{
|
||||
content = Utils.ReplaceStringVariable(content, "threshold", threshold);
|
||||
content = Utils.ReplaceStringVariable(content, "date", DateTime.Now.ToString());
|
||||
content = Utils.ReplaceStringVariable(content, "usage", usage);
|
||||
content = Utils.ReplaceStringVariable(content, "space", spaceName);
|
||||
content = Utils.ReplaceStringVariable(content, "customer", customerName);
|
||||
}
|
||||
return content;
|
||||
}
|
||||
|
||||
private void SendEmail(string from, string to, string bcc, string subject, string body, bool isHtml)
|
||||
{
|
||||
// check input parameters
|
||||
if (String.IsNullOrEmpty(from))
|
||||
{
|
||||
TaskManager.WriteWarning("Specify 'Mail From' task parameter");
|
||||
return;
|
||||
}
|
||||
|
||||
if (String.IsNullOrEmpty(to))
|
||||
{
|
||||
TaskManager.WriteWarning("Specify 'Mail To' task parameter");
|
||||
return;
|
||||
}
|
||||
|
||||
// send mail message
|
||||
MailHelper.SendMessage(from, to, bcc, subject, body, isHtml);
|
||||
}
|
||||
}
|
||||
|
||||
internal class DatabaseQuota
|
||||
{
|
||||
private string providerName = string.Empty;
|
||||
private int spaceUsed = 0;
|
||||
private int spaceAllocated = 0;
|
||||
private bool belowWarningThreshold = false;
|
||||
private bool belowUsageThreshold = false;
|
||||
public DatabaseQuota(string ProviderName, int SpaceUsed, int SpaceAllocated, bool BelowWarningThreshold, bool BelowUsageThreshold)
|
||||
{
|
||||
providerName = ProviderName;
|
||||
spaceUsed = SpaceUsed;
|
||||
spaceAllocated = SpaceAllocated;
|
||||
belowWarningThreshold = BelowWarningThreshold;
|
||||
belowUsageThreshold = BelowUsageThreshold;
|
||||
}
|
||||
|
||||
public string ProviderName
|
||||
{
|
||||
get { return providerName; }
|
||||
}
|
||||
|
||||
public int SpaceUsed
|
||||
{
|
||||
get { return spaceUsed; }
|
||||
}
|
||||
|
||||
public int SpaceAllocated
|
||||
{
|
||||
get { return spaceAllocated; }
|
||||
}
|
||||
|
||||
public bool BelowWarningThreshold
|
||||
{
|
||||
get { return belowWarningThreshold; }
|
||||
}
|
||||
|
||||
public bool BelowUsageThreshold
|
||||
{
|
||||
get { return belowUsageThreshold; }
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,87 @@
|
|||
// Copyright (c) 2011, 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;
|
||||
using System.Collections.Generic;
|
||||
|
||||
using WebsitePanel.EnterpriseServer;
|
||||
|
||||
namespace WebsitePanel.Ecommerce.EnterpriseServer
|
||||
{
|
||||
public class RunPaymentQueueTask : SchedulerTask
|
||||
{
|
||||
public override void DoWork()
|
||||
{
|
||||
// run payment queue
|
||||
RunPaymentQueue();
|
||||
}
|
||||
|
||||
public void RunPaymentQueue()
|
||||
{
|
||||
int resellerId = SecurityContext.User.UserId;
|
||||
// 1. load unpaid invoices
|
||||
List<Invoice> invoices = InvoiceController.GetUnpaidInvoices(resellerId);
|
||||
// TRACE
|
||||
TaskManager.Write("Running payment queue");
|
||||
TaskManager.WriteParameter("Items found", invoices.Count);
|
||||
// 2. load payment profile for each customer
|
||||
foreach (Invoice invoice in invoices)
|
||||
{
|
||||
try
|
||||
{
|
||||
// load payment profile
|
||||
CheckoutDetails details = StorehouseController.GetPaymentProfileInternally(invoice.ContractId);
|
||||
//
|
||||
if (details != null)
|
||||
{
|
||||
// TRACE
|
||||
TaskManager.Write("Trying to submit payment");
|
||||
TaskManager.WriteParameter("InvoiceID", invoice.InvoiceId);
|
||||
// 3. submit payment for each invoice if profile exists
|
||||
CheckoutResult result = PaymentGatewayController.CheckOut(invoice.ContractId,
|
||||
invoice.InvoiceId, PaymentMethod.CREDIT_CARD, details);
|
||||
// ERROR
|
||||
if (!result.Succeed)
|
||||
{
|
||||
TaskManager.WriteError("Payment failed");
|
||||
TaskManager.WriteParameter("Result code", result.StatusCode);
|
||||
continue;
|
||||
}
|
||||
// OK
|
||||
TaskManager.Write("Payment OK");
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.WriteError(ex, "Payment failed");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,80 @@
|
|||
// Copyright (c) 2011, 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.Text;
|
||||
|
||||
using WebsitePanel.Server;
|
||||
|
||||
namespace WebsitePanel.EnterpriseServer
|
||||
{
|
||||
public class RunSystemCommandTask : SchedulerTask
|
||||
{
|
||||
public override void DoWork()
|
||||
{
|
||||
// Input parameters:
|
||||
// - SERVER_NAME
|
||||
// - EXECUTABLE_PATH
|
||||
|
||||
// get input parameters
|
||||
string serverName = (string)TaskManager.TaskParameters["SERVER_NAME"];
|
||||
string execPath = (string)TaskManager.TaskParameters["EXECUTABLE_PATH"];
|
||||
string execParams = (string)TaskManager.TaskParameters["EXECUTABLE_PARAMS"];
|
||||
|
||||
if (execParams == null)
|
||||
execParams = "";
|
||||
|
||||
// check input parameters
|
||||
if (String.IsNullOrEmpty(serverName))
|
||||
{
|
||||
TaskManager.WriteWarning("Specify 'Server Name' task parameter");
|
||||
return;
|
||||
}
|
||||
|
||||
if (String.IsNullOrEmpty(execPath))
|
||||
{
|
||||
TaskManager.WriteWarning("Specify 'Executable Path' task parameter");
|
||||
return;
|
||||
}
|
||||
|
||||
// find server by name
|
||||
ServerInfo server = ServerController.GetServerByName(serverName);
|
||||
if (server == null)
|
||||
{
|
||||
TaskManager.WriteWarning(String.Format("Server with the name '{0}' was not found", serverName));
|
||||
return;
|
||||
}
|
||||
|
||||
// execute system command
|
||||
WindowsServer winServer = new WindowsServer();
|
||||
ServiceProviderProxy.ServerInit(winServer, server.ServerId);
|
||||
TaskManager.Write(winServer.ExecuteSystemCommand(execPath, execParams));
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,74 @@
|
|||
// Copyright (c) 2011, 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.Text;
|
||||
|
||||
namespace WebsitePanel.EnterpriseServer
|
||||
{
|
||||
public class SendMailNotificationTask : SchedulerTask
|
||||
{
|
||||
public override void DoWork()
|
||||
{
|
||||
// Input parameters:
|
||||
// - MAIL_FROM
|
||||
// - MAIL_TO
|
||||
// - MAIL_SUBJECT
|
||||
// - MAIL_BODY
|
||||
|
||||
// get input parameters
|
||||
string mailFrom = (string)TaskManager.TaskParameters["MAIL_FROM"];
|
||||
string mailTo = (string)TaskManager.TaskParameters["MAIL_TO"];
|
||||
string mailSubject = (string)TaskManager.TaskParameters["MAIL_SUBJECT"];
|
||||
string mailBody = (string)TaskManager.TaskParameters["MAIL_BODY"];
|
||||
|
||||
// check input parameters
|
||||
if (String.IsNullOrEmpty(mailFrom))
|
||||
{
|
||||
TaskManager.WriteWarning("Specify 'Mail From' task parameter");
|
||||
return;
|
||||
}
|
||||
|
||||
if (String.IsNullOrEmpty(mailTo))
|
||||
{
|
||||
TaskManager.WriteWarning("Specify 'Mail To' task parameter");
|
||||
return;
|
||||
}
|
||||
|
||||
if (String.IsNullOrEmpty(mailSubject))
|
||||
{
|
||||
TaskManager.WriteWarning("Specify 'Mail Subject' task parameter");
|
||||
return;
|
||||
}
|
||||
|
||||
// send mail message
|
||||
MailHelper.SendMessage(mailFrom, mailTo, mailSubject, mailBody, false);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,96 @@
|
|||
// Copyright (c) 2011, 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;
|
||||
using System.Collections.Generic;
|
||||
|
||||
using WebsitePanel.EnterpriseServer;
|
||||
|
||||
namespace WebsitePanel.Ecommerce.EnterpriseServer
|
||||
{
|
||||
public class SuspendOverdueInvoicesTask : SchedulerTask
|
||||
{
|
||||
public override void DoWork()
|
||||
{
|
||||
// suspend overdue services
|
||||
SuspendOverdueServices();
|
||||
}
|
||||
|
||||
public GenericSvcResult SuspendService(int serviceId, bool sendEmail)
|
||||
{
|
||||
GenericSvcResult result = null;
|
||||
// load svc type
|
||||
ProductType svc_type = ServiceController.GetServiceItemType(serviceId);
|
||||
// instantiate svc controller
|
||||
IServiceProvisioning controller = (IServiceProvisioning)Activator.CreateInstance(
|
||||
Type.GetType(svc_type.ProvisioningController));
|
||||
// create context
|
||||
ProvisioningContext context = controller.GetProvisioningContext(serviceId, sendEmail);
|
||||
// suspend svc
|
||||
result = controller.SuspendService(context);
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
public void SuspendOverdueServices()
|
||||
{
|
||||
// lookup for today's overdue invoices
|
||||
List<InvoiceItem> items = InvoiceController.GetInvoicesItemsOverdue(SecurityContext.User.UserId, DateTime.Now);
|
||||
// TRACE
|
||||
TaskManager.Write("Suspend overdue services");
|
||||
TaskManager.WriteParameter("Items found", items.Count);
|
||||
//
|
||||
foreach (InvoiceItem item in items)
|
||||
{
|
||||
try
|
||||
{
|
||||
TaskManager.Write("Suspending service");
|
||||
// suspending
|
||||
GenericSvcResult result = SuspendService(item.ServiceId, true);
|
||||
// LOG ERROR
|
||||
if (!result.Succeed)
|
||||
{
|
||||
TaskManager.WriteError(result.Error);
|
||||
if (!String.IsNullOrEmpty(result.ErrorCode))
|
||||
TaskManager.WriteParameter("Error code", result.ErrorCode);
|
||||
TaskManager.WriteParameter("Result code", result.ResultCode);
|
||||
// go to next item
|
||||
continue;
|
||||
}
|
||||
//
|
||||
TaskManager.Write("Suspended");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.WriteError(ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,211 @@
|
|||
// Copyright (c) 2011, 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.Text;
|
||||
|
||||
namespace WebsitePanel.EnterpriseServer
|
||||
{
|
||||
public class SuspendOverusedPackagesTask : SchedulerTask
|
||||
{
|
||||
public const string DISKSPACE_FORMAT_STRING = "disk space usage - {0}%";
|
||||
public const string BANDWIDTH_FORMAT_STRING = "bandwidth usage - {0}%";
|
||||
|
||||
public override void DoWork()
|
||||
{
|
||||
// Input parameters:
|
||||
// - DISKSPACE_OVERUSED
|
||||
// - BANDWIDTH_OVERUSED
|
||||
|
||||
// get the list of all packages
|
||||
List<PackageInfo> packages = PackageController.GetPackagePackages(TaskManager.PackageId, false);
|
||||
TaskManager.Write("Packages to verify: " + packages.Count.ToString());
|
||||
|
||||
bool checkDiskspace = (String.Compare((string)TaskManager.TaskParameters["DISKSPACE_OVERUSED"], "true", true) == 0);
|
||||
bool checkBandwidth = (String.Compare((string)TaskManager.TaskParameters["BANDWIDTH_OVERUSED"], "true", true) == 0);
|
||||
|
||||
bool suspendOverused = Convert.ToBoolean(TaskManager.TaskParameters["SUSPEND_OVERUSED"]);
|
||||
|
||||
bool sendWarningEmail = Convert.ToBoolean(TaskManager.TaskParameters["SEND_WARNING_EMAIL"]);
|
||||
bool sendSuspensionEmail = Convert.ToBoolean(TaskManager.TaskParameters["SEND_SUSPENSION_EMAIL"]);
|
||||
int warningUsageThreshold = Convert.ToInt32(TaskManager.TaskParameters["WARNING_USAGE_THRESHOLD"]);
|
||||
int suspensionUsageThreshold = Convert.ToInt32(TaskManager.TaskParameters["SUSPENSION_USAGE_THRESHOLD"]);
|
||||
string warningMailFrom = Convert.ToString(TaskManager.TaskParameters["WARNING_MAIL_FROM"]);
|
||||
string warningMailBcc = Convert.ToString(TaskManager.TaskParameters["WARNING_MAIL_BCC"]);
|
||||
string warningMailSubject = Convert.ToString(TaskManager.TaskParameters["WARNING_MAIL_SUBJECT"]);
|
||||
string warningMailBody = Convert.ToString(TaskManager.TaskParameters["WARNING_MAIL_BODY"]);
|
||||
string suspensionMailFrom = Convert.ToString(TaskManager.TaskParameters["SUSPENSION_MAIL_FROM"]);
|
||||
string suspensionMailBcc = Convert.ToString(TaskManager.TaskParameters["SUSPENSION_MAIL_BCC"]);
|
||||
string suspensionMailSubject = Convert.ToString(TaskManager.TaskParameters["SUSPENSION_MAIL_SUBJECT"]);
|
||||
string suspensionMailBody = Convert.ToString(TaskManager.TaskParameters["SUSPENSION_MAIL_BODY"]);
|
||||
|
||||
int suspendedPackages = 0;
|
||||
|
||||
foreach (PackageInfo package in packages)
|
||||
{
|
||||
bool isBandwidthBelowWarningThreshold = true;
|
||||
bool isBandwidthBelowSuspensionThreshold = true;
|
||||
bool isDiskSpaceBelowWarningThreshold = true;
|
||||
bool isDiskSpaceBelowSuspensionThreshold = true;
|
||||
|
||||
UserInfo userInfo = UserController.GetUser(package.UserId);
|
||||
|
||||
int diskSpaceUsage = 0;
|
||||
int bandwidthUsage = 0;
|
||||
// disk space
|
||||
if (checkDiskspace)
|
||||
{
|
||||
QuotaValueInfo dsQuota = PackageController.GetPackageQuota(package.PackageId, Quotas.OS_DISKSPACE);
|
||||
if (dsQuota.QuotaAllocatedValue > 0)
|
||||
{
|
||||
diskSpaceUsage = (dsQuota.QuotaUsedValue*100/dsQuota.QuotaAllocatedValue);
|
||||
isDiskSpaceBelowWarningThreshold = diskSpaceUsage < warningUsageThreshold;
|
||||
isDiskSpaceBelowSuspensionThreshold = diskSpaceUsage < suspensionUsageThreshold;
|
||||
}
|
||||
}
|
||||
|
||||
// bandwidth
|
||||
if (checkBandwidth)
|
||||
{
|
||||
QuotaValueInfo bwQuota = PackageController.GetPackageQuota(package.PackageId, Quotas.OS_BANDWIDTH);
|
||||
if (bwQuota.QuotaAllocatedValue > 0)
|
||||
{
|
||||
bandwidthUsage = (bwQuota.QuotaUsedValue*100/bwQuota.QuotaAllocatedValue);
|
||||
isBandwidthBelowWarningThreshold = bandwidthUsage < warningUsageThreshold;
|
||||
isBandwidthBelowSuspensionThreshold = bandwidthUsage < suspensionUsageThreshold;
|
||||
}
|
||||
}
|
||||
|
||||
string userName = String.Format("{0} {1} ({2})/{3}", userInfo.FirstName, userInfo.LastName, userInfo.Username, userInfo.Email);
|
||||
//
|
||||
List<string> formatItems = new List<string>();
|
||||
// add diskspace usage if enabled
|
||||
if (checkDiskspace) formatItems.Add(String.Format(DISKSPACE_FORMAT_STRING, diskSpaceUsage));
|
||||
// add bandwidth usage if enabled
|
||||
if (checkBandwidth) formatItems.Add(String.Format(BANDWIDTH_FORMAT_STRING, bandwidthUsage));
|
||||
// build usage string
|
||||
string usage = String.Join(", ", formatItems.ToArray());
|
||||
|
||||
// cleanup items
|
||||
formatItems.Clear();
|
||||
// add diskspace warning max usage
|
||||
if (checkDiskspace) formatItems.Add(String.Format(DISKSPACE_FORMAT_STRING, warningUsageThreshold));
|
||||
// add bandwidth warning max usage
|
||||
if (checkBandwidth) formatItems.Add(String.Format(BANDWIDTH_FORMAT_STRING, warningUsageThreshold));
|
||||
// build warning max usage string
|
||||
string warningMaxUsage = String.Join(", ", formatItems.ToArray());
|
||||
|
||||
// cleanup items
|
||||
formatItems.Clear();
|
||||
// add diskspace suspension max usage
|
||||
if (checkDiskspace) formatItems.Add(String.Format(DISKSPACE_FORMAT_STRING, suspensionUsageThreshold));
|
||||
// add bandwidth suspension max usage
|
||||
if (checkBandwidth) formatItems.Add(String.Format(BANDWIDTH_FORMAT_STRING, suspensionUsageThreshold));
|
||||
// build suspension max usage string
|
||||
string suspensionMaxUsage = String.Join(", ", formatItems.ToArray());
|
||||
|
||||
string warningMailSubjectProcessed = ReplaceVariables(warningMailSubject, warningMaxUsage, usage, package.PackageName, userName);
|
||||
string warningMailBodyProcessed = ReplaceVariables(warningMailBody, warningMaxUsage, usage, package.PackageName, userName);
|
||||
|
||||
string suspensionMailSubjectProcessed = ReplaceVariables(suspensionMailSubject, suspensionMaxUsage, usage, package.PackageName, userName);
|
||||
string suspensionMailBodyProcessed = ReplaceVariables(suspensionMailBody, suspensionMaxUsage, usage, package.PackageName, userName);
|
||||
|
||||
|
||||
// Send email notifications
|
||||
if (sendWarningEmail && (!isDiskSpaceBelowWarningThreshold || !isBandwidthBelowWarningThreshold))
|
||||
{
|
||||
// Send warning email.
|
||||
this.SendEmail(warningMailFrom, userInfo.Email, warningMailBcc, warningMailSubjectProcessed, warningMailBodyProcessed, false);
|
||||
}
|
||||
|
||||
if (sendSuspensionEmail && (!isDiskSpaceBelowSuspensionThreshold || !isBandwidthBelowSuspensionThreshold))
|
||||
{
|
||||
// Send suspension email.
|
||||
this.SendEmail(suspensionMailFrom, userInfo.Email, suspensionMailBcc, suspensionMailSubjectProcessed, suspensionMailBodyProcessed, false);
|
||||
}
|
||||
|
||||
// suspend package if required
|
||||
if (suspendOverused && (!isDiskSpaceBelowSuspensionThreshold || !isBandwidthBelowSuspensionThreshold))
|
||||
{
|
||||
suspendedPackages++;
|
||||
|
||||
// load user details
|
||||
UserInfo user = PackageController.GetPackageOwner(package.PackageId);
|
||||
|
||||
TaskManager.Write(String.Format("Suspend space '{0}' of user '{1}'",
|
||||
package.PackageName, user.Username));
|
||||
|
||||
try
|
||||
{
|
||||
PackageController.ChangePackageStatus(null, package.PackageId, PackageStatus.Suspended, false);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.WriteError("Error while changing space status: " + ex.ToString());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// log results
|
||||
TaskManager.Write("Total packages suspended: " + suspendedPackages.ToString());
|
||||
}
|
||||
|
||||
private string ReplaceVariables(string content, string threshold, string usage, string spaceName, string customerName)
|
||||
{
|
||||
if (!String.IsNullOrEmpty(content))
|
||||
{
|
||||
content = Utils.ReplaceStringVariable(content, "threshold", threshold);
|
||||
content = Utils.ReplaceStringVariable(content, "date", DateTime.Now.ToString());
|
||||
content = Utils.ReplaceStringVariable(content, "usage", usage);
|
||||
content = Utils.ReplaceStringVariable(content, "space", spaceName);
|
||||
content = Utils.ReplaceStringVariable(content, "customer", customerName);
|
||||
}
|
||||
return content;
|
||||
}
|
||||
|
||||
private void SendEmail(string from, string to, string bcc, string subject, string body, bool isHtml)
|
||||
{
|
||||
// check input parameters
|
||||
if (String.IsNullOrEmpty(from))
|
||||
{
|
||||
TaskManager.WriteWarning("Specify 'Mail From' task parameter");
|
||||
return;
|
||||
}
|
||||
|
||||
if (String.IsNullOrEmpty(to))
|
||||
{
|
||||
TaskManager.WriteWarning("Specify 'Mail To' task parameter");
|
||||
return;
|
||||
}
|
||||
|
||||
// send mail message
|
||||
MailHelper.SendMessage(from, to, bcc, subject, body, isHtml);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,74 @@
|
|||
// Copyright (c) 2011, 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.Text;
|
||||
|
||||
namespace WebsitePanel.EnterpriseServer
|
||||
{
|
||||
public class ZipFilesTask : SchedulerTask
|
||||
{
|
||||
public override void DoWork()
|
||||
{
|
||||
// Input parameters:
|
||||
// - FOLDER
|
||||
// - ZIP_FILE
|
||||
|
||||
// get input parameters
|
||||
string filesList = (string)TaskManager.TaskParameters["FOLDER"];
|
||||
string zipFile = (string)TaskManager.TaskParameters["ZIP_FILE"];
|
||||
|
||||
// check input parameters
|
||||
if (String.IsNullOrEmpty(filesList))
|
||||
{
|
||||
TaskManager.WriteWarning("Specify 'Files List' task parameter");
|
||||
return;
|
||||
}
|
||||
|
||||
if (String.IsNullOrEmpty(zipFile))
|
||||
{
|
||||
TaskManager.WriteWarning("Specify 'Zip File' task parameter");
|
||||
return;
|
||||
}
|
||||
|
||||
// substitute parameters
|
||||
DateTime d = DateTime.Now;
|
||||
string date = d.ToString("yyyyMMdd");
|
||||
string time = d.ToString("HHmm");
|
||||
|
||||
filesList = Utils.ReplaceStringVariable(filesList, "date", date);
|
||||
filesList = Utils.ReplaceStringVariable(filesList, "time", time);
|
||||
zipFile = Utils.ReplaceStringVariable(zipFile, "date", date);
|
||||
zipFile = Utils.ReplaceStringVariable(zipFile, "time", time);
|
||||
|
||||
// zip files and folders
|
||||
FilesController.ZipFiles(TaskManager.PackageId, new string[] { filesList }, zipFile);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,152 @@
|
|||
// Copyright (c) 2011, 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.IO;
|
||||
using System.Threading;
|
||||
using System.Collections;
|
||||
using System.Diagnostics;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace WebsitePanel.EnterpriseServer
|
||||
{
|
||||
public delegate void ScheduleFinished(SchedulerJob schedule);
|
||||
|
||||
public sealed class Scheduler
|
||||
{
|
||||
static SchedulerJob nextSchedule = null;
|
||||
|
||||
// main timer
|
||||
static Timer scheduleTimer = new Timer(new TimerCallback(RunNextSchedule),
|
||||
null,
|
||||
Timeout.Infinite,
|
||||
Timeout.Infinite);
|
||||
|
||||
public static void Start()
|
||||
{
|
||||
// schedule tasks
|
||||
ScheduleTasks();
|
||||
}
|
||||
|
||||
public static bool IsScheduleActive(int scheduleId)
|
||||
{
|
||||
Dictionary<int, BackgroundTask> scheduledTasks = TaskManager.GetScheduledTasks();
|
||||
return scheduledTasks.ContainsKey(scheduleId);
|
||||
}
|
||||
|
||||
public static void StartSchedule(SchedulerJob schedule)
|
||||
{
|
||||
Dictionary<int, BackgroundTask> scheduledTasks = TaskManager.GetScheduledTasks();
|
||||
if (scheduledTasks.ContainsKey(schedule.ScheduleInfo.ScheduleId))
|
||||
return;
|
||||
|
||||
// run schedule
|
||||
RunSchedule(schedule, false);
|
||||
}
|
||||
|
||||
public static void StopSchedule(SchedulerJob schedule)
|
||||
{
|
||||
Dictionary<int, BackgroundTask> scheduledTasks = TaskManager.GetScheduledTasks();
|
||||
if (!scheduledTasks.ContainsKey(schedule.ScheduleInfo.ScheduleId))
|
||||
return;
|
||||
|
||||
BackgroundTask activeTask = scheduledTasks[schedule.ScheduleInfo.ScheduleId];
|
||||
TaskManager.StopTask(activeTask.TaskId);
|
||||
}
|
||||
|
||||
public static void ScheduleTasks()
|
||||
{
|
||||
nextSchedule = SchedulerController.GetNextSchedule();
|
||||
|
||||
// set timer
|
||||
if (nextSchedule != null)
|
||||
{
|
||||
if (nextSchedule.ScheduleInfo.NextRun <= DateTime.Now)
|
||||
{
|
||||
// this will put the timer to sleep
|
||||
scheduleTimer.Change(Timeout.Infinite, Timeout.Infinite);
|
||||
|
||||
// run immediately
|
||||
RunNextSchedule(null);
|
||||
}
|
||||
else
|
||||
{
|
||||
// set timer
|
||||
TimeSpan ts = nextSchedule.ScheduleInfo.NextRun.Subtract(DateTime.Now);
|
||||
if (ts < TimeSpan.Zero)
|
||||
ts = TimeSpan.Zero; // cannot be negative !
|
||||
|
||||
// invoke after the timespan
|
||||
scheduleTimer.Change((long)ts.TotalMilliseconds, Timeout.Infinite);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// call back for the timer function
|
||||
static void RunNextSchedule(object obj) // obj ignored
|
||||
{
|
||||
if (nextSchedule == null)
|
||||
return;
|
||||
|
||||
RunSchedule(nextSchedule, true);
|
||||
|
||||
// schedule next task
|
||||
ScheduleTasks();
|
||||
}
|
||||
|
||||
static void RunSchedule(SchedulerJob schedule, bool changeNextRun)
|
||||
{
|
||||
// update next run (if required)
|
||||
if (changeNextRun)
|
||||
{
|
||||
SchedulerController.CalculateNextStartTime(schedule.ScheduleInfo);
|
||||
}
|
||||
|
||||
// disable run once task
|
||||
if (schedule.ScheduleInfo.ScheduleType == ScheduleType.OneTime)
|
||||
schedule.ScheduleInfo.Enabled = false;
|
||||
|
||||
Dictionary<int, BackgroundTask> scheduledTasks = TaskManager.GetScheduledTasks();
|
||||
if (!scheduledTasks.ContainsKey(schedule.ScheduleInfo.ScheduleId))
|
||||
// this task should be run, so
|
||||
// update its last run
|
||||
schedule.ScheduleInfo.LastRun = DateTime.Now;
|
||||
|
||||
// update schedule
|
||||
SchedulerController.UpdateSchedule(schedule.ScheduleInfo);
|
||||
|
||||
// skip execution if the current task is still running
|
||||
if (scheduledTasks.ContainsKey(schedule.ScheduleInfo.ScheduleId))
|
||||
return;
|
||||
|
||||
// run the schedule in the separate thread
|
||||
schedule.Run();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,344 @@
|
|||
// Copyright (c) 2011, 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.Data;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using System.Xml;
|
||||
using WebsitePanel.EnterpriseServer.Base.Scheduling;
|
||||
|
||||
namespace WebsitePanel.EnterpriseServer
|
||||
{
|
||||
public class SchedulerController
|
||||
{
|
||||
public static DateTime GetSchedulerTime()
|
||||
{
|
||||
return DateTime.Now;
|
||||
}
|
||||
|
||||
public static List<ScheduleTaskInfo> GetScheduleTasks()
|
||||
{
|
||||
return ObjectUtils.CreateListFromDataReader<ScheduleTaskInfo>(
|
||||
DataProvider.GetScheduleTasks(SecurityContext.User.UserId));
|
||||
}
|
||||
|
||||
public static ScheduleTaskInfo GetScheduleTask(string taskId)
|
||||
{
|
||||
return ObjectUtils.FillObjectFromDataReader<ScheduleTaskInfo>(
|
||||
DataProvider.GetScheduleTask(SecurityContext.User.UserId, taskId));
|
||||
}
|
||||
|
||||
public static DataSet GetSchedules(int packageId)
|
||||
{
|
||||
DataSet ds = DataProvider.GetSchedules(SecurityContext.User.UserId, packageId);
|
||||
|
||||
// set status to each returned schedule
|
||||
foreach (DataRow dr in ds.Tables[0].Rows)
|
||||
{
|
||||
dr["StatusID"] = Scheduler.IsScheduleActive((int)dr["ScheduleID"])
|
||||
? ScheduleStatus.Running : ScheduleStatus.Idle;
|
||||
}
|
||||
return ds;
|
||||
}
|
||||
|
||||
public static DataSet GetSchedulesPaged(int packageId, bool recursive,
|
||||
string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows)
|
||||
{
|
||||
DataSet ds = DataProvider.GetSchedulesPaged(SecurityContext.User.UserId, packageId,
|
||||
recursive, filterColumn, filterValue, sortColumn, startRow, maximumRows);
|
||||
|
||||
// set status to each returned schedule
|
||||
foreach (DataRow dr in ds.Tables[1].Rows)
|
||||
{
|
||||
dr["StatusID"] = Scheduler.IsScheduleActive((int)dr["ScheduleID"])
|
||||
? ScheduleStatus.Running : ScheduleStatus.Idle;
|
||||
}
|
||||
return ds;
|
||||
}
|
||||
|
||||
public static ScheduleInfo GetSchedule(int scheduleId)
|
||||
{
|
||||
DataSet ds = DataProvider.GetSchedule(SecurityContext.User.UserId, scheduleId);
|
||||
ScheduleInfo si = ObjectUtils.FillObjectFromDataView<ScheduleInfo>(ds.Tables[0].DefaultView);
|
||||
return si;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets view configuration for a certain task.
|
||||
/// </summary>
|
||||
/// <param name="taskId">Task id for which view configuration is intended to be loeaded.</param>
|
||||
/// <returns>View configuration for the task with supplied id.</returns>
|
||||
public static List<ScheduleTaskViewConfiguration> GetScheduleTaskViewConfigurations(string taskId)
|
||||
{
|
||||
List<ScheduleTaskViewConfiguration> c = ObjectUtils.CreateListFromDataReader<ScheduleTaskViewConfiguration>(DataProvider.GetScheduleTaskViewConfigurations(taskId));
|
||||
return c;
|
||||
}
|
||||
|
||||
internal static SchedulerJob GetScheduleComplete(int scheduleId)
|
||||
{
|
||||
DataSet ds = DataProvider.GetSchedule(SecurityContext.User.UserId, scheduleId);
|
||||
return CreateCompleteScheduleFromDataSet(ds);
|
||||
}
|
||||
|
||||
internal static SchedulerJob GetNextSchedule()
|
||||
{
|
||||
DataSet ds = DataProvider.GetNextSchedule();
|
||||
return CreateCompleteScheduleFromDataSet(ds);
|
||||
}
|
||||
|
||||
internal static SchedulerJob CreateCompleteScheduleFromDataSet(DataSet ds)
|
||||
{
|
||||
if (ds.Tables[0].Rows.Count == 0)
|
||||
return null;
|
||||
|
||||
SchedulerJob schedule = new SchedulerJob();
|
||||
|
||||
// schedule info
|
||||
schedule.ScheduleInfo = ObjectUtils.FillObjectFromDataView<ScheduleInfo>(ds.Tables[0].DefaultView);
|
||||
|
||||
// task info
|
||||
schedule.Task = ObjectUtils.FillObjectFromDataView<ScheduleTaskInfo>(ds.Tables[1].DefaultView);
|
||||
|
||||
// parameters info
|
||||
List<ScheduleTaskParameterInfo> parameters = new List<ScheduleTaskParameterInfo>();
|
||||
ObjectUtils.FillCollectionFromDataView<ScheduleTaskParameterInfo>(
|
||||
parameters, ds.Tables[2].DefaultView);
|
||||
schedule.ScheduleInfo.Parameters = parameters.ToArray();
|
||||
|
||||
return schedule;
|
||||
}
|
||||
|
||||
public static ScheduleInfo GetScheduleInternal(int scheduleId)
|
||||
{
|
||||
return ObjectUtils.FillObjectFromDataReader<ScheduleInfo>(
|
||||
DataProvider.GetScheduleInternal(scheduleId));
|
||||
}
|
||||
|
||||
public static List<ScheduleTaskParameterInfo> GetScheduleParameters(string taskId, int scheduleId)
|
||||
{
|
||||
return ObjectUtils.CreateListFromDataReader<ScheduleTaskParameterInfo>(
|
||||
DataProvider.GetScheduleParameters(SecurityContext.User.UserId,
|
||||
taskId, scheduleId));
|
||||
}
|
||||
|
||||
public static int StartSchedule(int scheduleId)
|
||||
{
|
||||
// check account
|
||||
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo);
|
||||
if (accountCheck < 0) return accountCheck;
|
||||
|
||||
SchedulerJob schedule = GetScheduleComplete(scheduleId);
|
||||
if (schedule == null)
|
||||
return 0;
|
||||
|
||||
Scheduler.StartSchedule(schedule);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
public static int StopSchedule(int scheduleId)
|
||||
{
|
||||
// check account
|
||||
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo);
|
||||
if (accountCheck < 0) return accountCheck;
|
||||
|
||||
SchedulerJob schedule = GetScheduleComplete(scheduleId);
|
||||
if (schedule == null)
|
||||
return 0;
|
||||
|
||||
Scheduler.StopSchedule(schedule);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
public static void CalculateNextStartTime(ScheduleInfo schedule)
|
||||
{
|
||||
if (schedule.ScheduleType == ScheduleType.OneTime)
|
||||
{
|
||||
// start time stay intact
|
||||
// we only disable this task for the next time
|
||||
schedule.NextRun = schedule.StartTime;
|
||||
}
|
||||
else if (schedule.ScheduleType == ScheduleType.Interval)
|
||||
{
|
||||
DateTime lastRun = schedule.LastRun;
|
||||
DateTime now = DateTime.Now;
|
||||
|
||||
// the task is running first time by default
|
||||
DateTime nextStart = DateTime.Now;
|
||||
|
||||
if (lastRun != DateTime.MinValue)
|
||||
{
|
||||
// the task is running next times
|
||||
nextStart = lastRun.AddSeconds(schedule.Interval);
|
||||
}
|
||||
|
||||
if(nextStart < now)
|
||||
nextStart = now; // run immediately
|
||||
|
||||
// check if start time is in allowed interval
|
||||
DateTime fromTime = new DateTime(now.Year, now.Month, now.Day,
|
||||
schedule.FromTime.Hour, schedule.FromTime.Minute, schedule.FromTime.Second);
|
||||
|
||||
DateTime toTime = new DateTime(now.Year, now.Month, now.Day,
|
||||
schedule.ToTime.Hour, schedule.ToTime.Minute, schedule.ToTime.Second);
|
||||
|
||||
if (!(nextStart >= fromTime && nextStart <= toTime))
|
||||
{
|
||||
// run task in the start of the interval, but only tomorrow
|
||||
nextStart = fromTime.AddDays(1);
|
||||
}
|
||||
schedule.NextRun = nextStart;
|
||||
}
|
||||
else if (schedule.ScheduleType == ScheduleType.Daily)
|
||||
{
|
||||
DateTime now = DateTime.Now;
|
||||
DateTime startTime = schedule.StartTime;
|
||||
DateTime nextStart = new DateTime(now.Year, now.Month, now.Day,
|
||||
startTime.Hour, startTime.Minute, startTime.Second);
|
||||
if (nextStart < now) // start time is in the past
|
||||
nextStart = nextStart.AddDays(1); // run tomorrow
|
||||
schedule.NextRun = nextStart;
|
||||
}
|
||||
else if (schedule.ScheduleType == ScheduleType.Weekly)
|
||||
{
|
||||
DateTime now = DateTime.Now;
|
||||
DateTime startTime = schedule.StartTime;
|
||||
DateTime nextStart = new DateTime(now.Year, now.Month, now.Day,
|
||||
startTime.Hour, startTime.Minute, startTime.Second);
|
||||
int todayWeekDay = (int)now.DayOfWeek;
|
||||
nextStart = nextStart.AddDays(schedule.WeekMonthDay - todayWeekDay);
|
||||
|
||||
if (nextStart < now) // start time is in the past
|
||||
nextStart = nextStart.AddDays(7); // run next week
|
||||
schedule.NextRun = nextStart;
|
||||
}
|
||||
else if (schedule.ScheduleType == ScheduleType.Monthly)
|
||||
{
|
||||
DateTime now = DateTime.Now;
|
||||
DateTime startTime = schedule.StartTime;
|
||||
DateTime nextStart = new DateTime(now.Year, now.Month, now.Day,
|
||||
startTime.Hour, startTime.Minute, startTime.Second);
|
||||
int todayDay = now.Day;
|
||||
nextStart = nextStart.AddDays(schedule.WeekMonthDay - todayDay);
|
||||
|
||||
if (nextStart < now) // start time is in the past
|
||||
nextStart = nextStart.AddMonths(1); // run next month
|
||||
schedule.NextRun = nextStart;
|
||||
}
|
||||
}
|
||||
|
||||
public static int AddSchedule(ScheduleInfo schedule)
|
||||
{
|
||||
// check account
|
||||
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive);
|
||||
if (accountCheck < 0) return accountCheck;
|
||||
|
||||
// check quota
|
||||
if(PackageController.GetPackageQuota(schedule.PackageId, Quotas.OS_SCHEDULEDTASKS).QuotaExhausted)
|
||||
return BusinessErrorCodes.ERROR_OS_SCHEDULED_TASK_QUOTA_LIMIT;
|
||||
|
||||
CalculateNextStartTime(schedule);
|
||||
|
||||
string xmlParameters = BuildParametersXml(schedule.Parameters);
|
||||
|
||||
int scheduleId = DataProvider.AddSchedule(SecurityContext.User.UserId,
|
||||
schedule.TaskId, schedule.PackageId, schedule.ScheduleName, schedule.ScheduleTypeId,
|
||||
schedule.Interval, schedule.FromTime, schedule.ToTime, schedule.StartTime,
|
||||
schedule.NextRun, schedule.Enabled, schedule.PriorityId,
|
||||
schedule.HistoriesNumber, schedule.MaxExecutionTime, schedule.WeekMonthDay, xmlParameters);
|
||||
|
||||
// re-schedule tasks
|
||||
Scheduler.ScheduleTasks();
|
||||
|
||||
return scheduleId;
|
||||
}
|
||||
|
||||
public static int UpdateSchedule(ScheduleInfo schedule)
|
||||
{
|
||||
// check account
|
||||
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive);
|
||||
if (accountCheck < 0) return accountCheck;
|
||||
|
||||
// load original schedule
|
||||
ScheduleInfo originalSchedule = GetScheduleInternal(schedule.ScheduleId);
|
||||
|
||||
schedule.LastRun = schedule.LastRun;
|
||||
CalculateNextStartTime(schedule);
|
||||
|
||||
string xmlParameters = BuildParametersXml(schedule.Parameters);
|
||||
|
||||
DataProvider.UpdateSchedule(SecurityContext.User.UserId,
|
||||
schedule.ScheduleId, schedule.TaskId, schedule.ScheduleName, schedule.ScheduleTypeId,
|
||||
schedule.Interval, schedule.FromTime, schedule.ToTime, schedule.StartTime,
|
||||
schedule.LastRun, schedule.NextRun, schedule.Enabled, schedule.PriorityId,
|
||||
schedule.HistoriesNumber, schedule.MaxExecutionTime, schedule.WeekMonthDay, xmlParameters);
|
||||
|
||||
// re-schedule tasks
|
||||
Scheduler.ScheduleTasks();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
private static string BuildParametersXml(ScheduleTaskParameterInfo[] parameters)
|
||||
{
|
||||
XmlDocument doc = new XmlDocument();
|
||||
XmlElement nodeProps = doc.CreateElement("parameters");
|
||||
if (parameters != null)
|
||||
{
|
||||
foreach (ScheduleTaskParameterInfo parameter in parameters)
|
||||
{
|
||||
XmlElement nodeProp = doc.CreateElement("parameter");
|
||||
nodeProp.SetAttribute("id", parameter.ParameterId);
|
||||
nodeProp.SetAttribute("value", parameter.ParameterValue);
|
||||
nodeProps.AppendChild(nodeProp);
|
||||
}
|
||||
}
|
||||
return nodeProps.OuterXml;
|
||||
}
|
||||
|
||||
public static int DeleteSchedule(int scheduleId)
|
||||
{
|
||||
// check account
|
||||
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo);
|
||||
if (accountCheck < 0) return accountCheck;
|
||||
|
||||
// stop schedule if active
|
||||
StopSchedule(scheduleId);
|
||||
|
||||
// delete schedule
|
||||
DataProvider.DeleteSchedule(SecurityContext.User.UserId, scheduleId);
|
||||
|
||||
// re-schedule tasks
|
||||
Scheduler.ScheduleTasks();
|
||||
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,126 @@
|
|||
// Copyright (c) 2011, 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.IO;
|
||||
using System.Threading;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace WebsitePanel.EnterpriseServer
|
||||
{
|
||||
public class SchedulerJob
|
||||
{
|
||||
private ScheduleInfo scheduleInfo;
|
||||
private ScheduleTaskInfo task;
|
||||
|
||||
public ScheduleFinished ScheduleFinishedCallback;
|
||||
|
||||
#region public properties
|
||||
public ScheduleInfo ScheduleInfo
|
||||
{
|
||||
get { return this.scheduleInfo; }
|
||||
set { this.scheduleInfo = value; }
|
||||
}
|
||||
|
||||
public ScheduleTaskInfo Task
|
||||
{
|
||||
get { return this.task; }
|
||||
set { this.task = value; }
|
||||
}
|
||||
#endregion
|
||||
|
||||
// Constructor
|
||||
public SchedulerJob()
|
||||
{
|
||||
}
|
||||
|
||||
// Sets the next time this Schedule is kicked off and kicks off events on
|
||||
// a seperate thread, freeing the Scheduler to continue
|
||||
public void Run()
|
||||
{
|
||||
// create worker
|
||||
Thread worker = new Thread(new ThreadStart(RunSchedule));
|
||||
|
||||
// set worker priority
|
||||
switch (scheduleInfo.Priority)
|
||||
{
|
||||
case SchedulePriority.Highest: worker.Priority = ThreadPriority.Highest; break;
|
||||
case SchedulePriority.AboveNormal: worker.Priority = ThreadPriority.AboveNormal; break;
|
||||
case SchedulePriority.Normal: worker.Priority = ThreadPriority.Normal; break;
|
||||
case SchedulePriority.BelowNormal: worker.Priority = ThreadPriority.BelowNormal; break;
|
||||
case SchedulePriority.Lowest: worker.Priority = ThreadPriority.Lowest; break;
|
||||
}
|
||||
|
||||
// start worker!
|
||||
worker.Start();
|
||||
}
|
||||
|
||||
// Implementation of ThreadStart delegate.
|
||||
// Used by Scheduler to kick off events on a seperate thread
|
||||
private void RunSchedule()
|
||||
{
|
||||
// impersonate thread
|
||||
UserInfo user = PackageController.GetPackageOwner(scheduleInfo.PackageId);
|
||||
SecurityContext.SetThreadPrincipal(user.UserId);
|
||||
|
||||
TaskManager.StartTask("SCHEDULER", "RUN_SCHEDULE", scheduleInfo.ScheduleName);
|
||||
TaskManager.PackageId = scheduleInfo.PackageId;
|
||||
TaskManager.ItemId = scheduleInfo.ScheduleId;
|
||||
TaskManager.ScheduleId = scheduleInfo.ScheduleId;
|
||||
TaskManager.MaximumExecutionTime = scheduleInfo.MaxExecutionTime;
|
||||
|
||||
// set task parameters
|
||||
foreach (ScheduleTaskParameterInfo prm in scheduleInfo.Parameters)
|
||||
TaskManager.TaskParameters[prm.ParameterId] = prm.ParameterValue;
|
||||
|
||||
// run task
|
||||
try
|
||||
{
|
||||
// create scheduled task object
|
||||
SchedulerTask objTask = (SchedulerTask)Activator.CreateInstance(Type.GetType(task.TaskType));
|
||||
|
||||
if (objTask != null)
|
||||
objTask.DoWork();
|
||||
else
|
||||
throw new Exception(String.Format("Could not create scheduled task of '{0}' type",
|
||||
task.TaskType));
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
// log error
|
||||
TaskManager.WriteError(ex, "Error executing scheduled task");
|
||||
}
|
||||
finally
|
||||
{
|
||||
// complete task
|
||||
TaskManager.CompleteTask();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
File diff suppressed because it is too large
Load diff
|
@ -0,0 +1,993 @@
|
|||
// Copyright (c) 2011, 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.Collections.Specialized;
|
||||
using System.Data;
|
||||
using System.IO;
|
||||
using System.Xml;
|
||||
using System.Xml.Serialization;
|
||||
using WebsitePanel.Providers;
|
||||
using WebsitePanel.Providers.DNS;
|
||||
using WebsitePanel.Providers.HostedSolution;
|
||||
using WebsitePanel.Providers.SharePoint;
|
||||
|
||||
namespace WebsitePanel.EnterpriseServer.Code.SharePoint
|
||||
{
|
||||
/// <summary>
|
||||
/// Exposes handful API on hosted SharePoint site collections management.
|
||||
/// </summary>
|
||||
public class HostedSharePointServerController : IImportController, IBackupController
|
||||
{
|
||||
private const int FILE_BUFFER_LENGTH = 5000000; // ~5MB
|
||||
|
||||
/// <summary>
|
||||
/// Gets site collections in raw form.
|
||||
/// </summary>
|
||||
/// <param name="packageId">Package to which desired site collections belong.</param>
|
||||
/// <param name="organizationId">Organization to which desired site collections belong.</param>
|
||||
/// <param name="filterColumn">Filter column name.</param>
|
||||
/// <param name="filterValue">Filter value.</param>
|
||||
/// <param name="sortColumn">Sort column name.</param>
|
||||
/// <param name="startRow">Row index to start from.</param>
|
||||
/// <param name="maximumRows">Maximum number of rows to retrieve.</param>
|
||||
/// <returns>Site collections that match.</returns>
|
||||
public static SharePointSiteCollectionListPaged GetSiteCollectionsPaged(int packageId, int organizationId, string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows)
|
||||
{
|
||||
if (IsDemoMode)
|
||||
{
|
||||
SharePointSiteCollectionListPaged demoResult = new SharePointSiteCollectionListPaged();
|
||||
demoResult.SiteCollections = GetSiteCollections(1, false);
|
||||
demoResult.TotalRowCount = demoResult.SiteCollections.Count;
|
||||
return demoResult;
|
||||
}
|
||||
|
||||
SharePointSiteCollectionListPaged paged = new SharePointSiteCollectionListPaged();
|
||||
DataSet result = PackageController.GetRawPackageItemsPaged(packageId, typeof(SharePointSiteCollection),
|
||||
true, filterColumn, filterValue, sortColumn, startRow, Int32.MaxValue);
|
||||
List<SharePointSiteCollection> items = PackageController.CreateServiceItemsList(result, 1).ConvertAll<SharePointSiteCollection>(delegate(ServiceProviderItem item) { return (SharePointSiteCollection)item; });
|
||||
|
||||
if (organizationId > 0)
|
||||
{
|
||||
items = items.FindAll(delegate(SharePointSiteCollection siteCollection) { return siteCollection.OrganizationId == organizationId; });
|
||||
}
|
||||
paged.TotalRowCount = items.Count;
|
||||
|
||||
if (items.Count > maximumRows)
|
||||
{
|
||||
items.RemoveRange(maximumRows, items.Count - maximumRows);
|
||||
}
|
||||
|
||||
paged.SiteCollections = items;
|
||||
|
||||
return paged;
|
||||
}
|
||||
|
||||
public static List<SharePointSiteCollection> GetSiteCollections(int organizationId)
|
||||
{
|
||||
Organization org = OrganizationController.GetOrganization(organizationId);
|
||||
|
||||
List<ServiceProviderItem> items = PackageController.GetPackageItemsByType(org.PackageId, typeof(SharePointSiteCollection), false);
|
||||
items.ConvertAll<SharePointSiteCollection>(delegate(ServiceProviderItem item) { return (SharePointSiteCollection)item; });
|
||||
List<SharePointSiteCollection> ret = new List<SharePointSiteCollection>();
|
||||
foreach(ServiceProviderItem item in items)
|
||||
{
|
||||
SharePointSiteCollection siteCollection = item as SharePointSiteCollection;
|
||||
if (siteCollection != null && siteCollection.OrganizationId == organizationId)
|
||||
{
|
||||
ret.Add(siteCollection);
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets list of supported languages by this installation of SharePoint.
|
||||
/// </summary>
|
||||
/// <returns>List of supported languages</returns>
|
||||
public static int[] GetSupportedLanguages(int packageId)
|
||||
{
|
||||
if (IsDemoMode)
|
||||
{
|
||||
return new int[] {1033};
|
||||
}
|
||||
|
||||
// Log operation.
|
||||
TaskManager.StartTask("HOSTEDSHAREPOINT", "GET_LANGUAGES");
|
||||
|
||||
int serviceId = PackageController.GetPackageServiceId(packageId, ResourceGroups.HostedSharePoint);
|
||||
if (serviceId == 0)
|
||||
{
|
||||
return new int[]{};
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
// Create site collection on server.
|
||||
HostedSharePointServer hostedSharePointServer = GetHostedSharePointServer(serviceId);
|
||||
return hostedSharePointServer.GetSupportedLanguages();
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw TaskManager.WriteError(ex);
|
||||
}
|
||||
finally
|
||||
{
|
||||
TaskManager.CompleteTask();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets list of SharePoint site collections that belong to the package.
|
||||
/// </summary>
|
||||
/// <param name="packageId">Package that owns site collections.</param>
|
||||
/// <param name="recursive">A value which shows whether nested spaces must be searched as well.</param>
|
||||
/// <returns>List of found site collections.</returns>
|
||||
public static List<SharePointSiteCollection> GetSiteCollections(int packageId, bool recursive)
|
||||
{
|
||||
if (IsDemoMode)
|
||||
{
|
||||
List<SharePointSiteCollection> demoResult = new List<SharePointSiteCollection>();
|
||||
SharePointSiteCollection siteCollection1 = new SharePointSiteCollection();
|
||||
siteCollection1.Id = 1;
|
||||
siteCollection1.OrganizationId = 1;
|
||||
siteCollection1.LocaleId = 1033;
|
||||
siteCollection1.Name = "http://john.fabrikam.com";
|
||||
siteCollection1.OwnerEmail = "john@fabrikam.com";
|
||||
siteCollection1.OwnerLogin = "john@fabrikam.com";
|
||||
siteCollection1.OwnerName = "John Smith";
|
||||
siteCollection1.PhysicalAddress = "http://john.fabrikam.com";
|
||||
siteCollection1.Title = "John Smith's Team Site";
|
||||
siteCollection1.Url = "http://john.fabrikam.com";
|
||||
demoResult.Add(siteCollection1);
|
||||
SharePointSiteCollection siteCollection2 = new SharePointSiteCollection();
|
||||
siteCollection2.Id = 2;
|
||||
siteCollection1.OrganizationId = 1;
|
||||
siteCollection2.LocaleId = 1033;
|
||||
siteCollection2.Name = "http://mark.contoso.com";
|
||||
siteCollection2.OwnerEmail = "mark@contoso.com";
|
||||
siteCollection2.OwnerLogin = "mark@contoso.com";
|
||||
siteCollection2.OwnerName = "Mark Jonsons";
|
||||
siteCollection2.PhysicalAddress = "http://mark.contoso.com";
|
||||
siteCollection2.Title = "Mark Jonsons' Blog";
|
||||
siteCollection2.Url = "http://mark.contoso.com";
|
||||
demoResult.Add(siteCollection2);
|
||||
return demoResult;
|
||||
}
|
||||
|
||||
|
||||
List<ServiceProviderItem> items = PackageController.GetPackageItemsByType(packageId, typeof(SharePointSiteCollection), recursive);
|
||||
return items.ConvertAll<SharePointSiteCollection>(delegate(ServiceProviderItem item) { return (SharePointSiteCollection)item; });
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets SharePoint site collection with given id.
|
||||
/// </summary>
|
||||
/// <param name="itemId">Site collection id within metabase.</param>
|
||||
/// <returns>Site collection or null in case no such item exist.</returns>
|
||||
public static SharePointSiteCollection GetSiteCollection(int itemId)
|
||||
{
|
||||
if (IsDemoMode)
|
||||
{
|
||||
return GetSiteCollections(1, false)[itemId-1];
|
||||
}
|
||||
|
||||
SharePointSiteCollection item = PackageController.GetPackageItem(itemId) as SharePointSiteCollection;
|
||||
return item;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Adds SharePoint site collection.
|
||||
/// </summary>
|
||||
/// <param name="item">Site collection description.</param>
|
||||
/// <returns>Created site collection id within metabase.</returns>
|
||||
public static int AddSiteCollection(SharePointSiteCollection item)
|
||||
{
|
||||
string domainName = item.Name;
|
||||
// Check account.
|
||||
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive);
|
||||
if (accountCheck < 0)
|
||||
{
|
||||
return accountCheck;
|
||||
}
|
||||
|
||||
// Check package.
|
||||
int packageCheck = SecurityContext.CheckPackage(item.PackageId, DemandPackage.IsActive);
|
||||
if (packageCheck < 0)
|
||||
{
|
||||
return packageCheck;
|
||||
}
|
||||
|
||||
// Check quota.
|
||||
OrganizationStatistics orgStats = OrganizationController.GetOrganizationStatistics(item.OrganizationId);
|
||||
//QuotaValueInfo quota = PackageController.GetPackageQuota(item.PackageId, Quotas.HOSTED_SHAREPOINT_SITES);
|
||||
|
||||
if (orgStats.AllocatedSharePointSiteCollections > -1
|
||||
&& orgStats.CreatedSharePointSiteCollections >= orgStats.AllocatedSharePointSiteCollections)
|
||||
{
|
||||
return BusinessErrorCodes.ERROR_SHAREPOINT_RESOURCE_QUOTA_LIMIT;
|
||||
}
|
||||
|
||||
// Check if stats resource is available
|
||||
int serviceId = PackageController.GetPackageServiceId(item.PackageId, ResourceGroups.HostedSharePoint);
|
||||
if (serviceId == 0)
|
||||
{
|
||||
return BusinessErrorCodes.ERROR_SHAREPOINT_RESOURCE_UNAVAILABLE;
|
||||
}
|
||||
StringDictionary hostedSharePointSettings = ServerController.GetServiceSettings(serviceId);
|
||||
Uri rootWebApplicationUri = new Uri(hostedSharePointSettings["RootWebApplicationUri"]);
|
||||
item.Name = String.Format("{0}://{1}", rootWebApplicationUri.Scheme, item.Name);
|
||||
if (rootWebApplicationUri.Port > 0 && rootWebApplicationUri.Port != 80 && rootWebApplicationUri.Port != 443)
|
||||
{
|
||||
item.PhysicalAddress = String.Format("{0}:{1}", item.Name, rootWebApplicationUri.Port);
|
||||
}
|
||||
else
|
||||
{
|
||||
item.PhysicalAddress = item.Name;
|
||||
}
|
||||
|
||||
Organization org = OrganizationController.GetOrganization(item.OrganizationId);
|
||||
|
||||
item.MaxSiteStorage = RecalculateMaxSize(org.MaxSharePointStorage, (int)item.MaxSiteStorage);
|
||||
item.WarningStorage = item.MaxSiteStorage == -1 ? -1 : Math.Min((int)item.WarningStorage, item.MaxSiteStorage) ;
|
||||
|
||||
|
||||
// Check package item with given name already exists.
|
||||
if (PackageController.GetPackageItemByName(item.PackageId, item.Name, typeof(SharePointSiteCollection)) != null)
|
||||
{
|
||||
return BusinessErrorCodes.ERROR_SHAREPOINT_PACKAGE_ITEM_EXISTS;
|
||||
}
|
||||
|
||||
// Log operation.
|
||||
TaskManager.StartTask("HOSTEDSHAREPOINT", "ADD_SITE_COLLECTION", item.Name);
|
||||
|
||||
try
|
||||
{
|
||||
// Create site collection on server.
|
||||
HostedSharePointServer hostedSharePointServer = GetHostedSharePointServer(serviceId);
|
||||
|
||||
hostedSharePointServer.CreateSiteCollection(item);
|
||||
// Make record in metabase.
|
||||
item.ServiceId = serviceId;
|
||||
int itemId = PackageController.AddPackageItem(item);
|
||||
|
||||
int dnsServiceId = PackageController.GetPackageServiceId(item.PackageId, ResourceGroups.Dns);
|
||||
if (dnsServiceId > 0)
|
||||
{
|
||||
DomainInfo domain = ServerController.GetDomain(domainName);
|
||||
if (domain != null)
|
||||
{
|
||||
string website = domain.WebSiteName;
|
||||
|
||||
if (!String.IsNullOrEmpty(domain.WebSiteName))
|
||||
{
|
||||
DnsRecord[] records = ServerController.GetDnsZoneRecords(domain.DomainId);
|
||||
foreach (DnsRecord record in records)
|
||||
{
|
||||
if (record.RecordType.Equals(DnsRecordType.A) && String.IsNullOrEmpty(record.RecordName))
|
||||
{
|
||||
ServerController.DeleteDnsZoneRecord(domain.DomainId, String.Empty, DnsRecordType.A, record.RecordData);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
ServerController.AddDnsZoneRecord(domain.DomainId, String.Empty, DnsRecordType.A, hostedSharePointSettings["RootWebApplicationIpAddress"], 0);
|
||||
}
|
||||
}
|
||||
|
||||
TaskManager.ItemId = itemId;
|
||||
return itemId;
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
throw TaskManager.WriteError(ex);
|
||||
}
|
||||
finally
|
||||
{
|
||||
TaskManager.CompleteTask();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Deletes SharePoint site collection with given id.
|
||||
/// </summary>
|
||||
/// <param name="itemId">Site collection id within metabase.</param>
|
||||
/// <returns>?</returns>
|
||||
public static int DeleteSiteCollection(int itemId)
|
||||
{
|
||||
// Check account.
|
||||
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive);
|
||||
if (accountCheck < 0)
|
||||
{
|
||||
return accountCheck;
|
||||
}
|
||||
|
||||
// Load original meta item
|
||||
SharePointSiteCollection origItem = (SharePointSiteCollection) PackageController.GetPackageItem(itemId);
|
||||
if (origItem == null)
|
||||
{
|
||||
return BusinessErrorCodes.ERROR_SHAREPOINT_PACKAGE_ITEM_NOT_FOUND;
|
||||
}
|
||||
|
||||
// Get service settings.
|
||||
StringDictionary hostedSharePointSettings = ServerController.GetServiceSettings(origItem.ServiceId);
|
||||
Uri rootWebApplicationUri = new Uri(hostedSharePointSettings["RootWebApplicationUri"]);
|
||||
string domainName = origItem.Name.Replace(String.Format("{0}://", rootWebApplicationUri.Scheme), String.Empty);
|
||||
|
||||
// Log operation.
|
||||
TaskManager.StartTask("HOSTEDSHAREPOINT", "DELETE_SITE", origItem.Name);
|
||||
TaskManager.ItemId = itemId;
|
||||
|
||||
try
|
||||
{
|
||||
// Delete site collection on server.
|
||||
HostedSharePointServer hostedSharePointServer = GetHostedSharePointServer(origItem.ServiceId);
|
||||
hostedSharePointServer.DeleteSiteCollection(origItem.Url);
|
||||
// Delete record in metabase.
|
||||
PackageController.DeletePackageItem(origItem.Id);
|
||||
|
||||
int dnsServiceId = PackageController.GetPackageServiceId(origItem.PackageId, ResourceGroups.Dns);
|
||||
if (dnsServiceId > 0)
|
||||
{
|
||||
DomainInfo domain = ServerController.GetDomain(domainName);
|
||||
if (domain != null)
|
||||
{
|
||||
ServerController.DeleteDnsZoneRecord(domain.DomainId, String.Empty, DnsRecordType.A, hostedSharePointSettings["RootWebApplicationIpAddress"]);
|
||||
ServerController.DeleteDnsZoneRecord(domain.DomainId, "www", DnsRecordType.A, hostedSharePointSettings["RootWebApplicationIpAddress"]);
|
||||
|
||||
if (!String.IsNullOrEmpty(domain.WebSiteName))
|
||||
{
|
||||
DnsRecord[] records = ServerController.GetDnsZoneRecords(domain.DomainId);
|
||||
foreach (DnsRecord record in records)
|
||||
{
|
||||
if (record.RecordType.Equals(DnsRecordType.A) && record.RecordName.Equals("www", StringComparison.CurrentCultureIgnoreCase))
|
||||
{
|
||||
ServerController.AddDnsZoneRecord(domain.DomainId, String.Empty, DnsRecordType.A,
|
||||
record.RecordData, 0);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw TaskManager.WriteError(ex);
|
||||
}
|
||||
finally
|
||||
{
|
||||
TaskManager.CompleteTask();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Deletes SharePoint site collections which belong to organization.
|
||||
/// </summary>
|
||||
/// <param name="organizationId">Site collection id within metabase.</param>
|
||||
public static void DeleteSiteCollections(int organizationId)
|
||||
{
|
||||
Organization org = OrganizationController.GetOrganization(organizationId);
|
||||
SharePointSiteCollectionListPaged existentSiteCollections = GetSiteCollectionsPaged(org.PackageId, org.Id, String.Empty, String.Empty, String.Empty, 0, Int32.MaxValue);
|
||||
foreach (SharePointSiteCollection existentSiteCollection in existentSiteCollections.SiteCollections)
|
||||
{
|
||||
DeleteSiteCollection(existentSiteCollection.Id);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Backups SharePoint site collection.
|
||||
/// </summary>
|
||||
/// <param name="itemId">Site collection id within metabase.</param>
|
||||
/// <param name="fileName">Backed up site collection file name.</param>
|
||||
/// <param name="zipBackup">A value which shows whether back up must be archived.</param>
|
||||
/// <param name="download">A value which shows whether created back up must be downloaded.</param>
|
||||
/// <param name="folderName">Local folder to store downloaded backup.</param>
|
||||
/// <returns>Created backup file name. </returns>
|
||||
public static string BackupSiteCollection(int itemId, string fileName, bool zipBackup, bool download, string folderName)
|
||||
{
|
||||
// Check account.
|
||||
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive);
|
||||
if (accountCheck < 0)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
// Load original meta item
|
||||
SharePointSiteCollection origItem = (SharePointSiteCollection)PackageController.GetPackageItem(itemId);
|
||||
if (origItem == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
// Log operation.
|
||||
TaskManager.StartTask("HOSTEDSHAREPOINT", "BACKUP_SITE_COLLECTION", origItem.Name);
|
||||
TaskManager.ItemId = itemId;
|
||||
|
||||
try
|
||||
{
|
||||
// Create site collection on server.
|
||||
HostedSharePointServer hostedSharePointServer = GetHostedSharePointServer(origItem.ServiceId);
|
||||
string backFile = hostedSharePointServer.BackupSiteCollection(origItem.Name, fileName, zipBackup);
|
||||
|
||||
if (!download)
|
||||
{
|
||||
// Copy backup files to space folder.
|
||||
string relFolderName = FilesController.CorrectRelativePath(folderName);
|
||||
if (!relFolderName.EndsWith("\\"))
|
||||
{
|
||||
relFolderName = relFolderName + "\\";
|
||||
}
|
||||
|
||||
// Create backup folder if not exists
|
||||
if (!FilesController.DirectoryExists(origItem.PackageId, relFolderName))
|
||||
{
|
||||
FilesController.CreateFolder(origItem.PackageId, relFolderName);
|
||||
}
|
||||
|
||||
string packageFile = relFolderName + Path.GetFileName(backFile);
|
||||
|
||||
// Delete destination file if exists
|
||||
if (FilesController.FileExists(origItem.PackageId, packageFile))
|
||||
{
|
||||
FilesController.DeleteFiles(origItem.PackageId, new string[] { packageFile });
|
||||
}
|
||||
|
||||
byte[] buffer = null;
|
||||
|
||||
int offset = 0;
|
||||
do
|
||||
{
|
||||
// Read remote content.
|
||||
buffer = hostedSharePointServer.GetTempFileBinaryChunk(backFile, offset, FILE_BUFFER_LENGTH);
|
||||
|
||||
// Write remote content.
|
||||
FilesController.AppendFileBinaryChunk(origItem.PackageId, packageFile, buffer);
|
||||
|
||||
offset += FILE_BUFFER_LENGTH;
|
||||
}
|
||||
while (buffer.Length == FILE_BUFFER_LENGTH);
|
||||
}
|
||||
|
||||
return backFile;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw TaskManager.WriteError(ex);
|
||||
}
|
||||
finally
|
||||
{
|
||||
TaskManager.CompleteTask();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Restores SharePoint site collection.
|
||||
/// </summary>
|
||||
/// <param name="itemId">Site collection id within metabase.</param>
|
||||
/// <param name="uploadedFile"></param>
|
||||
/// <param name="packageFile"></param>
|
||||
/// <returns></returns>
|
||||
public static int RestoreSiteCollection(int itemId, string uploadedFile, string packageFile)
|
||||
{
|
||||
// Check account.
|
||||
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive);
|
||||
if (accountCheck < 0)
|
||||
{
|
||||
return accountCheck;
|
||||
}
|
||||
|
||||
// Load original meta item.
|
||||
SharePointSiteCollection origItem = (SharePointSiteCollection)PackageController.GetPackageItem(itemId);
|
||||
if (origItem == null)
|
||||
{
|
||||
return BusinessErrorCodes.ERROR_SHAREPOINT_PACKAGE_ITEM_NOT_FOUND;
|
||||
}
|
||||
|
||||
// Check package.
|
||||
int packageCheck = SecurityContext.CheckPackage(origItem.PackageId, DemandPackage.IsActive);
|
||||
if (packageCheck < 0)
|
||||
{
|
||||
return packageCheck;
|
||||
}
|
||||
|
||||
// Log operation.
|
||||
TaskManager.StartTask("HOSTEDSHAREPOINT", "BACKUP_SITE_COLLECTION", origItem.Name);
|
||||
TaskManager.ItemId = itemId;
|
||||
|
||||
try
|
||||
{
|
||||
// Create site collection on server.
|
||||
HostedSharePointServer hostedSharePointServer = GetHostedSharePointServer(origItem.ServiceId);
|
||||
|
||||
string backupFile = null;
|
||||
if (!String.IsNullOrEmpty(packageFile))
|
||||
{
|
||||
// Copy package files to the remote SharePoint Server.
|
||||
string path = null;
|
||||
byte[] buffer = null;
|
||||
|
||||
int offset = 0;
|
||||
do
|
||||
{
|
||||
// Read package file.
|
||||
buffer = FilesController.GetFileBinaryChunk(origItem.PackageId, packageFile, offset, FILE_BUFFER_LENGTH);
|
||||
|
||||
// Write remote backup file
|
||||
string tempPath = hostedSharePointServer.AppendTempFileBinaryChunk(Path.GetFileName(packageFile), path, buffer);
|
||||
if (path == null)
|
||||
{
|
||||
path = tempPath;
|
||||
backupFile = path;
|
||||
}
|
||||
|
||||
offset += FILE_BUFFER_LENGTH;
|
||||
}
|
||||
while (buffer.Length == FILE_BUFFER_LENGTH);
|
||||
}
|
||||
else if (!String.IsNullOrEmpty(uploadedFile))
|
||||
{
|
||||
// Upladed files.
|
||||
backupFile = uploadedFile;
|
||||
}
|
||||
|
||||
// Restore.
|
||||
if (!String.IsNullOrEmpty(backupFile))
|
||||
{
|
||||
hostedSharePointServer.RestoreSiteCollection(origItem, backupFile);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw TaskManager.WriteError(ex);
|
||||
}
|
||||
finally
|
||||
{
|
||||
TaskManager.CompleteTask();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets binary data chunk of specified size from specified offset.
|
||||
/// </summary>
|
||||
/// <param name="itemId">Item id to obtain realted service id.</param>
|
||||
/// <param name="path">Path to file to get bunary data chunk from.</param>
|
||||
/// <param name="offset">Offset from which to start data reading.</param>
|
||||
/// <param name="length">Binary data chunk length.</param>
|
||||
/// <returns>Binary data chunk read from file.</returns>
|
||||
public static byte[] GetBackupBinaryChunk(int itemId, string path, int offset, int length)
|
||||
{
|
||||
// Load original meta item.
|
||||
SharePointSiteCollection item = (SharePointSiteCollection)PackageController.GetPackageItem(itemId);
|
||||
if (item == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
HostedSharePointServer hostedSharePointServer = GetHostedSharePointServer(item.ServiceId);
|
||||
return hostedSharePointServer.GetTempFileBinaryChunk(path, offset, length);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Appends supplied binary data chunk to file.
|
||||
/// </summary>
|
||||
/// <param name="itemId">Item id to obtain realted service id.</param>
|
||||
/// <param name="fileName">Non existent file name to append to.</param>
|
||||
/// <param name="path">Full path to existent file to append to.</param>
|
||||
/// <param name="chunk">Binary data chunk to append to.</param>
|
||||
/// <returns>Path to file that was appended with chunk.</returns>
|
||||
public static string AppendBackupBinaryChunk(int itemId, string fileName, string path, byte[] chunk)
|
||||
{
|
||||
// Load original meta item.
|
||||
SharePointSiteCollection item = (SharePointSiteCollection)PackageController.GetPackageItem(itemId);
|
||||
if (item == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
HostedSharePointServer hostedSharePointServer = GetHostedSharePointServer(item.ServiceId);
|
||||
return hostedSharePointServer.AppendTempFileBinaryChunk(fileName, path, chunk);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new hosted SharePoint server proxy.
|
||||
/// </summary>
|
||||
/// <param name="serviceId">Hosted SharePoint service id.</param>
|
||||
/// <returns>Hosted SharePoint server proxy.</returns>
|
||||
private static HostedSharePointServer GetHostedSharePointServer(int serviceId)
|
||||
{
|
||||
|
||||
HostedSharePointServer sps = new HostedSharePointServer();
|
||||
ServiceProviderProxy.Init(sps, serviceId);
|
||||
return sps;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets list of importable items.
|
||||
/// </summary>
|
||||
/// <param name="packageId">Package that owns importable items.</param>
|
||||
/// <param name="itemTypeId">Item type id.</param>
|
||||
/// <param name="itemType">Item type.</param>
|
||||
/// <param name="group">Item resource group.</param>
|
||||
/// <returns>List of importable item names.</returns>
|
||||
public List<string> GetImportableItems(int packageId, int itemTypeId, Type itemType, ResourceGroupInfo group)
|
||||
{
|
||||
List<string> items = new List<string>();
|
||||
|
||||
// Get service id
|
||||
int serviceId = PackageController.GetPackageServiceId(packageId, group.GroupName);
|
||||
if (serviceId == 0)
|
||||
{
|
||||
return items;
|
||||
}
|
||||
|
||||
HostedSharePointServer hostedSharePointServer = GetHostedSharePointServer(serviceId);
|
||||
if (itemType == typeof(SharePointSiteCollection))
|
||||
{
|
||||
foreach (SharePointSiteCollection siteCollection in hostedSharePointServer.GetSiteCollections())
|
||||
{
|
||||
items.Add(siteCollection.Url);
|
||||
}
|
||||
}
|
||||
|
||||
return items;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Imports selected item into metabase.
|
||||
/// </summary>
|
||||
/// <param name="packageId">Package to which items must be imported.</param>
|
||||
/// <param name="itemTypeId">Item type id.</param>
|
||||
/// <param name="itemType">Item type.</param>
|
||||
/// <param name="group">Item resource group.</param>
|
||||
/// <param name="itemName">Item name to import.</param>
|
||||
public void ImportItem(int packageId, int itemTypeId, Type itemType, ResourceGroupInfo group, string itemName)
|
||||
{
|
||||
// Get service id
|
||||
int serviceId = PackageController.GetPackageServiceId(packageId, group.GroupName);
|
||||
if (serviceId == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
HostedSharePointServer hostedSharePointServer = GetHostedSharePointServer(serviceId);
|
||||
if (itemType == typeof(SharePointSiteCollection))
|
||||
{
|
||||
SharePointSiteCollection siteCollection = hostedSharePointServer.GetSiteCollection(itemName);
|
||||
PackageController.AddPackageItem(siteCollection);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Backups service item by serializing it into supplied writer.
|
||||
/// </summary>
|
||||
/// <param name="tempFolder">Temporary directory path.</param>
|
||||
/// <param name="writer">Xml wirter used to store backuped service provider items.</param>
|
||||
/// <param name="item">Service provider item to be backed up..</param>
|
||||
/// <param name="group">Service provider resource group.</param>
|
||||
/// <returns>Resulting code.</returns>
|
||||
public int BackupItem(string tempFolder, XmlWriter writer, ServiceProviderItem item, ResourceGroupInfo group)
|
||||
{
|
||||
SharePointSiteCollection siteCollection = item as SharePointSiteCollection;
|
||||
if (siteCollection != null)
|
||||
{
|
||||
HostedSharePointServer hostedSharePointServer = GetHostedSharePointServer(siteCollection.ServiceId);
|
||||
SharePointSiteCollection loadedSiteCollection = hostedSharePointServer.GetSiteCollection(siteCollection.Url);
|
||||
// Update item
|
||||
siteCollection.Url = loadedSiteCollection.Url;
|
||||
siteCollection.OwnerLogin = loadedSiteCollection.OwnerLogin;
|
||||
siteCollection.OwnerName = loadedSiteCollection.OwnerName;
|
||||
siteCollection.OwnerEmail = loadedSiteCollection.OwnerEmail;
|
||||
siteCollection.LocaleId = loadedSiteCollection.LocaleId;
|
||||
siteCollection.Title = loadedSiteCollection.Title;
|
||||
siteCollection.Description = loadedSiteCollection.Description;
|
||||
// Serialize it.
|
||||
XmlSerializer serializer = new XmlSerializer(typeof(SharePointSiteCollection));
|
||||
serializer.Serialize(writer, siteCollection);
|
||||
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Restore backed up previously service provider item.
|
||||
/// </summary>
|
||||
/// <param name="tempFolder">Temporary directory path.</param>
|
||||
/// <param name="itemNode">Serialized service provider item.</param>
|
||||
/// <param name="itemId">Service provider item id.</param>
|
||||
/// <param name="itemType">Service provider item type.</param>
|
||||
/// <param name="itemName">Service provider item name.</param>
|
||||
/// <param name="packageId">Service provider item package.</param>
|
||||
/// <param name="serviceId">Service provider item service id.</param>
|
||||
/// <param name="group">Service provider item resource group.</param>
|
||||
/// <returns>Resulting code.</returns>
|
||||
public int RestoreItem(string tempFolder, XmlNode itemNode, int itemId, Type itemType, string itemName, int packageId, int serviceId, ResourceGroupInfo group)
|
||||
{
|
||||
if (itemType == typeof(SharePointSiteCollection))
|
||||
{
|
||||
HostedSharePointServer hostedSharePointServer = GetHostedSharePointServer(serviceId);
|
||||
// Deserialize item.
|
||||
XmlSerializer serializer = new XmlSerializer(typeof(SharePointSiteCollection));
|
||||
SharePointSiteCollection siteCollection = (SharePointSiteCollection)serializer.Deserialize(new XmlNodeReader(itemNode.SelectSingleNode("SharePointSiteCollection")));
|
||||
siteCollection.PackageId = packageId;
|
||||
siteCollection.ServiceId = serviceId;
|
||||
|
||||
// Create site collection if needed.
|
||||
if (hostedSharePointServer.GetSiteCollection(siteCollection.Url) == null)
|
||||
{
|
||||
hostedSharePointServer.CreateSiteCollection(siteCollection);
|
||||
}
|
||||
|
||||
// Add metabase record if needed.
|
||||
SharePointSiteCollection metaSiteCollection = (SharePointSiteCollection)PackageController.GetPackageItemByName(packageId, itemName, typeof(SharePointSiteCollection));
|
||||
if (metaSiteCollection == null)
|
||||
{
|
||||
PackageController.AddPackageItem(siteCollection);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
private static int GetHostedSharePointServiceId(int packageId)
|
||||
{
|
||||
return PackageController.GetPackageServiceId(packageId, ResourceGroups.HostedSharePoint);
|
||||
}
|
||||
|
||||
private static List<SharePointSiteCollection> GetOrganizationSharePointSiteCollections(int orgId)
|
||||
{
|
||||
Organization org = OrganizationController.GetOrganization(orgId);
|
||||
|
||||
SharePointSiteCollectionListPaged siteCollections = GetSiteCollectionsPaged(org.PackageId, org.Id, String.Empty, String.Empty, String.Empty, 0, Int32.MaxValue);
|
||||
return siteCollections.SiteCollections;
|
||||
}
|
||||
|
||||
private static int RecalculateStorageMaxSize(int size, int packageId)
|
||||
{
|
||||
PackageContext cntx = PackageController.GetPackageContext(packageId);
|
||||
QuotaValueInfo quota = cntx.Quotas[Quotas.HOSTED_SHAREPOINT_STORAGE_SIZE];
|
||||
|
||||
if (quota.QuotaAllocatedValue == -1)
|
||||
{
|
||||
if (size == -1)//Unlimited
|
||||
return -1;
|
||||
else
|
||||
return size;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (size == -1)
|
||||
return quota.QuotaAllocatedValue;
|
||||
|
||||
return Math.Min(size, quota.QuotaAllocatedValue);
|
||||
}
|
||||
}
|
||||
|
||||
private static int RecalculateMaxSize(int parentSize, int realSize)
|
||||
{
|
||||
if (parentSize == -1)
|
||||
{
|
||||
if (realSize == -1 || realSize == 0)
|
||||
return -1;
|
||||
else
|
||||
return realSize;
|
||||
}
|
||||
|
||||
|
||||
if (realSize == -1 || realSize == 0)
|
||||
return parentSize;
|
||||
|
||||
return Math.Min(parentSize, realSize);
|
||||
|
||||
}
|
||||
|
||||
|
||||
public static int SetStorageSettings(int itemId, int maxStorage, int warningStorage, bool applyToSiteCollections)
|
||||
{
|
||||
// check account
|
||||
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive);
|
||||
if (accountCheck < 0) return accountCheck;
|
||||
|
||||
// place log record
|
||||
TaskManager.StartTask("HOSTED_SHAREPOINT", "SET_ORG_LIMITS");
|
||||
TaskManager.ItemId = itemId;
|
||||
|
||||
try
|
||||
{
|
||||
Organization org = (Organization)PackageController.GetPackageItem(itemId);
|
||||
if (org == null)
|
||||
return 0;
|
||||
|
||||
// set limits
|
||||
int realMaxSizeValue = RecalculateStorageMaxSize(maxStorage, org.PackageId);
|
||||
|
||||
org.MaxSharePointStorage = realMaxSizeValue;
|
||||
|
||||
org.WarningSharePointStorage = realMaxSizeValue == -1 ? -1 : Math.Min(warningStorage, realMaxSizeValue);
|
||||
|
||||
// save organization
|
||||
UpdateOrganization(org);
|
||||
|
||||
if (applyToSiteCollections)
|
||||
{
|
||||
int serviceId = GetHostedSharePointServiceId(org.PackageId);
|
||||
|
||||
HostedSharePointServer hostedSharePointServer = GetHostedSharePointServer(serviceId);
|
||||
|
||||
List<SharePointSiteCollection> currentOrgSiteCollection =
|
||||
GetOrganizationSharePointSiteCollections(org.Id);
|
||||
|
||||
|
||||
foreach( SharePointSiteCollection siteCollection in currentOrgSiteCollection)
|
||||
{
|
||||
try
|
||||
{
|
||||
SharePointSiteCollection sc = GetSiteCollection(siteCollection.Id);
|
||||
sc.MaxSiteStorage = realMaxSizeValue;
|
||||
sc.WarningStorage = realMaxSizeValue == -1 ? -1 : warningStorage;
|
||||
PackageController.UpdatePackageItem(sc);
|
||||
|
||||
hostedSharePointServer.UpdateQuotas(siteCollection.PhysicalAddress, realMaxSizeValue,
|
||||
warningStorage);
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
TaskManager.WriteError(ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw TaskManager.WriteError(ex);
|
||||
}
|
||||
finally
|
||||
{
|
||||
TaskManager.CompleteTask();
|
||||
}
|
||||
}
|
||||
|
||||
public static SharePointSiteDiskSpace[] CalculateSharePointSitesDiskSpace(int itemId, out int errorCode)
|
||||
{
|
||||
SharePointSiteDiskSpace[] retDiskSpace = null;
|
||||
errorCode = 0;
|
||||
// check account
|
||||
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive);
|
||||
if (accountCheck < 0)
|
||||
{
|
||||
errorCode = accountCheck;
|
||||
return null;
|
||||
}
|
||||
|
||||
// place log record
|
||||
TaskManager.StartTask("HOSTED_SHAREPOINT", "CALCULATE_DISK_SPACE");
|
||||
TaskManager.ItemId = itemId;
|
||||
try
|
||||
{
|
||||
Organization org = (Organization) PackageController.GetPackageItem(itemId);
|
||||
if (org == null)
|
||||
return null;
|
||||
|
||||
int serviceId = GetHostedSharePointServiceId(org.PackageId);
|
||||
|
||||
HostedSharePointServer hostedSharePointServer = GetHostedSharePointServer(serviceId);
|
||||
|
||||
List<SharePointSiteCollection> currentOrgSiteCollection =
|
||||
GetOrganizationSharePointSiteCollections(org.Id);
|
||||
|
||||
List<string> urls = new List<string>();
|
||||
foreach (SharePointSiteCollection siteCollection in currentOrgSiteCollection)
|
||||
{
|
||||
urls.Add(siteCollection.PhysicalAddress);
|
||||
}
|
||||
if (urls.Count > 0)
|
||||
retDiskSpace = hostedSharePointServer.CalculateSiteCollectionsDiskSpace(urls.ToArray());
|
||||
else
|
||||
{
|
||||
retDiskSpace = new SharePointSiteDiskSpace[1];
|
||||
retDiskSpace[0] = new SharePointSiteDiskSpace();
|
||||
retDiskSpace[0].DiskSpace = 0;
|
||||
retDiskSpace[0].Url = string.Empty;
|
||||
}
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
throw TaskManager.WriteError(ex);
|
||||
}
|
||||
finally
|
||||
{
|
||||
TaskManager.CompleteTask();
|
||||
}
|
||||
return retDiskSpace;
|
||||
}
|
||||
|
||||
private static void UpdateOrganization(Organization organization)
|
||||
{
|
||||
PackageController.UpdatePackageItem(organization);
|
||||
}
|
||||
|
||||
|
||||
public static void UpdateQuota(int itemId, int siteCollectionId, int maxStorage, int warningStorage)
|
||||
{
|
||||
TaskManager.StartTask("HOSTED_SHAREPOINT", "UPDATE_QUOTA");
|
||||
try
|
||||
{
|
||||
Organization org = (Organization) PackageController.GetPackageItem(itemId);
|
||||
if (org == null)
|
||||
return;
|
||||
|
||||
int serviceId = GetHostedSharePointServiceId(org.PackageId);
|
||||
|
||||
HostedSharePointServer hostedSharePointServer = GetHostedSharePointServer(serviceId);
|
||||
|
||||
SharePointSiteCollection sc = GetSiteCollection(siteCollectionId);
|
||||
|
||||
int maxSize = RecalculateMaxSize(org.MaxSharePointStorage, maxStorage);
|
||||
int warningSize = warningStorage;
|
||||
|
||||
|
||||
sc.MaxSiteStorage = maxSize;
|
||||
sc.WarningStorage = maxSize == -1 ? -1 : Math.Min(warningSize, maxSize);
|
||||
PackageController.UpdatePackageItem(sc);
|
||||
|
||||
hostedSharePointServer.UpdateQuotas(sc.PhysicalAddress, maxSize,
|
||||
warningStorage);
|
||||
}
|
||||
catch(Exception ex)
|
||||
{
|
||||
throw TaskManager.WriteError(ex);
|
||||
}
|
||||
finally
|
||||
{
|
||||
TaskManager.CompleteTask();
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// Gets a value if caller is in demo mode.
|
||||
/// </summary>
|
||||
private static bool IsDemoMode
|
||||
{
|
||||
get
|
||||
{
|
||||
return (SecurityContext.CheckAccount(DemandAccount.NotDemo) < 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
File diff suppressed because it is too large
Load diff
|
@ -0,0 +1,393 @@
|
|||
// Copyright (c) 2011, 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.IO;
|
||||
using System.Data;
|
||||
using System.Collections.Specialized;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using System.Xml;
|
||||
using System.Xml.Serialization;
|
||||
using System.Web;
|
||||
|
||||
using WebsitePanel.Providers;
|
||||
using WebsitePanel.Providers.Web;
|
||||
using WebsitePanel.Providers.Statistics;
|
||||
|
||||
namespace WebsitePanel.EnterpriseServer
|
||||
{
|
||||
public class StatisticsServerController : IImportController, IBackupController
|
||||
{
|
||||
public static StatisticsServer GetStatisticsServer(int serviceId)
|
||||
{
|
||||
StatisticsServer stats = new StatisticsServer();
|
||||
ServiceProviderProxy.Init(stats, serviceId);
|
||||
return stats;
|
||||
}
|
||||
|
||||
public static DataSet GetRawStatisticsSitesPaged(int packageId,
|
||||
string filterColumn, string filterValue, string sortColumn, int startRow, int maximumRows)
|
||||
{
|
||||
return PackageController.GetRawPackageItemsPaged(packageId, typeof(StatsSite),
|
||||
true, filterColumn, filterValue, sortColumn, startRow, maximumRows);
|
||||
}
|
||||
|
||||
public static List<StatsSite> GetStatisticsSites(int packageId, bool recursive)
|
||||
{
|
||||
List<ServiceProviderItem> items = PackageController.GetPackageItemsByType(
|
||||
packageId, typeof(StatsSite), recursive);
|
||||
|
||||
return items.ConvertAll<StatsSite>(
|
||||
new Converter<ServiceProviderItem, StatsSite>(ConvertItemToStatisticsSiteItem));
|
||||
}
|
||||
|
||||
private static StatsSite ConvertItemToStatisticsSiteItem(ServiceProviderItem item)
|
||||
{
|
||||
return (StatsSite)item;
|
||||
}
|
||||
|
||||
public static StatsServer[] GetServers(int serviceId)
|
||||
{
|
||||
// check account
|
||||
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive
|
||||
| DemandAccount.IsAdmin);
|
||||
if (accountCheck < 0) return null;
|
||||
|
||||
StatisticsServer stats = new StatisticsServer();
|
||||
ServiceProviderProxy.Init(stats, serviceId);
|
||||
return stats.GetServers();
|
||||
}
|
||||
|
||||
public static StatsSite GetSite(int itemId)
|
||||
{
|
||||
// load meta item
|
||||
StatsSite item = (StatsSite)PackageController.GetPackageItem(itemId);
|
||||
if (item == null)
|
||||
return null;
|
||||
|
||||
// load item from service
|
||||
StatisticsServer stats = new StatisticsServer();
|
||||
ServiceProviderProxy.Init(stats, item.ServiceId);
|
||||
StatsSite site = stats.GetSite(item.SiteId);
|
||||
|
||||
if (site == null)
|
||||
return null;
|
||||
|
||||
site.Id = item.Id;
|
||||
site.Name = item.Name;
|
||||
site.ServiceId = item.ServiceId;
|
||||
site.PackageId = item.PackageId;
|
||||
site.SiteId = item.SiteId;
|
||||
|
||||
// update statistics URL
|
||||
if (!String.IsNullOrEmpty(site.StatisticsUrl))
|
||||
{
|
||||
// load space owner
|
||||
UserInfo user = PackageController.GetPackageOwner(item.PackageId);
|
||||
if (user != null)
|
||||
{
|
||||
site.StatisticsUrl = Utils.ReplaceStringVariable(site.StatisticsUrl, "username",
|
||||
HttpUtility.UrlEncode(user.Username));
|
||||
site.StatisticsUrl = Utils.ReplaceStringVariable(site.StatisticsUrl, "password",
|
||||
HttpUtility.UrlEncode(user.Password));
|
||||
}
|
||||
}
|
||||
|
||||
return site;
|
||||
}
|
||||
|
||||
public static int AddSite(StatsSite item)
|
||||
{
|
||||
// check account
|
||||
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive);
|
||||
if (accountCheck < 0) return accountCheck;
|
||||
|
||||
// check package
|
||||
int packageCheck = SecurityContext.CheckPackage(item.PackageId, DemandPackage.IsActive);
|
||||
if (packageCheck < 0) return packageCheck;
|
||||
|
||||
// check quota
|
||||
QuotaValueInfo quota = PackageController.GetPackageQuota(item.PackageId, Quotas.STATS_SITES);
|
||||
if (quota.QuotaExhausted)
|
||||
return BusinessErrorCodes.ERROR_STATS_RESOURCE_QUOTA_LIMIT;
|
||||
|
||||
// check if stats resource is available
|
||||
int serviceId = PackageController.GetPackageServiceId(item.PackageId, ResourceGroups.Statistics);
|
||||
if (serviceId == 0)
|
||||
return BusinessErrorCodes.ERROR_STATS_RESOURCE_UNAVAILABLE;
|
||||
|
||||
// check package items
|
||||
if (PackageController.GetPackageItemByName(item.PackageId, item.Name, typeof(StatsSite)) != null)
|
||||
return BusinessErrorCodes.ERROR_STATS_PACKAGE_ITEM_EXISTS;
|
||||
|
||||
// place log record
|
||||
TaskManager.StartTask("STATS_SITE", "ADD", item.Name);
|
||||
|
||||
try
|
||||
{
|
||||
// load web site
|
||||
WebSite siteItem = (WebSite)PackageController.GetPackageItemByName(item.PackageId,
|
||||
item.Name, typeof(WebSite));
|
||||
|
||||
if (siteItem == null)
|
||||
return BusinessErrorCodes.ERROR_WEB_SITE_SERVICE_UNAVAILABLE;
|
||||
|
||||
// get service web site
|
||||
WebServer web = new WebServer();
|
||||
ServiceProviderProxy.Init(web, siteItem.ServiceId);
|
||||
WebSite site = web.GetSite(siteItem.SiteId);
|
||||
|
||||
List<DomainInfo> pointers = WebServerController.GetWebSitePointers(siteItem.Id);
|
||||
List<string> aliases = new List<string>();
|
||||
|
||||
foreach(DomainInfo pointer in pointers)
|
||||
aliases.Add(pointer.DomainName);
|
||||
|
||||
StatisticsServer stats = new StatisticsServer();
|
||||
ServiceProviderProxy.Init(stats, serviceId);
|
||||
string siteNumber = (site.IIs7) ? site[WebSite.IIS7_SITE_ID] : siteItem.SiteId.Replace("/", "");
|
||||
string logsCommonFolder = site.LogsPath;
|
||||
string logsFolder = Path.Combine(logsCommonFolder, siteNumber);
|
||||
|
||||
// get service settings
|
||||
StringDictionary settings = ServerController.GetServiceSettings(serviceId);
|
||||
if (Utils.ParseBool(settings["BuildUncLogsPath"], false))
|
||||
{
|
||||
logsFolder = FilesController.ConvertToUncPath(siteItem.ServiceId, logsFolder);
|
||||
}
|
||||
|
||||
item.LogDirectory = logsFolder;
|
||||
item.DomainAliases = aliases.ToArray();
|
||||
|
||||
// install statistics
|
||||
item.SiteId = stats.AddSite(item);
|
||||
|
||||
// save statistics item
|
||||
item.ServiceId = serviceId;
|
||||
int itemId = PackageController.AddPackageItem(item);
|
||||
|
||||
TaskManager.ItemId = itemId;
|
||||
|
||||
return itemId;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw TaskManager.WriteError(ex);
|
||||
}
|
||||
finally
|
||||
{
|
||||
TaskManager.CompleteTask();
|
||||
}
|
||||
}
|
||||
|
||||
public static int UpdateSite(StatsSite item)
|
||||
{
|
||||
// check account
|
||||
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive);
|
||||
if (accountCheck < 0) return accountCheck;
|
||||
|
||||
// load original meta item
|
||||
StatsSite origItem = (StatsSite)PackageController.GetPackageItem(item.Id);
|
||||
if (origItem == null)
|
||||
return BusinessErrorCodes.ERROR_STATS_PACKAGE_ITEM_NOT_FOUND;
|
||||
|
||||
// check package
|
||||
int packageCheck = SecurityContext.CheckPackage(origItem.PackageId, DemandPackage.IsActive);
|
||||
if (packageCheck < 0) return packageCheck;
|
||||
|
||||
// update statistics site
|
||||
item.Name = origItem.Name;
|
||||
item.SiteId = origItem.SiteId;
|
||||
|
||||
// place log record
|
||||
TaskManager.StartTask("STATS_SITE", "UPDATE", origItem.Name);
|
||||
TaskManager.ItemId = origItem.Id;
|
||||
|
||||
try
|
||||
{
|
||||
StatisticsServer stats = new StatisticsServer();
|
||||
ServiceProviderProxy.Init(stats, origItem.ServiceId);
|
||||
stats.UpdateSite(item);
|
||||
|
||||
// update service item
|
||||
PackageController.UpdatePackageItem(item);
|
||||
|
||||
return 0;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw TaskManager.WriteError(ex);
|
||||
}
|
||||
finally
|
||||
{
|
||||
TaskManager.CompleteTask();
|
||||
}
|
||||
}
|
||||
|
||||
public static int DeleteSite(int itemId)
|
||||
{
|
||||
// check account
|
||||
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo);
|
||||
if (accountCheck < 0) return accountCheck;
|
||||
|
||||
|
||||
// load original meta item
|
||||
StatsSite origItem = (StatsSite)PackageController.GetPackageItem(itemId);
|
||||
if (origItem == null)
|
||||
return BusinessErrorCodes.ERROR_STATS_PACKAGE_ITEM_NOT_FOUND;
|
||||
|
||||
// place log record
|
||||
TaskManager.StartTask("STATS_SITE", "DELETE", origItem.Name);
|
||||
TaskManager.ItemId = origItem.Id;
|
||||
|
||||
try
|
||||
{
|
||||
// get service
|
||||
StatisticsServer stats = new StatisticsServer();
|
||||
ServiceProviderProxy.Init(stats, origItem.ServiceId);
|
||||
|
||||
// delete service item
|
||||
stats.DeleteSite(origItem.SiteId);
|
||||
|
||||
// delete meta item
|
||||
PackageController.DeletePackageItem(origItem.Id);
|
||||
|
||||
return 0;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw TaskManager.WriteError(ex);
|
||||
}
|
||||
finally
|
||||
{
|
||||
TaskManager.CompleteTask();
|
||||
}
|
||||
}
|
||||
|
||||
#region IImportController Members
|
||||
|
||||
public List<string> GetImportableItems(int packageId, int itemTypeId, Type itemType, ResourceGroupInfo group)
|
||||
{
|
||||
List<string> items = new List<string>();
|
||||
|
||||
// get service id
|
||||
int serviceId = PackageController.GetPackageServiceId(packageId, group.GroupName);
|
||||
if (serviceId == 0)
|
||||
return items;
|
||||
|
||||
// Mail provider
|
||||
StatisticsServer stats = new StatisticsServer();
|
||||
ServiceProviderProxy.Init(stats, serviceId);
|
||||
|
||||
if (itemType == typeof(StatsSite))
|
||||
items.AddRange(stats.GetSites());
|
||||
|
||||
return items;
|
||||
}
|
||||
|
||||
public void ImportItem(int packageId, int itemTypeId, Type itemType,
|
||||
ResourceGroupInfo group, string itemName)
|
||||
{
|
||||
// get service id
|
||||
int serviceId = PackageController.GetPackageServiceId(packageId, group.GroupName);
|
||||
if (serviceId == 0)
|
||||
return;
|
||||
|
||||
StatisticsServer stats = new StatisticsServer();
|
||||
ServiceProviderProxy.Init(stats, serviceId);
|
||||
|
||||
if (itemType == typeof(StatsSite))
|
||||
{
|
||||
// import statistics site
|
||||
StatsSite site = new StatsSite();
|
||||
site.ServiceId = serviceId;
|
||||
site.PackageId = packageId;
|
||||
site.Name = itemName;
|
||||
site.GroupName = group.GroupName;
|
||||
|
||||
// load site id
|
||||
site.SiteId = stats.GetSiteId(itemName);
|
||||
|
||||
PackageController.AddPackageItem(site);
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
#region IBackupController Members
|
||||
|
||||
public int BackupItem(string tempFolder, System.Xml.XmlWriter writer, ServiceProviderItem item, ResourceGroupInfo group)
|
||||
{
|
||||
if (item is StatsSite)
|
||||
{
|
||||
// backup stats site
|
||||
StatisticsServer stats = GetStatisticsServer(item.ServiceId);
|
||||
|
||||
// read site info
|
||||
StatsSite itemSite = item as StatsSite;
|
||||
StatsSite site = stats.GetSite(itemSite.SiteId);
|
||||
|
||||
XmlSerializer serializer = new XmlSerializer(typeof(StatsSite));
|
||||
serializer.Serialize(writer, site);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
public int RestoreItem(string tempFolder, System.Xml.XmlNode itemNode, int itemId, Type itemType, string itemName, int packageId, int serviceId, ResourceGroupInfo group)
|
||||
{
|
||||
if (itemType == typeof(StatsSite))
|
||||
{
|
||||
StatisticsServer stats = GetStatisticsServer(serviceId);
|
||||
|
||||
// extract meta item
|
||||
XmlSerializer serializer = new XmlSerializer(typeof(StatsSite));
|
||||
StatsSite site = (StatsSite)serializer.Deserialize(
|
||||
new XmlNodeReader(itemNode.SelectSingleNode("StatsSite")));
|
||||
|
||||
// create site if required
|
||||
if (stats.GetSite(site.SiteId) == null)
|
||||
{
|
||||
stats.AddSite(site);
|
||||
}
|
||||
|
||||
// add meta-item if required
|
||||
if (PackageController.GetPackageItemByName(packageId, itemName, typeof(StatsSite)) == null)
|
||||
{
|
||||
site.PackageId = packageId;
|
||||
site.ServiceId = serviceId;
|
||||
PackageController.AddPackageItem(site);
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
|
@ -0,0 +1,194 @@
|
|||
// Copyright (c) 2011, 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.Xml;
|
||||
using System.Data;
|
||||
using System.Collections.Specialized;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace WebsitePanel.EnterpriseServer
|
||||
{
|
||||
public class SystemController
|
||||
{
|
||||
private SystemController()
|
||||
{
|
||||
}
|
||||
|
||||
public static SystemSettings GetSystemSettings(string settingsName)
|
||||
{
|
||||
// check account
|
||||
int accountCheck = SecurityContext.CheckAccount(DemandAccount.IsAdmin | DemandAccount.IsActive);
|
||||
if (accountCheck < 0)
|
||||
return null;
|
||||
|
||||
bool isDemoAccount = (SecurityContext.CheckAccount(DemandAccount.NotDemo) < 0);
|
||||
|
||||
return GetSystemSettingsInternal(settingsName, !isDemoAccount);
|
||||
}
|
||||
|
||||
internal static SystemSettings GetSystemSettingsInternal(string settingsName, bool decryptPassword)
|
||||
{
|
||||
// create settings object
|
||||
SystemSettings settings = new SystemSettings();
|
||||
|
||||
// get service settings
|
||||
IDataReader reader = null;
|
||||
|
||||
try
|
||||
{
|
||||
// get service settings
|
||||
reader = DataProvider.GetSystemSettings(settingsName);
|
||||
|
||||
while (reader.Read())
|
||||
{
|
||||
string name = (string)reader["PropertyName"];
|
||||
string val = (string)reader["PropertyValue"];
|
||||
|
||||
if (name.ToLower().IndexOf("password") != -1 && decryptPassword)
|
||||
val = CryptoUtils.Decrypt(val);
|
||||
|
||||
settings[name] = val;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
finally
|
||||
{
|
||||
if (reader != null && !reader.IsClosed)
|
||||
reader.Close();
|
||||
}
|
||||
|
||||
return settings;
|
||||
}
|
||||
|
||||
public static int SetSystemSettings(string settingsName, SystemSettings settings)
|
||||
{
|
||||
// check account
|
||||
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsAdmin
|
||||
| DemandAccount.IsActive);
|
||||
if (accountCheck < 0) return accountCheck;
|
||||
|
||||
XmlDocument xmldoc = new XmlDocument();
|
||||
XmlElement root = xmldoc.CreateElement("properties");
|
||||
|
||||
foreach (string[] pair in settings.SettingsArray)
|
||||
{
|
||||
string name = pair[0];
|
||||
string val = pair[1];
|
||||
|
||||
if (name.ToLower().IndexOf("password") != -1)
|
||||
val = CryptoUtils.Encrypt(val);
|
||||
|
||||
XmlElement property = xmldoc.CreateElement("property");
|
||||
|
||||
property.SetAttribute("name", name);
|
||||
property.SetAttribute("value", val);
|
||||
|
||||
root.AppendChild(property);
|
||||
}
|
||||
|
||||
DataProvider.SetSystemSettings(settingsName, root.OuterXml);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
internal static bool GetSystemSetupMode()
|
||||
{
|
||||
var scpaSystemSettings = GetSystemSettings(SystemSettings.SETUP_SETTINGS);
|
||||
// Flag either not found or empty
|
||||
if (String.IsNullOrEmpty(scpaSystemSettings["EnabledSCPA"]))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
//
|
||||
return true;
|
||||
}
|
||||
|
||||
internal static int SetupControlPanelAccounts(string passwordA, string passwordB, string ip)
|
||||
{
|
||||
try
|
||||
{
|
||||
TaskManager.StartTask("SYSTEM", "COMPLETE_SCPA");
|
||||
//
|
||||
TaskManager.WriteParameter("Password A", passwordA);
|
||||
TaskManager.WriteParameter("Password B", passwordB);
|
||||
TaskManager.WriteParameter("IP Address", ip);
|
||||
//
|
||||
var enabledScpaMode = GetSystemSetupMode();
|
||||
//
|
||||
if (enabledScpaMode == false)
|
||||
{
|
||||
//
|
||||
TaskManager.WriteWarning("Attempt to execute SCPA procedure for an uknown reason");
|
||||
//
|
||||
return BusinessErrorCodes.FAILED_EXECUTE_SERVICE_OPERATION;
|
||||
}
|
||||
|
||||
// Entering the security context into Supervisor mode
|
||||
SecurityContext.SetThreadSupervisorPrincipal();
|
||||
//
|
||||
var accountA = UserController.GetUserInternally("serveradmin");
|
||||
var accountB = UserController.GetUserInternally("admin");
|
||||
//
|
||||
var resultCodeA = UserController.ChangeUserPassword(accountA.UserId, passwordA);
|
||||
//
|
||||
if (resultCodeA < 0)
|
||||
{
|
||||
TaskManager.WriteParameter("Result Code A", resultCodeA);
|
||||
//
|
||||
return resultCodeA;
|
||||
}
|
||||
//
|
||||
var resultCodeB = UserController.ChangeUserPassword(accountB.UserId, passwordB);
|
||||
//
|
||||
if (resultCodeB < 0)
|
||||
{
|
||||
TaskManager.WriteParameter("Result Code B", resultCodeB);
|
||||
//
|
||||
return resultCodeB;
|
||||
}
|
||||
// Disable SCPA mode
|
||||
SetSystemSettings(SystemSettings.SETUP_SETTINGS, SystemSettings.Empty);
|
||||
// Operation has succeeded
|
||||
return 0;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.WriteError(ex);
|
||||
//
|
||||
return BusinessErrorCodes.FAILED_EXECUTE_SERVICE_OPERATION;
|
||||
}
|
||||
finally
|
||||
{
|
||||
TaskManager.CompleteTask();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,139 @@
|
|||
// Copyright (c) 2011, 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;
|
||||
|
||||
namespace WebsitePanel.EnterpriseServer.Tasks
|
||||
{
|
||||
public class SendEmailNotification : TaskEventHandler
|
||||
{
|
||||
public override void OnStart()
|
||||
{
|
||||
// nothing to-do
|
||||
}
|
||||
|
||||
public override void OnComplete()
|
||||
{
|
||||
if (!TaskManager.HasErrors)
|
||||
{
|
||||
// Send user add notification
|
||||
if (TaskManager.TaskSource == "USER" &&
|
||||
TaskManager.TaskName == "ADD" && TaskManager.ItemId > 0)
|
||||
{
|
||||
SendAddUserNotification();
|
||||
}
|
||||
// Send hosting package add notification
|
||||
if (TaskManager.TaskSource == "HOSTING_SPACE"
|
||||
&& TaskManager.TaskName == "ADD" && TaskManager.ItemId > 0)
|
||||
{
|
||||
SendAddPackageNotification();
|
||||
}
|
||||
// Send hosting package add notification
|
||||
if (TaskManager.TaskSource == "HOSTING_SPACE_WR"
|
||||
&& TaskManager.TaskName == "ADD" && TaskManager.ItemId > 0)
|
||||
{
|
||||
SendAddPackageWithResourcesNotification();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void CheckSmtpResult(int resultCode)
|
||||
{
|
||||
if (resultCode != 0)
|
||||
{
|
||||
TaskManager.WriteWarning("Unable to send an e-mail notification");
|
||||
TaskManager.WriteParameter("SMTP Result", resultCode);
|
||||
}
|
||||
}
|
||||
|
||||
protected void SendAddPackageWithResourcesNotification()
|
||||
{
|
||||
try
|
||||
{
|
||||
bool sendLetter = (bool)TaskManager.TaskParameters["SendLetter"];
|
||||
if (sendLetter)
|
||||
{
|
||||
int sendResult = PackageController.SendPackageSummaryLetter(TaskManager.ItemId, null, null, true);
|
||||
CheckSmtpResult(sendResult);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.WriteWarning(ex.StackTrace);
|
||||
}
|
||||
}
|
||||
|
||||
protected void SendAddPackageNotification()
|
||||
{
|
||||
try
|
||||
{
|
||||
int userId = (int)TaskManager.TaskParameters["UserId"];
|
||||
bool sendLetter = (bool)TaskManager.TaskParameters["SendLetter"];
|
||||
bool signup = (bool)TaskManager.TaskParameters["Signup"];
|
||||
// send space letter if enabled
|
||||
UserSettings settings = UserController.GetUserSettings(userId, UserSettings.PACKAGE_SUMMARY_LETTER);
|
||||
if (sendLetter
|
||||
&& !String.IsNullOrEmpty(settings["EnableLetter"])
|
||||
&& Utils.ParseBool(settings["EnableLetter"], false))
|
||||
{
|
||||
// send letter
|
||||
int smtpResult = PackageController.SendPackageSummaryLetter(TaskManager.ItemId, null, null, signup);
|
||||
CheckSmtpResult(smtpResult);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.WriteWarning(ex.StackTrace);
|
||||
}
|
||||
}
|
||||
|
||||
protected void SendAddUserNotification()
|
||||
{
|
||||
try
|
||||
{
|
||||
bool sendLetter = (bool)TaskManager.TaskParameters["SendLetter"];
|
||||
int userId = TaskManager.ItemId;
|
||||
// send account letter if enabled
|
||||
UserSettings settings = UserController.GetUserSettings(userId, UserSettings.ACCOUNT_SUMMARY_LETTER);
|
||||
if (sendLetter
|
||||
&& !String.IsNullOrEmpty(settings["EnableLetter"])
|
||||
&& Utils.ParseBool(settings["EnableLetter"], false))
|
||||
{
|
||||
// send letter
|
||||
int smtpResult = PackageController.SendAccountSummaryLetter(userId, null, null, true);
|
||||
CheckSmtpResult(smtpResult);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.WriteWarning(ex.StackTrace);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,40 @@
|
|||
// Copyright (c) 2011, 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.Text;
|
||||
|
||||
namespace WebsitePanel.EnterpriseServer
|
||||
{
|
||||
public abstract class TaskEventHandler
|
||||
{
|
||||
public abstract void OnStart();
|
||||
public abstract void OnComplete();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,640 @@
|
|||
// Copyright (c) 2011, 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.IO;
|
||||
using System.Threading;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
using System.Web;
|
||||
using System.Web.Caching;
|
||||
using System.Xml;
|
||||
using System.Reflection;
|
||||
using WebsitePanel.Providers.Common;
|
||||
|
||||
namespace WebsitePanel.EnterpriseServer
|
||||
{
|
||||
public class TaskManager
|
||||
{
|
||||
private static Hashtable tasks = Hashtable.Synchronized(new Hashtable());
|
||||
private static Hashtable eventHandlers = null;
|
||||
|
||||
// purge timer, used for killing old tasks from the hash
|
||||
static Timer purgeTimer = new Timer(new TimerCallback(PurgeCompletedTasks),
|
||||
null,
|
||||
60000, // start from 1 minute
|
||||
60000); // invoke each minute
|
||||
|
||||
private static BackgroundTask RootTask
|
||||
{
|
||||
get { return TasksStack.Count > 0 ? TasksStack[0] : null; }
|
||||
}
|
||||
|
||||
private static BackgroundTask TopTask
|
||||
{
|
||||
get { return TasksStack.Count > 0 ? TasksStack[TasksStack.Count - 1] : null; }
|
||||
}
|
||||
|
||||
private static List<BackgroundTask> TasksStack
|
||||
{
|
||||
get
|
||||
{
|
||||
List<BackgroundTask> stack = (List<BackgroundTask>)Thread.GetData(Thread.GetNamedDataSlot("BackgroundTasksStack"));
|
||||
if (stack == null)
|
||||
{
|
||||
stack = new List<BackgroundTask>();
|
||||
Thread.SetData(Thread.GetNamedDataSlot("BackgroundTasksStack"), stack);
|
||||
}
|
||||
return stack;
|
||||
}
|
||||
}
|
||||
|
||||
public static void StartTask(string source, string taskName)
|
||||
{
|
||||
StartTask(null, source, taskName, null);
|
||||
}
|
||||
|
||||
public static void StartTask(string source, string taskName, object itemName)
|
||||
{
|
||||
StartTask(null, source, taskName, itemName);
|
||||
}
|
||||
|
||||
public static void StartTask(string taskId, string source, string taskName, object itemName)
|
||||
{
|
||||
// create new task object
|
||||
BackgroundTask task = new BackgroundTask();
|
||||
task.TaskId = String.IsNullOrEmpty(taskId) ? Guid.NewGuid().ToString("N") : taskId;
|
||||
task.UserId = SecurityContext.User.UserId;
|
||||
task.EffectiveUserId = SecurityContext.User.IsPeer ? SecurityContext.User.OwnerId : task.UserId;
|
||||
task.StartDate = DateTime.Now;
|
||||
task.Source = source;
|
||||
task.TaskName = taskName;
|
||||
task.ItemName = itemName != null ? itemName.ToString() : "";
|
||||
task.Severity = 0; //info
|
||||
task.TaskThread = Thread.CurrentThread;
|
||||
|
||||
// new "parent" task?
|
||||
if (TasksStack.Count == 0)
|
||||
{
|
||||
// register task globally
|
||||
tasks[task.TaskId] = task;
|
||||
}
|
||||
else
|
||||
{
|
||||
// child task
|
||||
// add log record to the root task
|
||||
BackgroundTaskLogRecord logRecord = new BackgroundTaskLogRecord();
|
||||
logRecord.InnerTaskStart = true;
|
||||
logRecord.Text = source + "_" + taskName;
|
||||
logRecord.TextParameters = new string[] { itemName != null ? itemName.ToString() : "" };
|
||||
logRecord.TextIdent = TasksStack.Count - 1;
|
||||
RootTask.LogRecords.Add(logRecord);
|
||||
|
||||
// change log records destination
|
||||
// for nested task
|
||||
task.LogRecords = RootTask.LogRecords;
|
||||
}
|
||||
|
||||
// call event handler
|
||||
CallTaskEventHandler(task, false);
|
||||
|
||||
// push task on the stack
|
||||
TasksStack.Add(task);
|
||||
}
|
||||
|
||||
public static void WriteParameter(string parameterName, object parameterValue)
|
||||
{
|
||||
string val = parameterValue != null ? parameterValue.ToString() : "";
|
||||
WriteLogRecord(0, parameterName + ": " + val, null, null);
|
||||
}
|
||||
|
||||
public static void Write(string text, params string[] textParameters)
|
||||
{
|
||||
// INFO
|
||||
WriteLogRecord(0, text, null, textParameters);
|
||||
}
|
||||
|
||||
public static void WriteWarning(string text, params string[] textParameters)
|
||||
{
|
||||
// WARNING
|
||||
WriteLogRecord(1, text, null, textParameters);
|
||||
}
|
||||
|
||||
public static Exception WriteError(Exception ex)
|
||||
{
|
||||
// ERROR
|
||||
WriteLogRecord(2, ex.Message, ex.StackTrace);
|
||||
return new Exception(String.Format("Error executing '{0}' task on '{1}' {2}",
|
||||
TopTask.TaskName, TopTask.ItemName, TopTask.Source), ex);
|
||||
}
|
||||
|
||||
public static void WriteError(Exception ex, string text, params string[] textParameters)
|
||||
{
|
||||
// ERROR
|
||||
string[] prms = new string[] { ex.Message };
|
||||
if (textParameters != null && textParameters.Length > 0)
|
||||
{
|
||||
prms = new string[textParameters.Length + 1];
|
||||
Array.Copy(textParameters, 0, prms, 1, textParameters.Length);
|
||||
prms[0] = ex.Message;
|
||||
}
|
||||
|
||||
WriteLogRecord(2, text, ex.Message + "\n" + ex.StackTrace, prms);
|
||||
}
|
||||
|
||||
public static void WriteError(string text, params string[] textParameters)
|
||||
{
|
||||
// ERROR
|
||||
WriteLogRecord(2, text, null, textParameters);
|
||||
}
|
||||
|
||||
private static void WriteLogRecord(int severity, string text, string stackTrace, params string[] textParameters)
|
||||
{
|
||||
BackgroundTaskLogRecord logRecord = new BackgroundTaskLogRecord();
|
||||
logRecord.Severity = severity;
|
||||
logRecord.Text = text;
|
||||
logRecord.TextParameters = textParameters;
|
||||
logRecord.TextIdent = TasksStack.Count - 1;
|
||||
logRecord.ExceptionStackTrace = stackTrace;
|
||||
RootTask.LogRecords.Add(logRecord);
|
||||
RootTask.LastLogRecord = logRecord;
|
||||
|
||||
// change entire task severity
|
||||
if (severity > RootTask.Severity)
|
||||
RootTask.Severity = severity;
|
||||
}
|
||||
|
||||
public static void CompleteTask()
|
||||
{
|
||||
if (TasksStack.Count == 0)
|
||||
return;
|
||||
|
||||
// call event handler
|
||||
CallTaskEventHandler(TopTask, true);
|
||||
|
||||
// finish task
|
||||
TopTask.FinishDate = DateTime.Now;
|
||||
TopTask.Completed = true;
|
||||
|
||||
// write task execution result to database
|
||||
if (TasksStack.Count == 1) // single task
|
||||
{
|
||||
// unregister task globally
|
||||
// tasks.Remove(TopTask.TaskId);
|
||||
|
||||
// write to database
|
||||
string itemName = TopTask.ItemName != null ? TopTask.ItemName.ToString() : null;
|
||||
string executionLog = FormatExecutionLog(TopTask);
|
||||
UserInfo user = UserController.GetUserInternally(TopTask.UserId);
|
||||
string username = user != null ? user.Username : null;
|
||||
|
||||
AuditLog.AddAuditLogRecord(TopTask.TaskId, TopTask.Severity, TopTask.UserId,
|
||||
username, TopTask.PackageId, TopTask.ItemId,
|
||||
itemName, TopTask.StartDate, TopTask.FinishDate, TopTask.Source,
|
||||
TopTask.TaskName, executionLog);
|
||||
}
|
||||
|
||||
// remove task from the stack
|
||||
TasksStack.RemoveAt(TasksStack.Count - 1);
|
||||
}
|
||||
|
||||
static string FormatExecutionLog(BackgroundTask task)
|
||||
{
|
||||
StringWriter sw = new StringWriter();
|
||||
XmlWriter writer = new XmlTextWriter(sw);
|
||||
|
||||
writer.WriteStartElement("log");
|
||||
|
||||
// parameters
|
||||
writer.WriteStartElement("parameters");
|
||||
foreach (string name in task.Parameters.Keys)
|
||||
{
|
||||
string val = task.Parameters[name] != null ? task.Parameters[name].ToString() : "";
|
||||
writer.WriteStartElement("parameter");
|
||||
writer.WriteAttributeString("name", name);
|
||||
writer.WriteString(val);
|
||||
writer.WriteEndElement();
|
||||
}
|
||||
writer.WriteEndElement(); // parameters
|
||||
|
||||
// records
|
||||
writer.WriteStartElement("records");
|
||||
foreach (BackgroundTaskLogRecord record in task.LogRecords)
|
||||
{
|
||||
writer.WriteStartElement("record");
|
||||
writer.WriteAttributeString("severity", record.Severity.ToString());
|
||||
writer.WriteAttributeString("date", record.Date.ToString(System.Globalization.CultureInfo.InvariantCulture));
|
||||
writer.WriteAttributeString("ident", record.TextIdent.ToString());
|
||||
|
||||
// text
|
||||
writer.WriteElementString("text", record.Text);
|
||||
|
||||
// text parameters
|
||||
if (record.TextParameters != null && record.TextParameters.Length > 0)
|
||||
{
|
||||
writer.WriteStartElement("textParameters");
|
||||
foreach (string prm in record.TextParameters)
|
||||
{
|
||||
writer.WriteElementString("value", prm);
|
||||
}
|
||||
writer.WriteEndElement(); // textParameters
|
||||
}
|
||||
|
||||
// stack trace
|
||||
writer.WriteElementString("stackTrace", record.ExceptionStackTrace);
|
||||
writer.WriteEndElement();
|
||||
}
|
||||
writer.WriteEndElement();
|
||||
writer.WriteEndElement();
|
||||
|
||||
return sw.ToString();
|
||||
}
|
||||
|
||||
static void PurgeCompletedTasks(object obj)
|
||||
{
|
||||
// remove completed tasks
|
||||
List<string> completedTasks = new List<string>();
|
||||
foreach (BackgroundTask task in tasks.Values)
|
||||
{
|
||||
if (task.MaximumExecutionTime != -1
|
||||
&& ((TimeSpan)(DateTime.Now - task.StartDate)).TotalSeconds > task.MaximumExecutionTime)
|
||||
{
|
||||
// terminate task
|
||||
try
|
||||
{
|
||||
task.TaskThread.Abort();
|
||||
}
|
||||
catch
|
||||
{
|
||||
// nope
|
||||
}
|
||||
|
||||
// add to the list
|
||||
completedTasks.Add(task.TaskId);
|
||||
}
|
||||
|
||||
if ((task.FinishDate != DateTime.MinValue
|
||||
&& ((TimeSpan)(DateTime.Now - task.FinishDate)).TotalMinutes > 2))
|
||||
{
|
||||
// add to the list
|
||||
completedTasks.Add(task.TaskId);
|
||||
}
|
||||
}
|
||||
|
||||
// remove tasks
|
||||
foreach (string taskId in completedTasks)
|
||||
tasks.Remove(taskId);
|
||||
}
|
||||
|
||||
public static int PackageId
|
||||
{
|
||||
get { return TopTask.PackageId; }
|
||||
set { TopTask.PackageId = value; }
|
||||
}
|
||||
|
||||
public static int ItemId
|
||||
{
|
||||
get { return TopTask.ItemId; }
|
||||
set { TopTask.ItemId = value; }
|
||||
}
|
||||
|
||||
public static string ItemName
|
||||
{
|
||||
get { return TopTask.ItemName; }
|
||||
set { TopTask.ItemName = value; }
|
||||
}
|
||||
|
||||
public static string TaskName
|
||||
{
|
||||
get { return TopTask.TaskName; }
|
||||
}
|
||||
|
||||
public static string TaskSource
|
||||
{
|
||||
get { return TopTask.Source; }
|
||||
}
|
||||
|
||||
public static int IndicatorMaximum
|
||||
{
|
||||
get { return TopTask.IndicatorMaximum; }
|
||||
set { TopTask.IndicatorMaximum = value; }
|
||||
}
|
||||
|
||||
public static int IndicatorCurrent
|
||||
{
|
||||
get { return TopTask.IndicatorCurrent; }
|
||||
set { TopTask.IndicatorCurrent = value; }
|
||||
}
|
||||
|
||||
public static int MaximumExecutionTime
|
||||
{
|
||||
get { return TopTask.MaximumExecutionTime; }
|
||||
set { TopTask.MaximumExecutionTime = value; }
|
||||
}
|
||||
|
||||
public static int ScheduleId
|
||||
{
|
||||
get { return TopTask.ScheduleId; }
|
||||
set { TopTask.ScheduleId = value; }
|
||||
}
|
||||
|
||||
public static bool HasErrors
|
||||
{
|
||||
get { return (TopTask.Severity == 2); }
|
||||
}
|
||||
|
||||
public static BackgroundTask GetTask(string taskId)
|
||||
{
|
||||
BackgroundTask task = (BackgroundTask)tasks[taskId];
|
||||
if (task == null)
|
||||
return null;
|
||||
|
||||
task.LastLogRecords.Clear();
|
||||
return task;
|
||||
}
|
||||
|
||||
public static BackgroundTask GetTaskWithLogRecords(string taskId, DateTime startLogTime)
|
||||
{
|
||||
BackgroundTask task = GetTask(taskId);
|
||||
if (task == null)
|
||||
return null;
|
||||
|
||||
// fill log records
|
||||
foreach (BackgroundTaskLogRecord record in task.LogRecords)
|
||||
{
|
||||
if (record.Date >= startLogTime)
|
||||
task.LastLogRecords.Add(record);
|
||||
}
|
||||
|
||||
return task;
|
||||
}
|
||||
|
||||
public static Dictionary<int, BackgroundTask> GetScheduledTasks()
|
||||
{
|
||||
Dictionary<int, BackgroundTask> scheduledTasks = new Dictionary<int, BackgroundTask>();
|
||||
foreach (BackgroundTask task in tasks.Values)
|
||||
{
|
||||
if (task.ScheduleId > 0
|
||||
&& !task.Completed
|
||||
&& !scheduledTasks.ContainsKey(task.ScheduleId))
|
||||
scheduledTasks.Add(task.ScheduleId, task);
|
||||
}
|
||||
return scheduledTasks;
|
||||
}
|
||||
|
||||
public static void SetTaskNotifyOnComplete(string taskId)
|
||||
{
|
||||
BackgroundTask task = (BackgroundTask)tasks[taskId];
|
||||
if (task == null)
|
||||
return;
|
||||
|
||||
task.NotifyOnComplete = true;
|
||||
}
|
||||
|
||||
public static void StopTask(string taskId)
|
||||
{
|
||||
BackgroundTask task = (BackgroundTask)tasks[taskId];
|
||||
if (task == null)
|
||||
return;
|
||||
|
||||
try
|
||||
{
|
||||
task.TaskThread.Abort();
|
||||
}
|
||||
catch
|
||||
{
|
||||
// nope
|
||||
}
|
||||
|
||||
// remove it from stack
|
||||
tasks.Remove(taskId);
|
||||
}
|
||||
|
||||
public static Hashtable TaskParameters
|
||||
{
|
||||
get { return TopTask.Parameters; }
|
||||
}
|
||||
|
||||
internal static int GetTasksNumber()
|
||||
{
|
||||
return tasks.Count;
|
||||
}
|
||||
|
||||
internal static List<BackgroundTask> GetUserTasks(int userId)
|
||||
{
|
||||
List<BackgroundTask> list = new List<BackgroundTask>();
|
||||
|
||||
// try to get user first
|
||||
UserInfo user = UserController.GetUser(userId);
|
||||
if (user == null)
|
||||
return list; // prohibited user
|
||||
|
||||
// get user tasks
|
||||
foreach (BackgroundTask task in tasks.Values)
|
||||
{
|
||||
if(task.EffectiveUserId == userId && !task.Completed)
|
||||
list.Add(task);
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
internal static List<BackgroundTask> GetUserCompletedTasks(int userId)
|
||||
{
|
||||
// get user tasks
|
||||
List<BackgroundTask> list = GetUserTasks(userId);
|
||||
|
||||
// extract completed only
|
||||
List<BackgroundTask> completedTasks = new List<BackgroundTask>();
|
||||
foreach (BackgroundTask task in list)
|
||||
{
|
||||
if (task.Completed && task.NotifyOnComplete)
|
||||
{
|
||||
// add to the list
|
||||
completedTasks.Add(task);
|
||||
|
||||
// remove from hash
|
||||
tasks.Remove(task.TaskId);
|
||||
}
|
||||
}
|
||||
return completedTasks;
|
||||
}
|
||||
|
||||
#region Private Helpers
|
||||
private static void CallTaskEventHandler(BackgroundTask task, bool onComplete)
|
||||
{
|
||||
string[] taskHandlers = GetTaskEventHandlers(task.Source, task.TaskName);
|
||||
if (taskHandlers != null)
|
||||
{
|
||||
foreach(string taskHandler in taskHandlers)
|
||||
{
|
||||
try
|
||||
{
|
||||
Type handlerType = Type.GetType(taskHandler);
|
||||
TaskEventHandler handler = (TaskEventHandler)Activator.CreateInstance(handlerType);
|
||||
|
||||
if (handler != null)
|
||||
{
|
||||
if (onComplete)
|
||||
handler.OnComplete();
|
||||
else
|
||||
handler.OnStart();
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
WriteError(ex, "Error executing task event handler: {0}", ex.Message);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static string[] GetTaskEventHandlers(string source, string taskName)
|
||||
{
|
||||
// load configuration
|
||||
string appRoot = AppDomain.CurrentDomain.BaseDirectory;
|
||||
string path = Path.Combine(appRoot, "TaskEventHandlers.config");
|
||||
|
||||
if (eventHandlers == null)
|
||||
{
|
||||
eventHandlers = Hashtable.Synchronized(new Hashtable());
|
||||
|
||||
// load from XML
|
||||
if (File.Exists(path))
|
||||
{
|
||||
List<XmlDocument> xmlConfigs = new List<XmlDocument>();
|
||||
xmlConfigs.Add(new XmlDocument());
|
||||
xmlConfigs[0].Load(path);
|
||||
// Lookup for external references first
|
||||
XmlNodeList xmlReferences = xmlConfigs[0].SelectNodes("//reference");
|
||||
foreach (XmlElement xmlReference in xmlReferences)
|
||||
{
|
||||
string referencePath = Path.Combine(appRoot, xmlReference.GetAttribute("src"));
|
||||
if (File.Exists(referencePath))
|
||||
{
|
||||
XmlDocument xmldoc = new XmlDocument();
|
||||
xmldoc.Load(referencePath);
|
||||
xmlConfigs.Add(xmldoc);
|
||||
}
|
||||
}
|
||||
|
||||
// parse XML
|
||||
foreach (XmlDocument xml in xmlConfigs)
|
||||
{
|
||||
XmlNodeList xmlHandlers = xml.SelectNodes("//handler");
|
||||
foreach (XmlNode xmlHandler in xmlHandlers)
|
||||
{
|
||||
string keyName = xmlHandler.ParentNode.Attributes["source"].Value
|
||||
+ xmlHandler.ParentNode.Attributes["name"].Value;
|
||||
|
||||
// get handlers collection
|
||||
List<string> taskHandlers = (List<string>)eventHandlers[keyName];
|
||||
if (taskHandlers == null)
|
||||
{
|
||||
taskHandlers = new List<string>();
|
||||
eventHandlers[keyName] = taskHandlers;
|
||||
}
|
||||
|
||||
string handlerType = xmlHandler.Attributes["type"].Value;
|
||||
taskHandlers.Add(handlerType);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
string fullTaskName = source + taskName;
|
||||
List<string> handlersList = (List<string>)eventHandlers[fullTaskName];
|
||||
return handlersList == null ? null : handlersList.ToArray();
|
||||
}
|
||||
#endregion
|
||||
|
||||
|
||||
#region ResultTasks
|
||||
|
||||
public static void CompleteResultTask(ResultObject res, string errorCode, Exception ex, string errorMessage)
|
||||
{
|
||||
if (res != null)
|
||||
{
|
||||
res.IsSuccess = false;
|
||||
|
||||
if (!string.IsNullOrEmpty(errorCode))
|
||||
res.ErrorCodes.Add(errorCode);
|
||||
}
|
||||
|
||||
if (ex != null)
|
||||
TaskManager.WriteError(ex);
|
||||
|
||||
if (!string.IsNullOrEmpty(errorMessage))
|
||||
TaskManager.WriteError(errorMessage);
|
||||
|
||||
//LogRecord.
|
||||
CompleteTask();
|
||||
|
||||
|
||||
}
|
||||
|
||||
public static void CompleteResultTask(ResultObject res, string errorCode, Exception ex)
|
||||
{
|
||||
CompleteResultTask(res, errorCode, ex, null);
|
||||
}
|
||||
|
||||
public static void CompleteResultTask(ResultObject res, string errorCode)
|
||||
{
|
||||
CompleteResultTask(res, errorCode, null, null);
|
||||
}
|
||||
|
||||
public static void CompleteResultTask(ResultObject res)
|
||||
{
|
||||
CompleteResultTask(res, null);
|
||||
}
|
||||
|
||||
public static void CompleteResultTask()
|
||||
{
|
||||
CompleteResultTask(null);
|
||||
}
|
||||
|
||||
public static T StartResultTask<T>(string source, string taskName, Guid taskId) where T : ResultObject, new()
|
||||
{
|
||||
StartTask(taskId.ToString(), source, taskName, null);
|
||||
T res = new T();
|
||||
res.IsSuccess = true;
|
||||
return res;
|
||||
}
|
||||
|
||||
public static T StartResultTask<T>(string source, string taskName) where T : ResultObject, new()
|
||||
{
|
||||
StartTask(source, taskName);
|
||||
T res = new T();
|
||||
res.IsSuccess = true;
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
|
@ -0,0 +1,139 @@
|
|||
// Copyright (c) 2011, 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.Threading;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace WebsitePanel.EnterpriseServer
|
||||
{
|
||||
public class UserAsyncWorker
|
||||
{
|
||||
private int threadUserId = -1;
|
||||
private int userId;
|
||||
private string taskId;
|
||||
private UserInfo user;
|
||||
|
||||
#region Public properties
|
||||
public int ThreadUserId
|
||||
{
|
||||
get { return this.threadUserId; }
|
||||
set { this.threadUserId = value; }
|
||||
}
|
||||
|
||||
public int UserId
|
||||
{
|
||||
get { return this.userId; }
|
||||
set { this.userId = value; }
|
||||
}
|
||||
|
||||
public string TaskId
|
||||
{
|
||||
get { return this.taskId; }
|
||||
set { this.taskId = value; }
|
||||
}
|
||||
|
||||
public UserInfo User
|
||||
{
|
||||
get { return this.user; }
|
||||
set { this.user = value; }
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Update User
|
||||
public void UpdateUserAsync()
|
||||
{
|
||||
// start asynchronously
|
||||
Thread t = new Thread(new ThreadStart(UpdateUser));
|
||||
t.Start();
|
||||
}
|
||||
|
||||
public void UpdateUser()
|
||||
{
|
||||
// impersonate thread
|
||||
if (threadUserId != -1)
|
||||
SecurityContext.SetThreadPrincipal(threadUserId);
|
||||
|
||||
// update
|
||||
UserController.UpdateUser(taskId, user);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Delete User
|
||||
public void DeleteUserAsync()
|
||||
{
|
||||
// start asynchronously
|
||||
Thread t = new Thread(new ThreadStart(DeleteUser));
|
||||
t.Start();
|
||||
}
|
||||
|
||||
public void DeleteUser()
|
||||
{
|
||||
// impersonate thread
|
||||
if (threadUserId != -1)
|
||||
SecurityContext.SetThreadPrincipal(threadUserId);
|
||||
|
||||
// get user details
|
||||
UserInfo user = UserController.GetUserInternally(userId);
|
||||
|
||||
// place log record
|
||||
TaskManager.StartTask(taskId, "USER", "DELETE", user.Username);
|
||||
TaskManager.ItemId = userId;
|
||||
|
||||
try
|
||||
{
|
||||
// delete user packages
|
||||
List<PackageInfo> packages = PackageController.GetMyPackages(userId);
|
||||
|
||||
// delete user packages synchronously
|
||||
if (packages.Count > 0)
|
||||
{
|
||||
PackageAsyncWorker packageWorker = new PackageAsyncWorker();
|
||||
packageWorker.UserId = SecurityContext.User.UserId;
|
||||
packageWorker.Packages = packages;
|
||||
|
||||
// invoke worker
|
||||
packageWorker.DeletePackagesServiceItems();
|
||||
}
|
||||
|
||||
// delete user from database
|
||||
DataProvider.DeleteUser(SecurityContext.User.UserId, userId);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw TaskManager.WriteError(ex);
|
||||
}
|
||||
finally
|
||||
{
|
||||
TaskManager.CompleteTask();
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
|
@ -0,0 +1,788 @@
|
|||
// Copyright (c) 2011, 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.Data;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Xml;
|
||||
using System.Net.Mail;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Xml.Linq;
|
||||
|
||||
namespace WebsitePanel.EnterpriseServer
|
||||
{
|
||||
/// <summary>
|
||||
/// Summary description for UserController.
|
||||
/// </summary>
|
||||
public class UserController
|
||||
{
|
||||
public static bool UserExists(string username)
|
||||
{
|
||||
// try to get user from database
|
||||
UserInfo user = GetUserInternally(username);
|
||||
return (user != null);
|
||||
}
|
||||
|
||||
public static int AuthenticateUser(string username, string password, string ip)
|
||||
{
|
||||
// start task
|
||||
TaskManager.StartTask("USER", "AUTHENTICATE", username);
|
||||
TaskManager.WriteParameter("IP", ip);
|
||||
|
||||
try
|
||||
{
|
||||
// try to get user from database
|
||||
UserInfo user = GetUserInternally(username);
|
||||
|
||||
// check if the user exists
|
||||
if (user == null)
|
||||
{
|
||||
TaskManager.WriteWarning("Wrong username");
|
||||
return BusinessErrorCodes.ERROR_USER_WRONG_USERNAME;
|
||||
}
|
||||
|
||||
// compare user passwords
|
||||
if (user.Password != password)
|
||||
{
|
||||
TaskManager.WriteWarning("Wrong password");
|
||||
return BusinessErrorCodes.ERROR_USER_WRONG_PASSWORD;
|
||||
}
|
||||
|
||||
// check status
|
||||
if (user.Status == UserStatus.Cancelled)
|
||||
{
|
||||
TaskManager.WriteWarning("Account cancelled");
|
||||
return BusinessErrorCodes.ERROR_USER_ACCOUNT_CANCELLED;
|
||||
}
|
||||
|
||||
if (user.Status == UserStatus.Pending)
|
||||
{
|
||||
TaskManager.WriteWarning("Account pending");
|
||||
return BusinessErrorCodes.ERROR_USER_ACCOUNT_PENDING;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw TaskManager.WriteError(ex);
|
||||
}
|
||||
finally
|
||||
{
|
||||
TaskManager.CompleteTask();
|
||||
}
|
||||
}
|
||||
|
||||
public static UserInfo GetUserByUsernamePassword(string username, string password, string ip)
|
||||
{
|
||||
// place log record
|
||||
TaskManager.StartTask("USER", "GET_BY_USERNAME_PASSWORD", username);
|
||||
TaskManager.WriteParameter("IP", ip);
|
||||
|
||||
try
|
||||
{
|
||||
// try to get user from database
|
||||
UserInfo user = GetUserInternally(username);
|
||||
|
||||
// check if the user exists
|
||||
if (user == null)
|
||||
{
|
||||
TaskManager.WriteWarning("Account not found");
|
||||
return null;
|
||||
}
|
||||
|
||||
// compare user passwords
|
||||
if (user.Password == password)
|
||||
return user;
|
||||
|
||||
return null;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw TaskManager.WriteError(ex);
|
||||
}
|
||||
finally
|
||||
{
|
||||
TaskManager.CompleteTask();
|
||||
}
|
||||
}
|
||||
|
||||
public static int ChangeUserPassword(string username, string oldPassword, string newPassword, string ip)
|
||||
{
|
||||
// place log record
|
||||
TaskManager.StartTask("USER", "CHANGE_PASSWORD_BY_USERNAME_PASSWORD", username);
|
||||
TaskManager.WriteParameter("IP", ip);
|
||||
|
||||
try
|
||||
{
|
||||
UserInfo user = GetUserByUsernamePassword(username, oldPassword, ip);
|
||||
if (user == null)
|
||||
{
|
||||
TaskManager.WriteWarning("Account not found");
|
||||
return BusinessErrorCodes.ERROR_USER_NOT_FOUND;
|
||||
}
|
||||
|
||||
// change password
|
||||
DataProvider.ChangeUserPassword(-1, user.UserId,
|
||||
CryptoUtils.Encrypt(newPassword));
|
||||
|
||||
return 0;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw TaskManager.WriteError(ex);
|
||||
}
|
||||
finally
|
||||
{
|
||||
TaskManager.CompleteTask();
|
||||
}
|
||||
}
|
||||
|
||||
public static int SendPasswordReminder(string username, string ip)
|
||||
{
|
||||
// place log record
|
||||
TaskManager.StartTask("USER", "SEND_REMINDER", username);
|
||||
TaskManager.WriteParameter("IP", ip);
|
||||
|
||||
try
|
||||
{
|
||||
// try to get user from database
|
||||
UserInfo user = GetUserInternally(username);
|
||||
if (user == null)
|
||||
{
|
||||
TaskManager.WriteWarning("Account not found");
|
||||
// Fix for item #273 (NGS-9)
|
||||
//return BusinessErrorCodes.ERROR_USER_NOT_FOUND;
|
||||
return 0;
|
||||
}
|
||||
|
||||
UserSettings settings = UserController.GetUserSettings(user.UserId, UserSettings.PASSWORD_REMINDER_LETTER);
|
||||
string from = settings["From"];
|
||||
string cc = settings["CC"];
|
||||
string subject = settings["Subject"];
|
||||
string body = user.HtmlMail ? settings["HtmlBody"] : settings["TextBody"];
|
||||
bool isHtml = user.HtmlMail;
|
||||
|
||||
MailPriority priority = MailPriority.Normal;
|
||||
if (!String.IsNullOrEmpty(settings["Priority"]))
|
||||
priority = (MailPriority)Enum.Parse(typeof(MailPriority), settings["Priority"], true);
|
||||
|
||||
if (body == null || body == "")
|
||||
return BusinessErrorCodes.ERROR_SETTINGS_PASSWORD_LETTER_EMPTY_BODY;
|
||||
|
||||
// set template context items
|
||||
Hashtable items = new Hashtable();
|
||||
items["user"] = user;
|
||||
items["Email"] = true;
|
||||
|
||||
// get reseller details
|
||||
UserInfo reseller = UserController.GetUser(user.OwnerId);
|
||||
if (reseller != null)
|
||||
{
|
||||
reseller.Password = "";
|
||||
items["reseller"] = reseller;
|
||||
}
|
||||
|
||||
subject = PackageController.EvaluateTemplate(subject, items);
|
||||
body = PackageController.EvaluateTemplate(body, items);
|
||||
|
||||
// send message
|
||||
MailHelper.SendMessage(from, user.Email, cc, subject, body, priority, isHtml);
|
||||
|
||||
return 0;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw TaskManager.WriteError(ex);
|
||||
}
|
||||
finally
|
||||
{
|
||||
TaskManager.CompleteTask();
|
||||
}
|
||||
}
|
||||
|
||||
internal static UserInfo GetUserInternally(int userId)
|
||||
{
|
||||
// try to get user from database
|
||||
UserInfo user = ObjectUtils.FillObjectFromDataReader<UserInfo>(
|
||||
DataProvider.GetUserByIdInternally(userId));
|
||||
|
||||
if (user != null)
|
||||
user.Password = CryptoUtils.Decrypt(user.Password);
|
||||
return user;
|
||||
}
|
||||
|
||||
internal static UserInfo GetUserInternally(string username)
|
||||
{
|
||||
// try to get user from database
|
||||
UserInfo user = ObjectUtils.FillObjectFromDataReader<UserInfo>(
|
||||
DataProvider.GetUserByUsernameInternally(username));
|
||||
|
||||
if (user != null)
|
||||
{
|
||||
user.Password = CryptoUtils.Decrypt(user.Password);
|
||||
}
|
||||
return user;
|
||||
}
|
||||
|
||||
public static UserInfo GetUser(int userId)
|
||||
{
|
||||
// try to get user from database
|
||||
UserInfo user = ObjectUtils.FillObjectFromDataReader<UserInfo>(
|
||||
DataProvider.GetUserById(SecurityContext.User.UserId, userId));
|
||||
|
||||
if (user != null)
|
||||
user.Password = CryptoUtils.Decrypt(user.Password);
|
||||
return user;
|
||||
}
|
||||
|
||||
public static UserInfo GetUser(string username)
|
||||
{
|
||||
// try to get user from database
|
||||
UserInfo user = ObjectUtils.FillObjectFromDataReader<UserInfo>(
|
||||
DataProvider.GetUserByUsername(SecurityContext.User.UserId, username));
|
||||
|
||||
if (user != null)
|
||||
user.Password = CryptoUtils.Decrypt(user.Password);
|
||||
return user;
|
||||
}
|
||||
|
||||
public static List<UserInfo> GetUserParents(int userId)
|
||||
{
|
||||
// get users from database
|
||||
DataSet dsUsers = DataProvider.GetUserParents(SecurityContext.User.UserId, userId);
|
||||
|
||||
// convert to arraylist
|
||||
List<UserInfo> users = new List<UserInfo>();
|
||||
ObjectUtils.FillCollectionFromDataSet<UserInfo>(users, dsUsers);
|
||||
return users;
|
||||
}
|
||||
|
||||
public static List<UserInfo> GetUsers(int userId, bool recursive)
|
||||
{
|
||||
// get users from database
|
||||
DataSet dsUsers = DataProvider.GetUsers(SecurityContext.User.UserId, userId, recursive);
|
||||
|
||||
// convert to arraylist
|
||||
List<UserInfo> users = new List<UserInfo>();
|
||||
ObjectUtils.FillCollectionFromDataSet<UserInfo>(users, dsUsers);
|
||||
return users;
|
||||
}
|
||||
|
||||
public static DataSet GetUsersPaged(int userId, string filterColumn, string filterValue,
|
||||
int statusId, int roleId,
|
||||
string sortColumn, int startRow, int maximumRows)
|
||||
{
|
||||
// get users from database
|
||||
return DataProvider.GetUsersPaged(SecurityContext.User.UserId, userId,
|
||||
filterColumn, filterValue, statusId, roleId, sortColumn, startRow, maximumRows, false);
|
||||
}
|
||||
|
||||
public static DataSet GetUsersPagedRecursive(int userId, string filterColumn, string filterValue,
|
||||
int statusId, int roleId,
|
||||
string sortColumn, int startRow, int maximumRows)
|
||||
{
|
||||
// get users from database
|
||||
return DataProvider.GetUsersPaged(SecurityContext.User.UserId, userId,
|
||||
filterColumn, filterValue, statusId, roleId, sortColumn, startRow, maximumRows, true);
|
||||
}
|
||||
|
||||
public static DataSet GetUsersSummary(int userId)
|
||||
{
|
||||
return DataProvider.GetUsersSummary(SecurityContext.User.UserId, userId);
|
||||
}
|
||||
|
||||
public static DataSet GetUserDomainsPaged(int userId, string filterColumn, string filterValue,
|
||||
string sortColumn, int startRow, int maximumRows)
|
||||
{
|
||||
// get users from database
|
||||
return DataProvider.GetUserDomainsPaged(SecurityContext.User.UserId, userId,
|
||||
filterColumn, filterValue, sortColumn, startRow, maximumRows);
|
||||
}
|
||||
|
||||
public static List<UserInfo> GetUserPeers(int userId)
|
||||
{
|
||||
// get user peers from database
|
||||
return ObjectUtils.CreateListFromDataSet<UserInfo>(GetRawUserPeers(userId));
|
||||
}
|
||||
|
||||
public static DataSet GetRawUserPeers(int userId)
|
||||
{
|
||||
// get user peers from database
|
||||
return DataProvider.GetUserPeers(SecurityContext.User.UserId, userId);
|
||||
}
|
||||
|
||||
public static DataSet GetRawUsers(int ownerId, bool recursive)
|
||||
{
|
||||
// get users from database
|
||||
return DataProvider.GetUsers(SecurityContext.User.UserId, ownerId, recursive);
|
||||
}
|
||||
|
||||
public static int AddUser(UserInfo user, bool sendLetter)
|
||||
{
|
||||
// check account
|
||||
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo);
|
||||
if (accountCheck < 0) return accountCheck;
|
||||
|
||||
string pattern = @"[\\/:*?<>|""]+";
|
||||
|
||||
if (String.IsNullOrEmpty(user.Username))
|
||||
return BusinessErrorCodes.ERROR_INVALID_USER_NAME;
|
||||
|
||||
if (Regex.IsMatch(user.Username, pattern))
|
||||
return BusinessErrorCodes.ERROR_INVALID_USER_NAME;
|
||||
|
||||
if (UserExists(user.Username))
|
||||
return BusinessErrorCodes.ERROR_USER_ALREADY_EXISTS;
|
||||
|
||||
// only administrators can set admin role
|
||||
if (!SecurityContext.User.IsInRole(SecurityContext.ROLE_ADMINISTRATOR) &&
|
||||
user.Role == UserRole.Administrator)
|
||||
user.Role = UserRole.User;
|
||||
|
||||
// check integrity when creating a user account
|
||||
if (user.Role == UserRole.User)
|
||||
user.EcommerceEnabled = false;
|
||||
|
||||
// place log record
|
||||
TaskManager.StartTask("USER", "ADD", user.Username);
|
||||
|
||||
try
|
||||
{
|
||||
// add user to database
|
||||
int userId = DataProvider.AddUser(
|
||||
SecurityContext.User.UserId,
|
||||
user.OwnerId,
|
||||
user.RoleId,
|
||||
user.StatusId,
|
||||
user.IsDemo,
|
||||
user.IsPeer,
|
||||
user.Comments,
|
||||
user.Username.Trim(),
|
||||
CryptoUtils.Encrypt(user.Password),
|
||||
user.FirstName,
|
||||
user.LastName,
|
||||
user.Email,
|
||||
user.SecondaryEmail,
|
||||
user.Address,
|
||||
user.City,
|
||||
user.Country,
|
||||
user.State,
|
||||
user.Zip,
|
||||
user.PrimaryPhone,
|
||||
user.SecondaryPhone,
|
||||
user.Fax,
|
||||
user.InstantMessenger,
|
||||
user.HtmlMail,
|
||||
user.CompanyName,
|
||||
user.EcommerceEnabled);
|
||||
|
||||
if (userId == -1)
|
||||
{
|
||||
TaskManager.WriteWarning("Account with such username already exists");
|
||||
return BusinessErrorCodes.ERROR_USER_ALREADY_EXISTS;
|
||||
}
|
||||
|
||||
TaskManager.ItemId = userId;
|
||||
TaskManager.TaskParameters["SendLetter"] = sendLetter;
|
||||
|
||||
return userId;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw TaskManager.WriteError(ex);
|
||||
}
|
||||
finally
|
||||
{
|
||||
TaskManager.CompleteTask();
|
||||
}
|
||||
}
|
||||
|
||||
const string userAdditionalParamsTemplate = @"<Params><VLans/></Params>";
|
||||
|
||||
public static void AddUserVLan(int userId, UserVlan vLan)
|
||||
{
|
||||
UserInfo user = GetUser(userId);
|
||||
//
|
||||
if (user == null)
|
||||
throw new ApplicationException(String.Format("User with UserID={0} not found", userId));
|
||||
|
||||
XDocument doc = XDocument.Parse(user.AdditionalParams ?? userAdditionalParamsTemplate);
|
||||
XElement vlans = doc.Root.Element("VLans");
|
||||
vlans.Add(new XElement("VLan", new XAttribute("VLanID", vLan.VLanID), new XAttribute("Comment", vLan.Comment)));
|
||||
|
||||
user.AdditionalParams = doc.ToString();
|
||||
UpdateUser(user);
|
||||
}
|
||||
|
||||
public static void DeleteUserVLan(int userId, ushort vLanId)
|
||||
{
|
||||
UserInfo user = GetUser(userId);
|
||||
//
|
||||
if (user == null)
|
||||
throw new ApplicationException(String.Format("User with UserID={0} not found", userId));
|
||||
|
||||
XDocument doc = XDocument.Parse(user.AdditionalParams ?? userAdditionalParamsTemplate);
|
||||
XElement vlans = doc.Root.Element("VLans");
|
||||
if (vlans != null)
|
||||
foreach (XElement element in vlans.Elements("VLan"))
|
||||
if (ushort.Parse(element.Attribute("VLanID").Value) == vLanId)
|
||||
element.Remove();
|
||||
|
||||
user.AdditionalParams = doc.ToString();
|
||||
UpdateUser(user);
|
||||
}
|
||||
|
||||
public static int UpdateUser(UserInfo user)
|
||||
{
|
||||
return UpdateUser(null, user);
|
||||
}
|
||||
|
||||
public static int UpdateUserAsync(string taskId, UserInfo user)
|
||||
{
|
||||
UserAsyncWorker usersWorker = new UserAsyncWorker();
|
||||
usersWorker.ThreadUserId = SecurityContext.User.UserId;
|
||||
usersWorker.TaskId = taskId;
|
||||
usersWorker.User = user;
|
||||
usersWorker.UpdateUserAsync();
|
||||
return 0;
|
||||
}
|
||||
|
||||
public static int UpdateUser(string taskId, UserInfo user)
|
||||
{
|
||||
try
|
||||
{
|
||||
// start task
|
||||
TaskManager.StartTask(taskId, "USER", "UPDATE", user.Username);
|
||||
TaskManager.ItemId = user.UserId;
|
||||
|
||||
// check account
|
||||
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo);
|
||||
if (accountCheck < 0) return accountCheck;
|
||||
|
||||
UserInfo currentUser = GetUser(user.UserId);
|
||||
|
||||
//prevent downgrade reseller with child accounts to user role
|
||||
if (currentUser.RoleId.Equals(2))
|
||||
{
|
||||
if (user.RoleId.Equals(3))
|
||||
{
|
||||
// check if user has child accounts (It happens when Reseller has child accounts and admin changes his role to User)
|
||||
if (GetUsers(currentUser.UserId, false).Count > 0)
|
||||
return BusinessErrorCodes.ERROR_USER_HAS_USERS;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// only administrators can set admin role
|
||||
if (!SecurityContext.User.IsInRole(SecurityContext.ROLE_ADMINISTRATOR) &&
|
||||
user.Role == UserRole.Administrator)
|
||||
user.Role = UserRole.User;
|
||||
|
||||
// check integrity when creating a user account
|
||||
if (user.Role == UserRole.User)
|
||||
user.EcommerceEnabled = false;
|
||||
|
||||
//// task progress
|
||||
//int maxSteps = 100;
|
||||
//TaskManager.IndicatorMaximum = maxSteps;
|
||||
//for (int i = 0; i < maxSteps; i++)
|
||||
//{
|
||||
// TaskManager.Write(String.Format("Step {0} of {1}", i, maxSteps));
|
||||
// TaskManager.IndicatorCurrent = i;
|
||||
// System.Threading.Thread.Sleep(1000);
|
||||
//}
|
||||
|
||||
DataProvider.UpdateUser(
|
||||
SecurityContext.User.UserId,
|
||||
user.UserId,
|
||||
user.RoleId,
|
||||
user.StatusId,
|
||||
user.IsDemo,
|
||||
user.IsPeer,
|
||||
user.Comments,
|
||||
user.FirstName,
|
||||
user.LastName,
|
||||
user.Email,
|
||||
user.SecondaryEmail,
|
||||
user.Address,
|
||||
user.City,
|
||||
user.Country,
|
||||
user.State,
|
||||
user.Zip,
|
||||
user.PrimaryPhone,
|
||||
user.SecondaryPhone,
|
||||
user.Fax,
|
||||
user.InstantMessenger,
|
||||
user.HtmlMail,
|
||||
user.CompanyName,
|
||||
user.EcommerceEnabled,
|
||||
user.AdditionalParams);
|
||||
|
||||
return 0;
|
||||
}
|
||||
catch (System.Threading.ThreadAbortException ex)
|
||||
{
|
||||
TaskManager.WriteError(ex, "The process has been terminated by the user.");
|
||||
return 0;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw TaskManager.WriteError(ex);
|
||||
}
|
||||
finally
|
||||
{
|
||||
TaskManager.CompleteTask();
|
||||
}
|
||||
}
|
||||
|
||||
public static int DeleteUser(int userId)
|
||||
{
|
||||
return DeleteUser(null, userId);
|
||||
}
|
||||
|
||||
public static int DeleteUser(string taskId, int userId)
|
||||
{
|
||||
// check account
|
||||
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo);
|
||||
if (accountCheck < 0) return accountCheck;
|
||||
|
||||
// check if user has child accounts
|
||||
if (GetUsers(userId, false).Count > 0)
|
||||
return BusinessErrorCodes.ERROR_USER_HAS_USERS;
|
||||
|
||||
UserAsyncWorker userWorker = new UserAsyncWorker();
|
||||
userWorker.ThreadUserId = SecurityContext.User.UserId;
|
||||
userWorker.UserId = userId;
|
||||
userWorker.TaskId = taskId;
|
||||
userWorker.DeleteUserAsync();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
public static int ChangeUserPassword(int userId, string password)
|
||||
{
|
||||
// check account
|
||||
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo);
|
||||
if (accountCheck < 0) return accountCheck;
|
||||
|
||||
// get user details
|
||||
UserInfo user = GetUserInternally(userId);
|
||||
|
||||
// place log record
|
||||
TaskManager.StartTask("USER", "CHANGE_PASSWORD", user.Username);
|
||||
TaskManager.ItemId = user.UserId;
|
||||
|
||||
try
|
||||
{
|
||||
|
||||
DataProvider.ChangeUserPassword(SecurityContext.User.UserId, userId,
|
||||
CryptoUtils.Encrypt(password));
|
||||
|
||||
return 0;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw TaskManager.WriteError(ex);
|
||||
}
|
||||
finally
|
||||
{
|
||||
TaskManager.CompleteTask();
|
||||
}
|
||||
}
|
||||
|
||||
public static int ChangeUserStatus(int userId, UserStatus status)
|
||||
{
|
||||
return ChangeUserStatus(null, userId, status);
|
||||
}
|
||||
|
||||
public static int ChangeUserStatus(string taskId, int userId, UserStatus status)
|
||||
{
|
||||
// check account
|
||||
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo);
|
||||
if (accountCheck < 0) return accountCheck;
|
||||
|
||||
int result = 0;
|
||||
|
||||
// get user details
|
||||
UserInfo user = GetUserInternally(userId);
|
||||
|
||||
// place log record
|
||||
TaskManager.StartTask(taskId, "USER", "CHANGE_STATUS", user.Username);
|
||||
TaskManager.ItemId = user.UserId;
|
||||
|
||||
try
|
||||
{
|
||||
|
||||
// change this account
|
||||
result = ChangeUserStatusInternal(userId, status);
|
||||
if (result < 0)
|
||||
return result;
|
||||
|
||||
// change peer accounts
|
||||
List<UserInfo> peers = GetUserPeers(userId);
|
||||
foreach (UserInfo peer in peers)
|
||||
{
|
||||
result = ChangeUserStatusInternal(peer.UserId, status);
|
||||
if (result < 0)
|
||||
return result;
|
||||
}
|
||||
|
||||
// change child accounts
|
||||
List<UserInfo> children = GetUsers(userId, true);
|
||||
foreach (UserInfo child in children)
|
||||
{
|
||||
result = ChangeUserStatusInternal(child.UserId, status);
|
||||
if (result < 0)
|
||||
return result;
|
||||
}
|
||||
|
||||
// update user packages
|
||||
List<PackageInfo> packages = new List<PackageInfo>();
|
||||
|
||||
// his packages
|
||||
packages.AddRange(PackageController.GetMyPackages(userId));
|
||||
|
||||
// children packages
|
||||
packages.AddRange(PackageController.GetPackages(userId));
|
||||
|
||||
PackageStatus packageStatus = PackageStatus.Active;
|
||||
switch (status)
|
||||
{
|
||||
case UserStatus.Active: packageStatus = PackageStatus.Active; break;
|
||||
case UserStatus.Cancelled: packageStatus = PackageStatus.Cancelled; break;
|
||||
case UserStatus.Pending: packageStatus = PackageStatus.New; break;
|
||||
case UserStatus.Suspended: packageStatus = PackageStatus.Suspended; break;
|
||||
}
|
||||
|
||||
// change packages state
|
||||
result = PackageController.ChangePackagesStatus(packages, packageStatus, true);
|
||||
if (result < 0)
|
||||
return result;
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw TaskManager.WriteError(ex);
|
||||
}
|
||||
finally
|
||||
{
|
||||
TaskManager.CompleteTask();
|
||||
}
|
||||
}
|
||||
|
||||
private static int ChangeUserStatusInternal(int userId, UserStatus status)
|
||||
{
|
||||
// get user details
|
||||
UserInfo user = GetUser(userId);
|
||||
if (user != null && user.Status != status)
|
||||
{
|
||||
// change status
|
||||
user.Status = status;
|
||||
|
||||
// save user
|
||||
UpdateUser(user);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
#region User Settings
|
||||
public static UserSettings GetUserSettings(int userId, string settingsName)
|
||||
{
|
||||
IDataReader reader = DataProvider.GetUserSettings(
|
||||
SecurityContext.User.UserId, userId, settingsName);
|
||||
|
||||
UserSettings settings = new UserSettings();
|
||||
settings.UserId = userId;
|
||||
settings.SettingsName = settingsName;
|
||||
|
||||
while (reader.Read())
|
||||
{
|
||||
settings.UserId = (int)reader["UserID"];
|
||||
settings[(string)reader["PropertyName"]] = (string)reader["PropertyValue"];
|
||||
}
|
||||
reader.Close();
|
||||
|
||||
return settings;
|
||||
}
|
||||
|
||||
public static int UpdateUserSettings(UserSettings settings)
|
||||
{
|
||||
// check account
|
||||
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo);
|
||||
if (accountCheck < 0) return accountCheck;
|
||||
|
||||
// get user details
|
||||
UserInfo user = GetUserInternally(settings.UserId);
|
||||
|
||||
// place log record
|
||||
TaskManager.StartTask("USER", "UPDATE_SETTINGS", user.Username);
|
||||
TaskManager.ItemId = user.UserId;
|
||||
|
||||
try
|
||||
{
|
||||
// build xml
|
||||
XmlDocument doc = new XmlDocument();
|
||||
XmlElement nodeProps = doc.CreateElement("properties");
|
||||
if (settings.SettingsArray != null)
|
||||
{
|
||||
foreach (string[] pair in settings.SettingsArray)
|
||||
{
|
||||
XmlElement nodeProp = doc.CreateElement("property");
|
||||
nodeProp.SetAttribute("name", pair[0]);
|
||||
nodeProp.SetAttribute("value", pair[1]);
|
||||
nodeProps.AppendChild(nodeProp);
|
||||
}
|
||||
}
|
||||
|
||||
string xml = nodeProps.OuterXml;
|
||||
|
||||
// update settings
|
||||
DataProvider.UpdateUserSettings(SecurityContext.User.UserId,
|
||||
settings.UserId, settings.SettingsName, xml);
|
||||
|
||||
return 0;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw TaskManager.WriteError(ex);
|
||||
}
|
||||
finally
|
||||
{
|
||||
TaskManager.CompleteTask();
|
||||
}
|
||||
}
|
||||
|
||||
#endregion
|
||||
}
|
||||
}
|
|
@ -0,0 +1,85 @@
|
|||
// Copyright (c) 2011, 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.Web;
|
||||
using System.Threading;
|
||||
|
||||
using WebsitePanel.Providers.Virtualization;
|
||||
|
||||
namespace WebsitePanel.EnterpriseServer
|
||||
{
|
||||
public class CreateServerAsyncWorker
|
||||
{
|
||||
#region Properties
|
||||
public int ThreadUserId { get; set; }
|
||||
public string TaskId { get; set; }
|
||||
|
||||
public VirtualMachine Item { get; set; }
|
||||
public LibraryItem OsTemplate { get; set; }
|
||||
|
||||
public int ExternalAddressesNumber { get; set; }
|
||||
public bool RandomExternalAddresses { get; set; }
|
||||
public int[] ExternalAddresses { get; set; }
|
||||
|
||||
public int PrivateAddressesNumber { get; set; }
|
||||
public bool RandomPrivateAddresses { get; set; }
|
||||
public string[] PrivateAddresses { get; set; }
|
||||
|
||||
public string SummaryLetterEmail { get; set; }
|
||||
#endregion
|
||||
|
||||
public CreateServerAsyncWorker()
|
||||
{
|
||||
ThreadUserId = -1; // admin
|
||||
}
|
||||
|
||||
#region Create
|
||||
public void CreateAsync()
|
||||
{
|
||||
// start asynchronously
|
||||
Thread t = new Thread(new ThreadStart(Create));
|
||||
t.Start();
|
||||
}
|
||||
|
||||
private void Create()
|
||||
{
|
||||
// impersonate thread
|
||||
if (ThreadUserId != -1)
|
||||
SecurityContext.SetThreadPrincipal(ThreadUserId);
|
||||
|
||||
// perform backup
|
||||
VirtualizationServerController.CreateVirtualMachineInternal(TaskId, Item, OsTemplate,
|
||||
ExternalAddressesNumber, RandomExternalAddresses, ExternalAddresses,
|
||||
PrivateAddressesNumber, RandomPrivateAddresses, PrivateAddresses,
|
||||
SummaryLetterEmail);
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
}
|
File diff suppressed because it is too large
Load diff
|
@ -0,0 +1,113 @@
|
|||
//using System;
|
||||
//using System.Collections.Generic;
|
||||
//using System.Web;
|
||||
//using System.Threading;
|
||||
//using System.ComponentModel;
|
||||
//using WebsitePanel.Providers;
|
||||
//using WebsitePanel.Providers.Common;
|
||||
//using WebsitePanel.Providers.ResultObjects;
|
||||
//using WebsitePanel.Providers.Virtualization;
|
||||
//using WebsitePanel.Providers.VirtualizationForPC;
|
||||
|
||||
//namespace WebsitePanel.EnterpriseServer
|
||||
//{
|
||||
// public class CreateAsyncVMfromVM
|
||||
// {
|
||||
// public static void Run(string sourceVM, VMInfo vmInfo)
|
||||
// {
|
||||
// BackgroundWorker createVMBackground = new BackgroundWorker();
|
||||
// ResultObject taskInfo = null;
|
||||
|
||||
// object[] parameters = { sourceVM, vmInfo };
|
||||
|
||||
// createVMBackground.DoWork += (sender, e) => {
|
||||
// string sourceVMName = (string)((object[])e.Argument)[0];
|
||||
// VMInfo vm = (VMInfo)((object[])e.Argument)[1];
|
||||
|
||||
// e.Result = vm;
|
||||
// Guid taskGuid = Guid.NewGuid();
|
||||
// // Add audit log
|
||||
// taskInfo = TaskManager.StartResultTask<ResultObject>("VPSForPC", "CREATE", taskGuid);
|
||||
// TaskManager.ItemId = vm.Id;
|
||||
// TaskManager.ItemName = vm.Name;
|
||||
// TaskManager.PackageId = vm.PackageId;
|
||||
// e.Result = CreateVM(sourceVMName, vm, taskGuid);
|
||||
// };
|
||||
|
||||
// createVMBackground.RunWorkerCompleted += (sender, e) => {
|
||||
// if (e.Error != null || !String.IsNullOrEmpty(((VMInfo)e.Result).exMessage) )
|
||||
// {
|
||||
// if (taskInfo != null)
|
||||
// {
|
||||
// TaskManager.CompleteResultTask(taskInfo
|
||||
// , VirtualizationErrorCodes.CREATE_ERROR
|
||||
// , new Exception(((VMInfo)e.Result).exMessage)
|
||||
// , ((VMInfo)e.Result).logMessage);
|
||||
// }
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// if (taskInfo != null)
|
||||
// {
|
||||
// TaskManager.CompleteResultTask(taskInfo, null, null, ((VMInfo)e.Result).logMessage);
|
||||
// }
|
||||
|
||||
// PackageController.UpdatePackageItem((VMInfo)e.Result);
|
||||
// }
|
||||
// };
|
||||
|
||||
// createVMBackground.RunWorkerAsync(parameters);
|
||||
// }
|
||||
|
||||
// private static VMInfo CreateVM(string sourceVMName, VMInfo vmInfo, Guid taskGuid)
|
||||
// {
|
||||
// VirtualizationServerForPC ws = new VirtualizationServerForPC();
|
||||
// ServiceProviderProxy.Init(ws, vmInfo.ServiceId);
|
||||
|
||||
// vmInfo = ws.CreateVMFromVM(sourceVMName, vmInfo, taskGuid);
|
||||
|
||||
// return vmInfo;
|
||||
// }
|
||||
// }
|
||||
//}
|
||||
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Web;
|
||||
using System.Threading;
|
||||
using WebsitePanel.Providers.Virtualization;
|
||||
using WebsitePanel.Providers.VirtualizationForPC;
|
||||
|
||||
namespace WebsitePanel.EnterpriseServer
|
||||
{
|
||||
public class CreateVMFromVMAsyncWorker
|
||||
{
|
||||
public int ThreadUserId { get; set; }
|
||||
public VMInfo vmTemplate {get; set; }
|
||||
public string vmName { get; set; }
|
||||
public int packageId { get; set; }
|
||||
|
||||
public CreateVMFromVMAsyncWorker()
|
||||
{
|
||||
ThreadUserId = -1; // admin
|
||||
}
|
||||
|
||||
public void CreateAsync()
|
||||
{
|
||||
// start asynchronously
|
||||
Thread t = new Thread(new ThreadStart(Create));
|
||||
t.Start();
|
||||
}
|
||||
|
||||
private void Create()
|
||||
{
|
||||
// impersonate thread
|
||||
if (ThreadUserId != -1)
|
||||
SecurityContext.SetThreadPrincipal(ThreadUserId);
|
||||
|
||||
// perform backup
|
||||
VirtualizationServerControllerForPrivateCloud.CreateVMFromVMAsunc(packageId, vmTemplate, vmName);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -0,0 +1,65 @@
|
|||
// Copyright (c) 2011, 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.Web;
|
||||
using System.Threading;
|
||||
using WebsitePanel.Providers.Virtualization;
|
||||
using WebsitePanel.Providers.VirtualizationForPC;
|
||||
|
||||
namespace WebsitePanel.EnterpriseServer
|
||||
{
|
||||
public class CreateVMAsyncWorker
|
||||
{
|
||||
public int ThreadUserId { get; set; }
|
||||
public VMInfo vmTemplate { get; set; }
|
||||
|
||||
public CreateVMAsyncWorker()
|
||||
{
|
||||
ThreadUserId = -1; // admin
|
||||
}
|
||||
|
||||
public void CreateAsync()
|
||||
{
|
||||
// start asynchronously
|
||||
Thread t = new Thread(new ThreadStart(Create));
|
||||
t.Start();
|
||||
}
|
||||
|
||||
private void Create()
|
||||
{
|
||||
// impersonate thread
|
||||
if (ThreadUserId != -1)
|
||||
SecurityContext.SetThreadPrincipal(ThreadUserId);
|
||||
|
||||
// perform backup
|
||||
VirtualizationServerControllerForPrivateCloud.CreateVirtualMachineAsunc(vmTemplate);
|
||||
}
|
||||
}
|
||||
}
|
File diff suppressed because it is too large
Load diff
|
@ -0,0 +1,920 @@
|
|||
// Copyright (c) 2011, 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.Threading;
|
||||
using WebsitePanel.Providers.Web;
|
||||
using WebsitePanel.Providers.ResultObjects;
|
||||
using WebsitePanel.Providers.Database;
|
||||
using WebsitePanel.Providers.WebAppGallery;
|
||||
using System.Collections.Specialized;
|
||||
using System.Reflection;
|
||||
using WebsitePanel.Providers.Common;
|
||||
using System.Diagnostics;
|
||||
using System.IO;
|
||||
|
||||
namespace WebsitePanel.EnterpriseServer
|
||||
{
|
||||
/// <summary>
|
||||
/// Summary description for ConfigSettings.
|
||||
/// </summary>
|
||||
public class WebAppGalleryController
|
||||
{
|
||||
#region Constants
|
||||
public const string NO_DB_PARAMETER_MATCHES_MSG = "Could not match the parameter by either the following {0} {1}. Please check parameters.xml file within the application package.";
|
||||
public const string PARAMETER_IS_NULL_OR_EMPTY = "{0} parameter is either not set or empty";
|
||||
public const string CANNOT_SET_PARAMETER_VALUE = "Parameter '{0}' has an empty value. Please check the database service provider configuration.\r\n" +
|
||||
"- For Microsoft SQL database server ensure you do not use Trusted connection option.\r\n" +
|
||||
"- For MySQL database server ensure database administrator credentials are set.";
|
||||
public const string TAGS_MATCH = "tags";
|
||||
public const string NAMES_MATCH = "names";
|
||||
public const string TASK_MANAGER_SOURCE = "WAG_INSTALLER";
|
||||
public const string GET_APP_PARAMS_TASK = "GET_APP_PARAMS_TASK";
|
||||
public const string GET_GALLERY_APPS_TASK = "GET_GALLERY_APPS_TASK";
|
||||
public const string GET_SRV_GALLERY_APPS_TASK = "GET_SRV_GALLERY_APPS_TASK";
|
||||
public const string GET_GALLERY_APP_DETAILS_TASK = "GET_GALLERY_APP_DETAILS_TASK";
|
||||
public const string GET_GALLERY_CATEGORIES_TASK = "GET_GALLERY_CATEGORIES_TASK";
|
||||
#endregion
|
||||
|
||||
public static GalleryCategoriesResult GetGalleryCategories(int packageId)
|
||||
{
|
||||
GalleryCategoriesResult result;
|
||||
//
|
||||
try
|
||||
{
|
||||
TaskManager.StartTask(TASK_MANAGER_SOURCE, GET_GALLERY_CATEGORIES_TASK);
|
||||
|
||||
// check if Web App Gallery is installed
|
||||
WebServer webServer = GetAssociatedWebServer(packageId);
|
||||
|
||||
if (!webServer.IsMsDeployInstalled())
|
||||
return Error<GalleryCategoriesResult>(GalleryErrors.MsDeployIsNotInstalled);
|
||||
|
||||
// get categories
|
||||
result = webServer.GetGalleryCategories();
|
||||
|
||||
if (!result.IsSuccess)
|
||||
return Error<GalleryCategoriesResult>(result, GalleryErrors.GetCategoriesError);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.WriteError(ex);
|
||||
return Error<GalleryCategoriesResult>(GalleryErrors.GeneralError, ex.Message);
|
||||
}
|
||||
finally
|
||||
{
|
||||
TaskManager.CompleteTask();
|
||||
}
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
public static GalleryApplicationsResult GetGalleryApplicationsByServiceId(int serviceId)
|
||||
{
|
||||
GalleryApplicationsResult result;
|
||||
//
|
||||
try
|
||||
{
|
||||
TaskManager.StartTask(TASK_MANAGER_SOURCE, GET_SRV_GALLERY_APPS_TASK);
|
||||
|
||||
int accountCheck = SecurityContext.CheckAccount(DemandAccount.IsAdmin);
|
||||
if (accountCheck < 0)
|
||||
return Warning<GalleryApplicationsResult>((-accountCheck).ToString());
|
||||
|
||||
// check if WAG is installed
|
||||
WebServer webServer = WebServerController.GetWebServer(serviceId);
|
||||
|
||||
if (!webServer.IsMsDeployInstalled())
|
||||
return Error<GalleryApplicationsResult>(GalleryErrors.MsDeployIsNotInstalled);
|
||||
|
||||
// get applications
|
||||
result = webServer.GetGalleryApplications(String.Empty);
|
||||
|
||||
if (!result.IsSuccess)
|
||||
return Error<GalleryApplicationsResult>(result, GalleryErrors.GetApplicationsError);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.WriteError(ex);
|
||||
return Error<GalleryApplicationsResult>(GalleryErrors.GeneralError, ex.Message);
|
||||
}
|
||||
finally
|
||||
{
|
||||
TaskManager.CompleteTask();
|
||||
}
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
public static GalleryApplicationsResult GetGalleryApplications(int packageId, string categoryId)
|
||||
{
|
||||
GalleryApplicationsResult result;
|
||||
//
|
||||
try
|
||||
{
|
||||
TaskManager.StartTask(TASK_MANAGER_SOURCE, GET_GALLERY_APPS_TASK);
|
||||
|
||||
// check if WAG is installed
|
||||
WebServer webServer = GetAssociatedWebServer(packageId);
|
||||
if (!webServer.IsMsDeployInstalled())
|
||||
return Error<GalleryApplicationsResult>(GalleryErrors.MsDeployIsNotInstalled);
|
||||
|
||||
// get applications
|
||||
result = webServer.GetGalleryApplications(categoryId);
|
||||
|
||||
if (!result.IsSuccess)
|
||||
return Error<GalleryApplicationsResult>(result, GalleryErrors.GetApplicationsError);
|
||||
|
||||
// get space quotas
|
||||
PackageContext context = PackageController.GetPackageContext(packageId);
|
||||
|
||||
//// filter applications
|
||||
//List<string> appsFilter = new List<string>();
|
||||
//// if either ASP.NET 1.1 or 2.0 enabled in the hosting plan
|
||||
//if (context.Quotas[Quotas.WEB_ASPNET11].QuotaAllocatedValue == 1 ||
|
||||
// context.Quotas[Quotas.WEB_ASPNET20].QuotaAllocatedValue == 1 ||
|
||||
// context.Quotas[Quotas.WEB_ASPNET40].QuotaAllocatedValue == 1)
|
||||
//{
|
||||
// appsFilter.AddRange(SupportedAppDependencies.ASPNET_SCRIPTING);
|
||||
//}
|
||||
//// if either PHP 4 or 5 enabled in the hosting plan
|
||||
//if (context.Quotas[Quotas.WEB_PHP4].QuotaAllocatedValue == 1 ||
|
||||
// context.Quotas[Quotas.WEB_PHP5].QuotaAllocatedValue == 1)
|
||||
//{
|
||||
// appsFilter.AddRange(SupportedAppDependencies.PHP_SCRIPTING);
|
||||
//}
|
||||
//// if either MSSQL 2000, 2005 or 2008 enabled in the hosting plan
|
||||
//if (context.Groups.ContainsKey(ResourceGroups.MsSql2000) ||
|
||||
// context.Groups.ContainsKey(ResourceGroups.MsSql2005) ||
|
||||
// context.Groups.ContainsKey(ResourceGroups.MsSql2008))
|
||||
//{
|
||||
// appsFilter.AddRange(SupportedAppDependencies.MSSQL_DATABASE);
|
||||
//}
|
||||
//// if either MySQL 4 or 5 enabled in the hosting plan
|
||||
//if (context.Groups.ContainsKey(ResourceGroups.MySql4) ||
|
||||
// context.Groups.ContainsKey(ResourceGroups.MySql5))
|
||||
//{
|
||||
// appsFilter.AddRange(SupportedAppDependencies.MYSQL_DATABASE);
|
||||
//}
|
||||
//// Match applications based on the hosting plan restrictions collected
|
||||
//result.Value = new List<GalleryApplication>(Array.FindAll<GalleryApplication>(result.Value.ToArray(),
|
||||
// x => MatchGalleryAppDependencies(x.Dependency, appsFilter.ToArray())
|
||||
// || MatchMenaltoGalleryApp(x, appsFilter.ToArray())));
|
||||
|
||||
{
|
||||
int userId = SecurityContext.User.UserId;
|
||||
//
|
||||
SecurityContext.SetThreadSupervisorPrincipal();
|
||||
//
|
||||
string[] filteredApps = GetServiceAppsCatalogFilter(packageId);
|
||||
//
|
||||
if (filteredApps != null)
|
||||
{
|
||||
result.Value = new List<GalleryApplication>(Array.FindAll(result.Value.ToArray(),
|
||||
x => !Array.Exists(filteredApps,
|
||||
z => z.Equals(x.Id, StringComparison.InvariantCultureIgnoreCase))));
|
||||
}
|
||||
//
|
||||
SecurityContext.SetThreadPrincipal(userId);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.WriteError(ex);
|
||||
return Error<GalleryApplicationsResult>(GalleryErrors.GeneralError, ex.Message);
|
||||
}
|
||||
finally
|
||||
{
|
||||
TaskManager.CompleteTask();
|
||||
}
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
internal static bool MatchParticularAppDependency(Dependency dependency, string[] dependencyIds)
|
||||
{
|
||||
List<Dependency> nested = null;
|
||||
// Web PI ver. 0.2
|
||||
if (dependency.LogicalAnd.Count > 0)
|
||||
nested = dependency.LogicalAnd;
|
||||
else if (dependency.LogicalOr.Count > 0)
|
||||
nested = dependency.LogicalOr;
|
||||
// Web PI ver. 2.0.1.0
|
||||
else if (dependency.And.Count > 0)
|
||||
nested = dependency.And;
|
||||
else if (dependency.Or.Count > 0)
|
||||
nested = dependency.Or;
|
||||
|
||||
if (nested != null)
|
||||
{
|
||||
// Check conditions
|
||||
foreach (Dependency ndep in nested)
|
||||
if (MatchGalleryAppDependencies(ndep, dependencyIds))
|
||||
return true;
|
||||
//
|
||||
return false;
|
||||
}
|
||||
// Non-empty dependencies should be filtered out if do not match
|
||||
if (!String.IsNullOrEmpty(dependency.ProductId))
|
||||
return Array.Exists<string>(dependencyIds, x => String.Equals(x, dependency.ProductId,
|
||||
StringComparison.InvariantCultureIgnoreCase));
|
||||
|
||||
// Empty should not match everything when checking a certain dependencies
|
||||
return false;
|
||||
}
|
||||
|
||||
internal static bool MatchGalleryAppDependencies(Dependency dependency, string[] dependencyIds)
|
||||
{
|
||||
List<Dependency> nested = null;
|
||||
// Web PI ver. 0.2
|
||||
if (dependency.LogicalAnd.Count > 0)
|
||||
nested = dependency.LogicalAnd;
|
||||
else if (dependency.LogicalOr.Count > 0)
|
||||
nested = dependency.LogicalOr;
|
||||
// Web PI ver. 2.0.1.0
|
||||
else if (dependency.And.Count > 0)
|
||||
nested = dependency.And;
|
||||
else if (dependency.Or.Count > 0)
|
||||
nested = dependency.Or;
|
||||
|
||||
if (nested != null)
|
||||
{
|
||||
// Check LogicalAnd conditions
|
||||
if (nested == dependency.LogicalAnd || nested == dependency.And)
|
||||
{
|
||||
foreach (Dependency ndep in nested)
|
||||
if (!MatchGalleryAppDependencies(ndep, dependencyIds))
|
||||
return false;
|
||||
//
|
||||
return true;
|
||||
}
|
||||
//
|
||||
if (nested == dependency.LogicalOr || nested == dependency.Or)
|
||||
{
|
||||
bool matchOK = false;
|
||||
//
|
||||
foreach (Dependency ndep in nested)
|
||||
if (MatchGalleryAppDependencies(ndep, dependencyIds))
|
||||
matchOK = true;
|
||||
//
|
||||
return matchOK;
|
||||
}
|
||||
}
|
||||
// Non-empty dependencies should be filtered out if do not match
|
||||
if (!String.IsNullOrEmpty(dependency.ProductId))
|
||||
return Array.Exists<string>(dependencyIds, x => String.Equals(x, dependency.ProductId,
|
||||
StringComparison.InvariantCultureIgnoreCase));
|
||||
|
||||
// Empty dependencies always match everything
|
||||
return true;
|
||||
}
|
||||
|
||||
public static GalleryApplicationResult GetGalleryApplicationDetails(int packageId, string applicationId)
|
||||
{
|
||||
GalleryApplicationResult result;
|
||||
|
||||
//
|
||||
try
|
||||
{
|
||||
TaskManager.StartTask(TASK_MANAGER_SOURCE, GET_GALLERY_APP_DETAILS_TASK);
|
||||
|
||||
// check if WAG is installed
|
||||
WebServer webServer = GetAssociatedWebServer(packageId);
|
||||
if (!webServer.IsMsDeployInstalled())
|
||||
return Error<GalleryApplicationResult>(GalleryErrors.MsDeployIsNotInstalled);
|
||||
|
||||
// get application details
|
||||
result = webServer.GetGalleryApplication(applicationId);
|
||||
|
||||
if (!result.IsSuccess)
|
||||
return Error<GalleryApplicationResult>(result, GalleryErrors.GetApplicationError);
|
||||
|
||||
// check application requirements
|
||||
PackageContext context = PackageController.GetPackageContext(packageId);
|
||||
|
||||
GalleryApplication app = result.Value;
|
||||
|
||||
// ASP.NET 2.0
|
||||
if ((app.WellKnownDependencies & GalleryApplicationWellKnownDependency.AspNet20) == GalleryApplicationWellKnownDependency.AspNet20
|
||||
&& context.Quotas.ContainsKey(Quotas.WEB_ASPNET20) && context.Quotas[Quotas.WEB_ASPNET20].QuotaAllocatedValue < 1)
|
||||
result.ErrorCodes.Add(GalleryErrors.AspNet20Required);
|
||||
|
||||
// ASP.NET 4.0
|
||||
else if ((app.WellKnownDependencies & GalleryApplicationWellKnownDependency.AspNet40) == GalleryApplicationWellKnownDependency.AspNet40
|
||||
&& context.Quotas.ContainsKey(Quotas.WEB_ASPNET40) && context.Quotas[Quotas.WEB_ASPNET40].QuotaAllocatedValue < 1)
|
||||
result.ErrorCodes.Add(GalleryErrors.AspNet40Required);
|
||||
|
||||
// PHP
|
||||
else if ((app.WellKnownDependencies & GalleryApplicationWellKnownDependency.PHP) == GalleryApplicationWellKnownDependency.PHP
|
||||
&& context.Quotas.ContainsKey(Quotas.WEB_PHP4) && context.Quotas[Quotas.WEB_PHP4].QuotaAllocatedValue < 1
|
||||
&& context.Quotas.ContainsKey(Quotas.WEB_PHP5) && context.Quotas[Quotas.WEB_PHP5].QuotaAllocatedValue < 1)
|
||||
result.ErrorCodes.Add(GalleryErrors.PhpRequired);
|
||||
|
||||
// any database
|
||||
GalleryApplicationWellKnownDependency anyDatabaseFlag = GalleryApplicationWellKnownDependency.SQL | GalleryApplicationWellKnownDependency.MySQL;
|
||||
if ((app.WellKnownDependencies & anyDatabaseFlag) == anyDatabaseFlag &&
|
||||
!(context.Groups.ContainsKey(ResourceGroups.MsSql2000)
|
||||
|| context.Groups.ContainsKey(ResourceGroups.MsSql2005)
|
||||
|| context.Groups.ContainsKey(ResourceGroups.MsSql2008)
|
||||
|| context.Groups.ContainsKey(ResourceGroups.MySql4)
|
||||
|| context.Groups.ContainsKey(ResourceGroups.MySql5)))
|
||||
result.ErrorCodes.Add(GalleryErrors.DatabaseRequired);
|
||||
|
||||
// SQL Server
|
||||
else if ((app.WellKnownDependencies & GalleryApplicationWellKnownDependency.SQL) == GalleryApplicationWellKnownDependency.SQL
|
||||
&& !(context.Groups.ContainsKey(ResourceGroups.MsSql2000)
|
||||
|| context.Groups.ContainsKey(ResourceGroups.MsSql2005)
|
||||
|| context.Groups.ContainsKey(ResourceGroups.MsSql2008)))
|
||||
result.ErrorCodes.Add(GalleryErrors.SQLRequired);
|
||||
|
||||
// MySQL
|
||||
else if ((app.WellKnownDependencies & GalleryApplicationWellKnownDependency.MySQL) == GalleryApplicationWellKnownDependency.MySQL
|
||||
&& !(context.Groups.ContainsKey(ResourceGroups.MySql4)
|
||||
|| context.Groups.ContainsKey(ResourceGroups.MySql5)))
|
||||
result.ErrorCodes.Add(GalleryErrors.MySQLRequired);
|
||||
|
||||
if (result.ErrorCodes.Count > 0)
|
||||
{
|
||||
GalleryApplicationResult warning = Warning<GalleryApplicationResult>(result, GalleryErrors.PackageDoesNotMeetRequirements);
|
||||
warning.Value = app;
|
||||
return warning;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.WriteError(ex);
|
||||
return Error<GalleryApplicationResult>(GalleryErrors.GeneralError, ex.Message);
|
||||
}
|
||||
finally
|
||||
{
|
||||
TaskManager.CompleteTask();
|
||||
}
|
||||
//
|
||||
return result;
|
||||
}
|
||||
|
||||
public static DeploymentParametersResult GetGalleryApplicationParams(int packageId, string webAppId)
|
||||
{
|
||||
DeploymentParametersResult result = null;
|
||||
//
|
||||
try
|
||||
{
|
||||
TaskManager.StartTask(TASK_MANAGER_SOURCE, GET_APP_PARAMS_TASK);
|
||||
|
||||
// check if WAG is installed
|
||||
WebServer webServer = GetAssociatedWebServer(packageId);
|
||||
if (!webServer.IsMsDeployInstalled())
|
||||
return Error<DeploymentParametersResult>(GalleryErrors.MsDeployIsNotInstalled);
|
||||
|
||||
// get parameters
|
||||
result = webServer.GetGalleryApplicationParameters(webAppId);
|
||||
|
||||
if (!result.IsSuccess)
|
||||
return Error<DeploymentParametersResult>(result, GalleryErrors.GetApplicationParametersError);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.WriteError(ex);
|
||||
return Error<DeploymentParametersResult>(GalleryErrors.GeneralError, ex.Message);
|
||||
}
|
||||
finally
|
||||
{
|
||||
TaskManager.CompleteTask();
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public static StringResultObject Install(int packageId, string webAppId, string siteName, string virtualDir, List<DeploymentParameter> parameters)
|
||||
{
|
||||
StringResultObject result = new StringResultObject();
|
||||
|
||||
try
|
||||
{
|
||||
// database operation results
|
||||
int databaseResult = -1;
|
||||
int databaseUserResult = -1;
|
||||
|
||||
// initialize task manager
|
||||
TaskManager.StartTask(TASK_MANAGER_SOURCE, "INSTALL_WEB_APP");
|
||||
TaskManager.WriteParameter("Package ID", packageId);
|
||||
TaskManager.WriteParameter("Site Name", siteName);
|
||||
|
||||
#region Check Space and Account
|
||||
// Check account
|
||||
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive);
|
||||
if (accountCheck < 0)
|
||||
return Warning<StringResultObject>((-accountCheck).ToString());
|
||||
|
||||
// Check space
|
||||
int packageCheck = SecurityContext.CheckPackage(packageId, DemandPackage.IsActive);
|
||||
if (packageCheck < 0)
|
||||
return Warning<StringResultObject>((-packageCheck).ToString());
|
||||
#endregion
|
||||
|
||||
#region Check MS Deploy, web site and application pack
|
||||
// get target web server
|
||||
WebServer webServer = GetAssociatedWebServer(packageId);
|
||||
|
||||
// Check if Web App Gallery is installed
|
||||
if (!webServer.IsMsDeployInstalled())
|
||||
return Error<StringResultObject>(GalleryErrors.MsDeployIsNotInstalled);
|
||||
|
||||
// Check web site for existence
|
||||
WebSite webSite = WebServerController.GetWebSite(packageId, siteName);
|
||||
if (webSite == null)
|
||||
return Error<StringResultObject>(GalleryErrors.WebSiteNotFound, siteName);
|
||||
|
||||
// get application pack details
|
||||
GalleryApplicationResult app = webServer.GetGalleryApplication(webAppId);
|
||||
if (!app.IsSuccess)
|
||||
return Error<StringResultObject>(app, GalleryErrors.GeneralError);
|
||||
if (app.Value == null)
|
||||
return Error<StringResultObject>(GalleryErrors.WebApplicationNotFound, webAppId);
|
||||
#endregion
|
||||
|
||||
#region Trace app details
|
||||
|
||||
// Assign web app pack title to the currently running task
|
||||
TaskManager.ItemName = app.Value.Title;
|
||||
|
||||
// Trace additional details from the feed
|
||||
TaskManager.WriteParameter("Title", app.Value.Title);
|
||||
TaskManager.WriteParameter("Version", app.Value.Version);
|
||||
TaskManager.WriteParameter("Download URL", app.Value.DownloadUrl);
|
||||
TaskManager.WriteParameter("Author", app.Value.AuthorName);
|
||||
TaskManager.WriteParameter("Last Updated", app.Value.LastUpdated);
|
||||
|
||||
// Trace out all deployment parameters
|
||||
Array.ForEach<DeploymentParameter>(parameters.ToArray(), p => TaskManager.WriteParameter(p.Name, p.Value));
|
||||
#endregion
|
||||
|
||||
// elevate security context
|
||||
SecurityContext.SetThreadSupervisorPrincipal();
|
||||
|
||||
#region Set AppPath
|
||||
// set correct application path
|
||||
DeploymentParameter appPath = FindParameterByTag(parameters, DeploymentParameterWellKnownTag.IisApp);
|
||||
if (appPath == null)
|
||||
return Error<StringResultObject>(GalleryErrors.AppPathParameterNotFound);
|
||||
|
||||
appPath.Value = String.IsNullOrEmpty(virtualDir) ? siteName : String.Format("{0}/{1}", siteName, virtualDir);
|
||||
#endregion
|
||||
|
||||
// database context
|
||||
// find database resource parameter
|
||||
DeploymentParameter databaseResoure = parameters.Find( p =>
|
||||
{
|
||||
return (p.Name == DeploymentParameter.ResourceGroupParameterName);
|
||||
});
|
||||
|
||||
// database is required for this application
|
||||
if (databaseResoure != null)
|
||||
{
|
||||
// try to get database service
|
||||
int dbServiceId = PackageController.GetPackageServiceId(packageId, databaseResoure.Value);
|
||||
if (dbServiceId == 0)
|
||||
return Error<StringResultObject>(GalleryErrors.DatabaseServiceIsNotAvailable);
|
||||
|
||||
#region Setup Database server and DB Admin credentials
|
||||
// get database service settings
|
||||
StringDictionary dbSettings = ServerController.GetServiceSettingsAdmin(dbServiceId);
|
||||
|
||||
// database server
|
||||
DeploymentParameter databaseServer = FindParameterByTag(parameters, DeploymentParameterWellKnownTag.DBServer);
|
||||
if (databaseServer != null)
|
||||
{
|
||||
databaseServer.Value = dbSettings["ExternalAddress"];
|
||||
if (String.IsNullOrEmpty(databaseServer.Value))
|
||||
return Error<StringResultObject>(GalleryErrors.DatabaseServerExternalAddressIsEmpty);
|
||||
}
|
||||
|
||||
// database admin
|
||||
DeploymentParameter databaseAdminUsername = FindParameterByTag(parameters, DeploymentParameterWellKnownTag.DBAdminUserName);
|
||||
if (databaseAdminUsername != null)
|
||||
{
|
||||
databaseAdminUsername.Value = dbSettings["RootLogin"];
|
||||
if(String.IsNullOrEmpty(databaseAdminUsername.Value))
|
||||
databaseAdminUsername.Value = dbSettings["SaLogin"];
|
||||
|
||||
// raise error if database service is in Integrated Security mode (for SQL Server)
|
||||
// or DB Admin username is not provided
|
||||
if (String.IsNullOrEmpty(databaseAdminUsername.Value))
|
||||
return Error<StringResultObject>(GalleryErrors.DatabaseAdminUsernameNotSpecified);
|
||||
}
|
||||
|
||||
// database admin password
|
||||
DeploymentParameter databaseAdminPassword = FindParameterByTag(parameters, DeploymentParameterWellKnownTag.DBAdminPassword);
|
||||
if (databaseAdminPassword != null)
|
||||
{
|
||||
databaseAdminPassword.Value = dbSettings["RootPassword"];
|
||||
if (String.IsNullOrEmpty(databaseAdminPassword.Value))
|
||||
databaseAdminPassword.Value = dbSettings["SaPassword"];
|
||||
|
||||
// raise error if database service is in Integrated Security mode (for SQL Server)
|
||||
// or DB Admin password is not provided
|
||||
if (String.IsNullOrEmpty(databaseAdminPassword.Value))
|
||||
return Error<StringResultObject>(GalleryErrors.DatabaseAdminPasswordNotSpecified);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Create database and db user account if new selected
|
||||
|
||||
// create database
|
||||
DeploymentParameter databaseName = FindParameterByTag(parameters, DeploymentParameterWellKnownTag.DBName);
|
||||
if (databaseName != null)
|
||||
{
|
||||
SqlDatabase db = PackageController.GetPackageItemByName(packageId, databaseResoure.Value, databaseName.Value, typeof(SqlDatabase)) as SqlDatabase;
|
||||
|
||||
if (db == null)
|
||||
{
|
||||
try
|
||||
{
|
||||
db = new SqlDatabase();
|
||||
db.PackageId = packageId;
|
||||
db.Name = databaseName.Value;
|
||||
|
||||
// create
|
||||
databaseResult = DatabaseServerController.AddSqlDatabase(db, databaseResoure.Value);
|
||||
if (databaseResult < 0)
|
||||
{
|
||||
result.ErrorCodes.Add((-databaseResult).ToString());
|
||||
return Error<StringResultObject>(result, GalleryErrors.DatabaseCreationError);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
// log exception
|
||||
TaskManager.WriteError(ex);
|
||||
|
||||
// return error
|
||||
return Error<StringResultObject>(GalleryErrors.DatabaseCreationException);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// create database user
|
||||
DeploymentParameter databaseUsername = FindParameterByTag(parameters, DeploymentParameterWellKnownTag.DBUserName);
|
||||
DeploymentParameter databaseUserPassword = FindParameterByTag(parameters, DeploymentParameterWellKnownTag.DBUserPassword);
|
||||
|
||||
if (databaseUsername != null && databaseUserPassword != null)
|
||||
{
|
||||
SqlUser user = PackageController.GetPackageItemByName(packageId, databaseResoure.Value, databaseUsername.Value, typeof(SqlUser)) as SqlUser;
|
||||
//
|
||||
if (user == null)
|
||||
{
|
||||
// create new user account
|
||||
try
|
||||
{
|
||||
user = new SqlUser();
|
||||
user.PackageId = packageId;
|
||||
user.Name = databaseUsername.Value;
|
||||
user.Databases = (databaseName != null) ? new string[] { databaseName.Value } : new string[0];
|
||||
user.Password = databaseUserPassword.Value;
|
||||
|
||||
// create
|
||||
databaseUserResult = DatabaseServerController.AddSqlUser(user, databaseResoure.Value);
|
||||
|
||||
// check results
|
||||
if (databaseUserResult < 0)
|
||||
{
|
||||
// Rollback and remove db if created
|
||||
if (databaseResult > 0)
|
||||
DatabaseServerController.DeleteSqlDatabase(databaseResult);
|
||||
|
||||
// raise error
|
||||
result.ErrorCodes.Add((-databaseUserResult).ToString());
|
||||
return Error<StringResultObject>(result, GalleryErrors.DatabaseUserCreationError);
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
// log exception
|
||||
TaskManager.WriteError(ex);
|
||||
|
||||
// return error
|
||||
return Error<StringResultObject>(GalleryErrors.DatabaseUserCreationException, ex.Message);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// check existing user account
|
||||
DatabaseServer databaseService = DatabaseServerController.GetDatabaseServer(dbServiceId);
|
||||
if (!databaseService.CheckConnectivity(databaseName.Value, databaseUsername.Value, databaseUserPassword.Value))
|
||||
{
|
||||
return Error<StringResultObject>(GalleryErrors.DatabaseUserCannotAccessDatabase, databaseUsername.Value);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endregion
|
||||
|
||||
// remove database resource parameter from the list
|
||||
// before calling "install" method
|
||||
parameters.Remove(databaseResoure);
|
||||
}
|
||||
|
||||
// install application
|
||||
result = webServer.InstallGalleryApplication(webAppId, parameters.ToArray());
|
||||
|
||||
#region Rollback in case of failure
|
||||
// Rollback - remove resources have been created previously
|
||||
if (!result.IsSuccess)
|
||||
{
|
||||
// delete database
|
||||
if (databaseUserResult > 0)
|
||||
DatabaseServerController.DeleteSqlUser(databaseUserResult);
|
||||
|
||||
// delete database user
|
||||
if (databaseResult > 0)
|
||||
DatabaseServerController.DeleteSqlDatabase(databaseResult);
|
||||
|
||||
// exit with errors
|
||||
return Error<StringResultObject>(result, GalleryErrors.ApplicationInstallationError);
|
||||
}
|
||||
#endregion
|
||||
|
||||
#region Update Web Application settings
|
||||
|
||||
WebVirtualDirectory iisApp = null;
|
||||
if(String.IsNullOrEmpty(virtualDir))
|
||||
// load web site
|
||||
iisApp = WebServerController.GetWebSite(packageId, siteName);
|
||||
else
|
||||
// load virtual directory
|
||||
iisApp = WebServerController.GetVirtualDirectory(webSite.Id, virtualDir);
|
||||
|
||||
// put correct extensions
|
||||
if ((app.Value.WellKnownDependencies & GalleryApplicationWellKnownDependency.AspNet20) == GalleryApplicationWellKnownDependency.AspNet20)
|
||||
{
|
||||
// ASP.NET 2.0
|
||||
iisApp.AspNetInstalled = (iisApp.IIs7) ? "2I" : "2";
|
||||
AddDefaultDocument(iisApp, "default.aspx");
|
||||
}
|
||||
else if ((app.Value.WellKnownDependencies & GalleryApplicationWellKnownDependency.AspNet40) == GalleryApplicationWellKnownDependency.AspNet40)
|
||||
{
|
||||
// ASP.NET 4.0
|
||||
iisApp.AspNetInstalled = (iisApp.IIs7) ? "4I" : "4";
|
||||
AddDefaultDocument(iisApp, "default.aspx");
|
||||
}
|
||||
else if ((app.Value.WellKnownDependencies & GalleryApplicationWellKnownDependency.PHP) == GalleryApplicationWellKnownDependency.PHP)
|
||||
{
|
||||
// PHP 5
|
||||
iisApp.PhpInstalled = "5";
|
||||
AddDefaultDocument(iisApp, "index.php");
|
||||
}
|
||||
|
||||
// update web site or virtual directory
|
||||
int updateResult = 0;
|
||||
if (String.IsNullOrEmpty(virtualDir))
|
||||
// update web site
|
||||
updateResult = WebServerController.UpdateWebSite(iisApp as WebSite);
|
||||
else
|
||||
// update virtual directory
|
||||
updateResult = WebServerController.UpdateVirtualDirectory(webSite.Id, iisApp);
|
||||
|
||||
if(updateResult < 0)
|
||||
TaskManager.WriteWarning("Cannot update website or virtual directory programming extensions and default documents. Result code: {0}", updateResult.ToString());
|
||||
|
||||
#endregion
|
||||
|
||||
return result;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
// log error
|
||||
TaskManager.WriteError(ex);
|
||||
|
||||
// exit with error code
|
||||
return Error<StringResultObject>(GalleryErrors.GeneralError);
|
||||
}
|
||||
finally
|
||||
{
|
||||
TaskManager.CompleteTask();
|
||||
}
|
||||
}
|
||||
|
||||
private static void AddDefaultDocument(WebVirtualDirectory iisApp, string document)
|
||||
{
|
||||
// parse list
|
||||
List<string> documents = new List<string>();
|
||||
|
||||
if (!String.IsNullOrEmpty(iisApp.DefaultDocs))
|
||||
documents.AddRange(iisApp.DefaultDocs.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries));
|
||||
|
||||
// add document if required
|
||||
if (documents.Find(d => { return String.Compare(d, document, true) == 0; }) == null)
|
||||
documents.Add(document);
|
||||
|
||||
iisApp.DefaultDocs = String.Join(",", documents.ToArray());
|
||||
}
|
||||
|
||||
public static GalleryWebAppStatus GetGalleryApplicationStatus(int packageId, string webAppId)
|
||||
{
|
||||
try
|
||||
{
|
||||
WebServer webServer = GetAssociatedWebServer(packageId);
|
||||
//
|
||||
if (!webServer.IsMsDeployInstalled())
|
||||
return Error<GalleryWebAppStatus>(GalleryErrors.MsDeployIsNotInstalled);
|
||||
//
|
||||
GalleryWebAppStatus appStatus = webServer.GetGalleryApplicationStatus(webAppId);
|
||||
//
|
||||
if (appStatus == GalleryWebAppStatus.NotDownloaded)
|
||||
{
|
||||
GalleryApplicationResult appResult = webServer.GetGalleryApplication(webAppId);
|
||||
// Start app download in new thread
|
||||
WebAppGalleryAsyncWorker async = new WebAppGalleryAsyncWorker();
|
||||
async.GalleryApp = appResult.Value;
|
||||
async.WebAppId = webAppId;
|
||||
async.PackageId = packageId;
|
||||
async.UserId = SecurityContext.User.UserId;
|
||||
async.DownloadGalleryWebApplicationAsync();
|
||||
//
|
||||
return GalleryWebAppStatus.Downloading;
|
||||
}
|
||||
//
|
||||
return appStatus;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Trace.TraceError(ex.StackTrace);
|
||||
//
|
||||
return GalleryWebAppStatus.Failed;
|
||||
}
|
||||
}
|
||||
|
||||
internal static WebServer GetAssociatedWebServer(int packageId)
|
||||
{
|
||||
int serviceId = PackageController.GetPackageServiceId(packageId, ResourceGroups.Web);
|
||||
//
|
||||
return WebServerController.GetWebServer(serviceId);
|
||||
}
|
||||
|
||||
internal static string[] GetServiceAppsCatalogFilter(int packageId)
|
||||
{
|
||||
int serviceId = PackageController.GetPackageServiceId(packageId, ResourceGroups.Web);
|
||||
//
|
||||
StringDictionary serviceSettings = ServerController.GetServiceSettings(serviceId);
|
||||
//
|
||||
string galleryAppsFilterStr = serviceSettings["GalleryAppsFilter"];
|
||||
//
|
||||
if (String.IsNullOrEmpty(galleryAppsFilterStr))
|
||||
return null;
|
||||
//
|
||||
return galleryAppsFilterStr.Split(new string[] { "," },
|
||||
StringSplitOptions.RemoveEmptyEntries);
|
||||
}
|
||||
|
||||
public static bool MatchParameterByNames(DeploymentParameter param, string[] namesMatches)
|
||||
{
|
||||
foreach (string nameMatch in namesMatches)
|
||||
if (MatchParameterName(param, nameMatch))
|
||||
return true;
|
||||
//
|
||||
return false;
|
||||
}
|
||||
|
||||
private static DeploymentParameter FindParameterByTag(List<DeploymentParameter> parameters, DeploymentParameterWellKnownTag tag)
|
||||
{
|
||||
return parameters.Find( p => { return (p.WellKnownTags & tag) == tag; });
|
||||
}
|
||||
|
||||
private static DeploymentParameter FindParameterByName(List<DeploymentParameter> parameters, string name)
|
||||
{
|
||||
return parameters.Find( p => { return String.Compare(p.Name, name, true) == 0; });
|
||||
}
|
||||
|
||||
public static bool MatchParameterName(DeploymentParameter param, string nameMatch)
|
||||
{
|
||||
if (param == null || String.IsNullOrEmpty(nameMatch))
|
||||
return false;
|
||||
//
|
||||
if (String.IsNullOrEmpty(param.Name))
|
||||
return false;
|
||||
// Match parameter name
|
||||
return (param.Name.ToLowerInvariant() == nameMatch.ToLowerInvariant());
|
||||
}
|
||||
|
||||
#region Result object routines
|
||||
private static T Warning<T>(params string[] messageParts)
|
||||
{
|
||||
return Warning<T>(null, messageParts);
|
||||
}
|
||||
|
||||
private static T Warning<T>(ResultObject innerResult, params string[] messageParts)
|
||||
{
|
||||
return Result<T>(innerResult, false, messageParts);
|
||||
}
|
||||
|
||||
private static T Error<T>(params string[] messageParts)
|
||||
{
|
||||
return Error<T>(null, messageParts);
|
||||
}
|
||||
|
||||
private static T Error<T>(ResultObject innerResult, params string[] messageParts)
|
||||
{
|
||||
return Result<T>(innerResult, true, messageParts);
|
||||
}
|
||||
|
||||
private static T Result<T>(ResultObject innerResult, bool isError, params string[] messageParts)
|
||||
{
|
||||
object obj = Activator.CreateInstance<T>();
|
||||
ResultObject result = (ResultObject)obj;
|
||||
|
||||
// set error
|
||||
result.IsSuccess = !isError;
|
||||
|
||||
// add message
|
||||
if (messageParts != null)
|
||||
result.ErrorCodes.Add(String.Join(":", messageParts));
|
||||
|
||||
// copy errors from inner result
|
||||
if (innerResult != null)
|
||||
result.ErrorCodes.AddRange(innerResult.ErrorCodes);
|
||||
|
||||
return (T)obj;
|
||||
}
|
||||
#endregion
|
||||
}
|
||||
|
||||
public class WebAppGalleryAsyncWorker
|
||||
{
|
||||
public int PackageId { get; set; }
|
||||
public string WebAppId { get; set; }
|
||||
public GalleryApplication GalleryApp { get; set; }
|
||||
public int UserId { get; set; }
|
||||
|
||||
public void DownloadGalleryWebApplicationAsync()
|
||||
{
|
||||
Thread t = new Thread(new ThreadStart(DownloadGalleryWebApplication));
|
||||
t.Start();
|
||||
}
|
||||
|
||||
public void DownloadGalleryWebApplication()
|
||||
{
|
||||
SecurityContext.SetThreadPrincipal(UserId);
|
||||
//
|
||||
TaskManager.StartTask(WebAppGalleryController.TASK_MANAGER_SOURCE, "DOWNLOAD_WEB_APP", GalleryApp.Title);
|
||||
TaskManager.WriteParameter("Version", GalleryApp.Version);
|
||||
TaskManager.WriteParameter("Download URL", GalleryApp.DownloadUrl);
|
||||
TaskManager.WriteParameter("Author", GalleryApp.AuthorName);
|
||||
TaskManager.WriteParameter("Last Updated", GalleryApp.LastUpdated);
|
||||
TaskManager.WriteParameter("Web App ID", WebAppId);
|
||||
//
|
||||
try
|
||||
{
|
||||
//
|
||||
WebServer webServer = WebAppGalleryController.GetAssociatedWebServer(PackageId);
|
||||
//
|
||||
TaskManager.Write("Application package download has been started");
|
||||
//
|
||||
GalleryWebAppStatus appStatus = webServer.DownloadGalleryApplication(WebAppId);
|
||||
//
|
||||
if (appStatus == GalleryWebAppStatus.Failed)
|
||||
{
|
||||
TaskManager.WriteError("Could not download application package requested");
|
||||
TaskManager.WriteError("Please check WebsitePanel Server log for further information on this issue");
|
||||
TaskManager.WriteParameter("Status returned", appStatus);
|
||||
return;
|
||||
}
|
||||
//
|
||||
TaskManager.Write("Application package download has been started successfully");
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
TaskManager.WriteError(ex);
|
||||
}
|
||||
finally
|
||||
{
|
||||
//
|
||||
TaskManager.CompleteTask();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
File diff suppressed because it is too large
Load diff
|
@ -0,0 +1,365 @@
|
|||
// Copyright (c) 2011, 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.Specialized;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
using WebsitePanel.Providers;
|
||||
using WebsitePanel.Providers.Web;
|
||||
using WebsitePanel.Providers.FTP;
|
||||
using WebsitePanel.Providers.Mail;
|
||||
using WebsitePanel.Providers.OS;
|
||||
|
||||
namespace WebsitePanel.EnterpriseServer
|
||||
{
|
||||
public class UserCreationWizard
|
||||
{
|
||||
public UserCreationWizard()
|
||||
{
|
||||
}
|
||||
|
||||
public static int CreateUserAccount(int parentPackageId, string username, string password,
|
||||
int roleId, string firstName, string lastName, string email, string secondaryEmail, bool htmlMail,
|
||||
bool sendAccountLetter,
|
||||
bool createPackage, int planId, bool sendPackageLetter,
|
||||
string domainName, bool tempDomain, bool createWebSite,
|
||||
bool createFtpAccount, string ftpAccountName, bool createMailAccount)
|
||||
{
|
||||
UserCreationWizard wizard = new UserCreationWizard();
|
||||
|
||||
return wizard.CreateUserAccountInternal(parentPackageId, username, password,
|
||||
roleId, firstName, lastName, email, secondaryEmail, htmlMail,
|
||||
sendAccountLetter,
|
||||
createPackage, planId, sendPackageLetter,
|
||||
domainName, tempDomain, createWebSite,
|
||||
createFtpAccount, ftpAccountName, createMailAccount);
|
||||
}
|
||||
|
||||
// private fields
|
||||
bool userCreated = false;
|
||||
int createdUserId = 0;
|
||||
int createdPackageId = 0;
|
||||
|
||||
public int CreateUserAccountInternal(int parentPackageId, string username, string password,
|
||||
int roleId, string firstName, string lastName, string email, string secondaryEmail, bool htmlMail,
|
||||
bool sendAccountLetter,
|
||||
bool createPackage, int planId, bool sendPackageLetter,
|
||||
string domainName, bool tempDomain, bool createWebSite,
|
||||
bool createFtpAccount, string ftpAccountName, bool createMailAccount)
|
||||
{
|
||||
|
||||
// check account
|
||||
int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive
|
||||
| DemandAccount.IsReseller);
|
||||
if (accountCheck < 0) return accountCheck;
|
||||
|
||||
// check package
|
||||
int packageCheck = SecurityContext.CheckPackage(parentPackageId, DemandPackage.IsActive);
|
||||
if (packageCheck < 0) return packageCheck;
|
||||
|
||||
// check if username exists
|
||||
if (UserController.UserExists(username))
|
||||
return BusinessErrorCodes.ERROR_ACCOUNT_WIZARD_USER_EXISTS;
|
||||
|
||||
// check if domain exists
|
||||
int checkDomainResult = ServerController.CheckDomain(domainName);
|
||||
if (checkDomainResult < 0)
|
||||
return checkDomainResult;
|
||||
|
||||
// check if FTP account exists
|
||||
if (String.IsNullOrEmpty(ftpAccountName))
|
||||
ftpAccountName = username;
|
||||
|
||||
if (FtpServerController.FtpAccountExists(ftpAccountName))
|
||||
return BusinessErrorCodes.ERROR_ACCOUNT_WIZARD_FTP_ACCOUNT_EXISTS;
|
||||
|
||||
// load parent package
|
||||
PackageInfo parentPackage = PackageController.GetPackage(parentPackageId);
|
||||
|
||||
/********************************************
|
||||
* CREATE USER ACCOUNT
|
||||
* *****************************************/
|
||||
UserInfo user = new UserInfo();
|
||||
user.RoleId = roleId;
|
||||
user.StatusId = (int)UserStatus.Active;
|
||||
user.OwnerId = parentPackage.UserId;
|
||||
user.IsDemo = false;
|
||||
user.IsPeer = false;
|
||||
|
||||
// account info
|
||||
user.FirstName = firstName;
|
||||
user.LastName = lastName;
|
||||
user.Email = email;
|
||||
user.SecondaryEmail = secondaryEmail;
|
||||
user.Username = username;
|
||||
user.Password = password;
|
||||
user.HtmlMail = htmlMail;
|
||||
|
||||
// add a new user
|
||||
createdUserId = UserController.AddUser(user, false);
|
||||
if (createdUserId < 0)
|
||||
{
|
||||
// exit
|
||||
return createdUserId;
|
||||
}
|
||||
userCreated = true;
|
||||
|
||||
// create package
|
||||
// load hosting plan
|
||||
createdPackageId = -1;
|
||||
if (createPackage)
|
||||
{
|
||||
try
|
||||
{
|
||||
HostingPlanInfo plan = PackageController.GetHostingPlan(planId);
|
||||
|
||||
PackageResult packageResult = PackageController.AddPackage(
|
||||
createdUserId, planId, plan.PlanName, "", (int)PackageStatus.Active, DateTime.Now, false);
|
||||
createdPackageId = packageResult.Result;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
// error while adding package
|
||||
|
||||
// remove user account
|
||||
UserController.DeleteUser(createdUserId);
|
||||
|
||||
throw ex;
|
||||
}
|
||||
|
||||
if (createdPackageId < 0)
|
||||
{
|
||||
// rollback wizard
|
||||
Rollback();
|
||||
|
||||
// return code
|
||||
return createdPackageId;
|
||||
}
|
||||
|
||||
// create domain
|
||||
int domainId = 0;
|
||||
if ((createWebSite || createMailAccount) && !String.IsNullOrEmpty(domainName))
|
||||
{
|
||||
try
|
||||
{
|
||||
DomainInfo domain = new DomainInfo();
|
||||
domain.PackageId = createdPackageId;
|
||||
domain.DomainName = domainName;
|
||||
domain.HostingAllowed = false;
|
||||
domainId = ServerController.AddDomain(domain, !tempDomain);
|
||||
if (domainId < 0)
|
||||
{
|
||||
// rollback wizard
|
||||
Rollback();
|
||||
|
||||
// return
|
||||
return domainId;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
// rollback wizard
|
||||
Rollback();
|
||||
|
||||
// error while adding domain
|
||||
throw new Exception("Could not add domain", ex);
|
||||
}
|
||||
}
|
||||
|
||||
if (createWebSite && !String.IsNullOrEmpty(domainName))
|
||||
{
|
||||
// create web site
|
||||
try
|
||||
{
|
||||
int webSiteId = WebServerController.AddWebSite(
|
||||
createdPackageId, domainId, 0, true);
|
||||
if (webSiteId < 0)
|
||||
{
|
||||
// rollback wizard
|
||||
Rollback();
|
||||
|
||||
// return
|
||||
return webSiteId;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
// rollback wizard
|
||||
Rollback();
|
||||
|
||||
// error while creating web site
|
||||
throw new Exception("Could not create web site", ex);
|
||||
}
|
||||
}
|
||||
|
||||
// create FTP account
|
||||
if (createFtpAccount)
|
||||
{
|
||||
try
|
||||
{
|
||||
FtpAccount ftpAccount = new FtpAccount();
|
||||
ftpAccount.PackageId = createdPackageId;
|
||||
ftpAccount.Name = ftpAccountName;
|
||||
ftpAccount.Password = password;
|
||||
ftpAccount.Folder = "\\";
|
||||
ftpAccount.CanRead = true;
|
||||
ftpAccount.CanWrite = true;
|
||||
|
||||
int ftpAccountId = FtpServerController.AddFtpAccount(ftpAccount);
|
||||
if (ftpAccountId < 0)
|
||||
{
|
||||
// rollback wizard
|
||||
Rollback();
|
||||
|
||||
// return
|
||||
return ftpAccountId;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
// rollback wizard
|
||||
Rollback();
|
||||
|
||||
// error while creating ftp account
|
||||
throw new Exception("Could not create FTP account", ex);
|
||||
}
|
||||
}
|
||||
|
||||
if (createMailAccount && !String.IsNullOrEmpty(domainName))
|
||||
{
|
||||
// create default mailbox
|
||||
try
|
||||
{
|
||||
// load mail policy
|
||||
UserSettings settings = UserController.GetUserSettings(createdUserId, UserSettings.MAIL_POLICY);
|
||||
string catchAllName = !String.IsNullOrEmpty(settings["CatchAllName"])
|
||||
? settings["CatchAllName"] : "mail";
|
||||
|
||||
MailAccount mailbox = new MailAccount();
|
||||
mailbox.Name = catchAllName + "@" + domainName;
|
||||
mailbox.PackageId = createdPackageId;
|
||||
|
||||
// gather information from the form
|
||||
mailbox.Enabled = true;
|
||||
|
||||
mailbox.ResponderEnabled = false;
|
||||
mailbox.ReplyTo = "";
|
||||
mailbox.ResponderSubject = "";
|
||||
mailbox.ResponderMessage = "";
|
||||
|
||||
// password
|
||||
mailbox.Password = password;
|
||||
|
||||
// redirection
|
||||
mailbox.ForwardingAddresses = new string[] { };
|
||||
mailbox.DeleteOnForward = false;
|
||||
mailbox.MaxMailboxSize = 0;
|
||||
|
||||
int mailAccountId = MailServerController.AddMailAccount(mailbox);
|
||||
|
||||
if (mailAccountId < 0)
|
||||
{
|
||||
// rollback wizard
|
||||
Rollback();
|
||||
|
||||
// return
|
||||
return mailAccountId;
|
||||
}
|
||||
|
||||
// set catch-all account
|
||||
MailDomain mailDomain = MailServerController.GetMailDomain(createdPackageId, domainName);
|
||||
mailDomain.CatchAllAccount = "mail";
|
||||
mailDomain.PostmasterAccount = "mail";
|
||||
mailDomain.AbuseAccount = "mail";
|
||||
MailServerController.UpdateMailDomain(mailDomain);
|
||||
|
||||
int mailDomainId = mailDomain.Id;
|
||||
|
||||
// set mail domain pointer
|
||||
// load domain instant alias
|
||||
string instantAlias = ServerController.GetDomainAlias(createdPackageId, domainName);
|
||||
DomainInfo instantDomain = ServerController.GetDomain(instantAlias);
|
||||
if (instantDomain == null || instantDomain.MailDomainId > 0)
|
||||
instantAlias = "";
|
||||
|
||||
if (!String.IsNullOrEmpty(instantAlias))
|
||||
MailServerController.AddMailDomainPointer(mailDomainId, instantDomain.DomainId);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
// rollback wizard
|
||||
Rollback();
|
||||
|
||||
// error while creating mail account
|
||||
throw new Exception("Could not create mail account", ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// send welcome letters
|
||||
if (sendAccountLetter)
|
||||
{
|
||||
int result = PackageController.SendAccountSummaryLetter(createdUserId, null, null, true);
|
||||
if (result < 0)
|
||||
{
|
||||
// rollback wizard
|
||||
Rollback();
|
||||
|
||||
// return
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
if (createPackage && sendPackageLetter)
|
||||
{
|
||||
int result = PackageController.SendPackageSummaryLetter(createdPackageId, null, null, true);
|
||||
if (result < 0)
|
||||
{
|
||||
// rollback wizard
|
||||
Rollback();
|
||||
|
||||
// return
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
return createdUserId;
|
||||
}
|
||||
|
||||
public void Rollback()
|
||||
{
|
||||
if (userCreated)
|
||||
{
|
||||
// delete user account and all its packages
|
||||
UserController.DeleteUser(createdUserId);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue