|
17 | 17 | package org.mitre.oauth2.repository.impl;
|
18 | 18 |
|
19 | 19 | import java.text.ParseException;
|
| 20 | +import java.util.ArrayList; |
20 | 21 | import java.util.Date;
|
21 | 22 | import java.util.LinkedHashSet;
|
22 | 23 | import java.util.List;
|
23 | 24 | import java.util.Set;
|
24 | 25 |
|
25 | 26 | import javax.persistence.EntityManager;
|
26 | 27 | import javax.persistence.PersistenceContext;
|
| 28 | +import javax.persistence.Query; |
27 | 29 | import javax.persistence.TypedQuery;
|
| 30 | +import javax.persistence.criteria.CriteriaBuilder; |
| 31 | +import javax.persistence.criteria.CriteriaDelete; |
| 32 | +import javax.persistence.criteria.Root; |
28 | 33 |
|
29 | 34 | import org.mitre.oauth2.model.ClientDetailsEntity;
|
30 | 35 | import org.mitre.oauth2.model.OAuth2AccessTokenEntity;
|
31 | 36 | import org.mitre.oauth2.model.OAuth2RefreshTokenEntity;
|
32 | 37 | import org.mitre.oauth2.repository.OAuth2TokenRepository;
|
33 | 38 | import org.mitre.uma.model.ResourceSet;
|
34 | 39 | import org.mitre.util.jpa.JpaUtil;
|
| 40 | +import org.slf4j.Logger; |
| 41 | +import org.slf4j.LoggerFactory; |
35 | 42 | import org.springframework.stereotype.Repository;
|
36 | 43 | import org.springframework.transaction.annotation.Transactional;
|
37 | 44 |
|
|
42 | 49 | public class JpaOAuth2TokenRepository implements OAuth2TokenRepository {
|
43 | 50 |
|
44 | 51 | private static final int MAXEXPIREDRESULTS = 1000;
|
| 52 | + |
| 53 | +private static final Logger logger = LoggerFactory.getLogger(JpaOAuth2TokenRepository.class); |
45 | 54 |
|
46 | 55 | @PersistenceContext(unitName="defaultPersistenceUnit")
|
47 | 56 | private EntityManager manager;
|
@@ -214,4 +223,42 @@ public Set<OAuth2AccessTokenEntity> getAccessTokensForResourceSet(ResourceSet rs
|
214 | 223 | return new LinkedHashSet<>(query.getResultList());
|
215 | 224 | }
|
216 | 225 |
|
| 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 | + |
217 | 264 | }
|
0 commit comments