1
1
import platform
2
+ from functools import wraps
2
3
3
4
from flask import (
5
+ abort ,
4
6
Blueprint ,
5
7
jsonify ,
6
8
redirect ,
14
16
app_views = Blueprint ("app_views" , __name__ )
15
17
16
18
19
+ def validate_challenge (view_func ):
20
+ @wraps (view_func )
21
+ def wrapper (level , name , * args , ** kwargs ):
22
+ if Level .is_valid_level (level ) and challenge_manager .has_challenge (
23
+ ChallengeKey (Level (level ), name )
24
+ ):
25
+ return view_func (level , name , * args , ** kwargs ) # valid challenge
26
+ abort (404 )
27
+
28
+ return wrapper
29
+
30
+
17
31
@sitemapper .include (changefreq = "daily" , priority = 1.0 )
18
32
@app_views .route ("/" )
19
33
def index ():
@@ -33,12 +47,9 @@ def index():
33
47
},
34
48
)
35
49
@app_views .route ("/<level>/<name>" , methods = ["GET" ])
50
+ @validate_challenge
36
51
def get_challenge (level : str , name : str ):
37
- challenge_key = ChallengeKey (Level (level ), name )
38
- if not challenge_manager .has_challenge (challenge_key ):
39
- return redirect ("/" )
40
-
41
- challenge = challenge_manager .get_challenge (challenge_key )
52
+ challenge = challenge_manager .get_challenge (ChallengeKey (Level (level ), name ))
42
53
return render_template (
43
54
"challenge.html" ,
44
55
name = name ,
@@ -51,11 +62,12 @@ def get_challenge(level: str, name: str):
51
62
52
63
53
64
@app_views .route ("/run/<level>/<name>" , methods = ["POST" ])
65
+ @validate_challenge
54
66
def run_challenge (level : str , name : str ):
55
- challenge_key = ChallengeKey (Level (level ), name )
56
67
code = request .get_data (as_text = True )
57
-
58
- result = challenge_manager .run_challenge (user_code = code , key = challenge_key )
68
+ result = challenge_manager .run_challenge (
69
+ user_code = code , key = ChallengeKey (Level (level ), name )
70
+ )
59
71
if result .passed :
60
72
message = "<h2>✅ Congratulations! You passed the test 🎉</h2>"
61
73
return jsonify ({"passed" : True , "message" : message })
0 commit comments