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));
+ }
+ }
}