(* camlp4r pa_extend.cmo ./pa_html.cmo ./pa_lock.cmo *) (* $Id: gwd.ml,v 4.69 2004/12/14 09:53:21 ddr Exp $ *) (* Copyright (c) 1998-2005 INRIA *) open Config; open Def; open Gutil; open Util; open Printf; value green_color = "#2f6400"; value selected_addr = ref None; value selected_port = ref 2317; value redirected_addr = ref None; value wizard_passwd = ref ""; value friend_passwd = ref ""; value wizard_just_friend = ref False; value only_address = ref ""; value cgi = ref False; value default_lang = ref "fr"; value setup_link = ref False; value choose_browser_lang = ref False; value images_dir = ref ""; value log_file = ref ""; value log_flags = [Open_wronly; Open_append; Open_creat; Open_text; Open_nonblock] ; ifdef UNIX then value max_clients = ref None; value robot_xcl = ref None; value auth_file = ref ""; value daemon = ref False; value login_timeout = ref 1800; value conn_timeout = ref 120; value trace_failed_passwd = ref False; value log_oc () = if log_file.val <> "" then try Secure.open_out_gen log_flags 0o644 log_file.val with [ Sys_error _ -> do { log_file.val := ""; stderr } ] else stderr ; value flush_log oc = if log_file.val <> "" then close_out oc else flush oc; value is_multipart_form = let s = "multipart/form-data" in fun content_type -> let rec loop i = if i >= String.length content_type then False else if i >= String.length s then True else if content_type.[i] == Char.lowercase s.[i] then loop (i + 1) else False in loop 0 ; value extract_boundary content_type = let e = Util.create_env content_type in List.assoc "boundary" e ; value fprintf_date oc tm = fprintf oc "%4d-%02d-%02d %02d:%02d:%02d" (1900 + tm.Unix.tm_year) (succ tm.Unix.tm_mon) tm.Unix.tm_mday tm.Unix.tm_hour tm.Unix.tm_min tm.Unix.tm_sec ; value print_and_cut_if_too_big oc str = loop 0 where rec loop i = if i < String.length str then do { output_char oc str.[i]; let i = if i > 700 && String.length str - i > 750 then do { fprintf oc " ... "; String.length str - 700 } else i + 1 in loop i } else () ; value log oc tm conf from gauth request script_name contents = let referer = Wserver.extract_param "referer: " '\n' request in let user_agent = Wserver.extract_param "user-agent: " '\n' request in do { let tm = Unix.localtime tm in fprintf_date oc tm; fprintf oc " (%d)" (Unix.getpid ()); fprintf oc " %s?" script_name; print_and_cut_if_too_big oc contents; output_char oc '\n'; fprintf oc " From: %s\n" from; if gauth <> "" then fprintf oc " User: %s\n" gauth else (); if conf.wizard && not conf.friend then fprintf oc " User: %s%s(wizard)\n" conf.user (if conf.user = "" then "" else " ") else if conf.friend && not conf.wizard then fprintf oc " User: %s%s(friend)\n" conf.user (if conf.user = "" then "" else " ") else (); if user_agent <> "" then fprintf oc " Agent: %s\n" user_agent else (); if referer <> "" then do { fprintf oc " Referer: "; print_and_cut_if_too_big oc referer; fprintf oc "\n" } else (); } ; value log_passwd_failed passwd uauth oc tm from request base_file = let referer = Wserver.extract_param "referer: " '\n' request in let user_agent = Wserver.extract_param "user-agent: " '\n' request in do { let tm = Unix.localtime tm in fprintf_date oc tm; fprintf oc " (%d)" (Unix.getpid ()); fprintf oc " %s_%s" base_file passwd; fprintf oc " => failed"; if trace_failed_passwd.val then fprintf oc " (%s)" (String.escaped uauth) else (); fprintf oc "\n"; fprintf oc " From: %s\n" from; fprintf oc " Agent: %s\n" user_agent; if referer <> "" then fprintf oc " Referer: %s\n" referer else (); } ; value copy_file fname = match try Some (Secure.open_in fname) with [ Sys_error _ -> None ] with [ Some ic -> do { try while True do { let c = input_char ic in Wserver.wprint "%c" c } with _ -> (); close_in ic; } | None -> () ] ; value http answer = do { Wserver.http answer; Wserver.wprint "Content-type: text/html; charset=iso-8859-1"; } ; value refuse_log from cgi = let oc = Secure.open_out_gen log_flags 0o644 "refuse_log" in do { let tm = Unix.localtime (Unix.time ()) in fprintf_date oc tm; fprintf oc " excluded: %s\n" from; close_out oc; if not cgi then http "403 Forbidden" else (); Wserver.wprint "Content-type: text/html"; Util.nl (); Util.nl (); Wserver.wprint "Your access has been disconnected by administrator.\n"; copy_file "refuse.txt"; } ; value only_log from cgi = let oc = log_oc () in do { let tm = Unix.localtime (Unix.time ()) in fprintf_date oc tm; fprintf oc " Connection refused from %s (only %s)\n" from only_address.val; flush_log oc; if not cgi then http "" else (); Wserver.wprint "Content-type: text/html; charset=iso-8859-1"; Util.nl (); Util.nl (); Wserver.wprint "
\n"; tag "ul" begin Util.html_li conf; stag "a" "href=\"%s\"" link begin Wserver.wprint "%s" link; end; Wserver.wprint "\n"; end; Util.trailer conf; } ] } ; value propose_base conf = let title _ = Wserver.wprint "Base" in do { Util.header conf title; tag "ul" begin Util.html_li conf; Wserver.wprint "