This is an automated email from the ASF dual-hosted git repository.

rohit pushed a commit to branch 4.18
in repository https://gitbox.apache.org/repos/asf/cloudstack.git


The following commit(s) were added to refs/heads/4.18 by this push:
     new b84744d9a5b server: validate ip address value on update config (#7415)
b84744d9a5b is described below

commit b84744d9a5be77c13a7d6fbb9ad683dca0a0f5cf
Author: Abhishek Kumar <[email protected]>
AuthorDate: Fri Apr 28 16:11:33 2023 +0530

    server: validate ip address value on update config (#7415)
    
    Fixes #6958
    
    Signed-off-by: Abhishek Kumar <[email protected]>
---
 .../configuration/ConfigurationManagerImpl.java    | 28 ++++++++++
 .../ConfigurationManagerImplTest.java              | 65 +++++++++++++++++++++-
 2 files changed, 91 insertions(+), 2 deletions(-)

diff --git 
a/server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java 
b/server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java
index c5a489ba832..9255f9275e9 100644
--- a/server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java
+++ b/server/src/main/java/com/cloud/configuration/ConfigurationManagerImpl.java
@@ -602,6 +602,32 @@ public class ConfigurationManagerImpl extends ManagerBase 
implements Configurati
         });
     }
 
+    protected void validateIpAddressRelatedConfigValues(final String 
configName, final String value) {
+        if (!configName.endsWith(".ip") && !configName.endsWith(".ipaddress") 
&& !configName.endsWith(".iprange")) {
+            return;
+        }
+        if (StringUtils.isEmpty(value)) {
+            return;
+        }
+        final ConfigKey<?> configKey = _configDepot.get(configName);
+        if (configKey == null || !String.class.equals(configKey.type())) {
+            return;
+        }
+        boolean err = (configName.endsWith(".ip") || 
configName.endsWith(".ipaddress")) && !NetUtils.isValidIp4(value);
+        if (configName.endsWith(".iprange")) {
+            err = true;
+            if (value.contains("-")) {
+                String[] ips = value.split("-");
+                if (ips.length == 2 && NetUtils.isValidIp4(ips[0]) && 
NetUtils.isValidIp4(ips[1])) {
+                    err = false;
+                }
+            }
+        }
+        if (err) {
+            throw new InvalidParameterValueException("Invalid IP address 
value(s) specified for the config value");
+        }
+    }
+
     @Override
     public boolean start() {
 
@@ -874,6 +900,8 @@ public class ConfigurationManagerImpl extends ManagerBase 
implements Configurati
             catergory = config.getCategory();
         }
 
+        validateIpAddressRelatedConfigValues(name, value);
+
         if (value == null) {
             return _configDao.findByName(name);
         }
diff --git 
a/server/src/test/java/com/cloud/configuration/ConfigurationManagerImplTest.java
 
b/server/src/test/java/com/cloud/configuration/ConfigurationManagerImplTest.java
index e8bb8fae0b9..47dfa4b79b0 100644
--- 
a/server/src/test/java/com/cloud/configuration/ConfigurationManagerImplTest.java
+++ 
b/server/src/test/java/com/cloud/configuration/ConfigurationManagerImplTest.java
@@ -16,22 +16,37 @@
 // under the License.
 package com.cloud.configuration;
 
-import com.cloud.utils.net.NetUtils;
+import java.util.List;
+
+import org.apache.cloudstack.framework.config.ConfigDepot;
+import org.apache.cloudstack.framework.config.ConfigKey;
 import org.junit.Assert;
+import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
+import org.mockito.Mock;
 import org.mockito.Mockito;
 import org.powermock.api.mockito.PowerMockito;
 import org.powermock.core.classloader.annotations.PrepareForTest;
 import org.powermock.modules.junit4.PowerMockRunner;
 
-import java.util.List;
+import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.storage.StorageManager;
+import com.cloud.utils.net.NetUtils;
 
 
 @RunWith(PowerMockRunner.class)
 @PrepareForTest(NetUtils.class)
 public class ConfigurationManagerImplTest {
+    @Mock
+    ConfigDepot configDepot;
     ConfigurationManagerImpl configurationManagerImplSpy = Mockito.spy(new 
ConfigurationManagerImpl());
+
+    @Before
+    public void setUp() throws Exception {
+        configurationManagerImplSpy._configDepot = configDepot;
+    }
+
     @Test
     public void validateIfIntValueIsInRangeTestValidValueReturnNull() {
         String testVariable = 
configurationManagerImplSpy.validateIfIntValueIsInRange("String name", "3", 
"1-5");
@@ -191,4 +206,50 @@ public class ConfigurationManagerImplTest {
         String testVariable = 
configurationManagerImplSpy.validateRangeOther("NameTest1", 
"ThisShouldNotWork", "ThisShouldWork,ThisShouldAlsoWork,SoShouldThis");
         Assert.assertNotNull(testVariable);
     }
+
+    @Test
+    public void testValidateIpAddressRelatedConfigValuesUnrelated() {
+        
configurationManagerImplSpy.validateIpAddressRelatedConfigValues(StorageManager.PreferredStoragePool.key(),
 "something");
+        
configurationManagerImplSpy.validateIpAddressRelatedConfigValues("config.ip", 
"");
+        
Mockito.when(configurationManagerImplSpy._configDepot.get("config.ip")).thenReturn(null);
+        
configurationManagerImplSpy.validateIpAddressRelatedConfigValues("config.ip", 
"something");
+        ConfigKey<?> key = StorageManager.MountDisabledStoragePool;
+        
Mockito.doReturn(key).when(configurationManagerImplSpy._configDepot).get(StorageManager.MountDisabledStoragePool.key());
+        
configurationManagerImplSpy.validateIpAddressRelatedConfigValues(StorageManager.MountDisabledStoragePool.key(),
 "false");
+    }
+
+    @Test(expected = InvalidParameterValueException.class)
+    public void testValidateIpAddressRelatedConfigValuesInvalidIp() {
+        ConfigKey<String> key = StorageManager.PreferredStoragePool; // Any 
ConfigKey of String type
+        
Mockito.doReturn(key).when(configurationManagerImplSpy._configDepot).get("config.ip");
+        
configurationManagerImplSpy.validateIpAddressRelatedConfigValues("config.ip", 
"abcdefg");
+    }
+
+    @Test
+    public void testValidateIpAddressRelatedConfigValuesValidIp() {
+        ConfigKey<String> key = StorageManager.PreferredStoragePool; // Any 
ConfigKey of String type
+        
Mockito.doReturn(key).when(configurationManagerImplSpy._configDepot).get("config.ip");
+        
configurationManagerImplSpy.validateIpAddressRelatedConfigValues("config.ip", 
"192.168.1.1");
+    }
+
+    @Test(expected = InvalidParameterValueException.class)
+    public void testValidateIpAddressRelatedConfigValuesInvalidIpRange() {
+        ConfigKey<String> key = StorageManager.PreferredStoragePool; // Any 
ConfigKey of String type. 
RemoteAccessVpnManagerImpl.RemoteAccessVpnClientIpRange not accessible here
+        
Mockito.doReturn(key).when(configurationManagerImplSpy._configDepot).get("config.iprange");
+        
configurationManagerImplSpy.validateIpAddressRelatedConfigValues("config.iprange",
 "xyz-192.168.1.20");
+    }
+
+    @Test(expected = InvalidParameterValueException.class)
+    public void testValidateIpAddressRelatedConfigValuesInvalidIpRange1() {
+        ConfigKey<String> key = StorageManager.PreferredStoragePool; // Any 
ConfigKey of String type. 
RemoteAccessVpnManagerImpl.RemoteAccessVpnClientIpRange not accessible here
+        
Mockito.doReturn(key).when(configurationManagerImplSpy._configDepot).get("config.iprange");
+        
configurationManagerImplSpy.validateIpAddressRelatedConfigValues("config.iprange",
 "192.168.1.20");
+    }
+
+    @Test
+    public void testValidateIpAddressRelatedConfigValuesValidIpRange() {
+        ConfigKey<String> key = StorageManager.PreferredStoragePool; // Any 
ConfigKey of String type. 
RemoteAccessVpnManagerImpl.RemoteAccessVpnClientIpRange not accessible here
+        
Mockito.doReturn(key).when(configurationManagerImplSpy._configDepot).get("config.iprange");
+        
configurationManagerImplSpy.validateIpAddressRelatedConfigValues("config.iprange",
 "192.168.1.1-192.168.1.100");
+    }
 }

Reply via email to