aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorfelix <felix@userspace.com.au>2015-04-17 01:52:41 +0000
committerfelix <felix@userspace.com.au>2015-04-17 01:52:41 +0000
commitcf6be87a86673aa8cde10935c6558b33a962a90e (patch)
treee54c6cc501ba064af9cbfa1fbc85784baf220e98
downloadgo-recaptcha-cf6be87a86673aa8cde10935c6558b33a962a90e.tar.gz
go-recaptcha-cf6be87a86673aa8cde10935c6558b33a962a90e.tar.bz2
recaptcha pkg
-rw-r--r--recaptcha.go75
1 files changed, 75 insertions, 0 deletions
diff --git a/recaptcha.go b/recaptcha.go
new file mode 100644
index 0000000..a5b35c6
--- /dev/null
+++ b/recaptcha.go
@@ -0,0 +1,75 @@
+package recaptcha
+
+import (
+ "errors"
+ "net/http"
+ "net/url"
+ "encoding/json"
+)
+
+const (
+ verifyURL = "https://www.google.com/recaptcha/api/siteverify"
+)
+
+var (
+ ErrSecretMissing = errors.New("reCaptcha secret is missing.")
+ ErrSecretInvalid = errors.New("reCaptcha secret is invalid.")
+ ErrResponseMissing = errors.New("reCaptcha response is missing.")
+ ErrResponseInvalid = errors.New("reCaptcha response is invalid.")
+)
+
+type Response struct {
+ Success bool `json:"success"`
+ // Errors from reCaptcha service
+ ErrorCodes []string `json:"error-codes"`
+ // Our errors to caller
+ Errors []error `json:"-"`
+}
+
+// Translate error code into error
+func (r *Response) getErrorFromCode(code string) error {
+ switch code {
+ case "missing-input-secret":
+ return ErrSecretMissing
+ case "invalid-input-secret":
+ return ErrSecretInvalid
+ case "missing-input-response":
+ return ErrResponseMissing
+ case "invalid-input-response":
+ return ErrResponseInvalid
+ default:
+ return nil
+ }
+}
+
+// Translate reCaptcha error codes into errors
+func (r *Response) populateErrors() {
+ for _, code := range r.ErrorCodes {
+ r.Errors = append(r.Errors, r.getErrorFromCode(code))
+ }
+}
+
+func Verify(secret string, response string, remoteip string) (*Response, error) {
+
+ values := make(url.Values)
+ values.Set("secret", secret)
+ values.Set("response", response)
+
+ resp, err := http.Get(verifyURL + "?" + values.Encode())
+ if err != nil {
+ return nil, err
+
+ }
+
+ defer resp.Body.Close()
+
+ // Collect the response into struct
+ recaptchaResponse := new(Response)
+ err = json.NewDecoder(resp.Body).Decode(recaptchaResponse); if err != nil {
+ return nil, err
+ }
+
+ recaptchaResponse.populateErrors()
+
+ return recaptchaResponse, nil
+}