diff --git a/java/google/registry/backup/CommitLogCheckpointAction.java b/java/google/registry/backup/CommitLogCheckpointAction.java index 7d5538775..5bf6d5def 100644 --- a/java/google/registry/backup/CommitLogCheckpointAction.java +++ b/java/google/registry/backup/CommitLogCheckpointAction.java @@ -26,6 +26,7 @@ import com.googlecode.objectify.VoidWork; import google.registry.model.ofy.CommitLogCheckpoint; import google.registry.model.ofy.CommitLogCheckpointRoot; import google.registry.request.Action; +import google.registry.request.auth.Auth; import google.registry.util.Clock; import google.registry.util.FormattingLogger; import google.registry.util.TaskEnqueuer; @@ -43,9 +44,11 @@ import org.joda.time.DateTime; *

This action's supported method is GET rather than POST because it gets invoked via cron. */ @Action( - path = "/_dr/cron/commitLogCheckpoint", - method = Action.Method.GET, - automaticallyPrintOk = true) + path = "/_dr/cron/commitLogCheckpoint", + method = Action.Method.GET, + automaticallyPrintOk = true, + auth = Auth.AUTH_INTERNAL_ONLY +) public final class CommitLogCheckpointAction implements Runnable { private static final FormattingLogger logger = getLoggerForCallerClass(); diff --git a/java/google/registry/backup/DeleteOldCommitLogsAction.java b/java/google/registry/backup/DeleteOldCommitLogsAction.java index 33dcb6f7f..52571c45f 100644 --- a/java/google/registry/backup/DeleteOldCommitLogsAction.java +++ b/java/google/registry/backup/DeleteOldCommitLogsAction.java @@ -37,6 +37,7 @@ import google.registry.model.ofy.CommitLogMutation; import google.registry.model.translators.CommitLogRevisionsTranslatorFactory; import google.registry.request.Action; import google.registry.request.Response; +import google.registry.request.auth.Auth; import google.registry.util.Clock; import google.registry.util.FormattingLogger; import javax.inject.Inject; @@ -60,7 +61,10 @@ import org.joda.time.Duration; * EppResource. * */ -@Action(path = "/_dr/task/deleteOldCommitLogs") +@Action( + path = "/_dr/task/deleteOldCommitLogs", + auth = Auth.AUTH_INTERNAL_ONLY +) public final class DeleteOldCommitLogsAction implements Runnable { private static final int NUM_REDUCE_SHARDS = 10; diff --git a/java/google/registry/backup/ExportCommitLogDiffAction.java b/java/google/registry/backup/ExportCommitLogDiffAction.java index 53a3cda08..147abfe76 100644 --- a/java/google/registry/backup/ExportCommitLogDiffAction.java +++ b/java/google/registry/backup/ExportCommitLogDiffAction.java @@ -47,6 +47,7 @@ import google.registry.model.ofy.CommitLogManifest; import google.registry.model.ofy.CommitLogMutation; import google.registry.request.Action; import google.registry.request.Parameter; +import google.registry.request.auth.Auth; import google.registry.util.FormattingLogger; import java.io.IOException; import java.io.OutputStream; @@ -60,9 +61,11 @@ import org.joda.time.DateTime; /** Action that exports the diff between two commit log checkpoints to GCS. */ @Action( - path = ExportCommitLogDiffAction.PATH, - method = Action.Method.POST, - automaticallyPrintOk = true) + path = ExportCommitLogDiffAction.PATH, + method = Action.Method.POST, + automaticallyPrintOk = true, + auth = Auth.AUTH_INTERNAL_ONLY +) public final class ExportCommitLogDiffAction implements Runnable { private static final FormattingLogger logger = getLoggerForCallerClass(); diff --git a/java/google/registry/backup/RestoreCommitLogsAction.java b/java/google/registry/backup/RestoreCommitLogsAction.java index d963733ad..f7665acbc 100644 --- a/java/google/registry/backup/RestoreCommitLogsAction.java +++ b/java/google/registry/backup/RestoreCommitLogsAction.java @@ -42,7 +42,6 @@ import google.registry.model.ofy.CommitLogMutation; import google.registry.request.Action; import google.registry.request.Parameter; import google.registry.request.auth.Auth; -import google.registry.request.auth.AuthLevel; import google.registry.util.FormattingLogger; import google.registry.util.Retrier; import java.io.IOException; @@ -59,15 +58,10 @@ import org.joda.time.DateTime; /** Restore Registry 2 commit logs from GCS to Datastore. */ @Action( - path = RestoreCommitLogsAction.PATH, - method = Action.Method.POST, - automaticallyPrintOk = true, - auth = - @Auth( - methods = {Auth.AuthMethod.INTERNAL, Auth.AuthMethod.API}, - minimumLevel = AuthLevel.APP, - userPolicy = Auth.UserPolicy.ADMIN - ) + path = RestoreCommitLogsAction.PATH, + method = Action.Method.POST, + automaticallyPrintOk = true, + auth = Auth.AUTH_INTERNAL_OR_ADMIN ) public class RestoreCommitLogsAction implements Runnable { diff --git a/java/google/registry/batch/BUILD b/java/google/registry/batch/BUILD index ae92f08f2..16853707a 100644 --- a/java/google/registry/batch/BUILD +++ b/java/google/registry/batch/BUILD @@ -19,6 +19,7 @@ java_library( "//java/google/registry/pricing", "//java/google/registry/request", "//java/google/registry/request:modules", + "//java/google/registry/request/auth", "//java/google/registry/util", "//third_party/java/objectify:objectify-v4_1", "@com_google_apis_google_api_services_bigquery", diff --git a/java/google/registry/batch/DeleteContactsAndHostsAction.java b/java/google/registry/batch/DeleteContactsAndHostsAction.java index b47d7ee72..af2efab63 100644 --- a/java/google/registry/batch/DeleteContactsAndHostsAction.java +++ b/java/google/registry/batch/DeleteContactsAndHostsAction.java @@ -85,6 +85,7 @@ import google.registry.model.reporting.HistoryEntry; import google.registry.model.transfer.TransferStatus; import google.registry.request.Action; import google.registry.request.Response; +import google.registry.request.auth.Auth; import google.registry.util.Clock; import google.registry.util.FormattingLogger; import google.registry.util.NonFinalForTesting; @@ -103,7 +104,10 @@ import org.joda.time.DateTime; * over all domains and domain applications and checking for any references to the contacts/hosts in * pending deletion. */ -@Action(path = "/_dr/task/deleteContactsAndHosts") +@Action( + path = "/_dr/task/deleteContactsAndHosts", + auth = Auth.AUTH_INTERNAL_ONLY +) public class DeleteContactsAndHostsAction implements Runnable { static final String KIND_CONTACT = getKind(ContactResource.class); diff --git a/java/google/registry/batch/DeleteProberDataAction.java b/java/google/registry/batch/DeleteProberDataAction.java index 32626e01d..1dcaa51f4 100644 --- a/java/google/registry/batch/DeleteProberDataAction.java +++ b/java/google/registry/batch/DeleteProberDataAction.java @@ -40,6 +40,7 @@ import google.registry.model.registry.Registry.TldType; import google.registry.request.Action; import google.registry.request.Parameter; import google.registry.request.Response; +import google.registry.request.auth.Auth; import google.registry.util.FormattingLogger; import google.registry.util.PipelineUtils; import java.util.List; @@ -51,7 +52,11 @@ import javax.inject.Inject; * *

See: https://www.youtube.com/watch?v=xuuv0syoHnM */ -@Action(path = "/_dr/task/deleteProberData", method = POST) +@Action( + path = "/_dr/task/deleteProberData", + method = POST, + auth = Auth.AUTH_INTERNAL_ONLY +) public class DeleteProberDataAction implements Runnable { private static final FormattingLogger logger = FormattingLogger.getLoggerForCallerClass(); diff --git a/java/google/registry/batch/ExpandRecurringBillingEventsAction.java b/java/google/registry/batch/ExpandRecurringBillingEventsAction.java index 1cf85a879..03e2862ff 100644 --- a/java/google/registry/batch/ExpandRecurringBillingEventsAction.java +++ b/java/google/registry/batch/ExpandRecurringBillingEventsAction.java @@ -52,6 +52,7 @@ import google.registry.model.registry.Registry; import google.registry.request.Action; import google.registry.request.Parameter; import google.registry.request.Response; +import google.registry.request.auth.Auth; import google.registry.util.Clock; import google.registry.util.FormattingLogger; import java.util.Set; @@ -67,7 +68,10 @@ import org.joda.time.DateTime; * be expanded as a result of the job (the exclusive upper bound being the execution time of the * job). */ -@Action(path = "/_dr/task/expandRecurringBillingEvents") +@Action( + path = "/_dr/task/expandRecurringBillingEvents", + auth = Auth.AUTH_INTERNAL_ONLY +) public class ExpandRecurringBillingEventsAction implements Runnable { public static final String PARAM_CURSOR_TIME = "cursorTime"; diff --git a/java/google/registry/batch/MapreduceEntityCleanupAction.java b/java/google/registry/batch/MapreduceEntityCleanupAction.java index 7cbbc258d..54d63e8a4 100644 --- a/java/google/registry/batch/MapreduceEntityCleanupAction.java +++ b/java/google/registry/batch/MapreduceEntityCleanupAction.java @@ -25,6 +25,7 @@ import google.registry.mapreduce.MapreduceRunner; import google.registry.request.Action; import google.registry.request.Parameter; import google.registry.request.Response; +import google.registry.request.auth.Auth; import google.registry.util.Clock; import google.registry.util.FormattingLogger; import java.util.Set; @@ -69,7 +70,10 @@ import org.joda.time.DateTime; * are not in FINALIZED or STOPPED state. */ -@Action(path = "/_dr/task/mapreduceEntityCleanup") +@Action( + path = "/_dr/task/mapreduceEntityCleanup", + auth = Auth.AUTH_INTERNAL_ONLY +) public class MapreduceEntityCleanupAction implements Runnable { private static final int DEFAULT_DAYS_OLD = 180; diff --git a/java/google/registry/batch/RefreshDnsOnHostRenameAction.java b/java/google/registry/batch/RefreshDnsOnHostRenameAction.java index 9858e6588..14639c332 100644 --- a/java/google/registry/batch/RefreshDnsOnHostRenameAction.java +++ b/java/google/registry/batch/RefreshDnsOnHostRenameAction.java @@ -52,6 +52,7 @@ import google.registry.model.domain.DomainResource; import google.registry.model.host.HostResource; import google.registry.request.Action; import google.registry.request.Response; +import google.registry.request.auth.Auth; import google.registry.util.Clock; import google.registry.util.FormattingLogger; import google.registry.util.NonFinalForTesting; @@ -67,7 +68,10 @@ import javax.inject.Named; import org.joda.time.DateTime; /** Performs batched DNS refreshes for applicable domains following a host rename. */ -@Action(path = "/_dr/task/refreshDnsOnHostRename") +@Action( + path = "/_dr/task/refreshDnsOnHostRename", + auth = Auth.AUTH_INTERNAL_ONLY +) public class RefreshDnsOnHostRenameAction implements Runnable { private static final FormattingLogger logger = FormattingLogger.getLoggerForCallerClass(); diff --git a/java/google/registry/batch/VerifyEntityIntegrityAction.java b/java/google/registry/batch/VerifyEntityIntegrityAction.java index 558921ce9..52b069842 100644 --- a/java/google/registry/batch/VerifyEntityIntegrityAction.java +++ b/java/google/registry/batch/VerifyEntityIntegrityAction.java @@ -59,6 +59,7 @@ import google.registry.model.index.ForeignKeyIndex.ForeignKeyHostIndex; import google.registry.model.transfer.TransferData.TransferServerApproveEntity; import google.registry.request.Action; import google.registry.request.Response; +import google.registry.request.auth.Auth; import google.registry.util.FormattingLogger; import google.registry.util.NonFinalForTesting; import java.io.Serializable; @@ -88,7 +89,11 @@ import org.joda.time.DateTime; * fullyQualifiedDomainName. * */ -@Action(path = "/_dr/task/verifyEntityIntegrity", method = POST) +@Action( + path = "/_dr/task/verifyEntityIntegrity", + method = POST, + auth = Auth.AUTH_INTERNAL_ONLY +) public class VerifyEntityIntegrityAction implements Runnable { private static final FormattingLogger logger = getLoggerForCallerClass(); diff --git a/java/google/registry/cron/BUILD b/java/google/registry/cron/BUILD index 8d512b5ec..21ac68160 100644 --- a/java/google/registry/cron/BUILD +++ b/java/google/registry/cron/BUILD @@ -10,6 +10,7 @@ java_library( deps = [ "//java/google/registry/model", "//java/google/registry/request", + "//java/google/registry/request/auth", "//java/google/registry/util", "//third_party/java/objectify:objectify-v4_1", "@com_google_appengine_api_1_0_sdk", diff --git a/java/google/registry/cron/CommitLogFanoutAction.java b/java/google/registry/cron/CommitLogFanoutAction.java index 14daed58e..343bdf4ff 100644 --- a/java/google/registry/cron/CommitLogFanoutAction.java +++ b/java/google/registry/cron/CommitLogFanoutAction.java @@ -23,12 +23,17 @@ import com.google.common.base.Optional; import google.registry.model.ofy.CommitLogBucket; import google.registry.request.Action; import google.registry.request.Parameter; +import google.registry.request.auth.Auth; import google.registry.util.TaskEnqueuer; import java.util.Random; import javax.inject.Inject; /** Action for fanning out cron tasks for each commit log bucket. */ -@Action(path = "/_dr/cron/commitLogFanout", automaticallyPrintOk = true) +@Action( + path = "/_dr/cron/commitLogFanout", + automaticallyPrintOk = true, + auth = Auth.AUTH_INTERNAL_ONLY +) public final class CommitLogFanoutAction implements Runnable { public static final String BUCKET_PARAM = "bucket"; diff --git a/java/google/registry/cron/TldFanoutAction.java b/java/google/registry/cron/TldFanoutAction.java index c6a69f58d..f25222f34 100644 --- a/java/google/registry/cron/TldFanoutAction.java +++ b/java/google/registry/cron/TldFanoutAction.java @@ -41,6 +41,7 @@ import google.registry.request.Parameter; import google.registry.request.ParameterMap; import google.registry.request.RequestParameters; import google.registry.request.Response; +import google.registry.request.auth.Auth; import google.registry.util.TaskEnqueuer; import java.util.Random; import java.util.Set; @@ -70,7 +71,11 @@ import javax.inject.Inject; * This patharg is mostly useful for aesthetic purposes, since tasks are already namespaced. * */ -@Action(path = "/_dr/cron/fanout", automaticallyPrintOk = true) +@Action( + path = "/_dr/cron/fanout", + automaticallyPrintOk = true, + auth = Auth.AUTH_INTERNAL_ONLY +) public final class TldFanoutAction implements Runnable { private static final String ENDPOINT_PARAM = "endpoint"; diff --git a/java/google/registry/dns/BUILD b/java/google/registry/dns/BUILD index 9d2012fb9..bf4302773 100644 --- a/java/google/registry/dns/BUILD +++ b/java/google/registry/dns/BUILD @@ -25,6 +25,7 @@ java_library( "//java/google/registry/model", "//java/google/registry/monitoring/metrics", "//java/google/registry/request", + "//java/google/registry/request/auth", "//java/google/registry/util", "//third_party/java/objectify:objectify-v4_1", "@com_google_appengine_api_1_0_sdk", diff --git a/java/google/registry/dns/PublishDnsUpdatesAction.java b/java/google/registry/dns/PublishDnsUpdatesAction.java index 436869ad5..6024e72e4 100644 --- a/java/google/registry/dns/PublishDnsUpdatesAction.java +++ b/java/google/registry/dns/PublishDnsUpdatesAction.java @@ -26,6 +26,7 @@ import google.registry.request.Action; import google.registry.request.HttpException.ServiceUnavailableException; import google.registry.request.Parameter; import google.registry.request.RequestParameters; +import google.registry.request.auth.Auth; import google.registry.util.DomainNameUtils; import google.registry.util.FormattingLogger; import java.util.Set; @@ -34,7 +35,12 @@ import javax.inject.Inject; import org.joda.time.Duration; /** Task that sends domain and host updates to the DNS server. */ -@Action(path = PublishDnsUpdatesAction.PATH, method = POST, automaticallyPrintOk = true) +@Action( + path = PublishDnsUpdatesAction.PATH, + method = POST, + automaticallyPrintOk = true, + auth = Auth.AUTH_INTERNAL_ONLY +) public final class PublishDnsUpdatesAction implements Runnable, Callable { public static final String PATH = "/_dr/task/publishDnsUpdates"; diff --git a/java/google/registry/dns/ReadDnsQueueAction.java b/java/google/registry/dns/ReadDnsQueueAction.java index ffc313a39..ec1460123 100644 --- a/java/google/registry/dns/ReadDnsQueueAction.java +++ b/java/google/registry/dns/ReadDnsQueueAction.java @@ -40,6 +40,7 @@ import google.registry.model.registry.Registry; import google.registry.request.Action; import google.registry.request.Parameter; import google.registry.request.RequestParameters; +import google.registry.request.auth.Auth; import google.registry.util.FormattingLogger; import google.registry.util.TaskEnqueuer; import java.io.UnsupportedEncodingException; @@ -64,7 +65,11 @@ import org.joda.time.Duration; * not. * */ -@Action(path = "/_dr/cron/readDnsQueue", automaticallyPrintOk = true) +@Action( + path = "/_dr/cron/readDnsQueue", + automaticallyPrintOk = true, + auth = Auth.AUTH_INTERNAL_ONLY +) public final class ReadDnsQueueAction implements Runnable { public static final String KEEP_TASKS_PARAM = "keepTasks"; diff --git a/java/google/registry/dns/RefreshDnsAction.java b/java/google/registry/dns/RefreshDnsAction.java index 4c880d515..64920eb8b 100644 --- a/java/google/registry/dns/RefreshDnsAction.java +++ b/java/google/registry/dns/RefreshDnsAction.java @@ -26,11 +26,16 @@ import google.registry.request.Action; import google.registry.request.HttpException.BadRequestException; import google.registry.request.HttpException.NotFoundException; import google.registry.request.Parameter; +import google.registry.request.auth.Auth; import google.registry.util.Clock; import javax.inject.Inject; /** Action that manually triggers refresh of DNS information. */ -@Action(path = "/_dr/dnsRefresh", automaticallyPrintOk = true) +@Action( + path = "/_dr/dnsRefresh", + automaticallyPrintOk = true, + auth = Auth.AUTH_INTERNAL_ONLY +) public final class RefreshDnsAction implements Runnable { @Inject Clock clock; diff --git a/java/google/registry/export/BigqueryPollJobAction.java b/java/google/registry/export/BigqueryPollJobAction.java index 836e4f4e9..5b957266f 100644 --- a/java/google/registry/export/BigqueryPollJobAction.java +++ b/java/google/registry/export/BigqueryPollJobAction.java @@ -31,6 +31,7 @@ import google.registry.request.Header; import google.registry.request.HttpException.BadRequestException; import google.registry.request.HttpException.NotModifiedException; import google.registry.request.Payload; +import google.registry.request.auth.Auth; import google.registry.util.FormattingLogger; import google.registry.util.TaskEnqueuer; import java.io.ByteArrayInputStream; @@ -46,9 +47,11 @@ import org.joda.time.Duration; * completion state; otherwise it will return a failure code so that the task will be retried. */ @Action( - path = BigqueryPollJobAction.PATH, - method = {Action.Method.GET, Action.Method.POST}, - automaticallyPrintOk = true) + path = BigqueryPollJobAction.PATH, + method = {Action.Method.GET, Action.Method.POST}, + automaticallyPrintOk = true, + auth = Auth.AUTH_INTERNAL_ONLY +) public class BigqueryPollJobAction implements Runnable { private static final FormattingLogger logger = FormattingLogger.getLoggerForCallerClass(); diff --git a/java/google/registry/export/CheckSnapshotAction.java b/java/google/registry/export/CheckSnapshotAction.java index 0b9a357c7..540128728 100644 --- a/java/google/registry/export/CheckSnapshotAction.java +++ b/java/google/registry/export/CheckSnapshotAction.java @@ -36,6 +36,7 @@ import google.registry.request.HttpException.NotModifiedException; import google.registry.request.Parameter; import google.registry.request.RequestMethod; import google.registry.request.Response; +import google.registry.request.auth.Auth; import google.registry.util.FormattingLogger; import java.util.Set; import javax.inject.Inject; @@ -49,7 +50,8 @@ import org.joda.time.format.PeriodFormat; @Action( path = CheckSnapshotAction.PATH, method = {POST, GET}, - automaticallyPrintOk = true + automaticallyPrintOk = true, + auth = Auth.AUTH_INTERNAL_ONLY ) public class CheckSnapshotAction implements Runnable { diff --git a/java/google/registry/export/ExportDomainListsAction.java b/java/google/registry/export/ExportDomainListsAction.java index afd2c7976..74fa257f9 100644 --- a/java/google/registry/export/ExportDomainListsAction.java +++ b/java/google/registry/export/ExportDomainListsAction.java @@ -37,6 +37,7 @@ import google.registry.model.domain.DomainResource; import google.registry.model.registry.Registry.TldType; import google.registry.request.Action; import google.registry.request.Response; +import google.registry.request.auth.Auth; import google.registry.util.FormattingLogger; import java.io.IOException; import java.io.OutputStream; @@ -52,7 +53,11 @@ import org.joda.time.DateTime; * Each TLD's active domain names are exported as a newline-delimited flat text file with the name * TLD.txt into the domain-lists bucket. Note that this overwrites the files in place. */ -@Action(path = "/_dr/task/exportDomainLists", method = POST) +@Action( + path = "/_dr/task/exportDomainLists", + method = POST, + auth = Auth.AUTH_INTERNAL_ONLY +) public class ExportDomainListsAction implements Runnable { private static final FormattingLogger logger = FormattingLogger.getLoggerForCallerClass(); diff --git a/java/google/registry/export/ExportReservedTermsAction.java b/java/google/registry/export/ExportReservedTermsAction.java index 55dbd4f10..5eed08047 100644 --- a/java/google/registry/export/ExportReservedTermsAction.java +++ b/java/google/registry/export/ExportReservedTermsAction.java @@ -27,12 +27,17 @@ import google.registry.request.Action; import google.registry.request.Parameter; import google.registry.request.RequestParameters; import google.registry.request.Response; +import google.registry.request.auth.Auth; import google.registry.storage.drive.DriveConnection; import google.registry.util.FormattingLogger; import javax.inject.Inject; /** Action that exports the publicly viewable reserved terms list for a TLD to Google Drive. */ -@Action(path = "/_dr/task/exportReservedTerms", method = POST) +@Action( + path = "/_dr/task/exportReservedTerms", + method = POST, + auth = Auth.AUTH_INTERNAL_ONLY +) public class ExportReservedTermsAction implements Runnable { private static final FormattingLogger logger = FormattingLogger.getLoggerForCallerClass(); diff --git a/java/google/registry/export/ExportSnapshotAction.java b/java/google/registry/export/ExportSnapshotAction.java index 15213d6cd..2bfb2f03e 100644 --- a/java/google/registry/export/ExportSnapshotAction.java +++ b/java/google/registry/export/ExportSnapshotAction.java @@ -20,6 +20,7 @@ import static google.registry.request.Action.Method.POST; import google.registry.config.RegistryConfig; import google.registry.request.Action; import google.registry.request.Response; +import google.registry.request.auth.Auth; import google.registry.util.Clock; import google.registry.util.FormattingLogger; import javax.inject.Inject; @@ -37,7 +38,12 @@ import javax.inject.Inject; *

  • The {@link UpdateSnapshotViewAction} updates the view in latest_snapshot. * */ -@Action(path = ExportSnapshotAction.PATH, method = POST, automaticallyPrintOk = true) +@Action( + path = ExportSnapshotAction.PATH, + method = POST, + automaticallyPrintOk = true, + auth = Auth.AUTH_INTERNAL_ONLY +) public class ExportSnapshotAction implements Runnable { /** Queue to use for enqueuing the task that will actually launch the backup. */ diff --git a/java/google/registry/export/LoadSnapshotAction.java b/java/google/registry/export/LoadSnapshotAction.java index c2ac261de..402637aa5 100644 --- a/java/google/registry/export/LoadSnapshotAction.java +++ b/java/google/registry/export/LoadSnapshotAction.java @@ -43,6 +43,7 @@ import google.registry.request.Action; import google.registry.request.HttpException.BadRequestException; import google.registry.request.HttpException.InternalServerErrorException; import google.registry.request.Parameter; +import google.registry.request.auth.Auth; import google.registry.util.Clock; import google.registry.util.FormattingLogger; import java.io.IOException; @@ -50,7 +51,11 @@ import javax.inject.Inject; import org.joda.time.DateTime; /** Action to load a Datastore snapshot from Google Cloud Storage into BigQuery. */ -@Action(path = LoadSnapshotAction.PATH, method = POST) +@Action( + path = LoadSnapshotAction.PATH, + method = POST, + auth = Auth.AUTH_INTERNAL_ONLY +) public class LoadSnapshotAction implements Runnable { /** Parameter names for passing parameters into the servlet. */ diff --git a/java/google/registry/export/PublishDetailReportAction.java b/java/google/registry/export/PublishDetailReportAction.java index 62a3fe41f..1c58ab7ee 100644 --- a/java/google/registry/export/PublishDetailReportAction.java +++ b/java/google/registry/export/PublishDetailReportAction.java @@ -29,9 +29,6 @@ import google.registry.request.HttpException.InternalServerErrorException; import google.registry.request.JsonActionRunner; import google.registry.request.JsonActionRunner.JsonAction; import google.registry.request.auth.Auth; -import google.registry.request.auth.Auth.AuthMethod; -import google.registry.request.auth.Auth.UserPolicy; -import google.registry.request.auth.AuthLevel; import google.registry.storage.drive.DriveConnection; import google.registry.util.FormattingLogger; import java.io.FileNotFoundException; @@ -43,12 +40,7 @@ import javax.inject.Inject; @Action( path = PublishDetailReportAction.PATH, method = Action.Method.POST, - auth = - @Auth( - methods = {AuthMethod.INTERNAL, Auth.AuthMethod.API}, - minimumLevel = AuthLevel.APP, - userPolicy = UserPolicy.ADMIN - ) + auth = Auth.AUTH_INTERNAL_OR_ADMIN ) public final class PublishDetailReportAction implements Runnable, JsonAction { diff --git a/java/google/registry/export/SyncGroupMembersAction.java b/java/google/registry/export/SyncGroupMembersAction.java index e4392760d..2d6f399e4 100644 --- a/java/google/registry/export/SyncGroupMembersAction.java +++ b/java/google/registry/export/SyncGroupMembersAction.java @@ -36,6 +36,7 @@ import google.registry.model.registrar.Registrar; import google.registry.model.registrar.RegistrarContact; import google.registry.request.Action; import google.registry.request.Response; +import google.registry.request.auth.Auth; import google.registry.util.FormattingLogger; import google.registry.util.Retrier; import java.io.IOException; @@ -52,7 +53,11 @@ import javax.inject.Inject; * *

    This uses the Directory API. */ -@Action(path = "/_dr/task/syncGroupMembers", method = POST) +@Action( + path = "/_dr/task/syncGroupMembers", + method = POST, + auth = Auth.AUTH_INTERNAL_ONLY +) public final class SyncGroupMembersAction implements Runnable { private static final FormattingLogger logger = FormattingLogger.getLoggerForCallerClass(); diff --git a/java/google/registry/export/UpdateSnapshotViewAction.java b/java/google/registry/export/UpdateSnapshotViewAction.java index 46293f0e7..129e1badb 100644 --- a/java/google/registry/export/UpdateSnapshotViewAction.java +++ b/java/google/registry/export/UpdateSnapshotViewAction.java @@ -13,6 +13,7 @@ // limitations under the License. package google.registry.export; + import static google.registry.request.Action.Method.POST; import com.google.api.client.googleapis.json.GoogleJsonResponseException; @@ -27,13 +28,18 @@ import google.registry.config.RegistryConfig.Config; import google.registry.request.Action; import google.registry.request.HttpException.InternalServerErrorException; import google.registry.request.Parameter; +import google.registry.request.auth.Auth; import google.registry.util.FormattingLogger; import google.registry.util.SqlTemplate; import java.io.IOException; import javax.inject.Inject; /** Update a well-known view to point at a certain Datastore snapshot table in BigQuery. */ -@Action(path = UpdateSnapshotViewAction.PATH, method = POST) +@Action( + path = UpdateSnapshotViewAction.PATH, + method = POST, + auth = Auth.AUTH_INTERNAL_ONLY +) public class UpdateSnapshotViewAction implements Runnable { /** Headers for passing parameters into the servlet. */ diff --git a/java/google/registry/export/sheet/BUILD b/java/google/registry/export/sheet/BUILD index ffb9e1846..fb45794d8 100644 --- a/java/google/registry/export/sheet/BUILD +++ b/java/google/registry/export/sheet/BUILD @@ -11,6 +11,7 @@ java_library( "//java/google/registry/config", "//java/google/registry/model", "//java/google/registry/request", + "//java/google/registry/request/auth", "//java/google/registry/util", "//third_party/java/objectify:objectify-v4_1", "@com_google_api_client", diff --git a/java/google/registry/export/sheet/SyncRegistrarsSheetAction.java b/java/google/registry/export/sheet/SyncRegistrarsSheetAction.java index c0da8e083..1d94e927a 100644 --- a/java/google/registry/export/sheet/SyncRegistrarsSheetAction.java +++ b/java/google/registry/export/sheet/SyncRegistrarsSheetAction.java @@ -34,6 +34,7 @@ import google.registry.model.server.Lock; import google.registry.request.Action; import google.registry.request.Parameter; import google.registry.request.Response; +import google.registry.request.auth.Auth; import google.registry.util.FormattingLogger; import google.registry.util.NonFinalForTesting; import java.io.IOException; @@ -60,7 +61,11 @@ import org.joda.time.Duration; * * @see SyncRegistrarsSheet */ -@Action(path = SyncRegistrarsSheetAction.PATH, method = POST) +@Action( + path = SyncRegistrarsSheetAction.PATH, + method = POST, + auth = Auth.AUTH_INTERNAL_ONLY +) public class SyncRegistrarsSheetAction implements Runnable { private enum Result { diff --git a/java/google/registry/flows/CheckApiAction.java b/java/google/registry/flows/CheckApiAction.java index 7677fea26..46f69d0ab 100644 --- a/java/google/registry/flows/CheckApiAction.java +++ b/java/google/registry/flows/CheckApiAction.java @@ -46,7 +46,6 @@ import google.registry.request.Parameter; import google.registry.request.RequestParameters; import google.registry.request.Response; import google.registry.request.auth.Auth; -import google.registry.request.auth.AuthLevel; import google.registry.util.FormattingLogger; import java.util.Map; import javax.inject.Inject; @@ -61,7 +60,7 @@ import javax.servlet.http.HttpServletRequest; */ @Action( path = "/check", - auth = @Auth(minimumLevel = AuthLevel.NONE, userPolicy = Auth.UserPolicy.PUBLIC) + auth = Auth.AUTH_PUBLIC_ANONYMOUS ) public class CheckApiAction implements Runnable { diff --git a/java/google/registry/flows/EppConsoleAction.java b/java/google/registry/flows/EppConsoleAction.java index 19e4b8302..5d37c4089 100644 --- a/java/google/registry/flows/EppConsoleAction.java +++ b/java/google/registry/flows/EppConsoleAction.java @@ -19,7 +19,6 @@ import google.registry.request.Action; import google.registry.request.Action.Method; import google.registry.request.Payload; import google.registry.request.auth.Auth; -import google.registry.request.auth.AuthLevel; import javax.inject.Inject; import javax.servlet.http.HttpSession; @@ -27,12 +26,7 @@ import javax.servlet.http.HttpSession; @Action( path = "/registrar-xhr", method = Method.POST, - auth = - @Auth( - methods = {Auth.AuthMethod.INTERNAL, Auth.AuthMethod.API, Auth.AuthMethod.LEGACY}, - minimumLevel = AuthLevel.USER, - userPolicy = Auth.UserPolicy.PUBLIC - ) + auth = Auth.AUTH_PUBLIC_LOGGED_IN ) public class EppConsoleAction implements Runnable { diff --git a/java/google/registry/flows/EppTlsAction.java b/java/google/registry/flows/EppTlsAction.java index 87874100d..8163eed76 100644 --- a/java/google/registry/flows/EppTlsAction.java +++ b/java/google/registry/flows/EppTlsAction.java @@ -18,7 +18,6 @@ import google.registry.request.Action; import google.registry.request.Action.Method; import google.registry.request.Payload; import google.registry.request.auth.Auth; -import google.registry.request.auth.AuthLevel; import google.registry.util.FormattingLogger; import javax.inject.Inject; import javax.servlet.http.HttpSession; @@ -30,12 +29,7 @@ import javax.servlet.http.HttpSession; @Action( path = "/_dr/epp", method = Method.POST, - auth = - @Auth( - methods = {Auth.AuthMethod.INTERNAL, Auth.AuthMethod.API}, - minimumLevel = AuthLevel.APP, - userPolicy = Auth.UserPolicy.ADMIN - ) + auth = Auth.AUTH_INTERNAL_OR_ADMIN ) public class EppTlsAction implements Runnable { diff --git a/java/google/registry/flows/EppToolAction.java b/java/google/registry/flows/EppToolAction.java index 5155275b1..efc9706f6 100644 --- a/java/google/registry/flows/EppToolAction.java +++ b/java/google/registry/flows/EppToolAction.java @@ -25,7 +25,6 @@ import google.registry.request.Action; import google.registry.request.Action.Method; import google.registry.request.Parameter; import google.registry.request.auth.Auth; -import google.registry.request.auth.AuthLevel; import javax.inject.Inject; import javax.servlet.http.HttpServletRequest; @@ -33,12 +32,7 @@ import javax.servlet.http.HttpServletRequest; @Action( path = "/_dr/epptool", method = Method.POST, - auth = - @Auth( - methods = {Auth.AuthMethod.INTERNAL, Auth.AuthMethod.API}, - minimumLevel = AuthLevel.APP, - userPolicy = Auth.UserPolicy.ADMIN - ) + auth = Auth.AUTH_INTERNAL_OR_ADMIN ) public class EppToolAction implements Runnable { diff --git a/java/google/registry/loadtest/LoadTestAction.java b/java/google/registry/loadtest/LoadTestAction.java index ae920ae01..e0765c954 100644 --- a/java/google/registry/loadtest/LoadTestAction.java +++ b/java/google/registry/loadtest/LoadTestAction.java @@ -34,7 +34,6 @@ import google.registry.config.RegistryEnvironment; import google.registry.request.Action; import google.registry.request.Parameter; import google.registry.request.auth.Auth; -import google.registry.request.auth.AuthLevel; import google.registry.security.XsrfTokenManager; import google.registry.util.FormattingLogger; import google.registry.util.TaskEnqueuer; @@ -58,12 +57,7 @@ import org.joda.time.DateTime; path = LoadTestAction.PATH, method = Action.Method.POST, automaticallyPrintOk = true, - auth = - @Auth( - methods = {Auth.AuthMethod.INTERNAL, Auth.AuthMethod.API}, - minimumLevel = AuthLevel.APP, - userPolicy = Auth.UserPolicy.ADMIN - ) + auth = Auth.AUTH_INTERNAL_OR_ADMIN ) public class LoadTestAction implements Runnable { diff --git a/java/google/registry/monitoring/whitebox/BUILD b/java/google/registry/monitoring/whitebox/BUILD index 92274deb7..dbfc1e4fd 100644 --- a/java/google/registry/monitoring/whitebox/BUILD +++ b/java/google/registry/monitoring/whitebox/BUILD @@ -14,6 +14,7 @@ java_library( "//java/google/registry/monitoring/metrics", "//java/google/registry/monitoring/metrics/stackdriver", "//java/google/registry/request", + "//java/google/registry/request/auth", "//java/google/registry/util", "//third_party/java/objectify:objectify-v4_1", "@com_google_apis_google_api_services_bigquery", diff --git a/java/google/registry/monitoring/whitebox/MetricsExportAction.java b/java/google/registry/monitoring/whitebox/MetricsExportAction.java index 19ac025d4..36f4f2bb5 100644 --- a/java/google/registry/monitoring/whitebox/MetricsExportAction.java +++ b/java/google/registry/monitoring/whitebox/MetricsExportAction.java @@ -36,13 +36,18 @@ import google.registry.config.RegistryConfig.Config; import google.registry.request.Action; import google.registry.request.Parameter; import google.registry.request.ParameterMap; +import google.registry.request.auth.Auth; import google.registry.util.FormattingLogger; import java.io.IOException; import java.util.Map; import javax.inject.Inject; /** Action for exporting metrics to BigQuery. */ -@Action(path = MetricsExportAction.PATH, method = POST) +@Action( + path = MetricsExportAction.PATH, + method = POST, + auth = Auth.AUTH_INTERNAL_ONLY +) public class MetricsExportAction implements Runnable { public static final String PATH = "/_dr/task/metrics"; diff --git a/java/google/registry/rdap/RdapAutnumAction.java b/java/google/registry/rdap/RdapAutnumAction.java index 50ee6e4f7..8bac68e37 100644 --- a/java/google/registry/rdap/RdapAutnumAction.java +++ b/java/google/registry/rdap/RdapAutnumAction.java @@ -21,7 +21,6 @@ import com.google.common.collect.ImmutableMap; import google.registry.request.Action; import google.registry.request.HttpException.NotImplementedException; import google.registry.request.auth.Auth; -import google.registry.request.auth.AuthLevel; import javax.inject.Inject; /** @@ -34,7 +33,7 @@ import javax.inject.Inject; path = RdapAutnumAction.PATH, method = {GET, HEAD}, isPrefix = true, - auth = @Auth(minimumLevel = AuthLevel.NONE, userPolicy = Auth.UserPolicy.PUBLIC) + auth = Auth.AUTH_PUBLIC_ANONYMOUS ) public class RdapAutnumAction extends RdapActionBase { diff --git a/java/google/registry/rdap/RdapDomainAction.java b/java/google/registry/rdap/RdapDomainAction.java index 796474005..e9fba3776 100644 --- a/java/google/registry/rdap/RdapDomainAction.java +++ b/java/google/registry/rdap/RdapDomainAction.java @@ -24,7 +24,6 @@ import google.registry.rdap.RdapJsonFormatter.OutputDataType; import google.registry.request.Action; import google.registry.request.HttpException.NotFoundException; import google.registry.request.auth.Auth; -import google.registry.request.auth.AuthLevel; import google.registry.util.Clock; import javax.inject.Inject; import org.joda.time.DateTime; @@ -34,7 +33,7 @@ import org.joda.time.DateTime; path = RdapDomainAction.PATH, method = {GET, HEAD}, isPrefix = true, - auth = @Auth(minimumLevel = AuthLevel.NONE, userPolicy = Auth.UserPolicy.PUBLIC) + auth = Auth.AUTH_PUBLIC_ANONYMOUS ) public class RdapDomainAction extends RdapActionBase { diff --git a/java/google/registry/rdap/RdapDomainSearchAction.java b/java/google/registry/rdap/RdapDomainSearchAction.java index 03cf31c05..a9aa8bf54 100644 --- a/java/google/registry/rdap/RdapDomainSearchAction.java +++ b/java/google/registry/rdap/RdapDomainSearchAction.java @@ -42,7 +42,6 @@ import google.registry.request.HttpException.NotFoundException; import google.registry.request.HttpException.UnprocessableEntityException; import google.registry.request.Parameter; import google.registry.request.auth.Auth; -import google.registry.request.auth.AuthLevel; import google.registry.util.Clock; import google.registry.util.FormattingLogger; import google.registry.util.Idn; @@ -66,7 +65,7 @@ import org.joda.time.DateTime; @Action( path = RdapDomainSearchAction.PATH, method = {GET, HEAD}, - auth = @Auth(minimumLevel = AuthLevel.NONE, userPolicy = Auth.UserPolicy.PUBLIC) + auth = Auth.AUTH_PUBLIC_ANONYMOUS ) public class RdapDomainSearchAction extends RdapActionBase { diff --git a/java/google/registry/rdap/RdapEntityAction.java b/java/google/registry/rdap/RdapEntityAction.java index 0fb1a38f4..d7998cd4e 100644 --- a/java/google/registry/rdap/RdapEntityAction.java +++ b/java/google/registry/rdap/RdapEntityAction.java @@ -32,7 +32,6 @@ import google.registry.request.Action; import google.registry.request.HttpException.BadRequestException; import google.registry.request.HttpException.NotFoundException; import google.registry.request.auth.Auth; -import google.registry.request.auth.AuthLevel; import google.registry.util.Clock; import javax.inject.Inject; import org.joda.time.DateTime; @@ -51,7 +50,7 @@ import org.joda.time.DateTime; path = RdapEntityAction.PATH, method = {GET, HEAD}, isPrefix = true, - auth = @Auth(minimumLevel = AuthLevel.NONE, userPolicy = Auth.UserPolicy.PUBLIC) + auth = Auth.AUTH_PUBLIC_ANONYMOUS ) public class RdapEntityAction extends RdapActionBase { diff --git a/java/google/registry/rdap/RdapEntitySearchAction.java b/java/google/registry/rdap/RdapEntitySearchAction.java index d3a928280..11b0ab66a 100644 --- a/java/google/registry/rdap/RdapEntitySearchAction.java +++ b/java/google/registry/rdap/RdapEntitySearchAction.java @@ -41,7 +41,6 @@ import google.registry.request.HttpException.NotFoundException; import google.registry.request.HttpException.UnprocessableEntityException; import google.registry.request.Parameter; import google.registry.request.auth.Auth; -import google.registry.request.auth.AuthLevel; import google.registry.util.Clock; import java.util.ArrayList; import java.util.List; @@ -61,7 +60,7 @@ import org.joda.time.DateTime; @Action( path = RdapEntitySearchAction.PATH, method = {GET, HEAD}, - auth = @Auth(minimumLevel = AuthLevel.NONE, userPolicy = Auth.UserPolicy.PUBLIC) + auth = Auth.AUTH_PUBLIC_ANONYMOUS ) public class RdapEntitySearchAction extends RdapActionBase { diff --git a/java/google/registry/rdap/RdapHelpAction.java b/java/google/registry/rdap/RdapHelpAction.java index e1f4cfffe..abde91d06 100644 --- a/java/google/registry/rdap/RdapHelpAction.java +++ b/java/google/registry/rdap/RdapHelpAction.java @@ -22,7 +22,6 @@ import com.google.common.collect.ImmutableMap; import google.registry.rdap.RdapJsonFormatter.BoilerplateType; import google.registry.request.Action; import google.registry.request.auth.Auth; -import google.registry.request.auth.AuthLevel; import google.registry.util.Clock; import javax.inject.Inject; @@ -31,7 +30,7 @@ import javax.inject.Inject; path = RdapHelpAction.PATH, method = {GET, HEAD}, isPrefix = true, - auth = @Auth(minimumLevel = AuthLevel.NONE, userPolicy = Auth.UserPolicy.PUBLIC) + auth = Auth.AUTH_PUBLIC_ANONYMOUS ) public class RdapHelpAction extends RdapActionBase { diff --git a/java/google/registry/rdap/RdapIpAction.java b/java/google/registry/rdap/RdapIpAction.java index 08624d64f..255ef954e 100644 --- a/java/google/registry/rdap/RdapIpAction.java +++ b/java/google/registry/rdap/RdapIpAction.java @@ -21,7 +21,6 @@ import com.google.common.collect.ImmutableMap; import google.registry.request.Action; import google.registry.request.HttpException.NotImplementedException; import google.registry.request.auth.Auth; -import google.registry.request.auth.AuthLevel; import javax.inject.Inject; /** @@ -34,7 +33,7 @@ import javax.inject.Inject; path = RdapIpAction.PATH, method = {GET, HEAD}, isPrefix = true, - auth = @Auth(minimumLevel = AuthLevel.NONE, userPolicy = Auth.UserPolicy.PUBLIC) + auth = Auth.AUTH_PUBLIC_ANONYMOUS ) public class RdapIpAction extends RdapActionBase { diff --git a/java/google/registry/rdap/RdapNameserverAction.java b/java/google/registry/rdap/RdapNameserverAction.java index 362f76d5e..4ec89ef7f 100644 --- a/java/google/registry/rdap/RdapNameserverAction.java +++ b/java/google/registry/rdap/RdapNameserverAction.java @@ -24,7 +24,6 @@ import google.registry.rdap.RdapJsonFormatter.OutputDataType; import google.registry.request.Action; import google.registry.request.HttpException.NotFoundException; import google.registry.request.auth.Auth; -import google.registry.request.auth.AuthLevel; import google.registry.util.Clock; import javax.inject.Inject; import org.joda.time.DateTime; @@ -34,7 +33,7 @@ import org.joda.time.DateTime; path = RdapNameserverAction.PATH, method = {GET, HEAD}, isPrefix = true, - auth = @Auth(minimumLevel = AuthLevel.NONE, userPolicy = Auth.UserPolicy.PUBLIC) + auth = Auth.AUTH_PUBLIC_ANONYMOUS ) public class RdapNameserverAction extends RdapActionBase { diff --git a/java/google/registry/rdap/RdapNameserverSearchAction.java b/java/google/registry/rdap/RdapNameserverSearchAction.java index 50a34f805..de6db742c 100644 --- a/java/google/registry/rdap/RdapNameserverSearchAction.java +++ b/java/google/registry/rdap/RdapNameserverSearchAction.java @@ -37,7 +37,6 @@ import google.registry.request.HttpException.BadRequestException; import google.registry.request.HttpException.NotFoundException; import google.registry.request.Parameter; import google.registry.request.auth.Auth; -import google.registry.request.auth.AuthLevel; import google.registry.util.Clock; import google.registry.util.Idn; import java.net.InetAddress; @@ -58,7 +57,7 @@ import org.joda.time.DateTime; @Action( path = RdapNameserverSearchAction.PATH, method = {GET, HEAD}, - auth = @Auth(minimumLevel = AuthLevel.NONE, userPolicy = Auth.UserPolicy.PUBLIC) + auth = Auth.AUTH_PUBLIC_ANONYMOUS ) public class RdapNameserverSearchAction extends RdapActionBase { diff --git a/java/google/registry/rde/BUILD b/java/google/registry/rde/BUILD index a0156c635..d3d68ca97 100644 --- a/java/google/registry/rde/BUILD +++ b/java/google/registry/rde/BUILD @@ -15,6 +15,7 @@ java_library( "//java/google/registry/mapreduce/inputs", "//java/google/registry/model", "//java/google/registry/request", + "//java/google/registry/request/auth", "//java/google/registry/tldconfig/idn", "//java/google/registry/util", "//java/google/registry/xjc", diff --git a/java/google/registry/rde/BrdaCopyAction.java b/java/google/registry/rde/BrdaCopyAction.java index 5c3cba7ec..358fb5cca 100644 --- a/java/google/registry/rde/BrdaCopyAction.java +++ b/java/google/registry/rde/BrdaCopyAction.java @@ -27,6 +27,7 @@ import google.registry.model.rde.RdeNamingUtils; import google.registry.request.Action; import google.registry.request.Parameter; import google.registry.request.RequestParameters; +import google.registry.request.auth.Auth; import google.registry.util.FormattingLogger; import java.io.BufferedInputStream; import java.io.IOException; @@ -52,7 +53,12 @@ import org.joda.time.DateTime; * * @see Registry Agreement */ -@Action(path = BrdaCopyAction.PATH, method = POST, automaticallyPrintOk = true) +@Action( + path = BrdaCopyAction.PATH, + method = POST, + automaticallyPrintOk = true, + auth = Auth.AUTH_INTERNAL_ONLY +) public final class BrdaCopyAction implements Runnable { static final String PATH = "/_dr/task/brdaCopy"; diff --git a/java/google/registry/rde/RdeReportAction.java b/java/google/registry/rde/RdeReportAction.java index 58a2c493f..fefcfb71c 100644 --- a/java/google/registry/rde/RdeReportAction.java +++ b/java/google/registry/rde/RdeReportAction.java @@ -36,6 +36,7 @@ import google.registry.request.HttpException.NoContentException; import google.registry.request.Parameter; import google.registry.request.RequestParameters; import google.registry.request.Response; +import google.registry.request.auth.Auth; import google.registry.util.FormattingLogger; import java.io.IOException; import java.io.InputStream; @@ -48,7 +49,11 @@ import org.joda.time.Duration; /** * Action that uploads a small XML RDE report to ICANN after {@link RdeUploadAction} has finished. */ -@Action(path = RdeReportAction.PATH, method = POST) +@Action( + path = RdeReportAction.PATH, + method = POST, + auth = Auth.AUTH_INTERNAL_ONLY +) public final class RdeReportAction implements Runnable, EscrowTask { static final String PATH = "/_dr/task/rdeReport"; diff --git a/java/google/registry/rde/RdeStagingAction.java b/java/google/registry/rde/RdeStagingAction.java index 28b7cca06..9b7708816 100644 --- a/java/google/registry/rde/RdeStagingAction.java +++ b/java/google/registry/rde/RdeStagingAction.java @@ -45,6 +45,7 @@ import google.registry.request.HttpException.BadRequestException; import google.registry.request.Parameter; import google.registry.request.RequestParameters; import google.registry.request.Response; +import google.registry.request.auth.Auth; import google.registry.util.Clock; import google.registry.util.FormattingLogger; import javax.inject.Inject; @@ -187,7 +188,8 @@ import org.joda.time.Duration; */ @Action( path = RdeStagingAction.PATH, - method = {GET, POST} + method = {GET, POST}, + auth = Auth.AUTH_INTERNAL_ONLY ) public final class RdeStagingAction implements Runnable { diff --git a/java/google/registry/rde/RdeUploadAction.java b/java/google/registry/rde/RdeUploadAction.java index 07bd4da94..b2dda593d 100644 --- a/java/google/registry/rde/RdeUploadAction.java +++ b/java/google/registry/rde/RdeUploadAction.java @@ -48,6 +48,7 @@ import google.registry.request.HttpException.ServiceUnavailableException; import google.registry.request.Parameter; import google.registry.request.RequestParameters; import google.registry.request.Response; +import google.registry.request.auth.Auth; import google.registry.util.Clock; import google.registry.util.FormattingLogger; import google.registry.util.Retrier; @@ -77,7 +78,11 @@ import org.joda.time.Duration; *

    Once this action completes, it rolls the cursor forward a day and triggers * {@link RdeReportAction}. */ -@Action(path = RdeUploadAction.PATH, method = POST) +@Action( + path = RdeUploadAction.PATH, + method = POST, + auth = Auth.AUTH_INTERNAL_ONLY +) public final class RdeUploadAction implements Runnable, EscrowTask { static final String PATH = "/_dr/task/rdeUpload"; diff --git a/java/google/registry/rde/imports/BUILD b/java/google/registry/rde/imports/BUILD index b6f0516b0..fb594b3ee 100644 --- a/java/google/registry/rde/imports/BUILD +++ b/java/google/registry/rde/imports/BUILD @@ -16,6 +16,7 @@ java_library( "//java/google/registry/model", "//java/google/registry/pricing", "//java/google/registry/request", + "//java/google/registry/request/auth", "//java/google/registry/util", "//java/google/registry/xjc", "//java/google/registry/xml", diff --git a/java/google/registry/rde/imports/RdeContactImportAction.java b/java/google/registry/rde/imports/RdeContactImportAction.java index e97ef23d1..7b4b56d24 100644 --- a/java/google/registry/rde/imports/RdeContactImportAction.java +++ b/java/google/registry/rde/imports/RdeContactImportAction.java @@ -33,6 +33,7 @@ import google.registry.model.contact.ContactResource; import google.registry.request.Action; import google.registry.request.Parameter; import google.registry.request.Response; +import google.registry.request.auth.Auth; import google.registry.util.FormattingLogger; import google.registry.util.SystemClock; import google.registry.xjc.JaxbFragment; @@ -45,7 +46,10 @@ import javax.inject.Inject; * *

    Specify the escrow file to import with the "path" parameter. */ -@Action(path = "/_dr/task/importRdeContacts") +@Action( + path = "/_dr/task/importRdeContacts", + auth = Auth.AUTH_INTERNAL_ONLY +) public class RdeContactImportAction implements Runnable { private static final FormattingLogger logger = FormattingLogger.getLoggerForCallerClass(); diff --git a/java/google/registry/rde/imports/RdeDomainImportAction.java b/java/google/registry/rde/imports/RdeDomainImportAction.java index 47218e0d5..a249528c3 100644 --- a/java/google/registry/rde/imports/RdeDomainImportAction.java +++ b/java/google/registry/rde/imports/RdeDomainImportAction.java @@ -50,6 +50,7 @@ import google.registry.model.transfer.TransferStatus; import google.registry.request.Action; import google.registry.request.Parameter; import google.registry.request.Response; +import google.registry.request.auth.Auth; import google.registry.util.FormattingLogger; import google.registry.util.SystemClock; import google.registry.xjc.JaxbFragment; @@ -63,7 +64,10 @@ import org.joda.money.Money; * *

    Specify the escrow file to import with the "path" parameter. */ -@Action(path = "/_dr/task/importRdeDomains") +@Action( + path = "/_dr/task/importRdeDomains", + auth = Auth.AUTH_INTERNAL_ONLY +) public class RdeDomainImportAction implements Runnable { private static final FormattingLogger logger = FormattingLogger.getLoggerForCallerClass(); diff --git a/java/google/registry/rde/imports/RdeHostImportAction.java b/java/google/registry/rde/imports/RdeHostImportAction.java index bc81bb18d..d3b07f978 100644 --- a/java/google/registry/rde/imports/RdeHostImportAction.java +++ b/java/google/registry/rde/imports/RdeHostImportAction.java @@ -33,6 +33,7 @@ import google.registry.model.host.HostResource; import google.registry.request.Action; import google.registry.request.Parameter; import google.registry.request.Response; +import google.registry.request.auth.Auth; import google.registry.util.FormattingLogger; import google.registry.util.SystemClock; import google.registry.xjc.JaxbFragment; @@ -45,7 +46,10 @@ import javax.inject.Inject; * *

    Specify the escrow file to import with the "path" parameter. */ -@Action(path = "/_dr/task/importRdeHosts") +@Action( + path = "/_dr/task/importRdeHosts", + auth = Auth.AUTH_INTERNAL_ONLY +) public class RdeHostImportAction implements Runnable { private static final FormattingLogger logger = FormattingLogger.getLoggerForCallerClass(); diff --git a/java/google/registry/rde/imports/RdeHostLinkAction.java b/java/google/registry/rde/imports/RdeHostLinkAction.java index 512f8d109..5c5c25341 100644 --- a/java/google/registry/rde/imports/RdeHostLinkAction.java +++ b/java/google/registry/rde/imports/RdeHostLinkAction.java @@ -33,6 +33,7 @@ import google.registry.model.host.HostResource; import google.registry.request.Action; import google.registry.request.Parameter; import google.registry.request.Response; +import google.registry.request.auth.Auth; import google.registry.util.FormattingLogger; import google.registry.xjc.JaxbFragment; import google.registry.xjc.rdehost.XjcRdeHost; @@ -51,7 +52,10 @@ import org.joda.time.DateTime; * *

    Specify the escrow file to import with the "path" parameter. */ -@Action(path = "/_dr/task/linkRdeHosts") +@Action( + path = "/_dr/task/linkRdeHosts", + auth = Auth.AUTH_INTERNAL_ONLY +) public class RdeHostLinkAction implements Runnable { private static final FormattingLogger logger = FormattingLogger.getLoggerForCallerClass(); diff --git a/java/google/registry/reporting/IcannReportingUploadAction.java b/java/google/registry/reporting/IcannReportingUploadAction.java index 00c8bda27..60eabc9d0 100644 --- a/java/google/registry/reporting/IcannReportingUploadAction.java +++ b/java/google/registry/reporting/IcannReportingUploadAction.java @@ -30,9 +30,6 @@ import google.registry.request.Parameter; import google.registry.request.RequestParameters; import google.registry.request.Response; import google.registry.request.auth.Auth; -import google.registry.request.auth.Auth.AuthMethod; -import google.registry.request.auth.Auth.UserPolicy; -import google.registry.request.auth.AuthLevel; import google.registry.util.FormattingLogger; import google.registry.util.Retrier; import google.registry.xml.XmlException; @@ -48,14 +45,9 @@ import javax.inject.Inject; * */ @Action( - path = IcannReportingUploadAction.PATH, - method = POST, - auth = - @Auth( - methods = {AuthMethod.INTERNAL, AuthMethod.API}, - minimumLevel = AuthLevel.APP, - userPolicy = UserPolicy.ADMIN - ) + path = IcannReportingUploadAction.PATH, + method = POST, + auth = Auth.AUTH_INTERNAL_OR_ADMIN ) public final class IcannReportingUploadAction implements Runnable { diff --git a/java/google/registry/request/Action.java b/java/google/registry/request/Action.java index 192652649..9427222e2 100644 --- a/java/google/registry/request/Action.java +++ b/java/google/registry/request/Action.java @@ -47,5 +47,5 @@ public @interface Action { boolean automaticallyPrintOk() default false; /** Authentication settings. */ - Auth auth() default @Auth; + Auth auth(); } diff --git a/java/google/registry/request/RequestHandler.java b/java/google/registry/request/RequestHandler.java index f13dbfe74..6b8d40173 100644 --- a/java/google/registry/request/RequestHandler.java +++ b/java/google/registry/request/RequestHandler.java @@ -132,7 +132,7 @@ public class RequestHandler { return; } Optional authResult = - requestAuthenticator.authorize(route.get().action().auth(), req); + requestAuthenticator.authorize(route.get().action().auth().authSettings(), req); if (!authResult.isPresent()) { rsp.sendError(SC_FORBIDDEN, "Not authorized"); return; diff --git a/java/google/registry/request/RouterDisplayHelper.java b/java/google/registry/request/RouterDisplayHelper.java index 6d8452834..519f29ce3 100644 --- a/java/google/registry/request/RouterDisplayHelper.java +++ b/java/google/registry/request/RouterDisplayHelper.java @@ -90,9 +90,9 @@ public class RouterDisplayHelper { route.actionClass().getSimpleName(), Joiner.on(",").join(route.action().method()), route.action().automaticallyPrintOk() ? "y" : "n", - Joiner.on(",").join(route.action().auth().methods()), - route.action().auth().minimumLevel(), - route.action().auth().userPolicy()); + Joiner.on(",").join(route.action().auth().authSettings().methods()), + route.action().auth().authSettings().minimumLevel(), + route.action().auth().authSettings().userPolicy()); } private static String formatRoutes(Iterable routes) { @@ -119,11 +119,11 @@ public class RouterDisplayHelper { if (len > methodsWidth) { methodsWidth = len; } - len = Joiner.on(",").join(route.action().auth().methods()).length(); + len = Joiner.on(",").join(route.action().auth().authSettings().methods()).length(); if (len > authMethodsWidth) { authMethodsWidth = len; } - len = route.action().auth().minimumLevel().toString().length(); + len = route.action().auth().authSettings().minimumLevel().toString().length(); if (len > minLevelWidth) { minLevelWidth = len; } diff --git a/java/google/registry/request/auth/Auth.java b/java/google/registry/request/auth/Auth.java index fdd698e75..ccc065c9b 100644 --- a/java/google/registry/request/auth/Auth.java +++ b/java/google/registry/request/auth/Auth.java @@ -14,53 +14,74 @@ package google.registry.request.auth; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; +import com.google.common.collect.ImmutableList; +import google.registry.request.auth.RequestAuthenticator.AuthMethod; +import google.registry.request.auth.RequestAuthenticator.AuthSettings; +import google.registry.request.auth.RequestAuthenticator.UserPolicy; -/** Annotation used to configure authentication settings for Actions. */ -@Retention(RetentionPolicy.RUNTIME) -@Target(ElementType.TYPE) -public @interface Auth { +/** Enum used to configure authentication settings for Actions. */ +public enum Auth { - /** Available methods for authentication. */ - public enum AuthMethod { + /** + * Allows anyone access, doesn't attempt to authenticate user. + * + * Will never return absent(), but only authenticates access from App Engine task-queues. For + * everyone else - returns NOT_AUTHENTICATED. + */ + AUTH_PUBLIC_ANONYMOUS( + ImmutableList.of(AuthMethod.INTERNAL), + AuthLevel.NONE, + UserPolicy.PUBLIC), - /** App Engine internal authentication. Must always be provided as the first method. */ - INTERNAL, + /** + * Allows anyone access, does attempt to authenticate user. + * + * If a user is logged in, will authenticate (and return) them. Otherwise, access is still + * granted, but NOT_AUTHENTICATED is returned. + * + * Will never return absent(). + */ + AUTH_PUBLIC( + ImmutableList.of(AuthMethod.INTERNAL, AuthMethod.API, AuthMethod.LEGACY), + AuthLevel.NONE, + UserPolicy.PUBLIC), - /** Authentication methods suitable for API-style access, such as OAuth 2. */ - API, + /** + * Allows anyone access, as long as they are logged in. + * + * Does not allow access from App Engine task-queues. + */ + AUTH_PUBLIC_LOGGED_IN( + ImmutableList.of(AuthMethod.API, AuthMethod.LEGACY), + AuthLevel.USER, + UserPolicy.PUBLIC), - /** Legacy authentication using cookie-based App Engine Users API. Must come last if present. */ - LEGACY + /** + * Allows only admins or App Engine task-queue access. + */ + AUTH_INTERNAL_OR_ADMIN( + ImmutableList.of(AuthMethod.INTERNAL, AuthMethod.API), + AuthLevel.APP, + UserPolicy.ADMIN), + + /** + * Allows only internal (App Engine task-queue) access. + */ + AUTH_INTERNAL_ONLY( + ImmutableList.of(AuthMethod.INTERNAL), + AuthLevel.APP, + UserPolicy.IGNORED); + + private final AuthSettings authSettings; + + Auth( + ImmutableList methods, + AuthLevel minimumLevel, + UserPolicy userPolicy) { + authSettings = AuthSettings.create(methods, minimumLevel, userPolicy); } - /** User authorization policy options. */ - public enum UserPolicy { - - /** This action ignores end users; the only configured auth method must be INTERNAL. */ - IGNORED, - - /** No user policy is enforced; anyone can access this action. */ - PUBLIC, - - /** - * If there is a user, it must be an admin, as determined by isUserAdmin(). - * - *

    Note that, according to App Engine, anybody with access to the app in the GCP Console, - * including editors and viewers, is an admin. - */ - ADMIN + public AuthSettings authSettings() { + return authSettings; } - - /** Enabled authentication methods for this action. */ - AuthMethod[] methods() default { AuthMethod.INTERNAL }; - - /** Required minimum level of authentication for this action. */ - AuthLevel minimumLevel() default AuthLevel.APP; - - /** Required user authorization policy for this action. */ - UserPolicy userPolicy() default UserPolicy.IGNORED; } diff --git a/java/google/registry/request/auth/RequestAuthenticator.java b/java/google/registry/request/auth/RequestAuthenticator.java index caf9ab16e..ec4332079 100644 --- a/java/google/registry/request/auth/RequestAuthenticator.java +++ b/java/google/registry/request/auth/RequestAuthenticator.java @@ -16,10 +16,12 @@ package google.registry.request.auth; import static com.google.common.base.Preconditions.checkArgument; +import com.google.auto.value.AutoValue; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Optional; import com.google.common.collect.ImmutableList; import com.google.common.collect.Ordering; +import com.google.errorprone.annotations.Immutable; import google.registry.util.FormattingLogger; import javax.inject.Inject; import javax.servlet.http.HttpServletRequest; @@ -44,6 +46,57 @@ public class RequestAuthenticator { this.legacyAuthenticationMechanism = legacyAuthenticationMechanism; } + /** + * Parameters used to configure the authenticator. + * + * AuthSettings shouldn't be used directly, instead - use one of the predefined {@link Auth} enum + * values. + */ + @Immutable + @AutoValue + public abstract static class AuthSettings { + + public abstract ImmutableList methods(); + public abstract AuthLevel minimumLevel(); + public abstract UserPolicy userPolicy(); + + static AuthSettings create( + ImmutableList methods, AuthLevel minimumLevel, UserPolicy userPolicy) { + return new AutoValue_RequestAuthenticator_AuthSettings(methods, minimumLevel, userPolicy); + } + } + + /** Available methods for authentication. */ + public enum AuthMethod { + + /** App Engine internal authentication. Must always be provided as the first method. */ + INTERNAL, + + /** Authentication methods suitable for API-style access, such as OAuth 2. */ + API, + + /** Legacy authentication using cookie-based App Engine Users API. Must come last if present. */ + LEGACY + } + + /** User authorization policy options. */ + public enum UserPolicy { + + /** This action ignores end users; the only configured auth method must be INTERNAL. */ + IGNORED, + + /** No user policy is enforced; anyone can access this action. */ + PUBLIC, + + /** + * If there is a user, it must be an admin, as determined by isUserAdmin(). + * + *

    Note that, according to App Engine, anybody with access to the app in the GCP Console, + * including editors and viewers, is an admin. + */ + ADMIN + } + /** * Attempts to authenticate and authorize the user, according to the settings of the action. * @@ -54,7 +107,7 @@ public class RequestAuthenticator { * not; authentication can be "successful" even without any authentication if the action's * auth settings are set to NONE -- in this case, NOT_AUTHENTICATED is returned */ - public Optional authorize(Auth auth, HttpServletRequest req) { + public Optional authorize(AuthSettings auth, HttpServletRequest req) { logger.infofmt("Action requires auth: %s", auth); AuthResult authResult = authenticate(auth, req); switch (auth.minimumLevel()) { @@ -104,15 +157,15 @@ public class RequestAuthenticator { * @param req the {@link HttpServletRequest}; some authentication mechanisms use HTTP headers * @return an authentication result; if no authentication was made, returns NOT_AUTHENTICATED */ - private AuthResult authenticate(Auth auth, HttpServletRequest req) { + private AuthResult authenticate(AuthSettings auth, HttpServletRequest req) { checkAuthConfig(auth); - for (Auth.AuthMethod authMethod : auth.methods()) { + for (AuthMethod authMethod : auth.methods()) { switch (authMethod) { // App Engine internal authentication, using the queue name header case INTERNAL: + // checkAuthConfig will have insured that the user policy is not USER. logger.info("Checking internal auth"); - // INTERNAL should be skipped if a user is required. - if (auth.minimumLevel() != AuthLevel.USER) { + { AuthResult authResult = appEngineInternalAuthenticationMechanism.authenticate(req); if (authResult.isAuthenticated()) { logger.infofmt("Authenticated: %s", authResult); @@ -148,25 +201,20 @@ public class RequestAuthenticator { return AuthResult.NOT_AUTHENTICATED; } - /** Validates an Auth object, checking for invalid setting combinations. */ - void checkAuthConfig(Auth auth) { - ImmutableList authMethods = ImmutableList.copyOf(auth.methods()); + /** Validates an AuthSettings object, checking for invalid setting combinations. */ + static void checkAuthConfig(AuthSettings auth) { + ImmutableList authMethods = ImmutableList.copyOf(auth.methods()); checkArgument(!authMethods.isEmpty(), "Must specify at least one auth method"); checkArgument( - Ordering.explicit(Auth.AuthMethod.INTERNAL, Auth.AuthMethod.API, Auth.AuthMethod.LEGACY) + Ordering.explicit(AuthMethod.INTERNAL, AuthMethod.API, AuthMethod.LEGACY) .isStrictlyOrdered(authMethods), "Auth methods must be unique and strictly in order - INTERNAL, API, LEGACY"); checkArgument( - authMethods.contains(Auth.AuthMethod.INTERNAL), - "Auth method INTERNAL must always be specified, and as the first auth method"); - if (authMethods.equals(ImmutableList.of(Auth.AuthMethod.INTERNAL))) { - checkArgument( - !auth.minimumLevel().equals(AuthLevel.USER), - "Actions with only INTERNAL auth may not require USER auth level"); - } else { - checkArgument( - !auth.userPolicy().equals(Auth.UserPolicy.IGNORED), - "Actions with auth methods beyond INTERNAL must not specify the IGNORED user policy"); - } + !(authMethods.contains(AuthMethod.INTERNAL) && auth.minimumLevel().equals(AuthLevel.USER)), + "Actions with INTERNAL auth method may not require USER auth level"); + checkArgument( + !(auth.userPolicy().equals(UserPolicy.IGNORED) + && !authMethods.equals(ImmutableList.of(AuthMethod.INTERNAL))), + "Actions with auth methods beyond INTERNAL must not specify the IGNORED user policy"); } } diff --git a/java/google/registry/tmch/BUILD b/java/google/registry/tmch/BUILD index 93a73fa78..22b63c96f 100644 --- a/java/google/registry/tmch/BUILD +++ b/java/google/registry/tmch/BUILD @@ -17,6 +17,7 @@ java_library( "//java/google/registry/keyring/api", "//java/google/registry/model", "//java/google/registry/request", + "//java/google/registry/request/auth", "//java/google/registry/util", "//java/google/registry/xml", "//third_party/java/objectify:objectify-v4_1", diff --git a/java/google/registry/tmch/NordnUploadAction.java b/java/google/registry/tmch/NordnUploadAction.java index e9ae67945..515e520b8 100644 --- a/java/google/registry/tmch/NordnUploadAction.java +++ b/java/google/registry/tmch/NordnUploadAction.java @@ -39,6 +39,7 @@ import google.registry.config.RegistryConfig.Config; import google.registry.request.Action; import google.registry.request.Parameter; import google.registry.request.RequestParameters; +import google.registry.request.auth.Auth; import google.registry.util.Clock; import google.registry.util.FormattingLogger; import google.registry.util.UrlFetchException; @@ -57,7 +58,12 @@ import org.joda.time.Duration; * * @see NordnVerifyAction */ -@Action(path = NordnUploadAction.PATH, method = Action.Method.POST, automaticallyPrintOk = true) +@Action( + path = NordnUploadAction.PATH, + method = Action.Method.POST, + automaticallyPrintOk = true, + auth = Auth.AUTH_INTERNAL_ONLY +) public final class NordnUploadAction implements Runnable { static final String PATH = "/_dr/task/nordnUpload"; diff --git a/java/google/registry/tmch/NordnVerifyAction.java b/java/google/registry/tmch/NordnVerifyAction.java index ec2a3e058..87805d51a 100644 --- a/java/google/registry/tmch/NordnVerifyAction.java +++ b/java/google/registry/tmch/NordnVerifyAction.java @@ -32,6 +32,7 @@ import google.registry.request.HttpException.ConflictException; import google.registry.request.Parameter; import google.registry.request.RequestParameters; import google.registry.request.Response; +import google.registry.request.auth.Auth; import google.registry.util.FormattingLogger; import google.registry.util.UrlFetchException; import java.io.IOException; @@ -51,7 +52,12 @@ import javax.inject.Inject; * @see * http://tools.ietf.org/html/draft-lozano-tmch-func-spec-08#section-5.2.3.3 */ -@Action(path = NordnVerifyAction.PATH, method = Action.Method.POST, automaticallyPrintOk = true) +@Action( + path = NordnVerifyAction.PATH, + method = Action.Method.POST, + automaticallyPrintOk = true, + auth = Auth.AUTH_INTERNAL_ONLY +) public final class NordnVerifyAction implements Runnable { public static final String PARAM_CSV_DATA = "csvData"; diff --git a/java/google/registry/tmch/TmchCrlAction.java b/java/google/registry/tmch/TmchCrlAction.java index d4d991565..4f47fc8fd 100644 --- a/java/google/registry/tmch/TmchCrlAction.java +++ b/java/google/registry/tmch/TmchCrlAction.java @@ -20,13 +20,19 @@ import static java.nio.charset.StandardCharsets.UTF_8; import com.google.common.base.Optional; import google.registry.config.RegistryConfig.Config; import google.registry.request.Action; +import google.registry.request.auth.Auth; import java.io.IOException; import java.net.URL; import java.security.GeneralSecurityException; import javax.inject.Inject; /** Action to download the latest ICANN TMCH CRL from MarksDB. */ -@Action(path = "/_dr/task/tmchCrl", method = POST, automaticallyPrintOk = true) +@Action( + path = "/_dr/task/tmchCrl", + method = POST, + automaticallyPrintOk = true, + auth = Auth.AUTH_INTERNAL_ONLY +) public final class TmchCrlAction implements Runnable { @Inject Marksdb marksdb; diff --git a/java/google/registry/tmch/TmchDnlAction.java b/java/google/registry/tmch/TmchDnlAction.java index 664c4918e..102cfd1b3 100644 --- a/java/google/registry/tmch/TmchDnlAction.java +++ b/java/google/registry/tmch/TmchDnlAction.java @@ -20,6 +20,7 @@ import com.google.common.base.Optional; import google.registry.keyring.api.KeyModule.Key; import google.registry.model.tmch.ClaimsListShard; import google.registry.request.Action; +import google.registry.request.auth.Auth; import google.registry.util.FormattingLogger; import java.io.IOException; import java.security.SignatureException; @@ -28,7 +29,12 @@ import javax.inject.Inject; import org.bouncycastle.openpgp.PGPException; /** Action to download the latest domain name list (aka claims list) from MarksDB. */ -@Action(path = "/_dr/task/tmchDnl", method = POST, automaticallyPrintOk = true) +@Action( + path = "/_dr/task/tmchDnl", + method = POST, + automaticallyPrintOk = true, + auth = Auth.AUTH_INTERNAL_ONLY +) public final class TmchDnlAction implements Runnable { private static final FormattingLogger logger = FormattingLogger.getLoggerForCallerClass(); diff --git a/java/google/registry/tmch/TmchSmdrlAction.java b/java/google/registry/tmch/TmchSmdrlAction.java index 57620b861..c024f56c9 100644 --- a/java/google/registry/tmch/TmchSmdrlAction.java +++ b/java/google/registry/tmch/TmchSmdrlAction.java @@ -20,6 +20,7 @@ import com.google.common.base.Optional; import google.registry.keyring.api.KeyModule.Key; import google.registry.model.smd.SignedMarkRevocationList; import google.registry.request.Action; +import google.registry.request.auth.Auth; import google.registry.util.FormattingLogger; import java.io.IOException; import java.security.SignatureException; @@ -28,7 +29,12 @@ import javax.inject.Inject; import org.bouncycastle.openpgp.PGPException; /** Action to download the latest signed mark revocation list from MarksDB. */ -@Action(path = "/_dr/task/tmchSmdrl", method = POST, automaticallyPrintOk = true) +@Action( + path = "/_dr/task/tmchSmdrl", + method = POST, + automaticallyPrintOk = true, + auth = Auth.AUTH_INTERNAL_ONLY +) public final class TmchSmdrlAction implements Runnable { private static final FormattingLogger logger = FormattingLogger.getLoggerForCallerClass(); diff --git a/java/google/registry/tools/server/CreateGroupsAction.java b/java/google/registry/tools/server/CreateGroupsAction.java index 5eb01dcda..9813f1635 100644 --- a/java/google/registry/tools/server/CreateGroupsAction.java +++ b/java/google/registry/tools/server/CreateGroupsAction.java @@ -33,7 +33,6 @@ import google.registry.request.HttpException.InternalServerErrorException; import google.registry.request.Parameter; import google.registry.request.Response; import google.registry.request.auth.Auth; -import google.registry.request.auth.AuthLevel; import google.registry.util.Concurrent; import google.registry.util.FormattingLogger; import java.io.PrintWriter; @@ -46,12 +45,7 @@ import javax.inject.Inject; @Action( path = CreateGroupsAction.PATH, method = POST, - auth = - @Auth( - methods = {Auth.AuthMethod.INTERNAL, Auth.AuthMethod.API}, - minimumLevel = AuthLevel.APP, - userPolicy = Auth.UserPolicy.ADMIN - ) + auth = Auth.AUTH_INTERNAL_OR_ADMIN ) public class CreateGroupsAction implements Runnable { diff --git a/java/google/registry/tools/server/CreatePremiumListAction.java b/java/google/registry/tools/server/CreatePremiumListAction.java index a819ac0e0..584ea54d7 100644 --- a/java/google/registry/tools/server/CreatePremiumListAction.java +++ b/java/google/registry/tools/server/CreatePremiumListAction.java @@ -26,7 +26,6 @@ import google.registry.model.registry.label.PremiumList; import google.registry.request.Action; import google.registry.request.Parameter; import google.registry.request.auth.Auth; -import google.registry.request.auth.AuthLevel; import java.util.List; import javax.inject.Inject; @@ -37,12 +36,7 @@ import javax.inject.Inject; @Action( path = CreatePremiumListAction.PATH, method = POST, - auth = - @Auth( - methods = {Auth.AuthMethod.INTERNAL, Auth.AuthMethod.API}, - minimumLevel = AuthLevel.APP, - userPolicy = Auth.UserPolicy.ADMIN - ) + auth = Auth.AUTH_INTERNAL_OR_ADMIN ) public class CreatePremiumListAction extends CreateOrUpdatePremiumListAction { diff --git a/java/google/registry/tools/server/DeleteEntityAction.java b/java/google/registry/tools/server/DeleteEntityAction.java index b61790f1e..485bc34d0 100644 --- a/java/google/registry/tools/server/DeleteEntityAction.java +++ b/java/google/registry/tools/server/DeleteEntityAction.java @@ -32,7 +32,6 @@ import google.registry.request.HttpException.BadRequestException; import google.registry.request.Parameter; import google.registry.request.Response; import google.registry.request.auth.Auth; -import google.registry.request.auth.AuthLevel; import google.registry.util.FormattingLogger; import javax.inject.Inject; @@ -51,12 +50,7 @@ import javax.inject.Inject; */ @Action( path = DeleteEntityAction.PATH, - auth = - @Auth( - methods = {Auth.AuthMethod.INTERNAL, Auth.AuthMethod.API}, - minimumLevel = AuthLevel.APP, - userPolicy = Auth.UserPolicy.ADMIN - ) + auth = Auth.AUTH_INTERNAL_OR_ADMIN ) public class DeleteEntityAction implements Runnable { diff --git a/java/google/registry/tools/server/GenerateZoneFilesAction.java b/java/google/registry/tools/server/GenerateZoneFilesAction.java index 584b3e7e5..69d402ac2 100644 --- a/java/google/registry/tools/server/GenerateZoneFilesAction.java +++ b/java/google/registry/tools/server/GenerateZoneFilesAction.java @@ -48,7 +48,6 @@ import google.registry.request.Action; import google.registry.request.HttpException.BadRequestException; import google.registry.request.JsonActionRunner; import google.registry.request.auth.Auth; -import google.registry.request.auth.AuthLevel; import google.registry.util.Clock; import java.io.IOException; import java.io.OutputStream; @@ -72,14 +71,9 @@ import org.joda.time.Duration; * 29 days in the past, and must be at midnight UTC. */ @Action( - path = GenerateZoneFilesAction.PATH, - method = POST, - auth = - @Auth( - methods = {Auth.AuthMethod.INTERNAL, Auth.AuthMethod.API}, - minimumLevel = AuthLevel.APP, - userPolicy = Auth.UserPolicy.ADMIN - ) + path = GenerateZoneFilesAction.PATH, + method = POST, + auth = Auth.AUTH_INTERNAL_OR_ADMIN ) public class GenerateZoneFilesAction implements Runnable, JsonActionRunner.JsonAction { diff --git a/java/google/registry/tools/server/KillAllCommitLogsAction.java b/java/google/registry/tools/server/KillAllCommitLogsAction.java index 9012a8d51..7f7decb82 100644 --- a/java/google/registry/tools/server/KillAllCommitLogsAction.java +++ b/java/google/registry/tools/server/KillAllCommitLogsAction.java @@ -32,6 +32,7 @@ import google.registry.model.ofy.CommitLogBucket; import google.registry.model.ofy.CommitLogCheckpointRoot; import google.registry.request.Action; import google.registry.request.Response; +import google.registry.request.auth.Auth; import java.util.Arrays; import javax.inject.Inject; @@ -43,7 +44,11 @@ import javax.inject.Inject; * which only admin users can do. That makes this command hard to use, which is appropriate, given * the drastic consequences of accidental execution. */ -@Action(path = "/_dr/task/killAllCommitLogs", method = POST) +@Action( + path = "/_dr/task/killAllCommitLogs", + method = POST, + auth = Auth.AUTH_INTERNAL_ONLY +) public class KillAllCommitLogsAction implements Runnable { @Inject MapreduceRunner mrRunner; diff --git a/java/google/registry/tools/server/KillAllEppResourcesAction.java b/java/google/registry/tools/server/KillAllEppResourcesAction.java index 36a08f0c7..480f05970 100644 --- a/java/google/registry/tools/server/KillAllEppResourcesAction.java +++ b/java/google/registry/tools/server/KillAllEppResourcesAction.java @@ -32,6 +32,7 @@ import google.registry.model.index.EppResourceIndex; import google.registry.model.index.ForeignKeyIndex; import google.registry.request.Action; import google.registry.request.Response; +import google.registry.request.auth.Auth; import javax.inject.Inject; /** @@ -42,7 +43,11 @@ import javax.inject.Inject; * which only admin users can do. That makes this command hard to use, which is appropriate, given * the drastic consequences of accidental execution. */ -@Action(path = "/_dr/task/killAllEppResources", method = POST) +@Action( + path = "/_dr/task/killAllEppResources", + method = POST, + auth = Auth.AUTH_INTERNAL_ONLY +) public class KillAllEppResourcesAction implements Runnable { @Inject MapreduceRunner mrRunner; diff --git a/java/google/registry/tools/server/ListDomainsAction.java b/java/google/registry/tools/server/ListDomainsAction.java index b2564d688..f35c08a41 100644 --- a/java/google/registry/tools/server/ListDomainsAction.java +++ b/java/google/registry/tools/server/ListDomainsAction.java @@ -27,7 +27,6 @@ import google.registry.model.domain.DomainResource; import google.registry.request.Action; import google.registry.request.Parameter; import google.registry.request.auth.Auth; -import google.registry.request.auth.AuthLevel; import google.registry.util.Clock; import java.util.Comparator; import java.util.List; @@ -37,12 +36,7 @@ import javax.inject.Inject; @Action( path = ListDomainsAction.PATH, method = {GET, POST}, - auth = - @Auth( - methods = {Auth.AuthMethod.INTERNAL, Auth.AuthMethod.API}, - minimumLevel = AuthLevel.APP, - userPolicy = Auth.UserPolicy.ADMIN - ) + auth = Auth.AUTH_INTERNAL_OR_ADMIN ) public final class ListDomainsAction extends ListObjectsAction { diff --git a/java/google/registry/tools/server/ListHostsAction.java b/java/google/registry/tools/server/ListHostsAction.java index ef8102d0c..3e904abdb 100644 --- a/java/google/registry/tools/server/ListHostsAction.java +++ b/java/google/registry/tools/server/ListHostsAction.java @@ -25,7 +25,6 @@ import google.registry.model.EppResourceUtils; import google.registry.model.host.HostResource; import google.registry.request.Action; import google.registry.request.auth.Auth; -import google.registry.request.auth.AuthLevel; import google.registry.util.Clock; import java.util.Comparator; import javax.inject.Inject; @@ -35,12 +34,7 @@ import org.joda.time.DateTime; @Action( path = ListHostsAction.PATH, method = {GET, POST}, - auth = - @Auth( - methods = {Auth.AuthMethod.INTERNAL, Auth.AuthMethod.API}, - minimumLevel = AuthLevel.APP, - userPolicy = Auth.UserPolicy.ADMIN - ) + auth = Auth.AUTH_INTERNAL_OR_ADMIN ) public final class ListHostsAction extends ListObjectsAction { diff --git a/java/google/registry/tools/server/ListPremiumListsAction.java b/java/google/registry/tools/server/ListPremiumListsAction.java index caeff6b61..7127d72aa 100644 --- a/java/google/registry/tools/server/ListPremiumListsAction.java +++ b/java/google/registry/tools/server/ListPremiumListsAction.java @@ -23,7 +23,6 @@ import com.google.common.collect.ImmutableSet; import google.registry.model.registry.label.PremiumList; import google.registry.request.Action; import google.registry.request.auth.Auth; -import google.registry.request.auth.AuthLevel; import javax.inject.Inject; /** @@ -32,12 +31,7 @@ import javax.inject.Inject; @Action( path = ListPremiumListsAction.PATH, method = {GET, POST}, - auth = - @Auth( - methods = {Auth.AuthMethod.INTERNAL, Auth.AuthMethod.API}, - minimumLevel = AuthLevel.APP, - userPolicy = Auth.UserPolicy.ADMIN - ) + auth = Auth.AUTH_INTERNAL_OR_ADMIN ) public final class ListPremiumListsAction extends ListObjectsAction { diff --git a/java/google/registry/tools/server/ListRegistrarsAction.java b/java/google/registry/tools/server/ListRegistrarsAction.java index 156add7cb..be99bfaa0 100644 --- a/java/google/registry/tools/server/ListRegistrarsAction.java +++ b/java/google/registry/tools/server/ListRegistrarsAction.java @@ -23,19 +23,13 @@ import com.google.common.collect.ImmutableSet; import google.registry.model.registrar.Registrar; import google.registry.request.Action; import google.registry.request.auth.Auth; -import google.registry.request.auth.AuthLevel; import javax.inject.Inject; /** An action that lists registrars, for use by the {@code nomulus list_registrars} command. */ @Action( path = ListRegistrarsAction.PATH, method = {GET, POST}, - auth = - @Auth( - methods = {Auth.AuthMethod.INTERNAL, Auth.AuthMethod.API}, - minimumLevel = AuthLevel.APP, - userPolicy = Auth.UserPolicy.ADMIN - ) + auth = Auth.AUTH_INTERNAL_OR_ADMIN ) public final class ListRegistrarsAction extends ListObjectsAction { diff --git a/java/google/registry/tools/server/ListReservedListsAction.java b/java/google/registry/tools/server/ListReservedListsAction.java index deb0e6eed..3a1b3030c 100644 --- a/java/google/registry/tools/server/ListReservedListsAction.java +++ b/java/google/registry/tools/server/ListReservedListsAction.java @@ -23,19 +23,13 @@ import com.google.common.collect.ImmutableSet; import google.registry.model.registry.label.ReservedList; import google.registry.request.Action; import google.registry.request.auth.Auth; -import google.registry.request.auth.AuthLevel; import javax.inject.Inject; /** A that lists reserved lists, for use by the {@code nomulus list_reserved_lists} command. */ @Action( path = ListReservedListsAction.PATH, method = {GET, POST}, - auth = - @Auth( - methods = {Auth.AuthMethod.INTERNAL, Auth.AuthMethod.API}, - minimumLevel = AuthLevel.APP, - userPolicy = Auth.UserPolicy.ADMIN - ) + auth = Auth.AUTH_INTERNAL_OR_ADMIN ) public final class ListReservedListsAction extends ListObjectsAction { diff --git a/java/google/registry/tools/server/ListTldsAction.java b/java/google/registry/tools/server/ListTldsAction.java index e9fe81254..4c85c4ec3 100644 --- a/java/google/registry/tools/server/ListTldsAction.java +++ b/java/google/registry/tools/server/ListTldsAction.java @@ -26,7 +26,6 @@ import com.google.common.collect.ImmutableSet; import google.registry.model.registry.Registry; import google.registry.request.Action; import google.registry.request.auth.Auth; -import google.registry.request.auth.AuthLevel; import google.registry.util.Clock; import javax.inject.Inject; import org.joda.time.DateTime; @@ -35,12 +34,7 @@ import org.joda.time.DateTime; @Action( path = ListTldsAction.PATH, method = {GET, POST}, - auth = - @Auth( - methods = {Auth.AuthMethod.INTERNAL, Auth.AuthMethod.API}, - minimumLevel = AuthLevel.APP, - userPolicy = Auth.UserPolicy.ADMIN - ) + auth = Auth.AUTH_INTERNAL_OR_ADMIN ) public final class ListTldsAction extends ListObjectsAction { diff --git a/java/google/registry/tools/server/RefreshDnsForAllDomainsAction.java b/java/google/registry/tools/server/RefreshDnsForAllDomainsAction.java index a2d3e1f5f..39dfbcc30 100644 --- a/java/google/registry/tools/server/RefreshDnsForAllDomainsAction.java +++ b/java/google/registry/tools/server/RefreshDnsForAllDomainsAction.java @@ -31,7 +31,6 @@ import google.registry.request.Action; import google.registry.request.Parameter; import google.registry.request.Response; import google.registry.request.auth.Auth; -import google.registry.request.auth.AuthLevel; import google.registry.util.FormattingLogger; import google.registry.util.NonFinalForTesting; import javax.inject.Inject; @@ -51,12 +50,7 @@ import org.joda.time.DateTimeZone; */ @Action( path = "/_dr/task/refreshDnsForAllDomains", - auth = - @Auth( - methods = {Auth.AuthMethod.INTERNAL, Auth.AuthMethod.API}, - minimumLevel = AuthLevel.APP, - userPolicy = Auth.UserPolicy.ADMIN - ) + auth = Auth.AUTH_INTERNAL_OR_ADMIN ) public class RefreshDnsForAllDomainsAction implements Runnable { diff --git a/java/google/registry/tools/server/ResaveAllEppResourcesAction.java b/java/google/registry/tools/server/ResaveAllEppResourcesAction.java index 841329f47..e30dc3bdf 100644 --- a/java/google/registry/tools/server/ResaveAllEppResourcesAction.java +++ b/java/google/registry/tools/server/ResaveAllEppResourcesAction.java @@ -27,7 +27,6 @@ import google.registry.model.EppResource; import google.registry.request.Action; import google.registry.request.Response; import google.registry.request.auth.Auth; -import google.registry.request.auth.AuthLevel; import javax.inject.Inject; /** @@ -43,12 +42,7 @@ import javax.inject.Inject; */ @Action( path = "/_dr/task/resaveAllEppResources", - auth = - @Auth( - methods = {Auth.AuthMethod.INTERNAL, Auth.AuthMethod.API}, - minimumLevel = AuthLevel.APP, - userPolicy = Auth.UserPolicy.ADMIN - ) + auth = Auth.AUTH_INTERNAL_OR_ADMIN ) public class ResaveAllEppResourcesAction implements Runnable { diff --git a/java/google/registry/tools/server/UpdatePremiumListAction.java b/java/google/registry/tools/server/UpdatePremiumListAction.java index de732ee37..ec550e085 100644 --- a/java/google/registry/tools/server/UpdatePremiumListAction.java +++ b/java/google/registry/tools/server/UpdatePremiumListAction.java @@ -24,7 +24,6 @@ import com.google.common.collect.ImmutableMap; import google.registry.model.registry.label.PremiumList; import google.registry.request.Action; import google.registry.request.auth.Auth; -import google.registry.request.auth.AuthLevel; import java.util.List; import javax.inject.Inject; @@ -35,12 +34,7 @@ import javax.inject.Inject; @Action( path = UpdatePremiumListAction.PATH, method = POST, - auth = - @Auth( - methods = {Auth.AuthMethod.INTERNAL, Auth.AuthMethod.API}, - minimumLevel = AuthLevel.APP, - userPolicy = Auth.UserPolicy.ADMIN - ) + auth = Auth.AUTH_INTERNAL_OR_ADMIN ) public class UpdatePremiumListAction extends CreateOrUpdatePremiumListAction { diff --git a/java/google/registry/tools/server/VerifyOteAction.java b/java/google/registry/tools/server/VerifyOteAction.java index 29fa0ed9c..22437a925 100644 --- a/java/google/registry/tools/server/VerifyOteAction.java +++ b/java/google/registry/tools/server/VerifyOteAction.java @@ -47,7 +47,6 @@ import google.registry.request.Action; import google.registry.request.JsonActionRunner; import google.registry.request.JsonActionRunner.JsonAction; import google.registry.request.auth.Auth; -import google.registry.request.auth.AuthLevel; import java.util.ArrayList; import java.util.EnumSet; import java.util.List; @@ -62,12 +61,7 @@ import javax.inject.Inject; @Action( path = VerifyOteAction.PATH, method = Action.Method.POST, - auth = - @Auth( - methods = {Auth.AuthMethod.INTERNAL, Auth.AuthMethod.API}, - minimumLevel = AuthLevel.APP, - userPolicy = Auth.UserPolicy.ADMIN - ) + auth = Auth.AUTH_INTERNAL_OR_ADMIN ) public class VerifyOteAction implements Runnable, JsonAction { diff --git a/java/google/registry/ui/server/registrar/ConsoleUiAction.java b/java/google/registry/ui/server/registrar/ConsoleUiAction.java index 4b26ab9db..0a6d8f85a 100644 --- a/java/google/registry/ui/server/registrar/ConsoleUiAction.java +++ b/java/google/registry/ui/server/registrar/ConsoleUiAction.java @@ -34,7 +34,6 @@ import google.registry.model.registrar.Registrar; import google.registry.request.Action; import google.registry.request.Response; import google.registry.request.auth.Auth; -import google.registry.request.auth.AuthLevel; import google.registry.request.auth.AuthResult; import google.registry.security.XsrfTokenManager; import google.registry.ui.server.SoyTemplateUtils; @@ -45,12 +44,7 @@ import javax.servlet.http.HttpServletRequest; /** Action that serves Registrar Console single HTML page (SPA). */ @Action( path = ConsoleUiAction.PATH, - auth = - @Auth( - methods = {Auth.AuthMethod.INTERNAL, Auth.AuthMethod.API, Auth.AuthMethod.LEGACY}, - minimumLevel = AuthLevel.NONE, - userPolicy = Auth.UserPolicy.PUBLIC - ) + auth = Auth.AUTH_PUBLIC ) public final class ConsoleUiAction implements Runnable { diff --git a/java/google/registry/ui/server/registrar/RegistrarPaymentAction.java b/java/google/registry/ui/server/registrar/RegistrarPaymentAction.java index c3da31834..a7becab86 100644 --- a/java/google/registry/ui/server/registrar/RegistrarPaymentAction.java +++ b/java/google/registry/ui/server/registrar/RegistrarPaymentAction.java @@ -36,7 +36,6 @@ import google.registry.request.Action; import google.registry.request.JsonActionRunner; import google.registry.request.JsonActionRunner.JsonAction; import google.registry.request.auth.Auth; -import google.registry.request.auth.AuthLevel; import google.registry.request.auth.AuthResult; import google.registry.security.JsonResponseHelper; import google.registry.ui.forms.FormField; @@ -97,12 +96,7 @@ import org.joda.money.Money; @Action( path = "/registrar-payment", method = Action.Method.POST, - auth = - @Auth( - methods = {Auth.AuthMethod.INTERNAL, Auth.AuthMethod.API, Auth.AuthMethod.LEGACY}, - minimumLevel = AuthLevel.USER, - userPolicy = Auth.UserPolicy.PUBLIC - ) + auth = Auth.AUTH_PUBLIC_LOGGED_IN ) public final class RegistrarPaymentAction implements Runnable, JsonAction { diff --git a/java/google/registry/ui/server/registrar/RegistrarPaymentSetupAction.java b/java/google/registry/ui/server/registrar/RegistrarPaymentSetupAction.java index 41cd2448b..a3dda2ad9 100644 --- a/java/google/registry/ui/server/registrar/RegistrarPaymentSetupAction.java +++ b/java/google/registry/ui/server/registrar/RegistrarPaymentSetupAction.java @@ -29,7 +29,6 @@ import google.registry.request.Action; import google.registry.request.JsonActionRunner; import google.registry.request.JsonActionRunner.JsonAction; import google.registry.request.auth.Auth; -import google.registry.request.auth.AuthLevel; import google.registry.request.auth.AuthResult; import google.registry.security.JsonResponseHelper; import java.util.Map; @@ -72,12 +71,7 @@ import org.joda.money.CurrencyUnit; @Action( path = "/registrar-payment-setup", method = Action.Method.POST, - auth = - @Auth( - methods = {Auth.AuthMethod.INTERNAL, Auth.AuthMethod.API, Auth.AuthMethod.LEGACY}, - minimumLevel = AuthLevel.USER, - userPolicy = Auth.UserPolicy.PUBLIC - ) + auth = Auth.AUTH_PUBLIC_LOGGED_IN ) public final class RegistrarPaymentSetupAction implements Runnable, JsonAction { diff --git a/java/google/registry/ui/server/registrar/RegistrarSettingsAction.java b/java/google/registry/ui/server/registrar/RegistrarSettingsAction.java index 5477e7beb..c9ab29529 100644 --- a/java/google/registry/ui/server/registrar/RegistrarSettingsAction.java +++ b/java/google/registry/ui/server/registrar/RegistrarSettingsAction.java @@ -41,7 +41,6 @@ import google.registry.request.Action; import google.registry.request.HttpException.BadRequestException; import google.registry.request.JsonActionRunner; import google.registry.request.auth.Auth; -import google.registry.request.auth.AuthLevel; import google.registry.request.auth.AuthResult; import google.registry.security.JsonResponseHelper; import google.registry.ui.forms.FormException; @@ -65,12 +64,7 @@ import javax.servlet.http.HttpServletRequest; @Action( path = RegistrarSettingsAction.PATH, method = Action.Method.POST, - auth = - @Auth( - methods = {Auth.AuthMethod.INTERNAL, Auth.AuthMethod.API, Auth.AuthMethod.LEGACY}, - minimumLevel = AuthLevel.USER, - userPolicy = Auth.UserPolicy.PUBLIC - ) + auth = Auth.AUTH_PUBLIC_LOGGED_IN ) public class RegistrarSettingsAction implements Runnable, JsonActionRunner.JsonAction { diff --git a/java/google/registry/whois/WhoisHttpServer.java b/java/google/registry/whois/WhoisHttpServer.java index fce8fd2a8..397c425c1 100644 --- a/java/google/registry/whois/WhoisHttpServer.java +++ b/java/google/registry/whois/WhoisHttpServer.java @@ -33,7 +33,6 @@ import google.registry.request.Action; import google.registry.request.RequestPath; import google.registry.request.Response; import google.registry.request.auth.Auth; -import google.registry.request.auth.AuthLevel; import google.registry.util.Clock; import google.registry.util.FormattingLogger; import google.registry.whois.WhoisMetrics.WhoisMetric; @@ -99,7 +98,7 @@ import org.joda.time.Duration; @Action( path = WhoisHttpServer.PATH, isPrefix = true, - auth = @Auth(minimumLevel = AuthLevel.NONE, userPolicy = Auth.UserPolicy.PUBLIC) + auth = Auth.AUTH_PUBLIC_ANONYMOUS ) public final class WhoisHttpServer implements Runnable { diff --git a/java/google/registry/whois/WhoisServer.java b/java/google/registry/whois/WhoisServer.java index edc050091..100b39a1a 100644 --- a/java/google/registry/whois/WhoisServer.java +++ b/java/google/registry/whois/WhoisServer.java @@ -25,7 +25,6 @@ import google.registry.config.RegistryConfig.Config; import google.registry.request.Action; import google.registry.request.Response; import google.registry.request.auth.Auth; -import google.registry.request.auth.AuthLevel; import google.registry.util.Clock; import google.registry.util.FormattingLogger; import google.registry.util.Retrier; @@ -54,12 +53,7 @@ import org.joda.time.DateTime; @Action( path = "/_dr/whois", method = POST, - auth = - @Auth( - methods = {Auth.AuthMethod.INTERNAL, Auth.AuthMethod.API}, - minimumLevel = AuthLevel.APP, - userPolicy = Auth.UserPolicy.ADMIN - ) + auth = Auth.AUTH_INTERNAL_OR_ADMIN ) public class WhoisServer implements Runnable { diff --git a/javatests/google/registry/module/frontend/testdata/frontend_routing.txt b/javatests/google/registry/module/frontend/testdata/frontend_routing.txt index 51acb232b..37cf14f0e 100644 --- a/javatests/google/registry/module/frontend/testdata/frontend_routing.txt +++ b/javatests/google/registry/module/frontend/testdata/frontend_routing.txt @@ -12,8 +12,8 @@ PATH CLASS METHODS OK AUTH_METHODS /rdap/nameserver/(*) RdapNameserverAction GET,HEAD n INTERNAL NONE PUBLIC /rdap/nameservers RdapNameserverSearchAction GET,HEAD n INTERNAL NONE PUBLIC /registrar ConsoleUiAction GET n INTERNAL,API,LEGACY NONE PUBLIC -/registrar-payment RegistrarPaymentAction POST n INTERNAL,API,LEGACY USER PUBLIC -/registrar-payment-setup RegistrarPaymentSetupAction POST n INTERNAL,API,LEGACY USER PUBLIC -/registrar-settings RegistrarSettingsAction POST n INTERNAL,API,LEGACY USER PUBLIC -/registrar-xhr EppConsoleAction POST n INTERNAL,API,LEGACY USER PUBLIC +/registrar-payment RegistrarPaymentAction POST n API,LEGACY USER PUBLIC +/registrar-payment-setup RegistrarPaymentSetupAction POST n API,LEGACY USER PUBLIC +/registrar-settings RegistrarSettingsAction POST n API,LEGACY USER PUBLIC +/registrar-xhr EppConsoleAction POST n API,LEGACY USER PUBLIC /whois/(*) WhoisHttpServer GET n INTERNAL NONE PUBLIC diff --git a/javatests/google/registry/request/RequestHandlerTest.java b/javatests/google/registry/request/RequestHandlerTest.java index e47af9eee..23f6028ac 100644 --- a/javatests/google/registry/request/RequestHandlerTest.java +++ b/javatests/google/registry/request/RequestHandlerTest.java @@ -17,30 +17,23 @@ package google.registry.request; import static com.google.common.truth.Truth.assertThat; import static google.registry.request.Action.Method.GET; import static google.registry.request.Action.Method.POST; +import static google.registry.request.auth.Auth.AUTH_INTERNAL_OR_ADMIN; +import static google.registry.request.auth.Auth.AUTH_PUBLIC; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.verifyZeroInteractions; import static org.mockito.Mockito.when; -import com.google.appengine.api.oauth.OAuthServiceFactory; import com.google.appengine.api.users.User; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableSet; +import com.google.common.base.Optional; import com.google.common.testing.NullPointerTester; import google.registry.request.HttpException.ServiceUnavailableException; -import google.registry.request.auth.AppEngineInternalAuthenticationMechanism; -import google.registry.request.auth.Auth; import google.registry.request.auth.AuthLevel; import google.registry.request.auth.AuthResult; -import google.registry.request.auth.AuthenticationMechanism; -import google.registry.request.auth.LegacyAuthenticationMechanism; -import google.registry.request.auth.OAuthAuthenticationMechanism; import google.registry.request.auth.RequestAuthenticator; -import google.registry.security.XsrfTokenManager; +import google.registry.request.auth.UserAuthInfo; import google.registry.testing.AppEngineRule; -import google.registry.testing.FakeClock; -import google.registry.testing.FakeUserService; import google.registry.testing.Providers; import google.registry.testing.UserInfo; import java.io.PrintWriter; @@ -69,7 +62,7 @@ public final class RequestHandlerTest { path = "/bumblebee", method = {GET, POST}, isPrefix = true, - auth = @Auth(minimumLevel = AuthLevel.NONE) + auth = AUTH_PUBLIC ) public static class BumblebeeTask implements Runnable { @Override @@ -80,7 +73,7 @@ public final class RequestHandlerTest { path = "/sloth", method = POST, automaticallyPrintOk = true, - auth = @Auth(minimumLevel = AuthLevel.NONE) + auth = AUTH_PUBLIC ) public static class SlothTask implements Runnable { @Override @@ -90,14 +83,14 @@ public final class RequestHandlerTest { @Action( path = "/safe-sloth", method = {GET, POST}, - auth = @Auth(minimumLevel = AuthLevel.NONE) + auth = AUTH_PUBLIC ) public static class SafeSlothTask implements Runnable { @Override public void run() {} } - @Action(path = "/fail", auth = @Auth(minimumLevel = AuthLevel.NONE)) + @Action(path = "/fail", auth = AUTH_PUBLIC) public static final class FailTask implements Runnable { @Override public void run() { @@ -105,7 +98,7 @@ public final class RequestHandlerTest { } } - @Action(path = "/failAtConstruction", auth = @Auth(minimumLevel = AuthLevel.NONE)) + @Action(path = "/failAtConstruction", auth = AUTH_PUBLIC) public static final class FailAtConstructionTask implements Runnable { public FailAtConstructionTask() { throw new ServiceUnavailableException("Fail at construction"); @@ -132,7 +125,7 @@ public final class RequestHandlerTest { @Action( path = "/auth/none", - auth = @Auth(minimumLevel = AuthLevel.NONE), + auth = AUTH_PUBLIC, method = Action.Method.GET ) public class AuthNoneAction extends AuthBase { @@ -142,14 +135,11 @@ public final class RequestHandlerTest { } @Action( - path = "/auth/adminUserAnyMethod", - auth = @Auth( - methods = {Auth.AuthMethod.INTERNAL, Auth.AuthMethod.API, Auth.AuthMethod.LEGACY}, - minimumLevel = AuthLevel.USER, - userPolicy = Auth.UserPolicy.ADMIN), + path = "/auth/adminUser", + auth = AUTH_INTERNAL_OR_ADMIN, method = Action.Method.GET) - public class AuthAdminUserAnyMethodAction extends AuthBase { - AuthAdminUserAnyMethodAction(AuthResult authResult) { + public class AuthAdminUserAction extends AuthBase { + AuthAdminUserAction(AuthResult authResult) { super(authResult); } } @@ -190,8 +180,8 @@ public final class RequestHandlerTest { return new AuthNoneAction(component.getRequestModule().provideAuthResult()); } - public AuthAdminUserAnyMethodAction authAdminUserAnyMethodAction() { - return new AuthAdminUserAnyMethodAction(component.getRequestModule().provideAuthResult()); + public AuthAdminUserAction authAdminUserAction() { + return new AuthAdminUserAction(component.getRequestModule().provideAuthResult()); } } @@ -209,30 +199,16 @@ public final class RequestHandlerTest { private final BumblebeeTask bumblebeeTask = mock(BumblebeeTask.class); private final SlothTask slothTask = mock(SlothTask.class); private final SafeSlothTask safeSlothTask = mock(SafeSlothTask.class); + private final RequestAuthenticator requestAuthenticator = mock(RequestAuthenticator.class); private final Component component = new Component(); private final StringWriter httpOutput = new StringWriter(); private RequestHandler handler; private AuthResult providedAuthResult = null; private final User testUser = new User("test@example.com", "test@example.com"); - private RequestAuthenticator requestAuthenticator; - private XsrfTokenManager xsrfTokenManager; - private FakeUserService userService; @Before public void before() throws Exception { - userService = new FakeUserService(); - xsrfTokenManager = new XsrfTokenManager(new FakeClock(), userService); - requestAuthenticator = new RequestAuthenticator( - new AppEngineInternalAuthenticationMechanism(), - ImmutableList.of( - new OAuthAuthenticationMechanism( - OAuthServiceFactory.getOAuthService(), - ImmutableSet.of("https://www.googleapis.com/auth/userinfo.email"), - ImmutableSet.of("https://www.googleapis.com/auth/userinfo.email"), - ImmutableSet.of("proxy-client-id", "regtool-client-id"))), - new LegacyAuthenticationMechanism(userService, xsrfTokenManager)); - // Initialize here, not inline, so that we pick up the mocked UserService. handler = RequestHandler.createForTest( Component.class, @@ -256,19 +232,24 @@ public final class RequestHandlerTest { public void testHandleRequest_normalRequest_works() throws Exception { when(req.getMethod()).thenReturn("GET"); when(req.getRequestURI()).thenReturn("/bumblebee"); + when(requestAuthenticator.authorize(AUTH_PUBLIC.authSettings(), req)) + .thenReturn(Optional.of(AuthResult.create(AuthLevel.NONE))); + handler.handleRequest(req, rsp); + verifyZeroInteractions(rsp); verify(bumblebeeTask).run(); } @Test public void testHandleRequest_multipleMethodMappings_works() throws Exception { - userService.setUser(testUser, false); when(req.getMethod()).thenReturn("POST"); - when(req.getHeader("X-CSRF-Token")) - .thenReturn(xsrfTokenManager.generateToken(testUser.getEmail())); when(req.getRequestURI()).thenReturn("/bumblebee"); + when(requestAuthenticator.authorize(AUTH_PUBLIC.authSettings(), req)) + .thenReturn(Optional.of(AuthResult.create(AuthLevel.NONE))); + handler.handleRequest(req, rsp); + verify(bumblebeeTask).run(); } @@ -276,18 +257,23 @@ public final class RequestHandlerTest { public void testHandleRequest_prefixEnabled_subpathsWork() throws Exception { when(req.getMethod()).thenReturn("GET"); when(req.getRequestURI()).thenReturn("/bumblebee/hive"); + when(requestAuthenticator.authorize(AUTH_PUBLIC.authSettings(), req)) + .thenReturn(Optional.of(AuthResult.create(AuthLevel.NONE))); + handler.handleRequest(req, rsp); + verify(bumblebeeTask).run(); } @Test public void testHandleRequest_taskHasAutoPrintOk_printsOk() throws Exception { - userService.setUser(testUser, false); when(req.getMethod()).thenReturn("POST"); - when(req.getHeader("X-CSRF-Token")) - .thenReturn(xsrfTokenManager.generateToken(testUser.getEmail())); when(req.getRequestURI()).thenReturn("/sloth"); + when(requestAuthenticator.authorize(AUTH_PUBLIC.authSettings(), req)) + .thenReturn(Optional.of(AuthResult.create(AuthLevel.NONE))); + handler.handleRequest(req, rsp); + verify(slothTask).run(); verify(rsp).setContentType("text/plain; charset=utf-8"); verify(rsp).getWriter(); @@ -298,7 +284,11 @@ public final class RequestHandlerTest { public void testHandleRequest_prefixDisabled_subpathsReturn404NotFound() throws Exception { when(req.getMethod()).thenReturn("POST"); when(req.getRequestURI()).thenReturn("/sloth/nest"); + when(requestAuthenticator.authorize(AUTH_PUBLIC.authSettings(), req)) + .thenReturn(Optional.of(AuthResult.create(AuthLevel.NONE))); + handler.handleRequest(req, rsp); + verify(rsp).sendError(404); } @@ -306,7 +296,11 @@ public final class RequestHandlerTest { public void testHandleRequest_taskThrowsHttpException_getsHandledByHandler() throws Exception { when(req.getMethod()).thenReturn("GET"); when(req.getRequestURI()).thenReturn("/fail"); + when(requestAuthenticator.authorize(AUTH_PUBLIC.authSettings(), req)) + .thenReturn(Optional.of(AuthResult.create(AuthLevel.NONE))); + handler.handleRequest(req, rsp); + verify(rsp).sendError(503, "Set sail for fail"); } @@ -316,7 +310,11 @@ public final class RequestHandlerTest { throws Exception { when(req.getMethod()).thenReturn("GET"); when(req.getRequestURI()).thenReturn("/failAtConstruction"); + when(requestAuthenticator.authorize(AUTH_PUBLIC.authSettings(), req)) + .thenReturn(Optional.of(AuthResult.create(AuthLevel.NONE))); + handler.handleRequest(req, rsp); + verify(rsp).sendError(503, "Fail at construction"); } @@ -324,7 +322,11 @@ public final class RequestHandlerTest { public void testHandleRequest_notFound_returns404NotFound() throws Exception { when(req.getMethod()).thenReturn("GET"); when(req.getRequestURI()).thenReturn("/bogus"); + when(requestAuthenticator.authorize(AUTH_PUBLIC.authSettings(), req)) + .thenReturn(Optional.of(AuthResult.create(AuthLevel.NONE))); + handler.handleRequest(req, rsp); + verify(rsp).sendError(404); } @@ -332,7 +334,11 @@ public final class RequestHandlerTest { public void testHandleRequest_methodNotAllowed_returns405MethodNotAllowed() throws Exception { when(req.getMethod()).thenReturn("POST"); when(req.getRequestURI()).thenReturn("/fail"); + when(requestAuthenticator.authorize(AUTH_PUBLIC.authSettings(), req)) + .thenReturn(Optional.of(AuthResult.create(AuthLevel.NONE))); + handler.handleRequest(req, rsp); + verify(rsp).sendError(405); } @@ -340,7 +346,11 @@ public final class RequestHandlerTest { public void testHandleRequest_insaneMethod_returns405MethodNotAllowed() throws Exception { when(req.getMethod()).thenReturn("FIREAWAY"); when(req.getRequestURI()).thenReturn("/fail"); + when(requestAuthenticator.authorize(AUTH_PUBLIC.authSettings(), req)) + .thenReturn(Optional.of(AuthResult.create(AuthLevel.NONE))); + handler.handleRequest(req, rsp); + verify(rsp).sendError(405); } @@ -350,7 +360,11 @@ public final class RequestHandlerTest { public void testHandleRequest_lowercaseMethod_notRecognized() throws Exception { when(req.getMethod()).thenReturn("get"); when(req.getRequestURI()).thenReturn("/bumblebee"); + when(requestAuthenticator.authorize(AUTH_PUBLIC.authSettings(), req)) + .thenReturn(Optional.of(AuthResult.create(AuthLevel.NONE))); + handler.handleRequest(req, rsp); + verify(rsp).sendError(405); } @@ -359,19 +373,19 @@ public final class RequestHandlerTest { NullPointerTester tester = new NullPointerTester(); tester.setDefault(Class.class, Component.class); tester.setDefault(RequestAuthenticator.class, requestAuthenticator); - tester.setDefault(XsrfTokenManager.class, xsrfTokenManager); tester.testAllPublicStaticMethods(RequestHandler.class); tester.testAllPublicInstanceMethods(handler); } @Test public void testXsrfProtection_validTokenProvided_runsAction() throws Exception { - userService.setUser(testUser, false); when(req.getMethod()).thenReturn("POST"); - when(req.getHeader("X-CSRF-Token")) - .thenReturn(xsrfTokenManager.generateToken(testUser.getEmail())); when(req.getRequestURI()).thenReturn("/safe-sloth"); + when(requestAuthenticator.authorize(AUTH_PUBLIC.authSettings(), req)) + .thenReturn(Optional.of(AuthResult.create(AuthLevel.NONE))); + handler.handleRequest(req, rsp); + verify(safeSlothTask).run(); } @@ -379,7 +393,11 @@ public final class RequestHandlerTest { public void testXsrfProtection_GETMethodWithoutToken_doesntCheckToken() throws Exception { when(req.getMethod()).thenReturn("GET"); when(req.getRequestURI()).thenReturn("/safe-sloth"); + when(requestAuthenticator.authorize(AUTH_PUBLIC.authSettings(), req)) + .thenReturn(Optional.of(AuthResult.create(AuthLevel.NONE))); + handler.handleRequest(req, rsp); + verify(safeSlothTask).run(); } @@ -387,6 +405,8 @@ public final class RequestHandlerTest { public void testNoAuthNeeded_success() throws Exception { when(req.getMethod()).thenReturn("GET"); when(req.getRequestURI()).thenReturn("/auth/none"); + when(requestAuthenticator.authorize(AUTH_PUBLIC.authSettings(), req)) + .thenReturn(Optional.of(AuthResult.create(AuthLevel.NONE))); handler.handleRequest(req, rsp); @@ -396,22 +416,11 @@ public final class RequestHandlerTest { } @Test - public void testAuthNeeded_notLoggedIn() throws Exception { + public void testAuthNeeded_failure() throws Exception { when(req.getMethod()).thenReturn("GET"); - when(req.getRequestURI()).thenReturn("/auth/adminUserAnyMethod"); - - handler.handleRequest(req, rsp); - - verify(rsp).sendError(403, "Not authorized"); - assertThat(providedAuthResult).isNull(); - assertThat(providedAuthResult).isNull(); - } - - @Test - public void testAuthNeeded_notAuthorized() throws Exception { - userService.setUser(testUser, false); - when(req.getMethod()).thenReturn("GET"); - when(req.getRequestURI()).thenReturn("/auth/adminUserAnyMethod"); + when(req.getRequestURI()).thenReturn("/auth/adminUser"); + when(requestAuthenticator.authorize(AUTH_INTERNAL_OR_ADMIN.authSettings(), req)) + .thenReturn(Optional.absent()); handler.handleRequest(req, rsp); @@ -421,9 +430,11 @@ public final class RequestHandlerTest { @Test public void testAuthNeeded_success() throws Exception { - userService.setUser(testUser, true); when(req.getMethod()).thenReturn("GET"); - when(req.getRequestURI()).thenReturn("/auth/adminUserAnyMethod"); + when(req.getRequestURI()).thenReturn("/auth/adminUser"); + when(requestAuthenticator.authorize(AUTH_INTERNAL_OR_ADMIN.authSettings(), req)) + .thenReturn( + Optional.of(AuthResult.create(AuthLevel.USER, UserAuthInfo.create(testUser, true)))); handler.handleRequest(req, rsp); @@ -433,4 +444,5 @@ public final class RequestHandlerTest { assertThat(providedAuthResult.userAuthInfo().get().user()).isEqualTo(testUser); assertThat(providedAuthResult.userAuthInfo().get().oauthTokenInfo()).isAbsent(); } + } diff --git a/javatests/google/registry/request/RouterTest.java b/javatests/google/registry/request/RouterTest.java index bf284da44..2b9c870bf 100644 --- a/javatests/google/registry/request/RouterTest.java +++ b/javatests/google/registry/request/RouterTest.java @@ -15,6 +15,7 @@ package google.registry.request; import static com.google.common.truth.Truth.assertThat; +import static google.registry.request.auth.Auth.AUTH_INTERNAL_ONLY; import com.google.common.base.Function; import com.google.common.base.Optional; @@ -46,7 +47,7 @@ public final class RouterTest { //////////////////////////////////////////////////////////////////////////////////////////////// - @Action(path = "/sloth") + @Action(path = "/sloth", auth = AUTH_INTERNAL_ONLY) public static final class SlothTask implements Runnable { @Override public void run() {} @@ -76,7 +77,7 @@ public final class RouterTest { //////////////////////////////////////////////////////////////////////////////////////////////// - @Action(path = "/prefix", isPrefix = true) + @Action(path = "/prefix", isPrefix = true, auth = AUTH_INTERNAL_ONLY) public static final class PrefixTask implements Runnable { @Override public void run() {} @@ -102,7 +103,7 @@ public final class RouterTest { //////////////////////////////////////////////////////////////////////////////////////////////// - @Action(path = "/prefix/long", isPrefix = true) + @Action(path = "/prefix/long", isPrefix = true, auth = AUTH_INTERNAL_ONLY) public static final class LongTask implements Runnable { @Override public void run() {} @@ -151,13 +152,13 @@ public final class RouterTest { //////////////////////////////////////////////////////////////////////////////////////////////// - @Action(path = "/samePathAsOtherTask") + @Action(path = "/samePathAsOtherTask", auth = AUTH_INTERNAL_ONLY) public static final class DuplicateTask1 implements Runnable { @Override public void run() {} } - @Action(path = "/samePathAsOtherTask") + @Action(path = "/samePathAsOtherTask", auth = AUTH_INTERNAL_ONLY) public static final class DuplicateTask2 implements Runnable { @Override public void run() {} diff --git a/javatests/google/registry/request/auth/AuthTest.java b/javatests/google/registry/request/auth/AuthTest.java new file mode 100644 index 000000000..e36902990 --- /dev/null +++ b/javatests/google/registry/request/auth/AuthTest.java @@ -0,0 +1,31 @@ +// Copyright 2017 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.request.auth; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +/** Unit tests for {@link Auth}. */ +@RunWith(JUnit4.class) +public final class AuthTest { + + @Test + public void testAuthValues_validConfig() throws Exception { + for (Auth auth : Auth.values()) { + RequestAuthenticator.checkAuthConfig(auth.authSettings()); + } + } +} diff --git a/javatests/google/registry/request/auth/RequestAuthenticatorTest.java b/javatests/google/registry/request/auth/RequestAuthenticatorTest.java index 799825b94..86771f4fa 100644 --- a/javatests/google/registry/request/auth/RequestAuthenticatorTest.java +++ b/javatests/google/registry/request/auth/RequestAuthenticatorTest.java @@ -25,7 +25,9 @@ import com.google.appengine.api.users.UserService; import com.google.common.base.Optional; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; -import google.registry.request.Action; +import google.registry.request.auth.RequestAuthenticator.AuthMethod; +import google.registry.request.auth.RequestAuthenticator.AuthSettings; +import google.registry.request.auth.RequestAuthenticator.UserPolicy; import google.registry.security.XsrfTokenManager; import google.registry.testing.AppEngineRule; import google.registry.testing.ExceptionRule; @@ -49,79 +51,55 @@ public class RequestAuthenticatorTest { @Rule public final ExceptionRule thrown = new ExceptionRule(); - @Action( - path = "/auth/none", - auth = @Auth( - methods = {Auth.AuthMethod.INTERNAL}, - minimumLevel = AuthLevel.NONE, - userPolicy = Auth.UserPolicy.IGNORED), - method = Action.Method.GET) - public static class AuthNone {} + private static final AuthSettings AUTH_NONE = AuthSettings.create( + ImmutableList.of(AuthMethod.INTERNAL), + AuthLevel.NONE, + UserPolicy.IGNORED); - @Action( - path = "/auth/internalOnly", - auth = @Auth(minimumLevel = AuthLevel.APP), - method = Action.Method.GET) - public static class AuthInternalOnly {} + private static final AuthSettings AUTH_INTERNAL_ONLY = AuthSettings.create( + ImmutableList.of(AuthMethod.INTERNAL), + AuthLevel.APP, + UserPolicy.IGNORED); - @Action( - path = "/auth/anyUserAnyMethod", - auth = @Auth( - methods = {Auth.AuthMethod.INTERNAL, Auth.AuthMethod.API, Auth.AuthMethod.LEGACY}, - minimumLevel = AuthLevel.USER, - userPolicy = Auth.UserPolicy.PUBLIC), - method = Action.Method.GET) - public static class AuthAnyUserAnyMethod {} + private static final AuthSettings AUTH_ANY_USER_ANY_METHOD = AuthSettings.create( + ImmutableList.of(AuthMethod.API, AuthMethod.LEGACY), + AuthLevel.USER, + UserPolicy.PUBLIC); - @Action( - path = "/auth/anyUserNoLegacy", - auth = @Auth( - methods = {Auth.AuthMethod.INTERNAL, Auth.AuthMethod.API}, - minimumLevel = AuthLevel.USER, - userPolicy = Auth.UserPolicy.PUBLIC), - method = Action.Method.GET) - public static class AuthAnyUserNoLegacy {} + private static final AuthSettings AUTH_ANY_USER_NO_LEGACY = AuthSettings.create( + ImmutableList.of(AuthMethod.API), + AuthLevel.USER, + UserPolicy.PUBLIC); - @Action( - path = "/auth/adminUserAnyMethod", - auth = @Auth( - methods = {Auth.AuthMethod.INTERNAL, Auth.AuthMethod.API, Auth.AuthMethod.LEGACY}, - minimumLevel = AuthLevel.USER, - userPolicy = Auth.UserPolicy.ADMIN), - method = Action.Method.GET) - public static class AuthAdminUserAnyMethod {} + private static final AuthSettings AUTH_ADMIN_USER_ANY_METHOD = AuthSettings.create( + ImmutableList.of(AuthMethod.API, AuthMethod.LEGACY), + AuthLevel.USER, + UserPolicy.ADMIN); - @Action( - path = "/auth/noMethods", - auth = @Auth(methods = {})) - public static class AuthNoMethods {} + private static final AuthSettings AUTH_NO_METHODS = AuthSettings.create( + ImmutableList.of(), + AuthLevel.APP, + UserPolicy.IGNORED); - @Action( - path = "/auth/missingInternal", - auth = @Auth(methods = {Auth.AuthMethod.API, Auth.AuthMethod.LEGACY})) - public static class AuthMissingInternal {} + private static final AuthSettings AUTH_WRONG_METHOD_ORDERING = AuthSettings.create( + ImmutableList.of(AuthMethod.API, AuthMethod.INTERNAL), + AuthLevel.APP, + UserPolicy.IGNORED); - @Action( - path = "/auth/wrongMethodOrdering", - auth = @Auth(methods = {Auth.AuthMethod.API, Auth.AuthMethod.INTERNAL})) - public static class AuthWrongMethodOrdering {} + private static final AuthSettings AUTH_DUPLICATE_METHODS = AuthSettings.create( + ImmutableList.of(AuthMethod.INTERNAL, AuthMethod.API, AuthMethod.API), + AuthLevel.APP, + UserPolicy.IGNORED); - @Action( - path = "/auth/duplicateMethods", - auth = @Auth(methods = {Auth.AuthMethod.INTERNAL, Auth.AuthMethod.API, Auth.AuthMethod.API})) - public static class AuthDuplicateMethods {} + private static final AuthSettings AUTH_INTERNAL_WITH_USER = AuthSettings.create( + ImmutableList.of(AuthMethod.INTERNAL, AuthMethod.API), + AuthLevel.USER, + UserPolicy.IGNORED); - @Action( - path = "/auth/internalWithUser", - auth = @Auth(methods = {Auth.AuthMethod.INTERNAL}, minimumLevel = AuthLevel.USER)) - public static class AuthInternalWithUser {} - - @Action( - path = "/auth/wronglyIgnoringUser", - auth = @Auth( - methods = {Auth.AuthMethod.INTERNAL, Auth.AuthMethod.API}, - userPolicy = Auth.UserPolicy.IGNORED)) - public static class AuthWronglyIgnoringUser {} + private static final AuthSettings AUTH_WRONGLY_IGNORING_USER = AuthSettings.create( + ImmutableList.of(AuthMethod.INTERNAL, AuthMethod.API), + AuthLevel.APP, + UserPolicy.IGNORED); private final UserService mockUserService = mock(UserService.class); private final HttpServletRequest req = mock(HttpServletRequest.class); @@ -154,14 +132,14 @@ public class RequestAuthenticatorTest { new LegacyAuthenticationMechanism(userService, xsrfTokenManager)); } - private Optional runTest(UserService userService, Class clazz) { + private Optional runTest(UserService userService, AuthSettings auth) { return createRequestAuthenticator(userService) - .authorize(clazz.getAnnotation(Action.class).auth(), req); + .authorize(auth, req); } @Test public void testNoAuthNeeded_noneFound() throws Exception { - Optional authResult = runTest(mockUserService, AuthNone.class); + Optional authResult = runTest(mockUserService, AUTH_NONE); verifyZeroInteractions(mockUserService); assertThat(authResult).isPresent(); @@ -172,7 +150,7 @@ public class RequestAuthenticatorTest { public void testNoAuthNeeded_internalFound() throws Exception { when(req.getHeader("X-AppEngine-QueueName")).thenReturn("__cron"); - Optional authResult = runTest(mockUserService, AuthNone.class); + Optional authResult = runTest(mockUserService, AUTH_NONE); verifyZeroInteractions(mockUserService); assertThat(authResult).isPresent(); @@ -182,7 +160,7 @@ public class RequestAuthenticatorTest { @Test public void testInternalAuth_notInvokedInternally() throws Exception { - Optional authResult = runTest(mockUserService, AuthInternalOnly.class); + Optional authResult = runTest(mockUserService, AUTH_INTERNAL_ONLY); verifyZeroInteractions(mockUserService); assertThat(authResult).isAbsent(); @@ -192,7 +170,7 @@ public class RequestAuthenticatorTest { public void testInternalAuth_success() throws Exception { when(req.getHeader("X-AppEngine-QueueName")).thenReturn("__cron"); - Optional authResult = runTest(mockUserService, AuthInternalOnly.class); + Optional authResult = runTest(mockUserService, AUTH_INTERNAL_ONLY); verifyZeroInteractions(mockUserService); assertThat(authResult).isPresent(); @@ -202,7 +180,7 @@ public class RequestAuthenticatorTest { @Test public void testAnyUserAnyMethod_notLoggedIn() throws Exception { - Optional authResult = runTest(fakeUserService, AuthAnyUserAnyMethod.class); + Optional authResult = runTest(fakeUserService, AUTH_ANY_USER_ANY_METHOD); assertThat(authResult).isAbsent(); } @@ -211,7 +189,7 @@ public class RequestAuthenticatorTest { public void testAnyUserAnyMethod_xsrfFailure() throws Exception { fakeUserService.setUser(testUser, false); - Optional authResult = runTest(fakeUserService, AuthAnyUserAnyMethod.class); + Optional authResult = runTest(fakeUserService, AUTH_ANY_USER_ANY_METHOD); assertThat(authResult).isAbsent(); } @@ -222,7 +200,7 @@ public class RequestAuthenticatorTest { when(req.getHeader(XsrfTokenManager.X_CSRF_TOKEN)) .thenReturn(xsrfTokenManager.generateToken(testUser.getEmail())); - Optional authResult = runTest(fakeUserService, AuthAnyUserAnyMethod.class); + Optional authResult = runTest(fakeUserService, AUTH_ANY_USER_ANY_METHOD); assertThat(authResult).isPresent(); assertThat(authResult.get().authLevel()).isEqualTo(AuthLevel.USER); @@ -237,7 +215,7 @@ public class RequestAuthenticatorTest { fakeUserService.setUser(testUser, false); when(req.getMethod()).thenReturn("GET"); - Optional authResult = runTest(fakeUserService, AuthAnyUserAnyMethod.class); + Optional authResult = runTest(fakeUserService, AUTH_ANY_USER_ANY_METHOD); assertThat(authResult).isPresent(); assertThat(authResult.get().authLevel()).isEqualTo(AuthLevel.USER); @@ -248,7 +226,7 @@ public class RequestAuthenticatorTest { @Test public void testAdminUserAnyMethod_notLoggedIn() throws Exception { - Optional authResult = runTest(fakeUserService, AuthAdminUserAnyMethod.class); + Optional authResult = runTest(fakeUserService, AUTH_ADMIN_USER_ANY_METHOD); assertThat(authResult).isAbsent(); } @@ -257,7 +235,7 @@ public class RequestAuthenticatorTest { public void testAdminUserAnyMethod_notAdminUser() throws Exception { fakeUserService.setUser(testUser, false /* isAdmin */); - Optional authResult = runTest(fakeUserService, AuthAdminUserAnyMethod.class); + Optional authResult = runTest(fakeUserService, AUTH_ADMIN_USER_ANY_METHOD); assertThat(authResult).isAbsent(); } @@ -266,7 +244,7 @@ public class RequestAuthenticatorTest { public void testAdminUserAnyMethod_xsrfFailure() throws Exception { fakeUserService.setUser(testUser, true); - Optional authResult = runTest(fakeUserService, AuthAdminUserAnyMethod.class); + Optional authResult = runTest(fakeUserService, AUTH_ADMIN_USER_ANY_METHOD); assertThat(authResult).isAbsent(); } @@ -277,7 +255,7 @@ public class RequestAuthenticatorTest { when(req.getHeader(XsrfTokenManager.X_CSRF_TOKEN)) .thenReturn(xsrfTokenManager.generateToken(testUser.getEmail())); - Optional authResult = runTest(fakeUserService, AuthAdminUserAnyMethod.class); + Optional authResult = runTest(fakeUserService, AUTH_ADMIN_USER_ANY_METHOD); assertThat(authResult).isPresent(); assertThat(authResult.get().authLevel()).isEqualTo(AuthLevel.USER); @@ -293,7 +271,7 @@ public class RequestAuthenticatorTest { fakeOAuthService.setOAuthEnabled(true); when(req.getHeader(AUTHORIZATION)).thenReturn("Bearer TOKEN"); - Optional authResult = runTest(fakeUserService, AuthAnyUserNoLegacy.class); + Optional authResult = runTest(fakeUserService, AUTH_ANY_USER_NO_LEGACY); assertThat(authResult).isPresent(); assertThat(authResult.get().authLevel()).isEqualTo(AuthLevel.USER); @@ -316,7 +294,7 @@ public class RequestAuthenticatorTest { fakeOAuthService.setOAuthEnabled(true); when(req.getHeader(AUTHORIZATION)).thenReturn("Bearer TOKEN"); - Optional authResult = runTest(fakeUserService, AuthAnyUserNoLegacy.class); + Optional authResult = runTest(fakeUserService, AUTH_ANY_USER_NO_LEGACY); assertThat(authResult).isPresent(); assertThat(authResult.get().authLevel()).isEqualTo(AuthLevel.USER); @@ -337,7 +315,7 @@ public class RequestAuthenticatorTest { fakeOAuthService.setUser(testUser); fakeOAuthService.setOAuthEnabled(true); - Optional authResult = runTest(fakeUserService, AuthAnyUserNoLegacy.class); + Optional authResult = runTest(fakeUserService, AUTH_ANY_USER_NO_LEGACY); assertThat(authResult).isAbsent(); } @@ -349,7 +327,7 @@ public class RequestAuthenticatorTest { fakeOAuthService.setClientId("wrong-client-id"); when(req.getHeader(AUTHORIZATION)).thenReturn("Bearer TOKEN"); - Optional authResult = runTest(fakeUserService, AuthAnyUserNoLegacy.class); + Optional authResult = runTest(fakeUserService, AUTH_ANY_USER_NO_LEGACY); assertThat(authResult).isAbsent(); } @@ -361,7 +339,7 @@ public class RequestAuthenticatorTest { fakeOAuthService.setAuthorizedScopes(); when(req.getHeader(AUTHORIZATION)).thenReturn("Bearer TOKEN"); - Optional authResult = runTest(fakeUserService, AuthAnyUserNoLegacy.class); + Optional authResult = runTest(fakeUserService, AUTH_ANY_USER_NO_LEGACY); assertThat(authResult).isAbsent(); } @@ -373,7 +351,7 @@ public class RequestAuthenticatorTest { fakeOAuthService.setAuthorizedScopes("test-scope1", "test-scope3"); when(req.getHeader(AUTHORIZATION)).thenReturn("Bearer TOKEN"); - Optional authResult = runTest(fakeUserService, AuthAnyUserNoLegacy.class); + Optional authResult = runTest(fakeUserService, AUTH_ANY_USER_NO_LEGACY); assertThat(authResult).isAbsent(); } @@ -385,7 +363,7 @@ public class RequestAuthenticatorTest { fakeOAuthService.setAuthorizedScopes("test-scope1", "test-scope2", "test-scope3"); when(req.getHeader(AUTHORIZATION)).thenReturn("Bearer TOKEN"); - Optional authResult = runTest(fakeUserService, AuthAnyUserNoLegacy.class); + Optional authResult = runTest(fakeUserService, AUTH_ANY_USER_NO_LEGACY); assertThat(authResult).isPresent(); assertThat(authResult.get().authLevel()).isEqualTo(AuthLevel.USER); @@ -405,55 +383,47 @@ public class RequestAuthenticatorTest { public void testAnyUserNoLegacy_failureWithLegacyUser() throws Exception { fakeUserService.setUser(testUser, false /* isAdmin */); - Optional authResult = runTest(fakeUserService, AuthAnyUserNoLegacy.class); + Optional authResult = runTest(fakeUserService, AUTH_ANY_USER_NO_LEGACY); assertThat(authResult).isAbsent(); } @Test - public void testNoMethods_failure() throws Exception { + public void testCheckAuthConfig_NoMethods_failure() throws Exception { thrown.expect(IllegalArgumentException.class, "Must specify at least one auth method"); - runTest(fakeUserService, AuthNoMethods.class); + RequestAuthenticator.checkAuthConfig(AUTH_NO_METHODS); } @Test - public void testMissingInternal_failure() throws Exception { - thrown.expect(IllegalArgumentException.class, - "Auth method INTERNAL must always be specified, and as the first auth method"); - - runTest(fakeUserService, AuthMissingInternal.class); - } - - @Test - public void testWrongMethodOrdering_failure() throws Exception { + public void testCheckAuthConfig_WrongMethodOrdering_failure() throws Exception { thrown.expect(IllegalArgumentException.class, "Auth methods must be unique and strictly in order - INTERNAL, API, LEGACY"); - runTest(fakeUserService, AuthWrongMethodOrdering.class); + RequestAuthenticator.checkAuthConfig(AUTH_WRONG_METHOD_ORDERING); } @Test - public void testDuplicateMethods_failure() throws Exception { + public void testCheckAuthConfig_DuplicateMethods_failure() throws Exception { thrown.expect(IllegalArgumentException.class, "Auth methods must be unique and strictly in order - INTERNAL, API, LEGACY"); - runTest(fakeUserService, AuthDuplicateMethods.class); + RequestAuthenticator.checkAuthConfig(AUTH_DUPLICATE_METHODS); } @Test - public void testInternalWithUser_failure() throws Exception { + public void testCheckAuthConfig_InternalWithUser_failure() throws Exception { thrown.expect(IllegalArgumentException.class, - "Actions with only INTERNAL auth may not require USER auth level"); + "Actions with INTERNAL auth method may not require USER auth level"); - runTest(fakeUserService, AuthInternalWithUser.class); + RequestAuthenticator.checkAuthConfig(AUTH_INTERNAL_WITH_USER); } @Test - public void testWronglyIgnoringUser_failure() throws Exception { + public void testCheckAuthConfig_WronglyIgnoringUser_failure() throws Exception { thrown.expect(IllegalArgumentException.class, "Actions with auth methods beyond INTERNAL must not specify the IGNORED user policy"); - runTest(fakeUserService, AuthWronglyIgnoringUser.class); + RequestAuthenticator.checkAuthConfig(AUTH_WRONGLY_IGNORING_USER); } }