#!/bin/bash # 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=(DECOUPE.A DECOUPE.B INTRUS.A INTRUS.B SOMME.A SOMME.B) 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 DECOUPE.A() { LENGTH=${#INPUT} MID=$((LENGTH / 2)) echo "Tapez ${INPUT:0:$MID}\n suivi de ${INPUT:$MID:$MID}" } DECOUPE.B() { LENGTH=${#INPUT} MID=$((LENGTH / 2)) echo "Saisissez ${INPUT:0:$MID}\n puis ${INPUT:$MID:$MID}" } 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 \n 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\n supprimant 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 \n 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\n enlevant 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\n 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\n de $A + $B" } 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:-