123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337(* 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"lintrycheck_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"lintrycheck_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"maxuploadfilesize"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()letmaxuploadfilesizes___=gen@@funconfig->{configwithOcsigen_extensions.maxuploadfilesize=s}letuploaddird___=gen@@funconfig->{configwithOcsigen_extensions.uploaddir=d}letfollowsymlinksv___=gen@@funconfig->{configwithOcsigen_extensions.follow_symlinks=v}letlistdirsv___=gen@@funconfig->{configwithOcsigen_extensions.list_directory_content=v}letforbidfile?(files=[])?(extensions=[])?(regexps=[])()___=letdo_not_serve={Ocsigen_extensions.do_not_serve_regexps=regexps;do_not_serve_files=files;do_not_serve_extensions=extensions}incheck_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}lethidefile?(files=[])?(extensions=[])?(regexps=[])()___=letdo_not_serve={Ocsigen_extensions.do_not_serve_regexps=regexps;do_not_serve_files=files;do_not_serve_extensions=extensions}incheck_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}letdefaultindexv___=gen@@funconfig->{configwithOcsigen_extensions.default_directory_index=v}letcontenttype?default?(files=[])?(extensions=[])?(regexps=[])()___=gen@@funconfig->letmime_assoc=config.Ocsigen_extensions.mime_associnletmime_assoc=matchdefaultwith|None->mime_assoc|Somes->Ocsigen_charset_mime.set_default_mimemime_assocsinletmime_assoc=List.fold_left(funma(file,mime)->Ocsigen_charset_mime.update_mime_filemafilemime)mime_assocfilesinletmime_assoc=List.fold_left(funma(ext,mime)->Ocsigen_charset_mime.update_mime_extmaextmime)mime_assocextensionsinletmime_assoc=List.fold_left(funma(regexp,mime)->Ocsigen_charset_mime.update_mime_regexpma(Ocsigen_lib.Netstring_pcre.regexpregexp)mime)mime_assocregexpsin{configwithOcsigen_extensions.mime_assoc}letcharset?default?(files=[])?(extensions=[])?(regexps=[])()___=gen@@funconfig->letcharset_assoc=config.Ocsigen_extensions.charset_associnletcharset_assoc=matchdefaultwith|None->charset_assoc|Somes->Ocsigen_charset_mime.set_default_charsetcharset_assocsinletcharset_assoc=List.fold_left(funma(file,charset)->Ocsigen_charset_mime.update_charset_filemafilecharset)charset_assocfilesinletcharset_assoc=List.fold_left(funma(ext,charset)->Ocsigen_charset_mime.update_charset_extmaextcharset)charset_assocextensionsinletcharset_assoc=List.fold_left(funma(regexp,charset)->Ocsigen_charset_mime.update_charset_regexpma(Ocsigen_lib.Netstring_pcre.regexpregexp)charset)charset_assocregexpsin{configwithOcsigen_extensions.charset_assoc}