joola.io.engine
Version:
joola.io's Framework Engine
162 lines (136 loc) • 4.33 kB
JavaScript
/**
* joola.io
*
* Copyright Joola Smart Solutions, Ltd. <info@joo.la>
*
* Licensed under GNU General Public License 3.0 or later.
* Some rights reserved. See LICENSE, AUTHORS.
*
* @license GPL-3.0+ <http://spdx.org/licenses/GPL-3.0+>
*/
var
_datatables = require('../objects/datatables'),
connector = require('../connectors/connector'),
utils = require('../shared/utils');
exports.login = function (authToken, ip, username, password, next) {
var _self = this;
var auth = joola.config.auth;
var stores = auth.store;
joola.logger.silly('Authenticating [' + username + '] with stores [' + stores + '], from [' + ip + ']...');
if (auth.whitelist.indexOf(ip) == -1) {
joola.logger.warn('Authentication failed, whitelist violation [' + ip + ']!');
return next(null);
}
if (auth.authToken != authToken) {
joola.logger.warn('Authentication failed, wrong auth token passed [' + authToken + ']!');
return next(null);
}
var _user = null;
var storeCheck = function (store, next) {
var authenticator;
try {
if (_user)
return;
if (store.path)
authenticator = require(store.path);
else
authenticator = require('./' + store);
authenticator.login(username, password, function (err, user) {
if (err) {
return next(false);
}
if (user) {
_user = user;
return next(true);
}
else
return next(false);
});
}
catch (ex) {
joola.logger.error(ex.message);
return next(false);
}
};
require('async').some(stores, storeCheck, function (result) {
if (result) {
_self.generateToken(_user, function (user, token) {
joola.logger.info('Login success for user: ' + user.displayName);
return next(null, user, token);
});
}
else
return next(null);
});
};
exports.checkTokenExist = function (token, next) {
var result = false;
joola.cache.load('tokens', token, function (err, value) {
if (err) {
if (err.message != 'Object not found')
return next(err);
}
if (value)
return next(null, token, value);
else
return next(null, null);
});
return result;
};
exports.validateToken = function (token, next) {
var _self = this;
_self.checkTokenExist(token, function (err, exists, cachedValue) {
if (err)
return next(Error('Failed to validate token [' + token + ']:' + err));
if (exists) {
joola.cache.save('tokens', token, cachedValue, joola.config.auth.tokenExpiresAfter, function (err) {
if (err) {
return next(Error('Failed to validate token [' + user.displayName + ']:' + err));
}
joola.logger.silly('Extended security token [' + token + '] for user [' + cachedValue.displayName + '].');
return next(null, cachedValue, token);
});
}
else {
return next(Error('Failed to validate token [' + token + ']'));
}
});
};
exports.generateToken = function (user, next) {
var _self = this;
var token = utils.shorten();//require('node-uuid').v4();
_self.checkTokenExist(token, function (exists) {
if (exists)
throw new Error('Failed to generate token, one already exists [' + token + '].');
joola.cache.save('tokens', token, user, joola.config.auth.tokenExpiresAfter, function (err) {
if (err)
throw new Error('Failed to save token [' + user.displayName + ']:' + err);
joola.logger.silly('Generated security token [' + token + '] for user [' + user.displayName + '].');
return next(user, token);
})
});
};
exports.expireToken = function (token, next) {
joola.cache.destroy(token, next);
};
exports.logout = function (connection, callback) {
api.session.delete(connection, function () {
callback();
})
};
exports.checkLoggedIn = function (connection, callback) {
api.session.checkAuth(connection, function (session) {
session.actionCounter++;
callback(session, true);
}, function () {
callback(null, false);
});
};
exports.hasRole = function (availableRoles, existingRoles) {
var exist = _.find(availableRoles, function (available) {
return _.find(existingRoles, function (existing) {
return existing == available;
})
});
return exist != null;
};