Skip to content

Commit 542afca

Browse files
committed
cleans duplicate access tokens from DB before other cleanup happens
1 parent 9599642 commit 542afca

File tree

3 files changed

+55
-0
lines changed

3 files changed

+55
-0
lines changed

openid-connect-common/src/main/java/org/mitre/oauth2/repository/OAuth2TokenRepository.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,4 +62,8 @@ public interface OAuth2TokenRepository {
6262

6363
public Set<OAuth2AccessTokenEntity> getAccessTokensForResourceSet(ResourceSet rs);
6464

65+
public void clearDuplicateAccessTokens();
66+
67+
public void clearDuplicateRefreshTokens();
68+
6569
}

openid-connect-server/src/main/java/org/mitre/oauth2/repository/impl/JpaOAuth2TokenRepository.java

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,21 +17,28 @@
1717
package org.mitre.oauth2.repository.impl;
1818

1919
import java.text.ParseException;
20+
import java.util.ArrayList;
2021
import java.util.Date;
2122
import java.util.LinkedHashSet;
2223
import java.util.List;
2324
import java.util.Set;
2425

2526
import javax.persistence.EntityManager;
2627
import javax.persistence.PersistenceContext;
28+
import javax.persistence.Query;
2729
import javax.persistence.TypedQuery;
30+
import javax.persistence.criteria.CriteriaBuilder;
31+
import javax.persistence.criteria.CriteriaDelete;
32+
import javax.persistence.criteria.Root;
2833

2934
import org.mitre.oauth2.model.ClientDetailsEntity;
3035
import org.mitre.oauth2.model.OAuth2AccessTokenEntity;
3136
import org.mitre.oauth2.model.OAuth2RefreshTokenEntity;
3237
import org.mitre.oauth2.repository.OAuth2TokenRepository;
3338
import org.mitre.uma.model.ResourceSet;
3439
import org.mitre.util.jpa.JpaUtil;
40+
import org.slf4j.Logger;
41+
import org.slf4j.LoggerFactory;
3542
import org.springframework.stereotype.Repository;
3643
import org.springframework.transaction.annotation.Transactional;
3744

@@ -42,6 +49,8 @@
4249
public class JpaOAuth2TokenRepository implements OAuth2TokenRepository {
4350

4451
private static final int MAXEXPIREDRESULTS = 1000;
52+
53+
private static final Logger logger = LoggerFactory.getLogger(JpaOAuth2TokenRepository.class);
4554

4655
@PersistenceContext(unitName="defaultPersistenceUnit")
4756
private EntityManager manager;
@@ -214,4 +223,42 @@ public Set<OAuth2AccessTokenEntity> getAccessTokensForResourceSet(ResourceSet rs
214223
return new LinkedHashSet<>(query.getResultList());
215224
}
216225

226+
/* (non-Javadoc)
227+
* @see org.mitre.oauth2.repository.OAuth2TokenRepository#clearDuplicateAccessTokens()
228+
*/
229+
@Override
230+
@Transactional(value="defaultTransactionManager")
231+
public void clearDuplicateAccessTokens() {
232+
/*
233+
*
234+
* delete from access_token where token_value in
235+
* (select token_value from (select token_value, count(*) as count from
236+
* access_token group by token_value having count > 1) duplicate_tokens)
237+
*/
238+
239+
Query query = manager.createQuery("select a.jwt, count(1) as c from OAuth2AccessTokenEntity a GROUP BY a.jwt HAVING c > 1");
240+
List<Object[]> resultList = query.getResultList();
241+
List<JWT> values = new ArrayList<>();
242+
for (Object[] r : resultList) {
243+
logger.warn("Found duplicate: {}, {}", r[0], r[1]);
244+
values.add((JWT) r[0]);
245+
}
246+
if (values.size() > 0) {
247+
CriteriaBuilder cb = manager.getCriteriaBuilder();
248+
CriteriaDelete<OAuth2AccessTokenEntity> criteriaDelete = cb.createCriteriaDelete(OAuth2AccessTokenEntity.class);
249+
Root<OAuth2AccessTokenEntity> root = criteriaDelete.from(OAuth2AccessTokenEntity.class);
250+
criteriaDelete.where(root.get("jwt").in(values));
251+
int result = manager.createQuery(criteriaDelete).executeUpdate();
252+
logger.warn("Results from delete: {}", result);
253+
}
254+
}
255+
256+
/* (non-Javadoc)
257+
* @see org.mitre.oauth2.repository.OAuth2TokenRepository#clearDuplicateRefreshTokens()
258+
*/
259+
@Override
260+
public void clearDuplicateRefreshTokens() {
261+
262+
}
263+
217264
}

openid-connect-server/src/main/java/org/mitre/oauth2/service/impl/DefaultOAuth2ProviderTokenService.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -424,6 +424,10 @@ public List<OAuth2RefreshTokenEntity> getRefreshTokensForClient(ClientDetailsEnt
424424
@Override
425425
public void clearExpiredTokens() {
426426
logger.info("Cleaning out all expired tokens");
427+
428+
// get all the duplicated tokens first to maintain consistency
429+
tokenRepository.clearDuplicateAccessTokens();
430+
tokenRepository.clearDuplicateRefreshTokens();
427431

428432
Collection<OAuth2AccessTokenEntity> accessTokens = getExpiredAccessTokens();
429433
logger.info("Found " + accessTokens.size() + " expired access tokens");

0 commit comments

Comments
 (0)