Commit e37a3956 authored by Sven Franck's avatar Sven Franck

added support for client-side form spam-protection (captcha/honeypot)

parent e4b0883f
...@@ -16,7 +16,9 @@ ...@@ -16,7 +16,9 @@
"type": "form", "type": "form",
"class_list": "responsive", "class_list": "responsive",
"property_dict": { "property_dict": {
"editable": true "editable": true,
"captcha": "captcha",
"public_key": "6Ldpb-oSAAAAAGwriKpk4ol1n4yjN_as6M4xv0zA"
}, },
"children": [{ "children": [{
"generate": "widget", "generate": "widget",
......
...@@ -12,7 +12,37 @@ ...@@ -12,7 +12,37 @@
// ERP5 custom methods // ERP5 custom methods
erp5 = {}, erp5 = {},
// JQM content erateerator // JQM content erateerator
factory = {}; factory = {},
// renderJS
javascript_registration_dict = {},
renderJS = {};
/* ====================================================================== */
/* MAPPING ERP5 */
/* ====================================================================== */
renderJS.declareJS = function (url) {
var result;
if (javascript_registration_dict.hasOwnProperty(url)) {
result = RSVP.resolve();
} else {
result = new RSVP.Promise(function (resolve, reject) {
var newScript;
newScript = document.createElement('script');
newScript.type = 'text/javascript';
newScript.src = url;
newScript.onload = function () {
javascript_registration_dict[url] = null;
resolve();
};
newScript.onerror = function (e) {
reject(e);
};
document.head.appendChild(newScript);
});
}
return result;
};
/* ====================================================================== */ /* ====================================================================== */
/* MAPPING ERP5 */ /* MAPPING ERP5 */
...@@ -1358,11 +1388,24 @@ ...@@ -1358,11 +1388,24 @@
doc, doc,
config, config,
value, value,
secure = spec.property_dict.captcha,
safety_box,
noscript,
fragment = factory.util.wrapInForm(spec), fragment = factory.util.wrapInForm(spec),
wrap = function (area) { wrap = function (area, captcha) {
var keys = {};
// set key so it can be retrieved when binding the form
if (captcha) {
keys.id = spec.id + "_captcha";
keys["data-key"] = spec.property_dict.public_key;
}
return factory.generateElement( return factory.generateElement(
"div", "div",
{"className": "span_" + area} {"className": "span_" + area},
{},
keys
); );
}; };
...@@ -1405,12 +1448,26 @@ ...@@ -1405,12 +1448,26 @@
fragment.appendChild(container); fragment.appendChild(container);
} }
// set captcha or anti spam protection
switch (secure) {
case "default":
console.log("secure silently")
break;
case "captcha":
if (spec.property_dict.public_key) {
safety_box = wrap(1, true);
fragment.appendChild(safety_box);
} else {
util.errorHandler({"error": "Captcha - No public key supplied"});
}
break;
}
// children (default to 1 or 2? crap!) // children (default to 1 or 2? crap!)
for (k = 0; k < spec.children.length; k += 1) { for (k = 0; k < spec.children.length; k += 1) {
// pass reference // pass reference
element = spec.children[k]; element = spec.children[k];
if (spec.form) { if (spec.form) {
// NOTE: I prefer element["reference"] JSLINT does not
element.reference = spec.id; element.reference = spec.id;
} }
container = wrap(1); container = wrap(1);
...@@ -3819,6 +3876,8 @@ ...@@ -3819,6 +3876,8 @@
j, j,
form_element, form_element,
filterable, filterable,
captcha,
result,
form_list = document.getElementsByTagName("form"), form_list = document.getElementsByTagName("form"),
filter_list = document.querySelectorAll("[data-filter]"); filter_list = document.querySelectorAll("[data-filter]");
...@@ -3835,9 +3894,21 @@ ...@@ -3835,9 +3894,21 @@
// add validation to all forms // add validation to all forms
for (j = 0; j < form_list.length; j += 1) { for (j = 0; j < form_list.length; j += 1) {
form_element = form_list[j]; form_element = form_list[j];
// console.log("foo, we have a form") captcha = document.getElementById(form_element.id + "_captcha");
//
// console.log(form_element); // add captcha
if (captcha) {
renderJS.declareJS(
"http://www.google.com/recaptcha/api/js/recaptcha_ajax.js"
).then(function(e) {
Recaptcha.create(
captcha.getAttribute("data-key"),
captcha.id,
{"theme": "red", "callback": Recaptcha.focus_response_field}
);
}).fail(util.errorHandler);
}
if (form_element.getAttribute("data-bound") === null) { if (form_element.getAttribute("data-bound") === null) {
form_element.setAttribute("data-bound", true); form_element.setAttribute("data-bound", true);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment