Files
Facilitor/APPL/PRS/self_register_save.asp
Maykel Geerdink 70e882f32d VLKC#40792: foutmelding bij inlezen personenbestand, onbekende foutmelding.
KFNS#40810: AiAi - self_register FAC_AUDIT wordt gemuteerd en mag niet door trigger/functie.

svn path=/Website/branches/v2017.1/; revision=34167
2017-06-08 07:10:29 +00:00

154 lines
6.7 KiB
Plaintext

<%@language = "javascript" %>
<% /*
$Revision$
$Id$
*/
ANONYMOUS_Allowed = 1;
var JSON_Result = true;
%>
<!--#include file="../Shared/common.inc"-->
<% settings.overrule_setting("multi_language_option", 0); %>
<!-- #include file="../Shared/save2db.inc" -->
<!-- #include file="../Shared/send_mail.inc"-->
<!-- #include file="../Shared/json2.js" -->
<!-- #include file="../Shared/login.inc" -->
<%
if (S("self_register") != 1)
shared.simpel_page(L("lcl_no_auth"));
var result = { rsuccess: 1, warning: "" };
var email = getFParam("prs_email", "");
email = email.replace(/^\s+|\s+$/g,""); // trim spaces
var password = getFParam("password1");
if ( password != getFParam("password2") )
abort_with_warning(L("lcl_pwd_mismatch"));
if (S("prs_password_validation") && !new RegExp(S("prs_password_validation")).test(password))
abort_with_warning(L("lcl_invalid_pwd_format"));
// Uberhaupt syntactisch geldige e-mail?
if (!new RegExp(S("email_regexp_single"), "ig").test(email))
abort_with_warning(L("lcl_invalid_email"));
// En valt het ook binnen onze eventuele white-list?
if (S("self_register_email_whitelist") && !new RegExp(S("self_register_email_whitelist"), "ig").test(email))
abort_with_warning(L("lcl_self_register_email_wrong")); // Email niet geaccepteerd
var sql = "SELECT prs_perslid_key, "
+ " prs_perslid_aanmaak, "
+ " prs_perslid_flags"
+ " FROM prs_v_aanwezigperslid"
+ " WHERE (UPPER(prs_perslid_email) =" + safe.quoted_sql_upper(email) + " OR "
+ " UPPER(prs_perslid_oslogin) = " + safe.quoted_sql_upper(email, 30) + ")";
oRs = Oracle.Execute(sql);
if (!oRs.eof)
{
if (oRs("prs_perslid_flags").Value & 2) // Unapproved
{
var aanmaak = new Date(oRs("prs_perslid_aanmaak").Value);
var expire = new Date();
expire.setMinutes(expire.getMinutes() - S("self_register_expire"));
if (expire > aanmaak)
{
// Referenties in tabellen naar deze pers_perslid_key moeten eerst verwijderd worden.
// Door cascade verwijderen van deze record onstaan audits op die tabellen die audit tracking hebben.
// Daardoor onstaan "ORA-04091:table VLKC.FAC_AUDIT is mutating, trigger/function may not see it" foutmeldingen
// op de delete van de prs_perslid_key uit de prs_perslid tabel.
// De tabellen prs_kostenplaats, prs_kostenplaatsgrp, prs_perslidkostenplaats en fac_gebruikersgroep hebben een prs_perslid_key referentie en audit tracking.
// Hier alleen regel uit fac_gebruikersgroep verwijderen omdat deze is aangemaakt. Regels uit de andere tabellen kunnen nog niet aangemaakt zijn.
var prs_key = oRs("prs_perslid_key").Value;
Oracle.Execute("DELETE FROM fac_gebruikersgroep WHERE prs_perslid_key = " + prs_key);
var sql = "DELETE prs_v_aanwezigperslid"
+ " WHERE prs_perslid_key = " + prs_key;
Oracle.Execute(sql); // Cascadeert ook de bookmark weg trouwens
}
else
abort_with_warning(L("lcl_self_register_active")); // Er loopt nog een aanvraag
}
else
abort_with_warning(L("lcl_self_register_duplicate"));
}
var fields = [ { dbs: "prs_perslid_naam", typ: "varchar", frm: "prs_naam" },
{ dbs: "prs_perslid_voornaam", typ: "varchar", frm: "prs_vrnaam" },
{ dbs: "prs_perslid_telefoonnr", typ: "varchar", frm: "prs_telnr" },
{ dbs: "prs_perslid_email", typ: "varchar", val: email },
{ dbs: "prs_perslid_mobiel", typ: "varchar", frm: "prs_mobiel" },
{ dbs: "prs_afdeling_key", typ: "key", val: S("self_register_afdeling_key") },
{ dbs: "prs_srtperslid_key", typ: "key", val: S("self_register_srtperslid_key") },
{ dbs: "prs_perslid_ingids", typ: "sql", val: "NULL" },
{ dbs: "prs_perslid_flags", typ: "number", val: 0x0002 }, // 2 = yet unapproved user
{ dbs: "prs_perslid_key", typ: "key", seq: "prs_s_prs_alluitvoerende_keys" } ];
var regIns = buildInsert("prs_perslid", fields);
var prs_key = regIns.sequences["prs_perslid_key"];
sql = regIns.sql;
var err = Oracle.Execute(sql, true);
if (err.friendlyMsg)
abort_with_warning(err.friendlyMsg);
// S("self_register_groep_keys") heeft prioriteit over S("self_register_groep_key")
if (S("self_register_groep_keys").length)
{
var fac_groep_key = getFParamInt("fac_groep_key", S("self_register_groep_keys")[0]);
if (!inArray(fac_groep_key, S("self_register_groep_keys")))
abort_with_warning(L("lcl_self_register_group_invalid"));
sql = "INSERT INTO fac_gebruikersgroep"
+ " (fac_groep_key, prs_perslid_key)"
+ " VALUES (" + fac_groep_key + ", " + prs_key + ")";
Oracle.Execute(sql);
}
// else komt die _DEFAULT groep wel zodra we prs_perslid_oslogin zetten
sql = "UPDATE prs_perslid"
+ " SET prs_perslid_oslogin = " + safe.quoted_sql(email, 30)
+ " WHERE prs_perslid_key = " + prs_key;
var err = Oracle.Execute(sql, true);
if (err.friendlyMsg)
abort_with_warning(err.friendlyMsg);
// Geen doLogin hier want dat is te gemakkelijk te misbruiken. Wel even voor
// de rest van *dit* bestand user_key en user zetten zodat we kunnen tracken
user_key = prs_key;
user = new Perslid(user_key);
shared.trackaction("PRSNEW", prs_key);
bookmarkId = shared.random(32); //
sql = "INSERT INTO fac_bookmark ( "
+ " fac_bookmark_id, "
+ " prs_perslid_key, "
+ " fac_bookmark_naam, "
+ " fac_bookmark_path, "
+ " fac_bookmark_query, "
+ " fac_bookmark_flags, "
+ " fac_bookmark_expire ) "
+ " VALUES ( "
+ safe.quoted_sql(bookmarkId) + ", "
+ prs_key + ", "
+ " 'Self-registration', "
+ " 'appl/prs/self_register_confirm.asp', "
+ safe.quoted_sql("user_key=" + prs_key) + ", " // is straks beschermd met HMAC
+ "0," // Zelfs onzichtbaar voor PRSSYS
+ " sysdate+("+S("self_register_expire")+"/24/60) )"
Oracle.Execute(sql);
setpassword(prs_key, password);
// Pas er op met de afzender: als het e-mail adres niet bestaat of incorrect is
// krijgt de afzender de gebouncte e-mail en zou daar zo maar kunnen klikken.
fac_send_bookmark(bookmarkId, email, L("lcl_self_register_subject"), L("lcl_self_register_body"),
{ FromAddress: S("self_fromaddress"), ReplyAddress: S("self_replyaddress") });
var result = { success: true, message: L("lcl_self_register_email_sent").format(email) };
Response.Write(JSON.stringify(result));
Response.End;
%>