IceWarp fixes and improvements

This commit is contained in:
Olov Karlsson 2015-04-14 11:53:16 +02:00
parent 414414b11d
commit 3feba6e7ec
3 changed files with 287 additions and 192 deletions

View file

@ -31,6 +31,7 @@ using System.IO;
using System.Net.Mail; using System.Net.Mail;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq; using System.Linq;
using System.Runtime.InteropServices;
using System.Text; using System.Text;
using System.Text.RegularExpressions; using System.Text.RegularExpressions;
using Microsoft.Win32; using Microsoft.Win32;
@ -38,7 +39,7 @@ using WebsitePanel.Server.Utils;
namespace WebsitePanel.Providers.Mail namespace WebsitePanel.Providers.Mail
{ {
public class IceWarp : HostingServiceProviderBase, IMailServer public class IceWarp : HostingServiceProviderBase, IMailServer, IDisposable
{ {
protected const string API_PROGID = "IceWarpServer.APIObject"; protected const string API_PROGID = "IceWarpServer.APIObject";
protected const string DOMAIN_PROGID = "IceWarpServer.DomainObject"; protected const string DOMAIN_PROGID = "IceWarpServer.DomainObject";
@ -46,7 +47,7 @@ namespace WebsitePanel.Providers.Mail
private dynamic _currentApiObject = null; private dynamic _currentApiObject = null;
#region IceWarp Enums #region Protected Enums
protected enum IceWarpErrorCode protected enum IceWarpErrorCode
{ {
@ -109,8 +110,8 @@ namespace WebsitePanel.Providers.Mail
get get
{ {
var apiObject = GetApiObject(); var apiObject = GetApiObject();
var adresses = ((object) apiObject.GetProperty("C_System_Services_BindIPAddress")); var adresses = ((object)apiObject.GetProperty("C_System_Services_BindIPAddress"));
return adresses == null ? "" : adresses.ToString().Split(new[] {';'}, StringSplitOptions.RemoveEmptyEntries).FirstOrDefault(); return adresses == null ? "" : adresses.ToString().Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries).FirstOrDefault();
} }
} }
@ -119,7 +120,7 @@ namespace WebsitePanel.Providers.Mail
get get
{ {
var apiObject = GetApiObject(); var apiObject = GetApiObject();
return Convert.ToBoolean((object) apiObject.GetProperty("C_Accounts_Global_Domains_UseDiskQuota")); return Convert.ToBoolean((object)apiObject.GetProperty("C_Accounts_Global_Domains_UseDiskQuota"));
} }
} }
@ -128,7 +129,7 @@ namespace WebsitePanel.Providers.Mail
get get
{ {
var apiObject = GetApiObject(); var apiObject = GetApiObject();
return Convert.ToBoolean((object) apiObject.GetProperty("C_Accounts_Global_Domains_UseDomainLimits")); return Convert.ToBoolean((object)apiObject.GetProperty("C_Accounts_Global_Domains_UseDomainLimits"));
} }
} }
@ -137,7 +138,7 @@ namespace WebsitePanel.Providers.Mail
get get
{ {
var apiObject = GetApiObject(); var apiObject = GetApiObject();
return Convert.ToBoolean((object) apiObject.GetProperty("C_Accounts_Global_Domains_UseUserLimits")); return Convert.ToBoolean((object)apiObject.GetProperty("C_Accounts_Global_Domains_UseUserLimits"));
} }
} }
@ -146,7 +147,7 @@ namespace WebsitePanel.Providers.Mail
get get
{ {
var apiObject = GetApiObject(); var apiObject = GetApiObject();
return Convert.ToBoolean((object) apiObject.GetProperty("C_Accounts_Global_Domains_OverrideGlobal")); return Convert.ToBoolean((object)apiObject.GetProperty("C_Accounts_Global_Domains_OverrideGlobal"));
} }
} }
@ -155,7 +156,7 @@ namespace WebsitePanel.Providers.Mail
get get
{ {
var apiObject = GetApiObject(); var apiObject = GetApiObject();
return Convert.ToInt32((object) apiObject.GetProperty("C_Mail_SMTP_Delivery_MaxMsgSize"))/1024/1024; return Convert.ToInt32((object)apiObject.GetProperty("C_Mail_SMTP_Delivery_MaxMsgSize")) / 1024 / 1024;
} }
} }
@ -194,7 +195,7 @@ namespace WebsitePanel.Providers.Mail
protected static string GetErrorMessage(int errorCode) protected static string GetErrorMessage(int errorCode)
{ {
switch ((IceWarpErrorCode) errorCode) switch ((IceWarpErrorCode)errorCode)
{ {
case IceWarpErrorCode.S_OK: case IceWarpErrorCode.S_OK:
return "OK"; return "OK";
@ -248,6 +249,11 @@ namespace WebsitePanel.Providers.Mail
} }
} }
protected void DisposeObject(object obj)
{
Marshal.FinalReleaseComObject(obj);
}
protected dynamic GetApiObject() protected dynamic GetApiObject()
{ {
if (_currentApiObject != null) return _currentApiObject; if (_currentApiObject != null) return _currentApiObject;
@ -386,6 +392,8 @@ namespace WebsitePanel.Providers.Mail
} }
} }
DisposeObject(accountObject);
return mailAccounts.ToArray(); return mailAccounts.ToArray();
} }
@ -399,7 +407,7 @@ namespace WebsitePanel.Providers.Mail
apiObject.SetProperty("C_Accounts_Global_Domains_WarnMailboxUsage", ProviderSettings["WarnMailboxUsage"]); apiObject.SetProperty("C_Accounts_Global_Domains_WarnMailboxUsage", ProviderSettings["WarnMailboxUsage"]);
apiObject.SetProperty("C_Accounts_Global_Domains_WarnDomainSize", ProviderSettings["WarnDomainSize"]); apiObject.SetProperty("C_Accounts_Global_Domains_WarnDomainSize", ProviderSettings["WarnDomainSize"]);
apiObject.SetProperty("C_Mail_SMTP_Delivery_MaxMsgSize", Convert.ToInt32(ProviderSettings["MaxMessageSize"])*1024*1024); apiObject.SetProperty("C_Mail_SMTP_Delivery_MaxMsgSize", Convert.ToInt32(ProviderSettings["MaxMessageSize"]) * 1024 * 1024);
apiObject.SetProperty("C_Mail_SMTP_Delivery_LimitMsgSize", Convert.ToInt32(ProviderSettings["MaxMessageSize"]) > 0); apiObject.SetProperty("C_Mail_SMTP_Delivery_LimitMsgSize", Convert.ToInt32(ProviderSettings["MaxMessageSize"]) > 0);
SaveApiSetting(apiObject); SaveApiSetting(apiObject);
@ -407,11 +415,11 @@ namespace WebsitePanel.Providers.Mail
#endregion #endregion
#region IHostingServiceProvier methods #region IHostingServiceProvier methods
public override SettingPair[] GetProviderDefaultSettings() public override SettingPair[] GetProviderDefaultSettings()
{ {
var settings = new [] var settings = new[]
{ {
new SettingPair("UseDomainDiskQuota", UseDomainDiskQuota.ToString()), new SettingPair("UseDomainDiskQuota", UseDomainDiskQuota.ToString()),
new SettingPair("UseDomainLimits", UseDomainLimits.ToString()), new SettingPair("UseDomainLimits", UseDomainLimits.ToString()),
@ -423,8 +431,8 @@ namespace WebsitePanel.Providers.Mail
new SettingPair("ServerIpAddress", BindIpAddress) new SettingPair("ServerIpAddress", BindIpAddress)
}; };
return settings; return settings;
} }
public override string[] Install() public override string[] Install()
{ {
@ -433,25 +441,25 @@ namespace WebsitePanel.Providers.Mail
} }
public override void ChangeServiceItemsState(ServiceProviderItem[] items, bool enabled) public override void ChangeServiceItemsState(ServiceProviderItem[] items, bool enabled)
{ {
foreach (var item in items.OfType<MailDomain>()) foreach (var item in items.OfType<MailDomain>())
{ {
try try
{ {
// enable/disable mail domain // enable/disable mail domain
if (DomainExists(item.Name)) if (DomainExists(item.Name))
{ {
var mailDomain = GetDomain(item.Name); var mailDomain = GetDomain(item.Name);
mailDomain.Enabled = enabled; mailDomain.Enabled = enabled;
UpdateDomain(mailDomain); UpdateDomain(mailDomain);
} }
} }
catch (Exception ex) catch (Exception ex)
{ {
Log.WriteError(String.Format("Error switching '{0}' IceWarp domain", item.Name), ex); Log.WriteError(String.Format("Error switching '{0}' IceWarp domain", item.Name), ex);
} }
} }
} }
public override void DeleteServiceItems(ServiceProviderItem[] items) public override void DeleteServiceItems(ServiceProviderItem[] items)
{ {
@ -470,64 +478,69 @@ namespace WebsitePanel.Providers.Mail
} }
public override ServiceProviderItemDiskSpace[] GetServiceItemsDiskSpace(ServiceProviderItem[] items) public override ServiceProviderItemDiskSpace[] GetServiceItemsDiskSpace(ServiceProviderItem[] items)
{ {
var itemsDiskspace = new List<ServiceProviderItemDiskSpace>(); var itemsDiskspace = new List<ServiceProviderItemDiskSpace>();
// update items with diskspace var accountObject = GetAccountObject();
foreach (var item in items.OfType<MailAccount>())
{
try
{
Log.WriteStart(String.Format("Calculating mail account '{0}' size", item.Name));
// calculate disk space
var accountObject = GetAccountObject(item.Name);
var size = Convert.ToInt64((object)accountObject.GetProperty("U_MailboxSize")) * 1024;
var diskspace = new ServiceProviderItemDiskSpace {ItemId = item.Id, DiskSpace = size}; // update items with diskspace
itemsDiskspace.Add(diskspace); foreach (var item in items.OfType<MailAccount>())
Log.WriteEnd(String.Format("Calculating mail account '{0}' size", item.Name)); {
} try
catch (Exception ex) {
{ Log.WriteStart(String.Format("Calculating mail account '{0}' size", item.Name));
Log.WriteError(ex); // calculate disk space
} accountObject.Open(item.Name);
} var size = Convert.ToInt64((object)accountObject.GetProperty("U_MailboxSize")) * 1024;
return itemsDiskspace.ToArray();
}
public override ServiceProviderItemBandwidth[] GetServiceItemsBandwidth(ServiceProviderItem[] items, DateTime since) var diskspace = new ServiceProviderItemDiskSpace { ItemId = item.Id, DiskSpace = size };
{ itemsDiskspace.Add(diskspace);
var itemsBandwidth = new ServiceProviderItemBandwidth[items.Length];
// update items with diskspace Log.WriteEnd(String.Format("Calculating mail account '{0}' size", item.Name));
for (int i = 0; i < items.Length; i++) }
{ catch (Exception ex)
ServiceProviderItem item = items[i]; {
Log.WriteError(ex);
}
}
// create new bandwidth object DisposeObject(accountObject);
itemsBandwidth[i] = new ServiceProviderItemBandwidth
{ return itemsDiskspace.ToArray();
ItemId = item.Id, }
public override ServiceProviderItemBandwidth[] GetServiceItemsBandwidth(ServiceProviderItem[] items, DateTime since)
{
var itemsBandwidth = new ServiceProviderItemBandwidth[items.Length];
// update items with bandwidth
for (var i = 0; i < items.Length; i++)
{
var item = items[i];
// create new bandwidth object
itemsBandwidth[i] = new ServiceProviderItemBandwidth
{
ItemId = item.Id,
Days = new DailyStatistics[0] Days = new DailyStatistics[0]
}; };
if (item is MailDomain) if (!(item is MailDomain)) continue;
{
try
{
// get daily statistics
itemsBandwidth[i].Days = GetDailyStatistics(since, item.Name);
}
catch (Exception ex)
{
Log.WriteError(ex);
System.Diagnostics.Debug.WriteLine(ex);
}
}
}
return itemsBandwidth; try
} {
// get daily statistics
itemsBandwidth[i].Days = GetDailyStatistics(since, item.Name);
}
catch (Exception ex)
{
Log.WriteError(ex);
System.Diagnostics.Debug.WriteLine(ex);
}
}
return itemsBandwidth;
}
public DailyStatistics[] GetDailyStatistics(DateTime since, string maildomainName) public DailyStatistics[] GetDailyStatistics(DateTime since, string maildomainName)
{ {
@ -568,8 +581,8 @@ namespace WebsitePanel.Providers.Mail
Year = date.Year, Year = date.Year,
Month = date.Month, Month = date.Month,
Day = date.Day, Day = date.Day,
BytesSent = Convert.ToInt64(fields[mailSentField])*1024, BytesSent = Convert.ToInt64(fields[mailSentField]) * 1024,
BytesReceived = Convert.ToInt64(fields[mailReceivedField])*1024 BytesReceived = Convert.ToInt64(fields[mailReceivedField]) * 1024
}; };
days.Add(dailyStats); days.Add(dailyStats);
continue; continue;
@ -618,7 +631,7 @@ namespace WebsitePanel.Providers.Mail
// Checking for version 10.4.0 (released 2012-03-21) or newer // Checking for version 10.4.0 (released 2012-03-21) or newer
// This version introduced L_ListFile_Contents, G_ListFile_Contents and M_ListFileContents that is the latest API variable used by this provider // This version introduced L_ListFile_Contents, G_ListFile_Contents and M_ListFileContents that is the latest API variable used by this provider
var split = version.Split(new[] {'.'}); var split = version.Split(new[] { '.' });
var majorVersion = Convert.ToInt32(split[0]); var majorVersion = Convert.ToInt32(split[0]);
var minVersion = Convert.ToInt32(split[1]); var minVersion = Convert.ToInt32(split[1]);
@ -636,32 +649,34 @@ namespace WebsitePanel.Providers.Mail
public string[] GetDomains() public string[] GetDomains()
{ {
var api = GetApiObject(); var api = GetApiObject();
return api.GetDomainList().Split(new[] {';'}, StringSplitOptions.RemoveEmptyEntries); return api.GetDomainList().Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
} }
public MailDomain GetDomain(string domainName) public MailDomain GetDomain(string domainName)
{ {
var domain = GetDomainObject(domainName); var domainObject = GetDomainObject(domainName);
var mailDomain = new MailDomain var mailDomain = new MailDomain
{ {
Name = domain.Name, Name = domainObject.Name,
PostmasterAccount = domain.GetProperty("D_AdminEmail"), PostmasterAccount = domainObject.GetProperty("D_AdminEmail"),
CatchAllAccount = domain.GetProperty("D_UnknownForwardTo"), CatchAllAccount = domainObject.GetProperty("D_UnknownForwardTo"),
Enabled = Convert.ToBoolean((object) domain.GetProperty("D_DisableLogin")), Enabled = Convert.ToBoolean((object)domainObject.GetProperty("D_DisableLogin")),
MaxDomainSizeInMB = Convert.ToInt32((object) domain.GetProperty("D_DiskQuota"))/1024, MaxDomainSizeInMB = Convert.ToInt32((object)domainObject.GetProperty("D_DiskQuota")) / 1024,
MaxDomainUsers = Convert.ToInt32((object) domain.GetProperty("D_AccountNumber")), MaxDomainUsers = Convert.ToInt32((object)domainObject.GetProperty("D_AccountNumber")),
MegaByteSendLimit = Convert.ToInt32((object) domain.GetProperty("D_VolumeLimit"))/1024, MegaByteSendLimit = Convert.ToInt32((object)domainObject.GetProperty("D_VolumeLimit")) / 1024,
NumberSendLimit = Convert.ToInt32((object) domain.GetProperty("D_NumberLimit")), NumberSendLimit = Convert.ToInt32((object)domainObject.GetProperty("D_NumberLimit")),
DefaultUserQuotaInMB = Convert.ToInt32((object) domain.GetProperty("D_UserMailbox"))/1024, DefaultUserQuotaInMB = Convert.ToInt32((object)domainObject.GetProperty("D_UserMailbox")) / 1024,
DefaultUserMaxMessageSizeMegaByte = Convert.ToInt32((object) domain.GetProperty("D_UserMsg"))/1024, DefaultUserMaxMessageSizeMegaByte = Convert.ToInt32((object)domainObject.GetProperty("D_UserMsg")) / 1024,
DefaultUserMegaByteSendLimit = Convert.ToInt32((object) domain.GetProperty("D_UserMB")), DefaultUserMegaByteSendLimit = Convert.ToInt32((object)domainObject.GetProperty("D_UserMB")),
DefaultUserNumberSendLimit = Convert.ToInt32((object) domain.GetProperty("D_UserNumber")), DefaultUserNumberSendLimit = Convert.ToInt32((object)domainObject.GetProperty("D_UserNumber")),
UseDomainDiskQuota = Convert.ToBoolean(ProviderSettings["UseDomainDiskQuota"]), UseDomainDiskQuota = Convert.ToBoolean(ProviderSettings["UseDomainDiskQuota"]),
UseDomainLimits = Convert.ToBoolean(ProviderSettings["UseDomainLimits"]), UseDomainLimits = Convert.ToBoolean(ProviderSettings["UseDomainLimits"]),
UseUserLimits = Convert.ToBoolean(ProviderSettings["UseUserLimits"]) UseUserLimits = Convert.ToBoolean(ProviderSettings["UseUserLimits"])
}; };
DisposeObject(domainObject);
return mailDomain; return mailDomain;
} }
@ -685,6 +700,8 @@ namespace WebsitePanel.Providers.Mail
SaveDomain(domainObject); SaveDomain(domainObject);
DisposeObject(domainObject);
UpdateDomain(domain); UpdateDomain(domain);
} }
@ -706,17 +723,19 @@ namespace WebsitePanel.Providers.Mail
} }
domainObject.SetProperty("D_DisableLogin", !domain.Enabled); domainObject.SetProperty("D_DisableLogin", !domain.Enabled);
domainObject.SetProperty("D_DiskQuota", domain.MaxDomainSizeInMB*1024); domainObject.SetProperty("D_DiskQuota", domain.MaxDomainSizeInMB * 1024);
domainObject.SetProperty("D_AccountNumber", domain.MaxDomainUsers); domainObject.SetProperty("D_AccountNumber", domain.MaxDomainUsers);
domainObject.SetProperty("D_VolumeLimit", domain.MegaByteSendLimit*1024); domainObject.SetProperty("D_VolumeLimit", domain.MegaByteSendLimit * 1024);
domainObject.SetProperty("D_NumberLimit", domain.NumberSendLimit); domainObject.SetProperty("D_NumberLimit", domain.NumberSendLimit);
domainObject.SetProperty("D_UserMailbox", domain.DefaultUserQuotaInMB*1024); domainObject.SetProperty("D_UserMailbox", domain.DefaultUserQuotaInMB * 1024);
domainObject.SetProperty("D_UserMsg", domain.DefaultUserMaxMessageSizeMegaByte*1024); domainObject.SetProperty("D_UserMsg", domain.DefaultUserMaxMessageSizeMegaByte * 1024);
domainObject.SetProperty("D_UserMB", domain.DefaultUserMegaByteSendLimit); domainObject.SetProperty("D_UserMB", domain.DefaultUserMegaByteSendLimit);
domainObject.SetProperty("D_UserNumber", domain.DefaultUserNumberSendLimit); domainObject.SetProperty("D_UserNumber", domain.DefaultUserNumberSendLimit);
SaveDomain(domainObject); SaveDomain(domainObject);
DisposeObject(domainObject);
} }
public void DeleteDomain(string domainName) public void DeleteDomain(string domainName)
@ -732,6 +751,8 @@ namespace WebsitePanel.Providers.Mail
{ {
Log.WriteError("Could not delete domain" + GetErrorMessage(domainObject.LastErr), null); Log.WriteError("Could not delete domain" + GetErrorMessage(domainObject.LastErr), null);
} }
DisposeObject(domainObject);
} }
#endregion #endregion
@ -747,7 +768,11 @@ namespace WebsitePanel.Providers.Mail
var domainObject = GetDomainObject(aliasName); var domainObject = GetDomainObject(aliasName);
return Convert.ToInt32((object) domainObject.GetProperty("D_Type")) == 2 && string.Compare(domainObject.GetProperty("D_DomainValue").ToString(), domainName, true) == 0; var result = Convert.ToInt32((object)domainObject.GetProperty("D_Type")) == 2 && string.Compare(domainObject.GetProperty("D_DomainValue").ToString(), domainName, true) == 0;
DisposeObject(domainObject);
return result;
} }
public string[] GetDomainAliases(string domainName) public string[] GetDomainAliases(string domainName)
@ -772,13 +797,15 @@ namespace WebsitePanel.Providers.Mail
public void AddDomainAlias(string domainName, string aliasName) public void AddDomainAlias(string domainName, string aliasName)
{ {
var mailDomain = new MailDomain {Name = aliasName}; var mailDomain = new MailDomain { Name = aliasName };
CreateDomain(mailDomain); CreateDomain(mailDomain);
var domainObject = GetDomainObject(aliasName); var domainObject = GetDomainObject(aliasName);
domainObject.SetProperty("D_Type", 2); domainObject.SetProperty("D_Type", 2);
domainObject.SetProperty("D_DomainValue", domainName); domainObject.SetProperty("D_DomainValue", domainName);
SaveDomain(domainObject); SaveDomain(domainObject);
DisposeObject(domainObject);
} }
public void DeleteDomainAlias(string domainName, string aliasName) public void DeleteDomainAlias(string domainName, string aliasName)
@ -794,7 +821,11 @@ namespace WebsitePanel.Providers.Mail
{ {
var accountObject = GetAccountObject(); var accountObject = GetAccountObject();
return accountObject.Open(mailboxName) && Convert.ToInt32((object) accountObject.GetProperty("U_Type")) == (int) IceWarpAccountType.User; var result = accountObject.Open(mailboxName) && Convert.ToInt32((object)accountObject.GetProperty("U_Type")) == (int)IceWarpAccountType.User;
DisposeObject(accountObject);
return result;
} }
protected class IceWarpResponderContent protected class IceWarpResponderContent
@ -840,35 +871,35 @@ namespace WebsitePanel.Providers.Mail
return result; return result;
} }
protected static MailAccount CreateMailAccountFromAccountObject(dynamic accountObject) protected MailAccount CreateMailAccountFromAccountObject(dynamic accountObject)
{ {
var mailAccount = new MailAccount var mailAccount = new MailAccount
{ {
Name = accountObject.EmailAddress, Name = accountObject.EmailAddress,
FullName = accountObject.GetProperty("U_Name"), FullName = accountObject.GetProperty("U_Name"),
Enabled = Convert.ToInt32((object) accountObject.GetProperty("U_AccountDisabled")) == 0, Enabled = Convert.ToInt32((object)accountObject.GetProperty("U_AccountDisabled")) == 0,
ForwardingEnabled = !string.IsNullOrWhiteSpace(accountObject.GetProperty("U_ForwardTo")) || string.IsNullOrWhiteSpace(accountObject.GetProperty("U_RemoteAddress")) && Convert.ToBoolean((object) accountObject.GetProperty("U_UseRemoteAddress")), ForwardingEnabled = !string.IsNullOrWhiteSpace(accountObject.GetProperty("U_ForwardTo")) || string.IsNullOrWhiteSpace(accountObject.GetProperty("U_RemoteAddress")) && Convert.ToBoolean((object)accountObject.GetProperty("U_UseRemoteAddress")),
IsDomainAdmin = Convert.ToBoolean((object) accountObject.GetProperty("U_DomainAdmin")), IsDomainAdmin = Convert.ToBoolean((object)accountObject.GetProperty("U_DomainAdmin")),
MaxMailboxSize = Convert.ToBoolean((object) accountObject.GetProperty("U_MaxBox")) ? Convert.ToInt32((object) accountObject.GetProperty("U_MaxBoxSize"))/1024 : 0, MaxMailboxSize = Convert.ToBoolean((object)accountObject.GetProperty("U_MaxBox")) ? Convert.ToInt32((object)accountObject.GetProperty("U_MaxBoxSize")) / 1024 : 0,
Password = accountObject.GetProperty("U_Password"), Password = accountObject.GetProperty("U_Password"),
ResponderEnabled = Convert.ToInt32((object) accountObject.GetProperty("U_Respond")) > 0, ResponderEnabled = Convert.ToInt32((object)accountObject.GetProperty("U_Respond")) > 0,
QuotaUsed = Convert.ToInt64((object) accountObject.GetProperty("U_MailBoxSize")), QuotaUsed = Convert.ToInt64((object)accountObject.GetProperty("U_MailBoxSize")),
MaxMessageSizeMegaByte = Convert.ToInt32((object) accountObject.GetProperty("U_MaxMessageSize"))/1024, MaxMessageSizeMegaByte = Convert.ToInt32((object)accountObject.GetProperty("U_MaxMessageSize")) / 1024,
MegaByteSendLimit = Convert.ToInt32((object) accountObject.GetProperty("U_MegabyteSendLimit")), MegaByteSendLimit = Convert.ToInt32((object)accountObject.GetProperty("U_MegabyteSendLimit")),
NumberSendLimit = Convert.ToInt32((object) accountObject.GetProperty("U_NumberSendLimit")), NumberSendLimit = Convert.ToInt32((object)accountObject.GetProperty("U_NumberSendLimit")),
DeleteOlder = Convert.ToBoolean((object) accountObject.GetProperty("U_DeleteOlder")), DeleteOlder = Convert.ToBoolean((object)accountObject.GetProperty("U_DeleteOlder")),
DeleteOlderDays = Convert.ToInt32((object) accountObject.GetProperty("U_DeleteOlderDays")), DeleteOlderDays = Convert.ToInt32((object)accountObject.GetProperty("U_DeleteOlderDays")),
ForwardOlder = Convert.ToBoolean((object) accountObject.GetProperty("U_ForwardOlder")), ForwardOlder = Convert.ToBoolean((object)accountObject.GetProperty("U_ForwardOlder")),
ForwardOlderDays = Convert.ToInt32((object) accountObject.GetProperty("U_ForwardOlderDays")), ForwardOlderDays = Convert.ToInt32((object)accountObject.GetProperty("U_ForwardOlderDays")),
ForwardOlderTo = accountObject.GetProperty("U_ForwardOlderTo"), ForwardOlderTo = accountObject.GetProperty("U_ForwardOlderTo"),
IceWarpAccountState = Convert.ToInt32((object) accountObject.GetProperty("U_AccountDisabled")), IceWarpAccountState = Convert.ToInt32((object)accountObject.GetProperty("U_AccountDisabled")),
IceWarpAccountType = Convert.ToInt32((object) accountObject.GetProperty("U_AccountType")), IceWarpAccountType = Convert.ToInt32((object)accountObject.GetProperty("U_AccountType")),
IceWarpRespondType = Convert.ToInt32((object) accountObject.GetProperty("U_Respond")) IceWarpRespondType = Convert.ToInt32((object)accountObject.GetProperty("U_Respond"))
}; };
if (mailAccount.ForwardingEnabled) if (mailAccount.ForwardingEnabled)
{ {
mailAccount.ForwardingAddresses = new string[] {accountObject.GetProperty("U_ForwardTo") + accountObject.GetProperty("U_RemoteAddress")}; mailAccount.ForwardingAddresses = new string[] { accountObject.GetProperty("U_ForwardTo") + accountObject.GetProperty("U_RemoteAddress") };
mailAccount.DeleteOnForward = Convert.ToInt32(accountObject.GetProperty("U_UseRemoteAddress")) == 1; mailAccount.DeleteOnForward = Convert.ToInt32(accountObject.GetProperty("U_UseRemoteAddress")) == 1;
mailAccount.RetainLocalCopy = !mailAccount.DeleteOnForward; mailAccount.RetainLocalCopy = !mailAccount.DeleteOnForward;
} }
@ -889,7 +920,7 @@ namespace WebsitePanel.Providers.Mail
mailAccount.RespondTo = respondTo; mailAccount.RespondTo = respondTo;
} }
mailAccount.RespondPeriodInDays = Convert.ToInt32((object) accountObject.GetProperty("U_RespondPeriod")); mailAccount.RespondPeriodInDays = Convert.ToInt32((object)accountObject.GetProperty("U_RespondPeriod"));
var responderContent = ParseResponderContent(accountObject.GetProperty("U_ResponderContent")); var responderContent = ParseResponderContent(accountObject.GetProperty("U_ResponderContent"));
mailAccount.ResponderMessage = responderContent.Content; mailAccount.ResponderMessage = responderContent.Content;
mailAccount.ResponderSubject = responderContent.Subject; mailAccount.ResponderSubject = responderContent.Subject;
@ -907,7 +938,11 @@ namespace WebsitePanel.Providers.Mail
public MailAccount GetAccount(string mailboxName) public MailAccount GetAccount(string mailboxName)
{ {
var accountObject = GetAccountObject(mailboxName); var accountObject = GetAccountObject(mailboxName);
return CreateMailAccountFromAccountObject(accountObject); var account = CreateMailAccountFromAccountObject(accountObject);
DisposeObject(accountObject);
return account;
} }
public void CreateAccount(MailAccount mailbox) public void CreateAccount(MailAccount mailbox)
@ -924,10 +959,12 @@ namespace WebsitePanel.Providers.Mail
if (accountObject.New(mailbox.Name)) if (accountObject.New(mailbox.Name))
{ {
accountObject.SetProperty("U_Password", mailbox.Password);
accountObject.Save(); accountObject.Save();
UpdateAccount(mailbox);
} }
UpdateAccount(mailbox); DisposeObject(accountObject);
} }
public void UpdateAccount(MailAccount mailbox) public void UpdateAccount(MailAccount mailbox)
@ -937,10 +974,15 @@ namespace WebsitePanel.Providers.Mail
accountObject.SetProperty("U_Name", mailbox.FullName); accountObject.SetProperty("U_Name", mailbox.FullName);
accountObject.SetProperty("U_AccountDisabled", mailbox.IceWarpAccountState); accountObject.SetProperty("U_AccountDisabled", mailbox.IceWarpAccountState);
accountObject.SetProperty("U_DomainAdmin", mailbox.IsDomainAdmin); accountObject.SetProperty("U_DomainAdmin", mailbox.IsDomainAdmin);
accountObject.SetProperty("U_Password", mailbox.Password);
accountObject.SetProperty("U_MaxBoxSize", mailbox.MaxMailboxSize*1024); if (mailbox.ChangePassword)
{
accountObject.SetProperty("U_Password", mailbox.Password);
}
accountObject.SetProperty("U_MaxBoxSize", mailbox.MaxMailboxSize * 1024);
accountObject.SetProperty("U_MaxBox", mailbox.MaxMailboxSize > 0 ? "1" : "0"); accountObject.SetProperty("U_MaxBox", mailbox.MaxMailboxSize > 0 ? "1" : "0");
accountObject.SetProperty("U_MaxMessageSize", mailbox.MaxMessageSizeMegaByte*1024); accountObject.SetProperty("U_MaxMessageSize", mailbox.MaxMessageSizeMegaByte * 1024);
accountObject.SetProperty("U_MegabyteSendLimit", mailbox.MegaByteSendLimit); accountObject.SetProperty("U_MegabyteSendLimit", mailbox.MegaByteSendLimit);
accountObject.SetProperty("U_NumberSendLimit", mailbox.NumberSendLimit); accountObject.SetProperty("U_NumberSendLimit", mailbox.NumberSendLimit);
accountObject.SetProperty("U_AccountType", mailbox.IceWarpAccountType); accountObject.SetProperty("U_AccountType", mailbox.IceWarpAccountType);
@ -1000,6 +1042,8 @@ namespace WebsitePanel.Providers.Mail
} }
SaveAccount(accountObject); SaveAccount(accountObject);
DisposeObject(accountObject);
} }
public void DeleteAccount(string mailboxName) public void DeleteAccount(string mailboxName)
@ -1014,6 +1058,8 @@ namespace WebsitePanel.Providers.Mail
{ {
Log.WriteError("Cannot delete account: " + GetErrorMessage(accountObject.LastErr), null); Log.WriteError("Cannot delete account: " + GetErrorMessage(accountObject.LastErr), null);
} }
DisposeObject(accountObject);
} }
#endregion #endregion
@ -1024,7 +1070,11 @@ namespace WebsitePanel.Providers.Mail
{ {
var accountObject = GetAccountObject(); var accountObject = GetAccountObject();
return accountObject.Open(mailAliasName); var result = accountObject.Open(mailAliasName);
DisposeObject(accountObject);
return result;
} }
protected IEnumerable<string> GetAliasListFromAccountObject(dynamic accountObject) protected IEnumerable<string> GetAliasListFromAccountObject(dynamic accountObject)
@ -1056,12 +1106,14 @@ namespace WebsitePanel.Providers.Mail
{ {
var forwardTo = GetForwardToAddressFromAccountObject(accountObject); var forwardTo = GetForwardToAddressFromAccountObject(accountObject);
var aliases = GetAliasListFromAccountObject(accountObject) as IEnumerable<string>; var aliases = GetAliasListFromAccountObject(accountObject) as IEnumerable<string>;
aliasList.AddRange(aliases.Where(a => a + "@" + domainName != forwardTo).Select(alias => new MailAlias {Name = alias + "@" + domainName, ForwardTo = forwardTo})); aliasList.AddRange(aliases.Where(a => a + "@" + domainName != forwardTo).Select(alias => new MailAlias { Name = alias + "@" + domainName, ForwardTo = forwardTo }));
} }
accountObject.FindDone(); accountObject.FindDone();
} }
DisposeObject(accountObject);
return aliasList.ToArray(); return aliasList.ToArray();
} }
@ -1071,7 +1123,11 @@ namespace WebsitePanel.Providers.Mail
var forwardTo = GetForwardToAddressFromAccountObject(accountObject); var forwardTo = GetForwardToAddressFromAccountObject(accountObject);
return new MailAlias {ForwardTo = forwardTo, Name = mailAliasName}; var result = new MailAlias { ForwardTo = forwardTo, Name = mailAliasName };
DisposeObject(accountObject);
return result;
} }
public void CreateMailAlias(MailAlias mailAlias) public void CreateMailAlias(MailAlias mailAlias)
@ -1081,23 +1137,25 @@ namespace WebsitePanel.Providers.Mail
{ {
mailAlias.ForwardingEnabled = true; mailAlias.ForwardingEnabled = true;
mailAlias.DeleteOnForward = true; mailAlias.DeleteOnForward = true;
mailAlias.ForwardingAddresses = new[] {mailAlias.ForwardTo}; mailAlias.ForwardingAddresses = new[] { mailAlias.ForwardTo };
mailAlias.Password = GetRandomPassword(); mailAlias.Password = GetRandomPassword();
CreateAccount(mailAlias); CreateAccount(mailAlias);
} }
// else open account and add alias to list // else open account and add alias to list
else else
{ {
var accountOject = GetAccountObject(mailAlias.ForwardTo); var accountObject = GetAccountObject(mailAlias.ForwardTo);
var aliases = ((IEnumerable<string>) GetAliasListFromAccountObject(accountOject)).ToList(); var aliases = ((IEnumerable<string>)GetAliasListFromAccountObject(accountObject)).ToList();
aliases.Add(GetEmailUser(mailAlias.Name)); aliases.Add(GetEmailUser(mailAlias.Name));
accountOject.SetProperty("U_EmailAlias", string.Join(";", aliases)); accountObject.SetProperty("U_EmailAlias", string.Join(";", aliases));
SaveAccount(accountOject, "account when creating mail alias"); SaveAccount(accountObject, "account when creating mail alias");
DisposeObject(accountObject);
} }
} }
private string GetRandowChars(string chars, int length) private static string GetRandowChars(string chars, int length)
{ {
var random = new Random(); var random = new Random();
return new string(Enumerable.Repeat(chars, length).Select(s => s[random.Next(s.Length)]).ToArray()); return new string(Enumerable.Repeat(chars, length).Select(s => s[random.Next(s.Length)]).ToArray());
@ -1112,7 +1170,7 @@ namespace WebsitePanel.Providers.Mail
var alpha = apiObject.GetProperty("C_Accounts_Policies_Pass_Alpha"); var alpha = apiObject.GetProperty("C_Accounts_Policies_Pass_Alpha");
return System.Web.Security.Membership.GeneratePassword(minLength, nonAlphaNum) + return System.Web.Security.Membership.GeneratePassword(minLength, nonAlphaNum) +
GetRandowChars("0123456789", digits)+ GetRandowChars("0123456789", digits) +
GetRandowChars("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", alpha); GetRandowChars("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ", alpha);
} }
@ -1137,11 +1195,13 @@ namespace WebsitePanel.Providers.Mail
accountObject.SetProperty("U_EmailAlias", string.Join(";", otherAliases)); accountObject.SetProperty("U_EmailAlias", string.Join(";", otherAliases));
SaveAccount(accountObject, "account during alias delete"); SaveAccount(accountObject, "account during alias delete");
} }
// If no other aliases, this should be an account with a remote address and then we should delete the account // If no other aliases, this should be an account with a remote address and then we should delete the account
else else
{ {
DeleteAccount(mailAliasName); DeleteAccount(mailAliasName);
} }
DisposeObject(accountObject);
} }
#endregion #endregion
@ -1152,7 +1212,11 @@ namespace WebsitePanel.Providers.Mail
{ {
var accountObject = GetAccountObject(); var accountObject = GetAccountObject();
return accountObject.Open(groupName) && Convert.ToInt32(accountObject.GetProperty("U_Type")) == 7; var result = accountObject.Open(groupName) && (IceWarpAccountType)Enum.Parse(typeof(IceWarpAccountType), ((object)accountObject.GetProperty("U_Type")).ToString()) == IceWarpAccountType.UserGroup;
DisposeObject(accountObject);
return result;
} }
public MailGroup[] GetGroups(string domainName) public MailGroup[] GetGroups(string domainName)
@ -1165,7 +1229,7 @@ namespace WebsitePanel.Providers.Mail
var mailGroup = new MailGroup var mailGroup = new MailGroup
{ {
Name = accountObject.EmailAddress, Name = accountObject.EmailAddress,
Enabled = Convert.ToInt32((object) accountObject.GetProperty("U_AccountDisabled")) == 0, Enabled = Convert.ToInt32((object)accountObject.GetProperty("U_AccountDisabled")) == 0,
GroupName = accountObject.GetProperty("G_Name"), GroupName = accountObject.GetProperty("G_Name"),
Members = ((IEnumerable<string>)SplitFileContents(accountObject, "G_ListFile_Contents")).ToArray() Members = ((IEnumerable<string>)SplitFileContents(accountObject, "G_ListFile_Contents")).ToArray()
}; };
@ -1176,7 +1240,11 @@ namespace WebsitePanel.Providers.Mail
public MailGroup GetGroup(string groupName) public MailGroup GetGroup(string groupName)
{ {
var accountObject = GetAccountObject(groupName); var accountObject = GetAccountObject(groupName);
return CreateMailGroupFromAccountObject(accountObject); var result = CreateMailGroupFromAccountObject(accountObject);
DisposeObject(accountObject);
return result;
} }
public void CreateGroup(MailGroup @group) public void CreateGroup(MailGroup @group)
@ -1185,7 +1253,7 @@ namespace WebsitePanel.Providers.Mail
if (accountObject.New(group.Name)) if (accountObject.New(group.Name))
{ {
accountObject.SetProperty("U_Type", 7); accountObject.SetProperty("U_Type", IceWarpAccountType.UserGroup);
accountObject.SetProperty("G_GroupwareMailDelivery", false); accountObject.SetProperty("G_GroupwareMailDelivery", false);
SaveAccount(accountObject, "group account"); SaveAccount(accountObject, "group account");
} }
@ -1195,6 +1263,8 @@ namespace WebsitePanel.Providers.Mail
} }
UpdateGroup(group); UpdateGroup(group);
DisposeObject(accountObject);
} }
public void UpdateGroup(MailGroup @group) public void UpdateGroup(MailGroup @group)
@ -1206,6 +1276,8 @@ namespace WebsitePanel.Providers.Mail
accountObject.SetProperty("G_ListFile_Contents", string.Join("\n", group.Members)); accountObject.SetProperty("G_ListFile_Contents", string.Join("\n", group.Members));
SaveAccount(accountObject, "group"); SaveAccount(accountObject, "group");
DisposeObject(accountObject);
} }
public void DeleteGroup(string groupName) public void DeleteGroup(string groupName)
@ -1220,6 +1292,8 @@ namespace WebsitePanel.Providers.Mail
{ {
Log.WriteError("Cannot delete group: " + GetErrorMessage(accountObject.LastErr), null); Log.WriteError("Cannot delete group: " + GetErrorMessage(accountObject.LastErr), null);
} }
DisposeObject(accountObject);
} }
#endregion #endregion
@ -1230,7 +1304,11 @@ namespace WebsitePanel.Providers.Mail
{ {
var accountObject = GetAccountObject(); var accountObject = GetAccountObject();
return accountObject.Open(maillistName) && (IceWarpAccountType) Enum.Parse(typeof (IceWarpAccountType), ((object) accountObject.GetProperty("U_Type")).ToString()) == IceWarpAccountType.MailingList; var result = accountObject.Open(maillistName) && (IceWarpAccountType)Enum.Parse(typeof(IceWarpAccountType), ((object)accountObject.GetProperty("U_Type")).ToString()) == IceWarpAccountType.MailingList;
DisposeObject(accountObject);
return result;
} }
public MailList[] GetLists(string domainName) public MailList[] GetLists(string domainName)
@ -1240,8 +1318,8 @@ namespace WebsitePanel.Providers.Mail
protected IEnumerable<string> SplitStringProperty(dynamic accountObject, string propertyName, char separator) protected IEnumerable<string> SplitStringProperty(dynamic accountObject, string propertyName, char separator)
{ {
var value = (object) accountObject.GetProperty(propertyName); var value = (object)accountObject.GetProperty(propertyName);
return value == null ? new String[] {} : value.ToString().Split(new[] {separator}, StringSplitOptions.RemoveEmptyEntries); return value == null ? new String[] { } : value.ToString().Split(new[] { separator }, StringSplitOptions.RemoveEmptyEntries);
} }
protected IEnumerable<string> SplitFileContents(dynamic accountObject, string propertyName) protected IEnumerable<string> SplitFileContents(dynamic accountObject, string propertyName)
@ -1262,43 +1340,43 @@ namespace WebsitePanel.Providers.Mail
Name = accountObject.EmailAddress, Name = accountObject.EmailAddress,
Description = accountObject.GetProperty("M_Name"), Description = accountObject.GetProperty("M_Name"),
ModeratorAddress = accountObject.GetProperty("M_OwnerAddress"), ModeratorAddress = accountObject.GetProperty("M_OwnerAddress"),
MembersSource = (IceWarpListMembersSource) Enum.Parse(typeof (IceWarpListMembersSource), ((object) accountObject.GetProperty("M_SendAllLists")).ToString()), MembersSource = (IceWarpListMembersSource)Enum.Parse(typeof(IceWarpListMembersSource), ((object)accountObject.GetProperty("M_SendAllLists")).ToString()),
Members = ((IEnumerable<string>)SplitFileContents(accountObject, "M_ListFile_Contents")).Select(m => m.TrimEnd(new[] {';', '0', '1', '2'})).ToArray(), Members = ((IEnumerable<string>)SplitFileContents(accountObject, "M_ListFile_Contents")).Select(m => m.TrimEnd(new[] { ';', '0', '1', '2' })).ToArray(),
SetReceipientsToToHeader = Convert.ToBoolean((object) accountObject.GetProperty("M_SeparateTo")), SetReceipientsToToHeader = Convert.ToBoolean((object)accountObject.GetProperty("M_SeparateTo")),
SubjectPrefix = accountObject.GetProperty("M_AddToSubject"), SubjectPrefix = accountObject.GetProperty("M_AddToSubject"),
Originator = (IceWarpListOriginator) Enum.Parse(typeof (IceWarpListOriginator), ((object) accountObject.GetProperty("M_ListSender")).ToString()), Originator = (IceWarpListOriginator)Enum.Parse(typeof(IceWarpListOriginator), ((object)accountObject.GetProperty("M_ListSender")).ToString()),
PostingMode = Convert.ToBoolean((object) accountObject.GetProperty("M_MembersOnly")) ? PostingMode.MembersCanPost : PostingMode.AnyoneCanPost, PostingMode = Convert.ToBoolean((object)accountObject.GetProperty("M_MembersOnly")) ? PostingMode.MembersCanPost : PostingMode.AnyoneCanPost,
PasswordProtection = (PasswordProtection) Enum.Parse(typeof (PasswordProtection), ((object) accountObject.GetProperty("M_Moderated")).ToString()), PasswordProtection = (PasswordProtection)Enum.Parse(typeof(PasswordProtection), ((object)accountObject.GetProperty("M_Moderated")).ToString()),
Password = accountObject.GetProperty("M_ModeratedPassword"), Password = accountObject.GetProperty("M_ModeratedPassword"),
DefaultRights = (IceWarpListDefaultRights) Enum.Parse(typeof (IceWarpListDefaultRights), ((object) accountObject.GetProperty("M_DefaultRights")).ToString()), DefaultRights = (IceWarpListDefaultRights)Enum.Parse(typeof(IceWarpListDefaultRights), ((object)accountObject.GetProperty("M_DefaultRights")).ToString()),
MaxMessageSizeEnabled = Convert.ToBoolean((object) accountObject.GetProperty("M_MaxList")), MaxMessageSizeEnabled = Convert.ToBoolean((object)accountObject.GetProperty("M_MaxList")),
MaxMessageSize = Convert.ToInt32((object) accountObject.GetProperty("M_MaxListSize")), MaxMessageSize = Convert.ToInt32((object)accountObject.GetProperty("M_MaxListSize")),
MaxMembers = Convert.ToInt32((object) accountObject.GetProperty("M_MaxMembers")), MaxMembers = Convert.ToInt32((object)accountObject.GetProperty("M_MaxMembers")),
SendToSender = Convert.ToBoolean((object) accountObject.GetProperty("M_SendToSender")), SendToSender = Convert.ToBoolean((object)accountObject.GetProperty("M_SendToSender")),
DigestMode = Convert.ToBoolean((object) accountObject.GetProperty("M_DigestConfirmed")), DigestMode = Convert.ToBoolean((object)accountObject.GetProperty("M_DigestConfirmed")),
MaxMessagesPerMinute = Convert.ToInt32((object) accountObject.GetProperty("M_ListBatch")), MaxMessagesPerMinute = Convert.ToInt32((object)accountObject.GetProperty("M_ListBatch")),
SendSubscribe = Convert.ToBoolean((object) accountObject.GetProperty("M_NotifyJoin")), SendSubscribe = Convert.ToBoolean((object)accountObject.GetProperty("M_NotifyJoin")),
SendUnsubscribe = Convert.ToBoolean((object) accountObject.GetProperty("M_NotifyLeave")), SendUnsubscribe = Convert.ToBoolean((object)accountObject.GetProperty("M_NotifyLeave")),
// From list server account // From list server account
ConfirmSubscription = (IceWarpListConfirmSubscription) Enum.Parse(typeof (IceWarpListConfirmSubscription), ((object) listServerAccountObject.GetProperty("L_DigestConfirmed")).ToString()), ConfirmSubscription = (IceWarpListConfirmSubscription)Enum.Parse(typeof(IceWarpListConfirmSubscription), ((object)listServerAccountObject.GetProperty("L_DigestConfirmed")).ToString()),
CommandsInSubject = Convert.ToBoolean((object) listServerAccountObject.GetProperty("L_ListSubject")), CommandsInSubject = Convert.ToBoolean((object)listServerAccountObject.GetProperty("L_ListSubject")),
DisableSubscribecommand = !Convert.ToBoolean((object) listServerAccountObject.GetProperty("M_JoinR")), DisableSubscribecommand = !Convert.ToBoolean((object)listServerAccountObject.GetProperty("M_JoinR")),
AllowUnsubscribe = Convert.ToBoolean((object) listServerAccountObject.GetProperty("M_LeaveR")), AllowUnsubscribe = Convert.ToBoolean((object)listServerAccountObject.GetProperty("M_LeaveR")),
DisableListcommand = !Convert.ToBoolean((object) listServerAccountObject.GetProperty("M_ListsR")), DisableListcommand = !Convert.ToBoolean((object)listServerAccountObject.GetProperty("M_ListsR")),
DisableWhichCommand = !Convert.ToBoolean((object) listServerAccountObject.GetProperty("M_WhichR")), DisableWhichCommand = !Convert.ToBoolean((object)listServerAccountObject.GetProperty("M_WhichR")),
DisableReviewCommand = !Convert.ToBoolean((object) listServerAccountObject.GetProperty("M_ReviewR")), DisableReviewCommand = !Convert.ToBoolean((object)listServerAccountObject.GetProperty("M_ReviewR")),
DisableVacationCommand = !Convert.ToBoolean((object) listServerAccountObject.GetProperty("M_VacationR")), DisableVacationCommand = !Convert.ToBoolean((object)listServerAccountObject.GetProperty("M_VacationR")),
Moderated = Convert.ToBoolean((object) listServerAccountObject.GetProperty("L_Moderated")), Moderated = Convert.ToBoolean((object)listServerAccountObject.GetProperty("L_Moderated")),
CommandPassword = listServerAccountObject.GetProperty("L_ModeratedPassword"), CommandPassword = listServerAccountObject.GetProperty("L_ModeratedPassword"),
SuppressCommandResponses = Convert.ToBoolean((object) listServerAccountObject.GetProperty("L_MaxList")) SuppressCommandResponses = Convert.ToBoolean((object)listServerAccountObject.GetProperty("L_MaxList"))
}; };
// This is how I get values for from and replyto header values. TODO: There must be a better way, but I don't see the pattern right now... // This is how I get values for from and replyto header values. TODO: There must be a better way, but I don't see the pattern right now...
var ss = Convert.ToInt32((object) accountObject.GetProperty("M_SetSender")); var ss = Convert.ToInt32((object)accountObject.GetProperty("M_SetSender"));
var sv = Convert.ToInt32((object) accountObject.GetProperty("M_SetValue")); var sv = Convert.ToInt32((object)accountObject.GetProperty("M_SetValue"));
var vm = Convert.ToBoolean((object) accountObject.GetProperty("M_ValueMode")); var vm = Convert.ToBoolean((object)accountObject.GetProperty("M_ValueMode"));
var value = accountObject.GetProperty("M_HeaderValue"); var value = accountObject.GetProperty("M_HeaderValue");
switch (ss) switch (ss)
@ -1363,13 +1441,19 @@ namespace WebsitePanel.Providers.Mail
break; break;
} }
DisposeObject(listServerAccountObject);
return mailList; return mailList;
} }
public MailList GetList(string maillistName) public MailList GetList(string maillistName)
{ {
var accountObject = GetAccountObject(maillistName); var accountObject = GetAccountObject(maillistName);
return CreateMailListFromAccountObject(accountObject); var result = CreateMailListFromAccountObject(accountObject);
DisposeObject(accountObject);
return result;
} }
public void CreateList(MailList maillist) public void CreateList(MailList maillist)
@ -1395,6 +1479,8 @@ namespace WebsitePanel.Providers.Mail
SaveAccount(accountObject, "mailing list"); SaveAccount(accountObject, "mailing list");
UpdateList(maillist); UpdateList(maillist);
DisposeObject(accountObject);
} }
protected dynamic FindMatchingListServerAccount(string mailingListName, bool createListServerAccountIfNeeded) protected dynamic FindMatchingListServerAccount(string mailingListName, bool createListServerAccountIfNeeded)
@ -1555,7 +1641,7 @@ namespace WebsitePanel.Providers.Mail
listServerAccountObject.SetProperty("L_ListSender", maillist.Originator); listServerAccountObject.SetProperty("L_ListSender", maillist.Originator);
listServerAccountObject.SetProperty("L_MaxList", maillist.SuppressCommandResponses); listServerAccountObject.SetProperty("L_MaxList", maillist.SuppressCommandResponses);
SaveAccount(accountObject, "listserver account associated with mailing list"); SaveAccount(listServerAccountObject, "listserver account associated with mailing list");
} }
public void DeleteList(string maillistName) public void DeleteList(string maillistName)
@ -1602,8 +1688,16 @@ namespace WebsitePanel.Providers.Mail
{ {
Log.WriteError("Cannot delete mail list: " + GetErrorMessage(accountObject.LastErr), null); Log.WriteError("Cannot delete mail list: " + GetErrorMessage(accountObject.LastErr), null);
} }
DisposeObject(accountObject);
DisposeObject(listServerAccountObject);
} }
#endregion #endregion
public void Dispose()
{
Marshal.FinalReleaseComObject(_currentApiObject);
}
} }
} }

View file

@ -153,6 +153,7 @@ namespace WebsitePanel.Portal
if (maxMailboxSizeLimit == -1 || maxMailboxSizeLimit == 0) if (maxMailboxSizeLimit == -1 || maxMailboxSizeLimit == 0)
{ {
MaxMailboxSizeLimitValidator.Enabled = false; MaxMailboxSizeLimitValidator.Enabled = false;
CompareValidator1.Enabled = false;
} }
else else
{ {

View file

@ -43,6 +43,7 @@ namespace WebsitePanel.Portal.ProviderControls
secForwarding.Visible = (PanelRequest.ItemID > 0); secForwarding.Visible = (PanelRequest.ItemID > 0);
OlderMailsPanel.Visible = (PanelRequest.ItemID > 0); OlderMailsPanel.Visible = (PanelRequest.ItemID > 0);
secOlderMails.Visible = (PanelRequest.ItemID > 0); secOlderMails.Visible = (PanelRequest.ItemID > 0);
Utils.SelectListItem(ddlAccountType, "1"); // Set default account type to POP3 & IMAP
} }
public void BindItem(MailAccount item) public void BindItem(MailAccount item)
@ -108,7 +109,6 @@ namespace WebsitePanel.Portal.ProviderControls
item.ForwardingAddresses = Utils.ParseDelimitedString(txtForward.Text, ';', ' ', ','); item.ForwardingAddresses = Utils.ParseDelimitedString(txtForward.Text, ';', ' ', ',');
item.DeleteOnForward = cbDeleteOnForward.Checked; item.DeleteOnForward = cbDeleteOnForward.Checked;
item.ChangePassword = cbChangePassword.Checked; item.ChangePassword = cbChangePassword.Checked;
item.ChangePassword = cbChangePassword.Checked;
item.IsDomainAdmin = cbDomainAdmin.Checked; item.IsDomainAdmin = cbDomainAdmin.Checked;
item.DeleteOlder = cbDeleteOlder.Checked; item.DeleteOlder = cbDeleteOlder.Checked;