arnaucube
arnaucube/goCaptchaPublic Self-hosted repository
implemented captcha validation
arnaucode idoctnef@openmailbox.org
Tue, 08 Aug 2017 21:46:47 +0200
commit

8b81f1d3193e0d07469edca2d350cb639dfccfc5

parent

22d77500bdaceac099ae9b023feeb684f803c6e4

4 files changed, 58 insertions(+), 8 deletions(-)

jump to
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)) +}