
    b/9                         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
mZ d dlZd dlZd dlZd dlZ G d de          Z G d d	e          ZdS )
    )TestCaseInTempDir)dnsdnsp)gensectests)credentialsNc                   z     e Zd Z fdZd Zd Zd Zd ZddZd Z	d	 Z
d
 Zd Z	 ddZ	 ddZddZddZ xZS )DNSTestc                 d    t          t          |                                            d | _        d S N)superr
   setUptimeoutself	__class__s    6/usr/lib/python3/dist-packages/samba/tests/dns_base.pyr   zDNSTest.setUp!   s*    gt""$$$    c                     g d}||         S )zReturn a readable error code)OKFORMERRSERVFAILNXDOMAINNOTIMPREFUSEDYXDOMAINYXRRSETNXRRSETNOTAUTHNOTZONE0x0B0x0C0x0D0x0E0x0FBADSIGBADKEY )r   errcodestring_codess      r   errstrzDNSTest.errstr%   s     
 
 
* G$$r   c           
          |                      ||d|                     |          d|                     |                     dS z$Helper function to check return codezExpected RCODE , got N)assertEqualr+   )r   rcodeexpecteds      r   assert_rcode_equalszDNSTest.assert_rcode_equals>   s[    ;;x0000$++e2D2D2D+F 	G 	G 	G 	G 	Gr   c           
          |j         t          j        z  }|                     ||d|                     |          d|                     |                     dS r-   )	operationr   	DNS_RCODEr/   r+   )r   packetr0   	p_errcodes       r   assert_dns_rcode_equalszDNSTest.assert_dns_rcode_equalsC   sj    $s}4	EE;;u----t{{9/E/E/E,G 	H 	H 	H 	H 	Hr   c                 h    |j         t          j        z  }|                     ||d|d|           dS )zHelper function to check opcodezExpected OPCODE r.   N)r4   r   
DNS_OPCODEr/   )r   r6   opcodep_opcodes       r   assert_dns_opcode_equalsz DNSTest.assert_dns_opcode_equalsI   sI    #cn466!6688,- 	. 	. 	. 	. 	.r   Nc                     t          j                    }|t          j        dd          |_        ||_        g |_        g |_        |S )z!Helper creating a dns.name_packetNr   i   )r   name_packetrandomrandintidr4   	questions
additional)r   r;   qidps       r   make_name_packetzDNSTest.make_name_packetO   sA    O;>#v..ADr   c                 <    t          |          |_        ||_        dS )z$Helper to finalize a dns.name_packetN)lenqdcountrC   )r   r6   rC   s      r   finish_name_packetzDNSTest.finish_name_packetY   s    Y$r   c                 V    t          j                    }||_        ||_        ||_        |S )z#Helper creating a dns.name_question)r   name_questionnamequestion_typequestion_class)r   rN   qtypeqclassqs        r   make_name_questionzDNSTest.make_name_question^   s+    !r   c                     t          j                    }t          j                    }t	          |          |_        ||_        ||_        |S r   )r   
txt_recordr   string_listrI   countstrtxt)r   records	rdata_txts_lists       r   make_txt_recordzDNSTest.make_txt_recordf   s>    N$$	!##7||
	r   c                 X    | j                                                                         S )zHelper to get dns domain)creds	get_realmlower)r   s    r   get_dns_domainzDNSTest.get_dns_domainn   s"    z##%%++---r   Fc                    d}|| j         }	 t          j        |          }|r"t          |                     |                     t          j        t
          j        t
          j        d          }|                    |           |	                    |df           |
                    |d           |                    dd          }|r"t          |                     |                     t          j        t          j        |          }||f||                                 S S # ||                                 w w xY w)z#send a DNS query and read the replyNr   5   i   )r   ndrndr_packprinthexdumpsocketAF_INET
SOCK_DGRAM
settimeoutconnectsendallrecv
ndr_unpackr   r?   close)	r   r6   hostdumpr   ssend_packetrecv_packetresponses	            r   dns_transaction_udpzDNSTest.dns_transaction_udpr   s"    ?lG	,v..K 1dll;//000fnf.?CCALL!!!IItRj!!!IIk1%%%&&q//K 1dll;//000~co{CCHk*}				 q}				 s   D D% %D>c                 R   d}|| j         }	 t          j        |          }|r"t          |                     |                     t          j        t
          j        t
          j        d          }|                    |           |	                    |df           t          j        dt          |                    }||z  }|                    |           |                    dd          }|r"t          |                     |                     t          j        t           j        |dd                   }	||                                 n# ||                                 w w xY wt          j        |	          }
|                     |
|dd                    |	|dd         fS )z?send a DNS query and read the reply, also return the raw packetNr   re   z!Hi     )r   rf   rg   rh   ri   rj   rk   SOCK_STREAMrm   rn   structpackrI   ro   rp   rq   r   r?   rr   r/   )r   r6   rs   rt   r   ru   rv   
tcp_packetrw   rx   	my_packets              r   dns_transaction_tcpzDNSTest.dns_transaction_tcp   s    ?lG	,v..K 1dll;//000fnf.@!DDALL!!!IItRj!!!T3{+;+;<<J+%JIIj!!!&&Q//K 1dll;//000~co{122GGH }			 }				  L**	KO444+abb/**s   D+E E(  c                 Z   |                      t          j                  }g }|p|                                 }|                     |t          j        t          j                  }|                    |           |                     ||           g }t          j	                    }	|d||	_
        t          j        |	_        t          j        |	_        ||	_        d|	_        |                     |          }
|
|	_        |                    |	           t%          |          |_        ||_        |S )N.  )rG   r   DNS_OPCODE_UPDATErc   rT   DNS_QTYPE_SOADNS_QCLASS_INappendrK   res_recrN   DNS_QTYPE_TXTrr_typerr_classttllengthr^   rdatarI   nscountnsrecs)r   prefix	txt_arrayzoner   rF   updatesrN   urr   s              r   make_txt_updatezDNSTest.make_txt_update   s   !!#"788,t**,,##D#*;S=NOOq7+++KMM"FFDD)%	&
$$Y//qLL	r   c                 >   |d|p|                                  }|                     t          j                  }g }|                     |t          j        t          j                  }|                    |           |                     ||           | 	                    || j
                  \  }}	|                     |t          j                   |                     |j        d           |                     |j        d         j        j        j        |           d S )Nr   )rs      r   )rc   rG   r   DNS_OPCODE_QUERYrT   r   r   r   rK   ry   	server_ipr8   DNS_RCODE_OKr/   ancountanswersr   rZ   rY   )
r   r   r   r   rN   rF   rC   rS   rx   response_packets
             r   check_query_txtzDNSTest.check_query_txt   s    &&$"?$*=*=*?*?"?@!!#"677	##D#*;S=NOO9---$$QT^$<< 	$?$$Xs/?@@@)1---)!,26:IFFFFFr   r   )FN)Nr   )__name__
__module____qualname__r   r+   r2   r8   r=   rG   rK   rT   r^   rc   ry   r   r   r   __classcell__r   s   @r   r
   r
      s,           % % %2G G G
H H H. . .   % % %
    . . .
 15   0 15+ + + +>   0G G G G G G G Gr   r
   c                   H     e Zd Z fdZddZddZd Zd Zd Zdd
Z	 xZ
S )DNSTKeyTestc                 d   t          t          |                                            i | _        t	          j                    x| j        d<   | _        | j        | j        d<   t          j	                    | _
        | j
                            | j                   | j
                            t	          j        d                     | j
                            t	          j        d                     | j
                            t          j                   d|                                 z  | _        d S )Nlp_ctxtarget_hostnameUSERNAMEPASSWORDztkeytsig.%s)r   r   r   settingsr   env_loadparmr   serverr   Credentialsr`   guessset_usernameenv_get_var_valueset_passwordset_kerberos_stateMUST_USE_KERBEROSrc   
newrecnamer   s    r   r   zDNSTKeyTest.setUp   s    k4  &&(((050B0D0DDh$++/;'( ,..

%%%
 7
 C CDDD
 7
 C CDDD
%%k&CDDD'$*=*=*?*??r   Nc                    || j         }t          j                    d|                                 | _        |                     t          j                  }|                     | j        t          j	        t          j
                  }g }|                    |           |                     ||           t          j                    }| j        |_        t          j	        |_        t          j
        |_        d|_        d|_        t          j                    }d|_        t+          t-          j                              |_        t+          t-          j                              dz   |_        t          j        |_        d|_        d|_        t:          j                            | j                   | _!        | j!        "                    |           | j!        #                    d           | j!        $                    | j%                   | j!        &                    t:          j'                   | j!        (                    d           d	}d
}| j!        )                    |          \  }}	| *                    |           d tW          |	          D             }
|
|_,        t[          |
          |_.        ||_/        |g}d|_0        ||_1        | 2                    || j3                  \  }}| 4                    |t          j5                   |j6        d         j/        }to          |j,                  }	| j!        )                    |	          \  }}| 8                    |           | 9                    ||           dS )z4Do a TKEY transaction and establish a gensec contextNr   r   r   gss-tsigi  r   spnegoFr   c                 Z    g | ](}t          |t                    r|nt          |          )S r(   
isinstanceintord.0xs     r   
<listcomp>z*DNSTKeyTest.tkey_trans.<locals>.<listcomp>	  s1    TTTZ3''3SVVTTTr   r   ):r`   uuiduuid4rc   key_namerG   r   r   rT   DNS_QTYPE_TKEYr   r   rK   r   rN   r   r   r   r   tkey_record	algorithmr   time	inception
expirationDNS_TKEY_MODE_GSSAPImodeerror
other_sizer   Securitystart_clientr   gset_credentialsset_target_serviceset_target_hostnamer   want_featureFEATURE_SIGNstart_mech_by_nameupdateassertFalselistkey_datarI   key_sizer   arcountrD   r   r   r8   r   r   bytes
assertTrueverify_packet)r   r`   rF   rS   rC   r   r   finishedclient_to_serverserver_to_clientdatarD   rx   r   r   s                  r   
tkey_transzDNSTKeyTest.tkey_trans   s    =JE#':<<<<1D1D1F1F1FG!!#"677##DM$'$6$'$57 7 	9---KMM&	&
!!$dikk**ty{{++g5-
--dm<<u%%%!!%(((""4;///F/000!!(+++'+v}}5E'F'F$#"""TTTBR=S=STTTTS
	! $$Q77 	$?$$Xs/?@@@&q)/ !566'+v}}5E'F'F$#!!!8_55555r   r   c                    |                      |j        d         j        t          j                   |j        d         j        }t          |j                  }t          | j	                  dz   }t          t          j        |                    |z   dz   }d |D             }|| d = d|d<   t          |          }	t          j                    }
| j	        |
_        t          j        |
_        d|
_        |j        |
_        |j        |
_        |j        |
_        |j        |
_        d|
_        d|
_        t          j        |
          }||	z   |z   }| j                            |||           d S )Nr   r{   
   c                 Z    g | ](}t          |t                    r|nt          |          )S r(   r   r   s     r   r   z-DNSTKeyTest.verify_packet.<locals>.<listcomp>*  s1    ]]]Z3%7%7 CSVV]]]r      )r/   rD   r   r   DNS_QTYPE_TSIGr   r   macrI   r   rf   rg   fake_tsig_recrN   DNS_QCLASS_ANYr   r   time_prefixr   algorithm_namefudger   r   r   check_packet)r   rx   r   request_mactsig_recordr   key_name_lentsig_record_lenresponse_packet_listresponse_packet_wo_tsig	fake_tsigfake_tsig_packetr   s                r   r   zDNSTKeyTest.verify_packet  sc   ,Q/79KLLL)!,2KO$$ 4=))A-cl;7788<G"L  ^]_]]] /!1!2!23#$R  #((<"="=%''		 /		 + 7	$)	#.#=	 %+		 	<	22447GGD$,,,,,r   c                 R   t          j        |          }t          j                    }||_        t          j        |_        d|_        d|_        t          t          j
                              |_
        d|_        d|_        d|_        d|_        t          j        |          }||z   }| j                            ||          }d t#          |          D             }t          j                    }	d|	_        d|	_        |j
        |	_
        d|	_        |j        |	_        d|	_        d|	_        ||	_        t-          |          |	_        t          j                    }
||
_        t          j        |
_        t          j        |
_        d|
_        d|
_        |	|
_        |
g}||_        d|_        |S )z2Sign a packet, calculate a MAC and add TSIG recordr   r   ,  c                 Z    g | ](}t          |t                    r|nt          |          )S r(   r   r   s     r   r   z+DNSTKeyTest.sign_packet.<locals>.<listcomp>R  s1    KKKAAs++7AAQKKKr   r   r   )rf   rg   r   r   rN   r   r   r   r   r   r   r   r   r   r   r   sign_packetr   r   rB   original_idr   rI   mac_sizer   r   r   r   r   rD   r   )r   r6   r   packet_datar   r   r   r   mac_listr   r   rD   s               r   r  zDNSTKeyTest.sign_packet@  sn   l6**%''	!	 /		 !	TY[[))	#-	 		 	<	22--f  t,,KKcKKK!!)^
"I	XKMM&	'
S
&
r   c                     d t          d          D             }t          j                    }d|_        d|_        t          t          j                              |_        d|_        |j        |_	        d|_
        d|_        ||_        t          |          |_        t          j                    }||_        t          j        |_        t          j        |_        d|_        d|_        ||_        |g}||_        d|_        dS )	zOAdd bad signature for a packet by bitflipping
        the final byte in the MACc                 Z    g | ](}t          |t                    r|nt          |          )S r(   r   r   s     r   r   z/DNSTKeyTest.bad_sign_packet.<locals>.<listcomp>q  s1    PPPAAs++7AAQPPPr   badmacr   r   r   r   r   N)r   r   r   r   r   r   r   r   rB   r  r   r   r   rI   r  r   rN   r   r   r   r   r   r   r   rD   r   )r   r6   r   r  r   r   rD   s          r   bad_sign_packetzDNSTKeyTest.bad_sign_packetm  s     QPhPPP!!)%%
"I	XKMM&	'
S
&r   c                 @   |                      t          j                  }g }|                     |t          j        t          j                  }|                    |           |                     ||           |                     || j	                  \  }}|j
        dz  S )N   )rG   r   r   rT   r   r   r   rK   ry   r   r4   )r   rN   rF   rC   rS   rx   r   s          r   search_recordzDNSTKeyTest.search_record  s    !!#"677	##D#*;S=NOO9---$$Q77 	$?!F**r   Fc                 |   t           j        }d}|rt           j        }d}|                     t           j                  }|                     |                                 t           j        t           j                  }g }|                    |           | 	                    ||           g }t          j
                    }| j        |_        t           j        |_        ||_        ||_        d|_        |                     dg          }	|	|_        |                    |           t)          |          |_        ||_        |S )zCreate a DNS update requestr   r   r   z"This is a test")r   r   DNS_QCLASS_NONErG   r   rT   rc   r   r   rK   r   r   rN   r   r   r   r   r   r^   r   rI   r   r   )
r   deleter   r   rF   rS   rC   r   r   r   s
             r   make_update_requestzDNSTKeyTest.make_update_request  s    $ 	*HC!!#"788##D$7$7$9$9$'$5$'$57 7 	9---KMM%	
$$&8%9::qLL	r   r   )r   )F)r   r   r   r   r   r   r  r	  r  r  r   r   s   @r   r   r      s        @ @ @ @ @=6 =6 =6 =6~!- !- !- !-F+ + +Z  :
+ 
+ 
+       r   r   )samba.testsr   samba.dcerpcr   r   sambar   r   r   r}   	samba.ndrrf   r@   rj   r   r   r
   r   r(   r   r   <module>r     s  & * ) ) ) ) ) " " " " " " " "                         nG nG nG nG nG nG nG nGbe e e e e' e e e e er   