From 6b11f9eb89a96956a414b7f1dcf5be0e431ffc68 Mon Sep 17 00:00:00 2001 From: AleWu <77410271+TheAleWu@users.noreply.github.com> Date: Fri, 10 Jul 2026 13:52:23 +0200 Subject: [PATCH 1/2] implements static analysis via SpotBugs for microservices --- .github/workflows/ci.yml | 5 +++++ scripts/test-backends.js | 8 ++++---- services/admin-service/pom.xml | 15 +++++++++++++++ services/calendar-service/pom.xml | 15 +++++++++++++++ services/checklist-service/pom.xml | 15 +++++++++++++++ services/note-service/pom.xml | 15 +++++++++++++++ services/shared/pom.xml | 15 +++++++++++++++ .../devopss26/shared/security/JWTHelper.java | 2 +- services/spotbugs-exclude.xml | 17 +++++++++++++++++ services/user-service/pom.xml | 15 +++++++++++++++ .../userservice/config/SecurityConfig.java | 8 +------- .../userservice/service/JwtService.java | 2 +- 12 files changed, 119 insertions(+), 13 deletions(-) create mode 100644 services/spotbugs-exclude.xml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 930e7a6..d7173df 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -74,6 +74,11 @@ jobs: cd services/${{ matrix.service }} mvn clean test + - name: Static Analysis with Spotbugs + run: | + cd services/${{ matrix.service }} + mvn compile spotbugs:check + frontend-test: name: Build & Test Frontend needs: openapi-lint diff --git a/scripts/test-backends.js b/scripts/test-backends.js index 98d7f42..cad72c6 100644 --- a/scripts/test-backends.js +++ b/scripts/test-backends.js @@ -11,7 +11,7 @@ if (fs.existsSync(servicesDir)) { const pomPath = path.join(servicesDir, service, 'pom.xml'); if (fs.existsSync(pomPath)) { console.log(`\n========================================`); - console.log(`Running tests for service: ${service}`); + console.log(`Running tests and static analysis for service: ${service}`); console.log(`========================================`); try { const serviceDir = path.join(servicesDir, service); @@ -20,12 +20,12 @@ if (fs.existsSync(servicesDir)) { ? (process.platform === 'win32' ? 'mvnw.cmd' : './mvnw') : 'mvn'; - execSync(`${cmd} clean test -Dsurefire.exitTimeout=1 -DargLine="-Dlogging.level.com.tngtech.archunit.core.importer.ClassFileProcessor=ERROR"`, { + execSync(`${cmd} clean test spotbugs:check -Dsurefire.exitTimeout=1 -DargLine="-Dlogging.level.com.tngtech.archunit.core.importer.ClassFileProcessor=ERROR"`, { cwd: serviceDir, stdio: 'inherit' }); } catch (error) { - console.error(`\nTests failed for service: ${service}`); + console.error(`\nTests or static analysis failed for service: ${service}`); failed = true; } } @@ -35,5 +35,5 @@ if (fs.existsSync(servicesDir)) { if (failed) { process.exit(1); } else { - console.log('\nAll backend tests completed successfully.'); + console.log('\nAll backend tests and static analysis completed successfully.'); } diff --git a/services/admin-service/pom.xml b/services/admin-service/pom.xml index 36f05fa..2395279 100644 --- a/services/admin-service/pom.xml +++ b/services/admin-service/pom.xml @@ -198,6 +198,21 @@ + + com.github.spotbugs + spotbugs-maven-plugin + 4.10.2.0 + + ${project.basedir}/../spotbugs-exclude.xml + + + + com.github.spotbugs + spotbugs + 4.10.2 + + + diff --git a/services/calendar-service/pom.xml b/services/calendar-service/pom.xml index 3b56d81..b64ce71 100644 --- a/services/calendar-service/pom.xml +++ b/services/calendar-service/pom.xml @@ -220,6 +220,21 @@ + + com.github.spotbugs + spotbugs-maven-plugin + 4.10.2.0 + + ${project.basedir}/../spotbugs-exclude.xml + + + + com.github.spotbugs + spotbugs + 4.10.2 + + + diff --git a/services/checklist-service/pom.xml b/services/checklist-service/pom.xml index 0a3fa77..af8d306 100644 --- a/services/checklist-service/pom.xml +++ b/services/checklist-service/pom.xml @@ -204,6 +204,21 @@ + + com.github.spotbugs + spotbugs-maven-plugin + 4.10.2.0 + + ${project.basedir}/../spotbugs-exclude.xml + + + + com.github.spotbugs + spotbugs + 4.10.2 + + + diff --git a/services/note-service/pom.xml b/services/note-service/pom.xml index 69f4d4c..74befe4 100644 --- a/services/note-service/pom.xml +++ b/services/note-service/pom.xml @@ -220,6 +220,21 @@ + + com.github.spotbugs + spotbugs-maven-plugin + 4.10.2.0 + + ${project.basedir}/../spotbugs-exclude.xml + + + + com.github.spotbugs + spotbugs + 4.10.2 + + + diff --git a/services/shared/pom.xml b/services/shared/pom.xml index c0b981c..db276d8 100644 --- a/services/shared/pom.xml +++ b/services/shared/pom.xml @@ -101,6 +101,21 @@ + + com.github.spotbugs + spotbugs-maven-plugin + 4.10.2.0 + + ${project.basedir}/../spotbugs-exclude.xml + + + + com.github.spotbugs + spotbugs + 4.10.2 + + + diff --git a/services/shared/src/main/java/de/tum/devopss26/shared/security/JWTHelper.java b/services/shared/src/main/java/de/tum/devopss26/shared/security/JWTHelper.java index 0b2be8c..7a492a4 100644 --- a/services/shared/src/main/java/de/tum/devopss26/shared/security/JWTHelper.java +++ b/services/shared/src/main/java/de/tum/devopss26/shared/security/JWTHelper.java @@ -3,7 +3,7 @@ import io.jsonwebtoken.Claims; import jakarta.servlet.http.HttpServletRequest; -public class JWTHelper { +public final class JWTHelper { private JWTHelper() { throw new IllegalAccessError("Illegal access of JWTHelper - No instantiation!"); diff --git a/services/spotbugs-exclude.xml b/services/spotbugs-exclude.xml new file mode 100644 index 0000000..685b4aa --- /dev/null +++ b/services/spotbugs-exclude.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + diff --git a/services/user-service/pom.xml b/services/user-service/pom.xml index a57dea6..d2b1a1a 100644 --- a/services/user-service/pom.xml +++ b/services/user-service/pom.xml @@ -246,6 +246,21 @@ + + com.github.spotbugs + spotbugs-maven-plugin + 4.10.2.0 + + ${project.basedir}/../spotbugs-exclude.xml + + + + com.github.spotbugs + spotbugs + 4.10.2 + + + diff --git a/services/user-service/src/main/java/de/tum/devopss26/userservice/config/SecurityConfig.java b/services/user-service/src/main/java/de/tum/devopss26/userservice/config/SecurityConfig.java index 90ff27b..bf0f515 100644 --- a/services/user-service/src/main/java/de/tum/devopss26/userservice/config/SecurityConfig.java +++ b/services/user-service/src/main/java/de/tum/devopss26/userservice/config/SecurityConfig.java @@ -18,12 +18,6 @@ @EnableWebSecurity public class SecurityConfig { - private final JwtAuthenticationFilter jwtAuthFilter; - - public SecurityConfig(JwtAuthenticationFilter jwtAuthFilter) { - this.jwtAuthFilter = jwtAuthFilter; - } - @Bean @Order(1) public SecurityFilterChain loginSecurityFilterChain(HttpSecurity http) { @@ -39,7 +33,7 @@ public SecurityFilterChain loginSecurityFilterChain(HttpSecurity http) { @Bean @Order(2) - public SecurityFilterChain apiSecurityFilterChain(HttpSecurity http) { + public SecurityFilterChain apiSecurityFilterChain(HttpSecurity http, JwtAuthenticationFilter jwtAuthFilter) { http .csrf(AbstractHttpConfigurer::disable) .authorizeHttpRequests(auth -> auth diff --git a/services/user-service/src/main/java/de/tum/devopss26/userservice/service/JwtService.java b/services/user-service/src/main/java/de/tum/devopss26/userservice/service/JwtService.java index 6078994..c92643e 100644 --- a/services/user-service/src/main/java/de/tum/devopss26/userservice/service/JwtService.java +++ b/services/user-service/src/main/java/de/tum/devopss26/userservice/service/JwtService.java @@ -20,7 +20,7 @@ import java.util.function.Function; @Service -public class JwtService { +public final class JwtService { private static final long EXPIRATION_MS = 24 * 60 * 60 * 1000L; private final PrivateKey privateKey; From c6deeafe1b5a0d86a95818bc2cc808afe3b244dc Mon Sep 17 00:00:00 2001 From: AleWu <77410271+TheAleWu@users.noreply.github.com> Date: Fri, 10 Jul 2026 13:56:08 +0200 Subject: [PATCH 2/2] removed unnecessary extractUserId function --- .../java/de/tum/devopss26/userservice/service/JwtService.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/services/user-service/src/main/java/de/tum/devopss26/userservice/service/JwtService.java b/services/user-service/src/main/java/de/tum/devopss26/userservice/service/JwtService.java index c92643e..5af6178 100644 --- a/services/user-service/src/main/java/de/tum/devopss26/userservice/service/JwtService.java +++ b/services/user-service/src/main/java/de/tum/devopss26/userservice/service/JwtService.java @@ -73,10 +73,6 @@ public String extractUsername(String token) { return extractClaim(token, claims -> claims.get("name", String.class)); } - public String extractUserId(String token) { - return extractClaim(token, Claims::getSubject); - } - public Date extractExpiration(String token) { return extractClaim(token, Claims::getExpiration); }