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)))); .where(eq(CassandraAccessTokenTable.TOKEN, bindMarker(CassandraAccessTokenTable.TOKEN))));


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


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


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


public CompletableFuture<Optional<String>> getUsernameFromToken(AccessToken accessToken) { public CompletableFuture<Optional<String>> getUsernameFromToken(AccessToken accessToken) {
return cassandraAsyncExecutor.executeSingleRow(selectStatement.bind() return cassandraAsyncExecutor.executeSingleRow(selectStatement.bind()
.setUUID(CassandraAccessTokenTable.TOKEN, accessToken.getToken())) .setUUID(CassandraAccessTokenTable.TOKEN, accessToken.asUUID()))
.thenApply(optional -> optional.map(row -> row.getString(CassandraAccessTokenTable.USERNAME))); .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.AccessToken;
import org.apache.james.jmap.api.access.AccessTokenRepository; 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 org.apache.james.jmap.api.access.exceptions.InvalidAccessToken;


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


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


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


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


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


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


package org.apache.james.jmap.api.access; 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; import org.apache.james.jmap.api.access.exceptions.InvalidAccessToken;


public interface AccessTokenRepository { public interface AccessTokenRepository {


String TOKEN_EXPIRATION_IN_MS = "tokenExpirationInMs"; String TOKEN_EXPIRATION_IN_MS = "tokenExpirationInMs";


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


void removeToken(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.commons.collections4.map.PassiveExpiringMap;
import org.apache.james.jmap.api.access.AccessToken; import org.apache.james.jmap.api.access.AccessToken;
import org.apache.james.jmap.api.access.AccessTokenRepository; 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 org.apache.james.jmap.api.access.exceptions.InvalidAccessToken;


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


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


Expand Down
Expand Up @@ -22,7 +22,6 @@
import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy; 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.apache.james.jmap.api.access.exceptions.InvalidAccessToken;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
Expand Down Expand Up @@ -60,12 +59,6 @@ public void removedTokensMustBeInvalid() throws Exception {
assertThatThrownBy(() -> accessTokenRepository.getUsernameFromToken(TOKEN)).isInstanceOf(InvalidAccessToken.class); 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 @Test
public void outDatedTokenMustBeInvalid() throws Exception { public void outDatedTokenMustBeInvalid() throws Exception {
accessTokenRepository.addToken(USERNAME, TOKEN); accessTokenRepository.addToken(USERNAME, TOKEN);
Expand Down

0 comments on commit 231beb5

Please sign in to comment.