/**
Manage user authentication and cookie creation and pass results back to app router
@class AppAuth
@constructor
@return {Object} instantiated AppAuth
**/
define(['jquery', 'backbone'], function ($, Backbone) {
BB.SERVICES.APP_AUTH = 'AppAuth';
var AppAuth = BB.Controller.extend({
/**
Constructor
@method initialize
@return {} Unique clientId.
**/
initialize: function () {
this.authenticated = false;
this.AUTH_USER_PASS = 0;
this.AUTH_COOKIE = 1;
this.AUTH_PARAMS = 2;
},
/**
Initiate user authentication against the Pepper db user credentials
@method authenticate
@param {String} i_user
@param {String} i_pass
**/
authenticate: function (i_user, i_pass) {
var self = this;
var appRouter = BB.comBroker.getService(BB.SERVICES.LAYOUT_ROUTER);
appRouter.navigate('authenticating', {trigger: true});
self._loadCredentials(i_user, i_pass);
},
/**
Check if user / pass were passed in via params
@method _loadPassedCredentials
@return {Object} user and pass if passed in or undefined if none
**/
_loadPassedCredentials: function () {
var credentials = BB.lib.getURLParameter('param');
if (credentials == 'null')
return undefined;
credentials = $.base64.decode(credentials);
var re = /user=(.*),pass=(.*)/;
var match = re.exec(credentials);
return {
user: match[1],
pass: match[2]
}
},
/**
Load user credentials from param or cookie or form data
@method _loadCredentials
@param {String} i_user
@param {String} i_pass
**/
_loadCredentials: function (i_user, i_pass) {
var self = this;
var user = i_user == '_' ? '_' : $.base64.decode(i_user);
var pass = i_pass == '_' ? '_' : $.base64.decode(i_pass);
var passedCredentials = self._loadPassedCredentials();
var cookieCredentials = $.cookie('signagestudioweblite') == undefined ? undefined : $.cookie('signagestudioweblite').split(' ')[0];
if (passedCredentials) {
self._authServer(passedCredentials.user, passedCredentials.pass, self.AUTH_PARAMS);
} else if (cookieCredentials) {
var credentials = self._breakCookie(cookieCredentials);
self._authServer(credentials.user, credentials.pass, self.AUTH_COOKIE);
} else if (user.length > 2 && pass.length > 2) {
self._authServer(user, pass, self.AUTH_USER_PASS);
} else {
BB.comBroker.getService(BB.SERVICES['LAYOUT_ROUTER']).navigate('unauthenticated', {trigger: true});
}
},
/**
Process actual authentication against mediaSERVER
@method _authServer
@param {String} i_user
@param {String} i_pass
@param {Number} i_authMode
**/
_authServer: function (i_user, i_pass, i_authMode) {
var self = this;
BB.Pepper.dbConnect(i_user, i_pass, function (i_status) {
if (i_status.status) {
self._authPassed(i_user, i_pass, i_status, i_authMode);
// BB.lib.logErrors(pepper.getUserData().businessID);
} else {
self._authFailed(i_authMode, i_status);
}
});
},
/**
User authentication completed successfully
@method _authPassed
@param {String} i_user user name
@param {String} i_pass user password
@param {String} i_status status message from remote mediaSERVER (could include warnings)
@param {String} i_authMode indicates if authentication was done via cookie or user input
**/
_authPassed: function (i_user, i_pass, i_status, i_authMode) {
var self = this;
self.authenticated = true;
// create cookie
BB.globs['CREDENTIALS'] = self._encryptUserPass(i_user, i_pass);
$.ajaxSetup({
headers: {'Authorization': BB.globs['CREDENTIALS']}
});
if (i_authMode == self.AUTH_USER_PASS && $(Elements.REMEMBER_ME).prop('checked'))
self._bakeCookie(BB.globs['CREDENTIALS']);
if (i_status['warning'].length > 0) {
// Pro Account (not a Lite account) so limited access
// if module was not loaded yet wait to be notified from when it does
var navigationView = BB.comBroker.getService(BB.SERVICES['NAVIGATION_VIEW']);
if (_.isUndefined(navigationView)) {
BB.comBroker.listen(BB.EVENTS.SERVICE_REGISTERED, function (e) {
if (e.edata.name == BB.SERVICES['NAVIGATION_VIEW']) {
var navigationView = e.edata.service;
self._applyLimitedAccess(navigationView);
}
});
} else {
// just in case we change the order of loadable modules in the future
// and navigation module is ready before this module
self._applyLimitedAccess(navigationView);
}
}
BB.comBroker.getService(BB.SERVICES['LAYOUT_ROUTER']).navigate('authenticated', {trigger: true});
},
/**
User authentication completed unsuccessfully
@method _authFailed
@param {String} i_status status message from remote mediaSERVER (could include warnings)
@param {String} i_authMode indicates if authentication was done via cookie or user input
**/
_authFailed: function (i_authMode, i_status) {
var self = this;
// if cookie exists, delete it because obviously it didn't do the job
if (i_authMode == self.AUTH_COOKIE) {
$.removeCookie('signagestudioweblite', {path: '/'});
$.removeCookie('signagestudioweblite', {path: '/_studiolite'});
$.removeCookie('signagestudioweblite', {path: '/_studiolite-dev'});
$.removeCookie('signagestudioweblite', {path: '/_studiolite-dist'});
}
// let user know authentication failed
if (i_status.error == "not a studioLite account") {
bootbox.dialog({
message: $(Elements.MSG_BOOTBOX_STUDIO_LITE_ACC).text(),
buttons: {
info: {
label: $(Elements.MSG_BOOTBOX_OK).text(),
className: "btn-primary",
callback: function () {
}
}
}
});
}
BB.comBroker.getService(BB.SERVICES['LAYOUT_ROUTER']).navigate('authenticationFailed', {trigger: true});
},
/**
Apply limited access to application since user logged in with Pro account intp Lite Studio
@method _applyLimitedAccess
@param {Object} i_navigationView
**/
_applyLimitedAccess: function (i_navigationView) {
i_navigationView.applyLimitedAccess();
i_navigationView.forceStationOnlyViewAndDialog();
},
/**
Create cookie
@method _bakeCookie
@param {String} i_crumb
**/
_bakeCookie: function (i_crumb) {
var self = this;
$.cookie('signagestudioweblite', i_crumb, {expires: 300});
},
/**
Create RC4 local encrypted cookie
@method _encryptUserPass
@param {String} i_user
@param {String} i_pass
**/
_encryptUserPass: function (i_user, i_pass) {
var rc4 = new RC4(BB.globs['RC4KEY']);
var crumb = i_user + ':SignageStudioLite:' + i_pass + ':' + ' USER'
return rc4.doEncrypt(crumb);
},
/**
Break encrypted cookie RC4 to user credentials
@method _breakCookie
@param {String} i_user
@param {String} i_pass
@return {Object} credentials
**/
_breakCookie: function (i_cookie) {
var rc4 = new RC4(BB.globs['RC4KEY']);
var crumb = rc4.doDecrypt(i_cookie).split(':');
return {
user: crumb[0],
pass: crumb[2]
}
},
/**
Logout of application and delete saved local cookie
@method logout
**/
logout: function () {
$.removeCookie('signagestudioweblite', {path: '/'});
$.cookie('signagestudioweblite', '', {expires: -300});
if (BB.Pepper.getUserData().resellerID == 1)
window.location.href = 'http://www.digitalsignage.com/msgetstarted/msgetstarted.html#logout';
}
});
return AppAuth;
});