From 0fbdec95d362b7517a375c46f6edc3ac0160b51d Mon Sep 17 00:00:00 2001 From: Nadim Ritter Date: Tue, 18 Jun 2024 13:17:50 +0200 Subject: [PATCH 1/2] SEBSP-143 add utf8 url encoding for screen proctoring --- .../impl/proctoring/ScreenProctoringAPIBinding.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/session/impl/proctoring/ScreenProctoringAPIBinding.java b/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/session/impl/proctoring/ScreenProctoringAPIBinding.java index e1f231b7f..6b31def82 100644 --- a/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/session/impl/proctoring/ScreenProctoringAPIBinding.java +++ b/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/session/impl/proctoring/ScreenProctoringAPIBinding.java @@ -680,10 +680,10 @@ String createSEBSession( params.add(SPS_API.SESSION.ATTR_UUID, token); params.add(SPS_API.SESSION.ATTR_GROUP_ID, localGroup.uuid); params.add(SPS_API.SESSION.ATTR_CLIENT_IP, clientConnection.getClientAddress()); - params.add(SPS_API.SESSION.ATTR_CLIENT_NAME, clientConnection.getExamUserSessionId()); - params.add(SPS_API.SESSION.ATTR_CLIENT_MACHINE_NAME, clientConnection.getClientMachineName()); - params.add(SPS_API.SESSION.ATTR_CLIENT_OS_NAME, clientConnection.getClientOsName()); - params.add(SPS_API.SESSION.ATTR_CLIENT_VERSION, clientConnection.getClientVersion()); + params.add(SPS_API.SESSION.ATTR_CLIENT_NAME, Utils.encodeFormURL_UTF_8(clientConnection.getExamUserSessionId())); + params.add(SPS_API.SESSION.ATTR_CLIENT_MACHINE_NAME, Utils.encodeFormURL_UTF_8(clientConnection.getClientMachineName())); + params.add(SPS_API.SESSION.ATTR_CLIENT_OS_NAME, Utils.encodeFormURL_UTF_8(clientConnection.getClientOsName())); + params.add(SPS_API.SESSION.ATTR_CLIENT_VERSION, Utils.encodeFormURL_UTF_8(clientConnection.getClientVersion())); final String paramsFormEncoded = Utils.toAppFormUrlEncodedBody(params); final ResponseEntity exchange = apiTemplate.exchange(uri, paramsFormEncoded); From a8bcaa53e57362153816c694c88710a875559d18 Mon Sep 17 00:00:00 2001 From: Nadim Ritter Date: Wed, 19 Jun 2024 16:11:36 +0200 Subject: [PATCH 2/2] SEBSP-143 add utf8 encoding to body encoding function --- .../ch/ethz/seb/sebserver/gbl/util/Utils.java | 63 ++++++++++++------- .../ScreenProctoringAPIBinding.java | 16 ++--- 2 files changed, 50 insertions(+), 29 deletions(-) diff --git a/src/main/java/ch/ethz/seb/sebserver/gbl/util/Utils.java b/src/main/java/ch/ethz/seb/sebserver/gbl/util/Utils.java index eb05cd3ea..63e01f703 100644 --- a/src/main/java/ch/ethz/seb/sebserver/gbl/util/Utils.java +++ b/src/main/java/ch/ethz/seb/sebserver/gbl/util/Utils.java @@ -648,27 +648,24 @@ public static String toAppFormUrlEncodedBody(final MultiValueMap return StringUtils.EMPTY; } - return attributes - .entrySet() - .stream() - .reduce( - new StringBuilder(), - (sb, entry) -> { - final String name = entry.getKey(); - final List values = entry.getValue(); - if (values == null) { - return sb; - } - if (!sb.isEmpty()) { - sb.append(Constants.AMPERSAND); - } - if (values.size() == 1) { - return sb.append(name).append(Constants.EQUALITY_SIGN).append(values.get(0)); - } - return sb.append(toAppFormUrlEncodedBody(name, values)); - }, - StringBuilder::append) - .toString(); + return reduceFormUrlAttributes(attributes); + } + + public static String toAppFormUrlEncodedBodyForSPService(final MultiValueMap attributes) { + if (attributes == null) { + return StringUtils.EMPTY; + } + + for (String key : attributes.keySet()) { + List values = attributes.get(key); + if (values != null) { + for (int i = 0; i < values.size(); i++) { + values.set(i, encodeFormURL_UTF_8(values.get(i))); + } + } + } + + return reduceFormUrlAttributes(attributes); } public static String toAppFormUrlEncodedBody(@NotNull final String name, final Collection array) { @@ -925,4 +922,28 @@ public static Set getIdsFromString(final String idsString) { .filter(Objects::nonNull) .collect(Collectors.toSet()); } + + private static String reduceFormUrlAttributes(final MultiValueMap attributes){ + return attributes + .entrySet() + .stream() + .reduce( + new StringBuilder(), + (sb, entry) -> { + final String name = entry.getKey(); + final List values = entry.getValue(); + if (values == null) { + return sb; + } + if (!sb.isEmpty()) { + sb.append(Constants.AMPERSAND); + } + if (values.size() == 1) { + return sb.append(name).append(Constants.EQUALITY_SIGN).append(values.get(0)); + } + return sb.append(toAppFormUrlEncodedBody(name, values)); + }, + StringBuilder::append) + .toString(); + } } diff --git a/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/session/impl/proctoring/ScreenProctoringAPIBinding.java b/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/session/impl/proctoring/ScreenProctoringAPIBinding.java index 8da94edb0..e85ec8ed3 100644 --- a/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/session/impl/proctoring/ScreenProctoringAPIBinding.java +++ b/src/main/java/ch/ethz/seb/sebserver/webservice/servicelayer/session/impl/proctoring/ScreenProctoringAPIBinding.java @@ -680,11 +680,11 @@ String createSEBSession( params.add(SPS_API.SESSION.ATTR_UUID, token); params.add(SPS_API.SESSION.ATTR_GROUP_ID, localGroup.uuid); params.add(SPS_API.SESSION.ATTR_CLIENT_IP, clientConnection.getClientAddress()); - params.add(SPS_API.SESSION.ATTR_CLIENT_NAME, Utils.encodeFormURL_UTF_8(clientConnection.getExamUserSessionId())); - params.add(SPS_API.SESSION.ATTR_CLIENT_MACHINE_NAME, Utils.encodeFormURL_UTF_8(clientConnection.getClientMachineName())); - params.add(SPS_API.SESSION.ATTR_CLIENT_OS_NAME, Utils.encodeFormURL_UTF_8(clientConnection.getClientOsName())); - params.add(SPS_API.SESSION.ATTR_CLIENT_VERSION, Utils.encodeFormURL_UTF_8(clientConnection.getClientVersion())); - final String paramsFormEncoded = Utils.toAppFormUrlEncodedBody(params); + params.add(SPS_API.SESSION.ATTR_CLIENT_NAME, clientConnection.getExamUserSessionId()); + params.add(SPS_API.SESSION.ATTR_CLIENT_MACHINE_NAME, clientConnection.getClientMachineName()); + params.add(SPS_API.SESSION.ATTR_CLIENT_OS_NAME, clientConnection.getClientOsName()); + params.add(SPS_API.SESSION.ATTR_CLIENT_VERSION, clientConnection.getClientVersion()); + final String paramsFormEncoded = Utils.toAppFormUrlEncodedBodyForSPService(params); final ResponseEntity exchange = apiTemplate.exchange(uri, paramsFormEncoded); if (exchange.getStatusCode() != HttpStatus.OK) { @@ -851,7 +851,7 @@ private ScreenProctoringGroup createGroupOnSPS( params.add(SPS_API.GROUP.ATTR_NAME, name); params.add(SPS_API.GROUP.ATTR_DESCRIPTION, description); params.add(SPS_API.GROUP.ATTR_EXAM_ID, spsExamUUID); - final String paramsFormEncoded = Utils.toAppFormUrlEncodedBody(params); + final String paramsFormEncoded = Utils.toAppFormUrlEncodedBodyForSPService(params); final ResponseEntity exchange = apiTemplate.exchange(uri, paramsFormEncoded); if (exchange.getStatusCode() != HttpStatus.OK) { @@ -886,7 +886,7 @@ private void createExam( final String uuid = createExamUUID(exam); final MultiValueMap params = createExamCreationParams(exam, uuid, userIds); - final String paramsFormEncoded = Utils.toAppFormUrlEncodedBody(params); + final String paramsFormEncoded = Utils.toAppFormUrlEncodedBodyForSPService(params); final ResponseEntity exchange = apiTemplate.exchange(uri, paramsFormEncoded); if (exchange.getStatusCode() != HttpStatus.OK) { @@ -996,7 +996,7 @@ private void createSEBAccess( final MultiValueMap params = new LinkedMultiValueMap<>(); params.add(SPS_API.SEB_ACCESS.ATTR_NAME, name); params.add(SPS_API.SEB_ACCESS.ATTR_DESCRIPTION, description); - final String paramsFormEncoded = Utils.toAppFormUrlEncodedBody(params); + final String paramsFormEncoded = Utils.toAppFormUrlEncodedBodyForSPService(params); final ResponseEntity exchange = apiTemplate.exchange(uri, paramsFormEncoded); if (exchange.getStatusCode() != HttpStatus.OK) {