CLI.java

package org.apache.fulcrum.jce.crypto.cli;

/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

import org.apache.fulcrum.jce.crypto.CryptoUtil;
import org.apache.fulcrum.jce.crypto.StreamUtil;

/**
 * Command line tool for encrypting/decrypting files
 *
 * file [enc|dec] passwd [file]*
 * string [enc|dec] passwd plaintext
 *
 * @author <a href="mailto:siegfried.goeschl@it20one.at">Siegfried Goeschl</a>
 */

public class CLI
{
    /**
     * Allows testing on the command line.
     * 
     * @param args the command line parameters
     */
    public static void main( String[] args )
    {
        try
        {
            if( args.length < 3 )
            {
                printHelp();
                throw new IllegalArgumentException("Invalid command line");
            }

            String operationMode = args[0];

            if( operationMode.equals("file") )
            {
                processFiles(args);
            }
            else if( operationMode.equals("string") )
            {
                processString(args);
            }
        }
        catch (Exception e)
        {
            System.out.println("Error : " + e.getMessage());
        }
    }

    /**
     * Prints usage information.
     */
    public static void printHelp()
    {
        System.out.println("Main file [enc|dec] passwd source [target]");
        System.out.println("Main string [enc|dec] passwd source");
    }

    /**
     * Decrypt/encrypt a list of files
     * @param args the command line
     * @throws Exception the operation failed
     */
    public static void processFiles(String[] args)
        throws Exception
    {
        String cipherMode = args[1];
        char[] password = args[2].toCharArray();
        File sourceFile = new File(args[3]);
        File targetFile = null;

        if( args.length == 4 )
        {
            targetFile = sourceFile;
        }
        else
        {
            targetFile = new File(args[4]);
            File parentFile = targetFile.getParentFile(); 

            if (parentFile != null)
            {
                boolean success = parentFile.mkdirs();
                if ( !success )
                {
                	System.err.println("Failed to create directory");
                }
            }
        }

        processFile(cipherMode,password,sourceFile,targetFile);
    }

    /**
     * Decrypt and encrypt a single file
     * @param cipherMode the mode
     * @param password the password
     * @param sourceFile the file to process
     * @param targetFile the target file
     * @throws Exception the operation failed
     */
    public static void processFile(String cipherMode, char[] password, File sourceFile, File targetFile)
        throws Exception
    {
        try (FileInputStream fis = new FileInputStream(sourceFile)) {
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
    
            if( cipherMode.equals("dec") )
            {
                System.out.println("Decrypting " + sourceFile.getAbsolutePath() );
                CryptoUtil.getInstance().decrypt( fis, baos, password );
                fis.close();
    
                ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
                FileOutputStream fos = new FileOutputStream(targetFile);
                StreamUtil.copy(bais,fos);
                bais.close();
                fos.close();
            }
            else if( cipherMode.equals("enc") )
            {
                System.out.println("Encrypting " + sourceFile.getAbsolutePath() );
                CryptoUtil.getInstance().encrypt( fis, baos, password );
                fis.close();
    
                ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
                FileOutputStream fos = new FileOutputStream(targetFile);
                StreamUtil.copy(bais,fos);
                bais.close();
                fos.close();
            }
            else
            {
                String msg = "Don't know what to do with : " + cipherMode;
                throw new IllegalArgumentException(msg);
            }
        }
    }

    /**
     * Decrypt/encrypt a string.
     * 
     * @param args the command line
     * @throws Exception the operation failed
     */
    public static void processString(String[] args)
        throws Exception
    {
        String cipherMode = args[1];
        char[] password = args[2].toCharArray();
        String value = args[3];
        String result = null;

        if( cipherMode.equals("dec") )
        {
            result = CryptoUtil.getInstance().decryptString(value,password);
        }
        else
        {
            result = CryptoUtil.getInstance().encryptString(value,password);
        }

        System.out.println( result );
    }
}