# test mod_md acme terms-of-service handling from shutil import copyfile import pytest from .md_env import MDTestEnv @pytest.mark.skipif(condition=not MDTestEnv.has_a2md(), reason="no a2md available") @pytest.mark.skipif(condition=not MDTestEnv.has_acme_server(), reason="no ACME test server configured") class TestRegAdd: @pytest.fixture(autouse=True, scope='function') def _method_scope(self, env): env.clear_store() # test case: list empty store def test_md_120_000(self, env): assert env.a2md(["list"]).json == env.EMPTY_JOUT # test case: list two managed domains def test_md_120_001(self, env): domains = [ ["test120-001.com", "test120-001a.com", "test120-001b.com"], ["greenbytes2.de", "www.greenbytes2.de", "mail.greenbytes2.de"] ] for dns in domains: assert env.a2md(["add"] + dns).exit_code == 0 # # list all store content jout = env.a2md(["list"]).json assert len(jout['output']) == len(domains) domains.reverse() for i in range(0, len(jout['output'])): env.check_json_contains(jout['output'][i], { "name": domains[i][0], "domains": domains[i], "contacts": [], "ca": { "urls": [env.acme_url], "proto": "ACME" }, "state": env.MD_S_INCOMPLETE }) # list md by name for dns in ["test120-001.com", "greenbytes2.de"]: md = env.a2md(["list", dns]).json['output'][0] assert md['name'] == dns # test case: validate md state in store def test_md_120_002(self, env): # check: md without pkey/cert -> INCOMPLETE domain = f"test1.{env.http_tld}" assert env.a2md(["add", domain]).exit_code == 0 assert env.a2md(["update", domain, "contacts", "admin@" + domain]).exit_code == 0 assert env.a2md(["update", domain, "agreement", env.acme_tos]).exit_code == 0 assert env.a2md(["list", domain]).json['output'][0]['state'] == env.MD_S_INCOMPLETE # check: valid pkey/cert -> COMPLETE cred = env.get_credentials_for_name(domain)[0] copyfile(cred.pkey_file, env.store_domain_file(domain, 'privkey.pem')) copyfile(cred.cert_file, env.store_domain_file(domain, 'pubcert.pem')) assert env.a2md(["list", domain]).json['output'][0]['state'] == env.MD_S_COMPLETE # check: expired cert -> EXPIRED cred = env.get_credentials_for_name(f"expired.{env.http_tld}")[0] copyfile(cred.pkey_file, env.store_domain_file(domain, 'privkey.pem')) copyfile(cred.cert_file, env.store_domain_file(domain, 'pubcert.pem')) out = env.a2md(["list", domain]).json['output'][0] assert out['state'] == env.MD_S_INCOMPLETE assert out['renew'] is True # test case: broken cert file def test_md_120_003(self, env): domain = f"test1.{env.http_tld}" assert env.a2md(["add", domain]).exit_code == 0 assert env.a2md(["update", domain, "contacts", "admin@" + domain]).exit_code == 0 assert env.a2md(["update", domain, "agreement", env.acme_tos]).exit_code == 0 # check: valid pkey/cert -> COMPLETE cred = env.get_credentials_for_name(domain)[0] copyfile(cred.pkey_file, env.store_domain_file(domain, 'privkey.pem')) copyfile(cred.cert_file, env.store_domain_file(domain, 'pubcert.pem')) assert env.a2md(["list", domain]).json['output'][0]['state'] == env.MD_S_COMPLETE # check: replace cert by broken file -> ERROR with open(env.store_domain_file(domain, 'pubcert.pem'), 'w') as fd: fd.write("dummy\n") assert env.a2md(["list", domain]).json['output'][0]['state'] == env.MD_S_INCOMPLETE