
    h                     R    d Z ddlZddlZddlZddlmZmZmZ ddZ	 G d de      Z
y)z
Parsing for `TorDNSEL <https://www.torproject.org/projects/tordnsel.html.en>`_
exit list files.

::

  TorDNSEL - Exit list provided by TorDNSEL
    N)
Descriptor_read_until_keywords_descriptor_componentsc              +      K   t        d| d       	 t        d|       }|t        d|       z  }|r$t        t        j                  d|      |fi | nyCw)a  
  Iterates over a tordnsel file.

  :returns: iterator for :class:`~stem.descriptor.tordnsel.TorDNSEL`
    instances in the file

  :raises:
    * **ValueError** if the contents is malformed and validate is **True**
    * **IOError** if the file can't be read
  ExitNodeT)skipExitAddress    N)r   TorDNSELbytesjoin)tordnsel_filevalidatekwargscontentss       b/var/www/betterdocs.net/sherlock_api/venv/lib/python3.12/site-packages/stem/descriptor/tordnsel.py_parse_filer      s]      z=>#M=AH$Z??HUZZX.CFCC 	s   AAc                   ,     e Zd ZdZdZ fdZd Z xZS )r   ad  
  TorDNSEL descriptor (`exitlist specification
  <https://www.torproject.org/tordnsel/exitlist-spec.txt>`_)

  :var str fingerprint: **\*** authority's fingerprint
  :var datetime published: **\*** time in UTC when this descriptor was made
  :var datetime last_status: **\*** time in UTC when the relay was seen in a v2 network status
  :var list exit_addresses: **\*** list of (str address, datetime date) tuples consisting of the found IPv4 exit address and the time

  **\*** attribute is either required when we're parsed with validation or has
  a default value, others are left as **None** if undefined
  tordnselc                     t         t        |   |       t        j                  j
                  j                  |      }t        ||      }d | _        d | _	        d | _
        g | _        | j                  ||       y )N)superr   __init__stemutil	str_tools_to_unicoder   fingerprint	publishedlast_statusexit_addresses_parse)selfraw_contentsr   entries	__class__s       r   r   zTorDNSEL.__init__A   se    	(D"<099&&22<@L$\8<GDDNDDKK"r
   c                 .   t        |j                               D ]  \  }}|d   \  }}}|r|rt        d|z        |dk(  rA|r7t        j                  j
                  j                  |      st        d|z        || _        h|dk(  r0	 t        j                  j                  j                  |      | _
        |dk(  r0	 t        j                  j                  j                  |      | _        |d	k(  r|D ]  \  }}}|j                  d
d      \  }}	|rGt        j                  j                  j                  |      st        d|z        |rt        d|z        	 t        j                  j                  j                  |	      }	| j                  j!                  ||	f        |st        d|z         y # t        $ r |rt        d|z        Y w xY w# t        $ r |rt        d|z        Y w xY w# t        $ r |rt        d|z        Y  w xY w)Nr   zUnexpected block content: %sr   z6Tor relay fingerprints consist of forty hex digits: %s	Publishedz"Published time wasn't parsable: %s
LastStatusz#LastStatus time wasn't parsable: %sr	       z*ExitAddress isn't a valid IPv4 address: %sz*ExitAddress found time wasn't parsable: %szUnrecognized keyword: %s)listitems
ValueErrorr   r   	tor_toolsis_valid_fingerprintr   r   _parse_timestampr   r   split
connectionis_valid_ipv4_addressr    append)
r"   r$   r   keywordvaluesvalue
block_typeblock_contentaddressdates
             r   r!   zTorDNSEL._parseM   s    0 (?)/&eZ	m7-GHH	J	DII//DDUKSV[[\
\ k!	K99..??F$. l"	L!YY00AA%H$
 m#06 	U,E:}++c1--'499''==gFKgUVV=MNNU99&&77=D&&7	U 3g=>>Q(?  	KAEIJJ 	K  	LBUJKK 	L   UKeSTT Us7   .F7=.GAG77GGG43G47HH)__name__
__module____qualname____doc__TYPE_ANNOTATION_NAMEr   r!   __classcell__)r%   s   @r   r   r   1   s     $
#*?r
   r   )F)r?   stem.util.connectionr   stem.util.str_toolsstem.util.tor_toolsstem.descriptorr   r   r   r   r    r
   r   <module>rG      s2       2F?z F?r
   