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
(define-module (plugin captcha-plaintext)
#:use-module (utils)
#:use-module (crypto)
#:use-module (webserver-utils)
#:use-module (plugin captcha-interface)
#:export (captcha-plaintext
captcha-plaintext-with-wordlist
make-captcha-plaintext-with-wordlist))
(define (input-field-name challenge)
(string-append "plaintext-captcha-"
(assoc-ref challenge 'id)))
(define (generate-challenge)
`((string . ,(random-string-in-collection 15 char-collection-alpha-numeric))
(id . ,(random-string-in-collection 15 char-collection-alpha-numeric))))
(define (generate-challenge-with-wordvector wordvector)
`((string . ,(vector-pick-random wordvector))
(id . ,(random-string-in-collection 15 char-collection-alpha-numeric))))
(define (generate-challenge-with-wordlist wordlist)
(generate-challenge-with-wordvector (list->vector wordlist)))
(define (render-challenge challenge)
`(div (@ (class "captcha plaintext"))
(span ,(string-append
"Please copy the following string into the form below"
" to proof your minimal intelligence: "
(assoc-ref challenge 'string)))
(label (@ (style ("display: block;")))
(span (@ (class "text")) "Captcha:")
(input (@ (name ,(input-field-name challenge))
(type "text")))
(input (@ (type "submit")
(value "Verify"))))))
(define (validate-input challenge get-form-field)
(define input (get-form-field (input-field-name challenge)))
(and (string? input)
(string=? (assoc-ref challenge 'string) input)))
(define default-wordlist
'("mislead" "distort" "abuse" "irritate" "frustrate" "invade" "violate"))
(define* (make-captcha-plaintext-with-wordlist #:optional (wordlist default-wordlist))
(make-captcha-plugin 'captcha-plaintext-with-wordlist
(lambda () (generate-challenge-with-wordlist wordlist))
render-challenge
validate-input))
(define captcha-plaintext-with-wordlist
(make-captcha-plaintext-with-wordlist))
(define captcha-plaintext
(make-captcha-plugin 'captcha-plaintext
generate-challenge
render-challenge
validate-input))