could store credentials to db

main
Timo Bryant 2024-04-23 22:58:09 +02:00
parent 636b3c7034
commit 629728f865
9 changed files with 119 additions and 12 deletions

View File

@ -7,6 +7,7 @@ kotlin-logging = "6.0.4"
kotlinx = "1.7.3"
kotlin = "1.9.22"
hoplite = "2.7.5"
exposed = "0.49.0"
[libraries]
koin-core = {module = "io.insert-koin:koin-core", version.ref = "koin" }
@ -31,11 +32,31 @@ gradle-kotlin-jvm = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", vers
hoplite-core = { module = "com.sksamuel.hoplite:hoplite-core", version.ref = "hoplite" }
hoplite-toml = { module = "com.sksamuel.hoplite:hoplite-toml", version.ref = "hoplite" }
exposed-core = { module = "org.jetbrains.exposed:exposed-core", version.ref = "exposed" }
exposed-crypt = { module = "org.jetbrains.exposed:exposed-crypt", version.ref = "exposed" }
exposed-dao = { module = "org.jetbrains.exposed:exposed-dao", version.ref = "exposed" }
exposed-jdbc = { module = "org.jetbrains.exposed:exposed-jdbc", version.ref = "exposed" }
exposed-json = { module = "org.jetbrains.exposed:exposed-json", version.ref = "exposed" }
exposed-kotlin-datetime = { module = "org.jetbrains.exposed:exposed-kotlin-datetime", version.ref = "exposed" }
exposed-money = { module = " org.jetbrains.exposed:exposed-money", version.ref = "exposed" }
exposed-java-time = { module = "org.jetbrains.exposed:exposed-java-time", version.ref = "exposed" }
exposed-jodatime = { module = "org.jetbrains.exposed:exposed-jodatime", version.ref = "exposed" }
[plugins]
jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" }
kotlinx-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin"}
[bundles]
exposed = [
"exposed-core",
"exposed-crypt",
"exposed-dao",
"exposed-jdbc",
"exposed-money",
"exposed-json",
"exposed-kotlin-datetime",
]
hoplite = [
"hoplite-core",
"hoplite-toml",

View File

@ -1,5 +1,7 @@
package de.itkl.modConfiguration.loaders
import assertk.assertThat
import assertk.assertions.hasSize
import de.itkl.moduleCore.support.requiredResourcePath
import org.junit.jupiter.api.Test
@ -8,6 +10,7 @@ class AccountLoaderTests {
fun testAccountLoad() {
val accountsToml = requiredResourcePath("testAccounts.toml")
val accounts = loadAccounts(accountsToml)
println(accounts)
assertThat(accounts)
.hasSize(2)
}
}

View File

@ -1,3 +1,5 @@
dependencies {
implementation(project(":modules:ModuleCore"))
implementation("org.postgresql:postgresql:42.7.3")
implementation(libs.bundles.exposed)
}

View File

@ -1,4 +1,4 @@
package de.itkl.module
package de.itkl.modCredentialManager
import de.itkl.moduleCore.types.Expirable
import de.itkl.moduleCore.types.MaybeExpirable

View File

@ -0,0 +1,9 @@
package de.itkl.modCredentialManager
interface CredentialManager {
fun find(id: String): Credential?
fun add(credential: Credential)
fun delete(id: String)
}

View File

@ -0,0 +1,69 @@
package de.itkl.modCredentialManager.postgresBackend
import de.itkl.modCredentialManager.Credential
import de.itkl.modCredentialManager.CredentialManager
import io.github.oshai.kotlinlogging.KotlinLogging
import kotlinx.datetime.Clock
import kotlinx.datetime.Instant
import org.jetbrains.exposed.dao.UUIDEntity
import org.jetbrains.exposed.dao.UUIDEntityClass
import org.jetbrains.exposed.dao.id.EntityID
import org.jetbrains.exposed.dao.id.UUIDTable
import org.jetbrains.exposed.sql.*
import org.jetbrains.exposed.sql.kotlin.datetime.timestamp
import org.jetbrains.exposed.sql.transactions.transaction
import java.util.UUID
import kotlin.time.Duration.Companion.hours
private val Log = KotlinLogging.logger { }
class PostgresBackend : CredentialManager {
val dbConnection = Database.connect(
"jdbc:postgresql://localhost:5432/postgres",
driver = "org.postgresql.Driver",
user = "kinch",
)
init {
transaction {
addLogger(StdOutSqlLogger)
SchemaUtils.create(Credentials)
}
}
override fun find(id: String): Credential? {
TODO("Not yet implemented")
}
override fun add(credential: Credential) {
transaction {
DbCredential.new {
displayName = credential.id
secret = "timo"
expiresAt = Clock.System.now() + 1.hours
}
}
}
override fun delete(id: String) {
TODO("Not yet implemented")
}
}
object Credentials : UUIDTable() {
val displayName: Column<String> = varchar("displayName", 255)
val username: Column<String?> = varchar("username", 255).nullable()
val notes: Column<String?> = text("notes").nullable()
val secret: Column<String> = text("secret")
val expiresAt: Column<Instant?> = timestamp("expiresAt").nullable()
}
class DbCredential(id: EntityID<UUID>) : UUIDEntity(id) {
companion object : UUIDEntityClass<DbCredential>(Credentials)
var displayName by Credentials.displayName
var username by Credentials.username
var notes by Credentials.notes
var secret by Credentials.secret
var expiresAt by Credentials.expiresAt
}

View File

@ -1,9 +0,0 @@
package de.itkl.module
interface CredentialManager {
fun find(id: String): Credential?
fun add(credential: Credential) {}
fun delete(id: String) {}
}

View File

@ -0,0 +1,12 @@
package de.itkl.modCredentialManager.postgresBackend
import de.itkl.modCredentialManager.UsernameAndPassword
import org.junit.jupiter.api.Assertions.*
import org.junit.jupiter.api.Test
class PostgresBackendTest {
@Test
fun `can create a table`() {
PostgresBackend().add(UsernameAndPassword("username", "password", username = "", password = ""))
}
}