diff --git a/tools/captcha-ng.sh b/tools/captcha-ng.sh new file mode 100755 index 000000000..08ded9af6 --- /dev/null +++ b/tools/captcha-ng.sh @@ -0,0 +1,131 @@ +#!/bin/bash + +# Copyright © 2021 Adrien Bourmault (neox@os-k.eu) +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. + +# 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 + +TRANSFORMATIONS=(INTRUDER SUM) +DIGIT=(zero one two three four five six seven eight nine ten) + +if test -n "${BASH_VERSION:-''}" ; then + get_random () + { + R=$RANDOM + } +else + for n in $(od -A n -t u2 -N 64 /dev/urandom); do RL="$RL$n "; done + get_random () + { + R=${RL%% *} + RL=${RL#* } + } +fi + +INTRUDER() +{ +NUMBERS=$(echo "$INPUT" | grep -o . | tr '\n' ' ') +SORTED_UNIQ_NUM=$(echo "${NUMBERS[@]}" | sort -u | tr '\n' ' ') +RANDOM_DIGITS=$(echo 123456789 | grep -o . | sort -R | tr '\n' ' ') +INTRUDER=-1 + +for i in $RANDOM_DIGITS +do + if [[ ! " ${SORTED_UNIQ_NUM[@]} " =~ ${i} ]]; then + INTRUDER=$i + break + fi +done + +# Worst case +if [[ $INTRUDER -eq "-1" ]] +then + printf "Type %s \n without changes" "$INPUT" + return +fi + +for num in "${NUMBERS[@]}" +do + get_random + R=$((R % 100)) + + if [[ $R -lt 60 ]]; then + NEWINPUT=${NEWINPUT}${num}${INTRUDER} + else + NEWINPUT=${NEWINPUT}${num} + fi +done + +get_random +R=$((R % 100)) + +if [[ $R -lt 50 ]]; then + printf "Type %s by\n deleting the %s" "$NEWINPUT" "${DIGIT[$INTRUDER]}" +else + printf "Enter %s by\n removing the %s" "$NEWINPUT" "${DIGIT[$INTRUDER]}" +fi +} + + +SUM() +{ +get_random +RA=$((R % 100)) + +if [[ $((INPUT % 2)) -eq 0 ]]; then + A=$((INPUT - RA)) + B=$RA +else + B=$((INPUT - RA)) + A=$RA +fi + +get_random +R=$((R % 100)) + +if [[ $R -lt 25 ]]; then + printf "Type the result\n of %s + %s" "$A" "$B" +elif [[ $R -lt 50 ]]; then + printf "SUMx\n %s and %s" "$A" "$B" +elif [[ $R -lt 75 ]]; then + printf "Add\n %s and %s" "$A" "$B" +else + printf "Enter the result\n of %s + %s" "$A" "$B" +fi +} + + +get_random + +RAND_ITALIC=$((R % 25)) +get_random + +RAND_ANGLE=$((R % 3)) +get_random + +RAND_INDEX=$((R % ${#TRANSFORMATIONS[@]})) + +convert -size 300x60 xc:none -pointsize 20 \ +\( -clone 0 -fill black \ +-stroke black -strokewidth 1 \ +-annotate "${RAND_ANGLE}x${RAND_ITALIC}+0+0" "\n $(${TRANSFORMATIONS[$RAND_INDEX]})" \ +-roll +"$ROLL_X"+0 \ +-wave "$WAVE1_AMPLITUDE"x"$WAVE1_LENGTH" \ +-roll -"$ROLL_X"+0 \) \ +-flatten -crop 300x60 +repage -quality 500 -depth 11 png:-