diff --git a/src/middleware/auth.js b/src/middleware/auth.js index 849d3d4..96f0403 100644 --- a/src/middleware/auth.js +++ b/src/middleware/auth.js @@ -2,27 +2,55 @@ const config = require('../config.json'); const util = require('../authentication'); function auth(request, response, next) { - if(!request.headers["x-nintendo-parampack"] || !request.headers["x-nintendo-servicetoken"]) { - return response.render('console/ban_notification.ejs', { - user: null, - error: "Missing auth headers" - }); + if(request.path.includes('/css/') || request.path.includes('/fonts/') + || request.path.includes('/js/') || request.path.includes('/icons/') || request.path.includes('/banner/')) { + request.directory = request.subdomains[1]; + return next() + } + + if(request.subdomains.indexOf('admin') !== -1) { + if(request.path === '/login' || request.path === '/token' || request.path === '/favicon.ico') { + return next() + } + else { + if(request.cookies.token === undefined || request.cookies.token === null) + { + return response.redirect('/login'); + } + let pid = util.data.processServiceToken(request.cookies.token); + if(pid === null) + { + return response.redirect('/login'); + } + else { + request.pid = pid; + return next(); + } + } } else { - let pid = util.data.processServiceToken(request.headers["x-nintendo-servicetoken"]); - let paramPackData = util.data.decodeParamPack(request.headers["x-nintendo-parampack"]); - if(pid === null) - return response.render('console/ban_notification.ejs', { + if(!request.headers["x-nintendo-parampack"] || !request.headers["x-nintendo-servicetoken"]) { + return response.render('portal/ban_notification.ejs', { user: null, - error: "Unable to parse service token. Are you using a NNID?" + error: "Missing auth headers" }); + } else { - response.header('X-Nintendo-WhiteList', config.whitelist); - request.lang = util.data.processLanguage(request.headers["x-nintendo-parampack"]); - request.pid = pid; - request.paramPackData = paramPackData; - request.directory = request.subdomains[1]; - return next(); + let pid = util.data.processServiceToken(request.headers["x-nintendo-servicetoken"]); + let paramPackData = util.data.decodeParamPack(request.headers["x-nintendo-parampack"]); + if(pid === null) + return response.render('portal/ban_notification.ejs', { + user: null, + error: "Unable to parse service token. Are you using a NNID?" + }); + else { + response.header('X-Nintendo-WhiteList', config.whitelist); + request.lang = util.data.processLanguage(request.headers["x-nintendo-parampack"]); + request.pid = pid; + request.paramPackData = paramPackData; + request.directory = request.subdomains[1]; + return next(); + } } } } diff --git a/src/models/endpoint.js b/src/models/endpoint.js index 41c29d8..ae4ac2a 100644 --- a/src/models/endpoint.js +++ b/src/models/endpoint.js @@ -8,7 +8,8 @@ const endpointSchema = new Schema({ api_host: String, portal_host: String, n3ds_host: String - } + }, + guest: Boolean, }); endpointSchema.methods.updateHosts = async function({host, api_host, portal_host, n3ds_host}) { @@ -19,6 +20,11 @@ endpointSchema.methods.updateHosts = async function({host, api_host, portal_host await this.save(); }; +endpointSchema.methods.updateGuest = async function(mode) { + this.set('guest', mode); + await this.save(); +} + const ENDPOINT = model('ENDPOINT', endpointSchema); module.exports = { diff --git a/src/server.js b/src/server.js index 6be4a02..c6aa89d 100644 --- a/src/server.js +++ b/src/server.js @@ -3,6 +3,7 @@ const express = require('express'); const morgan = require('morgan'); const ejs = require('ejs'); const xmlparser = require('./middleware/xml-parser'); +const cookieParser = require('cookie-parser'); const auth = require('./middleware/auth'); const database = require('./database'); const logger = require('./logger'); @@ -29,6 +30,7 @@ app.use(express.urlencoded({ parameterLimit: 100000 })); app.use(xmlparser); +app.use(cookieParser()); app.use(auth); diff --git a/src/services/juxt-web/routes/admin/api.js b/src/services/juxt-web/routes/admin/api.js index 1232bbe..7a52233 100644 --- a/src/services/juxt-web/routes/admin/api.js +++ b/src/services/juxt-web/routes/admin/api.js @@ -12,656 +12,384 @@ const snowflake = require('node-snowflake').Snowflake; var storage = multer.memoryStorage(); var upload = multer({ storage: storage }); -router.get('/communities/all', function (req, res) { - database.connect().then(async e => { - if(req.cookies.token === null) - throw new Error('No service token supplied'); - - let pid = util.data.processServiceToken(req.cookies.token); - - if(pid === null) - throw new Error('Invalid credentials supplied'); - - let user = await database.getUserByPID(pid); - - if(user !== null) - { - if(config.authorized_PNIDs.indexOf(user.pid) === -1) - throw new Error('Invalid credentials supplied'); - - res.send(await database.getCommunities(-1)) - } - else - throw new Error('Invalid account ID or password'); - - }).catch(error => +router.get('/communities/all', async function(req, res) { + let user = await database.getUserByPID(req.pid); + if(user !== null) { - res.statusCode = 400; - let response = { - error_code: 400, - message: error.message - }; - res.send(response); - }); + if(config.authorized_PNIDs.indexOf(user.pid) === -1) + throw new Error('Invalid credentials supplied'); + res.send(await database.getCommunities(-1)) + } + else + throw new Error('Invalid account ID or password'); }); -router.get('/communities/:communityID', function (req, res) { - database.connect().then(async e => { - if(req.cookies.token === null) - throw new Error('No service token supplied'); - - let pid = util.data.processServiceToken(req.cookies.token); - - if(pid === null) - throw new Error('Invalid credentials supplied'); - - let user = await database.getUserByPID(pid); - - if(user !== null) - { - if(config.authorized_PNIDs.indexOf(user.pid) === -1) - throw new Error('Invalid credentials supplied'); - - res.send(await database.getCommunityByID(req.params.communityID)) - } - else - throw new Error('Invalid account ID or password'); - - }).catch(error => +router.get('/communities/:communityID', async function (req, res) { + let user = await database.getUserByPID(req.pid); + if(user !== null) { - res.statusCode = 400; - let response = { - error_code: 400, - message: error.message - }; - res.send(response); - }); + if(config.authorized_PNIDs.indexOf(user.pid) === -1) + throw new Error('Invalid credentials supplied'); + res.send(await database.getCommunityByID(req.params.communityID)) + } + else + throw new Error('Invalid account ID or password'); }); -router.post('/communities/:communityID/delete', function (req, res) { - database.connect().then(async e => { - if(req.cookies.token === null) - throw new Error('No service token supplied'); - - let pid = util.data.processServiceToken(req.cookies.token); - - if(pid === null) - throw new Error('Invalid credentials supplied'); - - let user = await database.getUserByPID(pid); - - if(user !== null) - { - if(config.authorized_PNIDs.indexOf(user.pid) === -1) { - logger.audit('[' + user.user_id + ' - ' + user.pid + '] attempted to delete a community and is not authorized'); - throw new Error('Invalid credentials supplied'); - } - - let community = await database.getCommunityByID(req.params.communityID); - if(community !== null) { - community.delete().then(err => function () { - res.send(err); - }); - res.sendStatus(200); - logger.audit('[' + user.user_id + ' - ' + user.pid + '] deleted community ' + community.name); - } - } - else - throw new Error('Invalid account ID or password'); - - }).catch(error => +router.post('/communities/:communityID/delete', async function (req, res) { + let user = await database.getUserByPID(req.pid); + if(user !== null) { - res.statusCode = 400; - let response = { - error_code: 400, - message: error.message - }; - res.send(response); - }); + if(config.authorized_PNIDs.indexOf(user.pid) === -1) { + logger.audit('[' + user.user_id + ' - ' + user.pid + '] attempted to delete a community and is not authorized'); + throw new Error('Invalid credentials supplied'); + } + let community = await database.getCommunityByID(req.params.communityID); + if(community !== null) { + community.delete().then(err => function () { + res.send(err); + }); + res.sendStatus(200); + logger.audit('[' + user.user_id + ' - ' + user.pid + '] deleted community ' + community.name); + } + } + else + throw new Error('Invalid account ID or password'); }); -router.post('/communities/:communityID/update', upload.fields([{name: 'browserIcon', maxCount: 1}, { name: 'CTRbrowserHeader', maxCount: 1}, { name: 'WiiUbrowserHeader', maxCount: 1}]), function (req, res) { - database.connect().then(async e => { - if(req.cookies.token === null) - throw new Error('No service token supplied'); - - let pid = util.data.processServiceToken(req.cookies.token); - - if(pid === null) +router.post('/communities/:communityID/update', upload.fields([{name: 'browserIcon', maxCount: 1}, { name: 'CTRbrowserHeader', maxCount: 1}, { name: 'WiiUbrowserHeader', maxCount: 1}]), async function(req, res) { + let user = await database.getUserByPID(req.pid); + if(user !== null) + { + if(config.authorized_PNIDs.indexOf(user.pid) === -1) { + logger.audit('[' + user.user_id + ' - ' + user.pid + '] attempted to update a community and is not authorized'); throw new Error('Invalid credentials supplied'); + } + const community = await database.getCommunityByID(req.params.communityID); + const files = JSON.parse(JSON.stringify(req.files)); - let user = await database.getUserByPID(pid); + if(req.body.name && community.name !== req.body.name) + community.name = req.body.name; - if(user !== null) - { - if(config.authorized_PNIDs.indexOf(user.pid) === -1) { - logger.audit('[' + user.user_id + ' - ' + user.pid + '] attempted to update a community and is not authorized'); - throw new Error('Invalid credentials supplied'); - } + if(req.body.description && community.description !== req.body.description) + community.description = req.body.description; - const community = await database.getCommunityByID(req.params.communityID); - const files = JSON.parse(JSON.stringify(req.files)); - - if(req.body.name && community.name !== req.body.name) - community.name = req.body.name; - - if(req.body.description && community.description !== req.body.description) - community.description = req.body.description; - - if(req.body.title_ids[0] !== community.title_ids[0] && req.body.title_ids[1] !== community.title_ids[1] && req.body.title_ids[2] !== community.title_ids[2] + if(req.body.title_ids[0] !== community.title_ids[0] && req.body.title_ids[1] !== community.title_ids[1] && req.body.title_ids[2] !== community.title_ids[2] && req.body.title_ids[0] !== '' && req.body.title_ids[1] !== '' && req.body.title_ids[2] !== '') { - community.title_id = req.body.title_ids; - community.title_ids = req.body.title_ids; - } - - if(req.body.icon && community.icon !== req.body.icon) - community.icon = req.body.icon; - - if(req.files.browserIcon) { - community.browser_icon = `data:image/png;base64,${req.files.browserIcon[0].buffer.toString('base64')}`; - community.browser_thumbnail = `data:image/png;base64,${req.files.browserIcon[0].buffer.toString('base64')}`; - } - if(req.files.CTRbrowserHeader) - community.CTR_browser_header = `data:image/png;base64,${req.files.CTRbrowserHeader[0].buffer.toString('base64')}`; - - if(req.files.WiiUbrowserHeader) - community.WiiU_browser_header = `data:image/png;base64,${req.files.WiiUbrowserHeader[0].buffer.toString('base64')}`; - - if(req.body.is_recommended) - community.is_recommended = req.body.is_recommended; - - if(req.body.has_shop_page) - community.has_shop_page = req.body.has_shop_page; - - if(req.body.platform_id) - community.platform_id = req.body.platform_id; - - community.save(); - res.sendStatus(200); - util.data.refreshCache(); - logger.audit('[' + user.user_id + ' - ' + user.pid + '] updated community ' + community.name); + community.title_id = req.body.title_ids; + community.title_ids = req.body.title_ids; } - else - throw new Error('Invalid account ID or password'); - }).catch(error => - { - res.statusCode = 400; - let response = { - error_code: 400, - message: error.message - }; - res.send(response); - }); -}); + if(req.body.icon && community.icon !== req.body.icon) + community.icon = req.body.icon; -router.post('/communities/new', upload.fields([{name: 'browserIcon', maxCount: 1}, { name: 'CTRbrowserHeader', maxCount: 1}, { name: 'WiiUbrowserHeader', maxCount: 1}]), function (req, res) { - database.connect().then(async e => { - if(req.cookies.token === null) - throw new Error('No service token supplied'); - - let pid = util.data.processServiceToken(req.cookies.token); - - if(pid === null) - throw new Error('Invalid credentials supplied'); - - let user = await database.getUserByPID(pid); - - if(user !== null) - { - if(config.authorized_PNIDs.indexOf(user.pid) === -1) { - logger.audit('[' + user.user_id + ' - ' + user.pid + '] attempted to create a community and is not authorized'); - throw new Error('Invalid credentials supplied'); - } - JSON.parse(JSON.stringify(req.files)); - let browserIcon, CTRHeader, WiiUHeader, thumb; - if(req.files.browserIcon) { - browserIcon = `data:image/png;base64,${req.files.browserIcon[0].buffer.toString('base64')}`; - thumb = `data:image/png;base64,${req.files.browserIcon[0].buffer.toString('base64')}`; - } - if(req.files.CTRbrowserHeader) - CTRHeader = `data:image/png;base64,${req.files.CTRbrowserHeader[0].buffer.toString('base64')}`; - - if(req.files.WiiUbrowserHeader) - WiiUHeader = `data:image/png;base64,${req.files.WiiUbrowserHeader[0].buffer.toString('base64')}`; - const document = { - empathy_count: 0, - id: snowflake.nextId(), - has_shop_page: req.body.has_shop_page, - platform_id: req.body.platform_ID, - icon: req.body.icon, - created_at: moment(new Date()), - title_ids: req.body.title_ids, - title_id: req.body.title_ids, - community_id: snowflake.nextId(), - is_recommended: req.body.is_recommended, - name: req.body.name, - browser_icon: `data:image/png;base64,${browserIcon.toString('base64')}`, - CTR_browser_header: `data:image/png;base64,${CTRHeader.toString('base64')}`, - WiiU_browser_header: `data:image/png;base64,${WiiUHeader.toString('base64')}`, - browser_thumbnail: `data:image/png;base64,${thumb.toString('base64')}`, - description: req.body.description, - }; - const newCommunity = new COMMUNITY(document); - newCommunity.save(); - res.sendStatus(200); - logger.audit('[' + user.user_id + ' - ' + user.pid + '] created community ' + newCommunity.name); + if(req.files.browserIcon) { + community.browser_icon = `data:image/png;base64,${req.files.browserIcon[0].buffer.toString('base64')}`; + community.browser_thumbnail = `data:image/png;base64,${req.files.browserIcon[0].buffer.toString('base64')}`; } - else - throw new Error('Invalid account ID or password'); + if(req.files.CTRbrowserHeader) + community.CTR_browser_header = `data:image/png;base64,${req.files.CTRbrowserHeader[0].buffer.toString('base64')}`; - }).catch(error => - { - res.statusCode = 400; - let response = { - error_code: 400, - message: error.message - }; - res.send(response); - }); -}); + if(req.files.WiiUbrowserHeader) + community.WiiU_browser_header = `data:image/png;base64,${req.files.WiiUbrowserHeader[0].buffer.toString('base64')}`; -router.post('/communities/:communityID/sub/new', upload.fields([{name: 'browserIcon', maxCount: 1}, { name: 'CTRbrowserHeader', maxCount: 1}, { name: 'WiiUbrowserHeader', maxCount: 1}]), function (req, res) { - database.connect().then(async e => { - if(req.cookies.token === null) - throw new Error('No service token supplied'); + if(req.body.is_recommended) + community.is_recommended = req.body.is_recommended; - let pid = util.data.processServiceToken(req.cookies.token); + if(req.body.has_shop_page) + community.has_shop_page = req.body.has_shop_page; - if(pid === null) - throw new Error('Invalid credentials supplied'); + if(req.body.platform_id) + community.platform_id = req.body.platform_id; - let user = await database.getUserByPID(pid); - - if(user !== null) - { - if(config.authorized_PNIDs.indexOf(user.pid) === -1) { - logger.audit('[' + user.user_id + ' - ' + user.pid + '] attempted to create a community and is not authorized'); - throw new Error('Invalid credentials supplied'); - } - const community = await database.getCommunityByID(req.params.communityID); - let browserIcon, CTRHeader, WiiUHeader, thumb; - if(req.files.browserIcon) { - browserIcon = `data:image/png;base64,${req.files.browserIcon[0].buffer.toString('base64')}`; - } - else { - browserIcon = community.browser_icon; - thumb = community.browser_thumbnail; - } - if(req.files.CTRbrowserHeader) - CTRHeader = `data:image/png;base64,${req.files.CTRbrowserHeader[0].buffer.toString('base64')}`; - else - CTRHeader = community.CTR_browser_header; - if(req.files.WiiUbrowserHeader) - WiiUHeader = `data:image/png;base64,${req.files.WiiUbrowserHeader[0].buffer.toString('base64')}`; - else - WiiUHeader = community.WiiU_browser_header; - JSON.parse(JSON.stringify(req.files)); - const document = { - name: req.body.name, - description: req.body.description, - parent: req.body.parent, - type: req.body.type, - empathy_count: 0, - id: snowflake.nextId(), - has_shop_page: req.body.has_shop_page, - platform_id: req.body.platform_ID, - icon: req.body.icon, - created_at: moment(new Date()), - title_ids: req.body.title_ids, - title_id: req.body.title_ids, - community_id: snowflake.nextId(), - is_recommended: req.body.is_recommended, - browser_icon: browserIcon, - browser_thumbnail: thumb, - CTR_browser_header: CTRHeader, - WiiU_browser_header: WiiUHeader, - }; - const newCommunity = new COMMUNITY(document); - newCommunity.save(); - res.sendStatus(200); - logger.audit('[' + user.user_id + ' - ' + user.pid + '] created community ' + newCommunity.name); - } - else - throw new Error('Invalid account ID or password'); - - }).catch(error => - { - res.statusCode = 400; - let response = { - error_code: 400, - message: error.message - }; - res.send(response); - }); -}); - -router.post('/discovery/update', upload.none(), function (req, res) { - database.connect().then(async e => { - if(req.cookies.token === null) - throw new Error('No service token supplied'); - - let pid = util.data.processServiceToken(req.cookies.token); - - if(pid === null) - throw new Error('Invalid credentials supplied'); - - let user = await database.getUserByPID(pid); - - if(user !== null) - { - if(config.authorized_PNIDs.indexOf(user.pid) === -1) - throw new Error('Invalid credentials supplied'); - let endpoint = await database.getServerConfig(); - endpoint.has_error = req.body.has_error; - endpoint.save(); - res.send(endpoint); - } - else - throw new Error('Invalid account ID or password'); - - }).catch(error => - { - res.statusCode = 400; - let response = { - error_code: 400, - message: error.message - }; - res.send(response); - }); -}); - -router.get('/users/all', function (req, res) { - database.connect().then(async e => { - if(req.cookies.token === null) - throw new Error('No service token supplied'); - - let pid = util.data.processServiceToken(req.cookies.token); - - if(pid === null) - throw new Error('Invalid credentials supplied'); - - let user = await database.getUserByPID(pid); - - if(user !== null) - { - if(config.authorized_PNIDs.indexOf(user.pid) === -1) - throw new Error('Invalid credentials supplied'); - - res.send(await database.getUsers(-1)) - } - else - throw new Error('Invalid account ID or password'); - - }).catch(error => - { - res.statusCode = 400; - let response = { - error_code: 400, - message: error.message - }; - res.send(response); - }); -}); - -router.get('/users/loadPosts', function (req, res) { - database.connect().then(async e => { - if(req.cookies.token === null) - throw new Error('No service token supplied'); - - let pid = util.data.processServiceToken(req.cookies.token); - - if(pid === null) - throw new Error('Invalid credentials supplied'); - - let user = await database.getUserByPID(pid); - - if(user !== null) - { - if(config.authorized_PNIDs.indexOf(user.pid) === -1) - throw new Error('Invalid credentials supplied'); - - let post = await database.getPostByID(req.query.postID); - let newPosts = await database.getUserPostsAfterTimestamp(post, 5); - let communityMap = await util.data.getCommunityHash(); - if(newPosts.length > 0) - { - res.render('console/more_posts.ejs', { - communityMap: communityMap, - moment: moment, - user: user, - newPosts: newPosts, - account_server: config.account_server_domain.slice(8), - }); - } - else - { - res.sendStatus(204); - } - } - else - throw new Error('Invalid account ID or password'); - }).catch(error => { - console.log(error); - res.set("Content-Type", "application/xml"); - res.statusCode = 400; - response = { - result: { - has_error: 1, - version: 1, - code: 400, - error_code: 15, - message: "SERVER_ERROR" - } - }; - res.send("\n" + xml(response)); - }); -}); - -router.get('/users/:userID', function (req, res) { - database.connect().then(async e => { - if(req.cookies.token === null) - throw new Error('No service token supplied'); - - let pid = util.data.processServiceToken(req.cookies.token); - - if(pid === null) - throw new Error('Invalid credentials supplied'); - - let user = await database.getUserByPID(pid); - - if(user !== null) - { - if(config.authorized_PNIDs.indexOf(user.pid) === -1) - throw new Error('Invalid credentials supplied'); - - res.send(await database.getUserByPID(req.params.userID)) - } - else - throw new Error('Invalid account ID or password'); - - }).catch(error => - { - res.statusCode = 400; - let response = { - error_code: 400, - message: error.message - }; - res.send(response); - }); -}); - -router.post('/users/:userID/update', upload.none(), function (req, res) { - database.connect().then(async e => { - if(req.cookies.token === null) - throw new Error('No service token supplied'); - - let pid = util.data.processServiceToken(req.cookies.token); - - if(pid === null) - throw new Error('Invalid credentials supplied'); - - let parentUser = await database.getUserByPID(pid); - let user = await database.getUserByPID(req.params.userID); - - if(user !== null) - { - if(config.authorized_PNIDs.indexOf(parentUser.pid) === -1) - throw new Error('Invalid credentials supplied'); - user.account_status = req.body.account_status; - user.ban_reason = req.body.ban_reason; - user.ban_lift_date = moment(req.body.ban_date); - user.save(); - res.sendStatus(200); - util.data.refreshCache(); - logger.audit('[' + parentUser.user_id + ' - ' + parentUser.pid + '] banned ' + user.user_id + ' until ' + user.ban_lift_date + ' for ' + user.ban_reason); - } - else - throw new Error('Invalid account ID or password'); - - }).catch(error => - { - res.statusCode = 400; - let response = { - error_code: 400, - message: error.message - }; - res.send(response); - }); -}); - -router.post('/posts/:postID/delete', function (req, res) { - database.connect().then(async e => { - if(req.cookies.token === null) - throw new Error('No service token supplied'); - - let pid = util.data.processServiceToken(req.cookies.token); - - if(pid === null) - throw new Error('Invalid credentials supplied'); - - let user = await database.getUserByPID(pid); - - if(user !== null) - { - if(config.authorized_PNIDs.indexOf(user.pid) === -1) { - logger.audit('[' + user.user_id + ' - ' + user.pid + '] attempted to delete a post and is not authorized'); - throw new Error('Invalid credentials supplied'); - } - - let post = await database.getPostByID(req.params.postID); - if(post !== null) { - post.delete().then(err => function () { - res.send(err); - }); - res.sendStatus(200); - logger.audit('[' + user.user_id + ' - ' + user.pid + '] deleted post by ' + post.screen_name); - } - else - res.sendStatus(404) - } - else - throw new Error('Invalid account ID or password'); - - }).catch(error => - { - res.statusCode = 400; - let response = { - error_code: 400, - message: error.message - }; - res.send(response); - }); -}); - -router.get('/notifications', function (req, res) { - database.connect().then(async e => { - await database.pushNewNotificationToAll('Testing a system wide notification and linking to a post', '/users/me') + community.save(); res.sendStatus(200); - }).catch(error => - { - res.statusCode = 400; - let response = { - error_code: 400, - message: error.message - }; - res.send(response); - }); + util.data.refreshCache(); + logger.audit('[' + user.user_id + ' - ' + user.pid + '] updated community ' + community.name); + } + else + throw new Error('Invalid account ID or password'); }); -router.post('/posts/new', upload.none(), function (req, res) { - database.connect().then(async e => { - if(req.cookies.token === null) - throw new Error('No service token supplied'); +router.post('/communities/new', upload.fields([{name: 'browserIcon', maxCount: 1}, { name: 'CTRbrowserHeader', maxCount: 1}, { name: 'WiiUbrowserHeader', maxCount: 1}]), async function(req, res) { + let user = await database.getUserByPID(req.pid); - let pid = util.data.processServiceToken(req.cookies.token); + if(user !== null) + { + if(config.authorized_PNIDs.indexOf(user.pid) === -1) { + logger.audit('[' + user.user_id + ' - ' + user.pid + '] attempted to create a community and is not authorized'); + throw new Error('Invalid credentials supplied'); + } + JSON.parse(JSON.stringify(req.files)); + let browserIcon, CTRHeader, WiiUHeader, thumb; + if(req.files.browserIcon) { + browserIcon = `data:image/png;base64,${req.files.browserIcon[0].buffer.toString('base64')}`; + thumb = `data:image/png;base64,${req.files.browserIcon[0].buffer.toString('base64')}`; + } + if(req.files.CTRbrowserHeader) + CTRHeader = `data:image/png;base64,${req.files.CTRbrowserHeader[0].buffer.toString('base64')}`; - if(pid === null) + if(req.files.WiiUbrowserHeader) + WiiUHeader = `data:image/png;base64,${req.files.WiiUbrowserHeader[0].buffer.toString('base64')}`; + const document = { + empathy_count: 0, + id: snowflake.nextId(), + has_shop_page: req.body.has_shop_page, + platform_id: req.body.platform_ID, + icon: req.body.icon, + created_at: moment(new Date()), + title_ids: req.body.title_ids, + title_id: req.body.title_ids, + community_id: snowflake.nextId(), + is_recommended: req.body.is_recommended, + name: req.body.name, + browser_icon: `data:image/png;base64,${browserIcon.toString('base64')}`, + CTR_browser_header: `data:image/png;base64,${CTRHeader.toString('base64')}`, + WiiU_browser_header: `data:image/png;base64,${WiiUHeader.toString('base64')}`, + browser_thumbnail: `data:image/png;base64,${thumb.toString('base64')}`, + description: req.body.description, + }; + const newCommunity = new COMMUNITY(document); + newCommunity.save(); + res.sendStatus(200); + logger.audit('[' + user.user_id + ' - ' + user.pid + '] created community ' + newCommunity.name); + } + else + throw new Error('Invalid account ID or password'); +}); + +router.post('/communities/:communityID/sub/new', upload.fields([{name: 'browserIcon', maxCount: 1}, { name: 'CTRbrowserHeader', maxCount: 1}, { name: 'WiiUbrowserHeader', maxCount: 1}]), async function(req, res) { + let user = await database.getUserByPID(req.pid); + + if(user !== null) + { + if(config.authorized_PNIDs.indexOf(user.pid) === -1) { + logger.audit('[' + user.user_id + ' - ' + user.pid + '] attempted to create a community and is not authorized'); + throw new Error('Invalid credentials supplied'); + } + const community = await database.getCommunityByID(req.params.communityID); + let browserIcon, CTRHeader, WiiUHeader, thumb; + if(req.files.browserIcon) { + browserIcon = `data:image/png;base64,${req.files.browserIcon[0].buffer.toString('base64')}`; + } + else { + browserIcon = community.browser_icon; + thumb = community.browser_thumbnail; + } + if(req.files.CTRbrowserHeader) + CTRHeader = `data:image/png;base64,${req.files.CTRbrowserHeader[0].buffer.toString('base64')}`; + else + CTRHeader = community.CTR_browser_header; + if(req.files.WiiUbrowserHeader) + WiiUHeader = `data:image/png;base64,${req.files.WiiUbrowserHeader[0].buffer.toString('base64')}`; + else + WiiUHeader = community.WiiU_browser_header; + JSON.parse(JSON.stringify(req.files)); + const document = { + name: req.body.name, + description: req.body.description, + parent: req.body.parent, + type: req.body.type, + empathy_count: 0, + id: snowflake.nextId(), + has_shop_page: req.body.has_shop_page, + platform_id: req.body.platform_ID, + icon: req.body.icon, + created_at: moment(new Date()), + title_ids: req.body.title_ids, + title_id: req.body.title_ids, + community_id: snowflake.nextId(), + is_recommended: req.body.is_recommended, + browser_icon: browserIcon, + browser_thumbnail: thumb, + CTR_browser_header: CTRHeader, + WiiU_browser_header: WiiUHeader, + }; + const newCommunity = new COMMUNITY(document); + newCommunity.save(); + res.sendStatus(200); + logger.audit('[' + user.user_id + ' - ' + user.pid + '] created community ' + newCommunity.name); + } + else + throw new Error('Invalid account ID or password'); +}); + +router.post('/discovery/update', upload.none(), async function(req, res) { + let user = await database.getUserByPID(req.pid); + + if(user !== null) + { + if(config.authorized_PNIDs.indexOf(user.pid) === -1) + throw new Error('Invalid credentials supplied'); + let endpoint = await database.getServerConfig(); + endpoint.has_error = req.body.has_error; + endpoint.save(); + res.send(endpoint); + } + else + throw new Error('Invalid account ID or password'); +}); + +router.get('/users/all', async function (req, res) { + let user = await database.getUserByPID(req.pid); + + if(user !== null) + { + if(config.authorized_PNIDs.indexOf(user.pid) === -1) throw new Error('Invalid credentials supplied'); - let user = await database.getUserByPID(pid); + res.send(await database.getUsers(-1)) + } + else + throw new Error('Invalid account ID or password'); +}); - if(user !== null) +router.get('/users/loadPosts', async function (req, res) { + let user = await database.getUserByPID(req.pid); + + if(user !== null) + { + if(config.authorized_PNIDs.indexOf(user.pid) === -1) + throw new Error('Invalid credentials supplied'); + + let post = await database.getPostByID(req.query.postID); + let newPosts = await database.getUserPostsAfterTimestamp(post, 5); + let communityMap = await util.data.getCommunityHash(); + if(newPosts.length > 0) { - if(config.authorized_PNIDs.indexOf(user.pid) === -1) { - logger.audit('[' + user.user_id + ' - ' + user.pid + '] attempted to create a community and is not authorized'); - throw new Error('Invalid credentials supplied'); - } - let community = await database.getCommunityByID(req.body.olive_community_id); - let appData = ""; - if (req.body.app_data) { - appData = req.body.app_data.replace(/\0/g, "").trim(); - } - let painting = "", paintingURI = ""; - if (req.body.painting && req.body.painting !== 'eJztwTEBACAMA7DCNRlIQRbu4ZoEviTJTNvjZNUFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL55fYLL3w==') { - painting = req.body.painting.replace(/\0/g, "").trim(); - paintingURI = await util.data.processPainting(painting); - } - let screenshot = ""; - if (req.body.screenshot) { - screenshot = req.body.screenshot.replace(/\0/g, "").trim(); - } - const document = { - title_id: community.title_id[0], - community_id: community.community_id, - screen_name: user.user_id, - body: req.body.body, - app_data: appData, - painting: painting, - painting_uri: paintingURI, - screenshot: screenshot, - country_id: 49, - created_at: new Date(), - feeling_id: req.body.emotion, - id: snowflake.nextId(), - is_autopost: req.body.is_autopost, - is_spoiler: req.body.is_spoiler, - is_app_jumpable: req.body.is_app_jumpable, - language_id: req.body.language_id, - mii: user.mii, - mii_face_url: user.pfp_uri, - pid: pid, - platform_id: 0, - region_id: 2, - verified: user.official - }; - const newPost = new POST(document); - newPost.save(); - res.sendStatus(200); - logger.audit('[' + user.user_id + ' - ' + user.pid + '] created community ' + newCommunity.name); + res.render('console/more_posts.ejs', { + communityMap: communityMap, + moment: moment, + user: user, + newPosts: newPosts, + account_server: config.account_server_domain.slice(8), + }); } else - throw new Error('Invalid account ID or password'); + { + res.sendStatus(204); + } + } + else + throw new Error('Invalid account ID or password'); +}); - }).catch(error => +router.get('/users/:userID', async function (req, res) { + let user = await database.getUserByPID(req.pid); + + if(user !== null) { - res.statusCode = 400; - let response = { - error_code: 400, - message: error.message + if(config.authorized_PNIDs.indexOf(user.pid) === -1) + throw new Error('Invalid credentials supplied'); + + res.send(await database.getUserByPID(req.params.userID)) + } + else + throw new Error('Invalid account ID or password'); +}); + +router.post('/users/:userID/update', upload.none(), async function(req, res) { + let parentUser = await database.getUserByPID(req.pid); + let user = await database.getUserByPID(req.params.userID); + + if(user !== null) + { + if(config.authorized_PNIDs.indexOf(parentUser.pid) === -1) + throw new Error('Invalid credentials supplied'); + user.account_status = req.body.account_status; + user.ban_reason = req.body.ban_reason; + user.ban_lift_date = moment(req.body.ban_date); + user.save(); + res.sendStatus(200); + util.data.refreshCache(); + logger.audit('[' + parentUser.user_id + ' - ' + parentUser.pid + '] banned ' + user.user_id + ' until ' + user.ban_lift_date + ' for ' + user.ban_reason); + } + else + throw new Error('Invalid account ID or password'); +}); + +router.post('/posts/:postID/delete', async function(req, res) { + let user = await database.getUserByPID(req.pid); + if(user !== null) + { + if(config.authorized_PNIDs.indexOf(user.pid) === -1) { + logger.audit('[' + user.user_id + ' - ' + user.pid + '] attempted to delete a post and is not authorized'); + throw new Error('Invalid credentials supplied'); + } + let post = await database.getPostByID(req.params.postID); + if(post !== null) { + post.delete().then(err => function () { + res.send(err); + }); + res.sendStatus(200); + logger.audit('[' + user.user_id + ' - ' + user.pid + '] deleted post by ' + post.screen_name); + } + else + res.sendStatus(404) + } + else + throw new Error('Invalid account ID or password'); +}); + +router.get('/notifications', async function(req, res) { + await database.pushNewNotificationToAll('Testing a system wide notification and linking to a post', '/users/me') + res.sendStatus(200); +}); + +router.post('/posts/new', upload.none(), async function(req, res) { + let user = await database.getUserByPID(req.pid); + + if(user !== null) + { + if(config.authorized_PNIDs.indexOf(user.pid) === -1) { + logger.audit('[' + user.user_id + ' - ' + user.pid + '] attempted to create a community and is not authorized'); + throw new Error('Invalid credentials supplied'); + } + let community = await database.getCommunityByID(req.body.olive_community_id); + let appData = ""; + if (req.body.app_data) { + appData = req.body.app_data.replace(/\0/g, "").trim(); + } + let painting = "", paintingURI = ""; + if (req.body.painting && req.body.painting !== 'eJztwTEBACAMA7DCNRlIQRbu4ZoEviTJTNvjZNUFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAL55fYLL3w==') { + painting = req.body.painting.replace(/\0/g, "").trim(); + paintingURI = await util.data.processPainting(painting); + } + let screenshot = ""; + if (req.body.screenshot) { + screenshot = req.body.screenshot.replace(/\0/g, "").trim(); + } + const document = { + title_id: community.title_id[0], + community_id: community.community_id, + screen_name: user.user_id, + body: req.body.body, + app_data: appData, + painting: painting, + painting_uri: paintingURI, + screenshot: screenshot, + country_id: 49, + created_at: new Date(), + feeling_id: req.body.emotion, + id: snowflake.nextId(), + is_autopost: req.body.is_autopost, + is_spoiler: req.body.is_spoiler, + is_app_jumpable: req.body.is_app_jumpable, + language_id: req.body.language_id, + mii: user.mii, + mii_face_url: user.pfp_uri, + pid: pid, + platform_id: 0, + region_id: 2, + verified: user.official }; - res.send(response); - }); + const newPost = new POST(document); + newPost.save(); + res.sendStatus(200); + logger.audit('[' + user.user_id + ' - ' + user.pid + '] created community ' + newCommunity.name); + } + else + throw new Error('Invalid account ID or password'); }); module.exports = router; \ No newline at end of file diff --git a/src/services/juxt-web/routes/admin/home.js b/src/services/juxt-web/routes/admin/home.js index 1feb8fa..3901873 100644 --- a/src/services/juxt-web/routes/admin/home.js +++ b/src/services/juxt-web/routes/admin/home.js @@ -11,45 +11,13 @@ var multer = require('multer'); var upload = multer({ dest: 'uploads/' }); var router = express.Router(); -var cookieParser = require('cookie-parser'); -router.use(cookieParser()); - -router.get('/', upload.none(), function (req, res) { - - database.connect().then(async e => { - if(req.cookies.token === null) - { - res.redirect('/login'); - return; - } - let pid = util.data.processServiceToken(req.cookies.token); - if(pid === null) - { - res.redirect('/login'); - return; - } - let user = await database.getUserByPID(pid); - res.render('admin/admin_home.ejs', { - user: user, - account_server: config.account_server_domain.slice(8) - }); - - }).catch(error => { - console.log(error); - res.set("Content-Type", "application/xml"); - res.statusCode = 400; - response = { - result: { - has_error: 1, - version: 1, - code: 400, - error_code: 15, - message: "SERVER_ERROR" - } - }; - res.send("\n" + xml(response)); +router.get('/', upload.none(), async function (req, res) { + console.log(req.cookies.token) + let user = await database.getUserByPID(req.pid); + res.render('admin/admin_home.ejs', { + user: user, + account_server: config.account_server_domain.slice(8) }); - }); router.get('/css/juxt.css', function (req, res) { @@ -60,633 +28,215 @@ router.get('/favicon.ico', function (req, res) { res.sendFile('css/favicon.ico', {root: path.join(__dirname, '../../../../webfiles/console/')}); }); -router.get('/icons/:image_id.png', function (req, res) { - database.connect().then(async e => { - let community = await database.getCommunityByID(req.params.image_id.toString()); - if(community !== null) { - if(community.browser_icon.indexOf('data:image/png;base64,') !== -1) - res.send(Buffer.from(community.browser_icon.replace('data:image/png;base64,',''), 'base64')); +router.get('/icons/:image_id.png', async function (req, res) { + let community = await database.getCommunityByID(req.params.image_id.toString()); + if(community !== null) { + if(community.browser_icon.indexOf('data:image/png;base64,') !== -1) + res.send(Buffer.from(community.browser_icon.replace('data:image/png;base64,',''), 'base64')); + else + res.send(Buffer.from(community.browser_icon, 'base64')); + } + else { + let user = await database.getUserByPID(req.params.image_id.toString()); + if(user !== null) + if(user.pfp_uri.indexOf('data:image/png;base64,') !== -1) + res.send(Buffer.from(user.pfp_uri.replace('data:image/png;base64,',''), 'base64')); else - res.send(Buffer.from(community.browser_icon, 'base64')); - } - else { - let user = await database.getUserByPID(req.params.image_id.toString()); - if(user !== null) - if(user.pfp_uri.indexOf('data:image/png;base64,') !== -1) - res.send(Buffer.from(user.pfp_uri.replace('data:image/png;base64,',''), 'base64')); - else - res.send(Buffer.from(user.pfp_uri, 'base64')); - else - res.sendStatus(404); - } - }).catch(error => { - console.error(error); - res.sendStatus(404) - }); -}); - -router.get('/banner/:image_id.png', function (req, res) { - database.connect().then(async e => { - let community = await database.getCommunityByID(req.params.image_id.toString()); - if(community !== null) - if(community.WiiU_browser_header.indexOf('data:image/png;base64,') !== -1) - res.send(Buffer.from(community.WiiU_browser_header.replace('data:image/png;base64,',''), 'base64')); - else - res.send(Buffer.from(community.WiiU_browser_header, 'base64')); + res.send(Buffer.from(user.pfp_uri, 'base64')); else res.sendStatus(404); - }).catch(error => { - console.error(error); - res.sendStatus(404) + } +}); + +router.get('/banner/:image_id.png', async function (req, res) { + let community = await database.getCommunityByID(req.params.image_id.toString()); + if(community !== null) + if(community.WiiU_browser_header.indexOf('data:image/png;base64,') !== -1) + res.send(Buffer.from(community.WiiU_browser_header.replace('data:image/png;base64,',''), 'base64')); + else + res.send(Buffer.from(community.WiiU_browser_header, 'base64')); + else + res.sendStatus(404); +}); + +router.get('/discovery', upload.none(), async function (req, res) { + let user = await database.getUserByPID(req.pid); + res.render('admin/admin_discovery.ejs', { + user: user, + account_server: config.account_server_domain.slice(8), }); }); -router.get('/discovery', upload.none(), function (req, res) { +router.get('/communities', upload.none(), async function (req, res) { + let user = await database.getUserByPID(req.pid); + let communities = await database.getCommunities(100) - database.connect().then(async e => { - if(req.cookies.token === null) - { - res.redirect('/login'); - return; - } - let pid = util.data.processServiceToken(req.cookies.token); - if(pid === null) - { - res.redirect('/login'); - return; - } - let user = await database.getUserByPID(pid); - res.render('admin/admin_discovery.ejs', { - user: user, - account_server: config.account_server_domain.slice(8), - }); - - }).catch(error => { - console.log(error); - res.set("Content-Type", "application/xml"); - res.statusCode = 400; - response = { - result: { - has_error: 1, - version: 1, - code: 400, - error_code: 15, - message: "SERVER_ERROR" - } - }; - res.send("\n" + xml(response)); + res.render('admin/admin_communities.ejs', { + user: user, + account_server: config.account_server_domain.slice(8), + communities: communities, + moment: moment, }); - }); -router.get('/communities', upload.none(), function (req, res) { - - database.connect().then(async e => { - if(req.cookies.token === null) - { - res.redirect('/login'); - return; - } - let pid = util.data.processServiceToken(req.cookies.token); - if(pid === null) - { - res.redirect('/login'); - return; - } - let user = await database.getUserByPID(pid); - let communities = await database.getCommunities(100) - - res.render('admin/admin_communities.ejs', { - user: user, - account_server: config.account_server_domain.slice(8), - communities: communities, - moment: moment, - }); - - }).catch(error => { - console.log(error); - res.set("Content-Type", "application/xml"); - res.statusCode = 400; - response = { - result: { - has_error: 1, - version: 1, - code: 400, - error_code: 15, - message: "SERVER_ERROR" - } - }; - res.send("\n" + xml(response)); +router.get('/audit', upload.none(), async function (req, res) { + let user = await database.getUserByPID(req.pid); + res.render('admin/admin_audit.ejs', { + user: user, + account_server: config.account_server_domain.slice(8), }); - }); -router.get('/audit', upload.none(), function (req, res) { +router.get('/announcements', upload.none(), async function (req, res) { + let user = await database.getUserByPID(req.pid); + let community = await database.getCommunityByID('announcements'); + let newPosts = await database.getNewPostsByCommunity(community, 100); + let totalNumPosts = await database.getTotalPostsByCommunity(community); - database.connect().then(async e => { - if(req.cookies.token === null) - { - res.redirect('/login'); - return; - } - - let pid = util.data.processServiceToken(req.cookies.token); - if(pid === null) - { - res.redirect('/login'); - return; - } - let user = await database.getUserByPID(pid); - res.render('admin/admin_audit.ejs', { - user: user, - account_server: config.account_server_domain.slice(8), - }); - - }).catch(error => { - console.log(error); - res.set("Content-Type", "application/xml"); - res.statusCode = 400; - response = { - result: { - has_error: 1, - version: 1, - code: 400, - error_code: 15, - message: "SERVER_ERROR" - } - }; - res.send("\n" + xml(response)); + res.render('admin/admin_announcements.ejs', { + community: community, + newPosts: newPosts, + totalNumPosts: totalNumPosts, + user: user, + account_server: config.account_server_domain.slice(8), }); - }); -router.get('/announcements', upload.none(), function (req, res) { - - database.connect().then(async e => { - if(req.cookies.token === null) - { - res.redirect('/login'); - return; - } - let pid = util.data.processServiceToken(req.cookies.token); - if(pid === null) - { - res.redirect('/login'); - return; - } - let user = await database.getUserByPID(pid); - let community = await database.getCommunityByID('announcements'); - let newPosts = await database.getNewPostsByCommunity(community, 100); - let totalNumPosts = await database.getTotalPostsByCommunity(community); - - res.render('admin/admin_announcements.ejs', { - community: community, - newPosts: newPosts, - totalNumPosts: totalNumPosts, - user: user, - account_server: config.account_server_domain.slice(8), - }); - - }).catch(error => { - console.log(error); - res.set("Content-Type", "application/xml"); - res.statusCode = 400; - response = { - result: { - has_error: 1, - version: 1, - code: 400, - error_code: 15, - message: "SERVER_ERROR" - } - }; - res.send("\n" + xml(response)); - }); - -}); - -router.get('/communities/new', upload.none(), function (req, res) { +router.get('/communities/new', upload.none(), async function (req, res) { var communityID = req.query.CID; - database.connect().then(async e => { - if(req.cookies.token === null) - { - res.redirect('/login'); - return; - } - let pid = util.data.processServiceToken(req.cookies.token); - if(pid === null) - { - res.redirect('/login'); - return; - } - let user = await database.getUserByPID(pid); - res.render('admin/admin_new_community.ejs', { - user: user, - account_server: config.account_server_domain.slice(8), - communityID: communityID - }); - - }).catch(error => { - console.log(error); - res.set("Content-Type", "application/xml"); - res.statusCode = 400; - response = { - result: { - has_error: 1, - version: 1, - code: 400, - error_code: 15, - message: "SERVER_ERROR" - } - }; - res.send("\n" + xml(response)); + let user = await database.getUserByPID(req.pid); + res.render('admin/admin_new_community.ejs', { + user: user, + account_server: config.account_server_domain.slice(8), + communityID: communityID }); }); -router.get('/communities/:communityID', upload.none(), function (req, res) { +router.get('/communities/:communityID', upload.none(), async function (req, res) { + let user = await database.getUserByPID(req.pid); + let community = await database.getCommunityByID(req.params.communityID.toString()); + let newPosts = await database.getNewPostsByCommunity(community, 100); + let totalNumPosts = await database.getTotalPostsByCommunity(community); - database.connect().then(async e => { - if(req.cookies.token === null) - { - res.redirect('/login'); - return; - } - let pid = util.data.processServiceToken(req.cookies.token); - if(pid === null) - { - res.redirect('/login'); - return; - } - let user = await database.getUserByPID(pid); - let community = await database.getCommunityByID(req.params.communityID.toString()); - let newPosts = await database.getNewPostsByCommunity(community, 100); - let totalNumPosts = await database.getTotalPostsByCommunity(community); - - res.render('admin/admin_community.ejs', { - community: community, - newPosts: newPosts, - totalNumPosts: totalNumPosts, - user: user, - account_server: config.account_server_domain.slice(8), - }); - - }).catch(error => { - console.log(error); - res.set("Content-Type", "application/xml"); - res.statusCode = 400; - response = { - result: { - has_error: 1, - version: 1, - code: 400, - error_code: 15, - message: "SERVER_ERROR" - } - }; - res.send("\n" + xml(response)); - }); - -}); - -router.get('/communities/:communityID/edit', upload.none(), function (req, res) { - database.connect().then(async e => { - if(req.cookies.token === null) - { - res.redirect('/login'); - return; - } - let pid = util.data.processServiceToken(req.cookies.token); - if(pid === null) - { - res.redirect('/login'); - return; - } - let user = await database.getUserByPID(pid); - let community = await database.getCommunityByID(req.params.communityID.toString()); - res.render('admin/admin_edit_community.ejs', { - user: user, - account_server: config.account_server_domain.slice(8), - community: community, - }); - - }).catch(error => { - console.log(error); - res.set("Content-Type", "application/xml"); - res.statusCode = 400; - response = { - result: { - has_error: 1, - version: 1, - code: 400, - error_code: 15, - message: "SERVER_ERROR" - } - }; - res.send("\n" + xml(response)); + res.render('admin/admin_community.ejs', { + community: community, + newPosts: newPosts, + totalNumPosts: totalNumPosts, + user: user, + account_server: config.account_server_domain.slice(8), }); }); -router.get('/communities/:communityID/sub', upload.none(), function (req, res) { - - database.connect().then(async e => { - if(req.cookies.token === null) - { - res.redirect('/login'); - return; - } - let pid = util.data.processServiceToken(req.cookies.token); - if(pid === null) - { - res.redirect('/login'); - return; - } - let user = await database.getUserByPID(pid); - let communities = await database.getSubCommunities(req.params.communityID.toString()); - - res.render('admin/admin_sub_communities.ejs', { - user: user, - account_server: config.account_server_domain.slice(8), - communities: communities, - moment: moment, - communityID: req.params.communityID.toString() - }); - - }).catch(error => { - console.log(error); - res.set("Content-Type", "application/xml"); - res.statusCode = 400; - response = { - result: { - has_error: 1, - version: 1, - code: 400, - error_code: 15, - message: "SERVER_ERROR" - } - }; - res.send("\n" + xml(response)); - }); - -}); - -router.get('/communities/:communityID/sub/new', upload.none(), function (req, res) { - database.connect().then(async e => { - if(req.cookies.token === null) - { - res.redirect('/login'); - return; - } - let pid = util.data.processServiceToken(req.cookies.token); - if(pid === null) - { - res.redirect('/login'); - return; - } - let user = await database.getUserByPID(pid); - let community = await database.getCommunityByID(req.params.communityID.toString()); - res.render('admin/admin_edit_sub_community.ejs', { - user: user, - account_server: config.account_server_domain.slice(8), - community: community, - }); - - }).catch(error => { - console.log(error); - res.set("Content-Type", "application/xml"); - res.statusCode = 400; - response = { - result: { - has_error: 1, - version: 1, - code: 400, - error_code: 15, - message: "SERVER_ERROR" - } - }; - res.send("\n" + xml(response)); +router.get('/communities/:communityID/edit', upload.none(), async function (req, res) { + let user = await database.getUserByPID(req.pid); + let community = await database.getCommunityByID(req.params.communityID.toString()); + res.render('admin/admin_edit_community.ejs', { + user: user, + account_server: config.account_server_domain.slice(8), + community: community, }); }); -router.get('/users', upload.none(), function (req, res) { +router.get('/communities/:communityID/sub', upload.none(), async function (req, res) { + let user = await database.getUserByPID(req.pid); + let communities = await database.getSubCommunities(req.params.communityID.toString()); - database.connect().then(async e => { - if(req.cookies.token === null) - { - res.redirect('/login'); - return; - } - let pid = util.data.processServiceToken(req.cookies.token); - if(pid === null) - { - res.redirect('/login'); - return; - } - let user = await database.getUserByPID(pid); - let users = await database.getUsers(100); - res.render('admin/admin_users.ejs', { - user: user, - account_server: config.account_server_domain.slice(8), - users: users, - moment: moment - }); - - }).catch(error => { - console.log(error); - res.set("Content-Type", "application/xml"); - res.statusCode = 400; - response = { - result: { - has_error: 1, - version: 1, - code: 400, - error_code: 15, - message: "SERVER_ERROR" - } - }; - res.send("\n" + xml(response)); + res.render('admin/admin_sub_communities.ejs', { + user: user, + account_server: config.account_server_domain.slice(8), + communities: communities, + moment: moment, + communityID: req.params.communityID.toString() }); - }); -router.get('/users/:userID', upload.none(), function (req, res) { - - database.connect().then(async e => { - if(req.cookies.token === null) - { - res.redirect('/login'); - return; - } - - let pid = util.data.processServiceToken(req.cookies.token); - if(pid === null) - { - res.redirect('/login'); - return; - } - let user = await database.getUserByPID(req.params.userID); - let parentUser = await database.getUserByPID(pid) - if(user === null) - res.sendStatus(404); - let newPosts = await database.getNumberUserPostsByID(req.params.userID, 50); - let numPosts = await database.getTotalPostsByUserID(req.params.userID); - let communityMap = await util.data.getCommunityHash(); - - res.render('admin/admin_user.ejs', { - communityMap: communityMap, - moment: moment, - parentUser: parentUser, - user: user, - account_server: config.account_server_domain.slice(8), - newPosts: newPosts, - numPosts: numPosts, - }); - - }).catch(error => { - console.log(error); - res.set("Content-Type", "application/xml"); - res.statusCode = 400; - response = { - result: { - has_error: 1, - version: 1, - code: 400, - error_code: 15, - message: "SERVER_ERROR" - } - }; - res.send("\n" + xml(response)); +router.get('/communities/:communityID/sub/new', upload.none(), async function (req, res) { + let user = await database.getUserByPID(req.pid); + let community = await database.getCommunityByID(req.params.communityID.toString()); + res.render('admin/admin_edit_sub_community.ejs', { + user: user, + account_server: config.account_server_domain.slice(8), + community: community, }); - }); -router.get('/users/:userID/edit', upload.none(), function (req, res) { - - database.connect().then(async e => { - if(req.cookies.token === null) - { - res.redirect('/login'); - return; - } - - let pid = util.data.processServiceToken(req.cookies.token); - if(pid === null) - { - res.redirect('/login'); - return; - } - let user = await database.getUserByPID(req.params.userID); - let parentUser = await database.getUserByPID(pid) - if(user === null) - res.sendStatus(404); - let newPosts = await database.getNumberUserPostsByID(req.params.userID, 50); - let numPosts = await database.getTotalPostsByUserID(req.params.userID); - - res.render('admin/admin_edit_user.ejs', { - moment: moment, - parentUser: parentUser, - user: user, - account_server: config.account_server_domain.slice(8), - newPosts: newPosts, - numPosts: numPosts, - }); - - }).catch(error => { - console.log(error); - res.set("Content-Type", "application/xml"); - res.statusCode = 400; - response = { - result: { - has_error: 1, - version: 1, - code: 400, - error_code: 15, - message: "SERVER_ERROR" - } - }; - res.send("\n" + xml(response)); +router.get('/users', upload.none(), async function (req, res) { + let user = await database.getUserByPID(req.pid); + let users = await database.getUsers(100); + res.render('admin/admin_users.ejs', { + user: user, + account_server: config.account_server_domain.slice(8), + users: users, + moment: moment }); - }); -router.get('/posts/new', upload.none(), function (req, res) { +router.get('/users/:userID', upload.none(), async function (req, res) { + let user = await database.getUserByPID(req.params.userID); + let parentUser = await database.getUserByPID(req.pid) + if(user === null) + res.sendStatus(404); + let newPosts = await database.getNumberUserPostsByID(req.params.userID, 50); + let numPosts = await database.getTotalPostsByUserID(req.params.userID); + let communityMap = await util.data.getCommunityHash(); - database.connect().then(async e => { - if(req.cookies.token === null) - { - res.redirect('/login'); - return; - } - let pid = util.data.processServiceToken(req.cookies.token); - if(pid === null) - { - res.redirect('/login'); - return; - } - let user = await database.getUserByPID(pid); - let community = await database.getCommunityByID('announcements'); - - res.render('admin/admin_new_post.ejs', { - community: community, - user: user, - account_server: config.account_server_domain.slice(8), - }); - - }).catch(error => { - console.log(error); - res.set("Content-Type", "application/xml"); - res.statusCode = 400; - response = { - result: { - has_error: 1, - version: 1, - code: 400, - error_code: 15, - message: "SERVER_ERROR" - } - }; - res.send("\n" + xml(response)); + res.render('admin/admin_user.ejs', { + communityMap: communityMap, + moment: moment, + parentUser: parentUser, + user: user, + account_server: config.account_server_domain.slice(8), + newPosts: newPosts, + numPosts: numPosts, }); - }); -router.get('/login', upload.none(), function (req, res) { +router.get('/users/:userID/edit', upload.none(), async function (req, res) { + let user = await database.getUserByPID(req.params.userID); + let parentUser = await database.getUserByPID(req.pid) + if(user === null) + res.sendStatus(404); + let newPosts = await database.getNumberUserPostsByID(req.params.userID, 50); + let numPosts = await database.getTotalPostsByUserID(req.params.userID); - database.connect().then(async e => { - if(req.cookies.token === null) - { - res.render('admin_login.ejs', {}); - return; - } - let pid = util.data.processServiceToken(req.cookies.token); - if(pid === null) - { - res.render('admin/admin_login.ejs', {}); - return; - } - let user = await database.getUserByPID(pid); + res.render('admin/admin_edit_user.ejs', { + moment: moment, + parentUser: parentUser, + user: user, + account_server: config.account_server_domain.slice(8), + newPosts: newPosts, + numPosts: numPosts, + }); +}); + +router.get('/posts/new', upload.none(), async function (req, res) { + let user = await database.getUserByPID(req.pid); + let community = await database.getCommunityByID('announcements'); + + res.render('admin/admin_new_post.ejs', { + community: community, + user: user, + account_server: config.account_server_domain.slice(8), + }); +}); + +router.get('/login', upload.none(), async function (req, res) { + if(req.cookies.token === undefined) + { + return res.render('admin/admin_login.ejs', {}); + } + else res.redirect('/'); - - }).catch(error => { - console.log(error); - res.set("Content-Type", "application/xml"); - res.statusCode = 400; - response = { - result: { - has_error: 1, - version: 1, - code: 400, - error_code: 15, - message: "SERVER_ERROR" - } - }; - res.send("\n" + xml(response)); - }); - }); -router.get('/token', upload.none(), function (req, res) { +router.get('/token', upload.none(), async function (req, res) { + let port; + if(req.hostname.includes('miiverse')) + port = 'http://' + else + port = 'https://' request.get({ - url: "http://" + config.account_server_domain + "/v1/api/provider/service_token/@me", + url: port + config.account_server_domain + "/v1/api/provider/service_token/@me", headers: { 'X-Nintendo-Client-ID': config["X-Nintendo-Client-ID"], 'X-Nintendo-Client-Secret': config["X-Nintendo-Client-Secret"], @@ -710,62 +260,52 @@ router.get('/token', upload.none(), function (req, res) { }); }); -router.post('/login', upload.none(), function (req, res) { - database.connect().then(async e => { - let user_id = req.body.user_id; - let user = await database.getUserByUsername(user_id); - let password = req.body.password; - if(user !== null && password !== null) - { - if(config.authorized_PNIDs.indexOf(user.pid) === -1) { - logger.audit('[' + user.user_id + ' - ' + user.pid + '] is not authorized to access the application'); - throw new Error('User is not authorized to access the application'); - } - - let password_hash = await util.data.nintendoPasswordHash(password, user.pid); - await request.post({ - url: "https://" + config.account_server_domain + "/v1/api/oauth20/access_token/generate", - headers: { - 'X-Nintendo-Client-ID': config["X-Nintendo-Client-ID"], - 'X-Nintendo-Client-Secret': config["X-Nintendo-Client-Secret"], - 'X-Nintendo-Title-ID': '0005001010040100' - }, - form: { - user_id: user_id, - password_type: 'hash', - password: password_hash, - grant_type: 'password' - } - }, function (error, response, body) { - if (!error && response.statusCode === 200) { - logger.audit('[' + user.user_id + ' - ' + user.pid + '] signed into the application'); - res.send(body); - } - else - { - console.log(body) - res.statusCode = 403; - let response = { - error_code: 403, - message: 'Invalid account ID or password' - }; - res.send(response); - } - - }); +router.post('/login', upload.none(), async function (req, res) { + let port; + if(req.hostname.includes('miiverse')) + port = 'http://' + else + port = 'https://' + let user_id = req.body.user_id; + let user = await database.getUserByUsername(user_id); + let password = req.body.password; + if(user !== null && password !== null) { + if(config.authorized_PNIDs.indexOf(user.pid) === -1) { + logger.audit('[' + user.user_id + ' - ' + user.pid + '] is not authorized to access the application'); + throw new Error('User is not authorized to access the application'); } - else - throw new Error('Invalid account ID or password'); - - }).catch(error => - { - res.statusCode = 504; - let response = { - error_code: 504, - message: error.message - }; - res.send(response); - }); + let password_hash = await util.data.nintendoPasswordHash(password, user.pid); + await request.post({ + url: port + config.account_server_domain + "/v1/api/oauth20/access_token/generate", + headers: { + 'X-Nintendo-Client-ID': config["X-Nintendo-Client-ID"], + 'X-Nintendo-Client-Secret': config["X-Nintendo-Client-Secret"], + 'X-Nintendo-Title-ID': '0005001010040100' + }, + form: { + user_id: user_id, + password_type: 'hash', + password: password_hash, + grant_type: 'password' + } + }, function (error, response, body) { + if (!error && response.statusCode === 200) { + logger.audit('[' + user.user_id + ' - ' + user.pid + '] signed into the application'); + res.send(body); + } + else { + console.log(body) + res.statusCode = 403; + let response = { + error_code: 403, + message: 'Invalid account ID or password' + }; + res.send(response); + } + }); + } + else + throw new Error('Invalid account ID or password'); }); module.exports = router; diff --git a/src/services/juxt-web/routes/console/posts.js b/src/services/juxt-web/routes/console/posts.js index 71c72d7..df59ccc 100644 --- a/src/services/juxt-web/routes/console/posts.js +++ b/src/services/juxt-web/routes/console/posts.js @@ -52,11 +52,15 @@ router.get('/:post_id', async function (req, res) { router.post('/:post_id/new', upload.none(), async function (req, res, next) { let user = await database.getUserByPID(req.pid); - if(user.account_status !== 0) { + if(user.account_status !== 0 || req.body.olive_community_id === 'announcements') { throw new Error('User not allowed to post') } let parentPost = await database.getPostByID(req.params.post_id.toString()) let community = await database.getCommunityByID(req.body.olive_community_id); + if(req.body.body === '' && req.body.painting === '' && req.body.screenshot === '') { + res.status(422); + return res.redirect('/posts/' + req.params.post_id.toString()); + } let appData = ""; if (req.body.app_data) { appData = req.body.app_data.replace(/\0/g, "").trim(); @@ -99,7 +103,8 @@ router.post('/:post_id/new', upload.none(), async function (req, res, next) { }; const newPost = new POST(document); newPost.save(); - await database.pushNewNotificationByPID(parentPost.pid, user.user_id + ' replied to your post!', '/posts/' + parentPost.id) + if(parentPost.pid !== user.pid) + await database.pushNewNotificationByPID(parentPost.pid, user.user_id + ' replied to your post!', '/posts/' + parentPost.id) res.redirect('/posts/' + req.params.post_id.toString()); }); @@ -109,6 +114,10 @@ router.post('/new', upload.none(), async function (req, res, next) { throw new Error('User not allowed to post') } let community = await database.getCommunityByID(req.body.olive_community_id); + if(req.body.body === '' && req.body.painting === '' && req.body.screenshot === '') { + res.status(422); + return res.redirect('/communities/' + community.community_id + '/new'); + } let appData = ""; if (req.body.app_data) { appData = req.body.app_data.replace(/\0/g, "").trim(); diff --git a/src/services/juxt-web/routes/console/show.js b/src/services/juxt-web/routes/console/show.js index 217b7e7..bbf7bf6 100644 --- a/src/services/juxt-web/routes/console/show.js +++ b/src/services/juxt-web/routes/console/show.js @@ -7,7 +7,6 @@ var moment = require('moment'); var router = express.Router(); router.get('/', async function (req, res) { - console.log(req.pid); try { if(req.pid === 1000000000) { res.render(req.directory + '/guest_notice.ejs', { diff --git a/src/services/juxt-web/routes/console/userpage.js b/src/services/juxt-web/routes/console/userpage.js index c97efbc..95cb103 100644 --- a/src/services/juxt-web/routes/console/userpage.js +++ b/src/services/juxt-web/routes/console/userpage.js @@ -59,8 +59,8 @@ router.get('/show', async function (req, res) { let user = await database.getUserByPID(userID); if(user === null) res.sendStatus(404); - if(user.pid === parentUser.pid) - res + if(parentUser === user) + res.redirect('/users/me'); let newPosts = await database.getNumberUserPostsByID(user.pid, 10); let numPosts = await database.getTotalPostsByUserID(user.pid); let communityMap = await util.data.getCommunityHash(); diff --git a/src/services/juxt-web/routes/console/web.js b/src/services/juxt-web/routes/console/web.js index 9d670ce..ee82ffc 100644 --- a/src/services/juxt-web/routes/console/web.js +++ b/src/services/juxt-web/routes/console/web.js @@ -111,6 +111,78 @@ router.get('/notifications.json', async function (req, res) { { message_count: 0, notification_count: user.notification_list.filter(notification => notification.read === false).length, + "messages": [ + { + "screen_name": "JayDaBirb", + "mii_face_url": "http://mii-images.account.pretendo.cc/", + "is_official": true, + "is_read": false, + "created_at": "2020-04-29 01:04:80", + "feeling_id": 1, + "id": 1255383017044709400, + "message_content": "https://invite.gg/pretendo" + }, + { + "screen_name": "PNID_Test06", + "mii_face_url": "http://mii-images.account.pretendo.cc/", + "is_official": false, + "is_read": true, + "created_at": "2020-05-18 02:17:50", + "feeling_id": 1, + "id": 1244384456055709400, + "message_content": "Testing message number 2 updated" + }, + { + "screen_name": "PNID_Test14", + "mii_face_url": "http://mii-images.account.pretendo.cc/", + "is_official": false, + "is_read": true, + "created_at": "2020-05-18 02:17:50", + "feeling_id": 1, + "id": 1244384118059519400, + "message_content": "Testing message number 3" + }, + { + "screen_name": "PNID_Test65", + "mii_face_url": "http://mii-images.account.pretendo.cc/", + "is_official": false, + "is_read": true, + "created_at": "2020-05-18 02:17:50", + "feeling_id": 1, + "id": 1244465118055709400, + "message_content": "Did you know our Miiverse fork is called Juxt? pretty cool huh? ;)" + }, + { + "screen_name": "AnotherTestUser", + "mii_face_url": "http://mii-images.account.pretendo.cc/", + "is_official": false, + "is_read": true, + "created_at": "2020-05-18 02:17:50", + "feeling_id": 1, + "id": 1244384118792519400, + "message_content": "Frick frack tic tak" + }, + { + "screen_name": "WowAnotherUserHuh", + "mii_face_url": "http://mii-images.account.pretendo.cc/", + "is_official": false, + "is_read": true, + "created_at": "2020-05-18 02:17:50", + "feeling_id": 1, + "id": 1244384648059589400, + "message_content": "Hey kid want some meme?" + }, + { + "screen_name": "OkayLastOneIPromise", + "mii_face_url": "http://mii-images.account.pretendo.cc/", + "is_official": false, + "is_read": true, + "created_at": "2020-05-18 02:17:50", + "feeling_id": 1, + "id": 1244386594569545800, + "message_content": "I promise this is the last time I'll ask for mod pls I'm sorry" + } + ], } ) } diff --git a/src/webfiles/portal/communities.ejs b/src/webfiles/portal/communities.ejs index 5bbf52f..c6ea415 100644 --- a/src/webfiles/portal/communities.ejs +++ b/src/webfiles/portal/communities.ejs @@ -31,7 +31,7 @@