package info.mechyrdia.auth
+import com.mongodb.client.model.Filters
import info.mechyrdia.data.*
import info.mechyrdia.lore.adminPage
import info.mechyrdia.lore.dateTime
import info.mechyrdia.route.href
import info.mechyrdia.route.installCsrfToken
import io.ktor.server.application.*
+import kotlinx.coroutines.flow.toList
import kotlinx.html.*
import kotlinx.serialization.Serializable
import java.time.Instant
override suspend fun initialize() {
Table.index(WebDavToken::holder)
+ Table.expire(WebDavToken::validUntil)
}
}
}
-fun ApplicationCall.adminRequestWebDavToken(): HTML.() -> Unit {
+suspend fun ApplicationCall.adminRequestWebDavToken(): HTML.() -> Unit {
+ val nation = currentNation()
+ ?: redirectHref(Root.Auth.LoginPage(Root.Auth(Root(error = "You must be logged in to request WebDav tokens"))))
+
+ val existingTokens = WebDavToken.Table
+ .filter(Filters.eq(WebDavToken::holder.serialName, nation.id))
+ .toList()
+
return adminPage("Request WebDav Token") {
div(classes = "message") {
div {
installCsrfToken()
submitInput { value = "Request WebDav Token" }
}
+
+ if (existingTokens.isNotEmpty()) {
+ p {
+ +"You already have the following tokens:"
+ }
+
+ table {
+ tr {
+ th { +"Token" }
+ th { +"Expires at" }
+ }
+
+ for (existingToken in existingTokens) {
+ tr {
+ td {
+ textInput {
+ readonly = true
+ value = existingToken.id.id
+ }
+ }
+ td {
+ dateTime(existingToken.validUntil)
+ }
+ }
+ }
+ }
+ }
}
}
}
import com.mongodb.MongoDriverInformation
import com.mongodb.client.model.*
import com.mongodb.kotlin.client.coroutine.MongoDatabase
+import com.mongodb.kotlin.client.coroutine.expireAfter
import com.mongodb.reactivestreams.client.MongoClients
import com.mongodb.reactivestreams.client.gridfs.GridFSBucket
import com.mongodb.reactivestreams.client.gridfs.GridFSBuckets
import org.bson.codecs.kotlinx.KotlinSerializerCodecProvider
import org.bson.conversions.Bson
import java.security.SecureRandom
+import java.time.Instant
import kotlin.reflect.KClass
import kotlin.reflect.KProperty
import kotlin.reflect.KProperty1
collection().createIndex(Indexes.ascending(*properties.map { it.serialName }.toTypedArray()), IndexOptions().unique(true))
}
+ suspend fun expire(property: KProperty1<T, Instant>) {
+ collection().createIndex(Indexes.ascending(property.serialName), IndexOptions().expireAfter(0L))
+ }
+
suspend fun indexIf(condition: Bson, vararg properties: KProperty1<T, *>) {
collection().createIndex(Indexes.ascending(*properties.map { it.serialName }.toTypedArray()), IndexOptions().partialFilterExpression(condition))
}