diff --git a/.editorconfig b/.editorconfig
index 7b0aa07fc..28ba573af 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -1135,7 +1135,7 @@ ij_kotlin_field_annotation_wrap = split_into_lines
ij_kotlin_finally_on_new_line = false
ij_kotlin_if_rparen_on_new_line = false
ij_kotlin_import_nested_classes = false
-ij_kotlin_imports_layout = *,java.**,javax.**,kotlin.**,^
+ij_kotlin_imports_layout = *
ij_kotlin_insert_whitespaces_in_simple_one_line_method = true
ij_kotlin_keep_blank_lines_before_right_brace = 2
ij_kotlin_keep_blank_lines_in_code = 2
@@ -1151,9 +1151,9 @@ ij_kotlin_method_call_chain_wrap = off
ij_kotlin_method_parameters_new_line_after_left_paren = false
ij_kotlin_method_parameters_right_paren_on_new_line = false
ij_kotlin_method_parameters_wrap = off
-ij_kotlin_name_count_to_use_star_import = 5
-ij_kotlin_name_count_to_use_star_import_for_members = 3
-ij_kotlin_packages_to_use_import_on_demand = java.util.*,kotlinx.android.synthetic.**,io.ktor.**
+ij_kotlin_name_count_to_use_star_import = 999
+ij_kotlin_name_count_to_use_star_import_for_members = 999
+ij_kotlin_packages_to_use_import_on_demand =
ij_kotlin_parameter_annotation_wrap = off
ij_kotlin_space_after_comma = true
ij_kotlin_space_after_extend_colon = true
diff --git a/event-logger/pom.xml b/event-logger/pom.xml
new file mode 100644
index 000000000..d67589616
--- /dev/null
+++ b/event-logger/pom.xml
@@ -0,0 +1,77 @@
+
+
+
+
+
+ TextSecureServer
+ org.whispersystems.textsecure
+ JGITVER
+
+
+ 4.0.0
+ event-logger
+
+
+
+ com.google.cloud
+ google-cloud-logging
+
+
+ org.jetbrains.kotlin
+ kotlin-stdlib
+ ${kotlin.version}
+
+
+ org.jetbrains.kotlinx
+ kotlinx-serialization-json
+ ${kotlinx-serialization.version}
+
+
+
+
+ ${project.basedir}/src/main/kotlin
+ ${project.basedir}/src/test/kotlin
+
+
+
+ org.jetbrains.kotlin
+ kotlin-maven-plugin
+ ${kotlin.version}
+
+
+
+ compile
+
+ compile
+
+
+
+
+ test-compile
+
+ test-compile
+
+
+
+
+
+ kotlinx-serialization
+
+
+
+
+ org.jetbrains.kotlin
+ kotlin-maven-serialization
+ ${kotlin.version}
+
+
+
+
+
+
+
diff --git a/event-logger/src/main/kotlin/events.kt b/event-logger/src/main/kotlin/events.kt
new file mode 100644
index 000000000..b47a29391
--- /dev/null
+++ b/event-logger/src/main/kotlin/events.kt
@@ -0,0 +1,14 @@
+/*
+ * Copyright 2022 Signal Messenger, LLC
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+package org.signal.event
+
+import java.util.Collections
+import kotlinx.serialization.Serializable
+
+sealed interface Event
+
+@Serializable
+data class RemoteConfigSetEvent(val token: String, val name: String, val percentage: Int, val defaultValue: String? = null, val value: String? = null, val hashKey: String? = null, val uuids: Collection = Collections.emptyList()) : Event
diff --git a/event-logger/src/main/kotlin/loggers.kt b/event-logger/src/main/kotlin/loggers.kt
new file mode 100644
index 000000000..02d94cdb3
--- /dev/null
+++ b/event-logger/src/main/kotlin/loggers.kt
@@ -0,0 +1,15 @@
+/*
+ * Copyright 2022 Signal Messenger, LLC
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+package org.signal.event
+
+interface Logger {
+ fun logEvent(event: Event, labels: Map?)
+ fun logEvent(event: Event) = logEvent(event, null)
+}
+
+class NoOpLogger : Logger {
+ override fun logEvent(event: Event, labels: Map?) {}
+}
diff --git a/pom.xml b/pom.xml
index 9f59e58f6..2fcda57e4 100644
--- a/pom.xml
+++ b/pom.xml
@@ -35,6 +35,7 @@
+ event-logger
redis-dispatch
websocket-resources
service
@@ -53,6 +54,8 @@
2.13.3
2.3.1
2.9.0
+ 1.7.10
+ 1.4.0
6.1.9.RELEASE
8.12.54
7.0.1
diff --git a/service/pom.xml b/service/pom.xml
index 0676112ec..9efba705a 100644
--- a/service/pom.xml
+++ b/service/pom.xml
@@ -24,6 +24,11 @@
jakarta.ws.rs-api
+
+ org.whispersystems.textsecure
+ event-logger
+ ${project.version}
+
org.whispersystems.textsecure
redis-dispatch
diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/WhisperServerService.java b/service/src/main/java/org/whispersystems/textsecuregcm/WhisperServerService.java
index a5793e884..d314408b2 100644
--- a/service/src/main/java/org/whispersystems/textsecuregcm/WhisperServerService.java
+++ b/service/src/main/java/org/whispersystems/textsecuregcm/WhisperServerService.java
@@ -55,6 +55,7 @@ import javax.servlet.FilterRegistration;
import javax.servlet.ServletRegistration;
import org.eclipse.jetty.servlets.CrossOriginFilter;
import org.glassfish.jersey.server.ServerProperties;
+import org.signal.event.NoOpLogger;
import org.signal.i18n.HeaderControlledResourceBundleLookup;
import org.signal.libsignal.zkgroup.ServerSecretParams;
import org.signal.libsignal.zkgroup.auth.ServerZkAuthOperations;
@@ -644,7 +645,7 @@ public class WhisperServerService extends Application configAuthTokens;
- private final Map globalConfig;
+ private final Logger eventLogger;
+ private final List configAuthTokens;
+ private final Map globalConfig;
private static final String GLOBAL_CONFIG_PREFIX = "global.";
- public RemoteConfigController(RemoteConfigsManager remoteConfigsManager, List configAuthTokens, Map globalConfig) {
+ public RemoteConfigController(RemoteConfigsManager remoteConfigsManager, Logger eventLogger, List configAuthTokens, Map globalConfig) {
this.remoteConfigsManager = remoteConfigsManager;
+ this.eventLogger = Objects.requireNonNull(eventLogger);
this.configAuthTokens = configAuthTokens;
this.globalConfig = globalConfig;
}
@@ -88,6 +93,15 @@ public class RemoteConfigController {
throw new WebApplicationException(Response.Status.FORBIDDEN);
}
+ eventLogger.logEvent(
+ new RemoteConfigSetEvent(
+ configToken,
+ config.getName(),
+ config.getPercentage(),
+ config.getDefaultValue(),
+ config.getValue(),
+ config.getHashKey(),
+ config.getUuids().stream().map(UUID::toString).collect(Collectors.toList())));
remoteConfigsManager.set(config);
}
diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/tests/controllers/RemoteConfigControllerTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/tests/controllers/RemoteConfigControllerTest.java
index c043b8291..36174a3d2 100644
--- a/service/src/test/java/org/whispersystems/textsecuregcm/tests/controllers/RemoteConfigControllerTest.java
+++ b/service/src/test/java/org/whispersystems/textsecuregcm/tests/controllers/RemoteConfigControllerTest.java
@@ -35,6 +35,7 @@ import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.ArgumentCaptor;
+import org.signal.event.NoOpLogger;
import org.whispersystems.textsecuregcm.auth.AuthenticatedAccount;
import org.whispersystems.textsecuregcm.auth.DisabledPermittedAuthenticatedAccount;
import org.whispersystems.textsecuregcm.controllers.RemoteConfigController;
@@ -57,7 +58,7 @@ class RemoteConfigControllerTest {
ImmutableSet.of(AuthenticatedAccount.class, DisabledPermittedAuthenticatedAccount.class)))
.setTestContainerFactory(new GrizzlyWebTestContainerFactory())
.addProvider(new DeviceLimitExceededExceptionMapper())
- .addResource(new RemoteConfigController(remoteConfigsManager, remoteConfigsAuth, Map.of("maxGroupSize", "42")))
+ .addResource(new RemoteConfigController(remoteConfigsManager, new NoOpLogger(), remoteConfigsAuth, Map.of("maxGroupSize", "42")))
.build();