Merge ~ahasenack/ubuntu/+source/apache2:apache2-restore-uwsgi into ubuntu/+source/apache2:ubuntu/devel

Proposed by Andreas Hasenack
Status: Merged
Merge reported by: Andreas Hasenack
Merged at revision: 5cd621323b0f70ce433e0ea56e67603a2c049462
Proposed branch: ~ahasenack/ubuntu/+source/apache2:apache2-restore-uwsgi
Merge into: ubuntu/+source/apache2:ubuntu/devel
Diff against target: 440853 lines (+432266/-2)
1410 files modified
debian/changelog (+7/-0)
debian/config-dir/mods-available/proxy_uwsgi.load (+2/-0)
debian/control (+13/-0)
debian/rules (+1/-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
Adam Conrad (community) Approve
Robie Basak Approve
Canonical Server Pending
Review via email: mp+348679@code.launchpad.net

Description of the change

Please use git to review the diff, as launchpad's diff is incorrect for some reason.

Restore the mod-proxy-uwsgi module build as the uwsgi upstream source no longer builds it.

To test:
# get what is in cosmic now
sudo apt install libapache2-mod-proxy-uwsgi apache2

# add the test ppa:
sudo add-apt-repository -y ppa:ahasenack/apache2-restore-uwsgi

# dist-upgrade. There must be no conflicts or install/upgrade errors:
sudo apt dist-upgrade
dpkg -l|grep apache2
ii apache2 2.4.33-3ubuntu3~ppa1 amd64 Apache HTTP Server
ii apache2-bin 2.4.33-3ubuntu3~ppa1 amd64 Apache HTTP Server (modules and other binary files)
ii apache2-data 2.4.33-3ubuntu3~ppa1 all Apache HTTP Server (common files)
ii apache2-utils 2.4.33-3ubuntu3~ppa1 amd64 Apache HTTP Server (utility programs for web servers)
ii libapache2-mod-proxy-uwsgi 2.4.33-3ubuntu3~ppa1 amd64 transitional package

# libapache2-mod-proxy-uwsgi is now an empty transitional package
ubuntu@cosmic-apache-uwsgi:~$ dpkg -L libapache2-mod-proxy-uwsgi
/.
/usr
/usr/share
/usr/share/doc
/usr/share/doc/libapache2-mod-proxy-uwsgi

# the uwsgi module is now part of the apache2-bin package:
ubuntu@cosmic-apache-uwsgi:~$ dpkg -S /usr/lib/apache2/modules/mod_proxy_uwsgi.so
apache2-bin: /usr/lib/apache2/modules/mod_proxy_uwsgi.so

# the transitional package can be safely removed and the module of course remains installed
ubuntu@cosmic-apache-uwsgi:~$ sudo apt purge libapache2-mod-proxy-uwsgi
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages were automatically installed and are no longer required:
  libfreetype6 libjansson4 libmatheval1 libnorm1 libpgm-5.2-0 libsodium23 libzmq5 uwsgi-core
Use 'sudo apt autoremove' to remove them.
The following packages will be REMOVED:
  libapache2-mod-proxy-uwsgi*
0 upgraded, 0 newly installed, 1 to remove and 0 not upgraded.
After this operation, 6144 B disk space will be freed.
Do you want to continue? [Y/n]
(Reading database ... 29460 files and directories currently installed.)
Removing libapache2-mod-proxy-uwsgi (2.4.33-3ubuntu3~ppa1) ...
(Reading database ... 29459 files and directories currently installed.)
Purging configuration files for libapache2-mod-proxy-uwsgi (2.4.33-3ubuntu3~ppa1) ...

To post a comment you must log in.
Revision history for this message
Robie Basak (racb) wrote :

15:01 <rbasak> The MP is identical to the PPA diff except for the changelog version as expected.
15:02 <infinity> Then +1 from me.
15:02 <rbasak> ahasenack: so I pushed the upload tag for you. Upload when ready.
15:02 <infinity> Go forth and merge/upload, pretty please.

review: Approve
Revision history for this message
Adam Conrad (adconrad) :
review: Approve
Revision history for this message
Andreas Hasenack (ahasenack) wrote :

This migrated, so setting this MP to merged.

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

Subscribers

People subscribed via source and target branches