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

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


The following commit(s) were added to refs/heads/4.20 by this push:
     new bbf8c1a05ca server: do not NPE when a VPN provider returns no per-user 
result (#14047)
bbf8c1a05ca is described below

commit bbf8c1a05cabe14c75fe73b4bc5feb20aedbfccb
Author: Ramgopal Nagaboina <[email protected]>
AuthorDate: Tue Sep 8 07:56:03 2026 -0400

    server: do not NPE when a VPN provider returns no per-user result (#14047)
---
 .../network/vpn/RemoteAccessVpnManagerImpl.java    |  2 +-
 .../vpn/RemoteAccessVpnManagerImplTest.java        | 50 ++++++++++++++++++++++
 2 files changed, 51 insertions(+), 1 deletion(-)

diff --git 
a/server/src/main/java/com/cloud/network/vpn/RemoteAccessVpnManagerImpl.java 
b/server/src/main/java/com/cloud/network/vpn/RemoteAccessVpnManagerImpl.java
index 29c0106dc18..1d93e73697d 100644
--- a/server/src/main/java/com/cloud/network/vpn/RemoteAccessVpnManagerImpl.java
+++ b/server/src/main/java/com/cloud/network/vpn/RemoteAccessVpnManagerImpl.java
@@ -603,7 +603,7 @@ public class RemoteAccessVpnManagerImpl extends ManagerBase 
implements RemoteAcc
 
         for (int i = 0; i < finals.length; i++) {
             final VpnUserVO user = users.get(i);
-            if (finals[i]) {
+            if (Boolean.TRUE.equals(finals[i])) {
                 if (user.getState() == State.Add) {
                     user.setState(State.Active);
                     _vpnUsersDao.update(user.getId(), user);
diff --git 
a/server/src/test/java/com/cloud/network/vpn/RemoteAccessVpnManagerImplTest.java
 
b/server/src/test/java/com/cloud/network/vpn/RemoteAccessVpnManagerImplTest.java
index f8b4362e76b..ab866449e5c 100644
--- 
a/server/src/test/java/com/cloud/network/vpn/RemoteAccessVpnManagerImplTest.java
+++ 
b/server/src/test/java/com/cloud/network/vpn/RemoteAccessVpnManagerImplTest.java
@@ -15,9 +15,23 @@
 package com.cloud.network.vpn;
 
 import com.cloud.exception.InvalidParameterValueException;
+import com.cloud.network.VpnUser.State;
+import com.cloud.network.VpnUserVO;
+import com.cloud.network.dao.RemoteAccessVpnDao;
+import com.cloud.network.dao.RemoteAccessVpnVO;
+import com.cloud.network.dao.VpnUserDao;
+import com.cloud.network.element.RemoteAccessVPNServiceProvider;
+import com.cloud.user.Account;
+import com.cloud.user.AccountManager;
+import com.cloud.user.AccountVO;
+import com.cloud.user.dao.AccountDao;
 import com.cloud.utils.exception.CloudRuntimeException;
 import com.cloud.utils.net.NetUtils;
 import junit.framework.TestCase;
+import org.apache.cloudstack.context.CallContext;
+import org.springframework.test.util.ReflectionTestUtils;
+
+import java.util.Collections;
 import org.junit.Assert;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -222,4 +236,40 @@ public class RemoteAccessVpnManagerImplTest extends 
TestCase {
 
         assertEquals(expectedMessage, assertThrows.getMessage());
     }
+
+    @Test
+    public void applyVpnUsersHandlesNullProviderResultWithoutNpe() throws 
Exception {
+        RemoteAccessVpnManagerImpl mgr = new RemoteAccessVpnManagerImpl();
+
+        AccountDao accountDao = Mockito.mock(AccountDao.class);
+        AccountManager accountMgr = Mockito.mock(AccountManager.class);
+        VpnUserDao vpnUsersDao = Mockito.mock(VpnUserDao.class);
+        RemoteAccessVpnDao remoteAccessVpnDao = 
Mockito.mock(RemoteAccessVpnDao.class);
+        RemoteAccessVPNServiceProvider provider = 
Mockito.mock(RemoteAccessVPNServiceProvider.class);
+        ReflectionTestUtils.setField(mgr, "_accountDao", accountDao);
+        ReflectionTestUtils.setField(mgr, "_accountMgr", accountMgr);
+        ReflectionTestUtils.setField(mgr, "_vpnUsersDao", vpnUsersDao);
+        ReflectionTestUtils.setField(mgr, "_remoteAccessVpnDao", 
remoteAccessVpnDao);
+        ReflectionTestUtils.setField(mgr, "_vpnServiceProviders", 
Collections.singletonList(provider));
+
+        
Mockito.when(accountDao.findById(1L)).thenReturn(Mockito.mock(AccountVO.class));
+
+        RemoteAccessVpnVO vpn = Mockito.mock(RemoteAccessVpnVO.class);
+        Mockito.when(vpn.getNetworkId()).thenReturn(null);
+        
Mockito.when(remoteAccessVpnDao.findByAccount(1L)).thenReturn(Collections.singletonList(vpn));
+
+        VpnUserVO user = Mockito.mock(VpnUserVO.class);
+        Mockito.when(user.getState()).thenReturn(State.Revoke);
+        
Mockito.when(vpnUsersDao.listByAccount(1L)).thenReturn(Collections.singletonList(user));
+
+        Mockito.when(provider.applyVpnUsers(Mockito.eq(vpn), 
Mockito.anyList())).thenReturn(null);
+
+        try (MockedStatic<CallContext> callContextMock = 
Mockito.mockStatic(CallContext.class)) {
+            CallContext callContext = Mockito.mock(CallContext.class);
+            callContextMock.when(CallContext::current).thenReturn(callContext);
+            
Mockito.when(callContext.getCallingAccount()).thenReturn(Mockito.mock(Account.class));
+
+            Assert.assertTrue(mgr.applyVpnUsers(1L, "someuser", false));
+        }
+    }
 }

Reply via email to