arnaucube
arnaucube/goCaptchaPublic Self-hosted repository
goCaptcha/serverRoutes.go
serverRoutes.goRaw
 1package main
 2
 3import (
 4	"encoding/json"
 5	"fmt"
 6	"image/jpeg"
 7	"io/ioutil"
 8	"net/http"
 9	"strings"
10
11	"gopkg.in/mgo.v2/bson"
12
13	"github.com/gorilla/mux"
14)
15
16type Routes []Route
17
18var routes = Routes{
19	Route{
20		"Index",
21		"GET",
22		"/",
23		Index,
24	},
25	Route{
26		"GetImage",
27		"GET",
28		"/image/{imageName}",
29		GetImage,
30	},
31	Route{
32		"GetCaptcha",
33		"GET",
34		"/captcha",
35		GetCaptcha,
36	},
37	Route{
38		"AnswerCaptcha",
39		"POST",
40		"/answer",
41		AnswerCaptcha,
42	},
43}
44
45//ROUTES
46
47func Index(w http.ResponseWriter, r *http.Request) {
48	fmt.Fprintln(w, "ask for images in /r")
49}
50
51func GetImage(w http.ResponseWriter, r *http.Request) {
52	vars := mux.Vars(r)
53	imageName := vars["imageName"]
54
55	imgFakePath := ImgFakePath{}
56	err := imgFakePathCollection.Find(bson.M{"fake": imageName}).One(&imgFakePath)
57	check(err)
58
59	file, err := ioutil.ReadFile(serverConfig.ImgsFolder + "/" + imgFakePath.Real)
60	if err != nil {
61		fmt.Fprintln(w, err)
62	}
63
64	pathSplited := strings.Split(imgFakePath.Real, ".")
65	imageExtension := pathSplited[len(pathSplited)-1]
66	img, err := dataToImage(file, imageExtension)
67
68	if err != nil {
69		fmt.Fprintln(w, "image "+imageName+" does not exist in server")
70	} else {
71		jpeg.Encode(w, img, nil) // Write to the ResponseWriter
72	}
73}
74func GetCaptcha(w http.ResponseWriter, r *http.Request) {
75
76	ip := strings.Split(r.RemoteAddr, ":")[0]
77	resp := generateCaptcha(serverConfig.NumImgsCaptcha, ip)
78	jsonResp, err := json.Marshal(resp)
79	check(err)
80	fmt.Fprintln(w, string(jsonResp))
81}
82
83func AnswerCaptcha(w http.ResponseWriter, r *http.Request) {
84	decoder := json.NewDecoder(r.Body)
85	var captchaAnswer CaptchaAnswer
86	err := decoder.Decode(&captchaAnswer)
87	check(err)
88	defer r.Body.Close()
89
90	ip := strings.Split(r.RemoteAddr, ":")[0]
91	resp := validateCaptcha(captchaAnswer, ip)
92	jsonResp, err := json.Marshal(resp)
93	check(err)
94	fmt.Fprintln(w, string(jsonResp))
95}