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

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


The following commit(s) were added to refs/heads/10.1.x by this push:
     new 4685a1f4f1 Align users, groups and roles. Avoid NPEs.
4685a1f4f1 is described below

commit 4685a1f4f1619281f263e5cb657f39fcaad0d934
Author: Mark Thomas <[email protected]>
AuthorDate: Wed May 27 14:03:19 2026 +0100

    Align users, groups and roles. Avoid NPEs.
---
 java/org/apache/catalina/UserDatabase.java                   |  6 +++---
 .../apache/catalina/mbeans/DataSourceUserDatabaseMBean.java  |  6 +++---
 java/org/apache/catalina/mbeans/SparseUserDatabaseMBean.java |  9 +++++++++
 java/org/apache/catalina/users/DataSourceUserDatabase.java   | 12 +++++++++---
 java/org/apache/catalina/users/MemoryUserDatabase.java       | 11 +++++++++--
 5 files changed, 33 insertions(+), 11 deletions(-)

diff --git a/java/org/apache/catalina/UserDatabase.java 
b/java/org/apache/catalina/UserDatabase.java
index 41ebcbc2fd..8c0dc0ca89 100644
--- a/java/org/apache/catalina/UserDatabase.java
+++ b/java/org/apache/catalina/UserDatabase.java
@@ -77,7 +77,7 @@ public interface UserDatabase {
      * @param groupname   The group name of the new group (must be unique)
      * @param description The description of this group
      *
-     * @return The new group, or {@code null} if there's a pre existing group
+     * @return The new group, or {@code null} if there's a pre-existing group
      */
     Group createGroup(String groupname, String description);
 
@@ -88,7 +88,7 @@ public interface UserDatabase {
      * @param rolename    The role name of the new role (must be unique)
      * @param description The description of this role
      *
-     * @return The new role, or {@code null} if there's a pre existing role
+     * @return The new role, or {@code null} if there's a pre-existing role
      */
     Role createRole(String rolename, String description);
 
@@ -100,7 +100,7 @@ public interface UserDatabase {
      * @param password The logon password of the new user
      * @param fullName The full name of the new user
      *
-     * @return The new user, or {@code null} if there's a pre existing user
+     * @return The new user, or {@code null} if there's a pre-existing user
      */
     User createUser(String username, String password, String fullName);
 
diff --git a/java/org/apache/catalina/mbeans/DataSourceUserDatabaseMBean.java 
b/java/org/apache/catalina/mbeans/DataSourceUserDatabaseMBean.java
index 6aa0d43c3f..866d3917e8 100644
--- a/java/org/apache/catalina/mbeans/DataSourceUserDatabaseMBean.java
+++ b/java/org/apache/catalina/mbeans/DataSourceUserDatabaseMBean.java
@@ -123,7 +123,7 @@ public class DataSourceUserDatabaseMBean extends 
BaseModelMBean {
     public String createGroup(String groupname, String description) {
         UserDatabase database = (UserDatabase) this.resource;
         Group group = database.createGroup(groupname, description);
-        return group.getGroupname();
+        return group == null ? null : group.getGroupname();
     }
 
 
@@ -138,7 +138,7 @@ public class DataSourceUserDatabaseMBean extends 
BaseModelMBean {
     public String createRole(String rolename, String description) {
         UserDatabase database = (UserDatabase) this.resource;
         Role role = database.createRole(rolename, description);
-        return role.getRolename();
+        return role == null ? null : role.getRolename();
     }
 
 
@@ -154,7 +154,7 @@ public class DataSourceUserDatabaseMBean extends 
BaseModelMBean {
     public String createUser(String username, String password, String 
fullName) {
         UserDatabase database = (UserDatabase) this.resource;
         User user = database.createUser(username, password, fullName);
-        return user.getUsername();
+        return user == null ? null : user.getUsername();
     }
 
 
diff --git a/java/org/apache/catalina/mbeans/SparseUserDatabaseMBean.java 
b/java/org/apache/catalina/mbeans/SparseUserDatabaseMBean.java
index 6a8480fb7d..26ccdb4565 100644
--- a/java/org/apache/catalina/mbeans/SparseUserDatabaseMBean.java
+++ b/java/org/apache/catalina/mbeans/SparseUserDatabaseMBean.java
@@ -156,6 +156,9 @@ public class SparseUserDatabaseMBean extends BaseModelMBean 
{
     public String createGroup(String groupname, String description) {
         UserDatabase database = (UserDatabase) this.resource;
         Group group = database.createGroup(groupname, description);
+        if (group == null) {
+            return null;
+        }
         try {
             MBeanUtils.createMBean(group);
         } catch (Exception e) {
@@ -176,6 +179,9 @@ public class SparseUserDatabaseMBean extends BaseModelMBean 
{
     public String createRole(String rolename, String description) {
         UserDatabase database = (UserDatabase) this.resource;
         Role role = database.createRole(rolename, description);
+        if (role == null) {
+            return null;
+        }
         try {
             MBeanUtils.createMBean(role);
         } catch (Exception e) {
@@ -197,6 +203,9 @@ public class SparseUserDatabaseMBean extends BaseModelMBean 
{
     public String createUser(String username, String password, String 
fullName) {
         UserDatabase database = (UserDatabase) this.resource;
         User user = database.createUser(username, password, fullName);
+        if (user == null) {
+            return null;
+        }
         try {
             MBeanUtils.createMBean(user);
         } catch (Exception e) {
diff --git a/java/org/apache/catalina/users/DataSourceUserDatabase.java 
b/java/org/apache/catalina/users/DataSourceUserDatabase.java
index dcd48bb487..3e74619e33 100644
--- a/java/org/apache/catalina/users/DataSourceUserDatabase.java
+++ b/java/org/apache/catalina/users/DataSourceUserDatabase.java
@@ -668,9 +668,11 @@ public class DataSourceUserDatabase extends 
SparseUserDatabase {
             }
             groupsWriteLock.lock();
             try {
+                if (findGroup(groupname) != null) {
+                    return null;
+                }
                 Group group = new GenericGroup<>(this, groupname, description, 
null);
                 createdGroups.put(groupname, group);
-                modifiedGroups.remove(groupname);
                 return group;
             } finally {
                 groupsWriteLock.unlock();
@@ -689,9 +691,11 @@ public class DataSourceUserDatabase extends 
SparseUserDatabase {
             }
             rolesWriteLock.lock();
             try {
+                if (findRole(rolename) != null) {
+                    return null;
+                }
                 Role role = new GenericRole<>(this, rolename, description);
                 createdRoles.put(rolename, role);
-                modifiedRoles.remove(rolename);
                 return role;
             } finally {
                 rolesWriteLock.unlock();
@@ -710,9 +714,11 @@ public class DataSourceUserDatabase extends 
SparseUserDatabase {
             }
             usersWriteLock.lock();
             try {
+                if (findUser(username) != null) {
+                    return null;
+                }
                 User user = new GenericUser<>(this, username, password, 
fullName, null, null);
                 createdUsers.put(username, user);
-                modifiedUsers.remove(username);
                 return user;
             } finally {
                 usersWriteLock.unlock();
diff --git a/java/org/apache/catalina/users/MemoryUserDatabase.java 
b/java/org/apache/catalina/users/MemoryUserDatabase.java
index 764f85d3d4..dc01463191 100644
--- a/java/org/apache/catalina/users/MemoryUserDatabase.java
+++ b/java/org/apache/catalina/users/MemoryUserDatabase.java
@@ -323,7 +323,7 @@ public class MemoryUserDatabase implements UserDatabase {
         User user = new GenericUser<>(this, username, password, fullName, 
null, null);
         readLock.lock();
         try {
-            if (users.put(user.getUsername(), user) != null) {
+            if (users.putIfAbsent(user.getUsername(), user) != null) {
                 return null;
             }
         } finally {
@@ -783,7 +783,14 @@ class MemoryUserCreationFactory extends 
AbstractObjectCreationFactory {
         }
         String groups = attributes.getValue("groups");
         String roles = attributes.getValue("roles");
-        User user = database.createUser(username, password, fullName);
+        User user = database.findUser(username);
+        if (user == null) {
+            user = database.createUser(username, password, fullName);
+        } else {
+            if (user.getFullName() == null) {
+                user.setFullName(fullName);
+            }
+        }
         if (groups != null) {
             while (!groups.isEmpty()) {
                 String groupname;


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

Reply via email to