vendor/swiftmailer/lib/classes/Swift/Mime/Grammar.php
author ymh <ymh.work@gmail.com>
Sat, 24 Sep 2011 15:40:41 +0200
changeset 0 7f95f8617b0b
permissions -rwxr-xr-x
first commit
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     1
<?php
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     2
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     3
/*
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     4
 * This file is part of SwiftMailer.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     5
 * (c) 2004-2009 Chris Corbyn
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     6
 *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     7
 * For the full copyright and license information, please view the LICENSE
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     8
 * file that was distributed with this source code.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     9
 */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    10
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    11
/**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    12
 * Defines the grammar to use for validation, implements the RFC 2822 (and friends) ABNF grammar definitions.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    13
 * @package Swift
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    14
 * @subpackage Mime
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    15
 * @author Fabien Potencier
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    16
 * @author Chris Corbyn
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    17
 */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    18
class Swift_Mime_Grammar
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    19
{
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    20
  /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    21
   * Special characters used in the syntax which need to be escaped.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    22
   * @var string[]
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    23
   * @access private
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    24
   */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    25
  private $_specials = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    26
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    27
  /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    28
   * Tokens defined in RFC 2822 (and some related RFCs).
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    29
   * @var string[]
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    30
   * @access private
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    31
   */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    32
  private $_grammar = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    33
  
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    34
  /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
   * Initialize some RFC 2822 (and friends) ABNF grammar definitions.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
   * @access protected
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    37
   */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    38
  public function __construct()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    39
  {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    40
    $this->_specials = array(
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    41
      '(', ')', '<', '>', '[', ']',
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    42
      ':', ';', '@', ',', '.', '"'
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    43
      );
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    44
    
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    45
    /*** Refer to RFC 2822 for ABNF grammar ***/
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    46
    
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    47
    //All basic building blocks
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    48
    $this->_grammar['NO-WS-CTL'] = '[\x01-\x08\x0B\x0C\x0E-\x19\x7F]';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    49
    $this->_grammar['WSP'] = '[ \t]';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    50
    $this->_grammar['CRLF'] = '(?:\r\n)';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    51
    $this->_grammar['FWS'] = '(?:(?:' . $this->_grammar['WSP'] . '*' .
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    52
        $this->_grammar['CRLF'] . ')?' . $this->_grammar['WSP'] . ')';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    53
    $this->_grammar['text'] = '[\x00-\x08\x0B\x0C\x0E-\x7F]';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    54
    $this->_grammar['quoted-pair'] = '(?:\\\\' . $this->_grammar['text'] . ')';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    55
    $this->_grammar['ctext'] = '(?:' . $this->_grammar['NO-WS-CTL'] .
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    56
        '|[\x21-\x27\x2A-\x5B\x5D-\x7E])';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    57
    //Uses recursive PCRE (?1) -- could be a weak point??
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    58
    $this->_grammar['ccontent'] = '(?:' . $this->_grammar['ctext'] . '|' .
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    59
        $this->_grammar['quoted-pair'] . '|(?1))';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    60
    $this->_grammar['comment'] = '(\((?:' . $this->_grammar['FWS'] . '|' .
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    61
        $this->_grammar['ccontent']. ')*' . $this->_grammar['FWS'] . '?\))';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    62
    $this->_grammar['CFWS'] = '(?:(?:' . $this->_grammar['FWS'] . '?' .
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    63
        $this->_grammar['comment'] . ')*(?:(?:' . $this->_grammar['FWS'] . '?' .
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    64
        $this->_grammar['comment'] . ')|' . $this->_grammar['FWS'] . '))';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    65
    $this->_grammar['qtext'] = '(?:' . $this->_grammar['NO-WS-CTL'] .
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    66
        '|[\x21\x23-\x5B\x5D-\x7E])';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    67
    $this->_grammar['qcontent'] = '(?:' . $this->_grammar['qtext'] . '|' .
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    68
        $this->_grammar['quoted-pair'] . ')';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    69
    $this->_grammar['quoted-string'] = '(?:' . $this->_grammar['CFWS'] . '?"' .
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    70
        '(' . $this->_grammar['FWS'] . '?' . $this->_grammar['qcontent'] . ')*' .
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    71
        $this->_grammar['FWS'] . '?"' . $this->_grammar['CFWS'] . '?)';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    72
    $this->_grammar['atext'] = '[a-zA-Z0-9!#\$%&\'\*\+\-\/=\?\^_`\{\}\|~]';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    73
    $this->_grammar['atom'] = '(?:' . $this->_grammar['CFWS'] . '?' .
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    74
        $this->_grammar['atext'] . '+' . $this->_grammar['CFWS'] . '?)';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    75
    $this->_grammar['dot-atom-text'] = '(?:' . $this->_grammar['atext'] . '+' .
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    76
        '(\.' . $this->_grammar['atext'] . '+)*)';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    77
    $this->_grammar['dot-atom'] = '(?:' . $this->_grammar['CFWS'] . '?' .
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    78
        $this->_grammar['dot-atom-text'] . '+' . $this->_grammar['CFWS'] . '?)';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    79
    $this->_grammar['word'] = '(?:' . $this->_grammar['atom'] . '|' .
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    80
        $this->_grammar['quoted-string'] . ')';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    81
    $this->_grammar['phrase'] = '(?:' . $this->_grammar['word'] . '+?)';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    82
    $this->_grammar['no-fold-quote'] = '(?:"(?:' . $this->_grammar['qtext'] .
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    83
        '|' . $this->_grammar['quoted-pair'] . ')*")';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    84
    $this->_grammar['dtext'] = '(?:' . $this->_grammar['NO-WS-CTL'] .
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    85
        '|[\x21-\x5A\x5E-\x7E])';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    86
    $this->_grammar['no-fold-literal'] = '(?:\[(?:' . $this->_grammar['dtext'] .
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    87
        '|' . $this->_grammar['quoted-pair'] . ')*\])';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    88
    
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    89
    //Message IDs
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    90
    $this->_grammar['id-left'] = '(?:' . $this->_grammar['dot-atom-text'] . '|' .
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    91
        $this->_grammar['no-fold-quote'] . ')';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    92
    $this->_grammar['id-right'] = '(?:' . $this->_grammar['dot-atom-text'] . '|' .
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    93
        $this->_grammar['no-fold-literal'] . ')';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    94
    
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    95
    //Addresses, mailboxes and paths
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    96
    $this->_grammar['local-part'] = '(?:' . $this->_grammar['dot-atom'] . '|' .
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    97
        $this->_grammar['quoted-string'] . ')';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    98
    $this->_grammar['dcontent'] = '(?:' . $this->_grammar['dtext'] . '|' .
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    99
        $this->_grammar['quoted-pair'] . ')';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   100
    $this->_grammar['domain-literal'] = '(?:' . $this->_grammar['CFWS'] . '?\[(' .
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   101
        $this->_grammar['FWS'] . '?' . $this->_grammar['dcontent'] . ')*?' .
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   102
        $this->_grammar['FWS'] . '?\]' . $this->_grammar['CFWS'] . '?)';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   103
    $this->_grammar['domain'] = '(?:' . $this->_grammar['dot-atom'] . '|' .
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   104
        $this->_grammar['domain-literal'] . ')';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   105
    $this->_grammar['addr-spec'] = '(?:' . $this->_grammar['local-part'] . '@' .
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   106
        $this->_grammar['domain'] . ')';
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   107
  }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   108
  
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   109
  /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   110
   * Get the grammar defined for $name token.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   111
   * @param string $name execatly as written in the RFC
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   112
   * @return string
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   113
   */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   114
  public function getDefinition($name)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   115
  {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   116
    if (array_key_exists($name, $this->_grammar))
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   117
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   118
      return $this->_grammar[$name];
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   119
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   120
    else
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   121
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   122
      throw new Swift_RfcComplianceException(
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   123
        "No such grammar '" . $name . "' defined."
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   124
        );
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   125
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   126
  }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   127
  
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   128
  /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   129
   * Returns the tokens defined in RFC 2822 (and some related RFCs).
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   130
   * @return array
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   131
   */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   132
  public function getGrammarDefinitions()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   133
  {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   134
    return $this->_grammar;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   135
  }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   136
  
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   137
  /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   138
   * Returns the current special characters used in the syntax which need to be escaped.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   139
   * @return array
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   140
   */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   141
  public function getSpecials()
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   142
  {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   143
    return $this->_specials;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   144
  }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   145
  
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   146
  /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   147
   * Escape special characters in a string (convert to quoted-pairs).
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   148
   * @param string $token
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   149
   * @param string[] $include additonal chars to escape
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   150
   * @param string[] $exclude chars from escaping
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   151
   * @return string
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   152
   */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   153
  public function escapeSpecials($token, $include = array(),
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   154
    $exclude = array())
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   155
  {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   156
    foreach (
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   157
      array_merge(array('\\'), array_diff($this->_specials, $exclude), $include) as $char)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   158
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   159
      $token = str_replace($char, '\\' . $char, $token);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   160
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   161
    return $token;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   162
  }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
   163
}