implemented captcha validation
arnaucode idoctnef@openmailbox.org
Tue, 08 Aug 2017 21:46:47 +0200
4 files changed,
58 insertions(+),
8 deletions(-)
M
captcha.go
→
captcha.go
@@ -4,6 +4,8 @@ import (
"math/rand" "os/exec" "strings" + + "gopkg.in/mgo.v2/bson" ) type Captcha struct {@@ -12,12 +14,16 @@ Imgs []string `json:"imgs"`
Question string `json:"question"` Date string `json:"date"` } -type CaptchaSolution struct { +type CaptchaSol struct { Id string `json:"id"` Imgs []string `json:"imgs"` ImgsSolution []string `json:"imgssolution"` - Question string `json:"question"` + Question string `json:"question"` //select all X Date string `json:"date"` +} +type CaptchaAnswer struct { + CaptchaId string `json:"captchaid"` + Selection []int `json:"selection"` } type ImgFakePath struct { CaptchaId string `json:"captchaid"`@@ -38,7 +44,7 @@ return rand.Intn(max-min) + min
} func generateCaptcha(count int) Captcha { var captcha Captcha - var captchaSol CaptchaSolution + var captchaSol CaptchaSol captcha.Id = generateUUID() captchaSol.Id = captcha.Id@@ -57,11 +63,36 @@ captcha.Imgs = append(captcha.Imgs, imgFakePath.Fake)
captchaSol.Imgs = append(captchaSol.Imgs, dataset[categDataset[nCateg]][nImg]) captchaSol.ImgsSolution = append(captchaSol.ImgsSolution, categDataset[nCateg]) } - captcha.Question = "Select all leopards" - captchaSol.Question = "Select all leopards" + captcha.Question = "leopard" + captchaSol.Question = "leopard" err := captchaCollection.Insert(captcha) check(err) - err = captchaSolutionCollection.Insert(captchaSol) + err = captchaSolCollection.Insert(captchaSol) check(err) return captcha } +func validateCaptcha(captchaAnswer CaptchaAnswer) bool { + var solved bool + solved = true + captchaSol := CaptchaSol{} + err := captchaSolCollection.Find(bson.M{"id": captchaAnswer.CaptchaId}).One(&captchaSol) + check(err) + for k, imgSol := range captchaSol.ImgsSolution { + if imgSol == captchaSol.Question { + if captchaAnswer.Selection[k] == 1 { + //correct + } else { + solved = false + } + } + if imgSol != captchaSol.Question { + if captchaAnswer.Selection[k] == 0 { + //correct + } else { + solved = false + } + } + } + + return solved +}
M
main.go
→
main.go
@@ -20,7 +20,7 @@ readMongodbConfig("./mongodbConfig.json")
session, err := getSession() check(err) captchaCollection = getCollection(session, "captchas") - captchaSolutionCollection = getCollection(session, "captchassolutions") + captchaSolCollection = getCollection(session, "captchassolutions") imgFakePathCollection = getCollection(session, "imgfakepath") //start the server
M
mongoConfig.go
→
mongoConfig.go
@@ -17,7 +17,7 @@
var mongoConfig MongoConfig var captchaCollection *mgo.Collection -var captchaSolutionCollection *mgo.Collection +var captchaSolCollection *mgo.Collection var imgFakePathCollection *mgo.Collection func readMongodbConfig(path string) {
M
serverRoutes.go
→
serverRoutes.go
@@ -34,6 +34,12 @@ "GET",
"/captcha", GetCaptcha, }, + Route{ + "AnswerCaptcha", + "POST", + "/answer", + AnswerCaptcha, + }, } //ROUTES@@ -74,3 +80,16 @@ jsonResp, err := json.Marshal(resp)
check(err) fmt.Fprintln(w, string(jsonResp)) } + +func AnswerCaptcha(w http.ResponseWriter, r *http.Request) { + decoder := json.NewDecoder(r.Body) + var captchaAnswer CaptchaAnswer + err := decoder.Decode(&captchaAnswer) + check(err) + defer r.Body.Close() + + resp := validateCaptcha(captchaAnswer) + jsonResp, err := json.Marshal(resp) + check(err) + fmt.Fprintln(w, string(jsonResp)) +}