mirror of
https://git.d3data.de/3rdParty/captcha-module.git
synced 2024-08-21 15:21:45 +02:00
103 lines
3.2 KiB
PHP
103 lines
3.2 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace OxidProfessionalServices\Captcha\Application\Controller;
|
|
|
|
use OxidEsales\Eshop\Application\Controller\FrontendController;
|
|
use OxidEsales\Eshop\Core\Exception\StandardException;
|
|
use OxidEsales\Eshop\Core\Registry;
|
|
use OxidProfessionalServices\Captcha\Application\Shared\Options;
|
|
use Throwable;
|
|
|
|
class ImageGeneratorController extends FrontendController
|
|
{
|
|
use Options;
|
|
|
|
protected $emac;
|
|
protected int $imageHeight = 18;
|
|
protected int $imageWidth = 80;
|
|
protected $fontSize = 14;
|
|
|
|
public function init()
|
|
{
|
|
parent::init();
|
|
$this->emac = Registry::getRequest()->getRequestEscapedParameter('e_mac', null);
|
|
if ($this->emac) {
|
|
$this->emac = $this->decodeEmac($this->emac);
|
|
}
|
|
}
|
|
|
|
public function render()
|
|
{
|
|
parent::render();
|
|
|
|
try {
|
|
if (!$this->emac) {
|
|
throw new StandardException('No e_mac parameter given');
|
|
}
|
|
$image = $this->generateVerificationImage();
|
|
if (!$image) {
|
|
throw new StandardException('Image generation failed by returning NULL');
|
|
}
|
|
header('Content-type: image/png');
|
|
imagepng($image);
|
|
imagedestroy($image);
|
|
|
|
exit;
|
|
} catch (Throwable $e) {
|
|
Registry::getLogger()->error(sprintf('%s() | %s', __METHOD__, $e->getMessage()), [$e]);
|
|
http_response_code(400);
|
|
|
|
exit(1);
|
|
}
|
|
}
|
|
|
|
protected function decodeEmac(string $emac): string
|
|
{
|
|
$decryptor = new \OxidEsales\Eshop\Core\Decryptor();
|
|
|
|
$key = $this->getOeCaptchaKey();
|
|
|
|
return $decryptor->decrypt($emac, $key);
|
|
}
|
|
|
|
protected function generateVerificationImage()
|
|
{
|
|
$image = null;
|
|
|
|
switch (true) {
|
|
case function_exists('imagecreatetruecolor'):
|
|
$image = imagecreatetruecolor($this->imageWidth, $this->imageHeight);
|
|
|
|
break;
|
|
|
|
case function_exists('imagecreate'):
|
|
$image = imagecreate($this->imageWidth, $this->imageHeight);
|
|
|
|
break;
|
|
|
|
default:
|
|
return null;
|
|
}
|
|
$textX = (int)ceil(($this->imageWidth - strlen($this->emac) * imagefontwidth($this->fontSize)) / 2);
|
|
$textY = (int)ceil(($this->imageHeight - imagefontheight($this->fontSize)) / 2) - 1;
|
|
|
|
$colors = [
|
|
'text' => imagecolorallocate($image, 0, 0, 0),
|
|
'shadow1' => imagecolorallocate($image, 200, 200, 200),
|
|
'shadow2' => imagecolorallocate($image, 100, 100, 100),
|
|
'background' => imagecolorallocate($image, 255, 255, 255),
|
|
'border' => imagecolorallocate($image, 0, 0, 0),
|
|
];
|
|
|
|
imagefill($image, 0, 0, $colors['background']);
|
|
imagerectangle($image, 0, 0, $this->imageWidth - 2, $this->imageHeight - 2, $colors['border']);
|
|
imagestring($image, $this->fontSize, $textX + 1, $textY + 0, $this->emac, $colors['shadow2']);
|
|
imagestring($image, $this->fontSize, $textX + 0, $textY + 1, $this->emac, $colors['shadow1']);
|
|
imagestring($image, $this->fontSize, $textX, $textY, $this->emac, $colors['text']);
|
|
|
|
return $image;
|
|
}
|
|
}
|