package org.apereo.cas.trusted.authentication.storage; import com.mongodb.WriteResult; import org.apereo.cas.trusted.authentication.api.MultifactorAuthenticationTrustRecord; 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 java.time.LocalDate; import java.util.HashSet; import java.util.List; import java.util.Set; /** * This is {@link MongoDbMultifactorAuthenticationTrustStorage}. * * @author Misagh Moayyed * @since 5.0.0 */ public class MongoDbMultifactorAuthenticationTrustStorage extends BaseMultifactorAuthenticationTrustStorage { private static final Logger LOGGER = LoggerFactory.getLogger(MongoDbMultifactorAuthenticationTrustStorage.class); private final String collectionName; private final MongoOperations mongoTemplate; /** * Instantiates a new Mongo db multifactor authentication trust storage. * * @param collectionName the collection name * @param dropCollection id the configured collection should be dropped or recreated * @param mongoTemplate the mongo template */ public MongoDbMultifactorAuthenticationTrustStorage(final String collectionName, final boolean dropCollection, final MongoOperations mongoTemplate) { this.collectionName = collectionName; this.mongoTemplate = mongoTemplate; Assert.notNull(this.mongoTemplate); 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 expire(final String key) { try { final Query query = new Query(); query.addCriteria(Criteria.where("key").is(key)); final WriteResult res = this.mongoTemplate.remove(query, MultifactorAuthenticationTrustRecord.class, this.collectionName); LOGGER.info("Found and removed [{}]", res.getN()); } catch (final Exception e) { LOGGER.info("No trusted authentication records could be found"); } } @Override public void expire(final LocalDate onOrBefore) { try { final Query query = new Query(); query.addCriteria(Criteria.where("date").lte(onOrBefore)); final WriteResult res = this.mongoTemplate.remove(query, MultifactorAuthenticationTrustRecord.class, this.collectionName); LOGGER.info("Found and removed [{}]", res.getN()); } catch (final Exception e) { LOGGER.info("No trusted authentication records could be found"); } } @Override public Set<MultifactorAuthenticationTrustRecord> get(final LocalDate onOrAfterDate) { final Query query = new Query(); query.addCriteria(Criteria.where("date").gte(onOrAfterDate)); final List<MultifactorAuthenticationTrustRecord> results = this.mongoTemplate.find(query, MultifactorAuthenticationTrustRecord.class, this.collectionName); return new HashSet<>(results); } @Override public Set<MultifactorAuthenticationTrustRecord> get(final String principal) { final Query query = new Query(); query.addCriteria(Criteria.where("principal").is(principal)); final List<MultifactorAuthenticationTrustRecord> results = this.mongoTemplate.find(query, MultifactorAuthenticationTrustRecord.class, this.collectionName); return new HashSet<>(results); } @Override protected MultifactorAuthenticationTrustRecord setInternal(final MultifactorAuthenticationTrustRecord record) { this.mongoTemplate.save(record, this.collectionName); return record; } }