HEX
Server: LiteSpeed
System: Linux shams.tasjeel.ae 5.14.0-611.5.1.el9_7.x86_64 #1 SMP PREEMPT_DYNAMIC Tue Nov 11 08:09:09 EST 2025 x86_64
User: infowars (1469)
PHP: 8.2.29
Disabled: NONE
Upload Files
File: //usr/lib/python3.9/site-packages/ipapython/__pycache__/dnsutil.cpython-39.opt-1.pyc
a

}�fmV�@s�ddlZddlZddlZddlZddlZddlZddlZddlZddl	Zddl
ZddlZddlm
Z
ejrneZe�e�Zdadd�Zdd�Zdd�Zd	d
�Zdd�ZGd
d�dejj�ZGdd�dejj�Zej Gdd�dej!j"��Z#e#ej!j$�e#_$e#ej!j%�e#_%e#d�e#_&e#d�e#_'dd�dD�Z(dd�Z)dd�Z*dd�Z+dd�Z,d d!�Z-d"d#�Z.d$d%�Z/d/d'd(�Z0d)d*�Z1d+d,�Z2d0d-d.�Z3dS)1�N��UnsafeIPAddresscCstdurt�atS�N)�ipa_resolver�DNSResolver�rr�5/usr/lib/python3.9/site-packages/ipapython/dnsutil.py�get_ipa_resolver.sr	cOst�j|i|��Sr)r	�resolve��args�kwargsrrrr
5sr
cOst�j|i|��Sr)r	�resolve_addressrrrrr9srcOs$d|vrt�|d<tjj|i|��S)N�resolver)r	�dnsr�
zone_for_namerrrrr=s
rcCs
t�adS)z Re-initialize ipa resolver.
    N)rrrrrr�reset_default_resolverDsrcsbeZdZdZ�fdd�Zdd�Z�fdd�Zdd	�Z�fd
d�Ze	dd
��Z
e
jdd
��Z
�ZS)ra4DNS stub resolver compatible with both dnspython < 2.0.0
    and dnspython >= 2.0.0.

    Set `use_search_by_default` attribute to `True`, which
    determines the default for whether the search list configured
    in the system's resolver configuration is used for relative
    names, and whether the resolver's domain may be added to relative
    names.

    Increase the default lifetime which determines the number of seconds
    to spend trying to get an answer to the question. dnspython 2.0.0
    changes this to 5sec, while the previous one was 30sec.
    csHd|_t�j|i|��|��tt�d|j�|_tt�d|j�|_dS)Nr
r)	�_nameservers�super�__init__�reset_ipa_defaults�getattr�queryr
�_resolve_addressr)�selfrr
��	__class__rrrYs�zDNSResolver.__init__cCs,d|_t|jt|j�dd�|_d|_dS)a
        BIND's default timeout for resolver is 10sec.
        If that changes then it causes Timeout (instead of SERVFAIL)
        exception for dnspython if BIND under high load. So, let's make
        it the same + operation time.

        dnspython default is 2sec
        ���-TN)�timeout�min�len�nameserversZlifetimeZuse_search_by_default�rrrrrds	zDNSResolver.reset_ipa_defaultscst���|��dSr)r�resetrr$rrrr%ss
zDNSResolver.resetcOs(|jtj�|�g|�Rdtjji|��S)zzQuery nameservers for PTR records.

        :param ip_address: IPv4 or IPv6 address
        :type ip_address: str
        �rdtype)r
rZreversenameZfrom_address�	rdatatypeZPTR)r�
ip_addressrr
rrrrws
����zDNSResolver._resolve_addresscsNt�j|i|��tt�|j��}d}d}||vrD||vrD|�|�||_dS)z�
        dnspython tries nameservers sequentially(not parallel).
        IPA controlled BIND always listen on IPv6 if available,
        so no need to send requests to both IPv4 and IPv6 endpoints
        of the same NS(though BIND handles this).
        z::1z	127.0.0.1N)r�read_resolv_conf�list�dict�fromkeysr#�remove)rrr
r#Z
ipv6_loopbackZ
ipv4_loopbackrrrr)�s
zDNSResolver.read_resolv_confcCs|jSr)rr$rrrr#�szDNSResolver.nameserversc	Cs�t|d�r|j}ni}t|t�r�g}|D]�}|��}t|�dkr�|ddkr�|d}z&t|d�}|dksr|dkrxt��Wn"ty�td|d��Yn0|||<|�|�q(|}tt	j
jd	�r�t	j
jj�
||�n||_||_d
S)a?
        *nameservers*, a ``list`` of nameservers with optional ports:
            "SERVER_IP port PORT_NUMBER".

        Overloads dns.resolver.Resolver.nameservers setter to split off ports
        into nameserver_ports after setting nameservers successfully with the
        setter in dns.resolver.Resolver.
        �nameserver_ports���portrri��z*invalid nameserver: %s is not a valid portr#N)�hasattrr.�
isinstancer*�splitr"�int�
ValueError�appendrr�Resolverr#�__set__r)rr#r.rZ
nameserverZsplitsr1rrrr#�s4


��
)
�__name__�
__module__�__qualname__�__doc__rrr%rr)�propertyr#�setter�
__classcell__rrrrrKs


rc@seZdZddhZdZdS)�DNSZoneAlreadyExists�zone�nszGDNS zone {zone} already exists in DNS and is handled by server(s): {ns}N)r:r;r<Zsupp_kwargs�fmtrrrrrA�srAcs�eZdZdZed(dd��Zd)�fdd�	Zdd�ZeZdd	�Z	d
d�Z
dd
�Zej
r\dd�Zndd�Z�fdd�Z�fdd�Z�fdd�Z�fdd�Zd*�fdd�	Zdd�Zdd�Zd d!�Zd"d#�Zd$d%�Zd&d'�Z�ZS)+�DNSNameNcCs|tj�||��Sr)r�name�	from_text)�cls�labels�originrrrrG�szDNSName.from_textc
s~zHt|t�r"tj�t|�|�j}nt|tjj�r6|j}tt	|��
|�Wn0tyx}ztj�
|��WYd}~n
d}~00dSr)r3�strrrFrG�unicoderI�NamerrEr�UnicodeError�	exception�SyntaxError)rrIrJ�errrr�s
zDNSName.__init__cCsdS)NTrr$rrr�__bool__�szDNSName.__bool__cCs
t|j�Sr)rErIr$rrr�__copy__�szDNSName.__copy__cCstt�|j|��Sr)rE�copy�deepcopyrI)r�memorrr�__deepcopy__�szDNSName.__deepcopy__cCs|��Sr)Z
to_unicoder$rrr�__str__�szDNSName.__str__cCs|���d�S)N�ascii)�to_text�decoder$rrr�ToASCII�szDNSName.ToASCIIcCs|��Sr�rZr$rrrr\�scsttt|����Sr)rEr�canonicalizer$rrrr^�szDNSName.canonicalizecsttt|��|��Sr)rEr�concatenate)r�otherrrrr_�szDNSName.concatenatecsttt|��|��Sr)rEr�
relativize�rrJrrrraszDNSName.relativizecsttt|��|��Sr)rEr�derelativizerbrrrrcszDNSName.derelativizeTcsttt|�j||d��S)N)rJra)rEr�choose_relativity)rrJrarrrrds�zDNSName.choose_relativitycCs|�|j�Sr)rc�rootr$rrr�
make_absolute
szDNSName.make_absolutecCstdd�|jD��S)Ncss|]}|�d�VqdS)zxn--N)�
startswith)�.0Zlabelrrr�	<genexpr>�z!DNSName.is_idn.<locals>.<genexpr>)�anyrIr$rrr�is_idn
szDNSName.is_idncCs|�|j�Sr)�is_subdomain�ip4_rev_zoner$rrr�is_ip4_reverseszDNSName.is_ip4_reversecCs|�|j�Sr)rm�ip6_rev_zoner$rrr�is_ip6_reverseszDNSName.is_ip6_reversecCs|��p|��Sr)rorqr$rrr�
is_reverseszDNSName.is_reversecCst|j�dkS)Nr)r"rIr$rrr�is_emptyszDNSName.is_empty)N)N)NT)r:r;r<rI�classmethodrGrrRZ__nonzero__rSrWrX�sixZPY2r\r^r_rarcrdrfrlrorqrrrsr@rrrrrE�s.

rE)zin-addr�arpa�)Zip6rvrwcCsg|]}t|����qSr)rErf�rh�aezrrr�
<listcomp>)rjrz)bz10.IN-ADDR.ARPAz16.172.IN-ADDR.ARPAz17.172.IN-ADDR.ARPAz18.172.IN-ADDR.ARPAz19.172.IN-ADDR.ARPAz20.172.IN-ADDR.ARPAz21.172.IN-ADDR.ARPAz22.172.IN-ADDR.ARPAz23.172.IN-ADDR.ARPAz24.172.IN-ADDR.ARPAz25.172.IN-ADDR.ARPAz26.172.IN-ADDR.ARPAz27.172.IN-ADDR.ARPAz28.172.IN-ADDR.ARPAz29.172.IN-ADDR.ARPAz30.172.IN-ADDR.ARPAz31.172.IN-ADDR.ARPAz168.192.IN-ADDR.ARPAz64.100.IN-ADDR.ARPAz65.100.IN-ADDR.ARPAz66.100.IN-ADDR.ARPAz67.100.IN-ADDR.ARPAz68.100.IN-ADDR.ARPAz69.100.IN-ADDR.ARPAz70.100.IN-ADDR.ARPAz71.100.IN-ADDR.ARPAz72.100.IN-ADDR.ARPAz73.100.IN-ADDR.ARPAz74.100.IN-ADDR.ARPAz75.100.IN-ADDR.ARPAz76.100.IN-ADDR.ARPAz77.100.IN-ADDR.ARPAz78.100.IN-ADDR.ARPAz79.100.IN-ADDR.ARPAz80.100.IN-ADDR.ARPAz81.100.IN-ADDR.ARPAz82.100.IN-ADDR.ARPAz83.100.IN-ADDR.ARPAz84.100.IN-ADDR.ARPAz85.100.IN-ADDR.ARPAz86.100.IN-ADDR.ARPAz87.100.IN-ADDR.ARPAz88.100.IN-ADDR.ARPAz89.100.IN-ADDR.ARPAz90.100.IN-ADDR.ARPAz91.100.IN-ADDR.ARPAz92.100.IN-ADDR.ARPAz93.100.IN-ADDR.ARPAz94.100.IN-ADDR.ARPAz95.100.IN-ADDR.ARPAz96.100.IN-ADDR.ARPAz97.100.IN-ADDR.ARPAz98.100.IN-ADDR.ARPAz99.100.IN-ADDR.ARPAz100.100.IN-ADDR.ARPAz101.100.IN-ADDR.ARPAz102.100.IN-ADDR.ARPAz103.100.IN-ADDR.ARPAz104.100.IN-ADDR.ARPAz105.100.IN-ADDR.ARPAz106.100.IN-ADDR.ARPAz107.100.IN-ADDR.ARPAz108.100.IN-ADDR.ARPAz109.100.IN-ADDR.ARPAz110.100.IN-ADDR.ARPAz111.100.IN-ADDR.ARPAz112.100.IN-ADDR.ARPAz113.100.IN-ADDR.ARPAz114.100.IN-ADDR.ARPAz115.100.IN-ADDR.ARPAz116.100.IN-ADDR.ARPAz117.100.IN-ADDR.ARPAz118.100.IN-ADDR.ARPAz119.100.IN-ADDR.ARPAz120.100.IN-ADDR.ARPAz121.100.IN-ADDR.ARPAz122.100.IN-ADDR.ARPAz123.100.IN-ADDR.ARPAz124.100.IN-ADDR.ARPAz125.100.IN-ADDR.ARPAz126.100.IN-ADDR.ARPAz127.100.IN-ADDR.ARPAz0.IN-ADDR.ARPAz127.IN-ADDR.ARPAz254.169.IN-ADDR.ARPAz2.0.192.IN-ADDR.ARPAz100.51.198.IN-ADDR.ARPAz113.0.203.IN-ADDR.ARPAz255.255.255.255.IN-ADDR.ARPAzH0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.IP6.ARPAzH1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.IP6.ARPAzD.F.IP6.ARPAz8.E.F.IP6.ARPAz9.E.F.IP6.ARPAzA.E.F.IP6.ARPAzB.E.F.IP6.ARPAz8.B.D.0.1.0.0.2.IP6.ARPAzEMPTY.AS112.ARPAcCsdS)a�Raise AssertionError if name is not DNSName or is not absolute.

    >>> assert_absolute_dnsname(DNSName('absolute.name.example.'))
    >>> assert_absolute_dnsname(DNSName('relative.name.example'))
    Traceback (most recent call last):
      ...
    AssertionError: name must be absolute, ...
    >>> assert_absolute_dnsname('absolute.string.example.')
    Traceback (most recent call last):
      ...
    AssertionError: name must be DNSName instance, ...
    Nr�rFrrr�assert_absolute_dnsname]sr|cCst|�|tvS)a�True if specified zone name exactly matches an automatic empty zone.

    >>> is_auto_empty_zone(DNSName('in-addr.arpa.'))
    False
    >>> is_auto_empty_zone(DNSName('10.in-addr.arpa.'))
    True
    >>> is_auto_empty_zone(DNSName('1.10.in-addr.arpa.'))
    False
    >>> is_auto_empty_zone(DNSName('10.in-addr.arpa'))
    Traceback (most recent call last):
      ...
    AssertionError: ...
    )r|�EMPTY_ZONES)rBrrr�is_auto_empty_zonepsr~cCs&t|�tD]}|�|�rdSqdS)a
True if specified absolute name is a subdomain of an automatic empty
    zone.

    DNS domain is a subdomain of itself so this function
    returns True for zone apexes, too.

    >>> inside_auto_empty_zone(DNSName('in-addr.arpa.'))
    False
    >>> inside_auto_empty_zone(DNSName('10.in-addr.arpa.'))
    True
    >>> inside_auto_empty_zone(DNSName('1.10.in-addr.arpa.'))
    True
    >>> inside_auto_empty_zone(DNSName('1.10.in-addr.arpa'))
    Traceback (most recent call last):
      ...
    AssertionError: ...
    TF)r|r}rm)rFryrrr�inside_auto_empty_zone�s

rcs6t��tjjtjjtjjh�t��fdd�tD��S)a�True if specified absolute name is a sub/superdomain of an automatic
    empty zone.

    DNS domain is a subdomain of itself so this function
    returns True for zone apexes, too.

    >>> related_to_auto_empty_zone(DNSName('.'))
    True
    >>> related_to_auto_empty_zone(DNSName('in-addr.arpa.'))
    True
    >>> related_to_auto_empty_zone(DNSName('10.in-addr.arpa.'))
    True
    >>> related_to_auto_empty_zone(DNSName('1.10.in-addr.arpa.'))
    True
    >>> related_to_auto_empty_zone(DNSName('unrelated.example.'))
    False
    >>> related_to_auto_empty_zone(DNSName('1.10.in-addr.arpa'))
    Traceback (most recent call last):
      ...
    AssertionError: ...
    c3s |]}��|�d�vVqdS�rN)Zfullcomparerx�rFZ	relationsrrri�s�z-related_to_auto_empty_zone.<locals>.<genexpr>)r|rrFZNAMERELN_SUBDOMAINZNAMERELN_EQUALZNAMERELN_SUPERDOMAINrkr}r{rr�r�related_to_auto_empty_zone�s��r�cCst|�}tdd�|D��S)a^Detect if given host is using IP address belonging to
    an automatic empty zone.

    Information from --ip-address option used in installed is lost by
    the time when upgrade is run. Use IP addresses from DNS as best
    approximation.

    This is brain-dead and duplicates logic from DNS installer
    but I did not find other way around.
    css|]}tt|j��VqdSr)rrEZreverse_dns�rh�iprrrri�s�z+has_empty_zone_addresses.<locals>.<genexpr>)�resolve_ip_addressesrk)�hostname�ip_addressesrrr�has_empty_zone_addresses�s�r�cCst|t�st|�}|��}g}|D]�}z@t||�}t�dt|�||d�dd�|D���|�|j	�Wq"t
jjy�}z(t�d|�WYd}~�qWYd}~q"d}~0t
jj
y�}zt�d|�WYd}~q"d}~0t
jj�y}zt�d|||��WYd}~q"d}~00q"|S)a
    Get Resource Record sets for given FQDN.
    CNAME chain is followed during resolution
    but CNAMEs are not returned in the resulting rrset.

    :returns:
        set of dns.rrset.RRset objects, can be empty
        if the FQDN does not exist or if none of rrtypes exist
    zfound %d %s records for %s: %s� css|]}t|�VqdSr)rK�rh�rrrrrri�rjz!resolve_rrsets.<locals>.<genexpr>�%sNzDNS query for %s %s failed: %s)r3rErfr
�logger�debugr"�joinr7�rrsetrrZNXDOMAINZNoAnswerrO�DNSException�error)�fqdnZrdtypes�rrsetsr&�answer�exrrr�resolve_rrsets�s.

�$ r�cCs6t|ddg�}t�}|D]}|�dd�|D��q|S)z�Get IP addresses from DNS A/AAAA records for given host (using DNS).
    :returns:
        list of IP addresses as UnsafeIPAddress objects
    �AZAAAAcSsh|]}t|��qSrrr�rrr�	<setcomp>�rjz'resolve_ip_addresses.<locals>.<setcomp>)r��set�update)r�r�r�r�rrrr��s
r�Tc
Cs4t�d|�t|t�s"t|���}t|�r.dSzt|�}Wn�tjj	y�}zhd||f}|r�t|tj
j�r�t�d|�WYd}~dSt
|��nt�d|�WYd}~dSWYd}~n
d}~00||k�r0zdd�t|d�D�}Wn<tjj	�y}zt�d||�g}WYd}~n
d}~00t|��|d��dS)	Nz'Checking DNS domain %s, please wait ...z#DNS check for domain %s failed: %s.r�cSsg|]}|���qSrr])rhZansrrrrzrjz&check_zone_overlap.<locals>.<listcomp>ZNSz1Failed to resolve nameserver(s) for domain %s: %s)rBrC)r��infor3rErfr~rrrOr�rZ
NoNameserversZwarningr6r
r�rArZ)rBZraise_on_errorZcontaining_zonerQ�msgrCrrr�check_zone_overlap�s2

$
�r�cs�t��dkr�St�fdd��D��r4t����Sd�g}t���t��dkr�t�dt�fdd��D���}d}���D].}||jp��7}||krz��	|�|�
|�qzqD�r�|�
����|S)z?Weighted population sorting for records with same priority
    r0c3s|]}|j�djkVqdSr���weightr�)�recordsrrri,rjz_mix_weight.<locals>.<genexpr>g{�G�z�?rc3s|]}|jp�VqdSrr�r�)�noweightrrri6rjg)r"�all�randomZshuffler�Zuniform�sumrTr�r-r7�pop)r��resultZurnZaccr�r)r�r�r�_mix_weight#s&

r�cCs�t|t�d�d�}g}t�}|D]2}|jt|dd�f}||vr |�|�|�|�q g}g}|D]8}|rx|dj|jkr�|�|�q`|�	t
|��|g}q`|r�|�	t
|��|S)a.RFC 2782 sorting algorithm for SRV and URI records

    RFC 2782 defines a sorting algorithms for SRV records, that is also used
    for sorting URI records. Records are sorted by priority and than randomly
    shuffled according to weight.

    This implementation also removes duplicate entries.
    �priority)�keyr1Nr)�sorted�operator�
attrgetterr��targetrr7�addr��extendr�)r�Z
uniquerecords�seenr�r�r�Zsamepriorrr�sort_prio_weightDs$

r�cKs<|durt}nt|d|j�}||fdtjji|��}t|�S)z�Query SRV records and sort reply according to RFC 2782

    :param qname: query name, _service._proto.domain.
    :return: list of dns.rdtypes.IN.SRV.SRV instances
    Nr
r&)r
rrrr'ZSRVr�)Zqnamerr
Z	resolve_fr�rrr�	query_srvls
r�)T)N)4rTZloggingr�r�Zdns.namerZ
dns.exceptionZdns.resolverZdns.rdataclassZ
dns.rdatatypeZdns.reversenameruZipapython.ipautilrZPY3rKrLZ	getLoggerr:r�rr	r
rrrrr8rrOr�rAZpython_2_unicode_compatiblerFrMrEre�emptyrnrpr}r|r~rr�r�r�r�r�r�r�r�rrrr�<module>sP
{Q

4'
%!(