diff --git a/src/main/java/biz/nynja/account/services/AccountServiceImpl.java b/src/main/java/biz/nynja/account/services/AccountServiceImpl.java index e900c6c10806bf7ee19d079214c4075c3c0fe37d..4057f1490f7304c2d286fefb6a91efeda8314d7d 100644 --- a/src/main/java/biz/nynja/account/services/AccountServiceImpl.java +++ b/src/main/java/biz/nynja/account/services/AccountServiceImpl.java @@ -610,18 +610,6 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas return; } - if (request.getAuthenticationProvider().getAuthenticationTypeValue() == 0) { - logAndBuildGrpcStatusResponse(responseObserver, StatusResponse.newBuilder(), "Missing auth provider type", - "", Cause.MISSING_AUTH_PROVIDER_TYPE); - return; - } - if (request.getAuthenticationProvider().getAuthenticationProvider() == null - || request.getAuthenticationProvider().getAuthenticationProvider().isEmpty()) { - logAndBuildGrpcStatusResponse(responseObserver, StatusResponse.newBuilder(), - "Missing auth provider identifier", "", Cause.MISSING_AUTH_PROVIDER_ID); - return; - } - Optional cause = authenticationProvider.validateAddAuthenticationProviderRequest(request); if (cause.isPresent()) { logAndBuildGrpcStatusResponse(responseObserver, StatusResponse.newBuilder(), "Validation failed", "", @@ -1019,6 +1007,13 @@ public class AccountServiceImpl extends AccountServiceGrpc.AccountServiceImplBas return; } + if (!authenticationProvider + .canUseAsAdditionalLoginOption(request.getUpdatedAuthProvider().getAuthenticationType())) { + logAndBuildGrpcStatusResponse(responseObserver, StatusResponse.newBuilder(), + "Invalid additional login option type used.", "", Cause.INVALID_ADDITIONAL_LOGIN_OPTION_TYPE); + return; + } + if (request.getOldAuthProvider().equals(request.getUpdatedAuthProvider())) { logAndBuildGrpcStatusResponse(responseObserver, StatusResponse.newBuilder(), "The same old and new auth providers requested to update for profile {}.", request.getProfileId(), diff --git a/src/main/java/biz/nynja/account/validation/Validators.java b/src/main/java/biz/nynja/account/validation/Validators.java index b15b7bda4f8258652a541033163ef116763bbe73..55010bdcfa5a789b0a724da9afd45cdf09bb6e2d 100644 --- a/src/main/java/biz/nynja/account/validation/Validators.java +++ b/src/main/java/biz/nynja/account/validation/Validators.java @@ -296,6 +296,16 @@ public class Validators { return Optional.empty(); } + public boolean canUseAsAdditionalLoginOption(AuthenticationType authenticationType) { + switch (authenticationType) { + case PHONE: + case EMAIL: + return true; + default: + return false; + } + } + public Optional validateDeleteAuthenticationProviderRequest( DeleteAuthenticationProviderRequest request) { if (!isValidUuid(request.getProfileId())) { @@ -309,8 +319,19 @@ public class Validators { if (!isValidUuid(request.getProfileId())) { return Optional.of(Cause.INVALID_PROFILE_ID); } - return validateAuthenticationProvider(request.getAuthenticationProvider().getAuthenticationType(), + Optional authenticationProviderValidation = validateAuthenticationProvider( + request.getAuthenticationProvider().getAuthenticationType(), request.getAuthenticationProvider().getAuthenticationProvider()); + if (authenticationProviderValidation.isPresent()) { + return authenticationProviderValidation; + } + boolean typeCanBeUsed = authenticationProvider + .canUseAsAdditionalLoginOption(request.getAuthenticationProvider().getAuthenticationType()); + if (typeCanBeUsed) { + return Optional.empty(); + } else { + return Optional.of(Cause.INVALID_ADDITIONAL_LOGIN_OPTION_TYPE); + } } private boolean isValidUuid(String id) { diff --git a/src/test/java/biz/nynja/account/components/ValidatorTests.java b/src/test/java/biz/nynja/account/components/ValidatorTests.java index 068449e146c04b9d9fe7c7d6973685b76be82999..26171284e8927ca90ab8566077f86f875ca769db 100644 --- a/src/test/java/biz/nynja/account/components/ValidatorTests.java +++ b/src/test/java/biz/nynja/account/components/ValidatorTests.java @@ -195,6 +195,30 @@ public class ValidatorTests { Cause.INVALID_EMAIL); } + @Test + public void validateAdditionalLoginOptionGoogleplusInvalidTest() { + assertEquals(authenticationProvider + .canUseAsAdditionalLoginOption(AuthenticationType.GOOGLEPLUS), false); + } + + @Test + public void validateAdditionalLoginOptionFacebookInvalidTest() { + assertEquals(authenticationProvider + .canUseAsAdditionalLoginOption(AuthenticationType.FACEBOOK), false); + } + + @Test + public void validateAdditionalLoginOptionPhoneValidTest() { + assertEquals(authenticationProvider + .canUseAsAdditionalLoginOption(AuthenticationType.PHONE), true); + } + + @Test + public void validateAdditionalLoginOptionEmailValidTest() { + assertEquals(authenticationProvider + .canUseAsAdditionalLoginOption(AuthenticationType.EMAIL), true); + } + @Test public void validateAuthProviderEmptyProviderIdentifierTest() { assertEquals(authenticationProvider.validateAuthenticationProvider(AuthenticationType.EMAIL, null).get(), diff --git a/src/test/java/biz/nynja/account/services/AccountServiceTests.java b/src/test/java/biz/nynja/account/services/AccountServiceTests.java index d8df16591bae63ca1c1af9298dde63b12998f959..75dcb4593781d5f9f88a9652ac693f2b30add4f3 100644 --- a/src/test/java/biz/nynja/account/services/AccountServiceTests.java +++ b/src/test/java/biz/nynja/account/services/AccountServiceTests.java @@ -809,6 +809,36 @@ public class AccountServiceTests extends GrpcServerTestBase { reply.getError().getCause().equals(Cause.INTERNAL_SERVER_ERROR)); } + @Test + public void testAddAuthenticationProviderToProfileInvalidTypeFacebook() { + final AddAuthenticationProviderRequest request = AddAuthenticationProviderRequest.newBuilder() + .setProfileId(Util.PROFILE_ID.toString()) + .setAuthenticationProvider( + AuthProviderDetails.newBuilder().setAuthenticationProvider("Facebook_provider") + .setAuthenticationType(AuthenticationType.FACEBOOK)) + .build(); + + final StatusResponse reply = accountServiceBlockingStub.addAuthenticationProviderToProfile(request); + assertNotNull("Reply should not be null", reply); + assertTrue(String.format("Reply should contain cause '%s'", Cause.INVALID_ADDITIONAL_LOGIN_OPTION_TYPE), + reply.getError().getCause().equals(Cause.INVALID_ADDITIONAL_LOGIN_OPTION_TYPE)); + } + + @Test + public void testAddAuthenticationProviderToProfileInvalidTypeGoogleplus() { + final AddAuthenticationProviderRequest request = AddAuthenticationProviderRequest.newBuilder() + .setProfileId(Util.PROFILE_ID.toString()) + .setAuthenticationProvider( + AuthProviderDetails.newBuilder().setAuthenticationProvider("Googleplus_provider") + .setAuthenticationType(AuthenticationType.GOOGLEPLUS)) + .build(); + + final StatusResponse reply = accountServiceBlockingStub.addAuthenticationProviderToProfile(request); + assertNotNull("Reply should not be null", reply); + assertTrue(String.format("Reply should contain cause '%s'", Cause.INVALID_ADDITIONAL_LOGIN_OPTION_TYPE), + reply.getError().getCause().equals(Cause.INVALID_ADDITIONAL_LOGIN_OPTION_TYPE)); + } + @Test public void testAddAuthenticationProviderToProfileNotFound() { final AddAuthenticationProviderRequest request = AddAuthenticationProviderRequest.newBuilder() @@ -1796,6 +1826,40 @@ public class AccountServiceTests extends GrpcServerTestBase { reply.getError().getCause().equals(Cause.INVALID_EMAIL)); } + @Test + public void testUpdateAuthProviderForProfileInvalidTypeFacebook() { + final UpdateAuthenticationProviderRequest request = UpdateAuthenticationProviderRequest.newBuilder() + .setProfileId(Util.PROFILE_ID.toString()) + .setOldAuthProvider(AuthProviderDetails.newBuilder().setAuthenticationType(AuthenticationType.EMAIL) + .setAuthenticationProvider(Util.EMAIL).build()) + .setUpdatedAuthProvider( + AuthProviderDetails.newBuilder().setAuthenticationType(AuthenticationType.FACEBOOK) + .setAuthenticationProvider("Facebook_provider").build()) + .build(); + + final StatusResponse reply = accountServiceBlockingStub.updateAuthenticationProviderForProfile(request); + assertNotNull("Reply should not be null", reply); + assertTrue(String.format("Reply should contain cause '%s'", Cause.INVALID_ADDITIONAL_LOGIN_OPTION_TYPE), + reply.getError().getCause().equals(Cause.INVALID_ADDITIONAL_LOGIN_OPTION_TYPE)); + } + + @Test + public void testUpdateAuthProviderForProfileInvalidTypeGoogleplus() { + final UpdateAuthenticationProviderRequest request = UpdateAuthenticationProviderRequest.newBuilder() + .setProfileId(Util.PROFILE_ID.toString()) + .setOldAuthProvider(AuthProviderDetails.newBuilder().setAuthenticationType(AuthenticationType.EMAIL) + .setAuthenticationProvider(Util.EMAIL).build()) + .setUpdatedAuthProvider( + AuthProviderDetails.newBuilder().setAuthenticationType(AuthenticationType.GOOGLEPLUS) + .setAuthenticationProvider("Googleplus_provider").build()) + .build(); + + final StatusResponse reply = accountServiceBlockingStub.updateAuthenticationProviderForProfile(request); + assertNotNull("Reply should not be null", reply); + assertTrue(String.format("Reply should contain cause '%s'", Cause.INVALID_ADDITIONAL_LOGIN_OPTION_TYPE), + reply.getError().getCause().equals(Cause.INVALID_ADDITIONAL_LOGIN_OPTION_TYPE)); + } + @Test public void testGetAccountByLoginOptionPhone() throws IncorrectAccountCountException { final AuthenticationProviderRequest request = AuthenticationProviderRequest.newBuilder()