/* Copyright (c) 2003 eInnovation Inc. All rights reserved This library 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 library 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. */ package com.openedit.users.filesystem; import java.io.File; import java.io.FileWriter; import java.io.FilenameFilter; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.TreeSet; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.dom4j.Document; import org.dom4j.DocumentFactory; import org.dom4j.Element; import org.openedit.event.WebEvent; import org.openedit.event.WebEventHandler; import org.openedit.repository.ContentItem; import org.openedit.util.DateStorageUtil; import org.openedit.xml.XmlArchive; import org.openedit.xml.XmlFile; import com.openedit.OpenEditException; import com.openedit.hittracker.HitTracker; import com.openedit.hittracker.ListHitTracker; import com.openedit.page.Page; import com.openedit.page.manage.PageManager; import com.openedit.users.Authenticator; import com.openedit.users.DuplicateGroupException; import com.openedit.users.DuplicateUserException; import com.openedit.users.Group; import com.openedit.users.GroupComparator; import com.openedit.users.User; import com.openedit.users.UserComparator; import com.openedit.users.UserManagerException; import com.openedit.users.UserNotEnabledException; import com.openedit.users.authenticate.AuthenticationRequest; import com.openedit.users.authenticate.PasswordGenerator; import com.openedit.util.IntCounter; import com.openedit.util.PathUtilities; import com.openedit.util.StringEncryption; import com.openedit.util.XmlUtil; /** * This user manager stores its users as files in a directory. Note that clients * of this user manager must set the user and group directories, then call * {@link #load()}. * * @author Eric and Matt * * @see #setUserDirectory(File) * @see #setGroupDirectory(File) * @see #load() */ public class XmlUserArchive { protected String fieldCatalogId; public String getCatalogId() { return fieldCatalogId; } public void setCatalogId(String inCatalogId) { fieldCatalogId = inCatalogId; } //protected String fieldGroupDirectory; //protected String fieldUserDirectory; protected IntCounter fieldUserIdCounter; protected Map fieldGroupIdToGroupMap; protected Map fieldUserNameToUserMap; protected XmlArchive fieldXmlArchive; protected long fieldLastEditTime; protected Authenticator fieldAuthenticator; protected StringEncryption fieldStringEncryption; protected boolean fieldAllUsersLoaded = false; protected PageManager fieldPageManager; protected WebEventHandler fieldWebEventHandler; protected PermissionsManager fieldPermissionsManager; protected XmlUtil fieldXmlUtil; private static final Log log = LogFactory .getLog(XmlUserArchive.class); private static final int MAX_LOGIN_FAILS = 5; /** * Constructor for FileSystemUserManager. */ public XmlUserArchive() { super(); } // public FileSystemUserManager(String inUserDirectory, String inGroupDirectory) // throws UserManagerException { // setUserDirectory(inUserDirectory); // setGroupDirectory(inGroupDirectory); // } public List getPermissions() throws UserManagerException { return getPermissionsManager().getSystemPermissions(); } public List getSystemPermissionGroups() { return getPermissionsManager().getSystemPermissionGroups(); } /* * (non-Javadoc) * * @see * com.openedit.users.filesystem.FileSystemUserLocator#getFileSystemUser * (String) */ public FileSystemUser getFileSystemUser(String inUserName) throws UserManagerException { return (FileSystemUser) getUser(inUserName); } /** * @see com.openedit.users.UserManager#getGroup(String) */ public Group getGroup(String inGroupId) { Group group = (Group) getGroupIdToGroupMap().get(inGroupId); File find = loadGroupFile(inGroupId); if (group != null) { if (group.getLastModified() == find.lastModified()) { return group; } } if (!find.exists()) { ContentItem stub = getPageManager().getRepository().getStub( "/WEB-INF/groups/" + inGroupId + ".xml"); find = new File(stub.getAbsolutePath()); } if (!find.exists()) { return null; } if (group == null) { // System.out.println("calling " + inGroupId + " " + hashCode() ); group = new FileSystemGroup(); } FileSystemGroup loadgroup = (FileSystemGroup) group; group = loadgroup; loadgroup.setLastModified(find.lastModified()); getGroupIdToGroupMap().put(inGroupId, group); Element root = getXmlUtil().getXml(find, "UTF-8"); loadgroup.setId(root.attributeValue("id")); if (loadgroup.getId() == null) { loadgroup.setId(inGroupId); } loadgroup.setName(root.elementText("group-name")); if (loadgroup.getName() == null) { loadgroup.setName(inGroupId); } Element perm = root.element("permissions"); if (perm != null) { for (Iterator iterator = perm.elementIterator("permission"); iterator .hasNext();) { Element type = (Element) iterator.next(); loadgroup.addPermission(type.getTextTrim()); } } MapPropertyContainer properties = new MapPropertyContainer(); Element props = root.element("properties"); properties.loadProperties(props); loadgroup.setPropertyContainer(properties); return loadgroup; } /** * Sets the directory in which all the group XML files reside. * * @param groupDirectory * The new group directory */ // public void setGroupDirectory(String groupDirectory) { // fieldGroupDirectory = groupDirectory; // } /** * Returns the directory in which all the group XML files reside. * * @return File */ public String getGroupDirectory() { return "/WEB-INF/data/" + getCatalogId() + "/groups"; } /** * @see com.openedit.users.UserManager#getGroups() */ public HitTracker getGroups() { Collection ids = listGroupIds(); TreeSet treeSet = new java.util.TreeSet(new GroupComparator()); for (Iterator iterator = ids.iterator(); iterator.hasNext();) { String id = (String) iterator.next(); treeSet.add(getGroup(id)); } ListHitTracker list = new ListHitTracker(new ArrayList(treeSet)); list.setHitsName("groups"); list.setCatalogId(getCatalogId()); return list; } public Collection getGroupsSorted() { TreeSet treeSet = new java.util.TreeSet(new GroupComparator()); treeSet.addAll(getGroups()); return treeSet; } /** * @see com.openedit.users.UserManager#getUser(String) */ public User getUser(String inUserName) { if (inUserName == null) { return null; } User user = (User) getUserNameToUserMap().get(inUserName); if (user == null) { user = loadUser(inUserName); } return user; } /** * Sets the directory in which all the user XML files reside. * * @param userDirectory * The new user directory */ // public void setUserDirectory(String userDirectory) { // fieldUserDirectory = userDirectory; // } /** * Returns the directory in which all the user XML files reside. * * @return File */ public String getUserDirectory() { return "/WEB-INF/data/" + getCatalogId() + "/users"; } public void setPageManager(PageManager pageManager) { fieldPageManager = pageManager; } public PageManager getPageManager() { return fieldPageManager; } /** * @see com.openedit.users.UserManager#getUsers() */ public HitTracker getUsers() { List col = listUserNames(); HitTracker tracker = new ListHitTracker(); for (Iterator iterator = col.iterator(); iterator.hasNext();) { String id = (String) iterator.next(); User user = getUser(id); if (id != null) { tracker.add(user); } } return tracker; } public List listUserNames() { List all = new ArrayList(); ContentItem item = getPageManager().getRepository().get( getUserDirectory()); File users = new File(item.getAbsolutePath()); File[] files = users.listFiles(new FilenameFilter() { public boolean accept(File dir, String name) { return name.endsWith(".xml"); } }); if (files != null) { for (int i = 0; i < files.length; i++) { String username = PathUtilities.extractPageName(files[i] .getName()); all.add(username); } } // // Temporary // item = getPageManager().getRepository().get("/WEB-INF/users"); // users = new File(item.getAbsolutePath()); // // files = users.listFiles(new FilenameFilter() { // public boolean accept(File dir, String name) { // return name.endsWith(".xml"); // } // }); // if (files != null) { // for (int i = 0; i < files.length; i++) { // String username = PathUtilities.extractPageName(files[i] // .getName()); // if (!all.contains(username)) { // all.add(username); // } // } // } return all; } /** * Move this API to the UserManager * @see com.openedit.users.UserManager#authenticate(User, String) */ public boolean authenticate(User inUser, String inPassword) throws UserManagerException { AuthenticationRequest req = new AuthenticationRequest(); req.setUser(inUser); req.setPassword(inPassword); return authenticate(req); } public boolean authenticate(AuthenticationRequest inReq) throws UserManagerException { User inUser = inReq.getUser(); if (!inUser.isEnabled()) { throw new UserNotEnabledException(); } boolean success = getAuthenticator().authenticate(inReq); if (success) { fireUserEvent(inUser, "login"); } else { fireUserEvent(inUser, "invalidpassword"); } return success; } /** * @see com.openedit.users.UserManager#createGroup(String) */ public Group createGroup(String inGroupId, String inGroupName) throws UserManagerException { if (getGroupIdToGroupMap().containsKey(inGroupId)) { throw new DuplicateGroupException( "A group already exists with the id \"" + inGroupId + "\""); } else { // File file = createGroupFile(inGroupName); FileSystemGroup group = new FileSystemGroup(); group.setId(inGroupId); group.setName(inGroupName); getGroupIdToGroupMap().put(inGroupId, group); saveGroup(group); return group; } } public Group createGroup(String inGroupId) throws UserManagerException { return createGroup(inGroupId, inGroupId); } public Group createGroup() throws UserManagerException { return new FileSystemGroup(); } /** * @see com.openedit.users.UserManager#createUser(String, String) */ public User createUser(String inUserName, String inPassword) throws UserManagerException { if (inUserName == null) // when null then we are picking up the next // user from the list. May be dup username { int id = getUserIdCounter().incrementCount(); inUserName = String.valueOf(id); User user = getUser(inUserName); if (user != null) { return user; } } else if (getUser(inUserName) != null) { throw new DuplicateUserException( "A user already exists with the username \"" + inUserName + "\""); } if (inPassword == null || inPassword.length() <= 0) { inPassword = new PasswordGenerator().generate();// Integer.toString((int)(100000 // + // generator.nextDouble() // * 899999D)); } inPassword = encrypt(inPassword); createUserFile(inUserName, inPassword); User user = getUser(inUserName); fireUserEvent(user, "add"); return user; } /** * May be subclassed */ public User loadUser(String inUserName) throws UserManagerException { ContentItem userfolder = getPageManager().getRepository().getStub( getUserDirectory() + "/" ); if(!userfolder.exists()){ File userfolderfile = new File(userfolder.getAbsolutePath()); userfolderfile.mkdirs(); } File userFile = loadUserFile(inUserName); if (!userFile.exists()) { ContentItem stub = getPageManager().getRepository().getStub( "/WEB-INF/users/" + inUserName + ".xml"); userFile = new File(stub.getAbsolutePath()); } if (!userFile.exists()) { return null; } FileSystemUser user = new FileSystemUser(); user.setUserName(inUserName); Element root = getXmlUtil().getXml(userFile, "UTF-8"); user.setEnabled(true); // String enabled = root.attributeValue("enabled"); // if (enabled != null && Boolean.parseBoolean(enabled) == false) // { // user.setEnabled(false); // } // else // { // user.setEnabled(true); // } Element passwordElem = root.element("password"); if (passwordElem != null) { user.setPassword(passwordElem.getText()); } Element lastLoginElem = root.element("lastLogined-Time"); if (lastLoginElem != null) { user.setLastLoginTime(lastLoginElem.getText()); } Element creationDateElem = root.element("creation-date"); if (creationDateElem != null) { long time = Long.parseLong(creationDateElem.getText()); user.setCreationDate(new Date(time)); } MapPropertyContainer container = new MapPropertyContainer(); container.loadProperties(root.element("properties")); user.setPropertyContainer(container); for (Iterator iter = root.elementIterator("group"); iter.hasNext();) { Element group = (Element) iter.next(); Group g = getGroup(group.attributeValue("id")); if (g != null) { user.addGroup(g); } else { log.error("Missing group " + group.attributeValue("id")); } } // TODO :Replace with cache getUserNameToUserMap().put(user.getUserName(), user); return user; } /** * @see com.openedit.users.UserManager#deleteGroup(Group) */ public void deleteGroup(Group inGroup) throws UserManagerException { for (Iterator iter = listUserNames().iterator(); iter.hasNext();) { String username = (String) iter.next(); User user = getUser(username); user.removeGroup(inGroup); } File file = loadGroupFile(inGroup.getId()); file.delete(); getGroupIdToGroupMap().remove(inGroup.getId()); Page item = getPageManager().getPage( "/WEB-INF/groups/" + inGroup.getId() + ".xml"); getPageManager().removePage(item); } /** * @see com.openedit.users.UserManager#deleteUser(User) */ public void deleteUser(User inUser) throws UserManagerException { File file = loadUserFile(inUser.getUserName()); file.delete(); getUserNameToUserMap().remove(inUser.getUserName()); fireUserEvent(inUser, "delete"); // get rid of the old location too.. Page item = getPageManager().getPage( "/WEB-INF/users/" + inUser.getId() + ".xml"); getPageManager().removePage(item); } public void deleteGroups(List inGroups) throws UserManagerException { if (inGroups != null) { for (Iterator iter = inGroups.iterator(); iter.hasNext();) { Group group = (Group) iter.next(); deleteGroup(group); } } } public void deleteUsers(List inUsers) throws UserManagerException { if (inUsers != null) { for (Iterator iter = inUsers.iterator(); iter.hasNext();) { User user = (User) iter.next(); deleteUser(user); } } } /** * Retrieve the map from group names to {@link FileSystemGroup}s. * * @return */ protected Map getGroupIdToGroupMap() { if (fieldGroupIdToGroupMap == null) { fieldGroupIdToGroupMap = new HashMap(); } return fieldGroupIdToGroupMap; } /** * Returns the map from usernames to {@link FileSystemUser}s. * * @return Map */ protected Map getUserNameToUserMap() { if (fieldUserNameToUserMap == null) { fieldUserNameToUserMap = new HashMap(); } return fieldUserNameToUserMap; } public void flush() { getUserNameToUserMap().clear(); } public Collection listGroupIds() { List ids = new ArrayList(); ContentItem item = getPageManager().getRepository().get( getGroupDirectory()); File groups = new File(item.getAbsolutePath()); File[] groupfiles = groups.listFiles(new FilenameFilter() { public boolean accept(File inDir, String inName) { return inName.endsWith(".xml"); } }); if (groupfiles != null) { for (int i = 0; i < groupfiles.length; i++) { // Group group = new FileSystemGroup(this, groupfiles[i]); // this configures the users // getGroupNameToGroupMap().put(group.getName(), group); String name = PathUtilities.extractPageName(groupfiles[i] .getName()); ids.add(name); } } // // Temporary // item = getPageManager().getRepository().get("/WEB-INF/groups"); // groups = new File(item.getAbsolutePath()); // // groupfiles = groups.listFiles(new FilenameFilter() { // public boolean accept(File inDir, String inName) { // return inName.endsWith(".xml"); // } // }); // // if (groupfiles != null) { // for (int i = 0; i < groupfiles.length; i++) { // String name = PathUtilities.extractPageName(groupfiles[i] // .getName()); // if (!ids.contains(name)) { // ids.add(name); // } // } // } Collections.sort(ids); return ids; } /** * Create a file representing the given group on disk. * * @param inGroupName * The name of the new group * * @return The new file * * @throws UserManagerException * If the new file could not be created */ protected File createGroupFile(String inGroupId) throws UserManagerException { try { File newFile = new File(getGroupDirectory(), inGroupId + ".xml"); FileWriter writer = new FileWriter(newFile); try { writer.write("<?xml version=\"1.0\"?>\n" + "<group id=\"" + inGroupId + "\">\n" + "\t<group-name>" + inGroupId + "</group-name>\n" + "<permissions/>\n" + "</group>\n"); } finally { writer.close(); } return newFile; } catch (Exception ex) { throw new UserManagerException(ex); } } /** * Create a file representing the given user on disk. * * @param inUserName * The username of the new user * @param inPassword * The password of the new user * * @return The new file * * @throws UserManagerException * If the new file could not be created */ protected File createUserFile(String inUserName, String inPassword) throws UserManagerException { try { File newFile = loadUserFile(inUserName); newFile.getParentFile().mkdirs(); FileWriter writer = new FileWriter(newFile); try { writer.write("<?xml version=\"1.0\"?>\n" + "<user>\n" + " <user-name>" + inUserName + "</user-name>\n" + " <password>" + inPassword + "</password>\n" + "<creation-date>" + new Date().getTime() + "</creation-date>\n" + "</user>\n"); } finally { writer.close(); } return newFile; } catch (Exception ex) { throw new UserManagerException(ex); } } protected File loadGroupFile(String inGroupId) { ContentItem stub = getPageManager().getRepository().getStub( getGroupDirectory() + "/" + inGroupId + ".xml"); File file = new File(stub.getAbsolutePath()); if (!file.getParentFile().exists()) { file.getParentFile().mkdirs(); } return file; } protected File loadUserFile(String inUserName) { ContentItem stub = getPageManager().getRepository().getStub( getUserDirectory() + "/" + inUserName + ".xml"); File file = new File(stub.getAbsolutePath()); return file; } /* * (non-Javadoc) * * @see com.openedit.users.UserManager#getUserByEmail(java.lang.String) */ public User getUserByEmail(String emailaddress) throws UserManagerException { // check the cache first for (Iterator iter = getUserNameToUserMap().values().iterator(); iter .hasNext();) { User element = (User) iter.next(); String email = element.getEmail(); if (email != null && email.equalsIgnoreCase(emailaddress)) { return element; } } // TODO: replace with UserSearch object that can be replaced with Lucene // or JDBC for (Iterator iter = listUserNames().iterator(); iter.hasNext();) { String username = (String) iter.next(); User element = getUser(username);// require null pointer check here if (element != null) { String email = element.getEmail(); if (email != null && email.equalsIgnoreCase(emailaddress)) { return element; } } } return null; } public boolean isAllUsersLoaded() { return fieldAllUsersLoaded; } public void setAllUsersLoaded(boolean inAllUsersLoaded) { fieldAllUsersLoaded = inAllUsersLoaded; } public void saveUser(User user) throws UserManagerException { if (user.isVirtual()) { log.error("Cannot save virtual users: " + user.getUserName()); return; } DocumentFactory factory = DocumentFactory.getInstance(); Document doc = factory.createDocument(); Element userElem = doc.addElement("user"); userElem.addAttribute("enabled", Boolean.toString(user.isEnabled())); if (user.getUserName() == null) { int id = getUserIdCounter().incrementCount(); String newid = String.valueOf(id); user.setId(newid); } Element userNameElem = userElem.addElement("user-name"); userNameElem.addCDATA(user.getUserName()); Element passwordElem = userElem.addElement("password"); // if (user.getPassword() != null && !user.getPassword().equals("")) { String ps = user.getPassword(); ps = encrypt(ps); // password may have changed we should set it so it's not in plain // text anymore. user.setPassword(ps); passwordElem.addCDATA(ps); } Element creationDateElem = userElem.addElement("creation-date"); if (user.getCreationDate() != null) { creationDateElem.setText(String.valueOf(user.getCreationDate() .getTime())); } else { creationDateElem .setText(String.valueOf(System.currentTimeMillis())); } // Tuan add property lastLogined-Time Element lastLoginTime = userElem.addElement("lastLogined-Time"); lastLoginTime.setText(DateStorageUtil.getStorageUtil() .formatForStorage(new Date())); MapPropertyContainer map = (MapPropertyContainer) user .getPropertyContainer(); if (map != null) { Element propertiesElem = map.createPropertiesElement("properties"); userElem.add(propertiesElem); } if (user.getGroups() != null) { for (Iterator iter = user.getGroups().iterator(); iter.hasNext();) { Group group = (Group) iter.next(); Element child = userElem.addElement("group"); child.addAttribute("id", group.getId()); } } synchronized (user) { // File file = loadUserFile(user.getUserName()); XmlFile xfile = new XmlFile(); xfile.setRoot(doc.getRootElement()); xfile.setPath(getUserDirectory() + "/" + user.getUserName() + ".xml"); getXmlArchive().saveXml(xfile, null); getUserNameToUserMap().put(user.getUserName(), user); } } public XmlArchive getXmlArchive() { return fieldXmlArchive; } public void setXmlArchive(XmlArchive inXmlArchive) { fieldXmlArchive = inXmlArchive; } public void saveGroup(Group inGroup) throws UserManagerException { Document doc = DocumentFactory.getInstance().createDocument(); Element root = doc.addElement("group"); if (inGroup.getId() == null) { int id = getUserIdCounter().incrementCount(); String inAccount = String.valueOf(id); inGroup.setId(inAccount); } root.addAttribute("id", inGroup.getId()); Element groupNameElem = root.addElement("group-name"); groupNameElem.setText(inGroup.getName()); Element permissionsElem = root.addElement("permissions"); for (Iterator iter = inGroup.getPermissions().iterator(); iter .hasNext();) { Object permission = (Object) iter.next(); Element permissionElem = permissionsElem.addElement("permission"); permissionElem.setText(permission.toString()); } MapPropertyContainer map = (MapPropertyContainer) inGroup .getPropertyContainer(); if (map != null) { Element propertiesElem = map.createPropertiesElement("properties"); root.add(propertiesElem); } File file = loadGroupFile(inGroup.getId()); getXmlUtil().saveXml(doc, file); getGroupIdToGroupMap().remove(inGroup.getId()); } public String encrypt(String inPassword) throws UserManagerException { try { if (inPassword.startsWith("DES:")) { return inPassword; } // long encryptionKey = 7939805759879765L; encryptionKey++; // StringEncryption encrypter = new StringEncryption( // StringEncryption.DES_ENCRYPTION_SCHEME, encryptionKey + "42" + // encryptionKey ); String encryptedString = getStringEncryption().encrypt(inPassword); return encryptedString; } catch (OpenEditException ex) { throw new UserManagerException(ex); } } public IntCounter getUserIdCounter() { if (fieldUserIdCounter == null) { fieldUserIdCounter = new IntCounter(); ContentItem item = getPageManager().getRepository().get( getUserDirectory() + "/users.properties"); File users = new File(item.getAbsolutePath()); fieldUserIdCounter.setCounterFile(users); } return fieldUserIdCounter; } public HitTracker getUsersInGroup(String inGroupId) { Group group = getGroup(inGroupId); if (group == null) { return null; } return getUsersInGroup(group); } // TODO: Replace with smart UserHitTracker that lazy loads public HitTracker getUsersInGroup(Group inGroup) { List all = new ArrayList(); for (Iterator iter = getUsers().getAllHits(); iter.hasNext();) { User user = (User) iter.next(); if (user.isInGroup(inGroup)) { all.add(user); } } Collections.sort(all, new UserComparator()); HitTracker tracker = new ListHitTracker(all); return tracker; } public Authenticator getAuthenticator() { return fieldAuthenticator; } public void setAuthenticator(Authenticator inAuthenticator) { fieldAuthenticator = inAuthenticator; } protected void fireUserEvent(User inUser, String inOperation) { if (fieldWebEventHandler != null) { WebEvent event = new WebEvent(); event.setOperation("authentication"); event.setSearchType("user"); event.setSource(this); event.addDetail("details", inOperation); event.setCatalogId(getCatalogId()); event.setUser(inUser); getWebEventHandler().eventFired(event); } } public void logout(User inUser) { fireUserEvent(inUser, "logout"); } protected WebEventHandler getWebEventHandler() { return fieldWebEventHandler; } public void setWebEventHandler(WebEventHandler inListener) { fieldWebEventHandler = inListener; } public PermissionsManager getPermissionsManager() { if (fieldPermissionsManager == null) { fieldPermissionsManager = new PermissionsManager(); fieldPermissionsManager.setPageManager(getPageManager()); fieldPermissionsManager.loadPermissions(); } return fieldPermissionsManager; } public void setPermissionsManager(PermissionsManager inPermissionsManager) { fieldPermissionsManager = inPermissionsManager; } public XmlUtil getXmlUtil() { if (fieldXmlUtil == null) { fieldXmlUtil = new XmlUtil(); } return fieldXmlUtil; } public void setXmlUtil(XmlUtil inXmlUtil) { fieldXmlUtil = inXmlUtil; } public User createGuestUser(String inAccount, String inPassword, String inGroupId) { if (inAccount == null) // when null then we are picking up the next user // from the list. May be dup username { int id = getUserIdCounter().incrementCount(); inAccount = String.valueOf(id); // User user = getUser(inAccount); } FileSystemUser user = new FileSystemUser(); user.setCreationDate(new Date()); user.setUserName(inAccount); user.setPassword(inPassword); user.setVirtual(true); Group group = getGroup(inGroupId); if (group == null) { log.error("No such auto login group " + inGroupId); } else { user.addGroup(group); } return user; } public StringEncryption getStringEncryption() { return fieldStringEncryption; } public void setStringEncryption(StringEncryption inStringEncryption) { fieldStringEncryption = inStringEncryption; } public String decryptPassword(User inUser) throws OpenEditException { String pw = inUser.getPassword(); if (pw.startsWith("DES:")) { pw = getStringEncryption().decrypt(pw); } return pw; } public String encryptPassword(User inUser) throws OpenEditException { String pw = inUser.getPassword(); if (!pw.startsWith("DES:")) { pw = getStringEncryption().encrypt(pw); } return pw; } public String getScreenName(String inUserName) { if (inUserName == null) { return null; } User user = getUser(inUserName); if (user != null) { return user.getScreenName(); } return inUserName; } public String nextId() { int id = getUserIdCounter().incrementCount(); return String.valueOf(id); } }