From 45d20847e64c80e81f14c5f239ec57c095ad7202 Mon Sep 17 00:00:00 2001 From: Peter Eckersley Date: Wed, 9 Dec 2015 18:21:27 -0800 Subject: [PATCH 1/3] Implement --staging - Fixes #1667 - Should help with rate limit problems --- letsencrypt/cli.py | 13 +++++++++++++ letsencrypt/tests/cli_test.py | 14 ++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/letsencrypt/cli.py b/letsencrypt/cli.py index 348818368..f57b1eb0b 100644 --- a/letsencrypt/cli.py +++ b/letsencrypt/cli.py @@ -696,6 +696,15 @@ class HelpfulArgumentParser(object): parsed_args = self.parser.parse_args(self.args) parsed_args.func = self.VERBS[self.verb] + # Do any post-parsing homework here + + # argparse seemingly isn't flexible enough to give us this behaviour easily... + staging_uri = 'https://acme-staging.api.letsencrypt.org/directory' + if parsed_args.staging: + if parsed_args.server not in (flag_default("server"), staging_uri): + raise errors.Error("--server value conflicts with --staging") + parsed_args.server = staging_uri + return parsed_args @@ -1037,6 +1046,10 @@ def _paths_parser(helpful): help="Logs directory.") add("paths", "--server", default=flag_default("server"), help=config_help("server")) + # overwrites server, handled in HelpfulArgumentParser.parse_args() + add("testing", "--staging", action='store_true', + help='Use the staging server to obtain test (invalid) certs; equivalent' + ' to --server https://acme-staging.api.letsencrypt.org/directory ') def _plugins_parsing(helpful, plugins): diff --git a/letsencrypt/tests/cli_test.py b/letsencrypt/tests/cli_test.py index 462d37a87..60a8e9440 100644 --- a/letsencrypt/tests/cli_test.py +++ b/letsencrypt/tests/cli_test.py @@ -343,6 +343,20 @@ class CLITest(unittest.TestCase): # pylint: disable=too-many-public-methods namespace = cli.prepare_and_parse_args(plugins, long_args) self.assertEqual(namespace.domains, ['example.com', 'another.net']) + def test_parse_server(self): + plugins = disco.PluginsRegistry.find_all() + short_args = ['--server', 'example.com'] + namespace = cli.prepare_and_parse_args(plugins, short_args) + self.assertEqual(namespace.server, 'example.com') + + short_args = ['--staging'] + namespace = cli.prepare_and_parse_args(plugins, short_args) + self.assertEqual(namespace.server, + 'https://acme-staging.api.letsencrypt.org/directory') + + short_args = ['--staging', '--server', 'example.com'] + self.assertRaises(errors.Error, cli.prepare_and_parse_args, plugins, short_args) + def test_parse_webroot(self): plugins = disco.PluginsRegistry.find_all() webroot_args = ['--webroot', '-w', '/var/www/example', From 3b5810995ddc161c5263cd77d044d2a0be14b5c2 Mon Sep 17 00:00:00 2001 From: Peter Eckersley Date: Thu, 10 Dec 2015 14:11:26 -0800 Subject: [PATCH 2/3] The flag name --test-cert may make sense to most people --- letsencrypt/cli.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/letsencrypt/cli.py b/letsencrypt/cli.py index f57b1eb0b..16283a84a 100644 --- a/letsencrypt/cli.py +++ b/letsencrypt/cli.py @@ -1047,7 +1047,7 @@ def _paths_parser(helpful): add("paths", "--server", default=flag_default("server"), help=config_help("server")) # overwrites server, handled in HelpfulArgumentParser.parse_args() - add("testing", "--staging", action='store_true', + add("testing", "--test-cert", "--staging", action='store_true', dest='staging', help='Use the staging server to obtain test (invalid) certs; equivalent' ' to --server https://acme-staging.api.letsencrypt.org/directory ') From 88956dfba8f5109c5b168b3207b72db9d4ae4e4a Mon Sep 17 00:00:00 2001 From: Peter Eckersley Date: Thu, 10 Dec 2015 19:37:22 -0800 Subject: [PATCH 3/3] Move staging URI into constants.py --- letsencrypt/cli.py | 7 +++---- letsencrypt/constants.py | 3 ++- letsencrypt/tests/cli_test.py | 4 ++-- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/letsencrypt/cli.py b/letsencrypt/cli.py index 16283a84a..5be3c1696 100644 --- a/letsencrypt/cli.py +++ b/letsencrypt/cli.py @@ -699,11 +699,10 @@ class HelpfulArgumentParser(object): # Do any post-parsing homework here # argparse seemingly isn't flexible enough to give us this behaviour easily... - staging_uri = 'https://acme-staging.api.letsencrypt.org/directory' if parsed_args.staging: - if parsed_args.server not in (flag_default("server"), staging_uri): + if parsed_args.server not in (flag_default("server"), constants.STAGING_URI): raise errors.Error("--server value conflicts with --staging") - parsed_args.server = staging_uri + parsed_args.server = constants.STAGING_URI return parsed_args @@ -1049,7 +1048,7 @@ def _paths_parser(helpful): # overwrites server, handled in HelpfulArgumentParser.parse_args() add("testing", "--test-cert", "--staging", action='store_true', dest='staging', help='Use the staging server to obtain test (invalid) certs; equivalent' - ' to --server https://acme-staging.api.letsencrypt.org/directory ') + ' to --server ' + constants.STAGING_URI) def _plugins_parsing(helpful, plugins): diff --git a/letsencrypt/constants.py b/letsencrypt/constants.py index 40155abd7..a1dccd1ea 100644 --- a/letsencrypt/constants.py +++ b/letsencrypt/constants.py @@ -30,8 +30,9 @@ CLI_DEFAULTS = dict( auth_chain_path="./chain.pem", strict_permissions=False, ) -"""Defaults for CLI flags and `.IConfig` attributes.""" +STAGING_URI = "https://acme-staging.api.letsencrypt.org/directory" +"""Defaults for CLI flags and `.IConfig` attributes.""" RENEWER_DEFAULTS = dict( renewer_enabled="yes", diff --git a/letsencrypt/tests/cli_test.py b/letsencrypt/tests/cli_test.py index 60a8e9440..e7ae5de23 100644 --- a/letsencrypt/tests/cli_test.py +++ b/letsencrypt/tests/cli_test.py @@ -15,6 +15,7 @@ from acme import jose from letsencrypt import account from letsencrypt import cli from letsencrypt import configuration +from letsencrypt import constants from letsencrypt import crypto_util from letsencrypt import errors from letsencrypt import le_util @@ -351,8 +352,7 @@ class CLITest(unittest.TestCase): # pylint: disable=too-many-public-methods short_args = ['--staging'] namespace = cli.prepare_and_parse_args(plugins, short_args) - self.assertEqual(namespace.server, - 'https://acme-staging.api.letsencrypt.org/directory') + self.assertEqual(namespace.server, constants.STAGING_URI) short_args = ['--staging', '--server', 'example.com'] self.assertRaises(errors.Error, cli.prepare_and_parse_args, plugins, short_args)