Guest User

Untitled

a guest
Jul 6th, 2018
156
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.34 KB | None | 0 0
  1. module.exports = function(sequelize, DataTypes) {
  2. var
  3. User;
  4.  
  5. User = sequelize.define('User', {
  6. name: {
  7. type: DataTypes.STRING,
  8. unique: false,
  9. allowNull: true
  10. },
  11. avatar: {
  12. type: DataTypes.STRING
  13. },
  14. email: {
  15. type: DataTypes.STRING,
  16. unique: true,
  17. allowNull: false
  18. },
  19. company: {
  20. type: DataTypes.STRING
  21. },
  22. password: {
  23. type: DataTypes.STRING,
  24. allowNull: false,
  25. set: function (plain_password) {
  26. this.setDataValue('salt', crypto.randomBytes(saltLength).toString('hex'));
  27. this.setDataValue('password', this.encryptPassword(plain_password));
  28. this.token = User.generateToken();
  29. }
  30. },
  31. tempPassword: {
  32. type: DataTypes.STRING
  33. },
  34. status: {
  35. type: DataTypes.ENUM('new', 'confirmed', 'active', 'disabled'),
  36. defaultValue: 'new'
  37. },
  38. isAdmin: {
  39. type: DataTypes.BOOLEAN,
  40. defaultValue: false
  41. },
  42. salt: {
  43. type: DataTypes.STRING
  44. },
  45. token: {
  46. type: DataTypes.STRING,
  47. set: function (newToken) {
  48. this.setDataValue('token', newToken);
  49. this.tokenCreatedAt = Date.now();
  50. }
  51. },
  52. tokenCreatedAt: {
  53. type: DataTypes.DATE
  54. }
  55. },
  56. {
  57. instanceMethods: {
  58. encryptPassword: function (plain) {
  59. return crypto.createHmac('sha1', this.salt).update(plain).digest('hex');
  60. },
  61. isTokenOutdated: function() {
  62. var
  63. currentDate = new Date(),
  64. tokenAge = (currentDate - this.tokenCreatedAt) / 1000;
  65.  
  66. return tokenAge > config.authorization.token_out_of_date;
  67. },
  68. createToken: function () {
  69.  
  70. if (!this.token || this.isTokenOutdated()) {
  71. this.token = User.generateToken();
  72. this.save();
  73. }
  74.  
  75. return this.token;
  76. },
  77. removeAvatar: function() {
  78. if (this.avatar) {
  79. fs.unlink(pathService.absFile(user.avatar), function(err) {
  80. // doing nothing
  81. });
  82. }
  83. }
  84. },
  85. classMethods: {
  86. createNewUser: function(user) {
  87. return User.create({
  88. name: user.name,
  89. company: user.company,
  90. email: user.email,
  91. password: this.generatePassword(),
  92. tempPassword: this.generatePassword()
  93. });
  94. },
  95. generatePassword: function() {
  96. return crypto.randomBytes(tempPasswordLength).toString('hex');
  97. },
  98. generateToken: function() {
  99. return crypto.randomBytes(tokenLength).toString('hex');
  100. },
  101. authorization: function(email, password, done) {
  102. User.findOne({
  103. where: {
  104. email: email
  105. }
  106. }).then(function(foundUser) {
  107. if (!foundUser) {
  108. done('User not found')
  109. } else if (foundUser.status === 'confirmed' && foundUser.tempPassword === password) {
  110. done(null, {
  111. confirmed: true,
  112. token: foundUser.createToken()
  113. });
  114. } else if (foundUser.password !== foundUser.encryptPassword(password)) {
  115. done('Incorrect password');
  116. } else if (foundUser.status !== 'active') {
  117. done('This user isn\'t confirmed by admin or account has been locked');
  118. } else {
  119. done(null, {
  120. name: foundUser.name,
  121. email: foundUser.email,
  122. isAdmin: foundUser.isAdmin,
  123. token: foundUser.createToken()
  124. });
  125. }
  126. }, done);
  127. },
  128. authByToken: function(token, done) {
  129. User.findOne({
  130. where: {
  131. token: token
  132. }
  133. }).then(function(foundUser) {
  134. return done(null, (!foundUser || foundUser.isTokenOutdated()) ? false : foundUser);
  135. }, done);
  136. },
  137. findByToken: function(token) {
  138. return User.findOne({
  139. where: {
  140. token: token
  141. }
  142. });
  143. },
  144. associate: function (models) {
  145. User.hasMany(models.Client);
  146. }
  147. },
  148. hooks: {
  149. beforeDestroy: function(user) {
  150. user.removeAvatar();
  151. }
  152. }
  153. });
  154.  
  155. return User;
  156. };
Add Comment
Please, Sign In to add comment