using System; using System.Collections.Generic; using System.Drawing; using System.Linq; using System.Text; using System.IO; using System.Windows.Forms; using System.Security.Cryptography.X509Certificates; using System.Xml.Serialization; using Opc.Ua.Gds; namespace Opc.Ua.GdsClient { public partial class RegisterApplicationControl : UserControl { public RegisterApplicationControl() { InitializeComponent(); m_lastSavePath = m_lastDirPath = "%MyDocuments%\\OPC Foundation\\GDS"; Utils.GetAbsoluteDirectoryPath(m_lastDirPath, true, false, true); m_application = new Gds.RegisteredApplication(); RegistrationTypeComboBox.Items.Add("Client - Pull Management"); RegistrationTypeComboBox.Items.Add("Server - Pull Management"); RegistrationTypeComboBox.Items.Add("Server - Push Management"); RegistrationTypeComboBox.SelectedIndex = ServerPullManagement; m_promptOnRegistrationTypeChange = false; ApplyChangesButton.Enabled = false; RegisterApplicationButton.Enabled = false; UnregisterApplicationButton.Enabled = false; OpenConfigurationButton.Enabled = false; } private string m_lastDirPath; private string m_lastSavePath; private GlobalDiscoveryServer m_gds; private RegisteredApplication m_application; private bool m_promptOnRegistrationTypeChange; private string m_externalEditor; private const int ClientPullManagement = (int)RegistrationType.ClientPull; private const int ServerPullManagement = (int)RegistrationType.ServerPull; private const int ServerPushManagement = (int)RegistrationType.ServerPush; public event EventHandler SelectServer; public event EventHandler RegisteredApplicationChanged; /// /// Gets the registered application. /// /// /// The registered application. /// public RegisteredApplication RegisteredApplication { get { return m_application; } } public void Initialize(GlobalDiscoveryServer gds, EndpointDescription endpoint, GlobalDiscoveryClientConfiguration configuration) { m_gds = gds; m_application.ServerUrl = null; if (configuration != null) { m_externalEditor = configuration.ExternalEditor; } if (endpoint != null) { ClearFields(); m_application.ServerUrl = endpoint.EndpointUrl; var server = endpoint.Server; ApplicationUriTextBox.Text = server.ApplicationUri; ReadRegistration(true); ApplicationNameTextBox.Text = (server.ApplicationName != null) ? server.ApplicationName.Text : ""; ProductUriTextBox.Text = server.ProductUri; SetDiscoveryUrls(server.DiscoveryUrls); SetServerCapabilities(new string[] { ServerCapability.LiveData }); ControlToData(); RaiseRegisteredApplicationChangedEvent(m_application); } } private string SelectServerUrl(IList discoveryUrls) { if (discoveryUrls == null || discoveryUrls.Count == 0) { return null; } string url = null; // always use opc.tcp by default. foreach (string discoveryUrl in discoveryUrls) { if (discoveryUrl.StartsWith("opc.tcp://")) { url = discoveryUrl; break; } } // try HTTPS if no opc.tcp. if (url == null) { foreach (string discoveryUrl in discoveryUrls) { if (discoveryUrl.StartsWith("https://")) { url = discoveryUrl; break; } } } // use the first URL if nothing else. if (url == null) { url = discoveryUrls[0]; } return url; } private void ControlToData() { ApplicationRecordDataType record = (ApplicationRecordDataType)ApplicationIdTextBox.Tag; m_application.RegistrationType = (RegistrationType)RegistrationTypeComboBox.SelectedIndex; m_application.ServerUrl = SelectServerUrl(DiscoveryUrlsTextBox.Tag as IList); if (record != null) { m_application.ApplicationId = (record.ApplicationId != null) ? record.ApplicationId.ToString() : null; m_application.ApplicationUri = record.ApplicationUri; m_application.ApplicationName = (record.ApplicationNames != null && record.ApplicationNames.Count > 0 && record.ApplicationNames[0].Text != null) ? record.ApplicationNames[0].Text.ToString() : null; m_application.ProductUri = record.ProductUri; m_application.DiscoveryUrl = (record.DiscoveryUrls != null) ? record.DiscoveryUrls.ToArray() : null; m_application.ServerCapability = (record.ServerCapabilities != null) ? record.ServerCapabilities.ToArray() : null; } else { m_application.ApplicationId = null; m_application.ApplicationUri = ApplicationUriTextBox.Text.Trim(); m_application.ApplicationName = ApplicationNameTextBox.Text.Trim(); m_application.ProductUri = ProductUriTextBox.Text.Trim(); m_application.DiscoveryUrl = (DiscoveryUrlsTextBox.Tag != null) ? ((IList)DiscoveryUrlsTextBox.Tag).ToArray() : null; m_application.ServerCapability = (ServerCapabilitiesTextBox.Tag != null) ? ((IList)ServerCapabilitiesTextBox.Tag).ToArray() : null; } switch (m_application.RegistrationType) { case RegistrationType.ClientPull: case RegistrationType.ServerPull: { m_application.ConfigurationFile = ConfigurationFileTextBox.Text; m_application.CertificateStorePath = CertificateStorePathTextBox.Text.Trim(); m_application.CertificateSubjectName = CertificateSubjectNameTextBox.Text.Trim(); m_application.CertificatePublicKeyPath = CertificatePublicKeyPathTextBox.Text.Trim(); m_application.CertificatePrivateKeyPath = CertificatePrivateKeyPathTextBox.Text.Trim(); m_application.TrustListStorePath = TrustListStorePathTextBox.Text.Trim(); m_application.IssuerListStorePath = IssuerListStorePathTextBox.Text.Trim(); m_application.HttpsCertificatePublicKeyPath = HttpsCertificatePublicKeyPathTextBox.Text.Trim(); m_application.HttpsCertificatePrivateKeyPath = HttpsCertificatePrivateKeyPathTextBox.Text.Trim(); m_application.HttpsTrustListStorePath = HttpsTrustListStorePathTextBox.Text.Trim(); m_application.HttpsIssuerListStorePath = HttpsIssuerListStorePathTextBox.Text.Trim(); break; } case RegistrationType.ServerPush: { m_application.ConfigurationFile = null; m_application.CertificateStorePath = null; m_application.CertificateSubjectName = null; m_application.CertificatePublicKeyPath = null; m_application.CertificatePrivateKeyPath = null; m_application.TrustListStorePath = null; m_application.IssuerListStorePath = null; m_application.HttpsTrustListStorePath = null; m_application.HttpsIssuerListStorePath = null; break; } } } private void DataToControl() { ApplicationIdTextBox.Text = null; ApplicationUriTextBox.Text = (m_application != null) ? m_application.ApplicationUri : null; try { m_promptOnRegistrationTypeChange = false; RegistrationTypeComboBox.SelectedIndex = (int)m_application.RegistrationType; } finally { // m_promptOnRegistrationTypeChange = true; } ApplicationNameTextBox.Text = m_application.ApplicationName; ProductUriTextBox.Text = m_application.ProductUri; SetDiscoveryUrls(m_application.DiscoveryUrl); SetServerCapabilities(m_application.ServerCapability); switch (m_application.RegistrationType) { case RegistrationType.ClientPull: case RegistrationType.ServerPull: { ConfigurationFileTextBox.Text = AddSpecialFolders(m_application.ConfigurationFile); CertificateStorePathTextBox.Text = AddSpecialFolders(m_application.CertificateStorePath); CertificateSubjectNameTextBox.Text = m_application.CertificateSubjectName; CertificatePublicKeyPathTextBox.Text = AddSpecialFolders(m_application.CertificatePublicKeyPath); CertificatePrivateKeyPathTextBox.Text = AddSpecialFolders(m_application.CertificatePrivateKeyPath); TrustListStorePathTextBox.Text = AddSpecialFolders(m_application.TrustListStorePath); IssuerListStorePathTextBox.Text = AddSpecialFolders(m_application.IssuerListStorePath); HttpsCertificatePublicKeyPathTextBox.Text = AddSpecialFolders(m_application.HttpsCertificatePublicKeyPath); HttpsCertificatePrivateKeyPathTextBox.Text = AddSpecialFolders(m_application.HttpsCertificatePrivateKeyPath); HttpsTrustListStorePathTextBox.Text = AddSpecialFolders(m_application.HttpsTrustListStorePath); HttpsIssuerListStorePathTextBox.Text = AddSpecialFolders(m_application.HttpsIssuerListStorePath); break; } case RegistrationType.ServerPush: { ConfigurationFileTextBox.Text = null; CertificateStorePathTextBox.Text = null; CertificateSubjectNameTextBox.Text = null; CertificatePublicKeyPathTextBox.Text = null; CertificatePrivateKeyPathTextBox.Text = null; TrustListStorePathTextBox.Text = null; IssuerListStorePathTextBox.Text = null; HttpsCertificatePublicKeyPathTextBox.Text = null; HttpsCertificatePrivateKeyPathTextBox.Text = null; HttpsTrustListStorePathTextBox.Text = null; HttpsIssuerListStorePathTextBox.Text = null; break; } } } private string AddSpecialFolders(string filePath) { if (filePath == null) { return filePath; } string prefix = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles); if (filePath.StartsWith(prefix, StringComparison.OrdinalIgnoreCase)) { return "%" + Environment.SpecialFolder.ProgramFiles.ToString() + "%" + filePath.Substring(prefix.Length); } prefix = Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData); if (filePath.StartsWith(prefix, StringComparison.OrdinalIgnoreCase)) { return "%" + Environment.SpecialFolder.CommonApplicationData.ToString() + "%" + filePath.Substring(prefix.Length); } prefix = Environment.GetFolderPath(Environment.SpecialFolder.CommonProgramFiles); if (filePath.StartsWith(prefix, StringComparison.OrdinalIgnoreCase)) { return "%" + Environment.SpecialFolder.CommonProgramFiles.ToString() + "%" + filePath.Substring(prefix.Length); } prefix = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData); if (filePath.StartsWith(prefix, StringComparison.OrdinalIgnoreCase)) { return "%" + Environment.SpecialFolder.LocalApplicationData.ToString() + "%" + filePath.Substring(prefix.Length); } prefix = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); if (filePath.StartsWith(prefix, StringComparison.OrdinalIgnoreCase)) { return "%" + Environment.SpecialFolder.ApplicationData.ToString() + "%" + filePath.Substring(prefix.Length); } prefix = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); if (filePath.StartsWith(prefix, StringComparison.OrdinalIgnoreCase)) { return "%" + Environment.SpecialFolder.MyDocuments.ToString() + "%" + filePath.Substring(prefix.Length); } return filePath; } private string RemoveSpecialFolders(string filePath) { if (filePath == null) { return filePath; } return Utils.GetAbsoluteFilePath(filePath, true, false, false); } private void SetDiscoveryUrls(IList discoveryUrls) { StringBuilder buffer = new StringBuilder(); if (discoveryUrls != null) { foreach (var discoveryUrl in discoveryUrls) { if (buffer.Length > 0) { buffer.Append(", "); } buffer.Append(discoveryUrl); } } DiscoveryUrlsTextBox.Text = buffer.ToString(); DiscoveryUrlsTextBox.Tag = discoveryUrls; } private void SetServerCapabilities(IList capabilities) { StringBuilder buffer = new StringBuilder(); if (capabilities != null) { foreach (var capability in capabilities) { if (buffer.Length > 0) { buffer.Append(", "); } buffer.Append(capability); } } ServerCapabilitiesTextBox.Text = buffer.ToString(); ServerCapabilitiesTextBox.Tag = capabilities; } private string ReplaceLocalhost(string value) { if (value == null) { return null; } return value.Replace("localhost", System.Net.Dns.GetHostName()); } private string HostnameToLocalhost(string value) { if (value == null) { return null; } return value.Replace(System.Net.Dns.GetHostName(), "localhost"); } private void ClearFields() { ApplicationIdTextBox.Text = null; ApplicationIdTextBox.Tag = null; ApplicationNameTextBox.Text = null; ApplicationUriTextBox.Text = null; ProductUriTextBox.Text = null; DiscoveryUrlsTextBox.Text = null; DiscoveryUrlsTextBox.Tag = null; ServerCapabilitiesTextBox.Text = null; ServerCapabilitiesTextBox.Tag = null; CertificateStorePathTextBox.Text = null; CertificateSubjectNameTextBox.Text = null; CertificatePublicKeyPathTextBox.Text = null; CertificatePrivateKeyPathTextBox.Text = null; TrustListStorePathTextBox.Text = null; IssuerListStorePathTextBox.Text = null; HttpsCertificatePublicKeyPathTextBox.Text = null; HttpsCertificatePrivateKeyPathTextBox.Text = null; HttpsTrustListStorePathTextBox.Text = null; HttpsIssuerListStorePathTextBox.Text = null; UnregisterApplicationButton.Enabled = false; } private void RaiseRegisteredApplicationChangedEvent(RegisteredApplication application) { if (RegisteredApplicationChanged != null) { try { RegisteredApplicationChanged(this, new RegisteredApplicationChangedEventArgs(application)); } catch (Exception e) { Utils.Trace(e, "Unexpected error raising RegisteredApplicationChanged event."); } } } private void SetRegistrationTypeNoTrigger(RegistrationType registrationType) { try { m_promptOnRegistrationTypeChange = false; RegistrationTypeComboBox.SelectedIndex = (int)registrationType; } finally { // m_promptOnRegistrationTypeChange = true; } } private void InitializePullConfiguration(string configurationFilePath) { string path = Utils.GetAbsoluteFilePath(configurationFilePath, true, true, false); ClearFields(); try { var configuration = new Opc.Ua.Security.SecurityConfigurationManager().ReadConfiguration(path); if (configuration.ApplicationType == Security.ApplicationType.Client_1) { SetRegistrationTypeNoTrigger(RegistrationType.ClientPull); } else { SetRegistrationTypeNoTrigger(RegistrationType.ServerPull); } ApplicationUriTextBox.Text = ReplaceLocalhost(configuration.ApplicationUri); ReadRegistration(true); ApplicationNameTextBox.Text = configuration.ApplicationName; ProductUriTextBox.Text = configuration.ProductName; if (configuration.ApplicationType != Security.ApplicationType.Client_1) { SetDiscoveryUrls(configuration.BaseAddresses); SetServerCapabilities(new string[] { ServerCapability.LiveData }); } if (configuration.ApplicationCertificate != null) { CertificateStorePathTextBox.Text = configuration.ApplicationCertificate.StorePath; CertificateSubjectNameTextBox.Text = configuration.ApplicationCertificate.SubjectName; } if (configuration.TrustedCertificateStore != null) { TrustListStorePathTextBox.Text = configuration.TrustedCertificateStore.StorePath; } if (configuration.IssuerCertificateStore != null) { IssuerListStorePathTextBox.Text = configuration.IssuerCertificateStore.StorePath; } } catch (Exception) { // ignore. } } private void InitializePushConfiguration() { if (SelectServer != null) { try { SelectServer(this, new SelectServerEventArgs(m_application)); } catch (Exception e) { Utils.Trace(e, "Unexpected error raising SelectServer event."); } } } private void ConfigurationFileButton_Click(object sender, EventArgs e) { try { DirectoryInfo directory = new DirectoryInfo(m_lastDirPath); string configurationFile = RemoveSpecialFolders(ConfigurationFileTextBox.Text.Trim()); if (!String.IsNullOrEmpty(configurationFile)) { directory = new FileInfo(configurationFile).Directory; } OpenFileDialog dialog = new OpenFileDialog(); dialog.CheckFileExists = true; dialog.CheckPathExists = true; dialog.DefaultExt = ".xml"; dialog.Filter = "Configuration Files (*.xml)|*.xml|Certificate Files (*.der)|*.der|All Files (*.*)|*.*"; dialog.Multiselect = false; dialog.ValidateNames = true; dialog.Title = "Open Application Configuration File"; dialog.FileName = (configurationFile != null) ? new FileInfo(configurationFile).Name : ""; dialog.InitialDirectory = directory.FullName; if (dialog.ShowDialog(Parent) != DialogResult.OK) { return; } m_lastDirPath = new FileInfo(dialog.FileName).Directory.FullName; if (dialog.FileName.EndsWith(".der", StringComparison.OrdinalIgnoreCase)) { ConfigurationFileTextBox.Text = null; SetCertificatePublicKey(dialog.FileName); } else { ConfigurationFileTextBox.Text = AddSpecialFolders(dialog.FileName); InitializePullConfiguration(ConfigurationFileTextBox.Text); } ControlToData(); RaiseRegisteredApplicationChangedEvent(m_application); } catch (Exception exception) { MessageBox.Show(Parent.Text + ": " + exception.Message); } } private void ServerCapabilitiesButton_Click(object sender, EventArgs e) { try { var capabilities = new ServerCapabilitiesDialog().ShowDialog(Parent, ServerCapabilitiesTextBox.Tag as IList); if (capabilities != null) { SetServerCapabilities(capabilities); } } catch (Exception exception) { MessageBox.Show(Parent.Text + ": " + exception.Message); } } private void DiscoveryUrlsButton_Click(object sender, EventArgs e) { try { var discoveryUrls = new DiscoveryUrlsDialog().ShowDialog(Parent, DiscoveryUrlsTextBox.Tag as IList); if (discoveryUrls != null) { StringBuilder buffer = new StringBuilder(); foreach (var discoveryUrl in discoveryUrls) { if (buffer.Length > 0) { buffer.Append(", "); } buffer.Append(discoveryUrl); } DiscoveryUrlsTextBox.Text = buffer.ToString(); DiscoveryUrlsTextBox.Tag = discoveryUrls; } } catch (Exception exception) { MessageBox.Show(Parent.Text + ": " + exception.Message); } } private void CertificateStorePathButton_Click(object sender, EventArgs e) { try { DirectoryInfo directory = new DirectoryInfo(m_lastDirPath); string storePath = RemoveSpecialFolders(CertificateStorePathTextBox.Text.Trim()); if (!String.IsNullOrEmpty(storePath)) { directory = new DirectoryInfo(storePath); } Cannoli.Services.FolderBrowserService dialog = new Cannoli.Services.FolderBrowserService(); dialog.RootFolder = Environment.SpecialFolder.MyComputer; dialog.SelectedPath = directory.FullName; dialog.ShowNewFolderButton = true; dialog.Description = "Select Application Certificate Directory Store"; dialog.UseDescriptionForTitle = true; var result = dialog.ShowDialog(null, ParentForm); if (result == null || !result.Value) { return; } directory = new DirectoryInfo(dialog.SelectedPath); if (directory.Name == "certs") { directory = directory.Parent; } m_lastDirPath = directory.FullName; CertificateStorePathTextBox.Text = AddSpecialFolders(directory.FullName); } catch (Exception exception) { MessageBox.Show(Parent.Text + ": " + exception.Message); } } private void SetCertificatePublicKey(string path) { CertificatePublicKeyPathTextBox.Text = AddSpecialFolders(path); X509Certificate2 certificate = new X509Certificate2(RemoveSpecialFolders(CertificatePublicKeyPathTextBox.Text)); try { if (String.IsNullOrWhiteSpace(ApplicationNameTextBox.Text)) { foreach (string field in Utils.ParseDistinguishedName(certificate.Subject)) { if (field.StartsWith("CN=")) { ApplicationNameTextBox.Text = field.Substring(3); break; } } } if (String.IsNullOrWhiteSpace(ApplicationUriTextBox.Text)) { ApplicationUriTextBox.Text = Utils.GetApplicationUriFromCertificate(certificate); } if (String.IsNullOrWhiteSpace(DiscoveryUrlsTextBox.Text) && RegistrationTypeComboBox.SelectedIndex != ClientPullManagement) { var domains = Utils.GetDomainsFromCertficate(certificate); if (domains != null) { List urls = new List(); foreach (string domain in domains) { urls.Add("opc.tcp://" + domain + ":"); } SetDiscoveryUrls(urls); } if (String.IsNullOrWhiteSpace(DiscoveryUrlsTextBox.Text)) { SetDiscoveryUrls(new string[] { "opc.tcp://localhost:" }); } } } catch (Exception) { MessageBox.Show( Parent, "The certificate does not appear to be a valid DER file.", Parent.Text, MessageBoxButtons.OK, MessageBoxIcon.Error); } } private void CertificatePublicKeyPathButton_Click(object sender, EventArgs e) { try { DirectoryInfo directory = new DirectoryInfo(m_lastDirPath); string path = RemoveSpecialFolders(CertificatePublicKeyPathTextBox.Text.Trim()); if (!String.IsNullOrEmpty(path)) { if (Directory.Exists(path)) { directory = new DirectoryInfo(path); } else { directory = new FileInfo(path).Directory; } } OpenFileDialog dialog = new OpenFileDialog(); dialog.CheckFileExists = true; dialog.CheckPathExists = true; dialog.DefaultExt = ".der"; dialog.Filter = "DER Files (*.der)|*.der|CER Files (*.cer)|*.cer|All Files (*.*)|*.*"; dialog.Multiselect = false; dialog.ValidateNames = true; dialog.Title = "Select Certificate File"; dialog.FileName = (path != null) ? new FileInfo(path).Name : ""; dialog.InitialDirectory = directory.FullName; if (dialog.ShowDialog(Parent) != DialogResult.OK) { return; } m_lastDirPath = new FileInfo(dialog.FileName).Directory.FullName; CertificatePublicKeyPathTextBox.Text = AddSpecialFolders(dialog.FileName); X509Certificate2 certificate = new X509Certificate2(RemoveSpecialFolders(CertificatePublicKeyPathTextBox.Text)); try { if (String.IsNullOrWhiteSpace(ApplicationNameTextBox.Text)) { foreach (string field in Utils.ParseDistinguishedName(certificate.Subject)) { if (field.StartsWith("CN=")) { ApplicationNameTextBox.Text = field.Substring(3); break; } } } if (String.IsNullOrWhiteSpace(ApplicationUriTextBox.Text)) { ApplicationUriTextBox.Text = Utils.GetApplicationUriFromCertificate(certificate); } } catch (Exception) { MessageBox.Show( Parent, "The certificate does not appear to be a valid DER file.", Parent.Text, MessageBoxButtons.OK, MessageBoxIcon.Error); } } catch (Exception exception) { MessageBox.Show(Parent.Text + ": " + exception.Message); } } private void CertificatePrivateKeyPathButton_Click(object sender, EventArgs e) { try { DirectoryInfo directory = new DirectoryInfo(m_lastDirPath); string path = RemoveSpecialFolders(CertificatePrivateKeyPathTextBox.Text.Trim()); if (!String.IsNullOrEmpty(path)) { if (Directory.Exists(path)) { directory = new DirectoryInfo(path); } else { directory = new FileInfo(path).Directory; } } OpenFileDialog dialog = new OpenFileDialog(); dialog.CheckFileExists = true; dialog.CheckPathExists = true; dialog.DefaultExt = ".pfx"; dialog.Filter = "PFX Files (*.pfx)|*.pfx|PEM Files (*.pem)|*.pem|All Files (*.*)|*.*"; dialog.Multiselect = false; dialog.ValidateNames = true; dialog.Title = "Select Private Key File"; dialog.FileName = (path != null) ? new FileInfo(path).Name : ""; dialog.InitialDirectory = directory.FullName; if (dialog.ShowDialog(Parent) != DialogResult.OK) { return; } m_lastDirPath = new FileInfo(dialog.FileName).Directory.FullName; CertificatePrivateKeyPathTextBox.Text = AddSpecialFolders(dialog.FileName); } catch (Exception exception) { MessageBox.Show(Parent.Text + ": " + exception.Message); } } private void HttpsCertificatePublicKeyPathButton_Click(object sender, EventArgs e) { try { DirectoryInfo directory = new DirectoryInfo(m_lastDirPath); string path = RemoveSpecialFolders(HttpsCertificatePublicKeyPathTextBox.Text.Trim()); if (!String.IsNullOrEmpty(path)) { if (Directory.Exists(path)) { directory = new DirectoryInfo(path); } else { directory = new FileInfo(path).Directory; } } OpenFileDialog dialog = new OpenFileDialog(); dialog.CheckFileExists = true; dialog.CheckPathExists = true; dialog.DefaultExt = ".der"; dialog.Filter = "DER Files (*.der)|*.der|CER Files (*.cer)|*.cer|All Files (*.*)|*.*"; dialog.Multiselect = false; dialog.ValidateNames = true; dialog.Title = "Select Certificate File"; dialog.FileName = (path != null) ? new FileInfo(path).Name : ""; dialog.InitialDirectory = directory.FullName; if (dialog.ShowDialog(Parent) != DialogResult.OK) { return; } m_lastDirPath = new FileInfo(dialog.FileName).Directory.FullName; CertificatePublicKeyPathTextBox.Text = AddSpecialFolders(dialog.FileName); X509Certificate2 certificate = new X509Certificate2(RemoveSpecialFolders(HttpsCertificatePublicKeyPathTextBox.Text)); try { foreach (string field in Utils.ParseDistinguishedName(certificate.Subject)) { if (field.StartsWith("CN=")) { break; } } } catch (Exception) { MessageBox.Show( Parent, "The HTTPS certificate does not appear to be a valid DER file.", Parent.Text, MessageBoxButtons.OK, MessageBoxIcon.Error); } } catch (Exception exception) { MessageBox.Show(Parent.Text + ": " + exception.Message); } } private void HttpsCertificatePrivateKeyPathButton_Click(object sender, EventArgs e) { try { DirectoryInfo directory = new DirectoryInfo(m_lastDirPath); string path = RemoveSpecialFolders(HttpsCertificatePrivateKeyPathTextBox.Text.Trim()); if (!String.IsNullOrEmpty(path)) { if (Directory.Exists(path)) { directory = new DirectoryInfo(path); } else { directory = new FileInfo(path).Directory; } } OpenFileDialog dialog = new OpenFileDialog(); dialog.CheckFileExists = true; dialog.CheckPathExists = true; dialog.DefaultExt = ".pfx"; dialog.Filter = "PFX Files (*.pfx)|*.pfx|PEM Files (*.pem)|*.pem|All Files (*.*)|*.*"; dialog.Multiselect = false; dialog.ValidateNames = true; dialog.Title = "Select Private Key File"; dialog.FileName = (path != null) ? new FileInfo(path).Name : ""; dialog.InitialDirectory = directory.FullName; if (dialog.ShowDialog(Parent) != DialogResult.OK) { return; } m_lastDirPath = new FileInfo(dialog.FileName).Directory.FullName; HttpsCertificatePrivateKeyPathTextBox.Text = AddSpecialFolders(dialog.FileName); } catch (Exception exception) { MessageBox.Show(Parent.Text + ": " + exception.Message); } } private void TrustListStorePathButton_Click(object sender, EventArgs e) { try { DirectoryInfo directory = new DirectoryInfo(m_lastDirPath); string storePath = Utils.GetAbsoluteDirectoryPath(TrustListStorePathTextBox.Text.Trim(), true, false, false); if (!String.IsNullOrEmpty(storePath)) { while (storePath.EndsWith("\\")) { storePath = storePath.Substring(0, storePath.Length - 1); } directory = new DirectoryInfo(storePath); } Cannoli.Services.FolderBrowserService dialog = new Cannoli.Services.FolderBrowserService(); dialog.RootFolder = Environment.SpecialFolder.MyComputer; dialog.SelectedPath = directory.FullName; dialog.ShowNewFolderButton = true; dialog.Description = "Select Application Trust List"; dialog.UseDescriptionForTitle = true; var result = dialog.ShowDialog(null, ParentForm); if (result == null || !result.Value) { return; } directory = new DirectoryInfo(dialog.SelectedPath); if (directory.Name == "certs") { directory = directory.Parent; } m_lastDirPath = directory.FullName; TrustListStorePathTextBox.Text = AddSpecialFolders(directory.FullName); } catch (Exception exception) { MessageBox.Show(Parent.Text + ": " + exception.Message); } } private void IssuerListStorePathButton_Click(object sender, EventArgs e) { try { DirectoryInfo directory = new DirectoryInfo(m_lastDirPath); string storePath = Utils.GetAbsoluteDirectoryPath(IssuerListStorePathTextBox.Text.Trim(), true, false, false); if (!String.IsNullOrEmpty(storePath)) { directory = new DirectoryInfo(storePath); } Cannoli.Services.FolderBrowserService dialog = new Cannoli.Services.FolderBrowserService(); dialog.RootFolder = Environment.SpecialFolder.MyComputer; dialog.SelectedPath = directory.FullName; dialog.ShowNewFolderButton = true; dialog.Description = "Select Issuers List Directory Store"; dialog.UseDescriptionForTitle = true; var result = dialog.ShowDialog(null, ParentForm); if (result == null || !result.Value) { return; } directory = new DirectoryInfo(dialog.SelectedPath); if (directory.Name == "certs") { directory = directory.Parent; } m_lastDirPath = directory.FullName; IssuerListStorePathTextBox.Text = AddSpecialFolders(directory.FullName); } catch (Exception exception) { MessageBox.Show(Parent.Text + ": " + exception.Message); } } private void HttpsTrustListStorePathButton_Click(object sender, EventArgs e) { try { DirectoryInfo directory = new DirectoryInfo(m_lastDirPath); string storePath = Utils.GetAbsoluteDirectoryPath(HttpsTrustListStorePathTextBox.Text.Trim(), true, false, false); if (!String.IsNullOrEmpty(storePath)) { directory = new DirectoryInfo(storePath); } Cannoli.Services.FolderBrowserService dialog = new Cannoli.Services.FolderBrowserService(); dialog.RootFolder = Environment.SpecialFolder.MyComputer; dialog.SelectedPath = directory.FullName; dialog.ShowNewFolderButton = true; dialog.Description = "Select HTTPS Trust List Directory Store"; dialog.UseDescriptionForTitle = true; var result = dialog.ShowDialog(null, ParentForm); if (result == null || !result.Value) { return; } directory = new DirectoryInfo(dialog.SelectedPath); if (directory.Name == "certs") { directory = directory.Parent; } m_lastDirPath = directory.FullName; HttpsTrustListStorePathTextBox.Text = AddSpecialFolders(directory.FullName); } catch (Exception exception) { MessageBox.Show(Parent.Text + ": " + exception.Message); } } private void HttpsIssuerListStorePathButton_Click(object sender, EventArgs e) { try { DirectoryInfo directory = new DirectoryInfo(m_lastDirPath); string storePath = Utils.GetAbsoluteDirectoryPath(HttpsIssuerListStorePathTextBox.Text.Trim(), true, false, false); if (!String.IsNullOrEmpty(storePath)) { directory = new DirectoryInfo(storePath); } Cannoli.Services.FolderBrowserService dialog = new Cannoli.Services.FolderBrowserService(); dialog.RootFolder = Environment.SpecialFolder.MyComputer; dialog.SelectedPath = directory.FullName; dialog.ShowNewFolderButton = true; dialog.Description = "Select HTTPS Issuers List Directory Store"; dialog.UseDescriptionForTitle = true; var result = dialog.ShowDialog(null, ParentForm); if (result == null || !result.Value) { return; } directory = new DirectoryInfo(dialog.SelectedPath); if (directory.Name == "certs") { directory = directory.Parent; } m_lastDirPath = directory.FullName; HttpsIssuerListStorePathTextBox.Text = AddSpecialFolders(directory.FullName); } catch (Exception exception) { MessageBox.Show(Parent.Text + ": " + exception.Message); } } private void RegisterApplicationButton_Click(object sender, EventArgs e) { try { string applicationName = ApplicationNameTextBox.Text.Trim(); if (String.IsNullOrEmpty(applicationName)) { throw new ArgumentException("The Application Name must specified.", "ApplicationName"); } applicationName = ReplaceLocalhost(applicationName); string applicationUri = ApplicationUriTextBox.Text.Trim(); if (String.IsNullOrEmpty(applicationUri)) { throw new ArgumentException("The Application URI must specified.", "ApplicationUri"); } if (!Uri.IsWellFormedUriString(applicationUri, UriKind.Absolute)) { throw new ArgumentException(applicationUri + "is not a valid URI.", "ApplicationUri"); } applicationUri = ReplaceLocalhost(applicationUri); string productUri = ProductUriTextBox.Text.Trim(); if (String.IsNullOrEmpty(productUri)) { throw new ArgumentException("The Product URI must specified.", "ProductUri"); } if (!Uri.IsWellFormedUriString(productUri, UriKind.Absolute)) { throw new ArgumentException(productUri + "is not a valid URI.", "ProductUri"); } productUri = ReplaceLocalhost(productUri); if (RegistrationTypeComboBox.SelectedIndex == ClientPullManagement) { DiscoveryUrlsTextBox.Tag = null; DiscoveryUrlsTextBox.Text = null; ServerCapabilitiesTextBox.Tag = null; ServerCapabilitiesTextBox.Text = null; } IList discoveryUrls = DiscoveryUrlsTextBox.Tag as IList; if (RegistrationTypeComboBox.SelectedIndex != ClientPullManagement) { if (discoveryUrls == null || discoveryUrls.Count == 0) { throw new ArgumentException("At least one Discovery URL must specified.", "DiscoveryUrls"); } } IList capabilities = ServerCapabilitiesTextBox.Tag as IList; if (RegistrationTypeComboBox.SelectedIndex != ClientPullManagement) { if (capabilities == null || capabilities.Count == 0) { throw new ArgumentException("At least one Server Capability must specified.", "ServerCapabilities"); } } ApplicationRecordDataType recordToReplace = ApplicationIdTextBox.Tag as ApplicationRecordDataType; var records = m_gds.FindApplication(applicationUri); if (records != null) { if (records.Length > 1) { recordToReplace = new ViewApplicationRecordsDialog(m_gds).ShowDialog(Parent, records, (recordToReplace != null) ? recordToReplace.ApplicationId : null); } else if (records.Length > 0) { recordToReplace = records[0]; } } if (recordToReplace == null) { recordToReplace = new ApplicationRecordDataType(); } StringCollection urls = new StringCollection(); if (discoveryUrls != null) { foreach (var discoveryUrl in discoveryUrls) { urls.Add(ReplaceLocalhost(discoveryUrl)); } } recordToReplace.ApplicationUri = applicationUri; recordToReplace.ApplicationType = (RegistrationTypeComboBox.SelectedIndex != ClientPullManagement)?ApplicationType.Server:ApplicationType.Client; recordToReplace.ApplicationNames = new LocalizedText[] { applicationName }; recordToReplace.ProductUri = productUri; recordToReplace.DiscoveryUrls = urls; recordToReplace.ServerCapabilities = (capabilities != null)?new StringCollection(capabilities):new StringCollection(); var applicationId = m_gds.RegisterApplication(recordToReplace); recordToReplace.ApplicationId = applicationId; ApplicationIdTextBox.Text = Utils.Format("{0}", applicationId); ApplicationIdTextBox.Tag = recordToReplace; ApplicationNameTextBox.Text = applicationName; ApplicationUriTextBox.Text = applicationUri; ProductUriTextBox.Text = productUri; SetDiscoveryUrls(urls); CertificatePublicKeyPathTextBox.Text = AddSpecialFolders(CertificatePublicKeyPathTextBox.Text); CertificatePrivateKeyPathTextBox.Text = AddSpecialFolders(CertificatePrivateKeyPathTextBox.Text); CertificateStorePathTextBox.Text = AddSpecialFolders(CertificateStorePathTextBox.Text); TrustListStorePathTextBox.Text = AddSpecialFolders(TrustListStorePathTextBox.Text); IssuerListStorePathTextBox.Text = AddSpecialFolders(IssuerListStorePathTextBox.Text); HttpsCertificatePublicKeyPathTextBox.Text = AddSpecialFolders(HttpsCertificatePublicKeyPathTextBox.Text); HttpsCertificatePrivateKeyPathTextBox.Text = AddSpecialFolders(HttpsCertificatePrivateKeyPathTextBox.Text); HttpsTrustListStorePathTextBox.Text = AddSpecialFolders(HttpsTrustListStorePathTextBox.Text); HttpsIssuerListStorePathTextBox.Text = AddSpecialFolders(HttpsIssuerListStorePathTextBox.Text); UnregisterApplicationButton.Enabled = true; ControlToData(); if (RegisteredApplicationChanged != null) { RegisteredApplicationChanged(this, new RegisteredApplicationChangedEventArgs(m_application)); } MessageBox.Show( Parent, "The application was successfully registered.", Parent.Text, MessageBoxButtons.OK, MessageBoxIcon.Information); } catch (Exception exception) { MessageBox.Show(Parent.Text + ": " + exception.Message); } } private void ReadRegistration(bool silent) { string applicationUri = ApplicationUriTextBox.Text.Trim(); if (String.IsNullOrEmpty(applicationUri)) { if (!silent) { throw new ArgumentException("The Application URI must specified.", "ApplicationUri"); } return; } if (!Uri.IsWellFormedUriString(applicationUri, UriKind.Absolute)) { if (!silent) { throw new ArgumentException(applicationUri + "is not a valid URI.", "ApplicationUri"); } return; } applicationUri = ReplaceLocalhost(applicationUri); ApplicationRecordDataType existingRecord = null; try { var records = m_gds.FindApplication(applicationUri); if (records != null) { if (records.Length > 1) { existingRecord = new ViewApplicationRecordsDialog(m_gds).ShowDialog(Parent, records, null); } else if (records.Length > 0) { existingRecord = records[0]; } } } catch (Exception) { if (!silent) { throw; } return; } if (existingRecord == null) { if (!silent) { MessageBox.Show( this, "No matching record found in GDS.", Parent.Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation); } return; } ApplicationIdTextBox.Text = Utils.Format("{0}", existingRecord.ApplicationId); ApplicationIdTextBox.Tag = existingRecord; ApplicationUriTextBox.Text = existingRecord.ApplicationUri; ApplicationNameTextBox.Text = (existingRecord.ApplicationNames != null && existingRecord.ApplicationNames.Count > 0) ? Utils.Format("{0}", existingRecord.ApplicationNames[0]) : ""; ProductUriTextBox.Text = existingRecord.ProductUri; SetDiscoveryUrls(existingRecord.DiscoveryUrls); SetServerCapabilities(existingRecord.ServerCapabilities); UnregisterApplicationButton.Enabled = true; ControlToData(); } private void ApplyChangesButton_Click(object sender, EventArgs e) { try { ConfigurationFileTextBox.Text = AddSpecialFolders(ConfigurationFileTextBox.Text); CertificateStorePathTextBox.Text = AddSpecialFolders(CertificateStorePathTextBox.Text); CertificatePublicKeyPathTextBox.Text = AddSpecialFolders(CertificatePublicKeyPathTextBox.Text); CertificatePrivateKeyPathTextBox.Text = AddSpecialFolders(CertificatePrivateKeyPathTextBox.Text); TrustListStorePathTextBox.Text = AddSpecialFolders(TrustListStorePathTextBox.Text); IssuerListStorePathTextBox.Text = AddSpecialFolders(IssuerListStorePathTextBox.Text); HttpsCertificatePublicKeyPathTextBox.Text = AddSpecialFolders(HttpsCertificatePublicKeyPathTextBox.Text); HttpsCertificatePrivateKeyPathTextBox.Text = AddSpecialFolders(HttpsCertificatePrivateKeyPathTextBox.Text); HttpsTrustListStorePathTextBox.Text = AddSpecialFolders(HttpsTrustListStorePathTextBox.Text); HttpsIssuerListStorePathTextBox.Text = AddSpecialFolders(HttpsIssuerListStorePathTextBox.Text); ControlToData(); RaiseRegisteredApplicationChangedEvent(m_application); ApplyChangesButton.Enabled = false; } catch (Exception exception) { MessageBox.Show(Parent.Text + ": " + exception.Message); } } private void UnregisterApplicationButton_Click(object sender, EventArgs e) { try { ApplicationRecordDataType record = ApplicationIdTextBox.Tag as ApplicationRecordDataType; if (record != null) { m_gds.UnregisterApplication(record.ApplicationId); ApplicationIdTextBox.Text = null; ApplicationIdTextBox.Tag = null; MessageBox.Show( Parent, "The application has been unregistered.", Parent.Text, MessageBoxButtons.OK, MessageBoxIcon.Information); } } catch (Exception exception) { MessageBox.Show(Parent.Text + ": " + exception.Message); } } private void RegistrationTypeComboBox_SelectedIndexChanged(object sender, EventArgs e) { try { DiscoveryUrlsLabel.Visible = RegistrationTypeComboBox.SelectedIndex != ClientPullManagement; DiscoveryUrlsTextBox.Visible = RegistrationTypeComboBox.SelectedIndex != ClientPullManagement; DiscoveryUrlsButton.Visible = RegistrationTypeComboBox.SelectedIndex != ClientPullManagement; ServerCapabilitiesButton.Visible = RegistrationTypeComboBox.SelectedIndex != ClientPullManagement; ServerCapabilitiesLabel.Visible = RegistrationTypeComboBox.SelectedIndex != ClientPullManagement; ServerCapabilitiesTextBox.Visible = RegistrationTypeComboBox.SelectedIndex != ClientPullManagement; ConfigurationFileLabel.Visible = RegistrationTypeComboBox.SelectedIndex != ServerPushManagement; ConfigurationFileTextBox.Visible = RegistrationTypeComboBox.SelectedIndex != ServerPushManagement; ConfigurationFileButton.Visible = RegistrationTypeComboBox.SelectedIndex != ServerPushManagement; CertificateStorePathLabel.Visible = RegistrationTypeComboBox.SelectedIndex != ServerPushManagement; CertificateStorePathTextBox.Visible = RegistrationTypeComboBox.SelectedIndex != ServerPushManagement; CertificateStorePathButton.Visible = RegistrationTypeComboBox.SelectedIndex != ServerPushManagement; CertificateSubjectNameLabel.Visible = RegistrationTypeComboBox.SelectedIndex != ServerPushManagement; CertificateSubjectNameTextBox.Visible = RegistrationTypeComboBox.SelectedIndex != ServerPushManagement; CertificatePublicKeyPathLabel.Visible = RegistrationTypeComboBox.SelectedIndex != ServerPushManagement; CertificatePublicKeyPathTextBox.Visible = RegistrationTypeComboBox.SelectedIndex != ServerPushManagement; CertificatePublicKeyPathButton.Visible = RegistrationTypeComboBox.SelectedIndex != ServerPushManagement; CertificatePrivateKeyPathLabel.Visible = RegistrationTypeComboBox.SelectedIndex != ServerPushManagement; CertificatePrivateKeyPathTextBox.Visible = RegistrationTypeComboBox.SelectedIndex != ServerPushManagement; CertificatePrivateKeyPathButton.Visible = RegistrationTypeComboBox.SelectedIndex != ServerPushManagement; TrustListStorePathLabel.Visible = RegistrationTypeComboBox.SelectedIndex != ServerPushManagement; TrustListStorePathTextBox.Visible = RegistrationTypeComboBox.SelectedIndex != ServerPushManagement; TrustListStorePathButton.Visible = RegistrationTypeComboBox.SelectedIndex != ServerPushManagement; IssuerListStorePathLabel.Visible = RegistrationTypeComboBox.SelectedIndex != ServerPushManagement; IssuerListStorePathTextBox.Visible = RegistrationTypeComboBox.SelectedIndex != ServerPushManagement; IssuerListStorePathButton.Visible = RegistrationTypeComboBox.SelectedIndex != ServerPushManagement; HttpsCertificatePublicKeyPathLabel.Visible = RegistrationTypeComboBox.SelectedIndex != ClientPullManagement; HttpsCertificatePublicKeyPathTextBox.Visible = RegistrationTypeComboBox.SelectedIndex != ClientPullManagement; HttpsCertificatePublicKeyPathButton.Visible = RegistrationTypeComboBox.SelectedIndex != ClientPullManagement; HttpsCertificatePrivateKeyPathLabel.Visible = RegistrationTypeComboBox.SelectedIndex != ClientPullManagement; HttpsCertificatePrivateKeyPathTextBox.Visible = RegistrationTypeComboBox.SelectedIndex != ClientPullManagement; HttpsCertificatePrivateKeyPathButton.Visible = RegistrationTypeComboBox.SelectedIndex != ClientPullManagement; HttpsTrustListStorePathLabel.Visible = RegistrationTypeComboBox.SelectedIndex == ClientPullManagement; HttpsTrustListStorePathTextBox.Visible = RegistrationTypeComboBox.SelectedIndex == ClientPullManagement; HttpsTrustListStorePathButton.Visible = RegistrationTypeComboBox.SelectedIndex == ClientPullManagement; HttpsIssuerListStorePathLabel.Visible = RegistrationTypeComboBox.SelectedIndex == ClientPullManagement; HttpsIssuerListStorePathTextBox.Visible = RegistrationTypeComboBox.SelectedIndex == ClientPullManagement; HttpsIssuerListStorePathButton.Visible = RegistrationTypeComboBox.SelectedIndex == ClientPullManagement; OpenConfigurationButton.Visible = RegistrationTypeComboBox.SelectedIndex != ServerPushManagement; if (m_promptOnRegistrationTypeChange) { if (RegistrationTypeComboBox.SelectedIndex != ServerPushManagement) { ConfigurationFileButton_Click(this, null); } else { InitializePushConfiguration(); } } PickServerButton.Visible = RegistrationTypeComboBox.SelectedIndex == ServerPushManagement; } catch (Exception exception) { MessageBox.Show(Parent.Text + ": " + exception.Message); } } private void SaveButton_Click(object sender, EventArgs e) { try { ControlToData(); string path = Utils.GetAbsoluteDirectoryPath(m_lastSavePath, true, false, true); DirectoryInfo directory = new DirectoryInfo(path); string name = ApplicationUriTextBox.Text.Trim(); name = HostnameToLocalhost(name); if (name != null) { StringBuilder buffer = new StringBuilder(); foreach (char ch in name) { if (Char.IsLetterOrDigit(ch) || ".-_".Contains(ch)) { buffer.Append(ch); continue; } } name = buffer.ToString(); } SaveFileDialog dialog = new SaveFileDialog(); dialog.OverwritePrompt = true; dialog.CheckFileExists = false; dialog.CheckPathExists = true; dialog.DefaultExt = ".xml"; dialog.Filter = "Registration Files (*.xml)|*.xml|All Files (*.*)|*.*"; dialog.ValidateNames = true; dialog.Title = "Save Registration File"; dialog.FileName = name; dialog.InitialDirectory = directory.FullName; if (dialog.ShowDialog(Parent) != DialogResult.OK) { return; } m_lastSavePath = new FileInfo(dialog.FileName).Directory.FullName; // save localhost instead of hostname so saved files will be portable. m_application.ApplicationName = HostnameToLocalhost(m_application.ApplicationName); m_application.ApplicationUri = HostnameToLocalhost(m_application.ApplicationUri); m_application.ProductUri = HostnameToLocalhost(m_application.ProductUri); if (m_application.DiscoveryUrl != null) { StringCollection urls = new StringCollection(); foreach (var discoveryUrl in m_application.DiscoveryUrl) { urls.Add(HostnameToLocalhost(discoveryUrl)); } m_application.DiscoveryUrl = urls.ToArray(); } try { using (Stream ostrm = File.Open(dialog.FileName, FileMode.Create, FileAccess.ReadWrite, FileShare.None)) { XmlSerializer serializer = new XmlSerializer(typeof(RegisteredApplication)); serializer.Serialize(ostrm, m_application); } } finally { m_application.ApplicationName = ReplaceLocalhost(m_application.ApplicationName); m_application.ApplicationUri = ReplaceLocalhost(m_application.ApplicationUri); m_application.ProductUri = ReplaceLocalhost(m_application.ProductUri); if (m_application.DiscoveryUrl != null) { StringCollection urls = new StringCollection(); foreach (var discoveryUrl in m_application.DiscoveryUrl) { urls.Add(ReplaceLocalhost(discoveryUrl)); } m_application.DiscoveryUrl = urls.ToArray(); } } } catch (Exception exception) { MessageBox.Show(Parent.Text + ": " + exception.Message); } } private void LoadButton_Click(object sender, EventArgs e) { try { string path = Utils.GetAbsoluteDirectoryPath(m_lastDirPath, true, false, false); if (path == null) { path = Utils.GetAbsoluteDirectoryPath(m_lastDirPath, true, false, false); } if (path == null) { path = "."; } DirectoryInfo directory = new DirectoryInfo(path); OpenFileDialog dialog = new OpenFileDialog(); dialog.CheckFileExists = true; dialog.CheckPathExists = true; dialog.DefaultExt = ".xml"; dialog.Filter = "All Data Files (*.xml;*.config;*.der)|*.xml;*.config;*.der|All Files (*.*)|*.*"; dialog.Multiselect = false; dialog.ValidateNames = true; dialog.Title = "Load Registration File, Application Configuration File or Certificate"; dialog.FileName = null; dialog.InitialDirectory = directory.FullName; if (dialog.ShowDialog(Parent) != DialogResult.OK) { return; } m_lastDirPath = new FileInfo(dialog.FileName).Directory.FullName; try { using (Stream ostrm = File.Open(dialog.FileName, FileMode.Open, FileAccess.ReadWrite, FileShare.None)) { XmlSerializer serializer = new XmlSerializer(typeof(RegisteredApplication)); var application = serializer.Deserialize(ostrm); m_application = (RegisteredApplication)application; } DataToControl(); ReadRegistration(true); } catch (Exception) { if (dialog.FileName.EndsWith(".der", StringComparison.OrdinalIgnoreCase)) { ConfigurationFileTextBox.Text = null; SetCertificatePublicKey(dialog.FileName); } else { InitializePullConfiguration(dialog.FileName); ConfigurationFileTextBox.Text = AddSpecialFolders(dialog.FileName); } ControlToData(); RaiseRegisteredApplicationChangedEvent(m_application); } RaiseRegisteredApplicationChangedEvent(m_application); } catch (Exception exception) { MessageBox.Show(Parent.Text + ": " + exception.Message); } } private void OpenConfigurationButton_Click(object sender, EventArgs e) { try { var pathToFile = Utils.GetAbsoluteFilePath(ConfigurationFileTextBox.Text.Trim(), true, true, false); System.Diagnostics.Process.Start((m_externalEditor)??@"devenv.exe", "\"" + pathToFile + "\""); } catch (Exception exception) { MessageBox.Show(Parent.Text + ": " + exception.Message); } } private void Button_MouseEnter(object sender, EventArgs e) { ((Control)sender).BackColor = Color.CornflowerBlue; } private void Button_MouseLeave(object sender, EventArgs e) { ((Control)sender).BackColor = Color.MidnightBlue; } private void ConfigurationFileTextBox_TextChanged(object sender, EventArgs e) { OpenConfigurationButton.Enabled = !String.IsNullOrEmpty(ConfigurationFileTextBox.Text.Trim()); } private void CertificateLocation_TextChanged(object sender, EventArgs e) { if (sender == CertificateStorePathTextBox || sender == CertificateSubjectNameTextBox) { CertificatePublicKeyPathButton.Enabled = CertificatePrivateKeyPathButton.Enabled = CertificatePrivateKeyPathTextBox.Enabled = CertificatePublicKeyPathTextBox.Enabled = (String.IsNullOrEmpty(CertificateStorePathTextBox.Text) && String.IsNullOrEmpty(CertificateSubjectNameTextBox.Text)); } if (sender == CertificatePrivateKeyPathTextBox || sender == CertificatePublicKeyPathTextBox) { CertificateStorePathButton.Enabled = CertificateStorePathTextBox.Enabled = CertificateSubjectNameTextBox.Enabled = (String.IsNullOrEmpty(CertificatePrivateKeyPathTextBox.Text) && String.IsNullOrEmpty(CertificatePublicKeyPathTextBox.Text)); } GenericField_TextChanged(sender, e); } private void GenericField_TextChanged(object sender, EventArgs e) { ApplyChangesButton.Enabled = true; } private void ApplicationUriTextBox_TextChanged(object sender, EventArgs e) { RegisterApplicationButton.Enabled = !String.IsNullOrEmpty(ApplicationUriTextBox.Text.Trim()); ApplyChangesButton.Enabled = true; } private void ClearButton_Click(object sender, EventArgs e) { try { ClearFields(); } catch (Exception exception) { MessageBox.Show(Parent.Text + ": " + exception.Message); } } private void PickServerButton_Click(object sender, EventArgs e) { InitializePushConfiguration(); } } public class RegisteredApplicationChangedEventArgs : EventArgs { public RegisteredApplicationChangedEventArgs(RegisteredApplication application) { Application = application; } public RegisteredApplication Application { get; private set; } } public class SelectServerEventArgs : EventArgs { public SelectServerEventArgs(RegisteredApplication application) { Application = application; } public RegisteredApplication Application { get; private set; } } }