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


The following commit(s) were added to refs/heads/10.1.x by this push:
     new 9c62ac12f2 Code review items for DS user database
9c62ac12f2 is described below

commit 9c62ac12f28fdad037fbbbbb08e3cbc2f1f08a5a
Author: remm <[email protected]>
AuthorDate: Tue May 26 15:12:06 2026 +0200

    Code review items for DS user database
    
    The most significant seems to be the missed modifiedUsers.clear() which
    would cause an update loop.
---
 .../catalina/users/DataSourceUserDatabase.java     | 35 ++++++++++++----------
 java/org/apache/catalina/users/GenericGroup.java   |  3 +-
 java/org/apache/catalina/users/GenericRole.java    |  3 +-
 java/org/apache/catalina/users/GenericUser.java    | 10 +++----
 webapps/docs/changelog.xml                         |  4 +++
 5 files changed, 32 insertions(+), 23 deletions(-)

diff --git a/java/org/apache/catalina/users/DataSourceUserDatabase.java 
b/java/org/apache/catalina/users/DataSourceUserDatabase.java
index 7842ca25ff..61b78fed3f 100644
--- a/java/org/apache/catalina/users/DataSourceUserDatabase.java
+++ b/java/org/apache/catalina/users/DataSourceUserDatabase.java
@@ -622,27 +622,26 @@ public class DataSourceUserDatabase extends 
SparseUserDatabase {
                 users.putAll(createdUsers);
                 users.putAll(modifiedUsers);
 
-                Connection dbConnection = openConnection();
-                if (dbConnection != null) {
-                    try (PreparedStatement stmt = 
dbConnection.prepareStatement(preparedAllUsers)) {
-                        try (ResultSet rs = stmt.executeQuery()) {
-                            while (rs.next()) {
-                                String userName = rs.getString(1);
-                                if (userName != null) {
-                                    if (!users.containsKey(userName) && 
!removedUsers.containsKey(userName)) {
-                                        User user = 
findUserInternal(dbConnection, userName);
-                                        if (user != null) {
-                                            users.put(userName, user);
+                try (Connection dbConnection = openConnection()) {
+                    if (dbConnection != null) {
+                        try (PreparedStatement stmt = 
dbConnection.prepareStatement(preparedAllUsers)) {
+                            try (ResultSet rs = stmt.executeQuery()) {
+                                while (rs.next()) {
+                                    String userName = rs.getString(1);
+                                    if (userName != null) {
+                                        if (!users.containsKey(userName) && 
!removedUsers.containsKey(userName)) {
+                                            User user = 
findUserInternal(dbConnection, userName);
+                                            if (user != null) {
+                                                users.put(userName, user);
+                                            }
                                         }
                                     }
                                 }
                             }
                         }
-                    } catch (SQLException e) {
-                        
log.error(sm.getString("dataSourceUserDatabase.exception"), e);
-                    } finally {
-                        closeConnection(dbConnection);
                     }
+                } catch (SQLException e) {
+                    
log.error(sm.getString("dataSourceUserDatabase.exception"), e);
                 }
                 return users.values().iterator();
             } finally {
@@ -785,6 +784,7 @@ public class DataSourceUserDatabase extends 
SparseUserDatabase {
                                 }
                             } catch (SQLException e) {
                                 
log.error(sm.getString("dataSourceUserDatabase.exception"), e);
+                                return null;
                             }
                         }
                         group = new GenericGroup<>(this, groupName, 
description, groupRoles);
@@ -928,6 +928,7 @@ public class DataSourceUserDatabase extends 
SparseUserDatabase {
             }
         } catch (SQLException e) {
             log.error(sm.getString("dataSourceUserDatabase.exception"), e);
+            return null;
         }
 
         // Lookup groups
@@ -948,6 +949,7 @@ public class DataSourceUserDatabase extends 
SparseUserDatabase {
                 }
             } catch (SQLException e) {
                 log.error(sm.getString("dataSourceUserDatabase.exception"), e);
+                return null;
             }
         }
 
@@ -968,6 +970,7 @@ public class DataSourceUserDatabase extends 
SparseUserDatabase {
                 }
             } catch (SQLException e) {
                 log.error(sm.getString("dataSourceUserDatabase.exception"), e);
+                return null;
             }
         }
 
@@ -1660,7 +1663,7 @@ public class DataSourceUserDatabase extends 
SparseUserDatabase {
                     }
                 }
             }
-            modifiedGroups.clear();
+            modifiedUsers.clear();
         }
 
     }
diff --git a/java/org/apache/catalina/users/GenericGroup.java 
b/java/org/apache/catalina/users/GenericGroup.java
index c2f7c1c0c1..1003d4bcb1 100644
--- a/java/org/apache/catalina/users/GenericGroup.java
+++ b/java/org/apache/catalina/users/GenericGroup.java
@@ -143,7 +143,8 @@ public class GenericGroup<UD extends UserDatabase> extends 
AbstractGroup {
     public boolean equals(Object obj) {
         if (obj instanceof GenericGroup) {
             GenericGroup<?> group = (GenericGroup<?>) obj;
-            return group.database == database && 
groupname.equals(group.getGroupname());
+            return group.database == database &&
+                    ((groupname == null && group.getGroupname() == null) || 
groupname.equals(group.getGroupname()));
         }
         return super.equals(obj);
     }
diff --git a/java/org/apache/catalina/users/GenericRole.java 
b/java/org/apache/catalina/users/GenericRole.java
index bbc5842466..27efe04fe1 100644
--- a/java/org/apache/catalina/users/GenericRole.java
+++ b/java/org/apache/catalina/users/GenericRole.java
@@ -86,7 +86,8 @@ public class GenericRole<UD extends UserDatabase> extends 
AbstractRole {
     public boolean equals(Object obj) {
         if (obj instanceof GenericRole) {
             GenericRole<?> role = (GenericRole<?>) obj;
-            return role.database == database && 
rolename.equals(role.getRolename());
+            return role.database == database &&
+                    ((rolename == null && role.getRolename() == null) || 
rolename.equals(role.getRolename()));
         }
         return super.equals(obj);
     }
diff --git a/java/org/apache/catalina/users/GenericUser.java 
b/java/org/apache/catalina/users/GenericUser.java
index 2a4eb6b319..7dca4521cc 100644
--- a/java/org/apache/catalina/users/GenericUser.java
+++ b/java/org/apache/catalina/users/GenericUser.java
@@ -166,9 +166,9 @@ public class GenericUser<UD extends UserDatabase> extends 
AbstractUser {
     @Override
     public void removeRoles() {
         if (!roles.isEmpty()) {
+            roles.clear();
             database.modifiedUser(this);
         }
-        roles.clear();
     }
 
 
@@ -188,16 +188,16 @@ public class GenericUser<UD extends UserDatabase> extends 
AbstractUser {
 
     @Override
     public void setUsername(String username) {
-        database.modifiedUser(this);
-        // Note: changing the user name is a problem ...
-        super.setUsername(username);
+        // Note: changing the username (which is the key) in a database will 
not work
+        // and the user should be removed and added instead
     }
 
     @Override
     public boolean equals(Object obj) {
         if (obj instanceof GenericUser) {
             GenericUser<?> user = (GenericUser<?>) obj;
-            return user.database == database && 
username.equals(user.getUsername());
+            return user.database == database &&
+                    ((username == null && user.getUsername() == null) || 
username.equals(user.getUsername()));
         }
         return super.equals(obj);
     }
diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml
index 2bd73e6769..9802e4e428 100644
--- a/webapps/docs/changelog.xml
+++ b/webapps/docs/changelog.xml
@@ -190,6 +190,10 @@
         Mixup of WrapperListener and WrapperLifecycle elements in storeconfig.
         (remm)
       </fix>
+      <fix>
+        Incorrect processing of modified users in
+        <code>DataSourceUSerDatabase</code>. (remm)
+      </fix>
     </changelog>
   </subsection>
   <subsection name="Coyote">


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

Reply via email to