361 lines
13 KiB
JavaScript
361 lines
13 KiB
JavaScript
//Шаблон класса для авторизации пользователя (под проекты переделывается)
|
||
class DBMSUser
|
||
{
|
||
constructor(){
|
||
this.divsh=null;
|
||
this.id=null;
|
||
this.name='';
|
||
this.surname='';
|
||
this.patronymic='';
|
||
this.temp=false;
|
||
this.role='';
|
||
this.m_ls=new Array(); //Listeners called OnLogin function.
|
||
|
||
this.divsh = null;
|
||
//Запрашиваю данные о текущем пользователе с сервера
|
||
//this.LoadData();
|
||
}
|
||
|
||
applyReq(req,fn,node)
|
||
{
|
||
this.showShadow(false);
|
||
if(node.errorCode>0) {
|
||
alert2(trt('Alert'), node.errorMessage);
|
||
}
|
||
|
||
if(fn==7)
|
||
{
|
||
var nCmd=findFirstNode(node, "cmd");
|
||
if(nCmd!=null)
|
||
{
|
||
if(findFirstNode(nCmd,'#cdata-section').nodeValue=="1") //Logout
|
||
{
|
||
location.reload();
|
||
//window.location.href = '../';
|
||
}else if(findFirstNode(nCmd,'#cdata-section').nodeValue=="2") //Check if user not logged
|
||
{
|
||
if(findNode(node,'#cdata-section').nodeValue=="0") //if not logged
|
||
{
|
||
this.showLoginForm();
|
||
}else
|
||
{
|
||
this.name=getCdataValue(findNode(node,'name'));
|
||
this.surname=getCdataValue(findNode(node,'surname'));
|
||
this.patronymic=getCdataValue(findNode(node,'patronymic'));
|
||
|
||
if (typeof this.onUpdateName !== 'undefined') {
|
||
this.onUpdateName(this.name,this.surname,this.patronymic);
|
||
}
|
||
//configGUIbyAccessLevel();
|
||
//var shadow=document.getElementById("shadow");
|
||
//if(shadow.parentNode!=null) shadow.parentNode.removeChild(shadow);
|
||
|
||
//Информируем слушатеелй о логине
|
||
for(i=0;i<this.m_ls.length;i++){
|
||
if(this.m_ls[i]!==null){
|
||
this.m_ls[i].OnLogin(true); //0 - authorized, 1 - an incorrect username or password, 2 - left.
|
||
}
|
||
}
|
||
}
|
||
}else if(findFirstNode(nCmd,'#cdata-section').nodeValue=="3") //Login
|
||
{
|
||
if(findNode(node,'#cdata-section').nodeValue=="0") //if not logged
|
||
{
|
||
alert2(trt('Attention'),trt('Invalid_username_and_or_password'));
|
||
}else
|
||
{
|
||
//location.reload();
|
||
//Информируем слушатеелй о логине
|
||
for(i=0;i<this.m_ls.length;i++){
|
||
if(this.m_ls[i]!==null){
|
||
this.m_ls[i].OnLogin(true); //0 - authorized, 1 - an incorrect username or password, 2 - left.
|
||
}
|
||
}
|
||
}
|
||
}else if(findFirstNode(nCmd,'#cdata-section').nodeValue=="4") //Register
|
||
{
|
||
//if(findNode(node,'#cdata-section').nodeValue=="1") //if register
|
||
//{
|
||
// alert2(trt('Attention'),trt('New_user_is_registered')+'\n'+trt('The_password_has_been_sent_to_you_by_Email'),function(){ location.reload(); });
|
||
//}
|
||
}
|
||
}
|
||
}
|
||
|
||
};
|
||
//Display login and registration form
|
||
showLoginForm()
|
||
{
|
||
if(this.win==null || this.win.closed)
|
||
{
|
||
this.win=new TWin(true);
|
||
this.win.disableClosing=true;
|
||
this.win.BuildGUI(10,10);
|
||
deleteHTML('TWin_CL_'+this.win.uid); //Удаляю кнопку закрыть
|
||
this.win.setCaption(trt('Authorization'));
|
||
|
||
this.win.setSize("350px","184px");
|
||
|
||
var str='<div style="width: 100%; height: 100%; padding: 3px; text-align: left;">\n\
|
||
<table cellpadding="0" cellspacing="0" style="width: 100%; height: 100%;">\n\
|
||
<tbody>\n\
|
||
<tr><td>\n\
|
||
<table style="width: 100%; height: 100%;">\n\
|
||
<tr>\n\
|
||
<td style="padding: 2px; width: 30%; white-space: nowrap"><b>'+trt('Login')+' (E-mail):</b></td>\n\
|
||
<td style="padding: 2px;"><input type="text" maxlength="50" style="width: 100%; padding: 2px; display: inline;" id="tcLogin'+this.uid+'" name="login"><br></td>\n\
|
||
</tr>\n\
|
||
<tr>\n\
|
||
<td style="padding: 2px;"><b>Password:</b></td>\n\
|
||
<td style="padding: 2px;"><input type="password" maxlength="33" style="width: 100%; padding: 2px; display: inline;" id="tcPassword'+this.uid+'" name="password"><br></td>\n\
|
||
</tr>\n\
|
||
<tr>\n\
|
||
<td style="padding: 2px;" colspan="2"><table style="width: 100%;"><tr><td><label for="save0" style="white-space: nowrap;"><input id="save_'+this.uid+'" type="checkbox" style="display: inline;" checked/> Remember (<a href="#" onclick="g_user.showRestoreForm();">Forgot your password?</a>)</label></td></tr></table></td>\n\
|
||
</tr>\n\
|
||
<tr><td colspan="2" style="text-align: right;"><input class="button-secondary" id="TLogin_E'+this.uid+'" type="button" style="display: inline;" value="'+trt('Log_in')+'"></td></tr>\n\
|
||
</table>\n\
|
||
</td></tr>\n\
|
||
</tbody>\n\
|
||
</table>\n\
|
||
</div>';
|
||
|
||
this.win.setContent(str);
|
||
|
||
//Center the window and display the shadow
|
||
//if(this.win.tbl.offsetHeight>this.win.div.offsetHeight) this.win.div.style.height=this.win.tbl.offsetHeight+"px";
|
||
//if(this.win.tbl.offsetWidth>this.win.div.offsetWidth) this.win.div.style.width=this.win.tbl.offsetWidth+"px";
|
||
this.win.setCenter();
|
||
this.win.shadow=true;
|
||
this.win.hide(false);
|
||
|
||
//Нажатие на кнопку авторизоваться
|
||
var obj=null;
|
||
obj=document.getElementById('TLogin_E'+this.uid);
|
||
if(obj!==null)
|
||
{
|
||
obj.onclick=()=>
|
||
{
|
||
var xs='<?xml version="1.0" encoding="utf-8"?>\
|
||
<metadata fn="7">\
|
||
<cmd><![CDATA[3]]></cmd>\n\
|
||
<login><![CDATA['+document.getElementById('tcLogin'+this.uid).value+']]></login>\
|
||
<password><![CDATA['+document.getElementById('tcPassword'+this.uid).value+']]></password>\
|
||
</metadata>';
|
||
|
||
var request=new TRequest(this);
|
||
if(request.callServer(ScriptName,xs))
|
||
{
|
||
this.win.showProgressBar();
|
||
}
|
||
};
|
||
}
|
||
}
|
||
};
|
||
//logout current user
|
||
Logout()
|
||
{
|
||
xs='<?xml version="1.0" encoding="utf-8"?><metadata fn="7"><cmd><![CDATA[1]]></cmd></metadata>';
|
||
var request=new TRequest(this);
|
||
if(request.callServer(ScriptName,xs))
|
||
{
|
||
this.showShadow();
|
||
}
|
||
};
|
||
|
||
showLock(visible) {
|
||
if(this.divsh==null) {
|
||
this.divsh = document.createElement('div'); //Shadow
|
||
this.divsh.style.cssText = "display: none; position: fixed; z-index: 1000; top:0; left:0; height: 100%; width: 100%; background: rgba(0,0,0,0.3);";
|
||
document.body.append(this.divsh);
|
||
}
|
||
if(!visible)
|
||
this.divsh.style.display='none';
|
||
else
|
||
this.divsh.style.display='block';
|
||
}
|
||
|
||
//Checking the session without its extension, if it is completed, we display the authorization window.
|
||
checkSession()
|
||
{
|
||
$.ajax({
|
||
url: '../session',
|
||
data: "{}",
|
||
type: "POST",
|
||
dataType: "json",
|
||
success: (data,status) => {
|
||
if(status=='success')
|
||
{
|
||
if(data.result=='ERROR'){
|
||
this.showLoginForm();
|
||
}else
|
||
if(data.result=='OK'){
|
||
this.id=data.user_id;
|
||
}
|
||
this.showLock(false);
|
||
}else
|
||
{
|
||
this.showLock(true);
|
||
}
|
||
},
|
||
error: (jqXHR, exception)=>
|
||
{
|
||
this.showLock(true);
|
||
}
|
||
});
|
||
setTimeout(()=>this.checkSession(), 10000);
|
||
};
|
||
|
||
showShadow(visible)
|
||
{
|
||
if(visible)
|
||
{
|
||
this.divsh=document.createElement('div'); //Тень для модального окна
|
||
this.divsh.style.cssText="display: block; position: fixed; z-index:9999; top:0; left:0; height: 100%; width: 100%; background: rgba(0,0,0,0.3);";
|
||
document.body.appendChild( this.divsh );
|
||
}else
|
||
{
|
||
deleteHTML(this.divsh);
|
||
}
|
||
};
|
||
|
||
//Функция запрашивает информацию о текущем пользователе с сервера
|
||
LoadData()
|
||
{
|
||
var r = new TRequest(this);
|
||
var xs='<?xml version="1.0" encoding="utf-8"?><metadata fn="7"><cmd><![CDATA[2]]></cmd></metadata>';
|
||
if(r.callServer(ScriptName,xs))
|
||
{
|
||
this.showShadow(true);
|
||
}
|
||
};
|
||
//Check whether the already authorized (+ attempt to log in through "hash").
|
||
isLogined()
|
||
{
|
||
var xs='<?xml version="1.0" encoding="utf-8"?><metadata fn="7"><cmd><![CDATA[2]]></cmd></metadata>';
|
||
var request=new TRequest(this);
|
||
if(request.callServer(ScriptName,xs))
|
||
{
|
||
this.showShadow(true);
|
||
|
||
alert(ScriptName+" = "+xs);
|
||
|
||
//m_winPP.showProgressBar();
|
||
}
|
||
};
|
||
|
||
addListener(l)
|
||
{ if(l.OnLogin==null) alert('Object does not have the function "OnLogin()"!');
|
||
this.m_ls[this.m_ls.length]=l;
|
||
};
|
||
|
||
remListener(l){
|
||
for(let i=0;i<this.m_ls.length;i++){
|
||
if(this.m_ls[i]==l)
|
||
this.m_ls[i]=null;
|
||
}
|
||
};
|
||
|
||
//Display password recovery form
|
||
showRestoreForm()
|
||
{
|
||
var win=new TWin(true);
|
||
win.BuildGUI(10,10);
|
||
win.setCaption(trt("Password_recovery"));
|
||
|
||
let str='<div style="width: 100%; height: 100%; padding: 4px; text-align: left;">\n\
|
||
<table cellpadding="0" cellspacing="0" style="width: 100%; height: 100%; padding: 0px;">\n\
|
||
<tr>\n\
|
||
<td style="padding: 2px; white-space: nowrap"><b>'+trt('Login')+' (E-mail)</b></td>\n\
|
||
<td style="padding: 2px;"><input type="text" maxlength="40" style="width: 100%; display: inline;" id="'+win.uid+'_email" name="login">\n\
|
||
<table id="'+win.uid+'_phone" style="width: 100%; display: none;" cellpadding="0" cellspacing="0"><tr><td style="white-space: nowrap;"><b>+7 ( </b><input type="text" maxlength="3" onkeydown="this.value = this.value.replace(/[^0-9]/g, \'\')" onkeyup="this.value = this.value.replace(/[^0-9]/g, \'\')" style="width: 35px; display: inline;" id="'+win.uid+'_phone0" value=""><b> ) </b></td><td style="width: 90%;"><input type="text" onkeydown="this.value = this.value.replace(/[^0-9]/g, \'\')" onkeyup="this.value = this.value.replace(/[^0-9]/g, \'\')" maxlength="7" style="width: 100%;display: inline;" id="'+win.uid+'_phone1" value=""></td></tr></table><br></td>\n\
|
||
</tr>\n\
|
||
<tr><td colspan="2" style="text-align: right; padding: 2px;"><input class="button-secondary" id="'+win.uid+'_restore" type="button" style="display: inline;" value="'+trt('Restore')+'"></td></tr>\n\
|
||
</table>\n\
|
||
</td></tr>\n\
|
||
</div>';
|
||
win.setContent(str);
|
||
|
||
//Центрируем окно и отображаем тень
|
||
if(win.tbl.offsetHeight>win.div.offsetHeight) win.div.style.height=win.tbl.offsetHeight+"px";
|
||
if(win.tbl.offsetWidth>win.div.offsetWidth) win.div.style.width=win.tbl.offsetWidth+"px";
|
||
win.setCenter();
|
||
win.shadow=true;
|
||
win.hide(false);
|
||
|
||
//Click on restore button
|
||
var obj=null;
|
||
obj=document.getElementById(win.uid+'_restore');
|
||
if(obj!=null)
|
||
{
|
||
obj.onclick=function(win)
|
||
{ return function()
|
||
{
|
||
win.showProgressBar();
|
||
|
||
var em=document.getElementById(win.uid+'_email').value;
|
||
|
||
if(em==''){ document.getElementById(win.uid+'_email').select(); alert(trt('Not_filled_Email_address')); win.hideProgressBar(); return; }
|
||
if(! isEmail(em)){ document.getElementById(win.uid+'_email').select(); alert(trt('Please_enter_a_valid_email_address')); win.hideProgressBar(); return; }
|
||
|
||
//Send AJAX reqwest to server
|
||
var xml='<?xml version="1.0" encoding="utf-8"?>\
|
||
<metadata fn="7">\
|
||
<cmd><![CDATA[0]]></cmd>\
|
||
<login><![CDATA['+em+']]></login>\
|
||
<captcha><![CDATA[]]></captcha>\
|
||
</metadata>';
|
||
|
||
//Anonymous object
|
||
obj=new function(win)
|
||
{
|
||
this.processReqChange = function(xmlHttpRequest, url, xmlString)
|
||
{
|
||
if(typeof(xmlHttpRequest.status)=='undefined' || xmlHttpRequest.status == 200)
|
||
{
|
||
if(typeof(xmlHttpRequest.responseXML)=='undefined' && xmlHttpRequest.contentType.match(/\/xml/)) //For IE XDomainRequest
|
||
xmlHttpRequest.responseXML=CreateXMLDOC(xmlHttpRequest.responseText);
|
||
|
||
//загрузился xml документ начинаем его разбирать (по id функции в документе)
|
||
let xmldoc = xmlHttpRequest.responseXML
|
||
if(xmldoc==null) {
|
||
alert2(trt('Alert'), trt('Wrong_XML_document') + "!\n" + xmlHttpRequest.responseText);
|
||
}else {
|
||
var node = xmldoc.documentElement;
|
||
if ((node == null) || (node.getAttribute("fn") == null)) alert(trt('Error') + "\n " + trt("No_data") + "!\n" + xmlHttpRequest.responseText);
|
||
else {
|
||
//alert("Принятый браузером XML=\n"+getXMLNodeSerialisation(node));
|
||
var fn = node.getAttribute("fn");
|
||
if (fn == -1) {
|
||
alert(findFirstNode(node, '#cdata-section').nodeValue);
|
||
this.win.hideProgressBar();
|
||
} else if (fn == 7) {
|
||
alert(findFirstNode(node, '#cdata-section').nodeValue);
|
||
this.win.Close();
|
||
}
|
||
}
|
||
}
|
||
}else
|
||
{
|
||
if(confirm(trt('Failed_to_get_data')+"\n URL: "+url+"\n"+xmlHttpRequest.statusText+"\nRedo the request?"))
|
||
{
|
||
var call=new myXMLHttpRequest(this);
|
||
call.callServer(url,xmlString);
|
||
}
|
||
}
|
||
return null;
|
||
};
|
||
this.win=win; //For close after showing message.
|
||
}
|
||
(win);
|
||
|
||
var call=new myXMLHttpRequest(obj);
|
||
call.callServer(ScriptName,xml);
|
||
|
||
};
|
||
}(win);
|
||
}
|
||
}
|
||
|
||
}
|
||
|