diff options
Diffstat (limited to 'bank/src/main/kotlin/tech/libeufin/bank/Tan.kt')
-rw-r--r-- | bank/src/main/kotlin/tech/libeufin/bank/Tan.kt | 64 |
1 files changed, 63 insertions, 1 deletions
diff --git a/bank/src/main/kotlin/tech/libeufin/bank/Tan.kt b/bank/src/main/kotlin/tech/libeufin/bank/Tan.kt index 8359e5e8..5dddd807 100644 --- a/bank/src/main/kotlin/tech/libeufin/bank/Tan.kt +++ b/bank/src/main/kotlin/tech/libeufin/bank/Tan.kt @@ -19,8 +19,70 @@ package tech.libeufin.bank import java.security.SecureRandom -import java.util.UUID +import java.time.Instant +import java.time.Duration import java.text.DecimalFormat +import kotlinx.serialization.json.Json +import io.ktor.http.* +import io.ktor.server.request.* +import io.ktor.server.response.* +import io.ktor.server.application.* +import tech.libeufin.bank.db.TanDAO.* +import tech.libeufin.bank.db.* +import tech.libeufin.bank.auth.* +import io.ktor.util.pipeline.PipelineContext + + +inline suspend fun <reified B> ApplicationCall.respondChallenge( + db: Database, + op: Operation, + body: B, + channel: TanChannel? = null, + info: String? = null +) { + val json = Json.encodeToString(kotlinx.serialization.serializer<B>(), body); + val code = Tan.genCode() + val id = db.tan.new( + login = username, + op = op, + body = json, + code = code, + now = Instant.now(), + retryCounter = TAN_RETRY_COUNTER, + validityPeriod = TAN_VALIDITY_PERIOD, + channel = channel, + info = info + ) + respond( + status = HttpStatusCode.Accepted, + message = TanChallenge(id) + ) +} + +inline suspend fun <reified B> ApplicationCall.receiveChallenge( + db: Database, + op: Operation +): Pair<B, Challenge?> { + val id = request.headers["X-Challenge-Id"]?.toLongOrNull() + return if (id != null) { + val challenge = db.tan.challenge(id, username, op)!! + Pair(Json.decodeFromString(challenge.body), challenge) + } else { + Pair(this.receive(), null) + } +} + +suspend fun ApplicationCall.challenge( + db: Database, + op: Operation +): Challenge? { + val id = request.headers["X-Challenge-Id"]?.toLongOrNull() + return if (id != null) { + db.tan.challenge(id, username, op)!! + } else { + null + } +} object Tan { private val CODE_FORMAT = DecimalFormat("00000000"); |