Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 28 additions & 2 deletions backend/api/get/localRoutes.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ require('dotenv').config({ path: './.env' });

const router = express.Router();

const defaultSettings = require('./public/default_server.json');
const defaultSettings = require('../../public/default_server.json');

router.get('/authenticatedToken', async (req, res) => {
const jwtToken = req.cookies.Authenticated;
Expand Down Expand Up @@ -85,9 +85,35 @@ router.get('/generate-uuid/:guild_id', (req, res) => {

fs.writeFile('./public/servers.json', JSON.stringify(servers, null, 2), 'utf8', (err) => {
if (err) throw err;
res.json({ server_uuid })
});
});

fs.readFile('./public/server_info.json', 'utf8', (err, data) => {
if (err) throw err;

Check failure

Code scanning / CodeQL

Server crash

The server of [this route handler](1) will terminate when an uncaught exception from this location escapes an [asynchronous callback](2).

const serverInfo = JSON.parse(data || '{}');

// Check if guild ID and server UUID are present, and initialize with default settings if not
if (!serverInfo[guild_id]) {
serverInfo[guild_id] = {};
}
if (!serverInfo[guild_id][server_uuid]) {
serverInfo[guild_id][server_uuid] = {

Check warning

Code scanning / CodeQL

Prototype-polluting assignment

This assignment may alter Object.prototype if a malicious '__proto__' string is injected from [user controlled input](1).
'players': [],
'ping': [],
'map': null,
'status': null,
'last_restart': null,
'message_id': null
};
}

fs.writeFile('./public/server_info.json', JSON.stringify(serverInfo, null, 2), 'utf8', (err) => {
if (err) throw err;
});
});

res.json({ server_uuid })
});

router.get('/servers/:guildId', (req, res) => {
Expand Down
52 changes: 37 additions & 15 deletions backend/api/post/postRoutes.js
Original file line number Diff line number Diff line change
Expand Up @@ -165,7 +165,7 @@ function queueWrite(data, res) {
}

router.post('/write-server-info', async (req, res) => {
const { guild_id, server_uuid, server_info } = req.body;
const { guildID, serverUUID, queryState } = req.body;

try {
let data = null;
Expand All @@ -180,6 +180,8 @@ router.post('/write-server-info', async (req, res) => {
await new Promise(resolve => setTimeout(resolve, 1000)); // Wait for 1 second
}
}

console.log(queryState.map);

// If data is still null after 5 attempts, handle the error
if (!data) {
Expand All @@ -188,12 +190,12 @@ router.post('/write-server-info', async (req, res) => {

const jsonData = JSON.parse(data || '{}');

if (!(guild_id in jsonData)) {
jsonData[guild_id] = {};
if (!(guildID in jsonData)) {
jsonData[guildID] = {};
}

if (!(server_uuid in jsonData[guild_id])) {
jsonData[guild_id][server_uuid] = {
if (!(serverUUID in jsonData[guildID])) {
jsonData[guildID][serverUUID] = {

Check warning

Code scanning / CodeQL

Prototype-polluting assignment

This assignment may alter Object.prototype if a malicious '__proto__' string is injected from [user controlled input](1).
map: null,
players: [],
ping: [],
Expand All @@ -203,12 +205,32 @@ router.post('/write-server-info', async (req, res) => {
};
}

jsonData[guild_id][server_uuid].map = server_info.map;
jsonData[guild_id][server_uuid].players.push(server_info.active_players);
jsonData[guild_id][server_uuid].ping.push(server_info.ping);
jsonData[guild_id][server_uuid].status = server_info.status;
jsonData[guild_id][server_uuid].last_restart = server_info.last_restart;
jsonData[guild_id][server_uuid].message_id = server_info.message_id;
jsonData[guildID][serverUUID].map = queryState.map;

Check warning

Code scanning / CodeQL

Prototype-polluting assignment

This assignment may alter Object.prototype if a malicious '__proto__' string is injected from [user controlled input](1).
jsonData[guildID][serverUUID].players.push(queryState.active_players);
jsonData[guildID][serverUUID].ping.push(queryState.ping);
jsonData[guildID][serverUUID].status = queryState.status;

Check warning

Code scanning / CodeQL

Prototype-polluting assignment

This assignment may alter Object.prototype if a malicious '__proto__' string is injected from [user controlled input](1).
jsonData[guildID][serverUUID].last_restart = queryState.last_restart;

Check warning

Code scanning / CodeQL

Prototype-polluting assignment

This assignment may alter Object.prototype if a malicious '__proto__' string is injected from [user controlled input](1).

queueWrite(jsonData, res);
} catch (err) {
console.log(`Error reading or processing file: ${err}`);
res.status(500).send(err.message);
}
});

router.post('/write-message-id', async (req, res) => {
const { guildID, serverUUID, messageID } = req.body;

try {
let data = await fs.promises.readFile('./public/server_info.json', 'utf8');

const jsonData = JSON.parse(data || '{}');

if (!(guildID in jsonData) || !(serverUUID in jsonData[guildID])) {
return res.status(404).send('Guild or server not found');
}

jsonData[guildID][serverUUID].message_id = messageID;

queueWrite(jsonData, res);
} catch (err) {
Expand All @@ -226,22 +248,22 @@ router.delete('/delete-server', async (req, res) => {

try {
// Read and parse server_info.json
let serverInfoData = JSON.parse(await fs.readFile('./public/server_info.json', 'utf8'));
let serverInfoData = JSON.parse(await fs.promises.readFile('./public/server_info.json', 'utf8'));
// Delete server_uuid
if (serverInfoData[guild_id]) {
delete serverInfoData[guild_id][server_uuid];
}
// Write the modified data back to server_info.json
await fs.writeFile('./public/server_info.json', JSON.stringify(serverInfoData, null, 2));
await fs.promises.writeFile('./public/server_info.json', JSON.stringify(serverInfoData, null, 2));

// Read and parse servers.json
let serversData = JSON.parse(await fs.readFile('./public/servers.json', 'utf8'));
let serversData = JSON.parse(await fs.promises.readFile('./public/servers.json', 'utf8'));
// Delete server_uuid
if (serversData[guild_id]) {
delete serversData[guild_id][server_uuid];
}
// Write the modified data back to servers.json
await fs.writeFile('./public/servers.json', JSON.stringify(serversData, null, 2));
await fs.promises.writeFile('./public/servers.json', JSON.stringify(serversData, null, 2));

res.json({ message: 'Server UUID deleted successfully.' });
} catch (err) {
Expand Down
15 changes: 15 additions & 0 deletions discord/.eslintrc.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
{
"env": {
"browser": true,
"commonjs": true,
"es2021": true
},
"extends": "google",
"parserOptions": {
"ecmaVersion": "latest"
},
"rules": {
"max-len": "off",
"linebreak-style": "off"
}
}
123 changes: 89 additions & 34 deletions discord/api/index.js
Original file line number Diff line number Diff line change
@@ -1,47 +1,102 @@
const axios = require('axios');
require('dotenv').config({ path: './.env' });
const logger = require('../utils/logger');
require('dotenv').config({path: './.env'});

async function getGuilds(page = 0, pageSize = 10) {
const guilds = await axios.get(`${process.env.BACKEND_URL}api/get/bot/guilds`, {
params: {
page: page,
pageSize: pageSize
}
});
return guilds;
/**
*
* @return {object}
*/
async function getGuilds() {
logger.debug(`Fetching guilds`);
const guilds = await axios.get(`${process.env.BACKEND_URL}api/get/bot/guilds`);
return guilds.data;
}

async function getServerUUIDsForGuild(guild_id) {
const servers = await axios.get(`${process.env.BACKEND_URL}api/get/bot/${guild_id}/servers`, {});
return servers;
/**
*
* @param {string} guildID
* @return {object}
*/
async function getServerUUIDsForGuild(guildID) {
logger.debug(`Fetching server UUIDs for guild: ${guildID}`);
const servers = await axios.get(`${process.env.BACKEND_URL}api/get/bot/${guildID}/servers`, {});
return servers;
}

async function getServerDetails(guild_id, server_uuid) {
const details = await axios.get(`${process.env.BACKEND_URL}api/get/bot/${guild_id}/server/${server_uuid}`, {});
return details;
/**
*
* @param {string} guildID
* @param {string} serverUUID
* @return {object}
*/
async function getServerSettings(guildID, serverUUID) {
logger.debug(`Fetching server details for guild: ${guildID} and server UUID: ${serverUUID}`);
const settings = await axios.get(`${process.env.BACKEND_URL}api/get/bot/${guildID}/server/${serverUUID}`, {});
return settings.data;
}

async function getServerInfo(guild_id, server_uuid) {
const serverInfo = await axios.get(`${process.env.BACKEND_URL}api/get/bot/${guild_id}/serverInfo/${server_uuid}`, {});
return serverInfo;
/**
*
* @param {string} guildID
* @param {string} serverUUID
* @return {object}
*/
async function getServerInfo(guildID, serverUUID) {
logger.debug(`Fetching server info for guild: ${guildID} and server UUID: ${serverUUID}`);
let serverInfo;
try {
serverInfo = await axios.get(`${process.env.BACKEND_URL}api/get/bot/${guildID}/serverInfo/${serverUUID}`, {});
} catch {
logger.warn(`Couldn't find info for guild: ${guildID} and server UUID: ${serverUUID}`);
logger.info(`Creating new info for guild: ${guildID} and server UUID: ${serverUUID}`);
serverInfo = {'players': 0, 'ping': 0, 'map': null, 'status': null, 'last_restart': null, 'message_id': null};
writeServerInfo(guildID, serverUUID, serverInfo);
}
return serverInfo;
}

async function writeServerInfo(guild_id, server_uuid, server_info) {
try {
const response = await axios.post(`${process.env.BACKEND_URL}api/post/write-server-info`, {
guild_id,
server_uuid,
server_info,
});
} catch (error) {
console.error('Error: ', error);
}
/**
*
* @param {string} guildID
* @param {string} serverUUID
* @param {object} queryState
*/
async function writeServerInfo(guildID, serverUUID, queryState) {
try {
logger.debug(`Writing server info for guild: ${guildID} and server UUID: ${serverUUID}`);
await axios.post(`${process.env.BACKEND_URL}api/post/write-server-info`, {
guildID,
serverUUID,
queryState,
});
} catch (error) {
logger.error(`Error writing server info for guild: ${guildID} and server UUID: ${serverUUID}, error: ${error}`);
}
}
/**
*
* @param {string} guildID
* @param {string} serverUUID
* @param {object} messageID
*/
async function writeMessageID(guildID, serverUUID, messageID) {
try {
logger.debug(`Writing server info for guild: ${guildID} and server UUID: ${serverUUID}`);
await axios.post(`${process.env.BACKEND_URL}api/post/write-message-id`, {
guildID,
serverUUID,
messageID,
});
} catch (error) {
logger.error(`Error writing server info for guild: ${guildID} and server UUID: ${serverUUID}, error: ${error}`);
}
}

module.exports = {
getGuilds,
getServerUUIDsForGuild,
getServerDetails,
getServerInfo,
writeServerInfo
};
getGuilds,
getServerUUIDsForGuild,
getServerSettings,
getServerInfo,
writeServerInfo,
writeMessageID,
};
Loading