From 8c50e40c5196b10b00bfb76eec71321ea856983b Mon Sep 17 00:00:00 2001 From: Till Neunast Date: Mon, 13 Nov 2017 07:41:51 +1300 Subject: [PATCH] Make Decryption postprocessor fail sample on exception --- .../AbstractWSSecurityPostProcessor.java | 22 +++---- .../AbstractWSSecurityPreProcessor.java | 7 --- .../CryptoWSSecurityPostProcessor.java | 3 +- .../CryptoWSSecurityPreProcessor.java | 6 +- .../WSSDecryptionPostProcessorBeanInfo.java | 3 - .../modifiers/WSSEncryptionPreProcessor.java | 1 - .../WSSEncryptionPreProcessorBeanInfo.java | 1 - .../modifiers/WSSSignaturePreProcessor.java | 1 - .../WSSSignaturePreProcessorBeanInfo.java | 1 - .../WSSUsernameTokenPreProcessor.java | 1 - .../TestAbstractWSSecurityPreProcessor.java | 2 - .../modifiers/TestSamplerPayloadAccessor.java | 6 -- .../TestWSSDecryptionPostProcessor.java | 60 ++++++++++++++++++- .../TestWSSEncryptionPreProcessor.java | 1 - .../TestWSSSecurityPreProcessorBase.java | 6 -- .../TestWSSSignaturePreProcessor.java | 1 - 16 files changed, 73 insertions(+), 49 deletions(-) diff --git a/src/main/java/nz/co/breakpoint/jmeter/modifiers/AbstractWSSecurityPostProcessor.java b/src/main/java/nz/co/breakpoint/jmeter/modifiers/AbstractWSSecurityPostProcessor.java index 7697e56..61ef835 100644 --- a/src/main/java/nz/co/breakpoint/jmeter/modifiers/AbstractWSSecurityPostProcessor.java +++ b/src/main/java/nz/co/breakpoint/jmeter/modifiers/AbstractWSSecurityPostProcessor.java @@ -1,22 +1,15 @@ package nz.co.breakpoint.jmeter.modifiers; +import javax.xml.parsers.ParserConfigurationException; +import org.apache.jmeter.assertions.AssertionResult; import org.apache.jmeter.processor.PostProcessor; -import org.apache.jmeter.samplers.Sampler; import org.apache.jmeter.samplers.SampleResult; import org.apache.jmeter.testbeans.TestBean; -import org.apache.jmeter.testelement.AbstractTestElement; +import org.apache.jmeter.util.JMeterUtils; import org.apache.jorphan.logging.LoggingManager; import org.apache.log.Logger; -import java.io.StringReader; -import java.util.Properties; -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; import org.apache.wss4j.common.ext.WSSecurityException; -import org.apache.wss4j.common.util.XMLUtils; -import org.apache.wss4j.dom.message.WSSecHeader; import org.w3c.dom.Document; -import org.xml.sax.InputSource; /** * Abstract base class for any postprocessor that validates/decrypts a SOAP WSS header in the sampler response. @@ -26,6 +19,8 @@ public abstract class AbstractWSSecurityPostProcessor extends AbstractXMLTestEle private static final Logger log = LoggingManager.getLoggerForClass(); + static final String FAIL_ON_WSS_EXCEPTION = "jmeter.wssecurity.failSamplerOnWSSException"; + public AbstractWSSecurityPostProcessor() throws ParserConfigurationException { super(); } @@ -57,6 +52,13 @@ public void process() { } catch (Exception e) { log.error("Processing failed! ", e); + if (e instanceof WSSecurityException && JMeterUtils.getPropDefault(FAIL_ON_WSS_EXCEPTION, true)) { + AssertionResult assertionResult = new AssertionResult("WSSecurityException").setResultForFailure(e.getMessage()); + assertionResult.setError(true); + assertionResult.setFailure(true); + prev.addAssertionResult(assertionResult); + prev.setSuccessful(false); + } } } } diff --git a/src/main/java/nz/co/breakpoint/jmeter/modifiers/AbstractWSSecurityPreProcessor.java b/src/main/java/nz/co/breakpoint/jmeter/modifiers/AbstractWSSecurityPreProcessor.java index 9806aab..62605c4 100644 --- a/src/main/java/nz/co/breakpoint/jmeter/modifiers/AbstractWSSecurityPreProcessor.java +++ b/src/main/java/nz/co/breakpoint/jmeter/modifiers/AbstractWSSecurityPreProcessor.java @@ -3,20 +3,13 @@ import org.apache.jmeter.processor.PreProcessor; import org.apache.jmeter.samplers.Sampler; import org.apache.jmeter.testbeans.TestBean; -import org.apache.jmeter.testelement.AbstractTestElement; import org.apache.jorphan.logging.LoggingManager; import org.apache.log.Logger; -import java.io.StringReader; -import java.util.Properties; -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.apache.wss4j.common.ext.WSSecurityException; -import org.apache.wss4j.common.util.XMLUtils; import org.apache.wss4j.dom.message.WSSecHeader; import org.apache.wss4j.dom.message.WSSecBase; import org.w3c.dom.Document; -import org.xml.sax.InputSource; /** * Abstract base class for any preprocessor that creates/modifies a SOAP WSS header in the sampler payload. diff --git a/src/main/java/nz/co/breakpoint/jmeter/modifiers/CryptoWSSecurityPostProcessor.java b/src/main/java/nz/co/breakpoint/jmeter/modifiers/CryptoWSSecurityPostProcessor.java index 3cdbbb9..eb5836f 100644 --- a/src/main/java/nz/co/breakpoint/jmeter/modifiers/CryptoWSSecurityPostProcessor.java +++ b/src/main/java/nz/co/breakpoint/jmeter/modifiers/CryptoWSSecurityPostProcessor.java @@ -19,13 +19,12 @@ public abstract class CryptoWSSecurityPostProcessor extends AbstractWSSecurityPo private static final Logger log = LoggingManager.getLoggerForClass(); - private final Properties cryptoProps; // Holds configured attributes for crypto instance + private final Properties cryptoProps = new Properties(); // Holds configured attributes for crypto instance private String certPassword; public CryptoWSSecurityPostProcessor() throws ParserConfigurationException { super(); - cryptoProps = new Properties(); } protected Crypto getCrypto() throws WSSecurityException { diff --git a/src/main/java/nz/co/breakpoint/jmeter/modifiers/CryptoWSSecurityPreProcessor.java b/src/main/java/nz/co/breakpoint/jmeter/modifiers/CryptoWSSecurityPreProcessor.java index b10eb16..e429c1e 100644 --- a/src/main/java/nz/co/breakpoint/jmeter/modifiers/CryptoWSSecurityPreProcessor.java +++ b/src/main/java/nz/co/breakpoint/jmeter/modifiers/CryptoWSSecurityPreProcessor.java @@ -15,7 +15,6 @@ import static org.apache.wss4j.common.crypto.Merlin.PREFIX; import static org.apache.wss4j.common.crypto.Merlin.KEYSTORE_FILE; import static org.apache.wss4j.common.crypto.Merlin.KEYSTORE_PASSWORD; -import static org.apache.wss4j.common.crypto.Merlin.KEYSTORE_TYPE; /** * Abstract parent class of any preprocessors that perform crypto operations (e.g. signature or encryption). @@ -24,7 +23,7 @@ public abstract class CryptoWSSecurityPreProcessor extends AbstractWSSecurityPre private static final Logger log = LoggingManager.getLoggerForClass(); - private final Properties cryptoProps; // Holds configured attributes for crypto instance + private final Properties cryptoProps = new Properties(); // Holds configured attributes for crypto instance private List partsToSecure; // Holds the names of XML elements to secure (e.g. SOAP Body) @@ -43,9 +42,6 @@ public abstract class CryptoWSSecurityPreProcessor extends AbstractWSSecurityPre public CryptoWSSecurityPreProcessor() throws ParserConfigurationException { super(); - cryptoProps = new Properties(); - cryptoProps.setProperty("org.apache.wss4j.crypto.provider", "org.apache.wss4j.common.crypto.Merlin"); - cryptoProps.setProperty(PREFIX+KEYSTORE_TYPE, "jks"); } /* Reverse lookup for above keyIdentifierMap. Mainly used for populating the GUI dropdown. diff --git a/src/main/java/nz/co/breakpoint/jmeter/modifiers/WSSDecryptionPostProcessorBeanInfo.java b/src/main/java/nz/co/breakpoint/jmeter/modifiers/WSSDecryptionPostProcessorBeanInfo.java index 70b543c..3b4a6b5 100644 --- a/src/main/java/nz/co/breakpoint/jmeter/modifiers/WSSDecryptionPostProcessorBeanInfo.java +++ b/src/main/java/nz/co/breakpoint/jmeter/modifiers/WSSDecryptionPostProcessorBeanInfo.java @@ -1,8 +1,5 @@ package nz.co.breakpoint.jmeter.modifiers; -import java.beans.PropertyDescriptor; -import org.apache.wss4j.dom.WSConstants; - public class WSSDecryptionPostProcessorBeanInfo extends CryptoWSSecurityPostProcessorBeanInfo { public WSSDecryptionPostProcessorBeanInfo() { diff --git a/src/main/java/nz/co/breakpoint/jmeter/modifiers/WSSEncryptionPreProcessor.java b/src/main/java/nz/co/breakpoint/jmeter/modifiers/WSSEncryptionPreProcessor.java index 7e69eab..be52095 100644 --- a/src/main/java/nz/co/breakpoint/jmeter/modifiers/WSSEncryptionPreProcessor.java +++ b/src/main/java/nz/co/breakpoint/jmeter/modifiers/WSSEncryptionPreProcessor.java @@ -1,7 +1,6 @@ package nz.co.breakpoint.jmeter.modifiers; import javax.xml.parsers.ParserConfigurationException; -import org.apache.wss4j.common.crypto.Crypto; import org.apache.wss4j.common.ext.WSSecurityException; import org.apache.wss4j.dom.WSConstants; import org.apache.wss4j.dom.message.WSSecBase; diff --git a/src/main/java/nz/co/breakpoint/jmeter/modifiers/WSSEncryptionPreProcessorBeanInfo.java b/src/main/java/nz/co/breakpoint/jmeter/modifiers/WSSEncryptionPreProcessorBeanInfo.java index 4806fed..c8bcfaa 100644 --- a/src/main/java/nz/co/breakpoint/jmeter/modifiers/WSSEncryptionPreProcessorBeanInfo.java +++ b/src/main/java/nz/co/breakpoint/jmeter/modifiers/WSSEncryptionPreProcessorBeanInfo.java @@ -1,7 +1,6 @@ package nz.co.breakpoint.jmeter.modifiers; import java.beans.PropertyDescriptor; -import org.apache.wss4j.dom.WSConstants; public class WSSEncryptionPreProcessorBeanInfo extends CryptoWSSecurityPreProcessorBeanInfo { diff --git a/src/main/java/nz/co/breakpoint/jmeter/modifiers/WSSSignaturePreProcessor.java b/src/main/java/nz/co/breakpoint/jmeter/modifiers/WSSSignaturePreProcessor.java index 1116d04..fb8f3c5 100644 --- a/src/main/java/nz/co/breakpoint/jmeter/modifiers/WSSSignaturePreProcessor.java +++ b/src/main/java/nz/co/breakpoint/jmeter/modifiers/WSSSignaturePreProcessor.java @@ -1,7 +1,6 @@ package nz.co.breakpoint.jmeter.modifiers; import javax.xml.parsers.ParserConfigurationException; -import org.apache.wss4j.common.crypto.Crypto; import org.apache.wss4j.common.ext.WSSecurityException; import org.apache.wss4j.dom.WSConstants; import org.apache.wss4j.dom.message.WSSecBase; diff --git a/src/main/java/nz/co/breakpoint/jmeter/modifiers/WSSSignaturePreProcessorBeanInfo.java b/src/main/java/nz/co/breakpoint/jmeter/modifiers/WSSSignaturePreProcessorBeanInfo.java index e9a5bfb..3541150 100644 --- a/src/main/java/nz/co/breakpoint/jmeter/modifiers/WSSSignaturePreProcessorBeanInfo.java +++ b/src/main/java/nz/co/breakpoint/jmeter/modifiers/WSSSignaturePreProcessorBeanInfo.java @@ -1,7 +1,6 @@ package nz.co.breakpoint.jmeter.modifiers; import java.beans.PropertyDescriptor; -import org.apache.wss4j.dom.WSConstants; public class WSSSignaturePreProcessorBeanInfo extends CryptoWSSecurityPreProcessorBeanInfo { diff --git a/src/main/java/nz/co/breakpoint/jmeter/modifiers/WSSUsernameTokenPreProcessor.java b/src/main/java/nz/co/breakpoint/jmeter/modifiers/WSSUsernameTokenPreProcessor.java index 300b799..8e91533 100644 --- a/src/main/java/nz/co/breakpoint/jmeter/modifiers/WSSUsernameTokenPreProcessor.java +++ b/src/main/java/nz/co/breakpoint/jmeter/modifiers/WSSUsernameTokenPreProcessor.java @@ -5,7 +5,6 @@ import javax.xml.parsers.ParserConfigurationException; import org.apache.jorphan.logging.LoggingManager; import org.apache.log.Logger; -import org.apache.wss4j.common.crypto.Crypto; import org.apache.wss4j.common.ext.WSSecurityException; import org.apache.wss4j.dom.message.WSSecBase; import org.apache.wss4j.dom.message.WSSecHeader; diff --git a/src/test/java/nz/co/breakpoint/jmeter/modifiers/TestAbstractWSSecurityPreProcessor.java b/src/test/java/nz/co/breakpoint/jmeter/modifiers/TestAbstractWSSecurityPreProcessor.java index 853dc84..b158787 100644 --- a/src/test/java/nz/co/breakpoint/jmeter/modifiers/TestAbstractWSSecurityPreProcessor.java +++ b/src/test/java/nz/co/breakpoint/jmeter/modifiers/TestAbstractWSSecurityPreProcessor.java @@ -1,9 +1,7 @@ package nz.co.breakpoint.jmeter.modifiers; import javax.xml.parsers.ParserConfigurationException; -import org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase; import org.apache.jmeter.protocol.jms.sampler.JMSSampler; -import org.apache.jmeter.threads.JMeterContext; import org.apache.jmeter.threads.JMeterContextService; import org.apache.wss4j.common.ext.WSSecurityException; import org.apache.wss4j.dom.message.WSSecHeader; diff --git a/src/test/java/nz/co/breakpoint/jmeter/modifiers/TestSamplerPayloadAccessor.java b/src/test/java/nz/co/breakpoint/jmeter/modifiers/TestSamplerPayloadAccessor.java index 800873f..dfc7288 100644 --- a/src/test/java/nz/co/breakpoint/jmeter/modifiers/TestSamplerPayloadAccessor.java +++ b/src/test/java/nz/co/breakpoint/jmeter/modifiers/TestSamplerPayloadAccessor.java @@ -1,14 +1,8 @@ package nz.co.breakpoint.jmeter.modifiers; -import java.beans.PropertyDescriptor; -import org.apache.jmeter.protocol.http.sampler.HTTPSamplerFactory; import org.apache.jmeter.protocol.jms.sampler.JMSSampler; -import org.apache.jmeter.util.JMeterUtils; -import org.junit.Before; import org.junit.Test; - import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNull; public class TestSamplerPayloadAccessor { @Test diff --git a/src/test/java/nz/co/breakpoint/jmeter/modifiers/TestWSSDecryptionPostProcessor.java b/src/test/java/nz/co/breakpoint/jmeter/modifiers/TestWSSDecryptionPostProcessor.java index 999993d..abafca6 100644 --- a/src/test/java/nz/co/breakpoint/jmeter/modifiers/TestWSSDecryptionPostProcessor.java +++ b/src/test/java/nz/co/breakpoint/jmeter/modifiers/TestWSSDecryptionPostProcessor.java @@ -1,19 +1,35 @@ package nz.co.breakpoint.jmeter.modifiers; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertThat; +import static org.junit.Assert.assertTrue; import static org.hamcrest.CoreMatchers.containsString; +import java.io.File; +import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; +import org.apache.jmeter.assertions.AssertionResult; import org.apache.jmeter.samplers.SampleResult; import org.apache.jmeter.threads.JMeterContext; import org.apache.jmeter.threads.JMeterContextService; +import org.apache.jmeter.util.JMeterUtils; import org.junit.Before; +import org.junit.BeforeClass; import org.junit.Test; public class TestWSSDecryptionPostProcessor { private WSSDecryptionPostProcessor mod = null; private JMeterContext context = null; + private SampleResult result = null; + + @BeforeClass + public static void setUpClass() throws IOException { + File propsFile = File.createTempFile("jmeter-wssecurity-test-", ".properties"); + propsFile.deleteOnExit(); + JMeterUtils.loadJMeterProperties(propsFile.getAbsolutePath()); + } @Before public void setUp() throws Exception { @@ -23,15 +39,57 @@ public void setUp() throws Exception { mod.setKeystoreFile("src/test/resources/keystore.jks"); mod.setKeystorePassword("changeit"); mod.setCertPassword("changeit"); + result = new SampleResult(); + result.setSuccessful(true); } @Test public void testDecryption() throws Exception { - SampleResult result = new SampleResult(); result.setResponseData(Files.readAllBytes(Paths.get("src/test/resources/encrypted-body.xml"))); context.setPreviousResult(result); mod.process(); String decrypted = result.getResponseDataAsString(); assertThat(decrypted, containsString("")); } + + @Test + public void testFailureOnWSSException() throws Exception { + result.setResponseData("" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + + "" + +"", + "UTF-8"); + context.setPreviousResult(result); + + JMeterUtils.setProperty(AbstractWSSecurityPostProcessor.FAIL_ON_WSS_EXCEPTION, "false"); + mod.process(); + assertTrue(result.isSuccessful()); + assertEquals(0, result.getAssertionResults().length); + + JMeterUtils.setProperty(AbstractWSSecurityPostProcessor.FAIL_ON_WSS_EXCEPTION, "true"); + mod.process(); + assertFalse(result.isSuccessful()); + AssertionResult[] assertionResults = result.getAssertionResults(); + assertEquals(1, assertionResults.length); + assertEquals("WSSecurityException", assertionResults[0].getName()); + assertTrue(assertionResults[0].isError()); + assertThat(assertionResults[0].getFailureMessage(), containsString("Any SIG_KEY_INFO MUST contain exactly one child element")); + } + + @Test + public void testNoFailureOnOtherException() throws Exception { + JMeterUtils.setProperty(AbstractWSSecurityPostProcessor.FAIL_ON_WSS_EXCEPTION, "true"); + result.setResponseData("", "UTF-8"); + context.setPreviousResult(result); + mod.process(); + assertTrue(result.isSuccessful()); + AssertionResult[] assertionResults = result.getAssertionResults(); + assertEquals(0, assertionResults.length); + } } diff --git a/src/test/java/nz/co/breakpoint/jmeter/modifiers/TestWSSEncryptionPreProcessor.java b/src/test/java/nz/co/breakpoint/jmeter/modifiers/TestWSSEncryptionPreProcessor.java index fdd75f9..faf478f 100644 --- a/src/test/java/nz/co/breakpoint/jmeter/modifiers/TestWSSEncryptionPreProcessor.java +++ b/src/test/java/nz/co/breakpoint/jmeter/modifiers/TestWSSEncryptionPreProcessor.java @@ -4,7 +4,6 @@ import static org.hamcrest.CoreMatchers.containsString; import org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase; -import org.apache.jmeter.threads.JMeterContext; import org.apache.jmeter.threads.JMeterContextService; import org.junit.Before; import org.junit.Test; diff --git a/src/test/java/nz/co/breakpoint/jmeter/modifiers/TestWSSSecurityPreProcessorBase.java b/src/test/java/nz/co/breakpoint/jmeter/modifiers/TestWSSSecurityPreProcessorBase.java index 2e4dc26..9a2a1f2 100644 --- a/src/test/java/nz/co/breakpoint/jmeter/modifiers/TestWSSSecurityPreProcessorBase.java +++ b/src/test/java/nz/co/breakpoint/jmeter/modifiers/TestWSSSecurityPreProcessorBase.java @@ -1,14 +1,8 @@ package nz.co.breakpoint.jmeter.modifiers; -import static org.junit.Assert.assertThat; -import static org.hamcrest.CoreMatchers.containsString; - import org.apache.jmeter.protocol.http.sampler.HTTPSamplerFactory; import org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase; import org.apache.jmeter.threads.JMeterContext; -import org.apache.jmeter.threads.JMeterContextService; -import org.junit.Before; -import org.junit.Test; public class TestWSSSecurityPreProcessorBase { protected JMeterContext context = null; diff --git a/src/test/java/nz/co/breakpoint/jmeter/modifiers/TestWSSSignaturePreProcessor.java b/src/test/java/nz/co/breakpoint/jmeter/modifiers/TestWSSSignaturePreProcessor.java index d7029e6..f8f91ac 100644 --- a/src/test/java/nz/co/breakpoint/jmeter/modifiers/TestWSSSignaturePreProcessor.java +++ b/src/test/java/nz/co/breakpoint/jmeter/modifiers/TestWSSSignaturePreProcessor.java @@ -4,7 +4,6 @@ import static org.hamcrest.CoreMatchers.containsString; import org.apache.jmeter.protocol.http.sampler.HTTPSamplerBase; -import org.apache.jmeter.threads.JMeterContext; import org.apache.jmeter.threads.JMeterContextService; import org.junit.Before; import org.junit.Test;