package at.gv.egovernment.moa.id.configuration.config.usermanagement; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import org.apache.commons.collections4.map.HashedMap; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import at.gv.egiz.components.configuration.api.Configuration; import at.gv.egiz.components.configuration.api.ConfigurationException; import at.gv.egiz.components.configuration.file.PropertiesBasedConfiguration; import at.gv.egiz.eaaf.core.impl.utils.KeyValueUtils; import at.gv.egovernment.moa.id.commons.db.dao.config.UserDatabase; import at.gv.egovernment.moa.id.commons.db.ex.MOADatabaseException; import at.gv.egovernment.moa.util.MiscUtil; public class FileBasedUserConfiguration implements UserConfiguration { private static final Logger logger = LoggerFactory.getLogger(FileBasedUserConfiguration.class); public static final String CONFIG_FILE_PROPERTY = "user.properties"; private Configuration userconfig; public FileBasedUserConfiguration() { String cfgFile = System.getProperty(CONFIG_FILE_PROPERTY); if(cfgFile == null) { throw new RuntimeException("Please configure " + CONFIG_FILE_PROPERTY + " to provide user database"); } try { userconfig = new PropertiesBasedConfiguration(new File(cfgFile)); } catch (IOException | ConfigurationException e) { logger.error("Failed to build configuration in user modul!"); throw new RuntimeException(e); } } /** * * @return */ public List getAllUsers() { logger.trace("Get All Users from database."); // select userdatabase from UserDatabase userdatabase List result = new ArrayList(); try { String[] userIDs = userconfig.getConfigurationIdNextLevel(UserDatabase.PREFIX); for (String userID : userIDs) { String[] userKeys = userconfig.findConfigurationId(UserDatabase.PREFIX + "." + userID + ".*"); Map keyValue = new HashMap(); if (userKeys.length > 0) { for (String key : userKeys) { keyValue.put( KeyValueUtils.removePrefixFromKey( key, UserDatabase.PREFIX + "." + userID + "."), userconfig.getStringValue(key)); } UserDatabase userDAO = new UserDatabase(keyValue); userDAO.setHjid(userID); result.add(userDAO); } } if (result.size() == 0) { logger.trace("No entries found."); return null; } return result; } catch (ConfigurationException e) { logger.error("Access UserDatabase FAILED", e); return null; } } /** * * @return */ public List getAllOpenUsersRequests() { logger.trace("Get all new Users from Database"); // select userdatabase from UserDatabase userdatabase // where userdatabase.userRequestTokken is not null // and userdatabase.isAdminRequest = '1' and userdatabase.isMailAddressVerified = '0' List result = new ArrayList(); List allUsers = getAllUsers(); for (UserDatabase user : nullGuard(allUsers)) { // TODO check result of query "... userdatabase.userRequestTokken is not null" if Tokken is null -> (null, "NULL", "", ... ?) if ((user.getUserRequestTokken() != null && !user.getUserRequestTokken().isEmpty() && !user.getUserRequestTokken().equals("NULL")) && (user.isIsAdminRequest()) && (!user.isIsMailAddressVerified())) { result.add(user); } } if (result.size() == 0) { logger.trace("No entries found."); return null; } return result; } /** * * @param tokken * @return */ public UserDatabase getNewUserWithTokken(String tokken) { logger.trace("Getting Userinformation with Tokken " + tokken + " from database."); // select userdatabase from UserDatabase userdatabase where userdatabase.userRequestTokken = :tokken UserDatabase result = null; List allUsers = getAllUsers(); for (UserDatabase user : nullGuard(allUsers)) { if (user.getUserRequestTokken() != null && user.getUserRequestTokken().equals(tokken)) { result = user; break; } } return result; } /** * * @param id * @return */ public UserDatabase getUsersWithOADBID(long id) { logger.trace("Getting Userinformation with OADBID " + id + " from database."); // select userdatabase from UserDatabase userdatabase // inner join userdatabase.onlineApplication oa where oa.hjid = :id UserDatabase result = null; List allUsers = getAllUsers(); boolean quit = false; for (UserDatabase user : nullGuard(allUsers)) { for (String oa : user.getOnlineApplication()) { if (oa.equals(String.valueOf(id))) { result = user; quit = true; break; } } if (quit) { break; } } return result; } /** * * @param id * @return */ public UserDatabase getUserWithID(long id) { logger.trace("Getting Userinformation with ID " + id + " from database."); // select userdatabase from UserDatabase userdatabase where userdatabase.hjid = :id UserDatabase result = null; List allUsers = getAllUsers(); for (UserDatabase user : nullGuard(allUsers)) { if (user.getHjid().equals(String.valueOf(id))) { result = user; break; } } return result; } /** * * @param username * @return */ public UserDatabase getUserWithUserName(String username) { logger.trace("Getting Userinformation with ID " + username + " from database."); // select userdatabase from UserDatabase userdatabase where userdatabase.username = :username UserDatabase result = null; List allUsers = getAllUsers(); for (UserDatabase user : nullGuard(allUsers)) { if (MiscUtil.isNotEmpty(user.getUsername()) && user.getUsername().equals(username)) { result = user; break; } } return result; } /** * * @param bpkwbpk * @return */ public UserDatabase getUserWithUserBPKWBPK(String bpkwbpk) { logger.trace("Getting Userinformation with ID " + bpkwbpk + " from database."); // select userdatabase from UserDatabase userdatabase where userdatabase.bpk = :bpk UserDatabase result = null; List allUsers = getAllUsers(); for (UserDatabase user : nullGuard(allUsers)) { if (user.getBpk() != null && user.getBpk().equals(bpkwbpk)) { result = user; break; } } return result; } /** * @return */ public List getAllNewUsers() { List result = new ArrayList(); List allUsers = getAllUsers(); for (UserDatabase user : nullGuard(allUsers)) { // TODO check result of query "... userdatabase.userRequestTokken is not null" if Tokken is null -> (null, "NULL", "", ... ?) if (((user.getUserRequestTokken() == null || user.getUserRequestTokken().isEmpty() || user.getUserRequestTokken().equals("NULL"))) && (user.isIsAdminRequest()) && (user.isIsMailAddressVerified())) { result.add(user); } } if (result.size() == 0) { logger.trace("No entries found."); return null; } return result; } /** * @param user */ public void saveOrUpdate(UserDatabase user) throws MOADatabaseException{ List allUsers = getAllUsers(); if (allUsers == null) { Set> keySet = user.getKeyValuePairs().entrySet(); for (Entry el : keySet) { try { if (MiscUtil.isNotEmpty(el.getValue())) { userconfig.setStringValue(UserDatabase.PREFIX + ".0." + el.getKey(), el.getValue()); } } catch (ConfigurationException e) { logger.error("Can not store Userentry with key: " + UserDatabase.PREFIX + ".0." + el.getKey(), e); } } } else { boolean isUpdated = false; for (UserDatabase dbUser : allUsers) { if (dbUser.getHjid().equals(user.getHjid())) { logger.debug("User is already stored -> start update process ..."); Set> keySet = user.getKeyValuePairs().entrySet(); for (Entry el : keySet) { try { if (MiscUtil.isNotEmpty(el.getValue())) userconfig.setStringValue(UserDatabase.PREFIX + "." + user.getHjid() + "." + el.getKey(), el.getValue()); } catch (ConfigurationException e) { logger.error("Can not store Userentry with key: " + UserDatabase.PREFIX + "." + user.getHjid() + "." + el.getKey(), e); } } isUpdated = true; break; } } if (!isUpdated) { try { String[] temp = userconfig.findConfigurationId(UserDatabase.PREFIX + ".*." + UserDatabase.ISACTIVE); int newID = KeyValueUtils.findNextFreeListCounter(temp, UserDatabase.PREFIX); logger.debug("Add new User with ID:" + String.valueOf(newID)); Set> keySet = user.getKeyValuePairs().entrySet(); for (Entry el : keySet) { try { if (MiscUtil.isNotEmpty(el.getValue())) userconfig.setStringValue(UserDatabase.PREFIX + "." + String.valueOf(newID) + "." + el.getKey(), el.getValue()); } catch (ConfigurationException e) { logger.error("Can not store Userentry with key: " + UserDatabase.PREFIX + "." + String.valueOf(newID) + "." + el.getKey(), e); } } } catch (ConfigurationException e) { logger.error("Access UserDatabase FAILED", e); } } } try { userconfig.synchronize(); } catch (ConfigurationException e) { logger.error("Access UserDatabase FAILED", e); } } /** * @param dbuser */ public void delete(UserDatabase dbuser) { try { logger.debug("Delete User with ID: " + dbuser.getHjid()); userconfig.deleteIds(UserDatabase.PREFIX + "." + dbuser.getHjid() + "*"); userconfig.synchronize(); } catch (ConfigurationException e) { logger.error("Access UserManagement Database FAILED!", e); } } @SuppressWarnings("unchecked") public static > T nullGuard(T item) { if (item == null) { return (T) Collections.emptyList(); } else { return item; } } }