blob: 14cae774628e25e192a42a64c2ca850869964afa (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
|
(ns ctf-website.views.home
(:require [ctf-website.views.common :as common]
[ctf-website.models.scoreboard :as scoreboard]
[noir.session :as session])
(:use [noir.core :only [defpage defpartial]]
[hiccup.core :only [h]]))
(defn sorted-flags [scores]
(sort (set (mapcat keys (vals scores)))))
(defn sorted-users [scores]
(sort (keys scores)))
(defpartial
table-header [flag]
[:th flag])
(defpartial
table-cell [scores user flag]
[:td (get (get scores user) flag)])
(defpartial
table-row [scores flags user]
[:tr
[:td user]
(map (partial table-cell scores user) flags)])
(defpartial
scoreboard-table [scores]
(let [flags (sorted-flags scores)
users (sorted-users scores)]
[:table {:border "1"}
[:thead
[:th "Competitor"]
(map table-header flags)]
[:tbody
(map (partial table-row scores flags) users)]]))
(defpage
"/" []
(let [username (session/get :user)]
(common/layout
[:h1 "Austin 2600 CTF server"]
(scoreboard-table (scoreboard/get-scores))
(if (nil? username)
[:a {:href "login"} "Compete"]
[:div ;; as apposed to '(do' i guess
[:form {:method "POST"
:action "flag"}
[:p (str "Submit flag as " (h username) ":")
[:input {:type "text"
:name "flag"
:size "40"}]
[:input {:type "submit"
:value "Submit"}]]]
[:h2 "Welcome Grid Warrior"]
[:p "Test your skills with the challenges below:"]
[:dl
(when (not (scoreboard/has username "test"))
[:div ;; I don't know why this needs to be a div
[:dt "test flag"]
[:dd "- b46911b2d927d89bc2b1143a7f5d9c20"]])
[:dt "flags found in /home/ctf/flags"]
[:dd "- exec.flag"]
[:dd "- lottery.flag"]
[:dd "- rsa.flag"]
]]))))
|