/* * Created on 10/02/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.commands; import java.io.FileNotFoundException; import java.io.PrintStream; import java.util.Iterator; import java.util.List; import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.Option; import org.gudy.azureus2.ui.console.ConsoleInput; import org.gudy.azureus2.ui.console.UserProfile; import org.gudy.azureus2.ui.console.commands.CommandCollection; import org.gudy.azureus2.ui.console.commands.IConsoleCommand; import org.gudy.azureus2.ui.console.commands.OptionsConsoleCommand; import org.gudy.azureus2.ui.console.multiuser.UserManager; /** * container command for commands that deal with the add/modify/delete of users * @author pauld */ public class UserCommand extends IConsoleCommand { private final CommandCollection subCommands = new CommandCollection(); private final UserManager userManager; /** * @param _commandNames */ public UserCommand(UserManager userManager) { super("user"); this.userManager = userManager; subCommands.add(new AddUserCommand()); subCommands.add(new DeleteUserCommand()); subCommands.add(new ModifyUserCommand()); subCommands.add(new ListUsersCommand()); } /** * returns the UserManager object that is used * by our subcommands * @return */ private UserManager getUserManager() { return userManager; } /** * write the user manager configuration back to the path that it was read from * @param out stream to print success/failure messages to */ private void saveUserManagerConfig(PrintStream out) { try { userManager.save(); out.println("> User Manager config saved"); } catch (FileNotFoundException e) { out.println("> Error saving User Manager config: " + e); e.printStackTrace(out); } } /** * returns the string describing how this command can be used */ public String getCommandDescriptions() { return "user add|delete|list|modify <options>\tmanage users able to log in via telnet ui"; } /** * determine the correct subcommand and execute it */ public void execute(String commandName, ConsoleInput ci, List args) { if( args.isEmpty() ) { printHelp(ci.out, args); } else { commandName = (String) args.remove(0); subCommands.execute(commandName, ci, args); } } /** * prints out the help message showing the syntax for all subcommands */ public void printHelpExtra(PrintStream out, List args) { out.println("> -----"); out.println("'user' syntax:"); if( args.size() > 0 ) { String command = (String) args.remove(0); IConsoleCommand cmd = subCommands.get(command); if( cmd != null ) cmd.printHelp(out, args); return; } out.println("user <command> <command options>"); out.println(); out.println("Available <command>s:"); for (Iterator iter = subCommands.iterator(); iter.hasNext();) { IConsoleCommand cmd = (IConsoleCommand) iter.next(); out.println(cmd.getCommandDescriptions()); } out.println("try 'help user <command>' for more information about a particular user command"); out.println("> -----"); } /** * command that adds new users to the user manager * @author pauld */ private final class AddUserCommand extends OptionsConsoleCommand { public AddUserCommand() { super("add", "a"); getOptions().addOption(new Option("u", "username", true, "name of new user")); getOptions().addOption(new Option("p", "password", true, "password for new user")); getOptions().addOption(new Option("t", "type", true, "user type (Admin / User / Guest)")); getOptions().addOption(new Option("d", "savedirectory", true, "default torrent save directory for this user")); } /** * adds a new user */ public void execute(String commandName, ConsoleInput ci, CommandLine commandLine) { String userName = commandLine.getOptionValue('u'); if( userName == null ) { ci.out.println("> AddUser: (u)sername option not specified"); return; } String password = commandLine.getOptionValue('p'); if( password == null ) { ci.out.println("> AddUser: (p)assword option not specified"); return; } String userType = commandLine.getOptionValue('t', UserProfile.DEFAULT_USER_TYPE); if( ! UserProfile.isValidUserType(userType.toLowerCase())) { ci.out.println("> AddUser: invalid profile type '" + userType + "'. Valid values are: " + UserProfile.ADMIN + "," + UserProfile.USER + "," + UserProfile.GUEST); return; } // check that a user with that name doesnt already exist if( getUserManager().getUser(userName) != null ) { ci.out.println("> AddUser error: user '" + userName + "' already exists"); return; } UserProfile profile = new UserProfile(userName, userType); profile.setPassword(password); String defaultSaveDirectory = commandLine.getOptionValue('d', null); profile.setDefaultSaveDirectory(defaultSaveDirectory); getUserManager().addUser(profile); ci.out.println("> AddUser: user '" + userName + "' added"); saveUserManagerConfig(ci.out); } public String getCommandDescriptions() { return "add [-u user] <options>\t\ta\tadds a new user"; } } /** * command that deletes a user from the user manager * @author pauld */ private final class DeleteUserCommand extends OptionsConsoleCommand { public DeleteUserCommand() { super("delete", "d"); getOptions().addOption(new Option("u", "username", true, "name of user to delete")); } public void execute(String commandName, ConsoleInput ci, CommandLine commandLine) { String userName = commandLine.getOptionValue('u'); if( userName == null ) { ci.out.println("> DeleteUser: (u)sername option not specified"); return; } if( getUserManager().getUser(userName) == null ) { ci.out.println("> DeleteUser: error - user '" + userName + "' not found"); return; } getUserManager().deleteUser( userName ); ci.out.println("> DeleteUser: user '" + userName + "' deleted"); saveUserManagerConfig(ci.out); } public String getCommandDescriptions() { return "delete [-u user]\t\td\tdeletes a user"; } } /** * command that changes user's password or level or default save directory * @author pauld */ private final class ModifyUserCommand extends OptionsConsoleCommand { public ModifyUserCommand() { super("modify", "m"); getOptions().addOption(new Option("u", "username", true, "name of user to modify")); getOptions().addOption(new Option("p", "password", true, "password for new user")); getOptions().addOption(new Option("t", "type", true, "user type (Admin / User / Guest)")); getOptions().addOption(new Option("d", "savedirectory", true, "default torrent save directory for this user")); } public void execute(String commandName, ConsoleInput ci, CommandLine commandLine) { String userName = commandLine.getOptionValue('u'); if( userName == null ) { ci.out.println("> ModifyUser: (u)sername option not specified"); return; } UserProfile profile = getUserManager().getUser(userName); if( profile == null ) { ci.out.println("> ModifyUser: error - user '" + userName + "' not found"); return; } boolean modified = false; String userType = commandLine.getOptionValue('t'); if( userType != null ) { if( UserProfile.isValidUserType(userType.toLowerCase())) { profile.setUserType(userType.toLowerCase()); modified = true; } else { ci.out.println("> ModifyUser: invalid profile type '" + userType + "'. Valid values are: " + UserProfile.ADMIN + "," + UserProfile.USER + "," + UserProfile.GUEST); return; } } String password = commandLine.getOptionValue('p'); if( password != null ) { profile.setPassword(password); modified = true; } String defaultSaveDirectory = commandLine.getOptionValue('d'); if( defaultSaveDirectory != null ){ modified = true; if ( defaultSaveDirectory.length() > 0 ){ profile.setDefaultSaveDirectory(defaultSaveDirectory); }else{ profile.setDefaultSaveDirectory(null); } } if( modified ) { ci.out.println("> ModifyUser: user '" + userName + "' modified"); saveUserManagerConfig(ci.out); } else printHelp(ci.out, commandLine.getArgList()); } public String getCommandDescriptions() { return "modify [-u user] <options>\tm\tmodifies a user"; } } /** * command that prints out the list of users registered in this user manager * @author pauld */ private final class ListUsersCommand extends IConsoleCommand { public ListUsersCommand() { super("list", "l"); } public void execute(String commandName, ConsoleInput ci, List args) { ci.out.println("> -----"); ci.out.println("> Username\tProfile\t\tSave Directory"); for (Iterator iter = getUserManager().getUsers().iterator(); iter.hasNext();) { UserProfile profile = (UserProfile) iter.next(); String saveDir = profile.getDefaultSaveDirectory(); if( saveDir == null ) saveDir = "(default)"; ci.out.println("> " + profile.getUsername() + "\t\t" + profile.getUserType() + "\t\t" + saveDir); } ci.out.println("> -----"); } public String getCommandDescriptions() { return "list \t\t\t\tl lists all users"; } } }