mirror of
https://github.com/Combodo/iTop.git
synced 2026-04-26 12:08:47 +02:00
* N°7920 - laminas-mail is an abandoned package, replace it with symfony/mailer * Fix composer following merge
66 lines
1.8 KiB
PHP
66 lines
1.8 KiB
PHP
<?php
|
|
|
|
/*
|
|
* This file is part of the Symfony package.
|
|
*
|
|
* (c) Fabien Potencier <fabien@symfony.com>
|
|
*
|
|
* For the full copyright and license information, please view the LICENSE
|
|
* file that was distributed with this source code.
|
|
*/
|
|
|
|
namespace Symfony\Component\Mailer\Transport\Smtp\Auth;
|
|
|
|
use Symfony\Component\Mailer\Exception\InvalidArgumentException;
|
|
use Symfony\Component\Mailer\Transport\Smtp\EsmtpTransport;
|
|
|
|
/**
|
|
* Handles CRAM-MD5 authentication.
|
|
*
|
|
* @author Chris Corbyn
|
|
*/
|
|
class CramMd5Authenticator implements AuthenticatorInterface
|
|
{
|
|
public function getAuthKeyword(): string
|
|
{
|
|
return 'CRAM-MD5';
|
|
}
|
|
|
|
/**
|
|
* @see https://www.ietf.org/rfc/rfc4954.txt
|
|
*/
|
|
public function authenticate(EsmtpTransport $client): void
|
|
{
|
|
$challenge = $client->executeCommand("AUTH CRAM-MD5\r\n", [334]);
|
|
$challenge = base64_decode(substr($challenge, 4));
|
|
$message = base64_encode($client->getUsername().' '.$this->getResponse($client->getPassword(), $challenge));
|
|
$client->executeCommand(\sprintf("%s\r\n", $message), [235]);
|
|
}
|
|
|
|
/**
|
|
* Generates a CRAM-MD5 response from a server challenge.
|
|
*/
|
|
private function getResponse(#[\SensitiveParameter] string $secret, string $challenge): string
|
|
{
|
|
if (!$secret) {
|
|
throw new InvalidArgumentException('A non-empty secret is required.');
|
|
}
|
|
|
|
if (\strlen($secret) > 64) {
|
|
$secret = pack('H32', md5($secret));
|
|
}
|
|
|
|
if (\strlen($secret) < 64) {
|
|
$secret = str_pad($secret, 64, \chr(0));
|
|
}
|
|
|
|
$kipad = substr($secret, 0, 64) ^ str_repeat(\chr(0x36), 64);
|
|
$kopad = substr($secret, 0, 64) ^ str_repeat(\chr(0x5C), 64);
|
|
|
|
$inner = pack('H32', md5($kipad.$challenge));
|
|
$digest = md5($kopad.$inner);
|
|
|
|
return $digest;
|
|
}
|
|
}
|