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

DaanHoogland pushed a commit to branch ghi3687-domain-admin-ldap-access
in repository https://gitbox.apache.org/repos/asf/cloudstack.git

commit 6d74ade3e6d17c2cc147df1b3dc0f839d19e25a7
Author: Daan Hoogland <[email protected]>
AuthorDate: Sat Aug 22 20:55:56 2026 +0200

    allow domain admins to add ldap users
---
 .../main/resources/META-INF/db/schema-42210to42300.sql | 18 ++++++++++++++++++
 .../cloudstack/api/command/LdapCreateAccountCmd.java   |  3 ++-
 .../cloudstack/api/command/LdapImportUsersCmd.java     |  3 ++-
 3 files changed, 22 insertions(+), 2 deletions(-)

diff --git 
a/engine/schema/src/main/resources/META-INF/db/schema-42210to42300.sql 
b/engine/schema/src/main/resources/META-INF/db/schema-42210to42300.sql
index 417d69a162e..51fbf154713 100644
--- a/engine/schema/src/main/resources/META-INF/db/schema-42210to42300.sql
+++ b/engine/schema/src/main/resources/META-INF/db/schema-42210to42300.sql
@@ -651,3 +651,21 @@ WHERE `name`='user.vm.readonly.details' AND `value` IS NOT 
NULL;
 -- usage records introduced in 4.22.1 (cumulative and per-VM) can coexist. See 
#13399.
 CALL `cloud_usage`.`IDEMPOTENT_DROP_INDEX`('id', 'cloud_usage.usage_volume');
 CALL `cloud_usage`.`IDEMPOTENT_ADD_UNIQUE_INDEX`('cloud_usage.usage_volume', 
'id', '(volume_id ASC, created ASC, vm_id ASC)');
+
+-- Grant ldapCreateAccount, linkAccountToLdap and importLdapUsers to any role 
that can already
+-- create accounts natively (built-in Domain Admin, Resource Admin, and any 
custom role granted
+-- createAccount), matching their @APICommand(authorized=...) declarations. 
See #3687.
+INSERT INTO cloud.role_permissions (uuid, role_id, rule, permission, 
sort_order)
+SELECT uuid(), role_id, 'ldapCreateAccount', permission, sort_order
+FROM cloud.role_permissions rp
+WHERE rule = 'createAccount' AND NOT EXISTS(SELECT 1 FROM 
cloud.role_permissions rp_ WHERE rp.role_id = rp_.role_id AND rp_.rule = 
'ldapCreateAccount');
+
+INSERT INTO cloud.role_permissions (uuid, role_id, rule, permission, 
sort_order)
+SELECT uuid(), role_id, 'linkAccountToLdap', permission, sort_order
+FROM cloud.role_permissions rp
+WHERE rule = 'createAccount' AND NOT EXISTS(SELECT 1 FROM 
cloud.role_permissions rp_ WHERE rp.role_id = rp_.role_id AND rp_.rule = 
'linkAccountToLdap');
+
+INSERT INTO cloud.role_permissions (uuid, role_id, rule, permission, 
sort_order)
+SELECT uuid(), role_id, 'importLdapUsers', permission, sort_order
+FROM cloud.role_permissions rp
+WHERE rule = 'createAccount' AND NOT EXISTS(SELECT 1 FROM 
cloud.role_permissions rp_ WHERE rp.role_id = rp_.role_id AND rp_.rule = 
'importLdapUsers');
diff --git 
a/plugins/user-authenticators/ldap/src/main/java/org/apache/cloudstack/api/command/LdapCreateAccountCmd.java
 
b/plugins/user-authenticators/ldap/src/main/java/org/apache/cloudstack/api/command/LdapCreateAccountCmd.java
index 3aa3e050226..8835c9fe4b0 100644
--- 
a/plugins/user-authenticators/ldap/src/main/java/org/apache/cloudstack/api/command/LdapCreateAccountCmd.java
+++ 
b/plugins/user-authenticators/ldap/src/main/java/org/apache/cloudstack/api/command/LdapCreateAccountCmd.java
@@ -44,7 +44,8 @@ import java.security.NoSuchAlgorithmException;
 import java.security.SecureRandom;
 import java.util.Map;
 
-@APICommand(name = "ldapCreateAccount", description = "Creates an account from 
an LDAP user", responseObject = AccountResponse.class, since = "4.2.0", 
requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
+@APICommand(name = "ldapCreateAccount", description = "Creates an account from 
an LDAP user", responseObject = AccountResponse.class, since = "4.2.0", 
requestHasSensitiveInfo = false, responseHasSensitiveInfo = false,
+    authorized = {RoleType.Admin, RoleType.DomainAdmin})
 public class LdapCreateAccountCmd extends BaseCmd {
     private static final String s_name = "createaccountresponse";
 
diff --git 
a/plugins/user-authenticators/ldap/src/main/java/org/apache/cloudstack/api/command/LdapImportUsersCmd.java
 
b/plugins/user-authenticators/ldap/src/main/java/org/apache/cloudstack/api/command/LdapImportUsersCmd.java
index d6df27ccfcb..f497e49d6a0 100644
--- 
a/plugins/user-authenticators/ldap/src/main/java/org/apache/cloudstack/api/command/LdapImportUsersCmd.java
+++ 
b/plugins/user-authenticators/ldap/src/main/java/org/apache/cloudstack/api/command/LdapImportUsersCmd.java
@@ -56,7 +56,8 @@ import com.cloud.user.User;
 import com.cloud.user.UserAccount;
 import com.cloud.utils.StringUtils;
 
-@APICommand(name = "importLdapUsers", description = "Import LDAP users", 
responseObject = LdapUserResponse.class, since = "4.3.0", 
requestHasSensitiveInfo = false, responseHasSensitiveInfo = false)
+@APICommand(name = "importLdapUsers", description = "Import LDAP users", 
responseObject = LdapUserResponse.class, since = "4.3.0", 
requestHasSensitiveInfo = false, responseHasSensitiveInfo = false,
+    authorized = {RoleType.Admin, RoleType.DomainAdmin})
 public class LdapImportUsersCmd extends BaseListCmd {
 
 

Reply via email to