From 629728f865e08d1f1bb0949d5ff5d64813290869 Mon Sep 17 00:00:00 2001 From: Timo Bryant Date: Tue, 23 Apr 2024 22:58:09 +0200 Subject: [PATCH] could store credentials to db --- gradle/libs.versions.toml | 21 ++++++ .../loaders/AccountLoaderTests.kt | 5 +- modules/ModCredentialManager/build.gradle.kts | 2 + .../Credential.kt | 2 +- .../modCredentialManager/CredentialManager.kt | 9 +++ .../ModCredentialManager.kt | 2 +- .../postgresBackend/PostgresBackend.kt | 69 +++++++++++++++++++ .../de/itkl/module/CredentialManager.kt | 9 --- .../postgresBackend/PostgresBackendTest.kt | 12 ++++ 9 files changed, 119 insertions(+), 12 deletions(-) rename modules/ModCredentialManager/src/main/kotlin/de/itkl/{module => modCredentialManager}/Credential.kt (95%) create mode 100644 modules/ModCredentialManager/src/main/kotlin/de/itkl/modCredentialManager/CredentialManager.kt rename modules/ModCredentialManager/src/main/kotlin/de/itkl/{module => modCredentialManager}/ModCredentialManager.kt (64%) create mode 100644 modules/ModCredentialManager/src/main/kotlin/de/itkl/modCredentialManager/postgresBackend/PostgresBackend.kt delete mode 100644 modules/ModCredentialManager/src/main/kotlin/de/itkl/module/CredentialManager.kt create mode 100644 modules/ModCredentialManager/src/test/kotlin/de/itkl/modCredentialManager/postgresBackend/PostgresBackendTest.kt diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 8f67454..a7316a6 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -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", diff --git a/modules/ModConfiguration/src/test/kotlin/de/itkl/modConfiguration/loaders/AccountLoaderTests.kt b/modules/ModConfiguration/src/test/kotlin/de/itkl/modConfiguration/loaders/AccountLoaderTests.kt index 0be6f4c..eae52fe 100644 --- a/modules/ModConfiguration/src/test/kotlin/de/itkl/modConfiguration/loaders/AccountLoaderTests.kt +++ b/modules/ModConfiguration/src/test/kotlin/de/itkl/modConfiguration/loaders/AccountLoaderTests.kt @@ -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) } } diff --git a/modules/ModCredentialManager/build.gradle.kts b/modules/ModCredentialManager/build.gradle.kts index 933a472..aadd0f3 100644 --- a/modules/ModCredentialManager/build.gradle.kts +++ b/modules/ModCredentialManager/build.gradle.kts @@ -1,3 +1,5 @@ dependencies { implementation(project(":modules:ModuleCore")) + implementation("org.postgresql:postgresql:42.7.3") + implementation(libs.bundles.exposed) } diff --git a/modules/ModCredentialManager/src/main/kotlin/de/itkl/module/Credential.kt b/modules/ModCredentialManager/src/main/kotlin/de/itkl/modCredentialManager/Credential.kt similarity index 95% rename from modules/ModCredentialManager/src/main/kotlin/de/itkl/module/Credential.kt rename to modules/ModCredentialManager/src/main/kotlin/de/itkl/modCredentialManager/Credential.kt index c90627a..4afc8d6 100644 --- a/modules/ModCredentialManager/src/main/kotlin/de/itkl/module/Credential.kt +++ b/modules/ModCredentialManager/src/main/kotlin/de/itkl/modCredentialManager/Credential.kt @@ -1,4 +1,4 @@ -package de.itkl.module +package de.itkl.modCredentialManager import de.itkl.moduleCore.types.Expirable import de.itkl.moduleCore.types.MaybeExpirable diff --git a/modules/ModCredentialManager/src/main/kotlin/de/itkl/modCredentialManager/CredentialManager.kt b/modules/ModCredentialManager/src/main/kotlin/de/itkl/modCredentialManager/CredentialManager.kt new file mode 100644 index 0000000..f96b921 --- /dev/null +++ b/modules/ModCredentialManager/src/main/kotlin/de/itkl/modCredentialManager/CredentialManager.kt @@ -0,0 +1,9 @@ +package de.itkl.modCredentialManager + +interface CredentialManager { + fun find(id: String): Credential? + + fun add(credential: Credential) + + fun delete(id: String) +} diff --git a/modules/ModCredentialManager/src/main/kotlin/de/itkl/module/ModCredentialManager.kt b/modules/ModCredentialManager/src/main/kotlin/de/itkl/modCredentialManager/ModCredentialManager.kt similarity index 64% rename from modules/ModCredentialManager/src/main/kotlin/de/itkl/module/ModCredentialManager.kt rename to modules/ModCredentialManager/src/main/kotlin/de/itkl/modCredentialManager/ModCredentialManager.kt index acaff92..65b0d3f 100644 --- a/modules/ModCredentialManager/src/main/kotlin/de/itkl/module/ModCredentialManager.kt +++ b/modules/ModCredentialManager/src/main/kotlin/de/itkl/modCredentialManager/ModCredentialManager.kt @@ -1,4 +1,4 @@ -package de.itkl.module +package de.itkl.modCredentialManager import org.koin.dsl.module diff --git a/modules/ModCredentialManager/src/main/kotlin/de/itkl/modCredentialManager/postgresBackend/PostgresBackend.kt b/modules/ModCredentialManager/src/main/kotlin/de/itkl/modCredentialManager/postgresBackend/PostgresBackend.kt new file mode 100644 index 0000000..e2b6c3a --- /dev/null +++ b/modules/ModCredentialManager/src/main/kotlin/de/itkl/modCredentialManager/postgresBackend/PostgresBackend.kt @@ -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 = varchar("displayName", 255) + val username: Column = varchar("username", 255).nullable() + val notes: Column = text("notes").nullable() + val secret: Column = text("secret") + val expiresAt: Column = timestamp("expiresAt").nullable() +} + +class DbCredential(id: EntityID) : UUIDEntity(id) { + companion object : UUIDEntityClass(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 +} diff --git a/modules/ModCredentialManager/src/main/kotlin/de/itkl/module/CredentialManager.kt b/modules/ModCredentialManager/src/main/kotlin/de/itkl/module/CredentialManager.kt deleted file mode 100644 index 95cbbae..0000000 --- a/modules/ModCredentialManager/src/main/kotlin/de/itkl/module/CredentialManager.kt +++ /dev/null @@ -1,9 +0,0 @@ -package de.itkl.module - -interface CredentialManager { - fun find(id: String): Credential? - - fun add(credential: Credential) {} - - fun delete(id: String) {} -} diff --git a/modules/ModCredentialManager/src/test/kotlin/de/itkl/modCredentialManager/postgresBackend/PostgresBackendTest.kt b/modules/ModCredentialManager/src/test/kotlin/de/itkl/modCredentialManager/postgresBackend/PostgresBackendTest.kt new file mode 100644 index 0000000..21502e6 --- /dev/null +++ b/modules/ModCredentialManager/src/test/kotlin/de/itkl/modCredentialManager/postgresBackend/PostgresBackendTest.kt @@ -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 = "")) + } +}