Add support for environment-dependent secondary OAuth2 credentials JSON

This commit is contained in:
Chris Eager 2023-05-25 15:39:14 -05:00 committed by Jon Chambers
parent d832eaa759
commit cd8f74e60b
5 changed files with 27 additions and 17 deletions

View File

@ -44,6 +44,10 @@ adminEventLoggingConfiguration:
{ {
"key": "value" "key": "value"
} }
secondaryCredentials: |
{
"key": "value"
}
projectId: some-project-id projectId: some-project-id
logName: some-log-name logName: some-log-name
@ -225,6 +229,7 @@ unidentifiedDelivery:
recaptcha: recaptcha:
projectPath: projects/example projectPath: projects/example
credentialConfigurationJson: "{ }" # service account configuration for backend authentication credentialConfigurationJson: "{ }" # service account configuration for backend authentication
secondaryCredentialConfigurationJson: "{ }" # service account configuration for backend authentication
hCaptcha: hCaptcha:
apiKey: secret://hCaptcha.apiKey apiKey: secret://hCaptcha.apiKey
@ -376,6 +381,10 @@ registrationService:
{ {
"example": "example" "example": "example"
} }
secondaryCredentialConfigurationJson: |
{
"example": "example"
}
identityTokenAudience: https://registration.example.com identityTokenAudience: https://registration.example.com
registrationCaCertificate: | # Registration service TLS certificate trust root registrationCaCertificate: | # Registration service TLS certificate trust root
-----BEGIN CERTIFICATE----- -----BEGIN CERTIFICATE-----

View File

@ -311,6 +311,10 @@ public class WhisperServerService extends Application<WhisperServerConfiguration
Metrics.addRegistry(datadogMeterRegistry); Metrics.addRegistry(datadogMeterRegistry);
} }
final boolean useSecondaryCredentialsJson = Optional.ofNullable(
System.getenv("SIGNAL_USE_SECONDARY_CREDENTIALS_JSON"))
.isPresent();
environment.lifecycle().manage(new MicrometerRegistryManager(Metrics.globalRegistry)); environment.lifecycle().manage(new MicrometerRegistryManager(Metrics.globalRegistry));
HeaderControlledResourceBundleLookup headerControlledResourceBundleLookup = HeaderControlledResourceBundleLookup headerControlledResourceBundleLookup =
@ -463,7 +467,9 @@ public class WhisperServerService extends Application<WhisperServerConfiguration
final AdminEventLogger adminEventLogger = new GoogleCloudAdminEventLogger( final AdminEventLogger adminEventLogger = new GoogleCloudAdminEventLogger(
LoggingOptions.newBuilder().setProjectId(config.getAdminEventLoggingConfiguration().projectId()) LoggingOptions.newBuilder().setProjectId(config.getAdminEventLoggingConfiguration().projectId())
.setCredentials(GoogleCredentials.fromStream(new ByteArrayInputStream( .setCredentials(GoogleCredentials.fromStream(new ByteArrayInputStream(
config.getAdminEventLoggingConfiguration().credentials().getBytes(StandardCharsets.UTF_8)))) useSecondaryCredentialsJson
? config.getAdminEventLoggingConfiguration().secondaryCredentials().getBytes(StandardCharsets.UTF_8)
: config.getAdminEventLoggingConfiguration().credentials().getBytes(StandardCharsets.UTF_8))))
.build().getService(), .build().getService(),
config.getAdminEventLoggingConfiguration().projectId(), config.getAdminEventLoggingConfiguration().projectId(),
config.getAdminEventLoggingConfiguration().logName()); config.getAdminEventLoggingConfiguration().logName());
@ -500,7 +506,9 @@ public class WhisperServerService extends Application<WhisperServerConfiguration
RegistrationServiceClient registrationServiceClient = new RegistrationServiceClient( RegistrationServiceClient registrationServiceClient = new RegistrationServiceClient(
config.getRegistrationServiceConfiguration().host(), config.getRegistrationServiceConfiguration().host(),
config.getRegistrationServiceConfiguration().port(), config.getRegistrationServiceConfiguration().port(),
config.getRegistrationServiceConfiguration().credentialConfigurationJson(), useSecondaryCredentialsJson
? config.getRegistrationServiceConfiguration().secondaryCredentialConfigurationJson()
: config.getRegistrationServiceConfiguration().credentialConfigurationJson(),
config.getRegistrationServiceConfiguration().identityTokenAudience(), config.getRegistrationServiceConfiguration().identityTokenAudience(),
config.getRegistrationServiceConfiguration().registrationCaCertificate(), config.getRegistrationServiceConfiguration().registrationCaCertificate(),
registrationCallbackExecutor); registrationCallbackExecutor);
@ -573,8 +581,10 @@ public class WhisperServerService extends Application<WhisperServerConfiguration
final TurnTokenGenerator turnTokenGenerator = new TurnTokenGenerator(dynamicConfigurationManager); final TurnTokenGenerator turnTokenGenerator = new TurnTokenGenerator(dynamicConfigurationManager);
RecaptchaClient recaptchaClient = new RecaptchaClient( RecaptchaClient recaptchaClient = new RecaptchaClient(
config.getRecaptchaConfiguration().getProjectPath(), config.getRecaptchaConfiguration().projectPath(),
config.getRecaptchaConfiguration().getCredentialConfigurationJson(), useSecondaryCredentialsJson
? config.getRecaptchaConfiguration().secondaryCredentialConfigurationJson()
: config.getRecaptchaConfiguration().credentialConfigurationJson(),
dynamicConfigurationManager); dynamicConfigurationManager);
HttpClient hcaptchaHttpClient = HttpClient.newBuilder().version(HttpClient.Version.HTTP_2) HttpClient hcaptchaHttpClient = HttpClient.newBuilder().version(HttpClient.Version.HTTP_2)
.connectTimeout(Duration.ofSeconds(10)).build(); .connectTimeout(Duration.ofSeconds(10)).build();

View File

@ -10,6 +10,7 @@ import javax.validation.constraints.NotEmpty;
public record AdminEventLoggingConfiguration( public record AdminEventLoggingConfiguration(
@NotBlank String credentials, @NotBlank String credentials,
@NotBlank String secondaryCredentials,
@NotEmpty String projectId, @NotEmpty String projectId,
@NotEmpty String logName) { @NotEmpty String logName) {
} }

View File

@ -7,18 +7,7 @@ package org.whispersystems.textsecuregcm.configuration;
import javax.validation.constraints.NotEmpty; import javax.validation.constraints.NotEmpty;
public class RecaptchaConfiguration { public record RecaptchaConfiguration(@NotEmpty String projectPath, @NotEmpty String credentialConfigurationJson,
@NotEmpty String secondaryCredentialConfigurationJson) {
private String projectPath;
private String credentialConfigurationJson;
@NotEmpty
public String getProjectPath() {
return projectPath;
}
@NotEmpty
public String getCredentialConfigurationJson() {
return credentialConfigurationJson;
}
} }

View File

@ -5,6 +5,7 @@ import javax.validation.constraints.NotBlank;
public record RegistrationServiceConfiguration(@NotBlank String host, public record RegistrationServiceConfiguration(@NotBlank String host,
int port, int port,
@NotBlank String credentialConfigurationJson, @NotBlank String credentialConfigurationJson,
@NotBlank String secondaryCredentialConfigurationJson,
@NotBlank String identityTokenAudience, @NotBlank String identityTokenAudience,
@NotBlank String registrationCaCertificate) { @NotBlank String registrationCaCertificate) {
} }