<% /* $Revision$ $Id$ File: common.inc Description: Common code die vooraan elk bestand *wordt uitgevoerd* We proberen op allerlei manieren te achterhalen of de gebruiker bekend is. Zo niet dan doen we uiteindelijk een redirect naar login.asp Parameters: Voor het includen van dit bestand kun je nog wat globale variabelen zetten om het gedrag te beinvloeden. JSON_Result ==> Altijd JSON result (auto DOCTYPE_Disable) DOCTYPE_Disable ==> Geen DOCTYPE header (voor JSON-requests) LCL_Disable ==> Geen lcl's cachen ANONYMOUS_Allowed ==> Voorkom redirect naar login.asp als niet ingelogd FCLTEXPIRES ==> Zet expire tijd van pagina (anders -1) LOGIN_try ==> Alleen vanuti LoginTry.asp==>geen redirect naar LoginTry.asp Context: vanuit ELK asp bestand Note: Dus gebruik met mate Setting gaan in default.inc Functies gaan naar shared.inc */ // Diverse andere variabelen zijn afhankelijk van rooturl en vooral customerId. Héél vroeg bepalen dus! var rooturl; var customerId; determineCustomerId(); // doet ook rooturl if (typeof JSON_Result == "undefined") JSON_Result = false; if (JSON_Result) DOCTYPE_Disable = true; if (typeof DOCTYPE_Disable == "undefined") { Response.write(''); } %> <% // NLS_LANG moet altijd op de webserver op WE8MSWIN1252 Response.Codepage = 1252; Response.Charset = 'windows-1252'; if (JSON_Result) Response.ContentType = "application/json"; Response.Expires = this.FCLTEXPIRES||-1; // Do not cache our ASP files settings.loadSET(); device.init(); var overrule_lcl = {}; function tryOverrule(path) { var fso = Server.CreateObject("Scripting.FileSystemObject"); var hookfile = Server.MapPath(path); if (fso.FileExists(hookfile)) { var hook = GetObject("script:"+hookfile); // Deze mag de hookfile gebruiken hook.Overrule = { DEFAULT: function (naam, type, waarde) { var v = Application("SET_" + customerId + "_" + naam); if (typeof v == "undefined" || type != Application("SET_T_" + naam) || waarde != Application("SET_" + customerId + "_" + naam)) { Application.Lock(); Application("SET_" + customerId + "_" + naam) = waarde; Application("SET_T_" + naam) = type; // Is voor alle klanten gelijk Application.UnLock(); __SafeDoLog("Default for setting {0} ({1}) set to {2} by cust/custenv.wsc DEFAULT".format(naam, type, waarde), "#FF0000"); } }, SET: function (naam, waarde) { settings.overrule_setting(naam.toLowerCase(), waarde); }, LCL: function (naam, waarde) { overrule_lcl[naam] = waarde; }, APPLICATION: function (naam, waarde) { if (Application(naam) != waarde) { Application.Lock(); Application(naam) = waarde; Application.UnLock(); } } } // Deze mogen de hookfiles gebruiken // Moet je ze wel in de wsc opnemen bij de properties hook.Oracle = Oracle; hook.__Log = __Log; hook.__DoLog = __DoLog; hook.safe = safe; // Met onderstaande kun je zeer foute trucs uithalen // Gedacht scenario: bijvoorbeeld in een testomgeving bij bepaalde // requests (API's) gericht logging aanzetten zonder bestanden // te hoeven wijzigen. var aspdata = { Application: Application, Request: Request, Session: Session, Request: Request, Response: Response, Server: Server }; hook.custenv(aspdata); hook = null; // zorg dat de GC het object kan opruimen. } } // Optionele overrules in cust/custenv.wsc en cust/XXXX/custenv.inc tryOverrule(rooturl + "/cust/custenv.wsc"); tryOverrule(custpath + "/custenv.wsc"); // deze is sterker // Plaats een offline.html bestandje in /temp, /cust/ of /cust/XXXX en de site gaat offline // TODO: via virtual /test wel naar binnen laten? of ?force=1 of ?offline=0 en Session var // Wat met API's? function tryOffline(path) { var fso = Server.CreateObject("Scripting.FileSystemObject"); var offlinefile = Server.MapPath(path + "offline.html"); if (fso.FileExists(offlinefile)) { // Geen Response.Redirect. Dan kan de gebruiker geen F5 drukken om weer verbinding te krijgen na een tijdje var ftekst = fso.OpenTextFile(offlinefile); var tekst = ftekst.ReadAll(); ftekst.Close(); shared.simpel_page(tekst); } } tryOffline(rooturl + "/temp/"); tryOffline(rooturl + "/cust/"); tryOffline(custpath + "/"); // deze is sterker // ip-restrictie controle var ips = S("sys_ip_restrict"); if (ips) { var ip = String(Request.ServerVariables("REMOTE_HOST")); var ips_intern = S("sys_ip_restrict_internal"); if (!new RegExp(ips.replace(/\./ig, "\\."), "ig").test(ip) && !(ips_intern && new RegExp(ips_intern.replace(/\./ig, "\\."), "ig").test(ip))) { Response.write ("Forbidden: IP address of the client has been rejected." ); // Doet IIS bij echte restrictie Response.Status = "403.6"; Response.end; } } if (S("hiresTimer")) hiresTimer = new ActiveXObject("SLNKDWF.About"); if (S("auto_https") && Request.ServerVariables("SERVER_PORT") != "443") { %> <% Response.End; } else { if (typeof NO_ADDHEADER == "undefined" && S("hsts_maxage") > 0) Response.AddHeader("Strict-Transport-Security", "max-age=" + S("hsts_maxage")); // Geen includeSubDomains, dat nekt http://facilitor.nl } if (Request.QueryString("orghome").Count>0) // Remember it. Share&Meet's Session("orghome") = String(Request.QueryString("orghome")); // Merk op: door onze Server.Transfer's met API's of inloggen zie je in Fiddler wel // eens dat X-FRAME-OPTIONS twee keer in de header komt. Slordig maar acceptabel. if (typeof NO_ADDHEADER == "undefined" && !S("allow_framed_facilitor")) Response.AddHeader ("X-FRAME-OPTIONS", "SAMEORIGIN"); // voorkom ClickJacking // Opdat share-and-meet cross-domain cookies werken tussen sgf12.dijkoraad.local en gewoon sgf12 // Het schijnt dat xxxx.facilitor.nl en yyyy.facilitor.nl wel gewoon zouden mogen werken? if (S("p3p_header")) Response.AddHeader("P3P", S("p3p_header")); protectHMAC.getProtectSecret(); // forceer eerste keer per dag var fixcookie = String(Request.Cookies("ASPFIXATION")); if (fixcookie) { var fixCustid = fixcookie.substr(0, customerId.length); if ( fixCustid != customerId) { // reset ingelogde user, customer wissel? Session("user_key")=user_key=-1; } } // Zie login.inc: ga ASP Session Fixation tegen. if (typeof Session("ASPFIXATION") != "undefined") { var fixcookie = Request.Cookies("ASPFIXATION"); if (Session("ASPFIXATION") != fixcookie) { // Simuleer logoff Session("user_key") = '-1'; // geen remove hier, anders grijpt SSO direct weer in Session.Contents.Remove("ASPFIXATION"); Response.Cookies("ASPFIXATION") = ""; Response.Cookies("ASPFIXATION").Path = rooturl + "/"; if (S("auto_https") & 2) Response.Cookies("ASPFIXATION").Secure=true; Response.Redirect(rooturl + "/appl/shared/expired.asp?aspfixation=1"); } } // Zijn we bekend? Zo niet dan naar login.asp om dat uit te zoeken var user_key = Session("user_key") || -1; var user; // wordt bij geldige user gevuld met new Perslid // Hetzelfde voor API2 app-user var app_user_key = -1; var app_user; if (user_key < 0 && typeof LOGIN_try == "undefined") { Server.Execute(rooturl + "/appl/shared/loginTry.asp"); // Laat die het eens proberen op te lossen if (Session("user_key") > 0) user_key = Session("user_key"); } if (user_key < 0 && typeof ANONYMOUS_Allowed == "undefined") { if (JSON_Result) // Login scherm werkt toch niet { Response.Clear(); // JSON.stringfy hebben we (nog!) niet gegarandeerd dus maar poor-man stringify Response.Write('{"warning":"'+L("lcl_session_expired").replace(/\n/g,"\\n").replace(/\"/g,"\\\"") +'","success":false}'); Response.End; } var url = Session("unauth_url") || S("login_url"); // unauth_url uit shorturl.asp if (getQParamInt("sso", -1) == 0) // forceer de default url = 'appl/shared/login.asp'; if (!url.match(/^http/)) var url = rooturl + "/" + url; // "appl/shared/login.asp"; ret_page = String(Request.ServerVariables("SCRIPT_NAME")); ret_page = ret_page.replace(/\/default.asp$/i, "/"); var qs = String(Request.ServerVariables("QUERY_STRING")); if ((qs && qs != 'fac_id=' + customerId) || (ret_page && ret_page != rooturl + "/")) { url = protectQS.create(url + "?querystring=" + Server.URLencode(qs) + "&ret_page=" + Server.URLencode(ret_page)); } Response.Redirect(url); } if (user_key > 0) { if (typeof REGISTERMENU_Disable == "undefined") { var from_menu_key = getQParamInt("from_menu_key", -1); if (from_menu_key > 0) { shared.registeraction("menu", {refkey: from_menu_key, daily: S("fac_gui_counter_menu_daily")}); } } var from_search_key = getQParamInt("from_search_key", -1); if (from_search_key > 0) { var url = String(Request.ServerVariables("SCRIPT_NAME")) + "?" + String(Request.ServerVariables("QUERY_STRING")); url = url.replace("&from_search_key=" + from_search_key, ""); // Dat hoeven we er niet in te hebben if (url.indexOf(rooturl) == 0) url = url.substr(rooturl.length + 1); shared.registeraction("searchchoice", { refkey: from_search_key, info: url }); } if (typeof NO_ADDHEADER == "undefined" && Request.Servervariables("HTTP_FCLT_VERSION").Count > 0) { // wordt opgepikt door FCLTAPI.DLL voor in de logging en daarna gestript. Niet in Fiddler dus Response.AddHeader ("FCLT_USERID", customerId + "\\" + String(user_key)); } Session.Contents.Remove("fallback_user_key"); // uit shorturl.asp. Ondertussen niet meer nodig Session.Contents.Remove("unauth_url"); // uit shorturl.asp. Ondertussen niet meer nodig Session("user_key") = user_key; /* global */ user = new Perslid(user_key); if (typeof EXPIRED_PASSWORD_OK == "undefined") { if (user.password_expired()) { Session("must_reset_password") = 1; Response.Redirect(rooturl + "/appl/prs/pchange.asp?expired=1"); } } CheckForLogging(Request.QueryString("LOGGING")); } // else zitten we in een bestand wat het user-object nooit benadert %>