Replace deprecated GoogleCredential with new auth lib (#129)

Replace deprecated GoogleCredential with new lib

This PR also introduced a CredentialsBundle class to carry
HttpTransport and JsonFactory object which are needed by
most of the GCP library to instantiate client.
This commit is contained in:
Shicong Huang 2019-07-02 10:29:51 -04:00 committed by GitHub
parent dae8923bd1
commit 34a28e871e
29 changed files with 822 additions and 684 deletions

View file

@ -14,13 +14,13 @@
package google.registry.beam.invoicing; package google.registry.beam.invoicing;
import com.google.auth.oauth2.GoogleCredentials;
import google.registry.beam.invoicing.BillingEvent.InvoiceGroupingKey; import google.registry.beam.invoicing.BillingEvent.InvoiceGroupingKey;
import google.registry.beam.invoicing.BillingEvent.InvoiceGroupingKey.InvoiceGroupingKeyCoder; import google.registry.beam.invoicing.BillingEvent.InvoiceGroupingKey.InvoiceGroupingKeyCoder;
import google.registry.config.CredentialModule.LocalCredential;
import google.registry.config.RegistryConfig.Config; import google.registry.config.RegistryConfig.Config;
import google.registry.reporting.billing.BillingModule; import google.registry.reporting.billing.BillingModule;
import google.registry.reporting.billing.GenerateInvoicesAction; import google.registry.reporting.billing.GenerateInvoicesAction;
import google.registry.tools.AuthModule.LocalOAuth2Credentials; import google.registry.util.GoogleCredentialsBundle;
import java.io.Serializable; import java.io.Serializable;
import javax.inject.Inject; import javax.inject.Inject;
import org.apache.beam.runners.dataflow.DataflowRunner; import org.apache.beam.runners.dataflow.DataflowRunner;
@ -81,8 +81,8 @@ public class InvoicingPipeline implements Serializable {
@Config("invoiceFilePrefix") @Config("invoiceFilePrefix")
String invoiceFilePrefix; String invoiceFilePrefix;
@Inject @LocalOAuth2Credentials @Inject @LocalCredential
GoogleCredentials credentials; GoogleCredentialsBundle credentialsBundle;
@Inject @Inject
InvoicingPipeline() {} InvoicingPipeline() {}
@ -105,7 +105,7 @@ public class InvoicingPipeline implements Serializable {
public void deploy() { public void deploy() {
// We can't store options as a member variable due to serialization concerns. // We can't store options as a member variable due to serialization concerns.
InvoicingPipelineOptions options = PipelineOptionsFactory.as(InvoicingPipelineOptions.class); InvoicingPipelineOptions options = PipelineOptionsFactory.as(InvoicingPipelineOptions.class);
options.setGcpCredential(credentials); options.setGcpCredential(credentialsBundle.getGoogleCredentials());
options.setProject(projectId); options.setProject(projectId);
options.setRunner(DataflowRunner.class); options.setRunner(DataflowRunner.class);
// This causes p.run() to stage the pipeline as a template on GCS, as opposed to running it. // This causes p.run() to stage the pipeline as a template on GCS, as opposed to running it.

View file

@ -14,7 +14,6 @@
package google.registry.bigquery; package google.registry.bigquery;
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.services.bigquery.Bigquery; import com.google.api.services.bigquery.Bigquery;
import com.google.api.services.bigquery.model.TableFieldSchema; import com.google.api.services.bigquery.model.TableFieldSchema;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
@ -23,24 +22,29 @@ import dagger.Provides;
import dagger.multibindings.Multibinds; import dagger.multibindings.Multibinds;
import google.registry.config.CredentialModule.DefaultCredential; import google.registry.config.CredentialModule.DefaultCredential;
import google.registry.config.RegistryConfig.Config; import google.registry.config.RegistryConfig.Config;
import google.registry.util.GoogleCredentialsBundle;
import java.util.Map; import java.util.Map;
/** Dagger module for Google {@link Bigquery} connection objects. */ /** Dagger module for Google {@link Bigquery} connection objects. */
@Module @Module
public abstract class BigqueryModule { public abstract class BigqueryModule {
/** Provides a map of BigQuery table names to field names. */ // No subclasses.
@Multibinds private BigqueryModule() {}
abstract Map<String, ImmutableList<TableFieldSchema>> bigquerySchemas();
@Provides @Provides
static Bigquery provideBigquery( static Bigquery provideBigquery(
@DefaultCredential GoogleCredential credential, @Config("projectId") String projectId) { @DefaultCredential GoogleCredentialsBundle credentialsBundle,
return new Bigquery.Builder(credential.getTransport(), credential.getJsonFactory(), credential) @Config("projectId") String projectId) {
return new Bigquery.Builder(
credentialsBundle.getHttpTransport(),
credentialsBundle.getJsonFactory(),
credentialsBundle.getHttpRequestInitializer())
.setApplicationName(projectId) .setApplicationName(projectId)
.build(); .build();
} }
// No subclasses. /** Provides a map of BigQuery table names to field names. */
private BigqueryModule() {} @Multibinds
abstract Map<String, ImmutableList<TableFieldSchema>> bigquerySchemas();
} }

View file

@ -16,32 +16,28 @@ package google.registry.config;
import static java.nio.charset.StandardCharsets.UTF_8; import static java.nio.charset.StandardCharsets.UTF_8;
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential; import com.google.auth.oauth2.GoogleCredentials;
import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.googleapis.util.Utils;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import dagger.Module; import dagger.Module;
import dagger.Provides; import dagger.Provides;
import google.registry.config.RegistryConfig.Config; import google.registry.config.RegistryConfig.Config;
import google.registry.keyring.api.KeyModule.Key; import google.registry.keyring.api.KeyModule.Key;
import google.registry.util.GoogleCredentialsBundle;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import java.io.IOException; import java.io.IOException;
import java.io.UncheckedIOException;
import java.lang.annotation.Documented; import java.lang.annotation.Documented;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy; import java.lang.annotation.RetentionPolicy;
import java.security.GeneralSecurityException;
import javax.inject.Qualifier; import javax.inject.Qualifier;
import javax.inject.Singleton; import javax.inject.Singleton;
/** /** Dagger module that provides all {@link GoogleCredentials} used in the application. */
* Dagger module that provides all {@link GoogleCredential GoogleCredentials} used in the
* application.
*/
@Module @Module
public abstract class CredentialModule { public abstract class CredentialModule {
/** /**
* Provides the default {@link GoogleCredential} from the Google Cloud runtime. * Provides the default {@link GoogleCredentialsBundle} from the Google Cloud runtime.
* *
* <p>The credential returned depends on the runtime environment: * <p>The credential returned depends on the runtime environment:
* *
@ -58,22 +54,22 @@ public abstract class CredentialModule {
@DefaultCredential @DefaultCredential
@Provides @Provides
@Singleton @Singleton
public static GoogleCredential provideDefaultCredential( public static GoogleCredentialsBundle provideDefaultCredential(
@Config("defaultCredentialOauthScopes") ImmutableList<String> requiredScopes) { @Config("defaultCredentialOauthScopes") ImmutableList<String> requiredScopes) {
GoogleCredential credential; GoogleCredentials credential;
try { try {
credential = GoogleCredential.getApplicationDefault(); credential = GoogleCredentials.getApplicationDefault();
} catch (IOException e) { } catch (IOException e) {
throw new RuntimeException(e); throw new RuntimeException(e);
} }
if (credential.createScopedRequired()) { if (credential.createScopedRequired()) {
return credential.createScoped(requiredScopes); credential = credential.createScoped(requiredScopes);
} }
return credential; return GoogleCredentialsBundle.create(credential);
} }
/** /**
* Provides a {@link GoogleCredential} from the service account's JSON key file. * Provides a {@link GoogleCredentialsBundle} from the service account's JSON key file.
* *
* <p>On App Engine, a thread created using Java's built-in API needs this credential when it * <p>On App Engine, a thread created using Java's built-in API needs this credential when it
* calls App Engine API. The Google Sheets API also needs this credential. * calls App Engine API. The Google Sheets API also needs this credential.
@ -81,28 +77,24 @@ public abstract class CredentialModule {
@JsonCredential @JsonCredential
@Provides @Provides
@Singleton @Singleton
public static GoogleCredential provideJsonCredential( public static GoogleCredentialsBundle provideJsonCredential(
@Config("defaultCredentialOauthScopes") ImmutableList<String> requiredScopes, @Config("defaultCredentialOauthScopes") ImmutableList<String> requiredScopes,
@Key("jsonCredential") String jsonCredential) { @Key("jsonCredential") String jsonCredential) {
GoogleCredential credential; GoogleCredentials credential;
try { try {
credential = credential =
GoogleCredential.fromStream( GoogleCredentials.fromStream(new ByteArrayInputStream(jsonCredential.getBytes(UTF_8)));
new ByteArrayInputStream(jsonCredential.getBytes(UTF_8)), } catch (IOException e) {
// We cannot use UrlFetchTransport as that uses App Engine API. throw new UncheckedIOException(e);
GoogleNetHttpTransport.newTrustedTransport(),
Utils.getDefaultJsonFactory());
} catch (IOException | GeneralSecurityException e) {
throw new RuntimeException(e);
} }
if (credential.createScopedRequired()) { if (credential.createScopedRequired()) {
credential = credential.createScoped(requiredScopes); credential = credential.createScoped(requiredScopes);
} }
return credential; return GoogleCredentialsBundle.create(credential);
} }
/** /**
* Provides a {@link GoogleCredential} with delegated admin access for a G Suite domain. * Provides a {@link GoogleCredentialsBundle} with delegated admin access for a G Suite domain.
* *
* <p>The G Suite domain must grant delegated admin access to the registry service account with * <p>The G Suite domain must grant delegated admin access to the registry service account with
* all scopes in {@code requiredScopes}, including ones not related to G Suite. * all scopes in {@code requiredScopes}, including ones not related to G Suite.
@ -110,18 +102,14 @@ public abstract class CredentialModule {
@DelegatedCredential @DelegatedCredential
@Provides @Provides
@Singleton @Singleton
public static GoogleCredential provideDelegatedCredential( public static GoogleCredentialsBundle provideDelegatedCredential(
@Config("delegatedCredentialOauthScopes") ImmutableList<String> requiredScopes, @Config("delegatedCredentialOauthScopes") ImmutableList<String> requiredScopes,
@JsonCredential GoogleCredential googleCredential, @JsonCredential GoogleCredentialsBundle credentialsBundle,
@Config("gSuiteAdminAccountEmailAddress") String gSuiteAdminAccountEmailAddress) { @Config("gSuiteAdminAccountEmailAddress") String gSuiteAdminAccountEmailAddress) {
return new GoogleCredential.Builder() return GoogleCredentialsBundle.create(credentialsBundle
.setTransport(Utils.getDefaultTransport()) .getGoogleCredentials()
.setJsonFactory(Utils.getDefaultJsonFactory()) .createDelegated(gSuiteAdminAccountEmailAddress)
.setServiceAccountId(googleCredential.getServiceAccountId()) .createScoped(requiredScopes));
.setServiceAccountPrivateKey(googleCredential.getServiceAccountPrivateKey())
.setServiceAccountScopes(requiredScopes)
.setServiceAccountUser(gSuiteAdminAccountEmailAddress)
.build();
} }
/** Dagger qualifier for the Application Default Credential. */ /** Dagger qualifier for the Application Default Credential. */

View file

@ -14,7 +14,6 @@
package google.registry.dns.writer.clouddns; package google.registry.dns.writer.clouddns;
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.services.dns.Dns; import com.google.api.services.dns.Dns;
import com.google.common.util.concurrent.RateLimiter; import com.google.common.util.concurrent.RateLimiter;
import dagger.Binds; import dagger.Binds;
@ -26,6 +25,7 @@ import dagger.multibindings.StringKey;
import google.registry.config.CredentialModule.DefaultCredential; import google.registry.config.CredentialModule.DefaultCredential;
import google.registry.config.RegistryConfig.Config; import google.registry.config.RegistryConfig.Config;
import google.registry.dns.writer.DnsWriter; import google.registry.dns.writer.DnsWriter;
import google.registry.util.GoogleCredentialsBundle;
import java.util.Optional; import java.util.Optional;
import javax.inject.Named; import javax.inject.Named;
@ -35,12 +35,15 @@ public abstract class CloudDnsWriterModule {
@Provides @Provides
static Dns provideDns( static Dns provideDns(
@DefaultCredential GoogleCredential credential, @DefaultCredential GoogleCredentialsBundle credentialsBundle,
@Config("projectId") String projectId, @Config("projectId") String projectId,
@Config("cloudDnsRootUrl") Optional<String> rootUrl, @Config("cloudDnsRootUrl") Optional<String> rootUrl,
@Config("cloudDnsServicePath") Optional<String> servicePath) { @Config("cloudDnsServicePath") Optional<String> servicePath) {
Dns.Builder builder = Dns.Builder builder =
new Dns.Builder(credential.getTransport(), credential.getJsonFactory(), credential) new Dns.Builder(
credentialsBundle.getHttpTransport(),
credentialsBundle.getJsonFactory(),
credentialsBundle.getHttpRequestInitializer())
.setApplicationName(projectId); .setApplicationName(projectId);
rootUrl.ifPresent(builder::setRootUrl); rootUrl.ifPresent(builder::setRootUrl);

View file

@ -14,7 +14,6 @@
package google.registry.export; package google.registry.export;
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.services.drive.Drive; import com.google.api.services.drive.Drive;
import dagger.Component; import dagger.Component;
import dagger.Module; import dagger.Module;
@ -24,6 +23,7 @@ import google.registry.config.CredentialModule.DefaultCredential;
import google.registry.config.RegistryConfig.Config; import google.registry.config.RegistryConfig.Config;
import google.registry.config.RegistryConfig.ConfigModule; import google.registry.config.RegistryConfig.ConfigModule;
import google.registry.storage.drive.DriveConnection; import google.registry.storage.drive.DriveConnection;
import google.registry.util.GoogleCredentialsBundle;
import javax.inject.Singleton; import javax.inject.Singleton;
/** Dagger module for Google {@link Drive} service connection objects. */ /** Dagger module for Google {@link Drive} service connection objects. */
@ -32,8 +32,13 @@ public final class DriveModule {
@Provides @Provides
static Drive provideDrive( static Drive provideDrive(
@DefaultCredential GoogleCredential credential, @Config("projectId") String projectId) { @DefaultCredential GoogleCredentialsBundle credentialsBundle,
return new Drive.Builder(credential.getTransport(), credential.getJsonFactory(), credential) @Config("projectId") String projectId) {
return new Drive.Builder(
credentialsBundle.getHttpTransport(),
credentialsBundle.getJsonFactory(),
credentialsBundle.getHttpRequestInitializer())
.setApplicationName(projectId) .setApplicationName(projectId)
.build(); .build();
} }

View file

@ -14,11 +14,11 @@
package google.registry.export.datastore; package google.registry.export.datastore;
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import dagger.Module; import dagger.Module;
import dagger.Provides; import dagger.Provides;
import google.registry.config.CredentialModule; import google.registry.config.CredentialModule;
import google.registry.config.RegistryConfig; import google.registry.config.RegistryConfig;
import google.registry.util.GoogleCredentialsBundle;
import javax.inject.Singleton; import javax.inject.Singleton;
/** Dagger module that configures provision of {@link DatastoreAdmin}. */ /** Dagger module that configures provision of {@link DatastoreAdmin}. */
@ -28,10 +28,12 @@ public abstract class DatastoreAdminModule {
@Singleton @Singleton
@Provides @Provides
static DatastoreAdmin provideDatastoreAdmin( static DatastoreAdmin provideDatastoreAdmin(
@CredentialModule.DefaultCredential GoogleCredential credential, @CredentialModule.DefaultCredential GoogleCredentialsBundle credentialsBundle,
@RegistryConfig.Config("projectId") String projectId) { @RegistryConfig.Config("projectId") String projectId) {
return new DatastoreAdmin.Builder( return new DatastoreAdmin.Builder(
credential.getTransport(), credential.getJsonFactory(), credential) credentialsBundle.getHttpTransport(),
credentialsBundle.getJsonFactory(),
credentialsBundle.getHttpRequestInitializer())
.setApplicationName(projectId) .setApplicationName(projectId)
.setProjectId(projectId) .setProjectId(projectId)
.build(); .build();

View file

@ -14,12 +14,12 @@
package google.registry.export.sheet; package google.registry.export.sheet;
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.services.sheets.v4.Sheets; import com.google.api.services.sheets.v4.Sheets;
import dagger.Module; import dagger.Module;
import dagger.Provides; import dagger.Provides;
import google.registry.config.CredentialModule.JsonCredential; import google.registry.config.CredentialModule.JsonCredential;
import google.registry.config.RegistryConfig.Config; import google.registry.config.RegistryConfig.Config;
import google.registry.util.GoogleCredentialsBundle;
/** Dagger module for {@link Sheets}. */ /** Dagger module for {@link Sheets}. */
@Module @Module
@ -27,8 +27,12 @@ public final class SheetsServiceModule {
@Provides @Provides
static Sheets provideSheets( static Sheets provideSheets(
@JsonCredential GoogleCredential credential, @Config("projectId") String projectId) { @JsonCredential GoogleCredentialsBundle credentialsBundle,
return new Sheets.Builder(credential.getTransport(), credential.getJsonFactory(), credential) @Config("projectId") String projectId) {
return new Sheets.Builder(
credentialsBundle.getHttpTransport(),
credentialsBundle.getJsonFactory(),
credentialsBundle.getHttpRequestInitializer())
.setApplicationName(projectId) .setApplicationName(projectId)
.build(); .build();
} }

View file

@ -14,12 +14,12 @@
package google.registry.groups; package google.registry.groups;
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.services.admin.directory.Directory; import com.google.api.services.admin.directory.Directory;
import dagger.Module; import dagger.Module;
import dagger.Provides; import dagger.Provides;
import google.registry.config.CredentialModule.DelegatedCredential; import google.registry.config.CredentialModule.DelegatedCredential;
import google.registry.config.RegistryConfig.Config; import google.registry.config.RegistryConfig.Config;
import google.registry.util.GoogleCredentialsBundle;
/** Dagger module for the Google {@link Directory} service. */ /** Dagger module for the Google {@link Directory} service. */
@Module @Module
@ -27,8 +27,12 @@ public final class DirectoryModule {
@Provides @Provides
static Directory provideDirectory( static Directory provideDirectory(
@DelegatedCredential GoogleCredential credential, @Config("projectId") String projectId) { @DelegatedCredential GoogleCredentialsBundle credentialsBundle,
return new Directory.Builder(credential.getTransport(), credential.getJsonFactory(), credential) @Config("projectId") String projectId) {
return new Directory.Builder(
credentialsBundle.getHttpTransport(),
credentialsBundle.getJsonFactory(),
credentialsBundle.getHttpRequestInitializer())
.setApplicationName(projectId) .setApplicationName(projectId)
.build(); .build();
} }

View file

@ -14,12 +14,12 @@
package google.registry.groups; package google.registry.groups;
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.services.groupssettings.Groupssettings; import com.google.api.services.groupssettings.Groupssettings;
import dagger.Module; import dagger.Module;
import dagger.Provides; import dagger.Provides;
import google.registry.config.CredentialModule.DelegatedCredential; import google.registry.config.CredentialModule.DelegatedCredential;
import google.registry.config.RegistryConfig.Config; import google.registry.config.RegistryConfig.Config;
import google.registry.util.GoogleCredentialsBundle;
/** Dagger module for the Google {@link Groupssettings} service. */ /** Dagger module for the Google {@link Groupssettings} service. */
@Module @Module
@ -27,9 +27,12 @@ public final class GroupssettingsModule {
@Provides @Provides
static Groupssettings provideDirectory( static Groupssettings provideDirectory(
@DelegatedCredential GoogleCredential credential, @Config("projectId") String projectId) { @DelegatedCredential GoogleCredentialsBundle credentialsBundle,
@Config("projectId") String projectId) {
return new Groupssettings.Builder( return new Groupssettings.Builder(
credential.getTransport(), credential.getJsonFactory(), credential) credentialsBundle.getHttpTransport(),
credentialsBundle.getJsonFactory(),
credentialsBundle.getHttpRequestInitializer())
.setApplicationName(projectId) .setApplicationName(projectId)
.build(); .build();
} }

View file

@ -14,7 +14,6 @@
package google.registry.keyring.kms; package google.registry.keyring.kms;
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.services.cloudkms.v1.CloudKMS; import com.google.api.services.cloudkms.v1.CloudKMS;
import dagger.Binds; import dagger.Binds;
import dagger.Module; import dagger.Module;
@ -24,6 +23,7 @@ import dagger.multibindings.StringKey;
import google.registry.config.CredentialModule.DefaultCredential; import google.registry.config.CredentialModule.DefaultCredential;
import google.registry.config.RegistryConfig.Config; import google.registry.config.RegistryConfig.Config;
import google.registry.keyring.api.Keyring; import google.registry.keyring.api.Keyring;
import google.registry.util.GoogleCredentialsBundle;
/** Dagger module for Cloud KMS. */ /** Dagger module for Cloud KMS. */
@Module @Module
@ -31,20 +31,23 @@ public abstract class KmsModule {
public static final String NAME = "KMS"; public static final String NAME = "KMS";
@Binds
@IntoMap
@StringKey(NAME)
abstract Keyring provideKeyring(KmsKeyring keyring);
@Provides @Provides
static CloudKMS provideKms( static CloudKMS provideKms(
@DefaultCredential GoogleCredential credential, @DefaultCredential GoogleCredentialsBundle credentialsBundle,
@Config("cloudKmsProjectId") String projectId) { @Config("cloudKmsProjectId") String projectId) {
return new CloudKMS.Builder(credential.getTransport(), credential.getJsonFactory(), credential) return new CloudKMS.Builder(
credentialsBundle.getHttpTransport(),
credentialsBundle.getJsonFactory(),
credentialsBundle.getHttpRequestInitializer())
.setApplicationName(projectId) .setApplicationName(projectId)
.build(); .build();
} }
@Binds
@IntoMap
@StringKey(NAME)
abstract Keyring provideKeyring(KmsKeyring keyring);
@Binds @Binds
abstract KmsConnection provideKmsConnection(KmsConnectionImpl kmsConnectionImpl); abstract KmsConnection provideKmsConnection(KmsConnectionImpl kmsConnectionImpl);
} }

View file

@ -14,7 +14,6 @@
package google.registry.monitoring.whitebox; package google.registry.monitoring.whitebox;
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.services.monitoring.v3.Monitoring; import com.google.api.services.monitoring.v3.Monitoring;
import com.google.api.services.monitoring.v3.model.MonitoredResource; import com.google.api.services.monitoring.v3.model.MonitoredResource;
import com.google.appengine.api.modules.ModulesService; import com.google.appengine.api.modules.ModulesService;
@ -27,6 +26,7 @@ import dagger.Module;
import dagger.Provides; import dagger.Provides;
import google.registry.config.CredentialModule.JsonCredential; import google.registry.config.CredentialModule.JsonCredential;
import google.registry.config.RegistryConfig.Config; import google.registry.config.RegistryConfig.Config;
import google.registry.util.GoogleCredentialsBundle;
import org.joda.time.Duration; import org.joda.time.Duration;
/** Dagger module for Google Stackdriver service connection objects. */ /** Dagger module for Google Stackdriver service connection objects. */
@ -39,9 +39,12 @@ public final class StackdriverModule {
@Provides @Provides
static Monitoring provideMonitoring( static Monitoring provideMonitoring(
@JsonCredential GoogleCredential credential, @Config("projectId") String projectId) { @JsonCredential GoogleCredentialsBundle credentialsBundle,
@Config("projectId") String projectId) {
return new Monitoring.Builder( return new Monitoring.Builder(
credential.getTransport(), credential.getJsonFactory(), credential) credentialsBundle.getHttpTransport(),
credentialsBundle.getJsonFactory(),
credentialsBundle.getHttpRequestInitializer())
.setApplicationName(projectId) .setApplicationName(projectId)
.build(); .build();
} }

View file

@ -17,7 +17,6 @@ package google.registry.reporting;
import static google.registry.request.RequestParameters.extractOptionalParameter; import static google.registry.request.RequestParameters.extractOptionalParameter;
import static google.registry.request.RequestParameters.extractRequiredParameter; import static google.registry.request.RequestParameters.extractRequiredParameter;
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.services.dataflow.Dataflow; import com.google.api.services.dataflow.Dataflow;
import dagger.Module; import dagger.Module;
import dagger.Provides; import dagger.Provides;
@ -25,6 +24,7 @@ import google.registry.config.CredentialModule.DefaultCredential;
import google.registry.config.RegistryConfig.Config; import google.registry.config.RegistryConfig.Config;
import google.registry.request.HttpException.BadRequestException; import google.registry.request.HttpException.BadRequestException;
import google.registry.request.Parameter; import google.registry.request.Parameter;
import google.registry.util.GoogleCredentialsBundle;
import google.registry.util.Clock; import google.registry.util.Clock;
import java.util.Optional; import java.util.Optional;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
@ -118,8 +118,12 @@ public class ReportingModule {
/** Constructs a {@link Dataflow} API client with default settings. */ /** Constructs a {@link Dataflow} API client with default settings. */
@Provides @Provides
static Dataflow provideDataflow( static Dataflow provideDataflow(
@DefaultCredential GoogleCredential credential, @Config("projectId") String projectId) { @DefaultCredential GoogleCredentialsBundle credentialsBundle,
return new Dataflow.Builder(credential.getTransport(), credential.getJsonFactory(), credential) @Config("projectId") String projectId) {
return new Dataflow.Builder(
credentialsBundle.getHttpTransport(),
credentialsBundle.getJsonFactory(),
credentialsBundle.getHttpRequestInitializer())
.setApplicationName(String.format("%s billing", projectId)) .setApplicationName(String.format("%s billing", projectId))
.build(); .build();
} }

View file

@ -14,13 +14,12 @@
package google.registry.tools; package google.registry.tools;
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.googleapis.util.Utils;
import com.google.api.services.appengine.v1.Appengine; import com.google.api.services.appengine.v1.Appengine;
import dagger.Module; import dagger.Module;
import dagger.Provides; import dagger.Provides;
import google.registry.config.CredentialModule.LocalCredential; import google.registry.config.CredentialModule.LocalCredential;
import google.registry.config.RegistryConfig.Config; import google.registry.config.RegistryConfig.Config;
import google.registry.util.GoogleCredentialsBundle;
import javax.inject.Singleton; import javax.inject.Singleton;
/** Module providing the instance of {@link Appengine} to access App Engine Admin Api. */ /** Module providing the instance of {@link Appengine} to access App Engine Admin Api. */
@ -30,9 +29,12 @@ public abstract class AppEngineAdminApiModule {
@Provides @Provides
@Singleton @Singleton
public static Appengine provideAppengine( public static Appengine provideAppengine(
@LocalCredential GoogleCredential credential, @Config("projectId") String projectId) { @LocalCredential GoogleCredentialsBundle credentialsBundle,
@Config("projectId") String projectId) {
return new Appengine.Builder( return new Appengine.Builder(
Utils.getDefaultTransport(), Utils.getDefaultJsonFactory(), credential) credentialsBundle.getHttpTransport(),
credentialsBundle.getJsonFactory(),
credentialsBundle.getHttpRequestInitializer())
.setApplicationName(projectId) .setApplicationName(projectId)
.build(); .build();
} }

View file

@ -20,7 +20,6 @@ import com.google.api.client.auth.oauth2.Credential;
import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow; import com.google.api.client.googleapis.auth.oauth2.GoogleAuthorizationCodeFlow;
import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets; import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets;
import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets.Details; import com.google.api.client.googleapis.auth.oauth2.GoogleClientSecrets.Details;
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.JsonFactory; import com.google.api.client.json.JsonFactory;
import com.google.api.client.util.store.AbstractDataStoreFactory; import com.google.api.client.util.store.AbstractDataStoreFactory;
@ -39,10 +38,10 @@ import google.registry.config.CredentialModule.DefaultCredential;
import google.registry.config.CredentialModule.LocalCredential; import google.registry.config.CredentialModule.LocalCredential;
import google.registry.config.CredentialModule.LocalCredentialJson; import google.registry.config.CredentialModule.LocalCredentialJson;
import google.registry.config.RegistryConfig.Config; import google.registry.config.RegistryConfig.Config;
import google.registry.util.GoogleCredentialsBundle;
import java.io.ByteArrayInputStream; import java.io.ByteArrayInputStream;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.io.UncheckedIOException;
import java.lang.annotation.Documented; import java.lang.annotation.Documented;
import java.lang.annotation.Retention; import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy; import java.lang.annotation.RetentionPolicy;
@ -60,14 +59,6 @@ public class AuthModule {
private static final File DATA_STORE_DIR = private static final File DATA_STORE_DIR =
new File(System.getProperty("user.home"), ".config/nomulus/credentials"); new File(System.getProperty("user.home"), ".config/nomulus/credentials");
@Module
abstract static class LocalCredentialModule {
@Binds
@DefaultCredential
abstract GoogleCredential provideLocalCredentialAsDefaultCredential(
@LocalCredential GoogleCredential credential);
}
@Provides @Provides
@StoredCredential @StoredCredential
static Credential provideCredential( static Credential provideCredential(
@ -86,38 +77,21 @@ public class AuthModule {
@Provides @Provides
@LocalCredential @LocalCredential
public static GoogleCredential provideLocalCredential( public static GoogleCredentialsBundle provideLocalCredential(
@LocalCredentialJson String credentialJson, @LocalCredentialJson String credentialJson,
@Config("localCredentialOauthScopes") ImmutableList<String> scopes) { @Config("localCredentialOauthScopes") ImmutableList<String> scopes) {
try { try {
GoogleCredential credential = GoogleCredentials credential =
GoogleCredential.fromStream(new ByteArrayInputStream(credentialJson.getBytes(UTF_8))); GoogleCredentials.fromStream(new ByteArrayInputStream(credentialJson.getBytes(UTF_8)));
if (credential.createScopedRequired()) { if (credential.createScopedRequired()) {
credential = credential.createScoped(scopes); credential = credential.createScoped(scopes);
} }
return credential; return GoogleCredentialsBundle.create(credential);
} catch (IOException e) { } catch (IOException e) {
throw new RuntimeException(e); throw new RuntimeException(e);
} }
} }
@Provides
@LocalOAuth2Credentials
public static GoogleCredentials provideLocalOAuth2Credentials(
@LocalCredentialJson String credentialJson,
@Config("localCredentialOauthScopes") ImmutableList<String> scopes) {
try {
GoogleCredentials credentials =
GoogleCredentials.fromStream(new ByteArrayInputStream(credentialJson.getBytes(UTF_8)));
if (credentials.createScopedRequired()) {
credentials = credentials.createScoped(scopes);
}
return credentials;
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}
@Provides @Provides
public static GoogleAuthorizationCodeFlow provideAuthorizationCodeFlow( public static GoogleAuthorizationCodeFlow provideAuthorizationCodeFlow(
JsonFactory jsonFactory, JsonFactory jsonFactory,
@ -198,16 +172,11 @@ public class AuthModule {
} }
} }
/** Raised when we need a user login. */
static class LoginRequiredException extends RuntimeException {
LoginRequiredException() {}
}
/** /**
* Dagger qualifier for the {@link Credential} constructed from the data stored on disk. * Dagger qualifier for the {@link Credential} constructed from the data stored on disk.
* *
* <p>This {@link Credential} should not be used in another module, hence the private qualifier. * <p>This {@link Credential} should not be used in another module, hence the private qualifier.
* It's only use is to build a {@link GoogleCredential}, which is used in injection sites * It's only use is to build a {@link GoogleCredentials}, which is used in injection sites
* elsewhere. * elsewhere.
*/ */
@Qualifier @Qualifier
@ -227,9 +196,16 @@ public class AuthModule {
@Retention(RetentionPolicy.RUNTIME) @Retention(RetentionPolicy.RUNTIME)
@interface OAuthClientId {} @interface OAuthClientId {}
/** Dagger qualifier for the local OAuth2 Credentials. */ @Module
@Qualifier abstract static class LocalCredentialModule {
@Documented @Binds
@Retention(RetentionPolicy.RUNTIME) @DefaultCredential
public @interface LocalOAuth2Credentials {} abstract GoogleCredentialsBundle provideLocalCredentialAsDefaultCredential(
@LocalCredential GoogleCredentialsBundle credential);
}
/** Raised when we need a user login. */
static class LoginRequiredException extends RuntimeException {
LoginRequiredException() {}
}
} }

View file

@ -14,13 +14,13 @@
package google.registry.tools; package google.registry.tools;
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.http.HttpRequestFactory; import com.google.api.client.http.HttpRequestFactory;
import com.google.api.client.http.javanet.NetHttpTransport; import com.google.api.client.http.javanet.NetHttpTransport;
import dagger.Module; import dagger.Module;
import dagger.Provides; import dagger.Provides;
import google.registry.config.CredentialModule.DefaultCredential; import google.registry.config.CredentialModule.DefaultCredential;
import google.registry.config.RegistryConfig; import google.registry.config.RegistryConfig;
import google.registry.util.GoogleCredentialsBundle;
/** /**
* Module for providing the HttpRequestFactory. * Module for providing the HttpRequestFactory.
@ -35,7 +35,7 @@ class RequestFactoryModule {
@Provides @Provides
static HttpRequestFactory provideHttpRequestFactory( static HttpRequestFactory provideHttpRequestFactory(
@DefaultCredential GoogleCredential credential) { @DefaultCredential GoogleCredentialsBundle credentialsBundle) {
if (RegistryConfig.areServersLocal()) { if (RegistryConfig.areServersLocal()) {
return new NetHttpTransport() return new NetHttpTransport()
.createRequestFactory( .createRequestFactory(
@ -47,11 +47,12 @@ class RequestFactoryModule {
return new NetHttpTransport() return new NetHttpTransport()
.createRequestFactory( .createRequestFactory(
request -> { request -> {
credential.initialize(request); credentialsBundle.getHttpRequestInitializer().initialize(request);
// GAE request times out after 10 min, so here we set the timeout to 10 min. This is // GAE request times out after 10 min, so here we set the timeout to 10 min. This is
// needed to support some nomulus commands like updating premium lists that take // needed to support some nomulus commands like updating premium lists that take
// a lot of time to complete. // a lot of time to complete.
// See https://developers.google.com/api-client-library/java/google-api-java-client/errors // See
// https://developers.google.com/api-client-library/java/google-api-java-client/errors
request.setConnectTimeout(REQUEST_TIMEOUT_MS); request.setConnectTimeout(REQUEST_TIMEOUT_MS);
request.setReadTimeout(REQUEST_TIMEOUT_MS); request.setReadTimeout(REQUEST_TIMEOUT_MS);
}); });

View file

@ -17,17 +17,17 @@ package google.registry.export.datastore;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static com.google.common.truth.Truth8.assertThat; import static com.google.common.truth.Truth8.assertThat;
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.http.GenericUrl; import com.google.api.client.http.GenericUrl;
import com.google.api.client.http.HttpRequest; import com.google.api.client.http.HttpRequest;
import com.google.api.client.http.HttpTransport; import com.google.auth.oauth2.AccessToken;
import com.google.api.client.http.javanet.NetHttpTransport; import com.google.auth.oauth2.GoogleCredentials;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import google.registry.testing.TestDataHelper; import google.registry.testing.TestDataHelper;
import google.registry.util.GoogleCredentialsBundle;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.IOException; import java.io.IOException;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.util.Date;
import java.util.Optional; import java.util.Optional;
import org.junit.Before; import org.junit.Before;
import org.junit.Rule; import org.junit.Rule;
@ -48,27 +48,44 @@ public class DatastoreAdminTest {
@Rule public final MockitoRule mocks = MockitoJUnit.rule(); @Rule public final MockitoRule mocks = MockitoJUnit.rule();
private HttpTransport httpTransport;
private GoogleCredential googleCredential;
private DatastoreAdmin datastoreAdmin; private DatastoreAdmin datastoreAdmin;
private static HttpRequest simulateSendRequest(HttpRequest httpRequest) {
try {
httpRequest.setUrl(new GenericUrl("https://localhost:65537")).execute();
} catch (Exception expected) {
}
return httpRequest;
}
private static Optional<String> getAccessToken(HttpRequest httpRequest) {
return httpRequest.getHeaders().getAuthorizationAsList().stream()
.filter(header -> header.startsWith(AUTH_HEADER_PREFIX))
.map(header -> header.substring(AUTH_HEADER_PREFIX.length()))
.findAny();
}
private static Optional<String> getRequestContent(HttpRequest httpRequest) throws IOException {
if (httpRequest.getContent() == null) {
return Optional.empty();
}
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
httpRequest.getContent().writeTo(outputStream);
outputStream.close();
return Optional.of(outputStream.toString(StandardCharsets.UTF_8.name()));
}
@Before @Before
public void setup() { public void setup() {
httpTransport = new NetHttpTransport(); Date oneHourLater = new Date(System.currentTimeMillis() + 3_600_000);
googleCredential = GoogleCredentials googleCredentials = GoogleCredentials
new GoogleCredential.Builder() .create(new AccessToken(ACCESS_TOKEN, oneHourLater));
.setTransport(httpTransport) GoogleCredentialsBundle credentialsBundle = GoogleCredentialsBundle.create(googleCredentials);
.setJsonFactory(JacksonFactory.getDefaultInstance())
.setClock(() -> 0)
.build();
googleCredential.setAccessToken(ACCESS_TOKEN);
googleCredential.setExpiresInSeconds(1_000L);
datastoreAdmin = datastoreAdmin =
new DatastoreAdmin.Builder( new DatastoreAdmin.Builder(
googleCredential.getTransport(), credentialsBundle.getHttpTransport(),
googleCredential.getJsonFactory(), credentialsBundle.getJsonFactory(),
googleCredential) credentialsBundle.getHttpRequestInitializer())
.setApplicationName("MyApplication") .setApplicationName("MyApplication")
.setProjectId("MyCloudProject") .setProjectId("MyCloudProject")
.build(); .build();
@ -151,29 +168,4 @@ public class DatastoreAdminTest {
simulateSendRequest(httpRequest); simulateSendRequest(httpRequest);
assertThat(getAccessToken(httpRequest)).hasValue(ACCESS_TOKEN); assertThat(getAccessToken(httpRequest)).hasValue(ACCESS_TOKEN);
} }
private static HttpRequest simulateSendRequest(HttpRequest httpRequest) {
try {
httpRequest.setUrl(new GenericUrl("https://localhost:65537")).execute();
} catch (Exception expected) {
}
return httpRequest;
}
private static Optional<String> getAccessToken(HttpRequest httpRequest) {
return httpRequest.getHeaders().getAuthorizationAsList().stream()
.filter(header -> header.startsWith(AUTH_HEADER_PREFIX))
.map(header -> header.substring(AUTH_HEADER_PREFIX.length()))
.findAny();
}
private static Optional<String> getRequestContent(HttpRequest httpRequest) throws IOException {
if (httpRequest.getContent() == null) {
return Optional.empty();
}
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
httpRequest.getContent().writeTo(outputStream);
outputStream.close();
return Optional.of(outputStream.toString(StandardCharsets.UTF_8.name()));
}
} }

View file

@ -16,34 +16,40 @@ package google.registry.tools;
import static com.google.common.truth.Truth.assertThat; import static com.google.common.truth.Truth.assertThat;
import static google.registry.tools.RequestFactoryModule.REQUEST_TIMEOUT_MS; import static google.registry.tools.RequestFactoryModule.REQUEST_TIMEOUT_MS;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.verifyZeroInteractions; import static org.mockito.Mockito.verifyZeroInteractions;
import static org.mockito.Mockito.when;
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.http.GenericUrl; import com.google.api.client.http.GenericUrl;
import com.google.api.client.http.HttpRequest; import com.google.api.client.http.HttpRequest;
import com.google.api.client.http.HttpRequestFactory; import com.google.api.client.http.HttpRequestFactory;
import com.google.api.client.http.HttpRequestInitializer; import com.google.api.client.http.HttpRequestInitializer;
import google.registry.config.RegistryConfig; import google.registry.config.RegistryConfig;
import google.registry.testing.SystemPropertyRule; import google.registry.testing.SystemPropertyRule;
import google.registry.util.GoogleCredentialsBundle;
import org.junit.Before; import org.junit.Before;
import org.junit.Rule; import org.junit.Rule;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.junit.runners.JUnit4; import org.junit.runners.JUnit4;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;
@RunWith(JUnit4.class) @RunWith(JUnit4.class)
public class RequestFactoryModuleTest { public class RequestFactoryModuleTest {
private final GoogleCredential googleCredential = mock(GoogleCredential.class); @Rule public final MockitoRule mockitoRule = MockitoJUnit.rule();
@Rule public final SystemPropertyRule systemPropertyRule = new SystemPropertyRule(); @Rule public final SystemPropertyRule systemPropertyRule = new SystemPropertyRule();
@Mock public GoogleCredentialsBundle credentialsBundle;
@Mock public HttpRequestInitializer httpRequestInitializer;
@Before @Before
public void setUp() { public void setUp() {
RegistryToolEnvironment.UNITTEST.setup(systemPropertyRule); RegistryToolEnvironment.UNITTEST.setup(systemPropertyRule);
when(credentialsBundle.getHttpRequestInitializer()).thenReturn(httpRequestInitializer);
} }
@Test @Test
@ -52,12 +58,13 @@ public class RequestFactoryModuleTest {
boolean origIsLocal = RegistryConfig.CONFIG_SETTINGS.get().appEngine.isLocal; boolean origIsLocal = RegistryConfig.CONFIG_SETTINGS.get().appEngine.isLocal;
RegistryConfig.CONFIG_SETTINGS.get().appEngine.isLocal = true; RegistryConfig.CONFIG_SETTINGS.get().appEngine.isLocal = true;
try { try {
HttpRequestFactory factory = RequestFactoryModule.provideHttpRequestFactory(googleCredential); HttpRequestFactory factory =
RequestFactoryModule.provideHttpRequestFactory(credentialsBundle);
HttpRequestInitializer initializer = factory.getInitializer(); HttpRequestInitializer initializer = factory.getInitializer();
assertThat(initializer).isNotNull(); assertThat(initializer).isNotNull();
HttpRequest request = factory.buildGetRequest(new GenericUrl("http://localhost")); HttpRequest request = factory.buildGetRequest(new GenericUrl("http://localhost"));
initializer.initialize(request); initializer.initialize(request);
verifyZeroInteractions(googleCredential); verifyZeroInteractions(httpRequestInitializer);
} finally { } finally {
RegistryConfig.CONFIG_SETTINGS.get().appEngine.isLocal = origIsLocal; RegistryConfig.CONFIG_SETTINGS.get().appEngine.isLocal = origIsLocal;
} }
@ -69,15 +76,16 @@ public class RequestFactoryModuleTest {
boolean origIsLocal = RegistryConfig.CONFIG_SETTINGS.get().appEngine.isLocal; boolean origIsLocal = RegistryConfig.CONFIG_SETTINGS.get().appEngine.isLocal;
RegistryConfig.CONFIG_SETTINGS.get().appEngine.isLocal = false; RegistryConfig.CONFIG_SETTINGS.get().appEngine.isLocal = false;
try { try {
HttpRequestFactory factory = RequestFactoryModule.provideHttpRequestFactory(googleCredential); HttpRequestFactory factory =
RequestFactoryModule.provideHttpRequestFactory(credentialsBundle);
HttpRequestInitializer initializer = factory.getInitializer(); HttpRequestInitializer initializer = factory.getInitializer();
assertThat(initializer).isNotNull(); assertThat(initializer).isNotNull();
// HttpRequestFactory#buildGetRequest() calls initialize() once. // HttpRequestFactory#buildGetRequest() calls initialize() once.
HttpRequest request = factory.buildGetRequest(new GenericUrl("http://localhost")); HttpRequest request = factory.buildGetRequest(new GenericUrl("http://localhost"));
verify(googleCredential).initialize(request); verify(httpRequestInitializer).initialize(request);
assertThat(request.getConnectTimeout()).isEqualTo(REQUEST_TIMEOUT_MS); assertThat(request.getConnectTimeout()).isEqualTo(REQUEST_TIMEOUT_MS);
assertThat(request.getReadTimeout()).isEqualTo(REQUEST_TIMEOUT_MS); assertThat(request.getReadTimeout()).isEqualTo(REQUEST_TIMEOUT_MS);
verifyNoMoreInteractions(googleCredential); verifyNoMoreInteractions(httpRequestInitializer);
} finally { } finally {
RegistryConfig.CONFIG_SETTINGS.get().appEngine.isLocal = origIsLocal; RegistryConfig.CONFIG_SETTINGS.get().appEngine.isLocal = origIsLocal;
} }

876
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -12,6 +12,8 @@ dependencies {
compile deps['com.google.apis:google-api-services-cloudkms'] compile deps['com.google.apis:google-api-services-cloudkms']
compile deps['com.google.apis:google-api-services-monitoring'] compile deps['com.google.apis:google-api-services-monitoring']
compile deps['com.google.apis:google-api-services-storage'] compile deps['com.google.apis:google-api-services-storage']
compile deps['com.google.auth:google-auth-library-credentials']
compile deps['com.google.auth:google-auth-library-oauth2-http']
compile deps['com.google.auto.value:auto-value-annotations'] compile deps['com.google.auto.value:auto-value-annotations']
compile deps['com.google.code.findbugs:jsr305'] compile deps['com.google.code.findbugs:jsr305']
compile deps['com.google.code.gson:gson'] compile deps['com.google.code.gson:gson']

View file

@ -2,13 +2,15 @@
# Manual edits can break the build and are not advised. # Manual edits can break the build and are not advised.
# This file is expected to be part of source control. # This file is expected to be part of source control.
com.beust:jcommander:1.60 com.beust:jcommander:1.60
com.fasterxml.jackson.core:jackson-core:2.9.6 com.fasterxml.jackson.core:jackson-core:2.9.9
com.google.api-client:google-api-client:1.29.2 com.google.api-client:google-api-client:1.29.2
com.google.apis:google-api-services-cloudkms:v1-rev12-1.22.0 com.google.apis:google-api-services-cloudkms:v1-rev12-1.22.0
com.google.apis:google-api-services-monitoring:v3-rev426-1.23.0 com.google.apis:google-api-services-monitoring:v3-rev426-1.23.0
com.google.apis:google-api-services-storage:v1-rev150-1.22.0 com.google.apis:google-api-services-storage:v1-rev150-1.22.0
com.google.appengine:appengine-api-1.0-sdk:1.9.48 com.google.appengine:appengine-api-1.0-sdk:1.9.48
com.google.appengine:appengine-testing:1.9.58 com.google.appengine:appengine-testing:1.9.58
com.google.auth:google-auth-library-credentials:0.16.1
com.google.auth:google-auth-library-oauth2-http:0.16.1
com.google.auto.value:auto-value-annotations:1.6.3 com.google.auto.value:auto-value-annotations:1.6.3
com.google.auto.value:auto-value:1.6.3 com.google.auto.value:auto-value:1.6.3
com.google.code.findbugs:jsr305:3.0.2 com.google.code.findbugs:jsr305:3.0.2
@ -19,17 +21,17 @@ com.google.flogger:flogger:0.1
com.google.guava:failureaccess:1.0.1 com.google.guava:failureaccess:1.0.1
com.google.guava:guava:27.1-jre com.google.guava:guava:27.1-jre
com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava
com.google.http-client:google-http-client-jackson2:1.29.2 com.google.http-client:google-http-client-jackson2:1.30.1
com.google.http-client:google-http-client:1.29.2 com.google.http-client:google-http-client:1.30.1
com.google.j2objc:j2objc-annotations:1.1 com.google.j2objc:j2objc-annotations:1.3
com.google.monitoring-client:metrics:1.0.4 com.google.monitoring-client:metrics:1.0.4
com.google.monitoring-client:stackdriver:1.0.4 com.google.monitoring-client:stackdriver:1.0.4
com.google.oauth-client:google-oauth-client:1.29.2 com.google.oauth-client:google-oauth-client:1.29.2
com.google.re2j:re2j:1.1 com.google.re2j:re2j:1.1
com.ibm.icu:icu4j:57.1 com.ibm.icu:icu4j:57.1
commons-codec:commons-codec:1.10 commons-codec:commons-codec:1.11
commons-logging:commons-logging:1.2 commons-logging:commons-logging:1.2
io.grpc:grpc-context:1.18.0 io.grpc:grpc-context:1.19.0
io.netty:netty-buffer:4.1.31.Final io.netty:netty-buffer:4.1.31.Final
io.netty:netty-codec-http:4.1.31.Final io.netty:netty-codec-http:4.1.31.Final
io.netty:netty-codec:4.1.31.Final io.netty:netty-codec:4.1.31.Final
@ -37,15 +39,15 @@ io.netty:netty-common:4.1.31.Final
io.netty:netty-handler:4.1.31.Final io.netty:netty-handler:4.1.31.Final
io.netty:netty-resolver:4.1.31.Final io.netty:netty-resolver:4.1.31.Final
io.netty:netty-transport:4.1.31.Final io.netty:netty-transport:4.1.31.Final
io.opencensus:opencensus-api:0.19.2 io.opencensus:opencensus-api:0.21.0
io.opencensus:opencensus-contrib-http-util:0.19.2 io.opencensus:opencensus-contrib-http-util:0.21.0
javax.activation:activation:1.1 javax.activation:activation:1.1
javax.inject:javax.inject:1 javax.inject:javax.inject:1
javax.mail:mail:1.4 javax.mail:mail:1.4
javax.xml.bind:jaxb-api:2.3.0 javax.xml.bind:jaxb-api:2.3.0
joda-time:joda-time:2.9.2 joda-time:joda-time:2.9.2
org.apache.httpcomponents:httpclient:4.5.5 org.apache.httpcomponents:httpclient:4.5.8
org.apache.httpcomponents:httpcore:4.4.9 org.apache.httpcomponents:httpcore:4.4.11
org.bouncycastle:bcpkix-jdk15on:1.61 org.bouncycastle:bcpkix-jdk15on:1.61
org.bouncycastle:bcprov-jdk15on:1.61 org.bouncycastle:bcprov-jdk15on:1.61
org.checkerframework:checker-qual:2.5.2 org.checkerframework:checker-qual:2.5.2

View file

@ -2,13 +2,15 @@
# Manual edits can break the build and are not advised. # Manual edits can break the build and are not advised.
# This file is expected to be part of source control. # This file is expected to be part of source control.
com.beust:jcommander:1.60 com.beust:jcommander:1.60
com.fasterxml.jackson.core:jackson-core:2.9.6 com.fasterxml.jackson.core:jackson-core:2.9.9
com.google.api-client:google-api-client:1.29.2 com.google.api-client:google-api-client:1.29.2
com.google.apis:google-api-services-cloudkms:v1-rev12-1.22.0 com.google.apis:google-api-services-cloudkms:v1-rev12-1.22.0
com.google.apis:google-api-services-monitoring:v3-rev426-1.23.0 com.google.apis:google-api-services-monitoring:v3-rev426-1.23.0
com.google.apis:google-api-services-storage:v1-rev150-1.22.0 com.google.apis:google-api-services-storage:v1-rev150-1.22.0
com.google.appengine:appengine-api-1.0-sdk:1.9.48 com.google.appengine:appengine-api-1.0-sdk:1.9.48
com.google.appengine:appengine-testing:1.9.58 com.google.appengine:appengine-testing:1.9.58
com.google.auth:google-auth-library-credentials:0.16.1
com.google.auth:google-auth-library-oauth2-http:0.16.1
com.google.auto.value:auto-value-annotations:1.6.3 com.google.auto.value:auto-value-annotations:1.6.3
com.google.auto.value:auto-value:1.6.3 com.google.auto.value:auto-value:1.6.3
com.google.code.findbugs:jsr305:3.0.2 com.google.code.findbugs:jsr305:3.0.2
@ -19,17 +21,17 @@ com.google.flogger:flogger:0.1
com.google.guava:failureaccess:1.0.1 com.google.guava:failureaccess:1.0.1
com.google.guava:guava:27.1-jre com.google.guava:guava:27.1-jre
com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava
com.google.http-client:google-http-client-jackson2:1.29.2 com.google.http-client:google-http-client-jackson2:1.30.1
com.google.http-client:google-http-client:1.29.2 com.google.http-client:google-http-client:1.30.1
com.google.j2objc:j2objc-annotations:1.1 com.google.j2objc:j2objc-annotations:1.3
com.google.monitoring-client:metrics:1.0.4 com.google.monitoring-client:metrics:1.0.4
com.google.monitoring-client:stackdriver:1.0.4 com.google.monitoring-client:stackdriver:1.0.4
com.google.oauth-client:google-oauth-client:1.29.2 com.google.oauth-client:google-oauth-client:1.29.2
com.google.re2j:re2j:1.1 com.google.re2j:re2j:1.1
com.ibm.icu:icu4j:57.1 com.ibm.icu:icu4j:57.1
commons-codec:commons-codec:1.10 commons-codec:commons-codec:1.11
commons-logging:commons-logging:1.2 commons-logging:commons-logging:1.2
io.grpc:grpc-context:1.18.0 io.grpc:grpc-context:1.19.0
io.netty:netty-buffer:4.1.31.Final io.netty:netty-buffer:4.1.31.Final
io.netty:netty-codec-http:4.1.31.Final io.netty:netty-codec-http:4.1.31.Final
io.netty:netty-codec:4.1.31.Final io.netty:netty-codec:4.1.31.Final
@ -37,15 +39,15 @@ io.netty:netty-common:4.1.31.Final
io.netty:netty-handler:4.1.31.Final io.netty:netty-handler:4.1.31.Final
io.netty:netty-resolver:4.1.31.Final io.netty:netty-resolver:4.1.31.Final
io.netty:netty-transport:4.1.31.Final io.netty:netty-transport:4.1.31.Final
io.opencensus:opencensus-api:0.19.2 io.opencensus:opencensus-api:0.21.0
io.opencensus:opencensus-contrib-http-util:0.19.2 io.opencensus:opencensus-contrib-http-util:0.21.0
javax.activation:activation:1.1 javax.activation:activation:1.1
javax.inject:javax.inject:1 javax.inject:javax.inject:1
javax.mail:mail:1.4 javax.mail:mail:1.4
javax.xml.bind:jaxb-api:2.3.0 javax.xml.bind:jaxb-api:2.3.0
joda-time:joda-time:2.9.2 joda-time:joda-time:2.9.2
org.apache.httpcomponents:httpclient:4.5.5 org.apache.httpcomponents:httpclient:4.5.8
org.apache.httpcomponents:httpcore:4.4.9 org.apache.httpcomponents:httpcore:4.4.11
org.bouncycastle:bcpkix-jdk15on:1.61 org.bouncycastle:bcpkix-jdk15on:1.61
org.bouncycastle:bcprov-jdk15on:1.61 org.bouncycastle:bcprov-jdk15on:1.61
org.checkerframework:checker-qual:2.5.2 org.checkerframework:checker-qual:2.5.2

View file

@ -2,13 +2,15 @@
# Manual edits can break the build and are not advised. # Manual edits can break the build and are not advised.
# This file is expected to be part of source control. # This file is expected to be part of source control.
com.beust:jcommander:1.60 com.beust:jcommander:1.60
com.fasterxml.jackson.core:jackson-core:2.9.6 com.fasterxml.jackson.core:jackson-core:2.9.9
com.google.api-client:google-api-client:1.29.2 com.google.api-client:google-api-client:1.29.2
com.google.apis:google-api-services-cloudkms:v1-rev12-1.22.0 com.google.apis:google-api-services-cloudkms:v1-rev12-1.22.0
com.google.apis:google-api-services-monitoring:v3-rev426-1.23.0 com.google.apis:google-api-services-monitoring:v3-rev426-1.23.0
com.google.apis:google-api-services-storage:v1-rev150-1.22.0 com.google.apis:google-api-services-storage:v1-rev150-1.22.0
com.google.appengine:appengine-api-1.0-sdk:1.9.48 com.google.appengine:appengine-api-1.0-sdk:1.9.48
com.google.appengine:appengine-testing:1.9.58 com.google.appengine:appengine-testing:1.9.58
com.google.auth:google-auth-library-credentials:0.16.1
com.google.auth:google-auth-library-oauth2-http:0.16.1
com.google.auto.value:auto-value-annotations:1.6.3 com.google.auto.value:auto-value-annotations:1.6.3
com.google.auto.value:auto-value:1.6.3 com.google.auto.value:auto-value:1.6.3
com.google.code.findbugs:jsr305:3.0.2 com.google.code.findbugs:jsr305:3.0.2
@ -20,17 +22,17 @@ com.google.flogger:flogger:0.1
com.google.guava:failureaccess:1.0.1 com.google.guava:failureaccess:1.0.1
com.google.guava:guava:27.1-jre com.google.guava:guava:27.1-jre
com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava
com.google.http-client:google-http-client-jackson2:1.29.2 com.google.http-client:google-http-client-jackson2:1.30.1
com.google.http-client:google-http-client:1.29.2 com.google.http-client:google-http-client:1.30.1
com.google.j2objc:j2objc-annotations:1.1 com.google.j2objc:j2objc-annotations:1.3
com.google.monitoring-client:metrics:1.0.4 com.google.monitoring-client:metrics:1.0.4
com.google.monitoring-client:stackdriver:1.0.4 com.google.monitoring-client:stackdriver:1.0.4
com.google.oauth-client:google-oauth-client:1.29.2 com.google.oauth-client:google-oauth-client:1.29.2
com.google.re2j:re2j:1.1 com.google.re2j:re2j:1.1
com.ibm.icu:icu4j:57.1 com.ibm.icu:icu4j:57.1
commons-codec:commons-codec:1.10 commons-codec:commons-codec:1.11
commons-logging:commons-logging:1.2 commons-logging:commons-logging:1.2
io.grpc:grpc-context:1.18.0 io.grpc:grpc-context:1.19.0
io.netty:netty-buffer:4.1.31.Final io.netty:netty-buffer:4.1.31.Final
io.netty:netty-codec-http:4.1.31.Final io.netty:netty-codec-http:4.1.31.Final
io.netty:netty-codec:4.1.31.Final io.netty:netty-codec:4.1.31.Final
@ -39,15 +41,15 @@ io.netty:netty-handler:4.1.31.Final
io.netty:netty-resolver:4.1.31.Final io.netty:netty-resolver:4.1.31.Final
io.netty:netty-tcnative-boringssl-static:2.0.22.Final io.netty:netty-tcnative-boringssl-static:2.0.22.Final
io.netty:netty-transport:4.1.31.Final io.netty:netty-transport:4.1.31.Final
io.opencensus:opencensus-api:0.19.2 io.opencensus:opencensus-api:0.21.0
io.opencensus:opencensus-contrib-http-util:0.19.2 io.opencensus:opencensus-contrib-http-util:0.21.0
javax.activation:activation:1.1 javax.activation:activation:1.1
javax.inject:javax.inject:1 javax.inject:javax.inject:1
javax.mail:mail:1.4 javax.mail:mail:1.4
javax.xml.bind:jaxb-api:2.3.0 javax.xml.bind:jaxb-api:2.3.0
joda-time:joda-time:2.9.2 joda-time:joda-time:2.9.2
org.apache.httpcomponents:httpclient:4.5.5 org.apache.httpcomponents:httpclient:4.5.8
org.apache.httpcomponents:httpcore:4.4.9 org.apache.httpcomponents:httpcore:4.4.11
org.bouncycastle:bcpkix-jdk15on:1.61 org.bouncycastle:bcpkix-jdk15on:1.61
org.bouncycastle:bcprov-jdk15on:1.61 org.bouncycastle:bcprov-jdk15on:1.61
org.checkerframework:checker-qual:2.5.2 org.checkerframework:checker-qual:2.5.2

View file

@ -14,8 +14,6 @@
package google.registry.proxy; package google.registry.proxy;
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.googleapis.util.Utils;
import com.google.api.services.monitoring.v3.Monitoring; import com.google.api.services.monitoring.v3.Monitoring;
import com.google.api.services.monitoring.v3.model.MonitoredResource; import com.google.api.services.monitoring.v3.model.MonitoredResource;
import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap;
@ -29,6 +27,7 @@ import dagger.Module;
import dagger.Provides; import dagger.Provides;
import google.registry.proxy.ProxyConfig.Environment; import google.registry.proxy.ProxyConfig.Environment;
import google.registry.proxy.metric.MetricParameters; import google.registry.proxy.metric.MetricParameters;
import google.registry.util.GoogleCredentialsBundle;
import javax.inject.Singleton; import javax.inject.Singleton;
/** Module that provides necessary bindings to instantiate a {@link MetricReporter} */ /** Module that provides necessary bindings to instantiate a {@link MetricReporter} */
@ -39,9 +38,12 @@ public class MetricsModule {
@Singleton @Singleton
@Provides @Provides
static Monitoring provideMonitoring(GoogleCredential credential, ProxyConfig config) { static Monitoring provideMonitoring(GoogleCredentialsBundle credentialsBundle,
ProxyConfig config) {
return new Monitoring.Builder( return new Monitoring.Builder(
Utils.getDefaultTransport(), Utils.getDefaultJsonFactory(), credential) credentialsBundle.getHttpTransport(),
credentialsBundle.getJsonFactory(),
credentialsBundle.getHttpRequestInitializer())
.setApplicationName(config.projectId) .setApplicationName(config.projectId)
.build(); .build();
} }

View file

@ -20,11 +20,11 @@ import static google.registry.proxy.ProxyConfig.getProxyConfig;
import com.beust.jcommander.JCommander; import com.beust.jcommander.JCommander;
import com.beust.jcommander.Parameter; import com.beust.jcommander.Parameter;
import com.beust.jcommander.ParameterException; import com.beust.jcommander.ParameterException;
import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.client.googleapis.util.Utils;
import com.google.api.services.cloudkms.v1.CloudKMS; import com.google.api.services.cloudkms.v1.CloudKMS;
import com.google.api.services.cloudkms.v1.model.DecryptRequest; import com.google.api.services.cloudkms.v1.model.DecryptRequest;
import com.google.api.services.storage.Storage; import com.google.api.services.storage.Storage;
import com.google.auth.oauth2.AccessToken;
import com.google.auth.oauth2.GoogleCredentials;
import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import com.google.common.flogger.LoggerConfig; import com.google.common.flogger.LoggerConfig;
@ -41,6 +41,7 @@ import google.registry.proxy.WebWhoisProtocolsModule.HttpsWhoisProtocol;
import google.registry.proxy.WhoisProtocolModule.WhoisProtocol; import google.registry.proxy.WhoisProtocolModule.WhoisProtocol;
import google.registry.proxy.handler.ProxyProtocolHandler; import google.registry.proxy.handler.ProxyProtocolHandler;
import google.registry.util.Clock; import google.registry.util.Clock;
import google.registry.util.GoogleCredentialsBundle;
import google.registry.util.SystemClock; import google.registry.util.SystemClock;
import io.netty.handler.logging.LogLevel; import io.netty.handler.logging.LogLevel;
import io.netty.handler.logging.LoggingHandler; import io.netty.handler.logging.LoggingHandler;
@ -50,6 +51,7 @@ import java.io.ByteArrayOutputStream;
import java.io.IOException; import java.io.IOException;
import java.util.Arrays; import java.util.Arrays;
import java.util.Base64; import java.util.Base64;
import java.util.Date;
import java.util.Optional; import java.util.Optional;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ExecutorService; import java.util.concurrent.ExecutorService;
@ -209,13 +211,13 @@ public class ProxyModule {
@Singleton @Singleton
@Provides @Provides
static GoogleCredential provideCredential(ProxyConfig config) { static GoogleCredentialsBundle provideCredential(ProxyConfig config) {
try { try {
GoogleCredential credential = GoogleCredential.getApplicationDefault(); GoogleCredentials credentials = GoogleCredentials.getApplicationDefault();
if (credential.createScopedRequired()) { if (credentials.createScopedRequired()) {
credential = credential.createScoped(config.gcpScopes); credentials = credentials.createScoped(config.gcpScopes);
} }
return credential; return GoogleCredentialsBundle.create(credentials);
} catch (IOException e) { } catch (IOException e) {
throw new RuntimeException("Unable to obtain OAuth2 credential.", e); throw new RuntimeException("Unable to obtain OAuth2 credential.", e);
} }
@ -226,36 +228,45 @@ public class ProxyModule {
@Provides @Provides
@Named("accessToken") @Named("accessToken")
static Supplier<String> provideAccessTokenSupplier( static Supplier<String> provideAccessTokenSupplier(
GoogleCredential credential, ProxyConfig config) { GoogleCredentialsBundle credentialsBundle, ProxyConfig config) {
return () -> { return () -> {
GoogleCredentials credentials = credentialsBundle.getGoogleCredentials();
AccessToken accessToken = credentials.getAccessToken();
Date nextExpirationTime =
new Date(
System.currentTimeMillis() + config.accessTokenRefreshBeforeExpirationSeconds * 1000);
// If we never obtained an access token, the expiration time is null. // If we never obtained an access token, the expiration time is null.
if (credential.getExpiresInSeconds() == null if (accessToken == null
// If we have an access token, make sure to refresh it ahead of time. // If we have an access token, make sure to refresh it ahead of time.
|| credential.getExpiresInSeconds() < config.accessTokenRefreshBeforeExpirationSeconds) { || accessToken.getExpirationTime().before(nextExpirationTime)) {
try { try {
credential.refreshToken(); credentials.refresh();
} catch (IOException e) { } catch (IOException e) {
throw new RuntimeException("Cannot refresh access token.", e); throw new RuntimeException("Cannot refresh access token.", e);
} }
} }
return credential.getAccessToken(); return credentials.getAccessToken().getTokenValue();
}; };
} }
@Singleton @Singleton
@Provides @Provides
static CloudKMS provideCloudKms(GoogleCredential credential, ProxyConfig config) { static CloudKMS provideCloudKms(GoogleCredentialsBundle credentialsBundle, ProxyConfig config) {
return new CloudKMS.Builder( return new CloudKMS.Builder(
Utils.getDefaultTransport(), Utils.getDefaultJsonFactory(), credential) credentialsBundle.getHttpTransport(),
credentialsBundle.getJsonFactory(),
credentialsBundle.getHttpRequestInitializer())
.setApplicationName(config.projectId) .setApplicationName(config.projectId)
.build(); .build();
} }
@Singleton @Singleton
@Provides @Provides
static Storage provideStorage(GoogleCredential credential, ProxyConfig config) { static Storage provideStorage(GoogleCredentialsBundle credentialsBundle, ProxyConfig config) {
return new Storage.Builder( return new Storage.Builder(
Utils.getDefaultTransport(), Utils.getDefaultJsonFactory(), credential) credentialsBundle.getHttpTransport(),
credentialsBundle.getJsonFactory(),
credentialsBundle.getHttpRequestInitializer())
.setApplicationName(config.projectId) .setApplicationName(config.projectId)
.build(); .build();
} }
@ -337,14 +348,14 @@ public class ProxyModule {
@Singleton @Singleton
@Component( @Component(
modules = { modules = {
ProxyModule.class, ProxyModule.class,
CertificateModule.class, CertificateModule.class,
HttpsRelayProtocolModule.class, HttpsRelayProtocolModule.class,
WhoisProtocolModule.class, WhoisProtocolModule.class,
WebWhoisProtocolsModule.class, WebWhoisProtocolsModule.class,
EppProtocolModule.class, EppProtocolModule.class,
HealthCheckProtocolModule.class, HealthCheckProtocolModule.class,
MetricsModule.class MetricsModule.class
}) })
interface ProxyComponent { interface ProxyComponent {

View file

@ -2,8 +2,11 @@ apply plugin: 'java'
dependencies { dependencies {
def deps = rootProject.dependencyMap def deps = rootProject.dependencyMap
compile deps['com.google.api-client:google-api-client']
compile deps['com.google.appengine:appengine-api-1.0-sdk'] compile deps['com.google.appengine:appengine-api-1.0-sdk']
compile deps['com.google.appengine:appengine-testing'] compile deps['com.google.appengine:appengine-testing']
compile deps['com.google.auth:google-auth-library-credentials']
compile deps['com.google.auth:google-auth-library-oauth2-http']
compile deps['com.google.auto.value:auto-value-annotations'] compile deps['com.google.auto.value:auto-value-annotations']
compile deps['com.google.code.findbugs:jsr305'] compile deps['com.google.code.findbugs:jsr305']
compile deps['com.google.dagger:dagger'] compile deps['com.google.dagger:dagger']

View file

@ -1,8 +1,12 @@
# This is a Gradle generated file for dependency locking. # This is a Gradle generated file for dependency locking.
# Manual edits can break the build and are not advised. # Manual edits can break the build and are not advised.
# This file is expected to be part of source control. # This file is expected to be part of source control.
com.fasterxml.jackson.core:jackson-core:2.9.9
com.google.api-client:google-api-client:1.29.2
com.google.appengine:appengine-api-1.0-sdk:1.9.48 com.google.appengine:appengine-api-1.0-sdk:1.9.48
com.google.appengine:appengine-testing:1.9.58 com.google.appengine:appengine-testing:1.9.58
com.google.auth:google-auth-library-credentials:0.16.1
com.google.auth:google-auth-library-oauth2-http:0.16.1
com.google.auto.value:auto-value-annotations:1.6.3 com.google.auto.value:auto-value-annotations:1.6.3
com.google.code.findbugs:jsr305:3.0.2 com.google.code.findbugs:jsr305:3.0.2
com.google.dagger:dagger:2.21 com.google.dagger:dagger:2.21
@ -11,14 +15,24 @@ com.google.flogger:flogger:0.1
com.google.guava:failureaccess:1.0.1 com.google.guava:failureaccess:1.0.1
com.google.guava:guava:27.1-jre com.google.guava:guava:27.1-jre
com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava
com.google.j2objc:j2objc-annotations:1.1 com.google.http-client:google-http-client-jackson2:1.30.1
com.google.http-client:google-http-client:1.30.1
com.google.j2objc:j2objc-annotations:1.3
com.google.oauth-client:google-oauth-client:1.29.2
com.google.re2j:re2j:1.1 com.google.re2j:re2j:1.1
com.ibm.icu:icu4j:57.1 com.ibm.icu:icu4j:57.1
commons-codec:commons-codec:1.11
commons-logging:commons-logging:1.2
io.grpc:grpc-context:1.19.0
io.opencensus:opencensus-api:0.21.0
io.opencensus:opencensus-contrib-http-util:0.21.0
javax.activation:activation:1.1 javax.activation:activation:1.1
javax.inject:javax.inject:1 javax.inject:javax.inject:1
javax.mail:mail:1.4 javax.mail:mail:1.4
javax.xml.bind:jaxb-api:2.3.0 javax.xml.bind:jaxb-api:2.3.0
joda-time:joda-time:2.9.2 joda-time:joda-time:2.9.2
org.apache.httpcomponents:httpclient:4.5.8
org.apache.httpcomponents:httpcore:4.4.11
org.checkerframework:checker-qual:2.5.2 org.checkerframework:checker-qual:2.5.2
org.codehaus.mojo:animal-sniffer-annotations:1.17 org.codehaus.mojo:animal-sniffer-annotations:1.17
org.yaml:snakeyaml:1.17 org.yaml:snakeyaml:1.17

View file

@ -1,8 +1,12 @@
# This is a Gradle generated file for dependency locking. # This is a Gradle generated file for dependency locking.
# Manual edits can break the build and are not advised. # Manual edits can break the build and are not advised.
# This file is expected to be part of source control. # This file is expected to be part of source control.
com.fasterxml.jackson.core:jackson-core:2.9.9
com.google.api-client:google-api-client:1.29.2
com.google.appengine:appengine-api-1.0-sdk:1.9.48 com.google.appengine:appengine-api-1.0-sdk:1.9.48
com.google.appengine:appengine-testing:1.9.58 com.google.appengine:appengine-testing:1.9.58
com.google.auth:google-auth-library-credentials:0.16.1
com.google.auth:google-auth-library-oauth2-http:0.16.1
com.google.auto.value:auto-value-annotations:1.6.3 com.google.auto.value:auto-value-annotations:1.6.3
com.google.code.findbugs:jsr305:3.0.2 com.google.code.findbugs:jsr305:3.0.2
com.google.dagger:dagger:2.21 com.google.dagger:dagger:2.21
@ -11,14 +15,24 @@ com.google.flogger:flogger:0.1
com.google.guava:failureaccess:1.0.1 com.google.guava:failureaccess:1.0.1
com.google.guava:guava:27.1-jre com.google.guava:guava:27.1-jre
com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava
com.google.j2objc:j2objc-annotations:1.1 com.google.http-client:google-http-client-jackson2:1.30.1
com.google.http-client:google-http-client:1.30.1
com.google.j2objc:j2objc-annotations:1.3
com.google.oauth-client:google-oauth-client:1.29.2
com.google.re2j:re2j:1.1 com.google.re2j:re2j:1.1
com.ibm.icu:icu4j:57.1 com.ibm.icu:icu4j:57.1
commons-codec:commons-codec:1.11
commons-logging:commons-logging:1.2
io.grpc:grpc-context:1.19.0
io.opencensus:opencensus-api:0.21.0
io.opencensus:opencensus-contrib-http-util:0.21.0
javax.activation:activation:1.1 javax.activation:activation:1.1
javax.inject:javax.inject:1 javax.inject:javax.inject:1
javax.mail:mail:1.4 javax.mail:mail:1.4
javax.xml.bind:jaxb-api:2.3.0 javax.xml.bind:jaxb-api:2.3.0
joda-time:joda-time:2.9.2 joda-time:joda-time:2.9.2
org.apache.httpcomponents:httpclient:4.5.8
org.apache.httpcomponents:httpcore:4.4.11
org.checkerframework:checker-qual:2.5.2 org.checkerframework:checker-qual:2.5.2
org.codehaus.mojo:animal-sniffer-annotations:1.17 org.codehaus.mojo:animal-sniffer-annotations:1.17
org.yaml:snakeyaml:1.17 org.yaml:snakeyaml:1.17

View file

@ -1,8 +1,12 @@
# This is a Gradle generated file for dependency locking. # This is a Gradle generated file for dependency locking.
# Manual edits can break the build and are not advised. # Manual edits can break the build and are not advised.
# This file is expected to be part of source control. # This file is expected to be part of source control.
com.fasterxml.jackson.core:jackson-core:2.9.9
com.google.api-client:google-api-client:1.29.2
com.google.appengine:appengine-api-1.0-sdk:1.9.48 com.google.appengine:appengine-api-1.0-sdk:1.9.48
com.google.appengine:appengine-testing:1.9.58 com.google.appengine:appengine-testing:1.9.58
com.google.auth:google-auth-library-credentials:0.16.1
com.google.auth:google-auth-library-oauth2-http:0.16.1
com.google.auto.value:auto-value-annotations:1.6.3 com.google.auto.value:auto-value-annotations:1.6.3
com.google.auto.value:auto-value:1.6.3 com.google.auto.value:auto-value:1.6.3
com.google.code.findbugs:jsr305:3.0.2 com.google.code.findbugs:jsr305:3.0.2
@ -12,14 +16,24 @@ com.google.flogger:flogger:0.1
com.google.guava:failureaccess:1.0.1 com.google.guava:failureaccess:1.0.1
com.google.guava:guava:27.1-jre com.google.guava:guava:27.1-jre
com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava
com.google.j2objc:j2objc-annotations:1.1 com.google.http-client:google-http-client-jackson2:1.30.1
com.google.http-client:google-http-client:1.30.1
com.google.j2objc:j2objc-annotations:1.3
com.google.oauth-client:google-oauth-client:1.29.2
com.google.re2j:re2j:1.1 com.google.re2j:re2j:1.1
com.ibm.icu:icu4j:57.1 com.ibm.icu:icu4j:57.1
commons-codec:commons-codec:1.11
commons-logging:commons-logging:1.2
io.grpc:grpc-context:1.19.0
io.opencensus:opencensus-api:0.21.0
io.opencensus:opencensus-contrib-http-util:0.21.0
javax.activation:activation:1.1 javax.activation:activation:1.1
javax.inject:javax.inject:1 javax.inject:javax.inject:1
javax.mail:mail:1.4 javax.mail:mail:1.4
javax.xml.bind:jaxb-api:2.3.0 javax.xml.bind:jaxb-api:2.3.0
joda-time:joda-time:2.9.2 joda-time:joda-time:2.9.2
org.apache.httpcomponents:httpclient:4.5.8
org.apache.httpcomponents:httpcore:4.4.11
org.checkerframework:checker-qual:2.5.2 org.checkerframework:checker-qual:2.5.2
org.codehaus.mojo:animal-sniffer-annotations:1.17 org.codehaus.mojo:animal-sniffer-annotations:1.17
org.yaml:snakeyaml:1.17 org.yaml:snakeyaml:1.17

View file

@ -0,0 +1,70 @@
// Copyright 2019 The Nomulus Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package google.registry.util;
import static com.google.common.base.Preconditions.checkNotNull;
import com.google.api.client.googleapis.util.Utils;
import com.google.api.client.http.HttpRequestInitializer;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;
/**
* Helper class to provide {@link HttpTransport}, {@link JsonFactory} and {@link
* HttpRequestInitializer} for a given {@link GoogleCredentials}. These classes are normally needed
* for creating the instance of a GCP client.
*/
public class GoogleCredentialsBundle {
private GoogleCredentials googleCredentials;
private HttpTransport httpTransport;
private JsonFactory jsonFactory;
private HttpRequestInitializer httpRequestInitializer;
private GoogleCredentialsBundle(GoogleCredentials googleCredentials) {
checkNotNull(googleCredentials);
this.googleCredentials = googleCredentials;
this.httpTransport = Utils.getDefaultTransport();
this.jsonFactory = Utils.getDefaultJsonFactory();
this.httpRequestInitializer = new HttpCredentialsAdapter(googleCredentials);
}
/** Creates a {@link GoogleCredentialsBundle} instance from given {@link GoogleCredentials}. */
public static GoogleCredentialsBundle create(GoogleCredentials credentials) {
return new GoogleCredentialsBundle(credentials);
}
/** Returns the same {@link GoogleCredentials} used to create this object. */
public GoogleCredentials getGoogleCredentials() {
return googleCredentials;
}
/** Returns the instance of {@link HttpTransport}. */
public HttpTransport getHttpTransport() {
return httpTransport;
}
/** Returns the instance of {@link JsonFactory}. */
public JsonFactory getJsonFactory() {
return jsonFactory;
}
/** Returns the instance of {@link HttpRequestInitializer}. */
public HttpRequestInitializer getHttpRequestInitializer() {
return httpRequestInitializer;
}
}