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 eb05cd3e..63e01f70 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 final class Utils { 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 final class Utils { .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 95fba2a0..e3950297 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 @@ -695,7 +695,7 @@ class ScreenProctoringAPIBinding { 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.toAppFormUrlEncodedBody(params); + final String paramsFormEncoded = Utils.toAppFormUrlEncodedBodyForSPService(params); final ResponseEntity exchange = apiTemplate.exchange(uri, paramsFormEncoded); if (exchange.getStatusCode() != HttpStatus.OK) { @@ -910,7 +910,7 @@ class ScreenProctoringAPIBinding { 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) { @@ -945,7 +945,7 @@ class ScreenProctoringAPIBinding { 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) { @@ -1060,7 +1060,7 @@ class ScreenProctoringAPIBinding { 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) {