package org.apereo.cas.trusted.authentication.storage; import org.apereo.cas.trusted.authentication.api.MultifactorAuthenticationTrustRecord; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.client.RestTemplate; import java.time.LocalDate; import java.util.Collections; import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; /** * This is {@link RestMultifactorAuthenticationTrustStorage}. * * @author Misagh Moayyed * @since 5.0.0 */ public class RestMultifactorAuthenticationTrustStorage extends BaseMultifactorAuthenticationTrustStorage { private final String endpoint; public RestMultifactorAuthenticationTrustStorage(final String endpoint) { this.endpoint = endpoint; } @Override public Set<MultifactorAuthenticationTrustRecord> get(final String principal) { final String url = (!this.endpoint.endsWith("/") ? this.endpoint.concat("/") : this.endpoint).concat(principal); return getResults(url); } @Override public void expire(final LocalDate onOrBefore) { final RestTemplate restTemplate = new RestTemplate(); restTemplate.postForEntity(this.endpoint, onOrBefore, Object.class); } @Override public void expire(final String key) { final RestTemplate restTemplate = new RestTemplate(); restTemplate.postForEntity(this.endpoint, key, Object.class); } @Override public Set<MultifactorAuthenticationTrustRecord> get(final LocalDate onOrAfterDate) { final String url = (!this.endpoint.endsWith("/") ? this.endpoint.concat("/") : this.endpoint).concat(onOrAfterDate.toString()); return getResults(url); } @Override protected MultifactorAuthenticationTrustRecord setInternal(final MultifactorAuthenticationTrustRecord record) { final RestTemplate restTemplate = new RestTemplate(); final ResponseEntity<Object> response = restTemplate.postForEntity(this.endpoint, record, Object.class); if (response != null && response.getStatusCode() == HttpStatus.OK) { return record; } return null; } private static Set<MultifactorAuthenticationTrustRecord> getResults(final String url) { final RestTemplate restTemplate = new RestTemplate(); final ResponseEntity<MultifactorAuthenticationTrustRecord[]> responseEntity = restTemplate.getForEntity(url, MultifactorAuthenticationTrustRecord[].class); if (responseEntity.getStatusCode() == HttpStatus.OK) { final MultifactorAuthenticationTrustRecord[] results = responseEntity.getBody(); return Stream.of(results).collect(Collectors.toSet()); } return Collections.emptySet(); } }