| import os | |
| from .md_env import MDTestEnv | |
| from pyhttpd.conf import HttpdConf | |
| class MDConf(HttpdConf): | |
| def __init__(self, env: MDTestEnv, text=None, std_ports=True, | |
| local_ca=True, std_vhosts=True, proxy=False, | |
| admin=None, no_renewal=False): | |
| super().__init__(env=env) | |
| if admin is None: | |
| admin = f"admin@{env.http_tld}" | |
| if len(admin.strip()): | |
| self.add_admin(admin) | |
| self.add([ | |
| "MDRetryDelay 1s", # speed up testing a little | |
| "MDRenewViaARI off", # not on, logs unwanted errors when test | |
| # acme server is not responding | |
| ]) | |
| if local_ca: | |
| self.add([ | |
| f"MDCertificateAuthority {env.acme_url}", | |
| f"MDCertificateAgreement accepted", | |
| f"MDCACertificateFile {env.server_dir}/acme-ca.pem", | |
| "", | |
| ]) | |
| if no_renewal: | |
| # A renewal still running when the server stops delays the stop, | |
| # which httpd logs as a warning. A failing handler vetoes it. | |
| cmd = os.path.join(env.test_dir, "../modules/md/msg_fail_on.py") | |
| self.add(f"MDMessageCmd {cmd} {env.gen_dir}/message.log renewing") | |
| if std_ports: | |
| self.add(f"MDPortMap 80:{env.http_port} 443:{env.https_port}") | |
| if env.ssl_module == "mod_tls": | |
| self.add(f"TLSListen {env.https_port}") | |
| self.add([ | |
| "<Location /server-status>", | |
| " SetHandler server-status", | |
| "</Location>", | |
| "<Location /md-status>", | |
| " SetHandler md-status", | |
| "</Location>", | |
| ]) | |
| if std_vhosts: | |
| self.add_vhost_test1() | |
| if proxy: | |
| self.add([ | |
| f"Listen {self.env.proxy_port}", | |
| f"<VirtualHost *:{self.env.proxy_port}>", | |
| " ProxyRequests On", | |
| " ProxyVia On", | |
| " # be totally open", | |
| " AllowCONNECT 0-65535", | |
| " <Proxy *>", | |
| " # No require or other restrictions, this is just a test server", | |
| " </Proxy>", | |
| "</VirtualHost>", | |
| ]) | |
| if text is not None: | |
| self.add(text) | |
| def add_drive_mode(self, mode): | |
| self.add("MDRenewMode \"%s\"\n" % mode) | |
| def add_renew_window(self, window): | |
| self.add("MDRenewWindow %s\n" % window) | |
| def add_private_key(self, key_type, key_params): | |
| self.add("MDPrivateKeys %s %s\n" % (key_type, " ".join(map(lambda p: str(p), key_params)))) | |
| def add_admin(self, email): | |
| self.add(f"ServerAdmin mailto:{email}") | |
| def add_md(self, domains): | |
| dlist = " ".join(domains) # without quotes | |
| self.add(f"MDomain {dlist}\n") | |
| def start_md(self, domains): | |
| dlist = " ".join([f"\"{d}\"" for d in domains]) # with quotes, #257 | |
| self.add(f"<MDomain {dlist}>\n") | |
| def end_md(self): | |
| self.add("</MDomain>\n") | |
| def start_md2(self, domains): | |
| self.add("<MDomainSet %s>\n" % " ".join(domains)) | |
| def end_md2(self): | |
| self.add("</MDomainSet>\n") |