Skip to content

Commit 7066977

Browse files
committed
feature: use owasp encoder to sanitize urls
Also tidy the build.gradle a little Tidy integration test by moving into test folder out of apiTest Add actuator api test Fixup actuator api test to hit /info not /actuator/info, sadly
1 parent cec9009 commit 7066977

20 files changed

+241
-264
lines changed

Dockerfile

Lines changed: 5 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,17 @@
1-
# ---- Base image (default fallback) ----
2-
ARG BASE_IMAGE
3-
FROM ${BASE_IMAGE:-eclipse-temurin:21}
1+
FROM eclipse-temurin:21
42

5-
# ---- Runtime arguments ----
6-
ARG SERVER_PORT
7-
ARG JAR_FILENAME
8-
ARG JAR_FILE_PATH
9-
ARG CP_BACKEND_URL
10-
ARG CJSCPPUID
11-
12-
ENV JAR_FILENAME=${JAR_FILENAME:-app.jar}
13-
ENV JAR_FILE_PATH=${JAR_FILE_PATH:-build/libs}
14-
ENV JAR_FULL_PATH=$JAR_FILE_PATH/$JAR_FILENAME
15-
16-
ENV CP_BACKEND_URL=$CP_BACKEND_URL
17-
ENV CJSCPPUID=$CJSCPPUID
18-
19-
# ---- Set runtime ENV for Spring Boot to bind port
20-
ENV SERVER_PORT=${SERVER_PORT:-4550}
3+
WORKDIR /app
214

225
# ---- Dependencies ----
236
RUN apt-get update \
247
&& apt-get install -y curl \
258
&& rm -rf /var/lib/apt/lists/*
269

2710
# ---- Application files ----
28-
COPY $JAR_FULL_PATH /opt/app/app.jar
29-
COPY lib/applicationinsights.json /opt/app/
30-
31-
# ---- Permissions ----
32-
RUN chmod 755 /opt/app/app.jar
11+
COPY build/libs/*.jar /app/
12+
COPY lib/applicationinsights.json /app/
3313

3414
# ---- Runtime ----
3515
EXPOSE 4550
3616

37-
CMD ["java", "-jar", "/opt/app/app.jar"]
17+
ENTRYPOINT ["sh","-c","exec java -jar $(ls /app/*.jar | grep -v 'plain' | head -n1)"]

build.gradle

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
plugins {
22
id 'application'
33
id 'java'
4-
id 'io.spring.dependency-management' version '1.1.7'
54
id 'org.springframework.boot' version '4.0.0'
5+
id 'io.spring.dependency-management' version '1.1.7'
66
id 'jacoco'
77
id 'maven-publish'
88
id "com.github.ben-manes.versions" version "0.53.0"
99
id "org.cyclonedx.bom" version "3.1.0"
10+
id 'com.avast.gradle.docker-compose' version '0.17.20'
1011
}
1112

1213
group = 'uk.gov.hmcts.cp'
@@ -16,14 +17,14 @@ apply {
1617
from("$rootDir/gradle/dependencies/java-core.gradle")
1718
from("$rootDir/gradle/dependencies/spring-core.gradle")
1819

19-
from("$rootDir/gradle/dependency.gradle")
20-
from("$rootDir/gradle/buildinfo.gradle")
21-
from("$rootDir/gradle/integration.gradle")
22-
from("$rootDir/gradle/jar.gradle")
23-
from("$rootDir/gradle/java.gradle")
24-
from("$rootDir/gradle/pmd.gradle")
25-
from("$rootDir/gradle/repositories.gradle")
26-
from("$rootDir/gradle/test.gradle")
20+
from("$rootDir/gradle/github/repositories.gradle")
21+
from("$rootDir/gradle/github/java.gradle")
22+
from("$rootDir/gradle/github/dependency.gradle")
23+
from("$rootDir/gradle/github/pmd.gradle")
24+
from("$rootDir/gradle/github/test.gradle")
25+
from("$rootDir/gradle/github/jar.gradle")
26+
27+
from("$rootDir/gradle/tasks/apitest.gradle")
2728
}
2829

2930
ext {

docker-compose.yml

Lines changed: 2 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,6 @@
1-
version: '3.8'
2-
31
services:
4-
service-cp-caseadmin-case-urn-mapper:
5-
env_file:
6-
- .env
2+
app:
73
build:
8-
context: .
94
dockerfile: Dockerfile
10-
args:
11-
http_proxy: ${http_proxy}
12-
https_proxy: ${https_proxy}
13-
no_proxy: ${no_proxy}
14-
BASE_IMAGE: ${BASE_IMAGE}
15-
SERVER_PORT: ${SERVER_PORT}
16-
JAR_FILENAME: ${JAR_FILENAME}
17-
JAR_FILE_PATH: ${JAR_FILE_PATH}
18-
CP_BACKEND_URL: ${CP_BACKEND_URL}
19-
CJSCPPUID: ${CJSCPPUID}
20-
environment:
21-
- SERVER_PORT=${SERVER_PORT:-4550}
225
ports:
23-
- "${SERVER_PORT:-4550}:${SERVER_PORT:-4550}"
24-
networks:
25-
- service-network
26-
healthcheck:
27-
test: [ "CMD", "curl", "-f", "http://localhost:${SERVER_PORT}/health" ]
28-
interval: 30s
29-
timeout: 10s
30-
retries: 3
31-
start_period: 5s
32-
33-
networks:
34-
service-network:
35-
name: service-cp-caseadmin-case-urn-mapper-network
6+
- "4550:4550"

gradle/buildinfo.gradle

Lines changed: 0 additions & 8 deletions
This file was deleted.

gradle/dependency.gradle

Lines changed: 0 additions & 10 deletions
This file was deleted.

gradle/github/dependency.gradle

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
// check dependencies upon release ONLY
2+
tasks.named("dependencyUpdates").configure {
3+
def isNonStable = { String version ->
4+
def stableKeyword = ['RELEASE', 'FINAL', 'GA'].any { qualifier -> version.toUpperCase().contains(qualifier) }
5+
def regex = /^[0-9,.v-]+$/
6+
return !stableKeyword && !(version ==~ regex)
7+
}
8+
rejectVersionIf {
9+
isNonStable(it.candidate.version) && !isNonStable(it.currentVersion)
10+
}
11+
}

gradle/github/jar.gradle

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
jar {
2+
enabled = true
3+
archiveClassifier.set('plain')
4+
manifest {
5+
attributes(
6+
'Implementation-Title': project.name,
7+
'Implementation-Version': project.version.toString()
8+
)
9+
}
10+
if (file("CHANGELOG.md").exists()) {
11+
from('CHANGELOG.md') {
12+
into 'META-INF'
13+
}
14+
} else {
15+
println "⚠️ CHANGELOG.md not found, skipping inclusion in JAR"
16+
}
17+
}
18+
19+
bootJar {
20+
archiveFileName = "${rootProject.name}-${project.version}.jar"
21+
22+
manifest {
23+
attributes('Implementation-Version': project.version.toString())
24+
}
25+
}
26+
27+
tasks.named('composeBuild') {
28+
dependsOn tasks.named('bootJar')
29+
}
30+
31+
tasks.withType(AbstractArchiveTask).configureEach {
32+
preserveFileTimestamps = false
33+
reproducibleFileOrder = true
34+
}

gradle/github/java.gradle

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
java {
2+
sourceCompatibility = JavaVersion.VERSION_21
3+
targetCompatibility = JavaVersion.VERSION_21
4+
}
5+
tasks.withType(JavaCompile).configureEach {
6+
options.compilerArgs << "-Xlint:unchecked" << "-Werror"
7+
}
8+
9+
// https://github.com/gradle/gradle/issues/16791
10+
tasks.withType(JavaExec).configureEach {
11+
javaLauncher.set(javaToolchains.launcherFor(java.toolchain))
12+
}

gradle/github/pmd.gradle

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
apply plugin: 'pmd'
2+
3+
pmd {
4+
ruleSets = []
5+
ruleSetFiles = files(".github/pmd-ruleset.xml")
6+
ignoreFailures = false
7+
}
8+
9+
tasks.named("pmdMain").configure {
10+
onlyIf { gradle.startParameter.taskNames.contains(name) }
11+
}
12+
13+
tasks.named("pmdTest").configure {
14+
enabled = false
15+
}
16+
17+
tasks.withType(Pmd) {
18+
reports {
19+
xml.required.set(true)
20+
html.required.set(true)
21+
}
22+
}
23+
24+
tasks.withType(Checkstyle).configureEach {
25+
def generatedDir = file("${layout.buildDirectory.get().asFile.absolutePath}/generated/src/main/java").canonicalPath
26+
source = source.filter { file ->
27+
!file.canonicalPath.startsWith(generatedDir)
28+
}
29+
}

gradle/github/repositories.gradle

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
def githubActor = project.findProperty("github.actor") ?: System.getenv("GITHUB_ACTOR")
2+
def githubToken = project.findProperty("github.token") ?: System.getenv("GITHUB_TOKEN")
3+
def githubRepo = System.getenv("GITHUB_REPOSITORY")
4+
5+
def azureADOArtifactRepository = 'https://pkgs.dev.azure.com/hmcts/Artifacts/_packaging/hmcts-lib/maven/v1'
6+
def azureADOArtifactActor = System.getenv("AZURE_DEVOPS_ARTIFACT_USERNAME")
7+
def azureADOArtifactToken = System.getenv("AZURE_DEVOPS_ARTIFACT_TOKEN")
8+
9+
repositories {
10+
mavenLocal()
11+
mavenCentral()
12+
maven {
13+
url = azureADOArtifactRepository
14+
}
15+
}
16+
17+
publishing {
18+
publications {
19+
mavenJava(MavenPublication) {
20+
artifact(tasks.named('bootJar'))
21+
artifact(tasks.named('jar'))
22+
pom {
23+
name = project.name
24+
url = "https://github.com/${githubRepo ?: 'org/repo'}"
25+
}
26+
}
27+
}
28+
repositories {
29+
maven {
30+
name = "GitHubPackages"
31+
url = uri("https://maven.pkg.github.com/$githubRepo")
32+
credentials {
33+
username = githubActor
34+
password = githubToken
35+
}
36+
}
37+
maven {
38+
name = "AzureArtifacts"
39+
url = uri(azureADOArtifactRepository)
40+
credentials {
41+
username = azureADOArtifactActor
42+
password = azureADOArtifactToken
43+
}
44+
}
45+
}
46+
}

0 commit comments

Comments
 (0)