Advertisement
Guest User

Untitled

a guest
Dec 25th, 2016
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.  
  2. var crypto      = require('crypto');
  3. var MongoDB     = require('mongodb').Db;
  4. var Server      = require('mongodb').Server;
  5. var moment      = require('moment');
  6.  
  7. /*
  8.     ESTABLISH DATABASE CONNECTION
  9. */
  10.  
  11. var dbName = process.env.DB_NAME || 'node-login';
  12. var dbHost = process.env.DB_HOST || 'localhost'
  13. var dbPort = process.env.DB_PORT || 27017;
  14.  
  15. var db = new MongoDB(dbName, new Server(dbHost, dbPort, {auto_reconnect: true}), {w: 1});
  16. db.open(function(e, d){
  17.     if (e) {
  18.         console.log(e);
  19.     } else {
  20.         if (process.env.NODE_ENV == 'live') {
  21.             db.authenticate(process.env.DB_USER, process.env.DB_PASS, function(e, res) {
  22.                 if (e) {
  23.                     console.log('mongo :: error: not authenticated', e);
  24.                 }
  25.                 else {
  26.                     console.log('mongo :: authenticated and connected to database :: "'+dbName+'"');
  27.                 }
  28.             });
  29.         }   else{
  30.             console.log('mongo :: connected to database :: "'+dbName+'"');
  31.         }
  32.     }
  33. });
  34.  
  35. var accounts = db.collection('accounts');
  36.  
  37. /* login validation methods */
  38.  
  39. exports.autoLogin = function(user, pass, callback)
  40. {
  41.     accounts.findOne({user:user}, function(e, o) {
  42.         if (o){
  43.             o.pass == pass ? callback(o) : callback(null);
  44.         }   else{
  45.             callback(null);
  46.         }
  47.     });
  48. }
  49.  
  50. exports.manualLogin = function(user, pass, callback)
  51. {
  52.     accounts.findOne({user:user}, function(e, o) {
  53.         if (o == null){
  54.             callback('user-not-found');
  55.         }   else{
  56.             validatePassword(pass, o.pass, function(err, res) {
  57.                 if (res){
  58.                     callback(null, o);
  59.                 }   else{
  60.                     callback('invalid-password');
  61.                 }
  62.             });
  63.         }
  64.     });
  65. }
  66.  
  67. /* record insertion, update & deletion methods */
  68.  
  69. exports.addNewAccount = function(newData, callback)
  70. {
  71.     accounts.findOne({user:newData.user}, function(e, o) {
  72.         if (o){
  73.             callback('username-taken');
  74.         }   else{
  75.             accounts.findOne({email:newData.email}, function(e, o) {
  76.                 if (o){
  77.                     callback('email-taken');
  78.                 }   else{
  79.                     saltAndHash(newData.pass, function(hash){
  80.                         newData.pass = hash;
  81.                     // append date stamp when record was created //
  82.                         newData.date = moment().format('MMMM Do YYYY, h:mm:ss a');
  83.                         accounts.insert(newData, {safe: true}, callback);
  84.                     });
  85.                 }
  86.             });
  87.         }
  88.     });
  89. }
  90.  
  91. exports.updateAccount = function(newData, callback)
  92. {
  93.     accounts.findOne({_id:getObjectId(newData.id)}, function(e, o){
  94.         o.name      = newData.name;
  95.         o.email     = newData.email;
  96.         o.country   = newData.country;
  97.         if (newData.pass == ''){
  98.             accounts.save(o, {safe: true}, function(e) {
  99.                 if (e) callback(e);
  100.                 else callback(null, o);
  101.             });
  102.         }   else{
  103.             saltAndHash(newData.pass, function(hash){
  104.                 o.pass = hash;
  105.                 accounts.save(o, {safe: true}, function(e) {
  106.                     if (e) callback(e);
  107.                     else callback(null, o);
  108.                 });
  109.             });
  110.         }
  111.     });
  112. }
  113.  
  114. exports.updatePassword = function(email, newPass, callback)
  115. {
  116.     accounts.findOne({email:email}, function(e, o){
  117.         if (e){
  118.             callback(e, null);
  119.         }   else{
  120.             saltAndHash(newPass, function(hash){
  121.                 o.pass = hash;
  122.                 accounts.save(o, {safe: true}, callback);
  123.             });
  124.         }
  125.     });
  126. }
  127.  
  128. /* account lookup methods */
  129.  
  130. exports.deleteAccount = function(id, callback)
  131. {
  132.     accounts.remove({_id: getObjectId(id)}, callback);
  133. }
  134.  
  135. exports.getAccountByEmail = function(email, callback)
  136. {
  137.     accounts.findOne({email:email}, function(e, o){ callback(o); });
  138. }
  139.  
  140. exports.validateResetLink = function(email, passHash, callback)
  141. {
  142.     accounts.find({ $and: [{email:email, pass:passHash}] }, function(e, o){
  143.         callback(o ? 'ok' : null);
  144.     });
  145. }
  146.  
  147. exports.getAllRecords = function(callback)
  148. {
  149.     accounts.find().toArray(
  150.         function(e, res) {
  151.         if (e) callback(e)
  152.         else callback(null, res)
  153.     });
  154. }
  155.  
  156. exports.delAllRecords = function(callback)
  157. {
  158.     accounts.remove({}, callback); // reset accounts collection for testing //
  159. }
  160.  
  161. /* private encryption & validation methods */
  162.  
  163. var generateSalt = function()
  164. {
  165.     var set = '0123456789abcdefghijklmnopqurstuvwxyzABCDEFGHIJKLMNOPQURSTUVWXYZ';
  166.     var salt = '';
  167.     for (var i = 0; i < 10; i++) {
  168.         var p = Math.floor(Math.random() * set.length);
  169.         salt += set[p];
  170.     }
  171.     return salt;
  172. }
  173.  
  174. var md5 = function(str) {
  175.     return crypto.createHash('md5').update(str).digest('hex');
  176. }
  177.  
  178. var saltAndHash = function(pass, callback)
  179. {
  180.     var salt = generateSalt();
  181.     callback(salt + md5(pass + salt));
  182. }
  183.  
  184. var validatePassword = function(plainPass, hashedPass, callback)
  185. {
  186.     var salt = hashedPass.substr(0, 10);
  187.     var validHash = salt + md5(plainPass + salt);
  188.     callback(null, hashedPass === validHash);
  189. }
  190.  
  191. var getObjectId = function(id)
  192. {
  193.     return new require('mongodb').ObjectID(id);
  194. }
  195.  
  196. var findById = function(id, callback)
  197. {
  198.     accounts.findOne({_id: getObjectId(id)},
  199.         function(e, res) {
  200.         if (e) callback(e)
  201.         else callback(null, res)
  202.     });
  203. }
  204.  
  205. var findByMultipleFields = function(a, callback)
  206. {
  207. // this takes an array of name/val pairs to search against {fieldName : 'value'} //
  208.     accounts.find( { $or : a } ).toArray(
  209.         function(e, results) {
  210.         if (e) callback(e)
  211.         else callback(null, results)
  212.     });
  213. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement