thegameofcode/cipherlayer

View on GitHub
src/routes_public/auth/login_post.js

Summary

Maintainability
D
2 days
Test Coverage
'use strict';

const async = require('async');
const log = require('../../logger/service');
const daoMng = require('../../managers/dao');
const crypto = require('../../managers/crypto');
const config = require('../../../config');
const cryptoMng = crypto(config.password);
const sessionRequest = require('./session');
const tokenMng = require('../../managers/token');

module.exports = function (req, res, next) {
    const userAgent = String(req.headers['user-agent']);

    cryptoMng.encrypt(req.body.password, function (encryptedPwd) {
        daoMng.getFromUsernamePassword(req.body.username, encryptedPwd, function (err, foundUser) {
            if (err) {
                res.send(409, {err: err.message});
                return next(false);
            }

            daoMng.getAllUserFields(foundUser.username, function (err, result) {
                if (Array.isArray(result.password)) {
                    daoMng.updateField(foundUser._id, 'password', encryptedPwd, function (err, result) {
                        log.info({ err , result }, 'UpdatePasswordField');
                    });
                }
            });

            const data = {};
            if (foundUser.signUpDate) {
                data.signUpDate = foundUser.signUpDate;
            }

            if (foundUser.roles) {
                data.roles = foundUser.roles;
            }

            if (req.body.deviceId) {
                data.deviceId = req.body.deviceId;
            }

            if (config.version) {
                data.deviceVersion = req.headers[config.version.header];
            }

            async.series([
                function (done) {
                    //Add "realms" & "capabilities"
                    daoMng.getRealms(function (err, realms) {
                        if (err) {
                            log.error({ err , des: 'error obtaining user realms' });
                            return done();
                        }

                        if (!realms || !realms.length) {
                            log.info({des: 'there are no REALMS in DB'});
                            return done();
                        }
                        async.eachSeries(realms, function (realm, next) {
                            if (!realm.allowedDomains || !realm.allowedDomains.length) {
                                return next();
                            }
                            async.eachSeries(realm.allowedDomains, function (domain, more) {
                                //wildcard
                                const check = domain.replace(/\*/g, '.*');
                                const match = foundUser.username.match(check);
                                if (!match || foundUser.username !== match[0]) {
                                    return more();
                                }

                                if (!data.realms) {
                                    data.realms = [];
                                }
                                data.realms.push(realm.name);

                                async.each(Object.keys(realm.capabilities), function (capName, added) {
                                    if (!data.capabilities) {
                                        data.capabilities = {};
                                    }

                                    data.capabilities[capName] = realm.capabilities[capName];
                                    added();
                                }, more);
                            }, next);
                        }, done);
                    });
                }
            ], function () {
                sessionRequest(data.deviceId, foundUser._id, 'POST', userAgent, function (err) {
                    if (err) {
                        log.error({ err });
                    }
                    tokenMng.createBothTokens(foundUser._id, data, function (err, tokens) {
                        if (err) {
                            res.send(409, {err: err.message});
                            return next(err);
                        }
                        tokens.expiresIn = config.accessToken.expiration;
                        res.send(200, tokens);
                        return next();
                    });
                });
            });

        });
    });
};