From d6713e8e739b8098fd1dac2cf54ffd7918186e35 Mon Sep 17 00:00:00 2001 From: Jonathan Barrow Date: Sat, 16 Jul 2022 10:05:33 -0400 Subject: [PATCH] Always assign user render data if logged in --- src/middleware/pnid.js | 21 ---------------- src/middleware/render-data.js | 19 +++++++++++++-- src/middleware/require-login.js | 10 ++++++++ src/routes/account.js | 14 +++++------ src/routes/aprilfools.js | 11 +-------- src/routes/blog.js | 11 --------- src/routes/docs.js | 11 --------- src/routes/home.js | 6 ----- src/routes/localization.js | 10 +------- src/routes/progress.js | 6 ----- src/util.js | 43 +-------------------------------- 11 files changed, 37 insertions(+), 125 deletions(-) delete mode 100644 src/middleware/pnid.js create mode 100644 src/middleware/require-login.js diff --git a/src/middleware/pnid.js b/src/middleware/pnid.js deleted file mode 100644 index 507da57..0000000 --- a/src/middleware/pnid.js +++ /dev/null @@ -1,21 +0,0 @@ -const util = require('../util'); -const database = require('../database'); - -async function pnidMiddleware(request, response, next) { - // Verify the user is logged in - if (!request.cookies.access_token || !request.cookies.refresh_token) { - return response.redirect(`/account/login?redirect=${request.originalUrl}`); - } - - try { - request.account = await util.getUserAccountData(request, response); - request.pnid = await database.PNID.findOne({ pid: request.account.pid }); - - return next(); - } catch (error) { - response.cookie('error_message', error.message, { domain: '.pretendo.network' }); - return response.redirect('/account/login'); - } -} - -module.exports = pnidMiddleware; \ No newline at end of file diff --git a/src/middleware/render-data.js b/src/middleware/render-data.js index 8673377..c434012 100644 --- a/src/middleware/render-data.js +++ b/src/middleware/render-data.js @@ -1,4 +1,5 @@ const util = require('../util'); +const database = require('../database'); async function renderDataMiddleware(request, response, next) { // Get user local @@ -17,8 +18,22 @@ async function renderDataMiddleware(request, response, next) { response.clearCookie('error_message', { domain: '.pretendo.network' }); response.locals.isLoggedIn = request.cookies.access_token && request.cookies.refresh_token; - - return next(); + + if (response.locals.isLoggedIn) { + try { + response.locals.account = await util.getUserAccountData(request, response); + + request.pnid = await database.PNID.findOne({ pid: response.locals.account.pid }); + request.account = response.locals.account; + + return next(); + } catch (error) { + response.cookie('error_message', error.message, { domain: '.pretendo.network' }); + return response.redirect('/account/login'); + } + } else { + return next(); + } } module.exports = renderDataMiddleware; \ No newline at end of file diff --git a/src/middleware/require-login.js b/src/middleware/require-login.js new file mode 100644 index 0000000..873e2e8 --- /dev/null +++ b/src/middleware/require-login.js @@ -0,0 +1,10 @@ +async function requireLoginMiddleware(request, response, next) { + // Verify the user is logged in + if (!request.cookies.access_token || !request.cookies.refresh_token) { + return response.redirect(`/account/login?redirect=${request.originalUrl}`); + } + + return next(); +} + +module.exports = requireLoginMiddleware; \ No newline at end of file diff --git a/src/routes/account.js b/src/routes/account.js index 771b712..cbcbb73 100644 --- a/src/routes/account.js +++ b/src/routes/account.js @@ -6,7 +6,7 @@ const AdmZip = require('adm-zip'); const Stripe = require('stripe'); const { REST: DiscordRest } = require('@discordjs/rest'); const { Routes: DiscordRoutes } = require('discord-api-types/v10'); -const pnidMiddleware = require('../middleware/pnid'); +const requireLoginMiddleware = require('../middleware/require-login'); const database = require('../database'); const cache = require('../cache'); const util = require('../util'); @@ -27,7 +27,7 @@ const discordOAuth = new DiscordOauth2({ version: 'v10' }); -router.get('/', pnidMiddleware, async (request, response) => { +router.get('/', requireLoginMiddleware, async (request, response) => { // Setup the data to be sent to the handlebars renderer const renderData = {}; @@ -145,7 +145,7 @@ router.get('/logout', async(_request, response) => { response.redirect('/'); }); -router.get('/connect/discord', pnidMiddleware, async (request, response) => { +router.get('/connect/discord', requireLoginMiddleware, async (request, response) => { let tokens; try { // Attempt to get OAuth2 tokens @@ -173,7 +173,7 @@ router.get('/connect/discord', pnidMiddleware, async (request, response) => { } }); -router.post('/online-files', pnidMiddleware, async (request, response) => { +router.post('/online-files', requireLoginMiddleware, async (request, response) => { const { account } = request; const { password } = request.body; @@ -265,7 +265,7 @@ router.get('/miieditor', async (request, response) => { }); }); -router.get('/upgrade', pnidMiddleware, async (request, response) => { +router.get('/upgrade', requireLoginMiddleware, async (request, response) => { // Set user account info to render data const { pnid } = request; @@ -306,7 +306,7 @@ router.get('/upgrade', pnidMiddleware, async (request, response) => { response.render('account/upgrade', renderData); }); -router.post('/stripe/checkout/:priceId', pnidMiddleware, async (request, response) => { +router.post('/stripe/checkout/:priceId', requireLoginMiddleware, async (request, response) => { // Set user account info to render data const { account } = request; const pid = account.pid; @@ -367,7 +367,7 @@ router.post('/stripe/checkout/:priceId', pnidMiddleware, async (request, respons } }); -router.post('/stripe/unsubscribe', pnidMiddleware, async (request, response) => { +router.post('/stripe/unsubscribe', requireLoginMiddleware, async (request, response) => { // Set user account info to render data const { pnid } = request; diff --git a/src/routes/aprilfools.js b/src/routes/aprilfools.js index 74d7454..94bdb4b 100644 --- a/src/routes/aprilfools.js +++ b/src/routes/aprilfools.js @@ -1,17 +1,8 @@ const { Router } = require('express'); -const util = require('../util'); const router = new Router(); router.get('/', async (request, response) => { - - const renderData = {}; - - if (response.locals.isLoggedIn) { - const account = await util.getAccount(request, response); - renderData.account = account; - } - - response.render('aprilfools', renderData); + response.render('aprilfools'); }); module.exports = router; diff --git a/src/routes/blog.js b/src/routes/blog.js index 2b27e23..2e80238 100644 --- a/src/routes/blog.js +++ b/src/routes/blog.js @@ -1,5 +1,4 @@ const { Router } = require('express'); -const util = require('../util'); const logger = require('../logger'); const router = new Router(); @@ -40,11 +39,6 @@ router.get('/', async (request, response) => { postList }; - if (response.locals.isLoggedIn) { - const account = await util.getAccount(request, response); - renderData.account = account; - } - response.render('blog/blog', renderData); }); @@ -72,11 +66,6 @@ router.get('/:slug', async (request, response, next) => { postList, }; - if (response.locals.isLoggedIn) { - const account = await util.getAccount(request, response); - renderData.account = account; - } - // Get the name of the post from the URL const postName = request.params.slug; diff --git a/src/routes/docs.js b/src/routes/docs.js index 5f6697a..4541988 100644 --- a/src/routes/docs.js +++ b/src/routes/docs.js @@ -1,5 +1,4 @@ const { Router } = require('express'); -const util = require('../util'); const router = new Router(); const fs = require('fs'); @@ -15,11 +14,6 @@ router.get('/search', async (request, response) => { currentPage: request.params.slug }; - if (response.locals.isLoggedIn) { - const account = await util.getAccount(request, response); - renderData.account = account; - } - response.render('docs/search', renderData); }); @@ -28,11 +22,6 @@ router.get('/:slug', async (request, response, next) => { currentPage: request.params.slug }; - if (response.locals.isLoggedIn) { - const account = await util.getAccount(request, response); - renderData.account = account; - } - // Get the name of the page from the URL const pageName = request.params.slug; diff --git a/src/routes/home.js b/src/routes/home.js index fc21522..9170877 100644 --- a/src/routes/home.js +++ b/src/routes/home.js @@ -1,5 +1,4 @@ const { Router } = require('express'); -const util = require('../util'); const { boards } = require('../../boards/boards.json'); const router = new Router(); @@ -11,11 +10,6 @@ router.get('/', async (request, response) => { boards }; - if (response.locals.isLoggedIn) { - const account = await util.getAccount(request, response); - renderData.account = account; - } - const cache = await getTrelloCache(); // Builds the arrays of people for the special thanks section diff --git a/src/routes/localization.js b/src/routes/localization.js index 7e4dec3..6706f4c 100644 --- a/src/routes/localization.js +++ b/src/routes/localization.js @@ -1,16 +1,8 @@ const { Router } = require('express'); -const util = require('../util'); const router = new Router(); router.get('/', async (request, response) => { - const renderData = {}; - - if (response.locals.isLoggedIn) { - const account = await util.getAccount(request, response); - renderData.account = account; - } - - response.render('localization', renderData); + response.render('localization'); }); module.exports = router; diff --git a/src/routes/progress.js b/src/routes/progress.js index 6a70d3e..fb133f4 100644 --- a/src/routes/progress.js +++ b/src/routes/progress.js @@ -1,5 +1,4 @@ const { Router } = require('express'); -const util = require('../util'); const { boards } = require('../../boards/boards.json'); const router = new Router(); @@ -10,11 +9,6 @@ router.get('/', async (request, response) => { boards }; - if (response.locals.isLoggedIn) { - const account = await util.getAccount(request, response); - renderData.account = account; - } - const trelloCache = await getTrelloCache(); renderData.progressLists = trelloCache; const stripeDonationCache = await getStripeDonationCache(); diff --git a/src/util.js b/src/util.js index d7a561a..b542f74 100644 --- a/src/util.js +++ b/src/util.js @@ -335,46 +335,6 @@ async function handleStripeEvent(event) { } } -async function getAccount(request, response) { - // Attempt to get user data - let apiResponse = await apiGetRequest('/v1/user', { - 'Authorization': `${request.cookies.token_type} ${request.cookies.access_token}` - }); - - if (apiResponse.statusCode !== 200) { - // Assume expired, refresh and retry request - apiResponse = await apiPostGetRequest('/v1/login', {}, { - refresh_token: request.cookies.refresh_token, - grant_type: 'refresh_token' - }); - - if (apiResponse.statusCode !== 200) { - // TODO: Error message - return response.status(apiResponse.statusCode).json({ - error: 'Bad' - }); - } - - const tokens = apiResponse.body; - - apiResponse = await apiGetRequest('/v1/user', { - 'Authorization': `${tokens.token_type} ${tokens.access_token}` - }); - } - - // If still failed, something went horribly wrong - if (apiResponse.statusCode !== 200) { - // TODO: Error message - return response.status(apiResponse.statusCode).json({ - error: 'Bad' - }); - } - - // Return user account info - const account = apiResponse.body; - return account; -} - module.exports = { fullUrl, getLocale, @@ -387,6 +347,5 @@ module.exports = { getUserAccountData, updateDiscordConnection, nintendoPasswordHash, - handleStripeEvent, - getAccount + handleStripeEvent }; \ No newline at end of file