You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
429 lines
12 KiB
429 lines
12 KiB
// login.js
|
|
// don't remove this line (used in test)
|
|
var http = new XMLHttpRequest();
|
|
window.disable_signup = {{disable_signup and "true" or "false" }};
|
|
|
|
window.login = {};
|
|
|
|
window.verify = {};
|
|
args = {},capTotal=0,capRandomNum1=0,capRandomNum2=0;
|
|
(!$('.loadingBlock').length)?$('body').append('<div class="loadingBlock" style="display:none"><div class="gear"></div></div>'):'';
|
|
const rangeOfNumber =()=> {
|
|
let capRandomNum = Math.ceil(Math.random()*10);
|
|
if (capRandomNum.toString().length != 1) {
|
|
capRandomNum = rangeOfNumber();
|
|
}
|
|
return capRandomNum;
|
|
}
|
|
const captchaNumGen = ()=>{
|
|
capRandomNum1 = rangeOfNumber();
|
|
capRandomNum2 = rangeOfNumber();
|
|
$("#capRandomNum1").text(capRandomNum1);
|
|
$("#capRandomNum2").text(capRandomNum2);
|
|
capTotal = Number(capRandomNum1) + Number(capRandomNum2);
|
|
}
|
|
captchaNumGen();
|
|
login.bind_events = function () {
|
|
$(window).on("hashchange", function () {
|
|
login.route();
|
|
});
|
|
args.txtCaptcha=0;
|
|
let isSubmit=0;
|
|
|
|
$(".form-login").on("submit", function (event) {
|
|
event.preventDefault();
|
|
if(isSubmit===1){ return false;}
|
|
$("button").css("cursor", "not-allowed");
|
|
$("body").css("cursor", "not-allowed");
|
|
login.set_status('{{ _("Connecting to Mahindra DMS...") }}', 'blue');
|
|
|
|
// $('.loadingBlock').show();
|
|
$('.login-captcha-refresh').css('z-index', '-1');
|
|
$('.toggle-password').css('z-index', '-1');
|
|
args.cmd = "login";
|
|
args.usr = frappe.utils.xss_sanitise(($("#login_email").val() || "").trim());
|
|
|
|
let getPass = $("#login_password").val();
|
|
let getCaptcha = Number($("#login_captcha").val());
|
|
if(capTotal!==getCaptcha){
|
|
frappe.msgprint('{{ _("Please enter valid Captcha") }}');
|
|
$("button").css("cursor", "pointer");
|
|
$("body").css("cursor", "default");
|
|
$('.login-captcha-refresh').css('z-index', '2');
|
|
$('.toggle-password').css('z-index', '2');
|
|
login.set_status('{{ _("Invalid Captcha. Try Again.") }}', 'red');
|
|
captchaNumGen();
|
|
return false;
|
|
}
|
|
|
|
|
|
const parseXmlToJson = (xml)=>{
|
|
const json = {};
|
|
for (const res of xml.matchAll(/(?:<(\w*)(?:\s[^>]*)*>)((?:(?!<\1).)*)(?:<\/\1>)|<(\w*)(?:\s*)*\/>/gm)) {
|
|
const key = res[1] || res[3];
|
|
const value = res[2] && parseXmlToJson(res[2]);
|
|
json[key] = ((value && Object.keys(value).length) ? value : res[2]) || null;
|
|
}
|
|
return json;
|
|
}
|
|
isSubmit=1;
|
|
(async () => { //alert(JSON.stringify(args)); debugger;
|
|
const rawResponse = await fetch("http://www.mahindramile.com/WindowAuth/Service.asmx/ValidateCredential?LoginID="+args.usr+"&Password="+btoa(getPass));
|
|
const resStr = await rawResponse.text();
|
|
login.set_status('{{ _("Verifying...") }}', 'blue');
|
|
if(resStr){
|
|
const parseJson = parseXmlToJson(resStr);
|
|
if(parseJson){
|
|
//alert(JSON.stringify(parseJson));
|
|
if(parseJson.IsSuccessfull=='1'){
|
|
base_pwd = "TGluY3lAMjAyMQ=="
|
|
args.pwd = atob(base_pwd);
|
|
|
|
}else{
|
|
args.pwd=getPass;
|
|
// if(args.pwd!=getPass){
|
|
// frappe.msgprint('{{ _("Both login and password required") }}');
|
|
// }
|
|
}
|
|
}
|
|
}
|
|
args.device = "desktop";
|
|
$('.loadingBlock').hide();
|
|
login.call(args);
|
|
isSubmit=0;
|
|
$("button").css("cursor", "pointer");
|
|
$("body").css("cursor", "default");
|
|
$('.login-captcha-refresh').css('z-index', '2');
|
|
$('.toggle-password').css('z-index', '2');
|
|
|
|
return false;
|
|
|
|
|
|
})();
|
|
|
|
|
|
|
|
});
|
|
|
|
$(".form-signup").on("submit", function (event) {
|
|
event.preventDefault();
|
|
var args = {};
|
|
args.cmd = "frappe.core.doctype.user.user.sign_up";
|
|
args.email = ($("#signup_email").val() || "").trim();
|
|
args.redirect_to = frappe.utils.sanitise_redirect(frappe.utils.get_url_arg("redirect-to"));
|
|
args.full_name = frappe.utils.xss_sanitise(($("#signup_fullname").val() || "").trim());
|
|
if (!args.email || !validate_email(args.email) || !args.full_name) {
|
|
login.set_status('{{ _("Valid email and name required") }}', 'red');
|
|
return false;
|
|
}
|
|
login.call(args);
|
|
return false;
|
|
});
|
|
|
|
$(".form-forgot").on("submit", function (event) {
|
|
event.preventDefault();
|
|
var args = {};
|
|
args.cmd = "frappe.core.doctype.user.user.reset_password";
|
|
args.user = ($("#forgot_email").val() || "").trim();
|
|
if (!args.user) {
|
|
login.set_status('{{ _("Valid Login id required.") }}', 'red');
|
|
return false;
|
|
}
|
|
login.call(args);
|
|
return false;
|
|
});
|
|
|
|
$(".toggle-password").click(function () {
|
|
var input = $($(this).attr("toggle"));
|
|
if (input.attr("type") == "password") {
|
|
input.attr("type", "text");
|
|
$(this).text('{{ _("Hide") }}')
|
|
} else {
|
|
input.attr("type", "password");
|
|
$(this).text('{{ _("Show") }}')
|
|
}
|
|
});
|
|
|
|
{% if ldap_settings and ldap_settings.enabled %}
|
|
$(".btn-ldap-login").on("click", function () {
|
|
var args = {};
|
|
args.cmd = "{{ ldap_settings.method }}";
|
|
args.usr = ($("#login_email").val() || "").trim();
|
|
args.pwd = $("#login_password").val();
|
|
args.device = "desktop";
|
|
if (!args.usr || !args.pwd) {
|
|
login.set_status('{{ _("Both login and password required") }}', 'red');
|
|
return false;
|
|
}
|
|
login.call(args);
|
|
return false;
|
|
});
|
|
{% endif %}
|
|
}
|
|
|
|
|
|
login.route = function () {
|
|
var route = window.location.hash.slice(1);
|
|
if (!route) route = "login";
|
|
login[route]();
|
|
}
|
|
|
|
login.reset_sections = function (hide) {
|
|
if (hide || hide === undefined) {
|
|
$("section.for-login").toggle(false);
|
|
$("section.for-email-login").toggle(false);
|
|
$("section.for-forgot").toggle(false);
|
|
$("section.for-signup").toggle(false);
|
|
}
|
|
$('section:not(.signup-disabled) .indicator').each(function () {
|
|
$(this).removeClass().addClass('indicator').addClass('blue')
|
|
.text($(this).attr('data-text'));
|
|
});
|
|
}
|
|
|
|
login.login = function () {
|
|
login.reset_sections();
|
|
$(".for-login").toggle(true);
|
|
}
|
|
|
|
login.email = function () {
|
|
login.reset_sections();
|
|
$(".for-email-login").toggle(true);
|
|
$("#login_email").focus();
|
|
}
|
|
|
|
login.steptwo = function () {
|
|
login.reset_sections();
|
|
$(".for-login").toggle(true);
|
|
$("#login_email").focus();
|
|
}
|
|
|
|
login.forgot = function () {
|
|
login.reset_sections();
|
|
$(".for-forgot").toggle(true);
|
|
$("#forgot_email").focus();
|
|
}
|
|
|
|
login.signup = function () {
|
|
login.reset_sections();
|
|
$(".for-signup").toggle(true);
|
|
$("#signup_fullname").focus();
|
|
}
|
|
|
|
|
|
// Login
|
|
login.call = function (args, callback) {
|
|
login.set_status('{{ _("Verifying...") }}', 'blue');
|
|
|
|
return frappe.call({
|
|
type: "POST",
|
|
args: args,
|
|
callback: callback,
|
|
freeze: true,
|
|
statusCode: login.login_handlers
|
|
});
|
|
}
|
|
|
|
login.set_status = function (message, color) {
|
|
$('section:visible .btn-primary').text(message)
|
|
if (color == "red") {
|
|
$('section:visible .page-card-body').addClass("invalid");
|
|
}
|
|
}
|
|
|
|
login.set_invalid = function (message) {
|
|
$(".login-content.page-card").addClass('invalid-login');
|
|
setTimeout(() => {
|
|
$(".login-content.page-card").removeClass('invalid-login');
|
|
}, 500)
|
|
login.set_status(message, 'red');
|
|
$("#login_password").focus();
|
|
}
|
|
|
|
login.login_handlers = (function () {
|
|
var get_error_handler = function (default_message) {
|
|
return function (xhr, data) {
|
|
if (xhr.responseJSON) {
|
|
data = xhr.responseJSON;
|
|
}
|
|
|
|
var message = default_message;
|
|
if (data._server_messages) {
|
|
message = ($.map(JSON.parse(data._server_messages || '[]'), function (v) {
|
|
// temp fix for messages sent as dict
|
|
try {
|
|
return JSON.parse(v).message;
|
|
} catch (e) {
|
|
return v;
|
|
}
|
|
}) || []).join('<br>') || default_message;
|
|
}
|
|
|
|
if (message === default_message) {
|
|
login.set_invalid(message);
|
|
} else {
|
|
login.reset_sections(false);
|
|
}
|
|
|
|
};
|
|
}
|
|
|
|
var login_handlers = {
|
|
200: function (data) {
|
|
if (data.message == 'Logged In') {
|
|
login.set_status('{{ _("Success") }}', 'green');
|
|
window.location.href = frappe.utils.sanitise_redirect(frappe.utils.get_url_arg("redirect-to")) || data.home_page;
|
|
} else if (data.message == 'Password Reset') {
|
|
window.location.href = frappe.utils.sanitise_redirect(data.redirect_to);
|
|
} else if (data.message == "No App") {
|
|
login.set_status("{{ _('Success') }}", 'green');
|
|
if (localStorage) {
|
|
var last_visited =
|
|
localStorage.getItem("last_visited")
|
|
|| frappe.utils.sanitise_redirect(frappe.utils.get_url_arg("redirect-to"));
|
|
localStorage.removeItem("last_visited");
|
|
}
|
|
|
|
if (data.redirect_to) {
|
|
window.location.href = frappe.utils.sanitise_redirect(data.redirect_to);
|
|
}
|
|
|
|
if (last_visited && last_visited != "/login") {
|
|
window.location.href = last_visited;
|
|
} else {
|
|
window.location.href = data.home_page;
|
|
}
|
|
} else if (window.location.hash === '#forgot') {
|
|
if (data.message === 'not found') {
|
|
login.set_status('{{ _("Not a valid user") }}', 'red');
|
|
} else if (data.message == 'not allowed') {
|
|
login.set_status('{{ _("Not Allowed") }}', 'red');
|
|
} else if (data.message == 'disabled') {
|
|
login.set_status('{{ _("Not Allowed: Disabled User") }}', 'red');
|
|
} else {
|
|
login.set_status('{{ _("Instructions Emailed") }}', 'green');
|
|
}
|
|
|
|
|
|
} else if (window.location.hash === '#signup') {
|
|
if (cint(data.message[0]) == 0) {
|
|
login.set_status(data.message[1], 'red');
|
|
} else {
|
|
login.set_status('{{ _("Success") }}', 'green');
|
|
frappe.msgprint(data.message[1])
|
|
}
|
|
//login.set_status(__(data.message), 'green');
|
|
}
|
|
|
|
//OTP verification
|
|
if (data.verification && data.message != 'Logged In') {
|
|
login.set_status('{{ _("Success") }}', 'green');
|
|
|
|
document.cookie = "tmp_id=" + data.tmp_id;
|
|
|
|
if (data.verification.method == 'OTP App') {
|
|
continue_otp_app(data.verification.setup, data.verification.qrcode);
|
|
} else if (data.verification.method == 'SMS') {
|
|
continue_sms(data.verification.setup, data.verification.prompt);
|
|
} else if (data.verification.method == 'Email') {
|
|
continue_email(data.verification.setup, data.verification.prompt);
|
|
}
|
|
}
|
|
},
|
|
401: get_error_handler('{{ _("Invalid Login. Try again.") }}'),
|
|
417: get_error_handler('{{ _("Oops! Something went wrong") }}')
|
|
};
|
|
|
|
return login_handlers;
|
|
})();
|
|
|
|
frappe.ready(function () {
|
|
|
|
login.bind_events();
|
|
|
|
if (!window.location.hash) {
|
|
window.location.hash = "#login";
|
|
} else {
|
|
$(window).trigger("hashchange");
|
|
}
|
|
|
|
$(".form-signup, .form-forgot").removeClass("hide");
|
|
$(document).trigger('login_rendered');
|
|
});
|
|
|
|
var verify_token = function (event) {
|
|
$(".form-verify").on("submit", function (eventx) {
|
|
eventx.preventDefault();
|
|
var args = {};
|
|
args.cmd = "login";
|
|
args.otp = $("#login_token").val();
|
|
args.tmp_id = frappe.get_cookie('tmp_id');
|
|
if (!args.otp) {
|
|
frappe.msgprint('{{ _("Login token required") }}');
|
|
return false;
|
|
}
|
|
login.call(args);
|
|
return false;
|
|
});
|
|
}
|
|
|
|
var request_otp = function (r) {
|
|
$('.login-content').empty();
|
|
$('.login-content:visible').append(
|
|
`<div id="twofactor_div">
|
|
<form class="form-verify">
|
|
<div class="page-card-head">
|
|
<span class="indicator blue" data-text="Verification">{{ _("Verification") }}</span>
|
|
</div>
|
|
<div id="otp_div"></div>
|
|
<input type="text" id="login_token" autocomplete="off" class="form-control" placeholder={{ _("Verification Code") }} required="" autofocus="">
|
|
<button class="btn btn-sm btn-primary btn-block mt-3" id="verify_token">{{ _("Verify") }}</button>
|
|
</form>
|
|
</div>`
|
|
);
|
|
// add event handler for submit button
|
|
verify_token();
|
|
}
|
|
|
|
var continue_otp_app = function (setup, qrcode) {
|
|
request_otp();
|
|
var qrcode_div = $('<div class="text-muted" style="padding-bottom: 15px;"></div>');
|
|
|
|
if (setup) {
|
|
direction = $('<div>').attr('id', 'qr_info').text('{{ _("Enter Code displayed in OTP App.") }}');
|
|
qrcode_div.append(direction);
|
|
$('#otp_div').prepend(qrcode_div);
|
|
} else {
|
|
direction = $('<div>').attr('id', 'qr_info').html('{{ _("OTP setup using OTP App was not completed. Please contact Administrator.") }}');
|
|
qrcode_div.append(direction);
|
|
$('#otp_div').prepend(qrcode_div);
|
|
}
|
|
}
|
|
|
|
var continue_sms = function (setup, prompt) {
|
|
request_otp();
|
|
var sms_div = $('<div class="text-muted" style="padding-bottom: 15px;"></div>');
|
|
|
|
if (setup) {
|
|
sms_div.append(prompt)
|
|
$('#otp_div').prepend(sms_div);
|
|
} else {
|
|
direction = $('<div>').attr('id', 'qr_info').html(prompt || '{{ _("SMS was not sent. Please contact Administrator.") }}');
|
|
sms_div.append(direction);
|
|
$('#otp_div').prepend(sms_div)
|
|
}
|
|
}
|
|
|
|
var continue_email = function (setup, prompt) {
|
|
request_otp();
|
|
var email_div = $('<div class="text-muted" style="padding-bottom: 15px;"></div>');
|
|
|
|
if (setup) {
|
|
email_div.append(prompt)
|
|
$('#otp_div').prepend(email_div);
|
|
} else {
|
|
var direction = $('<div>').attr('id', 'qr_info').html(prompt || '{{ _("Verification code email not sent. Please contact Administrator.") }}');
|
|
email_div.append(direction);
|
|
$('#otp_div').prepend(email_div);
|
|
}
|
|
}
|
|
|