From 42b70e77bcdd59de681523ece5e4b7bf3b862daf Mon Sep 17 00:00:00 2001 From: Pearl Dsilva Date: Thu, 24 Apr 2025 18:06:51 +0530 Subject: [PATCH 1/2] Allow emojis to be accepted in volume name during volume creation --- .../resource/XenServerStorageProcessor.java | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/XenServerStorageProcessor.java b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/XenServerStorageProcessor.java index 4298c9a72189..7114d4aaea6b 100644 --- a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/XenServerStorageProcessor.java +++ b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/XenServerStorageProcessor.java @@ -23,6 +23,7 @@ import static com.google.common.collect.Lists.newArrayList; import java.io.File; +import java.io.UnsupportedEncodingException; import java.net.URI; import java.util.ArrayList; import java.util.Arrays; @@ -810,7 +811,7 @@ public Answer createVolume(final CreateObjectCommand cmd) { final SR poolSr = hypervisorResource.getStorageRepository(conn, CitrixHelper.getSRNameLabel(primaryStore.getUuid(), primaryStore.getPoolType(), primaryStore.getPath())); VDI.Record vdir = new VDI.Record(); - vdir.nameLabel = volume.getName(); + vdir.nameLabel = getEncodedVolumeName(volume.getName()); vdir.SR = poolSr; vdir.type = Types.VdiType.USER; @@ -831,6 +832,18 @@ public Answer createVolume(final CreateObjectCommand cmd) { } } + private String getEncodedVolumeName(String volumeName) throws UnsupportedEncodingException { + byte[] utf8Bytes = volumeName.getBytes("UTF-8"); + // Decode UTF-8 into a Java String (UTF-16) + String decoded = new String(utf8Bytes, "UTF-8"); + // Print each code unit as a Unicode escape + StringBuilder unicodeEscaped = new StringBuilder(); + for (char ch : decoded.toCharArray()) { + unicodeEscaped.append(String.format("\\u%04X", (int) ch)); + } + return unicodeEscaped.toString(); + } + @Override public Answer cloneVolumeFromBaseTemplate(final CopyCommand cmd) { final Connection conn = hypervisorResource.getConnection(); From c74cdef0c946c112792f7aa28f04c257c0a79e13 Mon Sep 17 00:00:00 2001 From: Pearl Dsilva Date: Fri, 25 Apr 2025 12:29:39 +0530 Subject: [PATCH 2/2] escape only non-ASCII characters --- .../resource/XenServerStorageProcessor.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/XenServerStorageProcessor.java b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/XenServerStorageProcessor.java index 7114d4aaea6b..1d405316ad73 100644 --- a/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/XenServerStorageProcessor.java +++ b/plugins/hypervisors/xenserver/src/main/java/com/cloud/hypervisor/xenserver/resource/XenServerStorageProcessor.java @@ -838,9 +838,17 @@ private String getEncodedVolumeName(String volumeName) throws UnsupportedEncodin String decoded = new String(utf8Bytes, "UTF-8"); // Print each code unit as a Unicode escape StringBuilder unicodeEscaped = new StringBuilder(); - for (char ch : decoded.toCharArray()) { - unicodeEscaped.append(String.format("\\u%04X", (int) ch)); + for (int i = 0; i < decoded.length(); i++) { + char ch = decoded.charAt(i); + if (ch <= 127 && Character.isLetterOrDigit(ch)) { + // Keep ASCII alphanumerics as-is + unicodeEscaped.append(ch); + } else { + // Escape non-ASCII characters + unicodeEscaped.append(String.format("\\u%04X", (int) ch)); + } } + return unicodeEscaped.toString(); }