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.transaction.annotation.EnableTransactionManagement;
import org.springframework.transaction.annotation.Transactional;
import javax.persistence.EntityManager;
import javax.persistence.NoResultException;
import javax.persistence.PersistenceContext;
import java.time.LocalDateTime;
/**
* This is {@link JpaGoogleAuthenticatorTokenRepository}.
*
* @author Misagh Moayyed
* @since 5.1.0
*/
@EnableTransactionManagement(proxyTargetClass = true)
@Transactional(transactionManager = "transactionManagerGoogleAuthenticator")
public class JpaGoogleAuthenticatorTokenRepository extends BaseOneTimeTokenRepository {
private static final Logger LOGGER = LoggerFactory.getLogger(JpaGoogleAuthenticatorTokenRepository.class);
@PersistenceContext(unitName = "googleAuthenticatorEntityManagerFactory")
private EntityManager entityManager;
private final long expireTokensInSeconds;
public JpaGoogleAuthenticatorTokenRepository(final long expireTokensInSeconds) {
this.expireTokensInSeconds = expireTokensInSeconds;
}
@Override
public void cleanInternal() {
final int count = this.entityManager.createQuery("DELETE FROM " + GoogleAuthenticatorToken.class.getSimpleName()
+ " r where r.issuedDateTime>= :expired")
.setParameter("expired", LocalDateTime.now().minusSeconds(this.expireTokensInSeconds))
.executeUpdate();
LOGGER.debug("Deleted [{}] expired previously used token record(s)", count);
}
@Override
public void store(final OneTimeToken token) {
this.entityManager.merge(token);
}
@Override
public boolean exists(final String uid, final Integer otp) {
try {
final GoogleAuthenticatorToken r =
this.entityManager.createQuery("SELECT r FROM " + GoogleAuthenticatorToken.class.getSimpleName()
+ " r where r.userId = :userId and r.token = :token", GoogleAuthenticatorToken.class)
.setParameter("userId", uid)
.setParameter("token", otp)
.getSingleResult();
return r != null;
} catch (final NoResultException e) {
LOGGER.debug("No record could be found for google authenticator id [{}]", uid);
}
return false;
}
}