123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248(* Ocsigen
* http://www.ocsigen.org
* Module extendconfiguration.ml
* Copyright (C) 2008 Boris Yakobowski
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, with linking exception;
* either version 2.1 of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*)letname="extendconfiguration"letbad_configs=raise(Ocsigen_extensions.Error_in_config_files)letgenconfigfun=function|Ocsigen_extensions.Req_found_->Lwt.returnOcsigen_extensions.Ext_do_nothing|Ocsigen_extensions.Req_not_found(err,({Ocsigen_extensions.request_config;_}asrequest))->Lwt_log.ign_info"Updating configuration";letrequest={requestwithOcsigen_extensions.request_config=configfunrequest_config}inLwt.return(Ocsigen_extensions.Ext_continue_with(request,Ocsigen_cookie_map.empty,err))letgather_do_not_serve_filestag=letrecaux(regexps,files,extensions)=function|[]->{Ocsigen_extensions.do_not_serve_regexps=regexps;do_not_serve_files=files;do_not_serve_extensions=extensions}|Xml.Element("regexp",["regexp",f],[])::q->aux(f::regexps,files,extensions)q|Xml.Element("file",["file",f],[])::q->aux(regexps,f::files,extensions)q|Xml.Element("extension",["ext",f],[])::q->aux(regexps,files,f::extensions)q|_::_->bad_config("invalid options in tag "^tag)inaux([],[],[])exceptionBad_regexpofstringletcheck_regexp_list=lethashtbl=Hashtbl.create17inList.iter@@funr->tryHashtbl.findhashtblrwithNot_found->tryignore(Ocsigen_lib.Netstring_pcre.regexpr);Hashtbl.addhashtblr()with_->raise(Bad_regexpr)letfun_siteusermode_____=function|Xml.Element("listdirs",["value","true"],[])->gen@@funconfig->{configwithOcsigen_extensions.list_directory_content=true}|Xml.Element("listdirs",["value","false"],[])->gen@@funconfig->{configwithOcsigen_extensions.list_directory_content=false}|Xml.Element("listdirs"ass,_,_)->Ocsigen_extensions.badconfig"Bad syntax for tag %s"s|Xml.Element("followsymlinks",["value",follow_symlinks],[])->letfollow_symlinks=matchfollow_symlinkswith|"never"->`No|"always"->(matchusermodewith|None->`Always|Some_->raise(Ocsigen_extensions.Error_in_user_config_file"Cannot specify value 'always' for option \
'followsymlinks' in userconf files"))|"ownermatch"->`Owner_match|_->bad_config("Wrong value \""^follow_symlinks^"\" for option \"followsymlinks\"")ingen@@funconfig->{configwithOcsigen_extensions.follow_symlinks}|Xml.Element("followsymlinks"ass,_,_)->Ocsigen_extensions.badconfig"Bad syntax for tag %s"s|Xml.Element("charset",attrs,exts)->letrecauxcharset_assoc=function|[]->charset_assoc|Xml.Element("extension",["ext",extension;"value",charset],[])::q->aux(Ocsigen_charset_mime.update_charset_extcharset_assocextensioncharset)q|Xml.Element("file",["file",file;"value",charset],[])::q->aux(Ocsigen_charset_mime.update_charset_filecharset_assocfilecharset)q|Xml.Element("regexp",["regexp",regexp;"value",charset],[])::q->(tryletr=Ocsigen_lib.Netstring_pcre.regexpregexpinaux(Ocsigen_charset_mime.update_charset_regexpcharset_assocrcharset)qwith_->bad_config"invalid regexp '%s' in <extension regexp ...>")|_::_->bad_config"invalid subtag in option charset"ingen(funconfig->letconfig=matchattrswith|["default",s]->{configwithOcsigen_extensions.charset_assoc=Ocsigen_charset_mime.set_default_charsetconfig.Ocsigen_extensions.charset_assocs}|[]->config|_->bad_config"Only attribute \"default\" is permitted \
for option \"charset\""in{configwithOcsigen_extensions.charset_assoc=auxconfig.Ocsigen_extensions.charset_assocexts})|Xml.Element("contenttype",attrs,exts)->letrecauxmime_assoc=function|[]->mime_assoc|Xml.Element("extension",["ext",extension;"value",mime],[])::q->aux(Ocsigen_charset_mime.update_mime_extmime_assocextensionmime)q|Xml.Element("file",["file",file;"value",mime],[])::q->aux(Ocsigen_charset_mime.update_mime_filemime_assocfilemime)q|Xml.Element("regexp",["regexp",regexp;"value",mime],[])::q->(tryletr=Ocsigen_lib.Netstring_pcre.regexpregexpinaux(Ocsigen_charset_mime.update_mime_regexpmime_assocrmime)qwith_->bad_config"invalid regexp '%s' in <extension regexp ...>")|_::_->bad_config"invalid subtag in option mime"ingen(funconfig->letconfig=matchattrswith|["default",s]->{configwithOcsigen_extensions.mime_assoc=Ocsigen_charset_mime.set_default_mimeconfig.Ocsigen_extensions.mime_assocs}|[]->config|_->bad_config"Only attribute \"default\" is permitted \
for option \"contenttype\""in{configwithOcsigen_extensions.mime_assoc=auxconfig.Ocsigen_extensions.mime_assocexts})|Xml.Element("defaultindex",[],l)->letrecauxindexes=function|[]->List.revindexes|Xml.Element("index",[],[Xml.PCDataf])::q->aux(f::indexes)q|_::_->bad_config"subtags must be of the form \
<index>...</index> \
in option defaultindex"ingen(funconfig->{configwithOcsigen_extensions.default_directory_index=aux[]l})|Xml.Element("defaultindex"ass,_,_)->Ocsigen_extensions.badconfig"Bad syntax for tag %s"s|Xml.Element("hidefile",[],l)->letdo_not_serve=gather_do_not_serve_files"hidefile"lin(trycheck_regexp_listdo_not_serve.Ocsigen_extensions.do_not_serve_regexps;gen(funconfig->{configwithOcsigen_extensions.do_not_serve_404=Ocsigen_extensions.join_do_not_servedo_not_serveconfig.Ocsigen_extensions.do_not_serve_404})withBad_regexpr->Ocsigen_extensions.badconfig"Invalid regexp %s in %s"r"hidefile")|Xml.Element("hidefile"ass,_,_)->Ocsigen_extensions.badconfig"Bad syntax for tag %s"s|Xml.Element("forbidfile",[],l)->letdo_not_serve=gather_do_not_serve_files"forbidfile"lin(trycheck_regexp_listdo_not_serve.Ocsigen_extensions.do_not_serve_regexps;gen(funconfig->{configwithOcsigen_extensions.do_not_serve_403=Ocsigen_extensions.join_do_not_servedo_not_serveconfig.Ocsigen_extensions.do_not_serve_403})withBad_regexpr->Ocsigen_extensions.badconfig"Invalid regexp %s in %s"r"forbidfile")|Xml.Element("forbidfile"ass,_,_)->Ocsigen_extensions.badconfig"Bad syntax for tag %s"s|Xml.Element("uploaddir",[],[Xml.PCDatas])->gen@@ifs=""thenfunconfig->{configwithOcsigen_extensions.uploaddir=None}elsefunconfig->{configwithOcsigen_extensions.uploaddir=Somes}|Xml.Element("uploaddir"ass,_,_)->Ocsigen_extensions.badconfig"Bad syntax for tag %s"s|Xml.Element("maxuploadfilesize"astag,[],[Xml.PCDatas])->lets=tryOcsigen_parseconfig.parse_size_tag"uploaddir"swithOcsigen_config.Config_file_error_->Ocsigen_extensions.badconfig"Bad syntax for tag %s"tagingen@@funconfig->{configwithOcsigen_extensions.maxuploadfilesize=s}|Xml.Element("maxuploadfilesize"ass,_,_)->Ocsigen_extensions.badconfig"Bad syntax for tag %s"s|Xml.Element(t,_,_)->raise(Ocsigen_extensions.Bad_config_tag_for_extensiont)|_->raise(Ocsigen_extensions.Error_in_config_file"Unexpected data in config file")let()=Ocsigen_extensions.register~name~fun_site()