From d339a5d78a5c4a3419a320f9a8afa41276bcfa5a Mon Sep 17 00:00:00 2001 From: jolatime Date: Fri, 2 May 2025 08:47:24 -0400 Subject: [PATCH] Fixed practice contest --- .../src/app/Helper/ContestSetup.ts | 15 +++++++------ CTF/CTF-Frontend/src/app/Helper/Helpers.ts | 8 +++++-- CTF/CTF-Frontend/src/app/Helper/User-pfp.ts | 20 +---------------- .../admin-contest/admin-contest.component.ts | 4 ++-- .../contest-page/contest-page.component.ts | 22 +++++-------------- .../app/user-menu/user-menu.component.html | 4 ++-- .../user-profile/user-profile.component.ts | 2 +- CTF/CTF-Server/routes/contestHandler.js | 2 +- 8 files changed, 27 insertions(+), 50 deletions(-) diff --git a/CTF/CTF-Frontend/src/app/Helper/ContestSetup.ts b/CTF/CTF-Frontend/src/app/Helper/ContestSetup.ts index 0903314..a32f7f5 100644 --- a/CTF/CTF-Frontend/src/app/Helper/ContestSetup.ts +++ b/CTF/CTF-Frontend/src/app/Helper/ContestSetup.ts @@ -13,8 +13,7 @@ import { User } from '../models/user.model'; let subs: Submission[] = []; let UserID: number = 0; -export async function loadPage(renderer: Renderer2, el: ElementRef, ts: any): Promise { - const isPractice = window.location.href.includes("Prac"); +export async function loadPage(renderer: Renderer2, el: ElementRef, ts: any, prac: Boolean): Promise { const taskbar: HTMLElement = document.getElementById('Taskbar')!; // basics for use in multiple methods @@ -27,7 +26,7 @@ export async function loadPage(renderer: Renderer2, el: ElementRef, ts: any): Pr hintDesc: el.nativeElement.querySelector('#Hint_Desc') as HTMLElement, HintButts: el.nativeElement.querySelector('#Hint_Butts') as HTMLElement } - await LoadContest(el, elements, ts); + await LoadContest(el, elements, ts, prac); } // get the params to see if admin or not @@ -53,12 +52,14 @@ async function getUser() { } } // load the current active contest -async function LoadContest(el: ElementRef, elements: any, ts: any) { +async function LoadContest(el: ElementRef, elements: any, ts: any, prac: Boolean) { const contestID = new URLSearchParams(window.location.search).get('contestID'); - console.log("Contest ID:", contestID); let contest: Contest | undefined; - if(contestID){ - const data = { contestID: contestID}; + if(prac === true){ + const selectedContestStr = sessionStorage.getItem('contestID'); + const selectedContest = selectedContestStr ? parseInt(selectedContestStr, 10) : null; + console.log("Contest ID:", selectedContest); + const data = { contestID: selectedContest}; const res = await fetch('api/contests/getContestByID', { method: 'POST', headers: { diff --git a/CTF/CTF-Frontend/src/app/Helper/Helpers.ts b/CTF/CTF-Frontend/src/app/Helper/Helpers.ts index 1727d1e..42edcf1 100644 --- a/CTF/CTF-Frontend/src/app/Helper/Helpers.ts +++ b/CTF/CTF-Frontend/src/app/Helper/Helpers.ts @@ -104,7 +104,8 @@ export async function InsertIntoTable(data: Contest[], router: Router): Promise< body: JSON.stringify({email}) }) let activeContest = await res3.json().catch(() => null); - if(activeContest && activeContest.error === 'NO CONTEST FOUND') activeContest = null; + console.log(activeContest); + if(!activeContest || activeContest.message === 'No active contests found') activeContest = null; data.forEach((contest: Contest) => { const row = document.createElement('tr'); const name = document.createElement('td'); @@ -136,6 +137,7 @@ export async function InsertIntoTable(data: Contest[], router: Router): Promise< const JoinButton = document.createElement('button'); JoinButton.textContent = 'Join'; JoinButton.addEventListener('click', function() { + sessionStorage.setItem('Prac', 'false'); router.navigate(['/contest-page']); }); @@ -151,7 +153,9 @@ export async function InsertIntoTable(data: Contest[], router: Router): Promise< pracButt.textContent = 'Practice'; pracButt.addEventListener('click', function() { console.log("contestID", contest.ContestID); - router.navigate(['/contest-page'], { queryParams: { email: email, contestID: contest.ContestID, Prac: true } }); + sessionStorage.setItem('Prac', 'true'); + sessionStorage.setItem('contestID', contest.ContestID.toString()); + router.navigate(['/contest-page']); }); pracButtCell.appendChild(pracButt); row.appendChild(pracButtCell); diff --git a/CTF/CTF-Frontend/src/app/Helper/User-pfp.ts b/CTF/CTF-Frontend/src/app/Helper/User-pfp.ts index e0690e7..d6e1107 100644 --- a/CTF/CTF-Frontend/src/app/Helper/User-pfp.ts +++ b/CTF/CTF-Frontend/src/app/Helper/User-pfp.ts @@ -88,8 +88,7 @@ export async function PopulateUserTables(PCData: Contest[]): Promise { leaderbutton.textContent = 'view'; leaderbutton.setAttribute('id','ViewLeaderboard'); leaderbutton.addEventListener('click', function() { - sessionStorage.setItem('ContestString', contest.Name); - Popup('/leaderboard'); + //Popup('leaderboard.html' ,getEmail(), 'ContestName=' + contest.Name); Uncomment when leaderboard is implemented }); leader.appendChild(leaderbutton); @@ -179,21 +178,4 @@ export async function setNewName(NameInput: string): Promise { }, body: JSON.stringify(data) }); -} - -// get the current username of the user -export async function getUsername(): Promise { - const data = { email: getEmail() }; - const res = await fetch('api/users/getUsername', { - method: 'POST', - headers: { - 'Content-Type' : 'application/json' - }, - body: JSON.stringify(data) - }); - if (res.ok) { - const ret = await res.json(); - return ret; - } - } \ No newline at end of file diff --git a/CTF/CTF-Frontend/src/app/admin-contest/admin-contest.component.ts b/CTF/CTF-Frontend/src/app/admin-contest/admin-contest.component.ts index ef31273..24bc728 100644 --- a/CTF/CTF-Frontend/src/app/admin-contest/admin-contest.component.ts +++ b/CTF/CTF-Frontend/src/app/admin-contest/admin-contest.component.ts @@ -19,8 +19,8 @@ export class AdminContestComponent { // attach to terminal onload this.terminalService.reattachTerminal(); - loadPage(this.renderer, this.el, this); - } + loadPage(this.renderer, this.el, this, false); + } confirmSelection(){ const confirmSelection_ = confirm("You will lose your current flag progress, are you sure?"); diff --git a/CTF/CTF-Frontend/src/app/contest-page/contest-page.component.ts b/CTF/CTF-Frontend/src/app/contest-page/contest-page.component.ts index 893014d..9e8daa4 100644 --- a/CTF/CTF-Frontend/src/app/contest-page/contest-page.component.ts +++ b/CTF/CTF-Frontend/src/app/contest-page/contest-page.component.ts @@ -15,7 +15,7 @@ import { SocketIOService } from '../notifications/socket-io.service'; }) export class ContestPageComponent implements OnInit { - isPractice = window.location.href.includes("Prac"); + isPractice: boolean = false; isAdmin: boolean = this.isItAdmin(); notificationMessage: string | null = null; @@ -26,24 +26,14 @@ export class ContestPageComponent implements OnInit { private socketService: SocketIOService) {} ngOnInit(): void { + const isItPractice = sessionStorage.getItem('Prac'); + if(isItPractice === 'true'){ + this.isPractice = true; + } // attach to terminal onload this.terminalService.reattachTerminal(); - //this.socketService.connect(); - loadPage(this.renderer, this.el, this); - /*this.socketService.listen('submission-notification').subscribe((data: any) => { - console.log('Received notification:', data); - this.notificationMessage = `${data.email} solved ${data.flagName}!`; - console.log('Updated notif:', this.notificationMessage); - setTimeout(() => { - this.notificationMessage = null; - }, 5000); - });*/ - this.socketService.listen('test-event').subscribe((data: any) => { - console.log('Test event received:', data); - this.notificationMessage = 'Test event received'; - }); - this.socketService.emit('test-event', { message: 'Hello from client' }); + loadPage(this.renderer, this.el, this, this.isPractice); } // clear and set terminal for new flag diff --git a/CTF/CTF-Frontend/src/app/user-menu/user-menu.component.html b/CTF/CTF-Frontend/src/app/user-menu/user-menu.component.html index 8040990..4ece308 100644 --- a/CTF/CTF-Frontend/src/app/user-menu/user-menu.component.html +++ b/CTF/CTF-Frontend/src/app/user-menu/user-menu.component.html @@ -29,8 +29,8 @@
-
- +
+
diff --git a/CTF/CTF-Frontend/src/app/user-profile/user-profile.component.ts b/CTF/CTF-Frontend/src/app/user-profile/user-profile.component.ts index 362f9a9..4c0a073 100644 --- a/CTF/CTF-Frontend/src/app/user-profile/user-profile.component.ts +++ b/CTF/CTF-Frontend/src/app/user-profile/user-profile.component.ts @@ -2,7 +2,7 @@ import { Component, OnInit } from '@angular/core'; import { gotoPage, logOut, getEmail } from '../Helper/Helpers'; import { Router } from '@angular/router'; import { FormsModule } from '@angular/forms'; -import { getNewName, setNewName, getUsername, loadTable } from '../Helper/User-pfp'; +import { getNewName, setNewName, loadTable } from '../Helper/User-pfp'; @Component({ selector: 'app-user-profile', diff --git a/CTF/CTF-Server/routes/contestHandler.js b/CTF/CTF-Server/routes/contestHandler.js index f8e018a..640d768 100644 --- a/CTF/CTF-Server/routes/contestHandler.js +++ b/CTF/CTF-Server/routes/contestHandler.js @@ -97,7 +97,7 @@ router.post('/getContests', async (req,res) => { } }); -router.get('/getContestByID', async (req, res) => { +router.post('/getContestByID', async (req, res) => { const { contestID } = req.body; if(!contestID) return res.status(400).json({error: 'No Contest ID'});
Contest Name