package de.softwareforge.pgpsigner;
/*
* Copyright (C) 2007 Henning P. Schmiedehausen
*
* See the NOTICE file distributed with this work for additional
* information
*
* Licensed under the Apache License, Version 2.0 (the "License"); you
* may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
* implied. See the License for the specific language governing
* permissions and limitations under the License.
*
*/
import java.security.Provider;
import java.security.Security;
import java.util.ArrayList;
import java.util.List;
import jline.Completor;
import jline.ConsoleReader;
import jline.History;
import jline.MultiCompletor;
import jline.Terminal;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.GnuParser;
import org.apache.commons.cli.ParseException;
import org.apache.commons.lang.StringUtils;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import de.softwareforge.pgpsigner.commands.Command;
import de.softwareforge.pgpsigner.commands.HelpCommand;
import de.softwareforge.pgpsigner.commands.KeyServerCommand;
import de.softwareforge.pgpsigner.commands.ListCommand;
import de.softwareforge.pgpsigner.commands.MailCommand;
import de.softwareforge.pgpsigner.commands.MailServerCommand;
import de.softwareforge.pgpsigner.commands.PartyRingCommand;
import de.softwareforge.pgpsigner.commands.PublicRingCommand;
import de.softwareforge.pgpsigner.commands.QuitCommand;
import de.softwareforge.pgpsigner.commands.RemoveCommand;
import de.softwareforge.pgpsigner.commands.ResetCommand;
import de.softwareforge.pgpsigner.commands.SecretRingCommand;
import de.softwareforge.pgpsigner.commands.ShowCommand;
import de.softwareforge.pgpsigner.commands.SignCommand;
import de.softwareforge.pgpsigner.commands.SignEventCommand;
import de.softwareforge.pgpsigner.commands.SignKeyCommand;
import de.softwareforge.pgpsigner.commands.SimulateCommand;
import de.softwareforge.pgpsigner.commands.UnlockCommand;
import de.softwareforge.pgpsigner.commands.UploadCommand;
import de.softwareforge.pgpsigner.commands.WriteCommand;
import de.softwareforge.pgpsigner.util.AppContext;
/**
* This is the PGPSigner main class.
*
* @author <a href="mailto:henning@schmiedehausen.org">Henning P. Schmiedehausen</a>
* @version $Id$
*/
public class PGPSigner
{
public static final String APPLICATION_NAME = "PGPSigner";
public static final String APPLICATION_VERSION = APPLICATION_NAME + " V1.0";
private final AppContext context = new AppContext();
private Thread shutdownHook = new Thread()
{
public void run()
{
System.out.println();
System.out.println("Goodbye");
}
};
public static void main(final String[] args)
{
Security.addProvider(new BouncyCastleProvider());
/*
* Debug Code. Add a Security Manager and a policy.
* Suggested by Simon Tuffs, unfortunately does not really help
* the one-jar problem.
if (System.getSecurityManager() == null) {
String policy = System.getProperty("java.security.policy");
if (policy == null) {
System.setProperty("java.security.policy", "onejar:/pgpsigner.policy");
}
System.setSecurityManager(new SecurityManager());
}
*/
/*
* DEBUG: Display all registered Security providers
*
Provider[] providers = Security.getProviders();
for (int i=0; i < providers.length; i++) {
System.out.println(providers[i].toString());
}
*/
PGPSigner pgpSigner = new PGPSigner(args);
try
{
pgpSigner.run();
}
catch (RuntimeException re)
{
re.printStackTrace();
throw re;
}
catch (Exception e)
{
e.printStackTrace();
}
System.exit(0);
}
private PGPSigner(final String[] args)
{
registerCommand(new HelpCommand());
registerCommand(new QuitCommand());
registerCommand(new ResetCommand());
registerCommand(new ShowCommand());
registerCommand(new ListCommand());
registerCommand(new UnlockCommand());
registerCommand(new SimulateCommand());
registerCommand(new PartyRingCommand());
registerCommand(new PublicRingCommand());
registerCommand(new SecretRingCommand());
registerCommand(new SignKeyCommand());
registerCommand(new MailServerCommand());
registerCommand(new KeyServerCommand());
registerCommand(new SignEventCommand());
registerCommand(new RemoveCommand());
registerCommand(new WriteCommand());
registerCommand(new SignCommand());
registerCommand(new MailCommand());
registerCommand(new UploadCommand());
CommandLineParser parser = new GnuParser();
CommandLine line = null;
try
{
line = parser.parse(context.getOptions(), args);
}
catch (ParseException pe)
{
System.err.println("Command line error: " + pe.getMessage());
System.exit(0);
}
processOptions(line);
}
private void registerCommand(final Command command)
{
context.addCommand(command);
}
private void processOptions(CommandLine line)
{
for (Command command : context.getCommands())
{
if (command.hasCommandLineOption())
{
command.processCommandLineOption(line);
}
}
}
private void run() throws Exception
{
Terminal.setupTerminal();
Runtime.getRuntime().addShutdownHook(shutdownHook);
List<Completor> completorList = new ArrayList<Completor>();
for (Command command : context.getCommands())
{
if (command.hasCompletor())
{
completorList.add(command.getCompletor());
}
}
Completor completor = new MultiCompletor(completorList.toArray(new Completor[completorList.size()]));
ConsoleReader reader = new ConsoleReader();
reader.setHistory(new History());
reader.setUseHistory(true);
reader.setBellEnabled(false);
reader.setDefaultPrompt(PGPSigner.APPLICATION_NAME + "> ");
reader.addCompletor(completor);
System.out.println("\n\nWelcome to " + APPLICATION_VERSION);
String line = null;
commandLoop: while (!context.isShutdown() && (line = reader.readLine()) != null)
{
String[] cmd = StringUtils.stripAll(StringUtils.split(line));
if (cmd.length > 0)
{
for (Command command : context.getCommands())
{
if (command.matchInteractiveCommand(cmd[0]))
{
if (command.prerequisiteInteractiveCommand(cmd))
{
command.executeInteractiveCommand(cmd);
}
continue commandLoop;
}
}
System.out.println("Unknown Command: " + cmd[0]);
}
}
Runtime.getRuntime().removeShutdownHook(shutdownHook);
System.out.println("Goodbye");
}
}