Source of file Grammar.php
Size: 6,798 Bytes - Last Modified: 2013-06-17T15:32:32+02:00
/home/theseer/Downloads/Symfony/vendor/swiftmailer/swiftmailer/lib/classes/Swift/Mime/Grammar.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179 | <?php /* * This file is part of SwiftMailer. * (c) 2004-2009 Chris Corbyn * * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ /** * Defines the grammar to use for validation, implements the RFC 2822 (and friends) ABNF grammar definitions. * * @package Swift * @subpackage Mime * @author Fabien Potencier * @author Chris Corbyn */ class Swift_Mime_Grammar { /** * Special characters used in the syntax which need to be escaped. * * @var string[] */ private static $_specials = array(); /** * Tokens defined in RFC 2822 (and some related RFCs). * * @var string[] */ private static $_grammar = array(); /** * Initialize some RFC 2822 (and friends) ABNF grammar definitions. */ public function __construct() { $this->init(); } public function __wakeup() { $this->init(); } protected function init() { if (count(self::$_specials) > 0) { return; } self::$_specials = array( '(', ')', '<', '>', '[', ']', ':', ';', '@', ',', '.', '"' ); /*** Refer to RFC 2822 for ABNF grammar ***/ //All basic building blocks self::$_grammar['NO-WS-CTL'] = '[\x01-\x08\x0B\x0C\x0E-\x19\x7F]'; self::$_grammar['WSP'] = '[ \t]'; self::$_grammar['CRLF'] = '(?:\r\n)'; self::$_grammar['FWS'] = '(?:(?:' . self::$_grammar['WSP'] . '*' . self::$_grammar['CRLF'] . ')?' . self::$_grammar['WSP'] . ')'; self::$_grammar['text'] = '[\x00-\x08\x0B\x0C\x0E-\x7F]'; self::$_grammar['quoted-pair'] = '(?:\\\\' . self::$_grammar['text'] . ')'; self::$_grammar['ctext'] = '(?:' . self::$_grammar['NO-WS-CTL'] . '|[\x21-\x27\x2A-\x5B\x5D-\x7E])'; //Uses recursive PCRE (?1) -- could be a weak point?? self::$_grammar['ccontent'] = '(?:' . self::$_grammar['ctext'] . '|' . self::$_grammar['quoted-pair'] . '|(?1))'; self::$_grammar['comment'] = '(\((?:' . self::$_grammar['FWS'] . '|' . self::$_grammar['ccontent']. ')*' . self::$_grammar['FWS'] . '?\))'; self::$_grammar['CFWS'] = '(?:(?:' . self::$_grammar['FWS'] . '?' . self::$_grammar['comment'] . ')*(?:(?:' . self::$_grammar['FWS'] . '?' . self::$_grammar['comment'] . ')|' . self::$_grammar['FWS'] . '))'; self::$_grammar['qtext'] = '(?:' . self::$_grammar['NO-WS-CTL'] . '|[\x21\x23-\x5B\x5D-\x7E])'; self::$_grammar['qcontent'] = '(?:' . self::$_grammar['qtext'] . '|' . self::$_grammar['quoted-pair'] . ')'; self::$_grammar['quoted-string'] = '(?:' . self::$_grammar['CFWS'] . '?"' . '(' . self::$_grammar['FWS'] . '?' . self::$_grammar['qcontent'] . ')*' . self::$_grammar['FWS'] . '?"' . self::$_grammar['CFWS'] . '?)'; self::$_grammar['atext'] = '[a-zA-Z0-9!#\$%&\'\*\+\-\/=\?\^_`\{\}\|~]'; self::$_grammar['atom'] = '(?:' . self::$_grammar['CFWS'] . '?' . self::$_grammar['atext'] . '+' . self::$_grammar['CFWS'] . '?)'; self::$_grammar['dot-atom-text'] = '(?:' . self::$_grammar['atext'] . '+' . '(\.' . self::$_grammar['atext'] . '+)*)'; self::$_grammar['dot-atom'] = '(?:' . self::$_grammar['CFWS'] . '?' . self::$_grammar['dot-atom-text'] . '+' . self::$_grammar['CFWS'] . '?)'; self::$_grammar['word'] = '(?:' . self::$_grammar['atom'] . '|' . self::$_grammar['quoted-string'] . ')'; self::$_grammar['phrase'] = '(?:' . self::$_grammar['word'] . '+?)'; self::$_grammar['no-fold-quote'] = '(?:"(?:' . self::$_grammar['qtext'] . '|' . self::$_grammar['quoted-pair'] . ')*")'; self::$_grammar['dtext'] = '(?:' . self::$_grammar['NO-WS-CTL'] . '|[\x21-\x5A\x5E-\x7E])'; self::$_grammar['no-fold-literal'] = '(?:\[(?:' . self::$_grammar['dtext'] . '|' . self::$_grammar['quoted-pair'] . ')*\])'; //Message IDs self::$_grammar['id-left'] = '(?:' . self::$_grammar['dot-atom-text'] . '|' . self::$_grammar['no-fold-quote'] . ')'; self::$_grammar['id-right'] = '(?:' . self::$_grammar['dot-atom-text'] . '|' . self::$_grammar['no-fold-literal'] . ')'; //Addresses, mailboxes and paths self::$_grammar['local-part'] = '(?:' . self::$_grammar['dot-atom'] . '|' . self::$_grammar['quoted-string'] . ')'; self::$_grammar['dcontent'] = '(?:' . self::$_grammar['dtext'] . '|' . self::$_grammar['quoted-pair'] . ')'; self::$_grammar['domain-literal'] = '(?:' . self::$_grammar['CFWS'] . '?\[(' . self::$_grammar['FWS'] . '?' . self::$_grammar['dcontent'] . ')*?' . self::$_grammar['FWS'] . '?\]' . self::$_grammar['CFWS'] . '?)'; self::$_grammar['domain'] = '(?:' . self::$_grammar['dot-atom'] . '|' . self::$_grammar['domain-literal'] . ')'; self::$_grammar['addr-spec'] = '(?:' . self::$_grammar['local-part'] . '@' . self::$_grammar['domain'] . ')'; } /** * Get the grammar defined for $name token. * * @param string $name exactly as written in the RFC * * @return string */ public function getDefinition($name) { if (array_key_exists($name, self::$_grammar)) { return self::$_grammar[$name]; } else { throw new Swift_RfcComplianceException( "No such grammar '" . $name . "' defined." ); } } /** * Returns the tokens defined in RFC 2822 (and some related RFCs). * * @return array */ public function getGrammarDefinitions() { return self::$_grammar; } /** * Returns the current special characters used in the syntax which need to be escaped. * * @return array */ public function getSpecials() { return self::$_specials; } /** * Escape special characters in a string (convert to quoted-pairs). * * @param string $token * @param string[] $include additional chars to escape * @param string[] $exclude chars from escaping * * @return string */ public function escapeSpecials($token, $include = array(), $exclude = array()) { foreach (array_merge(array('\\'), array_diff(self::$_specials, $exclude), $include) as $char) { $token = str_replace($char, '\\' . $char, $token); } return $token; } } |