- Added "HW" (Hardware) category to the platform with a dedicated icon and color
- Updated challenge grid to 6 columns on desktop to accommodate the new category - Alphabetized challenge categories in the main view and Admin panel selection - Alphabetized operators list in the Admin panel with case-insensitive sorting - Restricted visibility of Challenges, Scoreboard, and Score Matrix to authenticated users only - Secured the /state API endpoint to prevent leaking challenges, solves, teams, or internal IP (dockerIp) to guests - Implemented server-side verification of user profile in the state response to prevent client-side admin spoofing - Refactored the /state backend endpoint using async/await for better reliability and error handling - Rebranded the project from "cypherstrike-ctf" to "hipctf" across package.json, index.html, and server defaults - Synchronized browser page title with the competition name configured in the Admin panel - Fixed a "black page" issue by resolving a missing React import and adding frontend sanity checks
This commit is contained in:
@@ -49,7 +49,18 @@ export const CTFProvider: React.FC<{ children: React.ReactNode }> = ({ children
|
||||
const refreshState = useCallback(async () => {
|
||||
try {
|
||||
const newState = await api.getState();
|
||||
if (!newState || !newState.config) return;
|
||||
setState(newState);
|
||||
if (newState.user !== undefined) {
|
||||
setCurrentUser(newState.user);
|
||||
const session = localStorage.getItem('hip6_session');
|
||||
if (session && newState.user) {
|
||||
const { token } = JSON.parse(session);
|
||||
localStorage.setItem('hip6_session', JSON.stringify({ team: newState.user, token }));
|
||||
} else if (session && !newState.user) {
|
||||
localStorage.removeItem('hip6_session');
|
||||
}
|
||||
}
|
||||
} catch (err: any) {
|
||||
console.error("State refresh failed:", err);
|
||||
throw err;
|
||||
|
||||
Reference in New Issue
Block a user