diff options
author | Marcello Stanisci <stanisci.m@gmail.com> | 2020-03-10 18:15:04 +0100 |
---|---|---|
committer | Marcello Stanisci <stanisci.m@gmail.com> | 2020-03-10 18:15:04 +0100 |
commit | 85a141fba1038430ac7bf23367a56595731740a6 (patch) | |
tree | 6abceb1e3fc757d06a24bc90a0d9826512a8e728 /util | |
parent | 70b95e9aee7d84d835cc25dd512a24d16604f63b (diff) | |
download | libeufin-85a141fba1038430ac7bf23367a56595731740a6.tar.gz libeufin-85a141fba1038430ac7bf23367a56595731740a6.tar.bz2 libeufin-85a141fba1038430ac7bf23367a56595731740a6.zip |
debugging
Diffstat (limited to 'util')
-rw-r--r-- | util/src/main/kotlin/Ebics.kt | 33 |
1 files changed, 16 insertions, 17 deletions
diff --git a/util/src/main/kotlin/Ebics.kt b/util/src/main/kotlin/Ebics.kt index 48694654..690a1225 100644 --- a/util/src/main/kotlin/Ebics.kt +++ b/util/src/main/kotlin/Ebics.kt @@ -24,6 +24,7 @@ package tech.libeufin.util +import io.ktor.http.HttpStatusCode import tech.libeufin.util.ebics_h004.* import tech.libeufin.util.ebics_hev.HEVRequest import tech.libeufin.util.ebics_hev.HEVResponse @@ -37,11 +38,7 @@ import java.util.* import java.util.zip.DeflaterInputStream import javax.xml.datatype.DatatypeFactory -class InvalidSubscriberStateError : Exception("Invalid EBICS subscriber state") -class InvalidXmlError : Exception("Invalid EBICS XML") -class BadSignatureError : Exception("Invalid EBICS XML Signature") -class EbicsUnknownReturnCodeError(msg: String) : Exception(msg) - +data class UtilError(val statusCode: HttpStatusCode, val reason: String) : Exception() data class EbicsDateRange(val start: LocalDate, val end: LocalDate) sealed class EbicsOrderParams @@ -240,8 +237,8 @@ fun createEbicsRequestForDownloadInitialization( subscriberDetails.hostId, getNonce(128), DatatypeFactory.newInstance().newXMLGregorianCalendar(GregorianCalendar()), - subscriberDetails.bankEncPub ?: throw InvalidSubscriberStateError(), - subscriberDetails.bankAuthPub ?: throw InvalidSubscriberStateError(), + subscriberDetails.bankEncPub ?: throw UtilError(HttpStatusCode.BadRequest, "Invalid subscriber state 'bankEncPub' missing, please send HPB first"), + subscriberDetails.bankAuthPub ?: throw UtilError(HttpStatusCode.BadRequest, "Invalid subscriber state 'bankAuthPub' missing, please send HPB first"), orderType, makeOrderParams(orderParams) ) @@ -308,7 +305,7 @@ enum class EbicsReturnCode(val errorCode: String) { return x; } } - throw EbicsUnknownReturnCodeError("Unknown return code: $errorCode") + throw UtilError(HttpStatusCode.InternalServerError, "Unknown EBICS status code: $errorCode") } } } @@ -334,14 +331,16 @@ fun parseAndDecryptEbicsKeyManagementResponse( val resp = try { XMLUtil.convertStringToJaxb<EbicsKeyManagementResponse>(responseStr) } catch (e: Exception) { - throw InvalidXmlError() + throw UtilError(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 InvalidXmlError() + val encOrderData = resp.value.body.dataTransfer?.orderData?.value ?: throw UtilError( + HttpStatusCode.InternalServerError, "Invalid XML/orderData received from bank" + ) decryptAndDecompressResponse(subscriberDetails, dae, listOf(encOrderData)) } else { null @@ -365,7 +364,7 @@ fun parseEbicsHpbOrder(orderDataRaw: ByteArray): HpbResponseData { val resp = try { XMLUtil.convertStringToJaxb<HPBResponseOrderData>(orderDataRaw.toString(Charsets.UTF_8)) } catch (e: Exception) { - throw InvalidXmlError() + throw UtilError(HttpStatusCode.InternalServerError, "Invalid XML (as HPB response) received from bank") } val encPubKey = CryptoUtil.loadRsaPublicKeyFromComponents( resp.value.encryptionPubKeyInfo.pubKeyValue.rsaKeyValue.modulus, @@ -391,20 +390,20 @@ fun parseAndValidateEbicsResponse( val responseDocument = try { XMLUtil.parseStringIntoDom(responseStr) } catch (e: Exception) { - throw InvalidXmlError() + throw UtilError(HttpStatusCode.InternalServerError, "Invalid XML (as EbicsResponse) received from bank") } if (!XMLUtil.verifyEbicsDocument( responseDocument, - subscriberDetails.bankAuthPub ?: throw InvalidSubscriberStateError() + subscriberDetails.bankAuthPub ?: throw UtilError(HttpStatusCode.BadRequest, "Invalid subscriber state: bankAuthPub missing, please send HPB first") ) ) { - throw BadSignatureError() + throw UtilError(HttpStatusCode.InternalServerError, "Bank's signature validation failed") } val resp = try { XMLUtil.convertStringToJaxb<EbicsResponse>(responseStr) } catch (e: Exception) { - throw InvalidXmlError() + throw UtilError(HttpStatusCode.InternalServerError, "Could not transform string-response from bank into JAXB") } val bankReturnCodeStr = resp.value.body.returnCode.value @@ -443,7 +442,7 @@ fun getDecryptionKey(subscriberDetails: EbicsClientSubscriberDetails, pubDigest: if (pubDigest.contentEquals(encPubDigest)) { return subscriberDetails.customerEncPriv } - throw Exception("no matching private key to decrypt response") + throw UtilError(HttpStatusCode.NotFound,"Could not find customer's public key") } /** @@ -494,7 +493,7 @@ fun parseEbicsHEVResponse(respStr: String): EbicsHevDetails { XMLUtil.convertStringToJaxb<HEVResponse>(respStr) } catch (e: Exception) { logger.error("Exception while parsing HEV response", e) - throw InvalidXmlError() + throw UtilError(HttpStatusCode.InternalServerError, "Invalid HEV received from bank") } val versions = resp.value.versionNumber.map { versionNumber -> EbicsVersionSpec(versionNumber.protocolVersion, versionNumber.value) |