Skip to content

Commit

Permalink
Upgrade to Spring Boot 3.2 (#390)
Browse files Browse the repository at this point in the history
* migrate javax to jakarta; cleanup imports

* fix typo

* use plugins dsl

* javax.inject to jakarta.inject

* update CAS config

* update CORS config

* update logback

* update Flyway

* clean up dependencies

* update jwt library

* update javers

* update poi

* bump misc dependencies

* clean up dependencies

* fix associations

* SB 3.1.x

* SB 3.2.x

* remove buildHealth plugin
  • Loading branch information
jaroldwong authored Feb 8, 2024
1 parent 9055934 commit 8669004
Show file tree
Hide file tree
Showing 247 changed files with 626 additions and 746 deletions.
74 changes: 26 additions & 48 deletions build.gradle
Original file line number Diff line number Diff line change
@@ -1,18 +1,11 @@
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:2.7.17")
}
plugins {
id 'java'
id 'org.springframework.boot' version '3.2.2'
id 'io.spring.dependency-management' version '1.1.4'
id 'checkstyle'
id 'idea'
}

apply plugin: 'java'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
apply plugin: 'checkstyle'
apply plugin: 'idea'

checkstyle {
configFile file("checkstyle.xml")
}
Expand All @@ -36,47 +29,32 @@ test {
}

dependencies {
runtimeOnly("org.springframework.boot:spring-boot-properties-migrator")

implementation("org.springframework.boot:spring-boot-starter-web")
implementation("org.springframework.boot:spring-boot-starter-data-jpa")
implementation("org.springframework.boot:spring-boot-starter-test")
implementation("org.springframework.boot:spring-boot-starter-mail")
implementation("org.springframework.boot:spring-boot-starter-validation")
implementation("org.springframework.ldap:spring-ldap-ldif-core:2.3.2.RELEASE")
implementation("io.jsonwebtoken:jjwt:0.9.0")
implementation("commons-io:commons-io:2.6")
implementation("org.springframework.security:spring-security-cas-client:3.0.8.RELEASE")
implementation("org.hibernate:hibernate-validator-annotation-processor:5.2.5.Final")
implementation("org.apache.poi:poi:3.17")
implementation("org.apache.poi:poi-ooxml:3.17")
implementation("javax.inject:javax.inject:1")
implementation("ch.qos.logback:logback-core:1.2.3")
implementation("ch.qos.logback:logback-classic:1.2.3")
implementation("org.slf4j:slf4j-api:1.7.25")
implementation("org.apache.commons:commons-lang3:3.7")
implementation("javax.mail:mail:1.4.7")
implementation("org.flywaydb:flyway-core:7.7.3")
implementation("org.apache.httpcomponents:httpclient:4.5.9")
implementation("org.javers:javers-core:2.4.1")
implementation("javax.xml.bind:jaxb-api:2.3.1")
implementation("com.amazonaws:aws-java-sdk-s3:1.12.187")
implementation("mysql:mysql-connector-java:8.0.33")
implementation("javax.annotation:javax.annotation-api:1.3.2")
implementation("org.springframework.ldap:spring-ldap-core:3.2.1")
implementation("org.springframework.security:spring-security-cas:6.2.1")
implementation("io.jsonwebtoken:jjwt-api:0.12.5")
runtimeOnly("io.jsonwebtoken:jjwt-impl:0.12.5")
runtimeOnly("io.jsonwebtoken:jjwt-jackson:0.12.5")
implementation("commons-io:commons-io:2.15.1")
implementation("org.apache.poi:poi:5.2.5")
implementation("org.apache.poi:poi-ooxml:5.2.5")
implementation("jakarta.inject:jakarta.inject-api:2.0.1")
implementation("ch.qos.logback:logback-core:1.4.14")
implementation("ch.qos.logback:logback-classic:1.4.14")
implementation("org.slf4j:slf4j-api:2.0.11")
implementation("org.apache.commons:commons-lang3:3.14.0")
implementation("org.flywaydb:flyway-core:9.22.3")
implementation("org.flywaydb:flyway-mysql:9.22.3")
implementation("org.apache.httpcomponents.client5:httpclient5:5.3.1")
implementation("org.javers:javers-core:7.3.7")
implementation("com.mysql:mysql-connector-j:8.3.0")
implementation("com.amazonaws:aws-java-sdk-s3:1.12.651")

testImplementation("junit:junit")
testImplementation("com.h2database:h2:1.4.199")
testImplementation("com.jayway.jsonpath:json-path:2.4.0")
}

task resolveDependencies {
doLast {
project.rootProject.allprojects.each { subProject ->
subProject.buildscript.configurations.each { configuration ->
resolveConfiguration(configuration)
}
subProject.configurations.each { configuration ->
resolveConfiguration(configuration)
}
}
}
}
7 changes: 3 additions & 4 deletions src/main/java/edu/ucdavis/dss/ipa/Application.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@
import edu.ucdavis.dss.ipa.config.JwtFilter;
import edu.ucdavis.dss.ipa.exceptions.handlers.MvcExceptionHandler;
import edu.ucdavis.dss.ipa.security.SecurityHeaderFilter;
import org.jasig.cas.client.util.HttpServletRequestWrapperFilter;
import org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter;
import org.apereo.cas.client.util.HttpServletRequestWrapperFilter;
import org.apereo.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
Expand All @@ -16,7 +16,6 @@
import org.springframework.security.access.AccessDeniedException;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.handler.SimpleMappingExceptionResolver;

@EnableScheduling
Expand Down Expand Up @@ -119,7 +118,7 @@ public SimpleMappingExceptionResolver webExceptionResolver() {
*/
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurerAdapter() {
return new WebMvcConfigurer() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**").allowedOrigins("http://localhost:9000", "https://test-ipa.dss.ucdavis.edu", "https://ipa.ucdavis.edu").allowCredentials(true).allowedMethods("*");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
import edu.ucdavis.dss.ipa.services.ActivityLogTagService;
import org.springframework.web.bind.annotation.*;

import javax.inject.Inject;
import jakarta.inject.Inject;
import java.util.ArrayList;
import java.util.List;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
import edu.ucdavis.dss.ipa.services.WorkgroupService;
import org.springframework.web.bind.annotation.*;

import javax.inject.Inject;
import jakarta.inject.Inject;

@RestController
public class AdminViewController {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,9 @@
import edu.ucdavis.dss.ipa.api.components.admin.views.AdminView;
import edu.ucdavis.dss.ipa.entities.*;
import edu.ucdavis.dss.ipa.services.*;
import org.hibernate.jdbc.Work;
import org.springframework.stereotype.Service;

import javax.inject.Inject;
import jakarta.inject.Inject;
import java.util.ArrayList;
import java.util.List;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,9 @@
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.View;

import javax.inject.Inject;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import jakarta.inject.Inject;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.text.ParseException;
import java.util.HashMap;
import java.util.Map;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import java.util.List;

import javax.inject.Inject;
import jakarta.inject.Inject;

import edu.ucdavis.dss.ipa.entities.Course;
import edu.ucdavis.dss.ipa.entities.CourseComment;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
import edu.ucdavis.dss.ipa.services.*;
import org.springframework.web.bind.annotation.*;

import javax.inject.Inject;
import jakarta.inject.Inject;

/**
* Created by Lloyd on 8/10/16.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import java.util.List;

import javax.inject.Inject;
import jakarta.inject.Inject;

import edu.ucdavis.dss.ipa.entities.SectionGroup;
import edu.ucdavis.dss.ipa.security.Authorizer;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@

import edu.ucdavis.dss.dw.dto.DwCourse;

import javax.inject.Inject;
import javax.servlet.http.HttpServletResponse;
import jakarta.inject.Inject;
import jakarta.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;
import java.util.Comparator;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,8 @@
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;

import javax.inject.Inject;
import javax.servlet.http.HttpServletResponse;
import jakarta.inject.Inject;
import jakarta.servlet.http.HttpServletResponse;

/**
* Created by Lloyd on 8/10/16.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;

import javax.inject.Inject;
import javax.servlet.http.HttpServletResponse;
import jakarta.inject.Inject;
import jakarta.servlet.http.HttpServletResponse;

/**
* Created by Lloyd on 8/10/16.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.web.servlet.view.document.AbstractXlsView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
import org.springframework.stereotype.Service;
import org.springframework.web.servlet.View;

import javax.inject.Inject;
import jakarta.inject.Inject;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.web.servlet.view.document.AbstractXlsxView;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,10 @@

import java.util.*;

import javax.inject.Inject;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import jakarta.inject.Inject;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;

import edu.ucdavis.dss.ipa.entities.ScheduleTermState;
import edu.ucdavis.dss.ipa.entities.User;
Expand All @@ -15,6 +14,10 @@
import edu.ucdavis.dss.ipa.services.UserRoleService;
import edu.ucdavis.dss.ipa.services.UserService;
import io.jsonwebtoken.*;
import io.jsonwebtoken.security.SignatureException;
import io.jsonwebtoken.io.Decoders;
import io.jsonwebtoken.security.Keys;
import javax.crypto.SecretKey;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
Expand Down Expand Up @@ -64,8 +67,8 @@ public SecurityDTO validate(@RequestBody SecurityDTO securityDTO, HttpServletReq
// Check if the token exists, else check for CAS
if (securityDTO.token != null) {
try {
Claims claims = Jwts.parser().setSigningKey(jwtSigningKey)
.parseClaimsJws(securityDTO.token).getBody();
Claims claims = Jwts.parser().verifyWith(getSecretKey()).build()
.parseSignedClaims(securityDTO.token).getPayload();

// Ensure token is not expired before we refresh it
Date now = new Date();
Expand Down Expand Up @@ -116,12 +119,12 @@ public SecurityDTO validate(@RequestBody SecurityDTO securityDTO, HttpServletReq
// Update the user lastAccessed value
userService.updateLastAccessed(user);

securityDTO.token = Jwts.builder().setSubject(loginId)
securityDTO.token = Jwts.builder().subject(loginId)
.claim("loginId", loginId)
.claim("realUserLoginId", realUserLoginId)
.claim("expirationDate", expirationDate)
.setIssuedAt(new Date())
.signWith(SignatureAlgorithm.HS256, jwtSigningKey).compact();
.issuedAt(new Date())
.signWith(getSecretKey()).compact();
securityDTO.setLoginId(loginId);
securityDTO.setRealUserLoginId(realUserLoginId);
securityDTO.setUserRoles(userRoles);
Expand Down Expand Up @@ -193,8 +196,8 @@ public SecurityDTO impersonate(@PathVariable String loginIdToImpersonate, @Reque
Date expirationDate = calendarNow.getTime();

try {
Claims claims = Jwts.parser().setSigningKey(jwtSigningKey)
.parseClaimsJws(securityDTO.token).getBody();
Claims claims = Jwts.parser().verifyWith(getSecretKey()).build()
.parseSignedClaims(securityDTO.token).getPayload();

// Deserialize tokens
String realUserLoginId = (String) claims.get("realUserLoginId");
Expand Down Expand Up @@ -231,13 +234,13 @@ public SecurityDTO impersonate(@PathVariable String loginIdToImpersonate, @Reque
List<ScheduleTermState> termStates = scheduleTermStateService.getScheduleTermStatesByLoginId(loginIdToImpersonate);

// Rebuild token
securityDTO.token = Jwts.builder().setSubject(loginIdToImpersonate)
securityDTO.token = Jwts.builder().subject(loginIdToImpersonate)
.claim("userRoles", userRoles)
.claim("loginId", loginIdToImpersonate)
.claim("realUserLoginId", realUserLoginId)
.claim("expirationDate", expirationDate)
.setIssuedAt(new Date())
.signWith(SignatureAlgorithm.HS256, jwtSigningKey).compact();
.issuedAt(new Date())
.signWith(getSecretKey()).compact();
securityDTO.setLoginId(loginIdToImpersonate);
securityDTO.setRealUserLoginId(realUserLoginId);
securityDTO.setUserRoles(userRoles);
Expand Down Expand Up @@ -272,8 +275,8 @@ public SecurityDTO unimpersonate(@RequestBody SecurityDTO securityDTO,
Date expirationDate = calendarNow.getTime();

try {
Claims claims = Jwts.parser().setSigningKey(jwtSigningKey)
.parseClaimsJws(securityDTO.token).getBody();
Claims claims = Jwts.parser().verifyWith(getSecretKey()).build()
.parseSignedClaims(securityDTO.token).getPayload();

// Deserialize token
String realUserLoginId = (String) claims.get("realUserLoginId");
Expand All @@ -284,13 +287,13 @@ public SecurityDTO unimpersonate(@RequestBody SecurityDTO securityDTO,
User realUser = userService.getOneByLoginId(realUserLoginId);

// Rebuild token
securityDTO.token = Jwts.builder().setSubject(realUserLoginId)
securityDTO.token = Jwts.builder().subject(realUserLoginId)
.claim("userRoles", userRoles)
.claim("loginId", realUserLoginId)
.claim("realUserLoginId", realUserLoginId)
.claim("expirationDate", expirationDate)
.setIssuedAt(new Date())
.signWith(SignatureAlgorithm.HS256, jwtSigningKey).compact();
.issuedAt(new Date())
.signWith(getSecretKey()).compact();
securityDTO.setLoginId(realUserLoginId);
securityDTO.setRealUserLoginId(realUserLoginId);
securityDTO.setUserRoles(userRoles);
Expand All @@ -306,4 +309,8 @@ public SecurityDTO unimpersonate(@RequestBody SecurityDTO securityDTO,

return securityDTO;
}

private SecretKey getSecretKey() {
return Keys.hmacShaKeyFor(Decoders.BASE64.decode(jwtSigningKey));
}
}
Loading

0 comments on commit 8669004

Please sign in to comment.