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]