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

// 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);
}
}