File: helpers.py

package info (click to toggle)
django-simple-captcha 0.6.3-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 656 kB
  • sloc: python: 1,661; makefile: 103; sh: 21
file content (120 lines) | stat: -rw-r--r-- 3,561 bytes parent folder | download
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
import random

from django.urls import reverse

from captcha.conf import settings


def math_challenge():
    operators = ("+", "*", "-")
    operands = (random.randint(1, 10), random.randint(1, 10))
    operator = random.choice(operators)
    if operands[0] < operands[1] and "-" == operator:
        operands = (operands[1], operands[0])
    challenge = "%d%s%d" % (operands[0], operator, operands[1])
    return (
        "{}=".format(challenge.replace("*", settings.CAPTCHA_MATH_CHALLENGE_OPERATOR)),
        str(eval(challenge)),
    )


def random_char_challenge():
    chars, ret = "abcdefghijklmnopqrstuvwxyz", ""
    for i in range(settings.CAPTCHA_LENGTH):
        ret += random.choice(chars)
    return ret.upper(), ret


def unicode_challenge():
    chars, ret = "äàáëéèïíîöóòüúù", ""
    for i in range(settings.CAPTCHA_LENGTH):
        ret += random.choice(chars)
    return ret.upper(), ret


def word_challenge():
    fd = open(settings.CAPTCHA_WORDS_DICTIONARY, "r")
    lines = fd.readlines()
    fd.close()
    while True:
        word = random.choice(lines).strip()
        if (
            len(word) >= settings.CAPTCHA_DICTIONARY_MIN_LENGTH
            and len(word) <= settings.CAPTCHA_DICTIONARY_MAX_LENGTH
        ):
            break
    return word.upper(), word.lower()


def huge_words_and_punctuation_challenge():
    "Yay, undocumneted. Mostly used to test Issue 39 - http://code.google.com/p/django-simple-captcha/issues/detail?id=39"
    fd = open(settings.CAPTCHA_WORDS_DICTIONARY, "rb")
    lines = fd.readlines()
    fd.close()
    word = ""
    while True:
        word1 = random.choice(lines).strip()
        word2 = random.choice(lines).strip()
        punct = random.choice(settings.CAPTCHA_PUNCTUATION)
        word = "%s%s%s" % (word1, punct, word2)
        if (
            len(word) >= settings.CAPTCHA_DICTIONARY_MIN_LENGTH
            and len(word) <= settings.CAPTCHA_DICTIONARY_MAX_LENGTH
        ):
            break
    return word.upper(), word.lower()


def noise_arcs(draw, image):
    size = image.size
    draw.arc([-20, -20, size[0], 20], 0, 295, fill=settings.CAPTCHA_FOREGROUND_COLOR)
    draw.line(
        [-20, 20, size[0] + 20, size[1] - 20], fill=settings.CAPTCHA_FOREGROUND_COLOR
    )
    draw.line([-20, 0, size[0] + 20, size[1]], fill=settings.CAPTCHA_FOREGROUND_COLOR)
    return draw


def noise_dots(draw, image):
    size = image.size
    for p in range(int(size[0] * size[1] * 0.1)):
        draw.point(
            (random.randint(0, size[0]), random.randint(0, size[1])),
            fill=settings.CAPTCHA_FOREGROUND_COLOR,
        )
    return draw


def noise_null(draw, image):
    return draw


def random_letter_color_challenge(idx, plaintext_captcha):
    # Generate colorful but balanced RGB values
    red = random.randint(64, 150)
    green = random.randint(64, 150)
    blue = random.randint(64, 150)

    # Ensure at least one channel is higher to make it colorful
    channels = [red, green, blue]
    channels[0] = random.randint(150, 255)
    random.shuffle(channels)

    # Format the color as a hex string
    return f"#{channels[0]:02X}{channels[1]:02X}{channels[2]:02X}"


def post_smooth(image):
    from PIL import ImageFilter

    return image.filter(ImageFilter.SMOOTH)


def captcha_image_url(key):
    """Return url to image. Need for ajax refresh and, etc"""
    return reverse("captcha-image", args=[key])


def captcha_audio_url(key):
    """Return url to image. Need for ajax refresh and, etc"""
    return reverse("captcha-audio", args=[key])