| import datetime | |
| import email.utils | |
| import os | |
| from datetime import timedelta | |
| import pytest | |
| from pyhttpd.depends import needs_dependency | |
| from pyhttpd.certs import CertificateSpec | |
| from pyhttpd.env import HttpdTestEnv | |
| from .md_cert_util import MDCertUtil | |
| from .md_env import MDTestEnv | |
| from .md_conf import MDConf | |
| @needs_dependency("ACME test server", MDTestEnv.has_acme_server(), | |
| reason="no ACME test server configured", | |
| detected=f"ACME={MDTestEnv.get_acme_server()}") | |
| class TestProfiles: | |
| @pytest.fixture(autouse=True, scope='class') | |
| def _class_scope(self, env, acme): | |
| env.APACHE_CONF_SRC = "data/test_auto" | |
| acme.start(config='default') | |
| env.check_acme() | |
| env.clear_store() | |
| MDConf(env).install() | |
| assert env.apache_restart() == 0, f'{env.apachectl_stderr}' | |
| @pytest.fixture(autouse=True, scope='function') | |
| def _method_scope(self, env, request): | |
| env.clear_store() | |
| self.test_domain = env.get_request_domain(request) | |
| def _write_res_file(self, doc_root, name, content): | |
| if not os.path.exists(doc_root): | |
| os.makedirs(doc_root) | |
| open(os.path.join(doc_root, name), "w").write(content) | |
| # create a MD with 'default' profile, get cert | |
| def test_md_710_001(self, env): | |
| domain = self.test_domain | |
| # generate config with one MD | |
| domains = [domain, "www." + domain] | |
| conf = MDConf(env, admin="admin@" + domain) | |
| conf.add_drive_mode("auto") | |
| conf.start_md(domains) | |
| conf.add(f' MDProfile default') | |
| conf.end_md() | |
| conf.add_vhost(domains) | |
| conf.install() | |
| # | |
| assert env.apache_restart() == 0, f'{env.apachectl_stderr}' | |
| assert env.await_completion(domains) | |
| stat = env.get_md_status(domain) | |
| assert stat["watched"] == 1 | |
| assert stat["profile"] == "default", f'{stat}' | |
| assert stat['cert']['rsa']['valid']['until'], f'{stat}' | |
| ts = email.utils.parsedate_to_datetime(stat['cert']['rsa']['valid']['until']) | |
| valid = ts - datetime.datetime.now(datetime.timezone.utc) | |
| assert valid.days in [89, 90] | |
| # create a MD with 'shortlived' profile, get cert | |
| def test_md_710_002(self, env): | |
| domain = self.test_domain | |
| # generate config with one MD | |
| domains = [domain, "www." + domain] | |
| conf = MDConf(env, admin="admin@" + domain) | |
| conf.add_drive_mode("auto") | |
| conf.start_md(domains) | |
| conf.add(f' MDProfile shortlived') | |
| conf.add(f' MDProfileMandatory on') | |
| conf.end_md() | |
| conf.add_vhost(domains) | |
| conf.install() | |
| # | |
| assert env.apache_restart() == 0, f'{env.apachectl_stderr}' | |
| assert env.await_completion(domains) | |
| stat = env.get_md_status(domain) | |
| assert stat["watched"] == 1 | |
| assert stat["profile"] == "shortlived", f'{stat}' | |
| assert stat['cert']['rsa']['valid']['until'], f'{stat}' | |
| ts = email.utils.parsedate_to_datetime(stat['cert']['rsa']['valid']['until']) | |
| valid = ts - datetime.datetime.now(datetime.timezone.utc) | |
| assert valid.days in [5, 6] | |
| # create a MD with unknown 'XXX' profile, get cert | |
| def test_md_710_003(self, env): | |
| domain = self.test_domain | |
| # generate config with one MD | |
| domains = [domain, "www." + domain] | |
| conf = MDConf(env, admin="admin@" + domain) | |
| conf.add_drive_mode("auto") | |
| conf.start_md(domains) | |
| conf.add(f' MDProfile XXX') | |
| conf.end_md() | |
| conf.add_vhost(domains) | |
| conf.install() | |
| # | |
| assert env.apache_restart() == 0, f'{env.apachectl_stderr}' | |
| assert env.await_completion(domains) | |
| stat = env.get_md_status(domain) | |
| assert stat["watched"] == 1 | |
| assert stat["profile"] == "XXX", f'{stat}' | |
| # create a MD with unknown 'XXX' profile, mandatory, fail | |
| def test_md_710_004(self, env): | |
| domain = self.test_domain | |
| # generate config with one MD | |
| domains = [domain, "www." + domain] | |
| conf = MDConf(env, admin="admin@" + domain) | |
| conf.add_drive_mode("auto") | |
| conf.start_md(domains) | |
| conf.add(f' MDProfile XXX') | |
| conf.add(f' MDProfileMandatory on') | |
| conf.end_md() | |
| conf.add_vhost(domains) | |
| conf.install() | |
| # | |
| assert env.apache_restart() == 0, f'{env.apachectl_stderr}' | |
| assert env.await_error(domain) | |
| stat = env.get_md_status(domain) | |
| assert stat["watched"] == 1 | |
| assert stat["profile"] == "XXX", f'{stat}' | |
| assert len(stat['cert']) == 0, f'{stat}' | |
| assert stat['renewal']['errors'] > 0, f'{stat}' | |
| assert stat['renewal']['last']['activity'] == 'Creating new order, key-spec=default, profile=XXX, replacing-cert=none', f'{stat}' | |
| MDConf(env).install() | |
| assert env.apache_restart() == 0, f'{env.apachectl_stderr}' | |
| env.httpd_error_log.ignore_recent(matches=[ | |
| r'.*mandatory ACME profile \'XXX\' is not offered by CA.*', | |
| ], lognos=[ | |
| "AH10056" # processing failed | |
| ]) |