B
    F.\m+                 @   s$  d dl mZmZmZ d dlmZ d dlZyd dlZW n ek
rL   dZY nX d dl	Z	d dl
mZ d dlmZmZ d dlmZ d dlmZmZmZ edZed	Zed
ZedZdZdddddgZdd Zdd Zdd Zdd Zdd Zdd Z dd Z!d d! Z"e d"d# Z#e d$d% Z$dS )&    )print_functiondivisionabsolute_import)contextmanagerN)gen)connectlisten)Security)
new_configget_certgen_testztls-ca-cert.pemztls-cert.pemztls-key.pemztls-key-cert.pemzECDHE-RSA-AES128-GCM-SHA256ZTLS_AES_128_GCM_SHA256ZTLS_AES_256_GCM_SHA384ZTLS_CHACHA20_POLY1305_SHA256ZTLS_AES_128_CCM_SHA256ZTLS_AES_128_CCM_8_SHA256c           	   C   s   t i  t } W d Q R X | jdks(t| jd ks6t| jd ksDt| jd ksRt| jd ks`t| jd ksnt| j	d ks|t| j
d kst| jd kstd S )N)NF)r
   r	   require_encryptionAssertionErrortls_ca_filetls_cipherstls_client_keytls_client_certtls_scheduler_keytls_scheduler_certtls_worker_keytls_worker_cert)sec r   >lib/python3.7/site-packages/distributed/tests/test_security.pytest_defaults%   s    
r   c           	   C   sP   t  } t| dsttt | j W d Q R X tt d| _W d Q R X d S )Nr    )r	   hasattrr   pytestraisesAttributeErrorZ
tls_foobar)r   r   r   r   test_attribute_error3   s    r    c           	   C   s   ddddddit ddd	} t|  t }W d Q R X |jdksFt|jdksTt|jt ksbt|jd kspt|jd ks~t|j	dkst|j
dkst|jd kst|jdkstd S )
Nzca.pemzskey.pemz	scert.pem)keycertr"   z	wcert.pem)zca-file	schedulerworkerciphersT)tlszrequire-encryption)FORCED_CIPHERr
   r	   r   r   r   r   r   r   r   r   r   r   )cr   r   r   r   test_from_config<   s"    
r)   c           	   C   s   ddddddi} t |  tddd d	}W d Q R X |jdksDt|jdksRt|jd ks`t|jd ksnt|jd ks|t|jdkst|j	dkst|j
d kst|jd kstd S )
Nr&   zca.pemzskey.pemz	scert.pem)r!   r"   )zca-filer#   znewcert.pemT)r   r   r   )r
   r	   r   r   r   r   r   r   r   r   r   r   )r(   r   r   r   r   test_kwargsX   s"    
r*   c           	   C   s4   t i " tddd} t| dks&tW d Q R X d S )Nzca.pemz	scert.pem)r   r   z>Security(tls_ca_file='ca.pem', tls_scheduler_cert='scert.pem'))r
   r	   reprr   )r   r   r   r   	test_reprr   s    
r,   c           	   C   s   dddddddit di} t|  t }W d Q R X |d	}|dddt d
ksVt|d}|dd dt d
ksvt|d}|dd d t d
ksttt |d W d Q R X d S )Nr&   zca.pemzskey.pemz	scert.pem)r!   r"   r"   z	wcert.pem)zca-filer#   r$   r%   r#   )ca_filer!   r"   r%   r$   clientZ
supervisor)r'   r
   r	   Zget_tls_config_for_roler   r   r   
ValueError)r(   r   tr   r   r   test_tls_config_for_rolex   s8    




r1   c        	   	   C   sf  dd } dd }dt ttddtidi}t| t }W d Q R X |d	}|d
 rZt|d }| | || |d}|d }| | || |d}|dd kstt	|d d< d|d< t| t }W d Q R X |
d	}|d
 st|d }| | tjdkrb| }dd |D }t|dks8tdd |D }t|rbt|dksbtd S )Nc             S   s"   | j tjkst| jdkstd S )NF)verify_modesslCERT_REQUIREDr   check_hostname)ctxr   r   r   basic_checks   s    z*test_connection_args.<locals>.basic_checksc             S   s"   t jdkrt|  dkstd S )N)         )sysversion_infolenget_ciphersr   )r6   r   r   r   many_ciphers   s    
z*test_connection_args.<locals>.many_ciphersr&   )r!   r"   r"   )zca-filer#   r$   r#   r   ssl_contextr$   r.   r%   Tzrequire-encryption)r8   r9   c             S   s   g | ]}|d  dkr|qS )protocolzTLSv1.2r   ).0r(   r   r   r   
<listcomp>   s    z(test_connection_args.<locals>.<listcomp>   c             S   s   g | ]}|d  dkr|qS )rA   zTLSv1.3r   )rB   r(   r   r   r   rC      s    r8   )r-   key1cert1keycert1r
   r	   get_connection_argsr   getr'   get_listen_argsr;   r<   r>   r=   )	r7   r?   r(   r   dr6   supported_cipherstls_12_cipherstls_13_ciphersr   r   r   test_connection_args   sF    






rO   c        	   	   C   sf  dd } dd }dt ttddtidi}t| t }W d Q R X |d	}|d
 rZt|d }| | || |d}|d }| | || |d}|dd kstt	|d d< d|d< t| t }W d Q R X |d	}|d
 st|d }| | t
jdkrb| }dd |D }t|dks8tdd |D }t|rbt|dksbtd S )Nc             S   s"   | j tjkst| jdkstd S )NF)r2   r3   r4   r   r5   )r6   r   r   r   r7      s    z&test_listen_args.<locals>.basic_checksc             S   s"   t jdkrt|  dkstd S )N)r8   r9   r:   )r;   r<   r=   r>   r   )r6   r   r   r   r?      s    
z&test_listen_args.<locals>.many_ciphersr&   )r!   r"   r"   )zca-filer#   r$   r#   r   r@   r$   r.   r%   Tzrequire-encryption)r8   r9   c             S   s   g | ]}|d  dkr|qS )rA   zTLSv1.2r   )rB   r(   r   r   r   rC     s    z$test_listen_args.<locals>.<listcomp>rD   c             S   s   g | ]}|d  dkr|qS )rA   zTLSv1.3r   )rB   r(   r   r   r   rC     s    r8   )r-   rE   rF   rG   r
   r	   rJ   r   rI   r'   r;   r<   r>   r=   )	r7   r?   r(   r   rK   r6   rL   rM   rN   r   r   r   test_listen_args   sF    






rP   c        	   
   c   s.  t jdd } dtttddtidi}t| t }W dQ R X t|d d< t| t }W dQ R X t	d	| |
d
d}t|j|ddV }| V }|dkst|  tt t|j|ddV  W dQ R X t|j|ddV }|jd \}}}|tgt kst|  W dQ R X dS )z2
    Functional test for TLS connection args.
    c             s   s.   | j }|dst| dV  |  V  d S )Nztls://hello)Zpeer_address
startswithr   writeclose)commZ	peer_addrr   r   r   handle_comm  s    z,test_tls_listen_connect.<locals>.handle_commr&   )r!   r"   r"   )zca-filer#   r$   Nr%   ztls://r#   )connection_argsr$   rQ   r.   cipher)r   	coroutiner-   rE   rF   rG   r
   r	   r'   r   rJ   r   contact_addressrH   readr   abortr   r   	TypeErrorZ
extra_infoTLS_13_CIPHERS)	rV   r(   r   Zforced_cipher_seclistenerrU   msgrX   _r   r   r   test_tls_listen_connect  s4    


rb   c              c   s  t jdd } dtttddtidi}t| t }W dQ R X d|d	< t| t }W dQ R X xd
D ]}t|| |	dd$}t
|j|ddV }|  W dQ R X t|| |	dd$}t
|j|ddV }|  W dQ R X qjW tdd }xdD ]}t|| |	ddP}t
|j|ddV }|  tt t
|j|ddV  W dQ R X W dQ R X tt t|| |	dd W dQ R X q W dS )z;
    Functional test for "require_encryption" setting.
    c             S   s   |    d S )N)r\   )rU   r   r   r   rV   P  s    z,test_require_encryption.<locals>.handle_commr&   )r!   r"   r"   )zca-filer#   r$   NTzrequire-encryption)z	inproc://ztls://r#   )rW   r$   c           	   s   s2   t t} d V  W d Q R X dt| jks.td S )Nzencryption required)r   r   RuntimeErrorstrvaluer   )excinfor   r   r   check_encryption_errors  s    z7test_require_encryption.<locals>.check_encryption_error)ztcp://)r   rY   r-   rE   rF   rG   r
   r	   r   rJ   r   rZ   rH   r\   r   r   r   rc   )rV   r(   r   Zsec2Zlisten_addrr_   rU   rg   r   r   r   test_require_encryptionK  sF    



$rh   )%Z
__future__r   r   r   
contextlibr   r;   r3   ImportErrorr   Ztornador   Zdistributed.commr   r   Zdistributed.securityr	   Zdistributed.utils_testr
   r   r   r-   rF   rE   rG   r'   r^   r   r    r)   r*   r,   r1   rO   rP   rb   rh   r   r   r   r   <module>   s>   
	);;4