Adds captchas with a TrueType font on a plaid pattern, optionally with

spurious characters.
This commit is contained in:
2025-09-05 10:36:27 +02:00
parent 2bd73a3785
commit 34655f82b9

View File

@@ -672,7 +672,7 @@ function send_captcha(): void
echo '<tr id="captcha"><td>'; echo '<tr id="captcha"><td>';
if ($difficulty===4) { if ($difficulty===4) {
echo _('Type the characters connected by dotted lines:'); echo _('Type the characters connected by dotted lines:');
} elseif ($difficulty===7 || $difficulty===8) { } elseif ($difficulty===7 || $difficulty===8 || $difficulty===10) {
echo _('Type the five largest characters:'); echo _('Type the five largest characters:');
} else { } else {
echo _('Type the characters in the image:'); echo _('Type the characters in the image:');
@@ -813,7 +813,7 @@ function send_captcha(): void
imageline($im, $chars[$i]['x']+ $fontwidth / 2, $chars[$i]['y']+ $fontheight / 2, $chars[$i+1]['x']+4, $chars[$i+1]['y']+8, IMG_COLOR_STYLED); imageline($im, $chars[$i]['x']+ $fontwidth / 2, $chars[$i]['y']+ $fontheight / 2, $chars[$i+1]['x']+4, $chars[$i+1]['y']+8, IMG_COLOR_STYLED);
} }
echo '<img alt="CAPTCHA" width="' . $CAPTCHAWIDTH . '" height="' . $CAPTCHAHEIGHT . '" src="data:image/png;base64,'; echo '<img alt="CAPTCHA" width="' . $CAPTCHAWIDTH . '" height="' . $CAPTCHAHEIGHT . '" src="data:image/png;base64,';
} elseif ($difficulty===5 || $difficulty===6 || $difficulty===7 || $difficulty===8){ // TrueType } elseif ($difficulty===5 || $difficulty===6 || $difficulty===7 || $difficulty===8 || $difficulty===9 || $difficulty===10){ // TrueType
$CAPTCHAWIDTH = 620; $CAPTCHAWIDTH = 620;
$CAPTCHAHEIGHT = 177; $CAPTCHAHEIGHT = 177;
$im = imagecreatetruecolor($CAPTCHAWIDTH, $CAPTCHAHEIGHT); $im = imagecreatetruecolor($CAPTCHAWIDTH, $CAPTCHAHEIGHT);
@@ -827,30 +827,31 @@ function send_captcha(): void
} else { } else {
imagefill($im, 0, 0, imagecolorallocate($im, mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255))); imagefill($im, 0, 0, imagecolorallocate($im, mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255)));
} }
if ($difficulty===7 || $difficulty===8){ if ($difficulty===7 || $difficulty===8 || $difficulty===10){
for($i=0; $i<50; ++$i){ // small spurious characters for($i=0; $i<50; ++$i){ // small spurious characters
if ($difficulty===7) { if ($difficulty===7 || $difficulty===10) {
$color = imagecolorallocate($im, mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255)); $color = imagecolorallocate($im, mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255));
} else { } else {
$lightness = mt_rand(127, 255); $lightness = mt_rand(127, 255);
$color = imagecolorallocate($im, $lightness, $lightness, $lightness); $color = imagecolorallocate($im, $lightness, $lightness, $lightness);
} }
$charsize = mt_rand($CAPTCHAHEIGHT * 0.18 , $CAPTCHAHEIGHT * 0.25); $charsize = mt_rand($CAPTCHAHEIGHT * 0.18 , $CAPTCHAHEIGHT * 0.25);
// $color = imagecolorallocate($im, mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255));
imagefttext($im, $charsize, mt_rand(0, 90) - 45, mt_rand(0, $CAPTCHAWIDTH), mt_rand(0, $CAPTCHAHEIGHT), $color, get_setting('captchattfont'), $captchachars[mt_rand(0, strlen($captchachars)-1)]); imagefttext($im, $charsize, mt_rand(0, 90) - 45, mt_rand(0, $CAPTCHAWIDTH), mt_rand(0, $CAPTCHAHEIGHT), $color, get_setting('captchattfont'), $captchachars[mt_rand(0, strlen($captchachars)-1)]);
} }
} }
// characters in solution // characters in solution
for($i=0; $i<5; ++$i){ for($i=0; $i<5; ++$i){
if ($difficulty===7) { if ($difficulty===8) {
$color = imagecolorallocate($im, mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255));
} else {
$lightness = mt_rand(127, 255); $lightness = mt_rand(127, 255);
$color = imagecolorallocate($im, $lightness, $lightness, $lightness); $color = imagecolorallocate($im, $lightness, $lightness, $lightness);
} else {
$color = imagecolorallocate($im, mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255));
} }
$charsize = mt_rand($CAPTCHAHEIGHT * 0.5 , $CAPTCHAHEIGHT * 0.7); $charsize = mt_rand($CAPTCHAHEIGHT * 0.5 , $CAPTCHAHEIGHT * 0.7);
imagefttext($im, $charsize, mt_rand(0, 90) - 45, ($CAPTCHAWIDTH / 8 * ($i * 1.5 + 0.5)), $CAPTCHAHEIGHT - $charsize / 2, $color, get_setting('captchattfont'), $code[$i-5]); imagefttext($im, $charsize, mt_rand(0, 90) - 45, ($CAPTCHAWIDTH / 8 * ($i * 1.5 + 0.5)), $CAPTCHAHEIGHT - $charsize / 2, $color, get_setting('captchattfont'), $code[$i-5]);
} }
if ($difficulty===7 || $difficulty===8){ if ($difficulty===7 || $difficulty===8 || $difficulty===10){
for($i=0; $i<50; ++$i){ // more small spurious characters for($i=0; $i<50; ++$i){ // more small spurious characters
if ($difficulty===7) { if ($difficulty===7) {
$color = imagecolorallocate($im, mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255)); $color = imagecolorallocate($im, mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255));
@@ -862,6 +863,23 @@ function send_captcha(): void
imagefttext($im, $charsize, mt_rand(0, 90) - 45, mt_rand(0, $CAPTCHAWIDTH), mt_rand(0, $CAPTCHAHEIGHT), $color, get_setting('captchattfont'), $captchachars[mt_rand(0, strlen($captchachars)-1)]); imagefttext($im, $charsize, mt_rand(0, 90) - 45, mt_rand(0, $CAPTCHAWIDTH), mt_rand(0, $CAPTCHAHEIGHT), $color, get_setting('captchattfont'), $captchachars[mt_rand(0, strlen($captchachars)-1)]);
} }
} }
if ($difficulty===9 || $difficulty===10){
imagelayereffect($im,IMG_EFFECT_MULTIPLY);
$interval=mt_rand(3, $CAPTCHAWIDTH/32);
$x=0;
while ($x<$CAPTCHAWIDTH) {
$interval=mt_rand(2, $CAPTCHAWIDTH/32);
$line=imagecolorallocate($im, mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255));
imagefilledrectangle($im, $x, 0, $x + $interval, $CAPTCHAHEIGHT, imagecolorallocate($im, mt_rand(128, 255), mt_rand(128, 255), mt_rand(128, 255)));
$x+=$interval;
}
$y=0;
while ($y<$CAPTCHAHEIGHT) {
$interval=mt_rand(3, $CAPTCHAHEIGHT/16);
imagefilledrectangle($im, 0, $y, $CAPTCHAWIDTH, $y + $interval, imagecolorallocate($im, mt_rand(128, 255), mt_rand(128, 255), mt_rand(128, 255)));
$y+=$interval;
}
}
if ($difficulty===5 || $difficulty===6){ if ($difficulty===5 || $difficulty===6){
if ($difficulty===6) { if ($difficulty===6) {
$iterations = 10; // hollow $iterations = 10; // hollow
@@ -1097,6 +1115,16 @@ function send_setup(array $C): void
echo ' selected'; echo ' selected';
} }
echo '>'._('TrueType with spurious characters, monochrome').'</option>'; echo '>'._('TrueType with spurious characters, monochrome').'</option>';
echo '<option value="9"';
if($captcha===9){
echo ' selected';
}
echo '>'._('TrueType on plaid background').'</option>';
echo '<option value="10"';
if($captcha===10){
echo ' selected';
}
echo '>'._('TrueType on plaid background with spurious characters').'</option>';
echo '</select></td></tr>'; echo '</select></td></tr>';
} }
echo '</table></td></tr></table></td></tr>'; echo '</table></td></tr></table></td></tr>';