// 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(ExchangeServiceNotEnabledError); #region Check Space and Account // Check account int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); if (accountCheck < 0) return Warning((-accountCheck).ToString()); // Check space int packageCheck = SecurityContext.CheckPackage(packageId, DemandPackage.IsActive); if (packageCheck < 0) return Warning((-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(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(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(GeneralError, ex.Message); } finally { TaskManager.CompleteTask(); } } public static List GetOrganizations(int packageId) { List items = PackageController.GetPackageItemsByType( packageId, typeof(ExchangeOrganization), false); return items.ConvertAll(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 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 domains = new List(); domains.AddRange(exchange.GetOrganizationDomains(item.Name)); return domains; //return new List //{ // 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", "
"); } 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(OrganizationNotFoundError); #region Check Space and Account // Check account int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); if (accountCheck < 0) return Warning((-accountCheck).ToString()); // Check space int packageCheck = SecurityContext.CheckPackage(item.PackageId, DemandPackage.IsActive); if (packageCheck < 0) return Warning((-packageCheck).ToString()); #endregion // load organization details ExchangeOrganization org = GetOrganizationDetails(item.Id); if(org == null) return Error(OrganizationNotFoundError); // get evaluated summary information MailTemplate msg = EvaluateOrganizationSummaryTemplate(org); if (msg == null) return Error(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((-sendResult).ToString()); return result; } catch (Exception ex) { // log error TaskManager.WriteError(ex); // exit with error code return Error(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(OrganizationNotFoundError); #region Check Space and Account // Check account int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); if (accountCheck < 0) return Warning((-accountCheck).ToString()); // Check space int packageCheck = SecurityContext.CheckPackage(item.PackageId, DemandPackage.IsActive); if (packageCheck < 0) return Warning((-packageCheck).ToString()); #endregion // get organization details ExchangeOrganization org = GetOrganizationDetails(item.Id); if (org == null) return Error(OrganizationNotFoundError); // check domains quota if(org.MaxDomainsCountQuota > -1 && org.Domains.Length >= org.MaxDomainsCountQuota) return Error(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((-checkResult).ToString()); if (domain.PackageId != org.PackageId) return Error((-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(AddDomainAlreadyUsedError); } } else if (checkResult == BusinessErrorCodes.ERROR_RESTRICTED_DOMAIN) { return Error((-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((-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(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(OrganizationNotFoundError); #region Check Space and Account // Check account int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); if (accountCheck < 0) return Warning((-accountCheck).ToString()); // Check space int packageCheck = SecurityContext.CheckPackage(item.PackageId, DemandPackage.IsActive); if (packageCheck < 0) return Warning((-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(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(OrganizationNotFoundError); #region Check Space and Account // Check account int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); if (accountCheck < 0) return Warning((-accountCheck).ToString()); // Check space int packageCheck = SecurityContext.CheckPackage(item.PackageId, DemandPackage.IsActive); if (packageCheck < 0) return Warning((-packageCheck).ToString()); #endregion // check quotas UpdateOrganizationQuotas(item); if(item.MaxMailboxCountQuota > -1 && mailboxesNumber > item.MaxMailboxCountQuota) return Error(UpdateQuotasWrongQuotaError); if (item.MaxContactCountQuota > -1 && contactsNumber > item.MaxContactCountQuota) return Error(UpdateQuotasWrongQuotaError); if (item.MaxDistributionListCountQuota > -1 && distributionListsNumber > item.MaxDistributionListCountQuota) return Error(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(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(OrganizationNotFoundError); #region Check Space and Account // Check account int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); if (accountCheck < 0) return Warning((-accountCheck).ToString()); // Check space int packageCheck = SecurityContext.CheckPackage(item.PackageId, DemandPackage.IsActive); if (packageCheck < 0) return Warning((-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(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(OrganizationNotFoundError); #region Check Space and Account // Check account int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsAdmin | DemandAccount.IsActive); if (accountCheck < 0) return Warning((-accountCheck).ToString()); // Check space int packageCheck = SecurityContext.CheckPackage(item.PackageId, DemandPackage.IsActive); if (packageCheck < 0) return Warning((-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((-moveResult).ToString()); return result; } catch (Exception ex) { // log error TaskManager.WriteError(ex); // exit with error code return Error(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(OrganizationNotFoundError); #region Check Space and Account // Check account int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); if (accountCheck < 0) return Warning((-accountCheck).ToString()); // Check space int packageCheck = SecurityContext.CheckPackage(item.PackageId, DemandPackage.IsActive); if (packageCheck < 0) return Warning((-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(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(params string[] messageParts) { return Warning(null, messageParts); } private static T Warning(ResultObject innerResult, params string[] messageParts) { return Result(innerResult, false, messageParts); } private static T Error(params string[] messageParts) { return Error(null, messageParts); } private static T Error(ResultObject innerResult, params string[] messageParts) { return Result(innerResult, true, messageParts); } private static T Result(ResultObject innerResult, bool isError, params string[] messageParts) { object obj = Activator.CreateInstance(); 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 } }