
    b8                        d dl Z d dlZd dlmZmZ d dlmZmZ  G d de          Z	 G d dej
                  Z G d d	ej
                  Z G d
 dej
                  Z G d dej
                  Z G d dej
                  Z G d dej
                  Z G d dej
                  Z G d dej
                  Z G d dej
                  Zi Zd Z e             [ddZd Zd Zd Zd Zd ZdS )     N)	dnsserverdnsp)WERRORErrorwerrorc                       e Zd ZdS )DNSParseErrorN)__name__
__module____qualname__     1/usr/lib/python3/dist-packages/samba/dnsserver.pyr   r   -   s        Dr   r   c                   J     e Zd Zddej        df fd	Zedd            Z xZS )ARecord     r   c                     t          t          |                                            t          j        | _        ||z  | _        || _        || _        || _	        d S N)
superr   __init__r   
DNS_TYPE_AwTypedwFlagsdwSerialdwTtlSecondsdata)selfip_addrserialttlrank	node_flag	__class__s         r   r   zARecord.__init__2   sN    gt%%'''_
i'			r   Nc                      | |fi |S r   r   clsr   sepkwargss       r   from_stringzARecord.from_string;       s4""6"""r   r   	r	   r
   r   r   DNS_RANK_ZONEr   classmethodr)   __classcell__r#   s   @r   r   r   1   sj        '(c8J      # # # [# # # # #r   r   c                   J     e Zd Zddej        df fd	Zedd            Z xZS )
AAAARecordr   r   r   c                     t          t          |                                            t          j        | _        ||z  | _        || _        || _        || _	        d S r   )
r   r1   r   r   DNS_TYPE_AAAAr   r   r   r   r   )r   ip6_addrr   r    r!   r"   r#   s         r   r   zAAAARecord.__init__B   sO    j$((***'
i'			r   Nc                      | |fi |S r   r   r%   s       r   r)   zAAAARecord.from_stringK   r*   r   r   r+   r/   s   @r   r1   r1   @   sj        ()s9K      # # # [# # # # #r   r1   c                   J     e Zd Zddej        df fd	Zedd            Z xZS )	PTRRecordr   r   r   c                    t          t          |                                            t          j        | _        ||z  | _        || _        || _        t          j
                    }||_        t          |          |_        || _        d S r   )r   r7   r   r   DNS_TYPE_PTRr   r   r   r   r   DNS_RPC_NAMEstrlenr   )r   ptrr   r    r!   r"   ptr_namer#   s          r   r   zPTRRecord.__init__R   sq    i'')))&
i')++3xx			r   Nc                      | |fi |S r   r   r%   s       r   r)   zPTRRecord.from_string^   r*   r   r   r+   r/   s   @r   r7   r7   P   sj        #$#D4F
 
 
 
 
 
 # # # [# # # # #r   r7   c                   J     e Zd Zddej        df fd	Zedd            Z xZS )CNAMERecordr   r   r   c                    t                                                       t          j        | _        ||z  | _        || _        || _        t          j	                    }||_
        t          |          |_        || _        d S r   )r   r   r   DNS_TYPE_CNAMEr   r   r   r   r   r:   r;   r<   r   )r   cnamer   r    r!   r"   
cname_namer#   s          r   r   zCNAMERecord.__init__e   sk    (
i'+--

U
			r   Nc                      | |fi |S r   r   r%   s       r   r)   zCNAMERecord.from_stringq   r*   r   r   r+   r/   s   @r   rA   rA   c   sj        %&Cd6H
 
 
 
 
 
 # # # [# # # # #r   rA   c                   J     e Zd Zddej        df fd	Zedd            Z xZS )NSRecordr   r   r   c                    t          t          |                                            t          j        | _        ||z  | _        || _        || _        t          j
                    }||_        t          |          |_        || _        d S r   )r   rH   r   r   DNS_TYPE_NSr   r   r   r   r   r:   r;   r<   r   )r   
dns_serverr   r    r!   r"   nsr#   s          r   r   zNSRecord.__init__x   sq    h&&(((%
i'#%%Z			r   Nc                      | |fi |S r   r   r%   s       r   r)   zNSRecord.from_string   r*   r   r   r+   r/   s   @r   rH   rH   v   sj        *+4;M
 
 
 
 
 
 # # # [# # # # #r   rH   c                   J     e Zd Zddej        df fd	Zedd            Z xZS )MXRecordr   r   r   c                 4   t          t          |                                            t          j        | _        ||z  | _        || _        || _        t          j
                    }||_        ||j        _        t          |          |j        _        || _        d S r   )r   rO   r   r   DNS_TYPE_MXr   r   r   r   r   DNS_RPC_RECORD_NAME_PREFERENCEwPreferencenameExchanger;   r<   r   )	r   mail_server
preferencer   r    r!   r"   mxr#   s	           r   r   zMXRecord.__init__   s    h&&(((%
i'577#)!+..			r   Nc                     	 |                     |          \  }}t          |          }n%# t          $ r}t          d|z            |d }~ww xY w | ||fi |S )Nz?MX data must have server and priority (space separated), not %r)splitint
ValueErrorr   )r&   r   r'   r(   serverpriorityes          r   r)   zMXRecord.from_string   s    	K#zz#FH8}}HH 	K 	K 	K !<>B!C D DIJK	K s68..v...s   '* 
AAAr   r+   r/   s   @r   rO   rO      sj        78c(A      / / / [/ / / / /r   rO   c                   \     e Zd Zddddddej        ej        f fd	Zed	d            Z xZ	S )
	SOARecordr   r   iX  iQ i  c                    t          t          |                                            t          j        | _        |	|
z  | _        || _        || _        t          j
                    }||_        ||_        ||_        ||_        ||_        ||j        _        t%          |          |j        _        ||j        _        t%          |          |j        _        || _        d S r   )r   r`   r   r   DNS_TYPE_SOAr   r   r   r   r   DNS_RPC_RECORD_SOA
dwSerialNo	dwRefreshdwRetrydwExpiredwMinimumTtlNamePrimaryServerr;   r<   ZoneAdministratorEmailr   )r   mnamernamer   refreshretryexpireminimumr    r!   r"   soar#   s               r   r   zSOARecord.__init__   s     	i'')))&
i'*,,"$)!$'JJ!)."&),U"&			r   Nc                    |                     |          }t          |          dk    rt          d          	 t          dd          D ]}t	          ||                   ||<   n"# t
          $ r}t          d          |d }~ww xY w | |i |S )N   zhData requires 7 space separated elements - nameserver, email, serial, refresh, retry, expire, minimumttl   zBSOA serial, refresh, retry, expire, minimumttl' should be integers)rY   r<   r   rangerZ   r[   )r&   r   r'   r(   argsir^   s          r   r)   zSOARecord.from_string   s    zz#t99>> !E F F F	=1a[[ ' 'd1g,,Q' 	= 	= 	= !5 6 6;<=	= sD#F###s   +A% %
B/A??Br   )
r	   r
   r   r   r,   DNS_RPC_FLAG_AUTH_ZONE_ROOTr   r-   r)   r.   r/   s   @r   r`   r`      sv        ,-s#tD<N;     ( $ $ $ [$ $ $ $ $r   r`   c                   N     e Zd Zddddej        df fd	Zedd            Z xZS )		SRVRecordr   d   r   r   c	                 P   t          t          |                                            t          j        | _        ||z  | _        || _        || _        t          j
                    }	||	_        ||	_        ||	_        ||	j        _        t!          |          |	j        _        |	| _        d S r   )r   rz   r   r   DNS_TYPE_SRVr   r   r   r   r   DNS_RPC_RECORD_SRV	wPrioritywWeightwPort
nameTargetr;   r<   r   )r   targetportr]   weightr   r    r!   r"   srvr#   s             r   r   zSRVRecord.__init__   s    i'')))&
i'*,, 	# [[			r   Nc                 6   	 |                     |          \  }}}}n%# t          $ r}t          d|z            |d }~ww xY w	 |t          |          t          |          t          |          f}	n"# t          $ r}t          d          |d }~ww xY w | |	i |S )NzXSRV data must have four space separated elements: server, port, priority, weight; not %rz/SRV port, priority, and weight must be integers)rY   r[   r   rZ   )
r&   r   r'   r(   r   r   r]   r   r^   rv   s
             r   r)   zSRVRecord.from_string   s    	8-1ZZ__*FD(FF 	8 	8 	8 !) ,0!0 1 1 788	8
	;CIIs8}}c&kkBDD 	; 	; 	; !3 4 49:;	; sD#F###s(    
?:?-A1 1
B;BBr   r+   r/   s   @r   rz   rz      sn        ./A3(A      $ $ $ [$ $ $ $ $r   rz   c                   J     e Zd Zddej        df fd	Zedd            Z xZS )	TXTRecordr   r   r   c                    t          t          |                                            t          j        | _        ||z  | _        || _        || _        t          |t                    r|g}g }|D ]E}t          j                    }||_
        t          |          |_        |                    |           Ft          j                    }	t          |          |	_        ||	_
        |	| _        d S r   )r   r   r   r   DNS_TYPE_TXTr   r   r   r   
isinstancer;   r   r:   r<   appendDNS_RPC_RECORD_STRINGcountr   )r   slistr   r    r!   r"   namessnametxtr#   s             r   r   zTXTRecord.__init__   s    i'')))&
i'eS!! 	GE 	 	A)++DDH1vvDHLL-//JJ				r   Nc                 <    t          j        |          } | |fi |S r   )shlexrY   )r&   r   r'   r(   r   s        r   r)   zTXTRecord.from_string  s)    D!!s5##F###r   r   r+   r/   s   @r   r   r      sj        %&Cd6H     ( $ $ $ [$ $ $ $ $r   r   c                      t                                                      D ]I\  } }| dd          dk    r6| d d         } t          t          d| z             }|t          | <   |t          |<   Jd S )NiRecord	DNS_TYPE_)globalsitemsgetattrr   _RECORD_TYPE_LUT)kvflags      r   _setup_record_type_lutr     sw    		!! ' '1RSS6X#2#A4q11D"#Q%&T"' 'r   c                     t          | t                    r|                                 } 	 t          |          }n"# t          $ r}t          d          |d}~ww xY w |j        |fd|i|S )zGet a DNS record of type t based on the data string.
    Additional keywords (ttl, rank, etc) can be passed in.

    t can be a dnsp.DNS_TYPE_* integer or a string like "A", "TXT", etc.
    zUnsupported record typeNr'   )r   r;   upperr   KeyErrorr   r)   )tr   r'   r(   r   r^   s         r   record_from_stringr     s     !S GGII>!!$ > > >566A=> 6d666v666s   9 
AAAc                     |                                  }	 t          t          d|z             S # t          $ r}t	          d| z            |d }~ww xY w)Nr   zUnknown type of DNS record %s)r   r   r   AttributeErrorr   )rec_typertyper^   s      r   flag_from_stringr   (  se    NNEOt[50111 O O O;hFGGQNOs   . 
AAAc                  R    t          | i |}t          j                    }||_        |S r   )r   r   DNS_RPC_RECORD_BUFrec)rv   r(   r   bufs       r   recbuf_from_stringr   0  s.    
d
-f
-
-C

&
(
(CCGJr   c                     | j                             d                                          |j                             d                                          k    S )z%Match dns name (of type DNS_RPC_NAME).)r;   rstriplower)n1n2s     r   dns_name_equalr   7  sA    6==##%%s););)A)A)C)CCCr   c                 ~    t          j        t           j        |           }t          j        t           j        |          S )z.Convert an AAAA adresss into a canonical form.)socket	inet_ptonAF_INET6	inet_ntop)addrpackeds     r   ipv6_normaliser   <  s+    fot44FFOV444r   c                    t          ||          }t          j        }	 |                     t          j        d|||d||dd
  
        \  }}	n5# t
          $ r(}
|
j        d         t          j        k    rY d}
~
dS |
d}
~
ww xY w|	r|	j	        dk    rdS |	j
        d         j        D ]2}|j        |k    rd}|t          j        k    r|j        |j        k    rd}n|t          j        k    r.t#          |j                  t#          |j                  k    rd}n|t          j        k    rt'          |j        |j                  rd}n|t          j        k    rt'          |j        |j                  rd}n]|t          j        k    rt'          |j        |j                  rd}n/|t          j        k    rBt'          |j        j        |j        j                  r|j        j        |j        j        k    rd}n|t          j        k    rv|j        j        |j        j        k    rZ|j        j        |j        j        k    r@|j        j        |j        j        k    r&t'          |j        j        |j        j                  rd}nW|t          j        k    r|j        j        |j        j        k    r|j        j         |j        j         k    r|j        j!        |j        j!        k    r~|j        j"        |j        j"        k    rd|j        j#        |j        j#        k    rJt'          |j        j$        |j        j$                  r&t'          |j        j%        |j        j%                  rd}nz|t          j&        k    rj|j        j	        |j        j	        k    rPd}tO          |j        j	                  D ]4}|o/|j        j(        |         j(        |j        j(        |         j(        k    }5|r|c S 4dS )z1Find a dns record that matches the specified datar   NFT))r   r   DNS_RPC_VIEW_AUTHORITY_DATADnssrvEnumRecords2DNS_CLIENT_VERSION_LONGHORNr   rv   r   "WERR_DNS_ERROR_NAME_DOES_NOT_EXISTr   r   recordsr   r   r   r   r3   r   r9   r   rC   rJ   rQ   rT   rS   r}   r   r   r   r   rb   rd   re   rf   rg   rh   ri   rj   r   ru   r;   )dns_connr\   zoner   record_typer   urecselect_flagsbuflenresr^   r   foundrw   s                 r   dns_record_matchr   B  s    k400D8L	1111fdD$tT3 3    6!9AAA 44444  #)q..twqz! 1 19##$/))x49$$D...ch''>$)+D+DDDD---ch	22 D///ch	22 D,,,ch	22 D,,,ch3TY5KLL x#ty'<<<D---x!TY%888x49#444x~00ch1493GHH 1D---x"di&:::x!TY%888x49#444x DI$666x$	(>>>ch8"i9; ; ? ch="i>@ @ ?
 D---x~00sx~.. J JA! J X\!_0DIM!4D4HH E  	JJJ	 4s   +A
 

A<A75A77A<r   )r   r   samba.dcerpcr   r   sambar   r   r[   r   DNS_RPC_RECORDr   r1   r7   rA   rH   rO   r`   rz   r   r   r   r   r   r   r   r   r   r   r   r   <module>r      s  &   ( ( ( ( ( ( ( ( % % % % % % % %.	 	 	 	 	J 	 	 	# # # # #i& # # ## # # # #) # # # # # # # #	( # # #&# # # # #)* # # #&# # # # #y' # # #&/ / / / /y' / / /4#$ #$ #$ #$ #$	( #$ #$ #$L $  $  $  $  $	(  $  $  $F$ $ $ $ $	( $ $ $>  ' ' '     7 7 7 7 O O O  D D D
5 5 5S S S S Sr   