Browse Source

Allow reCaptcha to be disabled

isundil 2 years ago
parent
commit
ce5f6ae0ed
5 changed files with 24 additions and 5 deletions
  1. 1 1
      router/input.js
  2. 6 2
      src/config.js
  3. 2 0
      src/security.js
  4. 15 1
      templates/footer.js
  5. 0 1
      templates/header.js

+ 1 - 1
router/input.js

@@ -103,7 +103,7 @@ module.exports = { register: app => {
         const content = "" + (req.body.content || req.post);
         const privId = mCrypto.string(content);
 
-        if (req.body['g-recaptcha-response']) {
+        if (!CONFIG.reCaptchaSecret || req.body['g-recaptcha-response']) {
             const captchaOk = await Security.captchaCheck(req.body['g-recaptcha-response'], Security.getRequestIp(req));
             if (!captchaOk)
                 return app.routerUtils.jsonResponse(res, { err: "Invalid captcha input", id: null });

+ 6 - 2
src/config.js

@@ -15,6 +15,10 @@ function validNotEmptyString(input) {
     return !!input && (""+input).length;
 }
 
+function isString(input) {
+    return typeof input === 'string';
+}
+
 function pickConfig(defaultConfig, configContent) {
     let configEntries = {};
     for (let i in defaultConfig) {
@@ -45,8 +49,8 @@ let configEntries = {};
         maxPastebinSize: { value: "", valid: validNumberOrEmpty },
         maxFileUploadSize: { value: "", valid: validNumberOrEmpty },
         maxUrlSize: { value: "", valid: validNumberOrEmpty },
-        reCaptchaPublic: { value: "", valid: validNotEmptyString },
-        reCaptchaSecret: { value: "", valid: validNotEmptyString }
+        reCaptchaPublic: { value: "", valid: isString },
+        reCaptchaSecret: { value: "", valid: isString }
     };
 
     configEntries = pickConfig(defaultConfig, configContent);

+ 2 - 0
src/security.js

@@ -8,6 +8,8 @@ const CONFIG = require('./config.js');
 module.exports.getRequestIp = (req) => req.headers['x-forwarded-for'] || req.socket.remoteAddress;
 
 function captchaCheck(captcha, remoteIp) {
+    if ("" == CONFIG.reCaptchaSecret)
+        return true;
     return new Promise((ok, ko) => {
         request(`https://www.google.com/recaptcha/api/siteverify?secret=${CONFIG.reCaptchaSecret}&response=${captcha}&remoteip=${remoteIp}`,
         (err, response, body) => {

+ 15 - 1
templates/footer.js

@@ -1,2 +1,16 @@
 
-module.exports = `</div></body></html>`;
+const reCaptcha_public = require('../src/config.js').reCaptchaPublic;
+
+module.exports = `</div>
+` + (reCaptcha_public == "" ? `
+<script>
+document.querySelectorAll("form button[data-callback]").forEach(i => {
+    i.form.onsubmit = (e) => {
+        e.preventDefault();
+        eval(i.dataset.callback +'()');
+        return false;
+    };
+});
+</script>
+` : `<script src="https://www.google.com/recaptcha/api.js"></script>`) + `
+</body></html>`;

+ 0 - 1
templates/header.js

@@ -5,7 +5,6 @@ module.exports = `
 <head>
 <link type="text/css" rel="stylesheet" href="/public/mdi/materialdesignicons.min.css"/><link type="text/css" rel="stylesheet" href="/public/css/style.css"/>
 <title>{page_title}</title>
-<script src="https://www.google.com/recaptcha/api.js"></script>
 <script src="/public/js/jquery-3.6.3.min.js"></script>
 </head>
 <body>