commit
fb62210b9c
@ -1,3 +1 @@
|
|||||||
<h1>Thought you could pull a fast one eh?</h1>
|
<h1>You do not have permission to access this page.</h1>
|
||||||
<p>I dont think so</p>
|
|
||||||
<h2>👎</h2>
|
|
@ -0,0 +1 @@
|
|||||||
|
jo [FLAG]
|
@ -0,0 +1,4 @@
|
|||||||
|
FROM ubuntu:latest
|
||||||
|
WORKDIR /.
|
||||||
|
CMD ["bin/bash"]
|
||||||
|
COPY Root /.
|
@ -0,0 +1,73 @@
|
|||||||
|
import { getUsername } from "../server.js"
|
||||||
|
import { getActiveFlagImage } from "../queries/imageQueries.js"
|
||||||
|
import Docker from 'dockerode';
|
||||||
|
// create a new docker
|
||||||
|
const docker = new Docker();
|
||||||
|
|
||||||
|
// creating container
|
||||||
|
async function CreateContainer(email) {
|
||||||
|
console.log('Creating Container for ' + email);
|
||||||
|
let username = getUsername(email);
|
||||||
|
|
||||||
|
// get the active flag image for that user and use that to create the container
|
||||||
|
return getActiveFlagImage(email).then(async (image) => {
|
||||||
|
if(image === undefined || image.ActiveFlag === null || image.ActiveFlag === 'ubuntu') {
|
||||||
|
return await StartContainer('ubuntu', username, email);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return await StartContainer(image.ActiveFlag, username, email);
|
||||||
|
}).catch((err) => {
|
||||||
|
console.error('Error in CreateContainer:', err.message);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create and Start the container with correct image
|
||||||
|
async function StartContainer(image, username, email) {
|
||||||
|
|
||||||
|
// create container
|
||||||
|
try {
|
||||||
|
const container = await docker.createContainer({
|
||||||
|
Image: image,
|
||||||
|
Cmd: ['/bin/bash'],
|
||||||
|
AttachStdin: true,
|
||||||
|
AttachStdout: true,
|
||||||
|
AttachStderr: true,
|
||||||
|
StdinOnce: false,
|
||||||
|
OpenStdin: true,
|
||||||
|
Tty: true,
|
||||||
|
Detach: false,
|
||||||
|
Hostname: username,
|
||||||
|
name: username
|
||||||
|
});
|
||||||
|
|
||||||
|
// start container
|
||||||
|
console.log('starting container', container.id);
|
||||||
|
await container.start();
|
||||||
|
console.log('+++++ Container started for ' + username + ' with ID: ' + container.id + ' +++++');
|
||||||
|
return container;
|
||||||
|
} catch (err) {
|
||||||
|
if (err.statusCode === 409 || err.statusCode === 404) { // confliction or if container doesn't exist
|
||||||
|
return CheckContainer(email);
|
||||||
|
}
|
||||||
|
else console.error(err);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// check if there is a container already created and started with the specific email
|
||||||
|
export async function CheckContainer(email) {
|
||||||
|
try { // remove container if that container already exists
|
||||||
|
console.log('Checking container for email:', email);
|
||||||
|
const cont = await docker.getContainer(getUsername(email));
|
||||||
|
const info = await cont.inspect();
|
||||||
|
if(info.State.Running){
|
||||||
|
await cont.kill();
|
||||||
|
await cont.remove({ force: true});
|
||||||
|
}
|
||||||
|
return await CreateContainer(email);
|
||||||
|
} catch(err) {
|
||||||
|
if(err.statusCode === 404) {
|
||||||
|
return await CreateContainer(email);
|
||||||
|
}
|
||||||
|
console.error('Error checking container:', err.message);
|
||||||
|
}
|
||||||
|
};
|
@ -1,124 +0,0 @@
|
|||||||
import con from '../db/db.js';
|
|
||||||
import { Router } from "express";
|
|
||||||
import { AdminorUser } from '../server.js';
|
|
||||||
import { getAdminFromUser, getAdminID } from './adminQueries.js';
|
|
||||||
const router = Router();
|
|
||||||
|
|
||||||
// get all contests for specific Admin
|
|
||||||
router.post('/getContests', async (req,res) => {
|
|
||||||
const { email } = req.body;
|
|
||||||
|
|
||||||
// determine if email is admin or user
|
|
||||||
return AdminorUser(email).then(async (ans) => {
|
|
||||||
|
|
||||||
// if user then go into the user table and grab the foreign key for Admin
|
|
||||||
if (ans === 'Users') {
|
|
||||||
|
|
||||||
// get all the contests for that Admin
|
|
||||||
const Admin = await getAdminFromUser(email);
|
|
||||||
//if(!Admin || !Admin.AdminID) return res.status(404).json({error: 'Admin not found'});
|
|
||||||
const query = 'SELECT * FROM Contests WHERE AdminID = ?';
|
|
||||||
con.query(query, [Admin.AdminID], (err, rows) => {
|
|
||||||
if (err) {
|
|
||||||
console.error(err.message);
|
|
||||||
return res.status(500).json({ error: 'GETTING CONTESTS' });
|
|
||||||
}
|
|
||||||
if (rows.length === 0)
|
|
||||||
return res.status(404).json({ error: 'NO CONTESTS FOUND' });
|
|
||||||
return res.json(rows);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
// if email is an Admin
|
|
||||||
else {
|
|
||||||
// get all contests for that Admin
|
|
||||||
const Admin_1 = await getAdminID(email);
|
|
||||||
const query_1 = 'SELECT * FROM Contests WHERE AdminID = ?';
|
|
||||||
con.query(query_1, [Admin_1.AdminID], (err_1, rows_1) => {
|
|
||||||
if (err_1) {
|
|
||||||
console.error(err_1.message);
|
|
||||||
return res.status(500).json({ error: 'GETTING CONTESTS' });
|
|
||||||
}
|
|
||||||
if (rows_1.length === 0)
|
|
||||||
return res.status(404).json({ error: 'NO CONTESTS FOUND' });
|
|
||||||
return res.json(rows_1);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}).catch((err) => {
|
|
||||||
console.error(err);
|
|
||||||
return res.status(500).json({ error: 'COULD NOT GET CONTESTS' });
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
router.post('/getContestByID', async (req, res) => {
|
|
||||||
const { contestID } = req.body;
|
|
||||||
if(!contestID)
|
|
||||||
return res.status(400).json({error: 'No Contest ID'});
|
|
||||||
try{
|
|
||||||
const contest = await getContestByID(contestID);
|
|
||||||
res.json(contest);
|
|
||||||
} catch(err){
|
|
||||||
if(err.message === 'Contest not found'){
|
|
||||||
return res.status(404).json({ error: 'Contest not found' });
|
|
||||||
}
|
|
||||||
else{
|
|
||||||
console.error(err);
|
|
||||||
res.status(500).json({ error: 'Internal server error' });
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
async function getContestByID(contestID){
|
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
const query = 'SELECT * FROM Contests WHERE ContestID = ?';
|
|
||||||
con.query(query, [contestID], (err, rows) => {
|
|
||||||
if(err) {
|
|
||||||
console.error(err.message);
|
|
||||||
reject(err);
|
|
||||||
}
|
|
||||||
if(rows.length === 0){
|
|
||||||
return reject(new Error('Contest not found'));
|
|
||||||
}
|
|
||||||
resolve(rows[0]);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// get the current active contest of an Admin
|
|
||||||
router.post('/getActiveContest', (req,res) => {
|
|
||||||
const { email } = req.body;
|
|
||||||
return AdminorUser(email).then((ans) => {
|
|
||||||
if (ans === 'Users') {
|
|
||||||
return getAdminFromUser(email).then((Admin) => {
|
|
||||||
const query = 'SELECT * FROM Contests WHERE IsActive = 1 AND AdminID = ?';
|
|
||||||
con.query(query, [Admin.AdminID], (err,rows) => {
|
|
||||||
if (err) {
|
|
||||||
console.error(err.message);
|
|
||||||
return res.status(500).json({ error: 'GETTING ACTIVE CONTEST' });
|
|
||||||
}
|
|
||||||
if (rows.length === 0)
|
|
||||||
return res.status(404).json({ error: 'NO CONTEST FOUND' });
|
|
||||||
return res.json(rows[0]);
|
|
||||||
})
|
|
||||||
});
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return getAdminID(email).then((Admin) => {
|
|
||||||
const query = 'SELECT * FROM Contests WHERE IsActive = 1 AND AdminID = ?';
|
|
||||||
con.query(query, [Admin.AdminID], (err,rows) => {
|
|
||||||
if (err) {
|
|
||||||
console.log('here');
|
|
||||||
console.error(err.message);
|
|
||||||
return res.status(500).json({ error: 'GETTING ACTIVE CONTEST' });
|
|
||||||
}
|
|
||||||
if(rows.length === 0) return res.status(404).json({ error: 'NO CONTEST FOUND' });
|
|
||||||
else return res.json(rows[0]);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}).catch((err) => {
|
|
||||||
console.error(err.message);
|
|
||||||
return res.status(500).json({ error: 'GETTING ACTIVE CONTEST' });
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
export default router;
|
|
@ -1,98 +0,0 @@
|
|||||||
import con from '../db/db.js';
|
|
||||||
import { Router } from "express";
|
|
||||||
import { AdminorUser } from '../server.js';
|
|
||||||
const router = Router();
|
|
||||||
|
|
||||||
// get the active flag of a specific user
|
|
||||||
router.post('/getActiveFlag', (req,res) => {
|
|
||||||
const { email, contest } = req.body;
|
|
||||||
return AdminorUser(email).then((table) => {
|
|
||||||
const query = `SELECT ActiveFlag FROM ${table} WHERE Email = ?`;
|
|
||||||
con.query(query, [email, contest], (err,rows) => {
|
|
||||||
if (err) {
|
|
||||||
console.log(err.message);
|
|
||||||
return res.status(500).json({ error: 'GETTING ACTIVE FLAG' });
|
|
||||||
}
|
|
||||||
if (rows.length > 0 && rows[0].ActiveFlag !== null) {
|
|
||||||
const activeFlag = rows[0].ActiveFlag;
|
|
||||||
const imageObject = { ActiveFlag: activeFlag};
|
|
||||||
return getFlagByImage(imageObject).then((flag) => {
|
|
||||||
res.json(flag);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
else return res.status(500).json({ error: 'GETTING ACTIVE FLAG' });
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
// get every flag for a specific contest
|
|
||||||
router.post('/getAllFlagsFromContest', (req,res) => {
|
|
||||||
const { contest } = req.body;
|
|
||||||
const query = 'SELECT * FROM Flags WHERE ContestID = ?';
|
|
||||||
con.query(query, [contest], (err,rows) => {
|
|
||||||
if (err) {
|
|
||||||
console.error(err.message);
|
|
||||||
return res.status(500).json({ error: 'GETTING ALL FLAGS FOR CONTEST' });
|
|
||||||
}
|
|
||||||
res.json(rows);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
// get a flag by the image name
|
|
||||||
export async function getFlagByImage(image) {
|
|
||||||
//console.log("looking for your image: ", image.ActiveFlag);
|
|
||||||
const flagImage = image.ActiveFlag;
|
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
const query = 'SELECT * FROM Flags WHERE Image = ?';
|
|
||||||
con.query(query, [flagImage], (err,rows) => {
|
|
||||||
if (err) {
|
|
||||||
console.error(err.message);
|
|
||||||
reject(err);
|
|
||||||
}
|
|
||||||
if(rows.length === 0)
|
|
||||||
return resolve('ubuntu');
|
|
||||||
resolve(rows[0]);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// get all of the flags
|
|
||||||
export async function getAllFlags() {
|
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
const query = 'SELECT * FROM Flags';
|
|
||||||
con.query(query, [], (err,rows) => {
|
|
||||||
if (err) {
|
|
||||||
console.error(err.message);
|
|
||||||
reject(err);
|
|
||||||
}
|
|
||||||
resolve(rows);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
// get every flag for a specific contest
|
|
||||||
router.post('/getAllFlagsFromContest', (req,res) => {
|
|
||||||
const { contest } = req.body;
|
|
||||||
const query = 'SELECT * FROM Flags WHERE ContestID = ?';
|
|
||||||
con.query(query, [contest], (err,rows) => {
|
|
||||||
if (err) {
|
|
||||||
console.error(err.message);
|
|
||||||
return res.status(500).json({ error: 'GETTING ALL FLAGS FOR CONTEST' });
|
|
||||||
}
|
|
||||||
res.json(rows);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
// get every flag inside db
|
|
||||||
router.get('/getAllFlags', (req,res) => {
|
|
||||||
const query = 'SELECT * FROM Flags';
|
|
||||||
con.query(query, [], (err,rows) => {
|
|
||||||
if (err) {
|
|
||||||
console.error(err.message);
|
|
||||||
return res.status(500).json({ error: 'GETTING ALL FLAGS FROM DB' });
|
|
||||||
}
|
|
||||||
res.json(rows);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
export default router;
|
|
@ -1,99 +0,0 @@
|
|||||||
import con from '../db/db.js';
|
|
||||||
import { Router } from "express";
|
|
||||||
import { getAdminID } from "./adminQueries.js";
|
|
||||||
const router = Router();
|
|
||||||
|
|
||||||
// get a user from either table with email
|
|
||||||
export function getUserByEmail(table, email) {
|
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
const query = `SELECT * FROM ${table} WHERE Email = ?`;
|
|
||||||
con.query(query, [email], (err, rows) => {
|
|
||||||
if (err) {
|
|
||||||
console.error(err.message);
|
|
||||||
reject(err);
|
|
||||||
}
|
|
||||||
resolve(rows[0]);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
// delete a student from the database
|
|
||||||
router.post('/DeleteStudent', (req,res) => {
|
|
||||||
const {email} = req.body;
|
|
||||||
const query = "DELETE FROM Users WHERE Users.Email = ?";
|
|
||||||
con.query(query, [email], function(err,rows) {
|
|
||||||
if (err) {
|
|
||||||
console.error(err.message);
|
|
||||||
return res.status(500).json({ error: "DELETING STUDENT" });
|
|
||||||
}
|
|
||||||
|
|
||||||
// contest doesn't exist
|
|
||||||
if (rows.affectedRows === 0) return res.status(404).json({ error: "NO STUDENT" });
|
|
||||||
return res.status(200).json({ success: true });
|
|
||||||
});
|
|
||||||
})
|
|
||||||
|
|
||||||
// get all of the users with the same key as admin
|
|
||||||
router.post('/getAllUsers', (req,res) => {
|
|
||||||
const { email } = req.body;
|
|
||||||
return getAdminID(email).then((Admin) => {
|
|
||||||
const query = 'SELECT * FROM Users WHERE AdminID = ?';
|
|
||||||
con.query(query,[Admin.AdminID], (err,rows) => {
|
|
||||||
if (err) {
|
|
||||||
console.error(err.message);
|
|
||||||
return res.status(500).json({ error: 'GETTING USERS '});
|
|
||||||
}
|
|
||||||
if(rows.length === 0)
|
|
||||||
res.status(404).json({ error: 'NO ADMIN/USERS FOUND '});
|
|
||||||
else
|
|
||||||
res.json(rows);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
// return everything on a user by email
|
|
||||||
router.post('/getUser', async(req,res) => {
|
|
||||||
const { email } = req.body;
|
|
||||||
return getUserByEmail('Users',email).then((row) => {
|
|
||||||
if (row) res.json(row);
|
|
||||||
else return res.status(404).json({ error: 'USER NOT FOUND' });
|
|
||||||
})
|
|
||||||
});
|
|
||||||
|
|
||||||
router.post('/getUsername', async(req,res) => {
|
|
||||||
const { email } = req.body;
|
|
||||||
return getUserByEmail('Users',email).then((row) => {
|
|
||||||
if (row) res.json(row.Name);
|
|
||||||
else return res.status(404).json({ error: 'USER NOT FOUND' });
|
|
||||||
})
|
|
||||||
});
|
|
||||||
|
|
||||||
// set the new name of the user
|
|
||||||
router.post('/setUserName', (req,res) => {
|
|
||||||
const { name, email } = req.body;
|
|
||||||
const query = 'UPDATE Users SET Name = ? WHERE Email = ?';
|
|
||||||
con.query(query, [name,email], (err) => {
|
|
||||||
if (err){
|
|
||||||
console.error(err.message);
|
|
||||||
return res.status(500).json({ error: err });
|
|
||||||
}
|
|
||||||
return res.status(200).json({ success: true });
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
// get all users from an AdminID
|
|
||||||
export async function getUsersFromAdmin(AdminID) {
|
|
||||||
return new Promise((resolve,reject) => {
|
|
||||||
const query = 'SELECT * FROM Users WHERE AdminID = ?';
|
|
||||||
con.query(query, [AdminID], (err,rows) => {
|
|
||||||
if (err) {
|
|
||||||
console.error(err.message);
|
|
||||||
reject(err);
|
|
||||||
}
|
|
||||||
resolve(rows);
|
|
||||||
})
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
export default router;
|
|
@ -0,0 +1,114 @@
|
|||||||
|
import con from '../db/dbconnection.js';
|
||||||
|
import { AdminorUser } from '../server.js';
|
||||||
|
import { getAdminID } from './adminQueries.js';
|
||||||
|
|
||||||
|
export async function getContestByID(contestID){
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const query = 'SELECT * FROM Contests WHERE ContestID = ?';
|
||||||
|
con.query(query, [contestID], (err, rows) => {
|
||||||
|
if(err) {
|
||||||
|
console.error(err.message);
|
||||||
|
reject(err);
|
||||||
|
}
|
||||||
|
if(rows.length === 0)
|
||||||
|
return reject(new Error('Contest not found'));
|
||||||
|
resolve(rows[0]);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function addContest(Name, AdminID, Desc){
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const query = 'INSERT INTO CONTESTS (Name, IsActive, AdminID, Description) VALUES (?,0,?,?)';
|
||||||
|
con.query(query, [Name, AdminID, Desc], (err, res) => {
|
||||||
|
if(err) reject(err);
|
||||||
|
else resolve(res);
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function getActiveContest(adminID){
|
||||||
|
return new Promise((res, reject) => {
|
||||||
|
const query = 'SELECT * FROM Contests WHERE IsActive = 1 AND AdminID = ?';
|
||||||
|
con.query(query, [adminID], (err, rows) => {
|
||||||
|
if(err) reject(err);
|
||||||
|
else res(rows);
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function endContest(adminID, contestID){
|
||||||
|
console.log("ContestID:", contestID);
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const query = 'UPDATE Contests SET IsActive = 0 WHERE AdminID = ? AND ContestID = ?';
|
||||||
|
con.query(query, [adminID, contestID], (err, result) => {
|
||||||
|
if(err) reject(err);
|
||||||
|
else {
|
||||||
|
console.log("Ended:", result);
|
||||||
|
resolve(result);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function setContestActive(adminID, contestID){
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const query = 'UPDATE Contests SET IsActive = 1 WHERE AdminID = ? AND ContestID = ?';
|
||||||
|
con.query(query, [adminID, contestID], (err, result) => {
|
||||||
|
if (err) reject(err);
|
||||||
|
else resolve(result);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function deleteContest(contestID){
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const query = 'DELETE FROM Contests WHERE ContestID = ?';
|
||||||
|
con.query(query, [contestID], (err, result) => {
|
||||||
|
if (err) reject(err);
|
||||||
|
else resolve(result);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// get the contest ID from the contest name
|
||||||
|
export async function getContestIDFromName(contestname) {
|
||||||
|
return new Promise((resolve,reject) => {
|
||||||
|
const query = 'SELECT ContestID FROM Contests WHERE Name = ?';
|
||||||
|
con.query(query,[contestname],(err,row) => {
|
||||||
|
if (err) {
|
||||||
|
console.error(err.message);
|
||||||
|
reject(err);
|
||||||
|
}
|
||||||
|
resolve(row);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// get contest ID from an email and the name of the contest
|
||||||
|
export async function getContestIDFromNameAdminID(email, contestname) {
|
||||||
|
console.log("EMAIL:", email);
|
||||||
|
console.log("CONTEST:", contestname);
|
||||||
|
return getAdminID(email).then((Admin) => {
|
||||||
|
return new Promise((resolve,reject) => {
|
||||||
|
const query = 'SELECT ContestID FROM Contests WHERE AdminID = ? AND Name = ?';
|
||||||
|
con.query(query,[Admin,contestname], (err,row) => {
|
||||||
|
if (err) {
|
||||||
|
console.error(err.message);
|
||||||
|
reject(err);
|
||||||
|
}
|
||||||
|
resolve(row[0].ContestID);
|
||||||
|
});
|
||||||
|
})
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function getContestsFromAdminID(AdminID){
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const query = 'SELECT * FROM Contests WHERE AdminID = ?';
|
||||||
|
con.query(query, [AdminID], (err, result) => {
|
||||||
|
if (err) reject(err);
|
||||||
|
else resolve(result);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
@ -0,0 +1,124 @@
|
|||||||
|
import con from '../db/dbconnection.js';
|
||||||
|
import { AdminorUser } from '../server.js';
|
||||||
|
|
||||||
|
// get a flag by the image name
|
||||||
|
export async function getFlagByImage(image) {
|
||||||
|
//console.log("looking for your image: ", image.ActiveFlag);
|
||||||
|
const flagImage = image.ActiveFlag;
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const query = 'SELECT * FROM Flags WHERE Image = ?';
|
||||||
|
con.query(query, [flagImage], (err,rows) => {
|
||||||
|
if (err) {
|
||||||
|
console.error(err.message);
|
||||||
|
reject(err);
|
||||||
|
}
|
||||||
|
if(rows.length === 0)
|
||||||
|
return resolve('ubuntu');
|
||||||
|
resolve(rows[0]);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// get all of the flags
|
||||||
|
export async function getAllFlags() {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const query = 'SELECT * FROM Flags';
|
||||||
|
con.query(query, [], (err,rows) => {
|
||||||
|
if (err) {
|
||||||
|
console.error(err.message);
|
||||||
|
reject(err);
|
||||||
|
}
|
||||||
|
resolve(rows);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
export async function addFlag(name, desc, contest, image, path, hint1, hint2, hint3){
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const query = 'INSERT INTO FLAGS (Name, Description, ContestID, Image, Path, Hint1, Hint2, Hint3) VALUES (?,?,?,?,?,?,?,?)';
|
||||||
|
con.query(query, [name, desc, contest, image, path, hint1, hint2, hint3], (err, result) => {
|
||||||
|
if(err) reject(err);
|
||||||
|
else resolve(result);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// delete flags attempts from submissions
|
||||||
|
export async function DeleteFlagFromSub(flag) {
|
||||||
|
const query = 'DELETE FROM Submissions WHERE FlagID = ?';
|
||||||
|
con.query(query, [flag], (err) => {
|
||||||
|
if (err) {
|
||||||
|
console.error(err.message);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function getActiveFlag(email, table){
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const query = `SELECT ActiveFlag FROM ${table} WHERE Email = ?`;
|
||||||
|
con.query(query, [email], (err, rows) => {
|
||||||
|
if(err) reject(err);
|
||||||
|
if(rows.length > 0 && rows[0].ActiveFlag !== null){
|
||||||
|
resolve(rows[0].ActiveFlag)
|
||||||
|
}
|
||||||
|
else reject("no active flag found");
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function setNewActiveFlag(FlagImage, email, table){
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const query = `UPDATE ${table} SET ActiveFlag = ? WHERE Email = ?`;
|
||||||
|
console.log('New image:', FlagImage);
|
||||||
|
con.query(query, [FlagImage, email], (err, result) => {
|
||||||
|
if(err) reject(err);
|
||||||
|
else resolve(result);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function clearActiveFlag(email){
|
||||||
|
const table = await AdminorUser(email);
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const query = `UPDATE ${table} SET ActiveFlag = ? WHERE Email = ?`;
|
||||||
|
con.query(query, ['ubuntu', email], (err, result) => {
|
||||||
|
if(err) reject(err);
|
||||||
|
else resolve(result);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export async function deleteFlag(flag){
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const query = 'DELETE FROM Flags WHERE FlagID = ?';
|
||||||
|
con.query(query, [flag], (err, result) => {
|
||||||
|
if(err) reject(err);
|
||||||
|
else resolve(result);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function deleteFlagsFromContest(contest){
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const query = 'DELETE FROM Flags WHERE ContestID = ?';
|
||||||
|
con.query(query, [contest], (err, result) => {
|
||||||
|
if(err) reject(err);
|
||||||
|
else resolve(result);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// get a flag from a specific contest
|
||||||
|
export async function getFlagFromContestID(contestID) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const query = 'SELECT * FROM Flags WHERE ContestID = ?';
|
||||||
|
con.query(query, [contestID], (err,rows) => {
|
||||||
|
if (err) {
|
||||||
|
console.error(err.message);
|
||||||
|
reject(err);
|
||||||
|
}
|
||||||
|
resolve(rows);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
@ -0,0 +1,73 @@
|
|||||||
|
import con from "../db/dbconnection.js";
|
||||||
|
|
||||||
|
export async function getImagesForAdmin(adminID){
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
console.log("Checking for Admin: ", adminID);
|
||||||
|
const query = 'SELECT Name FROM Images WHERE AdminID = ?';
|
||||||
|
con.query(query, [adminID], (err, result) => {;
|
||||||
|
if(err) reject(err);
|
||||||
|
else {
|
||||||
|
resolve(result);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// get the active flag from specific user
|
||||||
|
export async function getActiveFlagImage(email) {
|
||||||
|
console.log(`Getting active flag for ${email}`);
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const query = 'SELECT ActiveFlag FROM Users WHERE Email = ?';
|
||||||
|
con.query(query, [email], (err,rows) => { // check users table
|
||||||
|
if (err) { // error
|
||||||
|
console.error('Error fetching from Users table: ', err.message);
|
||||||
|
reject(err);
|
||||||
|
}
|
||||||
|
if (rows.length === 0) {
|
||||||
|
console.log('no active flag for user, checking admins...');
|
||||||
|
const query = 'SELECT ActiveFlag FROM Admins WHERE Email = ?';
|
||||||
|
con.query(query, [email], (err,rows) => { // check admins table
|
||||||
|
if (err) { // error
|
||||||
|
console.error('Error fetching from Admins table: ', err.message);
|
||||||
|
reject(err);
|
||||||
|
}
|
||||||
|
resolve(rows[0]);
|
||||||
|
})
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
console.log('Active flag from users table: ', rows[0]);
|
||||||
|
resolve(rows[0]);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// add the image name to the db of images
|
||||||
|
export async function AddImage(Admin,imgname) {
|
||||||
|
const query = 'INSERT INTO Images (Name,AdminID) VALUES (?,?)';
|
||||||
|
con.query(query, [imgname,Admin], (err) => {
|
||||||
|
if (err) {
|
||||||
|
console.error(err.message);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// reset the flag to ubuntu image
|
||||||
|
export async function ResetFlagImage(flag) {
|
||||||
|
const query = 'UPDATE Flags SET Image = ? WHERE FlagID = ?';
|
||||||
|
con.query(query, ['ubuntu', flag.FlagID], (err) => {
|
||||||
|
if (err) {
|
||||||
|
console.error(err.message);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// delete an image from the database
|
||||||
|
export async function DeleteImage(image) {
|
||||||
|
const query = 'DELETE FROM Images WHERE Name = ?';
|
||||||
|
con.query(query, [image], (err) => {
|
||||||
|
if (err) {
|
||||||
|
console.error(err.message);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
@ -0,0 +1,55 @@
|
|||||||
|
import con from "../db/dbconnection.js";
|
||||||
|
|
||||||
|
export async function getSubmissions(userID, flagID){
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const query = 'SELECT * FROM Submissions WHERE UserID = ? AND FlagID = ?';
|
||||||
|
con.query(query, [userID, flagID], (err, result) => {
|
||||||
|
if(err) reject(err);
|
||||||
|
else resolve(result);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function insertSubmission(userID, flagID, isCorrect, attempts){
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const query = 'INSERT INTO Submissions (UserID, FlagID, IsCorrect, Attempts) VALUES (?, ?, ?, ?)';
|
||||||
|
con.query(query, [userID, flagID, isCorrect, attempts], (err, result) => {
|
||||||
|
if(err) reject(err);
|
||||||
|
else resolve();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function updateSubmissionCorrect(userID, flagID){
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const query = 'UPDATE Submissions SET IsCorrect = 1 WHERE UserID = ? AND FlagID = ?';
|
||||||
|
con.query(query, [userID, flagID], (err, result) => {
|
||||||
|
if(err) reject(err);
|
||||||
|
else resolve();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function updateSubmissionAttempts(userID, flagID){
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const query = 'UPDATE Submissions SET Attempts = Attempts + 1 WHERE UserID = ? AND FlagID = ?';
|
||||||
|
con.query(query, [userID, flagID], (err, result) => {
|
||||||
|
if(err) reject(err);
|
||||||
|
else resolve();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// get all of the submissions
|
||||||
|
export async function getAllSubs() {
|
||||||
|
return new Promise((resolve,reject) => {
|
||||||
|
const query = 'SELECT * FROM Submissions';
|
||||||
|
con.query(query,[],(err,rows) => {
|
||||||
|
if (err) {
|
||||||
|
console.error(err.message);
|
||||||
|
reject(err);
|
||||||
|
}
|
||||||
|
resolve(rows);
|
||||||
|
})
|
||||||
|
});
|
||||||
|
}
|
@ -0,0 +1,92 @@
|
|||||||
|
import con from '../db/dbconnection.js';
|
||||||
|
|
||||||
|
// get a user from either table with email
|
||||||
|
export function getUserByEmail(table, email) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const query = `SELECT * FROM ${table} WHERE Email = ?`;
|
||||||
|
con.query(query, [email], (err, rows) => {
|
||||||
|
if (err) {
|
||||||
|
console.error(err.message);
|
||||||
|
reject(err);
|
||||||
|
}
|
||||||
|
resolve(rows[0]);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// get all users from an AdminID
|
||||||
|
export async function getUsersFromAdmin(AdminID) {
|
||||||
|
return new Promise((resolve,reject) => {
|
||||||
|
const query = 'SELECT * FROM Users WHERE AdminID = ?';
|
||||||
|
con.query(query, [AdminID], (err,rows) => {
|
||||||
|
if (err) {
|
||||||
|
console.error(err.message);
|
||||||
|
reject(err);
|
||||||
|
}
|
||||||
|
resolve(rows);
|
||||||
|
})
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function setUserName(name, email){
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const query = 'UPDATE Users SET Name = ? WHERE Email = ?';
|
||||||
|
con.query(query, [name, email], (err) => {
|
||||||
|
if(err) reject(err);
|
||||||
|
else resolve();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export async function addStudent(name, email, password, admin){
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const query = `INSERT INTO Users (Name, Email, Password, Flags, AdminID) VALUES (?,?,?,0,?)`;
|
||||||
|
con.query(query, [name, email, password, admin], (err, result) => {
|
||||||
|
if(err) reject(err);
|
||||||
|
else resolve(result);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function updateStudent(email, password){
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const query = 'UPDATE Users SET Password = ? WHERE Email = ?';
|
||||||
|
con.query(query, [password, email], (err, result) => {
|
||||||
|
if(err) reject(err);
|
||||||
|
else resolve(result);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function getUserID(email){
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const userQuery = 'SELECT UserID FROM Users WHERE Email = ?';
|
||||||
|
con.query(query, [email], (err, result) => {
|
||||||
|
if(err) reject(err);
|
||||||
|
else resolve(result);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export async function updateUserFlags(userID) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const query = 'UPDATE Users SET Flags = Flags + 1 WHERE UserID = ?';
|
||||||
|
con.query(query, [userID], (err) => {
|
||||||
|
if (err) reject(err);
|
||||||
|
else resolve();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function deleteStudent(email) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const query = "DELETE FROM Users WHERE Email = ?";
|
||||||
|
con.query(query, [email], (err, result) => {
|
||||||
|
if (err) reject(err);
|
||||||
|
else resolve(result);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
@ -0,0 +1,140 @@
|
|||||||
|
import { getContestsFromAdminID, addContest, getActiveContest, endContest, setContestActive, deleteContest, getContestByID } from "../queries/contestQueries.js";
|
||||||
|
import { AdminorUser } from "../server.js";
|
||||||
|
import {getAdminID, getAdminFromUser} from "../queries/adminQueries.js";
|
||||||
|
import { Router } from "express";
|
||||||
|
const router = Router();
|
||||||
|
|
||||||
|
// add a contest to the database
|
||||||
|
router.post('/AddContest', async (req,res) => {
|
||||||
|
try{
|
||||||
|
const { Name, IsActive, email, Desc } = req.body;
|
||||||
|
const Admin = await getAdminID(email);
|
||||||
|
console.log("Admin is:", Admin);
|
||||||
|
await addContest(Name, Admin, Desc)
|
||||||
|
res.status(200).json({success: true});
|
||||||
|
} catch(err){
|
||||||
|
console.error(err.message);
|
||||||
|
res.status(500).json({error: "Could not insert contest"})
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// end a current active contest
|
||||||
|
router.post('/EndContest', async (req,res) => {
|
||||||
|
try{
|
||||||
|
const { contest, email } = req.body;
|
||||||
|
const Admin = await getAdminID(email);
|
||||||
|
console.log("ADMIN ID:", Admin);
|
||||||
|
if(!Admin) return res.status(404).json({error: "admin not found"});
|
||||||
|
const activeContest = await getActiveContest(Admin);
|
||||||
|
if(activeContest.length === 0)
|
||||||
|
return res.status(404).json({error: "CONTEST NOT FOUND"});
|
||||||
|
if(activeContest.IsActive === 0)
|
||||||
|
return res.status(400).json({ error: 'CONTEST ALREADY INACTIVE' });
|
||||||
|
const result = await endContest(Admin, contest);
|
||||||
|
if(result.affectedRows === 0)
|
||||||
|
return res.status(404).json({error: "CONTEST NOT FOUND"});
|
||||||
|
return res.status(200).json({success: true});
|
||||||
|
} catch(err){
|
||||||
|
console.error(err.message);
|
||||||
|
return res.status(500).json({error: "ENDING CONTEST"});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Set a specific contest active for a specific Admin
|
||||||
|
router.post('/setContestActive', async (req,res) => {
|
||||||
|
try{
|
||||||
|
const { contest, email } = req.body;
|
||||||
|
const Admin = await getAdminID(email);
|
||||||
|
const activeContest = await getActiveContest(Admin);
|
||||||
|
console.log("Active contests", activeContest);
|
||||||
|
if(activeContest.length > 0)
|
||||||
|
await endContest(Admin, activeContest[0].ContestID);
|
||||||
|
const result = await setContestActive(Admin, contest);
|
||||||
|
if(result.affectedRows === 0) return res.status(404).json({ error: "CONTEST NOT FOUND"});
|
||||||
|
return res.status(200).json({success: true});
|
||||||
|
} catch(err){
|
||||||
|
console.error(err.message);
|
||||||
|
return res.status(500).json({error: "Error setting contest active"});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// delete a specific contest from database
|
||||||
|
router.post('/DeleteContest', async (req,res) => {
|
||||||
|
try{
|
||||||
|
const { contest } = req.body;
|
||||||
|
const result = await deleteContest(contest);
|
||||||
|
if(result.affectedRows === 0){
|
||||||
|
return res.status(404).json({error: "CONTEST NOT FOUND"});
|
||||||
|
}
|
||||||
|
return res.status(200).json({success: true});
|
||||||
|
} catch(err){
|
||||||
|
console.error(err.message);
|
||||||
|
return res.status(500).json({ error: "ERROR DELETING CONTEST"});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// get all contests for specific Admin
|
||||||
|
router.post('/getContests', async (req,res) => {
|
||||||
|
const { email } = req.body;
|
||||||
|
try{
|
||||||
|
let AdminID;
|
||||||
|
const table = await AdminorUser(email);
|
||||||
|
if(table == 'Users'){
|
||||||
|
const admin = await getAdminFromUser(email);
|
||||||
|
AdminID = admin.AdminID;
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
AdminID = await getAdminID(email);
|
||||||
|
}
|
||||||
|
const contests = await getContestsFromAdminID(AdminID);
|
||||||
|
if(contests.length === 0){
|
||||||
|
return res.status(404).json({error: "NO CONTESTS FOUND"});
|
||||||
|
}
|
||||||
|
return res.json(contests);
|
||||||
|
} catch(err){
|
||||||
|
console.error(err);
|
||||||
|
return res.status(500).json({error: "COULD NOT GET CONTESTS"});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
router.get('/getContestByID', async (req, res) => {
|
||||||
|
const { contestID } = req.body;
|
||||||
|
if(!contestID)
|
||||||
|
return res.status(400).json({error: 'No Contest ID'});
|
||||||
|
try{
|
||||||
|
const contest = await getContestByID(contestID);
|
||||||
|
res.json(contest);
|
||||||
|
} catch(err){
|
||||||
|
if(err.message === 'Contest not found'){
|
||||||
|
return res.status(404).json({ error: 'Contest not found' });
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
console.error(err);
|
||||||
|
res.status(500).json({ error: 'Internal server error' });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
router.post('/getActiveContest', async (req, res) => {
|
||||||
|
const { email } = req.body;
|
||||||
|
try {
|
||||||
|
const table = await AdminorUser(email);
|
||||||
|
let AdminID;
|
||||||
|
if (table === 'Users') {
|
||||||
|
const admin = await getAdminFromUser(email);
|
||||||
|
AdminID = admin.AdminID;
|
||||||
|
} else {
|
||||||
|
AdminID = await getAdminID(email);
|
||||||
|
}
|
||||||
|
const contests = await getActiveContest(AdminID);
|
||||||
|
if (contests.length === 0) {
|
||||||
|
return res.status(200).json({ message: 'No active contests found' });
|
||||||
|
}
|
||||||
|
res.json(contests[0]);
|
||||||
|
} catch (err) {
|
||||||
|
console.error(err.message);
|
||||||
|
return res.status(500).json({ error: 'An error occurred while fetching the active contest' });
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
export default router;
|
@ -0,0 +1,117 @@
|
|||||||
|
import { AdminorUser } from "../server.js";
|
||||||
|
import { Router } from "express";
|
||||||
|
import { addFlag, setNewActiveFlag, clearActiveFlag, getFlagFromContestID, deleteFlagsFromContest, DeleteFlagFromSub, deleteFlag, getAllFlags, getFlagByImage, getActiveFlag} from "../queries/flagQueries.js"
|
||||||
|
const router = Router();
|
||||||
|
// add a new flag to a specific contest
|
||||||
|
router.post('/AddFlag', (req,res) => {
|
||||||
|
const { name, desc, contest, image, path, hint1, hint2, hint3} = req.body;
|
||||||
|
// getting all the hints, whether how many
|
||||||
|
let Hint1 = hint1 || '';
|
||||||
|
let Hint2 = hint2 || '';
|
||||||
|
let Hint3 = hint3 || '';
|
||||||
|
console.log("got here");
|
||||||
|
addFlag(name, desc, contest, image, path, Hint1, Hint2, Hint3)
|
||||||
|
.then(result => {
|
||||||
|
return res.status(200).json({success: true, result});
|
||||||
|
}).catch(err => {
|
||||||
|
console.error(err.message);
|
||||||
|
return res.status(500).json({error: "COULD NOT ADD FLAG"});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// Set new flag for specific user ActiveFlag
|
||||||
|
router.post('/setNewActiveFlag', async (req,res) => {
|
||||||
|
const { FlagImage, email } = req.body;
|
||||||
|
return AdminorUser(email).then((table) => {
|
||||||
|
return setNewActiveFlag(FlagImage, email, table)
|
||||||
|
}).then(result => {
|
||||||
|
console.log('Flag update:', result);
|
||||||
|
return res.status(200).json({success: true, result});
|
||||||
|
}).catch(err => {
|
||||||
|
console.error(err.message);
|
||||||
|
return res.status(500).json({error: "COULD NOT SET FLAG ACTIVE"});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
router.post('/clearActiveFlag', async(req, res) => {
|
||||||
|
const {email} = req.body;
|
||||||
|
try{
|
||||||
|
const result = await clearActiveFlag(email);
|
||||||
|
return res.status(200).json({success: true});
|
||||||
|
}catch(err){
|
||||||
|
console.error("Error clearing flag:", err.message);
|
||||||
|
return res.status(500).json({error: "Could not clear active flag"});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// delete all flags from a specific contest
|
||||||
|
router.post('/DeleteFlagsFromContest', async (req,res) => {
|
||||||
|
const { contest } = req.body;
|
||||||
|
try{
|
||||||
|
console.log("Contest:", contest);
|
||||||
|
// get all flags first and delete them from submissions
|
||||||
|
const flags = await getFlagFromContestID(contest);
|
||||||
|
console.log("Flags:", flags);
|
||||||
|
for (var i = 0; i < flags.length; i++)
|
||||||
|
await DeleteFlagFromSub(flags[i].FlagID);
|
||||||
|
const result = await deleteFlagsFromContest(contest);
|
||||||
|
console.log("Result", result);
|
||||||
|
if(result.affectedRows === 0)
|
||||||
|
return res.status(200).json({ success: true, message: "No flags found for this contest"});
|
||||||
|
return res.status(200).json({success: true});
|
||||||
|
} catch(err){
|
||||||
|
console.error("Error deleting flags from contest:", err.message);
|
||||||
|
return res.status(500).json({error: "COULD NOT DELETE FLAGS"});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// get every flag inside db
|
||||||
|
router.get('/getAllFlags', async (req,res) => {
|
||||||
|
try{
|
||||||
|
const flags = await getAllFlags();
|
||||||
|
res.json(flags);
|
||||||
|
} catch(err){ res.status(500).json({error: "FAILED TO GRAB FLAGS"})};
|
||||||
|
});
|
||||||
|
|
||||||
|
// delete specific flag with FlagID
|
||||||
|
router.post('/DeleteFlag', (req,res) => {
|
||||||
|
const { flag } = req.body;
|
||||||
|
DeleteFlagFromSub(flag);
|
||||||
|
deleteFlag(flag).then(result => {
|
||||||
|
if(result.affectedRows === 0)
|
||||||
|
return res.status(404).json({error: "FLAG NOT FOUNT"});
|
||||||
|
return res.status(200).json({success: true});
|
||||||
|
}).catch(err => {
|
||||||
|
console.error("Error deleting flag:", err.message);
|
||||||
|
return res.status(500).json({error: "COULD NOT DELETE FLAG"});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// get the active flag of a specific user
|
||||||
|
router.post('/getActiveFlag', async (req,res) => {
|
||||||
|
const { email, contest } = req.body;
|
||||||
|
try{
|
||||||
|
const table = await AdminorUser(email);
|
||||||
|
const activeFlag = await getActiveFlag(email, table);
|
||||||
|
if(activeFlag !== null){
|
||||||
|
const imageObject = {ActiveFlag: activeFlag};
|
||||||
|
const flag = await getFlagByImage(imageObject);
|
||||||
|
res.json(flag);
|
||||||
|
}
|
||||||
|
else res.status(500).json({error: "No active flag found"});
|
||||||
|
}catch(err){
|
||||||
|
console.error(err.message);
|
||||||
|
res.status(500).json({ error: "FAILED TO GET ACTIVE FLAG"});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// get every flag for a specific contest
|
||||||
|
router.post('/getAllFlagsFromContest', async (req,res) => {
|
||||||
|
const { contest } = req.body;
|
||||||
|
try{
|
||||||
|
const flags = await getFlagFromContestID(contest);
|
||||||
|
res.json(flags);
|
||||||
|
}catch(err) { res.status(500).json({error: "could not grab flags for contest"}); }
|
||||||
|
});
|
||||||
|
|
||||||
|
export default router;
|
@ -0,0 +1,66 @@
|
|||||||
|
import { getImagesForAdmin, DeleteImage, ResetFlagImage} from "../queries/imageQueries.js";
|
||||||
|
import { getAdminID } from "../queries/adminQueries.js";
|
||||||
|
import { getAllFlags } from "../queries/flagQueries.js";
|
||||||
|
import { CreateImage } from "../server.js";
|
||||||
|
import { Router } from "express";
|
||||||
|
import multer from 'multer';
|
||||||
|
const storage = multer.memoryStorage();
|
||||||
|
const upload = multer({ storage });
|
||||||
|
const router = Router();
|
||||||
|
|
||||||
|
// create an Image
|
||||||
|
router.post('/AddImage', upload.array("files"), (req,res) => {
|
||||||
|
|
||||||
|
// parse the json data that came in and the files
|
||||||
|
const jsondata = req.body.data;
|
||||||
|
let parsedjsondata = JSON.parse(jsondata);
|
||||||
|
const files = req.files;
|
||||||
|
|
||||||
|
// get all of the values
|
||||||
|
const root = parsedjsondata.root;
|
||||||
|
const imgname = parsedjsondata.imgname;
|
||||||
|
const email = parsedjsondata.email;
|
||||||
|
|
||||||
|
// create image and return
|
||||||
|
CreateImage(root, imgname, email, files);
|
||||||
|
return res.status(200).json({ success: true });
|
||||||
|
});
|
||||||
|
|
||||||
|
// get all images for Admin
|
||||||
|
router.post('/getImages', async (req,res) => {
|
||||||
|
const { email } = req.body;
|
||||||
|
try{
|
||||||
|
const Admin = await getAdminID(email);
|
||||||
|
const images = await getImagesForAdmin(Admin);
|
||||||
|
res.json(images);
|
||||||
|
} catch(err){
|
||||||
|
console.error("Error getting images:", err.message);
|
||||||
|
return res.status(500).json({error: "COULD NOT GET IMAGES"});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// delete image and replace the image of the flag that's using it
|
||||||
|
router.post('/DeleteImageReplaceFlags', (req,res) => {
|
||||||
|
const { images } = req.body;
|
||||||
|
return getAllFlags().then((flags) => {
|
||||||
|
for (var i=0; i < flags.length; i++) {
|
||||||
|
// if the flag's image is being deleted change it to ubuntu
|
||||||
|
if (flags[i].Image === images) {
|
||||||
|
ResetFlagImage(flags[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// delete the images from the database and from docker
|
||||||
|
if (images === 'ubuntu') return res.status(201).json({ success: true });
|
||||||
|
else {
|
||||||
|
DeleteImage(images);
|
||||||
|
try {
|
||||||
|
execSync(`docker rmi -f ${images}`);
|
||||||
|
} catch (err) {
|
||||||
|
console.error(err.message);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return res.status(200).json({ success: true });
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
export default router;
|
@ -0,0 +1,51 @@
|
|||||||
|
import { Router } from "express";
|
||||||
|
import { getFlagHash } from "../server.js"
|
||||||
|
import { getUserID } from "../queries/userQueries.js";
|
||||||
|
import { getSubmissions, insertSubmission, updateSubmissionAttempts } from "../queries/submissionQueries.js";
|
||||||
|
const router = Router();
|
||||||
|
|
||||||
|
router.post('/checkFlagSubmission', async (req, res) => {
|
||||||
|
const { email, flagID, submittedFlag } = req.body;
|
||||||
|
try{
|
||||||
|
const correctFlag = getFlagHash(email, flagID);
|
||||||
|
const userID = await getUserID(email);
|
||||||
|
|
||||||
|
const submissions = await getSubmissions(userID, flagID);
|
||||||
|
if(submittedFlag === correctFlag){
|
||||||
|
if(submissions.length === 0){ //If the submission is correct and it is their first submission.
|
||||||
|
await insertSubmission(userID, flagID, 1, 1);
|
||||||
|
await updateUserFlags(userID);
|
||||||
|
return res.json({correct: true, message: "Correct flag submitted!"});
|
||||||
|
}
|
||||||
|
else{ //If the submission is correct and it is not their first submission
|
||||||
|
await updateSubmissionAttempts(userID, flagID);
|
||||||
|
await updateUserFlags(userID);
|
||||||
|
return res.json({correct: true, message: "Correct flag submitted!"});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
if(submissions.length === 0){ //If the submission is incorrect and it is their first submssion
|
||||||
|
await insertSubmission(userID, flagID, 0, 1);
|
||||||
|
return res.json({correct: false, message: "Incorrect flag. Try again!"});
|
||||||
|
}
|
||||||
|
else{ //If their submission is incorrect and it is not their first submission
|
||||||
|
await updateSubmissionAttempts(userID, flagID);
|
||||||
|
return res.json({correct: false, message: "Incorrect flag. Try again!"});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch(err){
|
||||||
|
console.error("Could not add submission:", err);
|
||||||
|
return res.status(500).json({correct: false, message: "ERROR SUBMITTING FLAG"});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
router.post('/checkPracSubmission', async (req, res) => {
|
||||||
|
const { email, flagID, submittedFlag } = req.body;
|
||||||
|
const correctFlag = getFlagHash(email, flagID);
|
||||||
|
if(correctFlag === submittedFlag)
|
||||||
|
return res.json({correct: true, message: 'Correct flag submitted!'});
|
||||||
|
else
|
||||||
|
return res.json({correct: false, message: 'Incorrect flag. Try Again'});
|
||||||
|
});
|
||||||
|
|
||||||
|
export default router;
|
@ -0,0 +1,98 @@
|
|||||||
|
import { deleteStudent, updateStudent, addStudent, setUserName, getUsersFromAdmin, getUserByEmail } from "../queries/userQueries.js";
|
||||||
|
import { getAdminID } from "../queries/adminQueries.js";
|
||||||
|
import { Router } from "express";
|
||||||
|
import bcrypt from "bcrypt";
|
||||||
|
const router = Router();
|
||||||
|
// add a student to the database
|
||||||
|
router.post('/AddStudent', async (req,res) => {
|
||||||
|
const { name, email, Aemail, password } = req.body;
|
||||||
|
try{
|
||||||
|
const Admin = await getAdminID(Aemail);
|
||||||
|
const saltRounds = 10;
|
||||||
|
const hashedPassword = await bcrypt.hash(password, saltRounds);
|
||||||
|
const result = await addStudent(name, email, hashedPassword, Admin);
|
||||||
|
return res.status(200).json({success: true});
|
||||||
|
} catch(err){
|
||||||
|
console.error("Error adding student", err.message);
|
||||||
|
return res.statusMessage(500).json({error: "Could not add student"});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// update a student in the database
|
||||||
|
router.post('/UpdateStudent', async (req,res) => {
|
||||||
|
const { email, password } = req.body;
|
||||||
|
try{
|
||||||
|
const saltRounds = 10;
|
||||||
|
const hashedPassword = await bcrypt.hash(password, saltRounds);
|
||||||
|
const result = await updateStudent(email, hashedPassword);
|
||||||
|
if(result.affectedRows === 0)
|
||||||
|
return res.status(404).json({error: "Student not found"});
|
||||||
|
return res.status(200).json({success: true});
|
||||||
|
} catch(err){
|
||||||
|
console.error('Error updating student:', err.message);
|
||||||
|
return res.status(500).json({error: "Could not update password"});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// delete a student from the database
|
||||||
|
router.post('/DeleteStudent', (req,res) => {
|
||||||
|
const {email} = req.body;
|
||||||
|
deleteStudent(email).then((result) => {
|
||||||
|
if(result.affectedRows === 0)
|
||||||
|
return res.status(404).json({error: "NO STUDENT"});
|
||||||
|
return res.status(200).json({success: true});
|
||||||
|
}).catch((err) => {
|
||||||
|
console.error(err.message);
|
||||||
|
return res.status(500).json({error: "COULD NOT DELETE STUDENT"});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// get all of the users with the same key as admin
|
||||||
|
router.post('/getAllUsers', (req,res) => {
|
||||||
|
const { email } = req.body;
|
||||||
|
return getAdminID(email).then((Admin) => {
|
||||||
|
return getUsersFromAdmin(Admin).then((users) => {
|
||||||
|
if(users.length === 0)
|
||||||
|
res.status(404).json({error: "NO ADMIN/USERS FOUND"});
|
||||||
|
else
|
||||||
|
res.json(users);
|
||||||
|
}).catch((err) => {
|
||||||
|
console.error(err.message);
|
||||||
|
res.status(500).json({error: "COULD NOT FIND USER"});
|
||||||
|
});
|
||||||
|
}).catch((err) => {
|
||||||
|
console.error(err.message);
|
||||||
|
res.status(500).json({error: "COULD NOT FIND ADMIN"});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
// return everything on a user by email
|
||||||
|
router.post('/getUser', async(req,res) => {
|
||||||
|
const { email } = req.body;
|
||||||
|
return getUserByEmail('Users',email).then((row) => {
|
||||||
|
if (row) res.json(row);
|
||||||
|
else return res.status(404).json({ error: 'USER NOT FOUND' });
|
||||||
|
})
|
||||||
|
});
|
||||||
|
|
||||||
|
router.post('/getUsername', async(req,res) => {
|
||||||
|
const { email } = req.body;
|
||||||
|
return getUserByEmail('Users',email).then((row) => {
|
||||||
|
if (row) res.json(row.Name);
|
||||||
|
else return res.status(404).json({ error: 'USER NOT FOUND' });
|
||||||
|
})
|
||||||
|
});
|
||||||
|
|
||||||
|
// set the new name of the user
|
||||||
|
router.post('/setUserName', async (req,res) => {
|
||||||
|
const { name, email } = req.body;
|
||||||
|
try{
|
||||||
|
await setUserName(name, email);
|
||||||
|
res.status(200).json({success: true});
|
||||||
|
}catch(err){
|
||||||
|
console.error(err.message);
|
||||||
|
res.status(500).json({error: err.message});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
export default router;
|
Loading…
Reference in new issue