[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[libeufin] 02/02: project structure
From: |
gnunet |
Subject: |
[libeufin] 02/02: project structure |
Date: |
Fri, 01 Nov 2019 11:17:27 +0100 |
This is an automated email from the git hooks/post-receive script.
dold pushed a commit to branch master
in repository libeufin.
commit 9f464050533f7806829f4c291daf780dcb04d199
Author: Florian Dold <address@hidden>
AuthorDate: Fri Nov 1 11:17:18 2019 +0100
project structure
---
.idea/gradle.xml | 3 +-
.idea/inspectionProfiles/Project_Default.xml | 8 ---
.idea/kotlinc.xml | 6 +++
.idea/misc.xml | 2 +-
.idea/modules/libeufin.iml | 9 ----
gradle.properties | 1 -
gradle/wrapper/gradle-wrapper.properties | 5 +-
nexus/build.gradle | 12 ++---
{resources => nexus/src/resources}/logback.xml | 0
sandbox/build.gradle | 10 ++--
sandbox/src/main/kotlin/DB.kt | 5 ++
sandbox/src/main/kotlin/Main.kt | 59 ++++++++++++++++++----
.../libeufin/schema/ebics_h004/EbicsMessages.kt | 42 +++++++++++++++
{resources => sandbox/src/resources}/logback.xml | 0
sandbox/src/test/kotlin/EbicsMessagesTest.kt | 24 +++++----
15 files changed, 133 insertions(+), 53 deletions(-)
diff --git a/.idea/gradle.xml b/.idea/gradle.xml
index b8ed810..70bf921 100644
--- a/.idea/gradle.xml
+++ b/.idea/gradle.xml
@@ -9,7 +9,7 @@
<option name="distributionType" value="DEFAULT_WRAPPED" />
<option name="externalProjectPath" value="$PROJECT_DIR$" />
<option name="gradleHome" value="/usr/share/java/gradle" />
- <option name="gradleJvm" value="#JAVA_INTERNAL" />
+ <option name="gradleJvm" value="11" />
<option name="modules">
<set>
<option value="$PROJECT_DIR$" />
@@ -17,6 +17,7 @@
<option value="$PROJECT_DIR$/sandbox" />
</set>
</option>
+ <option name="useAutoImport" value="true" />
<option name="useQualifiedModuleNames" value="true" />
</GradleProjectSettings>
</option>
diff --git a/.idea/inspectionProfiles/Project_Default.xml
b/.idea/inspectionProfiles/Project_Default.xml
deleted file mode 100644
index dcb5f6b..0000000
--- a/.idea/inspectionProfiles/Project_Default.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<component name="InspectionProjectProfileManager">
- <profile version="1.0">
- <option name="myName" value="Project Default" />
- <inspection_tool class="PropertyName" enabled="true" level="WEAK WARNING"
enabled_by_default="true">
- <option name="namePattern" value="_?[a-z][A-Za-z\d]*" />
- </inspection_tool>
- </profile>
-</component>
\ No newline at end of file
diff --git a/.idea/kotlinc.xml b/.idea/kotlinc.xml
new file mode 100644
index 0000000..9b02d59
--- /dev/null
+++ b/.idea/kotlinc.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+ <component name="Kotlin2JvmCompilerArguments">
+ <option name="jvmTarget" value="11" />
+ </component>
+</project>
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
index 4663731..25d34a4 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
- <component name="ProjectRootManager" version="2" languageLevel="JDK_11"
default="false" project-jdk-name="11" project-jdk-type="JavaSDK" />
+ <component name="ProjectRootManager" version="2" languageLevel="JDK_11"
project-jdk-name="11" project-jdk-type="JavaSDK" />
</project>
\ No newline at end of file
diff --git a/.idea/modules/libeufin.iml b/.idea/modules/libeufin.iml
deleted file mode 100644
index 7e86d2c..0000000
--- a/.idea/modules/libeufin.iml
+++ /dev/null
@@ -1,9 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<module type="JAVA_MODULE" version="4">
- <component name="NewModuleRootManager" inherit-compiler-output="true">
- <exclude-output />
- <content url="file://$MODULE_DIR$/../.." />
- <orderEntry type="inheritedJdk" />
- <orderEntry type="sourceFolder" forTests="false" />
- </component>
-</module>
\ No newline at end of file
diff --git a/gradle.properties b/gradle.properties
index 2381768..7fc6f1f 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -1,2 +1 @@
kotlin.code.style=official
-kotlin.incremental=false
diff --git a/gradle/wrapper/gradle-wrapper.properties
b/gradle/wrapper/gradle-wrapper.properties
index f04d6a2..eaa2cf0 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,5 +1,6 @@
+#Fri Nov 01 10:46:40 CET 2019
+distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.3-all.zip
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.3-bin.zip
-zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
diff --git a/nexus/build.gradle b/nexus/build.gradle
index 349561c..be00062 100644
--- a/nexus/build.gradle
+++ b/nexus/build.gradle
@@ -4,20 +4,19 @@ plugins {
id 'application'
}
-
-version '1.0-snapshot'
-sourceCompatibility = 1.8
-targetCompatibility = 1.8
+sourceCompatibility = '11'
+targetCompatibility = '11'
+version = '0.0.1'
compileKotlin {
kotlinOptions {
- jvmTarget = "1.8"
+ jvmTarget = '11'
}
}
compileTestKotlin {
kotlinOptions {
- jvmTarget = "1.8"
+ jvmTarget = '11'
}
}
@@ -34,7 +33,6 @@ dependencies {
compile "javax.activation:activation:1.1"
compile "org.glassfish.jaxb:jaxb-runtime:2.3.1"
testCompile group: 'junit', name: 'junit', version: '4.12'
- runtime rootProject.files("resources")
}
application {
diff --git a/resources/logback.xml b/nexus/src/resources/logback.xml
similarity index 100%
copy from resources/logback.xml
copy to nexus/src/resources/logback.xml
diff --git a/sandbox/build.gradle b/sandbox/build.gradle
index 04cb301..59b4a65 100644
--- a/sandbox/build.gradle
+++ b/sandbox/build.gradle
@@ -4,19 +4,20 @@ plugins {
id 'application'
}
+
+sourceCompatibility = "11"
+targetCompatibility = "11"
version '1.0-snapshot'
-sourceCompatibility = 1.8
-targetCompatibility = 1.8
compileKotlin {
kotlinOptions {
- jvmTarget = "1.8"
+ jvmTarget = "11"
}
}
compileTestKotlin {
kotlinOptions {
- jvmTarget = "1.8"
+ jvmTarget = "11"
}
}
@@ -40,7 +41,6 @@ dependencies {
testImplementation 'org.jetbrains.kotlin:kotlin-test-junit:1.3.50'
testImplementation 'org.jetbrains.kotlin:kotlin-test:1.3.50'
compile 'org.apache.santuario:xmlsec:2.1.4'
- runtime rootProject.files("resources")
}
application {
diff --git a/sandbox/src/main/kotlin/DB.kt b/sandbox/src/main/kotlin/DB.kt
index ca95151..e869a58 100644
--- a/sandbox/src/main/kotlin/DB.kt
+++ b/sandbox/src/main/kotlin/DB.kt
@@ -22,6 +22,7 @@ package tech.libeufin.sandbox.db
import org.jetbrains.exposed.dao.*
import org.jetbrains.exposed.sql.*
import org.jetbrains.exposed.sql.transactions.transaction
+import java.sql.Blob
const val CUSTOMER_NAME_MAX_LENGTH = 20
const val EBICS_HOST_ID_MAX_LENGTH = 10
@@ -81,6 +82,10 @@ enum class KeyState {
RELEASED
}
+fun Blob.toByteArray(): ByteArray {
+ return this.binaryStream.readAllBytes()
+}
+
/**
* This table information *not* related to EBICS, for all
* its customers.
diff --git a/sandbox/src/main/kotlin/Main.kt b/sandbox/src/main/kotlin/Main.kt
index 6b94078..345593c 100644
--- a/sandbox/src/main/kotlin/Main.kt
+++ b/sandbox/src/main/kotlin/Main.kt
@@ -46,6 +46,7 @@ import org.slf4j.LoggerFactory
import org.w3c.dom.Document
import tech.libeufin.sandbox.db.*
import tech.libeufin.schema.ebics_h004.EbicsKeyManagementResponse
+import tech.libeufin.schema.ebics_h004.EbicsNoPubKeyDigestsRequest
import tech.libeufin.schema.ebics_h004.EbicsUnsecuredRequest
import tech.libeufin.schema.ebics_h004.HIARequestOrderDataType
import tech.libeufin.schema.ebics_hev.HEVResponse
@@ -68,8 +69,8 @@ private suspend fun ApplicationCall.respondEbicsKeyManagement(
errorText: String,
errorCode: String,
statusCode: HttpStatusCode,
- orderId: String? = null,
- bankReturnCode: String? = null
+ bankReturnCode: String,
+ orderId: String? = null
) {
val responseXml = EbicsKeyManagementResponse().apply {
version = "H004"
@@ -85,11 +86,9 @@ private suspend fun
ApplicationCall.respondEbicsKeyManagement(
_static = EbicsKeyManagementResponse.Header.EmptyStaticHeader()
}
body = EbicsKeyManagementResponse.Body().apply {
- if (bankReturnCode != null) {
- this.returnCode =
EbicsKeyManagementResponse.Body.ReturnCode().apply {
- this.authenticate = true
- this.value = bankReturnCode
- }
+ this.returnCode =
EbicsKeyManagementResponse.Body.ReturnCode().apply {
+ this.authenticate = true
+ this.value = bankReturnCode
}
}
}
@@ -100,7 +99,7 @@ private suspend fun
ApplicationCall.respondEbicsKeyManagement(
private suspend fun ApplicationCall.respondEbicsInvalidXml() {
- respondEbicsKeyManagement("[EBICS_INVALID_XML]", "091010",
HttpStatusCode.BadRequest)
+ respondEbicsKeyManagement("[EBICS_INVALID_XML]", "091010",
HttpStatusCode.BadRequest, "000000")
}
@@ -118,6 +117,12 @@ fun findEbicsSubscriber(partnerID: String, userID: String,
systemID: String?): E
}.firstOrNull()
}
+data class SubscriberKeys(
+ val authenticationPublicKey: RSAPublicKey,
+ val encryptionPublicKey: RSAPublicKey,
+ val signaturePublicKey: RSAPublicKey
+)
+
private suspend fun ApplicationCall.ebicsweb() {
val body: String = receiveText()
logger.debug("Data received: $body")
@@ -148,7 +153,7 @@ private suspend fun ApplicationCall.ebicsweb() {
if (ebicsHost == null) {
logger.warn("client requested unknown HostID")
- respondEbicsKeyManagement("[EBICS_INVALID_HOST_ID]", "091011",
HttpStatusCode.NotFound)
+ respondEbicsKeyManagement("[EBICS_INVALID_HOST_ID]", "091011",
HttpStatusCode.NotFound, "000000")
return
}
@@ -294,7 +299,8 @@ private suspend fun ApplicationCall.ebicsweb() {
ebicsSubscriber.state = SubscriberState.INITIALIZED
}
}
- respondEbicsKeyManagement("[EBICS_OK]", "000000",
HttpStatusCode.OK)
+ respondEbicsKeyManagement("[EBICS_OK]", "000000",
HttpStatusCode.OK, "000000")
+ return
}
}
@@ -314,6 +320,39 @@ private suspend fun ApplicationCall.ebicsweb() {
respondText(strResp, ContentType.Application.Xml,
HttpStatusCode.OK)
return
}
+ "ebicsNoPubKeyDigestsRequest" -> {
+ val requestJaxb =
XMLUtil.convertDomToJaxb(EbicsNoPubKeyDigestsRequest::class.java, bodyDocument)
+ val staticHeader = requestJaxb.value.header.static
+ val orderType = staticHeader.orderDetails.orderType
+ when (orderType) {
+ "HPB" -> {
+ val subscriberKeys = transaction {
+ val ebicsSubscriber =
+ findEbicsSubscriber(staticHeader.partnerID,
staticHeader.userID, staticHeader.systemID)
+ if (ebicsSubscriber == null) {
+ throw
EbicsRequestError(HttpStatusCode.Unauthorized)
+ }
+ if (ebicsSubscriber.state !=
SubscriberState.INITIALIZED) {
+ throw EbicsRequestError(HttpStatusCode.Forbidden)
+ }
+ val authPubBlob =
ebicsSubscriber.authenticationKey!!.rsaPublicKey
+ val encPubBlob =
ebicsSubscriber.encryptionKey!!.rsaPublicKey
+ val sigPubBlob =
ebicsSubscriber.signatureKey!!.rsaPublicKey
+ SubscriberKeys(
+
CryptoUtil.loadRsaPublicKey(authPubBlob.toByteArray()),
+
CryptoUtil.loadRsaPublicKey(encPubBlob.toByteArray()),
+
CryptoUtil.loadRsaPublicKey(sigPubBlob.toByteArray())
+ )
+ }
+ val validationResult =
XMLUtil.verifyEbicsDocument(bodyDocument, subscriberKeys.signaturePublicKey)
+ logger.info("validationResult: $validationResult")
+ }
+ else -> {
+ logger.warn("order type '${orderType}' not supported for
ebicsNoPubKeyDigestsRequest")
+ respondEbicsInvalidXml()
+ }
+ }
+ }
else -> {
/* Log to console and return "unknown type" */
logger.info("Unknown message, just logging it!")
diff --git
a/sandbox/src/main/kotlin/tech/libeufin/schema/ebics_h004/EbicsMessages.kt
b/sandbox/src/main/kotlin/tech/libeufin/schema/ebics_h004/EbicsMessages.kt
index e964f21..f98d65f 100644
--- a/sandbox/src/main/kotlin/tech/libeufin/schema/ebics_h004/EbicsMessages.kt
+++ b/sandbox/src/main/kotlin/tech/libeufin/schema/ebics_h004/EbicsMessages.kt
@@ -540,3 +540,45 @@ class EbicsKeyManagementResponse {
}
}
}
+
+
+@XmlAccessorType(XmlAccessType.NONE)
+@XmlType(name = "", propOrder = ["header", "authSignature", "body"])
+@XmlRootElement(name = "ebicsNoPubKeyDigestsRequest")
+class EbicsNoPubKeyDigestsRequest {
+ @get:XmlAttribute(name = "Version", required = true)
+ @get:XmlJavaTypeAdapter(CollapsedStringAdapter::class)
+ lateinit var version: String
+
+ @get:XmlAttribute(name = "Revision")
+ var revision: Int? = null
+
+ @get:XmlElement(name = "header", required = true)
+ lateinit var header: Header
+
+ @get:XmlElement(name = "AuthSignature", required = true)
+ lateinit var authSignature: SignatureType
+
+ @get:XmlElement(required = true)
+ lateinit var body: EmptyBody
+
+ @XmlAccessorType(XmlAccessType.NONE)
+ @XmlType(name = "", propOrder = ["static", "mutable"])
+ class Header {
+ @get:XmlAttribute(name = "authenticate", required = true)
+ var authenticate: Boolean = false
+
+ @get:XmlElement(name = "static", required = true)
+ lateinit var static: StaticHeader
+
+ @get:XmlElement(required = true)
+ lateinit var mutable: EmptyMutableHeader
+
+ @XmlAccessorType(XmlAccessType.NONE)
+ @XmlType(name = "")
+ class EmptyMutableHeader
+ }
+
+ @XmlAccessorType(XmlAccessType.NONE)
+ class EmptyBody
+}
\ No newline at end of file
diff --git a/resources/logback.xml b/sandbox/src/resources/logback.xml
similarity index 100%
rename from resources/logback.xml
rename to sandbox/src/resources/logback.xml
diff --git a/sandbox/src/test/kotlin/EbicsMessagesTest.kt
b/sandbox/src/test/kotlin/EbicsMessagesTest.kt
index afc8f0e..20f7b20 100644
--- a/sandbox/src/test/kotlin/EbicsMessagesTest.kt
+++ b/sandbox/src/test/kotlin/EbicsMessagesTest.kt
@@ -18,7 +18,7 @@ class EbicsMessagesTest {
* messages.
*/
@Test
- fun importNonRoot() {
+ fun testImportNonRoot() {
val classLoader = ClassLoader.getSystemClassLoader()
val ini = classLoader.getResource("ebics_ini_inner_key.xml")
val jaxb =
XMLUtil.convertStringToJaxb<SignaturePubKeyOrderData>(ini.readText())
@@ -29,7 +29,7 @@ class EbicsMessagesTest {
* Test string -> JAXB
*/
@Test
- fun stringToJaxb() {
+ fun testStringToJaxb() {
val classLoader = ClassLoader.getSystemClassLoader()
val ini = classLoader.getResource("ebics_ini_request_sample.xml")
val jaxb =
XMLUtil.convertStringToJaxb<EbicsUnsecuredRequest>(ini.readText())
@@ -44,7 +44,7 @@ class EbicsMessagesTest {
* Test JAXB -> string
*/
@Test
- fun jaxbToString() {
+ fun testJaxbToString() {
val hevResponseJaxb = HEVResponse().apply {
this.systemReturnCode = SystemReturnCodeType().apply {
this.reportText = "[EBICS_OK]"
@@ -55,12 +55,11 @@ class EbicsMessagesTest {
XMLUtil.convertJaxbToString(hevResponseJaxb)
}
-
/**
* Test DOM -> JAXB
*/
@Test
- fun domToJaxb() {
+ fun testDomToJaxb() {
val classLoader = ClassLoader.getSystemClassLoader()
val ini = classLoader.getResource("ebics_ini_request_sample.xml")!!
val iniDom = XMLUtil.parseStringIntoDom(ini.readText())
@@ -100,7 +99,7 @@ class EbicsMessagesTest {
}
@Test
- fun hiaLoad() {
+ fun testHiaLoad() {
val classLoader = ClassLoader.getSystemClassLoader()
val hia = classLoader.getResource("hia_request.xml")!!
val hiaDom = XMLUtil.parseStringIntoDom(hia.readText())
@@ -122,7 +121,7 @@ class EbicsMessagesTest {
}
@Test
- fun loadInnerKey() {
+ fun testLoadInnerKey() {
val jaxbKey = run {
val classLoader = ClassLoader.getSystemClassLoader()
val file = classLoader.getResource(
@@ -138,14 +137,14 @@ class EbicsMessagesTest {
}
@Test
- fun loadIniMessage() {
+ fun testLoadIniMessage() {
val classLoader = ClassLoader.getSystemClassLoader()
val text =
classLoader.getResource("ebics_ini_request_sample.xml")!!.readText()
XMLUtil.convertStringToJaxb<EbicsUnsecuredRequest>(text)
}
@Test
- fun loadResponse() {
+ fun testLoadResponse() {
val response = EbicsResponse().apply {
version = "H004"
header = EbicsResponse.Header().apply {
@@ -166,4 +165,11 @@ class EbicsMessagesTest {
}
print(XMLUtil.convertJaxbToString(response))
}
+
+ @Test
+ fun testLoadHpb() {
+ val classLoader = ClassLoader.getSystemClassLoader()
+ val text = classLoader.getResource("hpb_request.xml")!!.readText()
+ XMLUtil.convertStringToJaxb<EbicsNoPubKeyDigestsRequest>(text)
+ }
}
\ No newline at end of file
--
To stop receiving notification emails like this one, please contact
address@hidden.