Advertisement
EiEich

Untitled

Jun 16th, 2021
728
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. var User = require(__dirname+'/schema.js');
  2. var mongoose = require('mongoose');
  3. var passport = require('passport');
  4. const nodemailer = require('nodemailer');
  5. const nodemailerSendgrid = require('nodemailer-sendgrid');
  6. const transport = nodemailer.createTransport(
  7.     nodemailerSendgrid({
  8.         apiKey: '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'
  9.     })
  10.     );
  11. module.exports = function(sd) {
  12.     sd.use(passport.initialize());
  13.     sd.use(passport.session());
  14.     if(mongoose.connection.readyState==0){
  15.         mongoose.connect(sd.mongoUrl, {
  16.             useUnifiedTopology: true,
  17.             useNewUrlParser: true,
  18.             useCreateIndex: true,
  19.             promiseLibrary: global.Promise
  20.         });
  21.     }
  22.     passport.serializeUser(function(user, done) {
  23.         done(null, user.id);
  24.     });
  25.     passport.deserializeUser(function(id, done) {
  26.         User.findById(id, function(err, user) {
  27.             done(err, user);
  28.         });
  29.     });
  30.     /*
  31.     *   Initialize User and Mongoose
  32.     */
  33.     var router = sd.router('/api/user');
  34.     router.get("/me", function(req, res) {
  35.         var json = {};
  36.         if(req.user){
  37.             User.schema.eachPath(function(path) {
  38.                 path = path.split('.')[0];
  39.                 if(path=='password'||path=='__v'||json[path]) return;
  40.                 json[path] = req.user[path];
  41.             });
  42.         }else{
  43.             json.sessionID = req.sessionID;
  44.             json.data = req.session.data;
  45.         }
  46.         if(!json.data) json.data = {};
  47.         if(!json.avatarUrl) json.avatarUrl = '/assets/avatar.png';
  48.         res.json(json);
  49.     });
  50.     router.post("/status", function(req, res) {
  51.         User.findOne({
  52.             $or: [{
  53.                 reg_email: req.body.email.toLowerCase()
  54.             },{
  55.                 email: req.body.email.toLowerCase()
  56.             }]
  57.         }, function(err, user) {
  58.             var json = {};
  59.             json.email = !!user;
  60.             if(user&&req.body.password){
  61.                 json.pass = user.validPassword(req.body.password);
  62.             }
  63.             res.json(json);
  64.         });
  65.     });
  66.     router.post("/request", function(req, res) {
  67.         User.findOne({
  68.             email: req.body.email.toLowerCase()
  69.         }, function(err, user) {
  70.             user.data.resetPin = Math.floor(Math.random() * (999999 - 100000)) + 100000;
  71.             user.data.resetCreate = new Date().getTime();
  72.             user.data.resetCounter = 3;
  73.             user.markModified('data');
  74.             user.save(function(err){
  75.                 if (err) throw err;
  76.                 res.json(true);
  77.                 transport.sendMail({
  78.                     from: 'support@webart.work',
  79.                     to: '<' + req.body.email + '>',
  80.                     subject: 'Password Reset',
  81.                     html: '<h2>Dear, '+user.email.split('@')[0]+'</h2>. <br> To reset your password at webart.work, please enter this code on the site: <h3>'+ user.data.resetPin +'</h3>This code will be avaliable for 10 min'
  82.                 })
  83.                 .then(([res]) => {
  84.                     console.log('Message delivered with code %s %s', res.statusCode, res.statusMessage);
  85.                 })
  86.                 .catch(err => {
  87.                     console.log('Errors occurred, failed to deliver message');
  88.                     if (err.response && err.response.body && err.response.body.errors) {
  89.                         err.response.body.errors.forEach(error => console.log('%s: %s', error.field, error.message));
  90.                     } else {
  91.                         console.log(err);
  92.                     }
  93.                 });
  94.             });
  95.         });
  96.     });
  97.     router.post("/change", function(req, res) {
  98.         User.findOne({
  99.             email: req.body.email.toLowerCase()
  100.         }, function(err, user) {
  101.             var message;
  102.             var now = new Date().getTime();
  103.             if (user.data.resetCounter > 0 && (now - user.data.resetCreate) <= 600000) {
  104.                 if (user.data.resetPin == req.body.pin) {
  105.                     user.password = user.generateHash(req.body.password);
  106.                     message = 'Password successfully changed.';
  107.                     delete user.data.resetPin;
  108.                     delete user.data.resetCounter;
  109.                     delete user.data.resetCreate;
  110.                 } else {
  111.                     user.data.resetCounter--;
  112.                     message = 'Wrong code.';
  113.                 }
  114.             } else {
  115.                 message = 'I am sorry reset code is not active now.'
  116.                 delete user.data.resetPin;
  117.                 delete user.data.resetCounter;
  118.                 delete user.data.resetCreate;
  119.  
  120.             }
  121.             user.markModified('data');
  122.             user.save(function(err) {
  123.                 if (err) throw err;
  124.                 res.json(message);
  125.             });
  126.         });
  127.     });
  128.     router.post("/changePassword", sd._ensure, function(req, res) {
  129.         if (req.user.validPassword(req.body.oldPass)){
  130.             req.user.password = req.user.generateHash(req.body.newPass);
  131.             req.user.save(function(){
  132.                 res.json({
  133.                     success: true,
  134.                     message: "Password successfully changed",
  135.                     typeOfMessage: 'info'
  136.                 });
  137.             });
  138.         } else {
  139.             if(!req.user.validPassword(req.body.oldPass)) {
  140.                 res.json({
  141.                     success: false,
  142.                     message: "The old password is not correct",
  143.                     typeOfMessage: 'error'
  144.                 })
  145.             } else {
  146.                 res.json({
  147.                     success: false,
  148.                     message: "An error occurred",
  149.                     typeOfMessage: 'error'
  150.                 });
  151.             }
  152.         }
  153.     });
  154.     router.get('/logout', function(req, res) {
  155.         req.logout();
  156.         res.redirect(sd._config.passport.local.successRedirect);
  157.     });
  158.     router.get('/logout-local', function(req, res) {
  159.         req.logout();
  160.         res.json(true);
  161.     });
  162.     router.post('/invite', function(req, res) {
  163.         User.findOne({
  164.             email: req.body.fromEmail
  165.         }, (err, user) => {
  166.             if(err)
  167.                 throw err
  168.             var email = {
  169.                 from: 'support@webart.work',
  170.                 to: req.body.email,
  171.                 subject: 'Support | WebArt.Work',
  172.                 text: 'You are invited to the Memo Wallet from ' + req.body.fromName + '. Сlick on this link, to sign up http://'+user.domain+'/sign?name=' + req.body.name + '&email=' +req.body.email
  173.             };
  174.             client.sendMail(email, function(err, info){
  175.                 if (err) throw err
  176.                     res.json({
  177.                         success: true
  178.                     })
  179.             });
  180.         })
  181.     })
  182.     /*
  183.     *   Passport Management
  184.     */
  185.     var LocalStrategy = require('passport-local').Strategy;
  186.     router.post('/login-local', passport.authenticate('login-local'), function(req, res) {
  187.         let user = JSON.parse(JSON.stringify(req.user));
  188.         delete user.password;
  189.         delete user.recPass;
  190.         delete user.recUntil;
  191.         res.json(user);
  192.     });
  193.     passport.use('login-local', new LocalStrategy({
  194.         usernameField : 'username',
  195.         passwordField : 'password',
  196.         passReqToCallback : true
  197.     }, function(req, username, password, done) {
  198.         User.findOne({
  199.             email: username.toLowerCase(),
  200.             blocked: {
  201.                 $ne: true
  202.             }
  203.         }, function(err, user) {
  204.             if(!user.domain) user.domain=[];
  205.             if(!user.domain.includes(req.get('host'))){
  206.                 user.domain.push(req.get('host'));
  207.                 user.save(function(){});
  208.             }
  209.             if (err) return done(err);
  210.             if (!user) return done(null, false);
  211.             if (!user.validPassword(password)) return done(null, false);
  212.             return done(null, user);
  213.         });
  214.     }));
  215.     router.post('/login', passport.authenticate('login', {
  216.         successRedirect: '/',
  217.         failureRedirect: '/Login'
  218.     }));
  219.     passport.use('login', new LocalStrategy({
  220.         usernameField : 'username',
  221.         passwordField : 'password',
  222.         passReqToCallback : true
  223.     }, function(req, username, password, done) {
  224.         User.findOne({
  225.             email: username.toLowerCase(),
  226.             blocked: {
  227.                 $ne: true
  228.             }
  229.         }, function(err, user) {
  230.             if(!user.domain) user.domain=[];
  231.             if(!user.domain.includes(req.get('host'))){
  232.                 user.domain.push(req.get('host'));
  233.                 user.save(function(){});
  234.             }
  235.             if (err) return done(err);
  236.             if (!user) return done(null, false);
  237.             if (!user.validPassword(password)) return done(null, false);
  238.             return done(null, user);
  239.         });
  240.     }));
  241.     router.post('/signup-local', passport.authenticate('signup'), function(req, res) {
  242.         let user = JSON.parse(JSON.stringify(req.user));
  243.         delete user.password;
  244.         delete user.recPass;
  245.         delete user.recUntil;
  246.         res.json(user);
  247.     });
  248.     passport.use('signup', new LocalStrategy({
  249.         usernameField : 'username',
  250.         passwordField : 'password',
  251.         passReqToCallback : true
  252.     }, function(req, username, password, done) {
  253.         User.findOne({
  254.             'email': username.toLowerCase()
  255.         }, function(err, user) {
  256.             if (err) return done(err);
  257.             if (user) return done(null, false);
  258.             else {
  259.                 var newUser = new User();
  260.                 if(!newUser.domain) newUser.domain=[];
  261.                 if(!newUser.domain.includes(req.get('host'))){
  262.                     newUser.domain.push(req.get('host'));
  263.                 }
  264.                 newUser.is = {
  265.                     admin: false
  266.                 };
  267.                 newUser.name = req.body.name;
  268.                 newUser.email = username.toLowerCase();
  269.                 newUser.password = newUser.generateHash(password);
  270.                 newUser.data = req.session.data && typeof req.session.data == 'object' && req.session.data || {};
  271.                 newUser.data.fr = []
  272.                 newUser.data.friends = []
  273.                 newUser.data.balance = {}
  274.                 newUser.data.invites = []
  275.                 newUser.data.deleted = []
  276.                 newUser.data.declinedInvites = []
  277.                 newUser.data.phone = ''
  278.                 newUser.save(function(err) {
  279.                     if (err) throw err;
  280.                     return done(null, newUser);
  281.                 });
  282.             }
  283.         });
  284.     }));
  285.     router.post('/signup', passport.authenticate('local-signup', {
  286.         successRedirect: '/',
  287.         failureRedirect: '/Sign'
  288.     }));
  289.     passport.use('local-signup', new LocalStrategy({
  290.         usernameField : 'username',
  291.         passwordField : 'password',
  292.         passReqToCallback : true
  293.     }, function(req, username, password, done) {
  294.         User.findOne({
  295.             'email': username.toLowerCase()
  296.         }, function(err, user) {
  297.             if (err) return done(err);
  298.             if (user) return done(null, false);
  299.             else {
  300.                 var newUser = new User();
  301.                 if(!newUser.domain) newUser.domain=[];
  302.                 if(!newUser.domain.includes(req.get('host'))){
  303.                     newUser.domain.push(req.get('host'));
  304.                 }
  305.                 newUser.is = {
  306.                     admin: false
  307.                 };
  308.                 newUser.email = username.toLowerCase();
  309.                 newUser.password = newUser.generateHash(password);
  310.                 newUser.data = req.session.data && typeof req.session.data == 'object' && req.session.data || {};
  311.                 newUser.save(function(err) {
  312.                     if (err) throw err;
  313.                     return done(null, newUser);
  314.                 });
  315.             }
  316.         });
  317.     }));
  318.     // Google
  319.     if (sd._config.passport.google) {
  320.         var GoogleStrategy = require('passport-google-oauth').OAuth2Strategy;
  321.         router.get('/google', passport.authenticate('google', {
  322.             scope: ['profile', 'email']
  323.         }));
  324.         router.get('/google/callback', passport.authenticate('google', {
  325.             successRedirect: '/',
  326.             failureRedirect: '/'
  327.         }));
  328.         passport.use('google', new GoogleStrategy({
  329.             clientID: sd._config.passport.google.clientID,
  330.             clientSecret: sd._config.passport.google.clientSecret,
  331.             callbackURL: sd._config.passport.google.callbackURL,
  332.             passReqToCallback: true
  333.         }, function(req, token, refreshToken, profile, done) {
  334.             User.findOne({
  335.                 _id: req.user._id
  336.             }, function(err, user) {
  337.                 if (err) return done(err);
  338.                 if (user) {
  339.                     var google = {};
  340.                     google.id = profile.id;
  341.                     google.url = profile._json.url;
  342.                     req.user.saveGoogle(google, function() {});
  343.                     return done(null, user);
  344.                 }
  345.             });
  346.         }));
  347.     }
  348.         // Instagram
  349.         if (sd._config.passport.instagram) {
  350.             var InstagramStrategy= require('passport-instagram').Strategy;
  351.             router.get('/instagram',
  352.                 passport.authenticate('instagram')
  353.                 );
  354.             router.get('/instagram/callback', passport.authenticate('instagram', {
  355.                 failureRedirect: '/login'
  356.             }), function(req, res) {
  357.                 res.redirect('/');
  358.             });
  359.             passport.use('instagram',new InstagramStrategy({
  360.                 clientID : sd._config.passport.instagram.clientID,
  361.                 clientSecret : sd._config.passport.instagram.clientSecret,
  362.                 callbackURL : sd._config.passport.instagram.callbackURL,
  363.                 passReqToCallback:true
  364.             }, function (req, accessToken, refreshToken, profile, done) {
  365.                 User.findOne({
  366.                     _id: req.user._id
  367.                 }, function(err, user) {
  368.                     if (err) return done(err);
  369.                     if (user) {
  370.                         var instagram = {};
  371.                         instagram.id = profile.id;
  372.                         instagram.username = profile.username;
  373.                         req.user.saveInstagram(instagram, function() {});
  374.                         return done(null, user);
  375.                     }
  376.                 });
  377.             }));
  378.         }
  379.         // Facebook
  380.         if (sd._config.passport.facebook) {
  381.             var FacebookStrategy = require('passport-facebook').Strategy;
  382.             router.get('/facebook', passport.authenticate('facebook', {
  383.                 display: 'page',
  384.                 scope: 'email'
  385.             }));
  386.             router.get('/facebook/callback', passport.authenticate('facebook', {
  387.                 failureRedirect: '/login'
  388.             }), function(req, res) {
  389.                 res.redirect('/');
  390.             });
  391.             passport.use('facebook',new FacebookStrategy({
  392.                 clientID: sd._config.passport.facebook.clientID,
  393.                 clientSecret: sd._config.passport.facebook.clientSecret,
  394.                 callbackURL: sd._config.passport.facebook.callbackURL,
  395.                 profileFields: ['id', 'profileUrl'],
  396.                 passReqToCallback:true
  397.             }, function (req,token, refreshToken, profile, done) {
  398.                 console.log(profile);
  399.                 User.findOne({
  400.                     _id:req.user._id
  401.                 },
  402.                 function (err, user) {
  403.                     if (err)return done(err);
  404.                     if (user) {
  405.                         var facebook={};
  406.                         facebook.profileUrl=profile.profileUrl;
  407.                         facebook.id=profile.id;
  408.                         req.user.saveFacebook(facebook,function(){
  409.                         });
  410.                         return done(null, user);
  411.                     }
  412.                 });
  413.             }));
  414.         }
  415.         // Twitter
  416.         if (sd._config.passport.twitter) {
  417.             var TwitterStrategy = require('passport-twitter').Strategy;
  418.             passport.use(new TwitterStrategy({
  419.                 consumerKey: sd._config.passport.twitter.consumerKey,
  420.                 consumerSecret: sd._config.passport.twitter.consumerSecret,
  421.                 callbackURL: sd._config.passport.twitter.callbackURL
  422.             },function(token, tokenSecret, profile, done) {
  423.                 process.nextTick(function() {
  424.                     User.findOne({
  425.                         'twitter.id': profile.id
  426.                     }, function(err, user) {
  427.                         if (err) return done(err);
  428.                         else if (user) return done(null, user);
  429.                         else {
  430.                             var newUser = new User();
  431.                             newUser.twitter = {
  432.                                 displayName : profile.displayName,
  433.                                 username : profile.username,
  434.                                 id : profile.id,
  435.                                 token : token,
  436.                             }
  437.                             newUser.save(function(err) {
  438.                                 console.log(newUser);
  439.                                 if (err) throw err;
  440.                                 return done(null, newUser);
  441.                             });
  442.                         }
  443.                     });
  444.                 });
  445.             }));
  446.             router.get('/twitter', passport.authenticate('twitter'));
  447.             router.get('/twitter/callback', passport.authenticate('twitter', {
  448.                 successRedirect: sd._config.passport.twitter.successRedirect,
  449.                 failureRedirect: sd._config.passport.twitter.failureRedirect
  450.             }),function(req, res) {
  451.                 res.redirect(sd._config.passport.twitter.successRedirect);
  452.             });
  453.         }
  454.     // End of Crud
  455. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement