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