66from flask import Blueprint , render_template , flash , request , redirect , url_for
77from flask_login import current_user , login_required
88
9- from FlaskRTBCTF import db
109from FlaskRTBCTF .users .models import User , Logs
11- from FlaskRTBCTF .utils import is_past_running_time
10+ from FlaskRTBCTF .utils import db , cache , is_past_running_time , admin_only
1211from .models import Machine
13- from .forms import UserHashForm , RootHashForm
12+ from .forms import UserHashForm , RootHashForm , MachineForm
1413
1514
1615ctf = Blueprint ("ctf" , __name__ )
1716
1817
19- # context processor
20-
21-
22- @ctf .context_processor
23- def inject_context ():
24- boxes = Machine .query .all ()
25- past_running_time = is_past_running_time ()
26-
27- return dict (boxes = boxes , past_running_time = past_running_time )
28-
29-
3018# Scoreboard
3119
3220
3321@ctf .route ("/scoreboard" )
34- @login_required
22+ @cache . cached ( timeout = 120 , key_prefix = "scoreboard" )
3523def scoreboard ():
36- users_score = User .query .order_by (User .points .desc ()).all ()
37- userNameScoreList = []
38- for u in users_score :
39- userNameScoreList .append ({"username" : u .username , "score" : u .points })
24+ users_scores = (
25+ User .query .with_entities (User .username , User .points )
26+ .order_by (User .points .desc ())
27+ .all ()
28+ )
4029
41- return render_template ("scoreboard.html" , scores = userNameScoreList )
30+ return render_template ("scoreboard.html" , scores = users_scores )
4231
4332
4433# Machines Info
@@ -50,7 +39,11 @@ def machines():
5039 userHashForm = UserHashForm ()
5140 rootHashForm = RootHashForm ()
5241
42+ boxes = Machine .get_all ()
43+ past_running_time = is_past_running_time ()
44+
5345 if request .method == "GET" :
46+
5447 log = Logs .query .get (current_user .id )
5548
5649 # check if it is the first visit to machine page for user
@@ -60,50 +53,106 @@ def machines():
6053 db .session .commit ()
6154
6255 else :
63- if is_past_running_time () :
56+ if past_running_time :
6457 flash ("Sorry! CTF has ended." , "danger" )
6558 return redirect (url_for ("ctf.machines" ))
6659
6760 """
6861 Todo: Get Object from UserMachine Model, dummy object given below
6962 """
70- user_machine : object = {
71- "machine_id" : 1 ,
72- "user_id" : 1 ,
73- "owned_user" : False ,
74- "owned_root" : False ,
75- }
76-
77- if user_machine .owned_user :
78- flash ("You already own User." , "success" )
79- return redirect (url_for ("ctf.machines" ))
80-
81- elif user_machine .owned_root :
82- flash ("You already own System." , "success" )
83- return redirect (url_for ("ctf.machines" ))
84-
85- elif userHashForm .submit_user_hash .data and userHashForm .validate_on_submit ():
63+ # user_machine: object = {
64+ # "machine_id": 1,
65+ # "user_id": 1,
66+ # "owned_user": False,
67+ # "owned_root": False,
68+ # }
69+
70+ # if user_machine.owned_user:
71+ # flash("You already own User.", "success")
72+ # return redirect(url_for("ctf.machines"))
73+
74+ # elif user_machine.owned_root:
75+ # flash("You already own System.", "success")
76+ # return redirect(url_for("ctf.machines"))
77+
78+ if userHashForm .submit_user_hash .data and userHashForm .validate_on_submit ():
8679 box = Machine .query .get (int (userHashForm .machine_id .data ))
87- user_machine .owned_user = True
80+ # user_machine.owned_user = True
8881 current_user .points += box .user_points
8982 log = Logs .query .get (current_user .id )
9083 log .userSubmissionIP = request .access_route [0 ]
9184 log .userSubmissionTime = datetime .utcnow ()
9285 log .userOwnTime = str (log .userSubmissionTime - log .machineVisitTime )
9386 db .session .commit ()
87+ cache .delete (key = "scoreboard" )
9488 flash ("Congrats! correct user hash." , "success" )
9589
9690 elif rootHashForm .submit_root_hash .data and rootHashForm .validate_on_submit ():
9791 box = Machine .query .get (int (rootHashForm .machine_id .data ))
98- user_machine .owned_root = True
92+ # user_machine.owned_root = True
9993 current_user .points += box .root_points
10094 log = Logs .query .get (current_user .id )
10195 log .rootSubmissionIP = request .access_route [0 ]
10296 log .rootSubmissionTime = datetime .utcnow ()
10397 log .rootOwnTime = str (log .rootSubmissionTime - log .machineVisitTime )
10498 db .session .commit ()
99+ cache .delete (key = "scoreboard" )
105100 flash ("Congrats! correct root hash." , "success" )
106101
102+ else :
103+ errors = userHashForm .user_hash .errors or rootHashForm .root_hash .errors
104+ for e in errors :
105+ flash (e , "danger" )
106+
107+ return redirect (url_for ("ctf.machines" ))
108+
107109 return render_template (
108- "machine.html" , userHashForm = userHashForm , rootHashForm = rootHashForm ,
110+ "machines.html" ,
111+ boxes = boxes ,
112+ past_running_time = past_running_time ,
113+ userHashForm = userHashForm ,
114+ rootHashForm = rootHashForm ,
109115 )
116+
117+
118+ @ctf .route ("/machines/new" , methods = ["GET" , "POST" ])
119+ @admin_only
120+ def new_machine ():
121+ form = MachineForm (obj = Machine .query .get (1 ))
122+ if request .method == "GET" :
123+ return render_template (
124+ "new_machine.html" , form_title = "Add New Machine" , form = form
125+ )
126+ else :
127+ if form .validate_on_submit ():
128+ new_machine = Machine ()
129+ form .populate_obj (new_machine )
130+ db .session .add (new_machine )
131+ db .session .commit ()
132+ cache .delete (key = "machines" )
133+ flash (f"{ form .name .data } has been added." , "success" )
134+ return redirect (url_for ("ctf.machines" ))
135+ else :
136+ flash (form .errors , "danger" )
137+ return redirect (request .url )
138+
139+
140+ @ctf .route ("/machines/edit/<int:id>" , methods = ["GET" , "POST" ])
141+ @admin_only
142+ def edit_machine (id ):
143+ machine = Machine .query .get_or_404 (id )
144+ form = MachineForm (obj = machine )
145+ if request .method == "GET" :
146+ return render_template (
147+ "new_machine.html" , form_title = f"Editing machine #{ id } " , form = form
148+ )
149+ else :
150+ if form .validate_on_submit ():
151+ form .populate_obj (machine )
152+ db .session .commit ()
153+ cache .delete (key = "machines" )
154+ flash (f"{ form .name .data } has been edited." , "success" )
155+ return redirect (url_for ("ctf.machines" ))
156+ else :
157+ flash (form .errors , "danger" )
158+ return redirect (request .url )
0 commit comments