diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 83c93a4e..c4b8d14d 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -76,4 +76,4 @@ jobs: uses: github/codeql-action/analyze@9e8d0789d4a0fa9ceb6b1738f7e269594bdd67f0 # v3.28.9 - name: Check dependencies with Gradle if: ${{ github.repository_owner == 'nagyesta' }} - run: ./gradlew ossIndexAudit -PossIndexUsername=${{ secrets.OSS_INDEX_USER }} -PossIndexPassword=${{ secrets.OSS_INDEX_PASSWORD }} + run: ./gradlew ossIndexAudit -PossIndexUsername=${{ secrets.OSS_INDEX_USER }} -PossIndexPassword=${{ secrets.OSS_INDEX_PASSWORD }} --info diff --git a/.github/workflows/gradle-oss-index-scan.yml b/.github/workflows/gradle-oss-index-scan.yml index 17133bb4..ba42d251 100644 --- a/.github/workflows/gradle-oss-index-scan.yml +++ b/.github/workflows/gradle-oss-index-scan.yml @@ -26,4 +26,4 @@ jobs: - name: Setup Gradle uses: gradle/actions/setup-gradle@94baf225fe0a508e581a564467443d0e2379123b # v4.3.0 - name: Check dependencies with Gradle - run: ./gradlew ossIndexAudit -PossIndexUsername=${{ secrets.OSS_INDEX_USER }} -PossIndexPassword=${{ secrets.OSS_INDEX_PASSWORD }} + run: ./gradlew ossIndexAudit -PossIndexUsername=${{ secrets.OSS_INDEX_USER }} -PossIndexPassword=${{ secrets.OSS_INDEX_PASSWORD }} --info diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml index 3ac174e0..ae21aec4 100644 --- a/.idea/inspectionProfiles/Project_Default.xml +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -24,6 +24,7 @@ - \ No newline at end of file + diff --git a/README.md b/README.md index bd1eafdc..d69800d3 100644 --- a/README.md +++ b/README.md @@ -242,5 +242,5 @@ Used for metadata endpoints - Some encryption/signature algorithms are not supported. Please refer to the ["Features"](#features) section for the up-to-date list of supported algorithms. - Only self-signed certificates are supported by the certificate API. -- Time shift cannot renew/recreate deleted certificates. Please consider performing deletions after time shift as a work around. +- Time shift cannot renew/recreate deleted certificates. Please consider performing deletions after time shift as a workaround. - Recovery options cannot be configured for vaults created during start-up diff --git a/build.gradle b/build.gradle deleted file mode 100644 index a0aded5e..00000000 --- a/build.gradle +++ /dev/null @@ -1,268 +0,0 @@ -plugins { - alias(libs.plugins.versioner) - alias(libs.plugins.index.scan) - alias(libs.plugins.owasp.dependencycheck) - alias(libs.plugins.nexus.publish.plugin) - alias libs.plugins.cyclonedx.bom apply false - alias libs.plugins.licensee.plugin apply false -} - -group = 'com.github.nagyesta.lowkey-vault' - -apply from: "config/ossindex/ossIndexAudit.gradle" - -project.ext { - gitToken = project.hasProperty('githubToken') ? (project.property('githubToken') as String) : '' - gitUser = project.hasProperty('githubUser') ? (project.property('githubUser') as String) : '' - ossrhUser = project.hasProperty('ossrhUsername') ? (project.property('ossrhUsername') as String) : '' - ossrhPass = project.hasProperty('ossrhPassword') ? (project.property('ossrhPassword') as String) : '' - ossIndexUser = project.hasProperty('ossIndexUsername') ? (project.property('ossIndexUsername') as String) : '' - ossIndexPass = project.hasProperty('ossIndexPassword') ? (project.property('ossIndexPassword') as String) : '' - keyToolDir = project.hasProperty('keyToolDir') ? (project.property('keyToolDir') as String) : '' - dockerAbortGroups = project.hasProperty('dockerSuppressGroups') ? 'all' : '' - dockerSuppressGroups = project.hasProperty('dockerSuppressGroups') ? (project.property('dockerSuppressGroups') as String) : '' - repoUrl = 'https://github.com/nagyesta/lowkey-vault' - licenseName = 'MIT License' - licenseUrl = 'https://raw.githubusercontent.com/nagyesta/lowkey-vault/main/LICENSE' - maintainerId = 'nagyesta' - maintainerName = 'Istvan Zoltan Nagy' - maintainerUrl = 'https://github.com/nagyesta/' - scmConnection = 'scm:git:https://github.com/nagyesta/lowkey-vault.git' - scmProjectUrl = 'https://github.com/nagyesta/lowkey-vault/' -} - -versioner { - startFrom { - major = 0 - minor = 0 - patch = 1 - } - match { - major = '{major}' - minor = '{minor}' - patch = '{patch}' - } - pattern { - pattern = "%M.%m.%p" - } - git { - authentication { - https { - token = project.ext.gitToken - } - } - } - tag { - prefix = 'v' - useCommitMessage = true - } -} - -configure(subprojects.findAll({ - !'lowkey-vault-docker'.equalsIgnoreCase(it.name) -})) { - apply plugin: 'java' - apply plugin: 'checkstyle' - apply plugin: 'jacoco' - apply plugin: 'maven-publish' - apply plugin: 'signing' - apply plugin: 'org.sonatype.gradle.plugins.scan' - apply plugin: 'org.owasp.dependencycheck' - apply plugin: 'org.cyclonedx.bom' - apply plugin: 'app.cash.licensee' - - versioner.apply() - - version = rootProject.version - //noinspection GroovyUnusedAssignment - repositories { - mavenCentral() - } - - javadoc.options.addStringOption('Xdoclint:none', '-quiet') - - jacocoTestReport { - reports { - xml.required.set(true) - xml.outputLocation.set(layout.buildDirectory.file("reports/jacoco/report.xml").get().getAsFile()) - csv.required.set(false) - html.required.set(true) - html.outputLocation.set(layout.buildDirectory.dir("reports/jacoco/html").get().getAsFile()) - } - } - - test.finalizedBy jacocoTestReport - jacocoTestReport.finalizedBy jacocoTestCoverageVerification - - jacoco { - toolVersion = libs.versions.jacoco.get() - } - - jacocoTestCoverageVerification { - inputs.file(layout.buildDirectory.file("reports/jacoco/report.xml").get().getAsFile()) - outputs.file(layout.buildDirectory.file("reports/jacoco/jacocoTestCoverageVerification").get().getAsFile()) - - violationRules { - rule { - limit { - counter = 'LINE' - value = 'COVEREDRATIO' - minimum = 0.8 - } - limit { - counter = 'BRANCH' - value = 'COVEREDRATIO' - minimum = 0.8 - } - excludes = [] - } - rule { - element = 'CLASS' - limit { - counter = 'LINE' - value = 'COVEREDRATIO' - minimum = 0.5 - } - limit { - counter = 'BRANCH' - value = 'COVEREDRATIO' - minimum = 0.5 - } - excludes = [ - 'com.github.nagyesta.lowkeyvault.LowkeyVaultApp', - 'com.github.nagyesta.lowkeyvault.AppConfiguration', - 'com.github.nagyesta.lowkeyvault.service.exception.AlreadyExistsException', - 'com.github.nagyesta.lowkeyvault.service.exception.NotFoundException', - 'com.github.nagyesta.lowkeyvault.service.exception.CryptoException', - 'com.github.nagyesta.lowkeyvault.exception.VaultNotFoundException' - ] - } - } - doLast { - layout.buildDirectory.file("reports/jacoco/jacocoTestCoverageVerification").get().getAsFile().write("Passed") - } - } - jar.dependsOn check - - tasks.withType(Checkstyle).configureEach { - configProperties = [base_dir: rootDir.toString(), cache_file: layout.buildDirectory.file("checkstyle/cacheFile").get().getAsFile()] - reports { - xml.required.set(false) - html.required.set(true) - html.stylesheet resources.text - .fromFile(rootProject.file('config/checkstyle/checkstyle-stylesheet.xsl') as String) - } - } - checkstyle.toolVersion = libs.versions.checkstyle.get() - - - cyclonedxBom { - includeConfigs = ["runtimeClasspath"] - skipConfigs = ["compileClasspath", "testCompileClasspath"] - skipProjects = [] - projectType = project.name.endsWith("app") ? "application" : "library" - schemaVersion = "1.5" - destination = file("build/reports") - outputName = "bom" - outputFormat = "json" - //noinspection UnnecessaryQualifiedReference - final def attachmentText = new org.cyclonedx.model.AttachmentText() - attachmentText.setText(file("${project.rootProject.projectDir}/LICENSE").readBytes().encodeBase64().toString()) - attachmentText.setEncoding("base64") - attachmentText.setContentType("text/plain") - //noinspection UnnecessaryQualifiedReference - final def license = new org.cyclonedx.model.License() - license.setName(project.rootProject.ext.licenseName) - license.setLicenseText(attachmentText) - license.setUrl(project.rootProject.ext.licenseUrl) - setLicenseChoice { - it.addLicense(license) - } - } - - licensee { - allow("Apache-2.0") - allow("MIT") - allow("MIT-0") - allow("EPL-1.0") - allow("EPL-2.0") - allow("BSD-2-Clause") - allowUrl("https://www.bouncycastle.org/licence.html") - allowUrl("https://github.com/openjdk/nashorn/blob/main/LICENSE") - allowUrl("https://github.com/swagger-api/swagger-ui") - allowUrl("http://www.eclipse.org/legal/epl-2.0") - allowUrl("http://www.eclipse.org/org/documents/edl-v10.php") - allowUrl("https://asm.ow2.io/license.html") - allowUrl("https://github.com/webjars/webjars-locator-lite/blob/main/LICENSE.md") - ignoreDependencies("org.apache.tomcat", "tomcat-servlet-api") - unusedAction("IGNORE") - } - - tasks.register('copyLegalDocs', Copy.class) { - from file("${project.rootProject.projectDir}/LICENSE") - from layout.buildDirectory.file("reports/licensee/artifacts.json").get().asFile - from layout.buildDirectory.file("reports/bom.json").get().asFile - into layout.buildDirectory.dir("resources/main/META-INF").get().asFile - rename('artifacts.json', 'dependency-licenses.json') - rename('bom.json', 'SBOM.json') - } - //noinspection ConfigurationAvoidance - tasks.copyLegalDocs.dependsOn(tasks.licensee) - tasks.copyLegalDocs.dependsOn(tasks.cyclonedxBom) - tasks.javadoc.dependsOn(tasks.copyLegalDocs) - tasks.compileTestJava.dependsOn(tasks.copyLegalDocs) - tasks.checkstyleMain.dependsOn(tasks.copyLegalDocs) - tasks.processResources.finalizedBy(tasks.copyLegalDocs) - - publishing { - repositories { - maven { - name = "GitHubPackages" - url = uri("https://maven.pkg.github.com/nagyesta/lowkey-vault") - credentials { - username = rootProject.ext.gitUser - password = rootProject.ext.gitToken - } - } - } - } - - //Disable metadata publishing and rely on Maven only - tasks.withType(GenerateModuleMetadata).configureEach { - enabled = false - } - - ossIndexAudit { - username = rootProject.ext.ossIndexUser - password = rootProject.ext.ossIndexPass - printBanner = false - colorEnabled = true - showAll = false - outputFormat = 'DEPENDENCY_GRAPH' - excludeVulnerabilityIds = rootProject.ext.ossIndexExclusions - } -} - -nexusPublishing { - repositories { - sonatype { - username = project.ext.ossrhUser - password = project.ext.ossrhPass - } - } -} - -ossIndexAudit { - username = rootProject.ext.ossIndexUser - password = rootProject.ext.ossIndexPass - printBanner = false - colorEnabled = true - showAll = false - outputFormat = 'DEPENDENCY_GRAPH' - excludeVulnerabilityIds = rootProject.ext.ossIndexExclusions -} - -repositories { - mavenCentral() -} - diff --git a/build.gradle.kts b/build.gradle.kts new file mode 100644 index 00000000..ceb270bd --- /dev/null +++ b/build.gradle.kts @@ -0,0 +1,273 @@ +import org.sonatype.gradle.plugins.scan.ossindex.OutputFormat +import java.util.* + +plugins { + id("java") + jacoco + checkstyle + alias(libs.plugins.versioner) + alias(libs.plugins.index.scan) + alias(libs.plugins.owasp.dependencycheck) + alias(libs.plugins.nexus.publish.plugin) + alias(libs.plugins.cyclonedx.bom) +} + +group = "com.github.nagyesta.lowkey-vault" + +apply("config/ossindex/ossIndexAudit.gradle.kts") + +buildscript { + fun optionalPropertyString(name: String): String { + return if (project.hasProperty(name)) { + project.property(name) as String + } else { + "" + } + } + + fun dockerAbortGroups(name: String): String { + return if (project.hasProperty(name)) { + "all" + } else { + "" + } + } + + // Define versions in a single place + extra.apply { + set("gitToken", optionalPropertyString("githubToken")) + set("gitUser", optionalPropertyString("githubUser")) + set("ossrhUser", optionalPropertyString("ossrhUsername")) + set("ossrhPass", optionalPropertyString("ossrhPassword")) + set("ossIndexUser", optionalPropertyString("ossIndexUsername")) + set("ossIndexPass", optionalPropertyString("ossIndexPassword")) + set("keyToolDir", optionalPropertyString("keyToolDir")) + set("dockerAbortGroups", dockerAbortGroups("dockerSuppressGroups")) + set("dockerSuppressGroups", optionalPropertyString("dockerSuppressGroups")) + set("repoUrl", "https://github.com/nagyesta/lowkey-vault") + set("licenseName", "MIT License") + set("licenseUrl", "https://raw.githubusercontent.com/nagyesta/lowkey-vault/main/LICENSE") + set("maintainerId", "nagyesta") + set("maintainerName", "Istvan Zoltan Nagy") + set("maintainerUrl", "https://github.com/nagyesta/") + set("scmConnection", "scm:git:https://github.com/nagyesta/lowkey-vault.git") + set("scmProjectUrl", "https://github.com/nagyesta/lowkey-vault/") + set("githubMavenRepoUrl", "https://maven.pkg.github.com/nagyesta/lowkey-vault") + set("ossrhMavenRepoUrl", "https://oss.sonatype.org/service/local/staging/deploy/maven2") + } +} + +versioner { + startFrom { + major = 0 + minor = 0 + patch = 1 + } + match { + major = "{major}" + minor = "{minor}" + patch = "{patch}" + } + pattern { + pattern = "%M.%m.%p" + } + git { + authentication { + https { + token = project.extra.get("gitToken").toString() + } + } + } + tag { + prefix = "v" + useCommitMessage = true + } +} + +versioner.apply() + +subprojects { + if (project.name != "lowkey-vault-docker") { + apply(plugin = "java") + apply(plugin = "org.gradle.jacoco") + apply(plugin = "org.gradle.checkstyle") + apply(plugin = "org.gradle.signing") + apply(plugin = "org.sonatype.gradle.plugins.scan") + apply(plugin = "org.owasp.dependencycheck") + apply(plugin = "org.cyclonedx.bom") + + group = rootProject.group + version = rootProject.version + + repositories { + mavenCentral() + } + + tasks.javadoc.configure { + (options as StandardJavadocDocletOptions).addBooleanOption("Xdoclint:none", true) + (options as StandardJavadocDocletOptions).addBooleanOption("Xdoclint:-missing", true) + } + + jacoco { + toolVersion = rootProject.libs.versions.jacoco.get() + } + + tasks.jacocoTestReport { + reports { + xml.required.set(true) + xml.outputLocation.set(layout.buildDirectory.file("reports/jacoco/report.xml")) + csv.required.set(false) + html.required.set(true) + html.outputLocation.set(layout.buildDirectory.dir("reports/jacoco/html")) + } + dependsOn(tasks.test) + finalizedBy(tasks.getByName("jacocoTestCoverageVerification")) + } + + tasks.withType().configureEach { + inputs.file(layout.buildDirectory.file("reports/jacoco/report.xml")) + outputs.file(layout.buildDirectory.file("reports/jacoco/jacocoTestCoverageVerification")) + + violationRules { + rule { + limit { + counter = "LINE" + value = "COVEREDRATIO" + minimum = BigDecimal.valueOf(0.8) + } + limit { + counter = "BRANCH" + value = "COVEREDRATIO" + minimum = BigDecimal.valueOf(0.8) + } + excludes = listOf() + } + rule { + element = "CLASS" + limit { + counter = "LINE" + value = "COVEREDRATIO" + minimum = BigDecimal.valueOf(0.5) + } + limit { + counter = "BRANCH" + value = "COVEREDRATIO" + minimum = BigDecimal.valueOf(0.5) + } + excludes = mutableListOf( + "com.github.nagyesta.lowkeyvault.LowkeyVaultApp", + "com.github.nagyesta.lowkeyvault.AppConfiguration", + "com.github.nagyesta.lowkeyvault.service.exception.AlreadyExistsException", + "com.github.nagyesta.lowkeyvault.service.exception.NotFoundException", + "com.github.nagyesta.lowkeyvault.service.exception.CryptoException", + "com.github.nagyesta.lowkeyvault.exception.VaultNotFoundException" + ) + } + } + doLast { + layout.buildDirectory.file("reports/jacoco/jacocoTestCoverageVerification").get().asFile.writeText("Passed") + } + } + + tasks.jar.configure { + dependsOn(tasks.check) + } + + tasks.withType().configureEach { + configProperties = mutableMapOf( + "base_dir" to rootDir.absolutePath.toString(), + "cache_file" to layout.buildDirectory.file("checkstyle/cacheFile").get().asFile.absolutePath.toString() + ) + checkstyle.toolVersion = rootProject.libs.versions.checkstyle.get() + checkstyle.configFile = rootProject.file("config/checkstyle/checkstyle.xml") + reports { + xml.required.set(false) + html.required.set(true) + html.stylesheet = rootProject.resources.text.fromFile("config/checkstyle/checkstyle-stylesheet.xsl") + } + } + + //Disable metadata publishing and rely on Maven only + tasks.withType().configureEach { + enabled = false + } + + + ossIndexAudit { + username = rootProject.extra.get("ossIndexUser").toString() + password = rootProject.extra.get("ossIndexPass").toString() + isPrintBanner = false + isColorEnabled = true + isShowAll = false + outputFormat = OutputFormat.DEFAULT + @Suppress("UNCHECKED_CAST") + excludeVulnerabilityIds = rootProject.extra.get("ossIndexExclusions") as MutableSet + } + + tasks.cyclonedxBom { + if (project.name.endsWith("app")) { + setProjectType("application") + } else { + setProjectType("library") + } + setIncludeConfigs(listOf("runtimeClasspath")) + setSkipConfigs(listOf("compileClasspath", "testCompileClasspath")) + setSkipProjects(listOf()) + setSchemaVersion("1.5") + setDestination(file("build/reports")) + setOutputName("bom") + setOutputFormat("json") + //noinspection UnnecessaryQualifiedReference + val attachmentText = org.cyclonedx.model.AttachmentText() + attachmentText.text = Base64.getEncoder().encodeToString( + file("${project.rootProject.projectDir}/LICENSE").readBytes() + ) + attachmentText.encoding = "base64" + attachmentText.contentType = "text/plain" + //noinspection UnnecessaryQualifiedReference + val license = org.cyclonedx.model.License() + license.name = "MIT License" + license.setLicenseText(attachmentText) + license.url = "https://raw.githubusercontent.com/nagyesta/lowkey-vault/main/LICENSE" + setLicenseChoice { + it.addLicense(license) + } + } + } +} + +ossIndexAudit { + username = rootProject.extra.get("ossIndexUser").toString() + password = rootProject.extra.get("ossIndexPass").toString() + isPrintBanner = false + isColorEnabled = true + isShowAll = false + outputFormat = OutputFormat.DEFAULT + @Suppress("UNCHECKED_CAST") + excludeVulnerabilityIds = rootProject.extra.get("ossIndexExclusions") as MutableSet +} + +checkstyle { + toolVersion = rootProject.libs.versions.checkstyle.get() +} + +repositories { + mavenCentral() +} + +tasks.jacocoTestReport { + reports { + xml.required.set(false) + html.required.set(false) + csv.required.set(false) + } +} + +nexusPublishing { + repositories { + sonatype { + username = rootProject.extra.get("ossrhUser").toString() + password = rootProject.extra.get("ossrhPass").toString() + } + } +} diff --git a/config/ossindex/ossIndexAudit.gradle b/config/ossindex/ossIndexAudit.gradle deleted file mode 100644 index bb25bd95..00000000 --- a/config/ossindex/ossIndexAudit.gradle +++ /dev/null @@ -1,10 +0,0 @@ -def readExclusions() { - return rootProject.file("config/ossindex/exclusions.txt").readLines() - .stream() - .filter(s -> !s.isBlank()) - .toArray() -} - -project.ext { - ossIndexExclusions = readExclusions() -} diff --git a/config/ossindex/ossIndexAudit.gradle.kts b/config/ossindex/ossIndexAudit.gradle.kts new file mode 100644 index 00000000..ba8c98a7 --- /dev/null +++ b/config/ossindex/ossIndexAudit.gradle.kts @@ -0,0 +1,11 @@ +buildscript { + fun readExclusions(): MutableSet { + return rootProject.file("config/ossindex/exclusions.txt").readLines() + .stream() + .toList() + .filter { it.isNotBlank() } + .toMutableSet() + } + + extra.set("ossIndexExclusions", readExclusions()) +} diff --git a/gradle.properties b/gradle.properties index 0c7ad002..a99b4fd9 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,5 +4,5 @@ org.gradle.warning.mode=all org.gradle.daemon=true org.gradle.caching=true -org.gradle.jvmargs=-Xmx1g -XX:MaxMetaspaceSize=256m -XX:+HeapDumpOnOutOfMemoryError +org.gradle.jvmargs=-Xmx2g -XX:MaxMetaspaceSize=512m -XX:+HeapDumpOnOutOfMemoryError org.gradle.dependency.verification.console=verbose diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index e5054473..0d0e8881 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -662,6 +662,14 @@ + + + + + + + + @@ -677,6 +685,11 @@ + + + + + @@ -693,6 +706,14 @@ + + + + + + + + @@ -716,6 +737,11 @@ + + + + + @@ -757,6 +783,14 @@ + + + + + + + + @@ -883,6 +917,14 @@ + + + + + + + + @@ -1078,6 +1120,14 @@ + + + + + + + + @@ -1678,6 +1728,14 @@ + + + + + + + + @@ -1704,6 +1762,11 @@ + + + + + @@ -1720,6 +1783,14 @@ + + + + + + + + @@ -2672,6 +2743,11 @@ + + + + + @@ -3029,6 +3105,14 @@ + + + + + + + + @@ -3037,11 +3121,24 @@ + + + + + + + + + + + + + @@ -3050,6 +3147,14 @@ + + + + + + + + @@ -3058,6 +3163,14 @@ + + + + + + + + @@ -3125,22 +3238,17 @@ - - - + + + - - + + - - - - - - - - + + + @@ -3148,6 +3256,11 @@ + + + + + @@ -3456,6 +3569,14 @@ + + + + + + + + @@ -3477,6 +3598,11 @@ + + + + + @@ -3493,6 +3619,14 @@ + + + + + + + + @@ -3514,6 +3648,14 @@ + + + + + + + + diff --git a/lowkey-vault-app/build.gradle b/lowkey-vault-app/build.gradle deleted file mode 100644 index 1a31125f..00000000 --- a/lowkey-vault-app/build.gradle +++ /dev/null @@ -1,165 +0,0 @@ -plugins { - alias(libs.plugins.spring.boot) - id 'java' - alias(libs.plugins.lombok) - alias(libs.plugins.abort.mission) -} - -group = "${rootProject.group}" - -project.ext { - artifactDisplayName = "Lowkey Vault - App" - artifactDescription = "Assembled application of Lowkey Vault." -} - -dependencies { - implementation libs.bundles.spring.boot.app - implementation libs.bundles.logback - implementation libs.bundles.tomcat - implementation libs.bouncycastle.bcpkix - implementation libs.hibernate.validator - implementation libs.handlebars - implementation libs.findbugs.jsr305 - implementation libs.springdoc.openapi.ui - annotationProcessor libs.lombok - annotationProcessor libs.spring.boot.configuration.processor - testImplementation libs.bundles.spring.test - testImplementation libs.jupiter - testImplementation libs.abort.mission.jupiter -} - -java { - sourceCompatibility = JavaVersion.VERSION_17 - toolchain { - languageVersion = JavaLanguageVersion.of(17) - } - withJavadocJar() - withSourcesJar() -} - -test { - outputs.file(layout.buildDirectory.file("reports/abort-mission/abort-mission-report.json").get().getAsFile()) - useJUnitPlatform() - systemProperty("junit.jupiter.extensions.autodetection.enabled", true) - systemProperty("junit.jupiter.execution.parallel.enabled", true) - systemProperty("junit.jupiter.execution.parallel.mode.default", "same_thread") - systemProperty("junit.jupiter.execution.parallel.mode.classes.default", "concurrent") -} - -abortMission { - toolVersion libs.versions.abortMission.get() -} - -processResources { - inputs.property('version', project.version) - filesMatching('application.properties') { - expand(project.properties) - } -} - -jar { - enabled = false -} - -bootJar { - archiveVersion.value(project.version as String) -} -tasks.resolveMainClassName.dependsOn("copyLegalDocs") - -tasks.register('regenerateCertJks', Exec) { - outputs.file("${project.projectDir}/src/main/resources/cert/keystore.jks") - workingDir file("${project.projectDir}/src/main/resources/cert") - outputs.upToDateWhen { false } - - //generate key in JKS with JDK15+ keytool to allow wildcard SAN - commandLine "${project.property('keyToolDir') ?: ''}/keytool", - '-genkeypair', - '-alias', 'lowkey-vault.local', - '-keyalg', 'RSA', - '-keysize', '4096', - '-validity', '3650', - '-dname', 'CN=lowkey-vault.local', - '-keypass', 'changeit', - '-keystore', 'keystore.jks', - '-storeType', 'JKS', - '-storepass', 'changeit', - '-ext', 'SAN=dns:lowkey-vault.local,dns:lowkey-vault,dns:*.localhost,dns:*.lowkey-vault,dns:*.lowkey-vault.local,dns:*.default.svc.cluster.local,dns:localhost,ip:127.0.0.1' - - doFirst { - file("${project.projectDir}/src/main/resources/cert/keystore.jks").delete() - } - - logging.captureStandardOutput LogLevel.INFO - logging.captureStandardError LogLevel.ERROR -} -tasks.register('regenerateCert', Exec) { - outputs.file("${project.projectDir}/src/main/resources/cert/keystore.p12") - outputs.file("${project.projectDir}/src/main/resources/cert/keystore.jks") - inputs.file("${project.projectDir}/src/main/resources/cert/keystore.jks") - workingDir file("${project.projectDir}/src/main/resources/cert") - outputs.upToDateWhen { false } - dependsOn tasks.regenerateCertJks - //convert to P12 using the old keytool to fix algorithm issues when used with old JDK (and still use P12) - commandLine 'keytool', - '-importkeystore', - '-srckeystore', 'keystore.jks', - '-srcstorepass', 'changeit', - '-srcstoretype', 'JKS', - '-destkeystore', 'keystore.p12', - '-deststorepass', 'changeit', - '-deststoretype', 'pkcs12' - - doFirst { - file("${project.projectDir}/src/main/resources/cert/keystore.p12").delete() - } - doLast { - file("${project.projectDir}/src/main/resources/cert/keystore.jks").delete() - } - - logging.captureStandardOutput LogLevel.INFO - logging.captureStandardError LogLevel.ERROR -} - -publishing { - publications { - mavenJava(MavenPublication) { - from components.java - artifact bootJar - artifactId = "${project.name}" - pom { - name = "${project.artifactDisplayName}" - description = "${project.artifactDescription}" - url = rootProject.ext.repoUrl - packaging = "jar" - licenses { - license { - name = rootProject.ext.licenseName - url = rootProject.ext.licenseUrl - } - } - developers { - developer { - id = rootProject.ext.maintainerId - name = rootProject.ext.maintainerName - url = rootProject.ext.maintainerUrl - } - } - scm { - connection = rootProject.ext.scmConnection - developerConnection = rootProject.ext.scmConnection - url = rootProject.ext.scmProjectUrl - } - withXml { - asNode().dependencies.findAll() { - def parent = it.parent() - parent.remove(it) - } - } - } - } - } -} - -signing { - sign publishing.publications.mavenJava -} diff --git a/lowkey-vault-app/build.gradle.kts b/lowkey-vault-app/build.gradle.kts new file mode 100644 index 00000000..dd9d9ccb --- /dev/null +++ b/lowkey-vault-app/build.gradle.kts @@ -0,0 +1,222 @@ +@file:Suppress("SpellCheckingInspection") + +import groovy.util.Node +import groovy.util.NodeList +import org.apache.tools.ant.filters.ReplaceTokens +import org.springframework.boot.gradle.tasks.bundling.BootJar + + +plugins { + id("java") + signing + `maven-publish` + alias(libs.plugins.spring.boot) + alias(libs.plugins.lombok) + alias(libs.plugins.abort.mission) + alias(libs.plugins.licensee.plugin) +} + +group = rootProject.group + +extra.apply { + set("artifactDisplayName", "Lowkey Vault - App") + set("artifactDescription", "Assembled application of Lowkey Vault.") +} + +dependencies { + implementation(libs.bundles.spring.boot.app) + implementation(libs.bundles.logback) + implementation(libs.bundles.tomcat) + implementation(libs.bouncycastle.bcpkix) + implementation(libs.hibernate.validator) + implementation(libs.handlebars) + implementation(libs.findbugs.jsr305) + implementation(libs.springdoc.openapi.ui) + annotationProcessor(libs.lombok) + annotationProcessor(libs.spring.boot.configuration.processor) + testImplementation(libs.bundles.spring.test) + testImplementation(libs.jupiter) + testImplementation(libs.abort.mission.jupiter) +} + +licensee { + allow("Apache-2.0") + allow("MIT") + allow("EPL-1.0") + allow("EPL-2.0") + allowUrl("https://www.bouncycastle.org/licence.html") + allowUrl("https://github.com/openjdk/nashorn/blob/main/LICENSE") + allowUrl("http://www.eclipse.org/legal/epl-2.0") + allowUrl("http://www.eclipse.org/org/documents/edl-v10.php") + allowUrl("https://asm.ow2.io/license.html") + allowUrl("https://github.com/webjars/webjars-locator-lite/blob/main/LICENSE.md") + ignoreDependencies("org.apache.tomcat", "tomcat-servlet-api") +} + +java { + sourceCompatibility = JavaVersion.VERSION_17 + toolchain { + languageVersion = JavaLanguageVersion.of(17) + } + withJavadocJar() + withSourcesJar() +} + +val copyLegalDocs = tasks.register("copyLegalDocs") { + from(file("${project.rootProject.projectDir}/LICENSE")) + from(layout.buildDirectory.file("reports/licensee/artifacts.json").get().asFile) + from(layout.buildDirectory.file("reports/bom.json").get().asFile) + into(layout.buildDirectory.dir("resources/main/META-INF").get().asFile) + rename("artifacts.json", "dependency-licenses.json") + rename("bom.json", "SBOM.json") +}.get() +copyLegalDocs.dependsOn(tasks.licensee) +copyLegalDocs.dependsOn(tasks.cyclonedxBom) +tasks.javadoc.get().dependsOn(copyLegalDocs) +tasks.compileJava.get().dependsOn(copyLegalDocs) +tasks.processResources.get().finalizedBy(copyLegalDocs) + +tasks.test { + outputs.file(layout.buildDirectory.file("reports/abort-mission/abort-mission-report.json").get().asFile) + useJUnitPlatform { + systemProperty("junit.jupiter.extensions.autodetection.enabled", true) + systemProperty("junit.jupiter.execution.parallel.enabled", true) + systemProperty("junit.jupiter.execution.parallel.mode.default", "same_thread") + systemProperty("junit.jupiter.execution.parallel.mode.classes.default", "concurrent") + } + finalizedBy(tasks.getByName("jacocoTestReport")) +} + +project.tasks.processResources { + val tokens = mapOf("version" to project.version) + filesMatching("**/application.properties") { + filter("tokens" to tokens) + } +} + +abortMission { + toolVersion = libs.versions.abortMission.get() +} + +tasks.getByName("jar") { + enabled = false +} + +tasks.getByName("bootJar") { + inputs.property("version", project.version) + archiveVersion.value(project.version as String) +} +tasks.getByName("resolveMainClassName") { + dependsOn(tasks.named("copyLegalDocs")) +} + +tasks.register("regenerateCertJks") { + outputs.file("${project.projectDir}/src/main/resources/cert/keystore.jks") + workingDir(file("${project.projectDir}/src/main/resources/cert")) + outputs.upToDateWhen { false } + + //generate key in JKS with JDK15+ keytool to allow wildcard SAN + commandLine = mutableListOf("${project.property("keyToolDir") ?: ""}/keytool", + "-genkeypair", + "-alias", "lowkey-vault.local", + "-keyalg", "RSA", + "-keysize", "4096", + "-validity", "3650", + "-dname", "CN=lowkey-vault.local", + "-keypass", "changeit", + "-keystore", "keystore.jks", + "-storeType", "JKS", + "-storepass", "changeit", + "-ext", "SAN=dns:lowkey-vault.local,dns:lowkey-vault,dns:*.localhost,dns:*.lowkey-vault,dns:*.lowkey-vault.local,dns:*.default.svc.cluster.local,dns:localhost,ip:127.0.0.1") + + doFirst { + file("${project.projectDir}/src/main/resources/cert/keystore.jks").delete() + } + + logging.captureStandardOutput(LogLevel.INFO) + logging.captureStandardError(LogLevel.ERROR) +} +tasks.register("regenerateCert") { + outputs.file("${project.projectDir}/src/main/resources/cert/keystore.p12") + outputs.file("${project.projectDir}/src/main/resources/cert/keystore.jks") + inputs.file("${project.projectDir}/src/main/resources/cert/keystore.jks") + workingDir(file("${project.projectDir}/src/main/resources/cert")) + outputs.upToDateWhen { false } + dependsOn(tasks.getByName("regenerateCertJks")) + //convert to P12 using the old keytool to fix algorithm issues when used with old JDK (and still use P12) + commandLine = mutableListOf("keytool", + "-importkeystore", + "-srckeystore", "keystore.jks", + "-srcstorepass", "changeit", + "-srcstoretype", "JKS", + "-destkeystore", "keystore.p12", + "-deststorepass", "changeit", + "-deststoretype", "pkcs12") + + doFirst { + file("${project.projectDir}/src/main/resources/cert/keystore.p12").delete() + } + doLast { + file("${project.projectDir}/src/main/resources/cert/keystore.jks").delete() + } + + logging.captureStandardOutput(LogLevel.INFO) + logging.captureStandardError(LogLevel.ERROR) +} + +publishing { + repositories { + maven { + name = "GitHubPackages" + url = uri(rootProject.extra.get("githubMavenRepoUrl").toString()) + credentials { + username = rootProject.extra.get("gitUser").toString() + password = rootProject.extra.get("gitToken").toString() + } + } + } + publications { + create("mavenJava") { + from(components["java"]) + artifact(tasks["bootJar"]) + artifactId = project.name + pom { + name.set(project.extra.get("artifactDisplayName").toString()) + description.set(project.extra.get("artifactDescription").toString()) + url.set(rootProject.extra.get("repoUrl").toString()) + packaging = "jar" + licenses { + license { + name.set(rootProject.extra.get("licenseName").toString()) + url.set(rootProject.extra.get("licenseUrl").toString()) + } + } + developers { + developer { + id.set(rootProject.extra.get("maintainerId").toString()) + name.set(rootProject.extra.get("maintainerName").toString()) + email.set(rootProject.extra.get("maintainerUrl").toString()) + } + } + scm { + connection.set(rootProject.extra.get("scmConnection").toString()) + developerConnection.set(rootProject.extra.get("scmConnection").toString()) + url.set(rootProject.extra.get("scmProjectUrl").toString()) + } + } + pom.withXml { + asNode().apply { + (get("dependencies") as NodeList).forEach { depsNode -> + ((depsNode as Node).get("dependency") as NodeList).forEach { depNode -> + depsNode.remove(depNode as Node) + } + } + } + } + } + } +} + +signing { + sign(publishing.publications["mavenJava"]) +} diff --git a/lowkey-vault-app/src/main/java/com/github/nagyesta/lowkeyvault/AppConfiguration.java b/lowkey-vault-app/src/main/java/com/github/nagyesta/lowkeyvault/AppConfiguration.java index 8e2a2f68..154a697f 100644 --- a/lowkey-vault-app/src/main/java/com/github/nagyesta/lowkeyvault/AppConfiguration.java +++ b/lowkey-vault-app/src/main/java/com/github/nagyesta/lowkeyvault/AppConfiguration.java @@ -14,7 +14,6 @@ import org.springframework.util.StringUtils; import org.springframework.web.filter.CommonsRequestLoggingFilter; -import java.io.IOException; import java.net.URI; import java.util.Arrays; import java.util.Optional; @@ -39,7 +38,7 @@ public class AppConfiguration { private boolean useRelaxedPorts; @Bean - public VaultService vaultService() throws IOException { + public VaultService vaultService() { final VaultService service = new VaultServiceImpl(portMapper()); if (!SKIP_AUTO_REGISTRATION.equals(autoRegisterVaults)) { autoRegisterVaults(service); diff --git a/lowkey-vault-app/src/main/java/com/github/nagyesta/lowkeyvault/model/json/util/AbstractBase64ZipDeserializer.java b/lowkey-vault-app/src/main/java/com/github/nagyesta/lowkeyvault/model/json/util/AbstractBase64ZipDeserializer.java index 859db47f..5cdbbc95 100644 --- a/lowkey-vault-app/src/main/java/com/github/nagyesta/lowkeyvault/model/json/util/AbstractBase64ZipDeserializer.java +++ b/lowkey-vault-app/src/main/java/com/github/nagyesta/lowkeyvault/model/json/util/AbstractBase64ZipDeserializer.java @@ -36,12 +36,11 @@ public E deserialize(final JsonParser jsonParser, final DeserializationContext c } private E decompressWrappedObject(final byte[] bytes) { - //noinspection LocalCanBeFinal try (ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes); GZIPInputStream gzipInputStream = new GZIPInputStream(byteArrayInputStream)) { final String json = new String(gzipInputStream.readAllBytes()); return objectMapper.reader().readValue(json, getType()); - } catch (Exception e) { + } catch (final Exception e) { log.error(e.getMessage(), e); throw new IllegalArgumentException("Unable to decompress input."); } diff --git a/lowkey-vault-app/src/main/java/com/github/nagyesta/lowkeyvault/model/json/util/AbstractBase64ZipSerializer.java b/lowkey-vault-app/src/main/java/com/github/nagyesta/lowkeyvault/model/json/util/AbstractBase64ZipSerializer.java index 5f043995..a6f892ce 100644 --- a/lowkey-vault-app/src/main/java/com/github/nagyesta/lowkeyvault/model/json/util/AbstractBase64ZipSerializer.java +++ b/lowkey-vault-app/src/main/java/com/github/nagyesta/lowkeyvault/model/json/util/AbstractBase64ZipSerializer.java @@ -42,7 +42,6 @@ public void serialize(final E value, final JsonGenerator gen, } private String compressObject(final E value) { - //noinspection LocalCanBeFinal try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); GZIPOutputStream gzipOutputStream = new GZIPOutputStream(byteArrayOutputStream)) { final String json = objectMapper.writer().writeValueAsString(value); @@ -51,7 +50,7 @@ private String compressObject(final E value) { gzipOutputStream.finish(); final byte[] byteArray = byteArrayOutputStream.toByteArray(); return base64Serializer.base64Encode(byteArray); - } catch (Exception e) { + } catch (final Exception e) { log.error(e.getMessage(), e); throw new IllegalArgumentException("Unable to compress input."); } diff --git a/lowkey-vault-app/src/main/java/com/github/nagyesta/lowkeyvault/model/json/util/CertificateLifetimeActionDeserializer.java b/lowkey-vault-app/src/main/java/com/github/nagyesta/lowkeyvault/model/json/util/CertificateLifetimeActionDeserializer.java index de4ff8a1..feb811c8 100644 --- a/lowkey-vault-app/src/main/java/com/github/nagyesta/lowkeyvault/model/json/util/CertificateLifetimeActionDeserializer.java +++ b/lowkey-vault-app/src/main/java/com/github/nagyesta/lowkeyvault/model/json/util/CertificateLifetimeActionDeserializer.java @@ -20,7 +20,6 @@ public CertificateLifetimeActionActivity deserialize(final JsonParser parser, fi final TreeNode actionType = node.path(INNER_NODE_NAME); Assert.isTrue(actionType.isValueNode(), "The \"action\" node must have an \"" + INNER_NODE_NAME + "\" child containing the value."); - //noinspection LocalCanBeFinal try (JsonParser textField = actionType.traverse()) { final String value = textField.nextTextValue(); return CertificateLifetimeActionActivity.byValue(value); diff --git a/lowkey-vault-app/src/main/java/com/github/nagyesta/lowkeyvault/service/certificate/impl/CertContentType.java b/lowkey-vault-app/src/main/java/com/github/nagyesta/lowkeyvault/service/certificate/impl/CertContentType.java index 344ec76e..ba14cf88 100644 --- a/lowkey-vault-app/src/main/java/com/github/nagyesta/lowkeyvault/service/certificate/impl/CertContentType.java +++ b/lowkey-vault-app/src/main/java/com/github/nagyesta/lowkeyvault/service/certificate/impl/CertContentType.java @@ -128,11 +128,11 @@ public JsonWebKeyImportRequest getKey(@NonNull final String certificateContent, "-----BEGIN PRIVATE KEY-----", "-----END PRIVATE KEY-----"); final KeyType keyType = assumeKeyType(encodedKey.length); final KeyFactory kf = KeyFactory.getInstance(keyType.getAlgorithmName(), KeyGenUtil.BOUNCY_CASTLE_PROVIDER); - final PKCS8EncodedKeySpec privSpec = new PKCS8EncodedKeySpec(encodedKey); + final PKCS8EncodedKeySpec privateSpec = new PKCS8EncodedKeySpec(encodedKey); if (RSA == keyType) { - return RSA_KEY_CONVERTER.convert((RSAPrivateCrtKey) kf.generatePrivate(privSpec)); + return RSA_KEY_CONVERTER.convert((RSAPrivateCrtKey) kf.generatePrivate(privateSpec)); } else { - return EC_KEY_CONVERTER.convert((BCECPrivateKey) kf.generatePrivate(privSpec)); + return EC_KEY_CONVERTER.convert((BCECPrivateKey) kf.generatePrivate(privateSpec)); } } catch (final Exception e) { throw new CryptoException("Failed to extract key from PEM", e); @@ -159,7 +159,6 @@ private void validatePem(final String certificateContent) { } private String toPemString(final Object object) { - //noinspection LocalCanBeFinal try (StringWriter stringWriter = new StringWriter(); JcaPEMWriter pemWriter = new JcaPEMWriter(stringWriter)) { if (object instanceof PrivateKey) { diff --git a/lowkey-vault-app/src/main/java/com/github/nagyesta/lowkeyvault/service/certificate/impl/KeyVaultCertificateEntity.java b/lowkey-vault-app/src/main/java/com/github/nagyesta/lowkeyvault/service/certificate/impl/KeyVaultCertificateEntity.java index 903d43b0..1138c9c1 100644 --- a/lowkey-vault-app/src/main/java/com/github/nagyesta/lowkeyvault/service/certificate/impl/KeyVaultCertificateEntity.java +++ b/lowkey-vault-app/src/main/java/com/github/nagyesta/lowkeyvault/service/certificate/impl/KeyVaultCertificateEntity.java @@ -118,8 +118,8 @@ public KeyVaultCertificateEntity(@NonNull final String name, * Constructor for certificate renewal. * * @param input The input parameters defining how the certificate should look like. - * @param kid The Id of the key entity version we need to use. - * @param id The Id of the new certificate entity. + * @param kid The ID of the key entity version we need to use. + * @param id The ID of the new certificate entity. * @param vault The vault we are using. */ public KeyVaultCertificateEntity(@NonNull final ReadOnlyCertificatePolicy input, diff --git a/lowkey-vault-app/src/main/java/com/github/nagyesta/lowkeyvault/service/common/BaseVaultEntity.java b/lowkey-vault-app/src/main/java/com/github/nagyesta/lowkeyvault/service/common/BaseVaultEntity.java index 01abb216..8d81da2d 100644 --- a/lowkey-vault-app/src/main/java/com/github/nagyesta/lowkeyvault/service/common/BaseVaultEntity.java +++ b/lowkey-vault-app/src/main/java/com/github/nagyesta/lowkeyvault/service/common/BaseVaultEntity.java @@ -11,7 +11,7 @@ /** * Base interface of vault entities. * - * @param The type of the versioned Id identifying this entity. + * @param The type of the versioned ID identifying this entity. */ public interface BaseVaultEntity extends ReadOnlyDeletedEntity, TimeAware { diff --git a/lowkey-vault-app/src/main/java/com/github/nagyesta/lowkeyvault/service/common/impl/KeyVaultLifecycleAwareEntity.java b/lowkey-vault-app/src/main/java/com/github/nagyesta/lowkeyvault/service/common/impl/KeyVaultLifecycleAwareEntity.java index d11ecf07..3259173a 100644 --- a/lowkey-vault-app/src/main/java/com/github/nagyesta/lowkeyvault/service/common/impl/KeyVaultLifecycleAwareEntity.java +++ b/lowkey-vault-app/src/main/java/com/github/nagyesta/lowkeyvault/service/common/impl/KeyVaultLifecycleAwareEntity.java @@ -1,6 +1,7 @@ package com.github.nagyesta.lowkeyvault.service.common.impl; import lombok.Getter; +import lombok.Setter; import org.springframework.lang.NonNull; import org.springframework.util.Assert; @@ -15,6 +16,7 @@ public class KeyVaultLifecycleAwareEntity { private Optional notBefore; private Optional expiry; private OffsetDateTime updated; + @Setter private boolean enabled; protected KeyVaultLifecycleAwareEntity() { @@ -25,10 +27,6 @@ protected KeyVaultLifecycleAwareEntity() { this.expiry = Optional.empty(); } - public void setEnabled(final boolean enabled) { - this.enabled = enabled; - } - public void setNotBefore(final OffsetDateTime notBefore) { this.notBefore = Optional.ofNullable(notBefore); } diff --git a/lowkey-vault-app/src/main/java/com/github/nagyesta/lowkeyvault/service/key/ReadOnlyDeletedEntity.java b/lowkey-vault-app/src/main/java/com/github/nagyesta/lowkeyvault/service/key/ReadOnlyDeletedEntity.java index ef8e0fde..1139e4aa 100644 --- a/lowkey-vault-app/src/main/java/com/github/nagyesta/lowkeyvault/service/key/ReadOnlyDeletedEntity.java +++ b/lowkey-vault-app/src/main/java/com/github/nagyesta/lowkeyvault/service/key/ReadOnlyDeletedEntity.java @@ -8,7 +8,7 @@ /** * Base interface of deleted vault entities. * - * @param The type of the versioned Id identifying this entity. + * @param The type of the versioned ID identifying this entity. */ public interface ReadOnlyDeletedEntity { diff --git a/lowkey-vault-app/src/main/java/com/github/nagyesta/lowkeyvault/service/secret/impl/KeyVaultSecretEntity.java b/lowkey-vault-app/src/main/java/com/github/nagyesta/lowkeyvault/service/secret/impl/KeyVaultSecretEntity.java index 63e6bdc3..12b55ee3 100644 --- a/lowkey-vault-app/src/main/java/com/github/nagyesta/lowkeyvault/service/secret/impl/KeyVaultSecretEntity.java +++ b/lowkey-vault-app/src/main/java/com/github/nagyesta/lowkeyvault/service/secret/impl/KeyVaultSecretEntity.java @@ -5,11 +5,13 @@ import com.github.nagyesta.lowkeyvault.service.secret.id.VersionedSecretEntityId; import com.github.nagyesta.lowkeyvault.service.vault.VaultFake; import lombok.NonNull; +import lombok.Setter; import org.springframework.lang.Nullable; import org.springframework.util.Assert; public class KeyVaultSecretEntity extends KeyVaultBaseEntity implements ReadOnlyKeyVaultSecretEntity { + @Setter private String value; private final String contentType; private final VersionedSecretEntityId id; @@ -30,10 +32,6 @@ public String getValue() { return value; } - public void setValue(final String value) { - this.value = value; - } - @Override public String getContentType() { return contentType; diff --git a/lowkey-vault-app/src/main/resources/application.properties b/lowkey-vault-app/src/main/resources/application.properties index cd9e5923..1f49d2d5 100644 --- a/lowkey-vault-app/src/main/resources/application.properties +++ b/lowkey-vault-app/src/main/resources/application.properties @@ -1,7 +1,7 @@ # suppress inspection "SpringBootApplicationProperties" -application.version=${version} +application.version=@version@ # suppress inspection "SpringBootApplicationProperties" -application.formatted-version=\\ (v${version}) +application.formatted-version=\\ (v@version@) # suppress inspection "SpringBootApplicationProperties" application.title=Lowkey Vault # diff --git a/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/MissionOutlineDefinition.java b/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/MissionOutlineDefinition.java index 1e5dc2d8..1e5ba109 100644 --- a/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/MissionOutlineDefinition.java +++ b/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/MissionOutlineDefinition.java @@ -17,10 +17,9 @@ public class MissionOutlineDefinition extends MissionOutline { private static Optional> annotationExtractor(final Object o) { - if (!(o instanceof Class)) { + if (!(o instanceof final Class testClass)) { return Optional.empty(); } - final Class testClass = (Class) o; return Optional.of(Arrays.stream(testClass.getAnnotations()) .map(annotation -> annotation.annotationType().getSimpleName()).collect(Collectors.toSet())); } diff --git a/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/ResourceUtils.java b/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/ResourceUtils.java index c05cce89..2feb56cb 100644 --- a/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/ResourceUtils.java +++ b/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/ResourceUtils.java @@ -16,7 +16,6 @@ private ResourceUtils() { } public static String loadResourceAsString(final String resource) { - //noinspection LocalCanBeFinal try (InputStream stream = ResourceUtils.class.getResourceAsStream(resource)) { return StreamUtils.copyToString(stream, StandardCharsets.UTF_8); } catch (final IOException e) { @@ -33,7 +32,6 @@ public static String loadResourceAsBase64String(final String resource) { } public static byte[] loadResourceAsByteArray(final String resource) { - //noinspection LocalCanBeFinal try (InputStream stream = ResourceUtils.class.getResourceAsStream(resource)) { return StreamUtils.copyToByteArray(stream); } catch (final IOException e) { diff --git a/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/controller/VaultManagementControllerTest.java b/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/controller/VaultManagementControllerTest.java index bd3829de..d5ef7b12 100644 --- a/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/controller/VaultManagementControllerTest.java +++ b/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/controller/VaultManagementControllerTest.java @@ -26,8 +26,6 @@ import static com.github.nagyesta.lowkeyvault.TestConstants.NUMBER_OF_SECONDS_IN_10_MINUTES; import static com.github.nagyesta.lowkeyvault.TestConstantsUri.*; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.ArgumentMatchers.same; import static org.mockito.Mockito.*; class VaultManagementControllerTest { diff --git a/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/controller/common/ControllerRequestMappingTest.java b/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/controller/common/ControllerRequestMappingTest.java index 11ae1266..fda91329 100644 --- a/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/controller/common/ControllerRequestMappingTest.java +++ b/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/controller/common/ControllerRequestMappingTest.java @@ -136,23 +136,22 @@ void testControllerEndpointShouldHaveBothMissingAndPresentTrailingSlashWhenAnnot } private static void assertEveryMappingHasBothVersions(final Map, Map>> results) { - results.forEach((clazz, methodMap) -> { - methodMap.forEach((method, pathMappings) -> { - final String className = clazz.getName(); - final String methodName = method.getName(); - Assertions.assertFalse(pathMappings.isEmpty(), - "Method " + methodName + " should have the default path mappings in " + className + ".\n" - + "expected to have both: {\"\", \"/\"}"); - pathMappings.stream() - .filter(path -> !path.endsWith("/")) - .forEach(path -> { - Assertions.assertTrue(pathMappings.contains(path + "/"), - "Method " + methodName + " should have a pair with trailing slash in " + className + ".\n" - + "expected to have both: {\"" + path + "\", \"" + path + "/\"}\n" - + "in: " + pathMappings + "\n"); - }); - }); - }); + results.forEach((clazz, methodMap) -> methodMap + .forEach((method, pathMappings) -> { + final String className = clazz.getName(); + final String methodName = method.getName(); + Assertions.assertFalse(pathMappings.isEmpty(), + "Method " + methodName + " should have the default path mappings in " + className + ".\n" + + "expected to have both: {\"\", \"/\"}"); + pathMappings.stream() + .filter(path -> !path.endsWith("/")) + .forEach(path -> { + Assertions.assertTrue(pathMappings.contains(path + "/"), + "Method " + methodName + " should have a pair with trailing slash in " + className + ".\n" + + "expected to have both: {\"" + path + "\", \"" + path + "/\"}\n" + + "in: " + pathMappings + "\n"); + }); + })); } private Stream> streamAllControllerClasses() { diff --git a/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/controller/common/MetadataControllerTest.java b/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/controller/common/MetadataControllerTest.java index 5e3f66db..cbc5ed2c 100644 --- a/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/controller/common/MetadataControllerTest.java +++ b/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/controller/common/MetadataControllerTest.java @@ -96,7 +96,6 @@ private byte[] getResourceContent() throws IOException { if (url == null) { throw new IOException("Resource not found: " + KEY_STORE_RESOURCE); } - //noinspection LocalCanBeFinal try (InputStream inputStream = url.openStream()) { return inputStream.readAllBytes(); } diff --git a/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/controller/v7_2/KeyControllerTest.java b/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/controller/v7_2/KeyControllerTest.java index ca672d80..e8d57609 100644 --- a/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/controller/v7_2/KeyControllerTest.java +++ b/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/controller/v7_2/KeyControllerTest.java @@ -53,8 +53,6 @@ import static com.github.nagyesta.lowkeyvault.TestConstants.*; import static com.github.nagyesta.lowkeyvault.TestConstantsKeys.*; import static com.github.nagyesta.lowkeyvault.TestConstantsUri.HTTPS_LOCALHOST_8443; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.ArgumentMatchers.same; import static org.mockito.Mockito.*; class KeyControllerTest { diff --git a/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/controller/v7_2/KeyCryptoControllerTest.java b/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/controller/v7_2/KeyCryptoControllerTest.java index 6ec85b2c..18d2ea6a 100644 --- a/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/controller/v7_2/KeyCryptoControllerTest.java +++ b/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/controller/v7_2/KeyCryptoControllerTest.java @@ -44,8 +44,6 @@ import static com.github.nagyesta.lowkeyvault.TestConstants.*; import static com.github.nagyesta.lowkeyvault.TestConstantsKeys.*; import static com.github.nagyesta.lowkeyvault.TestConstantsUri.HTTPS_LOCALHOST_8443; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.ArgumentMatchers.same; import static org.mockito.Mockito.*; class KeyCryptoControllerTest { diff --git a/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/controller/v7_2/SecretControllerTest.java b/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/controller/v7_2/SecretControllerTest.java index 99822580..020ac1fd 100644 --- a/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/controller/v7_2/SecretControllerTest.java +++ b/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/controller/v7_2/SecretControllerTest.java @@ -45,8 +45,6 @@ import static com.github.nagyesta.lowkeyvault.TestConstants.*; import static com.github.nagyesta.lowkeyvault.TestConstantsSecrets.*; import static com.github.nagyesta.lowkeyvault.TestConstantsUri.HTTPS_LOCALHOST_8443; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.ArgumentMatchers.same; import static org.mockito.Mockito.*; class SecretControllerTest { diff --git a/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/controller/v7_3/KeyControllerTest.java b/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/controller/v7_3/KeyControllerTest.java index 157c7664..652ea663 100644 --- a/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/controller/v7_3/KeyControllerTest.java +++ b/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/controller/v7_3/KeyControllerTest.java @@ -54,8 +54,6 @@ import static com.github.nagyesta.lowkeyvault.TestConstants.*; import static com.github.nagyesta.lowkeyvault.TestConstantsKeys.*; import static com.github.nagyesta.lowkeyvault.TestConstantsUri.HTTPS_LOCALHOST_8443; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.ArgumentMatchers.same; import static org.mockito.Mockito.*; class KeyControllerTest { diff --git a/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/controller/v7_3/KeyCryptoControllerTest.java b/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/controller/v7_3/KeyCryptoControllerTest.java index 62cd6b84..0747f410 100644 --- a/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/controller/v7_3/KeyCryptoControllerTest.java +++ b/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/controller/v7_3/KeyCryptoControllerTest.java @@ -47,8 +47,6 @@ import static com.github.nagyesta.lowkeyvault.TestConstants.*; import static com.github.nagyesta.lowkeyvault.TestConstantsKeys.*; import static com.github.nagyesta.lowkeyvault.TestConstantsUri.HTTPS_LOCALHOST_8443; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.ArgumentMatchers.same; import static org.mockito.Mockito.*; class KeyCryptoControllerTest { diff --git a/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/controller/v7_3/KeyPolicyControllerTest.java b/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/controller/v7_3/KeyPolicyControllerTest.java index 6b2f1587..d86bacf5 100644 --- a/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/controller/v7_3/KeyPolicyControllerTest.java +++ b/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/controller/v7_3/KeyPolicyControllerTest.java @@ -28,8 +28,6 @@ import static com.github.nagyesta.lowkeyvault.TestConstantsKeys.KEY_NAME_1; import static com.github.nagyesta.lowkeyvault.TestConstantsUri.HTTPS_LOCALHOST_8443; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.ArgumentMatchers.same; import static org.mockito.Mockito.*; class KeyPolicyControllerTest { diff --git a/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/controller/v7_3/SecretControllerTest.java b/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/controller/v7_3/SecretControllerTest.java index 09d857d1..71ba4a08 100644 --- a/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/controller/v7_3/SecretControllerTest.java +++ b/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/controller/v7_3/SecretControllerTest.java @@ -46,8 +46,6 @@ import static com.github.nagyesta.lowkeyvault.TestConstants.*; import static com.github.nagyesta.lowkeyvault.TestConstantsSecrets.*; import static com.github.nagyesta.lowkeyvault.TestConstantsUri.HTTPS_LOCALHOST_8443; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.ArgumentMatchers.same; import static org.mockito.Mockito.*; class SecretControllerTest { diff --git a/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/controller/v7_4/KeyControllerTest.java b/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/controller/v7_4/KeyControllerTest.java index 31db1d38..d2f25430 100644 --- a/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/controller/v7_4/KeyControllerTest.java +++ b/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/controller/v7_4/KeyControllerTest.java @@ -54,8 +54,6 @@ import static com.github.nagyesta.lowkeyvault.TestConstants.*; import static com.github.nagyesta.lowkeyvault.TestConstantsKeys.*; import static com.github.nagyesta.lowkeyvault.TestConstantsUri.HTTPS_LOCALHOST_8443; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.ArgumentMatchers.same; import static org.mockito.Mockito.*; class KeyControllerTest { diff --git a/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/controller/v7_4/KeyCryptoControllerTest.java b/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/controller/v7_4/KeyCryptoControllerTest.java index 9d7db702..4b02c636 100644 --- a/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/controller/v7_4/KeyCryptoControllerTest.java +++ b/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/controller/v7_4/KeyCryptoControllerTest.java @@ -47,8 +47,6 @@ import static com.github.nagyesta.lowkeyvault.TestConstants.*; import static com.github.nagyesta.lowkeyvault.TestConstantsKeys.*; import static com.github.nagyesta.lowkeyvault.TestConstantsUri.HTTPS_LOCALHOST_8443; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.ArgumentMatchers.same; import static org.mockito.Mockito.*; class KeyCryptoControllerTest { diff --git a/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/controller/v7_4/KeyPolicyControllerTest.java b/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/controller/v7_4/KeyPolicyControllerTest.java index de80e0af..fbd8c15d 100644 --- a/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/controller/v7_4/KeyPolicyControllerTest.java +++ b/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/controller/v7_4/KeyPolicyControllerTest.java @@ -28,8 +28,6 @@ import static com.github.nagyesta.lowkeyvault.TestConstantsKeys.KEY_NAME_1; import static com.github.nagyesta.lowkeyvault.TestConstantsUri.HTTPS_LOCALHOST_8443; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.ArgumentMatchers.same; import static org.mockito.Mockito.*; class KeyPolicyControllerTest { diff --git a/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/controller/v7_4/SecretControllerTest.java b/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/controller/v7_4/SecretControllerTest.java index 79f50ff8..28326baf 100644 --- a/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/controller/v7_4/SecretControllerTest.java +++ b/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/controller/v7_4/SecretControllerTest.java @@ -46,8 +46,6 @@ import static com.github.nagyesta.lowkeyvault.TestConstants.*; import static com.github.nagyesta.lowkeyvault.TestConstantsSecrets.*; import static com.github.nagyesta.lowkeyvault.TestConstantsUri.HTTPS_LOCALHOST_8443; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.ArgumentMatchers.same; import static org.mockito.Mockito.*; class SecretControllerTest { diff --git a/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/controller/v7_5/KeyControllerTest.java b/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/controller/v7_5/KeyControllerTest.java index c0bd43e0..aaee881f 100644 --- a/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/controller/v7_5/KeyControllerTest.java +++ b/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/controller/v7_5/KeyControllerTest.java @@ -54,8 +54,6 @@ import static com.github.nagyesta.lowkeyvault.TestConstants.*; import static com.github.nagyesta.lowkeyvault.TestConstantsKeys.*; import static com.github.nagyesta.lowkeyvault.TestConstantsUri.HTTPS_LOCALHOST_8443; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.ArgumentMatchers.same; import static org.mockito.Mockito.*; class KeyControllerTest { diff --git a/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/controller/v7_5/KeyCryptoControllerTest.java b/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/controller/v7_5/KeyCryptoControllerTest.java index 12e85cdf..96af4255 100644 --- a/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/controller/v7_5/KeyCryptoControllerTest.java +++ b/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/controller/v7_5/KeyCryptoControllerTest.java @@ -47,8 +47,6 @@ import static com.github.nagyesta.lowkeyvault.TestConstants.*; import static com.github.nagyesta.lowkeyvault.TestConstantsKeys.*; import static com.github.nagyesta.lowkeyvault.TestConstantsUri.HTTPS_LOCALHOST_8443; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.ArgumentMatchers.same; import static org.mockito.Mockito.*; class KeyCryptoControllerTest { diff --git a/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/controller/v7_5/KeyPolicyControllerTest.java b/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/controller/v7_5/KeyPolicyControllerTest.java index 66074b4c..68f7d5ab 100644 --- a/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/controller/v7_5/KeyPolicyControllerTest.java +++ b/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/controller/v7_5/KeyPolicyControllerTest.java @@ -28,8 +28,6 @@ import static com.github.nagyesta.lowkeyvault.TestConstantsKeys.KEY_NAME_1; import static com.github.nagyesta.lowkeyvault.TestConstantsUri.HTTPS_LOCALHOST_8443; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.ArgumentMatchers.same; import static org.mockito.Mockito.*; class KeyPolicyControllerTest { diff --git a/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/controller/v7_5/SecretControllerTest.java b/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/controller/v7_5/SecretControllerTest.java index f1649116..bcf2627b 100644 --- a/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/controller/v7_5/SecretControllerTest.java +++ b/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/controller/v7_5/SecretControllerTest.java @@ -46,8 +46,6 @@ import static com.github.nagyesta.lowkeyvault.TestConstants.*; import static com.github.nagyesta.lowkeyvault.TestConstantsSecrets.*; import static com.github.nagyesta.lowkeyvault.TestConstantsUri.HTTPS_LOCALHOST_8443; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.ArgumentMatchers.same; import static org.mockito.Mockito.*; class SecretControllerTest { diff --git a/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/filter/CommonAuthHeaderFilterTest.java b/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/filter/CommonAuthHeaderFilterTest.java index 91dd9edb..f57d3fc6 100644 --- a/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/filter/CommonAuthHeaderFilterTest.java +++ b/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/filter/CommonAuthHeaderFilterTest.java @@ -25,7 +25,6 @@ import static com.github.nagyesta.lowkeyvault.TestConstants.*; import static com.github.nagyesta.lowkeyvault.TestConstantsUri.*; -import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.*; class CommonAuthHeaderFilterTest { @@ -161,6 +160,7 @@ void testShouldNotFilterShouldReturnTrueWhenRequestBaseUriIsPing() { verify(request, atLeastOnce()).getRequestURI(); } + @SuppressWarnings("DataFlowIssue") @Test void testConstructorShouldThrowExceptionWhenCalledWithNull() { //given diff --git a/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/filter/PortSeparationFilterTest.java b/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/filter/PortSeparationFilterTest.java index 3f6fcf72..5e65bd9e 100644 --- a/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/filter/PortSeparationFilterTest.java +++ b/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/filter/PortSeparationFilterTest.java @@ -8,7 +8,6 @@ import java.io.IOException; -import static org.mockito.ArgumentMatchers.same; import static org.mockito.Mockito.*; class PortSeparationFilterTest { diff --git a/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/mapper/v7_2/key/KeyEntityToV72PropertiesModelConverterTest.java b/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/mapper/v7_2/key/KeyEntityToV72PropertiesModelConverterTest.java index 0883a750..7ab1527b 100644 --- a/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/mapper/v7_2/key/KeyEntityToV72PropertiesModelConverterTest.java +++ b/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/mapper/v7_2/key/KeyEntityToV72PropertiesModelConverterTest.java @@ -10,6 +10,7 @@ import com.github.nagyesta.lowkeyvault.service.key.impl.KeyCreationInput; import com.github.nagyesta.lowkeyvault.service.key.impl.KeyVaultKeyEntity; import com.github.nagyesta.lowkeyvault.service.vault.VaultFake; +import lombok.Setter; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; @@ -113,6 +114,7 @@ void testConvertShouldConvertAllFieldsWhenTheyAreSet( Assertions.assertEquals(input.getUpdated(), actual.getUpdatedOn()); } + @Setter private final class DummyKeyVaultKeyEntity extends KeyVaultKeyEntity { private Integer recoverableDays; private RecoveryLevel recoveryLevel; @@ -148,19 +150,11 @@ public Integer getRecoverableDays() { return recoverableDays; } - public void setRecoverableDays(final Integer recoverableDays) { - this.recoverableDays = recoverableDays; - } - @Override public RecoveryLevel getRecoveryLevel() { return recoveryLevel; } - public void setRecoveryLevel(final RecoveryLevel recoveryLevel) { - this.recoveryLevel = recoveryLevel; - } - @Override public byte[] signBytes(final byte[] clear, final SignatureAlgorithm encryptionAlgorithm) { return new byte[0]; diff --git a/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/mapper/v7_2/secret/SecretEntityToV72PropertiesModelConverterTest.java b/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/mapper/v7_2/secret/SecretEntityToV72PropertiesModelConverterTest.java index 3fdb5412..32a0bed7 100644 --- a/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/mapper/v7_2/secret/SecretEntityToV72PropertiesModelConverterTest.java +++ b/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/mapper/v7_2/secret/SecretEntityToV72PropertiesModelConverterTest.java @@ -6,6 +6,7 @@ import com.github.nagyesta.lowkeyvault.service.secret.SecretVaultFake; import com.github.nagyesta.lowkeyvault.service.secret.impl.KeyVaultSecretEntity; import com.github.nagyesta.lowkeyvault.service.vault.VaultFake; +import lombok.Setter; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.BeforeEach; @@ -110,6 +111,7 @@ void testConvertShouldConvertAllFieldsWhenTheyAreSet( Assertions.assertEquals(input.getUpdated(), actual.getUpdatedOn()); } + @Setter private final class DummyKeyVaultSecretEntity extends KeyVaultSecretEntity { private Integer recoverableDays; private RecoveryLevel recoveryLevel; @@ -123,17 +125,10 @@ public Integer getRecoverableDays() { return recoverableDays; } - public void setRecoverableDays(final Integer recoverableDays) { - this.recoverableDays = recoverableDays; - } - @Override public RecoveryLevel getRecoveryLevel() { return recoveryLevel; } - public void setRecoveryLevel(final RecoveryLevel recoveryLevel) { - this.recoveryLevel = recoveryLevel; - } } } diff --git a/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/mapper/v7_3/certificate/CertificateEntityToV73CertificateItemModelConverterTest.java b/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/mapper/v7_3/certificate/CertificateEntityToV73CertificateItemModelConverterTest.java index f0d10009..65281259 100644 --- a/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/mapper/v7_3/certificate/CertificateEntityToV73CertificateItemModelConverterTest.java +++ b/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/mapper/v7_3/certificate/CertificateEntityToV73CertificateItemModelConverterTest.java @@ -13,8 +13,6 @@ import static com.github.nagyesta.lowkeyvault.TestConstantsCertificates.CERT_NAME_1; import static com.github.nagyesta.lowkeyvault.TestConstantsUri.HTTPS_LOCALHOST_8443; import static com.github.nagyesta.lowkeyvault.TestConstantsUri.HTTPS_LOWKEY_VAULT; -import static org.mockito.ArgumentMatchers.eq; -import static org.mockito.ArgumentMatchers.same; import static org.mockito.Mockito.*; class CertificateEntityToV73CertificateItemModelConverterTest { diff --git a/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/model/v7_2/key/KeyEntityToV72BackupConverterTest.java b/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/model/v7_2/key/KeyEntityToV72BackupConverterTest.java index 20732de0..bb11a389 100644 --- a/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/model/v7_2/key/KeyEntityToV72BackupConverterTest.java +++ b/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/model/v7_2/key/KeyEntityToV72BackupConverterTest.java @@ -30,7 +30,6 @@ import static com.github.nagyesta.lowkeyvault.TestConstants.KEY_1; import static com.github.nagyesta.lowkeyvault.TestConstants.VALUE_1; import static com.github.nagyesta.lowkeyvault.TestConstantsKeys.VERSIONED_KEY_ENTITY_ID_1_VERSION_1; -import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.*; class KeyEntityToV72BackupConverterTest { diff --git a/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/model/v7_2/key/constants/KeyTypeTest.java b/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/model/v7_2/key/constants/KeyTypeTest.java index 42129de8..7ae43e60 100644 --- a/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/model/v7_2/key/constants/KeyTypeTest.java +++ b/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/model/v7_2/key/constants/KeyTypeTest.java @@ -15,7 +15,6 @@ import java.util.Optional; import java.util.stream.Stream; -import static org.mockito.ArgumentMatchers.same; import static org.mockito.Mockito.*; class KeyTypeTest { diff --git a/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/model/v7_2/secret/SecretEntityToV72BackupConverterTest.java b/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/model/v7_2/secret/SecretEntityToV72BackupConverterTest.java index 5120dffd..45fa294a 100644 --- a/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/model/v7_2/secret/SecretEntityToV72BackupConverterTest.java +++ b/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/model/v7_2/secret/SecretEntityToV72BackupConverterTest.java @@ -22,7 +22,6 @@ import static com.github.nagyesta.lowkeyvault.TestConstants.*; import static com.github.nagyesta.lowkeyvault.TestConstantsSecrets.VERSIONED_SECRET_ENTITY_ID_1_VERSION_1; -import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.*; class SecretEntityToV72BackupConverterTest { diff --git a/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/service/VersionedKeyEntityIdTest.java b/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/service/VersionedKeyEntityIdTest.java index 9b9be459..f30e89c5 100644 --- a/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/service/VersionedKeyEntityIdTest.java +++ b/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/service/VersionedKeyEntityIdTest.java @@ -173,7 +173,7 @@ void testAsUriShouldThrowExceptionWhenCalledWithNullQueryString() { final VersionedKeyEntityId underTest = new VersionedKeyEntityId(HTTPS_LOCALHOST, KEY_NAME_1, KEY_VERSION_1); //when - Assertions.assertThrows(IllegalArgumentException.class, () -> underTest.asUri(HTTPS_LOCALHOST_8443, (String) null)); + Assertions.assertThrows(IllegalArgumentException.class, () -> underTest.asUri(HTTPS_LOCALHOST_8443, null)); //then + exception; } diff --git a/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/service/certificate/impl/CertContentTypeTest.java b/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/service/certificate/impl/CertContentTypeTest.java index fa8cb407..efbfa8f0 100644 --- a/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/service/certificate/impl/CertContentTypeTest.java +++ b/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/service/certificate/impl/CertContentTypeTest.java @@ -29,45 +29,53 @@ @SuppressWarnings("UnnecessaryLocalVariable") class CertContentTypeTest { - private static final String EC_CERT = "MIIBRDCB6aADAgECAgR3UZEbMAwGCCqGSM49BAMCBQAwFzEVMBMGA1UEAxMMZWMu" - + "bG9jYWxob3N0MB4XDTIyMDkxMDE5MDA1NVoXDTIzMDkxMDE5MDA1NVowFzEVMBMG" - + "A1UEAxMMZWMubG9jYWxob3N0MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE9QeN" - + "Y5gGwMQnCSUrFfJ1CQp8ngrTJn9ZzTusUY8Gh5JWennjFdzLIqJ4yhpSzGAl+/jn" - + "Gv3n+fBjt7mUZu2I76MhMB8wHQYDVR0OBBYEFA2YDS/W2/Dv5qJrmtbE7w+HUtL0" - + "MAwGCCqGSM49BAMCBQADSAAwRQIgMQAYrmTDkcxQgS33oHbw+H/7YEO43ZDqSOTr" - + "tn7PQa8CIQCf8JCfvoC0W67JsBRFPDNJEKBuNHVMOWuKjwrXaqynuQ=="; - private static final String RSA_CERT = "MIIDUzCCAjugAwIBAgIQZ03r0foFSbuyMPZn6+/irDANBgkqhkiG9w0BAQsFADAU" - + "MRIwEAYDVQQDEwlsb2NhbGhvc3QwIBcNMjIwODI4MTIzMDQzWhgPMjA1MjA4Mjgx" - + "MjQwNDNaMBQxEjAQBgNVBAMTCWxvY2FsaG9zdDCCASIwDQYJKoZIhvcNAQEBBQAD" - + "ggEPADCCAQoCggEBALXdCn8hSkdTXLfEGYdwDfvEfPRl+wipthTDtYVZ6AJGjG53" - + "mu/nRuf1rFG4W5OXTFV/WL5pbDOsNvvV1PlUG/+VRBVO/r5D0AmHJjVyflozKIhB" - + "RDx2GgM8pTgpoEVuzJG/pb8Up+kQiCEUjJ1TAf3gojl59lEFatQNsWbHnGvV3xmK" - + "RpECzBQipRjMi+4U3/9ebgrY91UDj+/tkqK4SWqxeb9qE5H41CHEJXkpgnGJRZFw" - + "1IDcJntoW+973msI69S5GZZ3ICzLpAeTm1CZyVj/Kn4xn/ag8tHzNAmfhA7gQDtO" - + "2vVYuF4IKLF5YCI2jNcTeyk0ZPXljgJ9RD8486ECAwEAAaOBnjCBmzAOBgNVHQ8B" - + "Af8EBAMCBaAwCQYDVR0TBAIwADAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUH" - + "AwIwHwYDVR0RBBgwFoIJbG9jYWxob3N0ggkxMjcuMC4wLjEwHwYDVR0jBBgwFoAU" - + "LnKkDUiyqtO+WmZSPeYyhcwSZHMwHQYDVR0OBBYEFC5ypA1IsqrTvlpmUj3mMoXM" - + "EmRzMA0GCSqGSIb3DQEBCwUAA4IBAQCqTxssPDFRHW1GzA43gph52bY8ZLuSFOcb" - + "2p98T9STkPzudq9Pqha4n5/N9AIIYpNU/BFGQMvgilmJK1e0r5BqACTZ+xw4Zm92" - + "KLMVLeVS6mGLKYklJvwjFblfJtjN++l5j5coMGiWgVLQTJhyFwHtWSdh1J0DNbwE" - + "/eGSDWHJ20KDyt98c7QJIjt87KIh3jd1WRzeRZ7YWWdRxigerYlupO2iFSr28seB" - + "NjuCqPwdGwuYHGe/SskEqjVYxFoFknPhsn5Y64b1RuJe19qjewYl0NBmBjiEexY1" - + "Tg/nnzqHPv4GAnWcp4e9IOAB00LfXwFj4D/lTOuGpdUFeIhjN0dx"; + @SuppressWarnings("SpellCheckingInspection") + private static final String EC_CERT = """ + MIIBRDCB6aADAgECAgR3UZEbMAwGCCqGSM49BAMCBQAwFzEVMBMGA1UEAxMMZWMu\ + bG9jYWxob3N0MB4XDTIyMDkxMDE5MDA1NVoXDTIzMDkxMDE5MDA1NVowFzEVMBMG\ + A1UEAxMMZWMubG9jYWxob3N0MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE9QeN\ + Y5gGwMQnCSUrFfJ1CQp8ngrTJn9ZzTusUY8Gh5JWennjFdzLIqJ4yhpSzGAl+/jn\ + Gv3n+fBjt7mUZu2I76MhMB8wHQYDVR0OBBYEFA2YDS/W2/Dv5qJrmtbE7w+HUtL0\ + MAwGCCqGSM49BAMCBQADSAAwRQIgMQAYrmTDkcxQgS33oHbw+H/7YEO43ZDqSOTr\ + tn7PQa8CIQCf8JCfvoC0W67JsBRFPDNJEKBuNHVMOWuKjwrXaqynuQ=="""; + @SuppressWarnings("SpellCheckingInspection") + private static final String RSA_CERT = """ + MIIDUzCCAjugAwIBAgIQZ03r0foFSbuyMPZn6+/irDANBgkqhkiG9w0BAQsFADAU\ + MRIwEAYDVQQDEwlsb2NhbGhvc3QwIBcNMjIwODI4MTIzMDQzWhgPMjA1MjA4Mjgx\ + MjQwNDNaMBQxEjAQBgNVBAMTCWxvY2FsaG9zdDCCASIwDQYJKoZIhvcNAQEBBQAD\ + ggEPADCCAQoCggEBALXdCn8hSkdTXLfEGYdwDfvEfPRl+wipthTDtYVZ6AJGjG53\ + mu/nRuf1rFG4W5OXTFV/WL5pbDOsNvvV1PlUG/+VRBVO/r5D0AmHJjVyflozKIhB\ + RDx2GgM8pTgpoEVuzJG/pb8Up+kQiCEUjJ1TAf3gojl59lEFatQNsWbHnGvV3xmK\ + RpECzBQipRjMi+4U3/9ebgrY91UDj+/tkqK4SWqxeb9qE5H41CHEJXkpgnGJRZFw\ + 1IDcJntoW+973msI69S5GZZ3ICzLpAeTm1CZyVj/Kn4xn/ag8tHzNAmfhA7gQDtO\ + 2vVYuF4IKLF5YCI2jNcTeyk0ZPXljgJ9RD8486ECAwEAAaOBnjCBmzAOBgNVHQ8B\ + Af8EBAMCBaAwCQYDVR0TBAIwADAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUH\ + AwIwHwYDVR0RBBgwFoIJbG9jYWxob3N0ggkxMjcuMC4wLjEwHwYDVR0jBBgwFoAU\ + LnKkDUiyqtO+WmZSPeYyhcwSZHMwHQYDVR0OBBYEFC5ypA1IsqrTvlpmUj3mMoXM\ + EmRzMA0GCSqGSIb3DQEBCwUAA4IBAQCqTxssPDFRHW1GzA43gph52bY8ZLuSFOcb\ + 2p98T9STkPzudq9Pqha4n5/N9AIIYpNU/BFGQMvgilmJK1e0r5BqACTZ+xw4Zm92\ + KLMVLeVS6mGLKYklJvwjFblfJtjN++l5j5coMGiWgVLQTJhyFwHtWSdh1J0DNbwE\ + /eGSDWHJ20KDyt98c7QJIjt87KIh3jd1WRzeRZ7YWWdRxigerYlupO2iFSr28seB\ + NjuCqPwdGwuYHGe/SskEqjVYxFoFknPhsn5Y64b1RuJe19qjewYl0NBmBjiEexY1\ + Tg/nnzqHPv4GAnWcp4e9IOAB00LfXwFj4D/lTOuGpdUFeIhjN0dx"""; private static final int KEY_SIZE = 2048; - private static final String MIME_BASE64 = "TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2NpbmcgZWxpdCwg\r\n" - + "c2VkIGRvIGVpdXNtb2QgdGVtcG9yIGluY2lkaWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWdu\r\n" - + "YQphbGlxdWEuIFV0IGVuaW0gYWQgbWluaW0gdmVuaWFtLCBxdWlzIG5vc3RydWQgZXhlcmNpdGF0\r\n" - + "aW9uIHVsbGFtY28gbGFib3JpcyBuaXNpIHV0IGFsaXF1aXAgZXggZWEgY29tbW9kbyBjb25zZXF1\r\n" - + "YXQuCkR1aXMgYXV0ZSBpcnVyZSBkb2xvciBpbiByZXByZWhlbmRlcml0IGluIHZvbHVwdGF0ZSB2\r\n" - + "ZWxpdCBlc3NlIGNpbGx1bSBkb2xvcmUgZXUgZnVnaWF0IG51bGxhIHBhcmlhdHVyLiBFeGNlcHRl\r\n" - + "dXIKc2ludCBvY2NhZWNhdCBjdXBpZGF0YXQgbm9uIHByb2lkZW50LCBzdW50IGluIGN1bHBhIHF1\r\n" - + "aSBvZmZpY2lhIGRlc2VydW50IG1vbGxpdCBhbmltIGlkIGVzdCBsYWJvcnVtLgo="; - private static final byte[] MIME_BYTES = ("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt " - + "ut labore et dolore magna\naliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut " - + "aliquip ex ea commodo consequat.\nDuis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore " - + "eu fugiat nulla pariatur. Excepteur\nsint occaecat cupidatat non proident, sunt in culpa qui officia deserunt " - + "mollit anim id est laborum.\n").getBytes(StandardCharsets.UTF_8); + @SuppressWarnings("SpellCheckingInspection") + private static final String MIME_BASE64 = """ + TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2NpbmcgZWxpdCwg\r + c2VkIGRvIGVpdXNtb2QgdGVtcG9yIGluY2lkaWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWdu\r + YQphbGlxdWEuIFV0IGVuaW0gYWQgbWluaW0gdmVuaWFtLCBxdWlzIG5vc3RydWQgZXhlcmNpdGF0\r + aW9uIHVsbGFtY28gbGFib3JpcyBuaXNpIHV0IGFsaXF1aXAgZXggZWEgY29tbW9kbyBjb25zZXF1\r + YXQuCkR1aXMgYXV0ZSBpcnVyZSBkb2xvciBpbiByZXByZWhlbmRlcml0IGluIHZvbHVwdGF0ZSB2\r + ZWxpdCBlc3NlIGNpbGx1bSBkb2xvcmUgZXUgZnVnaWF0IG51bGxhIHBhcmlhdHVyLiBFeGNlcHRl\r + dXIKc2ludCBvY2NhZWNhdCBjdXBpZGF0YXQgbm9uIHByb2lkZW50LCBzdW50IGluIGN1bHBhIHF1\r + aSBvZmZpY2lhIGRlc2VydW50IG1vbGxpdCBhbmltIGlkIGVzdCBsYWJvcnVtLgo="""; + @SuppressWarnings("SpellCheckingInspection") + private static final byte[] MIME_BYTES = (""" + Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna + aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. + Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur + sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. + """).getBytes(StandardCharsets.UTF_8); public static Stream instanceProvider() { return Stream.builder() diff --git a/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/service/certificate/impl/CertificateImportInputTest.java b/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/service/certificate/impl/CertificateImportInputTest.java index e4c296bf..cfb3fa9e 100644 --- a/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/service/certificate/impl/CertificateImportInputTest.java +++ b/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/service/certificate/impl/CertificateImportInputTest.java @@ -10,7 +10,6 @@ import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; -import java.security.cert.CertificateParsingException; import java.util.Objects; import java.util.Set; import java.util.stream.Stream; @@ -42,7 +41,7 @@ public static Stream nullProvider() { @Test - void testConstructorShouldUseValuesFromCertificateWhenCalledWithMinimalEcDataUsingPkcs12() throws CertificateParsingException { + void testConstructorShouldUseValuesFromCertificateWhenCalledWithMinimalEcDataUsingPkcs12() { //given final String certContent = Objects.requireNonNull(ResourceUtils.loadResourceAsBase64String("/cert/ec.p12")); @@ -67,7 +66,7 @@ void testConstructorShouldUseValuesFromCertificateWhenCalledWithMinimalEcDataUsi } @Test - void testConstructorShouldUseValuesFromCertificateWhenCalledWithMinimalEcDataUsingPem() throws CertificateParsingException { + void testConstructorShouldUseValuesFromCertificateWhenCalledWithMinimalEcDataUsingPem() { //given final String certContent = Objects.requireNonNull(ResourceUtils.loadResourceAsString("/cert/ec.pem")); @@ -92,7 +91,7 @@ void testConstructorShouldUseValuesFromCertificateWhenCalledWithMinimalEcDataUsi } @Test - void testConstructorShouldUseValuesFromParsedCertOnlyWhenCalledWithMixedEcDataUsingPem() throws CertificateParsingException { + void testConstructorShouldUseValuesFromParsedCertOnlyWhenCalledWithMixedEcDataUsingPem() { //given final String certContent = Objects.requireNonNull(ResourceUtils.loadResourceAsString("/cert/ec.pem")); @@ -144,7 +143,7 @@ void testConstructorShouldUseValuesFromParsedCertOnlyWhenCalledWithMixedEcDataUs } @Test - void testConstructorShouldUseValuesFromKeyWhenCalledWithMinimalEcDataUsingPkcs12() throws CertificateParsingException { + void testConstructorShouldUseValuesFromKeyWhenCalledWithMinimalEcDataUsingPkcs12() { //given final String certContent = Objects.requireNonNull(ResourceUtils.loadResourceAsBase64String("/cert/ec.p12")); @@ -162,7 +161,7 @@ void testConstructorShouldUseValuesFromKeyWhenCalledWithMinimalEcDataUsingPkcs12 } @Test - void testConstructorShouldUseValuesFromKeyWhenCalledWithMinimalRsaDataUsingPkcs12() throws CertificateParsingException { + void testConstructorShouldUseValuesFromKeyWhenCalledWithMinimalRsaDataUsingPkcs12() { //given final String certContent = Objects.requireNonNull(ResourceUtils.loadResourceAsBase64String("/cert/rsa.p12")); @@ -185,7 +184,7 @@ void testConstructorShouldUseValuesFromKeyWhenCalledWithMinimalRsaDataUsingPkcs1 } @Test - void testConstructorShouldUseValuesFromKeyWhenCalledWithMinimalRsaDataUsingPem() throws CertificateParsingException { + void testConstructorShouldUseValuesFromKeyWhenCalledWithMinimalRsaDataUsingPem() { //given final String certContent = Objects.requireNonNull(ResourceUtils.loadResourceAsString("/cert/rsa.pem")); diff --git a/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/service/certificate/impl/CertificateLifetimeActionPolicyTest.java b/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/service/certificate/impl/CertificateLifetimeActionPolicyTest.java index 1b297bfc..12a46968 100644 --- a/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/service/certificate/impl/CertificateLifetimeActionPolicyTest.java +++ b/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/service/certificate/impl/CertificateLifetimeActionPolicyTest.java @@ -22,7 +22,6 @@ import static com.github.nagyesta.lowkeyvault.service.certificate.CertificateLifetimeActionTriggerType.DAYS_BEFORE_EXPIRY; import static com.github.nagyesta.lowkeyvault.service.certificate.impl.CertificateCreationInput.DEFAULT_VALIDITY_MONTHS; import static java.time.temporal.ChronoUnit.DAYS; -import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.*; class CertificateLifetimeActionPolicyTest { diff --git a/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/service/certificate/impl/KeyUsageEnumTest.java b/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/service/certificate/impl/KeyUsageEnumTest.java index 929c1a5f..1675f2e4 100644 --- a/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/service/certificate/impl/KeyUsageEnumTest.java +++ b/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/service/certificate/impl/KeyUsageEnumTest.java @@ -66,9 +66,8 @@ void testCombiningItemsShouldCreateSingleKeyUsageWhenCalledForValidSetOfUsages() final KeyUsage actual = Stream.of(values).collect(KeyUsageEnum.toKeyUsage()); //then - Stream.of(values).forEach(value -> { - Assertions.assertTrue(actual.hasUsages(value.getCode()), "Usage must be present: " + value.getValue()); - }); + Stream.of(values).forEach(value -> Assertions + .assertTrue(actual.hasUsages(value.getCode()), "Usage must be present: " + value.getValue())); } @ParameterizedTest diff --git a/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/service/certificate/impl/KeyVaultCertificateEntityTest.java b/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/service/certificate/impl/KeyVaultCertificateEntityTest.java index 7e21b2e9..defcbc23 100644 --- a/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/service/certificate/impl/KeyVaultCertificateEntityTest.java +++ b/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/service/certificate/impl/KeyVaultCertificateEntityTest.java @@ -32,7 +32,6 @@ import static com.github.nagyesta.lowkeyvault.TestConstantsKeys.VERSIONED_KEY_ENTITY_ID_1_VERSION_1; import static com.github.nagyesta.lowkeyvault.TestConstantsUri.HTTPS_LOCALHOST_8443; import static com.github.nagyesta.lowkeyvault.service.certificate.impl.CertAuthorityType.UNKNOWN; -import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.*; class KeyVaultCertificateEntityTest { diff --git a/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/service/key/impl/KeyVaultFakeImplTest.java b/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/service/key/impl/KeyVaultFakeImplTest.java index 6efe29c7..e410a5db 100644 --- a/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/service/key/impl/KeyVaultFakeImplTest.java +++ b/lowkey-vault-app/src/test/java/com/github/nagyesta/lowkeyvault/service/key/impl/KeyVaultFakeImplTest.java @@ -976,7 +976,7 @@ void testCreateKeyVersionForCertificateShouldSetFieldsAndManagedFlagWhenCalledWi @ParameterizedTest @MethodSource("certificateNullProvider") void testCreateKeyVersionForCertificateShouldThrowExceptionWhenCalledWithNulls( - final String name, final KeyCreationInput input, + final String name, final KeyCreationInput input, final OffsetDateTime notBefore, final OffsetDateTime expiry) { //given final KeyVaultFake underTest = createUnderTest(); diff --git a/lowkey-vault-client/build.gradle b/lowkey-vault-client/build.gradle deleted file mode 100644 index 1cfb89bc..00000000 --- a/lowkey-vault-client/build.gradle +++ /dev/null @@ -1,88 +0,0 @@ -plugins { - id 'java' - alias(libs.plugins.lombok) -} - -group = "${rootProject.group}" - -project.ext { - artifactDisplayName = "Lowkey Vault - Client" - artifactDescription = "HTTP Client provider for Lowkey Vault tests." -} - -dependencies { - implementation(libs.azure.security.keyvault.keys) { - exclude(group: "io.netty") - } - implementation(libs.azure.security.keyvault.secrets) { - exclude(group: "io.netty") - } - implementation(libs.azure.security.keyvault.certificates) { - exclude(group: "io.netty") - } - implementation "com.fasterxml.jackson:jackson-bom:${libs.versions.jackson.get()}@pom" - implementation libs.bundles.jackson - implementation libs.httpclient - implementation libs.commons.codec - compileOnly libs.findbugs.jsr305 - annotationProcessor libs.lombok - testImplementation libs.mockito.core - testImplementation libs.jupiter - testRuntimeOnly("org.junit.platform:junit-platform-launcher") - testImplementation libs.logback.classic -} - -java { - sourceCompatibility = JavaVersion.VERSION_11 - toolchain { - languageVersion = JavaLanguageVersion.of(11) - } - withJavadocJar() - withSourcesJar() -} - -test { - useJUnitPlatform() -} - -publishing { - publications { - mavenJava(MavenPublication) { - from components.java - artifactId = "${project.name}" - pom { - name = "${project.artifactDisplayName}" - description = "${project.artifactDescription}" - url = rootProject.ext.repoUrl - packaging = "jar" - licenses { - license { - name = rootProject.ext.licenseName - url = rootProject.ext.licenseUrl - } - } - developers { - developer { - id = rootProject.ext.maintainerId - name = rootProject.ext.maintainerName - url = rootProject.ext.maintainerUrl - } - } - scm { - connection = rootProject.ext.scmConnection - developerConnection = rootProject.ext.scmConnection - url = rootProject.ext.scmProjectUrl - } - withXml { - asNode().dependencies.'*'.findAll() { - it.scope.text() == 'runtime' - }.each { it.scope*.value = 'compile' } - } - } - } - } -} - -signing { - sign publishing.publications.mavenJava -} diff --git a/lowkey-vault-client/build.gradle.kts b/lowkey-vault-client/build.gradle.kts new file mode 100644 index 00000000..bbe9c183 --- /dev/null +++ b/lowkey-vault-client/build.gradle.kts @@ -0,0 +1,134 @@ +import groovy.util.Node +import groovy.util.NodeList + +plugins { + id("java") + signing + `maven-publish` + alias(libs.plugins.lombok) + alias(libs.plugins.licensee.plugin) +} + +group = rootProject.group + +extra.apply { + set("artifactDisplayName", "Lowkey Vault - Client") + set("artifactDescription", "HTTP Client provider for Lowkey Vault tests.") +} + +dependencies { + implementation(libs.azure.security.keyvault.keys) { + exclude(group = "io.netty") + } + implementation(libs.azure.security.keyvault.secrets) { + exclude(group = "io.netty") + } + implementation(libs.azure.security.keyvault.certificates) { + exclude(group = "io.netty") + } + implementation(platform("com.fasterxml.jackson:jackson-bom:${libs.versions.jackson.get()}")) + implementation(libs.bundles.jackson) + implementation(libs.httpclient) + implementation(libs.commons.codec) + compileOnly(libs.findbugs.jsr305) + annotationProcessor(libs.lombok) + testImplementation(libs.mockito.core) + testImplementation(libs.jupiter) + testRuntimeOnly("org.junit.platform:junit-platform-launcher") + testImplementation(libs.logback.classic) +} + +licensee { + allow("Apache-2.0") + allow("MIT") + allow("MIT-0") + allow("BSD-2-Clause") +} + +java { + sourceCompatibility = JavaVersion.VERSION_11 + toolchain { + languageVersion = JavaLanguageVersion.of(11) + } + withJavadocJar() + withSourcesJar() +} + +val copyLegalDocs = tasks.register("copyLegalDocs") { + from(file("${project.rootProject.projectDir}/LICENSE")) + from(layout.buildDirectory.file("reports/licensee/artifacts.json").get().asFile) + from(layout.buildDirectory.file("reports/bom.json").get().asFile) + into(layout.buildDirectory.dir("resources/main/META-INF").get().asFile) + rename("artifacts.json", "dependency-licenses.json") + rename("bom.json", "SBOM.json") +}.get() +copyLegalDocs.dependsOn(tasks.licensee) +copyLegalDocs.dependsOn(tasks.cyclonedxBom) +tasks.javadoc.get().dependsOn(copyLegalDocs) +tasks.compileJava.get().dependsOn(copyLegalDocs) +tasks.processResources.get().finalizedBy(copyLegalDocs) + +tasks.test { + useJUnitPlatform() + finalizedBy(tasks.getByName("jacocoTestReport")) +} + +publishing { + repositories { + maven { + name = "GitHubPackages" + url = uri(rootProject.extra.get("githubMavenRepoUrl").toString()) + credentials { + username = rootProject.extra.get("gitUser").toString() + password = rootProject.extra.get("gitToken").toString() + } + } + } + publications { + create("mavenJava") { + from(components["java"]) + artifactId = project.name + pom { + name.set(project.extra.get("artifactDisplayName").toString()) + description.set(project.extra.get("artifactDescription").toString()) + url.set(rootProject.extra.get("repoUrl").toString()) + packaging = "jar" + licenses { + license { + name.set(rootProject.extra.get("licenseName").toString()) + url.set(rootProject.extra.get("licenseUrl").toString()) + } + } + developers { + developer { + id.set(rootProject.extra.get("maintainerId").toString()) + name.set(rootProject.extra.get("maintainerName").toString()) + email.set(rootProject.extra.get("maintainerUrl").toString()) + } + } + scm { + connection.set(rootProject.extra.get("scmConnection").toString()) + developerConnection.set(rootProject.extra.get("scmConnection").toString()) + url.set(rootProject.extra.get("scmProjectUrl").toString()) + } + } + pom.withXml { + asNode().apply { + (get("dependencies") as NodeList).forEach { depsNode -> + ((depsNode as Node).get("dependency") as NodeList).forEach { depNode -> + ((depNode as Node).get("scope") as NodeList).forEach { scope -> + if (scope is Node && "runtime" == scope.text()) { + scope.setValue("compile") + } + } + } + } + } + } + } + } +} + +signing { + sign(publishing.publications["mavenJava"]) +} diff --git a/lowkey-vault-client/src/main/java/com/github/nagyesta/lowkeyvault/http/ApacheHttpClient.java b/lowkey-vault-client/src/main/java/com/github/nagyesta/lowkeyvault/http/ApacheHttpClient.java index 50c7f7a0..b48f374b 100644 --- a/lowkey-vault-client/src/main/java/com/github/nagyesta/lowkeyvault/http/ApacheHttpClient.java +++ b/lowkey-vault-client/src/main/java/com/github/nagyesta/lowkeyvault/http/ApacheHttpClient.java @@ -19,7 +19,8 @@ import java.util.function.Function; /** - * Modified class based on https://github.com/Azure/azure-sdk-for-java/wiki/Custom-HTTP-Clients. + * Modified class based on + * https://github.com/Azure/azure-sdk-for-java/wiki/Custom-HTTP-Clients. */ public final class ApacheHttpClient implements HttpClient { private final org.apache.http.client.HttpClient httpClient; diff --git a/lowkey-vault-client/src/main/java/com/github/nagyesta/lowkeyvault/http/management/RecoveryLevel.java b/lowkey-vault-client/src/main/java/com/github/nagyesta/lowkeyvault/http/management/RecoveryLevel.java index f49bb7f3..f0830c9c 100644 --- a/lowkey-vault-client/src/main/java/com/github/nagyesta/lowkeyvault/http/management/RecoveryLevel.java +++ b/lowkey-vault-client/src/main/java/com/github/nagyesta/lowkeyvault/http/management/RecoveryLevel.java @@ -5,41 +5,49 @@ import java.util.Arrays; +@SuppressWarnings("checkstyle:LineLength") public enum RecoveryLevel { /** * Purgeable and not recoverable, subscription not protected. - * See: https://docs.microsoft.com/en-us/rest/api/keyvault/create-key/create-key#deletionrecoverylevel + * See: + * Deletion Recovery Key Level */ PURGEABLE("Purgeable"), /** * Purgeable and recoverable, subscription not protected. - * See: https://docs.microsoft.com/en-us/rest/api/keyvault/create-key/create-key#deletionrecoverylevel + * See: + * Deletion Recovery Key Level */ RECOVERABLE_AND_PURGEABLE("Recoverable+Purgeable"), /** * Recoverable, not purgeable, subscription not protected. - * See: https://docs.microsoft.com/en-us/rest/api/keyvault/create-key/create-key#deletionrecoverylevel + * See: + * Deletion Recovery Key Level */ RECOVERABLE("Recoverable"), /** * Recoverable, not purgeable, subscription protected. - * See: https://docs.microsoft.com/en-us/rest/api/keyvault/create-key/create-key#deletionrecoverylevel + * See: + * Deletion Recovery Key Level */ RECOVERABLE_AND_PROTECTED_SUBSCRIPTION("Recoverable+ProtectedSubscription"), /** * Recoverable for a customized time, purgeable, subscription not protected. - * See: https://docs.microsoft.com/en-us/rest/api/keyvault/create-key/create-key#deletionrecoverylevel + * See: + * Deletion Recovery Key Level */ CUSTOMIZED_RECOVERABLE_AND_PURGEABLE("CustomizedRecoverable+Purgeable"), /** * Recoverable for a customized time, not purgeable, subscription not protected. - * See: https://docs.microsoft.com/en-us/rest/api/keyvault/create-key/create-key#deletionrecoverylevel + * See: + * Deletion Recovery Key Level */ CUSTOMIZED_RECOVERABLE("CustomizedRecoverable"), /** * Recoverable for a customized time, not purgeable, subscription protected. - * See: https://docs.microsoft.com/en-us/rest/api/keyvault/create-key/create-key#deletionrecoverylevel + * See: + * Deletion Recovery Key Level */ CUSTOMIZED_RECOVERABLE_AND_PROTECTED_SUBSCRIPTION("CustomizedRecoverable+ProtectedSubscription"); diff --git a/lowkey-vault-client/src/main/java/com/github/nagyesta/lowkeyvault/http/management/impl/LowkeyVaultManagementClientImpl.java b/lowkey-vault-client/src/main/java/com/github/nagyesta/lowkeyvault/http/management/impl/LowkeyVaultManagementClientImpl.java index ddd62a4d..48c9a816 100644 --- a/lowkey-vault-client/src/main/java/com/github/nagyesta/lowkeyvault/http/management/impl/LowkeyVaultManagementClientImpl.java +++ b/lowkey-vault-client/src/main/java/com/github/nagyesta/lowkeyvault/http/management/impl/LowkeyVaultManagementClientImpl.java @@ -160,7 +160,6 @@ public String exportActive() { public String unpackBackup(final byte[] backup) throws IOException { final byte[] nonNullBackup = Optional.ofNullable(backup) .orElseThrow(() -> new IllegalArgumentException("Backup cannot be null")); - //noinspection LocalCanBeFinal try (ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(nonNullBackup); GZIPInputStream gzipInputStream = new GZIPInputStream(byteArrayInputStream)) { final String json = new String(gzipInputStream.readAllBytes()); @@ -170,7 +169,6 @@ public String unpackBackup(final byte[] backup) throws IOException { @Override public byte[] compressBackup(@NonNull final String backup) throws IOException { - //noinspection LocalCanBeFinal try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); GZIPOutputStream gzipOutputStream = new GZIPOutputStream(byteArrayOutputStream)) { gzipOutputStream.write(backup.getBytes(StandardCharsets.UTF_8)); @@ -223,7 +221,6 @@ private ResponseEntity doSend(final HttpRequest request) { } private ResponseEntity doSendNotNull(final HttpRequest request) { - //noinspection LocalCanBeFinal try (HttpResponse response = instance.send(request).block()) { return new ResponseEntity(Objects.requireNonNull(response), objectReader); } catch (final Exception e) { diff --git a/lowkey-vault-client/src/main/java/com/github/nagyesta/lowkeyvault/http/management/impl/ResponseEntity.java b/lowkey-vault-client/src/main/java/com/github/nagyesta/lowkeyvault/http/management/impl/ResponseEntity.java index 453de8df..4460822d 100644 --- a/lowkey-vault-client/src/main/java/com/github/nagyesta/lowkeyvault/http/management/impl/ResponseEntity.java +++ b/lowkey-vault-client/src/main/java/com/github/nagyesta/lowkeyvault/http/management/impl/ResponseEntity.java @@ -6,6 +6,7 @@ import com.fasterxml.jackson.databind.ObjectReader; import com.github.nagyesta.lowkeyvault.http.management.LowkeyVaultException; import com.github.nagyesta.lowkeyvault.http.management.VaultModel; +import lombok.Getter; import lombok.NonNull; import org.apache.http.HttpStatus; @@ -14,6 +15,7 @@ final class ResponseEntity { public static final ListTypeReference VAULT_MODEL_LIST_TYPE_REF = new ListTypeReference(); + @Getter private final int responseCode; private final String responseBody; private final ObjectReader reader; @@ -29,10 +31,6 @@ public boolean isSuccessful() { return responseCode >= HttpStatus.SC_OK && responseCode < HttpStatus.SC_MULTIPLE_CHOICES; } - public int getResponseCode() { - return responseCode; - } - public T getResponseObject(final Class type) { try { return reader.forType(type).readValue(responseBody); diff --git a/lowkey-vault-client/src/test/java/com/github/nagyesta/lowkeyvault/http/ContentLengthHeaderRemoverTest.java b/lowkey-vault-client/src/test/java/com/github/nagyesta/lowkeyvault/http/ContentLengthHeaderRemoverTest.java index 56f8b707..7a5f2b16 100644 --- a/lowkey-vault-client/src/test/java/com/github/nagyesta/lowkeyvault/http/ContentLengthHeaderRemoverTest.java +++ b/lowkey-vault-client/src/test/java/com/github/nagyesta/lowkeyvault/http/ContentLengthHeaderRemoverTest.java @@ -1,20 +1,16 @@ package com.github.nagyesta.lowkeyvault.http; -import org.apache.http.HttpException; import org.apache.http.HttpRequest; import org.apache.http.protocol.HTTP; import org.apache.http.protocol.HttpContext; import org.junit.jupiter.api.Test; -import java.io.IOException; - -import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.*; class ContentLengthHeaderRemoverTest { @Test - void testProcessShouldRemoveContentLengthWhenCalled() throws HttpException, IOException { + void testProcessShouldRemoveContentLengthWhenCalled() { //given final ContentLengthHeaderRemover underTest = new ContentLengthHeaderRemover(); final HttpRequest request = mock(HttpRequest.class); diff --git a/lowkey-vault-client/src/test/java/com/github/nagyesta/lowkeyvault/http/management/impl/ResponseEntityTest.java b/lowkey-vault-client/src/test/java/com/github/nagyesta/lowkeyvault/http/management/impl/ResponseEntityTest.java index 8cf8b27e..65d6e04e 100644 --- a/lowkey-vault-client/src/test/java/com/github/nagyesta/lowkeyvault/http/management/impl/ResponseEntityTest.java +++ b/lowkey-vault-client/src/test/java/com/github/nagyesta/lowkeyvault/http/management/impl/ResponseEntityTest.java @@ -23,7 +23,6 @@ import java.util.stream.Stream; import static com.github.nagyesta.lowkeyvault.http.management.impl.ResponseEntity.VAULT_MODEL_LIST_TYPE_REF; -import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.*; class ResponseEntityTest { diff --git a/lowkey-vault-docker/README.md b/lowkey-vault-docker/README.md index 3d23cb95..dc4aba1d 100644 --- a/lowkey-vault-docker/README.md +++ b/lowkey-vault-docker/README.md @@ -22,7 +22,7 @@ This is the root of the Docker image. Visit the [Readme](../README.md) in the re ## Startup parameters In case you need to change any of the default parameters, you can use the ```LOWKEY_ARGS``` environment variable with -all necessary arguments supported by [Lowkey Vault App](../lowkey-vault-app/README.md). [Gradle example](build.gradle#L63). +all necessary arguments supported by [Lowkey Vault App](../lowkey-vault-app/README.md). [Gradle example](build.gradle.kts#L63). Shell example: diff --git a/lowkey-vault-docker/build.gradle b/lowkey-vault-docker/build.gradle deleted file mode 100644 index f960f546..00000000 --- a/lowkey-vault-docker/build.gradle +++ /dev/null @@ -1,104 +0,0 @@ -plugins { - id 'java' - alias(libs.plugins.abort.mission) - alias(libs.plugins.docker) - alias(libs.plugins.docker.run) -} - -version = rootProject.version -//noinspection GroovyUnusedAssignment -repositories { - mavenCentral() -} - -group = "${rootProject.group}" - -dependencies { - testImplementation project(":lowkey-vault-client") - testImplementation libs.bouncycastle.bcpkix - testImplementation libs.httpclient - testImplementation libs.commons.codec - testImplementation(libs.azure.security.keyvault.keys) { - exclude(group: "io.netty") - } - testImplementation(libs.azure.security.keyvault.secrets) { - exclude(group: "io.netty") - } - testImplementation(libs.azure.security.keyvault.certificates) { - exclude(group: "io.netty") - } - testImplementation libs.bundles.cucumber - testImplementation libs.abort.mission.cucumber - testImplementation libs.findbugs.jsr305 -} - -java { - sourceCompatibility = JavaVersion.VERSION_17 - toolchain { - languageVersion = JavaLanguageVersion.of(17) - } - withJavadocJar() - withSourcesJar() -} - -tasks.register('copyAppJar', Copy.class) { - inputs.file(rootProject.project(":lowkey-vault-app").tasks.named("bootJar").get().outputs.files.singleFile) - outputs.file(layout.buildDirectory.file("app/lowkey-vault.jar").get().getAsFile()) - from rootProject.project(":lowkey-vault-app").tasks.named("bootJar").get().outputs.files.singleFile - into layout.buildDirectory.dir("app/").get().getAsFile() - rename { - 'lowkey-vault.jar' - } - dependsOn(":lowkey-vault-app:bootJar") - dependsOn(":lowkey-vault-app:test") -} - -docker { - name "lowkey-vault:${rootProject.version}" - tag 'dockerNagyesta', "nagyesta/lowkey-vault:${rootProject.version}" - dockerfile file('src/docker/Dockerfile') - files layout.buildDirectory.file("app/lowkey-vault.jar").get().getAsFile() - pull true - noCache true -} -tasks.dockerPrepare.inputs.file(layout.buildDirectory.file("app/lowkey-vault.jar").get().getAsFile()) -tasks.dockerPrepare.dependsOn copyAppJar -clean.mustRunAfter dockerClean - -dockerRun { - name "lowkey-vault" - image "lowkey-vault:${rootProject.version}" - ports "8444:8443" - daemonize true - arguments '--rm' - env 'LOWKEY_ARGS': '--LOWKEY_DEBUG_REQUEST_LOG=false ' + - '--LOWKEY_VAULT_NAMES=certs-generic,keys-generic,keys-delete,secrets-generic,secrets-delete ' + - '--LOWKEY_VAULT_ALIASES=keys-delete.localhost=keys-alias-delete.localhost:,' + - 'secrets-delete.localhost=secrets-alias-delete.localhost:' -} -tasks.dockerRun.dependsOn tasks.docker - -test { - inputs.file(rootProject.project(":lowkey-vault-app").tasks.named("bootJar").get().outputs.files.singleFile) - outputs.file(layout.buildDirectory.file("reports/abort-mission/abort-mission-report.json").get().getAsFile()) - outputs.dir(layout.buildDirectory.dir("reports/cucumber").get().getAsFile()) - systemProperty("cucumber.execution.parallel.enabled", System.getProperty("test.parallel")) - systemProperty("cucumber.filter.tags", "not @ignore") - useTestNG { - systemProperty("abort-mission.report.directory", layout.buildDirectory.dir("reports/abort-mission/").get().getAsFile()) - systemProperty("abort-mission.force.abort.evaluators", rootProject.ext.dockerAbortGroups) - systemProperty("abort-mission.suppress.abort.evaluators", rootProject.ext.dockerSuppressGroups) - } -} -test.dependsOn tasks.cleanTest -test.dependsOn tasks.dockerRun -test.finalizedBy tasks.dockerStop - -abortMission { - toolVersion libs.versions.abortMission.get() -} - -tasks.register('publish') { - dependsOn(build) - dependsOn("dockerPushDockerNagyesta") -} diff --git a/lowkey-vault-docker/build.gradle.kts b/lowkey-vault-docker/build.gradle.kts new file mode 100644 index 00000000..ed732427 --- /dev/null +++ b/lowkey-vault-docker/build.gradle.kts @@ -0,0 +1,102 @@ +plugins { + id("java") + alias(libs.plugins.abort.mission) + alias(libs.plugins.docker) + alias(libs.plugins.docker.run) +} + +version = rootProject.version +group = rootProject.group + +repositories { + mavenCentral() +} + +dependencies { + testImplementation(project(":lowkey-vault-client")) + testImplementation(libs.bouncycastle.bcpkix) + testImplementation(libs.httpclient) + testImplementation(libs.commons.codec) + testImplementation(libs.azure.security.keyvault.keys) { + exclude(group = "io.netty") + } + testImplementation(libs.azure.security.keyvault.secrets) { + exclude(group = "io.netty") + } + testImplementation(libs.azure.security.keyvault.certificates) { + exclude(group = "io.netty") + } + testImplementation(libs.bundles.cucumber) + testImplementation(libs.abort.mission.cucumber) + testImplementation(libs.findbugs.jsr305) +} + +java { + sourceCompatibility = JavaVersion.VERSION_17 + toolchain { + languageVersion = JavaLanguageVersion.of(17) + } + withJavadocJar() + withSourcesJar() +} + +tasks.register("copyAppJar") { + inputs.file(rootProject.project(":lowkey-vault-app").tasks.named("bootJar").get().outputs.files.singleFile) + outputs.file(layout.buildDirectory.file("app/lowkey-vault.jar").get().asFile) + from(rootProject.project(":lowkey-vault-app").tasks.named("bootJar").get().outputs.files.singleFile) + into(layout.buildDirectory.dir("app/").get().asFile) + rename { + "lowkey-vault.jar" + } + dependsOn(":lowkey-vault-app:bootJar") + dependsOn(":lowkey-vault-app:test") +} + +docker { + name = "lowkey-vault:${rootProject.version}" + tag("dockerNagyesta", "nagyesta/lowkey-vault:${rootProject.version}") + setDockerfile(file("src/docker/Dockerfile")) + files(layout.buildDirectory.file("app/lowkey-vault.jar").get().asFile) + pull(true) + noCache(true) +} +tasks.getByName("dockerPrepare").inputs.file(layout.buildDirectory.file("app/lowkey-vault.jar").get().asFile) +tasks.getByName("dockerPrepare").dependsOn(tasks.getByName("copyAppJar")) +tasks.getByName("clean").mustRunAfter(tasks.getByName("dockerClean")) + +dockerRun { + name = "lowkey-vault" + image = "lowkey-vault:${rootProject.version}" + ports("8444:8443") + daemonize = true + arguments("--rm") + env(mapOf("LOWKEY_ARGS" to "--LOWKEY_DEBUG_REQUEST_LOG=false " + + "--LOWKEY_VAULT_NAMES=certs-generic,keys-generic,keys-delete,secrets-generic,secrets-delete " + + "--LOWKEY_VAULT_ALIASES=keys-delete.localhost=keys-alias-delete.localhost:,secrets-delete.localhost=secrets-alias-delete.localhost:")) +} +tasks.getByName("dockerRun").dependsOn(tasks.getByName("docker")) + +tasks.test { + inputs.file(file("src/docker/Dockerfile")) + inputs.file(rootProject.project(":lowkey-vault-app").tasks.named("bootJar").get().outputs.files.singleFile) + outputs.file(layout.buildDirectory.file("reports/abort-mission/abort-mission-report.json").get().asFile) + outputs.dir(layout.buildDirectory.dir("reports/cucumber").get().asFile) + useTestNG { + systemProperty("cucumber.execution.parallel.enabled", System.getProperty("test.parallel")) + systemProperty("cucumber.filter.tags", "not @ignore") + systemProperty("abort-mission.report.directory", layout.buildDirectory.dir("reports/abort-mission/").get().asFile) + systemProperty("abort-mission.force.abort.evaluators", rootProject.extra.get("dockerAbortGroups") as String) + systemProperty("abort-mission.suppress.abort.evaluators", rootProject.extra.get("dockerSuppressGroups") as String) + } + dependsOn(tasks.getByName("dockerRun")) + finalizedBy(tasks.getByName("dockerStop")) +} + +abortMission { + toolVersion = libs.versions.abortMission.get() +} + +tasks.register("publish") { + dependsOn("build") + dependsOn("dockerPushDockerNagyesta") +} diff --git a/lowkey-vault-docker/src/test/java/com/github/nagyesta/lowkeyvault/context/CommonTestContext.java b/lowkey-vault-docker/src/test/java/com/github/nagyesta/lowkeyvault/context/CommonTestContext.java index 5cb52aa9..5381a758 100644 --- a/lowkey-vault-docker/src/test/java/com/github/nagyesta/lowkeyvault/context/CommonTestContext.java +++ b/lowkey-vault-docker/src/test/java/com/github/nagyesta/lowkeyvault/context/CommonTestContext.java @@ -26,7 +26,7 @@ public abstract class CommonTestContext { private List listedIds; private List listedManagedIds; private List deletedRecoveryIds; - private Map backups = new HashMap(); + private final Map backups = new HashMap<>(); public CommonTestContext(final ApacheHttpClientProvider provider) { this.provider = provider; diff --git a/lowkey-vault-docker/src/test/java/com/github/nagyesta/lowkeyvault/context/ManagementTestContext.java b/lowkey-vault-docker/src/test/java/com/github/nagyesta/lowkeyvault/context/ManagementTestContext.java index 3a1874bc..2d8cf3ba 100644 --- a/lowkey-vault-docker/src/test/java/com/github/nagyesta/lowkeyvault/context/ManagementTestContext.java +++ b/lowkey-vault-docker/src/test/java/com/github/nagyesta/lowkeyvault/context/ManagementTestContext.java @@ -14,7 +14,7 @@ public class ManagementTestContext { private final ObjectMapper objectMapper = new ObjectMapper(); private ApacheHttpClientProvider provider; private LowkeyVaultManagementClient client; - private Map> vaultLists = new TreeMap<>(); + private final Map> vaultLists = new TreeMap<>(); public ManagementTestContext(final ApacheHttpClientProvider provider) { this.provider = provider; diff --git a/lowkey-vault-docker/src/test/java/com/github/nagyesta/lowkeyvault/steps/CertificateStepDefAssertion.java b/lowkey-vault-docker/src/test/java/com/github/nagyesta/lowkeyvault/steps/CertificateStepDefAssertion.java index 0374a0e2..e4df043c 100644 --- a/lowkey-vault-docker/src/test/java/com/github/nagyesta/lowkeyvault/steps/CertificateStepDefAssertion.java +++ b/lowkey-vault-docker/src/test/java/com/github/nagyesta/lowkeyvault/steps/CertificateStepDefAssertion.java @@ -230,8 +230,8 @@ private static OffsetDateTime calculateExpiry(final int expiryMonths, final int private PrivateKey getKeyFromPem(final byte[] content, final X509Certificate certificate) throws CryptoException { try { final KeyFactory kf = KeyFactory.getInstance(certificate.getPublicKey().getAlgorithm(), KeyGenUtil.BOUNCY_CASTLE_PROVIDER); - final PKCS8EncodedKeySpec privSpec = new PKCS8EncodedKeySpec(content); - return kf.generatePrivate(privSpec); + final PKCS8EncodedKeySpec privateSpec = new PKCS8EncodedKeySpec(content); + return kf.generatePrivate(privateSpec); } catch (final Exception e) { throw new CryptoException("Failed to acquire key, sue to exception: " + e.getMessage(), e); } diff --git a/lowkey-vault-docker/src/test/java/com/github/nagyesta/lowkeyvault/steps/CertificatesStepDefs.java b/lowkey-vault-docker/src/test/java/com/github/nagyesta/lowkeyvault/steps/CertificatesStepDefs.java index 1bb15839..c07d3486 100644 --- a/lowkey-vault-docker/src/test/java/com/github/nagyesta/lowkeyvault/steps/CertificatesStepDefs.java +++ b/lowkey-vault-docker/src/test/java/com/github/nagyesta/lowkeyvault/steps/CertificatesStepDefs.java @@ -215,17 +215,15 @@ public void certificatesWithMultiImportPrefixAreDeleted(final int count, final S @And("{int} certificates with {name} prefix are purged") public void certificatesWithMultiImportPrefixArePurged(final int count, final String prefix) { final CertificateClient client = context.getClient(context.getCertificateServiceVersion()); - IntStream.range(1, count + 1).forEach(i -> { - client.purgeDeletedCertificate(prefix + i); - }); + IntStream.range(1, count + 1).forEach(i -> client + .purgeDeletedCertificate(prefix + i)); } @And("{int} certificates with {name} prefix are recovered") public void certificatesWithMultiImportPrefixAreRecovered(final int count, final String prefix) { final CertificateClient client = context.getClient(context.getCertificateServiceVersion()); - IntStream.range(1, count + 1).forEach(i -> { - client.beginRecoverDeletedCertificate(prefix + i).waitForCompletion(); - }); + IntStream.range(1, count + 1).forEach(i -> client + .beginRecoverDeletedCertificate(prefix + i).waitForCompletion()); } @When("the deleted certificates are listed") diff --git a/lowkey-vault-docker/src/test/java/com/github/nagyesta/lowkeyvault/steps/CommonAssertions.java b/lowkey-vault-docker/src/test/java/com/github/nagyesta/lowkeyvault/steps/CommonAssertions.java index 10e1b85b..ad2f7ba2 100644 --- a/lowkey-vault-docker/src/test/java/com/github/nagyesta/lowkeyvault/steps/CommonAssertions.java +++ b/lowkey-vault-docker/src/test/java/com/github/nagyesta/lowkeyvault/steps/CommonAssertions.java @@ -65,7 +65,6 @@ protected void assertByteArrayLength(final int byteArrayLength, final byte[] byt } protected String readResourceContent(final String resource) throws IOException { - //noinspection LocalCanBeFinal try (InputStream stream = getClass().getResourceAsStream(resource); InputStreamReader reader = new InputStreamReader(Objects.requireNonNull(stream)); BufferedReader bufferedReader = new BufferedReader(reader)) { diff --git a/lowkey-vault-docker/src/test/java/com/github/nagyesta/lowkeyvault/steps/KeysStepDefsAssertions.java b/lowkey-vault-docker/src/test/java/com/github/nagyesta/lowkeyvault/steps/KeysStepDefsAssertions.java index 4d8a8064..a8da1c66 100644 --- a/lowkey-vault-docker/src/test/java/com/github/nagyesta/lowkeyvault/steps/KeysStepDefsAssertions.java +++ b/lowkey-vault-docker/src/test/java/com/github/nagyesta/lowkeyvault/steps/KeysStepDefsAssertions.java @@ -202,7 +202,7 @@ public void theKeyNamedAutoRotateHasVersions(final int versions) { final List keyVersions = context.getClient(context.getKeyServiceVersion()) .listPropertiesOfKeyVersions(context.getLastResult().getName()) .stream() - .collect(Collectors.toList()); + .toList(); assertEquals(versions, keyVersions.size()); } diff --git a/lowkey-vault-docker/src/test/java/com/github/nagyesta/lowkeyvault/steps/ListContainer.java b/lowkey-vault-docker/src/test/java/com/github/nagyesta/lowkeyvault/steps/ListContainer.java deleted file mode 100644 index 8f7b1e9f..00000000 --- a/lowkey-vault-docker/src/test/java/com/github/nagyesta/lowkeyvault/steps/ListContainer.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.github.nagyesta.lowkeyvault.steps; - -import java.util.List; -import java.util.function.Consumer; - -public class ListContainer { - private final List list; - - public ListContainer(final List list) { - this.list = list; - } - - public int size() { - return this.list.size(); - } - - public void forEach(final Consumer consumer) { - this.list.forEach(consumer); - } - - public List getList() { - return list; - } -} diff --git a/lowkey-vault-docker/src/test/java/com/github/nagyesta/lowkeyvault/steps/ParameterTypeDefs.java b/lowkey-vault-docker/src/test/java/com/github/nagyesta/lowkeyvault/steps/ParameterTypeDefs.java index b3a31cf9..fec9e39e 100644 --- a/lowkey-vault-docker/src/test/java/com/github/nagyesta/lowkeyvault/steps/ParameterTypeDefs.java +++ b/lowkey-vault-docker/src/test/java/com/github/nagyesta/lowkeyvault/steps/ParameterTypeDefs.java @@ -8,7 +8,6 @@ import io.cucumber.java.ParameterType; import java.nio.charset.StandardCharsets; -import java.text.ParseException; import java.time.OffsetDateTime; import java.time.format.DateTimeFormatter; import java.util.*; @@ -74,7 +73,7 @@ public int rsaKeySize(final String size) { } @ParameterType("([0-9]{4}-[0-9]{2}-[0-9]{2})") - public OffsetDateTime expiry(final String date) throws ParseException { + public OffsetDateTime expiry(final String date) { return OffsetDateTime.parse(date + "T00:00:00+00:00", DateTimeFormatter.ISO_OFFSET_DATE_TIME); } diff --git a/lowkey-vault-testcontainers/build.gradle b/lowkey-vault-testcontainers/build.gradle deleted file mode 100644 index 9a2c1fa5..00000000 --- a/lowkey-vault-testcontainers/build.gradle +++ /dev/null @@ -1,88 +0,0 @@ -plugins { - id 'java' -} - -group = "${rootProject.group}" - -project.ext { - artifactDisplayName = "Lowkey Vault - Testcontainers" - artifactDescription = "Support for using Lowkey Vault with Testcontainers." -} - -dependencies { - implementation platform("org.testcontainers:testcontainers-bom:${libs.versions.testcontainers.get()}") //import bom - implementation libs.testcontainers - testImplementation libs.testcontainers.jupiter - testImplementation project(":lowkey-vault-client") - testImplementation libs.bundles.jackson - testImplementation libs.httpclient - testImplementation libs.commons.codec - testImplementation(libs.azure.security.keyvault.keys) { - exclude(group: "io.netty") - } - testImplementation(libs.azure.security.keyvault.secrets) { - exclude(group: "io.netty") - } - testImplementation libs.mockito.core - testImplementation libs.jupiter - testRuntimeOnly("org.junit.platform:junit-platform-launcher") - testImplementation libs.logback.classic -} - -java { - sourceCompatibility = JavaVersion.VERSION_11 - toolchain { - languageVersion = JavaLanguageVersion.of(11) - } - withJavadocJar() - withSourcesJar() -} - -test { - useJUnitPlatform() - systemProperty("imageVersion", project.version) - mustRunAfter(":lowkey-vault-docker:build") - mustRunAfter(":lowkey-vault-docker:test") -} - -publishing { - publications { - mavenJava(MavenPublication) { - from components.java - artifactId = "${project.name}" - pom { - name = "${project.artifactDisplayName}" - description = "${project.artifactDescription}" - url = rootProject.ext.repoUrl - packaging = "jar" - licenses { - license { - name = rootProject.ext.licenseName - url = rootProject.ext.licenseUrl - } - } - developers { - developer { - id = rootProject.ext.maintainerId - name = rootProject.ext.maintainerName - url = rootProject.ext.maintainerUrl - } - } - scm { - connection = rootProject.ext.scmConnection - developerConnection = rootProject.ext.scmConnection - url = rootProject.ext.scmProjectUrl - } - withXml { - asNode().dependencies.'*'.findAll() { - it.scope.text() == 'runtime' - }.each { it.scope*.value = 'compile' } - } - } - } - } -} - -signing { - sign publishing.publications.mavenJava -} diff --git a/lowkey-vault-testcontainers/build.gradle.kts b/lowkey-vault-testcontainers/build.gradle.kts new file mode 100644 index 00000000..f46efb71 --- /dev/null +++ b/lowkey-vault-testcontainers/build.gradle.kts @@ -0,0 +1,134 @@ +import groovy.util.Node +import groovy.util.NodeList + +plugins { + id("java") + signing + `maven-publish` + alias(libs.plugins.licensee.plugin) +} + +group = rootProject.group + +project.ext { + set("artifactDisplayName", "Lowkey Vault - Testcontainers") + set("artifactDescription", "Support for using Lowkey Vault with Testcontainers.") +} + +dependencies { + implementation(platform("org.testcontainers:testcontainers-bom:${libs.versions.testcontainers.get()}")) //import bom + implementation(libs.testcontainers) + testImplementation(libs.testcontainers.jupiter) + testImplementation(project(":lowkey-vault-client")) + testImplementation(libs.bundles.jackson) + testImplementation(libs.httpclient) + testImplementation(libs.commons.codec) + testImplementation(libs.azure.security.keyvault.keys) { + exclude(group = "io.netty") + } + testImplementation(libs.azure.security.keyvault.secrets) { + exclude(group = "io.netty") + } + testImplementation(libs.mockito.core) + testImplementation(libs.jupiter) + testRuntimeOnly("org.junit.platform:junit-platform-launcher") + testImplementation(libs.logback.classic) +} + +licensee { + allow("Apache-2.0") + allow("MIT") + allow("EPL-1.0") + allow("BSD-2-Clause") +} + +java { + sourceCompatibility = JavaVersion.VERSION_11 + toolchain { + languageVersion = JavaLanguageVersion.of(11) + } + withJavadocJar() + withSourcesJar() +} + +val copyLegalDocs = tasks.register("copyLegalDocs") { + from(file("${project.rootProject.projectDir}/LICENSE")) + from(layout.buildDirectory.file("reports/licensee/artifacts.json").get().asFile) + from(layout.buildDirectory.file("reports/bom.json").get().asFile) + into(layout.buildDirectory.dir("resources/main/META-INF").get().asFile) + rename("artifacts.json", "dependency-licenses.json") + rename("bom.json", "SBOM.json") +}.get() +copyLegalDocs.dependsOn(tasks.licensee) +copyLegalDocs.dependsOn(tasks.cyclonedxBom) +tasks.javadoc.get().dependsOn(copyLegalDocs) +tasks.compileJava.get().dependsOn(copyLegalDocs) +tasks.processResources.get().finalizedBy(copyLegalDocs) + +tasks.test { + useJUnitPlatform() + systemProperty("imageVersion", project.version) + mustRunAfter(":lowkey-vault-docker:build") + mustRunAfter(":lowkey-vault-docker:test") + finalizedBy(tasks.getByName("jacocoTestReport")) +} + +publishing { + repositories { + maven { + name = "GitHubPackages" + url = uri(rootProject.extra.get("githubMavenRepoUrl").toString()) + credentials { + username = rootProject.extra.get("gitUser").toString() + password = rootProject.extra.get("gitToken").toString() + } + } + } + publications { + create("mavenJava") { + from(components["java"]) + artifactId = project.name + pom { + name.set(project.extra.get("artifactDisplayName").toString()) + description.set(project.extra.get("artifactDescription").toString()) + url.set(rootProject.extra.get("repoUrl").toString()) + packaging = "jar" + licenses { + license { + name.set(rootProject.extra.get("licenseName").toString()) + url.set(rootProject.extra.get("licenseUrl").toString()) + } + } + developers { + developer { + id.set(rootProject.extra.get("maintainerId").toString()) + name.set(rootProject.extra.get("maintainerName").toString()) + email.set(rootProject.extra.get("maintainerUrl").toString()) + } + } + scm { + connection.set(rootProject.extra.get("scmConnection").toString()) + developerConnection.set(rootProject.extra.get("scmConnection").toString()) + url.set(rootProject.extra.get("scmProjectUrl").toString()) + } + } + pom.withXml { + asNode().apply { + (get("dependencies") as NodeList).forEach { depsNode -> + ((depsNode as Node).get("dependency") as NodeList).forEach { depNode -> + ((depNode as Node).get("scope") as NodeList).forEach { scope -> + if (scope is Node && "runtime" == scope.text()) { + scope.setValue("compile") + } + } + } + } + } + } + } + } +} + +signing { + sign(publishing.publications["mavenJava"]) +} diff --git a/lowkey-vault-testcontainers/src/main/java/com/github/nagyesta/lowkeyvault/testcontainers/LowkeyVaultContainer.java b/lowkey-vault-testcontainers/src/main/java/com/github/nagyesta/lowkeyvault/testcontainers/LowkeyVaultContainer.java index 4dbe2963..d5917d76 100644 --- a/lowkey-vault-testcontainers/src/main/java/com/github/nagyesta/lowkeyvault/testcontainers/LowkeyVaultContainer.java +++ b/lowkey-vault-testcontainers/src/main/java/com/github/nagyesta/lowkeyvault/testcontainers/LowkeyVaultContainer.java @@ -259,7 +259,7 @@ protected void recommendMultiArchImageIfApplicable( if (defaultImageUsed && hostArchIsNotAmd64 && imageIsNotMultiArch) { logger.warn("An amd64 image is detected with non-amd64 ({}) host.", hostArch); logger.warn("Please consider using a multi-arch image, like: {}-ubi9-minimal", versionPart); - logger.warn(("See more information: https://github.com/nagyesta/lowkey-vault/tree/main/lowkey-vault-docker#arm-builds")); + logger.warn("See more information: https://github.com/nagyesta/lowkey-vault/tree/main/lowkey-vault-docker#arm-builds"); } } } diff --git a/settings.gradle b/settings.gradle deleted file mode 100644 index f8381404..00000000 --- a/settings.gradle +++ /dev/null @@ -1,5 +0,0 @@ -rootProject.name = 'lowkey-vault' -include 'lowkey-vault-app' -include 'lowkey-vault-client' -include 'lowkey-vault-docker' -include 'lowkey-vault-testcontainers' diff --git a/settings.gradle.kts b/settings.gradle.kts new file mode 100644 index 00000000..656ece9e --- /dev/null +++ b/settings.gradle.kts @@ -0,0 +1,5 @@ +rootProject.name = "lowkey-vault" +include("lowkey-vault-app") +include("lowkey-vault-client") +include("lowkey-vault-docker") +include("lowkey-vault-testcontainers")