ttomcat-1778514358873.zip-extract/apache-tomcat-11.0.18-src/java/org/apache/catalina/users/DataSourceUserDatabase.java

Path
ttomcat-1778514358873.zip-extract/apache-tomcat-11.0.18-src/java/org/apache/catalina/users/DataSourceUserDatabase.java
Status
scanned
Type
file
Name
DataSourceUserDatabase.java
Extension
.java
Programming language
Java
Mime type
text/plain
File type
ASCII text, with CRLF line terminators
Tag

      
    
Rootfs path

      
    
Size
61018 (59.6 KB)
MD5
3216cf3db4d8cd0f81101a62ea29632b
SHA1
4ea0efeb7a05281eae463e39c18aa9d01da62ddd
SHA256
cf264eea1ed435d64725f185be26619c24bd2d1456703c8204b946828adf26bc
SHA512

      
    
SHA1_git
f4fe1e419ecfd3463d3fd353907d42e4d55cbaa0
Is binary

      
    
Is text
True
Is archive

      
    
Is media

      
    
Is legal

      
    
Is manifest

      
    
Is readme

      
    
Is top level

      
    
Is key file

      
    
DataSourceUserDatabase.java | 59.6 KB |

/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.catalina.users; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantReadWriteLock; import javax.sql.DataSource; import org.apache.catalina.Group; import org.apache.catalina.Role; import org.apache.catalina.User; import org.apache.juli.logging.Log; import org.apache.juli.logging.LogFactory; import org.apache.tomcat.util.res.StringManager; /** * UserDatabase backed by a data source. */ public class DataSourceUserDatabase extends SparseUserDatabase { private static final Log log = LogFactory.getLog(DataSourceUserDatabase.class); private static final StringManager sm = StringManager.getManager(DataSourceUserDatabase.class); public DataSourceUserDatabase(DataSource dataSource, String id) { this.dataSource = dataSource; this.id = id; } /** * DataSource to use. */ protected final DataSource dataSource; /** * The unique global identifier of this user database. */ protected final String id; protected final ConcurrentHashMap<String,User> createdUsers = new ConcurrentHashMap<>(); protected final ConcurrentHashMap<String,User> modifiedUsers = new ConcurrentHashMap<>(); protected final ConcurrentHashMap<String,User> removedUsers = new ConcurrentHashMap<>(); protected final ConcurrentHashMap<String,Group> createdGroups = new ConcurrentHashMap<>(); protected final ConcurrentHashMap<String,Group> modifiedGroups = new ConcurrentHashMap<>(); protected final ConcurrentHashMap<String,Group> removedGroups = new ConcurrentHashMap<>(); protected final ConcurrentHashMap<String,Role> createdRoles = new ConcurrentHashMap<>(); protected final ConcurrentHashMap<String,Role> modifiedRoles = new ConcurrentHashMap<>(); protected final ConcurrentHashMap<String,Role> removedRoles = new ConcurrentHashMap<>(); // ----------------------------------------------------- Instance Variables /** * The generated string for the all users PreparedStatement */ private String preparedAllUsers = null; /** * The generated string for the all groups PreparedStatement */ private String preparedAllGroups = null; /** * The generated string for the all roles PreparedStatement */ private String preparedAllRoles = null; /** * The generated string for the group PreparedStatement */ private String preparedGroup = null; /** * The generated string for the role PreparedStatement */ private String preparedRole = null; /** * The generated string for the roles PreparedStatement */ private String preparedUserRoles = null; /** * The generated string for the user PreparedStatement */ private String preparedUser = null; /** * The generated string for the groups PreparedStatement */ private String preparedUserGroups = null; /** * The generated string for the groups PreparedStatement */ private String preparedGroupRoles = null; /** * The name of the JNDI JDBC DataSource */ protected String dataSourceName = null; /** * The column in the user role table that names a role */ protected String roleNameCol = null; /** * The column in the role and group tables for the description */ protected String roleAndGroupDescriptionCol = null; /** * The column in the user group table that names a group */ protected String groupNameCol = null; /** * The column in the user table that holds the user's credentials */ protected String userCredCol = null; /** * The column in the user table that holds the user's full name */ protected String userFullNameCol = null; /** * The column in the user table that holds the user's name */ protected String userNameCol = null; /** * The table that holds the relation between users and roles */ protected String userRoleTable = null; /** * The table that holds the relation between users and groups */ protected String userGroupTable = null; /** * The table that holds the relation between groups and roles */ protected String groupRoleTable = null; /** * The table that holds user data. */ protected String userTable = null; /** * The table that holds user data. */ protected String groupTable = null; /** * The table that holds user data. */ protected String roleTable = null; /** * Last connection attempt. */ private volatile boolean connectionSuccess = true; /** * A flag, indicating if the user database is read only. */ protected boolean readonly = true; // The write lock on the database is assumed to include the write locks // for groups, users and roles. private final ReentrantReadWriteLock dbLock = new ReentrantReadWriteLock(); private final Lock dbReadLock = dbLock.readLock(); private final Lock dbWriteLock = dbLock.writeLock(); private final ReentrantReadWriteLock groupsLock = new ReentrantReadWriteLock(); private final Lock groupsReadLock = groupsLock.readLock(); private final Lock groupsWriteLock = groupsLock.writeLock(); private final ReentrantReadWriteLock usersLock = new ReentrantReadWriteLock(); private final Lock usersReadLock = usersLock.readLock(); private final Lock usersWriteLock = usersLock.writeLock(); private final ReentrantReadWriteLock rolesLock = new ReentrantReadWriteLock(); private final Lock rolesReadLock = rolesLock.readLock(); private final Lock rolesWriteLock = rolesLock.writeLock(); // ------------------------------------------------------------- Properties /** * @return the name of the JNDI JDBC DataSource. */ public String getDataSourceName() { return dataSourceName; } /** * Set the name of the JNDI JDBC DataSource. * * @param dataSourceName the name of the JNDI JDBC DataSource */ public void setDataSourceName(String dataSourceName) { this.dataSourceName = dataSourceName; } /** * @return the column in the user role table that names a role. */ public String getRoleNameCol() { return roleNameCol; } /** * Set the column in the user role table that names a role. * * @param roleNameCol The column name */ public void setRoleNameCol(String roleNameCol) { this.roleNameCol = roleNameCol; } /** * @return the column in the user table that holds the user's credentials. */ public String getUserCredCol() { return userCredCol; } /** * Set the column in the user table that holds the user's credentials. * * @param userCredCol The column name */ public void setUserCredCol(String userCredCol) { this.userCredCol = userCredCol; } /** * @return the column in the user table that holds the user's name. */ public String getUserNameCol() { return userNameCol; } /** * Set the column in the user table that holds the user's name. * * @param userNameCol The column name */ public void setUserNameCol(String userNameCol) { this.userNameCol = userNameCol; } /** * @return the table that holds the relation between user's and roles. */ public String getUserRoleTable() { return userRoleTable; } /** * Set the table that holds the relation between user's and roles. * * @param userRoleTable The table name */ public void setUserRoleTable(String userRoleTable) { this.userRoleTable = userRoleTable; } /** * @return the table that holds user data */ public String getUserTable() { return userTable; } /** * Set the table that holds user data. * * @param userTable The table name */ public void setUserTable(String userTable) { this.userTable = userTable; } /** * @return the roleAndGroupDescriptionCol */ public String getRoleAndGroupDescriptionCol() { return this.roleAndGroupDescriptionCol; } /** * @param roleAndGroupDescriptionCol the roleAndGroupDescriptionCol to set */ public void setRoleAndGroupDescriptionCol(String roleAndGroupDescriptionCol) { this.roleAndGroupDescriptionCol = roleAndGroupDescriptionCol; } /** * @return the groupNameCol */ public String getGroupNameCol() { return this.groupNameCol; } /** * @param groupNameCol the groupNameCol to set */ public void setGroupNameCol(String groupNameCol) { this.groupNameCol = groupNameCol; } /** * @return the userFullNameCol */ public String getUserFullNameCol() { return this.userFullNameCol; } /** * @param userFullNameCol the userFullNameCol to set */ public void setUserFullNameCol(String userFullNameCol) { this.userFullNameCol = userFullNameCol; } /** * @return the userGroupTable */ public String getUserGroupTable() { return this.userGroupTable; } /** * @param userGroupTable the userGroupTable to set */ public void setUserGroupTable(String userGroupTable) { this.userGroupTable = userGroupTable; } /** * @return the groupRoleTable */ public String getGroupRoleTable() { return this.groupRoleTable; } /** * @param groupRoleTable the groupRoleTable to set */ public void setGroupRoleTable(String groupRoleTable) { this.groupRoleTable = groupRoleTable; } /** * @return the groupTable */ public String getGroupTable() { return this.groupTable; } /** * @param groupTable the groupTable to set */ public void setGroupTable(String groupTable) { this.groupTable = groupTable; } /** * @return the roleTable */ public String getRoleTable() { return this.roleTable; } /** * @param roleTable the roleTable to set */ public void setRoleTable(String roleTable) { this.roleTable = roleTable; } /** * @return the readonly */ public boolean getReadonly() { return this.readonly; } /** * @param readonly the readonly to set */ public void setReadonly(boolean readonly) { this.readonly = readonly; } @Override public String getId() { return id; } @Override public Iterator<Group> getGroups() { dbReadLock.lock(); try { groupsReadLock.lock(); try { HashMap<String,Group> groups = new HashMap<>(); groups.putAll(createdGroups); groups.putAll(modifiedGroups); try (Connection dbConnection = openConnection()) { if (dbConnection != null && preparedAllGroups != null) { try (PreparedStatement stmt = dbConnection.prepareStatement(preparedAllGroups)) { try (ResultSet rs = stmt.executeQuery()) { while (rs.next()) { String groupName = rs.getString(1); if (groupName != null) { if (!groups.containsKey(groupName) && !removedGroups.containsKey(groupName)) { Group group = findGroupInternal(dbConnection, groupName); if (group != null) { groups.put(groupName, group); } } } } } } } } catch (SQLException e) { log.error(sm.getString("dataSourceUserDatabase.exception"), e); } return groups.values().iterator(); } finally { groupsReadLock.unlock(); } } finally { dbReadLock.unlock(); } } @Override public Iterator<Role> getRoles() { dbReadLock.lock(); try { rolesReadLock.lock(); try { HashMap<String,Role> roles = new HashMap<>(); roles.putAll(createdRoles); roles.putAll(modifiedRoles); try (Connection dbConnection = openConnection()) { if (dbConnection != null && preparedAllRoles != null) { try (PreparedStatement stmt = dbConnection.prepareStatement(preparedAllRoles)) { try (ResultSet rs = stmt.executeQuery()) { while (rs.next()) { String roleName = rs.getString(1); if (roleName != null) { if (!roles.containsKey(roleName) && !removedRoles.containsKey(roleName)) { Role role = findRoleInternal(dbConnection, roleName); if (role != null) { roles.put(roleName, role); } } } } } } } } catch (SQLException e) { log.error(sm.getString("dataSourceUserDatabase.exception"), e); } return roles.values().iterator(); } finally { rolesReadLock.unlock(); } } finally { dbReadLock.unlock(); } } @Override public Iterator<User> getUsers() { dbReadLock.lock(); try { usersReadLock.lock(); try { HashMap<String,User> users = new HashMap<>(); 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); } } } } } } catch (SQLException e) { log.error(sm.getString("dataSourceUserDatabase.exception"), e); } finally { closeConnection(dbConnection); } } return users.values().iterator(); } finally { usersReadLock.unlock(); } } finally { dbReadLock.unlock(); } } @Override public void close() throws Exception { } @Override public Group createGroup(String groupname, String description) { dbReadLock.lock(); try { groupsWriteLock.lock(); try { Group group = new GenericGroup<>(this, groupname, description, null); createdGroups.put(groupname, group); modifiedGroups.remove(groupname); return group; } finally { groupsWriteLock.unlock(); } } finally { dbReadLock.unlock(); } } @Override public Role createRole(String rolename, String description) { dbReadLock.lock(); try { rolesWriteLock.lock(); try { Role role = new GenericRole<>(this, rolename, description); createdRoles.put(rolename, role); modifiedRoles.remove(rolename); return role; } finally { rolesWriteLock.unlock(); } } finally { dbReadLock.unlock(); } } @Override public User createUser(String username, String password, String fullName) { dbReadLock.lock(); try { usersWriteLock.lock(); try { User user = new GenericUser<>(this, username, password, fullName, null, null); createdUsers.put(username, user); modifiedUsers.remove(username); return user; } finally { usersWriteLock.unlock(); } } finally { dbReadLock.unlock(); } } @Override public Group findGroup(String groupname) { dbReadLock.lock(); try { groupsReadLock.lock(); try { // Check local changes first Group group = createdGroups.get(groupname); if (group != null) { return group; } group = modifiedGroups.get(groupname); if (group != null) { return group; } group = removedGroups.get(groupname); if (group != null) { return null; } if (isGroupStoreDefined()) { Connection dbConnection = openConnection(); if (dbConnection == null) { return null; } try { return findGroupInternal(dbConnection, groupname); } finally { closeConnection(dbConnection); } } else { return null; } } finally { groupsReadLock.unlock(); } } finally { dbReadLock.unlock(); } } public Group findGroupInternal(Connection dbConnection, String groupName) { Group group = null; try (PreparedStatement stmt = dbConnection.prepareStatement(preparedGroup)) { stmt.setString(1, groupName); try (ResultSet rs = stmt.executeQuery()) { if (rs.next()) { if (rs.getString(1) != null) { String description = (roleAndGroupDescriptionCol != null) ? rs.getString(2) : null; ArrayList<Role> groupRoles = new ArrayList<>(); if (groupName != null) { groupName = groupName.trim(); try (PreparedStatement stmt2 = dbConnection.prepareStatement(preparedGroupRoles)) { stmt2.setString(1, groupName); try (ResultSet rs2 = stmt2.executeQuery()) { while (rs2.next()) { String roleName = rs2.getString(1); if (roleName != null) { Role groupRole = findRoleInternal(dbConnection, roleName); if (groupRole != null) { groupRoles.add(groupRole); } } } } } catch (SQLException e) { log.error(sm.getString("dataSourceUserDatabase.exception"), e); } } group = new GenericGroup<>(this, groupName, description, groupRoles); } } } } catch (SQLException e) { log.error(sm.getString("dataSourceUserDatabase.exception"), e); } return group; } @Override public Role findRole(String rolename) { dbReadLock.lock(); try { rolesReadLock.lock(); try { // Check local changes first Role role = createdRoles.get(rolename); if (role != null) { return role; } role = modifiedRoles.get(rolename); if (role != null) { return role; } role = removedRoles.get(rolename); if (role != null) { return null; } if (userRoleTable != null && roleNameCol != null) { Connection dbConnection = openConnection(); if (dbConnection == null) { return null; } try { return findRoleInternal(dbConnection, rolename); } finally { closeConnection(dbConnection); } } else { return null; } } finally { rolesReadLock.unlock(); } } finally { dbReadLock.unlock(); } } public Role findRoleInternal(Connection dbConnection, String roleName) { Role role = null; try (PreparedStatement stmt = dbConnection.prepareStatement(preparedRole)) { stmt.setString(1, roleName); try (ResultSet rs = stmt.executeQuery()) { if (rs.next()) { if (rs.getString(1) != null) { String description = (roleAndGroupDescriptionCol != null) ? rs.getString(2) : null; role = new GenericRole<>(this, roleName, description); } } } } catch (SQLException e) { log.error(sm.getString("dataSourceUserDatabase.exception"), e); } return role; } @Override public User findUser(String username) { dbReadLock.lock(); try { usersReadLock.lock(); try { // Check local changes first User user = createdUsers.get(username); if (user != null) { return user; } user = modifiedUsers.get(username); if (user != null) { return user; } user = removedUsers.get(username); if (user != null) { return null; } Connection dbConnection = openConnection(); if (dbConnection == null) { return null; } try { return findUserInternal(dbConnection, username); } finally { closeConnection(dbConnection); } } finally { usersReadLock.unlock(); } } finally { dbReadLock.unlock(); } } public User findUserInternal(Connection dbConnection, String userName) { String dbCredentials = null; String fullName = null; try (PreparedStatement stmt = dbConnection.prepareStatement(preparedUser)) { stmt.setString(1, userName); try (ResultSet rs = stmt.executeQuery()) { if (rs.next()) { dbCredentials = rs.getString(1); if (userFullNameCol != null) { fullName = rs.getString(2); } } dbCredentials = (dbCredentials != null) ? dbCredentials.trim() : null; } } catch (SQLException e) { log.error(sm.getString("dataSourceUserDatabase.exception"), e); } // Lookup groups ArrayList<Group> groups = new ArrayList<>(); if (isGroupStoreDefined()) { try (PreparedStatement stmt = dbConnection.prepareStatement(preparedUserGroups)) { stmt.setString(1, userName); try (ResultSet rs = stmt.executeQuery()) { while (rs.next()) { String groupName = rs.getString(1); if (groupName != null) { Group group = findGroupInternal(dbConnection, groupName); if (group != null) { groups.add(group); } } } } } catch (SQLException e) { log.error(sm.getString("dataSourceUserDatabase.exception"), e); } } ArrayList<Role> roles = new ArrayList<>(); if (userRoleTable != null && roleNameCol != null) { try (PreparedStatement stmt = dbConnection.prepareStatement(preparedUserRoles)) { stmt.setString(1, userName); try (ResultSet rs = stmt.executeQuery()) { while (rs.next()) { String roleName = rs.getString(1); if (roleName != null) { Role role = findRoleInternal(dbConnection, roleName); if (role != null) { roles.add(role); } } } } } catch (SQLException e) { log.error(sm.getString("dataSourceUserDatabase.exception"), e); } } return new GenericUser<>(this, userName, dbCredentials, fullName, groups, roles); } @Override public void modifiedGroup(Group group) { dbReadLock.lock(); try { groupsWriteLock.lock(); try { String name = group.getName(); if (!createdGroups.containsKey(name) && !removedGroups.containsKey(name)) { modifiedGroups.put(name, group); } } finally { groupsWriteLock.unlock(); } } finally { dbReadLock.unlock(); } } @Override public void modifiedRole(Role role) { dbReadLock.lock(); try { rolesWriteLock.lock(); try { String name = role.getName(); if (!createdRoles.containsKey(name) && !removedRoles.containsKey(name)) { modifiedRoles.put(name, role); } } finally { rolesWriteLock.unlock(); } } finally { dbReadLock.unlock(); } } @Override public void modifiedUser(User user) { dbReadLock.lock(); try { usersWriteLock.lock(); try { String name = user.getName(); if (!createdUsers.containsKey(name) && !removedUsers.containsKey(name)) { modifiedUsers.put(name, user); } } finally { usersWriteLock.unlock(); } } finally { dbReadLock.unlock(); } } @Override public void open() throws Exception { if (log.isDebugEnabled()) { // As there are lots of parameters to configure, log some debug to help out log.debug(sm.getString("dataSourceUserDatabase.features", Boolean.toString(userRoleTable != null && roleNameCol != null), Boolean.toString(isRoleStoreDefined()), Boolean.toString(isGroupStoreDefined()))); } dbWriteLock.lock(); try { StringBuilder temp = new StringBuilder("SELECT "); temp.append(userCredCol); if (userFullNameCol != null) { temp.append(',').append(userFullNameCol); } temp.append(" FROM "); temp.append(userTable); temp.append(" WHERE "); temp.append(userNameCol); temp.append(" = ?"); preparedUser = temp.toString(); temp = new StringBuilder("SELECT "); temp.append(userNameCol); temp.append(" FROM "); temp.append(userTable); preparedAllUsers = temp.toString(); temp = new StringBuilder("SELECT "); temp.append(roleNameCol); temp.append(" FROM "); temp.append(userRoleTable); temp.append(" WHERE "); temp.append(userNameCol); temp.append(" = ?"); preparedUserRoles = temp.toString(); if (isGroupStoreDefined()) { temp = new StringBuilder("SELECT "); temp.append(groupNameCol); temp.append(" FROM "); temp.append(userGroupTable); temp.append(" WHERE "); temp.append(userNameCol); temp.append(" = ?"); preparedUserGroups = temp.toString(); temp = new StringBuilder("SELECT "); temp.append(roleNameCol); temp.append(" FROM "); temp.append(groupRoleTable); temp.append(" WHERE "); temp.append(groupNameCol); temp.append(" = ?"); preparedGroupRoles = temp.toString(); temp = new StringBuilder("SELECT "); temp.append(groupNameCol); if (roleAndGroupDescriptionCol != null) { temp.append(',').append(roleAndGroupDescriptionCol); } temp.append(" FROM "); temp.append(groupTable); temp.append(" WHERE "); temp.append(groupNameCol); temp.append(" = ?"); preparedGroup = temp.toString(); temp = new StringBuilder("SELECT "); temp.append(groupNameCol); temp.append(" FROM "); temp.append(groupTable); preparedAllGroups = temp.toString(); } if (isRoleStoreDefined()) { // Create the role PreparedStatement string temp = new StringBuilder("SELECT "); temp.append(roleNameCol); if (roleAndGroupDescriptionCol != null) { temp.append(',').append(roleAndGroupDescriptionCol); } temp.append(" FROM "); temp.append(roleTable); temp.append(" WHERE "); temp.append(roleNameCol); temp.append(" = ?"); preparedRole = temp.toString(); temp = new StringBuilder("SELECT "); temp.append(roleNameCol); temp.append(" FROM "); temp.append(roleTable); preparedAllRoles = temp.toString(); } else if (userRoleTable != null && roleNameCol != null) { // Validate roles existence from the user <-> roles table temp = new StringBuilder("SELECT "); temp.append(roleNameCol); temp.append(" FROM "); temp.append(userRoleTable); temp.append(" WHERE "); temp.append(roleNameCol); temp.append(" = ?"); preparedRole = temp.toString(); } } finally { dbWriteLock.unlock(); } } @Override public void removeGroup(Group group) { dbReadLock.lock(); try { groupsWriteLock.lock(); try { String name = group.getName(); createdGroups.remove(name); modifiedGroups.remove(name); removedGroups.put(name, group); } finally { groupsWriteLock.unlock(); } } finally { dbReadLock.unlock(); } } @Override public void removeRole(Role role) { dbReadLock.lock(); try { rolesWriteLock.lock(); try { String name = role.getName(); createdRoles.remove(name); modifiedRoles.remove(name); removedRoles.put(name, role); } finally { rolesWriteLock.unlock(); } } finally { dbReadLock.unlock(); } } @Override public void removeUser(User user) { dbReadLock.lock(); try { usersWriteLock.lock(); try { String name = user.getName(); createdUsers.remove(name); modifiedUsers.remove(name); removedUsers.put(name, user); } finally { usersWriteLock.unlock(); } } finally { dbReadLock.unlock(); } } @Override public void save() throws Exception { if (readonly) { return; } Connection dbConnection = openConnection(); if (dbConnection == null) { return; } dbWriteLock.lock(); try { try { saveInternal(dbConnection); } finally { closeConnection(dbConnection); } } finally { dbWriteLock.unlock(); } } protected void saveInternal(Connection dbConnection) { StringBuilder temp = null; StringBuilder tempRelation; StringBuilder tempRelationDelete = null; 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 "); temp.append(roleTable); temp.append('(').append(roleNameCol); if (roleAndGroupDescriptionCol != null) { temp.append(',').append(roleAndGroupDescriptionCol); } temp.append(") VALUES (?"); if (roleAndGroupDescriptionCol != null) { temp.append(", ?"); } temp.append(')'); for (Role role : createdRoles.values()) { try (PreparedStatement stmt = dbConnection.prepareStatement(temp.toString())) { stmt.setString(1, role.getRolename()); if (roleAndGroupDescriptionCol != null) { stmt.setString(2, role.getDescription()); } stmt.executeUpdate(); } catch (SQLException e) { log.error(sm.getString("dataSourceUserDatabase.exception"), e); } } createdRoles.clear(); } // Modified roles if (!modifiedRoles.isEmpty() && roleAndGroupDescriptionCol != null) { temp = new StringBuilder("UPDATE "); temp.append(roleTable); temp.append(" SET ").append(roleAndGroupDescriptionCol); temp.append(" = ? WHERE ").append(roleNameCol); temp.append(" = ?"); for (Role role : modifiedRoles.values()) { try (PreparedStatement stmt = dbConnection.prepareStatement(temp.toString())) { stmt.setString(1, role.getDescription()); stmt.setString(2, role.getRolename()); stmt.executeUpdate(); } catch (SQLException e) { log.error(sm.getString("dataSourceUserDatabase.exception"), e); } } modifiedRoles.clear(); } } else if (userRoleTable != null && roleNameCol != null) { // Only remove role from users tempRelationDelete = new StringBuilder("DELETE FROM "); tempRelationDelete.append(userRoleTable); tempRelationDelete.append(" WHERE "); tempRelationDelete.append(roleNameCol); tempRelationDelete.append(" = ?"); for (Role role : removedRoles.values()) { try (PreparedStatement stmt = dbConnection.prepareStatement(tempRelationDelete.toString())) { stmt.setString(1, role.getRolename()); stmt.executeUpdate(); } catch (SQLException e) { log.error(sm.getString("dataSourceUserDatabase.exception"), e); } } removedRoles.clear(); } if (isGroupStoreDefined()) { tempRelation = new StringBuilder("INSERT INTO "); tempRelation.append(groupRoleTable); tempRelation.append('(').append(groupNameCol).append(", "); tempRelation.append(roleNameCol); tempRelation.append(") VALUES (?, ?)"); String groupRoleRelation = tempRelation.toString(); // Always drop and recreate all group <-> role relations tempRelationDelete = new StringBuilder("DELETE FROM "); tempRelationDelete.append(groupRoleTable); tempRelationDelete.append(" WHERE "); tempRelationDelete.append(groupNameCol); 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 "); temp.append(groupTable); temp.append('(').append(groupNameCol); if (roleAndGroupDescriptionCol != null) { temp.append(',').append(roleAndGroupDescriptionCol); } temp.append(") VALUES (?"); if (roleAndGroupDescriptionCol != null) { temp.append(", ?"); } temp.append(')'); for (Group group : createdGroups.values()) { try (PreparedStatement stmt = dbConnection.prepareStatement(temp.toString())) { stmt.setString(1, group.getGroupname()); if (roleAndGroupDescriptionCol != null) { stmt.setString(2, group.getDescription()); } stmt.executeUpdate(); } catch (SQLException e) { log.error(sm.getString("dataSourceUserDatabase.exception"), e); } Iterator<Role> roles = group.getRoles(); while (roles.hasNext()) { Role role = roles.next(); try (PreparedStatement stmt = dbConnection.prepareStatement(groupRoleRelation)) { stmt.setString(1, group.getGroupname()); stmt.setString(2, role.getRolename()); stmt.executeUpdate(); } catch (SQLException e) { log.error(sm.getString("dataSourceUserDatabase.exception"), e); } } } createdGroups.clear(); } // Modified groups if (!modifiedGroups.isEmpty()) { if (roleAndGroupDescriptionCol != null) { temp = new StringBuilder("UPDATE "); temp.append(groupTable); temp.append(" SET ").append(roleAndGroupDescriptionCol); temp.append(" = ? WHERE ").append(groupNameCol); temp.append(" = ?"); } for (Group group : modifiedGroups.values()) { if (temp != null) { try (PreparedStatement stmt = dbConnection.prepareStatement(temp.toString())) { stmt.setString(1, group.getDescription()); stmt.setString(2, group.getGroupname()); stmt.executeUpdate(); } catch (SQLException e) { log.error(sm.getString("dataSourceUserDatabase.exception"), e); } } try (PreparedStatement stmt = dbConnection.prepareStatement(groupRoleRelationDelete)) { stmt.setString(1, group.getGroupname()); stmt.executeUpdate(); } catch (SQLException e) { log.error(sm.getString("dataSourceUserDatabase.exception"), e); } Iterator<Role> roles = group.getRoles(); while (roles.hasNext()) { Role role = roles.next(); try (PreparedStatement stmt = dbConnection.prepareStatement(groupRoleRelation)) { stmt.setString(1, group.getGroupname()); stmt.setString(2, role.getRolename()); stmt.executeUpdate(); } catch (SQLException e) { log.error(sm.getString("dataSourceUserDatabase.exception"), e); } } } modifiedGroups.clear(); } } String userRoleRelation = null; String userRoleRelationDelete = null; if (userRoleTable != null && roleNameCol != null) { tempRelation = new StringBuilder("INSERT INTO "); tempRelation.append(userRoleTable); tempRelation.append('(').append(userNameCol).append(", "); tempRelation.append(roleNameCol); tempRelation.append(") VALUES (?, ?)"); userRoleRelation = tempRelation.toString(); // Always drop and recreate all user <-> role relations tempRelationDelete = new StringBuilder("DELETE FROM "); tempRelationDelete.append(userRoleTable); tempRelationDelete.append(" WHERE "); tempRelationDelete.append(userNameCol); tempRelationDelete.append(" = ?"); userRoleRelationDelete = tempRelationDelete.toString(); } String userGroupRelation = null; String userGroupRelationDelete = null; if (isGroupStoreDefined()) { tempRelation = new StringBuilder("INSERT INTO "); tempRelation.append(userGroupTable); tempRelation.append('(').append(userNameCol).append(", "); tempRelation.append(groupNameCol); tempRelation.append(") VALUES (?, ?)"); userGroupRelation = tempRelation.toString(); // Always drop and recreate all user <-> group relations tempRelationDelete = new StringBuilder("DELETE FROM "); tempRelationDelete.append(userGroupTable); tempRelationDelete.append(" WHERE "); tempRelationDelete.append(userNameCol); tempRelationDelete.append(" = ?"); 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 "); temp.append(userTable); temp.append('(').append(userNameCol); temp.append(", ").append(userCredCol); if (userFullNameCol != null) { temp.append(',').append(userFullNameCol); } temp.append(") VALUES (?, ?"); if (userFullNameCol != null) { temp.append(", ?"); } temp.append(')'); for (User user : createdUsers.values()) { try (PreparedStatement stmt = dbConnection.prepareStatement(temp.toString())) { stmt.setString(1, user.getUsername()); stmt.setString(2, user.getPassword()); if (userFullNameCol != null) { stmt.setString(3, user.getFullName()); } stmt.executeUpdate(); } catch (SQLException e) { log.error(sm.getString("dataSourceUserDatabase.exception"), e); } if (userRoleRelation != null) { Iterator<Role> roles = user.getRoles(); while (roles.hasNext()) { Role role = roles.next(); try (PreparedStatement stmt = dbConnection.prepareStatement(userRoleRelation)) { stmt.setString(1, user.getUsername()); stmt.setString(2, role.getRolename()); stmt.executeUpdate(); } catch (SQLException e) { log.error(sm.getString("dataSourceUserDatabase.exception"), e); } } } if (userGroupRelation != null) { Iterator<Group> groups = user.getGroups(); while (groups.hasNext()) { Group group = groups.next(); try (PreparedStatement stmt = dbConnection.prepareStatement(userGroupRelation)) { stmt.setString(1, user.getUsername()); stmt.setString(2, group.getGroupname()); stmt.executeUpdate(); } catch (SQLException e) { log.error(sm.getString("dataSourceUserDatabase.exception"), e); } } } } createdUsers.clear(); } // Modified users if (!modifiedUsers.isEmpty()) { temp = new StringBuilder("UPDATE "); temp.append(userTable); temp.append(" SET ").append(userCredCol); temp.append(" = ?"); if (userFullNameCol != null) { temp.append(", ").append(userFullNameCol).append(" = ?"); } temp.append(" WHERE ").append(userNameCol); temp.append(" = ?"); for (User user : modifiedUsers.values()) { try (PreparedStatement stmt = dbConnection.prepareStatement(temp.toString())) { stmt.setString(1, user.getPassword()); if (userFullNameCol != null) { stmt.setString(2, user.getFullName()); stmt.setString(3, user.getUsername()); } else { stmt.setString(2, user.getUsername()); } stmt.executeUpdate(); } catch (SQLException e) { log.error(sm.getString("dataSourceUserDatabase.exception"), e); } 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); } } if (userRoleRelation != null) { Iterator<Role> roles = user.getRoles(); while (roles.hasNext()) { Role role = roles.next(); try (PreparedStatement stmt = dbConnection.prepareStatement(userRoleRelation)) { stmt.setString(1, user.getUsername()); stmt.setString(2, role.getRolename()); stmt.executeUpdate(); } catch (SQLException e) { log.error(sm.getString("dataSourceUserDatabase.exception"), e); } } } if (userGroupRelation != null) { Iterator<Group> groups = user.getGroups(); while (groups.hasNext()) { Group group = groups.next(); try (PreparedStatement stmt = dbConnection.prepareStatement(userGroupRelation)) { stmt.setString(1, user.getUsername()); stmt.setString(2, group.getGroupname()); stmt.executeUpdate(); } catch (SQLException e) { log.error(sm.getString("dataSourceUserDatabase.exception"), e); } } } } modifiedGroups.clear(); } } @Override public boolean isAvailable() { return connectionSuccess; } /** * Only use groups if the tables are fully defined. * * @return true when groups are used */ protected boolean isGroupStoreDefined() { return groupTable != null && userGroupTable != null && groupNameCol != null && groupRoleTable != null && isRoleStoreDefined(); } /** * Only use roles if the tables are fully defined. * * @return true when roles are used */ protected boolean isRoleStoreDefined() { return roleTable != null && userRoleTable != null && roleNameCol != null; } /** * Open the specified database connection. * * @return Connection to the database */ protected Connection openConnection() { if (dataSource == null) { return null; } try { Connection connection = dataSource.getConnection(); connectionSuccess = true; return connection; } catch (Exception e) { connectionSuccess = false; // Log the problem for posterity log.error(sm.getString("dataSourceUserDatabase.exception"), e); } return null; } /** * Close the specified database connection. * * @param dbConnection The connection to be closed */ protected void closeConnection(Connection dbConnection) { // Do nothing if the database connection is already closed if (dbConnection == null) { return; } // Commit if not auto committed try { if (!dbConnection.getAutoCommit()) { dbConnection.commit(); } } catch (SQLException e) { log.error(sm.getString("dataSourceUserDatabase.exception"), e); } // Close this database connection, and log any errors try { dbConnection.close(); } catch (SQLException e) { log.error(sm.getString("dataSourceUserDatabase.exception"), e); } } }
Detected license expression
apache-2.0
Detected license expression (SPDX)
Apache-2.0
Percentage of license text
2.84
Copyrights

      
    
Holders

      
    
Authors

      
    
License detections License expression License expression SPDX
apache_2_0-4bde3f57-78aa-4201-96bf-531cba09e7de apache-2.0 Apache-2.0
URL Start line End line
http://www.apache.org/licenses/LICENSE-2.0 9 9