Example #1
0
        /// <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);
            }
        }
Example #2
0
        /// <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();
        }
Example #3
0
        /// <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());
            }
        }
Example #4
0
        /// <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);
        }
Example #5
0
        /// <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();
        }
Example #6
0
        /// <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());
            }
        }