Merge branch '1.5.x'
This commit is contained in:
@@ -93,6 +93,7 @@ public class CacheStatisticsAutoConfiguration {
|
||||
public HazelcastCacheStatisticsProvider hazelcastCacheStatisticsProvider() {
|
||||
return new HazelcastCacheStatisticsProvider();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Configuration
|
||||
|
||||
@@ -83,4 +83,5 @@ public class EndpointMBeanExportProperties {
|
||||
public void setStaticNames(String[] staticNames) {
|
||||
this.staticNames = StringUtils.splitArrayElementsIntoProperties(staticNames, "=");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -266,6 +266,7 @@ public class EndpointWebMvcAutoConfiguration
|
||||
@Conditional(OnManagementMvcCondition.class)
|
||||
@Import(ManagementContextConfigurationsImportSelector.class)
|
||||
protected static class EndpointWebMvcConfiguration {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -43,4 +43,5 @@ public class JolokiaProperties {
|
||||
public void setConfig(Map<String, String> config) {
|
||||
this.config = config;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -126,6 +126,7 @@ public class ManagementWebSecurityAutoConfiguration {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Configuration
|
||||
@@ -158,6 +159,7 @@ public class ManagementWebSecurityAutoConfiguration {
|
||||
@Conditional(WebSecurityEnablerCondition.class)
|
||||
@EnableWebSecurity
|
||||
protected static class WebSecurityEnabler extends AuthenticationManagerConfiguration {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -67,7 +67,6 @@ import org.springframework.messaging.MessageChannel;
|
||||
* @see MetricWriter
|
||||
* @see InMemoryMetricRepository
|
||||
* @see Exporter
|
||||
*
|
||||
* @author Dave Syer
|
||||
*/
|
||||
@Configuration
|
||||
@@ -108,6 +107,7 @@ public class MetricRepositoryAutoConfiguration {
|
||||
public BufferGaugeService gaugeService(GaugeBuffers writer) {
|
||||
return new BufferGaugeService(writer);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -145,7 +145,8 @@ final class MetricsFilter extends OncePerRequestFilter {
|
||||
suffix);
|
||||
}
|
||||
|
||||
private String determineMetricNameSuffix(HttpServletRequest request, String path, int status) {
|
||||
private String determineMetricNameSuffix(HttpServletRequest request, String path,
|
||||
int status) {
|
||||
Object bestMatchingPattern = request
|
||||
.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE);
|
||||
if (bestMatchingPattern != null) {
|
||||
|
||||
@@ -101,7 +101,6 @@ public class CloudFoundryActuatorAutoConfiguration {
|
||||
|
||||
/**
|
||||
* Nested configuration for ignored requests if Spring Security is present.
|
||||
*
|
||||
*/
|
||||
@ConditionalOnClass(WebSecurity.class)
|
||||
static class CloudFoundryIgnoredRequestConfiguration {
|
||||
|
||||
@@ -59,4 +59,5 @@ public class BeansEndpoint extends AbstractEndpoint<List<Object>>
|
||||
public List<Object> invoke() {
|
||||
return this.parser.parseList(this.liveBeansView.getSnapshotAsJson());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -332,6 +332,7 @@ public class ConfigurationPropertiesReportEndpoint
|
||||
}
|
||||
return setter;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -93,4 +93,5 @@ public class HealthEndpoint extends AbstractEndpoint<Health> {
|
||||
}
|
||||
return name;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -47,4 +47,5 @@ public class TraceEndpoint extends AbstractEndpoint<List<Trace>> {
|
||||
public List<Trace> invoke() {
|
||||
return this.repository.findAll();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -47,4 +47,5 @@ public class ShutdownEndpointMBean extends EndpointMBean {
|
||||
public Object shutdown() {
|
||||
return convert(getEndpoint().invoke());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -58,4 +58,5 @@ public class HalJsonMvcEndpoint extends AbstractNamedMvcEndpoint {
|
||||
protected final ManagementServletContext getManagementServletContext() {
|
||||
return this.managementServletContext;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -45,8 +45,8 @@ import org.springframework.web.util.UrlPathHelper;
|
||||
*/
|
||||
@ConfigurationProperties(prefix = "endpoints.jolokia", ignoreUnknownFields = false)
|
||||
@HypermediaDisabled
|
||||
public class JolokiaMvcEndpoint extends AbstractNamedMvcEndpoint
|
||||
implements InitializingBean, ApplicationContextAware, ServletContextAware, DisposableBean {
|
||||
public class JolokiaMvcEndpoint extends AbstractNamedMvcEndpoint implements
|
||||
InitializingBean, ApplicationContextAware, ServletContextAware, DisposableBean {
|
||||
|
||||
private final ServletWrappingController controller = new ServletWrappingController();
|
||||
|
||||
@@ -116,6 +116,7 @@ public class JolokiaMvcEndpoint extends AbstractNamedMvcEndpoint
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -49,4 +49,5 @@ public class ShutdownMvcEndpoint extends EndpointMvcAdapter {
|
||||
}
|
||||
return super.invoke();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -50,4 +50,5 @@ public abstract class AbstractHealthIndicator implements HealthIndicator {
|
||||
* system status.
|
||||
*/
|
||||
protected abstract void doHealthCheck(Health.Builder builder) throws Exception;
|
||||
|
||||
}
|
||||
|
||||
@@ -61,4 +61,5 @@ public class DiskSpaceHealthIndicator extends AbstractHealthIndicator {
|
||||
.withDetail("free", diskFreeInBytes)
|
||||
.withDetail("threshold", this.properties.getThreshold());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -299,6 +299,7 @@ public final class Health {
|
||||
public Health build() {
|
||||
return new Health(this);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -42,4 +42,5 @@ public interface HealthAggregator {
|
||||
* @return the aggregated health
|
||||
*/
|
||||
Health aggregate(Map<String, Health> healths);
|
||||
|
||||
}
|
||||
|
||||
@@ -167,6 +167,7 @@ public class DropwizardMetricServices implements CounterService, GaugeService {
|
||||
public void setValue(double value) {
|
||||
this.value = value;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -240,4 +240,5 @@ public class MetricCopyExporter extends AbstractMetricExporter {
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
@@ -90,7 +90,6 @@ public class OpenTsdbGaugeWriter implements GaugeWriter {
|
||||
/**
|
||||
* Creates a new {@code OpenTsdbGaugeWriter} with the given millisecond
|
||||
* {@code connectTimeout} and {@code readTimeout}.
|
||||
*
|
||||
* @param connectTimeout the connect timeout in milliseconds
|
||||
* @param readTimeout the read timeout in milliseconds
|
||||
*/
|
||||
|
||||
@@ -58,7 +58,6 @@ public class RedisMetricRepository implements MetricRepository {
|
||||
* Create a RedisMetricRepository with a default prefix to apply to all metric names.
|
||||
* If multiple repositories share a redis instance they will feed into the same global
|
||||
* metrics.
|
||||
*
|
||||
* @param redisConnectionFactory the redis connection factory
|
||||
*/
|
||||
public RedisMetricRepository(RedisConnectionFactory redisConnectionFactory) {
|
||||
@@ -70,7 +69,6 @@ public class RedisMetricRepository implements MetricRepository {
|
||||
* unique to this repository or to a logical repository contributed to by multiple
|
||||
* instances, where they all see the same values). Recommended constructor for general
|
||||
* purpose use.
|
||||
*
|
||||
* @param redisConnectionFactory the redis connection factory
|
||||
* @param prefix the prefix to set for all metrics keys
|
||||
*/
|
||||
@@ -84,7 +82,6 @@ public class RedisMetricRepository implements MetricRepository {
|
||||
* redis store will hold a zset under the key just so the metric names can be
|
||||
* enumerated. Read operations, especially {@link #findAll()} and {@link #count()},
|
||||
* will only be accurate if the key is unique to the prefix of this repository.
|
||||
*
|
||||
* @param redisConnectionFactory the redis connection factory
|
||||
* @param prefix the prefix to set for all metrics keys
|
||||
* @param key the key to set
|
||||
|
||||
@@ -51,4 +51,5 @@ final class RedisUtils {
|
||||
RedisConnectionFactory redisConnectionFactory) {
|
||||
return new StringRedisTemplate(redisConnectionFactory);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -78,4 +78,5 @@ public class InMemoryRichGaugeRepository implements RichGaugeRepository {
|
||||
public long count() {
|
||||
return this.repository.count();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -99,6 +99,7 @@ public class SimpleInMemoryRepository<T> {
|
||||
|
||||
/**
|
||||
* Callback used to update a value.
|
||||
*
|
||||
* @param <T> the value type
|
||||
*/
|
||||
public interface Callback<T> {
|
||||
|
||||
@@ -64,8 +64,8 @@ public class AuthorizationAuditListener extends AbstractAuthorizationAuditListen
|
||||
if (event.getAuthentication().getDetails() != null) {
|
||||
data.put("details", event.getAuthentication().getDetails());
|
||||
}
|
||||
publish(new AuditEvent(event.getAuthentication().getName(),
|
||||
AUTHORIZATION_FAILURE, data));
|
||||
publish(new AuditEvent(event.getAuthentication().getName(), AUTHORIZATION_FAILURE,
|
||||
data));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -101,6 +101,7 @@ public class AuditAutoConfigurationTests {
|
||||
}
|
||||
|
||||
public static class TestAuditEventRepository extends InMemoryAuditEventRepository {
|
||||
|
||||
}
|
||||
|
||||
@Configuration
|
||||
|
||||
@@ -558,6 +558,7 @@ public class HealthIndicatorAutoConfigurationTests {
|
||||
public JestClient jestClient() {
|
||||
return mock(JestClient.class);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -274,11 +274,13 @@ public class ManagementWebSecurityAutoConfigurationTests {
|
||||
@EnableGlobalAuthentication
|
||||
@Configuration
|
||||
static class AuthenticationConfig {
|
||||
|
||||
@Autowired
|
||||
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
|
||||
auth.inMemoryAuthentication().withUser("user").password("password")
|
||||
.roles("USER");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Configuration
|
||||
|
||||
@@ -279,6 +279,7 @@ public class PublicMetricsAutoConfigurationTests {
|
||||
public DataSource commonsDbcpDataSource() {
|
||||
return InitializedBuilder.create().type(BasicDataSource.class).build();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Configuration
|
||||
@@ -295,6 +296,7 @@ public class PublicMetricsAutoConfigurationTests {
|
||||
public DataSource commonsDbcpDataSource() {
|
||||
return InitializedBuilder.create().type(BasicDataSource.class).build();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Configuration
|
||||
@@ -311,6 +313,7 @@ public class PublicMetricsAutoConfigurationTests {
|
||||
public DataSource dataSource() {
|
||||
return InitializedBuilder.create().type(BasicDataSource.class).build();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Configuration
|
||||
@@ -326,6 +329,7 @@ public class PublicMetricsAutoConfigurationTests {
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Configuration
|
||||
@@ -386,4 +390,5 @@ public class PublicMetricsAutoConfigurationTests {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -84,6 +84,7 @@ public class AutoConfigurationReportEndpointTests
|
||||
public AutoConfigurationReportEndpoint endpoint() {
|
||||
return new AutoConfigurationReportEndpoint();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -87,10 +87,12 @@ public class ConfigurationPropertiesReportEndpointParentTests {
|
||||
@Configuration
|
||||
@EnableConfigurationProperties
|
||||
public static class Parent {
|
||||
|
||||
@Bean
|
||||
public TestProperties testProperties() {
|
||||
return new TestProperties();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Configuration
|
||||
@@ -127,6 +129,7 @@ public class ConfigurationPropertiesReportEndpointParentTests {
|
||||
}
|
||||
|
||||
public static class OtherProperties {
|
||||
|
||||
}
|
||||
|
||||
@ConfigurationProperties(prefix = "test")
|
||||
@@ -143,4 +146,5 @@ public class ConfigurationPropertiesReportEndpointParentTests {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -318,6 +318,7 @@ public class ConfigurationPropertiesReportEndpointSerializationTests {
|
||||
}
|
||||
|
||||
public static class Bar {
|
||||
|
||||
private String name = "123456";
|
||||
|
||||
public String getName() {
|
||||
@@ -327,6 +328,7 @@ public class ConfigurationPropertiesReportEndpointSerializationTests {
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -186,10 +186,12 @@ public class ConfigurationPropertiesReportEndpointTests
|
||||
@Configuration
|
||||
@EnableConfigurationProperties
|
||||
public static class Parent {
|
||||
|
||||
@Bean
|
||||
public TestProperties testProperties() {
|
||||
return new TestProperties();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Configuration
|
||||
@@ -281,4 +283,5 @@ public class ConfigurationPropertiesReportEndpointTests
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -54,4 +54,5 @@ public class DumpEndpointTests extends AbstractEndpointTests<DumpEndpoint> {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -204,4 +204,5 @@ public class EnvironmentEndpointTests extends AbstractEndpointTests<EnvironmentE
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -74,5 +74,7 @@ public class HealthEndpointTests extends AbstractEndpointTests<HealthEndpoint> {
|
||||
public HealthAggregator healthAggregator() {
|
||||
return new OrderedHealthAggregator();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -111,4 +111,5 @@ public class MetricsEndpointTests extends AbstractEndpointTests<MetricsEndpoint>
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -126,6 +126,7 @@ public class RequestMappingEndpointTests {
|
||||
|
||||
@Configuration
|
||||
protected static class MappingConfiguration {
|
||||
|
||||
@Bean
|
||||
@Lazy
|
||||
@Scope(proxyMode = ScopedProxyMode.TARGET_CLASS)
|
||||
@@ -134,5 +135,7 @@ public class RequestMappingEndpointTests {
|
||||
mapping.setUrlMap(Collections.singletonMap("/foo", new Object()));
|
||||
return mapping;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -102,4 +102,5 @@ public class ShutdownEndpointTests extends AbstractEndpointTests<ShutdownEndpoin
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -96,9 +96,12 @@ public class ShutdownParentEndpointTests {
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Configuration
|
||||
public static class Empty {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -56,5 +56,7 @@ public class TraceEndpointTests extends AbstractEndpointTests<TraceEndpoint> {
|
||||
repository.add(Collections.<String, Object>singletonMap("a", "b"));
|
||||
return new TraceEndpoint(repository);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -269,8 +269,8 @@ public class EndpointMBeanExporterTests {
|
||||
MBeanExporter mbeanExporter = registerLoggersEndpoint();
|
||||
Object response = mbeanExporter.getServer().invoke(
|
||||
getObjectName("loggersEndpoint", this.context), "setLogLevel",
|
||||
new Object[]{"com.example", "trace"},
|
||||
new String[]{String.class.getName(), String.class.getName()});
|
||||
new Object[] { "com.example", "trace" },
|
||||
new String[] { String.class.getName(), String.class.getName() });
|
||||
assertThat(response).isNull();
|
||||
}
|
||||
|
||||
@@ -280,10 +280,9 @@ public class EndpointMBeanExporterTests {
|
||||
this.thrown.expect(MBeanException.class);
|
||||
this.thrown.expectCause(hasMessage(containsString("No enum constant")));
|
||||
this.thrown.expectCause(hasMessage(containsString("LogLevel.INVALID")));
|
||||
mbeanExporter.getServer().invoke(
|
||||
getObjectName("loggersEndpoint", this.context), "setLogLevel",
|
||||
new Object[]{"com.example", "invalid"},
|
||||
new String[]{String.class.getName(), String.class.getName()});
|
||||
mbeanExporter.getServer().invoke(getObjectName("loggersEndpoint", this.context),
|
||||
"setLogLevel", new Object[] { "com.example", "invalid" },
|
||||
new String[] { String.class.getName(), String.class.getName() });
|
||||
}
|
||||
|
||||
private MBeanExporter registerLoggersEndpoint() {
|
||||
|
||||
@@ -90,14 +90,17 @@ public class JolokiaMvcEndpointContextPathTests {
|
||||
EndpointWebMvcAutoConfiguration.class, JolokiaAutoConfiguration.class,
|
||||
ManagementServerPropertiesAutoConfiguration.class })
|
||||
public static class Config {
|
||||
|
||||
}
|
||||
|
||||
public static class ContextPathListener
|
||||
implements ApplicationContextInitializer<ConfigurableApplicationContext> {
|
||||
|
||||
@Override
|
||||
public void initialize(ConfigurableApplicationContext context) {
|
||||
EnvironmentTestUtils.addEnvironment(context, "management.contextPath:/admin");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -101,6 +101,7 @@ public class MvcEndpointsTests {
|
||||
public String invoke() {
|
||||
return "foo";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private static class TestMvcEndpoint extends EndpointMvcAdapter {
|
||||
@@ -108,6 +109,7 @@ public class MvcEndpointsTests {
|
||||
TestMvcEndpoint(Endpoint<?> delegate) {
|
||||
super(delegate);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private static class OtherTestMvcEndpoint extends EndpointMvcAdapter {
|
||||
@@ -115,6 +117,7 @@ public class MvcEndpointsTests {
|
||||
OtherTestMvcEndpoint(Endpoint<?> delegate) {
|
||||
super(delegate);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -235,4 +235,5 @@ public class ElasticsearchHealthIndicatorTests {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -33,6 +33,7 @@ import static org.assertj.core.api.Assertions.assertThat;
|
||||
public class DropwizardMetricServicesTests {
|
||||
|
||||
private final MetricRegistry registry = new MetricRegistry();
|
||||
|
||||
private final DropwizardMetricServices writer = new DropwizardMetricServices(
|
||||
this.registry);
|
||||
|
||||
@@ -89,7 +90,6 @@ public class DropwizardMetricServicesTests {
|
||||
* thread is updating the same set of metrics. This would be an example case of the
|
||||
* writer being used with the MetricsFilter handling several requests/sec to the same
|
||||
* URL.
|
||||
*
|
||||
* @throws Exception if an error occurs
|
||||
*/
|
||||
@Test
|
||||
|
||||
@@ -53,10 +53,12 @@ public class SpringIntegrationMetricReaderTests {
|
||||
@Configuration
|
||||
@Import({ JmxAutoConfiguration.class, IntegrationAutoConfiguration.class })
|
||||
protected static class TestConfiguration {
|
||||
|
||||
@Bean
|
||||
public SpringIntegrationMetricReader reader(IntegrationMBeanExporter exporter) {
|
||||
return new SpringIntegrationMetricReader(exporter);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -32,9 +32,12 @@ import static org.assertj.core.api.Assertions.assertThat;
|
||||
public class MultiMetricRichGaugeReaderTests {
|
||||
|
||||
private InMemoryMetricRepository repository = new InMemoryMetricRepository();
|
||||
|
||||
private MultiMetricRichGaugeReader reader = new MultiMetricRichGaugeReader(
|
||||
this.repository);
|
||||
|
||||
private InMemoryRichGaugeRepository data = new InMemoryRichGaugeRepository();
|
||||
|
||||
private RichGaugeExporter exporter = new RichGaugeExporter(this.data,
|
||||
this.repository);
|
||||
|
||||
|
||||
@@ -86,8 +86,8 @@ public class AuthenticationAuditListenerTests {
|
||||
AuditApplicationEvent event = handleAuthenticationEvent(
|
||||
new AuthenticationSwitchUserEvent(
|
||||
new UsernamePasswordAuthenticationToken("user", "password"),
|
||||
new User("user", "password",
|
||||
AuthorityUtils.commaSeparatedStringToAuthorityList("USER"))));
|
||||
new User("user", "password", AuthorityUtils
|
||||
.commaSeparatedStringToAuthorityList("USER"))));
|
||||
assertThat(event.getAuditEvent().getType())
|
||||
.isEqualTo(AuthenticationAuditListener.AUTHENTICATION_SWITCH);
|
||||
}
|
||||
@@ -98,12 +98,12 @@ public class AuthenticationAuditListenerTests {
|
||||
UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(
|
||||
"user", "password");
|
||||
authentication.setDetails(details);
|
||||
AuditApplicationEvent event = handleAuthenticationEvent(new AuthenticationFailureExpiredEvent(
|
||||
authentication, new BadCredentialsException("Bad user")));
|
||||
AuditApplicationEvent event = handleAuthenticationEvent(
|
||||
new AuthenticationFailureExpiredEvent(authentication,
|
||||
new BadCredentialsException("Bad user")));
|
||||
assertThat(event.getAuditEvent().getType())
|
||||
.isEqualTo(AuthenticationAuditListener.AUTHENTICATION_FAILURE);
|
||||
assertThat(event.getAuditEvent().getData())
|
||||
.containsEntry("details", details);
|
||||
assertThat(event.getAuditEvent().getData()).containsEntry("details", details);
|
||||
}
|
||||
|
||||
private AuditApplicationEvent handleAuthenticationEvent(
|
||||
|
||||
@@ -56,7 +56,8 @@ public class AuthorizationAuditListenerTests {
|
||||
public void testAuthenticationCredentialsNotFound() {
|
||||
AuditApplicationEvent event = handleAuthorizationEvent(
|
||||
new AuthenticationCredentialsNotFoundEvent(this,
|
||||
Collections.<ConfigAttribute>singletonList(new SecurityConfig("USER")),
|
||||
Collections.<ConfigAttribute>singletonList(
|
||||
new SecurityConfig("USER")),
|
||||
new AuthenticationCredentialsNotFoundException("Bad user")));
|
||||
assertThat(event.getAuditEvent().getType())
|
||||
.isEqualTo(AuthenticationAuditListener.AUTHENTICATION_FAILURE);
|
||||
@@ -66,7 +67,8 @@ public class AuthorizationAuditListenerTests {
|
||||
public void testAuthorizationFailure() {
|
||||
AuditApplicationEvent event = handleAuthorizationEvent(
|
||||
new AuthorizationFailureEvent(this,
|
||||
Collections.<ConfigAttribute>singletonList(new SecurityConfig("USER")),
|
||||
Collections.<ConfigAttribute>singletonList(
|
||||
new SecurityConfig("USER")),
|
||||
new UsernamePasswordAuthenticationToken("user", "password"),
|
||||
new AccessDeniedException("Bad user")));
|
||||
assertThat(event.getAuditEvent().getType())
|
||||
@@ -81,7 +83,8 @@ public class AuthorizationAuditListenerTests {
|
||||
authentication.setDetails(details);
|
||||
AuditApplicationEvent event = handleAuthorizationEvent(
|
||||
new AuthorizationFailureEvent(this,
|
||||
Collections.<ConfigAttribute>singletonList(new SecurityConfig("USER")),
|
||||
Collections.<ConfigAttribute>singletonList(
|
||||
new SecurityConfig("USER")),
|
||||
authentication, new AccessDeniedException("Bad user")));
|
||||
assertThat(event.getAuditEvent().getType())
|
||||
.isEqualTo(AuthorizationAuditListener.AUTHORIZATION_FAILURE);
|
||||
|
||||
@@ -95,4 +95,5 @@ public abstract class AbstractDependsOnBeanFactoryPostProcessor
|
||||
throw ex;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -127,6 +127,7 @@ class AutoConfigurationSorter {
|
||||
}
|
||||
return rtn;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private static class AutoConfigurationClass {
|
||||
|
||||
@@ -71,6 +71,7 @@ import org.springframework.retry.support.RetryTemplate;
|
||||
* <li>{@literal spring.rabbitmq.virtualHost} is used to specify the (optional) virtual
|
||||
* host to which the client should connect.</li>
|
||||
* </ul>
|
||||
*
|
||||
* @author Greg Turnquist
|
||||
* @author Josh Long
|
||||
* @author Stephane Nicoll
|
||||
|
||||
@@ -47,12 +47,14 @@ public class AopAutoConfiguration {
|
||||
@EnableAspectJAutoProxy(proxyTargetClass = false)
|
||||
@ConditionalOnProperty(prefix = "spring.aop", name = "proxy-target-class", havingValue = "false", matchIfMissing = true)
|
||||
public static class JdkDynamicAutoProxyConfiguration {
|
||||
|
||||
}
|
||||
|
||||
@Configuration
|
||||
@EnableAspectJAutoProxy(proxyTargetClass = true)
|
||||
@ConditionalOnProperty(prefix = "spring.aop", name = "proxy-target-class", havingValue = "true", matchIfMissing = false)
|
||||
public static class CglibAutoProxyConfiguration {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -111,4 +111,5 @@ public class BatchProperties {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -101,6 +101,7 @@ public class CacheAutoConfiguration {
|
||||
* instantiation.
|
||||
*/
|
||||
static class CacheManagerValidatorPostProcessor implements BeanFactoryPostProcessor {
|
||||
|
||||
@Override
|
||||
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)
|
||||
throws BeansException {
|
||||
@@ -120,6 +121,7 @@ public class CacheAutoConfiguration {
|
||||
result[result.length - 1] = value;
|
||||
return result;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -141,6 +143,7 @@ public class CacheAutoConfiguration {
|
||||
+ "be auto-configured, check your configuration (caching "
|
||||
+ "type is '" + this.cacheProperties.getType() + "')");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -67,6 +67,7 @@ abstract class HazelcastInstanceConfiguration {
|
||||
existingHazelcastInstance);
|
||||
return this.customizers.customize(cacheManager);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Configuration
|
||||
|
||||
@@ -159,10 +159,12 @@ class JCacheCacheConfiguration {
|
||||
|
||||
@Conditional(JCacheProviderAvailableCondition.class)
|
||||
static class JCacheProvider {
|
||||
|
||||
}
|
||||
|
||||
@ConditionalOnSingleCandidate(CacheManager.class)
|
||||
static class CustomJCacheCacheManager {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -264,6 +264,7 @@ public final class ConditionEvaluationReport {
|
||||
public String toString() {
|
||||
return this.condition.getClass() + " " + this.outcome;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
private static class AncestorsMatchedCondition implements Condition {
|
||||
|
||||
@@ -228,8 +228,8 @@ public final class ConditionMessage {
|
||||
|
||||
/**
|
||||
* Indicate that one or more results were found. For example
|
||||
* {@code found("bean", "beans").items("x", "y")} results in the message
|
||||
* "found beans x, y".
|
||||
* {@code found("bean", "beans").items("x", "y")} results in the message "found
|
||||
* beans x, y".
|
||||
* @param singular the article found in singular form
|
||||
* @param plural the article found in plural form
|
||||
* @return an {@link ItemsBuilder}
|
||||
@@ -240,8 +240,8 @@ public final class ConditionMessage {
|
||||
|
||||
/**
|
||||
* Indicate that one or more results were not found. For example
|
||||
* {@code didNotFind("bean").items("x")} results in the message
|
||||
* "did not find bean x".
|
||||
* {@code didNotFind("bean").items("x")} results in the message "did not find bean
|
||||
* x".
|
||||
* @param article the article found
|
||||
* @return an {@link ItemsBuilder}
|
||||
*/
|
||||
@@ -251,8 +251,8 @@ public final class ConditionMessage {
|
||||
|
||||
/**
|
||||
* Indicate that one or more results were found. For example
|
||||
* {@code didNotFind("bean", "beans").items("x", "y")} results in the message
|
||||
* "did not find beans x, y".
|
||||
* {@code didNotFind("bean", "beans").items("x", "y")} results in the message "did
|
||||
* not find beans x, y".
|
||||
* @param singular the article found in singular form
|
||||
* @param plural the article found in plural form
|
||||
* @return an {@link ItemsBuilder}
|
||||
@@ -330,8 +330,8 @@ public final class ConditionMessage {
|
||||
|
||||
/**
|
||||
* Used when no items are available. For example
|
||||
* {@code didNotFind("any beans").atAll()} results in the message
|
||||
* "did not find any beans".
|
||||
* {@code didNotFind("any beans").atAll()} results in the message "did not find
|
||||
* any beans".
|
||||
* @return a built {@link ConditionMessage}
|
||||
*/
|
||||
public ConditionMessage atAll() {
|
||||
@@ -340,8 +340,8 @@ public final class ConditionMessage {
|
||||
|
||||
/**
|
||||
* Indicate the items. For example
|
||||
* {@code didNotFind("bean", "beans").items("x", "y")} results in the message
|
||||
* "did not find beans x, y".
|
||||
* {@code didNotFind("bean", "beans").items("x", "y")} results in the message "did
|
||||
* not find beans x, y".
|
||||
* @param items the items (may be {@code null})
|
||||
* @return a built {@link ConditionMessage}
|
||||
*/
|
||||
@@ -351,8 +351,8 @@ public final class ConditionMessage {
|
||||
|
||||
/**
|
||||
* Indicate the items. For example
|
||||
* {@code didNotFind("bean", "beans").items("x", "y")} results in the message
|
||||
* "did not find beans x, y".
|
||||
* {@code didNotFind("bean", "beans").items("x", "y")} results in the message "did
|
||||
* not find beans x, y".
|
||||
* @param style the render style
|
||||
* @param items the items (may be {@code null})
|
||||
* @return a built {@link ConditionMessage}
|
||||
|
||||
@@ -35,4 +35,5 @@ import org.springframework.context.annotation.Conditional;
|
||||
@Documented
|
||||
@Conditional(OnWebApplicationCondition.class)
|
||||
public @interface ConditionalOnWebApplication {
|
||||
|
||||
}
|
||||
|
||||
@@ -439,6 +439,7 @@ class OnBeanCondition extends SpringBootCondition implements ConfigurationCondit
|
||||
Assert.isTrue(getTypes().size() == 1, annotationName() + " annotations must "
|
||||
+ "specify only one type (got " + getTypes() + ")");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static final class BeanTypeDeductionException extends RuntimeException {
|
||||
|
||||
@@ -134,10 +134,12 @@ public class CouchbaseAutoConfiguration {
|
||||
|
||||
@Conditional(OnBootstrapHostsCondition.class)
|
||||
static class BootstrapHostsProperty {
|
||||
|
||||
}
|
||||
|
||||
@ConditionalOnBean(type = "org.springframework.data.couchbase.config.CouchbaseConfigurer")
|
||||
static class CouchbaseConfigurerAvailable {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -51,6 +51,7 @@ class CassandraRepositoriesAutoConfigureRegistrar
|
||||
|
||||
@EnableCassandraRepositories
|
||||
private static class EnableCassandraRepositoriesConfiguration {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -51,5 +51,7 @@ class JpaRepositoriesAutoConfigureRegistrar
|
||||
|
||||
@EnableJpaRepositories
|
||||
private static class EnableJpaRepositoriesConfiguration {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -50,6 +50,7 @@ class MongoRepositoriesAutoConfigureRegistrar
|
||||
|
||||
@EnableMongoRepositories
|
||||
private static class EnableMongoRepositoriesConfiguration {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -256,4 +256,5 @@ public class RedisProperties {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -133,4 +133,5 @@ public class FlywayProperties {
|
||||
public boolean isCreateDataSource() {
|
||||
return this.url != null && this.user != null;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -164,4 +164,5 @@ public class FreeMarkerAutoConfiguration {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -95,4 +95,5 @@ public class H2ConsoleProperties {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -126,4 +126,5 @@ public class HypermediaAutoConfiguration {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -57,6 +57,7 @@ public class IntegrationAutoConfiguration {
|
||||
@Configuration
|
||||
@EnableIntegration
|
||||
protected static class IntegrationConfiguration {
|
||||
|
||||
}
|
||||
|
||||
@Configuration
|
||||
|
||||
@@ -95,6 +95,7 @@ public class DataSourceAutoConfiguration {
|
||||
@ConditionalOnMissingBean({ DataSource.class, XADataSource.class })
|
||||
@Import(EmbeddedDataSourceConfiguration.class)
|
||||
protected static class EmbeddedDatabaseConfiguration {
|
||||
|
||||
}
|
||||
|
||||
@Configuration
|
||||
@@ -140,10 +141,12 @@ public class DataSourceAutoConfiguration {
|
||||
|
||||
@ConditionalOnProperty(prefix = "spring.datasource", name = "type")
|
||||
static class ExplicitType {
|
||||
|
||||
}
|
||||
|
||||
@Conditional(PooledDataSourceAvailableCondition.class)
|
||||
static class PooledDataSourceAvailable {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
@@ -177,6 +180,7 @@ public class DataSourceAutoConfiguration {
|
||||
.findType();
|
||||
return (dataSourceClass == null ? null : dataSourceClass.getClassLoader());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -124,8 +124,8 @@ class DataSourceInitializer implements ApplicationListener<DataSourceInitialized
|
||||
runScripts(scripts, username, password);
|
||||
}
|
||||
|
||||
private List<Resource> getScripts(String propertyName,
|
||||
List<String> resources, String fallback) {
|
||||
private List<Resource> getScripts(String propertyName, List<String> resources,
|
||||
String fallback) {
|
||||
if (resources != null) {
|
||||
return getResources(propertyName, resources, true);
|
||||
}
|
||||
@@ -136,8 +136,8 @@ class DataSourceInitializer implements ApplicationListener<DataSourceInitialized
|
||||
return getResources(propertyName, fallbackResources, false);
|
||||
}
|
||||
|
||||
private List<Resource> getResources(String propertyName,
|
||||
List<String> locations, boolean validate) {
|
||||
private List<Resource> getResources(String propertyName, List<String> locations,
|
||||
boolean validate) {
|
||||
List<Resource> resources = new ArrayList<Resource>();
|
||||
for (String location : locations) {
|
||||
for (Resource resource : doGetResources(location)) {
|
||||
|
||||
@@ -117,7 +117,6 @@ public enum EmbeddedDatabaseConnection {
|
||||
/**
|
||||
* Convenience method to determine if a given driver class name represents an embedded
|
||||
* database type.
|
||||
*
|
||||
* @param driverClass the driver class
|
||||
* @return true if the driver class is one of the embedded types
|
||||
*/
|
||||
@@ -130,7 +129,6 @@ public enum EmbeddedDatabaseConnection {
|
||||
/**
|
||||
* Convenience method to determine if a given data source represents an embedded
|
||||
* database type.
|
||||
*
|
||||
* @param dataSource the data source to interrogate
|
||||
* @return true if the data source is one of the embedded types
|
||||
*/
|
||||
@@ -186,4 +184,5 @@ public enum EmbeddedDatabaseConnection {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -228,6 +228,7 @@ public class JerseyAutoConfiguration implements ServletContextAware {
|
||||
// will try and register a ContextLoaderListener which we don't need
|
||||
servletContext.setInitParameter("contextConfigLocation", "<NONE>");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ConditionalOnClass(JacksonFeature.class)
|
||||
|
||||
@@ -85,7 +85,9 @@ public class JerseyProperties {
|
||||
}
|
||||
|
||||
public enum Type {
|
||||
|
||||
SERVLET, FILTER
|
||||
|
||||
}
|
||||
|
||||
public static class Filter {
|
||||
|
||||
@@ -85,6 +85,7 @@ class JmsAnnotationDrivenConfiguration {
|
||||
@EnableJms
|
||||
@ConditionalOnMissingBean(name = JmsListenerConfigUtils.JMS_LISTENER_ANNOTATION_PROCESSOR_BEAN_NAME)
|
||||
protected static class EnableJmsConfiguration {
|
||||
|
||||
}
|
||||
|
||||
@ConditionalOnJndi
|
||||
|
||||
@@ -101,6 +101,7 @@ public class JmsAutoConfiguration {
|
||||
}
|
||||
return jmsTemplate;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ConditionalOnClass(JmsMessagingTemplate.class)
|
||||
|
||||
@@ -130,6 +130,7 @@ public class JmsProperties {
|
||||
? this.concurrency + "-" + this.maxConcurrency
|
||||
: String.valueOf(this.concurrency));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static class Template {
|
||||
|
||||
@@ -95,10 +95,12 @@ public class JndiConnectionFactoryAutoConfiguration {
|
||||
|
||||
@ConditionalOnJndi({ "java:/JmsXA", "java:/XAConnectionFactory" })
|
||||
static class Jndi {
|
||||
|
||||
}
|
||||
|
||||
@ConditionalOnProperty(prefix = "spring.jms", name = "jndi-name")
|
||||
static class Property {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -30,8 +30,8 @@ import org.springframework.jdbc.support.SQLExceptionTranslator;
|
||||
import org.springframework.jdbc.support.SQLStateSQLExceptionTranslator;
|
||||
|
||||
/**
|
||||
* Transforms {@link java.sql.SQLException} into a Spring-specific {@link
|
||||
* DataAccessException}.
|
||||
* Transforms {@link java.sql.SQLException} into a Spring-specific
|
||||
* {@link DataAccessException}.
|
||||
*
|
||||
* @author Lukas Eder
|
||||
* @author Andreas Ahlenstorf
|
||||
@@ -66,8 +66,8 @@ class JooqExceptionTranslator extends DefaultExecuteListener {
|
||||
|
||||
/**
|
||||
* Handle a single exception in the chain. SQLExceptions might be nested multiple
|
||||
* levels deep. The outermost exception is usually the least interesting one (
|
||||
* "Call getNextException to see the cause."). Therefore the innermost exception is
|
||||
* levels deep. The outermost exception is usually the least interesting one ("Call
|
||||
* getNextException to see the cause."). Therefore the innermost exception is
|
||||
* propagated and all other exceptions are logged.
|
||||
* @param context the execute context
|
||||
* @param translator the exception translator
|
||||
|
||||
@@ -122,6 +122,7 @@ public class LiquibaseAutoConfiguration {
|
||||
.username(this.properties.getUser())
|
||||
.password(this.properties.getPassword()).build();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -110,10 +110,12 @@ public class MailSenderAutoConfiguration {
|
||||
|
||||
@ConditionalOnProperty(prefix = "spring.mail", name = "host")
|
||||
static class HostProperty {
|
||||
|
||||
}
|
||||
|
||||
@ConditionalOnProperty(prefix = "spring.mail", name = "jndi-name")
|
||||
static class JndiNameProperty {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -194,7 +194,6 @@ public class MongoProperties {
|
||||
* {@code environment}. If the configured port is zero, the value of the
|
||||
* {@code local.mongo.port} property retrieved from the {@code environment} is used to
|
||||
* configure the client.
|
||||
*
|
||||
* @param options the options
|
||||
* @param environment the environment
|
||||
* @return the Mongo client
|
||||
|
||||
@@ -121,4 +121,5 @@ public class MustacheAutoConfiguration {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -106,6 +106,7 @@ class DataSourceInitializedPublisher implements BeanPostProcessor {
|
||||
registry.registerBeanDefinition(BEAN_NAME, beanDefinition);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -43,4 +43,5 @@ import org.springframework.security.config.annotation.web.configuration.WebSecur
|
||||
@AutoConfigureAfter(SecurityAutoConfiguration.class)
|
||||
@EnableWebSecurity
|
||||
public class FallbackWebSecurityAutoConfiguration {
|
||||
|
||||
}
|
||||
|
||||
@@ -171,7 +171,9 @@ public class SecurityProperties implements SecurityPrerequisite {
|
||||
public static class Headers {
|
||||
|
||||
public enum HSTS {
|
||||
|
||||
NONE, DOMAIN, ALL
|
||||
|
||||
}
|
||||
|
||||
public enum ContentSecurityPolicyMode {
|
||||
|
||||
@@ -237,6 +237,7 @@ public class SpringBootWebSecurityConfiguration {
|
||||
@Order(SecurityProperties.BASIC_AUTH_ORDER)
|
||||
protected static class ApplicationNoWebSecurityConfigurerAdapter
|
||||
extends WebSecurityConfigurerAdapter {
|
||||
|
||||
@Override
|
||||
protected void configure(HttpSecurity http) throws Exception {
|
||||
http.requestMatcher(new RequestMatcher() {
|
||||
@@ -246,6 +247,7 @@ public class SpringBootWebSecurityConfiguration {
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Configuration
|
||||
|
||||
@@ -173,4 +173,5 @@ public class OAuth2RestOperationsConfiguration {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -251,6 +251,7 @@ public class ResourceServerProperties implements Validator, BeanFactoryAware {
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -33,7 +33,6 @@ public interface UserInfoRestTemplateCustomizer {
|
||||
|
||||
/**
|
||||
* Customize the rest template before it is initialized.
|
||||
*
|
||||
* @param template the rest template
|
||||
*/
|
||||
void customize(OAuth2RestTemplate template);
|
||||
|
||||
@@ -77,11 +77,14 @@ public class SendGridAutoConfiguration {
|
||||
|
||||
@ConditionalOnProperty(prefix = "spring.sendgrid", value = "username")
|
||||
static class SendGridUserProperty {
|
||||
|
||||
}
|
||||
|
||||
@ConditionalOnProperty(prefix = "spring.sendgrid", value = "api-key")
|
||||
static class SendGridApiKeyProperty {
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -84,6 +84,7 @@ public class LinkedInAutoConfiguration {
|
||||
return new LinkedInConnectionFactory(this.properties.getAppId(),
|
||||
this.properties.getAppSecret());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -146,6 +146,7 @@ public class SocialWebAutoConfiguration {
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Configuration
|
||||
@@ -186,4 +187,5 @@ public class SocialWebAutoConfiguration {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -83,6 +83,7 @@ public class ThymeleafAutoConfiguration {
|
||||
public SpringResourceResourceResolver thymeleafResourceResolver() {
|
||||
return new SpringResourceResourceResolver();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Configuration
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user