// Copyright (c) 2012, Outercurve Foundation. // All rights reserved. // // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: // // - Redistributions of source code must retain the above copyright notice, this // list of conditions and the following disclaimer. // // - Redistributions in binary form must reproduce the above copyright notice, // this list of conditions and the following disclaimer in the documentation // and/or other materials provided with the distribution. // // - Neither the name of the Outercurve Foundation nor the names of its // contributors may be used to endorse or promote products derived from this // software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE // DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR // ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES // (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; // LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON // ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. using System; using System.ComponentModel; using System.Web.Services; using System.Web.Services.Protocols; using WebsitePanel.Providers; using WebsitePanel.Providers.HostedSolution; using WebsitePanel.Providers.SharePoint; using WebsitePanel.Server.Utils; using Microsoft.Web.Services3; namespace WebsitePanel.Server { /// /// Summary description for HostedSharePointServer /// [WebService(Namespace = "http://smbsaas/websitepanel/server/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [Policy("ServerPolicy")] [ToolboxItem(false)] public class HostedSharePointServer : HostingServiceProviderWebService { private delegate TReturn Action(); /// /// Gets hosted SharePoint provider instance. /// private IHostedSharePointServer HostedSharePointServerProvider { get { return (IHostedSharePointServer)Provider; } } /// /// Gets list of supported languages by this installation of SharePoint. /// /// List of supported languages [WebMethod, SoapHeader("settings")] public int[] GetSupportedLanguages() { return ExecuteAction(delegate { return HostedSharePointServerProvider.GetSupportedLanguages(); }, "GetSupportedLanguages"); } /// /// Gets list of SharePoint collections within root web application. /// /// List of SharePoint collections within root web application. [WebMethod, SoapHeader("settings")] public SharePointSiteCollection[] GetSiteCollections() { return ExecuteAction(delegate { return HostedSharePointServerProvider.GetSiteCollections(); }, "GetSiteCollections"); } /// /// Gets SharePoint collection within root web application with given name. /// /// Url that uniquely identifies site collection to be loaded. /// SharePoint collection within root web application with given name. [WebMethod, SoapHeader("settings")] public SharePointSiteCollection GetSiteCollection(string url) { return ExecuteAction(delegate { return HostedSharePointServerProvider.GetSiteCollection(url); }, "GetSiteCollection"); } /// /// Creates site collection within predefined root web application. /// /// Information about site coolection to be created. [WebMethod, SoapHeader("settings")] public void CreateSiteCollection(SharePointSiteCollection siteCollection) { siteCollection.OwnerLogin = AttachNetbiosDomainName(siteCollection.OwnerLogin); ExecuteAction(delegate { HostedSharePointServerProvider.CreateSiteCollection(siteCollection); return new object(); }, "CreateSiteCollection"); } [WebMethod, SoapHeader("settings")] public void UpdateQuotas(string url, long maxSize, long warningSize) { ExecuteAction(delegate { HostedSharePointServerProvider.UpdateQuotas(url, maxSize, warningSize); return new object(); }, "UpdateQuotas"); } [WebMethod, SoapHeader("settings")] public SharePointSiteDiskSpace[] CalculateSiteCollectionsDiskSpace(string[] urls) { SharePointSiteDiskSpace[] ret = null; ret = ExecuteAction(delegate { return HostedSharePointServerProvider.CalculateSiteCollectionsDiskSpace(urls); }, "CalculateSiteCollectionDiskSpace"); return ret; } /// /// Deletes site collection under given url. /// /// Url that uniquely identifies site collection to be deleted. [WebMethod, SoapHeader("settings")] public void DeleteSiteCollection(SharePointSiteCollection siteCollection) { ExecuteAction(delegate { HostedSharePointServerProvider.DeleteSiteCollection(siteCollection); return new object(); }, "DeleteSiteCollection"); } /// /// Backups site collection under give url. /// /// Url that uniquely identifies site collection to be deleted. /// Resulting backup file name. /// A value which shows whether created backup must be archived. /// Created backup full path. [WebMethod, SoapHeader("settings")] public string BackupSiteCollection(string url, string filename, bool zip) { return ExecuteAction(delegate { return HostedSharePointServerProvider.BackupSiteCollection(url, filename, zip); }, "BackupSiteCollection"); } /// /// Restores site collection under given url from backup. /// /// Site collection to be restored. /// Backup file name to restore from. [WebMethod, SoapHeader("settings")] public void RestoreSiteCollection(SharePointSiteCollection siteCollection, string filename) { siteCollection.OwnerLogin = AttachNetbiosDomainName(siteCollection.OwnerLogin); ExecuteAction(delegate { HostedSharePointServerProvider.RestoreSiteCollection(siteCollection, filename); return new object(); }, "RestoreSiteCollection"); } /// /// Gets binary data chunk of specified size from specified offset. /// /// Path to file to get bunary data chunk from. /// Offset from which to start data reading. /// Binary data chunk length. /// Binary data chunk read from file. [WebMethod, SoapHeader("settings")] public byte[] GetTempFileBinaryChunk(string path, int offset, int length) { return ExecuteAction(delegate { return HostedSharePointServerProvider.GetTempFileBinaryChunk(path, offset, length); }, "GetTempFileBinaryChunk"); } /// /// Appends supplied binary data chunk to file. /// /// Non existent file name to append to. /// Full path to existent file to append to. /// Binary data chunk to append to. /// Path to file that was appended with chunk. [WebMethod, SoapHeader("settings")] public virtual string AppendTempFileBinaryChunk(string fileName, string path, byte[] chunk) { return ExecuteAction(delegate { return HostedSharePointServerProvider.AppendTempFileBinaryChunk(fileName, path, chunk); }, "AppendTempFileBinaryChunk"); } [WebMethod, SoapHeader("settings")] public long GetSiteCollectionSize(string url) { return ExecuteAction(delegate { return HostedSharePointServerProvider.GetSiteCollectionSize(url); }, "GetSiteCollectionSize"); } [WebMethod, SoapHeader("settings")] public void SetPeoplePickerOu(string site, string ou) { HostedSharePointServerProvider.SetPeoplePickerOu(site, ou); } /// /// Executes supplied action and performs logging. /// /// Type of action's return value. /// Action to be executed. /// Action name for logging purposes. /// Action execution result. private TReturn ExecuteAction(Action action, string actionName) { try { Log.WriteStart("'{0}' {1}", ProviderSettings.ProviderName, actionName); TReturn result = action(); Log.WriteEnd("'{0}' {1}", ProviderSettings.ProviderName, actionName); return result; } catch (Exception ex) { Log.WriteError(String.Format("Can't {1} '{0}' provider", ProviderSettings.ProviderName, actionName), ex); throw; } } /// /// Returns fully qualified netbios account name. /// /// Account name. /// Fully qualified netbios account name. private string AttachNetbiosDomainName(string accountName) { string domainNetbiosName = String.Format("{0}\\", ActiveDirectoryUtils.GetNETBIOSDomainName(ServerSettings.ADRootDomain)); return String.Format("{0}{1}", domainNetbiosName, accountName.Replace(domainNetbiosName, String.Empty)); } } }