Advertisement
Guest User

UserEngine module

a guest
Dec 7th, 2015
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. 'use strict'
  2.  
  3. var mongoose       = require('mongoose');
  4. var jwt            = require('jsonwebtoken');
  5. var crypto         = require('crypto');
  6.  
  7. var Error          = require('./error');
  8. var Config         = require('./config');
  9. var User           = require('../models/user');
  10. var UserInfoEngine = require('../modules/userinfo-engine');
  11. var FollowEngine   = require('../modules/follow-engine');
  12.  
  13.  
  14.  
  15. module.exports = {
  16.     _generateHash: function(args) {
  17.         /**
  18.          * password [String]
  19.          * salt     [Binary]
  20.          */
  21.  
  22.         var hash = crypto.createHash('sha512');
  23.         hash.update(args.password);
  24.         hash.update(args.salt);
  25.         return hash.digest('base64');
  26.     },
  27.  
  28.     _generateSalt: function() {
  29.         /**
  30.          * 0
  31.          */
  32.  
  33.         try {
  34.             return crypto.randomBytes(256);
  35.         }
  36.         catch(ex) {
  37.             return null; // TOCHECK
  38.         }
  39.     },
  40.  
  41.     _generateToken: function(args) {
  42.         /**
  43.          * username [String]
  44.          * key      [String]
  45.          */
  46.  
  47.         return jwt.sign({ username: args.username }, args.key + args.username, { expireInMinutes: 1440 });
  48.     },
  49.  
  50.     _verifyToken: function(args, callback) {
  51.         /**
  52.          * token    [String]
  53.          * key      [String]
  54.          * username [String]
  55.          */
  56.  
  57.         jwt.verify(args.token, args.key + args.username, function(err, decoded) {
  58.             if (err) {
  59.                 return callback(true);
  60.             }
  61.  
  62.             if (decoded.username === args.username) {
  63.                 return callback(null);
  64.             }
  65.             else {
  66.                 return callback(true);
  67.             }
  68.         });
  69.     },
  70.  
  71.     register: function(args, callback) {
  72.         /**
  73.          * username [String]
  74.          * password [String]
  75.          * email    [String]
  76.          * devGroup [String] opt
  77.          */
  78.  
  79.         var self = this;
  80.  
  81.         if (!args.username || !args.password || !args.email) {
  82.             return callback(Error.genObj(Error.code.MISSING_PARAMS));
  83.         }
  84.  
  85.         User.findOne({
  86.             username: args.username
  87.         }, function(err, user) {
  88.             if (err) {
  89.                 return callback(Error.genObj(Error.code.INTERNAL));
  90.             }
  91.  
  92.             if (!user) {
  93.                 if (args.password.length < 8) {
  94.                     return callback(Error.genObj(Error.code.REGISTRATION_SHORT_PASS));
  95.                 }
  96.  
  97.                 var salt = self._generateSalt();
  98.                 var hash = self._generateHash({ password: args.password, salt: salt });
  99.                 var token = self._generateToken({ username: args.username, key: Config.tokenKey });
  100.                
  101.                 var devGroup = '';
  102.                 if (args.devGroup) {
  103.                     devGroup = args.devGroup;
  104.                 }
  105.                
  106.                 var newUser = new User({
  107.                     username: args.username,
  108.                     password: hash,
  109.                     salt: salt,
  110.                     email: args.email,
  111.                     registered: new Date(),
  112.                     updated: new Date(),
  113.                     token: token,
  114.                     devGroup: devGroup
  115.                 });
  116.  
  117.                 newUser.save(function(err) {
  118.                     if (err) {
  119.                         return callback(Error.genObj(Error.code.INTERNAL));
  120.                     }
  121.  
  122.                     UserInfoEngine.update({
  123.                         username: args.username,
  124.                         devGroup: args.devGroup
  125.                     }, function(err) {
  126.                         if (err) {
  127.                             return callback(err);
  128.                         }
  129.  
  130.                         FollowEngine.setup({
  131.                             username: args.username,
  132.                             devGroup: args.devGroup
  133.                         }, function(err) {
  134.                             if (err) {
  135.                                 return callback(err);
  136.                             }
  137.  
  138.                             return callback(null, newUser);
  139.                         });
  140.                     });
  141.                 });
  142.             }
  143.             else {
  144.                 return callback(Error.genObj(Error.code.REGISTRATION_USER_EXISTS));
  145.             }
  146.         });
  147.     },
  148.  
  149.     login: function(args, callback) {
  150.         /**
  151.          * username [String]
  152.          * password [String]
  153.          */
  154.  
  155.         var self = this;
  156.  
  157.         if (!args.username || !args.password) {
  158.             return callback(Error.genObj(Error.code.MISSING_PARAMS));
  159.         }
  160.  
  161.         User.findOne({
  162.             username: args.username
  163.         }, function(err, user) {
  164.             console.log('[Debug] In User.findOne(...) Callback;');
  165.  
  166.             if (err) {
  167.                 return callback(Error.genObj(Error.code.INTERNAL));
  168.             }
  169.  
  170.             if (!user) {
  171.                 return callback(Error.genObj(Error.code.TOKEN_AUTH_FAILED));
  172.             }
  173.            
  174.             if (self._generateHash({ password: args.password, salt: user.salt }) != user.password) {
  175.                 return callback(Error.genObj(Error.code.TOKEN_AUTH_FAILED));
  176.             }
  177.  
  178.             self._verifyToken({
  179.                 token: user.token,
  180.                 username: args.username,
  181.                 key: Config.tokenKey
  182.             }, function(err) {
  183.                 if (err) {
  184.                     var token = self._generateToken({ username: args.username, key: Config.key });
  185.                     user.token = token;
  186.  
  187.                     user.save(function(err) {
  188.                         if (err) {
  189.                             return callback(Error.genObj(Error.code.INTERNAL));
  190.                         }
  191.  
  192.                         return callback(null, user);
  193.                     });
  194.                 }
  195.  
  196.                 return callback(null, user);
  197.             });
  198.         });
  199.     },
  200.  
  201.     authenticate: function(args, callback) {
  202.         /**
  203.          * token [String]
  204.          */
  205.  
  206.         var self = this;
  207.  
  208.         if (!args.token) {
  209.             return callback(Error.genObj(Error.code.MISSING_PARAMS));
  210.         }
  211.  
  212.         var payload = jwt.decode(args.token);
  213.  
  214.         User.findOne({
  215.             token: args.token
  216.         }, function(err, user) {
  217.             if (err) {
  218.                 return callback(Error.genObj(Error.code.INTERNAL));
  219.             }
  220.  
  221.             if (user) {
  222.                 if (payload.username != user.username) {
  223.                     return callback(Error.genObj(Error.code.TOKEN_AUTH_FAILED));
  224.                 }
  225.  
  226.                 self._verifyToken({
  227.                     token: args.token,
  228.                     username: user.username,
  229.                     key: Config.tokenKey
  230.                 }, function(err) {
  231.                     if (err) {
  232.                         return callback(Error.genObj(Error.code.TOKEN_AUTH_FAILED));
  233.                     }
  234.  
  235.                     return callback(null, user);
  236.                 });
  237.             }
  238.             else {
  239.                 return callback(Error.genObj(Error.code.TOKEN_AUTH_FAILED));
  240.             }
  241.         });
  242.     }
  243. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement