package org.apereo.cas.trusted.authentication.storage; import org.apereo.cas.trusted.authentication.api.MultifactorAuthenticationTrustRecord; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.transaction.annotation.EnableTransactionManagement; import org.springframework.transaction.annotation.Transactional; import javax.persistence.EntityManager; import javax.persistence.NoResultException; import javax.persistence.PersistenceContext; import java.time.LocalDate; import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; /** * This is {@link JpaMultifactorAuthenticationTrustStorage}. * * @author Misagh Moayyed * @since 5.0.0 */ @EnableTransactionManagement(proxyTargetClass = true) @Transactional(transactionManager = "transactionManagerMfaAuthnTrust") public class JpaMultifactorAuthenticationTrustStorage extends BaseMultifactorAuthenticationTrustStorage { private static final Logger LOGGER = LoggerFactory.getLogger(JpaMultifactorAuthenticationTrustStorage.class); private static final String TABLE_NAME = "MultifactorAuthenticationTrustRecord"; @PersistenceContext(unitName = "mfaTrustedAuthnEntityManagerFactory") private EntityManager entityManager; @Override public void expire(final String key) { try { final int count = this.entityManager.createQuery("DELETE FROM " + TABLE_NAME + " r where r.key = :key", MultifactorAuthenticationTrustRecord.class) .setParameter("key", key) .executeUpdate(); LOGGER.info("Found and removed [{}] records", count); } catch (final NoResultException e) { LOGGER.info("No trusted authentication records could be found"); } } @Override public void expire(final LocalDate onOrBefore) { try { final int count = this.entityManager.createQuery("DELETE FROM " + TABLE_NAME + " r where r.date < :date", MultifactorAuthenticationTrustRecord.class) .setParameter("date", onOrBefore) .executeUpdate(); LOGGER.info("Found and removed [{}] records", count); } catch (final NoResultException e) { LOGGER.info("No trusted authentication records could be found"); } } @Override public Set<MultifactorAuthenticationTrustRecord> get(final LocalDate onOrAfterDate) { try { final List<MultifactorAuthenticationTrustRecord> results = this.entityManager.createQuery("SELECT r FROM " + TABLE_NAME + " r where r.date >= :date", MultifactorAuthenticationTrustRecord.class).setParameter("date", onOrAfterDate).getResultList(); return new HashSet<>(results); } catch (final NoResultException e) { LOGGER.info("No trusted authentication records could be found for [{}]", onOrAfterDate); } return Collections.emptySet(); } @Override public Set<MultifactorAuthenticationTrustRecord> get(final String principal) { try { final List<MultifactorAuthenticationTrustRecord> results = this.entityManager.createQuery("SELECT r FROM " + TABLE_NAME + " r where r.principal = :principal", MultifactorAuthenticationTrustRecord.class).setParameter("principal", principal).getResultList(); return new HashSet<>(results); } catch (final NoResultException e) { LOGGER.info("No trusted authentication records could be found for [{}]", principal); } return Collections.emptySet(); } @Override public MultifactorAuthenticationTrustRecord setInternal(final MultifactorAuthenticationTrustRecord record) { return this.entityManager.merge(record); } }