This is an automated email from the ASF dual-hosted git repository.
dahn 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 56dc11980f6 test_accounts.py failure fix - keep the camelCase
parameter "domainId" (#12689)
56dc11980f6 is described below
commit 56dc11980f6081fc8ce860c102aec1f474493625
Author: Suresh Kumar Anaparti <[email protected]>
AuthorDate: Fri Feb 27 16:06:18 2026 +0530
test_accounts.py failure fix - keep the camelCase parameter "domainId"
(#12689)
---
.../org/apache/cloudstack/api/ApiServerService.java | 2 ++
.../api/command/OauthLoginAPIAuthenticatorCmd.java | 8 ++++----
.../command/OauthLoginAPIAuthenticatorCmdTest.java | 19 +++++++++++++++++++
server/src/main/java/com/cloud/api/ApiServer.java | 20 ++++++++++++++++++++
.../api/auth/DefaultLoginAPIAuthenticatorCmd.java | 9 +++++----
5 files changed, 50 insertions(+), 8 deletions(-)
diff --git a/api/src/main/java/org/apache/cloudstack/api/ApiServerService.java
b/api/src/main/java/org/apache/cloudstack/api/ApiServerService.java
index cbbcdc3bda4..a422129ad21 100644
--- a/api/src/main/java/org/apache/cloudstack/api/ApiServerService.java
+++ b/api/src/main/java/org/apache/cloudstack/api/ApiServerService.java
@@ -48,4 +48,6 @@ public interface ApiServerService {
boolean forgotPassword(UserAccount userAccount, Domain domain);
boolean resetPassword(UserAccount userAccount, String token, String
password);
+
+ String getDomainId(Map<String, Object[]> params);
}
diff --git
a/plugins/user-authenticators/oauth2/src/main/java/org/apache/cloudstack/oauth2/api/command/OauthLoginAPIAuthenticatorCmd.java
b/plugins/user-authenticators/oauth2/src/main/java/org/apache/cloudstack/oauth2/api/command/OauthLoginAPIAuthenticatorCmd.java
index 88e678bcc26..e273358e83e 100644
---
a/plugins/user-authenticators/oauth2/src/main/java/org/apache/cloudstack/oauth2/api/command/OauthLoginAPIAuthenticatorCmd.java
+++
b/plugins/user-authenticators/oauth2/src/main/java/org/apache/cloudstack/oauth2/api/command/OauthLoginAPIAuthenticatorCmd.java
@@ -176,14 +176,14 @@ public class OauthLoginAPIAuthenticatorCmd extends
BaseCmd implements APIAuthent
}
protected Long getDomainIdFromParams(Map<String, Object[]> params,
StringBuilder auditTrailSb, String responseType) {
- String[] domainIdArr = (String[])params.get(ApiConstants.DOMAIN_ID);
+ String domainIdStr = _apiServer.getDomainId(params);
Long domainId = null;
- if (domainIdArr != null && domainIdArr.length > 0) {
+ if (StringUtils.isNotEmpty(domainIdStr)) {
try {
//check if UUID is passed in for domain
- domainId = _apiServer.fetchDomainId(domainIdArr[0]);
+ domainId = _apiServer.fetchDomainId(domainIdStr);
if (domainId == null) {
- domainId = Long.parseLong(domainIdArr[0]);
+ domainId = Long.parseLong(domainIdStr);
}
auditTrailSb.append(" domainid=" + domainId);// building the
params for POST call
} catch (final NumberFormatException e) {
diff --git
a/plugins/user-authenticators/oauth2/src/test/java/org/apache/cloudstack/oauth2/api/command/OauthLoginAPIAuthenticatorCmdTest.java
b/plugins/user-authenticators/oauth2/src/test/java/org/apache/cloudstack/oauth2/api/command/OauthLoginAPIAuthenticatorCmdTest.java
index ccbb53cfc80..962ffefd5ce 100644
---
a/plugins/user-authenticators/oauth2/src/test/java/org/apache/cloudstack/oauth2/api/command/OauthLoginAPIAuthenticatorCmdTest.java
+++
b/plugins/user-authenticators/oauth2/src/test/java/org/apache/cloudstack/oauth2/api/command/OauthLoginAPIAuthenticatorCmdTest.java
@@ -85,10 +85,29 @@ public class OauthLoginAPIAuthenticatorCmdTest {
ApiServer apiServer = mock(ApiServer.class);
cmd._apiServer = apiServer;
when(apiServer.fetchDomainId("1234")).thenReturn(5678L);
+ when(apiServer.getDomainId(params)).thenCallRealMethod();
Long domainId = cmd.getDomainIdFromParams(params, auditTrailSb,
responseType);
assertEquals(Long.valueOf(5678), domainId);
assertEquals(" domainid=5678", auditTrailSb.toString());
}
+
+ @Test
+ public void testGetDomainIdFromCamelCaseParam() {
+ StringBuilder auditTrailSb = new StringBuilder();
+ String responseType = "json";
+ Map<String, Object[]> params = new HashMap<>();
+ params.put(ApiConstants.DOMAIN_ID, null);
+ params.put(ApiConstants.DOMAIN__ID, new String[]{"5678"});
+ ApiServer apiServer = mock(ApiServer.class);
+ cmd._apiServer = apiServer;
+ when(apiServer.fetchDomainId("5678")).thenReturn(1234L);
+ when(apiServer.getDomainId(params)).thenCallRealMethod();
+
+ Long domainId = cmd.getDomainIdFromParams(params, auditTrailSb,
responseType);
+
+ assertEquals(Long.valueOf(1234), domainId);
+ assertEquals(" domainid=1234", auditTrailSb.toString());
+ }
}
diff --git a/server/src/main/java/com/cloud/api/ApiServer.java
b/server/src/main/java/com/cloud/api/ApiServer.java
index 85d58ec0d53..3a89c7bde23 100644
--- a/server/src/main/java/com/cloud/api/ApiServer.java
+++ b/server/src/main/java/com/cloud/api/ApiServer.java
@@ -115,6 +115,7 @@ import
org.apache.cloudstack.framework.messagebus.MessageHandler;
import org.apache.cloudstack.managed.context.ManagedContextRunnable;
import org.apache.cloudstack.user.UserPasswordResetManager;
import org.apache.commons.codec.binary.Base64;
+import org.apache.commons.collections.MapUtils;
import org.apache.commons.lang3.EnumUtils;
import org.apache.http.ConnectionClosedException;
import org.apache.http.HttpException;
@@ -1354,6 +1355,25 @@ public class ApiServer extends ManagerBase implements
HttpRequestHandler, ApiSer
return userPasswordResetManager.validateAndResetPassword(userAccount,
token, password);
}
+ @Override
+ public String getDomainId(Map<String, Object[]> params) {
+ if (MapUtils.isEmpty(params)) {
+ return null;
+ }
+
+ String[] domainIdArr = (String[])params.get(ApiConstants.DOMAIN_ID);
+ if (domainIdArr == null) {
+ // Fallback to support clients using the camelCase parameter name
"domainId"
+ domainIdArr = (String[])params.get(ApiConstants.DOMAIN__ID);
+ }
+
+ if (domainIdArr == null || domainIdArr.length == 0) {
+ return null;
+ }
+
+ return domainIdArr[0];
+ }
+
private void checkCommandAvailable(final User user, final String
commandName, final InetAddress remoteAddress) throws PermissionDeniedException {
if (user == null) {
throw new PermissionDeniedException("User is null for role based
API access check for command" + commandName);
diff --git
a/server/src/main/java/com/cloud/api/auth/DefaultLoginAPIAuthenticatorCmd.java
b/server/src/main/java/com/cloud/api/auth/DefaultLoginAPIAuthenticatorCmd.java
index 86f2a63a6a5..41174c37be2 100644
---
a/server/src/main/java/com/cloud/api/auth/DefaultLoginAPIAuthenticatorCmd.java
+++
b/server/src/main/java/com/cloud/api/auth/DefaultLoginAPIAuthenticatorCmd.java
@@ -20,6 +20,7 @@ import com.cloud.api.ApiServlet;
import com.cloud.domain.Domain;
import com.cloud.user.User;
import com.cloud.user.UserAccount;
+import com.cloud.utils.StringUtils;
import org.apache.cloudstack.api.ApiServerService;
import com.cloud.api.response.ApiResponseSerializer;
import com.cloud.exception.CloudAuthenticationException;
@@ -110,14 +111,14 @@ public class DefaultLoginAPIAuthenticatorCmd extends
BaseCmd implements APIAuthe
// FIXME: ported from ApiServlet, refactor and cleanup
final String[] username = (String[])params.get(ApiConstants.USERNAME);
final String[] password = (String[])params.get(ApiConstants.PASSWORD);
- final String[] domainIdArr =
(String[])params.get(ApiConstants.DOMAIN_ID);
+ String domainIdStr = _apiServer.getDomainId(params);
Long domainId = null;
- if (domainIdArr != null && domainIdArr.length > 0) {
+ if (StringUtils.isNotEmpty(domainIdStr)) {
try {
//check if UUID is passed in for domain
- domainId = _apiServer.fetchDomainId(domainIdArr[0]);
+ domainId = _apiServer.fetchDomainId(domainIdStr);
if (domainId == null) {
- domainId = Long.parseLong(domainIdArr[0]);
+ domainId = Long.parseLong(domainIdStr);
}
auditTrailSb.append(" domainid=" + domainId);// building the
params for POST call
} catch (final NumberFormatException e) {