/// <summary> /// Gets a website binding /// </summary> /// <param name="siteInformation">Information identifying the website to get the binding from</param> /// <returns></returns> private static Binding GetBinding(SiteInformation siteInformation) { if (siteInformation == null) { throw new ArgumentNullException("siteInformation"); } using (ServerManager serverManager = string.IsNullOrEmpty(siteInformation.Server) ? new ServerManager() : ServerManager.OpenRemote(siteInformation.Server)) { Site site = serverManager.Sites.FirstOrDefault( x => string.Equals(x.Name, siteInformation.SiteName, StringComparison.InvariantCultureIgnoreCase)); if (site == null) { throw new ServerManagerException(string.Format("Could not find site with site name '{0}'.", siteInformation.SiteName)); } Binding binding = site.Bindings.FirstOrDefault(x => string.Equals(x.Protocol, siteInformation.Protocol, StringComparison.InvariantCultureIgnoreCase) && string.Equals(x.BindingInformation, siteInformation.Dns, StringComparison.InvariantCultureIgnoreCase)); if (binding == null) { throw new CertificateException(string.Format( "Binding with protocol '{0}' and dns '{1}' was not found.", siteInformation.Protocol, siteInformation.Dns)); } return(binding); } }
/// <summary> /// Assigns a certificate to a website binding /// </summary> /// <param name="siteInformation">Information identifying the website and binding to assign the certificate to</param> public static void AssignCertificateToSite(SiteInformation siteInformation) { if (siteInformation == null) { throw new ArgumentNullException("siteInformation"); } Binding binding = GetBinding(siteInformation); if (string.IsNullOrEmpty(siteInformation.CertificateHash)) { throw new CertificateException("Certificate hash is required when adding certificate."); } ConfigurationMethod configurationMethod = binding.Methods.FirstOrDefault(x => string.Equals(x.Name, "AddSslCertificate", StringComparison.InvariantCultureIgnoreCase)); if (configurationMethod == null) { throw new CertificateException("Unable to access the AddSslCertificate configuration method."); } ConfigurationMethodInstance configurationMethodInstance = configurationMethod.CreateInstance(); configurationMethodInstance.Input.SetAttributeValue("certificateHash", siteInformation.CertificateHash); configurationMethodInstance.Input.SetAttributeValue("certificateStoreName", siteInformation.CertificateStore); configurationMethodInstance.Execute(); }
/// <summary> /// Retrieve all <see cref="Uri"/>s from a website matching the given site information. /// </summary> /// <param name="siteInformation"></param> /// <returns></returns> public static IEnumerable <Uri> GetUris(SiteInformation siteInformation) { if (siteInformation == null) { throw new ArgumentNullException("siteInformation"); } if (string.IsNullOrEmpty(siteInformation.SiteName)) { return(new List <Uri>()); } using (ServerManager serverManager = string.IsNullOrEmpty(siteInformation.Server) ? new ServerManager() : ServerManager.OpenRemote(siteInformation.Server)) { Site site = serverManager.Sites.FirstOrDefault( x => string.Equals(x.Name, siteInformation.SiteName, StringComparison.InvariantCultureIgnoreCase)); if (site == null) { throw new ServerManagerException(string.Format("Could not find site with site name '{0}'.", siteInformation.SiteName)); } if (site.Bindings == null || !site.Bindings.Any()) { return(new List <Uri>()); } IEnumerable <string> hostNames = site.Bindings .Select(GetHostName) .Where(x => x != null).ToList(); if (!hostNames.Any()) { return(new List <Uri>()); } IEnumerable <string> relativePaths = GetAllMvcRoutes() .Union(GetDefaultDocuments(siteInformation)); return(hostNames.Select(x => new Uri(x)) .Union(new[] { hostNames, relativePaths } .CartesianProduct() .Select(x => new Uri(string.Join(string.Empty, x)))) .Distinct() .ToList()); } }
/// <summary> /// Creates a new <see cref="SiteInformation" /> instance based on the specified key/value parameters. /// </summary> /// <param name="param"></param> /// <returns></returns> public static SiteInformation CreateFromParams(IDictionary <string, string> param) { SiteInformation siteInformation = new SiteInformation(); foreach (PropertyInfo propertyInfo in typeof(SiteInformation).GetProperties()) { string key = propertyInfo.Name.ToLower(); if (param.ContainsKey(key)) { propertyInfo.SetValue(siteInformation, param[key]); } } return(siteInformation); }
/// <summary> /// Unassigns a certificate to a website binding /// </summary> /// <param name="siteInformation">Information identifying the website and binding to assign the certificate to</param> public static void UnassignCertificateFromSite(SiteInformation siteInformation) { if (siteInformation == null) { throw new ArgumentNullException("siteInformation"); } Binding binding = GetBinding(siteInformation); ConfigurationMethod configurationMethod = binding.Methods.FirstOrDefault(x => string.Equals(x.Name, "RemoveSslCertificate", StringComparison.InvariantCultureIgnoreCase)); if (configurationMethod == null) { throw new CertificateException("Unable to access the RemoveSslCertificate configuration method."); } ConfigurationMethodInstance configurationMethodInstance = configurationMethod.CreateInstance(); configurationMethodInstance.Execute(); }
/// <summary> /// Retrieves all default documents for a server and site matching the specified <see cref="SiteInformation"/>. /// </summary> /// <param name="siteInformation"></param> /// <returns></returns> public static IEnumerable <string> GetDefaultDocuments(SiteInformation siteInformation) { if (siteInformation == null) { throw new ArgumentNullException("siteInformation"); } if (string.IsNullOrEmpty(siteInformation.SiteName)) { return(new List <string>()); } using (ServerManager serverManager = string.IsNullOrEmpty(siteInformation.Server) ? new ServerManager() : ServerManager.OpenRemote(siteInformation.Server)) { // Retrieve default documents Microsoft.Web.Administration.Configuration webConfig = serverManager.GetWebConfiguration(siteInformation.SiteName); ConfigurationSection section = webConfig.GetSection("system.webServer/defaultDocument"); return(section.GetCollection("files").Select(x => (string)x["value"]) .ToList()); } }