From 8385c874f4fd05152f253ac4c5f83bc92ead5734 Mon Sep 17 00:00:00 2001 From: Simon Kempendorf Date: Fri, 28 Jun 2024 11:28:06 +0200 Subject: [PATCH] Enable linting and fix formatting --- build.gradle.kts | 2 +- .../tice/wallet/WalletServerApplication.kt | 2 +- .../attestation/controllers/IssuerApi.kt | 12 ++- .../attestation/controllers/WalletApi.kt | 16 ++-- .../attestation/repositories/UserEntity.kt | 10 ++- .../repositories/UserRepository.kt | 2 - .../requests/AttestationRequest.kt | 4 +- .../attestation/requests/NonceRequest.kt | 2 +- .../attestation/requests/ValidationRequest.kt | 2 +- .../responses/AttestationResponse.kt | 2 +- .../attestation/responses/NonceResponse.kt | 4 +- .../attestation/services/WalletApiService.kt | 79 ++++++++++--------- .../services/WalletApiServiceTests.kt | 17 ++-- 13 files changed, 84 insertions(+), 70 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 3204467..e2edcff 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -54,7 +54,7 @@ tasks.withType { spotless { kotlin { -// ktlint() + ktlint() } kotlinGradle { ktlint() diff --git a/src/main/kotlin/software/tice/wallet/WalletServerApplication.kt b/src/main/kotlin/software/tice/wallet/WalletServerApplication.kt index c42040a..2f754b6 100644 --- a/src/main/kotlin/software/tice/wallet/WalletServerApplication.kt +++ b/src/main/kotlin/software/tice/wallet/WalletServerApplication.kt @@ -7,5 +7,5 @@ import org.springframework.boot.runApplication class WalletServerApplication fun main(args: Array) { - runApplication(*args) + runApplication(*args) } diff --git a/src/main/kotlin/software/tice/wallet/attestation/controllers/IssuerApi.kt b/src/main/kotlin/software/tice/wallet/attestation/controllers/IssuerApi.kt index c7c3c66..da66a59 100644 --- a/src/main/kotlin/software/tice/wallet/attestation/controllers/IssuerApi.kt +++ b/src/main/kotlin/software/tice/wallet/attestation/controllers/IssuerApi.kt @@ -2,15 +2,19 @@ package software.tice.wallet.attestation.controllers import org.springframework.http.HttpStatus import org.springframework.http.ResponseEntity -import org.springframework.web.bind.annotation.* +import org.springframework.web.bind.annotation.PostMapping +import org.springframework.web.bind.annotation.RequestBody +import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.web.bind.annotation.RestController import software.tice.wallet.attestation.requests.ValidationRequest @RestController @RequestMapping("attestation") class IssuerApi { - @PostMapping("/validation") - fun validateAttestation(@RequestBody request: ValidationRequest): ResponseEntity { + fun validateAttestation( + @RequestBody request: ValidationRequest, + ): ResponseEntity { return ResponseEntity.status(HttpStatus.OK).body(null) } -} \ No newline at end of file +} diff --git a/src/main/kotlin/software/tice/wallet/attestation/controllers/WalletApi.kt b/src/main/kotlin/software/tice/wallet/attestation/controllers/WalletApi.kt index 9a26aee..6c1ae49 100644 --- a/src/main/kotlin/software/tice/wallet/attestation/controllers/WalletApi.kt +++ b/src/main/kotlin/software/tice/wallet/attestation/controllers/WalletApi.kt @@ -1,6 +1,10 @@ package software.tice.wallet.attestation.controllers -import org.springframework.web.bind.annotation.* +import org.springframework.web.bind.annotation.PathVariable +import org.springframework.web.bind.annotation.PostMapping +import org.springframework.web.bind.annotation.RequestBody +import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.web.bind.annotation.RestController import software.tice.wallet.attestation.requests.AttestationRequest import software.tice.wallet.attestation.requests.NonceRequest import software.tice.wallet.attestation.responses.AttestationResponse @@ -9,19 +13,19 @@ import software.tice.wallet.attestation.services.WalletApiService @RestController @RequestMapping("attestation") - class WalletApi(val walletApiService: WalletApiService) { - @PostMapping("/nonces") - fun requestNonces(@RequestBody request: NonceRequest): NonceResponse { + fun requestNonces( + @RequestBody request: NonceRequest, + ): NonceResponse { return walletApiService.requestNonces(request.walletInstanceId) } @PostMapping("/request/{id}") fun requestAttestation( @RequestBody request: AttestationRequest, - @PathVariable id: String + @PathVariable id: String, ): AttestationResponse { return walletApiService.requestAttestation(request, id) } -} \ No newline at end of file +} diff --git a/src/main/kotlin/software/tice/wallet/attestation/repositories/UserEntity.kt b/src/main/kotlin/software/tice/wallet/attestation/repositories/UserEntity.kt index b3f7bc6..73820a9 100644 --- a/src/main/kotlin/software/tice/wallet/attestation/repositories/UserEntity.kt +++ b/src/main/kotlin/software/tice/wallet/attestation/repositories/UserEntity.kt @@ -1,7 +1,9 @@ package software.tice.wallet.attestation.repositories -import jakarta.persistence.* - +import jakarta.persistence.Entity +import jakarta.persistence.GeneratedValue +import jakarta.persistence.GenerationType +import jakarta.persistence.Id @Entity(name = "users") data class UserEntity( @@ -10,5 +12,5 @@ data class UserEntity( var id: Long?, var walletInstanceId: String, var popNonce: String?, - var keyAttestationNonce: String? -) \ No newline at end of file + var keyAttestationNonce: String?, +) diff --git a/src/main/kotlin/software/tice/wallet/attestation/repositories/UserRepository.kt b/src/main/kotlin/software/tice/wallet/attestation/repositories/UserRepository.kt index f3501d3..a7706e3 100644 --- a/src/main/kotlin/software/tice/wallet/attestation/repositories/UserRepository.kt +++ b/src/main/kotlin/software/tice/wallet/attestation/repositories/UserRepository.kt @@ -3,7 +3,5 @@ package software.tice.wallet.attestation.repositories import org.springframework.data.jpa.repository.JpaRepository import org.springframework.stereotype.Repository - @Repository interface UserRepository : JpaRepository - diff --git a/src/main/kotlin/software/tice/wallet/attestation/requests/AttestationRequest.kt b/src/main/kotlin/software/tice/wallet/attestation/requests/AttestationRequest.kt index 23b7f6a..cd7f0e1 100644 --- a/src/main/kotlin/software/tice/wallet/attestation/requests/AttestationRequest.kt +++ b/src/main/kotlin/software/tice/wallet/attestation/requests/AttestationRequest.kt @@ -4,5 +4,5 @@ data class AttestationRequest( val attestationPublicKey: String, val proofOfPossession: String, val keyAttestation: String, - val appAttestation: String -) \ No newline at end of file + val appAttestation: String, +) diff --git a/src/main/kotlin/software/tice/wallet/attestation/requests/NonceRequest.kt b/src/main/kotlin/software/tice/wallet/attestation/requests/NonceRequest.kt index 8fbe07f..0a6993e 100644 --- a/src/main/kotlin/software/tice/wallet/attestation/requests/NonceRequest.kt +++ b/src/main/kotlin/software/tice/wallet/attestation/requests/NonceRequest.kt @@ -1,3 +1,3 @@ package software.tice.wallet.attestation.requests -data class NonceRequest(val walletInstanceId: String) \ No newline at end of file +data class NonceRequest(val walletInstanceId: String) diff --git a/src/main/kotlin/software/tice/wallet/attestation/requests/ValidationRequest.kt b/src/main/kotlin/software/tice/wallet/attestation/requests/ValidationRequest.kt index b955680..334d02f 100644 --- a/src/main/kotlin/software/tice/wallet/attestation/requests/ValidationRequest.kt +++ b/src/main/kotlin/software/tice/wallet/attestation/requests/ValidationRequest.kt @@ -1,3 +1,3 @@ package software.tice.wallet.attestation.requests -data class ValidationRequest(val walletAttestation: String) \ No newline at end of file +data class ValidationRequest(val walletAttestation: String) diff --git a/src/main/kotlin/software/tice/wallet/attestation/responses/AttestationResponse.kt b/src/main/kotlin/software/tice/wallet/attestation/responses/AttestationResponse.kt index fb1ff42..e4cf0d7 100644 --- a/src/main/kotlin/software/tice/wallet/attestation/responses/AttestationResponse.kt +++ b/src/main/kotlin/software/tice/wallet/attestation/responses/AttestationResponse.kt @@ -1,3 +1,3 @@ package software.tice.wallet.attestation.responses -data class AttestationResponse(val walletAttestation: String) \ No newline at end of file +data class AttestationResponse(val walletAttestation: String) diff --git a/src/main/kotlin/software/tice/wallet/attestation/responses/NonceResponse.kt b/src/main/kotlin/software/tice/wallet/attestation/responses/NonceResponse.kt index f96b47e..e5fe3a4 100644 --- a/src/main/kotlin/software/tice/wallet/attestation/responses/NonceResponse.kt +++ b/src/main/kotlin/software/tice/wallet/attestation/responses/NonceResponse.kt @@ -2,5 +2,5 @@ package software.tice.wallet.attestation.responses data class NonceResponse( val popNonce: String, - val keyAttestationNonce: String -) \ No newline at end of file + val keyAttestationNonce: String, +) diff --git a/src/main/kotlin/software/tice/wallet/attestation/services/WalletApiService.kt b/src/main/kotlin/software/tice/wallet/attestation/services/WalletApiService.kt index 926271e..69ca292 100644 --- a/src/main/kotlin/software/tice/wallet/attestation/services/WalletApiService.kt +++ b/src/main/kotlin/software/tice/wallet/attestation/services/WalletApiService.kt @@ -11,42 +11,49 @@ import software.tice.wallet.attestation.responses.AttestationResponse import software.tice.wallet.attestation.responses.NonceResponse import java.security.KeyFactory import java.security.spec.PKCS8EncodedKeySpec -import java.util.* +import java.util.Base64 +import java.util.UUID @Service -class WalletApiService @Autowired constructor( - @Value("\${private.key}") - private val privateKey: String, - private val userRepository: UserRepository, - -) { - fun requestNonces(walletInstanceId: String): NonceResponse { - val (popNonce, keyAttestationNonce) = List(2) { UUID.randomUUID().toString() } - - val user = UserEntity( - walletInstanceId = walletInstanceId, - popNonce = popNonce, - keyAttestationNonce = keyAttestationNonce, - id = null - ) - - userRepository.save(user) - return NonceResponse(popNonce = popNonce, keyAttestationNonce = keyAttestationNonce ) +class WalletApiService + @Autowired + constructor( + @Value("\${private.key}") + private val privateKey: String, + private val userRepository: UserRepository, + ) { + fun requestNonces(walletInstanceId: String): NonceResponse { + val (popNonce, keyAttestationNonce) = List(2) { UUID.randomUUID().toString() } + + val user = + UserEntity( + walletInstanceId = walletInstanceId, + popNonce = popNonce, + keyAttestationNonce = keyAttestationNonce, + id = null, + ) + + userRepository.save(user) + return NonceResponse(popNonce = popNonce, keyAttestationNonce = keyAttestationNonce) + } + + fun requestAttestation( + requestAttestation: AttestationRequest, + id: String, + ): AttestationResponse { + val privateKey = privateKey + val pem = + privateKey + .replace("-----BEGIN PRIVATE KEY-----", "") + .replace("-----END PRIVATE KEY-----", "") + + val decodedKey = Base64.getDecoder().decode(pem) + + val keySpec = PKCS8EncodedKeySpec(decodedKey) + val keyFactory = KeyFactory.getInstance("EC") + val privateKeyReloaded = keyFactory.generatePrivate(keySpec) + + val walletAttestation: String = Jwts.builder().subject("Joe").signWith(privateKeyReloaded).compact() + return AttestationResponse(walletAttestation) + } } - - fun requestAttestation(requestAttestation: AttestationRequest, id: String): AttestationResponse { - val privateKey = privateKey - val pem = privateKey - .replace("-----BEGIN PRIVATE KEY-----", "") - .replace("-----END PRIVATE KEY-----", "") - - val decodedKey = Base64.getDecoder().decode(pem) - - val keySpec = PKCS8EncodedKeySpec(decodedKey) - val keyFactory = KeyFactory.getInstance("EC") - val privateKeyReloaded = keyFactory.generatePrivate(keySpec) - - val walletAttestation: String = Jwts.builder().subject("Joe").signWith(privateKeyReloaded).compact() - return AttestationResponse(walletAttestation) - } -} \ No newline at end of file diff --git a/src/test/kotlin/software/tice/wallet/attestation/services/WalletApiServiceTests.kt b/src/test/kotlin/software/tice/wallet/attestation/services/WalletApiServiceTests.kt index aac5310..70c0ecd 100644 --- a/src/test/kotlin/software/tice/wallet/attestation/services/WalletApiServiceTests.kt +++ b/src/test/kotlin/software/tice/wallet/attestation/services/WalletApiServiceTests.kt @@ -4,7 +4,8 @@ import io.jsonwebtoken.Jwts import org.junit.jupiter.api.BeforeEach import org.junit.jupiter.api.Test import org.junit.jupiter.api.extension.ExtendWith -import org.mockito.* +import org.mockito.ArgumentCaptor +import org.mockito.Captor import org.mockito.Mockito.verify import org.mockito.junit.jupiter.MockitoExtension import org.springframework.boot.test.context.SpringBootTest @@ -14,14 +15,13 @@ import software.tice.wallet.attestation.repositories.UserEntity import software.tice.wallet.attestation.repositories.UserRepository import software.tice.wallet.attestation.requests.AttestationRequest import java.security.KeyPair -import java.util.* +import java.util.Base64 import kotlin.test.assertEquals @SpringBootTest @ExtendWith(MockitoExtension::class) @ContextConfiguration(classes = [UserRepository::class]) class WalletApiServiceTests { - @MockBean private lateinit var userRepository: UserRepository @@ -32,7 +32,6 @@ class WalletApiServiceTests { private val keyPair: KeyPair = Jwts.SIG.ES256.keyPair().build() - @BeforeEach fun setup() { val privateKey = Base64.getEncoder().encodeToString(keyPair.private.encoded) @@ -52,17 +51,17 @@ class WalletApiServiceTests { assertEquals(response.keyAttestationNonce, savedUser.keyAttestationNonce) } - @Test fun `should return correct wallet attestation`() { - val request = AttestationRequest("PUBLIC_KEY","POP","KEY_ATTESTATION", "APP_ATTESTATION") + val request = AttestationRequest("PUBLIC_KEY", "POP", "KEY_ATTESTATION", "APP_ATTESTATION") val walletInstanceId = "f74813c9-3435-4028-8e0c-018dd34d3b60" val response = walletApiService.requestAttestation(request, walletInstanceId) - val parser = Jwts.parser() - .verifyWith(keyPair.public) - .build() + val parser = + Jwts.parser() + .verifyWith(keyPair.public) + .build() assertEquals(parser.parseSignedClaims(response.walletAttestation).payload.subject, "Joe") } }