From a9ce798f7f4658c80bd3dc1d9d7c9f5fe0776113 Mon Sep 17 00:00:00 2001 From: Dolph Flynn <96876199+DolphFlynn@users.noreply.github.com> Date: Sun, 28 Jul 2024 10:16:40 +0100 Subject: [PATCH] Preserve order when message has multiple JWTs. --- .../model/jose/JOSEObjectFinder.java | 2 +- .../jwteditor/JWEDetectionTests.java | 16 ++++++++++++++-- .../jwteditor/JWSDetectionTests.java | 19 ++++++++++++++++--- 3 files changed, 31 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/blackberry/jwteditor/model/jose/JOSEObjectFinder.java b/src/main/java/com/blackberry/jwteditor/model/jose/JOSEObjectFinder.java index a17d428..8150350 100644 --- a/src/main/java/com/blackberry/jwteditor/model/jose/JOSEObjectFinder.java +++ b/src/main/java/com/blackberry/jwteditor/model/jose/JOSEObjectFinder.java @@ -78,7 +78,7 @@ public static Optional parseJOSEObject(String text) { private static Set findCandidateJoseObjectsWithin(String text) { Matcher m = JOSE_OBJECT_PATTERN.matcher(text); - Set strings = new HashSet<>(); + Set strings = new LinkedHashSet<>(); while (m.find()) { String token = m.group(); diff --git a/src/test/java/com/blackberry/jwteditor/JWEDetectionTests.java b/src/test/java/com/blackberry/jwteditor/JWEDetectionTests.java index 6c2e297..4b28a5d 100644 --- a/src/test/java/com/blackberry/jwteditor/JWEDetectionTests.java +++ b/src/test/java/com/blackberry/jwteditor/JWEDetectionTests.java @@ -21,6 +21,7 @@ import com.blackberry.jwteditor.model.jose.JOSEObject; import com.blackberry.jwteditor.model.jose.JWE; import com.blackberry.jwteditor.model.jose.MutableJOSEObject; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; @@ -63,7 +64,7 @@ void testExtractValidJWE(String joseObjectString) { List joseObjects = extractJOSEObjects(joseObjectString); assertThat(joseObjects).hasSize(1); - assertThat(joseObjects.get(0).getModified()).isInstanceOf(JWE.class); + assertThat(joseObjects.getFirst().getModified()).isInstanceOf(JWE.class); } @ParameterizedTest @@ -74,7 +75,7 @@ void testExtractValidJWEFromWithinData(String joseObjectString) { List joseObjects = extractJOSEObjects(text); assertThat(joseObjects).hasSize(1); - assertThat(joseObjects.get(0).getModified()).isInstanceOf(JWE.class); + assertThat(joseObjects.getFirst().getModified()).isInstanceOf(JWE.class); } @ParameterizedTest @@ -131,4 +132,15 @@ void testParseInvalidJWE(String joseObjectString) { assertThat(joseObject).isEmpty(); } + + @Test + void testParseMultipleJWE() { + String jwe1 = "eyJlbmMiOiJBMTI4R0NNIiwiYWxnIjoiZGlyIn0..FofRkmAUlKShyhYp.1AjXmQsKwV36LSxZ5YJq7xPPTTUS_e9FyLbd-CWdX72ESWMttHm2xGDWUl-Sp9grmcINWLNwsKezYnJVncfir2o9Uq9vcXENIypU2Qwmymn5q5gJwkR4Wx_RLae9Zm8xP76LJFQe8FssUVHx65Zzvd1I6GbV6FjfbkLF1Z_Ka-olubtWCilFDjIVN7WRUAxmV8syJaM.P0XjuL8_8nK50paY09mB6g"; + String jwe2 = "eyJlbmMiOiJBMTI4R0NNIiwiYWxnIjoiQTEyOEtXIn0.H3X6mT5HLgcFfzLoe4ku6Knhh9Ofv1eL.qF5-N_7K8VQ4yMSz.WXUNY6eg5fR4tc8Hqf5XDRM9ALGwcQyYG4IYwwg8Ctkx1UuxoV7t6UnemjzCj2sOYUqi3KYpDzrKVJpzokz0vcIem4lFe5N_ds8FAMpW0GSF9ePA8qvV99WaP0N2ECVPmgihvL6qwNhdptlLKtxcOpE41U5LnU22voPK55VF4_1j0WmTgWgZ7DwLDysp6EIDjrrt-DY.febBmP71KADmKRVfeSnv_g"; + String data = jwe1 + " " + jwe2; + + List joseObjects = extractJOSEObjects(data); + + assertThat(joseObjects).extracting("original").containsExactly(jwe1, jwe2); + } } diff --git a/src/test/java/com/blackberry/jwteditor/JWSDetectionTests.java b/src/test/java/com/blackberry/jwteditor/JWSDetectionTests.java index 0b09d8a..1a0e282 100644 --- a/src/test/java/com/blackberry/jwteditor/JWSDetectionTests.java +++ b/src/test/java/com/blackberry/jwteditor/JWSDetectionTests.java @@ -21,6 +21,7 @@ import com.blackberry.jwteditor.model.jose.JOSEObject; import com.blackberry.jwteditor.model.jose.JWS; import com.blackberry.jwteditor.model.jose.MutableJOSEObject; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.MethodSource; @@ -88,7 +89,7 @@ void testExtractValidJWS(String joseObjectString) { List joseObjects = extractJOSEObjects(joseObjectString); assertThat(joseObjects).hasSize(1); - assertThat(joseObjects.get(0).getModified()).isInstanceOf(JWS.class); + assertThat(joseObjects.getFirst().getModified()).isInstanceOf(JWS.class); } @ParameterizedTest @@ -98,7 +99,7 @@ void testExtractValidJWSWithWhitespace(String joseObjectString) { List joseObjects = extractJOSEObjects(text); assertThat(joseObjects).hasSize(1); - assertThat(joseObjects.get(0).getModified()).isInstanceOf(JWS.class); + assertThat(joseObjects.getFirst().getModified()).isInstanceOf(JWS.class); } @ParameterizedTest @@ -108,7 +109,7 @@ void testExtractValidJWSFromWithinData(String joseObjectString) { List joseObjects = extractJOSEObjects(text); assertThat(joseObjects).hasSize(1); - assertThat(joseObjects.get(0).getModified()).isInstanceOf(JWS.class); + assertThat(joseObjects.getFirst().getModified()).isInstanceOf(JWS.class); } @ParameterizedTest @@ -172,4 +173,16 @@ void testParseInvalidJWS(String joseObjectString) { assertThat(joseObject).isEmpty(); } + + @Test + void testParseMultipleJWS() { + String jws1 = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJUZXN0In0.Nabf3xakZubPnCzHT-fx0vG1iuNPeJKuSzHxUiQKf-8"; + String jws2 = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJUZXN0In0."; + String jws3 = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.e30.17DlZn0zeYhz3uTQCRpSx9hYlUj1SJxDMeZLof8dSHw"; + String data = jws1 + " " + jws2 + " " + jws3; + + List joseObjects = extractJOSEObjects(data); + + assertThat(joseObjects).extracting("original").containsExactly(jws1, jws2, jws3); + } }