Add audit events for Pages Domains lifecycle

What does this MR do and why?

Add audit events for Pages Domains lifecycle to allow group, project, or instance administrators to have an audit trail for domain management. This is especially important for .com as verified domains are used for Enterprise users.

References

Screenshots or screen recordings

Before After
image.png

How to set up and validate locally

  1. Simulate SaaS GITLAB_SIMULATE_SAAS=1
  2. Enable pages with custom domains
  3. Enable the Let’s Encrypt integration
  4. Ensure the group has a subscription
  5. Run the following snippet to simulate all events and emit audit events in a project
    • Click to expand
        user = User.first
        group = Group.first
        
        # Create a project
        attrs = { path: 'domain-verification', namespace_id: group.id }
        project = ::Projects::CreateService.new(user, attrs).execute
        
        # Stub the TXT lookup instead of hitting real DNS
        def verify(domain, user, dns:)
          svc = VerifyPagesDomainService.new(domain, user)
          svc.define_singleton_method(:dns_record_present?) { dns }
          svc.execute
        end
        
        def create(project, user, host)
          Pages::Domains::CreateService.new(project, user, domain: host).execute
        end
        
        # pages_domain_created
        domain = create(project, user, 'example.com')
        
        # pages_domain_updated  (empty params is a valid no-op update that still persists)
        Pages::Domains::UpdateService.new(project, user, {}).execute(domain)
        
        # pages_domain_deleted
        Pages::Domains::DeleteService.new(project, user, nil).execute(domain)
        
        # pages_domain_enabled
        to_enable = create(project, user, 'enabled.example.com')
        verify(to_enable, user, dns: true)
        
        # pages_domain_verification_succeeded: already enabled, but unverified
        to_reverify = create(project, user, 'succeeded.example.com')
        to_reverify.update_columns(verified_at: nil, enabled_until: 1.week.from_now)
        verify(to_reverify, user, dns: true)
        
        # pages_domain_verification_failed: verified, still in grace period, stops resolving
        verified = create(project, user, 'verified.example.com')
        verified.update_columns(verified_at: Time.current, enabled_until: 1.week.from_now)
        verify(verified, user, dns: false)
        
        # pages_domain_disabled: expired domain that no longer resolves
        expired = create(project, user, 'expired.example.com')
        expired.update_columns(verified_at: 1.week.ago, enabled_until: 1.day.ago)
        verify(expired, user, dns: false)

MR acceptance checklist

Evaluate this MR against the MR acceptance checklist. It helps you analyze changes to reduce risks in quality, performance, reliability, security, and maintainability.

Edited by Jio Castillo

Merge request reports

Loading
Loading