function createCookie(name, value, when) { let expires = ''; if (when instanceof Date) { expires = '; expires=' + when.toUTCString(); } else { let date = new Date(); date.setTime(date.getTime() + (when * 24 * 60 * 60 * 1000)); expires = '; expires=' + date.toUTCString(); } document.cookie = name + '=' + value + expires + '; path=/'; } function readCookie(name) { let nameEQ = name + '='; let tA = document.cookie.split(';'); for(let i = 0; i < tA.length; i++) { let c = tA[i]; while (c.charAt(0) === ' ') c = c.substring(1, c.length); if (c.indexOf(nameEQ) === 0) return (c.substring(nameEQ.length, c.length)); } return (null); } function eraseCookie(name) { createCookie(name, '', -1); } function clearTempLogin() { if (window.hasOwnProperty('tempLogin')) { if (window.tempLogin.hasOwnProperty('error')) { window.tempLogin.error = ''; delete window.tempLogin['error']; } if (window.tempLogin.hasOwnProperty('warning')) { window.tempLogin.warning = ''; delete window.tempLogin['warning']; } if (window.tempLogin.hasOwnProperty('info')) { window.tempLogin.info = ''; delete window.tempLogin['info']; } window.tempLogin.user = ''; window.tempLogin.pass = ''; window.tempLogin.remember = null; delete window['tempLogin']; } } function clearTempRegistration() { if (window.hasOwnProperty('tempRegistration')) { if (window.tempRegistration.hasOwnProperty('error')) { window.tempRegistration.error = ''; delete window.tempRegistration['error']; } window.tempRegistration.user = ''; window.tempRegistration.pass = ''; window.tempRegistration.email = ''; window.tempRegistration.remember = null; delete window['tempRegistration']; } } function handleLogin(msg) { clearTempLogin(); if ((msg === undefined) || (msg === null)) { $('#spnLoggedIn').hide(); $('#spnLoginOrRegister').show(); eraseCookie('loginid'); eraseCookie('sessionkey'); eraseCookie('username'); eraseCookie('name'); } else { $('#spnLoginOrRegister').hide(); $('#spnLoggedIn').show(); $('#spnName').html(msg.name); $('#spnUsername').html(msg.username); let expires = new Date((new Date(msg.expires)) + ((new Date()) - (new Date(msg.servertime)))); createCookie('loginid', msg.loginid.toString(), expires); createCookie('sessionkey', msg.sessionkey.toString(), expires); createCookie('username', msg.username.toString(), expires); createCookie('name', msg.name.toString(), expires); } } function accountLogout() { handleLogin(null); window.socket.emit('command', 'logout'); } $(document).ready(function($) { window.socket = io(); window.accountModalSafe = true; window.accountModalVisible = false; window.accountModalShowAgain = false; window.accountModalLogin = true; $('#accountDialog').on('show.bs.modal', function() { window.accountModalSafe = false; window.accountModalVisible = true; if (window.hasOwnProperty('tempLogin')) { window.accountModalLogin = true; $('#txtLoginUsername').val(window.tempLogin.user); $('#pwdLoginPassword').val(window.tempLogin.pass); $('#chkLoginRemember').prop('checked', window.tempLogin.remember === true); if (window.tempLogin.hasOwnProperty('error')) { let e = $('#spnLoginError'); e.html(window.tempLogin.error); e = e.closest('p'); if (e.hasClass('has-warning')) { e.removeClass('has-warning'); } if (e.hasClass('has-info')) { e.removeClass('has-info'); } if (!e.hasClass('has-error')) { e.addClass('has-error'); } } else if (window.tempLogin.hasOwnProperty('warning')) { let e = $('#spnLoginError'); e.html(window.tempLogin.warning); e = e.closest('p'); if (e.hasClass('has-error')) { e.removeClass('has-error'); } if (e.hasClass('has-info')) { e.removeClass('has-info'); } if (!e.hasClass('has-warning')) { e.addClass('has-warning'); } } else if (window.tempLogin.hasOwnProperty('info')) { let e = $('#spnLoginError'); e.html(window.tempLogin.info); e = e.closest('p'); if (e.hasClass('has-error')) { e.removeClass('has-error'); } if (e.hasClass('has-warning')) { e.removeClass('has-warning'); } if (!e.hasClass('has-info')) { e.addClass('has-info'); } } else { let e = $('#spnLoginError'); e.html(''); e = e.closest('p'); if (e.hasClass('has-error')) { e.removeClass('has-error'); } if (e.hasClass('has-warning')) { e.removeClass('has-warning'); } if (e.hasClass('has-info')) { e.removeClass('has-info'); } } clearTempLogin(); } else { let e = $('#spnLoginError'); e.html(''); e = e.closest('p'); if (e.hasClass('has-error')) { e.removeClass('has-error'); } if (e.hasClass('has-warning')) { e.removeClass('has-warning'); } if (e.hasClass('has-info')) { e.removeClass('has-info'); } if (window.hasOwnProperty('tempRegistration')) { window.accountModalLogin = false; $('#txtRegisterUsername').val(window.tempRegistration.user); $('#pwdRegisterPassword').val(window.tempRegistration.pass); $('#pwdRegisterPasswordConfirm').val(window.tempRegistration.pass); $('#txtRegisterEmail').val(window.tempRegistration.email); $('#chkRegisterRemember').prop('checked', window.tempRegistration.remember === true); if (window.tempRegistration.hasOwnProperty('error')) { console.log(window.tempRegistration.error); let e = $('#spnRegisterError'); switch (window.tempRegistration.error) { case 'usernametaken': case 'invalidpassword': case 'emailtaken': case 'invalidemail': // already visible e.html(''); e = e.closest('p'); if (e.hasClass('has-error')) { e.removeClass('has-error'); } if (e.hasClass('has-info')) { e.removeClass('has-info'); } if (e.hasClass('has-warning')) { e.removeClass('has-warning'); } break; case 'usernamelookup': e.html('Username lookup error, please try again.'); e = e.closest('p'); if (e.hasClass('has-error')) { e.removeClass('has-error'); } if (e.hasClass('has-info')) { e.removeClass('has-info'); } if (!e.hasClass('has-warning')) { e.addClass('has-warning'); } break; case 'creationerror': e.html('Login creation error, please try again.'); e = e.closest('p'); if (e.hasClass('has-error')) { e.removeClass('has-error'); } if (e.hasClass('has-info')) { e.removeClass('has-info'); } if (!e.hasClass('has-warning')) { e.addClass('has-warning'); } break; case 'groupadderror': e.html('Unable to add login to Users group, please try again.'); e = e.closest('p'); if (e.hasClass('has-error')) { e.removeClass('has-error'); } if (e.hasClass('has-info')) { e.removeClass('has-info'); } if (!e.hasClass('has-warning')) { e.addClass('has-warning'); } break; default: e.html('Unhandled registration error: ' + window.tempRegistration.error + '.'); e = e.closest('p'); if (e.hasClass('has-warning')) { e.removeClass('has-warning'); } if (e.hasClass('has-info')) { e.removeClass('has-info'); } if (!e.hasClass('has-error')) { e.addClass('has-error'); } break; } } clearTempRegistration(); } else { window.accountModalLogin = true; } } $('#imgRegisterCaptcha').attr('src', '/CAPTCHA/' + (new Date()).getTime().toString()); $('#txtRegisterCaptcha').val(''); }); $('#accountDialog').on('shown.bs.modal', function() { if (window.accountModalVisible === true) { window.accountModalSafe = true; } if (window.accountModalLogin) { $('#txtLoginUsername').focus(); } else { $('#txtRegisterUsername').focus(); } }); $('#accountDialog').on('hidden', function() { if (window.accountModalVisible === false) { window.accountModalSafe = true; } if (window.accountModalShowAgain) { setTimeout(() => { window.accountModalShowAgain = false; $('#accountDialog').modal('show.bs.modal'); }, 300);/*obnoxious bootstrap-modal bug workaround of CSS transitions*/ } }); $('#accountDialog').on('hide', function() { window.accountModalSafe = false; window.accountModalVisible = false; }); window.socket.on('register', function (msg) { console.log(msg); if ((msg !== undefined) && msg.hasOwnProperty('status')) { if (!window.hasOwnProperty('tempRegistration')) { window.tempRegistration = { user: '', pass: '', email: '', remember: false }; } if (msg.status === 'success') { } else { window.tempRegistration.error = msg.status.toString(); window.accountModalShowAgain = true; if ((window.accountModalSafe === true) && (window.accountModalVisible === false)) { window.accountModalShowAgain = false; $('#accountDialog').modal('show.bs.modal'); } } } }); window.socket.on('login', function (msg) { if ((msg !== undefined) && msg.hasOwnProperty('status')) { if (msg.status === 'sessionfailure') { handleLogin(null); if (!window.hasOwnProperty('tempLogin')) { window.tempLogin = { user: '', pass: '', remember: false }; } window.tempLogin.info = 'Previous session has expired. Please log in again.'; window.accountModalShowAgain = true; if ((window.accountModalSafe === true) && (window.accountModalVisible === false)) { window.accountModalShowAgain = false; $('#accountDialog').modal('show.bs.modal'); } } else if (msg.status === 'success') { handleLogin(msg); } else if (msg.status === 'failed') { if (!window.hasOwnProperty('tempLogin')) { window.tempLogin = { user: '', pass: '', remember: false }; } window.tempLogin.error = 'Invalid username or password.'; window.accountModalShowAgain = true; if ((window.accountModalSafe === true) && (window.accountModalVisible === false)) { window.accountModalShowAgain = false; $('#accountDialog').modal('show.bs.modal'); } } else if (msg.status === 'cannotcreatesession') { if (!window.hasOwnProperty('tempLogin')) { window.tempLogin = { user: '', pass: '', remember: false }; } window.tempLogin.warning = 'Cannot create session. Please try again.'; window.accountModalShowAgain = true; if ((window.accountModalSafe === true) && (window.accountModalVisible === false)) { window.accountModalShowAgain = false; $('#accountDialog').modal('show.bs.modal'); } } else { if (!window.hasOwnProperty('tempLogin')) { window.tempLogin = { user: '', pass: '', remember: false }; } window.tempLogin.error = msg.status.toString(); window.accountModalShowAgain = true; if ((window.accountModalSafe === true) && (window.accountModalVisible === false)) { window.accountModalShowAgain = false; $('#accountDialog').modal('show.bs.modal'); } } } else { let loginid = readCookie('loginid'); let sessionKey = readCookie('sessionkey'); let username = readCookie('username'); let name = readCookie('name'); if ((loginid !== null) && (sessionKey !== null) && (username !== null) && (name !== null)) { socket.emit('login', { 'loginid': loginid, 'sessionkey': sessionKey, 'username': username, 'mode': 'session' }); } else { handleLogin(null); } } }); window.socket.on('logout', function (msg) { handleLogin(null); }); $('#frmAccountRegister').submit(function (event) { event.preventDefault(); if ($('#frmAccountRegister').validator('validate').has('.has-error').length === 0) { if ($('#pwdRegisterPassword').val() === $('#pwdRegisterPasswordConfirm').val()) { window.tempRegistration = { user: $('#txtRegisterUsername').val(), pass: $('#pwdRegisterPassword').val(), email: $('#txtRegisterEmail').val(), remember: $('#chkRegisterRemember').is(':checked') }; $('#accountDialog').modal('hide'); window.socket.emit('register', { 'username': window.tempRegistration.user, 'password': window.tempRegistration.pass, 'email': window.tempRegistration.email, 'remember': window.tempRegistration.remember }); } } }); $('#frmAccountLogin').submit(function (event) { event.preventDefault(); if ($('#frmAccountLogin').validator('validate').has('.has-error').length === 0) { window.tempLogin = { user: $('#txtLoginUsername').val(), pass: $('#pwdLoginPassword').val(), remember: $('#chkLoginRemember').is(':checked') }; $('#accountDialog').modal('hide'); window.socket.emit('login', { 'username': window.tempLogin.user, 'password': window.tempLogin.pass, 'remember': window.tempLogin.remember, 'mode': 'challenge' }); } }); }); function resetValidators(form) { $(form).validator("destroy"); wireValidators(form); } function wireValidators(form) { $(form).validator().on('invalid.bs.validator', function(e) { const t = $(e.relatedTarget); const p = t.parents('.form-group'); if((t && t.val().length === 0) && (p && p.hasClass('has-error'))) { $(this).data('bs.validator').clearErrors(t); t.data('bs.validator.errors').splice(0, t.data('bs.validator.errors').length); } }); } function clearAccountForms() { $('#frmAccountLogin').validator("destroy"); $('#frmAccountLogin')[0].reset(); wireValidators('#frmAccountLogin'); $('#frmAccountRegister').validator("destroy"); $('#frmAccountRegister')[0].reset(); wireValidators('#frmAccountRegister'); } window.activeAccountPanel = 0; function accountDialogFocus(e) { e = $(e); let btnRegister = $('#btnRegister'); let btnLogin = $('#btnLogin'); let divModal = btnLogin.closest('.modal'); switch (e.attr('id')) { case 'txtRegisterUsername': case 'pwdRegisterPassword': case 'pwdRegisterPasswordConfirm': case 'txtRegisterEmail': case 'chkRegisterRemember': case 'labRegisterRemember': case 'btnRegister': if (window.activeAccountPanel !== 0) { divModal.addClass('register-selected'); divModal.removeClass('login-selected'); if (btnLogin.hasClass('btn-default')) { btnLogin.removeClass('btn-default'); } if (!btnLogin.hasClass('btn-primary')) { btnLogin.addClass('btn-primary'); } if (btnRegister.hasClass('btn-primary')) { btnRegister.removeClass('btn-primary'); } if (!btnRegister.hasClass('btn-default')) { btnRegister.addClass('btn-default'); } window.activeAccountPanel = 0; resetValidators('#frmAccountLogin'); } break; case 'txtLoginUsername': case 'pwdLoginPassword': case 'chkLoginRemember': case 'labLoginRemember': case 'btnLogin': case 'aLoginForgotPassword': if (window.activeAccountPanel !== 1) { divModal.addClass('login-selected'); divModal.removeClass('register-selected'); if (btnRegister.hasClass('btn-default')) { btnRegister.removeClass('btn-default'); } if (!btnRegister.hasClass('btn-primary')) { btnRegister.addClass('btn-primary'); } if (btnLogin.hasClass('btn-primary')) { btnLogin.removeClass('btn-primary'); } if (!btnLogin.hasClass('btn-default')) { btnLogin.addClass('btn-default'); } window.activeAccountPanel = 1 resetValidators('#frmAccountRegister'); } break; } } function accountDialogKeydown(e, ev) { e = $(e); let keyCode = ev.keyCode || ev.which; if (keyCode === 9) { ev.preventDefault(); let order = { 'txtRegisterUsername': { p: 'aLoginForgotPassword', n: 'pwdRegisterPassword' }, 'pwdRegisterPassword': { p: 'txtRegisterUsername', n: 'pwdRegisterPasswordConfirm' }, 'pwdRegisterPasswordConfirm': { p: 'pwdRegisterPassword', n: 'txtRegisterEmail' }, 'txtRegisterEmail': { p: 'pwdRegisterPasswordConfirm', n: 'labRegisterRemember' }, 'chkRegisterRemember': { p: 'txtRegisterEmail', n: 'btnRegister' }, 'labRegisterRemember': { p: 'txtRegisterEmail', n: 'btnRegister' }, 'btnRegister': { p: 'labRegisterRemember', n: 'txtLoginUsername' }, 'txtLoginUsername': { p: 'btnRegister', n: 'pwdLoginPassword' }, 'pwdLoginPassword': { p: 'txtLoginUsername', n: 'labLoginRemember' }, 'chkLoginRemember': { p: 'pwdLoginPassword', n: 'btnLogin' }, 'labLoginRemember': { p: 'pwdLoginPassword', n: 'btnLogin' }, 'btnLogin': { p: 'labLoginRemember', n: 'aLoginForgotPassword' }, 'aLoginForgotPassword': { p: 'btnLogin', n: 'txtRegisterUsername' } }; let id = e.attr('id'); if (order.hasOwnProperty(id)) { $('#' + order[id][(ev.shiftKey ? 'p' : 'n')]).focus(); } } }