ctf-server
old server for hosting capture-the-flag
git clone https://9o.is/git/ctf-server.git
Challenges.scala
(1746B)
1 package com.jcabrra
2 package snippet
3
4 import model._
5 import comet._
6
7 import net.liftweb._
8 import util._, Helpers._
9 import http._
10 import js._
11 import JsCmds._
12 import SHtml._
13 import net.liftmodules.extras._
14
15 object Challenges extends SnippetHelper {
16
17 def render: CssSel = User.currentUser map {
18 user =>
19 ".challenges" #> idMemoize { memo =>
20 ".challenge" #> Challenge.findAll.filter(_.meetsPrerequisite(user)).map {
21 challenge =>
22
23 def process(guess: String): JsCmd =
24 if (processResponse(guess, user, challenge))
25 LiftNotice.success("Congratulations! You Got The Key!") & memo.setHtml
26 else
27 S.error("Wrong Key")
28
29 ".flag_name *" #> challenge.name &
30 ".flag_hint *" #> challenge.hint &
31 ".flag_key *" #> challenge.flags.filter(_.wasCapturedBy(user)).map (
32 flag => xml.Text(flag.answer.get.toString)) &
33 ".flag_input *" #> {
34 if(challenge.fullySolvedBy(user)) xml.NodeSeq.Empty
35 else ajaxText("", false, process _, "placeholder" -> "guess")
36 }
37 }
38 }
39 }
40
41 /* Processes the user's challenge guess. Returns true if it was correct. */
42 def processResponse(guess: String, user: User, challenge: Challenge): Boolean =
43 challenge.findFlagByGuess(guess, user).map {
44 flag =>
45 user.capturedFlags += flag
46 user.save
47 flag.capturedBy += user
48 flag.save
49 BroadcastServer ! BroadcastCorrectGuess(user, Util.ipAddress, flag, challenge)
50 true
51 } getOrElse {
52 BroadcastServer ! BroadcastWrongGuess(user, Util.ipAddress, challenge)
53 false
54 }
55
56 }