/* * JBoss, Home of Professional Open Source. * Copyright 2012, Red Hat, Inc., and individual contributors * as indicated by the @author tags. See the copyright.txt file in the * distribution for a full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.as.domain.management.security.adduser; import org.jboss.as.domain.management.security.PropertiesFileLoader; import org.jboss.msc.service.StartException; import org.junit.Before; import java.io.File; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; import java.util.Properties; import java.util.regex.Matcher; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; /** * Helper for setting up a test case with ConsoleMock, StateValues and * property files for user and roles * * @author <a href="mailto:flemming.harms@gmail.com">Flemming Harms</a> */ public class PropertyTestHelper { protected static final String USER_NAME = "Aldo.Raine"; protected static final String ROLES = "admin, jms"; protected ConsoleMock consoleMock; protected StateValues values; @Before public void setUp() throws IOException { ArrayList<File> usersPropertyFileList = new ArrayList<File>(); ArrayList<File> rolesPropertyFileList = new ArrayList<File>(); File usersPropertyFile = File.createTempFile("UpdateUser", null); usersPropertyFile.deleteOnExit(); File rolesPropertyFile = File.createTempFile("UpdateRoles", null); rolesPropertyFile.deleteOnExit(); usersPropertyFileList.add(usersPropertyFile); rolesPropertyFileList.add(rolesPropertyFile); values = new StateValues(); values.setUserFiles(usersPropertyFileList); values.setGroupFiles(rolesPropertyFileList); values.setUserName(USER_NAME); values.setPassword("1sT%l<[pzD"); values.setRealm("Management"); consoleMock = new ConsoleMock(); } protected Properties loadProperties(String filePath) throws StartException, IOException { PropertiesFileLoader propertiesLoad = new PropertiesFileLoader(filePath, null); propertiesLoad.start(null); Properties properties = (Properties) propertiesLoad.getProperties().clone(); propertiesLoad.stop(null); return properties; } protected void assertUserPropertyFile(String userName) throws StartException, IOException { assertUserPropertyFile(userName, null); } protected void assertUserPropertyFile(String userName, String expectedPassword) throws StartException, IOException { assertUserPropertyFile(userName, expectedPassword, values.getOptions().isDisable()); } private void assertUserPropertyFile(String userName, String expectedPassword, boolean disable) throws StartException, IOException { final String password; password = getPassword(userName, disable); assertNotNull(password); if (expectedPassword != null) { assertEquals(expectedPassword, password); } } protected String getPassword(String userName) throws IOException, StartException { return getValueFromFile(userName, values.getUserFiles().get(0).getAbsolutePath(), false); } private String getPassword(String userName, boolean disable) throws IOException, StartException { String password; if (disable) { // Read the file line by line and return the password of the user password = getDisabledUserPassword(userName); } else { // Load the properties and return the password of the user password = getEnabledUserPassword(userName); } return password; } protected void assertRolePropertyFile(String userName) throws StartException, IOException { assertRolePropertyFile(userName, values.getGroups()); } protected void assertRolePropertyFile(String userName, String expectedRoles) throws StartException, IOException { assertRolePropertyFile(userName, expectedRoles, values.getOptions().isDisable()); } private void assertRolePropertyFile(String userName, String expectedRoles, boolean disable) throws StartException, IOException { final String roles; roles = getRoles(userName, disable); assertEquals(expectedRoles, roles); } protected String getRoles(String userName) throws IOException, StartException { return getValueFromFile(userName, values.getGroupFiles().get(0).getAbsolutePath(), false); } private String getRoles(String userName, boolean disable) throws IOException, StartException { String roles; if (disable) { // Read the file line by line and return the roles of the user roles = getDisabledUserRoles(userName); } else { // Load the properties and return the roles of the user roles = getEnabledUserRoles(userName); } return roles; } /** * Get the password of the enabled user.<br/> * Read the properties users file and return the password of the user * * @param userName The name of the user * @return The password of the user * @throws StartException * @throws IOException */ protected String getEnabledUserPassword(String userName) throws StartException, IOException { return getValueFromProperty(userName, values.getUserFiles().get(0).getAbsolutePath()); } /** * Get the roles of the enabled user.<br/> * Read the properties roles file and return the roles of the user * * @param userName The name of the user * @return The roles of the user * @throws StartException * @throws IOException */ protected String getEnabledUserRoles(String userName) throws StartException, IOException { return getValueFromProperty(userName, values.getGroupFiles().get(0).getAbsolutePath()); } /** * Load properties from the file and return the value of the username property * * @param userName The name of the user * @param filePath The file path * @return The value of the username property * @throws StartException * @throws IOException */ private String getValueFromProperty(String userName, String filePath) throws StartException, IOException { Properties properties = loadProperties(filePath); return (String) properties.get(userName); } /** * Get the password of the disabled user.<br/> * Read the users file line by line and return the password of the user. * * @param userName The name of the user * @return The password of the user * @throws IOException * @see #getDisabledValueFromFile(String, String) */ private String getDisabledUserPassword(String userName) throws IOException { return getDisabledValueFromFile(userName, values.getUserFiles().get(0).getAbsolutePath()); } /** * Get the roles of the disabled user.<br/> * Read the roles file line by line and return the roles of the user. * * @param userName The name of the user * @return The roles of the user * @throws IOException */ private String getDisabledUserRoles(String userName) throws IOException { return getDisabledValueFromFile(userName, values.getGroupFiles().get(0).getAbsolutePath()); } /** * Count the number of lines in the users file. * * @return The number of lines in the file * @throws IOException */ protected int countLineNumberUserFile() throws IOException { return readContent(values.getUserFiles().get(0).getAbsolutePath()).size(); } /** * Count the number of lines in the roles file * * @return The number of lines in the file * @throws IOException */ protected int countLineNumberRoleFile() throws IOException { return readContent(values.getGroupFiles().get(0).getAbsolutePath()).size(); } /** * Get the value of the disabled username line.<br/> * Read the file line by line and return the disabled value of the username line. * * @param userName The name of the user * @param filePath The file path * @return The disabled value of the username line * @throws IOException */ private String getDisabledValueFromFile(String userName, String filePath) throws IOException { return getValueFromFile(userName, filePath, true); } /** * Get the value of the username line.<br/> * Read the file line by line and return the value of the username line. * * @param userName The name of the user * @param filePath The file path * @param onlyDisabledLine return only disabled line * @return The value of the username line * @throws IOException */ private String getValueFromFile(String userName, String filePath, boolean onlyDisabledLine) throws IOException { List<String> content = readContent(filePath); boolean found = false; String value = null; for (String line : content) { String trimmed = line.trim(); Matcher matcher = PropertiesFileLoader.PROPERTY_PATTERN.matcher(trimmed); if (!onlyDisabledLine || trimmed.startsWith("#")) { if (matcher.matches() && userName.equals(matcher.group(1))) { found = true; value = matcher.group(2); break; } } } assertTrue(found); return value; } private List<String> readContent(String filePath) throws IOException { return Files.readAllLines(Paths.get(filePath), StandardCharsets.UTF_8); } }