This is an automated email from the ASF dual-hosted git repository. remm pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/tomcat.git
The following commit(s) were added to refs/heads/main by this push: new ff7f2c4 Fix delete then create ff7f2c4 is described below commit ff7f2c4495598f542be4592f5ec187353a46333e Author: remm <r...@apache.org> AuthorDate: Mon Sep 20 21:19:12 2021 +0200 Fix delete then create Delete is remembered so that everything gets removed before creating new objects. --- .../catalina/users/DataSourceUserDatabase.java | 221 ++++++++++----------- webapps/docs/changelog.xml | 4 + 2 files changed, 114 insertions(+), 111 deletions(-) diff --git a/java/org/apache/catalina/users/DataSourceUserDatabase.java b/java/org/apache/catalina/users/DataSourceUserDatabase.java index 01f6718..a010498 100644 --- a/java/org/apache/catalina/users/DataSourceUserDatabase.java +++ b/java/org/apache/catalina/users/DataSourceUserDatabase.java @@ -562,7 +562,6 @@ public class DataSourceUserDatabase extends SparseUserDatabase { Group group = new GenericGroup<>(this, groupname, description, null); createdGroups.put(groupname, group); modifiedGroups.remove(groupname); - removedGroups.remove(groupname); return group; } finally { readLock.unlock(); @@ -576,7 +575,6 @@ public class DataSourceUserDatabase extends SparseUserDatabase { Role role = new GenericRole<>(this, rolename, description); createdRoles.put(rolename, role); modifiedRoles.remove(rolename); - removedRoles.remove(rolename); return role; } finally { readLock.unlock(); @@ -590,7 +588,6 @@ public class DataSourceUserDatabase extends SparseUserDatabase { User user = new GenericUser<>(this, username, password, fullName, null, null); createdUsers.put(username, user); modifiedUsers.remove(username); - removedUsers.remove(username); return user; } finally { readLock.unlock(); @@ -1048,6 +1045,49 @@ public class DataSourceUserDatabase extends SparseUserDatabase { if (isRoleStoreDefined()) { + // Removed roles + if (!removedRoles.isEmpty()) { + temp = new StringBuilder("DELETE FROM "); + temp.append(roleTable); + temp.append(" WHERE ").append(roleNameCol); + temp.append(" = ?"); + if (groupRoleTable != null) { + tempRelationDelete = new StringBuilder("DELETE FROM "); + tempRelationDelete.append(groupRoleTable); + tempRelationDelete.append(" WHERE "); + tempRelationDelete.append(roleNameCol); + tempRelationDelete.append(" = ?"); + } + StringBuilder tempRelationDelete2 = new StringBuilder("DELETE FROM "); + tempRelationDelete2.append(userRoleTable); + tempRelationDelete2.append(" WHERE "); + tempRelationDelete2.append(roleNameCol); + tempRelationDelete2.append(" = ?"); + for (Role role : removedRoles.values()) { + if (tempRelationDelete != null) { + try (PreparedStatement stmt = dbConnection.prepareStatement(tempRelationDelete.toString())) { + stmt.setString(1, role.getRolename()); + stmt.executeUpdate(); + } catch (SQLException e) { + log.error(sm.getString("dataSourceUserDatabase.exception"), e); + } + } + try (PreparedStatement stmt = dbConnection.prepareStatement(tempRelationDelete2.toString())) { + stmt.setString(1, role.getRolename()); + stmt.executeUpdate(); + } catch (SQLException e) { + log.error(sm.getString("dataSourceUserDatabase.exception"), e); + } + try (PreparedStatement stmt = dbConnection.prepareStatement(temp.toString())) { + stmt.setString(1, role.getRolename()); + stmt.executeUpdate(); + } catch (SQLException e) { + log.error(sm.getString("dataSourceUserDatabase.exception"), e); + } + } + removedRoles.clear(); + } + // Created roles if (!createdRoles.isEmpty()) { temp = new StringBuilder("INSERT INTO "); @@ -1094,49 +1134,6 @@ public class DataSourceUserDatabase extends SparseUserDatabase { modifiedRoles.clear(); } - // Removed roles - if (!removedRoles.isEmpty()) { - temp = new StringBuilder("DELETE FROM "); - temp.append(roleTable); - temp.append(" WHERE ").append(roleNameCol); - temp.append(" = ?"); - if (groupRoleTable != null) { - tempRelationDelete = new StringBuilder("DELETE FROM "); - tempRelationDelete.append(groupRoleTable); - tempRelationDelete.append(" WHERE "); - tempRelationDelete.append(roleNameCol); - tempRelationDelete.append(" = ?"); - } - StringBuilder tempRelationDelete2 = new StringBuilder("DELETE FROM "); - tempRelationDelete2.append(userRoleTable); - tempRelationDelete2.append(" WHERE "); - tempRelationDelete2.append(roleNameCol); - tempRelationDelete2.append(" = ?"); - for (Role role : removedRoles.values()) { - if (tempRelationDelete != null) { - try (PreparedStatement stmt = dbConnection.prepareStatement(tempRelationDelete.toString())) { - stmt.setString(1, role.getRolename()); - stmt.executeUpdate(); - } catch (SQLException e) { - log.error(sm.getString("dataSourceUserDatabase.exception"), e); - } - } - try (PreparedStatement stmt = dbConnection.prepareStatement(tempRelationDelete2.toString())) { - stmt.setString(1, role.getRolename()); - stmt.executeUpdate(); - } catch (SQLException e) { - log.error(sm.getString("dataSourceUserDatabase.exception"), e); - } - try (PreparedStatement stmt = dbConnection.prepareStatement(temp.toString())) { - stmt.setString(1, role.getRolename()); - stmt.executeUpdate(); - } catch (SQLException e) { - log.error(sm.getString("dataSourceUserDatabase.exception"), e); - } - } - removedRoles.clear(); - } - } else if (userRoleTable != null && roleNameCol != null) { // Only remove role from users tempRelationDelete = new StringBuilder("DELETE FROM "); @@ -1171,6 +1168,40 @@ public class DataSourceUserDatabase extends SparseUserDatabase { tempRelationDelete.append(" = ?"); String groupRoleRelationDelete = tempRelationDelete.toString(); + // Removed groups + if (!removedGroups.isEmpty()) { + temp = new StringBuilder("DELETE FROM "); + temp.append(groupTable); + temp.append(" WHERE ").append(groupNameCol); + temp.append(" = ?"); + StringBuilder tempRelationDelete2 = new StringBuilder("DELETE FROM "); + tempRelationDelete2.append(userGroupTable); + tempRelationDelete2.append(" WHERE "); + tempRelationDelete2.append(groupNameCol); + tempRelationDelete2.append(" = ?"); + for (Group group : removedGroups.values()) { + try (PreparedStatement stmt = dbConnection.prepareStatement(groupRoleRelationDelete)) { + stmt.setString(1, group.getGroupname()); + stmt.executeUpdate(); + } catch (SQLException e) { + log.error(sm.getString("dataSourceUserDatabase.exception"), e); + } + try (PreparedStatement stmt = dbConnection.prepareStatement(tempRelationDelete2.toString())) { + stmt.setString(1, group.getGroupname()); + stmt.executeUpdate(); + } catch (SQLException e) { + log.error(sm.getString("dataSourceUserDatabase.exception"), e); + } + try (PreparedStatement stmt = dbConnection.prepareStatement(temp.toString())) { + stmt.setString(1, group.getGroupname()); + stmt.executeUpdate(); + } catch (SQLException e) { + log.error(sm.getString("dataSourceUserDatabase.exception"), e); + } + } + removedGroups.clear(); + } + // Created groups if (!createdGroups.isEmpty()) { temp = new StringBuilder("INSERT INTO "); @@ -1249,40 +1280,6 @@ public class DataSourceUserDatabase extends SparseUserDatabase { modifiedGroups.clear(); } - // Removed groups - if (!removedGroups.isEmpty()) { - temp = new StringBuilder("DELETE FROM "); - temp.append(groupTable); - temp.append(" WHERE ").append(groupNameCol); - temp.append(" = ?"); - StringBuilder tempRelationDelete2 = new StringBuilder("DELETE FROM "); - tempRelationDelete2.append(userGroupTable); - tempRelationDelete2.append(" WHERE "); - tempRelationDelete2.append(groupNameCol); - tempRelationDelete2.append(" = ?"); - for (Group group : removedGroups.values()) { - try (PreparedStatement stmt = dbConnection.prepareStatement(groupRoleRelationDelete)) { - stmt.setString(1, group.getGroupname()); - stmt.executeUpdate(); - } catch (SQLException e) { - log.error(sm.getString("dataSourceUserDatabase.exception"), e); - } - try (PreparedStatement stmt = dbConnection.prepareStatement(tempRelationDelete2.toString())) { - stmt.setString(1, group.getGroupname()); - stmt.executeUpdate(); - } catch (SQLException e) { - log.error(sm.getString("dataSourceUserDatabase.exception"), e); - } - try (PreparedStatement stmt = dbConnection.prepareStatement(temp.toString())) { - stmt.setString(1, group.getGroupname()); - stmt.executeUpdate(); - } catch (SQLException e) { - log.error(sm.getString("dataSourceUserDatabase.exception"), e); - } - } - removedGroups.clear(); - } - } String userRoleRelation = null; @@ -1320,6 +1317,39 @@ public class DataSourceUserDatabase extends SparseUserDatabase { userGroupRelationDelete = tempRelationDelete.toString(); } + // Removed users + if (!removedUsers.isEmpty()) { + temp = new StringBuilder("DELETE FROM "); + temp.append(userTable); + temp.append(" WHERE ").append(userNameCol); + temp.append(" = ?"); + for (User user : removedUsers.values()) { + if (userRoleRelationDelete != null) { + try (PreparedStatement stmt = dbConnection.prepareStatement(userRoleRelationDelete)) { + stmt.setString(1, user.getUsername()); + stmt.executeUpdate(); + } catch (SQLException e) { + log.error(sm.getString("dataSourceUserDatabase.exception"), e); + } + } + if (userGroupRelationDelete != null) { + try (PreparedStatement stmt = dbConnection.prepareStatement(userGroupRelationDelete)) { + stmt.setString(1, user.getUsername()); + stmt.executeUpdate(); + } catch (SQLException e) { + log.error(sm.getString("dataSourceUserDatabase.exception"), e); + } + } + try (PreparedStatement stmt = dbConnection.prepareStatement(temp.toString())) { + stmt.setString(1, user.getUsername()); + stmt.executeUpdate(); + } catch (SQLException e) { + log.error(sm.getString("dataSourceUserDatabase.exception"), e); + } + } + removedUsers.clear(); + } + // Created users if (!createdUsers.isEmpty()) { temp = new StringBuilder("INSERT INTO "); @@ -1445,37 +1475,6 @@ public class DataSourceUserDatabase extends SparseUserDatabase { modifiedGroups.clear(); } - // Removed users - if (!removedUsers.isEmpty()) { - temp = new StringBuilder("DELETE FROM "); - temp.append(userTable); - temp.append(" WHERE ").append(userNameCol); - temp.append(" = ?"); - for (User user : removedUsers.values()) { - try (PreparedStatement stmt = dbConnection.prepareStatement(userRoleRelationDelete)) { - stmt.setString(1, user.getUsername()); - stmt.executeUpdate(); - } catch (SQLException e) { - log.error(sm.getString("dataSourceUserDatabase.exception"), e); - } - if (userGroupRelationDelete != null) { - try (PreparedStatement stmt = dbConnection.prepareStatement(userGroupRelationDelete)) { - stmt.setString(1, user.getUsername()); - stmt.executeUpdate(); - } catch (SQLException e) { - log.error(sm.getString("dataSourceUserDatabase.exception"), e); - } - } - try (PreparedStatement stmt = dbConnection.prepareStatement(temp.toString())) { - stmt.setString(1, user.getUsername()); - stmt.executeUpdate(); - } catch (SQLException e) { - log.error(sm.getString("dataSourceUserDatabase.exception"), e); - } - } - removedUsers.clear(); - } - } @Override diff --git a/webapps/docs/changelog.xml b/webapps/docs/changelog.xml index 28b4486..1345bce 100644 --- a/webapps/docs/changelog.xml +++ b/webapps/docs/changelog.xml @@ -111,6 +111,10 @@ Provide the DataSource in the constructor of <code>DataSourceUserDatabase</code>, since it is always global. (remm) </fix> + <fix> + Fix delete then create object manipulations with + <code>DataSourceUserDatabase</code>. (remm) + </fix> </changelog> </subsection> <subsection name="Coyote"> --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org