use of org.apache.catalina.User in project tomcat by apache.
the class DataSourceUserDatabaseTests method testUserDatabase.
@Test
public void testUserDatabase() throws Exception {
db = new DerbyUserDatabase("full");
db.setReadonly(false);
db.setUserTable("users");
db.setUserNameCol("user_name");
db.setUserCredCol("user_pass");
db.setUserRoleTable("user_roles");
db.setUserGroupTable("user_groups");
db.setRoleTable("roles");
db.setRoleNameCol("role_name");
db.setGroupTable("groups");
db.setGroupNameCol("group_name");
db.setGroupRoleTable("group_roles");
// Not setting the description or full name since it allows checking persistence,
// as any modification is kept in memory until save()
db.open();
// First create the DB tables
Connection connection = db.getConnection();
for (String sql : FULL_SCHEMA.split(";")) {
try (Statement statement = connection.createStatement()) {
statement.execute(sql);
}
}
Iterator<User> users = db.getUsers();
Assert.assertFalse("Some users found", users.hasNext());
User tomcatUser = db.createUser("tomcat", "password", "A new user");
User randomUser = db.createUser("random", "password", "Another new user");
Role adminRole = db.createRole("admin", "Admin role");
Role managerRole = db.createRole("manager", "Manager role");
Role userRole = db.createRole("user", "User role");
Group userGroup = db.createGroup("users", "All users");
userGroup.addRole(userRole);
tomcatUser.addRole(adminRole);
tomcatUser.addGroup(userGroup);
randomUser.addGroup(userGroup);
db.save();
users = db.getUsers();
Assert.assertTrue("No users found", users.hasNext());
tomcatUser = users.next();
if (!tomcatUser.getUsername().equals("tomcat")) {
tomcatUser = users.next();
}
Assert.assertTrue("Wrong user", tomcatUser.getUsername().equals("tomcat"));
Assert.assertTrue("Wrong password", tomcatUser.getPassword().equals("password"));
// Cannot save the user full name
Assert.assertNull("Wrong user fullname", tomcatUser.getFullName());
adminRole = db.findRole("admin");
Assert.assertNotNull("No admin role", adminRole);
Assert.assertNull("Wrong admin role", adminRole.getDescription());
Assert.assertTrue("No role for user", tomcatUser.isInRole(adminRole));
managerRole = db.findRole("manager");
Assert.assertFalse("Unexpected role for user", tomcatUser.isInRole(managerRole));
userRole = db.findRole("user");
userGroup = db.findGroup("users");
Assert.assertNull("Wrong users group", userGroup.getDescription());
Assert.assertTrue("No role for group", userGroup.isInRole(userRole));
randomUser = db.findUser("random");
Assert.assertTrue("No group for user", randomUser.isInGroup(userGroup));
db.close();
}
use of org.apache.catalina.User in project tomcat by apache.
the class DataSourceUserDatabase method createUser.
@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();
}
}
use of org.apache.catalina.User in project tomcat by apache.
the class DataSourceUserDatabase method getUsers.
@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();
}
}
use of org.apache.catalina.User in project tomcat by apache.
the class DataSourceUserDatabase method saveInternal.
protected void saveInternal(Connection dbConnection) {
StringBuilder temp = null;
StringBuilder tempRelation = null;
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();
}
}
use of org.apache.catalina.User in project tomcat by apache.
the class DataSourceUserDatabase method findUser.
@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();
}
}
Aggregations