From 33252ab19c1b741d91f7bdbd12ce575f56a90b5c Mon Sep 17 00:00:00 2001 From: lukeIam Date: Wed, 9 Oct 2013 16:26:31 +0200 Subject: [PATCH] https stuff and cert generator for the webserver --- .gitattributes | 63 ++ ClientServerLib/ClientServerLib/CServer.cs | 336 +++++---- .../ClientServerLib/ClientServerLib.csproj | 126 ++-- ConfigHttpApi/ConfigHttpApi.cs | 84 +++ ConfigHttpApi/ConfigHttpApi.csproj | 64 ++ ConfigHttpApi/HttpApi.cs | 643 +++++++++++++++++ ConfigHttpApi/Properties/AssemblyInfo.cs | 36 + Vocaluxe.sln | 140 +++- Vocaluxe/Base/Server/CVocaluxeServer.cs | 15 +- WebserverInitalConfig/App.config | 6 + WebserverInitalConfig/ConfigHttpApi.cs | 111 +++ WebserverInitalConfig/HttpApi.cs | 672 ++++++++++++++++++ WebserverInitalConfig/Program.cs | 37 + .../Properties/AssemblyInfo.cs | 36 + .../WebserverInitalConfig.csproj | 72 ++ WebserverInitalConfig/app.manifest | 55 ++ 16 files changed, 2270 insertions(+), 226 deletions(-) create mode 100644 .gitattributes create mode 100644 ConfigHttpApi/ConfigHttpApi.cs create mode 100644 ConfigHttpApi/ConfigHttpApi.csproj create mode 100644 ConfigHttpApi/HttpApi.cs create mode 100644 ConfigHttpApi/Properties/AssemblyInfo.cs create mode 100644 WebserverInitalConfig/App.config create mode 100644 WebserverInitalConfig/ConfigHttpApi.cs create mode 100644 WebserverInitalConfig/HttpApi.cs create mode 100644 WebserverInitalConfig/Program.cs create mode 100644 WebserverInitalConfig/Properties/AssemblyInfo.cs create mode 100644 WebserverInitalConfig/WebserverInitalConfig.csproj create mode 100644 WebserverInitalConfig/app.manifest diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..1ff0c423 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,63 @@ +############################################################################### +# Set default behavior to automatically normalize line endings. +############################################################################### +* text=auto + +############################################################################### +# Set default behavior for command prompt diff. +# +# This is need for earlier builds of msysgit that does not have it on by +# default for csharp files. +# Note: This is only used by command line +############################################################################### +#*.cs diff=csharp + +############################################################################### +# Set the merge driver for project and solution files +# +# Merging from the command prompt will add diff markers to the files if there +# are conflicts (Merging from VS is not affected by the settings below, in VS +# the diff markers are never inserted). Diff markers may cause the following +# file extensions to fail to load in VS. An alternative would be to treat +# these files as binary and thus will always conflict and require user +# intervention with every merge. To do so, just uncomment the entries below +############################################################################### +#*.sln merge=binary +#*.csproj merge=binary +#*.vbproj merge=binary +#*.vcxproj merge=binary +#*.vcproj merge=binary +#*.dbproj merge=binary +#*.fsproj merge=binary +#*.lsproj merge=binary +#*.wixproj merge=binary +#*.modelproj merge=binary +#*.sqlproj merge=binary +#*.wwaproj merge=binary + +############################################################################### +# behavior for image files +# +# image files are treated as binary by default. +############################################################################### +#*.jpg binary +#*.png binary +#*.gif binary + +############################################################################### +# diff behavior for common document formats +# +# Convert binary document formats to text before diffing them. This feature +# is only available from the command line. Turn it on by uncommenting the +# entries below. +############################################################################### +#*.doc diff=astextplain +#*.DOC diff=astextplain +#*.docx diff=astextplain +#*.DOCX diff=astextplain +#*.dot diff=astextplain +#*.DOT diff=astextplain +#*.pdf diff=astextplain +#*.PDF diff=astextplain +#*.rtf diff=astextplain +#*.RTF diff=astextplain diff --git a/ClientServerLib/ClientServerLib/CServer.cs b/ClientServerLib/ClientServerLib/CServer.cs index 282498c2..3249cfb4 100644 --- a/ClientServerLib/ClientServerLib/CServer.cs +++ b/ClientServerLib/ClientServerLib/CServer.cs @@ -1,140 +1,196 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.ServiceModel; -using System.ServiceModel.Description; -using System.ServiceModel.Web; - -namespace ClientServerLib -{ - public class CServer - { - private ServiceHost host; - private Uri baseAddress; - - private static SendKeyEventDelegate sendKeyEvent; - public static SendKeyEventDelegate SendKeyEvent - { - internal get { return CServer.sendKeyEvent; } - set { CServer.sendKeyEvent = value; } - } - - #region profile - - private static GetProfileDataDelegate getProfileData; - public static GetProfileDataDelegate GetProfileData - { - internal get { return CServer.getProfileData; } - set { CServer.getProfileData = value; } - } - - private static SendProfileDataDelegate sendProfileData; - public static SendProfileDataDelegate SendProfileData - { - internal get { return CServer.sendProfileData; } - set { CServer.sendProfileData = value; } - } - - private static GetProfileListDelegate getProfileList; - public static GetProfileListDelegate GetProfileList - { - internal get { return CServer.getProfileList; } - set { CServer.getProfileList = value; } - } - - #endregion - - #region photo - private static SendPhotoDelegate sendPhoto; - public static SendPhotoDelegate SendPhoto - { - get { return CServer.sendPhoto; } - set { CServer.sendPhoto = value; } - } - - #endregion - - #region website - - private static GetSiteFileDelegate getSiteFile; - public static GetSiteFileDelegate GetSiteFile - { - internal get { return CServer.getSiteFile; } - set { CServer.getSiteFile = value; } - } - - #endregion - - #region songs - - private static GetSongDelegate getSong; - public static GetSongDelegate GetSong - { - internal get { return CServer.getSong; } - set { CServer.getSong = value; } - } - - private static GetAllSongsDelegate getAllSongs; - public static GetAllSongsDelegate GetAllSongs - { - get { return CServer.getAllSongs; } - set { CServer.getAllSongs = value; } - } - - private static GetCurrentSongIdDelegate getCurrentSongId; - public static GetCurrentSongIdDelegate GetCurrentSongId - { - get { return CServer.getCurrentSongId; } - set { CServer.getCurrentSongId = value; } - } - - - #endregion - - public CServer(int port) - { - baseAddress = new Uri("http://localhost:" + port + "/"); - host = new WebServiceHost(typeof(CWebservice), baseAddress); - WebHttpBinding wb = new WebHttpBinding(); - wb.MaxReceivedMessageSize = 10485760; - wb.MaxBufferSize = 10485760; - wb.MaxBufferPoolSize = 10485760; - wb.ReaderQuotas.MaxStringContentLength = 10485760; - wb.ReaderQuotas.MaxArrayLength = 10485760; - wb.ReaderQuotas.MaxBytesPerRead = 10485760; - host.AddServiceEndpoint(typeof(ICWebservice), wb, ""); - } - - public void Start() - { - try - { - // Step 4 Enable metadata exchange. - ServiceMetadataBehavior smb = new ServiceMetadataBehavior(); - //smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15; - //smb.HttpGetEnabled = true; - host.Description.Behaviors.Add(smb); - - // Step 5 Start the service. - host.Open(); - } - catch (CommunicationException ce) - { - host.Abort(); - } - } - - public void Stop() - { - try - { - host.Close(); - } - catch (CommunicationException ce) - { - host.Abort(); - } - } - } -} +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.ServiceModel; +using System.ServiceModel.Description; +using System.ServiceModel.Web; +using System.Security.Cryptography.X509Certificates; +using System.Diagnostics; +using System.Net; + +namespace ClientServerLib +{ + public class CServer + { + private ServiceHost host; + private Uri baseAddress; + private bool encrypted = false; + + private static SendKeyEventDelegate sendKeyEvent; + public static SendKeyEventDelegate SendKeyEvent + { + internal get { return CServer.sendKeyEvent; } + set { CServer.sendKeyEvent = value; } + } + + #region profile + + private static GetProfileDataDelegate getProfileData; + public static GetProfileDataDelegate GetProfileData + { + internal get { return CServer.getProfileData; } + set { CServer.getProfileData = value; } + } + + private static SendProfileDataDelegate sendProfileData; + public static SendProfileDataDelegate SendProfileData + { + internal get { return CServer.sendProfileData; } + set { CServer.sendProfileData = value; } + } + + private static GetProfileListDelegate getProfileList; + public static GetProfileListDelegate GetProfileList + { + internal get { return CServer.getProfileList; } + set { CServer.getProfileList = value; } + } + + #endregion + + #region photo + private static SendPhotoDelegate sendPhoto; + public static SendPhotoDelegate SendPhoto + { + get { return CServer.sendPhoto; } + set { CServer.sendPhoto = value; } + } + + #endregion + + #region website + + private static GetSiteFileDelegate getSiteFile; + public static GetSiteFileDelegate GetSiteFile + { + internal get { return CServer.getSiteFile; } + set { CServer.getSiteFile = value; } + } + + #endregion + + #region songs + + private static GetSongDelegate getSong; + public static GetSongDelegate GetSong + { + internal get { return CServer.getSong; } + set { CServer.getSong = value; } + } + + private static GetAllSongsDelegate getAllSongs; + public static GetAllSongsDelegate GetAllSongs + { + get { return CServer.getAllSongs; } + set { CServer.getAllSongs = value; } + } + + private static GetCurrentSongIdDelegate getCurrentSongId; + public static GetCurrentSongIdDelegate GetCurrentSongId + { + get { return CServer.getCurrentSongId; } + set { CServer.getCurrentSongId = value; } + } + + + #endregion + + public CServer(int port, bool encrypted) + { + init(port, encrypted); + } + + private void init(int port, bool encrypted) + { + string hostname = Dns.GetHostName(); + if (encrypted) + { + baseAddress = new Uri("https://" + hostname + ":" + port + "/"); + } + else + { + baseAddress = new Uri("http://" + hostname + ":" + port + "/"); + } + this.encrypted = encrypted; + host = new WebServiceHost(typeof(CWebservice), baseAddress); + + WebHttpBinding wb = new WebHttpBinding(); + wb.MaxReceivedMessageSize = 10485760; + wb.MaxBufferSize = 10485760; + wb.MaxBufferPoolSize = 10485760; + wb.ReaderQuotas.MaxStringContentLength = 10485760; + wb.ReaderQuotas.MaxArrayLength = 10485760; + wb.ReaderQuotas.MaxBytesPerRead = 10485760; + if (encrypted) + { + wb.Security.Mode = WebHttpSecurityMode.Transport; + wb.Security.Transport = new HttpTransportSecurity { ClientCredentialType = HttpClientCredentialType.None }; + } + host.AddServiceEndpoint(typeof(ICWebservice), wb, ""); + } + + public void Start() + { + try + { + /*ServiceMetadataBehavior smb = new ServiceMetadataBehavior(); + smb.MetadataExporter.PolicyVersion = PolicyVersion.Policy15; + smb.HttpGetEnabled = true; + host.Description.Behaviors.Add(smb);*/ + + host.Open(); + } + catch (CommunicationException e) + { + if (e is AddressAccessDeniedException || e is AddressAlreadyInUseException) + { + registerUrlAndCert(baseAddress.Port); + try + { + host.Abort(); + init(baseAddress.Port, encrypted); + host.Open(); + } + catch (CommunicationException e2) + { + host.Abort(); + } + } + else + { + host.Abort(); + } + } + } + + public void Stop() + { + try + { + host.Close(); + } + catch (CommunicationException e) + { + host.Abort(); + } + } + + private void registerUrlAndCert(int port) + { + ProcessStartInfo info = new ProcessStartInfo(); + info.FileName = "WebserverInitalConfig.exe"; + info.Arguments = port.ToString() + " " + encrypted.ToString(); + info.UseShellExecute = true; + info.CreateNoWindow = true; + info.WindowStyle = ProcessWindowStyle.Hidden; + info.Verb = "runas"; + Process p = Process.Start(info); + if (p != null) + { + p.WaitForExit(); + p.Close(); + } + } + } +} diff --git a/ClientServerLib/ClientServerLib/ClientServerLib.csproj b/ClientServerLib/ClientServerLib/ClientServerLib.csproj index f0625c63..82279e51 100644 --- a/ClientServerLib/ClientServerLib/ClientServerLib.csproj +++ b/ClientServerLib/ClientServerLib/ClientServerLib.csproj @@ -1,70 +1,70 @@ - - - - Debug - AnyCPU - 8.0.30703 - 2.0 - {EC5167E4-CCFB-4CEE-987C-CF816F1062A3} - Library - Properties - ClientServerLib - ClientServerLib - v4.0 - 512 - - - - - true - full - false - bin\ - DEBUG;TRACE - prompt - 4 - - - pdbonly - true - bin\ - TRACE - prompt - 4 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + Debug + AnyCPU + 8.0.30703 + 2.0 + {EC5167E4-CCFB-4CEE-987C-CF816F1062A3} + Library + Properties + ClientServerLib + ClientServerLib + v4.0 + 512 + + + + + true + full + false + bin\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + --> \ No newline at end of file diff --git a/ConfigHttpApi/ConfigHttpApi.cs b/ConfigHttpApi/ConfigHttpApi.cs new file mode 100644 index 00000000..f8353f72 --- /dev/null +++ b/ConfigHttpApi/ConfigHttpApi.cs @@ -0,0 +1,84 @@ +using Security.Cryptography; +using Security.Cryptography.X509Certificates; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Security.Cryptography; +using System.Security.Cryptography.X509Certificates; +using System.Security.Permissions; +using System.Text; +using System.Threading.Tasks; + +namespace ConfigHttpApi +{ + public static class ConfigHttpApi + { + [PrincipalPermission(SecurityAction.Demand, Role = @"BUILTIN\Administrators")] + public static void reserveURL(string networkString) + { + HttpApi.ReserveURL(networkString, "D:(A;;GX;;;S-1-1-0)"); + } + + [PrincipalPermission(SecurityAction.Demand, Role = @"BUILTIN\Administrators")] + public static void bindCert(string ip, int port, X509Certificate2 cert) + { + IPEndPoint endpoint = new IPEndPoint(IPAddress.Parse(ip), port); + if (HttpApi.QuerySslCertificateInfo(endpoint) != null) + { + HttpApi.DeleteCertificateBinding(endpoint); + } + + HttpApi.BindCertificate(endpoint, cert.GetCertHash(), StoreName.My, new Guid("7baf41f1-48b7-42cb-b145-f815499cb48f")); + } + + [PrincipalPermission(SecurityAction.Demand, Role = @"BUILTIN\Administrators")] + public static void addCertToStore(X509Certificate2 cert) + { + X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine); + store.Open(OpenFlags.ReadWrite); + store.Add(cert); + store.Close(); + } + + [PrincipalPermission(SecurityAction.Demand, Role = @"BUILTIN\Administrators")] + public static X509Certificate2 getSelfSignedCert(string subjectName) + { + CngKey key = CngKey.Create(CngAlgorithm2.Rsa); + X509CertificateCreationParameters param = new X509CertificateCreationParameters( + new X500DistinguishedName("CN=Vocaluxe Server")); + param.SubjectName = new X500DistinguishedName("CN=localhost"); + param.EndTime = DateTime.Today.AddYears(20); + param.SignatureAlgorithm = X509CertificateSignatureAlgorithm.RsaSha512; + OidCollection oc = new OidCollection(); + oc.Add(new Oid("1.3.6.1.5.5.7.3.1")); + X509Extension eku = new X509EnhancedKeyUsageExtension(oc, true); + param.Extensions.Add(eku); + + return key.CreateSelfSignedCertificate(param); + } + + /*public static X509Certificate2 getCert(string subject) + { + RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); + + Mono.Security.Authenticode.PrivateKey key = new Mono.Security.Authenticode.PrivateKey { RSA=RSA.Create()}; + + + Mono.Security.X509.X509CertificateBuilder x509 = new Mono.Security.X509.X509CertificateBuilder(); + x509.IssuerName = "CN=Vocaluxe Server"; + x509.NotAfter = DateTime.Today.AddYears(20); + x509.NotBefore = DateTime.Today.AddDays(-1); + x509.SubjectName = subject; + x509.SerialNumber = new byte[] { 1 }; + x509.Version = 3; + x509.SubjectPublicKey = rsa; + + ExtendedKeyUsageExtension eku = new ExtendedKeyUsageExtension(); + eku.KeyPurpose.Add("1.3.6.1.5.5.7.3.1"); + x509.Extensions.Add(eku); + + return new X509Certificate2(x509.Sign(rsa)); + }*/ + } +} diff --git a/ConfigHttpApi/ConfigHttpApi.csproj b/ConfigHttpApi/ConfigHttpApi.csproj new file mode 100644 index 00000000..368c0a49 --- /dev/null +++ b/ConfigHttpApi/ConfigHttpApi.csproj @@ -0,0 +1,64 @@ + + + + + Debug + AnyCPU + {EC28CFA6-35A8-4971-AB07-37A54E010F69} + Exe + Properties + ConfigHttpApi + ConfigHttpApi + v4.0 + 512 + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + ..\..\..\..\..\Program Files (x86)\Microsoft Visual Studio 11.0\Libs\clrsecurity_june10\Security.dll + + + ..\..\..\..\..\Program Files (x86)\Microsoft Visual Studio 11.0\Libs\clrsecurity_june10\Security.Cryptography.dll + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ConfigHttpApi/HttpApi.cs b/ConfigHttpApi/HttpApi.cs new file mode 100644 index 00000000..e5d104a0 --- /dev/null +++ b/ConfigHttpApi/HttpApi.cs @@ -0,0 +1,643 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Net; +using System.Net.Sockets; +using System.Runtime.InteropServices; +using System.Security.Cryptography.X509Certificates; +using System.Text; +using System.Threading.Tasks; + +namespace ConfigHttpApi +{ + internal static class HttpApi + { + private static readonly HTTPAPI_VERSION HttpApiVersion = new HTTPAPI_VERSION(1, 0); + + #region DllImport + + [DllImport("httpapi.dll", SetLastError = true)] + static extern uint HttpInitialize( + HTTPAPI_VERSION version, + uint flags, + IntPtr pReserved); + + [DllImport("httpapi.dll", SetLastError = true)] + static extern uint HttpSetServiceConfiguration( + IntPtr serviceIntPtr, + HTTP_SERVICE_CONFIG_ID configId, + IntPtr pConfigInformation, + int configInformationLength, + IntPtr pOverlapped); + + [DllImport("httpapi.dll", SetLastError = true)] + static extern uint HttpDeleteServiceConfiguration( + IntPtr serviceIntPtr, + HTTP_SERVICE_CONFIG_ID configId, + IntPtr pConfigInformation, + int configInformationLength, + IntPtr pOverlapped); + + [DllImport("httpapi.dll", SetLastError = true)] + static extern uint HttpTerminate( + uint Flags, + IntPtr pReserved); + + [DllImport("httpapi.dll", SetLastError = true)] + static extern uint HttpQueryServiceConfiguration( + IntPtr serviceIntPtr, + HTTP_SERVICE_CONFIG_ID configId, + IntPtr pInputConfigInfo, + int inputConfigInfoLength, + IntPtr pOutputConfigInfo, + int outputConfigInfoLength, + [Optional] + out int pReturnLength, + IntPtr pOverlapped); + + + enum HTTP_SERVICE_CONFIG_ID + { + + HttpServiceConfigIPListenList = 0, + HttpServiceConfigSSLCertInfo, + HttpServiceConfigUrlAclInfo, + HttpServiceConfigMax + } + + [StructLayout(LayoutKind.Sequential)] + struct HTTP_SERVICE_CONFIG_SSL_SET + { + public HTTP_SERVICE_CONFIG_SSL_KEY KeyDesc; + public HTTP_SERVICE_CONFIG_SSL_PARAM ParamDesc; + } + + [StructLayout(LayoutKind.Sequential)] + struct HTTP_SERVICE_CONFIG_SSL_KEY + { + public IntPtr pIpPort; + + public HTTP_SERVICE_CONFIG_SSL_KEY(IntPtr pIpPort) + { + this.pIpPort = pIpPort; + } + } + + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] + struct HTTP_SERVICE_CONFIG_SSL_PARAM + { + public int SslHashLength; + public IntPtr pSslHash; + public Guid AppId; + [MarshalAs(UnmanagedType.LPWStr)] + public string pSslCertStoreName; + public uint DefaultCertCheckMode; + public int DefaultRevocationFreshnessTime; + public int DefaultRevocationUrlRetrievalTimeout; + [MarshalAs(UnmanagedType.LPWStr)] + public string pDefaultSslCtlIdentifier; + [MarshalAs(UnmanagedType.LPWStr)] + public string pDefaultSslCtlStoreName; + public uint DefaultFlags; + } + + [StructLayout(LayoutKind.Sequential, Pack = 2)] + struct HTTPAPI_VERSION + { + public ushort HttpApiMajorVersion; + public ushort HttpApiMinorVersion; + + public HTTPAPI_VERSION(ushort majorVersion, ushort minorVersion) + { + HttpApiMajorVersion = majorVersion; + HttpApiMinorVersion = minorVersion; + } + } + + [StructLayout(LayoutKind.Sequential)] + struct HTTP_SERVICE_CONFIG_SSL_QUERY + { + public HTTP_SERVICE_CONFIG_QUERY_TYPE QueryDesc; + public HTTP_SERVICE_CONFIG_SSL_KEY KeyDesc; + public uint dwToken; + } + + enum HTTP_SERVICE_CONFIG_QUERY_TYPE + { + HttpServiceConfigQueryExact = 0, + HttpServiceConfigQueryNext, + HttpServiceConfigQueryMax + } + + [StructLayout(LayoutKind.Sequential)] + struct HTTP_SERVICE_CONFIG_URLACL_SET + { + public HTTP_SERVICE_CONFIG_URLACL_KEY KeyDesc; + public HTTP_SERVICE_CONFIG_URLACL_PARAM ParamDesc; + } + + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] + public struct HTTP_SERVICE_CONFIG_URLACL_KEY + { + [MarshalAs(UnmanagedType.LPWStr)] + public string pUrlPrefix; + + public HTTP_SERVICE_CONFIG_URLACL_KEY(string urlPrefix) + { + pUrlPrefix = urlPrefix; + } + } + + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] + struct HTTP_SERVICE_CONFIG_URLACL_PARAM + { + [MarshalAs(UnmanagedType.LPWStr)] + public string pStringSecurityDescriptor; + + public HTTP_SERVICE_CONFIG_URLACL_PARAM(string securityDescriptor) + { + pStringSecurityDescriptor = securityDescriptor; + } + } + + #endregion + + #region Constants + + public const uint HTTP_INITIALIZE_CONFIG = 0x00000002; + public const uint HTTP_SERVICE_CONFIG_SSL_FLAG_NEGOTIATE_CLIENT_CERT = 0x00000002; + public const uint HTTP_SERVICE_CONFIG_SSL_FLAG_NO_RAW_FILTER = 0x00000004; + private const uint NOERROR = 0; + private const uint ERROR_INSUFFICIENT_BUFFER = 122; + private const uint ERROR_ALREADY_EXISTS = 183; + private const uint ERROR_FILE_NOT_FOUND = 2; + private const int ERROR_NO_MORE_ITEMS = 259; + + #endregion + + #region Public methods + + public class SslCertificateInfo + { + public byte[] Hash { get; set; } + public Guid AppId { get; set; } + public string StoreName { get; set; } + public IPEndPoint IpPort { get; set; } + } + + public static SslCertificateInfo QuerySslCertificateInfo(IPEndPoint ipPort) + { + SslCertificateInfo result = null; + + uint retVal; + CallHttpApi(delegate + { + GCHandle sockAddrHandle = CreateSockaddrStructure(ipPort); + IntPtr pIpPort = sockAddrHandle.AddrOfPinnedObject(); + HTTP_SERVICE_CONFIG_SSL_KEY sslKey = new HTTP_SERVICE_CONFIG_SSL_KEY(pIpPort); + + HTTP_SERVICE_CONFIG_SSL_QUERY inputConfigInfoQuery = + new HTTP_SERVICE_CONFIG_SSL_QUERY + { + QueryDesc = HTTP_SERVICE_CONFIG_QUERY_TYPE.HttpServiceConfigQueryExact, + KeyDesc = sslKey + }; + + IntPtr pInputConfigInfo = + Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(HTTP_SERVICE_CONFIG_SSL_QUERY))); + Marshal.StructureToPtr(inputConfigInfoQuery, pInputConfigInfo, false); + + IntPtr pOutputConfigInfo = IntPtr.Zero; + int returnLength = 0; + + try + { + HTTP_SERVICE_CONFIG_ID queryType = HTTP_SERVICE_CONFIG_ID.HttpServiceConfigSSLCertInfo; + int inputConfigInfoSize = Marshal.SizeOf(inputConfigInfoQuery); + retVal = HttpQueryServiceConfiguration(IntPtr.Zero, + queryType, + pInputConfigInfo, + inputConfigInfoSize, + pOutputConfigInfo, + returnLength, + out returnLength, + IntPtr.Zero); + if (retVal == ERROR_FILE_NOT_FOUND) + return; + + if (ERROR_INSUFFICIENT_BUFFER == retVal) // ERROR_INSUFFICIENT_BUFFER = 122 + { + pOutputConfigInfo = Marshal.AllocCoTaskMem(returnLength); + + try + { + retVal = HttpQueryServiceConfiguration(IntPtr.Zero, + queryType, + pInputConfigInfo, + inputConfigInfoSize, + pOutputConfigInfo, + returnLength, + out returnLength, + IntPtr.Zero); + ThrowWin32ExceptionIfError(retVal); + + var outputConfigInfo = + (HTTP_SERVICE_CONFIG_SSL_SET) + Marshal.PtrToStructure(pOutputConfigInfo, typeof(HTTP_SERVICE_CONFIG_SSL_SET)); + + byte[] hash = new byte[outputConfigInfo.ParamDesc.SslHashLength]; + Marshal.Copy(outputConfigInfo.ParamDesc.pSslHash, hash, 0, hash.Length); + + Guid appId = outputConfigInfo.ParamDesc.AppId; + string storeName = outputConfigInfo.ParamDesc.pSslCertStoreName; + + result = new SslCertificateInfo { AppId = appId, Hash = hash, StoreName = storeName, IpPort = ipPort }; + } + finally + { + Marshal.FreeCoTaskMem(pOutputConfigInfo); + } + } + else + { + ThrowWin32ExceptionIfError(retVal); + } + + } + finally + { + Marshal.FreeCoTaskMem(pInputConfigInfo); + if (sockAddrHandle.IsAllocated) + sockAddrHandle.Free(); + } + + }); + + return result; + } + + public static void BindCertificate(IPEndPoint ipPort, byte[] hash, StoreName storeName, Guid appId) + { + if (ipPort == null) throw new ArgumentNullException("ipPort"); + if (hash == null) throw new ArgumentNullException("hash"); + + CallHttpApi( + delegate + { + HTTP_SERVICE_CONFIG_SSL_SET configSslSet = new HTTP_SERVICE_CONFIG_SSL_SET(); + + GCHandle sockAddrHandle = CreateSockaddrStructure(ipPort); + IntPtr pIpPort = sockAddrHandle.AddrOfPinnedObject(); + HTTP_SERVICE_CONFIG_SSL_KEY httpServiceConfigSslKey = + new HTTP_SERVICE_CONFIG_SSL_KEY(pIpPort); + HTTP_SERVICE_CONFIG_SSL_PARAM configSslParam = new HTTP_SERVICE_CONFIG_SSL_PARAM(); + + + GCHandle handleHash = GCHandle.Alloc(hash, GCHandleType.Pinned); + configSslParam.AppId = appId; + configSslParam.DefaultCertCheckMode = 0; + configSslParam.DefaultFlags = 0; //HTTP_SERVICE_CONFIG_SSL_FLAG_NEGOTIATE_CLIENT_CERT; + configSslParam.DefaultRevocationFreshnessTime = 0; + configSslParam.DefaultRevocationUrlRetrievalTimeout = 0; + configSslParam.pSslCertStoreName = storeName.ToString(); + configSslParam.pSslHash = handleHash.AddrOfPinnedObject(); + configSslParam.SslHashLength = hash.Length; + configSslSet.ParamDesc = configSslParam; + configSslSet.KeyDesc = httpServiceConfigSslKey; + + IntPtr pInputConfigInfo = + Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(HTTP_SERVICE_CONFIG_SSL_SET))); + Marshal.StructureToPtr(configSslSet, pInputConfigInfo, false); + + try + { + uint retVal = HttpSetServiceConfiguration(IntPtr.Zero, + HTTP_SERVICE_CONFIG_ID.HttpServiceConfigSSLCertInfo, + pInputConfigInfo, + Marshal.SizeOf(configSslSet), + IntPtr.Zero); + + if (ERROR_ALREADY_EXISTS != retVal) + { + ThrowWin32ExceptionIfError(retVal); + } + else + { + retVal = HttpDeleteServiceConfiguration(IntPtr.Zero, + HTTP_SERVICE_CONFIG_ID.HttpServiceConfigSSLCertInfo, + pInputConfigInfo, + Marshal.SizeOf(configSslSet), + IntPtr.Zero); + ThrowWin32ExceptionIfError(retVal); + + retVal = HttpSetServiceConfiguration(IntPtr.Zero, + HTTP_SERVICE_CONFIG_ID.HttpServiceConfigSSLCertInfo, + pInputConfigInfo, + Marshal.SizeOf(configSslSet), + IntPtr.Zero); + ThrowWin32ExceptionIfError(retVal); + } + } + finally + { + Marshal.FreeCoTaskMem(pInputConfigInfo); + if (handleHash.IsAllocated) + handleHash.Free(); + if (sockAddrHandle.IsAllocated) + sockAddrHandle.Free(); + } + }); + } + + public static void DeleteCertificateBinding(params IPEndPoint[] ipPorts) + { + if (ipPorts == null || ipPorts.Length == 0) + return; + + CallHttpApi( + delegate + { + foreach (var ipPort in ipPorts) + { + HTTP_SERVICE_CONFIG_SSL_SET configSslSet = + new HTTP_SERVICE_CONFIG_SSL_SET(); + + GCHandle sockAddrHandle = CreateSockaddrStructure(ipPort); + IntPtr pIpPort = sockAddrHandle.AddrOfPinnedObject(); + HTTP_SERVICE_CONFIG_SSL_KEY httpServiceConfigSslKey = + new HTTP_SERVICE_CONFIG_SSL_KEY(pIpPort); + configSslSet.KeyDesc = httpServiceConfigSslKey; + + IntPtr pInputConfigInfo = + Marshal.AllocCoTaskMem( + Marshal.SizeOf(typeof(HTTP_SERVICE_CONFIG_SSL_SET))); + Marshal.StructureToPtr(configSslSet, pInputConfigInfo, false); + + try + { + uint retVal = HttpDeleteServiceConfiguration(IntPtr.Zero, + HTTP_SERVICE_CONFIG_ID.HttpServiceConfigSSLCertInfo, + pInputConfigInfo, + Marshal.SizeOf(configSslSet), + IntPtr.Zero); + ThrowWin32ExceptionIfError(retVal); + } + finally + { + Marshal.FreeCoTaskMem(pInputConfigInfo); + if (sockAddrHandle.IsAllocated) + sockAddrHandle.Free(); + } + } + }); + } + + public static SslCertificateInfo[] QuerySslCertificateInfo() + { + var result = new List(); + + CallHttpApi( + delegate + { + uint token = 0; + + uint retVal; + do + { + HTTP_SERVICE_CONFIG_SSL_QUERY inputConfigInfoQuery = + new HTTP_SERVICE_CONFIG_SSL_QUERY + { + QueryDesc = HTTP_SERVICE_CONFIG_QUERY_TYPE.HttpServiceConfigQueryNext, + dwToken = token, + }; + + IntPtr pInputConfigInfo = + Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(HTTP_SERVICE_CONFIG_SSL_QUERY))); + Marshal.StructureToPtr(inputConfigInfoQuery, pInputConfigInfo, false); + + IntPtr pOutputConfigInfo = IntPtr.Zero; + int returnLength = 0; + + const HTTP_SERVICE_CONFIG_ID queryType = HTTP_SERVICE_CONFIG_ID.HttpServiceConfigSSLCertInfo; + + try + { + int inputConfigInfoSize = Marshal.SizeOf(inputConfigInfoQuery); + retVal = HttpQueryServiceConfiguration(IntPtr.Zero, + queryType, + pInputConfigInfo, + inputConfigInfoSize, + pOutputConfigInfo, + returnLength, + out returnLength, + IntPtr.Zero); + if (ERROR_NO_MORE_ITEMS == retVal) + break; + if (ERROR_INSUFFICIENT_BUFFER == retVal) // ERROR_INSUFFICIENT_BUFFER = 122 + { + pOutputConfigInfo = Marshal.AllocCoTaskMem(returnLength); + + try + { + retVal = HttpQueryServiceConfiguration(IntPtr.Zero, + queryType, + pInputConfigInfo, + inputConfigInfoSize, + pOutputConfigInfo, + returnLength, + out returnLength, + IntPtr.Zero); + ThrowWin32ExceptionIfError(retVal); + + var outputConfigInfo = (HTTP_SERVICE_CONFIG_SSL_SET)Marshal.PtrToStructure( + pOutputConfigInfo, typeof(HTTP_SERVICE_CONFIG_SSL_SET)); + + byte[] hash = new byte[outputConfigInfo.ParamDesc.SslHashLength]; + Marshal.Copy(outputConfigInfo.ParamDesc.pSslHash, hash, 0, hash.Length); + + Guid appId = outputConfigInfo.ParamDesc.AppId; + string storeName = outputConfigInfo.ParamDesc.pSslCertStoreName; + IPEndPoint ipPort = ReadSockaddrStructure(outputConfigInfo.KeyDesc.pIpPort); + + var resultItem = new SslCertificateInfo + { + AppId = appId, + Hash = hash, + StoreName = storeName, + IpPort = ipPort + }; + result.Add(resultItem); + token++; + } + finally + { + Marshal.FreeCoTaskMem(pOutputConfigInfo); + } + } + else + { + ThrowWin32ExceptionIfError(retVal); + } + } + finally + { + Marshal.FreeCoTaskMem(pInputConfigInfo); + } + + } while (NOERROR == retVal); + + }); + + return result.ToArray(); + } + + public static void ReserveURL(string networkURL, string securityDescriptor) + { + if (String.IsNullOrEmpty(networkURL)) throw new ArgumentNullException("networkURL"); + if (String.IsNullOrEmpty(securityDescriptor)) throw new ArgumentNullException("securityDescriptor"); + + CallHttpApi( + delegate + { + uint retVal = (uint)NOERROR; // NOERROR = 0 + + HTTP_SERVICE_CONFIG_URLACL_KEY keyDesc = new HTTP_SERVICE_CONFIG_URLACL_KEY(networkURL); + HTTP_SERVICE_CONFIG_URLACL_PARAM paramDesc = new HTTP_SERVICE_CONFIG_URLACL_PARAM(securityDescriptor); + + HTTP_SERVICE_CONFIG_URLACL_SET inputConfigInfoSet = new HTTP_SERVICE_CONFIG_URLACL_SET(); + inputConfigInfoSet.KeyDesc = keyDesc; + inputConfigInfoSet.ParamDesc = paramDesc; + + IntPtr pInputConfigInfo = Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(HTTP_SERVICE_CONFIG_URLACL_SET))); + Marshal.StructureToPtr(inputConfigInfoSet, pInputConfigInfo, false); + try + { + retVal = HttpApi.HttpSetServiceConfiguration(IntPtr.Zero, + HTTP_SERVICE_CONFIG_ID.HttpServiceConfigUrlAclInfo, + pInputConfigInfo, + Marshal.SizeOf(inputConfigInfoSet), + IntPtr.Zero); + + if ((uint)ERROR_ALREADY_EXISTS == retVal) // ERROR_ALREADY_EXISTS = 183 + { + retVal = HttpApi.HttpDeleteServiceConfiguration(IntPtr.Zero, + HTTP_SERVICE_CONFIG_ID.HttpServiceConfigUrlAclInfo, + pInputConfigInfo, + Marshal.SizeOf(inputConfigInfoSet), + IntPtr.Zero); + + if ((uint)NOERROR == retVal) + { + retVal = HttpApi.HttpSetServiceConfiguration(IntPtr.Zero, + HTTP_SERVICE_CONFIG_ID.HttpServiceConfigUrlAclInfo, + pInputConfigInfo, + Marshal.SizeOf(inputConfigInfoSet), + IntPtr.Zero); + } + } + } + finally + { + Marshal.FreeCoTaskMem(pInputConfigInfo); + HttpApi.HttpTerminate(HttpApi.HTTP_INITIALIZE_CONFIG, IntPtr.Zero); + } + if ((uint)NOERROR != retVal) + { + ThrowWin32ExceptionIfError(retVal); + } + }); + } + + #endregion + + private static void ThrowWin32ExceptionIfError(uint retVal) + { + if (NOERROR != retVal) + { + throw new Win32Exception(Convert.ToInt32(retVal)); + } + } + + private static void CallHttpApi(Action body) + { + uint retVal = HttpInitialize(HttpApiVersion, HTTP_INITIALIZE_CONFIG, IntPtr.Zero); + ThrowWin32ExceptionIfError(retVal); + + try + { + body(); + } + finally + { + HttpTerminate(HTTP_INITIALIZE_CONFIG, IntPtr.Zero); + } + } + + /// + /// Creates an unmanaged sockaddr structure to pass to a WinAPI function. + /// + /// IP address and port number + /// a handle for the structure. Use the AddrOfPinnedObject Method to get a stable pointer to the object. + /// When the handle goes out of scope you must explicitly release it by calling the Free method; otherwise, memory leaks may occur. + private static GCHandle CreateSockaddrStructure(IPEndPoint ipEndPoint) + { + SocketAddress socketAddress = ipEndPoint.Serialize(); + + // use an array of bytes instead of the sockaddr structure + byte[] sockAddrStructureBytes = new byte[socketAddress.Size]; + GCHandle sockAddrHandle = GCHandle.Alloc(sockAddrStructureBytes, GCHandleType.Pinned); + for (int i = 0; i < socketAddress.Size; ++i) + { + sockAddrStructureBytes[i] = socketAddress[i]; + } + return sockAddrHandle; + } + + /// + /// Reads the unmanaged sockaddr structure returned by a WinAPI function + /// + /// pointer to the unmanaged sockaddr structure + /// IP address and port number + private static IPEndPoint ReadSockaddrStructure(IntPtr pSockaddrStructure) + { + short sAddressFamily = Marshal.ReadInt16(pSockaddrStructure); + AddressFamily addressFamily = (AddressFamily)sAddressFamily; + + int sockAddrSructureSize; + IPEndPoint ipEndPointAny; + switch (addressFamily) + { + case AddressFamily.InterNetwork: + // IP v4 address + sockAddrSructureSize = 16; + ipEndPointAny = new IPEndPoint(IPAddress.Any, 0); + break; + case AddressFamily.InterNetworkV6: + // IP v6 address + sockAddrSructureSize = 28; + ipEndPointAny = new IPEndPoint(IPAddress.IPv6Any, 0); + break; + default: + throw new ArgumentOutOfRangeException("pSockaddrStructure", "Unknown address family"); + } + + + // get bytes of the sockadrr structure + byte[] sockAddrSructureBytes = new byte[sockAddrSructureSize]; + Marshal.Copy(pSockaddrStructure, sockAddrSructureBytes, 0, sockAddrSructureSize); + + // create SocketAddress from bytes + var socketAddress = new SocketAddress(AddressFamily.Unspecified, sockAddrSructureSize); + for (int i = 0; i < sockAddrSructureSize; i++) + { + socketAddress[i] = sockAddrSructureBytes[i]; + } + + // create IPEndPoint from SocketAddress + IPEndPoint result = (IPEndPoint)ipEndPointAny.Create(socketAddress); + + return result; + } + } +} diff --git a/ConfigHttpApi/Properties/AssemblyInfo.cs b/ConfigHttpApi/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..c63c94dd --- /dev/null +++ b/ConfigHttpApi/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// Allgemeine Informationen über eine Assembly werden über die folgenden +// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern, +// die mit einer Assembly verknüpft sind. +[assembly: AssemblyTitle("ConfigHttpApi")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("ConfigHttpApi")] +[assembly: AssemblyCopyright("Copyright © 2013")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Durch Festlegen von ComVisible auf "false" werden die Typen in dieser Assembly unsichtbar +// für COM-Komponenten. Wenn Sie auf einen Typ in dieser Assembly von +// COM zugreifen müssen, legen Sie das ComVisible-Attribut für diesen Typ auf "true" fest. +[assembly: ComVisible(false)] + +// Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird +[assembly: Guid("89f719af-3a0d-4704-be7f-16e5b4e19c02")] + +// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten: +// +// Hauptversion +// Nebenversion +// Buildnummer +// Revision +// +// Sie können alle Werte angeben oder die standardmäßigen Build- und Revisionsnummern +// übernehmen, indem Sie "*" eingeben: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Vocaluxe.sln b/Vocaluxe.sln index a493fead..c56b17b3 100644 --- a/Vocaluxe.sln +++ b/Vocaluxe.sln @@ -23,6 +23,8 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "GstreamerHelper", "Gstreame EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ClientServerLib", "ClientServerLib\ClientServerLib\ClientServerLib.csproj", "{EC5167E4-CCFB-4CEE-987C-CF816F1062A3}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebserverInitalConfig", "WebserverInitalConfig\WebserverInitalConfig.csproj", "{55F89808-4E79-4FFE-BC13-48258913F5C9}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution DebugLinux|x64 = DebugLinux|x64 @@ -100,72 +102,186 @@ Global {6F3E1874-F28A-40E9-AFBD-31934D593679}.ReleaseWin|x64.Build.0 = ReleaseWin|x64 {6F3E1874-F28A-40E9-AFBD-31934D593679}.ReleaseWin|x86.ActiveCfg = ReleaseWin|x86 {6F3E1874-F28A-40E9-AFBD-31934D593679}.ReleaseWin|x86.Build.0 = ReleaseWin|x86 + {5A4053F1-5AD5-441F-B254-D97A088127B6}.Debug|Any CPU.ActiveCfg = DebugWin|x86 + {5A4053F1-5AD5-441F-B254-D97A088127B6}.Debug|Mixed Platforms.ActiveCfg = DebugWin|x86 + {5A4053F1-5AD5-441F-B254-D97A088127B6}.Debug|Mixed Platforms.Build.0 = DebugWin|x86 + {5A4053F1-5AD5-441F-B254-D97A088127B6}.Debug|x64.ActiveCfg = DebugWin|x64 + {5A4053F1-5AD5-441F-B254-D97A088127B6}.Debug|x64.Build.0 = DebugWin|x64 + {5A4053F1-5AD5-441F-B254-D97A088127B6}.Debug|x86.ActiveCfg = DebugWin|x86 + {5A4053F1-5AD5-441F-B254-D97A088127B6}.Debug|x86.Build.0 = DebugWin|x86 + {5A4053F1-5AD5-441F-B254-D97A088127B6}.DebugLinux|Any CPU.ActiveCfg = DebugLinux|x86 + {5A4053F1-5AD5-441F-B254-D97A088127B6}.DebugLinux|Mixed Platforms.ActiveCfg = DebugLinux|x86 + {5A4053F1-5AD5-441F-B254-D97A088127B6}.DebugLinux|Mixed Platforms.Build.0 = DebugLinux|x86 {5A4053F1-5AD5-441F-B254-D97A088127B6}.DebugLinux|x64.ActiveCfg = DebugLinux|x64 {5A4053F1-5AD5-441F-B254-D97A088127B6}.DebugLinux|x64.Build.0 = DebugLinux|x64 {5A4053F1-5AD5-441F-B254-D97A088127B6}.DebugLinux|x86.ActiveCfg = DebugLinux|x86 {5A4053F1-5AD5-441F-B254-D97A088127B6}.DebugLinux|x86.Build.0 = DebugLinux|x86 + {5A4053F1-5AD5-441F-B254-D97A088127B6}.DebugWin|Any CPU.ActiveCfg = DebugWin|x86 + {5A4053F1-5AD5-441F-B254-D97A088127B6}.DebugWin|Mixed Platforms.ActiveCfg = DebugWin|x86 + {5A4053F1-5AD5-441F-B254-D97A088127B6}.DebugWin|Mixed Platforms.Build.0 = DebugWin|x86 {5A4053F1-5AD5-441F-B254-D97A088127B6}.DebugWin|x64.ActiveCfg = DebugWin|x64 {5A4053F1-5AD5-441F-B254-D97A088127B6}.DebugWin|x64.Build.0 = DebugWin|x64 {5A4053F1-5AD5-441F-B254-D97A088127B6}.DebugWin|x86.ActiveCfg = DebugWin|x86 {5A4053F1-5AD5-441F-B254-D97A088127B6}.DebugWin|x86.Build.0 = DebugWin|x86 - {5A4053F1-5AD5-441F-B254-D97A088127B6}.InstallerWin|x64.ActiveCfg = InstallerWin|x64 - {5A4053F1-5AD5-441F-B254-D97A088127B6}.InstallerWin|x64.Build.0 = InstallerWin|x64 - {5A4053F1-5AD5-441F-B254-D97A088127B6}.InstallerWin|x86.ActiveCfg = InstallerWin|x86 - {5A4053F1-5AD5-441F-B254-D97A088127B6}.InstallerWin|x86.Build.0 = InstallerWin|x86 + {5A4053F1-5AD5-441F-B254-D97A088127B6}.Release|Any CPU.ActiveCfg = ReleaseWin|x86 + {5A4053F1-5AD5-441F-B254-D97A088127B6}.Release|Mixed Platforms.ActiveCfg = ReleaseWin|x86 + {5A4053F1-5AD5-441F-B254-D97A088127B6}.Release|Mixed Platforms.Build.0 = ReleaseWin|x86 + {5A4053F1-5AD5-441F-B254-D97A088127B6}.Release|x64.ActiveCfg = ReleaseWin|x64 + {5A4053F1-5AD5-441F-B254-D97A088127B6}.Release|x64.Build.0 = ReleaseWin|x64 + {5A4053F1-5AD5-441F-B254-D97A088127B6}.Release|x86.ActiveCfg = ReleaseWin|x86 + {5A4053F1-5AD5-441F-B254-D97A088127B6}.Release|x86.Build.0 = ReleaseWin|x86 + {5A4053F1-5AD5-441F-B254-D97A088127B6}.ReleaseLinux|Any CPU.ActiveCfg = ReleaseLinux|x86 + {5A4053F1-5AD5-441F-B254-D97A088127B6}.ReleaseLinux|Mixed Platforms.ActiveCfg = ReleaseLinux|x86 + {5A4053F1-5AD5-441F-B254-D97A088127B6}.ReleaseLinux|Mixed Platforms.Build.0 = ReleaseLinux|x86 {5A4053F1-5AD5-441F-B254-D97A088127B6}.ReleaseLinux|x64.ActiveCfg = ReleaseLinux|x64 {5A4053F1-5AD5-441F-B254-D97A088127B6}.ReleaseLinux|x64.Build.0 = ReleaseLinux|x64 {5A4053F1-5AD5-441F-B254-D97A088127B6}.ReleaseLinux|x86.ActiveCfg = ReleaseLinux|x86 {5A4053F1-5AD5-441F-B254-D97A088127B6}.ReleaseLinux|x86.Build.0 = ReleaseLinux|x86 + {5A4053F1-5AD5-441F-B254-D97A088127B6}.ReleaseWin|Any CPU.ActiveCfg = ReleaseWin|x86 + {5A4053F1-5AD5-441F-B254-D97A088127B6}.ReleaseWin|Mixed Platforms.ActiveCfg = ReleaseWin|x86 + {5A4053F1-5AD5-441F-B254-D97A088127B6}.ReleaseWin|Mixed Platforms.Build.0 = ReleaseWin|x86 {5A4053F1-5AD5-441F-B254-D97A088127B6}.ReleaseWin|x64.ActiveCfg = ReleaseWin|x64 {5A4053F1-5AD5-441F-B254-D97A088127B6}.ReleaseWin|x64.Build.0 = ReleaseWin|x64 {5A4053F1-5AD5-441F-B254-D97A088127B6}.ReleaseWin|x86.ActiveCfg = ReleaseWin|x86 {5A4053F1-5AD5-441F-B254-D97A088127B6}.ReleaseWin|x86.Build.0 = ReleaseWin|x86 + {6F3E1874-F28A-40E9-AFBD-31934D593678}.Debug|Any CPU.ActiveCfg = DebugWin|x86 + {6F3E1874-F28A-40E9-AFBD-31934D593678}.Debug|Mixed Platforms.ActiveCfg = DebugWin|x86 + {6F3E1874-F28A-40E9-AFBD-31934D593678}.Debug|Mixed Platforms.Build.0 = DebugWin|x86 + {6F3E1874-F28A-40E9-AFBD-31934D593678}.Debug|x64.ActiveCfg = DebugWin|x64 + {6F3E1874-F28A-40E9-AFBD-31934D593678}.Debug|x64.Build.0 = DebugWin|x64 + {6F3E1874-F28A-40E9-AFBD-31934D593678}.Debug|x86.ActiveCfg = DebugWin|x86 + {6F3E1874-F28A-40E9-AFBD-31934D593678}.Debug|x86.Build.0 = DebugWin|x86 + {6F3E1874-F28A-40E9-AFBD-31934D593678}.DebugLinux|Any CPU.ActiveCfg = DebugLinux|x86 + {6F3E1874-F28A-40E9-AFBD-31934D593678}.DebugLinux|Mixed Platforms.ActiveCfg = DebugLinux|x86 + {6F3E1874-F28A-40E9-AFBD-31934D593678}.DebugLinux|Mixed Platforms.Build.0 = DebugLinux|x86 {6F3E1874-F28A-40E9-AFBD-31934D593678}.DebugLinux|x64.ActiveCfg = DebugLinux|x64 {6F3E1874-F28A-40E9-AFBD-31934D593678}.DebugLinux|x64.Build.0 = DebugLinux|x64 {6F3E1874-F28A-40E9-AFBD-31934D593678}.DebugLinux|x86.ActiveCfg = DebugLinux|x86 {6F3E1874-F28A-40E9-AFBD-31934D593678}.DebugLinux|x86.Build.0 = DebugLinux|x86 + {6F3E1874-F28A-40E9-AFBD-31934D593678}.DebugWin|Any CPU.ActiveCfg = DebugWin|x86 + {6F3E1874-F28A-40E9-AFBD-31934D593678}.DebugWin|Mixed Platforms.ActiveCfg = DebugWin|x86 + {6F3E1874-F28A-40E9-AFBD-31934D593678}.DebugWin|Mixed Platforms.Build.0 = DebugWin|x86 {6F3E1874-F28A-40E9-AFBD-31934D593678}.DebugWin|x64.ActiveCfg = DebugWin|x64 {6F3E1874-F28A-40E9-AFBD-31934D593678}.DebugWin|x64.Build.0 = DebugWin|x64 {6F3E1874-F28A-40E9-AFBD-31934D593678}.DebugWin|x86.ActiveCfg = DebugWin|x86 {6F3E1874-F28A-40E9-AFBD-31934D593678}.DebugWin|x86.Build.0 = DebugWin|x86 - {6F3E1874-F28A-40E9-AFBD-31934D593678}.InstallerWin|x64.ActiveCfg = InstallerWin|x64 - {6F3E1874-F28A-40E9-AFBD-31934D593678}.InstallerWin|x64.Build.0 = InstallerWin|x64 - {6F3E1874-F28A-40E9-AFBD-31934D593678}.InstallerWin|x86.ActiveCfg = InstallerWin|x86 - {6F3E1874-F28A-40E9-AFBD-31934D593678}.InstallerWin|x86.Build.0 = InstallerWin|x86 + {6F3E1874-F28A-40E9-AFBD-31934D593678}.Release|Any CPU.ActiveCfg = ReleaseWin|x86 + {6F3E1874-F28A-40E9-AFBD-31934D593678}.Release|Mixed Platforms.ActiveCfg = ReleaseWin|x86 + {6F3E1874-F28A-40E9-AFBD-31934D593678}.Release|Mixed Platforms.Build.0 = ReleaseWin|x86 + {6F3E1874-F28A-40E9-AFBD-31934D593678}.Release|x64.ActiveCfg = ReleaseWin|x64 + {6F3E1874-F28A-40E9-AFBD-31934D593678}.Release|x64.Build.0 = ReleaseWin|x64 + {6F3E1874-F28A-40E9-AFBD-31934D593678}.Release|x86.ActiveCfg = ReleaseWin|x86 + {6F3E1874-F28A-40E9-AFBD-31934D593678}.Release|x86.Build.0 = ReleaseWin|x86 + {6F3E1874-F28A-40E9-AFBD-31934D593678}.ReleaseLinux|Any CPU.ActiveCfg = ReleaseLinux|x86 + {6F3E1874-F28A-40E9-AFBD-31934D593678}.ReleaseLinux|Mixed Platforms.ActiveCfg = ReleaseLinux|x86 + {6F3E1874-F28A-40E9-AFBD-31934D593678}.ReleaseLinux|Mixed Platforms.Build.0 = ReleaseLinux|x86 {6F3E1874-F28A-40E9-AFBD-31934D593678}.ReleaseLinux|x64.ActiveCfg = ReleaseLinux|x64 {6F3E1874-F28A-40E9-AFBD-31934D593678}.ReleaseLinux|x64.Build.0 = ReleaseLinux|x64 {6F3E1874-F28A-40E9-AFBD-31934D593678}.ReleaseLinux|x86.ActiveCfg = ReleaseLinux|x86 {6F3E1874-F28A-40E9-AFBD-31934D593678}.ReleaseLinux|x86.Build.0 = ReleaseLinux|x86 + {6F3E1874-F28A-40E9-AFBD-31934D593678}.ReleaseWin|Any CPU.ActiveCfg = ReleaseWin|x86 + {6F3E1874-F28A-40E9-AFBD-31934D593678}.ReleaseWin|Mixed Platforms.ActiveCfg = ReleaseWin|x86 + {6F3E1874-F28A-40E9-AFBD-31934D593678}.ReleaseWin|Mixed Platforms.Build.0 = ReleaseWin|x86 {6F3E1874-F28A-40E9-AFBD-31934D593678}.ReleaseWin|x64.ActiveCfg = ReleaseWin|x64 {6F3E1874-F28A-40E9-AFBD-31934D593678}.ReleaseWin|x64.Build.0 = ReleaseWin|x64 {6F3E1874-F28A-40E9-AFBD-31934D593678}.ReleaseWin|x86.ActiveCfg = ReleaseWin|x86 {6F3E1874-F28A-40E9-AFBD-31934D593678}.ReleaseWin|x86.Build.0 = ReleaseWin|x86 + {ED007796-367F-4142-AA55-5450C7645C2C}.Debug|Any CPU.ActiveCfg = DebugWin|Win32 + {ED007796-367F-4142-AA55-5450C7645C2C}.Debug|Mixed Platforms.ActiveCfg = DebugWin|Win32 + {ED007796-367F-4142-AA55-5450C7645C2C}.Debug|Mixed Platforms.Build.0 = DebugWin|Win32 + {ED007796-367F-4142-AA55-5450C7645C2C}.Debug|x64.ActiveCfg = DebugWin|x64 + {ED007796-367F-4142-AA55-5450C7645C2C}.Debug|x64.Build.0 = DebugWin|x64 + {ED007796-367F-4142-AA55-5450C7645C2C}.Debug|x86.ActiveCfg = DebugWin|Win32 + {ED007796-367F-4142-AA55-5450C7645C2C}.Debug|x86.Build.0 = DebugWin|Win32 + {ED007796-367F-4142-AA55-5450C7645C2C}.DebugLinux|Any CPU.ActiveCfg = DebugWin|Win32 + {ED007796-367F-4142-AA55-5450C7645C2C}.DebugLinux|Mixed Platforms.ActiveCfg = DebugWin|Win32 + {ED007796-367F-4142-AA55-5450C7645C2C}.DebugLinux|Mixed Platforms.Build.0 = DebugWin|Win32 {ED007796-367F-4142-AA55-5450C7645C2C}.DebugLinux|x64.ActiveCfg = DebugWin|x64 {ED007796-367F-4142-AA55-5450C7645C2C}.DebugLinux|x86.ActiveCfg = DebugWin|x64 + {ED007796-367F-4142-AA55-5450C7645C2C}.DebugWin|Any CPU.ActiveCfg = DebugWin|Win32 + {ED007796-367F-4142-AA55-5450C7645C2C}.DebugWin|Mixed Platforms.ActiveCfg = DebugWin|Win32 + {ED007796-367F-4142-AA55-5450C7645C2C}.DebugWin|Mixed Platforms.Build.0 = DebugWin|Win32 {ED007796-367F-4142-AA55-5450C7645C2C}.DebugWin|x64.ActiveCfg = DebugWin|x64 {ED007796-367F-4142-AA55-5450C7645C2C}.DebugWin|x64.Build.0 = DebugWin|x64 {ED007796-367F-4142-AA55-5450C7645C2C}.DebugWin|x86.ActiveCfg = DebugWin|Win32 {ED007796-367F-4142-AA55-5450C7645C2C}.DebugWin|x86.Build.0 = DebugWin|Win32 - {ED007796-367F-4142-AA55-5450C7645C2C}.InstallerWin|x64.ActiveCfg = InstallerWin|x64 - {ED007796-367F-4142-AA55-5450C7645C2C}.InstallerWin|x64.Build.0 = InstallerWin|x64 - {ED007796-367F-4142-AA55-5450C7645C2C}.InstallerWin|x86.ActiveCfg = InstallerWin|Win32 - {ED007796-367F-4142-AA55-5450C7645C2C}.InstallerWin|x86.Build.0 = InstallerWin|Win32 + {ED007796-367F-4142-AA55-5450C7645C2C}.Release|Any CPU.ActiveCfg = ReleaseWin|Win32 + {ED007796-367F-4142-AA55-5450C7645C2C}.Release|Mixed Platforms.ActiveCfg = ReleaseWin|Win32 + {ED007796-367F-4142-AA55-5450C7645C2C}.Release|Mixed Platforms.Build.0 = ReleaseWin|Win32 + {ED007796-367F-4142-AA55-5450C7645C2C}.Release|x64.ActiveCfg = ReleaseWin|x64 + {ED007796-367F-4142-AA55-5450C7645C2C}.Release|x64.Build.0 = ReleaseWin|x64 + {ED007796-367F-4142-AA55-5450C7645C2C}.Release|x86.ActiveCfg = ReleaseWin|Win32 + {ED007796-367F-4142-AA55-5450C7645C2C}.Release|x86.Build.0 = ReleaseWin|Win32 + {ED007796-367F-4142-AA55-5450C7645C2C}.ReleaseLinux|Any CPU.ActiveCfg = ReleaseWin|Win32 + {ED007796-367F-4142-AA55-5450C7645C2C}.ReleaseLinux|Mixed Platforms.ActiveCfg = ReleaseWin|Win32 + {ED007796-367F-4142-AA55-5450C7645C2C}.ReleaseLinux|Mixed Platforms.Build.0 = ReleaseWin|Win32 {ED007796-367F-4142-AA55-5450C7645C2C}.ReleaseLinux|x64.ActiveCfg = ReleaseWin|x64 {ED007796-367F-4142-AA55-5450C7645C2C}.ReleaseLinux|x86.ActiveCfg = ReleaseWin|x64 + {ED007796-367F-4142-AA55-5450C7645C2C}.ReleaseWin|Any CPU.ActiveCfg = ReleaseWin|Win32 + {ED007796-367F-4142-AA55-5450C7645C2C}.ReleaseWin|Mixed Platforms.ActiveCfg = ReleaseWin|Win32 + {ED007796-367F-4142-AA55-5450C7645C2C}.ReleaseWin|Mixed Platforms.Build.0 = ReleaseWin|Win32 {ED007796-367F-4142-AA55-5450C7645C2C}.ReleaseWin|x64.ActiveCfg = ReleaseWin|x64 {ED007796-367F-4142-AA55-5450C7645C2C}.ReleaseWin|x64.Build.0 = ReleaseWin|x64 {ED007796-367F-4142-AA55-5450C7645C2C}.ReleaseWin|x86.ActiveCfg = ReleaseWin|Win32 {ED007796-367F-4142-AA55-5450C7645C2C}.ReleaseWin|x86.Build.0 = ReleaseWin|Win32 + {EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.Debug|x64.ActiveCfg = Debug|Any CPU + {EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.Debug|x86.ActiveCfg = Debug|Any CPU + {EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.DebugLinux|Any CPU.ActiveCfg = Debug|Any CPU + {EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.DebugLinux|Any CPU.Build.0 = Debug|Any CPU + {EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.DebugLinux|Mixed Platforms.ActiveCfg = Debug|Any CPU + {EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.DebugLinux|Mixed Platforms.Build.0 = Debug|Any CPU {EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.DebugLinux|x64.ActiveCfg = Debug|Any CPU {EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.DebugLinux|x86.ActiveCfg = Debug|Any CPU + {EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.DebugWin|Any CPU.ActiveCfg = Debug|Any CPU + {EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.DebugWin|Any CPU.Build.0 = Debug|Any CPU + {EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.DebugWin|Mixed Platforms.ActiveCfg = Debug|Any CPU + {EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.DebugWin|Mixed Platforms.Build.0 = Debug|Any CPU {EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.DebugWin|x64.ActiveCfg = Debug|Any CPU {EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.DebugWin|x86.ActiveCfg = Debug|Any CPU + {EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.Release|Any CPU.Build.0 = Release|Any CPU + {EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.Release|Mixed Platforms.Build.0 = Release|Any CPU {EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.Release|x64.ActiveCfg = Release|Any CPU {EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.Release|x86.ActiveCfg = Release|Any CPU + {EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.ReleaseLinux|Any CPU.ActiveCfg = Release|Any CPU + {EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.ReleaseLinux|Any CPU.Build.0 = Release|Any CPU + {EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.ReleaseLinux|Mixed Platforms.ActiveCfg = Release|Any CPU + {EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.ReleaseLinux|Mixed Platforms.Build.0 = Release|Any CPU {EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.ReleaseLinux|x64.ActiveCfg = Release|Any CPU {EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.ReleaseLinux|x86.ActiveCfg = Release|Any CPU + {EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.ReleaseWin|Any CPU.ActiveCfg = Release|Any CPU + {EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.ReleaseWin|Any CPU.Build.0 = Release|Any CPU + {EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.ReleaseWin|Mixed Platforms.ActiveCfg = Release|Any CPU + {EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.ReleaseWin|Mixed Platforms.Build.0 = Release|Any CPU {EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.ReleaseWin|x64.ActiveCfg = Release|Any CPU {EC5167E4-CCFB-4CEE-987C-CF816F1062A3}.ReleaseWin|x86.ActiveCfg = Release|Any CPU + {55F89808-4E79-4FFE-BC13-48258913F5C9}.DebugLinux|Any CPU.ActiveCfg = Debug|Any CPU + {55F89808-4E79-4FFE-BC13-48258913F5C9}.DebugLinux|Any CPU.Build.0 = Debug|Any CPU + {55F89808-4E79-4FFE-BC13-48258913F5C9}.DebugLinux|Mixed Platforms.ActiveCfg = Debug|Any CPU + {55F89808-4E79-4FFE-BC13-48258913F5C9}.DebugLinux|x64.ActiveCfg = Debug|Any CPU + {55F89808-4E79-4FFE-BC13-48258913F5C9}.DebugLinux|x86.ActiveCfg = Debug|Any CPU + {55F89808-4E79-4FFE-BC13-48258913F5C9}.DebugWin|Any CPU.ActiveCfg = Debug|Any CPU + {55F89808-4E79-4FFE-BC13-48258913F5C9}.DebugWin|Any CPU.Build.0 = Debug|Any CPU + {55F89808-4E79-4FFE-BC13-48258913F5C9}.DebugWin|Mixed Platforms.ActiveCfg = Debug|Any CPU + {55F89808-4E79-4FFE-BC13-48258913F5C9}.DebugWin|Mixed Platforms.Build.0 = Debug|Any CPU + {55F89808-4E79-4FFE-BC13-48258913F5C9}.DebugWin|x64.ActiveCfg = Debug|Any CPU + {55F89808-4E79-4FFE-BC13-48258913F5C9}.DebugWin|x86.ActiveCfg = Debug|Any CPU + {55F89808-4E79-4FFE-BC13-48258913F5C9}.ReleaseLinux|Any CPU.ActiveCfg = Release|Any CPU + {55F89808-4E79-4FFE-BC13-48258913F5C9}.ReleaseLinux|Any CPU.Build.0 = Release|Any CPU + {55F89808-4E79-4FFE-BC13-48258913F5C9}.ReleaseLinux|Mixed Platforms.ActiveCfg = Release|Any CPU + {55F89808-4E79-4FFE-BC13-48258913F5C9}.ReleaseLinux|x64.ActiveCfg = Release|Any CPU + {55F89808-4E79-4FFE-BC13-48258913F5C9}.ReleaseLinux|x86.ActiveCfg = Release|Any CPU + {55F89808-4E79-4FFE-BC13-48258913F5C9}.ReleaseWin|Any CPU.ActiveCfg = Release|Any CPU + {55F89808-4E79-4FFE-BC13-48258913F5C9}.ReleaseWin|Any CPU.Build.0 = Release|Any CPU + {55F89808-4E79-4FFE-BC13-48258913F5C9}.ReleaseWin|Mixed Platforms.ActiveCfg = Release|Any CPU + {55F89808-4E79-4FFE-BC13-48258913F5C9}.ReleaseWin|Mixed Platforms.Build.0 = Release|Any CPU + {55F89808-4E79-4FFE-BC13-48258913F5C9}.ReleaseWin|x64.ActiveCfg = Release|Any CPU + {55F89808-4E79-4FFE-BC13-48258913F5C9}.ReleaseWin|x86.ActiveCfg = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/Vocaluxe/Base/Server/CVocaluxeServer.cs b/Vocaluxe/Base/Server/CVocaluxeServer.cs index 94d9a32e..9440028b 100644 --- a/Vocaluxe/Base/Server/CVocaluxeServer.cs +++ b/Vocaluxe/Base/Server/CVocaluxeServer.cs @@ -43,17 +43,10 @@ namespace Vocaluxe.Base.Server public static void Init() { _Clients = new Dictionary(); - if (CConfig.ServerEncryption == EOffOn.TR_CONFIG_ON) - { - _Server = new CServer(CConfig.ServerPort); - //_Server = new CServer(RequestHandler, CConfig.ServerPort, CConfig.ServerPassword); - } - else - { - _Server = new CServer(CConfig.ServerPort); - //_Server = new CServer(RequestHandler, CConfig.ServerPort, String.Empty); - } + _Server = new CServer(CConfig.ServerPort, CConfig.ServerEncryption == EOffOn.TR_CONFIG_ON); + //_Server = new CServer(RequestHandler, CConfig.ServerPort, CConfig.ServerPassword); + CServer.SendKeyEvent = sendKeyEvent; CServer.GetProfileData = getProfileData; CServer.SendProfileData = sendProfileData; @@ -338,7 +331,7 @@ namespace Vocaluxe.Base.Server private static SongInfo[] getAllSongs() { - var songs = CSongs.Songs; + var songs = CSongs.Songs; return (from s in songs select getSongInfo(s, false)).ToArray(); } diff --git a/WebserverInitalConfig/App.config b/WebserverInitalConfig/App.config new file mode 100644 index 00000000..8e156463 --- /dev/null +++ b/WebserverInitalConfig/App.config @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/WebserverInitalConfig/ConfigHttpApi.cs b/WebserverInitalConfig/ConfigHttpApi.cs new file mode 100644 index 00000000..5095d878 --- /dev/null +++ b/WebserverInitalConfig/ConfigHttpApi.cs @@ -0,0 +1,111 @@ +using Security.Cryptography; +using Security.Cryptography.X509Certificates; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Net; +using System.Security.Cryptography; +using System.Security.Cryptography.X509Certificates; +using System.Security.Permissions; +using System.Text; +using System.Threading.Tasks; + +namespace WebserverInitalConfig +{ + public static class ConfigHttpApi + { + + public static void reserveURL(string networkString) + { + HttpApi.ReserveURL(networkString, "D:(A;;GX;;;S-1-1-0)"); + } + + + public static void bindCert(string ip, int port, X509Certificate2 cert) + { + IPEndPoint endpoint = new IPEndPoint(IPAddress.Parse(ip), port); + if (HttpApi.QuerySslCertificateInfo(endpoint) != null) + { + HttpApi.DeleteCertificateBinding(endpoint); + } + + HttpApi.BindCertificate(endpoint, cert.GetCertHash(), StoreName.My, new Guid("{7baf41f1-48b7-42cb-b145-f815499cb48f}")); + } + + + public static void addCertToStore(X509Certificate2 cert) + { + X509Store store = new X509Store(StoreName.My, StoreLocation.LocalMachine); + store.Open(OpenFlags.ReadWrite); + + X509Certificate2Collection oldCerts = store.Certificates.Find(X509FindType.FindBySubjectDistinguishedName, + cert.SubjectName.Name, false); + + foreach (var oldCert in oldCerts) + { + store.Remove(oldCert); + } + + store.Add(cert); + store.Close(); + } + + + public static X509Certificate2 getSelfSignedCert(string subjectName) + { + var keyParam = new CngKeyCreationParameters + { + ExportPolicy = CngExportPolicies.AllowExport, + KeyCreationOptions = CngKeyCreationOptions.MachineKey | CngKeyCreationOptions.OverwriteExistingKey, + KeyUsage = CngKeyUsages.AllUsages, + Provider = CngProvider.MicrosoftSoftwareKeyStorageProvider, + }; + + keyParam.Parameters.Add(new CngProperty("Length", BitConverter.GetBytes(2048), CngPropertyOptions.None)); + + CngKey key = CngKey.Create(CngAlgorithm2.Rsa, Guid.NewGuid().ToString(), keyParam); + + X509CertificateCreationParameters param = new X509CertificateCreationParameters( + new X500DistinguishedName(subjectName)); + param.SubjectName = new X500DistinguishedName(subjectName); + param.EndTime = DateTime.Today.AddYears(20); + //param.SignatureAlgorithm = X509CertificateSignatureAlgorithm.RsaSha512; + + OidCollection oc = new OidCollection(); + oc.Add(new Oid("1.3.6.1.5.5.7.3.1")); + X509Extension eku = new X509EnhancedKeyUsageExtension(oc, true); + param.Extensions.Add(eku); + + param.TakeOwnershipOfKey = true; + + byte[] rawData = key.CreateSelfSignedCertificate(param).Export(X509ContentType.Pfx, ""); + var cert = new X509Certificate2(rawData, "", X509KeyStorageFlags.Exportable | X509KeyStorageFlags.PersistKeySet); + cert.FriendlyName = "Vocaluxe Server Certificate"; + return cert; + } + + + /*public static X509Certificate2 getCert(string subject) + { + RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); + + Mono.Security.Authenticode.PrivateKey key = new Mono.Security.Authenticode.PrivateKey { RSA=RSA.Create()}; + + + Mono.Security.X509.X509CertificateBuilder x509 = new Mono.Security.X509.X509CertificateBuilder(); + x509.IssuerName = "CN=Vocaluxe Server"; + x509.NotAfter = DateTime.Today.AddYears(20); + x509.NotBefore = DateTime.Today.AddDays(-1); + x509.SubjectName = subject; + x509.SerialNumber = new byte[] { 1 }; + x509.Version = 3; + x509.SubjectPublicKey = rsa; + + ExtendedKeyUsageExtension eku = new ExtendedKeyUsageExtension(); + eku.KeyPurpose.Add("1.3.6.1.5.5.7.3.1"); + x509.Extensions.Add(eku); + + return new X509Certificate2(x509.Sign(rsa)); + }*/ + } +} diff --git a/WebserverInitalConfig/HttpApi.cs b/WebserverInitalConfig/HttpApi.cs new file mode 100644 index 00000000..29f1994a --- /dev/null +++ b/WebserverInitalConfig/HttpApi.cs @@ -0,0 +1,672 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; +using System.Net; +using System.Net.Sockets; +using System.Runtime.InteropServices; +using System.Security.Cryptography.X509Certificates; +using System.Text; +using System.Threading.Tasks; + +namespace WebserverInitalConfig +{ + internal static class HttpApi + { + private static readonly HTTPAPI_VERSION HttpApiVersion = new HTTPAPI_VERSION(1, 0); + + #region DllImport + + [DllImport("httpapi.dll", SetLastError = true)] + static extern uint HttpInitialize( + HTTPAPI_VERSION version, + uint flags, + IntPtr pReserved); + + [DllImport("httpapi.dll", SetLastError = true)] + static extern uint HttpSetServiceConfiguration( + IntPtr serviceIntPtr, + HTTP_SERVICE_CONFIG_ID configId, + IntPtr pConfigInformation, + int configInformationLength, + IntPtr pOverlapped); + + [DllImport("httpapi.dll", SetLastError = true)] + static extern uint HttpDeleteServiceConfiguration( + IntPtr serviceIntPtr, + HTTP_SERVICE_CONFIG_ID configId, + IntPtr pConfigInformation, + int configInformationLength, + IntPtr pOverlapped); + + [DllImport("httpapi.dll", SetLastError = true)] + static extern uint HttpTerminate( + uint Flags, + IntPtr pReserved); + + [DllImport("httpapi.dll", SetLastError = true)] + static extern uint HttpQueryServiceConfiguration( + IntPtr serviceIntPtr, + HTTP_SERVICE_CONFIG_ID configId, + IntPtr pInputConfigInfo, + int inputConfigInfoLength, + IntPtr pOutputConfigInfo, + int outputConfigInfoLength, + [Optional] + out int pReturnLength, + IntPtr pOverlapped); + + + enum HTTP_SERVICE_CONFIG_ID + { + + HttpServiceConfigIPListenList = 0, + HttpServiceConfigSSLCertInfo, + HttpServiceConfigUrlAclInfo, + HttpServiceConfigMax + } + + [StructLayout(LayoutKind.Sequential)] + struct HTTP_SERVICE_CONFIG_SSL_SET + { + public HTTP_SERVICE_CONFIG_SSL_KEY KeyDesc; + public HTTP_SERVICE_CONFIG_SSL_PARAM ParamDesc; + } + + [StructLayout(LayoutKind.Sequential)] + struct HTTP_SERVICE_CONFIG_SSL_KEY + { + public IntPtr pIpPort; + + public HTTP_SERVICE_CONFIG_SSL_KEY(IntPtr pIpPort) + { + this.pIpPort = pIpPort; + } + } + + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] + struct HTTP_SERVICE_CONFIG_SSL_PARAM + { + public int SslHashLength; + public IntPtr pSslHash; + public Guid AppId; + [MarshalAs(UnmanagedType.LPWStr)] + public string pSslCertStoreName; + public uint DefaultCertCheckMode; + public int DefaultRevocationFreshnessTime; + public int DefaultRevocationUrlRetrievalTimeout; + [MarshalAs(UnmanagedType.LPWStr)] + public string pDefaultSslCtlIdentifier; + [MarshalAs(UnmanagedType.LPWStr)] + public string pDefaultSslCtlStoreName; + public uint DefaultFlags; + } + + [StructLayout(LayoutKind.Sequential, Pack = 2)] + struct HTTPAPI_VERSION + { + public ushort HttpApiMajorVersion; + public ushort HttpApiMinorVersion; + + public HTTPAPI_VERSION(ushort majorVersion, ushort minorVersion) + { + HttpApiMajorVersion = majorVersion; + HttpApiMinorVersion = minorVersion; + } + } + + [StructLayout(LayoutKind.Sequential)] + struct HTTP_SERVICE_CONFIG_SSL_QUERY + { + public HTTP_SERVICE_CONFIG_QUERY_TYPE QueryDesc; + public HTTP_SERVICE_CONFIG_SSL_KEY KeyDesc; + public uint dwToken; + } + + enum HTTP_SERVICE_CONFIG_QUERY_TYPE + { + HttpServiceConfigQueryExact = 0, + HttpServiceConfigQueryNext, + HttpServiceConfigQueryMax + } + + [StructLayout(LayoutKind.Sequential)] + struct HTTP_SERVICE_CONFIG_URLACL_SET + { + public HTTP_SERVICE_CONFIG_URLACL_KEY KeyDesc; + public HTTP_SERVICE_CONFIG_URLACL_PARAM ParamDesc; + } + + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] + public struct HTTP_SERVICE_CONFIG_URLACL_KEY + { + [MarshalAs(UnmanagedType.LPWStr)] + public string pUrlPrefix; + + public HTTP_SERVICE_CONFIG_URLACL_KEY(string urlPrefix) + { + pUrlPrefix = urlPrefix; + } + } + + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] + struct HTTP_SERVICE_CONFIG_URLACL_PARAM + { + [MarshalAs(UnmanagedType.LPWStr)] + public string pStringSecurityDescriptor; + + public HTTP_SERVICE_CONFIG_URLACL_PARAM(string securityDescriptor) + { + pStringSecurityDescriptor = securityDescriptor; + } + } + + #endregion + + #region Constants + + public const uint HTTP_INITIALIZE_CONFIG = 0x00000002; + public const uint HTTP_SERVICE_CONFIG_SSL_FLAG_NEGOTIATE_CLIENT_CERT = 0x00000002; + public const uint HTTP_SERVICE_CONFIG_SSL_FLAG_NO_RAW_FILTER = 0x00000004; + private const uint NOERROR = 0; + private const uint ERROR_INSUFFICIENT_BUFFER = 122; + private const uint ERROR_ALREADY_EXISTS = 183; + private const uint ERROR_FILE_NOT_FOUND = 2; + private const int ERROR_NO_MORE_ITEMS = 259; + + #endregion + + #region Public methods + + public class SslCertificateInfo + { + public byte[] Hash { get; set; } + public Guid AppId { get; set; } + public string StoreName { get; set; } + public IPEndPoint IpPort { get; set; } + } + + public static SslCertificateInfo QuerySslCertificateInfo(IPEndPoint ipPort) + { + SslCertificateInfo result = null; + + uint retVal; + CallHttpApi(delegate + { + GCHandle sockAddrHandle = CreateSockaddrStructure(ipPort); + IntPtr pIpPort = sockAddrHandle.AddrOfPinnedObject(); + HTTP_SERVICE_CONFIG_SSL_KEY sslKey = new HTTP_SERVICE_CONFIG_SSL_KEY(pIpPort); + + HTTP_SERVICE_CONFIG_SSL_QUERY inputConfigInfoQuery = + new HTTP_SERVICE_CONFIG_SSL_QUERY + { + QueryDesc = HTTP_SERVICE_CONFIG_QUERY_TYPE.HttpServiceConfigQueryExact, + KeyDesc = sslKey + }; + + IntPtr pInputConfigInfo = + Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(HTTP_SERVICE_CONFIG_SSL_QUERY))); + Marshal.StructureToPtr(inputConfigInfoQuery, pInputConfigInfo, false); + + IntPtr pOutputConfigInfo = IntPtr.Zero; + int returnLength = 0; + + try + { + HTTP_SERVICE_CONFIG_ID queryType = HTTP_SERVICE_CONFIG_ID.HttpServiceConfigSSLCertInfo; + int inputConfigInfoSize = Marshal.SizeOf(inputConfigInfoQuery); + retVal = HttpQueryServiceConfiguration(IntPtr.Zero, + queryType, + pInputConfigInfo, + inputConfigInfoSize, + pOutputConfigInfo, + returnLength, + out returnLength, + IntPtr.Zero); + if (retVal == ERROR_FILE_NOT_FOUND) + return; + + if (ERROR_INSUFFICIENT_BUFFER == retVal) // ERROR_INSUFFICIENT_BUFFER = 122 + { + pOutputConfigInfo = Marshal.AllocCoTaskMem(returnLength); + + try + { + retVal = HttpQueryServiceConfiguration(IntPtr.Zero, + queryType, + pInputConfigInfo, + inputConfigInfoSize, + pOutputConfigInfo, + returnLength, + out returnLength, + IntPtr.Zero); + ThrowWin32ExceptionIfError(retVal); + + var outputConfigInfo = + (HTTP_SERVICE_CONFIG_SSL_SET) + Marshal.PtrToStructure(pOutputConfigInfo, typeof(HTTP_SERVICE_CONFIG_SSL_SET)); + + byte[] hash = new byte[outputConfigInfo.ParamDesc.SslHashLength]; + Marshal.Copy(outputConfigInfo.ParamDesc.pSslHash, hash, 0, hash.Length); + + Guid appId = outputConfigInfo.ParamDesc.AppId; + string storeName = outputConfigInfo.ParamDesc.pSslCertStoreName; + + result = new SslCertificateInfo { AppId = appId, Hash = hash, StoreName = storeName, IpPort = ipPort }; + } + finally + { + Marshal.FreeCoTaskMem(pOutputConfigInfo); + } + } + else + { + ThrowWin32ExceptionIfError(retVal); + } + + } + finally + { + Marshal.FreeCoTaskMem(pInputConfigInfo); + if (sockAddrHandle.IsAllocated) + sockAddrHandle.Free(); + } + + }); + + return result; + } + + public static void BindCertificate(IPEndPoint ipPort, byte[] hash, StoreName storeName, Guid appId) + { + if (ipPort == null) throw new ArgumentNullException("ipPort"); + if (hash == null) throw new ArgumentNullException("hash"); + + CallHttpApi( + delegate + { + HTTP_SERVICE_CONFIG_SSL_SET configSslSet = new HTTP_SERVICE_CONFIG_SSL_SET(); + + GCHandle sockAddrHandle = CreateSockaddrStructure(ipPort); + IntPtr pIpPort = sockAddrHandle.AddrOfPinnedObject(); + HTTP_SERVICE_CONFIG_SSL_KEY httpServiceConfigSslKey = + new HTTP_SERVICE_CONFIG_SSL_KEY(pIpPort); + HTTP_SERVICE_CONFIG_SSL_PARAM configSslParam = new HTTP_SERVICE_CONFIG_SSL_PARAM(); + + + GCHandle handleHash = GCHandle.Alloc(hash, GCHandleType.Pinned); + configSslParam.AppId = appId; + configSslParam.DefaultCertCheckMode = 0; + configSslParam.DefaultFlags = 0; //HTTP_SERVICE_CONFIG_SSL_FLAG_NEGOTIATE_CLIENT_CERT; + configSslParam.DefaultRevocationFreshnessTime = 0; + configSslParam.DefaultRevocationUrlRetrievalTimeout = 0; + configSslParam.pSslCertStoreName = storeName.ToString(); + configSslParam.pSslHash = handleHash.AddrOfPinnedObject(); + configSslParam.SslHashLength = hash.Length; + configSslSet.ParamDesc = configSslParam; + configSslSet.KeyDesc = httpServiceConfigSslKey; + + IntPtr pInputConfigInfo = + Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(HTTP_SERVICE_CONFIG_SSL_SET))); + Marshal.StructureToPtr(configSslSet, pInputConfigInfo, false); + + try + { + uint retVal = HttpSetServiceConfiguration(IntPtr.Zero, + HTTP_SERVICE_CONFIG_ID.HttpServiceConfigSSLCertInfo, + pInputConfigInfo, + Marshal.SizeOf(configSslSet), + IntPtr.Zero); + + if (ERROR_ALREADY_EXISTS != retVal) + { + ThrowWin32ExceptionIfError(retVal); + } + else + { + retVal = HttpDeleteServiceConfiguration(IntPtr.Zero, + HTTP_SERVICE_CONFIG_ID.HttpServiceConfigSSLCertInfo, + pInputConfigInfo, + Marshal.SizeOf(configSslSet), + IntPtr.Zero); + ThrowWin32ExceptionIfError(retVal); + + retVal = HttpSetServiceConfiguration(IntPtr.Zero, + HTTP_SERVICE_CONFIG_ID.HttpServiceConfigSSLCertInfo, + pInputConfigInfo, + Marshal.SizeOf(configSslSet), + IntPtr.Zero); + ThrowWin32ExceptionIfError(retVal); + } + } + finally + { + Marshal.FreeCoTaskMem(pInputConfigInfo); + if (handleHash.IsAllocated) + handleHash.Free(); + if (sockAddrHandle.IsAllocated) + sockAddrHandle.Free(); + } + }); + } + + public static void DeleteCertificateBinding(params IPEndPoint[] ipPorts) + { + if (ipPorts == null || ipPorts.Length == 0) + return; + + CallHttpApi( + delegate + { + foreach (var ipPort in ipPorts) + { + HTTP_SERVICE_CONFIG_SSL_SET configSslSet = + new HTTP_SERVICE_CONFIG_SSL_SET(); + + GCHandle sockAddrHandle = CreateSockaddrStructure(ipPort); + IntPtr pIpPort = sockAddrHandle.AddrOfPinnedObject(); + HTTP_SERVICE_CONFIG_SSL_KEY httpServiceConfigSslKey = + new HTTP_SERVICE_CONFIG_SSL_KEY(pIpPort); + configSslSet.KeyDesc = httpServiceConfigSslKey; + + IntPtr pInputConfigInfo = + Marshal.AllocCoTaskMem( + Marshal.SizeOf(typeof(HTTP_SERVICE_CONFIG_SSL_SET))); + Marshal.StructureToPtr(configSslSet, pInputConfigInfo, false); + + try + { + uint retVal = HttpDeleteServiceConfiguration(IntPtr.Zero, + HTTP_SERVICE_CONFIG_ID.HttpServiceConfigSSLCertInfo, + pInputConfigInfo, + Marshal.SizeOf(configSslSet), + IntPtr.Zero); + ThrowWin32ExceptionIfError(retVal); + } + finally + { + Marshal.FreeCoTaskMem(pInputConfigInfo); + if (sockAddrHandle.IsAllocated) + sockAddrHandle.Free(); + } + } + }); + } + + public static SslCertificateInfo[] QuerySslCertificateInfo() + { + var result = new List(); + + CallHttpApi( + delegate + { + uint token = 0; + + uint retVal; + do + { + HTTP_SERVICE_CONFIG_SSL_QUERY inputConfigInfoQuery = + new HTTP_SERVICE_CONFIG_SSL_QUERY + { + QueryDesc = HTTP_SERVICE_CONFIG_QUERY_TYPE.HttpServiceConfigQueryNext, + dwToken = token, + }; + + IntPtr pInputConfigInfo = + Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(HTTP_SERVICE_CONFIG_SSL_QUERY))); + Marshal.StructureToPtr(inputConfigInfoQuery, pInputConfigInfo, false); + + IntPtr pOutputConfigInfo = IntPtr.Zero; + int returnLength = 0; + + const HTTP_SERVICE_CONFIG_ID queryType = HTTP_SERVICE_CONFIG_ID.HttpServiceConfigSSLCertInfo; + + try + { + int inputConfigInfoSize = Marshal.SizeOf(inputConfigInfoQuery); + retVal = HttpQueryServiceConfiguration(IntPtr.Zero, + queryType, + pInputConfigInfo, + inputConfigInfoSize, + pOutputConfigInfo, + returnLength, + out returnLength, + IntPtr.Zero); + if (ERROR_NO_MORE_ITEMS == retVal) + break; + if (ERROR_INSUFFICIENT_BUFFER == retVal) // ERROR_INSUFFICIENT_BUFFER = 122 + { + pOutputConfigInfo = Marshal.AllocCoTaskMem(returnLength); + + try + { + retVal = HttpQueryServiceConfiguration(IntPtr.Zero, + queryType, + pInputConfigInfo, + inputConfigInfoSize, + pOutputConfigInfo, + returnLength, + out returnLength, + IntPtr.Zero); + ThrowWin32ExceptionIfError(retVal); + + var outputConfigInfo = (HTTP_SERVICE_CONFIG_SSL_SET)Marshal.PtrToStructure( + pOutputConfigInfo, typeof(HTTP_SERVICE_CONFIG_SSL_SET)); + + byte[] hash = new byte[outputConfigInfo.ParamDesc.SslHashLength]; + Marshal.Copy(outputConfigInfo.ParamDesc.pSslHash, hash, 0, hash.Length); + + Guid appId = outputConfigInfo.ParamDesc.AppId; + string storeName = outputConfigInfo.ParamDesc.pSslCertStoreName; + IPEndPoint ipPort = ReadSockaddrStructure(outputConfigInfo.KeyDesc.pIpPort); + + var resultItem = new SslCertificateInfo + { + AppId = appId, + Hash = hash, + StoreName = storeName, + IpPort = ipPort + }; + result.Add(resultItem); + token++; + } + finally + { + Marshal.FreeCoTaskMem(pOutputConfigInfo); + } + } + else + { + ThrowWin32ExceptionIfError(retVal); + } + } + finally + { + Marshal.FreeCoTaskMem(pInputConfigInfo); + } + + } while (NOERROR == retVal); + + }); + + return result.ToArray(); + } + + public static void ReserveURL(string networkURL, string securityDescriptor) + { + if (String.IsNullOrEmpty(networkURL)) throw new ArgumentNullException("networkURL"); + if (String.IsNullOrEmpty(securityDescriptor)) throw new ArgumentNullException("securityDescriptor"); + + CallHttpApi( + delegate + { + uint retVal = (uint)NOERROR; // NOERROR = 0 + + HTTP_SERVICE_CONFIG_URLACL_KEY keyDesc = new HTTP_SERVICE_CONFIG_URLACL_KEY(networkURL); + HTTP_SERVICE_CONFIG_URLACL_PARAM paramDesc = new HTTP_SERVICE_CONFIG_URLACL_PARAM(securityDescriptor); + + HTTP_SERVICE_CONFIG_URLACL_SET inputConfigInfoSet = new HTTP_SERVICE_CONFIG_URLACL_SET(); + inputConfigInfoSet.KeyDesc = keyDesc; + inputConfigInfoSet.ParamDesc = paramDesc; + + IntPtr pInputConfigInfo = Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(HTTP_SERVICE_CONFIG_URLACL_SET))); + Marshal.StructureToPtr(inputConfigInfoSet, pInputConfigInfo, false); + try + { + retVal = HttpApi.HttpSetServiceConfiguration(IntPtr.Zero, + HTTP_SERVICE_CONFIG_ID.HttpServiceConfigUrlAclInfo, + pInputConfigInfo, + Marshal.SizeOf(inputConfigInfoSet), + IntPtr.Zero); + + if ((uint)ERROR_ALREADY_EXISTS == retVal) // ERROR_ALREADY_EXISTS = 183 + { + retVal = HttpApi.HttpDeleteServiceConfiguration(IntPtr.Zero, + HTTP_SERVICE_CONFIG_ID.HttpServiceConfigUrlAclInfo, + pInputConfigInfo, + Marshal.SizeOf(inputConfigInfoSet), + IntPtr.Zero); + + if ((uint)NOERROR == retVal) + { + retVal = HttpApi.HttpSetServiceConfiguration(IntPtr.Zero, + HTTP_SERVICE_CONFIG_ID.HttpServiceConfigUrlAclInfo, + pInputConfigInfo, + Marshal.SizeOf(inputConfigInfoSet), + IntPtr.Zero); + } + else if ((uint)ERROR_FILE_NOT_FOUND == retVal) // ERROR_FILE_NOT_FOUND = 2 + { + string networkURLOld = networkURL.Contains("https") ? networkURL.Replace("https", "http") : + networkURL.Replace("http", "https"); + HTTP_SERVICE_CONFIG_URLACL_KEY keyDescOld = new HTTP_SERVICE_CONFIG_URLACL_KEY(networkURLOld); + HTTP_SERVICE_CONFIG_URLACL_PARAM paramDescOld = new HTTP_SERVICE_CONFIG_URLACL_PARAM(securityDescriptor); + + HTTP_SERVICE_CONFIG_URLACL_SET inputConfigInfoSetOld = new HTTP_SERVICE_CONFIG_URLACL_SET(); + inputConfigInfoSetOld.KeyDesc = keyDescOld; + inputConfigInfoSetOld.ParamDesc = paramDescOld; + + IntPtr pInputConfigInfoOld = Marshal.AllocCoTaskMem(Marshal.SizeOf(typeof(HTTP_SERVICE_CONFIG_URLACL_SET))); + Marshal.StructureToPtr(inputConfigInfoSetOld, pInputConfigInfoOld, false); + + retVal = HttpApi.HttpDeleteServiceConfiguration(IntPtr.Zero, + HTTP_SERVICE_CONFIG_ID.HttpServiceConfigUrlAclInfo, + pInputConfigInfoOld, + Marshal.SizeOf(inputConfigInfoSetOld), + IntPtr.Zero); + + if ((uint)NOERROR == retVal) + { + retVal = HttpApi.HttpSetServiceConfiguration(IntPtr.Zero, + HTTP_SERVICE_CONFIG_ID.HttpServiceConfigUrlAclInfo, + pInputConfigInfo, + Marshal.SizeOf(inputConfigInfoSet), + IntPtr.Zero); + } + } + } + } + finally + { + Marshal.FreeCoTaskMem(pInputConfigInfo); + HttpApi.HttpTerminate(HttpApi.HTTP_INITIALIZE_CONFIG, IntPtr.Zero); + } + if ((uint)NOERROR != retVal) + { + ThrowWin32ExceptionIfError(retVal); + } + }); + } + + #endregion + + private static void ThrowWin32ExceptionIfError(uint retVal) + { + if (NOERROR != retVal) + { + throw new Win32Exception(Convert.ToInt32(retVal)); + } + } + + private static void CallHttpApi(Action body) + { + uint retVal = HttpInitialize(HttpApiVersion, HTTP_INITIALIZE_CONFIG, IntPtr.Zero); + ThrowWin32ExceptionIfError(retVal); + + try + { + body(); + } + finally + { + HttpTerminate(HTTP_INITIALIZE_CONFIG, IntPtr.Zero); + } + } + + /// + /// Creates an unmanaged sockaddr structure to pass to a WinAPI function. + /// + /// IP address and port number + /// a handle for the structure. Use the AddrOfPinnedObject Method to get a stable pointer to the object. + /// When the handle goes out of scope you must explicitly release it by calling the Free method; otherwise, memory leaks may occur. + private static GCHandle CreateSockaddrStructure(IPEndPoint ipEndPoint) + { + SocketAddress socketAddress = ipEndPoint.Serialize(); + + // use an array of bytes instead of the sockaddr structure + byte[] sockAddrStructureBytes = new byte[socketAddress.Size]; + GCHandle sockAddrHandle = GCHandle.Alloc(sockAddrStructureBytes, GCHandleType.Pinned); + for (int i = 0; i < socketAddress.Size; ++i) + { + sockAddrStructureBytes[i] = socketAddress[i]; + } + return sockAddrHandle; + } + + /// + /// Reads the unmanaged sockaddr structure returned by a WinAPI function + /// + /// pointer to the unmanaged sockaddr structure + /// IP address and port number + private static IPEndPoint ReadSockaddrStructure(IntPtr pSockaddrStructure) + { + short sAddressFamily = Marshal.ReadInt16(pSockaddrStructure); + AddressFamily addressFamily = (AddressFamily)sAddressFamily; + + int sockAddrSructureSize; + IPEndPoint ipEndPointAny; + switch (addressFamily) + { + case AddressFamily.InterNetwork: + // IP v4 address + sockAddrSructureSize = 16; + ipEndPointAny = new IPEndPoint(IPAddress.Any, 0); + break; + case AddressFamily.InterNetworkV6: + // IP v6 address + sockAddrSructureSize = 28; + ipEndPointAny = new IPEndPoint(IPAddress.IPv6Any, 0); + break; + default: + throw new ArgumentOutOfRangeException("pSockaddrStructure", "Unknown address family"); + } + + + // get bytes of the sockadrr structure + byte[] sockAddrSructureBytes = new byte[sockAddrSructureSize]; + Marshal.Copy(pSockaddrStructure, sockAddrSructureBytes, 0, sockAddrSructureSize); + + // create SocketAddress from bytes + var socketAddress = new SocketAddress(AddressFamily.Unspecified, sockAddrSructureSize); + for (int i = 0; i < sockAddrSructureSize; i++) + { + socketAddress[i] = sockAddrSructureBytes[i]; + } + + // create IPEndPoint from SocketAddress + IPEndPoint result = (IPEndPoint)ipEndPointAny.Create(socketAddress); + + return result; + } + } +} diff --git a/WebserverInitalConfig/Program.cs b/WebserverInitalConfig/Program.cs new file mode 100644 index 00000000..a069eb29 --- /dev/null +++ b/WebserverInitalConfig/Program.cs @@ -0,0 +1,37 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Net; +using System.Security.Principal; +using System.Text; +using System.Threading.Tasks; + +namespace WebserverInitalConfig +{ + class Program + { + static void Main(string[] args) + { + if (args.Length != 2) + { + Console.WriteLine("Usage: WebserverInitalConfig port isHttps"); + } + + if (args[1].ToLower() == "true") + { + string hostname = Dns.GetHostName(); + var cert = ConfigHttpApi.getSelfSignedCert("CN=" + hostname + " C=DE O=Vocaluxe OU=Vocaluxe Server"); + ConfigHttpApi.addCertToStore(cert); + ConfigHttpApi.bindCert("0.0.0.0", Int32.Parse(args[0]), cert); + ConfigHttpApi.reserveURL("https://+:" + args[0] + "/"); + } + else + { + ConfigHttpApi.reserveURL("http://+:" + args[0] + "/"); + } + } + + + } +} diff --git a/WebserverInitalConfig/Properties/AssemblyInfo.cs b/WebserverInitalConfig/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..18b96b78 --- /dev/null +++ b/WebserverInitalConfig/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// Allgemeine Informationen über eine Assembly werden über die folgenden +// Attribute gesteuert. Ändern Sie diese Attributwerte, um die Informationen zu ändern, +// die mit einer Assembly verknüpft sind. +[assembly: AssemblyTitle("WebserverInitalConfig")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("WebserverInitalConfig")] +[assembly: AssemblyCopyright("Copyright © 2013")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Durch Festlegen von ComVisible auf "false" werden die Typen in dieser Assembly unsichtbar +// für COM-Komponenten. Wenn Sie auf einen Typ in dieser Assembly von +// COM zugreifen müssen, legen Sie das ComVisible-Attribut für diesen Typ auf "true" fest. +[assembly: ComVisible(false)] + +// Die folgende GUID bestimmt die ID der Typbibliothek, wenn dieses Projekt für COM verfügbar gemacht wird +[assembly: Guid("b2df9255-3927-4125-ab3c-23c35794b04d")] + +// Versionsinformationen für eine Assembly bestehen aus den folgenden vier Werten: +// +// Hauptversion +// Nebenversion +// Buildnummer +// Revision +// +// Sie können alle Werte angeben oder die standardmäßigen Build- und Revisionsnummern +// übernehmen, indem Sie "*" eingeben: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/WebserverInitalConfig/WebserverInitalConfig.csproj b/WebserverInitalConfig/WebserverInitalConfig.csproj new file mode 100644 index 00000000..d0c002d0 --- /dev/null +++ b/WebserverInitalConfig/WebserverInitalConfig.csproj @@ -0,0 +1,72 @@ + + + + + Debug + AnyCPU + {55F89808-4E79-4FFE-BC13-48258913F5C9} + Exe + Properties + WebserverInitalConfig + WebserverInitalConfig + v4.5 + 512 + + + AnyCPU + true + full + false + ..\Output\ + DEBUG;TRACE + prompt + 4 + + + AnyCPU + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + app.manifest + + + + ..\..\..\..\..\Program Files (x86)\Microsoft Visual Studio 11.0\Libs\clrsecurity_june10\Security.dll + + + ..\..\..\..\..\Program Files (x86)\Microsoft Visual Studio 11.0\Libs\clrsecurity_june10\Security.Cryptography.dll + + + + + + + + + + + + + + + + + + + Designer + + + + + \ No newline at end of file diff --git a/WebserverInitalConfig/app.manifest b/WebserverInitalConfig/app.manifest new file mode 100644 index 00000000..856cecc2 --- /dev/null +++ b/WebserverInitalConfig/app.manifest @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +