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

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

commit d17ffadc36280499a5774f19421d758d596943c1
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 c9316dd159..2249d5fbb3 100644
--- a/java/org/apache/catalina/mbeans/MBeanUtils.java
+++ b/java/org/apache/catalina/mbeans/MBeanUtils.java
@@ -456,7 +456,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()));
 
     }
 
@@ -474,7 +474,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()));
 
     }
 
@@ -491,8 +491,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()));
     }
 
 
@@ -508,7 +508,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()));
 
     }
 
@@ -728,36 +728,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