MigrationKeyStoreService.kt
package de.pflugradts.passbird.adapter.keystore
import de.pflugradts.kotlinextensions.TryResult.Companion.failure
import de.pflugradts.kotlinextensions.tryCatching
import de.pflugradts.passbird.application.KeyStoreAdapterPort
import de.pflugradts.passbird.application.keystore.KeyStoreFormat
import de.pflugradts.passbird.application.keystore.KeyStoreFormatDetector
import de.pflugradts.passbird.application.util.SystemOperation
import de.pflugradts.passbird.domain.model.shell.PlainShell
import de.pflugradts.passbird.domain.model.shell.Shell
import java.nio.file.Path
class MigrationKeyStoreService constructor(
private val currentKeyStoreService: KeyStoreService,
private val jceksKeyStoreService: JceksKeyStoreService,
private val keyStoreFormatDetector: KeyStoreFormatDetector,
private val systemOperation: SystemOperation,
) : KeyStoreAdapterPort {
override fun loadKey(password: PlainShell, path: Path) = tryCatching {
keyStoreFormatDetector.detect(systemOperation.readBytesFromFile(path))
}.let { format ->
if (format.failure) {
password.scramble()
failure(format.exceptionOrNull()!!)
} else {
when (format.getOrNull()!!) {
KeyStoreFormat.JCEKS -> jceksKeyStoreService.loadKey(password, path)
KeyStoreFormat.PKCS12, KeyStoreFormat.UNKNOWN -> currentKeyStoreService.loadKey(password, path)
}
}
}
override fun storeKey(password: PlainShell, path: Path) = currentKeyStoreService.storeKey(password, path)
override fun storeExistingKey(key: Shell, password: PlainShell, path: Path) =
currentKeyStoreService.storeExistingKey(key, password, path)
}