/** * Copyright 2006 by Know-Center, Graz, Austria * PDF-AS has been contracted by the E-Government Innovation Center EGIZ, a * joint initiative of the Federal Chancellery Austria and Graz University of * Technology. * * Licensed under the EUPL, Version 1.1 or - as soon they will be approved by * the European Commission - subsequent versions of the EUPL (the "Licence"); * You may not use this work except in compliance with the Licence. * You may obtain a copy of the Licence at: * http://www.osor.eu/eupl/ * * Unless required by applicable law or agreed to in writing, software * distributed under the Licence is distributed on an "AS IS" basis, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the Licence for the specific language governing permissions and * limitations under the Licence. * * This product combines work with different licenses. See the "NOTICE" text * file for details on the various modules and licenses. * The "NOTICE" text file is part of the distribution. Any derivative works * that you distribute must include a readable copy of the "NOTICE" text file. * * $Id: Main.java,v 1.5 2006/10/31 08:06:56 wprinz Exp $ */ package at.knowcenter.wag.egov.egiz.commandline; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.PrintStream; import java.io.PrintWriter; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Set; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import at.gv.egiz.pdfas.commandline.CommandlineConnectorChooser; import at.gv.egiz.pdfas.exceptions.ErrorCode; import at.gv.egiz.pdfas.exceptions.ErrorCodeHelper; import at.gv.egiz.pdfas.exceptions.external.ExternalErrorException; import at.gv.egiz.pdfas.framework.DataSourceHolder; import at.gv.egiz.pdfas.framework.config.SettingsHelper; import at.gv.egiz.pdfas.framework.input.DataSource; import at.gv.egiz.pdfas.framework.input.ExtractionStage; import at.gv.egiz.pdfas.framework.input.PdfDataSource; import at.gv.egiz.pdfas.framework.output.DataSink; import at.gv.egiz.pdfas.framework.vfilter.VerificationFilterParameters; import at.gv.egiz.pdfas.impl.input.FileBasedPdfDataSourceImpl; import at.gv.egiz.pdfas.impl.input.TextDataSourceImpl; import at.gv.egiz.pdfas.impl.output.FileBasedDataSink; import at.knowcenter.wag.egov.egiz.PdfAS; import at.knowcenter.wag.egov.egiz.PdfASID; import at.knowcenter.wag.egov.egiz.cfg.SettingsReader; import at.knowcenter.wag.egov.egiz.exceptions.ConnectorFactoryException; import at.knowcenter.wag.egov.egiz.exceptions.PDFDocumentException; import at.knowcenter.wag.egov.egiz.exceptions.PlaceholderException; import at.knowcenter.wag.egov.egiz.exceptions.PresentableException; import at.knowcenter.wag.egov.egiz.exceptions.SettingNotFoundException; import at.knowcenter.wag.egov.egiz.exceptions.SignatureException; import at.knowcenter.wag.egov.egiz.exceptions.SignatureTypesException; import at.knowcenter.wag.egov.egiz.framework.SignatorFactory; import at.knowcenter.wag.egov.egiz.pdf.SignatureHolder; import at.knowcenter.wag.egov.egiz.pdf.TablePos; import at.knowcenter.wag.egov.egiz.sig.ConnectorFactory; import at.knowcenter.wag.egov.egiz.sig.ConnectorInformation; import at.knowcenter.wag.egov.egiz.sig.SignatureResponse; import at.knowcenter.wag.egov.egiz.sig.SignatureTypes; /** * The main program entry point of the commandline tool. * * @author wprinz */ public abstract class Main { /** * Command line parameter setting the application mode sign|verify */ protected static final String PARAMETER_MODE = "-mode"; /** * Command line parameter setting the application to connect */ protected static final String PARAMETER_CONNECTOR = "-connector"; /** * Command line parameter setting the signature mode. */ protected static final String PARAMETER_SIGNATURE_MODE = "-sigmode"; /** * Command line parameter setting the signature type. */ protected static final String PARAMETER_SIGNATURE_TYPE = "-sigtype"; /** * Command line parameter setting the username */ protected static final String PARAMETER_USER_NAME = "-username"; /** * Command line parameter setting the users password */ protected static final String PARAMETER_USER_PASSWORD = "-password"; /** * Command line parameter selecting the position of the signature. */ protected static final String PARAMETER_POS = "-pos"; /** * Command line parameter selecting the signature which is going to be * verified. */ protected static final String PARAMETER_VERIFY_WHICH = "-verify_which"; /** * The application mode sign */ public static final String VALUE_MODE_SIGN = "sign"; /** * The application mode verify */ public static final String VALUE_MODE_VERIFY = "verify"; /** * The application mode sign */ public static final String VALUE_SIGNATURE_MODE_BINARY = "binary"; /** * The application mode verify */ public static final String VALUE_SIGNATURE_MODE_TEXTUAL = "textual"; /** * The application mode verify */ public static final String VALUE_SIGNATURE_MODE_DETACHED = "detached"; /** * The application mode verify */ public static final String VALUE_SIGNATURE_MODE_DETACHED_TEXT = "detachedtextual"; /** * The log. */ private static final Log logger_ = LogFactory.getLog(Main.class); /** * Main program entry point. * * @param args * The commandline arguments. * @throws IOException * * @deprecated use {@link at.gv.egiz.pdfas.commandline.Main} instead */ public static void main(String[] args) throws IOException { System.out.println("\nWarning: The entry point at.knowcenter.wag.egov.egiz.commandline.Main is deprecated. Use at.gv.egiz.pdfas.commandline.Main instead.\n"); at.gv.egiz.pdfas.commandline.Main.main(args); } /* public static void main(String[] args) throws IOException { // ConfigLogger.setLevel(Level.DEBUG); SettingsReader.initializeForCommandLine(); PropertyConfigurator.configure(SettingsReader.CONFIG_PATH + "log4j.properties"); // printUsage(System.out); String mode = null; String signature_mode = null; String connector = null; String signature_type = null; String user_name = null; String user_password = null; String pos_string = null; int verify_which = -1; String input = null; String output = null; try { // for (int i = 0; i < args.length; i++) // { // logger_.debug("arg[" + i + "] = " + args[i]); // } for (int i = 0; i < args.length; i++) { String cur_arg = args[i].trim(); if (cur_arg.equals(PARAMETER_MODE)) { i++; if (i >= args.length) { printNoValue(PARAMETER_MODE); return; } mode = args[i]; if (!checkMode(mode)) { printUnrecognizedValue(PARAMETER_MODE, mode); return; } continue; } if (cur_arg.equals(PARAMETER_CONNECTOR)) { i++; if (i >= args.length) { printNoValue(PARAMETER_CONNECTOR); return; } connector = args[i]; if (!checkConnector(connector)) { printUnrecognizedValue(PARAMETER_CONNECTOR, connector); return; } continue; } if (cur_arg.equals(PARAMETER_SIGNATURE_MODE)) { i++; if (i >= args.length) { printNoValue(PARAMETER_SIGNATURE_MODE); return; } signature_mode = args[i]; if (!checkSignatureMode(signature_mode)) { printUnrecognizedValue(PARAMETER_SIGNATURE_MODE, signature_mode); return; } continue; } if (cur_arg.equals(PARAMETER_SIGNATURE_TYPE)) { i++; if (i >= args.length) { printNoValue(PARAMETER_SIGNATURE_TYPE); return; } signature_type = args[i]; if (!checkSignatureType(signature_type)) { printUnrecognizedValue(PARAMETER_SIGNATURE_TYPE, signature_type); return; } continue; } if (cur_arg.equals(PARAMETER_USER_NAME)) { i++; if (i >= args.length) { printNoValue(PARAMETER_USER_NAME); return; } user_name = args[i]; continue; } if (cur_arg.equals(PARAMETER_USER_PASSWORD)) { i++; if (i >= args.length) { printNoValue(PARAMETER_USER_PASSWORD); return; } user_password = args[i]; continue; } if (cur_arg.equals(PARAMETER_POS)) { i++; if (i >= args.length) { printNoValue(PARAMETER_POS); return; } pos_string = args[i]; continue; } if (cur_arg.equals(PARAMETER_VERIFY_WHICH)) { i++; if (i >= args.length) { printNoValue(PARAMETER_VERIFY_WHICH); return; } String str_verify_which = args[i]; try { verify_which = Integer.parseInt(str_verify_which); } catch (NumberFormatException e) { printUnrecognizedValue(PARAMETER_VERIFY_WHICH, str_verify_which); return; } continue; } if (cur_arg.charAt(0) == '-') { printUnrecognizedOption(cur_arg); return; } if (input == null) { input = cur_arg; continue; } if (output == null) { output = cur_arg; continue; } printUnrecognizedAdditionalCommandlineArgument(cur_arg); return; } if (mode == null) { printMissingParameter("a mode", PARAMETER_MODE); return; } if (connector == null) { printMissingParameter("a connector", PARAMETER_CONNECTOR); return; } if (mode.equals(VALUE_MODE_SIGN)) { if (signature_mode == null) { printMissingParameter("a signature mode", PARAMETER_SIGNATURE_MODE); return; } if (signature_type == null) { SettingsReader settings = SettingsReader.getInstance(); String default_type = settings.getValueFromKey(SignatureTypes.DEFAULT_TYPE); signature_type = default_type; } if (user_name == null) { user_name = ""; // printMissingParameter("a user name", PARAMETER_USER_NAME); // return; } if (user_password == null) { user_password = ""; // printMissingParameter("a user password", PARAMETER_USER_PASSWORD); // return; } } if (input == null) { printMissing("an input document"); return; } File file = new File(input); if (!file.exists()) { System.err.println("The input file '" + input + "' doesn't exist."); return; } if (mode.equals(VALUE_MODE_SIGN) && output == null) { output = generateOutputFileNameFromInput(input, signature_mode); } carryOutCommand(mode, signature_mode, connector, signature_type, user_name, user_password, verify_which, input, output, pos_string); } catch (PresentableException e) { printPresentableException(e); if (output != null) { logger_.debug("Deleting output file on error."); File oFile = new File(output); boolean deleted = oFile.delete(); if (!deleted) { logger_.error("Couldn't delete output file " + output); } } } finally { SettingsReader.clearTemporaryDirectory(); } } */ protected static void carryOutCommand(final String mode, final String signature_mode, final String connector, final String signature_type, final String user_name, final String user_password, final int verify_which, final String input, String output, final String pos_string) throws PresentableException { // File file = new File(input); // // byte[] input_bytes = null; // try // { // FileInputStream fis = new FileInputStream(file); // input_bytes = new byte[(int) file.length()]; // fis.read(input_bytes); // fis.close(); // } // catch (IOException e) // { // throw new PDFDocumentException(201); // } PrintWriter messageOutput = new PrintWriter(System.out); if (mode.equals(VALUE_MODE_SIGN)) { carryOutSign(input, connector, signature_mode, signature_type, pos_string, user_name, user_password, output, messageOutput); } else { carryOutVerify(input, connector, verify_which, messageOutput); } messageOutput.flush(); } public static void carryOutSign(String input, String connector, String signature_mode, String signature_type, String pos_string, String user_name, String user_password, String output, PrintWriter messageOutput) throws PresentableException { messageOutput.println("Signing..."); // for performance measurement long startTime = 0; long fileSize = 0; if (logger_.isInfoEnabled()) { startTime = System.currentTimeMillis(); } PdfDataSource pdfDataSource; try { File file = new File(input); pdfDataSource = new FileBasedPdfDataSourceImpl(file, (int)file.length()); if (logger_.isDebugEnabled()) fileSize = file.length(); } catch (IOException e) { throw new PDFDocumentException(201, e); } FileBasedDataSink dataSink = null; File outputFile = null; try { outputFile = new File(output); dataSink = new FileBasedDataSink(outputFile); } catch (IOException e) { throw new PDFDocumentException(ErrorCode.CANNOT_WRITE_PDF, e); } try { processSign(pdfDataSource, connector, signature_mode, signature_type, pos_string, dataSink); } catch (Exception e) { // Exception caught in order to delete file based datasink if (outputFile != null && outputFile.exists()) { logger_.debug("Deleting output file on error."); boolean deleted = outputFile.delete(); if (!deleted) { logger_.error("Couldn't delete output file " + output); } } if (e instanceof PresentableException) { throw (PresentableException)e; } else { throw new PresentableException(ErrorCode.UNKNOWN_ERROR, e); } } // for performance measurement if (logger_.isInfoEnabled()) { long endTime = System.currentTimeMillis(); String toReport = "SIGN;" + signature_mode + ";" + input + ";"+ fileSize + ";" + (endTime - startTime); logger_.info(toReport); } messageOutput.println("Signing was successful."); } public static void carryOutVerify(String input, String connector, int verify_which, PrintWriter messageOutput) throws PresentableException { messageOutput.println("Verifying..."); // for performance measurement long startTime = 0; long fileSize = 0; if (logger_.isInfoEnabled()) { startTime = System.currentTimeMillis(); } DataSource dataSource = null; try { File file = new File(input); if (logger_.isDebugEnabled()) fileSize = file.length(); String extension = extractExtension(input); if (extension != null && extension.equals("txt")) { try { FileInputStream fis = new FileInputStream(file); byte[] input_bytes = new byte[(int) file.length()]; fis.read(input_bytes); fis.close(); String text = new String(input_bytes, "UTF-8"); dataSource = new TextDataSourceImpl(text); } catch (UnsupportedEncodingException e) { throw new RuntimeException("Very strange: UTF-8 character encoding not supported.", e); } } else { dataSource = new FileBasedPdfDataSourceImpl(file, (int)file.length()); } } catch (IOException e) { throw new PDFDocumentException(ErrorCode.DOCUMENT_CANNOT_BE_READ, e); } List results = processVerify(new DataSourceHolder(dataSource), connector, verify_which); messageOutput.println("Verification results:"); formatVerifyResults(results, messageOutput); // for performance measurement if (logger_.isInfoEnabled()) { long endTime = System.currentTimeMillis(); String toReport = "VERIFY;"+ input + ";"+ fileSize + ";" + (endTime - startTime) + ";" + debugVerifyResults(results); logger_.info(toReport); } } /** * Extracts the extension from a file name string. * *

* The extension of a file name is whatever text follows the last '.'. *

* * @param file_name * The file name. * @return Returns the extension. If the file name ends with the '.', then an * empty string is returned. If the file name doesn't contain any '.' * or file_name is null, null is returned. */ public static String extractExtension(String file_name) { if (file_name == null) { return null; } int dot_index = file_name.lastIndexOf('.'); if (dot_index < 0) { return null; } return file_name.substring(dot_index + 1); } public static void processSign(PdfDataSource pdfDataSource, String connector, String signature_mode, String signature_type, String pos_string, DataSink dataSink) throws PresentableException { pdfDataSource = PdfAS.applyStrictMode(pdfDataSource); TablePos pos = null; if (pos_string != null) { try { pos = PdfAS.parsePositionFromPosString(pos_string); } catch (PDFDocumentException e) { printUnrecognizedValue(PARAMETER_POS, pos_string); return; } } PdfASID signatorId = translateSignatureModeToPdfASID(signature_mode); // TODO MOA detached signing is not allowed at the commandline // logger_.debug("Suggested sign algorithm = " + signatorId); if (connector.equals("moa")) { // TODO: possible new implementation of moa where is commandline call // supported // it should be checked in config file is it allowed to use MOA detached // from command line. // String msg = "Hinweis: Der MOA Detached Connector ist fuer die Kommandozeile nicht geeignet. Die Signatur wird daher im alten Base64 enveloping Format ausgefuehrt."; // System.out.println(msg); // logger_.warn(msg); // // if (signature_mode.equals(VALUE_SIGNATURE_MODE_BINARY)) // { // signatorId = BinarySignator_1_0_0.MY_ID; // } // if (signature_mode.equals(VALUE_SIGNATURE_MODE_TEXTUAL)) // { // signatorId = TextualSignator_1_0_0.MY_ID; // } } // logger_.debug("Finally used sign algorithm = " + signatorId); String connectorId = CommandlineConnectorChooser.chooseCommandlineConnectorForSign(connector); PdfAS.signCommandline(pdfDataSource, dataSink, signatorId, connectorId, signature_type, null, pos, null, null); // PdfAS.sign(algorithm, pdfDataSource, dataSink, signature_type, connector, pos); } public static List processVerify(DataSourceHolder dataSource, String connector, int verify_which) throws PresentableException { VerificationFilterParameters parameters = SettingsHelper.readVerificationFilterParametersFromSettings(); ExtractionStage es = new ExtractionStage(); List signature_holders = es.extractSignatureHolders(dataSource, parameters); if (signature_holders.isEmpty()) { throw new PDFDocumentException(ErrorCode.DOCUMENT_NOT_SIGNED, "Document is unsigned."); } List holders_to_verify = signature_holders; // verify_which - optional argument in command line/web if (verify_which >= 0) { if (verify_which >= signature_holders.size()) { throw new SignatureException(312, "The selected signature to be verified doesn't exist."); } SignatureHolder holder = (SignatureHolder) signature_holders.get(verify_which); holders_to_verify = new ArrayList(); holders_to_verify.add(holder); } List results = PdfAS.verifySignatureHolders(holders_to_verify, connector, false, null); return results; } // TODO old method - remove // /** // * Generates a suitable output file name for the output regarding the type // of // * the sign_result. // * // * @param input // * The input file name. // * @param sign_result // * The sign result. // * @return Returns the output file name. // */ // protected static String generateOutputFileNameFromInput(String input, // SignResult sign_result) // { // String output = input + "_out"; // if (sign_result.getMimeType().equals(DetachedSignator_1_0_0.MIME_TYPE)) // { // output += ".xml"; // } // else // { // output += ".pdf"; // } // // return output; // } protected static String generateOutputFileNameFromInput(String input, String sig_mode) { String output = input + "_out"; if (sig_mode.equals("detached")) { output += ".xml"; } else { output += ".pdf"; } return output; } /** * Prints that the provided option was unrecognized. * * @param option * The unrecognized option. * @throws PresentableException * Forwarded exception. */ protected static void printUnrecognizedOption(final String option) throws PresentableException { System.err.println("Unrecognized option '" + option + "'."); printUsage(System.out); } /** * Prints that the provided value was unrecognized. * * @param parameter * The parameter, which is missing a value. * @throws PresentableException * Forwarded exception. */ protected static void printNoValue(final String parameter) throws PresentableException { System.err.println("The parameter " + parameter + " requires a value as next argument."); printUsage(System.out); } /** * Prints that the provided value was unrecognized. * * @param value * The unrecognized value. * @throws PresentableException * Forwarded exception. */ protected static void printUnrecognizedValue(final String parameter, final String value) throws PresentableException { System.err.println("The parameter " + parameter + " doesn't recognize the provided value '" + value + "'."); printUsage(System.out); } /** * Prints that the provided additional commandline argument was unrecognized. * * @param argument * The unrecognized argument. * @throws PresentableException * Forwarded exception. */ protected static void printUnrecognizedAdditionalCommandlineArgument(final String argument) throws PresentableException { System.err.println("Unrecognized additional commandline argument '" + argument + "'."); printUsage(System.out); } /** * Prints that a certain parameter was missing. * * @param missing_term * A description of the missing parameter ("e.g. a mode"). * @param parameter * The missing parameter itself (e.g. "-mode"). * @throws PresentableException * Forwarded exception. */ protected static void printMissingParameter(final String missing_term, final String parameter) throws PresentableException { printMissing(missing_term + " ('" + parameter + "' parameter)"); } /** * Prints that something is missing. * * @param missing_term * A descriptive message of the missing thing. * @throws PresentableException * Forwarded exception. */ protected static void printMissing(final String missing_term) throws PresentableException { System.err.println("Please specify " + missing_term + "."); printUsage(System.out); } /** * Prints out the ErrorCodeException in a descriptive form. * * @param ece * The ErrorCodeException to be printed. */ protected static void printPresentableException(final PresentableException e) { if (e.getErrorCode() == ErrorCode.PLACEHOLDER_EXCEPTION) { PlaceholderException phe = null; if (e instanceof PlaceholderException) { phe = (PlaceholderException) e; } else { phe = (PlaceholderException) e.getCause(); } System.err.println("Der Platzhalter des Feldes " + phe.getField() + " ist um " + phe.getMissing() + " Bytes zu kurz. "); } System.err.println("Fehler " + e.getErrorCode() + ": " + ErrorCodeHelper.getMessageForErrorCode(e.getErrorCode())); if (e instanceof ExternalErrorException) { ExternalErrorException eee = (ExternalErrorException) e; System.err.println("Externer Fehlergrund: " + eee.getExternalErrorCode() + ": " + eee.getExternalErrorMessage()); } logger_.error(e); } /** * Prints the usage text. * * @param writer * The writer to print the text to. * @throws PresentableException * Forwarded exception. */ public static void printUsage(PrintStream writer) throws PresentableException { writer.println("Usage: pdf-as [OPTIONS] [output file]"); writer.println(" Required OPTIONS:"); writer.println(" " + PARAMETER_MODE + " <" + VALUE_MODE_SIGN + "|" + VALUE_MODE_VERIFY + ">"); writer.println(" " + VALUE_MODE_SIGN + " ... signs a document"); writer.println(" " + VALUE_MODE_VERIFY + " ... verifies a document"); writer.print(" " + PARAMETER_CONNECTOR + " "); ConnectorInformation[] ci = ConnectorFactory.getConnectorInformationArray(); for (int i = 0; i < ci.length; i++) { String id = ci[i].getIdentifier(); if (!ConnectorFactory.isAvailableForCommandline(id)) { continue; } writer.print(id); if (i < ci.length - 1) { writer.print("|"); } } writer.println(); for (int i = 0; i < ci.length; i++) { String id = ci[i].getIdentifier(); if (!ConnectorFactory.isAvailableForCommandline(id)) { continue; } writer.println(" " + id + " ... " + ci[i].getDescription()); } writer.println(" OPTIONS for signation:"); writer.println(" " + PARAMETER_SIGNATURE_MODE + " <" + VALUE_SIGNATURE_MODE_BINARY + "|" + VALUE_SIGNATURE_MODE_TEXTUAL + ">"); writer.println(" " + VALUE_SIGNATURE_MODE_BINARY + " ... signs the complete binary document"); writer.println(" " + VALUE_SIGNATURE_MODE_TEXTUAL + " ... signs only the textual portion of the document"); //writer.println(" " + VALUE_SIGNATURE_MODE_DETACHED + " ... signs the document using the binary mode and returns the xml signature of it."); writer.println(" " + VALUE_SIGNATURE_MODE_DETACHED_TEXT + " ... signs the document using the textual mode and returns the xml signature of it."); writer.print(" " + PARAMETER_SIGNATURE_TYPE + " <"); SignatureTypes sig_types = SignatureTypes.getInstance(); SettingsReader settings = SettingsReader.getInstance(); Set types_array = sig_types.getSignatureTypes(); Iterator it = types_array.iterator(); while (it.hasNext()) { String type = (String) it.next(); writer.print(type); if (it.hasNext()) { writer.print("|"); } } writer.println(">"); writer.println(" ... [optional] the profile to be used. If omitted, the default"); writer.println(" profile is used."); String default_type = settings.getValueFromKey(SignatureTypes.DEFAULT_TYPE); it = types_array.iterator(); while (it.hasNext()) { String type = (String) it.next(); String descr_key = SignatureTypes.SIG_OBJ + type + "." + SignatureTypes.SIG_DESCR; String type_descr = settings.getValueFromKey(descr_key); writer.println(" " + type + " ... " + (type.equals(default_type) ? "(default) " : "") + type_descr); } writer.println(" " + PARAMETER_USER_NAME + " ... [optional] the user name"); writer.println(" " + PARAMETER_USER_PASSWORD + " ... [optional] the user password"); writer.println(" " + PARAMETER_POS + " ... [optional] the position of the signature block"); writer.println(" position has the format [x:x_algo];[y:y_algo];[w:w_algo][p:p_algo];[f:f_algo]"); writer.println(" if not present default is set to x:auto;y:auto;w:auto;p:auto;f:0"); writer.println(" x_algo:='auto' ... automatic positioning x"); writer.println(" floatvalue ... absolute x must be >= 0"); writer.println(" y_algo:='auto' ... automatic positioning y"); writer.println(" floatvalue ... absolute y must be >= 0"); writer.println(" w_algo:='auto' ... automatic width"); writer.println(" floatvalue ... absolute width must be > 0"); writer.println(" p_algo:='auto' ... automatic last page"); writer.println(" 'new' ... new page"); writer.println(" intvalue ... pagenumber must be > 0 if p>number of pages in document p-->handled like p:'new'"); writer.println(" f_algo floatvalue ... consider footerline must be >= 0 (only if y_algo is auto and p_algo is not 'new')"); writer.println(" OPTIONS for verification:"); writer.println(" " + PARAMETER_VERIFY_WHICH + " ... [optional] zero based number of the signature"); writer.println(" to be verified. If omitted, all signatures are verified."); writer.println(" Example usage:"); writer.println(" pdf-as " + PARAMETER_MODE + " " + VALUE_MODE_SIGN + " " + PARAMETER_CONNECTOR + " moa some_document.pdf"); writer.println(" pdf-as " + PARAMETER_MODE + " " + VALUE_MODE_VERIFY + " some_document.pdf_out.pdf"); } /** * Checks the value for correctness. * * @param mode * The parameter's value. * @return Returns true, if the value is correct, false otherwise. */ protected static boolean checkMode(String mode) { return mode.equals(VALUE_MODE_SIGN) || mode.equals(VALUE_MODE_VERIFY); } /** * Checks the value for correctness. * * @param signature_mode * The parameter's value. * @return Returns true, if the value is correct, false otherwise. */ protected static boolean checkSignatureMode(String signature_mode) { return signature_mode.equals(VALUE_SIGNATURE_MODE_BINARY) || signature_mode.equals(VALUE_SIGNATURE_MODE_TEXTUAL) || signature_mode.equals(VALUE_SIGNATURE_MODE_DETACHED) || signature_mode.equals(VALUE_SIGNATURE_MODE_DETACHED_TEXT); } /** * Checks the value for correctness. * * @param connector * The parameter's value. * @return Returns true, if the value is correct, false otherwise. * @throws ConnectorFactoryException * F.e. */ protected static boolean checkConnector(String connector) throws ConnectorFactoryException { return ConnectorFactory.isValidConnectorIdentifier(connector) && ConnectorFactory.isAvailableForCommandline(connector); } /** * Checks the value for correctness. * * @param signature_type * The parameter's value. * @return Returns true, if the value is correct, false otherwise. */ protected static boolean checkSignatureType(String signature_type) throws SignatureTypesException { return SignatureTypes.getInstance().getSignatureTypes().contains(signature_type); // exthex: uuuaaaahhhhh WHY??? wprinz again?, dont do that. Use List.contains(o), please // take a java course and read: http://www.amazon.de/Java-f%C3%BCr-Dummies-Barry-Burd/dp/382662999X // List types_array = sig_types.getSignatureTypes(); // Iterator it = types_array.iterator(); // while (it.hasNext()) // { // String type = (String) it.next(); // if (type.equals(signature_type)) // { // return true; // } // } // return false; } /** * Translates the commandline argument to a PDF-AS-ID. * * @param signature_mode * The signator mode commandline argument. * @return Returns the corresponding PDFASID. */ protected static PdfASID translateSignatureModeToPdfASID(String signature_mode) { if (signature_mode.equals(VALUE_SIGNATURE_MODE_BINARY)) { return SignatorFactory.MOST_RECENT_BINARY_SIGNATOR_ID; } if (signature_mode.equals(VALUE_SIGNATURE_MODE_TEXTUAL)) { return SignatorFactory.MOST_RECENT_TEXTUAL_SIGNATOR_ID; } if (signature_mode.equals(VALUE_SIGNATURE_MODE_DETACHED)) { return SignatorFactory.MOST_RECENT_DETACHED_SIGNATOR_ID; } if (signature_mode.equals(VALUE_SIGNATURE_MODE_DETACHED_TEXT)) { return SignatorFactory.MOST_RECENT_DETACHEDTEXT_SIGNATOR_ID; } return null; } /** * Formats the verification results. * * @param results * The List of SignatureResponse verification results. * @param writer * The output sink to write the formatted text to. * @throws SettingNotFoundException * Forwarded exception. */ protected static void formatVerifyResults(List results, PrintWriter writer) throws SettingNotFoundException { Iterator it = results.iterator(); while (it.hasNext()) { SignatureResponse result = (SignatureResponse) it.next(); formatSignatureResponse(result, writer); if (it.hasNext()) { writer.println(); } } } /** * Formats the verification results for debugging. Returns 0 if no error occurs or the sum of all error-codes. * * @param results * * @param writer * The output sink to write the formatted text to. * @throws SettingNotFoundException * Forwarded exception. */ protected static int debugVerifyResults(List results) throws SettingNotFoundException { int toreturn = 0; Iterator it = results.iterator(); while (it.hasNext()) { SignatureResponse result = (SignatureResponse) it.next(); toreturn += Integer.valueOf(result.getSignatureCheckCode()).intValue(); } return toreturn; } /** * Formats the SignatureResponse. * * @param result * The SignatureResponse to be printed. * @param writer * The output sink to write the formatted text to. * @throws SettingNotFoundException * Forwarded exception. */ public static void formatSignatureResponse(SignatureResponse result, PrintWriter writer) throws SettingNotFoundException { writer.println(" Zertifikat:"); writer.println(" Signator: " + result.getX509SubjectName()); writer.println(" Aussteller: " + result.getX509IssuerName()); writer.println(" Seriennummer: " + result.getX509SerialNumber()); List public_properties = result.getPublicProperties(); Iterator it = public_properties.iterator(); while (it.hasNext()) { String public_property = (String) it.next(); writer.println(" Eigenschaft: " + public_property); } writer.println(" Zertifikat-Check:"); writer.println(" " + result.getCertificateCheckCode() + " - " + result.getCertificateCheckInfo()); writer.println(" Signatur-Check:"); writer.println(" " + result.getSignatureCheckCode() + " - " + result.getSignatureCheckInfo()); writer.println(" Manifest-Check:"); writer.println(" " + result.getSignatureManifestCheckCode() + " - " + result.getSignatureManifestCheckInfo()); } }