Skip to content

Commit

Permalink
JAMES-1718 AccessTokenRepository should not throw upon already stored…
Browse files Browse the repository at this point in the history
… AccessToken
  • Loading branch information
chibenwa committed Apr 15, 2016
1 parent 0cc164a commit 231beb5
Show file tree
Hide file tree
Showing 7 changed files with 11 additions and 55 deletions.
Expand Up @@ -56,7 +56,6 @@ public CassandraAccessTokenDAO(Session session, long durationInMilliseconds) {
.where(eq(CassandraAccessTokenTable.TOKEN, bindMarker(CassandraAccessTokenTable.TOKEN))));

this.insertStatement = session.prepare(insertInto(CassandraAccessTokenTable.TABLE_NAME)
.ifNotExists()
.value(CassandraAccessTokenTable.TOKEN, bindMarker(CassandraAccessTokenTable.TOKEN))
.value(CassandraAccessTokenTable.USERNAME, bindMarker(CassandraAccessTokenTable.USERNAME))
.using(ttl(bindMarker(TTL))));
Expand All @@ -66,21 +65,21 @@ public CassandraAccessTokenDAO(Session session, long durationInMilliseconds) {
.where(eq(CassandraAccessTokenTable.TOKEN, bindMarker(CassandraAccessTokenTable.TOKEN))));
}

public CompletableFuture<Boolean> addToken(String username, AccessToken accessToken) {
return cassandraAsyncExecutor.executeReturnApplied(insertStatement.bind()
.setUUID(CassandraAccessTokenTable.TOKEN, accessToken.getToken())
public CompletableFuture<Void> addToken(String username, AccessToken accessToken) {
return cassandraAsyncExecutor.executeVoid(insertStatement.bind()
.setUUID(CassandraAccessTokenTable.TOKEN, accessToken.asUUID())
.setString(CassandraAccessTokenTable.USERNAME, username)
.setInt(TTL, durationInSeconds));
}

public CompletableFuture<Void> removeToken(AccessToken accessToken) {
return cassandraAsyncExecutor.executeVoid(removeStatement.bind()
.setUUID(CassandraAccessTokenTable.TOKEN, accessToken.getToken()));
.setUUID(CassandraAccessTokenTable.TOKEN, accessToken.asUUID()));
}

public CompletableFuture<Optional<String>> getUsernameFromToken(AccessToken accessToken) {
return cassandraAsyncExecutor.executeSingleRow(selectStatement.bind()
.setUUID(CassandraAccessTokenTable.TOKEN, accessToken.getToken()))
.setUUID(CassandraAccessTokenTable.TOKEN, accessToken.asUUID()))
.thenApply(optional -> optional.map(row -> row.getString(CassandraAccessTokenTable.USERNAME)));
}
}
Expand Up @@ -24,7 +24,6 @@

import org.apache.james.jmap.api.access.AccessToken;
import org.apache.james.jmap.api.access.AccessTokenRepository;
import org.apache.james.jmap.api.access.exceptions.AccessTokenAlreadyStored;
import org.apache.james.jmap.api.access.exceptions.InvalidAccessToken;

import com.datastax.driver.core.Session;
Expand All @@ -40,14 +39,12 @@ public CassandraAccessTokenRepository(Session session, @Named(TOKEN_EXPIRATION_I
}

@Override
public void addToken(String username, AccessToken accessToken) throws AccessTokenAlreadyStored {
public void addToken(String username, AccessToken accessToken) {
Preconditions.checkNotNull(username);
Preconditions.checkArgument(! username.isEmpty(), "Username should not be empty");
Preconditions.checkNotNull(accessToken);

if (!cassandraAccessTokenDAO.addToken(username, accessToken).join()) {
throw new AccessTokenAlreadyStored(accessToken);
}
cassandraAccessTokenDAO.addToken(username, accessToken).join();
}

@Override
Expand Down
Expand Up @@ -48,7 +48,7 @@ public String serialize() {
return token.toString();
}

public UUID getToken() {
public UUID asUUID() {
return token;
}

Expand Down
Expand Up @@ -19,14 +19,13 @@

package org.apache.james.jmap.api.access;

import org.apache.james.jmap.api.access.exceptions.AccessTokenAlreadyStored;
import org.apache.james.jmap.api.access.exceptions.InvalidAccessToken;

public interface AccessTokenRepository {

String TOKEN_EXPIRATION_IN_MS = "tokenExpirationInMs";

void addToken(String username, AccessToken accessToken) throws AccessTokenAlreadyStored;
void addToken(String username, AccessToken accessToken);

void removeToken(AccessToken accessToken);

Expand Down

This file was deleted.

Expand Up @@ -28,7 +28,6 @@
import org.apache.commons.collections4.map.PassiveExpiringMap;
import org.apache.james.jmap.api.access.AccessToken;
import org.apache.james.jmap.api.access.AccessTokenRepository;
import org.apache.james.jmap.api.access.exceptions.AccessTokenAlreadyStored;
import org.apache.james.jmap.api.access.exceptions.InvalidAccessToken;

import com.google.common.base.Preconditions;
Expand All @@ -44,14 +43,12 @@ public MemoryAccessTokenRepository(@Named(TOKEN_EXPIRATION_IN_MS) long durationI
}

@Override
public void addToken(String username, AccessToken accessToken) throws AccessTokenAlreadyStored{
public void addToken(String username, AccessToken accessToken) {
Preconditions.checkNotNull(username);
Preconditions.checkArgument(! username.isEmpty(), "Username should not be empty");
Preconditions.checkNotNull(accessToken);
synchronized (tokensExpirationDates) {
if (tokensExpirationDates.putIfAbsent(accessToken, username) != null) {
throw new AccessTokenAlreadyStored(accessToken);
}
tokensExpirationDates.put(accessToken, username);
}
}

Expand Down
Expand Up @@ -22,7 +22,6 @@
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;

import org.apache.james.jmap.api.access.exceptions.AccessTokenAlreadyStored;
import org.apache.james.jmap.api.access.exceptions.InvalidAccessToken;
import org.junit.Before;
import org.junit.Test;
Expand Down Expand Up @@ -60,12 +59,6 @@ public void removedTokensMustBeInvalid() throws Exception {
assertThatThrownBy(() -> accessTokenRepository.getUsernameFromToken(TOKEN)).isInstanceOf(InvalidAccessToken.class);
}

@Test
public void addTokenMustThrowWhenTokenIsAlreadyStored() throws Exception {
accessTokenRepository.addToken(USERNAME, TOKEN);
assertThatThrownBy(() -> accessTokenRepository.addToken(USERNAME, TOKEN)).isInstanceOf(AccessTokenAlreadyStored.class);
}

@Test
public void outDatedTokenMustBeInvalid() throws Exception {
accessTokenRepository.addToken(USERNAME, TOKEN);
Expand Down

0 comments on commit 231beb5

Please sign in to comment.