mirror of
https://github.com/google/nomulus.git
synced 2025-05-13 16:07:15 +02:00
Change registrar console login code in preparation for removing requireLogin
We are going to remove the requireLogin attribute from the action attribute, because it is specific to the UserService API. This is used by four actions: ConsoleUIAction RegistrarSettingsAction RegistrarPaymentSetupAction RegistrarPaymentAction Instead, these four actions will now check the login status directly. ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=159562335
This commit is contained in:
parent
17697388b8
commit
2b7f78db98
17 changed files with 151 additions and 112 deletions
|
@ -41,7 +41,6 @@ import google.registry.ui.server.registrar.ConsoleUiAction;
|
||||||
import google.registry.ui.server.registrar.RegistrarPaymentAction;
|
import google.registry.ui.server.registrar.RegistrarPaymentAction;
|
||||||
import google.registry.ui.server.registrar.RegistrarPaymentSetupAction;
|
import google.registry.ui.server.registrar.RegistrarPaymentSetupAction;
|
||||||
import google.registry.ui.server.registrar.RegistrarSettingsAction;
|
import google.registry.ui.server.registrar.RegistrarSettingsAction;
|
||||||
import google.registry.ui.server.registrar.RegistrarUserModule;
|
|
||||||
import google.registry.whois.WhoisHttpServer;
|
import google.registry.whois.WhoisHttpServer;
|
||||||
import google.registry.whois.WhoisModule;
|
import google.registry.whois.WhoisModule;
|
||||||
import google.registry.whois.WhoisServer;
|
import google.registry.whois.WhoisServer;
|
||||||
|
@ -54,7 +53,6 @@ import google.registry.whois.WhoisServer;
|
||||||
DnsModule.class,
|
DnsModule.class,
|
||||||
EppTlsModule.class,
|
EppTlsModule.class,
|
||||||
RdapModule.class,
|
RdapModule.class,
|
||||||
RegistrarUserModule.class,
|
|
||||||
RequestModule.class,
|
RequestModule.class,
|
||||||
WhiteboxModule.class,
|
WhiteboxModule.class,
|
||||||
WhoisModule.class,
|
WhoisModule.class,
|
||||||
|
|
|
@ -36,11 +36,11 @@ public abstract class AuthResult {
|
||||||
return authLevel() != AuthLevel.NONE;
|
return authLevel() != AuthLevel.NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static AuthResult create(AuthLevel authLevel) {
|
public static AuthResult create(AuthLevel authLevel) {
|
||||||
return new AutoValue_AuthResult(authLevel, Optional.<UserAuthInfo>absent());
|
return new AutoValue_AuthResult(authLevel, Optional.<UserAuthInfo>absent());
|
||||||
}
|
}
|
||||||
|
|
||||||
static AuthResult create(AuthLevel authLevel, @Nullable UserAuthInfo userAuthInfo) {
|
public static AuthResult create(AuthLevel authLevel, @Nullable UserAuthInfo userAuthInfo) {
|
||||||
if (authLevel == AuthLevel.USER) {
|
if (authLevel == AuthLevel.USER) {
|
||||||
checkNotNull(userAuthInfo);
|
checkNotNull(userAuthInfo);
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,12 +37,12 @@ public abstract class UserAuthInfo {
|
||||||
/** Used by the OAuth authentication mechanism (only) to return information about the session. */
|
/** Used by the OAuth authentication mechanism (only) to return information about the session. */
|
||||||
public abstract Optional<OAuthTokenInfo> oauthTokenInfo();
|
public abstract Optional<OAuthTokenInfo> oauthTokenInfo();
|
||||||
|
|
||||||
static UserAuthInfo create(
|
public static UserAuthInfo create(
|
||||||
User user, boolean isUserAdmin) {
|
User user, boolean isUserAdmin) {
|
||||||
return new AutoValue_UserAuthInfo(user, isUserAdmin, Optional.<OAuthTokenInfo>absent());
|
return new AutoValue_UserAuthInfo(user, isUserAdmin, Optional.<OAuthTokenInfo>absent());
|
||||||
}
|
}
|
||||||
|
|
||||||
static UserAuthInfo create(
|
public static UserAuthInfo create(
|
||||||
User user, boolean isUserAdmin, OAuthTokenInfo oauthTokenInfo) {
|
User user, boolean isUserAdmin, OAuthTokenInfo oauthTokenInfo) {
|
||||||
return new AutoValue_UserAuthInfo(user, isUserAdmin, Optional.of(oauthTokenInfo));
|
return new AutoValue_UserAuthInfo(user, isUserAdmin, Optional.of(oauthTokenInfo));
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,10 +14,13 @@
|
||||||
|
|
||||||
package google.registry.ui.server.registrar;
|
package google.registry.ui.server.registrar;
|
||||||
|
|
||||||
|
import static com.google.common.net.HttpHeaders.LOCATION;
|
||||||
import static com.google.common.net.HttpHeaders.X_FRAME_OPTIONS;
|
import static com.google.common.net.HttpHeaders.X_FRAME_OPTIONS;
|
||||||
import static javax.servlet.http.HttpServletResponse.SC_FORBIDDEN;
|
import static javax.servlet.http.HttpServletResponse.SC_FORBIDDEN;
|
||||||
|
import static javax.servlet.http.HttpServletResponse.SC_MOVED_TEMPORARILY;
|
||||||
import static javax.servlet.http.HttpServletResponse.SC_SERVICE_UNAVAILABLE;
|
import static javax.servlet.http.HttpServletResponse.SC_SERVICE_UNAVAILABLE;
|
||||||
|
|
||||||
|
import com.google.appengine.api.users.User;
|
||||||
import com.google.appengine.api.users.UserService;
|
import com.google.appengine.api.users.UserService;
|
||||||
import com.google.common.annotations.VisibleForTesting;
|
import com.google.common.annotations.VisibleForTesting;
|
||||||
import com.google.common.base.Supplier;
|
import com.google.common.base.Supplier;
|
||||||
|
@ -32,6 +35,7 @@ import google.registry.request.Action;
|
||||||
import google.registry.request.Response;
|
import google.registry.request.Response;
|
||||||
import google.registry.request.auth.Auth;
|
import google.registry.request.auth.Auth;
|
||||||
import google.registry.request.auth.AuthLevel;
|
import google.registry.request.auth.AuthLevel;
|
||||||
|
import google.registry.request.auth.AuthResult;
|
||||||
import google.registry.security.XsrfTokenManager;
|
import google.registry.security.XsrfTokenManager;
|
||||||
import google.registry.ui.server.SoyTemplateUtils;
|
import google.registry.ui.server.SoyTemplateUtils;
|
||||||
import google.registry.ui.soy.registrar.ConsoleSoyInfo;
|
import google.registry.ui.soy.registrar.ConsoleSoyInfo;
|
||||||
|
@ -69,6 +73,7 @@ public final class ConsoleUiAction implements Runnable {
|
||||||
@Inject SessionUtils sessionUtils;
|
@Inject SessionUtils sessionUtils;
|
||||||
@Inject UserService userService;
|
@Inject UserService userService;
|
||||||
@Inject XsrfTokenManager xsrfTokenManager;
|
@Inject XsrfTokenManager xsrfTokenManager;
|
||||||
|
@Inject AuthResult authResult;
|
||||||
@Inject @Config("logoFilename") String logoFilename;
|
@Inject @Config("logoFilename") String logoFilename;
|
||||||
@Inject @Config("productName") String productName;
|
@Inject @Config("productName") String productName;
|
||||||
@Inject @Config("integrationEmail") String integrationEmail;
|
@Inject @Config("integrationEmail") String integrationEmail;
|
||||||
|
@ -81,6 +86,12 @@ public final class ConsoleUiAction implements Runnable {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
|
if (!authResult.userAuthInfo().isPresent()) {
|
||||||
|
response.setStatus(SC_MOVED_TEMPORARILY);
|
||||||
|
response.setHeader(LOCATION, userService.createLoginURL(req.getRequestURI()));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
User user = authResult.userAuthInfo().get().user();
|
||||||
response.setContentType(MediaType.HTML_UTF_8);
|
response.setContentType(MediaType.HTML_UTF_8);
|
||||||
response.setHeader(X_FRAME_OPTIONS, "SAMEORIGIN"); // Disallow iframing.
|
response.setHeader(X_FRAME_OPTIONS, "SAMEORIGIN"); // Disallow iframing.
|
||||||
response.setHeader("X-Ui-Compatible", "IE=edge"); // Ask IE not to be silly.
|
response.setHeader("X-Ui-Compatible", "IE=edge"); // Ask IE not to be silly.
|
||||||
|
@ -102,9 +113,9 @@ public final class ConsoleUiAction implements Runnable {
|
||||||
.render());
|
.render());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
data.put("username", userService.getCurrentUser().getNickname());
|
data.put("username", user.getNickname());
|
||||||
data.put("logoutUrl", userService.createLogoutURL(PATH));
|
data.put("logoutUrl", userService.createLogoutURL(PATH));
|
||||||
if (!sessionUtils.checkRegistrarConsoleLogin(req)) {
|
if (!sessionUtils.checkRegistrarConsoleLogin(req, user)) {
|
||||||
response.setStatus(SC_FORBIDDEN);
|
response.setStatus(SC_FORBIDDEN);
|
||||||
response.setPayload(
|
response.setPayload(
|
||||||
TOFU_SUPPLIER.get()
|
TOFU_SUPPLIER.get()
|
||||||
|
@ -115,9 +126,7 @@ public final class ConsoleUiAction implements Runnable {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
Registrar registrar = Registrar.loadByClientIdCached(sessionUtils.getRegistrarClientId(req));
|
Registrar registrar = Registrar.loadByClientIdCached(sessionUtils.getRegistrarClientId(req));
|
||||||
data.put(
|
data.put("xsrfToken", xsrfTokenManager.generateToken(user.getEmail()));
|
||||||
"xsrfToken",
|
|
||||||
xsrfTokenManager.generateToken(userService.getCurrentUser().getEmail()));
|
|
||||||
data.put("clientId", registrar.getClientId());
|
data.put("clientId", registrar.getClientId());
|
||||||
data.put("showPaymentLink", registrar.getBillingMethod() == Registrar.BillingMethod.BRAINTREE);
|
data.put("showPaymentLink", registrar.getBillingMethod() == Registrar.BillingMethod.BRAINTREE);
|
||||||
|
|
||||||
|
|
|
@ -37,6 +37,7 @@ import google.registry.request.JsonActionRunner;
|
||||||
import google.registry.request.JsonActionRunner.JsonAction;
|
import google.registry.request.JsonActionRunner.JsonAction;
|
||||||
import google.registry.request.auth.Auth;
|
import google.registry.request.auth.Auth;
|
||||||
import google.registry.request.auth.AuthLevel;
|
import google.registry.request.auth.AuthLevel;
|
||||||
|
import google.registry.request.auth.AuthResult;
|
||||||
import google.registry.security.JsonResponseHelper;
|
import google.registry.security.JsonResponseHelper;
|
||||||
import google.registry.ui.forms.FormField;
|
import google.registry.ui.forms.FormField;
|
||||||
import google.registry.ui.forms.FormFieldException;
|
import google.registry.ui.forms.FormFieldException;
|
||||||
|
@ -46,6 +47,7 @@ import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
import org.joda.money.CurrencyUnit;
|
import org.joda.money.CurrencyUnit;
|
||||||
import org.joda.money.IllegalCurrencyException;
|
import org.joda.money.IllegalCurrencyException;
|
||||||
import org.joda.money.Money;
|
import org.joda.money.Money;
|
||||||
|
@ -148,9 +150,11 @@ public final class RegistrarPaymentAction implements Runnable, JsonAction {
|
||||||
.required()
|
.required()
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
|
@Inject HttpServletRequest request;
|
||||||
@Inject BraintreeGateway braintreeGateway;
|
@Inject BraintreeGateway braintreeGateway;
|
||||||
@Inject JsonActionRunner jsonActionRunner;
|
@Inject JsonActionRunner jsonActionRunner;
|
||||||
@Inject Registrar registrar;
|
@Inject AuthResult authResult;
|
||||||
|
@Inject SessionUtils sessionUtils;
|
||||||
@Inject @Config("braintreeMerchantAccountIds") ImmutableMap<CurrencyUnit, String> accountIds;
|
@Inject @Config("braintreeMerchantAccountIds") ImmutableMap<CurrencyUnit, String> accountIds;
|
||||||
@Inject RegistrarPaymentAction() {}
|
@Inject RegistrarPaymentAction() {}
|
||||||
|
|
||||||
|
@ -161,6 +165,7 @@ public final class RegistrarPaymentAction implements Runnable, JsonAction {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Map<String, Object> handleJsonRequest(Map<String, ?> json) {
|
public Map<String, Object> handleJsonRequest(Map<String, ?> json) {
|
||||||
|
Registrar registrar = sessionUtils.getRegistrarForAuthResult(request, authResult);
|
||||||
logger.infofmt("Processing payment: %s", json);
|
logger.infofmt("Processing payment: %s", json);
|
||||||
String paymentMethodNonce;
|
String paymentMethodNonce;
|
||||||
Money amount;
|
Money amount;
|
||||||
|
|
|
@ -30,9 +30,11 @@ import google.registry.request.JsonActionRunner;
|
||||||
import google.registry.request.JsonActionRunner.JsonAction;
|
import google.registry.request.JsonActionRunner.JsonAction;
|
||||||
import google.registry.request.auth.Auth;
|
import google.registry.request.auth.Auth;
|
||||||
import google.registry.request.auth.AuthLevel;
|
import google.registry.request.auth.AuthLevel;
|
||||||
|
import google.registry.request.auth.AuthResult;
|
||||||
import google.registry.security.JsonResponseHelper;
|
import google.registry.security.JsonResponseHelper;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
import org.joda.money.CurrencyUnit;
|
import org.joda.money.CurrencyUnit;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -80,10 +82,12 @@ import org.joda.money.CurrencyUnit;
|
||||||
)
|
)
|
||||||
public final class RegistrarPaymentSetupAction implements Runnable, JsonAction {
|
public final class RegistrarPaymentSetupAction implements Runnable, JsonAction {
|
||||||
|
|
||||||
|
@Inject HttpServletRequest request;
|
||||||
@Inject BraintreeGateway braintreeGateway;
|
@Inject BraintreeGateway braintreeGateway;
|
||||||
@Inject BraintreeRegistrarSyncer customerSyncer;
|
@Inject BraintreeRegistrarSyncer customerSyncer;
|
||||||
@Inject JsonActionRunner jsonActionRunner;
|
@Inject JsonActionRunner jsonActionRunner;
|
||||||
@Inject Registrar registrar;
|
@Inject AuthResult authResult;
|
||||||
|
@Inject SessionUtils sessionUtils;
|
||||||
@Inject @Config("brainframe") String brainframe;
|
@Inject @Config("brainframe") String brainframe;
|
||||||
@Inject @Config("braintreeMerchantAccountIds") ImmutableMap<CurrencyUnit, String> accountIds;
|
@Inject @Config("braintreeMerchantAccountIds") ImmutableMap<CurrencyUnit, String> accountIds;
|
||||||
@Inject RegistrarPaymentSetupAction() {}
|
@Inject RegistrarPaymentSetupAction() {}
|
||||||
|
@ -95,6 +99,8 @@ public final class RegistrarPaymentSetupAction implements Runnable, JsonAction {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Map<String, Object> handleJsonRequest(Map<String, ?> json) {
|
public Map<String, Object> handleJsonRequest(Map<String, ?> json) {
|
||||||
|
Registrar registrar = sessionUtils.getRegistrarForAuthResult(request, authResult);
|
||||||
|
|
||||||
if (!json.isEmpty()) {
|
if (!json.isEmpty()) {
|
||||||
return JsonResponseHelper.create(ERROR, "JSON request object must be empty");
|
return JsonResponseHelper.create(ERROR, "JSON request object must be empty");
|
||||||
}
|
}
|
||||||
|
|
|
@ -42,6 +42,7 @@ import google.registry.request.HttpException.BadRequestException;
|
||||||
import google.registry.request.JsonActionRunner;
|
import google.registry.request.JsonActionRunner;
|
||||||
import google.registry.request.auth.Auth;
|
import google.registry.request.auth.Auth;
|
||||||
import google.registry.request.auth.AuthLevel;
|
import google.registry.request.auth.AuthLevel;
|
||||||
|
import google.registry.request.auth.AuthResult;
|
||||||
import google.registry.security.JsonResponseHelper;
|
import google.registry.security.JsonResponseHelper;
|
||||||
import google.registry.ui.forms.FormException;
|
import google.registry.ui.forms.FormException;
|
||||||
import google.registry.ui.forms.FormFieldException;
|
import google.registry.ui.forms.FormFieldException;
|
||||||
|
@ -81,7 +82,7 @@ public class RegistrarSettingsAction implements Runnable, JsonActionRunner.JsonA
|
||||||
|
|
||||||
@Inject HttpServletRequest request;
|
@Inject HttpServletRequest request;
|
||||||
@Inject JsonActionRunner jsonActionRunner;
|
@Inject JsonActionRunner jsonActionRunner;
|
||||||
@Inject Registrar initialRegistrar;
|
@Inject AuthResult authResult;
|
||||||
@Inject SendEmailUtils sendEmailUtils;
|
@Inject SendEmailUtils sendEmailUtils;
|
||||||
@Inject SessionUtils sessionUtils;
|
@Inject SessionUtils sessionUtils;
|
||||||
@Inject @Config("registrarChangesNotificationEmailAddresses") ImmutableList<String>
|
@Inject @Config("registrarChangesNotificationEmailAddresses") ImmutableList<String>
|
||||||
|
@ -105,12 +106,9 @@ public class RegistrarSettingsAction implements Runnable, JsonActionRunner.JsonA
|
||||||
throw new BadRequestException("Malformed JSON");
|
throw new BadRequestException("Malformed JSON");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!sessionUtils.checkRegistrarConsoleLogin(request)) {
|
Registrar initialRegistrar = sessionUtils.getRegistrarForAuthResult(request, authResult);
|
||||||
return JsonResponseHelper.create(ERROR, "Not authorized to access Registrar Console");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Process the operation. Though originally derived from a CRUD
|
// Process the operation. Though originally derived from a CRUD
|
||||||
// handlder, registrar-settings really only supports read and update.
|
// handler, registrar-settings really only supports read and update.
|
||||||
String op = Optional.fromNullable((String) input.get(OP_PARAM)).or("read");
|
String op = Optional.fromNullable((String) input.get(OP_PARAM)).or("read");
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
Map<String, ?> args = (Map<String, Object>)
|
Map<String, ?> args = (Map<String, Object>)
|
||||||
|
|
|
@ -1,34 +0,0 @@
|
||||||
// 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.ui.server.registrar;
|
|
||||||
|
|
||||||
import dagger.Module;
|
|
||||||
import dagger.Provides;
|
|
||||||
import google.registry.model.registrar.Registrar;
|
|
||||||
import google.registry.request.HttpException.ForbiddenException;
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
|
||||||
|
|
||||||
/** Registrar Console module providing reference to logged-in {@link Registrar}. */
|
|
||||||
@Module
|
|
||||||
public final class RegistrarUserModule {
|
|
||||||
|
|
||||||
@Provides
|
|
||||||
static Registrar provideRegistrarUser(SessionUtils sessionUtils, HttpServletRequest req) {
|
|
||||||
if (!sessionUtils.checkRegistrarConsoleLogin(req)) {
|
|
||||||
throw new ForbiddenException("Not authorized to access Registrar Console");
|
|
||||||
}
|
|
||||||
return Registrar.loadByClientId(sessionUtils.getRegistrarClientId(req));
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -14,19 +14,19 @@
|
||||||
|
|
||||||
package google.registry.ui.server.registrar;
|
package google.registry.ui.server.registrar;
|
||||||
|
|
||||||
import static com.google.common.base.Preconditions.checkNotNull;
|
|
||||||
import static com.google.common.base.Preconditions.checkState;
|
import static com.google.common.base.Preconditions.checkState;
|
||||||
import static com.google.common.base.Verify.verify;
|
import static com.google.common.base.Verify.verify;
|
||||||
import static google.registry.model.ofy.ObjectifyService.ofy;
|
import static google.registry.model.ofy.ObjectifyService.ofy;
|
||||||
|
|
||||||
import com.google.appengine.api.users.User;
|
import com.google.appengine.api.users.User;
|
||||||
import com.google.appengine.api.users.UserService;
|
|
||||||
import com.google.common.base.Optional;
|
import com.google.common.base.Optional;
|
||||||
import com.google.common.base.Predicate;
|
import com.google.common.base.Predicate;
|
||||||
import com.google.common.collect.FluentIterable;
|
import com.google.common.collect.FluentIterable;
|
||||||
import com.googlecode.objectify.Key;
|
import com.googlecode.objectify.Key;
|
||||||
import google.registry.model.registrar.Registrar;
|
import google.registry.model.registrar.Registrar;
|
||||||
import google.registry.model.registrar.RegistrarContact;
|
import google.registry.model.registrar.RegistrarContact;
|
||||||
|
import google.registry.request.HttpException.ForbiddenException;
|
||||||
|
import google.registry.request.auth.AuthResult;
|
||||||
import google.registry.util.FormattingLogger;
|
import google.registry.util.FormattingLogger;
|
||||||
import javax.annotation.CheckReturnValue;
|
import javax.annotation.CheckReturnValue;
|
||||||
import javax.annotation.Nonnull;
|
import javax.annotation.Nonnull;
|
||||||
|
@ -43,38 +43,49 @@ public class SessionUtils {
|
||||||
|
|
||||||
public static final String CLIENT_ID_ATTRIBUTE = "clientId";
|
public static final String CLIENT_ID_ATTRIBUTE = "clientId";
|
||||||
|
|
||||||
private final UserService userService;
|
@Inject public SessionUtils() {}
|
||||||
|
|
||||||
@Inject
|
/**
|
||||||
public SessionUtils(UserService userService) {
|
* Checks that the authentication result indicates a user that has access to the registrar
|
||||||
this.userService = checkNotNull(userService);
|
* console, then gets the associated registrar.
|
||||||
|
*
|
||||||
|
* <p>Throws a {@link ForbiddenException} if the user is not logged in, or not authorized to use
|
||||||
|
* the registrar console.
|
||||||
|
*/
|
||||||
|
@CheckReturnValue
|
||||||
|
Registrar getRegistrarForAuthResult(HttpServletRequest request, AuthResult authResult) {
|
||||||
|
if (!authResult.userAuthInfo().isPresent()) {
|
||||||
|
throw new ForbiddenException("Not logged in");
|
||||||
|
}
|
||||||
|
if (!checkRegistrarConsoleLogin(request, authResult.userAuthInfo().get().user())) {
|
||||||
|
throw new ForbiddenException("Not authorized to access Registrar Console");
|
||||||
|
}
|
||||||
|
return Registrar.loadByClientIdCached(getRegistrarClientId(request));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks GAE user has access to Registrar Console.
|
* Checks that the specified user has access to the Registrar Console.
|
||||||
*
|
*
|
||||||
* <p>This routine will first check the HTTP session (creating one if it doesn't exist) for the
|
* <p>This routine will first check the HTTP session (creating one if it doesn't exist) for the
|
||||||
* {@code clientId} attribute:
|
* {@code clientId} attribute:
|
||||||
*
|
*
|
||||||
* <ul>
|
* <ul>
|
||||||
* <li>If it does not exist, then we will attempt to guess the {@link Registrar} with which the
|
* <li>If it does not exist, then we will attempt to guess the {@link Registrar} with which the
|
||||||
* user's GAIA ID is associated. The {@code clientId} of the first matching {@code Registrar} will
|
* user is associated. The {@code clientId} of the first matching {@code Registrar} will then
|
||||||
* then be stored to the HTTP session.
|
* be stored to the HTTP session.
|
||||||
* <li>If it does exist, then we'll fetch the Registrar from Datastore to make sure access
|
* <li>If it does exist, then we'll fetch the Registrar from Datastore to make sure access
|
||||||
* wasn't revoked.
|
* wasn't revoked.
|
||||||
* </ul>
|
* </ul>
|
||||||
*
|
*
|
||||||
* <p><b>Note:</b> You must ensure the user has logged in before calling this method, for example
|
* <p><b>Note:</b> You must ensure the user has logged in before calling this method.
|
||||||
* by setting {@code @Action(requireLogin = true)}.
|
|
||||||
*
|
*
|
||||||
* @return {@code false} if user does not have access, in which case the caller should write an
|
* @return {@code false} if user does not have access, in which case the caller should write an
|
||||||
* error response and abort the request.
|
* error response and abort the request.
|
||||||
*/
|
*/
|
||||||
@CheckReturnValue
|
@CheckReturnValue
|
||||||
public boolean checkRegistrarConsoleLogin(HttpServletRequest req) {
|
public boolean checkRegistrarConsoleLogin(HttpServletRequest req, User user) {
|
||||||
HttpSession session = req.getSession();
|
|
||||||
User user = userService.getCurrentUser();
|
|
||||||
checkState(user != null, "No logged in user found");
|
checkState(user != null, "No logged in user found");
|
||||||
|
HttpSession session = req.getSession();
|
||||||
String clientId = (String) session.getAttribute(CLIENT_ID_ATTRIBUTE);
|
String clientId = (String) session.getAttribute(CLIENT_ID_ATTRIBUTE);
|
||||||
if (clientId == null) {
|
if (clientId == null) {
|
||||||
Optional<Registrar> registrar = guessRegistrar(user.getUserId());
|
Optional<Registrar> registrar = guessRegistrar(user.getUserId());
|
||||||
|
@ -108,11 +119,6 @@ public class SessionUtils {
|
||||||
return clientId;
|
return clientId;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @see UserService#isUserLoggedIn() */
|
|
||||||
public boolean isLoggedIn() {
|
|
||||||
return userService.isUserLoggedIn();
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Returns first {@link Registrar} that {@code gaeUserId} is authorized to administer. */
|
/** Returns first {@link Registrar} that {@code gaeUserId} is authorized to administer. */
|
||||||
private static Optional<Registrar> guessRegistrar(String gaeUserId) {
|
private static Optional<Registrar> guessRegistrar(String gaeUserId) {
|
||||||
RegistrarContact contact = ofy().load()
|
RegistrarContact contact = ofy().load()
|
||||||
|
|
|
@ -17,6 +17,7 @@ java_library(
|
||||||
"//java/google/registry/export/sheet",
|
"//java/google/registry/export/sheet",
|
||||||
"//java/google/registry/model",
|
"//java/google/registry/model",
|
||||||
"//java/google/registry/request",
|
"//java/google/registry/request",
|
||||||
|
"//java/google/registry/request/auth",
|
||||||
"//java/google/registry/security",
|
"//java/google/registry/security",
|
||||||
"//java/google/registry/ui/server/registrar",
|
"//java/google/registry/ui/server/registrar",
|
||||||
"//java/google/registry/ui/soy/registrar:soy_java_wrappers",
|
"//java/google/registry/ui/soy/registrar:soy_java_wrappers",
|
||||||
|
|
|
@ -19,8 +19,12 @@ import static org.mockito.Matchers.any;
|
||||||
import static org.mockito.Mockito.mock;
|
import static org.mockito.Mockito.mock;
|
||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
|
import com.google.appengine.api.users.User;
|
||||||
import com.google.appengine.api.users.UserServiceFactory;
|
import com.google.appengine.api.users.UserServiceFactory;
|
||||||
import com.google.common.net.MediaType;
|
import com.google.common.net.MediaType;
|
||||||
|
import google.registry.request.auth.AuthLevel;
|
||||||
|
import google.registry.request.auth.AuthResult;
|
||||||
|
import google.registry.request.auth.UserAuthInfo;
|
||||||
import google.registry.security.XsrfTokenManager;
|
import google.registry.security.XsrfTokenManager;
|
||||||
import google.registry.testing.AppEngineRule;
|
import google.registry.testing.AppEngineRule;
|
||||||
import google.registry.testing.FakeClock;
|
import google.registry.testing.FakeClock;
|
||||||
|
@ -44,9 +48,10 @@ public class ConsoleUiActionTest {
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
private final SessionUtils sessionUtils = mock(SessionUtils.class);
|
private final SessionUtils sessionUtils = mock(SessionUtils.class);
|
||||||
|
private final HttpServletRequest request = mock(HttpServletRequest.class);
|
||||||
private final FakeResponse response = new FakeResponse();
|
private final FakeResponse response = new FakeResponse();
|
||||||
private final ConsoleUiAction action = new ConsoleUiAction();
|
private final ConsoleUiAction action = new ConsoleUiAction();
|
||||||
|
private final User user = new User("marla.singer@example.com", "gmail.com", "12345");
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() throws Exception {
|
public void setUp() throws Exception {
|
||||||
|
@ -58,13 +63,14 @@ public class ConsoleUiActionTest {
|
||||||
action.announcementsEmail = "announcements@example.com";
|
action.announcementsEmail = "announcements@example.com";
|
||||||
action.supportPhoneNumber = "1 (888) 555 0123";
|
action.supportPhoneNumber = "1 (888) 555 0123";
|
||||||
action.technicalDocsUrl = "http://example.com/technical-docs";
|
action.technicalDocsUrl = "http://example.com/technical-docs";
|
||||||
|
action.req = request;
|
||||||
action.response = response;
|
action.response = response;
|
||||||
action.sessionUtils = sessionUtils;
|
action.sessionUtils = sessionUtils;
|
||||||
action.userService = UserServiceFactory.getUserService();
|
action.userService = UserServiceFactory.getUserService();
|
||||||
action.xsrfTokenManager = new XsrfTokenManager(new FakeClock(), action.userService);
|
action.xsrfTokenManager = new XsrfTokenManager(new FakeClock(), action.userService);
|
||||||
when(sessionUtils.checkRegistrarConsoleLogin(any(HttpServletRequest.class))).thenReturn(true);
|
action.authResult = AuthResult.create(AuthLevel.USER, UserAuthInfo.create(user, false));
|
||||||
when(sessionUtils.getRegistrarClientId(any(HttpServletRequest.class)))
|
when(sessionUtils.checkRegistrarConsoleLogin(request, user)).thenReturn(true);
|
||||||
.thenReturn("TheRegistrar");
|
when(sessionUtils.getRegistrarClientId(request)).thenReturn("TheRegistrar");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -101,7 +107,8 @@ public class ConsoleUiActionTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testUserDoesntHaveAccessToAnyRegistrar_showsWhoAreYouPage() throws Exception {
|
public void testUserDoesntHaveAccessToAnyRegistrar_showsWhoAreYouPage() throws Exception {
|
||||||
when(sessionUtils.checkRegistrarConsoleLogin(any(HttpServletRequest.class))).thenReturn(false);
|
when(sessionUtils.checkRegistrarConsoleLogin(any(HttpServletRequest.class), any(User.class)))
|
||||||
|
.thenReturn(false);
|
||||||
action.run();
|
action.run();
|
||||||
assertThat(response.getPayload()).contains("<h1>You need permission</h1>");
|
assertThat(response.getPayload()).contains("<h1>You need permission</h1>");
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,6 +18,7 @@ import static com.google.common.truth.Truth.assertThat;
|
||||||
import static google.registry.testing.ReflectiveFieldExtractor.extractField;
|
import static google.registry.testing.ReflectiveFieldExtractor.extractField;
|
||||||
import static java.util.Arrays.asList;
|
import static java.util.Arrays.asList;
|
||||||
import static org.mockito.Matchers.any;
|
import static org.mockito.Matchers.any;
|
||||||
|
import static org.mockito.Mockito.mock;
|
||||||
import static org.mockito.Mockito.verify;
|
import static org.mockito.Mockito.verify;
|
||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
|
@ -30,10 +31,15 @@ import com.braintreegateway.TransactionRequest;
|
||||||
import com.braintreegateway.ValidationError;
|
import com.braintreegateway.ValidationError;
|
||||||
import com.braintreegateway.ValidationErrorCode;
|
import com.braintreegateway.ValidationErrorCode;
|
||||||
import com.braintreegateway.ValidationErrors;
|
import com.braintreegateway.ValidationErrors;
|
||||||
|
import com.google.appengine.api.users.User;
|
||||||
import com.google.common.collect.ImmutableMap;
|
import com.google.common.collect.ImmutableMap;
|
||||||
import google.registry.model.registrar.Registrar;
|
import google.registry.model.registrar.Registrar;
|
||||||
|
import google.registry.request.auth.AuthLevel;
|
||||||
|
import google.registry.request.auth.AuthResult;
|
||||||
|
import google.registry.request.auth.UserAuthInfo;
|
||||||
import google.registry.testing.AppEngineRule;
|
import google.registry.testing.AppEngineRule;
|
||||||
import java.math.BigDecimal;
|
import java.math.BigDecimal;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
import org.joda.money.CurrencyUnit;
|
import org.joda.money.CurrencyUnit;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Rule;
|
import org.junit.Rule;
|
||||||
|
@ -66,6 +72,10 @@ public class RegistrarPaymentActionTest {
|
||||||
@Mock
|
@Mock
|
||||||
private ValidationErrors validationErrors;
|
private ValidationErrors validationErrors;
|
||||||
|
|
||||||
|
private final SessionUtils sessionUtils = mock(SessionUtils.class);
|
||||||
|
|
||||||
|
private final User user = new User("marla.singer@example.com", "gmail.com", "12345");
|
||||||
|
|
||||||
@Captor
|
@Captor
|
||||||
private ArgumentCaptor<TransactionRequest> transactionRequestCaptor;
|
private ArgumentCaptor<TransactionRequest> transactionRequestCaptor;
|
||||||
|
|
||||||
|
@ -73,7 +83,8 @@ public class RegistrarPaymentActionTest {
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void before() throws Exception {
|
public void before() throws Exception {
|
||||||
paymentAction.registrar = Registrar.loadByClientId("TheRegistrar");
|
paymentAction.sessionUtils = sessionUtils;
|
||||||
|
paymentAction.authResult = AuthResult.create(AuthLevel.USER, UserAuthInfo.create(user, false));
|
||||||
paymentAction.accountIds =
|
paymentAction.accountIds =
|
||||||
ImmutableMap.of(
|
ImmutableMap.of(
|
||||||
CurrencyUnit.USD, "merchant-account-usd",
|
CurrencyUnit.USD, "merchant-account-usd",
|
||||||
|
@ -81,6 +92,9 @@ public class RegistrarPaymentActionTest {
|
||||||
paymentAction.braintreeGateway = braintreeGateway;
|
paymentAction.braintreeGateway = braintreeGateway;
|
||||||
when(braintreeGateway.transaction()).thenReturn(transactionGateway);
|
when(braintreeGateway.transaction()).thenReturn(transactionGateway);
|
||||||
when(transactionGateway.sale(any(TransactionRequest.class))).thenReturn(result);
|
when(transactionGateway.sale(any(TransactionRequest.class))).thenReturn(result);
|
||||||
|
when(sessionUtils.getRegistrarForAuthResult(
|
||||||
|
any(HttpServletRequest.class), any(AuthResult.class)))
|
||||||
|
.thenReturn(Registrar.loadByClientId("TheRegistrar"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
|
@ -15,7 +15,9 @@
|
||||||
package google.registry.ui.server.registrar;
|
package google.registry.ui.server.registrar;
|
||||||
|
|
||||||
import static com.google.common.truth.Truth.assertThat;
|
import static com.google.common.truth.Truth.assertThat;
|
||||||
|
import static google.registry.testing.DatastoreHelper.persistResource;
|
||||||
import static java.util.Arrays.asList;
|
import static java.util.Arrays.asList;
|
||||||
|
import static org.mockito.Matchers.any;
|
||||||
import static org.mockito.Matchers.eq;
|
import static org.mockito.Matchers.eq;
|
||||||
import static org.mockito.Mockito.mock;
|
import static org.mockito.Mockito.mock;
|
||||||
import static org.mockito.Mockito.verify;
|
import static org.mockito.Mockito.verify;
|
||||||
|
@ -23,10 +25,15 @@ import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
import com.braintreegateway.BraintreeGateway;
|
import com.braintreegateway.BraintreeGateway;
|
||||||
import com.braintreegateway.ClientTokenGateway;
|
import com.braintreegateway.ClientTokenGateway;
|
||||||
|
import com.google.appengine.api.users.User;
|
||||||
import com.google.common.collect.ImmutableMap;
|
import com.google.common.collect.ImmutableMap;
|
||||||
import google.registry.braintree.BraintreeRegistrarSyncer;
|
import google.registry.braintree.BraintreeRegistrarSyncer;
|
||||||
import google.registry.model.registrar.Registrar;
|
import google.registry.model.registrar.Registrar;
|
||||||
|
import google.registry.request.auth.AuthLevel;
|
||||||
|
import google.registry.request.auth.AuthResult;
|
||||||
|
import google.registry.request.auth.UserAuthInfo;
|
||||||
import google.registry.testing.AppEngineRule;
|
import google.registry.testing.AppEngineRule;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
import org.joda.money.CurrencyUnit;
|
import org.joda.money.CurrencyUnit;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
import org.junit.Rule;
|
import org.junit.Rule;
|
||||||
|
@ -46,17 +53,25 @@ public class RegistrarPaymentSetupActionTest {
|
||||||
private final BraintreeGateway braintreeGateway = mock(BraintreeGateway.class);
|
private final BraintreeGateway braintreeGateway = mock(BraintreeGateway.class);
|
||||||
private final ClientTokenGateway clientTokenGateway = mock(ClientTokenGateway.class);
|
private final ClientTokenGateway clientTokenGateway = mock(ClientTokenGateway.class);
|
||||||
private final BraintreeRegistrarSyncer customerSyncer = mock(BraintreeRegistrarSyncer.class);
|
private final BraintreeRegistrarSyncer customerSyncer = mock(BraintreeRegistrarSyncer.class);
|
||||||
|
private final SessionUtils sessionUtils = mock(SessionUtils.class);
|
||||||
|
|
||||||
|
private final User user = new User("marla.singer@example.com", "gmail.com", "12345");
|
||||||
private final RegistrarPaymentSetupAction action = new RegistrarPaymentSetupAction();
|
private final RegistrarPaymentSetupAction action = new RegistrarPaymentSetupAction();
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void before() throws Exception {
|
public void before() throws Exception {
|
||||||
|
action.sessionUtils = sessionUtils;
|
||||||
|
action.authResult = AuthResult.create(AuthLevel.USER, UserAuthInfo.create(user, false));
|
||||||
action.braintreeGateway = braintreeGateway;
|
action.braintreeGateway = braintreeGateway;
|
||||||
action.customerSyncer = customerSyncer;
|
action.customerSyncer = customerSyncer;
|
||||||
action.registrar =
|
Registrar registrar = persistResource(
|
||||||
Registrar.loadByClientId("TheRegistrar").asBuilder()
|
Registrar.loadByClientId("TheRegistrar")
|
||||||
|
.asBuilder()
|
||||||
.setBillingMethod(Registrar.BillingMethod.BRAINTREE)
|
.setBillingMethod(Registrar.BillingMethod.BRAINTREE)
|
||||||
.build();
|
.build());
|
||||||
|
when(sessionUtils.getRegistrarForAuthResult(
|
||||||
|
any(HttpServletRequest.class), any(AuthResult.class)))
|
||||||
|
.thenReturn(registrar);
|
||||||
when(braintreeGateway.clientToken()).thenReturn(clientTokenGateway);
|
when(braintreeGateway.clientToken()).thenReturn(clientTokenGateway);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -78,7 +93,7 @@ public class RegistrarPaymentSetupActionTest {
|
||||||
"token", blanketsOfSadness,
|
"token", blanketsOfSadness,
|
||||||
"currencies", asList("USD", "JPY"),
|
"currencies", asList("USD", "JPY"),
|
||||||
"brainframe", "/doodle")));
|
"brainframe", "/doodle")));
|
||||||
verify(customerSyncer).sync(eq(action.registrar));
|
verify(customerSyncer).sync(eq(Registrar.loadByClientId("TheRegistrar")));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -92,10 +107,14 @@ public class RegistrarPaymentSetupActionTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testNotOnCreditCardBillingTerms_showsErrorPage() throws Exception {
|
public void testNotOnCreditCardBillingTerms_showsErrorPage() throws Exception {
|
||||||
action.registrar =
|
Registrar registrar = persistResource(
|
||||||
Registrar.loadByClientId("TheRegistrar").asBuilder()
|
Registrar.loadByClientId("TheRegistrar")
|
||||||
|
.asBuilder()
|
||||||
.setBillingMethod(Registrar.BillingMethod.EXTERNAL)
|
.setBillingMethod(Registrar.BillingMethod.EXTERNAL)
|
||||||
.build();
|
.build());
|
||||||
|
when(sessionUtils.getRegistrarForAuthResult(
|
||||||
|
any(HttpServletRequest.class), any(AuthResult.class)))
|
||||||
|
.thenReturn(registrar);
|
||||||
assertThat(action.handleJsonRequest(ImmutableMap.<String, Object>of()))
|
assertThat(action.handleJsonRequest(ImmutableMap.<String, Object>of()))
|
||||||
.containsExactly(
|
.containsExactly(
|
||||||
"status", "ERROR",
|
"status", "ERROR",
|
||||||
|
|
|
@ -19,7 +19,9 @@ import static google.registry.testing.TaskQueueHelper.assertNoTasksEnqueued;
|
||||||
import static google.registry.testing.TaskQueueHelper.assertTasksEnqueued;
|
import static google.registry.testing.TaskQueueHelper.assertTasksEnqueued;
|
||||||
import static google.registry.util.ResourceUtils.readResourceUtf8;
|
import static google.registry.util.ResourceUtils.readResourceUtf8;
|
||||||
import static java.util.Arrays.asList;
|
import static java.util.Arrays.asList;
|
||||||
import static org.mockito.Mockito.anyInt;
|
import static org.junit.Assert.fail;
|
||||||
|
import static org.mockito.Matchers.any;
|
||||||
|
import static org.mockito.Matchers.anyInt;
|
||||||
import static org.mockito.Mockito.never;
|
import static org.mockito.Mockito.never;
|
||||||
import static org.mockito.Mockito.verify;
|
import static org.mockito.Mockito.verify;
|
||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
|
@ -27,9 +29,12 @@ import static org.mockito.Mockito.when;
|
||||||
import com.google.common.collect.ImmutableMap;
|
import com.google.common.collect.ImmutableMap;
|
||||||
import google.registry.export.sheet.SyncRegistrarsSheetAction;
|
import google.registry.export.sheet.SyncRegistrarsSheetAction;
|
||||||
import google.registry.model.registrar.Registrar;
|
import google.registry.model.registrar.Registrar;
|
||||||
|
import google.registry.request.HttpException.ForbiddenException;
|
||||||
|
import google.registry.request.auth.AuthResult;
|
||||||
import google.registry.testing.TaskQueueHelper.TaskMatcher;
|
import google.registry.testing.TaskQueueHelper.TaskMatcher;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import javax.mail.internet.InternetAddress;
|
import javax.mail.internet.InternetAddress;
|
||||||
|
import javax.servlet.http.HttpServletRequest;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.RunWith;
|
import org.junit.runner.RunWith;
|
||||||
import org.junit.runners.JUnit4;
|
import org.junit.runners.JUnit4;
|
||||||
|
@ -65,11 +70,15 @@ public class RegistrarSettingsActionTest extends RegistrarSettingsActionTestCase
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testRead_notAuthorized_failure() throws Exception {
|
public void testRead_notAuthorized_failure() throws Exception {
|
||||||
when(sessionUtils.checkRegistrarConsoleLogin(req)).thenReturn(false);
|
when(sessionUtils.getRegistrarForAuthResult(
|
||||||
Map<String, Object> response = action.handleJsonRequest(ImmutableMap.<String, Object>of());
|
any(HttpServletRequest.class), any(AuthResult.class)))
|
||||||
assertThat(response).containsEntry("status", "ERROR");
|
.thenThrow(new ForbiddenException("Not authorized to access Registrar Console"));
|
||||||
assertThat((String) response.get("message")).startsWith("Not authorized");
|
try {
|
||||||
assertNoTasksEnqueued("sheet");
|
action.handleJsonRequest(ImmutableMap.<String, Object>of());
|
||||||
|
fail("expected ForbiddenException");
|
||||||
|
} catch (ForbiddenException ex) {
|
||||||
|
assertNoTasksEnqueued("sheet");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -23,6 +23,7 @@ import static org.mockito.Mockito.mock;
|
||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
import com.google.appengine.api.modules.ModulesService;
|
import com.google.appengine.api.modules.ModulesService;
|
||||||
|
import com.google.appengine.api.users.User;
|
||||||
import com.google.common.base.Supplier;
|
import com.google.common.base.Supplier;
|
||||||
import com.google.common.collect.ImmutableList;
|
import com.google.common.collect.ImmutableList;
|
||||||
import com.google.common.collect.ImmutableMap;
|
import com.google.common.collect.ImmutableMap;
|
||||||
|
@ -32,6 +33,9 @@ import google.registry.model.registrar.Registrar;
|
||||||
import google.registry.request.JsonActionRunner;
|
import google.registry.request.JsonActionRunner;
|
||||||
import google.registry.request.JsonResponse;
|
import google.registry.request.JsonResponse;
|
||||||
import google.registry.request.ResponseImpl;
|
import google.registry.request.ResponseImpl;
|
||||||
|
import google.registry.request.auth.AuthLevel;
|
||||||
|
import google.registry.request.auth.AuthResult;
|
||||||
|
import google.registry.request.auth.UserAuthInfo;
|
||||||
import google.registry.testing.AppEngineRule;
|
import google.registry.testing.AppEngineRule;
|
||||||
import google.registry.testing.FakeClock;
|
import google.registry.testing.FakeClock;
|
||||||
import google.registry.testing.InjectRule;
|
import google.registry.testing.InjectRule;
|
||||||
|
@ -73,6 +77,7 @@ public class RegistrarSettingsActionTestCase {
|
||||||
final SendEmailService emailService = mock(SendEmailService.class);
|
final SendEmailService emailService = mock(SendEmailService.class);
|
||||||
final ModulesService modulesService = mock(ModulesService.class);
|
final ModulesService modulesService = mock(ModulesService.class);
|
||||||
final SessionUtils sessionUtils = mock(SessionUtils.class);
|
final SessionUtils sessionUtils = mock(SessionUtils.class);
|
||||||
|
final User user = new User("user", "gmail.com");
|
||||||
|
|
||||||
Message message;
|
Message message;
|
||||||
|
|
||||||
|
@ -85,7 +90,7 @@ public class RegistrarSettingsActionTestCase {
|
||||||
public void setUp() throws Exception {
|
public void setUp() throws Exception {
|
||||||
action.request = req;
|
action.request = req;
|
||||||
action.sessionUtils = sessionUtils;
|
action.sessionUtils = sessionUtils;
|
||||||
action.initialRegistrar = Registrar.loadByClientId(CLIENT_ID);
|
action.authResult = AuthResult.create(AuthLevel.USER, UserAuthInfo.create(user, false));
|
||||||
action.jsonActionRunner = new JsonActionRunner(
|
action.jsonActionRunner = new JsonActionRunner(
|
||||||
ImmutableMap.<String, Object>of(), new JsonResponse(new ResponseImpl(rsp)));
|
ImmutableMap.<String, Object>of(), new JsonResponse(new ResponseImpl(rsp)));
|
||||||
action.registrarChangesNotificationEmailAddresses = ImmutableList.of(
|
action.registrarChangesNotificationEmailAddresses = ImmutableList.of(
|
||||||
|
@ -101,9 +106,8 @@ public class RegistrarSettingsActionTestCase {
|
||||||
when(rsp.getWriter()).thenReturn(new PrintWriter(writer));
|
when(rsp.getWriter()).thenReturn(new PrintWriter(writer));
|
||||||
when(req.getContentType()).thenReturn("application/json");
|
when(req.getContentType()).thenReturn("application/json");
|
||||||
when(req.getReader()).thenReturn(createJsonPayload(ImmutableMap.of("op", "read")));
|
when(req.getReader()).thenReturn(createJsonPayload(ImmutableMap.of("op", "read")));
|
||||||
when(sessionUtils.isLoggedIn()).thenReturn(true);
|
when(sessionUtils.getRegistrarForAuthResult(req, action.authResult))
|
||||||
when(sessionUtils.checkRegistrarConsoleLogin(req)).thenReturn(true);
|
.thenReturn(Registrar.loadByClientId(CLIENT_ID));
|
||||||
when(sessionUtils.getRegistrarClientId(req)).thenReturn(CLIENT_ID);
|
|
||||||
when(modulesService.getVersionHostname("backend", null)).thenReturn("backend.hostname");
|
when(modulesService.getVersionHostname("backend", null)).thenReturn("backend.hostname");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -21,8 +21,10 @@ import static google.registry.testing.CertificateSamples.SAMPLE_CERT;
|
||||||
import static google.registry.testing.CertificateSamples.SAMPLE_CERT2;
|
import static google.registry.testing.CertificateSamples.SAMPLE_CERT2;
|
||||||
import static google.registry.testing.CertificateSamples.SAMPLE_CERT2_HASH;
|
import static google.registry.testing.CertificateSamples.SAMPLE_CERT2_HASH;
|
||||||
import static google.registry.testing.CertificateSamples.SAMPLE_CERT_HASH;
|
import static google.registry.testing.CertificateSamples.SAMPLE_CERT_HASH;
|
||||||
|
import static google.registry.testing.DatastoreHelper.persistResource;
|
||||||
import static google.registry.util.DateTimeUtils.START_OF_TIME;
|
import static google.registry.util.DateTimeUtils.START_OF_TIME;
|
||||||
import static java.util.Arrays.asList;
|
import static java.util.Arrays.asList;
|
||||||
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
import com.google.common.collect.ImmutableMap;
|
import com.google.common.collect.ImmutableMap;
|
||||||
import google.registry.model.registrar.Registrar;
|
import google.registry.model.registrar.Registrar;
|
||||||
|
@ -100,12 +102,14 @@ public class SecuritySettingsTest extends RegistrarSettingsActionTestCase {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testEmptyOrNullCertificate_doesNotClearOutCurrentOne() throws Exception {
|
public void testEmptyOrNullCertificate_doesNotClearOutCurrentOne() throws Exception {
|
||||||
action.initialRegistrar =
|
Registrar initialRegistrar = persistResource(
|
||||||
Registrar.loadByClientId(CLIENT_ID).asBuilder()
|
Registrar.loadByClientId(CLIENT_ID).asBuilder()
|
||||||
.setClientCertificate(SAMPLE_CERT, START_OF_TIME)
|
.setClientCertificate(SAMPLE_CERT, START_OF_TIME)
|
||||||
.setFailoverClientCertificate(SAMPLE_CERT2, START_OF_TIME)
|
.setFailoverClientCertificate(SAMPLE_CERT2, START_OF_TIME)
|
||||||
.build();
|
.build());
|
||||||
Map<String, Object> jsonMap = action.initialRegistrar.toJsonMap();
|
when(sessionUtils.getRegistrarForAuthResult(req, action.authResult))
|
||||||
|
.thenReturn(initialRegistrar);
|
||||||
|
Map<String, Object> jsonMap = initialRegistrar.toJsonMap();
|
||||||
jsonMap.put("clientCertificate", null);
|
jsonMap.put("clientCertificate", null);
|
||||||
jsonMap.put("failoverClientCertificate", "");
|
jsonMap.put("failoverClientCertificate", "");
|
||||||
Map<String, Object> response = action.handleJsonRequest(ImmutableMap.of(
|
Map<String, Object> response = action.handleJsonRequest(ImmutableMap.of(
|
||||||
|
|
|
@ -24,7 +24,6 @@ import static org.mockito.Mockito.verifyNoMoreInteractions;
|
||||||
import static org.mockito.Mockito.when;
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
import com.google.appengine.api.users.User;
|
import com.google.appengine.api.users.User;
|
||||||
import com.google.appengine.api.users.UserService;
|
|
||||||
import com.google.common.testing.NullPointerTester;
|
import com.google.common.testing.NullPointerTester;
|
||||||
import google.registry.model.registrar.Registrar;
|
import google.registry.model.registrar.Registrar;
|
||||||
import google.registry.model.registrar.RegistrarContact;
|
import google.registry.model.registrar.RegistrarContact;
|
||||||
|
@ -55,7 +54,6 @@ public class SessionUtilsTest {
|
||||||
@Rule
|
@Rule
|
||||||
public final InjectRule inject = new InjectRule();
|
public final InjectRule inject = new InjectRule();
|
||||||
|
|
||||||
private final UserService userService = mock(UserService.class);
|
|
||||||
private final HttpServletRequest req = mock(HttpServletRequest.class);
|
private final HttpServletRequest req = mock(HttpServletRequest.class);
|
||||||
private final HttpServletResponse rsp = mock(HttpServletResponse.class);
|
private final HttpServletResponse rsp = mock(HttpServletResponse.class);
|
||||||
private final HttpSession session = mock(HttpSession.class);
|
private final HttpSession session = mock(HttpSession.class);
|
||||||
|
@ -66,22 +64,20 @@ public class SessionUtilsTest {
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void before() throws Exception {
|
public void before() throws Exception {
|
||||||
sessionUtils = new SessionUtils(userService);
|
sessionUtils = new SessionUtils();
|
||||||
when(req.getSession()).thenReturn(session);
|
when(req.getSession()).thenReturn(session);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testCheckRegistrarConsoleLogin_authedButNoSession_createsSession() throws Exception {
|
public void testCheckRegistrarConsoleLogin_authedButNoSession_createsSession() throws Exception {
|
||||||
when(userService.getCurrentUser()).thenReturn(jart);
|
assertThat(sessionUtils.checkRegistrarConsoleLogin(req, jart)).isTrue();
|
||||||
assertThat(sessionUtils.checkRegistrarConsoleLogin(req)).isTrue();
|
|
||||||
verify(session).setAttribute(eq("clientId"), eq("TheRegistrar"));
|
verify(session).setAttribute(eq("clientId"), eq("TheRegistrar"));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testCheckRegistrarConsoleLogin_authedWithValidSession_doesNothing() throws Exception {
|
public void testCheckRegistrarConsoleLogin_authedWithValidSession_doesNothing() throws Exception {
|
||||||
when(session.getAttribute("clientId")).thenReturn("TheRegistrar");
|
when(session.getAttribute("clientId")).thenReturn("TheRegistrar");
|
||||||
when(userService.getCurrentUser()).thenReturn(jart);
|
assertThat(sessionUtils.checkRegistrarConsoleLogin(req, jart)).isTrue();
|
||||||
assertThat(sessionUtils.checkRegistrarConsoleLogin(req)).isTrue();
|
|
||||||
verify(session).getAttribute("clientId");
|
verify(session).getAttribute("clientId");
|
||||||
verifyNoMoreInteractions(session);
|
verifyNoMoreInteractions(session);
|
||||||
}
|
}
|
||||||
|
@ -92,16 +88,14 @@ public class SessionUtilsTest {
|
||||||
Registrar.loadByClientId("TheRegistrar"),
|
Registrar.loadByClientId("TheRegistrar"),
|
||||||
new java.util.HashSet<RegistrarContact>());
|
new java.util.HashSet<RegistrarContact>());
|
||||||
when(session.getAttribute("clientId")).thenReturn("TheRegistrar");
|
when(session.getAttribute("clientId")).thenReturn("TheRegistrar");
|
||||||
when(userService.getCurrentUser()).thenReturn(jart);
|
assertThat(sessionUtils.checkRegistrarConsoleLogin(req, jart)).isFalse();
|
||||||
assertThat(sessionUtils.checkRegistrarConsoleLogin(req)).isFalse();
|
|
||||||
verify(session).invalidate();
|
verify(session).invalidate();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testCheckRegistrarConsoleLogin_orphanedContactIsDenied() throws Exception {
|
public void testCheckRegistrarConsoleLogin_orphanedContactIsDenied() throws Exception {
|
||||||
deleteResource(Registrar.loadByClientId("TheRegistrar"));
|
deleteResource(Registrar.loadByClientId("TheRegistrar"));
|
||||||
when(userService.getCurrentUser()).thenReturn(jart);
|
assertThat(sessionUtils.checkRegistrarConsoleLogin(req, jart)).isFalse();
|
||||||
assertThat(sessionUtils.checkRegistrarConsoleLogin(req)).isFalse();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
@ -109,13 +103,12 @@ public class SessionUtilsTest {
|
||||||
throws Exception {
|
throws Exception {
|
||||||
thrown.expect(IllegalStateException.class);
|
thrown.expect(IllegalStateException.class);
|
||||||
@SuppressWarnings("unused")
|
@SuppressWarnings("unused")
|
||||||
boolean unused = sessionUtils.checkRegistrarConsoleLogin(req);
|
boolean unused = sessionUtils.checkRegistrarConsoleLogin(req, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testCheckRegistrarConsoleLogin_notAllowed_returnsFalse() throws Exception {
|
public void testCheckRegistrarConsoleLogin_notAllowed_returnsFalse() throws Exception {
|
||||||
when(userService.getCurrentUser()).thenReturn(bozo);
|
assertThat(sessionUtils.checkRegistrarConsoleLogin(req, bozo)).isFalse();
|
||||||
assertThat(sessionUtils.checkRegistrarConsoleLogin(req)).isFalse();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue