From f32c6ed522493ac883b0ef031a2a05269b9aa6da Mon Sep 17 00:00:00 2001 From: Bruno Rosendo Date: Thu, 20 Apr 2023 11:37:53 +0100 Subject: [PATCH 1/6] Fixed startup error related to final Activity fields --- .../pt/up/fe/ni/website/backend/model/Activity.kt | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/kotlin/pt/up/fe/ni/website/backend/model/Activity.kt b/src/main/kotlin/pt/up/fe/ni/website/backend/model/Activity.kt index d08fe54e..7e446eb1 100644 --- a/src/main/kotlin/pt/up/fe/ni/website/backend/model/Activity.kt +++ b/src/main/kotlin/pt/up/fe/ni/website/backend/model/Activity.kt @@ -22,26 +22,26 @@ import pt.up.fe.ni.website.backend.model.constants.ActivityConstants as Constant abstract class Activity( @JsonProperty(required = true) @field:Size(min = Constants.Title.minSize, max = Constants.Title.maxSize) - var title: String, + open var title: String, @JsonProperty(required = true) @field:Size(min = Constants.Description.minSize, max = Constants.Description.maxSize) - var description: String, + open var description: String, @JoinColumn @OneToMany(fetch = FetchType.EAGER) - val teamMembers: MutableList, + open val teamMembers: MutableList, @OneToMany(cascade = [CascadeType.ALL], mappedBy = "activity") @OrderColumn @JsonIgnore // TODO: Decide if we want to return perRoles (or IDs) by default - val associatedRoles: MutableList<@Valid PerActivityRole> = mutableListOf(), + open val associatedRoles: MutableList<@Valid PerActivityRole> = mutableListOf(), @Column(unique = true) @field:Size(min = Constants.Slug.minSize, max = Constants.Slug.maxSize) - val slug: String? = null, + open val slug: String? = null, @Id @GeneratedValue - val id: Long? = null + open val id: Long? = null ) From bbd5f3b77b692f807f810e3158ab097212b38d38 Mon Sep 17 00:00:00 2001 From: Joaquim Cunha Date: Sat, 18 Mar 2023 19:47:07 +0000 Subject: [PATCH 2/6] added cors config --- .../ni/website/backend/config/CorsConfig.kt | 31 +++++++++++++++++++ .../website/backend/config/auth/AuthConfig.kt | 12 ------- src/main/resources/application.properties | 3 ++ 3 files changed, 34 insertions(+), 12 deletions(-) create mode 100644 src/main/kotlin/pt/up/fe/ni/website/backend/config/CorsConfig.kt diff --git a/src/main/kotlin/pt/up/fe/ni/website/backend/config/CorsConfig.kt b/src/main/kotlin/pt/up/fe/ni/website/backend/config/CorsConfig.kt new file mode 100644 index 00000000..6cc867de --- /dev/null +++ b/src/main/kotlin/pt/up/fe/ni/website/backend/config/CorsConfig.kt @@ -0,0 +1,31 @@ +package pt.up.fe.ni.website.backend.config + +import org.springframework.beans.factory.annotation.Value +import org.springframework.context.annotation.Bean +import org.springframework.context.annotation.Configuration +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity +import org.springframework.web.cors.CorsConfiguration +import org.springframework.web.cors.UrlBasedCorsConfigurationSource +import org.springframework.web.filter.CorsFilter + +@Configuration +@EnableWebSecurity +class CorsConfig { + @field:Value("\${frontend.url}") + final lateinit var url: String; + + @Bean + fun corsFilter(): CorsFilter { + val source = UrlBasedCorsConfigurationSource() + val config = CorsConfiguration() + config.addAllowedOrigin(url) + config.addAllowedHeader("*") + config.addAllowedMethod("GET") + config.addAllowedMethod("POST") + config.addAllowedMethod("PUT") + config.addAllowedMethod("PATCH") + config.addAllowedMethod("DELETE") + source.registerCorsConfiguration("/**", config) + return CorsFilter(source) + } +} diff --git a/src/main/kotlin/pt/up/fe/ni/website/backend/config/auth/AuthConfig.kt b/src/main/kotlin/pt/up/fe/ni/website/backend/config/auth/AuthConfig.kt index e07b3276..b2c957dc 100644 --- a/src/main/kotlin/pt/up/fe/ni/website/backend/config/auth/AuthConfig.kt +++ b/src/main/kotlin/pt/up/fe/ni/website/backend/config/auth/AuthConfig.kt @@ -61,18 +61,6 @@ class AuthConfig( return BCryptPasswordEncoder() } - @Bean - fun corsFilter(): CorsFilter { - // TODO: This is a temporary solution. We should use a proper CORS filter. - val source = UrlBasedCorsConfigurationSource() - val config = CorsConfiguration() - config.addAllowedOrigin("*") - config.addAllowedHeader("*") - config.addAllowedMethod("*") - source.registerCorsConfiguration("/**", config) - return CorsFilter(source) - } - fun rolesConverter(): JwtAuthenticationConverter? { val authoritiesConverter = JwtGrantedAuthoritiesConverter() authoritiesConverter.setAuthorityPrefix("ROLE_") diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index f8634b96..04cf01a5 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -35,6 +35,9 @@ upload.static-path=classpath:static # URL that will serve static content upload.static-serve=http://localhost:3000/static +# Frontend Url +frontend.url = http://localhost:3000 + # Due to a problem with Hibernate, which is using a deprecated property. This should be removed when fixed # See https://github.com/spring-projects/spring-data-jpa/issues/2717 for more information spring.jpa.properties.jakarta.persistence.sharedCache.mode=UNSPECIFIED From b980a63b706b6e6bd4a5e8bd6080e71ba2244d2e Mon Sep 17 00:00:00 2001 From: Joaquim Cunha Date: Thu, 20 Apr 2023 18:51:47 +0100 Subject: [PATCH 3/6] fixed lint --- .../kotlin/pt/up/fe/ni/website/backend/config/CorsConfig.kt | 2 +- .../pt/up/fe/ni/website/backend/config/auth/AuthConfig.kt | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/src/main/kotlin/pt/up/fe/ni/website/backend/config/CorsConfig.kt b/src/main/kotlin/pt/up/fe/ni/website/backend/config/CorsConfig.kt index 6cc867de..a3a59a3d 100644 --- a/src/main/kotlin/pt/up/fe/ni/website/backend/config/CorsConfig.kt +++ b/src/main/kotlin/pt/up/fe/ni/website/backend/config/CorsConfig.kt @@ -12,7 +12,7 @@ import org.springframework.web.filter.CorsFilter @EnableWebSecurity class CorsConfig { @field:Value("\${frontend.url}") - final lateinit var url: String; + final lateinit var url: String @Bean fun corsFilter(): CorsFilter { diff --git a/src/main/kotlin/pt/up/fe/ni/website/backend/config/auth/AuthConfig.kt b/src/main/kotlin/pt/up/fe/ni/website/backend/config/auth/AuthConfig.kt index b2c957dc..7f1939a8 100644 --- a/src/main/kotlin/pt/up/fe/ni/website/backend/config/auth/AuthConfig.kt +++ b/src/main/kotlin/pt/up/fe/ni/website/backend/config/auth/AuthConfig.kt @@ -19,9 +19,6 @@ import org.springframework.security.oauth2.jwt.NimbusJwtEncoder import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationConverter import org.springframework.security.oauth2.server.resource.authentication.JwtGrantedAuthoritiesConverter import org.springframework.security.web.SecurityFilterChain -import org.springframework.web.cors.CorsConfiguration -import org.springframework.web.cors.UrlBasedCorsConfigurationSource -import org.springframework.web.filter.CorsFilter import org.springframework.web.servlet.HandlerExceptionResolver @Configuration From 8f63649a323c602955e080975b261a14ab8c644e Mon Sep 17 00:00:00 2001 From: Joaquim Cunha Date: Wed, 3 May 2023 14:50:24 +0100 Subject: [PATCH 4/6] renamed auth to security and added cors config to security package --- .../backend/config/{auth => security}/AuthConfig.kt | 0 .../config/{auth => security}/AuthConfigProperties.kt | 0 .../website/backend/config/{ => security}/CorsConfig.kt | 8 ++++---- src/main/resources/application.properties | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) rename src/main/kotlin/pt/up/fe/ni/website/backend/config/{auth => security}/AuthConfig.kt (100%) rename src/main/kotlin/pt/up/fe/ni/website/backend/config/{auth => security}/AuthConfigProperties.kt (100%) rename src/main/kotlin/pt/up/fe/ni/website/backend/config/{ => security}/CorsConfig.kt (85%) diff --git a/src/main/kotlin/pt/up/fe/ni/website/backend/config/auth/AuthConfig.kt b/src/main/kotlin/pt/up/fe/ni/website/backend/config/security/AuthConfig.kt similarity index 100% rename from src/main/kotlin/pt/up/fe/ni/website/backend/config/auth/AuthConfig.kt rename to src/main/kotlin/pt/up/fe/ni/website/backend/config/security/AuthConfig.kt diff --git a/src/main/kotlin/pt/up/fe/ni/website/backend/config/auth/AuthConfigProperties.kt b/src/main/kotlin/pt/up/fe/ni/website/backend/config/security/AuthConfigProperties.kt similarity index 100% rename from src/main/kotlin/pt/up/fe/ni/website/backend/config/auth/AuthConfigProperties.kt rename to src/main/kotlin/pt/up/fe/ni/website/backend/config/security/AuthConfigProperties.kt diff --git a/src/main/kotlin/pt/up/fe/ni/website/backend/config/CorsConfig.kt b/src/main/kotlin/pt/up/fe/ni/website/backend/config/security/CorsConfig.kt similarity index 85% rename from src/main/kotlin/pt/up/fe/ni/website/backend/config/CorsConfig.kt rename to src/main/kotlin/pt/up/fe/ni/website/backend/config/security/CorsConfig.kt index a3a59a3d..b7859d0c 100644 --- a/src/main/kotlin/pt/up/fe/ni/website/backend/config/CorsConfig.kt +++ b/src/main/kotlin/pt/up/fe/ni/website/backend/config/security/CorsConfig.kt @@ -1,4 +1,4 @@ -package pt.up.fe.ni.website.backend.config +package pt.up.fe.ni.website.backend.config.auth import org.springframework.beans.factory.annotation.Value import org.springframework.context.annotation.Bean @@ -11,14 +11,14 @@ import org.springframework.web.filter.CorsFilter @Configuration @EnableWebSecurity class CorsConfig { - @field:Value("\${frontend.url}") - final lateinit var url: String + @field:Value("\${cors.allow-origin}") + final lateinit var origin: String @Bean fun corsFilter(): CorsFilter { val source = UrlBasedCorsConfigurationSource() val config = CorsConfiguration() - config.addAllowedOrigin(url) + config.addAllowedOrigin(origin) config.addAllowedHeader("*") config.addAllowedMethod("GET") config.addAllowedMethod("POST") diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 04cf01a5..15b771fb 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -35,8 +35,8 @@ upload.static-path=classpath:static # URL that will serve static content upload.static-serve=http://localhost:3000/static -# Frontend Url -frontend.url = http://localhost:3000 +# Cors Origin +cors.allow-origin = http://localhost:3000 # Due to a problem with Hibernate, which is using a deprecated property. This should be removed when fixed # See https://github.com/spring-projects/spring-data-jpa/issues/2717 for more information From 217ba2483dd4c1ab893f711de9a05017ad437d13 Mon Sep 17 00:00:00 2001 From: Bruno Rosendo Date: Fri, 23 Jun 2023 16:46:52 +0100 Subject: [PATCH 5/6] Set Jackson timezone to Lisbon --- src/main/resources/application.properties | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 15b771fb..08b443a4 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -18,6 +18,7 @@ server.error.whitelabel.enabled=false spring.jackson.default-property-inclusion=non_null spring.jackson.deserialization.fail-on-null-creator-properties=true spring.jackson.date-format=dd-MM-yyyy +spring.jackson.time-zone=Europe/Lisbon # Auth Config auth.private-key=classpath:certs/private.pem From f767d1e43a623470219815ea9f7072ed5d9967a1 Mon Sep 17 00:00:00 2001 From: Bruno Rosendo Date: Fri, 23 Jun 2023 18:35:57 +0100 Subject: [PATCH 6/6] Upgraded spring dependencies to current versions --- build.gradle.kts | 12 ++++++------ src/main/resources/application.properties | 4 ---- 2 files changed, 6 insertions(+), 10 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 6869e81e..6f2a76ae 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -3,12 +3,12 @@ import org.gradle.api.tasks.testing.logging.TestLogEvent import org.jetbrains.kotlin.gradle.tasks.KotlinCompile plugins { - id("org.springframework.boot") version "3.0.0" + id("org.springframework.boot") version "3.1.1" id("io.spring.dependency-management") version "1.1.0" kotlin("jvm") version "1.8.10" kotlin("plugin.spring") version "1.8.10" kotlin("plugin.jpa") version "1.8.10" - id("org.jlleitschuh.gradle.ktlint") version "11.2.0" + id("org.jlleitschuh.gradle.ktlint") version "11.4.2" id("com.epages.restdocs-api-spec") version "0.17.1" jacoco @@ -33,21 +33,21 @@ dependencies { implementation("org.jetbrains.kotlin:kotlin-reflect") implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8") implementation("org.springframework.boot:spring-boot-starter-oauth2-resource-server") - implementation("ch.qos.logback:logback-core:1.4.5") + implementation("ch.qos.logback:logback-core:1.4.8") implementation("org.slf4j:slf4j-api:2.0.6") implementation("com.cloudinary:cloudinary:1.0.14") annotationProcessor("org.springframework.boot:spring-boot-configuration-processor") - implementation("org.springframework.boot:spring-boot-starter-validation:3.0.0") + implementation("org.springframework.boot:spring-boot-starter-validation:3.1.1") developmentOnly("org.springframework.boot:spring-boot-devtools") runtimeOnly("com.h2database:h2") testImplementation("org.springframework.boot:spring-boot-starter-test") - testImplementation("ch.qos.logback:logback-classic:1.4.5") + testImplementation("ch.qos.logback:logback-classic:1.4.8") testImplementation("org.springframework.restdocs:spring-restdocs-mockmvc:3.0.0") testImplementation("com.epages:restdocs-api-spec-mockmvc:0.17.1") testImplementation("org.springframework.boot:spring-boot-starter-test") { exclude(group = "org.mockito2", module = "mockito-core") } - testImplementation("org.mockito:mockito-inline:5.0.0") + testImplementation("org.mockito:mockito-inline:5.2.0") } tasks.withType { diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 15b771fb..1fd03a19 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -37,7 +37,3 @@ upload.static-serve=http://localhost:3000/static # Cors Origin cors.allow-origin = http://localhost:3000 - -# Due to a problem with Hibernate, which is using a deprecated property. This should be removed when fixed -# See https://github.com/spring-projects/spring-data-jpa/issues/2717 for more information -spring.jpa.properties.jakarta.persistence.sharedCache.mode=UNSPECIFIED