<%@language="javascript"%>
<% /*
     $Revision$
     $Id$

     File:          pchange_save
     Description:   Sla de wijzigingen van pchange.asp op
     Context:

     NOTE:
*/ %>
<%
var EXPIRED_PASSWORD_OK = true;
var NO_OTP_OK = true;
var JSON_Result = true;
%>
<!-- #include file="../Shared/common.inc" -->
<!-- #include file="../Shared/save2db.inc" -->
<!-- #include file="../aut/login.inc" -->
<%
protectRequest.validateToken();

var theUser_key = getQParamInt("prs_key");
var xfunc = user.func_enabled("FAC", null, null, theUser_key, null, true); // laatste true: isOptional
if (theUser_key != user_key && !xfunc.canWrite("WEB_PRSSYS")&& !xfunc.canWrite("WEB_FACMGT"))
  abort_with_warning(L("lcl_no_auth"));

var clearpassword = getFParamInt("clear",0) == 1;
if (clearpassword && !xfunc.canWrite("WEB_PRSSYS") && !xfunc.canWrite("WEB_FACMGT"))
  abort_with_warning(L("lcl_no_auth"));

var user_info = new Perslid(theUser_key);
// Als ik zelf geen PRSSYS heb mag ik niet het wachtwoord veranderen van mensen die dat wel hebben.
// Anders een security lek
if (!xfunc.canWrite("WEB_PRSSYS") && user_info.has("WEB_PRSSYS"))
  abort_with_warning(L("lcl_no_auth"));
// hetzelfde voor FACFAC
if (!xfunc.canWrite("WEB_FACFAC") && user_info.has("WEB_FACFAC"))
  abort_with_warning(L("lcl_no_auth"));

// pass_expired alleen voor anderen
var pass_expired = theUser_key != user_key && getFParam("pass_expired", "off") == "on";

if (  Session("must_reset_password") != 1
   && theUser_key == user_key
   && (  (!xfunc.canWrite("WEB_PRSSYS") && !xfunc.canWrite("WEB_FACMGT") )
      || (user_info.haspw() )
      )  // Dan moet het oude wachtwoord kloppen
   )
{
  if (!testpassword(theUser_key, getFParam("password0"), {strict: true}))
      abort_with_warning(L("lcl_pwd_failed"));
}
if (theUser_key == user_key &&
    user.password_expired())
{
  if (testpassword(theUser_key, getFParam("password1"), {strict: true}))
      abort_with_warning(L("lcl_pwd_failed")); // Hij *moet* verschillen van het oude wachtwoord
}

var newPassword = "";
if (!clearpassword)
{
  var newPassword = getFParam("password1");

  if (newPassword != getFParam("password2") )
    abort_with_warning(L("lcl_pwd_mismatch"));

  validatePassword(theUser_key, newPassword); // aborts on failure

}

// alle oude fac_session opruimen gebeurt door een trigger op PRS_PERSLID
shared.trackaction("PRSLOG", theUser_key, L("lcl_pwd_success"));
setpassword(theUser_key, newPassword, pass_expired);
if (theUser_key == user_key)
{
    doLogin(user_key); // Want credentials gewijzigd
}

if (clearpassword) // Eventuele OTP ook wissen
{
    var sql = "UPDATE prs_perslid"
            + "   SET prs_perslid_otpsecret = NULL"
            + "     , prs_perslid_otpcounter = NULL"
            + " WHERE prs_perslid_key = " + user_key;
    Oracle.Execute(sql);
    shared.trackaction("PRSLOG", theUser_key, L("lcl_otp_cleared"));
}
deleteSessionCookie("fcltid"); // Die is nu toch ongeldig

Session.Contents.Remove("must_reset_password");

// Huidige (ASP) sessie laten (be)staan. Ons anti-forgery token is daar aan
// gekoppeld en die zit clientside in de header bij de logoff knop
// if (theUser_key == user_key)
//     doLogin(user_key)
// Het is niet helemaal zuiver dat het FAC_SESSION record van onszelf nu
// verwijderd is. Daar hebben we in de praktijk geen last van (dd. 5.3.2)

var result = { toaster: L("lcl_pwd_success"), success: true };
Response.Write(JSON.stringify(result));
%><% ASPPAGE_END(); %>
