gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[libeufin] branch master updated: util DCE


From: gnunet
Subject: [libeufin] branch master updated: util DCE
Date: Wed, 15 Nov 2023 18:07:20 +0100

This is an automated email from the git hooks/post-receive script.

ms pushed a commit to branch master
in repository libeufin.

The following commit(s) were added to refs/heads/master by this push:
     new 0f3bbe82 util DCE
0f3bbe82 is described below

commit 0f3bbe826267e59f96c58b973316439fac7b3e58
Author: MS <ms@taler.net>
AuthorDate: Wed Nov 15 18:07:03 2023 +0100

    util DCE
---
 util/src/main/kotlin/Config.kt           |  24 --
 util/src/main/kotlin/DB.kt               |  44 ----
 util/src/main/kotlin/Ebics.kt            | 361 +------------------------------
 util/src/main/kotlin/Errors.kt           |  45 ----
 util/src/main/kotlin/HTTP.kt             |  12 -
 util/src/main/kotlin/IbanPayto.kt        |  28 ---
 util/src/main/kotlin/JSON.kt             | 103 ---------
 util/src/main/kotlin/TalerConfig.kt      |   1 +
 util/src/main/kotlin/UnixDomainSocket.kt |  12 +-
 util/src/main/kotlin/XMLUtil.kt          |   3 -
 util/src/main/kotlin/amounts.kt          |  33 ---
 util/src/main/kotlin/exec.kt             |  36 ---
 util/src/main/kotlin/iban.kt             |  16 +-
 util/src/main/kotlin/startServer.kt      |   2 -
 util/src/main/kotlin/strings.kt          |  94 +-------
 15 files changed, 23 insertions(+), 791 deletions(-)

diff --git a/util/src/main/kotlin/Config.kt b/util/src/main/kotlin/Config.kt
index c54dc4ed..afe695ce 100644
--- a/util/src/main/kotlin/Config.kt
+++ b/util/src/main/kotlin/Config.kt
@@ -1,9 +1,6 @@
 package tech.libeufin.util
 
-import ch.qos.logback.classic.Level
-import ch.qos.logback.classic.LoggerContext
 import ch.qos.logback.core.util.Loader
-import io.ktor.util.*
 import org.slf4j.Logger
 import org.slf4j.LoggerFactory
 
@@ -16,29 +13,8 @@ val logger: Logger = 
LoggerFactory.getLogger("tech.libeufin.util")
  * Note: putting Sandbox and Nexus as Utils dependencies would result
  * into circular dependency.
  */
-val WITH_AUTH_ATTRIBUTE_KEY = AttributeKey<Boolean>("withAuth")
-val ADMIN_PASSWORD_ATTRIBUTE_KEY = AttributeKey<String>("adminPassword")
-
 fun getVersion(): String {
     return Loader.getResource(
         "version.txt", ClassLoader.getSystemClassLoader()
     ).readText()
-}
-
-/**
- * Set level of any logger belonging to LibEuFin (= has "libeufin" in name)
- * _and_ found under the calling classpath (= obeying to the same logback.xml)
- */
-fun setLogLevel(logLevel: String?) {
-    when (logLevel) {
-        is String -> {
-            val ctx = LoggerFactory.getILoggerFactory() as LoggerContext
-            val loggers: List<ch.qos.logback.classic.Logger> = ctx.loggerList
-            loggers.forEach {
-                if (it.name.contains("libeufin")) {
-                    it.level = Level.toLevel(logLevel)
-                }
-            }
-        }
-    }
 }
\ No newline at end of file
diff --git a/util/src/main/kotlin/DB.kt b/util/src/main/kotlin/DB.kt
index 8467e625..804944f3 100644
--- a/util/src/main/kotlin/DB.kt
+++ b/util/src/main/kotlin/DB.kt
@@ -37,50 +37,6 @@ fun getCurrentUser(): String = 
System.getProperty("user.name")
 
 
 // Check GANA (https://docs.gnunet.org/gana/index.html) for numbers allowance.
-/**
- * Note: every domain is ALWAYS meant to be salted with
- * a unique identifier that points to the user waiting for
- * a notification.  The reference function for salting is:
- * "buildChannelName()", in this file.
- */
-enum class NotificationsChannelDomains(val value: Int) {
-    // When payments with well-formed Taler subject arrive.
-    LIBEUFIN_TALER_INCOMING(3000),
-
-    // A transaction happened for a particular user.  The payload
-    // informs about the direction.
-    LIBEUFIN_REGIO_TX(3001),
-
-    // When an incoming fiat payment is downloaded from Nexus.
-    // Happens when a customer wants to withdraw Taler coins in the
-    // regional currency.
-    LIBEUFIN_SANDBOX_FIAT_INCOMING(3002),
-
-    // When Nexus has ingested a new transactions from the bank it
-    // is connected to.  This event carries incoming and outgoing
-    // payments, and it specifies that in its payload.  The direction
-    // codename is the same as CaMt (DBIT, CRDT), as that is also
-    // used in the database.
-    LIBEUFIN_NEXUS_TX(3003)
-}
-
-/**
- * Helper that builds a LISTEN-NOTIFY channel name.
- * 'salt' should be any value that would uniquely deliver the
- * message to its receiver.  IBANs are ideal, but they cost DB queries.
- */
-
-fun buildChannelName(
-    domain: NotificationsChannelDomains,
-    salt: String,
-    separator: String = "_"
-): String {
-    val channelElements = "${domain.value}$separator$salt"
-    val ret = 
"X${Base32Crockford.encode(CryptoUtil.hashStringSHA256(channelElements))}"
-    logger.debug("Defining db channel name for salt: $salt, domain: 
${domain.name}, resulting in: $ret")
-    return ret
-}
-
 
 /**
  * This function converts postgresql:// URIs to JDBC URIs.
diff --git a/util/src/main/kotlin/Ebics.kt b/util/src/main/kotlin/Ebics.kt
index 4236eded..c6848c9c 100644
--- a/util/src/main/kotlin/Ebics.kt
+++ b/util/src/main/kotlin/Ebics.kt
@@ -25,15 +25,9 @@
 package tech.libeufin.util
 
 import io.ktor.http.HttpStatusCode
-import org.slf4j.Logger
-import org.slf4j.LoggerFactory
 import tech.libeufin.util.ebics_h004.*
-import tech.libeufin.util.ebics_h005.Ebics3Request
 import tech.libeufin.util.ebics_h005.Ebics3Response
-import tech.libeufin.util.ebics_hev.HEVRequest
-import tech.libeufin.util.ebics_hev.HEVResponse
 import tech.libeufin.util.ebics_s001.UserSignatureData
-import java.math.BigInteger
 import java.security.SecureRandom
 import java.security.interfaces.RSAPrivateCrtKey
 import java.security.interfaces.RSAPublicKey
@@ -41,7 +35,6 @@ import java.time.Instant
 import java.time.ZoneId
 import java.time.ZonedDateTime
 import java.util.*
-import java.util.zip.DeflaterInputStream
 import javax.xml.bind.JAXBElement
 import javax.xml.datatype.DatatypeFactory
 import javax.xml.datatype.XMLGregorianCalendar
@@ -198,33 +191,6 @@ fun signOrderEbics3(
     return userSignatureData
 }
 
-fun createEbicsRequestForDownloadReceipt(
-    subscriberDetails: EbicsClientSubscriberDetails,
-    transactionID: String?,
-    withEbics3: Boolean = false
-): String {
-    val doc = if (withEbics3) {
-        val req = Ebics3Request.createForDownloadReceiptPhase(
-            transactionID,
-            subscriberDetails.hostId
-        )
-        XMLUtil.convertJaxbToDocument(req)
-
-    } else {
-        val req = EbicsRequest.createForDownloadReceiptPhase(
-            transactionID,
-            subscriberDetails.hostId
-        )
-        XMLUtil.convertJaxbToDocument(req)
-    }
-    XMLUtil.signEbicsDocument(
-        doc,
-        subscriberDetails.customerAuthPriv,
-        withEbics3
-    )
-    return XMLUtil.convertDomToString(doc)
-}
-
 data class PreparedUploadData(
     val transactionKey: ByteArray,
     val userSignatureDataEncrypted: ByteArray,
@@ -252,176 +218,6 @@ data class PreparedUploadData(
     }
 }
 
-// Creates the EBICS 3 upload init request.
-fun createEbicsRequestForUploadInitialization(
-    subscriberDetails: EbicsClientSubscriberDetails,
-    ebics3OrderService: Ebics3Request.OrderDetails.Service,
-    orderParams: EbicsOrderParams? = null,
-    preparedUploadData: PreparedUploadData
-): String {
-    val nonce = getNonce(128)
-    val req = Ebics3Request.createForUploadInitializationPhase(
-        preparedUploadData.transactionKey,
-        preparedUploadData.userSignatureDataEncrypted,
-        preparedUploadData.dataDigest,
-        subscriberDetails.hostId,
-        nonce,
-        subscriberDetails.partnerId,
-        subscriberDetails.userId,
-        
DatatypeFactory.newInstance().newXMLGregorianCalendar(GregorianCalendar()),
-        subscriberDetails.bankAuthPub!!,
-        subscriberDetails.bankEncPub!!,
-        BigInteger.ONE,
-        ebics3OrderService
-    )
-    val doc = XMLUtil.convertJaxbToDocument(
-        req,
-        withSchemaLocation = "urn:org:ebics:H005 ebics_request_H005.xsd"
-    )
-    logger.debug("Created EBICS 3 document for upload initialization," +
-            " nonce: ${nonce.toHexString()}")
-    XMLUtil.signEbicsDocument(
-        doc,
-        subscriberDetails.customerAuthPriv,
-        withEbics3 = true
-    )
-    return XMLUtil.convertDomToString(doc)
-}
-
-/**
- * Create an EBICS request for the initialization phase of an upload EBICS 
transaction.
- *
- * The payload is only passed to generate the signature.
- */
-fun createEbicsRequestForUploadInitialization(
-    subscriberDetails: EbicsClientSubscriberDetails,
-    orderType: String,
-    orderParams: EbicsOrderParams,
-    preparedUploadData: PreparedUploadData
-): String {
-    val nonce = getNonce(128)
-    val req = EbicsRequest.createForUploadInitializationPhase(
-        preparedUploadData.transactionKey,
-        preparedUploadData.userSignatureDataEncrypted,
-        subscriberDetails.hostId,
-        nonce,
-        subscriberDetails.partnerId,
-        subscriberDetails.userId,
-        
DatatypeFactory.newInstance().newXMLGregorianCalendar(GregorianCalendar()),
-        subscriberDetails.bankAuthPub!!,
-        subscriberDetails.bankEncPub!!,
-        BigInteger.ONE,
-        orderType,
-        makeOrderParams(orderParams)
-    )
-    val doc = XMLUtil.convertJaxbToDocument(req)
-    logger.debug("Created EBICS $orderType document for upload 
initialization," +
-            " nonce: ${nonce.toHexString()}")
-    XMLUtil.signEbicsDocument(
-        doc,
-        subscriberDetails.customerAuthPriv
-    )
-    return XMLUtil.convertDomToString(doc)
-}
-
-// Generates a EBICS 2.5 signed document for the download init phase.
-fun createEbicsRequestForDownloadInitialization(
-    subscriberDetails: EbicsClientSubscriberDetails,
-    orderType: String,
-    orderParams: EbicsOrderParams
-): String {
-    val nonce = getNonce(128)
-    val req = EbicsRequest.createForDownloadInitializationPhase(
-        subscriberDetails.userId,
-        subscriberDetails.partnerId,
-        subscriberDetails.hostId,
-        nonce,
-        
DatatypeFactory.newInstance().newXMLGregorianCalendar(GregorianCalendar(
-            TimeZone.getTimeZone(ZoneId.systemDefault())
-        )),
-        subscriberDetails.bankEncPub ?: throw EbicsProtocolError(
-            HttpStatusCode.BadRequest,
-            "Invalid subscriber state 'bankEncPub' missing, please send HPB 
first"
-        ),
-        subscriberDetails.bankAuthPub ?: throw EbicsProtocolError(
-            HttpStatusCode.BadRequest,
-            "Invalid subscriber state 'bankAuthPub' missing, please send HPB 
first"
-        ),
-        orderType,
-        makeOrderParams(orderParams)
-    )
-    logger.debug("Created EBICS document for download initialization, nonce: 
${nonce.toHexString()}")
-    val doc = XMLUtil.convertJaxbToDocument(req)
-    XMLUtil.signEbicsDocument(
-        doc,
-        subscriberDetails.customerAuthPriv,
-        withEbics3 = false
-    )
-    return XMLUtil.convertDomToString(doc)
-}
-
-fun createEbicsRequestForDownloadTransferPhase(
-    subscriberDetails: EbicsClientSubscriberDetails,
-    transactionID: String?,
-    segmentNumber: Int,
-    numSegments: Int,
-    withEbics3: Boolean = false
-): String {
-    val doc = if (withEbics3) {
-        val req = Ebics3Request.createForDownloadTransferPhase(
-            subscriberDetails.hostId,
-            transactionID,
-            segmentNumber,
-            numSegments
-        )
-        XMLUtil.convertJaxbToDocument(req)
-    } else {
-        val req = EbicsRequest.createForDownloadTransferPhase(
-            subscriberDetails.hostId,
-            transactionID,
-            segmentNumber,
-            numSegments
-        )
-        XMLUtil.convertJaxbToDocument(req)
-    }
-    XMLUtil.signEbicsDocument(
-        doc,
-        subscriberDetails.customerAuthPriv,
-        withEbics3 = withEbics3
-    )
-    return XMLUtil.convertDomToString(doc)
-}
-
-fun createEbicsRequestForUploadTransferPhase(
-    subscriberDetails: EbicsClientSubscriberDetails,
-    transactionID: String?,
-    preparedUploadData: PreparedUploadData,
-    chunkIndex: Int,
-    withEbics3: Boolean = false
-): String {
-    val doc = if (withEbics3) {
-        val req = Ebics3Request.createForUploadTransferPhase(
-            subscriberDetails.hostId,
-            transactionID,
-            // chunks are 1-indexed
-            BigInteger.valueOf(chunkIndex.toLong() + 1),
-            preparedUploadData.encryptedPayloadChunks[chunkIndex]
-        )
-        XMLUtil.convertJaxbToDocument(req)
-    } else {
-        val req = EbicsRequest.createForUploadTransferPhase(
-            subscriberDetails.hostId,
-            transactionID,
-            // chunks are 1-indexed
-            BigInteger.valueOf(chunkIndex.toLong() + 1),
-            preparedUploadData.encryptedPayloadChunks[chunkIndex]
-        )
-        XMLUtil.convertJaxbToDocument(req)
-    }
-    XMLUtil.signEbicsDocument(doc, subscriberDetails.customerAuthPriv, 
withEbics3)
-    return XMLUtil.convertDomToString(doc)
-}
-
 data class DataEncryptionInfo(
     val transactionKey: ByteArray,
     val bankPubDigest: ByteArray
@@ -496,33 +292,6 @@ data class EbicsKeyManagementResponseContent(
     val orderData: ByteArray?
 )
 
-fun parseAndDecryptEbicsKeyManagementResponse(
-    subscriberDetails: EbicsClientSubscriberDetails,
-    responseStr: String
-): EbicsKeyManagementResponseContent {
-    val resp = try {
-        XMLUtil.convertStringToJaxb<EbicsKeyManagementResponse>(responseStr)
-    } catch (e: Exception) {
-        throw EbicsProtocolError(HttpStatusCode.InternalServerError, "Invalid 
XML received from bank")
-    }
-    val retCode = EbicsReturnCode.lookup(resp.value.header.mutable.returnCode)
-
-    val daeXml = resp.value.body.dataTransfer?.dataEncryptionInfo
-    val orderData = if (daeXml != null) {
-        val dae = DataEncryptionInfo(daeXml.transactionKey, 
daeXml.encryptionPubKeyDigest.value)
-        val encOrderData = resp.value.body.dataTransfer?.orderData?.value ?: 
throw EbicsProtocolError(
-            HttpStatusCode.InternalServerError, "Invalid XML/orderData 
received from bank"
-        )
-        decryptAndDecompressResponse(subscriberDetails, dae, 
listOf(encOrderData))
-    } else {
-        null
-    }
-
-    val bankReturnCodeStr = resp.value.body.returnCode.value
-    val bankReturnCode = EbicsReturnCode.lookup(bankReturnCodeStr)
-
-    return EbicsKeyManagementResponseContent(retCode, bankReturnCode, 
orderData)
-}
 
 class HpbResponseData(
     val hostID: String,
@@ -627,37 +396,6 @@ fun ebics25toInternalRepr(response: String): 
EbicsResponseContent {
         segmentNumber = resp.value.header.mutable.segmentNumber?.value?.toInt()
     )
 }
-fun parseAndValidateEbicsResponse(
-    subscriberDetails: EbicsClientSubscriberDetails,
-    responseStr: String,
-    withEbics3: Boolean = false
-): EbicsResponseContent {
-    val responseDocument = try {
-        XMLUtil.parseStringIntoDom(responseStr)
-    } catch (e: Exception) {
-        throw EbicsProtocolError(
-            HttpStatusCode.InternalServerError,
-            "Invalid XML (as EbicsResponse) received from bank"
-        )
-    }
-    if (!XMLUtil.verifyEbicsDocument(
-            responseDocument,
-            subscriberDetails.bankAuthPub ?: throw EbicsProtocolError(
-                HttpStatusCode.InternalServerError,
-                "Bank's signature verification failed"
-            ),
-            withEbics3 = withEbics3
-        )
-    ) {
-        throw EbicsProtocolError(
-            HttpStatusCode.InternalServerError,
-            "Bank's signature verification failed"
-        )
-    }
-    if (withEbics3)
-        return ebics3toInternalRepr(responseStr)
-    return ebics25toInternalRepr(responseStr)
-}
 
 /**
  * Get the private key that matches the given public key digest.
@@ -676,32 +414,6 @@ fun getDecryptionKey(subscriberDetails: 
EbicsClientSubscriberDetails, pubDigest:
     throw EbicsProtocolError(HttpStatusCode.NotFound, "Could not find 
customer's public key")
 }
 
-/**
- * Wrapper around the lower decryption routine, that takes a EBICS response
- * object containing a encrypted payload, and return the plain version of it
- * (including decompression).
- */
-fun decryptAndDecompressResponse(
-    subscriberDetails: EbicsClientSubscriberDetails,
-    encryptionInfo: DataEncryptionInfo,
-    chunks: List<String>
-): ByteArray {
-    val privateKey = getDecryptionKey(subscriberDetails, 
encryptionInfo.bankPubDigest)
-    val buf = StringBuilder()
-    chunks.forEach { buf.append(it) }
-    val decoded = Base64.getDecoder().decode(buf.toString())
-    val er = CryptoUtil.EncryptionResult(
-        encryptionInfo.transactionKey,
-        encryptionInfo.bankPubDigest,
-        decoded
-    )
-    val dataCompr = CryptoUtil.decryptEbicsE002(
-        er,
-        privateKey
-    )
-    return EbicsOrderUtil.decodeOrderData(dataCompr)
-}
-
 data class EbicsVersionSpec(
     val protocol: String,
     val version: String
@@ -709,75 +421,4 @@ data class EbicsVersionSpec(
 
 data class EbicsHevDetails(
     val versions: List<EbicsVersionSpec>
-)
-
-fun makeEbicsHEVRequest(subscriberDetails: EbicsClientSubscriberDetails): 
String {
-    val req = HEVRequest().apply {
-        hostId = subscriberDetails.hostId
-    }
-    val doc = XMLUtil.convertJaxbToDocument(req)
-    return XMLUtil.convertDomToString(doc)
-}
-
-fun makeEbicsHEVRequestRaw(hostID: String): String {
-    val h = hostID
-    val req = HEVRequest().apply {
-        hostId = h
-    }
-    val doc = XMLUtil.convertJaxbToDocument(req)
-    return XMLUtil.convertDomToString(doc)
-}
-
-fun parseEbicsHEVResponse(respStr: String): EbicsHevDetails {
-    val resp = try {
-        XMLUtil.convertStringToJaxb<HEVResponse>(respStr)
-    } catch (e: Exception) {
-        logger.error("Exception while parsing HEV response", e)
-        throw EbicsProtocolError(HttpStatusCode.InternalServerError, "Invalid 
HEV received from bank")
-    }
-    val versions = resp.value.versionNumber.map { versionNumber ->
-        EbicsVersionSpec(versionNumber.protocolVersion, versionNumber.value)
-    }
-    return EbicsHevDetails(versions)
-}
-
-fun makeEbicsIniRequest(subscriberDetails: EbicsClientSubscriberDetails): 
String {
-    val iniRequest = EbicsUnsecuredRequest.createIni(
-        subscriberDetails.hostId,
-        subscriberDetails.userId,
-        subscriberDetails.partnerId,
-        subscriberDetails.customerSignPriv
-    )
-    val doc = XMLUtil.convertJaxbToDocument(iniRequest)
-    return XMLUtil.convertDomToString(doc)
-}
-
-fun makeEbicsHiaRequest(subscriberDetails: EbicsClientSubscriberDetails): 
String {
-    val hiaRequest = EbicsUnsecuredRequest.createHia(
-        subscriberDetails.hostId,
-        subscriberDetails.userId,
-        subscriberDetails.partnerId,
-        subscriberDetails.customerAuthPriv,
-        subscriberDetails.customerEncPriv
-    )
-    val doc = XMLUtil.convertJaxbToDocument(hiaRequest)
-    return XMLUtil.convertDomToString(doc)
-}
-
-fun makeEbicsHpbRequest(subscriberDetails: EbicsClientSubscriberDetails): 
String {
-    val hpbRequest = EbicsNpkdRequest.createRequest(
-        subscriberDetails.hostId,
-        subscriberDetails.partnerId,
-        subscriberDetails.userId,
-        getNonce(128),
-        
DatatypeFactory.newInstance().newXMLGregorianCalendar(GregorianCalendar())
-    )
-    val doc = XMLUtil.convertJaxbToDocument(hpbRequest)
-    XMLUtil.signEbicsDocument(doc, subscriberDetails.customerAuthPriv)
-    return XMLUtil.convertDomToString(doc)
-}
-
-fun dumpEbicsSubscriber(ebicsHeader: EbicsUnsecuredRequest.StaticHeaderType): 
String {
-    return "userID: ${ebicsHeader.userID}, partnerID: 
${ebicsHeader.partnerID}, systemID: ${ebicsHeader.systemID}"
-
-}
\ No newline at end of file
+)
\ No newline at end of file
diff --git a/util/src/main/kotlin/Errors.kt b/util/src/main/kotlin/Errors.kt
deleted file mode 100644
index 3ca3cf2c..00000000
--- a/util/src/main/kotlin/Errors.kt
+++ /dev/null
@@ -1,45 +0,0 @@
-import kotlin.system.exitProcess
-import org.slf4j.Logger
-import org.slf4j.LoggerFactory
-
-/*
- * This file is part of LibEuFin.
- * Copyright (C) 2019 Stanisci and Dold.
-
- * LibEuFin is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation; either version 3, or
- * (at your option) any later version.
-
- * LibEuFin is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Affero General
- * Public License for more details.
-
- * You should have received a copy of the GNU Affero General Public
- * License along with LibEuFin; see the file COPYING.  If not, see
- * <http://www.gnu.org/licenses/>
- */
-
-val logger: Logger = LoggerFactory.getLogger("tech.libeufin.util")
-/**
- * Helper function that wraps throwable code and
- * (1) prints the error message and (2) terminates
- * the current process, should one exception occur.
- *
- * Note: should be called when it is REALLY required
- * to stop the process when the exception cannot be
- * handled.  Notably, when the database cannot be reached.
- */
-fun execThrowableOrTerminate(func: () -> Unit) {
-    try {
-        func()
-    } catch (e: Exception) {
-        println(e.message)
-        exitProcess(1)
-    }
-}
-
-fun printLnErr(errorMessage: String) {
-    System.err.println(errorMessage)
-}
\ No newline at end of file
diff --git a/util/src/main/kotlin/HTTP.kt b/util/src/main/kotlin/HTTP.kt
index b1e0fc02..8c639496 100644
--- a/util/src/main/kotlin/HTTP.kt
+++ b/util/src/main/kotlin/HTTP.kt
@@ -4,7 +4,6 @@ import io.ktor.http.*
 import io.ktor.server.application.*
 import io.ktor.server.request.*
 import io.ktor.server.util.*
-import logger
 
 // Get the base URL of a request, returns null if any problem occurs.
 fun ApplicationRequest.getBaseUrl(): String? {
@@ -85,15 +84,4 @@ fun getAuthorizationDetails(authorizationHeader: String): 
AuthorizationDetails?
         return null
     }
     return AuthorizationDetails(scheme = split[0], content = split[1])
-}
-
-// Gets a long from the URI param named 'uriParamName',
-// or null if that is not found.
-fun ApplicationCall.maybeLong(uriParamName: String): Long? {
-    val maybeParam = this.parameters[uriParamName] ?: return null
-    return try { maybeParam.toLong() }
-    catch (e: Exception) {
-        logger.error("Could not convert '$uriParamName' to Long")
-        return null
-    }
 }
\ No newline at end of file
diff --git a/util/src/main/kotlin/IbanPayto.kt 
b/util/src/main/kotlin/IbanPayto.kt
index bd1ab3b4..07d331c9 100644
--- a/util/src/main/kotlin/IbanPayto.kt
+++ b/util/src/main/kotlin/IbanPayto.kt
@@ -1,9 +1,7 @@
 package tech.libeufin.util
 
-import logger
 import java.net.URI
 import java.net.URLDecoder
-import java.net.URLEncoder
 
 // Payto information.
 data class IbanPayto(
@@ -80,30 +78,4 @@ fun parsePayto(payto: String): IbanPayto? {
         message = getQueryParamOrNull("message", params),
         receiverName = getQueryParamOrNull("receiver-name", params)
     )
-}
-
-fun buildIbanPaytoUri(
-    iban: String,
-    bic: String,
-    receiverName: String,
-    message: String? = null
-): String {
-    val nameUrlEnc = URLEncoder.encode(receiverName, "utf-8")
-    val ret = "payto://iban/$bic/$iban?receiver-name=$nameUrlEnc"
-    if (message != null) {
-        val messageUrlEnc = URLEncoder.encode(message, "utf-8")
-        return "$ret&message=$messageUrlEnc"
-    }
-    return ret
-}
-
-/**
- * Strip a payto://iban URI of everything except the IBAN.
- * Return null on an invalid URI, letting the caller decide
- * how to handle the problem.
- */
-fun stripIbanPayto(paytoUri: String): String? {
-    val parsedPayto = parsePayto(paytoUri) ?: return null
-    val canonIban = parsedPayto.iban.uppercase()
-    return "payto://iban/${canonIban}"
 }
\ No newline at end of file
diff --git a/util/src/main/kotlin/JSON.kt b/util/src/main/kotlin/JSON.kt
deleted file mode 100644
index 03c25dde..00000000
--- a/util/src/main/kotlin/JSON.kt
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * This file is part of LibEuFin.
- * Copyright (C) 2020 Taler Systems S.A.
- *
- * LibEuFin is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation; either version 3, or
- * (at your option) any later version.
- *
- * LibEuFin is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Affero General
- * Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public
- * License along with LibEuFin; see the file COPYING.  If not, see
- * <http://www.gnu.org/licenses/>
- */
-
-package tech.libeufin.util
-
-enum class XLibeufinBankDirection(val direction: String) {
-    DEBIT("debit"),
-    CREDIT("credit");
-    fun exportAsCamtDirection(): String =
-        when(this) {
-            CREDIT -> "CRDT"
-            DEBIT -> "DBIT"
-        }
-}
-
-data class XLibeufinBankPaytoReq(
-    /**
-     * This Payto address MUST contain the wire transfer
-     * subject among its query parameters -- 'message' parameter.
-     */
-    val paytoUri: String,
-    // $currency:X.Y format
-    val amount: String?,
-    /**
-     * This value MAY be specified by the payment submitter to
-     * help reconcile the payment when they later download new
-     * transactions.  The name is only borrowed from CaMt terminology.
-     */
-    val pmtInfId: String?
-)
-data class XLibeufinBankTransaction(
-    val creditorIban: String,
-    val creditorBic: String?,
-    val creditorName: String,
-    val debtorIban: String,
-    val debtorBic: String?,
-    val debtorName: String,
-    val amount: String,
-    val currency: String,
-    val subject: String,
-    // Milliseconds since the Epoch.
-    val date: String,
-    val uid: String,
-    val direction: XLibeufinBankDirection,
-    /**
-     * The following two values are rather CAMT/PAIN
-     * specific, therefore do not need to be returned
-     * along every API call using this object.
-     */
-    val pmtInfId: String? = null,
-    val msgId: String? = null,
-    val endToEndId: String? = null
-)
-data class IncomingPaymentInfo(
-    val debtorIban: String,
-    val debtorBic: String?,
-    val debtorName: String,
-    /**
-     * A stringified number, no currency required.  This
-     * one will be extracted from the demobank configuration.
-     */
-    val amount: String,
-    val subject: String
-)
-
-data class TWGAdminAddIncoming(
-    val amount: String,
-    val reserve_pub: String,
-    val debit_account: String
-)
-
-data class PaymentInfo(
-    val accountLabel: String,
-    val creditorIban: String,
-    val creditorBic: String?,
-    val creditorName: String,
-    val debtorIban: String,
-    val debtorBic: String?,
-    val debtorName: String,
-    val amount: String,
-    val currency: String,
-    val subject: String,
-    val date: String? = null,
-    val creditDebitIndicator: String,
-    val accountServicerReference: String,
-    val paymentInformationId: String?,
-)
\ No newline at end of file
diff --git a/util/src/main/kotlin/TalerConfig.kt 
b/util/src/main/kotlin/TalerConfig.kt
index 684a8a1b..5e29e3a1 100644
--- a/util/src/main/kotlin/TalerConfig.kt
+++ b/util/src/main/kotlin/TalerConfig.kt
@@ -17,6 +17,7 @@
  * <http://www.gnu.org/licenses/>
  */
 
+import tech.libeufin.util.logger
 import java.io.File
 import java.nio.file.Paths
 import kotlin.io.path.Path
diff --git a/util/src/main/kotlin/UnixDomainSocket.kt 
b/util/src/main/kotlin/UnixDomainSocket.kt
index eaf187eb..5207081c 100644
--- a/util/src/main/kotlin/UnixDomainSocket.kt
+++ b/util/src/main/kotlin/UnixDomainSocket.kt
@@ -9,29 +9,19 @@ import io.ktor.server.engine.*
 import io.ktor.server.testing.*
 import io.ktor.utils.io.pool.*
 import io.netty.bootstrap.ServerBootstrap
-import io.netty.buffer.ByteBuf
 import io.netty.buffer.ByteBufInputStream
 import io.netty.buffer.Unpooled
-import io.netty.buffer.UnpooledDirectByteBuf
 import io.netty.channel.*
 import io.netty.channel.epoll.EpollEventLoopGroup
 import io.netty.channel.epoll.EpollServerDomainSocketChannel
 import io.netty.channel.unix.DomainSocketAddress
-import io.netty.handler.codec.LengthFieldPrepender
 import io.netty.handler.codec.http.*
 import io.netty.handler.codec.http.DefaultHttpResponse
-import io.netty.handler.codec.http.HttpMessage
-import io.netty.handler.logging.LogLevel
 import io.netty.handler.logging.LoggingHandler
-import io.netty.handler.stream.ChunkedInput
 import io.netty.handler.stream.ChunkedStream
 import io.netty.handler.stream.ChunkedWriteHandler
-import io.netty.util.AttributeKey
-import io.netty.util.ReferenceCountUtil
-import org.slf4j.LoggerFactory
+import tech.libeufin.util.logger
 import java.io.ByteArrayInputStream
-import java.io.InputStream
-import java.nio.charset.Charset
 
 fun startServer(
     unixSocketPath: String,
diff --git a/util/src/main/kotlin/XMLUtil.kt b/util/src/main/kotlin/XMLUtil.kt
index 97c56180..85e1ce14 100644
--- a/util/src/main/kotlin/XMLUtil.kt
+++ b/util/src/main/kotlin/XMLUtil.kt
@@ -21,8 +21,6 @@ package tech.libeufin.util
 
 import com.sun.xml.bind.marshaller.NamespacePrefixMapper
 import io.ktor.http.*
-import org.slf4j.Logger
-import org.slf4j.LoggerFactory
 import org.w3c.dom.Document
 import org.w3c.dom.Node
 import org.w3c.dom.NodeList
@@ -61,7 +59,6 @@ import javax.xml.validation.Validator
 import javax.xml.xpath.XPath
 import javax.xml.xpath.XPathConstants
 import javax.xml.xpath.XPathFactory
-import logger
 
 class DefaultNamespaces : NamespacePrefixMapper() {
     override fun getPreferredPrefix(namespaceUri: String?, suggestion: 
String?, requirePrefix: Boolean): String? {
diff --git a/util/src/main/kotlin/amounts.kt b/util/src/main/kotlin/amounts.kt
deleted file mode 100644
index 3f145caa..00000000
--- a/util/src/main/kotlin/amounts.kt
+++ /dev/null
@@ -1,33 +0,0 @@
-package tech.libeufin.util
-
-import java.math.BigDecimal
-import java.math.RoundingMode
-
-/*
- * This file is part of LibEuFin.
- * Copyright (C) 2021 Taler Systems S.A.
- *
- * LibEuFin is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation; either version 3, or
- * (at your option) any later version.
- *
- * LibEuFin is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Affero General
- * Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public
- * License along with LibEuFin; see the file COPYING.  If not, see
- * <http://www.gnu.org/licenses/>
- */
-
-const val plainAmountRe = "^([0-9]+(\\.[0-9][0-9]?)?)$"
-const val plainAmountReWithSign = "^-?([0-9]+(\\.[0-9][0-9]?)?)$"
-const val amountWithCurrencyRe = "^([A-Z]+):([0-9]+(\\.[0-9][0-9]?)?)$"
-
-fun BigDecimal.roundToTwoDigits(): BigDecimal {
-    // val twoDigitsRounding = MathContext(2)
-    // return this.round(twoDigitsRounding)
-    return this.setScale(2, RoundingMode.HALF_UP)
-}
\ No newline at end of file
diff --git a/util/src/main/kotlin/exec.kt b/util/src/main/kotlin/exec.kt
deleted file mode 100644
index e4cfd1df..00000000
--- a/util/src/main/kotlin/exec.kt
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * This file is part of LibEuFin.
- * Copyright (C) 2019 Stanisci and Dold.
-
- * LibEuFin is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation; either version 3, or
- * (at your option) any later version.
-
- * LibEuFin is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
- * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Affero General
- * Public License for more details.
-
- * You should have received a copy of the GNU Affero General Public
- * License along with LibEuFin; see the file COPYING.  If not, see
- * <http://www.gnu.org/licenses/>
- */
-
-package tech.libeufin.util
-
-/**
- * Wrapper around the ProcessBuilder API.  It executes a
- * command and (by default) throws exception if the result is not zero.
- * It returns the exit code.
- */
-fun execCommand(cmd: List<String>, throwIfFails: Boolean = true): Int {
-    val result: Int = ProcessBuilder(cmd)
-        .redirectOutput(ProcessBuilder.Redirect.INHERIT)
-        .redirectError(ProcessBuilder.Redirect.INHERIT)
-        .start()
-        .waitFor()
-    if (result != 0 && throwIfFails)
-        throw Exception("Command '$cmd' failed.")
-    return result
-}
\ No newline at end of file
diff --git a/util/src/main/kotlin/iban.kt b/util/src/main/kotlin/iban.kt
index 76e2fcc5..5306915a 100644
--- a/util/src/main/kotlin/iban.kt
+++ b/util/src/main/kotlin/iban.kt
@@ -1,7 +1,5 @@
 package tech.libeufin.util
 
-import java.math.BigInteger
-
 fun getIban(): String {
     val ccNoCheck = "131400" // DE00
     val bban = (0..10).map {
@@ -12,4 +10,18 @@ fun getIban(): String {
         checkDigits = "0${checkDigits}"
     }
     return "DE$checkDigits$bban"
+}
+
+// Taken from the ISO20022 XSD schema
+private val bicRegex = Regex("^[A-Z]{6}[A-Z2-9][A-NP-Z0-9]([A-Z0-9]{3})?$")
+
+fun validateBic(bic: String): Boolean {
+    return bicRegex.matches(bic)
+}
+
+// Taken from the ISO20022 XSD schema
+private val ibanRegex = Regex("^[A-Z]{2}[0-9]{2}[a-zA-Z0-9]{1,30}$")
+
+fun validateIban(iban: String): Boolean {
+    return ibanRegex.matches(iban)
 }
\ No newline at end of file
diff --git a/util/src/main/kotlin/startServer.kt 
b/util/src/main/kotlin/startServer.kt
index 3d6e9a15..06b1ee03 100644
--- a/util/src/main/kotlin/startServer.kt
+++ b/util/src/main/kotlin/startServer.kt
@@ -4,8 +4,6 @@ import io.ktor.server.application.*
 import io.ktor.server.engine.*
 import io.ktor.server.netty.*
 import io.netty.channel.unix.Errors
-import logger
-import java.net.BindException
 import kotlin.system.exitProcess
 
 const val EAFNOSUPPORT = -97 // Netty defines errors negatively.
diff --git a/util/src/main/kotlin/strings.kt b/util/src/main/kotlin/strings.kt
index 2fd858f9..43002151 100644
--- a/util/src/main/kotlin/strings.kt
+++ b/util/src/main/kotlin/strings.kt
@@ -19,7 +19,6 @@
 
 package tech.libeufin.util
 
-import logger
 import net.taler.wallet.crypto.Base32Crockford
 import java.math.BigInteger
 import java.util.*
@@ -75,88 +74,15 @@ fun BigInteger.toUnsignedHexString(): String {
     return bytes.toHexString()
 }
 
-/**
- * Inserts spaces every 2 characters, and a newline after 8 pairs.
- */
-fun chunkString(input: String): String {
-    val ret = StringBuilder()
-    var columns = 0
-    for (i in input.indices) {
-        if ((i + 1).rem(2) == 0) {
-            if (columns == 15) {
-                ret.append(input[i] + "\n")
-                columns = 0
-                continue
-            }
-            ret.append(input[i] + " ")
-            columns++
-            continue
-        }
-        ret.append(input[i])
-    }
-    return ret.toString().uppercase()
-}
-
-data class AmountWithCurrency(
-    val currency: String,
-    val amount: String
-)
-
-fun getRandomString(length: Int): String {
-    val allowedChars = ('A' .. 'Z') + ('0' .. '9')
-    return (1 .. length)
-        .map { allowedChars.random() }
-        .joinToString("")
-}
-
-// Taken from the ISO20022 XSD schema
-private val bicRegex = Regex("^[A-Z]{6}[A-Z2-9][A-NP-Z0-9]([A-Z0-9]{3})?$")
-
-fun validateBic(bic: String): Boolean {
-    return bicRegex.matches(bic)
-}
-
-// Taken from the ISO20022 XSD schema
-private val ibanRegex = Regex("^[A-Z]{2}[0-9]{2}[a-zA-Z0-9]{1,30}$")
-
-fun validateIban(iban: String): Boolean {
-    return ibanRegex.matches(iban)
-}
-
-fun isValidResourceName(name: String): Boolean {
-    return name.matches(Regex("[a-z]([-a-z0-9]*[a-z0-9])?"))
-}
-
-// Sanity-check user's credentials.
-fun sanityCheckCredentials(credentials: Pair<String, String>): Boolean {
-    val allowedChars = Regex("^[a-zA-Z0-9]+$")
-    if (!allowedChars.matches(credentials.first)) return false
-    if (!allowedChars.matches(credentials.second)) return false
-    return true
-}
-
-/**
- * Parses string into java.util.UUID format or throws 400 Bad Request.
- * The output is usually consumed in database queries.
- */
-fun parseUuid(maybeUuid: String): UUID? {
-    val uuid = try {
-        UUID.fromString(maybeUuid)
-    } catch (e: Exception) {
-        logger.error("'$maybeUuid' is an invalid UUID.")
-        return null
+fun getQueryParam(uriQueryString: String, param: String): String? {
+    uriQueryString.split('&').forEach {
+        val kv = it.split('=')
+        if (kv[0] == param)
+            return kv[1]
     }
-    return uuid
-}
-
-fun hasWopidPlaceholder(captchaUrl: String): Boolean {
-    if (captchaUrl.contains("{wopid}", ignoreCase = true))
-        return true
-    return false
+    return null
 }
 
-// Tries to extract a valid reserve public key from the raw subject line
-// or returns null if the input is invalid.
 fun extractReservePubFromSubject(rawSubject: String): String? {
     val re = "\\b[a-z0-9A-Z]{52}\\b".toRegex()
     val result = re.find(rawSubject.replace("[\n]+".toRegex(), "")) ?: return 
null
@@ -169,11 +95,3 @@ fun extractReservePubFromSubject(rawSubject: String): 
String? {
     return result.value.uppercase()
 }
 
-fun getQueryParam(uriQueryString: String, param: String): String? {
-    uriQueryString.split('&').forEach {
-        val kv = it.split('=')
-        if (kv[0] == param)
-            return kv[1]
-    }
-    return null
-}

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]