Search in sources :

Example 1 with ServiceException

use of com.nexblocks.authguard.service.exceptions.ServiceException in project AuthGuard by AuthGuard.

the class ActionTokenServiceImplTest method verifyTokenWrongAction.

@Test
void verifyTokenWrongAction() {
    final AccountTokenDO accountToken = AccountTokenDO.builder().expiresAt(OffsetDateTime.now().plusMinutes(1)).additionalInformation(ImmutableMap.of("action", "something")).build();
    Mockito.when(accountTokensRepository.getByToken("action-token")).thenReturn(CompletableFuture.completedFuture(Optional.of(accountToken)));
    final Try<ActionTokenBO> actual = actionTokenService.verifyToken("action-token", "else");
    assertThat(actual.isFailure());
    assertThat(((ServiceException) actual.getCause()).getErrorCode()).isEqualTo(ErrorCode.INVALID_TOKEN.getCode());
}
Also used : ServiceException(com.nexblocks.authguard.service.exceptions.ServiceException) AccountTokenDO(com.nexblocks.authguard.dal.model.AccountTokenDO) ActionTokenBO(com.nexblocks.authguard.service.model.ActionTokenBO) Test(org.junit.jupiter.api.Test)

Example 2 with ServiceException

use of com.nexblocks.authguard.service.exceptions.ServiceException in project AuthGuard by AuthGuard.

the class AccountsServiceImpl method grantPermissions.

@Override
public AccountBO grantPermissions(final String accountId, final List<PermissionBO> permissions) {
    final AccountBO account = getById(accountId).orElseThrow(() -> new ServiceNotFoundException(ErrorCode.ACCOUNT_DOES_NOT_EXIST, "No account with ID " + accountId + " was found"));
    final List<PermissionBO> verifiedPermissions = permissionsService.validate(permissions, account.getDomain());
    if (verifiedPermissions.size() != permissions.size()) {
        final List<PermissionBO> difference = permissions.stream().filter(permission -> !verifiedPermissions.contains(permission)).collect(Collectors.toList());
        throw new ServiceException(ErrorCode.PERMISSION_DOES_NOT_EXIST, "The following permissions are not valid" + difference);
    }
    final List<PermissionBO> combinedPermissions = Stream.concat(account.getPermissions().stream(), verifiedPermissions.stream()).distinct().collect(Collectors.toList());
    final AccountBO updated = account.withPermissions(combinedPermissions);
    accountsRepository.update(serviceMapper.toDO(updated));
    return updated;
}
Also used : ServiceMapper(com.nexblocks.authguard.service.mappers.ServiceMapper) IdempotencyService(com.nexblocks.authguard.service.IdempotencyService) RolesService(com.nexblocks.authguard.service.RolesService) java.util(java.util) MessageBus(com.nexblocks.authguard.emb.MessageBus) ErrorCode(com.nexblocks.authguard.service.exceptions.codes.ErrorCode) Inject(com.google.inject.Inject) ServiceException(com.nexblocks.authguard.service.exceptions.ServiceException) ServiceNotFoundException(com.nexblocks.authguard.service.exceptions.ServiceNotFoundException) com.nexblocks.authguard.service.model(com.nexblocks.authguard.service.model) AccountPreProcessor(com.nexblocks.authguard.service.util.AccountPreProcessor) PermissionsService(com.nexblocks.authguard.service.PermissionsService) Collectors(java.util.stream.Collectors) AccountUpdateMerger(com.nexblocks.authguard.service.util.AccountUpdateMerger) Messages(com.nexblocks.authguard.emb.Messages) AccountConfig(com.nexblocks.authguard.service.config.AccountConfig) Stream(java.util.stream.Stream) AccountsRepository(com.nexblocks.authguard.dal.persistence.AccountsRepository) AccountDO(com.nexblocks.authguard.dal.model.AccountDO) AccountsService(com.nexblocks.authguard.service.AccountsService) ValueComparator(com.nexblocks.authguard.service.util.ValueComparator) Named(com.google.inject.name.Named) ConfigContext(com.nexblocks.authguard.config.ConfigContext) ServiceException(com.nexblocks.authguard.service.exceptions.ServiceException) ServiceNotFoundException(com.nexblocks.authguard.service.exceptions.ServiceNotFoundException)

Example 3 with ServiceException

use of com.nexblocks.authguard.service.exceptions.ServiceException in project AuthGuard by AuthGuard.

the class ActionTokenServiceImpl method generateFromOtp.

@Override
public Try<ActionTokenBO> generateFromOtp(final String passwordId, final String otp, final String action) {
    final String otpToken = passwordId + ":" + otp;
    final Either<Exception, Optional<AccountBO>> otpResult = otpVerifier.verifyAccountToken(otpToken).map(accountsService::getById);
    if (otpResult.isLeft()) {
        return Try.failure(otpResult.getLeft());
    }
    final AccountBO account = otpResult.get().orElse(null);
    if (account == null) {
        return Try.failure(new ServiceException(ErrorCode.ACCOUNT_DOES_NOT_EXIST, "The account associated with that OTP no longer exists"));
    }
    final AccountTokenDO token = generateToken(account, action);
    return Try.success(ActionTokenBO.builder().accountId(account.getId()).token(token.getToken()).validFor(TOKEN_LIFETIME.toSeconds()).build());
}
Also used : AccountBO(com.nexblocks.authguard.service.model.AccountBO) Optional(java.util.Optional) ServiceException(com.nexblocks.authguard.service.exceptions.ServiceException) AccountTokenDO(com.nexblocks.authguard.dal.model.AccountTokenDO) ServiceException(com.nexblocks.authguard.service.exceptions.ServiceException)

Example 4 with ServiceException

use of com.nexblocks.authguard.service.exceptions.ServiceException in project AuthGuard by AuthGuard.

the class CredentialsServiceImpl method resetPasswordByToken.

@Override
public Optional<CredentialsBO> resetPasswordByToken(final String token, final String plainPassword) {
    final AccountTokenDO accountToken = accountTokensRepository.getByToken(token).join().orElseThrow(() -> new ServiceNotFoundException(ErrorCode.TOKEN_EXPIRED_OR_DOES_NOT_EXIST, "AccountDO token " + token + " does not exist"));
    if (accountToken.getExpiresAt().isBefore(OffsetDateTime.now())) {
        throw new ServiceException(ErrorCode.EXPIRED_TOKEN, "Token " + token + " has expired");
    }
    final String credentialsId = Optional.ofNullable(accountToken.getAdditionalInformation()).map(m -> m.get("credentialsId")).orElseThrow(() -> new ServiceException(ErrorCode.INVALID_TOKEN, "Reset token was not mapped to any credentials"));
    return updatePassword(credentialsId, plainPassword);
}
Also used : ServiceMapper(com.nexblocks.authguard.service.mappers.ServiceMapper) MessageBus(com.nexblocks.authguard.emb.MessageBus) CryptographicRandom(com.nexblocks.authguard.service.random.CryptographicRandom) Inject(com.google.inject.Inject) CredentialsRepository(com.nexblocks.authguard.dal.persistence.CredentialsRepository) CredentialsDO(com.nexblocks.authguard.dal.model.CredentialsDO) ServiceException(com.nexblocks.authguard.service.exceptions.ServiceException) ServiceNotFoundException(com.nexblocks.authguard.service.exceptions.ServiceNotFoundException) ResetTokenMessage(com.nexblocks.authguard.service.messaging.ResetTokenMessage) CredentialsService(com.nexblocks.authguard.service.CredentialsService) ArrayList(java.util.ArrayList) AccountsService(com.nexblocks.authguard.service.AccountsService) Duration(java.time.Duration) ServiceConflictException(com.nexblocks.authguard.service.exceptions.ServiceConflictException) com.nexblocks.authguard.basic.passwords(com.nexblocks.authguard.basic.passwords) IdempotencyService(com.nexblocks.authguard.service.IdempotencyService) ErrorCode(com.nexblocks.authguard.service.exceptions.codes.ErrorCode) ImmutableMap(com.google.common.collect.ImmutableMap) Set(java.util.Set) AccountTokensRepository(com.nexblocks.authguard.dal.cache.AccountTokensRepository) com.nexblocks.authguard.service.model(com.nexblocks.authguard.service.model) Collectors(java.util.stream.Collectors) Messages(com.nexblocks.authguard.emb.Messages) CredentialsAuditRepository(com.nexblocks.authguard.dal.persistence.CredentialsAuditRepository) List(java.util.List) OffsetDateTime(java.time.OffsetDateTime) Optional(java.util.Optional) AccountTokenDO(com.nexblocks.authguard.dal.model.AccountTokenDO) ID(com.nexblocks.authguard.service.util.ID) ServiceException(com.nexblocks.authguard.service.exceptions.ServiceException) AccountTokenDO(com.nexblocks.authguard.dal.model.AccountTokenDO) ServiceNotFoundException(com.nexblocks.authguard.service.exceptions.ServiceNotFoundException)

Example 5 with ServiceException

use of com.nexblocks.authguard.service.exceptions.ServiceException in project AuthGuard by AuthGuard.

the class CredentialsServiceImpl method generateResetToken.

@Override
public PasswordResetTokenBO generateResetToken(final String identifier, final boolean returnToken, final String domain) {
    final CredentialsBO credentials = getByUsername(identifier, domain).orElseThrow(() -> new ServiceNotFoundException(ErrorCode.CREDENTIALS_DOES_NOT_EXIST, "Unknown identifier"));
    final AccountBO account = accountsService.getById(credentials.getAccountId()).orElseThrow(() -> new ServiceException(ErrorCode.ACCOUNT_DOES_NOT_EXIST, "Credentials found for the identifier but no account was associated with it. This could be the " + "result of deleting an account without deleting its credentials"));
    final OffsetDateTime now = OffsetDateTime.now();
    final AccountTokenDO accountToken = AccountTokenDO.builder().id(ID.generate()).token(cryptographicRandom.base64Url(RESET_TOKEN_SIZE)).associatedAccountId(account.getId()).additionalInformation(ImmutableMap.of("credentialsId", credentials.getId())).expiresAt(now.plus(TOKEN_LIFETIME)).build();
    accountTokensRepository.save(accountToken).join();
    messageBus.publish(CREDENTIALS_CHANNEL, Messages.resetTokenGenerated(new ResetTokenMessage(account, accountToken)));
    return PasswordResetTokenBO.builder().token(returnToken ? accountToken.getToken() : null).issuedAt(now.toEpochSecond()).expiresAt(accountToken.getExpiresAt().toEpochSecond()).build();
}
Also used : ServiceException(com.nexblocks.authguard.service.exceptions.ServiceException) OffsetDateTime(java.time.OffsetDateTime) ServiceNotFoundException(com.nexblocks.authguard.service.exceptions.ServiceNotFoundException) AccountTokenDO(com.nexblocks.authguard.dal.model.AccountTokenDO) ResetTokenMessage(com.nexblocks.authguard.service.messaging.ResetTokenMessage)

Aggregations

ServiceException (com.nexblocks.authguard.service.exceptions.ServiceException)17 AccountTokenDO (com.nexblocks.authguard.dal.model.AccountTokenDO)8 ServiceNotFoundException (com.nexblocks.authguard.service.exceptions.ServiceNotFoundException)6 OffsetDateTime (java.time.OffsetDateTime)6 Inject (com.google.inject.Inject)5 AccountsService (com.nexblocks.authguard.service.AccountsService)5 ErrorCode (com.nexblocks.authguard.service.exceptions.codes.ErrorCode)5 Optional (java.util.Optional)5 Collectors (java.util.stream.Collectors)4 AccountTokensRepository (com.nexblocks.authguard.dal.cache.AccountTokensRepository)3 MessageBus (com.nexblocks.authguard.emb.MessageBus)3 Messages (com.nexblocks.authguard.emb.Messages)3 IdempotencyService (com.nexblocks.authguard.service.IdempotencyService)3 ServiceAuthorizationException (com.nexblocks.authguard.service.exceptions.ServiceAuthorizationException)3 ServiceConflictException (com.nexblocks.authguard.service.exceptions.ServiceConflictException)3 ActionTokenBO (com.nexblocks.authguard.service.model.ActionTokenBO)3 Duration (java.time.Duration)3 ImmutableMap (com.google.common.collect.ImmutableMap)2 Named (com.google.inject.name.Named)2 com.nexblocks.authguard.basic.passwords (com.nexblocks.authguard.basic.passwords)2