From 5db05c6238ef9a2e048a6a662427ec06968c4802 Mon Sep 17 00:00:00 2001 From: Steven Grimm <1248649+sgrimm@users.noreply.github.com> Date: Tue, 19 Nov 2024 13:17:28 -0800 Subject: [PATCH] SW-6267 Publish rate-limited events as system user (#2616) Rate-limited events were being published as the current user the first time they fired during the rate limiting period, and without any current user at all if they were deferred until the end of the period. The latter caused event handlers to fail if they included permission checks. Make the behavior of deferred and immediate publication consistent by publishing the events as the system user. --- .../backend/ratelimit/RateLimitedEventPublisherImpl.kt | 6 ++++-- .../backend/ratelimit/RateLimitedEventPublisherTest.kt | 2 ++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/com/terraformation/backend/ratelimit/RateLimitedEventPublisherImpl.kt b/src/main/kotlin/com/terraformation/backend/ratelimit/RateLimitedEventPublisherImpl.kt index 611f8dcfc827..f4a895d68cf7 100644 --- a/src/main/kotlin/com/terraformation/backend/ratelimit/RateLimitedEventPublisherImpl.kt +++ b/src/main/kotlin/com/terraformation/backend/ratelimit/RateLimitedEventPublisherImpl.kt @@ -2,6 +2,7 @@ package com.terraformation.backend.ratelimit import com.fasterxml.jackson.databind.JsonMappingException import com.fasterxml.jackson.databind.ObjectMapper +import com.terraformation.backend.customer.model.SystemUser import com.terraformation.backend.db.asNonNullable import com.terraformation.backend.db.default_schema.tables.references.RATE_LIMITED_EVENTS import com.terraformation.backend.log.perClassLogger @@ -29,6 +30,7 @@ class RateLimitedEventPublisherImpl( private val dslContext: DSLContext, private val eventPublisher: ApplicationEventPublisher, private val objectMapper: ObjectMapper, + private val systemUser: SystemUser, ) : RateLimitedEventPublisher { private val log = perClassLogger() @@ -111,7 +113,7 @@ class RateLimitedEventPublisherImpl( } if (canPublishEventNow) { - eventPublisher.publishEvent(event) + systemUser.run { eventPublisher.publishEvent(event) } } else if (eventRecordVanished) { if (canRetry) { publishOrDefer(event, false) @@ -190,7 +192,7 @@ class RateLimitedEventPublisherImpl( eventsToPublish.forEach { event -> try { - eventPublisher.publishEvent(event) + systemUser.run { eventPublisher.publishEvent(event) } } catch (e: Exception) { log.error("Error publishing pending event $event", e) } diff --git a/src/test/kotlin/com/terraformation/backend/ratelimit/RateLimitedEventPublisherTest.kt b/src/test/kotlin/com/terraformation/backend/ratelimit/RateLimitedEventPublisherTest.kt index f3f2a5ecd311..8b855f79f57e 100644 --- a/src/test/kotlin/com/terraformation/backend/ratelimit/RateLimitedEventPublisherTest.kt +++ b/src/test/kotlin/com/terraformation/backend/ratelimit/RateLimitedEventPublisherTest.kt @@ -4,6 +4,7 @@ import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper import com.terraformation.backend.RunsAsUser import com.terraformation.backend.TestClock import com.terraformation.backend.TestEventPublisher +import com.terraformation.backend.customer.model.SystemUser import com.terraformation.backend.customer.model.TerrawareUser import com.terraformation.backend.db.DatabaseTest import com.terraformation.backend.db.default_schema.ProjectId @@ -25,6 +26,7 @@ class RateLimitedEventPublisherTest : DatabaseTest(), RunsAsUser { dslContext, eventPublisher, jacksonObjectMapper(), + SystemUser(usersDao), ) }