Merge ~ahasenack/ubuntu/+source/apache2:bionic-includeoptional-1766186 into ubuntu/+source/apache2:ubuntu/bionic-devel

Proposed by Andreas Hasenack
Status: Merged
Approved by: Christian Ehrhardt 
Approved revision: 4a4345b9ec249953077ac92ea875a7851f07b1bd
Merge reported by: Andreas Hasenack
Merged at revision: 4a4345b9ec249953077ac92ea875a7851f07b1bd
Proposed branch: ~ahasenack/ubuntu/+source/apache2:bionic-includeoptional-1766186
Merge into: ubuntu/+source/apache2:ubuntu/bionic-devel
Diff against target: 422423 lines (+414137/-0)
1365 files modified
debian/changelog (+8/-0)
debian/patches/includeoptional-ignore-non-existent.patch (+61/-0)
debian/patches/series (+1/-0)
docs/manual/style/latex/atbeginend.sty (+80/-0)
docs/manual/style/manualpage.dtd (+29/-0)
docs/manual/style/modulesynopsis.dtd (+85/-0)
docs/manual/style/scripts/MINIFY (+5/-0)
docs/manual/style/scripts/prettify.js (+1622/-0)
docs/manual/style/scripts/prettify.min.js (+123/-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 (+530/-0)
docs/manual/upgrading.html.fr (+589/-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 (+337/-0)
docs/manual/vhosts/mass.html.fr (+352/-0)
docs/manual/vhosts/mass.html.ko.euc-kr (+453/-0)
docs/manual/vhosts/mass.html.tr.utf8 (+324/-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 (+506/-0)
include/.indent.pro (+54/-0)
include/ap_compat.h (+30/-0)
include/ap_config.h (+206/-0)
include/ap_config_auto.h.in (+298/-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 (+538/-0)
include/ap_mpm.h (+235/-0)
include/ap_provider.h (+100/-0)
include/ap_regex.h (+248/-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 (+1379/-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 (+2403/-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 (+244/-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 (+842/-0)
libhttpd.mak (+1354/-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 (+374/-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 (+2115/-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 (+1958/-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 (+389/-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 (+1542/-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 (+955/-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 (+1281/-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 (+836/-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 (+160/-0)
modules/http2/h2_alt_svc.c (+130/-0)
modules/http2/h2_alt_svc.h (+39/-0)
modules/http2/h2_bucket_beam.c (+1273/-0)
modules/http2/h2_bucket_beam.h (+405/-0)
modules/http2/h2_bucket_eos.c (+111/-0)
modules/http2/h2_bucket_eos.h (+31/-0)
modules/http2/h2_config.c (+677/-0)
modules/http2/h2_config.h (+103/-0)
modules/http2/h2_conn.c (+366/-0)
modules/http2/h2_conn.h (+76/-0)
modules/http2/h2_conn_io.c (+388/-0)
modules/http2/h2_conn_io.h (+76/-0)
modules/http2/h2_ctx.c (+120/-0)
modules/http2/h2_ctx.h (+77/-0)
modules/http2/h2_filter.c (+560/-0)
modules/http2/h2_filter.h (+72/-0)
modules/http2/h2_from_h1.c (+862/-0)
modules/http2/h2_from_h1.h (+49/-0)
modules/http2/h2_h2.c (+765/-0)
modules/http2/h2_h2.h (+78/-0)
modules/http2/h2_headers.c (+177/-0)
modules/http2/h2_headers.h (+76/-0)
modules/http2/h2_mplx.c (+1270/-0)
modules/http2/h2_mplx.h (+329/-0)
modules/http2/h2_ngn_shed.c (+391/-0)
modules/http2/h2_ngn_shed.h (+78/-0)
modules/http2/h2_private.h (+27/-0)
modules/http2/h2_proxy_session.c (+1583/-0)
modules/http2/h2_proxy_session.h (+127/-0)
modules/http2/h2_proxy_util.c (+1336/-0)
modules/http2/h2_proxy_util.h (+255/-0)
modules/http2/h2_push.c (+1059/-0)
modules/http2/h2_push.h (+118/-0)
modules/http2/h2_request.c (+337/-0)
modules/http2/h2_request.h (+47/-0)
modules/http2/h2_session.c (+2288/-0)
modules/http2/h2_session.h (+224/-0)
modules/http2/h2_stream.c (+1083/-0)
modules/http2/h2_stream.h (+314/-0)
modules/http2/h2_switch.c (+194/-0)
modules/http2/h2_switch.h (+29/-0)
modules/http2/h2_task.c (+761/-0)
modules/http2/h2_task.h (+126/-0)
modules/http2/h2_util.c (+2010/-0)
modules/http2/h2_util.h (+543/-0)
modules/http2/h2_version.h (+40/-0)
modules/http2/h2_workers.c (+371/-0)
modules/http2/h2_workers.h (+82/-0)
modules/http2/mod_http2.c (+383/-0)
modules/http2/mod_http2.dep (+1433/-0)
modules/http2/mod_http2.dsp (+195/-0)
modules/http2/mod_http2.h (+95/-0)
modules/http2/mod_http2.mak (+542/-0)
modules/http2/mod_proxy_http2.c (+670/-0)
modules/http2/mod_proxy_http2.dep (+208/-0)
modules/http2/mod_proxy_http2.dsp (+119/-0)
modules/http2/mod_proxy_http2.h (+20/-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 (+3222/-0)
modules/ldap/util_ldap_cache.c (+464/-0)
modules/ldap/util_ldap_cache.h (+204/-0)
modules/ldap/util_ldap_cache_mgr.c (+882/-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 (+113/-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 (+5326/-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/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 (+466/-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 (+76/-0)
modules/proxy/libproxy.exp (+1/-0)
modules/proxy/mod_proxy.c (+2916/-0)
modules/proxy/mod_proxy.dep (+153/-0)
modules/proxy/mod_proxy.dsp (+127/-0)
modules/proxy/mod_proxy.h (+1211/-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 (+1829/-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 (+1174/-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 (+1224/-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_wstunnel.c (+390/-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 (+3867/-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 (+668/-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 (+809/-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 (+716/-0)
modules/ssl/mod_ssl.dep (+1086/-0)
modules/ssl/mod_ssl.dsp (+195/-0)
modules/ssl/mod_ssl.h (+88/-0)
modules/ssl/mod_ssl.mak (+500/-0)
modules/ssl/mod_ssl_openssl.h (+73/-0)
modules/ssl/ssl_engine_config.c (+2032/-0)
modules/ssl/ssl_engine_init.c (+2020/-0)
modules/ssl/ssl_engine_io.c (+2215/-0)
modules/ssl/ssl_engine_kernel.c (+2457/-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 (+1244/-0)
modules/ssl/ssl_private.h (+1068/-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 (+505/-0)
modules/ssl/ssl_util_ssl.h (+78/-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 (+690/-0)
os/unix/unixd.h (+142/-0)
os/win32/BaseAddr.ref (+132/-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 (+103/-0)
server/NWGNUmakefile (+261/-0)
server/buildmark.c (+29/-0)
server/config.c (+2699/-0)
server/config.m4 (+19/-0)
server/connection.c (+228/-0)
server/core.c (+5401/-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 (+827/-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 (+3756/-0)
server/mpm/event/fdqueue.c (+533/-0)
server/mpm/event/fdqueue.h (+106/-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 (+1516/-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/fdqueue.c (+412/-0)
server/mpm/worker/fdqueue.h (+75/-0)
server/mpm/worker/mpm_default.h (+55/-0)
server/mpm/worker/worker.c (+2382/-0)
server/mpm_common.c (+571/-0)
server/mpm_unix.c (+1078/-0)
server/protocol.c (+2391/-0)
server/provider.c (+197/-0)
server/request.c (+2511/-0)
server/scoreboard.c (+666/-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 (+225/-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 (+299/-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 (+2553/-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 (+509/-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 (+123/-0)
support/phf_abuse_log.cgi.in (+38/-0)
support/rotatelogs.c (+731/-0)
support/rotatelogs.dep (+28/-0)
support/rotatelogs.dsp (+106/-0)
support/rotatelogs.mak (+317/-0)
support/split-logfile.in (+69/-0)
support/suexec.c (+652/-0)
support/suexec.h (+109/-0)
support/win32/ApacheMonitor.c (+1671/-0)
support/win32/ApacheMonitor.dep (+18/-0)
support/win32/ApacheMonitor.dsp (+143/-0)
support/win32/ApacheMonitor.h (+78/-0)
support/win32/ApacheMonitor.mak (+309/-0)
support/win32/ApacheMonitor.manifest (+10/-0)
support/win32/ApacheMonitor.rc (+103/-0)
support/win32/wintty.c (+374/-0)
support/win32/wintty.dep (+5/-0)
support/win32/wintty.dsp (+106/-0)
support/win32/wintty.mak (+317/-0)
test/.indent.pro (+54/-0)
test/Makefile.in (+20/-0)
test/README (+3/-0)
test/check_chunked (+58/-0)
test/cls.c (+182/-0)
test/make_sni.sh (+396/-0)
test/tcpdumpscii.txt (+50/-0)
test/test-writev.c (+101/-0)
test/test_find.c (+78/-0)
test/test_limits.c (+200/-0)
test/test_parser.c (+75/-0)
test/test_select.c (+46/-0)
test/time-sem.c (+591/-0)
Reviewer Review Type Date Requested Status
Christian Ehrhardt  (community) Approve
Canonical Server Pending
Review via email: mp+347651@code.launchpad.net

Description of the change

Please use git to review this MP. The diff generated by LP is incorrect.

Simple backport from upstream to silently ignore a non-existent file path when IncludeOptional is used. I also included documentation changes, even though this version of apache only includes the generated html and not the xml source. Another drawback is that I updated only the English doc. If preferred, I can drop that from the patch.

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

Testing instructions:
sudo apt install apache2 apache2-doc
echo "IncludeOptional /etc/apache2/nothere/bug*.conf" | sudo tee /etc/apache2/conf-enabled/bug.conf
echo "IncludeOptional /etc/apache2/nothere/bug.conf" | sudo tee -a /etc/apache2/conf-enabled/bug.conf
echo "IncludeOptional /etc/apache2/bug.conf" | sudo tee -a /etc/apache2/conf-enabled/bug.conf
# this will fail with the non-fixed packages, and restart fine with the fixed packages
sudo systemctl restart apache2

Browse to http://<apache-ip>/manual/en/mod/core.html#includeoptional and verify the documentation was updated:
"""
... or if a file path does not exist on the file system.
"""

Cosmic is already fixed, since it has a newer apache where the fix was applied upstream.

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

Tested from ppa - ok
Changelog - ok
Patch content - ok
Patch headers - ok
References - ok

For the sake of a review being supposed to have feedback here a micro-thing "line 1 of the patch ends in a whitespace"

Revision history for this message
Christian Ehrhardt  (paelzer) :
review: Approve
Revision history for this message
Andreas Hasenack (ahasenack) wrote :

Thanks, fixed. Could you please push the upload tag for 4a4345b9ec249953077ac92ea875a7851f07b1bd (current bionic branch HEAD). I can upload this one.

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

pushed the tag

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
diff --git a/debian/changelog b/debian/changelog
index 5d1ae07..e81196b 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,11 @@
1apache2 (2.4.29-1ubuntu4.2) bionic; urgency=medium
2
3 * debian/patches/includeoptional-ignore-non-existent.patch: silently
4 ignore a not existent file path with IncludeOptional . Closes LP:
5 #1766186.
6
7 -- Andreas Hasenack <andreas@canonical.com> Thu, 07 Jun 2018 18:10:10 -0300
8
1apache2 (2.4.29-1ubuntu4.1) bionic-security; urgency=medium9apache2 (2.4.29-1ubuntu4.1) bionic-security; urgency=medium
210
3 * SECURITY UPDATE: DoS via missing header with AuthLDAPCharsetConfig11 * SECURITY UPDATE: DoS via missing header with AuthLDAPCharsetConfig
diff --git a/debian/patches/includeoptional-ignore-non-existent.patch b/debian/patches/includeoptional-ignore-non-existent.patch
4new file mode 10064412new file mode 100644
index 0000000..22a6e8b
--- /dev/null
+++ b/debian/patches/includeoptional-ignore-non-existent.patch
@@ -0,0 +1,61 @@
1Description: silently ignore a not existent file path with IncludeOptional
2 In https://bz.apache.org/bugzilla/show_bug.cgi?id=57585 some use cases
3 were reported in which IncludeOptional seems to be too strict in its
4 sanity checks.
5 .
6 This change is a proposal to relax IncludeOptional checks to silently
7 fail when a file path is not existent rather than returning SyntaxError.
8Origin: backport, https://github.com/apache/httpd/commit/a17ce7dd5e6277867ca48659f70c4bb8a11add56
9Bug: https://bz.apache.org/bugzilla/show_bug.cgi?id=57585
10Bug-Ubuntu: https://bugs.launchpad.net/ubuntu/+source/apache2/+bug/1766186
11Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=878920
12Last-Update: 2018-06-07
13
14--- a/server/config.c
15+++ b/server/config.c
16@@ -1951,6 +1951,15 @@
17
18 return NULL;
19 }
20+ else if (optional) {
21+ /* If the optinal flag is set (like for IncludeOptional) we can
22+ * tolerate that no file or directory is present and bail out.
23+ */
24+ apr_finfo_t finfo;
25+ if (apr_stat(&finfo, fname, APR_FINFO_TYPE, ptemp) != APR_SUCCESS
26+ || finfo.filetype == APR_NOFILE)
27+ return NULL;
28+ }
29
30 return ap_process_resource_config(s, fname, conftree, p, ptemp);
31 }
32@@ -2001,6 +2010,12 @@
33 */
34 rv = apr_dir_open(&dirp, path, ptemp);
35 if (rv != APR_SUCCESS) {
36+ /* If the directory doesn't exist and the optional flag is set
37+ * there is no need to return an error.
38+ */
39+ if (rv == APR_ENOENT && optional) {
40+ return NULL;
41+ }
42 return apr_psprintf(p, "Could not open config directory %s: %pm",
43 path, &rv);
44 }
45--- a/docs/manual/mod/core.html.en
46+++ b/docs/manual/mod/core.html.en
47@@ -2383,10 +2383,10 @@
48 </table>
49 <p>This directive allows inclusion of other configuration files
50 from within the server configuration files. It works identically to the
51- <code class="directive"><a href="#include">Include</a></code> directive, with the
52- exception that if wildcards do not match any file or directory, the
53- <code class="directive"><a href="#includeoptional">IncludeOptional</a></code> directive will be
54- silently ignored instead of causing an error.</p>
55+ <code class="directive"><a href="#include">Include</a></code> directive, but it will be
56+ silently ignored (instead of causing an error) if wildcards are used and
57+ they do not match any file or directory or if a file path does not exist
58+ on the file system.</p>
59
60 <h3>See also</h3>
61 <ul>
diff --git a/debian/patches/series b/debian/patches/series
index b6471c0..d9d8038 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -22,3 +22,4 @@ CVE-2018-1283.patch
22CVE-2018-1301.patch22CVE-2018-1301.patch
23CVE-2018-1303.patch23CVE-2018-1303.patch
24CVE-2018-1312.patch24CVE-2018-1312.patch
25includeoptional-ignore-non-existent.patch
diff --git a/docs/manual/style/latex/atbeginend.sty b/docs/manual/style/latex/atbeginend.sty
25new file mode 10064426new file mode 100644
index 0000000..79b555d
--- /dev/null
+++ b/docs/manual/style/latex/atbeginend.sty
@@ -0,0 +1,80 @@
1% atbeginend.sty
2%
3% Licensed to the Apache Software Foundation (ASF) under one or more
4% contributor license agreements. See the NOTICE file distributed with
5% this work for additional information regarding copyright ownership.
6% The ASF licenses this file to You under the Apache License, Version 2.0
7% (the "License"); you may not use this file except in compliance with
8% the License. You may obtain a copy of the License at
9%
10% http://www.apache.org/licenses/LICENSE-2.0
11%
12% Unless required by applicable law or agreed to in writing, software
13% distributed under the License is distributed on an "AS IS" BASIS,
14% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15% See the License for the specific language governing permissions and
16% limitations under the License.
17
18% defines
19% \BeforeBegin{environment}{code-to-execute}
20% \BeforeEnd {environment}{code-to-execute}
21% \AfterBegin {environment}{code-to-execute}
22% \AfterEnd {environment}{code-to-execute}
23%
24% Save \begin and \end to \BeginEnvironment and \EndEnvironment
25\let\BeginEnvironment=\begin
26\let\EndEnvironment=\end
27
28\def\IfUnDef#1{\expandafter\ifx\csname#1\endcsname\relax}
29
30% Null command needed to for \nothing{something}=.nothing.
31\def\NullCom#1{}
32
33\def\begin#1{%
34%
35% if defined \BeforeBeg for this environment, execute it
36\IfUnDef{BeforeBeg#1}\else\csname BeforeBeg#1\endcsname\fi%
37%
38%
39%
40\IfUnDef{AfterBeg#1}% This is done to skip the command for environments
41 % which can take arguments, like multicols; YOU MUST NOT
42 % USE \AfterBegin{...}{...} for such environments!
43 \let\SaveBegEng=\BeginEnvironment%
44\else%
45 % Start this environment
46 \BeginEnvironment{#1}%
47 % and execute code after \begin{environment}
48 \csname AfterBeg#1\endcsname%
49 %
50 \let\SaveBegEng=\NullCom%
51\fi%
52\SaveBegEng{#1}%
53}
54
55
56\def\end#1{%
57%
58% execute code before \end{environment}
59\IfUnDef{BeforeEnd#1}\else\csname BeforeEnd#1\endcsname\fi%
60%
61% close this environment
62\EndEnvironment{#1}%
63%
64% and execute code after \begin{environment}
65\IfUnDef{AfterEnd#1}\else\csname AfterEnd#1\endcsname\fi%
66}
67
68
69%% Now, define commands
70% \BeforeBegin{environment}{code-to-execute}
71% \BeforeEnd {environment}{code-to-execute}
72% \AfterBegin {environment}{code-to-execute}
73% \AfterEnd {environment}{code-to-execute}
74
75\def\BeforeBegin#1#2{\expandafter\gdef\csname BeforeBeg#1\endcsname
76{#2}}
77\def\BeforeEnd #1#2{\expandafter\gdef\csname BeforeEnd#1\endcsname
78{#2}}
79\def\AfterBegin #1#2{\expandafter\gdef\csname AfterBeg#1\endcsname {#2}}
80\def\AfterEnd #1#2{\expandafter\gdef\csname AfterEnd#1\endcsname{#2}}
diff --git a/docs/manual/style/manualpage.dtd b/docs/manual/style/manualpage.dtd
0new file mode 10064481new file mode 100644
index 0000000..e9c22a0
--- /dev/null
+++ b/docs/manual/style/manualpage.dtd
@@ -0,0 +1,29 @@
1<?xml version='1.0' encoding='UTF-8' ?>
2
3<!--
4 Licensed to the Apache Software Foundation (ASF) under one or more
5 contributor license agreements. See the NOTICE file distributed with
6 this work for additional information regarding copyright ownership.
7 The ASF licenses this file to You under the Apache License, Version 2.0
8 (the "License"); you may not use this file except in compliance with
9 the License. You may obtain a copy of the License at
10
11 http://www.apache.org/licenses/LICENSE-2.0
12
13 Unless required by applicable law or agreed to in writing, software
14 distributed under the License is distributed on an "AS IS" BASIS,
15 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 See the License for the specific language governing permissions and
17 limitations under the License.
18-->
19
20<!ENTITY % common SYSTEM "common.dtd">
21%common;
22
23<!-- <manualpage> is the root element -->
24<!ELEMENT manualpage (parentdocument?, title, summary?,
25seealso*, section*)>
26
27<!ATTLIST manualpage metafile CDATA #REQUIRED
28 upgrade CDATA #IMPLIED
29>
diff --git a/docs/manual/style/modulesynopsis.dtd b/docs/manual/style/modulesynopsis.dtd
0new file mode 10064430new file mode 100644
index 0000000..1ca9b06
--- /dev/null
+++ b/docs/manual/style/modulesynopsis.dtd
@@ -0,0 +1,85 @@
1<?xml version='1.0' encoding='UTF-8' ?>
2
3<!--
4 Licensed to the Apache Software Foundation (ASF) under one or more
5 contributor license agreements. See the NOTICE file distributed with
6 this work for additional information regarding copyright ownership.
7 The ASF licenses this file to You under the Apache License, Version 2.0
8 (the "License"); you may not use this file except in compliance with
9 the License. You may obtain a copy of the License at
10
11 http://www.apache.org/licenses/LICENSE-2.0
12
13 Unless required by applicable law or agreed to in writing, software
14 distributed under the License is distributed on an "AS IS" BASIS,
15 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 See the License for the specific language governing permissions and
17 limitations under the License.
18-->
19
20<!ENTITY % sitemap SYSTEM "sitemap.dtd">
21%sitemap;
22
23<!ELEMENT modulesynopsis (name , description, status, hint?, sourcefile?,
24identifier? , compatibility? , summary? , seealso* , section*,
25directivesynopsis*)>
26
27<!ATTLIST modulesynopsis metafile CDATA #REQUIRED
28 upgrade CDATA #IMPLIED>
29
30<!ELEMENT directivesynopsis (name , description? , syntax? , default?
31, contextlist? , override? , modulelist?, status?, compatibility? ,
32usage?, seealso*)>
33
34<!ELEMENT name (#PCDATA)>
35
36<!ELEMENT status (#PCDATA)>
37
38<!ELEMENT hint %Inline;>
39
40<!ELEMENT identifier (#PCDATA)>
41
42<!ELEMENT sourcefile (#PCDATA)>
43
44<!ELEMENT compatibility %Inline;>
45
46<!ELEMENT description %Inline;>
47
48<!ATTLIST directivesynopsis type CDATA #IMPLIED
49 location CDATA #IMPLIED >
50
51<!ELEMENT syntax %Inline;>
52
53<!ELEMENT default (#PCDATA | directive | br)*>
54
55<!ELEMENT contextlist (context+)+>
56
57<!ELEMENT context (#PCDATA)>
58
59<!ELEMENT override (#PCDATA)>
60
61<!ELEMENT usage %Block;>
62
63<!-- Used in index.xml -->
64<!ELEMENT moduleindex (title, summary, seealso*)>
65
66<!ATTLIST moduleindex metafile CDATA #REQUIRED>
67
68<!-- Used in directive.xml -->
69<!ELEMENT directiveindex (title | summary)+>
70
71<!ATTLIST directiveindex metafile CDATA #REQUIRED>
72
73<!-- Used in quickreference.xml -->
74<!ELEMENT quickreference (title | summary | legend)+>
75<!ATTLIST quickreference metafile CDATA #REQUIRED>
76
77<!ELEMENT legend (table, table)>
78
79<!-- Used in overrides.xml -->
80<!ELEMENT overrideindex (title | summary | overridesummary)+>
81<!ATTLIST overrideindex metafile CDATA #REQUIRED>
82
83<!ELEMENT overridesummary %Block;>
84<!ATTLIST overridesummary class CDATA #IMPLIED
85 fallback CDATA #IMPLIED>
diff --git a/docs/manual/style/scripts/MINIFY b/docs/manual/style/scripts/MINIFY
0new file mode 10064486new file mode 100644
index 0000000..2c1efc3
--- /dev/null
+++ b/docs/manual/style/scripts/MINIFY
@@ -0,0 +1,5 @@
1#!/bin/sh
2
3(echo '// see prettify.js for copyright, license and expanded version'; python -mrjsmin <prettify.js) >prettify.min.js
4
5# needs python and rjsmin installed
diff --git a/docs/manual/style/scripts/prettify.js b/docs/manual/style/scripts/prettify.js
0new file mode 1006446new file mode 100644
index 0000000..bb74158
--- /dev/null
+++ b/docs/manual/style/scripts/prettify.js
@@ -0,0 +1,1622 @@
1// Copyright (C) 2006 Google Inc.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15
16/**
17 * @fileoverview
18 * some functions for browser-side pretty printing of code contained in html.
19 *
20 * <p>
21 * For a fairly comprehensive set of languages see the
22 * <a href="http://google-code-prettify.googlecode.com/svn/trunk/README.html#langs">README</a>
23 * file that came with this source. At a minimum, the lexer should work on a
24 * number of languages including C and friends, Java, Python, Bash, SQL, HTML,
25 * XML, CSS, Javascript, and Makefiles. It works passably on Ruby, PHP and Awk
26 * and a subset of Perl, but, because of commenting conventions, doesn't work on
27 * Smalltalk, Lisp-like, or CAML-like languages without an explicit lang class.
28 * <p>
29 * Usage: <ol>
30 * <li> include this source file in an html page via
31 * {@code <script type="text/javascript" src="/path/to/prettify.js"></script>}
32 * <li> define style rules. See the example page for examples.
33 * <li> mark the {@code <pre>} and {@code <code>} tags in your source with
34 * {@code class=prettyprint.}
35 * You can also use the (html deprecated) {@code <xmp>} tag, but the pretty
36 * printer needs to do more substantial DOM manipulations to support that, so
37 * some css styles may not be preserved.
38 * </ol>
39 * That's it. I wanted to keep the API as simple as possible, so there's no
40 * need to specify which language the code is in, but if you wish, you can add
41 * another class to the {@code <pre>} or {@code <code>} element to specify the
42 * language, as in {@code <pre class="prettyprint lang-java">}. Any class that
43 * starts with "lang-" followed by a file extension, specifies the file type.
44 * See the "lang-*.js" files in this directory for code that implements
45 * per-language file handlers.
46 * <p>
47 * Change log:<br>
48 * cbeust, 2006/08/22
49 * <blockquote>
50 * Java annotations (start with "@") are now captured as literals ("lit")
51 * </blockquote>
52 * @requires console
53 */
54
55// JSLint declarations
56/*global console, document, navigator, setTimeout, window, define */
57
58/**
59 * Split {@code prettyPrint} into multiple timeouts so as not to interfere with
60 * UI events.
61 * If set to {@code false}, {@code prettyPrint()} is synchronous.
62 */
63window['PR_SHOULD_USE_CONTINUATION'] = true;
64
65/**
66 * Find all the {@code <pre>} and {@code <code>} tags in the DOM with
67 * {@code class=prettyprint} and prettify them.
68 *
69 * @param {Function?} opt_whenDone if specified, called when the last entry
70 * has been finished.
71 */
72var prettyPrintOne;
73/**
74 * Pretty print a chunk of code.
75 *
76 * @param {string} sourceCodeHtml code as html
77 * @return {string} code as html, but prettier
78 */
79var prettyPrint;
80
81
82(function () {
83 var win = window;
84 // Keyword lists for various languages.
85 // We use things that coerce to strings to make them compact when minified
86 // and to defeat aggressive optimizers that fold large string constants.
87 var FLOW_CONTROL_KEYWORDS = ["break,continue,do,else,for,if,return,while"];
88 var C_KEYWORDS = [FLOW_CONTROL_KEYWORDS,"auto,case,char,const,default," +
89 "double,enum,extern,float,goto,int,long,register,short,signed,sizeof,module," +
90 "static,struct,switch,typedef,union,unsigned,void,volatile"];
91 var COMMON_KEYWORDS = [C_KEYWORDS,"catch,class,delete,false,import," +
92 "new,operator,private,protected,public,this,throw,true,try,typeof"];
93 var CPP_KEYWORDS = [COMMON_KEYWORDS,"alignof,align_union,asm,axiom,bool," +
94 "concept,concept_map,const_cast,constexpr,decltype," +
95 "dynamic_cast,explicit,export,friend,inline,late_check," +
96 "mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast," +
97 "template,typeid,typename,using,virtual,where,request_req"];
98 var JAVA_KEYWORDS = [COMMON_KEYWORDS,
99 "abstract,boolean,byte,extends,final,finally,implements,import," +
100 "instanceof,null,native,package,strictfp,super,synchronized,throws," +
101 "transient"];
102 var CSHARP_KEYWORDS = [JAVA_KEYWORDS,
103 "as,base,by,checked,decimal,delegate,descending,dynamic,event," +
104 "fixed,foreach,from,group,implicit,in,interface,internal,into,is,let," +
105 "lock,object,out,override,orderby,params,partial,readonly,ref,sbyte," +
106 "sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort," +
107 "var,virtual,where"];
108 var COFFEE_KEYWORDS = "all,and,by,catch,class,else,extends,false,finally," +
109 "for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then," +
110 "throw,true,try,unless,until,when,while,yes";
111 var JSCRIPT_KEYWORDS = [COMMON_KEYWORDS,
112 "debugger,eval,export,function,get,null,set,undefined,var,with," +
113 "Infinity,NaN"];
114 var PERL_KEYWORDS = "caller,delete,die,do,dump,else,elsif,eval,exit,foreach,for," +
115 "goto,if,import,last,local,my,next,no,our,print,printf,package,redo,require," +
116 "sub,undef,unless,until,use,wantarray,while,BEGIN,END";
117 var PHP_KEYWORDS = "abstract,and,array,as,break,case,catch,cfunction,class," +
118 "clone,const,continue,declare,default,do,else,elseif,enddeclare,endfor," +
119 "endforeach,endif,endswitch,endwhile,extends,final,for,foreach,function," +
120 "global,goto,if,implements,interface,instanceof,namespace,new,old_function," +
121 "or,private,protected,public,static,switch,throw,try,use,var,while,xor," +
122 "die,echo,empty,exit,eval,include,include_once,isset,list,require," +
123 "require_once,return,print,unset";
124 var PYTHON_KEYWORDS = [FLOW_CONTROL_KEYWORDS, "and,as,assert,class,def,del," +
125 "elif,except,exec,finally,from,global,import,in,is,lambda," +
126 "nonlocal,not,or,pass,print,raise,try,with,yield," +
127 "False,True,None"];
128 var RUBY_KEYWORDS = [FLOW_CONTROL_KEYWORDS, "alias,and,begin,case,class," +
129 "def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo," +
130 "rescue,retry,self,super,then,true,undef,unless,until,when,yield," +
131 "BEGIN,END"];
132 var SH_KEYWORDS = [FLOW_CONTROL_KEYWORDS, "case,done,elif,esac,eval,fi," +
133 "function,in,local,set,then,until,echo"];
134 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"];
135 var CONFIG_KEYWORDS = ["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,AuthnCacheContext,AuthnCacheEnable,AuthnCacheProvideFor,AuthnCacheSOCache,AuthnCacheTimeout,<AuthnProviderAlias>,AuthnzFcgiCheckAuthnProvider,AuthnzFcgiDefineProvider,AuthType,AuthUserFile,AuthzDBDLoginToReferer,AuthzDBDQuery,AuthzDBDRedirectQuery,AuthzDBMType,<AuthzProviderAlias>,AuthzSendForbiddenOnFailure,BalancerGrowth,BalancerInherit,BalancerMember,BalancerPersist,BrotliAlterETag,BrotliCompressionMaxInputBlock,BrotliCompressionQuality,BrotliCompressionWindow,BrotliFilterNote,BrowserMatch,BrowserMatchNoCase,BufferedLogs,BufferSize,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,CGIDScriptTimeout,CGIMapExtension,CGIPassAuth,CGIVar,CharsetDefault,CharsetOptions,CharsetSourceEnc,CheckCaseOnly,CheckSpelling,ChrootDir,ContentDigest,CookieDomain,CookieExpires,CookieName,CookieStyle,CookieTracking,CoreDumpDirectory,CustomLog,Dav,DavDepthInfinity,DavGenericLockDB,DavLockDB,DavMinTimeout,DBDExptime,DBDInitSQL,DBDKeep,DBDMax,DBDMin,DBDParams,DBDPersist,DBDPrepareSQL,DBDriver,DefaultIcon,DefaultLanguage,DefaultRuntimeDir,DefaultType,Define,DeflateBufferSize,DeflateCompressionLevel,DeflateFilterNote,DeflateInflateLimitRequestBody,DeflateInflateRatioBurst,DeflateInflateRatioLimit,DeflateMemLevel,DeflateWindowSize,Deny,<Directory>,DirectoryCheckHandler,DirectoryIndex,DirectoryIndexRedirect,<DirectoryMatch>,DirectorySlash,DocumentRoot,DTracePrivileges,DumpIOInput,DumpIOOutput,<Else>,<ElseIf>,EnableExceptionHook,EnableMMAP,EnableSendfile,Error,ErrorDocument,ErrorLog,ErrorLogFormat,Example,ExpiresActive,ExpiresByType,ExpiresDefault,ExtendedStatus,ExtFilterDefine,ExtFilterOptions,FallbackResource,FileETag,<Files>,<FilesMatch>,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,IdentityCheck,IdentityCheckTimeout,<If>,<IfDefine>,<IfModule>,<IfVersion>,ImapBase,ImapDefault,ImapMenu,Include,IncludeOptional,IndexHeadInsert,IndexIgnore,IndexIgnoreReset,IndexOptions,IndexOrderDefault,IndexStyleSheet,InputSed,ISAPIAppendLogToErrors,ISAPIAppendLogToQuery,ISAPICacheFile,ISAPIFakeAsync,ISAPILogNotSupported,ISAPIReadAheadBuffer,KeepAlive,KeepAliveTimeout,KeptBodySize,LanguagePriority,LDAPCacheEntries,LDAPCacheTTL,LDAPConnectionPoolTTL,LDAPConnectionTimeout,LDAPLibraryDebug,LDAPOpCacheEntries,LDAPOpCacheTTL,LDAPReferralHopLimit,LDAPReferrals,LDAPRetries,LDAPRetryDelay,LDAPSharedCacheFile,LDAPSharedCacheSize,LDAPTimeout,LDAPTrustedClientCert,LDAPTrustedGlobalCert,LDAPTrustedMode,LDAPVerifyServerCert,<Limit>,<LimitExcept>,LimitInternalRecursion,LimitRequestBody,LimitRequestFields,LimitRequestFieldSize,LimitRequestLine,LimitXMLRequestBody,Listen,ListenBackLog,ListenCoresBucketsRatio,LoadFile,LoadModule,<Location>,<LocationMatch>,LogFormat,LogIOTrackTTFB,LogLevel,LogMessage,LuaAuthzProvider,LuaCodeCache,LuaHookAccessChecker,LuaHookAuthChecker,LuaHookCheckUserID,LuaHookFixups,LuaHookInsertFilter,LuaHookLog,LuaHookMapToStorage,LuaHookTranslateName,LuaHookTypeChecker,LuaInherit,LuaInputFilter,LuaMapHandler,LuaOutputFilter,LuaPackageCPath,LuaPackagePath,LuaQuickHandler,LuaRoot,LuaScope,<Macro>,MaxConnectionsPerChild,MaxKeepAliveRequests,MaxMemFree,MaxRangeOverlaps,MaxRangeReversals,MaxRanges,MaxRequestWorkers,MaxSpareServers,MaxSpareThreads,MaxThreads,MemcacheConnTTL,MergeTrailers,MetaDir,MetaFiles,MetaSuffix,MimeMagicFile,MinSpareServers,MinSpareThreads,MMapFile,ModemStandard,ModMimeUsePathInfo,MultiviewsMatch,Mutex,NameVirtualHost,NoProxy,NWSSLTrustedCerts,NWSSLUpgradeable,Options,Order,OutputSed,PassEnv,PidFile,PrivilegesMode,Protocol,ProtocolEcho,Protocols,ProtocolsHonorOrder,<Proxy>,ProxyAddHeaders,ProxyBadHeader,ProxyBlock,ProxyDomain,ProxyErrorOverride,ProxyExpressDBMFile,ProxyExpressDBMType,ProxyExpressEnable,ProxyFCGIBackendType,ProxyFCGISetEnvIf,ProxyFtpDirCharset,ProxyFtpEscapeWildcards,ProxyFtpListOnWildcard,ProxyHCExpr,ProxyHCTemplate,ProxyHCTPsize,ProxyHTMLBufSize,ProxyHTMLCharsetOut,ProxyHTMLDocType,ProxyHTMLEnable,ProxyHTMLEvents,ProxyHTMLExtended,ProxyHTMLFixups,ProxyHTMLInterp,ProxyHTMLLinks,ProxyHTMLMeta,ProxyHTMLStripComments,ProxyHTMLURLMap,ProxyIOBufferSize,<ProxyMatch>,ProxyMaxForwards,ProxyPass,ProxyPassInherit,ProxyPassInterpolateEnv,ProxyPassMatch,ProxyPassReverse,ProxyPassReverseCookieDomain,ProxyPassReverseCookiePath,ProxyPreserveHost,ProxyReceiveBufferSize,ProxyRemote,ProxyRemoteMatch,ProxyRequests,ProxySCGIInternalRedirect,ProxySCGISendfile,ProxySet,ProxySourceAddress,ProxyStatus,ProxyTimeout,ProxyVia,QualifyRedirectURL,ReadmeName,ReceiveBufferSize,Redirect,RedirectMatch,RedirectPermanent,RedirectTemp,ReflectorHeader,RegisterHttpMethod,RemoteIPHeader,RemoteIPInternalProxy,RemoteIPInternalProxyList,RemoteIPProxiesHeader,RemoteIPTrustedProxy,RemoteIPTrustedProxyList,RemoveCharset,RemoveEncoding,RemoveHandler,RemoveInputFilter,RemoveLanguage,RemoveOutputFilter,RemoveType,RequestHeader,RequestReadTimeout,Require,<RequireAll>,<RequireAny>,<RequireNone>,RewriteBase,RewriteCond,RewriteEngine,RewriteMap,RewriteOptions,RewriteRule,RLimitCPU,RLimitMEM,RLimitNPROC,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,SSIEndTag,SSIErrorMsg,SSIETag,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,SSLSessionCache,SSLSessionCacheTimeout,SSLSessionTicketKeyFile,SSLSessionTickets,SSLSRPUnknownUserSeed,SSLSRPVerifierFile,SSLStaplingCache,SSLStaplingErrorCacheTimeout,SSLStaplingFakeTryLater,SSLStaplingForceURL,SSLStaplingResponderTimeout,SSLStaplingResponseMaxAge,SSLStaplingResponseTimeSkew,SSLStaplingReturnResponderErrors,SSLStaplingStandardCacheTimeout,SSLStrictSNIVHostCheck,SSLUserName,SSLUseStapling,SSLVerifyClient,SSLVerifyDepth,StartServers,StartThreads,Substitute,SubstituteInheritBefore,SubstituteMaxLineLength,Suexec,SuexecUserGroup,ThreadLimit,ThreadsPerChild,ThreadStackSize,TimeOut,TraceEnable,TransferLog,TypesConfig,UnDefine,UndefMacro,UnsetEnv,Use,UseCanonicalName,UseCanonicalPhysicalPort,User,UserDir,VHostCGIMode,VHostCGIPrivs,VHostGroup,VHostPrivs,VHostSecure,VHostUser,VirtualDocumentRoot,VirtualDocumentRootIP,<VirtualHost>,VirtualScriptAlias,VirtualScriptAliasIP,WatchdogInterval,XBitHack,xml2EncAlias,xml2EncDefault,xml2StartParse"];
136 var CONFIG_OPTIONS = /^[\\+\\-]?(AuthConfig|IncludesNOEXEC|ExecCGI|FollowSymLinks|MultiViews|Includes|Indexes|SymLinksIfOwnerMatch)\b/i;
137 var ALL_KEYWORDS = [
138 CPP_KEYWORDS, CSHARP_KEYWORDS, JSCRIPT_KEYWORDS, PERL_KEYWORDS +
139 PYTHON_KEYWORDS, RUBY_KEYWORDS, SH_KEYWORDS, CONFIG_KEYWORDS, PHP_KEYWORDS];
140 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/;
141
142 // token style names. correspond to css classes
143 /**
144 * token style for a string literal
145 * @const
146 */
147 var PR_STRING = 'str';
148 /**
149 * token style for a keyword
150 * @const
151 */
152 var PR_KEYWORD = 'kwd';
153 /**
154 * token style for a comment
155 * @const
156 */
157 var PR_COMMENT = 'com';
158 /**
159 * token style for a type
160 * @const
161 */
162 var PR_TYPE = 'typ';
163 /**
164 * token style for a literal value. e.g. 1, null, true.
165 * @const
166 */
167 var PR_LITERAL = 'lit';
168 /**
169 * token style for a punctuation string.
170 * @const
171 */
172 var PR_PUNCTUATION = 'pun';
173 /**
174 * token style for plain text.
175 * @const
176 */
177 var PR_PLAIN = 'pln';
178
179 /**
180 * token style for an sgml tag.
181 * @const
182 */
183 var PR_TAG = 'tag';
184 /**
185 * token style for a markup declaration such as a DOCTYPE.
186 * @const
187 */
188 var PR_DECLARATION = 'dec';
189 /**
190 * token style for embedded source.
191 * @const
192 */
193 var PR_SOURCE = 'src';
194 /**
195 * token style for an sgml attribute name.
196 * @const
197 */
198 var PR_ATTRIB_NAME = 'atn';
199 /**
200 * token style for an sgml attribute value.
201 * @const
202 */
203 var PR_ATTRIB_VALUE = 'atv';
204
205 /**
206 * A class that indicates a section of markup that is not code, e.g. to allow
207 * embedding of line numbers within code listings.
208 * @const
209 */
210 var PR_NOCODE = 'nocode';
211
212
213
214/**
215 * A set of tokens that can precede a regular expression literal in
216 * javascript
217 * http://web.archive.org/web/20070717142515/http://www.mozilla.org/js/language/js20/rationale/syntax.html
218 * has the full list, but I've removed ones that might be problematic when
219 * seen in languages that don't support regular expression literals.
220 *
221 * <p>Specifically, I've removed any keywords that can't precede a regexp
222 * literal in a syntactically legal javascript program, and I've removed the
223 * "in" keyword since it's not a keyword in many languages, and might be used
224 * as a count of inches.
225 *
226 * <p>The link above does not accurately describe EcmaScript rules since
227 * it fails to distinguish between (a=++/b/i) and (a++/b/i) but it works
228 * very well in practice.
229 *
230 * @private
231 * @const
232 */
233var REGEXP_PRECEDER_PATTERN = '(?:^^\\.?|[+-]|[!=]=?=?|\\#|%=?|&&?=?|\\(|\\*=?|[+\\-]=|->|\\/=?|::?|<<?=?|>>?>?=?|,|;|\\?|@|\\[|~|{|\\^\\^?=?|\\|\\|?=?|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*';
234
235// CAVEAT: this does not properly handle the case where a regular
236// expression immediately follows another since a regular expression may
237// have flags for case-sensitivity and the like. Having regexp tokens
238// adjacent is not valid in any language I'm aware of, so I'm punting.
239// TODO: maybe style special characters inside a regexp as punctuation.
240
241
242 /**
243 * Given a group of {@link RegExp}s, returns a {@code RegExp} that globally
244 * matches the union of the sets of strings matched by the input RegExp.
245 * Since it matches globally, if the input strings have a start-of-input
246 * anchor (/^.../), it is ignored for the purposes of unioning.
247 * @param {Array.<RegExp>} regexs non multiline, non-global regexs.
248 * @return {RegExp} a global regex.
249 */
250 function combinePrefixPatterns(regexs) {
251 var capturedGroupIndex = 0;
252
253 var needToFoldCase = false;
254 var ignoreCase = false;
255 for (var i = 0, n = regexs.length; i < n; ++i) {
256 var regex = regexs[i];
257 if (regex.ignoreCase) {
258 ignoreCase = true;
259 } else if (/[a-z]/i.test(regex.source.replace(
260 /\\u[0-9a-f]{4}|\\x[0-9a-f]{2}|\\[^ux]/gi, ''))) {
261 needToFoldCase = true;
262 ignoreCase = false;
263 break;
264 }
265 }
266
267 var escapeCharToCodeUnit = {
268 'b': 8,
269 't': 9,
270 'n': 0xa,
271 'v': 0xb,
272 'f': 0xc,
273 'r': 0xd
274 };
275
276 function decodeEscape(charsetPart) {
277 var cc0 = charsetPart.charCodeAt(0);
278 if (cc0 !== 92 /* \\ */) {
279 return cc0;
280 }
281 var c1 = charsetPart.charAt(1);
282 cc0 = escapeCharToCodeUnit[c1];
283 if (cc0) {
284 return cc0;
285 } else if ('0' <= c1 && c1 <= '7') {
286 return parseInt(charsetPart.substring(1), 8);
287 } else if (c1 === 'u' || c1 === 'x') {
288 return parseInt(charsetPart.substring(2), 16);
289 } else {
290 return charsetPart.charCodeAt(1);
291 }
292 }
293
294 function encodeEscape(charCode) {
295 if (charCode < 0x20) {
296 return (charCode < 0x10 ? '\\x0' : '\\x') + charCode.toString(16);
297 }
298 var ch = String.fromCharCode(charCode);
299 return (ch === '\\' || ch === '-' || ch === ']' || ch === '^')
300 ? "\\" + ch : ch;
301 }
302
303 function caseFoldCharset(charSet) {
304 var charsetParts = charSet.substring(1, charSet.length - 1).match(
305 new RegExp(
306 '\\\\u[0-9A-Fa-f]{4}'
307 + '|\\\\x[0-9A-Fa-f]{2}'
308 + '|\\\\[0-3][0-7]{0,2}'
309 + '|\\\\[0-7]{1,2}'
310 + '|\\\\[\\s\\S]'
311 + '|-'
312 + '|[^-\\\\]',
313 'g'));
314 var ranges = [];
315 var inverse = charsetParts[0] === '^';
316
317 var out = ['['];
318 if (inverse) { out.push('^'); }
319
320 for (var i = inverse ? 1 : 0, n = charsetParts.length; i < n; ++i) {
321 var p = charsetParts[i];
322 if (/\\[bdsw]/i.test(p)) { // Don't muck with named groups.
323 out.push(p);
324 } else {
325 var start = decodeEscape(p);
326 var end;
327 if (i + 2 < n && '-' === charsetParts[i + 1]) {
328 end = decodeEscape(charsetParts[i + 2]);
329 i += 2;
330 } else {
331 end = start;
332 }
333 ranges.push([start, end]);
334 // If the range might intersect letters, then expand it.
335 // This case handling is too simplistic.
336 // It does not deal with non-latin case folding.
337 // It works for latin source code identifiers though.
338 if (!(end < 65 || start > 122)) {
339 if (!(end < 65 || start > 90)) {
340 ranges.push([Math.max(65, start) | 32, Math.min(end, 90) | 32]);
341 }
342 if (!(end < 97 || start > 122)) {
343 ranges.push([Math.max(97, start) & ~32, Math.min(end, 122) & ~32]);
344 }
345 }
346 }
347 }
348
349 // [[1, 10], [3, 4], [8, 12], [14, 14], [16, 16], [17, 17]]
350 // -> [[1, 12], [14, 14], [16, 17]]
351 ranges.sort(function (a, b) { return (a[0] - b[0]) || (b[1] - a[1]); });
352 var consolidatedRanges = [];
353 var lastRange = [];
354 for (var i = 0; i < ranges.length; ++i) {
355 var range = ranges[i];
356 if (range[0] <= lastRange[1] + 1) {
357 lastRange[1] = Math.max(lastRange[1], range[1]);
358 } else {
359 consolidatedRanges.push(lastRange = range);
360 }
361 }
362
363 for (var i = 0; i < consolidatedRanges.length; ++i) {
364 var range = consolidatedRanges[i];
365 out.push(encodeEscape(range[0]));
366 if (range[1] > range[0]) {
367 if (range[1] + 1 > range[0]) { out.push('-'); }
368 out.push(encodeEscape(range[1]));
369 }
370 }
371 out.push(']');
372 return out.join('');
373 }
374
375 function allowAnywhereFoldCaseAndRenumberGroups(regex) {
376 // Split into character sets, escape sequences, punctuation strings
377 // like ('(', '(?:', ')', '^'), and runs of characters that do not
378 // include any of the above.
379 var parts = regex.source.match(
380 new RegExp(
381 '(?:'
382 + '\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]' // a character set
383 + '|\\\\u[A-Fa-f0-9]{4}' // a unicode escape
384 + '|\\\\x[A-Fa-f0-9]{2}' // a hex escape
385 + '|\\\\[0-9]+' // a back-reference or octal escape
386 + '|\\\\[^ux0-9]' // other escape sequence
387 + '|\\(\\?[:!=]' // start of a non-capturing group
388 + '|[\\(\\)\\^]' // start/end of a group, or line start
389 + '|[^\\x5B\\x5C\\(\\)\\^]+' // run of other characters
390 + ')',
391 'g'));
392 var n = parts.length;
393
394 // Maps captured group numbers to the number they will occupy in
395 // the output or to -1 if that has not been determined, or to
396 // undefined if they need not be capturing in the output.
397 var capturedGroups = [];
398
399 // Walk over and identify back references to build the capturedGroups
400 // mapping.
401 for (var i = 0, groupIndex = 0; i < n; ++i) {
402 var p = parts[i];
403 if (p === '(') {
404 // groups are 1-indexed, so max group index is count of '('
405 ++groupIndex;
406 } else if ('\\' === p.charAt(0)) {
407 var decimalValue = +p.substring(1);
408 if (decimalValue) {
409 if (decimalValue <= groupIndex) {
410 capturedGroups[decimalValue] = -1;
411 } else {
412 // Replace with an unambiguous escape sequence so that
413 // an octal escape sequence does not turn into a backreference
414 // to a capturing group from an earlier regex.
415 parts[i] = encodeEscape(decimalValue);
416 }
417 }
418 }
419 }
420
421 // Renumber groups and reduce capturing groups to non-capturing groups
422 // where possible.
423 for (var i = 1; i < capturedGroups.length; ++i) {
424 if (-1 === capturedGroups[i]) {
425 capturedGroups[i] = ++capturedGroupIndex;
426 }
427 }
428 for (var i = 0, groupIndex = 0; i < n; ++i) {
429 var p = parts[i];
430 if (p === '(') {
431 ++groupIndex;
432 if (!capturedGroups[groupIndex]) {
433 parts[i] = '(?:';
434 }
435 } else if ('\\' === p.charAt(0)) {
436 var decimalValue = +p.substring(1);
437 if (decimalValue && decimalValue <= groupIndex) {
438 parts[i] = '\\' + capturedGroups[decimalValue];
439 }
440 }
441 }
442
443 // Remove any prefix anchors so that the output will match anywhere.
444 // ^^ really does mean an anchored match though.
445 for (var i = 0; i < n; ++i) {
446 if ('^' === parts[i] && '^' !== parts[i + 1]) { parts[i] = ''; }
447 }
448
449 // Expand letters to groups to handle mixing of case-sensitive and
450 // case-insensitive patterns if necessary.
451 if (regex.ignoreCase && needToFoldCase) {
452 for (var i = 0; i < n; ++i) {
453 var p = parts[i];
454 var ch0 = p.charAt(0);
455 if (p.length >= 2 && ch0 === '[') {
456 parts[i] = caseFoldCharset(p);
457 } else if (ch0 !== '\\') {
458 // TODO: handle letters in numeric escapes.
459 parts[i] = p.replace(
460 /[a-zA-Z]/g,
461 function (ch) {
462 var cc = ch.charCodeAt(0);
463 return '[' + String.fromCharCode(cc & ~32, cc | 32) + ']';
464 });
465 }
466 }
467 }
468
469 return parts.join('');
470 }
471
472 var rewritten = [];
473 for (var i = 0, n = regexs.length; i < n; ++i) {
474 var regex = regexs[i];
475 if (regex.global || regex.multiline) { throw new Error('' + regex); }
476 rewritten.push(
477 '(?:' + allowAnywhereFoldCaseAndRenumberGroups(regex) + ')');
478 }
479
480 return new RegExp(rewritten.join('|'), ignoreCase ? 'gi' : 'g');
481 }
482
483
484 /**
485 * Split markup into a string of source code and an array mapping ranges in
486 * that string to the text nodes in which they appear.
487 *
488 * <p>
489 * The HTML DOM structure:</p>
490 * <pre>
491 * (Element "p"
492 * (Element "b"
493 * (Text "print ")) ; #1
494 * (Text "'Hello '") ; #2
495 * (Element "br") ; #3
496 * (Text " + 'World';")) ; #4
497 * </pre>
498 * <p>
499 * corresponds to the HTML
500 * {@code <p><b>print </b>'Hello '<br> + 'World';</p>}.</p>
501 *
502 * <p>
503 * It will produce the output:</p>
504 * <pre>
505 * {
506 * sourceCode: "print 'Hello '\n + 'World';",
507 * // 1 2
508 * // 012345678901234 5678901234567
509 * spans: [0, #1, 6, #2, 14, #3, 15, #4]
510 * }
511 * </pre>
512 * <p>
513 * where #1 is a reference to the {@code "print "} text node above, and so
514 * on for the other text nodes.
515 * </p>
516 *
517 * <p>
518 * The {@code} spans array is an array of pairs. Even elements are the start
519 * indices of substrings, and odd elements are the text nodes (or BR elements)
520 * that contain the text for those substrings.
521 * Substrings continue until the next index or the end of the source.
522 * </p>
523 *
524 * @param {Node} node an HTML DOM subtree containing source-code.
525 * @param {boolean} isPreformatted true if white-space in text nodes should
526 * be considered significant.
527 * @return {Object} source code and the text nodes in which they occur.
528 */
529 function extractSourceSpans(node, isPreformatted) {
530 var nocode = /(?:^|\s)nocode(?:\s|$)/;
531
532 var chunks = [];
533 var length = 0;
534 var spans = [];
535 var k = 0;
536
537 function walk(node) {
538 switch (node.nodeType) {
539 case 1: // Element
540 if (nocode.test(node.className)) { return; }
541 for (var child = node.firstChild; child; child = child.nextSibling) {
542 walk(child);
543 }
544 var nodeName = node.nodeName.toLowerCase();
545 if ('br' === nodeName || 'li' === nodeName) {
546 chunks[k] = '\n';
547 spans[k << 1] = length++;
548 spans[(k++ << 1) | 1] = node;
549 }
550 break;
551 case 3: case 4: // Text
552 var text = node.nodeValue;
553 if (text.length) {
554 if (!isPreformatted) {
555 text = text.replace(/[ \t\r\n]+/g, ' ');
556 } else {
557 text = text.replace(/\r\n?/g, '\n'); // Normalize newlines.
558 text = text.replace(/^(\r?\n\s*)+/g, ''); // Remove leading newlines
559 text = text.replace(/^\s*/g, ''); // Remove leading spaces due to indented formatting
560 text = text.replace(/(\r?\n\s*)+$/g, ''); // Remove ending newlines
561
562 }
563 // TODO: handle tabs here?
564 chunks[k] = text;
565 spans[k << 1] = length;
566 length += text.length;
567 spans[(k++ << 1) | 1] = node;
568 }
569 break;
570 }
571 }
572
573 walk(node);
574
575 return {
576 sourceCode: chunks.join('').replace(/\n$/, ''),
577 spans: spans
578 };
579 }
580
581
582 /**
583 * Apply the given language handler to sourceCode and add the resulting
584 * decorations to out.
585 * @param {number} basePos the index of sourceCode within the chunk of source
586 * whose decorations are already present on out.
587 */
588 function appendDecorations(basePos, sourceCode, langHandler, out) {
589 if (!sourceCode) { return; }
590 var job = {
591 sourceCode: sourceCode,
592 basePos: basePos
593 };
594 langHandler(job);
595 out.push.apply(out, job.decorations);
596 }
597
598 var notWs = /\S/;
599
600 /**
601 * Given an element, if it contains only one child element and any text nodes
602 * it contains contain only space characters, return the sole child element.
603 * Otherwise returns undefined.
604 * <p>
605 * This is meant to return the CODE element in {@code <pre><code ...>} when
606 * there is a single child element that contains all the non-space textual
607 * content, but not to return anything where there are multiple child elements
608 * as in {@code <pre><code>...</code><code>...</code></pre>} or when there
609 * is textual content.
610 */
611 function childContentWrapper(element) {
612 var wrapper = undefined;
613 for (var c = element.firstChild; c; c = c.nextSibling) {
614 var type = c.nodeType;
615 wrapper = (type === 1) // Element Node
616 ? (wrapper ? element : c)
617 : (type === 3) // Text Node
618 ? (notWs.test(c.nodeValue) ? element : wrapper)
619 : wrapper;
620 }
621 return wrapper === element ? undefined : wrapper;
622 }
623
624 /** Given triples of [style, pattern, context] returns a lexing function,
625 * The lexing function interprets the patterns to find token boundaries and
626 * returns a decoration list of the form
627 * [index_0, style_0, index_1, style_1, ..., index_n, style_n]
628 * where index_n is an index into the sourceCode, and style_n is a style
629 * constant like PR_PLAIN. index_n-1 <= index_n, and style_n-1 applies to
630 * all characters in sourceCode[index_n-1:index_n].
631 *
632 * The stylePatterns is a list whose elements have the form
633 * [style : string, pattern : RegExp, DEPRECATED, shortcut : string].
634 *
635 * Style is a style constant like PR_PLAIN, or can be a string of the
636 * form 'lang-FOO', where FOO is a language extension describing the
637 * language of the portion of the token in $1 after pattern executes.
638 * E.g., if style is 'lang-lisp', and group 1 contains the text
639 * '(hello (world))', then that portion of the token will be passed to the
640 * registered lisp handler for formatting.
641 * The text before and after group 1 will be restyled using this decorator
642 * so decorators should take care that this doesn't result in infinite
643 * recursion. For example, the HTML lexer rule for SCRIPT elements looks
644 * something like ['lang-js', /<[s]cript>(.+?)<\/script>/]. This may match
645 * '<script>foo()<\/script>', which would cause the current decorator to
646 * be called with '<script>' which would not match the same rule since
647 * group 1 must not be empty, so it would be instead styled as PR_TAG by
648 * the generic tag rule. The handler registered for the 'js' extension would
649 * then be called with 'foo()', and finally, the current decorator would
650 * be called with '<\/script>' which would not match the original rule and
651 * so the generic tag rule would identify it as a tag.
652 *
653 * Pattern must only match prefixes, and if it matches a prefix, then that
654 * match is considered a token with the same style.
655 *
656 * Context is applied to the last non-whitespace, non-comment token
657 * recognized.
658 *
659 * Shortcut is an optional string of characters, any of which, if the first
660 * character, gurantee that this pattern and only this pattern matches.
661 *
662 * @param {Array} shortcutStylePatterns patterns that always start with
663 * a known character. Must have a shortcut string.
664 * @param {Array} fallthroughStylePatterns patterns that will be tried in
665 * order if the shortcut ones fail. May have shortcuts.
666 *
667 * @return {function (Object)} a
668 * function that takes source code and returns a list of decorations.
669 */
670 function createSimpleLexer(shortcutStylePatterns, fallthroughStylePatterns) {
671 var shortcuts = {};
672 var tokenizer;
673 (function () {
674 var allPatterns = shortcutStylePatterns.concat(fallthroughStylePatterns);
675 var allRegexs = [];
676 var regexKeys = {};
677 for (var i = 0, n = allPatterns.length; i < n; ++i) {
678 var patternParts = allPatterns[i];
679 var shortcutChars = patternParts[3];
680 if (shortcutChars) {
681 for (var c = shortcutChars.length; --c >= 0;) {
682 shortcuts[shortcutChars.charAt(c)] = patternParts;
683 }
684 }
685 var regex = patternParts[1];
686 var k = '' + regex;
687 if (!regexKeys.hasOwnProperty(k)) {
688 allRegexs.push(regex);
689 regexKeys[k] = null;
690 }
691 }
692 allRegexs.push(/[\0-\uffff]/);
693 tokenizer = combinePrefixPatterns(allRegexs);
694 })();
695
696 var nPatterns = fallthroughStylePatterns.length;
697
698 /**
699 * Lexes job.sourceCode and produces an output array job.decorations of
700 * style classes preceded by the position at which they start in
701 * job.sourceCode in order.
702 *
703 * @param {Object} job an object like <pre>{
704 * sourceCode: {string} sourceText plain text,
705 * basePos: {int} position of job.sourceCode in the larger chunk of
706 * sourceCode.
707 * }</pre>
708 */
709 var decorate = function (job) {
710 var sourceCode = job.sourceCode, basePos = job.basePos;
711 /** Even entries are positions in source in ascending order. Odd enties
712 * are style markers (e.g., PR_COMMENT) that run from that position until
713 * the end.
714 * @type {Array.<number|string>}
715 */
716 var decorations = [basePos, PR_PLAIN];
717 var pos = 0; // index into sourceCode
718 var tokens = sourceCode.match(tokenizer) || [];
719 var styleCache = {};
720
721 for (var ti = 0, nTokens = tokens.length; ti < nTokens; ++ti) {
722 var token = tokens[ti];
723 var style = styleCache[token];
724 var match = void 0;
725
726 var isEmbedded;
727 if (typeof style === 'string') {
728 isEmbedded = false;
729 } else {
730 var patternParts = shortcuts[token.charAt(0)];
731 if (patternParts) {
732 match = token.match(patternParts[1]);
733 style = patternParts[0];
734 } else {
735 for (var i = 0; i < nPatterns; ++i) {
736 patternParts = fallthroughStylePatterns[i];
737 match = token.match(patternParts[1]);
738 if (match) {
739 style = patternParts[0];
740 break;
741 }
742 }
743
744 if (!match) { // make sure that we make progress
745 style = PR_PLAIN;
746 }
747 }
748
749 isEmbedded = style.length >= 5 && 'lang-' === style.substring(0, 5);
750 if (isEmbedded && !(match && typeof match[1] === 'string')) {
751 isEmbedded = false;
752 style = PR_SOURCE;
753 }
754
755 if (!isEmbedded) { styleCache[token] = style; }
756 }
757
758 var tokenStart = pos;
759 pos += token.length;
760
761 if (!isEmbedded) {
762 decorations.push(basePos + tokenStart, style);
763 } else { // Treat group 1 as an embedded block of source code.
764 var embeddedSource = match[1];
765 var embeddedSourceStart = token.indexOf(embeddedSource);
766 var embeddedSourceEnd = embeddedSourceStart + embeddedSource.length;
767 if (match[2]) {
768 // If embeddedSource can be blank, then it would match at the
769 // beginning which would cause us to infinitely recurse on the
770 // entire token, so we catch the right context in match[2].
771 embeddedSourceEnd = token.length - match[2].length;
772 embeddedSourceStart = embeddedSourceEnd - embeddedSource.length;
773 }
774 var lang = style.substring(5);
775 // Decorate the left of the embedded source
776 appendDecorations(
777 basePos + tokenStart,
778 token.substring(0, embeddedSourceStart),
779 decorate, decorations);
780 // Decorate the embedded source
781 appendDecorations(
782 basePos + tokenStart + embeddedSourceStart,
783 embeddedSource,
784 langHandlerForExtension(lang, embeddedSource),
785 decorations);
786 // Decorate the right of the embedded section
787 appendDecorations(
788 basePos + tokenStart + embeddedSourceEnd,
789 token.substring(embeddedSourceEnd),
790 decorate, decorations);
791 }
792 }
793 job.decorations = decorations;
794 };
795 return decorate;
796 }
797
798 /** returns a function that produces a list of decorations from source text.
799 *
800 * This code treats ", ', and ` as string delimiters, and \ as a string
801 * escape. It does not recognize perl's qq() style strings.
802 * It has no special handling for double delimiter escapes as in basic, or
803 * the tripled delimiters used in python, but should work on those regardless
804 * although in those cases a single string literal may be broken up into
805 * multiple adjacent string literals.
806 *
807 * It recognizes C, C++, and shell style comments.
808 *
809 * @param {Object} options a set of optional parameters.
810 * @return {function (Object)} a function that examines the source code
811 * in the input job and builds the decoration list.
812 */
813 function sourceDecorator(options) {
814 var shortcutStylePatterns = [], fallthroughStylePatterns = [];
815 if (options['tripleQuotedStrings']) {
816 // '''multi-line-string''', 'single-line-string', and double-quoted
817 shortcutStylePatterns.push(
818 [PR_STRING, /^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,
819 null, '\'"']);
820 } else if (options['multiLineStrings']) {
821 // 'multi-line-string', "multi-line-string"
822 shortcutStylePatterns.push(
823 [PR_STRING, /^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,
824 null, '\'"`']);
825 } else {
826 // 'single-line-string', "single-line-string"
827 shortcutStylePatterns.push(
828 [PR_STRING,
829 /^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,
830 null, '"\'']);
831 }
832 if (options['verbatimStrings']) {
833 // verbatim-string-literal production from the C# grammar. See issue 93.
834 fallthroughStylePatterns.push(
835 [PR_STRING, /^@\"(?:[^\"]|\"\")*(?:\"|$)/, null]);
836 }
837 var hc = options['hashComments'];
838 if (hc) {
839 if (options['cStyleComments']) {
840 if (hc > 1) { // multiline hash comments
841 shortcutStylePatterns.push(
842 [PR_COMMENT, /^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/, null, '#']);
843 } else {
844 // Stop C preprocessor declarations at an unclosed open comment
845 shortcutStylePatterns.push(
846 [PR_COMMENT, /^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,
847 null, '#']);
848 }
849 // #include <stdio.h>
850 fallthroughStylePatterns.push(
851 [PR_STRING,
852 /^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h(?:h|pp|\+\+)?|[a-z]\w*)>/,
853 null]);
854 } else {
855 shortcutStylePatterns.push([PR_COMMENT, /^#[^\r\n]*/, null, '#']);
856 }
857 }
858 if (options['cStyleComments']) {
859 fallthroughStylePatterns.push([PR_COMMENT, /^\/\/[^\r\n]*/, null]);
860 fallthroughStylePatterns.push(
861 [PR_COMMENT, /^\/\*[\s\S]*?(?:\*\/|$)/, null]);
862 }
863 if (options['regexLiterals']) {
864 /**
865 * @const
866 */
867 var REGEX_LITERAL = (
868 // A regular expression literal starts with a slash that is
869 // not followed by * or / so that it is not confused with
870 // comments.
871 '/(?=[^/*])'
872 // and then contains any number of raw characters,
873 + '(?:[^/\\x5B\\x5C]'
874 // escape sequences (\x5C),
875 + '|\\x5C[\\s\\S]'
876 // or non-nesting character sets (\x5B\x5D);
877 + '|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+'
878 // finally closed by a /.
879 + '/');
880 fallthroughStylePatterns.push(
881 ['lang-regex',
882 new RegExp('^' + REGEXP_PRECEDER_PATTERN + '(' + REGEX_LITERAL + ')')
883 ]);
884 }
885
886 var types = options['types'];
887 if (types) {
888 fallthroughStylePatterns.push([PR_TYPE, types]);
889 }
890
891 if (options['strings']) {
892 var strings = ("" + options['strings']).replace(/^ | $/g, '').replace(/-/g, '\\-');
893 fallthroughStylePatterns.push(
894 [PR_STRING,
895 new RegExp('(?:' + strings.replace(/[\s,]+/g, '|') + ')'),
896 , null]
897 );
898 }
899
900 var keywords = ("" + options['keywords']).replace(/^ | $/g, '');
901 if (keywords.length) {
902 fallthroughStylePatterns.push(
903 [PR_KEYWORD,
904 new RegExp('^(?:' + keywords.replace(/[\s,]+/g, '|') + ')\\b'),
905 null]);
906 }
907
908 shortcutStylePatterns.push([PR_PLAIN, /^\s+/, null, ' \r\n\t\xA0']);
909 if (options['httpdComments']) {
910 fallthroughStylePatterns.push(
911 [PR_PLAIN, /^.*\S.*#/i, null]
912 );
913 }
914
915 fallthroughStylePatterns.push(
916 // TODO(mikesamuel): recognize non-latin letters and numerals in idents
917 [PR_LITERAL, /^@[a-z_$][a-z_$@0-9]*|\bNULL\b/i, null],
918 [PR_LITERAL, CONFIG_OPTIONS, null],
919 //[PR_STRING, CONFIG_ENVS, null],
920 [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],
921 [PR_TYPE, /^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_(t|req|module)\b)/, null],
922 [PR_TAG, /^apr_[a-z_0-9]+|ap_[a-z_0-9]+/i, null],
923 [PR_PLAIN, /^[a-z_$][a-z_$@0-9\-]*/i, null],
924 [PR_LITERAL,
925 new RegExp(
926 '^(?:'
927 // A hex number
928 + '0x[a-f0-9]+'
929 // An IPv6 Address
930 + '|[a-f0-9:]+:[a-f0-9:]+:[a-f0-9:]+:[a-f0-9:]+:[a-f0-9:]+:[a-f0-9:]+'
931 // or an octal or decimal number,
932 + '|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)'
933 // possibly in scientific notation
934 + '(?:e[+\\-]?\\d+)?'
935 + ')'
936 // with an optional modifier like UL for unsigned long
937 + '[a-z]*', 'i'),
938 null, '0123456789'],
939 // Don't treat escaped quotes in bash as starting strings. See issue 144.
940 [PR_PLAIN, /^\\[\s\S]?/, null],
941 [PR_PUNCTUATION, /^.[^\s\w\.$@\'\"\`\/\#\\]*/, null]);
942
943 return createSimpleLexer(shortcutStylePatterns, fallthroughStylePatterns);
944 }
945
946 var decorateSource = sourceDecorator({
947 'keywords': ALL_KEYWORDS,
948 'hashComments': true,
949 'cStyleComments': true,
950 'multiLineStrings': true,
951 'regexLiterals': true
952 });
953
954 /**
955 * Given a DOM subtree, wraps it in a list, and puts each line into its own
956 * list item.
957 *
958 * @param {Node} node modified in place. Its content is pulled into an
959 * HTMLOListElement, and each line is moved into a separate list item.
960 * This requires cloning elements, so the input might not have unique
961 * IDs after numbering.
962 * @param {boolean} isPreformatted true iff white-space in text nodes should
963 * be treated as significant.
964 */
965 function numberLines(node, opt_startLineNum, isPreformatted) {
966 var nocode = /(?:^|\s)nocode(?:\s|$)/;
967 var lineBreak = /\r\n?|\n/;
968
969 var document = node.ownerDocument;
970
971 var li = document.createElement('li');
972 while (node.firstChild) {
973 li.appendChild(node.firstChild);
974 }
975 // An array of lines. We split below, so this is initialized to one
976 // un-split line.
977 var listItems = [li];
978
979 function walk(node) {
980 switch (node.nodeType) {
981 case 1: // Element
982 if (nocode.test(node.className)) { break; }
983 if ('br' === node.nodeName) {
984 breakAfter(node);
985 // Discard the <BR> since it is now flush against a </LI>.
986 if (node.parentNode) {
987 node.parentNode.removeChild(node);
988 }
989 } else {
990 for (var child = node.firstChild; child; child = child.nextSibling) {
991 walk(child);
992 }
993 }
994 break;
995 case 3: case 4: // Text
996 if (isPreformatted) {
997 var text = node.nodeValue;
998 var match = text.match(lineBreak);
999 if (match) {
1000 var firstLine = text.substring(0, match.index);
1001 node.nodeValue = firstLine;
1002 var tail = text.substring(match.index + match[0].length);
1003 if (tail) {
1004 var parent = node.parentNode;
1005 parent.insertBefore(
1006 document.createTextNode(tail), node.nextSibling);
1007 }
1008 breakAfter(node);
1009 if (!firstLine) {
1010 // Don't leave blank text nodes in the DOM.
1011 node.parentNode.removeChild(node);
1012 }
1013 }
1014 }
1015 break;
1016 }
1017 }
1018
1019 // Split a line after the given node.
1020 function breakAfter(lineEndNode) {
1021 // If there's nothing to the right, then we can skip ending the line
1022 // here, and move root-wards since splitting just before an end-tag
1023 // would require us to create a bunch of empty copies.
1024 while (!lineEndNode.nextSibling) {
1025 lineEndNode = lineEndNode.parentNode;
1026 if (!lineEndNode) { return; }
1027 }
1028
1029 function breakLeftOf(limit, copy) {
1030 // Clone shallowly if this node needs to be on both sides of the break.
1031 var rightSide = copy ? limit.cloneNode(false) : limit;
1032 var parent = limit.parentNode;
1033 if (parent) {
1034 // We clone the parent chain.
1035 // This helps us resurrect important styling elements that cross lines.
1036 // E.g. in <i>Foo<br>Bar</i>
1037 // should be rewritten to <li><i>Foo</i></li><li><i>Bar</i></li>.
1038 var parentClone = breakLeftOf(parent, 1);
1039 // Move the clone and everything to the right of the original
1040 // onto the cloned parent.
1041 var next = limit.nextSibling;
1042 parentClone.appendChild(rightSide);
1043 for (var sibling = next; sibling; sibling = next) {
1044 next = sibling.nextSibling;
1045 parentClone.appendChild(sibling);
1046 }
1047 }
1048 return rightSide;
1049 }
1050
1051 var copiedListItem = breakLeftOf(lineEndNode.nextSibling, 0);
1052
1053 // Walk the parent chain until we reach an unattached LI.
1054 for (var parent;
1055 // Check nodeType since IE invents document fragments.
1056 (parent = copiedListItem.parentNode) && parent.nodeType === 1;) {
1057 copiedListItem = parent;
1058 }
1059 // Put it on the list of lines for later processing.
1060 listItems.push(copiedListItem);
1061 }
1062
1063 // Split lines while there are lines left to split.
1064 for (var i = 0; // Number of lines that have been split so far.
1065 i < listItems.length; // length updated by breakAfter calls.
1066 ++i) {
1067 walk(listItems[i]);
1068 }
1069
1070 // Make sure numeric indices show correctly.
1071 if (opt_startLineNum === (opt_startLineNum|0)) {
1072 listItems[0].setAttribute('value', opt_startLineNum);
1073 }
1074
1075 var ol = document.createElement('ol');
1076 ol.className = 'linenums';
1077 var offset = Math.max(0, ((opt_startLineNum - 1 /* zero index */)) | 0) || 0;
1078 for (var i = 0, n = listItems.length; i < n; ++i) {
1079 li = listItems[i];
1080 // Stick a class on the LIs so that stylesheets can
1081 // color odd/even rows, or any other row pattern that
1082 // is co-prime with 10.
1083 li.className = 'L' + ((i + offset) % 1);
1084 if (!li.firstChild) {
1085 li.appendChild(document.createTextNode('\xA0'));
1086 }
1087 ol.appendChild(li);
1088 }
1089
1090 node.appendChild(ol);
1091 }
1092
1093 /**
1094 * Breaks {@code job.sourceCode} around style boundaries in
1095 * {@code job.decorations} and modifies {@code job.sourceNode} in place.
1096 * @param {Object} job like <pre>{
1097 * sourceCode: {string} source as plain text,
1098 * spans: {Array.<number|Node>} alternating span start indices into source
1099 * and the text node or element (e.g. {@code <BR>}) corresponding to that
1100 * span.
1101 * decorations: {Array.<number|string} an array of style classes preceded
1102 * by the position at which they start in job.sourceCode in order
1103 * }</pre>
1104 * @private
1105 */
1106 function recombineTagsAndDecorations(job) {
1107 var isIE8OrEarlier = /\bMSIE\s(\d+)/.exec(navigator.userAgent);
1108 isIE8OrEarlier = isIE8OrEarlier && +isIE8OrEarlier[1] <= 8;
1109 var newlineRe = /\n/g;
1110
1111 var source = job.sourceCode;
1112 var sourceLength = source.length;
1113 // Index into source after the last code-unit recombined.
1114 var sourceIndex = 0;
1115
1116 var spans = job.spans;
1117 var nSpans = spans.length;
1118 // Index into spans after the last span which ends at or before sourceIndex.
1119 var spanIndex = 0;
1120
1121 var decorations = job.decorations;
1122 var nDecorations = decorations.length;
1123 // Index into decorations after the last decoration which ends at or before
1124 // sourceIndex.
1125 var decorationIndex = 0;
1126
1127 // Remove all zero-length decorations.
1128 decorations[nDecorations] = sourceLength;
1129 var decPos, i;
1130 for (i = decPos = 0; i < nDecorations;) {
1131 if (decorations[i] !== decorations[i + 2]) {
1132 decorations[decPos++] = decorations[i++];
1133 decorations[decPos++] = decorations[i++];
1134 } else {
1135 i += 2;
1136 }
1137 }
1138 nDecorations = decPos;
1139
1140 // Simplify decorations.
1141 for (i = decPos = 0; i < nDecorations;) {
1142 var startPos = decorations[i];
1143 // Conflate all adjacent decorations that use the same style.
1144 var startDec = decorations[i + 1];
1145 var end = i + 2;
1146 while (end + 2 <= nDecorations && decorations[end + 1] === startDec) {
1147 end += 2;
1148 }
1149 decorations[decPos++] = startPos;
1150 decorations[decPos++] = startDec;
1151 i = end;
1152 }
1153
1154 nDecorations = decorations.length = decPos;
1155
1156 var sourceNode = job.sourceNode;
1157 var oldDisplay;
1158 if (sourceNode) {
1159 oldDisplay = sourceNode.style.display;
1160 sourceNode.style.display = 'none';
1161 }
1162 try {
1163 var decoration = null;
1164 var X = 0;
1165 while (spanIndex < nSpans) {
1166 X = X + 1;
1167 if (X > 5000) { break; }
1168 var spanStart = spans[spanIndex];
1169 var spanEnd = spans[spanIndex + 2] || sourceLength;
1170
1171 var decEnd = decorations[decorationIndex + 2] || sourceLength;
1172
1173 var end = Math.min(spanEnd, decEnd);
1174
1175 var textNode = spans[spanIndex + 1];
1176 var styledText;
1177 if (textNode.nodeType !== 1 // Don't muck with <BR>s or <LI>s
1178 // Don't introduce spans around empty text nodes.
1179 && (styledText = source.substring(sourceIndex, end))) {
1180 // This may seem bizarre, and it is. Emitting LF on IE causes the
1181 // code to display with spaces instead of line breaks.
1182 // Emitting Windows standard issue linebreaks (CRLF) causes a blank
1183 // space to appear at the beginning of every line but the first.
1184 // Emitting an old Mac OS 9 line separator makes everything spiffy.
1185 if (isIE8OrEarlier) {
1186 styledText = styledText.replace(newlineRe, '\r');
1187 }
1188 textNode.nodeValue = styledText;
1189 var document = textNode.ownerDocument;
1190 var span = document.createElement('span');
1191 span.className = decorations[decorationIndex + 1];
1192 var parentNode = textNode.parentNode;
1193 parentNode.replaceChild(span, textNode);
1194 span.appendChild(textNode);
1195 if (sourceIndex < spanEnd) { // Split off a text node.
1196 spans[spanIndex + 1] = textNode
1197 // TODO: Possibly optimize by using '' if there's no flicker.
1198 = document.createTextNode(source.substring(end, spanEnd));
1199 parentNode.insertBefore(textNode, span.nextSibling);
1200 }
1201 }
1202
1203 sourceIndex = end;
1204
1205 if (sourceIndex >= spanEnd) {
1206 spanIndex += 2;
1207 }
1208 if (sourceIndex >= decEnd) {
1209 decorationIndex += 2;
1210 }
1211 }
1212 } finally {
1213 if (sourceNode) {
1214 sourceNode.style.display = oldDisplay;
1215 }
1216 }
1217 }
1218
1219
1220 /** Maps language-specific file extensions to handlers. */
1221 var langHandlerRegistry = {};
1222 /** Register a language handler for the given file extensions.
1223 * @param {function (Object)} handler a function from source code to a list
1224 * of decorations. Takes a single argument job which describes the
1225 * state of the computation. The single parameter has the form
1226 * {@code {
1227 * sourceCode: {string} as plain text.
1228 * decorations: {Array.<number|string>} an array of style classes
1229 * preceded by the position at which they start in
1230 * job.sourceCode in order.
1231 * The language handler should assigned this field.
1232 * basePos: {int} the position of source in the larger source chunk.
1233 * All positions in the output decorations array are relative
1234 * to the larger source chunk.
1235 * } }
1236 * @param {Array.<string>} fileExtensions
1237 */
1238 function registerLangHandler(handler, fileExtensions) {
1239 for (var i = fileExtensions.length; --i >= 0;) {
1240 var ext = fileExtensions[i];
1241 if (!langHandlerRegistry.hasOwnProperty(ext)) {
1242 langHandlerRegistry[ext] = handler;
1243 } else if (win['console']) {
1244 console['warn']('cannot override language handler %s', ext);
1245 }
1246 }
1247 }
1248 function langHandlerForExtension(extension, source) {
1249 if (!(extension && langHandlerRegistry.hasOwnProperty(extension))) {
1250 // Treat it as markup if the first non whitespace character is a < and
1251 // the last non-whitespace character is a >.
1252 extension = /^\s*</.test(source)
1253 ? 'default-markup'
1254 : 'default-code';
1255 }
1256 return langHandlerRegistry[extension];
1257 }
1258 registerLangHandler(decorateSource, ['default-code']);
1259 registerLangHandler(
1260 createSimpleLexer(
1261 [],
1262 [
1263 [PR_PLAIN, /^[^<?]+/],
1264 [PR_DECLARATION, /^<!\w[^>]*(?:>|$)/],
1265 [PR_COMMENT, /^<\!--[\s\S]*?(?:-\->|$)/],
1266 // Unescaped content in an unknown language
1267 ['lang-', /^<\?([\s\S]+?)(?:\?>|$)/],
1268 ['lang-', /^<%([\s\S]+?)(?:%>|$)/],
1269 [PR_PUNCTUATION, /^(?:<[%?]|[%?]>)/],
1270 ['lang-', /^<xmp\b[^>]*>([\s\S]+?)<\/xmp\b[^>]*>/i],
1271 // Unescaped content in javascript. (Or possibly vbscript).
1272 ['lang-js', /^<script\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],
1273 // Contains unescaped stylesheet content
1274 ['lang-css', /^<style\b[^>]*>([\s\S]*?)(<\/style\b[^>]*>)/i],
1275 ['lang-in.tag', /^(<\/?[a-z][^<>]*>)/i]
1276 ]),
1277 ['default-markup', 'htm', 'html', 'mxml', 'xhtml', 'xml', 'xsl']);
1278 registerLangHandler(
1279 createSimpleLexer(
1280 [
1281 [PR_PLAIN, /^[\s]+/, null, ' \t\r\n'],
1282 [PR_ATTRIB_VALUE, /^(?:\"[^\"]*\"?|\'[^\']*\'?)/, null, '\"\'']
1283 ],
1284 [
1285 [PR_TAG, /^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],
1286 [PR_ATTRIB_NAME, /^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],
1287 ['lang-uq.val', /^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],
1288 [PR_PUNCTUATION, /^[=<>\/]+/],
1289 ['lang-js', /^on\w+\s*=\s*\"([^\"]+)\"/i],
1290 ['lang-js', /^on\w+\s*=\s*\'([^\']+)\'/i],
1291 ['lang-js', /^on\w+\s*=\s*([^\"\'>\s]+)/i],
1292 ['lang-css', /^style\s*=\s*\"([^\"]+)\"/i],
1293 ['lang-css', /^style\s*=\s*\'([^\']+)\'/i],
1294 ['lang-css', /^style\s*=\s*([^\"\'>\s]+)/i]
1295 ]),
1296 ['in.tag']);
1297 registerLangHandler(
1298 createSimpleLexer([], [[PR_ATTRIB_VALUE, /^[\s\S]+/]]), ['uq.val']);
1299 registerLangHandler(sourceDecorator({
1300 'keywords': CPP_KEYWORDS,
1301 'hashComments': true,
1302 'cStyleComments': true,
1303 'types': C_TYPES
1304 }), ['c', 'cc', 'cpp', 'cxx', 'cyc', 'm']);
1305 registerLangHandler(sourceDecorator({
1306 'keywords': PHP_KEYWORDS,
1307 'hashComments': false,
1308 'cStyleComments': true,
1309 'multiLineStrings': true,
1310 'regexLiterals': true
1311// 'types': C_TYPES,
1312 }), ['php', 'phtml', 'inc']);
1313 registerLangHandler(sourceDecorator({
1314 'keywords': 'null,true,false'
1315 }), ['json']);
1316 registerLangHandler(sourceDecorator({
1317 'keywords': CSHARP_KEYWORDS,
1318 'hashComments': true,
1319 'cStyleComments': true,
1320 'verbatimStrings': true,
1321 'types': C_TYPES
1322 }), ['cs']);
1323 registerLangHandler(sourceDecorator({
1324 'keywords': JAVA_KEYWORDS,
1325 'cStyleComments': true
1326 }), ['java']);
1327 registerLangHandler(sourceDecorator({
1328 'keywords': SH_KEYWORDS,
1329 'hashComments': true,
1330 'multiLineStrings': true
1331 }), ['bsh', 'csh', 'sh']);
1332 registerLangHandler(sourceDecorator({
1333 'keywords': PYTHON_KEYWORDS,
1334 'hashComments': true,
1335 'multiLineStrings': true,
1336 'tripleQuotedStrings': true
1337 }), ['cv', 'py']);
1338 registerLangHandler(sourceDecorator({
1339 'keywords': PERL_KEYWORDS,
1340 'hashComments': true,
1341 'multiLineStrings': true,
1342 'regexLiterals': true
1343 }), ['perl', 'pl', 'pm']);
1344 registerLangHandler(sourceDecorator({
1345 'keywords': RUBY_KEYWORDS,
1346 'hashComments': true,
1347 'multiLineStrings': true,
1348 'regexLiterals': true
1349 }), ['rb']);
1350 registerLangHandler(sourceDecorator({
1351 'keywords': JSCRIPT_KEYWORDS,
1352 'cStyleComments': true,
1353 'regexLiterals': true
1354 }), ['js']);
1355 registerLangHandler(sourceDecorator({
1356 'keywords': COFFEE_KEYWORDS,
1357 'hashComments': 3, // ### style block comments
1358 'cStyleComments': true,
1359 'multilineStrings': true,
1360 'tripleQuotedStrings': true,
1361 'regexLiterals': true
1362 }), ['coffee']);
1363 registerLangHandler(
1364 createSimpleLexer([], [[PR_STRING, /^[\s\S]+/]]), ['regex']);
1365 registerLangHandler(sourceDecorator({
1366 'keywords': CONFIG_KEYWORDS,
1367 'literals': CONFIG_OPTIONS,
1368 'strings': CONFIG_ENVS,
1369 'hashComments': true,
1370 'cStyleComments': false,
1371 'multiLineStrings': false,
1372 'regexLiterals': false,
1373 'httpdComments': true
1374 }), ['config']);
1375
1376 function applyDecorator(job) {
1377 var opt_langExtension = job.langExtension;
1378
1379 try {
1380 // Extract tags, and convert the source code to plain text.
1381 var sourceAndSpans = extractSourceSpans(job.sourceNode, job.pre);
1382 /** Plain text. @type {string} */
1383 var source = sourceAndSpans.sourceCode;
1384 job.sourceCode = source;
1385 job.spans = sourceAndSpans.spans;
1386 job.basePos = 0;
1387
1388 // Apply the appropriate language handler
1389 langHandlerForExtension(opt_langExtension, source)(job);
1390
1391 // Integrate the decorations and tags back into the source code,
1392 // modifying the sourceNode in place.
1393 recombineTagsAndDecorations(job);
1394 } catch (e) {
1395 if (win['console']) {
1396 console['log'](e && e['stack'] ? e['stack'] : e);
1397 }
1398 }
1399 }
1400
1401 /**
1402 * @param sourceCodeHtml {string} The HTML to pretty print.
1403 * @param opt_langExtension {string} The language name to use.
1404 * Typically, a filename extension like 'cpp' or 'java'.
1405 * @param opt_numberLines {number|boolean} True to number lines,
1406 * or the 1-indexed number of the first line in sourceCodeHtml.
1407 */
1408 function prettyPrintOne(sourceCodeHtml, opt_langExtension, opt_numberLines) {
1409 var container = document.createElement('pre');
1410 // This could cause images to load and onload listeners to fire.
1411 // E.g. <img onerror="alert(1337)" src="nosuchimage.png">.
1412 // We assume that the inner HTML is from a trusted source.
1413 container.innerHTML = sourceCodeHtml;
1414 if (opt_numberLines) {
1415 numberLines(container, opt_numberLines, true);
1416 }
1417
1418 var job = {
1419 langExtension: opt_langExtension,
1420 numberLines: opt_numberLines,
1421 sourceNode: container,
1422 pre: 1
1423 };
1424 applyDecorator(job);
1425 return container.innerHTML;
1426 }
1427
1428 function prettyPrint(opt_whenDone) {
1429 function byTagName(tn) { return document.getElementsByTagName(tn); }
1430 // fetch a list of nodes to rewrite
1431 var codeSegments = [byTagName('pre'), byTagName('code'), byTagName('xmp')];
1432 var elements = [];
1433 for (var i = 0; i < codeSegments.length; ++i) {
1434 for (var j = 0, n = codeSegments[i].length; j < n; ++j) {
1435 elements.push(codeSegments[i][j]);
1436 }
1437 }
1438 codeSegments = null;
1439
1440 var clock = Date;
1441 if (!clock['now']) {
1442 clock = { 'now': function () { return +(new Date); } };
1443 }
1444
1445 // The loop is broken into a series of continuations to make sure that we
1446 // don't make the browser unresponsive when rewriting a large page.
1447 var k = 0;
1448 var prettyPrintingJob;
1449
1450 var langExtensionRe = /\blang(?:uage)?-([\w.]+)(?!\S)/;
1451 var prettyPrintRe = /\bprettyprint\b/;
1452 var prettyPrintedRe = /\bprettyprinted\b/;
1453 var preformattedTagNameRe = /pre|xmp/i;
1454 var codeRe = /^code$/i;
1455 var preCodeXmpRe = /^(?:pre|code|xmp)$/i;
1456
1457 function doWork() {
1458 var endTime = (win['PR_SHOULD_USE_CONTINUATION'] ?
1459 clock['now']() + 250 /* ms */ :
1460 Infinity);
1461 for (; k < elements.length && clock['now']() < endTime; k++) {
1462 var cs = elements[k];
1463 var className = cs.className;
1464 if (prettyPrintRe.test(className)
1465 // Don't redo this if we've already done it.
1466 // This allows recalling pretty print to just prettyprint elements
1467 // that have been added to the page since last call.
1468 && !prettyPrintedRe.test(className)) {
1469
1470 // make sure this is not nested in an already prettified element
1471 var nested = false;
1472 for (var p = cs.parentNode; p; p = p.parentNode) {
1473 var tn = p.tagName;
1474 if (preCodeXmpRe.test(tn)
1475 && p.className && prettyPrintRe.test(p.className)) {
1476 nested = true;
1477 break;
1478 }
1479 }
1480 if (!nested) {
1481 // Mark done. If we fail to prettyprint for whatever reason,
1482 // we shouldn't try again.
1483 cs.className += ' prettyprinted';
1484
1485 // If the classes includes a language extensions, use it.
1486 // Language extensions can be specified like
1487 // <pre class="prettyprint lang-cpp">
1488 // the language extension "cpp" is used to find a language handler
1489 // as passed to PR.registerLangHandler.
1490 // HTML5 recommends that a language be specified using "language-"
1491 // as the prefix instead. Google Code Prettify supports both.
1492 // http://dev.w3.org/html5/spec-author-view/the-code-element.html
1493 var langExtension = className.match(langExtensionRe);
1494 // Support <pre class="prettyprint"><code class="language-c">
1495 var wrapper;
1496 if (!langExtension && (wrapper = childContentWrapper(cs))
1497 && codeRe.test(wrapper.tagName)) {
1498 langExtension = wrapper.className.match(langExtensionRe);
1499 }
1500
1501 if (langExtension) { langExtension = langExtension[1]; }
1502
1503 var preformatted;
1504 if (preformattedTagNameRe.test(cs.tagName)) {
1505 preformatted = 1;
1506 } else {
1507 var currentStyle = cs['currentStyle'];
1508 var whitespace = (
1509 currentStyle
1510 ? currentStyle['whiteSpace']
1511 : (document.defaultView
1512 && document.defaultView.getComputedStyle)
1513 ? document.defaultView.getComputedStyle(cs, null)
1514 .getPropertyValue('white-space')
1515 : 0);
1516 preformatted = whitespace
1517 && 'pre' === whitespace.substring(0, 3);
1518 }
1519
1520 // Look for a class like linenums or linenums:<n> where <n> is the
1521 // 1-indexed number of the first line.
1522 var lineNums = cs.className.match(/\blinenums\b(?::(\d+))?/);
1523 lineNums = lineNums
1524 ? lineNums[1] && lineNums[1].length ? +lineNums[1] : true
1525 : false;
1526 if (lineNums) { numberLines(cs, lineNums, preformatted); }
1527
1528 // do the pretty printing
1529 prettyPrintingJob = {
1530 langExtension: langExtension,
1531 sourceNode: cs,
1532 numberLines: lineNums,
1533 pre: preformatted
1534 };
1535 applyDecorator(prettyPrintingJob);
1536 }
1537 }
1538 }
1539 if (k < elements.length) {
1540 // finish up in a continuation
1541 setTimeout(doWork, 250);
1542 } else if (opt_whenDone) {
1543 opt_whenDone();
1544 }
1545 }
1546
1547 doWork();
1548 }
1549
1550 /**
1551 * Contains functions for creating and registering new language handlers.
1552 * @type {Object}
1553 */
1554 var PR = win['PR'] = {
1555 'createSimpleLexer': createSimpleLexer,
1556 'registerLangHandler': registerLangHandler,
1557 'sourceDecorator': sourceDecorator,
1558 'PR_ATTRIB_NAME': PR_ATTRIB_NAME,
1559 'PR_ATTRIB_VALUE': PR_ATTRIB_VALUE,
1560 'PR_COMMENT': PR_COMMENT,
1561 'PR_DECLARATION': PR_DECLARATION,
1562 'PR_KEYWORD': PR_KEYWORD,
1563 'PR_LITERAL': PR_LITERAL,
1564 'PR_NOCODE': PR_NOCODE,
1565 'PR_PLAIN': PR_PLAIN,
1566 'PR_PUNCTUATION': PR_PUNCTUATION,
1567 'PR_SOURCE': PR_SOURCE,
1568 'PR_STRING': PR_STRING,
1569 'PR_TAG': PR_TAG,
1570 'PR_TYPE': PR_TYPE,
1571 'prettyPrintOne': win['prettyPrintOne'] = prettyPrintOne,
1572 'prettyPrint': win['prettyPrint'] = prettyPrint
1573 };
1574
1575
1576/* Register Lua syntaxes */
1577 PR['registerLangHandler'](
1578 PR['createSimpleLexer'](
1579 [
1580 // Whitespace
1581 [PR['PR_PLAIN'], /^[\t\n\r \xA0]+/, null, '\t\n\r \xA0'],
1582 // A double or single quoted, possibly multi-line, string.
1583 [PR['PR_STRING'], /^(?:\"(?:[^\"\\]|\\[\s\S])*(?:\"|$)|\'(?:[^\'\\]|\\[\s\S])*(?:\'|$))/, null, '"\'']
1584 ],
1585 [
1586 // A comment is either a line comment that starts with two dashes, or
1587 // two dashes preceding a long bracketed block.
1588 [PR['PR_COMMENT'], /^--(?:\[(=*)\[[\s\S]*?(?:\]\1\]|$)|[^\r\n]*)/],
1589 [PR['PR_TYPE'], /^nil|false|true/],
1590 // A long bracketed block not preceded by -- is a string.
1591 [PR['PR_STRING'], /^\[(=*)\[[\s\S]*?(?:\]\1\]|$)/],
1592 [PR['PR_KEYWORD'], /^(?:and|break|do|else|elseif|end|for|function|if|in|local|not|or|repeat|require|return|then|until|while)\b/, null],
1593 // A number is a hex integer literal, a decimal real literal, or in
1594 // scientific notation.
1595 [PR['PR_LITERAL'],
1596 /^[+-]?(?:0x[\da-f]+|(?:(?:\.\d+|\d+(?:\.\d*)?)(?:e[+\-]?\d+)?))/i],
1597 // An identifier
1598 [PR['PR_PLAIN'], /^[a-z_]\w*/i],
1599 // A run of punctuation
1600 [PR['PR_PUNCTUATION'], /^[^\w\t\n\r \xA0][^\w\t\n\r \xA0\"\'\-\+=]*/]
1601 ]),
1602 ['lua']);
1603
1604
1605 // Make PR available via the Asynchronous Module Definition (AMD) API.
1606 // Per https://github.com/amdjs/amdjs-api/wiki/AMD:
1607 // The Asynchronous Module Definition (AMD) API specifies a
1608 // mechanism for defining modules such that the module and its
1609 // dependencies can be asynchronously loaded.
1610 // ...
1611 // To allow a clear indicator that a global define function (as
1612 // needed for script src browser loading) conforms to the AMD API,
1613 // any global define function SHOULD have a property called "amd"
1614 // whose value is an object. This helps avoid conflict with any
1615 // other existing JavaScript code that could have defined a define()
1616 // function that does not conform to the AMD API.
1617 if (typeof define === "function" && define['amd']) {
1618 define("google-code-prettify", [], function () {
1619 return PR;
1620 });
1621 }
1622})();
diff --git a/docs/manual/style/scripts/prettify.min.js b/docs/manual/style/scripts/prettify.min.js
0new file mode 1006441623new file mode 100644
index 0000000..adb92be
--- /dev/null
+++ b/docs/manual/style/scripts/prettify.min.js
@@ -0,0 +1,123 @@
1// see prettify.js for copyright, license and expanded version
2window['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=["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,AuthnCacheContext,AuthnCacheEnable,AuthnCacheProvideFor,AuthnCacheSOCache,AuthnCacheTimeout,<AuthnProviderAlias>,AuthnzFcgiCheckAuthnProvider,AuthnzFcgiDefineProvider,AuthType,AuthUserFile,AuthzDBDLoginToReferer,AuthzDBDQuery,AuthzDBDRedirectQuery,AuthzDBMType,<AuthzProviderAlias>,AuthzSendForbiddenOnFailure,BalancerGrowth,BalancerInherit,BalancerMember,BalancerPersist,BrotliAlterETag,BrotliCompressionMaxInputBlock,BrotliCompressionQuality,BrotliCompressionWindow,BrotliFilterNote,BrowserMatch,BrowserMatchNoCase,BufferedLogs,BufferSize,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,CGIDScriptTimeout,CGIMapExtension,CGIPassAuth,CGIVar,CharsetDefault,CharsetOptions,CharsetSourceEnc,CheckCaseOnly,CheckSpelling,ChrootDir,ContentDigest,CookieDomain,CookieExpires,CookieName,CookieStyle,CookieTracking,CoreDumpDirectory,CustomLog,Dav,DavDepthInfinity,DavGenericLockDB,DavLockDB,DavMinTimeout,DBDExptime,DBDInitSQL,DBDKeep,DBDMax,DBDMin,DBDParams,DBDPersist,DBDPrepareSQL,DBDriver,DefaultIcon,DefaultLanguage,DefaultRuntimeDir,DefaultType,Define,DeflateBufferSize,DeflateCompressionLevel,DeflateFilterNote,DeflateInflateLimitRequestBody,DeflateInflateRatioBurst,DeflateInflateRatioLimit,DeflateMemLevel,DeflateWindowSize,Deny,<Directory>,DirectoryCheckHandler,DirectoryIndex,DirectoryIndexRedirect,<DirectoryMatch>,DirectorySlash,DocumentRoot,DTracePrivileges,DumpIOInput,DumpIOOutput,<Else>,<ElseIf>,EnableExceptionHook,EnableMMAP,EnableSendfile,Error,ErrorDocument,ErrorLog,ErrorLogFormat,Example,ExpiresActive,ExpiresByType,ExpiresDefault,ExtendedStatus,ExtFilterDefine,ExtFilterOptions,FallbackResource,FileETag,<Files>,<FilesMatch>,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,IdentityCheck,IdentityCheckTimeout,<If>,<IfDefine>,<IfModule>,<IfVersion>,ImapBase,ImapDefault,ImapMenu,Include,IncludeOptional,IndexHeadInsert,IndexIgnore,IndexIgnoreReset,IndexOptions,IndexOrderDefault,IndexStyleSheet,InputSed,ISAPIAppendLogToErrors,ISAPIAppendLogToQuery,ISAPICacheFile,ISAPIFakeAsync,ISAPILogNotSupported,ISAPIReadAheadBuffer,KeepAlive,KeepAliveTimeout,KeptBodySize,LanguagePriority,LDAPCacheEntries,LDAPCacheTTL,LDAPConnectionPoolTTL,LDAPConnectionTimeout,LDAPLibraryDebug,LDAPOpCacheEntries,LDAPOpCacheTTL,LDAPReferralHopLimit,LDAPReferrals,LDAPRetries,LDAPRetryDelay,LDAPSharedCacheFile,LDAPSharedCacheSize,LDAPTimeout,LDAPTrustedClientCert,LDAPTrustedGlobalCert,LDAPTrustedMode,LDAPVerifyServerCert,<Limit>,<LimitExcept>,LimitInternalRecursion,LimitRequestBody,LimitRequestFields,LimitRequestFieldSize,LimitRequestLine,LimitXMLRequestBody,Listen,ListenBackLog,ListenCoresBucketsRatio,LoadFile,LoadModule,<Location>,<LocationMatch>,LogFormat,LogIOTrackTTFB,LogLevel,LogMessage,LuaAuthzProvider,LuaCodeCache,LuaHookAccessChecker,LuaHookAuthChecker,LuaHookCheckUserID,LuaHookFixups,LuaHookInsertFilter,LuaHookLog,LuaHookMapToStorage,LuaHookTranslateName,LuaHookTypeChecker,LuaInherit,LuaInputFilter,LuaMapHandler,LuaOutputFilter,LuaPackageCPath,LuaPackagePath,LuaQuickHandler,LuaRoot,LuaScope,<Macro>,MaxConnectionsPerChild,MaxKeepAliveRequests,MaxMemFree,MaxRangeOverlaps,MaxRangeReversals,MaxRanges,MaxRequestWorkers,MaxSpareServers,MaxSpareThreads,MaxThreads,MemcacheConnTTL,MergeTrailers,MetaDir,MetaFiles,MetaSuffix,MimeMagicFile,MinSpareServers,MinSpareThreads,MMapFile,ModemStandard,ModMimeUsePathInfo,MultiviewsMatch,Mutex,NameVirtualHost,NoProxy,NWSSLTrustedCerts,NWSSLUpgradeable,Options,Order,OutputSed,PassEnv,PidFile,PrivilegesMode,Protocol,ProtocolEcho,Protocols,ProtocolsHonorOrder,<Proxy>,ProxyAddHeaders,ProxyBadHeader,ProxyBlock,ProxyDomain,ProxyErrorOverride,ProxyExpressDBMFile,ProxyExpressDBMType,ProxyExpressEnable,ProxyFCGIBackendType,ProxyFCGISetEnvIf,ProxyFtpDirCharset,ProxyFtpEscapeWildcards,ProxyFtpListOnWildcard,ProxyHCExpr,ProxyHCTemplate,ProxyHCTPsize,ProxyHTMLBufSize,ProxyHTMLCharsetOut,ProxyHTMLDocType,ProxyHTMLEnable,ProxyHTMLEvents,ProxyHTMLExtended,ProxyHTMLFixups,ProxyHTMLInterp,ProxyHTMLLinks,ProxyHTMLMeta,ProxyHTMLStripComments,ProxyHTMLURLMap,ProxyIOBufferSize,<ProxyMatch>,ProxyMaxForwards,ProxyPass,ProxyPassInherit,ProxyPassInterpolateEnv,ProxyPassMatch,ProxyPassReverse,ProxyPassReverseCookieDomain,ProxyPassReverseCookiePath,ProxyPreserveHost,ProxyReceiveBufferSize,ProxyRemote,ProxyRemoteMatch,ProxyRequests,ProxySCGIInternalRedirect,ProxySCGISendfile,ProxySet,ProxySourceAddress,ProxyStatus,ProxyTimeout,ProxyVia,QualifyRedirectURL,ReadmeName,ReceiveBufferSize,Redirect,RedirectMatch,RedirectPermanent,RedirectTemp,ReflectorHeader,RegisterHttpMethod,RemoteIPHeader,RemoteIPInternalProxy,RemoteIPInternalProxyList,RemoteIPProxiesHeader,RemoteIPTrustedProxy,RemoteIPTrustedProxyList,RemoveCharset,RemoveEncoding,RemoveHandler,RemoveInputFilter,RemoveLanguage,RemoveOutputFilter,RemoveType,RequestHeader,RequestReadTimeout,Require,<RequireAll>,<RequireAny>,<RequireNone>,RewriteBase,RewriteCond,RewriteEngine,RewriteMap,RewriteOptions,RewriteRule,RLimitCPU,RLimitMEM,RLimitNPROC,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,SSIEndTag,SSIErrorMsg,SSIETag,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,SSLSessionCache,SSLSessionCacheTimeout,SSLSessionTicketKeyFile,SSLSessionTickets,SSLSRPUnknownUserSeed,SSLSRPVerifierFile,SSLStaplingCache,SSLStaplingErrorCacheTimeout,SSLStaplingFakeTryLater,SSLStaplingForceURL,SSLStaplingResponderTimeout,SSLStaplingResponseMaxAge,SSLStaplingResponseTimeSkew,SSLStaplingReturnResponderErrors,SSLStaplingStandardCacheTimeout,SSLStrictSNIVHostCheck,SSLUserName,SSLUseStapling,SSLVerifyClient,SSLVerifyDepth,StartServers,StartThreads,Substitute,SubstituteInheritBefore,SubstituteMaxLineLength,Suexec,SuexecUserGroup,ThreadLimit,ThreadsPerChild,ThreadStackSize,TimeOut,TraceEnable,TransferLog,TypesConfig,UnDefine,UndefMacro,UnsetEnv,Use,UseCanonicalName,UseCanonicalPhysicalPort,User,UserDir,VHostCGIMode,VHostCGIPrivs,VHostGroup,VHostPrivs,VHostSecure,VHostUser,VirtualDocumentRoot,VirtualDocumentRootIP,<VirtualHost>,VirtualScriptAlias,VirtualScriptAliasIP,WatchdogInterval,XBitHack,xml2EncAlias,xml2EncDefault,xml2StartParse"];var CONFIG_OPTIONS=/^[\\+\\-]?(AuthConfig|IncludesNOEXEC|ExecCGI|FollowSymLinks|MultiViews|Includes|Indexes|SymLinksIfOwnerMatch)\b/i;var ALL_KEYWORDS=[CPP_KEYWORDS,CSHARP_KEYWORDS,JSCRIPT_KEYWORDS,PERL_KEYWORDS+
3PYTHON_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;}}
4var 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;}
5var 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);}}
6function encodeEscape(charCode){if(charCode<0x20){return(charCode<0x10?'\\x0':'\\x')+charCode.toString(16);}
7var ch=String.fromCharCode(charCode);return(ch==='\\'||ch==='-'||ch===']'||ch==='^')?"\\"+ch:ch;}
8function caseFoldCharset(charSet){var charsetParts=charSet.substring(1,charSet.length-1).match(new RegExp('\\\\u[0-9A-Fa-f]{4}'
9+'|\\\\x[0-9A-Fa-f]{2}'
10+'|\\\\[0-3][0-7]{0,2}'
11+'|\\\\[0-7]{1,2}'
12+'|\\\\[\\s\\S]'
13+'|-'
14+'|[^-\\\\]','g'));var ranges=[];var inverse=charsetParts[0]==='^';var out=['['];if(inverse){out.push('^');}
15for(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;}
16ranges.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]);}
17if(!(end<97||start>122)){ranges.push([Math.max(97,start)&~32,Math.min(end,122)&~32]);}}}}
18ranges.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);}}
19for(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('-');}
20out.push(encodeEscape(range[1]));}}
21out.push(']');return out.join('');}
22function allowAnywhereFoldCaseAndRenumberGroups(regex){var parts=regex.source.match(new RegExp('(?:'
23+'\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]'
24+'|\\\\u[A-Fa-f0-9]{4}'
25+'|\\\\x[A-Fa-f0-9]{2}'
26+'|\\\\[0-9]+'
27+'|\\\\[^ux0-9]'
28+'|\\(\\?[:!=]'
29+'|[\\(\\)\\^]'
30+'|[^\\x5B\\x5C\\(\\)\\^]+'
31+')','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);}}}}
32for(var i=1;i<capturedGroups.length;++i){if(-1===capturedGroups[i]){capturedGroups[i]=++capturedGroupIndex;}}
33for(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];}}}
34for(var i=0;i<n;++i){if('^'===parts[i]&&'^'!==parts[i+1]){parts[i]='';}}
35if(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)+']';});}}}
36return parts.join('');}
37var rewritten=[];for(var i=0,n=regexs.length;i<n;++i){var regex=regexs[i];if(regex.global||regex.multiline){throw new Error(''+regex);}
38rewritten.push('(?:'+allowAnywhereFoldCaseAndRenumberGroups(regex)+')');}
39return new RegExp(rewritten.join('|'),ignoreCase?'gi':'g');}
40function 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;}
41for(var child=node.firstChild;child;child=child.nextSibling){walk(child);}
42var nodeName=node.nodeName.toLowerCase();if('br'===nodeName||'li'===nodeName){chunks[k]='\n';spans[k<<1]=length++;spans[(k++<<1)|1]=node;}
43break;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,'');}
44chunks[k]=text;spans[k<<1]=length;length+=text.length;spans[(k++<<1)|1]=node;}
45break;}}
46walk(node);return{sourceCode:chunks.join('').replace(/\n$/,''),spans:spans};}
47function appendDecorations(basePos,sourceCode,langHandler,out){if(!sourceCode){return;}
48var job={sourceCode:sourceCode,basePos:basePos};langHandler(job);out.push.apply(out,job.decorations);}
49var 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;}
50return wrapper===element?undefined:wrapper;}
51function 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;}}
52var regex=patternParts[1];var k=''+regex;if(!regexKeys.hasOwnProperty(k)){allRegexs.push(regex);regexKeys[k]=null;}}
53allRegexs.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;}}
54if(!match){style=PR_PLAIN;}}
55isEmbedded=style.length>=5&&'lang-'===style.substring(0,5);if(isEmbedded&&!(match&&typeof match[1]==='string')){isEmbedded=false;style=PR_SOURCE;}
56if(!isEmbedded){styleCache[token]=style;}}
57var 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;}
58var 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);}}
59job.decorations=decorations;};return decorate;}
60function 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,'"\'']);}
61if(options['verbatimStrings']){fallthroughStylePatterns.push([PR_STRING,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null]);}
62var 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,'#']);}
63fallthroughStylePatterns.push([PR_STRING,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h(?:h|pp|\+\+)?|[a-z]\w*)>/,null]);}else{shortcutStylePatterns.push([PR_COMMENT,/^#[^\r\n]*/,null,'#']);}}
64if(options['cStyleComments']){fallthroughStylePatterns.push([PR_COMMENT,/^\/\/[^\r\n]*/,null]);fallthroughStylePatterns.push([PR_COMMENT,/^\/\*[\s\S]*?(?:\*\/|$)/,null]);}
65if(options['regexLiterals']){var REGEX_LITERAL=('/(?=[^/*])'
66+'(?:[^/\\x5B\\x5C]'
67+'|\\x5C[\\s\\S]'
68+'|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+'
69+'/');fallthroughStylePatterns.push(['lang-regex',new RegExp('^'+REGEXP_PRECEDER_PATTERN+'('+REGEX_LITERAL+')')]);}
70var types=options['types'];if(types){fallthroughStylePatterns.push([PR_TYPE,types]);}
71if(options['strings']){var strings=(""+options['strings']).replace(/^ | $/g,'').replace(/-/g,'\\-');fallthroughStylePatterns.push([PR_STRING,new RegExp('(?:'+strings.replace(/[\s,]+/g,'|')+')'),,null]);}
72var keywords=(""+options['keywords']).replace(/^ | $/g,'');if(keywords.length){fallthroughStylePatterns.push([PR_KEYWORD,new RegExp('^(?:'+keywords.replace(/[\s,]+/g,'|')+')\\b'),null]);}
73shortcutStylePatterns.push([PR_PLAIN,/^\s+/,null,' \r\n\t\xA0']);if(options['httpdComments']){fallthroughStylePatterns.push([PR_PLAIN,/^.*\S.*#/i,null]);}
74fallthroughStylePatterns.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('^(?:'
75+'0x[a-f0-9]+'
76+'|[a-f0-9:]+:[a-f0-9:]+:[a-f0-9:]+:[a-f0-9:]+:[a-f0-9:]+:[a-f0-9:]+'
77+'|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)'
78+'(?:e[+\\-]?\\d+)?'
79+')'
80+'[a-z]*','i'),null,'0123456789'],[PR_PLAIN,/^\\[\s\S]?/,null],[PR_PUNCTUATION,/^.[^\s\w\.$@\'\"\`\/\#\\]*/,null]);return createSimpleLexer(shortcutStylePatterns,fallthroughStylePatterns);}
81var 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);}
82var listItems=[li];function walk(node){switch(node.nodeType){case 1:if(nocode.test(node.className)){break;}
83if('br'===node.nodeName){breakAfter(node);if(node.parentNode){node.parentNode.removeChild(node);}}else{for(var child=node.firstChild;child;child=child.nextSibling){walk(child);}}
84break;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);}
85breakAfter(node);if(!firstLine){node.parentNode.removeChild(node);}}}
86break;}}
87function breakAfter(lineEndNode){while(!lineEndNode.nextSibling){lineEndNode=lineEndNode.parentNode;if(!lineEndNode){return;}}
88function 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);}}
89return rightSide;}
90var copiedListItem=breakLeftOf(lineEndNode.nextSibling,0);for(var parent;(parent=copiedListItem.parentNode)&&parent.nodeType===1;){copiedListItem=parent;}
91listItems.push(copiedListItem);}
92for(var i=0;i<listItems.length;++i){walk(listItems[i]);}
93if(opt_startLineNum===(opt_startLineNum|0)){listItems[0].setAttribute('value',opt_startLineNum);}
94var 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'));}
95ol.appendChild(li);}
96node.appendChild(ol);}
97function 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;}}
98nDecorations=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;}
99decorations[decPos++]=startPos;decorations[decPos++]=startDec;i=end;}
100nDecorations=decorations.length=decPos;var sourceNode=job.sourceNode;var oldDisplay;if(sourceNode){oldDisplay=sourceNode.style.display;sourceNode.style.display='none';}
101try{var decoration=null;var X=0;while(spanIndex<nSpans){X=X+1;if(X>5000){break;}
102var 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');}
103textNode.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);}}
104sourceIndex=end;if(sourceIndex>=spanEnd){spanIndex+=2;}
105if(sourceIndex>=decEnd){decorationIndex+=2;}}}finally{if(sourceNode){sourceNode.style.display=oldDisplay;}}}
106var 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);}}}
107function langHandlerForExtension(extension,source){if(!(extension&&langHandlerRegistry.hasOwnProperty(extension))){extension=/^\s*</.test(source)?'default-markup':'default-code';}
108return langHandlerRegistry[extension];}
109registerLangHandler(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);}}}
110function prettyPrintOne(sourceCodeHtml,opt_langExtension,opt_numberLines){var container=document.createElement('pre');container.innerHTML=sourceCodeHtml;if(opt_numberLines){numberLines(container,opt_numberLines,true);}
111var job={langExtension:opt_langExtension,numberLines:opt_numberLines,sourceNode:container,pre:1};applyDecorator(job);return container.innerHTML;}
112function prettyPrint(opt_whenDone){function byTagName(tn){return document.getElementsByTagName(tn);}
113var 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]);}}
114codeSegments=null;var clock=Date;if(!clock['now']){clock={'now':function(){return+(new Date);}};}
115var 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;}}
116if(!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);}
117if(langExtension){langExtension=langExtension[1];}
118var 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);}
119var lineNums=cs.className.match(/\blinenums\b(?::(\d+))?/);lineNums=lineNums?lineNums[1]&&lineNums[1].length?+lineNums[1]:true:false;if(lineNums){numberLines(cs,lineNums,preformatted);}
120prettyPrintingJob={langExtension:langExtension,sourceNode:cs,numberLines:lineNums,pre:preformatted};applyDecorator(prettyPrintingJob);}}}
121if(k<elements.length){setTimeout(doWork,250);}else if(opt_whenDone){opt_whenDone();}}
122doWork();}
123var 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;});}})();
0\ No newline at end of file124\ No newline at end of file
diff --git a/docs/manual/style/sitemap.dtd b/docs/manual/style/sitemap.dtd
1new file mode 100644125new file mode 100644
index 0000000..829f326
--- /dev/null
+++ b/docs/manual/style/sitemap.dtd
@@ -0,0 +1,42 @@
1<?xml version='1.0' encoding='UTF-8' ?>
2
3<!--
4 Licensed to the Apache Software Foundation (ASF) under one or more
5 contributor license agreements. See the NOTICE file distributed with
6 this work for additional information regarding copyright ownership.
7 The ASF licenses this file to You under the Apache License, Version 2.0
8 (the "License"); you may not use this file except in compliance with
9 the License. You may obtain a copy of the License at
10
11 http://www.apache.org/licenses/LICENSE-2.0
12
13 Unless required by applicable law or agreed to in writing, software
14 distributed under the License is distributed on an "AS IS" BASIS,
15 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 See the License for the specific language governing permissions and
17 limitations under the License.
18-->
19
20<!ENTITY % common SYSTEM "common.dtd">
21%common;
22
23<!-- <sitemap> is the root element -->
24<!ELEMENT sitemap (title, summary?, seealso*, category*)>
25
26<!ATTLIST sitemap metafile CDATA #REQUIRED
27 upgrade CDATA #IMPLIED
28>
29
30<!-- <indexpage> is another root element -->
31<!ELEMENT indexpage (parentdocument, title, category*)>
32
33<!ATTLIST indexpage metafile CDATA #REQUIRED
34 upgrade CDATA #IMPLIED
35>
36
37<!ELEMENT category (title, page*)>
38<!ATTLIST category id ID #IMPLIED>
39
40<!ELEMENT page (#PCDATA)>
41<!ATTLIST page href CDATA #IMPLIED
42 separate (yes | no) "no" >
diff --git a/docs/manual/style/version.ent b/docs/manual/style/version.ent
0new file mode 10064443new file mode 100644
index 0000000..b44b2a7
--- /dev/null
+++ b/docs/manual/style/version.ent
@@ -0,0 +1,24 @@
1<?xml version='1.0' encoding='UTF-8' ?>
2
3<!--
4 Licensed to the Apache Software Foundation (ASF) under one or more
5 contributor license agreements. See the NOTICE file distributed with
6 this work for additional information regarding copyright ownership.
7 The ASF licenses this file to You under the Apache License, Version 2.0
8 (the "License"); you may not use this file except in compliance with
9 the License. You may obtain a copy of the License at
10
11 http://www.apache.org/licenses/LICENSE-2.0
12
13 Unless required by applicable law or agreed to in writing, software
14 distributed under the License is distributed on an "AS IS" BASIS,
15 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 See the License for the specific language governing permissions and
17 limitations under the License.
18-->
19
20<!ENTITY httpd.major "2">
21<!ENTITY httpd.minor "4">
22<!ENTITY httpd.patch "29">
23
24<!ENTITY httpd.docs "2.4">
diff --git a/docs/manual/suexec.html b/docs/manual/suexec.html
0new file mode 10064425new file mode 100644
index 0000000..c4cc65b
--- /dev/null
+++ b/docs/manual/suexec.html
@@ -0,0 +1,21 @@
1# GENERATED FROM XML -- DO NOT EDIT
2
3URI: suexec.html.en
4Content-Language: en
5Content-type: text/html; charset=ISO-8859-1
6
7URI: suexec.html.fr
8Content-Language: fr
9Content-type: text/html; charset=ISO-8859-1
10
11URI: suexec.html.ja.utf8
12Content-Language: ja
13Content-type: text/html; charset=UTF-8
14
15URI: suexec.html.ko.euc-kr
16Content-Language: ko
17Content-type: text/html; charset=EUC-KR
18
19URI: suexec.html.tr.utf8
20Content-Language: tr
21Content-type: text/html; charset=UTF-8
diff --git a/docs/manual/suexec.html.en b/docs/manual/suexec.html.en
0new file mode 10064422new file mode 100644
index 0000000..28be5fd
--- /dev/null
+++ b/docs/manual/suexec.html.en
@@ -0,0 +1,643 @@
1<?xml version="1.0" encoding="ISO-8859-1"?>
2<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en"><head>
4<meta content="text/html; charset=ISO-8859-1" http-equiv="Content-Type" />
5<!--
6 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
7 This file is generated from xml source: DO NOT EDIT
8 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
9 -->
10<title>suEXEC Support - Apache HTTP Server Version 2.4</title>
11<link href="./style/css/manual.css" rel="stylesheet" media="all" type="text/css" title="Main stylesheet" />
12<link href="./style/css/manual-loose-100pc.css" rel="alternate stylesheet" media="all" type="text/css" title="No Sidebar - Default font size" />
13<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" />
14<script src="./style/scripts/prettify.min.js" type="text/javascript">
15</script>
16
17<link href="./images/favicon.ico" rel="shortcut icon" /></head>
18<body id="manual-page"><div id="page-header">
19<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>
20<p class="apache">Apache HTTP Server Version 2.4</p>
21<img alt="" src="./images/feather.png" /></div>
22<div class="up"><a href="./"><img title="&lt;-" alt="&lt;-" src="./images/left.gif" /></a></div>
23<div id="path">
24<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>
25<div class="toplang">
26<p><span>Available Languages: </span><a href="./en/suexec.html" title="English">&nbsp;en&nbsp;</a> |
27<a href="./fr/suexec.html" hreflang="fr" rel="alternate" title="Fran�ais">&nbsp;fr&nbsp;</a> |
28<a href="./ja/suexec.html" hreflang="ja" rel="alternate" title="Japanese">&nbsp;ja&nbsp;</a> |
29<a href="./ko/suexec.html" hreflang="ko" rel="alternate" title="Korean">&nbsp;ko&nbsp;</a> |
30<a href="./tr/suexec.html" hreflang="tr" rel="alternate" title="T�rk�e">&nbsp;tr&nbsp;</a></p>
31</div>
32
33 <p>The <strong>suEXEC</strong> feature provides users of the Apache
34 HTTP Server the ability
35 to run <strong>CGI</strong> and <strong>SSI</strong> programs
36 under user IDs different from the user ID of the calling
37 web server. Normally, when a CGI or SSI program executes, it
38 runs as the same user who is running the web server.</p>
39
40 <p>Used properly, this feature can reduce
41 considerably the security risks involved with allowing users to
42 develop and run private CGI or SSI programs. However, if suEXEC
43 is improperly configured, it can cause any number of problems
44 and possibly create new holes in your computer's security. If
45 you aren't familiar with managing <em>setuid root</em> programs
46 and the security issues they present, we highly recommend that
47 you not consider using suEXEC.</p>
48 </div>
49<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>
50<li><img alt="" src="./images/down.gif" /> <a href="#model">suEXEC Security Model</a></li>
51<li><img alt="" src="./images/down.gif" /> <a href="#install">Configuring &amp; Installing
52 suEXEC</a></li>
53<li><img alt="" src="./images/down.gif" /> <a href="#enable">Enabling &amp; Disabling
54 suEXEC</a></li>
55<li><img alt="" src="./images/down.gif" /> <a href="#usage">Using suEXEC</a></li>
56<li><img alt="" src="./images/down.gif" /> <a href="#debug">Debugging suEXEC</a></li>
57<li><img alt="" src="./images/down.gif" /> <a href="#jabberwock">Beware the Jabberwock:
58 Warnings &amp; Examples</a></li>
59</ul><h3>See also</h3><ul class="seealso"><li><a href="#comments_section">Comments</a></li></ul></div>
60<div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
61<div class="section">
62<h2><a name="before" id="before">Before we begin</a></h2>
63
64 <p>Before jumping head-first into this document,
65 you should be aware that certain assumptions are made about you and
66 the environment in which you will be using suexec.</p>
67
68 <p>First, it is assumed that you are using a UNIX
69 derivative operating system that is capable of
70 <strong>setuid</strong> and <strong>setgid</strong> operations.
71 All command examples are given in this regard. Other platforms,
72 if they are capable of supporting suEXEC, may differ in their
73 configuration.</p>
74
75 <p>Second, it is assumed you are familiar with
76 some basic concepts of your computer's security and its
77 administration. This involves an understanding of
78 <strong>setuid/setgid</strong> operations and the various
79 effects they may have on your system and its level of
80 security.</p>
81
82 <p>Third, it is assumed that you are using an
83 <strong>unmodified</strong> version of suEXEC code. All code
84 for suEXEC has been carefully scrutinized and tested by the
85 developers as well as numerous beta testers. Every precaution
86 has been taken to ensure a simple yet solidly safe base of
87 code. Altering this code can cause unexpected problems and new
88 security risks. It is <strong>highly</strong> recommended you
89 not alter the suEXEC code unless you are well versed in the
90 particulars of security programming and are willing to share
91 your work with the Apache HTTP Server development team for consideration.</p>
92
93 <p>Fourth, and last, it has been the decision of
94 the Apache HTTP Server development team to <strong>NOT</strong> make suEXEC part of
95 the default installation of Apache httpd. To this end, suEXEC
96 configuration requires of the administrator careful attention
97 to details. After due consideration has been given to the
98 various settings for suEXEC, the administrator may install
99 suEXEC through normal installation methods. The values for
100 these settings need to be carefully determined and specified by
101 the administrator to properly maintain system security during
102 the use of suEXEC functionality. It is through this detailed
103 process that we hope to limit suEXEC
104 installation only to those who are careful and determined
105 enough to use it.</p>
106
107 <p>Still with us? Yes? Good. Let's move on!</p>
108</div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
109<div class="section">
110<h2><a name="model" id="model">suEXEC Security Model</a></h2>
111
112 <p>Before we begin configuring and installing
113 suEXEC, we will first discuss the security model you are about
114 to implement. By doing so, you may better understand what
115 exactly is going on inside suEXEC and what precautions are
116 taken to ensure your system's security.</p>
117
118 <p><strong>suEXEC</strong> is based on a setuid
119 "wrapper" program that is called by the main Apache HTTP Server.
120 This wrapper is called when an HTTP request is made for a CGI
121 or SSI program that the administrator has designated to run as
122 a userid other than that of the main server. When such a
123 request is made, Apache httpd provides the suEXEC wrapper with the
124 program's name and the user and group IDs under which the
125 program is to execute.</p>
126
127 <p>The wrapper then employs the following process
128 to determine success or failure -- if any one of these
129 conditions fail, the program logs the failure and exits with an
130 error, otherwise it will continue:</p>
131
132 <ol>
133 <li>
134 <strong>Is the user executing this wrapper a valid user of
135 this system?</strong>
136
137 <p class="indent">
138 This is to ensure that the user executing the wrapper is
139 truly a user of the system.
140 </p>
141 </li>
142
143 <li>
144 <strong>Was the wrapper called with the proper number of
145 arguments?</strong>
146
147 <p class="indent">
148 The wrapper will only execute if it is given the proper
149 number of arguments. The proper argument format is known
150 to the Apache HTTP Server. If the wrapper is not receiving
151 the proper number of arguments, it is either being
152 hacked, or there is something wrong with the suEXEC
153 portion of your Apache httpd binary.
154 </p>
155 </li>
156
157 <li>
158 <strong>Is this valid user allowed to run the
159 wrapper?</strong>
160
161 <p class="indent">
162 Is this user the user allowed to run this wrapper? Only
163 one user (the Apache user) is allowed to execute this
164 program.
165 </p>
166 </li>
167
168 <li>
169 <strong>Does the target CGI or SSI program have an unsafe
170 hierarchical reference?</strong>
171
172 <p class="indent">
173 Does the target CGI or SSI program's path contain a leading
174 '/' or have a '..' backreference? These are not allowed; the
175 target CGI/SSI program must reside within suEXEC's document
176 root (see <code>--with-suexec-docroot=<em>DIR</em></code>
177 below).
178 </p>
179 </li>
180
181 <li>
182 <strong>Is the target user name valid?</strong>
183
184 <p class="indent">
185 Does the target user exist?
186 </p>
187 </li>
188
189 <li>
190 <strong>Is the target group name valid?</strong>
191
192 <p class="indent">
193 Does the target group exist?
194 </p>
195 </li>
196
197 <li>
198 <strong>Is the target user <em>NOT</em> superuser?</strong>
199
200
201 <p class="indent">
202 suEXEC does not allow <code><em>root</em></code>
203 to execute CGI/SSI programs.
204 </p>
205 </li>
206
207 <li>
208 <strong>Is the target userid <em>ABOVE</em> the minimum ID
209 number?</strong>
210
211 <p class="indent">
212 The minimum user ID number is specified during
213 configuration. This allows you to set the lowest possible
214 userid that will be allowed to execute CGI/SSI programs.
215 This is useful to block out "system" accounts.
216 </p>
217 </li>
218
219 <li>
220 <strong>Is the target group <em>NOT</em> the superuser
221 group?</strong>
222
223 <p class="indent">
224 Presently, suEXEC does not allow the <code><em>root</em></code>
225 group to execute CGI/SSI programs.
226 </p>
227 </li>
228
229 <li>
230 <strong>Is the target groupid <em>ABOVE</em> the minimum ID
231 number?</strong>
232
233 <p class="indent">
234 The minimum group ID number is specified during
235 configuration. This allows you to set the lowest possible
236 groupid that will be allowed to execute CGI/SSI programs.
237 This is useful to block out "system" groups.
238 </p>
239 </li>
240
241 <li>
242 <strong>Can the wrapper successfully become the target user
243 and group?</strong>
244
245 <p class="indent">
246 Here is where the program becomes the target user and
247 group via setuid and setgid calls. The group access list
248 is also initialized with all of the groups of which the
249 user is a member.
250 </p>
251 </li>
252
253 <li>
254 <strong>Can we change directory to the one in which the target
255 CGI/SSI program resides?</strong>
256
257 <p class="indent">
258 If it doesn't exist, it can't very well contain files. If we
259 can't change directory to it, it might as well not exist.
260 </p>
261 </li>
262
263 <li>
264 <strong>Is the directory within the httpd webspace?</strong>
265
266 <p class="indent">
267 If the request is for a regular portion of the server, is
268 the requested directory within suEXEC's document root? If
269 the request is for a <code class="directive"><a href="./mod/mod_userdir.html#userdir">UserDir</a></code>, is the requested directory
270 within the directory configured as suEXEC's userdir (see
271 <a href="#install">suEXEC's configuration options</a>)?
272 </p>
273 </li>
274
275 <li>
276 <strong>Is the directory <em>NOT</em> writable by anyone
277 else?</strong>
278
279 <p class="indent">
280 We don't want to open up the directory to others; only
281 the owner user may be able to alter this directories
282 contents.
283 </p>
284 </li>
285
286 <li>
287 <strong>Does the target CGI/SSI program exist?</strong>
288
289 <p class="indent">
290 If it doesn't exists, it can't very well be executed.
291 </p>
292 </li>
293
294 <li>
295 <strong>Is the target CGI/SSI program <em>NOT</em> writable
296 by anyone else?</strong>
297
298 <p class="indent">
299 We don't want to give anyone other than the owner the
300 ability to change the CGI/SSI program.
301 </p>
302 </li>
303
304 <li>
305 <strong>Is the target CGI/SSI program <em>NOT</em> setuid or
306 setgid?</strong>
307
308 <p class="indent">
309 We do not want to execute programs that will then change
310 our UID/GID again.
311 </p>
312 </li>
313
314 <li>
315 <strong>Is the target user/group the same as the program's
316 user/group?</strong>
317
318 <p class="indent">
319 Is the user the owner of the file?
320 </p>
321 </li>
322
323 <li>
324 <strong>Can we successfully clean the process environment
325 to ensure safe operations?</strong>
326
327 <p class="indent">
328 suEXEC cleans the process' environment by establishing a
329 safe execution PATH (defined during configuration), as
330 well as only passing through those variables whose names
331 are listed in the safe environment list (also created
332 during configuration).
333 </p>
334 </li>
335
336 <li>
337 <strong>Can we successfully become the target CGI/SSI program
338 and execute?</strong>
339
340 <p class="indent">
341 Here is where suEXEC ends and the target CGI/SSI program begins.
342 </p>
343 </li>
344 </ol>
345
346 <p>This is the standard operation of the
347 suEXEC wrapper's security model. It is somewhat stringent and
348 can impose new limitations and guidelines for CGI/SSI design,
349 but it was developed carefully step-by-step with security in
350 mind.</p>
351
352 <p>For more information as to how this security
353 model can limit your possibilities in regards to server
354 configuration, as well as what security risks can be avoided
355 with a proper suEXEC setup, see the <a href="#jabberwock">"Beware the Jabberwock"</a> section of this
356 document.</p>
357</div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
358<div class="section">
359<h2><a name="install" id="install">Configuring &amp; Installing
360 suEXEC</a></h2>
361
362 <p>Here's where we begin the fun.</p>
363
364 <p><strong>suEXEC configuration
365 options</strong><br />
366 </p>
367
368 <dl>
369 <dt><code>--enable-suexec</code></dt>
370
371 <dd>This option enables the suEXEC feature which is never
372 installed or activated by default. At least one
373 <code>--with-suexec-xxxxx</code> option has to be provided
374 together with the <code>--enable-suexec</code> option to let
375 APACI accept your request for using the suEXEC feature.</dd>
376
377 <dt><code>--with-suexec-bin=<em>PATH</em></code></dt>
378
379 <dd>The path to the <code>suexec</code> binary must be hard-coded
380 in the server for security reasons. Use this option to override
381 the default path. <em>e.g.</em>
382 <code>--with-suexec-bin=/usr/sbin/suexec</code></dd>
383
384 <dt><code>--with-suexec-caller=<em>UID</em></code></dt>
385
386 <dd>The <a href="mod/mpm_common.html#user">username</a> under which
387 httpd normally runs. This is the only user allowed to
388 execute the suEXEC wrapper.</dd>
389
390 <dt><code>--with-suexec-userdir=<em>DIR</em></code></dt>
391
392 <dd>Define to be the subdirectory under users' home
393 directories where suEXEC access should be allowed. All
394 executables under this directory will be executable by suEXEC
395 as the user so they should be "safe" programs. If you are
396 using a "simple" <code class="directive"><a href="./mod/mod_userdir.html#userdir">UserDir</a></code>
397 directive (ie. one without a "*" in it) this should be set to the same
398 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
399 a location that is not the same as the user's home directory
400 as referenced in the <code>passwd</code> file. Default value is
401 "<code>public_html</code>".<br />
402 If you have virtual hosts with a different <code class="directive"><a href="./mod/mod_userdir.html#userdir">UserDir</a></code> for each,
403 you will need to define them to all reside in one parent
404 directory; then name that parent directory here. <strong>If
405 this is not defined properly, "~userdir" cgi requests will
406 not work!</strong></dd>
407
408 <dt><code>--with-suexec-docroot=<em>DIR</em></code></dt>
409
410 <dd>Define as the DocumentRoot set for httpd. This will be
411 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
412 default directory is the <code>--datadir</code> value with the suffix
413 "<code>/htdocs</code>", <em>e.g.</em> if you configure with
414 "<code>--datadir=/home/apache</code>" the directory
415 "<code>/home/apache/htdocs</code>" is used as document root for the
416 suEXEC wrapper.</dd>
417
418 <dt><code>--with-suexec-uidmin=<em>UID</em></code></dt>
419
420 <dd>Define this as the lowest UID allowed to be a target user
421 for suEXEC. For most systems, 500 or 100 is common. Default
422 value is 100.</dd>
423
424 <dt><code>--with-suexec-gidmin=<em>GID</em></code></dt>
425
426 <dd>Define this as the lowest GID allowed to be a target
427 group for suEXEC. For most systems, 100 is common and
428 therefore used as default value.</dd>
429
430 <dt><code>--with-suexec-logfile=<em>FILE</em></code></dt>
431
432 <dd>This defines the filename to which all suEXEC
433 transactions and errors are logged (useful for auditing and
434 debugging purposes). By default the logfile is named
435 "<code>suexec_log</code>" and located in your standard logfile
436 directory (<code>--logfiledir</code>).</dd>
437
438 <dt><code>--with-suexec-safepath=<em>PATH</em></code></dt>
439
440 <dd>Define a safe PATH environment to pass to CGI
441 executables. Default value is
442 "<code>/usr/local/bin:/usr/bin:/bin</code>".</dd>
443 </dl>
444
445 <h3>Compiling and installing the suEXEC wrapper</h3>
446
447
448 <p>If you have enabled the suEXEC feature with the
449 <code>--enable-suexec</code> option the <code>suexec</code> binary
450 (together with httpd itself) is automatically built if you execute
451 the <code>make</code> command.</p>
452
453 <p>After all components have been built you can execute the
454 command <code>make install</code> to install them. The binary image
455 <code>suexec</code> is installed in the directory defined by the
456 <code>--sbindir</code> option. The default location is
457 "/usr/local/apache2/bin/suexec".</p>
458
459 <p>Please note that you need <strong><em>root
460 privileges</em></strong> for the installation step. In order
461 for the wrapper to set the user ID, it must be installed as
462 owner <code><em>root</em></code> and must have the setuserid
463 execution bit set for file modes.</p>
464
465
466 <h3>Setting paranoid permissions</h3>
467
468
469 <p>Although the suEXEC wrapper will check to ensure that its
470 caller is the correct user as specified with the
471 <code>--with-suexec-caller</code> <code class="program"><a href="./programs/configure.html">configure</a></code>
472 option, there is
473 always the possibility that a system or library call suEXEC uses
474 before this check may be exploitable on your system. To counter
475 this, and because it is best-practise in general, you should use
476 filesystem permissions to ensure that only the group httpd
477 runs as may execute suEXEC.</p>
478
479 <p>If for example, your web server is configured to run as:</p>
480
481 <pre class="prettyprint lang-config">User www
482Group webgroup</pre>
483
484
485 <p>and <code class="program"><a href="./programs/suexec.html">suexec</a></code> is installed at
486 "/usr/local/apache2/bin/suexec", you should run:</p>
487
488 <div class="example"><p><code>
489 chgrp webgroup /usr/local/apache2/bin/suexec<br />
490 chmod 4750 /usr/local/apache2/bin/suexec<br />
491 </code></p></div>
492
493 <p>This will ensure that only the group httpd runs as can even
494 execute the suEXEC wrapper.</p>
495
496</div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
497<div class="section">
498<h2><a name="enable" id="enable">Enabling &amp; Disabling
499 suEXEC</a></h2>
500
501 <p>Upon startup of httpd, it looks for the file
502 <code class="program"><a href="./programs/suexec.html">suexec</a></code> in the directory defined by the
503 <code>--sbindir</code> option (default is
504 "/usr/local/apache/sbin/suexec"). If httpd finds a properly
505 configured suEXEC wrapper, it will print the following message
506 to the error log:</p>
507
508<div class="example"><p><code>
509 [notice] suEXEC mechanism enabled (wrapper: <var>/path/to/suexec</var>)
510</code></p></div>
511
512 <p>If you don't see this message at server startup, the server is
513 most likely not finding the wrapper program where it expects
514 it, or the executable is not installed <em>setuid root</em>.</p>
515
516 <p>If you want to enable the suEXEC mechanism for the first time
517 and an Apache HTTP Server is already running you must kill and
518 restart httpd. Restarting it with a simple HUP or USR1 signal
519 will not be enough. </p>
520 <p>If you want to disable suEXEC you should kill and restart
521 httpd after you have removed the <code class="program"><a href="./programs/suexec.html">suexec</a></code> file.</p>
522</div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
523<div class="section">
524<h2><a name="usage" id="usage">Using suEXEC</a></h2>
525
526 <p>Requests for CGI programs will call the suEXEC wrapper only if
527 they are for a virtual host containing a <code class="directive"><a href="./mod/mod_suexec.html#suexecusergroup">SuexecUserGroup</a></code> directive or if
528 they are processed by <code class="module"><a href="./mod/mod_userdir.html">mod_userdir</a></code>.</p>
529
530 <p><strong>Virtual Hosts:</strong><br /> One way to use the suEXEC
531 wrapper is through the <code class="directive"><a href="./mod/mod_suexec.html#suexecusergroup">SuexecUserGroup</a></code> directive in
532 <code class="directive"><a href="./mod/core.html#virtualhost">VirtualHost</a></code> definitions. By
533 setting this directive to values different from the main server
534 user ID, all requests for CGI resources will be executed as the
535 <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
536 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
537 is assumed.</p>
538
539 <p><strong>User directories:</strong><br /> Requests that are
540 processed by <code class="module"><a href="./mod/mod_userdir.html">mod_userdir</a></code> will call the suEXEC
541 wrapper to execute CGI programs under the userid of the requested
542 user directory. The only requirement needed for this feature to
543 work is for CGI execution to be enabled for the user and that the
544 script must meet the scrutiny of the <a href="#model">security
545 checks</a> above. See also the
546 <code>--with-suexec-userdir</code> <a href="#install">compile
547 time option</a>.</p> </div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
548<div class="section">
549<h2><a name="debug" id="debug">Debugging suEXEC</a></h2>
550
551 <p>The suEXEC wrapper will write log information
552 to the file defined with the <code>--with-suexec-logfile</code>
553 option as indicated above. If you feel you have configured and
554 installed the wrapper properly, have a look at this log and the
555 error_log for the server to see where you may have gone astray.</p>
556
557</div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
558<div class="section">
559<h2><a name="jabberwock" id="jabberwock">Beware the Jabberwock:
560 Warnings &amp; Examples</a></h2>
561
562 <p><strong>NOTE!</strong> This section may not be
563 complete. For the latest revision of this section of the
564 documentation, see the <a href="http://httpd.apache.org/docs/2.4/suexec.html">Online
565 Documentation</a> version.</p>
566
567 <p>There are a few points of interest regarding
568 the wrapper that can cause limitations on server setup. Please
569 review these before submitting any "bugs" regarding suEXEC.</p>
570
571 <ul>
572 <li><strong>suEXEC Points Of Interest</strong></li>
573
574 <li>
575 Hierarchy limitations
576
577 <p class="indent">
578 For security and efficiency reasons, all suEXEC requests
579 must remain within either a top-level document root for
580 virtual host requests, or one top-level personal document
581 root for userdir requests. For example, if you have four
582 VirtualHosts configured, you would need to structure all
583 of your VHosts' document roots off of one main httpd
584 document hierarchy to take advantage of suEXEC for
585 VirtualHosts. (Example forthcoming.)
586 </p>
587 </li>
588
589 <li>
590 suEXEC's PATH environment variable
591
592 <p class="indent">
593 This can be a dangerous thing to change. Make certain
594 every path you include in this define is a
595 <strong>trusted</strong> directory. You don't want to
596 open people up to having someone from across the world
597 running a trojan horse on them.
598 </p>
599 </li>
600
601 <li>
602 Altering the suEXEC code
603
604 <p class="indent">
605 Again, this can cause <strong>Big Trouble</strong> if you
606 try this without knowing what you are doing. Stay away
607 from it if at all possible.
608 </p>
609 </li>
610 </ul>
611
612</div></div>
613<div class="bottomlang">
614<p><span>Available Languages: </span><a href="./en/suexec.html" title="English">&nbsp;en&nbsp;</a> |
615<a href="./fr/suexec.html" hreflang="fr" rel="alternate" title="Fran�ais">&nbsp;fr&nbsp;</a> |
616<a href="./ja/suexec.html" hreflang="ja" rel="alternate" title="Japanese">&nbsp;ja&nbsp;</a> |
617<a href="./ko/suexec.html" hreflang="ko" rel="alternate" title="Korean">&nbsp;ko&nbsp;</a> |
618<a href="./tr/suexec.html" hreflang="tr" rel="alternate" title="T�rk�e">&nbsp;tr&nbsp;</a></p>
619</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>
620<script type="text/javascript"><!--//--><![CDATA[//><!--
621var comments_shortname = 'httpd';
622var comments_identifier = 'http://httpd.apache.org/docs/2.4/suexec.html';
623(function(w, d) {
624 if (w.location.hostname.toLowerCase() == "httpd.apache.org") {
625 d.write('<div id="comments_thread"><\/div>');
626 var s = d.createElement('script');
627 s.type = 'text/javascript';
628 s.async = true;
629 s.src = 'https://comments.apache.org/show_comments.lua?site=' + comments_shortname + '&page=' + comments_identifier;
630 (d.getElementsByTagName('head')[0] || d.getElementsByTagName('body')[0]).appendChild(s);
631 }
632 else {
633 d.write('<div id="comments_thread">Comments are disabled for this page at the moment.<\/div>');
634 }
635})(window, document);
636//--><!]]></script></div><div id="footer">
637<p class="apache">Copyright 2017 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>
638<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[//><!--
639if (typeof(prettyPrint) !== 'undefined') {
640 prettyPrint();
641}
642//--><!]]></script>
643</body></html>
0\ No newline at end of file644\ No newline at end of file
diff --git a/docs/manual/suexec.html.fr b/docs/manual/suexec.html.fr
1new file mode 100644645new file mode 100644
index 0000000..02aa50c
--- /dev/null
+++ b/docs/manual/suexec.html.fr
@@ -0,0 +1,689 @@
1<?xml version="1.0" encoding="ISO-8859-1"?>
2<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3<html xmlns="http://www.w3.org/1999/xhtml" lang="fr" xml:lang="fr"><head>
4<meta content="text/html; charset=ISO-8859-1" http-equiv="Content-Type" />
5<!--
6 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
7 This file is generated from xml source: DO NOT EDIT
8 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
9 -->
10<title>Support suEXEC - Serveur Apache HTTP Version 2.4</title>
11<link href="./style/css/manual.css" rel="stylesheet" media="all" type="text/css" title="Main stylesheet" />
12<link href="./style/css/manual-loose-100pc.css" rel="alternate stylesheet" media="all" type="text/css" title="No Sidebar - Default font size" />
13<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" />
14<script src="./style/scripts/prettify.min.js" type="text/javascript">
15</script>
16
17<link href="./images/favicon.ico" rel="shortcut icon" /></head>
18<body id="manual-page"><div id="page-header">
19<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>
20<p class="apache">Serveur Apache HTTP Version 2.4</p>
21<img alt="" src="./images/feather.png" /></div>
22<div class="up"><a href="./"><img title="&lt;-" alt="&lt;-" src="./images/left.gif" /></a></div>
23<div id="path">
24<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>
25<div class="toplang">
26<p><span>Langues Disponibles: </span><a href="./en/suexec.html" hreflang="en" rel="alternate" title="English">&nbsp;en&nbsp;</a> |
27<a href="./fr/suexec.html" title="Fran�ais">&nbsp;fr&nbsp;</a> |
28<a href="./ja/suexec.html" hreflang="ja" rel="alternate" title="Japanese">&nbsp;ja&nbsp;</a> |
29<a href="./ko/suexec.html" hreflang="ko" rel="alternate" title="Korean">&nbsp;ko&nbsp;</a> |
30<a href="./tr/suexec.html" hreflang="tr" rel="alternate" title="T�rk�e">&nbsp;tr&nbsp;</a></p>
31</div>
32
33 <p>La fonctionnalit� <strong>suEXEC</strong> permet
34 l'ex�cution des programmes <strong>CGI</strong> et
35 <strong>SSI</strong> sous un utilisateur autre que celui sous
36 lequel s'ex�cute le serveur web qui appelle ces programmes.
37 Normalement, lorsqu'un programme CGI ou SSI est lanc�, il
38 s'ex�cute sous le m�me utilisateur que celui du serveur web qui
39 l'appelle.</p>
40
41 <p>Utilis�e de mani�re appropri�e, cette fonctionnalit� peut
42 r�duire consid�rablement les risques de s�curit� encourus
43 lorsqu'on autorise les utilisateurs � d�velopper et faire
44 s'ex�cuter des programmes CGI ou SSI de leur cru. Cependant, mal
45 configur�, suEXEC peut causer de nombreux probl�mes et m�me cr�er
46 de nouvelles failles dans la s�curit� de votre ordinateur. Si
47 vous n'�tes pas familier avec la gestion des programmes
48 <em>setuid root</em> et les risques de s�curit� qu'ils comportent,
49 nous vous recommandons vivement de ne pas tenter
50 d'utiliser suEXEC.</p>
51 </div>
52<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>
53<li><img alt="" src="./images/down.gif" /> <a href="#model">Mod�le de s�curit� de suEXEC</a></li>
54<li><img alt="" src="./images/down.gif" /> <a href="#install">Configurer et installer suEXEC</a></li>
55<li><img alt="" src="./images/down.gif" /> <a href="#enable">Activation et d�sactivation
56de suEXEC</a></li>
57<li><img alt="" src="./images/down.gif" /> <a href="#usage">Utilisation de suEXEC</a></li>
58<li><img alt="" src="./images/down.gif" /> <a href="#debug">D�bogage de suEXEC</a></li>
59<li><img alt="" src="./images/down.gif" /> <a href="#jabberwock">Avis � la population !
60 Avertissements et exemples</a></li>
61</ul><h3>Voir aussi</h3><ul class="seealso"><li><a href="#comments_section">Commentaires</a></li></ul></div>
62<div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
63<div class="section">
64<h2><a name="before" id="before">Avant de commencer</a></h2>
65
66 <p>Avant de foncer t�te baiss�e dans la lecture de ce document,
67 vous devez tenir compte de certaines hypoth�ses concernant vous-m�me
68 et l'environnement dans lequel vous allez utiliser suexec.</p>
69
70 <p>Premi�rement, vous devez utiliser un syst�me d'exploitation
71 UNIX ou d�riv�, capable d'effectuer des op�rations
72 <strong>setuid</strong> et <strong>setgid</strong>. Tous les
73 exemples de commande sont donn�s en cons�quence. D'autres
74 plates-formes, m�me si elles supportent suEXEC, peuvent
75 avoir une configuration diff�rente.</p>
76
77 <p>Deuxi�mement, vous devez �tre familier avec les concepts de base
78 relatifs � la s�curit� de votre ordinateur et son administration.
79 Ceci implique la compr�hension des op�rations
80 <strong>setuid/setgid</strong> et des diff�rents effets qu'elles
81 peuvent produire sur votre syst�me et son niveau de s�curit�.</p>
82
83 <p>Troisi�mement, vous devez utiliser une version
84 <strong>non modifi�e</strong> du code de suEXEC. L'ensemble du
85 code de suEXEC a �t� scrut� et test� avec soin par les d�veloppeurs
86 et de nombreux b�ta testeurs. Toutes les pr�cautions ont �t� prises
87 pour s'assurer d'une base s�re de code non seulement simple, mais
88 aussi solide. La modification de ce code peut causer des probl�mes
89 inattendus et de nouveaux risques de s�curit�. Il est
90 <strong>vivement</strong> recommand� de ne pas modifier le code de
91 suEXEC, � moins que vous ne soyez un programmeur sp�cialiste des
92 particularit�s li�es � la s�curit�, et souhaitez partager votre
93 travail avec l'�quipe de d�veloppement du serveur HTTP Apache afin
94 de pouvoir en discuter.</p>
95
96 <p>Quatri�mement et derni�rement, l'�quipe de d�veloppement du
97 serveur HTTP Apache a d�cid� de ne
98 <strong>PAS</strong> inclure suEXEC dans l'installation par d�faut
99 d'Apache httpd. Pour pouvoir mettre en oeuvre suEXEC, l'administrateur
100 doit porter la plus grande attention aux d�tails. Apr�s avoir bien
101 r�fl�chi aux diff�rents points de la configuration de suEXEC,
102 l'administrateur peut l'installer selon les m�thodes classiques.
103 Les valeurs des param�tres de configuration doivent �tre
104 d�termin�es et sp�cifi�es avec soin par l'administrateur, afin de
105 maintenir la s�curit� du syst�me de mani�re appropri�e lors de
106 l'utilisation de la fonctionnalit� suEXEC. C'est par le biais de
107 ce processus minutieux que nous esp�rons r�server
108 l'installation de suEXEC aux administrateurs prudents et
109 suffisamment d�termin�s � vouloir l'utiliser.</p>
110
111 <p>Vous �tes encore avec nous ? Oui ? Bien.
112 Alors nous pouvons continuer !</p>
113</div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
114<div class="section">
115<h2><a name="model" id="model">Mod�le de s�curit� de suEXEC</a></h2>
116
117 <p>Avant d'installer et configurer suEXEC, nous allons tout d'abord
118 d�crire le mod�le de s�curit� que vous �tes sur le point
119 d'impl�menter. Vous devriez ainsi mieux comprendre ce qui se passe
120 vraiment � l'int�rieur de suEXEC et quelles pr�cautions ont �t�
121 prises pour pr�server la s�curit� de votre syst�me.</p>
122
123 <p><strong>suEXEC</strong> est bas� sur un programme "conteneur"
124 (wrapper) setuid qui est appel� par le serveur HTTP Apache principal.
125 Ce conteneur est appel� quand une requ�te HTTP concerne
126 un programme CGI ou SSI que l'administrateur
127 a d�cid� de faire s'ex�cuter
128 sous un utilisateur autre que celui du serveur principal.
129 Lorsqu'il re�oit une telle requ�te, Apache httpd fournit au conteneur
130 suEXEC le nom du programme, ainsi que les identifiants utilisateur
131 et groupe sous lesquels le programme doit s'ex�cuter.</p>
132
133 <p>Le conteneur effectue ensuite les v�rifications suivantes afin
134 de d�terminer la r�ussite ou l'�chec du processus -- si une seule
135 de ces conditions n'est pas v�rifi�e, le programme journalise
136 l'erreur et se termine en retournant un code d'erreur, sinon il
137 continue :</p>
138
139 <ol>
140 <li>
141 <strong>L'utilisateur qui ex�cute le conteneur est-il un
142 utilisateur valide de ce syst�me ?</strong>
143
144 <p class="indent">
145 Ceci permet de s'assurer que l'utilisateur qui ex�cute le
146 conteneur est vraiment un utilisateur appartenant au syst�me.
147 </p>
148 </li>
149
150 <li>
151 <strong>Le conteneur a-t-il �t� appel� avec un nombre
152 d'arguments correct ?</strong>
153
154 <p class="indent">
155 Le conteneur ne s'ex�cutera que si on lui fournit un nombre
156 d'arguments correct. Le serveur HTTP apache sait quel est le
157 bon format des arguments. Si le conteneur ne re�oit pas un
158 nombre d'arguments correct, soit il a �t� modifi�,
159 soit quelque chose ne va pas dans la portion suEXEC de
160 votre binaire Apache httpd.
161 </p>
162 </li>
163
164 <li>
165 <strong>Cet utilisateur valide est-il autoris� � ex�cuter le
166 conteneur ?</strong>
167
168 <p class="indent">
169 Cet utilisateur est-il celui autoris� � ex�cuter le
170 conteneur ? Un seul utilisateur (celui d'Apache) est
171 autoris� � ex�cuter ce programme.
172 </p>
173 </li>
174
175 <li>
176 <strong>Le chemin du programme CGI ou SSI cible est-il
177 non s�r ?</strong>
178
179 <p class="indent">
180 Le chemin du programme CGI ou SSI cible d�bute-t-il par un
181 '/' ou contient-il une r�f�rence arri�re '..' ? Ceci est
182 interdit ; le programme CGI ou SSI cible doit se trouver dans
183 la hi�rarchie de la racine des documents de suEXEC (voir
184 <code>--with-suexec-docroot=<em>DIR</em></code> ci-dessous).
185 </p>
186 </li>
187
188 <li>
189 <strong>Le nom utilisateur cible est-il valide ?</strong>
190
191 <p class="indent">
192 L'utilisateur cible existe-t-il ?
193 </p>
194 </li>
195
196 <li>
197 <strong>Le nom du groupe cible est-il valide ?</strong>
198
199 <p class="indent">
200 Le groupe cible existe-t-il ?
201 </p>
202 </li>
203
204 <li>
205 <strong>L'utilisateur cible n'est-il <em>PAS</em>
206 superutilisateur ?</strong>
207
208
209 <p class="indent">
210 suEXEc ne permet pas �
211 <code><em>root</em></code> d'ex�cuter des programmes CGI/SSI.
212 </p>
213 </li>
214
215 <li>
216 <strong>Le num�ro de l'identifiant de l'utilisateur cible
217 est-il <em>SUPERIEUR</em> au num�ro d'identifiant
218 minimum ?</strong>
219
220 <p class="indent">
221 Le num�ro d'identifiant utilisateur minimum est d�fini �
222 l'ex�cution du script configure. Ceci vous permet de d�finir
223 le num�ro d'identifiant utilisateur le plus bas qui sera
224 autoris� � �x�cuter des programmes CGI/SSI. En particulier,
225 cela permet d'�carter les comptes syst�me.
226 </p>
227 </li>
228
229 <li>
230 <strong>Le groupe cible n'est-il <em>PAS</em> le groupe
231 superutilisateur ?</strong>
232
233 <p class="indent">
234 Actuellement, suEXEC ne permet pas au groupe
235 <code><em>root</em></code> d'ex�cuter des programmes CGI/SSI.
236 </p>
237 </li>
238
239 <li>
240 <strong> Le num�ro d'identifiant du groupe cible est-il
241 <em>SUPERIEUR</em> au num�ro d'identifiant minimum ?</strong>
242
243 <p class="indent">
244 Le num�ro d'identifiant de groupe minimum est sp�cifi� lors
245 de l'ex�cution du script configure. Ceci vous permet de
246 d�finir l'identifiant de groupe le plus bas possible qui sera
247 autoris� � ex�cuter des programmes CGI/SSI, et est
248 particuli�rement utile pour �carter les groupes "syst�me".
249 </p>
250 </li>
251
252 <li>
253 <strong>Le conteneur peut-il obtenir avec succ�s l'identit�
254 des utilisateur et groupe cibles ?</strong>
255
256 <p class="indent">
257 C'est ici que le programme obtient l'identit� des utilisateur
258 et groupe cibles via des appels � setuid et setgid. De m�me,
259 la liste des acc�s groupe est initialis�e avec tous les
260 groupes auxquels l'utilisateur cible appartient.
261 </p>
262 </li>
263
264 <li>
265 <strong>Peut-on se positionner dans le r�pertoire dans dequel
266 sont situ�s les programmes CGI/SSI ?</strong>
267
268 <p class="indent">
269 S'il n'existe pas, il ne peut pas contenir de fichier. Et si
270 l'on ne peut pas s'y positionner, il n'existe probablement
271 pas.
272 </p>
273 </li>
274
275 <li>
276 <strong>Le r�pertoire est-il dans l'espace web
277 de httpd ?</strong>
278
279 <p class="indent">
280 Si la requ�te concerne une portion de la racine du serveur,
281 le r�pertoire demand� est-il dans la hi�rarchie de la racine
282 des documents de suEXEC ? Si la requ�te concerne un
283 <code class="directive"><a href="./mod/mod_userdir.html#userdir">UserDir</a></code>, le r�pertoire demand� est-il dans
284 la hi�rarchie du r�pertoire d�fini comme le r�pertoire
285 utilisateur de suEXEC (voir les
286 <a href="#install">options de configuration de suEXEC</a>) ?
287 </p>
288 </li>
289
290 <li>
291 <strong>L'�criture dans le r�pertoire est-elle interdite pour
292 un utilisateur autre que le propri�taire </strong>
293
294 <p class="indent">
295 Le r�pertoire ne doit pas �tre ouvert aux autres
296 utilisateurs ; seul l'utilisateur propri�taire doit pouvoir
297 modifier le contenu du r�pertoire.
298 </p>
299 </li>
300
301 <li>
302 <strong>Le programme CGI/SSI cible existe-t-il ?</strong>
303
304 <p class="indent">
305 S'il n'existe pas, il ne peut pas �tre ex�cut�.
306 </p>
307 </li>
308
309 <li>
310 <strong>Les utilisateurs autres que le propri�taire n'ont-ils
311 <em>PAS</em> de droits en �criture sur le programme
312 CGI/SSI ?</strong>
313
314 <p class="indent">
315 Les utilisateurs autres que le propri�taire ne doivent pas
316 pouvoir modifier le programme CGI/SSI.
317 </p>
318 </li>
319
320 <li>
321 <strong>Le programme CGI/SSI n'est-il <em>PAS</em> setuid ou
322 setgid ?</strong>
323
324 <p class="indent">
325 Les programmes cibles ne doivent pas pouvoir modifier �
326 nouveau les identifiants utilisateur/groupe.
327 </p>
328 </li>
329
330 <li>
331 <strong>Le couple utilisateur/groupe cible est-il le m�me que
332 celui du programme ?</strong>
333
334 <p class="indent">
335 L'utilisateur est-il le propri�taire du fichier ?
336 </p>
337 </li>
338
339 <li>
340 <strong>Peut-on nettoyer avec succ�s l'environnement des
341 processus afin de garantir la s�ret� des op�rations ?</strong>
342
343 <p class="indent">
344 suExec nettoie l'environnement des processus en �tablissant
345 un chemin d'ex�cution s�r (d�fini lors de la configuration),
346 et en ne passant que les variables dont les noms font partie
347 de la liste de l'environnement s�r (cr��e de m�me lors de la
348 configuration).
349 </p>
350 </li>
351
352 <li>
353 <strong>Le conteneur peut-il avec succ�s se substituer au
354 programme CGI/SSI cible et s'ex�cuter ?</strong>
355
356 <p class="indent">
357 C'est l� o� l'ex�cution de suEXEC s'arr�te et o� commence
358 celle du programme CGI/ssi cible.
359 </p>
360 </li>
361 </ol>
362
363 <p>Ce sont les op�rations standards effectu�es par le mod�le de
364 s�curit� du conteneur suEXEC. Il peut para�tre strict et est
365 susceptible d'imposer de nouvelles limitations et orientations
366 dans la conception des programmes CGI/SSI, mais il a �t� d�velopp�
367 avec le plus grand soin, �tape par �tape, en se focalisant sur
368 la s�curit�.</p>
369
370 <p>Pour plus d'informations sur la mesure dans laquelle ce mod�le
371 de s�curit� peut limiter vos possibilit�s au regard de la
372 configuration du serveur, ainsi que les risques de s�curit� qui
373 peuvent �tre �vit�s gr�ce � une configuration appropri�e de suEXEC,
374 se r�f�rer � la section <a href="#jabberwock">"Avis � la population !"</a> de ce document.</p>
375</div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
376<div class="section">
377<h2><a name="install" id="install">Configurer et installer suEXEC</a></h2>
378
379 <p>C'est ici que nous entrons dans le vif du sujet.</p>
380
381 <p><strong>Options de configuration de suEXEC</strong><br />
382 </p>
383
384 <dl>
385 <dt><code>--enable-suexec</code></dt>
386
387 <dd>Cette option active la fonctionnalit� suEXEC qui n'est
388 jamais install�e ou activ�e par d�faut. Au moins une option
389 <code>--with-suexec-xxxxx</code> doit accompagner l'option
390 <code>--enable-suexec</code> pour qu'APACI (l'utilitaire de
391 configuration de la compilation d'Apache) accepte votre demande
392 d'utilisation de la fonctionnalit� suEXEC.</dd>
393
394 <dt><code>--with-suexec-bin=<em>PATH</em></code></dt>
395
396 <dd>Le chemin du binaire <code>suexec</code> doit �tre cod� en
397 dur dans le serveur pour des raisons de s�curit�. Cette option
398 vous permet de modifier le chemin par d�faut.
399 <em>Par exemple</em>
400 <code>--with-suexec-bin=/usr/sbin/suexec</code></dd>
401
402 <dt><code>--with-suexec-caller=<em>UID</em></code></dt>
403
404 <dd>L'<a href="mod/mpm_common.html#user">utilisateur</a> sous
405 lequel httpd s'ex�cute habituellement. C'est le seul utilisateur
406 autoris� � ex�cuter le wrapper suEXEC.</dd>
407
408 <dt><code>--with-suexec-userdir=<em>DIR</em></code></dt>
409
410 <dd>Cette option d�finit le sous-r�pertoire de la hi�rarchie des
411 r�pertoires utilisateurs dans lequel l'utilisation
412 de suEXEC sera autoris�e. Tous les ex�cutables situ�s dans ce
413 r�pertoire seront ex�cutables par suEXEC sous l'utilisateur
414 cible ; ces programmes doivent donc �tre s�rs. Si vous utilisez
415 une directive <code class="directive"><a href="./mod/mod_userdir.html#userdir">UserDir</a></code>
416 "simple" (c'est � dire ne contenant pas de
417 "*"), l'option --with-suexec-userdir
418 devra contenir la m�me valeur. SuEXEC ne fonctionnera pas
419 correctement si la directive <code class="directive"><a href="./mod/mod_userdir.html#userdir">UserDir</a></code> contient une valeur
420 diff�rente du r�pertoire home de l'utilisateur tel qu'il est
421 d�fini dans le fichier <code>passwd</code>. la valeur par d�faut
422 est "<code>public_html</code>".<br />
423 Si vous avez plusieurs h�tes virtuels avec une directive
424 <code class="directive"><a href="./mod/mod_userdir.html#userdir">UserDir</a></code> diff�rente
425 pour chacun d'entre eux, vous devrez faire en sorte que chaque
426 UserDir poss�de un r�pertoire parent commun ; donnez alors �
427 l'option --with-suexec-userdir le nom
428 de ce r�pertoire commun. <strong>Si tout ceci n'est pas d�fini
429 correctement, les requ�tes CGI "~userdir" ne fonctionneront
430 pas !</strong></dd>
431
432 <dt><code>--with-suexec-docroot=<em>DIR</em></code></dt>
433
434 <dd>Cette option fonctionne comme la directive DocumentRoot pour
435 httpd. Il s'agit de la seule hi�rarchie (en dehors des directives
436 <code class="directive"><a href="./mod/mod_userdir.html#userdir">UserDir</a></code>) dans laquelle la fonctionnalit� suEXEC
437 pourra �tre utilis�e. La valeur par d�faut est la valeur de
438 <code>--datadir</code> accompagn�e du suffixe
439 "<code>/htdocs</code>" ;
440 <em>Par exemple</em>, si vous ex�cutez configure avec
441 "<code>--datadir=/home/apache</code>", la valeur
442 "<code>/home/apache/htdocs</code>" sera utilis�e par d�faut comme
443 racine des documents pour le conteneur suEXEC.</dd>
444
445 <dt><code>--with-suexec-uidmin=<em>UID</em></code></dt>
446
447 <dd>Cette option d�finit l'identifiant utilisateur le plus bas
448 avec lequel un utilisateur pourra �tre la cible de
449 suEXEC. 500 ou 100 sont des valeurs courantes sur la plupart des
450 syst�mes. la valeur par d�faut est 100.</dd>
451
452 <dt><code>--with-suexec-gidmin=<em>GID</em></code></dt>
453
454 <dd>Cette option d�finit l'identifiant de groupe le plus bas
455 avec lequel un utilisateur pourra �tre la cible de
456 suEXEC. 100 est une valeur courante sur la plupart des
457 syst�mes et est par cons�quent la valeur par d�faut.</dd>
458
459 <dt><code>--with-suexec-logfile=<em>FILE</em></code></dt>
460
461 <dd>Cette option permet de d�finir le fichier dans lequel
462 toutes les transactions et erreurs de suEXEC seront journalis�es
463 (� des fins d'analyse ou de d�bogage). Par d�faut, le fichier
464 journal se nomme "<code>suexec_log</code>" et se trouve dans votre
465 r�pertoire standard des fichiers journaux d�fini par
466 <code>--logfiledir</code></dd>
467
468 <dt><code>--with-suexec-safepath=<em>PATH</em></code></dt>
469
470 <dd>Cette option permet de d�finir une variable d'environnement
471 PATH s�re � passer aux ex�cutables CGI. La valeur par d�faut
472 est "<code>/usr/local/bin:/usr/bin:/bin</code>".</dd>
473 </dl>
474
475 <h3>Compilation et installation du conteneur suEXEC</h3>
476
477
478 <p>Si vous avez activ� la fonctionnalit� suEXEC � l'aide de
479 l'option <code>--enable-suexec</code>, le binaire
480 <code>suexec</code> sera automatiquement construit (en m�me temps
481 que httpd) lorsque vous ex�cuterez la commande
482 <code>make</code>.</p>
483
484 <p>Lorsque tous les composants auront �t� construits, vous pourrez
485 ex�cuter la commande <code>make install</code> afin de les
486 installer. Le binaire <code>suexec</code> sera install� dans le
487 r�pertoire d�fini � l'aide de l'option <code>--sbindir</code>. La
488 localisation par d�faut est "/usr/local/apache2/bin/suexec".</p>
489 <p>Veuillez noter que vous aurez besoin des
490 <strong><em>privil�ges root</em></strong> pour passer l'�tape de
491 l'installation. Pour que le conteneur puisse changer
492 l'identifiant utilisateur, il doit avoir comme propri�taire
493 <code><em>root</em></code>, et les droits du fichier doivent
494 inclure le bit d'ex�cution setuserid.</p>
495
496
497 <h3>&gt;Mise en place de permissions pour
498 parano�aque</h3>
499
500 <p>Bien que le conteneur suEXEC v�rifie que l'utilisateur qui
501 l'appelle correspond bien � l'utilisateur sp�cifi� � l'aide de
502 l'option <code>--with-suexec-caller</code> du programme
503 <code class="program"><a href="./programs/configure.html">configure</a></code>, il subsiste toujours le risque qu'un
504 appel syst�me ou une biblioth�que fasse appel � suEXEC avant que
505 cette v�rification ne soit exploitable sur votre syst�me. Pour
506 tenir compte de ceci, et parce que c'est en g�n�ral la meilleure
507 pratique, vous devez utiliser les permissions du syst�me de
508 fichiers afin de vous assurer que seul le groupe sous lequel
509 s'ex�cute httpd puisse faire appel � suEXEC.</p>
510
511 <p>Si, par exemple, votre serveur web est configur� pour
512 s'ex�cuter en tant que :</p>
513
514<pre class="prettyprint lang-config">User www
515Group webgroup</pre>
516
517
518 <p>et <code class="program"><a href="./programs/suexec.html">suexec</a></code> se trouve �
519 "/usr/local/apache2/bin/suexec", vous devez ex�cuter les
520 commandes</p>
521
522<div class="example"><p><code>
523 chgrp webgroup /usr/local/apache2/bin/suexec<br />
524 chmod 4750 /usr/local/apache2/bin/suexec<br />
525</code></p></div>
526
527 <p>Ceci permet de s'assurer que seul le groupe sous lequel httpd
528 s'ex�cute (ici webgroup) puisse faire appel au conteneur
529 suEXEC.</p>
530
531</div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
532<div class="section">
533<h2><a name="enable" id="enable">Activation et d�sactivation
534de suEXEC</a></h2>
535
536 <p>Au d�marrage, httpd v�rifie la pr�sence du fichier
537 <code class="program"><a href="./programs/suexec.html">suexec</a></code> dans le r�pertoire d�fini par
538 l'option <code>--sbindir</code> du script configure (le
539 r�pertoire par d�faut est "/usr/local/apache/sbin/suexec"). Si
540 httpd trouve un conteneur suEXEC correctement configur�, il
541 enregistrera le message suivant dans le journal des erreurs :</p>
542
543<div class="example"><p><code>
544 [notice] suEXEC mechanism enabled (wrapper: <var>/path/to/suexec</var>)
545</code></p></div>
546
547 <p>Si ce message n'est pas g�n�r� au d�marrage du serveur, ce
548 dernier ne trouve probablement pas le programme conteneur �
549 l'endroit o� il est sens� �tre, ou l'ex�cutable suexec n'est pas
550 install� en <em>setuid root</em>.</p>
551
552 <p>Si le serveur HTTP Apache est d�j� en cours d'ex�cution, et si
553 vous activez le m�canisme suEXEC pour la premi�re fois, vous
554 devez arr�ter et red�marrer httpd. Un red�marrage
555 � l'aide d'un simple signal HUP ou USR1 suffira. </p>
556 <p>Pour d�sactiver suEXEC, vous devez supprimer le fichier
557 <code class="program"><a href="./programs/suexec.html">suexec</a></code>, puis arr�ter et red�marrer
558 httpd.</p>
559</div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
560<div class="section">
561<h2><a name="usage" id="usage">Utilisation de suEXEC</a></h2>
562
563 <p>Les requ�tes pour des programmes CGI ne feront appel au
564 conteneur suEXEC que si elles concernent un h�te virtuel
565 contenant une directive <code class="directive"><a href="./mod/mod_suexec.html#suexecusergroup">SuexecUserGroup</a></code>, ou si elles sont
566 trait�es par <code class="module"><a href="./mod/mod_userdir.html">mod_userdir</a></code>.</p>
567
568 <p><strong>H�tes virtuels :</strong><br /> Une des m�thodes
569 d'utilisation du conteneur suEXEC consiste � ins�rer une
570 directive <code class="directive"><a href="./mod/mod_suexec.html#suexecusergroup">SuexecUserGroup</a></code> dans une section
571 <code class="directive"><a href="./mod/core.html#virtualhost">VirtualHost</a></code>. En d�finissant
572 des valeurs diff�rentes de celles du serveur principal, toutes les
573 requ�tes pour des ressources CGI seront ex�cut�es sous
574 les <em>User</em> et <em>Group</em> d�finis pour cette section
575 <code class="directive"><a href="./mod/core.html#virtualhost">&lt;VirtualHost&gt;</a></code>. Si cette
576 directive est absente de la section <code class="directive"><a href="./mod/core.html#virtualhost">&lt;VirtualHost&gt;</a></code>, l'utilisateur du
577 serveur principal sera pris par d�faut</p>
578
579 <p><strong>R�pertoires des utilisateurs :</strong><br /> Avec
580 cette m�thode, les
581 requ�tes trait�es par <code class="module"><a href="./mod/mod_userdir.html">mod_userdir</a></code> appelleront le
582 conteneur suEXEC pour ex�cuter le programme CGI sous l'identifiant
583 utilisateur du r�pertoire utilisateur concern�. Seuls pr�requis
584 pour pouvoir acc�der � cette fonctionnalit� : l'ex�cution des CGI
585 doit �tre activ�e pour l'utilisateur concern�, et le script doit
586 passer avec succ�s le test des <a href="#model">v�rifications de
587 s�curit�</a> d�crit plus haut. Voir aussi l'
588 <a href="#install">option de compilation</a>
589 <code>--with-suexec-userdir</code>.</p> </div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
590<div class="section">
591<h2><a name="debug" id="debug">D�bogage de suEXEC</a></h2>
592
593 <p>Le conteneur suEXEC va �crire ses informations de journalisation
594 dans le fichier d�fini par l'option de compilation
595 <code>--with-suexec-logfile</code> comme indiqu� plus haut. Si vous
596 pensez avoir configur� et install� correctement le conteneur,
597 consultez ce journal, ainsi que le journal des erreurs du serveur
598 afin de d�terminer l'endroit o� vous avez fait fausse route.</p>
599
600</div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
601<div class="section">
602<h2><a name="jabberwock" id="jabberwock">Avis � la population !
603 Avertissements et exemples</a></h2>
604
605 <p><strong>NOTE !</strong> Cette section est peut-�tre incompl�te.
606 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>
607
608 <p>Quelques points importants du conteneur peuvent
609 imposer des contraintes du point de vue de la configuration du
610 serveur. Veuillez en prendre connaissance avant de soumettre un
611 rapport de bogue � propos de suEXEC.</p>
612
613 <ul>
614 <li><strong>Points importants de suEXEC</strong></li>
615
616 <li>
617 Limitations concernant la hi�rarchie.
618
619 <p class="indent">
620 Pour des raisons de s�curit� et d'efficacit�, toutes les
621 requ�tes suEXEC ne doivent concerner que des ressources
622 situ�es dans la racine des documents d�finie pour les
623 requ�tes concernant un h�te virtuel, ou des ressources
624 situ�es dans la racine des documents d�finies pour les
625 requ�tes concernant un r�pertoire utilisateur. Par exemple,
626 si vous avez configur� quatre h�tes virtuels, vous devrez
627 d�finir la structure des racines de documents de vos h�tes
628 virtuels en dehors d'une hi�rarchie de documents principale
629 de httpd, afin de tirer parti de suEXEC dans le contexte des
630 h�tes virtuels (Exemple � venir).
631 </p>
632 </li>
633
634 <li>
635 La variable d'environnement PATH de suEXEC
636
637 <p class="indent">
638 Modifier cette variable peut s'av�rer dangereux. Assurez-vous
639 que tout chemin que vous ajoutez � cette variable est un
640 r�pertoire <strong>de confiance</strong>. Vous n'avez
641 probablement pas l'intention d'ouvrir votre serveur de fa�on
642 � ce que l'on puisse y ex�cuter un cheval de Troie.
643 </p>
644 </li>
645
646 <li>
647 Modification de suEXEC
648
649 <p class="indent">
650 Encore une fois, ceci peut vous causer de
651 <strong>graves ennuis</strong> si vous vous y essayez sans
652 savoir ce que vous faites. Evitez de vous y risquer dans la
653 mesure du possible.
654 </p>
655 </li>
656 </ul>
657
658</div></div>
659<div class="bottomlang">
660<p><span>Langues Disponibles: </span><a href="./en/suexec.html" hreflang="en" rel="alternate" title="English">&nbsp;en&nbsp;</a> |
661<a href="./fr/suexec.html" title="Fran�ais">&nbsp;fr&nbsp;</a> |
662<a href="./ja/suexec.html" hreflang="ja" rel="alternate" title="Japanese">&nbsp;ja&nbsp;</a> |
663<a href="./ko/suexec.html" hreflang="ko" rel="alternate" title="Korean">&nbsp;ko&nbsp;</a> |
664<a href="./tr/suexec.html" hreflang="tr" rel="alternate" title="T�rk�e">&nbsp;tr&nbsp;</a></p>
665</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>
666<script type="text/javascript"><!--//--><![CDATA[//><!--
667var comments_shortname = 'httpd';
668var comments_identifier = 'http://httpd.apache.org/docs/2.4/suexec.html';
669(function(w, d) {
670 if (w.location.hostname.toLowerCase() == "httpd.apache.org") {
671 d.write('<div id="comments_thread"><\/div>');
672 var s = d.createElement('script');
673 s.type = 'text/javascript';
674 s.async = true;
675 s.src = 'https://comments.apache.org/show_comments.lua?site=' + comments_shortname + '&page=' + comments_identifier;
676 (d.getElementsByTagName('head')[0] || d.getElementsByTagName('body')[0]).appendChild(s);
677 }
678 else {
679 d.write('<div id="comments_thread">Comments are disabled for this page at the moment.<\/div>');
680 }
681})(window, document);
682//--><!]]></script></div><div id="footer">
683<p class="apache">Copyright 2017 The Apache Software Foundation.<br />Autoris� sous <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a>.</p>
684<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[//><!--
685if (typeof(prettyPrint) !== 'undefined') {
686 prettyPrint();
687}
688//--><!]]></script>
689</body></html>
0\ No newline at end of file690\ No newline at end of file
diff --git a/docs/manual/suexec.html.ja.utf8 b/docs/manual/suexec.html.ja.utf8
1new file mode 100644691new file mode 100644
index 0000000..31fd90d
--- /dev/null
+++ b/docs/manual/suexec.html.ja.utf8
@@ -0,0 +1,643 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3<html xmlns="http://www.w3.org/1999/xhtml" lang="ja" xml:lang="ja"><head>
4<meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
5<!--
6 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
7 This file is generated from xml source: DO NOT EDIT
8 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
9 -->
10<title>suEXEC サポート - Apache HTTP サーバ バージョン 2.4</title>
11<link href="./style/css/manual.css" rel="stylesheet" media="all" type="text/css" title="Main stylesheet" />
12<link href="./style/css/manual-loose-100pc.css" rel="alternate stylesheet" media="all" type="text/css" title="No Sidebar - Default font size" />
13<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" />
14<script src="./style/scripts/prettify.min.js" type="text/javascript">
15</script>
16
17<link href="./images/favicon.ico" rel="shortcut icon" /></head>
18<body id="manual-page"><div id="page-header">
19<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>
20<p class="apache">Apache HTTP サーバ バージョン 2.4</p>
21<img alt="" src="./images/feather.png" /></div>
22<div class="up"><a href="./"><img title="&lt;-" alt="&lt;-" src="./images/left.gif" /></a></div>
23<div id="path">
24<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>
25<div class="toplang">
26<p><span>翻訳済み言語: </span><a href="./en/suexec.html" hreflang="en" rel="alternate" title="English">&nbsp;en&nbsp;</a> |
27<a href="./fr/suexec.html" hreflang="fr" rel="alternate" title="Français">&nbsp;fr&nbsp;</a> |
28<a href="./ja/suexec.html" title="Japanese">&nbsp;ja&nbsp;</a> |
29<a href="./ko/suexec.html" hreflang="ko" rel="alternate" title="Korean">&nbsp;ko&nbsp;</a> |
30<a href="./tr/suexec.html" hreflang="tr" rel="alternate" title="Türkçe">&nbsp;tr&nbsp;</a></p>
31</div>
32<div class="outofdate">この日本語訳はすでに古くなっている
33 可能性があります。
34 最近更新された内容を見るには英語版をご覧下さい。
35 </div>
36
37 <p><strong>suEXEC</strong>
38 機能により、Apache ユーザは Web サーバを実行しているユーザ ID とは
39 異なるユーザ ID で <strong>CGI</strong> プログラムや <strong>SSI</strong>
40 プログラムを実行することができます。CGI プログラムまたは SSI
41 プログラムを実行する場合、通常は web サーバと同じユーザで実行されます。
42 </p>
43
44 <p>適切に使用すると、この機能によりユーザが個別の CGI
45 や SSI プログラムを開発し実行することで生じるセキュリティ上の危険を、
46 かなり減らすことができます。しかし、suEXEC の設定が不適切だと、
47 多くの問題が生じ、あなたのコンピュータに新しいセキュリティホールを
48 作ってしまう可能性があります。あなたが <em>setuid root</em>
49 されたプログラムと、それらから生じるセキュリティ上の問題の管理に
50 詳しくないようなら、suEXEC の使用を検討しないように強く推奨します。
51 </p>
52 </div>
53<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>
54<li><img alt="" src="./images/down.gif" /> <a href="#model">suEXEC セキュリティモデル</a></li>
55<li><img alt="" src="./images/down.gif" /> <a href="#install">suEXEC
56 の設定とインストール</a></li>
57<li><img alt="" src="./images/down.gif" /> <a href="#enable">suEXEC
58 の有効化と無効化</a></li>
59<li><img alt="" src="./images/down.gif" /> <a href="#usage">suEXEC の使用</a></li>
60<li><img alt="" src="./images/down.gif" /> <a href="#debug">suEXEC のデバッグ</a></li>
61<li><img alt="" src="./images/down.gif" /> <a href="#jabberwock">とかげに注意: 警告と事例</a></li>
62</ul><h3>参照</h3><ul class="seealso"><li><a href="#comments_section">コメント</a></li></ul></div>
63<div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
64<div class="section">
65<h2><a name="before" id="before">始める前に</a></h2>
66
67 <p>この文書の先頭に飛ぶ前に、Apache
68 グループとこの文書での仮定を知っておくべきでしょう。
69 </p>
70
71 <p>第 1 に、あなたが <strong>setuid</strong> と
72 <strong>setgid</strong> 操作が可能な UNIX
73 由来のオペレーティングシステムを使っていることを想定しています。
74 これは、すべてのコマンド例にあてはまります。
75 その他のプラットホームでは、もし suEXEC
76 がサポートされていたとしても設定は異なるかもしれません。</p>
77
78 <p>第 2 に、あなたが使用中のコンピュータの
79 セキュリティに関する基本的な概念と、それらの管理について詳しいことを
80 想定しています。これは、<strong>setuid/setgid</strong>
81 操作、あなたのシステム上でのその操作による様々な効果、
82 セキュリティレベルについてあなたが理解しているということを含みます。
83 </p>
84
85 <p>第 3 に、<strong>改造されていない</strong> suEXEC
86 コードの使用を想定しています。suEXEC のコードは、
87 多くのベータテスタだけでなく、開発者によっても注意深く精査され
88 テストされています。それらの注意により、簡潔で信頼できる安全な
89 コードの基盤が保証されます。このコードを改変することで、
90 予期されない問題や新しいセキュリティ上の危険が生じることがあります。
91 セキュリティプログラミングの詳細に通じていて、
92 今後の検討のために成果を Apache
93 グループと共有しようと思うのでなければ、suEXEC
94 コードは変えないことを <strong>強く</strong>推奨します。</p>
95
96 <p>第 4 に、これが最後ですが、suEXEC を Apache
97 のデフォルトインストールには<strong>含めない</strong>ことが
98 Apache グループで決定されています。これは、suEXEC
99 の設定には管理者の詳細にわたる慎重な注意が必要だからです。
100 suEXEC の様々な設定について検討が終われば、管理者は suEXEC
101 を通常のインストール方法でインストールすることができます。
102 これらの設定値は、suEXEC
103 機能の使用中にシステムセキュリティを適切に保つために、
104 管理者によって慎重に決定され指定されることが必要です。
105 この詳細な手順により、Apache グループは、suEXEC
106 のインストールについて、注意深く十分に検討してそれを使用することを
107 決定した場合に限っていただきたいと考えています。
108 </p>
109
110 <p>それでも進みますか? よろしい。では、先へ進みましょう!</p>
111 </div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
112<div class="section">
113<h2><a name="model" id="model">suEXEC セキュリティモデル</a></h2>
114
115 <p>suEXEC の設定とインストールを始める前に、
116 まず実装しようとしているセキュリティモデルについて論じておきます。
117 それには、suEXEC の内部で行なわれていること、
118 システムのセキュリティを保証するために警告されることを
119 よく理解しておいた方がよいでしょう。</p>
120
121 <p><strong>suEXEC</strong> は、Apache web
122 サーバから呼び出される setuid された "wrapper"
123 プログラムが基本となっています。設計した CGI、または SSI
124 プログラムへの HTTP リクエストがあると、この wrapper
125 が呼び出されます。このようなリクエストがあると、Apache
126 はそのプログラムが実行される際のプログラム名とユーザ ID とグループ
127 ID を指定して suEXEC wrapper を実行します。
128 </p>
129
130 <p>それから、wrapper は成功または失敗を決定するため
131 以下の処理を行ないます。これらの状態のうち一つでも失敗した場合、
132 プログラムは失敗をログに記録してエラーで終了します。
133 そうでなければ、後の処理が続けられます。</p>
134
135 <ol>
136 <li>
137 <strong>wrapper
138 を実行しているユーザはこのシステムの正当なユーザか?</strong>
139
140 <p class="indent">
141 これは、wrapper を実行しているユーザが
142 本当にシステムの利用者であることを保証するためです。
143 </p>
144 </li>
145
146
147 <li>
148 <strong>wrapper が適切な数の引数で呼び出されたか?</strong>
149
150
151 <p class="indent">
152 wrapper は適切な数の引数が与えられた場合にのみ実行されます。
153 適切な引数のフォーマットは Apache Web サーバに解釈されます。
154 適切な数の引数を受け取らなければ、攻撃をされたか
155 あなたの Apache バイナリの suEXEC の部分が
156 どこかおかしい可能性があります。
157 </p>
158 </li>
159
160 <li>
161 <strong>この正当なユーザは wrapper
162 の実行を許可されているか?</strong>
163
164 <p class="indent">
165 このユーザは wrapper 実行を許可されたユーザですか?
166 ただ一人のユーザ (Apache ユーザ) だけが、
167 このプログラムの実行を許可されます。
168 </p>
169 </li>
170
171 <li>
172 <strong>対象の CGI, SSI プログラムが安全でない階層の参照をしているか?
173 </strong>
174
175 <p class="indent">
176 対象の CGI, SSI プログラムが '/' から始まる、または
177 '..' による参照を行なっていますか? これらは許可されません。
178 対象のプログラムは suEXEC のドキュメントルート
179 (下記の <code>--with-suexec-docroot=<em>DIR</em></code> を参照)
180 内に存在しなければなりません。
181 </p>
182 </li>
183
184 <li>
185 <strong>対象となるユーザ名は正当なものか?</strong>
186
187 <p class="indent">
188 対象となるユーザ名は存在していますか?
189 </p>
190 </li>
191
192 <li>
193 <strong>対象となるグループ名は正当なものか?</strong>
194
195 <p class="indent">
196 対象となるグループ名は存在していますか?
197 </p>
198 </li>
199
200 <li>
201 <strong>目的のユーザはスーパーユーザでは<em>ない</em>か?
202 </strong>
203
204 <p class="indent">
205 今のところ、suEXEC は <code><em>root</em></code> による CGI/SSI
206 プログラムの実行を許可していません。
207 </p>
208 </li>
209
210 <li>
211 <strong>対象となるユーザ ID は、最小の ID
212 番号よりも<em>大きい</em>か? </strong>
213
214 <p class="indent">
215 最小ユーザ ID 番号は設定時に指定されます。これは、
216 CGI/SSI プログラム実行を許可されるユーザ ID
217 のとりうる最小値です。これは
218 "system" 用のアカウントを閉め出すのに有効です。
219 </p>
220 </li>
221
222 <li>
223 <strong>対象となるグループはスーパーユーザのグループでは
224 <em>ない</em>か?</strong>
225
226 <p class="indent">
227 今のところ、suEXEC は 'root' グループによる CGI/SSI
228 プログラムの実行を許可していません。
229 </p>
230 </li>
231
232 <li>
233 <strong>対象となるグループ ID は最小の ID
234 番号よりも<em>大きい</em>か?</strong>
235
236 <p class="indent">
237 最小グループ ID 番号は設定時に指定されます。これは、
238 CGI/SSI プログラム実行を許可されるグループ
239 ID のとりうる最小値です。
240 これは "system" 用のグループを閉め出すのに有効です。
241 </p>
242 </li>
243
244 <li>
245 <strong>wrapper が正常に対象となるユーザとグループになれるか?
246 </strong>
247
248 <p class="indent">
249 ここで、setuid と setgid
250 の起動によりプログラムは対象となるユーザとグループになります。
251 グループアクセスリストは、
252 ユーザが属しているすべてのグループで初期化されます。
253 </p>
254 </li>
255
256 <li>
257 <strong>CGI/SSI プログラムが置かれているディレクトリに移動
258 (change directory) できるか?</strong>
259
260 <p class="indent">
261 ディレクトリが存在しないなら、そのファイルも存在しないかもしれません。
262 ディレクトリに移動できないのであれば、おそらく存在もしないでしょう。
263 </p>
264 </li>
265
266 <li>
267 <strong>ディレクトリが Apache のドキュメントツリー内にあるか?
268 </strong>
269
270 <p class="indent">
271 リクエストがサーバ内のものであれば、
272 要求されたディレクトリが suEXEC のドキュメントルート配下にありますか?
273 リクエストが UserDir のものであれば、要求されたディレクトリが suEXEC
274 のユーザのドキュメントルート配下にありますか?
275 (<a href="#install">suEXEC 設定オプション</a> 参照)
276 </p>
277 </li>
278
279 <li>
280 <strong>ディレクトリを他のユーザが書き込めるようになって
281 <em>いない</em>か?</strong>
282
283 <p class="indent">
284 ディレクトリを他ユーザに開放しないようにします。
285 所有ユーザだけがこのディレクトリの内容を改変できるようにします。
286 </p>
287 </li>
288
289
290 <li>
291 <strong>対象となる CGI/SSI プログラムは存在するか?</strong>
292
293 <p class="indent">
294 存在しなければ実行できません。
295 </p>
296 </li>
297
298 <li>
299 <strong>対象となる CGI/SSI プログラムファイルが他アカウントから
300 書き込めるようになって<em>いない</em>か?</strong>
301
302 <p class="indent">
303 所有者以外には CGI/SSI プログラムを変更する権限は与えられません。
304 </p>
305 </li>
306
307
308 <li>
309 <strong>対象となる CGI/SSI プログラムが setuid または setgid
310 されて<em>いない</em>か?</strong>
311
312 <p class="indent">
313 UID/GID を再度変更してのプログラム実行はしません
314 </p>
315 </li>
316
317
318 <li>
319 <strong>対象となるユーザ/グループがプログラムの
320 ユーザ/グループと同じか?</strong>
321
322 <p class="indent">
323 ユーザがそのファイルの所有者ですか?
324 </p>
325 </li>
326
327 <li>
328 <strong>安全な動作を保証するための環境変数クリアが可能か?
329 </strong>
330
331 <p class="indent">
332 suEXEC は、安全な環境変数のリスト
333 (これらは設定時に作成されます) 内の変数として渡される安全な
334 PATH 変数 (設定時に指定されます) を設定することで、
335 プロセスの環境変数をクリアします。
336 </p>
337 </li>
338
339
340 <li>
341 <strong>対象となる CGI/SSI プログラムを exec して実行できるか?</strong>
342
343
344 <p class="indent">
345 ここで suEXEC が終了し、対象となるプログラムが開始されます。
346 </p>
347 </li>
348 </ol>
349
350 <p>ここまでが suEXEC の wrapper
351 におけるセキュリティモデルの標準的な動作です。もう少し厳重に
352 CGI/SSI 設計についての新しい制限や規定を取り入れることもできますが、
353 suEXEC はセキュリティに注意して慎重に少しずつ開発されてきました。
354 </p>
355
356 <p>このセキュリティモデルを用いて
357 サーバ設定時にどのように許すことを制限するか、また、suEXEC
358 を適切に設定するとどのようなセキュリティ上の危険を避けられるかに
359 関するより詳しい情報については、<a href="#jabberwock">"とかげに注意"
360 (Beware the Jabberwock)</a> の章を参照してください。
361 </p>
362 </div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
363<div class="section">
364<h2><a name="install" id="install">suEXEC
365 の設定とインストール</a></h2>
366
367 <p>ここから楽しくなります。</p>
368
369 <p><strong>suEXEC
370 設定オプション</strong><br />
371 </p>
372
373 <dl>
374 <dt><code>--enable-suexec</code></dt>
375
376 <dd>このオプションは、デフォルトではインストールされず、
377 有効にはならない suEXEC 機能を有効にします。
378 suEXEC を使うように APACI に要求するには、<code>--enable-suexec</code>
379 オプションにあわせて少なくとも一つは <code>--with-suexec-xxxxx</code>
380 オプションが指定されなければなりません。</dd>
381
382 <dt><code>--with-suexec-bin=<em>PATH</em></code></dt>
383
384 <dd>セキュリティ上の理由により、<code>suexec</code> バイナリのパスはサーバに
385 ハードコードされている必要があります。デフォルトのパスを
386 変えたいときはこのオプションを使ってください。<em>例えば</em>、
387 <code>--with-suexec-bin=/usr/sbin/suexec</code> のように。</dd>
388
389 <dt><code>--with-suexec-caller=<em>UID</em></code></dt>
390
391 <dd>Apache を通常動作させる<a href="mod/mpm_common.html#user">ユーザ名</a>を指定します。
392 このユーザだけが suexec の実行を許可されたユーザになります。</dd>
393
394 <dt><code>--with-suexec-userdir=<em>DIR</em></code></dt>
395
396 <dd>suEXEC がアクセスを許されるユーザホームディレクトリ配下の
397 サブディレクトリを指定します。
398 このディレクトリ以下の全実行ファイルは、"安全な"プログラムになるよう、
399 suEXEC がそのユーザとして実行できるようにします。
400 "単純な" UserDir ディレクティブを使っている場合
401 (すなわち "*" を含まないもの)、これと同じ値を設定すべきです。
402 Userdir ディレクティブがそのユーザのパスワードファイル内の
403 ホームディレクトリと同じ場所を指していなければ、
404 suEXEC は適切に動作しません。デフォルトは "public_html" です。
405 <br />
406 各 UserDir が異なった仮想ホストを設定している場合、
407 それらを全て一つの親ディレクトリに含めて、
408 その親ディレクトリの名前をここで指定する必要があります。
409 <strong>このように指定されなければ "~userdir" cgi
410 へのリクエストが動作しません。</strong></dd>
411
412 <dt><code>--with-suexec-docroot=<em>DIR</em></code></dt>
413
414 <dd>Apache のドキュメントルートを設定します。これが suEXEC
415 の動作で使用する唯一のディレクトリ階層になります (UserDir
416 の指定は別)。デフォルトでは <code>--datedir</code> に "/htdocs"
417 というサフィックスをつけたものです。
418 "<code>--datadir=/home/apache</code>" として設定すると、
419 suEXEC wrapper にとって "/home/apache/htdocs"
420 がドキュメントルートとして使われます。</dd>
421
422 <dt><code>--with-suexec-uidmin=<em>UID</em></code></dt>
423
424 <dd>suEXEC の対象ユーザとして許される UID の最小値を指定します。
425 大抵のシステムでは 500 か 100 が一般的です。
426 デフォルト値は 100 です。</dd>
427
428 <dt><code>--with-suexec-gidmin=<em>GID</em></code></dt>
429
430 <dd>suEXEC の対象グループとして許される GID
431 の最小値を指定します。大抵のシステムでは 100 が一般的なので、
432 デフォルト値としても 100 が使われています。</dd>
433
434 <dt><code>--with-suexec-logfile=<em>FILE</em></code></dt>
435
436 <dd>suEXEC の処理とエラーが記録されるファイル名を指定します。
437 (監査やデバッグ目的に有用)
438 デフォルトではログファイルは "suexec_log" という名前で、
439 標準のログファイルディレクトリ (<code>--logfiledir</code>) に置かれます。
440 </dd>
441
442 <dt><code>--with-suexec-safepath=<em>PATH</em></code></dt>
443
444 <dd>CGI 実行ファイルに渡される安全な PATH 環境変数です。
445 デフォルト値は "/usr/local/bin:/usr/bin:/bin" です。
446 </dd>
447 </dl>
448
449 <p><strong>suEXEC wrapper
450 のコンパイルとインストール</strong><br />
451 <code>--enable-suexec</code> オプションで suEXEC 機能を有効にすると、
452 "make" コマンドを実行した時に <code>suexec</code> のバイナリ (Apache 自体も)
453 が自動的に作成されます。
454 <br />
455 すべての構成要素が作成されると、それらのインストールには
456 <code>make install</code> コマンドが実行できます。バイナリイメージの <code>suexec</code>
457 は <code>--sbindir</code> オプションで指定されたディレクトリにインストールされます。
458 デフォルトの場所は "/usr/local/apache/bin/suexec" です。<br />
459 インストール時には <strong><em>root</em></strong>
460 権限が必要なので注意してください。wrapper がユーザ ID
461 を設定するために、所有者 <code><em>root</em></code>
462 でのセットユーザ ID
463 ビットをそのファイルのモードに設定しなければなりません。
464 </p>
465
466 <p><strong>安全なパーミッションを設定する</strong><br />
467 suEXEC ラッパーは、<code>--with-suexec-caller</code> <code class="program"><a href="./programs/configure.html">configure</a></code>
468 オプションで指定した正しいユーザで起動されていることを確認しますが、
469 システム上でこのチェックが行なわれる前に、
470 suEXEC が呼ぶシステムやライブラリが脆弱である可能性は残ります。対抗策として、
471 一般に良い習慣ともされいますが、
472 ファイルシステムパーミッションを使って
473 Apache の実行時のグループのみが suEXEC を実行できるように
474 するのが良いでしょう。</p>
475
476 <p>たとえば、次のようにサーバが設定されていたとします。</p>
477
478<div class="example"><p><code>
479 User www<br />
480 Group webgroup<br />
481</code></p></div>
482
483 <p><code class="program"><a href="./programs/suexec.html">suexec</a></code> が "/usr/local/apache2/bin/suexec"
484 にインストールされていた場合、次のように設定する必要があります。</p>
485
486<div class="example"><p><code>
487 chgrp webgroup /usr/local/apache2/bin/suexec<br />
488 chmod 4750 /usr/local/apache2/bin/suexec<br />
489</code></p></div>
490
491 <p>これで Apache が実行されるグループのみが
492 suEXEC ラッパーを実行できるということを
493 確証します。</p>
494 </div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
495<div class="section">
496<h2><a name="enable" id="enable">suEXEC
497 の有効化と無効化</a></h2>
498
499 <p>起動時に、Apache は <code>--sbindir</code>
500 オプションで設定されたディレクトリで
501 <code>suexec</code> を探します
502 (デフォルトは "/usr/local/apache/sbin/suexec") 。
503 適切に設定された suEXEC がみつかると、
504 エラーログに以下のメッセージが出力されます。</p>
505
506<div class="example"><p><code>
507 [notice] suEXEC mechanism enabled (wrapper: <var>/path/to/suexec</var>)
508</code></p></div>
509
510 <p>サーバ起動時にこのメッセージが出ない場合、
511 大抵はサーバが想定した場所で wrapper プログラムが見つからなかったか、
512 <em>setuid root</em> としてインストールされていないかです。</p>
513
514 <p>suEXEC の仕組みを使用するのが初めてで、Apache が既に動作中であれば、
515 Apache を kill して、再起動しなければなりません。HUP シグナルや
516 USR1 シグナルによる単純な再起動では不十分です。</p>
517 <p>suEXEC を無効にする場合は、<code>suexec</code> ファイルを削除してから
518 Apache を kill して再起動します。
519 </p>
520 </div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
521<div class="section">
522<h2><a name="usage" id="usage">suEXEC の使用</a></h2>
523
524 <p>CGI プログラムへのリクエストが suEXEC ラッパーを呼ぶのは、
525 <code class="directive"><a href="./mod/mod_suexec.html#suexecusergroup">SuexecUserGroup</a></code> ディレクティブを
526 含むバーチャルホストへのリクエストか、<code class="module"><a href="./mod/mod_userdir.html">mod_userdir</a></code> により
527 処理されたリクエストの場合に限ります。</p>
528
529 <p><strong>仮想ホスト:</strong><br />
530 suEXEC wrapper の使い方として、
531 <code class="directive"><a href="./mod/core.html#virtualhost">VirtualHost</a></code> 設定での
532 <code class="directive"><a href="./mod/mod_suexec.html#suexecusergroup">SuexecUserGroup</a></code>
533 ディレクティブを通したものがあります。
534 このディレクティブをメインサーバのユーザ ID
535 と異なるものにすると、CGI リソースへのすべてのリクエストは、その
536 <code class="directive"><a href="./mod/core.html#virtualhost">&lt;VirtualHost&gt;</a></code> で指定された <em>User</em> と
537 <em>Group</em> として実行されます。<code class="directive"><a href="./mod/core.html#virtualhost">&lt;VirtualHost&gt;</a></code>
538 でこのディレクティブが指定されていない場合、
539 メインサーバのユーザ ID が想定されます。</p>
540
541 <p><strong>ユーザディレクトリ:</strong><br />
542 <code class="module"><a href="./mod/mod_userdir.html">mod_userdir</a></code> により処理されたリクエストは
543 リクエストされたユーザディレクトリのユーザ ID で CGI プログラムを
544 実行するために suEXEC ラッパーを呼びます。
545 この機能を動作させるために必要なことは、CGI
546 をそのユーザで実行できること、そのスクリプトが上記の<a href="#model">セキュリティ検査</a>をパスできることです。
547 <a href="#install">コンパイル
548 時のオプション</a> <code>--with-suexec-userdir</code> も参照してください。</p>
549 </div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
550<div class="section">
551<h2><a name="debug" id="debug">suEXEC のデバッグ</a></h2>
552
553 <p>suEXEC wrapper は、上記で述べた <code>--with-suexec-logfile</code>
554 オプションで指定されたファイルにログ情報を記録します。
555 wrapper を適切に設定、インストールできていると思う場合、
556 どこで迷っているか見ようとするならこのログとサーバの
557 エラーログを見るとよいでしょう。</p>
558 </div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
559<div class="section">
560<h2><a name="jabberwock" id="jabberwock">とかげに注意: 警告と事例</a></h2>
561
562 <p><strong>注意!</strong>
563 この章は完全ではありません。この章の最新改訂版については、
564 Apache グループの<a href="http://httpd.apache.org/docs/2.4/suexec.html">
565 オンラインドキュメント</a>版を参照してください。
566 </p>
567
568 <p>サーバの設定に制限をもうける wrapper について、
569 いくつか興味深い点があります。suEXEC に関する "バグ"
570 を報告する前にこれらを確認してください。</p>
571
572 <ul>
573 <li><strong>suEXEC の興味深い点</strong></li>
574
575 <li>階層構造の制限
576
577
578 <p class="indent">
579 セキュリティと効率の理由から、<code>suEXEC</code> の全てのリクエストは
580 仮想ホストへのリクエストにおける最上位のドキュメントルート内か、
581 ユーザディレクトリへのリクエストにおける個々のユーザの最上位の
582 ドキュメントルート内に残らなければなりません。
583 例えば、四つの仮想ホストを設定している場合、
584 仮想ホストの suEXEC に有利なように、メインの Apache
585 ドキュメント階層の外側に全ての仮想ホストのドキュメントルートを
586 構築する必要があります。(例は後日記載)
587 </p>
588 </li>
589
590 <li>suEXEC の PATH 環境変数
591
592
593 <p class="indent">
594 これを変更するのは危険です。この指定に含まれる各パスが
595 <strong>信頼できる</strong>
596 ディレクトリであることを確認してください。
597 世界からのアクセスにより、誰かがホスト上でトロイの木馬
598 を実行できるようにはしたくないでしょう。
599 </p>
600 </li>
601
602 <li>suEXEC コードの改造
603
604
605 <p class="indent">
606 繰り返しますが、何をやろうとしているか把握せずにこれをやると
607 <strong>大きな問題</strong>を引き起こしかねません。
608 可能な限り避けてください。
609 </p>
610 </li>
611 </ul>
612</div></div>
613<div class="bottomlang">
614<p><span>翻訳済み言語: </span><a href="./en/suexec.html" hreflang="en" rel="alternate" title="English">&nbsp;en&nbsp;</a> |
615<a href="./fr/suexec.html" hreflang="fr" rel="alternate" title="Français">&nbsp;fr&nbsp;</a> |
616<a href="./ja/suexec.html" title="Japanese">&nbsp;ja&nbsp;</a> |
617<a href="./ko/suexec.html" hreflang="ko" rel="alternate" title="Korean">&nbsp;ko&nbsp;</a> |
618<a href="./tr/suexec.html" hreflang="tr" rel="alternate" title="Türkçe">&nbsp;tr&nbsp;</a></p>
619</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>
620<script type="text/javascript"><!--//--><![CDATA[//><!--
621var comments_shortname = 'httpd';
622var comments_identifier = 'http://httpd.apache.org/docs/2.4/suexec.html';
623(function(w, d) {
624 if (w.location.hostname.toLowerCase() == "httpd.apache.org") {
625 d.write('<div id="comments_thread"><\/div>');
626 var s = d.createElement('script');
627 s.type = 'text/javascript';
628 s.async = true;
629 s.src = 'https://comments.apache.org/show_comments.lua?site=' + comments_shortname + '&page=' + comments_identifier;
630 (d.getElementsByTagName('head')[0] || d.getElementsByTagName('body')[0]).appendChild(s);
631 }
632 else {
633 d.write('<div id="comments_thread">Comments are disabled for this page at the moment.<\/div>');
634 }
635})(window, document);
636//--><!]]></script></div><div id="footer">
637<p class="apache">Copyright 2017 The Apache Software Foundation.<br />この文書は <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License, Version 2.0</a> のライセンスで提供されています。.</p>
638<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[//><!--
639if (typeof(prettyPrint) !== 'undefined') {
640 prettyPrint();
641}
642//--><!]]></script>
643</body></html>
0\ No newline at end of file644\ No newline at end of file
diff --git a/docs/manual/suexec.html.ko.euc-kr b/docs/manual/suexec.html.ko.euc-kr
1new file mode 100644645new file mode 100644
index 0000000..0e8df7a
--- /dev/null
+++ b/docs/manual/suexec.html.ko.euc-kr
@@ -0,0 +1,564 @@
1<?xml version="1.0" encoding="EUC-KR"?>
2<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3<html xmlns="http://www.w3.org/1999/xhtml" lang="ko" xml:lang="ko"><head>
4<meta content="text/html; charset=EUC-KR" http-equiv="Content-Type" />
5<!--
6 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
7 This file is generated from xml source: DO NOT EDIT
8 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
9 -->
10<title>suEXEC ���� - Apache HTTP Server Version 2.4</title>
11<link href="./style/css/manual.css" rel="stylesheet" media="all" type="text/css" title="Main stylesheet" />
12<link href="./style/css/manual-loose-100pc.css" rel="alternate stylesheet" media="all" type="text/css" title="No Sidebar - Default font size" />
13<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" />
14<script src="./style/scripts/prettify.min.js" type="text/javascript">
15</script>
16
17<link href="./images/favicon.ico" rel="shortcut icon" /></head>
18<body id="manual-page"><div id="page-header">
19<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>
20<p class="apache">Apache HTTP Server Version 2.4</p>
21<img alt="" src="./images/feather.png" /></div>
22<div class="up"><a href="./"><img title="&lt;-" alt="&lt;-" src="./images/left.gif" /></a></div>
23<div id="path">
24<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>
25<div class="toplang">
26<p><span>������ ���: </span><a href="./en/suexec.html" hreflang="en" rel="alternate" title="English">&nbsp;en&nbsp;</a> |
27<a href="./fr/suexec.html" hreflang="fr" rel="alternate" title="Fran&#231;ais">&nbsp;fr&nbsp;</a> |
28<a href="./ja/suexec.html" hreflang="ja" rel="alternate" title="Japanese">&nbsp;ja&nbsp;</a> |
29<a href="./ko/suexec.html" title="Korean">&nbsp;ko&nbsp;</a> |
30<a href="./tr/suexec.html" hreflang="tr" rel="alternate" title="T&#252;rk&#231;e">&nbsp;tr&nbsp;</a></p>
31</div>
32<div class="outofdate">�� ������ �ֽ��� ������ �ƴմϴ�.
33 �ֱٿ� ����� ������ ���� ������ �����ϼ���.</div>
34
35 <p><strong>suEXEC</strong> ����� ����ġ�� <strong>CGI</strong>��
36 <strong>SSI</strong> ���α׷��� �������� ������ ����� ID��
37 �ƴ� �ٸ� ����� ID�� �����ϵ��� �Ѵ�. ���� CGI�� SSI ���α׷���
38 �����ϸ� �������� ������ ����ڿ� ���� ����ڷ� �����Ѵ�.</p>
39
40 <p>�� ����� ������ ����ϸ� ����ڰ� ���� CGI�� SSI ���α׷���
41 �����ϰ� �����Ҷ� �߻��� �� �ִ� ���������� ����� ����
42 �� �ִ�. �׷��� suEXEC�� �������ϰ� �����Ǹ� ���� ������
43 ��ǻ�Ϳ� ���ο� ���� ������ ���� �� �ִ�. ���� <em>setuid root</em>
44 ���α׷��� �̷� ���α׷��� ���� ������ �����ϴٸ� suEXEC��
45 ��������ʱ� �������� �ٶ���.</p>
46 </div>
47<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>
48<li><img alt="" src="./images/down.gif" /> <a href="#model">suEXEC ���ȸ�</a></li>
49<li><img alt="" src="./images/down.gif" /> <a href="#install">suEXEC ������ ��ġ</a></li>
50<li><img alt="" src="./images/down.gif" /> <a href="#enable">suEXEC �� ���</a></li>
51<li><img alt="" src="./images/down.gif" /> <a href="#usage">suEXEC ����ϱ�</a></li>
52<li><img alt="" src="./images/down.gif" /> <a href="#debug">suEXEC ������ϱ�</a></li>
53<li><img alt="" src="./images/down.gif" /> <a href="#jabberwock">�ٽ� �ѹ� �����϶�: ���� ����</a></li>
54</ul><h3>����</h3><ul class="seealso"><li><a href="#comments_section">Comments</a></li></ul></div>
55<div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
56<div class="section">
57<h2><a name="before" id="before">�����ϱ� ����</a></h2>
58
59 <p>�����ϱ� ���� �켱 ����ġ�׷�� �� ������ ������ ������.</p>
60
61 <p>���� <strong>setuid</strong>�� <strong>setgid</strong>
62 ����� ������ ���н��� �ü���� ����Ѵٰ� �����Ѵ�. ���
63 ��ɾ� ���鵵 ���� ������ �Ѵ�. suEXEC�� �����ϴ� �ٸ� �÷�����
64 ����ϴٸ� ������ �ٸ� �� �ִ�.</p>
65
66 <p>�ι�°, ����� ��ǻ�� ������ �⺻ ����� ������ �ͼ��ϴٰ�
67 �����Ѵ�. ���⿡�� <strong>setuid/setgid</strong> ��ɰ�
68 �̵��� �ý��۰� ���ȿ� ��ġ�� ���� ���⿡ ���� ���ذ� ���Եȴ�.</p>
69
70 <p>����°, suEXEC �ڵ��� <strong>������������</strong>
71 ������ ����Ѵٰ� �����Ѵ�. �����ڿ� ���� ��Ÿ�׽��͵���
72 suEXEC�� ���õ� ��� �ڵ带 ���ɽ����� �����ϰ� �˻��ߴ�.
73 �ڵ带 �����ϰ� �ϰ� Ȯ���� ������ �����ϱ����� ��� ���Ǹ�
74 ��￴��. �� �ڵ带 �����ϸ� ����ġ���� ������ ���ο� ����
75 ������ �߻��� �� �ִ�. ���� ���α׷��ֿ� ���� �ſ� �� �˰�
76 �ڵ带 ���캸������ ����ġ�׷�� �۾��� ������ �ǻ簡 ���ٸ�
77 suEXEC �ڵ带 ���������ʱ� <strong>������</strong> ���Ѵ�.</p>
78
79 <p>�׹�°���� ����������, ����ġ�׷��� suEXEC�� ����ġ
80 �⺻��ġ�� �������� <strong>�ʱ��</strong> �����ߴ�. �ᱹ
81 �����ڰ� ���Ǹ� ��←�� suEXEC�� �����ؾ� �Ѵ�. suEXEC��
82 ���� ������ �� ������� �����ڴ� �Ϲ����� ��ġ����� suEXEC��
83 ��ġ�� �� �ִ�. suEXEC ����� ����ϴ� �ý����� ������ å������
84 �����ڴ� �� ���������� �����ְ� ���캸�� �����ؾ� �Ѵ�.
85 �̷� ���� ������ suEXEC�� ����Ҹ�ŭ �����ְ� ��ȣ��
86 ������� suEXEC�� ����ϵ��� ����ġ�׷��� ���ϱ� �����̴�.</p>
87
88 <p>������ ����ϱ� ���ϴ°�? �׷���? ����. ���� ��������!</p>
89</div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
90<div class="section">
91<h2><a name="model" id="model">suEXEC ���ȸ�</a></h2>
92
93 <p>suEXEC�� �����ϰ� ��ġ�ϱ� ���� �츮�� ���ȸ��� ����
94 �����Ѵ�. �̸� ���� ��Ȯ�� suEXEC �ȿ����� ���� ���� �Ͼ��
95 �ý����� ������ ���� ������ �����ؾ� ���� �� �� ������ ��
96 �ִ�.</p>
97
98 <p><strong>suEXEC</strong>�� ����ġ �������� �θ��� setuid
99 "wrapper" ���α׷��� ������� �Ѵ�. �� wrapper�� �����ڰ�
100 �ּ����� �ٸ� userid�� �����ϵ��� ������ CGI�� SSI ���α׷���
101 HTTP ��û�� ���� �Ҹ���. �̷� ��û�� ���� ����ġ�� suEXEC
102 wrapper���� ���α׷���� ���α׷��� ������ ����ڿ� �׷�
103 ID�� �����Ѵ�.</p>
104
105 <p>�׷��� wrapper�� ���� ������ ���� ������ ���и� �����Ѵ�.
106 �� ������ �ϳ��� �����ϸ� ���α׷��� ���з� ��ϵǰ� ������
107 ���� �����Ѵ�. �������� ������ ������ ����Ѵ�:</p>
108
109 <ol>
110 <li>
111 <strong>wrapper�� �����ϴ� ����ڰ� �ý����� ��������
112 �������</strong>
113
114 <p class="indent">
115 wrapper�� �����ϴ� ����ڰ� ������ �ý����� ���������
116 Ȯ���Ѵ�.
117 </p>
118 </li>
119
120 <li>
121 <strong>������ ���� �ƱԸ�Ʈ�� wrapper�� �����ϴ°�?</strong>
122
123 <p class="indent">
124 wrapper�� ������ ���� �ƱԸ�Ʈ�� �־�߸� ����ȴ�.
125 ����ġ �������� �� ������ �ȴ�. wrapper�� ������ ����
126 �ƱԸ�Ʈ�� �������ϸ� ��ŷ�Ǿ��ų� ����ġ�� suEXEC��
127 ���� ������ �ִ� ���̴�.
128 </p>
129 </li>
130
131 <li>
132 <strong>�� ����ڰ� wrapper�� �����ϵ��� ���Ǿ���?</strong>
133
134 <p class="indent">
135 �� ����ڰ� wrapper�� �����ϵ��� ���Ǿ���? ����
136 �� �����(����ġ �����)���� �� ���α׷��� ������
137 �� �ִ�.
138 </p>
139 </li>
140
141 <li>
142 <strong>������ CGI�� SSI ���α׷��� ������������ ����������
143 �����°�?</strong>
144
145 <p class="indent">
146 ������ CGI�� SSI ���α׷��� '/'�� �����ϰų� ������
147 '..'�� �����°�? �̵��� ����� �� ����. ������ CGI/SSI
148 ���α׷��� suEXEC ���� root (�Ʒ�
149 <code>--with-suexec-docroot=<em>DIR</em></code> ����)
150 ���� �־�� �Ѵ�.
151 </p>
152 </li>
153
154 <li>
155 <strong>������ ����ڸ��� ��ȿ�Ѱ�?</strong>
156
157 <p class="indent">
158 ������ ����ڰ� �����ϴ°�?
159 </p>
160 </li>
161
162 <li>
163 <strong>������ �׷���� ��ȿ�Ѱ�?</strong>
164
165 <p class="indent">
166 ������ �׷��� �����ϴ°�?
167 </p>
168 </li>
169
170 <li>
171 <strong>������ ����ڰ� superuser�� <em>�ƴѰ�</em>?</strong>
172
173
174 <p class="indent">
175 ���� suEXEC�� <code><em>root</em></code>�� CGI/SSI
176 ���α׷��� ������ �� ������ �Ѵ�.
177 </p>
178 </li>
179
180 <li>
181 <strong>������ userid�� �ּ� ID ���ں��� <em>ū��</em>?</strong>
182
183 <p class="indent">
184 �������� �ּ� ����� ID ���ڸ� �����Ѵ�. �׷��� CGI/SSI
185 ���α׷��� ������ �� �ִ� userid�� �ּ�ġ�� ������
186 �� �ִ�. "�ý��ۿ�" ������ �����Ҷ� �����ϴ�.
187 </p>
188 </li>
189
190 <li>
191 <strong>������ �׷��� superuser �׷��� <em>�ƴѰ�</em>?</strong>
192
193 <p class="indent">
194 ���� suEXEC�� <code><em>root</em></code> �׷��� CGI/SSI
195 ���α׷��� ������ �� ������ �Ѵ�.
196 </p>
197 </li>
198
199 <li>
200 <strong>������ groupid�� �ּ� ID ���ں��� <em>ū��</em>?</strong>
201
202 <p class="indent">
203 �������� �ּ� �׷� ID ���ڸ� �����Ѵ�. �׷��� CGI/SSI
204 ���α׷��� ������ �� �ִ� groupid�� �ּ�ġ�� ������
205 �� �ִ�. "�ý��ۿ�" �׷��� �����Ҷ� �����ϴ�.
206 </p>
207 </li>
208
209 <li>
210 <strong>wrapper�� ���������� ������ ����ڿ� �׷���
211 �� �� �ִ°�?</strong>
212
213 <p class="indent">
214 �� �ܰ迡�� ���α׷��� setuid�� setgid ȣ���� �Ͽ�
215 ������ ����ڿ� �׷��� �ȴ�. ��, �׷� ���ٸ����
216 ����ڰ� �ش�� ��� �׷����� �ʱ�ȭ�ȴ�.
217 </p>
218 </li>
219
220 <li>
221 <strong>CGI/SSI ���α׷��� �ִ� ���丮�� ���丮��
222 ������ �� �ִ°�?</strong>
223
224 <p class="indent">
225 ���丮�� �������� �ʴٸ� ������ ���� �� ����. �̰�����
226 ���丮�� ������ �� ���ٸ� ���丮�� �������� ����
227 ���̴�.
228 </p>
229 </li>
230
231 <li>
232 <strong>���丮�� ����ġ ������ �ȿ� �ִ°�?</strong>
233
234 <p class="indent">
235 ������ �Ϲ����� �κ��� ��û�� ��� ��û�ϴ� ���丮��
236 suEXEC ���� root �Ʒ� �ִ°�? UserDir�� ��û�� ���
237 ��û�ϴ� ���丮�� suEXEC userdir�� ������ (<a href="#install">suEXEC ���� �ɼ�</a> ����) ���丮
238 �Ʒ��� �ִ°�?
239 </p>
240 </li>
241
242 <li>
243 <strong>�ٸ� ������ ���丮�� ��������� <em>���°�</em>?</strong>
244
245 <p class="indent">
246 ���丮�� �ٸ� ������� ����α� �������ʴ´�. ����
247 �����ڸ��� ���丮 ������ ������ �� �ִ�.
248 </p>
249 </li>
250
251 <li>
252 <strong>������ CGI/SSI ���α׷��� �����ϴ°�?</strong>
253
254 <p class="indent">
255 ���������ʴٸ� ������ ���� ����.
256 </p>
257 </li>
258
259 <li>
260 <strong>�ٸ� ������ ������ CGI/SSI ���α׷��� ���������
261 <em>���°�</em>?</strong>
262
263 <p class="indent">
264 �����ڿ� ������ CGI/SSI ���α׷��� �����ϱ� �������ʴ´�.
265 </p>
266 </li>
267
268 <li>
269 <strong>������ CGI/SSI ���α׷��� setuid�� setgid��
270 <em>�ƴѰ�</em>?</strong>
271
272 <p class="indent">
273 �츮�� ���α׷��� �ٽ� UID/GID�� �����ϱ� �������ʴ´�.
274 </p>
275 </li>
276
277 <li>
278 <strong>������ �����/�׷��� ���α׷��� �����/�׷�� ������?</strong>
279
280 <p class="indent">
281 ����ڰ� ������ �������ΰ�?
282 </p>
283 </li>
284
285 <li>
286 <strong>������ ������ ���� ���μ����� ȯ�溯���� û����
287 �� �ִ°�?</strong>
288
289 <p class="indent">
290 suEXEC�� (�������� ������) ������ ���� PATH�� ���,
291 (�̰͵� �������� ����) ������ ȯ�溯�� ��Ͽ� ���ŵ�
292 ������ ����� ���μ����� ȯ�溯���� �����.
293 </p>
294 </li>
295
296 <li>
297 <strong>���������� ������ CGI/SSI ���α׷��� ������
298 �� �ִ°�?</strong>
299
300 <p class="indent">
301 ���⼭ suEXEC�� ������ ������ CGI/SSI ���α׷��� �����Ѵ�.
302 </p>
303 </li>
304 </ol>
305
306 <p>�̰��� suEXEC wrapper ���ȸ��� ǥ�� �����̴�. �ټ�
307 �����ϰ� CGI/SSI ���迡 ���ο� ������ ������, ������ ���ο�
308 �ΰ� �Ѵܰ辿 ���ɽ����� ���������.</p>
309
310 <p>�� ���� ���� ���� ������ � ������ �ִ����� ������
311 suEXEC �������� � ���� ������ ���� �� �ִ����� ���� ��
312 ������ <a href="#jabberwock">"�ٽ� �ѹ� �����϶�"</a> ����
313 �����϶�.</p>
314</div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
315<div class="section">
316<h2><a name="install" id="install">suEXEC ������ ��ġ</a></h2>
317
318 <p>���� ����ִ� ������ �����Ѵ�.</p>
319
320 <p><strong>suEXEC ���� �ɼ�</strong><br />
321 </p>
322
323 <dl>
324 <dt><code>--enable-suexec</code></dt>
325
326 <dd>�� �ɼ��� �⺻������ ��ġ�ǰų� Ȱ��ȭ�����ʴ� suEXEC
327 ����� Ȱ��ȭ�Ѵ�. APACI�� suEXEC�� �޾Ƶ��̷���
328 <code>--enable-suexec</code> �ɼǿܿ�
329 <code>--with-suexec-xxxxx</code> �ɼ��� �ּ��� �Ѱ�
330 �ʿ��ϴ�.</dd>
331
332 <dt><code>--with-suexec-bin=<em>PATH</em></code></dt>
333
334 <dd><code>suexec</code> ���̳ʸ� ��δ� ���Ȼ� ������
335 ������ ��ϵǾ� �Ѵ�. ��� �⺻���� �����Ϸ��� �� �ɼ���
336 ����Ѵ�. <em>���� ���</em>
337 <code>--with-suexec-bin=/usr/sbin/suexec</code></dd>
338
339 <dt><code>--with-suexec-caller=<em>UID</em></code></dt>
340
341 <dd>���� ����ġ�� �����ϴ� <a href="mod/mpm_common.html#user">����ڸ�</a>. ���α׷���
342 ������ �� �ִ� ������ ����ڴ�.</dd>
343
344 <dt><code>--with-suexec-userdir=<em>DIR</em></code></dt>
345
346 <dd>suEXEC ������ ���Ǵ� ����� Ȩ���丮�� �������丮��
347 �����Ѵ�. �� ���丮�� �ִ� ��� ���������� �������
348 suEXEC�� ����Ƿ�, ��� ���α׷��� "�����ؾ�" �Ѵ�. (����
349 ���, ���� "*"�� ����) "������" UserDir ���þ ����Ѵٸ�
350 ���� ���� �����ؾ� �Ѵ�. UserDir ���þ passwd ���Ͽ�
351 ���� ����� Ȩ���丮�� �ٸ��� suEXEC�� ����������
352 �۵����� �ʴ´�. �⺻���� "public_html"�̴�.<br />
353 ����ȣ��Ʈ���� ���� �ٸ� UserDir�� ����Ѵٸ� ��� ��
354 �θ� ���丮 �ȿ� �ֵ��� �����ؾ� �ϰ�, �� �θ� ���丮����
355 ���� ���´�. <strong>�̷��� �������� ������, "~userdir"
356 cgi ��û�� �۵����� �ʴ´�!</strong></dd>
357
358 <dt><code>--with-suexec-docroot=<em>DIR</em></code></dt>
359
360 <dd>����ġ�� DocumentRoot�� �����Ѵ�. �̴� suEXEC�� �����
361 �� �ִ� (UserDirs�� ������) ������ �����̴�. �⺻ ���丮��
362 <code>--datadir</code> ���� "/htdocs"�� ���� ���̴�.
363 <em>���� ���</em> "<code>--datadir=/home/apache</code>"��
364 �����ߴٸ� suEXEC wrapper�� document root��
365 "/home/apache/htdocs" ���丮�� ����Ѵ�.</dd>
366
367 <dt><code>--with-suexec-uidmin=<em>UID</em></code></dt>
368
369 <dd>suEXEC���� ���������� ������� �ּ� UID�� �����Ѵ�.
370 ��κ��� �ý��ۿ��� 500�̳� 100�� �����ϴ�. �⺻����
371 100�̴�.</dd>
372
373 <dt><code>--with-suexec-gidmin=<em>GID</em></code></dt>
374
375 <dd>suEXEC���� ���������� �׷��� �ּ� GID�� �����Ѵ�.
376 ��κ��� �ý��ۿ��� 100�� �����ϹǷ� �� ���� �⺻���̴�.</dd>
377
378 <dt><code>--with-suexec-logfile=<em>FILE</em></code></dt>
379
380 <dd>��� suEXEC �۵��� ������ (���ó� ����� ������ ������)
381 ����� �α����ϸ��� �����Ѵ�. �⺻������ �α������� �̸���
382 "suexec_log"�̰� ǥ�� �α����� ���丮��
383 (<code>--logfiledir</code>) ��ġ�Ѵ�.</dd>
384
385 <dt><code>--with-suexec-safepath=<em>PATH</em></code></dt>
386
387 <dd>CGI �������Ͽ� �Ѱ��� ������ PATH ȯ�溯���� �����Ѵ�.
388 �⺻���� "/usr/local/bin:/usr/bin:/bin"�̴�.</dd>
389 </dl>
390
391 <p><strong>suEXEC wrapper�� �������ϰ� ��ġ�ϱ�</strong><br />
392 <code>--enable-suexec</code> �ɼ����� suEXEC ����� �����ϰ���
393 ��� <code>make</code> ��ɾ �����ϸ� <code>suexec</code>
394 ���������� (����ġ�� �Բ�) �ڵ����� ���������.<br />
395 ������ �������� �� <code>make install</code> ��ɾ
396 �����Ͽ� ��ġ�� �� �ִ�. ���̳ʸ����� <code>suexec</code>��
397 <code>--sbindir</code> �ɼ����� ������ ���丮�� ��ġ�ȴ�.
398 �⺻ ��ġ�� "/usr/local/apache2/sbin/suexec"�̴�.<br />
399 ��ġ ������ <strong><em>root ����</em></strong>�� �ʿ�����
400 �����϶�. wrapper�� ����� ID�� �����ϱ����ؼ��� �����ڰ�
401 <code><em>root</em></code>�̰� ���ϸ��� setuserid �����Ʈ��
402 �����Ǿ� �Ѵ�.</p>
403
404 <p><strong>���������� ���Ѽ���</strong><br />
405 suEXEC wrapper�� �ڽ��� ������ ����ڰ� ���� �ɼ�
406 <code>--with-suexec-caller</code>�� ������ �ùٸ� ���������
407 Ȯ���� ������, �� �˻� ������ suEXEC�� ����ϴ� �ý���ȣ��
408 Ȥ�� ���̺귯�� �Լ��� ���۵Ǿ��� �� �ִ�. �̸� ����ϸ�
409 �Ϲ������� ���� �����̹Ƿ� ���� ����ġ�� �����ϴ� �׷츸��
410 suEXEC�� ������ �� �ֵ��� ���Ͻý��� ������ �����ؾ� �Ѵ�.</p>
411
412 <p>���� ���, �������� ������ ���� �����ϰ�:</p>
413
414<div class="example"><p><code>
415 User www<br />
416 Group webgroup<br />
417</code></p></div>
418
419 <p><code>suexec</code>�� "/usr/local/apache2/sbin/suexec"��
420 ��ġ�Ͽ��ٸ�, ������ �����ؾ� �Ѵ�:</p>
421
422<div class="example"><p><code>
423 chgrp webgroup /usr/local/apache2/bin/suexec<br />
424 chmod 4750 /usr/local/apache2/bin/suexec<br />
425</code></p></div>
426
427 <p>�׷��� ���� ����ġ�� �����ϴ� �׷츸�� suEXEC wrapper��
428 ������ �� �ִ�.</p>
429</div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
430<div class="section">
431<h2><a name="enable" id="enable">suEXEC �� ���</a></h2>
432
433 <p>����ġ�� �����Ҷ� <code>--sbindir</code> �ɼ����� ������
434 ���丮���� <code>suexec</code> ������ (�⺻��
435 "/usr/local/apache2/sbin/suexec") ã�´�. ����ġ��
436 ���������� ������ suEXEC wrapper�� �߰��ϸ� ���� �α�(error
437 log)�� ������ ���� ����Ѵ�:</p>
438
439<div class="example"><p><code>
440 [notice] suEXEC mechanism enabled (wrapper: <em>/path/to/suexec</em>)
441</code></p></div>
442
443 <p>���� �����߿� �̷� ������ ���ٸ� ������ ����� ��ҿ���
444 wrapper ���α׷��� ã�� ���߰ų�, ���������� <em>setuid
445 root</em>�� ��ġ�����ʾұ� ������ ���̴�.</p>
446
447 <p>ó������ suEXEC ����� ����ϰ� �Ͱ� �̹� ����ġ ������
448 �������̶��, ����ġ�� ���̰� �ٽ� �����ؾ� �Ѵ�. ������
449 HUP�̳� USR1 �ñ׳η� ������ϴ� �����δ� ������� �ʴ�. </p>
450 <p>suEXEC�� �Ȼ���Ϸ��� <code>suexec</code> ������ ������
451 ����ġ�� ���̰� ������ؾ� �Ѵ�. </p>
452</div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
453<div class="section">
454<h2><a name="usage" id="usage">suEXEC ����ϱ�</a></h2>
455
456 <p>CGI ���α׷� ��û�� ��� <code class="directive"><a href="./mod/mod_suexec.html#suexecusergroup">SuexecUserGroup</a></code> ���þ
457 ����� ����ȣ��Ʈ�� ��û�� �Ͽ��ų� <code class="module"><a href="./mod/mod_userdir.html">mod_userdir</a></code>��
458 ��û�� ó���ϴ� ��쿡�� suEXEC wrapper�� ȣ���Ѵ�.</p>
459
460 <p><strong>����ȣ��Ʈ:</strong><br /> suEXEC wrapper��
461 ����ϴ� �Ѱ��� ����� <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> ���þ
462 ����ϴ� ���̴�. �� ���þ �ּ��� ����� ID�� �ٸ���
463 �����ϸ� CGI �ڿ��� ��� ��û�� <code class="directive"><a href="./mod/core.html#virtualhost">&lt;VirtualHost&gt;</a></code>����
464 ������ <em>User</em>�� <em>Group</em>���� ����ȴ�. ��
465 ���þ���� <code class="directive"><a href="./mod/core.html#virtualhost">&lt;VirtualHost&gt;</a></code>�� ������ �ּ���
466 userid�� ����Ѵ�.</p>
467
468 <p><strong>����� ���丮:</strong><br />
469 <code class="module"><a href="./mod/mod_userdir.html">mod_userdir</a></code>�� ��û�� ó���Ѵٸ� suEXEC
470 wrapper�� ȣ���Ͽ�, ��û�� ����� ���丮�� �ش��ϴ� �����
471 ID�� CGI ���α׷��� �����Ѵ�. �� ����� �����Ϸ��� �����
472 ID�� CGI�� ������ �� �ְ� ��ũ��Ʈ�� ���� <a href="#model">����
473 �˻�</a> �׸��� �����ؾ� �Ѵ�. <a href="#install">����
474 �ɼ�</a> <code>--with-suexec-userdir</code>�� �����϶�.</p> </div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
475<div class="section">
476<h2><a name="debug" id="debug">suEXEC ������ϱ�</a></h2>
477
478 <p>suEXEC wrapper�� �α� ������ ������ �ٷ�
479 <code>--with-suexec-logfile</code> �ɼ����� ������ ���Ͽ�
480 ����. wrapper�� �ùٷ� �����ϰ� ��ġ�ߴٸ� ��� �߸��Ǿ�����
481 �� �α����Ͽ� ������ error_log�� �������.</p>
482
483</div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
484<div class="section">
485<h2><a name="jabberwock" id="jabberwock">�ٽ� �ѹ� �����϶�: ���� ����</a></h2>
486
487 <p><strong>����!</strong> �� ������ �������� ���� �� �ִ�.
488 ����ġ�׷��� <a href="http://httpd.apache.org/docs/2.4/suexec.html">�¶���
489 ����</a>���� �� ������ �ֽ����� �����϶�.</p>
490
491 <p>wrapper�� ���� ������ �����ϴ� ��� ��̷ο� ���� �ִ�.
492 suEXEC�� ���õ� "����"�� �����ϱ� ���� �̵��� ���캸�� �ٶ���.</p>
493
494 <ul>
495 <li><strong>suEXEC ���� ����</strong></li>
496
497 <li>
498 ���丮 ���� ����
499
500 <p class="indent">
501 ���Ȱ� ȿ������ ���� ��� suEXEC ��û�� ����ȣ��Ʈ��
502 ��� �ֻ��� document root Ȥ�� userdir ��û�� ���
503 �ֻ��� ���� document root �ȿ��� �߻��ؾ� �Ѵ�. ����
504 ���, ����ȣ��Ʈ �װ��� �����ߴٸ� ����ȣ��Ʈ����
505 suEXEC�� �̿��ϱ����� ����ȣ��Ʈ�� document root��
506 �� ����ġ ���� �������� �ۿ� ������ �ʿ䰡 �ִ�.
507 (������ ������.)
508 </p>
509 </li>
510
511 <li>
512 suEXEC�� PATH ȯ�溯��
513
514 <p class="indent">
515 �����ϸ� ������ �� �ִ�. ���⿡ �����ϴ� ��� ��ΰ�
516 <strong>���� �� �ִ�</strong> ���丮���� Ȯ���϶�.
517 �� �������� �������� �װ��� �ִ� Ʈ���̸񸶸� �����ϱ�
518 ������ ���� ���̴�.
519 </p>
520 </li>
521
522 <li>
523 suEXEC �ڵ� �����ϱ�
524
525 <p class="indent">
526 �ݺ��ؼ� ��������, ����� ������ �ϴ��� �𸣰� �õ��Ѵٸ�
527 <strong>ū ����</strong>�� �߻��� �� �ִ�. � ��쿡��
528 ������������.
529 </p>
530 </li>
531 </ul>
532
533</div></div>
534<div class="bottomlang">
535<p><span>������ ���: </span><a href="./en/suexec.html" hreflang="en" rel="alternate" title="English">&nbsp;en&nbsp;</a> |
536<a href="./fr/suexec.html" hreflang="fr" rel="alternate" title="Fran&#231;ais">&nbsp;fr&nbsp;</a> |
537<a href="./ja/suexec.html" hreflang="ja" rel="alternate" title="Japanese">&nbsp;ja&nbsp;</a> |
538<a href="./ko/suexec.html" title="Korean">&nbsp;ko&nbsp;</a> |
539<a href="./tr/suexec.html" hreflang="tr" rel="alternate" title="T&#252;rk&#231;e">&nbsp;tr&nbsp;</a></p>
540</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>
541<script type="text/javascript"><!--//--><![CDATA[//><!--
542var comments_shortname = 'httpd';
543var comments_identifier = 'http://httpd.apache.org/docs/2.4/suexec.html';
544(function(w, d) {
545 if (w.location.hostname.toLowerCase() == "httpd.apache.org") {
546 d.write('<div id="comments_thread"><\/div>');
547 var s = d.createElement('script');
548 s.type = 'text/javascript';
549 s.async = true;
550 s.src = 'https://comments.apache.org/show_comments.lua?site=' + comments_shortname + '&page=' + comments_identifier;
551 (d.getElementsByTagName('head')[0] || d.getElementsByTagName('body')[0]).appendChild(s);
552 }
553 else {
554 d.write('<div id="comments_thread">Comments are disabled for this page at the moment.<\/div>');
555 }
556})(window, document);
557//--><!]]></script></div><div id="footer">
558<p class="apache">Copyright 2017 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>
559<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[//><!--
560if (typeof(prettyPrint) !== 'undefined') {
561 prettyPrint();
562}
563//--><!]]></script>
564</body></html>
0\ No newline at end of file565\ No newline at end of file
diff --git a/docs/manual/suexec.html.tr.utf8 b/docs/manual/suexec.html.tr.utf8
1new file mode 100644566new file mode 100644
index 0000000..bed106c
--- /dev/null
+++ b/docs/manual/suexec.html.tr.utf8
@@ -0,0 +1,583 @@
1<?xml version="1.0" encoding="UTF-8"?>
2<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3<html xmlns="http://www.w3.org/1999/xhtml" lang="tr" xml:lang="tr"><head>
4<meta content="text/html; charset=UTF-8" http-equiv="Content-Type" />
5<!--
6 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
7 This file is generated from xml source: DO NOT EDIT
8 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
9 -->
10<title>SuEXEC Desteği - Apache HTTP Sunucusu Sürüm 2.4</title>
11<link href="./style/css/manual.css" rel="stylesheet" media="all" type="text/css" title="Main stylesheet" />
12<link href="./style/css/manual-loose-100pc.css" rel="alternate stylesheet" media="all" type="text/css" title="No Sidebar - Default font size" />
13<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" />
14<script src="./style/scripts/prettify.min.js" type="text/javascript">
15</script>
16
17<link href="./images/favicon.ico" rel="shortcut icon" /></head>
18<body id="manual-page"><div id="page-header">
19<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>
20<p class="apache">Apache HTTP Sunucusu Sürüm 2.4</p>
21<img alt="" src="./images/feather.png" /></div>
22<div class="up"><a href="./"><img title="&lt;-" alt="&lt;-" src="./images/left.gif" /></a></div>
23<div id="path">
24<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>
25<div class="toplang">
26<p><span>Mevcut Diller: </span><a href="./en/suexec.html" hreflang="en" rel="alternate" title="English">&nbsp;en&nbsp;</a> |
27<a href="./fr/suexec.html" hreflang="fr" rel="alternate" title="Français">&nbsp;fr&nbsp;</a> |
28<a href="./ja/suexec.html" hreflang="ja" rel="alternate" title="Japanese">&nbsp;ja&nbsp;</a> |
29<a href="./ko/suexec.html" hreflang="ko" rel="alternate" title="Korean">&nbsp;ko&nbsp;</a> |
30<a href="./tr/suexec.html" title="Türkçe">&nbsp;tr&nbsp;</a></p>
31</div>
32
33 <p><strong>SuEXEC</strong> özelliği, Apache HTTP Sunucusu kullanıcılarına
34 <strong>CGI</strong> ve <strong>SSI</strong> programlarını sunucunun
35 aidiyetinde çalıştığı kullanıcıdan farklı bir kullanıcının aidiyetinde
36 çalıştırma olanağı verir. Normalde, <strong>CGI</strong> ve
37 <strong>SSI</strong> programlarını çalıştıranla sunucuyu çalıştıran
38 aynı kullanıcıdır.</p>
39
40 <p>Gerektiği gibi kullanıldığında bu özellik, kullanıcılara
41 <strong>CGI</strong> ve <strong>SSI</strong> programlarını çalıştırma
42 ve geliştirmeye izin vermekle ortaya çıkan güvenlik risklerini azaltır.
43 Bununla birlikte, <strong>suEXEC</strong> gerektiği gibi
44 yapılandırılmadığı takdirde bazı sorunlara yol açabilir ve bilgisayar
45 güvenliğinizde yeni delikler ortaya çıkmasına sebep olabilir.
46 Güvenlikle ilgili mevcut sorunlarla başa çıkmada ve <em>setuid
47 root</em> programları yönetmekte bilgi ve deneyim sahibi değilseniz
48 <strong>suEXEC</strong> kullanmayı kesinlikle düşünmemenizi
49 öneririz.</p>
50 </div>
51<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>
52<li><img alt="" src="./images/down.gif" /> <a href="#model">SuEXEC Güvenlik Modeli</a></li>
53<li><img alt="" src="./images/down.gif" /> <a href="#install">suEXEC’in Yapılandırılması ve Kurulumu</a></li>
54<li><img alt="" src="./images/down.gif" /> <a href="#enable">suEXEC’in etkin kılınması ve iptal edilmesi</a></li>
55<li><img alt="" src="./images/down.gif" /> <a href="#usage">SuEXEC’in kullanımı</a></li>
56<li><img alt="" src="./images/down.gif" /> <a href="#debug">SuEXEC ve hata ayıklama</a></li>
57<li><img alt="" src="./images/down.gif" /> <a href="#jabberwock">Uyarılar ve Örnekler</a></li>
58</ul><h3>Ayrıca bakınız:</h3><ul class="seealso"><li><a href="#comments_section">Yorum</a></li></ul></div>
59<div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
60<div class="section">
61<h2><a name="before" id="before">Başlamadan önce</a></h2>
62
63 <p>Belgeye balıklama dalmadan önce, suexec'i kullanacağınız ortam ve
64 kendiniz hakkında yapılmış çeşitli kabuller hakkında bilgi sahibi
65 olmalısınız.</p>
66
67 <p>Öncelikle, üzerinde <strong>setuid</strong> va <strong>setgid</strong>
68 işlemlerinin yapılabildiği Unix türevi bir işletim sistemi
69 kullandığınızı varsayıyoruz. Tüm komut örnekleri buna dayanarak
70 verilmiştir. Bu desteğe sahip başka platformlar varsa onlardaki
71 yapılandırma burada anlattığımız yapılandırmadan farklı olabilir.</p>
72
73 <p>İkinci olarak, bilgisayarınızın güvenliği ve yönetimi ile ilgili bazı
74 temel kavramları bildiğinizi kabul ediyoruz. Buna
75 <strong>setuid/setgid</strong> işlemlerinin sisteminiz ve güvenlik
76 seviyesi üzerindeki etkilerini bilmek dahildir.</p>
77
78 <p>Üçüncü olarak, <strong>suEXEC</strong> kodunun
79 <strong>değiştirilmemiş</strong> bir sürümünü kullandığınızı
80 varsayıyoruz. Tüm suEXEC kodu, geliştiricilerin yanında sayısız beta
81 kullanıcısı tarafından dikkatle incelenmiş ve denenmiştir. Kodların hem
82 basit hem de sağlam bir şekilde güvenli olması için gerekli tüm
83 önlemler alınmıştır. Bu kodun değiştirilmesi beklenmedik sorunlara ve
84 yeni güvenlik risklerine yol açabilir. Özellikle güvenlikle ilgili
85 programlarda deneyimli değilseniz suEXEC kodunda kesinlikle bir
86 değişiklik yapmamalısınız. Değişiklik yaparsanız kodlarınızı gözden
87 geçirmek ve tartışmak üzere Apache HTTP Sunucusu geliştirme ekibi ile
88 paylaşmanızı öneririz.</p>
89
90 <p>Dördüncü ve son olarak, Apache HTTP Sunucusu geliştirme ekibinin
91 suEXEC’i öntanımlı httpd kurulumunun bir parçası yapmama kararından
92 bahsetmek gerekir. Bunun sonucu olarak, suEXEC yapılandırması sistem
93 yöneticisinin ayrıntılı bir incelemesini gerektirir. Gerekli incelemeden
94 sonra yönetici tarafından suEXEC yapılandırma seçeneklerine karar
95 verilip, normal yollardan sisteme kurulumu yapılır. Bu seçeneklerin
96 belirlenmesi, suEXEC işlevselliğinin kullanımı sırasında sistem
97 güvenliğini gerektiği gibi sağlamak için yönetici tarafından dikkatle
98 saptanmayı gerektirir. Bu sürecin ayrıntılarının yöneticiye bırakılma
99 sebebi, suEXEC kurulumunu, suEXEC’i dikkatle kullanacak yeterliliğe sahip
100 olanlarla sınırlama beklentimizdir.</p>
101
102 <p>Hala bizimle misiniz? Evet mi? Pekala, o halde devam!</p>
103</div><div class="top"><a href="#page-header"><img alt="top" src="./images/up.gif" /></a></div>
104<div class="section">
105<h2><a name="model" id="model">SuEXEC Güvenlik Modeli</a></h2>
106
107 <p>SuEXEC yapılandırması ve kurulumuna girişmeden önce biraz da
108 gerçekleşmesini istediğiniz güvenlik modelinin ayrıntıları üzerinde
109 duralım. Böylece, suEXEC’in içinde olup bitenleri ve sisteminizin
110 güvenliği için alınacak önlemleri daha iyi anlayabilirsiniz.</p>
111
112 <p><strong>suEXEC</strong> işlevselliği, Apache HTTP Sunucusu tarafından
113 gerektiği takdirde artalanda çalıştırılan bir setuid programa dayanır.
114 Bu program, bir CGI veya SSI betiğine bir HTTP isteği yapıldığı zaman,
115 bu betiği, yöneticinin ana sunucunun aidiyetinde çalıştığı kullanıcıdan
116 farklı olarak seçtiği bir kullanıcının aidiyetinde çalıştırmak için
117 çağrılır. Böyle bir istek geldiğinde, Apache httpd artalandaki setuid
118 programına, HTTP isteği yapılan programın ismiyle beraber aidiyetinde
119 çalışacağı kullanıcı ve grup kimliklerini de aktarır.</p>
120
121 <p>Artalanda çalıştırılan setuid program başarıyı ve başarısızlığı
122 aşağıdaki süreci izleyerek saptar. Bunlardan herhangi biri başarısız
123 olursa program başarısızlık durumunu günlüğe kaydeder ve bir hata
124 vererek çıkar. Aksi takdirde çalışmaya devam eder.</p>
125
126 <ol>
127 <li>
128 <strong>Setuid programı çalıştıran kullanıcı sistemin geçerli
129 kullanıcılarından biri mi?</strong>
130
131 <p class="indent">Bu, setuid programı çalıştıran kullanıcının
132 sistemin gerçek bir kullanıcısı olduğunudan emin olunmasını sağlar.
133 </p>
134 </li>
135
136 <li>
137 <strong>Setuid program yeterli sayıda argümanla çağrılmış mı?
138 </strong>
139
140 <p class="indent">Apache HTTP Sunucusunun artalanda çağırdığı
141 setuid program ancak yeterli sayıda argüman sağlandığı takdirde
142 çalışacaktır. Argümanların sayısını ve sırasını Apache HTTP sunucusu
143 bilir. Eğer setuid program yeterli sayıda argümanla çağrılmamışsa
144 ya kendisinde bir değişiklik yapılmıştır ya da kurulu Apache httpd
145 çalıştırılabilirinin suEXEC ile ilgili kısmında yanlış giden bir
146 şeyler vardır.</p>
147 </li>
148
149 <li>
150 <strong>Bu geçerli kullanıcının bu setuid programı çalıştırma
151 yetkisi var mı?</strong>
152
153 <p class="indent">Sadece tek bir kullanıcı (Apache’nin aidiyetinde
154 çalıştığı kullanıcı) bu programı çalıştırmaya yetkilidir.</p>
155 </li>
156
157 <li>
158 <strong>Hedef CGI veya SSI programı hiyerarşik olarak güvenliği
159 bozacak bir dosya yolu üzerinde mi?</strong>
160
161 <p class="indent">Hedef CGI veya SSI programının dosya yolu '/' veya
162 '..' ile başlıyor mu? Buna izin verilmez. Hedef CGI veya SSI
163 programı suEXEC’in belge kök dizininde yer almalıdır (aşağıda
164 <code>--with-suexec-docroot=<em>DİZİN</em></code> seçeneğine
165 bakınız).</p>
166 </li>
167
168 <li>
169 <strong>Hedef kullanıcı ismi geçerli mi?</strong>
170
171 <p class="indent">Hedef kullanıcı mevcut mu?</p>
172 </li>
173
174 <li>
175 <strong>Hedef grup ismi geçerli mi?</strong>
176
177 <p class="indent">Hedef grup mevcut mu?</p>
178 </li>
179
180 <li>
181 <strong>Hedef kullanıcı <code>root</code> değil, değil mi?</strong>
182
183 <p class="indent">Mevcut durumda, <code>root</code> kullanıcısının
184 CGI/SSI programlarını çalıştırmasına izin verilmemektedir.</p>
185 </li>
186
187 <li>
188 <strong>Hedef kullanıcı kimliği asgari kullanıcı numarasından
189 <em>BÜYÜK</em> mü?</strong>
190
191 <p class="indent">Asgari kullanıcı numarası yapılandırma sırasında
192 belirtilir. Böylece CGI/SSI programlarını çalıştırmasına izin
193 verilecek olası en düşük kullanıcı numarasını belirlemeniz mümkün
194 kılınmıştır. Bu bazı “sistem” hesaplarını devreden çıkarmak için
195 yararlıdır.</p>
196 </li>
197
198 <li>
199 <strong>Hedef grup <code>root</code> değil, değil mi?</strong>
200
201 <p class="indent"><code>root</code> grubunun CGI/SSI
202 programlarını çalıştırmasına izin verilmemektedir.</p>
203 </li>
204
205 <li>
206 <strong>Hedef grup numarası asgari grup numarasından
207 <em>BÜYÜK</em> mü?</strong>
208
209 <p class="indent">Asgari grup numarası yapılandırma sırasında
210 belirtilir. Böylece CGI/SSI programlarını çalıştırmasına izin
211 verilecek olası en düşük grup numarasını belirlemeniz mümkün
212 kılınmıştır. Bu bazı “sistem” hesaplarını devreden çıkarmak için
213 yararlıdır.</p>
214 </li>
215
216 <li>
217 <strong>Apache’nin artalanda çağırdığı setuid program hedef
218 kullanıcı ve grubun aidiyetine geçebildi mi?</strong>
219
220 <p class="indent">Bu noktadan itibaren program setuid ve setgid
221 çağrıları üzerinden hedef kullanıcı ve grubun aidiyetine geçer.
222 Erişim grubu listesi de ayrıca kullanıcının üyesi olduğu tüm
223 gruplara genişletilir.</p>
224 </li>
225
226 <li>
227 <strong>Hedef CGI/SSI programının bulunduğu dizine geçebildik mi?
228 </strong>
229
230 <p class="indent">Dizin mevcut değilse dosyaları da içeremez. Hedef
231 dizine geçemiyorsak bu, dizin mevcut olmadığından olabilir.</p>
232 </li>
233
234 <li>
235 <strong>Hedef dizin Apache için izin verilen yerlerden biri mi?
236 </strong>
237
238 <p class="indent">İstek sunucunun normal bir bölümü için yapılmış
239 olsa da istenen dizin acaba suEXEC’in belge kök dizini altında mı?
240 Yani, istenen dizin, suEXEC’in aidiyetinde çalıştığı kullanıcının
241 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>
242 bakınız).</p>
243 </li>
244
245 <li>
246 <strong>Hedef dizin başkaları tarafından yazılabilen bir dizin değil,
247 değil mi?</strong>
248
249 <p class="indent">Başkaları da yazabilsin diye bir dizin açmıyoruz;
The diff has been truncated for viewing.

Subscribers

People subscribed via source and target branches