summaryrefslogtreecommitdiff
path: root/deprecated-webircgateway/pkg/recaptcha
diff options
context:
space:
mode:
Diffstat (limited to 'deprecated-webircgateway/pkg/recaptcha')
-rw-r--r--deprecated-webircgateway/pkg/recaptcha/recaptcha.go59
1 files changed, 59 insertions, 0 deletions
diff --git a/deprecated-webircgateway/pkg/recaptcha/recaptcha.go b/deprecated-webircgateway/pkg/recaptcha/recaptcha.go
new file mode 100644
index 0000000..2d602fc
--- /dev/null
+++ b/deprecated-webircgateway/pkg/recaptcha/recaptcha.go
@@ -0,0 +1,59 @@
+// Google re-captcha package tweaked from http://github.com/haisum/recaptcha
+
+package recaptcha
+
+import (
+ "encoding/json"
+ "io/ioutil"
+ "net/http"
+ "net/url"
+ "time"
+)
+
+// R type represents an object of Recaptcha and has public property Secret,
+// which is secret obtained from google recaptcha tool admin interface
+type R struct {
+ URL string
+ Secret string
+ lastError []string
+}
+
+// Struct for parsing json in google's response
+type googleResponse struct {
+ Success bool
+ ErrorCodes []string `json:"error-codes"`
+}
+
+// VerifyResponse is a method similar to `Verify`; but doesn't parse the form for you. Useful if
+// you're receiving the data as a JSON object from a javascript app or similar.
+func (r *R) VerifyResponse(response string) bool {
+ r.lastError = make([]string, 1)
+ client := &http.Client{Timeout: 20 * time.Second}
+ resp, err := client.PostForm(r.URL,
+ url.Values{"secret": {r.Secret}, "response": {response}})
+ if err != nil {
+ r.lastError = append(r.lastError, err.Error())
+ return false
+ }
+ defer resp.Body.Close()
+ body, err := ioutil.ReadAll(resp.Body)
+ if err != nil {
+ r.lastError = append(r.lastError, err.Error())
+ return false
+ }
+ gr := new(googleResponse)
+ err = json.Unmarshal(body, gr)
+ if err != nil {
+ r.lastError = append(r.lastError, err.Error())
+ return false
+ }
+ if !gr.Success {
+ r.lastError = append(r.lastError, gr.ErrorCodes...)
+ }
+ return gr.Success
+}
+
+// LastError returns errors occurred in last re-captcha validation attempt
+func (r R) LastError() []string {
+ return r.lastError
+}