UNPKG

joola.io.engine

Version:
162 lines (136 loc) 4.33 kB
/** * 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; };