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

Proposed by Andreas Hasenack on 2018-06-07
Status: Merged
Approved by:  Christian Ehrhardt  on 2018-06-11
Approved revision: 5be7414420ffe6fe3802f27569625c7d5bab0484
Merge reported by: Andreas Hasenack
Merged at revision: 5be7414420ffe6fe3802f27569625c7d5bab0484
Proposed branch: ~ahasenack/ubuntu/+source/apache2:artful-includeoptional-1766186
Merge into: ubuntu/+source/apache2:ubuntu/artful-devel
Diff against target: 422128 lines (+413842/-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 (+77/-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 (+813/-0)
libhttpd.mak (+1325/-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 (+403/-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 (+719/-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 (+4953/-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 (+1286/-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 (+1985/-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 (+229/-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 (+1279/-0)
modules/http2/h2_bucket_beam.h (+416/-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 (+1281/-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 (+1073/-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 (+750/-0)
modules/http2/h2_task.h (+126/-0)
modules/http2/h2_util.c (+2049/-0)
modules/http2/h2_util.h (+552/-0)
modules/http2/h2_version.h (+40/-0)
modules/http2/h2_workers.c (+369/-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 (+5312/-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 (+408/-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 (+160/-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 (+200/-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 (+169/-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 (+466/-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 (+2907/-0)
modules/proxy/mod_proxy.dep (+153/-0)
modules/proxy/mod_proxy.dsp (+127/-0)
modules/proxy/mod_proxy.h (+1210/-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 (+1824/-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 (+1218/-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 (+385/-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 (+714/-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 (+1051/-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 (+5391/-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 (+922/-0)
server/log.c (+1932/-0)
server/main.c (+824/-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 (+3560/-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 (+1506/-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 (+2365/-0)
server/provider.c (+197/-0)
server/request.c (+2511/-0)
server/scoreboard.c (+666/-0)
server/util.c (+3310/-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 (+1812/-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 (+2545/-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 (+293/-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  2018-06-07 Approve on 2018-06-11
Canonical Server Team 2018-06-07 Pending
Review via email: mp+347650@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 not 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.
review: Approve
Andreas Hasenack (ahasenack) wrote :

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

Andreas Hasenack (ahasenack) wrote :

Sorry, I meant "current artful branch HEAD" above. The hash is correct.

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 1ab80c4..d03af8a 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,11 @@
1apache2 (2.4.27-2ubuntu4.2) artful; 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 17:53:23 -0300
8
1apache2 (2.4.27-2ubuntu4.1) artful-security; urgency=medium9apache2 (2.4.27-2ubuntu4.1) artful-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..9dd4867
--- /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@@ -2375,10 +2375,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 02238a5..acfedb1 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -20,3 +20,4 @@ CVE-2018-1283.patch
20CVE-2018-1301.patch20CVE-2018-1301.patch
21CVE-2018-1303.patch21CVE-2018-1303.patch
22CVE-2018-1312.patch22CVE-2018-1312.patch
23includeoptional-ignore-non-existent.patch
diff --git a/docs/manual/style/latex/atbeginend.sty b/docs/manual/style/latex/atbeginend.sty
23new file mode 10064424new 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..4dac5ef
--- /dev/null
+++ b/docs/manual/style/modulesynopsis.dtd
@@ -0,0 +1,77 @@
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)>
diff --git a/docs/manual/style/scripts/MINIFY b/docs/manual/style/scripts/MINIFY
0new file mode 10064478new 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..2fa959a
--- /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 = ["Macro,UndefMacro,Use,AuthLDAPURL,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,AuthBasicProvider,AuthDBDUserPWQuery,AuthDBDUserRealmQuery,AuthDBMGroupFile,AuthDBMType,AuthDBMUserFile,AuthDigestAlgorithm,AuthDigestDomain,AuthDigestNcCheck,AuthDigestNonceFormat,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>,AuthType,AuthUserFile,AuthzDBDLoginToReferer,AuthzDBDQuery,AuthzDBDRedirectQuery,AuthzDBMType,<AuthzProviderAlias>,AuthzSendForbiddenOnFailure,BalancerGrowth,BalancerMember,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,CacheStaleOnError,CacheStoreExpired,CacheStoreNoStore,CacheStorePrivate,CGIMapExtension,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,DeflateMemLevel,DeflateWindowSize,Deny,<Directory>,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,GprofDir,GracefulShutdownTimeout,Group,Header,HeaderName,HeartbeatAddress,HeartbeatListen,HeartbeatMaxServers,HeartbeatStorage,HeartbeatStorage,HostnameLookups,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,LoadFile,LoadModule,<Location>,<LocationMatch>,LogFormat,LogLevel,LogMessage,LuaCodeCache,LuaHookAccessChecker,LuaHookAuthChecker,LuaAuthzProvider,LuaHookCheckUserID,LuaHookFixups,LuaHookInsertFilter,LuaHookMapToStorage,LuaHookTranslateName,LuaHookTypeChecker,LuaInherit,LuaInputFilter,LuaMapHandler,LuaOutputFilter,LuaPackageCPath,LuaPackagePath,LuaQuickHandler,LuaRoot,LuaScope,MaxConnectionsPerChild,MaxKeepAliveRequests,MaxMemFree,MaxRangeOverlaps,MaxRangeReversals,MaxRanges,MaxRequestWorkers,MaxSpareServers,MaxSpareThreads,MaxThreads,MetaDir,MetaFiles,MetaSuffix,MimeMagicFile,MinSpareServers,MinSpareThreads,MMapFile,ModemStandard,ModMimeUsePathInfo,MultiviewsMatch,Mutex,NameVirtualHost,NoProxy,NWSSLTrustedCerts,NWSSLUpgradeable,Options,Order,OutputSed,PassEnv,PidFile,PrivilegesMode,Protocol,ProtocolEcho,<Proxy>,ProxyAddHeaders,ProxyBadHeader,ProxyBlock,ProxyDomain,ProxyErrorOverride,ProxyExpressDBMFile,ProxyExpressDBMType,ProxyExpressEnable,ProxyFtpDirCharset,ProxyFtpEscapeWildcards,ProxyFtpListOnWildcard,ProxyHTMLBufSize,ProxyHTMLCharsetOut,ProxyHTMLDocType,ProxyHTMLEnable,ProxyHTMLEvents,ProxyHTMLExtended,ProxyHTMLFixups,ProxyHTMLInterp,ProxyHTMLLinks,ProxyHTMLStripComments,ProxyHTMLURLMap,ProxyIOBufferSize,<ProxyMatch>,ProxyMaxForwards,ProxyPass,ProxyPassInterpolateEnv,ProxyPassMatch,ProxyPassReverse,ProxyPassReverseCookieDomain,ProxyPassReverseCookiePath,ProxyPreserveHost,ProxyReceiveBufferSize,ProxyRemote,ProxyRemoteMatch,ProxyRequests,ProxySCGIInternalRedirect,ProxySCGISendfile,ProxySet,ProxySourceAddress,ProxyStatus,ProxyTimeout,ProxyVia,ReadmeName,ReceiveBufferSize,Redirect,RedirectMatch,RedirectPermanent,RedirectTemp,ReflectorHeader,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,SSLCryptoDevice,SSLEngine,SSLFIPS,SSLHonorCipherOrder,SSLInsecureRenegotiation,SSLOCSPDefaultResponder,SSLOCSPEnable,SSLOCSPOverrideResponder,SSLOCSPResponderTimeout,SSLOCSPResponseMaxAge,SSLOCSPResponseTimeSkew,SSLOptions,SSLPassPhraseDialog,SSLProtocol,SSLProxyCACertificateFile,SSLProxyCACertificatePath,SSLProxyCARevocationCheck,SSLProxyCARevocationFile,SSLProxyCARevocationPath,SSLProxyCheckPeerCN,SSLProxyCheckPeerExpire,SSLProxyCipherSuite,SSLProxyEngine,SSLProxyMachineCertificateChainFile,SSLProxyMachineCertificateFile,SSLProxyMachineCertificatePath,SSLProxyProtocol,SSLProxyVerify,SSLProxyVerifyDepth,SSLRandomSeed,SSLRenegBufferSize,SSLRequire,SSLRequireSSL,SSLSessionCache,SSLSessionCacheTimeout,SSLSessionTicketKeyFile,SSLStaplingCache,SSLStaplingErrorCacheTimeout,SSLStaplingFakeTryLater,SSLStaplingForceURL,SSLStaplingResponderTimeout,SSLStaplingResponseMaxAge,SSLStaplingResponseTimeSkew,SSLStaplingReturnResponderErrors,SSLStaplingStandardCacheTimeout,SSLStrictSNIVHostCheck,SSLUserName,SSLUseStapling,SSLVerifyClient,SSLVerifyDepth,StartServers,StartThreads,Substitute,Suexec,SuexecUserGroup,ThreadLimit,ThreadsPerChild,ThreadStackSize,TimeOut,TraceEnable,TransferLog,TypesConfig,UnDefine,UnsetEnv,UseCanonicalName,UseCanonicalPhysicalPort,User,UserDir,VHostCGIMode,VHostCGIPrivs,VHostGroup,VHostPrivs,VHostSecure,VHostUser,VirtualDocumentRoot,VirtualDocumentRootIP,<VirtualHost>,VirtualScriptAlias,VirtualScriptAliasIP,WatchdogInterval,XBitHack,xml2EncAlias,xml2EncDefault,xml2StartParse,RewriteLog,RewriteLogLevel"];
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..4f0f9f5
--- /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=["Macro,UndefMacro,Use,AuthLDAPURL,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,AuthBasicProvider,AuthDBDUserPWQuery,AuthDBDUserRealmQuery,AuthDBMGroupFile,AuthDBMType,AuthDBMUserFile,AuthDigestAlgorithm,AuthDigestDomain,AuthDigestNcCheck,AuthDigestNonceFormat,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>,AuthType,AuthUserFile,AuthzDBDLoginToReferer,AuthzDBDQuery,AuthzDBDRedirectQuery,AuthzDBMType,<AuthzProviderAlias>,AuthzSendForbiddenOnFailure,BalancerGrowth,BalancerMember,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,CacheStaleOnError,CacheStoreExpired,CacheStoreNoStore,CacheStorePrivate,CGIMapExtension,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,DeflateMemLevel,DeflateWindowSize,Deny,<Directory>,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,GprofDir,GracefulShutdownTimeout,Group,Header,HeaderName,HeartbeatAddress,HeartbeatListen,HeartbeatMaxServers,HeartbeatStorage,HeartbeatStorage,HostnameLookups,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,LoadFile,LoadModule,<Location>,<LocationMatch>,LogFormat,LogLevel,LogMessage,LuaCodeCache,LuaHookAccessChecker,LuaHookAuthChecker,LuaAuthzProvider,LuaHookCheckUserID,LuaHookFixups,LuaHookInsertFilter,LuaHookMapToStorage,LuaHookTranslateName,LuaHookTypeChecker,LuaInherit,LuaInputFilter,LuaMapHandler,LuaOutputFilter,LuaPackageCPath,LuaPackagePath,LuaQuickHandler,LuaRoot,LuaScope,MaxConnectionsPerChild,MaxKeepAliveRequests,MaxMemFree,MaxRangeOverlaps,MaxRangeReversals,MaxRanges,MaxRequestWorkers,MaxSpareServers,MaxSpareThreads,MaxThreads,MetaDir,MetaFiles,MetaSuffix,MimeMagicFile,MinSpareServers,MinSpareThreads,MMapFile,ModemStandard,ModMimeUsePathInfo,MultiviewsMatch,Mutex,NameVirtualHost,NoProxy,NWSSLTrustedCerts,NWSSLUpgradeable,Options,Order,OutputSed,PassEnv,PidFile,PrivilegesMode,Protocol,ProtocolEcho,<Proxy>,ProxyAddHeaders,ProxyBadHeader,ProxyBlock,ProxyDomain,ProxyErrorOverride,ProxyExpressDBMFile,ProxyExpressDBMType,ProxyExpressEnable,ProxyFtpDirCharset,ProxyFtpEscapeWildcards,ProxyFtpListOnWildcard,ProxyHTMLBufSize,ProxyHTMLCharsetOut,ProxyHTMLDocType,ProxyHTMLEnable,ProxyHTMLEvents,ProxyHTMLExtended,ProxyHTMLFixups,ProxyHTMLInterp,ProxyHTMLLinks,ProxyHTMLStripComments,ProxyHTMLURLMap,ProxyIOBufferSize,<ProxyMatch>,ProxyMaxForwards,ProxyPass,ProxyPassInterpolateEnv,ProxyPassMatch,ProxyPassReverse,ProxyPassReverseCookieDomain,ProxyPassReverseCookiePath,ProxyPreserveHost,ProxyReceiveBufferSize,ProxyRemote,ProxyRemoteMatch,ProxyRequests,ProxySCGIInternalRedirect,ProxySCGISendfile,ProxySet,ProxySourceAddress,ProxyStatus,ProxyTimeout,ProxyVia,ReadmeName,ReceiveBufferSize,Redirect,RedirectMatch,RedirectPermanent,RedirectTemp,ReflectorHeader,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,SSLCryptoDevice,SSLEngine,SSLFIPS,SSLHonorCipherOrder,SSLInsecureRenegotiation,SSLOCSPDefaultResponder,SSLOCSPEnable,SSLOCSPOverrideResponder,SSLOCSPResponderTimeout,SSLOCSPResponseMaxAge,SSLOCSPResponseTimeSkew,SSLOptions,SSLPassPhraseDialog,SSLProtocol,SSLProxyCACertificateFile,SSLProxyCACertificatePath,SSLProxyCARevocationCheck,SSLProxyCARevocationFile,SSLProxyCARevocationPath,SSLProxyCheckPeerCN,SSLProxyCheckPeerExpire,SSLProxyCipherSuite,SSLProxyEngine,SSLProxyMachineCertificateChainFile,SSLProxyMachineCertificateFile,SSLProxyMachineCertificatePath,SSLProxyProtocol,SSLProxyVerify,SSLProxyVerifyDepth,SSLRandomSeed,SSLRenegBufferSize,SSLRequire,SSLRequireSSL,SSLSessionCache,SSLSessionCacheTimeout,SSLSessionTicketKeyFile,SSLStaplingCache,SSLStaplingErrorCacheTimeout,SSLStaplingFakeTryLater,SSLStaplingForceURL,SSLStaplingResponderTimeout,SSLStaplingResponseMaxAge,SSLStaplingResponseTimeSkew,SSLStaplingReturnResponderErrors,SSLStaplingStandardCacheTimeout,SSLStrictSNIVHostCheck,SSLUserName,SSLUseStapling,SSLVerifyClient,SSLVerifyDepth,StartServers,StartThreads,Substitute,Suexec,SuexecUserGroup,ThreadLimit,ThreadsPerChild,ThreadStackSize,TimeOut,TraceEnable,TransferLog,TypesConfig,UnDefine,UnsetEnv,UseCanonicalName,UseCanonicalPhysicalPort,User,UserDir,VHostCGIMode,VHostCGIPrivs,VHostGroup,VHostPrivs,VHostSecure,VHostUser,VirtualDocumentRoot,VirtualDocumentRootIP,<VirtualHost>,VirtualScriptAlias,VirtualScriptAliasIP,WatchdogInterval,XBitHack,xml2EncAlias,xml2EncDefault,xml2StartParse,RewriteLog,RewriteLogLevel"];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..66952cd
--- /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 "27">
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