
    b}T                     |   d dl Z d dlZd dlZd dlZd dlZd dlZd dlZd dlmZ d dlm	Z	 d dl
mZ d dlmZmZ d dlmZmZ d dlmZ d dlZd dlZdZ ej        d          Z ej        e          Ze                    e           e                    dd	d
d            ej        e          Ze                    e            ee          Z e                    e            e!                                \  Z"Z#e$                                Z%e&                    e%          Z'e"j(        Z( e)e#          dk     r$e*                                  ej+        d           e#d          Z,e#d         Z-e#dd         Z.e'/                    e	j0                    G d de          Z1d Z2 G d de1          Z3 ee4e            dS )    N)credentials)TestCase)dnsdnsp)SubunitOptionsTestProgram6   zEdns_forwarder.py <server name> <server ip> (dns forwarder)+ [options]z	--timeoutinttimeoutz Specify timeout for DNS requests)typedesthelp         c                       e Zd Z ed  ee                                          D                       Zd Zd Z	ddZ
d Zd Zd Zed	efd
Zd ZdS )DNSTestc              #   N   K   | ] \  }}|                     d           ||fV  !dS )
DNS_RCODE_N)
startswith).0kvs      ;/usr/lib/python3/dist-packages/samba/tests/dns_forwarder.py	<genexpr>zDNSTest.<genexpr>G   s;      WWtq!ALL<V<VWQFWWWWWW    c           	          |j         t          j        z  }|                     ||d| j        |         d| j        |                    dS )z$Helper function to check return codezExpected RCODE , got N)	operationr   	DNS_RCODEassertEqualerrcodes)selfpacketrcode	p_errcodes       r   assert_dns_rcode_equalszDNSTest.assert_dns_rcode_equalsI   s`    $s}4	EE=///y1I1I,K 	L 	L 	L 	L 	Lr   c                 h    |j         t          j        z  }|                     ||d|d|           dS )zHelper function to check opcodezExpected OPCODE r   N)r   r   
DNS_OPCODEr!   )r#   r$   opcodep_opcodes       r   assert_dns_opcode_equalsz DNSTest.assert_dns_opcode_equalsO   sI    #cn466!6688,- 	. 	. 	. 	. 	.r   Nc                     t          j                    }|t          j        dd          |_        ||_        g |_        |S )z!Helper creating a dns.name_packetNr     )r   name_packetrandomrandintidr   	questions)r#   r*   qidps       r   make_name_packetzDNSTest.make_name_packetU   s:    O;>#v..ADr   c                 <    t          |          |_        ||_        dS )z$Helper to finalize a dns.name_packetN)lenqdcountr3   )r#   r$   r3   s      r   finish_name_packetzDNSTest.finish_name_packet^   s    Y$r   c                 V    t          j                    }||_        ||_        ||_        |S )z#Helper creating a dns.name_question)r   name_questionnamequestion_typequestion_class)r#   r=   qtypeqclassqs        r   make_name_questionzDNSTest.make_name_questionc   s+    !r   c                 X    | j                                                                         S )zHelper to get dns domain)creds	get_realmlower)r#   s    r   get_dns_domainzDNSTest.get_dns_domaink   s"    z##%%++---r   Fc                 h   d}	 t          j        |          }|r"t          |                     |                     t	          j        t          j        t          j        d          }|                    |           |                    |df           |	                    |d           |
                    dd          }|r"t          |                     |                     t          j        t          j        |          ||                                 S S # ||                                 w w xY w)z#send a DNS query and read the replyNr   5   i   )ndrndr_packprinthexdumpsocketAF_INET
SOCK_DGRAM
settimeoutconnectsendrecv
ndr_unpackr   r/   close)r#   r$   hostdumpr   ssend_packetrecv_packets           r   dns_transaction_udpzDNSTest.dns_transaction_udpo   s    	,v..K 1dll;//000fnf.?CCALL!!!IItRj!!!FF;"""&&q//K 1dll;//000>#/;??}				 q}				 s   C<D D1c                    |                      t          j                  }|                                 }|                     |t          j        t          j                  }|                     ||g           t          j                    }||_	        t          j
        |_        t          j        |_        d|_        d|_        |}||_        d|_        |g|_        |                     |          }|                     |t          j                   d S )Ni  r.   r   )r6   r   DNS_OPCODE_UPDATErH   rC   DNS_QTYPE_SOADNS_QCLASS_INr:   res_recr=   DNS_QTYPE_CNAMErr_typerr_classttllengthrdatanscountnsrecsr]   r'   DNS_RCODE_OK)	r#   keyvaluer5   r=   urrh   responses	            r   make_cname_updatezDNSTest.make_cname_update   s    !!#"788""$$##D#*;S=NOOA3'''KMM'	&
	3++A..$$Xs/?@@@@@r   N)__name__
__module____qualname__dictvarsr   itemsr"   r'   r,   r6   r:   rC   rH   	server_ipr   r]   rq    r   r   r   r   E   s        tWWttCyy'8'8WWWWWHL L L. . .   % % %
  . . . 09!&   (A A A A Ar   r   c                     t          j         t           j        t           j        d          }|                    | |f           |S )Nr   )rO   rP   rQ   rS   )rX   portrZ   s      r   contact_real_serverr}      s5    fnf&7;;AIItTlHr   c                        e Zd Z fdZ fdZd Z f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 xZS )TestDnsForwardingc                 V     t          t          |           j        |i | g | _        d S rr   )superr   __init__subprocesses)r#   argskwargs	__class__s      r   r   zTestDnsForwarding.__init__   s4    /&&/@@@@r   c                     t          t          |                                            t          | _        t
          | _        t          | _        t          | _        d S rr   )r   r   setUpserver_nameserverry   lprE   )r#   r   s    r   r   zTestDnsForwarding.setUp   s@    &&,,...!"


r   c                 @   t           j        }t          j        |t          j                            t          j                    d          |t          |          |g          }| j
                            |           |                    d          dk    r+t          j        t          j        t          j        d          }n*t          j        t          j        t          j        d          }t#          d          D ]}t%          j        d           |                    ||f           	 |                    dd           n@# t          j        $ r.}|j        t.          j        t.          j        fv rY d }~xY d }~nd }~ww xY w|j        |                     d           |c S d S )	Nz2python/samba/tests/dns_forwarder_helpers/server.py:r   i,  g?s	   timeout 0z&Toy server has managed to die already!)sys
executable
subprocessPopenospathjoinsambasource_tree_topdirstrr   appendfindrO   AF_INET6rQ   rP   rangetimesleeprS   rT   errorerrnoECONNREFUSEDEHOSTUNREACH
returncodefail)	r#   rX   r|   r2   pythonr5   rZ   ies	            r   start_toy_serverz"TestDnsForwarding.start_toy_server   s   f gll5+C+E+E,MN N "3t99b	2 3 3
 	  ###IIcNNb  fov/@!DDAAfnf.?CCAs 	 	AJtIItTl###|Q''''<   7u153EFFFHHHH GFFFF |'		BCCCHHH	 	s   'D>>E;E66E;c                     t          t          |                                            | j        D ]}|                                 d S rr   )r   r   tearDownr   kill)r#   r5   r   s     r   r   zTestDnsForwarding.tearDown   sK    &&//111" 	 	AFFHHHH	 	r   c                 j   |                      t          d         dd          }|                    dd           d}|                     t          j                  }g }|                     |t          j        t          j                  }|	                    |           | 
                    ||           t          j        |          }|                    |d           |                    d           	 |                    dd           |                     d           d S # t           j        $ r Y d S w xY w)	Nr   rJ   
forwarder1s   timeout 1000000z an-address-that-will-not-resolver     z'DNS forwarder should have been inactive)r   dns_serversrT   r6   r   DNS_OPCODE_QUERYrC   DNS_QTYPE_TXTra   r   r:   rK   rL   rR   rU   r   rO   r   )r#   rZ   r=   r5   r3   rB   r[   s          r   test_comatose_forwarderz)TestDnsForwarding.test_comatose_forwarder   s!   !!+a."lCC	!1%%% 2!!#"677	##D#*;S=NOO9---l1oo	{A	Q	FF:q!!!II?@@@@@~ 	 	 	DD	s   2+D D21D2c                 z   t          t          d          }d}|                     t          j                  }g }|                     |t          j        t          j                  }|                    |           | 	                    ||           t          j        |          }| 	                    ||           |xj        t          j        z  c_        t          j        |          }|                    |d           |                    t                      	 |                    dd          }t          j        t          j        |          }|                     |t          j                   |                     |j        d           d S # t0          j        $ r! |                     dt           z             Y d S w xY wNrJ   dsfsfds.dsfsdfsr   r   #DNS server is too slow (timeout %s))r}   ry   r6   r   r   rC   r   ra   r   r:   rK   rL   r   DNS_FLAG_RECURSION_DESIREDrT   rR   r   rU   rV   r/   r'   DNS_RCODE_SERVFAILr!   ancountrO   r   r#   adr=   r5   r3   rB   r[   datas           r   test_no_active_forwarderz*TestDnsForwarding.test_no_active_forwarder   s    B// !!#"677	##D#*;S=NOO9---l1oo9---	s55l1oo
Q
g	G77:q))D>#/488D((s/EFFFT\1-----~ 	G 	G 	GII;gEFFFFFF	Gs   A0F
 
,F:9F:c                 F   t          t          d          }d}|                     t          j                  }g }|                     |t          j        t          j                  }|                    |           | 	                    ||           t          j        |          }| 	                    ||           t          j        |          }|                    |d           |                    t                     	 |                    dd          }t          j        t          j        |          }|                     |t          j                   |                     |j        d           d S # t,          j        $ r! |                     dt          z             Y d S w xY wr   )r}   ry   r6   r   r   rC   r   ra   r   r:   rK   rL   rT   rR   r   rU   rV   r/   r'   DNS_RCODE_NXDOMAINr!   r   rO   r   r   s           r    test_no_flag_recursive_forwarderz2TestDnsForwarding.test_no_flag_recursive_forwarder   ss    B// !!#"677	##D#*;S=NOO9---l1oo9---l1oo
Q
g	G77:q))D>#/488D((s/EFFFT\1-----~ 	G 	G 	GII;gEFFFFFF	Gs   >A0E0 0,F F c                    |                      t          d         dd          }t          t          d          }d}|                     t
          j                  }g }|                     |t
          j        t
          j	                  }|
                    |           |                     ||           |xj        t
          j        z  c_        t          j        |          }|                    |d           |                    t$                     	 |                    dd          }t          j        t
          j        |          }|                     |t
          j                   |                     d|j        d         j                   d S # t6          j        $ r! |                     dt$          z             Y d S w xY w)Nr   rJ   r   r   r   r   )r   r   r}   ry   r6   r   r   rC   rc   ra   r   r:   r   r   rK   rL   rT   rR   r   rU   rV   r/   r'   rk   r!   answersrh   rO   r   	r#   rZ   r   r=   r5   r3   rB   r[   r   s	            r   test_single_forwarderz'TestDnsForwarding.test_single_forwarder  s   !!+a."lCC B// !!#"677	##D#*=$'$57 79---	s55l1oo
Q
g	G77:q))D>#/488D((s/?@@@\4<?+@AAAAA~ 	G 	G 	GII;gEFFFFFF	Gs   A;F ,F=<F=c                    t          t          d          }d}|                     t          j                  }g }|                     |t          j        t          j                  }|                    |           | 	                    ||           |xj
        t          j        z  c_
        t          j        |          }|                    |d           |                    t                      	 |                    dd          }t          j        t          j        |          }|                     |t          j                   d S # t,          j        $ r! |                     dt           z             Y d S w xY wr   )r}   ry   r6   r   r   rC   rc   ra   r   r:   r   r   rK   rL   rT   rR   r   rU   rV   r/   r'   r   rO   r   r   s           r   (test_single_forwarder_not_actually_therez:TestDnsForwarding.test_single_forwarder_not_actually_there0  sP    B// !!#"677	##D#*=$'$57 79---	s55l1oo
Q
g	G77:q))D>#/488D((s/EFFFFF~ 	G 	G 	GII;gEFFFFFF	Gs   .AE ,E54E5c                 `   |                      t          d         dd          }|                    dd           t          t          d          }d}|                     t          j                  }g }|                     |t          j	        t          j
                  }|                    |           |                     ||           |xj        t          j        z  c_        t          j        |          }|                    |d           |                    t$                     	 |                    dd          }t          j        t          j        |          }|                     |t          j                   d S # t0          j        $ r! |                     dt$          z             Y d S w xY w)Nr   rJ   r      timeout 10000r   r   r   )r   r   rT   r}   ry   r6   r   r   rC   rc   ra   r   r:   r   r   rK   rL   rR   r   rU   rV   r/   r'   r   rO   r   r   s	            r   %test_single_forwarder_waiting_foreverz7TestDnsForwarding.test_single_forwarder_waiting_foreverG  s   !!+a."lCC	### B// !!#"677	##D#*=$'$57 79---	s55l1oo
Q
g	G77:q))D>#/488D((s/EFFFFF~ 	G 	G 	GII;gEFFFFFF	Gs   &AE= =,F-,F-c                 L   t          t                    dk     rt          d           d S |                     t          d         dd          }|                     t          d         t          d          }|                    dd           t          t          d          }d	}|                     t          j
                  }g }|                     |t          j        t          j                  }|                    |           |                     ||           |xj        t          j        z  c_        t%          j        |          }|                    |d           |                    t*                     	 |                    d
d          }	t%          j        t          j        |	          }	|                     |	t          j                   |                     d|	j        d         j                   d S # t<          j        $ r! |                     dt*          z             Y d S w xY w)Nr   z+Ignoring test_double_forwarder_first_frozenr   rJ   r   r   
forwarder2s   timeout 1000r   r   r    r8   r   rM   r   	DNS_PORT2rT   r}   ry   r6   r   r   rC   rc   ra   r   r:   r   r   rK   rL   rR   r   rU   rV   r/   r'   rk   r!   r   rh   rO   r   
r#   s1s2r   r=   r5   r3   rB   r[   r   s
             r   "test_double_forwarder_first_frozenz4TestDnsForwarding.test_double_forwarder_first_frozen`  s   {a?@@@F"";q>2|DD"";q>9lKK
### B// !!#"677	##D#*=$'$57 79---	s55l1oo
Q
g	G77:q))D>#/488D((s/?@@@\4<?+@AAAAA~ 	G 	G 	GII;gEFFFFFF	Gs   6A;G3 3,H#"H#c                    t          t                    dk     rt          d           d S |                     t          d         t          d          }t          t          d          }d}|                     t          j	                  }g }| 
                    |t          j        t          j                  }|                    |           |                     ||           |xj        t          j        z  c_        t#          j        |          }|                    |d           |                    t*                     	 |                    dd          }t#          j        t          j        |          }|                     |t          j                   |                     d|j        d         j                   d S # t<          j        $ r! |                     d	t*          z             Y d S w xY w)
Nr   z)Ignoring test_double_forwarder_first_downr   r   rJ   r   r   r   r   ) r8   r   rM   r   r   r}   ry   r6   r   r   rC   rc   ra   r   r:   r   r   rK   rL   rT   rR   r   rU   rV   r/   r'   rk   r!   r   rh   rO   r   )	r#   r   r   r=   r5   r3   rB   r[   r   s	            r    test_double_forwarder_first_downz2TestDnsForwarding.test_double_forwarder_first_down~  s   {a=>>>F"";q>9lKK B// !!#"677	##D#*=$'$57 79---	s55l1oo
Q
g	G77:q))D>#/488D((s/?@@@\4<?+@AAAAA~ 	G 	G 	GII;gEFFFFFF	Gs   >A;F; ;,G+*G+c                 x   t          t                    dk     rt          d           d S |                     t          d         dd          }|                     t          d         t          d          }|                    dd           |                    dd           t          t          d          }d	}|                     t          j
                  }g }|                     |t          j        t          j                  }|                    |           |                     ||           |xj        t          j        z  c_        t%          j        |          }|                    |d           |                    t*                     	 |                    d
d          }	t%          j        t          j        |	          }	|                     |	t          j                   |                     d|	j        d         j                   d S # t<          j        $ r! |                     dt*          z             Y d S w xY w)Nr   z(Ignoring test_double_forwarder_both_slowr   rJ   r   r   r   s   timeout 1.5r   r   r   r   r   s
             r   test_double_forwarder_both_slowz1TestDnsForwarding.test_double_forwarder_both_slow  s   {a<===F"";q>2|DD"";q>9lKK
"""
""" B// !!#"677	##D#*=$'$57 79---	s55l1oo
Q
g	G77:q))D>#/488D((s/?@@@\4<?+@AAAAA~ 	G 	G 	GII;gEFFFFFF	Gs   A;H	 	,H98H9c                    |                      t          d         dd          }t          t          d          }d}|                     t
          j                  }g }|                     |t
          j        t
          j	                  }|
                    |           |                     ||           |xj        t
          j        z  c_        t          j        |          }|                    |d           |                    t$                     	 |                    dd          }t          j        t
          j        |          }|                     |t
          j                   |                     t3          |j                  d           |                     d|j        d         j                   d S # t8          j        $ r! |                     dt$          z             Y d S w xY w)Nr   rJ   r   zresolve.cnamer   r   r   )r   r   r}   ry   r6   r   r   rC   rc   ra   r   r:   r   r   rK   rL   rT   rR   r   rU   rV   r/   r'   rk   r!   r8   r   rh   rO   r   )	r#   r   r   r=   r5   r3   rB   r[   r   s	            r   
test_cnamezTestDnsForwarding.test_cname  s   "";q>2|DD B//!!#"677	##D#*=$'$57 79---	s55l1oo
Q
g	G77:q))D>#/488D((s/?@@@S..222\4<?+@AAAAA~ 	G 	G 	GII;gEFFFFFF	Gs   B#F5 5,G%$G%c                    |                      t          d         dd          }d|                                 z  }|                     |d           t	          t
          d          }|                     t          j                  }g }| 	                    |t          j
        t          j                  }|                    |           |                     ||           |xj        t          j        z  c_        t!          j        |          }|                    |d           |                    t(                     	 |                    dd          }t!          j        t          j        |          }|                     |t          j                   |                     d|j        d         j                   d S # t:          j        $ r! |                     dt(          z             Y d S w xY w)	Nr   rJ   r   resolve.cname.%sr   r   r   r   )r   r   rH   rq   r}   ry   r6   r   r   rC   DNS_QTYPE_Ara   r   r:   r   r   rK   rL   rT   rR   r   rU   rV   r/   r'   rk   r!   r   rh   rO   r   )	r#   r   r=   r   r5   r3   rB   r[   r   s	            r   test_double_cnamez#TestDnsForwarding.test_double_cname  s   "";q>2|DD!D$7$7$9$99t%6777 B//!!#"677	##D#/$'$57 79---	s55l1oo
Q
g	G77:q))D>#/488D((s/?@@@\4<?+@AAAAA~ 	G 	G 	GII;gEFFFFFF	Gs   ;A;F8 8,G('G(c                    t          t                    dk     rt          d           d S |                     t          d         dd          }|                     t          d         t          d          }|                    dd           d	|                                 z  }|                     |d
           t          t          d          }| 
                    t          j                  }g }|                     |t          j        t          j                  }|                    |           |                     ||           |xj        t          j        z  c_        t)          j        |          }|                    |d           |                    t.                     	 |                    dd          }	t)          j        t          j        |	          }	|                     |	t          j                   |                     d|	j        d         j                   d S # t@          j        $ r! | !                    dt.          z             Y d S w xY w)Nr   z/Ignoring test_cname_forwarding_with_slow_serverr   rJ   r   r   r   r   r   r   r   r   r   )"r8   r   rM   r   r   rT   rH   rq   r}   ry   r6   r   r   rC   r   ra   r   r:   r   r   rK   rL   rR   r   rU   rV   r/   r'   rk   r!   r   rh   rO   r   )
r#   r   r   r=   r   r5   r3   rB   r[   r   s
             r   &test_cname_forwarding_with_slow_serverz8TestDnsForwarding.test_cname_forwarding_with_slow_server  s	   {aCDDDF"";q>2|DD"";q>9lKK
 !$$$!D$7$7$9$99t%6777 B//!!#"677	##D#/$'$57 79---	s55l1oo
Q
g	G77:q))D>#/488D((s/?@@@\4<+;+ABBBBB~ 	G 	G 	GII;gEFFFFFF	Gs   !A;H ,IIc                    t          t                    dk     rt          d           d S |                     t          d         t          d          }d|                                 z  }d|                                 z  }|                     ||           |                     |d           t          t          d          }| 	                    t          j                  }g }|                     |t          j        t          j                  }|                    |           |                     ||           |xj        t          j        z  c_        t'          j        |          }|                    |d	           |                    t.                     	 |                    d
d	          }	t'          j        t          j        |	          }	|                     |	t          j                   |                     d|	j        d         j                   d S # t@          j        $ r! | !                    dt.          z             Y d S w xY w)Nr   z/Ignoring test_cname_forwarding_with_server_downr   r   resolve1.cname.%sresolve2.cname.%sr   rJ   r   r   r   r   )"r8   r   rM   r   r   rH   rq   r}   ry   r6   r   r   rC   r   ra   r   r:   r   r   rK   rL   rT   rR   r   rU   rV   r/   r'   rk   r!   r   rh   rO   r   )
r#   r   name1name2r   r5   r3   rB   r[   r   s
             r   &test_cname_forwarding_with_server_downz8TestDnsForwarding.test_cname_forwarding_with_server_down  s   {aCDDDF"";q>9lKK#d&9&9&;&;;#d&9&9&;&;;ue,,,u&7888 B//!!#"677	##E3?$'$57 79---	s55l1oo
Q
g	G77:q))D>#/488D((s/?@@@\4<+;+ABBBBB~ 	G 	G 	GII;gEFFFFFF	Gs   A;H ,IIc                    d|                                  z  }|                     t          d         d|          }d|                                  z  }d|                                  z  }|                     ||           |                     ||           |                     |d           t	          t
          d          }|                     t          j                  }g }| 	                    |t          j
        t          j                  }|                    |           |                     ||           |xj        t          j        z  c_        t!          j        |          }	|                    |	d           |                    t(                     	 |                    dd          }
t!          j        t          j        |
          }
|                     |
t          j                   |                     ||
j        d         j                   d S # t:          j        $ r! |                     d	t(          z             Y d S w xY w)
Nzresolve3.cname.%sr   rJ   r   r   r   r   r   r   )rH   r   r   rq   r}   ry   r6   r   r   rC   r   ra   r   r:   r   r   rK   rL   rT   rR   r   rU   rV   r/   r'   rk   r!   r   rh   rO   r   )r#   name3r   r   r   r   r5   r3   rB   r[   r   s              r   )test_cname_forwarding_with_lots_of_cnamesz;TestDnsForwarding.test_cname_forwarding_with_lots_of_cnames2  s   #d&9&9&;&;;"";q>2u==#d&9&9&;&;;#d&9&9&;&;;ue,,,ue,,,u&7888 B//!!#"677	##E3?$'$57 79---	s55l1oo
Q
g	G77:q))D>#/488D ((s/?@@@UDL$4$:;;;;;~ 	G 	G 	GII;gEFFFFFF	Gs   A;H ,II)rs   rt   ru   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   __classcell__)r   s   @r   r   r      sx                 4    
  0G G G6G G G6G G G2G G G.G G G2G G G<G G G8G G G>G G G6G G G8G G GBG G GB#G #G #G #G #G #G #Gr   r   )moduleopts)5r   r   r0   rO   r   r   r   	samba.ndrrK   r   samba.testsr   samba.dcerpcr   r   samba.tests.subunitrunr   r   samba.getoptgetoptoptionsoptparser   r   OptionParserparserSambaOptions	sambaoptsadd_option_group
add_optionCredentialsOptionscredoptssubunitopts
parse_argsr   r   get_loadparmr   get_credentialsrE   r   r8   print_usageexitr   ry   r   set_krb_forwardableNO_KRB_FORWARDABLEr   r}   r   rs   rz   r   r   <module>r     s  $ 
			 



                              " " " " " " " " > > > > > > > >           			f	g	g G ((	   	 " " "   +E	9  ; ; ; &7%f--    ! ! !nV$$    $ $ $  
d  $$
,3t99q==
CHQKKK1gG	122h   +8 9 9 9PA PA PA PA PAh PA PA PAf  wG wG wG wG wG wG wG wGt 8+ . . . . . .r   