/*
* Written and copyright 2001-2003 Tobias Minich. Distributed under the GNU
* General Public License; see the README file. This code comes with NO
* WARRANTY.
*
* Torrent.java
*
* Created on 23.03.2004
*
*/
package org.gudy.azureus2.ui.console.commands;
import java.io.PrintStream;
import java.util.Iterator;
import java.util.List;
import org.gudy.azureus2.core3.download.DownloadManager;
import org.gudy.azureus2.core3.download.DownloadManagerState;
import org.gudy.azureus2.core3.tracker.host.TRHost;
import org.gudy.azureus2.core3.tracker.host.TRHostTorrent;
import org.gudy.azureus2.core3.util.ByteFormatter;
import org.gudy.azureus2.core3.util.TorrentUtils;
import org.gudy.azureus2.ui.console.ConsoleInput;
import org.gudy.azureus2.ui.console.UserProfile;
/**
* base class for objects which need to operate on specific torrents.
* this class allows the torrent to be identified by hash, number or
* 'all' and will pass the appropriate torrent(s) to the subclasses 'performCommand' method
* @author tobi
*/
public abstract class TorrentCommand extends IConsoleCommand {
private final String action;
/**
* initializes the torrent command
* @param commandNames (the first item in the array is regarded as the primary command name)
* @param action a description to be used when this command is executed
*/
public TorrentCommand(String main_name, String short_name, String action)
{
super(main_name, short_name);
this.action = action;
}
protected String getAction()
{
return action;
}
protected abstract boolean performCommand(ConsoleInput ci, DownloadManager dm, List args);
/**
* Stub for commands that operate on a hosted torrent rather than downloadmanager
* @param ci
* @param args
* @return
*/
protected boolean performCommand(ConsoleInput ci, TRHostTorrent torrent, List args)
{
return( false );
}
public void execute(String commandName, ConsoleInput ci, List args)
{
if (!args.isEmpty()) {
String subcommand = (String) args.remove(0);
if (ci.torrents.isEmpty()) {
ci.out.println("> Command '" + getCommandName() + "': No torrents in list (Maybe you forgot to 'show torrents' first).");
} else {
String name;
DownloadManager dm;
try {
int number = Integer.parseInt(subcommand);
if ((number > 0) && (number <= ci.torrents.size())) {
dm = (DownloadManager) ci.torrents.get(number - 1);
if (dm.getDisplayName() == null)
name = "?";
else
name = dm.getDisplayName();
performCommandIfAllowed(ci, args, dm, "#" + subcommand, name);
} else
ci.out.println("> Command '" + getCommandName() + "': Torrent #" + subcommand + " unknown.");
} catch (NumberFormatException e) {
if ("all".equalsIgnoreCase(subcommand)) {
Iterator torrent = ci.torrents.iterator();
while (torrent.hasNext()) {
dm = (DownloadManager) torrent.next();
if (dm.getDisplayName() == null)
name = "?";
else
name = dm.getDisplayName();
performCommandIfAllowed(ci, args, dm, subcommand, name);
}
} else if ("hash".equalsIgnoreCase(subcommand)) {
String hash = (String) args.remove(0);
List torrents = ci.getGlobalManager().getDownloadManagers();
boolean foundit = false;
Iterator torrent = torrents.iterator();
while (torrent.hasNext()) {
dm = (DownloadManager) torrent.next();
if (hash.equals(TorrentUtils.nicePrintTorrentHash(dm.getTorrent(), true))) {
if (dm.getDisplayName() == null)
name = "?";
else
name = dm.getDisplayName();
// FIXME: check user permission here and fix it to take torrent hash instead of subcommand
performCommandIfAllowed(ci, args, dm, hash, name);
foundit = true;
break;
}
}
if ( !foundit ){
// second check for
TRHost host = ci.getCore().getTrackerHost();
if ( host != null ){
TRHostTorrent[] h_torrents = host.getTorrents();
for (int i=0;i<h_torrents.length;i++){
TRHostTorrent ht = h_torrents[i];
if (hash.equals(TorrentUtils.nicePrintTorrentHash(ht.getTorrent(), true))) {
name = TorrentUtils.getLocalisedName( ht.getTorrent());
// FIXME: check user permission here and fix it to take torrent hash instead of subcommand
performCommandIfAllowed(ci, args, ht, hash, name);
foundit = true;
break;
}
}
}
}
if ( !foundit ){
ci.out.println("> Command '" + getCommandName() + "': Hash '" + hash + "' unknown.");
}
} else {
ci.out.println("> Command '" + getCommandName() + "': Subcommand '" + subcommand + "' unknown.");
}
}
}
} else {
ci.out.println("> Missing subcommand for '" + getCommandName() + "'");
printHelp(ci.out, args);
}
}
/**
* checks the role of the user. if the user is a 'guest', they are not able to
* perform any actions on the torrents. they are a 'read only' role.
* if they are a 'user' role, they are only able to modify their own torrents.
* users with the 'admin' role can modify anybody's torrents
* @param ci
* @param args
* @param dm
* @param name
* @param subcommand
*/
private void performCommandIfAllowed(ConsoleInput ci, List args, DownloadManager dm, String desc, String name) {
if( ! UserProfile.ADMIN.equals( ci.getUserProfile().getUserType() ) )
{
if( UserProfile.USER.equals( ci.getUserProfile().getUserType() ) )
{
String owner = dm.getDownloadState().getAttribute(DownloadManagerState.AT_USER);
if(! ci.getUserProfile().getUsername().equals(owner) )
{
ci.out.println("> " + getAction() + " torrent " + desc + " (" + name + ") failed: Permission Denied. Users can only modify their own torrents");
return;
}
}
else
{
ci.out.println("> " + getAction() + " torrent " + desc + " (" + name + ") failed: Permission Denied. Guests cannot modify torrents");
return;
}
}
if (performCommand(ci, dm, args))
ci.out.println("> " + getAction() + " Torrent " + desc + " (" + name + ") succeeded.");
else
ci.out.println("> " + getAction() + " Torrent " + desc + " (" + name + ") failed.");
}
private void performCommandIfAllowed(ConsoleInput ci, List args, TRHostTorrent torrent, String desc, String name) {
if( ! UserProfile.ADMIN.equals( ci.getUserProfile().getUserType() ) )
{
if( UserProfile.USER.equals( ci.getUserProfile().getUserType() ) )
{
// TODO: we don't currently record user against host-torrent...
}
else
{
ci.out.println("> " + getAction() + " torrent " + desc + " (" + name + ") failed: Permission Denied. Guests cannot modify torrents");
return;
}
}
if (performCommand(ci, torrent, args))
ci.out.println("> " + getAction() + " Torrent " + desc + " (" + name + ") succeeded.");
else
ci.out.println("> " + getAction() + " Torrent " + desc + " (" + name + ") failed.");
}
/**
* prints out the syntax of this command
*/
public void printHelpExtra(PrintStream out, List args) {
out.println("> " + getCommandName() + " syntax: " + getCommandName() + " (<#>|all|hash <hash>)");
}
}