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

rmaucher pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/tomcat.git

commit bada9e5999fbe01f37f1314f9cef46af47ee593a
Author: opencode <[email protected]>
AuthorDate: Wed Oct 7 13:38:36 2026 +0200

    Quote the user database id when embedding it in MBean names
    
    The createObjectName methods in MBeanUtils already quoted the username,
    groupname and rolename when constructing the ObjectName for a User,
    Group or Role MBean, but the user database id was appended unquoted. An
    id containing characters special to ObjectNames (for example a colon)
    therefore produced a malformed ObjectName, throwing
    MalformedObjectNameException on registration, while destroy and the
    sparse save path could fail to find MBeans registered under a name whose
    properties had been re-parsed. Apply ObjectName.quote() to the id in all
    four createObjectName methods and, to keep the creation and destruction
    sides consistent, apply the same quoting in destroyMBeanUserDatabase()
    and in the queries executed by SparseUserDatabaseMBean.save(). Note that
    ObjectName.quote() always returns the double-quoted form, so plain ids
    now appear as database="UserDatabase" in registered names, matching the
    treatment usernames and role/group names already receive.
---
 java/org/apache/catalina/mbeans/MBeanUtils.java    | 22 ++++++++++++----------
 .../catalina/mbeans/SparseUserDatabaseMBean.java   |  8 +++++---
 2 files changed, 17 insertions(+), 13 deletions(-)

diff --git a/java/org/apache/catalina/mbeans/MBeanUtils.java 
b/java/org/apache/catalina/mbeans/MBeanUtils.java
index 4b20476a3d..9ef621e758 100644
--- a/java/org/apache/catalina/mbeans/MBeanUtils.java
+++ b/java/org/apache/catalina/mbeans/MBeanUtils.java
@@ -454,7 +454,7 @@ public class MBeanUtils {
     static ObjectName createObjectName(String domain, Group group) throws 
MalformedObjectNameException {
 
         return new ObjectName(domain + ":type=Group,groupname=" + 
ObjectName.quote(group.getGroupname()) +
-                ",database=" + group.getUserDatabase().getId());
+                ",database=" + 
ObjectName.quote(group.getUserDatabase().getId()));
 
     }
 
@@ -472,7 +472,7 @@ public class MBeanUtils {
     static ObjectName createObjectName(String domain, Role role) throws 
MalformedObjectNameException {
 
         return new ObjectName(domain + ":type=Role,rolename=" + 
ObjectName.quote(role.getRolename()) + ",database=" +
-                role.getUserDatabase().getId());
+                ObjectName.quote(role.getUserDatabase().getId()));
 
     }
 
@@ -489,8 +489,8 @@ public class MBeanUtils {
      */
     static ObjectName createObjectName(String domain, User user) throws 
MalformedObjectNameException {
 
-        return new ObjectName(domain + ":type=User,username=" + 
ObjectName.quote(user.getUsername()) + ",database=" +
-                user.getUserDatabase().getId());
+        return new ObjectName(domain + ":type=User,username=" + 
ObjectName.quote(user.getUsername()) +
+                ",database=" + 
ObjectName.quote(user.getUserDatabase().getId()));
     }
 
 
@@ -506,7 +506,7 @@ public class MBeanUtils {
      */
     static ObjectName createObjectName(String domain, UserDatabase 
userDatabase) throws MalformedObjectNameException {
 
-        return new ObjectName(domain + ":type=UserDatabase,database=" + 
userDatabase.getId());
+        return new ObjectName(domain + ":type=UserDatabase,database=" + 
ObjectName.quote(userDatabase.getId()));
 
     }
 
@@ -726,36 +726,38 @@ public class MBeanUtils {
 
         // FIXME: UserDatabase MBean management could be improved
 
+        String quotedDatabase = ObjectName.quote(userDatabase);
+
         ObjectName query;
         Set<ObjectName> results;
 
         // Groups
-        query = new ObjectName("Users:type=Group,database=" + userDatabase + 
",*");
+        query = new ObjectName("Users:type=Group,database=" + quotedDatabase + 
",*");
         results = mserver.queryNames(query, null);
         for (ObjectName result : results) {
             mserver.unregisterMBean(result);
         }
 
         // Roles
-        query = new ObjectName("Users:type=Role,database=" + userDatabase + 
",*");
+        query = new ObjectName("Users:type=Role,database=" + quotedDatabase + 
",*");
         results = mserver.queryNames(query, null);
         for (ObjectName result : results) {
             mserver.unregisterMBean(result);
         }
 
         // Users
-        query = new ObjectName("Users:type=User,database=" + userDatabase + 
",*");
+        query = new ObjectName("Users:type=User,database=" + quotedDatabase + 
",*");
         results = mserver.queryNames(query, null);
         for (ObjectName result : results) {
             mserver.unregisterMBean(result);
         }
 
         // The database itself
-        ObjectName db = new ObjectName("Users:type=UserDatabase,database=" + 
userDatabase);
+        ObjectName db = new ObjectName("Users:type=UserDatabase,database=" + 
quotedDatabase);
         if (mserver.isRegistered(db)) {
             mserver.unregisterMBean(db);
         }
-        db = new ObjectName("Catalina:type=UserDatabase,database=" + 
userDatabase);
+        db = new ObjectName("Catalina:type=UserDatabase,database=" + 
quotedDatabase);
         if (mserver.isRegistered(db)) {
             mserver.unregisterMBean(db);
         }
diff --git a/java/org/apache/catalina/mbeans/SparseUserDatabaseMBean.java 
b/java/org/apache/catalina/mbeans/SparseUserDatabaseMBean.java
index 50bff322b2..0a183dd034 100644
--- a/java/org/apache/catalina/mbeans/SparseUserDatabaseMBean.java
+++ b/java/org/apache/catalina/mbeans/SparseUserDatabaseMBean.java
@@ -358,25 +358,27 @@ public class SparseUserDatabaseMBean extends 
BaseModelMBean {
         try {
             UserDatabase database = (UserDatabase) this.resource;
             if (database.isSparse()) {
+                String quotedDatabase = ObjectName.quote(database.getId());
+
                 ObjectName query;
                 Set<ObjectName> results;
 
                 // Groups
-                query = new ObjectName("Users:type=Group,database=" + 
database.getId() + ",*");
+                query = new ObjectName("Users:type=Group,database=" + 
quotedDatabase + ",*");
                 results = mserver.queryNames(query, null);
                 for (ObjectName result : results) {
                     mserver.unregisterMBean(result);
                 }
 
                 // Roles
-                query = new ObjectName("Users:type=Role,database=" + 
database.getId() + ",*");
+                query = new ObjectName("Users:type=Role,database=" + 
quotedDatabase + ",*");
                 results = mserver.queryNames(query, null);
                 for (ObjectName result : results) {
                     mserver.unregisterMBean(result);
                 }
 
                 // Users
-                query = new ObjectName("Users:type=User,database=" + 
database.getId() + ",*");
+                query = new ObjectName("Users:type=User,database=" + 
quotedDatabase + ",*");
                 results = mserver.queryNames(query, null);
                 for (ObjectName result : results) {
                     mserver.unregisterMBean(result);


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to