package org.apereo.cas.adaptors.yubikey;
import org.apache.commons.lang3.StringUtils;
import org.apereo.cas.services.AbstractMultifactorAuthenticationProvider;
import org.apereo.cas.util.EncodingUtils;
import org.apereo.cas.util.http.HttpClient;
import org.apereo.cas.util.http.HttpMessage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.net.URL;
/**
* The authentication provider for yubikey.
*
* @author Misagh Moayyed
* @since 5.0.0
*/
public class YubiKeyMultifactorAuthenticationProvider extends AbstractMultifactorAuthenticationProvider {
private static final Logger LOGGER = LoggerFactory.getLogger(YubiKeyMultifactorAuthenticationProvider.class);
private static final long serialVersionUID = 4789727148634156909L;
private final YubiKeyAuthenticationHandler yubiKeyAuthenticationHandler;
private final HttpClient httpClient;
public YubiKeyMultifactorAuthenticationProvider(final YubiKeyAuthenticationHandler yubiKeyAuthenticationHandler,
final HttpClient httpClient) {
this.yubiKeyAuthenticationHandler = yubiKeyAuthenticationHandler;
this.httpClient = httpClient;
}
@Override
protected boolean isAvailable() {
try {
final String[] endpoints = this.yubiKeyAuthenticationHandler.getClient().getWsapiUrls();
for (final String endpoint : endpoints) {
LOGGER.debug("Pinging YubiKey API endpoint at [{}]", endpoint);
final HttpMessage msg = this.httpClient.sendMessageToEndPoint(new URL(endpoint));
final String message = msg != null ? msg.getMessage() : null;
if (StringUtils.isNotBlank(message)) {
final String response = EncodingUtils.urlDecode(message);
LOGGER.debug("Received YubiKey ping response [{}]", response);
return true;
}
}
} catch (final Exception e) {
LOGGER.warn(e.getMessage(), e);
}
return false;
}
}