package at.asitplus.eidas.specific.connector.health; import java.io.ByteArrayInputStream; import javax.xml.transform.TransformerFactoryConfigurationError; import org.apache.commons.lang3.StringUtils; import org.apache.http.StatusLine; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpUriRequest; import org.apache.http.client.utils.URIBuilder; import org.apache.http.entity.ContentType; import org.apache.http.impl.client.CloseableHttpClient; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.actuate.health.Health; import org.springframework.boot.actuate.health.HealthIndicator; import at.asitplus.eidas.specific.connector.MsEidasNodeConstants; import at.gv.egiz.eaaf.core.api.idp.IConfiguration; import at.gv.egiz.eaaf.core.impl.data.Triple; import at.gv.egiz.eaaf.core.impl.http.HttpUtils; import at.gv.egiz.eaaf.core.impl.http.IHttpClientFactory; import at.gv.egiz.eaaf.core.impl.utils.DomUtils; import lombok.extern.slf4j.Slf4j; @Slf4j public class EidasNodeMetadataHealthIndicator implements HealthIndicator { @Autowired IConfiguration config; @Autowired IHttpClientFactory httpClientFactory; @Override public Health health() { try { final String urlString = config.getBasicConfiguration( MsEidasNodeConstants.PROP_CONFIG_MONITORING_EIDASNODE_METADATAURL); if (StringUtils.isEmpty(urlString)) { log.trace("No eIDASNode metadata URL. Skipping test ... "); return Health.unknown().build(); } // create HTTP client CloseableHttpClient httpClient = httpClientFactory.getHttpClient(); URIBuilder uriBuilder = new URIBuilder(urlString); HttpUriRequest request = new HttpGet(uriBuilder.build()); final Triple respCode = httpClient.execute(request, HttpUtils.bodyStatusCodeResponseHandler()); if (respCode.getFirst().getStatusCode() != 200) { log.warn("Monitoring: Get http StatusCode: {} from eIDAS-Node Metadata endpoint", respCode.getFirst().getStatusCode()); return Health.down().withDetail("http StatusCode", respCode.getFirst().getStatusCode()).build(); } // parse metadata DomUtils.parseXmlNonValidating(respCode.getSecond()); return Health.up().build(); } catch (Exception | TransformerFactoryConfigurationError e) { log.warn("Monitoring: Can not read SAML2 metadata from eIDAS-Node", e); return Health.down().down(e).build(); } } }