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 }