package org.apereo.cas.support.saml.web.idp.metadata;
import org.apache.commons.io.FileUtils;
import org.apereo.cas.support.saml.SamlIdPConstants;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import javax.annotation.PostConstruct;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.nio.charset.StandardCharsets;
/**
* The {@link SamlMetadataController} will attempt
* to produce saml metadata for CAS as an identity provider.
*
* @author Misagh Moayyed
* @since 5.0.0
*/
@Controller("samlMetadataController")
public class SamlMetadataController {
private static final String CONTENT_TYPE = "text/xml;charset=UTF-8";
private static final Logger LOGGER = LoggerFactory.getLogger(SamlMetadataController.class);
private final SamlIdpMetadataAndCertificatesGenerationService metadataAndCertificatesGenerationService;
/**
* Instantiates a new Saml metadata controller.
* Required for bean initialization.
*
* @param metadataAndCertificatesGenerationService the metadata and certificates generation service
*/
public SamlMetadataController(final SamlIdpMetadataAndCertificatesGenerationService metadataAndCertificatesGenerationService) {
this.metadataAndCertificatesGenerationService = metadataAndCertificatesGenerationService;
}
/**
* Post constructor placeholder for additional
* extensions. This method is called after
* the object has completely initialized itself.
*/
@PostConstruct
public void postConstruct() {
this.metadataAndCertificatesGenerationService.performGenerationSteps();
}
/**
* Displays the identity provider metadata.
* Checks to make sure metadata exists, and if not, generates it first.
*
* @param response servlet response
* @throws IOException the iO exception
*/
@GetMapping(path = SamlIdPConstants.ENDPOINT_IDP_METADATA)
public void generateMetadataForIdp(final HttpServletResponse response) throws IOException {
final File metadataFile = this.metadataAndCertificatesGenerationService.performGenerationSteps();
final String contents = FileUtils.readFileToString(metadataFile, StandardCharsets.UTF_8);
response.setContentType(CONTENT_TYPE);
response.setStatus(HttpServletResponse.SC_OK);
try (PrintWriter writer = response.getWriter()) {
LOGGER.debug("Producing metadata for the response");
writer.write(contents);
writer.flush();
}
}
}