From a60c9c6320bc89745edb800ae4aeb2491d6ff01e Mon Sep 17 00:00:00 2001 From: root Date: Sun, 27 Dec 2020 20:52:45 +0100 Subject: [PATCH] Working on random captcha distorsion --- captcha/captcha.sh | 10 ++-- captcha/experimental.sh | 106 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 113 insertions(+), 3 deletions(-) create mode 100755 captcha/experimental.sh diff --git a/captcha/captcha.sh b/captcha/captcha.sh index 5138ada..fa9628c 100755 --- a/captcha/captcha.sh +++ b/captcha/captcha.sh @@ -77,7 +77,11 @@ B2_LINE_STOP_X=$((100 + $R % 40)) #B3_LINE_STOP_X=$((100 + $R % 40)) get_random -ROLL_X=$(($R % 40)) +ROLL_A=$(($R % 10 + 50)) +get_random +ROLL_B=$(($R % 20)) +get_random +ROLL_C=$(($R % 20 + 60)) convert -size 180x60 xc:none -pointsize 40 \ \( -clone 0 -fill white \ @@ -97,6 +101,6 @@ convert -size 180x60 xc:none -pointsize 40 \ -strokewidth 2 -draw "line 0,$W2_LINE_START_Y 140,$W2_LINE_STOP_Y" \ -strokewidth 2 -draw "line 0,$W3_LINE_START_Y 140,$W3_LINE_STOP_Y" \ -wave "$WAVE3_AMPLITUDE"x"$WAVE3_LENGTH" \) \ - -distort Perspective '0,0,0,0 0,80,0,80 80,0,80,15 80,80,80,55' \ - -flatten -crop 140x60 +repage -quality 90 -depth 8 png:- + -distort Perspective "0,0,0,0 0,$ROLL_C,0,80 80,0,80,$ROLL_B 80,80,80,$ROLL_A" \ + -flatten -crop 140x60 +repage -quality 100 -depth 11 png:- diff --git a/captcha/experimental.sh b/captcha/experimental.sh new file mode 100755 index 0000000..fa9628c --- /dev/null +++ b/captcha/experimental.sh @@ -0,0 +1,106 @@ +#!/bin/sh + +# This script is an example captcha script. +# It takes the text to recognize in the captcha image as a parameter. +# It return the image binary as a result. ejabberd support PNG, JPEG and GIF. + +# The whole idea of the captcha script is to let server admins adapt it to +# their own needs. The goal is to be able to make the captcha generation as +# unique as possible, to make the captcha challenge difficult to bypass by +# a bot. +# Server admins are thus supposed to write and use their own captcha generators. + +# This script relies on ImageMagick. +# It is NOT compliant with ImageMagick forks like GraphicsMagick. + +INPUT=$1 + +if test -n ${BASH_VERSION:-''} ; then + get_random () + { + R=$RANDOM + } +else + for n in `od -A n -t u2 -N 48 /dev/urandom`; do RL="$RL$n "; done + get_random () + { + R=${RL%% *} + RL=${RL#* } + } +fi + +get_random +WAVE1_AMPLITUDE=$((2 + $R % 5)) +get_random +WAVE1_LENGTH=$((50 + $R % 25)) +get_random +WAVE2_AMPLITUDE=$((2 + $R % 5)) +get_random +WAVE2_LENGTH=$((50 + $R % 25)) +get_random +WAVE3_AMPLITUDE=$((2 + $R % 5)) +get_random +WAVE3_LENGTH=$((50 + $R % 25)) +get_random +W1_LINE_START_Y=$((10 + $R % 40)) +get_random +W1_LINE_STOP_Y=$((10 + $R % 40)) +get_random +W2_LINE_START_Y=$((10 + $R % 40)) +get_random +W2_LINE_STOP_Y=$((10 + $R % 40)) +get_random +W3_LINE_START_Y=$((10 + $R % 40)) +get_random +W3_LINE_STOP_Y=$((10 + $R % 40)) + +get_random +B1_LINE_START_Y=$(($R % 40)) +get_random +B1_LINE_STOP_Y=$(($R % 40)) +get_random +B2_LINE_START_Y=$(($R % 40)) +get_random +B2_LINE_STOP_Y=$(($R % 40)) +#B3_LINE_START_Y=$(($R % 40)) +#B3_LINE_STOP_Y=$(($R % 40)) + +get_random +B1_LINE_START_X=$(($R % 20)) +get_random +B1_LINE_STOP_X=$((100 + $R % 40)) +get_random +B2_LINE_START_X=$(($R % 20)) +get_random +B2_LINE_STOP_X=$((100 + $R % 40)) +#B3_LINE_START_X=$(($R % 20)) +#B3_LINE_STOP_X=$((100 + $R % 40)) + +get_random +ROLL_A=$(($R % 10 + 50)) +get_random +ROLL_B=$(($R % 20)) +get_random +ROLL_C=$(($R % 20 + 60)) + +convert -size 180x60 xc:none -pointsize 40 \ + \( -clone 0 -fill white \ + -stroke black -strokewidth 4 -annotate +0+40 "$INPUT" \ + -stroke white -strokewidth 2 -annotate +0+40 "$INPUT" \ + -roll +$ROLL_X+0 \ + -wave "$WAVE1_AMPLITUDE"x"$WAVE1_LENGTH" \ + -roll -$ROLL_X+0 \) \ + \( -clone 0 -stroke black \ + -strokewidth 1 -draw \ + "line $B1_LINE_START_X,$B1_LINE_START_Y $B1_LINE_STOP_X,$B1_LINE_STOP_Y" \ + -strokewidth 1 -draw \ + "line $B2_LINE_START_X,$B2_LINE_START_Y $B2_LINE_STOP_X,$B2_LINE_STOP_Y" \ + -wave "$WAVE2_AMPLITUDE"x"$WAVE2_LENGTH" \) \ + \( -clone 0 -stroke white \ + -strokewidth 2 -draw "line 0,$W1_LINE_START_Y 140,$W1_LINE_STOP_Y" \ + -strokewidth 2 -draw "line 0,$W2_LINE_START_Y 140,$W2_LINE_STOP_Y" \ + -strokewidth 2 -draw "line 0,$W3_LINE_START_Y 140,$W3_LINE_STOP_Y" \ + -wave "$WAVE3_AMPLITUDE"x"$WAVE3_LENGTH" \) \ + -distort Perspective "0,0,0,0 0,$ROLL_C,0,80 80,0,80,$ROLL_B 80,80,80,$ROLL_A" \ + -flatten -crop 140x60 +repage -quality 100 -depth 11 png:- +