public TenantDataProviderImpl(IServiceProvider serviceProvider, ILogger <TenantDataProviderImpl> logger)
        {
            var scopeFactory = serviceProvider.GetRequiredService <IServiceScopeFactory>();

            var configuration = serviceProvider.GetRequiredService <IConfiguration>();

            int    httpHealthCheckPort     = configuration.GetValue <int>("WebServer:HttpHealthCheckPort");
            string tenantHealthCheckTenant = configuration["Identity:Tenants:HealthCheckTenant"];

            if (httpHealthCheckPort > 0 &&
                !string.IsNullOrEmpty(tenantHealthCheckTenant))
            {
                HealthCheckPort       = httpHealthCheckPort;
                HealthCheckTenantHost = tenantHealthCheckTenant;
            }

            var standardSamlCertificate = ReadStandardSamlCertificate(configuration);

            using (var scope = scopeFactory.CreateScope())
            {
                using (var dbContext = scope.ServiceProvider.GetRequiredService <SqlServerTenantDbContext>())
                {
                    IQueryable <DeveloperModel> query = dbContext.Developers;

                    query = query.Include(developerModel => developerModel.Tenants);

                    List <DeveloperModel> developers = query.ToList();

                    _developerMappings       = new Dictionary <string, DeveloperWrapper>();
                    _developerMappingsByUuid = new Dictionary <long, DeveloperWrapper>();

                    Developers = new List <IDeveloperInfo>();
                    Tenants    = new List <ITenantInfo>();

                    developers.ForEach(developer =>
                    {
                        var developerWrapper = new DeveloperWrapper(developer, standardSamlCertificate);

                        _developerMappings.Add(developer.HostPattern, developerWrapper);
                        _developerMappingsByUuid.Add(developer.Uuid, developerWrapper);

                        Tenants.AddRange(developerWrapper.TenantInfos);

                        X509Certificate2 developerCertificate = null;

                        if (!string.IsNullOrEmpty(developer.Certificate))
                        {
                            if (string.IsNullOrEmpty(developer.CertificatePassword))
                            {
                                throw new Exception("Developer in tenant database has certificate set, but no certificate password is present");
                            }

                            developerCertificate = new X509Certificate2(GetCertificateBytesFromPEM(developer.Certificate), developer.CertificatePassword);
                        }

                        if (string.IsNullOrEmpty(developer.Authority))
                        {
                            throw new Exception("The developer authority is empty");
                        }

                        if (string.IsNullOrEmpty(developer.Audience))
                        {
                            throw new Exception("The developer audience is empty");
                        }

                        if (string.IsNullOrEmpty(developer.AuthCookieDomain))
                        {
                            throw new Exception("The developer auth cookie domain is empty");
                        }

                        if (string.IsNullOrEmpty(developer.Name))
                        {
                            throw new Exception("The developer name is empty");
                        }

                        if (string.IsNullOrEmpty(developer.LogoSvgUrl))
                        {
                            throw new Exception("The developer logo SVG URL is empty");
                        }

                        if (string.IsNullOrEmpty(developer.LogoPngUrl))
                        {
                            throw new Exception("The developer logo PNG URL is empty");
                        }

                        if (string.IsNullOrEmpty(developer.IconIcoUrl))
                        {
                            throw new Exception("The developer icon ICO URL is empty");
                        }

                        // storage is optional

                        string storageImplementation = developer.StorageImplementation;
                        if (!string.IsNullOrEmpty(storageImplementation))
                        {
                            if (!storageImplementation.Equals(StorageConstants.StorageImplementationAzure) && !storageImplementation.Equals(StorageConstants.StorageImplementationGoogleCloud))
                            {
                                throw new Exception("The developer storage implementation specification is invalid");
                            }

                            if (string.IsNullOrEmpty(developer.StorageConnectionString))
                            {
                                throw new Exception("The developer storage connection string is empty");
                            }
                        }

                        if (string.IsNullOrEmpty(developer.SupportEmail))
                        {
                            throw new Exception("The developer support email is empty");
                        }

                        if (string.IsNullOrEmpty(developer.NoreplyEmail))
                        {
                            throw new Exception("The developer noreply email is empty");
                        }

                        if (string.IsNullOrEmpty(developer.ProductName))
                        {
                            throw new Exception("The developer product name is empty");
                        }

                        var developerInfo = new DeveloperInfoImpl()
                        {
                            DeveloperUuid           = developer.Uuid,
                            Authority               = developer.Authority,
                            Audience                = developer.Audience,
                            Certificate             = developerCertificate,
                            AuthCookieDomain        = developer.AuthCookieDomain,
                            Name                    = developer.Name,
                            LogoSvgUrl              = developer.LogoSvgUrl,
                            LogoPngUrl              = developer.LogoPngUrl,
                            IconIcoUrl              = developer.IconIcoUrl,
                            StorageImplementation   = developer.StorageImplementation,
                            StorageConnectionString = developer.StorageConnectionString,
                            PrimaryColor            = developer.PrimaryColor,
                            SecondaryColor          = developer.SecondaryColor,
                            TextOnPrimaryColor      = developer.TextOnPrimaryColor,
                            TextOnSecondaryColor    = developer.TextOnSecondaryColor,
                            SupportEmail            = developer.SupportEmail,
                            NoreplyEmail            = developer.NoreplyEmail,
                            ProductName             = developer.ProductName
                        };

                        Developers.Add(developerInfo);
                    });
                }
            }

            _logger = logger;
        }
Beispiel #2
0
        public TenantDataProviderImpl(IServiceProvider serviceProvider, ILogger <TenantDataProviderImpl> logger)
        {
            var scopeFactory = serviceProvider.GetRequiredService <IServiceScopeFactory>();

            using (var scope = scopeFactory.CreateScope())
            {
                using (var dbContext = scope.ServiceProvider.GetRequiredService <SqlServerTenantDbContext>())
                {
                    IQueryable <DeveloperModel> query = dbContext.Developers;

                    query = query.Include(developerModel => developerModel.Tenants);

                    List <DeveloperModel> developers = query.ToList();

                    _developerMappings       = new Dictionary <string, DeveloperWrapper>();
                    _developerMappingsByUuid = new Dictionary <long, DeveloperWrapper>();

                    Developers = new List <IDeveloperInfo>();
                    Tenants    = new List <ITenantInfo>();

                    developers.ForEach(developer =>
                    {
                        var developerWrapper = new DeveloperWrapper(developer);

                        _developerMappings.Add(developer.HostPattern, developerWrapper);
                        _developerMappingsByUuid.Add(developer.Uuid, developerWrapper);

                        Tenants.AddRange(developerWrapper.TenantInfos);

                        if (string.IsNullOrEmpty(developer.Authority))
                        {
                            throw new Exception("The developer authority is empty");
                        }

                        if (string.IsNullOrEmpty(developer.Audience))
                        {
                            throw new Exception("The developer audience is empty");
                        }

                        if (string.IsNullOrEmpty(developer.AuthCookieDomain))
                        {
                            throw new Exception("The developer auth cookie domain is empty");
                        }

                        if (string.IsNullOrEmpty(developer.Name))
                        {
                            throw new Exception("The developer name is empty");
                        }

                        if (string.IsNullOrEmpty(developer.LogoSvgUrl))
                        {
                            throw new Exception("The developer logo SVG URL is empty");
                        }

                        if (string.IsNullOrEmpty(developer.LogoPngUrl))
                        {
                            throw new Exception("The developer logo PNG URL is empty");
                        }

                        if (string.IsNullOrEmpty(developer.IconIcoUrl))
                        {
                            throw new Exception("The developer icon ICO URL is empty");
                        }

                        // storage is optional

                        string storageImplementation = developer.StorageImplementation;
                        if (!string.IsNullOrEmpty(storageImplementation))
                        {
                            if (!storageImplementation.Equals(StorageConstants.StorageImplementationAzure) && !storageImplementation.Equals(StorageConstants.StorageImplementationGoogleCloud))
                            {
                                throw new Exception("The developer storage implementation specification is invalid");
                            }

                            if (string.IsNullOrEmpty(developer.StorageConnectionString))
                            {
                                throw new Exception("The developer storage connection string is empty");
                            }
                        }

                        if (string.IsNullOrEmpty(developer.SupportEmail))
                        {
                            throw new Exception("The developer support email is empty");
                        }

                        if (string.IsNullOrEmpty(developer.NoreplyEmail))
                        {
                            throw new Exception("The developer noreply email is empty");
                        }

                        if (string.IsNullOrEmpty(developer.ProductName))
                        {
                            throw new Exception("The developer product name is empty");
                        }

                        var developerInfo = new DeveloperInfoImpl()
                        {
                            DeveloperUuid       = developer.Uuid,
                            Authority           = developer.Authority,
                            Audience            = developer.Audience,
                            Certificate         = developer.Certificate,
                            CertificatePassword = developer.CertificatePassword,
                            AuthCookieDomain    = developer.AuthCookieDomain,
                            Name                    = developer.Name,
                            LogoSvgUrl              = developer.LogoSvgUrl,
                            LogoPngUrl              = developer.LogoPngUrl,
                            IconIcoUrl              = developer.IconIcoUrl,
                            StorageImplementation   = developer.StorageImplementation,
                            StorageConnectionString = developer.StorageConnectionString,
                            PrimaryColor            = developer.PrimaryColor,
                            SecondaryColor          = developer.SecondaryColor,
                            TextOnPrimaryColor      = developer.TextOnPrimaryColor,
                            TextOnSecondaryColor    = developer.TextOnSecondaryColor,
                            SupportEmail            = developer.SupportEmail,
                            NoreplyEmail            = developer.NoreplyEmail,
                            ProductName             = developer.ProductName
                        };

                        Developers.Add(developerInfo);
                    });
                }
            }

            _logger = logger;
        }