package org.apereo.cas.web.report.config;
import com.codahale.metrics.MetricRegistry;
import com.codahale.metrics.health.HealthCheckRegistry;
import org.apache.commons.lang3.StringUtils;
import org.apereo.cas.CentralAuthenticationService;
import org.apereo.cas.audit.spi.DelegatingAuditTrailManager;
import org.apereo.cas.configuration.CasConfigurationProperties;
import org.apereo.cas.monitor.HealthStatus;
import org.apereo.cas.monitor.Monitor;
import org.apereo.cas.support.events.CasEventRepository;
import org.apereo.cas.ticket.registry.TicketRegistrySupport;
import org.apereo.cas.trusted.authentication.api.MultifactorAuthenticationTrustStorage;
import org.apereo.cas.web.report.AuthenticationEventsController;
import org.apereo.cas.web.report.ConfigurationStateController;
import org.apereo.cas.web.report.DashboardController;
import org.apereo.cas.web.report.HealthCheckController;
import org.apereo.cas.web.report.LoggingConfigController;
import org.apereo.cas.web.report.LoggingOutputSocketMessagingController;
import org.apereo.cas.web.report.MetricsController;
import org.apereo.cas.web.report.PersonDirectoryAttributeResolutionController;
import org.apereo.cas.web.report.SingleSignOnSessionStatusController;
import org.apereo.cas.web.report.SingleSignOnSessionsReportController;
import org.apereo.cas.web.report.SpringWebflowReportController;
import org.apereo.cas.web.report.StatisticsController;
import org.apereo.cas.web.report.TrustedDevicesController;
import org.apereo.cas.web.support.CookieRetrievingCookieGenerator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.actuate.endpoint.mvc.MvcEndpoint;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.web.ServerProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.AbstractWebSocketMessageBrokerConfigurer;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor;
/**
* This is {@link CasReportsConfiguration}.
*
* @author Misagh Moayyed
* @since 5.0.0
*/
@Configuration("casReportsConfiguration")
@EnableConfigurationProperties(CasConfigurationProperties.class)
@EnableWebSocketMessageBroker
public class CasReportsConfiguration extends AbstractWebSocketMessageBrokerConfigurer {
@Autowired
@Qualifier("defaultTicketRegistrySupport")
private TicketRegistrySupport ticketRegistrySupport;
@Autowired
@Qualifier("ticketGrantingTicketCookieGenerator")
private CookieRetrievingCookieGenerator ticketGrantingTicketCookieGenerator;
@Autowired
private CasConfigurationProperties casProperties;
@Autowired
private ServerProperties serverProperties;
@Autowired
@Qualifier("healthCheckMonitor")
private Monitor<HealthStatus> healthCheckMonitor;
@Autowired
@Qualifier("centralAuthenticationService")
private CentralAuthenticationService centralAuthenticationService;
@Autowired
@Qualifier("metrics")
private MetricRegistry metricsRegistry;
@Autowired
@Qualifier("healthCheckMetrics")
private HealthCheckRegistry healthCheckRegistry;
@Bean
@RefreshScope
public MvcEndpoint dashboardController() {
return new DashboardController(casProperties);
}
@Bean
@RefreshScope
public MvcEndpoint personDirectoryAttributeResolutionController() {
return new PersonDirectoryAttributeResolutionController(casProperties);
}
@Profile("standalone")
@ConditionalOnBean(name = "configurationPropertiesEnvironmentManager")
@Bean
@RefreshScope
public MvcEndpoint internalConfigController() {
return new ConfigurationStateController(casProperties);
}
@Bean
@RefreshScope
public MvcEndpoint healthCheckController() {
return new HealthCheckController(healthCheckMonitor, casProperties);
}
@Bean
@RefreshScope
public MvcEndpoint singleSignOnSessionsReportController() {
return new SingleSignOnSessionsReportController(centralAuthenticationService, casProperties);
}
@Bean
@RefreshScope
@Autowired
public MvcEndpoint loggingConfigController(@Qualifier("auditTrailManager") final DelegatingAuditTrailManager auditTrailManager) {
return new LoggingConfigController(auditTrailManager, casProperties);
}
@Bean
@RefreshScope
public MvcEndpoint ssoStatusController() {
return new SingleSignOnSessionStatusController(ticketGrantingTicketCookieGenerator, ticketRegistrySupport, casProperties);
}
@Bean
@RefreshScope
public MvcEndpoint swfReportController() {
return new SpringWebflowReportController(casProperties);
}
@Autowired
@Bean
@RefreshScope
public MvcEndpoint statisticsController(@Qualifier("auditTrailManager") final DelegatingAuditTrailManager auditTrailManager) {
return new StatisticsController(auditTrailManager, centralAuthenticationService,
metricsRegistry, healthCheckRegistry, casProperties);
}
@Bean
@RefreshScope
public MvcEndpoint metricsController() {
return new MetricsController(casProperties);
}
@Bean
@RefreshScope
public LoggingOutputSocketMessagingController loggingOutputController() {
return new LoggingOutputSocketMessagingController();
}
@Override
public void configureMessageBroker(final MessageBrokerRegistry config) {
config.enableSimpleBroker("/logs");
if (StringUtils.isNotBlank(serverProperties.getContextPath())) {
config.setApplicationDestinationPrefixes(serverProperties.getContextPath());
}
}
@Override
public void registerStompEndpoints(final StompEndpointRegistry registry) {
registry.addEndpoint("/logoutput")
.addInterceptors(new HttpSessionHandshakeInterceptor())
.withSockJS();
}
/**
* The Trusted devices configuration for the UI.
*/
@ConditionalOnClass(value = MultifactorAuthenticationTrustStorage.class)
@Configuration("trustedDevicesConfiguration")
public class TrustedDevicesConfiguration {
@Autowired
@Bean
public MvcEndpoint trustedDevicesController(@Qualifier("mfaTrustEngine") final MultifactorAuthenticationTrustStorage mfaTrustEngine) {
return new TrustedDevicesController(mfaTrustEngine, casProperties);
}
}
/**
* The type Authentication events configuration.
*/
@ConditionalOnClass(value = CasEventRepository.class)
@Configuration("authenticationEventsConfiguration")
public class AuthenticationEventsConfiguration {
@Autowired
@Bean
public MvcEndpoint authenticationEventsController(@Qualifier("casEventRepository") final CasEventRepository eventRepository) {
return new AuthenticationEventsController(eventRepository, casProperties);
}
}
}