Skip to content
Snippets Groups Projects
Commit add2dc0f authored by kaiyou's avatar kaiyou
Browse files

Enable signup captcha

parent 6e44e1dd
No related branches found
No related tags found
1 merge request!20Add 'remember me' button
Pipeline #699 passed
from hiboo.captcha import captcha
from wtforms import validators, fields from wtforms import validators, fields
from flask_babel import lazy_gettext as _ from flask_babel import lazy_gettext as _
...@@ -19,6 +20,7 @@ class SignupForm(flask_wtf.FlaskForm): ...@@ -19,6 +20,7 @@ class SignupForm(flask_wtf.FlaskForm):
password = fields.PasswordField(_('Password'), [validators.DataRequired()]) password = fields.PasswordField(_('Password'), [validators.DataRequired()])
password2 = fields.PasswordField(_('Confirm password'), password2 = fields.PasswordField(_('Confirm password'),
[validators.DataRequired(), validators.EqualTo('password')]) [validators.DataRequired(), validators.EqualTo('password')])
captcha = captcha.GeneratedTextImageCaptchaField('Prove that you are human, copy the following text')
submit = fields.SubmitField(_('Sign up')) submit = fields.SubmitField(_('Sign up'))
......
from wtforms import widgets from wtforms import widgets
from hiboo import captcha
from hiboo.captcha import fields from hiboo.captcha import fields
from flask_babel import lazy_gettext as _
import random import random
import string import string
import io import io
import os
import base64 import base64
from PIL import Image, ImageDraw, ImageFont from PIL import Image, ImageDraw, ImageFont
...@@ -49,9 +52,10 @@ class ImageCaptchaField(fields.CaptchaField): ...@@ -49,9 +52,10 @@ class ImageCaptchaField(fields.CaptchaField):
widget = widgets.TextInput() widget = widgets.TextInput()
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
self.font = ImageFont.truetype("captcha.ttf", 14) font_path = os.path.join(captcha.__path__[0], "captcha.ttf")
self.font = ImageFont.truetype(font_path, 14)
self.bgcolor = "#ffffff" self.bgcolor = "#ffffff"
self.fgcolor = "#ff6677" self.fgcolor = "#000000"
super(ImageCaptchaField, self).__init__(*args, **kwargs) super(ImageCaptchaField, self).__init__(*args, **kwargs)
def __call__(self, **kwargs): def __call__(self, **kwargs):
...@@ -59,7 +63,6 @@ class ImageCaptchaField(fields.CaptchaField): ...@@ -59,7 +63,6 @@ class ImageCaptchaField(fields.CaptchaField):
self.make_image(self.context["challenge"]).save(png, "PNG") self.make_image(self.context["challenge"]).save(png, "PNG")
output = base64.b64encode(png.getvalue()).decode("ascii") output = base64.b64encode(png.getvalue()).decode("ascii")
return widgets.HTMLString( return widgets.HTMLString(
'<p>{}</p>'.format(self.context["challenge"]) +
'<p><img src="data:image/png;base64,{}"></p>'.format(output) '<p><img src="data:image/png;base64,{}"></p>'.format(output)
+ super(ImageCaptchaField, self).__call__(**kwargs) + super(ImageCaptchaField, self).__call__(**kwargs)
) )
...@@ -105,7 +108,6 @@ class GeneratedTextImageCaptchaField(ImageCaptchaField): ...@@ -105,7 +108,6 @@ class GeneratedTextImageCaptchaField(ImageCaptchaField):
charset = string.ascii_uppercase + string.digits charset = string.ascii_uppercase + string.digits
def challenge(self): def challenge(self):
self.label = "Please copy the following text: "
length = random.randint(5,8) length = random.randint(5,8)
return "".join(random.choice(self.charset) for _ in range(length)) return "".join(random.choice(self.charset) for _ in range(length))
...@@ -113,4 +115,4 @@ class GeneratedTextImageCaptchaField(ImageCaptchaField): ...@@ -113,4 +115,4 @@ class GeneratedTextImageCaptchaField(ImageCaptchaField):
return challenge.lower() == field.data.lower() return challenge.lower() == field.data.lower()
def make_image(self, challenge): def make_image(self, challenge):
return self.make_text(challenge) return self.make_text(challenge + " ")
File added
from wtforms import fields
from hiboo.captcha import captcha
import flask_wtf
class DisplayForm(flask_wtf.FlaskForm):
test = fields.StringField()
captcha = captcha.GeneratedTextImageCaptchaField()
submit = fields.SubmitField()
from hiboo.captcha import blueprint, forms
import flask
@blueprint.route("/captcha", methods=["GET", "POST"])
def captcha():
form = forms.DisplayForm()
if form.validate_on_submit():
return "captcha is ok"
else:
return flask.render_template("captcha.html", form=form)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment