Files
dbois/public/js/lib/modules/login/loginModule.js
T

366 lines
11 KiB
JavaScript

/**
* Created by Pensare Software.
* User: Theo Weijmer
* Date: 05/12/2017
* Time: 11:17
*/
var dbo = {};
$( function () {
dbo.loginModel = {
username : ko.observable( '' ),
password : ko.observable( '' ),
email : ko.observable(),
showPasswordRequest: ko.observable( false ),
// 2FA properties
twoFactorMethod : ko.observable( '' ),
twoFactorCode : ko.observable( '' ),
twoFactorError : ko.observable( '' ),
isVerifying : ko.observable( false ),
isResending : ko.observable( false ),
// Password change properties
newPassword : ko.observable( '' ),
confirmPassword : ko.observable( '' ),
passwordRequirements : ko.observableArray( [] ),
passwordChangeError : ko.observable( '' ),
isChangingPassword : ko.observable( false ),
login: function () {
dbo.loginService.login();
},
requestPassword: function () {
dbo.loginService.requestPassword();
},
togglePasswordrequest: function () {
var vm = dbo.loginModel
vm.showPasswordRequest( !vm.showPasswordRequest() );
},
verifyTwoFactor: function () {
dbo.loginService.verifyTwoFactor();
},
resendOtp: function () {
dbo.loginService.resendOtp();
return false;
},
cancelTwoFactor: function () {
$('#twofactor-modal').modal('hide');
var vm = dbo.loginModel;
vm.twoFactorCode( '' );
vm.twoFactorError( '' );
vm.twoFactorMethod( '' );
},
handleTwoFactorKeyup: function (data, event) {
var vm = dbo.loginModel;
// Clear error on input
vm.twoFactorError( '' );
// Only allow digits
var sanitized = vm.twoFactorCode().replace(/[^0-9]/g, '');
if (sanitized !== vm.twoFactorCode()) {
vm.twoFactorCode(sanitized);
}
// Auto-submit on Enter key when code is 6 digits
if (vm.twoFactorCode().length === 6 && event.keyCode === 13) {
vm.verifyTwoFactor();
}
return true;
},
changePassword: function () {
dbo.loginService.changePassword();
},
handlePasswordChangeKeyup: function (data, event) {
var vm = dbo.loginModel;
// Clear error on input
vm.passwordChangeError( '' );
// Auto-submit on Enter key
if (event.keyCode === 13 && vm.newPassword().length >= 8 && vm.confirmPassword().length >= 8) {
vm.changePassword();
}
return true;
}
}
ko.applyBindings( dbo.loginModel, document.getElementById( "login-form" ) );
ko.applyBindings( dbo.loginModel, document.getElementById( "twofactor-modal" ) );
} );
dbo.loginService = {
login: function () {
var ds = dbo.loginDataservice;
var self = dbo.loginService;
var vm = dbo.loginModel;
self.validateInput( function ( submitDATA ) {
if ( ! submitDATA ) return self.notifyWrongPassword();
ds.login( submitDATA, function ( data ) {
// Check if password change is required
if ( data && typeof data === 'object' && data.result === 'PASSWORD-CHANGE-REQUIRED' ) {
// Show password change modal
vm.passwordRequirements( data.requirements || [] );
vm.newPassword( '' );
vm.confirmPassword( '' );
vm.passwordChangeError( '' );
$('#password-change-modal').modal('show');
// Focus on new password input after modal is shown
setTimeout(function() {
$('#newPassword').focus();
}, 500);
return;
}
// Check if 2FA is required
if ( data && typeof data === 'object' && data.result === '2FA-REQUIRED' ) {
// Show 2FA modal
vm.twoFactorMethod( data.method );
vm.twoFactorCode( '' );
vm.twoFactorError( '' );
$('#twofactor-modal').modal('show');
// Focus on code input after modal is shown
setTimeout(function() {
$('#twoFactorCode').focus();
}, 500);
return;
}
if ( data ) return location.reload();
self.notifyWrongPassword();
} );
} );
},
verifyTwoFactor: function () {
var ds = dbo.loginDataservice;
var vm = dbo.loginModel;
if ( vm.twoFactorCode().length !== 6 ) {
return;
}
vm.isVerifying( true );
vm.twoFactorError( '' );
ds.verifyTwoFactor( vm.twoFactorCode(), function ( response ) {
vm.isVerifying( false );
if ( response.success ) {
// Close modal and reload page
$('#twofactor-modal').modal('hide');
location.reload();
} else {
vm.twoFactorError( response.message || 'Ongeldige verificatiecode' );
vm.twoFactorCode( '' );
}
} );
},
resendOtp: function () {
var ds = dbo.loginDataservice;
var vm = dbo.loginModel;
vm.isResending( true );
vm.twoFactorError( '' );
ds.resendOtp( function ( response ) {
vm.isResending( false );
if ( response.success ) {
tellMe( {
title : 'Code verzonden',
message : response.message || 'Nieuwe code verzonden',
modalClass: 'modal-success'
} );
} else {
vm.twoFactorError( response.message || 'Kan code niet opnieuw verzenden' );
}
} );
},
changePassword: function () {
var ds = dbo.loginDataservice;
var vm = dbo.loginModel;
// Validate passwords match
if ( vm.newPassword() !== vm.confirmPassword() ) {
vm.passwordChangeError( 'Wachtwoorden komen niet overeen' );
return;
}
// Validate password length
if ( vm.newPassword().length < 8 ) {
vm.passwordChangeError( 'Wachtwoord moet minimaal 8 karakters bevatten' );
return;
}
vm.isChangingPassword( true );
vm.passwordChangeError( '' );
var submitDATA = {
new_password: vm.newPassword(),
confirm_password: vm.confirmPassword()
};
ds.changePassword( submitDATA, function ( response ) {
vm.isChangingPassword( false );
if ( response.success ) {
// Close password change modal
$('#password-change-modal').modal('hide');
// Check if 2FA is required after password change
if ( response.result === '2FA-REQUIRED' ) {
vm.twoFactorMethod( response.method );
vm.twoFactorCode( '' );
vm.twoFactorError( '' );
$('#twofactor-modal').modal('show');
setTimeout(function() {
$('#twoFactorCode').focus();
}, 500);
} else {
location.reload();
}
} else {
vm.passwordChangeError( response.message || 'Wachtwoord wijzigen mislukt' );
}
} );
},
requestPassword: function () {
var ds = dbo.loginDataservice;
var self = dbo.loginService;
var vm = dbo.loginModel;
self.validateRequestInput( function ( submitDATA ) {
if ( !submitDATA ) return self.notifyWrongRequest();
ds.requestPassword( submitDATA, function ( data ) {
return self.notifyWrongRequest( data.result );
if ( data.result == 'SEND-SUCCESS' ) vm.showPasswordRequest( false );
} );
} );
},
validateInput: function ( callback ) {
var vm = dbo.loginModel;
if ( vm.username().length < 2 ) return callback( false );
if ( vm.password().length < 6 ) return callback( false );
var submitDATA = {
username: vm.username(),
password: vm.password()
}
return callback( submitDATA );
},
validateRequestInput: function ( callback ) {
var vm = dbo.loginModel;
if ( vm.username().length < 2 ) return callback( false );
if ( !dbo.helpers.validateEmail( vm.email() ) ) return callback( false );
var submitDATA = {
username: vm.username(),
email : vm.email()
}
return callback( submitDATA );
},
notifyWrongPassword: function () {
tellMe( {
title : 'Login fout',
message: 'Gebruikersnaam / wachtwoord komen niet overeen'
} );
},
notifyWrongRequest: function ( type = false ) {
var message = '';
var title = '';
var modalClass = '';
console.log( type );
if ( !type || type == 'WRONG-CREDENTIAL' ) {
title = 'credentials fout';
message = 'Fout bij gebruikersnaam / emailadres invoer';
modalClass = 'modal-danger';
}
else if ( type == 'SEND-FAILLURE' ) {
title = 'Fout bij verzneden email';
message = 'email kon niet verzonden worden neem contact op met de helpdesk';
modalClass = 'modal-danger';
}
else if ( type == 'SEND-SUCCESS' ) {
title = 'mail succesvol verzonden';
message = ' er is een email verzonden, kijk in uw postvak, mocht u de mail daar niet aantreffen kijk dan in uw spanfolder';
modalClass = 'modal-succes';
}else{
title = 'Fout bij verzneden email';
message = ' er is een onbekende fout opgetreden neem contact op met de helpdesk';
modalClass = 'modal-danger';
}
tellMe( {
title : title,
message : message,
modalClass: modalClass
} );
}
};
dbo.loginDataservice = {
login: function ( submitDATA, callback ) {
$.post( 'index.php/login/', submitDATA, function ( data ) {
callback( data );
} );
},
requestPassword: function ( submitDATA, callback ) {
$.post( 'index.php/login/requestPassword', submitDATA, function ( data ) {
callback( data );
} );
},
verifyTwoFactor: function ( code, callback ) {
$.post( 'index.php/login/verify2fa', { code: code }, function ( data ) {
callback( data );
} );
},
resendOtp: function ( callback ) {
$.post( 'index.php/login/resendOtp', {}, function ( data ) {
callback( data );
} );
},
changePassword: function ( submitDATA, callback ) {
$.post( 'index.php/login/changeWeakPassword', submitDATA, function ( data ) {
callback( data );
} );
}
};