
    Id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y)     N)	dnsserverdnsp)WERRORErrorwerrorc                       e Zd Zy)DNSParseErrorN)__name__
__module____qualname__     1/usr/lib/python3/dist-packages/samba/dnsserver.pyr   r   -   s    r   r   c                   N     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  | _        || _        || _        || _	        y 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   s=    gt%'__
i'	r   c                      | |fi |S r   r   clsr   sepkwargss       r   from_stringzARecord.from_string;       4"6""r   r   	r	   r
   r   r   DNS_RANK_ZONEr   classmethodr)   __classcell__r#   s   @r   r   r   1   s,    '(c8J8J # #r   r   c                   N     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  | _        || _        || _        || _	        y 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   s?    j$(*''
i'	r   c                      | |fi |S r   r   r%   s       r   r)   zAAAARecord.from_stringK   r*   r   r   r+   r/   s   @r   r1   r1   @   s,    ()s9K9K # #r   r1   c                   N     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        |      |_        || _        y 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   s_    i')&&
i'))+3x	r   c                      | |fi |S r   r   r%   s       r   r)   zPTRRecord.from_string^   r*   r   r   r+   r/   s   @r   r7   r7   P   s,    #$#D4F4F
 # #r   r7   c                   N     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        |      |_        || _        y 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   s]    ((
i'++-

U
	r   c                      | |fi |S r   r   r%   s       r   r)   zCNAMERecord.from_stringq   r*   r   r   r+   r/   s   @r   rA   rA   c   s,    %&Cd6H6H
 # #r   rA   c                   N     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        |      |_        || _        y 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   s_    h&(%%
i'##%Z	r   c                      | |fi |S r   r   r%   s       r   r)   zNSRecord.from_string   r*   r   r   r+   r/   s   @r   rH   rH   v   s,    *+4;M;M
 # #r   rH   c                   N     e Zd Zddej                  df fd	Zedd       Z xZS )MXRecordr   r   r   c                    t         t        |           t        j                  | _        ||z  | _        || _        || _        t        j                         }||_        ||j                  _        t        |      |j                  _        || _        y 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__   sq    h&(%%
i'557#)!+.	r   c                     	 |j                  |      \  }}t        |      } | ||fi |S # t        $ r}t        d|z        |d }~ww xY w)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   sk    	K#zz#FH8}H 68.v..  	K !<>B!C DIJK	Ks   + 	AAAr   r+   r/   s   @r   rO   rO      s,    78c((A / /r   rO   c                   j     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&                  _        || _        y 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'**,"$)!$'J!).""&),U""&	r   c                     |j                  |      }t        |      dk7  rt        d      	 t        dd      D ]  }t	        ||         ||<    	  | |i |S # t
        $ r}t        d      |d }~ww xY w)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#t9> !E F F	=1a[ 'd1g,Q'
 D#F##  	= !5 6;<=	=s   "A 	A1 A,,A1r   )
r	   r
   r   r   r,   DNS_RPC_FLAG_AUTH_ZONE_ROOTr   r-   r)   r.   r/   s   @r   r`   r`      s;    ,-s#tD<N<N;;( $ $r   r`   c                   R     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	                 :   t         t        |           t        j                  | _        ||z  | _        || _        || _        t        j                         }	||	_        ||	_        ||	_        ||	j                  _        t!        |      |	j                  _        |	| _        y 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   c                     	 |j                  |      \  }}}}	 |t        |      t        |      t        |      f}	 | |	i |S # t        $ r}t        d|z        |d }~ww xY w# t        $ r}t        d      |d }~ww xY w)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(F	;CIs8}c&kBD
 D#F##  	8 !) ,0!0 1 788	8  	; !3 49:;	;s.   A !A" 	AAA"	A<+A77A<r   r+   r/   s   @r   rz   rz      s0    ./A3((A $ $r   rz   c                   N     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 ]>  }t        j                         }||_
        t        |      |_        |j                  |       @ t        j                         }	t        |      |	_        ||	_
        |	| _        y 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1vDHLL		
 --/J		r   c                 >    t        j                  |      } | |fi |S r   )shlexrY   )r&   r   r'   r(   r   s        r   r)   zTXTRecord.from_string  s     D!5#F##r   r   r+   r/   s   @r   r   r      s,    %&Cd6H6H( $ $r   r   c                      t               j                         D ]8  \  } }| dd  dk(  s| d d } t        t        d| z         }|t        | <   |t        |<   : y )NiRecord	DNS_TYPE_)globalsitemsgetattrr   _RECORD_TYPE_LUT)kvflags      r   _setup_record_type_lutr     s]    	! '1RS6X#2A4q1D"#Q%&T"'r   c                     t        | t              r| j                         } 	 t        |    } |j                  |fd|i|S # t        $ r}t        d      |d}~ww xY w)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     sg     !SGGI>!!$ 6d66v66  >56A=>s   	A   	A	AAc                     | j                         }	 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   (  sK    NNEOt[5011 O;hFGQNOs   % 	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                   j                  d      j                         |j                   j                  d      j                         k(  S )z%Match dns name (of type DNS_RPC_NAME).)r;   rstriplower)n1n2s     r   dns_name_equalr   7  s9    66==##%s);)A)A)CCCr   c                     t        j                  t         j                  |       }t        j                  t         j                  |      S )z.Convert an AAAA address into a canonical form.)socket	inet_ptonAF_INET6	inet_ntop)addrpackeds     r   ipv6_normaliser   <  s/    foot4FFOOV44r   c                 
   t        ||      }t        j                  }	 | j                  t        j                  d|||d||dd
      \  }}	|	r|	j                  dk(  ry|	j                  d   j                  D ]  }|j                  |k7  rd}|t        j                  k(  r|j                  |j                  k(  rUd}nQ|t        j                   k(  r0t#        |j                        t#        |j                        k(  rd}n|t        j$                  k(  r%t'        |j                  |j                        rd}n|t        j(                  k(  r%t'        |j                  |j                        rd}n|t        j*                  k(  r%t'        |j                  |j                        rjd}nf|t        j,                  k(  rgt'        |j                  j.                  |j                  j.                        r|j                  j0                  |j                  j0                  k(  rd}n|t        j2                  k(  r|j                  j4                  |j                  j4                  k(  r|j                  j6                  |j                  j6                  k(  r}|j                  j8                  |j                  j8                  k(  rOt'        |j                  j:                  |j                  j:                        rd}n|t        j<                  k(  rQ|j                  j>                  |j                  j>                  k(  r|j                  j@                  |j                  j@                  k(  r|j                  jB                  |j                  jB                  k(  rx|j                  jD                  |j                  jD                  k(  rJ|j                  jF                  |j                  jF                  k(  rt'        |j                  jH                  |j                  jH                        rt'        |j                  jJ                  |j                  jJ                        rd}n|t        jL                  k(  r|j                  j                  |j                  j                  k(  rqd}tO        |j                  j                        D ]M  }|xrG |j                  jP                  |   jP                  |j                  jP                  |   jP                  k(  }O |s|c S  y# t
        $ r,}
|
j                  d   t        j                  k(  rY d}
~
y|
d}
~
ww xY w)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0D88L	11111fdD$tT3 #))q.wwqz!! 199#$//)xx499$D...chh'>$))+DDD---chh		2D///chh		2D,,,chh		2D,,,chh33TYY5K5KLxx##tyy'<'<<D---xx!!TYY%8%88xx499#4#44xx~~0chh114993G3GHD---xx""dii&:&::xx!!TYY%8%88xx499#4#44xx  DII$6$66xx$$		(>(>>chh88"ii99;chh=="ii>>@D---xx~~0sxx~~. JA! J XX\\!_00DIIMM!4D4H4HH J Jc1f {  66!9AAA s   +T 	U UUU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 OD
5Sr   