Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion common/src/pandas/core/DatabaseOracleConfig.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package pandas.core;

import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression;
import org.springframework.boot.autoconfigure.orm.jpa.HibernatePropertiesCustomizer;
import org.springframework.boot.hibernate.autoconfigure.HibernatePropertiesCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

Expand Down
2 changes: 1 addition & 1 deletion common/src/pandas/core/DatabaseStartupConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.autoconfigure.orm.jpa.EntityManagerFactoryDependsOnPostProcessor;
import org.springframework.boot.jpa.autoconfigure.EntityManagerFactoryDependsOnPostProcessor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.support.DatabaseStartupValidator;
Expand Down
7 changes: 4 additions & 3 deletions gatherer/src/pandas/PandasGatherer.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,9 +25,10 @@ static class SecurityConfig {
@Bean
public SecurityWebFilterChain securitygWebFilterChain(
ServerHttpSecurity http) {
return http.authorizeExchange()
.anyExchange().permitAll()
.and().csrf().disable().build();
return http.authorizeExchange(exchanges -> exchanges
.anyExchange().permitAll())
.csrf(csrf -> csrf.disable())
.build();
}
}
}
4 changes: 2 additions & 2 deletions gatherer/src/pandas/gatherer/repository/BambooClient.java
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
package pandas.gatherer.repository;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.actuate.health.Health;
import org.springframework.boot.actuate.health.HealthIndicator;
import org.springframework.boot.health.contributor.Health;
import org.springframework.boot.health.contributor.HealthIndicator;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.core.io.FileSystemResource;
import org.springframework.http.MediaType;
Expand Down
5 changes: 5 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,11 @@
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
<version>2.0.12</version>
</dependency>
<dependency>
<groupId>com.googlecode.owasp-java-html-sanitizer</groupId>
<artifactId>owasp-java-html-sanitizer</artifactId>
Expand Down
5 changes: 3 additions & 2 deletions social/src/pandas/PandasOAuthConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@

import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.autoconfigure.security.oauth2.client.OAuth2ClientProperties;
// OAuth2ClientProperties has been removed in Spring Boot 4
// import org.springframework.boot.autoconfigure.security.oauth2.client.OAuth2ClientProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
Expand All @@ -18,7 +19,7 @@
@Configuration
@ConditionalOnProperty("OIDC_URL")
@PropertySource("classpath:application-oauth.properties")
@EnableConfigurationProperties(OAuth2ClientProperties.class)
// @EnableConfigurationProperties(OAuth2ClientProperties.class)
//@Import(OAuth2ClientAutoConfiguration.class)
public class PandasOAuthConfig {

Expand Down
5 changes: 3 additions & 2 deletions social/src/pandas/PandasSocial.java
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,11 @@ public static void main(String[] args) {

@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http.csrf().disable();
http.csrf(csrf -> csrf.disable());
http.authorizeHttpRequests(r -> r.anyRequest().permitAll());
http.oauth2Login(Customizer.withDefaults());
http.oauth2Client();
// oauth2Client() requires a lambda in Spring Security 7, using empty lambda for default configuration
http.oauth2Client(oauth2 -> {});
return http.build();
}
}
3 changes: 1 addition & 2 deletions ui/src/pandas/Pandas.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
import org.owasp.html.Sanitizers;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.elasticsearch.ElasticsearchRestClientAutoConfiguration;
import org.springframework.boot.context.properties.ConfigurationPropertiesScan;
import org.springframework.context.annotation.Bean;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
Expand All @@ -17,7 +16,7 @@

import java.net.http.HttpClient;

@SpringBootApplication(exclude = ElasticsearchRestClientAutoConfiguration.class)
@SpringBootApplication
@EnableScheduling
@EnableJpaAuditing(auditorAwareRef = "userService")
@EnableMethodSecurity
Expand Down
2 changes: 1 addition & 1 deletion ui/src/pandas/collection/SubjectEditForm.java
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package pandas.collection;

import org.hibernate.engine.jdbc.BlobProxy;
import org.hibernate.engine.jdbc.proxy.BlobProxy;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
Expand Down
6 changes: 3 additions & 3 deletions ui/src/pandas/core/PandasServiceContributor.java
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
import org.hibernate.service.spi.ServiceRegistryImplementor;
import org.hibernate.sql.exec.internal.JdbcSelectExecutorStandardImpl;
import org.hibernate.sql.exec.spi.ExecutionContext;
import org.hibernate.sql.exec.spi.JdbcOperationQuerySelect;
import org.hibernate.sql.exec.spi.JdbcSelect;
import org.hibernate.sql.exec.spi.JdbcParameterBindings;
import org.hibernate.sql.exec.spi.JdbcSelectExecutor;
import org.hibernate.sql.results.spi.ListResultsConsumer;
Expand All @@ -25,7 +25,7 @@ public void contribute(StandardServiceRegistryBuilder serviceRegistryBuilder) {
public JdbcServices initiateService(Map<String, Object> configurationValues, ServiceRegistryImplementor registry) {
JdbcSelectExecutorStandardImpl instance = new JdbcSelectExecutorStandardImpl() {
@Override
public <R> List<R> list(JdbcOperationQuerySelect jdbcSelect, JdbcParameterBindings jdbcParameterBindings, ExecutionContext executionContext, RowTransformer<R> rowTransformer, Class<R> domainResultType, ListResultsConsumer.UniqueSemantic uniqueSemantic) {
public <R> List<R> list(JdbcSelect jdbcSelect, JdbcParameterBindings jdbcParameterBindings, ExecutionContext executionContext, RowTransformer<R> rowTransformer, Class<R> domainResultType, ListResultsConsumer.UniqueSemantic uniqueSemantic) {
long startNanos = System.nanoTime();
List<R> list = super.list(jdbcSelect, jdbcParameterBindings, executionContext, rowTransformer, domainResultType, uniqueSemantic);
long elapsedNanos = System.nanoTime() - startNanos;
Expand All @@ -37,7 +37,7 @@ public <R> List<R> list(JdbcOperationQuerySelect jdbcSelect, JdbcParameterBindin
}

@Override
public <R> List<R> list(JdbcOperationQuerySelect jdbcSelect, JdbcParameterBindings jdbcParameterBindings, ExecutionContext executionContext, RowTransformer<R> rowTransformer, Class<R> requestedJavaType, ListResultsConsumer.UniqueSemantic uniqueSemantic, int resultCountEstimate) {
public <R> List<R> list(JdbcSelect jdbcSelect, JdbcParameterBindings jdbcParameterBindings, ExecutionContext executionContext, RowTransformer<R> rowTransformer, Class<R> requestedJavaType, ListResultsConsumer.UniqueSemantic uniqueSemantic, int resultCountEstimate) {
long startNanos = System.nanoTime();
List<R> list = super.list(jdbcSelect, jdbcParameterBindings, executionContext, rowTransformer, requestedJavaType, uniqueSemantic, resultCountEstimate);
long elapsedNanos = System.nanoTime() - startNanos;
Expand Down
33 changes: 19 additions & 14 deletions ui/src/pandas/core/SecurityConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
import org.springframework.security.web.context.DelegatingSecurityContextRepository;
import org.springframework.security.web.context.HttpSessionSecurityContextRepository;
import org.springframework.security.web.context.RequestAttributeSecurityContextRepository;
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
import org.springframework.security.web.servlet.util.matcher.PathPatternRequestMatcher;
import org.springframework.web.servlet.support.ServletUriComponentsBuilder;
import pandas.agency.AgencyRepository;
import pandas.agency.User;
Expand Down Expand Up @@ -78,21 +78,25 @@ protected HttpSessionSecurityContextRepository httpSessionSecurityContextReposit
@Bean
protected SecurityFilterChain configure(HttpSecurity http,
HttpSessionSecurityContextRepository httpSessionSecurityContextRepository) throws Exception {
http.securityMatcher("/login/check-session-reply").headers().frameOptions().sameOrigin().and().securityMatcher("/**");
http.securityMatcher("/login/check-session-reply")
.headers(headers -> headers.frameOptions(frameOptions -> frameOptions.sameOrigin()));
http.securityMatcher("/**");

if (config.getAutologin() != null) {
PreAuthenticatedAuthenticationProvider provider = new PreAuthenticatedAuthenticationProvider();
provider.setPreAuthenticatedUserDetailsService(pandasUserDetailsService);
http.authenticationProvider(provider);
}
if (oidcIssuerUri != null) {
System.out.println("setting user service");
http.oauth2Login().userInfoEndpoint().oidcUserService(oidcUserService())
.and().loginPage("/login")
.and().logout().logoutUrl("/logout");
http.logout().logoutRequestMatcher(new AntPathRequestMatcher("/logout"));
http.oauth2Login(oauth2 -> oauth2
.userInfoEndpoint(userInfo -> userInfo.oidcUserService(oidcUserService()))
.loginPage("/login"))
.logout(logout -> logout
.logoutUrl("/logout")
.logoutRequestMatcher(PathPatternRequestMatcher.pathPattern("/logout")));
} else {
DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider();
authProvider.setUserDetailsService(pandasUserDetailsService);
DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider(pandasUserDetailsService);
authProvider.setPasswordEncoder(NoOpPasswordEncoder.getInstance());
http.authenticationProvider(authProvider);
}
Expand Down Expand Up @@ -123,21 +127,22 @@ protected Object getPreAuthenticatedCredentials(HttpServletRequest request) {
.requestMatchers("/whoami").permitAll()
.anyRequest().hasAnyRole("infouser"));
if (oidcIssuerUri != null && clientRegistrationRepository != null) {
auth.logout().logoutSuccessHandler((request, response, authentication) -> {
auth.logout(logout -> logout.logoutSuccessHandler((request, response, authentication) -> {
OidcClientInitiatedLogoutSuccessHandler handler = new OidcClientInitiatedLogoutSuccessHandler(clientRegistrationRepository);
handler.setPostLogoutRedirectUri(ServletUriComponentsBuilder.fromContextPath(request).build().toUriString());
handler.onLogoutSuccess(request, response, authentication);
});
}));
}
if (oidcIssuerUri == null && config.getAutologin() == null) {
auth.formLogin().defaultSuccessUrl("/")
.and().httpBasic().realmName("PANDAS");
auth.formLogin(formLogin -> formLogin.defaultSuccessUrl("/"))
.httpBasic(httpBasic -> httpBasic.realmName("PANDAS"));
}

// This is the same as the default, but the sudo function needs a reference to
// httpSessionSecurityContextRepository, so we construct it ourselves and stash it in a bean.
http.securityContext().securityContextRepository(new DelegatingSecurityContextRepository(
new RequestAttributeSecurityContextRepository(), httpSessionSecurityContextRepository));
http.securityContext(securityContext -> securityContext.securityContextRepository(
new DelegatingSecurityContextRepository(
new RequestAttributeSecurityContextRepository(), httpSessionSecurityContextRepository)));

return http.build();
}
Expand Down
Loading