added reCaptcha v2
This commit is contained in:
@@ -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])
|
||||||
|
|||||||
@@ -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 %}
|
||||||
|
|||||||
@@ -127,20 +127,20 @@
|
|||||||
|
|
||||||
gtag('config', 'G-NBVRNJ9C0Y');
|
gtag('config', 'G-NBVRNJ9C0Y');
|
||||||
</script>
|
</script>
|
||||||
<script type="text/javascript" id="cookieinfo"
|
<script type="text/javascript" id="cookieinfo"
|
||||||
src="//cookieinfoscript.com/js/cookieinfo.min.js"
|
src="//cookieinfoscript.com/js/cookieinfo.min.js"
|
||||||
data-bg="#645862"
|
data-bg="#645862"
|
||||||
data-fg="#FFFFFF"
|
data-fg="#FFFFFF"
|
||||||
data-link="#F1D600"
|
data-link="#F1D600"
|
||||||
data-divlink="#FFFFFF"
|
data-divlink="#FFFFFF"
|
||||||
data-divlinkbg="#5CB85C"
|
data-divlinkbg="#5CB85C"
|
||||||
data-cookie="CookieInfoScript"
|
data-cookie="CookieInfoScript"
|
||||||
data-text-align="left"
|
data-text-align="left"
|
||||||
data-close-text="J'ai compris!"
|
data-close-text="J'ai compris!"
|
||||||
data-linkmsg = "Mentions légales"
|
data-linkmsg = "Mentions légales"
|
||||||
data-moreinfo = "https://meditation-sunyata.paris/blog/1/mentions-legales"
|
data-moreinfo = "https://meditation-sunyata.paris/blog/1/mentions-legales"
|
||||||
data-message="Les cookies que nous utilisons sont nécessaires au bon fonctionnement du site. En continuant la visite, vous déclarez accepter leur utilisation.">
|
data-message="Les cookies que nous utilisons sont nécessaires au bon fonctionnement du site. En continuant la visite, vous déclarez accepter leur utilisation.">
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -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):
|
||||||
|
|||||||
2
setup.py
2
setup.py
@@ -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 = [
|
||||||
|
|||||||
Reference in New Issue
Block a user