Skip to content

Commit 0ba9a29

Browse files
Add validation for secstorage.allowed.internal.sites (#9567)
* Add validation for secstorage.allowed.internal.sites * Address comments * Apply suggestions from code review Co-authored-by: Suresh Kumar Anaparti <sureshkumar.anaparti@gmail.com> * Address comments --------- Co-authored-by: Suresh Kumar Anaparti <sureshkumar.anaparti@gmail.com>
1 parent 1ca9a10 commit 0ba9a29

File tree

5 files changed

+43
-1
lines changed

5 files changed

+43
-1
lines changed

server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java

+14
Original file line numberDiff line numberDiff line change
@@ -303,6 +303,8 @@
303303
import com.google.common.collect.Sets;
304304
import com.googlecode.ipv6.IPv6Network;
305305

306+
import static com.cloud.configuration.Config.SecStorageAllowedInternalDownloadSites;
307+
306308
public class ConfigurationManagerImpl extends ManagerBase implements ConfigurationManager, ConfigurationService, Configurable {
307309
public static final Logger s_logger = Logger.getLogger(ConfigurationManagerImpl.class);
308310
public static final String PERACCOUNT = "peraccount";
@@ -1314,6 +1316,18 @@ protected String validateConfigurationValue(final String name, String value, fin
13141316
}
13151317
}
13161318

1319+
if (type.equals(String.class)) {
1320+
if (name.equalsIgnoreCase(SecStorageAllowedInternalDownloadSites.key()) && StringUtils.isNotEmpty(value)) {
1321+
final String[] cidrs = value.split(",");
1322+
for (final String cidr : cidrs) {
1323+
if (!NetUtils.isValidIp4(cidr) && !NetUtils.isValidIp6(cidr) && !NetUtils.getCleanIp4Cidr(cidr).equals(cidr)) {
1324+
s_logger.error(String.format("Invalid CIDR %s value specified for the config %s", cidr, name));
1325+
throw new InvalidParameterValueException(String.format("Invalid CIDR %s value specified for the config %s", cidr, name));
1326+
}
1327+
}
1328+
}
1329+
}
1330+
13171331
if (configuration == null ) {
13181332
//range validation has to be done per case basis, for now
13191333
//return in case of Configkey parameters

services/secondary-storage/controller/src/main/java/org/apache/cloudstack/secondarystorage/SecondaryStorageManagerImpl.java

+5
Original file line numberDiff line numberDiff line change
@@ -158,6 +158,8 @@
158158
import com.cloud.vm.dao.UserVmDetailsDao;
159159
import com.cloud.vm.dao.VMInstanceDao;
160160

161+
import static com.cloud.configuration.Config.SecStorageAllowedInternalDownloadSites;
162+
161163
/**
162164
* Class to manage secondary storages. <br><br>
163165
* Possible secondary storage VM state transition cases:<br>
@@ -401,6 +403,9 @@ private List<String> getAllowedInternalSiteCidrs() {
401403
String[] cidrs = _allowedInternalSites.split(",");
402404
for (String cidr : cidrs) {
403405
if (NetUtils.isValidIp4Cidr(cidr) || NetUtils.isValidIp4(cidr) || !cidr.startsWith("0.0.0.0")) {
406+
if (NetUtils.getCleanIp4Cidr(cidr).equals(cidr)) {
407+
s_logger.warn(String.format("Invalid CIDR %s in %s", cidr, SecStorageAllowedInternalDownloadSites.key()));
408+
}
404409
allowedCidrs.add(cidr);
405410
}
406411
}

ui/src/views/setting/ConfigurationValue.vue

+1-1
Original file line numberDiff line numberDiff line change
@@ -266,7 +266,7 @@ export default {
266266
this.$message.error(this.$t('message.error.save.setting'))
267267
this.$notification.error({
268268
message: this.$t('label.error'),
269-
description: this.$t('message.error.save.setting')
269+
description: error?.response?.data?.updateconfigurationresponse?.errortext || this.$t('message.error.save.setting')
270270
})
271271
}).finally(() => {
272272
this.valueLoading = false

utils/src/main/java/com/cloud/utils/net/NetUtils.java

+12
Original file line numberDiff line numberDiff line change
@@ -626,6 +626,18 @@ public static String getCidrFromGatewayAndNetmask(final String gatewayStr, final
626626
return long2Ip(firstPart) + "/" + size;
627627
}
628628

629+
public static String getCleanIp4Cidr(final String cidr) {
630+
if (!isValidIp4Cidr(cidr)) {
631+
throw new CloudRuntimeException("Invalid CIDR: " + cidr);
632+
}
633+
String gateway = cidr.split("/")[0];
634+
Long netmaskSize = Long.parseLong(cidr.split("/")[1]);
635+
final long ip = ip2Long(gateway);
636+
final long startNetMask = ip2Long(getCidrNetmask(netmaskSize));
637+
final long start = (ip & startNetMask);
638+
return String.format("%s/%s", long2Ip(start), netmaskSize);
639+
}
640+
629641
public static String[] getIpRangeFromCidr(final String cidr, final long size) {
630642
assert size < MAX_CIDR : "You do know this is not for ipv6 right? Keep it smaller than 32 but you have " + size;
631643
final String[] result = new String[2];

utils/src/test/java/com/cloud/utils/net/NetUtilsTest.java

+11
Original file line numberDiff line numberDiff line change
@@ -296,6 +296,17 @@ public void testIsValidCIDR() throws Exception {
296296
assertTrue(NetUtils.isValidIp4Cidr(cidrThird));;
297297
}
298298

299+
@Test
300+
public void testGetCleanIp4Cidr() throws Exception {
301+
final String cidrFirst = "10.0.144.0/20";
302+
final String cidrSecond = "10.0.151.5/20";
303+
final String cidrThird = "10.0.144.10/21";
304+
305+
assertEquals(cidrFirst, NetUtils.getCleanIp4Cidr(cidrFirst));
306+
assertEquals("10.0.144.0/20", NetUtils.getCleanIp4Cidr(cidrSecond));
307+
assertEquals("10.0.144.0/21", NetUtils.getCleanIp4Cidr(cidrThird));;
308+
}
309+
299310
@Test
300311
public void testIsValidCidrList() throws Exception {
301312
final String cidrFirst = "10.0.144.0/20,1.2.3.4/32,5.6.7.8/24";

0 commit comments

Comments
 (0)