From 62b4b0e853e85664ece1b8bd8b4254813bab43b2 Mon Sep 17 00:00:00 2001 From: 8cy <50817549+8cy@users.noreply.github.com> Date: Mon, 11 May 2020 01:48:50 -0700 Subject: big boi changes - add registration ip to user registration - add quotes to footer - add error messages to error page - make uptime readable - remove commenting - login now redircts to previous page - add admin page + marketplace boilerplate - add CHANGE PASSWORD - ADD DELETE ITEM FINALLY - reposition things and formatting --- TODO | 2 +- models/user.js | 4 + package.json | 3 +- server.js | 282 ++++++++++++++++++++++++++++++++++++++-------- views/change-password.ejs | 160 ++++++++++++++++++++++++++ views/error.ejs | 12 +- views/index.ejs | 90 +++++++++++---- views/login.ejs | 3 +- views/profile.ejs | 8 +- views/signup.ejs | 3 +- 10 files changed, 482 insertions(+), 85 deletions(-) create mode 100644 views/change-password.ejs diff --git a/TODO b/TODO index 026527a..c41d1bd 100644 --- a/TODO +++ b/TODO @@ -9,7 +9,7 @@ Final: [x] Images [x] Videos - Footer: + Footer: [x] “created by: “ [ ] List of sources (maybe just W3Schools) diff --git a/models/user.js b/models/user.js index 0971f1f..ae92d86 100644 --- a/models/user.js +++ b/models/user.js @@ -17,6 +17,10 @@ const userSchema = new mongoose.Schema({ password: { type: String, required: true + }, + registrationIP: { + type: String, + required: false } }); module.exports = mongoose.model('User', userSchema); \ No newline at end of file diff --git a/package.json b/package.json index 88ce0bd..3b1244e 100644 --- a/package.json +++ b/package.json @@ -33,6 +33,7 @@ "express": "^4.17.1", "express-session": "^1.17.1", "formidable": "^1.2.2", - "mongoose": "^5.9.12" + "mongoose": "^5.9.12", + "quotes-go": "^1.0.5" } } diff --git a/server.js b/server.js index 848afa0..a0326af 100644 --- a/server.js +++ b/server.js @@ -3,6 +3,7 @@ const path = require('path'); const bcrypt = require('bcrypt'); const session = require('express-session'); const formidable = require('formidable'); +const quotes = require('quotes-go'); const fs = require('fs'); //const ejs = require('ejs'); const mongoose = require('mongoose'); @@ -37,11 +38,19 @@ app.get('/', async (req, res) => { User.findById(req.session.userId) .exec(async (error, user) => { if (error) { - res.render('index', { req: req, User: User, name: null }); + return res.render('error', { + quote: quotes.getRandomQuote(), + errorMsg: 'Unknown error.' + }); } else { if (user === null) { //let err = new Error('Not logged in!'); - res.render('index', { req: req, User: User, name: null }); + res.render('index', { + req: req, + User: User, + name: null, + quote: quotes.getRandomQuote() + }); //return err.status = 400; //return next(err); } else { @@ -72,8 +81,25 @@ app.get('/', async (req, res) => { "type": "trade", "user": user.username }).countDocuments(); + let EntryCount = await EntryItem.countDocuments(); let UserCount = await User.countDocuments(); + + let rawUptime = process.uptime(); + const date = new Date(rawUptime * 1000); + const days = date.getUTCDate() - 1, + hours = date.getUTCHours(), + minutes = date.getUTCMinutes(), + seconds = date.getUTCSeconds(), + milliseconds = date.getUTCMilliseconds(); + let segments = []; + if (days > 0) segments.push(days + ' day' + ((days == 1) ? '' : 's')); + if (hours > 0) segments.push(hours + ' hour' + ((hours == 1) ? '' : 's')); + if (minutes > 0) segments.push(minutes + ' minute' + ((minutes == 1) ? '' : 's')); + if (seconds > 0) segments.push(seconds + ' second' + ((seconds == 1) ? '' : 's')); + if (milliseconds > 0) segments.push(milliseconds + ' millisecond' + ((seconds == 1) ? '' : 's')); + const dateString = segments.join(', '); + return res.render('index', { req: req, User: User, @@ -87,23 +113,10 @@ app.get('/', async (req, res) => { loop3: loop3, loop3Count: loop3Count, EntryCount: EntryCount, - UserCount: UserCount + UserCount: UserCount, + dateString: dateString, + quote: quotes.getRandomQuote() }); - // (await loop1).forEach(entryItem => { - // }) - // loop.forEach(entryItem => { - // parms = parms; - // }); - // const entryItemsPurchase = (await entryItems.find({ username: user.name, "type": "purchase" })).forEach(entryItem => {}); - // const entryItemsSale = (await entryItems.find({ username: user.name, "type": "sale" })).forEach(entryItem => {}); - // const entryItemsTrade = (await entryItems.find({ username: user.name, "type": "trade" })).forEach(entryItem => {}); - - //entryItems.find({ username: user.name, "type": "trade" }).forEach(entryItem => {}); - - // entryItems.find({"user": user.username, "type": "purchase"}).forEach(entryItem => { - // console.log(entryItemsPurchase.forEach(entryItem => { - // entryItem.cars; - // })); } } }); @@ -115,11 +128,15 @@ app.get('/', async (req, res) => { // }); app.get('/login', (req, res) => { - res.render('login'); + res.render('login', { + quote: quotes.getRandomQuote() + }); }); app.get('/signup', (req, res) => { - res.render('signup'); + res.render('signup', { + quote: quotes.getRandomQuote() + }); }); app.get('/api/v1/entries', async (req, res) => { @@ -137,10 +154,16 @@ app.post('/submitEntry', async (req, res) => { User.findById(req.session.userId) .exec(async (error, user) => { if (error) { - return res.render('error'); + return res.render('error', { + quote: quotes.getRandomQuote(), + errorMsg: 'Unknown error.' + }); } else { if (user === null) { - return res.render('error'); + return res.render('error', { + quote: quotes.getRandomQuote(), + errorMsg: 'Not logged in.' + }); } else { await EntryItem.create({ user: user.username, @@ -150,9 +173,9 @@ app.post('/submitEntry', async (req, res) => { price: req.body.priceType, date: new Date() }); - } - return res.redirect(req.get('referer')); + return res.redirect(req.get('referer')); + } } }); @@ -167,9 +190,15 @@ app.post('/login', async (req, res) => { }) .exec((err, user) => { if (err) { - return res.render('error'); + return res.render('error', { + quote: quotes.getRandomQuote(), + errorMsg: 'Unknown error.' + }); } else if (!user) { - return res.render('error'); + return res.render('error', { + quote: quotes.getRandomQuote(), + errorMsg: 'Unknown user.' + }); } bcrypt.compare(password, user.password, (err, result) => { @@ -186,10 +215,16 @@ app.post('/login', async (req, res) => { if (error || !user) { //let err = new Error('Wrong username or password.'); //err.status = 401; - return res.render('error'); + return res.render('error', { + quote: quotes.getRandomQuote(), + errorMsg: 'Unknown username or password.' + }); } else { req.session.userId = user._id; - return res.redirect('/'); + if (req.get('referer') == 'http://' + req.get('host') + '/login' || req.get('referer') == 'https://' + req.get('host') + '/login') { + return res.redirect('/'); + } + return res.redirect(req.get('referer')); } }); } @@ -201,12 +236,16 @@ app.post('/signup', async (req, res) => { const userData = { email: req.body.emailSignup, username: req.body.userSignup, - password: await hashedPass + password: await hashedPass, + registrationIP: req.headers['x-forwarded-for'] || req.connection.remoteAddress }; User.create(userData, (err, user) => { if (err) { - return res.render('error'); + return res.render('error', { + quote: quotes.getRandomQuote(), + errorMsg: 'Username already exists.' + }); } else { req.session.userId = user._id; return res.redirect('/'); @@ -219,7 +258,10 @@ app.post('/logout', (req, res, next) => { if (req.session) { req.session.destroy((err) => { if (err) { - return res.render('error'); + return res.render('error', { + quote: quotes.getRandomQuote(), + errorMsg: 'Unknown error.' + }); } else { return res.redirect('/'); } @@ -227,31 +269,46 @@ app.post('/logout', (req, res, next) => { } }); -app.get('/logout', (req, res, next) => { - if (req.session) { - req.session.userId.destroy((err) => { - if (err) { - return res.render('error'); - } else { - return res.redirect('/'); - } - }); - } -}); +// app.get('/logout', (req, res, next) => { +// if (req.session) { +// req.session.userId.destroy((err) => { +// if (err) { +// return res.render('error', { +// quote: quotes.getRandomQuote(), +// errorMsg: 'Unknown error.' +// }); +// } else { +// return res.redirect('/'); +// } +// }); +// } +// }); app.get('/profile', async (req, res, next) => { User.findById(req.session.userId) .exec((error, user) => { if (error) { - return res.render('error'); + return res.render('error', { + quote: quotes.getRandomQuote(), + errorMsg: 'Unknown error.' + }); } else { if (user === null) { //let err = new Error('Not logged in!'); - return res.render('login', { req: req, User: User }); + return res.render('login', { + req: req, + User: User, + quote: quotes.getRandomQuote() + }); //return err.status = 400; //return next(err); } else { - return res.render('profile', { req: req, User: User, name: user.username }); + return res.render('profile', { + req: req, + User: User, + name: user.username, + quote: quotes.getRandomQuote() + }); } } }); @@ -261,7 +318,10 @@ app.get('/profile/legacy', async (req, res, next) => { User.findById(req.session.userId) .exec((error, user) => { if (error) { - return res.render('error'); + return res.render('error', { + quote: quotes.getRandomQuote(), + errorMsg: 'Unknown error.' + }); } else { if (user === null) { return res.json({ name: 'null' }); @@ -272,9 +332,11 @@ app.get('/profile/legacy', async (req, res, next) => { }); }); -app.get('/error', (req, res) => { - res.render('error'); -}); +// app.get('/error', (req, res) => { +// res.render('error', { +// quote: quotes.getRandomQuote() +// }); +// }); app.get('/terms', (req, res) => { res.render('terms'); @@ -294,7 +356,28 @@ app.get('/terms', (req, res) => { // }); app.get('/marketplace', (req, res) => { - res.redirect('/') + User.findById(req.session.userId) + .exec((error, user) => { + if (error) { + return res.render('error', { + quote: quotes.getRandomQuote(), + errorMsg: 'Unknown error.' + }); + } else { + if (user === null) { + //let err = new Error('Not logged in!'); + return res.render('login', { + req: req, + User: User, + quote: quotes.getRandomQuote() + }); + //return err.status = 400; + //return next(err); + } else { + return res.redirect('/') + } + } + }) }) app.post('/closeExampleVideo', async (req, res) => { @@ -307,6 +390,105 @@ app.post('/openExampleVideo', async (req, res) => { return res.redirect('/'); }); +app.get('/admin', (req, res) => { + User.findById(req.session.userId) + .exec((error, user) => { + if (error) { + return res.render('error', { + quote: quotes.getRandomQuote(), + errorMsg: 'Unknown error.' + }); + } else { + if (user === null) { + //let err = new Error('Not logged in!'); + return res.render('login', { + req: req, + User: User, + quote: quotes.getRandomQuote() + }); + //return err.status = 400; + //return next(err); + } else { + if (user.username == 'sin') { + return res.redirect('/') + // return res.render('profile', { + // req: req, + // User: User, + // name: user.username, + // quote: quotes.getRandomQuote() + // }); + } else { + return res.render('error', { + quote: quotes.getRandomQuote(), + errorMsg: 'Not authorized.' + }); + } + } + } + }) +}) + +app.get('/change-password', (req, res) => { + User.findById(req.session.userId) + .exec((error, user) => { + if (error) { + return res.render('error', { + quote: quotes.getRandomQuote(), + errorMsg: 'Unknown error.' + }); + } else { + if (user === null) { + //let err = new Error('Not logged in!'); + return res.render('login', { + req: req, + User: User, + quote: quotes.getRandomQuote() + }); + //return err.status = 400; + //return next(err); + } else { + return res.render('change-password', { + quote: quotes.getRandomQuote() + }); + } + } + }) +}); + +app.post('/change-password', async (req, res) => { + if (req.body.passReset && req.body.passResetCheck) { + let hashedPass = bcrypt.hash(req.body.passReset, 10); + const userData = { + password: await hashedPass + }; + + User.findByIdAndUpdate(req.session.userId, userData, (err, user) => { + if (err) { + return res.render('error', { + quote: quotes.getRandomQuote(), + errorMsg: 'Error changing password.' + }); + } else { + return res.redirect('/'); + } + }) + } +}); + +app.post('/deleteItem/:id', (req, res) => { + EntryItem.findByIdAndDelete(req.params.id) + .exec((err, user) => { + if (err) { + return res.render('error', { + quote: quotes.getRandomQuote(), + errorMsg: 'Unknown error.' + }); + } else { + res.redirect('/') + } + }) +}) + app.get('*', (req, res) => { res.redirect('/') }) diff --git a/views/change-password.ejs b/views/change-password.ejs new file mode 100644 index 0000000..aa24b28 --- /dev/null +++ b/views/change-password.ejs @@ -0,0 +1,160 @@ + + + + + + + Sin's SS Logger | Change Password + + + + + + + + + + + + + + + + + + + + +
+
+
+
+

+ Change Password +

+ +
+
+ + + + + Pick something secure and easy to + remember! Must be atleast 3 characters. + +
+
+
+
+
+
+ + + + + + + + \ No newline at end of file diff --git a/views/error.ejs b/views/error.ejs index 05344c0..829840d 100644 --- a/views/error.ejs +++ b/views/error.ejs @@ -76,8 +76,8 @@ -