123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184(* Ocsigen
* http://www.ocsigen.org
* Copyright (C) 2007 Vincent Balat
*
* 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.
*)(*****************************************************************************)(*****************************************************************************)(** Internal functions used by Eliom: *)(** Session timeouts *)(*****************************************************************************)(*****************************************************************************)openEliom_libopenLwttypekind=[`Service|`Data|`Persistent](*****************************************************************************)(* Table of timeouts for sessions *)letdefault_timeouts:(kind*Eliom_common.cookie_level*Eliom_common.scope_hierarchyoption,float)Hashtbl.t=lett=Hashtbl.create9inHashtbl.addt(`Service,`Session,None)3600.;Hashtbl.addt(`Data,`Session,None)3600.;Hashtbl.addt(`Persistent,`Session,None)86400.;Hashtbl.addt(`Service,`Client_process,None)3600.;Hashtbl.addt(`Data,`Client_process,None)3600.;Hashtbl.addt(`Persistent,`Client_process,None)86400.;tletset_default?scope_hierarchykindlevel=function|Somet->Hashtbl.replacedefault_timeouts((kind:>kind),(level:>Eliom_common.cookie_level),scope_hierarchy)t|None->Hashtbl.removedefault_timeouts((kind:>kind),(level:>Eliom_common.cookie_level),scope_hierarchy)letget_defaultkinduser_scope=letlevel=Eliom_common.cookie_level_of_user_scopeuser_scopeandscope_hierarchy=Eliom_common.scope_hierarchy_of_user_scopeuser_scopeintrySome(Hashtbl.finddefault_timeouts((kind:>kind),(level:>Eliom_common.cookie_level),Somescope_hierarchy))withNot_found->(trySome(Hashtbl.finddefault_timeouts((kind:>kind),(level:>Eliom_common.cookie_level),None))withNot_found->None)letset_timeout_getsetget_defaultupdate?full_st_name?cookie_level~recompute_expdatesoverride_configfilefromconfigfilesitedatat=(* cookie_level is useful and mandatory
only if full_st_name is not present *)letdef_bro,def_tab,tl=getsitedatainmatchfull_st_namewith|None->((* means default timeout for all hierarchies *)matchdef_bro,def_tab,cookie_levelwith|Some(_,true),_,Some`Sessionwhennotoverride_configfile->()(* if it has been set by config file
and we do not ask to override, we do nothing *)|_,Some(_,true),Some`Client_processwhennotoverride_configfile->()(* if it has been set by config file
and we do not ask to override, we do nothing *)|_,_,Some`Session->setsitedata(Some(t,fromconfigfile),def_tab,tl)|_,_,Some`Client_process->setsitedata(def_bro,Some(t,fromconfigfile),tl)|_,_,None->failwith"set_timeout_")|Some({Eliom_common.user_scope;_}asfull_st_name)->(* recompute_expdates works only if full_st_name is present *)letoldtopt=trylet(oldt,wasfromconf),newtl=List.assoc_removefull_st_nametlinifoverride_configfile||notwasfromconfthensetsitedata(def_bro,def_tab,(full_st_name,(t,fromconfigfile))::newtl);SomeoldtwithNot_found->setsitedata(def_bro,def_tab,(full_st_name,(t,fromconfigfile))::tl);Noneinifrecompute_expdatesthenletoldt=matcholdtoptwith|Someo->o|None->(matchdef_bro,def_tab,user_scopewith|Some(t,_),_,`Session_->t|_,Some(t,_),`Client_process_->t|_,_,ct->get_defaultct)inignore(catch(fun()->updatefull_st_namesitedataoldtt)(function|exn->Lwt_log.warning~exn~section:Lwt_log.eliom"Error while updating timeouts"))(*VVV Check possible exceptions raised *)(* global timeout = timeout for the whole site (may be changed dynamically) *)letsitedata_timeoutkindsitedata=matchkindwith|`Service->sitedata.Eliom_common.servtimeout|`Data->sitedata.Eliom_common.datatimeout|`Persistent->sitedata.Eliom_common.perstimeoutletset_sitedata_timeoutkindsitedatav=matchkindwith|`Service->sitedata.Eliom_common.servtimeout<-v|`Data->sitedata.Eliom_common.datatimeout<-v|`Persistent->sitedata.Eliom_common.perstimeout<-vletfind_globalkindfull_st_namesitedata=letdef_bro,def_tab,tl=sitedata_timeoutkindsitedataintryfst(List.assocfull_st_nametl)withNot_found->(matchdef_bro,def_tab,full_st_name.Eliom_common.user_scopewith|Some(t,_),_,`Session_->t|_,Some(t,_),`Client_process_->t|_,_,ct->get_defaultkindct)letset_global_?full_st_name?cookie_level~kind~recompute_expdatesa=set_timeout_(sitedata_timeoutkind)(set_sitedata_timeoutkind)(get_defaultkind)Eliommod_sessadmin.update_serv_exp?full_st_name?cookie_level~recompute_expdatesaletget_global~kind~cookie_scope~securesitedata=letfull_st_name=Eliom_common.make_full_state_name2(Eliom_common.get_site_dir_stringsitedata)secure~scope:cookie_scopeinfind_globalkindfull_st_namesitedataletset_global~kind~cookie_scope~secure~recompute_expdatesoverride_configfilesitedatatimeout=letfull_st_name=Eliom_common.make_full_state_name2(Eliom_common.get_site_dir_stringsitedata)secure~scope:cookie_scopeinset_global_~kind~full_st_name~recompute_expdatesoverride_configfilefalsesitedatatimeoutletset_default_globalkindcookie_leveloverride_configfilefromconfigfilesitedatatimeout=set_global_~kind~cookie_level~recompute_expdates:falseoverride_configfilefromconfigfilesitedatatimeout