Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/certbot/certbot.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'certbot-apache')
-rw-r--r--certbot-apache/MANIFEST.in10
-rw-r--r--certbot-apache/certbot_apache/_internal/__init__.py1
-rw-r--r--certbot-apache/certbot_apache/_internal/apache_util.py (renamed from certbot-apache/certbot_apache/apache_util.py)3
-rw-r--r--certbot-apache/certbot_apache/_internal/augeas_lens/README (renamed from certbot-apache/certbot_apache/augeas_lens/README)0
-rw-r--r--certbot-apache/certbot_apache/_internal/augeas_lens/httpd.aug (renamed from certbot-apache/certbot_apache/augeas_lens/httpd.aug)0
-rw-r--r--certbot-apache/certbot_apache/_internal/configurator.py (renamed from certbot-apache/certbot_apache/configurator.py)392
-rw-r--r--certbot-apache/certbot_apache/_internal/constants.py (renamed from certbot-apache/certbot_apache/constants.py)10
-rw-r--r--certbot-apache/certbot_apache/_internal/display_ops.py (renamed from certbot-apache/certbot_apache/display_ops.py)13
-rw-r--r--certbot-apache/certbot_apache/_internal/entrypoint.py (renamed from certbot-apache/certbot_apache/entrypoint.py)42
-rw-r--r--certbot-apache/certbot_apache/_internal/http_01.py (renamed from certbot-apache/certbot_apache/http_01.py)62
-rw-r--r--certbot-apache/certbot_apache/_internal/obj.py (renamed from certbot-apache/certbot_apache/obj.py)12
-rw-r--r--certbot-apache/certbot_apache/_internal/options-ssl-apache.conf18
-rw-r--r--certbot-apache/certbot_apache/_internal/override_arch.py (renamed from certbot-apache/certbot_apache/override_arch.py)6
-rw-r--r--certbot-apache/certbot_apache/_internal/override_centos.py215
-rw-r--r--certbot-apache/certbot_apache/_internal/override_darwin.py (renamed from certbot-apache/certbot_apache/override_darwin.py)6
-rw-r--r--certbot-apache/certbot_apache/_internal/override_debian.py (renamed from certbot-apache/certbot_apache/override_debian.py)40
-rw-r--r--certbot-apache/certbot_apache/_internal/override_fedora.py98
-rw-r--r--certbot-apache/certbot_apache/_internal/override_gentoo.py (renamed from certbot-apache/certbot_apache/override_gentoo.py)14
-rw-r--r--certbot-apache/certbot_apache/_internal/override_suse.py (renamed from certbot-apache/certbot_apache/override_suse.py)6
-rw-r--r--certbot-apache/certbot_apache/_internal/parser.py (renamed from certbot-apache/certbot_apache/parser.py)268
-rw-r--r--certbot-apache/certbot_apache/augeas_configurator.py207
-rw-r--r--certbot-apache/certbot_apache/centos-options-ssl-apache.conf25
-rw-r--r--certbot-apache/certbot_apache/options-ssl-apache.conf26
-rw-r--r--certbot-apache/certbot_apache/override_centos.py68
-rw-r--r--certbot-apache/certbot_apache/tests/__init__.py1
-rw-r--r--certbot-apache/certbot_apache/tests/tls_sni_01_test.py151
-rw-r--r--certbot-apache/certbot_apache/tls_sni_01.py174
-rw-r--r--certbot-apache/docs/.gitignore1
-rw-r--r--certbot-apache/docs/Makefile192
-rw-r--r--certbot-apache/docs/_static/.gitignore0
-rw-r--r--certbot-apache/docs/_templates/.gitignore0
-rw-r--r--certbot-apache/docs/api.rst8
-rw-r--r--certbot-apache/docs/api/augeas_configurator.rst5
-rw-r--r--certbot-apache/docs/api/configurator.rst5
-rw-r--r--certbot-apache/docs/api/display_ops.rst5
-rw-r--r--certbot-apache/docs/api/obj.rst5
-rw-r--r--certbot-apache/docs/api/parser.rst5
-rw-r--r--certbot-apache/docs/api/tls_sni_01.rst5
-rw-r--r--certbot-apache/docs/conf.py318
-rw-r--r--certbot-apache/docs/index.rst31
-rw-r--r--certbot-apache/docs/make.bat263
-rw-r--r--certbot-apache/local-oldest-requirements.txt5
-rw-r--r--certbot-apache/readthedocs.org.requirements.txt12
-rw-r--r--certbot-apache/setup.py42
-rw-r--r--certbot-apache/tests/apache-conf-files/NEEDED.txt (renamed from certbot-apache/certbot_apache/tests/apache-conf-files/NEEDED.txt)0
-rwxr-xr-xcertbot-apache/tests/apache-conf-files/apache-conf-test (renamed from certbot-apache/certbot_apache/tests/apache-conf-files/apache-conf-test)0
-rwxr-xr-xcertbot-apache/tests/apache-conf-files/apache-conf-test-pebble.py27
-rw-r--r--certbot-apache/tests/apache-conf-files/failing/missing-double-quote-1724.conf (renamed from certbot-apache/certbot_apache/tests/apache-conf-files/failing/missing-double-quote-1724.conf)0
-rw-r--r--certbot-apache/tests/apache-conf-files/failing/multivhost-1093.conf (renamed from certbot-apache/certbot_apache/tests/apache-conf-files/failing/multivhost-1093.conf)0
-rw-r--r--certbot-apache/tests/apache-conf-files/failing/multivhost-1093b.conf (renamed from certbot-apache/certbot_apache/tests/apache-conf-files/failing/multivhost-1093b.conf)0
-rw-r--r--certbot-apache/tests/apache-conf-files/passing/1626-1531.conf (renamed from certbot-apache/certbot_apache/tests/apache-conf-files/passing/1626-1531.conf)0
-rw-r--r--certbot-apache/tests/apache-conf-files/passing/README.modules (renamed from certbot-apache/certbot_apache/tests/apache-conf-files/passing/README.modules)0
-rw-r--r--certbot-apache/tests/apache-conf-files/passing/anarcat-1531.conf (renamed from certbot-apache/certbot_apache/tests/apache-conf-files/passing/anarcat-1531.conf)0
-rw-r--r--certbot-apache/tests/apache-conf-files/passing/comment-continuations-2050.conf (renamed from certbot-apache/certbot_apache/tests/apache-conf-files/passing/comment-continuations-2050.conf)0
-rw-r--r--certbot-apache/tests/apache-conf-files/passing/drupal-errordocument-arg-1724.conf (renamed from certbot-apache/certbot_apache/tests/apache-conf-files/passing/drupal-errordocument-arg-1724.conf)0
-rw-r--r--certbot-apache/tests/apache-conf-files/passing/drupal-htaccess-1531.conf (renamed from certbot-apache/certbot_apache/tests/apache-conf-files/passing/drupal-htaccess-1531.conf)0
-rw-r--r--certbot-apache/tests/apache-conf-files/passing/escaped-space-arguments-2735.conf (renamed from certbot-apache/certbot_apache/tests/apache-conf-files/passing/escaped-space-arguments-2735.conf)0
-rw-r--r--certbot-apache/tests/apache-conf-files/passing/example-1755.conf (renamed from certbot-apache/certbot_apache/tests/apache-conf-files/passing/example-1755.conf)0
-rw-r--r--certbot-apache/tests/apache-conf-files/passing/example-ssl.conf (renamed from certbot-apache/certbot_apache/tests/apache-conf-files/passing/example-ssl.conf)0
-rw-r--r--certbot-apache/tests/apache-conf-files/passing/example.conf (renamed from certbot-apache/certbot_apache/tests/apache-conf-files/passing/example.conf)0
-rw-r--r--certbot-apache/tests/apache-conf-files/passing/finalize-1243.apache2.conf.txt (renamed from certbot-apache/certbot_apache/tests/apache-conf-files/passing/finalize-1243.apache2.conf.txt)0
-rw-r--r--certbot-apache/tests/apache-conf-files/passing/finalize-1243.conf (renamed from certbot-apache/certbot_apache/tests/apache-conf-files/passing/finalize-1243.conf)4
-rw-r--r--certbot-apache/tests/apache-conf-files/passing/graphite-quote-1934.conf (renamed from certbot-apache/certbot_apache/tests/apache-conf-files/passing/graphite-quote-1934.conf)0
-rw-r--r--certbot-apache/tests/apache-conf-files/passing/ipv6-1143.conf (renamed from certbot-apache/certbot_apache/tests/apache-conf-files/passing/ipv6-1143.conf)0
-rw-r--r--certbot-apache/tests/apache-conf-files/passing/ipv6-1143b.conf (renamed from certbot-apache/certbot_apache/tests/apache-conf-files/passing/ipv6-1143b.conf)0
-rw-r--r--certbot-apache/tests/apache-conf-files/passing/ipv6-1143c.conf (renamed from certbot-apache/certbot_apache/tests/apache-conf-files/passing/ipv6-1143c.conf)0
-rw-r--r--certbot-apache/tests/apache-conf-files/passing/ipv6-1143d.conf (renamed from certbot-apache/certbot_apache/tests/apache-conf-files/passing/ipv6-1143d.conf)0
-rw-r--r--certbot-apache/tests/apache-conf-files/passing/missing-quote-1724.conf (renamed from certbot-apache/certbot_apache/tests/apache-conf-files/passing/missing-quote-1724.conf)0
-rw-r--r--certbot-apache/tests/apache-conf-files/passing/modmacro-1385.conf (renamed from certbot-apache/certbot_apache/tests/apache-conf-files/passing/modmacro-1385.conf)0
-rw-r--r--certbot-apache/tests/apache-conf-files/passing/owncloud-1264.conf (renamed from certbot-apache/certbot_apache/tests/apache-conf-files/passing/owncloud-1264.conf)0
-rw-r--r--certbot-apache/tests/apache-conf-files/passing/rewrite-quote-1960.conf (renamed from certbot-apache/certbot_apache/tests/apache-conf-files/passing/rewrite-quote-1960.conf)0
-rw-r--r--certbot-apache/tests/apache-conf-files/passing/roundcube-1222.conf (renamed from certbot-apache/certbot_apache/tests/apache-conf-files/passing/roundcube-1222.conf)0
-rw-r--r--certbot-apache/tests/apache-conf-files/passing/section-continuations-2525.conf (renamed from certbot-apache/certbot_apache/tests/apache-conf-files/passing/section-continuations-2525.conf)0
-rw-r--r--certbot-apache/tests/apache-conf-files/passing/section-empty-continuations-2731.conf (renamed from certbot-apache/certbot_apache/tests/apache-conf-files/passing/section-empty-continuations-2731.conf)0
-rw-r--r--certbot-apache/tests/apache-conf-files/passing/semacode-1598.conf (renamed from certbot-apache/certbot_apache/tests/apache-conf-files/passing/semacode-1598.conf)0
-rw-r--r--certbot-apache/tests/apache-conf-files/passing/sslrequire-wordlist-1827.htaccess (renamed from certbot-apache/certbot_apache/tests/apache-conf-files/passing/sslrequire-wordlist-1827.htaccess)0
-rw-r--r--certbot-apache/tests/apache-conf-files/passing/two-blocks-one-line-1693.conf (renamed from certbot-apache/certbot_apache/tests/apache-conf-files/passing/two-blocks-one-line-1693.conf)0
-rw-r--r--certbot-apache/tests/autohsts_test.py (renamed from certbot-apache/certbot_apache/tests/autohsts_test.py)51
-rw-r--r--certbot-apache/tests/centos6_test.py221
-rw-r--r--certbot-apache/tests/centos_test.py (renamed from certbot-apache/certbot_apache/tests/centos_test.py)77
-rw-r--r--certbot-apache/tests/complex_parsing_test.py (renamed from certbot-apache/certbot_apache/tests/complex_parsing_test.py)9
-rw-r--r--certbot-apache/tests/configurator_reverter_test.py (renamed from certbot-apache/certbot_apache/tests/augeas_configurator_test.py)56
-rw-r--r--certbot-apache/tests/configurator_test.py (renamed from certbot-apache/certbot_apache/tests/configurator_test.py)301
-rw-r--r--certbot-apache/tests/debian_test.py (renamed from certbot-apache/certbot_apache/tests/debian_test.py)23
-rw-r--r--certbot-apache/tests/display_ops_test.py (renamed from certbot-apache/certbot_apache/tests/display_ops_test.py)22
-rw-r--r--certbot-apache/tests/entrypoint_test.py (renamed from certbot-apache/certbot_apache/tests/entrypoint_test.py)18
-rw-r--r--certbot-apache/tests/fedora_test.py194
-rw-r--r--certbot-apache/tests/gentoo_test.py (renamed from certbot-apache/certbot_apache/tests/gentoo_test.py)27
-rw-r--r--certbot-apache/tests/http_01_test.py (renamed from certbot-apache/certbot_apache/tests/http_01_test.py)70
-rw-r--r--certbot-apache/tests/obj_test.py (renamed from certbot-apache/certbot_apache/tests/obj_test.py)19
-rw-r--r--certbot-apache/tests/parser_test.py (renamed from certbot-apache/certbot_apache/tests/parser_test.py)114
-rw-r--r--certbot-apache/tests/testdata/centos6_apache/apache/httpd/conf.d/README9
-rw-r--r--certbot-apache/tests/testdata/centos6_apache/apache/httpd/conf.d/ssl.conf222
-rw-r--r--certbot-apache/tests/testdata/centos6_apache/apache/httpd/conf.d/test.example.com.conf7
-rw-r--r--certbot-apache/tests/testdata/centos6_apache/apache/httpd/conf.d/welcome.conf11
-rw-r--r--certbot-apache/tests/testdata/centos6_apache/apache/httpd/conf/httpd.conf1009
-rw-r--r--certbot-apache/tests/testdata/centos7_apache/apache/httpd/conf.d/README (renamed from certbot-apache/certbot_apache/tests/testdata/centos7_apache/apache/httpd/conf.d/README)0
-rw-r--r--certbot-apache/tests/testdata/centos7_apache/apache/httpd/conf.d/autoindex.conf (renamed from certbot-apache/certbot_apache/tests/testdata/centos7_apache/apache/httpd/conf.d/autoindex.conf)0
-rw-r--r--certbot-apache/tests/testdata/centos7_apache/apache/httpd/conf.d/centos.example.com.conf (renamed from certbot-apache/certbot_apache/tests/testdata/centos7_apache/apache/httpd/conf.d/centos.example.com.conf)0
-rw-r--r--certbot-apache/tests/testdata/centos7_apache/apache/httpd/conf.d/ssl.conf (renamed from certbot-apache/certbot_apache/tests/testdata/centos7_apache/apache/httpd/conf.d/ssl.conf)2
-rw-r--r--certbot-apache/tests/testdata/centos7_apache/apache/httpd/conf.d/userdir.conf (renamed from certbot-apache/certbot_apache/tests/testdata/centos7_apache/apache/httpd/conf.d/userdir.conf)0
-rw-r--r--certbot-apache/tests/testdata/centos7_apache/apache/httpd/conf.d/welcome.conf (renamed from certbot-apache/certbot_apache/tests/testdata/centos7_apache/apache/httpd/conf.d/welcome.conf)0
-rw-r--r--certbot-apache/tests/testdata/centos7_apache/apache/httpd/conf.modules.d/00-base.conf (renamed from certbot-apache/certbot_apache/tests/testdata/centos7_apache/apache/httpd/conf.modules.d/00-base.conf)0
-rw-r--r--certbot-apache/tests/testdata/centos7_apache/apache/httpd/conf.modules.d/00-dav.conf (renamed from certbot-apache/certbot_apache/tests/testdata/centos7_apache/apache/httpd/conf.modules.d/00-dav.conf)0
-rw-r--r--certbot-apache/tests/testdata/centos7_apache/apache/httpd/conf.modules.d/00-lua.conf (renamed from certbot-apache/certbot_apache/tests/testdata/centos7_apache/apache/httpd/conf.modules.d/00-lua.conf)0
-rw-r--r--certbot-apache/tests/testdata/centos7_apache/apache/httpd/conf.modules.d/00-mpm.conf (renamed from certbot-apache/certbot_apache/tests/testdata/centos7_apache/apache/httpd/conf.modules.d/00-mpm.conf)0
-rw-r--r--certbot-apache/tests/testdata/centos7_apache/apache/httpd/conf.modules.d/00-proxy.conf (renamed from certbot-apache/certbot_apache/tests/testdata/centos7_apache/apache/httpd/conf.modules.d/00-proxy.conf)0
-rw-r--r--certbot-apache/tests/testdata/centos7_apache/apache/httpd/conf.modules.d/00-ssl.conf (renamed from certbot-apache/certbot_apache/tests/testdata/centos7_apache/apache/httpd/conf.modules.d/00-ssl.conf)0
-rw-r--r--certbot-apache/tests/testdata/centos7_apache/apache/httpd/conf.modules.d/00-systemd.conf (renamed from certbot-apache/certbot_apache/tests/testdata/centos7_apache/apache/httpd/conf.modules.d/00-systemd.conf)0
-rw-r--r--certbot-apache/tests/testdata/centos7_apache/apache/httpd/conf.modules.d/01-cgi.conf (renamed from certbot-apache/certbot_apache/tests/testdata/centos7_apache/apache/httpd/conf.modules.d/01-cgi.conf)0
-rw-r--r--certbot-apache/tests/testdata/centos7_apache/apache/httpd/conf/httpd.conf (renamed from certbot-apache/certbot_apache/tests/testdata/centos7_apache/apache/httpd/conf/httpd.conf)0
-rw-r--r--certbot-apache/tests/testdata/centos7_apache/apache/httpd/conf/magic (renamed from certbot-apache/certbot_apache/tests/testdata/centos7_apache/apache/httpd/conf/magic)0
-rw-r--r--certbot-apache/tests/testdata/centos7_apache/apache/sites (renamed from certbot-apache/certbot_apache/tests/testdata/centos7_apache/apache/sites)0
-rw-r--r--certbot-apache/tests/testdata/centos7_apache/apache/sysconfig/httpd (renamed from certbot-apache/certbot_apache/tests/testdata/centos7_apache/apache/sysconfig/httpd)0
-rw-r--r--certbot-apache/tests/testdata/complex_parsing/apache2.conf (renamed from certbot-apache/certbot_apache/tests/testdata/complex_parsing/apache2.conf)0
-rw-r--r--certbot-apache/tests/testdata/complex_parsing/conf-enabled/dummy.conf (renamed from certbot-apache/certbot_apache/tests/testdata/complex_parsing/conf-enabled/dummy.conf)0
-rw-r--r--certbot-apache/tests/testdata/complex_parsing/test_fnmatch.conf (renamed from certbot-apache/certbot_apache/tests/testdata/complex_parsing/test_fnmatch.conf)0
-rw-r--r--certbot-apache/tests/testdata/complex_parsing/test_variables.conf (renamed from certbot-apache/certbot_apache/tests/testdata/complex_parsing/test_variables.conf)0
-rw-r--r--certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/apache2.conf (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/apache2.conf)0
-rw-r--r--certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/conf-available/bad_conf_file.conf (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/conf-available/bad_conf_file.conf)0
-rw-r--r--certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/conf-available/other-vhosts-access-log.conf (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/conf-available/other-vhosts-access-log.conf)0
-rw-r--r--certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/conf-available/security.conf (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/conf-available/security.conf)0
-rw-r--r--certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/conf-available/serve-cgi-bin.conf (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/conf-available/serve-cgi-bin.conf)0
l---------certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/conf-enabled/other-vhosts-access-log.conf (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/conf-enabled/other-vhosts-access-log.conf)0
l---------certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/conf-enabled/security.conf (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/conf-enabled/security.conf)0
l---------certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/conf-enabled/serve-cgi-bin.conf (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/conf-enabled/serve-cgi-bin.conf)0
-rw-r--r--certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/envvars (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/envvars)0
-rw-r--r--certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/mods-available/authz_svn.load (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/mods-available/authz_svn.load)0
-rw-r--r--certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/mods-available/dav.load (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/mods-available/dav.load)0
-rw-r--r--certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/mods-available/dav_svn.conf (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/mods-available/dav_svn.conf)0
-rw-r--r--certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/mods-available/dav_svn.load (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/mods-available/dav_svn.load)0
-rw-r--r--certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/mods-available/rewrite.load (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/mods-available/rewrite.load)0
-rw-r--r--certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/mods-available/ssl.conf (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/mods-available/ssl.conf)2
-rw-r--r--certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/mods-available/ssl.load (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/mods-available/ssl.load)0
l---------certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/mods-enabled/authz_svn.load (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/mods-enabled/authz_svn.load)0
l---------certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/mods-enabled/dav.load (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/mods-enabled/dav.load)0
l---------certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/mods-enabled/dav_svn.conf (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/mods-enabled/dav_svn.conf)0
l---------certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/mods-enabled/dav_svn.load (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/mods-enabled/dav_svn.load)0
-rw-r--r--certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/ports.conf (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/ports.conf)0
-rw-r--r--certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/sites-available/another_wildcard.conf (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/sites-available/another_wildcard.conf)0
-rw-r--r--certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/sites-available/old-and-default.conf (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/sites-available/old-and-default.conf)0
-rw-r--r--certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/sites-available/wildcard.conf (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/sites-available/wildcard.conf)0
l---------certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/sites-enabled/another_wildcard.conf (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/sites-enabled/another_wildcard.conf)0
l---------certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/sites-enabled/old-and-default.conf (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/sites-enabled/old-and-default.conf)0
l---------certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/sites-enabled/wildcard.conf (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/sites-enabled/wildcard.conf)0
-rw-r--r--certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/sites (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/sites)0
-rw-r--r--certbot-apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/apache2.conf (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/apache2.conf)0
-rw-r--r--certbot-apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/conf-available/other-vhosts-access-log.conf (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/conf-available/other-vhosts-access-log.conf)0
-rw-r--r--certbot-apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/conf-available/security.conf (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/conf-available/security.conf)0
-rw-r--r--certbot-apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/conf-available/serve-cgi-bin.conf (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/conf-available/serve-cgi-bin.conf)0
l---------certbot-apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/conf-enabled/other-vhosts-access-log.conf (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/conf-enabled/other-vhosts-access-log.conf)0
l---------certbot-apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/conf-enabled/security.conf (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/conf-enabled/security.conf)0
l---------certbot-apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/conf-enabled/serve-cgi-bin.conf (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/conf-enabled/serve-cgi-bin.conf)0
-rw-r--r--certbot-apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/envvars (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/envvars)0
-rw-r--r--certbot-apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/mods-available/ssl.conf (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/mods-available/ssl.conf)2
-rw-r--r--certbot-apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/mods-available/ssl.load (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/mods-available/ssl.load)0
-rw-r--r--certbot-apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/ports.conf (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/ports.conf)0
-rw-r--r--certbot-apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/sites-available/000-default.conf (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/sites-available/000-default.conf)0
-rw-r--r--certbot-apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/sites-available/default-ssl.conf (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/sites-available/default-ssl.conf)0
l---------certbot-apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/sites-enabled/000-default.conf (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/sites-enabled/000-default.conf)0
-rw-r--r--certbot-apache/tests/testdata/debian_apache_2_4/default_vhost/sites (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/default_vhost/sites)0
-rw-r--r--certbot-apache/tests/testdata/debian_apache_2_4/multi_vhosts/apache2/apache2.conf (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multi_vhosts/apache2/apache2.conf)0
-rw-r--r--certbot-apache/tests/testdata/debian_apache_2_4/multi_vhosts/apache2/envvars (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multi_vhosts/apache2/envvars)0
-rw-r--r--certbot-apache/tests/testdata/debian_apache_2_4/multi_vhosts/apache2/ports.conf (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multi_vhosts/apache2/ports.conf)0
-rw-r--r--certbot-apache/tests/testdata/debian_apache_2_4/multi_vhosts/apache2/sites-available/default.conf (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multi_vhosts/apache2/sites-available/default.conf)0
-rw-r--r--certbot-apache/tests/testdata/debian_apache_2_4/multi_vhosts/apache2/sites-available/multi-vhost.conf (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multi_vhosts/apache2/sites-available/multi-vhost.conf)0
l---------certbot-apache/tests/testdata/debian_apache_2_4/multi_vhosts/apache2/sites-enabled/default.conf (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multi_vhosts/apache2/sites-enabled/default.conf)0
l---------certbot-apache/tests/testdata/debian_apache_2_4/multi_vhosts/apache2/sites-enabled/multi-vhost.conf (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multi_vhosts/apache2/sites-enabled/multi-vhost.conf)0
-rw-r--r--certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/apache2.conf (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/apache2.conf)0
-rw-r--r--certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/conf-available/bad_conf_file.conf (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/conf-available/bad_conf_file.conf)0
-rw-r--r--certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/conf-available/other-vhosts-access-log.conf (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/conf-available/other-vhosts-access-log.conf)0
-rw-r--r--certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/conf-available/security.conf (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/conf-available/security.conf)0
-rw-r--r--certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/conf-available/serve-cgi-bin.conf (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/conf-available/serve-cgi-bin.conf)0
l---------certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/conf-enabled/other-vhosts-access-log.conf (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/conf-enabled/other-vhosts-access-log.conf)0
l---------certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/conf-enabled/security.conf (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/conf-enabled/security.conf)0
l---------certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/conf-enabled/serve-cgi-bin.conf (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/conf-enabled/serve-cgi-bin.conf)0
-rw-r--r--certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/envvars (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/envvars)0
-rw-r--r--certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/mods-available/authz_svn.load (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/mods-available/authz_svn.load)0
-rw-r--r--certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/mods-available/dav.load (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/mods-available/dav.load)0
-rw-r--r--certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/mods-available/dav_svn.conf (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/mods-available/dav_svn.conf)0
-rw-r--r--certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/mods-available/dav_svn.load (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/mods-available/dav_svn.load)0
-rw-r--r--certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/mods-available/rewrite.load (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/mods-available/rewrite.load)0
-rw-r--r--certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/mods-available/ssl.conf (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/mods-available/ssl.conf)2
-rw-r--r--certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/mods-available/ssl.load (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/mods-available/ssl.load)0
l---------certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/mods-enabled/authz_svn.load (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/mods-enabled/authz_svn.load)0
l---------certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/mods-enabled/dav.load (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/mods-enabled/dav.load)0
l---------certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/mods-enabled/dav_svn.conf (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/mods-enabled/dav_svn.conf)0
l---------certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/mods-enabled/dav_svn.load (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/mods-enabled/dav_svn.load)0
-rw-r--r--certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/ports.conf (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/ports.conf)0
-rw-r--r--certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-available/000-default.conf (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-available/000-default.conf)0
-rw-r--r--certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-available/certbot.conf (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-available/certbot.conf)0
-rw-r--r--certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-available/default-ssl-port-only.conf (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-available/default-ssl-port-only.conf)0
-rw-r--r--certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-available/default-ssl.conf (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-available/default-ssl.conf)0
-rw-r--r--certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-available/duplicatehttp.conf9
-rw-r--r--certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-available/duplicatehttps.conf14
-rw-r--r--certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-available/encryption-example.conf (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-available/encryption-example.conf)0
-rw-r--r--certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-available/mod_macro-example.conf (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-available/mod_macro-example.conf)0
-rw-r--r--certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-available/ocsp-ssl.conf (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-available/ocsp-ssl.conf)0
-rw-r--r--certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-available/wildcard.conf (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-available/wildcard.conf)0
l---------certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-enabled/000-default.conf (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-enabled/000-default.conf)0
l---------certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-enabled/certbot.conf (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-enabled/certbot.conf)0
l---------certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-enabled/default-ssl-port-only.conf (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-enabled/default-ssl-port-only.conf)0
l---------certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-enabled/default-ssl.conf (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-enabled/default-ssl.conf)0
l---------certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-enabled/duplicatehttp.conf1
l---------certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-enabled/duplicatehttps.conf1
l---------certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-enabled/encryption-example.conf (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-enabled/encryption-example.conf)0
l---------certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-enabled/mod_macro-example.conf (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-enabled/mod_macro-example.conf)0
-rw-r--r--certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-enabled/non-symlink.conf (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-enabled/non-symlink.conf)0
l---------certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-enabled/ocsp-ssl.conf (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-enabled/ocsp-ssl.conf)0
l---------certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-enabled/wildcard.conf (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-enabled/wildcard.conf)0
-rw-r--r--certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/sites (renamed from certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/sites)0
-rw-r--r--certbot-apache/tests/testdata/gentoo_apache/apache/apache2/httpd.conf (renamed from certbot-apache/certbot_apache/tests/testdata/gentoo_apache/apache/apache2/httpd.conf)0
-rw-r--r--certbot-apache/tests/testdata/gentoo_apache/apache/apache2/magic (renamed from certbot-apache/certbot_apache/tests/testdata/gentoo_apache/apache/apache2/magic)0
-rw-r--r--certbot-apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/00_default_settings.conf (renamed from certbot-apache/certbot_apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/00_default_settings.conf)0
-rw-r--r--certbot-apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/00_error_documents.conf (renamed from certbot-apache/certbot_apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/00_error_documents.conf)0
-rw-r--r--certbot-apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/00_languages.conf (renamed from certbot-apache/certbot_apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/00_languages.conf)2
-rw-r--r--certbot-apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/00_mod_autoindex.conf (renamed from certbot-apache/certbot_apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/00_mod_autoindex.conf)0
-rw-r--r--certbot-apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/00_mod_info.conf (renamed from certbot-apache/certbot_apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/00_mod_info.conf)0
-rw-r--r--certbot-apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/00_mod_log_config.conf (renamed from certbot-apache/certbot_apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/00_mod_log_config.conf)0
-rw-r--r--certbot-apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/00_mod_mime.conf (renamed from certbot-apache/certbot_apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/00_mod_mime.conf)0
-rw-r--r--certbot-apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/00_mod_status.conf (renamed from certbot-apache/certbot_apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/00_mod_status.conf)0
-rw-r--r--certbot-apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/00_mod_userdir.conf (renamed from certbot-apache/certbot_apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/00_mod_userdir.conf)0
-rw-r--r--certbot-apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/00_mpm.conf (renamed from certbot-apache/certbot_apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/00_mpm.conf)0
-rw-r--r--certbot-apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/10_mod_mem_cache.conf (renamed from certbot-apache/certbot_apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/10_mod_mem_cache.conf)0
-rw-r--r--certbot-apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/40_mod_ssl.conf (renamed from certbot-apache/certbot_apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/40_mod_ssl.conf)2
-rw-r--r--certbot-apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/41_mod_http2.conf (renamed from certbot-apache/certbot_apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/41_mod_http2.conf)0
-rw-r--r--certbot-apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/45_mod_dav.conf (renamed from certbot-apache/certbot_apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/45_mod_dav.conf)0
-rw-r--r--certbot-apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/46_mod_ldap.conf (renamed from certbot-apache/certbot_apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/46_mod_ldap.conf)0
-rw-r--r--certbot-apache/tests/testdata/gentoo_apache/apache/apache2/vhosts.d/00_default_ssl_vhost.conf (renamed from certbot-apache/certbot_apache/tests/testdata/gentoo_apache/apache/apache2/vhosts.d/00_default_ssl_vhost.conf)0
-rw-r--r--certbot-apache/tests/testdata/gentoo_apache/apache/apache2/vhosts.d/00_default_vhost.conf (renamed from certbot-apache/certbot_apache/tests/testdata/gentoo_apache/apache/apache2/vhosts.d/00_default_vhost.conf)0
-rw-r--r--certbot-apache/tests/testdata/gentoo_apache/apache/apache2/vhosts.d/default_vhost.include (renamed from certbot-apache/certbot_apache/tests/testdata/gentoo_apache/apache/apache2/vhosts.d/default_vhost.include)0
-rw-r--r--certbot-apache/tests/testdata/gentoo_apache/apache/apache2/vhosts.d/gentoo.example.com.conf (renamed from certbot-apache/certbot_apache/tests/testdata/gentoo_apache/apache/apache2/vhosts.d/gentoo.example.com.conf)0
-rw-r--r--certbot-apache/tests/testdata/gentoo_apache/apache/conf.d/apache2 (renamed from certbot-apache/certbot_apache/tests/testdata/gentoo_apache/apache/conf.d/apache2)0
-rw-r--r--certbot-apache/tests/testdata/gentoo_apache/apache/sites (renamed from certbot-apache/certbot_apache/tests/testdata/gentoo_apache/apache/sites)0
-rw-r--r--certbot-apache/tests/util.py (renamed from certbot-apache/certbot_apache/tests/util.py)42
235 files changed, 3110 insertions, 2230 deletions
diff --git a/certbot-apache/MANIFEST.in b/certbot-apache/MANIFEST.in
index 3e594a953..2316983bb 100644
--- a/certbot-apache/MANIFEST.in
+++ b/certbot-apache/MANIFEST.in
@@ -1,7 +1,7 @@
include LICENSE.txt
include README.rst
-recursive-include docs *
-recursive-include certbot_apache/tests/testdata *
-include certbot_apache/centos-options-ssl-apache.conf
-include certbot_apache/options-ssl-apache.conf
-recursive-include certbot_apache/augeas_lens *.aug
+recursive-include tests *
+include certbot_apache/_internal/options-ssl-apache.conf
+recursive-include certbot_apache/_internal/augeas_lens *.aug
+global-exclude __pycache__
+global-exclude *.py[cod]
diff --git a/certbot-apache/certbot_apache/_internal/__init__.py b/certbot-apache/certbot_apache/_internal/__init__.py
new file mode 100644
index 000000000..9c195ccc7
--- /dev/null
+++ b/certbot-apache/certbot_apache/_internal/__init__.py
@@ -0,0 +1 @@
+"""Certbot Apache plugin."""
diff --git a/certbot-apache/certbot_apache/apache_util.py b/certbot-apache/certbot_apache/_internal/apache_util.py
index 62342004f..7a2ecf49b 100644
--- a/certbot-apache/certbot_apache/apache_util.py
+++ b/certbot-apache/certbot_apache/_internal/apache_util.py
@@ -1,8 +1,9 @@
""" Utility functions for certbot-apache plugin """
import binascii
-import os
from certbot import util
+from certbot.compat import os
+
def get_mod_deps(mod_name):
"""Get known module dependencies.
diff --git a/certbot-apache/certbot_apache/augeas_lens/README b/certbot-apache/certbot_apache/_internal/augeas_lens/README
index bf9161f93..bf9161f93 100644
--- a/certbot-apache/certbot_apache/augeas_lens/README
+++ b/certbot-apache/certbot_apache/_internal/augeas_lens/README
diff --git a/certbot-apache/certbot_apache/augeas_lens/httpd.aug b/certbot-apache/certbot_apache/_internal/augeas_lens/httpd.aug
index 5600088cf..5600088cf 100644
--- a/certbot-apache/certbot_apache/augeas_lens/httpd.aug
+++ b/certbot-apache/certbot_apache/_internal/augeas_lens/httpd.aug
diff --git a/certbot-apache/certbot_apache/configurator.py b/certbot-apache/certbot_apache/_internal/configurator.py
index 16de3a3d8..84b59d2c7 100644
--- a/certbot-apache/certbot_apache/configurator.py
+++ b/certbot-apache/certbot_apache/_internal/configurator.py
@@ -1,40 +1,39 @@
-"""Apache Configuration based off of Augeas Configurator."""
+"""Apache Configurator."""
# pylint: disable=too-many-lines
+from collections import defaultdict
import copy
import fnmatch
import logging
-import os
-import pkg_resources
import re
-import six
import socket
import time
+import pkg_resources
+import six
import zope.component
import zope.interface
from acme import challenges
-from acme.magic_typing import Any, DefaultDict, Dict, List, Set, Union # pylint: disable=unused-import, no-name-in-module
-
+from acme.magic_typing import DefaultDict # pylint: disable=unused-import, no-name-in-module
+from acme.magic_typing import Dict # pylint: disable=unused-import, no-name-in-module
+from acme.magic_typing import List # pylint: disable=unused-import, no-name-in-module
+from acme.magic_typing import Set # pylint: disable=unused-import, no-name-in-module
+from acme.magic_typing import Union # pylint: disable=unused-import, no-name-in-module
from certbot import errors
from certbot import interfaces
from certbot import util
-
from certbot.achallenges import KeyAuthorizationAnnotatedChallenge # pylint: disable=unused-import
+from certbot.compat import filesystem
+from certbot.compat import os
from certbot.plugins import common
-from certbot.plugins.util import path_surgery
from certbot.plugins.enhancements import AutoHSTSEnhancement
-
-from certbot_apache import apache_util
-from certbot_apache import augeas_configurator
-from certbot_apache import constants
-from certbot_apache import display_ops
-from certbot_apache import http_01
-from certbot_apache import obj
-from certbot_apache import parser
-from certbot_apache import tls_sni_01
-
-from collections import defaultdict
+from certbot.plugins.util import path_surgery
+from certbot_apache._internal import apache_util
+from certbot_apache._internal import constants
+from certbot_apache._internal import display_ops
+from certbot_apache._internal import http_01
+from certbot_apache._internal import obj
+from certbot_apache._internal import parser
logger = logging.getLogger(__name__)
@@ -70,28 +69,29 @@ logger = logging.getLogger(__name__)
@zope.interface.implementer(interfaces.IAuthenticator, interfaces.IInstaller)
@zope.interface.provider(interfaces.IPluginFactory)
-class ApacheConfigurator(augeas_configurator.AugeasConfigurator):
- # pylint: disable=too-many-instance-attributes,too-many-public-methods
+class ApacheConfigurator(common.Installer):
"""Apache configurator.
- State of Configurator: This code has been been tested and built for Ubuntu
- 14.04 Apache 2.4 and it works for Ubuntu 12.04 Apache 2.2
-
:ivar config: Configuration.
:type config: :class:`~certbot.interfaces.IConfig`
:ivar parser: Handles low level parsing
- :type parser: :class:`~certbot_apache.parser`
+ :type parser: :class:`~certbot_apache._internal.parser`
:ivar tup version: version of Apache
:ivar list vhosts: All vhosts found in the configuration
- (:class:`list` of :class:`~certbot_apache.obj.VirtualHost`)
+ (:class:`list` of :class:`~certbot_apache._internal.obj.VirtualHost`)
:ivar dict assoc: Mapping between domains and vhosts
"""
description = "Apache Web Server plugin"
+ if os.environ.get("CERTBOT_DOCS") == "1":
+ description += ( # pragma: no cover
+ " (Please note that the default values of the Apache plugin options"
+ " change depending on the operating system Certbot is run on.)"
+ )
OS_DEFAULTS = dict(
server_root="/etc/apache2",
@@ -109,7 +109,7 @@ class ApacheConfigurator(augeas_configurator.AugeasConfigurator):
handle_sites=False,
challenge_location="/etc/apache2",
MOD_SSL_CONF_SRC=pkg_resources.resource_filename(
- "certbot_apache", "options-ssl-apache.conf")
+ "certbot_apache", os.path.join("_internal", "options-ssl-apache.conf"))
)
def option(self, key):
@@ -141,31 +141,37 @@ class ApacheConfigurator(augeas_configurator.AugeasConfigurator):
# When adding, modifying or deleting command line arguments, be sure to
# include the changes in the list used in method _prepare_options() to
# ensure consistent behavior.
- add("enmod", default=cls.OS_DEFAULTS["enmod"],
+
+ # Respect CERTBOT_DOCS environment variable and use default values from
+ # base class regardless of the underlying distribution (overrides).
+ if os.environ.get("CERTBOT_DOCS") == "1":
+ DEFAULTS = ApacheConfigurator.OS_DEFAULTS
+ else:
+ # cls.OS_DEFAULTS can be distribution specific, see override classes
+ DEFAULTS = cls.OS_DEFAULTS
+ add("enmod", default=DEFAULTS["enmod"],
help="Path to the Apache 'a2enmod' binary")
- add("dismod", default=cls.OS_DEFAULTS["dismod"],
+ add("dismod", default=DEFAULTS["dismod"],
help="Path to the Apache 'a2dismod' binary")
- add("le-vhost-ext", default=cls.OS_DEFAULTS["le_vhost_ext"],
+ add("le-vhost-ext", default=DEFAULTS["le_vhost_ext"],
help="SSL vhost configuration extension")
- add("server-root", default=cls.OS_DEFAULTS["server_root"],
+ add("server-root", default=DEFAULTS["server_root"],
help="Apache server root directory")
add("vhost-root", default=None,
help="Apache server VirtualHost configuration root")
- add("logs-root", default=cls.OS_DEFAULTS["logs_root"],
+ add("logs-root", default=DEFAULTS["logs_root"],
help="Apache server logs directory")
add("challenge-location",
- default=cls.OS_DEFAULTS["challenge_location"],
+ default=DEFAULTS["challenge_location"],
help="Directory path for challenge configuration")
- add("handle-modules", default=cls.OS_DEFAULTS["handle_modules"],
+ add("handle-modules", default=DEFAULTS["handle_modules"],
help="Let installer handle enabling required modules for you " +
"(Only Ubuntu/Debian currently)")
- add("handle-sites", default=cls.OS_DEFAULTS["handle_sites"],
+ add("handle-sites", default=DEFAULTS["handle_sites"],
help="Let installer handle enabling sites for you " +
"(Only Ubuntu/Debian currently)")
- add("ctl", default=cls.OS_DEFAULTS["ctl"],
+ add("ctl", default=DEFAULTS["ctl"],
help="Full path to Apache control script")
- util.add_deprecated_argument(
- add, argument_name="init-script", nargs=1)
def __init__(self, *args, **kwargs):
"""Initialize an Apache Configurator.
@@ -188,6 +194,8 @@ class ApacheConfigurator(augeas_configurator.AugeasConfigurator):
self._enhanced_vhosts = defaultdict(set) # type: DefaultDict[str, Set[obj.VirtualHost]]
# Temporary state for AutoHSTS enhancement
self._autohsts = {} # type: Dict[str, Dict[str, Union[int, float]]]
+ # Reverter save notes
+ self.save_notes = ""
# These will be set in the prepare function
self._prepared = False
@@ -202,15 +210,13 @@ class ApacheConfigurator(augeas_configurator.AugeasConfigurator):
@property
def mod_ssl_conf(self):
"""Full absolute path to SSL configuration file."""
- return os.path.join(self.config.config_dir,
- constants.MOD_SSL_CONF_DEST)
+ return os.path.join(self.config.config_dir, constants.MOD_SSL_CONF_DEST)
@property
def updated_mod_ssl_conf_digest(self):
"""Full absolute path to digest of updated SSL configuration file."""
return os.path.join(self.config.config_dir, constants.UPDATED_MOD_SSL_CONF_DIGEST)
-
def prepare(self):
"""Prepare the authenticator/installer.
@@ -220,12 +226,6 @@ class ApacheConfigurator(augeas_configurator.AugeasConfigurator):
:raises .errors.PluginError: If there is any other error
"""
- # Perform the actual Augeas initialization to be able to react
- try:
- self.init_augeas()
- except ImportError:
- raise errors.NoInstallationError("Problem in Augeas installation")
-
self._prepare_options()
# Verify Apache is installed
@@ -241,18 +241,16 @@ class ApacheConfigurator(augeas_configurator.AugeasConfigurator):
'.'.join(str(i) for i in self.version))
if self.version < (2, 2):
raise errors.NotSupportedError(
- "Apache Version %s not supported.", str(self.version))
-
- if not self._check_aug_version():
- raise errors.NotSupportedError(
- "Apache plugin support requires libaugeas0 and augeas-lenses "
- "version 1.2.0 or higher, please make sure you have you have "
- "those installed.")
+ "Apache Version {0} not supported.".format(str(self.version)))
+ # Recover from previous crash before Augeas initialization to have the
+ # correct parse tree from the get go.
+ self.recovery_routine()
+ # Perform the actual Augeas initialization to be able to react
self.parser = self.get_parser()
# Check for errors in parsing files with Augeas
- self.check_parsing_errors("httpd.aug")
+ self.parser.check_parsing_errors("httpd.aug")
# Get all of the available vhosts
self.vhosts = self.get_virtual_hosts()
@@ -266,9 +264,72 @@ class ApacheConfigurator(augeas_configurator.AugeasConfigurator):
except (OSError, errors.LockError):
logger.debug("Encountered error:", exc_info=True)
raise errors.PluginError(
- "Unable to lock %s", self.option("server_root"))
+ "Unable to create a lock file in {0}. Are you running"
+ " Certbot with sufficient privileges to modify your"
+ " Apache configuration?".format(self.option("server_root")))
self._prepared = True
+ def save(self, title=None, temporary=False):
+ """Saves all changes to the configuration files.
+
+ This function first checks for save errors, if none are found,
+ all configuration changes made will be saved. According to the
+ function parameters. If an exception is raised, a new checkpoint
+ was not created.
+
+ :param str title: The title of the save. If a title is given, the
+ configuration will be saved as a new checkpoint and put in a
+ timestamped directory.
+
+ :param bool temporary: Indicates whether the changes made will
+ be quickly reversed in the future (ie. challenges)
+
+ """
+ save_files = self.parser.unsaved_files()
+ if save_files:
+ self.add_to_checkpoint(save_files,
+ self.save_notes, temporary=temporary)
+ # Handle the parser specific tasks
+ self.parser.save(save_files)
+ if title and not temporary:
+ self.finalize_checkpoint(title)
+
+ def recovery_routine(self):
+ """Revert all previously modified files.
+
+ Reverts all modified files that have not been saved as a checkpoint
+
+ :raises .errors.PluginError: If unable to recover the configuration
+
+ """
+ super(ApacheConfigurator, self).recovery_routine()
+ # Reload configuration after these changes take effect if needed
+ # ie. ApacheParser has been initialized.
+ if self.parser:
+ # TODO: wrap into non-implementation specific parser interface
+ self.parser.aug.load()
+
+ def revert_challenge_config(self):
+ """Used to cleanup challenge configurations.
+
+ :raises .errors.PluginError: If unable to revert the challenge config.
+
+ """
+ self.revert_temporary_config()
+ self.parser.aug.load()
+
+ def rollback_checkpoints(self, rollback=1):
+ """Rollback saved checkpoints.
+
+ :param int rollback: Number of checkpoints to revert
+
+ :raises .errors.PluginError: If there is a problem with the input or
+ the function is unable to correctly revert the configuration
+
+ """
+ super(ApacheConfigurator, self).rollback_checkpoints(rollback)
+ self.parser.aug.load()
+
def _verify_exe_availability(self, exe):
"""Checks availability of Apache executable"""
if not util.exe_exists(exe):
@@ -276,26 +337,11 @@ class ApacheConfigurator(augeas_configurator.AugeasConfigurator):
raise errors.NoInstallationError(
'Cannot find Apache executable {0}'.format(exe))
- def _check_aug_version(self):
- """ Checks that we have recent enough version of libaugeas.
- If augeas version is recent enough, it will support case insensitive
- regexp matching"""
-
- self.aug.set("/test/path/testing/arg", "aRgUMeNT")
- try:
- matches = self.aug.match(
- "/test//*[self::arg=~regexp('argument', 'i')]")
- except RuntimeError:
- self.aug.remove("/test/path")
- return False
- self.aug.remove("/test/path")
- return matches
-
def get_parser(self):
"""Initializes the ApacheParser"""
# If user provided vhost_root value in command line, use it
return parser.ApacheParser(
- self.aug, self.option("server_root"), self.conf("vhost-root"),
+ self.option("server_root"), self.conf("vhost-root"),
self.version, configurator=self)
def _wildcard_domain(self, domain):
@@ -344,7 +390,7 @@ class ApacheConfigurator(augeas_configurator.AugeasConfigurator):
counterpart, should one get created
:returns: List of VirtualHosts or None
- :rtype: `list` of :class:`~certbot_apache.obj.VirtualHost`
+ :rtype: `list` of :class:`~certbot_apache._internal.obj.VirtualHost`
"""
if self._wildcard_domain(domain):
@@ -382,7 +428,7 @@ class ApacheConfigurator(augeas_configurator.AugeasConfigurator):
"""
if len(name.split(".")) == len(domain.split(".")):
return fnmatch.fnmatch(name, domain)
-
+ return None
def _choose_vhosts_wildcard(self, domain, create_ssl=True):
"""Prompts user to choose vhosts to install a wildcard certificate for"""
@@ -403,7 +449,7 @@ class ApacheConfigurator(augeas_configurator.AugeasConfigurator):
filtered_vhosts[name] = vhost
# Only unique VHost objects
- dialog_input = set([vhost for vhost in filtered_vhosts.values()])
+ dialog_input = set(filtered_vhosts.values())
# Ask the user which of names to enable, expect list of names back
dialog_output = display_ops.select_vhost_multiple(list(dialog_input))
@@ -428,7 +474,6 @@ class ApacheConfigurator(augeas_configurator.AugeasConfigurator):
self._wildcard_vhosts[domain] = return_vhosts
return return_vhosts
-
def _deploy_cert(self, vhost, cert_path, key_path, chain_path, fullchain_path):
"""
Helper function for deploy_cert() that handles the actual deployment
@@ -436,8 +481,6 @@ class ApacheConfigurator(augeas_configurator.AugeasConfigurator):
domain originally passed for deploy_cert(). This is especially true
with wildcard certificates
"""
-
-
# This is done first so that ssl module is enabled and cert_path,
# cert_key... can all be parsed appropriately
self.prepare_server_https("443")
@@ -477,8 +520,8 @@ class ApacheConfigurator(augeas_configurator.AugeasConfigurator):
# install SSLCertificateFile, SSLCertificateKeyFile,
# and SSLCertificateChainFile directives
set_cert_path = cert_path
- self.aug.set(path["cert_path"][-1], cert_path)
- self.aug.set(path["cert_key"][-1], key_path)
+ self.parser.aug.set(path["cert_path"][-1], cert_path)
+ self.parser.aug.set(path["cert_key"][-1], key_path)
if chain_path is not None:
self.parser.add_dir(vhost.path,
"SSLCertificateChainFile", chain_path)
@@ -490,8 +533,8 @@ class ApacheConfigurator(augeas_configurator.AugeasConfigurator):
raise errors.PluginError("Please provide the --fullchain-path "
"option pointing to your full chain file")
set_cert_path = fullchain_path
- self.aug.set(path["cert_path"][-1], fullchain_path)
- self.aug.set(path["cert_key"][-1], key_path)
+ self.parser.aug.set(path["cert_path"][-1], fullchain_path)
+ self.parser.aug.set(path["cert_key"][-1], key_path)
# Enable the new vhost if needed
if not vhost.enabled:
@@ -522,7 +565,7 @@ class ApacheConfigurator(augeas_configurator.AugeasConfigurator):
counterpart, should one get created
:returns: vhost associated with name
- :rtype: :class:`~certbot_apache.obj.VirtualHost`
+ :rtype: :class:`~certbot_apache._internal.obj.VirtualHost`
:raises .errors.PluginError: If no vhost is available or chosen
@@ -557,9 +600,9 @@ class ApacheConfigurator(augeas_configurator.AugeasConfigurator):
"in the Apache config.",
target_name)
raise errors.PluginError("No vhost selected")
- elif temp:
+ if temp:
return vhost
- elif not vhost.ssl:
+ if not vhost.ssl:
addrs = self._get_proposed_addrs(vhost, "443")
# TODO: Conflicts is too conservative
if not any(vhost.enabled and vhost.conflicts(addrs) for
@@ -577,8 +620,9 @@ class ApacheConfigurator(augeas_configurator.AugeasConfigurator):
self.assoc[target_name] = vhost
return vhost
- def included_in_wildcard(self, names, target_name):
- """Is target_name covered by a wildcard?
+ def domain_in_names(self, names, target_name):
+ """Checks if target domain is covered by one or more of the provided
+ names. The target name is matched by wildcard as well as exact match.
:param names: server aliases
:type names: `collections.Iterable` of `str`
@@ -624,7 +668,7 @@ class ApacheConfigurator(augeas_configurator.AugeasConfigurator):
:param str target_name: domain handled by the desired vhost
:param vhosts: vhosts to consider
- :type vhosts: `collections.Iterable` of :class:`~certbot_apache.obj.VirtualHost`
+ :type vhosts: `collections.Iterable` of :class:`~certbot_apache._internal.obj.VirtualHost`
:param bool filter_defaults: whether a vhost with a _default_
addr is acceptable
@@ -649,7 +693,7 @@ class ApacheConfigurator(augeas_configurator.AugeasConfigurator):
names = vhost.get_names()
if target_name in names:
points = 3
- elif self.included_in_wildcard(names, target_name):
+ elif self.domain_in_names(names, target_name):
points = 2
elif any(addr.get_addr() == target_name for addr in vhost.addrs):
points = 1
@@ -708,7 +752,7 @@ class ApacheConfigurator(augeas_configurator.AugeasConfigurator):
if name:
all_names.add(name)
- if len(vhost_macro) > 0:
+ if vhost_macro:
zope.component.getUtility(interfaces.IDisplay).notification(
"Apache mod_macro seems to be in use in file(s):\n{0}"
"\n\nUnfortunately mod_macro is not yet supported".format(
@@ -766,7 +810,7 @@ class ApacheConfigurator(augeas_configurator.AugeasConfigurator):
"""Helper function for get_virtual_hosts().
:param host: In progress vhost whose names will be added
- :type host: :class:`~certbot_apache.obj.VirtualHost`
+ :type host: :class:`~certbot_apache._internal.obj.VirtualHost`
"""
@@ -785,12 +829,12 @@ class ApacheConfigurator(augeas_configurator.AugeasConfigurator):
:param str path: Augeas path to virtual host
:returns: newly created vhost
- :rtype: :class:`~certbot_apache.obj.VirtualHost`
+ :rtype: :class:`~certbot_apache._internal.obj.VirtualHost`
"""
addrs = set()
try:
- args = self.aug.match(path + "/arg")
+ args = self.parser.aug.match(path + "/arg")
except RuntimeError:
logger.warning("Encountered a problem while parsing file: %s, skipping", path)
return None
@@ -808,7 +852,7 @@ class ApacheConfigurator(augeas_configurator.AugeasConfigurator):
is_ssl = True
filename = apache_util.get_file_path(
- self.aug.get("/augeas/files%s/path" % apache_util.get_file_path(path)))
+ self.parser.aug.get("/augeas/files%s/path" % apache_util.get_file_path(path)))
if filename is None:
return None
@@ -826,7 +870,7 @@ class ApacheConfigurator(augeas_configurator.AugeasConfigurator):
def get_virtual_hosts(self):
"""Returns list of virtual hosts found in the Apache configuration.
- :returns: List of :class:`~certbot_apache.obj.VirtualHost`
+ :returns: List of :class:`~certbot_apache._internal.obj.VirtualHost`
objects found in configuration
:rtype: list
@@ -838,7 +882,7 @@ class ApacheConfigurator(augeas_configurator.AugeasConfigurator):
# Make a list of parser paths because the parser_paths
# dictionary may be modified during the loop.
for vhost_path in list(self.parser.parser_paths):
- paths = self.aug.match(
+ paths = self.parser.aug.match(
("/files%s//*[label()=~regexp('%s')]" %
(vhost_path, parser.case_i("VirtualHost"))))
paths = [path for path in paths if
@@ -848,7 +892,7 @@ class ApacheConfigurator(augeas_configurator.AugeasConfigurator):
if not new_vhost:
continue
internal_path = apache_util.get_internal_aug_path(new_vhost.path)
- realpath = os.path.realpath(new_vhost.filep)
+ realpath = filesystem.realpath(new_vhost.filep)
if realpath not in file_paths:
file_paths[realpath] = new_vhost.filep
internal_paths[realpath].add(internal_path)
@@ -883,7 +927,7 @@ class ApacheConfigurator(augeas_configurator.AugeasConfigurator):
now NameVirtualHosts. If version is earlier than 2.4, check if addr
has a NameVirtualHost directive in the Apache config
- :param certbot_apache.obj.Addr target_addr: vhost address
+ :param certbot_apache._internal.obj.Addr target_addr: vhost address
:returns: Success
:rtype: bool
@@ -901,19 +945,18 @@ class ApacheConfigurator(augeas_configurator.AugeasConfigurator):
"""Adds NameVirtualHost directive for given address.
:param addr: Address that will be added as NameVirtualHost directive
- :type addr: :class:`~certbot_apache.obj.Addr`
+ :type addr: :class:`~certbot_apache._internal.obj.Addr`
"""
loc = parser.get_aug_path(self.parser.loc["name"])
if addr.get_port() == "443":
- path = self.parser.add_dir_to_ifmodssl(
+ self.parser.add_dir_to_ifmodssl(
loc, "NameVirtualHost", [str(addr)])
else:
- path = self.parser.add_dir(loc, "NameVirtualHost", [str(addr)])
+ self.parser.add_dir(loc, "NameVirtualHost", [str(addr)])
- msg = ("Setting %s to be NameBasedVirtualHost\n"
- "\tDirective added to %s\n" % (addr, path))
+ msg = "Setting {0} to be NameBasedVirtualHost\n".format(addr)
logger.debug(msg)
self.save_notes += msg
@@ -1054,6 +1097,7 @@ class ApacheConfigurator(augeas_configurator.AugeasConfigurator):
# Ugly but takes care of protocol def, eg: 1.1.1.1:443 https
if listen.split(":")[-1].split(" ")[0] == port:
return True
+ return None
def prepare_https_modules(self, temp):
"""Helper method for prepare_server_https, taking care of enabling
@@ -1069,24 +1113,7 @@ class ApacheConfigurator(augeas_configurator.AugeasConfigurator):
if "ssl_module" not in self.parser.modules:
self.enable_mod("ssl", temp=temp)
- def make_addrs_sni_ready(self, addrs):
- """Checks to see if the server is ready for SNI challenges.
-
- :param addrs: Addresses to check SNI compatibility
- :type addrs: :class:`~certbot_apache.obj.Addr`
-
- """
- # Version 2.4 and later are automatically SNI ready.
- if self.version >= (2, 4):
- return
-
- for addr in addrs:
- if not self.is_name_vhost(addr):
- logger.debug("Setting VirtualHost at %s to be a name "
- "based virtual host", addr)
- self.add_name_vhost(addr)
-
- def make_vhost_ssl(self, nonssl_vhost): # pylint: disable=too-many-locals
+ def make_vhost_ssl(self, nonssl_vhost):
"""Makes an ssl_vhost version of a nonssl_vhost.
Duplicates vhost and adds default ssl options
@@ -1096,10 +1123,10 @@ class ApacheConfigurator(augeas_configurator.AugeasConfigurator):
.. note:: This function saves the configuration
:param nonssl_vhost: Valid VH that doesn't have SSLEngine on
- :type nonssl_vhost: :class:`~certbot_apache.obj.VirtualHost`
+ :type nonssl_vhost: :class:`~certbot_apache._internal.obj.VirtualHost`
:returns: SSL vhost
- :rtype: :class:`~certbot_apache.obj.VirtualHost`
+ :rtype: :class:`~certbot_apache._internal.obj.VirtualHost`
:raises .errors.PluginError: If more than one virtual host is in
the file or if plugin is unable to write/read vhost files.
@@ -1108,16 +1135,16 @@ class ApacheConfigurator(augeas_configurator.AugeasConfigurator):
avail_fp = nonssl_vhost.filep
ssl_fp = self._get_ssl_vhost_path(avail_fp)
- orig_matches = self.aug.match("/files%s//* [label()=~regexp('%s')]" %
+ orig_matches = self.parser.aug.match("/files%s//* [label()=~regexp('%s')]" %
(self._escape(ssl_fp),
parser.case_i("VirtualHost")))
self._copy_create_ssl_vhost_skeleton(nonssl_vhost, ssl_fp)
# Reload augeas to take into account the new vhost
- self.aug.load()
+ self.parser.aug.load()
# Get Vhost augeas path for new vhost
- new_matches = self.aug.match("/files%s//* [label()=~regexp('%s')]" %
+ new_matches = self.parser.aug.match("/files%s//* [label()=~regexp('%s')]" %
(self._escape(ssl_fp),
parser.case_i("VirtualHost")))
@@ -1128,7 +1155,7 @@ class ApacheConfigurator(augeas_configurator.AugeasConfigurator):
# Make Augeas aware of the new vhost
self.parser.parse_file(ssl_fp)
# Try to search again
- new_matches = self.aug.match(
+ new_matches = self.parser.aug.match(
"/files%s//* [label()=~regexp('%s')]" %
(self._escape(ssl_fp),
parser.case_i("VirtualHost")))
@@ -1190,16 +1217,15 @@ class ApacheConfigurator(augeas_configurator.AugeasConfigurator):
"""
if self.conf("vhost-root") and os.path.exists(self.conf("vhost-root")):
- fp = os.path.join(os.path.realpath(self.option("vhost_root")),
+ fp = os.path.join(filesystem.realpath(self.option("vhost_root")),
os.path.basename(non_ssl_vh_fp))
else:
# Use non-ssl filepath
- fp = os.path.realpath(non_ssl_vh_fp)
+ fp = filesystem.realpath(non_ssl_vh_fp)
if fp.endswith(".conf"):
return fp[:-(len(".conf"))] + self.option("le_vhost_ext")
- else:
- return fp + self.option("le_vhost_ext")
+ return fp + self.option("le_vhost_ext")
def _sift_rewrite_rule(self, line):
"""Decides whether a line should be copied to a SSL vhost.
@@ -1279,8 +1305,8 @@ class ApacheConfigurator(augeas_configurator.AugeasConfigurator):
"vhost for your HTTPS site located at {1} because they have "
"the potential to create redirection loops.".format(
vhost.filep, ssl_fp), reporter.MEDIUM_PRIORITY)
- self.aug.set("/augeas/files%s/mtime" % (self._escape(ssl_fp)), "0")
- self.aug.set("/augeas/files%s/mtime" % (self._escape(vhost.filep)), "0")
+ self.parser.aug.set("/augeas/files%s/mtime" % (self._escape(ssl_fp)), "0")
+ self.parser.aug.set("/augeas/files%s/mtime" % (self._escape(vhost.filep)), "0")
def _sift_rewrite_rules(self, contents):
""" Helper function for _copy_create_ssl_vhost_skeleton to prepare the
@@ -1338,12 +1364,9 @@ class ApacheConfigurator(augeas_configurator.AugeasConfigurator):
result.append(comment)
sift = True
- result.append('\n'.join(
- ['# ' + l for l in chunk]))
- continue
+ result.append('\n'.join(['# ' + l for l in chunk]))
else:
result.append('\n'.join(chunk))
- continue
return result, sift
def _get_vhost_block(self, vhost):
@@ -1355,7 +1378,7 @@ class ApacheConfigurator(augeas_configurator.AugeasConfigurator):
"""
try:
- span_val = self.aug.span(vhost.path)
+ span_val = self.parser.aug.span(vhost.path)
except ValueError:
logger.critical("Error while reading the VirtualHost %s from "
"file %s", vhost.name, vhost.filep, exc_info=True)
@@ -1390,13 +1413,13 @@ class ApacheConfigurator(augeas_configurator.AugeasConfigurator):
def _update_ssl_vhosts_addrs(self, vh_path):
ssl_addrs = set()
- ssl_addr_p = self.aug.match(vh_path + "/arg")
+ ssl_addr_p = self.parser.aug.match(vh_path + "/arg")
for addr in ssl_addr_p:
old_addr = obj.Addr.fromstring(
str(self.parser.get_arg(addr)))
ssl_addr = old_addr.get_addr_obj("443")
- self.aug.set(addr, str(ssl_addr))
+ self.parser.aug.set(addr, str(ssl_addr))
ssl_addrs.add(ssl_addr)
return ssl_addrs
@@ -1415,15 +1438,14 @@ class ApacheConfigurator(augeas_configurator.AugeasConfigurator):
vh_path, False)) > 1:
directive_path = self.parser.find_dir(directive, None,
vh_path, False)
- self.aug.remove(re.sub(r"/\w*$", "", directive_path[0]))
+ self.parser.aug.remove(re.sub(r"/\w*$", "", directive_path[0]))
def _remove_directives(self, vh_path, directives):
for directive in directives:
- while len(self.parser.find_dir(directive, None,
- vh_path, False)) > 0:
+ while self.parser.find_dir(directive, None, vh_path, False):
directive_path = self.parser.find_dir(directive, None,
vh_path, False)
- self.aug.remove(re.sub(r"/\w*$", "", directive_path[0]))
+ self.parser.aug.remove(re.sub(r"/\w*$", "", directive_path[0]))
def _add_dummy_ssl_directives(self, vh_path):
self.parser.add_dir(vh_path, "SSLCertificateFile",
@@ -1462,8 +1484,8 @@ class ApacheConfigurator(augeas_configurator.AugeasConfigurator):
"""
matches = self.parser.find_dir(
"ServerAlias", start=vh_path, exclude=False)
- aliases = (self.aug.get(match) for match in matches)
- return self.included_in_wildcard(aliases, target_name)
+ aliases = (self.parser.aug.get(match) for match in matches)
+ return self.domain_in_names(aliases, target_name)
def _add_name_vhost_if_necessary(self, vhost):
"""Add NameVirtualHost Directives if necessary for new vhost.
@@ -1472,7 +1494,7 @@ class ApacheConfigurator(augeas_configurator.AugeasConfigurator):
https://httpd.apache.org/docs/2.2/mod/core.html#namevirtualhost
:param vhost: New virtual host that was recently created.
- :type vhost: :class:`~certbot_apache.obj.VirtualHost`
+ :type vhost: :class:`~certbot_apache._internal.obj.VirtualHost`
"""
need_to_save = False
@@ -1507,7 +1529,7 @@ class ApacheConfigurator(augeas_configurator.AugeasConfigurator):
:param str id_str: Id string for matching
:returns: The matched VirtualHost or None
- :rtype: :class:`~certbot_apache.obj.VirtualHost` or None
+ :rtype: :class:`~certbot_apache._internal.obj.VirtualHost` or None
:raises .errors.PluginError: If no VirtualHost is found
"""
@@ -1524,7 +1546,7 @@ class ApacheConfigurator(augeas_configurator.AugeasConfigurator):
used for keeping track of VirtualHost directive over time.
:param vhost: Virtual host to add the id
- :type vhost: :class:`~certbot_apache.obj.VirtualHost`
+ :type vhost: :class:`~certbot_apache._internal.obj.VirtualHost`
:returns: The unique ID or None
:rtype: str or None
@@ -1546,7 +1568,7 @@ class ApacheConfigurator(augeas_configurator.AugeasConfigurator):
If ID already exists, returns that instead.
:param vhost: Virtual host to add or find the id
- :type vhost: :class:`~certbot_apache.obj.VirtualHost`
+ :type vhost: :class:`~certbot_apache._internal.obj.VirtualHost`
:returns: The unique ID for vhost
:rtype: str or None
@@ -1584,9 +1606,9 @@ class ApacheConfigurator(augeas_configurator.AugeasConfigurator):
:param str domain: domain to enhance
:param str enhancement: enhancement type defined in
- :const:`~certbot.constants.ENHANCEMENTS`
+ :const:`~certbot.plugins.enhancements.ENHANCEMENTS`
:param options: options for the enhancement
- See :const:`~certbot.constants.ENHANCEMENTS`
+ See :const:`~certbot.plugins.enhancements.ENHANCEMENTS`
documentation for appropriate parameter.
:raises .errors.PluginError: If Enhancement is not supported, or if
@@ -1624,7 +1646,7 @@ class ApacheConfigurator(augeas_configurator.AugeasConfigurator):
"""Increase the AutoHSTS max-age value
:param vhost: Virtual host object to modify
- :type vhost: :class:`~certbot_apache.obj.VirtualHost`
+ :type vhost: :class:`~certbot_apache._internal.obj.VirtualHost`
:param str id_str: The unique ID string of VirtualHost
@@ -1645,7 +1667,7 @@ class ApacheConfigurator(augeas_configurator.AugeasConfigurator):
if header_path:
pat = '(?:[ "]|^)(strict-transport-security)(?:[ "]|$)'
for match in header_path:
- if re.search(pat, self.aug.get(match).lower()):
+ if re.search(pat, self.parser.aug.get(match).lower()):
hsts_dirpath = match
if not hsts_dirpath:
err_msg = ("Certbot was unable to find the existing HSTS header "
@@ -1659,7 +1681,7 @@ class ApacheConfigurator(augeas_configurator.AugeasConfigurator):
# Our match statement was for string strict-transport-security, but
# we need to update the value instead. The next index is for the value
hsts_dirpath = hsts_dirpath.replace("arg[3]", "arg[4]")
- self.aug.set(hsts_dirpath, hsts_maxage)
+ self.parser.aug.set(hsts_dirpath, hsts_maxage)
note_msg = ("Increasing HSTS max-age value to {0} for VirtualHost "
"in {1}\n".format(nextstep_value, vhost.filep))
logger.debug(note_msg)
@@ -1708,13 +1730,13 @@ class ApacheConfigurator(augeas_configurator.AugeasConfigurator):
.. note:: This function saves the configuration
:param ssl_vhost: Destination of traffic, an ssl enabled vhost
- :type ssl_vhost: :class:`~certbot_apache.obj.VirtualHost`
+ :type ssl_vhost: :class:`~certbot_apache._internal.obj.VirtualHost`
:param unused_options: Not currently used
:type unused_options: Not Available
:returns: Success, general_vhost (HTTP vhost)
- :rtype: (bool, :class:`~certbot_apache.obj.VirtualHost`)
+ :rtype: (bool, :class:`~certbot_apache._internal.obj.VirtualHost`)
"""
min_apache_ver = (2, 3, 3)
@@ -1741,7 +1763,7 @@ class ApacheConfigurator(augeas_configurator.AugeasConfigurator):
# We'll simply delete the directive, so that we'll have a
# consistent OCSP cache path.
if stapling_cache_aug_path:
- self.aug.remove(
+ self.parser.aug.remove(
re.sub(r"/\w*$", "", stapling_cache_aug_path[0]))
self.parser.add_dir_to_ifmodssl(ssl_vhost_aug_path,
@@ -1764,14 +1786,14 @@ class ApacheConfigurator(augeas_configurator.AugeasConfigurator):
.. note:: This function saves the configuration
:param ssl_vhost: Destination of traffic, an ssl enabled vhost
- :type ssl_vhost: :class:`~certbot_apache.obj.VirtualHost`
+ :type ssl_vhost: :class:`~certbot_apache._internal.obj.VirtualHost`
:param header_substring: string that uniquely identifies a header.
e.g: Strict-Transport-Security, Upgrade-Insecure-Requests.
:type str
:returns: Success, general_vhost (HTTP vhost)
- :rtype: (bool, :class:`~certbot_apache.obj.VirtualHost`)
+ :rtype: (bool, :class:`~certbot_apache._internal.obj.VirtualHost`)
:raises .errors.PluginError: If no viable HTTP host can be created or
set with header header_substring.
@@ -1795,11 +1817,11 @@ class ApacheConfigurator(augeas_configurator.AugeasConfigurator):
ssl_vhost.filep)
def _verify_no_matching_http_header(self, ssl_vhost, header_substring):
- """Checks to see if an there is an existing Header directive that
+ """Checks to see if there is an existing Header directive that
contains the string header_substring.
:param ssl_vhost: vhost to check
- :type vhost: :class:`~certbot_apache.obj.VirtualHost`
+ :type vhost: :class:`~certbot_apache._internal.obj.VirtualHost`
:param header_substring: string that uniquely identifies a header.
e.g: Strict-Transport-Security, Upgrade-Insecure-Requests.
@@ -1818,7 +1840,7 @@ class ApacheConfigurator(augeas_configurator.AugeasConfigurator):
# "Existing Header directive for virtualhost"
pat = '(?:[ "]|^)(%s)(?:[ "]|$)' % (header_substring.lower())
for match in header_path:
- if re.search(pat, self.aug.get(match).lower()):
+ if re.search(pat, self.parser.aug.get(match).lower()):
raise errors.PluginEnhancementAlreadyPresent(
"Existing %s header" % (header_substring))
@@ -1836,7 +1858,7 @@ class ApacheConfigurator(augeas_configurator.AugeasConfigurator):
.. note:: This function saves the configuration
:param ssl_vhost: Destination of traffic, an ssl enabled vhost
- :type ssl_vhost: :class:`~certbot_apache.obj.VirtualHost`
+ :type ssl_vhost: :class:`~certbot_apache._internal.obj.VirtualHost`
:param unused_options: Not currently used
:type unused_options: Not Available
@@ -1911,7 +1933,6 @@ class ApacheConfigurator(augeas_configurator.AugeasConfigurator):
self.parser.add_dir(vhost.path, "RewriteRule",
constants.REWRITE_HTTPS_ARGS)
-
def _verify_no_certbot_redirect(self, vhost):
"""Checks to see if a redirect was already installed by certbot.
@@ -1922,7 +1943,7 @@ class ApacheConfigurator(augeas_configurator.AugeasConfigurator):
delete certbot's old rewrite rules and set the new one instead.
:param vhost: vhost to check
- :type vhost: :class:`~certbot_apache.obj.VirtualHost`
+ :type vhost: :class:`~certbot_apache._internal.obj.VirtualHost`
:raises errors.PluginEnhancementAlreadyPresent: When the exact
certbot redirection WriteRule exists in virtual host.
@@ -1946,11 +1967,11 @@ class ApacheConfigurator(augeas_configurator.AugeasConfigurator):
constants.REWRITE_HTTPS_ARGS_WITH_END]
for dir_path, args_paths in rewrite_args_dict.items():
- arg_vals = [self.aug.get(x) for x in args_paths]
+ arg_vals = [self.parser.aug.get(x) for x in args_paths]
# Search for past redirection rule, delete it, set the new one
if arg_vals in constants.OLD_REWRITE_HTTPS_ARGS:
- self.aug.remove(dir_path)
+ self.parser.aug.remove(dir_path)
self._set_https_redirection_rewrite_rule(vhost)
self.save()
raise errors.PluginEnhancementAlreadyPresent(
@@ -1964,7 +1985,7 @@ class ApacheConfigurator(augeas_configurator.AugeasConfigurator):
"""Checks if there exists a RewriteRule directive in vhost
:param vhost: vhost to check
- :type vhost: :class:`~certbot_apache.obj.VirtualHost`
+ :type vhost: :class:`~certbot_apache._internal.obj.VirtualHost`
:returns: True if a RewriteRule directive exists.
:rtype: bool
@@ -1978,7 +1999,7 @@ class ApacheConfigurator(augeas_configurator.AugeasConfigurator):
"""Checks if a RewriteEngine directive is on
:param vhost: vhost to check
- :type vhost: :class:`~certbot_apache.obj.VirtualHost`
+ :type vhost: :class:`~certbot_apache._internal.obj.VirtualHost`
"""
rewrite_engine_path_list = self.parser.find_dir("RewriteEngine", "on",
@@ -1995,10 +2016,10 @@ class ApacheConfigurator(augeas_configurator.AugeasConfigurator):
"""Creates an http_vhost specifically to redirect for the ssl_vhost.
:param ssl_vhost: ssl vhost
- :type ssl_vhost: :class:`~certbot_apache.obj.VirtualHost`
+ :type ssl_vhost: :class:`~certbot_apache._internal.obj.VirtualHost`
:returns: tuple of the form
- (`success`, :class:`~certbot_apache.obj.VirtualHost`)
+ (`success`, :class:`~certbot_apache._internal.obj.VirtualHost`)
:rtype: tuple
"""
@@ -2006,7 +2027,7 @@ class ApacheConfigurator(augeas_configurator.AugeasConfigurator):
redirect_filepath = self._write_out_redirect(ssl_vhost, text)
- self.aug.load()
+ self.parser.aug.load()
# Make a new vhost data structure and add it to the lists
new_vhost = self._create_vhost(parser.get_aug_path(self._escape(redirect_filepath)))
self.vhosts.append(new_vhost)
@@ -2124,7 +2145,7 @@ class ApacheConfigurator(augeas_configurator.AugeasConfigurator):
of this method where available.
:param vhost: vhost to enable
- :type vhost: :class:`~certbot_apache.obj.VirtualHost`
+ :type vhost: :class:`~certbot_apache._internal.obj.VirtualHost`
:raises .errors.NotSupportedError: If filesystem layout is not
supported.
@@ -2142,7 +2163,7 @@ class ApacheConfigurator(augeas_configurator.AugeasConfigurator):
vhost.enabled = True
return
- def enable_mod(self, mod_name, temp=False): # pylint: disable=unused-argument
+ def enable_mod(self, mod_name, temp=False): # pylint: disable=unused-argument
"""Enables module in Apache.
Both enables and reloads Apache so module is active.
@@ -2179,7 +2200,6 @@ class ApacheConfigurator(augeas_configurator.AugeasConfigurator):
:raises .errors.MisconfigurationError: If reload fails
"""
- error = ""
try:
util.run_script(self.option("restart_cmd"))
except errors.SubprocessError as err:
@@ -2253,7 +2273,7 @@ class ApacheConfigurator(augeas_configurator.AugeasConfigurator):
###########################################################################
def get_chall_pref(self, unused_domain): # pylint: disable=no-self-use
"""Return list of challenge preferences."""
- return [challenges.HTTP01, challenges.TLSSNI01]
+ return [challenges.HTTP01]
def perform(self, achalls):
"""Perform the configuration related challenge.
@@ -2266,20 +2286,15 @@ class ApacheConfigurator(augeas_configurator.AugeasConfigurator):
self._chall_out.update(achalls)
responses = [None] * len(achalls)
http_doer = http_01.ApacheHttp01(self)
- sni_doer = tls_sni_01.ApacheTlsSni01(self)
for i, achall in enumerate(achalls):
# Currently also have chall_doer hold associated index of the
# challenge. This helps to put all of the responses back together
# when they are all complete.
- if isinstance(achall.chall, challenges.HTTP01):
- http_doer.add_chall(achall, i)
- else: # tls-sni-01
- sni_doer.add_chall(achall, i)
+ http_doer.add_chall(achall, i)
http_response = http_doer.perform()
- sni_response = sni_doer.perform()
- if http_response or sni_response:
+ if http_response:
# Must reload in order to activate the challenges.
# Handled here because we may be able to load up other challenge
# types
@@ -2290,7 +2305,6 @@ class ApacheConfigurator(augeas_configurator.AugeasConfigurator):
time.sleep(3)
self._update_responses(responses, http_response, http_doer)
- self._update_responses(responses, sni_response, sni_doer)
return responses
@@ -2325,7 +2339,7 @@ class ApacheConfigurator(augeas_configurator.AugeasConfigurator):
Enable the AutoHSTS enhancement for defined domains
:param _unused_lineage: Certificate lineage object, unused
- :type _unused_lineage: certbot.storage.RenewableCert
+ :type _unused_lineage: certbot._internal.storage.RenewableCert
:param domains: List of domains in certificate to enhance
:type domains: str
@@ -2368,7 +2382,7 @@ class ApacheConfigurator(augeas_configurator.AugeasConfigurator):
"""Do the initial AutoHSTS deployment to a vhost
:param ssl_vhost: The VirtualHost object to deploy the AutoHSTS
- :type ssl_vhost: :class:`~certbot_apache.obj.VirtualHost` or None
+ :type ssl_vhost: :class:`~certbot_apache._internal.obj.VirtualHost` or None
:raises errors.PluginEnhancementAlreadyPresent: When already enhanced
@@ -2450,7 +2464,7 @@ class ApacheConfigurator(augeas_configurator.AugeasConfigurator):
and changes the HSTS max-age to a high value.
:param lineage: Certificate lineage object
- :type lineage: certbot.storage.RenewableCert
+ :type lineage: certbot._internal.storage.RenewableCert
"""
self._autohsts_fetch_state()
if not self._autohsts:
@@ -2495,4 +2509,4 @@ class ApacheConfigurator(augeas_configurator.AugeasConfigurator):
self._autohsts_save_state()
-AutoHSTSEnhancement.register(ApacheConfigurator) # pylint: disable=no-member
+AutoHSTSEnhancement.register(ApacheConfigurator)
diff --git a/certbot-apache/certbot_apache/constants.py b/certbot-apache/certbot_apache/_internal/constants.py
index 23a7b7afd..a37bebac5 100644
--- a/certbot-apache/certbot_apache/constants.py
+++ b/certbot-apache/certbot_apache/_internal/constants.py
@@ -1,6 +1,7 @@
"""Apache plugin constants."""
import pkg_resources
+from certbot.compat import os
MOD_SSL_CONF_DEST = "options-ssl-apache.conf"
"""Name of the mod_ssl config file as saved in `IConfig.config_dir`."""
@@ -9,6 +10,7 @@ MOD_SSL_CONF_DEST = "options-ssl-apache.conf"
UPDATED_MOD_SSL_CONF_DIGEST = ".updated-options-ssl-apache-conf-digest.txt"
"""Name of the hash of the updated or informed mod_ssl_conf as saved in `IConfig.config_dir`."""
+# NEVER REMOVE A SINGLE HASH FROM THIS LIST UNLESS YOU KNOW EXACTLY WHAT YOU ARE DOING!
ALL_SSL_OPTIONS_HASHES = [
'2086bca02db48daf93468332543c60ac6acdb6f0b58c7bfdf578a5d47092f82a',
'4844d36c9a0f587172d9fa10f4f1c9518e3bcfa1947379f155e16a70a728c21a',
@@ -18,11 +20,17 @@ ALL_SSL_OPTIONS_HASHES = [
'cfdd7c18d2025836ea3307399f509cfb1ebf2612c87dd600a65da2a8e2f2797b',
'80720bd171ccdc2e6b917ded340defae66919e4624962396b992b7218a561791',
'c0c022ea6b8a51ecc8f1003d0a04af6c3f2bc1c3ce506b3c2dfc1f11ef931082',
+ '717b0a89f5e4c39b09a42813ac6e747cfbdeb93439499e73f4f70a1fe1473f20',
+ '0fcdc81280cd179a07ec4d29d3595068b9326b455c488de4b09f585d5dafc137',
+ '86cc09ad5415cd6d5f09a947fe2501a9344328b1e8a8b458107ea903e80baa6c',
+ '06675349e457eae856120cdebb564efe546f0b87399f2264baeb41e442c724c7',
+ '5cc003edd93fb9cd03d40c7686495f8f058f485f75b5e764b789245a386e6daf',
+ '007cd497a56a3bb8b6a2c1aeb4997789e7e38992f74e44cc5d13a625a738ac73',
]
"""SHA256 hashes of the contents of previous versions of all versions of MOD_SSL_CONF_SRC"""
AUGEAS_LENS_DIR = pkg_resources.resource_filename(
- "certbot_apache", "augeas_lens")
+ "certbot_apache", os.path.join("_internal", "augeas_lens"))
"""Path to the Augeas lens directory"""
REWRITE_HTTPS_ARGS = [
diff --git a/certbot-apache/certbot_apache/display_ops.py b/certbot-apache/certbot_apache/_internal/display_ops.py
index db1c3cca4..1ae32bb47 100644
--- a/certbot-apache/certbot_apache/display_ops.py
+++ b/certbot-apache/certbot_apache/_internal/display_ops.py
@@ -1,15 +1,13 @@
"""Contains UI methods for Apache operations."""
import logging
-import os
import zope.component
from certbot import errors
from certbot import interfaces
-
+from certbot.compat import os
import certbot.display.util as display_util
-
logger = logging.getLogger(__name__)
@@ -26,7 +24,7 @@ def select_vhost_multiple(vhosts):
return list()
tags_list = [vhost.display_repr()+"\n" for vhost in vhosts]
# Remove the extra newline from the last entry
- if len(tags_list):
+ if tags_list:
tags_list[-1] = tags_list[-1][:-1]
code, names = zope.component.getUtility(interfaces.IDisplay).checklist(
"Which VirtualHosts would you like to install the wildcard certificate for?",
@@ -62,8 +60,7 @@ def select_vhost(domain, vhosts):
code, tag = _vhost_menu(domain, vhosts)
if code == display_util.OK:
return vhosts[tag]
- else:
- return None
+ return None
def _vhost_menu(domain, vhosts):
"""Select an appropriate Apache Vhost.
@@ -80,7 +77,7 @@ def _vhost_menu(domain, vhosts):
if free_chars < 2:
logger.debug("Display size is too small for "
- "certbot_apache.display_ops._vhost_menu()")
+ "certbot_apache._internal.display_ops._vhost_menu()")
# This runs the edge off the screen, but it doesn't cause an "error"
filename_size = 1
disp_name_size = 1
@@ -93,7 +90,7 @@ def _vhost_menu(domain, vhosts):
for vhost in vhosts:
if len(vhost.get_names()) == 1:
disp_name = next(iter(vhost.get_names()))
- elif len(vhost.get_names()) == 0:
+ elif not vhost.get_names():
disp_name = ""
else:
disp_name = "Multiple Names"
diff --git a/certbot-apache/certbot_apache/entrypoint.py b/certbot-apache/certbot_apache/_internal/entrypoint.py
index 6f1443507..d43094976 100644
--- a/certbot-apache/certbot_apache/entrypoint.py
+++ b/certbot-apache/certbot_apache/_internal/entrypoint.py
@@ -1,23 +1,32 @@
""" Entry point for Apache Plugin """
-from certbot import util
+# Pylint does not like disutils.version when running inside a venv.
+# See: https://github.com/PyCQA/pylint/issues/73
+from distutils.version import LooseVersion # pylint: disable=no-name-in-module,import-error
-from certbot_apache import configurator
-from certbot_apache import override_arch
-from certbot_apache import override_darwin
-from certbot_apache import override_debian
-from certbot_apache import override_centos
-from certbot_apache import override_gentoo
-from certbot_apache import override_suse
+from certbot import util
+from certbot_apache._internal import configurator
+from certbot_apache._internal import override_arch
+from certbot_apache._internal import override_centos
+from certbot_apache._internal import override_darwin
+from certbot_apache._internal import override_debian
+from certbot_apache._internal import override_fedora
+from certbot_apache._internal import override_gentoo
+from certbot_apache._internal import override_suse
OVERRIDE_CLASSES = {
"arch": override_arch.ArchConfigurator,
+ "cloudlinux": override_centos.CentOSConfigurator,
"darwin": override_darwin.DarwinConfigurator,
"debian": override_debian.DebianConfigurator,
"ubuntu": override_debian.DebianConfigurator,
"centos": override_centos.CentOSConfigurator,
"centos linux": override_centos.CentOSConfigurator,
- "fedora": override_centos.CentOSConfigurator,
+ "fedora_old": override_centos.CentOSConfigurator,
+ "fedora": override_fedora.FedoraConfigurator,
+ "linuxmint": override_debian.DebianConfigurator,
"ol": override_centos.CentOSConfigurator,
+ "oracle": override_centos.CentOSConfigurator,
+ "redhatenterpriseserver": override_centos.CentOSConfigurator,
"red hat enterprise linux server": override_centos.CentOSConfigurator,
"rhel": override_centos.CentOSConfigurator,
"amazon": override_centos.CentOSConfigurator,
@@ -25,14 +34,24 @@ OVERRIDE_CLASSES = {
"gentoo base system": override_gentoo.GentooConfigurator,
"opensuse": override_suse.OpenSUSEConfigurator,
"suse": override_suse.OpenSUSEConfigurator,
+ "sles": override_suse.OpenSUSEConfigurator,
+ "scientific": override_centos.CentOSConfigurator,
+ "scientific linux": override_centos.CentOSConfigurator,
}
+
def get_configurator():
""" Get correct configurator class based on the OS fingerprint """
- os_info = util.get_os_info()
+ os_name, os_version = util.get_os_info()
+ os_name = os_name.lower()
override_class = None
+
+ # Special case for older Fedora versions
+ if os_name == 'fedora' and LooseVersion(os_version) < LooseVersion('29'):
+ os_name = 'fedora_old'
+
try:
- override_class = OVERRIDE_CLASSES[os_info[0].lower()]
+ override_class = OVERRIDE_CLASSES[os_name]
except KeyError:
# OS not found in the list
os_like = util.get_systemd_os_like()
@@ -45,4 +64,5 @@ def get_configurator():
override_class = configurator.ApacheConfigurator
return override_class
+
ENTRYPOINT = get_configurator()
diff --git a/certbot-apache/certbot_apache/http_01.py b/certbot-apache/certbot_apache/_internal/http_01.py
index 22598baca..c34abc2b4 100644
--- a/certbot-apache/certbot_apache/http_01.py
+++ b/certbot-apache/certbot_apache/_internal/http_01.py
@@ -1,16 +1,19 @@
"""A class that performs HTTP-01 challenges for Apache"""
import logging
-import os
+from acme.magic_typing import List # pylint: disable=unused-import, no-name-in-module
from acme.magic_typing import Set # pylint: disable=unused-import, no-name-in-module
from certbot import errors
+from certbot.compat import filesystem
+from certbot.compat import os
from certbot.plugins import common
-from certbot_apache.obj import VirtualHost # pylint: disable=unused-import
-from certbot_apache.parser import get_aug_path
+from certbot_apache._internal.obj import VirtualHost # pylint: disable=unused-import
+from certbot_apache._internal.parser import get_aug_path
logger = logging.getLogger(__name__)
-class ApacheHttp01(common.TLSSNI01):
+
+class ApacheHttp01(common.ChallengePerformer):
"""Class that performs HTTP-01 challenges within the Apache configurator."""
CONFIG_TEMPLATE22_PRE = """\
@@ -89,15 +92,27 @@ class ApacheHttp01(common.TLSSNI01):
self.configurator.enable_mod(mod, temp=True)
def _mod_config(self):
+ selected_vhosts = [] # type: List[VirtualHost]
+ http_port = str(self.configurator.config.http01_port)
for chall in self.achalls:
- vh = self.configurator.find_best_http_vhost(
- chall.domain, filter_defaults=False,
- port=str(self.configurator.config.http01_port))
- if vh:
- self._set_up_include_directives(vh)
- else:
- for vh in self._relevant_vhosts():
- self._set_up_include_directives(vh)
+ # Search for matching VirtualHosts
+ for vh in self._matching_vhosts(chall.domain):
+ selected_vhosts.append(vh)
+
+ # Ensure that we have one or more VirtualHosts that we can continue
+ # with. (one that listens to port configured with --http-01-port)
+ found = False
+ for vhost in selected_vhosts:
+ if any(a.is_wildcard() or a.get_port() == http_port for a in vhost.addrs):
+ found = True
+
+ if not found:
+ for vh in self._relevant_vhosts():
+ selected_vhosts.append(vh)
+
+ # Add the challenge configuration
+ for vh in selected_vhosts:
+ self._set_up_include_directives(vh)
self.configurator.reverter.register_file_creation(
True, self.challenge_conf_pre)
@@ -121,6 +136,20 @@ class ApacheHttp01(common.TLSSNI01):
with open(self.challenge_conf_post, "w") as new_conf:
new_conf.write(config_text_post)
+ def _matching_vhosts(self, domain):
+ """Return all VirtualHost objects that have the requested domain name or
+ a wildcard name that would match the domain in ServerName or ServerAlias
+ directive.
+ """
+ matching_vhosts = []
+ for vhost in self.configurator.vhosts:
+ if self.configurator.domain_in_names(vhost.get_names(), domain):
+ # domain_in_names also matches the exact names, so no need
+ # to check "domain in vhost.get_names()" explicitly here
+ matching_vhosts.append(vhost)
+
+ return matching_vhosts
+
def _relevant_vhosts(self):
http01_port = str(self.configurator.config.http01_port)
relevant_vhosts = []
@@ -139,8 +168,7 @@ class ApacheHttp01(common.TLSSNI01):
def _set_up_challenges(self):
if not os.path.isdir(self.challenge_dir):
- os.makedirs(self.challenge_dir)
- os.chmod(self.challenge_dir, 0o755)
+ filesystem.makedirs(self.challenge_dir, 0o755)
responses = []
for achall in self.achalls:
@@ -156,7 +184,7 @@ class ApacheHttp01(common.TLSSNI01):
self.configurator.reverter.register_file_creation(True, name)
with open(name, 'wb') as f:
f.write(validation.encode())
- os.chmod(name, 0o644)
+ filesystem.chmod(name, 0o644)
return response
@@ -166,8 +194,8 @@ class ApacheHttp01(common.TLSSNI01):
if vhost not in self.moded_vhosts:
logger.debug(
- "Adding a temporary challenge validation Include for name: %s " +
- "in: %s", vhost.name, vhost.filep)
+ "Adding a temporary challenge validation Include for name: %s in: %s",
+ vhost.name, vhost.filep)
self.configurator.parser.add_dir_beginning(
vhost.path, "Include", self.challenge_conf_pre)
self.configurator.parser.add_dir(
diff --git a/certbot-apache/certbot_apache/obj.py b/certbot-apache/certbot_apache/_internal/obj.py
index 290979f27..8b3aeb376 100644
--- a/certbot-apache/certbot_apache/obj.py
+++ b/certbot-apache/certbot_apache/_internal/obj.py
@@ -1,7 +1,7 @@
"""Module contains classes used by the Apache Configurator."""
import re
-from acme.magic_typing import Set # pylint: disable=unused-import, no-name-in-module
+from acme.magic_typing import Set # pylint: disable=unused-import, no-name-in-module
from certbot.plugins import common
@@ -24,9 +24,9 @@ class Addr(common.Addr):
return not self.__eq__(other)
def __repr__(self):
- return "certbot_apache.obj.Addr(" + repr(self.tup) + ")"
+ return "certbot_apache._internal.obj.Addr(" + repr(self.tup) + ")"
- def __hash__(self):
+ def __hash__(self): # pylint: disable=useless-super-delegation
# Python 3 requires explicit overridden for __hash__ if __eq__ or
# __cmp__ is overridden. See https://bugs.python.org/issue2235
return super(Addr, self).__hash__()
@@ -47,8 +47,7 @@ class Addr(common.Addr):
return 0
elif self.get_addr() == "*":
return 1
- else:
- return 2
+ return 2
def conflicts(self, addr):
r"""Returns if address could conflict with correct function of self.
@@ -99,7 +98,7 @@ class Addr(common.Addr):
return self.get_addr_obj(port)
-class VirtualHost(object): # pylint: disable=too-few-public-methods
+class VirtualHost(object):
"""Represents an Apache Virtualhost.
:ivar str filep: file path of VH
@@ -127,7 +126,6 @@ class VirtualHost(object): # pylint: disable=too-few-public-methods
def __init__(self, filep, path, addrs, ssl, enabled, name=None,
aliases=None, modmacro=False, ancestor=None):
- # pylint: disable=too-many-arguments
"""Initialize a VH."""
self.filep = filep
self.path = path
diff --git a/certbot-apache/certbot_apache/_internal/options-ssl-apache.conf b/certbot-apache/certbot_apache/_internal/options-ssl-apache.conf
new file mode 100644
index 000000000..1a3799628
--- /dev/null
+++ b/certbot-apache/certbot_apache/_internal/options-ssl-apache.conf
@@ -0,0 +1,18 @@
+# This file contains important security parameters. If you modify this file
+# manually, Certbot will be unable to automatically provide future security
+# updates. Instead, Certbot will print and log an error message with a path to
+# the up-to-date file that you will need to refer to when manually updating
+# this file.
+
+SSLEngine on
+
+# Intermediate configuration, tweak to your needs
+SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
+SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
+SSLHonorCipherOrder off
+
+SSLOptions +StrictRequire
+
+# Add vhost name to log entries:
+LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"" vhost_combined
+LogFormat "%v %h %l %u %t \"%r\" %>s %b" vhost_common
diff --git a/certbot-apache/certbot_apache/override_arch.py b/certbot-apache/certbot_apache/_internal/override_arch.py
index c5620e9f9..2765bd238 100644
--- a/certbot-apache/certbot_apache/override_arch.py
+++ b/certbot-apache/certbot_apache/_internal/override_arch.py
@@ -1,11 +1,11 @@
""" Distribution specific override class for Arch Linux """
import pkg_resources
-
import zope.interface
from certbot import interfaces
+from certbot.compat import os
+from certbot_apache._internal import configurator
-from certbot_apache import configurator
@zope.interface.provider(interfaces.IPluginFactory)
class ArchConfigurator(configurator.ApacheConfigurator):
@@ -27,5 +27,5 @@ class ArchConfigurator(configurator.ApacheConfigurator):
handle_sites=False,
challenge_location="/etc/httpd/conf",
MOD_SSL_CONF_SRC=pkg_resources.resource_filename(
- "certbot_apache", "options-ssl-apache.conf")
+ "certbot_apache", os.path.join("_internal", "options-ssl-apache.conf"))
)
diff --git a/certbot-apache/certbot_apache/_internal/override_centos.py b/certbot-apache/certbot_apache/_internal/override_centos.py
new file mode 100644
index 000000000..a3ef2d760
--- /dev/null
+++ b/certbot-apache/certbot_apache/_internal/override_centos.py
@@ -0,0 +1,215 @@
+""" Distribution specific override class for CentOS family (RHEL, Fedora) """
+import logging
+
+import pkg_resources
+import zope.interface
+
+from acme.magic_typing import List # pylint: disable=unused-import, no-name-in-module
+from certbot import errors
+from certbot import interfaces
+from certbot import util
+from certbot.compat import os
+from certbot.errors import MisconfigurationError
+from certbot_apache._internal import apache_util
+from certbot_apache._internal import configurator
+from certbot_apache._internal import parser
+
+logger = logging.getLogger(__name__)
+
+
+@zope.interface.provider(interfaces.IPluginFactory)
+class CentOSConfigurator(configurator.ApacheConfigurator):
+ """CentOS specific ApacheConfigurator override class"""
+
+ OS_DEFAULTS = dict(
+ server_root="/etc/httpd",
+ vhost_root="/etc/httpd/conf.d",
+ vhost_files="*.conf",
+ logs_root="/var/log/httpd",
+ ctl="apachectl",
+ version_cmd=['apachectl', '-v'],
+ restart_cmd=['apachectl', 'graceful'],
+ restart_cmd_alt=['apachectl', 'restart'],
+ conftest_cmd=['apachectl', 'configtest'],
+ enmod=None,
+ dismod=None,
+ le_vhost_ext="-le-ssl.conf",
+ handle_modules=False,
+ handle_sites=False,
+ challenge_location="/etc/httpd/conf.d",
+ MOD_SSL_CONF_SRC=pkg_resources.resource_filename(
+ "certbot_apache", os.path.join("_internal", "options-ssl-apache.conf"))
+ )
+
+ def config_test(self):
+ """
+ Override config_test to mitigate configtest error in vanilla installation
+ of mod_ssl in Fedora. The error is caused by non-existent self-signed
+ certificates referenced by the configuration, that would be autogenerated
+ during the first (re)start of httpd.
+ """
+
+ os_info = util.get_os_info()
+ fedora = os_info[0].lower() == "fedora"
+
+ try:
+ super(CentOSConfigurator, self).config_test()
+ except errors.MisconfigurationError:
+ if fedora:
+ self._try_restart_fedora()
+ else:
+ raise
+
+ def _try_restart_fedora(self):
+ """
+ Tries to restart httpd using systemctl to generate the self signed keypair.
+ """
+
+ try:
+ util.run_script(['systemctl', 'restart', 'httpd'])
+ except errors.SubprocessError as err:
+ raise errors.MisconfigurationError(str(err))
+
+ # Finish with actual config check to see if systemctl restart helped
+ super(CentOSConfigurator, self).config_test()
+
+ def _prepare_options(self):
+ """
+ Override the options dictionary initialization in order to support
+ alternative restart cmd used in CentOS.
+ """
+ super(CentOSConfigurator, self)._prepare_options()
+ self.options["restart_cmd_alt"][0] = self.option("ctl")
+
+ def get_parser(self):
+ """Initializes the ApacheParser"""
+ return CentOSParser(
+ self.option("server_root"), self.option("vhost_root"),
+ self.version, configurator=self)
+
+ def _deploy_cert(self, *args, **kwargs): # pylint: disable=arguments-differ
+ """
+ Override _deploy_cert in order to ensure that the Apache configuration
+ has "LoadModule ssl_module..." before parsing the VirtualHost configuration
+ that was created by Certbot
+ """
+ super(CentOSConfigurator, self)._deploy_cert(*args, **kwargs)
+ if self.version < (2, 4, 0):
+ self._deploy_loadmodule_ssl_if_needed()
+
+ def _deploy_loadmodule_ssl_if_needed(self):
+ """
+ Add "LoadModule ssl_module <pre-existing path>" to main httpd.conf if
+ it doesn't exist there already.
+ """
+
+ loadmods = self.parser.find_dir("LoadModule", "ssl_module", exclude=False)
+
+ correct_ifmods = [] # type: List[str]
+ loadmod_args = [] # type: List[str]
+ loadmod_paths = [] # type: List[str]
+ for m in loadmods:
+ noarg_path = m.rpartition("/")[0]
+ path_args = self.parser.get_all_args(noarg_path)
+ if loadmod_args:
+ if loadmod_args != path_args:
+ msg = ("Certbot encountered multiple LoadModule directives "
+ "for LoadModule ssl_module with differing library paths. "
+ "Please remove or comment out the one(s) that are not in "
+ "use, and run Certbot again.")
+ raise MisconfigurationError(msg)
+ else:
+ loadmod_args = path_args
+
+ if self.parser.not_modssl_ifmodule(noarg_path): # pylint: disable=no-member
+ if self.parser.loc["default"] in noarg_path:
+ # LoadModule already in the main configuration file
+ if ("ifmodule/" in noarg_path.lower() or
+ "ifmodule[1]" in noarg_path.lower()):
+ # It's the first or only IfModule in the file
+ return
+ # Populate the list of known !mod_ssl.c IfModules
+ nodir_path = noarg_path.rpartition("/directive")[0]
+ correct_ifmods.append(nodir_path)
+ else:
+ loadmod_paths.append(noarg_path)
+
+ if not loadmod_args:
+ # Do not try to enable mod_ssl
+ return
+
+ # Force creation as the directive wasn't found from the beginning of
+ # httpd.conf
+ rootconf_ifmod = self.parser.create_ifmod(
+ parser.get_aug_path(self.parser.loc["default"]),
+ "!mod_ssl.c", beginning=True)
+ # parser.get_ifmod returns a path postfixed with "/", remove that
+ self.parser.add_dir(rootconf_ifmod[:-1], "LoadModule", loadmod_args)
+ correct_ifmods.append(rootconf_ifmod[:-1])
+ self.save_notes += "Added LoadModule ssl_module to main configuration.\n"
+
+ # Wrap LoadModule mod_ssl inside of <IfModule !mod_ssl.c> if it's not
+ # configured like this already.
+ for loadmod_path in loadmod_paths:
+ nodir_path = loadmod_path.split("/directive")[0]
+ # Remove the old LoadModule directive
+ self.parser.aug.remove(loadmod_path)
+
+ # Create a new IfModule !mod_ssl.c if not already found on path
+ ssl_ifmod = self.parser.get_ifmod(nodir_path, "!mod_ssl.c",
+ beginning=True)[:-1]
+ if ssl_ifmod not in correct_ifmods:
+ self.parser.add_dir(ssl_ifmod, "LoadModule", loadmod_args)
+ correct_ifmods.append(ssl_ifmod)
+ self.save_notes += ("Wrapped pre-existing LoadModule ssl_module "
+ "inside of <IfModule !mod_ssl> block.\n")
+
+
+class CentOSParser(parser.ApacheParser):
+ """CentOS specific ApacheParser override class"""
+ def __init__(self, *args, **kwargs):
+ # CentOS specific configuration file for Apache
+ self.sysconfig_filep = "/etc/sysconfig/httpd"
+ super(CentOSParser, self).__init__(*args, **kwargs)
+
+ def update_runtime_variables(self):
+ """ Override for update_runtime_variables for custom parsing """
+ # Opportunistic, works if SELinux not enforced
+ super(CentOSParser, self).update_runtime_variables()
+ self.parse_sysconfig_var()
+
+ def parse_sysconfig_var(self):
+ """ Parses Apache CLI options from CentOS configuration file """
+ defines = apache_util.parse_define_file(self.sysconfig_filep, "OPTIONS")
+ for k in defines:
+ self.variables[k] = defines[k]
+
+ def not_modssl_ifmodule(self, path):
+ """Checks if the provided Augeas path has argument !mod_ssl"""
+
+ if "ifmodule" not in path.lower():
+ return False
+
+ # Trim the path to the last ifmodule
+ workpath = path.lower()
+ while workpath:
+ # Get path to the last IfModule (ignore the tail)
+ parts = workpath.rpartition("ifmodule")
+
+ if not parts[0]:
+ # IfModule not found
+ break
+ ifmod_path = parts[0] + parts[1]
+ # Check if ifmodule had an index
+ if parts[2].startswith("["):
+ # Append the index from tail
+ ifmod_path += parts[2].partition("/")[0]
+ # Get the original path trimmed to correct length
+ # This is required to preserve cases
+ ifmod_real_path = path[0:len(ifmod_path)]
+ if "!mod_ssl.c" in self.get_all_args(ifmod_real_path):
+ return True
+ # Set the workpath to the heading part
+ workpath = parts[0]
+
+ return False
diff --git a/certbot-apache/certbot_apache/override_darwin.py b/certbot-apache/certbot_apache/_internal/override_darwin.py
index 4e2a6acac..00faff623 100644
--- a/certbot-apache/certbot_apache/override_darwin.py
+++ b/certbot-apache/certbot_apache/_internal/override_darwin.py
@@ -1,11 +1,11 @@
""" Distribution specific override class for macOS """
import pkg_resources
-
import zope.interface
from certbot import interfaces
+from certbot.compat import os
+from certbot_apache._internal import configurator
-from certbot_apache import configurator
@zope.interface.provider(interfaces.IPluginFactory)
class DarwinConfigurator(configurator.ApacheConfigurator):
@@ -27,5 +27,5 @@ class DarwinConfigurator(configurator.ApacheConfigurator):
handle_sites=False,
challenge_location="/etc/apache2/other",
MOD_SSL_CONF_SRC=pkg_resources.resource_filename(
- "certbot_apache", "options-ssl-apache.conf")
+ "certbot_apache", os.path.join("_internal", "options-ssl-apache.conf"))
)
diff --git a/certbot-apache/certbot_apache/override_debian.py b/certbot-apache/certbot_apache/_internal/override_debian.py
index 0caa619d2..77ced6a3f 100644
--- a/certbot-apache/certbot_apache/override_debian.py
+++ b/certbot-apache/certbot_apache/_internal/override_debian.py
@@ -1,19 +1,20 @@
""" Distribution specific override class for Debian family (Ubuntu/Debian) """
import logging
-import os
-import pkg_resources
+import pkg_resources
import zope.interface
from certbot import errors
from certbot import interfaces
from certbot import util
-
-from certbot_apache import apache_util
-from certbot_apache import configurator
+from certbot.compat import filesystem
+from certbot.compat import os
+from certbot_apache._internal import apache_util
+from certbot_apache._internal import configurator
logger = logging.getLogger(__name__)
+
@zope.interface.provider(interfaces.IPluginFactory)
class DebianConfigurator(configurator.ApacheConfigurator):
"""Debian specific ApacheConfigurator override class"""
@@ -34,7 +35,7 @@ class DebianConfigurator(configurator.ApacheConfigurator):
handle_sites=True,
challenge_location="/etc/apache2",
MOD_SSL_CONF_SRC=pkg_resources.resource_filename(
- "certbot_apache", "options-ssl-apache.conf")
+ "certbot_apache", os.path.join("_internal", "options-ssl-apache.conf"))
)
def enable_site(self, vhost):
@@ -44,14 +45,14 @@ class DebianConfigurator(configurator.ApacheConfigurator):
modules are enabled appropriately.
:param vhost: vhost to enable
- :type vhost: :class:`~certbot_apache.obj.VirtualHost`
+ :type vhost: :class:`~certbot_apache._internal.obj.VirtualHost`
:raises .errors.NotSupportedError: If filesystem layout is not
supported.
"""
if vhost.enabled:
- return
+ return None
enabled_path = ("%s/sites-enabled/%s" %
(self.parser.root,
@@ -64,26 +65,25 @@ class DebianConfigurator(configurator.ApacheConfigurator):
try:
os.symlink(vhost.filep, enabled_path)
except OSError as err:
- if os.path.islink(enabled_path) and os.path.realpath(
+ if os.path.islink(enabled_path) and filesystem.realpath(
enabled_path) == vhost.filep:
# Already in shape
vhost.enabled = True
- return
- else:
- logger.warning(
- "Could not symlink %s to %s, got error: %s", enabled_path,
- vhost.filep, err.strerror)
- errstring = ("Encountered error while trying to enable a " +
- "newly created VirtualHost located at {0} by " +
- "linking to it from {1}")
- raise errors.NotSupportedError(errstring.format(vhost.filep,
- enabled_path))
+ return None
+ logger.warning(
+ "Could not symlink %s to %s, got error: %s", enabled_path,
+ vhost.filep, err.strerror)
+ errstring = ("Encountered error while trying to enable a " +
+ "newly created VirtualHost located at {0} by " +
+ "linking to it from {1}")
+ raise errors.NotSupportedError(errstring.format(vhost.filep,
+ enabled_path))
vhost.enabled = True
logger.info("Enabling available site: %s", vhost.filep)
self.save_notes += "Enabled site %s\n" % vhost.filep
+ return None
def enable_mod(self, mod_name, temp=False):
- # pylint: disable=unused-argument
"""Enables module in Apache.
Both enables and reloads Apache so module is active.
diff --git a/certbot-apache/certbot_apache/_internal/override_fedora.py b/certbot-apache/certbot_apache/_internal/override_fedora.py
new file mode 100644
index 000000000..8197b0dcd
--- /dev/null
+++ b/certbot-apache/certbot_apache/_internal/override_fedora.py
@@ -0,0 +1,98 @@
+""" Distribution specific override class for Fedora 29+ """
+import pkg_resources
+import zope.interface
+
+from certbot import errors
+from certbot import interfaces
+from certbot import util
+from certbot.compat import os
+from certbot_apache._internal import apache_util
+from certbot_apache._internal import configurator
+from certbot_apache._internal import parser
+
+
+@zope.interface.provider(interfaces.IPluginFactory)
+class FedoraConfigurator(configurator.ApacheConfigurator):
+ """Fedora 29+ specific ApacheConfigurator override class"""
+
+ OS_DEFAULTS = dict(
+ server_root="/etc/httpd",
+ vhost_root="/etc/httpd/conf.d",
+ vhost_files="*.conf",
+ logs_root="/var/log/httpd",
+ ctl="httpd",
+ version_cmd=['httpd', '-v'],
+ restart_cmd=['apachectl', 'graceful'],
+ restart_cmd_alt=['apachectl', 'restart'],
+ conftest_cmd=['apachectl', 'configtest'],
+ enmod=None,
+ dismod=None,
+ le_vhost_ext="-le-ssl.conf",
+ handle_modules=False,
+ handle_sites=False,
+ challenge_location="/etc/httpd/conf.d",
+ MOD_SSL_CONF_SRC=pkg_resources.resource_filename(
+ # TODO: eventually newest version of Fedora will need their own config
+ "certbot_apache", os.path.join("_internal", "options-ssl-apache.conf"))
+ )
+
+ def config_test(self):
+ """
+ Override config_test to mitigate configtest error in vanilla installation
+ of mod_ssl in Fedora. The error is caused by non-existent self-signed
+ certificates referenced by the configuration, that would be autogenerated
+ during the first (re)start of httpd.
+ """
+ try:
+ super(FedoraConfigurator, self).config_test()
+ except errors.MisconfigurationError:
+ self._try_restart_fedora()
+
+ def get_parser(self):
+ """Initializes the ApacheParser"""
+ return FedoraParser(
+ self.option("server_root"), self.option("vhost_root"),
+ self.version, configurator=self)
+
+ def _try_restart_fedora(self):
+ """
+ Tries to restart httpd using systemctl to generate the self signed keypair.
+ """
+ try:
+ util.run_script(['systemctl', 'restart', 'httpd'])
+ except errors.SubprocessError as err:
+ raise errors.MisconfigurationError(str(err))
+
+ # Finish with actual config check to see if systemctl restart helped
+ super(FedoraConfigurator, self).config_test()
+
+ def _prepare_options(self):
+ """
+ Override the options dictionary initialization to keep using apachectl
+ instead of httpd and so take advantages of this new bash script in newer versions
+ of Fedora to restart httpd.
+ """
+ super(FedoraConfigurator, self)._prepare_options()
+ self.options["restart_cmd"][0] = 'apachectl'
+ self.options["restart_cmd_alt"][0] = 'apachectl'
+ self.options["conftest_cmd"][0] = 'apachectl'
+
+
+class FedoraParser(parser.ApacheParser):
+ """Fedora 29+ specific ApacheParser override class"""
+ def __init__(self, *args, **kwargs):
+ # Fedora 29+ specific configuration file for Apache
+ self.sysconfig_filep = "/etc/sysconfig/httpd"
+ super(FedoraParser, self).__init__(*args, **kwargs)
+
+ def update_runtime_variables(self):
+ """ Override for update_runtime_variables for custom parsing """
+ # Opportunistic, works if SELinux not enforced
+ super(FedoraParser, self).update_runtime_variables()
+ self._parse_sysconfig_var()
+
+ def _parse_sysconfig_var(self):
+ """ Parses Apache CLI options from Fedora configuration file """
+ defines = apache_util.parse_define_file(self.sysconfig_filep, "OPTIONS")
+ for k in defines:
+ self.variables[k] = defines[k]
diff --git a/certbot-apache/certbot_apache/override_gentoo.py b/certbot-apache/certbot_apache/_internal/override_gentoo.py
index 556e3225e..38f8aebe9 100644
--- a/certbot-apache/certbot_apache/override_gentoo.py
+++ b/certbot-apache/certbot_apache/_internal/override_gentoo.py
@@ -1,13 +1,13 @@
""" Distribution specific override class for Gentoo Linux """
import pkg_resources
-
import zope.interface
from certbot import interfaces
+from certbot.compat import os
+from certbot_apache._internal import apache_util
+from certbot_apache._internal import configurator
+from certbot_apache._internal import parser
-from certbot_apache import apache_util
-from certbot_apache import configurator
-from certbot_apache import parser
@zope.interface.provider(interfaces.IPluginFactory)
class GentooConfigurator(configurator.ApacheConfigurator):
@@ -30,7 +30,7 @@ class GentooConfigurator(configurator.ApacheConfigurator):
handle_sites=False,
challenge_location="/etc/apache2/vhosts.d",
MOD_SSL_CONF_SRC=pkg_resources.resource_filename(
- "certbot_apache", "options-ssl-apache.conf")
+ "certbot_apache", os.path.join("_internal", "options-ssl-apache.conf"))
)
def _prepare_options(self):
@@ -44,7 +44,7 @@ class GentooConfigurator(configurator.ApacheConfigurator):
def get_parser(self):
"""Initializes the ApacheParser"""
return GentooParser(
- self.aug, self.option("server_root"), self.option("vhost_root"),
+ self.option("server_root"), self.option("vhost_root"),
self.version, configurator=self)
@@ -64,7 +64,7 @@ class GentooParser(parser.ApacheParser):
""" Parses Apache CLI options from Gentoo configuration file """
defines = apache_util.parse_define_file(self.apacheconfig_filep,
"APACHE2_OPTS")
- for k in defines.keys():
+ for k in defines:
self.variables[k] = defines[k]
def update_modules(self):
diff --git a/certbot-apache/certbot_apache/override_suse.py b/certbot-apache/certbot_apache/_internal/override_suse.py
index 3d0043afe..0c9219e6d 100644
--- a/certbot-apache/certbot_apache/override_suse.py
+++ b/certbot-apache/certbot_apache/_internal/override_suse.py
@@ -1,11 +1,11 @@
""" Distribution specific override class for OpenSUSE """
import pkg_resources
-
import zope.interface
from certbot import interfaces
+from certbot.compat import os
+from certbot_apache._internal import configurator
-from certbot_apache import configurator
@zope.interface.provider(interfaces.IPluginFactory)
class OpenSUSEConfigurator(configurator.ApacheConfigurator):
@@ -27,5 +27,5 @@ class OpenSUSEConfigurator(configurator.ApacheConfigurator):
handle_sites=False,
challenge_location="/etc/apache2/vhosts.d",
MOD_SSL_CONF_SRC=pkg_resources.resource_filename(
- "certbot_apache", "options-ssl-apache.conf")
+ "certbot_apache", os.path.join("_internal", "options-ssl-apache.conf"))
)
diff --git a/certbot-apache/certbot_apache/parser.py b/certbot-apache/certbot_apache/_internal/parser.py
index 148f052d0..0703b8fb5 100644
--- a/certbot-apache/certbot_apache/parser.py
+++ b/certbot-apache/certbot_apache/_internal/parser.py
@@ -2,21 +2,23 @@
import copy
import fnmatch
import logging
-import os
import re
import subprocess
import sys
import six
-from acme.magic_typing import Dict, List, Set # pylint: disable=unused-import, no-name-in-module
+from acme.magic_typing import Dict # pylint: disable=unused-import, no-name-in-module
+from acme.magic_typing import List # pylint: disable=unused-import, no-name-in-module
+from acme.magic_typing import Set # pylint: disable=unused-import, no-name-in-module
from certbot import errors
+from certbot.compat import os
+from certbot_apache._internal import constants
logger = logging.getLogger(__name__)
class ApacheParser(object):
- # pylint: disable=too-many-public-methods
"""Class handles the fine details of parsing the Apache Configuration.
.. todo:: Make parsing general... remove sites-available etc...
@@ -31,7 +33,7 @@ class ApacheParser(object):
arg_var_interpreter = re.compile(r"\$\{[^ \}]*}")
fnmatch_chars = set(["*", "?", "\\", "[", "]"])
- def __init__(self, aug, root, vhostroot=None, version=(2, 4),
+ def __init__(self, root, vhostroot=None, version=(2, 4),
configurator=None):
# Note: Order is important here.
@@ -40,11 +42,20 @@ class ApacheParser(object):
# issues with aug.load() after adding new files / defines to parse tree
self.configurator = configurator
+ # Initialize augeas
+ self.aug = None
+ self.init_augeas()
+
+ if not self.check_aug_version():
+ raise errors.NotSupportedError(
+ "Apache plugin support requires libaugeas0 and augeas-lenses "
+ "version 1.2.0 or higher, please make sure you have you have "
+ "those installed.")
+
self.modules = set() # type: Set[str]
self.parser_paths = {} # type: Dict[str, List[str]]
self.variables = {} # type: Dict[str, str]
- self.aug = aug
# Find configuration root and make sure augeas can parse it.
self.root = os.path.abspath(root)
self.loc = {"root": self._find_config_root()}
@@ -76,6 +87,146 @@ class ApacheParser(object):
if self.find_dir("Define", exclude=False):
raise errors.PluginError("Error parsing runtime variables")
+ def init_augeas(self):
+ """ Initialize the actual Augeas instance """
+
+ try:
+ import augeas
+ except ImportError: # pragma: no cover
+ raise errors.NoInstallationError("Problem in Augeas installation")
+
+ self.aug = augeas.Augeas(
+ # specify a directory to load our preferred lens from
+ loadpath=constants.AUGEAS_LENS_DIR,
+ # Do not save backup (we do it ourselves), do not load
+ # anything by default
+ flags=(augeas.Augeas.NONE |
+ augeas.Augeas.NO_MODL_AUTOLOAD |
+ augeas.Augeas.ENABLE_SPAN))
+
+ def check_parsing_errors(self, lens):
+ """Verify Augeas can parse all of the lens files.
+
+ :param str lens: lens to check for errors
+
+ :raises .errors.PluginError: If there has been an error in parsing with
+ the specified lens.
+
+ """
+ error_files = self.aug.match("/augeas//error")
+
+ for path in error_files:
+ # Check to see if it was an error resulting from the use of
+ # the httpd lens
+ lens_path = self.aug.get(path + "/lens")
+ # As aug.get may return null
+ if lens_path and lens in lens_path:
+ msg = (
+ "There has been an error in parsing the file {0} on line {1}: "
+ "{2}".format(
+ # Strip off /augeas/files and /error
+ path[13:len(path) - 6],
+ self.aug.get(path + "/line"),
+ self.aug.get(path + "/message")))
+ raise errors.PluginError(msg)
+
+ def check_aug_version(self):
+ """ Checks that we have recent enough version of libaugeas.
+ If augeas version is recent enough, it will support case insensitive
+ regexp matching"""
+
+ self.aug.set("/test/path/testing/arg", "aRgUMeNT")
+ try:
+ matches = self.aug.match(
+ "/test//*[self::arg=~regexp('argument', 'i')]")
+ except RuntimeError:
+ self.aug.remove("/test/path")
+ return False
+ self.aug.remove("/test/path")
+ return matches
+
+ def unsaved_files(self):
+ """Lists files that have modified Augeas DOM but the changes have not
+ been written to the filesystem yet, used by `self.save()` and
+ ApacheConfigurator to check the file state.
+
+ :raises .errors.PluginError: If there was an error in Augeas, in
+ an attempt to save the configuration, or an error creating a
+ checkpoint
+
+ :returns: `set` of unsaved files
+ """
+ save_state = self.aug.get("/augeas/save")
+ self.aug.set("/augeas/save", "noop")
+ # Existing Errors
+ ex_errs = self.aug.match("/augeas//error")
+ try:
+ # This is a noop save
+ self.aug.save()
+ except (RuntimeError, IOError):
+ self._log_save_errors(ex_errs)
+ # Erase Save Notes
+ self.configurator.save_notes = ""
+ raise errors.PluginError(
+ "Error saving files, check logs for more info.")
+
+ # Return the original save method
+ self.aug.set("/augeas/save", save_state)
+
+ # Retrieve list of modified files
+ # Note: Noop saves can cause the file to be listed twice, I used a
+ # set to remove this possibility. This is a known augeas 0.10 error.
+ save_paths = self.aug.match("/augeas/events/saved")
+
+ save_files = set()
+ if save_paths:
+ for path in save_paths:
+ save_files.add(self.aug.get(path)[6:])
+ return save_files
+
+ def ensure_augeas_state(self):
+ """Makes sure that all Augeas dom changes are written to files to avoid
+ loss of configuration directives when doing additional augeas parsing,
+ causing a possible augeas.load() resulting dom reset
+ """
+
+ if self.unsaved_files():
+ self.configurator.save_notes += "(autosave)"
+ self.configurator.save()
+
+ def save(self, save_files):
+ """Saves all changes to the configuration files.
+
+ save() is called from ApacheConfigurator to handle the parser specific
+ tasks of saving.
+
+ :param list save_files: list of strings of file paths that we need to save.
+
+ """
+ self.configurator.save_notes = ""
+ self.aug.save()
+
+ # Force reload if files were modified
+ # This is needed to recalculate augeas directive span
+ if save_files:
+ for sf in save_files:
+ self.aug.remove("/files/"+sf)
+ self.aug.load()
+
+ def _log_save_errors(self, ex_errs):
+ """Log errors due to bad Augeas save.
+
+ :param list ex_errs: Existing errors before save
+
+ """
+ # Check for the root of save problems
+ new_errs = self.aug.match("/augeas//error")
+ # logger.error("During Save - %s", mod_conf)
+ logger.error("Unable to save files: %s. Attempted Save Notes: %s",
+ ", ".join(err[13:len(err) - 6] for err in new_errs
+ # Only new errors caused by recent save
+ if err not in ex_errs), self.configurator.save_notes)
+
def add_include(self, main_config, inc_path):
"""Add Include for a new configuration file if one does not exist
@@ -83,7 +234,7 @@ class ApacheParser(object):
:param str inc_path: path of file to include
"""
- if len(self.find_dir(case_i("Include"), inc_path)) == 0:
+ if not self.find_dir(case_i("Include"), inc_path):
logger.debug("Adding Include %s to %s",
inc_path, get_aug_path(main_config))
self.add_dir(
@@ -93,12 +244,7 @@ class ApacheParser(object):
# Add new path to parser paths
new_dir = os.path.dirname(inc_path)
new_file = os.path.basename(inc_path)
- if new_dir in self.existing_paths.keys():
- # Add to existing path
- self.existing_paths[new_dir].append(new_file)
- else:
- # Create a new path
- self.existing_paths[new_dir] = [new_file]
+ self.existing_paths.setdefault(new_dir, []).append(new_file)
def add_mod(self, mod_name):
"""Shortcut for updating parser modules."""
@@ -138,8 +284,8 @@ class ApacheParser(object):
mods.add(mod_name)
mods.add(os.path.basename(mod_filename)[:-2] + "c")
else:
- logger.debug("Could not read LoadModule directive from " +
- "Augeas path: {0}".format(match_name[6:]))
+ logger.debug("Could not read LoadModule directive from Augeas path: %s",
+ match_name[6:])
self.modules.update(mods)
def update_runtime_variables(self):
@@ -229,8 +375,8 @@ class ApacheParser(object):
"Error running command %s for runtime parameters!%s",
command, os.linesep)
raise errors.MisconfigurationError(
- "Error accessing loaded Apache parameters: %s",
- command)
+ "Error accessing loaded Apache parameters: {0}".format(
+ command))
# Small errors that do not impede
if proc.returncode != 0:
logger.warning("Error in checking parameter list: %s", stderr)
@@ -256,12 +402,12 @@ class ApacheParser(object):
"""
filtered = []
if args == 1:
- for i in range(len(matches)):
- if matches[i].endswith("/arg"):
+ for i, match in enumerate(matches):
+ if match.endswith("/arg"):
filtered.append(matches[i][:-4])
else:
- for i in range(len(matches)):
- if matches[i].endswith("/arg[%d]" % args):
+ for i, match in enumerate(matches):
+ if match.endswith("/arg[%d]" % args):
# Make sure we don't cause an IndexError (end of list)
# Check to make sure arg + 1 doesn't exist
if (i == (len(matches) - 1) or
@@ -286,7 +432,7 @@ class ApacheParser(object):
"""
# TODO: Add error checking code... does the path given even exist?
# Does it throw exceptions?
- if_mod_path = self._get_ifmod(aug_conf_path, "mod_ssl.c")
+ if_mod_path = self.get_ifmod(aug_conf_path, "mod_ssl.c")
# IfModule can have only one valid argument, so append after
self.aug.insert(if_mod_path + "arg", "directive", False)
nvh_path = if_mod_path + "directive[1]"
@@ -297,22 +443,54 @@ class ApacheParser(object):
for i, arg in enumerate(args):
self.aug.set("%s/arg[%d]" % (nvh_path, i + 1), arg)
- def _get_ifmod(self, aug_conf_path, mod):
+ def get_ifmod(self, aug_conf_path, mod, beginning=False):
"""Returns the path to <IfMod mod> and creates one if it doesn't exist.
:param str aug_conf_path: Augeas configuration path
:param str mod: module ie. mod_ssl.c
+ :param bool beginning: If the IfModule should be created to the beginning
+ of augeas path DOM tree.
+
+ :returns: Augeas path of the requested IfModule directive that pre-existed
+ or was created during the process. The path may be dynamic,
+ i.e. .../IfModule[last()]
+ :rtype: str
"""
if_mods = self.aug.match(("%s/IfModule/*[self::arg='%s']" %
(aug_conf_path, mod)))
- if len(if_mods) == 0:
- self.aug.set("%s/IfModule[last() + 1]" % aug_conf_path, "")
- self.aug.set("%s/IfModule[last()]/arg" % aug_conf_path, mod)
- if_mods = self.aug.match(("%s/IfModule/*[self::arg='%s']" %
- (aug_conf_path, mod)))
+ if not if_mods:
+ return self.create_ifmod(aug_conf_path, mod, beginning)
+
# Strip off "arg" at end of first ifmod path
- return if_mods[0][:len(if_mods[0]) - 3]
+ return if_mods[0].rpartition("arg")[0]
+
+ def create_ifmod(self, aug_conf_path, mod, beginning=False):
+ """Creates a new <IfMod mod> and returns its path.
+
+ :param str aug_conf_path: Augeas configuration path
+ :param str mod: module ie. mod_ssl.c
+ :param bool beginning: If the IfModule should be created to the beginning
+ of augeas path DOM tree.
+
+ :returns: Augeas path of the newly created IfModule directive.
+ The path may be dynamic, i.e. .../IfModule[last()]
+ :rtype: str
+
+ """
+ if beginning:
+ c_path_arg = "{}/IfModule[1]/arg".format(aug_conf_path)
+ # Insert IfModule before the first directive
+ self.aug.insert("{}/directive[1]".format(aug_conf_path),
+ "IfModule", True)
+ retpath = "{}/IfModule[1]/".format(aug_conf_path)
+ else:
+ c_path = "{}/IfModule[last() + 1]".format(aug_conf_path)
+ c_path_arg = "{}/IfModule[last()]/arg".format(aug_conf_path)
+ self.aug.set(c_path, "")
+ retpath = "{}/IfModule[last()]/".format(aug_conf_path)
+ self.aug.set(c_path_arg, mod)
+ return retpath
def add_dir(self, aug_conf_path, directive, args):
"""Appends directive to the end fo the file given by aug_conf_path.
@@ -447,7 +625,7 @@ class ApacheParser(object):
# https://httpd.apache.org/docs/2.4/mod/core.html#include
for match in matches:
dir_ = self.aug.get(match).lower()
- if dir_ == "include" or dir_ == "includeoptional":
+ if dir_ in ("include", "includeoptional"):
ordered_matches.extend(self.find_dir(
directive, arg,
self._get_include_path(self.get_arg(match + "/arg")),
@@ -458,6 +636,20 @@ class ApacheParser(object):
return ordered_matches
+ def get_all_args(self, match):
+ """
+ Tries to fetch all arguments for a directive. See get_arg.
+
+ Note that if match is an ancestor node, it returns all names of
+ child directives as well as the list of arguments.
+
+ """
+
+ if match[-1] != "/":
+ match = match+"/"
+ allargs = self.aug.match(match + '*')
+ return [self.get_arg(arg) for arg in allargs]
+
def get_arg(self, match):
"""Uses augeas.get to get argument value and interprets result.
@@ -473,8 +665,7 @@ class ApacheParser(object):
# e.g. strip now, not later
if not value:
return None
- else:
- value = value.strip("'\"")
+ value = value.strip("'\"")
variables = ApacheParser.arg_var_interpreter.findall(value)
@@ -573,7 +764,7 @@ class ApacheParser(object):
split_arg = arg.split("/")
for idx, split in enumerate(split_arg):
if any(char in ApacheParser.fnmatch_chars for char in split):
- # Turn it into a augeas regex
+ # Turn it into an augeas regex
# TODO: Can this instead be an augeas glob instead of regex
split_arg[idx] = ("* [label()=~regexp('%s')]" %
self.fnmatch_to_re(split))
@@ -601,9 +792,8 @@ class ApacheParser(object):
if sys.version_info < (3, 6):
# This strips off final /Z(?ms)
return fnmatch.translate(clean_fn_match)[:-7]
- else: # pragma: no cover
- # Since Python 3.6, it returns a different pattern like (?s:.*\.load)\Z
- return fnmatch.translate(clean_fn_match)[4:-3]
+ # Since Python 3.6, it returns a different pattern like (?s:.*\.load)\Z
+ return fnmatch.translate(clean_fn_match)[4:-3] # pragma: no cover
def parse_file(self, filepath):
"""Parse file with Augeas
@@ -617,8 +807,7 @@ class ApacheParser(object):
use_new, remove_old = self._check_path_actions(filepath)
# Ensure that we have the latest Augeas DOM state on disk before
# calling aug.load() which reloads the state from disk
- if self.configurator:
- self.configurator.ensure_augeas_state()
+ self.ensure_augeas_state()
# Test if augeas included file for Httpd.lens
# Note: This works for augeas globs, ie. *.conf
if use_new:
@@ -685,10 +874,7 @@ class ApacheParser(object):
use_new = False
else:
use_new = True
- if new_file_match == "*":
- remove_old = True
- else:
- remove_old = False
+ remove_old = new_file_match == "*"
except KeyError:
use_new = True
remove_old = False
diff --git a/certbot-apache/certbot_apache/augeas_configurator.py b/certbot-apache/certbot_apache/augeas_configurator.py
deleted file mode 100644
index a32c65c41..000000000
--- a/certbot-apache/certbot_apache/augeas_configurator.py
+++ /dev/null
@@ -1,207 +0,0 @@
-"""Class of Augeas Configurators."""
-import logging
-
-
-from certbot import errors
-from certbot.plugins import common
-
-from certbot_apache import constants
-
-logger = logging.getLogger(__name__)
-
-
-class AugeasConfigurator(common.Installer):
- """Base Augeas Configurator class.
-
- :ivar config: Configuration.
- :type config: :class:`~certbot.interfaces.IConfig`
-
- :ivar aug: Augeas object
- :type aug: :class:`augeas.Augeas`
-
- :ivar str save_notes: Human-readable configuration change notes
- :ivar reverter: saves and reverts checkpoints
- :type reverter: :class:`certbot.reverter.Reverter`
-
- """
- def __init__(self, *args, **kwargs):
- super(AugeasConfigurator, self).__init__(*args, **kwargs)
-
- # Placeholder for augeas
- self.aug = None
-
- self.save_notes = ""
-
-
- def init_augeas(self):
- """ Initialize the actual Augeas instance """
- import augeas
- self.aug = augeas.Augeas(
- # specify a directory to load our preferred lens from
- loadpath=constants.AUGEAS_LENS_DIR,
- # Do not save backup (we do it ourselves), do not load
- # anything by default
- flags=(augeas.Augeas.NONE |
- augeas.Augeas.NO_MODL_AUTOLOAD |
- augeas.Augeas.ENABLE_SPAN))
- # See if any temporary changes need to be recovered
- # This needs to occur before VirtualHost objects are setup...
- # because this will change the underlying configuration and potential
- # vhosts
- self.recovery_routine()
-
- def check_parsing_errors(self, lens):
- """Verify Augeas can parse all of the lens files.
-
- :param str lens: lens to check for errors
-
- :raises .errors.PluginError: If there has been an error in parsing with
- the specified lens.
-
- """
- error_files = self.aug.match("/augeas//error")
-
- for path in error_files:
- # Check to see if it was an error resulting from the use of
- # the httpd lens
- lens_path = self.aug.get(path + "/lens")
- # As aug.get may return null
- if lens_path and lens in lens_path:
- msg = (
- "There has been an error in parsing the file {0} on line {1}: "
- "{2}".format(
- # Strip off /augeas/files and /error
- path[13:len(path) - 6],
- self.aug.get(path + "/line"),
- self.aug.get(path + "/message")))
- raise errors.PluginError(msg)
-
- def ensure_augeas_state(self):
- """Makes sure that all Augeas dom changes are written to files to avoid
- loss of configuration directives when doing additional augeas parsing,
- causing a possible augeas.load() resulting dom reset
- """
-
- if self.unsaved_files():
- self.save_notes += "(autosave)"
- self.save()
-
- def unsaved_files(self):
- """Lists files that have modified Augeas DOM but the changes have not
- been written to the filesystem yet, used by `self.save()` and
- ApacheConfigurator to check the file state.
-
- :raises .errors.PluginError: If there was an error in Augeas, in
- an attempt to save the configuration, or an error creating a
- checkpoint
-
- :returns: `set` of unsaved files
- """
- save_state = self.aug.get("/augeas/save")
- self.aug.set("/augeas/save", "noop")
- # Existing Errors
- ex_errs = self.aug.match("/augeas//error")
- try:
- # This is a noop save
- self.aug.save()
- except (RuntimeError, IOError):
- self._log_save_errors(ex_errs)
- # Erase Save Notes
- self.save_notes = ""
- raise errors.PluginError(
- "Error saving files, check logs for more info.")
-
- # Return the original save method
- self.aug.set("/augeas/save", save_state)
-
- # Retrieve list of modified files
- # Note: Noop saves can cause the file to be listed twice, I used a
- # set to remove this possibility. This is a known augeas 0.10 error.
- save_paths = self.aug.match("/augeas/events/saved")
-
- save_files = set()
- if save_paths:
- for path in save_paths:
- save_files.add(self.aug.get(path)[6:])
- return save_files
-
- def save(self, title=None, temporary=False):
- """Saves all changes to the configuration files.
-
- This function first checks for save errors, if none are found,
- all configuration changes made will be saved. According to the
- function parameters. If an exception is raised, a new checkpoint
- was not created.
-
- :param str title: The title of the save. If a title is given, the
- configuration will be saved as a new checkpoint and put in a
- timestamped directory.
-
- :param bool temporary: Indicates whether the changes made will
- be quickly reversed in the future (ie. challenges)
-
- """
- save_files = self.unsaved_files()
- if save_files:
- self.add_to_checkpoint(save_files,
- self.save_notes, temporary=temporary)
-
- self.save_notes = ""
- self.aug.save()
-
- # Force reload if files were modified
- # This is needed to recalculate augeas directive span
- if save_files:
- for sf in save_files:
- self.aug.remove("/files/"+sf)
- self.aug.load()
- if title and not temporary:
- self.finalize_checkpoint(title)
-
- def _log_save_errors(self, ex_errs):
- """Log errors due to bad Augeas save.
-
- :param list ex_errs: Existing errors before save
-
- """
- # Check for the root of save problems
- new_errs = self.aug.match("/augeas//error")
- # logger.error("During Save - %s", mod_conf)
- logger.error("Unable to save files: %s. Attempted Save Notes: %s",
- ", ".join(err[13:len(err) - 6] for err in new_errs
- # Only new errors caused by recent save
- if err not in ex_errs), self.save_notes)
-
- # Wrapper functions for Reverter class
- def recovery_routine(self):
- """Revert all previously modified files.
-
- Reverts all modified files that have not been saved as a checkpoint
-
- :raises .errors.PluginError: If unable to recover the configuration
-
- """
- super(AugeasConfigurator, self).recovery_routine()
- # Need to reload configuration after these changes take effect
- self.aug.load()
-
- def revert_challenge_config(self):
- """Used to cleanup challenge configurations.
-
- :raises .errors.PluginError: If unable to revert the challenge config.
-
- """
- self.revert_temporary_config()
- self.aug.load()
-
- def rollback_checkpoints(self, rollback=1):
- """Rollback saved checkpoints.
-
- :param int rollback: Number of checkpoints to revert
-
- :raises .errors.PluginError: If there is a problem with the input or
- the function is unable to correctly revert the configuration
-
- """
- super(AugeasConfigurator, self).rollback_checkpoints(rollback)
- self.aug.load()
diff --git a/certbot-apache/certbot_apache/centos-options-ssl-apache.conf b/certbot-apache/certbot_apache/centos-options-ssl-apache.conf
deleted file mode 100644
index 56c946a4e..000000000
--- a/certbot-apache/certbot_apache/centos-options-ssl-apache.conf
+++ /dev/null
@@ -1,25 +0,0 @@
-# This file contains important security parameters. If you modify this file
-# manually, Certbot will be unable to automatically provide future security
-# updates. Instead, Certbot will print and log an error message with a path to
-# the up-to-date file that you will need to refer to when manually updating
-# this file.
-
-SSLEngine on
-
-# Intermediate configuration, tweak to your needs
-SSLProtocol all -SSLv2 -SSLv3
-SSLCipherSuite ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS
-SSLHonorCipherOrder on
-
-SSLOptions +StrictRequire
-
-# Add vhost name to log entries:
-LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"" vhost_combined
-LogFormat "%v %h %l %u %t \"%r\" %>s %b" vhost_common
-
-#CustomLog /var/log/apache2/access.log vhost_combined
-#LogLevel warn
-#ErrorLog /var/log/apache2/error.log
-
-# Always ensure Cookies have "Secure" set (JAH 2012/1)
-#Header edit Set-Cookie (?i)^(.*)(;\s*secure)??((\s*;)?(.*)) "$1; Secure$3$4"
diff --git a/certbot-apache/certbot_apache/options-ssl-apache.conf b/certbot-apache/certbot_apache/options-ssl-apache.conf
deleted file mode 100644
index 8113ee81e..000000000
--- a/certbot-apache/certbot_apache/options-ssl-apache.conf
+++ /dev/null
@@ -1,26 +0,0 @@
-# This file contains important security parameters. If you modify this file
-# manually, Certbot will be unable to automatically provide future security
-# updates. Instead, Certbot will print and log an error message with a path to
-# the up-to-date file that you will need to refer to when manually updating
-# this file.
-
-SSLEngine on
-
-# Intermediate configuration, tweak to your needs
-SSLProtocol all -SSLv2 -SSLv3
-SSLCipherSuite ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS
-SSLHonorCipherOrder on
-SSLCompression off
-
-SSLOptions +StrictRequire
-
-# Add vhost name to log entries:
-LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"" vhost_combined
-LogFormat "%v %h %l %u %t \"%r\" %>s %b" vhost_common
-
-#CustomLog /var/log/apache2/access.log vhost_combined
-#LogLevel warn
-#ErrorLog /var/log/apache2/error.log
-
-# Always ensure Cookies have "Secure" set (JAH 2012/1)
-#Header edit Set-Cookie (?i)^(.*)(;\s*secure)??((\s*;)?(.*)) "$1; Secure$3$4"
diff --git a/certbot-apache/certbot_apache/override_centos.py b/certbot-apache/certbot_apache/override_centos.py
deleted file mode 100644
index a4f1b84ec..000000000
--- a/certbot-apache/certbot_apache/override_centos.py
+++ /dev/null
@@ -1,68 +0,0 @@
-""" Distribution specific override class for CentOS family (RHEL, Fedora) """
-import pkg_resources
-
-import zope.interface
-
-from certbot import interfaces
-
-from certbot_apache import apache_util
-from certbot_apache import configurator
-from certbot_apache import parser
-
-@zope.interface.provider(interfaces.IPluginFactory)
-class CentOSConfigurator(configurator.ApacheConfigurator):
- """CentOS specific ApacheConfigurator override class"""
-
- OS_DEFAULTS = dict(
- server_root="/etc/httpd",
- vhost_root="/etc/httpd/conf.d",
- vhost_files="*.conf",
- logs_root="/var/log/httpd",
- ctl="apachectl",
- version_cmd=['apachectl', '-v'],
- restart_cmd=['apachectl', 'graceful'],
- restart_cmd_alt=['apachectl', 'restart'],
- conftest_cmd=['apachectl', 'configtest'],
- enmod=None,
- dismod=None,
- le_vhost_ext="-le-ssl.conf",
- handle_modules=False,
- handle_sites=False,
- challenge_location="/etc/httpd/conf.d",
- MOD_SSL_CONF_SRC=pkg_resources.resource_filename(
- "certbot_apache", "centos-options-ssl-apache.conf")
- )
-
- def _prepare_options(self):
- """
- Override the options dictionary initialization in order to support
- alternative restart cmd used in CentOS.
- """
- super(CentOSConfigurator, self)._prepare_options()
- self.options["restart_cmd_alt"][0] = self.option("ctl")
-
- def get_parser(self):
- """Initializes the ApacheParser"""
- return CentOSParser(
- self.aug, self.option("server_root"), self.option("vhost_root"),
- self.version, configurator=self)
-
-
-class CentOSParser(parser.ApacheParser):
- """CentOS specific ApacheParser override class"""
- def __init__(self, *args, **kwargs):
- # CentOS specific configuration file for Apache
- self.sysconfig_filep = "/etc/sysconfig/httpd"
- super(CentOSParser, self).__init__(*args, **kwargs)
-
- def update_runtime_variables(self):
- """ Override for update_runtime_variables for custom parsing """
- # Opportunistic, works if SELinux not enforced
- super(CentOSParser, self).update_runtime_variables()
- self.parse_sysconfig_var()
-
- def parse_sysconfig_var(self):
- """ Parses Apache CLI options from CentOS configuration file """
- defines = apache_util.parse_define_file(self.sysconfig_filep, "OPTIONS")
- for k in defines.keys():
- self.variables[k] = defines[k]
diff --git a/certbot-apache/certbot_apache/tests/__init__.py b/certbot-apache/certbot_apache/tests/__init__.py
deleted file mode 100644
index 7e7d39fa4..000000000
--- a/certbot-apache/certbot_apache/tests/__init__.py
+++ /dev/null
@@ -1 +0,0 @@
-"""Certbot Apache Tests"""
diff --git a/certbot-apache/certbot_apache/tests/tls_sni_01_test.py b/certbot-apache/certbot_apache/tests/tls_sni_01_test.py
deleted file mode 100644
index 8cea97f04..000000000
--- a/certbot-apache/certbot_apache/tests/tls_sni_01_test.py
+++ /dev/null
@@ -1,151 +0,0 @@
-"""Test for certbot_apache.tls_sni_01."""
-import shutil
-import unittest
-
-import mock
-
-from certbot import errors
-from certbot.plugins import common_test
-
-from certbot_apache import obj
-from certbot_apache.tests import util
-
-from six.moves import xrange # pylint: disable=redefined-builtin, import-error
-
-
-class TlsSniPerformTest(util.ApacheTest):
- """Test the ApacheTlsSni01 challenge."""
-
- auth_key = common_test.AUTH_KEY
- achalls = common_test.ACHALLS
-
- def setUp(self): # pylint: disable=arguments-differ
- super(TlsSniPerformTest, self).setUp()
-
- config = util.get_apache_configurator(
- self.config_path, self.vhost_path, self.config_dir,
- self.work_dir)
- config.config.tls_sni_01_port = 443
-
- from certbot_apache import tls_sni_01
- self.sni = tls_sni_01.ApacheTlsSni01(config)
-
- def tearDown(self):
- shutil.rmtree(self.temp_dir)
- shutil.rmtree(self.config_dir)
- shutil.rmtree(self.work_dir)
-
- def test_perform0(self):
- resp = self.sni.perform()
- self.assertEqual(len(resp), 0)
-
- @mock.patch("certbot.util.exe_exists")
- @mock.patch("certbot.util.run_script")
- def test_perform1(self, _, mock_exists):
- self.sni.configurator.parser.modules.add("socache_shmcb_module")
- self.sni.configurator.parser.modules.add("ssl_module")
-
- mock_exists.return_value = True
- self.sni.configurator.parser.update_runtime_variables = mock.Mock()
-
- achall = self.achalls[0]
- self.sni.add_chall(achall)
- response = self.achalls[0].response(self.auth_key)
- mock_setup_cert = mock.MagicMock(return_value=response)
- # pylint: disable=protected-access
- self.sni._setup_challenge_cert = mock_setup_cert
-
- responses = self.sni.perform()
- mock_setup_cert.assert_called_once_with(achall)
-
- # Check to make sure challenge config path is included in apache config
- self.assertEqual(
- len(self.sni.configurator.parser.find_dir(
- "Include", self.sni.challenge_conf)), 1)
- self.assertEqual(len(responses), 1)
- self.assertEqual(responses[0], response)
-
- def test_perform2(self):
- # Avoid load module
- self.sni.configurator.parser.modules.add("ssl_module")
- self.sni.configurator.parser.modules.add("socache_shmcb_module")
- acme_responses = []
- for achall in self.achalls:
- self.sni.add_chall(achall)
- acme_responses.append(achall.response(self.auth_key))
-
- mock_setup_cert = mock.MagicMock(side_effect=acme_responses)
- # pylint: disable=protected-access
- self.sni._setup_challenge_cert = mock_setup_cert
-
- with mock.patch(
- "certbot_apache.override_debian.DebianConfigurator.enable_mod"):
- sni_responses = self.sni.perform()
-
- self.assertEqual(mock_setup_cert.call_count, 2)
-
- # Make sure calls made to mocked function were correct
- self.assertEqual(
- mock_setup_cert.call_args_list[0], mock.call(self.achalls[0]))
- self.assertEqual(
- mock_setup_cert.call_args_list[1], mock.call(self.achalls[1]))
-
- self.assertEqual(
- len(self.sni.configurator.parser.find_dir(
- "Include", self.sni.challenge_conf)),
- 1)
- self.assertEqual(len(sni_responses), 2)
- for i in xrange(2):
- self.assertEqual(sni_responses[i], acme_responses[i])
-
- def test_mod_config(self):
- z_domains = []
- for achall in self.achalls:
- self.sni.add_chall(achall)
- z_domain = achall.response(self.auth_key).z_domain
- z_domains.append(set([z_domain.decode('ascii')]))
-
- self.sni._mod_config() # pylint: disable=protected-access
- self.sni.configurator.save()
-
- self.sni.configurator.parser.find_dir(
- "Include", self.sni.challenge_conf)
- vh_match = self.sni.configurator.aug.match(
- "/files" + self.sni.challenge_conf + "//VirtualHost")
-
- vhs = []
- for match in vh_match:
- # pylint: disable=protected-access
- vhs.append(self.sni.configurator._create_vhost(match))
- self.assertEqual(len(vhs), 2)
- for vhost in vhs:
- self.assertEqual(vhost.addrs, set([obj.Addr.fromstring("*:443")]))
- names = vhost.get_names()
- self.assertTrue(names in z_domains)
-
- def test_get_addrs_default(self):
- self.sni.configurator.choose_vhost = mock.Mock(
- return_value=obj.VirtualHost(
- "path", "aug_path",
- set([obj.Addr.fromstring("_default_:443")]),
- False, False)
- )
-
- # pylint: disable=protected-access
- self.assertEqual(
- set([obj.Addr.fromstring("*:443")]),
- self.sni._get_addrs(self.achalls[0]))
-
- def test_get_addrs_no_vhost_found(self):
- self.sni.configurator.choose_vhost = mock.Mock(
- side_effect=errors.MissingCommandlineFlag(
- "Failed to run Apache plugin non-interactively"))
-
- # pylint: disable=protected-access
- self.assertEqual(
- set([obj.Addr.fromstring("*:443")]),
- self.sni._get_addrs(self.achalls[0]))
-
-
-if __name__ == "__main__":
- unittest.main() # pragma: no cover
diff --git a/certbot-apache/certbot_apache/tls_sni_01.py b/certbot-apache/certbot_apache/tls_sni_01.py
deleted file mode 100644
index 65230cdcb..000000000
--- a/certbot-apache/certbot_apache/tls_sni_01.py
+++ /dev/null
@@ -1,174 +0,0 @@
-"""A class that performs TLS-SNI-01 challenges for Apache"""
-
-import os
-import logging
-
-from acme.magic_typing import Set # pylint: disable=unused-import, no-name-in-module
-from certbot.plugins import common
-from certbot.errors import PluginError, MissingCommandlineFlag
-
-from certbot_apache import obj
-
-logger = logging.getLogger(__name__)
-
-
-class ApacheTlsSni01(common.TLSSNI01):
- """Class that performs TLS-SNI-01 challenges within the Apache configurator
-
- :ivar configurator: ApacheConfigurator object
- :type configurator: :class:`~apache.configurator.ApacheConfigurator`
-
- :ivar list achalls: Annotated TLS-SNI-01
- (`.KeyAuthorizationAnnotatedChallenge`) challenges.
-
- :param list indices: Meant to hold indices of challenges in a
- larger array. ApacheTlsSni01 is capable of solving many challenges
- at once which causes an indexing issue within ApacheConfigurator
- who must return all responses in order. Imagine ApacheConfigurator
- maintaining state about where all of the http-01 Challenges,
- TLS-SNI-01 Challenges belong in the response array. This is an
- optional utility.
-
- :param str challenge_conf: location of the challenge config file
-
- """
-
- VHOST_TEMPLATE = """\
-<VirtualHost {vhost}>
- ServerName {server_name}
- UseCanonicalName on
- SSLStrictSNIVHostCheck on
-
- LimitRequestBody 1048576
-
- Include {ssl_options_conf_path}
- SSLCertificateFile {cert_path}
- SSLCertificateKeyFile {key_path}
-
- DocumentRoot {document_root}
-</VirtualHost>
-
-"""
-
- def __init__(self, *args, **kwargs):
- super(ApacheTlsSni01, self).__init__(*args, **kwargs)
-
- self.challenge_conf = os.path.join(
- self.configurator.conf("challenge-location"),
- "le_tls_sni_01_cert_challenge.conf")
-
- def perform(self):
- """Perform a TLS-SNI-01 challenge."""
- if not self.achalls:
- return []
- # Save any changes to the configuration as a precaution
- # About to make temporary changes to the config
- self.configurator.save("Changes before challenge setup", True)
-
- # Prepare the server for HTTPS
- self.configurator.prepare_server_https(
- str(self.configurator.config.tls_sni_01_port), True)
-
- responses = []
-
- # Create all of the challenge certs
- for achall in self.achalls:
- responses.append(self._setup_challenge_cert(achall))
-
- # Setup the configuration
- addrs = self._mod_config()
- self.configurator.save("Don't lose mod_config changes", True)
- self.configurator.make_addrs_sni_ready(addrs)
-
- # Save reversible changes
- self.configurator.save("SNI Challenge", True)
-
- return responses
-
- def _mod_config(self):
- """Modifies Apache config files to include challenge vhosts.
-
- Result: Apache config includes virtual servers for issued challs
-
- :returns: All TLS-SNI-01 addresses used
- :rtype: set
-
- """
- addrs = set() # type: Set[obj.Addr]
- config_text = "<IfModule mod_ssl.c>\n"
-
- for achall in self.achalls:
- achall_addrs = self._get_addrs(achall)
- addrs.update(achall_addrs)
-
- config_text += self._get_config_text(achall, achall_addrs)
-
- config_text += "</IfModule>\n"
-
- self.configurator.parser.add_include(
- self.configurator.parser.loc["default"], self.challenge_conf)
- self.configurator.reverter.register_file_creation(
- True, self.challenge_conf)
-
- logger.debug("writing a config file with text:\n %s", config_text)
- with open(self.challenge_conf, "w") as new_conf:
- new_conf.write(config_text)
-
- return addrs
-
- def _get_addrs(self, achall):
- """Return the Apache addresses needed for TLS-SNI-01."""
- # TODO: Checkout _default_ rules.
- addrs = set()
- default_addr = obj.Addr(("*", str(
- self.configurator.config.tls_sni_01_port)))
-
- try:
- vhost = self.configurator.choose_vhost(achall.domain,
- create_if_no_ssl=False)
- except (PluginError, MissingCommandlineFlag):
- # We couldn't find the virtualhost for this domain, possibly
- # because it's a new vhost that's not configured yet
- # (GH #677). See also GH #2600.
- logger.warning("Falling back to default vhost %s...", default_addr)
- addrs.add(default_addr)
- return addrs
-
- for addr in vhost.addrs:
- if "_default_" == addr.get_addr():
- addrs.add(default_addr)
- else:
- addrs.add(
- addr.get_sni_addr(
- self.configurator.config.tls_sni_01_port))
-
- return addrs
-
- def _get_config_text(self, achall, ip_addrs):
- """Chocolate virtual server configuration text
-
- :param .KeyAuthorizationAnnotatedChallenge achall: Annotated
- TLS-SNI-01 challenge.
-
- :param list ip_addrs: addresses of challenged domain
- :class:`list` of type `~.obj.Addr`
-
- :returns: virtual host configuration text
- :rtype: str
-
- """
- ips = " ".join(str(i) for i in ip_addrs)
- document_root = os.path.join(
- self.configurator.config.work_dir, "tls_sni_01_page/")
- # TODO: Python docs is not clear how multiline string literal
- # newlines are parsed on different platforms. At least on
- # Linux (Debian sid), when source file uses CRLF, Python still
- # parses it as "\n"... c.f.:
- # https://docs.python.org/2.7/reference/lexical_analysis.html
- return self.VHOST_TEMPLATE.format(
- vhost=ips,
- server_name=achall.response(achall.account_key).z_domain.decode('ascii'),
- ssl_options_conf_path=self.configurator.mod_ssl_conf,
- cert_path=self.get_cert_path(achall),
- key_path=self.get_key_path(achall),
- document_root=document_root).replace("\n", os.linesep)
diff --git a/certbot-apache/docs/.gitignore b/certbot-apache/docs/.gitignore
deleted file mode 100644
index ba65b13af..000000000
--- a/certbot-apache/docs/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-/_build/
diff --git a/certbot-apache/docs/Makefile b/certbot-apache/docs/Makefile
deleted file mode 100644
index 0e611ecec..000000000
--- a/certbot-apache/docs/Makefile
+++ /dev/null
@@ -1,192 +0,0 @@
-# Makefile for Sphinx documentation
-#
-
-# You can set these variables from the command line.
-SPHINXOPTS =
-SPHINXBUILD = sphinx-build
-PAPER =
-BUILDDIR = _build
-
-# User-friendly check for sphinx-build
-ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1)
-$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/)
-endif
-
-# Internal variables.
-PAPEROPT_a4 = -D latex_paper_size=a4
-PAPEROPT_letter = -D latex_paper_size=letter
-ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
-# the i18n builder cannot share the environment and doctrees with the others
-I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
-
-.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest coverage gettext
-
-help:
- @echo "Please use \`make <target>' where <target> is one of"
- @echo " html to make standalone HTML files"
- @echo " dirhtml to make HTML files named index.html in directories"
- @echo " singlehtml to make a single large HTML file"
- @echo " pickle to make pickle files"
- @echo " json to make JSON files"
- @echo " htmlhelp to make HTML files and a HTML help project"
- @echo " qthelp to make HTML files and a qthelp project"
- @echo " applehelp to make an Apple Help Book"
- @echo " devhelp to make HTML files and a Devhelp project"
- @echo " epub to make an epub"
- @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
- @echo " latexpdf to make LaTeX files and run them through pdflatex"
- @echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx"
- @echo " text to make text files"
- @echo " man to make manual pages"
- @echo " texinfo to make Texinfo files"
- @echo " info to make Texinfo files and run them through makeinfo"
- @echo " gettext to make PO message catalogs"
- @echo " changes to make an overview of all changed/added/deprecated items"
- @echo " xml to make Docutils-native XML files"
- @echo " pseudoxml to make pseudoxml-XML files for display purposes"
- @echo " linkcheck to check all external links for integrity"
- @echo " doctest to run all doctests embedded in the documentation (if enabled)"
- @echo " coverage to run coverage check of the documentation (if enabled)"
-
-clean:
- rm -rf $(BUILDDIR)/*
-
-html:
- $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
- @echo
- @echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
-
-dirhtml:
- $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
- @echo
- @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
-
-singlehtml:
- $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
- @echo
- @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
-
-pickle:
- $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
- @echo
- @echo "Build finished; now you can process the pickle files."
-
-json:
- $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
- @echo
- @echo "Build finished; now you can process the JSON files."
-
-htmlhelp:
- $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
- @echo
- @echo "Build finished; now you can run HTML Help Workshop with the" \
- ".hhp project file in $(BUILDDIR)/htmlhelp."
-
-qthelp:
- $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
- @echo
- @echo "Build finished; now you can run "qcollectiongenerator" with the" \
- ".qhcp project file in $(BUILDDIR)/qthelp, like this:"
- @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/certbot-apache.qhcp"
- @echo "To view the help file:"
- @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/certbot-apache.qhc"
-
-applehelp:
- $(SPHINXBUILD) -b applehelp $(ALLSPHINXOPTS) $(BUILDDIR)/applehelp
- @echo
- @echo "Build finished. The help book is in $(BUILDDIR)/applehelp."
- @echo "N.B. You won't be able to view it unless you put it in" \
- "~/Library/Documentation/Help or install it in your application" \
- "bundle."
-
-devhelp:
- $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
- @echo
- @echo "Build finished."
- @echo "To view the help file:"
- @echo "# mkdir -p $$HOME/.local/share/devhelp/certbot-apache"
- @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/certbot-apache"
- @echo "# devhelp"
-
-epub:
- $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
- @echo
- @echo "Build finished. The epub file is in $(BUILDDIR)/epub."
-
-latex:
- $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
- @echo
- @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
- @echo "Run \`make' in that directory to run these through (pdf)latex" \
- "(use \`make latexpdf' here to do that automatically)."
-
-latexpdf:
- $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
- @echo "Running LaTeX files through pdflatex..."
- $(MAKE) -C $(BUILDDIR)/latex all-pdf
- @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
-
-latexpdfja:
- $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
- @echo "Running LaTeX files through platex and dvipdfmx..."
- $(MAKE) -C $(BUILDDIR)/latex all-pdf-ja
- @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
-
-text:
- $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
- @echo
- @echo "Build finished. The text files are in $(BUILDDIR)/text."
-
-man:
- $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
- @echo
- @echo "Build finished. The manual pages are in $(BUILDDIR)/man."
-
-texinfo:
- $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
- @echo
- @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
- @echo "Run \`make' in that directory to run these through makeinfo" \
- "(use \`make info' here to do that automatically)."
-
-info:
- $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
- @echo "Running Texinfo files through makeinfo..."
- make -C $(BUILDDIR)/texinfo info
- @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."
-
-gettext:
- $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
- @echo
- @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."
-
-changes:
- $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
- @echo
- @echo "The overview file is in $(BUILDDIR)/changes."
-
-linkcheck:
- $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
- @echo
- @echo "Link check complete; look for any errors in the above output " \
- "or in $(BUILDDIR)/linkcheck/output.txt."
-
-doctest:
- $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
- @echo "Testing of doctests in the sources finished, look at the " \
- "results in $(BUILDDIR)/doctest/output.txt."
-
-coverage:
- $(SPHINXBUILD) -b coverage $(ALLSPHINXOPTS) $(BUILDDIR)/coverage
- @echo "Testing of coverage in the sources finished, look at the " \
- "results in $(BUILDDIR)/coverage/python.txt."
-
-xml:
- $(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml
- @echo
- @echo "Build finished. The XML files are in $(BUILDDIR)/xml."
-
-pseudoxml:
- $(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml
- @echo
- @echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml."
diff --git a/certbot-apache/docs/_static/.gitignore b/certbot-apache/docs/_static/.gitignore
deleted file mode 100644
index e69de29bb..000000000
--- a/certbot-apache/docs/_static/.gitignore
+++ /dev/null
diff --git a/certbot-apache/docs/_templates/.gitignore b/certbot-apache/docs/_templates/.gitignore
deleted file mode 100644
index e69de29bb..000000000
--- a/certbot-apache/docs/_templates/.gitignore
+++ /dev/null
diff --git a/certbot-apache/docs/api.rst b/certbot-apache/docs/api.rst
deleted file mode 100644
index 8668ec5d8..000000000
--- a/certbot-apache/docs/api.rst
+++ /dev/null
@@ -1,8 +0,0 @@
-=================
-API Documentation
-=================
-
-.. toctree::
- :glob:
-
- api/**
diff --git a/certbot-apache/docs/api/augeas_configurator.rst b/certbot-apache/docs/api/augeas_configurator.rst
deleted file mode 100644
index b47ffbc6b..000000000
--- a/certbot-apache/docs/api/augeas_configurator.rst
+++ /dev/null
@@ -1,5 +0,0 @@
-:mod:`certbot_apache.augeas_configurator`
----------------------------------------------
-
-.. automodule:: certbot_apache.augeas_configurator
- :members:
diff --git a/certbot-apache/docs/api/configurator.rst b/certbot-apache/docs/api/configurator.rst
deleted file mode 100644
index 8ec266d1a..000000000
--- a/certbot-apache/docs/api/configurator.rst
+++ /dev/null
@@ -1,5 +0,0 @@
-:mod:`certbot_apache.configurator`
---------------------------------------
-
-.. automodule:: certbot_apache.configurator
- :members:
diff --git a/certbot-apache/docs/api/display_ops.rst b/certbot-apache/docs/api/display_ops.rst
deleted file mode 100644
index 26d3ed3dc..000000000
--- a/certbot-apache/docs/api/display_ops.rst
+++ /dev/null
@@ -1,5 +0,0 @@
-:mod:`certbot_apache.display_ops`
--------------------------------------
-
-.. automodule:: certbot_apache.display_ops
- :members:
diff --git a/certbot-apache/docs/api/obj.rst b/certbot-apache/docs/api/obj.rst
deleted file mode 100644
index 82e58df3f..000000000
--- a/certbot-apache/docs/api/obj.rst
+++ /dev/null
@@ -1,5 +0,0 @@
-:mod:`certbot_apache.obj`
------------------------------
-
-.. automodule:: certbot_apache.obj
- :members:
diff --git a/certbot-apache/docs/api/parser.rst b/certbot-apache/docs/api/parser.rst
deleted file mode 100644
index 3427735be..000000000
--- a/certbot-apache/docs/api/parser.rst
+++ /dev/null
@@ -1,5 +0,0 @@
-:mod:`certbot_apache.parser`
---------------------------------
-
-.. automodule:: certbot_apache.parser
- :members:
diff --git a/certbot-apache/docs/api/tls_sni_01.rst b/certbot-apache/docs/api/tls_sni_01.rst
deleted file mode 100644
index 3ecd0a365..000000000
--- a/certbot-apache/docs/api/tls_sni_01.rst
+++ /dev/null
@@ -1,5 +0,0 @@
-:mod:`certbot_apache.tls_sni_01`
-------------------------------------
-
-.. automodule:: certbot_apache.tls_sni_01
- :members:
diff --git a/certbot-apache/docs/conf.py b/certbot-apache/docs/conf.py
deleted file mode 100644
index d2fe15581..000000000
--- a/certbot-apache/docs/conf.py
+++ /dev/null
@@ -1,318 +0,0 @@
-# -*- coding: utf-8 -*-
-#
-# certbot-apache documentation build configuration file, created by
-# sphinx-quickstart on Sun Oct 18 13:39:26 2015.
-#
-# This file is execfile()d with the current directory set to its
-# containing dir.
-#
-# Note that not all possible configuration values are present in this
-# autogenerated file.
-#
-# All configuration values have a default; values that are commented out
-# serve to show the default.
-
-import sys
-import os
-import shlex
-
-import mock
-
-
-# http://docs.readthedocs.org/en/latest/faq.html#i-get-import-errors-on-libraries-that-depend-on-c-modules
-# c.f. #262
-sys.modules.update(
- (mod_name, mock.MagicMock()) for mod_name in ['augeas'])
-
-here = os.path.abspath(os.path.dirname(__file__))
-
-# If extensions (or modules to document with autodoc) are in another directory,
-# add these directories to sys.path here. If the directory is relative to the
-# documentation root, use os.path.abspath to make it absolute, like shown here.
-sys.path.insert(0, os.path.abspath(os.path.join(here, '..')))
-
-# -- General configuration ------------------------------------------------
-
-# If your documentation needs a minimal Sphinx version, state it here.
-needs_sphinx = '1.0'
-
-# Add any Sphinx extension module names here, as strings. They can be
-# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
-# ones.
-extensions = [
- 'sphinx.ext.autodoc',
- 'sphinx.ext.intersphinx',
- 'sphinx.ext.todo',
- 'sphinx.ext.coverage',
- 'sphinx.ext.viewcode',
-]
-
-autodoc_member_order = 'bysource'
-autodoc_default_flags = ['show-inheritance', 'private-members']
-
-# Add any paths that contain templates here, relative to this directory.
-templates_path = ['_templates']
-
-# The suffix(es) of source filenames.
-# You can specify multiple suffix as a list of string:
-# source_suffix = ['.rst', '.md']
-source_suffix = '.rst'
-
-# The encoding of source files.
-#source_encoding = 'utf-8-sig'
-
-# The master toctree document.
-master_doc = 'index'
-
-# General information about the project.
-project = u'certbot-apache'
-copyright = u'2014-2015, Let\'s Encrypt Project'
-author = u'Certbot Project'
-
-# The version info for the project you're documenting, acts as replacement for
-# |version| and |release|, also used in various other places throughout the
-# built documents.
-#
-# The short X.Y version.
-version = '0'
-# The full version, including alpha/beta/rc tags.
-release = '0'
-
-# The language for content autogenerated by Sphinx. Refer to documentation
-# for a list of supported languages.
-#
-# This is also used if you do content translation via gettext catalogs.
-# Usually you set "language" from the command line for these cases.
-language = 'en'
-
-# There are two options for replacing |today|: either, you set today to some
-# non-false value, then it is used:
-#today = ''
-# Else, today_fmt is used as the format for a strftime call.
-#today_fmt = '%B %d, %Y'
-
-# List of patterns, relative to source directory, that match files and
-# directories to ignore when looking for source files.
-exclude_patterns = ['_build']
-
-# The reST default role (used for this markup: `text`) to use for all
-# documents.
-default_role = 'py:obj'
-
-# If true, '()' will be appended to :func: etc. cross-reference text.
-#add_function_parentheses = True
-
-# If true, the current module name will be prepended to all description
-# unit titles (such as .. function::).
-#add_module_names = True
-
-# If true, sectionauthor and moduleauthor directives will be shown in the
-# output. They are ignored by default.
-#show_authors = False
-
-# The name of the Pygments (syntax highlighting) style to use.
-pygments_style = 'sphinx'
-
-# A list of ignored prefixes for module index sorting.
-#modindex_common_prefix = []
-
-# If true, keep warnings as "system message" paragraphs in the built documents.
-#keep_warnings = False
-
-# If true, `todo` and `todoList` produce output, else they produce nothing.
-todo_include_todos = True
-
-
-# -- Options for HTML output ----------------------------------------------
-
-# The theme to use for HTML and HTML Help pages. See the documentation for
-# a list of builtin themes.
-
-# http://docs.readthedocs.org/en/latest/theme.html#how-do-i-use-this-locally-and-on-read-the-docs
-# on_rtd is whether we are on readthedocs.org
-on_rtd = os.environ.get('READTHEDOCS', None) == 'True'
-if not on_rtd: # only import and set the theme if we're building docs locally
- import sphinx_rtd_theme
- html_theme = 'sphinx_rtd_theme'
- html_theme_path = [sphinx_rtd_theme.get_html_theme_path()]
-# otherwise, readthedocs.org uses their theme by default, so no need to specify it
-
-# Theme options are theme-specific and customize the look and feel of a theme
-# further. For a list of options available for each theme, see the
-# documentation.
-#html_theme_options = {}
-
-# Add any paths that contain custom themes here, relative to this directory.
-#html_theme_path = []
-
-# The name for this set of Sphinx documents. If None, it defaults to
-# "<project> v<release> documentation".
-#html_title = None
-
-# A shorter title for the navigation bar. Default is the same as html_title.
-#html_short_title = None
-
-# The name of an image file (relative to this directory) to place at the top
-# of the sidebar.
-#html_logo = None
-
-# The name of an image file (within the static path) to use as favicon of the
-# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
-# pixels large.
-#html_favicon = None
-
-# Add any paths that contain custom static files (such as style sheets) here,
-# relative to this directory. They are copied after the builtin static files,
-# so a file named "default.css" will overwrite the builtin "default.css".
-html_static_path = ['_static']
-
-# Add any extra paths that contain custom files (such as robots.txt or
-# .htaccess) here, relative to this directory. These files are copied
-# directly to the root of the documentation.
-#html_extra_path = []
-
-# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
-# using the given strftime format.
-#html_last_updated_fmt = '%b %d, %Y'
-
-# If true, SmartyPants will be used to convert quotes and dashes to
-# typographically correct entities.
-#html_use_smartypants = True
-
-# Custom sidebar templates, maps document names to template names.
-#html_sidebars = {}
-
-# Additional templates that should be rendered to pages, maps page names to
-# template names.
-#html_additional_pages = {}
-
-# If false, no module index is generated.
-#html_domain_indices = True
-
-# If false, no index is generated.
-#html_use_index = True
-
-# If true, the index is split into individual pages for each letter.
-#html_split_index = False
-
-# If true, links to the reST sources are added to the pages.
-#html_show_sourcelink = True
-
-# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
-#html_show_sphinx = True
-
-# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
-#html_show_copyright = True
-
-# If true, an OpenSearch description file will be output, and all pages will
-# contain a <link> tag referring to it. The value of this option must be the
-# base URL from which the finished HTML is served.
-#html_use_opensearch = ''
-
-# This is the file name suffix for HTML files (e.g. ".xhtml").
-#html_file_suffix = None
-
-# Language to be used for generating the HTML full-text search index.
-# Sphinx supports the following languages:
-# 'da', 'de', 'en', 'es', 'fi', 'fr', 'hu', 'it', 'ja'
-# 'nl', 'no', 'pt', 'ro', 'ru', 'sv', 'tr'
-#html_search_language = 'en'
-
-# A dictionary with options for the search language support, empty by default.
-# Now only 'ja' uses this config value
-#html_search_options = {'type': 'default'}
-
-# The name of a javascript file (relative to the configuration directory) that
-# implements a search results scorer. If empty, the default will be used.
-#html_search_scorer = 'scorer.js'
-
-# Output file base name for HTML help builder.
-htmlhelp_basename = 'certbot-apachedoc'
-
-# -- Options for LaTeX output ---------------------------------------------
-
-latex_elements = {
- # The paper size ('letterpaper' or 'a4paper').
- #'papersize': 'letterpaper',
-
- # The font size ('10pt', '11pt' or '12pt').
- #'pointsize': '10pt',
-
- # Additional stuff for the LaTeX preamble.
- #'preamble': '',
-
- # Latex figure (float) alignment
- #'figure_align': 'htbp',
-}
-
-# Grouping the document tree into LaTeX files. List of tuples
-# (source start file, target name, title,
-# author, documentclass [howto, manual, or own class]).
-latex_documents = [
- (master_doc, 'certbot-apache.tex', u'certbot-apache Documentation',
- u'Certbot Project', 'manual'),
-]
-
-# The name of an image file (relative to this directory) to place at the top of
-# the title page.
-#latex_logo = None
-
-# For "manual" documents, if this is true, then toplevel headings are parts,
-# not chapters.
-#latex_use_parts = False
-
-# If true, show page references after internal links.
-#latex_show_pagerefs = False
-
-# If true, show URL addresses after external links.
-#latex_show_urls = False
-
-# Documents to append as an appendix to all manuals.
-#latex_appendices = []
-
-# If false, no module index is generated.
-#latex_domain_indices = True
-
-
-# -- Options for manual page output ---------------------------------------
-
-# One entry per manual page. List of tuples
-# (source start file, name, description, authors, manual section).
-man_pages = [
- (master_doc, 'certbot-apache', u'certbot-apache Documentation',
- [author], 1)
-]
-
-# If true, show URL addresses after external links.
-#man_show_urls = False
-
-
-# -- Options for Texinfo output -------------------------------------------
-
-# Grouping the document tree into Texinfo files. List of tuples
-# (source start file, target name, title, author,
-# dir menu entry, description, category)
-texinfo_documents = [
- (master_doc, 'certbot-apache', u'certbot-apache Documentation',
- author, 'certbot-apache', 'One line description of project.',
- 'Miscellaneous'),
-]
-
-# Documents to append as an appendix to all manuals.
-#texinfo_appendices = []
-
-# If false, no module index is generated.
-#texinfo_domain_indices = True
-
-# How to display URL addresses: 'footnote', 'no', or 'inline'.
-#texinfo_show_urls = 'footnote'
-
-# If true, do not generate a @detailmenu in the "Top" node's menu.
-#texinfo_no_detailmenu = False
-
-
-intersphinx_mapping = {
- 'python': ('https://docs.python.org/', None),
- 'acme': ('https://acme-python.readthedocs.org/en/latest/', None),
- 'certbot': ('https://certbot.eff.org/docs/', None),
-}
diff --git a/certbot-apache/docs/index.rst b/certbot-apache/docs/index.rst
deleted file mode 100644
index bfe4d245c..000000000
--- a/certbot-apache/docs/index.rst
+++ /dev/null
@@ -1,31 +0,0 @@
-.. certbot-apache documentation master file, created by
- sphinx-quickstart on Sun Oct 18 13:39:26 2015.
- You can adapt this file completely to your liking, but it should at least
- contain the root `toctree` directive.
-
-Welcome to certbot-apache's documentation!
-==============================================
-
-Contents:
-
-.. toctree::
- :maxdepth: 2
-
-
-.. toctree::
- :maxdepth: 1
-
- api
-
-
-.. automodule:: certbot_apache
- :members:
-
-
-Indices and tables
-==================
-
-* :ref:`genindex`
-* :ref:`modindex`
-* :ref:`search`
-
diff --git a/certbot-apache/docs/make.bat b/certbot-apache/docs/make.bat
deleted file mode 100644
index 3a7818940..000000000
--- a/certbot-apache/docs/make.bat
+++ /dev/null
@@ -1,263 +0,0 @@
-@ECHO OFF
-
-REM Command file for Sphinx documentation
-
-if "%SPHINXBUILD%" == "" (
- set SPHINXBUILD=sphinx-build
-)
-set BUILDDIR=_build
-set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% .
-set I18NSPHINXOPTS=%SPHINXOPTS% .
-if NOT "%PAPER%" == "" (
- set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS%
- set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS%
-)
-
-if "%1" == "" goto help
-
-if "%1" == "help" (
- :help
- echo.Please use `make ^<target^>` where ^<target^> is one of
- echo. html to make standalone HTML files
- echo. dirhtml to make HTML files named index.html in directories
- echo. singlehtml to make a single large HTML file
- echo. pickle to make pickle files
- echo. json to make JSON files
- echo. htmlhelp to make HTML files and a HTML help project
- echo. qthelp to make HTML files and a qthelp project
- echo. devhelp to make HTML files and a Devhelp project
- echo. epub to make an epub
- echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter
- echo. text to make text files
- echo. man to make manual pages
- echo. texinfo to make Texinfo files
- echo. gettext to make PO message catalogs
- echo. changes to make an overview over all changed/added/deprecated items
- echo. xml to make Docutils-native XML files
- echo. pseudoxml to make pseudoxml-XML files for display purposes
- echo. linkcheck to check all external links for integrity
- echo. doctest to run all doctests embedded in the documentation if enabled
- echo. coverage to run coverage check of the documentation if enabled
- goto end
-)
-
-if "%1" == "clean" (
- for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i
- del /q /s %BUILDDIR%\*
- goto end
-)
-
-
-REM Check if sphinx-build is available and fallback to Python version if any
-%SPHINXBUILD% 2> nul
-if errorlevel 9009 goto sphinx_python
-goto sphinx_ok
-
-:sphinx_python
-
-set SPHINXBUILD=python -m sphinx.__init__
-%SPHINXBUILD% 2> nul
-if errorlevel 9009 (
- echo.
- echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
- echo.installed, then set the SPHINXBUILD environment variable to point
- echo.to the full path of the 'sphinx-build' executable. Alternatively you
- echo.may add the Sphinx directory to PATH.
- echo.
- echo.If you don't have Sphinx installed, grab it from
- echo.http://sphinx-doc.org/
- exit /b 1
-)
-
-:sphinx_ok
-
-
-if "%1" == "html" (
- %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html
- if errorlevel 1 exit /b 1
- echo.
- echo.Build finished. The HTML pages are in %BUILDDIR%/html.
- goto end
-)
-
-if "%1" == "dirhtml" (
- %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml
- if errorlevel 1 exit /b 1
- echo.
- echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml.
- goto end
-)
-
-if "%1" == "singlehtml" (
- %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml
- if errorlevel 1 exit /b 1
- echo.
- echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml.
- goto end
-)
-
-if "%1" == "pickle" (
- %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle
- if errorlevel 1 exit /b 1
- echo.
- echo.Build finished; now you can process the pickle files.
- goto end
-)
-
-if "%1" == "json" (
- %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json
- if errorlevel 1 exit /b 1
- echo.
- echo.Build finished; now you can process the JSON files.
- goto end
-)
-
-if "%1" == "htmlhelp" (
- %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp
- if errorlevel 1 exit /b 1
- echo.
- echo.Build finished; now you can run HTML Help Workshop with the ^
-.hhp project file in %BUILDDIR%/htmlhelp.
- goto end
-)
-
-if "%1" == "qthelp" (
- %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp
- if errorlevel 1 exit /b 1
- echo.
- echo.Build finished; now you can run "qcollectiongenerator" with the ^
-.qhcp project file in %BUILDDIR%/qthelp, like this:
- echo.^> qcollectiongenerator %BUILDDIR%\qthelp\certbot-apache.qhcp
- echo.To view the help file:
- echo.^> assistant -collectionFile %BUILDDIR%\qthelp\certbot-apache.ghc
- goto end
-)
-
-if "%1" == "devhelp" (
- %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp
- if errorlevel 1 exit /b 1
- echo.
- echo.Build finished.
- goto end
-)
-
-if "%1" == "epub" (
- %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub
- if errorlevel 1 exit /b 1
- echo.
- echo.Build finished. The epub file is in %BUILDDIR%/epub.
- goto end
-)
-
-if "%1" == "latex" (
- %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex
- if errorlevel 1 exit /b 1
- echo.
- echo.Build finished; the LaTeX files are in %BUILDDIR%/latex.
- goto end
-)
-
-if "%1" == "latexpdf" (
- %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex
- cd %BUILDDIR%/latex
- make all-pdf
- cd %~dp0
- echo.
- echo.Build finished; the PDF files are in %BUILDDIR%/latex.
- goto end
-)
-
-if "%1" == "latexpdfja" (
- %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex
- cd %BUILDDIR%/latex
- make all-pdf-ja
- cd %~dp0
- echo.
- echo.Build finished; the PDF files are in %BUILDDIR%/latex.
- goto end
-)
-
-if "%1" == "text" (
- %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text
- if errorlevel 1 exit /b 1
- echo.
- echo.Build finished. The text files are in %BUILDDIR%/text.
- goto end
-)
-
-if "%1" == "man" (
- %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man
- if errorlevel 1 exit /b 1
- echo.
- echo.Build finished. The manual pages are in %BUILDDIR%/man.
- goto end
-)
-
-if "%1" == "texinfo" (
- %SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo
- if errorlevel 1 exit /b 1
- echo.
- echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo.
- goto end
-)
-
-if "%1" == "gettext" (
- %SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale
- if errorlevel 1 exit /b 1
- echo.
- echo.Build finished. The message catalogs are in %BUILDDIR%/locale.
- goto end
-)
-
-if "%1" == "changes" (
- %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes
- if errorlevel 1 exit /b 1
- echo.
- echo.The overview file is in %BUILDDIR%/changes.
- goto end
-)
-
-if "%1" == "linkcheck" (
- %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck
- if errorlevel 1 exit /b 1
- echo.
- echo.Link check complete; look for any errors in the above output ^
-or in %BUILDDIR%/linkcheck/output.txt.
- goto end
-)
-
-if "%1" == "doctest" (
- %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest
- if errorlevel 1 exit /b 1
- echo.
- echo.Testing of doctests in the sources finished, look at the ^
-results in %BUILDDIR%/doctest/output.txt.
- goto end
-)
-
-if "%1" == "coverage" (
- %SPHINXBUILD% -b coverage %ALLSPHINXOPTS% %BUILDDIR%/coverage
- if errorlevel 1 exit /b 1
- echo.
- echo.Testing of coverage in the sources finished, look at the ^
-results in %BUILDDIR%/coverage/python.txt.
- goto end
-)
-
-if "%1" == "xml" (
- %SPHINXBUILD% -b xml %ALLSPHINXOPTS% %BUILDDIR%/xml
- if errorlevel 1 exit /b 1
- echo.
- echo.Build finished. The XML files are in %BUILDDIR%/xml.
- goto end
-)
-
-if "%1" == "pseudoxml" (
- %SPHINXBUILD% -b pseudoxml %ALLSPHINXOPTS% %BUILDDIR%/pseudoxml
- if errorlevel 1 exit /b 1
- echo.
- echo.Build finished. The pseudo-XML files are in %BUILDDIR%/pseudoxml.
- goto end
-)
-
-:end
diff --git a/certbot-apache/local-oldest-requirements.txt b/certbot-apache/local-oldest-requirements.txt
index fd8869f7c..cf61c15a5 100644
--- a/certbot-apache/local-oldest-requirements.txt
+++ b/certbot-apache/local-oldest-requirements.txt
@@ -1,2 +1,3 @@
-acme[dev]==0.25.0
-certbot[dev]==0.26.0
+# Remember to update setup.py to match the package versions below.
+acme[dev]==0.29.0
+certbot[dev]==1.1.0
diff --git a/certbot-apache/readthedocs.org.requirements.txt b/certbot-apache/readthedocs.org.requirements.txt
deleted file mode 100644
index fe30ab1dc..000000000
--- a/certbot-apache/readthedocs.org.requirements.txt
+++ /dev/null
@@ -1,12 +0,0 @@
-# readthedocs.org gives no way to change the install command to "pip
-# install -e .[docs]" (that would in turn install documentation
-# dependencies), but it allows to specify a requirements.txt file at
-# https://readthedocs.org/dashboard/letsencrypt/advanced/ (c.f. #259)
-
-# Although ReadTheDocs certainly doesn't need to install the project
-# in --editable mode (-e), just "pip install .[docs]" does not work as
-# expected and "pip install -e .[docs]" must be used instead
-
--e acme
--e .
--e certbot-apache[docs]
diff --git a/certbot-apache/setup.py b/certbot-apache/setup.py
index 14d6cacb6..f9b85008b 100644
--- a/certbot-apache/setup.py
+++ b/certbot-apache/setup.py
@@ -1,14 +1,16 @@
-from setuptools import setup
-from setuptools import find_packages
+import sys
+from setuptools import find_packages
+from setuptools import setup
+from setuptools.command.test import test as TestCommand
-version = '0.31.0.dev0'
+version = '1.3.0.dev0'
# Remember to update local-oldest-requirements.txt when changing the minimum
# acme/certbot version.
install_requires = [
- 'acme>=0.25.0',
- 'certbot>=0.26.0',
+ 'acme>=0.29.0',
+ 'certbot>=1.1.0',
'mock',
'python-augeas',
'setuptools',
@@ -16,10 +18,21 @@ install_requires = [
'zope.interface',
]
-docs_extras = [
- 'Sphinx>=1.0', # autodoc_member_order = 'bysource', autodoc_default_flags
- 'sphinx_rtd_theme',
-]
+
+class PyTest(TestCommand):
+ user_options = []
+
+ def initialize_options(self):
+ TestCommand.initialize_options(self)
+ self.pytest_args = ''
+
+ def run_tests(self):
+ import shlex
+ # import here, cause outside the eggs aren't loaded
+ import pytest
+ errno = pytest.main(shlex.split(self.pytest_args))
+ sys.exit(errno)
+
setup(
name='certbot-apache',
@@ -29,7 +42,7 @@ setup(
author="Certbot Project",
author_email='client-dev@letsencrypt.org',
license='Apache License 2.0',
- python_requires='>=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*',
+ python_requires='>=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*',
classifiers=[
'Development Status :: 5 - Production/Stable',
'Environment :: Plugins',
@@ -40,10 +53,10 @@ setup(
'Programming Language :: Python :: 2',
'Programming Language :: Python :: 2.7',
'Programming Language :: Python :: 3',
- 'Programming Language :: Python :: 3.4',
'Programming Language :: Python :: 3.5',
'Programming Language :: Python :: 3.6',
'Programming Language :: Python :: 3.7',
+ 'Programming Language :: Python :: 3.8',
'Topic :: Internet :: WWW/HTTP',
'Topic :: Security',
'Topic :: System :: Installation/Setup',
@@ -55,13 +68,12 @@ setup(
packages=find_packages(),
include_package_data=True,
install_requires=install_requires,
- extras_require={
- 'docs': docs_extras,
- },
entry_points={
'certbot.plugins': [
- 'apache = certbot_apache.entrypoint:ENTRYPOINT',
+ 'apache = certbot_apache._internal.entrypoint:ENTRYPOINT',
],
},
test_suite='certbot_apache',
+ tests_require=["pytest"],
+ cmdclass={"test": PyTest},
)
diff --git a/certbot-apache/certbot_apache/tests/apache-conf-files/NEEDED.txt b/certbot-apache/tests/apache-conf-files/NEEDED.txt
index c3606fefe..c3606fefe 100644
--- a/certbot-apache/certbot_apache/tests/apache-conf-files/NEEDED.txt
+++ b/certbot-apache/tests/apache-conf-files/NEEDED.txt
diff --git a/certbot-apache/certbot_apache/tests/apache-conf-files/apache-conf-test b/certbot-apache/tests/apache-conf-files/apache-conf-test
index 4838a6eee..4838a6eee 100755
--- a/certbot-apache/certbot_apache/tests/apache-conf-files/apache-conf-test
+++ b/certbot-apache/tests/apache-conf-files/apache-conf-test
diff --git a/certbot-apache/tests/apache-conf-files/apache-conf-test-pebble.py b/certbot-apache/tests/apache-conf-files/apache-conf-test-pebble.py
new file mode 100755
index 000000000..68bd6287d
--- /dev/null
+++ b/certbot-apache/tests/apache-conf-files/apache-conf-test-pebble.py
@@ -0,0 +1,27 @@
+#!/usr/bin/env python
+"""
+This executable script wraps the apache-conf-test bash script, in order to setup a pebble instance
+before its execution. Directory URL is passed through the SERVER environment variable.
+"""
+import os
+import subprocess
+import sys
+
+from certbot_integration_tests.utils import acme_server
+
+SCRIPT_DIRNAME = os.path.dirname(__file__)
+
+
+def main(args=None):
+ if not args:
+ args = sys.argv[1:]
+ with acme_server.ACMEServer('pebble', [], False) as acme_xdist:
+ environ = os.environ.copy()
+ environ['SERVER'] = acme_xdist['directory_url']
+ command = [os.path.join(SCRIPT_DIRNAME, 'apache-conf-test')]
+ command.extend(args)
+ return subprocess.call(command, env=environ)
+
+
+if __name__ == '__main__':
+ sys.exit(main())
diff --git a/certbot-apache/certbot_apache/tests/apache-conf-files/failing/missing-double-quote-1724.conf b/certbot-apache/tests/apache-conf-files/failing/missing-double-quote-1724.conf
index 7d97b23d0..7d97b23d0 100644
--- a/certbot-apache/certbot_apache/tests/apache-conf-files/failing/missing-double-quote-1724.conf
+++ b/certbot-apache/tests/apache-conf-files/failing/missing-double-quote-1724.conf
diff --git a/certbot-apache/certbot_apache/tests/apache-conf-files/failing/multivhost-1093.conf b/certbot-apache/tests/apache-conf-files/failing/multivhost-1093.conf
index 444f0dade..444f0dade 100644
--- a/certbot-apache/certbot_apache/tests/apache-conf-files/failing/multivhost-1093.conf
+++ b/certbot-apache/tests/apache-conf-files/failing/multivhost-1093.conf
diff --git a/certbot-apache/certbot_apache/tests/apache-conf-files/failing/multivhost-1093b.conf b/certbot-apache/tests/apache-conf-files/failing/multivhost-1093b.conf
index 0388abc2c..0388abc2c 100644
--- a/certbot-apache/certbot_apache/tests/apache-conf-files/failing/multivhost-1093b.conf
+++ b/certbot-apache/tests/apache-conf-files/failing/multivhost-1093b.conf
diff --git a/certbot-apache/certbot_apache/tests/apache-conf-files/passing/1626-1531.conf b/certbot-apache/tests/apache-conf-files/passing/1626-1531.conf
index 1622a57df..1622a57df 100644
--- a/certbot-apache/certbot_apache/tests/apache-conf-files/passing/1626-1531.conf
+++ b/certbot-apache/tests/apache-conf-files/passing/1626-1531.conf
diff --git a/certbot-apache/certbot_apache/tests/apache-conf-files/passing/README.modules b/certbot-apache/tests/apache-conf-files/passing/README.modules
index 32c3ef019..32c3ef019 100644
--- a/certbot-apache/certbot_apache/tests/apache-conf-files/passing/README.modules
+++ b/certbot-apache/tests/apache-conf-files/passing/README.modules
diff --git a/certbot-apache/certbot_apache/tests/apache-conf-files/passing/anarcat-1531.conf b/certbot-apache/tests/apache-conf-files/passing/anarcat-1531.conf
index 73a9b746c..73a9b746c 100644
--- a/certbot-apache/certbot_apache/tests/apache-conf-files/passing/anarcat-1531.conf
+++ b/certbot-apache/tests/apache-conf-files/passing/anarcat-1531.conf
diff --git a/certbot-apache/certbot_apache/tests/apache-conf-files/passing/comment-continuations-2050.conf b/certbot-apache/tests/apache-conf-files/passing/comment-continuations-2050.conf
index 4c3fa2af1..4c3fa2af1 100644
--- a/certbot-apache/certbot_apache/tests/apache-conf-files/passing/comment-continuations-2050.conf
+++ b/certbot-apache/tests/apache-conf-files/passing/comment-continuations-2050.conf
diff --git a/certbot-apache/certbot_apache/tests/apache-conf-files/passing/drupal-errordocument-arg-1724.conf b/certbot-apache/tests/apache-conf-files/passing/drupal-errordocument-arg-1724.conf
index 4733ffa4a..4733ffa4a 100644
--- a/certbot-apache/certbot_apache/tests/apache-conf-files/passing/drupal-errordocument-arg-1724.conf
+++ b/certbot-apache/tests/apache-conf-files/passing/drupal-errordocument-arg-1724.conf
diff --git a/certbot-apache/certbot_apache/tests/apache-conf-files/passing/drupal-htaccess-1531.conf b/certbot-apache/tests/apache-conf-files/passing/drupal-htaccess-1531.conf
index a1aab7a39..a1aab7a39 100644
--- a/certbot-apache/certbot_apache/tests/apache-conf-files/passing/drupal-htaccess-1531.conf
+++ b/certbot-apache/tests/apache-conf-files/passing/drupal-htaccess-1531.conf
diff --git a/certbot-apache/certbot_apache/tests/apache-conf-files/passing/escaped-space-arguments-2735.conf b/certbot-apache/tests/apache-conf-files/passing/escaped-space-arguments-2735.conf
index 1ea53dfab..1ea53dfab 100644
--- a/certbot-apache/certbot_apache/tests/apache-conf-files/passing/escaped-space-arguments-2735.conf
+++ b/certbot-apache/tests/apache-conf-files/passing/escaped-space-arguments-2735.conf
diff --git a/certbot-apache/certbot_apache/tests/apache-conf-files/passing/example-1755.conf b/certbot-apache/tests/apache-conf-files/passing/example-1755.conf
index 260029576..260029576 100644
--- a/certbot-apache/certbot_apache/tests/apache-conf-files/passing/example-1755.conf
+++ b/certbot-apache/tests/apache-conf-files/passing/example-1755.conf
diff --git a/certbot-apache/certbot_apache/tests/apache-conf-files/passing/example-ssl.conf b/certbot-apache/tests/apache-conf-files/passing/example-ssl.conf
index 31deb7647..31deb7647 100644
--- a/certbot-apache/certbot_apache/tests/apache-conf-files/passing/example-ssl.conf
+++ b/certbot-apache/tests/apache-conf-files/passing/example-ssl.conf
diff --git a/certbot-apache/certbot_apache/tests/apache-conf-files/passing/example.conf b/certbot-apache/tests/apache-conf-files/passing/example.conf
index 60bdeead6..60bdeead6 100644
--- a/certbot-apache/certbot_apache/tests/apache-conf-files/passing/example.conf
+++ b/certbot-apache/tests/apache-conf-files/passing/example.conf
diff --git a/certbot-apache/certbot_apache/tests/apache-conf-files/passing/finalize-1243.apache2.conf.txt b/certbot-apache/tests/apache-conf-files/passing/finalize-1243.apache2.conf.txt
index 73dc64223..73dc64223 100644
--- a/certbot-apache/certbot_apache/tests/apache-conf-files/passing/finalize-1243.apache2.conf.txt
+++ b/certbot-apache/tests/apache-conf-files/passing/finalize-1243.apache2.conf.txt
diff --git a/certbot-apache/certbot_apache/tests/apache-conf-files/passing/finalize-1243.conf b/certbot-apache/tests/apache-conf-files/passing/finalize-1243.conf
index 0918e5669..dbfae3765 100644
--- a/certbot-apache/certbot_apache/tests/apache-conf-files/passing/finalize-1243.conf
+++ b/certbot-apache/tests/apache-conf-files/passing/finalize-1243.conf
@@ -1,7 +1,7 @@
#LoadModule ssl_module modules/mod_ssl.so
-Listen 443
-<VirtualHost *:443>
+Listen 4443
+<VirtualHost *:4443>
# The ServerName directive sets the request scheme, hostname and port that
# the server uses to identify itself. This is used when creating
# redirection URLs. In the context of virtual hosts, the ServerName
diff --git a/certbot-apache/certbot_apache/tests/apache-conf-files/passing/graphite-quote-1934.conf b/certbot-apache/tests/apache-conf-files/passing/graphite-quote-1934.conf
index f257dd9a8..f257dd9a8 100644
--- a/certbot-apache/certbot_apache/tests/apache-conf-files/passing/graphite-quote-1934.conf
+++ b/certbot-apache/tests/apache-conf-files/passing/graphite-quote-1934.conf
diff --git a/certbot-apache/certbot_apache/tests/apache-conf-files/passing/ipv6-1143.conf b/certbot-apache/tests/apache-conf-files/passing/ipv6-1143.conf
index ad988dc05..ad988dc05 100644
--- a/certbot-apache/certbot_apache/tests/apache-conf-files/passing/ipv6-1143.conf
+++ b/certbot-apache/tests/apache-conf-files/passing/ipv6-1143.conf
diff --git a/certbot-apache/certbot_apache/tests/apache-conf-files/passing/ipv6-1143b.conf b/certbot-apache/tests/apache-conf-files/passing/ipv6-1143b.conf
index e2b4fd3da..e2b4fd3da 100644
--- a/certbot-apache/certbot_apache/tests/apache-conf-files/passing/ipv6-1143b.conf
+++ b/certbot-apache/tests/apache-conf-files/passing/ipv6-1143b.conf
diff --git a/certbot-apache/certbot_apache/tests/apache-conf-files/passing/ipv6-1143c.conf b/certbot-apache/tests/apache-conf-files/passing/ipv6-1143c.conf
index f2d2ecbea..f2d2ecbea 100644
--- a/certbot-apache/certbot_apache/tests/apache-conf-files/passing/ipv6-1143c.conf
+++ b/certbot-apache/tests/apache-conf-files/passing/ipv6-1143c.conf
diff --git a/certbot-apache/certbot_apache/tests/apache-conf-files/passing/ipv6-1143d.conf b/certbot-apache/tests/apache-conf-files/passing/ipv6-1143d.conf
index f5b7a2b45..f5b7a2b45 100644
--- a/certbot-apache/certbot_apache/tests/apache-conf-files/passing/ipv6-1143d.conf
+++ b/certbot-apache/tests/apache-conf-files/passing/ipv6-1143d.conf
diff --git a/certbot-apache/certbot_apache/tests/apache-conf-files/passing/missing-quote-1724.conf b/certbot-apache/tests/apache-conf-files/passing/missing-quote-1724.conf
index 7d97b23d0..7d97b23d0 100644
--- a/certbot-apache/certbot_apache/tests/apache-conf-files/passing/missing-quote-1724.conf
+++ b/certbot-apache/tests/apache-conf-files/passing/missing-quote-1724.conf
diff --git a/certbot-apache/certbot_apache/tests/apache-conf-files/passing/modmacro-1385.conf b/certbot-apache/tests/apache-conf-files/passing/modmacro-1385.conf
index d327c9421..d327c9421 100644
--- a/certbot-apache/certbot_apache/tests/apache-conf-files/passing/modmacro-1385.conf
+++ b/certbot-apache/tests/apache-conf-files/passing/modmacro-1385.conf
diff --git a/certbot-apache/certbot_apache/tests/apache-conf-files/passing/owncloud-1264.conf b/certbot-apache/tests/apache-conf-files/passing/owncloud-1264.conf
index d0ac81fa3..d0ac81fa3 100644
--- a/certbot-apache/certbot_apache/tests/apache-conf-files/passing/owncloud-1264.conf
+++ b/certbot-apache/tests/apache-conf-files/passing/owncloud-1264.conf
diff --git a/certbot-apache/certbot_apache/tests/apache-conf-files/passing/rewrite-quote-1960.conf b/certbot-apache/tests/apache-conf-files/passing/rewrite-quote-1960.conf
index 26214e7b0..26214e7b0 100644
--- a/certbot-apache/certbot_apache/tests/apache-conf-files/passing/rewrite-quote-1960.conf
+++ b/certbot-apache/tests/apache-conf-files/passing/rewrite-quote-1960.conf
diff --git a/certbot-apache/certbot_apache/tests/apache-conf-files/passing/roundcube-1222.conf b/certbot-apache/tests/apache-conf-files/passing/roundcube-1222.conf
index 72ced7fb3..72ced7fb3 100644
--- a/certbot-apache/certbot_apache/tests/apache-conf-files/passing/roundcube-1222.conf
+++ b/certbot-apache/tests/apache-conf-files/passing/roundcube-1222.conf
diff --git a/certbot-apache/certbot_apache/tests/apache-conf-files/passing/section-continuations-2525.conf b/certbot-apache/tests/apache-conf-files/passing/section-continuations-2525.conf
index 8f65e4773..8f65e4773 100644
--- a/certbot-apache/certbot_apache/tests/apache-conf-files/passing/section-continuations-2525.conf
+++ b/certbot-apache/tests/apache-conf-files/passing/section-continuations-2525.conf
diff --git a/certbot-apache/certbot_apache/tests/apache-conf-files/passing/section-empty-continuations-2731.conf b/certbot-apache/tests/apache-conf-files/passing/section-empty-continuations-2731.conf
index 3f2f96965..3f2f96965 100644
--- a/certbot-apache/certbot_apache/tests/apache-conf-files/passing/section-empty-continuations-2731.conf
+++ b/certbot-apache/tests/apache-conf-files/passing/section-empty-continuations-2731.conf
diff --git a/certbot-apache/certbot_apache/tests/apache-conf-files/passing/semacode-1598.conf b/certbot-apache/tests/apache-conf-files/passing/semacode-1598.conf
index 89e2fb25c..89e2fb25c 100644
--- a/certbot-apache/certbot_apache/tests/apache-conf-files/passing/semacode-1598.conf
+++ b/certbot-apache/tests/apache-conf-files/passing/semacode-1598.conf
diff --git a/certbot-apache/certbot_apache/tests/apache-conf-files/passing/sslrequire-wordlist-1827.htaccess b/certbot-apache/tests/apache-conf-files/passing/sslrequire-wordlist-1827.htaccess
index 1c06d5497..1c06d5497 100644
--- a/certbot-apache/certbot_apache/tests/apache-conf-files/passing/sslrequire-wordlist-1827.htaccess
+++ b/certbot-apache/tests/apache-conf-files/passing/sslrequire-wordlist-1827.htaccess
diff --git a/certbot-apache/certbot_apache/tests/apache-conf-files/passing/two-blocks-one-line-1693.conf b/certbot-apache/tests/apache-conf-files/passing/two-blocks-one-line-1693.conf
index 5d3cef423..5d3cef423 100644
--- a/certbot-apache/certbot_apache/tests/apache-conf-files/passing/two-blocks-one-line-1693.conf
+++ b/certbot-apache/tests/apache-conf-files/passing/two-blocks-one-line-1693.conf
diff --git a/certbot-apache/certbot_apache/tests/autohsts_test.py b/certbot-apache/tests/autohsts_test.py
index bf92a13ff..c9901ecdb 100644
--- a/certbot-apache/certbot_apache/tests/autohsts_test.py
+++ b/certbot-apache/tests/autohsts_test.py
@@ -1,14 +1,14 @@
-# pylint: disable=too-many-public-methods,too-many-lines
-"""Test for certbot_apache.configurator AutoHSTS functionality"""
+# pylint: disable=too-many-lines
+"""Test for certbot_apache._internal.configurator AutoHSTS functionality"""
import re
import unittest
+
import mock
-# six is used in mock.patch()
-import six # pylint: disable=unused-import
+import six # pylint: disable=unused-import # six is used in mock.patch()
from certbot import errors
-from certbot_apache import constants
-from certbot_apache.tests import util
+from certbot_apache._internal import constants
+import util
class AutoHSTSTest(util.ApacheTest):
@@ -35,27 +35,28 @@ class AutoHSTSTest(util.ApacheTest):
pat = '(?:[ "]|^)(strict-transport-security)(?:[ "]|$)'
for head in header_path:
if re.search(pat, self.config.parser.aug.get(head).lower()):
- return self.config.parser.aug.get(head.replace("arg[3]",
- "arg[4]"))
+ return self.config.parser.aug.get(
+ head.replace("arg[3]", "arg[4]"))
+ return None # pragma: no cover
- @mock.patch("certbot_apache.configurator.ApacheConfigurator.restart")
- @mock.patch("certbot_apache.configurator.ApacheConfigurator.enable_mod")
+ @mock.patch("certbot_apache._internal.configurator.ApacheConfigurator.restart")
+ @mock.patch("certbot_apache._internal.configurator.ApacheConfigurator.enable_mod")
def test_autohsts_enable_headers_mod(self, mock_enable, _restart):
self.config.parser.modules.discard("headers_module")
self.config.parser.modules.discard("mod_header.c")
self.config.enable_autohsts(mock.MagicMock(), ["ocspvhost.com"])
self.assertTrue(mock_enable.called)
- @mock.patch("certbot_apache.configurator.ApacheConfigurator.restart")
+ @mock.patch("certbot_apache._internal.configurator.ApacheConfigurator.restart")
def test_autohsts_deploy_already_exists(self, _restart):
self.config.enable_autohsts(mock.MagicMock(), ["ocspvhost.com"])
self.assertRaises(errors.PluginEnhancementAlreadyPresent,
self.config.enable_autohsts,
mock.MagicMock(), ["ocspvhost.com"])
- @mock.patch("certbot_apache.constants.AUTOHSTS_FREQ", 0)
- @mock.patch("certbot_apache.configurator.ApacheConfigurator.restart")
- @mock.patch("certbot_apache.configurator.ApacheConfigurator.prepare")
+ @mock.patch("certbot_apache._internal.constants.AUTOHSTS_FREQ", 0)
+ @mock.patch("certbot_apache._internal.configurator.ApacheConfigurator.restart")
+ @mock.patch("certbot_apache._internal.configurator.ApacheConfigurator.prepare")
def test_autohsts_increase(self, mock_prepare, _mock_restart):
self.config._prepared = False
maxage = "\"max-age={0}\""
@@ -73,8 +74,8 @@ class AutoHSTSTest(util.ApacheTest):
inc_val)
self.assertTrue(mock_prepare.called)
- @mock.patch("certbot_apache.configurator.ApacheConfigurator.restart")
- @mock.patch("certbot_apache.configurator.ApacheConfigurator._autohsts_increase")
+ @mock.patch("certbot_apache._internal.configurator.ApacheConfigurator.restart")
+ @mock.patch("certbot_apache._internal.configurator.ApacheConfigurator._autohsts_increase")
def test_autohsts_increase_noop(self, mock_increase, _restart):
maxage = "\"max-age={0}\""
initial_val = maxage.format(constants.AUTOHSTS_STEPS[0])
@@ -88,8 +89,8 @@ class AutoHSTSTest(util.ApacheTest):
self.assertFalse(mock_increase.called)
- @mock.patch("certbot_apache.configurator.ApacheConfigurator.restart")
- @mock.patch("certbot_apache.constants.AUTOHSTS_FREQ", 0)
+ @mock.patch("certbot_apache._internal.configurator.ApacheConfigurator.restart")
+ @mock.patch("certbot_apache._internal.constants.AUTOHSTS_FREQ", 0)
def test_autohsts_increase_no_header(self, _restart):
self.config.enable_autohsts(mock.MagicMock(), ["ocspvhost.com"])
# Remove the header
@@ -101,8 +102,8 @@ class AutoHSTSTest(util.ApacheTest):
self.config.update_autohsts,
mock.MagicMock())
- @mock.patch("certbot_apache.constants.AUTOHSTS_FREQ", 0)
- @mock.patch("certbot_apache.configurator.ApacheConfigurator.restart")
+ @mock.patch("certbot_apache._internal.constants.AUTOHSTS_FREQ", 0)
+ @mock.patch("certbot_apache._internal.configurator.ApacheConfigurator.restart")
def test_autohsts_increase_and_make_permanent(self, _mock_restart):
maxage = "\"max-age={0}\""
max_val = maxage.format(constants.AUTOHSTS_PERMANENT)
@@ -140,18 +141,18 @@ class AutoHSTSTest(util.ApacheTest):
# Make sure that the execution does not continue when no entries in store
self.assertFalse(self.config.storage.put.called)
- @mock.patch("certbot_apache.display_ops.select_vhost")
+ @mock.patch("certbot_apache._internal.display_ops.select_vhost")
def test_autohsts_no_ssl_vhost(self, mock_select):
mock_select.return_value = self.vh_truth[0]
- with mock.patch("certbot_apache.configurator.logger.warning") as mock_log:
+ with mock.patch("certbot_apache._internal.configurator.logger.warning") as mock_log:
self.assertRaises(errors.PluginError,
self.config.enable_autohsts,
mock.MagicMock(), "invalid.example.com")
self.assertTrue(
"Certbot was not able to find SSL" in mock_log.call_args[0][0])
- @mock.patch("certbot_apache.configurator.ApacheConfigurator.restart")
- @mock.patch("certbot_apache.configurator.ApacheConfigurator.add_vhost_id")
+ @mock.patch("certbot_apache._internal.configurator.ApacheConfigurator.restart")
+ @mock.patch("certbot_apache._internal.configurator.ApacheConfigurator.add_vhost_id")
def test_autohsts_dont_enhance_twice(self, mock_id, _restart):
mock_id.return_value = "1234567"
self.config.enable_autohsts(mock.MagicMock(),
@@ -176,7 +177,7 @@ class AutoHSTSTest(util.ApacheTest):
self.config._autohsts_fetch_state()
self.config._autohsts["orphan_id"] = {"laststep": 999, "timestamp": 0}
self.config._autohsts_save_state()
- with mock.patch("certbot_apache.configurator.logger.warning") as mock_log:
+ with mock.patch("certbot_apache._internal.configurator.logger.warning") as mock_log:
self.config.deploy_autohsts(mock.MagicMock())
self.assertTrue(mock_log.called)
self.assertTrue(
diff --git a/certbot-apache/tests/centos6_test.py b/certbot-apache/tests/centos6_test.py
new file mode 100644
index 000000000..15d086600
--- /dev/null
+++ b/certbot-apache/tests/centos6_test.py
@@ -0,0 +1,221 @@
+"""Test for certbot_apache._internal.configurator for CentOS 6 overrides"""
+import unittest
+
+from certbot.compat import os
+from certbot.errors import MisconfigurationError
+from certbot_apache._internal import obj
+from certbot_apache._internal import override_centos
+from certbot_apache._internal import parser
+import util
+
+
+def get_vh_truth(temp_dir, config_name):
+ """Return the ground truth for the specified directory."""
+ prefix = os.path.join(
+ temp_dir, config_name, "httpd/conf.d")
+
+ aug_pre = "/files" + prefix
+ vh_truth = [
+ obj.VirtualHost(
+ os.path.join(prefix, "test.example.com.conf"),
+ os.path.join(aug_pre, "test.example.com.conf/VirtualHost"),
+ set([obj.Addr.fromstring("*:80")]),
+ False, True, "test.example.com"),
+ obj.VirtualHost(
+ os.path.join(prefix, "ssl.conf"),
+ os.path.join(aug_pre, "ssl.conf/VirtualHost"),
+ set([obj.Addr.fromstring("_default_:443")]),
+ True, True, None)
+ ]
+ return vh_truth
+
+class CentOS6Tests(util.ApacheTest):
+ """Tests for CentOS 6"""
+
+ def setUp(self): # pylint: disable=arguments-differ
+ test_dir = "centos6_apache/apache"
+ config_root = "centos6_apache/apache/httpd"
+ vhost_root = "centos6_apache/apache/httpd/conf.d"
+ super(CentOS6Tests, self).setUp(test_dir=test_dir,
+ config_root=config_root,
+ vhost_root=vhost_root)
+
+ self.config = util.get_apache_configurator(
+ self.config_path, self.vhost_path, self.config_dir, self.work_dir,
+ version=(2, 2, 15), os_info="centos")
+ self.vh_truth = get_vh_truth(
+ self.temp_dir, "centos6_apache/apache")
+
+ def test_get_parser(self):
+ self.assertTrue(isinstance(self.config.parser,
+ override_centos.CentOSParser))
+
+ def test_get_virtual_hosts(self):
+ """Make sure all vhosts are being properly found."""
+ vhs = self.config.get_virtual_hosts()
+ self.assertEqual(len(vhs), 2)
+ found = 0
+
+ for vhost in vhs:
+ for centos_truth in self.vh_truth:
+ if vhost == centos_truth:
+ found += 1
+ break
+ else:
+ raise Exception("Missed: %s" % vhost) # pragma: no cover
+ self.assertEqual(found, 2)
+
+ def test_loadmod_default(self):
+ ssl_loadmods = self.config.parser.find_dir(
+ "LoadModule", "ssl_module", exclude=False)
+ self.assertEqual(len(ssl_loadmods), 1)
+ # Make sure the LoadModule ssl_module is in ssl.conf (default)
+ self.assertTrue("ssl.conf" in ssl_loadmods[0])
+ # ...and that it's not inside of <IfModule>
+ self.assertFalse("IfModule" in ssl_loadmods[0])
+
+ # Get the example vhost
+ self.config.assoc["test.example.com"] = self.vh_truth[0]
+ self.config.deploy_cert(
+ "random.demo", "example/cert.pem", "example/key.pem",
+ "example/cert_chain.pem", "example/fullchain.pem")
+ self.config.save()
+
+ post_loadmods = self.config.parser.find_dir(
+ "LoadModule", "ssl_module", exclude=False)
+
+ # We should now have LoadModule ssl_module in root conf and ssl.conf
+ self.assertEqual(len(post_loadmods), 2)
+ for lm in post_loadmods:
+ # lm[:-7] removes "/arg[#]" from the path
+ arguments = self.config.parser.get_all_args(lm[:-7])
+ self.assertEqual(arguments, ["ssl_module", "modules/mod_ssl.so"])
+ # ...and both of them should be wrapped in <IfModule !mod_ssl.c>
+ # lm[:-17] strips off /directive/arg[1] from the path.
+ ifmod_args = self.config.parser.get_all_args(lm[:-17])
+ self.assertTrue("!mod_ssl.c" in ifmod_args)
+
+ def test_loadmod_multiple(self):
+ sslmod_args = ["ssl_module", "modules/mod_ssl.so"]
+ # Adds another LoadModule to main httpd.conf in addtition to ssl.conf
+ self.config.parser.add_dir(self.config.parser.loc["default"], "LoadModule",
+ sslmod_args)
+ self.config.save()
+ pre_loadmods = self.config.parser.find_dir(
+ "LoadModule", "ssl_module", exclude=False)
+ # LoadModules are not within IfModule blocks
+ self.assertFalse(any(["ifmodule" in m.lower() for m in pre_loadmods]))
+ self.config.assoc["test.example.com"] = self.vh_truth[0]
+ self.config.deploy_cert(
+ "random.demo", "example/cert.pem", "example/key.pem",
+ "example/cert_chain.pem", "example/fullchain.pem")
+ post_loadmods = self.config.parser.find_dir(
+ "LoadModule", "ssl_module", exclude=False)
+
+ for mod in post_loadmods:
+ self.assertTrue(self.config.parser.not_modssl_ifmodule(mod)) #pylint: disable=no-member
+
+ def test_loadmod_rootconf_exists(self):
+ sslmod_args = ["ssl_module", "modules/mod_ssl.so"]
+ rootconf_ifmod = self.config.parser.get_ifmod(
+ parser.get_aug_path(self.config.parser.loc["default"]),
+ "!mod_ssl.c", beginning=True)
+ self.config.parser.add_dir(rootconf_ifmod[:-1], "LoadModule", sslmod_args)
+ self.config.save()
+ # Get the example vhost
+ self.config.assoc["test.example.com"] = self.vh_truth[0]
+ self.config.deploy_cert(
+ "random.demo", "example/cert.pem", "example/key.pem",
+ "example/cert_chain.pem", "example/fullchain.pem")
+ self.config.save()
+
+ root_loadmods = self.config.parser.find_dir(
+ "LoadModule", "ssl_module",
+ start=parser.get_aug_path(self.config.parser.loc["default"]),
+ exclude=False)
+
+ mods = [lm for lm in root_loadmods if self.config.parser.loc["default"] in lm]
+
+ self.assertEqual(len(mods), 1)
+ # [:-7] removes "/arg[#]" from the path
+ self.assertEqual(
+ self.config.parser.get_all_args(mods[0][:-7]),
+ sslmod_args)
+
+ def test_neg_loadmod_already_on_path(self):
+ loadmod_args = ["ssl_module", "modules/mod_ssl.so"]
+ ifmod = self.config.parser.get_ifmod(
+ self.vh_truth[1].path, "!mod_ssl.c", beginning=True)
+ self.config.parser.add_dir(ifmod[:-1], "LoadModule", loadmod_args)
+ self.config.parser.add_dir(self.vh_truth[1].path, "LoadModule", loadmod_args)
+ self.config.save()
+ pre_loadmods = self.config.parser.find_dir(
+ "LoadModule", "ssl_module", start=self.vh_truth[1].path, exclude=False)
+ self.assertEqual(len(pre_loadmods), 2)
+ # The ssl.conf now has two LoadModule directives, one inside of
+ # !mod_ssl.c IfModule
+ self.config.assoc["test.example.com"] = self.vh_truth[0]
+ self.config.deploy_cert(
+ "random.demo", "example/cert.pem", "example/key.pem",
+ "example/cert_chain.pem", "example/fullchain.pem")
+ self.config.save()
+ # Ensure that the additional LoadModule wasn't written into the IfModule
+ post_loadmods = self.config.parser.find_dir(
+ "LoadModule", "ssl_module", start=self.vh_truth[1].path, exclude=False)
+ self.assertEqual(len(post_loadmods), 1)
+
+ def test_loadmod_non_duplicate(self):
+ # the modules/mod_ssl.so exists in ssl.conf
+ sslmod_args = ["ssl_module", "modules/mod_somethingelse.so"]
+ rootconf_ifmod = self.config.parser.get_ifmod(
+ parser.get_aug_path(self.config.parser.loc["default"]),
+ "!mod_ssl.c", beginning=True)
+ self.config.parser.add_dir(rootconf_ifmod[:-1], "LoadModule", sslmod_args)
+ self.config.save()
+ self.config.assoc["test.example.com"] = self.vh_truth[0]
+ pre_matches = self.config.parser.find_dir("LoadModule",
+ "ssl_module", exclude=False)
+
+ self.assertRaises(MisconfigurationError, self.config.deploy_cert,
+ "random.demo", "example/cert.pem", "example/key.pem",
+ "example/cert_chain.pem", "example/fullchain.pem")
+
+ post_matches = self.config.parser.find_dir("LoadModule",
+ "ssl_module", exclude=False)
+ # Make sure that none was changed
+ self.assertEqual(pre_matches, post_matches)
+
+ def test_loadmod_not_found(self):
+ # Remove all existing LoadModule ssl_module... directives
+ orig_loadmods = self.config.parser.find_dir("LoadModule",
+ "ssl_module",
+ exclude=False)
+ for mod in orig_loadmods:
+ noarg_path = mod.rpartition("/")[0]
+ self.config.parser.aug.remove(noarg_path)
+ self.config.save()
+ self.config.deploy_cert(
+ "random.demo", "example/cert.pem", "example/key.pem",
+ "example/cert_chain.pem", "example/fullchain.pem")
+
+ post_loadmods = self.config.parser.find_dir("LoadModule",
+ "ssl_module",
+ exclude=False)
+ self.assertFalse(post_loadmods)
+
+ def test_no_ifmod_search_false(self):
+ #pylint: disable=no-member
+
+ self.assertFalse(self.config.parser.not_modssl_ifmodule(
+ "/path/does/not/include/ifmod"
+ ))
+ self.assertFalse(self.config.parser.not_modssl_ifmodule(
+ ""
+ ))
+ self.assertFalse(self.config.parser.not_modssl_ifmodule(
+ "/path/includes/IfModule/but/no/arguments"
+ ))
+
+
+if __name__ == "__main__":
+ unittest.main() # pragma: no cover
diff --git a/certbot-apache/certbot_apache/tests/centos_test.py b/certbot-apache/tests/centos_test.py
index a27916c32..8959d73b8 100644
--- a/certbot-apache/certbot_apache/tests/centos_test.py
+++ b/certbot-apache/tests/centos_test.py
@@ -1,14 +1,15 @@
-"""Test for certbot_apache.configurator for Centos overrides"""
-import os
+"""Test for certbot_apache._internal.configurator for Centos overrides"""
import unittest
import mock
from certbot import errors
+from certbot.compat import filesystem
+from certbot.compat import os
+from certbot_apache._internal import obj
+from certbot_apache._internal import override_centos
+import util
-from certbot_apache import obj
-from certbot_apache import override_centos
-from certbot_apache.tests import util
def get_vh_truth(temp_dir, config_name):
"""Return the ground truth for the specified directory."""
@@ -30,6 +31,59 @@ def get_vh_truth(temp_dir, config_name):
]
return vh_truth
+class FedoraRestartTest(util.ApacheTest):
+ """Tests for Fedora specific self-signed certificate override"""
+
+ def setUp(self): # pylint: disable=arguments-differ
+ test_dir = "centos7_apache/apache"
+ config_root = "centos7_apache/apache/httpd"
+ vhost_root = "centos7_apache/apache/httpd/conf.d"
+ super(FedoraRestartTest, self).setUp(test_dir=test_dir,
+ config_root=config_root,
+ vhost_root=vhost_root)
+ self.config = util.get_apache_configurator(
+ self.config_path, self.vhost_path, self.config_dir, self.work_dir,
+ os_info="fedora_old")
+ self.vh_truth = get_vh_truth(
+ self.temp_dir, "centos7_apache/apache")
+
+ def _run_fedora_test(self):
+ self.assertIsInstance(self.config, override_centos.CentOSConfigurator)
+ with mock.patch("certbot.util.get_os_info") as mock_info:
+ mock_info.return_value = ["fedora", "28"]
+ self.config.config_test()
+
+ def test_non_fedora_error(self):
+ c_test = "certbot_apache._internal.configurator.ApacheConfigurator.config_test"
+ with mock.patch(c_test) as mock_test:
+ mock_test.side_effect = errors.MisconfigurationError
+ with mock.patch("certbot.util.get_os_info") as mock_info:
+ mock_info.return_value = ["not_fedora"]
+ self.assertRaises(errors.MisconfigurationError,
+ self.config.config_test)
+
+ def test_fedora_restart_error(self):
+ c_test = "certbot_apache._internal.configurator.ApacheConfigurator.config_test"
+ with mock.patch(c_test) as mock_test:
+ # First call raises error, second doesn't
+ mock_test.side_effect = [errors.MisconfigurationError, '']
+ with mock.patch("certbot.util.run_script") as mock_run:
+ mock_run.side_effect = errors.SubprocessError
+ self.assertRaises(errors.MisconfigurationError,
+ self._run_fedora_test)
+
+ def test_fedora_restart(self):
+ c_test = "certbot_apache._internal.configurator.ApacheConfigurator.config_test"
+ with mock.patch(c_test) as mock_test:
+ with mock.patch("certbot.util.run_script") as mock_run:
+ # First call raises error, second doesn't
+ mock_test.side_effect = [errors.MisconfigurationError, '']
+ self._run_fedora_test()
+ self.assertEqual(mock_test.call_count, 2)
+ self.assertEqual(mock_run.call_args[0][0],
+ ['systemctl', 'restart', 'httpd'])
+
+
class MultipleVhostsTestCentOS(util.ApacheTest):
"""Multiple vhost tests for CentOS / RHEL family of distros"""
@@ -50,10 +104,9 @@ class MultipleVhostsTestCentOS(util.ApacheTest):
self.temp_dir, "centos7_apache/apache")
def test_get_parser(self):
- self.assertTrue(isinstance(self.config.parser,
- override_centos.CentOSParser))
+ self.assertIsInstance(self.config.parser, override_centos.CentOSParser)
- @mock.patch("certbot_apache.parser.ApacheParser._get_runtime_cfg")
+ @mock.patch("certbot_apache._internal.parser.ApacheParser._get_runtime_cfg")
def test_opportunistic_httpd_runtime_parsing(self, mock_get):
define_val = (
'Define: TEST1\n'
@@ -102,12 +155,12 @@ class MultipleVhostsTestCentOS(util.ApacheTest):
raise Exception("Missed: %s" % vhost) # pragma: no cover
self.assertEqual(found, 2)
- @mock.patch("certbot_apache.parser.ApacheParser._get_runtime_cfg")
+ @mock.patch("certbot_apache._internal.parser.ApacheParser._get_runtime_cfg")
def test_get_sysconfig_vars(self, mock_cfg):
"""Make sure we read the sysconfig OPTIONS variable correctly"""
# Return nothing for the process calls
mock_cfg.return_value = ""
- self.config.parser.sysconfig_filep = os.path.realpath(
+ self.config.parser.sysconfig_filep = filesystem.realpath(
os.path.join(self.config.parser.root, "../sysconfig/httpd"))
self.config.parser.variables = {}
@@ -123,13 +176,13 @@ class MultipleVhostsTestCentOS(util.ApacheTest):
self.assertTrue("MOCK_NOSEP" in self.config.parser.variables.keys())
self.assertEqual("NOSEP_VAL", self.config.parser.variables["NOSEP_TWO"])
- @mock.patch("certbot_apache.configurator.util.run_script")
+ @mock.patch("certbot_apache._internal.configurator.util.run_script")
def test_alt_restart_works(self, mock_run_script):
mock_run_script.side_effect = [None, errors.SubprocessError, None]
self.config.restart()
self.assertEqual(mock_run_script.call_count, 3)
- @mock.patch("certbot_apache.configurator.util.run_script")
+ @mock.patch("certbot_apache._internal.configurator.util.run_script")
def test_alt_restart_errors(self, mock_run_script):
mock_run_script.side_effect = [None,
errors.SubprocessError,
diff --git a/certbot-apache/certbot_apache/tests/complex_parsing_test.py b/certbot-apache/tests/complex_parsing_test.py
index a296fb0eb..8b795b0b6 100644
--- a/certbot-apache/certbot_apache/tests/complex_parsing_test.py
+++ b/certbot-apache/tests/complex_parsing_test.py
@@ -1,11 +1,10 @@
-"""Tests for certbot_apache.parser."""
-import os
+"""Tests for certbot_apache._internal.parser."""
import shutil
import unittest
from certbot import errors
-
-from certbot_apache.tests import util
+from certbot.compat import os
+import util
class ComplexParserTest(util.ParserTest):
@@ -88,7 +87,7 @@ class ComplexParserTest(util.ParserTest):
def verify_fnmatch(self, arg, hit=True):
"""Test if Include was correctly parsed."""
- from certbot_apache import parser
+ from certbot_apache._internal import parser
self.parser.add_dir(parser.get_aug_path(self.parser.loc["default"]),
"Include", [arg])
if hit:
diff --git a/certbot-apache/certbot_apache/tests/augeas_configurator_test.py b/certbot-apache/tests/configurator_reverter_test.py
index c121ecdf3..ad8e73347 100644
--- a/certbot-apache/certbot_apache/tests/augeas_configurator_test.py
+++ b/certbot-apache/tests/configurator_reverter_test.py
@@ -1,21 +1,19 @@
-"""Test for certbot_apache.augeas_configurator."""
-import os
+"""Test for certbot_apache._internal.configurator implementations of reverter"""
import shutil
import unittest
import mock
from certbot import errors
+import util
-from certbot_apache.tests import util
-
-class AugeasConfiguratorTest(util.ApacheTest):
- """Test for Augeas Configurator base class."""
+class ConfiguratorReverterTest(util.ApacheTest):
+ """Test for ApacheConfigurator reverter methods"""
def setUp(self): # pylint: disable=arguments-differ
- super(AugeasConfiguratorTest, self).setUp()
+ super(ConfiguratorReverterTest, self).setUp()
self.config = util.get_apache_configurator(
self.config_path, self.vhost_path, self.config_dir, self.work_dir)
@@ -28,20 +26,6 @@ class AugeasConfiguratorTest(util.ApacheTest):
shutil.rmtree(self.work_dir)
shutil.rmtree(self.temp_dir)
- def test_bad_parse(self):
- # pylint: disable=protected-access
- self.config.parser.parse_file(os.path.join(
- self.config.parser.root, "conf-available", "bad_conf_file.conf"))
- self.assertRaises(
- errors.PluginError, self.config.check_parsing_errors, "httpd.aug")
-
- def test_bad_save(self):
- mock_save = mock.Mock()
- mock_save.side_effect = IOError
- self.config.aug.save = mock_save
-
- self.assertRaises(errors.PluginError, self.config.save)
-
def test_bad_save_checkpoint(self):
self.config.reverter.add_to_checkpoint = mock.Mock(
side_effect=errors.ReverterError)
@@ -63,23 +47,9 @@ class AugeasConfiguratorTest(util.ApacheTest):
self.assertTrue(mock_finalize.is_called)
- def test_recovery_routine(self):
- mock_load = mock.Mock()
- self.config.aug.load = mock_load
-
- self.config.recovery_routine()
- self.assertEqual(mock_load.call_count, 1)
-
- def test_recovery_routine_error(self):
- self.config.reverter.recovery_routine = mock.Mock(
- side_effect=errors.ReverterError)
-
- self.assertRaises(
- errors.PluginError, self.config.recovery_routine)
-
def test_revert_challenge_config(self):
mock_load = mock.Mock()
- self.config.aug.load = mock_load
+ self.config.parser.aug.load = mock_load
self.config.revert_challenge_config()
self.assertEqual(mock_load.call_count, 1)
@@ -93,7 +63,7 @@ class AugeasConfiguratorTest(util.ApacheTest):
def test_rollback_checkpoints(self):
mock_load = mock.Mock()
- self.config.aug.load = mock_load
+ self.config.parser.aug.load = mock_load
self.config.rollback_checkpoints()
self.assertEqual(mock_load.call_count, 1)
@@ -103,13 +73,11 @@ class AugeasConfiguratorTest(util.ApacheTest):
side_effect=errors.ReverterError)
self.assertRaises(errors.PluginError, self.config.rollback_checkpoints)
- def test_view_config_changes(self):
- self.config.view_config_changes()
-
- def test_view_config_changes_error(self):
- self.config.reverter.view_config_changes = mock.Mock(
- side_effect=errors.ReverterError)
- self.assertRaises(errors.PluginError, self.config.view_config_changes)
+ def test_recovery_routine_reload(self):
+ mock_load = mock.Mock()
+ self.config.parser.aug.load = mock_load
+ self.config.recovery_routine()
+ self.assertEqual(mock_load.call_count, 1)
if __name__ == "__main__":
diff --git a/certbot-apache/certbot_apache/tests/configurator_test.py b/certbot-apache/tests/configurator_test.py
index 4aaa23ea4..9fab5ea5d 100644
--- a/certbot-apache/certbot_apache/tests/configurator_test.py
+++ b/certbot-apache/tests/configurator_test.py
@@ -1,36 +1,32 @@
-# pylint: disable=too-many-public-methods,too-many-lines
-"""Test for certbot_apache.configurator."""
-import os
+# pylint: disable=too-many-lines
+"""Test for certbot_apache._internal.configurator."""
+import copy
import shutil
import socket
import tempfile
import unittest
import mock
-# six is used in mock.patch()
-import six # pylint: disable=unused-import
+import six # pylint: disable=unused-import # six is used in mock.patch()
from acme import challenges
-
from certbot import achallenges
from certbot import crypto_util
from certbot import errors
-
+from certbot.compat import filesystem
+from certbot.compat import os
from certbot.tests import acme_util
from certbot.tests import util as certbot_util
-
-from certbot_apache import apache_util
-from certbot_apache import constants
-from certbot_apache import parser
-from certbot_apache import obj
-
-from certbot_apache.tests import util
+from certbot_apache._internal import apache_util
+from certbot_apache._internal import constants
+from certbot_apache._internal import obj
+from certbot_apache._internal import parser
+import util
class MultipleVhostsTest(util.ApacheTest):
"""Test two standard well-configured HTTP vhosts."""
-
def setUp(self): # pylint: disable=arguments-differ
super(MultipleVhostsTest, self).setUp()
@@ -46,33 +42,22 @@ class MultipleVhostsTest(util.ApacheTest):
def mocked_deploy_cert(*args, **kwargs):
"""a helper to mock a deployed cert"""
- g_mod = "certbot_apache.configurator.ApacheConfigurator.enable_mod"
+ g_mod = "certbot_apache._internal.configurator.ApacheConfigurator.enable_mod"
with mock.patch(g_mod):
config.real_deploy_cert(*args, **kwargs)
self.config.deploy_cert = mocked_deploy_cert
return self.config
- @mock.patch("certbot_apache.configurator.ApacheConfigurator.init_augeas")
- @mock.patch("certbot_apache.configurator.path_surgery")
- def test_prepare_no_install(self, mock_surgery, _init_augeas):
+ @mock.patch("certbot_apache._internal.configurator.path_surgery")
+ def test_prepare_no_install(self, mock_surgery):
silly_path = {"PATH": "/tmp/nothingness2342"}
mock_surgery.return_value = False
with mock.patch.dict('os.environ', silly_path):
self.assertRaises(errors.NoInstallationError, self.config.prepare)
self.assertEqual(mock_surgery.call_count, 1)
- @mock.patch("certbot_apache.augeas_configurator.AugeasConfigurator.init_augeas")
- def test_prepare_no_augeas(self, mock_init_augeas):
- """ Test augeas initialization ImportError """
- def side_effect_error():
- """ Side effect error for the test """
- raise ImportError
- mock_init_augeas.side_effect = side_effect_error
- self.assertRaises(
- errors.NoInstallationError, self.config.prepare)
-
- @mock.patch("certbot_apache.parser.ApacheParser")
- @mock.patch("certbot_apache.configurator.util.exe_exists")
+ @mock.patch("certbot_apache._internal.parser.ApacheParser")
+ @mock.patch("certbot_apache._internal.configurator.util.exe_exists")
def test_prepare_version(self, mock_exe_exists, _):
mock_exe_exists.return_value = True
self.config.version = None
@@ -82,24 +67,14 @@ class MultipleVhostsTest(util.ApacheTest):
self.assertRaises(
errors.NotSupportedError, self.config.prepare)
- @mock.patch("certbot_apache.parser.ApacheParser")
- @mock.patch("certbot_apache.configurator.util.exe_exists")
- def test_prepare_old_aug(self, mock_exe_exists, _):
- mock_exe_exists.return_value = True
- self.config.config_test = mock.Mock()
- # pylint: disable=protected-access
- self.config._check_aug_version = mock.Mock(return_value=False)
- self.assertRaises(
- errors.NotSupportedError, self.config.prepare)
-
def test_prepare_locked(self):
server_root = self.config.conf("server-root")
self.config.config_test = mock.Mock()
os.remove(os.path.join(server_root, ".certbot.lock"))
certbot_util.lock_and_call(self._test_prepare_locked, server_root)
- @mock.patch("certbot_apache.parser.ApacheParser")
- @mock.patch("certbot_apache.configurator.util.exe_exists")
+ @mock.patch("certbot_apache._internal.parser.ApacheParser")
+ @mock.patch("certbot_apache._internal.configurator.util.exe_exists")
def _test_prepare_locked(self, unused_parser, unused_exe_exists):
try:
self.config.prepare()
@@ -111,18 +86,45 @@ class MultipleVhostsTest(util.ApacheTest):
self.fail("Exception wasn't raised!")
def test_add_parser_arguments(self): # pylint: disable=no-self-use
- from certbot_apache.configurator import ApacheConfigurator
+ from certbot_apache._internal.configurator import ApacheConfigurator
# Weak test..
ApacheConfigurator.add_parser_arguments(mock.MagicMock())
+ def test_docs_parser_arguments(self):
+ os.environ["CERTBOT_DOCS"] = "1"
+ from certbot_apache._internal.configurator import ApacheConfigurator
+ mock_add = mock.MagicMock()
+ ApacheConfigurator.add_parser_arguments(mock_add)
+ parserargs = ["server_root", "enmod", "dismod", "le_vhost_ext",
+ "vhost_root", "logs_root", "challenge_location",
+ "handle_modules", "handle_sites", "ctl"]
+ exp = dict()
+
+ for k in ApacheConfigurator.OS_DEFAULTS:
+ if k in parserargs:
+ exp[k.replace("_", "-")] = ApacheConfigurator.OS_DEFAULTS[k]
+ # Special cases
+ exp["vhost-root"] = None
+
+ found = set()
+ for call in mock_add.call_args_list:
+ found.add(call[0][0])
+
+ # Make sure that all (and only) the expected values exist
+ self.assertEqual(len(mock_add.call_args_list), len(found))
+ for e in exp:
+ self.assertTrue(e in found)
+
+ del os.environ["CERTBOT_DOCS"]
+
def test_add_parser_arguments_all_configurators(self): # pylint: disable=no-self-use
- from certbot_apache.entrypoint import OVERRIDE_CLASSES
+ from certbot_apache._internal.entrypoint import OVERRIDE_CLASSES
for cls in OVERRIDE_CLASSES.values():
cls.add_parser_arguments(mock.MagicMock())
def test_all_configurators_defaults_defined(self):
- from certbot_apache.entrypoint import OVERRIDE_CLASSES
- from certbot_apache.configurator import ApacheConfigurator
+ from certbot_apache._internal.entrypoint import OVERRIDE_CLASSES
+ from certbot_apache._internal.configurator import ApacheConfigurator
parameters = set(ApacheConfigurator.OS_DEFAULTS.keys())
for cls in OVERRIDE_CLASSES.values():
self.assertTrue(parameters.issubset(set(cls.OS_DEFAULTS.keys())))
@@ -139,11 +141,12 @@ class MultipleVhostsTest(util.ApacheTest):
names = self.config.get_all_names()
self.assertEqual(names, set(
["certbot.demo", "ocspvhost.com", "encryption-example.demo",
- "nonsym.link", "vhost.in.rootconf", "www.certbot.demo"]
+ "nonsym.link", "vhost.in.rootconf", "www.certbot.demo",
+ "duplicate.example.com"]
))
@certbot_util.patch_get_utility()
- @mock.patch("certbot_apache.configurator.socket.gethostbyaddr")
+ @mock.patch("certbot_apache._internal.configurator.socket.gethostbyaddr")
def test_get_all_names_addrs(self, mock_gethost, mock_getutility):
mock_gethost.side_effect = [("google.com", "", ""), socket.error]
mock_utility = mock_getutility()
@@ -158,8 +161,7 @@ class MultipleVhostsTest(util.ApacheTest):
self.config.vhosts.append(vhost)
names = self.config.get_all_names()
- # Names get filtered, only 5 are returned
- self.assertEqual(len(names), 8)
+ self.assertEqual(len(names), 9)
self.assertTrue("zombo.com" in names)
self.assertTrue("google.com" in names)
self.assertTrue("certbot.demo" in names)
@@ -170,7 +172,7 @@ class MultipleVhostsTest(util.ApacheTest):
self.assertEqual(self.config._create_vhost("nonexistent"), None) # pylint: disable=protected-access
def test_get_aug_internal_path(self):
- from certbot_apache.apache_util import get_internal_aug_path
+ from certbot_apache._internal.apache_util import get_internal_aug_path
internal_paths = [
"Virtualhost", "IfModule/VirtualHost", "VirtualHost", "VirtualHost",
"Macro/VirtualHost", "IfModule/VirtualHost", "VirtualHost",
@@ -200,7 +202,7 @@ class MultipleVhostsTest(util.ApacheTest):
def test_get_virtual_hosts(self):
"""Make sure all vhosts are being properly found."""
vhs = self.config.get_virtual_hosts()
- self.assertEqual(len(vhs), 10)
+ self.assertEqual(len(vhs), 12)
found = 0
for vhost in vhs:
@@ -211,30 +213,30 @@ class MultipleVhostsTest(util.ApacheTest):
else:
raise Exception("Missed: %s" % vhost) # pragma: no cover
- self.assertEqual(found, 10)
+ self.assertEqual(found, 12)
# Handle case of non-debian layout get_virtual_hosts
with mock.patch(
- "certbot_apache.configurator.ApacheConfigurator.conf"
+ "certbot_apache._internal.configurator.ApacheConfigurator.conf"
) as mock_conf:
mock_conf.return_value = False
vhs = self.config.get_virtual_hosts()
- self.assertEqual(len(vhs), 10)
+ self.assertEqual(len(vhs), 12)
- @mock.patch("certbot_apache.display_ops.select_vhost")
+ @mock.patch("certbot_apache._internal.display_ops.select_vhost")
def test_choose_vhost_none_avail(self, mock_select):
mock_select.return_value = None
self.assertRaises(
errors.PluginError, self.config.choose_vhost, "none.com")
- @mock.patch("certbot_apache.display_ops.select_vhost")
+ @mock.patch("certbot_apache._internal.display_ops.select_vhost")
def test_choose_vhost_select_vhost_ssl(self, mock_select):
mock_select.return_value = self.vh_truth[1]
self.assertEqual(
self.vh_truth[1], self.config.choose_vhost("none.com"))
- @mock.patch("certbot_apache.display_ops.select_vhost")
- @mock.patch("certbot_apache.obj.VirtualHost.conflicts")
+ @mock.patch("certbot_apache._internal.display_ops.select_vhost")
+ @mock.patch("certbot_apache._internal.obj.VirtualHost.conflicts")
def test_choose_vhost_select_vhost_non_ssl(self, mock_conf, mock_select):
mock_select.return_value = self.vh_truth[0]
mock_conf.return_value = False
@@ -247,8 +249,8 @@ class MultipleVhostsTest(util.ApacheTest):
self.assertFalse(self.vh_truth[0].ssl)
self.assertTrue(chosen_vhost.ssl)
- @mock.patch("certbot_apache.configurator.ApacheConfigurator._find_best_vhost")
- @mock.patch("certbot_apache.parser.ApacheParser.add_dir")
+ @mock.patch("certbot_apache._internal.configurator.ApacheConfigurator._find_best_vhost")
+ @mock.patch("certbot_apache._internal.parser.ApacheParser.add_dir")
def test_choose_vhost_and_servername_addition(self, mock_add, mock_find):
ret_vh = self.vh_truth[8]
ret_vh.enabled = False
@@ -256,13 +258,13 @@ class MultipleVhostsTest(util.ApacheTest):
self.config.choose_vhost("whatever.com")
self.assertTrue(mock_add.called)
- @mock.patch("certbot_apache.display_ops.select_vhost")
+ @mock.patch("certbot_apache._internal.display_ops.select_vhost")
def test_choose_vhost_select_vhost_with_temp(self, mock_select):
mock_select.return_value = self.vh_truth[0]
chosen_vhost = self.config.choose_vhost("none.com", create_if_no_ssl=False)
self.assertEqual(self.vh_truth[0], chosen_vhost)
- @mock.patch("certbot_apache.display_ops.select_vhost")
+ @mock.patch("certbot_apache._internal.display_ops.select_vhost")
def test_choose_vhost_select_vhost_conflicting_non_ssl(self, mock_select):
mock_select.return_value = self.vh_truth[3]
conflicting_vhost = obj.VirtualHost(
@@ -322,7 +324,7 @@ class MultipleVhostsTest(util.ApacheTest):
self.config.vhosts = [
vh for vh in self.config.vhosts
if vh.name not in ["certbot.demo", "nonsym.link",
- "encryption-example.demo",
+ "encryption-example.demo", "duplicate.example.com",
"ocspvhost.com", "vhost.in.rootconf"]
and "*.blue.purple.com" not in vh.aliases
]
@@ -333,7 +335,7 @@ class MultipleVhostsTest(util.ApacheTest):
def test_non_default_vhosts(self):
# pylint: disable=protected-access
vhosts = self.config._non_default_vhosts(self.config.vhosts)
- self.assertEqual(len(vhosts), 8)
+ self.assertEqual(len(vhosts), 10)
def test_deploy_cert_enable_new_vhost(self):
# Create
@@ -353,6 +355,7 @@ class MultipleVhostsTest(util.ApacheTest):
"""Mock method for parser.find_dir"""
if directive == "Include" and argument.endswith("options-ssl-apache.conf"):
return ["/path/to/whatever"]
+ return None # pragma: no cover
mock_add = mock.MagicMock()
self.config.parser.add_dir = mock_add
@@ -464,8 +467,7 @@ class MultipleVhostsTest(util.ApacheTest):
but an SSLCertificateKeyFile directive is missing."""
if "SSLCertificateFile" in args:
return ["example/cert.pem"]
- else:
- return []
+ return []
mock_find_dir = mock.MagicMock(return_value=[])
mock_find_dir.side_effect = side_effect
@@ -645,7 +647,7 @@ class MultipleVhostsTest(util.ApacheTest):
# span excludes the closing </VirtualHost> tag in older versions
# of Augeas
return_value = [self.vh_truth[0].filep, 1, 12, 0, 0, 0, 1142]
- with mock.patch.object(self.config.aug, 'span') as mock_span:
+ with mock.patch.object(self.config.parser.aug, 'span') as mock_span:
mock_span.return_value = return_value
self.test_make_vhost_ssl()
@@ -653,7 +655,7 @@ class MultipleVhostsTest(util.ApacheTest):
# span includes the closing </VirtualHost> tag in newer versions
# of Augeas
return_value = [self.vh_truth[0].filep, 1, 12, 0, 0, 0, 1157]
- with mock.patch.object(self.config.aug, 'span') as mock_span:
+ with mock.patch.object(self.config.parser.aug, 'span') as mock_span:
mock_span.return_value = return_value
self.test_make_vhost_ssl()
@@ -666,8 +668,7 @@ class MultipleVhostsTest(util.ApacheTest):
def test_make_vhost_ssl_nonexistent_vhost_path(self):
ssl_vhost = self.config.make_vhost_ssl(self.vh_truth[1])
self.assertEqual(os.path.dirname(ssl_vhost.filep),
- os.path.dirname(os.path.realpath(
- self.vh_truth[1].filep)))
+ os.path.dirname(filesystem.realpath(self.vh_truth[1].filep)))
def test_make_vhost_ssl(self):
ssl_vhost = self.config.make_vhost_ssl(self.vh_truth[0])
@@ -688,7 +689,7 @@ class MultipleVhostsTest(util.ApacheTest):
self.assertEqual(self.config.is_name_vhost(self.vh_truth[0]),
self.config.is_name_vhost(ssl_vhost))
- self.assertEqual(len(self.config.vhosts), 11)
+ self.assertEqual(len(self.config.vhosts), 13)
def test_clean_vhost_ssl(self):
# pylint: disable=protected-access
@@ -780,38 +781,25 @@ class MultipleVhostsTest(util.ApacheTest):
self.config._add_name_vhost_if_necessary(self.vh_truth[0])
self.assertEqual(self.config.add_name_vhost.call_count, 2)
- @mock.patch("certbot_apache.configurator.http_01.ApacheHttp01.perform")
- @mock.patch("certbot_apache.configurator.tls_sni_01.ApacheTlsSni01.perform")
- @mock.patch("certbot_apache.configurator.ApacheConfigurator.restart")
- def test_perform(self, mock_restart, mock_tls_perform, mock_http_perform):
+ @mock.patch("certbot_apache._internal.configurator.http_01.ApacheHttp01.perform")
+ @mock.patch("certbot_apache._internal.configurator.ApacheConfigurator.restart")
+ def test_perform(self, mock_restart, mock_http_perform):
# Only tests functionality specific to configurator.perform
# Note: As more challenges are offered this will have to be expanded
account_key, achalls = self.get_key_and_achalls()
- all_expected = []
- http_expected = []
- tls_expected = []
- for achall in achalls:
- response = achall.response(account_key)
- if isinstance(achall.chall, challenges.HTTP01):
- http_expected.append(response)
- else:
- tls_expected.append(response)
- all_expected.append(response)
-
- mock_http_perform.return_value = http_expected
- mock_tls_perform.return_value = tls_expected
+ expected = [achall.response(account_key) for achall in achalls]
+ mock_http_perform.return_value = expected
responses = self.config.perform(achalls)
self.assertEqual(mock_http_perform.call_count, 1)
- self.assertEqual(mock_tls_perform.call_count, 1)
- self.assertEqual(responses, all_expected)
+ self.assertEqual(responses, expected)
self.assertEqual(mock_restart.call_count, 1)
- @mock.patch("certbot_apache.configurator.ApacheConfigurator.restart")
- @mock.patch("certbot_apache.parser.ApacheParser._get_runtime_cfg")
+ @mock.patch("certbot_apache._internal.configurator.ApacheConfigurator.restart")
+ @mock.patch("certbot_apache._internal.parser.ApacheParser._get_runtime_cfg")
def test_cleanup(self, mock_cfg, mock_restart):
mock_cfg.return_value = ""
_, achalls = self.get_key_and_achalls()
@@ -826,8 +814,8 @@ class MultipleVhostsTest(util.ApacheTest):
else:
self.assertFalse(mock_restart.called)
- @mock.patch("certbot_apache.configurator.ApacheConfigurator.restart")
- @mock.patch("certbot_apache.parser.ApacheParser._get_runtime_cfg")
+ @mock.patch("certbot_apache._internal.configurator.ApacheConfigurator.restart")
+ @mock.patch("certbot_apache._internal.parser.ApacheParser._get_runtime_cfg")
def test_cleanup_no_errors(self, mock_cfg, mock_restart):
mock_cfg.return_value = ""
_, achalls = self.get_key_and_achalls()
@@ -864,11 +852,11 @@ class MultipleVhostsTest(util.ApacheTest):
mock_script.side_effect = errors.SubprocessError("Can't find program")
self.assertRaises(errors.PluginError, self.config.get_version)
- @mock.patch("certbot_apache.configurator.util.run_script")
+ @mock.patch("certbot_apache._internal.configurator.util.run_script")
def test_restart(self, _):
self.config.restart()
- @mock.patch("certbot_apache.configurator.util.run_script")
+ @mock.patch("certbot_apache._internal.configurator.util.run_script")
def test_restart_bad_process(self, mock_run_script):
mock_run_script.side_effect = [None, errors.SubprocessError]
@@ -911,8 +899,8 @@ class MultipleVhostsTest(util.ApacheTest):
self.assertEqual(self.vh_truth[0].name, res.name)
self.assertEqual(self.vh_truth[0].aliases, res.aliases)
- @mock.patch("certbot_apache.configurator.ApacheConfigurator._get_http_vhost")
- @mock.patch("certbot_apache.display_ops.select_vhost")
+ @mock.patch("certbot_apache._internal.configurator.ApacheConfigurator._get_http_vhost")
+ @mock.patch("certbot_apache._internal.display_ops.select_vhost")
@mock.patch("certbot.util.exe_exists")
def test_enhance_unknown_vhost(self, mock_exe, mock_sel_vhost, mock_get):
self.config.parser.modules.add("rewrite_module")
@@ -935,7 +923,7 @@ class MultipleVhostsTest(util.ApacheTest):
self.config.enhance, "certbot.demo", "unknown_enhancement")
def test_enhance_no_ssl_vhost(self):
- with mock.patch("certbot_apache.configurator.logger.warning") as mock_log:
+ with mock.patch("certbot_apache._internal.configurator.logger.warning") as mock_log:
self.assertRaises(errors.PluginError, self.config.enhance,
"certbot.demo", "redirect")
# Check that correct logger.warning was printed
@@ -1026,7 +1014,7 @@ class MultipleVhostsTest(util.ApacheTest):
# pylint: disable=protected-access
http_vh = self.config._get_http_vhost(ssl_vh)
- self.assertTrue(http_vh.ssl == False)
+ self.assertFalse(http_vh.ssl)
@mock.patch("certbot.util.run_script")
@mock.patch("certbot.util.exe_exists")
@@ -1215,7 +1203,7 @@ class MultipleVhostsTest(util.ApacheTest):
except errors.PluginEnhancementAlreadyPresent:
args_paths = self.config.parser.find_dir(
"RewriteRule", None, http_vhost.path, False)
- arg_vals = [self.config.aug.get(x) for x in args_paths]
+ arg_vals = [self.config.parser.aug.get(x) for x in args_paths]
self.assertEqual(arg_vals, constants.REWRITE_HTTPS_ARGS)
@@ -1240,7 +1228,7 @@ class MultipleVhostsTest(util.ApacheTest):
self.config.choose_vhost("red.blue.purple.com")
self.config.enhance("red.blue.purple.com", "redirect")
- verify_no_redirect = ("certbot_apache.configurator."
+ verify_no_redirect = ("certbot_apache._internal.configurator."
"ApacheConfigurator._verify_no_certbot_redirect")
with mock.patch(verify_no_redirect) as mock_verify:
self.config.enhance("green.blue.purple.com", "redirect")
@@ -1269,7 +1257,7 @@ class MultipleVhostsTest(util.ApacheTest):
# pylint: disable=protected-access
self.config._enable_redirect(self.vh_truth[1], "")
- self.assertEqual(len(self.config.vhosts), 11)
+ self.assertEqual(len(self.config.vhosts), 13)
def test_create_own_redirect_for_old_apache_version(self):
self.config.parser.modules.add("rewrite_module")
@@ -1280,7 +1268,7 @@ class MultipleVhostsTest(util.ApacheTest):
# pylint: disable=protected-access
self.config._enable_redirect(self.vh_truth[1], "")
- self.assertEqual(len(self.config.vhosts), 11)
+ self.assertEqual(len(self.config.vhosts), 13)
def test_sift_rewrite_rule(self):
# pylint: disable=protected-access
@@ -1301,13 +1289,13 @@ class MultipleVhostsTest(util.ApacheTest):
account_key = self.rsa512jwk
achall1 = achallenges.KeyAuthorizationAnnotatedChallenge(
challb=acme_util.chall_to_challb(
- challenges.TLSSNI01(
+ challenges.HTTP01(
token=b"jIq_Xy1mXGN37tb4L6Xj_es58fW571ZNyXekdZzhh7Q"),
"pending"),
domain="encryption-example.demo", account_key=account_key)
achall2 = achallenges.KeyAuthorizationAnnotatedChallenge(
challb=acme_util.chall_to_challb(
- challenges.TLSSNI01(
+ challenges.HTTP01(
token=b"uqnaPzxtrndteOqtrXb0Asl5gOJfWAnnx6QJyvcmlDU"),
"pending"),
domain="certbot.demo", account_key=account_key)
@@ -1318,24 +1306,6 @@ class MultipleVhostsTest(util.ApacheTest):
return account_key, (achall1, achall2, achall3)
- def test_make_addrs_sni_ready(self):
- self.config.version = (2, 2)
- self.config.make_addrs_sni_ready(
- set([obj.Addr.fromstring("*:443"), obj.Addr.fromstring("*:80")]))
- self.assertTrue(self.config.parser.find_dir(
- "NameVirtualHost", "*:80", exclude=False))
- self.assertTrue(self.config.parser.find_dir(
- "NameVirtualHost", "*:443", exclude=False))
-
- def test_aug_version(self):
- mock_match = mock.Mock(return_value=["something"])
- self.config.aug.match = mock_match
- # pylint: disable=protected-access
- self.assertEqual(self.config._check_aug_version(),
- ["something"])
- self.config.aug.match.side_effect = RuntimeError
- self.assertFalse(self.config._check_aug_version())
-
def test_enable_site_nondebian(self):
inc_path = "/path/to/wherever"
vhost = self.vh_truth[0]
@@ -1358,10 +1328,10 @@ class MultipleVhostsTest(util.ApacheTest):
self.config.parser.modules.add("ssl_module")
self.config.parser.modules.add("mod_ssl.c")
self.config.parser.modules.add("socache_shmcb_module")
- tmp_path = os.path.realpath(tempfile.mkdtemp("vhostroot"))
- os.chmod(tmp_path, 0o755)
- mock_p = "certbot_apache.configurator.ApacheConfigurator._get_ssl_vhost_path"
- mock_a = "certbot_apache.parser.ApacheParser.add_include"
+ tmp_path = filesystem.realpath(tempfile.mkdtemp("vhostroot"))
+ filesystem.chmod(tmp_path, 0o755)
+ mock_p = "certbot_apache._internal.configurator.ApacheConfigurator._get_ssl_vhost_path"
+ mock_a = "certbot_apache._internal.parser.ApacheParser.add_include"
with mock.patch(mock_p) as mock_path:
mock_path.return_value = os.path.join(tmp_path, "whatever.conf")
@@ -1374,7 +1344,7 @@ class MultipleVhostsTest(util.ApacheTest):
self.assertTrue(mock_add.called)
shutil.rmtree(tmp_path)
- @mock.patch("certbot_apache.parser.ApacheParser.parsed_in_original")
+ @mock.patch("certbot_apache._internal.parser.ApacheParser.parsed_in_original")
def test_choose_vhost_and_servername_addition_parsed(self, mock_parsed):
ret_vh = self.vh_truth[8]
ret_vh.enabled = True
@@ -1391,12 +1361,12 @@ class MultipleVhostsTest(util.ApacheTest):
# pylint: disable=protected-access
cases = {u"*.example.org": True, b"*.x.example.org": True,
u"a.example.org": False, b"a.x.example.org": False}
- for key in cases.keys():
+ for key in cases:
self.assertEqual(self.config._wildcard_domain(key), cases[key])
def test_choose_vhosts_wildcard(self):
# pylint: disable=protected-access
- mock_path = "certbot_apache.display_ops.select_vhost_multiple"
+ mock_path = "certbot_apache._internal.display_ops.select_vhost_multiple"
with mock.patch(mock_path) as mock_select_vhs:
mock_select_vhs.return_value = [self.vh_truth[3]]
vhs = self.config._choose_vhosts_wildcard("*.certbot.demo",
@@ -1412,10 +1382,10 @@ class MultipleVhostsTest(util.ApacheTest):
self.assertFalse(vhs[0] == self.vh_truth[3])
- @mock.patch("certbot_apache.configurator.ApacheConfigurator.make_vhost_ssl")
+ @mock.patch("certbot_apache._internal.configurator.ApacheConfigurator.make_vhost_ssl")
def test_choose_vhosts_wildcard_no_ssl(self, mock_makessl):
# pylint: disable=protected-access
- mock_path = "certbot_apache.display_ops.select_vhost_multiple"
+ mock_path = "certbot_apache._internal.display_ops.select_vhost_multiple"
with mock.patch(mock_path) as mock_select_vhs:
mock_select_vhs.return_value = [self.vh_truth[1]]
vhs = self.config._choose_vhosts_wildcard("*.certbot.demo",
@@ -1423,13 +1393,13 @@ class MultipleVhostsTest(util.ApacheTest):
self.assertFalse(mock_makessl.called)
self.assertEqual(vhs[0], self.vh_truth[1])
- @mock.patch("certbot_apache.configurator.ApacheConfigurator._vhosts_for_wildcard")
- @mock.patch("certbot_apache.configurator.ApacheConfigurator.make_vhost_ssl")
+ @mock.patch("certbot_apache._internal.configurator.ApacheConfigurator._vhosts_for_wildcard")
+ @mock.patch("certbot_apache._internal.configurator.ApacheConfigurator.make_vhost_ssl")
def test_choose_vhosts_wildcard_already_ssl(self, mock_makessl, mock_vh_for_w):
# pylint: disable=protected-access
# Already SSL vhost
mock_vh_for_w.return_value = [self.vh_truth[7]]
- mock_path = "certbot_apache.display_ops.select_vhost_multiple"
+ mock_path = "certbot_apache._internal.display_ops.select_vhost_multiple"
with mock.patch(mock_path) as mock_select_vhs:
mock_select_vhs.return_value = [self.vh_truth[7]]
vhs = self.config._choose_vhosts_wildcard("whatever",
@@ -1450,7 +1420,7 @@ class MultipleVhostsTest(util.ApacheTest):
mock_choose_vhosts = mock.MagicMock()
mock_choose_vhosts.return_value = [self.vh_truth[7]]
self.config._choose_vhosts_wildcard = mock_choose_vhosts
- mock_d = "certbot_apache.configurator.ApacheConfigurator._deploy_cert"
+ mock_d = "certbot_apache._internal.configurator.ApacheConfigurator._deploy_cert"
with mock.patch(mock_d) as mock_dep:
self.config.deploy_cert("*.wildcard.example.org", "/tmp/path",
"/tmp/path", "/tmp/path", "/tmp/path")
@@ -1458,7 +1428,7 @@ class MultipleVhostsTest(util.ApacheTest):
self.assertEqual(len(mock_dep.call_args_list), 1)
self.assertEqual(self.vh_truth[7], mock_dep.call_args_list[0][0][0])
- @mock.patch("certbot_apache.display_ops.select_vhost_multiple")
+ @mock.patch("certbot_apache._internal.display_ops.select_vhost_multiple")
def test_deploy_cert_wildcard_no_vhosts(self, mock_dialog):
# pylint: disable=protected-access
mock_dialog.return_value = []
@@ -1467,7 +1437,7 @@ class MultipleVhostsTest(util.ApacheTest):
"*.wild.cat", "/tmp/path", "/tmp/path",
"/tmp/path", "/tmp/path")
- @mock.patch("certbot_apache.configurator.ApacheConfigurator._choose_vhosts_wildcard")
+ @mock.patch("certbot_apache._internal.configurator.ApacheConfigurator._choose_vhosts_wildcard")
def test_enhance_wildcard_after_install(self, mock_choose):
# pylint: disable=protected-access
self.config.parser.modules.add("mod_ssl.c")
@@ -1478,7 +1448,7 @@ class MultipleVhostsTest(util.ApacheTest):
"Upgrade-Insecure-Requests")
self.assertFalse(mock_choose.called)
- @mock.patch("certbot_apache.configurator.ApacheConfigurator._choose_vhosts_wildcard")
+ @mock.patch("certbot_apache._internal.configurator.ApacheConfigurator._choose_vhosts_wildcard")
def test_enhance_wildcard_no_install(self, mock_choose):
self.vh_truth[3].ssl = True
mock_choose.return_value = [self.vh_truth[3]]
@@ -1503,6 +1473,29 @@ class MultipleVhostsTest(util.ApacheTest):
second_id = self.config.add_vhost_id(self.vh_truth[0])
self.assertEqual(first_id, second_id)
+ def test_realpath_replaces_symlink(self):
+ orig_match = self.config.parser.aug.match
+ mock_vhost = copy.deepcopy(self.vh_truth[0])
+ mock_vhost.filep = mock_vhost.filep.replace('sites-enabled', u'sites-available')
+ mock_vhost.path = mock_vhost.path.replace('sites-enabled', 'sites-available')
+ mock_vhost.enabled = False
+ self.config.parser.parse_file(mock_vhost.filep)
+
+ def mock_match(aug_expr):
+ """Return a mocked match list of VirtualHosts"""
+ if "/mocked/path" in aug_expr:
+ return [self.vh_truth[1].path, self.vh_truth[0].path, mock_vhost.path]
+ return orig_match(aug_expr)
+
+ self.config.parser.parser_paths = ["/mocked/path"]
+ self.config.parser.aug.match = mock_match
+ vhs = self.config.get_virtual_hosts()
+ self.assertEqual(len(vhs), 2)
+ self.assertTrue(vhs[0] == self.vh_truth[1])
+ # mock_vhost should have replaced the vh_truth[0], because its filepath
+ # isn't a symlink
+ self.assertTrue(vhs[1] == mock_vhost)
+
class AugeasVhostsTest(util.ApacheTest):
"""Test vhosts with illegal names dependent on augeas version."""
@@ -1521,8 +1514,8 @@ class AugeasVhostsTest(util.ApacheTest):
self.work_dir)
def test_choosevhost_with_illegal_name(self):
- self.config.aug = mock.MagicMock()
- self.config.aug.match.side_effect = RuntimeError
+ self.config.parser.aug = mock.MagicMock()
+ self.config.parser.aug.match.side_effect = RuntimeError
path = "debian_apache_2_4/augeas_vhosts/apache2/sites-available/old-and-default.conf"
chosen_vhost = self.config._create_vhost(path)
self.assertEqual(None, chosen_vhost)
@@ -1530,9 +1523,9 @@ class AugeasVhostsTest(util.ApacheTest):
def test_choosevhost_works(self):
path = "debian_apache_2_4/augeas_vhosts/apache2/sites-available/old-and-default.conf"
chosen_vhost = self.config._create_vhost(path)
- self.assertTrue(chosen_vhost == None or chosen_vhost.path == path)
+ self.assertTrue(chosen_vhost is None or chosen_vhost.path == path)
- @mock.patch("certbot_apache.configurator.ApacheConfigurator._create_vhost")
+ @mock.patch("certbot_apache._internal.configurator.ApacheConfigurator._create_vhost")
def test_get_vhost_continue(self, mock_vhost):
mock_vhost.return_value = None
vhs = self.config.get_virtual_hosts()
@@ -1544,18 +1537,18 @@ class AugeasVhostsTest(util.ApacheTest):
for name in names:
self.assertFalse(name in self.config.choose_vhost(name).aliases)
- @mock.patch("certbot_apache.obj.VirtualHost.conflicts")
+ @mock.patch("certbot_apache._internal.obj.VirtualHost.conflicts")
def test_choose_vhost_without_matching_wildcard(self, mock_conflicts):
mock_conflicts.return_value = False
- mock_path = "certbot_apache.display_ops.select_vhost"
+ mock_path = "certbot_apache._internal.display_ops.select_vhost"
with mock.patch(mock_path, lambda _, vhosts: vhosts[0]):
for name in ("a.example.net", "other.example.net"):
self.assertTrue(name in self.config.choose_vhost(name).aliases)
- @mock.patch("certbot_apache.obj.VirtualHost.conflicts")
+ @mock.patch("certbot_apache._internal.obj.VirtualHost.conflicts")
def test_choose_vhost_wildcard_not_found(self, mock_conflicts):
mock_conflicts.return_value = False
- mock_path = "certbot_apache.display_ops.select_vhost"
+ mock_path = "certbot_apache._internal.display_ops.select_vhost"
names = (
"abc.example.net", "not.there.tld", "aa.wildcard.tld"
)
@@ -1567,7 +1560,7 @@ class AugeasVhostsTest(util.ApacheTest):
self.assertEqual(mock_select.call_count - orig_cc, 1)
def test_choose_vhost_wildcard_found(self):
- mock_path = "certbot_apache.display_ops.select_vhost"
+ mock_path = "certbot_apache._internal.display_ops.select_vhost"
names = (
"ab.example.net", "a.wildcard.tld", "yetanother.example.net"
)
@@ -1621,7 +1614,7 @@ class MultiVhostsTest(util.ApacheTest):
self.assertEqual(self.config.is_name_vhost(self.vh_truth[1]),
self.config.is_name_vhost(ssl_vhost))
- mock_path = "certbot_apache.configurator.ApacheConfigurator._get_new_vh_path"
+ mock_path = "certbot_apache._internal.configurator.ApacheConfigurator._get_new_vh_path"
with mock.patch(mock_path) as mock_getpath:
mock_getpath.return_value = None
self.assertRaises(errors.PluginError, self.config.make_vhost_ssl,
@@ -1727,7 +1720,7 @@ class InstallSslOptionsConfTest(util.ApacheTest):
self._assert_current_file()
def test_prev_file_updates_to_current(self):
- from certbot_apache.constants import ALL_SSL_OPTIONS_HASHES
+ from certbot_apache._internal.constants import ALL_SSL_OPTIONS_HASHES
ALL_SSL_OPTIONS_HASHES.insert(0, "test_hash_does_not_match")
with mock.patch('certbot.crypto_util.sha256sum') as mock_sha256:
mock_sha256.return_value = ALL_SSL_OPTIONS_HASHES[0]
@@ -1766,7 +1759,7 @@ class InstallSslOptionsConfTest(util.ApacheTest):
self.assertFalse(mock_logger.warning.called)
def test_current_file_hash_in_all_hashes(self):
- from certbot_apache.constants import ALL_SSL_OPTIONS_HASHES
+ from certbot_apache._internal.constants import ALL_SSL_OPTIONS_HASHES
self.assertTrue(self._current_ssl_options_hash() in ALL_SSL_OPTIONS_HASHES,
"Constants.ALL_SSL_OPTIONS_HASHES must be appended"
" with the sha256 hash of self.config.mod_ssl_conf when it is updated.")
diff --git a/certbot-apache/certbot_apache/tests/debian_test.py b/certbot-apache/tests/debian_test.py
index bb1d64278..6e63a9bd3 100644
--- a/certbot-apache/certbot_apache/tests/debian_test.py
+++ b/certbot-apache/tests/debian_test.py
@@ -1,15 +1,14 @@
-"""Test for certbot_apache.configurator for Debian overrides"""
-import os
+"""Test for certbot_apache._internal.configurator for Debian overrides"""
import shutil
import unittest
import mock
from certbot import errors
-
-from certbot_apache import apache_util
-from certbot_apache import obj
-from certbot_apache.tests import util
+from certbot.compat import os
+from certbot_apache._internal import apache_util
+from certbot_apache._internal import obj
+import util
class MultipleVhostsTestDebian(util.ApacheTest):
@@ -32,8 +31,8 @@ class MultipleVhostsTestDebian(util.ApacheTest):
def mocked_deploy_cert(*args, **kwargs):
"""a helper to mock a deployed cert"""
- g_mod = "certbot_apache.configurator.ApacheConfigurator.enable_mod"
- d_mod = "certbot_apache.override_debian.DebianConfigurator.enable_mod"
+ g_mod = "certbot_apache._internal.configurator.ApacheConfigurator.enable_mod"
+ d_mod = "certbot_apache._internal.override_debian.DebianConfigurator.enable_mod"
with mock.patch(g_mod):
with mock.patch(d_mod):
config.real_deploy_cert(*args, **kwargs)
@@ -47,7 +46,7 @@ class MultipleVhostsTestDebian(util.ApacheTest):
@mock.patch("certbot.util.run_script")
@mock.patch("certbot.util.exe_exists")
- @mock.patch("certbot_apache.parser.subprocess.Popen")
+ @mock.patch("certbot_apache._internal.parser.subprocess.Popen")
def test_enable_mod(self, mock_popen, mock_exe_exists, mock_run_script):
mock_popen().communicate.return_value = ("Define: DUMP_RUN_CFG", "")
mock_popen().returncode = 0
@@ -79,9 +78,9 @@ class MultipleVhostsTestDebian(util.ApacheTest):
def test_enable_site_failure(self):
self.config.parser.root = "/tmp/nonexistent"
- with mock.patch("os.path.isdir") as mock_dir:
+ with mock.patch("certbot.compat.os.path.isdir") as mock_dir:
mock_dir.return_value = True
- with mock.patch("os.path.islink") as mock_link:
+ with mock.patch("certbot.compat.os.path.islink") as mock_link:
mock_link.return_value = False
self.assertRaises(
errors.NotSupportedError,
@@ -196,7 +195,7 @@ class MultipleVhostsTestDebian(util.ApacheTest):
def test_enable_site_call_parent(self):
with mock.patch(
- "certbot_apache.configurator.ApacheConfigurator.enable_site") as e_s:
+ "certbot_apache._internal.configurator.ApacheConfigurator.enable_site") as e_s:
self.config.parser.root = "/tmp/nonexistent"
vh = self.vh_truth[0]
vh.enabled = False
diff --git a/certbot-apache/certbot_apache/tests/display_ops_test.py b/certbot-apache/tests/display_ops_test.py
index df5cdbac0..50bdc03cf 100644
--- a/certbot-apache/certbot_apache/tests/display_ops_test.py
+++ b/certbot-apache/tests/display_ops_test.py
@@ -1,22 +1,18 @@
-"""Test certbot_apache.display_ops."""
+"""Test certbot_apache._internal.display_ops."""
import unittest
import mock
from certbot import errors
-
from certbot.display import util as display_util
-
from certbot.tests import util as certbot_util
-
-from certbot_apache import obj
-
-from certbot_apache.display_ops import select_vhost_multiple
-from certbot_apache.tests import util
+from certbot_apache._internal import obj
+from certbot_apache._internal.display_ops import select_vhost_multiple
+import util
class SelectVhostMultiTest(unittest.TestCase):
- """Tests for certbot_apache.display_ops.select_vhost_multiple."""
+ """Tests for certbot_apache._internal.display_ops.select_vhost_multiple."""
def setUp(self):
self.base_dir = "/example_path"
@@ -45,7 +41,7 @@ class SelectVhostMultiTest(unittest.TestCase):
self.assertFalse(vhs)
class SelectVhostTest(unittest.TestCase):
- """Tests for certbot_apache.display_ops.select_vhost."""
+ """Tests for certbot_apache._internal.display_ops.select_vhost."""
def setUp(self):
self.base_dir = "/example_path"
@@ -54,7 +50,7 @@ class SelectVhostTest(unittest.TestCase):
@classmethod
def _call(cls, vhosts):
- from certbot_apache.display_ops import select_vhost
+ from certbot_apache._internal.display_ops import select_vhost
return select_vhost("example.com", vhosts)
@certbot_util.patch_get_utility()
@@ -81,9 +77,9 @@ class SelectVhostTest(unittest.TestCase):
def test_no_vhosts(self):
self.assertEqual(self._call([]), None)
- @mock.patch("certbot_apache.display_ops.display_util")
+ @mock.patch("certbot_apache._internal.display_ops.display_util")
@certbot_util.patch_get_utility()
- @mock.patch("certbot_apache.display_ops.logger")
+ @mock.patch("certbot_apache._internal.display_ops.logger")
def test_small_display(self, mock_logger, mock_util, mock_display_util):
mock_display_util.WIDTH = 20
mock_util().menu.return_value = (display_util.OK, 0)
diff --git a/certbot-apache/certbot_apache/tests/entrypoint_test.py b/certbot-apache/tests/entrypoint_test.py
index c04611465..04c393bdf 100644
--- a/certbot-apache/certbot_apache/tests/entrypoint_test.py
+++ b/certbot-apache/tests/entrypoint_test.py
@@ -1,10 +1,11 @@
-"""Test for certbot_apache.entrypoint for override class resolution"""
+"""Test for certbot_apache._internal.entrypoint for override class resolution"""
import unittest
import mock
-from certbot_apache import configurator
-from certbot_apache import entrypoint
+from certbot_apache._internal import configurator
+from certbot_apache._internal import entrypoint
+
class EntryPointTest(unittest.TestCase):
"""Entrypoint tests"""
@@ -14,8 +15,13 @@ class EntryPointTest(unittest.TestCase):
def test_get_configurator(self):
with mock.patch("certbot.util.get_os_info") as mock_info:
- for distro in entrypoint.OVERRIDE_CLASSES.keys():
- mock_info.return_value = (distro, "whatever")
+ for distro in entrypoint.OVERRIDE_CLASSES:
+ return_value = (distro, "whatever")
+ if distro == 'fedora_old':
+ return_value = ('fedora', '28')
+ elif distro == 'fedora':
+ return_value = ('fedora', '29')
+ mock_info.return_value = return_value
self.assertEqual(entrypoint.get_configurator(),
entrypoint.OVERRIDE_CLASSES[distro])
@@ -23,7 +29,7 @@ class EntryPointTest(unittest.TestCase):
with mock.patch("certbot.util.get_os_info") as mock_info:
mock_info.return_value = ("nonexistent", "irrelevant")
with mock.patch("certbot.util.get_systemd_os_like") as mock_like:
- for like in entrypoint.OVERRIDE_CLASSES.keys():
+ for like in entrypoint.OVERRIDE_CLASSES:
mock_like.return_value = [like]
self.assertEqual(entrypoint.get_configurator(),
entrypoint.OVERRIDE_CLASSES[like])
diff --git a/certbot-apache/tests/fedora_test.py b/certbot-apache/tests/fedora_test.py
new file mode 100644
index 000000000..2bfd6babb
--- /dev/null
+++ b/certbot-apache/tests/fedora_test.py
@@ -0,0 +1,194 @@
+"""Test for certbot_apache._internal.configurator for Fedora 29+ overrides"""
+import unittest
+
+import mock
+
+from certbot import errors
+from certbot.compat import filesystem
+from certbot.compat import os
+from certbot_apache._internal import obj
+from certbot_apache._internal import override_fedora
+import util
+
+
+def get_vh_truth(temp_dir, config_name):
+ """Return the ground truth for the specified directory."""
+ prefix = os.path.join(
+ temp_dir, config_name, "httpd/conf.d")
+
+ aug_pre = "/files" + prefix
+ # TODO: eventually, these tests should have a dedicated configuration instead
+ # of reusing the ones from centos_test
+ vh_truth = [
+ obj.VirtualHost(
+ os.path.join(prefix, "centos.example.com.conf"),
+ os.path.join(aug_pre, "centos.example.com.conf/VirtualHost"),
+ {obj.Addr.fromstring("*:80")},
+ False, True, "centos.example.com"),
+ obj.VirtualHost(
+ os.path.join(prefix, "ssl.conf"),
+ os.path.join(aug_pre, "ssl.conf/VirtualHost"),
+ {obj.Addr.fromstring("_default_:443")},
+ True, True, None)
+ ]
+ return vh_truth
+
+
+class FedoraRestartTest(util.ApacheTest):
+ """Tests for Fedora specific self-signed certificate override"""
+
+ # TODO: eventually, these tests should have a dedicated configuration instead
+ # of reusing the ones from centos_test
+ def setUp(self): # pylint: disable=arguments-differ
+ test_dir = "centos7_apache/apache"
+ config_root = "centos7_apache/apache/httpd"
+ vhost_root = "centos7_apache/apache/httpd/conf.d"
+ super(FedoraRestartTest, self).setUp(test_dir=test_dir,
+ config_root=config_root,
+ vhost_root=vhost_root)
+ self.config = util.get_apache_configurator(
+ self.config_path, self.vhost_path, self.config_dir, self.work_dir,
+ os_info="fedora")
+ self.vh_truth = get_vh_truth(
+ self.temp_dir, "centos7_apache/apache")
+
+ def _run_fedora_test(self):
+ self.assertIsInstance(self.config, override_fedora.FedoraConfigurator)
+ self.config.config_test()
+
+ def test_fedora_restart_error(self):
+ c_test = "certbot_apache._internal.configurator.ApacheConfigurator.config_test"
+ with mock.patch(c_test) as mock_test:
+ # First call raises error, second doesn't
+ mock_test.side_effect = [errors.MisconfigurationError, '']
+ with mock.patch("certbot.util.run_script") as mock_run:
+ mock_run.side_effect = errors.SubprocessError
+ self.assertRaises(errors.MisconfigurationError,
+ self._run_fedora_test)
+
+ def test_fedora_restart(self):
+ c_test = "certbot_apache._internal.configurator.ApacheConfigurator.config_test"
+ with mock.patch(c_test) as mock_test:
+ with mock.patch("certbot.util.run_script") as mock_run:
+ # First call raises error, second doesn't
+ mock_test.side_effect = [errors.MisconfigurationError, '']
+ self._run_fedora_test()
+ self.assertEqual(mock_test.call_count, 2)
+ self.assertEqual(mock_run.call_args[0][0],
+ ['systemctl', 'restart', 'httpd'])
+
+
+class MultipleVhostsTestFedora(util.ApacheTest):
+ """Multiple vhost tests for CentOS / RHEL family of distros"""
+
+ _multiprocess_can_split_ = True
+
+ def setUp(self): # pylint: disable=arguments-differ
+ test_dir = "centos7_apache/apache"
+ config_root = "centos7_apache/apache/httpd"
+ vhost_root = "centos7_apache/apache/httpd/conf.d"
+ super(MultipleVhostsTestFedora, self).setUp(test_dir=test_dir,
+ config_root=config_root,
+ vhost_root=vhost_root)
+
+ self.config = util.get_apache_configurator(
+ self.config_path, self.vhost_path, self.config_dir, self.work_dir,
+ os_info="fedora")
+ self.vh_truth = get_vh_truth(
+ self.temp_dir, "centos7_apache/apache")
+
+ def test_get_parser(self):
+ self.assertIsInstance(self.config.parser, override_fedora.FedoraParser)
+
+ @mock.patch("certbot_apache._internal.parser.ApacheParser._get_runtime_cfg")
+ def test_opportunistic_httpd_runtime_parsing(self, mock_get):
+ define_val = (
+ 'Define: TEST1\n'
+ 'Define: TEST2\n'
+ 'Define: DUMP_RUN_CFG\n'
+ )
+ mod_val = (
+ 'Loaded Modules:\n'
+ ' mock_module (static)\n'
+ ' another_module (static)\n'
+ )
+ def mock_get_cfg(command):
+ """Mock httpd process stdout"""
+ if command == ['httpd', '-t', '-D', 'DUMP_RUN_CFG']:
+ return define_val
+ elif command == ['httpd', '-t', '-D', 'DUMP_MODULES']:
+ return mod_val
+ return ""
+ mock_get.side_effect = mock_get_cfg
+ self.config.parser.modules = set()
+ self.config.parser.variables = {}
+
+ with mock.patch("certbot.util.get_os_info") as mock_osi:
+ # Make sure we have the have the CentOS httpd constants
+ mock_osi.return_value = ("fedora", "29")
+ self.config.parser.update_runtime_variables()
+
+ self.assertEqual(mock_get.call_count, 3)
+ self.assertEqual(len(self.config.parser.modules), 4)
+ self.assertEqual(len(self.config.parser.variables), 2)
+ self.assertTrue("TEST2" in self.config.parser.variables.keys())
+ self.assertTrue("mod_another.c" in self.config.parser.modules)
+
+ @mock.patch("certbot_apache._internal.configurator.util.run_script")
+ def test_get_version(self, mock_run_script):
+ mock_run_script.return_value = ('', None)
+ self.assertRaises(errors.PluginError, self.config.get_version)
+ self.assertEqual(mock_run_script.call_args[0][0][0], 'httpd')
+
+ def test_get_virtual_hosts(self):
+ """Make sure all vhosts are being properly found."""
+ vhs = self.config.get_virtual_hosts()
+ self.assertEqual(len(vhs), 2)
+ found = 0
+
+ for vhost in vhs:
+ for centos_truth in self.vh_truth:
+ if vhost == centos_truth:
+ found += 1
+ break
+ else:
+ raise Exception("Missed: %s" % vhost) # pragma: no cover
+ self.assertEqual(found, 2)
+
+ @mock.patch("certbot_apache._internal.parser.ApacheParser._get_runtime_cfg")
+ def test_get_sysconfig_vars(self, mock_cfg):
+ """Make sure we read the sysconfig OPTIONS variable correctly"""
+ # Return nothing for the process calls
+ mock_cfg.return_value = ""
+ self.config.parser.sysconfig_filep = filesystem.realpath(
+ os.path.join(self.config.parser.root, "../sysconfig/httpd"))
+ self.config.parser.variables = {}
+
+ with mock.patch("certbot.util.get_os_info") as mock_osi:
+ # Make sure we have the have the CentOS httpd constants
+ mock_osi.return_value = ("fedora", "29")
+ self.config.parser.update_runtime_variables()
+
+ self.assertTrue("mock_define" in self.config.parser.variables.keys())
+ self.assertTrue("mock_define_too" in self.config.parser.variables.keys())
+ self.assertTrue("mock_value" in self.config.parser.variables.keys())
+ self.assertEqual("TRUE", self.config.parser.variables["mock_value"])
+ self.assertTrue("MOCK_NOSEP" in self.config.parser.variables.keys())
+ self.assertEqual("NOSEP_VAL", self.config.parser.variables["NOSEP_TWO"])
+
+ @mock.patch("certbot_apache._internal.configurator.util.run_script")
+ def test_alt_restart_works(self, mock_run_script):
+ mock_run_script.side_effect = [None, errors.SubprocessError, None]
+ self.config.restart()
+ self.assertEqual(mock_run_script.call_count, 3)
+
+ @mock.patch("certbot_apache._internal.configurator.util.run_script")
+ def test_alt_restart_errors(self, mock_run_script):
+ mock_run_script.side_effect = [None,
+ errors.SubprocessError,
+ errors.SubprocessError]
+ self.assertRaises(errors.MisconfigurationError, self.config.restart)
+
+
+if __name__ == "__main__":
+ unittest.main() # pragma: no cover
diff --git a/certbot-apache/certbot_apache/tests/gentoo_test.py b/certbot-apache/tests/gentoo_test.py
index f09d742a4..90a163fd3 100644
--- a/certbot-apache/certbot_apache/tests/gentoo_test.py
+++ b/certbot-apache/tests/gentoo_test.py
@@ -1,14 +1,15 @@
-"""Test for certbot_apache.configurator for Gentoo overrides"""
-import os
+"""Test for certbot_apache._internal.configurator for Gentoo overrides"""
import unittest
import mock
from certbot import errors
+from certbot.compat import filesystem
+from certbot.compat import os
+from certbot_apache._internal import obj
+from certbot_apache._internal import override_gentoo
+import util
-from certbot_apache import override_gentoo
-from certbot_apache import obj
-from certbot_apache.tests import util
def get_vh_truth(temp_dir, config_name):
"""Return the ground truth for the specified directory."""
@@ -50,7 +51,8 @@ class MultipleVhostsTestGentoo(util.ApacheTest):
config_root=config_root,
vhost_root=vhost_root)
- with mock.patch("certbot_apache.override_gentoo.GentooParser.update_runtime_variables"):
+ # pylint: disable=line-too-long
+ with mock.patch("certbot_apache._internal.override_gentoo.GentooParser.update_runtime_variables"):
self.config = util.get_apache_configurator(
self.config_path, self.vhost_path, self.config_dir, self.work_dir,
os_info="gentoo")
@@ -80,20 +82,20 @@ class MultipleVhostsTestGentoo(util.ApacheTest):
"""Make sure we read the Gentoo APACHE2_OPTS variable correctly"""
defines = ['DEFAULT_VHOST', 'INFO',
'SSL', 'SSL_DEFAULT_VHOST', 'LANGUAGE']
- self.config.parser.apacheconfig_filep = os.path.realpath(
+ self.config.parser.apacheconfig_filep = filesystem.realpath(
os.path.join(self.config.parser.root, "../conf.d/apache2"))
self.config.parser.variables = {}
- with mock.patch("certbot_apache.override_gentoo.GentooParser.update_modules"):
+ with mock.patch("certbot_apache._internal.override_gentoo.GentooParser.update_modules"):
self.config.parser.update_runtime_variables()
for define in defines:
self.assertTrue(define in self.config.parser.variables.keys())
- @mock.patch("certbot_apache.parser.ApacheParser.parse_from_subprocess")
+ @mock.patch("certbot_apache._internal.parser.ApacheParser.parse_from_subprocess")
def test_no_binary_configdump(self, mock_subprocess):
"""Make sure we don't call binary dumps other than modules from Apache
as this is not supported in Gentoo currently"""
- with mock.patch("certbot_apache.override_gentoo.GentooParser.update_modules"):
+ with mock.patch("certbot_apache._internal.override_gentoo.GentooParser.update_modules"):
self.config.parser.update_runtime_variables()
self.config.parser.reset_modules()
self.assertFalse(mock_subprocess.called)
@@ -102,7 +104,7 @@ class MultipleVhostsTestGentoo(util.ApacheTest):
self.config.parser.reset_modules()
self.assertTrue(mock_subprocess.called)
- @mock.patch("certbot_apache.parser.ApacheParser._get_runtime_cfg")
+ @mock.patch("certbot_apache._internal.parser.ApacheParser._get_runtime_cfg")
def test_opportunistic_httpd_runtime_parsing(self, mock_get):
mod_val = (
'Loaded Modules:\n'
@@ -113,6 +115,7 @@ class MultipleVhostsTestGentoo(util.ApacheTest):
"""Mock httpd process stdout"""
if command == ['apache2ctl', 'modules']:
return mod_val
+ return None # pragma: no cover
mock_get.side_effect = mock_get_cfg
self.config.parser.modules = set()
@@ -125,7 +128,7 @@ class MultipleVhostsTestGentoo(util.ApacheTest):
self.assertEqual(len(self.config.parser.modules), 4)
self.assertTrue("mod_another.c" in self.config.parser.modules)
- @mock.patch("certbot_apache.configurator.util.run_script")
+ @mock.patch("certbot_apache._internal.configurator.util.run_script")
def test_alt_restart_works(self, mock_run_script):
mock_run_script.side_effect = [None, errors.SubprocessError, None]
self.config.restart()
diff --git a/certbot-apache/certbot_apache/tests/http_01_test.py b/certbot-apache/tests/http_01_test.py
index 9c729b08c..643a6bdd5 100644
--- a/certbot-apache/certbot_apache/tests/http_01_test.py
+++ b/certbot-apache/tests/http_01_test.py
@@ -1,34 +1,33 @@
-"""Test for certbot_apache.http_01."""
-import mock
-import os
+"""Test for certbot_apache._internal.http_01."""
import unittest
+import mock
+
from acme import challenges
from acme.magic_typing import List # pylint: disable=unused-import, no-name-in-module
-
from certbot import achallenges
from certbot import errors
-
+from certbot.compat import filesystem
+from certbot.compat import os
from certbot.tests import acme_util
-from certbot_apache.parser import get_aug_path
-from certbot_apache.tests import util
-
+from certbot_apache._internal.parser import get_aug_path
+import util
NUM_ACHALLS = 3
class ApacheHttp01Test(util.ApacheTest):
- """Test for certbot_apache.http_01.ApacheHttp01."""
+ """Test for certbot_apache._internal.http_01.ApacheHttp01."""
- def setUp(self, *args, **kwargs):
+ def setUp(self, *args, **kwargs): # pylint: disable=arguments-differ
super(ApacheHttp01Test, self).setUp(*args, **kwargs)
self.account_key = self.rsa512jwk
self.achalls = [] # type: List[achallenges.KeyAuthorizationAnnotatedChallenge]
vh_truth = util.get_vh_truth(
self.temp_dir, "debian_apache_2_4/multiple_vhosts")
- # Takes the vhosts for encryption-example.demo, certbot.demo, and
- # vhost.in.rootconf
+ # Takes the vhosts for encryption-example.demo, certbot.demo
+ # and vhost.in.rootconf
self.vhosts = [vh_truth[0], vh_truth[3], vh_truth[10]]
for i in range(NUM_ACHALLS):
@@ -39,18 +38,18 @@ class ApacheHttp01Test(util.ApacheTest):
"pending"),
domain=self.vhosts[i].name, account_key=self.account_key))
- modules = ["rewrite", "authz_core", "authz_host"]
+ modules = ["ssl", "rewrite", "authz_core", "authz_host"]
for mod in modules:
self.config.parser.modules.add("mod_{0}.c".format(mod))
self.config.parser.modules.add(mod + "_module")
- from certbot_apache.http_01 import ApacheHttp01
+ from certbot_apache._internal.http_01 import ApacheHttp01
self.http = ApacheHttp01(self.config)
def test_empty_perform(self):
self.assertFalse(self.http.perform())
- @mock.patch("certbot_apache.configurator.ApacheConfigurator.enable_mod")
+ @mock.patch("certbot_apache._internal.configurator.ApacheConfigurator.enable_mod")
def test_enable_modules_apache_2_2(self, mock_enmod):
self.config.version = (2, 2)
self.config.parser.modules.remove("authz_host_module")
@@ -59,7 +58,7 @@ class ApacheHttp01Test(util.ApacheTest):
enmod_calls = self.common_enable_modules_test(mock_enmod)
self.assertEqual(enmod_calls[0][0][0], "authz_host")
- @mock.patch("certbot_apache.configurator.ApacheConfigurator.enable_mod")
+ @mock.patch("certbot_apache._internal.configurator.ApacheConfigurator.enable_mod")
def test_enable_modules_apache_2_4(self, mock_enmod):
self.config.parser.modules.remove("authz_core_module")
self.config.parser.modules.remove("mod_authz_core.c")
@@ -78,7 +77,7 @@ class ApacheHttp01Test(util.ApacheTest):
calls = mock_enmod.call_args_list
other_calls = []
for call in calls:
- if "rewrite" != call[0][0]:
+ if call[0][0] != "rewrite":
other_calls.append(call)
# If these lists are equal, we never enabled mod_rewrite
@@ -111,6 +110,17 @@ class ApacheHttp01Test(util.ApacheTest):
domain="something.nonexistent", account_key=self.account_key)]
self.common_perform_test(achalls, vhosts)
+ def test_configure_multiple_vhosts(self):
+ vhosts = [v for v in self.config.vhosts if "duplicate.example.com" in v.get_names()]
+ self.assertEqual(len(vhosts), 2)
+ achalls = [
+ achallenges.KeyAuthorizationAnnotatedChallenge(
+ challb=acme_util.chall_to_challb(
+ challenges.HTTP01(token=((b'a' * 16))),
+ "pending"),
+ domain="duplicate.example.com", account_key=self.account_key)]
+ self.common_perform_test(achalls, vhosts)
+
def test_no_vhost(self):
for achall in self.achalls:
self.http.add_chall(achall)
@@ -169,22 +179,21 @@ class ApacheHttp01Test(util.ApacheTest):
self.assertEqual(self.http.perform(), expected_response)
self.assertTrue(os.path.isdir(self.http.challenge_dir))
- self._has_min_permissions(self.http.challenge_dir, 0o755)
+ self.assertTrue(filesystem.has_min_permissions(self.http.challenge_dir, 0o755))
self._test_challenge_conf()
for achall in achalls:
self._test_challenge_file(achall)
for vhost in vhosts:
- if not vhost.ssl:
- matches = self.config.parser.find_dir("Include",
- self.http.challenge_conf_pre,
- vhost.path)
- self.assertEqual(len(matches), 1)
- matches = self.config.parser.find_dir("Include",
- self.http.challenge_conf_post,
- vhost.path)
- self.assertEqual(len(matches), 1)
+ matches = self.config.parser.find_dir("Include",
+ self.http.challenge_conf_pre,
+ vhost.path)
+ self.assertEqual(len(matches), 1)
+ matches = self.config.parser.find_dir("Include",
+ self.http.challenge_conf_post,
+ vhost.path)
+ self.assertEqual(len(matches), 1)
self.assertTrue(os.path.exists(challenge_dir))
@@ -208,15 +217,10 @@ class ApacheHttp01Test(util.ApacheTest):
name = os.path.join(self.http.challenge_dir, achall.chall.encode("token"))
validation = achall.validation(self.account_key)
- self._has_min_permissions(name, 0o644)
+ self.assertTrue(filesystem.has_min_permissions(name, 0o644))
with open(name, 'rb') as f:
self.assertEqual(f.read(), validation.encode())
- def _has_min_permissions(self, path, min_mode):
- """Tests the given file has at least the permissions in mode."""
- st_mode = os.stat(path).st_mode
- self.assertEqual(st_mode, st_mode | min_mode)
-
if __name__ == "__main__":
unittest.main() # pragma: no cover
diff --git a/certbot-apache/certbot_apache/tests/obj_test.py b/certbot-apache/tests/obj_test.py
index 10dba18bc..1761b9c94 100644
--- a/certbot-apache/certbot_apache/tests/obj_test.py
+++ b/certbot-apache/tests/obj_test.py
@@ -1,4 +1,4 @@
-"""Tests for certbot_apache.obj."""
+"""Tests for certbot_apache._internal.obj."""
import unittest
@@ -6,8 +6,8 @@ class VirtualHostTest(unittest.TestCase):
"""Test the VirtualHost class."""
def setUp(self):
- from certbot_apache.obj import Addr
- from certbot_apache.obj import VirtualHost
+ from certbot_apache._internal.obj import Addr
+ from certbot_apache._internal.obj import VirtualHost
self.addr1 = Addr.fromstring("127.0.0.1")
self.addr2 = Addr.fromstring("127.0.0.1:443")
@@ -23,7 +23,8 @@ class VirtualHostTest(unittest.TestCase):
"fp", "vhp", set([self.addr2]), False, False, "localhost")
def test_repr(self):
- self.assertEqual(repr(self.addr2), "certbot_apache.obj.Addr(('127.0.0.1', '443'))")
+ self.assertEqual(repr(self.addr2),
+ "certbot_apache._internal.obj.Addr(('127.0.0.1', '443'))")
def test_eq(self):
self.assertTrue(self.vhost1b == self.vhost1)
@@ -36,8 +37,8 @@ class VirtualHostTest(unittest.TestCase):
self.assertFalse(self.vhost1 != self.vhost1b)
def test_conflicts(self):
- from certbot_apache.obj import Addr
- from certbot_apache.obj import VirtualHost
+ from certbot_apache._internal.obj import Addr
+ from certbot_apache._internal.obj import VirtualHost
complex_vh = VirtualHost(
"fp", "vhp",
@@ -54,7 +55,7 @@ class VirtualHostTest(unittest.TestCase):
self.addr_default]))
def test_same_server(self):
- from certbot_apache.obj import VirtualHost
+ from certbot_apache._internal.obj import VirtualHost
no_name1 = VirtualHost(
"fp", "vhp", set([self.addr1]), False, False, None)
no_name2 = VirtualHost(
@@ -77,7 +78,7 @@ class VirtualHostTest(unittest.TestCase):
class AddrTest(unittest.TestCase):
"""Test obj.Addr."""
def setUp(self):
- from certbot_apache.obj import Addr
+ from certbot_apache._internal.obj import Addr
self.addr = Addr.fromstring("*:443")
self.addr1 = Addr.fromstring("127.0.0.1")
@@ -92,7 +93,7 @@ class AddrTest(unittest.TestCase):
self.assertTrue(self.addr2.is_wildcard())
def test_get_sni_addr(self):
- from certbot_apache.obj import Addr
+ from certbot_apache._internal.obj import Addr
self.assertEqual(
self.addr.get_sni_addr("443"), Addr.fromstring("*:443"))
self.assertEqual(
diff --git a/certbot-apache/certbot_apache/tests/parser_test.py b/certbot-apache/tests/parser_test.py
index a089ec471..b334ce52e 100644
--- a/certbot-apache/certbot_apache/tests/parser_test.py
+++ b/certbot-apache/tests/parser_test.py
@@ -1,14 +1,12 @@
-"""Tests for certbot_apache.parser."""
-import os
+"""Tests for certbot_apache._internal.parser."""
import shutil
import unittest
-import augeas
import mock
from certbot import errors
-
-from certbot_apache.tests import util
+from certbot.compat import os
+import util
class BasicParserTest(util.ParserTest):
@@ -22,6 +20,27 @@ class BasicParserTest(util.ParserTest):
shutil.rmtree(self.config_dir)
shutil.rmtree(self.work_dir)
+ def test_bad_parse(self):
+ self.parser.parse_file(os.path.join(self.parser.root,
+ "conf-available", "bad_conf_file.conf"))
+ self.assertRaises(
+ errors.PluginError, self.parser.check_parsing_errors, "httpd.aug")
+
+ def test_bad_save(self):
+ mock_save = mock.Mock()
+ mock_save.side_effect = IOError
+ self.parser.aug.save = mock_save
+ self.assertRaises(errors.PluginError, self.parser.unsaved_files)
+
+ def test_aug_version(self):
+ mock_match = mock.Mock(return_value=["something"])
+ self.parser.aug.match = mock_match
+ # pylint: disable=protected-access
+ self.assertEqual(self.parser.check_aug_version(),
+ ["something"])
+ self.parser.aug.match.side_effect = RuntimeError
+ self.assertFalse(self.parser.check_aug_version())
+
def test_find_config_root_no_root(self):
# pylint: disable=protected-access
os.remove(self.parser.loc["root"])
@@ -52,7 +71,7 @@ class BasicParserTest(util.ParserTest):
test2 = self.parser.find_dir("documentroot")
self.assertEqual(len(test), 1)
- self.assertEqual(len(test2), 7)
+ self.assertEqual(len(test2), 8)
def test_add_dir(self):
aug_default = "/files" + self.parser.loc["default"]
@@ -93,7 +112,7 @@ class BasicParserTest(util.ParserTest):
Path must be valid before attempting to add to augeas
"""
- from certbot_apache.parser import get_aug_path
+ from certbot_apache._internal.parser import get_aug_path
# This makes sure that find_dir will work
self.parser.modules.add("mod_ssl.c")
@@ -107,7 +126,7 @@ class BasicParserTest(util.ParserTest):
self.assertTrue("IfModule" in matches[0])
def test_add_dir_to_ifmodssl_multiple(self):
- from certbot_apache.parser import get_aug_path
+ from certbot_apache._internal.parser import get_aug_path
# This makes sure that find_dir will work
self.parser.modules.add("mod_ssl.c")
@@ -121,11 +140,11 @@ class BasicParserTest(util.ParserTest):
self.assertTrue("IfModule" in matches[0])
def test_get_aug_path(self):
- from certbot_apache.parser import get_aug_path
+ from certbot_apache._internal.parser import get_aug_path
self.assertEqual("/files/etc/apache", get_aug_path("/etc/apache"))
def test_set_locations(self):
- with mock.patch("certbot_apache.parser.os.path") as mock_path:
+ with mock.patch("certbot_apache._internal.parser.os.path") as mock_path:
mock_path.isfile.side_effect = [False, False]
@@ -135,18 +154,18 @@ class BasicParserTest(util.ParserTest):
self.assertEqual(results["default"], results["listen"])
self.assertEqual(results["default"], results["name"])
- @mock.patch("certbot_apache.parser.ApacheParser.find_dir")
- @mock.patch("certbot_apache.parser.ApacheParser.get_arg")
+ @mock.patch("certbot_apache._internal.parser.ApacheParser.find_dir")
+ @mock.patch("certbot_apache._internal.parser.ApacheParser.get_arg")
def test_parse_modules_bad_syntax(self, mock_arg, mock_find):
mock_find.return_value = ["1", "2", "3", "4", "5", "6", "7", "8"]
mock_arg.return_value = None
- with mock.patch("certbot_apache.parser.logger") as mock_logger:
+ with mock.patch("certbot_apache._internal.parser.logger") as mock_logger:
self.parser.parse_modules()
# Make sure that we got None return value and logged the file
self.assertTrue(mock_logger.debug.called)
- @mock.patch("certbot_apache.parser.ApacheParser.find_dir")
- @mock.patch("certbot_apache.parser.ApacheParser._get_runtime_cfg")
+ @mock.patch("certbot_apache._internal.parser.ApacheParser.find_dir")
+ @mock.patch("certbot_apache._internal.parser.ApacheParser._get_runtime_cfg")
def test_update_runtime_variables(self, mock_cfg, _):
define_val = (
'ServerRoot: "/etc/apache2"\n'
@@ -234,6 +253,7 @@ class BasicParserTest(util.ParserTest):
return inc_val
elif cmd[-1] == "DUMP_MODULES":
return mod_val
+ return None # pragma: no cover
mock_cfg.side_effect = mock_get_vars
@@ -242,7 +262,7 @@ class BasicParserTest(util.ParserTest):
self.parser.modules = set()
with mock.patch(
- "certbot_apache.parser.ApacheParser.parse_file") as mock_parse:
+ "certbot_apache._internal.parser.ApacheParser.parse_file") as mock_parse:
self.parser.update_runtime_variables()
self.assertEqual(self.parser.variables, expected_vars)
self.assertEqual(len(self.parser.modules), 58)
@@ -250,8 +270,8 @@ class BasicParserTest(util.ParserTest):
# Make sure we tried to include them all.
self.assertEqual(mock_parse.call_count, 25)
- @mock.patch("certbot_apache.parser.ApacheParser.find_dir")
- @mock.patch("certbot_apache.parser.ApacheParser._get_runtime_cfg")
+ @mock.patch("certbot_apache._internal.parser.ApacheParser.find_dir")
+ @mock.patch("certbot_apache._internal.parser.ApacheParser._get_runtime_cfg")
def test_update_runtime_variables_alt_values(self, mock_cfg, _):
inc_val = (
'Included configuration files:\n'
@@ -265,7 +285,7 @@ class BasicParserTest(util.ParserTest):
self.parser.modules = set()
with mock.patch(
- "certbot_apache.parser.ApacheParser.parse_file") as mock_parse:
+ "certbot_apache._internal.parser.ApacheParser.parse_file") as mock_parse:
self.parser.update_runtime_variables()
# No matching modules should have been found
self.assertEqual(len(self.parser.modules), 0)
@@ -273,7 +293,7 @@ class BasicParserTest(util.ParserTest):
# path derived from root configuration Include statements
self.assertEqual(mock_parse.call_count, 1)
- @mock.patch("certbot_apache.parser.ApacheParser._get_runtime_cfg")
+ @mock.patch("certbot_apache._internal.parser.ApacheParser._get_runtime_cfg")
def test_update_runtime_vars_bad_output(self, mock_cfg):
mock_cfg.return_value = "Define: TLS=443=24"
self.parser.update_runtime_variables()
@@ -282,8 +302,8 @@ class BasicParserTest(util.ParserTest):
self.assertRaises(
errors.PluginError, self.parser.update_runtime_variables)
- @mock.patch("certbot_apache.configurator.ApacheConfigurator.option")
- @mock.patch("certbot_apache.parser.subprocess.Popen")
+ @mock.patch("certbot_apache._internal.configurator.ApacheConfigurator.option")
+ @mock.patch("certbot_apache._internal.parser.subprocess.Popen")
def test_update_runtime_vars_bad_ctl(self, mock_popen, mock_opt):
mock_popen.side_effect = OSError
mock_opt.return_value = "nonexistent"
@@ -291,7 +311,7 @@ class BasicParserTest(util.ParserTest):
errors.MisconfigurationError,
self.parser.update_runtime_variables)
- @mock.patch("certbot_apache.parser.subprocess.Popen")
+ @mock.patch("certbot_apache._internal.parser.subprocess.Popen")
def test_update_runtime_vars_bad_exit(self, mock_popen):
mock_popen().communicate.return_value = ("", "")
mock_popen.returncode = -1
@@ -300,7 +320,7 @@ class BasicParserTest(util.ParserTest):
self.parser.update_runtime_variables)
def test_add_comment(self):
- from certbot_apache.parser import get_aug_path
+ from certbot_apache._internal.parser import get_aug_path
self.parser.add_comment(get_aug_path(self.parser.loc["name"]), "123456")
comm = self.parser.find_comments("123456")
self.assertEqual(len(comm), 1)
@@ -310,53 +330,69 @@ class BasicParserTest(util.ParserTest):
class ParserInitTest(util.ApacheTest):
def setUp(self): # pylint: disable=arguments-differ
super(ParserInitTest, self).setUp()
- self.aug = augeas.Augeas(
- flags=augeas.Augeas.NONE | augeas.Augeas.NO_MODL_AUTOLOAD)
def tearDown(self):
shutil.rmtree(self.temp_dir)
shutil.rmtree(self.config_dir)
shutil.rmtree(self.work_dir)
- @mock.patch("certbot_apache.parser.ApacheParser._get_runtime_cfg")
+ @mock.patch("certbot_apache._internal.parser.ApacheParser.init_augeas")
+ def test_prepare_no_augeas(self, mock_init_augeas):
+ from certbot_apache._internal.parser import ApacheParser
+ mock_init_augeas.side_effect = errors.NoInstallationError
+ self.config.config_test = mock.Mock()
+ self.assertRaises(
+ errors.NoInstallationError, ApacheParser,
+ os.path.relpath(self.config_path), "/dummy/vhostpath",
+ version=(2, 4, 22), configurator=self.config)
+
+ def test_init_old_aug(self):
+ from certbot_apache._internal.parser import ApacheParser
+ with mock.patch("certbot_apache._internal.parser.ApacheParser.check_aug_version") as mock_c:
+ mock_c.return_value = False
+ self.assertRaises(
+ errors.NotSupportedError,
+ ApacheParser, os.path.relpath(self.config_path),
+ "/dummy/vhostpath", version=(2, 4, 22), configurator=self.config)
+
+ @mock.patch("certbot_apache._internal.parser.ApacheParser._get_runtime_cfg")
def test_unparseable(self, mock_cfg):
- from certbot_apache.parser import ApacheParser
+ from certbot_apache._internal.parser import ApacheParser
mock_cfg.return_value = ('Define: TEST')
self.assertRaises(
errors.PluginError,
- ApacheParser, self.aug, os.path.relpath(self.config_path),
+ ApacheParser, os.path.relpath(self.config_path),
"/dummy/vhostpath", version=(2, 2, 22), configurator=self.config)
def test_root_normalized(self):
- from certbot_apache.parser import ApacheParser
+ from certbot_apache._internal.parser import ApacheParser
- with mock.patch("certbot_apache.parser.ApacheParser."
+ with mock.patch("certbot_apache._internal.parser.ApacheParser."
"update_runtime_variables"):
path = os.path.join(
self.temp_dir,
"debian_apache_2_4/////multiple_vhosts/../multiple_vhosts/apache2")
- parser = ApacheParser(self.aug, path,
- "/dummy/vhostpath", configurator=self.config)
+ parser = ApacheParser(path, "/dummy/vhostpath", configurator=self.config)
self.assertEqual(parser.root, self.config_path)
def test_root_absolute(self):
- from certbot_apache.parser import ApacheParser
- with mock.patch("certbot_apache.parser.ApacheParser."
+ from certbot_apache._internal.parser import ApacheParser
+ with mock.patch("certbot_apache._internal.parser.ApacheParser."
"update_runtime_variables"):
parser = ApacheParser(
- self.aug, os.path.relpath(self.config_path),
+ os.path.relpath(self.config_path),
"/dummy/vhostpath", configurator=self.config)
self.assertEqual(parser.root, self.config_path)
def test_root_no_trailing_slash(self):
- from certbot_apache.parser import ApacheParser
- with mock.patch("certbot_apache.parser.ApacheParser."
+ from certbot_apache._internal.parser import ApacheParser
+ with mock.patch("certbot_apache._internal.parser.ApacheParser."
"update_runtime_variables"):
parser = ApacheParser(
- self.aug, self.config_path + os.path.sep,
+ self.config_path + os.path.sep,
"/dummy/vhostpath", configurator=self.config)
self.assertEqual(parser.root, self.config_path)
diff --git a/certbot-apache/tests/testdata/centos6_apache/apache/httpd/conf.d/README b/certbot-apache/tests/testdata/centos6_apache/apache/httpd/conf.d/README
new file mode 100644
index 000000000..c12e149f2
--- /dev/null
+++ b/certbot-apache/tests/testdata/centos6_apache/apache/httpd/conf.d/README
@@ -0,0 +1,9 @@
+
+This directory holds Apache 2.0 module-specific configuration files;
+any files in this directory which have the ".conf" extension will be
+processed as Apache configuration files.
+
+Files are processed in alphabetical order, so if using configuration
+directives which depend on, say, mod_perl being loaded, ensure that
+these are placed in a filename later in the sort order than "perl.conf".
+
diff --git a/certbot-apache/tests/testdata/centos6_apache/apache/httpd/conf.d/ssl.conf b/certbot-apache/tests/testdata/centos6_apache/apache/httpd/conf.d/ssl.conf
new file mode 100644
index 000000000..abe07dd0c
--- /dev/null
+++ b/certbot-apache/tests/testdata/centos6_apache/apache/httpd/conf.d/ssl.conf
@@ -0,0 +1,222 @@
+#
+# This is the Apache server configuration file providing SSL support.
+# It contains the configuration directives to instruct the server how to
+# serve pages over an https connection. For detailing information about these
+# directives see <URL:http://httpd.apache.org/docs/2.2/mod/mod_ssl.html>
+#
+# Do NOT simply read the instructions in here without understanding
+# what they do. They're here only as hints or reminders. If you are unsure
+# consult the online docs. You have been warned.
+#
+
+LoadModule ssl_module modules/mod_ssl.so
+
+#
+# When we also provide SSL we have to listen to the
+# the HTTPS port in addition.
+#
+Listen 443
+
+##
+## SSL Global Context
+##
+## All SSL configuration in this context applies both to
+## the main server and all SSL-enabled virtual hosts.
+##
+
+# Pass Phrase Dialog:
+# Configure the pass phrase gathering process.
+# The filtering dialog program (`builtin' is an internal
+# terminal dialog) has to provide the pass phrase on stdout.
+SSLPassPhraseDialog builtin
+
+# Inter-Process Session Cache:
+# Configure the SSL Session Cache: First the mechanism
+# to use and second the expiring timeout (in seconds).
+SSLSessionCache shmcb:/var/cache/mod_ssl/scache(512000)
+SSLSessionCacheTimeout 300
+
+# Semaphore:
+# Configure the path to the mutual exclusion semaphore the
+# SSL engine uses internally for inter-process synchronization.
+SSLMutex default
+
+# Pseudo Random Number Generator (PRNG):
+# Configure one or more sources to seed the PRNG of the
+# SSL library. The seed data should be of good random quality.
+# WARNING! On some platforms /dev/random blocks if not enough entropy
+# is available. This means you then cannot use the /dev/random device
+# because it would lead to very long connection times (as long as
+# it requires to make more entropy available). But usually those
+# platforms additionally provide a /dev/urandom device which doesn't
+# block. So, if available, use this one instead. Read the mod_ssl User
+# Manual for more details.
+SSLRandomSeed startup file:/dev/urandom 256
+SSLRandomSeed connect builtin
+#SSLRandomSeed startup file:/dev/random 512
+#SSLRandomSeed connect file:/dev/random 512
+#SSLRandomSeed connect file:/dev/urandom 512
+
+#
+# Use "SSLCryptoDevice" to enable any supported hardware
+# accelerators. Use "openssl engine -v" to list supported
+# engine names. NOTE: If you enable an accelerator and the
+# server does not start, consult the error logs and ensure
+# your accelerator is functioning properly.
+#
+SSLCryptoDevice builtin
+#SSLCryptoDevice ubsec
+
+##
+## SSL Virtual Host Context
+##
+
+<VirtualHost _default_:443>
+
+# General setup for the virtual host, inherited from global configuration
+#DocumentRoot "/var/www/html"
+#ServerName www.example.com:443
+
+# Use separate log files for the SSL virtual host; note that LogLevel
+# is not inherited from httpd.conf.
+ErrorLog logs/ssl_error_log
+TransferLog logs/ssl_access_log
+LogLevel warn
+
+# SSL Engine Switch:
+# Enable/Disable SSL for this virtual host.
+SSLEngine on
+
+# SSL Protocol support:
+# List the enable protocol levels with which clients will be able to
+# connect. Disable SSLv2 access by default:
+SSLProtocol all -SSLv2
+
+# SSL Cipher Suite:
+# List the ciphers that the client is permitted to negotiate.
+# See the mod_ssl documentation for a complete list.
+SSLCipherSuite DEFAULT:!EXP:!SSLv2:!DES:!IDEA:!SEED:+3DES
+
+# Server Certificate:
+# Point SSLCertificateFile at a PEM encoded certificate. If
+# the certificate is encrypted, then you will be prompted for a
+# pass phrase. Note that a kill -HUP will prompt again. A new
+# certificate can be generated using the genkey(1) command.
+SSLCertificateFile /etc/pki/tls/certs/localhost.crt
+
+# Server Private Key:
+# If the key is not combined with the certificate, use this
+# directive to point at the key file. Keep in mind that if
+# you've both a RSA and a DSA private key you can configure
+# both in parallel (to also allow the use of DSA ciphers, etc.)
+SSLCertificateKeyFile /etc/pki/tls/private/localhost.key
+
+# Server Certificate Chain:
+# Point SSLCertificateChainFile at a file containing the
+# concatenation of PEM encoded CA certificates which form the
+# certificate chain for the server certificate. Alternatively
+# the referenced file can be the same as SSLCertificateFile
+# when the CA certificates are directly appended to the server
+# certificate for convinience.
+#SSLCertificateChainFile /etc/pki/tls/certs/server-chain.crt
+
+# Certificate Authority (CA):
+# Set the CA certificate verification path where to find CA
+# certificates for client authentication or alternatively one
+# huge file containing all of them (file must be PEM encoded)
+#SSLCACertificateFile /etc/pki/tls/certs/ca-bundle.crt
+
+# Client Authentication (Type):
+# Client certificate verification type and depth. Types are
+# none, optional, require and optional_no_ca. Depth is a
+# number which specifies how deeply to verify the certificate
+# issuer chain before deciding the certificate is not valid.
+#SSLVerifyClient require
+#SSLVerifyDepth 10
+
+# Access Control:
+# With SSLRequire you can do per-directory access control based
+# on arbitrary complex boolean expressions containing server
+# variable checks and other lookup directives. The syntax is a
+# mixture between C and Perl. See the mod_ssl documentation
+# for more details.
+#<Location />
+#SSLRequire ( %{SSL_CIPHER} !~ m/^(EXP|NULL)/ \
+# and %{SSL_CLIENT_S_DN_O} eq "Snake Oil, Ltd." \
+# and %{SSL_CLIENT_S_DN_OU} in {"Staff", "CA", "Dev"} \
+# and %{TIME_WDAY} >= 1 and %{TIME_WDAY} <= 5 \
+# and %{TIME_HOUR} >= 8 and %{TIME_HOUR} <= 20 ) \
+# or %{REMOTE_ADDR} =~ m/^192\.76\.162\.[0-9]+$/
+#</Location>
+
+# SSL Engine Options:
+# Set various options for the SSL engine.
+# o FakeBasicAuth:
+# Translate the client X.509 into a Basic Authorisation. This means that
+# the standard Auth/DBMAuth methods can be used for access control. The
+# user name is the `one line' version of the client's X.509 certificate.
+# Note that no password is obtained from the user. Every entry in the user
+# file needs this password: `xxj31ZMTZzkVA'.
+# o ExportCertData:
+# This exports two additional environment variables: SSL_CLIENT_CERT and
+# SSL_SERVER_CERT. These contain the PEM-encoded certificates of the
+# server (always existing) and the client (only existing when client
+# authentication is used). This can be used to import the certificates
+# into CGI scripts.
+# o StdEnvVars:
+# This exports the standard SSL/TLS related `SSL_*' environment variables.
+# Per default this exportation is switched off for performance reasons,
+# because the extraction step is an expensive operation and is usually
+# useless for serving static content. So one usually enables the
+# exportation for CGI and SSI requests only.
+# o StrictRequire:
+# This denies access when "SSLRequireSSL" or "SSLRequire" applied even
+# under a "Satisfy any" situation, i.e. when it applies access is denied
+# and no other module can change it.
+# o OptRenegotiate:
+# This enables optimized SSL connection renegotiation handling when SSL
+# directives are used in per-directory context.
+#SSLOptions +FakeBasicAuth +ExportCertData +StrictRequire
+<Files ~ "\.(cgi|shtml|phtml|php3?)$">
+ SSLOptions +StdEnvVars
+</Files>
+<Directory "/var/www/cgi-bin">
+ SSLOptions +StdEnvVars
+</Directory>
+
+# SSL Protocol Adjustments:
+# The safe and default but still SSL/TLS standard compliant shutdown
+# approach is that mod_ssl sends the close notify alert but doesn't wait for
+# the close notify alert from client. When you need a different shutdown
+# approach you can use one of the following variables:
+# o ssl-unclean-shutdown:
+# This forces an unclean shutdown when the connection is closed, i.e. no
+# SSL close notify alert is send or allowed to received. This violates
+# the SSL/TLS standard but is needed for some brain-dead browsers. Use
+# this when you receive I/O errors because of the standard approach where
+# mod_ssl sends the close notify alert.
+# o ssl-accurate-shutdown:
+# This forces an accurate shutdown when the connection is closed, i.e. a
+# SSL close notify alert is send and mod_ssl waits for the close notify
+# alert of the client. This is 100% SSL/TLS standard compliant, but in
+# practice often causes hanging connections with brain-dead browsers. Use
+# this only for browsers where you know that their SSL implementation
+# works correctly.
+# Notice: Most problems of broken clients are also related to the HTTP
+# keep-alive facility, so you usually additionally want to disable
+# keep-alive for those clients, too. Use variable "nokeepalive" for this.
+# Similarly, one has to force some clients to use HTTP/1.0 to workaround
+# their broken HTTP/1.1 implementation. Use variables "downgrade-1.0" and
+# "force-response-1.0" for this.
+SetEnvIf User-Agent ".*MSIE.*" \
+ nokeepalive ssl-unclean-shutdown \
+ downgrade-1.0 force-response-1.0
+
+# Per-Server Logging:
+# The home of a custom SSL log file. Use this when you want a
+# compact non-error SSL logfile on a virtual host basis.
+CustomLog logs/ssl_request_log \
+ "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
+
+</VirtualHost>
+
diff --git a/certbot-apache/tests/testdata/centos6_apache/apache/httpd/conf.d/test.example.com.conf b/certbot-apache/tests/testdata/centos6_apache/apache/httpd/conf.d/test.example.com.conf
new file mode 100644
index 000000000..3dd7b18f1
--- /dev/null
+++ b/certbot-apache/tests/testdata/centos6_apache/apache/httpd/conf.d/test.example.com.conf
@@ -0,0 +1,7 @@
+<VirtualHost *:80>
+ ServerName test.example.com
+ ServerAdmin webmaster@dummy-host.example.com
+ DocumentRoot /var/www/htdocs
+ ErrorLog logs/dummy-host.example.com-error_log
+ CustomLog logs/dummy-host.example.com-access_log common
+</VirtualHost>
diff --git a/certbot-apache/tests/testdata/centos6_apache/apache/httpd/conf.d/welcome.conf b/certbot-apache/tests/testdata/centos6_apache/apache/httpd/conf.d/welcome.conf
new file mode 100644
index 000000000..c1d23c512
--- /dev/null
+++ b/certbot-apache/tests/testdata/centos6_apache/apache/httpd/conf.d/welcome.conf
@@ -0,0 +1,11 @@
+#
+# This configuration file enables the default "Welcome"
+# page if there is no default index page present for
+# the root URL. To disable the Welcome page, comment
+# out all the lines below.
+#
+<LocationMatch "^/+$">
+ Options -Indexes
+ ErrorDocument 403 /error/noindex.html
+</LocationMatch>
+
diff --git a/certbot-apache/tests/testdata/centos6_apache/apache/httpd/conf/httpd.conf b/certbot-apache/tests/testdata/centos6_apache/apache/httpd/conf/httpd.conf
new file mode 100644
index 000000000..eac6143da
--- /dev/null
+++ b/certbot-apache/tests/testdata/centos6_apache/apache/httpd/conf/httpd.conf
@@ -0,0 +1,1009 @@
+#
+# This is the main Apache server configuration file. It contains the
+# configuration directives that give the server its instructions.
+# See <URL:http://httpd.apache.org/docs/2.2/> for detailed information.
+# In particular, see
+# <URL:http://httpd.apache.org/docs/2.2/mod/directives.html>
+# for a discussion of each configuration directive.
+#
+#
+# Do NOT simply read the instructions in here without understanding
+# what they do. They're here only as hints or reminders. If you are unsure
+# consult the online docs. You have been warned.
+#
+# The configuration directives are grouped into three basic sections:
+# 1. Directives that control the operation of the Apache server process as a
+# whole (the 'global environment').
+# 2. Directives that define the parameters of the 'main' or 'default' server,
+# which responds to requests that aren't handled by a virtual host.
+# These directives also provide default values for the settings
+# of all virtual hosts.
+# 3. Settings for virtual hosts, which allow Web requests to be sent to
+# different IP addresses or hostnames and have them handled by the
+# same Apache server process.
+#
+# Configuration and logfile names: If the filenames you specify for many
+# of the server's control files begin with "/" (or "drive:/" for Win32), the
+# server will use that explicit path. If the filenames do *not* begin
+# with "/", the value of ServerRoot is prepended -- so "logs/foo.log"
+# with ServerRoot set to "/etc/httpd" will be interpreted by the
+# server as "/etc/httpd/logs/foo.log".
+#
+
+### Section 1: Global Environment
+#
+# The directives in this section affect the overall operation of Apache,
+# such as the number of concurrent requests it can handle or where it
+# can find its configuration files.
+#
+
+#
+# Don't give away too much information about all the subcomponents
+# we are running. Comment out this line if you don't mind remote sites
+# finding out what major optional modules you are running
+ServerTokens OS
+
+#
+# ServerRoot: The top of the directory tree under which the server's
+# configuration, error, and log files are kept.
+#
+# NOTE! If you intend to place this on an NFS (or otherwise network)
+# mounted filesystem then please read the LockFile documentation
+# (available at <URL:http://httpd.apache.org/docs/2.2/mod/mpm_common.html#lockfile>);
+# you will save yourself a lot of trouble.
+#
+# Do NOT add a slash at the end of the directory path.
+#
+ServerRoot "/etc/httpd"
+
+#
+# PidFile: The file in which the server should record its process
+# identification number when it starts. Note the PIDFILE variable in
+# /etc/sysconfig/httpd must be set appropriately if this location is
+# changed.
+#
+PidFile run/httpd.pid
+
+#
+# Timeout: The number of seconds before receives and sends time out.
+#
+Timeout 60
+
+#
+# KeepAlive: Whether or not to allow persistent connections (more than
+# one request per connection). Set to "Off" to deactivate.
+#
+KeepAlive Off
+
+#
+# MaxKeepAliveRequests: The maximum number of requests to allow
+# during a persistent connection. Set to 0 to allow an unlimited amount.
+# We recommend you leave this number high, for maximum performance.
+#
+MaxKeepAliveRequests 100
+
+#
+# KeepAliveTimeout: Number of seconds to wait for the next request from the
+# same client on the same connection.
+#
+KeepAliveTimeout 15
+
+##
+## Server-Pool Size Regulation (MPM specific)
+##
+
+# prefork MPM
+# StartServers: number of server processes to start
+# MinSpareServers: minimum number of server processes which are kept spare
+# MaxSpareServers: maximum number of server processes which are kept spare
+# ServerLimit: maximum value for MaxClients for the lifetime of the server
+# MaxClients: maximum number of server processes allowed to start
+# MaxRequestsPerChild: maximum number of requests a server process serves
+<IfModule prefork.c>
+StartServers 8
+MinSpareServers 5
+MaxSpareServers 20
+ServerLimit 256
+MaxClients 256
+MaxRequestsPerChild 4000
+</IfModule>
+
+# worker MPM
+# StartServers: initial number of server processes to start
+# MaxClients: maximum number of simultaneous client connections
+# MinSpareThreads: minimum number of worker threads which are kept spare
+# MaxSpareThreads: maximum number of worker threads which are kept spare
+# ThreadsPerChild: constant number of worker threads in each server process
+# MaxRequestsPerChild: maximum number of requests a server process serves
+<IfModule worker.c>
+StartServers 4
+MaxClients 300
+MinSpareThreads 25
+MaxSpareThreads 75
+ThreadsPerChild 25
+MaxRequestsPerChild 0
+</IfModule>
+
+#
+# Listen: Allows you to bind Apache to specific IP addresses and/or
+# ports, in addition to the default. See also the <VirtualHost>
+# directive.
+#
+# Change this to Listen on specific IP addresses as shown below to
+# prevent Apache from glomming onto all bound IP addresses (0.0.0.0)
+#
+#Listen 12.34.56.78:80
+Listen 80
+
+#
+# Dynamic Shared Object (DSO) Support
+#
+# To be able to use the functionality of a module which was built as a DSO you
+# have to place corresponding `LoadModule' lines at this location so the
+# directives contained in it are actually available _before_ they are used.
+# Statically compiled modules (those listed by `httpd -l') do not need
+# to be loaded here.
+#
+# Example:
+# LoadModule foo_module modules/mod_foo.so
+#
+LoadModule auth_basic_module modules/mod_auth_basic.so
+LoadModule auth_digest_module modules/mod_auth_digest.so
+LoadModule authn_file_module modules/mod_authn_file.so
+LoadModule authn_alias_module modules/mod_authn_alias.so
+LoadModule authn_anon_module modules/mod_authn_anon.so
+LoadModule authn_dbm_module modules/mod_authn_dbm.so
+LoadModule authn_default_module modules/mod_authn_default.so
+LoadModule authz_host_module modules/mod_authz_host.so
+LoadModule authz_user_module modules/mod_authz_user.so
+LoadModule authz_owner_module modules/mod_authz_owner.so
+LoadModule authz_groupfile_module modules/mod_authz_groupfile.so
+LoadModule authz_dbm_module modules/mod_authz_dbm.so
+LoadModule authz_default_module modules/mod_authz_default.so
+LoadModule ldap_module modules/mod_ldap.so
+LoadModule authnz_ldap_module modules/mod_authnz_ldap.so
+LoadModule include_module modules/mod_include.so
+LoadModule log_config_module modules/mod_log_config.so
+LoadModule logio_module modules/mod_logio.so
+LoadModule env_module modules/mod_env.so
+LoadModule ext_filter_module modules/mod_ext_filter.so
+LoadModule mime_magic_module modules/mod_mime_magic.so
+LoadModule expires_module modules/mod_expires.so
+LoadModule deflate_module modules/mod_deflate.so
+LoadModule headers_module modules/mod_headers.so
+LoadModule usertrack_module modules/mod_usertrack.so
+LoadModule setenvif_module modules/mod_setenvif.so
+LoadModule mime_module modules/mod_mime.so
+LoadModule dav_module modules/mod_dav.so
+LoadModule status_module modules/mod_status.so
+LoadModule autoindex_module modules/mod_autoindex.so
+LoadModule info_module modules/mod_info.so
+LoadModule dav_fs_module modules/mod_dav_fs.so
+LoadModule vhost_alias_module modules/mod_vhost_alias.so
+LoadModule negotiation_module modules/mod_negotiation.so
+LoadModule dir_module modules/mod_dir.so
+LoadModule actions_module modules/mod_actions.so
+LoadModule speling_module modules/mod_speling.so
+LoadModule userdir_module modules/mod_userdir.so
+LoadModule alias_module modules/mod_alias.so
+LoadModule substitute_module modules/mod_substitute.so
+LoadModule rewrite_module modules/mod_rewrite.so
+LoadModule proxy_module modules/mod_proxy.so
+LoadModule proxy_balancer_module modules/mod_proxy_balancer.so
+LoadModule proxy_ftp_module modules/mod_proxy_ftp.so
+LoadModule proxy_http_module modules/mod_proxy_http.so
+LoadModule proxy_ajp_module modules/mod_proxy_ajp.so
+LoadModule proxy_connect_module modules/mod_proxy_connect.so
+LoadModule cache_module modules/mod_cache.so
+LoadModule suexec_module modules/mod_suexec.so
+LoadModule disk_cache_module modules/mod_disk_cache.so
+LoadModule cgi_module modules/mod_cgi.so
+LoadModule version_module modules/mod_version.so
+
+#
+# The following modules are not loaded by default:
+#
+#LoadModule asis_module modules/mod_asis.so
+#LoadModule authn_dbd_module modules/mod_authn_dbd.so
+#LoadModule cern_meta_module modules/mod_cern_meta.so
+#LoadModule cgid_module modules/mod_cgid.so
+#LoadModule dbd_module modules/mod_dbd.so
+#LoadModule dumpio_module modules/mod_dumpio.so
+#LoadModule filter_module modules/mod_filter.so
+#LoadModule ident_module modules/mod_ident.so
+#LoadModule log_forensic_module modules/mod_log_forensic.so
+#LoadModule unique_id_module modules/mod_unique_id.so
+#
+
+#
+# Load config files from the config directory "/etc/httpd/conf.d".
+#
+Include conf.d/*.conf
+
+#
+# ExtendedStatus controls whether Apache will generate "full" status
+# information (ExtendedStatus On) or just basic information (ExtendedStatus
+# Off) when the "server-status" handler is called. The default is Off.
+#
+#ExtendedStatus On
+
+#
+# If you wish httpd to run as a different user or group, you must run
+# httpd as root initially and it will switch.
+#
+# User/Group: The name (or #number) of the user/group to run httpd as.
+# . On SCO (ODT 3) use "User nouser" and "Group nogroup".
+# . On HPUX you may not be able to use shared memory as nobody, and the
+# suggested workaround is to create a user www and use that user.
+# NOTE that some kernels refuse to setgid(Group) or semctl(IPC_SET)
+# when the value of (unsigned)Group is above 60000;
+# don't use Group #-1 on these systems!
+#
+User apache
+Group apache
+
+### Section 2: 'Main' server configuration
+#
+# The directives in this section set up the values used by the 'main'
+# server, which responds to any requests that aren't handled by a
+# <VirtualHost> definition. These values also provide defaults for
+# any <VirtualHost> containers you may define later in the file.
+#
+# All of these directives may appear inside <VirtualHost> containers,
+# in which case these default settings will be overridden for the
+# virtual host being defined.
+#
+
+#
+# ServerAdmin: Your address, where problems with the server should be
+# e-mailed. This address appears on some server-generated pages, such
+# as error documents. e.g. admin@your-domain.com
+#
+ServerAdmin root@localhost
+
+#
+# ServerName gives the name and port that the server uses to identify itself.
+# This can often be determined automatically, but we recommend you specify
+# it explicitly to prevent problems during startup.
+#
+# If this is not set to valid DNS name for your host, server-generated
+# redirections will not work. See also the UseCanonicalName directive.
+#
+# If your host doesn't have a registered DNS name, enter its IP address here.
+# You will have to access it by its address anyway, and this will make
+# redirections work in a sensible way.
+#
+#ServerName www.example.com:80
+
+#
+# UseCanonicalName: Determines how Apache constructs self-referencing
+# URLs and the SERVER_NAME and SERVER_PORT variables.
+# When set "Off", Apache will use the Hostname and Port supplied
+# by the client. When set "On", Apache will use the value of the
+# ServerName directive.
+#
+UseCanonicalName Off
+
+#
+# DocumentRoot: The directory out of which you will serve your
+# documents. By default, all requests are taken from this directory, but
+# symbolic links and aliases may be used to point to other locations.
+#
+DocumentRoot "/var/www/html"
+
+#
+# Each directory to which Apache has access can be configured with respect
+# to which services and features are allowed and/or disabled in that
+# directory (and its subdirectories).
+#
+# First, we configure the "default" to be a very restrictive set of
+# features.
+#
+<Directory />
+ Options FollowSymLinks
+ AllowOverride None
+</Directory>
+
+#
+# Note that from this point forward you must specifically allow
+# particular features to be enabled - so if something's not working as
+# you might expect, make sure that you have specifically enabled it
+# below.
+#
+
+#
+# This should be changed to whatever you set DocumentRoot to.
+#
+<Directory "/var/www/html">
+
+#
+# Possible values for the Options directive are "None", "All",
+# or any combination of:
+# Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews
+#
+# Note that "MultiViews" must be named *explicitly* --- "Options All"
+# doesn't give it to you.
+#
+# The Options directive is both complicated and important. Please see
+# http://httpd.apache.org/docs/2.2/mod/core.html#options
+# for more information.
+#
+ Options Indexes FollowSymLinks
+
+#
+# AllowOverride controls what directives may be placed in .htaccess files.
+# It can be "All", "None", or any combination of the keywords:
+# Options FileInfo AuthConfig Limit
+#
+ AllowOverride None
+
+#
+# Controls who can get stuff from this server.
+#
+ Order allow,deny
+ Allow from all
+
+</Directory>
+
+#
+# UserDir: The name of the directory that is appended onto a user's home
+# directory if a ~user request is received.
+#
+# The path to the end user account 'public_html' directory must be
+# accessible to the webserver userid. This usually means that ~userid
+# must have permissions of 711, ~userid/public_html must have permissions
+# of 755, and documents contained therein must be world-readable.
+# Otherwise, the client will only receive a "403 Forbidden" message.
+#
+# See also: http://httpd.apache.org/docs/misc/FAQ.html#forbidden
+#
+<IfModule mod_userdir.c>
+ #
+ # UserDir is disabled by default since it can confirm the presence
+ # of a username on the system (depending on home directory
+ # permissions).
+ #
+ UserDir disabled
+
+ #
+ # To enable requests to /~user/ to serve the user's public_html
+ # directory, remove the "UserDir disabled" line above, and uncomment
+ # the following line instead:
+ #
+ #UserDir public_html
+
+</IfModule>
+
+#
+# Control access to UserDir directories. The following is an example
+# for a site where these directories are restricted to read-only.
+#
+#<Directory /home/*/public_html>
+# AllowOverride FileInfo AuthConfig Limit
+# Options MultiViews Indexes SymLinksIfOwnerMatch IncludesNoExec
+# <Limit GET POST OPTIONS>
+# Order allow,deny
+# Allow from all
+# </Limit>
+# <LimitExcept GET POST OPTIONS>
+# Order deny,allow
+# Deny from all
+# </LimitExcept>
+#</Directory>
+
+#
+# DirectoryIndex: sets the file that Apache will serve if a directory
+# is requested.
+#
+# The index.html.var file (a type-map) is used to deliver content-
+# negotiated documents. The MultiViews Option can be used for the
+# same purpose, but it is much slower.
+#
+DirectoryIndex index.html index.html.var
+
+#
+# AccessFileName: The name of the file to look for in each directory
+# for additional configuration directives. See also the AllowOverride
+# directive.
+#
+AccessFileName .htaccess
+
+#
+# The following lines prevent .htaccess and .htpasswd files from being
+# viewed by Web clients.
+#
+<Files ~ "^\.ht">
+ Order allow,deny
+ Deny from all
+ Satisfy All
+</Files>
+
+#
+# TypesConfig describes where the mime.types file (or equivalent) is
+# to be found.
+#
+TypesConfig /etc/mime.types
+
+#
+# DefaultType is the default MIME type the server will use for a document
+# if it cannot otherwise determine one, such as from filename extensions.
+# If your server contains mostly text or HTML documents, "text/plain" is
+# a good value. If most of your content is binary, such as applications
+# or images, you may want to use "application/octet-stream" instead to
+# keep browsers from trying to display binary files as though they are
+# text.
+#
+DefaultType text/plain
+
+#
+# The mod_mime_magic module allows the server to use various hints from the
+# contents of the file itself to determine its type. The MIMEMagicFile
+# directive tells the module where the hint definitions are located.
+#
+<IfModule mod_mime_magic.c>
+# MIMEMagicFile /usr/share/magic.mime
+ MIMEMagicFile conf/magic
+</IfModule>
+
+#
+# HostnameLookups: Log the names of clients or just their IP addresses
+# e.g., www.apache.org (on) or 204.62.129.132 (off).
+# The default is off because it'd be overall better for the net if people
+# had to knowingly turn this feature on, since enabling it means that
+# each client request will result in AT LEAST one lookup request to the
+# nameserver.
+#
+HostnameLookups Off
+
+#
+# EnableMMAP: Control whether memory-mapping is used to deliver
+# files (assuming that the underlying OS supports it).
+# The default is on; turn this off if you serve from NFS-mounted
+# filesystems. On some systems, turning it off (regardless of
+# filesystem) can improve performance; for details, please see
+# http://httpd.apache.org/docs/2.2/mod/core.html#enablemmap
+#
+#EnableMMAP off
+
+#
+# EnableSendfile: Control whether the sendfile kernel support is
+# used to deliver files (assuming that the OS supports it).
+# The default is on; turn this off if you serve from NFS-mounted
+# filesystems. Please see
+# http://httpd.apache.org/docs/2.2/mod/core.html#enablesendfile
+#
+#EnableSendfile off
+
+#
+# ErrorLog: The location of the error log file.
+# If you do not specify an ErrorLog directive within a <VirtualHost>
+# container, error messages relating to that virtual host will be
+# logged here. If you *do* define an error logfile for a <VirtualHost>
+# container, that host's errors will be logged there and not here.
+#
+ErrorLog logs/error_log
+
+#
+# LogLevel: Control the number of messages logged to the error_log.
+# Possible values include: debug, info, notice, warn, error, crit,
+# alert, emerg.
+#
+LogLevel warn
+
+#
+# The following directives define some format nicknames for use with
+# a CustomLog directive (see below).
+#
+LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
+LogFormat "%h %l %u %t \"%r\" %>s %b" common
+LogFormat "%{Referer}i -> %U" referer
+LogFormat "%{User-agent}i" agent
+
+# "combinedio" includes actual counts of actual bytes received (%I) and sent (%O); this
+# requires the mod_logio module to be loaded.
+#LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio
+
+#
+# The location and format of the access logfile (Common Logfile Format).
+# If you do not define any access logfiles within a <VirtualHost>
+# container, they will be logged here. Contrariwise, if you *do*
+# define per-<VirtualHost> access logfiles, transactions will be
+# logged therein and *not* in this file.
+#
+#CustomLog logs/access_log common
+
+#
+# If you would like to have separate agent and referer logfiles, uncomment
+# the following directives.
+#
+#CustomLog logs/referer_log referer
+#CustomLog logs/agent_log agent
+
+#
+# For a single logfile with access, agent, and referer information
+# (Combined Logfile Format), use the following directive:
+#
+CustomLog logs/access_log combined
+
+#
+# Optionally add a line containing the server version and virtual host
+# name to server-generated pages (internal error documents, FTP directory
+# listings, mod_status and mod_info output etc., but not CGI generated
+# documents or custom error documents).
+# Set to "EMail" to also include a mailto: link to the ServerAdmin.
+# Set to one of: On | Off | EMail
+#
+ServerSignature On
+
+#
+# Aliases: Add here as many aliases as you need (with no limit). The format is
+# Alias fakename realname
+#
+# Note that if you include a trailing / on fakename then the server will
+# require it to be present in the URL. So "/icons" isn't aliased in this
+# example, only "/icons/". If the fakename is slash-terminated, then the
+# realname must also be slash terminated, and if the fakename omits the
+# trailing slash, the realname must also omit it.
+#
+# We include the /icons/ alias for FancyIndexed directory listings. If you
+# do not use FancyIndexing, you may comment this out.
+#
+Alias /icons/ "/var/www/icons/"
+
+<Directory "/var/www/icons">
+ Options Indexes MultiViews FollowSymLinks
+ AllowOverride None
+ Order allow,deny
+ Allow from all
+</Directory>
+
+#
+# WebDAV module configuration section.
+#
+<IfModule mod_dav_fs.c>
+ # Location of the WebDAV lock database.
+ DAVLockDB /var/lib/dav/lockdb
+</IfModule>
+
+#
+# ScriptAlias: This controls which directories contain server scripts.
+# ScriptAliases are essentially the same as Aliases, except that
+# documents in the realname directory are treated as applications and
+# run by the server when requested rather than as documents sent to the client.
+# The same rules about trailing "/" apply to ScriptAlias directives as to
+# Alias.
+#
+ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
+
+#
+# "/var/www/cgi-bin" should be changed to whatever your ScriptAliased
+# CGI directory exists, if you have that configured.
+#
+<Directory "/var/www/cgi-bin">
+ AllowOverride None
+ Options None
+ Order allow,deny
+ Allow from all
+</Directory>
+
+#
+# Redirect allows you to tell clients about documents which used to exist in
+# your server's namespace, but do not anymore. This allows you to tell the
+# clients where to look for the relocated document.
+# Example:
+# Redirect permanent /foo http://www.example.com/bar
+
+#
+# Directives controlling the display of server-generated directory listings.
+#
+
+#
+# IndexOptions: Controls the appearance of server-generated directory
+# listings.
+#
+IndexOptions FancyIndexing VersionSort NameWidth=* HTMLTable Charset=UTF-8
+
+#
+# AddIcon* directives tell the server which icon to show for different
+# files or filename extensions. These are only displayed for
+# FancyIndexed directories.
+#
+AddIconByEncoding (CMP,/icons/compressed.gif) x-compress x-gzip
+
+AddIconByType (TXT,/icons/text.gif) text/*
+AddIconByType (IMG,/icons/image2.gif) image/*
+AddIconByType (SND,/icons/sound2.gif) audio/*
+AddIconByType (VID,/icons/movie.gif) video/*
+
+AddIcon /icons/binary.gif .bin .exe
+AddIcon /icons/binhex.gif .hqx
+AddIcon /icons/tar.gif .tar
+AddIcon /icons/world2.gif .wrl .wrl.gz .vrml .vrm .iv
+AddIcon /icons/compressed.gif .Z .z .tgz .gz .zip
+AddIcon /icons/a.gif .ps .ai .eps
+AddIcon /icons/layout.gif .html .shtml .htm .pdf
+AddIcon /icons/text.gif .txt
+AddIcon /icons/c.gif .c
+AddIcon /icons/p.gif .pl .py
+AddIcon /icons/f.gif .for
+AddIcon /icons/dvi.gif .dvi
+AddIcon /icons/uuencoded.gif .uu
+AddIcon /icons/script.gif .conf .sh .shar .csh .ksh .tcl
+AddIcon /icons/tex.gif .tex
+AddIcon /icons/bomb.gif /core
+
+AddIcon /icons/back.gif ..
+AddIcon /icons/hand.right.gif README
+AddIcon /icons/folder.gif ^^DIRECTORY^^
+AddIcon /icons/blank.gif ^^BLANKICON^^
+
+#
+# DefaultIcon is which icon to show for files which do not have an icon
+# explicitly set.
+#
+DefaultIcon /icons/unknown.gif
+
+#
+# AddDescription allows you to place a short description after a file in
+# server-generated indexes. These are only displayed for FancyIndexed
+# directories.
+# Format: AddDescription "description" filename
+#
+#AddDescription "GZIP compressed document" .gz
+#AddDescription "tar archive" .tar
+#AddDescription "GZIP compressed tar archive" .tgz
+
+#
+# ReadmeName is the name of the README file the server will look for by
+# default, and append to directory listings.
+#
+# HeaderName is the name of a file which should be prepended to
+# directory indexes.
+ReadmeName README.html
+HeaderName HEADER.html
+
+#
+# IndexIgnore is a set of filenames which directory indexing should ignore
+# and not include in the listing. Shell-style wildcarding is permitted.
+#
+IndexIgnore .??* *~ *# HEADER* README* RCS CVS *,v *,t
+
+#
+# DefaultLanguage and AddLanguage allows you to specify the language of
+# a document. You can then use content negotiation to give a browser a
+# file in a language the user can understand.
+#
+# Specify a default language. This means that all data
+# going out without a specific language tag (see below) will
+# be marked with this one. You probably do NOT want to set
+# this unless you are sure it is correct for all cases.
+#
+# * It is generally better to not mark a page as
+# * being a certain language than marking it with the wrong
+# * language!
+#
+# DefaultLanguage nl
+#
+# Note 1: The suffix does not have to be the same as the language
+# keyword --- those with documents in Polish (whose net-standard
+# language code is pl) may wish to use "AddLanguage pl .po" to
+# avoid the ambiguity with the common suffix for perl scripts.
+#
+# Note 2: The example entries below illustrate that in some cases
+# the two character 'Language' abbreviation is not identical to
+# the two character 'Country' code for its country,
+# E.g. 'Danmark/dk' versus 'Danish/da'.
+#
+# Note 3: In the case of 'ltz' we violate the RFC by using a three char
+# specifier. There is 'work in progress' to fix this and get
+# the reference data for rfc1766 cleaned up.
+#
+# Catalan (ca) - Croatian (hr) - Czech (cs) - Danish (da) - Dutch (nl)
+# English (en) - Esperanto (eo) - Estonian (et) - French (fr) - German (de)
+# Greek-Modern (el) - Hebrew (he) - Italian (it) - Japanese (ja)
+# Korean (ko) - Luxembourgeois* (ltz) - Norwegian Nynorsk (nn)
+# Norwegian (no) - Polish (pl) - Portuguese (pt)
+# Brazilian Portuguese (pt-BR) - Russian (ru) - Swedish (sv)
+# Simplified Chinese (zh-CN) - Spanish (es) - Traditional Chinese (zh-TW)
+#
+AddLanguage ca .ca
+AddLanguage cs .cz .cs
+AddLanguage da .dk
+AddLanguage de .de
+AddLanguage el .el
+AddLanguage en .en
+AddLanguage eo .eo
+AddLanguage es .es
+AddLanguage et .et
+AddLanguage fr .fr
+AddLanguage he .he
+AddLanguage hr .hr
+AddLanguage it .it
+AddLanguage ja .ja
+AddLanguage ko .ko
+AddLanguage ltz .ltz
+AddLanguage nl .nl
+AddLanguage nn .nn
+AddLanguage no .no
+AddLanguage pl .po
+AddLanguage pt .pt
+AddLanguage pt-BR .pt-br
+AddLanguage ru .ru
+AddLanguage sv .sv
+AddLanguage zh-CN .zh-cn
+AddLanguage zh-TW .zh-tw
+
+#
+# LanguagePriority allows you to give precedence to some languages
+# in case of a tie during content negotiation.
+#
+# Just list the languages in decreasing order of preference. We have
+# more or less alphabetized them here. You probably want to change this.
+#
+LanguagePriority en ca cs da de el eo es et fr he hr it ja ko ltz nl nn no pl pt pt-BR ru sv zh-CN zh-TW
+
+#
+# ForceLanguagePriority allows you to serve a result page rather than
+# MULTIPLE CHOICES (Prefer) [in case of a tie] or NOT ACCEPTABLE (Fallback)
+# [in case no accepted languages matched the available variants]
+#
+ForceLanguagePriority Prefer Fallback
+
+#
+# Specify a default charset for all content served; this enables
+# interpretation of all content as UTF-8 by default. To use the
+# default browser choice (ISO-8859-1), or to allow the META tags
+# in HTML content to override this choice, comment out this
+# directive:
+#
+AddDefaultCharset UTF-8
+
+#
+# AddType allows you to add to or override the MIME configuration
+# file mime.types for specific file types.
+#
+#AddType application/x-tar .tgz
+
+#
+# AddEncoding allows you to have certain browsers uncompress
+# information on the fly. Note: Not all browsers support this.
+# Despite the name similarity, the following Add* directives have nothing
+# to do with the FancyIndexing customization directives above.
+#
+#AddEncoding x-compress .Z
+#AddEncoding x-gzip .gz .tgz
+
+# If the AddEncoding directives above are commented-out, then you
+# probably should define those extensions to indicate media types:
+#
+AddType application/x-compress .Z
+AddType application/x-gzip .gz .tgz
+
+#
+# MIME-types for downloading Certificates and CRLs
+#
+AddType application/x-x509-ca-cert .crt
+AddType application/x-pkcs7-crl .crl
+
+#
+# AddHandler allows you to map certain file extensions to "handlers":
+# actions unrelated to filetype. These can be either built into the server
+# or added with the Action directive (see below)
+#
+# To use CGI scripts outside of ScriptAliased directories:
+# (You will also need to add "ExecCGI" to the "Options" directive.)
+#
+#AddHandler cgi-script .cgi
+
+#
+# For files that include their own HTTP headers:
+#
+#AddHandler send-as-is asis
+
+#
+# For type maps (negotiated resources):
+# (This is enabled by default to allow the Apache "It Worked" page
+# to be distributed in multiple languages.)
+#
+AddHandler type-map var
+
+#
+# Filters allow you to process content before it is sent to the client.
+#
+# To parse .shtml files for server-side includes (SSI):
+# (You will also need to add "Includes" to the "Options" directive.)
+#
+AddType text/html .shtml
+AddOutputFilter INCLUDES .shtml
+
+#
+# Action lets you define media types that will execute a script whenever
+# a matching file is called. This eliminates the need for repeated URL
+# pathnames for oft-used CGI file processors.
+# Format: Action media/type /cgi-script/location
+# Format: Action handler-name /cgi-script/location
+#
+
+#
+# Customizable error responses come in three flavors:
+# 1) plain text 2) local redirects 3) external redirects
+#
+# Some examples:
+#ErrorDocument 500 "The server made a boo boo."
+#ErrorDocument 404 /missing.html
+#ErrorDocument 404 "/cgi-bin/missing_handler.pl"
+#ErrorDocument 402 http://www.example.com/subscription_info.html
+#
+
+#
+# Putting this all together, we can internationalize error responses.
+#
+# We use Alias to redirect any /error/HTTP_<error>.html.var response to
+# our collection of by-error message multi-language collections. We use
+# includes to substitute the appropriate text.
+#
+# You can modify the messages' appearance without changing any of the
+# default HTTP_<error>.html.var files by adding the line:
+#
+# Alias /error/include/ "/your/include/path/"
+#
+# which allows you to create your own set of files by starting with the
+# /var/www/error/include/ files and
+# copying them to /your/include/path/, even on a per-VirtualHost basis.
+#
+
+Alias /error/ "/var/www/error/"
+
+<IfModule mod_negotiation.c>
+<IfModule mod_include.c>
+ <Directory "/var/www/error">
+ AllowOverride None
+ Options IncludesNoExec
+ AddOutputFilter Includes html
+ AddHandler type-map var
+ Order allow,deny
+ Allow from all
+ LanguagePriority en es de fr
+ ForceLanguagePriority Prefer Fallback
+ </Directory>
+
+# ErrorDocument 400 /error/HTTP_BAD_REQUEST.html.var
+# ErrorDocument 401 /error/HTTP_UNAUTHORIZED.html.var
+# ErrorDocument 403 /error/HTTP_FORBIDDEN.html.var
+# ErrorDocument 404 /error/HTTP_NOT_FOUND.html.var
+# ErrorDocument 405 /error/HTTP_METHOD_NOT_ALLOWED.html.var
+# ErrorDocument 408 /error/HTTP_REQUEST_TIME_OUT.html.var
+# ErrorDocument 410 /error/HTTP_GONE.html.var
+# ErrorDocument 411 /error/HTTP_LENGTH_REQUIRED.html.var
+# ErrorDocument 412 /error/HTTP_PRECONDITION_FAILED.html.var
+# ErrorDocument 413 /error/HTTP_REQUEST_ENTITY_TOO_LARGE.html.var
+# ErrorDocument 414 /error/HTTP_REQUEST_URI_TOO_LARGE.html.var
+# ErrorDocument 415 /error/HTTP_UNSUPPORTED_MEDIA_TYPE.html.var
+# ErrorDocument 500 /error/HTTP_INTERNAL_SERVER_ERROR.html.var
+# ErrorDocument 501 /error/HTTP_NOT_IMPLEMENTED.html.var
+# ErrorDocument 502 /error/HTTP_BAD_GATEWAY.html.var
+# ErrorDocument 503 /error/HTTP_SERVICE_UNAVAILABLE.html.var
+# ErrorDocument 506 /error/HTTP_VARIANT_ALSO_VARIES.html.var
+
+</IfModule>
+</IfModule>
+
+#
+# The following directives modify normal HTTP response behavior to
+# handle known problems with browser implementations.
+#
+BrowserMatch "Mozilla/2" nokeepalive
+BrowserMatch "MSIE 4\.0b2;" nokeepalive downgrade-1.0 force-response-1.0
+BrowserMatch "RealPlayer 4\.0" force-response-1.0
+BrowserMatch "Java/1\.0" force-response-1.0
+BrowserMatch "JDK/1\.0" force-response-1.0
+
+#
+# The following directive disables redirects on non-GET requests for
+# a directory that does not include the trailing slash. This fixes a
+# problem with Microsoft WebFolders which does not appropriately handle
+# redirects for folders with DAV methods.
+# Same deal with Apple's DAV filesystem and Gnome VFS support for DAV.
+#
+BrowserMatch "Microsoft Data Access Internet Publishing Provider" redirect-carefully
+BrowserMatch "MS FrontPage" redirect-carefully
+BrowserMatch "^WebDrive" redirect-carefully
+BrowserMatch "^WebDAVFS/1.[0123]" redirect-carefully
+BrowserMatch "^gnome-vfs/1.0" redirect-carefully
+BrowserMatch "^XML Spy" redirect-carefully
+BrowserMatch "^Dreamweaver-WebDAV-SCM1" redirect-carefully
+
+#
+# Allow server status reports generated by mod_status,
+# with the URL of http://servername/server-status
+# Change the ".example.com" to match your domain to enable.
+#
+#<Location /server-status>
+# SetHandler server-status
+# Order deny,allow
+# Deny from all
+# Allow from .example.com
+#</Location>
+
+#
+# Allow remote server configuration reports, with the URL of
+# http://servername/server-info (requires that mod_info.c be loaded).
+# Change the ".example.com" to match your domain to enable.
+#
+#<Location /server-info>
+# SetHandler server-info
+# Order deny,allow
+# Deny from all
+# Allow from .example.com
+#</Location>
+
+#
+# Proxy Server directives. Uncomment the following lines to
+# enable the proxy server:
+#
+#<IfModule mod_proxy.c>
+#ProxyRequests On
+#
+#<Proxy *>
+# Order deny,allow
+# Deny from all
+# Allow from .example.com
+#</Proxy>
+
+#
+# Enable/disable the handling of HTTP/1.1 "Via:" headers.
+# ("Full" adds the server version; "Block" removes all outgoing Via: headers)
+# Set to one of: Off | On | Full | Block
+#
+#ProxyVia On
+
+#
+# To enable a cache of proxied content, uncomment the following lines.
+# See http://httpd.apache.org/docs/2.2/mod/mod_cache.html for more details.
+#
+#<IfModule mod_disk_cache.c>
+# CacheEnable disk /
+# CacheRoot "/var/cache/mod_proxy"
+#</IfModule>
+#
+
+#</IfModule>
+# End of proxy directives.
+
+### Section 3: Virtual Hosts
+#
+# VirtualHost: If you want to maintain multiple domains/hostnames on your
+# machine you can setup VirtualHost containers for them. Most configurations
+# use only name-based virtual hosts so the server doesn't need to worry about
+# IP addresses. This is indicated by the asterisks in the directives below.
+#
+# Please see the documentation at
+# <URL:http://httpd.apache.org/docs/2.2/vhosts/>
+# for further details before you try to setup virtual hosts.
+#
+# You may use the command line option '-S' to verify your virtual host
+# configuration.
+
+#
+# Use name-based virtual hosting.
+#
+#NameVirtualHost *:80
+#
+# NOTE: NameVirtualHost cannot be used without a port specifier
+# (e.g. :80) if mod_ssl is being used, due to the nature of the
+# SSL protocol.
+#
+
+#
+# VirtualHost example:
+# Almost any Apache directive may go into a VirtualHost container.
+# The first VirtualHost section is used for requests without a known
+# server name.
+#
+#<VirtualHost *:80>
+# ServerAdmin webmaster@dummy-host.example.com
+# DocumentRoot /www/docs/dummy-host.example.com
+# ServerName dummy-host.example.com
+# ErrorLog logs/dummy-host.example.com-error_log
+# CustomLog logs/dummy-host.example.com-access_log common
+#</VirtualHost>
diff --git a/certbot-apache/certbot_apache/tests/testdata/centos7_apache/apache/httpd/conf.d/README b/certbot-apache/tests/testdata/centos7_apache/apache/httpd/conf.d/README
index f5e96615a..f5e96615a 100644
--- a/certbot-apache/certbot_apache/tests/testdata/centos7_apache/apache/httpd/conf.d/README
+++ b/certbot-apache/tests/testdata/centos7_apache/apache/httpd/conf.d/README
diff --git a/certbot-apache/certbot_apache/tests/testdata/centos7_apache/apache/httpd/conf.d/autoindex.conf b/certbot-apache/tests/testdata/centos7_apache/apache/httpd/conf.d/autoindex.conf
index a85cf5dca..a85cf5dca 100644
--- a/certbot-apache/certbot_apache/tests/testdata/centos7_apache/apache/httpd/conf.d/autoindex.conf
+++ b/certbot-apache/tests/testdata/centos7_apache/apache/httpd/conf.d/autoindex.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/centos7_apache/apache/httpd/conf.d/centos.example.com.conf b/certbot-apache/tests/testdata/centos7_apache/apache/httpd/conf.d/centos.example.com.conf
index de7ac2777..de7ac2777 100644
--- a/certbot-apache/certbot_apache/tests/testdata/centos7_apache/apache/httpd/conf.d/centos.example.com.conf
+++ b/certbot-apache/tests/testdata/centos7_apache/apache/httpd/conf.d/centos.example.com.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/centos7_apache/apache/httpd/conf.d/ssl.conf b/certbot-apache/tests/testdata/centos7_apache/apache/httpd/conf.d/ssl.conf
index 6e2502e9a..c90fc780f 100644
--- a/certbot-apache/certbot_apache/tests/testdata/centos7_apache/apache/httpd/conf.d/ssl.conf
+++ b/certbot-apache/tests/testdata/centos7_apache/apache/httpd/conf.d/ssl.conf
@@ -13,7 +13,7 @@ Listen 443 https
# Pass Phrase Dialog:
# Configure the pass phrase gathering process.
-# The filtering dialog program (`builtin' is a internal
+# The filtering dialog program (`builtin' is an internal
# terminal dialog) has to provide the pass phrase on stdout.
SSLPassPhraseDialog exec:/usr/libexec/httpd-ssl-pass-dialog
diff --git a/certbot-apache/certbot_apache/tests/testdata/centos7_apache/apache/httpd/conf.d/userdir.conf b/certbot-apache/tests/testdata/centos7_apache/apache/httpd/conf.d/userdir.conf
index b5d7a49ef..b5d7a49ef 100644
--- a/certbot-apache/certbot_apache/tests/testdata/centos7_apache/apache/httpd/conf.d/userdir.conf
+++ b/certbot-apache/tests/testdata/centos7_apache/apache/httpd/conf.d/userdir.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/centos7_apache/apache/httpd/conf.d/welcome.conf b/certbot-apache/tests/testdata/centos7_apache/apache/httpd/conf.d/welcome.conf
index c1b6c11d9..c1b6c11d9 100644
--- a/certbot-apache/certbot_apache/tests/testdata/centos7_apache/apache/httpd/conf.d/welcome.conf
+++ b/certbot-apache/tests/testdata/centos7_apache/apache/httpd/conf.d/welcome.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/centos7_apache/apache/httpd/conf.modules.d/00-base.conf b/certbot-apache/tests/testdata/centos7_apache/apache/httpd/conf.modules.d/00-base.conf
index 31d979f20..31d979f20 100644
--- a/certbot-apache/certbot_apache/tests/testdata/centos7_apache/apache/httpd/conf.modules.d/00-base.conf
+++ b/certbot-apache/tests/testdata/centos7_apache/apache/httpd/conf.modules.d/00-base.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/centos7_apache/apache/httpd/conf.modules.d/00-dav.conf b/certbot-apache/tests/testdata/centos7_apache/apache/httpd/conf.modules.d/00-dav.conf
index e6af8decd..e6af8decd 100644
--- a/certbot-apache/certbot_apache/tests/testdata/centos7_apache/apache/httpd/conf.modules.d/00-dav.conf
+++ b/certbot-apache/tests/testdata/centos7_apache/apache/httpd/conf.modules.d/00-dav.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/centos7_apache/apache/httpd/conf.modules.d/00-lua.conf b/certbot-apache/tests/testdata/centos7_apache/apache/httpd/conf.modules.d/00-lua.conf
index 9e0d0db6e..9e0d0db6e 100644
--- a/certbot-apache/certbot_apache/tests/testdata/centos7_apache/apache/httpd/conf.modules.d/00-lua.conf
+++ b/certbot-apache/tests/testdata/centos7_apache/apache/httpd/conf.modules.d/00-lua.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/centos7_apache/apache/httpd/conf.modules.d/00-mpm.conf b/certbot-apache/tests/testdata/centos7_apache/apache/httpd/conf.modules.d/00-mpm.conf
index 7bfd1d413..7bfd1d413 100644
--- a/certbot-apache/certbot_apache/tests/testdata/centos7_apache/apache/httpd/conf.modules.d/00-mpm.conf
+++ b/certbot-apache/tests/testdata/centos7_apache/apache/httpd/conf.modules.d/00-mpm.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/centos7_apache/apache/httpd/conf.modules.d/00-proxy.conf b/certbot-apache/tests/testdata/centos7_apache/apache/httpd/conf.modules.d/00-proxy.conf
index cc0bca077..cc0bca077 100644
--- a/certbot-apache/certbot_apache/tests/testdata/centos7_apache/apache/httpd/conf.modules.d/00-proxy.conf
+++ b/certbot-apache/tests/testdata/centos7_apache/apache/httpd/conf.modules.d/00-proxy.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/centos7_apache/apache/httpd/conf.modules.d/00-ssl.conf b/certbot-apache/tests/testdata/centos7_apache/apache/httpd/conf.modules.d/00-ssl.conf
index 53235cd76..53235cd76 100644
--- a/certbot-apache/certbot_apache/tests/testdata/centos7_apache/apache/httpd/conf.modules.d/00-ssl.conf
+++ b/certbot-apache/tests/testdata/centos7_apache/apache/httpd/conf.modules.d/00-ssl.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/centos7_apache/apache/httpd/conf.modules.d/00-systemd.conf b/certbot-apache/tests/testdata/centos7_apache/apache/httpd/conf.modules.d/00-systemd.conf
index b208c972d..b208c972d 100644
--- a/certbot-apache/certbot_apache/tests/testdata/centos7_apache/apache/httpd/conf.modules.d/00-systemd.conf
+++ b/certbot-apache/tests/testdata/centos7_apache/apache/httpd/conf.modules.d/00-systemd.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/centos7_apache/apache/httpd/conf.modules.d/01-cgi.conf b/certbot-apache/tests/testdata/centos7_apache/apache/httpd/conf.modules.d/01-cgi.conf
index 5b8b9362e..5b8b9362e 100644
--- a/certbot-apache/certbot_apache/tests/testdata/centos7_apache/apache/httpd/conf.modules.d/01-cgi.conf
+++ b/certbot-apache/tests/testdata/centos7_apache/apache/httpd/conf.modules.d/01-cgi.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/centos7_apache/apache/httpd/conf/httpd.conf b/certbot-apache/tests/testdata/centos7_apache/apache/httpd/conf/httpd.conf
index a7af0dc1e..a7af0dc1e 100644
--- a/certbot-apache/certbot_apache/tests/testdata/centos7_apache/apache/httpd/conf/httpd.conf
+++ b/certbot-apache/tests/testdata/centos7_apache/apache/httpd/conf/httpd.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/centos7_apache/apache/httpd/conf/magic b/certbot-apache/tests/testdata/centos7_apache/apache/httpd/conf/magic
index 7c56119e9..7c56119e9 100644
--- a/certbot-apache/certbot_apache/tests/testdata/centos7_apache/apache/httpd/conf/magic
+++ b/certbot-apache/tests/testdata/centos7_apache/apache/httpd/conf/magic
diff --git a/certbot-apache/certbot_apache/tests/testdata/centos7_apache/apache/sites b/certbot-apache/tests/testdata/centos7_apache/apache/sites
index 6af1f63fa..6af1f63fa 100644
--- a/certbot-apache/certbot_apache/tests/testdata/centos7_apache/apache/sites
+++ b/certbot-apache/tests/testdata/centos7_apache/apache/sites
diff --git a/certbot-apache/certbot_apache/tests/testdata/centos7_apache/apache/sysconfig/httpd b/certbot-apache/tests/testdata/centos7_apache/apache/sysconfig/httpd
index 4bcb300c2..4bcb300c2 100644
--- a/certbot-apache/certbot_apache/tests/testdata/centos7_apache/apache/sysconfig/httpd
+++ b/certbot-apache/tests/testdata/centos7_apache/apache/sysconfig/httpd
diff --git a/certbot-apache/certbot_apache/tests/testdata/complex_parsing/apache2.conf b/certbot-apache/tests/testdata/complex_parsing/apache2.conf
index 14cf95f9e..14cf95f9e 100644
--- a/certbot-apache/certbot_apache/tests/testdata/complex_parsing/apache2.conf
+++ b/certbot-apache/tests/testdata/complex_parsing/apache2.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/complex_parsing/conf-enabled/dummy.conf b/certbot-apache/tests/testdata/complex_parsing/conf-enabled/dummy.conf
index 1e5307780..1e5307780 100644
--- a/certbot-apache/certbot_apache/tests/testdata/complex_parsing/conf-enabled/dummy.conf
+++ b/certbot-apache/tests/testdata/complex_parsing/conf-enabled/dummy.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/complex_parsing/test_fnmatch.conf b/certbot-apache/tests/testdata/complex_parsing/test_fnmatch.conf
index 4e6b84edf..4e6b84edf 100644
--- a/certbot-apache/certbot_apache/tests/testdata/complex_parsing/test_fnmatch.conf
+++ b/certbot-apache/tests/testdata/complex_parsing/test_fnmatch.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/complex_parsing/test_variables.conf b/certbot-apache/tests/testdata/complex_parsing/test_variables.conf
index 1a9edff74..1a9edff74 100644
--- a/certbot-apache/certbot_apache/tests/testdata/complex_parsing/test_variables.conf
+++ b/certbot-apache/tests/testdata/complex_parsing/test_variables.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/apache2.conf b/certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/apache2.conf
index 2a5bb7be2..2a5bb7be2 100644
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/apache2.conf
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/apache2.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/conf-available/bad_conf_file.conf b/certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/conf-available/bad_conf_file.conf
index 8e9178803..8e9178803 100644
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/conf-available/bad_conf_file.conf
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/conf-available/bad_conf_file.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/conf-available/other-vhosts-access-log.conf b/certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/conf-available/other-vhosts-access-log.conf
index 5e9f5e9e7..5e9f5e9e7 100644
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/conf-available/other-vhosts-access-log.conf
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/conf-available/other-vhosts-access-log.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/conf-available/security.conf b/certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/conf-available/security.conf
index eccfcb1fd..eccfcb1fd 100644
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/conf-available/security.conf
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/conf-available/security.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/conf-available/serve-cgi-bin.conf b/certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/conf-available/serve-cgi-bin.conf
index b02782dab..b02782dab 100644
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/conf-available/serve-cgi-bin.conf
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/conf-available/serve-cgi-bin.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/conf-enabled/other-vhosts-access-log.conf b/certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/conf-enabled/other-vhosts-access-log.conf
index 8af91e530..8af91e530 120000
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/conf-enabled/other-vhosts-access-log.conf
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/conf-enabled/other-vhosts-access-log.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/conf-enabled/security.conf b/certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/conf-enabled/security.conf
index 036c97fa7..036c97fa7 120000
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/conf-enabled/security.conf
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/conf-enabled/security.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/conf-enabled/serve-cgi-bin.conf b/certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/conf-enabled/serve-cgi-bin.conf
index d917f688e..d917f688e 120000
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/conf-enabled/serve-cgi-bin.conf
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/conf-enabled/serve-cgi-bin.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/envvars b/certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/envvars
index a13d9a89e..a13d9a89e 100644
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/envvars
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/envvars
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/mods-available/authz_svn.load b/certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/mods-available/authz_svn.load
index c6df2733b..c6df2733b 100644
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/mods-available/authz_svn.load
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/mods-available/authz_svn.load
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/mods-available/dav.load b/certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/mods-available/dav.load
index a5867fff3..a5867fff3 100644
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/mods-available/dav.load
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/mods-available/dav.load
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/mods-available/dav_svn.conf b/certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/mods-available/dav_svn.conf
index 801cbd6bd..801cbd6bd 100644
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/mods-available/dav_svn.conf
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/mods-available/dav_svn.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/mods-available/dav_svn.load b/certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/mods-available/dav_svn.load
index e41e1581a..e41e1581a 100644
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/mods-available/dav_svn.load
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/mods-available/dav_svn.load
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/mods-available/rewrite.load b/certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/mods-available/rewrite.load
index b32f16264..b32f16264 100644
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/mods-available/rewrite.load
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/mods-available/rewrite.load
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/mods-available/ssl.conf b/certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/mods-available/ssl.conf
index e9fcf4f9b..65baec874 100644
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/mods-available/ssl.conf
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/mods-available/ssl.conf
@@ -31,7 +31,7 @@
# Pass Phrase Dialog:
# Configure the pass phrase gathering process.
- # The filtering dialog program (`builtin' is a internal
+ # The filtering dialog program (`builtin' is an internal
# terminal dialog) has to provide the pass phrase on stdout.
SSLPassPhraseDialog exec:/usr/share/apache2/ask-for-passphrase
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/mods-available/ssl.load b/certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/mods-available/ssl.load
index 3d2336ae0..3d2336ae0 100644
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/mods-available/ssl.load
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/mods-available/ssl.load
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/mods-enabled/authz_svn.load b/certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/mods-enabled/authz_svn.load
index 7ac0725dd..7ac0725dd 120000
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/mods-enabled/authz_svn.load
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/mods-enabled/authz_svn.load
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/mods-enabled/dav.load b/certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/mods-enabled/dav.load
index 9dcfef6da..9dcfef6da 120000
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/mods-enabled/dav.load
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/mods-enabled/dav.load
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/mods-enabled/dav_svn.conf b/certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/mods-enabled/dav_svn.conf
index 964c7bb0b..964c7bb0b 120000
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/mods-enabled/dav_svn.conf
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/mods-enabled/dav_svn.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/mods-enabled/dav_svn.load b/certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/mods-enabled/dav_svn.load
index 4094e4173..4094e4173 120000
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/mods-enabled/dav_svn.load
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/mods-enabled/dav_svn.load
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/ports.conf b/certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/ports.conf
index 5daec58c1..5daec58c1 100644
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/ports.conf
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/ports.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/sites-available/another_wildcard.conf b/certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/sites-available/another_wildcard.conf
index 1a5b7de47..1a5b7de47 100644
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/sites-available/another_wildcard.conf
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/sites-available/another_wildcard.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/sites-available/old-and-default.conf b/certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/sites-available/old-and-default.conf
index 2bd4e1fe9..2bd4e1fe9 100644
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/sites-available/old-and-default.conf
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/sites-available/old-and-default.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/sites-available/wildcard.conf b/certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/sites-available/wildcard.conf
index b8046e6c9..b8046e6c9 100644
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/sites-available/wildcard.conf
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/sites-available/wildcard.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/sites-enabled/another_wildcard.conf b/certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/sites-enabled/another_wildcard.conf
index 95f52f002..95f52f002 120000
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/sites-enabled/another_wildcard.conf
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/sites-enabled/another_wildcard.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/sites-enabled/old-and-default.conf b/certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/sites-enabled/old-and-default.conf
index f7fdf1bbe..f7fdf1bbe 120000
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/sites-enabled/old-and-default.conf
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/sites-enabled/old-and-default.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/sites-enabled/wildcard.conf b/certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/sites-enabled/wildcard.conf
index a87af2c93..a87af2c93 120000
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/sites-enabled/wildcard.conf
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/apache2/sites-enabled/wildcard.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/sites b/certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/sites
index ab518ee5b..ab518ee5b 100644
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/augeas_vhosts/sites
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/augeas_vhosts/sites
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/apache2.conf b/certbot-apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/apache2.conf
index 4ed016e07..4ed016e07 100644
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/apache2.conf
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/apache2.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/conf-available/other-vhosts-access-log.conf b/certbot-apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/conf-available/other-vhosts-access-log.conf
index 5e9f5e9e7..5e9f5e9e7 100644
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/conf-available/other-vhosts-access-log.conf
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/conf-available/other-vhosts-access-log.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/conf-available/security.conf b/certbot-apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/conf-available/security.conf
index 1dfe33c60..1dfe33c60 100644
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/conf-available/security.conf
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/conf-available/security.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/conf-available/serve-cgi-bin.conf b/certbot-apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/conf-available/serve-cgi-bin.conf
index b02782dab..b02782dab 100644
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/conf-available/serve-cgi-bin.conf
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/conf-available/serve-cgi-bin.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/conf-enabled/other-vhosts-access-log.conf b/certbot-apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/conf-enabled/other-vhosts-access-log.conf
index 8af91e530..8af91e530 120000
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/conf-enabled/other-vhosts-access-log.conf
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/conf-enabled/other-vhosts-access-log.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/conf-enabled/security.conf b/certbot-apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/conf-enabled/security.conf
index 036c97fa7..036c97fa7 120000
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/conf-enabled/security.conf
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/conf-enabled/security.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/conf-enabled/serve-cgi-bin.conf b/certbot-apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/conf-enabled/serve-cgi-bin.conf
index d917f688e..d917f688e 120000
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/conf-enabled/serve-cgi-bin.conf
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/conf-enabled/serve-cgi-bin.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/envvars b/certbot-apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/envvars
index 8051c4544..8051c4544 100644
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/envvars
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/envvars
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/mods-available/ssl.conf b/certbot-apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/mods-available/ssl.conf
index e9fcf4f9b..65baec874 100644
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/mods-available/ssl.conf
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/mods-available/ssl.conf
@@ -31,7 +31,7 @@
# Pass Phrase Dialog:
# Configure the pass phrase gathering process.
- # The filtering dialog program (`builtin' is a internal
+ # The filtering dialog program (`builtin' is an internal
# terminal dialog) has to provide the pass phrase on stdout.
SSLPassPhraseDialog exec:/usr/share/apache2/ask-for-passphrase
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/mods-available/ssl.load b/certbot-apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/mods-available/ssl.load
index 3d2336ae0..3d2336ae0 100644
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/mods-available/ssl.load
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/mods-available/ssl.load
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/ports.conf b/certbot-apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/ports.conf
index 176b9d103..176b9d103 100644
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/ports.conf
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/ports.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/sites-available/000-default.conf b/certbot-apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/sites-available/000-default.conf
index d81fe132d..d81fe132d 100644
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/sites-available/000-default.conf
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/sites-available/000-default.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/sites-available/default-ssl.conf b/certbot-apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/sites-available/default-ssl.conf
index e659d4b07..e659d4b07 100644
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/sites-available/default-ssl.conf
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/sites-available/default-ssl.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/sites-enabled/000-default.conf b/certbot-apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/sites-enabled/000-default.conf
index 3c4632b73..3c4632b73 120000
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/sites-enabled/000-default.conf
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/default_vhost/apache2/sites-enabled/000-default.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/default_vhost/sites b/certbot-apache/tests/testdata/debian_apache_2_4/default_vhost/sites
index 03d53dd61..03d53dd61 100644
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/default_vhost/sites
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/default_vhost/sites
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multi_vhosts/apache2/apache2.conf b/certbot-apache/tests/testdata/debian_apache_2_4/multi_vhosts/apache2/apache2.conf
index 2a5bb7be2..2a5bb7be2 100644
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multi_vhosts/apache2/apache2.conf
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/multi_vhosts/apache2/apache2.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multi_vhosts/apache2/envvars b/certbot-apache/tests/testdata/debian_apache_2_4/multi_vhosts/apache2/envvars
index a13d9a89e..a13d9a89e 100644
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multi_vhosts/apache2/envvars
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/multi_vhosts/apache2/envvars
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multi_vhosts/apache2/ports.conf b/certbot-apache/tests/testdata/debian_apache_2_4/multi_vhosts/apache2/ports.conf
index 5daec58c1..5daec58c1 100644
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multi_vhosts/apache2/ports.conf
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/multi_vhosts/apache2/ports.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multi_vhosts/apache2/sites-available/default.conf b/certbot-apache/tests/testdata/debian_apache_2_4/multi_vhosts/apache2/sites-available/default.conf
index 6ab206b2d..6ab206b2d 100644
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multi_vhosts/apache2/sites-available/default.conf
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/multi_vhosts/apache2/sites-available/default.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multi_vhosts/apache2/sites-available/multi-vhost.conf b/certbot-apache/tests/testdata/debian_apache_2_4/multi_vhosts/apache2/sites-available/multi-vhost.conf
index 5f2b727bf..5f2b727bf 100644
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multi_vhosts/apache2/sites-available/multi-vhost.conf
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/multi_vhosts/apache2/sites-available/multi-vhost.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multi_vhosts/apache2/sites-enabled/default.conf b/certbot-apache/tests/testdata/debian_apache_2_4/multi_vhosts/apache2/sites-enabled/default.conf
index 032e6bcf0..032e6bcf0 120000
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multi_vhosts/apache2/sites-enabled/default.conf
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/multi_vhosts/apache2/sites-enabled/default.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multi_vhosts/apache2/sites-enabled/multi-vhost.conf b/certbot-apache/tests/testdata/debian_apache_2_4/multi_vhosts/apache2/sites-enabled/multi-vhost.conf
index 7f0910ff4..7f0910ff4 120000
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multi_vhosts/apache2/sites-enabled/multi-vhost.conf
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/multi_vhosts/apache2/sites-enabled/multi-vhost.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/apache2.conf b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/apache2.conf
index 819a6bcb4..819a6bcb4 100644
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/apache2.conf
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/apache2.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/conf-available/bad_conf_file.conf b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/conf-available/bad_conf_file.conf
index 8e9178803..8e9178803 100644
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/conf-available/bad_conf_file.conf
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/conf-available/bad_conf_file.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/conf-available/other-vhosts-access-log.conf b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/conf-available/other-vhosts-access-log.conf
index 5e9f5e9e7..5e9f5e9e7 100644
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/conf-available/other-vhosts-access-log.conf
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/conf-available/other-vhosts-access-log.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/conf-available/security.conf b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/conf-available/security.conf
index eccfcb1fd..eccfcb1fd 100644
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/conf-available/security.conf
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/conf-available/security.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/conf-available/serve-cgi-bin.conf b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/conf-available/serve-cgi-bin.conf
index b02782dab..b02782dab 100644
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/conf-available/serve-cgi-bin.conf
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/conf-available/serve-cgi-bin.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/conf-enabled/other-vhosts-access-log.conf b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/conf-enabled/other-vhosts-access-log.conf
index 8af91e530..8af91e530 120000
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/conf-enabled/other-vhosts-access-log.conf
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/conf-enabled/other-vhosts-access-log.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/conf-enabled/security.conf b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/conf-enabled/security.conf
index 036c97fa7..036c97fa7 120000
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/conf-enabled/security.conf
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/conf-enabled/security.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/conf-enabled/serve-cgi-bin.conf b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/conf-enabled/serve-cgi-bin.conf
index d917f688e..d917f688e 120000
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/conf-enabled/serve-cgi-bin.conf
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/conf-enabled/serve-cgi-bin.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/envvars b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/envvars
index a13d9a89e..a13d9a89e 100644
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/envvars
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/envvars
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/mods-available/authz_svn.load b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/mods-available/authz_svn.load
index c6df2733b..c6df2733b 100644
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/mods-available/authz_svn.load
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/mods-available/authz_svn.load
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/mods-available/dav.load b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/mods-available/dav.load
index a5867fff3..a5867fff3 100644
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/mods-available/dav.load
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/mods-available/dav.load
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/mods-available/dav_svn.conf b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/mods-available/dav_svn.conf
index 801cbd6bd..801cbd6bd 100644
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/mods-available/dav_svn.conf
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/mods-available/dav_svn.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/mods-available/dav_svn.load b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/mods-available/dav_svn.load
index e41e1581a..e41e1581a 100644
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/mods-available/dav_svn.load
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/mods-available/dav_svn.load
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/mods-available/rewrite.load b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/mods-available/rewrite.load
index b32f16264..b32f16264 100644
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/mods-available/rewrite.load
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/mods-available/rewrite.load
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/mods-available/ssl.conf b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/mods-available/ssl.conf
index e9fcf4f9b..65baec874 100644
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/mods-available/ssl.conf
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/mods-available/ssl.conf
@@ -31,7 +31,7 @@
# Pass Phrase Dialog:
# Configure the pass phrase gathering process.
- # The filtering dialog program (`builtin' is a internal
+ # The filtering dialog program (`builtin' is an internal
# terminal dialog) has to provide the pass phrase on stdout.
SSLPassPhraseDialog exec:/usr/share/apache2/ask-for-passphrase
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/mods-available/ssl.load b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/mods-available/ssl.load
index 3d2336ae0..3d2336ae0 100644
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/mods-available/ssl.load
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/mods-available/ssl.load
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/mods-enabled/authz_svn.load b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/mods-enabled/authz_svn.load
index 7ac0725dd..7ac0725dd 120000
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/mods-enabled/authz_svn.load
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/mods-enabled/authz_svn.load
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/mods-enabled/dav.load b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/mods-enabled/dav.load
index 9dcfef6da..9dcfef6da 120000
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/mods-enabled/dav.load
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/mods-enabled/dav.load
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/mods-enabled/dav_svn.conf b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/mods-enabled/dav_svn.conf
index 964c7bb0b..964c7bb0b 120000
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/mods-enabled/dav_svn.conf
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/mods-enabled/dav_svn.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/mods-enabled/dav_svn.load b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/mods-enabled/dav_svn.load
index 4094e4173..4094e4173 120000
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/mods-enabled/dav_svn.load
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/mods-enabled/dav_svn.load
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/ports.conf b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/ports.conf
index 5daec58c1..5daec58c1 100644
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/ports.conf
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/ports.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-available/000-default.conf b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-available/000-default.conf
index 2bd4e1fe9..2bd4e1fe9 100644
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-available/000-default.conf
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-available/000-default.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-available/certbot.conf b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-available/certbot.conf
index 965ca2222..965ca2222 100644
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-available/certbot.conf
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-available/certbot.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-available/default-ssl-port-only.conf b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-available/default-ssl-port-only.conf
index 849b42e9f..849b42e9f 100644
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-available/default-ssl-port-only.conf
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-available/default-ssl-port-only.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-available/default-ssl.conf b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-available/default-ssl.conf
index a3025ae8a..a3025ae8a 100644
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-available/default-ssl.conf
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-available/default-ssl.conf
diff --git a/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-available/duplicatehttp.conf b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-available/duplicatehttp.conf
new file mode 100644
index 000000000..5684651fb
--- /dev/null
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-available/duplicatehttp.conf
@@ -0,0 +1,9 @@
+<VirtualHost 10.2.3.4:80>
+ ServerName duplicate.example.com
+
+ ServerAdmin webmaster@certbot.demo
+ DocumentRoot /var/www/html
+
+ ErrorLog ${APACHE_LOG_DIR}/error.log
+ CustomLog ${APACHE_LOG_DIR}/access.log combined
+</VirtualHost>
diff --git a/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-available/duplicatehttps.conf b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-available/duplicatehttps.conf
new file mode 100644
index 000000000..e3ac21fac
--- /dev/null
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-available/duplicatehttps.conf
@@ -0,0 +1,14 @@
+<IfModule mod_ssl.c>
+<VirtualHost 10.2.3.4:443>
+ ServerName duplicate.example.com
+
+ ServerAdmin webmaster@certbot.demo
+ DocumentRoot /var/www/html
+
+ ErrorLog ${APACHE_LOG_DIR}/error.log
+ CustomLog ${APACHE_LOG_DIR}/access.log combined
+
+SSLCertificateFile /etc/apache2/certs/certbot-cert_5.pem
+SSLCertificateKeyFile /etc/apache2/ssl/key-certbot_15.pem
+</VirtualHost>
+</IfModule>
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-available/encryption-example.conf b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-available/encryption-example.conf
index 862040fc1..862040fc1 100644
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-available/encryption-example.conf
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-available/encryption-example.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-available/mod_macro-example.conf b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-available/mod_macro-example.conf
index 6a6579007..6a6579007 100644
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-available/mod_macro-example.conf
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-available/mod_macro-example.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-available/ocsp-ssl.conf b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-available/ocsp-ssl.conf
index 631cf16c8..631cf16c8 100644
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-available/ocsp-ssl.conf
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-available/ocsp-ssl.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-available/wildcard.conf b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-available/wildcard.conf
index 33e30a63b..33e30a63b 100644
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-available/wildcard.conf
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-available/wildcard.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-enabled/000-default.conf b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-enabled/000-default.conf
index 3c4632b73..3c4632b73 120000
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-enabled/000-default.conf
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-enabled/000-default.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-enabled/certbot.conf b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-enabled/certbot.conf
index 4d08c763f..4d08c763f 120000
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-enabled/certbot.conf
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-enabled/certbot.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-enabled/default-ssl-port-only.conf b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-enabled/default-ssl-port-only.conf
index 103c1b68d..103c1b68d 120000
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-enabled/default-ssl-port-only.conf
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-enabled/default-ssl-port-only.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-enabled/default-ssl.conf b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-enabled/default-ssl.conf
index d02890bbd..d02890bbd 120000
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-enabled/default-ssl.conf
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-enabled/default-ssl.conf
diff --git a/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-enabled/duplicatehttp.conf b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-enabled/duplicatehttp.conf
new file mode 120000
index 000000000..a69ee3c1d
--- /dev/null
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-enabled/duplicatehttp.conf
@@ -0,0 +1 @@
+../sites-available/duplicatehttp.conf \ No newline at end of file
diff --git a/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-enabled/duplicatehttps.conf b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-enabled/duplicatehttps.conf
new file mode 120000
index 000000000..a52ee1ccb
--- /dev/null
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-enabled/duplicatehttps.conf
@@ -0,0 +1 @@
+../sites-available/duplicatehttps.conf \ No newline at end of file
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-enabled/encryption-example.conf b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-enabled/encryption-example.conf
index 417818069..417818069 120000
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-enabled/encryption-example.conf
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-enabled/encryption-example.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-enabled/mod_macro-example.conf b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-enabled/mod_macro-example.conf
index 44f254304..44f254304 120000
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-enabled/mod_macro-example.conf
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-enabled/mod_macro-example.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-enabled/non-symlink.conf b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-enabled/non-symlink.conf
index 31cb6093c..31cb6093c 100644
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-enabled/non-symlink.conf
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-enabled/non-symlink.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-enabled/ocsp-ssl.conf b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-enabled/ocsp-ssl.conf
index b25ee0482..b25ee0482 120000
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-enabled/ocsp-ssl.conf
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-enabled/ocsp-ssl.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-enabled/wildcard.conf b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-enabled/wildcard.conf
index a87af2c93..a87af2c93 120000
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-enabled/wildcard.conf
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/apache2/sites-enabled/wildcard.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/sites b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/sites
index ab518ee5b..ab518ee5b 100644
--- a/certbot-apache/certbot_apache/tests/testdata/debian_apache_2_4/multiple_vhosts/sites
+++ b/certbot-apache/tests/testdata/debian_apache_2_4/multiple_vhosts/sites
diff --git a/certbot-apache/certbot_apache/tests/testdata/gentoo_apache/apache/apache2/httpd.conf b/certbot-apache/tests/testdata/gentoo_apache/apache/apache2/httpd.conf
index e5693ffff..e5693ffff 100644
--- a/certbot-apache/certbot_apache/tests/testdata/gentoo_apache/apache/apache2/httpd.conf
+++ b/certbot-apache/tests/testdata/gentoo_apache/apache/apache2/httpd.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/gentoo_apache/apache/apache2/magic b/certbot-apache/tests/testdata/gentoo_apache/apache/apache2/magic
index 7c56119e9..7c56119e9 100644
--- a/certbot-apache/certbot_apache/tests/testdata/gentoo_apache/apache/apache2/magic
+++ b/certbot-apache/tests/testdata/gentoo_apache/apache/apache2/magic
diff --git a/certbot-apache/certbot_apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/00_default_settings.conf b/certbot-apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/00_default_settings.conf
index 38635aa9d..38635aa9d 100644
--- a/certbot-apache/certbot_apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/00_default_settings.conf
+++ b/certbot-apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/00_default_settings.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/00_error_documents.conf b/certbot-apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/00_error_documents.conf
index 61479fa53..61479fa53 100644
--- a/certbot-apache/certbot_apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/00_error_documents.conf
+++ b/certbot-apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/00_error_documents.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/00_languages.conf b/certbot-apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/00_languages.conf
index c429bf94c..10cf3fb54 100644
--- a/certbot-apache/certbot_apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/00_languages.conf
+++ b/certbot-apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/00_languages.conf
@@ -33,7 +33,7 @@
# English (en) - Esperanto (eo) - Estonian (et) - French (fr) - German (de)
# Greek-Modern (el) - Hebrew (he) - Italian (it) - Japanese (ja)
# Korean (ko) - Luxembourgeois* (ltz) - Norwegian Nynorsk (nn)
-# Norwegian (no) - Polish (pl) - Portugese (pt)
+# Norwegian (no) - Polish (pl) - Portuguese (pt)
# Brazilian Portuguese (pt-BR) - Russian (ru) - Swedish (sv)
# Simplified Chinese (zh-CN) - Spanish (es) - Traditional Chinese (zh-TW)
AddLanguage ca .ca
diff --git a/certbot-apache/certbot_apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/00_mod_autoindex.conf b/certbot-apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/00_mod_autoindex.conf
index 10bf48317..10bf48317 100644
--- a/certbot-apache/certbot_apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/00_mod_autoindex.conf
+++ b/certbot-apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/00_mod_autoindex.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/00_mod_info.conf b/certbot-apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/00_mod_info.conf
index 2cd32c477..2cd32c477 100644
--- a/certbot-apache/certbot_apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/00_mod_info.conf
+++ b/certbot-apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/00_mod_info.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/00_mod_log_config.conf b/certbot-apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/00_mod_log_config.conf
index ce0238eee..ce0238eee 100644
--- a/certbot-apache/certbot_apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/00_mod_log_config.conf
+++ b/certbot-apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/00_mod_log_config.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/00_mod_mime.conf b/certbot-apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/00_mod_mime.conf
index fb8a9a5d5..fb8a9a5d5 100644
--- a/certbot-apache/certbot_apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/00_mod_mime.conf
+++ b/certbot-apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/00_mod_mime.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/00_mod_status.conf b/certbot-apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/00_mod_status.conf
index ed8b3c7cb..ed8b3c7cb 100644
--- a/certbot-apache/certbot_apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/00_mod_status.conf
+++ b/certbot-apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/00_mod_status.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/00_mod_userdir.conf b/certbot-apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/00_mod_userdir.conf
index 0087126c4..0087126c4 100644
--- a/certbot-apache/certbot_apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/00_mod_userdir.conf
+++ b/certbot-apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/00_mod_userdir.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/00_mpm.conf b/certbot-apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/00_mpm.conf
index bcb9b6b47..bcb9b6b47 100644
--- a/certbot-apache/certbot_apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/00_mpm.conf
+++ b/certbot-apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/00_mpm.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/10_mod_mem_cache.conf b/certbot-apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/10_mod_mem_cache.conf
index 520d9fd82..520d9fd82 100644
--- a/certbot-apache/certbot_apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/10_mod_mem_cache.conf
+++ b/certbot-apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/10_mod_mem_cache.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/40_mod_ssl.conf b/certbot-apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/40_mod_ssl.conf
index f51de4641..7f3cef423 100644
--- a/certbot-apache/certbot_apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/40_mod_ssl.conf
+++ b/certbot-apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/40_mod_ssl.conf
@@ -43,7 +43,7 @@ SSLRandomSeed connect builtin
## Pass Phrase Dialog:
# Configure the pass phrase gathering process. The filtering dialog program
-# (`builtin' is a internal terminal dialog) has to provide the pass phrase on
+# (`builtin' is an internal terminal dialog) has to provide the pass phrase on
# stdout.
SSLPassPhraseDialog builtin
diff --git a/certbot-apache/certbot_apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/41_mod_http2.conf b/certbot-apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/41_mod_http2.conf
index e4c9454e0..e4c9454e0 100644
--- a/certbot-apache/certbot_apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/41_mod_http2.conf
+++ b/certbot-apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/41_mod_http2.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/45_mod_dav.conf b/certbot-apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/45_mod_dav.conf
index 36f6b9cca..36f6b9cca 100644
--- a/certbot-apache/certbot_apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/45_mod_dav.conf
+++ b/certbot-apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/45_mod_dav.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/46_mod_ldap.conf b/certbot-apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/46_mod_ldap.conf
index 883061fee..883061fee 100644
--- a/certbot-apache/certbot_apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/46_mod_ldap.conf
+++ b/certbot-apache/tests/testdata/gentoo_apache/apache/apache2/modules.d/46_mod_ldap.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/gentoo_apache/apache/apache2/vhosts.d/00_default_ssl_vhost.conf b/certbot-apache/tests/testdata/gentoo_apache/apache/apache2/vhosts.d/00_default_ssl_vhost.conf
index bb395473c..bb395473c 100644
--- a/certbot-apache/certbot_apache/tests/testdata/gentoo_apache/apache/apache2/vhosts.d/00_default_ssl_vhost.conf
+++ b/certbot-apache/tests/testdata/gentoo_apache/apache/apache2/vhosts.d/00_default_ssl_vhost.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/gentoo_apache/apache/apache2/vhosts.d/00_default_vhost.conf b/certbot-apache/tests/testdata/gentoo_apache/apache/apache2/vhosts.d/00_default_vhost.conf
index b9766b5f1..b9766b5f1 100644
--- a/certbot-apache/certbot_apache/tests/testdata/gentoo_apache/apache/apache2/vhosts.d/00_default_vhost.conf
+++ b/certbot-apache/tests/testdata/gentoo_apache/apache/apache2/vhosts.d/00_default_vhost.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/gentoo_apache/apache/apache2/vhosts.d/default_vhost.include b/certbot-apache/tests/testdata/gentoo_apache/apache/apache2/vhosts.d/default_vhost.include
index af6ece85b..af6ece85b 100644
--- a/certbot-apache/certbot_apache/tests/testdata/gentoo_apache/apache/apache2/vhosts.d/default_vhost.include
+++ b/certbot-apache/tests/testdata/gentoo_apache/apache/apache2/vhosts.d/default_vhost.include
diff --git a/certbot-apache/certbot_apache/tests/testdata/gentoo_apache/apache/apache2/vhosts.d/gentoo.example.com.conf b/certbot-apache/tests/testdata/gentoo_apache/apache/apache2/vhosts.d/gentoo.example.com.conf
index 41de4d236..41de4d236 100644
--- a/certbot-apache/certbot_apache/tests/testdata/gentoo_apache/apache/apache2/vhosts.d/gentoo.example.com.conf
+++ b/certbot-apache/tests/testdata/gentoo_apache/apache/apache2/vhosts.d/gentoo.example.com.conf
diff --git a/certbot-apache/certbot_apache/tests/testdata/gentoo_apache/apache/conf.d/apache2 b/certbot-apache/tests/testdata/gentoo_apache/apache/conf.d/apache2
index b7ecb4f2a..b7ecb4f2a 100644
--- a/certbot-apache/certbot_apache/tests/testdata/gentoo_apache/apache/conf.d/apache2
+++ b/certbot-apache/tests/testdata/gentoo_apache/apache/conf.d/apache2
diff --git a/certbot-apache/certbot_apache/tests/testdata/gentoo_apache/apache/sites b/certbot-apache/tests/testdata/gentoo_apache/apache/sites
index 7f0b3a8b3..7f0b3a8b3 100644
--- a/certbot-apache/certbot_apache/tests/testdata/gentoo_apache/apache/sites
+++ b/certbot-apache/tests/testdata/gentoo_apache/apache/sites
diff --git a/certbot-apache/certbot_apache/tests/util.py b/certbot-apache/tests/util.py
index 9329ccb20..57b20dc9d 100644
--- a/certbot-apache/certbot_apache/tests/util.py
+++ b/certbot-apache/tests/util.py
@@ -1,5 +1,4 @@
"""Common utilities for certbot_apache."""
-import os
import shutil
import sys
import unittest
@@ -9,18 +8,16 @@ import josepy as jose
import mock
import zope.component
+from certbot.compat import os
from certbot.display import util as display_util
-
from certbot.plugins import common
-
from certbot.tests import util as test_util
-
-from certbot_apache import configurator
-from certbot_apache import entrypoint
-from certbot_apache import obj
+from certbot_apache._internal import configurator
+from certbot_apache._internal import entrypoint
+from certbot_apache._internal import obj
-class ApacheTest(unittest.TestCase): # pylint: disable=too-few-public-methods
+class ApacheTest(unittest.TestCase):
def setUp(self, test_dir="debian_apache_2_4/multiple_vhosts",
config_root="debian_apache_2_4/multiple_vhosts/apache2",
@@ -30,7 +27,7 @@ class ApacheTest(unittest.TestCase): # pylint: disable=too-few-public-methods
self.temp_dir, self.config_dir, self.work_dir = common.dir_setup(
test_dir=test_dir,
- pkg="certbot_apache.tests")
+ pkg=__name__)
self.config_path = os.path.join(self.temp_dir, config_root)
self.vhost_path = os.path.join(self.temp_dir, vhost_root)
@@ -74,17 +71,16 @@ class ParserTest(ApacheTest):
zope.component.provideUtility(display_util.FileDisplay(sys.stdout,
False))
- from certbot_apache.parser import ApacheParser
+ from certbot_apache._internal.parser import ApacheParser
self.aug = augeas.Augeas(
flags=augeas.Augeas.NONE | augeas.Augeas.NO_MODL_AUTOLOAD)
- with mock.patch("certbot_apache.parser.ApacheParser."
+ with mock.patch("certbot_apache._internal.parser.ApacheParser."
"update_runtime_variables"):
self.parser = ApacheParser(
- self.aug, self.config_path, self.vhost_path,
- configurator=self.config)
+ self.config_path, self.vhost_path, configurator=self.config)
-def get_apache_configurator( # pylint: disable=too-many-arguments, too-many-locals
+def get_apache_configurator(
config_path, vhost_path,
config_dir, work_dir, version=(2, 4, 7),
os_info="generic",
@@ -108,11 +104,11 @@ def get_apache_configurator( # pylint: disable=too-many-arguments, too-many-loc
in_progress_dir=os.path.join(backups, "IN_PROGRESS"),
work_dir=work_dir)
- with mock.patch("certbot_apache.configurator.util.run_script"):
- with mock.patch("certbot_apache.configurator.util."
+ with mock.patch("certbot_apache._internal.configurator.util.run_script"):
+ with mock.patch("certbot_apache._internal.configurator.util."
"exe_exists") as mock_exe_exists:
mock_exe_exists.return_value = True
- with mock.patch("certbot_apache.parser.ApacheParser."
+ with mock.patch("certbot_apache._internal.parser.ApacheParser."
"update_runtime_variables"):
try:
config_class = entrypoint.OVERRIDE_CLASSES[os_info]
@@ -196,7 +192,17 @@ def get_vh_truth(temp_dir, config_name):
"/files" + os.path.join(temp_dir, config_name,
"apache2/apache2.conf/VirtualHost"),
set([obj.Addr.fromstring("*:80")]), False, True,
- "vhost.in.rootconf")]
+ "vhost.in.rootconf"),
+ obj.VirtualHost(
+ os.path.join(prefix, "duplicatehttp.conf"),
+ os.path.join(aug_pre, "duplicatehttp.conf/VirtualHost"),
+ set([obj.Addr.fromstring("10.2.3.4:80")]), False, True,
+ "duplicate.example.com"),
+ obj.VirtualHost(
+ os.path.join(prefix, "duplicatehttps.conf"),
+ os.path.join(aug_pre, "duplicatehttps.conf/IfModule/VirtualHost"),
+ set([obj.Addr.fromstring("10.2.3.4:443")]), True, True,
+ "duplicate.example.com")]
return vh_truth
if config_name == "debian_apache_2_4/multi_vhosts":
prefix = os.path.join(