Added feature #15998: Create a new API to send mails based on SwiftMailer to replace...
[Packages/TYPO3.CMS.git] / typo3 / contrib / swiftmailer / classes / Swift / Transport / Esmtp / Auth / CramMd5Authenticator.php
1 <?php
2
3 /*
4 * This file is part of SwiftMailer.
5 * (c) 2004-2009 Chris Corbyn
6 *
7 * For the full copyright and license information, please view the LICENSE
8 * file that was distributed with this source code.
9 */
10
11 //@require 'Swift/Transport/Esmtp/Authenticator.php';
12 //@require 'Swift/Transport/SmtpAgent.php';
13 //@require 'Swift/TransportException.php';
14
15 /**
16 * Handles CRAM-MD5 authentication.
17 * @package Swift
18 * @subpackage Transport
19 * @author Chris Corbyn
20 */
21 class Swift_Transport_Esmtp_Auth_CramMd5Authenticator
22 implements Swift_Transport_Esmtp_Authenticator
23 {
24
25 /**
26 * Get the name of the AUTH mechanism this Authenticator handles.
27 * @return string
28 */
29 public function getAuthKeyword()
30 {
31 return 'CRAM-MD5';
32 }
33
34 /**
35 * Try to authenticate the user with $username and $password.
36 * @param Swift_Transport_SmtpAgent $agent
37 * @param string $username
38 * @param string $password
39 * @return boolean
40 */
41 public function authenticate(Swift_Transport_SmtpAgent $agent,
42 $username, $password)
43 {
44 try
45 {
46 $challenge = $agent->executeCommand("AUTH CRAM-MD5\r\n", array(334));
47 $challenge = base64_decode(substr($challenge, 4));
48 $message = base64_encode(
49 $username . ' ' . $this->_getResponse($password, $challenge)
50 );
51 $agent->executeCommand(sprintf("%s\r\n", $message), array(235));
52 return true;
53 }
54 catch (Swift_TransportException $e)
55 {
56 $agent->executeCommand("RSET\r\n", array(250));
57 return false;
58 }
59 }
60
61 /**
62 * Generate a CRAM-MD5 response from a server challenge.
63 * @param string $secret
64 * @param string $challenge
65 * @return string
66 */
67 private function _getResponse($secret, $challenge)
68 {
69 if (strlen($secret) > 64)
70 {
71 $secret = pack('H32', md5($secret));
72 }
73
74 if (strlen($secret) < 64)
75 {
76 $secret = str_pad($secret, 64, chr(0));
77 }
78
79 $k_ipad = substr($secret, 0, 64) ^ str_repeat(chr(0x36), 64);
80 $k_opad = substr($secret, 0, 64) ^ str_repeat(chr(0x5C), 64);
81
82 $inner = pack('H32', md5($k_ipad . $challenge));
83 $digest = md5($k_opad . $inner);
84
85 return $digest;
86 }
87
88 }