More configuration and bit less ugly config layout for captcha

merge-requests/208/head
Thomas Lynch 4 years ago
parent 387a72572c
commit 646cc551b7
  1. 9
      configs/main.js.example
  2. 2
      gulp/res/js/locals.js
  3. 2
      gulpfile.js
  4. 41
      helpers/captcha/generators/grid.js
  5. 2
      helpers/checks/captcha.js
  6. 2
      helpers/render.js
  7. 2
      server.js

@ -47,13 +47,16 @@ nano module.exports = {
siteKey: 'zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz',
secretKey: 'zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz'
},
distortion: 9,
grid: {
size: 4,
imageSize: 120,
iconYOffset: 15,
},
numDistorts: {
min: 3,
max: 4
},
imageSize: 120,
gridSize: 4,
distortion: 9,
},
/* dnsbl, will add a small delay for uncached requests. You could also install some

@ -1,4 +1,4 @@
const themes = ['amoled', 'chaos', 'choc', 'clear', 'darkblue', 'gurochan', 'lain', 'miku', 'navy', 'pink', 'rei-zero', 'robot', 'tomorrow', 'tomorrow2', 'win95', 'yotsuba b', 'yotsuba'];
const codeThemes = ['a11y-dark', 'a11y-light', 'agate', 'an-old-hope', 'androidstudio', 'arduino-light', 'arta', 'ascetic', 'atelier-cave-dark', 'atelier-cave-light', 'atelier-dune-dark', 'atelier-dune-light', 'atelier-estuary-dark', 'atelier-estuary-light', 'atelier-forest-dark', 'atelier-forest-light', 'atelier-heath-dark', 'atelier-heath-light', 'atelier-lakeside-dark', 'atelier-lakeside-light', 'atelier-plateau-dark', 'atelier-plateau-light', 'atelier-savanna-dark', 'atelier-savanna-light', 'atelier-seaside-dark', 'atelier-seaside-light', 'atelier-sulphurpool-dark', 'atelier-sulphurpool-light', 'atom-one-dark-reasonable', 'atom-one-dark', 'atom-one-light', 'brown-paper', 'brown-papersq', 'codepen-embed', 'color-brewer', 'darcula', 'dark', 'default', 'docco', 'dracula', 'far', 'foundation', 'github-gist', 'github', 'gml', 'googlecode', 'gradient-dark', 'grayscale', 'gruvbox-dark', 'gruvbox-light', 'hopscotch', 'hybrid', 'idea', 'ir-black', 'isbl-editor-dark', 'isbl-editor-light', 'kimbie.dark', 'kimbie.light', 'lightfair', 'lioshi', 'magula', 'mono-blue', 'monokai-sublime', 'monokai', 'night-owl', 'nnfx-dark', 'nnfx', 'nord', 'obsidian', 'ocean', 'paraiso-dark', 'paraiso-light', 'pojoaque', 'pojoaque', 'purebasic', 'qtcreator_dark', 'qtcreator_light', 'railscasts', 'rainbow', 'routeros', 'school-book', 'school-book', 'shades-of-purple', 'solarized-dark', 'solarized-light', 'srcery', 'sunburst', 'tomorrow-night-blue', 'tomorrow-night-bright', 'tomorrow-night-eighties', 'tomorrow-night', 'tomorrow', 'vs', 'vs2015', 'xcode', 'xt256', 'zenburn'];
const captchaType = 'grid';
const SERVER_TIMEZONE = 'UTC'
const SERVER_TIMEZONE = 'UTC';

@ -224,7 +224,7 @@ function custompages() {
postFilesSize: formatSize(configs.globalLimits.postFilesSize.max),
captchaType: configs.captchaOptions.type,
googleRecaptchaSiteKey: configs.captchaOptions.google.siteKey,
captchaGridSize: configs.captchaOptions.gridSize,
captchaGridSize: configs.captchaOptions.grid.size,
commit,
}
}))

@ -15,9 +15,9 @@ const gm = require('gm').subClass({ imageMagick: true })
return ((g / div) | 0) + min;
}
, padding = 30
, width = captchaOptions.imageSize+padding
, height = captchaOptions.imageSize+padding
, gridSize = captchaOptions.gridSize
, width = captchaOptions.grid.imageSize+padding
, height = captchaOptions.grid.imageSize+padding
, gridSize = captchaOptions.grid.size
, zeros = ['○','□','♘','♢','▽','△','♖','✧','♔','♘','♕','♗','♙','♧']
, ones = ['●','■','♞','♦','▼','▲','♜','✦','♚','♞','♛','♝','♟','♣']
, colors = ['#FF8080', '#80FF80', '#8080FF', '#FF80FF', '#FFFF80', '#80FFFF']
@ -33,19 +33,21 @@ module.exports = async () => {
const captchaId = await Captchas.insertOne(boolArray).then(r => r.insertedId);
const distorts = [];
const numDistorts = await randomRange(captchaOptions.numDistorts.min,captchaOptions.numDistorts.max);
const div = width/numDistorts;
for (let i = 0; i < numDistorts; i++) {
const divStart = (div*i)
, divEnd = (div*(i+1));
const originx = await randomRange(divStart, divEnd)
, originy = await randomRange(0,height);
const destx = await randomRange(Math.max(captchaOptions.distortion,originx-captchaOptions.distortion),Math.min(width-captchaOptions.distortion,originx+captchaOptions.distortion))
, desty = await randomRange(Math.max(captchaOptions.distortion,originy-captchaOptions.distortion*2),Math.min(height-captchaOptions.distortion,originy+captchaOptions.distortion*2));
distorts.push([
{x:originx,y:originy},
{x:destx,y:desty}
]);
if (captchaOptions.distortion > 0) {
const numDistorts = await randomRange(captchaOptions.numDistorts.min,captchaOptions.numDistorts.max);
const div = width/numDistorts;
for (let i = 0; i < numDistorts; i++) {
const divStart = (div*i)
, divEnd = (div*(i+1));
const originx = await randomRange(divStart, divEnd)
, originy = await randomRange(0,height);
const destx = await randomRange(Math.max(captchaOptions.distortion,originx-captchaOptions.distortion),Math.min(width-captchaOptions.distortion,originx+captchaOptions.distortion))
, desty = await randomRange(Math.max(captchaOptions.distortion,originy-captchaOptions.distortion*2),Math.min(height-captchaOptions.distortion,originy+captchaOptions.distortion*2));
distorts.push([
{x:originx,y:originy},
{x:destx,y:desty}
]);
}
}
return new Promise(async(resolve, reject) => {
@ -58,7 +60,7 @@ module.exports = async () => {
let cxOffset = await randomRange(0, spaceSize*1.5);
for(let i = 0; i < gridSize; i++) {
const index = (j*gridSize)+i;
const cyOffset = await randomRange(0, spaceSize/2);
const cyOffset = await randomRange(0, captchaOptions.grid.iconYOffset);
const charIndex = await randomRange(0, ones.length-1);
const character = (boolArray[index] ? ones : zeros)[charIndex];
captcha.fontSize((await randomRange(20,30)))
@ -70,8 +72,11 @@ module.exports = async () => {
}
}
if (captchaOptions.distortion > 0) {
captcha.distort(distorts, 'Shepards');
}
captcha
.distort(distorts, 'Shepards')
.edge(25)
.write(`${uploadDirectory}/captcha/${captchaId}.jpg`, (err) => {
if (err) {

@ -26,7 +26,7 @@ module.exports = async (captchaInput, captchaId) => {
switch (captchaOptions.type) {
case 'grid': //grid captcha
const gridCaptchaMongoId = ObjectId(captchaId);
const normalisedAnswer = new Array(captchaOptions.gridSize**2).fill(false);
const normalisedAnswer = new Array(captchaOptions.grid.size**2).fill(false);
captchaInput.forEach(num => {
normalisedAnswer[+num] = true;
});

@ -30,7 +30,7 @@ switch (captchaOptions.type) {
renderLocals.googleRecaptchaSiteKey = captchaOptions.google.siteKey;
break;
case 'grid':
renderLocals.captchaGridSize = captchaOptions.gridSize;
renderLocals.captchaGridSize = captchaOptions.grid.size;
break;
default:
break;

@ -80,7 +80,7 @@ const express = require('express')
app.locals.googleRecaptchaSiteKey = captchaOptions.google.siteKey;
break;
case 'grid':
app.locals.captchaGridSize = captchaOptions.gridSize;
app.locals.captchaGridSize = captchaOptions.grid.size;
break;
default:
break;

Loading…
Cancel
Save