From 92d20710d7cbad0781d04d45ee859a1d66b30b0d Mon Sep 17 00:00:00 2001 From: maride Date: Fri, 11 Oct 2019 14:29:01 +0200 Subject: Add points per challenge and overall scoring --- README.md | 26 ++++++++++++++------------ hosted/challenges.html | 3 +++ src/challenge.go | 5 +++++ src/seed.go | 17 ++++++++++++++--- 4 files changed, 36 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 61b41ac..4bc8643 100644 --- a/README.md +++ b/README.md @@ -32,18 +32,19 @@ The seed file should be of the following format: ``` { - "challenges": [ - { - "name": "Evil Service", - "description": "A meaningful and funny description", - "flag": "CIRCUS[IS_REALLY_COOL]", - "container": "challenge-evilservice", - "category": "Miscellaneous" - }, - { - "name": "Insecure Stuff", - [...] - ] + "challenges": [ + { + "name": "Evil Service", + "description": "A meaningful and funny description", + "flag": "CIRCUS[IS_REALLY_COOL]", + "container": "challenge-evilservice", + "category": "Miscellaneous", + "points": 100 + }, + { + "name": "Insecure Stuff", + [...] + ] } ``` @@ -76,6 +77,7 @@ The seed file should be of the following format: "name": "ChallengeName", "description": "Some meaningful, interesting and funny description", "category": "Miscellaneous", + "points": 100, "foundFlag": false, // whether the user found the flag "ContainsLaunchable": true, // if set to true: there's a container which can be started/stopped "IPAddress": "1.2.3.4" // contains the IP address if the container is running diff --git a/hosted/challenges.html b/hosted/challenges.html index e899048..6267ab7 100644 --- a/hosted/challenges.html +++ b/hosted/challenges.html @@ -38,6 +38,9 @@ {{ category }} + + {{ points }} Points +

diff --git a/src/challenge.go b/src/challenge.go index 1d0a210..3fb26d7 100644 --- a/src/challenge.go +++ b/src/challenge.go @@ -10,6 +10,7 @@ type Challenge struct { FlagTries uint Container string // this could, but is not required as well Category string + Points int } // TODO: The name "Stripped" is a bit inaccurate now. Rename. @@ -21,12 +22,14 @@ type StrippedChallenge struct { FlagTries uint `json:"flagTries"` ContainsLaunchable bool `json:"ContainsLaunchable"` IPAddress string `json:"IPAddress"` + Points int `json:"points"` } type StatsStrippedChallenge struct { Name string `json:"name"` FoundFlag int64 `json:"foundFlag"` FlagTries uint `json:"flagTries"` + Points int `json:"points"` } func stripChallenge(c Challenge) (StrippedChallenge) { @@ -38,6 +41,7 @@ func stripChallenge(c Challenge) (StrippedChallenge) { FlagTries: c.FlagTries, ContainsLaunchable: c.Container != "", IPAddress: getAddressForChallengeContainer(c.Container), + Points: c.Points, } } @@ -46,5 +50,6 @@ func stripChallengeForStatistics(c Challenge) (StatsStrippedChallenge) { Name: c.Name, FoundFlag: c.FoundFlag.Unix(), FlagTries: c.FlagTries, + Points: c.Points, } } diff --git a/src/seed.go b/src/seed.go index 805ab20..d876940 100644 --- a/src/seed.go +++ b/src/seed.go @@ -6,6 +6,7 @@ import ( "fmt" "io/ioutil" "log" + "strconv" "time" "github.com/pkg/errors" @@ -51,8 +52,10 @@ func readSeedFile(path string) ([]Challenge, error) { flag, flagOK := challenge["flag"].(string) cont, contOK := challenge["container"].(string) category, categoryOK := challenge["category"].(string) + pointsStr, pointsOK := challenge["points"].(string) + points, _ := strconv.Atoi(pointsStr) - if nameOK && descOK && flagOK && contOK && categoryOK { + if nameOK && descOK && flagOK && contOK && categoryOK && pointsOK { tmpChallenges = append(tmpChallenges, Challenge{ Name: name, Description: desc, @@ -61,9 +64,10 @@ func readSeedFile(path string) ([]Challenge, error) { FlagTries: 0, Container: cont, Category: category, + Points: points, }) } else { - log.Printf("Ignoring challenge at position %d: Not all values are parseable (name: %b, desc: %b, flag: %b, container: %b, category: %b", index, nameOK, descOK, flagOK, contOK, categoryOK) + log.Printf("Ignoring challenge at position %d: Not all values are parseable (name: %b, desc: %b, flag: %b, container: %b, category: %b, points: %b", index, nameOK, descOK, flagOK, contOK, categoryOK, pointsOK) } } @@ -116,18 +120,25 @@ func generateJSONFromChallenges() (string, error) { func generateJSONFromChallengesForStats() (string, error) { // To include only required information for statistics, we need to strip the challenge var strippedChallenges []StatsStrippedChallenge + score := 0 categories := map[string]int{} for _, challenge := range challenges { // Append challenge to list strippedChallenges = append(strippedChallenges, stripChallengeForStatistics(challenge)) - + // Raise category counter categories[challenge.Category]++ + + // Raise score if flag was found + if challenge.FoundFlag.Unix() > 0 { + score = score + challenge.Points + } } marshalled, marshalError := json.Marshal(map[string]interface{}{ "user": user, "challenges": strippedChallenges, + "score": score, }) return string(marshalled), marshalError } -- cgit 1.4.1