Skip to content

Commit fdd3f93

Browse files
committed
fix: percent-encode vCenter datacenter/cluster/host names in virt-v2v URIs
Fixes #13920
1 parent d45d481 commit fdd3f93

1 file changed

Lines changed: 28 additions & 7 deletions

File tree

plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtConvertInstanceCommandWrapper.java

Lines changed: 28 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
package com.cloud.hypervisor.kvm.resource.wrapper;
2020

2121
import java.net.URLEncoder;
22-
import java.nio.charset.Charset;
22+
import java.nio.charset.StandardCharsets;
2323
import java.nio.file.Files;
2424
import java.nio.file.Path;
2525
import java.nio.file.attribute.PosixFilePermission;
@@ -214,10 +214,10 @@ private String getExportOVAUrlFromRemoteInstance(RemoteInstanceTO vmwareInstance
214214
if (StringUtils.isNotBlank(path)) {
215215
logger.info("({}) VM path: {}", originalVMName, path);
216216
return String.format("vi://%s:%s@%s/%s/%s/%s",
217-
encodedUsername, encodedPassword, vcenter, datacenter, path, vm);
217+
encodedUsername, encodedPassword, vcenter, encodePathSegments(datacenter), encodePathSegments(path), encodePathSegment(vm));
218218
}
219219
return String.format("vi://%s:%s@%s/%s/vm/%s",
220-
encodedUsername, encodedPassword, vcenter, datacenter, vm);
220+
encodedUsername, encodedPassword, vcenter, encodePathSegments(datacenter), encodePathSegment(vm));
221221
}
222222

223223
protected void sanitizeDisksPath(List<LibvirtVMDef.DiskDef> disks) {
@@ -296,7 +296,28 @@ protected void addExtraParamsToScript(String extraParams, Script script) {
296296
}
297297

298298
protected String encodeUsername(String username) {
299-
return URLEncoder.encode(username, Charset.defaultCharset());
299+
return URLEncoder.encode(username, StandardCharsets.UTF_8).replace("+", "%20");
300+
}
301+
302+
private String encodePathSegment(String value) {
303+
if (StringUtils.isBlank(value)) {
304+
return value;
305+
}
306+
return URLEncoder.encode(value, StandardCharsets.UTF_8).replace("+", "%20");
307+
}
308+
309+
private String encodePathSegments(String value) {
310+
if (StringUtils.isBlank(value)) {
311+
return value;
312+
}
313+
StringBuilder encoded = new StringBuilder();
314+
for (String seg : value.split("/", -1)) {
315+
if (encoded.length() > 0) {
316+
encoded.append("/");
317+
}
318+
encoded.append(encodePathSegment(seg));
319+
}
320+
return encoded.toString();
300321
}
301322

302323
private String resolveVddkSetting(String commandValue, String agentValue) {
@@ -477,14 +498,14 @@ private String buildVpxUrl(RemoteInstanceTO vmwareInstance) {
477498
.append("@")
478499
.append(vcenter)
479500
.append("/")
480-
.append(datacenter);
501+
.append(encodePathSegments(datacenter));
481502

482503
if (StringUtils.isNotBlank(cluster)) {
483-
url.append("/").append(cluster);
504+
url.append("/").append(encodePathSegments(cluster));
484505
}
485506

486507
if (StringUtils.isNotBlank(host)) {
487-
url.append("/").append(host);
508+
url.append("/").append(encodePathSegment(host));
488509
}
489510

490511
url.append("?no_verify=1");

0 commit comments

Comments
 (0)