o
    g;                  
   @   s  U d Z ddlZddlZddlZddlZddlmZmZmZm	Z	 ddl
ZddlZddlZddlZG dd dejjZG dd dZG dd	 d	eZG d
d deZG dd dejjZG dd deZG dd deZejeejeejeiZeeef ed< dedefddZde	eef dddefddZde	eef de de!de!def
ddZ"d ededdfd!d"Z#ejZej$Z$ej%Z%ej&Z&ejZej'Z'ej(Z(ej)Z)ej*Z*ej+Z+ejZdS )#zEDNS Options    N)AnyDictOptionalUnionc                   @   sD   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZedd ZdS )
OptionType               	   
               c                 C      dS Ni   clsr   r   U/var/www/html/portale_awareness/portale-venv/lib/python3.10/site-packages/dns/edns.py_maximum8      zOptionType._maximumN)__name__
__module____qualname__NSIDDAUDHUN3UECSEXPIRECOOKIE	KEEPALIVEPADDINGCHAINEDEclassmethodr   r   r   r   r   r       s    r   c                   @   s   e Zd ZdZdeeef fddZd dee	 dee
 fdd	Zdefd
dZededddd fddZdd Zdd Zdd Zdd Zdd Zdd Zdd Zdd ZdS )!Optionz%Base class for all EDNS option types.otypec                 C   s   t || _dS )z_Initialize an option.

        *otype*, a ``dns.edns.OptionType``, is the option type.
        N)r   maker*   )selfr*   r   r   r   __init__@   s   zOption.__init__Nfilereturnc                 C      t )zUConvert an option to wire format.

        Returns a ``bytes`` or ``None``.

        NotImplementedErrorr,   r.   r   r   r   to_wireG   s   zOption.to_wirec                 C   r0   Nr1   r,   r   r   r   to_textO   s   zOption.to_textparserdns.wire.Parserc                 C   r0   )a  Build an EDNS option object from wire format.

        *otype*, a ``dns.edns.OptionType``, is the option type.

        *parser*, a ``dns.wire.Parser``, the parser, which should be
        restructed to the option length.

        Returns a ``dns.edns.Option``.
        r1   r   r*   r8   r   r   r   from_wire_parserR   s   zOption.from_wire_parserc                 C   s,   |   }|  }||krdS ||krdS dS )zCompare an EDNS option with another option of the same type.

        Returns < 0 if < *other*, 0 if == *other*, and > 0 if > *other*.
        r      )r4   )r,   otherwireowirer   r   r   _cmp_   s   zOption._cmpc                 C   s,   t |tsdS | j|jkrdS | |dkS )NFr   
isinstancer)   r*   rA   r,   r>   r   r   r   __eq__l   
   
zOption.__eq__c                 C   s,   t |tsdS | j|jkrdS | |dkS )NTr   rB   rD   r   r   r   __ne__s   rF   zOption.__ne__c                 C   s(   t |tr| j|jkrtS | |dk S Nr   rC   r)   r*   NotImplementedrA   rD   r   r   r   __lt__z      zOption.__lt__c                 C   s(   t |tr| j|jkrtS | |dkS rH   rI   rD   r   r   r   __le__   rL   zOption.__le__c                 C   s(   t |tr| j|jkrtS | |dkS rH   rI   rD   r   r   r   __ge__   rL   zOption.__ge__c                 C   s(   t |tr| j|jkrtS | |dkS rH   rI   rD   r   r   r   __gt__   rL   zOption.__gt__c                 C   s   |   S r5   )r7   r6   r   r   r   __str__   s   zOption.__str__r5   )r   r   r   __doc__r   r   strr-   r   r   bytesr4   r7   r(   r;   rA   rE   rG   rK   rM   rN   rO   rP   r   r   r   r   r)   =   s    r)   c                       s   e Zd ZdZdeeef deeef f fddZdde	e
 de	e fd	d
ZdefddZedeeef dddefddZ  ZS )GenericOptionzwGeneric Option Class

    This class is used for EDNS option types for which we have no better
    implementation.
    r*   datac                    s"   t  | tjj|d| _d S )NT)superr-   dnsrdataRdata	_as_bytesrU   )r,   r*   rU   	__class__r   r   r-      s   zGenericOption.__init__Nr.   r/   c                 C      |r
| | j d S | jS r5   )writerU   r3   r   r   r   r4         zGenericOption.to_wirec                 C   s
   d| j  S )Nz
Generic %d)r*   r6   r   r   r   r7      s   
zGenericOption.to_textr8   r9   c                 C   s   | ||  S r5   get_remainingr:   r   r   r   r;      s   zGenericOption.from_wire_parserr5   )r   r   r   rQ   r   r   rR   rS   r-   r   r   r4   r7   r(   r)   r;   __classcell__r   r   r[   r   rT      s    &
rT   c                       s   e Zd ZdZddedee def fddZd	efd
dZe	ded	e
fddZddee d	ee fddZedeeef ddd	e
fddZ  ZS )	ECSOptionz!EDNS Client Subnet (ECS, RFC7871)Nr   addresssrclenscopelenc           	         s`  t  tj tj|}|tjkr5d| _	|du rd}tj
j|}tj
j|dd}tj
j|dd}n,|tjkr]d| _	|du rCd}tj
j|}tj
j|dd}tj
j|dd}ntd	|dusgJ || _|| _|| _tj||}tt|d
 }|d| | _|d }|dkrtdt| jdd dd| > @ }| jdd | | _dS dS )a  *address*, a ``str``, is the client address information.

        *srclen*, an ``int``, the source prefix length, which is the
        leftmost number of bits of the address to be used for the
        lookup.  The default is 24 for IPv4 and 56 for IPv6.

        *scopelen*, an ``int``, the scope prefix length.  This value
        must be 0 in queries, and should be set in responses.
           N8   r      r<          zBad address family       @r   Br=      )rV   r-   r   r!   rW   inetaf_for_addresssocketAF_INET6familyrX   rY   _as_ipv6_address_as_intAF_INET_as_ipv4_address
ValueErrorrd   re   rf   	inet_ptonintmathceiladdrdatastructpackord)	r,   rd   re   rf   afr}   nbytesnbitslastr[   r   r   r-      s:   

&zECSOption.__init__r/   c                 C   s   d | j| j| jS )NzECS {}/{} scope/{})formatrd   re   rf   r6   r   r   r   r7      s   zECSOption.to_texttextc           
      C   s  d}|   }d}t|dkr|d }nt|dkr+|d |kr&td| |d }ntd| |d}|dkrE| d\}}d}n|dkrR| d\}}}ntd| zt|}W n tyo   td	d
| w zt|}	W n ty   tdd| w t||	|S )a  Convert a string into a `dns.edns.ECSOption`

        *text*, a `str`, the text form of the option.

        Returns a `dns.edns.ECSOption`.

        Examples:

        >>> import dns.edns
        >>>
        >>> # basic example
        >>> dns.edns.ECSOption.from_text('1.2.3.4/24')
        >>>
        >>> # also understands scope
        >>> dns.edns.ECSOption.from_text('1.2.3.4/24/32')
        >>>
        >>> # IPv6
        >>> dns.edns.ECSOption.from_text('2001:4b98::1/64/64')
        >>>
        >>> # it understands results from `dns.edns.ECSOption.to_text()`
        >>> dns.edns.ECSOption.from_text('ECS 1.2.3.4/24/32')
        r!   Nr<   r   rg   zcould not parse ECS from "{}"/0zinvalid scope z"{}": scope must be an integerzinvalid srclen z"{}": srclen must be an integer)splitlenrx   r   countrz   rc   )
r   optional_prefixtokensecs_text	n_slashesrd   tsrclentscopescopere   r   r   r   	from_text   s@   


zECSOption.from_textr.   c                 C   s2   t d| j| j| j| j }|r|| d S |S )N!HBB)r~   r   rs   re   rf   r}   r^   r,   r.   valuer   r   r   r4     s   
zECSOption.to_wirer*   r8   r9   c           
      C   s   | d\}}}tt|d }||}|dkr)d| }tj|d|  }	n|dkr<d| }tj|d|  }	nt	d| |	||S )	Nr   rl   r<          rg      zunsupported family)

get_structrz   r{   r|   	get_bytesrW   ipv4	inet_ntoaipv6rx   )
r   r*   r8   rs   srcr   addrlenprefixpadaddrr   r   r   r;   &  s   
zECSOption.from_wire_parserrH   r5   )r   r   r   rQ   rR   r   rz   r-   r7   staticmethodr)   r   r   rS   r4   r(   r   r   r;   rb   r   r   r[   r   rc      s     /8

rc   c                   @   s|   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZedd ZdS )EDECoder   r<   rg   r   r   r   r	   r
   r   r   r   r   r   r      r   r                        rj   c                 C   r   r   r   r   r   r   r   r   T  r   zEDECode._maximumN)r   r   r   OTHERUNSUPPORTED_DNSKEY_ALGORITHMUNSUPPORTED_DS_DIGEST_TYPESTALE_ANSWERFORGED_ANSWERDNSSEC_INDETERMINATEDNSSEC_BOGUSSIGNATURE_EXPIREDSIGNATURE_NOT_YET_VALIDDNSKEY_MISSINGRRSIGS_MISSINGNO_ZONE_KEY_BIT_SETNSEC_MISSINGCACHED_ERROR	NOT_READYBLOCKEDCENSOREDFILTERED
PROHIBITEDSTALE_NXDOMAIN_ANSWERNOT_AUTHORITATIVENOT_SUPPORTEDNO_REACHABLE_AUTHORITYNETWORK_ERRORINVALID_DATAr(   r   r   r   r   r   r   9  s8    r   c                       s   e Zd ZdZh dZddeeef dee f fddZ	defd	d
Z
ddee dee fddZedeeef dddefddZ  ZS )	EDEOptionz!Extended DNS Error (EDE, RFC8914)>   DSNSECDNSKEYDNSSECRRSIGsNXDOMAINNcoder   c                    s>   t  tj t|| _|durt|tst	d|| _
dS )z*code*, a ``dns.edns.EDECode`` or ``str``, the info code of the
        extended error.

        *text*, a ``str`` or ``None``, specifying additional information about
        the error.
        Nztext must be string or None)rV   r-   r   r'   r   r+   r   rC   rR   rx   r   )r,   r   r   r[   r   r   r-   ^  s
   
zEDEOption.__init__r/   c                    sn   d j  } j tv r(t j }d fdd|dD }|d| d7 } jd ur5|d j 7 }|S )	NzEDE  c                 3   s&    | ]}| j v r|n| V  qd S r5   )_preserve_casetitle).0wordr6   r   r   	<genexpr>q  s
    
z$EDEOption.to_text.<locals>.<genexpr>_z ()z: )r   r   r7   joinr   r   )r,   outputdescr   r6   r   r7   m  s   

zEDEOption.to_textr.   c                 C   s>   t d| j}| jd ur|| jd7 }|r|| d S |S )Nz!Hutf8)r~   r   r   r   encoder^   r   r   r   r   r4   z  s   

zEDEOption.to_wirer*   r8   r9   c                 C   sL   t | }| }|r|d dkr|d d }|d}nd }| ||S )Nr=   r   r   )r   r+   
get_uint16ra   decode)r   r*   r8   r   r   btextr   r   r   r;     s   
zEDEOption.from_wire_parserr5   )r   r   r   rQ   r   r   r   rR   r   r-   r7   r   rS   r4   r(   r   r)   r;   rb   r   r   r[   r   r   Y  s    $
r   c                       sn   e Zd Zdef fddZddedee fddZdefd	d
Z	e
deeef dejjdefddZ  ZS )
NSIDOptionnsidc                    s   t  tj || _d S r5   )rV   r-   r   r   r   )r,   r   r[   r   r   r-     s   
zNSIDOption.__init__Nr.   r/   c                 C   r]   r5   )r^   r   r3   r   r   r   r4     r_   zNSIDOption.to_wirec                 C   s:   t dd | jD r| j }nt| j }d| S )Nc                 s   s     | ]}|d ko|dkV  qdS )rk   ~   Nr   )r   cr   r   r   r     s    z%NSIDOption.to_text.<locals>.<genexpr>zNSID )allr   r   binasciihexlify)r,   r   r   r   r   r7     s   
zNSIDOption.to_textr*   r8   c                 C   s   | |  S r5   r`   r:   r   r   r   r;     s   zNSIDOption.from_wire_parserr5   )r   r   r   rS   r-   r   r   r4   rR   r7   r(   r   r   rW   r?   Parserr)   r;   rb   r   r   r[   r   r     s    
r   _type_to_classr*   r/   c                 C   s   t | }|du rt}|S )zReturn the class for the specified option type.

    The GenericOption class is used if a more specific class is not
    known.
    N)r   getrT   )r*   r   r   r   r   get_option_class  s   
r   r8   r9   c                 C   s   t | } t| }|| |S )a  Build an EDNS option object from wire format.

    *otype*, an ``int``, is the option type.

    *parser*, a ``dns.wire.Parser``, the parser, which should be
    restricted to the option length.

    Returns an instance of a subclass of ``dns.edns.Option``.
    )r   r+   r   r;   )r*   r8   r   r   r   r   option_from_wire_parser  s   
r   r?   currentolenc                 C   sF   t j||}|| t| |W  d   S 1 sw   Y  dS )ar  Build an EDNS option object from wire format.

    *otype*, an ``int``, is the option type.

    *wire*, a ``bytes``, is the wire-format message.

    *current*, an ``int``, is the offset in *wire* of the beginning
    of the rdata.

    *olen*, an ``int``, is the length of the wire-format option data

    Returns an instance of a subclass of ``dns.edns.Option``.
    N)rW   r?   r   restrict_tor   )r*   r?   r   r   r8   r   r   r   option_from_wire  s   $r   implementationc                 C   s   | t |< dS )zRegister the implementation of an option type.

    *implementation*, a ``class``, is a subclass of ``dns.edns.Option``.

    *otype*, an ``int``, is the option type.
    N)r   )r   r*   r   r   r   register_type  s   r   ),rQ   r   r{   rq   r~   typingr   r   r   r   dns.enumrW   dns.inet	dns.rdatadns.wireenumIntEnumr   r)   rT   rc   r   r   r   r!   r'   r   r   __annotations__r   rR   r   rS   rz   r   r   r   r   r    r"   r#   r$   r%   r&   r   r   r   r   <module>   sj   U  =




