diff --git a/ballerina/Ballerina.toml b/ballerina/Ballerina.toml index be31339..5e13cb0 100644 --- a/ballerina/Ballerina.toml +++ b/ballerina/Ballerina.toml @@ -1,14 +1,14 @@ [package] org = "ballerina" name = "soap" -version = "2.0.1" +version = "2.1.0" authors = ["Ballerina"] export=["soap", "soap.soap11", "soap.soap12"] keywords = ["soap"] repository = "https://github.com/ballerina-platform/module-ballerina-soap" icon = "icon.png" license = ["Apache-2.0"] -distribution = "2201.10.0-20241011-161100-51978649" +distribution = "2201.11.0-20241112-214900-6b80ab87" [build-options] observabilityIncluded = true @@ -19,8 +19,8 @@ graalvmCompatible = true [[platform.java21.dependency]] groupId = "io.ballerina.stdlib" artifactId = "soap-native" -version = "2.0.1" -path = "../native/build/libs/soap-native-2.0.1-SNAPSHOT.jar" +version = "2.1.0" +path = "../native/build/libs/soap-native-2.1.0-SNAPSHOT.jar" [[platform.java21.dependency]] groupId = "org.apache.wss4j" diff --git a/ballerina/Dependencies.toml b/ballerina/Dependencies.toml index b5a1a75..09db1b2 100644 --- a/ballerina/Dependencies.toml +++ b/ballerina/Dependencies.toml @@ -5,7 +5,7 @@ [ballerina] dependencies-toml-version = "2" -distribution-version = "2201.10.0-20241011-161100-51978649" +distribution-version = "2201.11.0-20241112-214900-6b80ab87" [[package]] org = "ballerina" @@ -26,13 +26,14 @@ version = "3.8.1" dependencies = [ {org = "ballerina", name = "constraint"}, {org = "ballerina", name = "jballerina.java"}, - {org = "ballerina", name = "task"} + {org = "ballerina", name = "task"}, + {org = "ballerina", name = "time"} ] [[package]] org = "ballerina" name = "constraint" -version = "1.5.1" +version = "1.6.0" dependencies = [ {org = "ballerina", name = "jballerina.java"} ] @@ -49,6 +50,15 @@ modules = [ {org = "ballerina", packageName = "crypto", moduleName = "crypto"} ] +[[package]] +org = "ballerina" +name = "data.jsondata" +version = "0.3.0" +dependencies = [ + {org = "ballerina", name = "jballerina.java"}, + {org = "ballerina", name = "lang.object"} +] + [[package]] org = "ballerina" name = "file" @@ -63,12 +73,13 @@ dependencies = [ [[package]] org = "ballerina" name = "http" -version = "2.12.1" +version = "2.13.0" dependencies = [ {org = "ballerina", name = "auth"}, {org = "ballerina", name = "cache"}, {org = "ballerina", name = "constraint"}, {org = "ballerina", name = "crypto"}, + {org = "ballerina", name = "data.jsondata"}, {org = "ballerina", name = "file"}, {org = "ballerina", name = "io"}, {org = "ballerina", name = "jballerina.java"}, @@ -123,7 +134,8 @@ dependencies = [ {org = "ballerina", name = "jballerina.java"}, {org = "ballerina", name = "lang.int"}, {org = "ballerina", name = "lang.string"}, - {org = "ballerina", name = "log"} + {org = "ballerina", name = "log"}, + {org = "ballerina", name = "time"} ] [[package]] @@ -225,7 +237,7 @@ dependencies = [ [[package]] org = "ballerina" name = "mime" -version = "2.10.1" +version = "2.10.2" dependencies = [ {org = "ballerina", name = "io"}, {org = "ballerina", name = "jballerina.java"}, @@ -245,13 +257,14 @@ dependencies = [ {org = "ballerina", name = "crypto"}, {org = "ballerina", name = "jballerina.java"}, {org = "ballerina", name = "log"}, + {org = "ballerina", name = "time"}, {org = "ballerina", name = "url"} ] [[package]] org = "ballerina" name = "observe" -version = "1.3.1" +version = "1.4.0" dependencies = [ {org = "ballerina", name = "jballerina.java"} ] @@ -268,7 +281,7 @@ dependencies = [ [[package]] org = "ballerina" name = "soap" -version = "2.0.1" +version = "2.1.0" dependencies = [ {org = "ballerina", name = "crypto"}, {org = "ballerina", name = "http"}, @@ -311,7 +324,7 @@ modules = [ [[package]] org = "ballerina" name = "time" -version = "2.5.1" +version = "2.6.0" dependencies = [ {org = "ballerina", name = "jballerina.java"} ] diff --git a/ballerina/modules/soap11/tests/soap11_client_test.bal b/ballerina/modules/soap11/tests/soap11_client_test.bal index 21d5271..705ab6c 100644 --- a/ballerina/modules/soap11/tests/soap11_client_test.bal +++ b/ballerina/modules/soap11/tests/soap11_client_test.bal @@ -387,7 +387,7 @@ function testSoapReceiveWithAsymmetricBindingAndInboundConfig() returns error? { xmlns "http://schemas.xmlsoap.org/soap/envelope/" as soap11; Client soapClient = check new ("http://localhost:9090", { - outboundSecurity: { + outboundSecurity: [{ signatureConfig: { keystore: { path: KEY_STORE_PATH_2, @@ -408,6 +408,9 @@ function testSoapReceiveWithAsymmetricBindingAndInboundConfig() returns error? { encryptionAlgorithm: wssec:AES_128 } }, + { + timeToLive: 1 + }], inboundSecurity: { decryptKeystore: { path: KEY_STORE_PATH_2, diff --git a/ballerina/modules/soap12/tests/soap12_client_test.bal b/ballerina/modules/soap12/tests/soap12_client_test.bal index ef9eba9..2c8dbe6 100644 --- a/ballerina/modules/soap12/tests/soap12_client_test.bal +++ b/ballerina/modules/soap12/tests/soap12_client_test.bal @@ -414,13 +414,13 @@ function testSoapEndpoint() returns error? { } @test:Config { - groups: ["soap12", "send_receive", "new2"] + groups: ["soap12", "send_receive"] } function testSoapReceiveWithAsymmetricBindingAndInboundConfig() returns error? { - xmlns "http://www.w3.org/2003/05/soap-envelope" as soap11; + xmlns "http://www.w3.org/2003/05/soap-envelope" as soap12; Client soapClient = check new ("http://localhost:9091", { - outboundSecurity: { + outboundSecurity: [{ signatureConfig: { keystore: { path: KEY_STORE_PATH_2, @@ -440,7 +440,58 @@ function testSoapReceiveWithAsymmetricBindingAndInboundConfig() returns error? { publicKeyAlias: ALIAS, encryptionAlgorithm: wssec:AES_128 } - }, + }], + inboundSecurity: { + decryptKeystore: { + path: KEY_STORE_PATH_2, + password: PASSWORD + }, + signatureKeystore: { + path: KEY_STORE_PATH_2, + password: PASSWORD + } + } + } + ); + xml body = xml `23`; + xml response = check soapClient->sendReceive(body, "http://tempuri.org/Add"); + test:assertEquals((response/).toString(), (body/).toString()); +} + +@test:Config { + groups: ["soap12", "send_receive"] +} +function testSoapReceiveWithArrayOfOutboundConfigAndInboundConfig() returns error? { + xmlns "http://www.w3.org/2003/05/soap-envelope" as soap12; + Client soapClient = check new ("http://localhost:9091", + { + outboundSecurity: [{ + signatureConfig: { + keystore: { + path: KEY_STORE_PATH_2, + password: PASSWORD + }, + privateKeyAlias: ALIAS, + privateKeyPassword: PASSWORD, + signatureAlgorithm: soap:RSA_SHA512, + canonicalizationAlgorithm: soap:C14N_EXCL_OMIT_COMMENTS, + digestAlgorithm: soap:SHA512 + }, + encryptionConfig: { + keystore: { + path: KEY_STORE_PATH_2, + password: PASSWORD + }, + publicKeyAlias: ALIAS, + encryptionAlgorithm: wssec:AES_128 + } + }, { + timeToLive: 1 + }, { + username: "user", + password: "password", + passwordType: wssec:TEXT + }], inboundSecurity: { decryptKeystore: { path: KEY_STORE_PATH_2, @@ -455,5 +506,11 @@ function testSoapReceiveWithAsymmetricBindingAndInboundConfig() returns error? { ); xml body = xml `23`; xml response = check soapClient->sendReceive(body, "http://tempuri.org/Add"); - test:assertEquals((response/).toString(), (body/).toString()); + string:RegExp usernameTokenTag = re `.*`; + string:RegExp usernameTag = re `user`; + test:assertTrue(response.toString().includesMatch(usernameTokenTag)); + test:assertTrue(response.toString().includesMatch(usernameTag)); + string:RegExp passwordTag = re `password`; + test:assertTrue(response.toString().includesMatch(passwordTag)); + test:assertEquals((response/).toString(), (body/).toString()); } diff --git a/ballerina/soap_utils.bal b/ballerina/soap_utils.bal index e78497f..65fcfb7 100644 --- a/ballerina/soap_utils.bal +++ b/ballerina/soap_utils.bal @@ -58,7 +58,7 @@ public isolated function applySecurityPolicies(wssec:OutboundSecurityConfig|wsse } else { xml securedEnvelope = envelope.clone(); foreach wssec:OutboundSecurityConfig policy in security { - securedEnvelope = check applySecurityPolicies(policy, securedEnvelope); + securedEnvelope = check applySecurityPolicies(policy, securedEnvelope, soap12); } return securedEnvelope; } diff --git a/build-config/resources/Ballerina.toml b/build-config/resources/Ballerina.toml index fefcaad..174eae7 100644 --- a/build-config/resources/Ballerina.toml +++ b/build-config/resources/Ballerina.toml @@ -8,7 +8,7 @@ keywords = ["soap"] repository = "https://github.com/ballerina-platform/module-ballerina-soap" icon = "icon.png" license = ["Apache-2.0"] -distribution = "2201.10.0-20241011-161100-51978649" +distribution = "2201.11.0-20241112-214900-6b80ab87" [build-options] observabilityIncluded = true diff --git a/build.gradle b/build.gradle index 5d2e722..ddb8e0d 100644 --- a/build.gradle +++ b/build.gradle @@ -91,6 +91,7 @@ subprojects { ballerinaStdLibs "io.ballerina.stdlib:os-ballerina:${project.stdlibOsVersion}" ballerinaStdLibs "io.ballerina.stdlib:url-ballerina:${project.stdlibUrlVersion}" ballerinaStdLibs "io.ballerina.stdlib:io-ballerina:${project.stdlibIoVersion}" + ballerinaStdLibs "io.ballerina.lib:data.jsondata-ballerina:${stdlibDataJsonDataVersion}" externalJars (group: 'org.apache.wss4j', name: 'wss4j-ws-security-dom', version: "${wsSecurityDomVersion}") { transitive = false diff --git a/gradle.properties b/gradle.properties index 9138043..1962954 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ org.gradle.caching=true group=io.ballerina.stdlib -version=2.0.1-SNAPSHOT +version=2.1.0-SNAPSHOT checkstylePluginVersion=10.12.0 spotbugsPluginVersion=6.0.18 @@ -9,29 +9,30 @@ downloadPluginVersion=5.4.0 releasePluginVersion=2.8.0 ballerinaGradlePluginVersion=2.2.4 -ballerinaLangVersion=2201.10.0-20241011-161100-51978649 +ballerinaLangVersion=2201.11.0-20241112-214900-6b80ab87 -stdlibIoVersion=1.6.2-20240928-084100-656404f -stdlibTimeVersion=2.5.1-20240930-120200-e59222b -stdlibUrlVersion=2.4.1-20240930-120200-b7fb9e1 +stdlibIoVersion=1.6.2-20241112-233100-995cf5f +stdlibTimeVersion=2.6.0-20241113-073800-201b904 +stdlibUrlVersion=2.4.1-20241113-073900-335ff51 -stdlibConstraintVersion=1.5.1-20240930-123400-5ecd396 -stdlibCryptoVersion=2.7.3-20240930-132000-5ecc9ab -stdlibLogVersion=2.10.1-20240930-154200-5ab2aa4 -stdlibOsVersion=1.8.1-20241001-120600-dd1626e -stdlibRandomVersion=1.5.1-20240930-193000-e5c6c0e -stdlibTaskVersion=2.5.1-20241002-145700-5bdb843 +stdlibConstraintVersion=1.6.0-20241113-090900-d276ad5 +stdlibCryptoVersion=2.7.3-20241113-081400-d015a39 +stdlibLogVersion=2.10.1-20241113-120000-4577868 +stdlibOsVersion=1.8.1-20241113-122000-cca973b +stdlibRandomVersion=1.5.1-20241113-122300-1bc770e +stdlibTaskVersion=2.5.1-20241113-123500-f905281 -stdlibCacheVersion=3.8.1-20241007-154900-63f4403 -stdlibFileVersion=1.10.1-20241007-160900-03f7b64 -stdlibMimeVersion=2.10.1-20241009-141200-8b6c9f0 -stdlibUuidVersion=1.8.1-20241009-134600-a05012b +stdlibCacheVersion=3.8.1-20241113-125700-b75a1bf +stdlibFileVersion=1.10.1-20241113-151700-e1a2e38 +stdlibMimeVersion=2.10.2-20241113-154200-d953747 +stdlibUuidVersion=1.8.1-20241113-154400-443c67b -stdlibAuthVersion=2.12.1-20241010-130800-733dbef -stdlibJwtVersion=2.13.1-20241010-123600-5ea6a94 -stdlibOAuth2Version=2.12.1-20241010-123600-0e0cfcc +stdlibAuthVersion=2.12.1-20241113-162300-ded40eb +stdlibDataJsonDataVersion=0.3.0-20241113-163100-6d332e1 +stdlibJwtVersion=2.13.1-20241113-162400-b59ccfa +stdlibOAuth2Version=2.12.1-20241113-162400-4c6ddfe -stdlibHttpVersion=2.12.1-20241018-081800-bb91312 +stdlibHttpVersion=2.13.0-20241114-182900-7e9f66a wsSecurityDomVersion=3.0.1 wsSecurityCommonVersion=3.0.1 @@ -39,5 +40,5 @@ xmlSecVersion=3.0.3 guavaVersion=32.1.1-jre # Ballerinax Observer -observeVersion=1.3.1-20241007-161000-645452d -observeInternalVersion=1.3.1-20241015-172900-cdc3cb3 +observeVersion=1.4.0-20241113-092000-b83ae74 +observeInternalVersion=1.3.1-20241113-101700-265054d diff --git a/native/src/main/java/io/ballerina/lib/soap/Soap.java b/native/src/main/java/io/ballerina/lib/soap/Soap.java index a7526cf..fd3ba02 100644 --- a/native/src/main/java/io/ballerina/lib/soap/Soap.java +++ b/native/src/main/java/io/ballerina/lib/soap/Soap.java @@ -28,36 +28,33 @@ public class Soap { public static Object sendReceive11(Environment env, BObject soap11, Object body, BString action, BMap headers, BString path, BTypedesc typeDesc) { - env.yieldAndRun(() -> { + return env.yieldAndRun(() -> { try { Object[] arguments = new Object[]{body, action, headers, path}; - Object result = env.getRuntime().call(soap11, REMOTE_FUNCTION, arguments); + Object result = env.getRuntime().callMethod(soap11, REMOTE_FUNCTION, null, arguments); if (result instanceof BError) { ((BError) result).printStackTrace(); - System.exit(1); - } + return result; } catch (BError bError) { bError.printStackTrace(); System.exit(1); } return null; }); - return null; } public static Object sendReceive12(Environment env, BObject soap12, Object body, Object action, BMap headers, BString path, BTypedesc typeDesc) { - env.yieldAndRun(() -> { + return env.yieldAndRun(() -> { try { Object[] arguments = new Object[]{body, action, headers, path}; - env.getRuntime().call(soap12, REMOTE_FUNCTION, arguments); + return env.getRuntime().callMethod(soap12, REMOTE_FUNCTION, null, arguments); } catch (BError bError) { bError.printStackTrace(); System.exit(1); } return null; }); - return null; } }