From a4508ec84f337b9841112ed401860118bbf5724d Mon Sep 17 00:00:00 2001 From: Ehren Kret Date: Fri, 26 Aug 2022 11:52:45 -0500 Subject: [PATCH] Add new event logging module --- .editorconfig | 8 +- event-logger/pom.xml | 77 +++++++++++++++++++ event-logger/src/main/kotlin/events.kt | 14 ++++ event-logger/src/main/kotlin/loggers.kt | 15 ++++ pom.xml | 3 + service/pom.xml | 5 ++ .../textsecuregcm/WhisperServerService.java | 3 +- .../controllers/RemoteConfigController.java | 20 ++++- .../RemoteConfigControllerTest.java | 3 +- 9 files changed, 139 insertions(+), 9 deletions(-) create mode 100644 event-logger/pom.xml create mode 100644 event-logger/src/main/kotlin/events.kt create mode 100644 event-logger/src/main/kotlin/loggers.kt 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();