24
2
Fork 0
xmpp.chapril.org-tools/captcha/experimental.sh

175 lines
3.7 KiB
Bash
Raw Normal View History

2021-01-08 20:30:08 +01:00
#!/bin/bash
2020-12-27 20:52:45 +01:00
# 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
2021-01-08 20:30:08 +01:00
TRANSFORMATIONS=(DECOUPE.A DECOUPE.B INTRUS.A INTRUS.B SOMME.A SOMME.B)
2020-12-27 20:52:45 +01:00
if test -n ${BASH_VERSION:-''} ; then
get_random ()
{
R=$RANDOM
}
else
2021-01-01 15:12:21 +01:00
for n in `od -A n -t u2 -N 64 /dev/urandom`; do RL="$RL$n "; done
2020-12-27 20:52:45 +01:00
get_random ()
{
R=${RL%% *}
RL=${RL#* }
}
fi
2021-01-08 20:30:08 +01:00
DECOUPE.A()
{
LENGTH=${#INPUT}
MID=$((LENGTH / 2))
echo Tapez "${INPUT:0:$MID}" suivi de "${INPUT:$MID:$MID}"
}
2020-12-27 20:52:45 +01:00
2021-01-08 20:30:08 +01:00
DECOUPE.B()
{
LENGTH=${#INPUT}
MID=$((LENGTH / 2))
echo Saisissez "${INPUT:0:$MID}" puis "${INPUT:$MID:$MID}"
}
2020-12-27 20:52:45 +01:00
2021-01-08 20:30:08 +01:00
INTRUS.A()
{
LENGTH=${#INPUT}
NUMBERS=$(echo $INPUT | grep -o . | tr '\n' ' ')
SORTED_UNIQ_NUM=$(echo "${NUMBERS[@]}" | sort -u | tr '\n' ' ')
INTRUS=-1
for i in 1 2 3 4 5 6 7 8 9
do
if [[ ! " ${SORTED_UNIQ_NUM[@]} " =~ " ${i} " ]]; then
INTRUS=$i
break
fi
done
# Worst case
if [[ $INTRUS -eq "-1" ]]
then
echo Tapez "$INPUT sans changement"
return
fi
for num in ${NUMBERS[@]}
do
get_random
R=$(($R % 100))
if [[ $R -lt 60 ]]; then
NEWINPUT=${NEWINPUT}${num}${INTRUS}
else
NEWINPUT=${NEWINPUT}${num}
fi
done
echo "Tapez $NEWINPUT en supprimant\n les $INTRUS"
}
INTRUS.B()
{
LENGTH=${#INPUT}
NUMBERS=$(echo $INPUT | grep -o . | tr '\n' ' ')
SORTED_UNIQ_NUM=$(echo "${NUMBERS[@]}" | sort -u | tr '\n' ' ')
INTRUS=-1
for i in 1 2 3 4 5 6 7 8 9
do
if [[ ! " ${SORTED_UNIQ_NUM[@]} " =~ " ${i} " ]]; then
INTRUS=$i
break
fi
done
# Worst case
if [[ $INTRUS -eq "-1" ]]
then
echo Tapez "$INPUT sans changement"
return
fi
for num in ${NUMBERS[@]}
do
get_random
R=$(($R % 100))
if [[ $R -lt 60 ]]; then
NEWINPUT=${NEWINPUT}${num}${INTRUS}
else
NEWINPUT=${NEWINPUT}${num}
fi
done
echo "Saisissez $NEWINPUT en enlevant\n les $INTRUS"
}
SOMME.A()
{
if [[ $(($INPUT % 2)) -eq 0 ]]; then
A=$(($INPUT / 2))
B=$A
else
A=$(($INPUT / 2))
B=$(($A+1))
fi
get_random
R=$(($R % 100))
A=$(($A - $R))
B=$(($B + $R))
echo Tapez le résultat de "$A" + "$B"
}
SOMME.B()
{
if [[ $(($INPUT % 2)) -eq 0 ]]; then
A=$(($INPUT / 2))
B=$A
else
A=$(($INPUT / 2))
B=$(($A+1))
fi
get_random
R=$(($R % 100))
A=$(($A - $R))
B=$(($B + $R))
echo Saisissez le résultat de "$A" + "$B"
}
2020-12-27 20:52:45 +01:00
get_random
2021-01-08 20:30:08 +01:00
RAND_ITALIC=$(($R % 25))
2020-12-27 20:52:45 +01:00
get_random
2021-01-08 20:30:08 +01:00
RAND_ANGLE=$(($R % 5))
2020-12-30 20:01:50 +01:00
get_random
2021-01-08 20:30:08 +01:00
RAND_INDEX=$(($R % ${#TRANSFORMATIONS[@]}))
2020-12-27 20:52:45 +01:00
2021-01-08 20:30:08 +01:00
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]})" \
2020-12-31 13:36:06 +01:00
-roll +$ROLL_X+0 \
-wave "$WAVE1_AMPLITUDE"x"$WAVE1_LENGTH" \
2021-01-08 20:30:08 +01:00
-roll -$ROLL_X+0 \) \
-flatten -crop 300x60 +repage -quality 500 -depth 11 png:-