From 636b3c703463c1b64377f3001036fbbc74cbd8f2 Mon Sep 17 00:00:00 2001 From: Timo Bryant Date: Tue, 23 Apr 2024 22:04:57 +0200 Subject: [PATCH] add basic credentials types --- .../extensions/configBuilderExtension.kt | 7 ++--- .../modConfiguration/loaders/AccountLoader.kt | 13 ++++++-- .../de/itkl/modConfiguration/types/Account.kt | 6 ++-- .../itkl/modConfiguration/types/Accounts.kt | 2 +- .../main/kotlin/de/itkl/module/Credential.kt | 31 ++++++++++++++++--- .../de/itkl/module/CredentialManager.kt | 6 ++-- .../de/itkl/moduleCore/types/Expirable.kt | 16 ++++++++++ 7 files changed, 63 insertions(+), 18 deletions(-) create mode 100644 modules/ModuleCore/src/main/kotlin/de/itkl/moduleCore/types/Expirable.kt diff --git a/modules/ModConfiguration/src/main/kotlin/de/itkl/modConfiguration/extensions/configBuilderExtension.kt b/modules/ModConfiguration/src/main/kotlin/de/itkl/modConfiguration/extensions/configBuilderExtension.kt index f63b884..994885e 100644 --- a/modules/ModConfiguration/src/main/kotlin/de/itkl/modConfiguration/extensions/configBuilderExtension.kt +++ b/modules/ModConfiguration/src/main/kotlin/de/itkl/modConfiguration/extensions/configBuilderExtension.kt @@ -12,12 +12,11 @@ inline fun ConfigLoaderBuilder.addStringDecoder(crossinline de fun ConfigLoaderBuilder.resolveAccountsFrom(path: Path): ConfigLoaderBuilder { val accounts = loadAccounts(path) - addStringDecoder { value -> - accounts.account[value].expect { + return addStringDecoder { value -> + accounts[value].expect { "The account $value could not be found. " + "Looked into path $path. " + - "Available accounts: ${accounts.account.map { it.key }.joinToString(",")}" + "Available accounts: ${accounts.map { it.key }.joinToString(",")}" } } - TODO() } diff --git a/modules/ModConfiguration/src/main/kotlin/de/itkl/modConfiguration/loaders/AccountLoader.kt b/modules/ModConfiguration/src/main/kotlin/de/itkl/modConfiguration/loaders/AccountLoader.kt index 4a07f6f..1b47e1f 100644 --- a/modules/ModConfiguration/src/main/kotlin/de/itkl/modConfiguration/loaders/AccountLoader.kt +++ b/modules/ModConfiguration/src/main/kotlin/de/itkl/modConfiguration/loaders/AccountLoader.kt @@ -2,12 +2,21 @@ package de.itkl.modConfiguration.loaders import com.sksamuel.hoplite.ConfigLoaderBuilder import com.sksamuel.hoplite.addPathSource +import de.itkl.modConfiguration.types.Account import de.itkl.modConfiguration.types.Accounts import java.nio.file.Path -fun loadAccounts(path: Path): Accounts { - return ConfigLoaderBuilder.default() +internal fun loadAccounts(path: Path): Map { + val loadedAccounts: Accounts = ConfigLoaderBuilder.default() .addPathSource(path) .build() .loadConfigOrThrow() + + return loadedAccounts.account.mapValues { (name, accountDef) -> + Account( + name = name, + login = accountDef.login, + password = accountDef.password, + ) + } } diff --git a/modules/ModConfiguration/src/main/kotlin/de/itkl/modConfiguration/types/Account.kt b/modules/ModConfiguration/src/main/kotlin/de/itkl/modConfiguration/types/Account.kt index 550efe7..bca0f0e 100644 --- a/modules/ModConfiguration/src/main/kotlin/de/itkl/modConfiguration/types/Account.kt +++ b/modules/ModConfiguration/src/main/kotlin/de/itkl/modConfiguration/types/Account.kt @@ -6,15 +6,15 @@ data class Account( val password: String, ) { override fun toString(): String { - return "Account(login='$login')" + return "Account($name, login='$login', password='***')" } } -data class AccountDef( +internal data class AccountDef( val login: String, val password: String, ) { override fun toString(): String { - return "Account(login='$login')" + return "Account(login='$login', password='***')" } } diff --git a/modules/ModConfiguration/src/main/kotlin/de/itkl/modConfiguration/types/Accounts.kt b/modules/ModConfiguration/src/main/kotlin/de/itkl/modConfiguration/types/Accounts.kt index 5f6271f..e12aa65 100644 --- a/modules/ModConfiguration/src/main/kotlin/de/itkl/modConfiguration/types/Accounts.kt +++ b/modules/ModConfiguration/src/main/kotlin/de/itkl/modConfiguration/types/Accounts.kt @@ -1,5 +1,5 @@ package de.itkl.modConfiguration.types -data class Accounts( +internal data class Accounts( val account: Map, ) diff --git a/modules/ModCredentialManager/src/main/kotlin/de/itkl/module/Credential.kt b/modules/ModCredentialManager/src/main/kotlin/de/itkl/module/Credential.kt index 644aee6..c90627a 100644 --- a/modules/ModCredentialManager/src/main/kotlin/de/itkl/module/Credential.kt +++ b/modules/ModCredentialManager/src/main/kotlin/de/itkl/module/Credential.kt @@ -1,13 +1,36 @@ package de.itkl.module -sealed class Credential { - abstract val id: String - abstract val notes: String +import de.itkl.moduleCore.types.Expirable +import de.itkl.moduleCore.types.MaybeExpirable +import kotlinx.datetime.Instant + +sealed interface Credential : MaybeExpirable { + val id: String + val notes: String } +sealed interface Token : Credential + data class UsernameAndPassword( override val id: String, override val notes: String, val username: String, val password: String, -) : Credential() +) : Credential + +@JvmInline +value class TokenString(val value: String) + +data class BearerToken( + val tokenString: TokenString, + override val id: String, + override val notes: String, + override val expiresAt: Instant, +) : Token, Expirable + +data class RefreshToken( + val tokenString: TokenString, + override val id: String, + override val notes: String, + override val expiresAt: Instant, +) : Token, Expirable diff --git a/modules/ModCredentialManager/src/main/kotlin/de/itkl/module/CredentialManager.kt b/modules/ModCredentialManager/src/main/kotlin/de/itkl/module/CredentialManager.kt index 230db64..95cbbae 100644 --- a/modules/ModCredentialManager/src/main/kotlin/de/itkl/module/CredentialManager.kt +++ b/modules/ModCredentialManager/src/main/kotlin/de/itkl/module/CredentialManager.kt @@ -1,9 +1,7 @@ package de.itkl.module -class CredentialManager { - fun find(id: String): Credential? { - TODO("Not yet implemented") - } +interface CredentialManager { + fun find(id: String): Credential? fun add(credential: Credential) {} diff --git a/modules/ModuleCore/src/main/kotlin/de/itkl/moduleCore/types/Expirable.kt b/modules/ModuleCore/src/main/kotlin/de/itkl/moduleCore/types/Expirable.kt new file mode 100644 index 0000000..a55be99 --- /dev/null +++ b/modules/ModuleCore/src/main/kotlin/de/itkl/moduleCore/types/Expirable.kt @@ -0,0 +1,16 @@ +package de.itkl.moduleCore.types + +import kotlinx.datetime.Clock +import kotlinx.datetime.Instant +import kotlin.time.Duration + +interface Expirable : MaybeExpirable { + val expiresAt: Instant + val isExpired: Boolean get() = expiresAt < Clock.System.now() + val expiresIn: Duration get() = expiresAt - Clock.System.now() + override val expiration: Expirable get() = this +} + +interface MaybeExpirable { + val expiration: Expirable? get() = null +}