Skip to content

Commit 80fc555

Browse files
committed
Add authentication requirement for puzzle and theme management routes
1 parent a4095b7 commit 80fc555

5 files changed

Lines changed: 28 additions & 0 deletions

File tree

app/routes/puzzles.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from flask import jsonify, request, abort
22
from .. import app, loader
33
from ..utils.utils import get_puzzle_info
4+
from ..auth import login_required
45

56
@app.route('/puzzles', methods=['GET'])
67
def puzzles():
@@ -115,6 +116,7 @@ def run():
115116
return jsonify({'message': 'Theme or puzzle not found'})
116117

117118
@app.route('/puzzle/upload', methods=['POST'])
119+
@login_required
118120
def upload_puzzle():
119121
"""
120122
Upload puzzle
@@ -154,6 +156,7 @@ def upload_puzzle():
154156
return jsonify({'message': 'Puzzle uploaded'})
155157

156158
@app.route('/puzzle', methods=['DELETE'])
159+
@login_required
157160
def delete_puzzle():
158161
"""
159162
Delete puzzle

app/routes/themes.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ def theme():
6060

6161
# Create theme
6262
@app.route('/theme', methods=['POST'])
63+
@login_required
6364
def create_theme():
6465
"""
6566
Create a theme
@@ -82,6 +83,7 @@ def create_theme():
8283

8384
# Delete theme
8485
@app.route('/theme', methods=['DELETE'])
86+
@login_required
8587
def delete_theme():
8688
"""
8789
Delete a theme
@@ -105,6 +107,7 @@ def delete_theme():
105107
return jsonify({'message': 'Theme deleted'})
106108

107109
@app.route('/theme/reload', methods=['POST'])
110+
@login_required
108111
def reload():
109112
"""
110113
Reload the puzzles

frontend/src/components/FileUpload/FileUpload.tsx

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import { Button } from "primereact/button";
1313
import { Tooltip } from "primereact/tooltip";
1414
import { Tag } from "primereact/tag";
1515
import "./FileUpload.css";
16+
import AuthService from "../../services/AuthService";
1617

1718
interface FileUploadProps {
1819
theme: string;
@@ -89,9 +90,13 @@ export default function FileUploadComponent({
8990
}
9091
const fileFormData = new FormData();
9192
fileFormData.append("file", file, file.name);
93+
const token = AuthService.getToken();
9294
return fetch(`/puzzle/upload?theme=${theme}`, {
9395
method: "POST",
9496
body: fileFormData,
97+
headers: {
98+
Authorization: `Bearer ${token}`,
99+
},
95100
});
96101
})
97102
);
@@ -100,6 +105,9 @@ export default function FileUploadComponent({
100105

101106
fetch("/theme/reload", {
102107
method: "POST",
108+
headers: {
109+
Authorization: `Bearer ${AuthService.getToken()}`,
110+
},
103111
}).then((res) => {
104112
if (res.ok) {
105113
setRefresh(true);

frontend/src/pages/Home/Home.tsx

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { InputText } from "primereact/inputtext";
66
import { Dialog } from "primereact/dialog";
77
import { useEffect, useState } from "react";
88
import { convertBytes } from "../../utils/utils";
9+
import AuthService from "../../services/AuthService";
910

1011
interface HomeProps {
1112
setSelectedMenu: (menu: string) => void;
@@ -43,8 +44,13 @@ export default function HomePage({ setSelectedMenu }: HomeProps) {
4344
};
4445

4546
const handleDeleteTheme = (theme: Theme) => {
47+
const token = AuthService.getToken();
4648
fetch(`/theme?name=${theme.name}`, {
4749
method: "DELETE",
50+
headers: {
51+
Authorization: `Bearer ${token}`,
52+
"Content-Type": "application/json",
53+
},
4854
}).then((res) => {
4955
if (res.ok) {
5056
setSuccessMsg("Theme deleted successfully");
@@ -61,9 +67,11 @@ export default function HomePage({ setSelectedMenu }: HomeProps) {
6167
};
6268

6369
const handleCreateTheme = () => {
70+
const token = AuthService.getToken();
6471
fetch(`/theme?name=${newThemeName}`, {
6572
method: "POST",
6673
headers: {
74+
Authorization: `Bearer ${token}`,
6775
"Content-Type": "application/json",
6876
},
6977
}).then((res) => {

frontend/src/pages/Theme/Theme.tsx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { convertBytes } from "../../utils/utils";
77
import { Puzzle } from "../../types/Puzzle";
88
import FileUploadComponent from "../../components/FileUpload/FileUpload";
99
import { Toast } from "primereact/toast";
10+
import AuthService from "../../services/AuthService";
1011

1112
interface ThemeProps {
1213
selectedMenu: string;
@@ -35,8 +36,13 @@ export default function ThemePage({ selectedMenu }: ThemeProps) {
3536
}, [selectedTheme, refreshTheme]);
3637

3738
const handleDeletePuzzle = (puzzle: Puzzle) => {
39+
const token = AuthService.getToken();
3840
fetch(`/puzzle?theme=${selectedTheme}&puzzle=${puzzle.name}`, {
3941
method: "DELETE",
42+
headers: {
43+
Authorization: `Bearer ${token}`,
44+
"Content-Type": "application/json",
45+
},
4046
}).then((res) => {
4147
if (res.ok) {
4248
setTheme((prevTheme) => {

0 commit comments

Comments
 (0)