app->bind(FindingGeneratorContract::class, PermissionPostureFindingGenerator::class); $this->app->bind( \App\Contracts\Hardening\WriteGateInterface::class, \App\Services\Hardening\IntuneRbacWriteGate::class, ); $this->app->singleton(GraphClientInterface::class, function ($app) { $config = $app['config']->get('graph'); if (! empty($config['enabled'])) { return $app->make(MicrosoftGraphClient::class); } return $app->make(NullGraphClient::class); }); $this->app->singleton(MicrosoftGraphOptionsResolver::class, function ($app): MicrosoftGraphOptionsResolver { return new MicrosoftGraphOptionsResolver( connections: $app->make(ProviderConnectionResolver::class), gateway: $app->make(ProviderGateway::class), ); }); $this->app->singleton(SnapshotTypeRendererRegistry::class, function ($app): SnapshotTypeRendererRegistry { return new SnapshotTypeRendererRegistry( renderers: [ $app->make(IntuneRoleDefinitionSnapshotTypeRenderer::class), $app->make(DeviceComplianceSnapshotTypeRenderer::class), ], fallbackRenderer: $app->make(FallbackSnapshotTypeRenderer::class), ); }); $this->app->singleton(ReferenceTypeLabelCatalog::class); $this->app->singleton(ReferenceStatePresenter::class); $this->app->singleton(ResolvedReferencePresenter::class); $this->app->singleton(FallbackReferenceResolver::class); $this->app->singleton(PolicyReferenceResolver::class); $this->app->singleton(PolicyVersionReferenceResolver::class); $this->app->singleton(BaselineProfileReferenceResolver::class); $this->app->singleton(BaselineSnapshotReferenceResolver::class); $this->app->singleton(OperationRunReferenceResolver::class); $this->app->singleton(BackupSetReferenceResolver::class); $this->app->singleton(EntraGroupReferenceResolver::class); $this->app->singleton(EntraRoleDefinitionReferenceResolver::class); $this->app->singleton(PrincipalReferenceResolver::class); $this->app->singleton(ReferenceResolverRegistry::class, function ($app): ReferenceResolverRegistry { /** @var array $resolvers */ $resolvers = [ $app->make(PolicyReferenceResolver::class), $app->make(PolicyVersionReferenceResolver::class), $app->make(BaselineProfileReferenceResolver::class), $app->make(BaselineSnapshotReferenceResolver::class), $app->make(OperationRunReferenceResolver::class), $app->make(BackupSetReferenceResolver::class), $app->make(EntraGroupReferenceResolver::class), $app->make(EntraRoleDefinitionReferenceResolver::class), $app->make(PrincipalReferenceResolver::class), ]; return new ReferenceResolverRegistry( resolvers: $resolvers, fallbackResolver: $app->make(FallbackReferenceResolver::class), ); }); $this->app->tag( [ AppProtectionPolicyNormalizer::class, CompliancePolicyNormalizer::class, DeviceConfigurationPolicyNormalizer::class, EnrollmentAutopilotPolicyNormalizer::class, GroupPolicyConfigurationNormalizer::class, IntuneRoleAssignmentNormalizer::class, IntuneRoleDefinitionNormalizer::class, ManagedDeviceAppConfigurationNormalizer::class, ScriptsPolicyNormalizer::class, SettingsCatalogPolicyNormalizer::class, TermsAndConditionsNormalizer::class, WindowsDriverUpdateProfileNormalizer::class, WindowsFeatureUpdateProfileNormalizer::class, WindowsQualityUpdateProfileNormalizer::class, WindowsUpdateRingNormalizer::class, ], 'policy-type-normalizers' ); } /** * Bootstrap any application services. */ public function boot(): void { RateLimiter::for('entra-callback', function (Request $request) { return Limit::perMinute(20)->by((string) $request->ip()); }); RestoreRun::observe(RestoreRunObserver::class); ProviderCredential::observe(ProviderCredentialObserver::class); Event::listen(TenantSet::class, function (TenantSet $event): void { static $hasPreferencesTable; $hasPreferencesTable ??= Schema::hasTable('user_tenant_preferences'); if (! $hasPreferencesTable) { return; } $tenant = $event->getTenant(); $user = $event->getUser(); if (! $tenant instanceof Tenant) { return; } if (! $user instanceof User) { return; } UserTenantPreference::query()->updateOrCreate( [ 'user_id' => $user->getKey(), 'tenant_id' => $tenant->getKey(), ], [ 'last_used_at' => now(), ], ); }); Gate::policy(BackupSchedule::class, BackupSchedulePolicy::class); Gate::policy(Finding::class, FindingPolicy::class); Gate::policy(EntraGroup::class, EntraGroupPolicy::class); Gate::policy(OperationRun::class, OperationRunPolicy::class); } }