Added check to bypass auth for the cdn

This commit is contained in:
CaramelKat
2021-09-19 18:15:10 -05:00
committed by jay.poff@outlook.com
parent 11be7687d5
commit 9fb074bf3d
13 changed files with 747 additions and 1327 deletions

View File

@@ -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();
}
}
}
}

View File

@@ -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 = {

View File

@@ -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);

View File

@@ -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("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\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;

View File

@@ -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("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\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("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\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("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\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("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\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("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\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("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\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("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\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("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\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("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\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("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\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("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\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("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\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("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\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("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\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("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\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;

View File

@@ -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();

View File

@@ -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', {

View File

@@ -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();

View File

@@ -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"
}
],
}
)
}

View File

@@ -31,7 +31,7 @@
</td>
<td>
<div data-pjax="/communities/all">
<button class="outlined-button" style=" margin-top: -35px; right: 60px; position: absolute;"><%= lang.all_communities.show_all %></button>
<button class="outlined-button" style=" margin-top: -25px; right: 50px; position: absolute;"><%= lang.all_communities.show_all %></button>
</div>
</td>
</tr>

View File

@@ -75,9 +75,9 @@
<div class="post-screenshot-picker" onclick="loadScreenshots()">
<div class="post-screenshot-picker-icon"></div>
<div class="post-screenshot-picker-dropdown">
<div><img src="" class="post-screenshot-preview" id="post-top-screen-preview" onclick="document.getElementById('screenshot-value').value = wiiuMainApplication.getScreenShot(true);"></div>
<div><img src="" class="post-screenshot-preview" id="post-bottom-screen-preview" onclick="document.getElementById('screenshot-value').value = wiiuMainApplication.getScreenShot(false);"></div>
<div onclick="document.getElementById('screenshot-value').value = ''; loadScreenshots()">No Screenshot</div>
<div><img src="" class="post-screenshot-preview" id="post-top-screen-preview" onclick="selectScreenshot(1)"></div>
<div><img src="" class="post-screenshot-preview" id="post-bottom-screen-preview" onclick="selectScreenshot(2)"></div>
<div onclick="selectScreenshot(0)">No Screenshot</div>
<input type="hidden" id="screenshot-value" name="screenshot" value="">
</div>
</div>

View File

@@ -215,13 +215,11 @@ ul, ol, menu, li {
.post-wrapper {
text-align: center;
margin-left: auto;
margin-right: auto;
width: 1065px;
background-color: rgba(255,255,255,1);
border: 1.5px solid #d6d2d2;
border-radius: 10px;
margin-bottom: 0;
margin: 40px auto 0;
}
@@ -303,7 +301,7 @@ ul, ol, menu, li {
}
.post-user-info-wrapper {
margin-bottom: 40px;
margin-bottom: 50px;
margin-left: 15px;
min-width: 520px;
}
@@ -834,8 +832,8 @@ td.messages-list-wrapper.end {
border-radius: 10px;
white-space: nowrap;
overflow-x: auto;
box-shadow: 0 3px 15px 0 rgba(0, 0, 0, 0);
-webkit-box-shadow: 0 3px 15px 0 rgba(0, 0, 0, 0);
box-shadow: 0 3px 15px 0 rgba(0, 0, 0, 0.5);
-webkit-box-shadow: 0 3px 15px 0 rgba(0, 0, 0, 0.5);
}
#search-icon {
@@ -887,7 +885,7 @@ td.messages-list-wrapper.end {
vertical-align: bottom;
width: 300px;
margin-left: 30px;
margin-bottom: 130px;
margin-bottom: 110px;
}
h4 {
@@ -1126,7 +1124,7 @@ h4 {
.community-page-post-yeah-button-wrapper {
position: absolute;
right: 148px;
margin-top: -110px;
margin-top: -70px;
margin-bottom: 0;
}
@@ -1160,7 +1158,7 @@ h4 {
color: #673DB6;
margin-left: 440px;
margin-bottom: 0;
margin-top: -94px;
margin-top: -50px;
font-weight: bold;
font-size: large;
position: absolute;
@@ -1177,7 +1175,8 @@ h4 {
}
.community-page-post-user-icon {
width: 90px;
width: 100px;
height: 100px;
border-radius: 10px;
margin-right: 15px;
float: left;
@@ -1188,6 +1187,7 @@ h4 {
.community-page-post-user-icon.verified{
width: 90px;
height: 90px;
margin-right: 15px;
float: left;
border: 5px solid #673DB6;
@@ -1653,7 +1653,7 @@ iframe {
margin-top: -25px;
margin-left: 30px;
background-color: #eee;
width: 527px;
width: 530px;
padding: 20px;
border-radius: 5px;
}
@@ -1764,17 +1764,30 @@ iframe {
position: absolute;
margin-top: 14px;
width: 215px;
height: 293px;
height: 320px;
border: 5px solid #c4bfbf;
border-radius: 10px;
background-color: #eee;
}
.post-screenshot-picker-dropdown > div:last-of-type {
margin-left: 18px;
margin-top: 20px;
height: 32px;
width: 175px;
text-align: center;
border: 3px solid #673DB6;
color: #673DB6;
background: white;
border-radius: 10px;
padding-top: 11px;
}
.post-screenshot-preview {
width: 180px;
height: 100px;
border-radius: 5px;
padding-top: 15px;
padding-top: 20px;
}
.announcements-banner {

View File

@@ -3,6 +3,7 @@ var updateCheck = setInterval(checkForUpdates, 30000);
{
var blankMemo = 'iVBORw0KGgoAAAANSUhEUgAAAUAAAAB4CAQAAAApx+NVAAAAAmJLR0QA/4ePzL8AAAAJcEhZcwAAAEgAAABIAEbJaz4AAAAJdnBBZwAAAUAAAAB4AFsbTy8AAAZ0SURBVHja7Z3pkqUgDIVhqt//lZkf6kURkCUhEM43VX1tF+Q2Z8IWgnXOACDGP+kMgL2BAIEoECAQBQIEokCAQBQIEIgCAQJRIEAgCgQIRIEAgSh/0hkwxhj7OoP5wV0QFqDNnocM9SMoQFt0B0SoGwEBllS49nEEEerFjnXHCsXnCO8GKzJQgG1yggh1M0iAdxnVv/ApQkhQEwME2Cc++nTATDB3QuhEY4PfIEEdMAqQS3zXOUhQA2xTcV40jkF+ufNgJZgs4CWOfisVT8meP2EFV4ehE3K3fVRpueQ1SHBtyKtgLxle+YX3gDUhFaAlrHo997RsxL5CgitD2AbkEN8bd7b8IDsdkFlAevmFbTx763QcR2j/rQ+RBeTvENy9YtD71QOJBRwrv3frD9XxuhAIcETxu4j83mfAenQLkLvrkZ4HsZ/3gPkhagNyyM89hJUXGeXgNxhJ50wIZ+uv1a5BgivRZQHp5dciunBUEH3klZhgXXBadKm5Dpe4E23B9eiogvvsX14srvqJ/LNgVgZbwC8Ruey1EglCfmvBKkBem3WfpOtLCchBLkB+KxU+PcYJAvDQLMCrBWir3KKoXRXA6jR3QvrkRrNIvfx9YFaap+LaC9tGhFRvz1zE5xpWcT065oIpnO49tkA+3g0hNe4HCa4GmUNqz8gd2JfJpuLq3w7WpsMCYlkk6GeqIOWwafvRLMAysdRJCtZ0Pzot4FjJIE6gPgirYAgC1MPeBuRs17mCM6MpGc8EHoFOCF3MGPqU50O7nEV6wa7ibOyO+ILM9eRXtlOKbkjdscpcRo87jan347PJlFbEmu/1K+4RkEQjxP6AdWGD6v6w463Be5OcMjGU/MfyUR00y+ubzipYxibZ37+x1AcLLslhbum9/R1phcUdi7pllhYbf8HYj99TeXDZlXol05hPhzOtEuyuguNVyDjPZ8695MrbtOEzruB5V/gG3VV0hwBbiqeW/FYPY9pRHKk/Oxc7b8g4dXSse7zpuJ3lLrbv9HnFo7Xi9XQJkDdK89VO+mop8eWgLI/ti0pbI3xp6pQQOSPQ/0FqU+QsklRHgsb61aagR3zGkOwTwrUsvLx4eV1jfT5KttoO24z0LUhdLUaSjWrKCobxS7C+06cOdzB6CGZC9G8l6H6tLk3fag7IQvTqxd1644CaTgsYH6eTsn98QoH0uGBxx5KVH71Vhvz46LCAs1S+s+QDtMC8Kg6API0ChPwADU1VMKX8ejsOuryk90M4Sn6u41DnewzWRDQ0R+nuR3XA/q1EkwCpirgvHU0+IfvSNRdMMTdav19I/hnYv7WYYKekHKFnyReQ32qIC/DLsR/VrG5IPKL7oLNasH/r0e0R7Qi8oiGcfSEZhqFwSx/v2g5mYKIQvRDQjpAKsLfD0G4H+RdoAh6IesF0i9Trg1FAeitDsijpTOr85FgF5oHcdEEoQO59e2uWBWEVxyqQtgE5Yzm1pYj54tkhtYBnkr8j+hhZpSlKr1QGpTAI0JivqFatqdWkdH9GVywBXTAJsHVL6lw6rQF9Ib2ZYRMgxWYKPXb0sHqIZzA7jAL8vSJ5xRU/0ZJJSHAFBgjwfFHzkz2V9z2kEEQ4I8MEeHtlxb29TvvPsGrhlgsQpTwCAry9PHmFPlOxeDVUMWwg5XZEPaJHFlrpIk/3CB7uTIlMR4Rr14q4S74sGC2UZnMBfndTnu1ICJSaiRxSJUjvPfI+G3Zh4vPMJRvrAM/2FvDJtTfbsxV4v+aP3Wu2pU5cGB4yZnMBhkUfjhzm7k1tUJbbvOEt4Vh0nL0EuXkVfHDt7OZ+R+Z3piU1l3QDuyQXn6l+j1PqZ2sLWEOdfSrZS7RsJ2Jd+w28gQCLoBZBOHJok7KM3aMJCLCJZ1Vd/lRdGJKY/FKWeNVRzG0FyGVPSrZWjOfnuB7awnu/3J57DGvy+BadCxb70ufnTF/9uSOdi145ftM1a7NhLzhVeLK9Tpfse7vIWGSsAl6TDQXYtrZkFuJD3i5oL86W6zRbCtBmW4A2+JwJHdXunQ0FeDXkTXYud/ZBj/Qo4uw5f7JlJySO74cen8e51YaH/RTfrDl8su0wzBvfCUjZE5ts/M9U2KnZ7DnZsAr+JjUbscLgr5/XXgMIMEPKO8Y+fq5T2DOCKjhDOCfhgisQXj+wgB2s09KaFwiwGe9+agzE2Aqq4E/SAzJlHn0gx3+hA6gOwQ/rcwAAACV0RVh0ZGF0ZTpjcmVhdGUAMjAxNy0wNy0wMVQwMTowMzo0MyswMDowMHj1DbQAAAAldEVYdGRhdGU6bW9kaWZ5ADIwMTctMDctMDFUMDE6MDM6NDMrMDA6MDAJqLUIAAAAAElFTkSuQmCC';
}
/* global Pjax */
function initNavBar() {
var buttons = document.querySelectorAll("li[data-pjax]");
@@ -146,7 +147,7 @@ function hideOverlay() {
document.getElementsByClassName('community-page-info-container')[0].style.display = '';
document.getElementsByClassName('community-page-post-box')[0].style.display = '';
document.getElementsByClassName('user-page-tab-table')[0].style.display = '';
document.getElementById('main').style.marginLeft = '225px';
document.getElementById('main').style.marginLeft = '';
document.body.style.backgroundColor = "rgba(232,236,236,1)";
wiiuSound.playSoundByName('SE_OLV_CANCEL', 1)
}
@@ -176,7 +177,7 @@ function hideNewPostScreen() {
document.getElementsByClassName('community-page-post-box')[0].style.display = '';
document.getElementsByClassName('community-page-header-overlay')[0].style.display = '';
document.getElementById('community-new-post-wrapper').style.display = '';
document.getElementById('main').style.marginLeft = '225px';
document.getElementById('main').style.marginLeft = '';
document.body.style.backgroundColor = "rgba(232,236,236,1)";
wiiuSound.playSoundByName('SE_OLV_CANCEL', 1)
}
@@ -726,6 +727,28 @@ function loadScreenshots() {
else
dropdown.style.display = 'block';
}
function selectScreenshot(select) {
var screenshot;
switch (select) {
case 1:
screenshot = wiiuMainApplication.getScreenShot(true);
document.getElementById('screenshot-value').value = screenshot
document.getElementsByClassName('post-screenshot-picker-icon')[0].style.backgroundImage = "url('data:image/png;base64," + screenshot + "')";
document.getElementsByClassName('post-screenshot-picker-icon')[0].style.backgroundSize = '90%';
break;
case 2:
screenshot = wiiuMainApplication.getScreenShot(false);
document.getElementById('screenshot-value').value = screenshot;
document.getElementsByClassName('post-screenshot-picker-icon')[0].style.backgroundImage = "url('data:image/png;base64," + screenshot + "')";
document.getElementsByClassName('post-screenshot-picker-icon')[0].style.backgroundSize = '90%';
break;
default:
document.getElementById('screenshot-value').value = '';
document.getElementsByClassName('post-screenshot-picker-icon')[0].style.backgroundImage = '';
document.getElementsByClassName('post-screenshot-picker-icon')[0].style.backgroundSize = '';
break;
}
}
function searchCommunities() {
var input, filter, table, tr, td, i, j, txtValue;
input = document.getElementById("search-bar");