added reCaptcha v2

This commit is contained in:
2022-06-09 16:00:06 +02:00
parent b139c005e3
commit df29424905
5 changed files with 63 additions and 30 deletions

View File

@@ -2,6 +2,7 @@ from wtforms import Form, StringField, TextAreaField, SelectField, RadioField
from wtforms import IntegerField, PasswordField from wtforms import IntegerField, PasswordField
from wtforms.validators import InputRequired, Length, Email from wtforms.validators import InputRequired, Length, Email
from wtforms.widgets import HiddenInput from wtforms.widgets import HiddenInput
from wtfrecaptcha.fields import RecaptchaField
strip_filter = lambda x: x.strip() if x else None strip_filter = lambda x: x.strip() if x else None
@@ -28,14 +29,6 @@ class UserCreateForm(Form):
filters=[strip_filter]) filters=[strip_filter])
password = PasswordField('Mot de passe', validators=[InputRequired(), Length(min=6)]) password = PasswordField('Mot de passe', validators=[InputRequired(), Length(min=6)])
class ContactForm(Form):
name = StringField('Nom', validators=[InputRequired(), Length(min=1, max=255)],
filters=[strip_filter])
email = StringField('Email', validators=[InputRequired(), Length(min=1, max=255), Email()],
filters=[strip_filter])
comments = TextAreaField('Message', validators=[InputRequired(), Length(min=1)],
filters=[strip_filter])
class TopicForm(Form): class TopicForm(Form):
topic = StringField('Rubrique', validators=[InputRequired(), Length(min=1, max=25)], topic = StringField('Rubrique', validators=[InputRequired(), Length(min=1, max=25)],
filters=[strip_filter]) filters=[strip_filter])

View File

@@ -158,13 +158,29 @@
</div> </div>
</div> </div>
<textarea class="form-control" id="comments" name="comments" placeholder="Message - Tin nhắn" required rows="5"></textarea> <textarea class="form-control" id="comments" name="comments" placeholder="Message - Tin nhắn" required rows="5"></textarea>
<p class="matngot"><input class="form-control" id="matngot" name="matngot" type="text"></p>
<br> <br>
<button class="btn btn-primary" type="submit" name="form.submitted">Envoyer</button> <div class="g-recaptcha" data-sitekey="6LeDvVUgAAAAAOqD_-h93kd5aW8CmpeVvKYu-m0p" data-callback='recaptchaCallback'></div>
<input type="hidden" id="response" name="response" value="" />
<br>
<button class="btn btn-primary hidden" id="btnSubmit" type="submit" name="form.submitted">Envoyer</button>
</form> </form>
</div> </div>
</div> </div>
</div> </div>
<script src="https://www.google.com/recaptcha/api.js" async defer></script>
<script>
function recaptchaCallback() {
var btnSubmit = document.getElementById("btnSubmit");
var response = grecaptcha.getResponse();
document.getElementById("response").value = response;
if ( btnSubmit.classList.contains("hidden") ) {
btnSubmit.classList.remove("hidden");
btnSubmit.classList.add("show");
}
}
</script>
{% endblock %} {% endblock %}

View File

@@ -16,6 +16,8 @@ import os
from PIL import Image from PIL import Image
import shutil import shutil
import magic import magic
import json
from urllib import request, parse
@view_config(route_name='home', @view_config(route_name='home',
@@ -43,16 +45,16 @@ def home(request):
name = '' name = ''
email = '' email = ''
comments = '' comments = ''
matngot = ''
if 'form.submitted' in request.params : if 'form.submitted' in request.params :
name = request.params['name'] name = request.params['name']
email = request.params['email'] email = request.params['email']
comments = request.params['comments'] comments = request.params['comments']
matngot = request.params['matngot'] response = request.params['response']
# honeypot matngot filled ? # verification reCaptcha ?
if not matngot and comments != '': ok, erreur = captcha_verify(response, request.remote_addr)
if ok and comments != '':
# no, message is not spam, send it # no, message is not spam, send it
body = """ body = """
Bonjour, Bonjour,
@@ -75,7 +77,7 @@ webmaster@meditation-sunyata.paris
message.add_recipient('phuoc@caotek.fr') message.add_recipient('phuoc@caotek.fr')
mailer = request.registry['mailer'] mailer = request.registry['mailer']
mailer.send_immediately(message) mailer.send_immediately(message)
request.session.flash("Votre message a bien été envoyé au webmestre. Merci de votre intérêt pour notre site", "success") request.session.flash("Votre message a bien été envoyé au webmestre. Merci de votre intérêt pour notre site.", "success")
return { return {
'page_title': "", 'page_title': "",
@@ -87,6 +89,26 @@ webmaster@meditation-sunyata.paris
'comments': comments, 'comments': comments,
} }
def captcha_verify(response, remote_addr):
VERIFY_URL = 'https://www.google.com/recaptcha/api/siteverify'
data = {
'secret': '6LeDvVUgAAAAAGASZXCmcmhh-KtBWTZjXpLpKdNt',
'response': response,
'remoteip': remote_addr,
}
encoded = parse.urlencode(data).encode()
req = request.Request(VERIFY_URL, data=encoded)
with request.urlopen(req) as resp:
json_resp = json.loads(resp.read().decode('utf-8'))
if json_resp['success']:
return (True, None)
else:
return (False, json_resp['error-codes'])
@view_config(route_name='settings', renderer='cao_blogr:templates/settings.jinja2', permission='view') @view_config(route_name='settings', renderer='cao_blogr:templates/settings.jinja2', permission='view')
def settings(request): def settings(request):

View File

@@ -22,12 +22,14 @@ requires = [
'transaction', 'transaction',
'zope.sqlalchemy', 'zope.sqlalchemy',
'wtforms==2.2.1', # form library 'wtforms==2.2.1', # form library
'wtforms-recaptcha',
'webhelpers2==2.0', # various web building related helpers 'webhelpers2==2.0', # various web building related helpers
'passlib', 'passlib',
'python-magic', 'python-magic',
'Pillow == 6.1.0', 'Pillow == 6.1.0',
'unidecode', 'unidecode',
'markdown2', 'markdown2',
'urllib',
] ]
tests_require = [ tests_require = [