package org.apereo.cas.web.report;
import org.apache.commons.lang3.BooleanUtils;
import org.apereo.cas.configuration.CasConfigurationProperties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.actuate.endpoint.AutoConfigurationReportEndpoint;
import org.springframework.boot.actuate.endpoint.BeansEndpoint;
import org.springframework.boot.actuate.endpoint.ConfigurationPropertiesReportEndpoint;
import org.springframework.boot.actuate.endpoint.DumpEndpoint;
import org.springframework.boot.actuate.endpoint.EndpointProperties;
import org.springframework.boot.actuate.endpoint.EnvironmentEndpoint;
import org.springframework.boot.actuate.endpoint.HealthEndpoint;
import org.springframework.boot.actuate.endpoint.InfoEndpoint;
import org.springframework.boot.actuate.endpoint.RequestMappingEndpoint;
import org.springframework.boot.actuate.endpoint.ShutdownEndpoint;
import org.springframework.boot.actuate.endpoint.TraceEndpoint;
import org.springframework.cloud.context.restart.RestartEndpoint;
import org.springframework.context.ApplicationContext;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.Map;
/**
* This is {@link DashboardController}.
*
* @author Misagh Moayyed
* @since 5.0.0
*/
public class DashboardController extends BaseCasMvcEndpoint {
@Autowired
private RestartEndpoint restartEndpoint;
@Autowired
private ShutdownEndpoint shutdownEndpoint;
@Autowired
private EndpointProperties endpointProperties;
@Autowired
private InfoEndpoint infoEndpoint;
@Autowired
private AutoConfigurationReportEndpoint autoConfigurationReportEndpoint;
@Autowired
private BeansEndpoint beansEndpoint;
@Autowired
private DumpEndpoint dumpEndpoint;
@Autowired
private ConfigurationPropertiesReportEndpoint configPropertiesEndpoint;
@Autowired
private RequestMappingEndpoint requestMappingEndpoint;
@Autowired
private HealthEndpoint healthEndpoint;
@Autowired
private TraceEndpoint traceEndpoint;
@Autowired
private EnvironmentEndpoint environmentEndpoint;
@Autowired
private ApplicationContext applicationContext;
private CasConfigurationProperties casProperties;
public DashboardController(final CasConfigurationProperties casProperties) {
super("casdashboard", "/dashboard", casProperties.getMonitor().getEndpoints().getDashboard(), casProperties);
this.casProperties = casProperties;
}
/**
* Handle request internal model and view.
*
* @param request the request
* @param response the response
* @return the model and view
* @throws Exception the exception
*/
@GetMapping
public ModelAndView handle(final HttpServletRequest request, final HttpServletResponse response) throws Exception {
ensureEndpointAccessIsAuthorized(request, response);
final Map<String, Object> model = new HashMap<>();
model.put("restartEndpointEnabled", restartEndpoint.isEnabled() && endpointProperties.getEnabled());
model.put("environmentEndpointEnabled", environmentEndpoint.isEnabled() && endpointProperties.getEnabled());
model.put("shutdownEndpointEnabled", shutdownEndpoint.isEnabled() && endpointProperties.getEnabled());
model.put("serverFunctionsEnabled", (Boolean) model.get("restartEndpointEnabled") || (Boolean) model.get("shutdownEndpointEnabled"));
model.put("autoConfigurationEndpointEnabled", autoConfigurationReportEndpoint.isEnabled());
model.put("beansEndpointEnabled", beansEndpoint.isEnabled());
model.put("mappingsEndpointEnabled", requestMappingEndpoint.isEnabled());
model.put("configPropsEndpointEnabled", configPropertiesEndpoint.isEnabled());
model.put("dumpEndpointEnabled", dumpEndpoint.isEnabled());
model.put("infoEndpointEnabled", infoEndpoint.isEnabled());
model.put("healthEndpointEnabled", healthEndpoint.isEnabled());
model.put("traceEndpointEnabled", healthEndpoint.isEnabled());
model.put("trustedDevicesEnabled", this.applicationContext.containsBean("trustedDevicesController")
&& isEndpointCapable(casProperties.getMonitor().getEndpoints().getTrustedDevices(), casProperties));
model.put("authenticationEventsRepositoryEnabled", this.applicationContext.containsBean("casEventRepository")
&& isEndpointCapable(casProperties.getMonitor().getEndpoints().getAuthenticationEvents(), casProperties));
model.put("singleSignOnReportEnabled",
isEndpointCapable(casProperties.getMonitor().getEndpoints().getSingleSignOnReport(), casProperties));
model.put("statisticsEndpointEnabled",
isEndpointCapable(casProperties.getMonitor().getEndpoints().getStatistics(), casProperties));
model.put("singleSignOnStatusEndpointEnabled",
isEndpointCapable(casProperties.getMonitor().getEndpoints().getSingleSignOnReport(), casProperties));
model.put("springWebflowEndpointEnabled",
isEndpointCapable(casProperties.getMonitor().getEndpoints().getSpringWebflowReport(), casProperties));
model.put("auditLogEndpointEnabled",
isEndpointCapable(casProperties.getMonitor().getEndpoints().getAuditEvents(), casProperties));
model.put("configurationStateEnabled",
isEndpointCapable(casProperties.getMonitor().getEndpoints().getConfigurationState(), casProperties));
model.put("healthcheckEndpointEnabled",
isEndpointCapable(casProperties.getMonitor().getEndpoints().getHealthCheck(), casProperties));
model.put("metricsEndpointEnabled",
isEndpointCapable(casProperties.getMonitor().getEndpoints().getMetrics(), casProperties));
model.put("attributeResolutionEndpointEnabled",
isEndpointCapable(casProperties.getMonitor().getEndpoints().getAttributeResolution(), casProperties));
final boolean endpointAvailable = model.entrySet().stream()
.anyMatch(e -> e.getKey().endsWith("Enabled") && BooleanUtils.toBoolean(e.getValue().toString()));
model.put("dashboardEndpointsEnabled", endpointAvailable);
model.put("actuatorEndpointsEnabled", casProperties.getAdminPagesSecurity().isActuatorEndpointsEnabled());
return new ModelAndView("monitoring/viewDashboard", model);
}
}