diff --git a/chat.php b/chat.php index ec8c93f..0ed230c 100644 --- a/chat.php +++ b/chat.php @@ -363,6 +363,7 @@ function route_setup(): void $C['text_settings']=[ 'dateformat' => _('Date formating'), 'captchachars' => _('Characters used in Captcha'), + 'captchagdfont' => _('File name or path and file name for optional GD font for captcha'), 'captchattfont' => _('Font name or path and filename for TrueType font used in some captchas'), 'redirect' => _('Custom redirection script'), 'chatname' => _('Chat name'), @@ -677,9 +678,17 @@ function send_captcha(): void } else { echo _('Type the characters in the image:'); } + if($difficulty===1 || $difficulty===2 || $difficulty===4){ + // optionally use custom GD font for simple, moderate and extreme captchas + if (get_setting('captchagdfont') === '') { + $gdfont = imageloadfont(5); // load 9-by-10-pixel built-in font + }else{ + $gdfont = imageloadfont(get_setting('captchagdfont')); + } + $fontwidth = imagefontwidth($gdfont); + $fontheight = imagefontheight($gdfont); + } if($difficulty===1 || $difficulty===2){ - $fontwidth = imagefontwidth(5); - $fontheight = imagefontheight(5); $CAPTCHAWIDTH = $fontwidth * 5 * 3; $CAPTCHAHEIGHT = $fontheight * 3; $im=imagecreatetruecolor($CAPTCHAWIDTH, $CAPTCHAHEIGHT); @@ -697,7 +706,7 @@ function send_captcha(): void $xoffset=0; for($i=0; $i<5; $i++){ $xoffset+= mt_rand(0, ($CAPTCHAWIDTH - (5 * $fontwidth)) - $xoffset); // randomly shift characters to the right - imagechar($im, 5, $xoffset + $i * $fontwidth, mt_rand(0, $CAPTCHAHEIGHT - $fontheight), $code[$i], imagecolorallocate($im, mt_rand(224, 255), mt_rand(224, 255), mt_rand(224, 255))); + imagechar($im, $gdfont, $xoffset + $i * $fontwidth, mt_rand(0, $CAPTCHAHEIGHT - $fontheight), $code[$i], imagecolorallocate($im, mt_rand(224, 255), mt_rand(224, 255), mt_rand(224, 255))); if($difficulty===2){ imagelayereffect($im,IMG_EFFECT_OVERLAY); } @@ -750,22 +759,17 @@ function send_captcha(): void $fg=imagecolorallocate($im, mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255)); imagefill($im, 0, 0, $bg); imagelayereffect($im,IMG_EFFECT_NORMAL); - $fontwidth = imagefontwidth(5); // 9 pixels wide - $fontheight = imagefontheight(5); // 10 pixels high for($i=0; $i<20; ++$i){ $leftx = mt_rand(0, $CAPTCHAWIDTH - $fontwidth); $topy = mt_rand(0, $CAPTCHAHEIGHT - $fontheight); - for($j=0; $j<($numpoints * 2); $j+=2){ - $points[$j]=$leftx + mt_rand(0, $fontwidth); - $points[$j+1]=$topy + mt_rand(0, $fontheight); - } $numpoints=(int) mt_rand(3,6); - for($k=0; $k<($numpoints * 2); $k+=2){ - $points[$k]=mt_rand(0, $CAPTCHAWIDTH); - $points[$k+1]=mt_rand(0, $CAPTCHAHEIGHT); + for($j=0; $j<($numpoints * 2); $j+=2){ + $points[$j]=mt_rand(0, $CAPTCHAWIDTH); // x coordinate + $points[$j+1]=mt_rand(0, $CAPTCHAHEIGHT); // y coordinate } imagefilledpolygon( $im, $points, $numpoints, imagecolorallocate($im, mt_rand(0, 255), mt_rand(0, 255), mt_rand(0, 255))); } + imagefilter($im, IMG_FILTER_SMOOTH, 3); $chars=[]; $x = $y = 0; imagelayereffect($im,IMG_EFFECT_NORMAL); @@ -798,9 +802,9 @@ function send_captcha(): void imagelayereffect($im, IMG_EFFECT_OVERLAY); $fg = imagecolorallocate($im, 255, 255, 255); if($i<5){ // characters in solution - imagechar($im, 5, $chars[$i]['x'], $chars[$i]['y'], $code[$i], $fg); + imagechar($im, $gdfont, $chars[$i]['x'], $chars[$i]['y'], $code[$i], $fg); }else{ // spurious characters - imagechar($im, 5, $chars[$i]['x'], $chars[$i]['y'], $captchachars[mt_rand(0, $length)], $fg); + imagechar($im, $gdfont, $chars[$i]['x'], $chars[$i]['y'], $captchachars[mt_rand(0, $length)], $fg); } } imagelayereffect($im, IMG_EFFECT_OVERLAY); @@ -4485,6 +4489,7 @@ function init_chat(): void ['messageexpire', '14400'], ['messagelimit', '150'], ['maxmessage', 2000], + ['captchagdfont', ''], ['captchattfont', '/usr/share/fonts/truetype/dejavu/DejaVuSansMono.ttf'], ['captchatime', '600'], ['colbg', '000000'], @@ -4944,6 +4949,9 @@ function update_db(): void if($dbversion<50){ $db->exec('INSERT INTO ' . PREFIX . "settings (setting, value) VALUES ('noguestpm', '0');"); } + if($dbversion<51){ + $db->exec('INSERT INTO ' . PREFIX . "settings (setting,value) VALUES ('captchagdfont', '');"); + } update_setting('dbversion', DBVERSION); if($msgencrypted!==MSGENCRYPTED){ if(!extension_loaded('sodium')){ @@ -5146,7 +5154,7 @@ function load_lang(): void function load_config(): void { define('VERSION', '1.24.1'); // Script version - define('DBVERSION', 50); // Database layout version + define('DBVERSION', 51); // Database layout version define('MSGENCRYPTED', false); // Store messages encrypted in the database to prevent other database users from reading them - true/false - visit the setup page after editing! define('ENCRYPTKEY_PASS', 'MY_SECRET_KEY'); // Recommended length: 32. Encryption key for messages define('AES_IV_PASS', '012345678912'); // Recommended length: 12. AES Encryption IV