Skip to content

Commit 09c7da4

Browse files
vishesh92sureshanaparti
authored andcommitted
Add validation for secstorage.allowed.internal.sites (apache#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 113bcef commit 09c7da4

5 files changed

Lines changed: 43 additions & 1 deletion

File tree

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -307,6 +307,8 @@
307307
import com.google.common.collect.Sets;
308308
import com.googlecode.ipv6.IPv6Network;
309309

310+
import static com.cloud.configuration.Config.SecStorageAllowedInternalDownloadSites;
311+
310312
public class ConfigurationManagerImpl extends ManagerBase implements ConfigurationManager, ConfigurationService, Configurable {
311313
public static final String PERACCOUNT = "peraccount";
312314
public static final String PERZONE = "perzone";
@@ -1330,6 +1332,18 @@ protected String validateConfigurationValue(final String name, String value, fin
13301332
}
13311333
}
13321334

1335+
if (type.equals(String.class)) {
1336+
if (name.equalsIgnoreCase(SecStorageAllowedInternalDownloadSites.key()) && StringUtils.isNotEmpty(value)) {
1337+
final String[] cidrs = value.split(",");
1338+
for (final String cidr : cidrs) {
1339+
if (!NetUtils.isValidIp4(cidr) && !NetUtils.isValidIp6(cidr) && !NetUtils.getCleanIp4Cidr(cidr).equals(cidr)) {
1340+
s_logger.error(String.format("Invalid CIDR %s value specified for the config %s", cidr, name));
1341+
throw new InvalidParameterValueException(String.format("Invalid CIDR %s value specified for the config %s", cidr, name));
1342+
}
1343+
}
1344+
}
1345+
}
1346+
13331347
if (configuration == null ) {
13341348
//range validation has to be done per case basis, for now
13351349
//return in case of Configkey parameters

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,8 @@
157157
import com.cloud.vm.dao.UserVmDetailsDao;
158158
import com.cloud.vm.dao.VMInstanceDao;
159159

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

ui/src/views/setting/ConfigurationValue.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -274,7 +274,7 @@ export default {
274274
this.$message.error(this.$t('message.error.save.setting'))
275275
this.$notification.error({
276276
message: this.$t('label.error'),
277-
description: this.$t('message.error.save.setting')
277+
description: error?.response?.data?.updateconfigurationresponse?.errortext || this.$t('message.error.save.setting')
278278
})
279279
}).finally(() => {
280280
this.valueLoading = false

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -628,6 +628,18 @@ public static String getCidrFromGatewayAndNetmask(final String gatewayStr, final
628628
return long2Ip(firstPart) + "/" + size;
629629
}
630630

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

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

Lines changed: 11 additions & 0 deletions
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)