annotate vendor/egulias/email-validator/EmailValidator/Parser/LocalPart.php @ 5:12f9dff5fda9 tip

Update to Drupal core 8.7.1
author Chris Cannam
date Thu, 09 May 2019 15:34:47 +0100
parents
children
rev   line source
Chris@5 1 <?php
Chris@5 2
Chris@5 3 namespace Egulias\EmailValidator\Parser;
Chris@5 4
Chris@5 5 use Egulias\EmailValidator\Exception\DotAtEnd;
Chris@5 6 use Egulias\EmailValidator\Exception\DotAtStart;
Chris@5 7 use Egulias\EmailValidator\EmailLexer;
Chris@5 8 use Egulias\EmailValidator\EmailValidator;
Chris@5 9 use Egulias\EmailValidator\Exception\ExpectingAT;
Chris@5 10 use Egulias\EmailValidator\Exception\ExpectingATEXT;
Chris@5 11 use Egulias\EmailValidator\Exception\UnclosedQuotedString;
Chris@5 12 use Egulias\EmailValidator\Exception\UnopenedComment;
Chris@5 13 use Egulias\EmailValidator\Warning\CFWSWithFWS;
Chris@5 14 use Egulias\EmailValidator\Warning\LocalTooLong;
Chris@5 15
Chris@5 16 class LocalPart extends Parser
Chris@5 17 {
Chris@5 18 public function parse($localPart)
Chris@5 19 {
Chris@5 20 $parseDQuote = true;
Chris@5 21 $closingQuote = false;
Chris@5 22 $openedParenthesis = 0;
Chris@5 23
Chris@5 24 while ($this->lexer->token['type'] !== EmailLexer::S_AT && $this->lexer->token) {
Chris@5 25 if ($this->lexer->token['type'] === EmailLexer::S_DOT && !$this->lexer->getPrevious()) {
Chris@5 26 throw new DotAtStart();
Chris@5 27 }
Chris@5 28
Chris@5 29 $closingQuote = $this->checkDQUOTE($closingQuote);
Chris@5 30 if ($closingQuote && $parseDQuote) {
Chris@5 31 $parseDQuote = $this->parseDoubleQuote();
Chris@5 32 }
Chris@5 33
Chris@5 34 if ($this->lexer->token['type'] === EmailLexer::S_OPENPARENTHESIS) {
Chris@5 35 $this->parseComments();
Chris@5 36 $openedParenthesis += $this->getOpenedParenthesis();
Chris@5 37 }
Chris@5 38 if ($this->lexer->token['type'] === EmailLexer::S_CLOSEPARENTHESIS) {
Chris@5 39 if ($openedParenthesis === 0) {
Chris@5 40 throw new UnopenedComment();
Chris@5 41 } else {
Chris@5 42 $openedParenthesis--;
Chris@5 43 }
Chris@5 44 }
Chris@5 45
Chris@5 46 $this->checkConsecutiveDots();
Chris@5 47
Chris@5 48 if ($this->lexer->token['type'] === EmailLexer::S_DOT &&
Chris@5 49 $this->lexer->isNextToken(EmailLexer::S_AT)
Chris@5 50 ) {
Chris@5 51 throw new DotAtEnd();
Chris@5 52 }
Chris@5 53
Chris@5 54 $this->warnEscaping();
Chris@5 55 $this->isInvalidToken($this->lexer->token, $closingQuote);
Chris@5 56
Chris@5 57 if ($this->isFWS()) {
Chris@5 58 $this->parseFWS();
Chris@5 59 }
Chris@5 60
Chris@5 61 $this->lexer->moveNext();
Chris@5 62 }
Chris@5 63
Chris@5 64 $prev = $this->lexer->getPrevious();
Chris@5 65 if (strlen($prev['value']) > LocalTooLong::LOCAL_PART_LENGTH) {
Chris@5 66 $this->warnings[LocalTooLong::CODE] = new LocalTooLong();
Chris@5 67 }
Chris@5 68 }
Chris@5 69
Chris@5 70 protected function parseDoubleQuote()
Chris@5 71 {
Chris@5 72 $parseAgain = true;
Chris@5 73 $special = array(
Chris@5 74 EmailLexer::S_CR => true,
Chris@5 75 EmailLexer::S_HTAB => true,
Chris@5 76 EmailLexer::S_LF => true
Chris@5 77 );
Chris@5 78
Chris@5 79 $invalid = array(
Chris@5 80 EmailLexer::C_NUL => true,
Chris@5 81 EmailLexer::S_HTAB => true,
Chris@5 82 EmailLexer::S_CR => true,
Chris@5 83 EmailLexer::S_LF => true
Chris@5 84 );
Chris@5 85 $setSpecialsWarning = true;
Chris@5 86
Chris@5 87 $this->lexer->moveNext();
Chris@5 88
Chris@5 89 while ($this->lexer->token['type'] !== EmailLexer::S_DQUOTE && $this->lexer->token) {
Chris@5 90 $parseAgain = false;
Chris@5 91 if (isset($special[$this->lexer->token['type']]) && $setSpecialsWarning) {
Chris@5 92 $this->warnings[CFWSWithFWS::CODE] = new CFWSWithFWS();
Chris@5 93 $setSpecialsWarning = false;
Chris@5 94 }
Chris@5 95 if ($this->lexer->token['type'] === EmailLexer::S_BACKSLASH && $this->lexer->isNextToken(EmailLexer::S_DQUOTE)) {
Chris@5 96 $this->lexer->moveNext();
Chris@5 97 }
Chris@5 98
Chris@5 99 $this->lexer->moveNext();
Chris@5 100
Chris@5 101 if (!$this->escaped() && isset($invalid[$this->lexer->token['type']])) {
Chris@5 102 throw new ExpectingATEXT();
Chris@5 103 }
Chris@5 104 }
Chris@5 105
Chris@5 106 $prev = $this->lexer->getPrevious();
Chris@5 107
Chris@5 108 if ($prev['type'] === EmailLexer::S_BACKSLASH) {
Chris@5 109 if (!$this->checkDQUOTE(false)) {
Chris@5 110 throw new UnclosedQuotedString();
Chris@5 111 }
Chris@5 112 }
Chris@5 113
Chris@5 114 if (!$this->lexer->isNextToken(EmailLexer::S_AT) && $prev['type'] !== EmailLexer::S_BACKSLASH) {
Chris@5 115 throw new ExpectingAT();
Chris@5 116 }
Chris@5 117
Chris@5 118 return $parseAgain;
Chris@5 119 }
Chris@5 120
Chris@5 121 protected function isInvalidToken($token, $closingQuote)
Chris@5 122 {
Chris@5 123 $forbidden = array(
Chris@5 124 EmailLexer::S_COMMA,
Chris@5 125 EmailLexer::S_CLOSEBRACKET,
Chris@5 126 EmailLexer::S_OPENBRACKET,
Chris@5 127 EmailLexer::S_GREATERTHAN,
Chris@5 128 EmailLexer::S_LOWERTHAN,
Chris@5 129 EmailLexer::S_COLON,
Chris@5 130 EmailLexer::S_SEMICOLON,
Chris@5 131 EmailLexer::INVALID
Chris@5 132 );
Chris@5 133
Chris@5 134 if (in_array($token['type'], $forbidden) && !$closingQuote) {
Chris@5 135 throw new ExpectingATEXT();
Chris@5 136 }
Chris@5 137 }
Chris@5 138 }