/// <summary>
        /// Configure the feature
        /// </summary>
        public void Configure(SanteDBConfiguration configuration, IDictionary <string, string> settings)
        {
            if (configuration.GetSection <FileMatchConfigurationSection>() == null) // Add configuration for file matching
            {
                configuration.AddSection(DockerFeatureUtils.LoadConfigurationResource <FileMatchConfigurationSection>("SanteDB.Matcher.Docker.MatchingFeature.xml"));
            }

            // Add the file match configuration service
            var serviceConfiguration = configuration.GetSection <ApplicationServiceContextConfigurationSection>().ServiceProviders;

            if (!serviceConfiguration.Any(s => s.Type == typeof(FileMatchConfigurationProvider)))
            {
                serviceConfiguration.Add(new TypeReferenceConfiguration(typeof(FileMatchConfigurationProvider)));
            }

            // Did the hoster specify a matcher they want to use?
            if (settings.TryGetValue(ModeSetting, out string matcher))
            {
                switch (matcher)
                {
                case SimpleMode:
                    serviceConfiguration.Add(new TypeReferenceConfiguration(typeof(SimpleRecordMatchingService)));
                    break;

                case WeightedMode:
                    serviceConfiguration.Add(new TypeReferenceConfiguration(typeof(WeightedRecordMatchingService)));
                    break;

                default:
                    throw new ConfigurationException($"{matcher} is not a valid valud for SDB_MATCHING_MODE. Use either SIMPLE or WEIGHTED", configuration);
                }
            }
            else
            {
                serviceConfiguration.Add(new TypeReferenceConfiguration(typeof(WeightedRecordMatchingService)));
            }
        }
Exemplo n.º 2
0
        /// <summary>
        /// Configure
        /// </summary>
        /// <param name="configuration"></param>
        /// <param name="settings"></param>
        public void Configure(SanteDBConfiguration configuration, IDictionary <string, string> settings)
        {
            var oauthConf = configuration.GetSection <OAuthConfigurationSection>();

            if (oauthConf == null)
            {
                oauthConf = DockerFeatureUtils.LoadConfigurationResource <OAuthConfigurationSection>("SanteDB.Authentication.OAuth2.Docker.OauthFeature.xml");
                configuration.AddSection(oauthConf);
            }

            var restConfiguration = configuration.GetSection <SanteDB.Rest.Common.Configuration.RestConfigurationSection>();

            if (restConfiguration == null)
            {
                throw new ConfigurationException("Error retrieving REST configuration", configuration);
            }

            var oauthRestConfiguration = restConfiguration.Services.FirstOrDefault(o => o.ServiceType == typeof(IOAuthTokenContract));

            if (oauthRestConfiguration == null) // add fhir rest config
            {
                oauthRestConfiguration = new RestServiceConfiguration()
                {
                    Name      = "OAuth2",
                    Endpoints = new List <RestEndpointConfiguration>()
                    {
                        new RestEndpointConfiguration()
                        {
                            Address     = "http://0.0.0.0:8080/auth",
                            ContractXml = typeof(IOAuthTokenContract).AssemblyQualifiedName,
                        }
                    }
                };
                restConfiguration.Services.Add(oauthRestConfiguration);
            }

            if (settings.TryGetValue(ListenSetting, out string listenStr))
            {
                if (!Uri.TryCreate(listenStr, UriKind.Absolute, out Uri listenUri))
                {
                    throw new ArgumentException($"{listenStr} is not a valid URI");
                }
                oauthRestConfiguration.Endpoints.ForEach(ep => ep.Address = listenStr);
            }

            // Client claims?
            if (settings.TryGetValue(ClientClaimSetting, out String claim))
            {
                oauthConf.AllowedClientClaims = claim.Split(';').ToList();
            }

            // Token type?
            if (settings.TryGetValue(TokenTypeSetting, out String tokenType))
            {
                oauthConf.TokenType = tokenType;
            }

            // Allow insecure authentication?
            if (settings.TryGetValue(NodelessClientAuthSetting, out string insecureSetting))
            {
                if (!bool.TryParse(insecureSetting, out bool insecureBool))
                {
                    throw new ArgumentOutOfRangeException($"{insecureSetting} is not a valid boolean value");
                }
                oauthConf.AllowClientOnlyGrant = insecureBool;
            }

            // Issuer (used for client claims auth and oauth)
            if (settings.TryGetValue(IssuerIdSetting, out String issuer))
            {
                oauthConf.IssuerName = issuer;
            }

            if (settings.TryGetValue(JwtSigningKey, out String jwtSinging))
            {
                oauthConf.JwtSigningKey = jwtSinging;
            }

            // Add services
            var serviceConfiguration = configuration.GetSection <ApplicationServiceContextConfigurationSection>().ServiceProviders;

            if (!serviceConfiguration.Any(s => s.Type == typeof(OAuthMessageHandler)))
            {
                serviceConfiguration.Add(new TypeReferenceConfiguration(typeof(OAuthMessageHandler)));
            }
        }
Exemplo n.º 3
0
        /// <summary>
        /// Configure the message handler
        /// </summary>
        public void Configure(SanteDBConfiguration configuration, IDictionary <string, string> settings)
        {
            var hl7Configuration = configuration.GetSection <Hl7ConfigurationSection>();

            if (hl7Configuration == null)
            {
                hl7Configuration = DockerFeatureUtils.LoadConfigurationResource <Hl7ConfigurationSection>("SanteDB.Messaging.HL7.Docker.Hl7Feature.xml");
                configuration.AddSection(hl7Configuration);
            }

            // first the security
            if (settings.TryGetValue(AuthenticationSetting, out string auth))
            {
                if (!Enum.TryParse <AuthenticationMethod>(auth, true, out AuthenticationMethod authResult))
                {
                    this.m_tracer.TraceError($"Couldn't understand {auth}, valid values are NONE, MSH8, or SFT4");
                    throw new ArgumentOutOfRangeException($"{auth} not valid setting - valid values are NONE, MSH8, or SFT4");
                }
                hl7Configuration.Security = authResult;
            }

            // Next, local domain
            if (settings.TryGetValue(LocalAuthoritySetting, out string localAuth))
            {
                hl7Configuration.LocalAuthority = new Core.Model.DataTypes.AssigningAuthority(localAuth, localAuth, null);
            }

            // Next the SSN domain
            if (settings.TryGetValue(SsnAuthoritySetting, out string ssnAuth))
            {
                hl7Configuration.SsnAuthority = new Core.Model.DataTypes.AssigningAuthority(ssnAuth, ssnAuth, null);
            }

            // Next listen address
            if (settings.TryGetValue(ListenUriSetting, out string listenStr))
            {
                if (!Uri.TryCreate(listenStr, UriKind.Absolute, out Uri listenUri))
                {
                    throw new ArgumentOutOfRangeException($"{listenStr} is not a valid URL");
                }

                hl7Configuration.Services.ForEach(o => o.AddressXml = listenStr);
            }

            // Timeouts
            if (settings.TryGetValue(TimeoutSetting, out string timeoutStr))
            {
                if (!Int32.TryParse(timeoutStr, out int timeout))
                {
                    this.m_tracer.TraceError("Invalid timeout");
                    throw new ArgumentOutOfRangeException($"{timeoutStr} is not a valid timeout");
                }
                hl7Configuration.Services.ForEach(o => o.ReceiveTimeout = timeout);
            }

            // Service certificates
            if (settings.TryGetValue(ServerCertificateSetting, out String serverCertificate))
            {
                hl7Configuration.Services.ForEach(svc => svc.Configuration = new SllpTransport.SllpConfigurationObject()
                {
                    CheckCrl          = true,
                    ServerCertificate = new X509ConfigurationElement()
                    {
                        FindType      = System.Security.Cryptography.X509Certificates.X509FindType.FindByThumbprint,
                        FindValue     = serverCertificate,
                        StoreLocation = System.Security.Cryptography.X509Certificates.StoreLocation.LocalMachine,
                        StoreName     = System.Security.Cryptography.X509Certificates.StoreName.My
                    },
                    EnableClientCertNegotiation = settings.TryGetValue(ClientCertificateSetting, out string clientCert),
                    ClientCaCertificate         = new X509ConfigurationElement()
                    {
                        FindType      = System.Security.Cryptography.X509Certificates.X509FindType.FindByThumbprint,
                        FindValue     = clientCert,
                        StoreLocation = System.Security.Cryptography.X509Certificates.StoreLocation.LocalMachine,
                        StoreName     = System.Security.Cryptography.X509Certificates.StoreName.My
                    }
                });