summaryrefslogtreecommitdiff
path: root/api/hcaptcha/hcaptcha.go
blob: e8ea238a009a8a74057520ae1cce33beca9a7522 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
package hcaptcha

import (
	"encoding/json"
	"fmt"
	"net/http"
	"strings"

	"git.hatecomputers.club/hatecomputers/hatecomputers.club/api/types"
)

type HcaptchaArgs struct {
	SiteKey string
}

func verifyCaptcha(secret, response string) error {
	verifyURL := "https://hcaptcha.com/siteverify"
	body := strings.NewReader("secret=" + secret + "&response=" + response)

	req, err := http.NewRequest("POST", verifyURL, body)
	if err != nil {
		return err
	}

	req.Header.Set("Content-Type", "application/x-www-form-urlencoded")

	client := &http.Client{}
	resp, err := client.Do(req)
	if err != nil {
		return err
	}

	jsonResponse := struct {
		Success bool `json:"success"`
	}{}
	err = json.NewDecoder(resp.Body).Decode(&jsonResponse)
	if err != nil {
		return err
	}

	if !jsonResponse.Success {
		return fmt.Errorf("hcaptcha verification failed")
	}

	defer resp.Body.Close()
	return nil
}

func CaptchaArgsContinuation(context *types.RequestContext, req *http.Request, resp http.ResponseWriter) types.ContinuationChain {
	return func(success types.Continuation, failure types.Continuation) types.ContinuationChain {
		(*context.TemplateData)["HcaptchaArgs"] = HcaptchaArgs{
			SiteKey: context.Args.HcaptchaSiteKey,
		}
		return success(context, req, resp)
	}
}

func CaptchaVerificationContinuation(context *types.RequestContext, req *http.Request, resp http.ResponseWriter) types.ContinuationChain {
	return func(success types.Continuation, failure types.Continuation) types.ContinuationChain {
		hCaptchaResponse := req.FormValue("h-captcha-response")
		secretKey := context.Args.HcaptchaSecret

		err := verifyCaptcha(secretKey, hCaptchaResponse)
		if err != nil {
			(*context.TemplateData)["Error"] = types.BannerMessages{
				Messages: []string{"hCaptcha verification failed"},
			}
			resp.WriteHeader(http.StatusBadRequest)

			return failure(context, req, resp)
		}

		return success(context, req, resp)
	}
}