package org.apereo.cas.trusted.authentication.storage;
import com.google.common.cache.LoadingCache;
import org.apereo.cas.trusted.authentication.api.MultifactorAuthenticationTrustRecord;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.time.LocalDate;
import java.util.Set;
import java.util.stream.Collectors;
/**
* This is {@link InMemoryMultifactorAuthenticationTrustStorage}.
*
* @author Misagh Moayyed
* @since 5.0.0
*/
public class InMemoryMultifactorAuthenticationTrustStorage extends BaseMultifactorAuthenticationTrustStorage {
private static final Logger LOGGER = LoggerFactory.getLogger(InMemoryMultifactorAuthenticationTrustStorage.class);
private LoadingCache<String, MultifactorAuthenticationTrustRecord> storage;
public InMemoryMultifactorAuthenticationTrustStorage(final LoadingCache<String, MultifactorAuthenticationTrustRecord> st) {
this.storage = st;
}
@Override
public void expire(final String key) {
storage.asMap().keySet().removeIf(k -> k.equalsIgnoreCase(key));
}
@Override
public void expire(final LocalDate onOrBefore) {
final Set<MultifactorAuthenticationTrustRecord> results = storage.asMap()
.values()
.stream()
.filter(entry -> entry.getDate().isEqual(onOrBefore) || entry.getDate().isBefore(onOrBefore))
.sorted()
.distinct()
.collect(Collectors.toSet());
LOGGER.info("Found [{}] expired records", results.size());
if (!results.isEmpty()) {
results.forEach(entry -> storage.invalidate(entry.getKey()));
LOGGER.info("Invalidated and removed [{}] expired records", results.size());
}
}
@Override
public Set<MultifactorAuthenticationTrustRecord> get(final LocalDate onOrAfterDate) {
expire(onOrAfterDate);
return storage.asMap()
.values()
.stream()
.filter(entry -> entry.getDate().isEqual(onOrAfterDate) || entry.getDate().isAfter(onOrAfterDate))
.sorted()
.distinct()
.collect(Collectors.toSet());
}
@Override
public Set<MultifactorAuthenticationTrustRecord> get(final String principal) {
return storage.asMap()
.values()
.stream()
.filter(entry -> entry.getPrincipal().equalsIgnoreCase(principal))
.sorted()
.distinct()
.collect(Collectors.toSet());
}
@Override
public MultifactorAuthenticationTrustRecord setInternal(final MultifactorAuthenticationTrustRecord record) {
this.storage.put(record.getKey(), record);
return record;
}
}