Merge ~ahasenack/ubuntu/+source/apache2:cosmic-apache-fix-curl-transition into ubuntu/+source/apache2:ubuntu/devel

Proposed by Andreas Hasenack
Status: Merged
Merge reported by: Andreas Hasenack
Merged at revision: a171e1f929d63d9b9bb12e04ccbbf56fa0c68f8f
Proposed branch: ~ahasenack/ubuntu/+source/apache2:cosmic-apache-fix-curl-transition
Merge into: ubuntu/+source/apache2:ubuntu/devel
Diff against target: 440894 lines (+432264/-31)
1410 files modified
debian/changelog (+17/-0)
debian/control (+1/-28)
debian/rules (+3/-1)
dev/null (+0/-2)
docs/manual/style/latex/atbeginend.sty (+80/-0)
docs/manual/style/manualpage.dtd (+29/-0)
docs/manual/style/modulesynopsis.dtd (+92/-0)
docs/manual/style/scripts/MINIFY (+5/-0)
docs/manual/style/scripts/prettify.js (+1622/-0)
docs/manual/style/scripts/prettify.min.js (+124/-0)
docs/manual/style/sitemap.dtd (+42/-0)
docs/manual/style/version.ent (+24/-0)
docs/manual/suexec.html (+21/-0)
docs/manual/suexec.html.en (+643/-0)
docs/manual/suexec.html.fr (+689/-0)
docs/manual/suexec.html.ja.utf8 (+643/-0)
docs/manual/suexec.html.ko.euc-kr (+564/-0)
docs/manual/suexec.html.tr.utf8 (+583/-0)
docs/manual/upgrading.html (+9/-0)
docs/manual/upgrading.html.en (+537/-0)
docs/manual/upgrading.html.fr (+598/-0)
docs/manual/urlmapping.html (+21/-0)
docs/manual/urlmapping.html.en (+379/-0)
docs/manual/urlmapping.html.fr (+402/-0)
docs/manual/urlmapping.html.ja.utf8 (+318/-0)
docs/manual/urlmapping.html.ko.euc-kr (+277/-0)
docs/manual/urlmapping.html.tr.utf8 (+365/-0)
docs/manual/vhosts/details.html (+17/-0)
docs/manual/vhosts/details.html.en (+348/-0)
docs/manual/vhosts/details.html.fr (+369/-0)
docs/manual/vhosts/details.html.ko.euc-kr (+412/-0)
docs/manual/vhosts/details.html.tr.utf8 (+319/-0)
docs/manual/vhosts/examples.html (+21/-0)
docs/manual/vhosts/examples.html.en (+566/-0)
docs/manual/vhosts/examples.html.fr (+586/-0)
docs/manual/vhosts/examples.html.ja.utf8 (+680/-0)
docs/manual/vhosts/examples.html.ko.euc-kr (+657/-0)
docs/manual/vhosts/examples.html.tr.utf8 (+562/-0)
docs/manual/vhosts/fd-limits.html (+21/-0)
docs/manual/vhosts/fd-limits.html.en (+155/-0)
docs/manual/vhosts/fd-limits.html.fr (+167/-0)
docs/manual/vhosts/fd-limits.html.ja.utf8 (+157/-0)
docs/manual/vhosts/fd-limits.html.ko.euc-kr (+152/-0)
docs/manual/vhosts/fd-limits.html.tr.utf8 (+150/-0)
docs/manual/vhosts/index.html (+29/-0)
docs/manual/vhosts/index.html.de (+124/-0)
docs/manual/vhosts/index.html.en (+126/-0)
docs/manual/vhosts/index.html.fr (+127/-0)
docs/manual/vhosts/index.html.ja.utf8 (+120/-0)
docs/manual/vhosts/index.html.ko.euc-kr (+119/-0)
docs/manual/vhosts/index.html.tr.utf8 (+123/-0)
docs/manual/vhosts/index.html.zh-cn.utf8 (+105/-0)
docs/manual/vhosts/ip-based.html (+21/-0)
docs/manual/vhosts/ip-based.html.en (+210/-0)
docs/manual/vhosts/ip-based.html.fr (+213/-0)
docs/manual/vhosts/ip-based.html.ja.utf8 (+190/-0)
docs/manual/vhosts/ip-based.html.ko.euc-kr (+180/-0)
docs/manual/vhosts/ip-based.html.tr.utf8 (+211/-0)
docs/manual/vhosts/mass.html (+17/-0)
docs/manual/vhosts/mass.html.en (+348/-0)
docs/manual/vhosts/mass.html.fr (+363/-0)
docs/manual/vhosts/mass.html.ko.euc-kr (+453/-0)
docs/manual/vhosts/mass.html.tr.utf8 (+334/-0)
docs/manual/vhosts/name-based.html (+25/-0)
docs/manual/vhosts/name-based.html.de (+299/-0)
docs/manual/vhosts/name-based.html.en (+224/-0)
docs/manual/vhosts/name-based.html.fr (+267/-0)
docs/manual/vhosts/name-based.html.ja.utf8 (+303/-0)
docs/manual/vhosts/name-based.html.ko.euc-kr (+266/-0)
docs/manual/vhosts/name-based.html.tr.utf8 (+238/-0)
docs/server-status/README.md (+40/-0)
docs/server-status/server-status.lua (+1901/-0)
emacs-style (+12/-0)
httpd.dep (+68/-0)
httpd.dsp (+111/-0)
httpd.mak (+344/-0)
httpd.spec (+493/-0)
include/.indent.pro (+54/-0)
include/ap_compat.h (+30/-0)
include/ap_config.h (+206/-0)
include/ap_config_auto.h.in (+310/-0)
include/ap_config_layout.h.in (+64/-0)
include/ap_expr.h (+353/-0)
include/ap_hooks.h (+162/-0)
include/ap_listen.h (+163/-0)
include/ap_mmn.h (+554/-0)
include/ap_mpm.h (+235/-0)
include/ap_provider.h (+100/-0)
include/ap_regex.h (+275/-0)
include/ap_regkey.h (+219/-0)
include/ap_release.h (+83/-0)
include/ap_slotmem.h (+199/-0)
include/ap_socache.h (+230/-0)
include/apache_noprobes.h (+344/-0)
include/heartbeat.h (+60/-0)
include/http_config.h (+1408/-0)
include/http_connection.h (+168/-0)
include/http_core.h (+1049/-0)
include/http_log.h (+836/-0)
include/http_main.h (+88/-0)
include/http_protocol.h (+1021/-0)
include/http_request.h (+630/-0)
include/http_vhost.h (+119/-0)
include/httpd.h (+2405/-0)
include/mod_auth.h (+141/-0)
include/mod_core.h (+103/-0)
include/mod_request.h (+64/-0)
include/mpm_common.h (+470/-0)
include/scoreboard.h (+246/-0)
include/util_cfgtree.h (+98/-0)
include/util_charset.h (+72/-0)
include/util_cookies.h (+146/-0)
include/util_ebcdic.h (+92/-0)
include/util_fcgi.h (+280/-0)
include/util_filter.h (+639/-0)
include/util_ldap.h (+398/-0)
include/util_md5.h (+72/-0)
include/util_mutex.h (+223/-0)
include/util_script.h (+233/-0)
include/util_time.h (+117/-0)
include/util_varbuf.h (+197/-0)
include/util_xml.h (+51/-0)
libhttpd.dep (+2421/-0)
libhttpd.dsp (+846/-0)
libhttpd.mak (+1366/-0)
modules/Makefile.in (+6/-0)
modules/NWGNUmakefile (+121/-0)
modules/README (+67/-0)
modules/aaa/.indent.pro (+54/-0)
modules/aaa/Makefile.in (+3/-0)
modules/aaa/NWGNUaccesscompat (+248/-0)
modules/aaa/NWGNUallowmethods (+248/-0)
modules/aaa/NWGNUauthbasc (+248/-0)
modules/aaa/NWGNUauthdigt (+248/-0)
modules/aaa/NWGNUauthform (+250/-0)
modules/aaa/NWGNUauthnano (+248/-0)
modules/aaa/NWGNUauthndbd (+249/-0)
modules/aaa/NWGNUauthndbm (+248/-0)
modules/aaa/NWGNUauthnfil (+248/-0)
modules/aaa/NWGNUauthnsocache (+248/-0)
modules/aaa/NWGNUauthnzldap (+264/-0)
modules/aaa/NWGNUauthzdbd (+249/-0)
modules/aaa/NWGNUauthzdbm (+248/-0)
modules/aaa/NWGNUauthzgrp (+247/-0)
modules/aaa/NWGNUauthzusr (+247/-0)
modules/aaa/NWGNUmakefile (+270/-0)
modules/aaa/config.m4 (+84/-0)
modules/aaa/mod_access_compat.c (+377/-0)
modules/aaa/mod_access_compat.dep (+59/-0)
modules/aaa/mod_access_compat.dsp (+111/-0)
modules/aaa/mod_access_compat.mak (+353/-0)
modules/aaa/mod_allowmethods.c (+158/-0)
modules/aaa/mod_allowmethods.dep (+56/-0)
modules/aaa/mod_allowmethods.dsp (+111/-0)
modules/aaa/mod_allowmethods.mak (+353/-0)
modules/aaa/mod_auth_basic.c (+512/-0)
modules/aaa/mod_auth_basic.dep (+63/-0)
modules/aaa/mod_auth_basic.dsp (+111/-0)
modules/aaa/mod_auth_basic.mak (+353/-0)
modules/aaa/mod_auth_digest.c (+1976/-0)
modules/aaa/mod_auth_digest.dep (+68/-0)
modules/aaa/mod_auth_digest.dsp (+111/-0)
modules/aaa/mod_auth_digest.mak (+353/-0)
modules/aaa/mod_auth_form.c (+1333/-0)
modules/aaa/mod_auth_form.dep (+66/-0)
modules/aaa/mod_auth_form.dsp (+111/-0)
modules/aaa/mod_auth_form.mak (+353/-0)
modules/aaa/mod_authn_anon.c (+215/-0)
modules/aaa/mod_authn_anon.dep (+58/-0)
modules/aaa/mod_authn_anon.dsp (+111/-0)
modules/aaa/mod_authn_anon.mak (+381/-0)
modules/aaa/mod_authn_core.c (+386/-0)
modules/aaa/mod_authn_core.dep (+58/-0)
modules/aaa/mod_authn_core.dsp (+111/-0)
modules/aaa/mod_authn_core.mak (+381/-0)
modules/aaa/mod_authn_dbd.c (+309/-0)
modules/aaa/mod_authn_dbd.dep (+56/-0)
modules/aaa/mod_authn_dbd.dsp (+115/-0)
modules/aaa/mod_authn_dbd.mak (+409/-0)
modules/aaa/mod_authn_dbm.c (+208/-0)
modules/aaa/mod_authn_dbm.dep (+61/-0)
modules/aaa/mod_authn_dbm.dsp (+111/-0)
modules/aaa/mod_authn_dbm.mak (+381/-0)
modules/aaa/mod_authn_file.c (+194/-0)
modules/aaa/mod_authn_file.dep (+60/-0)
modules/aaa/mod_authn_file.dsp (+111/-0)
modules/aaa/mod_authn_file.mak (+381/-0)
modules/aaa/mod_authn_socache.c (+475/-0)
modules/aaa/mod_authn_socache.dep (+62/-0)
modules/aaa/mod_authn_socache.dsp (+111/-0)
modules/aaa/mod_authn_socache.mak (+353/-0)
modules/aaa/mod_authnz_fcgi.c (+1363/-0)
modules/aaa/mod_authnz_fcgi.dep (+61/-0)
modules/aaa/mod_authnz_fcgi.dsp (+119/-0)
modules/aaa/mod_authnz_fcgi.mak (+353/-0)
modules/aaa/mod_authnz_ldap.c (+1962/-0)
modules/aaa/mod_authnz_ldap.dep (+70/-0)
modules/aaa/mod_authnz_ldap.dsp (+111/-0)
modules/aaa/mod_authnz_ldap.mak (+381/-0)
modules/aaa/mod_authz_core.c (+1164/-0)
modules/aaa/mod_authz_core.dep (+60/-0)
modules/aaa/mod_authz_core.dsp (+111/-0)
modules/aaa/mod_authz_core.mak (+381/-0)
modules/aaa/mod_authz_dbd.c (+409/-0)
modules/aaa/mod_authz_dbd.dep (+61/-0)
modules/aaa/mod_authz_dbd.dsp (+119/-0)
modules/aaa/mod_authz_dbd.h (+44/-0)
modules/aaa/mod_authz_dbd.mak (+409/-0)
modules/aaa/mod_authz_dbm.c (+336/-0)
modules/aaa/mod_authz_dbm.dep (+62/-0)
modules/aaa/mod_authz_dbm.dsp (+111/-0)
modules/aaa/mod_authz_dbm.mak (+381/-0)
modules/aaa/mod_authz_groupfile.c (+331/-0)
modules/aaa/mod_authz_groupfile.dep (+61/-0)
modules/aaa/mod_authz_groupfile.dsp (+111/-0)
modules/aaa/mod_authz_groupfile.mak (+381/-0)
modules/aaa/mod_authz_host.c (+410/-0)
modules/aaa/mod_authz_host.dep (+60/-0)
modules/aaa/mod_authz_host.dsp (+111/-0)
modules/aaa/mod_authz_host.mak (+381/-0)
modules/aaa/mod_authz_owner.c (+189/-0)
modules/aaa/mod_authz_owner.dep (+59/-0)
modules/aaa/mod_authz_owner.dsp (+111/-0)
modules/aaa/mod_authz_owner.h (+27/-0)
modules/aaa/mod_authz_owner.mak (+381/-0)
modules/aaa/mod_authz_user.c (+146/-0)
modules/aaa/mod_authz_user.dep (+58/-0)
modules/aaa/mod_authz_user.dsp (+111/-0)
modules/aaa/mod_authz_user.mak (+381/-0)
modules/arch/netware/libprews.c (+79/-0)
modules/arch/netware/mod_netware.c (+206/-0)
modules/arch/netware/mod_nw_ssl.c (+1285/-0)
modules/arch/unix/Makefile.in (+3/-0)
modules/arch/unix/config5.m4 (+24/-0)
modules/arch/unix/mod_privileges.c (+588/-0)
modules/arch/unix/mod_unixd.c (+426/-0)
modules/arch/unix/mod_unixd.h (+41/-0)
modules/arch/win32/Makefile.in (+3/-0)
modules/arch/win32/config.m4 (+9/-0)
modules/arch/win32/mod_isapi.c (+1727/-0)
modules/arch/win32/mod_isapi.dep (+61/-0)
modules/arch/win32/mod_isapi.dsp (+115/-0)
modules/arch/win32/mod_isapi.h (+271/-0)
modules/arch/win32/mod_isapi.mak (+353/-0)
modules/arch/win32/mod_win32.c (+563/-0)
modules/cache/.indent.pro (+54/-0)
modules/cache/Makefile.in (+3/-0)
modules/cache/NWGNUcach_dsk (+262/-0)
modules/cache/NWGNUcach_socache (+263/-0)
modules/cache/NWGNUmakefile (+250/-0)
modules/cache/NWGNUmod_cach (+265/-0)
modules/cache/NWGNUsocachdbm (+261/-0)
modules/cache/NWGNUsocachmem (+261/-0)
modules/cache/NWGNUsocachshmcb (+261/-0)
modules/cache/cache_common.h (+56/-0)
modules/cache/cache_disk_common.h (+68/-0)
modules/cache/cache_socache_common.h (+57/-0)
modules/cache/cache_storage.c (+791/-0)
modules/cache/cache_storage.h (+76/-0)
modules/cache/cache_util.c (+1344/-0)
modules/cache/cache_util.h (+341/-0)
modules/cache/config.m4 (+142/-0)
modules/cache/mod_cache.c (+2717/-0)
modules/cache/mod_cache.dep (+194/-0)
modules/cache/mod_cache.dsp (+131/-0)
modules/cache/mod_cache.h (+192/-0)
modules/cache/mod_cache.mak (+370/-0)
modules/cache/mod_cache_disk.c (+1584/-0)
modules/cache/mod_cache_disk.dep (+59/-0)
modules/cache/mod_cache_disk.dsp (+115/-0)
modules/cache/mod_cache_disk.h (+91/-0)
modules/cache/mod_cache_disk.mak (+381/-0)
modules/cache/mod_cache_socache.c (+1543/-0)
modules/cache/mod_cache_socache.dep (+67/-0)
modules/cache/mod_cache_socache.dsp (+115/-0)
modules/cache/mod_cache_socache.mak (+381/-0)
modules/cache/mod_file_cache.c (+414/-0)
modules/cache/mod_file_cache.dep (+56/-0)
modules/cache/mod_file_cache.dsp (+111/-0)
modules/cache/mod_file_cache.exp (+1/-0)
modules/cache/mod_file_cache.mak (+353/-0)
modules/cache/mod_socache_dbm.c (+595/-0)
modules/cache/mod_socache_dbm.dep (+60/-0)
modules/cache/mod_socache_dbm.dsp (+111/-0)
modules/cache/mod_socache_dbm.mak (+353/-0)
modules/cache/mod_socache_dc.c (+198/-0)
modules/cache/mod_socache_dc.dep (+55/-0)
modules/cache/mod_socache_dc.dsp (+111/-0)
modules/cache/mod_socache_dc.mak (+353/-0)
modules/cache/mod_socache_memcache.c (+431/-0)
modules/cache/mod_socache_memcache.dep (+59/-0)
modules/cache/mod_socache_memcache.dsp (+111/-0)
modules/cache/mod_socache_memcache.mak (+353/-0)
modules/cache/mod_socache_shmcb.c (+1072/-0)
modules/cache/mod_socache_shmcb.dep (+56/-0)
modules/cache/mod_socache_shmcb.dsp (+111/-0)
modules/cache/mod_socache_shmcb.mak (+353/-0)
modules/cluster/Makefile.in (+3/-0)
modules/cluster/NWGNUmakefile (+246/-0)
modules/cluster/NWGNUmodheartbeat (+257/-0)
modules/cluster/NWGNUmodheartmonitor (+257/-0)
modules/cluster/README.heartbeat (+33/-0)
modules/cluster/README.heartmonitor (+30/-0)
modules/cluster/config5.m4 (+17/-0)
modules/cluster/mod_heartbeat.c (+228/-0)
modules/cluster/mod_heartbeat.dep (+55/-0)
modules/cluster/mod_heartbeat.dsp (+123/-0)
modules/cluster/mod_heartbeat.mak (+380/-0)
modules/cluster/mod_heartmonitor.c (+918/-0)
modules/cluster/mod_heartmonitor.dep (+63/-0)
modules/cluster/mod_heartmonitor.dsp (+123/-0)
modules/cluster/mod_heartmonitor.mak (+380/-0)
modules/config7.m4 (+56/-0)
modules/core/Makefile.in (+3/-0)
modules/core/NWGNUmakefile (+257/-0)
modules/core/config.m4 (+60/-0)
modules/core/mod_macro.c (+950/-0)
modules/core/mod_macro.dep (+45/-0)
modules/core/mod_macro.dsp (+111/-0)
modules/core/mod_macro.mak (+353/-0)
modules/core/mod_so.c (+442/-0)
modules/core/mod_so.h (+38/-0)
modules/core/mod_watchdog.c (+723/-0)
modules/core/mod_watchdog.dep (+59/-0)
modules/core/mod_watchdog.dsp (+115/-0)
modules/core/mod_watchdog.h (+213/-0)
modules/core/mod_watchdog.mak (+353/-0)
modules/core/test/Makefile (+67/-0)
modules/core/test/conf/inc63_1.conf (+5/-0)
modules/core/test/conf/inc63_2.conf (+3/-0)
modules/core/test/conf/test01.conf (+3/-0)
modules/core/test/conf/test02.conf (+3/-0)
modules/core/test/conf/test03.conf (+5/-0)
modules/core/test/conf/test04.conf (+5/-0)
modules/core/test/conf/test05.conf (+5/-0)
modules/core/test/conf/test06.conf (+6/-0)
modules/core/test/conf/test07.conf (+3/-0)
modules/core/test/conf/test08.conf (+3/-0)
modules/core/test/conf/test09.conf (+6/-0)
modules/core/test/conf/test10.conf (+10/-0)
modules/core/test/conf/test11.conf (+15/-0)
modules/core/test/conf/test12.conf (+12/-0)
modules/core/test/conf/test13.conf (+18/-0)
modules/core/test/conf/test14.conf (+23/-0)
modules/core/test/conf/test15.conf (+9/-0)
modules/core/test/conf/test16.conf (+11/-0)
modules/core/test/conf/test17.conf (+10/-0)
modules/core/test/conf/test18.conf (+10/-0)
modules/core/test/conf/test19.conf (+26/-0)
modules/core/test/conf/test20.conf (+11/-0)
modules/core/test/conf/test21.conf (+11/-0)
modules/core/test/conf/test22.conf (+11/-0)
modules/core/test/conf/test23.conf (+15/-0)
modules/core/test/conf/test24.conf (+23/-0)
modules/core/test/conf/test25.conf (+27/-0)
modules/core/test/conf/test26.conf (+19/-0)
modules/core/test/conf/test27.conf (+22/-0)
modules/core/test/conf/test28.conf (+13/-0)
modules/core/test/conf/test29.conf (+10/-0)
modules/core/test/conf/test30.conf (+12/-0)
modules/core/test/conf/test31.conf (+16/-0)
modules/core/test/conf/test32.conf (+7/-0)
modules/core/test/conf/test33.conf (+3/-0)
modules/core/test/conf/test34.conf (+14/-0)
modules/core/test/conf/test35.conf (+10/-0)
modules/core/test/conf/test36.conf (+12/-0)
modules/core/test/conf/test37.conf (+7/-0)
modules/core/test/conf/test38.conf (+10/-0)
modules/core/test/conf/test39.conf (+23/-0)
modules/core/test/conf/test40.conf (+33/-0)
modules/core/test/conf/test41.conf (+20/-0)
modules/core/test/conf/test42.conf (+13/-0)
modules/core/test/conf/test43.conf (+29/-0)
modules/core/test/conf/test44.conf (+19/-0)
modules/core/test/conf/test45.conf (+7/-0)
modules/core/test/conf/test46.conf (+11/-0)
modules/core/test/conf/test47.conf (+15/-0)
modules/core/test/conf/test48.conf (+23/-0)
modules/core/test/conf/test49.conf (+2/-0)
modules/core/test/conf/test50.conf (+5/-0)
modules/core/test/conf/test51.conf (+9/-0)
modules/core/test/conf/test52.conf (+8/-0)
modules/core/test/conf/test53.conf (+2/-0)
modules/core/test/conf/test54.conf (+6/-0)
modules/core/test/conf/test55.conf (+11/-0)
modules/core/test/conf/test56.conf (+18/-0)
modules/core/test/conf/test57.conf (+4/-0)
modules/core/test/conf/test58.conf (+4/-0)
modules/core/test/conf/test59.conf (+4/-0)
modules/core/test/conf/test60.conf (+17/-0)
modules/core/test/conf/test61.conf (+18/-0)
modules/core/test/conf/test62.conf (+25/-0)
modules/core/test/conf/test63.conf (+9/-0)
modules/core/test/conf/test64.conf (+5/-0)
modules/core/test/conf/test65.conf (+11/-0)
modules/core/test/conf/test66.conf (+7/-0)
modules/core/test/conf/test67.conf (+1/-0)
modules/core/test/conf/test68.conf (+5/-0)
modules/core/test/conf/test69.conf (+14/-0)
modules/core/test/ref/test01.out (+3/-0)
modules/core/test/ref/test02.out (+3/-0)
modules/core/test/ref/test03.out (+3/-0)
modules/core/test/ref/test04.out (+3/-0)
modules/core/test/ref/test05.out (+3/-0)
modules/core/test/ref/test06.out (+3/-0)
modules/core/test/ref/test07.out (+3/-0)
modules/core/test/ref/test08.out (+3/-0)
modules/core/test/ref/test09.out (+3/-0)
modules/core/test/ref/test10.out (+3/-0)
modules/core/test/ref/test11.out (+6/-0)
modules/core/test/ref/test12.out (+7/-0)
modules/core/test/ref/test13.out (+8/-0)
modules/core/test/ref/test14.out (+14/-0)
modules/core/test/ref/test15.out (+6/-0)
modules/core/test/ref/test16.out (+5/-0)
modules/core/test/ref/test17.out (+7/-0)
modules/core/test/ref/test18.out (+7/-0)
modules/core/test/ref/test19.out (+9/-0)
modules/core/test/ref/test20.out (+4/-0)
modules/core/test/ref/test21.out (+5/-0)
modules/core/test/ref/test22.out (+6/-0)
modules/core/test/ref/test23.out (+7/-0)
modules/core/test/ref/test24.out (+8/-0)
modules/core/test/ref/test25.out (+9/-0)
modules/core/test/ref/test26.out (+11/-0)
modules/core/test/ref/test27.out (+8/-0)
modules/core/test/ref/test28.out (+6/-0)
modules/core/test/ref/test29.out (+4/-0)
modules/core/test/ref/test30.out (+7/-0)
modules/core/test/ref/test31.out (+23/-0)
modules/core/test/ref/test32.out (+3/-0)
modules/core/test/ref/test33.out (+3/-0)
modules/core/test/ref/test34.out (+13/-0)
modules/core/test/ref/test35.out (+13/-0)
modules/core/test/ref/test36.out (+20/-0)
modules/core/test/ref/test37.out (+3/-0)
modules/core/test/ref/test38.out (+6/-0)
modules/core/test/ref/test39.out (+7/-0)
modules/core/test/ref/test40.out (+18/-0)
modules/core/test/ref/test41.out (+9/-0)
modules/core/test/ref/test42.out (+15/-0)
modules/core/test/ref/test43.out (+8/-0)
modules/core/test/ref/test44.out (+5/-0)
modules/core/test/ref/test45.out (+19/-0)
modules/core/test/ref/test46.out (+9/-0)
modules/core/test/ref/test47.out (+8/-0)
modules/core/test/ref/test48.out (+20/-0)
modules/core/test/ref/test49.out (+3/-0)
modules/core/test/ref/test50.out (+3/-0)
modules/core/test/ref/test51.out (+3/-0)
modules/core/test/ref/test52.out (+6/-0)
modules/core/test/ref/test53.out (+3/-0)
modules/core/test/ref/test54.out (+6/-0)
modules/core/test/ref/test55.out (+8/-0)
modules/core/test/ref/test56.out (+12/-0)
modules/core/test/ref/test57.out (+3/-0)
modules/core/test/ref/test58.out (+3/-0)
modules/core/test/ref/test59.out (+3/-0)
modules/core/test/ref/test60.out (+15/-0)
modules/core/test/ref/test61.out (+9/-0)
modules/core/test/ref/test62.out (+15/-0)
modules/core/test/ref/test63.out (+10/-0)
modules/core/test/ref/test64.out (+7/-0)
modules/core/test/ref/test65.out (+7/-0)
modules/core/test/ref/test66.out (+7/-0)
modules/core/test/ref/test67.out (+5/-0)
modules/core/test/ref/test68.out (+6/-0)
modules/core/test/ref/test69.out (+10/-0)
modules/database/Makefile.in (+3/-0)
modules/database/NWGNUmakefile (+262/-0)
modules/database/config.m4 (+8/-0)
modules/database/mod_dbd.c (+992/-0)
modules/database/mod_dbd.dep (+58/-0)
modules/database/mod_dbd.dsp (+115/-0)
modules/database/mod_dbd.h (+123/-0)
modules/database/mod_dbd.mak (+353/-0)
modules/dav/fs/Makefile.in (+3/-0)
modules/dav/fs/NWGNUmakefile (+269/-0)
modules/dav/fs/config6.m4 (+23/-0)
modules/dav/fs/dbm.c (+771/-0)
modules/dav/fs/lock.c (+1445/-0)
modules/dav/fs/mod_dav_fs.c (+108/-0)
modules/dav/fs/mod_dav_fs.dep (+203/-0)
modules/dav/fs/mod_dav_fs.dsp (+135/-0)
modules/dav/fs/mod_dav_fs.mak (+407/-0)
modules/dav/fs/repos.c (+2254/-0)
modules/dav/fs/repos.h (+84/-0)
modules/dav/lock/Makefile.in (+3/-0)
modules/dav/lock/NWGNUmakefile (+259/-0)
modules/dav/lock/config6.m4 (+17/-0)
modules/dav/lock/locks.c (+1211/-0)
modules/dav/lock/locks.h (+33/-0)
modules/dav/lock/mod_dav_lock.c (+104/-0)
modules/dav/lock/mod_dav_lock.dep (+100/-0)
modules/dav/lock/mod_dav_lock.dsp (+127/-0)
modules/dav/lock/mod_dav_lock.mak (+389/-0)
modules/dav/main/Makefile.in (+3/-0)
modules/dav/main/NWGNUmakefile (+268/-0)
modules/dav/main/config5.m4 (+21/-0)
modules/dav/main/liveprop.c (+140/-0)
modules/dav/main/mod_dav.c (+4946/-0)
modules/dav/main/mod_dav.dep (+354/-0)
modules/dav/main/mod_dav.dsp (+147/-0)
modules/dav/main/mod_dav.h (+2553/-0)
modules/dav/main/mod_dav.mak (+406/-0)
modules/dav/main/props.c (+1125/-0)
modules/dav/main/providers.c (+58/-0)
modules/dav/main/std_liveprop.c (+226/-0)
modules/dav/main/util.c (+2152/-0)
modules/dav/main/util_lock.c (+798/-0)
modules/debugging/Makefile.in (+3/-0)
modules/debugging/NWGNUmakefile (+246/-0)
modules/debugging/NWGNUmodbucketeer (+248/-0)
modules/debugging/NWGNUmoddumpio (+248/-0)
modules/debugging/README (+1/-0)
modules/debugging/config.m4 (+7/-0)
modules/debugging/mod_bucketeer.c (+187/-0)
modules/debugging/mod_bucketeer.dep (+53/-0)
modules/debugging/mod_bucketeer.dsp (+111/-0)
modules/debugging/mod_bucketeer.mak (+353/-0)
modules/debugging/mod_dumpio.c (+250/-0)
modules/debugging/mod_dumpio.dep (+50/-0)
modules/debugging/mod_dumpio.dsp (+111/-0)
modules/debugging/mod_dumpio.mak (+353/-0)
modules/echo/.indent.pro (+54/-0)
modules/echo/Makefile.in (+3/-0)
modules/echo/NWGNUmakefile (+257/-0)
modules/echo/config.m4 (+9/-0)
modules/echo/mod_echo.c (+218/-0)
modules/echo/mod_echo.dep (+56/-0)
modules/echo/mod_echo.dsp (+111/-0)
modules/echo/mod_echo.mak (+353/-0)
modules/examples/Makefile.in (+3/-0)
modules/examples/NWGNUcase_flt (+256/-0)
modules/examples/NWGNUcase_flt_in (+256/-0)
modules/examples/NWGNUexample_hooks (+257/-0)
modules/examples/NWGNUexample_ipc (+257/-0)
modules/examples/NWGNUmakefile (+257/-0)
modules/examples/README (+54/-0)
modules/examples/config.m4 (+9/-0)
modules/examples/mod_case_filter.c (+139/-0)
modules/examples/mod_case_filter.dep (+46/-0)
modules/examples/mod_case_filter.dsp (+111/-0)
modules/examples/mod_case_filter.mak (+353/-0)
modules/examples/mod_case_filter_in.c (+160/-0)
modules/examples/mod_case_filter_in.dep (+46/-0)
modules/examples/mod_case_filter_in.dsp (+111/-0)
modules/examples/mod_case_filter_in.mak (+353/-0)
modules/examples/mod_example_hooks.c (+1534/-0)
modules/examples/mod_example_hooks.dep (+62/-0)
modules/examples/mod_example_hooks.dsp (+111/-0)
modules/examples/mod_example_hooks.mak (+353/-0)
modules/examples/mod_example_ipc.c (+356/-0)
modules/examples/mod_example_ipc.dep (+56/-0)
modules/examples/mod_example_ipc.dsp (+111/-0)
modules/examples/mod_example_ipc.mak (+353/-0)
modules/experimental/.indent.pro (+54/-0)
modules/experimental/Makefile.in (+3/-0)
modules/experimental/NWGNUmakefile (+253/-0)
modules/experimental/config.m4 (+4/-0)
modules/filters/.indent.pro (+54/-0)
modules/filters/Makefile.in (+3/-0)
modules/filters/NWGNUcharsetl (+257/-0)
modules/filters/NWGNUdeflate (+279/-0)
modules/filters/NWGNUextfiltr (+248/-0)
modules/filters/NWGNUmakefile (+273/-0)
modules/filters/NWGNUmod_data (+248/-0)
modules/filters/NWGNUmod_filter (+248/-0)
modules/filters/NWGNUmod_request (+248/-0)
modules/filters/NWGNUmodbuffer (+256/-0)
modules/filters/NWGNUmodsed (+259/-0)
modules/filters/NWGNUproxyhtml (+261/-0)
modules/filters/NWGNUratelimit (+256/-0)
modules/filters/NWGNUreflector (+256/-0)
modules/filters/NWGNUreqtimeout (+256/-0)
modules/filters/NWGNUsubstitute (+256/-0)
modules/filters/NWGNUxml2enc (+258/-0)
modules/filters/config.m4 (+197/-0)
modules/filters/libsed.h (+172/-0)
modules/filters/mod_brotli.c (+592/-0)
modules/filters/mod_brotli.dep (+45/-0)
modules/filters/mod_brotli.dsp (+111/-0)
modules/filters/mod_brotli.mak (+353/-0)
modules/filters/mod_buffer.c (+353/-0)
modules/filters/mod_buffer.dep (+48/-0)
modules/filters/mod_buffer.dsp (+111/-0)
modules/filters/mod_buffer.mak (+353/-0)
modules/filters/mod_charset_lite.c (+1142/-0)
modules/filters/mod_charset_lite.dep (+60/-0)
modules/filters/mod_charset_lite.dsp (+111/-0)
modules/filters/mod_charset_lite.exp (+1/-0)
modules/filters/mod_charset_lite.mak (+353/-0)
modules/filters/mod_data.c (+255/-0)
modules/filters/mod_data.dep (+55/-0)
modules/filters/mod_data.dsp (+111/-0)
modules/filters/mod_data.mak (+353/-0)
modules/filters/mod_deflate.c (+1912/-0)
modules/filters/mod_deflate.dep (+52/-0)
modules/filters/mod_deflate.dsp (+111/-0)
modules/filters/mod_deflate.exp (+1/-0)
modules/filters/mod_deflate.mak (+353/-0)
modules/filters/mod_ext_filter.c (+956/-0)
modules/filters/mod_ext_filter.dep (+58/-0)
modules/filters/mod_ext_filter.dsp (+111/-0)
modules/filters/mod_ext_filter.exp (+1/-0)
modules/filters/mod_ext_filter.mak (+353/-0)
modules/filters/mod_filter.c (+767/-0)
modules/filters/mod_filter.dep (+50/-0)
modules/filters/mod_filter.dsp (+111/-0)
modules/filters/mod_filter.mak (+353/-0)
modules/filters/mod_include.c (+4236/-0)
modules/filters/mod_include.dep (+63/-0)
modules/filters/mod_include.dsp (+115/-0)
modules/filters/mod_include.exp (+1/-0)
modules/filters/mod_include.h (+120/-0)
modules/filters/mod_include.mak (+353/-0)
modules/filters/mod_proxy_html.c (+1329/-0)
modules/filters/mod_proxy_html.dep (+58/-0)
modules/filters/mod_proxy_html.dsp (+123/-0)
modules/filters/mod_proxy_html.mak (+352/-0)
modules/filters/mod_ratelimit.c (+356/-0)
modules/filters/mod_ratelimit.dep (+45/-0)
modules/filters/mod_ratelimit.dsp (+115/-0)
modules/filters/mod_ratelimit.h (+51/-0)
modules/filters/mod_ratelimit.mak (+353/-0)
modules/filters/mod_reflector.c (+226/-0)
modules/filters/mod_reflector.dep (+57/-0)
modules/filters/mod_reflector.dsp (+111/-0)
modules/filters/mod_reflector.mak (+353/-0)
modules/filters/mod_reqtimeout.c (+657/-0)
modules/filters/mod_reqtimeout.dep (+58/-0)
modules/filters/mod_reqtimeout.dsp (+111/-0)
modules/filters/mod_reqtimeout.mak (+353/-0)
modules/filters/mod_request.c (+397/-0)
modules/filters/mod_request.dep (+55/-0)
modules/filters/mod_request.dsp (+115/-0)
modules/filters/mod_request.mak (+353/-0)
modules/filters/mod_sed.c (+537/-0)
modules/filters/mod_sed.dep (+109/-0)
modules/filters/mod_sed.dsp (+135/-0)
modules/filters/mod_sed.mak (+380/-0)
modules/filters/mod_substitute.c (+730/-0)
modules/filters/mod_substitute.dep (+53/-0)
modules/filters/mod_substitute.dsp (+111/-0)
modules/filters/mod_substitute.mak (+353/-0)
modules/filters/mod_xml2enc.c (+631/-0)
modules/filters/mod_xml2enc.dep (+54/-0)
modules/filters/mod_xml2enc.dsp (+123/-0)
modules/filters/mod_xml2enc.h (+55/-0)
modules/filters/mod_xml2enc.mak (+352/-0)
modules/filters/regexp.c (+599/-0)
modules/filters/regexp.h (+112/-0)
modules/filters/sed.h (+61/-0)
modules/filters/sed0.c (+1026/-0)
modules/filters/sed1.c (+1020/-0)
modules/generators/.indent.pro (+54/-0)
modules/generators/Makefile.in (+3/-0)
modules/generators/NWGNUautoindex (+249/-0)
modules/generators/NWGNUinfo (+248/-0)
modules/generators/NWGNUmakefile (+249/-0)
modules/generators/NWGNUmod_asis (+249/-0)
modules/generators/NWGNUmod_cgi (+249/-0)
modules/generators/NWGNUstatus (+248/-0)
modules/generators/config5.m4 (+81/-0)
modules/generators/mod_asis.c (+128/-0)
modules/generators/mod_asis.dep (+56/-0)
modules/generators/mod_asis.dsp (+111/-0)
modules/generators/mod_asis.exp (+1/-0)
modules/generators/mod_asis.mak (+353/-0)
modules/generators/mod_autoindex.c (+2348/-0)
modules/generators/mod_autoindex.dep (+61/-0)
modules/generators/mod_autoindex.dsp (+111/-0)
modules/generators/mod_autoindex.exp (+1/-0)
modules/generators/mod_autoindex.mak (+353/-0)
modules/generators/mod_cgi.c (+1281/-0)
modules/generators/mod_cgi.dep (+64/-0)
modules/generators/mod_cgi.dsp (+115/-0)
modules/generators/mod_cgi.exp (+1/-0)
modules/generators/mod_cgi.h (+67/-0)
modules/generators/mod_cgi.mak (+353/-0)
modules/generators/mod_cgid.c (+1980/-0)
modules/generators/mod_cgid.exp (+1/-0)
modules/generators/mod_info.c (+1011/-0)
modules/generators/mod_info.dep (+66/-0)
modules/generators/mod_info.dsp (+111/-0)
modules/generators/mod_info.exp (+1/-0)
modules/generators/mod_info.mak (+353/-0)
modules/generators/mod_status.c (+1014/-0)
modules/generators/mod_status.dep (+60/-0)
modules/generators/mod_status.dsp (+111/-0)
modules/generators/mod_status.exp (+1/-0)
modules/generators/mod_status.h (+64/-0)
modules/generators/mod_status.mak (+353/-0)
modules/generators/mod_suexec.c (+139/-0)
modules/generators/mod_suexec.h (+33/-0)
modules/http/.indent.pro (+54/-0)
modules/http/Makefile.in (+3/-0)
modules/http/byterange_filter.c (+611/-0)
modules/http/chunk_filter.c (+196/-0)
modules/http/config.m4 (+20/-0)
modules/http/http_core.c (+328/-0)
modules/http/http_etag.c (+220/-0)
modules/http/http_filters.c (+1907/-0)
modules/http/http_protocol.c (+1690/-0)
modules/http/http_request.c (+843/-0)
modules/http/mod_mime.c (+1026/-0)
modules/http/mod_mime.dep (+55/-0)
modules/http/mod_mime.dsp (+111/-0)
modules/http/mod_mime.exp (+1/-0)
modules/http/mod_mime.mak (+353/-0)
modules/http2/.gitignore (+35/-0)
modules/http2/Makefile.in (+20/-0)
modules/http2/NWGNUmakefile (+246/-0)
modules/http2/NWGNUmod_http2 (+395/-0)
modules/http2/NWGNUproxyht2 (+288/-0)
modules/http2/README.h2 (+70/-0)
modules/http2/config2.m4 (+235/-0)
modules/http2/h2.h (+161/-0)
modules/http2/h2_alt_svc.c (+131/-0)
modules/http2/h2_alt_svc.h (+40/-0)
modules/http2/h2_bucket_beam.c (+1283/-0)
modules/http2/h2_bucket_beam.h (+406/-0)
modules/http2/h2_bucket_eos.c (+127/-0)
modules/http2/h2_bucket_eos.h (+32/-0)
modules/http2/h2_config.c (+678/-0)
modules/http2/h2_config.h (+104/-0)
modules/http2/h2_conn.c (+354/-0)
modules/http2/h2_conn.h (+77/-0)
modules/http2/h2_conn_io.c (+389/-0)
modules/http2/h2_conn_io.h (+77/-0)
modules/http2/h2_ctx.c (+121/-0)
modules/http2/h2_ctx.h (+78/-0)
modules/http2/h2_filter.c (+566/-0)
modules/http2/h2_filter.h (+73/-0)
modules/http2/h2_from_h1.c (+863/-0)
modules/http2/h2_from_h1.h (+50/-0)
modules/http2/h2_h2.c (+765/-0)
modules/http2/h2_h2.h (+79/-0)
modules/http2/h2_headers.c (+178/-0)
modules/http2/h2_headers.h (+77/-0)
modules/http2/h2_mplx.c (+1272/-0)
modules/http2/h2_mplx.h (+330/-0)
modules/http2/h2_ngn_shed.c (+392/-0)
modules/http2/h2_ngn_shed.h (+79/-0)
modules/http2/h2_private.h (+28/-0)
modules/http2/h2_proxy_session.c (+1584/-0)
modules/http2/h2_proxy_session.h (+128/-0)
modules/http2/h2_proxy_util.c (+1337/-0)
modules/http2/h2_proxy_util.h (+256/-0)
modules/http2/h2_push.c (+1060/-0)
modules/http2/h2_push.h (+120/-0)
modules/http2/h2_request.c (+338/-0)
modules/http2/h2_request.h (+48/-0)
modules/http2/h2_session.c (+2289/-0)
modules/http2/h2_session.h (+225/-0)
modules/http2/h2_stream.c (+1074/-0)
modules/http2/h2_stream.h (+306/-0)
modules/http2/h2_switch.c (+194/-0)
modules/http2/h2_switch.h (+30/-0)
modules/http2/h2_task.c (+762/-0)
modules/http2/h2_task.h (+127/-0)
modules/http2/h2_util.c (+2011/-0)
modules/http2/h2_util.h (+544/-0)
modules/http2/h2_version.h (+41/-0)
modules/http2/h2_workers.c (+383/-0)
modules/http2/h2_workers.h (+82/-0)
modules/http2/mod_http2.c (+387/-0)
modules/http2/mod_http2.dep (+1433/-0)
modules/http2/mod_http2.dsp (+195/-0)
modules/http2/mod_http2.h (+96/-0)
modules/http2/mod_http2.mak (+542/-0)
modules/http2/mod_proxy_http2.c (+674/-0)
modules/http2/mod_proxy_http2.dep (+208/-0)
modules/http2/mod_proxy_http2.dsp (+119/-0)
modules/http2/mod_proxy_http2.h (+21/-0)
modules/http2/mod_proxy_http2.mak (+427/-0)
modules/ldap/Makefile.in (+3/-0)
modules/ldap/NWGNUmakefile (+264/-0)
modules/ldap/README.ldap (+47/-0)
modules/ldap/config.m4 (+25/-0)
modules/ldap/mod_ldap.dep (+192/-0)
modules/ldap/mod_ldap.dsp (+127/-0)
modules/ldap/mod_ldap.mak (+371/-0)
modules/ldap/util_ldap.c (+3221/-0)
modules/ldap/util_ldap_cache.c (+467/-0)
modules/ldap/util_ldap_cache.h (+206/-0)
modules/ldap/util_ldap_cache_mgr.c (+901/-0)
modules/loggers/.indent.pro (+54/-0)
modules/loggers/Makefile.in (+3/-0)
modules/loggers/NWGNUforensic (+258/-0)
modules/loggers/NWGNUlogdebug (+258/-0)
modules/loggers/NWGNUmakefile (+247/-0)
modules/loggers/NWGNUmodlogio (+258/-0)
modules/loggers/config.m4 (+20/-0)
modules/loggers/mod_log_config.c (+1858/-0)
modules/loggers/mod_log_config.dep (+62/-0)
modules/loggers/mod_log_config.dsp (+111/-0)
modules/loggers/mod_log_config.exp (+1/-0)
modules/loggers/mod_log_config.h (+74/-0)
modules/loggers/mod_log_config.mak (+353/-0)
modules/loggers/mod_log_debug.c (+287/-0)
modules/loggers/mod_log_debug.dep (+54/-0)
modules/loggers/mod_log_debug.dsp (+111/-0)
modules/loggers/mod_log_debug.mak (+325/-0)
modules/loggers/mod_log_forensic.c (+289/-0)
modules/loggers/mod_log_forensic.dep (+53/-0)
modules/loggers/mod_log_forensic.dsp (+111/-0)
modules/loggers/mod_log_forensic.exp (+1/-0)
modules/loggers/mod_log_forensic.mak (+353/-0)
modules/loggers/mod_logio.c (+284/-0)
modules/loggers/mod_logio.dep (+59/-0)
modules/loggers/mod_logio.dsp (+111/-0)
modules/loggers/mod_logio.mak (+353/-0)
modules/lua/Makefile.in (+3/-0)
modules/lua/NWGNUmakefile (+287/-0)
modules/lua/README (+54/-0)
modules/lua/config.m4 (+121/-0)
modules/lua/docs/README (+12/-0)
modules/lua/docs/basic-configuration.txt (+141/-0)
modules/lua/docs/building-from-subversion.txt (+72/-0)
modules/lua/docs/running-developer-tests.txt (+16/-0)
modules/lua/docs/writing-handlers.txt (+49/-0)
modules/lua/lua_apr.c (+104/-0)
modules/lua/lua_apr.h (+36/-0)
modules/lua/lua_config.c (+277/-0)
modules/lua/lua_config.h (+31/-0)
modules/lua/lua_dbd.c (+843/-0)
modules/lua/lua_dbd.h (+66/-0)
modules/lua/lua_passwd.c (+178/-0)
modules/lua/lua_passwd.h (+90/-0)
modules/lua/lua_request.c (+3024/-0)
modules/lua/lua_request.h (+58/-0)
modules/lua/lua_vmprep.c (+551/-0)
modules/lua/lua_vmprep.h (+147/-0)
modules/lua/mod_lua.c (+2174/-0)
modules/lua/mod_lua.dep (+418/-0)
modules/lua/mod_lua.dsp (+163/-0)
modules/lua/mod_lua.h (+177/-0)
modules/lua/mod_lua.mak (+407/-0)
modules/lua/test/helpers.lua (+36/-0)
modules/lua/test/htdocs/config_tests.lua (+37/-0)
modules/lua/test/htdocs/filters.lua (+7/-0)
modules/lua/test/htdocs/find_me.txt (+1/-0)
modules/lua/test/htdocs/headers.lua (+6/-0)
modules/lua/test/htdocs/hooks.lua (+29/-0)
modules/lua/test/htdocs/other.lua (+21/-0)
modules/lua/test/htdocs/simple.lua (+4/-0)
modules/lua/test/htdocs/test.lua (+129/-0)
modules/lua/test/lib/kangaroo.lua (+19/-0)
modules/lua/test/moonunit.lua (+52/-0)
modules/lua/test/test.lua (+126/-0)
modules/lua/test/test_httpd.conf (+31/-0)
modules/mappers/.indent.pro (+54/-0)
modules/mappers/Makefile.in (+3/-0)
modules/mappers/NWGNUactions (+248/-0)
modules/mappers/NWGNUimagemap (+249/-0)
modules/mappers/NWGNUmakefile (+250/-0)
modules/mappers/NWGNUrewrite (+250/-0)
modules/mappers/NWGNUspeling (+248/-0)
modules/mappers/NWGNUuserdir (+249/-0)
modules/mappers/NWGNUvhost (+249/-0)
modules/mappers/config9.m4 (+19/-0)
modules/mappers/mod_actions.c (+230/-0)
modules/mappers/mod_actions.dep (+58/-0)
modules/mappers/mod_actions.dsp (+111/-0)
modules/mappers/mod_actions.exp (+1/-0)
modules/mappers/mod_actions.mak (+353/-0)
modules/mappers/mod_alias.c (+726/-0)
modules/mappers/mod_alias.dep (+51/-0)
modules/mappers/mod_alias.dsp (+111/-0)
modules/mappers/mod_alias.exp (+1/-0)
modules/mappers/mod_alias.mak (+353/-0)
modules/mappers/mod_dir.c (+417/-0)
modules/mappers/mod_dir.dep (+60/-0)
modules/mappers/mod_dir.dsp (+111/-0)
modules/mappers/mod_dir.exp (+1/-0)
modules/mappers/mod_dir.mak (+353/-0)
modules/mappers/mod_imagemap.c (+897/-0)
modules/mappers/mod_imagemap.dep (+60/-0)
modules/mappers/mod_imagemap.dsp (+111/-0)
modules/mappers/mod_imagemap.exp (+1/-0)
modules/mappers/mod_imagemap.mak (+353/-0)
modules/mappers/mod_negotiation.c (+3228/-0)
modules/mappers/mod_negotiation.dep (+58/-0)
modules/mappers/mod_negotiation.dsp (+111/-0)
modules/mappers/mod_negotiation.exp (+1/-0)
modules/mappers/mod_negotiation.mak (+353/-0)
modules/mappers/mod_rewrite.c (+5328/-0)
modules/mappers/mod_rewrite.dep (+65/-0)
modules/mappers/mod_rewrite.dsp (+111/-0)
modules/mappers/mod_rewrite.exp (+1/-0)
modules/mappers/mod_rewrite.h (+42/-0)
modules/mappers/mod_rewrite.mak (+353/-0)
modules/mappers/mod_speling.c (+533/-0)
modules/mappers/mod_speling.dep (+51/-0)
modules/mappers/mod_speling.dsp (+111/-0)
modules/mappers/mod_speling.exp (+1/-0)
modules/mappers/mod_speling.mak (+353/-0)
modules/mappers/mod_userdir.c (+390/-0)
modules/mappers/mod_userdir.dep (+46/-0)
modules/mappers/mod_userdir.dsp (+111/-0)
modules/mappers/mod_userdir.exp (+1/-0)
modules/mappers/mod_userdir.mak (+353/-0)
modules/mappers/mod_vhost_alias.c (+457/-0)
modules/mappers/mod_vhost_alias.dep (+50/-0)
modules/mappers/mod_vhost_alias.dsp (+111/-0)
modules/mappers/mod_vhost_alias.exp (+1/-0)
modules/mappers/mod_vhost_alias.mak (+353/-0)
modules/md/Makefile.in (+20/-0)
modules/md/config2.m4 (+297/-0)
modules/md/md.h (+290/-0)
modules/md/md_acme.c (+529/-0)
modules/md/md_acme.h (+267/-0)
modules/md/md_acme_acct.c (+670/-0)
modules/md/md_acme_acct.h (+49/-0)
modules/md/md_acme_authz.c (+723/-0)
modules/md/md_acme_authz.h (+104/-0)
modules/md/md_acme_drive.c (+1021/-0)
modules/md/md_core.c (+428/-0)
modules/md/md_crypt.c (+1315/-0)
modules/md/md_crypt.h (+135/-0)
modules/md/md_curl.c (+307/-0)
modules/md/md_curl.h (+24/-0)
modules/md/md_http.c (+245/-0)
modules/md/md_http.h (+102/-0)
modules/md/md_json.c (+1034/-0)
modules/md/md_json.h (+122/-0)
modules/md/md_jws.c (+106/-0)
modules/md/md_jws.h (+30/-0)
modules/md/md_log.c (+78/-0)
modules/md/md_log.h (+56/-0)
modules/md/md_reg.c (+996/-0)
modules/md/md_reg.h (+177/-0)
modules/md/md_store.c (+319/-0)
modules/md/md_store.h (+157/-0)
modules/md/md_store_fs.c (+883/-0)
modules/md/md_store_fs.h (+65/-0)
modules/md/md_util.c (+1254/-0)
modules/md/md_util.h (+148/-0)
modules/md/md_version.h (+42/-0)
modules/md/mod_md.c (+1442/-0)
modules/md/mod_md.dep (+5/-0)
modules/md/mod_md.dsp (+180/-0)
modules/md/mod_md.h (+50/-0)
modules/md/mod_md.mak (+520/-0)
modules/md/mod_md_config.c (+950/-0)
modules/md/mod_md_config.h (+102/-0)
modules/md/mod_md_os.c (+89/-0)
modules/md/mod_md_os.h (+37/-0)
modules/md/mod_md_private.h (+24/-0)
modules/metadata/.indent.pro (+54/-0)
modules/metadata/Makefile.in (+3/-0)
modules/metadata/NWGNUcernmeta (+248/-0)
modules/metadata/NWGNUexpires (+248/-0)
modules/metadata/NWGNUheaders (+249/-0)
modules/metadata/NWGNUmakefile (+254/-0)
modules/metadata/NWGNUmimemagi (+248/-0)
modules/metadata/NWGNUmodident (+248/-0)
modules/metadata/NWGNUmodversion (+248/-0)
modules/metadata/NWGNUremoteip (+248/-0)
modules/metadata/NWGNUuniqueid (+257/-0)
modules/metadata/NWGNUusertrk (+248/-0)
modules/metadata/config.m4 (+24/-0)
modules/metadata/mod_cern_meta.c (+371/-0)
modules/metadata/mod_cern_meta.dep (+55/-0)
modules/metadata/mod_cern_meta.dsp (+111/-0)
modules/metadata/mod_cern_meta.exp (+1/-0)
modules/metadata/mod_cern_meta.mak (+353/-0)
modules/metadata/mod_env.c (+190/-0)
modules/metadata/mod_env.dep (+47/-0)
modules/metadata/mod_env.dsp (+111/-0)
modules/metadata/mod_env.exp (+1/-0)
modules/metadata/mod_env.mak (+353/-0)
modules/metadata/mod_expires.c (+571/-0)
modules/metadata/mod_expires.dep (+54/-0)
modules/metadata/mod_expires.dsp (+111/-0)
modules/metadata/mod_expires.exp (+1/-0)
modules/metadata/mod_expires.mak (+353/-0)
modules/metadata/mod_headers.c (+1020/-0)
modules/metadata/mod_headers.dep (+57/-0)
modules/metadata/mod_headers.dsp (+111/-0)
modules/metadata/mod_headers.exp (+1/-0)
modules/metadata/mod_headers.mak (+353/-0)
modules/metadata/mod_ident.c (+344/-0)
modules/metadata/mod_ident.dep (+52/-0)
modules/metadata/mod_ident.dsp (+111/-0)
modules/metadata/mod_ident.exp (+1/-0)
modules/metadata/mod_ident.mak (+353/-0)
modules/metadata/mod_mime_magic.c (+2471/-0)
modules/metadata/mod_mime_magic.dep (+58/-0)
modules/metadata/mod_mime_magic.dsp (+111/-0)
modules/metadata/mod_mime_magic.exp (+1/-0)
modules/metadata/mod_mime_magic.mak (+353/-0)
modules/metadata/mod_remoteip.c (+1218/-0)
modules/metadata/mod_remoteip.dep (+53/-0)
modules/metadata/mod_remoteip.dsp (+111/-0)
modules/metadata/mod_remoteip.mak (+353/-0)
modules/metadata/mod_setenvif.c (+648/-0)
modules/metadata/mod_setenvif.dep (+56/-0)
modules/metadata/mod_setenvif.dsp (+111/-0)
modules/metadata/mod_setenvif.exp (+1/-0)
modules/metadata/mod_setenvif.mak (+353/-0)
modules/metadata/mod_unique_id.c (+316/-0)
modules/metadata/mod_unique_id.dep (+50/-0)
modules/metadata/mod_unique_id.dsp (+111/-0)
modules/metadata/mod_unique_id.exp (+1/-0)
modules/metadata/mod_unique_id.mak (+353/-0)
modules/metadata/mod_usertrack.c (+459/-0)
modules/metadata/mod_usertrack.dep (+51/-0)
modules/metadata/mod_usertrack.dsp (+111/-0)
modules/metadata/mod_usertrack.exp (+1/-0)
modules/metadata/mod_usertrack.mak (+353/-0)
modules/metadata/mod_version.c (+313/-0)
modules/metadata/mod_version.dep (+45/-0)
modules/metadata/mod_version.dsp (+111/-0)
modules/metadata/mod_version.exp (+1/-0)
modules/metadata/mod_version.mak (+353/-0)
modules/proxy/.indent.pro (+58/-0)
modules/proxy/CHANGES (+223/-0)
modules/proxy/Makefile.in (+4/-0)
modules/proxy/NWGNUmakefile (+259/-0)
modules/proxy/NWGNUproxy (+337/-0)
modules/proxy/NWGNUproxyajp (+264/-0)
modules/proxy/NWGNUproxybalancer (+260/-0)
modules/proxy/NWGNUproxycon (+251/-0)
modules/proxy/NWGNUproxyexpress (+256/-0)
modules/proxy/NWGNUproxyfcgi (+261/-0)
modules/proxy/NWGNUproxyftp (+260/-0)
modules/proxy/NWGNUproxyhcheck (+254/-0)
modules/proxy/NWGNUproxyhtp (+260/-0)
modules/proxy/NWGNUproxylbm_busy (+250/-0)
modules/proxy/NWGNUproxylbm_hb (+251/-0)
modules/proxy/NWGNUproxylbm_req (+251/-0)
modules/proxy/NWGNUproxylbm_traf (+251/-0)
modules/proxy/NWGNUproxyscgi (+260/-0)
modules/proxy/NWGNUproxywstunnel (+250/-0)
modules/proxy/ajp.h (+520/-0)
modules/proxy/ajp_header.c (+885/-0)
modules/proxy/ajp_header.h (+195/-0)
modules/proxy/ajp_link.c (+115/-0)
modules/proxy/ajp_msg.c (+641/-0)
modules/proxy/ajp_utils.c (+137/-0)
modules/proxy/balancers/Makefile.in (+3/-0)
modules/proxy/balancers/config2.m4 (+8/-0)
modules/proxy/balancers/mod_lbmethod_bybusyness.c (+161/-0)
modules/proxy/balancers/mod_lbmethod_bybusyness.dep (+76/-0)
modules/proxy/balancers/mod_lbmethod_bybusyness.dsp (+123/-0)
modules/proxy/balancers/mod_lbmethod_bybusyness.mak (+408/-0)
modules/proxy/balancers/mod_lbmethod_byrequests.c (+201/-0)
modules/proxy/balancers/mod_lbmethod_byrequests.dep (+76/-0)
modules/proxy/balancers/mod_lbmethod_byrequests.dsp (+123/-0)
modules/proxy/balancers/mod_lbmethod_byrequests.mak (+408/-0)
modules/proxy/balancers/mod_lbmethod_bytraffic.c (+170/-0)
modules/proxy/balancers/mod_lbmethod_bytraffic.dep (+76/-0)
modules/proxy/balancers/mod_lbmethod_bytraffic.dsp (+123/-0)
modules/proxy/balancers/mod_lbmethod_bytraffic.mak (+408/-0)
modules/proxy/balancers/mod_lbmethod_heartbeat.c (+467/-0)
modules/proxy/balancers/mod_lbmethod_heartbeat.dep (+77/-0)
modules/proxy/balancers/mod_lbmethod_heartbeat.dsp (+123/-0)
modules/proxy/balancers/mod_lbmethod_heartbeat.mak (+408/-0)
modules/proxy/config.m4 (+79/-0)
modules/proxy/libproxy.exp (+1/-0)
modules/proxy/mod_proxy.c (+3080/-0)
modules/proxy/mod_proxy.dep (+153/-0)
modules/proxy/mod_proxy.dsp (+127/-0)
modules/proxy/mod_proxy.h (+1246/-0)
modules/proxy/mod_proxy.mak (+361/-0)
modules/proxy/mod_proxy_ajp.c (+829/-0)
modules/proxy/mod_proxy_ajp.dep (+356/-0)
modules/proxy/mod_proxy_ajp.dsp (+151/-0)
modules/proxy/mod_proxy_ajp.mak (+416/-0)
modules/proxy/mod_proxy_balancer.c (+1936/-0)
modules/proxy/mod_proxy_balancer.dep (+76/-0)
modules/proxy/mod_proxy_balancer.dsp (+123/-0)
modules/proxy/mod_proxy_balancer.mak (+380/-0)
modules/proxy/mod_proxy_connect.c (+486/-0)
modules/proxy/mod_proxy_connect.dep (+73/-0)
modules/proxy/mod_proxy_connect.dsp (+123/-0)
modules/proxy/mod_proxy_connect.mak (+380/-0)
modules/proxy/mod_proxy_express.c (+221/-0)
modules/proxy/mod_proxy_express.dep (+74/-0)
modules/proxy/mod_proxy_express.dsp (+123/-0)
modules/proxy/mod_proxy_express.mak (+380/-0)
modules/proxy/mod_proxy_fcgi.c (+1200/-0)
modules/proxy/mod_proxy_fcgi.dep (+75/-0)
modules/proxy/mod_proxy_fcgi.dsp (+123/-0)
modules/proxy/mod_proxy_fcgi.mak (+380/-0)
modules/proxy/mod_proxy_fdpass.c (+241/-0)
modules/proxy/mod_proxy_fdpass.h (+41/-0)
modules/proxy/mod_proxy_ftp.c (+2125/-0)
modules/proxy/mod_proxy_ftp.dep (+74/-0)
modules/proxy/mod_proxy_ftp.dsp (+123/-0)
modules/proxy/mod_proxy_ftp.mak (+380/-0)
modules/proxy/mod_proxy_hcheck.c (+1225/-0)
modules/proxy/mod_proxy_hcheck.dep (+5/-0)
modules/proxy/mod_proxy_hcheck.dsp (+123/-0)
modules/proxy/mod_proxy_hcheck.mak (+380/-0)
modules/proxy/mod_proxy_http.c (+2043/-0)
modules/proxy/mod_proxy_http.dep (+73/-0)
modules/proxy/mod_proxy_http.dsp (+123/-0)
modules/proxy/mod_proxy_http.mak (+380/-0)
modules/proxy/mod_proxy_scgi.c (+674/-0)
modules/proxy/mod_proxy_scgi.dep (+75/-0)
modules/proxy/mod_proxy_scgi.dsp (+123/-0)
modules/proxy/mod_proxy_scgi.mak (+380/-0)
modules/proxy/mod_proxy_uwsgi.c (+551/-0)
modules/proxy/mod_proxy_uwsgi.dep (+75/-0)
modules/proxy/mod_proxy_uwsgi.dsp (+123/-0)
modules/proxy/mod_proxy_uwsgi.mak (+380/-0)
modules/proxy/mod_proxy_wstunnel.c (+391/-0)
modules/proxy/mod_proxy_wstunnel.dep (+73/-0)
modules/proxy/mod_proxy_wstunnel.dsp (+123/-0)
modules/proxy/mod_proxy_wstunnel.mak (+380/-0)
modules/proxy/proxy_util.c (+3889/-0)
modules/proxy/proxy_util.h (+45/-0)
modules/proxy/scgi.h (+36/-0)
modules/session/Makefile.in (+4/-0)
modules/session/NWGNUmakefile (+257/-0)
modules/session/NWGNUsession (+254/-0)
modules/session/NWGNUsession_cookie (+253/-0)
modules/session/NWGNUsession_crypto (+255/-0)
modules/session/NWGNUsession_dbd (+253/-0)
modules/session/config.m4 (+68/-0)
modules/session/mod_session.c (+671/-0)
modules/session/mod_session.dep (+56/-0)
modules/session/mod_session.dsp (+115/-0)
modules/session/mod_session.h (+186/-0)
modules/session/mod_session.mak (+353/-0)
modules/session/mod_session_cookie.c (+284/-0)
modules/session/mod_session_cookie.dep (+49/-0)
modules/session/mod_session_cookie.dsp (+111/-0)
modules/session/mod_session_cookie.mak (+381/-0)
modules/session/mod_session_crypto.c (+805/-0)
modules/session/mod_session_crypto.dep (+57/-0)
modules/session/mod_session_crypto.dsp (+111/-0)
modules/session/mod_session_crypto.mak (+381/-0)
modules/session/mod_session_dbd.c (+640/-0)
modules/session/mod_session_dbd.dep (+60/-0)
modules/session/mod_session_dbd.dsp (+111/-0)
modules/session/mod_session_dbd.mak (+409/-0)
modules/slotmem/Makefile.in (+3/-0)
modules/slotmem/NWGNUmakefile (+246/-0)
modules/slotmem/NWGNUslotmem_plain (+250/-0)
modules/slotmem/NWGNUslotmem_shm (+250/-0)
modules/slotmem/config.m4 (+10/-0)
modules/slotmem/mod_slotmem_plain.c (+343/-0)
modules/slotmem/mod_slotmem_plain.dep (+51/-0)
modules/slotmem/mod_slotmem_plain.dsp (+111/-0)
modules/slotmem/mod_slotmem_plain.mak (+353/-0)
modules/slotmem/mod_slotmem_shm.c (+880/-0)
modules/slotmem/mod_slotmem_shm.dep (+57/-0)
modules/slotmem/mod_slotmem_shm.dsp (+111/-0)
modules/slotmem/mod_slotmem_shm.mak (+353/-0)
modules/ssl/Makefile.in (+20/-0)
modules/ssl/NWGNUmakefile (+327/-0)
modules/ssl/README (+106/-0)
modules/ssl/README.dsov.fig (+346/-0)
modules/ssl/README.dsov.ps (+1138/-0)
modules/ssl/config.m4 (+57/-0)
modules/ssl/mod_ssl.c (+760/-0)
modules/ssl/mod_ssl.dep (+1086/-0)
modules/ssl/mod_ssl.dsp (+195/-0)
modules/ssl/mod_ssl.h (+91/-0)
modules/ssl/mod_ssl.mak (+500/-0)
modules/ssl/mod_ssl_openssl.h (+73/-0)
modules/ssl/ssl_engine_config.c (+2067/-0)
modules/ssl/ssl_engine_init.c (+2147/-0)
modules/ssl/ssl_engine_io.c (+2217/-0)
modules/ssl/ssl_engine_kernel.c (+2499/-0)
modules/ssl/ssl_engine_log.c (+238/-0)
modules/ssl/ssl_engine_mutex.c (+111/-0)
modules/ssl/ssl_engine_ocsp.c (+304/-0)
modules/ssl/ssl_engine_pphrase.c (+621/-0)
modules/ssl/ssl_engine_rand.c (+177/-0)
modules/ssl/ssl_engine_vars.c (+1252/-0)
modules/ssl/ssl_private.h (+1083/-0)
modules/ssl/ssl_scache.c (+239/-0)
modules/ssl/ssl_util.c (+471/-0)
modules/ssl/ssl_util_ocsp.c (+419/-0)
modules/ssl/ssl_util_ssl.c (+538/-0)
modules/ssl/ssl_util_ssl.h (+80/-0)
modules/ssl/ssl_util_stapling.c (+873/-0)
modules/test/.indent.pro (+54/-0)
modules/test/Makefile.in (+3/-0)
modules/test/NWGNUmakefile (+257/-0)
modules/test/NWGNUoptfnexport (+256/-0)
modules/test/NWGNUoptfnimport (+256/-0)
modules/test/NWGNUopthookexport (+256/-0)
modules/test/NWGNUopthookimport (+256/-0)
modules/test/README (+1/-0)
modules/test/config.m4 (+13/-0)
modules/test/mod_dialup.c (+306/-0)
modules/test/mod_optional_fn_export.c (+48/-0)
modules/test/mod_optional_fn_export.h (+19/-0)
modules/test/mod_optional_fn_import.c (+55/-0)
modules/test/mod_optional_hook_export.c (+44/-0)
modules/test/mod_optional_hook_export.h (+24/-0)
modules/test/mod_optional_hook_import.c (+45/-0)
os/.indent.pro (+54/-0)
os/Makefile.in (+4/-0)
os/bs2000/ebcdic.c (+210/-0)
os/bs2000/ebcdic.h (+33/-0)
os/bs2000/os.c (+136/-0)
os/bs2000/os.h (+40/-0)
os/config.m4 (+26/-0)
os/netware/modules.c (+117/-0)
os/netware/netware_config_layout.h (+31/-0)
os/netware/os.h (+57/-0)
os/netware/pre_nw.h (+70/-0)
os/netware/util_nw.c (+112/-0)
os/os2/Makefile.in (+5/-0)
os/os2/config.m4 (+3/-0)
os/os2/core.mk (+7/-0)
os/os2/core_header.def (+19/-0)
os/os2/os.h (+40/-0)
os/os2/util_os2.c (+39/-0)
os/unix/Makefile.in (+5/-0)
os/unix/config.m4 (+7/-0)
os/unix/os.h (+52/-0)
os/unix/unixd.c (+714/-0)
os/unix/unixd.h (+142/-0)
os/win32/BaseAddr.ref (+134/-0)
os/win32/Makefile.in (+5/-0)
os/win32/ap_regkey.c (+642/-0)
os/win32/modules.c (+56/-0)
os/win32/os.h (+139/-0)
os/win32/util_win32.c (+148/-0)
os/win32/win32_config_layout.h (+31/-0)
server/.indent.pro (+54/-0)
server/Makefile.in (+105/-0)
server/NWGNUmakefile (+261/-0)
server/buildmark.c (+29/-0)
server/config.c (+2728/-0)
server/config.m4 (+19/-0)
server/connection.c (+228/-0)
server/core.c (+5459/-0)
server/core_filters.c (+889/-0)
server/eoc_bucket.c (+55/-0)
server/eor_bucket.c (+102/-0)
server/error_bucket.c (+77/-0)
server/gen_test_char.c (+173/-0)
server/gen_test_char.dep (+7/-0)
server/gen_test_char.dsp (+94/-0)
server/gen_test_char.mak (+234/-0)
server/listen.c (+938/-0)
server/log.c (+1956/-0)
server/main.c (+850/-0)
server/mpm/MPM.NAMING (+14/-0)
server/mpm/Makefile.in (+4/-0)
server/mpm/config.m4 (+128/-0)
server/mpm/config2.m4 (+89/-0)
server/mpm/event/Makefile.in (+1/-0)
server/mpm/event/config.m4 (+15/-0)
server/mpm/event/config3.m4 (+7/-0)
server/mpm/event/event.c (+3874/-0)
server/mpm/event/mpm_default.h (+56/-0)
server/mpm/mpmt_os2/Makefile.in (+1/-0)
server/mpm/mpmt_os2/config.m4 (+10/-0)
server/mpm/mpmt_os2/config5.m4 (+3/-0)
server/mpm/mpmt_os2/mpm_default.h (+57/-0)
server/mpm/mpmt_os2/mpmt_os2.c (+614/-0)
server/mpm/mpmt_os2/mpmt_os2_child.c (+488/-0)
server/mpm/netware/mpm_default.h (+78/-0)
server/mpm/netware/mpm_netware.c (+1363/-0)
server/mpm/prefork/Makefile.in (+1/-0)
server/mpm/prefork/config.m4 (+7/-0)
server/mpm/prefork/config3.m4 (+1/-0)
server/mpm/prefork/mpm_default.h (+51/-0)
server/mpm/prefork/prefork.c (+1513/-0)
server/mpm/winnt/Makefile.in (+1/-0)
server/mpm/winnt/child.c (+1266/-0)
server/mpm/winnt/config.m4 (+10/-0)
server/mpm/winnt/config3.m4 (+2/-0)
server/mpm/winnt/mpm_default.h (+60/-0)
server/mpm/winnt/mpm_winnt.c (+1785/-0)
server/mpm/winnt/mpm_winnt.h (+96/-0)
server/mpm/winnt/nt_eventlog.c (+171/-0)
server/mpm/winnt/service.c (+1241/-0)
server/mpm/worker/Makefile.in (+2/-0)
server/mpm/worker/config.m4 (+11/-0)
server/mpm/worker/config3.m4 (+5/-0)
server/mpm/worker/mpm_default.h (+55/-0)
server/mpm/worker/worker.c (+2378/-0)
server/mpm_common.c (+571/-0)
server/mpm_fdqueue.c (+530/-0)
server/mpm_fdqueue.h (+110/-0)
server/mpm_unix.c (+1107/-0)
server/protocol.c (+2399/-0)
server/provider.c (+197/-0)
server/request.c (+2511/-0)
server/scoreboard.c (+672/-0)
server/util.c (+3309/-0)
server/util_cfgtree.c (+46/-0)
server/util_charset.c (+28/-0)
server/util_cookies.c (+290/-0)
server/util_debug.c (+236/-0)
server/util_ebcdic.c (+117/-0)
server/util_expr_eval.c (+1822/-0)
server/util_expr_parse.c (+2130/-0)
server/util_expr_parse.h (+104/-0)
server/util_expr_parse.y (+217/-0)
server/util_expr_private.h (+141/-0)
server/util_expr_scan.c (+2669/-0)
server/util_expr_scan.l (+400/-0)
server/util_fcgi.c (+290/-0)
server/util_filter.c (+732/-0)
server/util_md5.c (+166/-0)
server/util_mutex.c (+561/-0)
server/util_pcre.c (+343/-0)
server/util_regex.c (+210/-0)
server/util_script.c (+900/-0)
server/util_time.c (+306/-0)
server/util_xml.c (+140/-0)
server/vhost.c (+1267/-0)
srclib/Makefile.in (+5/-0)
support/.indent.pro (+54/-0)
support/Makefile.in (+89/-0)
support/NWGNUab (+330/-0)
support/NWGNUhtcacheclean (+253/-0)
support/NWGNUhtdbm (+252/-0)
support/NWGNUhtdigest (+251/-0)
support/NWGNUhtpasswd (+252/-0)
support/NWGNUhttxt2dbm (+251/-0)
support/NWGNUlogres (+258/-0)
support/NWGNUmakefile (+51/-0)
support/NWGNUrotlogs (+250/-0)
support/README (+65/-0)
support/SHA1/README.sha1 (+34/-0)
support/SHA1/convert-sha1.pl (+36/-0)
support/SHA1/htpasswd-sha1.pl (+22/-0)
support/SHA1/ldif-sha1.example (+19/-0)
support/ab.c (+2623/-0)
support/ab.dep (+37/-0)
support/ab.dsp (+106/-0)
support/ab.mak (+317/-0)
support/abs.dep (+37/-0)
support/abs.dsp (+144/-0)
support/abs.mak (+374/-0)
support/apachectl.in (+106/-0)
support/apxs.in (+791/-0)
support/check_forensic (+51/-0)
support/checkgid.c (+110/-0)
support/config.m4 (+151/-0)
support/dbmmanage.in (+312/-0)
support/envvars-std.in (+28/-0)
support/fcgistarter.c (+220/-0)
support/fcgistarter.dep (+29/-0)
support/fcgistarter.dsp (+106/-0)
support/fcgistarter.mak (+317/-0)
support/htcacheclean.c (+1829/-0)
support/htcacheclean.dep (+37/-0)
support/htcacheclean.dsp (+106/-0)
support/htcacheclean.mak (+317/-0)
support/htdbm.c (+472/-0)
support/htdbm.dep (+58/-0)
support/htdbm.dsp (+110/-0)
support/htdbm.mak (+326/-0)
support/htdigest.c (+303/-0)
support/htdigest.dep (+27/-0)
support/htdigest.dsp (+106/-0)
support/htdigest.mak (+317/-0)
support/htpasswd.c (+524/-0)
support/htpasswd.dep (+57/-0)
support/htpasswd.dsp (+110/-0)
support/htpasswd.mak (+326/-0)
support/httxt2dbm.c (+335/-0)
support/httxt2dbm.dep (+26/-0)
support/httxt2dbm.dsp (+106/-0)
support/httxt2dbm.mak (+317/-0)
support/list_hooks.pl (+101/-0)
support/log_server_status.in (+76/-0)
support/logresolve.c (+329/-0)
support/logresolve.dep (+26/-0)
support/logresolve.dsp (+106/-0)
support/logresolve.mak (+317/-0)
support/logresolve.pl.in (+225/-0)
support/passwd_common.c (+344/-0)
support/passwd_common.h (+128/-0)
support/phf_abuse_log.cgi.in (+38/-0)
support/rotatelogs.c (+753/-0)
support/rotatelogs.dep (+28/-0)
support/rotatelogs.dsp (+106/-0)
support/rotatelogs.mak (+317/-0)
support/split-logfile.in (+69/-0)
support/suexec.c (+652/-0)
support/suexec.h (+109/-0)
support/win32/ApacheMonitor.c (+1671/-0)
support/win32/ApacheMonitor.dep (+18/-0)
support/win32/ApacheMonitor.dsp (+143/-0)
support/win32/ApacheMonitor.h (+78/-0)
support/win32/ApacheMonitor.mak (+309/-0)
support/win32/ApacheMonitor.manifest (+10/-0)
support/win32/ApacheMonitor.rc (+103/-0)
support/win32/wintty.c (+374/-0)
support/win32/wintty.dep (+5/-0)
support/win32/wintty.dsp (+106/-0)
support/win32/wintty.mak (+317/-0)
test/.indent.pro (+54/-0)
test/Makefile.in (+20/-0)
test/README (+3/-0)
test/check_chunked (+58/-0)
test/cls.c (+182/-0)
test/make_sni.sh (+396/-0)
test/tcpdumpscii.txt (+50/-0)
test/test-writev.c (+101/-0)
test/test_find.c (+78/-0)
test/test_limits.c (+200/-0)
test/test_parser.c (+75/-0)
test/test_select.c (+46/-0)
test/time-sem.c (+591/-0)
Reviewer Review Type Date Requested Status
Christian Ehrhardt  (community) Approve
Canonical Server Pending
Review via email: mp+345796@code.launchpad.net

Commit message

  * d/control, d/rules: Don't build libapache2-mod-proxy-uwsgi and
    libapache2-mod-md until we figure out their transitions. libapache2-mod-md
    in particular is problematic because that makes apache2-bin pull in
    libcurl4 which cannot be coinstalled with libcurl3. That situation breaks
    the installation of libapache2-mod-shib2. See
    https://bugs.launchpad.net/ubuntu/+source/apache2/+bug/1770242/comments/1
    for details.
    - Don't ship md.load and remove build-requires that were added because of
      mod-md (see
      https://salsa.debian.org/apache-team/apache2/commit/b9d37f2a96da2fd69bf6985a8b0821a6c8950628)
    - Remove proxy_uwsgi.load as we are not building it for now (see
      https://salsa.debian.org/apache-team/apache2/commit/4e3168562d75ce398b91f1642b3211b857a9e540)

Description of the change

* d/control, d/rules: Don't build libapache2-mod-proxy-uwsgi and
    libapache2-mod-md until we figure out their transitions. libapache2-mod-md
    in particular is problematic because that makes apache2-bin pull in
    libcurl4 which cannot be coinstalled with libcurl3. That situation breaks
    the installation of libapache2-mod-shib2. See
    https://bugs.launchpad.net/ubuntu/+source/apache2/+bug/1770242/comments/1
    for details.
    - Don't ship md.load and remove build-requires that were added because of
      mod-md (see
      https://salsa.debian.org/apache-team/apache2/commit/b9d37f2a96da2fd69bf6985a8b0821a6c8950628)
    - Remove proxy_uwsgi.load as we are not building it for now (see
      https://salsa.debian.org/apache-team/apache2/commit/4e3168562d75ce398b91f1642b3211b857a9e540)

The bottom line of the problem is:
libcurl3: is libcurl4 built with openssl 1.0
libcurl4: is libcurl4 built with openssl 1.1
bundled mod_md.so (in package apache2-bin): pulls in libcurl4
libapache2-mod-shib2: pulls in libxmltooling7 which pulls in libcurl3 (because it needs openssl 1.0)
libcurl3 conflicts with libcurl4, because both provide libcurl.so.4

As a result, libapache2-mod-shib2 conflicts with apache2-bin, and this is what failed migration.

This MP makes the behavior be the same as in current cosmic, where, to install libapache2-mod-shib2, you need to explicitly also include libcurl3:

sudo apt install apache2 libapache2-mod-md libapache2-mod-shib2 libcurl3

This will remove curl, libcurl4, pollinate and ubuntu-server. The installation itself works because apache2-bin is not bundling mod_md anymore, and therefore is not pulling in libcurl4 and that allows libapache2-mod-shib2 to be installed.

libapache2-mod-md (it has its own package) in the cosmic archive only links with libcurl-gnutls.so.4 (from libcurl3-gnutls) and libgnutls.so.30 (from libgnutls30).

PPA with test packages: https://launchpad.net/~ahasenack/+archive/ubuntu/fix-apache-migration (ppa:ahasenack/fix-apache-migration)

To post a comment you must log in.
Revision history for this message
Christian Ehrhardt  (paelzer) wrote :

Hi,
I realized I might have thought too much on unblocking your apache yesterday.
After our mail I relaized this is not a major change in apache but would "just" change libxmltooling7 if we find a way to do so, therefore:

1. as we found this is a pure libxmltooling7 issue. And the right fix seems to get this to (be
   able) use libcurl4.
   We are early in the cycle, if there is a chance to resolve this we might skip the back and
   forth on apache.

2. the MP here LGTM and might be needed if we find no way for libxmltooling7 soon.
   But since this will add some crazy brekas/replaces that we have to carry for a while we might
   wait a bit before we consider pushing this.

Have you looked at libxmltooling7 if there is any chance to make it use the new curl?
If there is then while this MP seems correct (I haven't tested yet, just reviewed) we might prefer to fix libxmltooling7 and then just retrigger the migration of apache2 as-is.

P.S. have we found why LP makes crazy diffs like the inline comment below (git view is good btw)?

Revision history for this message
Andreas Hasenack (ahasenack) wrote :

Chasing down libxmltooling7 with openssl 1.1 is not worth it at this time, according to slangasek.

Also, to help understand the libcurl confusion, I think this simple statement helps:

libcurl3: curl4 with openssl 1.0
libcurl4: curl4 with openssl 1.1

<slangasek> the renaming of the libcurl3 binary package to libcurl4 *means* that it's built with openss1.1; that is the ABI change

With that in mind, I think these are the options we have:
a) this MP, which doesn't build libapache2-mod-md (which is what pulls in libcurl4 as a dependency of apache2-bin)
b) building the *bundled* mod-md with openssl 1.0 (nope)
c) building the *bundled* mod-md and shipping it as a separate package.

I think (a) gets us over this hurdle, and gives us time to think about a proper solution
(b) is not doable, as apache2 bundles mod_ssl and we definitely want that with openssl 1.1 (not 1.0).

(c) is doable, I could test that.

All mean a delta with debian, (c) being the biggest one probably as it means a populated package, with a <pkg>.install file, postinst, postrm (it's an apache module that we have to take care of), etc.

This MP lets the necessary packages be installed just like they are in cosmic right now. In order to install libapache2-mod-shib2, one has to specify "libcurl3" in the command line as well and cope with the removal of curl, ubuntu-server and a few others.

Revision history for this message
Christian Ehrhardt  (paelzer) wrote :

This s****, but I don't have to tell you that :-/
I'm +1 on the current approach as interim solution, but we should immediately add a card to revisit that later this cycle (to hopefully catch up on what changed in the related packages and find a solution then). If nothing else comes up lets discuss with Foundations on the next sprint.

I'd ask you to (but not stop you on) shorten the salsa git url's in the changelog to fit in 80 chars. Especially since shorter e.g. 8 char sha's work just as well.

review: Approve
a171e1f... by Andreas Hasenack

Make it fit in 80 chars

Revision history for this message
Andreas Hasenack (ahasenack) wrote :

Done and pushed, please add the upload tag for a171e1f929d63d9b9bb12e04ccbbf56fa0c68f8f and I can then upload.

Revision history for this message
Christian Ehrhardt  (paelzer) wrote :

upload/2.4.33-3ubuntu2 tagged and pushed on a171e1f929d63d9b9bb12e04ccbbf56fa0c68f8f

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/debian/changelog b/debian/changelog
2index a0e58d0..46f739d 100644
3--- a/debian/changelog
4+++ b/debian/changelog
5@@ -1,3 +1,20 @@
6+apache2 (2.4.33-3ubuntu2) cosmic; urgency=medium
7+
8+ * d/control, d/rules: Don't build libapache2-mod-proxy-uwsgi and
9+ libapache2-mod-md until we figure out their transitions. libapache2-mod-md
10+ in particular is problematic because that makes apache2-bin pull in
11+ libcurl4 which cannot be coinstalled with libcurl3. That situation breaks
12+ the installation of libapache2-mod-shib2. See
13+ https://bugs.launchpad.net/ubuntu/+source/apache2/+bug/1770242/comments/1
14+ for details.
15+ - Don't ship md.load and remove build-requires that were added because of
16+ mod-md (see
17+ https://salsa.debian.org/apache-team/apache2/commit/b9d37f2a96da2fd69bf)
18+ - Remove proxy_uwsgi.load as we are not building it for now (see
19+ https://salsa.debian.org/apache-team/apache2/commit/4e3168562d75ce398b9)
20+
21+ -- Andreas Hasenack <andreas@canonical.com> Thu, 17 May 2018 14:46:19 +0000
22+
23 apache2 (2.4.33-3ubuntu1) cosmic; urgency=medium
24
25 * Merge with Debian unstable (LP: #1770242). Remaining changes:
26diff --git a/debian/config-dir/mods-available/md.load b/debian/config-dir/mods-available/md.load
27deleted file mode 100644
28index 812a6a6..0000000
29--- a/debian/config-dir/mods-available/md.load
30+++ /dev/null
31@@ -1 +0,0 @@
32-LoadModule md_module /usr/lib/apache2/modules/mod_md.so
33diff --git a/debian/config-dir/mods-available/proxy_uwsgi.load b/debian/config-dir/mods-available/proxy_uwsgi.load
34deleted file mode 100644
35index 79ebd42..0000000
36--- a/debian/config-dir/mods-available/proxy_uwsgi.load
37+++ /dev/null
38@@ -1,2 +0,0 @@
39-# Depends: proxy
40-LoadModule proxy_uwsgi_module /usr/lib/apache2/modules/mod_proxy_uwsgi.so
41diff --git a/debian/control b/debian/control
42index 20f3f6e..a3d1af7 100644
43--- a/debian/control
44+++ b/debian/control
45@@ -19,9 +19,7 @@ Build-Depends: debhelper (>= 9.20160709~),
46 libxml2-dev,
47 lsb-release,
48 perl,
49- zlib1g-dev,
50- libcurl4-openssl-dev | libcurl4-dev,
51- libjansson-dev
52+ zlib1g-dev
53 Build-Conflicts: autoconf2.13
54 Standards-Version: 4.1.2
55 Vcs-Browser: https://salsa.debian.org/apache-team/apache2
56@@ -45,12 +43,8 @@ Provides: httpd,
57 Recommends: ssl-cert
58 Conflicts: apache2.2-bin,
59 apache2.2-common
60-Breaks: libapache2-mod-md (<< 2.4.33),
61- libapache2-mod-proxy-uwsgi (<< 2.4.33)
62 Replaces: apache2.2-bin,
63 apache2.2-common,
64- libapache2-mod-md (<< 2.4.33),
65- libapache2-mod-proxy-uwsgi (<< 2.4.33)
66 Suggests: apache2-doc,
67 apache2-suexec-pristine | apache2-suexec-custom,
68 www-browser,
69@@ -83,10 +77,6 @@ Depends: ${misc:Depends},
70 Provides: ${apache2:API}
71 Breaks: gridsite (<< 3.0.0~20170225gitd51b2fd-1~),
72 libapache2-mod-dacs (<= 1.4.38a-2),
73- libapache2-mod-md (<< 2.4.33),
74- libapache2-mod-proxy-uwsgi (<< 2.4.33)
75-Replaces: libapache2-mod-md (<< 2.4.33),
76- libapache2-mod-proxy-uwsgi (<< 2.4.33)
77 Suggests: apache2-doc,
78 apache2-suexec-pristine | apache2-suexec-custom,
79 www-browser
80@@ -211,20 +201,3 @@ Description: Apache debugging symbols
81 This package includes the debugging symbols. It can be used to debug
82 crashing server instances and modules. See
83 /usr/share/doc/apache2/README.backtrace for more information.
84-
85-Package: libapache2-mod-md
86-Architecture: any
87-Section: oldlibs
88-Depends: ${misc:Depends}, apache2 (= ${binary:Version})
89-Description: transitional package
90- This is a transitional package to apache2 for users of libapache2-mod-md.
91- It can be safely removed after the installation is complete.
92-
93-Package: libapache2-mod-proxy-uwsgi
94-Architecture: any
95-Section: oldlibs
96-Depends: ${misc:Depends}, apache2 (= ${binary:Version})
97-Description: transitional package
98- This is a transitional package to apache2 for users of
99- libapache2-mod-proxy-uwsgi.
100- It can be safely removed after the installation is complete.
101diff --git a/debian/rules b/debian/rules
102index e2d693c..79537ea 100755
103--- a/debian/rules
104+++ b/debian/rules
105@@ -113,6 +113,8 @@ configure-stamp: prebuild-checks-stamp support/suexec-custom.c
106 --with-apr=/usr/bin/apr-1-config --with-apr-util=/usr/bin/apu-1-config \
107 --with-pcre=yes \
108 --enable-pie \
109+ --disable-md \
110+ --disable-proxy-uwsgi \
111 --enable-mpms-shared=all \
112 --enable-mods-shared="all brotli cgi ident authnz_fcgi imagemap cern_meta proxy_fdpass proxy_http2 bucketeer case_filter case_filter_in" \
113 --enable-mods-static="unixd logio watchdog version" \
114@@ -177,7 +179,7 @@ override_dh_installdocs-indep:
115 dh_installdocs -i
116
117 override_dh_installdocs-arch:
118- dh_installdocs --link-doc=apache2 -papache2 -papache2-dbg -plibapache2-mod-md -plibapache2-mod-proxy-uwsgi
119+ dh_installdocs --link-doc=apache2 -papache2 -papache2-dbg
120 dh_installdocs --link-doc=apache2-dev -papache2-ssl-dev
121 dh_installdocs -a
122
123diff --git a/docs/manual/style/latex/atbeginend.sty b/docs/manual/style/latex/atbeginend.sty
124new file mode 100644
125index 0000000..79b555d
126--- /dev/null
127+++ b/docs/manual/style/latex/atbeginend.sty
128@@ -0,0 +1,80 @@
129+% atbeginend.sty
130+%
131+% Licensed to the Apache Software Foundation (ASF) under one or more
132+% contributor license agreements. See the NOTICE file distributed with
133+% this work for additional information regarding copyright ownership.
134+% The ASF licenses this file to You under the Apache License, Version 2.0
135+% (the "License"); you may not use this file except in compliance with
136+% the License. You may obtain a copy of the License at
137+%
138+% http://www.apache.org/licenses/LICENSE-2.0
139+%
140+% Unless required by applicable law or agreed to in writing, software
141+% distributed under the License is distributed on an "AS IS" BASIS,
142+% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
143+% See the License for the specific language governing permissions and
144+% limitations under the License.
145+
146+% defines
147+% \BeforeBegin{environment}{code-to-execute}
148+% \BeforeEnd {environment}{code-to-execute}
149+% \AfterBegin {environment}{code-to-execute}
150+% \AfterEnd {environment}{code-to-execute}
151+%
152+% Save \begin and \end to \BeginEnvironment and \EndEnvironment
153+\let\BeginEnvironment=\begin
154+\let\EndEnvironment=\end
155+
156+\def\IfUnDef#1{\expandafter\ifx\csname#1\endcsname\relax}
157+
158+% Null command needed to for \nothing{something}=.nothing.
159+\def\NullCom#1{}
160+
161+\def\begin#1{%
162+%
163+% if defined \BeforeBeg for this environment, execute it
164+\IfUnDef{BeforeBeg#1}\else\csname BeforeBeg#1\endcsname\fi%
165+%
166+%
167+%
168+\IfUnDef{AfterBeg#1}% This is done to skip the command for environments
169+ % which can take arguments, like multicols; YOU MUST NOT
170+ % USE \AfterBegin{...}{...} for such environments!
171+ \let\SaveBegEng=\BeginEnvironment%
172+\else%
173+ % Start this environment
174+ \BeginEnvironment{#1}%
175+ % and execute code after \begin{environment}
176+ \csname AfterBeg#1\endcsname%
177+ %
178+ \let\SaveBegEng=\NullCom%
179+\fi%
180+\SaveBegEng{#1}%
181+}
182+
183+
184+\def\end#1{%
185+%
186+% execute code before \end{environment}
187+\IfUnDef{BeforeEnd#1}\else\csname BeforeEnd#1\endcsname\fi%
188+%
189+% close this environment
190+\EndEnvironment{#1}%
191+%
192+% and execute code after \begin{environment}
193+\IfUnDef{AfterEnd#1}\else\csname AfterEnd#1\endcsname\fi%
194+}
195+
196+
197+%% Now, define commands
198+% \BeforeBegin{environment}{code-to-execute}
199+% \BeforeEnd {environment}{code-to-execute}
200+% \AfterBegin {environment}{code-to-execute}
201+% \AfterEnd {environment}{code-to-execute}
202+
203+\def\BeforeBegin#1#2{\expandafter\gdef\csname BeforeBeg#1\endcsname
204+{#2}}
205+\def\BeforeEnd #1#2{\expandafter\gdef\csname BeforeEnd#1\endcsname
206+{#2}}
207+\def\AfterBegin #1#2{\expandafter\gdef\csname AfterBeg#1\endcsname {#2}}
208+\def\AfterEnd #1#2{\expandafter\gdef\csname AfterEnd#1\endcsname{#2}}
209diff --git a/docs/manual/style/manualpage.dtd b/docs/manual/style/manualpage.dtd
210new file mode 100644
211index 0000000..e9c22a0
212--- /dev/null
213+++ b/docs/manual/style/manualpage.dtd
214@@ -0,0 +1,29 @@
215+<?xml version='1.0' encoding='UTF-8' ?>
216+
217+<!--
218+ Licensed to the Apache Software Foundation (ASF) under one or more
219+ contributor license agreements. See the NOTICE file distributed with
220+ this work for additional information regarding copyright ownership.
221+ The ASF licenses this file to You under the Apache License, Version 2.0
222+ (the "License"); you may not use this file except in compliance with
223+ the License. You may obtain a copy of the License at
224+
225+ http://www.apache.org/licenses/LICENSE-2.0
226+
227+ Unless required by applicable law or agreed to in writing, software
228+ distributed under the License is distributed on an "AS IS" BASIS,
229+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
230+ See the License for the specific language governing permissions and
231+ limitations under the License.
232+-->
233+
234+<!ENTITY % common SYSTEM "common.dtd">
235+%common;
236+
237+<!-- <manualpage> is the root element -->
238+<!ELEMENT manualpage (parentdocument?, title, summary?,
239+seealso*, section*)>
240+
241+<!ATTLIST manualpage metafile CDATA #REQUIRED
242+ upgrade CDATA #IMPLIED
243+>
244diff --git a/docs/manual/style/modulesynopsis.dtd b/docs/manual/style/modulesynopsis.dtd
245new file mode 100644
246index 0000000..aa3d6ee
247--- /dev/null
248+++ b/docs/manual/style/modulesynopsis.dtd
249@@ -0,0 +1,92 @@
250+<?xml version='1.0' encoding='UTF-8' ?>
251+
252+<!--
253+ Licensed to the Apache Software Foundation (ASF) under one or more
254+ contributor license agreements. See the NOTICE file distributed with
255+ this work for additional information regarding copyright ownership.
256+ The ASF licenses this file to You under the Apache License, Version 2.0
257+ (the "License"); you may not use this file except in compliance with
258+ the License. You may obtain a copy of the License at
259+
260+ http://www.apache.org/licenses/LICENSE-2.0
261+
262+ Unless required by applicable law or agreed to in writing, software
263+ distributed under the License is distributed on an "AS IS" BASIS,
264+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
265+ See the License for the specific language governing permissions and
266+ limitations under the License.
267+-->
268+
269+<!ENTITY % sitemap SYSTEM "sitemap.dtd">
270+%sitemap;
271+
272+<!ELEMENT modulesynopsis (name , description, status, hint?, sourcefile?,
273+identifier? , compatibility? , summary? , seealso* , section*,
274+directivesynopsis*)>
275+
276+<!ATTLIST modulesynopsis metafile CDATA #REQUIRED
277+ upgrade CDATA #IMPLIED>
278+
279+<!ELEMENT directivesynopsis (name , description? , syntax? , default?
280+, contextlist? , override? , modulelist?, status?, compatibility? ,
281+usage?, seealso*)>
282+
283+<!ELEMENT name (#PCDATA)>
284+
285+<!ELEMENT status (#PCDATA)>
286+
287+<!ELEMENT hint %Inline;>
288+
289+<!ELEMENT identifier (#PCDATA)>
290+
291+<!ELEMENT sourcefile (#PCDATA)>
292+
293+<!ELEMENT compatibility %Inline;>
294+
295+<!ELEMENT description %Inline;>
296+
297+<!--
298+ idtype is appended to the directive name when generating links to allow
299+ a directive of type section to share the name with another directive.
300+ The attribute type could have been (re)used instead but it would have broken
301+ pre-existing links.
302+-->
303+<!ATTLIST directivesynopsis type CDATA #IMPLIED
304+ idtype CDATA #IMPLIED
305+ location CDATA #IMPLIED >
306+
307+<!ELEMENT syntax %Inline;>
308+
309+<!ELEMENT default (#PCDATA | directive | br)*>
310+
311+<!ELEMENT contextlist (context+)+>
312+
313+<!ELEMENT context (#PCDATA)>
314+
315+<!ELEMENT override (#PCDATA)>
316+
317+<!ELEMENT usage %Block;>
318+
319+<!-- Used in index.xml -->
320+<!ELEMENT moduleindex (title, summary, seealso*)>
321+
322+<!ATTLIST moduleindex metafile CDATA #REQUIRED>
323+
324+<!-- Used in directive.xml -->
325+<!ELEMENT directiveindex (title | summary)+>
326+
327+<!ATTLIST directiveindex metafile CDATA #REQUIRED>
328+
329+<!-- Used in quickreference.xml -->
330+<!ELEMENT quickreference (title | summary | legend)+>
331+<!ATTLIST quickreference metafile CDATA #REQUIRED>
332+
333+<!ELEMENT legend (table, table)>
334+
335+<!-- Used in overrides.xml -->
336+<!ELEMENT overrideindex (title | summary | overridesummary)+>
337+<!ATTLIST overrideindex metafile CDATA #REQUIRED>
338+
339+<!ELEMENT overridesummary %Block;>
340+<!ATTLIST overridesummary class CDATA #IMPLIED
341+ fallback CDATA #IMPLIED>
342diff --git a/docs/manual/style/scripts/MINIFY b/docs/manual/style/scripts/MINIFY
343new file mode 100644
344index 0000000..2c1efc3
345--- /dev/null
346+++ b/docs/manual/style/scripts/MINIFY
347@@ -0,0 +1,5 @@
348+#!/bin/sh
349+
350+(echo '// see prettify.js for copyright, license and expanded version'; python -mrjsmin <prettify.js) >prettify.min.js
351+
352+# needs python and rjsmin installed
353diff --git a/docs/manual/style/scripts/prettify.js b/docs/manual/style/scripts/prettify.js
354new file mode 100644
355index 0000000..2df198d
356--- /dev/null
357+++ b/docs/manual/style/scripts/prettify.js
358@@ -0,0 +1,1622 @@
359+// Copyright (C) 2006 Google Inc.
360+//
361+// Licensed under the Apache License, Version 2.0 (the "License");
362+// you may not use this file except in compliance with the License.
363+// You may obtain a copy of the License at
364+//
365+// http://www.apache.org/licenses/LICENSE-2.0
366+//
367+// Unless required by applicable law or agreed to in writing, software
368+// distributed under the License is distributed on an "AS IS" BASIS,
369+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
370+// See the License for the specific language governing permissions and
371+// limitations under the License.
372+
373+
374+/**
375+ * @fileoverview
376+ * some functions for browser-side pretty printing of code contained in html.
377+ *
378+ * <p>
379+ * For a fairly comprehensive set of languages see the
380+ * <a href="http://google-code-prettify.googlecode.com/svn/trunk/README.html#langs">README</a>
381+ * file that came with this source. At a minimum, the lexer should work on a
382+ * number of languages including C and friends, Java, Python, Bash, SQL, HTML,
383+ * XML, CSS, Javascript, and Makefiles. It works passably on Ruby, PHP and Awk
384+ * and a subset of Perl, but, because of commenting conventions, doesn't work on
385+ * Smalltalk, Lisp-like, or CAML-like languages without an explicit lang class.
386+ * <p>
387+ * Usage: <ol>
388+ * <li> include this source file in an html page via
389+ * {@code <script type="text/javascript" src="/path/to/prettify.js"></script>}
390+ * <li> define style rules. See the example page for examples.
391+ * <li> mark the {@code <pre>} and {@code <code>} tags in your source with
392+ * {@code class=prettyprint.}
393+ * You can also use the (html deprecated) {@code <xmp>} tag, but the pretty
394+ * printer needs to do more substantial DOM manipulations to support that, so
395+ * some css styles may not be preserved.
396+ * </ol>
397+ * That's it. I wanted to keep the API as simple as possible, so there's no
398+ * need to specify which language the code is in, but if you wish, you can add
399+ * another class to the {@code <pre>} or {@code <code>} element to specify the
400+ * language, as in {@code <pre class="prettyprint lang-java">}. Any class that
401+ * starts with "lang-" followed by a file extension, specifies the file type.
402+ * See the "lang-*.js" files in this directory for code that implements
403+ * per-language file handlers.
404+ * <p>
405+ * Change log:<br>
406+ * cbeust, 2006/08/22
407+ * <blockquote>
408+ * Java annotations (start with "@") are now captured as literals ("lit")
409+ * </blockquote>
410+ * @requires console
411+ */
412+
413+// JSLint declarations
414+/*global console, document, navigator, setTimeout, window, define */
415+
416+/**
417+ * Split {@code prettyPrint} into multiple timeouts so as not to interfere with
418+ * UI events.
419+ * If set to {@code false}, {@code prettyPrint()} is synchronous.
420+ */
421+window['PR_SHOULD_USE_CONTINUATION'] = true;
422+
423+/**
424+ * Find all the {@code <pre>} and {@code <code>} tags in the DOM with
425+ * {@code class=prettyprint} and prettify them.
426+ *
427+ * @param {Function?} opt_whenDone if specified, called when the last entry
428+ * has been finished.
429+ */
430+var prettyPrintOne;
431+/**
432+ * Pretty print a chunk of code.
433+ *
434+ * @param {string} sourceCodeHtml code as html
435+ * @return {string} code as html, but prettier
436+ */
437+var prettyPrint;
438+
439+
440+(function () {
441+ var win = window;
442+ // Keyword lists for various languages.
443+ // We use things that coerce to strings to make them compact when minified
444+ // and to defeat aggressive optimizers that fold large string constants.
445+ var FLOW_CONTROL_KEYWORDS = ["break,continue,do,else,for,if,return,while"];
446+ var C_KEYWORDS = [FLOW_CONTROL_KEYWORDS,"auto,case,char,const,default," +
447+ "double,enum,extern,float,goto,int,long,register,short,signed,sizeof,module," +
448+ "static,struct,switch,typedef,union,unsigned,void,volatile"];
449+ var COMMON_KEYWORDS = [C_KEYWORDS,"catch,class,delete,false,import," +
450+ "new,operator,private,protected,public,this,throw,true,try,typeof"];
451+ var CPP_KEYWORDS = [COMMON_KEYWORDS,"alignof,align_union,asm,axiom,bool," +
452+ "concept,concept_map,const_cast,constexpr,decltype," +
453+ "dynamic_cast,explicit,export,friend,inline,late_check," +
454+ "mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast," +
455+ "template,typeid,typename,using,virtual,where,request_req"];
456+ var JAVA_KEYWORDS = [COMMON_KEYWORDS,
457+ "abstract,boolean,byte,extends,final,finally,implements,import," +
458+ "instanceof,null,native,package,strictfp,super,synchronized,throws," +
459+ "transient"];
460+ var CSHARP_KEYWORDS = [JAVA_KEYWORDS,
461+ "as,base,by,checked,decimal,delegate,descending,dynamic,event," +
462+ "fixed,foreach,from,group,implicit,in,interface,internal,into,is,let," +
463+ "lock,object,out,override,orderby,params,partial,readonly,ref,sbyte," +
464+ "sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort," +
465+ "var,virtual,where"];
466+ var COFFEE_KEYWORDS = "all,and,by,catch,class,else,extends,false,finally," +
467+ "for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then," +
468+ "throw,true,try,unless,until,when,while,yes";
469+ var JSCRIPT_KEYWORDS = [COMMON_KEYWORDS,
470+ "debugger,eval,export,function,get,null,set,undefined,var,with," +
471+ "Infinity,NaN"];
472+ var PERL_KEYWORDS = "caller,delete,die,do,dump,else,elsif,eval,exit,foreach,for," +
473+ "goto,if,import,last,local,my,next,no,our,print,printf,package,redo,require," +
474+ "sub,undef,unless,until,use,wantarray,while,BEGIN,END";
475+ var PHP_KEYWORDS = "abstract,and,array,as,break,case,catch,cfunction,class," +
476+ "clone,const,continue,declare,default,do,else,elseif,enddeclare,endfor," +
477+ "endforeach,endif,endswitch,endwhile,extends,final,for,foreach,function," +
478+ "global,goto,if,implements,interface,instanceof,namespace,new,old_function," +
479+ "or,private,protected,public,static,switch,throw,try,use,var,while,xor," +
480+ "die,echo,empty,exit,eval,include,include_once,isset,list,require," +
481+ "require_once,return,print,unset";
482+ var PYTHON_KEYWORDS = [FLOW_CONTROL_KEYWORDS, "and,as,assert,class,def,del," +
483+ "elif,except,exec,finally,from,global,import,in,is,lambda," +
484+ "nonlocal,not,or,pass,print,raise,try,with,yield," +
485+ "False,True,None"];
486+ var RUBY_KEYWORDS = [FLOW_CONTROL_KEYWORDS, "alias,and,begin,case,class," +
487+ "def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo," +
488+ "rescue,retry,self,super,then,true,undef,unless,until,when,yield," +
489+ "BEGIN,END"];
490+ var SH_KEYWORDS = [FLOW_CONTROL_KEYWORDS, "case,done,elif,esac,eval,fi," +
491+ "function,in,local,set,then,until,echo"];
492+ var CONFIG_ENVS = ["User-Agent,HTTP_USER_AGENT,HTTP_REFERER,HTTP_COOKIE,HTTP_FORWARDED,HTTP_HOST,HTTP_PROXY_CONNECTION,HTTP_ACCEPT,REMOTE_ADDR,REMOTE_HOST,REMOTE_PORT,REMOTE_USER,REMOTE_IDENT,REQUEST_METHOD,SCRIPT_FILENAME,PATH_INFO,QUERY_STRING,AUTH_TYPE,DOCUMENT_ROOT,SERVER_ADMIN,SERVER_NAME,SERVER_ADDR,SERVER_PORT,SERVER_PROTOCOL,SERVER_SOFTWARE,TIME_YEAR,TIME_MON,TIME_DAY,TIME_HOUR,TIME_MIN,TIME_SEC,TIME_WDAY,TIME,API_VERSION,THE_REQUEST,REQUEST_URI,REQUEST_FILENAME,IS_SUBREQ,HTTPS,REQUEST_SCHEME"];
493+ var CONFIG_KEYWORDS = ["<AuthnProviderAlias>,<AuthzProviderAlias>,<Directory>,<DirectoryMatch>,<Else>,<ElseIf>,<Files>,<FilesMatch>,<If>,<IfDefine>,<IfModule>,<IfVersion>,<Limit>,<LimitExcept>,<Location>,<LocationMatch>,<MDomainSet>,<Macro>,<Proxy>,<ProxyMatch>,<RequireAll>,<RequireAny>,<RequireNone>,<VirtualHost>,AcceptFilter,AcceptPathInfo,AccessFileName,Action,AddAlt,AddAltByEncoding,AddAltByType,AddCharset,AddDefaultCharset,AddDescription,AddEncoding,AddHandler,AddIcon,AddIconByEncoding,AddIconByType,AddInputFilter,AddLanguage,AddModuleInfo,AddOutputFilter,AddOutputFilterByType,AddType,Alias,AliasMatch,Allow,AllowCONNECT,AllowEncodedSlashes,AllowMethods,AllowOverride,AllowOverrideList,Anonymous,Anonymous_LogEmail,Anonymous_MustGiveEmail,Anonymous_NoUserID,Anonymous_VerifyEmail,AsyncRequestWorkerFactor,AuthBasicAuthoritative,AuthBasicFake,AuthBasicProvider,AuthBasicUseDigestAlgorithm,AuthDBDUserPWQuery,AuthDBDUserRealmQuery,AuthDBMGroupFile,AuthDBMType,AuthDBMUserFile,AuthDigestAlgorithm,AuthDigestDomain,AuthDigestNonceLifetime,AuthDigestProvider,AuthDigestQop,AuthDigestShmemSize,AuthFormAuthoritative,AuthFormBody,AuthFormDisableNoStore,AuthFormFakeBasicAuth,AuthFormLocation,AuthFormLoginRequiredLocation,AuthFormLoginSuccessLocation,AuthFormLogoutLocation,AuthFormMethod,AuthFormMimetype,AuthFormPassword,AuthFormProvider,AuthFormSitePassphrase,AuthFormSize,AuthFormUsername,AuthGroupFile,AuthLDAPAuthorizePrefix,AuthLDAPBindAuthoritative,AuthLDAPBindDN,AuthLDAPBindPassword,AuthLDAPCharsetConfig,AuthLDAPCompareAsUser,AuthLDAPCompareDNOnServer,AuthLDAPDereferenceAliases,AuthLDAPGroupAttribute,AuthLDAPGroupAttributeIsDN,AuthLDAPInitialBindAsUser,AuthLDAPInitialBindPattern,AuthLDAPMaxSubGroupDepth,AuthLDAPRemoteUserAttribute,AuthLDAPRemoteUserIsDN,AuthLDAPSearchAsUser,AuthLDAPSubGroupAttribute,AuthLDAPSubGroupClass,AuthLDAPUrl,AuthMerging,AuthName,AuthType,AuthUserFile,AuthnCacheContext,AuthnCacheEnable,AuthnCacheProvideFor,AuthnCacheSOCache,AuthnCacheTimeout,AuthnzFcgiCheckAuthnProvider,AuthnzFcgiDefineProvider,AuthzDBDLoginToReferer,AuthzDBDQuery,AuthzDBDRedirectQuery,AuthzDBMType,AuthzSendForbiddenOnFailure,BalancerGrowth,BalancerInherit,BalancerMember,BalancerPersist,BrotliAlterETag,BrotliCompressionMaxInputBlock,BrotliCompressionQuality,BrotliCompressionWindow,BrotliFilterNote,BrowserMatch,BrowserMatchNoCase,BufferSize,BufferedLogs,CGIDScriptTimeout,CGIMapExtension,CGIPassAuth,CGIVar,CacheDefaultExpire,CacheDetailHeader,CacheDirLength,CacheDirLevels,CacheDisable,CacheEnable,CacheFile,CacheHeader,CacheIgnoreCacheControl,CacheIgnoreHeaders,CacheIgnoreNoLastMod,CacheIgnoreQueryString,CacheIgnoreURLSessionIdentifiers,CacheKeyBaseURL,CacheLastModifiedFactor,CacheLock,CacheLockMaxAge,CacheLockPath,CacheMaxExpire,CacheMaxFileSize,CacheMinExpire,CacheMinFileSize,CacheNegotiatedDocs,CacheQuickHandler,CacheReadSize,CacheReadTime,CacheRoot,CacheSocache,CacheSocacheMaxSize,CacheSocacheMaxTime,CacheSocacheMinTime,CacheSocacheReadSize,CacheSocacheReadTime,CacheStaleOnError,CacheStoreExpired,CacheStoreNoStore,CacheStorePrivate,CharsetDefault,CharsetOptions,CharsetSourceEnc,CheckCaseOnly,CheckSpelling,ChrootDir,ContentDigest,CookieDomain,CookieExpires,CookieName,CookieStyle,CookieTracking,CoreDumpDirectory,CustomLog,DBDExptime,DBDInitSQL,DBDKeep,DBDMax,DBDMin,DBDParams,DBDPersist,DBDPrepareSQL,DBDriver,DTracePrivileges,Dav,DavDepthInfinity,DavGenericLockDB,DavLockDB,DavMinTimeout,DefaultIcon,DefaultLanguage,DefaultRuntimeDir,DefaultType,Define,DeflateBufferSize,DeflateCompressionLevel,DeflateFilterNote,DeflateInflateLimitRequestBody,DeflateInflateRatioBurst,DeflateInflateRatioLimit,DeflateMemLevel,DeflateWindowSize,Deny,DirectoryCheckHandler,DirectoryIndex,DirectoryIndexRedirect,DirectorySlash,DocumentRoot,DumpIOInput,DumpIOOutput,EnableExceptionHook,EnableMMAP,EnableSendfile,Error,ErrorDocument,ErrorLog,ErrorLogFormat,Example,ExpiresActive,ExpiresByType,ExpiresDefault,ExtFilterDefine,ExtFilterOptions,ExtendedStatus,FallbackResource,FileETag,FilterChain,FilterDeclare,FilterProtocol,FilterProvider,FilterTrace,ForceLanguagePriority,ForceType,ForensicLog,GlobalLog,GprofDir,GracefulShutdownTimeout,Group,H2CopyFiles,H2Direct,H2EarlyHints,H2MaxSessionStreams,H2MaxWorkerIdleSeconds,H2MaxWorkers,H2MinWorkers,H2ModernTLSOnly,H2Push,H2PushDiarySize,H2PushPriority,H2PushResource,H2SerializeHeaders,H2StreamMaxMemSize,H2TLSCoolDownSecs,H2TLSWarmUpSize,H2Upgrade,H2WindowSize,Header,HeaderName,HeartbeatAddress,HeartbeatListen,HeartbeatMaxServers,HeartbeatStorage,HeartbeatStorage,HostnameLookups,HttpProtocolOptions,ISAPIAppendLogToErrors,ISAPIAppendLogToQuery,ISAPICacheFile,ISAPIFakeAsync,ISAPILogNotSupported,ISAPIReadAheadBuffer,IdentityCheck,IdentityCheckTimeout,ImapBase,ImapDefault,ImapMenu,Include,IncludeOptional,IndexHeadInsert,IndexIgnore,IndexIgnoreReset,IndexOptions,IndexOrderDefault,IndexStyleSheet,InputSed,KeepAlive,KeepAliveTimeout,KeptBodySize,LDAPCacheEntries,LDAPCacheTTL,LDAPConnectionPoolTTL,LDAPConnectionTimeout,LDAPLibraryDebug,LDAPOpCacheEntries,LDAPOpCacheTTL,LDAPReferralHopLimit,LDAPReferrals,LDAPRetries,LDAPRetryDelay,LDAPSharedCacheFile,LDAPSharedCacheSize,LDAPTimeout,LDAPTrustedClientCert,LDAPTrustedGlobalCert,LDAPTrustedMode,LDAPVerifyServerCert,LanguagePriority,LimitInternalRecursion,LimitRequestBody,LimitRequestFieldSize,LimitRequestFields,LimitRequestLine,LimitXMLRequestBody,Listen,ListenBackLog,ListenCoresBucketsRatio,LoadFile,LoadModule,LogFormat,LogIOTrackTTFB,LogLevel,LogMessage,LuaAuthzProvider,LuaCodeCache,LuaHookAccessChecker,LuaHookAuthChecker,LuaHookCheckUserID,LuaHookFixups,LuaHookInsertFilter,LuaHookLog,LuaHookMapToStorage,LuaHookTranslateName,LuaHookTypeChecker,LuaInherit,LuaInputFilter,LuaMapHandler,LuaOutputFilter,LuaPackageCPath,LuaPackagePath,LuaQuickHandler,LuaRoot,LuaScope,MDBaseServer,MDCAChallenges,MDCertificateAgreement,MDCertificateAuthority,MDCertificateProtocol,MDDriveMode,MDHttpProxy,MDMember,MDMembers,MDMustStaple,MDNotifyCmd,MDPortMap,MDPrivateKeys,MDRenewWindow,MDRequireHttps,MDStoreDir,MDomain,MMapFile,MaxConnectionsPerChild,MaxKeepAliveRequests,MaxMemFree,MaxRangeOverlaps,MaxRangeReversals,MaxRanges,MaxRequestWorkers,MaxSpareServers,MaxSpareThreads,MaxThreads,MemcacheConnTTL,MergeTrailers,MetaDir,MetaFiles,MetaSuffix,MimeMagicFile,MinSpareServers,MinSpareThreads,ModMimeUsePathInfo,ModemStandard,MultiviewsMatch,Mutex,NWSSLTrustedCerts,NWSSLUpgradeable,NameVirtualHost,NoProxy,Options,Order,OutputSed,PassEnv,PidFile,PrivilegesMode,Protocol,ProtocolEcho,Protocols,ProtocolsHonorOrder,ProxyAddHeaders,ProxyBadHeader,ProxyBlock,ProxyDomain,ProxyErrorOverride,ProxyExpressDBMFile,ProxyExpressDBMType,ProxyExpressEnable,ProxyFCGIBackendType,ProxyFCGISetEnvIf,ProxyFtpDirCharset,ProxyFtpEscapeWildcards,ProxyFtpListOnWildcard,ProxyHCExpr,ProxyHCTPsize,ProxyHCTemplate,ProxyHTMLBufSize,ProxyHTMLCharsetOut,ProxyHTMLDocType,ProxyHTMLEnable,ProxyHTMLEvents,ProxyHTMLExtended,ProxyHTMLFixups,ProxyHTMLInterp,ProxyHTMLLinks,ProxyHTMLMeta,ProxyHTMLStripComments,ProxyHTMLURLMap,ProxyIOBufferSize,ProxyMaxForwards,ProxyPass,ProxyPassInherit,ProxyPassInterpolateEnv,ProxyPassMatch,ProxyPassReverse,ProxyPassReverseCookieDomain,ProxyPassReverseCookiePath,ProxyPreserveHost,ProxyReceiveBufferSize,ProxyRemote,ProxyRemoteMatch,ProxyRequests,ProxySCGIInternalRedirect,ProxySCGISendfile,ProxySet,ProxySourceAddress,ProxyStatus,ProxyTimeout,ProxyVia,QualifyRedirectURL,RLimitCPU,RLimitMEM,RLimitNPROC,ReadmeName,ReceiveBufferSize,Redirect,RedirectMatch,RedirectPermanent,RedirectTemp,ReflectorHeader,RegisterHttpMethod,RemoteIPHeader,RemoteIPInternalProxy,RemoteIPInternalProxyList,RemoteIPProxiesHeader,RemoteIPTrustedProxy,RemoteIPTrustedProxyList,RemoveCharset,RemoveEncoding,RemoveHandler,RemoveInputFilter,RemoveLanguage,RemoveOutputFilter,RemoveType,RequestHeader,RequestReadTimeout,Require,RewriteBase,RewriteCond,RewriteEngine,RewriteMap,RewriteOptions,RewriteRule,SSIETag,SSIEndTag,SSIErrorMsg,SSILastModified,SSILegacyExprParser,SSIStartTag,SSITimeFormat,SSIUndefinedEcho,SSLCACertificateFile,SSLCACertificatePath,SSLCADNRequestFile,SSLCADNRequestPath,SSLCARevocationCheck,SSLCARevocationFile,SSLCARevocationPath,SSLCertificateChainFile,SSLCertificateFile,SSLCertificateKeyFile,SSLCipherSuite,SSLCompression,SSLCryptoDevice,SSLEngine,SSLFIPS,SSLHonorCipherOrder,SSLInsecureRenegotiation,SSLOCSPDefaultResponder,SSLOCSPEnable,SSLOCSPNoverify,SSLOCSPOverrideResponder,SSLOCSPProxyURL,SSLOCSPResponderCertificateFile,SSLOCSPResponderTimeout,SSLOCSPResponseMaxAge,SSLOCSPResponseTimeSkew,SSLOCSPUseRequestNonce,SSLOpenSSLConfCmd,SSLOptions,SSLPassPhraseDialog,SSLProtocol,SSLProxyCACertificateFile,SSLProxyCACertificatePath,SSLProxyCARevocationCheck,SSLProxyCARevocationFile,SSLProxyCARevocationPath,SSLProxyCheckPeerCN,SSLProxyCheckPeerExpire,SSLProxyCheckPeerName,SSLProxyCipherSuite,SSLProxyEngine,SSLProxyMachineCertificateChainFile,SSLProxyMachineCertificateFile,SSLProxyMachineCertificatePath,SSLProxyProtocol,SSLProxyVerify,SSLProxyVerifyDepth,SSLRandomSeed,SSLRenegBufferSize,SSLRequire,SSLRequireSSL,SSLSRPUnknownUserSeed,SSLSRPVerifierFile,SSLSessionCache,SSLSessionCacheTimeout,SSLSessionTicketKeyFile,SSLSessionTickets,SSLStaplingCache,SSLStaplingErrorCacheTimeout,SSLStaplingFakeTryLater,SSLStaplingForceURL,SSLStaplingResponderTimeout,SSLStaplingResponseMaxAge,SSLStaplingResponseTimeSkew,SSLStaplingReturnResponderErrors,SSLStaplingStandardCacheTimeout,SSLStrictSNIVHostCheck,SSLUseStapling,SSLUserName,SSLVerifyClient,SSLVerifyDepth,Satisfy,ScoreBoardFile,Script,ScriptAlias,ScriptAliasMatch,ScriptInterpreterSource,ScriptLog,ScriptLogBuffer,ScriptLogLength,ScriptSock,SecureListen,SeeRequestTail,SendBufferSize,ServerAdmin,ServerAlias,ServerLimit,ServerName,ServerPath,ServerRoot,ServerSignature,ServerTokens,Session,SessionCookieName,SessionCookieName2,SessionCookieRemove,SessionCryptoCipher,SessionCryptoDriver,SessionCryptoPassphrase,SessionCryptoPassphraseFile,SessionDBDCookieName,SessionDBDCookieName2,SessionDBDCookieRemove,SessionDBDDeleteLabel,SessionDBDInsertLabel,SessionDBDPerUser,SessionDBDSelectLabel,SessionDBDUpdateLabel,SessionEnv,SessionExclude,SessionHeader,SessionInclude,SessionMaxAge,SetEnv,SetEnvIf,SetEnvIfExpr,SetEnvIfNoCase,SetHandler,SetInputFilter,SetOutputFilter,StartServers,StartThreads,Substitute,SubstituteInheritBefore,SubstituteMaxLineLength,Suexec,SuexecUserGroup,ThreadLimit,ThreadStackSize,ThreadsPerChild,TimeOut,TraceEnable,TransferLog,TypesConfig,UnDefine,UndefMacro,UnsetEnv,Use,UseCanonicalName,UseCanonicalPhysicalPort,User,UserDir,VHostCGIMode,VHostCGIPrivs,VHostGroup,VHostPrivs,VHostSecure,VHostUser,VirtualDocumentRoot,VirtualDocumentRootIP,VirtualScriptAlias,VirtualScriptAliasIP,WatchdogInterval,XBitHack,xml2EncAlias,xml2EncDefault,xml2StartParse"]
494+ var CONFIG_OPTIONS = /^[\\+\\-]?(AuthConfig|IncludesNOEXEC|ExecCGI|FollowSymLinks|MultiViews|Includes|Indexes|SymLinksIfOwnerMatch)\b/i;
495+ var ALL_KEYWORDS = [
496+ CPP_KEYWORDS, CSHARP_KEYWORDS, JSCRIPT_KEYWORDS, PERL_KEYWORDS +
497+ PYTHON_KEYWORDS, RUBY_KEYWORDS, SH_KEYWORDS, CONFIG_KEYWORDS, PHP_KEYWORDS];
498+ var C_TYPES = /^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float|char|void|const|static|struct)\d*(_t)?\b)|[a-z_]+_rec|cmd_parms\b/;
499+
500+ // token style names. correspond to css classes
501+ /**
502+ * token style for a string literal
503+ * @const
504+ */
505+ var PR_STRING = 'str';
506+ /**
507+ * token style for a keyword
508+ * @const
509+ */
510+ var PR_KEYWORD = 'kwd';
511+ /**
512+ * token style for a comment
513+ * @const
514+ */
515+ var PR_COMMENT = 'com';
516+ /**
517+ * token style for a type
518+ * @const
519+ */
520+ var PR_TYPE = 'typ';
521+ /**
522+ * token style for a literal value. e.g. 1, null, true.
523+ * @const
524+ */
525+ var PR_LITERAL = 'lit';
526+ /**
527+ * token style for a punctuation string.
528+ * @const
529+ */
530+ var PR_PUNCTUATION = 'pun';
531+ /**
532+ * token style for plain text.
533+ * @const
534+ */
535+ var PR_PLAIN = 'pln';
536+
537+ /**
538+ * token style for an sgml tag.
539+ * @const
540+ */
541+ var PR_TAG = 'tag';
542+ /**
543+ * token style for a markup declaration such as a DOCTYPE.
544+ * @const
545+ */
546+ var PR_DECLARATION = 'dec';
547+ /**
548+ * token style for embedded source.
549+ * @const
550+ */
551+ var PR_SOURCE = 'src';
552+ /**
553+ * token style for an sgml attribute name.
554+ * @const
555+ */
556+ var PR_ATTRIB_NAME = 'atn';
557+ /**
558+ * token style for an sgml attribute value.
559+ * @const
560+ */
561+ var PR_ATTRIB_VALUE = 'atv';
562+
563+ /**
564+ * A class that indicates a section of markup that is not code, e.g. to allow
565+ * embedding of line numbers within code listings.
566+ * @const
567+ */
568+ var PR_NOCODE = 'nocode';
569+
570+
571+
572+/**
573+ * A set of tokens that can precede a regular expression literal in
574+ * javascript
575+ * http://web.archive.org/web/20070717142515/http://www.mozilla.org/js/language/js20/rationale/syntax.html
576+ * has the full list, but I've removed ones that might be problematic when
577+ * seen in languages that don't support regular expression literals.
578+ *
579+ * <p>Specifically, I've removed any keywords that can't precede a regexp
580+ * literal in a syntactically legal javascript program, and I've removed the
581+ * "in" keyword since it's not a keyword in many languages, and might be used
582+ * as a count of inches.
583+ *
584+ * <p>The link above does not accurately describe EcmaScript rules since
585+ * it fails to distinguish between (a=++/b/i) and (a++/b/i) but it works
586+ * very well in practice.
587+ *
588+ * @private
589+ * @const
590+ */
591+var REGEXP_PRECEDER_PATTERN = '(?:^^\\.?|[+-]|[!=]=?=?|\\#|%=?|&&?=?|\\(|\\*=?|[+\\-]=|->|\\/=?|::?|<<?=?|>>?>?=?|,|;|\\?|@|\\[|~|{|\\^\\^?=?|\\|\\|?=?|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*';
592+
593+// CAVEAT: this does not properly handle the case where a regular
594+// expression immediately follows another since a regular expression may
595+// have flags for case-sensitivity and the like. Having regexp tokens
596+// adjacent is not valid in any language I'm aware of, so I'm punting.
597+// TODO: maybe style special characters inside a regexp as punctuation.
598+
599+
600+ /**
601+ * Given a group of {@link RegExp}s, returns a {@code RegExp} that globally
602+ * matches the union of the sets of strings matched by the input RegExp.
603+ * Since it matches globally, if the input strings have a start-of-input
604+ * anchor (/^.../), it is ignored for the purposes of unioning.
605+ * @param {Array.<RegExp>} regexs non multiline, non-global regexs.
606+ * @return {RegExp} a global regex.
607+ */
608+ function combinePrefixPatterns(regexs) {
609+ var capturedGroupIndex = 0;
610+
611+ var needToFoldCase = false;
612+ var ignoreCase = false;
613+ for (var i = 0, n = regexs.length; i < n; ++i) {
614+ var regex = regexs[i];
615+ if (regex.ignoreCase) {
616+ ignoreCase = true;
617+ } else if (/[a-z]/i.test(regex.source.replace(
618+ /\\u[0-9a-f]{4}|\\x[0-9a-f]{2}|\\[^ux]/gi, ''))) {
619+ needToFoldCase = true;
620+ ignoreCase = false;
621+ break;
622+ }
623+ }
624+
625+ var escapeCharToCodeUnit = {
626+ 'b': 8,
627+ 't': 9,
628+ 'n': 0xa,
629+ 'v': 0xb,
630+ 'f': 0xc,
631+ 'r': 0xd
632+ };
633+
634+ function decodeEscape(charsetPart) {
635+ var cc0 = charsetPart.charCodeAt(0);
636+ if (cc0 !== 92 /* \\ */) {
637+ return cc0;
638+ }
639+ var c1 = charsetPart.charAt(1);
640+ cc0 = escapeCharToCodeUnit[c1];
641+ if (cc0) {
642+ return cc0;
643+ } else if ('0' <= c1 && c1 <= '7') {
644+ return parseInt(charsetPart.substring(1), 8);
645+ } else if (c1 === 'u' || c1 === 'x') {
646+ return parseInt(charsetPart.substring(2), 16);
647+ } else {
648+ return charsetPart.charCodeAt(1);
649+ }
650+ }
651+
652+ function encodeEscape(charCode) {
653+ if (charCode < 0x20) {
654+ return (charCode < 0x10 ? '\\x0' : '\\x') + charCode.toString(16);
655+ }
656+ var ch = String.fromCharCode(charCode);
657+ return (ch === '\\' || ch === '-' || ch === ']' || ch === '^')
658+ ? "\\" + ch : ch;
659+ }
660+
661+ function caseFoldCharset(charSet) {
662+ var charsetParts = charSet.substring(1, charSet.length - 1).match(
663+ new RegExp(
664+ '\\\\u[0-9A-Fa-f]{4}'
665+ + '|\\\\x[0-9A-Fa-f]{2}'
666+ + '|\\\\[0-3][0-7]{0,2}'
667+ + '|\\\\[0-7]{1,2}'
668+ + '|\\\\[\\s\\S]'
669+ + '|-'
670+ + '|[^-\\\\]',
671+ 'g'));
672+ var ranges = [];
673+ var inverse = charsetParts[0] === '^';
674+
675+ var out = ['['];
676+ if (inverse) { out.push('^'); }
677+
678+ for (var i = inverse ? 1 : 0, n = charsetParts.length; i < n; ++i) {
679+ var p = charsetParts[i];
680+ if (/\\[bdsw]/i.test(p)) { // Don't muck with named groups.
681+ out.push(p);
682+ } else {
683+ var start = decodeEscape(p);
684+ var end;
685+ if (i + 2 < n && '-' === charsetParts[i + 1]) {
686+ end = decodeEscape(charsetParts[i + 2]);
687+ i += 2;
688+ } else {
689+ end = start;
690+ }
691+ ranges.push([start, end]);
692+ // If the range might intersect letters, then expand it.
693+ // This case handling is too simplistic.
694+ // It does not deal with non-latin case folding.
695+ // It works for latin source code identifiers though.
696+ if (!(end < 65 || start > 122)) {
697+ if (!(end < 65 || start > 90)) {
698+ ranges.push([Math.max(65, start) | 32, Math.min(end, 90) | 32]);
699+ }
700+ if (!(end < 97 || start > 122)) {
701+ ranges.push([Math.max(97, start) & ~32, Math.min(end, 122) & ~32]);
702+ }
703+ }
704+ }
705+ }
706+
707+ // [[1, 10], [3, 4], [8, 12], [14, 14], [16, 16], [17, 17]]
708+ // -> [[1, 12], [14, 14], [16, 17]]
709+ ranges.sort(function (a, b) { return (a[0] - b[0]) || (b[1] - a[1]); });
710+ var consolidatedRanges = [];
711+ var lastRange = [];
712+ for (var i = 0; i < ranges.length; ++i) {
713+ var range = ranges[i];
714+ if (range[0] <= lastRange[1] + 1) {
715+ lastRange[1] = Math.max(lastRange[1], range[1]);
716+ } else {
717+ consolidatedRanges.push(lastRange = range);
718+ }
719+ }
720+
721+ for (var i = 0; i < consolidatedRanges.length; ++i) {
722+ var range = consolidatedRanges[i];
723+ out.push(encodeEscape(range[0]));
724+ if (range[1] > range[0]) {
725+ if (range[1] + 1 > range[0]) { out.push('-'); }
726+ out.push(encodeEscape(range[1]));
727+ }
728+ }
729+ out.push(']');
730+ return out.join('');
731+ }
732+
733+ function allowAnywhereFoldCaseAndRenumberGroups(regex) {
734+ // Split into character sets, escape sequences, punctuation strings
735+ // like ('(', '(?:', ')', '^'), and runs of characters that do not
736+ // include any of the above.
737+ var parts = regex.source.match(
738+ new RegExp(
739+ '(?:'
740+ + '\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]' // a character set
741+ + '|\\\\u[A-Fa-f0-9]{4}' // a unicode escape
742+ + '|\\\\x[A-Fa-f0-9]{2}' // a hex escape
743+ + '|\\\\[0-9]+' // a back-reference or octal escape
744+ + '|\\\\[^ux0-9]' // other escape sequence
745+ + '|\\(\\?[:!=]' // start of a non-capturing group
746+ + '|[\\(\\)\\^]' // start/end of a group, or line start
747+ + '|[^\\x5B\\x5C\\(\\)\\^]+' // run of other characters
748+ + ')',
749+ 'g'));
750+ var n = parts.length;
751+
752+ // Maps captured group numbers to the number they will occupy in
753+ // the output or to -1 if that has not been determined, or to
754+ // undefined if they need not be capturing in the output.
755+ var capturedGroups = [];
756+
757+ // Walk over and identify back references to build the capturedGroups
758+ // mapping.
759+ for (var i = 0, groupIndex = 0; i < n; ++i) {
760+ var p = parts[i];
761+ if (p === '(') {
762+ // groups are 1-indexed, so max group index is count of '('
763+ ++groupIndex;
764+ } else if ('\\' === p.charAt(0)) {
765+ var decimalValue = +p.substring(1);
766+ if (decimalValue) {
767+ if (decimalValue <= groupIndex) {
768+ capturedGroups[decimalValue] = -1;
769+ } else {
770+ // Replace with an unambiguous escape sequence so that
771+ // an octal escape sequence does not turn into a backreference
772+ // to a capturing group from an earlier regex.
773+ parts[i] = encodeEscape(decimalValue);
774+ }
775+ }
776+ }
777+ }
778+
779+ // Renumber groups and reduce capturing groups to non-capturing groups
780+ // where possible.
781+ for (var i = 1; i < capturedGroups.length; ++i) {
782+ if (-1 === capturedGroups[i]) {
783+ capturedGroups[i] = ++capturedGroupIndex;
784+ }
785+ }
786+ for (var i = 0, groupIndex = 0; i < n; ++i) {
787+ var p = parts[i];
788+ if (p === '(') {
789+ ++groupIndex;
790+ if (!capturedGroups[groupIndex]) {
791+ parts[i] = '(?:';
792+ }
793+ } else if ('\\' === p.charAt(0)) {
794+ var decimalValue = +p.substring(1);
795+ if (decimalValue && decimalValue <= groupIndex) {
796+ parts[i] = '\\' + capturedGroups[decimalValue];
797+ }
798+ }
799+ }
800+
801+ // Remove any prefix anchors so that the output will match anywhere.
802+ // ^^ really does mean an anchored match though.
803+ for (var i = 0; i < n; ++i) {
804+ if ('^' === parts[i] && '^' !== parts[i + 1]) { parts[i] = ''; }
805+ }
806+
807+ // Expand letters to groups to handle mixing of case-sensitive and
808+ // case-insensitive patterns if necessary.
809+ if (regex.ignoreCase && needToFoldCase) {
810+ for (var i = 0; i < n; ++i) {
811+ var p = parts[i];
812+ var ch0 = p.charAt(0);
813+ if (p.length >= 2 && ch0 === '[') {
814+ parts[i] = caseFoldCharset(p);
815+ } else if (ch0 !== '\\') {
816+ // TODO: handle letters in numeric escapes.
817+ parts[i] = p.replace(
818+ /[a-zA-Z]/g,
819+ function (ch) {
820+ var cc = ch.charCodeAt(0);
821+ return '[' + String.fromCharCode(cc & ~32, cc | 32) + ']';
822+ });
823+ }
824+ }
825+ }
826+
827+ return parts.join('');
828+ }
829+
830+ var rewritten = [];
831+ for (var i = 0, n = regexs.length; i < n; ++i) {
832+ var regex = regexs[i];
833+ if (regex.global || regex.multiline) { throw new Error('' + regex); }
834+ rewritten.push(
835+ '(?:' + allowAnywhereFoldCaseAndRenumberGroups(regex) + ')');
836+ }
837+
838+ return new RegExp(rewritten.join('|'), ignoreCase ? 'gi' : 'g');
839+ }
840+
841+
842+ /**
843+ * Split markup into a string of source code and an array mapping ranges in
844+ * that string to the text nodes in which they appear.
845+ *
846+ * <p>
847+ * The HTML DOM structure:</p>
848+ * <pre>
849+ * (Element "p"
850+ * (Element "b"
851+ * (Text "print ")) ; #1
852+ * (Text "'Hello '") ; #2
853+ * (Element "br") ; #3
854+ * (Text " + 'World';")) ; #4
855+ * </pre>
856+ * <p>
857+ * corresponds to the HTML
858+ * {@code <p><b>print </b>'Hello '<br> + 'World';</p>}.</p>
859+ *
860+ * <p>
861+ * It will produce the output:</p>
862+ * <pre>
863+ * {
864+ * sourceCode: "print 'Hello '\n + 'World';",
865+ * // 1 2
866+ * // 012345678901234 5678901234567
867+ * spans: [0, #1, 6, #2, 14, #3, 15, #4]
868+ * }
869+ * </pre>
870+ * <p>
871+ * where #1 is a reference to the {@code "print "} text node above, and so
872+ * on for the other text nodes.
873+ * </p>
874+ *
875+ * <p>
876+ * The {@code} spans array is an array of pairs. Even elements are the start
877+ * indices of substrings, and odd elements are the text nodes (or BR elements)
878+ * that contain the text for those substrings.
879+ * Substrings continue until the next index or the end of the source.
880+ * </p>
881+ *
882+ * @param {Node} node an HTML DOM subtree containing source-code.
883+ * @param {boolean} isPreformatted true if white-space in text nodes should
884+ * be considered significant.
885+ * @return {Object} source code and the text nodes in which they occur.
886+ */
887+ function extractSourceSpans(node, isPreformatted) {
888+ var nocode = /(?:^|\s)nocode(?:\s|$)/;
889+
890+ var chunks = [];
891+ var length = 0;
892+ var spans = [];
893+ var k = 0;
894+
895+ function walk(node) {
896+ switch (node.nodeType) {
897+ case 1: // Element
898+ if (nocode.test(node.className)) { return; }
899+ for (var child = node.firstChild; child; child = child.nextSibling) {
900+ walk(child);
901+ }
902+ var nodeName = node.nodeName.toLowerCase();
903+ if ('br' === nodeName || 'li' === nodeName) {
904+ chunks[k] = '\n';
905+ spans[k << 1] = length++;
906+ spans[(k++ << 1) | 1] = node;
907+ }
908+ break;
909+ case 3: case 4: // Text
910+ var text = node.nodeValue;
911+ if (text.length) {
912+ if (!isPreformatted) {
913+ text = text.replace(/[ \t\r\n]+/g, ' ');
914+ } else {
915+ text = text.replace(/\r\n?/g, '\n'); // Normalize newlines.
916+ text = text.replace(/^(\r?\n\s*)+/g, ''); // Remove leading newlines
917+ text = text.replace(/^\s*/g, ''); // Remove leading spaces due to indented formatting
918+ text = text.replace(/(\r?\n\s*)+$/g, ''); // Remove ending newlines
919+
920+ }
921+ // TODO: handle tabs here?
922+ chunks[k] = text;
923+ spans[k << 1] = length;
924+ length += text.length;
925+ spans[(k++ << 1) | 1] = node;
926+ }
927+ break;
928+ }
929+ }
930+
931+ walk(node);
932+
933+ return {
934+ sourceCode: chunks.join('').replace(/\n$/, ''),
935+ spans: spans
936+ };
937+ }
938+
939+
940+ /**
941+ * Apply the given language handler to sourceCode and add the resulting
942+ * decorations to out.
943+ * @param {number} basePos the index of sourceCode within the chunk of source
944+ * whose decorations are already present on out.
945+ */
946+ function appendDecorations(basePos, sourceCode, langHandler, out) {
947+ if (!sourceCode) { return; }
948+ var job = {
949+ sourceCode: sourceCode,
950+ basePos: basePos
951+ };
952+ langHandler(job);
953+ out.push.apply(out, job.decorations);
954+ }
955+
956+ var notWs = /\S/;
957+
958+ /**
959+ * Given an element, if it contains only one child element and any text nodes
960+ * it contains contain only space characters, return the sole child element.
961+ * Otherwise returns undefined.
962+ * <p>
963+ * This is meant to return the CODE element in {@code <pre><code ...>} when
964+ * there is a single child element that contains all the non-space textual
965+ * content, but not to return anything where there are multiple child elements
966+ * as in {@code <pre><code>...</code><code>...</code></pre>} or when there
967+ * is textual content.
968+ */
969+ function childContentWrapper(element) {
970+ var wrapper = undefined;
971+ for (var c = element.firstChild; c; c = c.nextSibling) {
972+ var type = c.nodeType;
973+ wrapper = (type === 1) // Element Node
974+ ? (wrapper ? element : c)
975+ : (type === 3) // Text Node
976+ ? (notWs.test(c.nodeValue) ? element : wrapper)
977+ : wrapper;
978+ }
979+ return wrapper === element ? undefined : wrapper;
980+ }
981+
982+ /** Given triples of [style, pattern, context] returns a lexing function,
983+ * The lexing function interprets the patterns to find token boundaries and
984+ * returns a decoration list of the form
985+ * [index_0, style_0, index_1, style_1, ..., index_n, style_n]
986+ * where index_n is an index into the sourceCode, and style_n is a style
987+ * constant like PR_PLAIN. index_n-1 <= index_n, and style_n-1 applies to
988+ * all characters in sourceCode[index_n-1:index_n].
989+ *
990+ * The stylePatterns is a list whose elements have the form
991+ * [style : string, pattern : RegExp, DEPRECATED, shortcut : string].
992+ *
993+ * Style is a style constant like PR_PLAIN, or can be a string of the
994+ * form 'lang-FOO', where FOO is a language extension describing the
995+ * language of the portion of the token in $1 after pattern executes.
996+ * E.g., if style is 'lang-lisp', and group 1 contains the text
997+ * '(hello (world))', then that portion of the token will be passed to the
998+ * registered lisp handler for formatting.
999+ * The text before and after group 1 will be restyled using this decorator
1000+ * so decorators should take care that this doesn't result in infinite
1001+ * recursion. For example, the HTML lexer rule for SCRIPT elements looks
1002+ * something like ['lang-js', /<[s]cript>(.+?)<\/script>/]. This may match
1003+ * '<script>foo()<\/script>', which would cause the current decorator to
1004+ * be called with '<script>' which would not match the same rule since
1005+ * group 1 must not be empty, so it would be instead styled as PR_TAG by
1006+ * the generic tag rule. The handler registered for the 'js' extension would
1007+ * then be called with 'foo()', and finally, the current decorator would
1008+ * be called with '<\/script>' which would not match the original rule and
1009+ * so the generic tag rule would identify it as a tag.
1010+ *
1011+ * Pattern must only match prefixes, and if it matches a prefix, then that
1012+ * match is considered a token with the same style.
1013+ *
1014+ * Context is applied to the last non-whitespace, non-comment token
1015+ * recognized.
1016+ *
1017+ * Shortcut is an optional string of characters, any of which, if the first
1018+ * character, gurantee that this pattern and only this pattern matches.
1019+ *
1020+ * @param {Array} shortcutStylePatterns patterns that always start with
1021+ * a known character. Must have a shortcut string.
1022+ * @param {Array} fallthroughStylePatterns patterns that will be tried in
1023+ * order if the shortcut ones fail. May have shortcuts.
1024+ *
1025+ * @return {function (Object)} a
1026+ * function that takes source code and returns a list of decorations.
1027+ */
1028+ function createSimpleLexer(shortcutStylePatterns, fallthroughStylePatterns) {
1029+ var shortcuts = {};
1030+ var tokenizer;
1031+ (function () {
1032+ var allPatterns = shortcutStylePatterns.concat(fallthroughStylePatterns);
1033+ var allRegexs = [];
1034+ var regexKeys = {};
1035+ for (var i = 0, n = allPatterns.length; i < n; ++i) {
1036+ var patternParts = allPatterns[i];
1037+ var shortcutChars = patternParts[3];
1038+ if (shortcutChars) {
1039+ for (var c = shortcutChars.length; --c >= 0;) {
1040+ shortcuts[shortcutChars.charAt(c)] = patternParts;
1041+ }
1042+ }
1043+ var regex = patternParts[1];
1044+ var k = '' + regex;
1045+ if (!regexKeys.hasOwnProperty(k)) {
1046+ allRegexs.push(regex);
1047+ regexKeys[k] = null;
1048+ }
1049+ }
1050+ allRegexs.push(/[\0-\uffff]/);
1051+ tokenizer = combinePrefixPatterns(allRegexs);
1052+ })();
1053+
1054+ var nPatterns = fallthroughStylePatterns.length;
1055+
1056+ /**
1057+ * Lexes job.sourceCode and produces an output array job.decorations of
1058+ * style classes preceded by the position at which they start in
1059+ * job.sourceCode in order.
1060+ *
1061+ * @param {Object} job an object like <pre>{
1062+ * sourceCode: {string} sourceText plain text,
1063+ * basePos: {int} position of job.sourceCode in the larger chunk of
1064+ * sourceCode.
1065+ * }</pre>
1066+ */
1067+ var decorate = function (job) {
1068+ var sourceCode = job.sourceCode, basePos = job.basePos;
1069+ /** Even entries are positions in source in ascending order. Odd enties
1070+ * are style markers (e.g., PR_COMMENT) that run from that position until
1071+ * the end.
1072+ * @type {Array.<number|string>}
1073+ */
1074+ var decorations = [basePos, PR_PLAIN];
1075+ var pos = 0; // index into sourceCode
1076+ var tokens = sourceCode.match(tokenizer) || [];
1077+ var styleCache = {};
1078+
1079+ for (var ti = 0, nTokens = tokens.length; ti < nTokens; ++ti) {
1080+ var token = tokens[ti];
1081+ var style = styleCache[token];
1082+ var match = void 0;
1083+
1084+ var isEmbedded;
1085+ if (typeof style === 'string') {
1086+ isEmbedded = false;
1087+ } else {
1088+ var patternParts = shortcuts[token.charAt(0)];
1089+ if (patternParts) {
1090+ match = token.match(patternParts[1]);
1091+ style = patternParts[0];
1092+ } else {
1093+ for (var i = 0; i < nPatterns; ++i) {
1094+ patternParts = fallthroughStylePatterns[i];
1095+ match = token.match(patternParts[1]);
1096+ if (match) {
1097+ style = patternParts[0];
1098+ break;
1099+ }
1100+ }
1101+
1102+ if (!match) { // make sure that we make progress
1103+ style = PR_PLAIN;
1104+ }
1105+ }
1106+
1107+ isEmbedded = style.length >= 5 && 'lang-' === style.substring(0, 5);
1108+ if (isEmbedded && !(match && typeof match[1] === 'string')) {
1109+ isEmbedded = false;
1110+ style = PR_SOURCE;
1111+ }
1112+
1113+ if (!isEmbedded) { styleCache[token] = style; }
1114+ }
1115+
1116+ var tokenStart = pos;
1117+ pos += token.length;
1118+
1119+ if (!isEmbedded) {
1120+ decorations.push(basePos + tokenStart, style);
1121+ } else { // Treat group 1 as an embedded block of source code.
1122+ var embeddedSource = match[1];
1123+ var embeddedSourceStart = token.indexOf(embeddedSource);
1124+ var embeddedSourceEnd = embeddedSourceStart + embeddedSource.length;
1125+ if (match[2]) {
1126+ // If embeddedSource can be blank, then it would match at the
1127+ // beginning which would cause us to infinitely recurse on the
1128+ // entire token, so we catch the right context in match[2].
1129+ embeddedSourceEnd = token.length - match[2].length;
1130+ embeddedSourceStart = embeddedSourceEnd - embeddedSource.length;
1131+ }
1132+ var lang = style.substring(5);
1133+ // Decorate the left of the embedded source
1134+ appendDecorations(
1135+ basePos + tokenStart,
1136+ token.substring(0, embeddedSourceStart),
1137+ decorate, decorations);
1138+ // Decorate the embedded source
1139+ appendDecorations(
1140+ basePos + tokenStart + embeddedSourceStart,
1141+ embeddedSource,
1142+ langHandlerForExtension(lang, embeddedSource),
1143+ decorations);
1144+ // Decorate the right of the embedded section
1145+ appendDecorations(
1146+ basePos + tokenStart + embeddedSourceEnd,
1147+ token.substring(embeddedSourceEnd),
1148+ decorate, decorations);
1149+ }
1150+ }
1151+ job.decorations = decorations;
1152+ };
1153+ return decorate;
1154+ }
1155+
1156+ /** returns a function that produces a list of decorations from source text.
1157+ *
1158+ * This code treats ", ', and ` as string delimiters, and \ as a string
1159+ * escape. It does not recognize perl's qq() style strings.
1160+ * It has no special handling for double delimiter escapes as in basic, or
1161+ * the tripled delimiters used in python, but should work on those regardless
1162+ * although in those cases a single string literal may be broken up into
1163+ * multiple adjacent string literals.
1164+ *
1165+ * It recognizes C, C++, and shell style comments.
1166+ *
1167+ * @param {Object} options a set of optional parameters.
1168+ * @return {function (Object)} a function that examines the source code
1169+ * in the input job and builds the decoration list.
1170+ */
1171+ function sourceDecorator(options) {
1172+ var shortcutStylePatterns = [], fallthroughStylePatterns = [];
1173+ if (options['tripleQuotedStrings']) {
1174+ // '''multi-line-string''', 'single-line-string', and double-quoted
1175+ shortcutStylePatterns.push(
1176+ [PR_STRING, /^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,
1177+ null, '\'"']);
1178+ } else if (options['multiLineStrings']) {
1179+ // 'multi-line-string', "multi-line-string"
1180+ shortcutStylePatterns.push(
1181+ [PR_STRING, /^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,
1182+ null, '\'"`']);
1183+ } else {
1184+ // 'single-line-string', "single-line-string"
1185+ shortcutStylePatterns.push(
1186+ [PR_STRING,
1187+ /^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,
1188+ null, '"\'']);
1189+ }
1190+ if (options['verbatimStrings']) {
1191+ // verbatim-string-literal production from the C# grammar. See issue 93.
1192+ fallthroughStylePatterns.push(
1193+ [PR_STRING, /^@\"(?:[^\"]|\"\")*(?:\"|$)/, null]);
1194+ }
1195+ var hc = options['hashComments'];
1196+ if (hc) {
1197+ if (options['cStyleComments']) {
1198+ if (hc > 1) { // multiline hash comments
1199+ shortcutStylePatterns.push(
1200+ [PR_COMMENT, /^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/, null, '#']);
1201+ } else {
1202+ // Stop C preprocessor declarations at an unclosed open comment
1203+ shortcutStylePatterns.push(
1204+ [PR_COMMENT, /^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,
1205+ null, '#']);
1206+ }
1207+ // #include <stdio.h>
1208+ fallthroughStylePatterns.push(
1209+ [PR_STRING,
1210+ /^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h(?:h|pp|\+\+)?|[a-z]\w*)>/,
1211+ null]);
1212+ } else {
1213+ shortcutStylePatterns.push([PR_COMMENT, /^#[^\r\n]*/, null, '#']);
1214+ }
1215+ }
1216+ if (options['cStyleComments']) {
1217+ fallthroughStylePatterns.push([PR_COMMENT, /^\/\/[^\r\n]*/, null]);
1218+ fallthroughStylePatterns.push(
1219+ [PR_COMMENT, /^\/\*[\s\S]*?(?:\*\/|$)/, null]);
1220+ }
1221+ if (options['regexLiterals']) {
1222+ /**
1223+ * @const
1224+ */
1225+ var REGEX_LITERAL = (
1226+ // A regular expression literal starts with a slash that is
1227+ // not followed by * or / so that it is not confused with
1228+ // comments.
1229+ '/(?=[^/*])'
1230+ // and then contains any number of raw characters,
1231+ + '(?:[^/\\x5B\\x5C]'
1232+ // escape sequences (\x5C),
1233+ + '|\\x5C[\\s\\S]'
1234+ // or non-nesting character sets (\x5B\x5D);
1235+ + '|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+'
1236+ // finally closed by a /.
1237+ + '/');
1238+ fallthroughStylePatterns.push(
1239+ ['lang-regex',
1240+ new RegExp('^' + REGEXP_PRECEDER_PATTERN + '(' + REGEX_LITERAL + ')')
1241+ ]);
1242+ }
1243+
1244+ var types = options['types'];
1245+ if (types) {
1246+ fallthroughStylePatterns.push([PR_TYPE, types]);
1247+ }
1248+
1249+ if (options['strings']) {
1250+ var strings = ("" + options['strings']).replace(/^ | $/g, '').replace(/-/g, '\\-');
1251+ fallthroughStylePatterns.push(
1252+ [PR_STRING,
1253+ new RegExp('(?:' + strings.replace(/[\s,]+/g, '|') + ')'),
1254+ , null]
1255+ );
1256+ }
1257+
1258+ var keywords = ("" + options['keywords']).replace(/^ | $/g, '');
1259+ if (keywords.length) {
1260+ fallthroughStylePatterns.push(
1261+ [PR_KEYWORD,
1262+ new RegExp('^(?:' + keywords.replace(/[\s,]+/g, '|') + ')\\b'),
1263+ null]);
1264+ }
1265+
1266+ shortcutStylePatterns.push([PR_PLAIN, /^\s+/, null, ' \r\n\t\xA0']);
1267+ if (options['httpdComments']) {
1268+ fallthroughStylePatterns.push(
1269+ [PR_PLAIN, /^.*\S.*#/i, null]
1270+ );
1271+ }
1272+
1273+ fallthroughStylePatterns.push(
1274+ // TODO(mikesamuel): recognize non-latin letters and numerals in idents
1275+ [PR_LITERAL, /^@[a-z_$][a-z_$@0-9]*|\bNULL\b/i, null],
1276+ [PR_LITERAL, CONFIG_OPTIONS, null],
1277+ //[PR_STRING, CONFIG_ENVS, null],
1278+ [PR_TAG, /^\b(AuthzProviderAlias|AuthnProviderAlias|RequireAny|RequireAll|RequireNone|Directory|DirectoryMatch|Location|LocationMatch|VirtualHost|If|Else|ElseIf|Proxy\b|LoadBalancer|Files|FilesMatch|Limit|LimitExcept|IfDefine|IfModule|IfVersion)\b/, null],
1279+ [PR_TYPE, /^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_(t|req|module)\b)/, null],
1280+ [PR_TAG, /^apr_[a-z_0-9]+|ap_[a-z_0-9]+/i, null],
1281+ [PR_PLAIN, /^[a-z_$][a-z_$@0-9\-]*/i, null],
1282+ [PR_LITERAL,
1283+ new RegExp(
1284+ '^(?:'
1285+ // A hex number
1286+ + '0x[a-f0-9]+'
1287+ // An IPv6 Address
1288+ + '|[a-f0-9:]+:[a-f0-9:]+:[a-f0-9:]+:[a-f0-9:]+:[a-f0-9:]+:[a-f0-9:]+'
1289+ // or an octal or decimal number,
1290+ + '|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)'
1291+ // possibly in scientific notation
1292+ + '(?:e[+\\-]?\\d+)?'
1293+ + ')'
1294+ // with an optional modifier like UL for unsigned long
1295+ + '[a-z]*', 'i'),
1296+ null, '0123456789'],
1297+ // Don't treat escaped quotes in bash as starting strings. See issue 144.
1298+ [PR_PLAIN, /^\\[\s\S]?/, null],
1299+ [PR_PUNCTUATION, /^.[^\s\w\.$@\'\"\`\/\#\\]*/, null]);
1300+
1301+ return createSimpleLexer(shortcutStylePatterns, fallthroughStylePatterns);
1302+ }
1303+
1304+ var decorateSource = sourceDecorator({
1305+ 'keywords': ALL_KEYWORDS,
1306+ 'hashComments': true,
1307+ 'cStyleComments': true,
1308+ 'multiLineStrings': true,
1309+ 'regexLiterals': true
1310+ });
1311+
1312+ /**
1313+ * Given a DOM subtree, wraps it in a list, and puts each line into its own
1314+ * list item.
1315+ *
1316+ * @param {Node} node modified in place. Its content is pulled into an
1317+ * HTMLOListElement, and each line is moved into a separate list item.
1318+ * This requires cloning elements, so the input might not have unique
1319+ * IDs after numbering.
1320+ * @param {boolean} isPreformatted true iff white-space in text nodes should
1321+ * be treated as significant.
1322+ */
1323+ function numberLines(node, opt_startLineNum, isPreformatted) {
1324+ var nocode = /(?:^|\s)nocode(?:\s|$)/;
1325+ var lineBreak = /\r\n?|\n/;
1326+
1327+ var document = node.ownerDocument;
1328+
1329+ var li = document.createElement('li');
1330+ while (node.firstChild) {
1331+ li.appendChild(node.firstChild);
1332+ }
1333+ // An array of lines. We split below, so this is initialized to one
1334+ // un-split line.
1335+ var listItems = [li];
1336+
1337+ function walk(node) {
1338+ switch (node.nodeType) {
1339+ case 1: // Element
1340+ if (nocode.test(node.className)) { break; }
1341+ if ('br' === node.nodeName) {
1342+ breakAfter(node);
1343+ // Discard the <BR> since it is now flush against a </LI>.
1344+ if (node.parentNode) {
1345+ node.parentNode.removeChild(node);
1346+ }
1347+ } else {
1348+ for (var child = node.firstChild; child; child = child.nextSibling) {
1349+ walk(child);
1350+ }
1351+ }
1352+ break;
1353+ case 3: case 4: // Text
1354+ if (isPreformatted) {
1355+ var text = node.nodeValue;
1356+ var match = text.match(lineBreak);
1357+ if (match) {
1358+ var firstLine = text.substring(0, match.index);
1359+ node.nodeValue = firstLine;
1360+ var tail = text.substring(match.index + match[0].length);
1361+ if (tail) {
1362+ var parent = node.parentNode;
1363+ parent.insertBefore(
1364+ document.createTextNode(tail), node.nextSibling);
1365+ }
1366+ breakAfter(node);
1367+ if (!firstLine) {
1368+ // Don't leave blank text nodes in the DOM.
1369+ node.parentNode.removeChild(node);
1370+ }
1371+ }
1372+ }
1373+ break;
1374+ }
1375+ }
1376+
1377+ // Split a line after the given node.
1378+ function breakAfter(lineEndNode) {
1379+ // If there's nothing to the right, then we can skip ending the line
1380+ // here, and move root-wards since splitting just before an end-tag
1381+ // would require us to create a bunch of empty copies.
1382+ while (!lineEndNode.nextSibling) {
1383+ lineEndNode = lineEndNode.parentNode;
1384+ if (!lineEndNode) { return; }
1385+ }
1386+
1387+ function breakLeftOf(limit, copy) {
1388+ // Clone shallowly if this node needs to be on both sides of the break.
1389+ var rightSide = copy ? limit.cloneNode(false) : limit;
1390+ var parent = limit.parentNode;
1391+ if (parent) {
1392+ // We clone the parent chain.
1393+ // This helps us resurrect important styling elements that cross lines.
1394+ // E.g. in <i>Foo<br>Bar</i>
1395+ // should be rewritten to <li><i>Foo</i></li><li><i>Bar</i></li>.
1396+ var parentClone = breakLeftOf(parent, 1);
1397+ // Move the clone and everything to the right of the original
1398+ // onto the cloned parent.
1399+ var next = limit.nextSibling;
1400+ parentClone.appendChild(rightSide);
1401+ for (var sibling = next; sibling; sibling = next) {
1402+ next = sibling.nextSibling;
1403+ parentClone.appendChild(sibling);
1404+ }
1405+ }
1406+ return rightSide;
1407+ }
1408+
1409+ var copiedListItem = breakLeftOf(lineEndNode.nextSibling, 0);
1410+
1411+ // Walk the parent chain until we reach an unattached LI.
1412+ for (var parent;
1413+ // Check nodeType since IE invents document fragments.
1414+ (parent = copiedListItem.parentNode) && parent.nodeType === 1;) {
1415+ copiedListItem = parent;
1416+ }
1417+ // Put it on the list of lines for later processing.
1418+ listItems.push(copiedListItem);
1419+ }
1420+
1421+ // Split lines while there are lines left to split.
1422+ for (var i = 0; // Number of lines that have been split so far.
1423+ i < listItems.length; // length updated by breakAfter calls.
1424+ ++i) {
1425+ walk(listItems[i]);
1426+ }
1427+
1428+ // Make sure numeric indices show correctly.
1429+ if (opt_startLineNum === (opt_startLineNum|0)) {
1430+ listItems[0].setAttribute('value', opt_startLineNum);
1431+ }
1432+
1433+ var ol = document.createElement('ol');
1434+ ol.className = 'linenums';
1435+ var offset = Math.max(0, ((opt_startLineNum - 1 /* zero index */)) | 0) || 0;
1436+ for (var i = 0, n = listItems.length; i < n; ++i) {
1437+ li = listItems[i];
1438+ // Stick a class on the LIs so that stylesheets can
1439+ // color odd/even rows, or any other row pattern that
1440+ // is co-prime with 10.
1441+ li.className = 'L' + ((i + offset) % 1);
1442+ if (!li.firstChild) {
1443+ li.appendChild(document.createTextNode('\xA0'));
1444+ }
1445+ ol.appendChild(li);
1446+ }
1447+
1448+ node.appendChild(ol);
1449+ }
1450+
1451+ /**
1452+ * Breaks {@code job.sourceCode} around style boundaries in
1453+ * {@code job.decorations} and modifies {@code job.sourceNode} in place.
1454+ * @param {Object} job like <pre>{
1455+ * sourceCode: {string} source as plain text,
1456+ * spans: {Array.<number|Node>} alternating span start indices into source
1457+ * and the text node or element (e.g. {@code <BR>}) corresponding to that
1458+ * span.
1459+ * decorations: {Array.<number|string} an array of style classes preceded
1460+ * by the position at which they start in job.sourceCode in order
1461+ * }</pre>
1462+ * @private
1463+ */
1464+ function recombineTagsAndDecorations(job) {
1465+ var isIE8OrEarlier = /\bMSIE\s(\d+)/.exec(navigator.userAgent);
1466+ isIE8OrEarlier = isIE8OrEarlier && +isIE8OrEarlier[1] <= 8;
1467+ var newlineRe = /\n/g;
1468+
1469+ var source = job.sourceCode;
1470+ var sourceLength = source.length;
1471+ // Index into source after the last code-unit recombined.
1472+ var sourceIndex = 0;
1473+
1474+ var spans = job.spans;
1475+ var nSpans = spans.length;
1476+ // Index into spans after the last span which ends at or before sourceIndex.
1477+ var spanIndex = 0;
1478+
1479+ var decorations = job.decorations;
1480+ var nDecorations = decorations.length;
1481+ // Index into decorations after the last decoration which ends at or before
1482+ // sourceIndex.
1483+ var decorationIndex = 0;
1484+
1485+ // Remove all zero-length decorations.
1486+ decorations[nDecorations] = sourceLength;
1487+ var decPos, i;
1488+ for (i = decPos = 0; i < nDecorations;) {
1489+ if (decorations[i] !== decorations[i + 2]) {
1490+ decorations[decPos++] = decorations[i++];
1491+ decorations[decPos++] = decorations[i++];
1492+ } else {
1493+ i += 2;
1494+ }
1495+ }
1496+ nDecorations = decPos;
1497+
1498+ // Simplify decorations.
1499+ for (i = decPos = 0; i < nDecorations;) {
1500+ var startPos = decorations[i];
1501+ // Conflate all adjacent decorations that use the same style.
1502+ var startDec = decorations[i + 1];
1503+ var end = i + 2;
1504+ while (end + 2 <= nDecorations && decorations[end + 1] === startDec) {
1505+ end += 2;
1506+ }
1507+ decorations[decPos++] = startPos;
1508+ decorations[decPos++] = startDec;
1509+ i = end;
1510+ }
1511+
1512+ nDecorations = decorations.length = decPos;
1513+
1514+ var sourceNode = job.sourceNode;
1515+ var oldDisplay;
1516+ if (sourceNode) {
1517+ oldDisplay = sourceNode.style.display;
1518+ sourceNode.style.display = 'none';
1519+ }
1520+ try {
1521+ var decoration = null;
1522+ var X = 0;
1523+ while (spanIndex < nSpans) {
1524+ X = X + 1;
1525+ if (X > 5000) { break; }
1526+ var spanStart = spans[spanIndex];
1527+ var spanEnd = spans[spanIndex + 2] || sourceLength;
1528+
1529+ var decEnd = decorations[decorationIndex + 2] || sourceLength;
1530+
1531+ var end = Math.min(spanEnd, decEnd);
1532+
1533+ var textNode = spans[spanIndex + 1];
1534+ var styledText;
1535+ if (textNode.nodeType !== 1 // Don't muck with <BR>s or <LI>s
1536+ // Don't introduce spans around empty text nodes.
1537+ && (styledText = source.substring(sourceIndex, end))) {
1538+ // This may seem bizarre, and it is. Emitting LF on IE causes the
1539+ // code to display with spaces instead of line breaks.
1540+ // Emitting Windows standard issue linebreaks (CRLF) causes a blank
1541+ // space to appear at the beginning of every line but the first.
1542+ // Emitting an old Mac OS 9 line separator makes everything spiffy.
1543+ if (isIE8OrEarlier) {
1544+ styledText = styledText.replace(newlineRe, '\r');
1545+ }
1546+ textNode.nodeValue = styledText;
1547+ var document = textNode.ownerDocument;
1548+ var span = document.createElement('span');
1549+ span.className = decorations[decorationIndex + 1];
1550+ var parentNode = textNode.parentNode;
1551+ parentNode.replaceChild(span, textNode);
1552+ span.appendChild(textNode);
1553+ if (sourceIndex < spanEnd) { // Split off a text node.
1554+ spans[spanIndex + 1] = textNode
1555+ // TODO: Possibly optimize by using '' if there's no flicker.
1556+ = document.createTextNode(source.substring(end, spanEnd));
1557+ parentNode.insertBefore(textNode, span.nextSibling);
1558+ }
1559+ }
1560+
1561+ sourceIndex = end;
1562+
1563+ if (sourceIndex >= spanEnd) {
1564+ spanIndex += 2;
1565+ }
1566+ if (sourceIndex >= decEnd) {
1567+ decorationIndex += 2;
1568+ }
1569+ }
1570+ } finally {
1571+ if (sourceNode) {
1572+ sourceNode.style.display = oldDisplay;
1573+ }
1574+ }
1575+ }
1576+
1577+
1578+ /** Maps language-specific file extensions to handlers. */
1579+ var langHandlerRegistry = {};
1580+ /** Register a language handler for the given file extensions.
1581+ * @param {function (Object)} handler a function from source code to a list
1582+ * of decorations. Takes a single argument job which describes the
1583+ * state of the computation. The single parameter has the form
1584+ * {@code {
1585+ * sourceCode: {string} as plain text.
1586+ * decorations: {Array.<number|string>} an array of style classes
1587+ * preceded by the position at which they start in
1588+ * job.sourceCode in order.
1589+ * The language handler should assigned this field.
1590+ * basePos: {int} the position of source in the larger source chunk.
1591+ * All positions in the output decorations array are relative
1592+ * to the larger source chunk.
1593+ * } }
1594+ * @param {Array.<string>} fileExtensions
1595+ */
1596+ function registerLangHandler(handler, fileExtensions) {
1597+ for (var i = fileExtensions.length; --i >= 0;) {
1598+ var ext = fileExtensions[i];
1599+ if (!langHandlerRegistry.hasOwnProperty(ext)) {
1600+ langHandlerRegistry[ext] = handler;
1601+ } else if (win['console']) {
1602+ console['warn']('cannot override language handler %s', ext);
1603+ }
1604+ }
1605+ }
1606+ function langHandlerForExtension(extension, source) {
1607+ if (!(extension && langHandlerRegistry.hasOwnProperty(extension))) {
1608+ // Treat it as markup if the first non whitespace character is a < and
1609+ // the last non-whitespace character is a >.
1610+ extension = /^\s*</.test(source)
1611+ ? 'default-markup'
1612+ : 'default-code';
1613+ }
1614+ return langHandlerRegistry[extension];
1615+ }
1616+ registerLangHandler(decorateSource, ['default-code']);
1617+ registerLangHandler(
1618+ createSimpleLexer(
1619+ [],
1620+ [
1621+ [PR_PLAIN, /^[^<?]+/],
1622+ [PR_DECLARATION, /^<!\w[^>]*(?:>|$)/],
1623+ [PR_COMMENT, /^<\!--[\s\S]*?(?:-\->|$)/],
1624+ // Unescaped content in an unknown language
1625+ ['lang-', /^<\?([\s\S]+?)(?:\?>|$)/],
1626+ ['lang-', /^<%([\s\S]+?)(?:%>|$)/],
1627+ [PR_PUNCTUATION, /^(?:<[%?]|[%?]>)/],
1628+ ['lang-', /^<xmp\b[^>]*>([\s\S]+?)<\/xmp\b[^>]*>/i],
1629+ // Unescaped content in javascript. (Or possibly vbscript).
1630+ ['lang-js', /^<script\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],
1631+ // Contains unescaped stylesheet content
1632+ ['lang-css', /^<style\b[^>]*>([\s\S]*?)(<\/style\b[^>]*>)/i],
1633+ ['lang-in.tag', /^(<\/?[a-z][^<>]*>)/i]
1634+ ]),
1635+ ['default-markup', 'htm', 'html', 'mxml', 'xhtml', 'xml', 'xsl']);
1636+ registerLangHandler(
1637+ createSimpleLexer(
1638+ [
1639+ [PR_PLAIN, /^[\s]+/, null, ' \t\r\n'],
1640+ [PR_ATTRIB_VALUE, /^(?:\"[^\"]*\"?|\'[^\']*\'?)/, null, '\"\'']
1641+ ],
1642+ [
1643+ [PR_TAG, /^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],
1644+ [PR_ATTRIB_NAME, /^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],
1645+ ['lang-uq.val', /^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],
1646+ [PR_PUNCTUATION, /^[=<>\/]+/],
1647+ ['lang-js', /^on\w+\s*=\s*\"([^\"]+)\"/i],
1648+ ['lang-js', /^on\w+\s*=\s*\'([^\']+)\'/i],
1649+ ['lang-js', /^on\w+\s*=\s*([^\"\'>\s]+)/i],
1650+ ['lang-css', /^style\s*=\s*\"([^\"]+)\"/i],
1651+ ['lang-css', /^style\s*=\s*\'([^\']+)\'/i],
1652+ ['lang-css', /^style\s*=\s*([^\"\'>\s]+)/i]
1653+ ]),
1654+ ['in.tag']);
1655+ registerLangHandler(
1656+ createSimpleLexer([], [[PR_ATTRIB_VALUE, /^[\s\S]+/]]), ['uq.val']);
1657+ registerLangHandler(sourceDecorator({
1658+ 'keywords': CPP_KEYWORDS,
1659+ 'hashComments': true,
1660+ 'cStyleComments': true,
1661+ 'types': C_TYPES
1662+ }), ['c', 'cc', 'cpp', 'cxx', 'cyc', 'm']);
1663+ registerLangHandler(sourceDecorator({
1664+ 'keywords': PHP_KEYWORDS,
1665+ 'hashComments': false,
1666+ 'cStyleComments': true,
1667+ 'multiLineStrings': true,
1668+ 'regexLiterals': true
1669+// 'types': C_TYPES,
1670+ }), ['php', 'phtml', 'inc']);
1671+ registerLangHandler(sourceDecorator({
1672+ 'keywords': 'null,true,false'
1673+ }), ['json']);
1674+ registerLangHandler(sourceDecorator({
1675+ 'keywords': CSHARP_KEYWORDS,
1676+ 'hashComments': true,
1677+ 'cStyleComments': true,
1678+ 'verbatimStrings': true,
1679+ 'types': C_TYPES
1680+ }), ['cs']);
1681+ registerLangHandler(sourceDecorator({
1682+ 'keywords': JAVA_KEYWORDS,
1683+ 'cStyleComments': true
1684+ }), ['java']);
1685+ registerLangHandler(sourceDecorator({
1686+ 'keywords': SH_KEYWORDS,
1687+ 'hashComments': true,
1688+ 'multiLineStrings': true
1689+ }), ['bsh', 'csh', 'sh']);
1690+ registerLangHandler(sourceDecorator({
1691+ 'keywords': PYTHON_KEYWORDS,
1692+ 'hashComments': true,
1693+ 'multiLineStrings': true,
1694+ 'tripleQuotedStrings': true
1695+ }), ['cv', 'py']);
1696+ registerLangHandler(sourceDecorator({
1697+ 'keywords': PERL_KEYWORDS,
1698+ 'hashComments': true,
1699+ 'multiLineStrings': true,
1700+ 'regexLiterals': true
1701+ }), ['perl', 'pl', 'pm']);
1702+ registerLangHandler(sourceDecorator({
1703+ 'keywords': RUBY_KEYWORDS,
1704+ 'hashComments': true,
1705+ 'multiLineStrings': true,
1706+ 'regexLiterals': true
1707+ }), ['rb']);
1708+ registerLangHandler(sourceDecorator({
1709+ 'keywords': JSCRIPT_KEYWORDS,
1710+ 'cStyleComments': true,
1711+ 'regexLiterals': true
1712+ }), ['js']);
1713+ registerLangHandler(sourceDecorator({
1714+ 'keywords': COFFEE_KEYWORDS,
1715+ 'hashComments': 3, // ### style block comments
1716+ 'cStyleComments': true,
1717+ 'multilineStrings': true,
1718+ 'tripleQuotedStrings': true,
1719+ 'regexLiterals': true
1720+ }), ['coffee']);
1721+ registerLangHandler(
1722+ createSimpleLexer([], [[PR_STRING, /^[\s\S]+/]]), ['regex']);
1723+ registerLangHandler(sourceDecorator({
1724+ 'keywords': CONFIG_KEYWORDS,
1725+ 'literals': CONFIG_OPTIONS,
1726+ 'strings': CONFIG_ENVS,
1727+ 'hashComments': true,
1728+ 'cStyleComments': false,
1729+ 'multiLineStrings': false,
1730+ 'regexLiterals': false,
1731+ 'httpdComments': true
1732+ }), ['config']);
1733+
1734+ function applyDecorator(job) {
1735+ var opt_langExtension = job.langExtension;
1736+
1737+ try {
1738+ // Extract tags, and convert the source code to plain text.
1739+ var sourceAndSpans = extractSourceSpans(job.sourceNode, job.pre);
1740+ /** Plain text. @type {string} */
1741+ var source = sourceAndSpans.sourceCode;
1742+ job.sourceCode = source;
1743+ job.spans = sourceAndSpans.spans;
1744+ job.basePos = 0;
1745+
1746+ // Apply the appropriate language handler
1747+ langHandlerForExtension(opt_langExtension, source)(job);
1748+
1749+ // Integrate the decorations and tags back into the source code,
1750+ // modifying the sourceNode in place.
1751+ recombineTagsAndDecorations(job);
1752+ } catch (e) {
1753+ if (win['console']) {
1754+ console['log'](e && e['stack'] ? e['stack'] : e);
1755+ }
1756+ }
1757+ }
1758+
1759+ /**
1760+ * @param sourceCodeHtml {string} The HTML to pretty print.
1761+ * @param opt_langExtension {string} The language name to use.
1762+ * Typically, a filename extension like 'cpp' or 'java'.
1763+ * @param opt_numberLines {number|boolean} True to number lines,
1764+ * or the 1-indexed number of the first line in sourceCodeHtml.
1765+ */
1766+ function prettyPrintOne(sourceCodeHtml, opt_langExtension, opt_numberLines) {
1767+ var container = document.createElement('pre');
1768+ // This could cause images to load and onload listeners to fire.
1769+ // E.g. <img onerror="alert(1337)" src="nosuchimage.png">.
1770+ // We assume that the inner HTML is from a trusted source.
1771+ container.innerHTML = sourceCodeHtml;
1772+ if (opt_numberLines) {
1773+ numberLines(container, opt_numberLines, true);
1774+ }
1775+
1776+ var job = {
1777+ langExtension: opt_langExtension,
1778+ numberLines: opt_numberLines,
1779+ sourceNode: container,
1780+ pre: 1
1781+ };
1782+ applyDecorator(job);
1783+ return container.innerHTML;
1784+ }
1785+
1786+ function prettyPrint(opt_whenDone) {
1787+ function byTagName(tn) { return document.getElementsByTagName(tn); }
1788+ // fetch a list of nodes to rewrite
1789+ var codeSegments = [byTagName('pre'), byTagName('code'), byTagName('xmp')];
1790+ var elements = [];
1791+ for (var i = 0; i < codeSegments.length; ++i) {
1792+ for (var j = 0, n = codeSegments[i].length; j < n; ++j) {
1793+ elements.push(codeSegments[i][j]);
1794+ }
1795+ }
1796+ codeSegments = null;
1797+
1798+ var clock = Date;
1799+ if (!clock['now']) {
1800+ clock = { 'now': function () { return +(new Date); } };
1801+ }
1802+
1803+ // The loop is broken into a series of continuations to make sure that we
1804+ // don't make the browser unresponsive when rewriting a large page.
1805+ var k = 0;
1806+ var prettyPrintingJob;
1807+
1808+ var langExtensionRe = /\blang(?:uage)?-([\w.]+)(?!\S)/;
1809+ var prettyPrintRe = /\bprettyprint\b/;
1810+ var prettyPrintedRe = /\bprettyprinted\b/;
1811+ var preformattedTagNameRe = /pre|xmp/i;
1812+ var codeRe = /^code$/i;
1813+ var preCodeXmpRe = /^(?:pre|code|xmp)$/i;
1814+
1815+ function doWork() {
1816+ var endTime = (win['PR_SHOULD_USE_CONTINUATION'] ?
1817+ clock['now']() + 250 /* ms */ :
1818+ Infinity);
1819+ for (; k < elements.length && clock['now']() < endTime; k++) {
1820+ var cs = elements[k];
1821+ var className = cs.className;
1822+ if (prettyPrintRe.test(className)
1823+ // Don't redo this if we've already done it.
1824+ // This allows recalling pretty print to just prettyprint elements
1825+ // that have been added to the page since last call.
1826+ && !prettyPrintedRe.test(className)) {
1827+
1828+ // make sure this is not nested in an already prettified element
1829+ var nested = false;
1830+ for (var p = cs.parentNode; p; p = p.parentNode) {
1831+ var tn = p.tagName;
1832+ if (preCodeXmpRe.test(tn)
1833+ && p.className && prettyPrintRe.test(p.className)) {
1834+ nested = true;
1835+ break;
1836+ }
1837+ }
1838+ if (!nested) {
1839+ // Mark done. If we fail to prettyprint for whatever reason,
1840+ // we shouldn't try again.
1841+ cs.className += ' prettyprinted';
1842+
1843+ // If the classes includes a language extensions, use it.
1844+ // Language extensions can be specified like
1845+ // <pre class="prettyprint lang-cpp">
1846+ // the language extension "cpp" is used to find a language handler
1847+ // as passed to PR.registerLangHandler.
1848+ // HTML5 recommends that a language be specified using "language-"
1849+ // as the prefix instead. Google Code Prettify supports both.
1850+ // http://dev.w3.org/html5/spec-author-view/the-code-element.html
1851+ var langExtension = className.match(langExtensionRe);
1852+ // Support <pre class="prettyprint"><code class="language-c">
1853+ var wrapper;
1854+ if (!langExtension && (wrapper = childContentWrapper(cs))
1855+ && codeRe.test(wrapper.tagName)) {
1856+ langExtension = wrapper.className.match(langExtensionRe);
1857+ }
1858+
1859+ if (langExtension) { langExtension = langExtension[1]; }
1860+
1861+ var preformatted;
1862+ if (preformattedTagNameRe.test(cs.tagName)) {
1863+ preformatted = 1;
1864+ } else {
1865+ var currentStyle = cs['currentStyle'];
1866+ var whitespace = (
1867+ currentStyle
1868+ ? currentStyle['whiteSpace']
1869+ : (document.defaultView
1870+ && document.defaultView.getComputedStyle)
1871+ ? document.defaultView.getComputedStyle(cs, null)
1872+ .getPropertyValue('white-space')
1873+ : 0);
1874+ preformatted = whitespace
1875+ && 'pre' === whitespace.substring(0, 3);
1876+ }
1877+
1878+ // Look for a class like linenums or linenums:<n> where <n> is the
1879+ // 1-indexed number of the first line.
1880+ var lineNums = cs.className.match(/\blinenums\b(?::(\d+))?/);
1881+ lineNums = lineNums
1882+ ? lineNums[1] && lineNums[1].length ? +lineNums[1] : true
1883+ : false;
1884+ if (lineNums) { numberLines(cs, lineNums, preformatted); }
1885+
1886+ // do the pretty printing
1887+ prettyPrintingJob = {
1888+ langExtension: langExtension,
1889+ sourceNode: cs,
1890+ numberLines: lineNums,
1891+ pre: preformatted
1892+ };
1893+ applyDecorator(prettyPrintingJob);
1894+ }
1895+ }
1896+ }
1897+ if (k < elements.length) {
1898+ // finish up in a continuation
1899+ setTimeout(doWork, 250);
1900+ } else if (opt_whenDone) {
1901+ opt_whenDone();
1902+ }
1903+ }
1904+
1905+ doWork();
1906+ }
1907+
1908+ /**
1909+ * Contains functions for creating and registering new language handlers.
1910+ * @type {Object}
1911+ */
1912+ var PR = win['PR'] = {
1913+ 'createSimpleLexer': createSimpleLexer,
1914+ 'registerLangHandler': registerLangHandler,
1915+ 'sourceDecorator': sourceDecorator,
1916+ 'PR_ATTRIB_NAME': PR_ATTRIB_NAME,
1917+ 'PR_ATTRIB_VALUE': PR_ATTRIB_VALUE,
1918+ 'PR_COMMENT': PR_COMMENT,
1919+ 'PR_DECLARATION': PR_DECLARATION,
1920+ 'PR_KEYWORD': PR_KEYWORD,
1921+ 'PR_LITERAL': PR_LITERAL,
1922+ 'PR_NOCODE': PR_NOCODE,
1923+ 'PR_PLAIN': PR_PLAIN,
1924+ 'PR_PUNCTUATION': PR_PUNCTUATION,
1925+ 'PR_SOURCE': PR_SOURCE,
1926+ 'PR_STRING': PR_STRING,
1927+ 'PR_TAG': PR_TAG,
1928+ 'PR_TYPE': PR_TYPE,
1929+ 'prettyPrintOne': win['prettyPrintOne'] = prettyPrintOne,
1930+ 'prettyPrint': win['prettyPrint'] = prettyPrint
1931+ };
1932+
1933+
1934+/* Register Lua syntaxes */
1935+ PR['registerLangHandler'](
1936+ PR['createSimpleLexer'](
1937+ [
1938+ // Whitespace
1939+ [PR['PR_PLAIN'], /^[\t\n\r \xA0]+/, null, '\t\n\r \xA0'],
1940+ // A double or single quoted, possibly multi-line, string.
1941+ [PR['PR_STRING'], /^(?:\"(?:[^\"\\]|\\[\s\S])*(?:\"|$)|\'(?:[^\'\\]|\\[\s\S])*(?:\'|$))/, null, '"\'']
1942+ ],
1943+ [
1944+ // A comment is either a line comment that starts with two dashes, or
1945+ // two dashes preceding a long bracketed block.
1946+ [PR['PR_COMMENT'], /^--(?:\[(=*)\[[\s\S]*?(?:\]\1\]|$)|[^\r\n]*)/],
1947+ [PR['PR_TYPE'], /^nil|false|true/],
1948+ // A long bracketed block not preceded by -- is a string.
1949+ [PR['PR_STRING'], /^\[(=*)\[[\s\S]*?(?:\]\1\]|$)/],
1950+ [PR['PR_KEYWORD'], /^(?:and|break|do|else|elseif|end|for|function|if|in|local|not|or|repeat|require|return|then|until|while)\b/, null],
1951+ // A number is a hex integer literal, a decimal real literal, or in
1952+ // scientific notation.
1953+ [PR['PR_LITERAL'],
1954+ /^[+-]?(?:0x[\da-f]+|(?:(?:\.\d+|\d+(?:\.\d*)?)(?:e[+\-]?\d+)?))/i],
1955+ // An identifier
1956+ [PR['PR_PLAIN'], /^[a-z_]\w*/i],
1957+ // A run of punctuation
1958+ [PR['PR_PUNCTUATION'], /^[^\w\t\n\r \xA0][^\w\t\n\r \xA0\"\'\-\+=]*/]
1959+ ]),
1960+ ['lua']);
1961+
1962+
1963+ // Make PR available via the Asynchronous Module Definition (AMD) API.
1964+ // Per https://github.com/amdjs/amdjs-api/wiki/AMD:
1965+ // The Asynchronous Module Definition (AMD) API specifies a
1966+ // mechanism for defining modules such that the module and its
1967+ // dependencies can be asynchronously loaded.
1968+ // ...
1969+ // To allow a clear indicator that a global define function (as
1970+ // needed for script src browser loading) conforms to the AMD API,
1971+ // any global define function SHOULD have a property called "amd"
1972+ // whose value is an object. This helps avoid conflict with any
1973+ // other existing JavaScript code that could have defined a define()
1974+ // function that does not conform to the AMD API.
1975+ if (typeof define === "function" && define['amd']) {
1976+ define("google-code-prettify", [], function () {
1977+ return PR;
1978+ });
1979+ }
1980+})();
1981diff --git a/docs/manual/style/scripts/prettify.min.js b/docs/manual/style/scripts/prettify.min.js
1982new file mode 100644
1983index 0000000..bd72256
1984--- /dev/null
1985+++ b/docs/manual/style/scripts/prettify.min.js
1986@@ -0,0 +1,124 @@
1987+// see prettify.js for copyright, license and expanded version
1988+window['PR_SHOULD_USE_CONTINUATION']=true;var prettyPrintOne;var prettyPrint;(function(){var win=window;var FLOW_CONTROL_KEYWORDS=["break,continue,do,else,for,if,return,while"];var C_KEYWORDS=[FLOW_CONTROL_KEYWORDS,"auto,case,char,const,default,"+"double,enum,extern,float,goto,int,long,register,short,signed,sizeof,module,"+"static,struct,switch,typedef,union,unsigned,void,volatile"];var COMMON_KEYWORDS=[C_KEYWORDS,"catch,class,delete,false,import,"+"new,operator,private,protected,public,this,throw,true,try,typeof"];var CPP_KEYWORDS=[COMMON_KEYWORDS,"alignof,align_union,asm,axiom,bool,"+"concept,concept_map,const_cast,constexpr,decltype,"+"dynamic_cast,explicit,export,friend,inline,late_check,"+"mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,"+"template,typeid,typename,using,virtual,where,request_req"];var JAVA_KEYWORDS=[COMMON_KEYWORDS,"abstract,boolean,byte,extends,final,finally,implements,import,"+"instanceof,null,native,package,strictfp,super,synchronized,throws,"+"transient"];var CSHARP_KEYWORDS=[JAVA_KEYWORDS,"as,base,by,checked,decimal,delegate,descending,dynamic,event,"+"fixed,foreach,from,group,implicit,in,interface,internal,into,is,let,"+"lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,"+"sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,"+"var,virtual,where"];var COFFEE_KEYWORDS="all,and,by,catch,class,else,extends,false,finally,"+"for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,"+"throw,true,try,unless,until,when,while,yes";var JSCRIPT_KEYWORDS=[COMMON_KEYWORDS,"debugger,eval,export,function,get,null,set,undefined,var,with,"+"Infinity,NaN"];var PERL_KEYWORDS="caller,delete,die,do,dump,else,elsif,eval,exit,foreach,for,"+"goto,if,import,last,local,my,next,no,our,print,printf,package,redo,require,"+"sub,undef,unless,until,use,wantarray,while,BEGIN,END";var PHP_KEYWORDS="abstract,and,array,as,break,case,catch,cfunction,class,"+"clone,const,continue,declare,default,do,else,elseif,enddeclare,endfor,"+"endforeach,endif,endswitch,endwhile,extends,final,for,foreach,function,"+"global,goto,if,implements,interface,instanceof,namespace,new,old_function,"+"or,private,protected,public,static,switch,throw,try,use,var,while,xor,"+"die,echo,empty,exit,eval,include,include_once,isset,list,require,"+"require_once,return,print,unset";var PYTHON_KEYWORDS=[FLOW_CONTROL_KEYWORDS,"and,as,assert,class,def,del,"+"elif,except,exec,finally,from,global,import,in,is,lambda,"+"nonlocal,not,or,pass,print,raise,try,with,yield,"+"False,True,None"];var RUBY_KEYWORDS=[FLOW_CONTROL_KEYWORDS,"alias,and,begin,case,class,"+"def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,"+"rescue,retry,self,super,then,true,undef,unless,until,when,yield,"+"BEGIN,END"];var SH_KEYWORDS=[FLOW_CONTROL_KEYWORDS,"case,done,elif,esac,eval,fi,"+"function,in,local,set,then,until,echo"];var CONFIG_ENVS=["User-Agent,HTTP_USER_AGENT,HTTP_REFERER,HTTP_COOKIE,HTTP_FORWARDED,HTTP_HOST,HTTP_PROXY_CONNECTION,HTTP_ACCEPT,REMOTE_ADDR,REMOTE_HOST,REMOTE_PORT,REMOTE_USER,REMOTE_IDENT,REQUEST_METHOD,SCRIPT_FILENAME,PATH_INFO,QUERY_STRING,AUTH_TYPE,DOCUMENT_ROOT,SERVER_ADMIN,SERVER_NAME,SERVER_ADDR,SERVER_PORT,SERVER_PROTOCOL,SERVER_SOFTWARE,TIME_YEAR,TIME_MON,TIME_DAY,TIME_HOUR,TIME_MIN,TIME_SEC,TIME_WDAY,TIME,API_VERSION,THE_REQUEST,REQUEST_URI,REQUEST_FILENAME,IS_SUBREQ,HTTPS,REQUEST_SCHEME"];var CONFIG_KEYWORDS=["<AuthnProviderAlias>,<AuthzProviderAlias>,<Directory>,<DirectoryMatch>,<Else>,<ElseIf>,<Files>,<FilesMatch>,<If>,<IfDefine>,<IfModule>,<IfVersion>,<Limit>,<LimitExcept>,<Location>,<LocationMatch>,<MDomainSet>,<Macro>,<Proxy>,<ProxyMatch>,<RequireAll>,<RequireAny>,<RequireNone>,<VirtualHost>,AcceptFilter,AcceptPathInfo,AccessFileName,Action,AddAlt,AddAltByEncoding,AddAltByType,AddCharset,AddDefaultCharset,AddDescription,AddEncoding,AddHandler,AddIcon,AddIconByEncoding,AddIconByType,AddInputFilter,AddLanguage,AddModuleInfo,AddOutputFilter,AddOutputFilterByType,AddType,Alias,AliasMatch,Allow,AllowCONNECT,AllowEncodedSlashes,AllowMethods,AllowOverride,AllowOverrideList,Anonymous,Anonymous_LogEmail,Anonymous_MustGiveEmail,Anonymous_NoUserID,Anonymous_VerifyEmail,AsyncRequestWorkerFactor,AuthBasicAuthoritative,AuthBasicFake,AuthBasicProvider,AuthBasicUseDigestAlgorithm,AuthDBDUserPWQuery,AuthDBDUserRealmQuery,AuthDBMGroupFile,AuthDBMType,AuthDBMUserFile,AuthDigestAlgorithm,AuthDigestDomain,AuthDigestNonceLifetime,AuthDigestProvider,AuthDigestQop,AuthDigestShmemSize,AuthFormAuthoritative,AuthFormBody,AuthFormDisableNoStore,AuthFormFakeBasicAuth,AuthFormLocation,AuthFormLoginRequiredLocation,AuthFormLoginSuccessLocation,AuthFormLogoutLocation,AuthFormMethod,AuthFormMimetype,AuthFormPassword,AuthFormProvider,AuthFormSitePassphrase,AuthFormSize,AuthFormUsername,AuthGroupFile,AuthLDAPAuthorizePrefix,AuthLDAPBindAuthoritative,AuthLDAPBindDN,AuthLDAPBindPassword,AuthLDAPCharsetConfig,AuthLDAPCompareAsUser,AuthLDAPCompareDNOnServer,AuthLDAPDereferenceAliases,AuthLDAPGroupAttribute,AuthLDAPGroupAttributeIsDN,AuthLDAPInitialBindAsUser,AuthLDAPInitialBindPattern,AuthLDAPMaxSubGroupDepth,AuthLDAPRemoteUserAttribute,AuthLDAPRemoteUserIsDN,AuthLDAPSearchAsUser,AuthLDAPSubGroupAttribute,AuthLDAPSubGroupClass,AuthLDAPUrl,AuthMerging,AuthName,AuthType,AuthUserFile,AuthnCacheContext,AuthnCacheEnable,AuthnCacheProvideFor,AuthnCacheSOCache,AuthnCacheTimeout,AuthnzFcgiCheckAuthnProvider,AuthnzFcgiDefineProvider,AuthzDBDLoginToReferer,AuthzDBDQuery,AuthzDBDRedirectQuery,AuthzDBMType,AuthzSendForbiddenOnFailure,BalancerGrowth,BalancerInherit,BalancerMember,BalancerPersist,BrotliAlterETag,BrotliCompressionMaxInputBlock,BrotliCompressionQuality,BrotliCompressionWindow,BrotliFilterNote,BrowserMatch,BrowserMatchNoCase,BufferSize,BufferedLogs,CGIDScriptTimeout,CGIMapExtension,CGIPassAuth,CGIVar,CacheDefaultExpire,CacheDetailHeader,CacheDirLength,CacheDirLevels,CacheDisable,CacheEnable,CacheFile,CacheHeader,CacheIgnoreCacheControl,CacheIgnoreHeaders,CacheIgnoreNoLastMod,CacheIgnoreQueryString,CacheIgnoreURLSessionIdentifiers,CacheKeyBaseURL,CacheLastModifiedFactor,CacheLock,CacheLockMaxAge,CacheLockPath,CacheMaxExpire,CacheMaxFileSize,CacheMinExpire,CacheMinFileSize,CacheNegotiatedDocs,CacheQuickHandler,CacheReadSize,CacheReadTime,CacheRoot,CacheSocache,CacheSocacheMaxSize,CacheSocacheMaxTime,CacheSocacheMinTime,CacheSocacheReadSize,CacheSocacheReadTime,CacheStaleOnError,CacheStoreExpired,CacheStoreNoStore,CacheStorePrivate,CharsetDefault,CharsetOptions,CharsetSourceEnc,CheckCaseOnly,CheckSpelling,ChrootDir,ContentDigest,CookieDomain,CookieExpires,CookieName,CookieStyle,CookieTracking,CoreDumpDirectory,CustomLog,DBDExptime,DBDInitSQL,DBDKeep,DBDMax,DBDMin,DBDParams,DBDPersist,DBDPrepareSQL,DBDriver,DTracePrivileges,Dav,DavDepthInfinity,DavGenericLockDB,DavLockDB,DavMinTimeout,DefaultIcon,DefaultLanguage,DefaultRuntimeDir,DefaultType,Define,DeflateBufferSize,DeflateCompressionLevel,DeflateFilterNote,DeflateInflateLimitRequestBody,DeflateInflateRatioBurst,DeflateInflateRatioLimit,DeflateMemLevel,DeflateWindowSize,Deny,DirectoryCheckHandler,DirectoryIndex,DirectoryIndexRedirect,DirectorySlash,DocumentRoot,DumpIOInput,DumpIOOutput,EnableExceptionHook,EnableMMAP,EnableSendfile,Error,ErrorDocument,ErrorLog,ErrorLogFormat,Example,ExpiresActive,ExpiresByType,ExpiresDefault,ExtFilterDefine,ExtFilterOptions,ExtendedStatus,FallbackResource,FileETag,FilterChain,FilterDeclare,FilterProtocol,FilterProvider,FilterTrace,ForceLanguagePriority,ForceType,ForensicLog,GlobalLog,GprofDir,GracefulShutdownTimeout,Group,H2CopyFiles,H2Direct,H2EarlyHints,H2MaxSessionStreams,H2MaxWorkerIdleSeconds,H2MaxWorkers,H2MinWorkers,H2ModernTLSOnly,H2Push,H2PushDiarySize,H2PushPriority,H2PushResource,H2SerializeHeaders,H2StreamMaxMemSize,H2TLSCoolDownSecs,H2TLSWarmUpSize,H2Upgrade,H2WindowSize,Header,HeaderName,HeartbeatAddress,HeartbeatListen,HeartbeatMaxServers,HeartbeatStorage,HeartbeatStorage,HostnameLookups,HttpProtocolOptions,ISAPIAppendLogToErrors,ISAPIAppendLogToQuery,ISAPICacheFile,ISAPIFakeAsync,ISAPILogNotSupported,ISAPIReadAheadBuffer,IdentityCheck,IdentityCheckTimeout,ImapBase,ImapDefault,ImapMenu,Include,IncludeOptional,IndexHeadInsert,IndexIgnore,IndexIgnoreReset,IndexOptions,IndexOrderDefault,IndexStyleSheet,InputSed,KeepAlive,KeepAliveTimeout,KeptBodySize,LDAPCacheEntries,LDAPCacheTTL,LDAPConnectionPoolTTL,LDAPConnectionTimeout,LDAPLibraryDebug,LDAPOpCacheEntries,LDAPOpCacheTTL,LDAPReferralHopLimit,LDAPReferrals,LDAPRetries,LDAPRetryDelay,LDAPSharedCacheFile,LDAPSharedCacheSize,LDAPTimeout,LDAPTrustedClientCert,LDAPTrustedGlobalCert,LDAPTrustedMode,LDAPVerifyServerCert,LanguagePriority,LimitInternalRecursion,LimitRequestBody,LimitRequestFieldSize,LimitRequestFields,LimitRequestLine,LimitXMLRequestBody,Listen,ListenBackLog,ListenCoresBucketsRatio,LoadFile,LoadModule,LogFormat,LogIOTrackTTFB,LogLevel,LogMessage,LuaAuthzProvider,LuaCodeCache,LuaHookAccessChecker,LuaHookAuthChecker,LuaHookCheckUserID,LuaHookFixups,LuaHookInsertFilter,LuaHookLog,LuaHookMapToStorage,LuaHookTranslateName,LuaHookTypeChecker,LuaInherit,LuaInputFilter,LuaMapHandler,LuaOutputFilter,LuaPackageCPath,LuaPackagePath,LuaQuickHandler,LuaRoot,LuaScope,MDBaseServer,MDCAChallenges,MDCertificateAgreement,MDCertificateAuthority,MDCertificateProtocol,MDDriveMode,MDHttpProxy,MDMember,MDMembers,MDMustStaple,MDNotifyCmd,MDPortMap,MDPrivateKeys,MDRenewWindow,MDRequireHttps,MDStoreDir,MDomain,MMapFile,MaxConnectionsPerChild,MaxKeepAliveRequests,MaxMemFree,MaxRangeOverlaps,MaxRangeReversals,MaxRanges,MaxRequestWorkers,MaxSpareServers,MaxSpareThreads,MaxThreads,MemcacheConnTTL,MergeTrailers,MetaDir,MetaFiles,MetaSuffix,MimeMagicFile,MinSpareServers,MinSpareThreads,ModMimeUsePathInfo,ModemStandard,MultiviewsMatch,Mutex,NWSSLTrustedCerts,NWSSLUpgradeable,NameVirtualHost,NoProxy,Options,Order,OutputSed,PassEnv,PidFile,PrivilegesMode,Protocol,ProtocolEcho,Protocols,ProtocolsHonorOrder,ProxyAddHeaders,ProxyBadHeader,ProxyBlock,ProxyDomain,ProxyErrorOverride,ProxyExpressDBMFile,ProxyExpressDBMType,ProxyExpressEnable,ProxyFCGIBackendType,ProxyFCGISetEnvIf,ProxyFtpDirCharset,ProxyFtpEscapeWildcards,ProxyFtpListOnWildcard,ProxyHCExpr,ProxyHCTPsize,ProxyHCTemplate,ProxyHTMLBufSize,ProxyHTMLCharsetOut,ProxyHTMLDocType,ProxyHTMLEnable,ProxyHTMLEvents,ProxyHTMLExtended,ProxyHTMLFixups,ProxyHTMLInterp,ProxyHTMLLinks,ProxyHTMLMeta,ProxyHTMLStripComments,ProxyHTMLURLMap,ProxyIOBufferSize,ProxyMaxForwards,ProxyPass,ProxyPassInherit,ProxyPassInterpolateEnv,ProxyPassMatch,ProxyPassReverse,ProxyPassReverseCookieDomain,ProxyPassReverseCookiePath,ProxyPreserveHost,ProxyReceiveBufferSize,ProxyRemote,ProxyRemoteMatch,ProxyRequests,ProxySCGIInternalRedirect,ProxySCGISendfile,ProxySet,ProxySourceAddress,ProxyStatus,ProxyTimeout,ProxyVia,QualifyRedirectURL,RLimitCPU,RLimitMEM,RLimitNPROC,ReadmeName,ReceiveBufferSize,Redirect,RedirectMatch,RedirectPermanent,RedirectTemp,ReflectorHeader,RegisterHttpMethod,RemoteIPHeader,RemoteIPInternalProxy,RemoteIPInternalProxyList,RemoteIPProxiesHeader,RemoteIPTrustedProxy,RemoteIPTrustedProxyList,RemoveCharset,RemoveEncoding,RemoveHandler,RemoveInputFilter,RemoveLanguage,RemoveOutputFilter,RemoveType,RequestHeader,RequestReadTimeout,Require,RewriteBase,RewriteCond,RewriteEngine,RewriteMap,RewriteOptions,RewriteRule,SSIETag,SSIEndTag,SSIErrorMsg,SSILastModified,SSILegacyExprParser,SSIStartTag,SSITimeFormat,SSIUndefinedEcho,SSLCACertificateFile,SSLCACertificatePath,SSLCADNRequestFile,SSLCADNRequestPath,SSLCARevocationCheck,SSLCARevocationFile,SSLCARevocationPath,SSLCertificateChainFile,SSLCertificateFile,SSLCertificateKeyFile,SSLCipherSuite,SSLCompression,SSLCryptoDevice,SSLEngine,SSLFIPS,SSLHonorCipherOrder,SSLInsecureRenegotiation,SSLOCSPDefaultResponder,SSLOCSPEnable,SSLOCSPNoverify,SSLOCSPOverrideResponder,SSLOCSPProxyURL,SSLOCSPResponderCertificateFile,SSLOCSPResponderTimeout,SSLOCSPResponseMaxAge,SSLOCSPResponseTimeSkew,SSLOCSPUseRequestNonce,SSLOpenSSLConfCmd,SSLOptions,SSLPassPhraseDialog,SSLProtocol,SSLProxyCACertificateFile,SSLProxyCACertificatePath,SSLProxyCARevocationCheck,SSLProxyCARevocationFile,SSLProxyCARevocationPath,SSLProxyCheckPeerCN,SSLProxyCheckPeerExpire,SSLProxyCheckPeerName,SSLProxyCipherSuite,SSLProxyEngine,SSLProxyMachineCertificateChainFile,SSLProxyMachineCertificateFile,SSLProxyMachineCertificatePath,SSLProxyProtocol,SSLProxyVerify,SSLProxyVerifyDepth,SSLRandomSeed,SSLRenegBufferSize,SSLRequire,SSLRequireSSL,SSLSRPUnknownUserSeed,SSLSRPVerifierFile,SSLSessionCache,SSLSessionCacheTimeout,SSLSessionTicketKeyFile,SSLSessionTickets,SSLStaplingCache,SSLStaplingErrorCacheTimeout,SSLStaplingFakeTryLater,SSLStaplingForceURL,SSLStaplingResponderTimeout,SSLStaplingResponseMaxAge,SSLStaplingResponseTimeSkew,SSLStaplingReturnResponderErrors,SSLStaplingStandardCacheTimeout,SSLStrictSNIVHostCheck,SSLUseStapling,SSLUserName,SSLVerifyClient,SSLVerifyDepth,Satisfy,ScoreBoardFile,Script,ScriptAlias,ScriptAliasMatch,ScriptInterpreterSource,ScriptLog,ScriptLogBuffer,ScriptLogLength,ScriptSock,SecureListen,SeeRequestTail,SendBufferSize,ServerAdmin,ServerAlias,ServerLimit,ServerName,ServerPath,ServerRoot,ServerSignature,ServerTokens,Session,SessionCookieName,SessionCookieName2,SessionCookieRemove,SessionCryptoCipher,SessionCryptoDriver,SessionCryptoPassphrase,SessionCryptoPassphraseFile,SessionDBDCookieName,SessionDBDCookieName2,SessionDBDCookieRemove,SessionDBDDeleteLabel,SessionDBDInsertLabel,SessionDBDPerUser,SessionDBDSelectLabel,SessionDBDUpdateLabel,SessionEnv,SessionExclude,SessionHeader,SessionInclude,SessionMaxAge,SetEnv,SetEnvIf,SetEnvIfExpr,SetEnvIfNoCase,SetHandler,SetInputFilter,SetOutputFilter,StartServers,StartThreads,Substitute,SubstituteInheritBefore,SubstituteMaxLineLength,Suexec,SuexecUserGroup,ThreadLimit,ThreadStackSize,ThreadsPerChild,TimeOut,TraceEnable,TransferLog,TypesConfig,UnDefine,UndefMacro,UnsetEnv,Use,UseCanonicalName,UseCanonicalPhysicalPort,User,UserDir,VHostCGIMode,VHostCGIPrivs,VHostGroup,VHostPrivs,VHostSecure,VHostUser,VirtualDocumentRoot,VirtualDocumentRootIP,VirtualScriptAlias,VirtualScriptAliasIP,WatchdogInterval,XBitHack,xml2EncAlias,xml2EncDefault,xml2StartParse"]
1989+var CONFIG_OPTIONS=/^[\\+\\-]?(AuthConfig|IncludesNOEXEC|ExecCGI|FollowSymLinks|MultiViews|Includes|Indexes|SymLinksIfOwnerMatch)\b/i;var ALL_KEYWORDS=[CPP_KEYWORDS,CSHARP_KEYWORDS,JSCRIPT_KEYWORDS,PERL_KEYWORDS+
1990+PYTHON_KEYWORDS,RUBY_KEYWORDS,SH_KEYWORDS,CONFIG_KEYWORDS,PHP_KEYWORDS];var C_TYPES=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float|char|void|const|static|struct)\d*(_t)?\b)|[a-z_]+_rec|cmd_parms\b/;var PR_STRING='str';var PR_KEYWORD='kwd';var PR_COMMENT='com';var PR_TYPE='typ';var PR_LITERAL='lit';var PR_PUNCTUATION='pun';var PR_PLAIN='pln';var PR_TAG='tag';var PR_DECLARATION='dec';var PR_SOURCE='src';var PR_ATTRIB_NAME='atn';var PR_ATTRIB_VALUE='atv';var PR_NOCODE='nocode';var REGEXP_PRECEDER_PATTERN='(?:^^\\.?|[+-]|[!=]=?=?|\\#|%=?|&&?=?|\\(|\\*=?|[+\\-]=|->|\\/=?|::?|<<?=?|>>?>?=?|,|;|\\?|@|\\[|~|{|\\^\\^?=?|\\|\\|?=?|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*';function combinePrefixPatterns(regexs){var capturedGroupIndex=0;var needToFoldCase=false;var ignoreCase=false;for(var i=0,n=regexs.length;i<n;++i){var regex=regexs[i];if(regex.ignoreCase){ignoreCase=true;}else if(/[a-z]/i.test(regex.source.replace(/\\u[0-9a-f]{4}|\\x[0-9a-f]{2}|\\[^ux]/gi,''))){needToFoldCase=true;ignoreCase=false;break;}}
1991+var escapeCharToCodeUnit={'b':8,'t':9,'n':0xa,'v':0xb,'f':0xc,'r':0xd};function decodeEscape(charsetPart){var cc0=charsetPart.charCodeAt(0);if(cc0!==92){return cc0;}
1992+var c1=charsetPart.charAt(1);cc0=escapeCharToCodeUnit[c1];if(cc0){return cc0;}else if('0'<=c1&&c1<='7'){return parseInt(charsetPart.substring(1),8);}else if(c1==='u'||c1==='x'){return parseInt(charsetPart.substring(2),16);}else{return charsetPart.charCodeAt(1);}}
1993+function encodeEscape(charCode){if(charCode<0x20){return(charCode<0x10?'\\x0':'\\x')+charCode.toString(16);}
1994+var ch=String.fromCharCode(charCode);return(ch==='\\'||ch==='-'||ch===']'||ch==='^')?"\\"+ch:ch;}
1995+function caseFoldCharset(charSet){var charsetParts=charSet.substring(1,charSet.length-1).match(new RegExp('\\\\u[0-9A-Fa-f]{4}'
1996++'|\\\\x[0-9A-Fa-f]{2}'
1997++'|\\\\[0-3][0-7]{0,2}'
1998++'|\\\\[0-7]{1,2}'
1999++'|\\\\[\\s\\S]'
2000++'|-'
2001++'|[^-\\\\]','g'));var ranges=[];var inverse=charsetParts[0]==='^';var out=['['];if(inverse){out.push('^');}
2002+for(var i=inverse?1:0,n=charsetParts.length;i<n;++i){var p=charsetParts[i];if(/\\[bdsw]/i.test(p)){out.push(p);}else{var start=decodeEscape(p);var end;if(i+2<n&&'-'===charsetParts[i+1]){end=decodeEscape(charsetParts[i+2]);i+=2;}else{end=start;}
2003+ranges.push([start,end]);if(!(end<65||start>122)){if(!(end<65||start>90)){ranges.push([Math.max(65,start)|32,Math.min(end,90)|32]);}
2004+if(!(end<97||start>122)){ranges.push([Math.max(97,start)&~32,Math.min(end,122)&~32]);}}}}
2005+ranges.sort(function(a,b){return(a[0]-b[0])||(b[1]-a[1]);});var consolidatedRanges=[];var lastRange=[];for(var i=0;i<ranges.length;++i){var range=ranges[i];if(range[0]<=lastRange[1]+1){lastRange[1]=Math.max(lastRange[1],range[1]);}else{consolidatedRanges.push(lastRange=range);}}
2006+for(var i=0;i<consolidatedRanges.length;++i){var range=consolidatedRanges[i];out.push(encodeEscape(range[0]));if(range[1]>range[0]){if(range[1]+1>range[0]){out.push('-');}
2007+out.push(encodeEscape(range[1]));}}
2008+out.push(']');return out.join('');}
2009+function allowAnywhereFoldCaseAndRenumberGroups(regex){var parts=regex.source.match(new RegExp('(?:'
2010++'\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]'
2011++'|\\\\u[A-Fa-f0-9]{4}'
2012++'|\\\\x[A-Fa-f0-9]{2}'
2013++'|\\\\[0-9]+'
2014++'|\\\\[^ux0-9]'
2015++'|\\(\\?[:!=]'
2016++'|[\\(\\)\\^]'
2017++'|[^\\x5B\\x5C\\(\\)\\^]+'
2018++')','g'));var n=parts.length;var capturedGroups=[];for(var i=0,groupIndex=0;i<n;++i){var p=parts[i];if(p==='('){++groupIndex;}else if('\\'===p.charAt(0)){var decimalValue=+p.substring(1);if(decimalValue){if(decimalValue<=groupIndex){capturedGroups[decimalValue]=-1;}else{parts[i]=encodeEscape(decimalValue);}}}}
2019+for(var i=1;i<capturedGroups.length;++i){if(-1===capturedGroups[i]){capturedGroups[i]=++capturedGroupIndex;}}
2020+for(var i=0,groupIndex=0;i<n;++i){var p=parts[i];if(p==='('){++groupIndex;if(!capturedGroups[groupIndex]){parts[i]='(?:';}}else if('\\'===p.charAt(0)){var decimalValue=+p.substring(1);if(decimalValue&&decimalValue<=groupIndex){parts[i]='\\'+capturedGroups[decimalValue];}}}
2021+for(var i=0;i<n;++i){if('^'===parts[i]&&'^'!==parts[i+1]){parts[i]='';}}
2022+if(regex.ignoreCase&&needToFoldCase){for(var i=0;i<n;++i){var p=parts[i];var ch0=p.charAt(0);if(p.length>=2&&ch0==='['){parts[i]=caseFoldCharset(p);}else if(ch0!=='\\'){parts[i]=p.replace(/[a-zA-Z]/g,function(ch){var cc=ch.charCodeAt(0);return'['+String.fromCharCode(cc&~32,cc|32)+']';});}}}
2023+return parts.join('');}
2024+var rewritten=[];for(var i=0,n=regexs.length;i<n;++i){var regex=regexs[i];if(regex.global||regex.multiline){throw new Error(''+regex);}
2025+rewritten.push('(?:'+allowAnywhereFoldCaseAndRenumberGroups(regex)+')');}
2026+return new RegExp(rewritten.join('|'),ignoreCase?'gi':'g');}
2027+function extractSourceSpans(node,isPreformatted){var nocode=/(?:^|\s)nocode(?:\s|$)/;var chunks=[];var length=0;var spans=[];var k=0;function walk(node){switch(node.nodeType){case 1:if(nocode.test(node.className)){return;}
2028+for(var child=node.firstChild;child;child=child.nextSibling){walk(child);}
2029+var nodeName=node.nodeName.toLowerCase();if('br'===nodeName||'li'===nodeName){chunks[k]='\n';spans[k<<1]=length++;spans[(k++<<1)|1]=node;}
2030+break;case 3:case 4:var text=node.nodeValue;if(text.length){if(!isPreformatted){text=text.replace(/[ \t\r\n]+/g,' ');}else{text=text.replace(/\r\n?/g,'\n');text=text.replace(/^(\r?\n\s*)+/g,'');text=text.replace(/^\s*/g,'');text=text.replace(/(\r?\n\s*)+$/g,'');}
2031+chunks[k]=text;spans[k<<1]=length;length+=text.length;spans[(k++<<1)|1]=node;}
2032+break;}}
2033+walk(node);return{sourceCode:chunks.join('').replace(/\n$/,''),spans:spans};}
2034+function appendDecorations(basePos,sourceCode,langHandler,out){if(!sourceCode){return;}
2035+var job={sourceCode:sourceCode,basePos:basePos};langHandler(job);out.push.apply(out,job.decorations);}
2036+var notWs=/\S/;function childContentWrapper(element){var wrapper=undefined;for(var c=element.firstChild;c;c=c.nextSibling){var type=c.nodeType;wrapper=(type===1)?(wrapper?element:c):(type===3)?(notWs.test(c.nodeValue)?element:wrapper):wrapper;}
2037+return wrapper===element?undefined:wrapper;}
2038+function createSimpleLexer(shortcutStylePatterns,fallthroughStylePatterns){var shortcuts={};var tokenizer;(function(){var allPatterns=shortcutStylePatterns.concat(fallthroughStylePatterns);var allRegexs=[];var regexKeys={};for(var i=0,n=allPatterns.length;i<n;++i){var patternParts=allPatterns[i];var shortcutChars=patternParts[3];if(shortcutChars){for(var c=shortcutChars.length;--c>=0;){shortcuts[shortcutChars.charAt(c)]=patternParts;}}
2039+var regex=patternParts[1];var k=''+regex;if(!regexKeys.hasOwnProperty(k)){allRegexs.push(regex);regexKeys[k]=null;}}
2040+allRegexs.push(/[\0-\uffff]/);tokenizer=combinePrefixPatterns(allRegexs);})();var nPatterns=fallthroughStylePatterns.length;var decorate=function(job){var sourceCode=job.sourceCode,basePos=job.basePos;var decorations=[basePos,PR_PLAIN];var pos=0;var tokens=sourceCode.match(tokenizer)||[];var styleCache={};for(var ti=0,nTokens=tokens.length;ti<nTokens;++ti){var token=tokens[ti];var style=styleCache[token];var match=void 0;var isEmbedded;if(typeof style==='string'){isEmbedded=false;}else{var patternParts=shortcuts[token.charAt(0)];if(patternParts){match=token.match(patternParts[1]);style=patternParts[0];}else{for(var i=0;i<nPatterns;++i){patternParts=fallthroughStylePatterns[i];match=token.match(patternParts[1]);if(match){style=patternParts[0];break;}}
2041+if(!match){style=PR_PLAIN;}}
2042+isEmbedded=style.length>=5&&'lang-'===style.substring(0,5);if(isEmbedded&&!(match&&typeof match[1]==='string')){isEmbedded=false;style=PR_SOURCE;}
2043+if(!isEmbedded){styleCache[token]=style;}}
2044+var tokenStart=pos;pos+=token.length;if(!isEmbedded){decorations.push(basePos+tokenStart,style);}else{var embeddedSource=match[1];var embeddedSourceStart=token.indexOf(embeddedSource);var embeddedSourceEnd=embeddedSourceStart+embeddedSource.length;if(match[2]){embeddedSourceEnd=token.length-match[2].length;embeddedSourceStart=embeddedSourceEnd-embeddedSource.length;}
2045+var lang=style.substring(5);appendDecorations(basePos+tokenStart,token.substring(0,embeddedSourceStart),decorate,decorations);appendDecorations(basePos+tokenStart+embeddedSourceStart,embeddedSource,langHandlerForExtension(lang,embeddedSource),decorations);appendDecorations(basePos+tokenStart+embeddedSourceEnd,token.substring(embeddedSourceEnd),decorate,decorations);}}
2046+job.decorations=decorations;};return decorate;}
2047+function sourceDecorator(options){var shortcutStylePatterns=[],fallthroughStylePatterns=[];if(options['tripleQuotedStrings']){shortcutStylePatterns.push([PR_STRING,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,'\'"']);}else if(options['multiLineStrings']){shortcutStylePatterns.push([PR_STRING,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,'\'"`']);}else{shortcutStylePatterns.push([PR_STRING,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,'"\'']);}
2048+if(options['verbatimStrings']){fallthroughStylePatterns.push([PR_STRING,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null]);}
2049+var hc=options['hashComments'];if(hc){if(options['cStyleComments']){if(hc>1){shortcutStylePatterns.push([PR_COMMENT,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,'#']);}else{shortcutStylePatterns.push([PR_COMMENT,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,'#']);}
2050+fallthroughStylePatterns.push([PR_STRING,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h(?:h|pp|\+\+)?|[a-z]\w*)>/,null]);}else{shortcutStylePatterns.push([PR_COMMENT,/^#[^\r\n]*/,null,'#']);}}
2051+if(options['cStyleComments']){fallthroughStylePatterns.push([PR_COMMENT,/^\/\/[^\r\n]*/,null]);fallthroughStylePatterns.push([PR_COMMENT,/^\/\*[\s\S]*?(?:\*\/|$)/,null]);}
2052+if(options['regexLiterals']){var REGEX_LITERAL=('/(?=[^/*])'
2053++'(?:[^/\\x5B\\x5C]'
2054++'|\\x5C[\\s\\S]'
2055++'|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+'
2056++'/');fallthroughStylePatterns.push(['lang-regex',new RegExp('^'+REGEXP_PRECEDER_PATTERN+'('+REGEX_LITERAL+')')]);}
2057+var types=options['types'];if(types){fallthroughStylePatterns.push([PR_TYPE,types]);}
2058+if(options['strings']){var strings=(""+options['strings']).replace(/^ | $/g,'').replace(/-/g,'\\-');fallthroughStylePatterns.push([PR_STRING,new RegExp('(?:'+strings.replace(/[\s,]+/g,'|')+')'),,null]);}
2059+var keywords=(""+options['keywords']).replace(/^ | $/g,'');if(keywords.length){fallthroughStylePatterns.push([PR_KEYWORD,new RegExp('^(?:'+keywords.replace(/[\s,]+/g,'|')+')\\b'),null]);}
2060+shortcutStylePatterns.push([PR_PLAIN,/^\s+/,null,' \r\n\t\xA0']);if(options['httpdComments']){fallthroughStylePatterns.push([PR_PLAIN,/^.*\S.*#/i,null]);}
2061+fallthroughStylePatterns.push([PR_LITERAL,/^@[a-z_$][a-z_$@0-9]*|\bNULL\b/i,null],[PR_LITERAL,CONFIG_OPTIONS,null],[PR_TAG,/^\b(AuthzProviderAlias|AuthnProviderAlias|RequireAny|RequireAll|RequireNone|Directory|DirectoryMatch|Location|LocationMatch|VirtualHost|If|Else|ElseIf|Proxy\b|LoadBalancer|Files|FilesMatch|Limit|LimitExcept|IfDefine|IfModule|IfVersion)\b/,null],[PR_TYPE,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_(t|req|module)\b)/,null],[PR_TAG,/^apr_[a-z_0-9]+|ap_[a-z_0-9]+/i,null],[PR_PLAIN,/^[a-z_$][a-z_$@0-9\-]*/i,null],[PR_LITERAL,new RegExp('^(?:'
2062++'0x[a-f0-9]+'
2063++'|[a-f0-9:]+:[a-f0-9:]+:[a-f0-9:]+:[a-f0-9:]+:[a-f0-9:]+:[a-f0-9:]+'
2064++'|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)'
2065++'(?:e[+\\-]?\\d+)?'
2066++')'
2067++'[a-z]*','i'),null,'0123456789'],[PR_PLAIN,/^\\[\s\S]?/,null],[PR_PUNCTUATION,/^.[^\s\w\.$@\'\"\`\/\#\\]*/,null]);return createSimpleLexer(shortcutStylePatterns,fallthroughStylePatterns);}
2068+var decorateSource=sourceDecorator({'keywords':ALL_KEYWORDS,'hashComments':true,'cStyleComments':true,'multiLineStrings':true,'regexLiterals':true});function numberLines(node,opt_startLineNum,isPreformatted){var nocode=/(?:^|\s)nocode(?:\s|$)/;var lineBreak=/\r\n?|\n/;var document=node.ownerDocument;var li=document.createElement('li');while(node.firstChild){li.appendChild(node.firstChild);}
2069+var listItems=[li];function walk(node){switch(node.nodeType){case 1:if(nocode.test(node.className)){break;}
2070+if('br'===node.nodeName){breakAfter(node);if(node.parentNode){node.parentNode.removeChild(node);}}else{for(var child=node.firstChild;child;child=child.nextSibling){walk(child);}}
2071+break;case 3:case 4:if(isPreformatted){var text=node.nodeValue;var match=text.match(lineBreak);if(match){var firstLine=text.substring(0,match.index);node.nodeValue=firstLine;var tail=text.substring(match.index+match[0].length);if(tail){var parent=node.parentNode;parent.insertBefore(document.createTextNode(tail),node.nextSibling);}
2072+breakAfter(node);if(!firstLine){node.parentNode.removeChild(node);}}}
2073+break;}}
2074+function breakAfter(lineEndNode){while(!lineEndNode.nextSibling){lineEndNode=lineEndNode.parentNode;if(!lineEndNode){return;}}
2075+function breakLeftOf(limit,copy){var rightSide=copy?limit.cloneNode(false):limit;var parent=limit.parentNode;if(parent){var parentClone=breakLeftOf(parent,1);var next=limit.nextSibling;parentClone.appendChild(rightSide);for(var sibling=next;sibling;sibling=next){next=sibling.nextSibling;parentClone.appendChild(sibling);}}
2076+return rightSide;}
2077+var copiedListItem=breakLeftOf(lineEndNode.nextSibling,0);for(var parent;(parent=copiedListItem.parentNode)&&parent.nodeType===1;){copiedListItem=parent;}
2078+listItems.push(copiedListItem);}
2079+for(var i=0;i<listItems.length;++i){walk(listItems[i]);}
2080+if(opt_startLineNum===(opt_startLineNum|0)){listItems[0].setAttribute('value',opt_startLineNum);}
2081+var ol=document.createElement('ol');ol.className='linenums';var offset=Math.max(0,((opt_startLineNum-1))|0)||0;for(var i=0,n=listItems.length;i<n;++i){li=listItems[i];li.className='L'+((i+offset)%1);if(!li.firstChild){li.appendChild(document.createTextNode('\xA0'));}
2082+ol.appendChild(li);}
2083+node.appendChild(ol);}
2084+function recombineTagsAndDecorations(job){var isIE8OrEarlier=/\bMSIE\s(\d+)/.exec(navigator.userAgent);isIE8OrEarlier=isIE8OrEarlier&&+isIE8OrEarlier[1]<=8;var newlineRe=/\n/g;var source=job.sourceCode;var sourceLength=source.length;var sourceIndex=0;var spans=job.spans;var nSpans=spans.length;var spanIndex=0;var decorations=job.decorations;var nDecorations=decorations.length;var decorationIndex=0;decorations[nDecorations]=sourceLength;var decPos,i;for(i=decPos=0;i<nDecorations;){if(decorations[i]!==decorations[i+2]){decorations[decPos++]=decorations[i++];decorations[decPos++]=decorations[i++];}else{i+=2;}}
2085+nDecorations=decPos;for(i=decPos=0;i<nDecorations;){var startPos=decorations[i];var startDec=decorations[i+1];var end=i+2;while(end+2<=nDecorations&&decorations[end+1]===startDec){end+=2;}
2086+decorations[decPos++]=startPos;decorations[decPos++]=startDec;i=end;}
2087+nDecorations=decorations.length=decPos;var sourceNode=job.sourceNode;var oldDisplay;if(sourceNode){oldDisplay=sourceNode.style.display;sourceNode.style.display='none';}
2088+try{var decoration=null;var X=0;while(spanIndex<nSpans){X=X+1;if(X>5000){break;}
2089+var spanStart=spans[spanIndex];var spanEnd=spans[spanIndex+2]||sourceLength;var decEnd=decorations[decorationIndex+2]||sourceLength;var end=Math.min(spanEnd,decEnd);var textNode=spans[spanIndex+1];var styledText;if(textNode.nodeType!==1&&(styledText=source.substring(sourceIndex,end))){if(isIE8OrEarlier){styledText=styledText.replace(newlineRe,'\r');}
2090+textNode.nodeValue=styledText;var document=textNode.ownerDocument;var span=document.createElement('span');span.className=decorations[decorationIndex+1];var parentNode=textNode.parentNode;parentNode.replaceChild(span,textNode);span.appendChild(textNode);if(sourceIndex<spanEnd){spans[spanIndex+1]=textNode=document.createTextNode(source.substring(end,spanEnd));parentNode.insertBefore(textNode,span.nextSibling);}}
2091+sourceIndex=end;if(sourceIndex>=spanEnd){spanIndex+=2;}
2092+if(sourceIndex>=decEnd){decorationIndex+=2;}}}finally{if(sourceNode){sourceNode.style.display=oldDisplay;}}}
2093+var langHandlerRegistry={};function registerLangHandler(handler,fileExtensions){for(var i=fileExtensions.length;--i>=0;){var ext=fileExtensions[i];if(!langHandlerRegistry.hasOwnProperty(ext)){langHandlerRegistry[ext]=handler;}else if(win['console']){console['warn']('cannot override language handler %s',ext);}}}
2094+function langHandlerForExtension(extension,source){if(!(extension&&langHandlerRegistry.hasOwnProperty(extension))){extension=/^\s*</.test(source)?'default-markup':'default-code';}
2095+return langHandlerRegistry[extension];}
2096+registerLangHandler(decorateSource,['default-code']);registerLangHandler(createSimpleLexer([],[[PR_PLAIN,/^[^<?]+/],[PR_DECLARATION,/^<!\w[^>]*(?:>|$)/],[PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],['lang-',/^<\?([\s\S]+?)(?:\?>|$)/],['lang-',/^<%([\s\S]+?)(?:%>|$)/],[PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],['lang-',/^<xmp\b[^>]*>([\s\S]+?)<\/xmp\b[^>]*>/i],['lang-js',/^<script\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],['lang-css',/^<style\b[^>]*>([\s\S]*?)(<\/style\b[^>]*>)/i],['lang-in.tag',/^(<\/?[a-z][^<>]*>)/i]]),['default-markup','htm','html','mxml','xhtml','xml','xsl']);registerLangHandler(createSimpleLexer([[PR_PLAIN,/^[\s]+/,null,' \t\r\n'],[PR_ATTRIB_VALUE,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,'\"\'']],[[PR_TAG,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[PR_ATTRIB_NAME,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],['lang-uq.val',/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[PR_PUNCTUATION,/^[=<>\/]+/],['lang-js',/^on\w+\s*=\s*\"([^\"]+)\"/i],['lang-js',/^on\w+\s*=\s*\'([^\']+)\'/i],['lang-js',/^on\w+\s*=\s*([^\"\'>\s]+)/i],['lang-css',/^style\s*=\s*\"([^\"]+)\"/i],['lang-css',/^style\s*=\s*\'([^\']+)\'/i],['lang-css',/^style\s*=\s*([^\"\'>\s]+)/i]]),['in.tag']);registerLangHandler(createSimpleLexer([],[[PR_ATTRIB_VALUE,/^[\s\S]+/]]),['uq.val']);registerLangHandler(sourceDecorator({'keywords':CPP_KEYWORDS,'hashComments':true,'cStyleComments':true,'types':C_TYPES}),['c','cc','cpp','cxx','cyc','m']);registerLangHandler(sourceDecorator({'keywords':PHP_KEYWORDS,'hashComments':false,'cStyleComments':true,'multiLineStrings':true,'regexLiterals':true}),['php','phtml','inc']);registerLangHandler(sourceDecorator({'keywords':'null,true,false'}),['json']);registerLangHandler(sourceDecorator({'keywords':CSHARP_KEYWORDS,'hashComments':true,'cStyleComments':true,'verbatimStrings':true,'types':C_TYPES}),['cs']);registerLangHandler(sourceDecorator({'keywords':JAVA_KEYWORDS,'cStyleComments':true}),['java']);registerLangHandler(sourceDecorator({'keywords':SH_KEYWORDS,'hashComments':true,'multiLineStrings':true}),['bsh','csh','sh']);registerLangHandler(sourceDecorator({'keywords':PYTHON_KEYWORDS,'hashComments':true,'multiLineStrings':true,'tripleQuotedStrings':true}),['cv','py']);registerLangHandler(sourceDecorator({'keywords':PERL_KEYWORDS,'hashComments':true,'multiLineStrings':true,'regexLiterals':true}),['perl','pl','pm']);registerLangHandler(sourceDecorator({'keywords':RUBY_KEYWORDS,'hashComments':true,'multiLineStrings':true,'regexLiterals':true}),['rb']);registerLangHandler(sourceDecorator({'keywords':JSCRIPT_KEYWORDS,'cStyleComments':true,'regexLiterals':true}),['js']);registerLangHandler(sourceDecorator({'keywords':COFFEE_KEYWORDS,'hashComments':3,'cStyleComments':true,'multilineStrings':true,'tripleQuotedStrings':true,'regexLiterals':true}),['coffee']);registerLangHandler(createSimpleLexer([],[[PR_STRING,/^[\s\S]+/]]),['regex']);registerLangHandler(sourceDecorator({'keywords':CONFIG_KEYWORDS,'literals':CONFIG_OPTIONS,'strings':CONFIG_ENVS,'hashComments':true,'cStyleComments':false,'multiLineStrings':false,'regexLiterals':false,'httpdComments':true}),['config']);function applyDecorator(job){var opt_langExtension=job.langExtension;try{var sourceAndSpans=extractSourceSpans(job.sourceNode,job.pre);var source=sourceAndSpans.sourceCode;job.sourceCode=source;job.spans=sourceAndSpans.spans;job.basePos=0;langHandlerForExtension(opt_langExtension,source)(job);recombineTagsAndDecorations(job);}catch(e){if(win['console']){console['log'](e&&e['stack']?e['stack']:e);}}}
2097+function prettyPrintOne(sourceCodeHtml,opt_langExtension,opt_numberLines){var container=document.createElement('pre');container.innerHTML=sourceCodeHtml;if(opt_numberLines){numberLines(container,opt_numberLines,true);}
2098+var job={langExtension:opt_langExtension,numberLines:opt_numberLines,sourceNode:container,pre:1};applyDecorator(job);return container.innerHTML;}
2099+function prettyPrint(opt_whenDone){function byTagName(tn){return document.getElementsByTagName(tn);}
2100+var codeSegments=[byTagName('pre'),byTagName('code'),byTagName('xmp')];var elements=[];for(var i=0;i<codeSegments.length;++i){for(var j=0,n=codeSegments[i].length;j<n;++j){elements.push(codeSegments[i][j]);}}
2101+codeSegments=null;var clock=Date;if(!clock['now']){clock={'now':function(){return+(new Date);}};}
2102+var k=0;var prettyPrintingJob;var langExtensionRe=/\blang(?:uage)?-([\w.]+)(?!\S)/;var prettyPrintRe=/\bprettyprint\b/;var prettyPrintedRe=/\bprettyprinted\b/;var preformattedTagNameRe=/pre|xmp/i;var codeRe=/^code$/i;var preCodeXmpRe=/^(?:pre|code|xmp)$/i;function doWork(){var endTime=(win['PR_SHOULD_USE_CONTINUATION']?clock['now']()+250:Infinity);for(;k<elements.length&&clock['now']()<endTime;k++){var cs=elements[k];var className=cs.className;if(prettyPrintRe.test(className)&&!prettyPrintedRe.test(className)){var nested=false;for(var p=cs.parentNode;p;p=p.parentNode){var tn=p.tagName;if(preCodeXmpRe.test(tn)&&p.className&&prettyPrintRe.test(p.className)){nested=true;break;}}
2103+if(!nested){cs.className+=' prettyprinted';var langExtension=className.match(langExtensionRe);var wrapper;if(!langExtension&&(wrapper=childContentWrapper(cs))&&codeRe.test(wrapper.tagName)){langExtension=wrapper.className.match(langExtensionRe);}
2104+if(langExtension){langExtension=langExtension[1];}
2105+var preformatted;if(preformattedTagNameRe.test(cs.tagName)){preformatted=1;}else{var currentStyle=cs['currentStyle'];var whitespace=(currentStyle?currentStyle['whiteSpace']:(document.defaultView&&document.defaultView.getComputedStyle)?document.defaultView.getComputedStyle(cs,null).getPropertyValue('white-space'):0);preformatted=whitespace&&'pre'===whitespace.substring(0,3);}
2106+var lineNums=cs.className.match(/\blinenums\b(?::(\d+))?/);lineNums=lineNums?lineNums[1]&&lineNums[1].length?+lineNums[1]:true:false;if(lineNums){numberLines(cs,lineNums,preformatted);}
2107+prettyPrintingJob={langExtension:langExtension,sourceNode:cs,numberLines:lineNums,pre:preformatted};applyDecorator(prettyPrintingJob);}}}
2108+if(k<elements.length){setTimeout(doWork,250);}else if(opt_whenDone){opt_whenDone();}}
2109+doWork();}
2110+var PR=win['PR']={'createSimpleLexer':createSimpleLexer,'registerLangHandler':registerLangHandler,'sourceDecorator':sourceDecorator,'PR_ATTRIB_NAME':PR_ATTRIB_NAME,'PR_ATTRIB_VALUE':PR_ATTRIB_VALUE,'PR_COMMENT':PR_COMMENT,'PR_DECLARATION':PR_DECLARATION,'PR_KEYWORD':PR_KEYWORD,'PR_LITERAL':PR_LITERAL,'PR_NOCODE':PR_NOCODE,'PR_PLAIN':PR_PLAIN,'PR_PUNCTUATION':PR_PUNCTUATION,'PR_SOURCE':PR_SOURCE,'PR_STRING':PR_STRING,'PR_TAG':PR_TAG,'PR_TYPE':PR_TYPE,'prettyPrintOne':win['prettyPrintOne']=prettyPrintOne,'prettyPrint':win['prettyPrint']=prettyPrint};PR['registerLangHandler'](PR['createSimpleLexer']([[PR['PR_PLAIN'],/^[\t\n\r \xA0]+/,null,'\t\n\r \xA0'],[PR['PR_STRING'],/^(?:\"(?:[^\"\\]|\\[\s\S])*(?:\"|$)|\'(?:[^\'\\]|\\[\s\S])*(?:\'|$))/,null,'"\'']],[[PR['PR_COMMENT'],/^--(?:\[(=*)\[[\s\S]*?(?:\]\1\]|$)|[^\r\n]*)/],[PR['PR_TYPE'],/^nil|false|true/],[PR['PR_STRING'],/^\[(=*)\[[\s\S]*?(?:\]\1\]|$)/],[PR['PR_KEYWORD'],/^(?:and|break|do|else|elseif|end|for|function|if|in|local|not|or|repeat|require|return|then|until|while)\b/,null],[PR['PR_LITERAL'],/^[+-]?(?:0x[\da-f]+|(?:(?:\.\d+|\d+(?:\.\d*)?)(?:e[+\-]?\d+)?))/i],[PR['PR_PLAIN'],/^[a-z_]\w*/i],[PR['PR_PUNCTUATION'],/^[^\w\t\n\r \xA0][^\w\t\n\r \xA0\"\'\-\+=]*/]]),['lua']);if(typeof define==="function"&&define['amd']){define("google-code-prettify",[],function(){return PR;});}})();
2111\ No newline at end of file
2112diff --git a/docs/manual/style/sitemap.dtd b/docs/manual/style/sitemap.dtd
2113new file mode 100644
2114index 0000000..829f326
2115--- /dev/null
2116+++ b/docs/manual/style/sitemap.dtd
2117@@ -0,0 +1,42 @@
2118+<?xml version='1.0' encoding='UTF-8' ?>
2119+
2120+<!--
2121+ Licensed to the Apache Software Foundation (ASF) under one or more
2122+ contributor license agreements. See the NOTICE file distributed with
2123+ this work for additional information regarding copyright ownership.
2124+ The ASF licenses this file to You under the Apache License, Version 2.0
2125+ (the "License"); you may not use this file except in compliance with
2126+ the License. You may obtain a copy of the License at
2127+
2128+ http://www.apache.org/licenses/LICENSE-2.0
2129+
2130+ Unless required by applicable law or agreed to in writing, software
2131+ distributed under the License is distributed on an "AS IS" BASIS,
2132+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
2133+ See the License for the specific language governing permissions and
2134+ limitations under the License.
2135+-->
2136+
2137+<!ENTITY % common SYSTEM "common.dtd">
2138+%common;
2139+
2140+<!-- <sitemap> is the root element -->
2141+<!ELEMENT sitemap (title, summary?, seealso*, category*)>
2142+
2143+<!ATTLIST sitemap metafile CDATA #REQUIRED
2144+ upgrade CDATA #IMPLIED
2145+>
2146+
2147+<!-- <indexpage> is another root element -->
2148+<!ELEMENT indexpage (parentdocument, title, category*)>
2149+
2150+<!ATTLIST indexpage metafile CDATA #REQUIRED
2151+ upgrade CDATA #IMPLIED
2152+>
2153+
2154+<!ELEMENT category (title, page*)>
2155+<!ATTLIST category id ID #IMPLIED>
2156+
2157+<!ELEMENT page (#PCDATA)>
2158+<!ATTLIST page href CDATA #IMPLIED
2159+ separate (yes | no) "no" >
2160diff --git a/docs/manual/style/version.ent b/docs/manual/style/version.ent
2161new file mode 100644
2162index 0000000..6e21f89
2163--- /dev/null
2164+++ b/docs/manual/style/version.ent
2165@@ -0,0 +1,24 @@
2166+<?xml version='1.0' encoding='UTF-8' ?>
2167+
2168+<!--
2169+ Licensed to the Apache Software Foundation (ASF) under one or more
2170+ contributor license agreements. See the NOTICE file distributed with
2171+ this work for additional information regarding copyright ownership.
2172+ The ASF licenses this file to You under the Apache License, Version 2.0
2173+ (the "License"); you may not use this file except in compliance with
2174+ the License. You may obtain a copy of the License at
2175+
2176+ http://www.apache.org/licenses/LICENSE-2.0
2177+
2178+ Unless required by applicable law or agreed to in writing, software
2179+ distributed under the License is distributed on an "AS IS" BASIS,
2180+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
2181+ See the License for the specific language governing permissions and
2182+ limitations under the License.
2183+-->
2184+
2185+<!ENTITY httpd.major "2">
2186+<!ENTITY httpd.minor "4">
2187+<!ENTITY httpd.patch "33">
2188+
2189+<!ENTITY httpd.docs "2.4">
2190diff --git a/docs/manual/suexec.html b/docs/manual/suexec.html
2191new file mode 100644
2192index 0000000..c4cc65b
2193--- /dev/null
2194+++ b/docs/manual/suexec.html
2195@@ -0,0 +1,21 @@
2196+# GENERATED FROM XML -- DO NOT EDIT
2197+
2198+URI: suexec.html.en
2199+Content-Language: en
2200+Content-type: text/html; charset=ISO-8859-1
2201+
2202+URI: suexec.html.fr
2203+Content-Language: fr
2204+Content-type: text/html; charset=ISO-8859-1
2205+
2206+URI: suexec.html.ja.utf8
2207+Content-Language: ja
2208+Content-type: text/html; charset=UTF-8
2209+
2210+URI: suexec.html.ko.euc-kr
2211+Content-Language: ko
2212+Content-type: text/html; charset=EUC-KR
2213+
2214+URI: suexec.html.tr.utf8
2215+Content-Language: tr
2216+Content-type: text/html; charset=UTF-8
2217diff --git a/docs/manual/suexec.html.en b/docs/manual/suexec.html.en
2218new file mode 100644
2219index 0000000..526e793
2220--- /dev/null
2221+++ b/docs/manual/suexec.html.en
2222@@ -0,0 +1,643 @@
2223+<?xml version="1.0" encoding="ISO-8859-1"?>
2224+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
2225+<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"><head>
2226+<meta content="text/html; charset=ISO-8859-1" http-equiv="Content-Type" />
2227+<!--
2228+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
2229+ This file is generated from xml source: DO NOT EDIT
2230+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
2231+ -->
2232+<title>suEXEC Support - Apache HTTP Server Version 2.4</title>
2233+<link href="./style/css/manual.css" rel="stylesheet" media="all" type="text/css" title="Main stylesheet" />
2234+<link href="./style/css/manual-loose-100pc.css" rel="alternate stylesheet" media="all" type="text/css" title="No Sidebar - Default font size" />
2235+<link href="./style/css/manual-print.css" rel="stylesheet" media="print" type="text/css" /><link rel="stylesheet" type="text/css" href="./style/css/prettify.css" />
2236+<script src="./style/scripts/prettify.min.js" type="text/javascript">
2237+</script>
2238+
2239+<link href="./images/favicon.ico" rel="shortcut icon" /></head>
2240+<body id="manual-page"><div id="page-header">
2241+<p class="menu"><a href="./mod/">Modules</a> | <a href="./mod/directives.html">Directives</a> | <a href="http://wiki.apache.org/httpd/FAQ">FAQ</a> | <a href="./glossary.html">Glossary</a> | <a href="./sitemap.html">Sitemap</a></p>
2242+<p class="apache">Apache HTTP Server Version 2.4</p>
2243+<img alt="" src="./images/feather.png" /></div>
2244+<div class="up"><a href="./"><img title="&lt;-" alt="&lt;-" src="./images/left.gif" /></a></div>
2245+<div id="path">
2246+<a href="http://www.apache.org/">Apache</a> &gt; <a href="http://httpd.apache.org/">HTTP Server</a> &gt; <a href="http://httpd.apache.org/docs/">Documentation</a> &gt; <a href="./">Version 2.4</a></div><div id="page-content"><div id="preamble"><h1>suEXEC Support</h1>
2247+<div class="toplang">
2248+<p><span>Available Languages: </span><a href="./en/suexec.html" title="English">&nbsp;en&nbsp;</a> |
2249+<a href="./fr/suexec.html" hreflang="fr" rel="alternate" title="Fran�ais">&nbsp;fr&nbsp;</a> |
2250+<a href="./ja/suexec.html" hreflang="ja" rel="alternate" title="Japanese">&nbsp;ja&nbsp;</a> |
2251+<a href="./ko/suexec.html" hreflang="ko" rel="alternate" title="Korean">&nbsp;ko&nbsp;</a> |
2252+<a href="./tr/suexec.html" hreflang="tr" rel="alternate" title="T�rk�e">&nbsp;tr&nbsp;</a></p>
2253+</div>
2254+
2255+ <p>The <strong>suEXEC</strong> feature provides users of the Apache
2256+ HTTP Server the ability
2257+ to run <strong>CGI</strong> and <strong>SSI</strong> programs
2258+ under user IDs different from the user ID of the calling
2259+ web server. Normally, when a CGI or SSI program executes, it
2260+ runs as the same user who is running the web server.</p>
2261+
2262+ <p>Used properly, this feature can reduce
2263+ considerably the security risks involved with allowing users to
2264+ develop and run private CGI or SSI programs. However, if suEXEC
2265+ is improperly configured, it can cause any number of problems
2266+ and possibly create new holes in your computer's security. If
2267+ you aren't familiar with managing <em>setuid root</em> programs
2268+ and the security issues they present, we highly recommend that
2269+ you not consider using suEXEC.</p>
2270+ </div>
2271+<div id="quickview"><a href="https://www.apache.org/foundation/contributing.html" class="badge"><img src="https://www.apache.org/images/SupportApache-small.png" alt="Support Apache!" /></a><ul id="toc"><li><img alt="" src="./images/down.gif" /> <a href="#before">Before we begin</a></li>
2272+<li><img alt="" src="./images/down.gif" /> <a href="#model">suEXEC Security Model</a></li>
2273+<li><img alt="" src="./images/down.gif" /> <a href="#install">Configuring &amp; Installing
2274+ suEXEC</a></li>
2275+<li><img alt="" src="./images/down.gif" /> <a href="#enable">Enabling &amp; Disabling
2276+ suEXEC</a></li>
2277+<li><img alt="" src="./images/down.gif" /> <a href="#usage">Using suEXEC</a></li>
2278+<li><img alt="" src="./images/down.gif" /> <a href="#debug">Debugging suEXEC</a></li>
2279+<li><img alt="" src="./images/down.gif" /> <a href="#jabberwock">Beware the Jabberwock:
2280+ Warnings &amp; Examples</a></li>
2281+</ul><h3>See also</h3><ul class="seealso"><li><a href="#comments_section">Comments</a></li></ul></div>
2282+<div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
2283+<div class="section">
2284+<h2><a name="before" id="before">Before we begin</a></h2>
2285+
2286+ <p>Before jumping head-first into this document,
2287+ you should be aware that certain assumptions are made about you and
2288+ the environment in which you will be using suexec.</p>
2289+
2290+ <p>First, it is assumed that you are using a UNIX
2291+ derivative operating system that is capable of
2292+ <strong>setuid</strong> and <strong>setgid</strong> operations.
2293+ All command examples are given in this regard. Other platforms,
2294+ if they are capable of supporting suEXEC, may differ in their
2295+ configuration.</p>
2296+
2297+ <p>Second, it is assumed you are familiar with
2298+ some basic concepts of your computer's security and its
2299+ administration. This involves an understanding of
2300+ <strong>setuid/setgid</strong> operations and the various
2301+ effects they may have on your system and its level of
2302+ security.</p>
2303+
2304+ <p>Third, it is assumed that you are using an
2305+ <strong>unmodified</strong> version of suEXEC code. All code
2306+ for suEXEC has been carefully scrutinized and tested by the
2307+ developers as well as numerous beta testers. Every precaution
2308+ has been taken to ensure a simple yet solidly safe base of
2309+ code. Altering this code can cause unexpected problems and new
2310+ security risks. It is <strong>highly</strong> recommended you
2311+ not alter the suEXEC code unless you are well versed in the
2312+ particulars of security programming and are willing to share
2313+ your work with the Apache HTTP Server development team for consideration.</p>
2314+
2315+ <p>Fourth, and last, it has been the decision of
2316+ the Apache HTTP Server development team to <strong>NOT</strong> make suEXEC part of
2317+ the default installation of Apache httpd. To this end, suEXEC
2318+ configuration requires of the administrator careful attention
2319+ to details. After due consideration has been given to the
2320+ various settings for suEXEC, the administrator may install
2321+ suEXEC through normal installation methods. The values for
2322+ these settings need to be carefully determined and specified by
2323+ the administrator to properly maintain system security during
2324+ the use of suEXEC functionality. It is through this detailed
2325+ process that we hope to limit suEXEC
2326+ installation only to those who are careful and determined
2327+ enough to use it.</p>
2328+
2329+ <p>Still with us? Yes? Good. Let's move on!</p>
2330+</div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
2331+<div class="section">
2332+<h2><a name="model" id="model">suEXEC Security Model</a></h2>
2333+
2334+ <p>Before we begin configuring and installing
2335+ suEXEC, we will first discuss the security model you are about
2336+ to implement. By doing so, you may better understand what
2337+ exactly is going on inside suEXEC and what precautions are
2338+ taken to ensure your system's security.</p>
2339+
2340+ <p><strong>suEXEC</strong> is based on a setuid
2341+ "wrapper" program that is called by the main Apache HTTP Server.
2342+ This wrapper is called when an HTTP request is made for a CGI
2343+ or SSI program that the administrator has designated to run as
2344+ a userid other than that of the main server. When such a
2345+ request is made, Apache httpd provides the suEXEC wrapper with the
2346+ program's name and the user and group IDs under which the
2347+ program is to execute.</p>
2348+
2349+ <p>The wrapper then employs the following process
2350+ to determine success or failure -- if any one of these
2351+ conditions fail, the program logs the failure and exits with an
2352+ error, otherwise it will continue:</p>
2353+
2354+ <ol>
2355+ <li>
2356+ <strong>Is the user executing this wrapper a valid user of
2357+ this system?</strong>
2358+
2359+ <p class="indent">
2360+ This is to ensure that the user executing the wrapper is
2361+ truly a user of the system.
2362+ </p>
2363+ </li>
2364+
2365+ <li>
2366+ <strong>Was the wrapper called with the proper number of
2367+ arguments?</strong>
2368+
2369+ <p class="indent">
2370+ The wrapper will only execute if it is given the proper
2371+ number of arguments. The proper argument format is known
2372+ to the Apache HTTP Server. If the wrapper is not receiving
2373+ the proper number of arguments, it is either being
2374+ hacked, or there is something wrong with the suEXEC
2375+ portion of your Apache httpd binary.
2376+ </p>
2377+ </li>
2378+
2379+ <li>
2380+ <strong>Is this valid user allowed to run the
2381+ wrapper?</strong>
2382+
2383+ <p class="indent">
2384+ Is this user the user allowed to run this wrapper? Only
2385+ one user (the Apache user) is allowed to execute this
2386+ program.
2387+ </p>
2388+ </li>
2389+
2390+ <li>
2391+ <strong>Does the target CGI or SSI program have an unsafe
2392+ hierarchical reference?</strong>
2393+
2394+ <p class="indent">
2395+ Does the target CGI or SSI program's path contain a leading
2396+ '/' or have a '..' backreference? These are not allowed; the
2397+ target CGI/SSI program must reside within suEXEC's document
2398+ root (see <code>--with-suexec-docroot=<em>DIR</em></code>
2399+ below).
2400+ </p>
2401+ </li>
2402+
2403+ <li>
2404+ <strong>Is the target user name valid?</strong>
2405+
2406+ <p class="indent">
2407+ Does the target user exist?
2408+ </p>
2409+ </li>
2410+
2411+ <li>
2412+ <strong>Is the target group name valid?</strong>
2413+
2414+ <p class="indent">
2415+ Does the target group exist?
2416+ </p>
2417+ </li>
2418+
2419+ <li>
2420+ <strong>Is the target user <em>NOT</em> superuser?</strong>
2421+
2422+
2423+ <p class="indent">
2424+ suEXEC does not allow <code><em>root</em></code>
2425+ to execute CGI/SSI programs.
2426+ </p>
2427+ </li>
2428+
2429+ <li>
2430+ <strong>Is the target userid <em>ABOVE</em> the minimum ID
2431+ number?</strong>
2432+
2433+ <p class="indent">
2434+ The minimum user ID number is specified during
2435+ configuration. This allows you to set the lowest possible
2436+ userid that will be allowed to execute CGI/SSI programs.
2437+ This is useful to block out "system" accounts.
2438+ </p>
2439+ </li>
2440+
2441+ <li>
2442+ <strong>Is the target group <em>NOT</em> the superuser
2443+ group?</strong>
2444+
2445+ <p class="indent">
2446+ Presently, suEXEC does not allow the <code><em>root</em></code>
2447+ group to execute CGI/SSI programs.
2448+ </p>
2449+ </li>
2450+
2451+ <li>
2452+ <strong>Is the target groupid <em>ABOVE</em> the minimum ID
2453+ number?</strong>
2454+
2455+ <p class="indent">
2456+ The minimum group ID number is specified during
2457+ configuration. This allows you to set the lowest possible
2458+ groupid that will be allowed to execute CGI/SSI programs.
2459+ This is useful to block out "system" groups.
2460+ </p>
2461+ </li>
2462+
2463+ <li>
2464+ <strong>Can the wrapper successfully become the target user
2465+ and group?</strong>
2466+
2467+ <p class="indent">
2468+ Here is where the program becomes the target user and
2469+ group via setuid and setgid calls. The group access list
2470+ is also initialized with all of the groups of which the
2471+ user is a member.
2472+ </p>
2473+ </li>
2474+
2475+ <li>
2476+ <strong>Can we change directory to the one in which the target
2477+ CGI/SSI program resides?</strong>
2478+
2479+ <p class="indent">
2480+ If it doesn't exist, it can't very well contain files. If we
2481+ can't change directory to it, it might as well not exist.
2482+ </p>
2483+ </li>
2484+
2485+ <li>
2486+ <strong>Is the directory within the httpd webspace?</strong>
2487+
2488+ <p class="indent">
2489+ If the request is for a regular portion of the server, is
2490+ the requested directory within suEXEC's document root? If
2491+ the request is for a <code class="directive"><a href="./mod/mod_userdir.html#userdir">UserDir</a></code>, is the requested directory
2492+ within the directory configured as suEXEC's userdir (see
2493+ <a href="#install">suEXEC's configuration options</a>)?
2494+ </p>
2495+ </li>
2496+
2497+ <li>
2498+ <strong>Is the directory <em>NOT</em> writable by anyone
2499+ else?</strong>
2500+
2501+ <p class="indent">
2502+ We don't want to open up the directory to others; only
2503+ the owner user may be able to alter this directories
2504+ contents.
2505+ </p>
2506+ </li>
2507+
2508+ <li>
2509+ <strong>Does the target CGI/SSI program exist?</strong>
2510+
2511+ <p class="indent">
2512+ If it doesn't exists, it can't very well be executed.
2513+ </p>
2514+ </li>
2515+
2516+ <li>
2517+ <strong>Is the target CGI/SSI program <em>NOT</em> writable
2518+ by anyone else?</strong>
2519+
2520+ <p class="indent">
2521+ We don't want to give anyone other than the owner the
2522+ ability to change the CGI/SSI program.
2523+ </p>
2524+ </li>
2525+
2526+ <li>
2527+ <strong>Is the target CGI/SSI program <em>NOT</em> setuid or
2528+ setgid?</strong>
2529+
2530+ <p class="indent">
2531+ We do not want to execute programs that will then change
2532+ our UID/GID again.
2533+ </p>
2534+ </li>
2535+
2536+ <li>
2537+ <strong>Is the target user/group the same as the program's
2538+ user/group?</strong>
2539+
2540+ <p class="indent">
2541+ Is the user the owner of the file?
2542+ </p>
2543+ </li>
2544+
2545+ <li>
2546+ <strong>Can we successfully clean the process environment
2547+ to ensure safe operations?</strong>
2548+
2549+ <p class="indent">
2550+ suEXEC cleans the process' environment by establishing a
2551+ safe execution PATH (defined during configuration), as
2552+ well as only passing through those variables whose names
2553+ are listed in the safe environment list (also created
2554+ during configuration).
2555+ </p>
2556+ </li>
2557+
2558+ <li>
2559+ <strong>Can we successfully become the target CGI/SSI program
2560+ and execute?</strong>
2561+
2562+ <p class="indent">
2563+ Here is where suEXEC ends and the target CGI/SSI program begins.
2564+ </p>
2565+ </li>
2566+ </ol>
2567+
2568+ <p>This is the standard operation of the
2569+ suEXEC wrapper's security model. It is somewhat stringent and
2570+ can impose new limitations and guidelines for CGI/SSI design,
2571+ but it was developed carefully step-by-step with security in
2572+ mind.</p>
2573+
2574+ <p>For more information as to how this security
2575+ model can limit your possibilities in regards to server
2576+ configuration, as well as what security risks can be avoided
2577+ with a proper suEXEC setup, see the <a href="#jabberwock">"Beware the Jabberwock"</a> section of this
2578+ document.</p>
2579+</div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
2580+<div class="section">
2581+<h2><a name="install" id="install">Configuring &amp; Installing
2582+ suEXEC</a></h2>
2583+
2584+ <p>Here's where we begin the fun.</p>
2585+
2586+ <p><strong>suEXEC configuration
2587+ options</strong><br />
2588+ </p>
2589+
2590+ <dl>
2591+ <dt><code>--enable-suexec</code></dt>
2592+
2593+ <dd>This option enables the suEXEC feature which is never
2594+ installed or activated by default. At least one
2595+ <code>--with-suexec-xxxxx</code> option has to be provided
2596+ together with the <code>--enable-suexec</code> option to let
2597+ APACI accept your request for using the suEXEC feature.</dd>
2598+
2599+ <dt><code>--with-suexec-bin=<em>PATH</em></code></dt>
2600+
2601+ <dd>The path to the <code>suexec</code> binary must be hard-coded
2602+ in the server for security reasons. Use this option to override
2603+ the default path. <em>e.g.</em>
2604+ <code>--with-suexec-bin=/usr/sbin/suexec</code></dd>
2605+
2606+ <dt><code>--with-suexec-caller=<em>UID</em></code></dt>
2607+
2608+ <dd>The <a href="mod/mpm_common.html#user">username</a> under which
2609+ httpd normally runs. This is the only user allowed to
2610+ execute the suEXEC wrapper.</dd>
2611+
2612+ <dt><code>--with-suexec-userdir=<em>DIR</em></code></dt>
2613+
2614+ <dd>Define to be the subdirectory under users' home
2615+ directories where suEXEC access should be allowed. All
2616+ executables under this directory will be executable by suEXEC
2617+ as the user so they should be "safe" programs. If you are
2618+ using a "simple" <code class="directive"><a href="./mod/mod_userdir.html#userdir">UserDir</a></code>
2619+ directive (ie. one without a "*" in it) this should be set to the same
2620+ value. suEXEC will not work properly in cases where the <code class="directive"><a href="./mod/mod_userdir.html#userdir">UserDir</a></code> directive points to
2621+ a location that is not the same as the user's home directory
2622+ as referenced in the <code>passwd</code> file. Default value is
2623+ "<code>public_html</code>".<br />
2624+ If you have virtual hosts with a different <code class="directive"><a href="./mod/mod_userdir.html#userdir">UserDir</a></code> for each,
2625+ you will need to define them to all reside in one parent
2626+ directory; then name that parent directory here. <strong>If
2627+ this is not defined properly, "~userdir" cgi requests will
2628+ not work!</strong></dd>
2629+
2630+ <dt><code>--with-suexec-docroot=<em>DIR</em></code></dt>
2631+
2632+ <dd>Define as the DocumentRoot set for httpd. This will be
2633+ the only hierarchy (aside from <code class="directive"><a href="./mod/mod_userdir.html#userdir">UserDir</a></code>s) that can be used for suEXEC behavior. The
2634+ default directory is the <code>--datadir</code> value with the suffix
2635+ "<code>/htdocs</code>", <em>e.g.</em> if you configure with
2636+ "<code>--datadir=/home/apache</code>" the directory
2637+ "<code>/home/apache/htdocs</code>" is used as document root for the
2638+ suEXEC wrapper.</dd>
2639+
2640+ <dt><code>--with-suexec-uidmin=<em>UID</em></code></dt>
2641+
2642+ <dd>Define this as the lowest UID allowed to be a target user
2643+ for suEXEC. For most systems, 500 or 100 is common. Default
2644+ value is 100.</dd>
2645+
2646+ <dt><code>--with-suexec-gidmin=<em>GID</em></code></dt>
2647+
2648+ <dd>Define this as the lowest GID allowed to be a target
2649+ group for suEXEC. For most systems, 100 is common and
2650+ therefore used as default value.</dd>
2651+
2652+ <dt><code>--with-suexec-logfile=<em>FILE</em></code></dt>
2653+
2654+ <dd>This defines the filename to which all suEXEC
2655+ transactions and errors are logged (useful for auditing and
2656+ debugging purposes). By default the logfile is named
2657+ "<code>suexec_log</code>" and located in your standard logfile
2658+ directory (<code>--logfiledir</code>).</dd>
2659+
2660+ <dt><code>--with-suexec-safepath=<em>PATH</em></code></dt>
2661+
2662+ <dd>Define a safe PATH environment to pass to CGI
2663+ executables. Default value is
2664+ "<code>/usr/local/bin:/usr/bin:/bin</code>".</dd>
2665+ </dl>
2666+
2667+ <h3>Compiling and installing the suEXEC wrapper</h3>
2668+
2669+
2670+ <p>If you have enabled the suEXEC feature with the
2671+ <code>--enable-suexec</code> option the <code>suexec</code> binary
2672+ (together with httpd itself) is automatically built if you execute
2673+ the <code>make</code> command.</p>
2674+
2675+ <p>After all components have been built you can execute the
2676+ command <code>make install</code> to install them. The binary image
2677+ <code>suexec</code> is installed in the directory defined by the
2678+ <code>--sbindir</code> option. The default location is
2679+ "/usr/local/apache2/bin/suexec".</p>
2680+
2681+ <p>Please note that you need <strong><em>root
2682+ privileges</em></strong> for the installation step. In order
2683+ for the wrapper to set the user ID, it must be installed as
2684+ owner <code><em>root</em></code> and must have the setuserid
2685+ execution bit set for file modes.</p>
2686+
2687+
2688+ <h3>Setting paranoid permissions</h3>
2689+
2690+
2691+ <p>Although the suEXEC wrapper will check to ensure that its
2692+ caller is the correct user as specified with the
2693+ <code>--with-suexec-caller</code> <code class="program"><a href="./programs/configure.html">configure</a></code>
2694+ option, there is
2695+ always the possibility that a system or library call suEXEC uses
2696+ before this check may be exploitable on your system. To counter
2697+ this, and because it is best-practise in general, you should use
2698+ filesystem permissions to ensure that only the group httpd
2699+ runs as may execute suEXEC.</p>
2700+
2701+ <p>If for example, your web server is configured to run as:</p>
2702+
2703+ <pre class="prettyprint lang-config">User www
2704+Group webgroup</pre>
2705+
2706+
2707+ <p>and <code class="program"><a href="./programs/suexec.html">suexec</a></code> is installed at
2708+ "/usr/local/apache2/bin/suexec", you should run:</p>
2709+
2710+ <div class="example"><p><code>
2711+ chgrp webgroup /usr/local/apache2/bin/suexec<br />
2712+ chmod 4750 /usr/local/apache2/bin/suexec<br />
2713+ </code></p></div>
2714+
2715+ <p>This will ensure that only the group httpd runs as can even
2716+ execute the suEXEC wrapper.</p>
2717+
2718+</div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
2719+<div class="section">
2720+<h2><a name="enable" id="enable">Enabling &amp; Disabling
2721+ suEXEC</a></h2>
2722+
2723+ <p>Upon startup of httpd, it looks for the file
2724+ <code class="program"><a href="./programs/suexec.html">suexec</a></code> in the directory defined by the
2725+ <code>--sbindir</code> option (default is
2726+ "/usr/local/apache/sbin/suexec"). If httpd finds a properly
2727+ configured suEXEC wrapper, it will print the following message
2728+ to the error log:</p>
2729+
2730+<div class="example"><p><code>
2731+ [notice] suEXEC mechanism enabled (wrapper: <var>/path/to/suexec</var>)
2732+</code></p></div>
2733+
2734+ <p>If you don't see this message at server startup, the server is
2735+ most likely not finding the wrapper program where it expects
2736+ it, or the executable is not installed <em>setuid root</em>.</p>
2737+
2738+ <p>If you want to enable the suEXEC mechanism for the first time
2739+ and an Apache HTTP Server is already running you must kill and
2740+ restart httpd. Restarting it with a simple HUP or USR1 signal
2741+ will not be enough. </p>
2742+ <p>If you want to disable suEXEC you should kill and restart
2743+ httpd after you have removed the <code class="program"><a href="./programs/suexec.html">suexec</a></code> file.</p>
2744+</div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
2745+<div class="section">
2746+<h2><a name="usage" id="usage">Using suEXEC</a></h2>
2747+
2748+ <p>Requests for CGI programs will call the suEXEC wrapper only if
2749+ they are for a virtual host containing a <code class="directive"><a href="./mod/mod_suexec.html#suexecusergroup">SuexecUserGroup</a></code> directive or if
2750+ they are processed by <code class="module"><a href="./mod/mod_userdir.html">mod_userdir</a></code>.</p>
2751+
2752+ <p><strong>Virtual Hosts:</strong><br /> One way to use the suEXEC
2753+ wrapper is through the <code class="directive"><a href="./mod/mod_suexec.html#suexecusergroup">SuexecUserGroup</a></code> directive in
2754+ <code class="directive"><a href="./mod/core.html#virtualhost">VirtualHost</a></code> definitions. By
2755+ setting this directive to values different from the main server
2756+ user ID, all requests for CGI resources will be executed as the
2757+ <em>User</em> and <em>Group</em> defined for that <code class="directive"><a href="./mod/core.html#virtualhost">&lt;VirtualHost&gt;</a></code>. If this
2758+ directive is not specified for a <code class="directive"><a href="./mod/core.html#virtualhost">&lt;VirtualHost&gt;</a></code> then the main server userid
2759+ is assumed.</p>
2760+
2761+ <p><strong>User directories:</strong><br /> Requests that are
2762+ processed by <code class="module"><a href="./mod/mod_userdir.html">mod_userdir</a></code> will call the suEXEC
2763+ wrapper to execute CGI programs under the userid of the requested
2764+ user directory. The only requirement needed for this feature to
2765+ work is for CGI execution to be enabled for the user and that the
2766+ script must meet the scrutiny of the <a href="#model">security
2767+ checks</a> above. See also the
2768+ <code>--with-suexec-userdir</code> <a href="#install">compile
2769+ time option</a>.</p> </div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
2770+<div class="section">
2771+<h2><a name="debug" id="debug">Debugging suEXEC</a></h2>
2772+
2773+ <p>The suEXEC wrapper will write log information
2774+ to the file defined with the <code>--with-suexec-logfile</code>
2775+ option as indicated above. If you feel you have configured and
2776+ installed the wrapper properly, have a look at this log and the
2777+ error_log for the server to see where you may have gone astray.</p>
2778+
2779+</div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
2780+<div class="section">
2781+<h2><a name="jabberwock" id="jabberwock">Beware the Jabberwock:
2782+ Warnings &amp; Examples</a></h2>
2783+
2784+ <p><strong>NOTE!</strong> This section may not be
2785+ complete. For the latest revision of this section of the
2786+ documentation, see the <a href="http://httpd.apache.org/docs/2.4/suexec.html">Online
2787+ Documentation</a> version.</p>
2788+
2789+ <p>There are a few points of interest regarding
2790+ the wrapper that can cause limitations on server setup. Please
2791+ review these before submitting any "bugs" regarding suEXEC.</p>
2792+
2793+ <ul>
2794+ <li><strong>suEXEC Points Of Interest</strong></li>
2795+
2796+ <li>
2797+ Hierarchy limitations
2798+
2799+ <p class="indent">
2800+ For security and efficiency reasons, all suEXEC requests
2801+ must remain within either a top-level document root for
2802+ virtual host requests, or one top-level personal document
2803+ root for userdir requests. For example, if you have four
2804+ VirtualHosts configured, you would need to structure all
2805+ of your VHosts' document roots off of one main httpd
2806+ document hierarchy to take advantage of suEXEC for
2807+ VirtualHosts. (Example forthcoming.)
2808+ </p>
2809+ </li>
2810+
2811+ <li>
2812+ suEXEC's PATH environment variable
2813+
2814+ <p class="indent">
2815+ This can be a dangerous thing to change. Make certain
2816+ every path you include in this define is a
2817+ <strong>trusted</strong> directory. You don't want to
2818+ open people up to having someone from across the world
2819+ running a trojan horse on them.
2820+ </p>
2821+ </li>
2822+
2823+ <li>
2824+ Altering the suEXEC code
2825+
2826+ <p class="indent">
2827+ Again, this can cause <strong>Big Trouble</strong> if you
2828+ try this without knowing what you are doing. Stay away
2829+ from it if at all possible.
2830+ </p>
2831+ </li>
2832+ </ul>
2833+
2834+</div></div>
2835+<div class="bottomlang">
2836+<p><span>Available Languages: </span><a href="./en/suexec.html" title="English">&nbsp;en&nbsp;</a> |
2837+<a href="./fr/suexec.html" hreflang="fr" rel="alternate" title="Fran�ais">&nbsp;fr&nbsp;</a> |
2838+<a href="./ja/suexec.html" hreflang="ja" rel="alternate" title="Japanese">&nbsp;ja&nbsp;</a> |
2839+<a href="./ko/suexec.html" hreflang="ko" rel="alternate" title="Korean">&nbsp;ko&nbsp;</a> |
2840+<a href="./tr/suexec.html" hreflang="tr" rel="alternate" title="T�rk�e">&nbsp;tr&nbsp;</a></p>
2841+</div><div class="top"><a href="#page-header"><img src="./images/up.gif" alt="top" /></a></div><div class="section"><h2><a id="comments_section" name="comments_section">Comments</a></h2><div class="warning"><strong>Notice:</strong><br />This is not a Q&amp;A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed again by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Freenode, or sent to our <a href="http://httpd.apache.org/lists.html">mailing lists</a>.</div>
2842+<script type="text/javascript"><!--//--><![CDATA[//><!--
2843+var comments_shortname = 'httpd';
2844+var comments_identifier = 'http://httpd.apache.org/docs/2.4/suexec.html';
2845+(function(w, d) {
2846+ if (w.location.hostname.toLowerCase() == "httpd.apache.org") {
2847+ d.write('<div id="comments_thread"><\/div>');
2848+ var s = d.createElement('script');
2849+ s.type = 'text/javascript';
2850+ s.async = true;
2851+ s.src = 'https://comments.apache.org/show_comments.lua?site=' + comments_shortname + '&page=' + comments_identifier;
2852+ (d.getElementsByTagName('head')[0] || d.getElementsByTagName('body')[0]).appendChild(s);
2853+ }
2854+ else {
2855+ d.write('<div id="comments_thread">Comments are disabled for this page at the moment.<\/div>');
2856+ }
2857+})(window, document);
2858+//--><!]]></script></div><div id="footer">
2859+<p class="apache">Copyright 2018 The Apache Software Foundation.<br />Licensed under the <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a>.</p>
2860+<p class="menu"><a href="./mod/">Modules</a> | <a href="./mod/directives.html">Directives</a> | <a href="http://wiki.apache.org/httpd/FAQ">FAQ</a> | <a href="./glossary.html">Glossary</a> | <a href="./sitemap.html">Sitemap</a></p></div><script type="text/javascript"><!--//--><![CDATA[//><!--
2861+if (typeof(prettyPrint) !== 'undefined') {
2862+ prettyPrint();
2863+}
2864+//--><!]]></script>
2865+</body></html>
2866\ No newline at end of file
2867diff --git a/docs/manual/suexec.html.fr b/docs/manual/suexec.html.fr
2868new file mode 100644
2869index 0000000..97e7a37
2870--- /dev/null
2871+++ b/docs/manual/suexec.html.fr
2872@@ -0,0 +1,689 @@
2873+<?xml version="1.0" encoding="ISO-8859-1"?>
2874+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
2875+<html xmlns="http://www.w3.org/1999/xhtml" lang="fr" xml:lang="fr"><head>
2876+<meta content="text/html; charset=ISO-8859-1" http-equiv="Content-Type" />
2877+<!--
2878+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
2879+ This file is generated from xml source: DO NOT EDIT
2880+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
2881+ -->
2882+<title>Support suEXEC - Serveur Apache HTTP Version 2.4</title>
2883+<link href="./style/css/manual.css" rel="stylesheet" media="all" type="text/css" title="Main stylesheet" />
2884+<link href="./style/css/manual-loose-100pc.css" rel="alternate stylesheet" media="all" type="text/css" title="No Sidebar - Default font size" />
2885+<link href="./style/css/manual-print.css" rel="stylesheet" media="print" type="text/css" /><link rel="stylesheet" type="text/css" href="./style/css/prettify.css" />
2886+<script src="./style/scripts/prettify.min.js" type="text/javascript">
2887+</script>
2888+
2889+<link href="./images/favicon.ico" rel="shortcut icon" /></head>
2890+<body id="manual-page"><div id="page-header">
2891+<p class="menu"><a href="./mod/">Modules</a> | <a href="./mod/directives.html">Directives</a> | <a href="http://wiki.apache.org/httpd/FAQ">FAQ</a> | <a href="./glossary.html">Glossaire</a> | <a href="./sitemap.html">Plan du site</a></p>
2892+<p class="apache">Serveur Apache HTTP Version 2.4</p>
2893+<img alt="" src="./images/feather.png" /></div>
2894+<div class="up"><a href="./"><img title="&lt;-" alt="&lt;-" src="./images/left.gif" /></a></div>
2895+<div id="path">
2896+<a href="http://www.apache.org/">Apache</a> &gt; <a href="http://httpd.apache.org/">Serveur HTTP</a> &gt; <a href="http://httpd.apache.org/docs/">Documentation</a> &gt; <a href="./">Version 2.4</a></div><div id="page-content"><div id="preamble"><h1>Support suEXEC</h1>
2897+<div class="toplang">
2898+<p><span>Langues Disponibles: </span><a href="./en/suexec.html" hreflang="en" rel="alternate" title="English">&nbsp;en&nbsp;</a> |
2899+<a href="./fr/suexec.html" title="Fran�ais">&nbsp;fr&nbsp;</a> |
2900+<a href="./ja/suexec.html" hreflang="ja" rel="alternate" title="Japanese">&nbsp;ja&nbsp;</a> |
2901+<a href="./ko/suexec.html" hreflang="ko" rel="alternate" title="Korean">&nbsp;ko&nbsp;</a> |
2902+<a href="./tr/suexec.html" hreflang="tr" rel="alternate" title="T�rk�e">&nbsp;tr&nbsp;</a></p>
2903+</div>
2904+
2905+ <p>La fonctionnalit� <strong>suEXEC</strong> permet
2906+ l'ex�cution des programmes <strong>CGI</strong> et
2907+ <strong>SSI</strong> sous un utilisateur autre que celui sous
2908+ lequel s'ex�cute le serveur web qui appelle ces programmes.
2909+ Normalement, lorsqu'un programme CGI ou SSI est lanc�, il
2910+ s'ex�cute sous le m�me utilisateur que celui du serveur web qui
2911+ l'appelle.</p>
2912+
2913+ <p>Utilis�e de mani�re appropri�e, cette fonctionnalit� peut
2914+ r�duire consid�rablement les risques de s�curit� encourus
2915+ lorsqu'on autorise les utilisateurs � d�velopper et faire
2916+ s'ex�cuter des programmes CGI ou SSI de leur cru. Cependant, mal
2917+ configur�, suEXEC peut causer de nombreux probl�mes et m�me cr�er
2918+ de nouvelles failles dans la s�curit� de votre ordinateur. Si
2919+ vous n'�tes pas familier avec la gestion des programmes
2920+ <em>setuid root</em> et les risques de s�curit� qu'ils comportent,
2921+ nous vous recommandons vivement de ne pas tenter
2922+ d'utiliser suEXEC.</p>
2923+ </div>
2924+<div id="quickview"><a href="https://www.apache.org/foundation/contributing.html" class="badge"><img src="https://www.apache.org/images/SupportApache-small.png" alt="Support Apache!" /></a><ul id="toc"><li><img alt="" src="./images/down.gif" /> <a href="#before">Avant de commencer</a></li>
2925+<li><img alt="" src="./images/down.gif" /> <a href="#model">Mod�le de s�curit� de suEXEC</a></li>
2926+<li><img alt="" src="./images/down.gif" /> <a href="#install">Configurer et installer suEXEC</a></li>
2927+<li><img alt="" src="./images/down.gif" /> <a href="#enable">Activation et d�sactivation
2928+de suEXEC</a></li>
2929+<li><img alt="" src="./images/down.gif" /> <a href="#usage">Utilisation de suEXEC</a></li>
2930+<li><img alt="" src="./images/down.gif" /> <a href="#debug">D�bogage de suEXEC</a></li>
2931+<li><img alt="" src="./images/down.gif" /> <a href="#jabberwock">Avis � la population !
2932+ Avertissements et exemples</a></li>
2933+</ul><h3>Voir aussi</h3><ul class="seealso"><li><a href="#comments_section">Commentaires</a></li></ul></div>
2934+<div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
2935+<div class="section">
2936+<h2><a name="before" id="before">Avant de commencer</a></h2>
2937+
2938+ <p>Avant de foncer t�te baiss�e dans la lecture de ce document,
2939+ vous devez tenir compte de certaines hypoth�ses concernant vous-m�me
2940+ et l'environnement dans lequel vous allez utiliser suexec.</p>
2941+
2942+ <p>Premi�rement, vous devez utiliser un syst�me d'exploitation
2943+ UNIX ou d�riv�, capable d'effectuer des op�rations
2944+ <strong>setuid</strong> et <strong>setgid</strong>. Tous les
2945+ exemples de commande sont donn�s en cons�quence. D'autres
2946+ plates-formes, m�me si elles supportent suEXEC, peuvent
2947+ avoir une configuration diff�rente.</p>
2948+
2949+ <p>Deuxi�mement, vous devez �tre familier avec les concepts de base
2950+ relatifs � la s�curit� de votre ordinateur et son administration.
2951+ Ceci implique la compr�hension des op�rations
2952+ <strong>setuid/setgid</strong> et des diff�rents effets qu'elles
2953+ peuvent produire sur votre syst�me et son niveau de s�curit�.</p>
2954+
2955+ <p>Troisi�mement, vous devez utiliser une version
2956+ <strong>non modifi�e</strong> du code de suEXEC. L'ensemble du
2957+ code de suEXEC a �t� scrut� et test� avec soin par les d�veloppeurs
2958+ et de nombreux b�ta testeurs. Toutes les pr�cautions ont �t� prises
2959+ pour s'assurer d'une base s�re de code non seulement simple, mais
2960+ aussi solide. La modification de ce code peut causer des probl�mes
2961+ inattendus et de nouveaux risques de s�curit�. Il est
2962+ <strong>vivement</strong> recommand� de ne pas modifier le code de
2963+ suEXEC, � moins que vous ne soyez un programmeur sp�cialiste des
2964+ particularit�s li�es � la s�curit�, et souhaitez partager votre
2965+ travail avec l'�quipe de d�veloppement du serveur HTTP Apache afin
2966+ de pouvoir en discuter.</p>
2967+
2968+ <p>Quatri�mement et derni�rement, l'�quipe de d�veloppement du
2969+ serveur HTTP Apache a d�cid� de ne
2970+ <strong>PAS</strong> inclure suEXEC dans l'installation par d�faut
2971+ d'Apache httpd. Pour pouvoir mettre en oeuvre suEXEC, l'administrateur
2972+ doit porter la plus grande attention aux d�tails. Apr�s avoir bien
2973+ r�fl�chi aux diff�rents points de la configuration de suEXEC,
2974+ l'administrateur peut l'installer selon les m�thodes classiques.
2975+ Les valeurs des param�tres de configuration doivent �tre
2976+ d�termin�es et sp�cifi�es avec soin par l'administrateur, afin de
2977+ maintenir la s�curit� du syst�me de mani�re appropri�e lors de
2978+ l'utilisation de la fonctionnalit� suEXEC. C'est par le biais de
2979+ ce processus minutieux que nous esp�rons r�server
2980+ l'installation de suEXEC aux administrateurs prudents et
2981+ suffisamment d�termin�s � vouloir l'utiliser.</p>
2982+
2983+ <p>Vous �tes encore avec nous ? Oui ? Bien.
2984+ Alors nous pouvons continuer !</p>
2985+</div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
2986+<div class="section">
2987+<h2><a name="model" id="model">Mod�le de s�curit� de suEXEC</a></h2>
2988+
2989+ <p>Avant d'installer et configurer suEXEC, nous allons tout d'abord
2990+ d�crire le mod�le de s�curit� que vous �tes sur le point
2991+ d'impl�menter. Vous devriez ainsi mieux comprendre ce qui se passe
2992+ vraiment � l'int�rieur de suEXEC et quelles pr�cautions ont �t�
2993+ prises pour pr�server la s�curit� de votre syst�me.</p>
2994+
2995+ <p><strong>suEXEC</strong> est bas� sur un programme "conteneur"
2996+ (wrapper) setuid qui est appel� par le serveur HTTP Apache principal.
2997+ Ce conteneur est appel� quand une requ�te HTTP concerne
2998+ un programme CGI ou SSI que l'administrateur
2999+ a d�cid� de faire s'ex�cuter
3000+ sous un utilisateur autre que celui du serveur principal.
3001+ Lorsqu'il re�oit une telle requ�te, Apache httpd fournit au conteneur
3002+ suEXEC le nom du programme, ainsi que les identifiants utilisateur
3003+ et groupe sous lesquels le programme doit s'ex�cuter.</p>
3004+
3005+ <p>Le conteneur effectue ensuite les v�rifications suivantes afin
3006+ de d�terminer la r�ussite ou l'�chec du processus -- si une seule
3007+ de ces conditions n'est pas v�rifi�e, le programme journalise
3008+ l'erreur et se termine en retournant un code d'erreur, sinon il
3009+ continue :</p>
3010+
3011+ <ol>
3012+ <li>
3013+ <strong>L'utilisateur qui ex�cute le conteneur est-il un
3014+ utilisateur valide de ce syst�me ?</strong>
3015+
3016+ <p class="indent">
3017+ Ceci permet de s'assurer que l'utilisateur qui ex�cute le
3018+ conteneur est vraiment un utilisateur appartenant au syst�me.
3019+ </p>
3020+ </li>
3021+
3022+ <li>
3023+ <strong>Le conteneur a-t-il �t� appel� avec un nombre
3024+ d'arguments correct ?</strong>
3025+
3026+ <p class="indent">
3027+ Le conteneur ne s'ex�cutera que si on lui fournit un nombre
3028+ d'arguments correct. Le serveur HTTP apache sait quel est le
3029+ bon format des arguments. Si le conteneur ne re�oit pas un
3030+ nombre d'arguments correct, soit il a �t� modifi�,
3031+ soit quelque chose ne va pas dans la portion suEXEC de
3032+ votre binaire Apache httpd.
3033+ </p>
3034+ </li>
3035+
3036+ <li>
3037+ <strong>Cet utilisateur valide est-il autoris� � ex�cuter le
3038+ conteneur ?</strong>
3039+
3040+ <p class="indent">
3041+ Cet utilisateur est-il celui autoris� � ex�cuter le
3042+ conteneur ? Un seul utilisateur (celui d'Apache) est
3043+ autoris� � ex�cuter ce programme.
3044+ </p>
3045+ </li>
3046+
3047+ <li>
3048+ <strong>Le chemin du programme CGI ou SSI cible est-il
3049+ non s�r ?</strong>
3050+
3051+ <p class="indent">
3052+ Le chemin du programme CGI ou SSI cible d�bute-t-il par un
3053+ '/' ou contient-il une r�f�rence arri�re '..' ? Ceci est
3054+ interdit ; le programme CGI ou SSI cible doit se trouver dans
3055+ la hi�rarchie de la racine des documents de suEXEC (voir
3056+ <code>--with-suexec-docroot=<em>DIR</em></code> ci-dessous).
3057+ </p>
3058+ </li>
3059+
3060+ <li>
3061+ <strong>Le nom utilisateur cible est-il valide ?</strong>
3062+
3063+ <p class="indent">
3064+ L'utilisateur cible existe-t-il ?
3065+ </p>
3066+ </li>
3067+
3068+ <li>
3069+ <strong>Le nom du groupe cible est-il valide ?</strong>
3070+
3071+ <p class="indent">
3072+ Le groupe cible existe-t-il ?
3073+ </p>
3074+ </li>
3075+
3076+ <li>
3077+ <strong>L'utilisateur cible n'est-il <em>PAS</em>
3078+ superutilisateur ?</strong>
3079+
3080+
3081+ <p class="indent">
3082+ suEXEc ne permet pas �
3083+ <code><em>root</em></code> d'ex�cuter des programmes CGI/SSI.
3084+ </p>
3085+ </li>
3086+
3087+ <li>
3088+ <strong>Le num�ro de l'identifiant de l'utilisateur cible
3089+ est-il <em>SUPERIEUR</em> au num�ro d'identifiant
3090+ minimum ?</strong>
3091+
3092+ <p class="indent">
3093+ Le num�ro d'identifiant utilisateur minimum est d�fini �
3094+ l'ex�cution du script configure. Ceci vous permet de d�finir
3095+ le num�ro d'identifiant utilisateur le plus bas qui sera
3096+ autoris� � �x�cuter des programmes CGI/SSI. En particulier,
3097+ cela permet d'�carter les comptes syst�me.
3098+ </p>
3099+ </li>
3100+
3101+ <li>
3102+ <strong>Le groupe cible n'est-il <em>PAS</em> le groupe
3103+ superutilisateur ?</strong>
3104+
3105+ <p class="indent">
3106+ Actuellement, suEXEC ne permet pas au groupe
3107+ <code><em>root</em></code> d'ex�cuter des programmes CGI/SSI.
3108+ </p>
3109+ </li>
3110+
3111+ <li>
3112+ <strong> Le num�ro d'identifiant du groupe cible est-il
3113+ <em>SUPERIEUR</em> au num�ro d'identifiant minimum ?</strong>
3114+
3115+ <p class="indent">
3116+ Le num�ro d'identifiant de groupe minimum est sp�cifi� lors
3117+ de l'ex�cution du script configure. Ceci vous permet de
3118+ d�finir l'identifiant de groupe le plus bas possible qui sera
3119+ autoris� � ex�cuter des programmes CGI/SSI, et est
3120+ particuli�rement utile pour �carter les groupes "syst�me".
3121+ </p>
3122+ </li>
3123+
3124+ <li>
3125+ <strong>Le conteneur peut-il obtenir avec succ�s l'identit�
3126+ des utilisateur et groupe cibles ?</strong>
3127+
3128+ <p class="indent">
3129+ C'est ici que le programme obtient l'identit� des utilisateur
3130+ et groupe cibles via des appels � setuid et setgid. De m�me,
3131+ la liste des acc�s groupe est initialis�e avec tous les
3132+ groupes auxquels l'utilisateur cible appartient.
3133+ </p>
3134+ </li>
3135+
3136+ <li>
3137+ <strong>Peut-on se positionner dans le r�pertoire dans dequel
3138+ sont situ�s les programmes CGI/SSI ?</strong>
3139+
3140+ <p class="indent">
3141+ S'il n'existe pas, il ne peut pas contenir de fichier. Et si
3142+ l'on ne peut pas s'y positionner, il n'existe probablement
3143+ pas.
3144+ </p>
3145+ </li>
3146+
3147+ <li>
3148+ <strong>Le r�pertoire est-il dans l'espace web
3149+ de httpd ?</strong>
3150+
3151+ <p class="indent">
3152+ Si la requ�te concerne une portion de la racine du serveur,
3153+ le r�pertoire demand� est-il dans la hi�rarchie de la racine
3154+ des documents de suEXEC ? Si la requ�te concerne un
3155+ <code class="directive"><a href="./mod/mod_userdir.html#userdir">UserDir</a></code>, le r�pertoire demand� est-il dans
3156+ la hi�rarchie du r�pertoire d�fini comme le r�pertoire
3157+ utilisateur de suEXEC (voir les
3158+ <a href="#install">options de configuration de suEXEC</a>) ?
3159+ </p>
3160+ </li>
3161+
3162+ <li>
3163+ <strong>L'�criture dans le r�pertoire est-elle interdite pour
3164+ un utilisateur autre que le propri�taire </strong>
3165+
3166+ <p class="indent">
3167+ Le r�pertoire ne doit pas �tre ouvert aux autres
3168+ utilisateurs ; seul l'utilisateur propri�taire doit pouvoir
3169+ modifier le contenu du r�pertoire.
3170+ </p>
3171+ </li>
3172+
3173+ <li>
3174+ <strong>Le programme CGI/SSI cible existe-t-il ?</strong>
3175+
3176+ <p class="indent">
3177+ S'il n'existe pas, il ne peut pas �tre ex�cut�.
3178+ </p>
3179+ </li>
3180+
3181+ <li>
3182+ <strong>Les utilisateurs autres que le propri�taire n'ont-ils
3183+ <em>PAS</em> de droits en �criture sur le programme
3184+ CGI/SSI ?</strong>
3185+
3186+ <p class="indent">
3187+ Les utilisateurs autres que le propri�taire ne doivent pas
3188+ pouvoir modifier le programme CGI/SSI.
3189+ </p>
3190+ </li>
3191+
3192+ <li>
3193+ <strong>Le programme CGI/SSI n'est-il <em>PAS</em> setuid ou
3194+ setgid ?</strong>
3195+
3196+ <p class="indent">
3197+ Les programmes cibles ne doivent pas pouvoir modifier �
3198+ nouveau les identifiants utilisateur/groupe.
3199+ </p>
3200+ </li>
3201+
3202+ <li>
3203+ <strong>Le couple utilisateur/groupe cible est-il le m�me que
3204+ celui du programme ?</strong>
3205+
3206+ <p class="indent">
3207+ L'utilisateur est-il le propri�taire du fichier ?
3208+ </p>
3209+ </li>
3210+
3211+ <li>
3212+ <strong>Peut-on nettoyer avec succ�s l'environnement des
3213+ processus afin de garantir la s�ret� des op�rations ?</strong>
3214+
3215+ <p class="indent">
3216+ suExec nettoie l'environnement des processus en �tablissant
3217+ un chemin d'ex�cution s�r (d�fini lors de la configuration),
3218+ et en ne passant que les variables dont les noms font partie
3219+ de la liste de l'environnement s�r (cr��e de m�me lors de la
3220+ configuration).
3221+ </p>
3222+ </li>
3223+
3224+ <li>
3225+ <strong>Le conteneur peut-il avec succ�s se substituer au
3226+ programme CGI/SSI cible et s'ex�cuter ?</strong>
3227+
3228+ <p class="indent">
3229+ C'est l� o� l'ex�cution de suEXEC s'arr�te et o� commence
3230+ celle du programme CGI/ssi cible.
3231+ </p>
3232+ </li>
3233+ </ol>
3234+
3235+ <p>Ce sont les op�rations standards effectu�es par le mod�le de
3236+ s�curit� du conteneur suEXEC. Il peut para�tre strict et est
3237+ susceptible d'imposer de nouvelles limitations et orientations
3238+ dans la conception des programmes CGI/SSI, mais il a �t� d�velopp�
3239+ avec le plus grand soin, �tape par �tape, en se focalisant sur
3240+ la s�curit�.</p>
3241+
3242+ <p>Pour plus d'informations sur la mesure dans laquelle ce mod�le
3243+ de s�curit� peut limiter vos possibilit�s au regard de la
3244+ configuration du serveur, ainsi que les risques de s�curit� qui
3245+ peuvent �tre �vit�s gr�ce � une configuration appropri�e de suEXEC,
3246+ se r�f�rer � la section <a href="#jabberwock">"Avis � la population !"</a> de ce document.</p>
3247+</div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
3248+<div class="section">
3249+<h2><a name="install" id="install">Configurer et installer suEXEC</a></h2>
3250+
3251+ <p>C'est ici que nous entrons dans le vif du sujet.</p>
3252+
3253+ <p><strong>Options de configuration de suEXEC</strong><br />
3254+ </p>
3255+
3256+ <dl>
3257+ <dt><code>--enable-suexec</code></dt>
3258+
3259+ <dd>Cette option active la fonctionnalit� suEXEC qui n'est
3260+ jamais install�e ou activ�e par d�faut. Au moins une option
3261+ <code>--with-suexec-xxxxx</code> doit accompagner l'option
3262+ <code>--enable-suexec</code> pour qu'APACI (l'utilitaire de
3263+ configuration de la compilation d'Apache) accepte votre demande
3264+ d'utilisation de la fonctionnalit� suEXEC.</dd>
3265+
3266+ <dt><code>--with-suexec-bin=<em>PATH</em></code></dt>
3267+
3268+ <dd>Le chemin du binaire <code>suexec</code> doit �tre cod� en
3269+ dur dans le serveur pour des raisons de s�curit�. Cette option
3270+ vous permet de modifier le chemin par d�faut.
3271+ <em>Par exemple</em>
3272+ <code>--with-suexec-bin=/usr/sbin/suexec</code></dd>
3273+
3274+ <dt><code>--with-suexec-caller=<em>UID</em></code></dt>
3275+
3276+ <dd>L'<a href="mod/mpm_common.html#user">utilisateur</a> sous
3277+ lequel httpd s'ex�cute habituellement. C'est le seul utilisateur
3278+ autoris� � ex�cuter le wrapper suEXEC.</dd>
3279+
3280+ <dt><code>--with-suexec-userdir=<em>DIR</em></code></dt>
3281+
3282+ <dd>Cette option d�finit le sous-r�pertoire de la hi�rarchie des
3283+ r�pertoires utilisateurs dans lequel l'utilisation
3284+ de suEXEC sera autoris�e. Tous les ex�cutables situ�s dans ce
3285+ r�pertoire seront ex�cutables par suEXEC sous l'utilisateur
3286+ cible ; ces programmes doivent donc �tre s�rs. Si vous utilisez
3287+ une directive <code class="directive"><a href="./mod/mod_userdir.html#userdir">UserDir</a></code>
3288+ "simple" (c'est � dire ne contenant pas de
3289+ "*"), l'option --with-suexec-userdir
3290+ devra contenir la m�me valeur. SuEXEC ne fonctionnera pas
3291+ correctement si la directive <code class="directive"><a href="./mod/mod_userdir.html#userdir">UserDir</a></code> contient une valeur
3292+ diff�rente du r�pertoire home de l'utilisateur tel qu'il est
3293+ d�fini dans le fichier <code>passwd</code>. la valeur par d�faut
3294+ est "<code>public_html</code>".<br />
3295+ Si vous avez plusieurs h�tes virtuels avec une directive
3296+ <code class="directive"><a href="./mod/mod_userdir.html#userdir">UserDir</a></code> diff�rente
3297+ pour chacun d'entre eux, vous devrez faire en sorte que chaque
3298+ UserDir poss�de un r�pertoire parent commun ; donnez alors �
3299+ l'option --with-suexec-userdir le nom
3300+ de ce r�pertoire commun. <strong>Si tout ceci n'est pas d�fini
3301+ correctement, les requ�tes CGI "~userdir" ne fonctionneront
3302+ pas !</strong></dd>
3303+
3304+ <dt><code>--with-suexec-docroot=<em>DIR</em></code></dt>
3305+
3306+ <dd>Cette option fonctionne comme la directive DocumentRoot pour
3307+ httpd. Il s'agit de la seule hi�rarchie (en dehors des directives
3308+ <code class="directive"><a href="./mod/mod_userdir.html#userdir">UserDir</a></code>) dans laquelle la fonctionnalit� suEXEC
3309+ pourra �tre utilis�e. La valeur par d�faut est la valeur de
3310+ <code>--datadir</code> accompagn�e du suffixe
3311+ "<code>/htdocs</code>" ;
3312+ <em>Par exemple</em>, si vous ex�cutez configure avec
3313+ "<code>--datadir=/home/apache</code>", la valeur
3314+ "<code>/home/apache/htdocs</code>" sera utilis�e par d�faut comme
3315+ racine des documents pour le conteneur suEXEC.</dd>
3316+
3317+ <dt><code>--with-suexec-uidmin=<em>UID</em></code></dt>
3318+
3319+ <dd>Cette option d�finit l'identifiant utilisateur le plus bas
3320+ avec lequel un utilisateur pourra �tre la cible de
3321+ suEXEC. 500 ou 100 sont des valeurs courantes sur la plupart des
3322+ syst�mes. la valeur par d�faut est 100.</dd>
3323+
3324+ <dt><code>--with-suexec-gidmin=<em>GID</em></code></dt>
3325+
3326+ <dd>Cette option d�finit l'identifiant de groupe le plus bas
3327+ avec lequel un utilisateur pourra �tre la cible de
3328+ suEXEC. 100 est une valeur courante sur la plupart des
3329+ syst�mes et est par cons�quent la valeur par d�faut.</dd>
3330+
3331+ <dt><code>--with-suexec-logfile=<em>FILE</em></code></dt>
3332+
3333+ <dd>Cette option permet de d�finir le fichier dans lequel
3334+ toutes les transactions et erreurs de suEXEC seront journalis�es
3335+ (� des fins d'analyse ou de d�bogage). Par d�faut, le fichier
3336+ journal se nomme "<code>suexec_log</code>" et se trouve dans votre
3337+ r�pertoire standard des fichiers journaux d�fini par
3338+ <code>--logfiledir</code></dd>
3339+
3340+ <dt><code>--with-suexec-safepath=<em>PATH</em></code></dt>
3341+
3342+ <dd>Cette option permet de d�finir une variable d'environnement
3343+ PATH s�re � passer aux ex�cutables CGI. La valeur par d�faut
3344+ est "<code>/usr/local/bin:/usr/bin:/bin</code>".</dd>
3345+ </dl>
3346+
3347+ <h3>Compilation et installation du conteneur suEXEC</h3>
3348+
3349+
3350+ <p>Si vous avez activ� la fonctionnalit� suEXEC � l'aide de
3351+ l'option <code>--enable-suexec</code>, le binaire
3352+ <code>suexec</code> sera automatiquement construit (en m�me temps
3353+ que httpd) lorsque vous ex�cuterez la commande
3354+ <code>make</code>.</p>
3355+
3356+ <p>Lorsque tous les composants auront �t� construits, vous pourrez
3357+ ex�cuter la commande <code>make install</code> afin de les
3358+ installer. Le binaire <code>suexec</code> sera install� dans le
3359+ r�pertoire d�fini � l'aide de l'option <code>--sbindir</code>. La
3360+ localisation par d�faut est "/usr/local/apache2/bin/suexec".</p>
3361+ <p>Veuillez noter que vous aurez besoin des
3362+ <strong><em>privil�ges root</em></strong> pour passer l'�tape de
3363+ l'installation. Pour que le conteneur puisse changer
3364+ l'identifiant utilisateur, il doit avoir comme propri�taire
3365+ <code><em>root</em></code>, et les droits du fichier doivent
3366+ inclure le bit d'ex�cution setuserid.</p>
3367+
3368+
3369+ <h3>&gt;Mise en place de permissions pour
3370+ parano�aque</h3>
3371+
3372+ <p>Bien que le conteneur suEXEC v�rifie que l'utilisateur qui
3373+ l'appelle correspond bien � l'utilisateur sp�cifi� � l'aide de
3374+ l'option <code>--with-suexec-caller</code> du programme
3375+ <code class="program"><a href="./programs/configure.html">configure</a></code>, il subsiste toujours le risque qu'un
3376+ appel syst�me ou une biblioth�que fasse appel � suEXEC avant que
3377+ cette v�rification ne soit exploitable sur votre syst�me. Pour
3378+ tenir compte de ceci, et parce que c'est en g�n�ral la meilleure
3379+ pratique, vous devez utiliser les permissions du syst�me de
3380+ fichiers afin de vous assurer que seul le groupe sous lequel
3381+ s'ex�cute httpd puisse faire appel � suEXEC.</p>
3382+
3383+ <p>Si, par exemple, votre serveur web est configur� pour
3384+ s'ex�cuter en tant que :</p>
3385+
3386+<pre class="prettyprint lang-config">User www
3387+Group webgroup</pre>
3388+
3389+
3390+ <p>et <code class="program"><a href="./programs/suexec.html">suexec</a></code> se trouve �
3391+ "/usr/local/apache2/bin/suexec", vous devez ex�cuter les
3392+ commandes</p>
3393+
3394+<div class="example"><p><code>
3395+ chgrp webgroup /usr/local/apache2/bin/suexec<br />
3396+ chmod 4750 /usr/local/apache2/bin/suexec<br />
3397+</code></p></div>
3398+
3399+ <p>Ceci permet de s'assurer que seul le groupe sous lequel httpd
3400+ s'ex�cute (ici webgroup) puisse faire appel au conteneur
3401+ suEXEC.</p>
3402+
3403+</div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
3404+<div class="section">
3405+<h2><a name="enable" id="enable">Activation et d�sactivation
3406+de suEXEC</a></h2>
3407+
3408+ <p>Au d�marrage, httpd v�rifie la pr�sence du fichier
3409+ <code class="program"><a href="./programs/suexec.html">suexec</a></code> dans le r�pertoire d�fini par
3410+ l'option <code>--sbindir</code> du script configure (le
3411+ r�pertoire par d�faut est "/usr/local/apache/sbin/suexec"). Si
3412+ httpd trouve un conteneur suEXEC correctement configur�, il
3413+ enregistrera le message suivant dans le journal des erreurs :</p>
3414+
3415+<div class="example"><p><code>
3416+ [notice] suEXEC mechanism enabled (wrapper: <var>/path/to/suexec</var>)
3417+</code></p></div>
3418+
3419+ <p>Si ce message n'est pas g�n�r� au d�marrage du serveur, ce
3420+ dernier ne trouve probablement pas le programme conteneur �
3421+ l'endroit o� il est sens� �tre, ou l'ex�cutable suexec n'est pas
3422+ install� en <em>setuid root</em>.</p>
3423+
3424+ <p>Si le serveur HTTP Apache est d�j� en cours d'ex�cution, et si
3425+ vous activez le m�canisme suEXEC pour la premi�re fois, vous
3426+ devez arr�ter et red�marrer httpd. Un red�marrage
3427+ � l'aide d'un simple signal HUP ou USR1 suffira. </p>
3428+ <p>Pour d�sactiver suEXEC, vous devez supprimer le fichier
3429+ <code class="program"><a href="./programs/suexec.html">suexec</a></code>, puis arr�ter et red�marrer
3430+ httpd.</p>
3431+</div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
3432+<div class="section">
3433+<h2><a name="usage" id="usage">Utilisation de suEXEC</a></h2>
3434+
3435+ <p>Les requ�tes pour des programmes CGI ne feront appel au
3436+ conteneur suEXEC que si elles concernent un h�te virtuel
3437+ contenant une directive <code class="directive"><a href="./mod/mod_suexec.html#suexecusergroup">SuexecUserGroup</a></code>, ou si elles sont
3438+ trait�es par <code class="module"><a href="./mod/mod_userdir.html">mod_userdir</a></code>.</p>
3439+
3440+ <p><strong>H�tes virtuels :</strong><br /> Une des m�thodes
3441+ d'utilisation du conteneur suEXEC consiste � ins�rer une
3442+ directive <code class="directive"><a href="./mod/mod_suexec.html#suexecusergroup">SuexecUserGroup</a></code> dans une section
3443+ <code class="directive"><a href="./mod/core.html#virtualhost">VirtualHost</a></code>. En d�finissant
3444+ des valeurs diff�rentes de celles du serveur principal, toutes les
3445+ requ�tes pour des ressources CGI seront ex�cut�es sous
3446+ les <em>User</em> et <em>Group</em> d�finis pour cette section
3447+ <code class="directive"><a href="./mod/core.html#virtualhost">&lt;VirtualHost&gt;</a></code>. Si cette
3448+ directive est absente de la section <code class="directive"><a href="./mod/core.html#virtualhost">&lt;VirtualHost&gt;</a></code>, l'utilisateur du
3449+ serveur principal sera pris par d�faut</p>
3450+
3451+ <p><strong>R�pertoires des utilisateurs :</strong><br /> Avec
3452+ cette m�thode, les
3453+ requ�tes trait�es par <code class="module"><a href="./mod/mod_userdir.html">mod_userdir</a></code> appelleront le
3454+ conteneur suEXEC pour ex�cuter le programme CGI sous l'identifiant
3455+ utilisateur du r�pertoire utilisateur concern�. Seuls pr�requis
3456+ pour pouvoir acc�der � cette fonctionnalit� : l'ex�cution des CGI
3457+ doit �tre activ�e pour l'utilisateur concern�, et le script doit
3458+ passer avec succ�s le test des <a href="#model">v�rifications de
3459+ s�curit�</a> d�crit plus haut. Voir aussi l'
3460+ <a href="#install">option de compilation</a>
3461+ <code>--with-suexec-userdir</code>.</p> </div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
3462+<div class="section">
3463+<h2><a name="debug" id="debug">D�bogage de suEXEC</a></h2>
3464+
3465+ <p>Le conteneur suEXEC va �crire ses informations de journalisation
3466+ dans le fichier d�fini par l'option de compilation
3467+ <code>--with-suexec-logfile</code> comme indiqu� plus haut. Si vous
3468+ pensez avoir configur� et install� correctement le conteneur,
3469+ consultez ce journal, ainsi que le journal des erreurs du serveur
3470+ afin de d�terminer l'endroit o� vous avez fait fausse route.</p>
3471+
3472+</div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
3473+<div class="section">
3474+<h2><a name="jabberwock" id="jabberwock">Avis � la population !
3475+ Avertissements et exemples</a></h2>
3476+
3477+ <p><strong>NOTE !</strong> Cette section est peut-�tre incompl�te.
3478+ Pour en consulter la derni�re r�vision, voir la version de la <a href="http://httpd.apache.org/docs/2.4/suexec.html">Documentation en ligne</a>.</p>
3479+
3480+ <p>Quelques points importants du conteneur peuvent
3481+ imposer des contraintes du point de vue de la configuration du
3482+ serveur. Veuillez en prendre connaissance avant de soumettre un
3483+ rapport de bogue � propos de suEXEC.</p>
3484+
3485+ <ul>
3486+ <li><strong>Points importants de suEXEC</strong></li>
3487+
3488+ <li>
3489+ Limitations concernant la hi�rarchie.
3490+
3491+ <p class="indent">
3492+ Pour des raisons de s�curit� et d'efficacit�, toutes les
3493+ requ�tes suEXEC ne doivent concerner que des ressources
3494+ situ�es dans la racine des documents d�finie pour les
3495+ requ�tes concernant un h�te virtuel, ou des ressources
3496+ situ�es dans la racine des documents d�finies pour les
3497+ requ�tes concernant un r�pertoire utilisateur. Par exemple,
3498+ si vous avez configur� quatre h�tes virtuels, vous devrez
3499+ d�finir la structure des racines de documents de vos h�tes
3500+ virtuels en dehors d'une hi�rarchie de documents principale
3501+ de httpd, afin de tirer parti de suEXEC dans le contexte des
3502+ h�tes virtuels (Exemple � venir).
3503+ </p>
3504+ </li>
3505+
3506+ <li>
3507+ La variable d'environnement PATH de suEXEC
3508+
3509+ <p class="indent">
3510+ Modifier cette variable peut s'av�rer dangereux. Assurez-vous
3511+ que tout chemin que vous ajoutez � cette variable est un
3512+ r�pertoire <strong>de confiance</strong>. Vous n'avez
3513+ probablement pas l'intention d'ouvrir votre serveur de fa�on
3514+ � ce que l'on puisse y ex�cuter un cheval de Troie.
3515+ </p>
3516+ </li>
3517+
3518+ <li>
3519+ Modification de suEXEC
3520+
3521+ <p class="indent">
3522+ Encore une fois, ceci peut vous causer de
3523+ <strong>graves ennuis</strong> si vous vous y essayez sans
3524+ savoir ce que vous faites. Evitez de vous y risquer dans la
3525+ mesure du possible.
3526+ </p>
3527+ </li>
3528+ </ul>
3529+
3530+</div></div>
3531+<div class="bottomlang">
3532+<p><span>Langues Disponibles: </span><a href="./en/suexec.html" hreflang="en" rel="alternate" title="English">&nbsp;en&nbsp;</a> |
3533+<a href="./fr/suexec.html" title="Fran�ais">&nbsp;fr&nbsp;</a> |
3534+<a href="./ja/suexec.html" hreflang="ja" rel="alternate" title="Japanese">&nbsp;ja&nbsp;</a> |
3535+<a href="./ko/suexec.html" hreflang="ko" rel="alternate" title="Korean">&nbsp;ko&nbsp;</a> |
3536+<a href="./tr/suexec.html" hreflang="tr" rel="alternate" title="T�rk�e">&nbsp;tr&nbsp;</a></p>
3537+</div><div class="top"><a href="#page-header"><img src="./images/up.gif" alt="top" /></a></div><div class="section"><h2><a id="comments_section" name="comments_section">Commentaires</a></h2><div class="warning"><strong>Notice:</strong><br />This is not a Q&amp;A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed again by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Freenode, or sent to our <a href="http://httpd.apache.org/lists.html">mailing lists</a>.</div>
3538+<script type="text/javascript"><!--//--><![CDATA[//><!--
3539+var comments_shortname = 'httpd';
3540+var comments_identifier = 'http://httpd.apache.org/docs/2.4/suexec.html';
3541+(function(w, d) {
3542+ if (w.location.hostname.toLowerCase() == "httpd.apache.org") {
3543+ d.write('<div id="comments_thread"><\/div>');
3544+ var s = d.createElement('script');
3545+ s.type = 'text/javascript';
3546+ s.async = true;
3547+ s.src = 'https://comments.apache.org/show_comments.lua?site=' + comments_shortname + '&page=' + comments_identifier;
3548+ (d.getElementsByTagName('head')[0] || d.getElementsByTagName('body')[0]).appendChild(s);
3549+ }
3550+ else {
3551+ d.write('<div id="comments_thread">Comments are disabled for this page at the moment.<\/div>');
3552+ }
3553+})(window, document);
3554+//--><!]]></script></div><div id="footer">
3555+<p class="apache">Copyright 2018 The Apache Software Foundation.<br />Autoris� sous <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a>.</p>
3556+<p class="menu"><a href="./mod/">Modules</a> | <a href="./mod/directives.html">Directives</a> | <a href="http://wiki.apache.org/httpd/FAQ">FAQ</a> | <a href="./glossary.html">Glossaire</a> | <a href="./sitemap.html">Plan du site</a></p></div><script type="text/javascript"><!--//--><![CDATA[//><!--
3557+if (typeof(prettyPrint) !== 'undefined') {
3558+ prettyPrint();
3559+}
3560+//--><!]]></script>
3561+</body></html>
3562\ No newline at end of file
3563diff --git a/docs/manual/suexec.html.ja.utf8 b/docs/manual/suexec.html.ja.utf8
3564new file mode 100644
3565index 0000000..6023bb9
3566--- /dev/null
3567+++ b/docs/manual/suexec.html.ja.utf8
3568@@ -0,0 +1,643 @@
3569+<?xml version="1.0" encoding="UTF-8"?>
3570+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3571+<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja"><head>
3572+<meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
3573+<!--
3574+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
3575+ This file is generated from xml source: DO NOT EDIT
3576+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
3577+ -->
3578+<title>suEXEC サポート - Apache HTTP サーバ バージョン 2.4</title>
3579+<link href="./style/css/manual.css" rel="stylesheet" media="all" type="text/css" title="Main stylesheet" />
3580+<link href="./style/css/manual-loose-100pc.css" rel="alternate stylesheet" media="all" type="text/css" title="No Sidebar - Default font size" />
3581+<link href="./style/css/manual-print.css" rel="stylesheet" media="print" type="text/css" /><link rel="stylesheet" type="text/css" href="./style/css/prettify.css" />
3582+<script src="./style/scripts/prettify.min.js" type="text/javascript">
3583+</script>
3584+
3585+<link href="./images/favicon.ico" rel="shortcut icon" /></head>
3586+<body id="manual-page"><div id="page-header">
3587+<p class="menu"><a href="./mod/">モジュール</a> | <a href="./mod/directives.html">ディレクティブ</a> | <a href="http://wiki.apache.org/httpd/FAQ">FAQ</a> | <a href="./glossary.html">用語</a> | <a href="./sitemap.html">サイトマップ</a></p>
3588+<p class="apache">Apache HTTP サーバ バージョン 2.4</p>
3589+<img alt="" src="./images/feather.png" /></div>
3590+<div class="up"><a href="./"><img title="&lt;-" alt="&lt;-" src="./images/left.gif" /></a></div>
3591+<div id="path">
3592+<a href="http://www.apache.org/">Apache</a> &gt; <a href="http://httpd.apache.org/">HTTP サーバ</a> &gt; <a href="http://httpd.apache.org/docs/">ドキュメンテーション</a> &gt; <a href="./">バージョン 2.4</a></div><div id="page-content"><div id="preamble"><h1>suEXEC サポート</h1>
3593+<div class="toplang">
3594+<p><span>翻訳済み言語: </span><a href="./en/suexec.html" hreflang="en" rel="alternate" title="English">&nbsp;en&nbsp;</a> |
3595+<a href="./fr/suexec.html" hreflang="fr" rel="alternate" title="Français">&nbsp;fr&nbsp;</a> |
3596+<a href="./ja/suexec.html" title="Japanese">&nbsp;ja&nbsp;</a> |
3597+<a href="./ko/suexec.html" hreflang="ko" rel="alternate" title="Korean">&nbsp;ko&nbsp;</a> |
3598+<a href="./tr/suexec.html" hreflang="tr" rel="alternate" title="Türkçe">&nbsp;tr&nbsp;</a></p>
3599+</div>
3600+<div class="outofdate">この日本語訳はすでに古くなっている
3601+ 可能性があります。
3602+ 最近更新された内容を見るには英語版をご覧下さい。
3603+ </div>
3604+
3605+ <p><strong>suEXEC</strong>
3606+ 機能により、Apache ユーザは Web サーバを実行しているユーザ ID とは
3607+ 異なるユーザ ID で <strong>CGI</strong> プログラムや <strong>SSI</strong>
3608+ プログラムを実行することができます。CGI プログラムまたは SSI
3609+ プログラムを実行する場合、通常は web サーバと同じユーザで実行されます。
3610+ </p>
3611+
3612+ <p>適切に使用すると、この機能によりユーザが個別の CGI
3613+ や SSI プログラムを開発し実行することで生じるセキュリティ上の危険を、
3614+ かなり減らすことができます。しかし、suEXEC の設定が不適切だと、
3615+ 多くの問題が生じ、あなたのコンピュータに新しいセキュリティホールを
3616+ 作ってしまう可能性があります。あなたが <em>setuid root</em>
3617+ されたプログラムと、それらから生じるセキュリティ上の問題の管理に
3618+ 詳しくないようなら、suEXEC の使用を検討しないように強く推奨します。
3619+ </p>
3620+ </div>
3621+<div id="quickview"><a href="https://www.apache.org/foundation/contributing.html" class="badge"><img src="https://www.apache.org/images/SupportApache-small.png" alt="Support Apache!" /></a><ul id="toc"><li><img alt="" src="./images/down.gif" /> <a href="#before">始める前に</a></li>
3622+<li><img alt="" src="./images/down.gif" /> <a href="#model">suEXEC セキュリティモデル</a></li>
3623+<li><img alt="" src="./images/down.gif" /> <a href="#install">suEXEC
3624+ の設定とインストール</a></li>
3625+<li><img alt="" src="./images/down.gif" /> <a href="#enable">suEXEC
3626+ の有効化と無効化</a></li>
3627+<li><img alt="" src="./images/down.gif" /> <a href="#usage">suEXEC の使用</a></li>
3628+<li><img alt="" src="./images/down.gif" /> <a href="#debug">suEXEC のデバッグ</a></li>
3629+<li><img alt="" src="./images/down.gif" /> <a href="#jabberwock">とかげに注意: 警告と事例</a></li>
3630+</ul><h3>参照</h3><ul class="seealso"><li><a href="#comments_section">コメント</a></li></ul></div>
3631+<div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
3632+<div class="section">
3633+<h2><a name="before" id="before">始める前に</a></h2>
3634+
3635+ <p>この文書の先頭に飛ぶ前に、Apache
3636+ グループとこの文書での仮定を知っておくべきでしょう。
3637+ </p>
3638+
3639+ <p>第 1 に、あなたが <strong>setuid</strong> と
3640+ <strong>setgid</strong> 操作が可能な UNIX
3641+ 由来のオペレーティングシステムを使っていることを想定しています。
3642+ これは、すべてのコマンド例にあてはまります。
3643+ その他のプラットホームでは、もし suEXEC
3644+ がサポートされていたとしても設定は異なるかもしれません。</p>
3645+
3646+ <p>第 2 に、あなたが使用中のコンピュータの
3647+ セキュリティに関する基本的な概念と、それらの管理について詳しいことを
3648+ 想定しています。これは、<strong>setuid/setgid</strong>
3649+ 操作、あなたのシステム上でのその操作による様々な効果、
3650+ セキュリティレベルについてあなたが理解しているということを含みます。
3651+ </p>
3652+
3653+ <p>第 3 に、<strong>改造されていない</strong> suEXEC
3654+ コードの使用を想定しています。suEXEC のコードは、
3655+ 多くのベータテスタだけでなく、開発者によっても注意深く精査され
3656+ テストされています。それらの注意により、簡潔で信頼できる安全な
3657+ コードの基盤が保証されます。このコードを改変することで、
3658+ 予期されない問題や新しいセキュリティ上の危険が生じることがあります。
3659+ セキュリティプログラミングの詳細に通じていて、
3660+ 今後の検討のために成果を Apache
3661+ グループと共有しようと思うのでなければ、suEXEC
3662+ コードは変えないことを <strong>強く</strong>推奨します。</p>
3663+
3664+ <p>第 4 に、これが最後ですが、suEXEC を Apache
3665+ のデフォルトインストールには<strong>含めない</strong>ことが
3666+ Apache グループで決定されています。これは、suEXEC
3667+ の設定には管理者の詳細にわたる慎重な注意が必要だからです。
3668+ suEXEC の様々な設定について検討が終われば、管理者は suEXEC
3669+ を通常のインストール方法でインストールすることができます。
3670+ これらの設定値は、suEXEC
3671+ 機能の使用中にシステムセキュリティを適切に保つために、
3672+ 管理者によって慎重に決定され指定されることが必要です。
3673+ この詳細な手順により、Apache グループは、suEXEC
3674+ のインストールについて、注意深く十分に検討してそれを使用することを
3675+ 決定した場合に限っていただきたいと考えています。
3676+ </p>
3677+
3678+ <p>それでも進みますか? よろしい。では、先へ進みましょう!</p>
3679+ </div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
3680+<div class="section">
3681+<h2><a name="model" id="model">suEXEC セキュリティモデル</a></h2>
3682+
3683+ <p>suEXEC の設定とインストールを始める前に、
3684+ まず実装しようとしているセキュリティモデルについて論じておきます。
3685+ それには、suEXEC の内部で行なわれていること、
3686+ システムのセキュリティを保証するために警告されることを
3687+ よく理解しておいた方がよいでしょう。</p>
3688+
3689+ <p><strong>suEXEC</strong> は、Apache web
3690+ サーバから呼び出される setuid された "wrapper"
3691+ プログラムが基本となっています。設計した CGI、または SSI
3692+ プログラムへの HTTP リクエストがあると、この wrapper
3693+ が呼び出されます。このようなリクエストがあると、Apache
3694+ はそのプログラムが実行される際のプログラム名とユーザ ID とグループ
3695+ ID を指定して suEXEC wrapper を実行します。
3696+ </p>
3697+
3698+ <p>それから、wrapper は成功または失敗を決定するため
3699+ 以下の処理を行ないます。これらの状態のうち一つでも失敗した場合、
3700+ プログラムは失敗をログに記録してエラーで終了します。
3701+ そうでなければ、後の処理が続けられます。</p>
3702+
3703+ <ol>
3704+ <li>
3705+ <strong>wrapper
3706+ を実行しているユーザはこのシステムの正当なユーザか?</strong>
3707+
3708+ <p class="indent">
3709+ これは、wrapper を実行しているユーザが
3710+ 本当にシステムの利用者であることを保証するためです。
3711+ </p>
3712+ </li>
3713+
3714+
3715+ <li>
3716+ <strong>wrapper が適切な数の引数で呼び出されたか?</strong>
3717+
3718+
3719+ <p class="indent">
3720+ wrapper は適切な数の引数が与えられた場合にのみ実行されます。
3721+ 適切な引数のフォーマットは Apache Web サーバに解釈されます。
3722+ 適切な数の引数を受け取らなければ、攻撃をされたか
3723+ あなたの Apache バイナリの suEXEC の部分が
3724+ どこかおかしい可能性があります。
3725+ </p>
3726+ </li>
3727+
3728+ <li>
3729+ <strong>この正当なユーザは wrapper
3730+ の実行を許可されているか?</strong>
3731+
3732+ <p class="indent">
3733+ このユーザは wrapper 実行を許可されたユーザですか?
3734+ ただ一人のユーザ (Apache ユーザ) だけが、
3735+ このプログラムの実行を許可されます。
3736+ </p>
3737+ </li>
3738+
3739+ <li>
3740+ <strong>対象の CGI, SSI プログラムが安全でない階層の参照をしているか?
3741+ </strong>
3742+
3743+ <p class="indent">
3744+ 対象の CGI, SSI プログラムが '/' から始まる、または
3745+ '..' による参照を行なっていますか? これらは許可されません。
3746+ 対象のプログラムは suEXEC のドキュメントルート
3747+ (下記の <code>--with-suexec-docroot=<em>DIR</em></code> を参照)
3748+ 内に存在しなければなりません。
3749+ </p>
3750+ </li>
3751+
3752+ <li>
3753+ <strong>対象となるユーザ名は正当なものか?</strong>
3754+
3755+ <p class="indent">
3756+ 対象となるユーザ名は存在していますか?
3757+ </p>
3758+ </li>
3759+
3760+ <li>
3761+ <strong>対象となるグループ名は正当なものか?</strong>
3762+
3763+ <p class="indent">
3764+ 対象となるグループ名は存在していますか?
3765+ </p>
3766+ </li>
3767+
3768+ <li>
3769+ <strong>目的のユーザはスーパーユーザでは<em>ない</em>か?
3770+ </strong>
3771+
3772+ <p class="indent">
3773+ 今のところ、suEXEC は <code><em>root</em></code> による CGI/SSI
3774+ プログラムの実行を許可していません。
3775+ </p>
3776+ </li>
3777+
3778+ <li>
3779+ <strong>対象となるユーザ ID は、最小の ID
3780+ 番号よりも<em>大きい</em>か? </strong>
3781+
3782+ <p class="indent">
3783+ 最小ユーザ ID 番号は設定時に指定されます。これは、
3784+ CGI/SSI プログラム実行を許可されるユーザ ID
3785+ のとりうる最小値です。これは
3786+ "system" 用のアカウントを閉め出すのに有効です。
3787+ </p>
3788+ </li>
3789+
3790+ <li>
3791+ <strong>対象となるグループはスーパーユーザのグループでは
3792+ <em>ない</em>か?</strong>
3793+
3794+ <p class="indent">
3795+ 今のところ、suEXEC は 'root' グループによる CGI/SSI
3796+ プログラムの実行を許可していません。
3797+ </p>
3798+ </li>
3799+
3800+ <li>
3801+ <strong>対象となるグループ ID は最小の ID
3802+ 番号よりも<em>大きい</em>か?</strong>
3803+
3804+ <p class="indent">
3805+ 最小グループ ID 番号は設定時に指定されます。これは、
3806+ CGI/SSI プログラム実行を許可されるグループ
3807+ ID のとりうる最小値です。
3808+ これは "system" 用のグループを閉め出すのに有効です。
3809+ </p>
3810+ </li>
3811+
3812+ <li>
3813+ <strong>wrapper が正常に対象となるユーザとグループになれるか?
3814+ </strong>
3815+
3816+ <p class="indent">
3817+ ここで、setuid と setgid
3818+ の起動によりプログラムは対象となるユーザとグループになります。
3819+ グループアクセスリストは、
3820+ ユーザが属しているすべてのグループで初期化されます。
3821+ </p>
3822+ </li>
3823+
3824+ <li>
3825+ <strong>CGI/SSI プログラムが置かれているディレクトリに移動
3826+ (change directory) できるか?</strong>
3827+
3828+ <p class="indent">
3829+ ディレクトリが存在しないなら、そのファイルも存在しないかもしれません。
3830+ ディレクトリに移動できないのであれば、おそらく存在もしないでしょう。
3831+ </p>
3832+ </li>
3833+
3834+ <li>
3835+ <strong>ディレクトリが Apache のドキュメントツリー内にあるか?
3836+ </strong>
3837+
3838+ <p class="indent">
3839+ リクエストがサーバ内のものであれば、
3840+ 要求されたディレクトリが suEXEC のドキュメントルート配下にありますか?
3841+ リクエストが UserDir のものであれば、要求されたディレクトリが suEXEC
3842+ のユーザのドキュメントルート配下にありますか?
3843+ (<a href="#install">suEXEC 設定オプション</a> 参照)
3844+ </p>
3845+ </li>
3846+
3847+ <li>
3848+ <strong>ディレクトリを他のユーザが書き込めるようになって
3849+ <em>いない</em>か?</strong>
3850+
3851+ <p class="indent">
3852+ ディレクトリを他ユーザに開放しないようにします。
3853+ 所有ユーザだけがこのディレクトリの内容を改変できるようにします。
3854+ </p>
3855+ </li>
3856+
3857+
3858+ <li>
3859+ <strong>対象となる CGI/SSI プログラムは存在するか?</strong>
3860+
3861+ <p class="indent">
3862+ 存在しなければ実行できません。
3863+ </p>
3864+ </li>
3865+
3866+ <li>
3867+ <strong>対象となる CGI/SSI プログラムファイルが他アカウントから
3868+ 書き込めるようになって<em>いない</em>か?</strong>
3869+
3870+ <p class="indent">
3871+ 所有者以外には CGI/SSI プログラムを変更する権限は与えられません。
3872+ </p>
3873+ </li>
3874+
3875+
3876+ <li>
3877+ <strong>対象となる CGI/SSI プログラムが setuid または setgid
3878+ されて<em>いない</em>か?</strong>
3879+
3880+ <p class="indent">
3881+ UID/GID を再度変更してのプログラム実行はしません
3882+ </p>
3883+ </li>
3884+
3885+
3886+ <li>
3887+ <strong>対象となるユーザ/グループがプログラムの
3888+ ユーザ/グループと同じか?</strong>
3889+
3890+ <p class="indent">
3891+ ユーザがそのファイルの所有者ですか?
3892+ </p>
3893+ </li>
3894+
3895+ <li>
3896+ <strong>安全な動作を保証するための環境変数クリアが可能か?
3897+ </strong>
3898+
3899+ <p class="indent">
3900+ suEXEC は、安全な環境変数のリスト
3901+ (これらは設定時に作成されます) 内の変数として渡される安全な
3902+ PATH 変数 (設定時に指定されます) を設定することで、
3903+ プロセスの環境変数をクリアします。
3904+ </p>
3905+ </li>
3906+
3907+
3908+ <li>
3909+ <strong>対象となる CGI/SSI プログラムを exec して実行できるか?</strong>
3910+
3911+
3912+ <p class="indent">
3913+ ここで suEXEC が終了し、対象となるプログラムが開始されます。
3914+ </p>
3915+ </li>
3916+ </ol>
3917+
3918+ <p>ここまでが suEXEC の wrapper
3919+ におけるセキュリティモデルの標準的な動作です。もう少し厳重に
3920+ CGI/SSI 設計についての新しい制限や規定を取り入れることもできますが、
3921+ suEXEC はセキュリティに注意して慎重に少しずつ開発されてきました。
3922+ </p>
3923+
3924+ <p>このセキュリティモデルを用いて
3925+ サーバ設定時にどのように許すことを制限するか、また、suEXEC
3926+ を適切に設定するとどのようなセキュリティ上の危険を避けられるかに
3927+ 関するより詳しい情報については、<a href="#jabberwock">"とかげに注意"
3928+ (Beware the Jabberwock)</a> の章を参照してください。
3929+ </p>
3930+ </div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
3931+<div class="section">
3932+<h2><a name="install" id="install">suEXEC
3933+ の設定とインストール</a></h2>
3934+
3935+ <p>ここから楽しくなります。</p>
3936+
3937+ <p><strong>suEXEC
3938+ 設定オプション</strong><br />
3939+ </p>
3940+
3941+ <dl>
3942+ <dt><code>--enable-suexec</code></dt>
3943+
3944+ <dd>このオプションは、デフォルトではインストールされず、
3945+ 有効にはならない suEXEC 機能を有効にします。
3946+ suEXEC を使うように APACI に要求するには、<code>--enable-suexec</code>
3947+ オプションにあわせて少なくとも一つは <code>--with-suexec-xxxxx</code>
3948+ オプションが指定されなければなりません。</dd>
3949+
3950+ <dt><code>--with-suexec-bin=<em>PATH</em></code></dt>
3951+
3952+ <dd>セキュリティ上の理由により、<code>suexec</code> バイナリのパスはサーバに
3953+ ハードコードされている必要があります。デフォルトのパスを
3954+ 変えたいときはこのオプションを使ってください。<em>例えば</em>、
3955+ <code>--with-suexec-bin=/usr/sbin/suexec</code> のように。</dd>
3956+
3957+ <dt><code>--with-suexec-caller=<em>UID</em></code></dt>
3958+
3959+ <dd>Apache を通常動作させる<a href="mod/mpm_common.html#user">ユーザ名</a>を指定します。
3960+ このユーザだけが suexec の実行を許可されたユーザになります。</dd>
3961+
3962+ <dt><code>--with-suexec-userdir=<em>DIR</em></code></dt>
3963+
3964+ <dd>suEXEC がアクセスを許されるユーザホームディレクトリ配下の
3965+ サブディレクトリを指定します。
3966+ このディレクトリ以下の全実行ファイルは、"安全な"プログラムになるよう、
3967+ suEXEC がそのユーザとして実行できるようにします。
3968+ "単純な" UserDir ディレクティブを使っている場合
3969+ (すなわち "*" を含まないもの)、これと同じ値を設定すべきです。
3970+ Userdir ディレクティブがそのユーザのパスワードファイル内の
3971+ ホームディレクトリと同じ場所を指していなければ、
3972+ suEXEC は適切に動作しません。デフォルトは "public_html" です。
3973+ <br />
3974+ 各 UserDir が異なった仮想ホストを設定している場合、
3975+ それらを全て一つの親ディレクトリに含めて、
3976+ その親ディレクトリの名前をここで指定する必要があります。
3977+ <strong>このように指定されなければ "~userdir" cgi
3978+ へのリクエストが動作しません。</strong></dd>
3979+
3980+ <dt><code>--with-suexec-docroot=<em>DIR</em></code></dt>
3981+
3982+ <dd>Apache のドキュメントルートを設定します。これが suEXEC
3983+ の動作で使用する唯一のディレクトリ階層になります (UserDir
3984+ の指定は別)。デフォルトでは <code>--datedir</code> に "/htdocs"
3985+ というサフィックスをつけたものです。
3986+ "<code>--datadir=/home/apache</code>" として設定すると、
3987+ suEXEC wrapper にとって "/home/apache/htdocs"
3988+ がドキュメントルートとして使われます。</dd>
3989+
3990+ <dt><code>--with-suexec-uidmin=<em>UID</em></code></dt>
3991+
3992+ <dd>suEXEC の対象ユーザとして許される UID の最小値を指定します。
3993+ 大抵のシステムでは 500 か 100 が一般的です。
3994+ デフォルト値は 100 です。</dd>
3995+
3996+ <dt><code>--with-suexec-gidmin=<em>GID</em></code></dt>
3997+
3998+ <dd>suEXEC の対象グループとして許される GID
3999+ の最小値を指定します。大抵のシステムでは 100 が一般的なので、
4000+ デフォルト値としても 100 が使われています。</dd>
4001+
4002+ <dt><code>--with-suexec-logfile=<em>FILE</em></code></dt>
4003+
4004+ <dd>suEXEC の処理とエラーが記録されるファイル名を指定します。
4005+ (監査やデバッグ目的に有用)
4006+ デフォルトではログファイルは "suexec_log" という名前で、
4007+ 標準のログファイルディレクトリ (<code>--logfiledir</code>) に置かれます。
4008+ </dd>
4009+
4010+ <dt><code>--with-suexec-safepath=<em>PATH</em></code></dt>
4011+
4012+ <dd>CGI 実行ファイルに渡される安全な PATH 環境変数です。
4013+ デフォルト値は "/usr/local/bin:/usr/bin:/bin" です。
4014+ </dd>
4015+ </dl>
4016+
4017+ <p><strong>suEXEC wrapper
4018+ のコンパイルとインストール</strong><br />
4019+ <code>--enable-suexec</code> オプションで suEXEC 機能を有効にすると、
4020+ "make" コマンドを実行した時に <code>suexec</code> のバイナリ (Apache 自体も)
4021+ が自動的に作成されます。
4022+ <br />
4023+ すべての構成要素が作成されると、それらのインストールには
4024+ <code>make install</code> コマンドが実行できます。バイナリイメージの <code>suexec</code>
4025+ は <code>--sbindir</code> オプションで指定されたディレクトリにインストールされます。
4026+ デフォルトの場所は "/usr/local/apache/bin/suexec" です。<br />
4027+ インストール時には <strong><em>root</em></strong>
4028+ 権限が必要なので注意してください。wrapper がユーザ ID
4029+ を設定するために、所有者 <code><em>root</em></code>
4030+ でのセットユーザ ID
4031+ ビットをそのファイルのモードに設定しなければなりません。
4032+ </p>
4033+
4034+ <p><strong>安全なパーミッションを設定する</strong><br />
4035+ suEXEC ラッパーは、<code>--with-suexec-caller</code> <code class="program"><a href="./programs/configure.html">configure</a></code>
4036+ オプションで指定した正しいユーザで起動されていることを確認しますが、
4037+ システム上でこのチェックが行なわれる前に、
4038+ suEXEC が呼ぶシステムやライブラリが脆弱である可能性は残ります。対抗策として、
4039+ 一般に良い習慣ともされいますが、
4040+ ファイルシステムパーミッションを使って
4041+ Apache の実行時のグループのみが suEXEC を実行できるように
4042+ するのが良いでしょう。</p>
4043+
4044+ <p>たとえば、次のようにサーバが設定されていたとします。</p>
4045+
4046+<div class="example"><p><code>
4047+ User www<br />
4048+ Group webgroup<br />
4049+</code></p></div>
4050+
4051+ <p><code class="program"><a href="./programs/suexec.html">suexec</a></code> が "/usr/local/apache2/bin/suexec"
4052+ にインストールされていた場合、次のように設定する必要があります。</p>
4053+
4054+<div class="example"><p><code>
4055+ chgrp webgroup /usr/local/apache2/bin/suexec<br />
4056+ chmod 4750 /usr/local/apache2/bin/suexec<br />
4057+</code></p></div>
4058+
4059+ <p>これで Apache が実行されるグループのみが
4060+ suEXEC ラッパーを実行できるということを
4061+ 確証します。</p>
4062+ </div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
4063+<div class="section">
4064+<h2><a name="enable" id="enable">suEXEC
4065+ の有効化と無効化</a></h2>
4066+
4067+ <p>起動時に、Apache は <code>--sbindir</code>
4068+ オプションで設定されたディレクトリで
4069+ <code>suexec</code> を探します
4070+ (デフォルトは "/usr/local/apache/sbin/suexec") 。
4071+ 適切に設定された suEXEC がみつかると、
4072+ エラーログに以下のメッセージが出力されます。</p>
4073+
4074+<div class="example"><p><code>
4075+ [notice] suEXEC mechanism enabled (wrapper: <var>/path/to/suexec</var>)
4076+</code></p></div>
4077+
4078+ <p>サーバ起動時にこのメッセージが出ない場合、
4079+ 大抵はサーバが想定した場所で wrapper プログラムが見つからなかったか、
4080+ <em>setuid root</em> としてインストールされていないかです。</p>
4081+
4082+ <p>suEXEC の仕組みを使用するのが初めてで、Apache が既に動作中であれば、
4083+ Apache を kill して、再起動しなければなりません。HUP シグナルや
4084+ USR1 シグナルによる単純な再起動では不十分です。</p>
4085+ <p>suEXEC を無効にする場合は、<code>suexec</code> ファイルを削除してから
4086+ Apache を kill して再起動します。
4087+ </p>
4088+ </div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
4089+<div class="section">
4090+<h2><a name="usage" id="usage">suEXEC の使用</a></h2>
4091+
4092+ <p>CGI プログラムへのリクエストが suEXEC ラッパーを呼ぶのは、
4093+ <code class="directive"><a href="./mod/mod_suexec.html#suexecusergroup">SuexecUserGroup</a></code> ディレクティブを
4094+ 含むバーチャルホストへのリクエストか、<code class="module"><a href="./mod/mod_userdir.html">mod_userdir</a></code> により
4095+ 処理されたリクエストの場合に限ります。</p>
4096+
4097+ <p><strong>仮想ホスト:</strong><br />
4098+ suEXEC wrapper の使い方として、
4099+ <code class="directive"><a href="./mod/core.html#virtualhost">VirtualHost</a></code> 設定での
4100+ <code class="directive"><a href="./mod/mod_suexec.html#suexecusergroup">SuexecUserGroup</a></code>
4101+ ディレクティブを通したものがあります。
4102+ このディレクティブをメインサーバのユーザ ID
4103+ と異なるものにすると、CGI リソースへのすべてのリクエストは、その
4104+ <code class="directive"><a href="./mod/core.html#virtualhost">&lt;VirtualHost&gt;</a></code> で指定された <em>User</em> と
4105+ <em>Group</em> として実行されます。<code class="directive"><a href="./mod/core.html#virtualhost">&lt;VirtualHost&gt;</a></code>
4106+ でこのディレクティブが指定されていない場合、
4107+ メインサーバのユーザ ID が想定されます。</p>
4108+
4109+ <p><strong>ユーザディレクトリ:</strong><br />
4110+ <code class="module"><a href="./mod/mod_userdir.html">mod_userdir</a></code> により処理されたリクエストは
4111+ リクエストされたユーザディレクトリのユーザ ID で CGI プログラムを
4112+ 実行するために suEXEC ラッパーを呼びます。
4113+ この機能を動作させるために必要なことは、CGI
4114+ をそのユーザで実行できること、そのスクリプトが上記の<a href="#model">セキュリティ検査</a>をパスできることです。
4115+ <a href="#install">コンパイル
4116+ 時のオプション</a> <code>--with-suexec-userdir</code> も参照してください。</p>
4117+ </div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
4118+<div class="section">
4119+<h2><a name="debug" id="debug">suEXEC のデバッグ</a></h2>
4120+
4121+ <p>suEXEC wrapper は、上記で述べた <code>--with-suexec-logfile</code>
4122+ オプションで指定されたファイルにログ情報を記録します。
4123+ wrapper を適切に設定、インストールできていると思う場合、
4124+ どこで迷っているか見ようとするならこのログとサーバの
4125+ エラーログを見るとよいでしょう。</p>
4126+ </div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
4127+<div class="section">
4128+<h2><a name="jabberwock" id="jabberwock">とかげに注意: 警告と事例</a></h2>
4129+
4130+ <p><strong>注意!</strong>
4131+ この章は完全ではありません。この章の最新改訂版については、
4132+ Apache グループの<a href="http://httpd.apache.org/docs/2.4/suexec.html">
4133+ オンラインドキュメント</a>版を参照してください。
4134+ </p>
4135+
4136+ <p>サーバの設定に制限をもうける wrapper について、
4137+ いくつか興味深い点があります。suEXEC に関する "バグ"
4138+ を報告する前にこれらを確認してください。</p>
4139+
4140+ <ul>
4141+ <li><strong>suEXEC の興味深い点</strong></li>
4142+
4143+ <li>階層構造の制限
4144+
4145+
4146+ <p class="indent">
4147+ セキュリティと効率の理由から、<code>suEXEC</code> の全てのリクエストは
4148+ 仮想ホストへのリクエストにおける最上位のドキュメントルート内か、
4149+ ユーザディレクトリへのリクエストにおける個々のユーザの最上位の
4150+ ドキュメントルート内に残らなければなりません。
4151+ 例えば、四つの仮想ホストを設定している場合、
4152+ 仮想ホストの suEXEC に有利なように、メインの Apache
4153+ ドキュメント階層の外側に全ての仮想ホストのドキュメントルートを
4154+ 構築する必要があります。(例は後日記載)
4155+ </p>
4156+ </li>
4157+
4158+ <li>suEXEC の PATH 環境変数
4159+
4160+
4161+ <p class="indent">
4162+ これを変更するのは危険です。この指定に含まれる各パスが
4163+ <strong>信頼できる</strong>
4164+ ディレクトリであることを確認してください。
4165+ 世界からのアクセスにより、誰かがホスト上でトロイの木馬
4166+ を実行できるようにはしたくないでしょう。
4167+ </p>
4168+ </li>
4169+
4170+ <li>suEXEC コードの改造
4171+
4172+
4173+ <p class="indent">
4174+ 繰り返しますが、何をやろうとしているか把握せずにこれをやると
4175+ <strong>大きな問題</strong>を引き起こしかねません。
4176+ 可能な限り避けてください。
4177+ </p>
4178+ </li>
4179+ </ul>
4180+</div></div>
4181+<div class="bottomlang">
4182+<p><span>翻訳済み言語: </span><a href="./en/suexec.html" hreflang="en" rel="alternate" title="English">&nbsp;en&nbsp;</a> |
4183+<a href="./fr/suexec.html" hreflang="fr" rel="alternate" title="Français">&nbsp;fr&nbsp;</a> |
4184+<a href="./ja/suexec.html" title="Japanese">&nbsp;ja&nbsp;</a> |
4185+<a href="./ko/suexec.html" hreflang="ko" rel="alternate" title="Korean">&nbsp;ko&nbsp;</a> |
4186+<a href="./tr/suexec.html" hreflang="tr" rel="alternate" title="Türkçe">&nbsp;tr&nbsp;</a></p>
4187+</div><div class="top"><a href="#page-header"><img src="./images/up.gif" alt="top" /></a></div><div class="section"><h2><a id="comments_section" name="comments_section">コメント</a></h2><div class="warning"><strong>Notice:</strong><br />This is not a Q&amp;A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed again by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Freenode, or sent to our <a href="http://httpd.apache.org/lists.html">mailing lists</a>.</div>
4188+<script type="text/javascript"><!--//--><![CDATA[//><!--
4189+var comments_shortname = 'httpd';
4190+var comments_identifier = 'http://httpd.apache.org/docs/2.4/suexec.html';
4191+(function(w, d) {
4192+ if (w.location.hostname.toLowerCase() == "httpd.apache.org") {
4193+ d.write('<div id="comments_thread"><\/div>');
4194+ var s = d.createElement('script');
4195+ s.type = 'text/javascript';
4196+ s.async = true;
4197+ s.src = 'https://comments.apache.org/show_comments.lua?site=' + comments_shortname + '&page=' + comments_identifier;
4198+ (d.getElementsByTagName('head')[0] || d.getElementsByTagName('body')[0]).appendChild(s);
4199+ }
4200+ else {
4201+ d.write('<div id="comments_thread">Comments are disabled for this page at the moment.<\/div>');
4202+ }
4203+})(window, document);
4204+//--><!]]></script></div><div id="footer">
4205+<p class="apache">Copyright 2018 The Apache Software Foundation.<br />この文書は <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a> のライセンスで提供されています。.</p>
4206+<p class="menu"><a href="./mod/">モジュール</a> | <a href="./mod/directives.html">ディレクティブ</a> | <a href="http://wiki.apache.org/httpd/FAQ">FAQ</a> | <a href="./glossary.html">用語</a> | <a href="./sitemap.html">サイトマップ</a></p></div><script type="text/javascript"><!--//--><![CDATA[//><!--
4207+if (typeof(prettyPrint) !== 'undefined') {
4208+ prettyPrint();
4209+}
4210+//--><!]]></script>
4211+</body></html>
4212\ No newline at end of file
4213diff --git a/docs/manual/suexec.html.ko.euc-kr b/docs/manual/suexec.html.ko.euc-kr
4214new file mode 100644
4215index 0000000..19848ef
4216--- /dev/null
4217+++ b/docs/manual/suexec.html.ko.euc-kr
4218@@ -0,0 +1,564 @@
4219+<?xml version="1.0" encoding="EUC-KR"?>
4220+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
4221+<html xmlns="http://www.w3.org/1999/xhtml" lang="ko" xml:lang="ko"><head>
4222+<meta content="text/html; charset=EUC-KR" http-equiv="Content-Type" />
4223+<!--
4224+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
4225+ This file is generated from xml source: DO NOT EDIT
4226+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
4227+ -->
4228+<title>suEXEC ���� - Apache HTTP Server Version 2.4</title>
4229+<link href="./style/css/manual.css" rel="stylesheet" media="all" type="text/css" title="Main stylesheet" />
4230+<link href="./style/css/manual-loose-100pc.css" rel="alternate stylesheet" media="all" type="text/css" title="No Sidebar - Default font size" />
4231+<link href="./style/css/manual-print.css" rel="stylesheet" media="print" type="text/css" /><link rel="stylesheet" type="text/css" href="./style/css/prettify.css" />
4232+<script src="./style/scripts/prettify.min.js" type="text/javascript">
4233+</script>
4234+
4235+<link href="./images/favicon.ico" rel="shortcut icon" /></head>
4236+<body id="manual-page"><div id="page-header">
4237+<p class="menu"><a href="./mod/">���</a> | <a href="./mod/directives.html">���þ��</a> | <a href="http://wiki.apache.org/httpd/FAQ">FAQ</a> | <a href="./glossary.html">���</a> | <a href="./sitemap.html">����Ʈ��</a></p>
4238+<p class="apache">Apache HTTP Server Version 2.4</p>
4239+<img alt="" src="./images/feather.png" /></div>
4240+<div class="up"><a href="./"><img title="&lt;-" alt="&lt;-" src="./images/left.gif" /></a></div>
4241+<div id="path">
4242+<a href="http://www.apache.org/">Apache</a> &gt; <a href="http://httpd.apache.org/">HTTP Server</a> &gt; <a href="http://httpd.apache.org/docs/">Documentation</a> &gt; <a href="./">Version 2.4</a></div><div id="page-content"><div id="preamble"><h1>suEXEC ����</h1>
4243+<div class="toplang">
4244+<p><span>������ ���: </span><a href="./en/suexec.html" hreflang="en" rel="alternate" title="English">&nbsp;en&nbsp;</a> |
4245+<a href="./fr/suexec.html" hreflang="fr" rel="alternate" title="Fran&#231;ais">&nbsp;fr&nbsp;</a> |
4246+<a href="./ja/suexec.html" hreflang="ja" rel="alternate" title="Japanese">&nbsp;ja&nbsp;</a> |
4247+<a href="./ko/suexec.html" title="Korean">&nbsp;ko&nbsp;</a> |
4248+<a href="./tr/suexec.html" hreflang="tr" rel="alternate" title="T&#252;rk&#231;e">&nbsp;tr&nbsp;</a></p>
4249+</div>
4250+<div class="outofdate">�� ������ �ֽ��� ������ �ƴմϴ�.
4251+ �ֱٿ� ����� ������ ���� ������ �����ϼ���.</div>
4252+
4253+ <p><strong>suEXEC</strong> ����� ����ġ�� <strong>CGI</strong>��
4254+ <strong>SSI</strong> ���α׷��� �������� ������ ����� ID��
4255+ �ƴ� �ٸ� ����� ID�� �����ϵ��� �Ѵ�. ���� CGI�� SSI ���α׷���
4256+ �����ϸ� �������� ������ ����ڿ� ���� ����ڷ� �����Ѵ�.</p>
4257+
4258+ <p>�� ����� ������ ����ϸ� ����ڰ� ���� CGI�� SSI ���α׷���
4259+ �����ϰ� �����Ҷ� �߻��� �� �ִ� ���������� ����� ����
4260+ �� �ִ�. �׷��� suEXEC�� �������ϰ� �����Ǹ� ���� ������
4261+ ��ǻ�Ϳ� ���ο� ���� ������ ���� �� �ִ�. ���� <em>setuid root</em>
4262+ ���α׷��� �̷� ���α׷��� ���� ������ �����ϴٸ� suEXEC��
4263+ ��������ʱ� �������� �ٶ���.</p>
4264+ </div>
4265+<div id="quickview"><a href="https://www.apache.org/foundation/contributing.html" class="badge"><img src="https://www.apache.org/images/SupportApache-small.png" alt="Support Apache!" /></a><ul id="toc"><li><img alt="" src="./images/down.gif" /> <a href="#before">�����ϱ� ����</a></li>
4266+<li><img alt="" src="./images/down.gif" /> <a href="#model">suEXEC ���ȸ�</a></li>
4267+<li><img alt="" src="./images/down.gif" /> <a href="#install">suEXEC ������ ��ġ</a></li>
4268+<li><img alt="" src="./images/down.gif" /> <a href="#enable">suEXEC �� ���</a></li>
4269+<li><img alt="" src="./images/down.gif" /> <a href="#usage">suEXEC ����ϱ�</a></li>
4270+<li><img alt="" src="./images/down.gif" /> <a href="#debug">suEXEC ������ϱ�</a></li>
4271+<li><img alt="" src="./images/down.gif" /> <a href="#jabberwock">�ٽ� �ѹ� �����϶�: ���� ����</a></li>
4272+</ul><h3>����</h3><ul class="seealso"><li><a href="#comments_section">Comments</a></li></ul></div>
4273+<div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
4274+<div class="section">
4275+<h2><a name="before" id="before">�����ϱ� ����</a></h2>
4276+
4277+ <p>�����ϱ� ���� �켱 ����ġ�׷�� �� ������ ������ ������.</p>
4278+
4279+ <p>���� <strong>setuid</strong>�� <strong>setgid</strong>
4280+ ����� ������ ���н��� �ü���� ����Ѵٰ� �����Ѵ�. ���
4281+ ��ɾ� ���鵵 ���� ������ �Ѵ�. suEXEC�� �����ϴ� �ٸ� �÷�����
4282+ ����ϴٸ� ������ �ٸ� �� �ִ�.</p>
4283+
4284+ <p>�ι�°, ����� ��ǻ�� ������ �⺻ ����� ������ �ͼ��ϴٰ�
4285+ �����Ѵ�. ���⿡�� <strong>setuid/setgid</strong> ��ɰ�
4286+ �̵��� �ý��۰� ���ȿ� ��ġ�� ���� ���⿡ ���� ���ذ� ���Եȴ�.</p>
4287+
4288+ <p>����°, suEXEC �ڵ��� <strong>������������</strong>
4289+ ������ ����Ѵٰ� �����Ѵ�. �����ڿ� ���� ��Ÿ�׽��͵���
4290+ suEXEC�� ���õ� ��� �ڵ带 ���ɽ����� �����ϰ� �˻��ߴ�.
4291+ �ڵ带 �����ϰ� �ϰ� Ȯ���� ������ �����ϱ����� ��� ���Ǹ�
4292+ ��￴��. �� �ڵ带 �����ϸ� ����ġ���� ������ ���ο� ����
4293+ ������ �߻��� �� �ִ�. ���� ���α׷��ֿ� ���� �ſ� �� �˰�
4294+ �ڵ带 ���캸������ ����ġ�׷�� �۾��� ������ �ǻ簡 ���ٸ�
4295+ suEXEC �ڵ带 ���������ʱ� <strong>������</strong> ���Ѵ�.</p>
4296+
4297+ <p>�׹�°���� ����������, ����ġ�׷��� suEXEC�� ����ġ
4298+ �⺻��ġ�� �������� <strong>�ʱ��</strong> �����ߴ�. �ᱹ
4299+ �����ڰ� ���Ǹ� ��←�� suEXEC�� �����ؾ� �Ѵ�. suEXEC��
4300+ ���� ������ �� ������� �����ڴ� �Ϲ����� ��ġ����� suEXEC��
4301+ ��ġ�� �� �ִ�. suEXEC ����� ����ϴ� �ý����� ������ å������
4302+ �����ڴ� �� ���������� �����ְ� ���캸�� �����ؾ� �Ѵ�.
4303+ �̷� ���� ������ suEXEC�� ����Ҹ�ŭ �����ְ� ��ȣ��
4304+ ������� suEXEC�� ����ϵ��� ����ġ�׷��� ���ϱ� �����̴�.</p>
4305+
4306+ <p>������ ����ϱ� ���ϴ°�? �׷���? ����. ���� ��������!</p>
4307+</div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
4308+<div class="section">
4309+<h2><a name="model" id="model">suEXEC ���ȸ�</a></h2>
4310+
4311+ <p>suEXEC�� �����ϰ� ��ġ�ϱ� ���� �츮�� ���ȸ��� ����
4312+ �����Ѵ�. �̸� ���� ��Ȯ�� suEXEC �ȿ����� ���� ���� �Ͼ��
4313+ �ý����� ������ ���� ������ �����ؾ� ���� �� �� ������ ��
4314+ �ִ�.</p>
4315+
4316+ <p><strong>suEXEC</strong>�� ����ġ �������� �θ��� setuid
4317+ "wrapper" ���α׷��� ������� �Ѵ�. �� wrapper�� �����ڰ�
4318+ �ּ����� �ٸ� userid�� �����ϵ��� ������ CGI�� SSI ���α׷���
4319+ HTTP ��û�� ���� �Ҹ���. �̷� ��û�� ���� ����ġ�� suEXEC
4320+ wrapper���� ���α׷���� ���α׷��� ������ ����ڿ� �׷�
4321+ ID�� �����Ѵ�.</p>
4322+
4323+ <p>�׷��� wrapper�� ���� ������ ���� ������ ���и� �����Ѵ�.
4324+ �� ������ �ϳ��� �����ϸ� ���α׷��� ���з� ��ϵǰ� ������
4325+ ���� �����Ѵ�. �������� ������ ������ ����Ѵ�:</p>
4326+
4327+ <ol>
4328+ <li>
4329+ <strong>wrapper�� �����ϴ� ����ڰ� �ý����� ��������
4330+ �������</strong>
4331+
4332+ <p class="indent">
4333+ wrapper�� �����ϴ� ����ڰ� ������ �ý����� ���������
4334+ Ȯ���Ѵ�.
4335+ </p>
4336+ </li>
4337+
4338+ <li>
4339+ <strong>������ ���� �ƱԸ�Ʈ�� wrapper�� �����ϴ°�?</strong>
4340+
4341+ <p class="indent">
4342+ wrapper�� ������ ���� �ƱԸ�Ʈ�� �־�߸� ����ȴ�.
4343+ ����ġ �������� �� ������ �ȴ�. wrapper�� ������ ����
4344+ �ƱԸ�Ʈ�� �������ϸ� ��ŷ�Ǿ��ų� ����ġ�� suEXEC��
4345+ ���� ������ �ִ� ���̴�.
4346+ </p>
4347+ </li>
4348+
4349+ <li>
4350+ <strong>�� ����ڰ� wrapper�� �����ϵ��� ���Ǿ���?</strong>
4351+
4352+ <p class="indent">
4353+ �� ����ڰ� wrapper�� �����ϵ��� ���Ǿ���? ����
4354+ �� �����(����ġ �����)���� �� ���α׷��� ������
4355+ �� �ִ�.
4356+ </p>
4357+ </li>
4358+
4359+ <li>
4360+ <strong>������ CGI�� SSI ���α׷��� ������������ ����������
4361+ �����°�?</strong>
4362+
4363+ <p class="indent">
4364+ ������ CGI�� SSI ���α׷��� '/'�� �����ϰų� ������
4365+ '..'�� �����°�? �̵��� ����� �� ����. ������ CGI/SSI
4366+ ���α׷��� suEXEC ���� root (�Ʒ�
4367+ <code>--with-suexec-docroot=<em>DIR</em></code> ����)
4368+ ���� �־�� �Ѵ�.
4369+ </p>
4370+ </li>
4371+
4372+ <li>
4373+ <strong>������ ����ڸ��� ��ȿ�Ѱ�?</strong>
4374+
4375+ <p class="indent">
4376+ ������ ����ڰ� �����ϴ°�?
4377+ </p>
4378+ </li>
4379+
4380+ <li>
4381+ <strong>������ �׷���� ��ȿ�Ѱ�?</strong>
4382+
4383+ <p class="indent">
4384+ ������ �׷��� �����ϴ°�?
4385+ </p>
4386+ </li>
4387+
4388+ <li>
4389+ <strong>������ ����ڰ� superuser�� <em>�ƴѰ�</em>?</strong>
4390+
4391+
4392+ <p class="indent">
4393+ ���� suEXEC�� <code><em>root</em></code>�� CGI/SSI
4394+ ���α׷��� ������ �� ������ �Ѵ�.
4395+ </p>
4396+ </li>
4397+
4398+ <li>
4399+ <strong>������ userid�� �ּ� ID ���ں��� <em>ū��</em>?</strong>
4400+
4401+ <p class="indent">
4402+ �������� �ּ� ����� ID ���ڸ� �����Ѵ�. �׷��� CGI/SSI
4403+ ���α׷��� ������ �� �ִ� userid�� �ּ�ġ�� ������
4404+ �� �ִ�. "�ý��ۿ�" ������ �����Ҷ� �����ϴ�.
4405+ </p>
4406+ </li>
4407+
4408+ <li>
4409+ <strong>������ �׷��� superuser �׷��� <em>�ƴѰ�</em>?</strong>
4410+
4411+ <p class="indent">
4412+ ���� suEXEC�� <code><em>root</em></code> �׷��� CGI/SSI
4413+ ���α׷��� ������ �� ������ �Ѵ�.
4414+ </p>
4415+ </li>
4416+
4417+ <li>
4418+ <strong>������ groupid�� �ּ� ID ���ں��� <em>ū��</em>?</strong>
4419+
4420+ <p class="indent">
4421+ �������� �ּ� �׷� ID ���ڸ� �����Ѵ�. �׷��� CGI/SSI
4422+ ���α׷��� ������ �� �ִ� groupid�� �ּ�ġ�� ������
4423+ �� �ִ�. "�ý��ۿ�" �׷��� �����Ҷ� �����ϴ�.
4424+ </p>
4425+ </li>
4426+
4427+ <li>
4428+ <strong>wrapper�� ���������� ������ ����ڿ� �׷���
4429+ �� �� �ִ°�?</strong>
4430+
4431+ <p class="indent">
4432+ �� �ܰ迡�� ���α׷��� setuid�� setgid ȣ���� �Ͽ�
4433+ ������ ����ڿ� �׷��� �ȴ�. ��, �׷� ���ٸ����
4434+ ����ڰ� �ش�� ��� �׷����� �ʱ�ȭ�ȴ�.
4435+ </p>
4436+ </li>
4437+
4438+ <li>
4439+ <strong>CGI/SSI ���α׷��� �ִ� ���丮�� ���丮��
4440+ ������ �� �ִ°�?</strong>
4441+
4442+ <p class="indent">
4443+ ���丮�� �������� �ʴٸ� ������ ���� �� ����. �̰�����
4444+ ���丮�� ������ �� ���ٸ� ���丮�� �������� ����
4445+ ���̴�.
4446+ </p>
4447+ </li>
4448+
4449+ <li>
4450+ <strong>���丮�� ����ġ ������ �ȿ� �ִ°�?</strong>
4451+
4452+ <p class="indent">
4453+ ������ �Ϲ����� �κ��� ��û�� ��� ��û�ϴ� ���丮��
4454+ suEXEC ���� root �Ʒ� �ִ°�? UserDir�� ��û�� ���
4455+ ��û�ϴ� ���丮�� suEXEC userdir�� ������ (<a href="#install">suEXEC ���� �ɼ�</a> ����) ���丮
4456+ �Ʒ��� �ִ°�?
4457+ </p>
4458+ </li>
4459+
4460+ <li>
4461+ <strong>�ٸ� ������ ���丮�� ��������� <em>���°�</em>?</strong>
4462+
4463+ <p class="indent">
4464+ ���丮�� �ٸ� ������� ����α� �������ʴ´�. ����
4465+ �����ڸ��� ���丮 ������ ������ �� �ִ�.
4466+ </p>
4467+ </li>
4468+
4469+ <li>
4470+ <strong>������ CGI/SSI ���α׷��� �����ϴ°�?</strong>
4471+
4472+ <p class="indent">
4473+ ���������ʴٸ� ������ ���� ����.
4474+ </p>
4475+ </li>
4476+
4477+ <li>
4478+ <strong>�ٸ� ������ ������ CGI/SSI ���α׷��� ���������
4479+ <em>���°�</em>?</strong>
4480+
4481+ <p class="indent">
4482+ �����ڿ� ������ CGI/SSI ���α׷��� �����ϱ� �������ʴ´�.
4483+ </p>
4484+ </li>
4485+
4486+ <li>
4487+ <strong>������ CGI/SSI ���α׷��� setuid�� setgid��
4488+ <em>�ƴѰ�</em>?</strong>
4489+
4490+ <p class="indent">
4491+ �츮�� ���α׷��� �ٽ� UID/GID�� �����ϱ� �������ʴ´�.
4492+ </p>
4493+ </li>
4494+
4495+ <li>
4496+ <strong>������ �����/�׷��� ���α׷��� �����/�׷�� ������?</strong>
4497+
4498+ <p class="indent">
4499+ ����ڰ� ������ �������ΰ�?
4500+ </p>
4501+ </li>
4502+
4503+ <li>
4504+ <strong>������ ������ ���� ���μ����� ȯ�溯���� û����
4505+ �� �ִ°�?</strong>
4506+
4507+ <p class="indent">
4508+ suEXEC�� (�������� ������) ������ ���� PATH�� ���,
4509+ (�̰͵� �������� ����) ������ ȯ�溯�� ��Ͽ� ���ŵ�
4510+ ������ ����� ���μ����� ȯ�溯���� �����.
4511+ </p>
4512+ </li>
4513+
4514+ <li>
4515+ <strong>���������� ������ CGI/SSI ���α׷��� ������
4516+ �� �ִ°�?</strong>
4517+
4518+ <p class="indent">
4519+ ���⼭ suEXEC�� ������ ������ CGI/SSI ���α׷��� �����Ѵ�.
4520+ </p>
4521+ </li>
4522+ </ol>
4523+
4524+ <p>�̰��� suEXEC wrapper ���ȸ��� ǥ�� �����̴�. �ټ�
4525+ �����ϰ� CGI/SSI ���迡 ���ο� ������ ������, ������ ���ο�
4526+ �ΰ� �Ѵܰ辿 ���ɽ����� ���������.</p>
4527+
4528+ <p>�� ���� ���� ���� ������ � ������ �ִ����� ������
4529+ suEXEC �������� � ���� ������ ���� �� �ִ����� ���� ��
4530+ ������ <a href="#jabberwock">"�ٽ� �ѹ� �����϶�"</a> ����
4531+ �����϶�.</p>
4532+</div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
4533+<div class="section">
4534+<h2><a name="install" id="install">suEXEC ������ ��ġ</a></h2>
4535+
4536+ <p>���� ����ִ� ������ �����Ѵ�.</p>
4537+
4538+ <p><strong>suEXEC ���� �ɼ�</strong><br />
4539+ </p>
4540+
4541+ <dl>
4542+ <dt><code>--enable-suexec</code></dt>
4543+
4544+ <dd>�� �ɼ��� �⺻������ ��ġ�ǰų� Ȱ��ȭ�����ʴ� suEXEC
4545+ ����� Ȱ��ȭ�Ѵ�. APACI�� suEXEC�� �޾Ƶ��̷���
4546+ <code>--enable-suexec</code> �ɼǿܿ�
4547+ <code>--with-suexec-xxxxx</code> �ɼ��� �ּ��� �Ѱ�
4548+ �ʿ��ϴ�.</dd>
4549+
4550+ <dt><code>--with-suexec-bin=<em>PATH</em></code></dt>
4551+
4552+ <dd><code>suexec</code> ���̳ʸ� ��δ� ���Ȼ� ������
4553+ ������ ��ϵǾ� �Ѵ�. ��� �⺻���� �����Ϸ��� �� �ɼ���
4554+ ����Ѵ�. <em>���� ���</em>
4555+ <code>--with-suexec-bin=/usr/sbin/suexec</code></dd>
4556+
4557+ <dt><code>--with-suexec-caller=<em>UID</em></code></dt>
4558+
4559+ <dd>���� ����ġ�� �����ϴ� <a href="mod/mpm_common.html#user">����ڸ�</a>. ���α׷���
4560+ ������ �� �ִ� ������ ����ڴ�.</dd>
4561+
4562+ <dt><code>--with-suexec-userdir=<em>DIR</em></code></dt>
4563+
4564+ <dd>suEXEC ������ ���Ǵ� ����� Ȩ���丮�� �������丮��
4565+ �����Ѵ�. �� ���丮�� �ִ� ��� ���������� �������
4566+ suEXEC�� ����Ƿ�, ��� ���α׷��� "�����ؾ�" �Ѵ�. (����
4567+ ���, ���� "*"�� ����) "������" UserDir ���þ ����Ѵٸ�
4568+ ���� ���� �����ؾ� �Ѵ�. UserDir ���þ passwd ���Ͽ�
4569+ ���� ����� Ȩ���丮�� �ٸ��� suEXEC�� ����������
4570+ �۵����� �ʴ´�. �⺻���� "public_html"�̴�.<br />
4571+ ����ȣ��Ʈ���� ���� �ٸ� UserDir�� ����Ѵٸ� ��� ��
4572+ �θ� ���丮 �ȿ� �ֵ��� �����ؾ� �ϰ�, �� �θ� ���丮����
4573+ ���� ���´�. <strong>�̷��� �������� ������, "~userdir"
4574+ cgi ��û�� �۵����� �ʴ´�!</strong></dd>
4575+
4576+ <dt><code>--with-suexec-docroot=<em>DIR</em></code></dt>
4577+
4578+ <dd>����ġ�� DocumentRoot�� �����Ѵ�. �̴� suEXEC�� �����
4579+ �� �ִ� (UserDirs�� ������) ������ �����̴�. �⺻ ���丮��
4580+ <code>--datadir</code> ���� "/htdocs"�� ���� ���̴�.
4581+ <em>���� ���</em> "<code>--datadir=/home/apache</code>"��
4582+ �����ߴٸ� suEXEC wrapper�� document root��
4583+ "/home/apache/htdocs" ���丮�� ����Ѵ�.</dd>
4584+
4585+ <dt><code>--with-suexec-uidmin=<em>UID</em></code></dt>
4586+
4587+ <dd>suEXEC���� ���������� ������� �ּ� UID�� �����Ѵ�.
4588+ ��κ��� �ý��ۿ��� 500�̳� 100�� �����ϴ�. �⺻����
4589+ 100�̴�.</dd>
4590+
4591+ <dt><code>--with-suexec-gidmin=<em>GID</em></code></dt>
4592+
4593+ <dd>suEXEC���� ���������� �׷��� �ּ� GID�� �����Ѵ�.
4594+ ��κ��� �ý��ۿ��� 100�� �����ϹǷ� �� ���� �⺻���̴�.</dd>
4595+
4596+ <dt><code>--with-suexec-logfile=<em>FILE</em></code></dt>
4597+
4598+ <dd>��� suEXEC �۵��� ������ (���ó� ����� ������ ������)
4599+ ����� �α����ϸ��� �����Ѵ�. �⺻������ �α������� �̸���
4600+ "suexec_log"�̰� ǥ�� �α����� ���丮��
4601+ (<code>--logfiledir</code>) ��ġ�Ѵ�.</dd>
4602+
4603+ <dt><code>--with-suexec-safepath=<em>PATH</em></code></dt>
4604+
4605+ <dd>CGI �������Ͽ� �Ѱ��� ������ PATH ȯ�溯���� �����Ѵ�.
4606+ �⺻���� "/usr/local/bin:/usr/bin:/bin"�̴�.</dd>
4607+ </dl>
4608+
4609+ <p><strong>suEXEC wrapper�� �������ϰ� ��ġ�ϱ�</strong><br />
4610+ <code>--enable-suexec</code> �ɼ����� suEXEC ����� �����ϰ���
4611+ ��� <code>make</code> ��ɾ �����ϸ� <code>suexec</code>
4612+ ���������� (����ġ�� �Բ�) �ڵ����� ���������.<br />
4613+ ������ �������� �� <code>make install</code> ��ɾ
4614+ �����Ͽ� ��ġ�� �� �ִ�. ���̳ʸ����� <code>suexec</code>��
4615+ <code>--sbindir</code> �ɼ����� ������ ���丮�� ��ġ�ȴ�.
4616+ �⺻ ��ġ�� "/usr/local/apache2/sbin/suexec"�̴�.<br />
4617+ ��ġ ������ <strong><em>root ����</em></strong>�� �ʿ�����
4618+ �����϶�. wrapper�� ����� ID�� �����ϱ����ؼ��� �����ڰ�
4619+ <code><em>root</em></code>�̰� ���ϸ��� setuserid �����Ʈ��
4620+ �����Ǿ� �Ѵ�.</p>
4621+
4622+ <p><strong>���������� ���Ѽ���</strong><br />
4623+ suEXEC wrapper�� �ڽ��� ������ ����ڰ� ���� �ɼ�
4624+ <code>--with-suexec-caller</code>�� ������ �ùٸ� ���������
4625+ Ȯ���� ������, �� �˻� ������ suEXEC�� ����ϴ� �ý���ȣ��
4626+ Ȥ�� ���̺귯�� �Լ��� ���۵Ǿ��� �� �ִ�. �̸� ����ϸ�
4627+ �Ϲ������� ���� �����̹Ƿ� ���� ����ġ�� �����ϴ� �׷츸��
4628+ suEXEC�� ������ �� �ֵ��� ���Ͻý��� ������ �����ؾ� �Ѵ�.</p>
4629+
4630+ <p>���� ���, �������� ������ ���� �����ϰ�:</p>
4631+
4632+<div class="example"><p><code>
4633+ User www<br />
4634+ Group webgroup<br />
4635+</code></p></div>
4636+
4637+ <p><code>suexec</code>�� "/usr/local/apache2/sbin/suexec"��
4638+ ��ġ�Ͽ��ٸ�, ������ �����ؾ� �Ѵ�:</p>
4639+
4640+<div class="example"><p><code>
4641+ chgrp webgroup /usr/local/apache2/bin/suexec<br />
4642+ chmod 4750 /usr/local/apache2/bin/suexec<br />
4643+</code></p></div>
4644+
4645+ <p>�׷��� ���� ����ġ�� �����ϴ� �׷츸�� suEXEC wrapper��
4646+ ������ �� �ִ�.</p>
4647+</div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
4648+<div class="section">
4649+<h2><a name="enable" id="enable">suEXEC �� ���</a></h2>
4650+
4651+ <p>����ġ�� �����Ҷ� <code>--sbindir</code> �ɼ����� ������
4652+ ���丮���� <code>suexec</code> ������ (�⺻��
4653+ "/usr/local/apache2/sbin/suexec") ã�´�. ����ġ��
4654+ ���������� ������ suEXEC wrapper�� �߰��ϸ� ���� �α�(error
4655+ log)�� ������ ���� ����Ѵ�:</p>
4656+
4657+<div class="example"><p><code>
4658+ [notice] suEXEC mechanism enabled (wrapper: <em>/path/to/suexec</em>)
4659+</code></p></div>
4660+
4661+ <p>���� �����߿� �̷� ������ ���ٸ� ������ ����� ��ҿ���
4662+ wrapper ���α׷��� ã�� ���߰ų�, ���������� <em>setuid
4663+ root</em>�� ��ġ�����ʾұ� ������ ���̴�.</p>
4664+
4665+ <p>ó������ suEXEC ����� ����ϰ� �Ͱ� �̹� ����ġ ������
4666+ �������̶��, ����ġ�� ���̰� �ٽ� �����ؾ� �Ѵ�. ������
4667+ HUP�̳� USR1 �ñ׳η� ������ϴ� �����δ� ������� �ʴ�. </p>
4668+ <p>suEXEC�� �Ȼ���Ϸ��� <code>suexec</code> ������ ������
4669+ ����ġ�� ���̰� ������ؾ� �Ѵ�. </p>
4670+</div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
4671+<div class="section">
4672+<h2><a name="usage" id="usage">suEXEC ����ϱ�</a></h2>
4673+
4674+ <p>CGI ���α׷� ��û�� ��� <code class="directive"><a href="./mod/mod_suexec.html#suexecusergroup">SuexecUserGroup</a></code> ���þ
4675+ ����� ����ȣ��Ʈ�� ��û�� �Ͽ��ų� <code class="module"><a href="./mod/mod_userdir.html">mod_userdir</a></code>��
4676+ ��û�� ó���ϴ� ��쿡�� suEXEC wrapper�� ȣ���Ѵ�.</p>
4677+
4678+ <p><strong>����ȣ��Ʈ:</strong><br /> suEXEC wrapper��
4679+ ����ϴ� �Ѱ��� ����� <code class="directive"><a href="./mod/core.html#virtualhost">VirtualHost</a></code> ���ǿ� <code class="directive"><a href="./mod/mod_suexec.html#suexecusergroup">SuexecUserGroup</a></code> ���þ
4680+ ����ϴ� ���̴�. �� ���þ �ּ��� ����� ID�� �ٸ���
4681+ �����ϸ� CGI �ڿ��� ��� ��û�� <code class="directive"><a href="./mod/core.html#virtualhost">&lt;VirtualHost&gt;</a></code>����
4682+ ������ <em>User</em>�� <em>Group</em>���� ����ȴ�. ��
4683+ ���þ���� <code class="directive"><a href="./mod/core.html#virtualhost">&lt;VirtualHost&gt;</a></code>�� ������ �ּ���
4684+ userid�� ����Ѵ�.</p>
4685+
4686+ <p><strong>����� ���丮:</strong><br />
4687+ <code class="module"><a href="./mod/mod_userdir.html">mod_userdir</a></code>�� ��û�� ó���Ѵٸ� suEXEC
4688+ wrapper�� ȣ���Ͽ�, ��û�� ����� ���丮�� �ش��ϴ� �����
4689+ ID�� CGI ���α׷��� �����Ѵ�. �� ����� �����Ϸ��� �����
4690+ ID�� CGI�� ������ �� �ְ� ��ũ��Ʈ�� ���� <a href="#model">����
4691+ �˻�</a> �׸��� �����ؾ� �Ѵ�. <a href="#install">����
4692+ �ɼ�</a> <code>--with-suexec-userdir</code>�� �����϶�.</p> </div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
4693+<div class="section">
4694+<h2><a name="debug" id="debug">suEXEC ������ϱ�</a></h2>
4695+
4696+ <p>suEXEC wrapper�� �α� ������ ������ �ٷ�
4697+ <code>--with-suexec-logfile</code> �ɼ����� ������ ���Ͽ�
4698+ ����. wrapper�� �ùٷ� �����ϰ� ��ġ�ߴٸ� ��� �߸��Ǿ�����
4699+ �� �α����Ͽ� ������ error_log�� �������.</p>
4700+
4701+</div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
4702+<div class="section">
4703+<h2><a name="jabberwock" id="jabberwock">�ٽ� �ѹ� �����϶�: ���� ����</a></h2>
4704+
4705+ <p><strong>����!</strong> �� ������ �������� ���� �� �ִ�.
4706+ ����ġ�׷��� <a href="http://httpd.apache.org/docs/2.4/suexec.html">�¶���
4707+ ����</a>���� �� ������ �ֽ����� �����϶�.</p>
4708+
4709+ <p>wrapper�� ���� ������ �����ϴ� ��� ��̷ο� ���� �ִ�.
4710+ suEXEC�� ���õ� "����"�� �����ϱ� ���� �̵��� ���캸�� �ٶ���.</p>
4711+
4712+ <ul>
4713+ <li><strong>suEXEC ���� ����</strong></li>
4714+
4715+ <li>
4716+ ���丮 ���� ����
4717+
4718+ <p class="indent">
4719+ ���Ȱ� ȿ������ ���� ��� suEXEC ��û�� ����ȣ��Ʈ��
4720+ ��� �ֻ��� document root Ȥ�� userdir ��û�� ���
4721+ �ֻ��� ���� document root �ȿ��� �߻��ؾ� �Ѵ�. ����
4722+ ���, ����ȣ��Ʈ �װ��� �����ߴٸ� ����ȣ��Ʈ����
4723+ suEXEC�� �̿��ϱ����� ����ȣ��Ʈ�� document root��
4724+ �� ����ġ ���� �������� �ۿ� ������ �ʿ䰡 �ִ�.
4725+ (������ ������.)
4726+ </p>
4727+ </li>
4728+
4729+ <li>
4730+ suEXEC�� PATH ȯ�溯��
4731+
4732+ <p class="indent">
4733+ �����ϸ� ������ �� �ִ�. ���⿡ �����ϴ� ��� ��ΰ�
4734+ <strong>���� �� �ִ�</strong> ���丮���� Ȯ���϶�.
4735+ �� �������� �������� �װ��� �ִ� Ʈ���̸񸶸� �����ϱ�
4736+ ������ ���� ���̴�.
4737+ </p>
4738+ </li>
4739+
4740+ <li>
4741+ suEXEC �ڵ� �����ϱ�
4742+
4743+ <p class="indent">
4744+ �ݺ��ؼ� ��������, ����� ������ �ϴ��� �𸣰� �õ��Ѵٸ�
4745+ <strong>ū ����</strong>�� �߻��� �� �ִ�. � ��쿡��
4746+ ������������.
4747+ </p>
4748+ </li>
4749+ </ul>
4750+
4751+</div></div>
4752+<div class="bottomlang">
4753+<p><span>������ ���: </span><a href="./en/suexec.html" hreflang="en" rel="alternate" title="English">&nbsp;en&nbsp;</a> |
4754+<a href="./fr/suexec.html" hreflang="fr" rel="alternate" title="Fran&#231;ais">&nbsp;fr&nbsp;</a> |
4755+<a href="./ja/suexec.html" hreflang="ja" rel="alternate" title="Japanese">&nbsp;ja&nbsp;</a> |
4756+<a href="./ko/suexec.html" title="Korean">&nbsp;ko&nbsp;</a> |
4757+<a href="./tr/suexec.html" hreflang="tr" rel="alternate" title="T&#252;rk&#231;e">&nbsp;tr&nbsp;</a></p>
4758+</div><div class="top"><a href="#page-header"><img src="./images/up.gif" alt="top" /></a></div><div class="section"><h2><a id="comments_section" name="comments_section">Comments</a></h2><div class="warning"><strong>Notice:</strong><br />This is not a Q&amp;A section. Comments placed here should be pointed towards suggestions on improving the documentation or server, and may be removed again by our moderators if they are either implemented or considered invalid/off-topic. Questions on how to manage the Apache HTTP Server should be directed at either our IRC channel, #httpd, on Freenode, or sent to our <a href="http://httpd.apache.org/lists.html">mailing lists</a>.</div>
4759+<script type="text/javascript"><!--//--><![CDATA[//><!--
4760+var comments_shortname = 'httpd';
4761+var comments_identifier = 'http://httpd.apache.org/docs/2.4/suexec.html';
4762+(function(w, d) {
4763+ if (w.location.hostname.toLowerCase() == "httpd.apache.org") {
4764+ d.write('<div id="comments_thread"><\/div>');
4765+ var s = d.createElement('script');
4766+ s.type = 'text/javascript';
4767+ s.async = true;
4768+ s.src = 'https://comments.apache.org/show_comments.lua?site=' + comments_shortname + '&page=' + comments_identifier;
4769+ (d.getElementsByTagName('head')[0] || d.getElementsByTagName('body')[0]).appendChild(s);
4770+ }
4771+ else {
4772+ d.write('<div id="comments_thread">Comments are disabled for this page at the moment.<\/div>');
4773+ }
4774+})(window, document);
4775+//--><!]]></script></div><div id="footer">
4776+<p class="apache">Copyright 2018 The Apache Software Foundation.<br />Licensed under the <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a>.</p>
4777+<p class="menu"><a href="./mod/">���</a> | <a href="./mod/directives.html">���þ��</a> | <a href="http://wiki.apache.org/httpd/FAQ">FAQ</a> | <a href="./glossary.html">���</a> | <a href="./sitemap.html">����Ʈ��</a></p></div><script type="text/javascript"><!--//--><![CDATA[//><!--
4778+if (typeof(prettyPrint) !== 'undefined') {
4779+ prettyPrint();
4780+}
4781+//--><!]]></script>
4782+</body></html>
4783\ No newline at end of file
4784diff --git a/docs/manual/suexec.html.tr.utf8 b/docs/manual/suexec.html.tr.utf8
4785new file mode 100644
4786index 0000000..f099e3c
4787--- /dev/null
4788+++ b/docs/manual/suexec.html.tr.utf8
4789@@ -0,0 +1,583 @@
4790+<?xml version="1.0" encoding="UTF-8"?>
4791+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
4792+<html xmlns="http://www.w3.org/1999/xhtml" lang="tr" xml:lang="tr"><head>
4793+<meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
4794+<!--
4795+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
4796+ This file is generated from xml source: DO NOT EDIT
4797+ XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
4798+ -->
4799+<title>SuEXEC Desteği - Apache HTTP Sunucusu Sürüm 2.4</title>
4800+<link href="./style/css/manual.css" rel="stylesheet" media="all" type="text/css" title="Main stylesheet" />
4801+<link href="./style/css/manual-loose-100pc.css" rel="alternate stylesheet" media="all" type="text/css" title="No Sidebar - Default font size" />
4802+<link href="./style/css/manual-print.css" rel="stylesheet" media="print" type="text/css" /><link rel="stylesheet" type="text/css" href="./style/css/prettify.css" />
4803+<script src="./style/scripts/prettify.min.js" type="text/javascript">
4804+</script>
4805+
4806+<link href="./images/favicon.ico" rel="shortcut icon" /></head>
4807+<body id="manual-page"><div id="page-header">
4808+<p class="menu"><a href="./mod/">Modüller</a> | <a href="./mod/directives.html">Yönergeler</a> | <a href="http://wiki.apache.org/httpd/FAQ">SSS</a> | <a href="./glossary.html">Terimler</a> | <a href="./sitemap.html">Site Haritası</a></p>
4809+<p class="apache">Apache HTTP Sunucusu Sürüm 2.4</p>
4810+<img alt="" src="./images/feather.png" /></div>
4811+<div class="up"><a href="./"><img title="&lt;-" alt="&lt;-" src="./images/left.gif" /></a></div>
4812+<div id="path">
4813+<a href="http://www.apache.org/">Apache</a> &gt; <a href="http://httpd.apache.org/">HTTP Sunucusu</a> &gt; <a href="http://httpd.apache.org/docs/">Belgeleme</a> &gt; <a href="./">Sürüm 2.4</a></div><div id="page-content"><div id="preamble"><h1>SuEXEC Desteği</h1>
4814+<div class="toplang">
4815+<p><span>Mevcut Diller: </span><a href="./en/suexec.html" hreflang="en" rel="alternate" title="English">&nbsp;en&nbsp;</a> |
4816+<a href="./fr/suexec.html" hreflang="fr" rel="alternate" title="Français">&nbsp;fr&nbsp;</a> |
4817+<a href="./ja/suexec.html" hreflang="ja" rel="alternate" title="Japanese">&nbsp;ja&nbsp;</a> |
4818+<a href="./ko/suexec.html" hreflang="ko" rel="alternate" title="Korean">&nbsp;ko&nbsp;</a> |
4819+<a href="./tr/suexec.html" title="Türkçe">&nbsp;tr&nbsp;</a></p>
4820+</div>
4821+
4822+ <p><strong>SuEXEC</strong> özelliği, Apache HTTP Sunucusu kullanıcılarına
4823+ <strong>CGI</strong> ve <strong>SSI</strong> programlarını sunucunun
4824+ aidiyetinde çalıştığı kullanıcıdan farklı bir kullanıcının aidiyetinde
4825+ çalıştırma olanağı verir. Normalde, <strong>CGI</strong> ve
4826+ <strong>SSI</strong> programlarını çalıştıranla sunucuyu çalıştıran
4827+ aynı kullanıcıdır.</p>
4828+
4829+ <p>Gerektiği gibi kullanıldığında bu özellik, kullanıcılara
4830+ <strong>CGI</strong> ve <strong>SSI</strong> programlarını çalıştırma
4831+ ve geliştirmeye izin vermekle ortaya çıkan güvenlik risklerini azaltır.
4832+ Bununla birlikte, <strong>suEXEC</strong> gerektiği gibi
4833+ yapılandırılmadığı takdirde bazı sorunlara yol açabilir ve bilgisayar
4834+ güvenliğinizde yeni delikler ortaya çıkmasına sebep olabilir.
4835+ Güvenlikle ilgili mevcut sorunlarla başa çıkmada ve <em>setuid
4836+ root</em> programları yönetmekte bilgi ve deneyim sahibi değilseniz
4837+ <strong>suEXEC</strong> kullanmayı kesinlikle düşünmemenizi
4838+ öneririz.</p>
4839+ </div>
4840+<div id="quickview"><a href="https://www.apache.org/foundation/contributing.html" class="badge"><img src="https://www.apache.org/images/SupportApache-small.png" alt="Support Apache!" /></a><ul id="toc"><li><img alt="" src="./images/down.gif" /> <a href="#before">Başlamadan önce</a></li>
4841+<li><img alt="" src="./images/down.gif" /> <a href="#model">SuEXEC Güvenlik Modeli</a></li>
4842+<li><img alt="" src="./images/down.gif" /> <a href="#install">suEXEC’in Yapılandırılması ve Kurulumu</a></li>
4843+<li><img alt="" src="./images/down.gif" /> <a href="#enable">suEXEC’in etkin kılınması ve iptal edilmesi</a></li>
4844+<li><img alt="" src="./images/down.gif" /> <a href="#usage">SuEXEC’in kullanımı</a></li>
4845+<li><img alt="" src="./images/down.gif" /> <a href="#debug">SuEXEC ve hata ayıklama</a></li>
4846+<li><img alt="" src="./images/down.gif" /> <a href="#jabberwock">Uyarılar ve Örnekler</a></li>
4847+</ul><h3>Ayrıca bakınız:</h3><ul class="seealso"><li><a href="#comments_section">Yorum</a></li></ul></div>
4848+<div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
4849+<div class="section">
4850+<h2><a name="before" id="before">Başlamadan önce</a></h2>
4851+
4852+ <p>Belgeye balıklama dalmadan önce, suexec'i kullanacağınız ortam ve
4853+ kendiniz hakkında yapılmış çeşitli kabuller hakkında bilgi sahibi
4854+ olmalısınız.</p>
4855+
4856+ <p>Öncelikle, üzerinde <strong>setuid</strong> va <strong>setgid</strong>
4857+ işlemlerinin yapılabildiği Unix türevi bir işletim sistemi
4858+ kullandığınızı varsayıyoruz. Tüm komut örnekleri buna dayanarak
4859+ verilmiştir. Bu desteğe sahip başka platformlar varsa onlardaki
4860+ yapılandırma burada anlattığımız yapılandırmadan farklı olabilir.</p>
4861+
4862+ <p>İkinci olarak, bilgisayarınızın güvenliği ve yönetimi ile ilgili bazı
4863+ temel kavramları bildiğinizi kabul ediyoruz. Buna
4864+ <strong>setuid/setgid</strong> işlemlerinin sisteminiz ve güvenlik
4865+ seviyesi üzerindeki etkilerini bilmek dahildir.</p>
4866+
4867+ <p>Üçüncü olarak, <strong>suEXEC</strong> kodunun
4868+ <strong>değiştirilmemiş</strong> bir sürümünü kullandığınızı
4869+ varsayıyoruz. Tüm suEXEC kodu, geliştiricilerin yanında sayısız beta
4870+ kullanıcısı tarafından dikkatle incelenmiş ve denenmiştir. Kodların hem
4871+ basit hem de sağlam bir şekilde güvenli olması için gerekli tüm
4872+ önlemler alınmıştır. Bu kodun değiştirilmesi beklenmedik sorunlara ve
4873+ yeni güvenlik risklerine yol açabilir. Özellikle güvenlikle ilgili
4874+ programlarda deneyimli değilseniz suEXEC kodunda kesinlikle bir
4875+ değişiklik yapmamalısınız. Değişiklik yaparsanız kodlarınızı gözden
4876+ geçirmek ve tartışmak üzere Apache HTTP Sunucusu geliştirme ekibi ile
4877+ paylaşmanızı öneririz.</p>
4878+
4879+ <p>Dördüncü ve son olarak, Apache HTTP Sunucusu geliştirme ekibinin
4880+ suEXEC’i öntanımlı httpd kurulumunun bir parçası yapmama kararından
4881+ bahsetmek gerekir. Bunun sonucu olarak, suEXEC yapılandırması sistem
4882+ yöneticisinin ayrıntılı bir incelemesini gerektirir. Gerekli incelemeden
4883+ sonra yönetici tarafından suEXEC yapılandırma seçeneklerine karar
4884+ verilip, normal yollardan sisteme kurulumu yapılır. Bu seçeneklerin
4885+ belirlenmesi, suEXEC işlevselliğinin kullanımı sırasında sistem
4886+ güvenliğini gerektiği gibi sağlamak için yönetici tarafından dikkatle
4887+ saptanmayı gerektirir. Bu sürecin ayrıntılarının yöneticiye bırakılma
4888+ sebebi, suEXEC kurulumunu, suEXEC’i dikkatle kullanacak yeterliliğe sahip
4889+ olanlarla sınırlama beklentimizdir.</p>
4890+
4891+ <p>Hala bizimle misiniz? Evet mi? Pekala, o halde devam!</p>
4892+</div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
4893+<div class="section">
4894+<h2><a name="model" id="model">SuEXEC Güvenlik Modeli</a></h2>
4895+
4896+ <p>SuEXEC yapılandırması ve kurulumuna girişmeden önce biraz da
4897+ gerçekleşmesini istediğiniz güvenlik modelinin ayrıntıları üzerinde
4898+ duralım. Böylece, suEXEC’in içinde olup bitenleri ve sisteminizin
4899+ güvenliği için alınacak önlemleri daha iyi anlayabilirsiniz.</p>
4900+
4901+ <p><strong>suEXEC</strong> işlevselliği, Apache HTTP Sunucusu tarafından
4902+ gerektiği takdirde artalanda çalıştırılan bir setuid programa dayanır.
4903+ Bu program, bir CGI veya SSI betiğine bir HTTP isteği yapıldığı zaman,
4904+ bu betiği, yöneticinin ana sunucunun aidiyetinde çalıştığı kullanıcıdan
4905+ farklı olarak seçtiği bir kullanıcının aidiyetinde çalıştırmak için
4906+ çağrılır. Böyle bir istek geldiğinde, Apache httpd artalandaki setuid
4907+ programına, HTTP isteği yapılan programın ismiyle beraber aidiyetinde
4908+ çalışacağı kullanıcı ve grup kimliklerini de aktarır.</p>
4909+
4910+ <p>Artalanda çalıştırılan setuid program başarıyı ve başarısızlığı
4911+ aşağıdaki süreci izleyerek saptar. Bunlardan herhangi biri başarısız
4912+ olursa program başarısızlık durumunu günlüğe kaydeder ve bir hata
4913+ vererek çıkar. Aksi takdirde çalışmaya devam eder.</p>
4914+
4915+ <ol>
4916+ <li>
4917+ <strong>Setuid programı çalıştıran kullanıcı sistemin geçerli
4918+ kullanıcılarından biri mi?</strong>
4919+
4920+ <p class="indent">Bu, setuid programı çalıştıran kullanıcının
4921+ sistemin gerçek bir kullanıcısı olduğunudan emin olunmasını sağlar.
4922+ </p>
4923+ </li>
4924+
4925+ <li>
4926+ <strong>Setuid program yeterli sayıda argümanla çağrılmış mı?
4927+ </strong>
4928+
4929+ <p class="indent">Apache HTTP Sunucusunun artalanda çağırdığı
4930+ setuid program ancak yeterli sayıda argüman sağlandığı takdirde
4931+ çalışacaktır. Argümanların sayısını ve sırasını Apache HTTP sunucusu
4932+ bilir. Eğer setuid program yeterli sayıda argümanla çağrılmamışsa
4933+ ya kendisinde bir değişiklik yapılmıştır ya da kurulu Apache httpd
4934+ çalıştırılabilirinin suEXEC ile ilgili kısmında yanlış giden bir
4935+ şeyler vardır.</p>
4936+ </li>
4937+
4938+ <li>
4939+ <strong>Bu geçerli kullanıcının bu setuid programı çalıştırma
4940+ yetkisi var mı?</strong>
4941+
4942+ <p class="indent">Sadece tek bir kullanıcı (Apache’nin aidiyetinde
4943+ çalıştığı kullanıcı) bu programı çalıştırmaya yetkilidir.</p>
4944+ </li>
4945+
4946+ <li>
4947+ <strong>Hedef CGI veya SSI programı hiyerarşik olarak güvenliği
4948+ bozacak bir dosya yolu üzerinde mi?</strong>
4949+
4950+ <p class="indent">Hedef CGI veya SSI programının dosya yolu '/' veya
4951+ '..' ile başlıyor mu? Buna izin verilmez. Hedef CGI veya SSI
4952+ programı suEXEC’in belge kök dizininde yer almalıdır (aşağıda
4953+ <code>--with-suexec-docroot=<em>DİZİN</em></code> seçeneğine
4954+ bakınız).</p>
4955+ </li>
4956+
4957+ <li>
4958+ <strong>Hedef kullanıcı ismi geçerli mi?</strong>
4959+
4960+ <p class="indent">Hedef kullanıcı mevcut mu?</p>
4961+ </li>
4962+
4963+ <li>
4964+ <strong>Hedef grup ismi geçerli mi?</strong>
4965+
4966+ <p class="indent">Hedef grup mevcut mu?</p>
4967+ </li>
4968+
4969+ <li>
4970+ <strong>Hedef kullanıcı <code>root</code> değil, değil mi?</strong>
4971+
4972+ <p class="indent">Mevcut durumda, <code>root</code> kullanıcısının
4973+ CGI/SSI programlarını çalıştırmasına izin verilmemektedir.</p>
4974+ </li>
4975+
4976+ <li>
4977+ <strong>Hedef kullanıcı kimliği asgari kullanıcı numarasından
4978+ <em>BÜYÜK</em> mü?</strong>
4979+
4980+ <p class="indent">Asgari kullanıcı numarası yapılandırma sırasında
4981+ belirtilir. Böylece CGI/SSI programlarını çalıştırmasına izin
4982+ verilecek olası en düşük kullanıcı numarasını belirlemeniz mümkün
4983+ kılınmıştır. Bu bazı “sistem” hesaplarını devreden çıkarmak için
4984+ yararlıdır.</p>
4985+ </li>
4986+
4987+ <li>
4988+ <strong>Hedef grup <code>root</code> değil, değil mi?</strong>
4989+
4990+ <p class="indent"><code>root</code> grubunun CGI/SSI
4991+ programlarını çalıştırmasına izin verilmemektedir.</p>
4992+ </li>
4993+
4994+ <li>
4995+ <strong>Hedef grup numarası asgari grup numarasından
4996+ <em>BÜYÜK</em> mü?</strong>
4997+
4998+ <p class="indent">Asgari grup numarası yapılandırma sırasında
4999+ belirtilir. Böylece CGI/SSI programlarını çalıştırmasına izin
5000+ verilecek olası en düşük grup numarasını belirlemeniz mümkün
The diff has been truncated for viewing.

Subscribers

People subscribed via source and target branches