コード例 #1
0
ファイル: main.py プロジェクト: yeruicsy/certbot
def install(config, plugins):
    """Install a previously obtained cert in a server.

    :param config: Configuration object
    :type config: interfaces.IConfig

    :param plugins: List of plugins
    :type plugins: `list` of `str`

    :returns: `None`
    :rtype: None

    """
    # XXX: Update for renewer/RenewableCert
    # FIXME: be consistent about whether errors are raised or returned from
    # this function ...

    try:
        installer, _ = plug_sel.choose_configurator_plugins(config, plugins, "install")
    except errors.PluginSelectionError as e:
        return str(e)

    custom_cert = (config.key_path and config.cert_path)
    if not config.certname and not custom_cert:
        certname_question = "Which certificate would you like to install?"
        config.certname = cert_manager.get_certnames(
            config, "install", allow_multiple=False,
            custom_prompt=certname_question)[0]

    if not enhancements.are_supported(config, installer):
        raise errors.NotSupportedError("One ore more of the requested enhancements "
                                       "are not supported by the selected installer")
    # If cert-path is defined, populate missing (ie. not overridden) values.
    # Unfortunately this can't be done in argument parser, as certificate
    # manager needs the access to renewal directory paths
    if config.certname:
        config = _populate_from_certname(config)
    elif enhancements.are_requested(config):
        # Preflight config check
        raise errors.ConfigurationError("One or more of the requested enhancements "
                                        "require --cert-name to be provided")

    if config.key_path and config.cert_path:
        _check_certificate_and_key(config)
        domains, _ = _find_domains_or_certname(config, installer)
        le_client = _init_le_client(config, authenticator=None, installer=installer)
        _install_cert(config, le_client, domains)
    else:
        raise errors.ConfigurationError("Path to certificate or key was not defined. "
            "If your certificate is managed by Certbot, please use --cert-name "
            "to define which certificate you would like to install.")

    if enhancements.are_requested(config):
        # In the case where we don't have certname, we have errored out already
        lineage = cert_manager.lineage_for_certname(config, config.certname)
        enhancements.enable(lineage, domains, installer, config)

    return None
コード例 #2
0
ファイル: main.py プロジェクト: yeruicsy/certbot
def enhance(config, plugins):
    """Add security enhancements to existing configuration

    :param config: Configuration object
    :type config: interfaces.IConfig

    :param plugins: List of plugins
    :type plugins: `list` of `str`

    :returns: `None`
    :rtype: None

    """
    supported_enhancements = ["hsts", "redirect", "uir", "staple"]
    # Check that at least one enhancement was requested on command line
    oldstyle_enh = any(getattr(config, enh) for enh in supported_enhancements)
    if not enhancements.are_requested(config) and not oldstyle_enh:
        msg = ("Please specify one or more enhancement types to configure. To list "
               "the available enhancement types, run:\n\n%s --help enhance\n")
        logger.warning(msg, sys.argv[0])
        raise errors.MisconfigurationError("No enhancements requested, exiting.")

    try:
        installer, _ = plug_sel.choose_configurator_plugins(config, plugins, "enhance")
    except errors.PluginSelectionError as e:
        return str(e)

    if not enhancements.are_supported(config, installer):
        raise errors.NotSupportedError("One ore more of the requested enhancements "
                                       "are not supported by the selected installer")

    certname_question = ("Which certificate would you like to use to enhance "
                         "your configuration?")
    config.certname = cert_manager.get_certnames(
        config, "enhance", allow_multiple=False,
        custom_prompt=certname_question)[0]
    cert_domains = cert_manager.domains_for_certname(config, config.certname)
    if config.noninteractive_mode:
        domains = cert_domains
    else:
        domain_question = ("Which domain names would you like to enable the "
                           "selected enhancements for?")
        domains = display_ops.choose_values(cert_domains, domain_question)
        if not domains:
            raise errors.Error("User cancelled the domain selection. No domains "
                               "defined, exiting.")

    lineage = cert_manager.lineage_for_certname(config, config.certname)
    if not config.chain_path:
        config.chain_path = lineage.chain_path
    if oldstyle_enh:
        le_client = _init_le_client(config, authenticator=None, installer=installer)
        le_client.enhance_config(domains, config.chain_path, redirect_default=False)
    if enhancements.are_requested(config):
        enhancements.enable(lineage, domains, installer, config)

    return None
コード例 #3
0
ファイル: cert_manager_test.py プロジェクト: uzunnet/certbot
 def test_get_certnames(self, mock_name, mock_files):
     mock_files.return_value = ['example.com.conf']
     mock_name.return_value = 'example.com'
     from certbot._internal import cert_manager
     prompt = "Which certificate would you"
     self.mock_get_utility().menu.return_value = (display_util.OK, 0)
     self.assertEqual(
         cert_manager.get_certnames(
             self.config, "verb", allow_multiple=False), ['example.com'])
     self.assertIn(prompt, self.mock_get_utility().menu.call_args[0][0])
コード例 #4
0
 def test_get_certnames_custom_prompt(self, mock_name, mock_files):
     mock_files.return_value = ['example.com.conf']
     mock_name.return_value = 'example.com'
     from certbot._internal import cert_manager
     prompt = "custom prompt"
     self.mock_get_utility().menu.return_value = (display_util.OK, 0)
     self.assertEqual(
         cert_manager.get_certnames(self.config,
                                    "verb",
                                    allow_multiple=False,
                                    custom_prompt=prompt), ['example.com'])
     self.assertEqual(self.mock_get_utility().menu.call_args[0][0], prompt)
コード例 #5
0
 def test_get_certnames_allow_multiple(self, mock_name, mock_files):
     mock_files.return_value = ['example.com.conf']
     mock_name.return_value = 'example.com'
     from certbot._internal import cert_manager
     prompt = "Which certificate(s) would you"
     self.mock_get_utility().checklist.return_value = (display_util.OK,
                                                       ['example.com'])
     self.assertEqual(
         cert_manager.get_certnames(
             self.config, "verb", allow_multiple=True), ['example.com'])
     self.assertTrue(
         prompt in self.mock_get_utility().checklist.call_args[0][0])