This is an automated email from the ASF dual-hosted git repository. rmaucher pushed a commit to branch 9.0.x in repository https://gitbox.apache.org/repos/asf/tomcat.git
commit edca309ec343b8cd0c340fbe5354c21f286073b1 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]
