add basic credentials types

main
Timo Bryant 2024-04-23 22:04:57 +02:00
parent 5d0847db0d
commit 636b3c7034
7 changed files with 63 additions and 18 deletions

View File

@ -12,12 +12,11 @@ inline fun <reified T : Any> 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()
}

View File

@ -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<String, Account> {
val loadedAccounts: Accounts = ConfigLoaderBuilder.default()
.addPathSource(path)
.build()
.loadConfigOrThrow()
return loadedAccounts.account.mapValues { (name, accountDef) ->
Account(
name = name,
login = accountDef.login,
password = accountDef.password,
)
}
}

View File

@ -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='***')"
}
}

View File

@ -1,5 +1,5 @@
package de.itkl.modConfiguration.types
data class Accounts(
internal data class Accounts(
val account: Map<String, AccountDef>,
)

View File

@ -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

View File

@ -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) {}

View File

@ -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
}