package org.apereo.cas.adaptors.gauth; import org.apereo.cas.adaptors.gauth.repository.token.GoogleAuthenticatorToken; import org.apereo.cas.otp.repository.token.BaseOneTimeTokenRepository; import org.apereo.cas.otp.repository.token.OneTimeToken; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.data.mongodb.core.MongoOperations; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import org.springframework.util.Assert; import javax.persistence.NoResultException; import java.time.LocalDateTime; /** * This is {@link MongoDbGoogleAuthenticatorTokenRepository}. * * @author Misagh Moayyed * @since 5.1.0 */ public class MongoDbGoogleAuthenticatorTokenRepository extends BaseOneTimeTokenRepository { private static final Logger LOGGER = LoggerFactory.getLogger(MongoDbGoogleAuthenticatorTokenRepository.class); private final long expireTokensInSeconds; private final String collectionName; private final MongoOperations mongoTemplate; public MongoDbGoogleAuthenticatorTokenRepository(final MongoOperations mongoTemplate, final String collectionName, final boolean dropCollection, final long expireTokensInSeconds) { this.mongoTemplate = mongoTemplate; this.collectionName = collectionName; this.expireTokensInSeconds = expireTokensInSeconds; Assert.notNull(this.mongoTemplate); Assert.notNull(this.collectionName); if (dropCollection) { LOGGER.debug("Dropping database collection: [{}]", this.collectionName); this.mongoTemplate.dropCollection(this.collectionName); } if (!this.mongoTemplate.collectionExists(this.collectionName)) { LOGGER.debug("Creating database collection: [{}]", this.collectionName); this.mongoTemplate.createCollection(this.collectionName); } } @Override public void store(final OneTimeToken token) { this.mongoTemplate.save(token, this.collectionName); } @Override public boolean exists(final String uid, final Integer otp) { try { final Query query = new Query(); query.addCriteria(Criteria.where("userId").is(uid).and("token").is(otp)); final GoogleAuthenticatorToken r = this.mongoTemplate.findOne(query, GoogleAuthenticatorToken.class, this.collectionName); return r != null; } catch (final NoResultException e) { LOGGER.debug("No record could be found for google authenticator id [{}]", uid); } return false; } @Override protected void cleanInternal() { try { final Query query = new Query(); query.addCriteria(Criteria.where("issuedDateTime").gte(LocalDateTime.now().minusSeconds(this.expireTokensInSeconds))); this.mongoTemplate.remove(query, GoogleAuthenticatorToken.class, this.collectionName); } catch (final Exception e) { LOGGER.warn(e.getMessage(), e); } } }