<% /* $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 vanuit 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 if (!this.FCLTEXPIRES) Response.CacheControl = "no-cache, no-store"; if (typeof NO_ADDHEADER == "undefined") Response.AddHeader ("X-Content-Type-Options", "nosniff"); 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_DEFAULT_" + naam); if (typeof v == "undefined" || type != Application("SET_T_" + naam) || waarde != Application("SET_DEFAULT_" + naam)) { Application.Lock(); Application("SET_DEFAULT_" + 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") { %> Switching to https://<%=Request.ServerVariables("SERVER_NAME") + rooturl%> <% Response.End; } else { // 0 wordt ook ondersteund om het actief uit te schakelen if (typeof NO_ADDHEADER == "undefined" && S("hsts_maxage") >= 0 && Request.ServerVariables("SERVER_PORT") != "80") 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")=user_key=-1; // geen remove hier, anders grijpt SSO direct weer in setASPFIXATION(); // zet nieuwe cookie Response.Redirect(rooturl + "/appl/shared/expired.asp?aspfixation=1"); } } else setASPFIXATION(); // eerste keer if (S("sys_ip_lockmode") > 0) { var ip = String(Request.ServerVariables("REMOTE_ADDR")); // We zijn relatief flexibel: de laatste 16 bit wijzigen staan we toe // Deze bescherming tegen session hijacking is dus maar heel beperkt if (Session("last_ip") && Session("last_ip") != ip && !IP.inSubnet(Session("last_ip"), ip + "/16")) { var agent = String(Request.ServerVariables("HTTP_USER_AGENT")); __DoLog("Unexpected ip-change from {0} to {1}\n{2}".format(Session("last_ip"), ip, agent), "#0ff"); // Simuleer logoff Session.Contents.Remove("last_ip"); Session("user_key")=user_key=-1; // geen remove hier, anders grijpt SSO direct weer in } } // 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 || getQParamInt("jwtforce", 0) == 1) && 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_not_loggedin").replace(/\n/g,"\\n").replace(/\"/g,"\\\"") +'","success":false}'); Response.End; } var url = Session("unauth_url") || S("login_url"); // unauth_url uit shorturl.asp if (getQParam("sso", "") == "0") // forceer de default url = 'appl/shared/login.asp'; if (!url.match(/^http/)) var url = rooturl + "/" + url; // "appl/shared/login.asp"; var ret_page = ""; if (String(Request.ServerVariables("REQUEST_METHOD")) == "GET") { 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"); } if (user.credentials_changed()) { // login.inc is niet standaard included dus kan ik geen doLogoff() doen // Dit triggert echter de rest wel? Session.Contents.Remove("user_key"); } } if (Session("must_accept_terms") == 1 && typeof TERMS_CONDITIONS_OK == "undefined") { Response.Redirect(rooturl + "/appl/prs/terms.asp"); } CheckForLogging(Request.QueryString("LOGGING")); } // else zitten we in een bestand wat het user-object nooit benadert %>