From c15284dbea3394ebd7adf4aae0f149b9cbf5c717 Mon Sep 17 00:00:00 2001 From: mrjvs Date: Tue, 18 Dec 2018 18:21:54 +0100 Subject: [PATCH] updated 404, added profile picture, templating, fixed registration bugs --- assets/images/default_avatar.png | Bin 0 -> 72704 bytes helpers/util.js | 4 ++-- models/pnid.js | 29 +++++++++++++++++++++++++++-- passport.config.js | 4 ++-- routes/pnid.js | 6 +++--- server.js | 2 -- views/404.hbs | 26 ++++++++++++++++---------- views/partials/nav-dashboard.hbs | 4 ++-- views/partials/nav-default.hbs | 4 ++-- 9 files changed, 54 insertions(+), 25 deletions(-) create mode 100644 assets/images/default_avatar.png diff --git a/assets/images/default_avatar.png b/assets/images/default_avatar.png new file mode 100644 index 0000000000000000000000000000000000000000..9b649159a405af575622bed9758dad26370ee4cb GIT binary patch literal 72704 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 Jmvv4FO#sf+AhQ4f literal 0 HcmV?d00001 diff --git a/helpers/util.js b/helpers/util.js index cf71125..3faccc2 100644 --- a/helpers/util.js +++ b/helpers/util.js @@ -10,13 +10,13 @@ const logger = require('winston'); // shows 404 template. takes express response object function send404(res) { - res.status(404).send('404'); + res.status(404).render('404'); } function templateReadyUser(req) { // normal user logged in const isLoggedIn = req.user ? req.user.role != 'admin' : false; - const user = req.user; + const user = req.user ? req.user.toObject() : undefined; return { isLoggedIn, user diff --git a/models/pnid.js b/models/pnid.js index 5fc2f94..4f161d8 100644 --- a/models/pnid.js +++ b/models/pnid.js @@ -19,6 +19,7 @@ const PNIDSchema = new mongoose.Schema({ required: [true, 'Email is required.'], unique: true, trim: true, + uppercase: true, validate: [validateEmail, 'Please fill a valid email address'] }, email_validated: { @@ -48,11 +49,17 @@ const PNIDSchema = new mongoose.Schema({ }, username: { type: String, - unique: true + unique: true, + validate: [validateUsername, 'Please fill a valid username'], + required: true }, username_lower: { type: String, unique: true + }, + avatar_url: { + type: String, + default: '/assets/images/default_avatar.png' } }, consoles: [] @@ -64,6 +71,12 @@ function validateEmail(email) { return re.test(email); } +function validateUsername(username) { + // eslint throws "unnecesary character escape" + const re = /^[a-zA-Z0-9]+([_ -]?[a-zA-Z0-9])*$/; // eslint-disable-line + return re.test(username); +} + PNIDSchema.plugin(uniqueValidator, {message: '{PATH} already in use.'}); // hashing password @@ -86,10 +99,22 @@ PNIDSchema.pre('save', function(next) { PNIDSchema.statics.findByEmail = function(email) { return this.model('pnid').findOne({ - email + email: email.toUpperCase() }); }; +PNIDSchema.statics.findUser = async function(key) { + const user = await this.model('pnid').findOne({ + email: key.toUpperCase() + }); + if (!user) { + return await this.model('pnid').findOne({ + 'pnid.username_lower': key.toLowerCase() + }); + } + return user; +}; + PNIDSchema.statics.hashPasswordPrimary = function(password, pid) { const buff1 = require('python-struct').pack(' { passport.use('PNIDStrategy', new LocalStrategy({ usernameField: 'email' }, (email, password, done) => { - // find user in database - PNIDModel.findByEmail(email).then((user) => { + // find user in database, email = username or email + PNIDModel.findUser(email).then((user) => { if (!user) { // user doesnt exist return done(null, false, {message: 'Incorrect email'}); diff --git a/routes/pnid.js b/routes/pnid.js index a255c71..86d3127 100644 --- a/routes/pnid.js +++ b/routes/pnid.js @@ -92,15 +92,15 @@ router.post('/api/v1/login', passport.authenticate('PNIDStrategy'), function (re * errors: Strings[messages] * } */ -router.post('/api/v1/register', recaptcha.middleware.verify, async (request, response) => { +router.post('/api/v1/register'/*, recaptcha.middleware.verify*/, async (request, response) => { if (!request.body) { return apiHelper.sendApiGenericError(response); } - if (request.recaptcha.error) { + /*if (request.recaptcha.error) { logger.log('warn', `[reCaptcha ERROR] ${request.recaptcha.error} | IP: ${request.ip} | Data: ${JSON.stringify(request.body)}`); return apiHelper.sendApiError(response, 500, ['Captcha error']); - } + }*/ const { email, password, confirm_password, username } = request.body; diff --git a/server.js b/server.js index cacd7b3..0aff1ac 100644 --- a/server.js +++ b/server.js @@ -95,8 +95,6 @@ app.use((request, response) => { return utilHelper.send404(response); }); -// TODO improve error handling -// TODO remove param decoding errors from logs example: "host/test/%" // 4 parameters required to read the error, cant help the eslint error app.use((error, request, response, next) => { // eslint-disable-line no-unused-vars logger.log('warn', error.stack); diff --git a/views/404.hbs b/views/404.hbs index faa5dad..e2ba727 100644 --- a/views/404.hbs +++ b/views/404.hbs @@ -1,14 +1,20 @@ - {{> head }} - - {{> navbar }} - -

haha-yes

- - file not found! - - {{> footer }} + {{> head-common }} + + + + +
+
+
+
+

ERROR

+

{{ locale.404.title }}

+
+
+
+ {{> footer-default }} - + \ No newline at end of file diff --git a/views/partials/nav-dashboard.hbs b/views/partials/nav-dashboard.hbs index 1ff4e15..a6240c7 100644 --- a/views/partials/nav-dashboard.hbs +++ b/views/partials/nav-dashboard.hbs @@ -1,7 +1,7 @@