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 }