<% /*
    $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('<!DOCTYPE html>');
}

%>
<!-- #include file="default.inc" -->
<!-- #include file="locale.inc" -->
<!-- #include file="hookfunctions.inc" -->
<!-- #include file="shared.inc" -->
<!-- #include file="logger.inc" -->
<!-- #include file="m_connections.inc" -->
<!-- #include file="putorders.inc" -->
<!-- #include file="header.inc" -->
<!-- #include file="user.inc" -->
<%

// 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 <em>{2}</em> 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 http<em>s</em>://<%=Request.ServerVariables("SERVER_NAME") + rooturl%>
    <script type="text/javascript">
        window.top.location.href = "https://<%=Request.ServerVariables("SERVER_NAME") + rooturl%>";
    </script>
    <%
    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"));
    if (Session("last_ip") && Session("last_ip") != ip)
    {
        __DoLog("Unexpected ip-change from {0} to {1}".format(Session("last_ip"), ip), "#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
%>