def address_spec(self, stream): ''' Extract a single address spec from a stream of input, always operates in strict mode. ''' # sanity check if stream is None: raise ParserException('No input provided to parser.') if isinstance(stream, str) and not is_pure_ascii(stream): raise ParserException('ASCII string contains non-ASCII chars.') # to avoid spinning here forever, limit mailbox length if len(stream) > MAX_ADDRESS_LENGTH: raise ParserException('Stream length exceeds maximum allowable ' + \ 'address length of ' + str(MAX_ADDRESS_LENGTH) + '.') self.stream = TokenStream(stream) addr = self._addr_spec() if addr: # optional whitespace self._whitespace() # if we hit the end of the stream, we have a valid inbox if self.stream.end_of_stream(): return addr return None
def _validate_primary(localpart): # length check l = len(localpart) if l < 4 or l > 32: return False # no more than one dot (.) if localpart.count('.') > 1: return False # Grammar: local-part -> alpha { [ dot | underscore ] ( alpha | num ) }" stream = TokenStream(localpart) # local-part must being with alpha alpa = stream.get_token(ALPHA) if alpa is None: return False while True: # optional dot or underscore token stream.get_token(DOT) or stream.get_token(UNDERSCORE) # alpha or numeric alpanum = stream.get_token(ALPHA) or stream.get_token(NUMERIC) if alpanum is None: break # alpha or numeric must be end of stream if not stream.end_of_stream(): return False return True
def _validate(localpart): stream = TokenStream(localpart) # get the google base mpart = stream.get_token(GOOGLE_BASE) if mpart is None: return False # optional tags tgs = _tags(stream) if not stream.end_of_stream(): return False return True
def _validate(localpart): stream = TokenStream(localpart) # get the gmail base (alpha, num, or dot) mpart = stream.get_token(GMAIL_BASE) if mpart is None: return False # optional tags tgs = _tags(stream) if not stream.end_of_stream(): return False return True
def _validate_disposable(email_addr): # Setup for handling EmailAddress type instead of literal string localpart = email_addr.mailbox managed = managed_email(email_addr.hostname) # length check (base + hyphen + keyword) l = len(localpart) if l < 3 or l > 65: return False # single hyphen if localpart.count('-') != 1: return False # base and keyword length limit parts = localpart.split('-') for part in parts: l = len(part) if l < 1 or l > 32: return False # Grammar: local-part -> alpha { [ alpha | num | underscore ] } hyphen { [ alpha | num ] } stream = TokenStream(localpart) # must being with alpha begin = stream.get_token(ALPHA) if begin is None and managed: return False while True: # alpha, num, underscore base = stream.get_token(ALPHANUM) or stream.get_token(UNDERSCORE) if base is None: break # hyphen hyphen = stream.get_token(HYPHEN) if hyphen is None: return False # keyword must be alpha, num stream.get_token(ALPHANUM) if not stream.end_of_stream(): return False return True
def _validate_disposable(localpart): # length check (base + hyphen + keyword) l = len(localpart) if l < 3 or l > 65: return False # single hyphen if localpart.count('-') != 1: return False # base and keyword length limit parts = localpart.split('-') for part in parts: l = len(part) if l < 1 or l > 32: return False # Grammar: local-part -> alpha { [ alpha | num | underscore ] } hyphen { [ alpha | num ] } stream = TokenStream(localpart) # must being with alpha begin = stream.get_token(ALPHA) if begin is None: return False while True: # alpha, num, underscore base = stream.get_token(ALPHANUM) or stream.get_token(UNDERSCORE) if base is None: break # hyphen hyphen = stream.get_token(HYPHEN) if hyphen is None: return False # keyword must be alpha, num stream.get_token(ALPHANUM) if not stream.end_of_stream(): return False return True
def _validate(localpart): stream = TokenStream(localpart) # localpart must start with alpha alpa = stream.get_token(ICLOUD_PREFIX) if alpa is None: return False while True: # optional dot or underscore stream.get_token(DOT) or stream.get_token(UNDERSCORE) base = stream.get_token(ICLOUD_BASE) if base is None: break if not stream.end_of_stream(): return False return True
def _validate(localpart): stream = TokenStream(localpart) while True: # get alphanumeric portion mpart = stream.get_token(ALPHANUM) if mpart is None: return False # get optional dot, must be followed by more alphanumerics mpart = stream.get_token(DOT) if mpart is None: break # optional tags tgs = _tags(stream) if not stream.end_of_stream(): return False return True
def address_list(self, stream): ''' Extract a mailbox and/or url list from a stream of input, operates in strict and relaxed modes. ''' # sanity check if not stream: raise ParserException('No input provided to parser.') if isinstance(stream, str) and not is_pure_ascii(stream): raise ParserException('ASCII string contains non-ASCII chars.') # to avoid spinning here forever, limit address list length if len(stream) > MAX_ADDRESS_LIST_LENGTH: raise ParserException('Stream length exceeds maximum allowable ' + \ 'address list length of ' + str(MAX_ADDRESS_LIST_LENGTH) + '.') # set stream self.stream = TokenStream(stream) if self.strict is True: return self._address_list_strict() return self._address_list_relaxed()
def _validate(localpart): "Grammar: local-part -> alpha { [ dot | underscore ] ( alpha | num ) }" stream = TokenStream(localpart) # local-part must being with alpha alpa = stream.get_token(ALPHA) if alpa is None: return False while True: # optional dot or underscore token stream.get_token(DOT) or stream.get_token(UNDERSCORE) # alpha or numeric alpanum = stream.get_token(ALPHA) or stream.get_token(NUMERIC) if alpanum is None: break # alpha or numeric must be end of stream if not stream.end_of_stream(): return False return True
def _validate_primary(email_addr): # Setup for handling EmailAddress type instead of literal string localpart = email_addr.mailbox managed = managed_email(email_addr.hostname) # length check l = len(localpart) if l < 4 or l > 32: return False # no more than one dot (.) if localpart.count('.') > 1: return False # Grammar: local-part -> alpha { [ dot | underscore ] ( alpha | num ) }" stream = TokenStream(localpart) # local-part must being with alpha alpa = stream.get_token(ALPHA) if alpa is None and managed: return False while True: # optional dot or underscore token stream.get_token(DOT) or stream.get_token(UNDERSCORE) # alpha or numeric alpanum = stream.get_token(ALPHA) or stream.get_token(NUMERIC) if alpanum is None: break # alpha or numeric must be end of stream if not stream.end_of_stream(): return False return True