using Bit.Api.Auth.Jobs; using Bit.Core.Jobs; using Bit.Core.Settings; using Quartz; namespace Bit.Api.Jobs; public class JobsHostedService : BaseJobsHostedService { public JobsHostedService( GlobalSettings globalSettings, IServiceProvider serviceProvider, ILogger logger, ILogger listenerLogger) : base(globalSettings, serviceProvider, logger, listenerLogger) { } public override async Task StartAsync(CancellationToken cancellationToken) { var everyTopOfTheHourTrigger = TriggerBuilder.Create() .WithIdentity("EveryTopOfTheHourTrigger") .StartNow() .WithCronSchedule("0 0 * * * ?") .Build(); var emergencyAccessNotificationTrigger = TriggerBuilder.Create() .WithIdentity("EmergencyAccessNotificationTrigger") .StartNow() .WithCronSchedule("0 0 * * * ?") .Build(); var emergencyAccessTimeoutTrigger = TriggerBuilder.Create() .WithIdentity("EmergencyAccessTimeoutTrigger") .StartNow() .WithCronSchedule("0 0 * * * ?") .Build(); var everyTopOfTheSixthHourTrigger = TriggerBuilder.Create() .WithIdentity("EveryTopOfTheSixthHourTrigger") .StartNow() .WithCronSchedule("0 0 */6 * * ?") .Build(); var everyTwelfthHourAndThirtyMinutesTrigger = TriggerBuilder.Create() .WithIdentity("EveryTwelfthHourAndThirtyMinutesTrigger") .StartNow() .WithCronSchedule("0 30 */12 * * ?") .Build(); var smTrashCleanupTrigger = TriggerBuilder.Create() .WithIdentity("SMTrashCleanupTrigger") .StartNow() .WithCronSchedule("0 0 22 * * ?") .Build(); var randomDailySponsorshipSyncTrigger = TriggerBuilder.Create() .WithIdentity("RandomDailySponsorshipSyncTrigger") .StartAt(DateBuilder.FutureDate(new Random().Next(24), IntervalUnit.Hour)) .WithSimpleSchedule(x => x .WithIntervalInHours(24) .RepeatForever()) .Build(); var validateOrganizationDomainTrigger = TriggerBuilder.Create() .WithIdentity("ValidateOrganizationDomainTrigger") .StartNow() .WithCronSchedule("0 0 * * * ?") .Build(); var updatePhishingDomainsTrigger = TriggerBuilder.Create() .WithIdentity("UpdatePhishingDomainsTrigger") .StartNow() .WithSimpleSchedule(x => x .WithIntervalInHours(24) .RepeatForever()) .Build(); var jobs = new List> { new Tuple(typeof(AliveJob), everyTopOfTheHourTrigger), new Tuple(typeof(EmergencyAccessNotificationJob), emergencyAccessNotificationTrigger), new Tuple(typeof(EmergencyAccessTimeoutJob), emergencyAccessTimeoutTrigger), new Tuple(typeof(ValidateUsersJob), everyTopOfTheSixthHourTrigger), new Tuple(typeof(ValidateOrganizationsJob), everyTwelfthHourAndThirtyMinutesTrigger), new Tuple(typeof(ValidateOrganizationDomainJob), validateOrganizationDomainTrigger), new Tuple(typeof(UpdatePhishingDomainsJob), updatePhishingDomainsTrigger), }; if (_globalSettings.SelfHosted && _globalSettings.EnableCloudCommunication) { jobs.Add(new Tuple(typeof(SelfHostedSponsorshipSyncJob), randomDailySponsorshipSyncTrigger)); } #if !OSS jobs.Add(new Tuple(typeof(EmptySecretsManagerTrashJob), smTrashCleanupTrigger)); #endif Jobs = jobs; await base.StartAsync(cancellationToken); } public static void AddJobsServices(IServiceCollection services, bool selfHosted) { if (selfHosted) { services.AddTransient(); } services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddTransient(); } public static void AddCommercialSecretsManagerJobServices(IServiceCollection services) { services.AddTransient(); } }