diff --git a/application/src/integrationTest/kotlin/org/gxf/crestdeviceservice/CoapMessageHandlingTest.kt b/application/src/integrationTest/kotlin/org/gxf/crestdeviceservice/CoapMessageHandlingTest.kt index ae6f13b6..ece84e64 100644 --- a/application/src/integrationTest/kotlin/org/gxf/crestdeviceservice/CoapMessageHandlingTest.kt +++ b/application/src/integrationTest/kotlin/org/gxf/crestdeviceservice/CoapMessageHandlingTest.kt @@ -1,9 +1,9 @@ // SPDX-FileCopyrightText: Contributors to the GXF project // // SPDX-License-Identifier: Apache-2.0 - package org.gxf.crestdeviceservice +import java.time.Instant import org.assertj.core.api.Assertions.assertThat import org.gxf.crestdeviceservice.IntegrationTestHelper.getFileContentAsString import org.gxf.crestdeviceservice.psk.entity.PreSharedKey @@ -21,11 +21,10 @@ import org.springframework.http.HttpHeaders import org.springframework.http.MediaType import org.springframework.kafka.test.context.EmbeddedKafka import org.springframework.test.annotation.DirtiesContext -import java.time.Instant @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) @EmbeddedKafka( - topics = ["\${crest-device-service.kafka.message-producer.topic-name}"], + topics = ["\${crest-device-service.kafka.message-producer.topic-name}"], ) @DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) class CoapMessageHandlingTest { @@ -37,24 +36,15 @@ class CoapMessageHandlingTest { private const val SECRET = "123456789" } - @Autowired - private lateinit var restTemplate: TestRestTemplate + @Autowired private lateinit var restTemplate: TestRestTemplate - @Autowired - private lateinit var pskRepository: PskRepository + @Autowired private lateinit var pskRepository: PskRepository @BeforeEach fun setup() { pskRepository.save( PreSharedKey( - IDENTITY, - 0, - Instant.MIN, - PRE_SHARED_KEY_FIRST, - SECRET, - PreSharedKeyStatus.ACTIVE - ) - ) + IDENTITY, 0, Instant.MIN, PRE_SHARED_KEY_FIRST, SECRET, PreSharedKeyStatus.ACTIVE)) } @AfterEach @@ -66,14 +56,7 @@ class CoapMessageHandlingTest { fun shouldReturnADownLinkContainingAPskSetCommandWhenTheKeyHasNotChangedYet() { pskRepository.save( PreSharedKey( - IDENTITY, - 1, - Instant.now(), - PRE_SHARED_KEY_NEW, - SECRET, - PreSharedKeyStatus.READY - ) - ) + IDENTITY, 1, Instant.now(), PRE_SHARED_KEY_NEW, SECRET, PreSharedKeyStatus.READY)) val headers = HttpHeaders().apply { contentType = MediaType.APPLICATION_JSON } val request = HttpEntity(getFileContentAsString("message.json"), headers) @@ -88,14 +71,7 @@ class CoapMessageHandlingTest { // pending psk, waiting for URC in next message from device pskRepository.save( PreSharedKey( - IDENTITY, - 1, - Instant.now(), - PRE_SHARED_KEY_NEW, - SECRET, - PreSharedKeyStatus.PENDING - ) - ) + IDENTITY, 1, Instant.now(), PRE_SHARED_KEY_NEW, SECRET, PreSharedKeyStatus.PENDING)) val headers = HttpHeaders().apply { contentType = MediaType.APPLICATION_JSON } val request = @@ -116,14 +92,7 @@ class CoapMessageHandlingTest { // pending psk, waiting for URC in next message from device pskRepository.save( PreSharedKey( - IDENTITY, - 1, - Instant.MIN, - PRE_SHARED_KEY_NEW, - SECRET, - PreSharedKeyStatus.PENDING - ) - ) + IDENTITY, 1, Instant.MIN, PRE_SHARED_KEY_NEW, SECRET, PreSharedKeyStatus.PENDING)) val headers = HttpHeaders().apply { contentType = MediaType.APPLICATION_JSON } val request = diff --git a/application/src/integrationTest/kotlin/org/gxf/crestdeviceservice/DeviceCredentialsRetrievalTest.kt b/application/src/integrationTest/kotlin/org/gxf/crestdeviceservice/DeviceCredentialsRetrievalTest.kt index 4bbee617..b5ae660c 100644 --- a/application/src/integrationTest/kotlin/org/gxf/crestdeviceservice/DeviceCredentialsRetrievalTest.kt +++ b/application/src/integrationTest/kotlin/org/gxf/crestdeviceservice/DeviceCredentialsRetrievalTest.kt @@ -1,9 +1,9 @@ // SPDX-FileCopyrightText: Contributors to the GXF project // // SPDX-License-Identifier: Apache-2.0 - package org.gxf.crestdeviceservice +import java.time.Instant import org.assertj.core.api.Assertions.assertThat import org.gxf.crestdeviceservice.psk.entity.PreSharedKey import org.gxf.crestdeviceservice.psk.entity.PreSharedKeyStatus @@ -19,12 +19,10 @@ import org.springframework.http.HttpHeaders import org.springframework.http.HttpMethod import org.springframework.http.HttpStatus import org.springframework.kafka.test.context.EmbeddedKafka -import java.time.Instant - @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) @EmbeddedKafka( - topics = ["\${crest-device-service.kafka.message-producer.topic-name}"], + topics = ["\${crest-device-service.kafka.message-producer.topic-name}"], ) class DeviceCredentialsRetrievalTest { @@ -34,24 +32,15 @@ class DeviceCredentialsRetrievalTest { private const val SECRET = "123456789" } - @Autowired - private lateinit var restTemplate: TestRestTemplate + @Autowired private lateinit var restTemplate: TestRestTemplate - @Autowired - private lateinit var pskRepository: PskRepository + @Autowired private lateinit var pskRepository: PskRepository @BeforeEach fun setup() { pskRepository.save( PreSharedKey( - IDENTITY, - 0, - Instant.MIN, - PRE_SHARED_KEY, - SECRET, - PreSharedKeyStatus.ACTIVE - ) - ) + IDENTITY, 0, Instant.MIN, PRE_SHARED_KEY, SECRET, PreSharedKeyStatus.ACTIVE)) } @AfterEach @@ -64,18 +53,12 @@ class DeviceCredentialsRetrievalTest { // create second PSK for identity this one should be returned pskRepository.save( PreSharedKey( - IDENTITY, - 1, - Instant.MIN, - "0000111122223333", - SECRET, - PreSharedKeyStatus.ACTIVE - ) - ) + IDENTITY, 1, Instant.MIN, "0000111122223333", SECRET, PreSharedKeyStatus.ACTIVE)) val headers = HttpHeaders().apply { add("x-device-identity", IDENTITY) } - val result = restTemplate.exchange("/psk", - HttpMethod.GET, HttpEntity(headers), String::class.java) + val result = + restTemplate.exchange( + "/psk", HttpMethod.GET, HttpEntity(headers), String::class.java) assertThat(result.body).isEqualTo("0000111122223333") } @@ -83,8 +66,9 @@ class DeviceCredentialsRetrievalTest { @Test fun shouldReturn404WhenNoKeyIsFound() { val headers = HttpHeaders().apply { add("x-device-identity", "12345") } - val result = restTemplate.exchange("/psk", - HttpMethod.GET, HttpEntity(headers), String::class.java) + val result = + restTemplate.exchange( + "/psk", HttpMethod.GET, HttpEntity(headers), String::class.java) assertThat(result.statusCode).isEqualTo(HttpStatus.NOT_FOUND) } diff --git a/application/src/integrationTest/kotlin/org/gxf/crestdeviceservice/IntegrationTestHelper.kt b/application/src/integrationTest/kotlin/org/gxf/crestdeviceservice/IntegrationTestHelper.kt index 6e9e1fbd..dcc6fad5 100644 --- a/application/src/integrationTest/kotlin/org/gxf/crestdeviceservice/IntegrationTestHelper.kt +++ b/application/src/integrationTest/kotlin/org/gxf/crestdeviceservice/IntegrationTestHelper.kt @@ -1,7 +1,6 @@ // SPDX-FileCopyrightText: Contributors to the GXF project // // SPDX-License-Identifier: Apache-2.0 - package org.gxf.crestdeviceservice import com.gxf.utilities.kafka.avro.AvroDeserializer @@ -15,15 +14,14 @@ import org.springframework.util.ResourceUtils object IntegrationTestHelper { - fun createKafkaConsumer(embeddedKafkaBroker: EmbeddedKafkaBroker, topic: String): Consumer { - val testProperties = - KafkaTestUtils.consumerProps("testGroup", "true", embeddedKafkaBroker) + fun createKafkaConsumer( + embeddedKafkaBroker: EmbeddedKafkaBroker, + topic: String + ): Consumer { + val testProperties = KafkaTestUtils.consumerProps("testGroup", "true", embeddedKafkaBroker) val consumerFactory = - DefaultKafkaConsumerFactory( - testProperties, - StringDeserializer(), - AvroDeserializer(DeviceMessage.getDecoder()) - ) + DefaultKafkaConsumerFactory( + testProperties, StringDeserializer(), AvroDeserializer(DeviceMessage.getDecoder())) val consumer = consumerFactory.createConsumer() embeddedKafkaBroker.consumeFromAnEmbeddedTopic(consumer, topic) return consumer @@ -32,5 +30,4 @@ object IntegrationTestHelper { fun getFileContentAsString(path: String): String { return ResourceUtils.getFile("classpath:$path").readText() } - } diff --git a/application/src/integrationTest/kotlin/org/gxf/crestdeviceservice/MessageHandlingTest.kt b/application/src/integrationTest/kotlin/org/gxf/crestdeviceservice/MessageHandlingTest.kt index 7524bcfd..e3fd30f9 100644 --- a/application/src/integrationTest/kotlin/org/gxf/crestdeviceservice/MessageHandlingTest.kt +++ b/application/src/integrationTest/kotlin/org/gxf/crestdeviceservice/MessageHandlingTest.kt @@ -1,9 +1,9 @@ // SPDX-FileCopyrightText: Contributors to the GXF project // // SPDX-License-Identifier: Apache-2.0 - package org.gxf.crestdeviceservice +import java.time.Duration import org.assertj.core.api.Assertions.assertThat import org.gxf.crestdeviceservice.IntegrationTestHelper.createKafkaConsumer import org.gxf.crestdeviceservice.IntegrationTestHelper.getFileContentAsString @@ -21,24 +21,20 @@ import org.springframework.kafka.test.EmbeddedKafkaBroker import org.springframework.kafka.test.context.EmbeddedKafka import org.springframework.test.annotation.DirtiesContext import org.testcontainers.shaded.com.fasterxml.jackson.databind.ObjectMapper -import java.time.Duration @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) @EmbeddedKafka( - topics = ["\${crest-device-service.kafka.message-producer.topic-name}"], + topics = ["\${crest-device-service.kafka.message-producer.topic-name}"], ) @DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD) @EnableConfigurationProperties(KafkaProducerProperties::class) class MessageHandlingTest { - @Autowired - private lateinit var kafkaProducerProperties: KafkaProducerProperties + @Autowired private lateinit var kafkaProducerProperties: KafkaProducerProperties - @Autowired - private lateinit var embeddedKafkaBroker: EmbeddedKafkaBroker + @Autowired private lateinit var embeddedKafkaBroker: EmbeddedKafkaBroker - @Autowired - private lateinit var testRestTemplate: TestRestTemplate + @Autowired private lateinit var testRestTemplate: TestRestTemplate @Test fun shouldProduceMessageForValidRequest() { @@ -55,7 +51,10 @@ class MessageHandlingTest { assertThat(records.records(kafkaProducerProperties.topicName)).hasSize(1) val expectedJsonNode = ObjectMapper().readTree(getFileContentAsString("message.json")) - val payloadJsonNode = ObjectMapper().readTree(records.records(kafkaProducerProperties.topicName).first().value().payload) + val payloadJsonNode = + ObjectMapper() + .readTree( + records.records(kafkaProducerProperties.topicName).first().value().payload) assertThat(payloadJsonNode).isEqualTo(expectedJsonNode) } diff --git a/application/src/main/kotlin/org/gxf/crestdeviceservice/CrestDeviceServiceApplication.kt b/application/src/main/kotlin/org/gxf/crestdeviceservice/CrestDeviceServiceApplication.kt index 5239ee6e..d95e7339 100644 --- a/application/src/main/kotlin/org/gxf/crestdeviceservice/CrestDeviceServiceApplication.kt +++ b/application/src/main/kotlin/org/gxf/crestdeviceservice/CrestDeviceServiceApplication.kt @@ -1,16 +1,13 @@ // SPDX-FileCopyrightText: Contributors to the GXF project // // SPDX-License-Identifier: Apache-2.0 - package org.gxf.crestdeviceservice import org.springframework.boot.autoconfigure.SpringBootApplication import org.springframework.boot.context.properties.ConfigurationPropertiesScan import org.springframework.boot.runApplication -@ConfigurationPropertiesScan -@SpringBootApplication -class CrestDeviceServiceApplication +@ConfigurationPropertiesScan @SpringBootApplication class CrestDeviceServiceApplication fun main(args: Array) { runApplication(*args) diff --git a/application/src/main/kotlin/org/gxf/crestdeviceservice/coap/DownlinkService.kt b/application/src/main/kotlin/org/gxf/crestdeviceservice/coap/DownlinkService.kt index 8911fd97..bb7f7f1f 100644 --- a/application/src/main/kotlin/org/gxf/crestdeviceservice/coap/DownlinkService.kt +++ b/application/src/main/kotlin/org/gxf/crestdeviceservice/coap/DownlinkService.kt @@ -1,7 +1,6 @@ // SPDX-FileCopyrightText: Contributors to the GXF project // // SPDX-License-Identifier: Apache-2.0 - package org.gxf.crestdeviceservice.coap import com.fasterxml.jackson.databind.JsonNode @@ -12,11 +11,9 @@ import org.gxf.crestdeviceservice.psk.exception.NoExistingPskException import org.springframework.stereotype.Service @Service -class DownlinkService( - private val pskService: PskService -) { +class DownlinkService(private val pskService: PskService) { - companion object{ + companion object { private const val RESPONSE_SUCCESS = "0" } @@ -28,12 +25,16 @@ class DownlinkService( logger.debug { "Check if device $identity needs key change" } if (pskService.needsKeyChange(identity)) { logger.info { "Device $identity needs key change" } - val oldKey = pskService.getCurrentActiveKey(identity) - ?: throw NoExistingPskException("No current key found to calculate hash") + val oldKey = + pskService.getCurrentActiveKey(identity) + ?: throw NoExistingPskException("No current key found to calculate hash") val newKey = pskService.setReadyKeyForIdentityAsPending(identity) - // After setting a new psk, the device will send a new message if the psk set was successful - logger.debug { "Create PSK set command for key for device ${newKey.identity} with revision ${newKey.revision} and status ${newKey.status}" } + // After setting a new psk, the device will send a new message if the psk set was + // successful + logger.debug { + "Create PSK set command for key for device ${newKey.identity} with revision ${newKey.revision} and status ${newKey.status}" + } return PskCommandCreator.createPskSetCommand(newKey, oldKey) } diff --git a/application/src/main/kotlin/org/gxf/crestdeviceservice/coap/MessageController.kt b/application/src/main/kotlin/org/gxf/crestdeviceservice/coap/MessageController.kt index c37b1f18..12acae5f 100644 --- a/application/src/main/kotlin/org/gxf/crestdeviceservice/coap/MessageController.kt +++ b/application/src/main/kotlin/org/gxf/crestdeviceservice/coap/MessageController.kt @@ -1,7 +1,6 @@ // SPDX-FileCopyrightText: Contributors to the GXF project // // SPDX-License-Identifier: Apache-2.0 - package org.gxf.crestdeviceservice.coap import com.fasterxml.jackson.databind.JsonNode @@ -13,9 +12,9 @@ import org.springframework.web.bind.annotation.* @RestController @RequestMapping("/sng") class MessageController( - private val messageService: MessageService, - private val downlinkService: DownlinkService, - private val urcService: UrcService + private val messageService: MessageService, + private val downlinkService: DownlinkService, + private val urcService: UrcService ) { private val logger = KotlinLogging.logger {} @@ -23,11 +22,14 @@ class MessageController( private val locks: MutableMap = mutableMapOf() /** - * This endpoint handles incoming crest device messages. - * Responses are generated synchronously to avoid sending the same downlink twice. + * This endpoint handles incoming crest device messages. Responses are generated synchronously + * to avoid sending the same downlink twice. */ @PostMapping("/{identity}") - fun post(@NonNull @PathVariable identity: String, @NonNull @RequestBody body: JsonNode): ResponseEntity { + fun post( + @NonNull @PathVariable identity: String, + @NonNull @RequestBody body: JsonNode + ): ResponseEntity { logger.debug { "Processing message $body" } messageService.handleMessage(body) @@ -39,13 +41,15 @@ class MessageController( val downlink = downlinkService.getDownlinkForIdentity(identity, body) return ResponseEntity.ok(downlink) } catch (e: Exception) { - logger.error(e) { "Exception occurred while creating downlink for device $identity" } + logger.error(e) { + "Exception occurred while creating downlink for device $identity" + } return ResponseEntity.internalServerError().build() } } } @Synchronized - private fun lock(substationIdentification: String) = locks.computeIfAbsent(substationIdentification) { _ -> Any() } - + private fun lock(substationIdentification: String) = + locks.computeIfAbsent(substationIdentification) { _ -> Any() } } diff --git a/application/src/main/kotlin/org/gxf/crestdeviceservice/coap/MessageService.kt b/application/src/main/kotlin/org/gxf/crestdeviceservice/coap/MessageService.kt index da5868bc..a6763df0 100644 --- a/application/src/main/kotlin/org/gxf/crestdeviceservice/coap/MessageService.kt +++ b/application/src/main/kotlin/org/gxf/crestdeviceservice/coap/MessageService.kt @@ -1,7 +1,6 @@ // SPDX-FileCopyrightText: Contributors to the GXF project // // SPDX-License-Identifier: Apache-2.0 - package org.gxf.crestdeviceservice.coap import com.fasterxml.jackson.databind.JsonNode diff --git a/application/src/main/kotlin/org/gxf/crestdeviceservice/coap/PskCommandCreator.kt b/application/src/main/kotlin/org/gxf/crestdeviceservice/coap/PskCommandCreator.kt index 335c119b..4ccc92dd 100644 --- a/application/src/main/kotlin/org/gxf/crestdeviceservice/coap/PskCommandCreator.kt +++ b/application/src/main/kotlin/org/gxf/crestdeviceservice/coap/PskCommandCreator.kt @@ -1,7 +1,6 @@ // SPDX-FileCopyrightText: Contributors to the GXF project // // SPDX-License-Identifier: Apache-2.0 - package org.gxf.crestdeviceservice.coap import org.apache.commons.codec.digest.DigestUtils diff --git a/application/src/main/kotlin/org/gxf/crestdeviceservice/coap/UrcService.kt b/application/src/main/kotlin/org/gxf/crestdeviceservice/coap/UrcService.kt index 4b049908..4dab7394 100644 --- a/application/src/main/kotlin/org/gxf/crestdeviceservice/coap/UrcService.kt +++ b/application/src/main/kotlin/org/gxf/crestdeviceservice/coap/UrcService.kt @@ -10,9 +10,7 @@ import org.gxf.crestdeviceservice.psk.exception.NoExistingPskException import org.springframework.stereotype.Service @Service -class UrcService( - private val pskService: PskService -) { +class UrcService(private val pskService: PskService) { companion object { private const val URC_PSK_SUCCESS = "PSK:SET" private const val URC_PSK_ERROR = "ER" @@ -34,23 +32,22 @@ class UrcService( urcsContainsError(urcs) -> { handleErrorUrc(identity) } - urcsContainsSuccess(urcs) -> { handleSuccessUrc(identity) } } } - private fun getUrcsFromMessage(body: JsonNode) = body[URC_FIELD] - .filter { it.isTextual } - .map { it.asText() } + private fun getUrcsFromMessage(body: JsonNode) = + body[URC_FIELD].filter { it.isTextual }.map { it.asText() } private fun urcsContainsError(urcs: List) = urcs.any { urc -> urc.contains(URC_PSK_ERROR) } private fun handleErrorUrc(identity: String) { if (!pskService.isPendingKeyPresent(identity)) { - throw NoExistingPskException("Failure URC received, but no pending key present to set as invalid") + throw NoExistingPskException( + "Failure URC received, but no pending key present to set as invalid") } logger.warn { "Error received for set PSK command, setting pending key to invalid" } pskService.setPendingKeyAsInvalid(identity) @@ -61,7 +58,8 @@ class UrcService( private fun handleSuccessUrc(identity: String) { if (!pskService.isPendingKeyPresent(identity)) { - throw NoExistingPskException("Success URC received, but no pending key present to set as active") + throw NoExistingPskException( + "Success URC received, but no pending key present to set as active") } logger.info { "PSK set successfully, changing active key" } pskService.changeActiveKey(identity) diff --git a/application/src/main/kotlin/org/gxf/crestdeviceservice/kafka/MessageProducer.kt b/application/src/main/kotlin/org/gxf/crestdeviceservice/kafka/MessageProducer.kt index 9450989a..581e8b70 100644 --- a/application/src/main/kotlin/org/gxf/crestdeviceservice/kafka/MessageProducer.kt +++ b/application/src/main/kotlin/org/gxf/crestdeviceservice/kafka/MessageProducer.kt @@ -1,30 +1,31 @@ // SPDX-FileCopyrightText: Contributors to the GXF project // // SPDX-License-Identifier: Apache-2.0 - package org.gxf.crestdeviceservice.kafka import com.fasterxml.jackson.databind.JsonNode import io.github.oshai.kotlinlogging.KotlinLogging +import java.time.Instant import org.gxf.crestdeviceservice.kafka.configuration.KafkaProducerProperties import org.gxf.sng.avro.DeviceMessage import org.springframework.kafka.core.KafkaTemplate import org.springframework.stereotype.Service -import java.time.Instant @Service class MessageProducer( - private val kafkaTemplate: KafkaTemplate, - private val kafkaProducerProperties: KafkaProducerProperties + private val kafkaTemplate: KafkaTemplate, + private val kafkaProducerProperties: KafkaProducerProperties ) { private val logger = KotlinLogging.logger {} fun produceMessage(message: JsonNode) { logger.info { "Producing message for: ${message.get("ID")}" } - kafkaTemplate.send(kafkaProducerProperties.topicName, DeviceMessage().apply { - deviceId = message.get("ID").toString() - timestamp = Instant.now().toEpochMilli() - payload = message.toString() - }) + kafkaTemplate.send( + kafkaProducerProperties.topicName, + DeviceMessage().apply { + deviceId = message.get("ID").toString() + timestamp = Instant.now().toEpochMilli() + payload = message.toString() + }) } } diff --git a/application/src/main/kotlin/org/gxf/crestdeviceservice/kafka/configuration/KafkaConfiguration.kt b/application/src/main/kotlin/org/gxf/crestdeviceservice/kafka/configuration/KafkaConfiguration.kt index a2abe948..b67b744b 100644 --- a/application/src/main/kotlin/org/gxf/crestdeviceservice/kafka/configuration/KafkaConfiguration.kt +++ b/application/src/main/kotlin/org/gxf/crestdeviceservice/kafka/configuration/KafkaConfiguration.kt @@ -1,7 +1,6 @@ // SPDX-FileCopyrightText: Contributors to the GXF project // // SPDX-License-Identifier: Apache-2.0 - package org.gxf.crestdeviceservice.kafka.configuration import com.alliander.sng.DeviceCredentials @@ -21,32 +20,35 @@ import org.springframework.kafka.core.DefaultKafkaProducerFactory import org.springframework.kafka.core.KafkaTemplate import org.springframework.kafka.core.ProducerFactory - @Configuration -class KafkaConfiguration(private val kafkaProperties: KafkaProperties, private val sslBundles: SslBundles) { +class KafkaConfiguration( + private val kafkaProperties: KafkaProperties, + private val sslBundles: SslBundles +) { @Bean - fun kafkaListenerContainerFactory(consumerFactory: ConsumerFactory): ConcurrentKafkaListenerContainerFactory = - ConcurrentKafkaListenerContainerFactory() - .apply { this.consumerFactory = consumerFactory } + fun kafkaListenerContainerFactory( + consumerFactory: ConsumerFactory + ): ConcurrentKafkaListenerContainerFactory = + ConcurrentKafkaListenerContainerFactory().apply { + this.consumerFactory = consumerFactory + } @Bean fun consumerFactory(): ConsumerFactory = - DefaultKafkaConsumerFactory( - kafkaProperties.buildConsumerProperties(sslBundles), - StringDeserializer(), - AvroDeserializer(DeviceCredentials.getDecoder()) - ) + DefaultKafkaConsumerFactory( + kafkaProperties.buildConsumerProperties(sslBundles), + StringDeserializer(), + AvroDeserializer(DeviceCredentials.getDecoder())) @Bean fun kafkaTemplate(producerFactory: ProducerFactory) = - KafkaTemplate(producerFactory) + KafkaTemplate(producerFactory) @Bean fun producerFactory(): ProducerFactory = - DefaultKafkaProducerFactory( - kafkaProperties.buildProducerProperties(sslBundles), - StringSerializer(), - AvroSerializer(DeviceMessage.getEncoder()) - ) + DefaultKafkaProducerFactory( + kafkaProperties.buildProducerProperties(sslBundles), + StringSerializer(), + AvroSerializer(DeviceMessage.getEncoder())) } diff --git a/application/src/main/kotlin/org/gxf/crestdeviceservice/metrics/MetricService.kt b/application/src/main/kotlin/org/gxf/crestdeviceservice/metrics/MetricService.kt index df968098..4ad9098c 100644 --- a/application/src/main/kotlin/org/gxf/crestdeviceservice/metrics/MetricService.kt +++ b/application/src/main/kotlin/org/gxf/crestdeviceservice/metrics/MetricService.kt @@ -1,7 +1,6 @@ // SPDX-FileCopyrightText: Contributors to the GXF project // // SPDX-License-Identifier: Apache-2.0 - package org.gxf.crestdeviceservice.metrics import io.micrometer.core.instrument.Counter @@ -15,9 +14,10 @@ class MetricService(meterRegistry: MeterRegistry) { const val METRIC_PREFIX = "deviceservice" } - private val identityInvalidCounter = Counter - .builder("$METRIC_PREFIX.psk.notfound") - .description("Counts the number of times a device tried to connect with a wrong/unknown Identity") + private val identityInvalidCounter = + Counter.builder("$METRIC_PREFIX.psk.notfound") + .description( + "Counts the number of times a device tried to connect with a wrong/unknown Identity") .register(meterRegistry) fun incrementIdentityInvalidCounter() = identityInvalidCounter.increment() diff --git a/application/src/main/kotlin/org/gxf/crestdeviceservice/psk/IncomingDeviceCredentialsService.kt b/application/src/main/kotlin/org/gxf/crestdeviceservice/psk/IncomingDeviceCredentialsService.kt index 276f3715..86271626 100644 --- a/application/src/main/kotlin/org/gxf/crestdeviceservice/psk/IncomingDeviceCredentialsService.kt +++ b/application/src/main/kotlin/org/gxf/crestdeviceservice/psk/IncomingDeviceCredentialsService.kt @@ -1,7 +1,6 @@ // SPDX-FileCopyrightText: Contributors to the GXF project // // SPDX-License-Identifier: Apache-2.0 - package org.gxf.crestdeviceservice.psk import com.alliander.sng.DeviceCredentials @@ -15,20 +14,22 @@ class IncomingDeviceCredentialsService( private val pskDecryptionService: PskDecryptionService ) { - private val logger = KotlinLogging.logger { } + private val logger = KotlinLogging.logger {} @KafkaListener( topics = ["\${crest-device-service.kafka.pre-shared-key-consumer.topic-name}"], - id = "\${crest-device-service.kafka.pre-shared-key-consumer.id}" - ) + id = "\${crest-device-service.kafka.pre-shared-key-consumer.id}") fun handleIncomingDeviceCredentials(deviceCredentials: DeviceCredentials) { logger.info { "Received key for ${deviceCredentials.imei}" } val identity = deviceCredentials.imei try { - val decryptedPsk = pskDecryptionService.decryptSecret(deviceCredentials.psk, deviceCredentials.keyRef) - val decryptedSecret = pskDecryptionService.decryptSecret(deviceCredentials.secret, deviceCredentials.keyRef) + val decryptedPsk = + pskDecryptionService.decryptSecret(deviceCredentials.psk, deviceCredentials.keyRef) + val decryptedSecret = + pskDecryptionService.decryptSecret( + deviceCredentials.secret, deviceCredentials.keyRef) pskService.setInitialKeyForIdentity(identity, decryptedPsk, decryptedSecret) @@ -38,5 +39,4 @@ class IncomingDeviceCredentialsService( logger.error(e) { "Failed to set device credentials for $identity" } } } - } diff --git a/application/src/main/kotlin/org/gxf/crestdeviceservice/psk/PskConfiguration.kt b/application/src/main/kotlin/org/gxf/crestdeviceservice/psk/PskConfiguration.kt index d43309f9..d67d3d22 100644 --- a/application/src/main/kotlin/org/gxf/crestdeviceservice/psk/PskConfiguration.kt +++ b/application/src/main/kotlin/org/gxf/crestdeviceservice/psk/PskConfiguration.kt @@ -1,7 +1,6 @@ // SPDX-FileCopyrightText: Contributors to the GXF project // // SPDX-License-Identifier: Apache-2.0 - package org.gxf.crestdeviceservice.psk import org.springframework.boot.context.properties.ConfigurationProperties diff --git a/application/src/main/kotlin/org/gxf/crestdeviceservice/psk/PskController.kt b/application/src/main/kotlin/org/gxf/crestdeviceservice/psk/PskController.kt index f6aa135d..eceec44f 100644 --- a/application/src/main/kotlin/org/gxf/crestdeviceservice/psk/PskController.kt +++ b/application/src/main/kotlin/org/gxf/crestdeviceservice/psk/PskController.kt @@ -1,7 +1,6 @@ // SPDX-FileCopyrightText: Contributors to the GXF project // // SPDX-License-Identifier: Apache-2.0 - package org.gxf.crestdeviceservice.psk import io.github.oshai.kotlinlogging.KotlinLogging diff --git a/application/src/main/kotlin/org/gxf/crestdeviceservice/psk/PskDecryptionService.kt b/application/src/main/kotlin/org/gxf/crestdeviceservice/psk/PskDecryptionService.kt index b07473d0..6ff397c9 100644 --- a/application/src/main/kotlin/org/gxf/crestdeviceservice/psk/PskDecryptionService.kt +++ b/application/src/main/kotlin/org/gxf/crestdeviceservice/psk/PskDecryptionService.kt @@ -1,15 +1,13 @@ // SPDX-FileCopyrightText: Contributors to the GXF project // // SPDX-License-Identifier: Apache-2.0 - package org.gxf.crestdeviceservice.psk +import java.util.* +import javax.crypto.Cipher import org.gxf.crestdeviceservice.psk.configuration.PskDecryptionConfiguration import org.gxf.crestdeviceservice.psk.exception.UnknownKeyRefException import org.springframework.stereotype.Service -import java.util.* -import javax.crypto.Cipher - @Service class PskDecryptionService(private val pskDecryptionConfiguration: PskDecryptionConfiguration) { @@ -17,16 +15,16 @@ class PskDecryptionService(private val pskDecryptionConfiguration: PskDecryption fun decryptSecret(encryptedSecret: String, keyRef: String): String { val decodedSecret: ByteArray = Base64.getDecoder().decode(encryptedSecret) - return cypherForKeyRef(keyRef) - .doFinal(decodedSecret) - .decodeToString() + return cypherForKeyRef(keyRef).doFinal(decodedSecret).decodeToString() } private fun cypherForKeyRef(keyRef: String): Cipher { - val privateKey = pskDecryptionConfiguration.privateKey[keyRef] + val privateKey = + pskDecryptionConfiguration.privateKey[keyRef] ?: throw UnknownKeyRefException("Keyref not found in configuration") - return Cipher.getInstance(pskDecryptionConfiguration.method) - .apply { init(Cipher.DECRYPT_MODE, privateKey) } + return Cipher.getInstance(pskDecryptionConfiguration.method).apply { + init(Cipher.DECRYPT_MODE, privateKey) + } } } diff --git a/application/src/main/kotlin/org/gxf/crestdeviceservice/psk/PskService.kt b/application/src/main/kotlin/org/gxf/crestdeviceservice/psk/PskService.kt index 1998ffc0..2ebd6068 100644 --- a/application/src/main/kotlin/org/gxf/crestdeviceservice/psk/PskService.kt +++ b/application/src/main/kotlin/org/gxf/crestdeviceservice/psk/PskService.kt @@ -4,58 +4,60 @@ package org.gxf.crestdeviceservice.psk import io.github.oshai.kotlinlogging.KotlinLogging +import java.security.SecureRandom +import java.time.Instant import org.gxf.crestdeviceservice.psk.entity.PreSharedKey import org.gxf.crestdeviceservice.psk.entity.PreSharedKeyStatus import org.gxf.crestdeviceservice.psk.entity.PskRepository import org.gxf.crestdeviceservice.psk.exception.InitialKeySetException import org.gxf.crestdeviceservice.psk.exception.NoExistingPskException import org.springframework.stereotype.Service -import java.security.SecureRandom -import java.time.Instant @Service -class PskService(private val pskRepository: PskRepository, private val pskConfiguration: PskConfiguration) { +class PskService( + private val pskRepository: PskRepository, + private val pskConfiguration: PskConfiguration +) { companion object { private const val KEY_LENGTH = 16L - private const val ALLOWED_CHARACTERS = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" + private const val ALLOWED_CHARACTERS = + "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ" } private val logger = KotlinLogging.logger {} private val secureRandom = SecureRandom.getInstanceStrong() - fun getCurrentActiveKey(identity: String) = - getCurrentActivePsk(identity)?.preSharedKey + fun getCurrentActiveKey(identity: String) = getCurrentActivePsk(identity)?.preSharedKey private fun getCurrentActivePsk(identity: String) = pskRepository.findFirstByIdentityAndStatusOrderByRevisionDesc( - identity, - PreSharedKeyStatus.ACTIVE - ) + identity, PreSharedKeyStatus.ACTIVE) fun isPendingKeyPresent(identity: String) = getCurrentPendingKey(identity) != null @Throws(NoExistingPskException::class) fun setPendingKeyAsInvalid(identity: String) { - val psk = getCurrentPendingKey(identity) - ?: throw NoExistingPskException("No pending key exists to set as invalid") + val psk = + getCurrentPendingKey(identity) + ?: throw NoExistingPskException("No pending key exists to set as invalid") psk.status = PreSharedKeyStatus.INVALID pskRepository.save(psk) } private fun getCurrentPendingKey(identity: String) = pskRepository.findFirstByIdentityAndStatusOrderByRevisionDesc( - identity, - PreSharedKeyStatus.PENDING - ) + identity, PreSharedKeyStatus.PENDING) @Throws(InitialKeySetException::class) fun setInitialKeyForIdentity(identity: String, psk: String, secret: String) { if (pskRepository.countByIdentityAndStatus(identity, PreSharedKeyStatus.ACTIVE) != 0L) { - throw InitialKeySetException("Key already exists for identity. Key cannot be overridden") + throw InitialKeySetException( + "Key already exists for identity. Key cannot be overridden") } - pskRepository.save(PreSharedKey(identity, 0, Instant.now(), psk, secret, PreSharedKeyStatus.ACTIVE)) + pskRepository.save( + PreSharedKey(identity, 0, Instant.now(), psk, secret, PreSharedKeyStatus.ACTIVE)) } @Throws(NoExistingPskException::class) @@ -63,9 +65,7 @@ class PskService(private val pskRepository: PskRepository, private val pskConfig val newKey = generatePsk() val previousPSK = pskRepository.findFirstByIdentityAndStatusOrderByRevisionDesc( - identity, - PreSharedKeyStatus.ACTIVE - ) + identity, PreSharedKeyStatus.ACTIVE) ?: throw NoExistingPskException("There is no active key present") val newVersion = previousPSK.revision + 1 pskRepository.save( @@ -75,21 +75,19 @@ class PskService(private val pskRepository: PskRepository, private val pskConfig Instant.now(), newKey, previousPSK.secret, - PreSharedKeyStatus.READY - ) - ) + PreSharedKeyStatus.READY)) } private fun generatePsk(): String = - secureRandom.ints(KEY_LENGTH, 0, ALLOWED_CHARACTERS.length).toArray() - .fold("") { acc, next -> acc + ALLOWED_CHARACTERS[next] } + secureRandom.ints(KEY_LENGTH, 0, ALLOWED_CHARACTERS.length).toArray().fold("") { acc, next + -> + acc + ALLOWED_CHARACTERS[next] + } fun setReadyKeyForIdentityAsPending(identity: String): PreSharedKey { val readyPsk = pskRepository.findFirstByIdentityAndStatusOrderByRevisionDesc( - identity, - PreSharedKeyStatus.READY - ) + identity, PreSharedKeyStatus.READY) ?: throw NoExistingPskException("There is no new key ready to be set") readyPsk.status = PreSharedKeyStatus.PENDING logger.debug { "Save ready psk as pending" } @@ -97,41 +95,32 @@ class PskService(private val pskRepository: PskRepository, private val pskConfig } fun needsKeyChange(identity: String) = - changeInitialPsk() && - readyKeyExists(identity) && - !pendingKeyExists(identity) + changeInitialPsk() && readyKeyExists(identity) && !pendingKeyExists(identity) private fun readyKeyExists(identity: String) = pskRepository.findFirstByIdentityAndStatusOrderByRevisionDesc( - identity, - PreSharedKeyStatus.READY - ) != null + identity, PreSharedKeyStatus.READY) != null private fun pendingKeyExists(identity: String) = pskRepository.findFirstByIdentityAndStatusOrderByRevisionDesc( - identity, - PreSharedKeyStatus.PENDING - ) != null + identity, PreSharedKeyStatus.PENDING) != null fun changeInitialPsk() = pskConfiguration.changeInitialPsk /** - * Sets the current, active, key to inactive and the new, pending, key to active - * and saves both to the pskRepository + * Sets the current, active, key to inactive and the new, pending, key to active and saves both + * to the pskRepository + * * @param identity: identity of device for which to change the keys */ @Throws(NoExistingPskException::class) fun changeActiveKey(identity: String) { val currentPsk = pskRepository.findFirstByIdentityAndStatusOrderByRevisionDesc( - identity, - PreSharedKeyStatus.ACTIVE - ) + identity, PreSharedKeyStatus.ACTIVE) val newPsk = pskRepository.findFirstByIdentityAndStatusOrderByRevisionDesc( - identity, - PreSharedKeyStatus.PENDING - ) + identity, PreSharedKeyStatus.PENDING) if (currentPsk == null || newPsk == null) { throw NoExistingPskException("No current or new psk, impossible to change active key") diff --git a/application/src/main/kotlin/org/gxf/crestdeviceservice/psk/configuration/PskDecryptionConfiguration.kt b/application/src/main/kotlin/org/gxf/crestdeviceservice/psk/configuration/PskDecryptionConfiguration.kt index 1d750986..cbf7ca94 100644 --- a/application/src/main/kotlin/org/gxf/crestdeviceservice/psk/configuration/PskDecryptionConfiguration.kt +++ b/application/src/main/kotlin/org/gxf/crestdeviceservice/psk/configuration/PskDecryptionConfiguration.kt @@ -1,11 +1,10 @@ // SPDX-FileCopyrightText: Contributors to the GXF project // // SPDX-License-Identifier: Apache-2.0 - package org.gxf.crestdeviceservice.psk.configuration -import org.springframework.boot.context.properties.ConfigurationProperties import java.security.interfaces.RSAPrivateKey +import org.springframework.boot.context.properties.ConfigurationProperties @ConfigurationProperties("crest-device-service.psk.decryption") class PskDecryptionConfiguration(val privateKey: Map, val method: String) diff --git a/application/src/main/kotlin/org/gxf/crestdeviceservice/psk/configuration/RSAPrivateKeyConverter.kt b/application/src/main/kotlin/org/gxf/crestdeviceservice/psk/configuration/RSAPrivateKeyConverter.kt index 958e2b3e..cbad9040 100644 --- a/application/src/main/kotlin/org/gxf/crestdeviceservice/psk/configuration/RSAPrivateKeyConverter.kt +++ b/application/src/main/kotlin/org/gxf/crestdeviceservice/psk/configuration/RSAPrivateKeyConverter.kt @@ -1,23 +1,19 @@ // SPDX-FileCopyrightText: Contributors to the GXF project // // SPDX-License-Identifier: Apache-2.0 - package org.gxf.crestdeviceservice.psk.configuration +import java.io.ByteArrayInputStream +import java.security.interfaces.RSAPrivateKey import org.springframework.boot.context.properties.ConfigurationPropertiesBinding import org.springframework.core.convert.converter.Converter import org.springframework.security.converter.RsaKeyConverters import org.springframework.stereotype.Component -import java.io.ByteArrayInputStream -import java.security.interfaces.RSAPrivateKey -/** - * Decodes a pkcs8 RSA Private key string to an object - */ +/** Decodes a pkcs8 RSA Private key string to an object */ @Component @ConfigurationPropertiesBinding class RSAPrivateKeyConverter : Converter { override fun convert(from: String): RSAPrivateKey = - RsaKeyConverters.pkcs8() - .convert(ByteArrayInputStream(from.toByteArray()))!! + RsaKeyConverters.pkcs8().convert(ByteArrayInputStream(from.toByteArray()))!! } diff --git a/application/src/main/kotlin/org/gxf/crestdeviceservice/psk/entity/PreSharedKey.kt b/application/src/main/kotlin/org/gxf/crestdeviceservice/psk/entity/PreSharedKey.kt index a87dbf5f..05110850 100644 --- a/application/src/main/kotlin/org/gxf/crestdeviceservice/psk/entity/PreSharedKey.kt +++ b/application/src/main/kotlin/org/gxf/crestdeviceservice/psk/entity/PreSharedKey.kt @@ -1,7 +1,6 @@ // SPDX-FileCopyrightText: Contributors to the GXF project // // SPDX-License-Identifier: Apache-2.0 - package org.gxf.crestdeviceservice.psk.entity import jakarta.persistence.Convert @@ -10,8 +9,8 @@ import jakarta.persistence.EnumType import jakarta.persistence.Enumerated import jakarta.persistence.Id import jakarta.persistence.IdClass -import org.gxf.crestdeviceservice.psk.entity.convertors.DatabaseFieldEncryptor import java.time.Instant +import org.gxf.crestdeviceservice.psk.entity.convertors.DatabaseFieldEncryptor @Entity @IdClass(PreSharedKeyCompositeKey::class) diff --git a/application/src/main/kotlin/org/gxf/crestdeviceservice/psk/entity/PreSharedKeyCompositeKey.kt b/application/src/main/kotlin/org/gxf/crestdeviceservice/psk/entity/PreSharedKeyCompositeKey.kt index 973318b1..53730973 100644 --- a/application/src/main/kotlin/org/gxf/crestdeviceservice/psk/entity/PreSharedKeyCompositeKey.kt +++ b/application/src/main/kotlin/org/gxf/crestdeviceservice/psk/entity/PreSharedKeyCompositeKey.kt @@ -1,12 +1,10 @@ // SPDX-FileCopyrightText: Contributors to the GXF project // // SPDX-License-Identifier: Apache-2.0 - package org.gxf.crestdeviceservice.psk.entity import java.io.Serializable -class PreSharedKeyCompositeKey(val identity: String?, - val revision: Int?) : Serializable { +class PreSharedKeyCompositeKey(val identity: String?, val revision: Int?) : Serializable { constructor() : this(null, null) } diff --git a/application/src/main/kotlin/org/gxf/crestdeviceservice/psk/entity/convertors/DatabaseFieldEncryptor.kt b/application/src/main/kotlin/org/gxf/crestdeviceservice/psk/entity/convertors/DatabaseFieldEncryptor.kt index 8388a2d4..99b757ec 100644 --- a/application/src/main/kotlin/org/gxf/crestdeviceservice/psk/entity/convertors/DatabaseFieldEncryptor.kt +++ b/application/src/main/kotlin/org/gxf/crestdeviceservice/psk/entity/convertors/DatabaseFieldEncryptor.kt @@ -1,12 +1,9 @@ // SPDX-FileCopyrightText: Contributors to the GXF project // // SPDX-License-Identifier: Apache-2.0 - package org.gxf.crestdeviceservice.psk.entity.convertors import jakarta.persistence.AttributeConverter -import org.springframework.beans.factory.annotation.Value -import org.springframework.stereotype.Component import java.nio.ByteBuffer import java.nio.charset.StandardCharsets import java.security.SecureRandom @@ -16,7 +13,8 @@ import javax.crypto.Cipher import javax.crypto.SecretKey import javax.crypto.spec.GCMParameterSpec import javax.crypto.spec.SecretKeySpec - +import org.springframework.beans.factory.annotation.Value +import org.springframework.stereotype.Component @Component class DatabaseFieldEncryptor : AttributeConverter { @@ -27,15 +25,18 @@ class DatabaseFieldEncryptor : AttributeConverter { private const val IV_SIZE = 16 } - @Value("\${crest-device-service.database.encryption-key}") - lateinit var secret: String + @Value("\${crest-device-service.database.encryption-key}") lateinit var secret: String override fun convertToDatabaseColumn(attribute: String): String { - return Base64.getEncoder().encodeToString(encrypt(attribute, SecretKeySpec(secret.toByteArray(), ENCRYPTION_ALGORITHM))) + return Base64.getEncoder() + .encodeToString( + encrypt(attribute, SecretKeySpec(secret.toByteArray(), ENCRYPTION_ALGORITHM))) } override fun convertToEntityAttribute(dbData: String): String { - return decrypt(Base64.getDecoder().decode(dbData), SecretKeySpec(secret.toByteArray(), ENCRYPTION_ALGORITHM)) + return decrypt( + Base64.getDecoder().decode(dbData), + SecretKeySpec(secret.toByteArray(), ENCRYPTION_ALGORITHM)) } private fun encrypt(plaintext: String, secretKey: SecretKey): ByteArray { diff --git a/application/src/main/kotlin/org/gxf/crestdeviceservice/psk/exception/NoExistingPskException.kt b/application/src/main/kotlin/org/gxf/crestdeviceservice/psk/exception/NoExistingPskException.kt index 4b66ac1c..da11565f 100644 --- a/application/src/main/kotlin/org/gxf/crestdeviceservice/psk/exception/NoExistingPskException.kt +++ b/application/src/main/kotlin/org/gxf/crestdeviceservice/psk/exception/NoExistingPskException.kt @@ -1,7 +1,6 @@ // SPDX-FileCopyrightText: Contributors to the GXF project // // SPDX-License-Identifier: Apache-2.0 - package org.gxf.crestdeviceservice.psk.exception class NoExistingPskException(message: String) : Exception(message) diff --git a/application/src/test/kotlin/org/gxf/crestdeviceservice/DeviceCredentialsControllerTest.kt b/application/src/test/kotlin/org/gxf/crestdeviceservice/DeviceCredentialsControllerTest.kt index a02bfd6c..fd8bac6d 100644 --- a/application/src/test/kotlin/org/gxf/crestdeviceservice/DeviceCredentialsControllerTest.kt +++ b/application/src/test/kotlin/org/gxf/crestdeviceservice/DeviceCredentialsControllerTest.kt @@ -1,7 +1,6 @@ // SPDX-FileCopyrightText: Contributors to the GXF project // // SPDX-License-Identifier: Apache-2.0 - package org.gxf.crestdeviceservice import org.gxf.crestdeviceservice.metrics.MetricService @@ -19,47 +18,30 @@ import org.springframework.test.web.servlet.result.MockMvcResultMatchers @WebMvcTest(PskController::class) class DeviceCredentialsControllerTest { - @Autowired - private lateinit var mvcRequest: MockMvc + @Autowired private lateinit var mvcRequest: MockMvc - @MockBean - private lateinit var pskService: PskService + @MockBean private lateinit var pskService: PskService - @MockBean - private lateinit var metricService: MetricService + @MockBean private lateinit var metricService: MetricService @Test fun shouldReturn404WhenPskForIdentityIsNotFound() { val identity = "identity" - whenever( - pskService.getCurrentActiveKey( - identity - ) - ).thenReturn(null) + whenever(pskService.getCurrentActiveKey(identity)).thenReturn(null) - mvcRequest.perform( - MockMvcRequestBuilders - .get("/psk") - .header("x-device-identity", identity) - ) - .andExpect(MockMvcResultMatchers.status().isNotFound) + mvcRequest + .perform(MockMvcRequestBuilders.get("/psk").header("x-device-identity", identity)) + .andExpect(MockMvcResultMatchers.status().isNotFound) } @Test fun shouldReturnKeyForIdentity() { val identity = "identity" - whenever( - pskService.getCurrentActiveKey( - identity - ) - ).thenReturn("key") + whenever(pskService.getCurrentActiveKey(identity)).thenReturn("key") - mvcRequest.perform( - MockMvcRequestBuilders - .get("/psk") - .header("x-device-identity", identity) - ) - .andExpect(MockMvcResultMatchers.status().isOk) - .andExpect(MockMvcResultMatchers.content().string("key")) + mvcRequest + .perform(MockMvcRequestBuilders.get("/psk").header("x-device-identity", identity)) + .andExpect(MockMvcResultMatchers.status().isOk) + .andExpect(MockMvcResultMatchers.content().string("key")) } } diff --git a/application/src/test/kotlin/org/gxf/crestdeviceservice/TestHelper.kt b/application/src/test/kotlin/org/gxf/crestdeviceservice/TestHelper.kt index 816b31e6..54429602 100644 --- a/application/src/test/kotlin/org/gxf/crestdeviceservice/TestHelper.kt +++ b/application/src/test/kotlin/org/gxf/crestdeviceservice/TestHelper.kt @@ -1,12 +1,11 @@ // SPDX-FileCopyrightText: Contributors to the GXF project // // SPDX-License-Identifier: Apache-2.0 - package org.gxf.crestdeviceservice +import java.time.Instant import org.gxf.crestdeviceservice.psk.entity.PreSharedKey import org.gxf.crestdeviceservice.psk.entity.PreSharedKeyStatus -import java.time.Instant object TestHelper { fun preSharedKeyReady() = preSharedKeyWithStatus(PreSharedKeyStatus.READY) @@ -14,13 +13,7 @@ object TestHelper { fun preSharedKeyActive() = preSharedKeyWithStatus(PreSharedKeyStatus.ACTIVE) fun preSharedKeyPending() = preSharedKeyWithStatus(PreSharedKeyStatus.PENDING) - - private fun preSharedKeyWithStatus(status: PreSharedKeyStatus) = PreSharedKey( - "identity", - 1, - Instant.now(), - "key", - "secret", - status - ) + + private fun preSharedKeyWithStatus(status: PreSharedKeyStatus) = + PreSharedKey("identity", 1, Instant.now(), "key", "secret", status) } diff --git a/application/src/test/kotlin/org/gxf/crestdeviceservice/coap/DownlinkServiceTest.kt b/application/src/test/kotlin/org/gxf/crestdeviceservice/coap/DownlinkServiceTest.kt index 9fe20af4..21908522 100644 --- a/application/src/test/kotlin/org/gxf/crestdeviceservice/coap/DownlinkServiceTest.kt +++ b/application/src/test/kotlin/org/gxf/crestdeviceservice/coap/DownlinkServiceTest.kt @@ -4,6 +4,7 @@ package org.gxf.crestdeviceservice.coap import com.fasterxml.jackson.databind.ObjectMapper +import java.time.Instant import org.assertj.core.api.Assertions.assertThat import org.gxf.crestdeviceservice.psk.PskService import org.gxf.crestdeviceservice.psk.entity.PreSharedKey @@ -13,7 +14,6 @@ import org.mockito.kotlin.mock import org.mockito.kotlin.spy import org.mockito.kotlin.whenever import org.springframework.util.ResourceUtils -import java.time.Instant class DownlinkServiceTest { private val pskService = mock() @@ -25,14 +25,9 @@ class DownlinkServiceTest { val identity = "identity" val expectedKey = "key" val expectedHash = "238104b039438f9dcbbef1dd6e295aa3cf2f248406c01ba7f6034becfe1a53d9" - val psk = PreSharedKey( - identity, - 1, - Instant.now(), - expectedKey, - "secret", - PreSharedKeyStatus.PENDING - ) + val psk = + PreSharedKey( + identity, 1, Instant.now(), expectedKey, "secret", PreSharedKeyStatus.PENDING) whenever(pskService.getCurrentActiveKey(identity)).thenReturn("oldKey") whenever(pskService.needsKeyChange(identity)).thenReturn(true) @@ -44,7 +39,8 @@ class DownlinkServiceTest { val result = downLinkService.getDownlinkForIdentity(identity, message) // Psk command is formatted as: PSK:[Key]:[Hash];PSK:[Key]:[Hash]:SET - assertThat(result).isEqualTo("!PSK:${expectedKey}:${expectedHash};PSK:${expectedKey}:${expectedHash}:SET") + assertThat(result) + .isEqualTo("!PSK:${expectedKey}:${expectedHash};PSK:${expectedKey}:${expectedHash}:SET") } @Test diff --git a/application/src/test/kotlin/org/gxf/crestdeviceservice/coap/MessageServiceTest.kt b/application/src/test/kotlin/org/gxf/crestdeviceservice/coap/MessageServiceTest.kt index 2c069e1d..9ed3a063 100644 --- a/application/src/test/kotlin/org/gxf/crestdeviceservice/coap/MessageServiceTest.kt +++ b/application/src/test/kotlin/org/gxf/crestdeviceservice/coap/MessageServiceTest.kt @@ -14,11 +14,9 @@ import org.mockito.junit.jupiter.MockitoExtension @ExtendWith(MockitoExtension::class) class MessageServiceTest { - @Mock - private lateinit var mock: MessageProducer + @Mock private lateinit var mock: MessageProducer - @InjectMocks - private lateinit var messageService: MessageService + @InjectMocks private lateinit var messageService: MessageService @Test fun shouldCallMessageProducerWithCorrectParams() { diff --git a/application/src/test/kotlin/org/gxf/crestdeviceservice/coap/PskCommandCreatorTest.kt b/application/src/test/kotlin/org/gxf/crestdeviceservice/coap/PskCommandCreatorTest.kt index b4c79aac..6f29d311 100644 --- a/application/src/test/kotlin/org/gxf/crestdeviceservice/coap/PskCommandCreatorTest.kt +++ b/application/src/test/kotlin/org/gxf/crestdeviceservice/coap/PskCommandCreatorTest.kt @@ -1,32 +1,36 @@ // SPDX-FileCopyrightText: Contributors to the GXF project // // SPDX-License-Identifier: Apache-2.0 - package org.gxf.crestdeviceservice.coap +import java.time.Instant import org.assertj.core.api.Assertions import org.gxf.crestdeviceservice.psk.entity.PreSharedKey import org.gxf.crestdeviceservice.psk.entity.PreSharedKeyStatus import org.junit.jupiter.params.ParameterizedTest import org.junit.jupiter.params.provider.CsvSource -import java.time.Instant class PskCommandCreatorTest { @ParameterizedTest @CsvSource( - "1234567890123456,1234,390d4757bf1b75e305984c99cdedfb1e7c201a2d143a53cfbc35075fa5f9a56f,secret", - "1234567890123456,2345,c1f50bc9d85835bb6077aa3577b030cf8a17a3db7e8b42b83011cae8538f26cd,different-secret", - "6543210987654321,3456,143ecd0dffadbbc248748c8725313c77d0d1eb297c90719804bc0cc361580283,secret", - "6543210987654321,4567,c3d193f4726807f6fb8dca6171ddadfb9f8f15f5a599d710e3b507534f1602c2,different-secret" - ) - fun shouldCreateACorrectPskCommandoWithHash(key: String, oldKey: String, expectedHash: String, usedSecret: String) { + "1234567890123456,1234,390d4757bf1b75e305984c99cdedfb1e7c201a2d143a53cfbc35075fa5f9a56f,secret", + "1234567890123456,2345,c1f50bc9d85835bb6077aa3577b030cf8a17a3db7e8b42b83011cae8538f26cd,different-secret", + "6543210987654321,3456,143ecd0dffadbbc248748c8725313c77d0d1eb297c90719804bc0cc361580283,secret", + "6543210987654321,4567,c3d193f4726807f6fb8dca6171ddadfb9f8f15f5a599d710e3b507534f1602c2,different-secret") + fun shouldCreateACorrectPskCommandoWithHash( + key: String, + oldKey: String, + expectedHash: String, + usedSecret: String + ) { val preSharedKey = PreSharedKey("identity", 0, Instant.now(), key, usedSecret, PreSharedKeyStatus.PENDING) val result = PskCommandCreator.createPskSetCommand(preSharedKey, oldKey) // Psk command is formatted as: PSK:[Key]:[Hash];PSK:[Key]:[Hash]:SET - Assertions.assertThat(result).isEqualTo("!PSK:${key}:${expectedHash};PSK:${key}:${expectedHash}:SET") + Assertions.assertThat(result) + .isEqualTo("!PSK:${key}:${expectedHash};PSK:${key}:${expectedHash}:SET") } } diff --git a/application/src/test/kotlin/org/gxf/crestdeviceservice/kafka/MessageProducerTest.kt b/application/src/test/kotlin/org/gxf/crestdeviceservice/kafka/MessageProducerTest.kt index 5239ba07..b82c62ba 100644 --- a/application/src/test/kotlin/org/gxf/crestdeviceservice/kafka/MessageProducerTest.kt +++ b/application/src/test/kotlin/org/gxf/crestdeviceservice/kafka/MessageProducerTest.kt @@ -21,14 +21,11 @@ import org.springframework.kafka.core.KafkaTemplate @ExtendWith(MockitoExtension::class) class MessageProducerTest { - @Mock - private lateinit var mockedKafkaTemplate: KafkaTemplate + @Mock private lateinit var mockedKafkaTemplate: KafkaTemplate - @Mock - private lateinit var mockedKafkaProducerProperties: KafkaProducerProperties + @Mock private lateinit var mockedKafkaProducerProperties: KafkaProducerProperties - @InjectMocks - private lateinit var messageProducer: MessageProducer + @InjectMocks private lateinit var messageProducer: MessageProducer @BeforeEach fun setup() { @@ -37,13 +34,17 @@ class MessageProducerTest { @Test fun shouldCallMessageProducerWithCorrectParams() { - val jsonNode = ObjectMapper().readTree(""" + val jsonNode = + ObjectMapper() + .readTree(""" { "ID":12345 } """) messageProducer.produceMessage(jsonNode) - verify(mockedKafkaTemplate).send( - check { assertThat(it).isEqualTo("topic") }, check { assertThat(it.payload).isEqualTo(jsonNode.toString()) }) + verify(mockedKafkaTemplate) + .send( + check { assertThat(it).isEqualTo("topic") }, + check { assertThat(it.payload).isEqualTo(jsonNode.toString()) }) } } diff --git a/application/src/test/kotlin/org/gxf/crestdeviceservice/psk/IncomingDeviceCredentialsServiceTest.kt b/application/src/test/kotlin/org/gxf/crestdeviceservice/psk/IncomingDeviceCredentialsServiceTest.kt index 1dd0abdf..7b64c5fe 100644 --- a/application/src/test/kotlin/org/gxf/crestdeviceservice/psk/IncomingDeviceCredentialsServiceTest.kt +++ b/application/src/test/kotlin/org/gxf/crestdeviceservice/psk/IncomingDeviceCredentialsServiceTest.kt @@ -1,7 +1,6 @@ // SPDX-FileCopyrightText: Contributors to the GXF project // // SPDX-License-Identifier: Apache-2.0 - package org.gxf.crestdeviceservice.psk import com.alliander.sng.DeviceCredentials diff --git a/application/src/test/kotlin/org/gxf/crestdeviceservice/psk/PSKKeyGenerator.kt b/application/src/test/kotlin/org/gxf/crestdeviceservice/psk/PSKKeyGenerator.kt index 85c38d90..fb90bc7b 100644 --- a/application/src/test/kotlin/org/gxf/crestdeviceservice/psk/PSKKeyGenerator.kt +++ b/application/src/test/kotlin/org/gxf/crestdeviceservice/psk/PSKKeyGenerator.kt @@ -4,7 +4,6 @@ package org.gxf.crestdeviceservice.psk import io.github.oshai.kotlinlogging.KotlinLogging -import org.junit.jupiter.api.Test import java.io.File import java.security.KeyPair import java.security.KeyPairGenerator @@ -14,27 +13,30 @@ import java.util.Base64 import javax.crypto.Cipher import kotlin.io.path.absolutePathString import kotlin.io.path.createTempDirectory - +import org.junit.jupiter.api.Test class PSKKeyGenerator { - private val logger = KotlinLogging.logger { } + private val logger = KotlinLogging.logger {} private val algorithm = "RSA" @Test fun generateKeyPair() { - val generator = KeyPairGenerator.getInstance(algorithm) - .apply { initialize(4096) } + val generator = KeyPairGenerator.getInstance(algorithm).apply { initialize(4096) } val keyPair: KeyPair = generator.generateKeyPair() val privateKeyString = privateKeyToString(keyPair.private) val publicKeyString = publicKeyToString(keyPair.public) - val cipher = Cipher.getInstance(algorithm) - .apply { init(Cipher.ENCRYPT_MODE, keyPair.public) } - logger.info { "PSK: " + Base64.getEncoder().encodeToString(cipher.doFinal("ABCDEFGHIJKLMNOP".toByteArray())) } - logger.info { "Secret: " + Base64.getEncoder().encodeToString(cipher.doFinal("123456".toByteArray())) } - + val cipher = + Cipher.getInstance(algorithm).apply { init(Cipher.ENCRYPT_MODE, keyPair.public) } + logger.info { + "PSK: " + + Base64.getEncoder().encodeToString(cipher.doFinal("ABCDEFGHIJKLMNOP".toByteArray())) + } + logger.info { + "Secret: " + Base64.getEncoder().encodeToString(cipher.doFinal("123456".toByteArray())) + } logger.info { "Private Key:\n${privateKeyString}" } logger.info { "Public Key:\n${publicKeyString}" } @@ -53,20 +55,20 @@ class PSKKeyGenerator { } private fun privateKeyToString(privateKey: PrivateKey) = - Base64.getEncoder().encodeToString(privateKey.encoded) + Base64.getEncoder() + .encodeToString(privateKey.encoded) .chunked(Int.MAX_VALUE) .joinToString( separator = "\n", prefix = "-----BEGIN PRIVATE KEY-----\n", - postfix = "\n-----END PRIVATE KEY-----" - ) + postfix = "\n-----END PRIVATE KEY-----") private fun publicKeyToString(publicKey: PublicKey) = - Base64.getEncoder().encodeToString(publicKey.encoded) + Base64.getEncoder() + .encodeToString(publicKey.encoded) .chunked(32) .joinToString( separator = "\n", prefix = "-----BEGIN PUBLIC KEY-----\n", - postfix = "\n-----END PUBLIC KEY-----" - ) + postfix = "\n-----END PUBLIC KEY-----") } diff --git a/application/src/test/kotlin/org/gxf/crestdeviceservice/psk/PskDecryptionServiceTest.kt b/application/src/test/kotlin/org/gxf/crestdeviceservice/psk/PskDecryptionServiceTest.kt index e0c8f39e..dfd4b54c 100644 --- a/application/src/test/kotlin/org/gxf/crestdeviceservice/psk/PskDecryptionServiceTest.kt +++ b/application/src/test/kotlin/org/gxf/crestdeviceservice/psk/PskDecryptionServiceTest.kt @@ -3,17 +3,17 @@ // SPDX-License-Identifier: Apache-2.0 package org.gxf.crestdeviceservice.psk -import org.assertj.core.api.Assertions.assertThat -import org.assertj.core.api.Assertions.assertThatThrownBy -import org.gxf.crestdeviceservice.psk.configuration.PskDecryptionConfiguration -import org.gxf.crestdeviceservice.psk.exception.UnknownKeyRefException -import org.junit.jupiter.api.Test import java.security.KeyPair import java.security.KeyPairGenerator import java.security.PublicKey import java.security.interfaces.RSAPrivateKey import java.util.Base64 import javax.crypto.Cipher +import org.assertj.core.api.Assertions.assertThat +import org.assertj.core.api.Assertions.assertThatThrownBy +import org.gxf.crestdeviceservice.psk.configuration.PskDecryptionConfiguration +import org.gxf.crestdeviceservice.psk.exception.UnknownKeyRefException +import org.junit.jupiter.api.Test class PskDecryptionServiceTest { @@ -27,12 +27,11 @@ class PskDecryptionServiceTest { val encryptedSecret = createSecret(secret, keyPair.public) // Create the testing decryption service - val decryptionService = PskDecryptionService( + val decryptionService = + PskDecryptionService( PskDecryptionConfiguration( - mapOf(keyRef to keyPair.private as RSAPrivateKey), - "RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING" - ) - ) + mapOf(keyRef to keyPair.private as RSAPrivateKey), + "RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING")) // Decrypt the secret val decryptedSecret = decryptionService.decryptSecret(encryptedSecret, keyRef) @@ -50,27 +49,22 @@ class PskDecryptionServiceTest { val encryptedSecret = createSecret(secret, keyPair.public) // Create the testing decryption service - val decryptionService = PskDecryptionService( + val decryptionService = + PskDecryptionService( PskDecryptionConfiguration( - mapOf(keyRef to keyPair.private as RSAPrivateKey), - "RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING" - ) - ) + mapOf(keyRef to keyPair.private as RSAPrivateKey), + "RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING")) assertThatThrownBy { decryptionService.decryptSecret(encryptedSecret, "2") } - .isInstanceOf(UnknownKeyRefException::class.java) + .isInstanceOf(UnknownKeyRefException::class.java) } private fun generateKeyPair(): KeyPair = - KeyPairGenerator.getInstance("RSA") - .apply { initialize(4096) } - .generateKeyPair() + KeyPairGenerator.getInstance("RSA").apply { initialize(4096) }.generateKeyPair() private fun createSecret(secret: String, publicKey: PublicKey) = - Cipher.getInstance("RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING") - .apply { init(Cipher.ENCRYPT_MODE, publicKey) } - .doFinal(secret.toByteArray()) - .let { Base64.getEncoder().encodeToString(it) } - - + Cipher.getInstance("RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING") + .apply { init(Cipher.ENCRYPT_MODE, publicKey) } + .doFinal(secret.toByteArray()) + .let { Base64.getEncoder().encodeToString(it) } } diff --git a/application/src/test/kotlin/org/gxf/crestdeviceservice/psk/PskServiceTest.kt b/application/src/test/kotlin/org/gxf/crestdeviceservice/psk/PskServiceTest.kt index 9f633ede..3bc74632 100644 --- a/application/src/test/kotlin/org/gxf/crestdeviceservice/psk/PskServiceTest.kt +++ b/application/src/test/kotlin/org/gxf/crestdeviceservice/psk/PskServiceTest.kt @@ -18,35 +18,27 @@ import org.mockito.junit.jupiter.MockitoExtension import org.mockito.kotlin.verify import org.mockito.kotlin.whenever - @ExtendWith(MockitoExtension::class) class PskServiceTest { - @Mock - private lateinit var pskRepository: PskRepository + @Mock private lateinit var pskRepository: PskRepository - @Mock - private lateinit var pskConfiguration: PskConfiguration + @Mock private lateinit var pskConfiguration: PskConfiguration - @InjectMocks - private lateinit var pskService: PskService + @InjectMocks private lateinit var pskService: PskService - @Captor - private lateinit var pskCaptor: ArgumentCaptor + @Captor private lateinit var pskCaptor: ArgumentCaptor - @Captor - private lateinit var pskListCaptor: ArgumentCaptor> + @Captor private lateinit var pskListCaptor: ArgumentCaptor> @Test fun getCurrentActiveKey() { val identity = "identity" val psk = TestHelper.preSharedKeyActive() whenever( - pskRepository.findFirstByIdentityAndStatusOrderByRevisionDesc( - identity, - PreSharedKeyStatus.ACTIVE - ) - ).thenReturn(psk) + pskRepository.findFirstByIdentityAndStatusOrderByRevisionDesc( + identity, PreSharedKeyStatus.ACTIVE)) + .thenReturn(psk) val currentActiveKey = pskService.getCurrentActiveKey(identity) @@ -58,11 +50,9 @@ class PskServiceTest { val identity = "identity" val psk = TestHelper.preSharedKeyPending() whenever( - pskRepository.findFirstByIdentityAndStatusOrderByRevisionDesc( - identity, - PreSharedKeyStatus.PENDING - ) - ).thenReturn(psk) + pskRepository.findFirstByIdentityAndStatusOrderByRevisionDesc( + identity, PreSharedKeyStatus.PENDING)) + .thenReturn(psk) val pendingKeyPresent = pskService.isPendingKeyPresent(identity) @@ -73,11 +63,9 @@ class PskServiceTest { fun pendingKeyPresentFalse() { val identity = "identity" whenever( - pskRepository.findFirstByIdentityAndStatusOrderByRevisionDesc( - identity, - PreSharedKeyStatus.PENDING - ) - ).thenReturn(null) + pskRepository.findFirstByIdentityAndStatusOrderByRevisionDesc( + identity, PreSharedKeyStatus.PENDING)) + .thenReturn(null) val pendingKeyPresent = pskService.isPendingKeyPresent(identity) @@ -89,11 +77,9 @@ class PskServiceTest { val psk = TestHelper.preSharedKeyPending() val identity = psk.identity whenever( - pskRepository.findFirstByIdentityAndStatusOrderByRevisionDesc( - identity, - PreSharedKeyStatus.PENDING - ) - ).thenReturn(psk) + pskRepository.findFirstByIdentityAndStatusOrderByRevisionDesc( + identity, PreSharedKeyStatus.PENDING)) + .thenReturn(psk) pskService.setPendingKeyAsInvalid(identity) @@ -107,12 +93,8 @@ class PskServiceTest { val identity = psk.identity val status = psk.status - whenever( - pskRepository.findFirstByIdentityAndStatusOrderByRevisionDesc( - identity, - status - ) - ).thenReturn(psk) + whenever(pskRepository.findFirstByIdentityAndStatusOrderByRevisionDesc(identity, status)) + .thenReturn(psk) whenever(pskRepository.save(psk)).thenReturn(psk) val result = pskService.setReadyKeyForIdentityAsPending(identity) @@ -127,13 +109,9 @@ class PskServiceTest { val psk = TestHelper.preSharedKeyReady() val identity = psk.identity whenever( - pskRepository.findFirstByIdentityAndStatusOrderByRevisionDesc( - identity, - PreSharedKeyStatus.READY - ) - ).thenReturn( - psk - ) + pskRepository.findFirstByIdentityAndStatusOrderByRevisionDesc( + identity, PreSharedKeyStatus.READY)) + .thenReturn(psk) whenever(pskConfiguration.changeInitialPsk).thenReturn(true) val needsKeyChange = pskService.needsKeyChange(identity) @@ -154,11 +132,9 @@ class PskServiceTest { fun needsKeyChangeReturnFalseWhenChangeInitialPskIsTrueButReadyKeyIsNotPresent() { val identity = "123" whenever( - pskRepository.findFirstByIdentityAndStatusOrderByRevisionDesc( - identity, - PreSharedKeyStatus.READY - ) - ).thenReturn(null) + pskRepository.findFirstByIdentityAndStatusOrderByRevisionDesc( + identity, PreSharedKeyStatus.READY)) + .thenReturn(null) whenever(pskConfiguration.changeInitialPsk).thenReturn(true) val needsKeyChange = pskService.needsKeyChange(identity) @@ -173,17 +149,13 @@ class PskServiceTest { val newPsk = TestHelper.preSharedKeyPending() whenever( - pskRepository.findFirstByIdentityAndStatusOrderByRevisionDesc( - identity, - PreSharedKeyStatus.ACTIVE - ) - ).thenReturn(currentPsk) + pskRepository.findFirstByIdentityAndStatusOrderByRevisionDesc( + identity, PreSharedKeyStatus.ACTIVE)) + .thenReturn(currentPsk) whenever( - pskRepository.findFirstByIdentityAndStatusOrderByRevisionDesc( - identity, - PreSharedKeyStatus.PENDING - ) - ).thenReturn(newPsk) + pskRepository.findFirstByIdentityAndStatusOrderByRevisionDesc( + identity, PreSharedKeyStatus.PENDING)) + .thenReturn(newPsk) pskService.changeActiveKey(identity) diff --git a/application/src/test/kotlin/org/gxf/crestdeviceservice/psk/entity/convertors/DatabaseFieldEncryptorTest.kt b/application/src/test/kotlin/org/gxf/crestdeviceservice/psk/entity/convertors/DatabaseFieldEncryptorTest.kt index d8c8f434..4439fca6 100644 --- a/application/src/test/kotlin/org/gxf/crestdeviceservice/psk/entity/convertors/DatabaseFieldEncryptorTest.kt +++ b/application/src/test/kotlin/org/gxf/crestdeviceservice/psk/entity/convertors/DatabaseFieldEncryptorTest.kt @@ -8,7 +8,8 @@ import org.junit.jupiter.api.Test class DatabaseFieldEncryptorTest { - private val databaseFieldEncryptor = DatabaseFieldEncryptor().apply { secret = "super-secret-key" } + private val databaseFieldEncryptor = + DatabaseFieldEncryptor().apply { secret = "super-secret-key" } @Test fun shouldBeAbleTeEncryptAndDecryptData() { diff --git a/build.gradle.kts b/build.gradle.kts index e04c3439..e1f7486b 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -2,6 +2,8 @@ // // SPDX-License-Identifier: Apache-2.0 +import com.diffplug.gradle.spotless.SpotlessExtension +import com.github.davidmc24.gradle.plugin.avro.GenerateAvroJavaTask import io.spring.gradle.dependencymanagement.internal.dsl.StandardDependencyManagementExtension import org.jetbrains.kotlin.gradle.tasks.KotlinCompile @@ -12,6 +14,7 @@ plugins { kotlin("plugin.spring") version "1.9.23" apply false kotlin("plugin.jpa") version "1.9.23" apply false id("com.github.davidmc24.gradle.plugin.avro") version "1.9.1" apply false + id("com.diffplug.spotless") version "6.25.0" id("org.sonarqube") version "4.4.1.3373" id("eclipse") } @@ -31,6 +34,7 @@ subprojects { apply(plugin = "org.jetbrains.kotlin.jvm") apply(plugin = "org.jetbrains.kotlin.plugin.spring") apply(plugin = "io.spring.dependency-management") + apply(plugin = "com.diffplug.spotless") apply(plugin = "eclipse") apply(plugin = "org.jetbrains.kotlin.plugin.jpa") apply(plugin = "jacoco") @@ -50,6 +54,17 @@ subprojects { } } + extensions.configure { + kotlin { + // by default the target is every '.kt' and '.kts' file in the java source sets + ktfmt().dropboxStyle() + licenseHeaderFile( + "${project.rootDir}/license-template.kt", + "package") + .updateYearWithLatest(false) + } + } + extensions.configure { toolchain { languageVersion.set(JavaLanguageVersion.of(21)) @@ -67,6 +82,7 @@ subprojects { freeCompilerArgs = listOf("-Xjsr305=strict") jvmTarget = "21" } + dependsOn(tasks.withType()) } tasks.withType { diff --git a/license-template.kt b/license-template.kt new file mode 100644 index 00000000..878d7ea2 --- /dev/null +++ b/license-template.kt @@ -0,0 +1,3 @@ +// SPDX-FileCopyrightText: Contributors to the GXF project +// +// SPDX-License-Identifier: Apache-2.0