diff --git a/WHATSNEW b/WHATSNEW
index 4dacbc190..8bc4caa29 100644
--- a/WHATSNEW
+++ b/WHATSNEW
@@ -44,6 +44,9 @@ Fixed bugs:
* Commandline.describeCommand() methods would attempt to describe
arguments even when none, other than the executable name, were present.
+* Create signjar's helper ExecTask instance directly rather than by
+ typedef discovery mechanisms. Bugzilla report 33433.
+
Other changes:
--------------
@@ -110,6 +113,9 @@ Other changes:
* Added loginputstring attribute to the redirector type.
+* Tighten security by sending storepass and keypass to signjar
+ via the input stream of the forked process.
+
Changes from Ant 1.6.2 to current Ant 1.6 CVS version
=====================================================
diff --git a/docs/manual/CoreTasks/signjar.html b/docs/manual/CoreTasks/signjar.html
index c1c998882..c441dd330 100644
--- a/docs/manual/CoreTasks/signjar.html
+++ b/docs/manual/CoreTasks/signjar.html
@@ -16,13 +16,6 @@ generate; if this file exists then
its modification date is used as a cue as to whether to resign any JAR file.
-
-Security warning. This task forks the jarsigner executable
-(which must of course be on the path). The store password is passed in on
-the command line, so visible in Unix to anyone running ps -ef
-on the same host, while signing takes place. Only sign on a secured system.
-
-
Parameters
diff --git a/src/main/org/apache/tools/ant/taskdefs/SignJar.java b/src/main/org/apache/tools/ant/taskdefs/SignJar.java
index 1b75dddb9..dcddb5600 100644
--- a/src/main/org/apache/tools/ant/taskdefs/SignJar.java
+++ b/src/main/org/apache/tools/ant/taskdefs/SignJar.java
@@ -25,6 +25,7 @@ import org.apache.tools.ant.Project;
import org.apache.tools.ant.Task;
import org.apache.tools.ant.taskdefs.condition.IsSigned;
import org.apache.tools.ant.types.FileSet;
+import org.apache.tools.ant.types.RedirectorElement;
import org.apache.tools.ant.util.JavaEnvUtils;
import org.apache.tools.ant.util.FileUtils;
@@ -66,6 +67,7 @@ public class SignJar extends Task {
protected boolean internalsf;
protected boolean sectionsonly;
private boolean preserveLastModified;
+ private RedirectorElement redirector;
/** The maximum amount of memory to use for Jar signer */
private String maxMemory;
@@ -212,6 +214,7 @@ public class SignJar extends Task {
throw new BuildException("jar must be set through jar attribute "
+ "or nested filesets");
}
+ redirector = createRedirector();
if (null != jar) {
if (filesets.size() != 0) {
log("nested filesets will be ignored if the jar attribute has"
@@ -233,6 +236,27 @@ public class SignJar extends Task {
}
}
+ /**
+ * Create the redirector to use, if any.
+ * @return a configured RedirectorElement.
+ */
+ private RedirectorElement createRedirector() {
+ if (storepass == null && keypass == null) {
+ return null;
+ }
+ RedirectorElement result = new RedirectorElement();
+ StringBuffer input = new StringBuffer();
+ if (storepass != null) {
+ input.append(storepass).append('\n');
+ }
+ if (keypass != null) {
+ input.append(keypass).append('\n');
+ }
+ result.setInputString(input.toString());
+ result.setLogInputString(false);
+ return result;
+ }
+
/**
* sign one jar
*/
@@ -252,7 +276,8 @@ public class SignJar extends Task {
}
long lastModified = jarSource.lastModified();
- final ExecTask cmd = (ExecTask) getProject().createTask("exec");
+ final ExecTask cmd = new ExecTask();
+ cmd.setProject(getProject());
cmd.setExecutable(JavaEnvUtils.getJdkExecutable("jarsigner"));
if (maxMemory != null) {
@@ -271,22 +296,10 @@ public class SignJar extends Task {
cmd.createArg().setValue(keystore);
}
}
-
- if (null != storepass) {
- cmd.createArg().setValue("-storepass");
- cmd.createArg().setValue(storepass);
- }
-
if (null != storetype) {
cmd.createArg().setValue("-storetype");
cmd.createArg().setValue(storetype);
}
-
- if (null != keypass) {
- cmd.createArg().setValue("-keypass");
- cmd.createArg().setValue(keypass);
- }
-
if (null != sigfile) {
cmd.createArg().setValue("-sigfile");
cmd.createArg().setValue(sigfile);
@@ -316,6 +329,9 @@ public class SignJar extends Task {
log("Signing JAR: " + jarSource.getAbsolutePath());
cmd.setFailonerror(true);
cmd.setTaskName(getTaskName());
+ if (redirector != null) {
+ cmd.addConfiguredRedirector(redirector);
+ }
cmd.execute();
// restore the lastModified attribute