示例#1
0
        public static void AddCustomDataProtectionServices(
            this IServiceCollection services, IHostingEnvironment env, GlobalSettings globalSettings)
        {
            if (env.IsDevelopment())
            {
                return;
            }

            if (globalSettings.SelfHosted && CoreHelpers.SettingHasValue(globalSettings.DataProtection.Directory))
            {
                services.AddDataProtection()
                .PersistKeysToFileSystem(new DirectoryInfo(globalSettings.DataProtection.Directory));
            }

            if (!globalSettings.SelfHosted)
            {
                var dataProtectionCert = CoreHelpers.GetCertificate(globalSettings.DataProtection.CertificateThumbprint);
                var storageAccount     = CloudStorageAccount.Parse(globalSettings.Storage.ConnectionString);
                services.AddDataProtection()
                .PersistKeysToAzureBlobStorage(storageAccount, "aspnet-dataprotection/keys.xml")
                .ProtectKeysWithCertificate(dataProtectionCert);
            }
        }
示例#2
0
 public static IIdentityServerBuilder AddIdentityServerCertificate(
     this IIdentityServerBuilder identityServerBuilder, IWebHostEnvironment env, GlobalSettings globalSettings)
 {
     if (globalSettings.SelfHosted &&
         CoreHelpers.SettingHasValue(globalSettings.IdentityServer.CertificatePassword) &&
         File.Exists("identity.pfx"))
     {
         var identityServerCert = CoreHelpers.GetCertificate("identity.pfx",
                                                             globalSettings.IdentityServer.CertificatePassword);
         identityServerBuilder.AddSigningCredential(identityServerCert);
     }
     else if (CoreHelpers.SettingHasValue(globalSettings.IdentityServer.CertificateThumbprint))
     {
         var identityServerCert = CoreHelpers.GetCertificate(
             globalSettings.IdentityServer.CertificateThumbprint);
         identityServerBuilder.AddSigningCredential(identityServerCert);
     }
     else if (!globalSettings.SelfHosted &&
              CoreHelpers.SettingHasValue(globalSettings.Storage?.ConnectionString) &&
              CoreHelpers.SettingHasValue(globalSettings.IdentityServer.CertificatePassword))
     {
         var storageAccount     = CloudStorageAccount.Parse(globalSettings.Storage.ConnectionString);
         var identityServerCert = CoreHelpers.GetBlobCertificateAsync(storageAccount, "certificates",
                                                                      "identity.pfx", globalSettings.IdentityServer.CertificatePassword).GetAwaiter().GetResult();
         identityServerBuilder.AddSigningCredential(identityServerCert);
     }
     else if (env.IsDevelopment())
     {
         identityServerBuilder.AddDeveloperSigningCredential(false);
     }
     else
     {
         throw new Exception("No identity certificate to use.");
     }
     return(identityServerBuilder);
 }
        public static ILoggerFactory AddSerilog(
            this ILoggerFactory factory,
            IHostingEnvironment env,
            IApplicationLifetime appLifetime,
            GlobalSettings globalSettings,
            Func <LogEvent, bool> filter = null)
        {
            if (!env.IsDevelopment())
            {
                if (filter == null)
                {
                    filter = (e) => true;
                }

                var config = new LoggerConfiguration()
                             .Enrich.FromLogContext()
                             .Filter.ByIncludingOnly(filter);

                if (globalSettings.DocumentDb != null && CoreHelpers.SettingHasValue(globalSettings.DocumentDb.Uri) &&
                    CoreHelpers.SettingHasValue(globalSettings.DocumentDb.Key))
                {
                    config.WriteTo.AzureDocumentDB(new Uri(globalSettings.DocumentDb.Uri), globalSettings.DocumentDb.Key,
                                                   timeToLive: TimeSpan.FromDays(7));
                }
                else if (CoreHelpers.SettingHasValue(globalSettings.LogDirectory))
                {
                    config.WriteTo.RollingFile($"{globalSettings.LogDirectory}/{globalSettings.ProjectName}/{{Date}}.txt");
                }

                var serilog = config.CreateLogger();
                factory.AddSerilog(serilog);
                appLifetime.ApplicationStopped.Register(Log.CloseAndFlush);
            }

            return(factory);
        }
        public static void AddDefaultServices(this IServiceCollection services, GlobalSettings globalSettings)
        {
            services.AddSingleton <IMailService, BackupMailService>();
            services.AddSingleton <ILicensingService, LicensingService>();

            if (CoreHelpers.SettingHasValue(globalSettings.Mail.SendGridApiKey))
            {
                services.AddSingleton <IMailDeliveryService, SendGridMailDeliveryService>();
            }
            else if (CoreHelpers.SettingHasValue(globalSettings.Mail?.Smtp?.Host))
            {
                services.AddSingleton <IMailDeliveryService, SmtpMailDeliveryService>();
            }
            else
            {
                services.AddSingleton <IMailDeliveryService, NoopMailDeliveryService>();
            }

            if (globalSettings.SelfHosted &&
                CoreHelpers.SettingHasValue(globalSettings.PushRelayBaseUri) &&
                globalSettings.Installation?.Id != null &&
                CoreHelpers.SettingHasValue(globalSettings.Installation?.Key))
            {
                services.AddSingleton <IPushNotificationService, RelayPushNotificationService>();
                services.AddSingleton <IPushRegistrationService, RelayPushRegistrationService>();
            }
#if NET47
            else if (!globalSettings.SelfHosted)
            {
                services.AddSingleton <IPushNotificationService, NotificationHubPushNotificationService>();
                services.AddSingleton <IPushRegistrationService, NotificationHubPushRegistrationService>();
            }
#endif
            else
            {
                services.AddSingleton <IPushNotificationService, NoopPushNotificationService>();
                services.AddSingleton <IPushRegistrationService, NoopPushRegistrationService>();
            }

            if (!globalSettings.SelfHosted && CoreHelpers.SettingHasValue(globalSettings.Storage.ConnectionString))
            {
                services.AddSingleton <IBlockIpService, AzureQueueBlockIpService>();
            }
            else
            {
                services.AddSingleton <IBlockIpService, NoopBlockIpService>();
            }

            if (CoreHelpers.SettingHasValue(globalSettings.Attachment.ConnectionString))
            {
                services.AddSingleton <IAttachmentStorageService, AzureAttachmentStorageService>();
            }
            else if (CoreHelpers.SettingHasValue(globalSettings.Attachment.BaseDirectory))
            {
                services.AddSingleton <IAttachmentStorageService, LocalAttachmentStorageService>();
            }
            else
            {
                services.AddSingleton <IAttachmentStorageService, NoopAttachmentStorageService>();
            }
        }
示例#5
0
        public static void AddDefaultServices(this IServiceCollection services, GlobalSettings globalSettings)
        {
            services.AddSingleton <IPaymentService, StripePaymentService>();
            services.AddSingleton <IMailService, HandlebarsMailService>();
            services.AddSingleton <ILicensingService, LicensingService>();

            if (CoreHelpers.SettingHasValue(globalSettings.ServiceBus.ConnectionString) &&
                CoreHelpers.SettingHasValue(globalSettings.ServiceBus.ApplicationCacheTopicName))
            {
                services.AddSingleton <IApplicationCacheService, InMemoryServiceBusApplicationCacheService>();
            }
            else
            {
                services.AddSingleton <IApplicationCacheService, InMemoryApplicationCacheService>();
            }

            if (CoreHelpers.SettingHasValue(globalSettings.Mail.SendGridApiKey))
            {
                services.AddSingleton <IMailDeliveryService, SendGridMailDeliveryService>();
            }
            else if (CoreHelpers.SettingHasValue(globalSettings.Amazon?.AccessKeySecret))
            {
                services.AddSingleton <IMailDeliveryService, AmazonSesMailDeliveryService>();
            }
            else if (CoreHelpers.SettingHasValue(globalSettings.Mail?.Smtp?.Host))
            {
                services.AddSingleton <IMailDeliveryService, MailKitSmtpMailDeliveryService>();
            }
            else
            {
                services.AddSingleton <IMailDeliveryService, NoopMailDeliveryService>();
            }

            services.AddSingleton <IPushNotificationService, MultiServicePushNotificationService>();
            if (globalSettings.SelfHosted &&
                CoreHelpers.SettingHasValue(globalSettings.PushRelayBaseUri) &&
                globalSettings.Installation?.Id != null &&
                CoreHelpers.SettingHasValue(globalSettings.Installation?.Key))
            {
                services.AddSingleton <IPushRegistrationService, RelayPushRegistrationService>();
            }
            else if (!globalSettings.SelfHosted)
            {
                services.AddSingleton <IPushRegistrationService, NotificationHubPushRegistrationService>();
            }
            else
            {
                services.AddSingleton <IPushRegistrationService, NoopPushRegistrationService>();
            }

            if (!globalSettings.SelfHosted && CoreHelpers.SettingHasValue(globalSettings.Storage?.ConnectionString))
            {
                services.AddSingleton <IBlockIpService, AzureQueueBlockIpService>();
            }
            else if (!globalSettings.SelfHosted && CoreHelpers.SettingHasValue(globalSettings.Amazon?.AccessKeySecret))
            {
                services.AddSingleton <IBlockIpService, AmazonSqsBlockIpService>();
            }
            else
            {
                services.AddSingleton <IBlockIpService, NoopBlockIpService>();
            }

            if (!globalSettings.SelfHosted && CoreHelpers.SettingHasValue(globalSettings.Events.ConnectionString))
            {
                services.AddSingleton <IEventWriteService, AzureQueueEventWriteService>();
            }
            else if (globalSettings.SelfHosted)
            {
                services.AddSingleton <IEventWriteService, RepositoryEventWriteService>();
            }
            else
            {
                services.AddSingleton <IEventWriteService, NoopEventWriteService>();
            }

            if (CoreHelpers.SettingHasValue(globalSettings.Attachment.ConnectionString))
            {
                services.AddSingleton <IAttachmentStorageService, AzureAttachmentStorageService>();
            }
            else if (CoreHelpers.SettingHasValue(globalSettings.Attachment.BaseDirectory))
            {
                services.AddSingleton <IAttachmentStorageService, LocalAttachmentStorageService>();
            }
            else
            {
                services.AddSingleton <IAttachmentStorageService, NoopAttachmentStorageService>();
            }
        }
        public static ILoggingBuilder AddSerilog(
            this ILoggingBuilder builder,
            WebHostBuilderContext context,
            Func <LogEvent, bool> filter = null)
        {
            if (context.HostingEnvironment.IsDevelopment())
            {
                return(builder);
            }

            bool inclusionPredicate(LogEvent e)
            {
                if (filter == null)
                {
                    return(true);
                }
                var eventId = e.Properties.ContainsKey("EventId") ? e.Properties["EventId"].ToString() : null;

                if (eventId?.Contains(Constants.BypassFiltersEventId.ToString()) ?? false)
                {
                    return(true);
                }
                return(filter(e));
            }

            var globalSettings = new GlobalSettings();

            ConfigurationBinder.Bind(context.Configuration.GetSection("GlobalSettings"), globalSettings);

            var config = new LoggerConfiguration()
                         .Enrich.FromLogContext()
                         .Filter.ByIncludingOnly(inclusionPredicate);

            if (CoreHelpers.SettingHasValue(globalSettings?.DocumentDb.Uri) &&
                CoreHelpers.SettingHasValue(globalSettings?.DocumentDb.Key))
            {
                config.WriteTo.AzureDocumentDB(new Uri(globalSettings.DocumentDb.Uri),
                                               globalSettings.DocumentDb.Key, timeToLive: TimeSpan.FromDays(7))
                .Enrich.FromLogContext()
                .Enrich.WithProperty("Project", globalSettings.ProjectName);
            }
            else if (CoreHelpers.SettingHasValue(globalSettings?.Sentry.Dsn))
            {
                config.WriteTo.Sentry(globalSettings.Sentry.Dsn)
                .Enrich.FromLogContext()
                .Enrich.WithProperty("Project", globalSettings.ProjectName)
                .Destructure.With <HttpContextDestructingPolicy>()
                .Filter.ByExcluding(e => e.Exception?.CheckIfCaptured() == true);
            }
            else if (CoreHelpers.SettingHasValue(globalSettings.LogDirectory))
            {
                config.WriteTo.RollingFile($"{globalSettings.LogDirectory}/{globalSettings.ProjectName}/{{Date}}.txt")
                .Enrich.FromLogContext()
                .Enrich.WithProperty("Project", globalSettings.ProjectName);
            }

            var serilog = config.CreateLogger();

            builder.AddSerilog(serilog);

            return(builder);
        }
示例#7
0
        public static void AddSqlServerRepositories(this IServiceCollection services, GlobalSettings globalSettings)
        {
            var usePostgreSql = CoreHelpers.SettingHasValue(globalSettings.PostgreSql?.ConnectionString);
            var useEf         = usePostgreSql;

            if (useEf)
            {
                services.AddAutoMapper(typeof(EntityFrameworkRepos.UserRepository));
                services.AddDbContext <EntityFrameworkRepos.DatabaseContext>(options =>
                {
                    if (usePostgreSql)
                    {
                        options.UseNpgsql(globalSettings.PostgreSql.ConnectionString);
                    }
                });
                services.AddSingleton <IUserRepository, EntityFrameworkRepos.UserRepository>();
                //services.AddSingleton<ICipherRepository, EntityFrameworkRepos.CipherRepository>();
                //services.AddSingleton<IOrganizationRepository, EntityFrameworkRepos.OrganizationRepository>();
            }
            else
            {
                services.AddSingleton <IUserRepository, SqlServerRepos.UserRepository>();
                services.AddSingleton <ICipherRepository, SqlServerRepos.CipherRepository>();
                services.AddSingleton <IDeviceRepository, SqlServerRepos.DeviceRepository>();
                services.AddSingleton <IGrantRepository, SqlServerRepos.GrantRepository>();
                services.AddSingleton <IOrganizationRepository, SqlServerRepos.OrganizationRepository>();
                services.AddSingleton <IOrganizationUserRepository, SqlServerRepos.OrganizationUserRepository>();
                services.AddSingleton <ICollectionRepository, SqlServerRepos.CollectionRepository>();
                services.AddSingleton <IFolderRepository, SqlServerRepos.FolderRepository>();
                services.AddSingleton <ICollectionCipherRepository, SqlServerRepos.CollectionCipherRepository>();
                services.AddSingleton <IGroupRepository, SqlServerRepos.GroupRepository>();
                services.AddSingleton <IU2fRepository, SqlServerRepos.U2fRepository>();
                services.AddSingleton <IInstallationRepository, SqlServerRepos.InstallationRepository>();
                services.AddSingleton <IMaintenanceRepository, SqlServerRepos.MaintenanceRepository>();
                services.AddSingleton <ITransactionRepository, SqlServerRepos.TransactionRepository>();
                services.AddSingleton <IPolicyRepository, SqlServerRepos.PolicyRepository>();
                services.AddSingleton <ISsoConfigRepository, SqlServerRepos.SsoConfigRepository>();
                services.AddSingleton <ISsoUserRepository, SqlServerRepos.SsoUserRepository>();
                services.AddSingleton <ISendRepository, SqlServerRepos.SendRepository>();
            }

            if (globalSettings.SelfHosted)
            {
                if (useEf)
                {
                    // TODO
                }
                else
                {
                    services.AddSingleton <IEventRepository, SqlServerRepos.EventRepository>();
                }
                services.AddSingleton <IInstallationDeviceRepository, NoopRepos.InstallationDeviceRepository>();
                services.AddSingleton <IMetaDataRepository, NoopRepos.MetaDataRepository>();
            }
            else
            {
                services.AddSingleton <IEventRepository, TableStorageRepos.EventRepository>();
                services.AddSingleton <IInstallationDeviceRepository, TableStorageRepos.InstallationDeviceRepository>();
                services.AddSingleton <IMetaDataRepository, TableStorageRepos.MetaDataRepository>();
            }
        }
        public static void AddDefaultServices(this IServiceCollection services, GlobalSettings globalSettings)
        {
            // Required for UserService
            services.AddWebAuthn(globalSettings);

            services.AddSingleton <IPaymentService, StripePaymentService>();
            services.AddSingleton <IMailService, HandlebarsMailService>();
            services.AddSingleton <ILicensingService, LicensingService>();

            if (CoreHelpers.SettingHasValue(globalSettings.ServiceBus.ConnectionString) &&
                CoreHelpers.SettingHasValue(globalSettings.ServiceBus.ApplicationCacheTopicName))
            {
                services.AddSingleton <IApplicationCacheService, InMemoryServiceBusApplicationCacheService>();
            }
            else
            {
                services.AddSingleton <IApplicationCacheService, InMemoryApplicationCacheService>();
            }

            var awsConfigured = CoreHelpers.SettingHasValue(globalSettings.Amazon?.AccessKeySecret);

            if (!globalSettings.SelfHosted && awsConfigured &&
                CoreHelpers.SettingHasValue(globalSettings.Mail?.PostalApiKey))
            {
                services.AddSingleton <IMailDeliveryService, MultiServiceMailDeliveryService>();
            }
            else if (awsConfigured)
            {
                services.AddSingleton <IMailDeliveryService, AmazonSesMailDeliveryService>();
            }
            else if (CoreHelpers.SettingHasValue(globalSettings.Mail?.Smtp?.Host))
            {
                services.AddSingleton <IMailDeliveryService, MailKitSmtpMailDeliveryService>();
            }
            else
            {
                services.AddSingleton <IMailDeliveryService, NoopMailDeliveryService>();
            }

            services.AddSingleton <IPushNotificationService, MultiServicePushNotificationService>();
            if (globalSettings.SelfHosted &&
                CoreHelpers.SettingHasValue(globalSettings.PushRelayBaseUri) &&
                globalSettings.Installation?.Id != null &&
                CoreHelpers.SettingHasValue(globalSettings.Installation?.Key))
            {
                services.AddSingleton <IPushRegistrationService, RelayPushRegistrationService>();
            }
            else if (!globalSettings.SelfHosted)
            {
                services.AddSingleton <IPushRegistrationService, NotificationHubPushRegistrationService>();
            }
            else
            {
                services.AddSingleton <IPushRegistrationService, NoopPushRegistrationService>();
            }

            if (!globalSettings.SelfHosted && CoreHelpers.SettingHasValue(globalSettings.Storage?.ConnectionString))
            {
                services.AddSingleton <IBlockIpService, AzureQueueBlockIpService>();
            }
            else if (!globalSettings.SelfHosted && CoreHelpers.SettingHasValue(globalSettings.Amazon?.AccessKeySecret))
            {
                services.AddSingleton <IBlockIpService, AmazonSqsBlockIpService>();
            }
            else
            {
                services.AddSingleton <IBlockIpService, NoopBlockIpService>();
            }

            if (!globalSettings.SelfHosted && CoreHelpers.SettingHasValue(globalSettings.Mail.ConnectionString))
            {
                services.AddSingleton <IMailEnqueuingService, AzureQueueMailService>();
            }
            else
            {
                services.AddSingleton <IMailEnqueuingService, BlockingMailEnqueuingService>();
            }

            if (!globalSettings.SelfHosted && CoreHelpers.SettingHasValue(globalSettings.Events.ConnectionString))
            {
                services.AddSingleton <IEventWriteService, AzureQueueEventWriteService>();
            }
            else if (globalSettings.SelfHosted)
            {
                services.AddSingleton <IEventWriteService, RepositoryEventWriteService>();
            }
            else
            {
                services.AddSingleton <IEventWriteService, NoopEventWriteService>();
            }

            if (CoreHelpers.SettingHasValue(globalSettings.Attachment.ConnectionString))
            {
                services.AddSingleton <IAttachmentStorageService, AzureAttachmentStorageService>();
            }
            else if (CoreHelpers.SettingHasValue(globalSettings.Attachment.BaseDirectory))
            {
                services.AddSingleton <IAttachmentStorageService, LocalAttachmentStorageService>();
            }
            else
            {
                services.AddSingleton <IAttachmentStorageService, NoopAttachmentStorageService>();
            }

            if (CoreHelpers.SettingHasValue(globalSettings.Send.ConnectionString))
            {
                services.AddSingleton <ISendFileStorageService, AzureSendFileStorageService>();
            }
            else if (CoreHelpers.SettingHasValue(globalSettings.Send.BaseDirectory))
            {
                services.AddSingleton <ISendFileStorageService, LocalSendStorageService>();
            }
            else
            {
                services.AddSingleton <ISendFileStorageService, NoopSendFileStorageService>();
            }

            if (globalSettings.SelfHosted)
            {
                services.AddSingleton <IReferenceEventService, NoopReferenceEventService>();
            }
            else
            {
                services.AddSingleton <IReferenceEventService, AzureQueueReferenceEventService>();
            }

            if (!globalSettings.SelfHosted && CoreHelpers.SettingHasValue(globalSettings.Captcha?.HCaptchaSecretKey) &&
                CoreHelpers.SettingHasValue(globalSettings.Captcha?.HCaptchaSiteKey))
            {
                services.AddSingleton <ICaptchaValidationService, HCaptchaValidationService>();
            }
            else
            {
                services.AddSingleton <ICaptchaValidationService, NoopCaptchaValidationService>();
            }
        }
示例#9
0
        public static ILoggingBuilder AddSerilog(
            this ILoggingBuilder builder,
            WebHostBuilderContext context,
            Func <LogEvent, bool> filter = null)
        {
            if (context.HostingEnvironment.IsDevelopment())
            {
                return(builder);
            }

            bool inclusionPredicate(LogEvent e)
            {
                if (filter == null)
                {
                    return(true);
                }
                var eventId = e.Properties.ContainsKey("EventId") ? e.Properties["EventId"].ToString() : null;

                if (eventId?.Contains(Constants.BypassFiltersEventId.ToString()) ?? false)
                {
                    return(true);
                }
                return(filter(e));
            }

            var globalSettings = new GlobalSettings();

            ConfigurationBinder.Bind(context.Configuration.GetSection("GlobalSettings"), globalSettings);

            var config = new LoggerConfiguration()
                         .Enrich.FromLogContext()
                         .Filter.ByIncludingOnly(inclusionPredicate);

            if (CoreHelpers.SettingHasValue(globalSettings?.DocumentDb.Uri) &&
                CoreHelpers.SettingHasValue(globalSettings?.DocumentDb.Key))
            {
                config.WriteTo.AzureDocumentDB(new Uri(globalSettings.DocumentDb.Uri),
                                               globalSettings.DocumentDb.Key, timeToLive: TimeSpan.FromDays(7))
                .Enrich.FromLogContext()
                .Enrich.WithProperty("Project", globalSettings.ProjectName);
            }
            else if (CoreHelpers.SettingHasValue(globalSettings?.Sentry.Dsn))
            {
                config.WriteTo.Sentry(globalSettings.Sentry.Dsn)
                .Enrich.FromLogContext()
                .Enrich.WithProperty("Project", globalSettings.ProjectName);
            }
            else if (CoreHelpers.SettingHasValue(globalSettings?.Syslog.Destination))
            {
                // appending sitename to project name to allow eaiser identification in syslog.
                var appName = $"{globalSettings.SiteName}-{globalSettings.ProjectName}";
                if (globalSettings.Syslog.Destination.Equals("local", StringComparison.OrdinalIgnoreCase))
                {
                    config.WriteTo.LocalSyslog(appName);
                }
                else if (Uri.TryCreate(globalSettings.Syslog.Destination, UriKind.Absolute, out var syslogAddress))
                {
                    // Syslog's standard port is 514 (both UDP and TCP). TLS does not have a standard port, so assume 514.
                    int port = syslogAddress.Port >= 0
                        ? syslogAddress.Port
                        : 514;

                    if (syslogAddress.Scheme.Equals("udp"))
                    {
                        config.WriteTo.UdpSyslog(syslogAddress.Host, port, appName);
                    }
                    else if (syslogAddress.Scheme.Equals("tcp"))
                    {
                        config.WriteTo.TcpSyslog(syslogAddress.Host, port, appName);
                    }
                    else if (syslogAddress.Scheme.Equals("tls"))
                    {
                        // TLS v1.1, v1.2 and v1.3 are explicitly selected (leaving out TLS v1.0)
                        const SslProtocols protocols = SslProtocols.Tls11 | SslProtocols.Tls12 | SslProtocols.Tls13;

                        if (CoreHelpers.SettingHasValue(globalSettings.Syslog.CertificateThumbprint))
                        {
                            config.WriteTo.TcpSyslog(syslogAddress.Host, port, appName,
                                                     secureProtocols: protocols,
                                                     certProvider: new CertificateStoreProvider(StoreName.My, StoreLocation.CurrentUser,
                                                                                                globalSettings.Syslog.CertificateThumbprint));
                        }
                        else
                        {
                            config.WriteTo.TcpSyslog(syslogAddress.Host, port, appName,
                                                     secureProtocols: protocols,
                                                     certProvider: new CertificateFileProvider(globalSettings.Syslog.CertificatePath,
                                                                                               globalSettings.Syslog?.CertificatePassword ?? string.Empty));
                        }
                    }
                }
            }
            else if (CoreHelpers.SettingHasValue(globalSettings.LogDirectory))
            {
                if (globalSettings.LogRollBySizeLimit.HasValue)
                {
                    config.WriteTo.File($"{globalSettings.LogDirectory}/{globalSettings.ProjectName}/log.txt",
                                        rollOnFileSizeLimit: true, fileSizeLimitBytes: globalSettings.LogRollBySizeLimit);
                }
                else
                {
                    config.WriteTo
                    .RollingFile($"{globalSettings.LogDirectory}/{globalSettings.ProjectName}/{{Date}}.txt");
                }
                config
                .Enrich.FromLogContext()
                .Enrich.WithProperty("Project", globalSettings.ProjectName);
            }

            var serilog = config.CreateLogger();

            builder.AddSerilog(serilog);

            return(builder);
        }
        public static ILoggerFactory AddSerilog(
            this ILoggerFactory factory,
            IApplicationBuilder appBuilder,
            IHostingEnvironment env,
            IApplicationLifetime appLifetime,
            GlobalSettings globalSettings,
            Func <LogEvent, bool> filter = null)
        {
            if (env.IsDevelopment())
            {
                return(factory);
            }

            bool inclusionPredicate(LogEvent e)
            {
                if (filter == null)
                {
                    return(true);
                }
                var eventId = e.Properties.ContainsKey("EventId") ? e.Properties["EventId"].ToString() : null;

                if (eventId?.Contains(Constants.BypassFiltersEventId.ToString()) ?? false)
                {
                    return(true);
                }
                return(filter(e));
            }

            var config = new LoggerConfiguration()
                         .Enrich.FromLogContext()
                         .Filter.ByIncludingOnly(inclusionPredicate);

            if (CoreHelpers.SettingHasValue(globalSettings?.DocumentDb.Uri) &&
                CoreHelpers.SettingHasValue(globalSettings?.DocumentDb.Key))
            {
                config.WriteTo.AzureDocumentDB(new Uri(globalSettings.DocumentDb.Uri),
                                               globalSettings.DocumentDb.Key, timeToLive: TimeSpan.FromDays(7))
                .Enrich.FromLogContext()
                .Enrich.WithProperty("Project", globalSettings.ProjectName);
            }
            else if (CoreHelpers.SettingHasValue(globalSettings?.Sentry.Dsn))
            {
                config.WriteTo.Sentry(globalSettings.Sentry.Dsn)
                .Enrich.FromLogContext()
                .Enrich.WithProperty("Project", globalSettings.ProjectName)
                .Destructure.With <HttpContextDestructingPolicy>()
                .Filter.ByExcluding(e => e.Exception?.CheckIfCaptured() == true);

                appBuilder.AddSentryContext();
            }
            else if (CoreHelpers.SettingHasValue(globalSettings.LogDirectory))
            {
                config.WriteTo.RollingFile($"{globalSettings.LogDirectory}/{globalSettings.ProjectName}/{{Date}}.txt")
                .Enrich.FromLogContext()
                .Enrich.WithProperty("Project", globalSettings.ProjectName);
            }

            var serilog = config.CreateLogger();

            factory.AddSerilog(serilog);
            appLifetime.ApplicationStopped.Register(Log.CloseAndFlush);

            return(factory);
        }