stevel      2005/03/23 08:51:42

  Modified:    src/main/org/apache/tools/ant/taskdefs defaults.properties
                        SignJar.java
               src/etc/testcases/taskdefs signjar.xml
               src/testcases/org/apache/tools/ant/taskdefs SignJarTest.java
  Added:       src/main/org/apache/tools/ant/taskdefs
                        AbstractJarSignerTask.java VerifyJar.java
  Log:
  Factor out a base classs and add a verification task, a verification which 
cannot rely on return codes as a success metric, as the program returns 0 even 
for invalid jars. Hence the disabled test
  
  Revision  Changes    Path
  1.166     +1 -0      
ant/src/main/org/apache/tools/ant/taskdefs/defaults.properties
  
  Index: defaults.properties
  ===================================================================
  RCS file: 
/home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/defaults.properties,v
  retrieving revision 1.165
  retrieving revision 1.166
  diff -u -r1.165 -r1.166
  --- defaults.properties       22 Feb 2005 15:58:36 -0000      1.165
  +++ defaults.properties       23 Mar 2005 16:51:42 -0000      1.166
  @@ -207,6 +207,7 @@
   ildasm=org.apache.tools.ant.taskdefs.optional.dotnet.Ildasm
   apt=org.apache.tools.ant.taskdefs.Apt
   schemavalidate=org.apache.tools.ant.taskdefs.optional.SchemaValidate
  +verifyjar=org.apache.tools.ant.taskdefs.VerifyJar
   
   # deprecated ant tasks (kept for back compatibility)
   starteam=org.apache.tools.ant.taskdefs.optional.scm.AntStarTeamCheckOut
  
  
  
  1.52      +68 -261   ant/src/main/org/apache/tools/ant/taskdefs/SignJar.java
  
  Index: SignJar.java
  ===================================================================
  RCS file: /home/cvs/ant/src/main/org/apache/tools/ant/taskdefs/SignJar.java,v
  retrieving revision 1.51
  retrieving revision 1.52
  diff -u -r1.51 -r1.52
  --- SignJar.java      23 Mar 2005 15:06:48 -0000      1.51
  +++ SignJar.java      23 Mar 2005 16:51:42 -0000      1.52
  @@ -48,41 +48,11 @@
    * @ant.task category="java"
    * @since Ant 1.1
    */
  -public class SignJar extends Task {
  +public class SignJar extends AbstractJarSignerTask {
   
       private static final FileUtils FILE_UTILS = FileUtils.getFileUtils();
   
       /**
  -     * The name of the jar file.
  -     */
  -    protected File jar;
  -
  -    /**
  -     * The alias of signer.
  -     */
  -    protected String alias;
  -
  -    /**
  -     * The url or path of keystore file.
  -     */
  -    private String keystore;
  -
  -    /**
  -     * password for the store
  -     */
  -    protected String storepass;
  -
  -    /**
  -     * type of store,-storetype param
  -     */
  -    protected String storetype;
  -
  -    /**
  -     * password for the key in the store
  -     */
  -    protected String keypass;
  -
  -    /**
        * name to a signature file
        */
       protected String sigfile;
  @@ -93,11 +63,6 @@
       protected File signedjar;
   
       /**
  -     * verbose output
  -     */
  -    protected boolean verbose;
  -
  -    /**
        * flag for internal sf signing
        */
       protected boolean internalsf;
  @@ -113,21 +78,6 @@
       private boolean preserveLastModified;
   
       /**
  -     * redirector used to talk to the jarsigner program
  -     */
  -    private RedirectorElement redirector;
  -
  -    /**
  -     * The maximum amount of memory to use for Jar signer
  -     */
  -    private String maxMemory;
  -
  -    /**
  -     * the filesets of the jars to sign
  -     */
  -    protected Vector filesets = new Vector();
  -
  -    /**
        * Whether to assume a jar which has an appropriate .SF file in is 
already
        * signed.
        */
  @@ -169,11 +119,6 @@
       /**
        * error string for unit test verification: [EMAIL PROTECTED]
        */
  -    public static final String WARN_JAR_AND_FILESET = "nested filesets will 
be ignored if the jar attribute has"
  -            + " been specified.";
  -    /**
  -     * error string for unit test verification: [EMAIL PROTECTED]
  -     */
       public static final String ERROR_BAD_MAP = "Cannot map source file to 
anything sensible: ";
       /**
        * error string for unit test verification: [EMAIL PROTECTED]
  @@ -182,11 +127,6 @@
       /**
        * error string for unit test verification: [EMAIL PROTECTED]
        */
  -    public static final String ERROR_NO_SOURCE = "jar must be set through 
jar attribute "
  -            + "or nested filesets";
  -    /**
  -     * error string for unit test verification: [EMAIL PROTECTED]
  -     */
       public static final String ERROR_NO_ALIAS = "alias attribute must be 
set";
       /**
        * error string for unit test verification: [EMAIL PROTECTED]
  @@ -194,75 +134,6 @@
       public static final String ERROR_NO_STOREPASS = "storepass attribute 
must be set";
   
       /**
  -     * name of JDK program we are looking for
  -     */
  -    protected static final String JARSIGNER_COMMAND = "jarsigner";
  -
  -    /**
  -     * Set the maximum memory to be used by the jarsigner process
  -     *
  -     * @param max a string indicating the maximum memory according to the JVM
  -     *            conventions (e.g. 128m is 128 Megabytes)
  -     */
  -    public void setMaxmemory(String max) {
  -        maxMemory = max;
  -    }
  -
  -    /**
  -     * the jar file to sign; required
  -     *
  -     * @param jar the jar file to sign
  -     */
  -    public void setJar(final File jar) {
  -        this.jar = jar;
  -    }
  -
  -    /**
  -     * the alias to sign under; required
  -     *
  -     * @param alias the alias to sign under
  -     */
  -    public void setAlias(final String alias) {
  -        this.alias = alias;
  -    }
  -
  -    /**
  -     * keystore location; required
  -     *
  -     * @param keystore the keystore location
  -     */
  -    public void setKeystore(final String keystore) {
  -        this.keystore = keystore;
  -    }
  -
  -    /**
  -     * password for keystore integrity; required
  -     *
  -     * @param storepass the password for the keystore
  -     */
  -    public void setStorepass(final String storepass) {
  -        this.storepass = storepass;
  -    }
  -
  -    /**
  -     * keystore type; optional
  -     *
  -     * @param storetype the keystore type
  -     */
  -    public void setStoretype(final String storetype) {
  -        this.storetype = storetype;
  -    }
  -
  -    /**
  -     * password for private key (if different); optional
  -     *
  -     * @param keypass the password for the key (if different)
  -     */
  -    public void setKeypass(final String keypass) {
  -        this.keypass = keypass;
  -    }
  -
  -    /**
        * name of .SF/.DSA file; optional
        *
        * @param sigfile the name of the .SF/.DSA file
  @@ -281,15 +152,6 @@
       }
   
       /**
  -     * Enable verbose output when signing ; optional: default false
  -     *
  -     * @param verbose if true enable verbose output
  -     */
  -    public void setVerbose(final boolean verbose) {
  -        this.verbose = verbose;
  -    }
  -
  -    /**
        * Flag to include the .SF file inside the signature; optional; default
        * false
        *
  @@ -319,16 +181,6 @@
       }
   
       /**
  -     * Adds a set of files to sign
  -     *
  -     * @param set a set of files to sign
  -     * @since Ant 1.4
  -     */
  -    public void addFileset(final FileSet set) {
  -        filesets.addElement(set);
  -    }
  -
  -    /**
        * Optionally sets the output directory to be used.
        *
        * @param destDir the directory in which to place signed jars
  @@ -436,88 +288,67 @@
               throw new BuildException(ERROR_MAPPER_WITHOUT_DEST);
           }
   
  -        //init processing logic; this is retained through our execution(s)
  -        redirector = createRedirector();
  +        beginExecution();
   
   
  -        //special case single jar handling with signedjar attribute set
  -        if (hasJar && hasSignedJar) {
  -            // single jar processing
  -            signOneJar(jar, signedjar);
  -            //return here.
  -            return;
  -        }
  +        try {
  +            //special case single jar handling with signedjar attribute set
  +            if (hasJar && hasSignedJar) {
  +                // single jar processing
  +                signOneJar(jar, signedjar);
  +                //return here.
  +                return;
  +            }
   
  -        //the rest of the method treats single jar like
  -        //a nested fileset with one file
  +            //the rest of the method treats single jar like
  +            //a nested fileset with one file
   
  -        if (hasJar) {
  -            //we create a fileset with the source file.
  -            //this lets us combine our logic for handling output directories,
  -            //mapping etc.
  -            FileSet sourceJar = new FileSet();
  -            sourceJar.setFile(jar);
  -            sourceJar.setDir(jar.getParentFile());
  -            addFileset(sourceJar);
  -        }
  -        //set up our mapping policy
  -        FileNameMapper destMapper;
  -        if (hasMapper) {
  -            destMapper = mapper;
  -        } else {
  -            //no mapper? use the identity policy
  -            destMapper = new IdentityMapper();
  -        }
  +            Vector sources = createUnifiedSources();
  +            //set up our mapping policy
  +            FileNameMapper destMapper;
  +            if (hasMapper) {
  +                destMapper = mapper;
  +            } else {
  +                //no mapper? use the identity policy
  +                destMapper = new IdentityMapper();
  +            }
   
   
  -        //at this point the filesets are set up with lists of files,
  -        //and the mapper is ready to map from source dirs to dest files
  -        //now we iterate through every JAR giving source and dest names
  -        // deal with the filesets
  -        for (int i = 0; i < filesets.size(); i++) {
  -            FileSet fs = (FileSet) filesets.elementAt(i);
  -            //get all included files in a fileset
  -            DirectoryScanner ds = fs.getDirectoryScanner(getProject());
  -            String[] jarFiles = ds.getIncludedFiles();
  -            File baseDir = fs.getDir(getProject());
  -
  -            //calculate our destination directory; it is either the destDir
  -            //attribute, or the base dir of the fileset (for in situ updates)
  -            File toDir = hasDestDir ? destDir : baseDir;
  -
  -            //loop through all jars in the fileset
  -            for (int j = 0; j < jarFiles.length; j++) {
  -                String jarFile = jarFiles[j];
  -                //determine the destination filename via the mapper
  -                String[] destFilenames = destMapper.mapFileName(jarFile);
  -                if (destFilenames == null || destFilenames.length != 1) {
  -                    //we only like simple mappers.
  -                    throw new BuildException(ERROR_BAD_MAP + jarFile);
  +            //at this point the filesets are set up with lists of files,
  +            //and the mapper is ready to map from source dirs to dest files
  +            //now we iterate through every JAR giving source and dest names
  +            // deal with the filesets
  +            for (int i = 0; i < sources.size(); i++) {
  +                FileSet fs = (FileSet) sources.elementAt(i);
  +                //get all included files in a fileset
  +                DirectoryScanner ds = fs.getDirectoryScanner(getProject());
  +                String[] jarFiles = ds.getIncludedFiles();
  +                File baseDir = fs.getDir(getProject());
  +
  +                //calculate our destination directory; it is either the 
destDir
  +                //attribute, or the base dir of the fileset (for in situ 
updates)
  +                File toDir = hasDestDir ? destDir : baseDir;
  +
  +                //loop through all jars in the fileset
  +                for (int j = 0; j < jarFiles.length; j++) {
  +                    String jarFile = jarFiles[j];
  +                    //determine the destination filename via the mapper
  +                    String[] destFilenames = destMapper.mapFileName(jarFile);
  +                    if (destFilenames == null || destFilenames.length != 1) {
  +                        //we only like simple mappers.
  +                        throw new BuildException(ERROR_BAD_MAP + jarFile);
  +                    }
  +                    File destFile = new File(toDir, destFilenames[0]);
  +                    File jarSource = new File(baseDir, jarFile);
  +                    signOneJar(jarSource, destFile);
                   }
  -                File destFile = new File(toDir, destFilenames[0]);
  -                File jarSource = new File(baseDir, jarFile);
  -                signOneJar(jarSource, destFile);
               }
  +        } finally {
  +            endExecution();
           }
       }
   
       /**
  -     * Create the redirector to use, if any.
  -     *
  -     * @return a configured RedirectorElement.
  -     */
  -    private RedirectorElement createRedirector() {
  -        RedirectorElement result = new RedirectorElement();
  -        StringBuffer input = new StringBuffer(storepass).append('\n');
  -        if (keypass != null) {
  -            input.append(keypass).append('\n');
  -        }
  -        result.setInputString(input.toString());
  -        result.setLogInputString(false);
  -        return result;
  -    }
  -
  -    /**
        * Sign one jar.
        * <p/>
        * The signing only takes place if [EMAIL PROTECTED] #isUpToDate(File, 
File)} indicates
  @@ -540,71 +371,47 @@
           }
   
           long lastModified = jarSource.lastModified();
  -        final ExecTask cmd = new ExecTask(this);
  -        cmd.setExecutable(JavaEnvUtils.getJdkExecutable(JARSIGNER_COMMAND));
  -        cmd.setTaskType(JARSIGNER_COMMAND);
  -
  -        if (maxMemory != null) {
  -            cmd.createArg().setValue("-J-Xmx" + maxMemory);
  -        }
  +        final ExecTask cmd = createJarSigner();
   
  -        if (null != keystore) {
  -            // is the keystore a file
  -            cmd.createArg().setValue("-keystore");
  -            String location;
  -            File keystoreFile = getProject().resolveFile(keystore);
  -            if (keystoreFile.exists()) {
  -                location = keystoreFile.getPath();
  -            } else {
  -                // must be a URL - just pass as is
  -                location = keystore;
  -            }
  -            cmd.createArg().setValue(location);
  -        }
  -        if (null != storetype) {
  -            cmd.createArg().setValue("-storetype");
  -            cmd.createArg().setValue(storetype);
  -        }
  +        setCommonOptions(cmd);
  +
  +        bindToKeystore(cmd);
           if (null != sigfile) {
  -            cmd.createArg().setValue("-sigfile");
  -            cmd.createArg().setValue(sigfile);
  +            addValue(cmd, "-sigfile");
  +            String value = this.sigfile;
  +            addValue(cmd, value);
           }
   
           //DO NOT SET THE -signedjar OPTION if source==dest
           //unless you like fielding hotspot crash reports
           if (null != target && !jarSource.equals(target)) {
  -            cmd.createArg().setValue("-signedjar");
  -            cmd.createArg().setValue(target.getPath());
  -        }
  -
  -        if (verbose) {
  -            cmd.createArg().setValue("-verbose");
  +            addValue(cmd, "-signedjar");
  +            addValue(cmd, target.getPath());
           }
   
           if (internalsf) {
  -            cmd.createArg().setValue("-internalsf");
  +            addValue(cmd, "-internalsf");
           }
   
           if (sectionsonly) {
  -            cmd.createArg().setValue("-sectionsonly");
  +            addValue(cmd, "-sectionsonly");
           }
   
           //add -tsa operations if declared
           addTimestampAuthorityCommands(cmd);
   
           //JAR source is required
  -        cmd.createArg().setValue(jarSource.getPath());
  +        addValue(cmd, jarSource.getPath());
   
           //alias is required for signing
  -        cmd.createArg().setValue(alias);
  +        addValue(cmd, alias);
   
           log("Signing JAR: " +
                   jarSource.getAbsolutePath()
                   +" to " +
                   target.getAbsolutePath()
                   + " as " + alias);
  -        cmd.setFailonerror(true);
  -        cmd.addConfiguredRedirector(redirector);
  +
           cmd.execute();
   
           // restore the lastModified attribute
  @@ -621,12 +428,12 @@
        */
       private void addTimestampAuthorityCommands(final ExecTask cmd) {
           if(tsaurl!=null) {
  -            cmd.createArg().setValue("-tsa");
  -            cmd.createArg().setValue(tsaurl);
  +            addValue(cmd, "-tsa");
  +            addValue(cmd, tsaurl);
           }
           if (tsacert != null) {
  -            cmd.createArg().setValue("-tsacert");
  -            cmd.createArg().setValue(tsacert);
  +            addValue(cmd, "-tsacert");
  +            addValue(cmd, tsacert);
           }
       }
   
  
  
  
  1.1                  
ant/src/main/org/apache/tools/ant/taskdefs/AbstractJarSignerTask.java
  
  Index: AbstractJarSignerTask.java
  ===================================================================
  /*
   * Copyright  2000-2005 The Apache Software Foundation
   *
   *  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.
   *
   */
  
  package org.apache.tools.ant.taskdefs;
  
  import org.apache.tools.ant.Task;
  import org.apache.tools.ant.util.JavaEnvUtils;
  import org.apache.tools.ant.types.FileSet;
  import org.apache.tools.ant.types.RedirectorElement;
  
  import java.io.File;
  import java.util.Vector;
  
  /**
   * This is factored out from [EMAIL PROTECTED] SignJar}; a base class that 
can be used
   * for both signing and verifying JAR files using jarsigner
   */
  
  public abstract class AbstractJarSignerTask extends Task {
      /**
       * The name of the jar file.
       */
      protected File jar;
      /**
       * The alias of signer.
       */
      protected String alias;
      /**
       * The url or path of keystore file.
       */
      protected String keystore;
      /**
       * password for the store
       */
      protected String storepass;
      /**
       * type of store,-storetype param
       */
      protected String storetype;
      /**
       * password for the key in the store
       */
      protected String keypass;
      /**
       * verbose output
       */
      protected boolean verbose;
      /**
       * The maximum amount of memory to use for Jar signer
       */
      protected String maxMemory;
      /**
       * the filesets of the jars to sign
       */
      protected Vector filesets = new Vector();
      /**
       * name of JDK program we are looking for
       */
      protected static final String JARSIGNER_COMMAND = "jarsigner";
      /**
       * redirector used to talk to the jarsigner program
       */
      private RedirectorElement redirector;
      /**
       * error string for unit test verification: [EMAIL PROTECTED]
       */
      public static final String ERROR_NO_SOURCE = "jar must be set through jar 
attribute "
              + "or nested filesets";
  
      /**
       * Set the maximum memory to be used by the jarsigner process
       *
       * @param max a string indicating the maximum memory according to the JVM
       *            conventions (e.g. 128m is 128 Megabytes)
       */
      public void setMaxmemory(String max) {
          maxMemory = max;
      }
  
      /**
       * the jar file to sign; required
       *
       * @param jar the jar file to sign
       */
      public void setJar(final File jar) {
          this.jar = jar;
      }
  
      /**
       * the alias to sign under; required
       *
       * @param alias the alias to sign under
       */
      public void setAlias(final String alias) {
          this.alias = alias;
      }
  
      /**
       * keystore location; required
       *
       * @param keystore the keystore location
       */
      public void setKeystore(final String keystore) {
          this.keystore = keystore;
      }
  
      /**
       * password for keystore integrity; required
       *
       * @param storepass the password for the keystore
       */
      public void setStorepass(final String storepass) {
          this.storepass = storepass;
      }
  
      /**
       * keystore type; optional
       *
       * @param storetype the keystore type
       */
      public void setStoretype(final String storetype) {
          this.storetype = storetype;
      }
  
      /**
       * password for private key (if different); optional
       *
       * @param keypass the password for the key (if different)
       */
      public void setKeypass(final String keypass) {
          this.keypass = keypass;
      }
  
      /**
       * Enable verbose output when signing ; optional: default false
       *
       * @param verbose if true enable verbose output
       */
      public void setVerbose(final boolean verbose) {
          this.verbose = verbose;
      }
  
      /**
       * Adds a set of files to sign
       *
       * @param set a set of files to sign
       * @since Ant 1.4
       */
      public void addFileset(final FileSet set) {
          filesets.addElement(set);
      }
  
      /**
       * init processing logic; this is retained through our execution(s)
       */
      protected void beginExecution() {
  
          redirector = createRedirector();
      }
  
      /**
       * any cleanup logic
       */
      protected void endExecution() {
          redirector = null;
      }
  
      /**
       * Create the redirector to use, if any.
       *
       * @return a configured RedirectorElement.
       */
      private RedirectorElement createRedirector() {
          RedirectorElement result = new RedirectorElement();
          StringBuffer input = new StringBuffer(storepass).append('\n');
          if (keypass != null) {
              input.append(keypass).append('\n');
          }
          result.setInputString(input.toString());
          result.setLogInputString(false);
          return result;
      }
  
      /**
       * these are options common to signing and verifying
       * @param cmd  command to configure
       */
      protected void setCommonOptions(final ExecTask cmd) {
          if (maxMemory != null) {
              cmd.createArg().setValue("-J-Xmx" + maxMemory);
          }
  
          if (verbose) {
              cmd.createArg().setValue("-verbose");
          }
      }
  
      /**
       * bind to a keystore if the attributes are there
       * @param cmd command to configure
       */
      protected void bindToKeystore(final ExecTask cmd) {
          if (null != keystore) {
              // is the keystore a file
              cmd.createArg().setValue("-keystore");
              String location;
              File keystoreFile = getProject().resolveFile(keystore);
              if (keystoreFile.exists()) {
                  location = keystoreFile.getPath();
              } else {
                  // must be a URL - just pass as is
                  location = keystore;
              }
              cmd.createArg().setValue(location);
          }
          if (null != storetype) {
              cmd.createArg().setValue("-storetype");
              cmd.createArg().setValue(storetype);
          }
      }
  
      /**
       * create the jarsigner executable task
       * @return a task set up with the executable of jarsigner, 
failonerror=true
       * and bound to our redirector
       */
      protected ExecTask createJarSigner() {
          final ExecTask cmd = new ExecTask(this);
          cmd.setExecutable(JavaEnvUtils.getJdkExecutable(JARSIGNER_COMMAND));
          cmd.setTaskType(JARSIGNER_COMMAND);
          cmd.setFailonerror(true);
          cmd.addConfiguredRedirector(redirector);
          return cmd;
      }
  
      /**
       * clone our filesets vector, and patch in the jar attribute as a new
       * fileset, if is defined
       * @return a vector of FileSet instances
       */
      protected Vector createUnifiedSources() {
          Vector sources = (Vector)filesets.clone();
          if (jar != null) {
              //we create a fileset with the source file.
              //this lets us combine our logic for handling output directories,
              //mapping etc.
              FileSet sourceJar = new FileSet();
              sourceJar.setFile(jar);
              sourceJar.setDir(jar.getParentFile());
              sources.add(sourceJar);
          }
          return sources;
      }
  
      /**
       * add a value argument to a command
       * @param cmd command to manipulate
       * @param value value to add
       */
      protected void addValue(final ExecTask cmd, String value) {
          cmd.createArg().setValue(value);
      }
  }
  
  
  
  1.1                  ant/src/main/org/apache/tools/ant/taskdefs/VerifyJar.java
  
  Index: VerifyJar.java
  ===================================================================
  /*
   * Copyright  2000-2005 The Apache Software Foundation
   *
   *  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.
   *
   */
  
  package org.apache.tools.ant.taskdefs;
  
  import org.apache.tools.ant.BuildException;
  import org.apache.tools.ant.DirectoryScanner;
  import org.apache.tools.ant.types.FileSet;
  
  import java.util.Vector;
  import java.io.File;
  
  /**
   * JAR verification task.
   * For every JAR passed in, we fork jarsigner to verify
   * that it is correctly signed. This is more rigorous than just checking for
   * the existence of a signature; the entire certification chain is tested
   * @since Ant 1.7
   */
  
  public class VerifyJar extends AbstractJarSignerTask {
      /**
       * no file message [EMAIL PROTECTED]
       */
      public static final String ERROR_NO_FILE = "Not found :";
  
      /**
       * certification flag
       */
      private boolean certificates=false;
  
      /**
       * Ask for certificate information to be printed
       * @param certificates
       */
      public void setCertificates(boolean certificates) {
          this.certificates = certificates;
      }
  
      /**
       * verify our jar files
       * @throws BuildException
       */
      public void execute() throws BuildException {
          //validation logic
          final boolean hasFileset = filesets.size() > 0;
          final boolean hasJar = jar != null;
  
          if (!hasJar && !hasFileset) {
              throw new BuildException(ERROR_NO_SOURCE);
          }
  
          beginExecution();
          try {
              Vector sources = createUnifiedSources();
              for (int i = 0; i < sources.size(); i++) {
                  FileSet fs = (FileSet) sources.elementAt(i);
                  //get all included files in a fileset
                  DirectoryScanner ds = fs.getDirectoryScanner(getProject());
                  String[] jarFiles = ds.getIncludedFiles();
                  File baseDir = fs.getDir(getProject());
  
                  //loop through all jars in the fileset
                  for (int j = 0; j < jarFiles.length; j++) {
                      String jarFile = jarFiles[j];
                      File jarSource = new File(baseDir, jarFile);
                      verifyOneJar(jarSource);
                  }
              }
  
          } finally {
              endExecution();
          }
  
      }
  
      /**
       * verify a JAR.
       * @param jar
       * @throws BuildException if the file could not be verified
       */
      private void verifyOneJar(File jar) {
          if(!jar.exists()) {
              throw new BuildException(ERROR_NO_FILE+jar);
          }
          final ExecTask cmd = createJarSigner();
  
          setCommonOptions(cmd);
          bindToKeystore(cmd);
  
          //verify special operations
          addValue(cmd, "-verify");
  
          if(certificates) {
              addValue(cmd, "-certs");
          }
  
          //JAR  is required
          addValue(cmd, jar.getPath());
  
          log("Verifying JAR: " +
                  jar.getAbsolutePath());
  
          cmd.execute();
      }
  }
  
  
  
  1.9       +26 -0     ant/src/etc/testcases/taskdefs/signjar.xml
  
  Index: signjar.xml
  ===================================================================
  RCS file: /home/cvs/ant/src/etc/testcases/taskdefs/signjar.xml,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- signjar.xml       23 Mar 2005 15:06:48 -0000      1.8
  +++ signjar.xml       23 Mar 2005 16:51:42 -0000      1.9
  @@ -24,6 +24,13 @@
       <signjar alias="testonly" keystore="testkeystore"
              storepass="apacheant"/>
     </presetdef>
  +
  +  <presetdef name="verify-base">
  +    <verifyjar keystore="testkeystore"
  +           storepass="apacheant"/>
  +  </presetdef>
  +
  +
     
     <presetdef name="sign">
       <sign-base jar="${test.jar}" />
  @@ -174,5 +181,24 @@
       <sign tsaurl="http://localhost:0/"; />
     </target>
     
  +  
  +  <target name="testVerifyJar" depends="basic">
  +    <verify-base jar="${test.jar}"/>
  +  </target>
  +
  +  <target name="testVerifyJarUnsigned" depends="jar">
  +    <verify-base jar="${test.jar}"/>
  +  </target>
  +  
  +  <target name="testVerifyFileset" depends="basic">
  +    <verify-base >
  +      <fileset file="${test.jar}" />
  +    </verify-base>
  +  </target>
  +
  +  <target name="testVerifyNoArgs">
  +    <verify-base />
  +  </target>
  +  
   </project>
   
  
  
  
  1.13      +20 -7     
ant/src/testcases/org/apache/tools/ant/taskdefs/SignJarTest.java
  
  Index: SignJarTest.java
  ===================================================================
  RCS file: 
/home/cvs/ant/src/testcases/org/apache/tools/ant/taskdefs/SignJarTest.java,v
  retrieving revision 1.12
  retrieving revision 1.13
  diff -u -r1.12 -r1.13
  --- SignJarTest.java  23 Mar 2005 15:36:10 -0000      1.12
  +++ SignJarTest.java  23 Mar 2005 16:51:42 -0000      1.13
  @@ -17,14 +17,7 @@
   
   package org.apache.tools.ant.taskdefs;
   
  -import java.io.File;
  -import java.io.FileReader;
  -import java.io.IOException;
  -import java.util.Date;
  -import java.util.Vector;
  -import java.util.Enumeration;
   import org.apache.tools.ant.BuildFileTest;
  -import org.apache.tools.ant.Project;
   import org.apache.tools.ant.util.JavaEnvUtils;
   
   /**
  @@ -156,4 +149,24 @@
               assertLogContaining("java.net.ConnectException");
           }
       }
  +
  +    public void testVerifyJar() {
  +        executeTarget("testVerifyJar");
  +    }
  +
  +    public void testVerifyNoArgs() {
  +        expectBuildExceptionContaining("testVerifyNoArgs",
  +                "no args",
  +                AbstractJarSignerTask.ERROR_NO_SOURCE);
  +    }
  +
  +    public void NotestVerifyJarUnsigned() {
  +        expectBuildException("testVerifyJarUnsigned",
  +                "unsigned JAR file");
  +    }
  +
  +    public void testVerifyFileset() {
  +        executeTarget("testVerifyFileset");
  +    }
  +
   }
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to