B
    F.\                 @   s   d dl mZmZmZ yd dlZW n ek
r8   dZY nX d dlZdddgZddgZdd	gZ	d
gZ
ee
dd e	D  dd eD  Zdd ZG dd deZdS )    )print_functiondivisionabsolute_importNZclientZ	schedulerZworkerkeycertca_fileciphersrequire_encryptionc             C   s   g | ]}d | qS )ztls_%s ).0fieldr
   r
   3lib/python3.7/site-packages/distributed/security.py
<listcomp>   s    r   c             C   s"   g | ]}t D ]}d ||f qqS )z	tls_%s_%s)_tls_per_role_fields)r   roler   r
   r
   r   r      s   c             C   s   |  ddS )N_-)replace)r   r
   r
   r   _field_to_config_key   s    r   c               @   s`   e Zd ZdZee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dd ZdS )Securitya  
    An object to gather and pass around security configuration.
    Default values are gathered from the global ``config`` object and
    can be overriden by constructor args.

    Supported fields:
        - require_encryption
        - tls_ca_file
        - tls_ciphers
        - tls_client_key
        - tls_client_cert
        - tls_scheduler_key
        - tls_scheduler_cert
        - tls_worker_key
        - tls_worker_cert
    c             K   s`   |  tjj x(| D ]\}}|d k	rt| || qW x"tD ]}t| |s>t| |d  q>W d S )N)_init_from_dictdaskZconfigitemssetattr_fieldshasattr)selfkwargskvr
   r
   r   __init__3   s    

zSecurity.__init__c             C   s$   |  |dti  |  |dtt dS )z7
        Initialize Security from nested dict.
         tlsN)_init_fields_from_dict_misc_fields_tls_fieldsr   )r   dr
   r
   r   r   <   s    zSecurity._init_from_dictc       
      C   s   |r| |i }|d }nd}x4|D ],}t|}||kr$t| d||f ||  q$W xPtD ]H}| |i }	x6|D ].}t|}||	krpt| d|||f |	|  qpW qZW d S )Nr   r!   z%s%sz%s%s_%s)getr   r   _roles)
r   r&   categoryfieldsper_role_fieldsZcategory_prefixr   r   r   Zddr
   r
   r   r#   C   s    



zSecurity._init_fields_from_dictc                s2   t  fddtD }dddd |D  d S )Nc             3   s   | ]}|t  |fV  qd S )N)getattr)r   r   )r   r
   r   	<genexpr>V   s    z$Security.__repr__.<locals>.<genexpr>z	Security(z, c             s   s&   | ]\}}|d k	rd||f V  qd S )Nz%s=%rr
   )r   r   r   r
   r
   r   r-   X   s    ))sortedr   join)r   r   r
   )r   r   __repr__U   s    zSecurity.__repr__c             C   s   |  d|ttS )zR
        Return the TLS configuration for the given role, as a flat dict.
        r"   )_get_config_for_roler%   r   )r   r   r
   r
   r   get_tls_config_for_role[   s    z Security.get_tls_config_for_rolec             C   sp   |t krtd|f i }x&|D ]}d||f }t| |||< q W x(|D ] }d|||f }t| |||< qHW |S )Nzunknown role %rz%s_%sz%s_%s_%s)r(   
ValueErrorr,   )r   r)   r   r*   r+   r&   r   r   r
   r
   r   r2   a   s    

zSecurity._get_config_for_rolec             C   s   | dr| drytj||d d}W n tk
rF   tdY nX tj|_d|_||d | d | dr|	| d |S d S )Nr   r   )purposeZcafilez(TLS functionality requires Python 2.7.9+Fr   r   )
r'   sslZcreate_default_contextAttributeErrorRuntimeErrorZCERT_REQUIREDZverify_modeZcheck_hostnameZload_cert_chainZset_ciphers)r   r"   r5   Zctxr
   r
   r   _get_tls_contextm   s    
zSecurity._get_tls_contextc             C   sB   i }|  |}ttdr tjjnd}| |||d< | j|d< |S )zh
        Get the *connection_args* argument for a connect() call with
        the given *role*.
        PurposeNssl_contextr	   )r3   r   r6   r:   ZSERVER_AUTHr9   r	   )r   r   r&   r"   r5   r
   r
   r   get_connection_args}   s    

zSecurity.get_connection_argsc             C   sB   i }|  |}ttdr tjjnd}| |||d< | j|d< |S )zg
        Get the *connection_args* argument for a listen() call with
        the given *role*.
        r:   Nr;   r	   )r3   r   r6   r:   ZCLIENT_AUTHr9   r	   )r   r   r&   r"   r5   r
   r
   r   get_listen_args   s    

zSecurity.get_listen_argsN)__name__
__module____qualname____doc__tupler   	__slots__r    r   r#   r1   r3   r2   r9   r<   r=   r
   r
   r
   r   r      s   	r   )Z
__future__r   r   r   r6   ImportErrorr   r(   r   r%   r$   setr   r   objectr   r
   r
   r
   r   <module>   s   

