diff --git a/WHATSNEW b/WHATSNEW index e861d425f..360578c64 100644 --- a/WHATSNEW +++ b/WHATSNEW @@ -222,6 +222,10 @@ Fixed bugs: regardless of their configuration. Bugzilla Report 37970. + * and didn't handle aliases with characters other + than numbers, letters, hyphen or underscore properly. + Bugzilla Report 45820. + Other changes: -------------- diff --git a/src/etc/testcases/taskdefs/signjar.xml b/src/etc/testcases/taskdefs/signjar.xml index 1d83aed77..7f9bfa092 100644 --- a/src/etc/testcases/taskdefs/signjar.xml +++ b/src/etc/testcases/taskdefs/signjar.xml @@ -80,6 +80,11 @@ + + + + + diff --git a/src/etc/testcases/testkeystore b/src/etc/testcases/testkeystore index 2fd22c9f4..5aa6a27d4 100644 Binary files a/src/etc/testcases/testkeystore and b/src/etc/testcases/testkeystore differ diff --git a/src/main/org/apache/tools/ant/taskdefs/condition/IsSigned.java b/src/main/org/apache/tools/ant/taskdefs/condition/IsSigned.java index 59d5a3aa5..585fb3a78 100644 --- a/src/main/org/apache/tools/ant/taskdefs/condition/IsSigned.java +++ b/src/main/org/apache/tools/ant/taskdefs/condition/IsSigned.java @@ -23,6 +23,7 @@ import java.util.Enumeration; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.Project; +import org.apache.tools.ant.taskdefs.ManifestTask; import org.apache.tools.ant.types.DataType; import org.apache.tools.zip.ZipEntry; import org.apache.tools.zip.ZipFile; @@ -84,6 +85,7 @@ public class IsSigned extends DataType implements Condition { } return false; } + name = replaceInvalidChars(name); boolean shortSig = jarFile.getEntry(SIG_START + name.toUpperCase() + SIG_END) != null; @@ -131,4 +133,20 @@ public class IsSigned extends DataType implements Condition { } return r; } + + private static String replaceInvalidChars(final String name) { + StringBuffer sb = new StringBuffer(); + final int len = name.length(); + boolean changes = false; + for (int i = 0; i < len; i++) { + final char ch = name.charAt(i); + if (ManifestTask.VALID_ATTRIBUTE_CHARS.indexOf(ch) < 0) { + sb.append("_"); + changes = true; + } else { + sb.append(ch); + } + } + return changes ? sb.toString() : name; + } } diff --git a/src/tests/junit/org/apache/tools/ant/taskdefs/SignJarTest.java b/src/tests/junit/org/apache/tools/ant/taskdefs/SignJarTest.java index ece8eeadb..a35bfc2de 100644 --- a/src/tests/junit/org/apache/tools/ant/taskdefs/SignJarTest.java +++ b/src/tests/junit/org/apache/tools/ant/taskdefs/SignJarTest.java @@ -70,6 +70,17 @@ public class SignJarTest extends BuildFileTest { sj.isSigned()); } + public void testInvalidChars() { + executeTarget("invalidchars"); + SignJarChild sj = new SignJarChild(); + sj.setAlias("test@nly"); + sj.setKeystore("testkeystore"); + sj.setStorepass("apacheant"); + File jar = new File(getProject().getProperty("test.jar")); + sj.setJar(jar); + assertTrue(sj.isSigned()); + } + /** * subclass in order to get access to protected isSigned method if * tests and task come from different classloaders.