/* * Created on 25/01/2005 * Created by Paul Duran * Copyright (C) 2004 Aelitis, All Rights Reserved. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * This program 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 General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * AELITIS, SARL au capital de 30,000 euros * 8 Allee Lenotre, La Grille Royale, 78600 Le Mesnil le Roi, France. * */ package org.gudy.azureus2.ui.console.multiuser; import java.beans.XMLDecoder; import java.beans.XMLEncoder; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.gudy.azureus2.plugins.PluginInterface; import org.gudy.azureus2.ui.console.UserProfile; import com.aelitis.azureus.core.AzureusCoreException; /** * The usermanager is responsible for reading the users configuration * file and loading in all of the possible users. It is also responsible * for authenticating a username/password * @author pauld */ public class UserManager { private static final String USER_DB_CONFIG_FILE = "console.users.properties"; private static UserManager instance; private Map usersMap = new HashMap(); private final String fileName; /** * @param configFile */ public UserManager(String fileName) { super(); this.fileName = fileName; } /** * attempts to locate a user with the specified username and then * verifies that the specified password is the same as the password * associated with that user * @param username * @param password * @return */ public UserProfile authenticate( String username, String password ) { UserProfile profile = getUser(username); if( profile != null) { if( profile.authenticate( password ) ) return profile; } return null; } /** * returns the profile for the user with the specified username * otherwise null if there is no such user * @param username * @return */ public UserProfile getUser(String username ) { return (UserProfile) usersMap.get(username.toLowerCase()); } /** * adds another user to the users list * @param user */ public void addUser(UserProfile user) { usersMap.put( user.getUsername().toLowerCase(), user ); } public Collection getUsers( ) { return Collections.unmodifiableCollection(usersMap.values()); } /** * load a new UserManager object from the specified input stream. * The input stream should contain an XML document as encoded by the * save() method * @param in * @return UserManager object * @throws FileNotFoundException */ public void load( ) throws FileNotFoundException { BufferedInputStream bis = new BufferedInputStream(new FileInputStream(fileName)); doLoad( bis ); } protected void doLoad( InputStream in ) { XMLDecoder decoder = new XMLDecoder( in ); UserManagerConfig managerConfig = (UserManagerConfig)decoder.readObject(); for (Iterator iter = managerConfig.getUsers().iterator(); iter.hasNext();) { UserProfile user = (UserProfile) iter.next(); usersMap.put(user.getUsername().toLowerCase(), user); } System.out.println("UserManager: registered " + usersMap.size() + " users"); decoder.close(); } /** * write the UserManager configuration out to the specified output stream. * the configuration is stored in XML format as specified by the XMLEncoder class * @param out * @throws FileNotFoundException * @see XMLEncoder */ public void save( ) throws FileNotFoundException { OutputStream out = new FileOutputStream(fileName); doSave(out); } protected void doSave( OutputStream out ) { UserManagerConfig config = new UserManagerConfig(); List users = new ArrayList( usersMap.values() ); config.setUsers(users); XMLEncoder encoder = new XMLEncoder( new BufferedOutputStream( out ) ); encoder.writeObject(config); encoder.close(); } public static UserManager getInstance(PluginInterface pi) { if( instance == null ) { String azureusUserDir = pi.getUtilities().getAzureusUserDir(); File dbFile = new File(azureusUserDir, USER_DB_CONFIG_FILE); try { instance = new UserManager(dbFile.getCanonicalPath()); if( dbFile.exists() ) { System.out.println("loading user configuration from: " + dbFile.getCanonicalPath()); instance.load(); } else { System.out.println("file: " + dbFile.getCanonicalPath() + " does not exist. using 'null' user manager"); } } catch (IOException e) { throw new AzureusCoreException("Unable to instantiate default user manager"); } } return instance; } public static final class UserManagerConfig { private List users = new ArrayList(); /** * @return Returns the users. */ public List getUsers() { return users; } /** * @param users The users to set. */ public void setUsers(List users) { this.users = users; } /** * adds another user to the users list * @param user */ public void addUser(UserProfile user) { users.add( user ); } public void clear() { users.clear(); } } /** * removes the user with the specified name * @param userName */ public void deleteUser(String userName) { usersMap.remove(userName.toLowerCase()); } }