public LocalDiscoveryServerClient(ApplicationConfiguration configuration)
        {
            ApplicationConfiguration = configuration;
            MessageContext           = configuration.CreateMessageContext();

            // set some defaults for the preferred locales.
            System.Globalization.CultureInfo culture = System.Globalization.CultureInfo.CurrentUICulture;

            List <string> locales = new List <string>
            {
                culture.Name
            };

            culture = System.Globalization.CultureInfo.CurrentCulture;

            if (!locales.Contains(culture.Name))
            {
                locales.Add(culture.Name);
            }

            if (!locales.Contains("en-US"))
            {
                locales.Add("en-US");
            }

            PreferredLocales = locales.ToArray();
        }
 public OpcUaClientForm(ApplicationInstance application, ClientForm masterForm, ApplicationConfiguration configuration) :
     base(configuration.CreateMessageContext(), application, masterForm, configuration, ApplicationSettings.LogFileFolderPath)
 {
     InitializeComponent();
     base.BrowseCTRL.MethodCalled += new MethodCalledEventHandler(BrowseCTRL_MethodCalled);
     configuration.CertificateValidator.CertificateValidation += new CertificateValidationEventHandler(CertificateValidator_CertificateValidation);
 }
Example #3
0
        /// <summary>
        /// Creates a session with the endpoint.
        /// </summary>
        public Session Connect(ConfiguredEndpoint endpoint)
        {
            if (endpoint == null)
            {
                throw new ArgumentNullException("endpoint");
            }

            // check if the endpoint needs to be updated.
            if (endpoint.UpdateBeforeConnect)
            {
                endpoint = new ConfiguredServerDlg().ShowDialog(endpoint, m_configuration);

                if (endpoint == null)
                {
                    return(null);
                }
            }

            m_endpoint = endpoint;

            // copy the message context.
            m_messageContext = m_configuration.CreateMessageContext();

            // create the channel.
            ITransportChannel channel = SessionChannel.Create(
                m_configuration,
                endpoint.Description,
                endpoint.Configuration,
                m_configuration.SecurityConfiguration.ApplicationCertificate.Find(true),
                m_messageContext);

            // create the session.
            return(Connect(endpoint, channel));
        }
        protected virtual DiscoveryClient CreateClient(
            string endpointUrl,
            string endpointTransportProfileUri)
        {
            if (String.IsNullOrEmpty(endpointUrl))
            {
                endpointUrl = DefaultUrl;
            }

            if (!Uri.IsWellFormedUriString(endpointUrl, UriKind.Absolute))
            {
                throw new ArgumentException("Not a valid URL.", nameof(endpointUrl));
            }

            ServiceMessageContext context = ApplicationConfiguration.CreateMessageContext();

            EndpointConfiguration configuration = EndpointConfiguration.Create(ApplicationConfiguration);

            if (DefaultOperationTimeout != 0)
            {
                configuration.OperationTimeout = DefaultOperationTimeout;
            }

            ITransportChannel channel = DiscoveryChannel.Create(new Uri(endpointUrl), configuration, context);

            DiscoveryClient client = new DiscoveryClient(channel);

            return(client);
        }
Example #5
0
 /// <summary>
 /// This constructor loads the configuration.
 /// </summary>
 /// <remarks> It loads Client configuration, test configuration and 
 /// initializes contexts for vendor namespaces. </remarks>
 public TestClient(ApplicationConfiguration configuration)
 {
     m_configuration = configuration;
     LoadTestConfiguration(null);
     m_messageContext = Compare.MessageContext = m_configuration.CreateMessageContext();
     TestUtils.InitializeContexts(m_messageContext);
 }
Example #6
0
 /// <summary>
 /// This constructor loads the configuration.
 /// </summary>
 /// <remarks> It loads Client configuration, test configuration and
 /// initializes contexts for vendor namespaces. </remarks>
 public TestClient(ApplicationConfiguration configuration)
 {
     m_configuration = configuration;
     LoadTestConfiguration(null);
     m_messageContext = Compare.MessageContext = m_configuration.CreateMessageContext();
     TestUtils.InitializeContexts(m_messageContext);
 }
        /// <summary>
        /// Displays the dialog.
        /// </summary>
        public EndpointDescription ShowDialog(
            ApplicationConfiguration     configuration,
            ConfiguredEndpointCollection endpoints,
            X509Certificate2             clientCertificate)
        {
            m_configuration     = configuration;
            m_endpoints         = endpoints;
            m_messageContext    = configuration.CreateMessageContext();
            m_clientCertificate = clientCertificate;
            m_running           = false;
            m_filePath          = @".\perftest.csv";
                        
            EndpointSelectorCTRL.Initialize(m_endpoints, configuration);
            
            lock (m_lock)
            {
                OkBTN.Enabled = m_running = false;
            }

            // show dialog.
            if (ShowDialog() != DialogResult.OK)
            {
                return null;
            }

            return null;
        }
Example #8
0
        /// <summary>
        /// Displays the dialog.
        /// </summary>
        public EndpointDescription ShowDialog(
            ApplicationConfiguration configuration,
            ConfiguredEndpointCollection endpoints,
            X509Certificate2 clientCertificate)
        {
            m_configuration     = configuration;
            m_endpoints         = endpoints;
            m_messageContext    = configuration.CreateMessageContext();
            m_clientCertificate = clientCertificate;
            m_running           = false;
            m_filePath          = @".\perftest.csv";

            EndpointSelectorCTRL.Initialize(m_endpoints, configuration);

            lock (m_lock)
            {
                OkBTN.Enabled = m_running = false;
            }

            // show dialog.
            if (ShowDialog() != DialogResult.OK)
            {
                return(null);
            }

            return(null);
        }
Example #9
0
        /// <summary>
        /// Creates a new session.
        /// </summary>
        private Session CreateSession()
        {
            try
            {
                Cursor = Cursors.WaitCursor;

                ServiceMessageContext messageContext = m_configuration.CreateMessageContext();
                BindingFactory        bindingFactory = BindingFactory.Create(m_configuration, messageContext);

                ConfiguredEndpoint endpoint = this.EndpointsCTRL.SelectedEndpoint;

                endpoint.UpdateFromServer(bindingFactory);

                // Initialize the channel which will be created with the server.
                ITransportChannel channel = SessionChannel.Create(
                    m_configuration,
                    endpoint.Description,
                    endpoint.Configuration,
                    m_configuration.SecurityConfiguration.ApplicationCertificate.Find(true),
                    messageContext);

                // Wrap the channel with the session object.
                Session session = new Session(channel, m_configuration, endpoint, null);

                // Create the session. This actually connects to the server.
                session.Open(Guid.NewGuid().ToString(), null);

                return(session);
            }
            finally
            {
                Cursor = Cursors.Default;
            }
        }
        /// <summary>
        /// Fetches the servers from the discovery server.
        /// </summary>
        private bool DiscoverEndpoints(Uri discoveryUrl)
        {
            // use a short timeout.
            EndpointConfiguration configuration = EndpointConfiguration.Create(m_configuration);

            configuration.OperationTimeout = m_discoveryTimeout;

            DiscoveryClient client = DiscoveryClient.Create(
                discoveryUrl,
                BindingFactory.Create(m_configuration, m_configuration.CreateMessageContext()),
                EndpointConfiguration.Create(m_configuration));

            try
            {
                EndpointDescriptionCollection endpoints = client.GetEndpoints(null);
                OnUpdateEndpoints(endpoints);
                return(true);
            }
            catch (Exception e)
            {
                Utils.Trace("Could not fetch endpoints from url: {0}. Reason={1}", discoveryUrl, e.Message);
                return(false);
            }
            finally
            {
                client.Close();
            }
        }
Example #11
0
        /// <summary>
        /// Fetches the servers from the discovery server.
        /// </summary>
        private bool DiscoverServers(Uri discoveryUrl)
        {
            // use a short timeout.
            EndpointConfiguration configuration = EndpointConfiguration.Create(m_configuration);

            configuration.OperationTimeout = m_discoveryTimeout;

            DiscoveryClient client = null;

            try
            {
                client = DiscoveryClient.Create(
                    discoveryUrl,
                    BindingFactory.Create(m_configuration, m_configuration.CreateMessageContext()),
                    EndpointConfiguration.Create(m_configuration));

                ApplicationDescriptionCollection servers = client.FindServers(null);
                m_discoveryUrl = discoveryUrl.ToString();
                OnUpdateServers(servers);
                return(true);
            }
            catch (Exception e)
            {
                Utils.Trace("DISCOVERY ERROR - Could not fetch servers from url: {0}. Error=({2}){1}", discoveryUrl, e.Message, e.GetType());
                return(false);
            }
            finally
            {
                if (client != null)
                {
                    client.Close();
                }
            }
        }
        /// <summary>
        /// Fetches the network servers from the discovery server.
        /// </summary>
        private bool DiscoverServersOnNetwork(Uri discoveryUrl)
        {
            // use a short timeout.
            EndpointConfiguration configuration = EndpointConfiguration.Create(m_configuration);

            configuration.OperationTimeout = m_discoveryTimeout;
            DiscoveryClient client = null;

            try
            {
                client = DiscoveryClient.Create(
                    discoveryUrl,
                    BindingFactory.Create(m_configuration, m_configuration.CreateMessageContext()),
                    EndpointConfiguration.Create(m_configuration));

                uint             startingRecordId       = (uint)0;
                uint             maxRecordsToReturn     = (uint)0;
                StringCollection serverCapabilityFilter = new StringCollection();
                DateTime         lastCounterResetTime   = DateTime.MinValue;

                try
                {
                    startingRecordId   = (uint)m_startingRecordIdUpDown.Value;
                    maxRecordsToReturn = (uint)m_maxRecordsToReturnUpDown.Value;

                    if (!String.IsNullOrEmpty(m_capabilityFilterTextBox.Text))
                    {
                        serverCapabilityFilter = new StringCollection(m_capabilityFilterTextBox.Text.Split(','));
                    }
                }
                catch (Exception e)
                {
                    Utils.Trace("Error retrieving FindServersOnNetwork paramters. Error=({1}){0}", e.Message, e.GetType());
                    return(false);
                }

                ServerOnNetworkCollection servers = client.FindServersOnNetwork(startingRecordId, maxRecordsToReturn, serverCapabilityFilter, out lastCounterResetTime);
                m_discoveryUrl = discoveryUrl.ToString();
                OnUpdateServers(servers);
                return(true);
            }
            catch (Exception e)
            {
                Utils.Trace("DISCOVERY ERROR - Could not fetch servers from url: {0}. Error=({2}){1}", discoveryUrl, e.Message, e.GetType());
                return(false);
            }
            finally
            {
                if (client != null)
                {
                    client.Close();
                }
            }
        }
Example #13
0
        public SampleClientForm(
            ApplicationInstance application,
            ClientForm masterForm,
            ApplicationConfiguration configuration)
            :
            base(configuration.CreateMessageContext(), application, masterForm, configuration)
        {
            InitializeComponent();

            if (!configuration.SecurityConfiguration.AutoAcceptUntrustedCertificates)
            {
                configuration.CertificateValidator.CertificateValidation += new CertificateValidationEventHandler(CertificateValidator_CertificateValidation);
            }
        }
        public SampleClientForm(
            ApplicationInstance application, 
            ClientForm masterForm, 
            ApplicationConfiguration configuration)
        :
            base(configuration.CreateMessageContext(), application, masterForm, configuration)
        {
            InitializeComponent();

            if (!configuration.SecurityConfiguration.AutoAcceptUntrustedCertificates)
            {
                configuration.CertificateValidator.CertificateValidation += new CertificateValidationEventHandler(CertificateValidator_CertificateValidation);
            }
        }
Example #15
0
        public SamplePublisherForm(
            ApplicationInstance application,
            Opc.Ua.Sample.Controls.PublisherForm masterForm,
            ApplicationConfiguration configuration)
            : base(configuration.CreateMessageContext(), application, masterForm, configuration)
        {
            InitializeComponent();

            base.BrowseCTRL.MethodCalled += new Opc.Ua.Sample.Controls.MethodCalledEventHandler(BrowseCTRL_MethodCalled);

            if (!configuration.SecurityConfiguration.AutoAcceptUntrustedCertificates)
            {
                configuration.CertificateValidator.CertificateValidation += new CertificateValidationEventHandler(CertificateValidator_CertificateValidation);
            }
        }
Example #16
0
        public SampleClientForm(
            ApplicationInstance application,
            Opc.Ua.Sample.Controls.ClientForm masterForm,
            ApplicationConfiguration configuration)
            :
            base(configuration.CreateMessageContext(), application, masterForm, configuration)
        {
            InitializeComponent();

            base.BrowseCTRL.MethodCalled += new Opc.Ua.Sample.Controls.MethodCalledEventHandler(BrowseCTRL_MethodCalled);

            if (!configuration.SecurityConfiguration.AutoAcceptUntrustedCertificates)
            {
                configuration.CertificateValidator.CertificateValidation += new CertificateValidationEventHandler(CertificateValidator_CertificateValidation);
            }
        }
Example #17
0
        public override void Initialize()
        {
            base.Initialize();

            //SecurityConfiguration securityConfig = new SecurityConfiguration();
            //securityConfig.ConfigureFirewall = false;

            //ApplicationConfiguration appConfig = new ApplicationConfiguration();

            //appConfig.ApplicationName = $"OPCClient: {Name}";
            //appConfig.ApplicationType = ApplicationType.Client;
            //appConfig.ProductUri = "https://github.com/GridProtectionAlliance/gsf";
            //appConfig.SecurityConfiguration = securityConfig;

            //string url = "load from configuration";
            //EndpointDescription endpointDescription = new EndpointDescription(url);
            //endpointDescription.

            //EndpointConfiguration endpointConfig = new EndpointConfiguration();
            //endpointConfig.UseBinaryEncoding = true;

            //SessionChannel channel = SessionChannel.Create(appConfig, endpointConfig, appConfig.ApplicationName);

            //m_session = new Session()

            // Initialize the client configuration.
            ApplicationConfiguration configuration = new ApplicationConfiguration();

            // Need to specify the application instance certificate for the client.
            configuration.SecurityConfiguration.ApplicationCertificate             = new CertificateIdentifier();
            configuration.SecurityConfiguration.ApplicationCertificate.StoreType   = Utils.DefaultStoreType;
            configuration.SecurityConfiguration.ApplicationCertificate.StorePath   = Utils.DefaultStorePath;
            configuration.SecurityConfiguration.ApplicationCertificate.SubjectName = $"TSL OPC Client: {Name}";

            // set the session keep alive to 5 seconds.
            configuration.ClientConfiguration.DefaultSessionTimeout = 500000;

            m_configuration  = configuration;
            m_messageContext = configuration.CreateMessageContext();
            m_stopped        = false;

            //m_performanceData = new List<PerfData>();
        }
        /// <summary>
        /// Displays the dialog.
        /// </summary>
        public ITransportChannel ShowDialog(
            ApplicationConfiguration configuration,
            EndpointDescriptionCollection endpoints)
        {
            if (endpoints == null)
            {
                throw new ArgumentNullException("endpoints");
            }
            if (configuration == null)
            {
                throw new ArgumentNullException("configuration");
            }

            m_endpoints      = endpoints;
            m_configuration  = configuration;
            m_messageContext = configuration.CreateMessageContext();

            EndpointCB.Items.Clear();

            foreach (EndpointDescription endpoint in endpoints)
            {
                EndpointCB.Items.Add(endpoint.EndpointUrl);
            }

            if (EndpointCB.Items.Count > 0)
            {
                EndpointCB.SelectedIndex = 0;
            }

            OperationTimeoutNC.Value    = configuration.TransportQuotas.OperationTimeout;
            MaxMessageSizeNC.Value      = configuration.TransportQuotas.MaxMessageSize;
            MaxArrayLengthNC.Value      = configuration.TransportQuotas.MaxArrayLength;
            MaxStringLengthNC.Value     = configuration.TransportQuotas.MaxStringLength;
            MaxByteStringLengthNC.Value = configuration.TransportQuotas.MaxByteStringLength;

            if (ShowDialog() != DialogResult.OK)
            {
                return(null);
            }

            // return the channel.
            return(m_channel);
        }
Example #19
0
        /// <summary>
        /// Creates a session.
        /// </summary>
        private Session CreateSession(
            ApplicationConfiguration configuration,
            BindingFactory bindingFactory,
            ConfiguredEndpoint endpoint,
            IUserIdentity identity)
        {
            Report("Creating new Session with URL = {0}", endpoint.EndpointUrl);

            // Initialize the channel which will be created with the server.
            ITransportChannel channel = SessionChannel.Create(
                configuration,
                endpoint.Description,
                endpoint.Configuration,
                configuration.SecurityConfiguration.ApplicationCertificate.Find(true),
                configuration.CreateMessageContext());

            // Wrap the channel with the session object.
            Session session = new Session(channel, configuration, endpoint, null);

            session.ReturnDiagnostics = DiagnosticsMasks.All;

            // register keep alive callback.
            session.KeepAlive += new KeepAliveEventHandler(Session_KeepAlive);

            // create the user identity.
            if (identity == null)
            {
                if (endpoint.Description.UserIdentityTokens.Count > 0)
                {
                    identity = CreateUserIdentity(endpoint.Description.UserIdentityTokens[0]);
                }
            }

            // Create the session. This actually connects to the server.
            session.Open(Guid.NewGuid().ToString(), identity);

            Report("Successfully created new Session.");

            // return the session.
            return(session);
        }
        /// <summary>
        /// Displays the dialog.
        /// </summary>
        public ITransportChannel ShowDialog(
            ApplicationConfiguration      configuration,
            EndpointDescriptionCollection endpoints)
        {
            if (endpoints == null)      throw new ArgumentNullException("endpoints");
            if (configuration == null)  throw new ArgumentNullException("configuration");

            m_endpoints      = endpoints;
            m_configuration  = configuration;
            m_messageContext = configuration.CreateMessageContext();

            EndpointCB.Items.Clear();

            foreach (EndpointDescription endpoint in endpoints)
            {
                EndpointCB.Items.Add(endpoint.EndpointUrl);
            }

            if (EndpointCB.Items.Count > 0)
            {
                EndpointCB.SelectedIndex = 0;
            }
            
            OperationTimeoutNC.Value    = configuration.TransportQuotas.OperationTimeout;
            MaxMessageSizeNC.Value      = configuration.TransportQuotas.MaxMessageSize;
            MaxArrayLengthNC.Value      = configuration.TransportQuotas.MaxArrayLength;
            MaxStringLengthNC.Value     = configuration.TransportQuotas.MaxStringLength;
            MaxByteStringLengthNC.Value = configuration.TransportQuotas.MaxByteStringLength;

            if (ShowDialog() != DialogResult.OK)
            {
                return null;
            }
                       
            // return the channel.
            return m_channel;
        }
Example #21
0
        /// <summary>
        /// Creates a session with the endpoint.
        /// </summary>
        public Session Connect(ConfiguredEndpoint endpoint)
        {
            if (endpoint == null)
            {
                throw new ArgumentNullException("endpoint");
            }

            EndpointDescriptionCollection availableEndpoints = null;

            // check if the endpoint needs to be updated.
            if (endpoint.UpdateBeforeConnect)
            {
                ConfiguredServerDlg configurationDialog = new ConfiguredServerDlg();
                endpoint = configurationDialog.ShowDialog(endpoint, m_configuration);

                if (endpoint == null)
                {
                    return(null);
                }
                availableEndpoints = configurationDialog.AvailableEnpoints;
            }

            m_endpoint = endpoint;

            // copy the message context.
            m_messageContext = m_configuration.CreateMessageContext();


            X509Certificate2           clientCertificate      = null;
            X509Certificate2Collection clientCertificateChain = null;

            if (endpoint.Description.SecurityPolicyUri != SecurityPolicies.None)
            {
                if (m_configuration.SecurityConfiguration.ApplicationCertificate == null)
                {
                    throw ServiceResultException.Create(StatusCodes.BadConfigurationError, "ApplicationCertificate must be specified.");
                }

                clientCertificate = m_configuration.SecurityConfiguration.ApplicationCertificate.Find(true);

                if (clientCertificate == null)
                {
                    throw ServiceResultException.Create(StatusCodes.BadConfigurationError, "ApplicationCertificate cannot be found.");
                }

                //load certificate chain
                //clientCertificateChain = new X509Certificate2Collection(clientCertificate);
                //List<CertificateIdentifier> issuers = new List<CertificateIdentifier>();
                //m_configuration.CertificateValidator.GetIssuers(clientCertificate, issuers);
                //for (int i = 0; i < issuers.Count; i++)
                //{
                //    clientCertificateChain.Add(issuers[i].Certificate);
                //}
            }

            // create the channel.
            ITransportChannel channel = SessionChannel.Create(
                m_configuration,
                endpoint.Description,
                endpoint.Configuration,
                //clientCertificateChain,
                clientCertificate,
                m_messageContext);

            // create the session.
            return(Connect(endpoint, channel, availableEndpoints));
        }
Example #22
0
        /// <summary>
        /// Creates a new communication session with a server by invoking the CreateSession service
        /// </summary>
        /// <param name="configuration">The configuration for the client application.</param>
        /// <param name="endpoint">The endpoint for the server.</param>
        /// <param name="updateBeforeConnect">If set to <c>true</c> the discovery endpoint is used to update the endpoint description before connecting.</param>
        /// <param name="checkDomain">If set to <c>true</c> then the domain in the certificate must match the endpoint used.</param>
        /// <param name="sessionName">The name to assign to the session.</param>
        /// <param name="sessionTimeout">The timeout period for the session.</param>
        /// <param name="identity">The user identity to associate with the session.</param>
        /// <param name="preferredLocales">The preferred locales.</param>
        /// <returns>The new session object.</returns>
        public static Session Create( 
            ApplicationConfiguration configuration,
            ConfiguredEndpoint       endpoint,
            bool                     updateBeforeConnect,
            bool                     checkDomain,
            string                   sessionName,
            uint                     sessionTimeout,
            IUserIdentity            identity,
            IList<string>            preferredLocales)
        {
            endpoint.UpdateBeforeConnect = updateBeforeConnect;

            EndpointDescription endpointDescription = endpoint.Description;

            // create the endpoint configuration (use the application configuration to provide default values).
            EndpointConfiguration endpointConfiguration = endpoint.Configuration;
            
            if (endpointConfiguration == null)
            {
                endpoint.Configuration = endpointConfiguration = EndpointConfiguration.Create(configuration);
            }

            // create message context.
            ServiceMessageContext messageContext = configuration.CreateMessageContext();
            
            // update endpoint description using the discovery endpoint.
            if (endpoint.UpdateBeforeConnect)
            {
                BindingFactory bindingFactory = BindingFactory.Create(configuration, messageContext);
                endpoint.UpdateFromServer(bindingFactory);

                endpointDescription = endpoint.Description;
                endpointConfiguration = endpoint.Configuration;
            }

            // checks the domains in the certificate.
            if (checkDomain && endpoint.Description.ServerCertificate != null && endpoint.Description.ServerCertificate.Length > 0)
            {
                CheckCertificateDomain(endpoint);
            }

            X509Certificate2 clientCertificate = null;
			//X509Certificate2Collection clientCertificateChain = null;

            if (endpointDescription.SecurityPolicyUri != SecurityPolicies.None)
            {
                if (configuration.SecurityConfiguration.ApplicationCertificate == null)
                {
                    throw ServiceResultException.Create( StatusCodes.BadConfigurationError, "ApplicationCertificate must be specified." );
                }

                clientCertificate = configuration.SecurityConfiguration.ApplicationCertificate.Find( true );

				if( clientCertificate == null )
				{
                    throw ServiceResultException.Create( StatusCodes.BadConfigurationError, "ApplicationCertificate cannot be found." );
                }

                //load certificate chain
                //clientCertificateChain = new X509Certificate2Collection(clientCertificate);
                //List<CertificateIdentifier> issuers = new List<CertificateIdentifier>();
                //configuration.CertificateValidator.GetIssuers(clientCertificate, issuers);
                //for (int i = 0; i < issuers.Count; i++)
                //{
                //    clientCertificateChain.Add(issuers[i].Certificate);
                //}
            }

            // initialize the channel which will be created with the server.
            ITransportChannel channel = SessionChannel.Create(
                 configuration,
                 endpointDescription,
                 endpointConfiguration,
                 //clientCertificateChain,
                 clientCertificate,
                 messageContext);

            // create the session object.
            Session session = new Session(channel, configuration, endpoint, null);

            // create the session.
			try
			{
				session.Open( sessionName, sessionTimeout, identity, preferredLocales, checkDomain );
			}
			catch
			{
				session.Dispose();
				throw;
			}

            return session;
        }
        /// <summary>
        /// Creates a new communication session with a server by invoking the CreateSession service
        /// </summary>
        /// <param name="configuration">The configuration for the client application.</param>
        /// <param name="endpoint">The endpoint for the server.</param>
        /// <param name="updateBeforeConnect">If set to <c>true</c> the discovery endpoint is used to update the endpoint description before connecting.</param>
        /// <param name="checkDomain">If set to <c>true</c> then the domain in the certificate must match the endpoint used.</param>
        /// <param name="sessionName">The name to assign to the session.</param>
        /// <param name="sessionTimeout">The timeout period for the session.</param>
        /// <param name="identity">The user identity to associate with the session.</param>
        /// <param name="preferredLocales">The preferred locales.</param>
        /// <returns>The new session object.</returns>
        public static async Task<Session> Create(
            ApplicationConfiguration configuration,
            ConfiguredEndpoint endpoint,
            bool updateBeforeConnect,
            bool checkDomain,
            string sessionName,
            uint sessionTimeout,
            IUserIdentity identity,
            IList<string> preferredLocales)
        {
            endpoint.UpdateBeforeConnect = updateBeforeConnect;

            EndpointDescription endpointDescription = endpoint.Description;

            // create the endpoint configuration (use the application configuration to provide default values).
            EndpointConfiguration endpointConfiguration = endpoint.Configuration;

            if (endpointConfiguration == null)
            {
                endpoint.Configuration = endpointConfiguration = EndpointConfiguration.Create(configuration);
            }

            // create message context.
            ServiceMessageContext messageContext = configuration.CreateMessageContext();

            // update endpoint description using the discovery endpoint.
            if (endpoint.UpdateBeforeConnect)
            {
                BindingFactory bindingFactory = BindingFactory.Create(configuration, messageContext);
                endpoint.UpdateFromServer(bindingFactory);

                endpointDescription = endpoint.Description;
                endpointConfiguration = endpoint.Configuration;
            }

            // checks the domains in the certificate.
            if (checkDomain && endpoint.Description.ServerCertificate != null && endpoint.Description.ServerCertificate.Length > 0)
            {
                bool domainFound = false;

                X509Certificate2 serverCertificate = new X509Certificate2(endpoint.Description.ServerCertificate);

                // check the certificate domains.
                IList<string> domains = Utils.GetDomainsFromCertficate(serverCertificate);

                if (domains != null)
                {
                    string hostname = endpoint.EndpointUrl.DnsSafeHost;

                    if (hostname == "localhost" || hostname == "127.0.0.1")
                    {
                        hostname = Utils.GetHostName();
                    }

                    for (int ii = 0; ii < domains.Count; ii++)
                    {
                        if (String.Compare(hostname, domains[ii], StringComparison.CurrentCultureIgnoreCase) == 0)
                        {
                            domainFound = true;
                            break;
                        }
                    }
                }

                if (!domainFound)
                {
                    throw new ServiceResultException(StatusCodes.BadCertificateHostNameInvalid);
                }
            }

            X509Certificate2 clientCertificate = null;

            if (endpointDescription.SecurityPolicyUri != SecurityPolicies.None)
            {
                if (configuration.SecurityConfiguration.ApplicationCertificate == null)
                {
                    throw ServiceResultException.Create(StatusCodes.BadConfigurationError, "ApplicationCertificate must be specified.");
                }

                clientCertificate = await configuration.SecurityConfiguration.ApplicationCertificate.Find(true);

                if (clientCertificate == null)
                {
                    throw ServiceResultException.Create(StatusCodes.BadConfigurationError, "ApplicationCertificate cannot be found.");
                }
            }

            // initialize the channel which will be created with the server.
            ITransportChannel channel = SessionChannel.Create(
                 configuration,
                 endpointDescription,
                 endpointConfiguration,
                 //clientCertificateChain,
                 clientCertificate,
                 messageContext);

            // create the session object.
            Session session = new Session(channel, configuration, endpoint, null);

            // create the session.
            try
            {
                session.Open(sessionName, sessionTimeout, identity, preferredLocales);
            }
            catch
            {
                session.Dispose();
                throw;
            }

            return session;
        }
Example #24
0
        /// <summary>
        /// Creates a session.
        /// </summary>
        private Session CreateSession(
            ApplicationConfiguration configuration, 
            BindingFactory           bindingFactory,
            ConfiguredEndpoint       endpoint,
            IUserIdentity            identity)
        {
            Report("Creating new Session with URL = {0}", endpoint.EndpointUrl);

            // Initialize the channel which will be created with the server.
            ITransportChannel channel = SessionChannel.Create(
                configuration,
                endpoint.Description,
                endpoint.Configuration,
                configuration.SecurityConfiguration.ApplicationCertificate.Find(true),
                configuration.CreateMessageContext());

            // Wrap the channel with the session object.
            Session session = new Session(channel, configuration, endpoint, null);
            session.ReturnDiagnostics = DiagnosticsMasks.All;
            
            // register keep alive callback.
            session.KeepAlive += new KeepAliveEventHandler(Session_KeepAlive);
            
            // create the user identity.            
            if (identity == null)
            {
                if (endpoint.Description.UserIdentityTokens.Count > 0)
                {
                    identity = CreateUserIdentity(endpoint.Description.UserIdentityTokens[0]);
                }
            }

            // Create the session. This actually connects to the server.
            session.Open(Guid.NewGuid().ToString(), identity);

            Report("Successfully created new Session.");

            // return the session.
            return session;
        }
Example #25
0
        static void Main(string[] args)
        {
            VariableBrowsePaths = new List <string>();
            VariableBrowsePaths.Add("/6:Data/6:Dynamic/6:Scalar/6:Int32Value");
            // VariableBrowsePaths.Add("/7:MatrikonOpc Sim Server/7:Simulation Items/7:Bucket Brigade/7:Int1");
            // VariableBrowsePaths.Add("/7:MatrikonOPC Sim Server/7:Simulation Items/7:Bucket Brigade/7:Int2");


            try
            {
                // create the configuration.
                ApplicationConfiguration configuration = Helpers.CreateClientConfiguration();

                // create the endpoint description.
                EndpointDescription endpointDescription = Helpers.CreateEndpointDescription();

                // create the endpoint configuration (use the application configuration to provide default values).
                EndpointConfiguration endpointConfiguration = EndpointConfiguration.Create(configuration);

                // the default timeout for a requests sent using the channel.
                endpointConfiguration.OperationTimeout = 600000;

                // use the pure XML encoding on the wire.
                endpointConfiguration.UseBinaryEncoding = true;

                // create the endpoint.
                ConfiguredEndpoint endpoint = new ConfiguredEndpoint(null, endpointDescription, endpointConfiguration);

                // create the binding factory.
                ServiceMessageContext messageContext = configuration.CreateMessageContext();
                BindingFactory        bindingFactory = BindingFactory.Create(configuration, messageContext);

                // update endpoint description using the discovery endpoint.
                if (endpoint.UpdateBeforeConnect)
                {
                    endpoint.UpdateFromServer(bindingFactory);

                    Console.WriteLine("Updated endpoint description for url: {0}", endpointDescription.EndpointUrl);

                    endpointDescription   = endpoint.Description;
                    endpointConfiguration = endpoint.Configuration;
                }

                X509Certificate2 clientCertificate = configuration.SecurityConfiguration.ApplicationCertificate.Find();

                // set up a callback to handle certificate validation errors.
                configuration.CertificateValidator.CertificateValidation += new CertificateValidationEventHandler(CertificateValidator_CertificateValidation);

                // Initialize the channel which will be created with the server.
                ITransportChannel channel = SessionChannel.Create(
                    configuration,
                    endpointDescription,
                    endpointConfiguration,
                    clientCertificate,
                    messageContext);

                // Wrap the channel with the session object.
                // This call will fail if the server does not trust the client certificate.
                Session session = new Session(channel, configuration, endpoint, null);

                session.ReturnDiagnostics = DiagnosticsMasks.All;

                // register keep alive callback.
                // session.KeepAlive += new KeepAliveEventHandler(Session_KeepAlive);

                // passing null for the user identity will create an anonymous session.
                UserIdentity identity = null; // new UserIdentity("iamuser", "password");

                // create the session. This actually connects to the server.
                session.Open("My Session Name", identity);

                //Read some history values:
                string str = "";
                do
                {
                    Console.WriteLine("Select action from the menu:\n");
                    Console.WriteLine("\t 0 - Browse");
                    Console.WriteLine("\t 1 - Update");
                    Console.WriteLine("\t 2 - ReadRaw");
                    Console.WriteLine("\t 3 - ReadProcessed");
                    Console.WriteLine("\t 4 - ReadAtTime");
                    Console.WriteLine("\t 5 - ReadAttributes");
                    Console.WriteLine("\t 6 - DeleteAtTime");
                    Console.WriteLine("\t 7 - DeleteRaw");


                    Console.WriteLine("\n\tQ - exit\n\n");

                    str = Console.ReadLine();
                    Console.WriteLine("\n");

                    try
                    {
                        if (str == "0")
                        {
                            Browse(session);
                        }
                        else if (str == "1")
                        {
                            HistoryUpdate(session);
                        }
                        else if (str == "2")
                        {
                            HistoryReadRaw(session);
                        }
                        else if (str == "3")
                        {
                            HistoryReadProcessed(session);
                        }
                        else if (str == "4")
                        {
                            HistoryReadAtTime(session);
                        }
                        else if (str == "5")
                        {
                            HistoryReadAttributes(session);
                        }
                        else if (str == "6")
                        {
                            HistoryDeleteAtTime(session);
                        }
                        else if (str == "7")
                        {
                            HistoryDeleteRaw(session);
                        }
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine("Exception occured: " + e.Message);
                    }
                } while (str != "Q" && str != "q");


                // Display some friendly info to the console and then wait for the ENTER key to be pressed.
                Console.WriteLine("Connected to {0}.\nPress ENTER to disconnect to end.", DefaultServerUrl);
                Console.ReadLine();

                // Close and Dispose of our session, effectively disconnecting us from the UA Server.
                session.Close();
                session.Dispose();
            }
            catch (Exception e)
            {
                Console.WriteLine("Unexpected exception: {0}.\nPress ENTER to disconnect to end.", e.Message);
                Console.ReadLine();
                Console.WriteLine();
                Console.WriteLine("========================================================================================");
                Console.WriteLine();
            }
        }
Example #26
0
        /// <summary>
        /// Called before the server starts.
        /// </summary>
        /// <param name="configuration">The object that stores the configurable configuration information for a UA application.</param>
        protected virtual void OnServerStarting(ApplicationConfiguration configuration)
        {            
            // fetch properties and configuration.
            Configuration = configuration;
            ServerProperties = LoadServerProperties();
            
            // ensure at least one security policy exists.
            if (configuration.ServerConfiguration != null)
            {
                if (configuration.ServerConfiguration.SecurityPolicies.Count == 0)
                {                   
                    configuration.ServerConfiguration.SecurityPolicies.Add(new ServerSecurityPolicy());
                }
                
                // ensure at least one user token policy exists.
                if (configuration.ServerConfiguration.UserTokenPolicies.Count == 0)
                {                   
                    UserTokenPolicy userTokenPolicy = new UserTokenPolicy();
                    
                    userTokenPolicy.TokenType = UserTokenType.Anonymous;
                    userTokenPolicy.PolicyId  = userTokenPolicy.TokenType.ToString();

                    configuration.ServerConfiguration.UserTokenPolicies.Add(userTokenPolicy);
                }
            }

            // load the instance certificate.
            if (configuration.SecurityConfiguration.ApplicationCertificate != null)
            {
                InstanceCertificate = configuration.SecurityConfiguration.ApplicationCertificate.Find(true);
            }

            if (InstanceCertificate == null)
            {
                throw new ServiceResultException(
                    StatusCodes.BadConfigurationError,
                    "Server does not have an instance certificate assigned.");
            }

            if (!InstanceCertificate.HasPrivateKey)
            {
                throw new ServiceResultException(
                    StatusCodes.BadConfigurationError,
                    "Server does not have access to the private key for the instance certificate.");
            }

            //load certificate chain
            //InstanceCertificateChain = new X509Certificate2Collection(InstanceCertificate);
            //List<CertificateIdentifier> issuers = new List<CertificateIdentifier>();
            //configuration.CertificateValidator.GetIssuers(InstanceCertificate, issuers);
            //for (int i = 0; i < issuers.Count; i++)
            //{
            //    InstanceCertificateChain.Add(issuers[i].Certificate);
            //}
            
            // use the message context from the configuration to ensure the channels are using the same one.
            MessageContext = configuration.CreateMessageContext();
            
            // assign a unique identifier if none specified.
            if (String.IsNullOrEmpty(configuration.ApplicationUri))
            {
                configuration.ApplicationUri = Utils.GetApplicationUriFromCertficate(InstanceCertificate);
                
                if (String.IsNullOrEmpty(configuration.ApplicationUri))
                {
                    configuration.ApplicationUri = Utils.Format(
                        "http://{0}/{1}/{2}", 
                        System.Net.Dns.GetHostName(),
                        configuration.ApplicationName, 
                        Guid.NewGuid());
                }
            }

            // initialize namespace table.
            MessageContext.NamespaceUris = new NamespaceTable();
            MessageContext.NamespaceUris.Append(configuration.ApplicationUri);
            
            // assign an instance name.
            if (String.IsNullOrEmpty(configuration.ApplicationName) && InstanceCertificate != null)
            {
                configuration.ApplicationName = InstanceCertificate.GetNameInfo(X509NameType.DnsName, false);
            }

            // save the certificate validator.
            CertificateValidator = configuration.CertificateValidator;
        }
Example #27
0
        private static void securelyUpdateEndpointConfiguration(ConfiguredEndpoint ep, ApplicationConfiguration applicationConfiguration)
        {
            // ep.UpdateFromServer(...) looks for matching endpoints on the server.
            // If there is no match with the same securityMode and securityPolicy, it will simply
            // _replace_ ep by one of the server endpoints, possibly lowering the security settings. Therefore:
            // save old settings - update from server - verify security settings -- and throw update from server away if security settings have changed.
            // note that ConfiguredEndpoints need a collection to live in. Note also that some settings of the configured endpoint may be changed nonetheless behind the scenes.
            ConfiguredEndpointCollection cepc = new ConfiguredEndpointCollection();
            EndpointDescription          epd  = (EndpointDescription)ep.Description.Clone();
            ConfiguredEndpoint           cep  = new ConfiguredEndpoint(cepc, epd);

            Opc.Ua.BindingFactory bindingFactory = BindingFactory.Create(applicationConfiguration, applicationConfiguration.CreateMessageContext());
            ep.UpdateFromServer(bindingFactory);

            if (ep.Description.SecurityMode != epd.SecurityMode || ep.Description.SecurityPolicyUri != epd.SecurityPolicyUri)
            {
                ep.Update(cep);
                throw ServiceResultException.Create(StatusCodes.BadConfigurationError, "No endpoint with matching security configuration could be found during updated on connect.");
            }
        }
        public async Task <Session> CreateSession(OPCUAServer server, string sessionName)
        {
            try
            {
                lock (dicOfSession)
                {
                    if (dicOfSession.ContainsKey(sessionName))
                    {
                        return(dicOfSession[sessionName]);
                    }
                }


                #region OPCUAServer
                UAServer objUAServer = new UAServer();
                objUAServer.Protocol           = server.protocol;
                objUAServer.SecurityMode       = server.securityMode;
                objUAServer.SecurityPolicy     = server.securityMode;
                objUAServer.SecurityPolicy     = server.securityPolicy;
                objUAServer.UserIdentityString = server.UserIdentityString;
                objUAServer.ServerName         = server.serverName;
                try
                {
                    objUAServer.UserIdentity = (UserIdentityType)Enum.Parse(typeof(UserIdentityType), objUAServer.UserIdentityString);
                }
                catch
                {
                    if (objUAServer.UserIdentityString.Equals("Anonymous"))
                    {
                        objUAServer.UserIdentity = UserIdentityType.Anonymous;
                    }
                    else if (objUAServer.UserIdentityString.Equals("UserName"))
                    {
                        objUAServer.UserIdentity = UserIdentityType.UserName;
                    }
                    else
                    {
                        objUAServer.UserIdentity = UserIdentityType.Certificate;
                    }
                }

                if (objUAServer.UserIdentity.Equals(UserIdentityType.Certificate))
                {
                    objUAServer.IsSecurityStoreEnabled = false;
                    objUAServer.CertificationPath      = server.certificationPath;
                    objUAServer.CertificationPassword  = server.certificationPassword;
                }
                else if (objUAServer.UserIdentity.Equals(UserIdentityType.UserName))
                {
                    objUAServer.UserName     = server.userName;
                    objUAServer.UserPassword = server.userPassword;
                }
                #endregion

                await CheckAndLoadConfiguration();

                // Create the configuration.
                ApplicationConfiguration configuration = _appConfiguration; // Helpers.CreateClientConfiguration(myServer);

                // Create the endpoint description.
                EndpointDescription endpointDescription = Helpers.CreateEndpointDescription(objUAServer);

                // Create the endpoint configuration (use the application configuration to provide default values).
                EndpointConfiguration endpointConfiguration = EndpointConfiguration.Create(configuration);

                // The default timeout for a requests sent using the channel.
                endpointConfiguration.OperationTimeout = 300000;

                // Use the pure binary encoding on the wire.
                //OA-2018-04-11
                // endpointConfiguration.UseBinaryEncoding = true;
                if (objUAServer.MessageEncoding.ToLower().Equals("binary"))
                {
                    endpointConfiguration.UseBinaryEncoding = true;
                }
                else
                {
                    endpointConfiguration.UseBinaryEncoding = false;
                }

                IUserIdentity identity;


                var t = _appConfiguration.SecurityConfiguration.ApplicationCertificate.Find(true);
                X509Certificate2 clientCertificate = t.Result;

                UserTokenPolicy poly;


                if (objUAServer.UserIdentity.Equals(UserIdentityType.UserName))
                {
                    identity = new UserIdentity(objUAServer.UserName, objUAServer.UserPassword);
                    poly     = new UserTokenPolicy(UserTokenType.UserName);
                    //added by kais wali
                    bool exist = false;
                    foreach (UserTokenPolicy poltemp in endpointDescription.UserIdentityTokens)
                    {
                        if (poltemp.TokenType.ToString() == poly.TokenType.ToString())
                        {
                            exist = true;
                            break;
                        }
                    }
                    if (!exist)
                    {
                        endpointDescription.UserIdentityTokens.Add(poly);
                    }
                }
                else if (objUAServer.UserIdentity.Equals(UserIdentityType.Certificate))
                {
                    CertificateIdentifier certificateIdentifier = new CertificateIdentifier();
                    X509Certificate2      currentCertificate;
                    certificateIdentifier.StoreType = CertificateStoreType.Directory;
                    currentCertificate = new X509Certificate2(objUAServer.CertificationPath, objUAServer.CertificationPassword, X509KeyStorageFlags.Exportable | X509KeyStorageFlags.MachineKeySet);
                    if (currentCertificate == null)
                    {
                        throw ServiceResultException.Create(StatusCodes.BadCertificateInvalid, "Could not find certificate: {0}", certificateIdentifier.SubjectName);
                    }
                    identity = new UserIdentity(currentCertificate);
                    //

                    poly = new UserTokenPolicy(UserTokenType.Certificate);
                    //added by kais wali
                    bool exist = false;
                    foreach (UserTokenPolicy poltemp in endpointDescription.UserIdentityTokens)
                    {
                        if (poltemp.TokenType.ToString() == poly.TokenType.ToString())
                        {
                            exist = true;
                            break;
                        }
                    }
                    if (!exist)
                    {
                        endpointDescription.UserIdentityTokens.Add(poly);
                    }
                }
                else
                {
                    identity = new UserIdentity();
                    poly     = new UserTokenPolicy(UserTokenType.Anonymous);
                    //added by kais wali
                    bool exist = false;
                    foreach (UserTokenPolicy poltemp in endpointDescription.UserIdentityTokens)
                    {
                        if (poltemp.TokenType.ToString() == poly.TokenType.ToString())
                        {
                            exist = true;
                            break;
                        }
                    }
                    if (!exist)
                    {
                        endpointDescription.UserIdentityTokens.Add(poly);
                    }
                }

                // Create the endpoint.
                ConfiguredEndpoint endpoint = new ConfiguredEndpoint(null, endpointDescription, endpointConfiguration);

                // Update endpoint description using the discovery endpoint.
                // create message context.
                ServiceMessageContext messageContext = configuration.CreateMessageContext();

                //Set to true in default configuration (If the user have not configured an OPC UA Server in the ONBS)
                endpoint.UpdateBeforeConnect = false;
                // update endpoint description using the discovery endpoint.

                //OA-2018-06-19 Commented

                /*if (endpoint.UpdateBeforeConnect)
                 * {
                 *  BindingFactory bindingFactory = BindingFactory.Create(configuration, messageContext);
                 *  endpoint.UpdateFromServer(bindingFactory);
                 *
                 *  endpointDescription = endpoint.Description;
                 *  endpointConfiguration = endpoint.Configuration;
                 * }*/

                // Set up a callback to handle certificate validation errors.
                //  configuration.CertificateValidator.CertificateValidation += new CertificateValidationEventHandler(CertificateValidator_CertificateValidation);


                // initialize the channel which will be created with the server.
                ITransportChannel channel = SessionChannel.Create(
                    configuration,
                    endpointDescription,
                    endpointConfiguration,
                    //clientCertificateChain,
                    clientCertificate,
                    messageContext);

                // create the session object.
                //OA-2017-08-15
                Session m_session = new Session(channel, configuration, endpoint, clientCertificate);
                //m_session = new Session(channel, configuration, endpoint, null);

                //OA-2017-09-20
                byte[] certificateData = endpoint.Description.ServerCertificate;
                //islem Commented serverCertificate
                if (certificateData != null) //OA-2018-04-27
                                             //serverCertificate = Utils.ParseCertificateBlob(certificateData);
                                             //

                {
                    m_session.ReturnDiagnostics = DiagnosticsMasks.All;
                }

                // Register keep alive callback.
                //islem Commented KeepAlive
                // m_session.KeepAlive += new KeepAliveEventHandler(Session_KeepAlive);

                // create the session.
                try
                {
                    m_session.Open(sessionName, 60000, identity, null);
                    dicOfSession.Add(sessionName, m_session);//OA-2017-09-20
                }
                catch (Exception e)
                {
                }

                return(m_session);
            }
            catch (Exception e)
            {
                return(null);
            }
        }
        /// <summary>
        /// Creates a session with the endpoint.
        /// </summary>
        public async Task <Session> Connect(ConfiguredEndpoint endpoint)
        {
            if (endpoint == null)
            {
                throw new ArgumentNullException("endpoint");
            }

            // check if the endpoint needs to be updated.
            if (endpoint.UpdateBeforeConnect)
            {
                ConfiguredServerDlg configurationDialog = new ConfiguredServerDlg();
                endpoint = await configurationDialog.ShowDialog(endpoint, m_configuration);
            }

            if (endpoint == null)
            {
                return(null);
            }

            m_endpoint = endpoint;

            // copy the message context.
            m_messageContext = m_configuration.CreateMessageContext();

            X509Certificate2 clientCertificate = null;

            if (endpoint.Description.SecurityPolicyUri != SecurityPolicies.None)
            {
                if (m_configuration.SecurityConfiguration.ApplicationCertificate == null)
                {
                    throw ServiceResultException.Create(StatusCodes.BadConfigurationError, "ApplicationCertificate must be specified.");
                }

                clientCertificate = await m_configuration.SecurityConfiguration.ApplicationCertificate.Find(true);

                if (clientCertificate == null)
                {
                    throw ServiceResultException.Create(StatusCodes.BadConfigurationError, "ApplicationCertificate cannot be found.");
                }
            }

            // create the channel.
            ITransportChannel channel = SessionChannel.Create(
                m_configuration,
                endpoint.Description,
                endpoint.Configuration,
                clientCertificate,
                m_messageContext);

            try
            {
                // create the session.
                Session session = new Session(channel, m_configuration, endpoint, null);
                session.ReturnDiagnostics = DiagnosticsMasks.All;

                SessionOpenDlg sessiondlg = new SessionOpenDlg();
                session = await sessiondlg.ShowDialog(session, PreferredLocales);

                if (session != null)
                {
                    // session now owns the channel.
                    channel = null;
                    // add session to tree.
                    AddNode(session);

                    return(session);
                }
            }
            finally
            {
                // ensure the channel is closed on error.
                if (channel != null)
                {
                    channel.Close();
                    channel = null;
                }
            }

            return(null);
        }
Example #30
0
        /// <summary>
        /// Create a session with the given UA server
        /// </summary>
        /// <param name="discoveryUrl"></param>
        /// <param name="configSection"></param>
        /// <returns></returns>
        public static Session CreateSession(string discoveryUrl, string configSection)
        {
            // Step 1 -- Load configuration
            ApplicationConfiguration configuration = ApplicationConfiguration.Load(configSection, ApplicationType.Client);

            ClientUtils.CheckApplicationInstanceCertificate(configuration);

            // Step 2 -- Select an endpoint
            // create the endpoint description
            EndpointDescription endpointDescription = ClientUtils.SelectEndpoint(discoveryUrl, false);

            endpointDescription.SecurityMode      = MessageSecurityMode.None;
            endpointDescription.SecurityPolicyUri = @"http://opcfoundation.org/UA/SecurityPolicy#None";

            // create the endpoint configuration
            EndpointConfiguration endpointConfiguration = EndpointConfiguration.Create(configuration);

            // the default timeout for a requests sent using the channel.
            endpointConfiguration.OperationTimeout = 600000;
            // create the endpoint.
            ConfiguredEndpoint endpoint = new ConfiguredEndpoint(null, endpointDescription, endpointConfiguration);

            // choose the encoding strategy: true: BinaryEncoding; false: XmlEncoding
            endpoint.Configuration.UseBinaryEncoding = true;

            // create the binding factory.
            BindingFactory bindingFactory = BindingFactory.Create(configuration, configuration.CreateMessageContext());

            // update endpoint description using the discovery endpoint.
            if (endpoint.UpdateBeforeConnect)
            {
                endpoint.UpdateFromServer(bindingFactory);

                //Console.Error.WriteLine("Updated endpoint description for url: {0}\n", endpointDescription.EndpointUrl);

                endpointDescription   = endpoint.Description;
                endpointConfiguration = endpoint.Configuration;
            }

            X509Certificate2 clientCertificate = configuration.SecurityConfiguration.ApplicationCertificate.Find();

            // set up a callback to handle certificate validation errors.
            configuration.CertificateValidator.CertificateValidation += new CertificateValidationEventHandler(CertificateValidator_CertificateValidation);

            // Step 3 -- Initialize the channel which will be created with the server.
            SessionChannel channel = SessionChannel.Create(
                configuration,
                endpointDescription,
                endpointConfiguration,
                bindingFactory,
                clientCertificate,
                null);

            // Step 4 -- Create a session
            Session session = new Session(channel, configuration, endpoint);

            session.ReturnDiagnostics = DiagnosticsMasks.All;
            string       sessionName = "SenderSession";
            UserIdentity identity    = new UserIdentity(); // anonymous

            session.KeepAlive += new KeepAliveEventHandler(Session_KeepAlive);
            session.Open(sessionName, identity);
            return(session);
        }
Example #31
0
        /// <summary>
        /// On page loaded
        /// </summary>
        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            base.OnNavigatedTo(e);

            App.unclosedSession = this;

            sessionInfo = e.Parameter as SessionInfo;

            if (sessionInfo == null)
            {
                sessionMgmtAction         = SESSIONMGMT_ACTION.NEW;
                sessionInfo               = new SessionInfo();
                sessionInfo.sessionName   = "";
                sessionInfo.profilePath   = "";
                sessionInfo.sourceType    = "";
                m_sessionConfig_full_path = "";
                m_sessionConfig           = null;
            }
            else
            {
                m_sessionConfig_full_path = Path.Combine(m_local, SiteProfileManager.GetFullPath(App.SiteProfileId, sessionInfo.profilePath));
                // json configuration
                m_sessionConfig = OpcuaSessionConfig.LoadFromJsonFile(m_sessionConfig_full_path);
            }


            ApplicationInstance      application   = OpcuaSessionConfig.OpcuaApplication;
            ApplicationConfiguration configuration = application.ApplicationConfiguration;
            ServiceMessageContext    context       = configuration.CreateMessageContext();

            if (!configuration.SecurityConfiguration.AutoAcceptUntrustedCertificates)
            {
                configuration.CertificateValidator.CertificateValidation += new CertificateValidationEventHandler(CertificateValidator_CertificateValidation);
            }

            m_context       = context;
            m_application   = application;
            m_configuration = configuration;

            SessionsCTRL.Configuration    = configuration;
            SessionsCTRL.MessageContext   = context;
            SessionsCTRL.AddressSpaceCtrl = BrowseCTRL;
            SessionsCTRL.NodeSelected    += SessionCtrl_NodeSelected;


            // disable cached endpoints from Opc.Ua.SampleClient.Config.xml
            //// get list of cached endpoints.
            //m_endpoints = m_configuration.LoadCachedEndpoints(true);
            m_endpoints = new ConfiguredEndpointCollection();
            m_endpoints.DiscoveryUrls = configuration.ClientConfiguration.WellKnownDiscoveryUrls;

            // work around to fill Configuration and DiscoveryUrls
            if (m_sessionConfig != null)
            {
                m_sessionConfig.endpoint.Configuration = EndpointConfiguration.Create(m_configuration);
                m_sessionConfig.endpoint.Description.Server.DiscoveryUrls.Add(m_sessionConfig.endpoint.EndpointUrl.AbsoluteUri.ToString());
                m_endpoints.Add(m_sessionConfig.endpoint);
            }

            // hook up endpoint selector
            EndpointSelectorCTRL.Initialize(m_endpoints, m_configuration);
            EndpointSelectorCTRL.ConnectEndpoint  += EndpointSelectorCTRL_ConnectEndpoint;
            EndpointSelectorCTRL.EndpointsChanged += EndpointSelectorCTRL_OnChange;

            BrowseCTRL.SessionTreeCtrl = SessionsCTRL;
            BrowseCTRL.NodeSelected   += BrowseCTRL_NodeSelected;

            btnDelSubscription.IsEnabled = false;
            btnAddSubscription.IsEnabled = false;

            btnDelSubscription.Click += ContextMenu_OnDelete;
            btnAddSubscription.Click += ContextMenu_OnReport;

            // exception dialog
            GuiUtils.ExceptionMessageDlg += ExceptionMessageDlg;

            EndpointSelectorCTRL.IsEnabled = false;
            BrowseCTRL.IsEnabled           = false;
            SessionsCTRL.IsEnabled         = false;

            txtSessionName.Text = sessionInfo.sessionName;

            if (sessionMgmtAction == SESSIONMGMT_ACTION.NEW)
            {
                txtSessionName.IsReadOnly      = false;
                btnReload.IsEnabled            = false;
                btnReload.Visibility           = Visibility.Collapsed;
                EndpointSelectorCTRL.IsEnabled = true;
            }
            else
            {
                if (m_sessionConfig == null)
                {
                    txtSessionName.IsReadOnly      = true;
                    EndpointSelectorCTRL.IsEnabled = true;
                    btnReload.IsEnabled            = false;
                }
                else
                {
                    txtSessionName.IsReadOnly = true;
                    btnReload.IsEnabled       = false;
                    var ignored = Task.Run(OpenSessionView_OpcuaClient);
                }
            }
        }
Example #32
0
        public async Task TryConnectAsync()
        {
            await _mutex.WaitAsync(_cancellationToken).ConfigureAwait(false);

            try
            {
                if (Connected)
                {
                    return;
                }
                try
                {
                    var endpointDescription = await GetEndpointAsync(EndpointUrl, true).ConfigureAwait(false);

                    ConfiguredEndpoint.Update(endpointDescription);
                    ConfiguredEndpoint.Configuration.UseBinaryEncoding = endpointDescription.EncodingSupport == BinaryEncodingSupport.Optional || endpointDescription.EncodingSupport == BinaryEncodingSupport.Required;
                    TransportChannel = SessionChannel.Create(Configuration, ConfiguredEndpoint.Description, ConfiguredEndpoint.Configuration, Configuration.SecurityConfiguration.ApplicationCertificate.Certificate, Configuration.CreateMessageContext());
                    Open(_sessionName, null);
                    NotifyPropertyChanged("Connected");
                    Trace.TraceInformation("Success connecting to endpoint '{0}'. ", ConfiguredEndpoint);
                }
                catch (ServiceResultException ex)
                {
                    Trace.TraceError("Error connecting to endpoint '{0}'. {1}", ConfiguredEndpoint, ex.Message);
                }
            }
            finally
            {
                _mutex.Release();
            }
        }
 public static BindingFactory Create(ApplicationConfiguration configuration)
 {
     return Create(configuration, configuration.CreateMessageContext());
 }
        /// <summary>
        /// Creates a new communication session with a server by invoking the CreateSession service
        /// </summary>
        /// <param name="configuration">The configuration for the client application.</param>
        /// <param name="endpoint">The endpoint for the server.</param>
        /// <param name="updateBeforeConnect">If set to <c>true</c> the discovery endpoint is used to update the endpoint description before connecting.</param>
        /// <param name="checkDomain">If set to <c>true</c> then the domain in the certificate must match the endpoint used.</param>
        /// <param name="sessionName">The name to assign to the session.</param>
        /// <param name="sessionTimeout">The timeout period for the session.</param>
        /// <param name="identity">The user identity to associate with the session.</param>
        /// <param name="preferredLocales">The preferred locales.</param>
        /// <returns>The new session object.</returns>
        public static async Task<Session> Create(
            ApplicationConfiguration configuration,
            ConfiguredEndpoint endpoint,
            bool updateBeforeConnect,
            bool checkDomain,
            string sessionName,
            uint sessionTimeout,
            IUserIdentity identity,
            IList<string> preferredLocales)
        {
            endpoint.UpdateBeforeConnect = updateBeforeConnect;

            EndpointDescription endpointDescription = endpoint.Description;

            // create the endpoint configuration (use the application configuration to provide default values).
            EndpointConfiguration endpointConfiguration = endpoint.Configuration;

            if (endpointConfiguration == null)
            {
                endpoint.Configuration = endpointConfiguration = EndpointConfiguration.Create(configuration);
            }

            // create message context.
            ServiceMessageContext messageContext = configuration.CreateMessageContext();

            // update endpoint description using the discovery endpoint.
            if (endpoint.UpdateBeforeConnect)
            {
                endpoint.UpdateFromServer();

                endpointDescription = endpoint.Description;
                endpointConfiguration = endpoint.Configuration;
            }

            // checks the domains in the certificate.
            if (checkDomain && endpoint.Description.ServerCertificate != null && endpoint.Description.ServerCertificate.Length > 0)
            {
                CheckCertificateDomain(endpoint);
            }

            X509Certificate2 clientCertificate = null;

            if (endpointDescription.SecurityPolicyUri != SecurityPolicies.None)
            {
                if (configuration.SecurityConfiguration.ApplicationCertificate == null)
                {
                    throw ServiceResultException.Create(StatusCodes.BadConfigurationError, "ApplicationCertificate must be specified.");
                }

                clientCertificate = await configuration.SecurityConfiguration.ApplicationCertificate.Find(true);

                if (clientCertificate == null)
                {
                    throw ServiceResultException.Create(StatusCodes.BadConfigurationError, "ApplicationCertificate cannot be found.");
                }
            }

            // initialize the channel which will be created with the server.
            ITransportChannel channel = SessionChannel.Create(
                 configuration,
                 endpointDescription,
                 endpointConfiguration,
                 clientCertificate,
                 messageContext);

            // create the session object.
            Session session = new Session(channel, configuration, endpoint, null);

            // create the session.
            try
            {
                session.Open(sessionName, sessionTimeout, identity, preferredLocales, checkDomain);
            }
            catch (Exception e)
            {
                session.Dispose();
                throw e;
            }

            return session;
        }
Example #35
0
        /// <summary>
        /// Adds the discovery url to the hosts.
        /// </summary>
        /// <param name="configuration">The configuration.</param>
        /// <param name="discoveryUrls">The discovery urls.</param>
        public virtual void InitializeDiscovery(
            ApplicationConfiguration configuration,
            StringCollection         discoveryUrls)
        {
            // create the binding factory.
            BindingFactory bindingFactory = BindingFactory.Create(configuration, configuration.CreateMessageContext());
            EndpointConfiguration endpointConfiguration = EndpointConfiguration.Create(configuration);
                        
            foreach (string discoveryUrl in discoveryUrls)
            {                  
                // parse discovery url.
                Uri url = Utils.ParseUri(discoveryUrl);

                if (url == null)
                {
                    continue;
                }

                // create endpoint.
                if (url.PathAndQuery.EndsWith("/discovery"))
                {
                    Binding binding = bindingFactory.Create(url.Scheme, endpointConfiguration);
                    this.AddServiceEndpoint(typeof(IDiscoveryEndpoint), binding, url, url);
                }
            }
        }