ctf-server

old server for hosting capture-the-flag

git clone https://9o.is/git/ctf-server.git

User.scala

(3124B)


      1 package com.jcabrra
      2 package model
      3 
      4 import net.liftweb._
      5 import mapper._
      6 import http._
      7 import util._
      8 import common._
      9 
     10 /**
     11 * The singleton that has methods for accessing the database
     12 */
     13 object User extends User with MetaMegaProtoUser[User] {
     14   override def dbTableName = "users" // define the DB table name
     15   override def screenWrap = Full(<lift:surround with="default" at="content"><lift:bind /></lift:surround>)
     16 
     17   // comment this line out to require email validations
     18   override def skipEmailValidation = true
     19 }
     20 
     21 class User extends MegaProtoUser[User] with ManyToMany {
     22   def getSingleton = User 
     23   
     24   def signupScreenFields = new FieldContainer {
     25     def allFields = List(firstName, lastName, nickName, email, password, image)
     26   }
     27   
     28   def settingsScreenFields = new FieldContainer {
     29     def allFields = List(firstName, lastName, nickName, email, image)
     30   }
     31   
     32   def passwordScreenFields = new FieldContainer {
     33     def allFields = List(password)
     34   }
     35   
     36   object capturedFlags extends MappedManyToMany(CapturedFlags, CapturedFlags.user, CapturedFlags.flag, Flag)
     37   
     38   object nickName extends MappedString(this, 32) {
     39     override def displayName = "Nick Name"
     40       
     41     override def validations = 
     42       valMinLen(2, "Last name must be 2 characters or more.") _ ::
     43       valMaxLen(32, "Last name must be 32 characters or less.") _ :: 
     44       valUnique("That nick name is taken already.") _ :: Nil
     45   }
     46   
     47   object image extends MappedString(this, 255) {
     48     override def displayName = "Image Url"
     49       
     50     val urlPattern = java.util.regex.Pattern.compile("(@)?(href=')?(HREF=')?(HREF=\")?(href=\")" +
     51         "?(https?://)?[a-zA-Z_0-9\\-]+(\\.\\w[a-zA-Z_0-9\\-]+)+(/[#&\\n\\-=?\\+\\%/\\.\\w]+)?")
     52     
     53     override def validations = 
     54       valRegex(urlPattern, "Must be a valid URL.") _ ::
     55       valMaxLen(1999, "Image URL must be 1999 characters or less.") _ :: Nil
     56   }
     57   
     58   override lazy val email: MappedEmail[User] = new MyEmail(this, 48) {
     59     override val fieldId = Some(xml.Text("users_email"))
     60   }
     61   
     62   override lazy val lastName: MappedString[User] = new MyLastName(this, 32) {
     63     override def validations = 
     64       valMinLen(2, "Last name must be 2 characters or more.") _ ::
     65       valMaxLen(32, "Last name must be 32 characters or less.") _ :: Nil
     66     
     67     override val fieldId = Some(xml.Text("users_lastName"))
     68   }
     69   
     70   override lazy val firstName: MappedString[User] = new MyFirstName(this, 32) {
     71     override def validations = 
     72       valMinLen(2, "First name must be 2 characters or more.") _ ::
     73       valMaxLen(32, "First name must be 32 characters or less.") _ :: Nil
     74     
     75     override val fieldId = Some(xml.Text("users_firstName"))
     76   }
     77   
     78   /* The least amount of challenges needed to win */
     79   def howManyToWin(flags: List[Flag] = Nil, nodesAway: Int = -1): Int = 
     80     if(capturedFlags.isEmpty)
     81       Flag.findAll.size
     82     else if(flags.exists(f => capturedFlags.exists(_.id == f.id)))
     83       nodesAway
     84     else {
     85       val prevFlags = 
     86         if(flags.isEmpty) Flag.findAll.filter(_.winner.get) 
     87         else flags.flatMap(_.prerequisite)
     88         
     89       howManyToWin(prevFlags, nodesAway + 1)
     90     }
     91 
     92 }