提交 82a84d63 编写于 作者: W weijun

6922482: keytool's help on -file always shows 'output file'

Reviewed-by: wetmore
上级 7c3e3144
/* /*
* Copyright 1997-2009 Sun Microsystems, Inc. All Rights Reserved. * Copyright 1997-2010 Sun Microsystems, Inc. All Rights Reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
...@@ -77,6 +77,7 @@ import sun.security.x509.*; ...@@ -77,6 +77,7 @@ import sun.security.x509.*;
import static java.security.KeyStore.*; import static java.security.KeyStore.*;
import static sun.security.tools.KeyTool.Command.*; import static sun.security.tools.KeyTool.Command.*;
import static sun.security.tools.KeyTool.Option.*;
/** /**
* This tool manages keystores. * This tool manages keystores.
...@@ -150,77 +151,77 @@ public final class KeyTool { ...@@ -150,77 +151,77 @@ public final class KeyTool {
enum Command { enum Command {
CERTREQ("Generates a certificate request", CERTREQ("Generates a certificate request",
"-alias", "-sigalg", "-file", "-keypass", "-keystore", ALIAS, SIGALG, FILEOUT, KEYPASS, KEYSTORE,
"-storepass", "-storetype", "-providername", "-providerclass", STOREPASS, STORETYPE, PROVIDERNAME, PROVIDERCLASS,
"-providerarg", "-providerpath", "-v", "-protected"), PROVIDERARG, PROVIDERPATH, V, PROTECTED),
CHANGEALIAS("Changes an entry's alias", CHANGEALIAS("Changes an entry's alias",
"-alias", "-destalias", "-keypass", "-keystore", "-storepass", ALIAS, DESTALIAS, KEYPASS, KEYSTORE, STOREPASS,
"-storetype", "-providername", "-providerclass", "-providerarg", STORETYPE, PROVIDERNAME, PROVIDERCLASS, PROVIDERARG,
"-providerpath", "-v", "-protected"), PROVIDERPATH, V, PROTECTED),
DELETE("Deletes an entry", DELETE("Deletes an entry",
"-alias", "-keystore", "-storepass", "-storetype", ALIAS, KEYSTORE, STOREPASS, STORETYPE,
"-providername", "-providerclass", "-providerarg", PROVIDERNAME, PROVIDERCLASS, PROVIDERARG,
"-providerpath", "-v", "-protected"), PROVIDERPATH, V, PROTECTED),
EXPORTCERT("Exports certificate", EXPORTCERT("Exports certificate",
"-rfc", "-alias", "-file", "-keystore", "-storepass", RFC, ALIAS, FILEOUT, KEYSTORE, STOREPASS,
"-storetype", "-providername", "-providerclass", "-providerarg", STORETYPE, PROVIDERNAME, PROVIDERCLASS, PROVIDERARG,
"-providerpath", "-v", "-protected"), PROVIDERPATH, V, PROTECTED),
GENKEYPAIR("Generates a key pair", GENKEYPAIR("Generates a key pair",
"-alias", "-keyalg", "-keysize", "-sigalg", "-destalias", ALIAS, KEYALG, KEYSIZE, SIGALG, DESTALIAS,
"-startdate", "-ext", "-validity", "-keypass", "-keystore", STARTDATE, EXT, VALIDITY, KEYPASS, KEYSTORE,
"-storepass", "-storetype", "-providername", "-providerclass", STOREPASS, STORETYPE, PROVIDERNAME, PROVIDERCLASS,
"-providerarg", "-providerpath", "-v", "-protected"), PROVIDERARG, PROVIDERPATH, V, PROTECTED),
GENSECKEY("Generates a secret key", GENSECKEY("Generates a secret key",
"-alias", "-keypass", "-keyalg", "-keysize", "-keystore", ALIAS, KEYPASS, KEYALG, KEYSIZE, KEYSTORE,
"-storepass", "-storetype", "-providername", "-providerclass", STOREPASS, STORETYPE, PROVIDERNAME, PROVIDERCLASS,
"-providerarg", "-providerpath", "-v", "-protected"), PROVIDERARG, PROVIDERPATH, V, PROTECTED),
GENCERT("Generates certificate from a certificate request", GENCERT("Generates certificate from a certificate request",
"-rfc", "-infile", "-outfile", "-alias", "-sigalg", RFC, INFILE, OUTFILE, ALIAS, SIGALG,
"-startdate", "-ext", "-validity", "-keypass", "-keystore", STARTDATE, EXT, VALIDITY, KEYPASS, KEYSTORE,
"-storepass", "-storetype", "-providername", "-providerclass", STOREPASS, STORETYPE, PROVIDERNAME, PROVIDERCLASS,
"-providerarg", "-providerpath", "-v", "-protected"), PROVIDERARG, PROVIDERPATH, V, PROTECTED),
IDENTITYDB("Imports entries from a JDK 1.1.x-style identity database", IDENTITYDB("Imports entries from a JDK 1.1.x-style identity database",
"-file", "-storetype", "-keystore", "-storepass", "-providername", FILEIN, STORETYPE, KEYSTORE, STOREPASS, PROVIDERNAME,
"-providerclass", "-providerarg", "-providerpath", "-v"), PROVIDERCLASS, PROVIDERARG, PROVIDERPATH, V),
IMPORTCERT("Imports a certificate or a certificate chain", IMPORTCERT("Imports a certificate or a certificate chain",
"-noprompt", "-trustcacerts", "-protected", "-alias", "-file", NOPROMPT, TRUSTCACERTS, PROTECTED, ALIAS, FILEIN,
"-keypass", "-keystore", "-storepass", "-storetype", KEYPASS, KEYSTORE, STOREPASS, STORETYPE,
"-providername", "-providerclass", "-providerarg", PROVIDERNAME, PROVIDERCLASS, PROVIDERARG,
"-providerpath", "-v"), PROVIDERPATH, V),
IMPORTKEYSTORE("Imports one or all entries from another keystore", IMPORTKEYSTORE("Imports one or all entries from another keystore",
"-srckeystore", "-destkeystore", "-srcstoretype", SRCKEYSTORE, DESTKEYSTORE, SRCSTORETYPE,
"-deststoretype", "-srcstorepass", "-deststorepass", DESTSTORETYPE, SRCSTOREPASS, DESTSTOREPASS,
"-srcprotected", "-srcprovidername", "-destprovidername", SRCPROTECTED, SRCPROVIDERNAME, DESTPROVIDERNAME,
"-srcalias", "-destalias", "-srckeypass", "-destkeypass", SRCALIAS, DESTALIAS, SRCKEYPASS, DESTKEYPASS,
"-noprompt", "-providerclass", "-providerarg", "-providerpath", NOPROMPT, PROVIDERCLASS, PROVIDERARG, PROVIDERPATH,
"-v"), V),
KEYCLONE("Clones a key entry", KEYCLONE("Clones a key entry",
"-alias", "-destalias", "-keypass", "-new", "-storetype", ALIAS, DESTALIAS, KEYPASS, NEW, STORETYPE,
"-keystore", "-storepass", "-providername", "-providerclass", KEYSTORE, STOREPASS, PROVIDERNAME, PROVIDERCLASS,
"-providerarg", "-providerpath", "-v"), PROVIDERARG, PROVIDERPATH, V),
KEYPASSWD("Changes the key password of an entry", KEYPASSWD("Changes the key password of an entry",
"-alias", "-keypass", "-new", "-keystore", "-storepass", ALIAS, KEYPASS, NEW, KEYSTORE, STOREPASS,
"-storetype", "-providername", "-providerclass", "-providerarg", STORETYPE, PROVIDERNAME, PROVIDERCLASS, PROVIDERARG,
"-providerpath", "-v"), PROVIDERPATH, V),
LIST("Lists entries in a keystore", LIST("Lists entries in a keystore",
"-rfc", "-alias", "-keystore", "-storepass", "-storetype", RFC, ALIAS, KEYSTORE, STOREPASS, STORETYPE,
"-providername", "-providerclass", "-providerarg", PROVIDERNAME, PROVIDERCLASS, PROVIDERARG,
"-providerpath", "-v", "-protected"), PROVIDERPATH, V, PROTECTED),
PRINTCERT("Prints the content of a certificate", PRINTCERT("Prints the content of a certificate",
"-rfc", "-file", "-sslserver", "-jarfile", "-v"), RFC, FILEIN, SSLSERVER, JARFILE, V),
PRINTCERTREQ("Prints the content of a certificate request", PRINTCERTREQ("Prints the content of a certificate request",
"-file", "-v"), FILEIN, V),
SELFCERT("Generates a self-signed certificate", SELFCERT("Generates a self-signed certificate",
"-alias", "-sigalg", "-dname", "-startdate", "-validity", "-keypass", ALIAS, SIGALG, DNAME, STARTDATE, VALIDITY, KEYPASS,
"-storetype", "-keystore", "-storepass", "-providername", STORETYPE, KEYSTORE, STOREPASS, PROVIDERNAME,
"-providerclass", "-providerarg", "-providerpath", "-v"), PROVIDERCLASS, PROVIDERARG, PROVIDERPATH, V),
STOREPASSWD("Changes the store password of a keystore", STOREPASSWD("Changes the store password of a keystore",
"-new", "-keystore", "-storepass", "-storetype", "-providername", NEW, KEYSTORE, STOREPASS, STORETYPE, PROVIDERNAME,
"-providerclass", "-providerarg", "-providerpath", "-v"); PROVIDERCLASS, PROVIDERARG, PROVIDERPATH, V);
final String description; final String description;
final String[] options; final Option[] options;
Command(String d, String... o) { Command(String d, Option... o) {
description = d; description = d;
options = o; options = o;
} }
...@@ -230,50 +231,60 @@ public final class KeyTool { ...@@ -230,50 +231,60 @@ public final class KeyTool {
} }
}; };
private static String[][] options = { enum Option {
// name, arg, description ALIAS("alias", "<alias>", "alias name of the entry to process"),
{"-alias", "<alias>", "alias name of the entry to process"}, DESTALIAS("destalias", "<destalias>", "destination alias"),
{"-destalias", "<destalias>", "destination alias"}, DESTKEYPASS("destkeypass", "<arg>", "destination key password"),
{"-destkeypass", "<arg>", "destination key password"}, DESTKEYSTORE("destkeystore", "<destkeystore>", "destination keystore name"),
{"-destkeystore", "<destkeystore>", "destination keystore name"}, DESTPROTECTED("destprotected", null, "destination keystore password protected"),
{"-destprotected", null, "destination keystore password protected"}, DESTPROVIDERNAME("destprovidername", "<destprovidername>", "destination keystore provider name"),
{"-destprovidername", "<destprovidername>", "destination keystore provider name"}, DESTSTOREPASS("deststorepass", "<arg>", "destination keystore password"),
{"-deststorepass", "<arg>", "destination keystore password"}, DESTSTORETYPE("deststoretype", "<deststoretype>", "destination keystore type"),
{"-deststoretype", "<deststoretype>", "destination keystore type"}, DNAME("dname", "<dname>", "distinguished name"),
{"-dname", "<dname>", "distinguished name"}, EXT("ext", "<value>", "X.509 extension"),
{"-ext", "<value>", "X.509 extension"}, FILEOUT("file", "<filename>", "output file name"),
{"-file", "<filename>", "output file name"}, FILEIN("file", "<filename>", "input file name"),
{"-file", "<filename>", "input file name"}, INFILE("infile", "<filename>", "input file name"),
{"-infile", "<filename>", "input file name"}, KEYALG("keyalg", "<keyalg>", "key algorithm name"),
{"-keyalg", "<keyalg>", "key algorithm name"}, KEYPASS("keypass", "<arg>", "key password"),
{"-keypass", "<arg>", "key password"}, KEYSIZE("keysize", "<keysize>", "key bit size"),
{"-keysize", "<keysize>", "key bit size"}, KEYSTORE("keystore", "<keystore>", "keystore name"),
{"-keystore", "<keystore>", "keystore name"}, NEW("new", "<arg>", "new password"),
{"-new", "<arg>", "new password"}, NOPROMPT("noprompt", null, "do not prompt"),
{"-noprompt", null, "do not prompt"}, OUTFILE("outfile", "<filename>", "output file name"),
{"-outfile", "<filename>", "output file name"}, PROTECTED("protected", null, "password through protected mechanism"),
{"-protected", null, "password through protected mechanism"}, PROVIDERARG("providerarg", "<arg>", "provider argument"),
{"-providerarg", "<arg>", "provider argument"}, PROVIDERCLASS("providerclass", "<providerclass>", "provider class name"),
{"-providerclass", "<providerclass>", "provider class name"}, PROVIDERNAME("providername", "<providername>", "provider name"),
{"-providername", "<providername>", "provider name"}, PROVIDERPATH("providerpath", "<pathlist>", "provider classpath"),
{"-providerpath", "<pathlist>", "provider classpath"}, RFC("rfc", null, "output in RFC style"),
{"-rfc", null, "output in RFC style"}, SIGALG("sigalg", "<sigalg>", "signature algorithm name"),
{"-sigalg", "<sigalg>", "signature algorithm name"}, SRCALIAS("srcalias", "<srcalias>", "source alias"),
{"-srcalias", "<srcalias>", "source alias"}, SRCKEYPASS("srckeypass", "<arg>", "source keystore password"),
{"-srckeypass", "<arg>", "source keystore password"}, SRCKEYSTORE("srckeystore", "<srckeystore>", "source keystore name"),
{"-srckeystore", "<srckeystore>", "source keystore name"}, SRCPROTECTED("srcprotected", null, "source keystore password protected"),
{"-srcprotected", null, "source keystore password protected"}, SRCPROVIDERNAME("srcprovidername", "<srcprovidername>", "source keystore provider name"),
{"-srcprovidername", "<srcprovidername>", "source keystore provider name"}, SRCSTOREPASS("srcstorepass", "<arg>", "source keystore password"),
{"-srcstorepass", "<arg>", "source keystore password"}, SRCSTORETYPE("srcstoretype", "<srcstoretype>", "source keystore type"),
{"-srcstoretype", "<srcstoretype>", "source keystore type"}, SSLSERVER("sslserver", "<server[:port]>", "SSL server host and port"),
{"-sslserver", "<server[:port]>", "SSL server host and port"}, JARFILE("jarfile", "<filename>", "signed jar file"),
{"-jarfile", "<filename>", "signed jar file"}, STARTDATE("startdate", "<startdate>", "certificate validity start date/time"),
{"-startdate", "<startdate>", "certificate validity start date/time"}, STOREPASS("storepass", "<arg>", "keystore password"),
{"-storepass", "<arg>", "keystore password"}, STORETYPE("storetype", "<storetype>", "keystore type"),
{"-storetype", "<storetype>", "keystore type"}, TRUSTCACERTS("trustcacerts", null, "trust certificates from cacerts"),
{"-trustcacerts", null, "trust certificates from cacerts"}, V("v", null, "verbose output"),
{"-v", null, "verbose output"}, VALIDITY("validity", "<valDays>", "validity number of days");
{"-validity", "<valDays>", "validity number of days"},
final String name, arg, description;
Option(String name, String arg, String description) {
this.name = name;
this.arg = arg;
this.description = description;
}
@Override
public String toString() {
return "-" + name;
}
}; };
private static final Class[] PARAM_STRING = { String.class }; private static final Class[] PARAM_STRING = { String.class };
...@@ -344,10 +355,10 @@ public final class KeyTool { ...@@ -344,10 +355,10 @@ public final class KeyTool {
// Check if the last option needs an arg // Check if the last option needs an arg
if (i == args.length - 1) { if (i == args.length - 1) {
for (String[] option: options) { for (Option option: Option.values()) {
// Only options with an arg need to be checked // Only options with an arg need to be checked
if (collator.compare(flags, option[0]) == 0) { if (collator.compare(flags, option.toString()) == 0) {
if (option[1] != null) errorNeedArgument(flags); if (option.arg != null) errorNeedArgument(flags);
break; break;
} }
} }
...@@ -3792,21 +3803,13 @@ public final class KeyTool { ...@@ -3792,21 +3803,13 @@ public final class KeyTool {
// Length of left side of options list // Length of left side of options list
int lenLeft = 0; int lenLeft = 0;
for (int j=0; j<left.length; j++) { for (int j=0; j<left.length; j++) {
for (String[] opt: options) { Option opt = command.options[j];
if (collator.compare(opt[0], command.options[j]) == 0) { left[j] = opt.toString();
left[j] = opt[0]; if (opt.arg != null) left[j] += " " + opt.arg;
if (opt[1] != null) left[j] += " " + opt[1]; if (left[j].length() > lenLeft) {
if (left[j].length() > lenLeft) { lenLeft = left[j].length();
lenLeft = left[j].length();
}
right[j] = rb.getString(opt[2]);
found = true;
break;
}
}
if (!found) {
throw new RuntimeException("ERROR: CANNOT FIND " + command.options[j]);
} }
right[j] = rb.getString(opt.description);
} }
for (int j=0; j<left.length; j++) { for (int j=0; j<left.length; j++) {
System.err.printf(" %-" + lenLeft + "s %s\n", System.err.printf(" %-" + lenLeft + "s %s\n",
......
#
# Copyright 2010 Sun Microsystems, Inc. All Rights Reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation.
#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
#
# Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
# CA 95054 USA or visit www.sun.com if you need additional information or
# have any questions.
#
# @test
# @bug 6922482
# @summary keytool's help on -file always shows 'output file'
#
if [ "${TESTJAVA}" = "" ] ; then
JAVAC_CMD=`which javac`
TESTJAVA=`dirname $JAVAC_CMD`/..
fi
# set platform-dependent variables
OS=`uname -s`
case "$OS" in
Windows_* )
FS="\\"
;;
* )
FS="/"
;;
esac
LANG=C
$TESTJAVA${FS}bin${FS}keytool -printcertreq -help 2> h1 || exit 1
$TESTJAVA${FS}bin${FS}keytool -exportcert -help 2> h2 || exit 2
grep "input file" h1 || exit 3
grep "output file" h2 || exit 4
exit 0
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册