/home/lnzliplg/www/__pycache__.tar
version.cpython-36.pyc000064400000001147151730204560010665 0ustar003

�F\r�@sBdZddddddddgZd	Zd
ZdZdZd
ZdZdZdj	e�Z
dS)z9
pyOpenSSL - A simple wrapper around the OpenSSL library
�
__author__�
__copyright__�	__email__�__license__�__summary__�	__title__�__uri__�__version__z19.0.0Z	pyOpenSSLzhttps://pyopenssl.org/z0Python wrapper module around the OpenSSL libraryzThe pyOpenSSL developerszcryptography-dev@python.orgzApache License, Version 2.0zCopyright 2001-2017 {0}N)�__doc__�__all__rrrrrrr�formatr�rr�/usr/lib/python3.6/version.py�<module>s

_util.cpython-36.pyc000064400000010063151730204560010311 0ustar003

�F\N�@s�ddlZddlZddlmZmZmZddlmZe�Zej	�ej
Z
ejZe
jdd�Z
dd�Zdd	�Zd
d�Zdd
�Zdd�Zer�dd�Zndd�Ze�ZejdZdd�ZdS)�N)�PY3�binary_type�	text_type)�BindingF)Zshould_clear_after_alloccCs|sdSttj|��S)z�
    Get a native string type representing of the given CFFI ``char*`` object.

    :param charp: A C-style string represented using CFFI.

    :return: :class:`str`
    �)�native�ffi�string)Zcharp�r
�/usr/lib/python3.6/_util.py�textsrcCsVg}xDtj�}|dkrP|jttj|��ttj|��ttj|��f�qW||��dS)ac
    Convert an OpenSSL library failure into a Python exception.

    When a call to the native OpenSSL library fails, this is usually signalled
    by the return value, and an error code is stored in an error queue
    associated with the current thread. The err library provides functions to
    obtain these error codes and textual error messages.
    rN)�libZ
ERR_get_error�appendrZERR_lib_error_stringZERR_func_error_stringZERR_reason_error_string)Zexception_type�errors�errorr
r
r�exception_from_error_queue"s	rcs�fdd�}|S)z~
    Create an assert function that uses :func:`exception_from_error_queue` to
    raise an exception wrapped by *error*.
    cs|dk	rt��dS)zT
        If *ok* is not True, retrieve the error from OpenSSL and raise it.
        TN)r)�ok)rr
r�openssl_assert>sz#make_assert.<locals>.openssl_assertr
)rrr
)rr�make_assert9srcCsLt|ttf�std|��tr4t|t�rH|jd�Snt|t�rH|jd�S|S)a6
    Convert :py:class:`bytes` or :py:class:`unicode` to the native
    :py:class:`str` type, using UTF-8 encoding if conversion is necessary.

    :raise UnicodeError: The input string is not UTF-8 decodeable.

    :raise TypeError: The input is neither :py:class:`bytes` nor
        :py:class:`unicode`.
    z%r is neither bytes nor unicodezutf-8)�
isinstancerr�	TypeErrorr�decode�encode)�sr
r
rrHs



rcCs2t|t�r|St|t�r&|jtj��Std��dS)a
    Convert a Python string to a :py:class:`bytes` string identifying the same
    path and which can be passed into an OpenSSL API accepting a filename.

    :param s: An instance of :py:class:`bytes` or :py:class:`unicode`.

    :return: An instance of :py:class:`bytes`.
    z3Path must be represented as bytes or unicode stringN)rrrr�sys�getfilesystemencodingr)rr
r
r�path_string]s
	

rcCs
|jd�S)N�charmap)r)rr
r
r�byte_stringosrcCs|S)Nr
)rr
r
rrrsz) for {0} is no longer accepted, use bytescCs.t|t�r*tjtj|�tdd�|jd�S|S)a�
    If ``obj`` is text, emit a warning that it should be bytes instead and try
    to convert it to bytes automatically.

    :param str label: The name of the parameter from which ``obj`` was taken
        (so a developer can easily find the source of the problem and correct
        it).

    :return: If ``obj`` is the text string type, a ``bytes`` object giving the
        UTF-8 encoding of that text is returned.  Otherwise, ``obj`` itself is
        returned.
    �)�category�
stacklevelzutf-8)rr�warnings�warn�
_TEXT_WARNING�format�DeprecationWarningr)Zlabel�objr
r
r�text_to_bytes_and_warns

r()rr"ZsixrrrZ,cryptography.hazmat.bindings.openssl.bindingrZbindingZinit_static_locksrr
Z
new_allocatorZno_zero_allocatorrrrrrr�objectZUNSPECIFIED�__name__r$r(r
r
r
r�<module>s&


rand.cpython-36.opt-1.pyc000064400000002330151730204560011056 0ustar003

�F\�@s$dZddlmZdd�Zdd�ZdS)z*
PRNG management routines, thin wrappers.
�)�libcCs:t|t�std��t|t�s$td��tj|t|�|�dS)a�
    Mix bytes from *string* into the PRNG state.

    The *entropy* argument is (the lower bound of) an estimate of how much
    randomness is contained in *string*, measured in bytes.

    For more information, see e.g. :rfc:`1750`.

    This function is only relevant if you are forking Python processes and
    need to reseed the CSPRNG after fork.

    :param buffer: Buffer with random data.
    :param entropy: The entropy (in bytes) measurement of the buffer.

    :return: :obj:`None`
    zbuffer must be a byte stringzentropy must be an integerN)�
isinstance�bytes�	TypeError�int�_libZRAND_add�len)�bufferZentropy�r
�/usr/lib/python3.6/rand.py�adds


rcCstj�S)z}
    Check whether the PRNG has been seeded with enough data.

    :return: 1 if the PRNG is seeded enough, 0 otherwise.
    )rZRAND_statusr
r
r
r�status"sr
N)�__doc__Z
OpenSSL._utilrrrr
r
r
r
r�<module>sdebug.cpython-36.pyc000064400000002123151730204560010261 0ustar003

�F\�@s�ddlmZddlZddlZddlZddlZddlZddlm	Z	dj
e	jejj
jejjj�jd�ejjejj�jd�eedd�ejejejej	ejejd	�
Zed
kr�ee�dS)�)�print_functionN�)�versionaBpyOpenSSL: {pyopenssl}
cryptography: {cryptography}
cffi: {cffi}
cryptography's compiled against OpenSSL: {crypto_openssl_compile}
cryptography's linked OpenSSL: {crypto_openssl_link}
Pythons's OpenSSL: {python_openssl}
Python executable: {python}
Python version: {python_version}
Platform: {platform}
sys.path: {sys_path}�asciiZOPENSSL_VERSIONzn/a)
Z	pyopensslZcrypto_openssl_compileZcrypto_openssl_linkZpython_openssl�cryptography�cffi�pythonZpython_version�platformZsys_path�__main__)Z
__future__rZssl�sysZOpenSSL.SSLZOpenSSLrr�r�format�__version__Z_utilZffi�string�libZOPENSSL_VERSION_TEXT�decodeZSSLZSSLeay_versionZSSLEAY_VERSION�getattr�
executabler	�pathZ	_env_info�__name__�print�rr�/usr/lib/python3.6/debug.py�<module>s.



tsafe.cpython-36.opt-1.pyc000064400000002655151730204560011246 0ustar003

�F\N�@sBddlZddlmZddlmZejdedd�Gdd�d�Z	dS)	�N)�RLock)�SSLz/OpenSSL.tsafe is deprecated and will be removed�)�
stacklevelc!@s2eZdZdd�Zxd&D]Zed$eef�qWd%S)'�
ConnectioncGstj|�|_t�|_dS)N)�_sslrZ	_ssl_conn�_RLock�_lock)�self�args�r�/usr/lib/python3.6/tsafe.py�__init__szConnection.__init__�get_context�pending�send�write�recv�read�renegotiate�bind�listen�connect�accept�setblocking�fileno�shutdown�close�get_cipher_list�getpeername�getsockname�
getsockopt�
setsockopt�makefile�get_app_data�set_app_data�state_string�
sock_shutdown�get_peer_certificate�get_peer_cert_chain�	want_read�
want_write�set_connect_state�set_accept_state�
connect_ex�sendallz�def %s(self, *args):
            self._lock.acquire()
            try:
                return self._ssl_conn.%s(*args)
            finally:
                self._lock.release()
N)!rrrrrrrrrrrrrrrrrr r!r"r#r$r%r&r'r(r)r*r+r,r-r.r/)�__name__�
__module__�__qualname__r�f�execrrrr
r
sr)
�warningsZ	threadingrrZOpenSSLrr�warn�DeprecationWarningrrrrr
�<module>s
_util.cpython-36.opt-1.pyc000064400000010063151730204560011250 0ustar003

�F\N�@s�ddlZddlZddlmZmZmZddlmZe�Zej	�ej
Z
ejZe
jdd�Z
dd�Zdd	�Zd
d�Zdd
�Zdd�Zer�dd�Zndd�Ze�ZejdZdd�ZdS)�N)�PY3�binary_type�	text_type)�BindingF)Zshould_clear_after_alloccCs|sdSttj|��S)z�
    Get a native string type representing of the given CFFI ``char*`` object.

    :param charp: A C-style string represented using CFFI.

    :return: :class:`str`
    �)�native�ffi�string)Zcharp�r
�/usr/lib/python3.6/_util.py�textsrcCsVg}xDtj�}|dkrP|jttj|��ttj|��ttj|��f�qW||��dS)ac
    Convert an OpenSSL library failure into a Python exception.

    When a call to the native OpenSSL library fails, this is usually signalled
    by the return value, and an error code is stored in an error queue
    associated with the current thread. The err library provides functions to
    obtain these error codes and textual error messages.
    rN)�libZ
ERR_get_error�appendrZERR_lib_error_stringZERR_func_error_stringZERR_reason_error_string)Zexception_type�errors�errorr
r
r�exception_from_error_queue"s	rcs�fdd�}|S)z~
    Create an assert function that uses :func:`exception_from_error_queue` to
    raise an exception wrapped by *error*.
    cs|dk	rt��dS)zT
        If *ok* is not True, retrieve the error from OpenSSL and raise it.
        TN)r)�ok)rr
r�openssl_assert>sz#make_assert.<locals>.openssl_assertr
)rrr
)rr�make_assert9srcCsLt|ttf�std|��tr4t|t�rH|jd�Snt|t�rH|jd�S|S)a6
    Convert :py:class:`bytes` or :py:class:`unicode` to the native
    :py:class:`str` type, using UTF-8 encoding if conversion is necessary.

    :raise UnicodeError: The input string is not UTF-8 decodeable.

    :raise TypeError: The input is neither :py:class:`bytes` nor
        :py:class:`unicode`.
    z%r is neither bytes nor unicodezutf-8)�
isinstancerr�	TypeErrorr�decode�encode)�sr
r
rrHs



rcCs2t|t�r|St|t�r&|jtj��Std��dS)a
    Convert a Python string to a :py:class:`bytes` string identifying the same
    path and which can be passed into an OpenSSL API accepting a filename.

    :param s: An instance of :py:class:`bytes` or :py:class:`unicode`.

    :return: An instance of :py:class:`bytes`.
    z3Path must be represented as bytes or unicode stringN)rrrr�sys�getfilesystemencodingr)rr
r
r�path_string]s
	

rcCs
|jd�S)N�charmap)r)rr
r
r�byte_stringosrcCs|S)Nr
)rr
r
rrrsz) for {0} is no longer accepted, use bytescCs.t|t�r*tjtj|�tdd�|jd�S|S)a�
    If ``obj`` is text, emit a warning that it should be bytes instead and try
    to convert it to bytes automatically.

    :param str label: The name of the parameter from which ``obj`` was taken
        (so a developer can easily find the source of the problem and correct
        it).

    :return: If ``obj`` is the text string type, a ``bytes`` object giving the
        UTF-8 encoding of that text is returned.  Otherwise, ``obj`` itself is
        returned.
    �)�category�
stacklevelzutf-8)rr�warnings�warn�
_TEXT_WARNING�format�DeprecationWarningr)Zlabel�objr
r
r�text_to_bytes_and_warns

r()rr"ZsixrrrZ,cryptography.hazmat.bindings.openssl.bindingrZbindingZinit_static_locksrr
Z
new_allocatorZno_zero_allocatorrrrrrr�objectZUNSPECIFIED�__name__r$r(r
r
r
r�<module>s&


SSL.cpython-36.pyc000064400000227510151730204570007646 0ustar003

�F\�[�R@sddlZddlZddlmZddlmZmZddlmZm	Z	ddl
mZddlm
Z
ddlmZddlmZmZmZmZdd	lmZmZmZmZmZ m!Z"m#Z$m%Z&m'Z(dd
l)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/ddd
ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\gRZ0ye1Z2Wn&e3k
�r�Gd]d^�d^e4�Z2YnXej5Z5ej6Z6ej7Z7ej8Z8ej9Z9ej:Z:ej;Z<ej=Z>d_Z?d`Z@daZAdbZBdcZCddZDejEZFejGZHejIZJejKZLejMZNejOZPejQZRejSZTejUZVejWZXejYZZej[Z\ej]Z^ej_Z`ejaZbejcZdejeZfejgZhejiZjejkZlejmZnejoZpejqZrejsZtejuZvejwZxejyZzej{Z|ej}Z~ejZ�ej�Z�ej�Z�ej�Z�ej�Z�ej�Z�ej�Z�ej�Z�ej�Z�ej�Z�ej�Z�ej�Z�ej�Z�ej�Z�ej�Z�ej�Z�ej��r$ej�Z�ej�Z�ej�Z�ej�Z�e0j�dedfdgdhg�ej�Z�ej�Z�ej�Z�ej�Z�ej�Z�ej�Z�ej�Z�ej�Z�ej�Z�ej�Z�ej�Z�ej�Z�ej�Z�didjdkdldmgZ�dngZ�doZ�dpZ�GdqdS�dSe��Z�eee��Z�e e��Z�GdrdT�dTe��Z�GdsdU�dUe��Z�GdtdV�dVe��Z�GdudW�dWe��Z�GdvdX�dXe��Z�Gdwdx�dxe4�Z�Gdydz�dze��Z�Gd{d|�d|e��Z�Gd}d~�d~e��Z�Gdd��d�e��Z�Gd�d��d�e��Z�Gd�d��d�e��Z�d�d��Z�d�dY�Z�d�d��Z�e�ej�d��Z�e�ej�d��Z�e�ej�d��Z�Gd�dZ�dZe4�Z�Gd�d[�d[e4�Z�ee�e�d�eσZ�Gd�d\�d\e4�Z�ee�e�d�eσZ�ejӃdS)��N)�platform)�wraps�partial)�count�chain)�WeakValueDictionary)�	errorcode)�
deprecated)�binary_type�
integer_types�int2byte�
indexbytes)	�UNSPECIFIED�exception_from_error_queue�ffi�lib�make_assert�native�path_string�text_to_bytes_and_warn�no_zero_allocator)�FILETYPE_PEM�_PassphraseHelper�PKey�X509Name�X509�	X509Store�OPENSSL_VERSION_NUMBER�SSLEAY_VERSION�
SSLEAY_CFLAGS�SSLEAY_PLATFORM�
SSLEAY_DIR�SSLEAY_BUILT_ON�
SENT_SHUTDOWN�RECEIVED_SHUTDOWN�SSLv2_METHOD�SSLv3_METHOD�
SSLv23_METHOD�TLSv1_METHOD�TLSv1_1_METHOD�TLSv1_2_METHOD�OP_NO_SSLv2�OP_NO_SSLv3�OP_NO_TLSv1�
OP_NO_TLSv1_1�
OP_NO_TLSv1_2�MODE_RELEASE_BUFFERS�OP_SINGLE_DH_USE�OP_SINGLE_ECDH_USE�OP_EPHEMERAL_RSA�OP_MICROSOFT_SESS_ID_BUG�OP_NETSCAPE_CHALLENGE_BUG�#OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG�OP_SSLREF2_REUSE_CERT_TYPE_BUG�OP_MICROSOFT_BIG_SSLV3_BUFFER�OP_MSIE_SSLV2_RSA_PADDING�OP_SSLEAY_080_CLIENT_DH_BUG�
OP_TLS_D5_BUG�OP_TLS_BLOCK_PADDING_BUG�OP_DONT_INSERT_EMPTY_FRAGMENTS�OP_CIPHER_SERVER_PREFERENCE�OP_TLS_ROLLBACK_BUG�OP_PKCS1_CHECK_1�OP_PKCS1_CHECK_2�OP_NETSCAPE_CA_DN_BUG�"OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG�OP_NO_COMPRESSION�OP_NO_QUERY_MTU�OP_COOKIE_EXCHANGE�OP_NO_TICKET�OP_ALL�VERIFY_PEER�VERIFY_FAIL_IF_NO_PEER_CERT�VERIFY_CLIENT_ONCE�VERIFY_NONE�SESS_CACHE_OFF�SESS_CACHE_CLIENT�SESS_CACHE_SERVER�SESS_CACHE_BOTH�SESS_CACHE_NO_AUTO_CLEAR�SESS_CACHE_NO_INTERNAL_LOOKUP�SESS_CACHE_NO_INTERNAL_STORE�SESS_CACHE_NO_INTERNAL�SSL_ST_CONNECT�
SSL_ST_ACCEPT�SSL_ST_MASK�SSL_CB_LOOP�SSL_CB_EXIT�SSL_CB_READ�SSL_CB_WRITE�SSL_CB_ALERT�SSL_CB_READ_ALERT�SSL_CB_WRITE_ALERT�SSL_CB_ACCEPT_LOOP�SSL_CB_ACCEPT_EXIT�SSL_CB_CONNECT_LOOP�SSL_CB_CONNECT_EXIT�SSL_CB_HANDSHAKE_START�SSL_CB_HANDSHAKE_DONE�Error�
WantReadError�WantWriteError�WantX509LookupError�ZeroReturnError�SysCallError�SSLeay_version�Session�Context�
Connectionc@seZdZdS)�_bufferN)�__name__�
__module__�__qualname__�rsrs�/usr/lib/python3.6/SSL.pyrovsro�������SSL_ST_INIT�
SSL_ST_BEFORE�	SSL_ST_OK�SSL_ST_RENEGOTIATEz"/etc/ssl/certs/ca-certificates.crtz /etc/pki/tls/certs/ca-bundle.crtz/etc/ssl/ca-bundle.pemz/etc/pki/tls/cacert.pemz1/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pemz/etc/ssl/certss$/opt/pyca/cryptography/openssl/certss'/opt/pyca/cryptography/openssl/cert.pemc@seZdZdZdS)rez4
    An error occurred in an `OpenSSL.SSL` API.
    N)rprqrr�__doc__rsrsrsrtre�sc@seZdZdS)rfN)rprqrrrsrsrsrtrf�sc@seZdZdS)rgN)rprqrrrsrsrsrtrg�sc@seZdZdS)rhN)rprqrrrsrsrsrtrhsc@seZdZdS)riN)rprqrrrsrsrsrtrisc@seZdZdS)rjN)rprqrrrsrsrsrtrj	sc@s eZdZdZdd�Zdd�ZdS)�_CallbackExceptionHelpera�
    A base class for wrapper classes that allow for intelligent exception
    handling in OpenSSL callbacks.

    :ivar list _problems: Any exceptions that occurred while executing in a
        context where they could not be raised in the normal way.  Typically
        this is because OpenSSL has called into some Python code and requires a
        return value.  The exceptions are saved to be raised later when it is
        possible to do so.
    cCs
g|_dS)N)�	_problems)�selfrsrsrt�__init__sz!_CallbackExceptionHelper.__init__cCs6|jr2y
t�Wntk
r$YnX|jjd��dS)z�
        Raise an exception from the OpenSSL error queue or that was previously
        captured whe running a callback.
        rN)r��_raise_current_errorre�pop)r�rsrsrt�raise_if_problems
z)_CallbackExceptionHelper.raise_if_problemN)rprqrrrr�r�rsrsrsrtr�
s
r�c@seZdZdZdd�ZdS)�
_VerifyHelperz^
    Wrap a callback such that it can be used as a certificate verification
    callback.
    cs2tj��t����fdd��}tjd|��_dS)Ncs�tj|�}tj|�tj|�}tj|�}tj|�}tj�}tj||�}t	j
|}y�|||||�}	Wn,tk
r�}
z�jj
|
�dSd}
~
XnX|	r�tj|tj�dSdSdS)Nrru)�_libZX509_STORE_CTX_get_current_cert�X509_up_refr�_from_raw_x509_ptrZX509_STORE_CTX_get_errorZX509_STORE_CTX_get_error_depthZ"SSL_get_ex_data_X509_STORE_CTX_idxZX509_STORE_CTX_get_ex_datarn�_reverse_mapping�	Exceptionr��appendZX509_STORE_CTX_set_errorZ	X509_V_OK)�okZ	store_ctxZx509�certZerror_numberZerror_depth�index�sslZ
connection�result�e)�callbackr�rsrt�wrapper2s$





z'_VerifyHelper.__init__.<locals>.wrapperzint (*)(int, X509_STORE_CTX *))r�r�r�_ffir�)r�r�r�rs)r�r�rtr�/s
z_VerifyHelper.__init__N)rprqrrrr�rsrsrsrtr�)sr�c@seZdZdZdd�ZdS)�_NpnAdvertiseHelperzT
    Wrap a callback such that it can be used as an NPN advertisement callback.
    cs2tj��t����fdd��}tjd|��_dS)Ncs�yntj|}�|�}djtjdd�|D���}tjdt|��tjd|�g|_|jdd|d<|jd|d<dSt	k
r�}z�j
j|�dSd}~XnXdS)	N�css|]}tt|��|fVqdS)N)r�len)�.0�prsrsrt�	<genexpr>asz@_NpnAdvertiseHelper.__init__.<locals>.wrapper.<locals>.<genexpr>zunsigned int *zunsigned char[]rrurv)rnr��joinr�
from_iterabler��newr��_npn_advertise_callback_argsr�r�r�)r��out�outlen�arg�conn�protos�protostrr�)r�r�rsrtr�Xs
z-_NpnAdvertiseHelper.__init__.<locals>.wrapperz>int (*)(SSL *, const unsigned char **, unsigned int *, void *))r�r�rr�r�)r�r�r�rs)r�r�rtr�Us

z_NpnAdvertiseHelper.__init__N)rprqrrrr�rsrsrsrtr�Psr�c@seZdZdZdd�ZdS)�_NpnSelectHelperzP
    Wrap a callback such that it can be used as an NPN selection callback.
    cs2tj��t����fdd��}tjd|��_dS)Nc
s�y�tj|}tj||�dd�}g}x<|r`t|d�}	|d|	d�}
|j|
�||	dd�}q&W�||�}tjdt|��tjd|�g|_|jdd|d<|jd|d<dSt	k
r�}z�j
j|�dSd}~XnXdS)Nrruzunsigned char *zunsigned char[]rv)rnr�r��bufferr
r�r�r��_npn_select_callback_argsr�r�)
r�r�r��in_�inlenr�r��instr�	protolist�length�proto�outstrr�)r�r�rsrtr��s$



z*_NpnSelectHelper.__init__.<locals>.wrapperz^int (*)(SSL *, unsigned char **, unsigned char *, const unsigned char *, unsigned int, void *))r�r�rr�r�)r�r�r�rs)r�r�rtr�~s

"z_NpnSelectHelper.__init__N)rprqrrrr�rsrsrsrtr�ysr�c@seZdZdZdd�ZdS)�_ALPNSelectHelperzQ
    Wrap a callback such that it can be used as an ALPN selection callback.
    cs2tj��t����fdd��}tjd|��_dS)Nc
s�y�tj|}tj||�dd�}g}x<|r`t|d�}	|d|	d�}
|j|
�||	dd�}q&W�||�}t|t�s~td��tj	dt
|��tj	d|�g|_|jdd|d<|jd|d<dStk
r�}z�j
j|�dSd}~XnXdS)Nrruz'ALPN callback must return a bytestring.zunsigned char *zunsigned char[]rv)rnr�r�r�r
r��
isinstance�_binary_type�	TypeErrorr�r��_alpn_select_callback_argsr�r�)
r�r�r�r�r�r�r�r�r�Zencoded_lenr�r�r�)r�r�rsrtr��s(




z+_ALPNSelectHelper.__init__.<locals>.wrapperz^int (*)(SSL *, unsigned char **, unsigned char *, const unsigned char *, unsigned int, void *))r�r�rr�r�)r�r�r�rs)r�r�rtr��s

$z_ALPNSelectHelper.__init__N)rprqrrrr�rsrsrsrtr��sr�c@seZdZdZdd�ZdS)�_OCSPServerCallbackHelpera�
    Wrap a callback such that it can be used as an OCSP callback for the server
    side.

    Annoyingly, OpenSSL defines one OCSP callback but uses it in two different
    ways. For servers, that callback is expected to retrieve some OCSP data and
    hand it to OpenSSL, and may return only SSL_TLSEXT_ERR_OK,
    SSL_TLSEXT_ERR_FATAL, and SSL_TLSEXT_ERR_NOACK. For clients, that callback
    is expected to check the OCSP data, and returns a negative value on error,
    0 if the response is not acceptable, or positive if it is. These are
    mutually exclusive return code behaviours, and they mean that we need two
    helpers so that we always return an appropriate error code if the user's
    code throws an exception.

    Given that we have to have two helpers anyway, these helpers are a bit more
    helpery than most: specifically, they hide a few more of the OpenSSL
    functions so that the user has an easier time writing these callbacks.

    This helper implements the server side.
    cs2tj��t����fdd��}tjd|��_dS)Ncs�y�tj|}|tjkr"tj|�}nd}�||�}t|t�sBtd��|sJdSt|�}t	j
|�}|tj||�dd�<t	j|||�dSt
k
r�}z�jj|�dSd}~XnXdS)Nz'OCSP callback must return a bytestring.rwrrv)rnr�r��NULL�from_handler�r�r�r�r�ZOPENSSL_mallocr�ZSSL_set_tlsext_status_ocsp_respr�r�r�)r��cdatar��data�	ocsp_dataZocsp_data_lengthZdata_ptrr�)r�r�rsrtr��s&





z3_OCSPServerCallbackHelper.__init__.<locals>.wrapperzint (*)(SSL *, void *))r�r�rr�r�)r�r�r�rs)r�r�rtr��s
'z"_OCSPServerCallbackHelper.__init__N)rprqrrrr�rsrsrsrtr��sr�c@seZdZdZdd�ZdS)�_OCSPClientCallbackHelpera�
    Wrap a callback such that it can be used as an OCSP callback for the client
    side.

    Annoyingly, OpenSSL defines one OCSP callback but uses it in two different
    ways. For servers, that callback is expected to retrieve some OCSP data and
    hand it to OpenSSL, and may return only SSL_TLSEXT_ERR_OK,
    SSL_TLSEXT_ERR_FATAL, and SSL_TLSEXT_ERR_NOACK. For clients, that callback
    is expected to check the OCSP data, and returns a negative value on error,
    0 if the response is not acceptable, or positive if it is. These are
    mutually exclusive return code behaviours, and they mean that we need two
    helpers so that we always return an appropriate error code if the user's
    code throws an exception.

    Given that we have to have two helpers anyway, these helpers are a bit more
    helpery than most: specifically, they hide a few more of the OpenSSL
    functions so that the user has an easier time writing these callbacks.

    This helper implements the client side.
    cs2tj��t����fdd��}tjd|��_dS)Nc	s�yxtj|}|tjkr"tj|�}nd}tjd�}tj||�}|dkrJd}ntj|d|�dd�}�|||�}t	t
|��Stk
r�}z�jj
|�dSd}~XnXdS)Nzunsigned char **rr�ru���)rnr�r�r�r�r�r�ZSSL_get_tlsext_status_ocsp_respr��int�boolr�r�r�)	r�r�r�r�Zocsp_ptrZocsp_lenr�Zvalidr�)r�r�rsrtr�9s


z3_OCSPClientCallbackHelper.__init__.<locals>.wrapperzint (*)(SSL *, void *))r�r�rr�r�)r�r�r�rs)r�r�rtr�6s
z"_OCSPClientCallbackHelper.__init__N)rprqrrrr�rsrsrsrtr� sr�cCsdd}t|t�s(t|dd�}|dk	r(|�}t|t�r6|}t|t�sJtd��n|dkr`td|f��|S)N�filenoz3argument must be an int, or have a fileno() method.rz1file descriptor cannot be a negative integer (%i))r�r�getattrr��
ValueError)�obj�fd�methrsrsrt�_asFileDescriptor[s



r�cCstjtj|��S)z�
    Return a string describing the version of OpenSSL in use.

    :param type: One of the :const:`SSLEAY_` constants defined in this module.
    )r��stringr�rk)�typersrsrtrknscs��fdd�}|S)a�
    Builds a decorator that ensures that functions that rely on OpenSSL
    functions that are not present in this build raise NotImplementedError,
    rather than AttributeError coming out of cryptography.

    :param flag: A cryptography flag that guards the functions, e.g.
        ``Cryptography_HAS_NEXTPROTONEG``.
    :param error: The string to be used in the exception if the flag is false.
    cs$�st|��fdd��}|S|SdS)Ncst���dS)N)�NotImplementedError)�args�kwargs)�errorrsrt�explode�sz<_make_requires.<locals>._requires_decorator.<locals>.explode)r)�funcr�)r��flagrsrt�_requires_decorator�sz+_make_requires.<locals>._requires_decoratorrs)r�r�r�rs)r�r�rt�_make_requiresws
	r�zNPN not availablezALPN not availablezSNI not availablec@seZdZdZdS)rlz�
    A class representing an SSL session.  A session defines certain connection
    parameters which may be re-used to speed up the setup of subsequent
    connections.

    .. versionadded:: 0.14
    N)rprqrrrrsrsrsrtrl�sc@s�eZdZdZededededede	diZ
edd	�e
j�D��Z
d
d�Z
ded
d�Zdd�Zdfdd�Zdd�Zdd�Zdd�Zdd�Zefdd�Zdd�Zdd �Zd!d"�Zefd#d$�Zd%d&�Zd'd(�Zd)d*�Zd+d,�Zd-d.�Z d/d0�Z!d1d2�Z"d3d4�Z#d5d6�Z$d7d8�Z%d9d:�Z&d;d<�Z'd=d>�Z(d?d@�Z)dAdB�Z*dCdD�Z+dEdF�Z,dGdH�Z-dIdJ�Z.dKdL�Z/dMdN�Z0dOdP�Z1dQdR�Z2e3dSdT��Z4dUdV�Z5e6dWdX��Z7e6dYdZ��Z8e9d[d\��Z:e9d]d^��Z;d_d`�Z<dgdadb�Z=dhdcdd�Z>dS)irmz�
    :class:`OpenSSL.SSL.Context` instances define the parameters for setting
    up new SSL connections.

    :param method: One of SSLv2_METHOD, SSLv3_METHOD, SSLv23_METHOD, or
        TLSv1_METHOD.
    ZSSLv2_methodZSSLv3_methodZ
SSLv23_methodZTLSv1_methodZTLSv1_1_methodZTLSv1_2_methodccs0|](\}}tt|d�dk	r|tt|�fVqdS)N)r�r�)r�Z
identifier�namersrsrtr��szContext.<genexpr>cCs&t|t�std��y|j|}Wntk
r<td��YnX|�}t|tjk�t	j
|�}t|tjk�tj|t	j�}yt	j
|d�}t|dk�Wntk
r�YnX||_d|_d|_d|_d|_d|_d|_d|_d|_d|_d|_d|_d|_d|_d|_d|_d|_d|_ |j!t	j"�dS)Nzmethod must be an integerzNo such protocolru)#r�rr��_methods�KeyErrorr��_openssl_assertr�r�r�ZSSL_CTX_new�gcZSSL_CTX_freeZSSL_CTX_set_ecdh_auto�AttributeError�_context�_passphrase_helper�_passphrase_callback�_passphrase_userdata�_verify_helper�_verify_callback�_info_callback�_tlsext_servername_callback�	_app_data�_npn_advertise_helper�_npn_advertise_callback�_npn_select_helper�_npn_select_callback�_alpn_select_helper�_alpn_select_callback�_ocsp_helper�_ocsp_callback�
_ocsp_data�set_modeZSSL_MODE_ENABLE_PARTIAL_WRITE)r��methodZmethod_funcZ
method_obj�context�resrsrsrtr��sF

zContext.__init__NcCsN|dkrtj}nt|�}|dkr(tj}nt|�}tj|j||�}|sJt�dS)aU
        Let SSL know where we can find trusted certificates for the certificate
        chain.  Note that the certificates have to be in PEM format.

        If capath is passed, it must be a directory prepared using the
        ``c_rehash`` tool included with OpenSSL.  Either, but not both, of
        *pemfile* or *capath* may be :data:`None`.

        :param cafile: In which file we can find the certificates (``bytes`` or
            ``unicode``).
        :param capath: In which directory we can find the certificates
            (``bytes`` or ``unicode``).

        :return: None
        N)r�r��_path_stringr�ZSSL_CTX_load_verify_locationsr�r�)r��cafile�capathZload_resultrsrsrt�load_verify_locations�szContext.load_verify_locationscs&t����fdd��}tt|ddd�S)Ncs�||�j�S)N)r�)�sizeZverify�userdata)r�r�rsrtr�sz'Context._wrap_callback.<locals>.wrapperT)Z	more_args�truncate)rrr)r�r�r�rs)r�r�rt�_wrap_callback
szContext._wrap_callbackcCs@t|�std��|j|�|_|jj|_tj|j|j�||_	dS)a�
        Set the passphrase callback.  This function will be called
        when a private key with a passphrase is loaded.

        :param callback: The Python callback to use.  This must accept three
            positional arguments.  First, an integer giving the maximum length
            of the passphrase it may return.  If the returned passphrase is
            longer than this, it will be truncated.  Second, a boolean value
            which will be true if the user should be prompted for the
            passphrase twice and the callback should verify that the two values
            supplied are equal. Third, the value given as the *userdata*
            parameter to :meth:`set_passwd_cb`.  The *callback* must return
            a byte string. If an error occurs, *callback* should return a false
            value (e.g. an empty string).
        :param userdata: (optional) A Python object which will be given as
                         argument to the callback
        :return: None
        zcallback must be callableN)
�callabler�r�r�r�r�r�ZSSL_CTX_set_default_passwd_cbr�r�)r�r�r�rsrsrt�
set_passwd_cbs
zContext.set_passwd_cbcCs�tj|j�}t|dk�tjtj��jd�}tjtj��jd�}|j	||�s�tjtj
��}tjtj��}|tkr�|t
kr�|jtt�dS)a�
        Specify that the platform provided CA certificates are to be used for
        verification purposes. This method has some caveats related to the
        binary wheels that cryptography (pyOpenSSL's primary dependency) ships:

        *   macOS will only load certificates using this method if the user has
            the ``openssl@1.1`` `Homebrew <https://brew.sh>`_ formula installed
            in the default location.
        *   Windows will not work.
        *   manylinux1 cryptography wheels will work on most common Linux
            distributions in pyOpenSSL 17.1.0 and above.  pyOpenSSL detects the
            manylinux1 wheel and attempts to load roots via a fallback path.

        :return: None
        ru�asciiN)r�Z SSL_CTX_set_default_verify_pathsr�r�r�r�ZX509_get_default_cert_dir_env�decodeZX509_get_default_cert_file_env�_check_env_vars_setZX509_get_default_cert_dirZX509_get_default_cert_file�_CRYPTOGRAPHY_MANYLINUX1_CA_DIR� _CRYPTOGRAPHY_MANYLINUX1_CA_FILE�_fallback_default_verify_paths�_CERTIFICATE_FILE_LOCATIONS�_CERTIFICATE_PATH_LOCATIONS)r��
set_result�dir_env_var�file_env_varZdefault_dirZdefault_filersrsrt�set_default_verify_paths-s 

z Context.set_default_verify_pathscCs tjj|�dk	ptjj|�dk	S)zp
        Check to see if the default cert dir/file environment vars are present.

        :return: bool
        N)�os�environ�get)r�rrrsrsrtr�^szContext._check_env_vars_setcCsRx$|D]}tjj|�r|j|�PqWx&|D]}tjj|�r,|jd|�Pq,WdS)aW
        Default verify paths are based on the compiled version of OpenSSL.
        However, when pyca/cryptography is compiled as a manylinux1 wheel
        that compiled location can potentially be wrong. So, like Go, we
        will try a predefined set of paths and attempt to load roots
        from there.

        :return: None
        N)r�path�isfiler��isdir)r�Z	file_pathZdir_pathr�r�rsrsrtr�is



z&Context._fallback_default_verify_pathscCs$t|�}tj|j|�}|s t�dS)z�
        Load a certificate chain from a file.

        :param certfile: The name of the certificate chain file (``bytes`` or
            ``unicode``).  Must be PEM encoded.

        :return: None
        N)r�r�Z"SSL_CTX_use_certificate_chain_filer�r�)r��certfiler�rsrsrt�use_certificate_chain_file}s
	
z"Context.use_certificate_chain_filecCs8t|�}t|t�std��tj|j||�}|s4t�dS)ah
        Load a certificate from a file

        :param certfile: The name of the certificate file (``bytes`` or
            ``unicode``).
        :param filetype: (optional) The encoding of the file, which is either
            :const:`FILETYPE_PEM` or :const:`FILETYPE_ASN1`.  The default is
            :const:`FILETYPE_PEM`.

        :return: None
        zfiletype must be an integerN)r�r�rr�r�ZSSL_CTX_use_certificate_filer�r�)r�r
�filetype�
use_resultrsrsrt�use_certificate_file�s
zContext.use_certificate_filecCs0t|t�std��tj|j|j�}|s,t�dS)zs
        Load a certificate from a X509 object

        :param cert: The X509 object
        :return: None
        zcert must be an X509 instanceN)r�rr�r�ZSSL_CTX_use_certificater��_x509r�)r�r�r
rsrsrt�use_certificate�s

zContext.use_certificatecCsDt|t�std��tj|j�}tj|j|�}|s@tj|�t	�dS)z�
        Add certificate to chain

        :param certobj: The X509 certificate object to add to the chain
        :return: None
        z certobj must be an X509 instanceN)
r�rr�r��X509_duprZSSL_CTX_add_extra_chain_certr�Z	X509_freer�)r�Zcertobj�copy�
add_resultrsrsrt�add_extra_chain_cert�s

zContext.add_extra_chain_certcCs |jdk	r|jjt�t�dS)N)r�r�rer�)r�rsrsrt�_raise_passphrase_exception�s
z#Context._raise_passphrase_exceptioncCsHt|�}|tkrt}nt|t�s(td��tj|j||�}|sD|j	�dS)aR
        Load a private key from a file

        :param keyfile: The name of the key file (``bytes`` or ``unicode``)
        :param filetype: (optional) The encoding of the file, which is either
            :const:`FILETYPE_PEM` or :const:`FILETYPE_ASN1`.  The default is
            :const:`FILETYPE_PEM`.

        :return: None
        zfiletype must be an integerN)
r��_UNSPECIFIEDrr�rr�r�ZSSL_CTX_use_PrivateKey_filer�r)r�Zkeyfilerr
rsrsrt�use_privatekey_file�s
zContext.use_privatekey_filecCs2t|t�std��tj|j|j�}|s.|j�dS)zs
        Load a private key from a PKey object

        :param pkey: The PKey object
        :return: None
        zpkey must be a PKey instanceN)r�rr�r�ZSSL_CTX_use_PrivateKeyr�Z_pkeyr)r�Zpkeyr
rsrsrt�use_privatekey�s

zContext.use_privatekeycCstj|j�st�dS)z�
        Check if the private key (loaded with :meth:`use_privatekey`) matches
        the certificate (loaded with :meth:`use_certificate`)

        :return: :data:`None` (raises :exc:`Error` if something's wrong)
        N)r�ZSSL_CTX_check_private_keyr�r�)r�rsrsrt�check_privatekey�szContext.check_privatekeycCs0tjtd|��}t|tjk�tj|j|�dS)a%
        Load the trusted certificates that will be sent to the client.  Does
        not actually imply any of the certificates are trusted; that must be
        configured separately.

        :param bytes cafile: The path to a certificates file in PEM format.
        :return: None
        r�N)r�ZSSL_load_client_CA_file�_text_to_bytes_and_warnr�r�r��SSL_CTX_set_client_CA_listr�)r�r�Zca_listrsrsrt�load_client_ca�s	zContext.load_client_cacCs*td|�}ttj|j|t|��dk�dS)aV
        Set the session id to *buf* within which a session can be reused for
        this Context object.  This is needed when doing session resumption,
        because there is no way for a stored session to know which Context
        object it is associated with.

        :param bytes buf: The session id.

        :returns: None
        �bufruN)rr�r�ZSSL_CTX_set_session_id_contextr�r�)r�rrsrsrt�set_session_ids
zContext.set_session_idcCs t|t�std��tj|j|�S)a�
        Set the behavior of the session cache used by all connections using
        this Context.  The previously set mode is returned.  See
        :const:`SESS_CACHE_*` for details about particular modes.

        :param mode: One or more of the SESS_CACHE_* flags (combine using
            bitwise or)
        :returns: The previously set caching mode.

        .. versionadded:: 0.14
        zmode must be an integer)r�rr�r�ZSSL_CTX_set_session_cache_moder�)r��modersrsrt�set_session_cache_modes
zContext.set_session_cache_modecCstj|j�S)z�
        Get the current session cache mode.

        :returns: The currently used cache mode.

        .. versionadded:: 0.14
        )r�ZSSL_CTX_get_session_cache_moder�)r�rsrsrt�get_session_cache_mode,szContext.get_session_cache_modecCsLt|t�std��t|�s"td��t|�|_|jj|_tj	|j
||j�dS)a�
        et the verification flags for this Context object to *mode* and specify
        that *callback* should be used for verification callbacks.

        :param mode: The verify mode, this should be one of
            :const:`VERIFY_NONE` and :const:`VERIFY_PEER`. If
            :const:`VERIFY_PEER` is used, *mode* can be OR:ed with
            :const:`VERIFY_FAIL_IF_NO_PEER_CERT` and
            :const:`VERIFY_CLIENT_ONCE` to further control the behaviour.
        :param callback: The Python callback to use.  This should take five
            arguments: A Connection object, an X509 object, and three integer
            variables, which are in turn potential error number, error depth
            and return code. *callback* should return True if verification
            passes and False otherwise.
        :return: None

        See SSL_CTX_set_verify(3SSL) for further details.
        zmode must be an integerzcallback must be callableN)r�rr�r�r�r�r�r�r�ZSSL_CTX_set_verifyr�)r�rr�rsrsrt�
set_verify6s


zContext.set_verifycCs$t|t�std��tj|j|�dS)z�
        Set the maximum depth for the certificate chain verification that shall
        be allowed for this Context object.

        :param depth: An integer specifying the verify depth
        :return: None
        zdepth must be an integerN)r�rr�r�ZSSL_CTX_set_verify_depthr�)r��depthrsrsrt�set_verify_depthSs
zContext.set_verify_depthcCstj|j�S)z�
        Retrieve the Context object's verify mode, as set by
        :meth:`set_verify`.

        :return: The verify mode
        )r�ZSSL_CTX_get_verify_moder�)r�rsrsrt�get_verify_mode`szContext.get_verify_modecCstj|j�S)z�
        Retrieve the Context object's verify depth, as set by
        :meth:`set_verify_depth`.

        :return: The verify depth
        )r�ZSSL_CTX_get_verify_depthr�)r�rsrsrt�get_verify_depthiszContext.get_verify_depthcCsht|�}tj|d�}|tjkr$t�tj|tj�}tj|tjtjtj�}tj|tj	�}tj
|j|�dS)z�
        Load parameters for Ephemeral Diffie-Hellman

        :param dhfile: The file to load EDH parameters from (``bytes`` or
            ``unicode``).

        :return: None
        �rN)r�r�ZBIO_new_filer�r�r�r�ZBIO_freeZPEM_read_bio_DHparamsZDH_freeZSSL_CTX_set_tmp_dhr�)r�Zdhfile�bioZdhrsrsrt�load_tmp_dhrs	
zContext.load_tmp_dhcCstj|j|j��dS)a

        Select a curve to use for ECDHE key exchange.

        :param curve: A curve object to use as returned by either
            :meth:`OpenSSL.crypto.get_elliptic_curve` or
            :meth:`OpenSSL.crypto.get_elliptic_curves`.

        :return: None
        N)r�ZSSL_CTX_set_tmp_ecdhr�Z
_to_EC_KEY)r�Zcurversrsrt�set_tmp_ecdh�s
zContext.set_tmp_ecdhcCsVtd|�}t|t�std��ttj|j|�dk�t|d�}t|j	�dddgk�dS)z�
        Set the list of ciphers to be used in this context.

        See the OpenSSL manual for more information (e.g.
        :manpage:`ciphers(1)`).

        :param bytes cipher_list: An OpenSSL cipher string.
        :return: None
        �cipher_listz"cipher_list must be a byte string.ruNZTLS_AES_256_GCM_SHA384ZTLS_CHACHA20_POLY1305_SHA256ZTLS_AES_128_GCM_SHA256)
rr��bytesr�r�r�ZSSL_CTX_set_cipher_listr�rn�get_cipher_list)r�r+Ztmpconnrsrsrt�set_cipher_list�s



zContext.set_cipher_listcCs�tj�}t|tjk�yjxd|D]\}t|t�s@tdt|�j	f��tj
|j�}t|tjk�tj||�}|stj
|�t�qWWn tk
r�tj|��YnXtj|j|�dS)a_
        Set the list of preferred client certificate signers for this server
        context.

        This list of certificate authorities will be sent to the client when
        the server requests a client certificate.

        :param certificate_authorities: a sequence of X509Names.
        :return: None

        .. versionadded:: 0.10
        z3client CAs must be X509Name objects, not %s objectsN)r�Zsk_X509_NAME_new_nullr�r�r�r�rr�r�rp�
X509_NAME_dup�_nameZsk_X509_NAME_push�X509_NAME_freer�r�Zsk_X509_NAME_freerr�)r�Zcertificate_authoritiesZ
name_stackZca_namerZpush_resultrsrsrt�set_client_ca_list�s$




zContext.set_client_ca_listcCs2t|t�std��tj|j|j�}t|dk�dS)ai
        Add the CA certificate to the list of preferred signers for this
        context.

        The list of certificate authorities will be sent to the client when the
        server requests a client certificate.

        :param certificate_authority: certificate authority's X509 certificate.
        :return: None

        .. versionadded:: 0.10
        z.certificate_authority must be an X509 instanceruN)r�rr�r�ZSSL_CTX_add_client_CAr�rr�)r�Zcertificate_authorityrrsrsrt�
add_client_ca�s

zContext.add_client_cacCs t|t�std��tj|j|�S)aQ
        Set the timeout for newly created sessions for this Context object to
        *timeout*.  The default value is 300 seconds. See the OpenSSL manual
        for more information (e.g. :manpage:`SSL_CTX_set_timeout(3)`).

        :param timeout: The timeout in (whole) seconds
        :return: The previous session timeout
        ztimeout must be an integer)r�rr�r�ZSSL_CTX_set_timeoutr�)r�Ztimeoutrsrsrt�set_timeout�s	
zContext.set_timeoutcCstj|j�S)z�
        Retrieve session timeout, as set by :meth:`set_timeout`. The default
        is 300 seconds.

        :return: The session timeout
        )r�ZSSL_CTX_get_timeoutr�)r�rsrsrt�get_timeout�szContext.get_timeoutcs6t���fdd��}tjd|�|_tj|j|j�dS)a�
        Set the information callback to *callback*. This function will be
        called from time to time during SSL handshakes.

        :param callback: The Python callback to use.  This should take three
            arguments: a Connection object and two integers.  The first integer
            specifies where in the SSL handshake the function was called, and
            the other the return code from a (possibly failed) internal
            function call.
        :return: None
        cs�tj|||�dS)N)rnr�)r��whereZreturn_code)r�rsrtr�sz*Context.set_info_callback.<locals>.wrapperzvoid (*)(const SSL *, int, int)N)rr�r�r�r�ZSSL_CTX_set_info_callbackr�)r�r�r�rs)r�rt�set_info_callbacks
zContext.set_info_callbackcCs|jS)zw
        Get the application data (supplied via :meth:`set_app_data()`)

        :return: The application data
        )r�)r�rsrsrt�get_app_dataszContext.get_app_datacCs
||_dS)z�
        Set the application data (will be returned from get_app_data())

        :param data: Any Python object
        :return: None
        N)r�)r�r�rsrsrt�set_app_dataszContext.set_app_datacCs.tj|j�}|tjkrdStjt�}||_|S)z�
        Get the certificate store for the context.  This can be used to add
        "trusted" certificates without using the
        :meth:`load_verify_locations` method.

        :return: A X509Store object or None if it does not have one.
        N)r�ZSSL_CTX_get_cert_storer�r�r�r�__new__Z_store)r�ZstoreZpystorersrsrt�get_cert_store&s

zContext.get_cert_storecCs t|t�std��tj|j|�S)z�
        Add options. Options set before are not cleared!
        This method should be used with the :const:`OP_*` constants.

        :param options: The options to add.
        :return: The new option bitmask.
        zoptions must be an integer)r�rr�r�ZSSL_CTX_set_optionsr�)r�Zoptionsrsrsrt�set_options7s
zContext.set_optionscCs t|t�std��tj|j|�S)z�
        Add modes via bitmask. Modes set before are not cleared!  This method
        should be used with the :const:`MODE_*` constants.

        :param mode: The mode to add.
        :return: The new mode bitmask.
        zmode must be an integer)r�rr�r�ZSSL_CTX_set_moder�)r�rrsrsrtr�Ds
zContext.set_modecs6t���fdd��}tjd|�|_tj|j|j�dS)a
        Specify a callback function to be called when clients specify a server
        name.

        :param callback: The callback function.  It will be invoked with one
            argument, the Connection instance.

        .. versionadded:: 0.13
        cs�tj|�dS)Nr)rnr�)r�Zalertr�)r�rsrtr�\sz7Context.set_tlsext_servername_callback.<locals>.wrapperzint (*)(SSL *, int *, void *)N)rr�r�r�r�Z&SSL_CTX_set_tlsext_servername_callbackr�)r�r�r�rs)r�rt�set_tlsext_servername_callbackQs

z&Context.set_tlsext_servername_callbackcCs,t|t�std��ttj|j|�dk�dS)z�
        Enable support for negotiating SRTP keying material.

        :param bytes profiles: A colon delimited list of protection profile
            names, like ``b'SRTP_AES128_CM_SHA1_80:SRTP_AES128_CM_SHA1_32'``.
        :return: None
        zprofiles must be a byte string.rN)r�r,r�r�r�ZSSL_CTX_set_tlsext_use_srtpr�)r�Zprofilesrsrsrt�set_tlsext_use_srtpfs
zContext.set_tlsext_use_srtpcCs,t|�|_|jj|_tj|j|jtj�dS)a�
        Specify a callback function that will be called when offering `Next
        Protocol Negotiation
        <https://technotes.googlecode.com/git/nextprotoneg.html>`_ as a server.

        :param callback: The callback function.  It will be invoked with one
            argument, the :class:`Connection` instance.  It should return a
            list of bytestrings representing the advertised protocols, like
            ``[b'http/1.1', b'spdy/2']``.

        .. versionadded:: 0.15
        N)	r�r�r�r�r�Z%SSL_CTX_set_next_protos_advertised_cbr�r�r�)r�r�rsrsrt�set_npn_advertise_callbackus

z"Context.set_npn_advertise_callbackcCs,t|�|_|jj|_tj|j|jtj�dS)a�
        Specify a callback function that will be called when a server offers
        Next Protocol Negotiation options.

        :param callback: The callback function.  It will be invoked with two
            arguments: the Connection, and a list of offered protocols as
            bytestrings, e.g. ``[b'http/1.1', b'spdy/2']``.  It should return
            one of those bytestrings, the chosen protocol.

        .. versionadded:: 0.15
        N)	r�r�r�r�r�Z SSL_CTX_set_next_proto_select_cbr�r�r�)r�r�rsrsrt�set_npn_select_callback�s

zContext.set_npn_select_callbackcCs>djtjdd�|D���}tjd|�}tj|j|t|��dS)a�
        Specify the protocols that the client is prepared to speak after the
        TLS connection has been negotiated using Application Layer Protocol
        Negotiation.

        :param protos: A list of the protocols to be offered to the server.
            This list should be a Python list of bytestrings representing the
            protocols to offer, e.g. ``[b'http/1.1', b'spdy/2']``.
        r�css|]}tt|��|fVqdS)N)rr�)r�r�rsrsrtr��sz*Context.set_alpn_protos.<locals>.<genexpr>zunsigned char[]N)	r�rr�r�r�r�ZSSL_CTX_set_alpn_protosr�r�)r�r�r��	input_strrsrsrt�set_alpn_protos�s
zContext.set_alpn_protoscCs,t|�|_|jj|_tj|j|jtj�dS)a�
        Specify a callback function that will be called on the server when a
        client offers protocols using ALPN.

        :param callback: The callback function.  It will be invoked with two
            arguments: the Connection, and a list of offered protocols as
            bytestrings, e.g ``[b'http/1.1', b'spdy/2']``.  It should return
            one of those bytestrings, the chosen protocol.
        N)	r�r�r�r�r�ZSSL_CTX_set_alpn_select_cbr�r�r�)r�r�rsrsrt�set_alpn_select_callback�s

z Context.set_alpn_select_callbackcCsh||_|j|_|dkr tj|_ntj|�|_tj|j	|j�}t
|dk�tj|j	|j�}t
|dk�dS)z�
        This internal helper does the common work for
        ``set_ocsp_server_callback`` and ``set_ocsp_client_callback``, which is
        almost all of it.
        Nru)r�r�r�r�r�r�Z
new_handler�ZSSL_CTX_set_tlsext_status_cbr�r�ZSSL_CTX_set_tlsext_status_arg)r��helperr��rcrsrsrt�_set_ocsp_callback�s
zContext._set_ocsp_callbackcCst|�}|j||�dS)a�
        Set a callback to provide OCSP data to be stapled to the TLS handshake
        on the server side.

        :param callback: The callback function. It will be invoked with two
            arguments: the Connection, and the optional arbitrary data you have
            provided. The callback must return a bytestring that contains the
            OCSP data to staple to the handshake. If no OCSP data is available
            for this connection, return the empty bytestring.
        :param data: Some opaque data that will be passed into the callback
            function when called. This can be used to avoid needing to do
            complex data lookups or to keep track of what context is being
            used. This parameter is optional.
        N)r�rF)r�r�r�rDrsrsrt�set_ocsp_server_callback�sz Context.set_ocsp_server_callbackcCst|�}|j||�dS)a�
        Set a callback to validate OCSP data stapled to the TLS handshake on
        the client side.

        :param callback: The callback function. It will be invoked with three
            arguments: the Connection, a bytestring containing the stapled OCSP
            assertion, and the optional arbitrary data you have provided. The
            callback must return a boolean that indicates the result of
            validating the OCSP data: ``True`` if the OCSP data is valid and
            the certificate can be trusted, or ``False`` if either the OCSP
            data is invalid or the certificate has been revoked.
        :param data: Some opaque data that will be passed into the callback
            function when called. This can be used to avoid needing to do
            complex data lookups or to keep track of what context is being
            used. This parameter is optional.
        N)r�rF)r�r�r�rDrsrsrt�set_ocsp_client_callback�sz Context.set_ocsp_client_callback)N)N)N)N)?rprqrrrr%r&r'r(r)r*r��dict�itemsr�r�r�r�rr�r�rrrrrrrrrrrrr r!r"r$r%r&r)r*r.r2r3r4r5r7r8r9r;r<r��
_requires_snir=r>�
_requires_npnr?r@�_requires_alpnrBrCrFrGrHrsrsrsrtrm�sn.
 
1


		 %		


z4ContextType has been deprecated, use Context insteadc@seZdZdZe�Zdxdd�Zdd�Zdd�Zd	d
�Z	dd�Z
ed
d��Zedd��Z
dd�Zdydd�ZeZdzdd�Zd{dd�ZeZd|dd�Zdd�Zdd�Zd d!�Zd"d#�Zd$d%�Zd&d'�Zd(d)�Zd*d+�Zd,d-�Zd.d/�Zd0d1�Zd2d3�Z d4d5�Z!d6d7�Z"d8d9�Z#d:d;�Z$d<d=�Z%d>d?�Z&d@dA�Z'dBdC�Z(dDdE�Z)dFdG�Z*dHdI�Z+d}dJdK�Z,dLdM�Z-dNdO�Z.dPdQ�Z/dRdS�Z0dTdU�Z1dVdW�Z2dXdY�Z3dZd[�Z4d\d]�Z5d^d_�Z6d`da�Z7dbdc�Z8ddde�Z9dfdg�Z:dhdi�Z;djdk�Z<dldm�Z=dndo�Z>e?dpdq��Z@eAdrds��ZBeAdtdu��ZCdvdw�ZDdS)~rnz
    NcCst|t�std��tj|j�}tj|tj�|_	tj
|j	tj�||_d|_d|_
d|_d|_||j|j	<|dkr�d|_tjtj��|_t|jtjk�tjtj��|_t|jtjk�tj|j	|j|j�n2d|_d|_||_tj|j	t|j��}t|dk�dS)z�
        Create a new Connection object, using the given OpenSSL.SSL.Context
        instance and socket.

        :param context: An SSL Context to use for this connection
        :param socket: The socket to use for transport layer
        z"context must be a Context instanceNru)r�rmr�r�ZSSL_newr�r�r�ZSSL_free�_sslZSSL_set_modeZSSL_MODE_AUTO_RETRYr�r�r�r�r��_socketZBIO_newZ	BIO_s_mem�	_into_sslr�r��	_from_sslZSSL_set_bioZ
SSL_set_fdr�)r�r��socketr�rrsrsrtr�s0
zConnection.__init__cCs0|jdkr td|jj|f��nt|j|�SdS)zy
        Look up attributes on the wrapped socket object if they are not found
        on the Connection object.
        Nz!'%s' object has no attribute '%s')rOr��	__class__rpr�)r�r�rsrsrt�__getattr__<s
zConnection.__getattr__cCsT|jjdk	r|jjj�|jjdk	r0|jjj�|jjdk	rH|jjj�|jjdk	r`|jjj�|jjdk	rx|jjj�tj||�}|tj	kr�t
��n�|tjkr�t��n�|tj
kr�t��n�|tjkr�t��n�|tjk�r<tj�dk�r4|dk�r(tdk�rtj�d}ntj}|dk�r(t|tj|���tdd��nt�n|tjk�rJnt�dS)NrZwin32ruzUnexpected EOFr�)r�r�r�r�r�r�r�r�Z
SSL_get_errorZSSL_ERROR_WANT_READrfZSSL_ERROR_WANT_WRITErgZSSL_ERROR_ZERO_RETURNriZSSL_ERROR_WANT_X509_LOOKUPrhZSSL_ERROR_SYSCALLZERR_peek_errorrr�Zgetwinerror�errnorjrrr�ZSSL_ERROR_NONE)r�r�r�r�rUrsrsrt�_raise_ssl_errorHs@






zConnection._raise_ssl_errorcCs|jS)zh
        Retrieve the :class:`Context` object associated with this
        :class:`Connection`.
        )r�)r�rsrsrt�get_contextqszConnection.get_contextcCs,t|t�std��tj|j|j�||_dS)z�
        Switch this connection to a new session context.

        :param context: A :class:`Context` instance giving the new session
            context to use.
        z"context must be a Context instanceN)r�rmr�r�ZSSL_set_SSL_CTXrNr�)r�r�rsrsrt�set_contextxs
zConnection.set_contextcCs(tj|jtj�}|tjkrdStj|�S)z�
        Retrieve the servername extension value if provided in the client hello
        message, or None if there wasn't one.

        :return: A byte string giving the server name or :data:`None`.

        .. versionadded:: 0.13
        N)r�ZSSL_get_servernamerNZTLSEXT_NAMETYPE_host_namer�r�r�)r�r�rsrsrt�get_servername�s


zConnection.get_servernamecCs6t|t�std��nd|kr$td��tj|j|�dS)z�
        Set the value of the servername extension to send in the client hello.

        :param name: A byte string giving the name.

        .. versionadded:: 0.13
        zname must be a byte string�zname must not contain NUL byteN)r�r,r�r�ZSSL_set_tlsext_host_namerN)r�r�rsrsrt�set_tlsext_host_name�s
	

zConnection.set_tlsext_host_namecCstj|j�S)z�
        Get the number of bytes that can be safely read from the SSL buffer
        (**not** the underlying transport buffer).

        :return: The number of bytes available in the receive buffer.
        )r�ZSSL_pendingrN)r�rsrsrt�pending�szConnection.pendingrcCsztd|�}t|t�r|j�}t|t�r.t|�}t|t�s@td��t|�dkrTt	d��t
j|j|t|��}|j
|j|�|S)a�
        Send data on the connection. NOTE: If you get one of the WantRead,
        WantWrite or WantX509Lookup exceptions on this, you have to call the
        method again with the SAME buffer.

        :param buf: The string, buffer or memoryview to send
        :param flags: (optional) Included for compatibility with the socket
                      API, the value is ignored
        :return: The number of bytes written
        rz0data must be a memoryview, buffer or byte stringi���z,Cannot send more than 2**31-1 bytes at once.)rr��
memoryview�tobytesro�strr,r�r�r�r��	SSL_writerNrV)r�r�flagsr�rsrsrt�send�s



zConnection.sendcCs�td|�}t|t�r|j�}t|t�r.t|�}t|t�s@td��t|�}d}t	j
d|�}x@|r�tj|j
||t|d��}|j|j
|�||7}||8}qZWdS)a�
        Send "all" data on the connection. This calls send() repeatedly until
        all data is sent. If an error occurs, it's impossible to tell how much
        data has been sent.

        :param buf: The string, buffer or memoryview to send
        :param flags: (optional) Included for compatibility with the socket
                      API, the value is ignored
        :return: The number of bytes written
        rz/buf must be a memoryview, buffer or byte stringrzchar[]i���N)rr�r]r^ror_r,r�r�r�r�r�r`rN�minrV)r�rraZleft_to_sendZ
total_sentr�r�rsrsrt�sendall�s$



zConnection.sendallcCs`td|�}|dk	r.|tj@r.tj|j||�}ntj|j||�}|j|j|�tj	||�dd�S)a
        Receive data on the connection.

        :param bufsiz: The maximum number of bytes to read
        :param flags: (optional) The only supported flag is ``MSG_PEEK``,
            all other flags are ignored.
        :return: The string read from the Connection
        zchar[]N)
�_no_zero_allocatorrR�MSG_PEEKr��SSL_peekrN�SSL_readrVr�r�)r��bufsizrarr�rsrsrt�recv�s	
zConnection.recvcCs�|dkrt|�}nt|t|��}td|�}|dk	rN|tj@rNtj|j||�}ntj|j||�}|j	|j|�t
tj||��|d|�<|S)ae
        Receive data on the connection and copy it directly into the provided
        buffer, rather than creating a new string.

        :param buffer: The buffer to copy into.
        :param nbytes: (optional) The maximum number of bytes to read into the
            buffer. If not present, defaults to the size of the buffer. If
            larger than the size of the buffer, is reduced to the size of the
            buffer.
        :param flags: (optional) The only supported flag is ``MSG_PEEK``,
            all other flags are ignored.
        :return: The number of bytes read into the buffer.
        Nzchar[])
r�rcrerRrfr�rgrNrhrVr]r�r�)r�r��nbytesrarr�rsrsrt�	recv_intos

zConnection.recv_intocCsVtj|�rLtj|�rt��qRtj|�r.t��qRtj|�rBtd��qRtd��nt�dS)N�BIO_should_io_specialzunknown bio failure)	r�ZBIO_should_retryZBIO_should_readrfZBIO_should_writergrmr�r�)r�r(r�rsrsrt�_handle_bio_errors(s





zConnection._handle_bio_errorscCsh|jdkrtd��t|t�s$td��td|�}tj|j||�}|dkrT|j|j|�tj	||�dd�S)a�
        If the Connection was created with a memory BIO, this method can be
        used to read bytes from the write end of that memory BIO.  Many
        Connection methods will add bytes which must be read in this manner or
        the buffer will eventually fill up and the Connection will be able to
        take no further actions.

        :param bufsiz: The maximum number of bytes to read
        :return: The string read.
        NzConnection sock was not Nonezbufsiz must be an integerzchar[]r)
rQr�r�rrer�ZBIO_readrnr�r�)r�rirr�rsrsrt�bio_read:s


zConnection.bio_readcCsJtd|�}|jdkrtd��tj|j|t|��}|dkrF|j|j|�|S)aj
        If the Connection was created with a memory BIO, this method can be
        used to add bytes to the read end of that memory BIO.  The Connection
        can then read the bytes (for example, in response to a call to
        :meth:`recv`).

        :param buf: The string to put into the memory BIO.
        :return: The number of bytes written
        rNzConnection sock was not Noner)rrPr�r�Z	BIO_writer�rn)r�rr�rsrsrt�	bio_writeRs


zConnection.bio_writecCs$|j�s ttj|j�dk�dSdS)z�
        Renegotiate the session.

        :return: True if the renegotiation can be started, False otherwise
        :rtype: bool
        ruTF)�renegotiate_pendingr�r�ZSSL_renegotiaterN)r�rsrsrt�renegotiatefszConnection.renegotiatecCstj|j�}|j|j|�dS)a
        Perform an SSL handshake (usually called after :meth:`renegotiate` or
        one of :meth:`set_accept_state` or :meth:`set_accept_state`). This can
        raise the same exceptions as :meth:`send` and :meth:`recv`.

        :return: None.
        N)r�ZSSL_do_handshakerNrV)r�r�rsrsrt�do_handshakerszConnection.do_handshakecCstj|j�dkS)z�
        Check if there's a renegotiation in progress, it will return False once
        a renegotiation is finished.

        :return: Whether there's a renegotiation in progress
        :rtype: bool
        ru)r�ZSSL_renegotiate_pendingrN)r�rsrsrtrq}szConnection.renegotiate_pendingcCstj|j�S)z�
        Find out the total number of renegotiations.

        :return: The number of renegotiations.
        :rtype: int
        )r�ZSSL_total_renegotiationsrN)r�rsrsrt�total_renegotiations�szConnection.total_renegotiationscCstj|j�|jj|�S)a4
        Call the :meth:`connect` method of the underlying socket and set up SSL
        on the socket, using the :class:`Context` object supplied to this
        :class:`Connection` object at creation.

        :param addr: A remote address
        :return: What the socket's connect method returns
        )r��SSL_set_connect_staterNrO�connect)r��addrrsrsrtrv�s	zConnection.connectcCs|jj}|j�||�S)a�
        Call the :meth:`connect_ex` method of the underlying socket and set up
        SSL on the socket, using the Context object supplied to this Connection
        object at creation. Note that if the :meth:`connect_ex` method of the
        socket doesn't return 0, SSL won't be initialized.

        :param addr: A remove address
        :return: What the socket's connect_ex method returns
        )rO�
connect_ex�set_connect_state)r�rwrxrsrsrtrx�s
zConnection.connect_excCs*|jj�\}}t|j|�}|j�||fS)a�
        Call the :meth:`accept` method of the underlying socket and set up SSL
        on the returned socket, using the Context object supplied to this
        :class:`Connection` object at creation.

        :return: A *(conn, addr)* pair where *conn* is the new
            :class:`Connection` object created, and *address* is as returned by
            the socket's :meth:`accept`.
        )rO�acceptrnr��set_accept_state)r�Zclientrwr�rsrsrtrz�s
zConnection.acceptcCs$|jdkrtd��tj|jd�dS)z�
        If the Connection was created with a memory BIO, this method can be
        used to indicate that *end of file* has been reached on the read end of
        that memory BIO.

        :return: None
        NzConnection sock was not Noner)rQr�r�ZBIO_set_mem_eof_returnrP)r�rsrsrt�bio_shutdown�s
zConnection.bio_shutdowncCs8tj|j�}|dkr$|j|j|�n|dkr0dSdSdS)aQ
        Send the shutdown message to the Connection.

        :return: True if the shutdown completed successfully (i.e. both sides
                 have sent closure alerts), False otherwise (in which case you
                 call :meth:`recv` or :meth:`send` when the connection becomes
                 readable/writeable).
        rTFN)r�ZSSL_shutdownrNrV)r�r�rsrsrt�shutdown�s	zConnection.shutdowncCsFg}x<t�D]2}tj|j|�}|tjkr*P|jttj|���qW|S)z�
        Retrieve the list of ciphers used by the Connection object.

        :return: A list of native cipher strings.
        )	rr�ZSSL_get_cipher_listrNr�r�r��_nativer�)r�Zciphers�ir�rsrsrtr-�s
zConnection.get_cipher_listcCs�tj|j�}|tjkrgSg}x^ttj|��D]L}tj||�}tj|�}t	|tjk�t
jt
�}tj|tj
�|_|j|�q.W|S)a�
        Get CAs whose certificates are suggested for client authentication.

        :return: If this is a server connection, the list of certificate
            authorities that will be sent or has been sent to the client, as
            controlled by this :class:`Connection`'s :class:`Context`.

            If this is a client connection, the list will be empty until the
            connection with the server is established.

        .. versionadded:: 0.10
        )r�ZSSL_get_client_CA_listrNr�r��rangeZsk_X509_NAME_numZsk_X509_NAME_valuer/r�rr:r�r1r0r�)r�Zca_namesr�rr�rZpynamersrsrt�get_client_ca_list�s



zConnection.get_client_ca_listcOstd��dS)z�
        The makefile() method is not implemented, since there is no dup
        semantics for SSL connections

        :raise: NotImplementedError
        z1Cannot make file object of OpenSSL.SSL.ConnectionN)r�)r�r�r�rsrsrt�makefileszConnection.makefilecCs|jS)zr
        Retrieve application data as set by :meth:`set_app_data`.

        :return: The application data
        )r�)r�rsrsrtr8szConnection.get_app_datacCs
||_dS)zg
        Set application data

        :param data: The application data
        :return: None
        N)r�)r�r�rsrsrtr9szConnection.set_app_datacCstj|j�S)z�
        Get the shutdown state of the Connection.

        :return: The shutdown state, a bitvector of SENT_SHUTDOWN,
            RECEIVED_SHUTDOWN.
        )r�ZSSL_get_shutdownrN)r�rsrsrt�get_shutdownszConnection.get_shutdowncCs$t|t�std��tj|j|�dS)z�
        Set the shutdown state of the Connection.

        :param state: bitvector of SENT_SHUTDOWN, RECEIVED_SHUTDOWN.
        :return: None
        zstate must be an integerN)r�rr�r�ZSSL_set_shutdownrN)r��statersrsrt�set_shutdown&s
zConnection.set_shutdowncCstjtj|j��S)z�
        Retrieve a verbose string detailing the state of the Connection.

        :return: A string representing the state
        :rtype: bytes
        )r�r�r�ZSSL_state_string_longrN)r�rsrsrt�get_state_string2szConnection.get_state_stringcCsftj|j�}|tjkrdStj|jtjd�}|dks8t�td|�}tj|j||�tj||�dd�S)z�
        Retrieve the random value used with the server hello message.

        :return: A string representing the state
        Nrzunsigned char[])	r��SSL_get_sessionrNr�r�ZSSL_get_server_random�AssertionErrorrer�)r��sessionr��outprsrsrt�
server_random;s

zConnection.server_randomcCsftj|j�}|tjkrdStj|jtjd�}|dks8t�td|�}tj|j||�tj||�dd�S)z�
        Retrieve the random value used with the client hello message.

        :return: A string representing the state
        Nrzunsigned char[])	r�r�rNr�r�ZSSL_get_client_randomr�rer�)r�r�r�r�rsrsrt�
client_randomJs

zConnection.client_randomcCsbtj|j�}|tjkrdStj|tjd�}|dks6t�td|�}tj|||�tj||�dd�S)zz
        Retrieve the value of the master key for this session.

        :return: A string representing the state
        Nrzunsigned char[])	r�r�rNr�r�ZSSL_SESSION_get_master_keyr�rer�)r�r�r�r�rsrsrt�
master_keyZs

zConnection.master_keyc		Csntd|�}tj}d}d}|dk	r0|}t|�}d}tj|j|||t|�|||�}t|dk�tj||�dd�S)aH
        Obtain keying material for application use.

        :param: label - a disambiguating label string as described in RFC 5705
        :param: olen - the length of the exported key material in bytes
        :param: context - a per-association context value
        :return: the exported key material bytes or None
        zunsigned char[]rNru)	rer�r�r�r�ZSSL_export_keying_materialrNr�r�)	r�ZlabelZolenr�r�Zcontext_bufZcontext_lenZuse_context�successrsrsrt�export_keying_materialjs	
z!Connection.export_keying_materialcOs|jj||�S)z�
        Call the :meth:`shutdown` method of the underlying socket.
        See :manpage:`shutdown(2)`.

        :return: What the socket's shutdown() method returns
        )rOr})r�r�r�rsrsrt�
sock_shutdown�szConnection.sock_shutdowncCs.tj|j�}|tjkr*tj|�tj|�SdS)za
        Retrieve the local certificate (if any)

        :return: The local certificate
        N)r�ZSSL_get_certificaterNr�r�r�rr�)r�r�rsrsrt�get_certificate�s



zConnection.get_certificatecCs$tj|j�}|tjkr tj|�SdS)zi
        Retrieve the other side's certificate (if any)

        :return: The peer's certificate
        N)r�ZSSL_get_peer_certificaterNr�r�rr�)r�r�rsrsrt�get_peer_certificate�s

zConnection.get_peer_certificatecCs`tj|j�}|tjkrdSg}x<ttj|��D]*}tjtj||��}t	j
|�}|j|�q.W|S)z�
        Retrieve the other side's certificate (if any)

        :return: A list of X509 instances giving the peer's certificate chain,
                 or None if it does not have one.
        N)r�ZSSL_get_peer_cert_chainrNr�r�r�Zsk_X509_numrZ
sk_X509_valuerr�r�)r�Z
cert_stackr�rr�Zpycertrsrsrt�get_peer_cert_chain�s

zConnection.get_peer_cert_chaincCstj|j�S)z�
        Checks if more data has to be read from the transport layer to complete
        an operation.

        :return: True iff more data has to be read
        )r�Z
SSL_want_readrN)r�rsrsrt�	want_read�szConnection.want_readcCstj|j�S)z�
        Checks if there is data to write to the transport layer to complete an
        operation.

        :return: True iff there is data to write
        )r�ZSSL_want_writerN)r�rsrsrt�
want_write�szConnection.want_writecCstj|j�dS)z�
        Set the connection to work in server mode. The handshake will be
        handled automatically by read/write.

        :return: None
        N)r�ZSSL_set_accept_staterN)r�rsrsrtr{�szConnection.set_accept_statecCstj|j�dS)z�
        Set the connection to work in client mode. The handshake will be
        handled automatically by read/write.

        :return: None
        N)r�rurN)r�rsrsrtry�szConnection.set_connect_statecCs8tj|j�}|tjkrdStjt�}tj|tj�|_	|S)z�
        Returns the Session currently used.

        :return: An instance of :class:`OpenSSL.SSL.Session` or
            :obj:`None` if no session exists.

        .. versionadded:: 0.14
        N)
r�ZSSL_get1_sessionrNr�r�rlr:r�ZSSL_SESSION_free�_session)r�r�Z	pysessionrsrsrt�get_session�s	

zConnection.get_sessioncCs0t|t�std��tj|j|j�}|s,t�dS)z�
        Set the session to be used when the TLS/SSL connection is established.

        :param session: A Session instance representing the session to use.
        :returns: None

        .. versionadded:: 0.14
        z"session must be a Session instanceN)r�rlr�r�ZSSL_set_sessionrNr�r�)r�r�r�rsrsrt�set_session�s
	
zConnection.set_sessioncCsRtjdd�}||j|d�}|dkr&dStd|�}||j||�tj||�dd�S)a�
        Helper to implement :meth:`get_finished` and
        :meth:`get_peer_finished`.

        :param function: Either :data:`SSL_get_finished`: or
            :data:`SSL_get_peer_finished`.

        :return: :data:`None` if the desired message has not yet been
            received, otherwise the contents of the message.
        :rtype: :class:`bytes` or :class:`NoneType`
        zchar[]rN)r�r�rNrer�)r�Zfunction�emptyr�rrsrsrt�_get_finished_message�s
z Connection._get_finished_messagecCs|jtj�S)a
        Obtain the latest TLS Finished message that we sent.

        :return: The contents of the message or :obj:`None` if the TLS
            handshake has not yet completed.
        :rtype: :class:`bytes` or :class:`NoneType`

        .. versionadded:: 0.15
        )r�r�ZSSL_get_finished)r�rsrsrt�get_finished	s
zConnection.get_finishedcCs|jtj�S)a!
        Obtain the latest TLS Finished message that we received from the peer.

        :return: The contents of the message or :obj:`None` if the TLS
            handshake has not yet completed.
        :rtype: :class:`bytes` or :class:`NoneType`

        .. versionadded:: 0.15
        )r�r�ZSSL_get_peer_finished)r�rsrsrt�get_peer_finished(	s
zConnection.get_peer_finishedcCs8tj|j�}|tjkrdStjtj|��}|jd�SdS)a
        Obtain the name of the currently used cipher.

        :returns: The name of the currently used cipher or :obj:`None`
            if no connection has been established.
        :rtype: :class:`unicode` or :class:`NoneType`

        .. versionadded:: 0.15
        Nzutf-8)r��SSL_get_current_cipherrNr�r�r�ZSSL_CIPHER_get_namer�)r��cipherr�rsrsrt�get_cipher_name4	s


zConnection.get_cipher_namecCs,tj|j�}|tjkrdStj|tj�SdS)a.
        Obtain the number of secret bits of the currently used cipher.

        :returns: The number of secret bits of the currently used cipher
            or :obj:`None` if no connection has been established.
        :rtype: :class:`int` or :class:`NoneType`

        .. versionadded:: 0.15
        N)r�r�rNr�r�ZSSL_CIPHER_get_bits)r�r�rsrsrt�get_cipher_bitsE	s

zConnection.get_cipher_bitscCs8tj|j�}|tjkrdStjtj|��}|jd�SdS)a%
        Obtain the protocol version of the currently used cipher.

        :returns: The protocol name of the currently used cipher
            or :obj:`None` if no connection has been established.
        :rtype: :class:`unicode` or :class:`NoneType`

        .. versionadded:: 0.15
        Nzutf-8)r�r�rNr�r�r�ZSSL_CIPHER_get_versionr�)r�r��versionrsrsrt�get_cipher_versionU	s


zConnection.get_cipher_versioncCstjtj|j��}|jd�S)a>
        Retrieve the protocol version of the current connection.

        :returns: The TLS version of the current connection, for example
            the value for TLS 1.2 would be ``TLSv1.2``or ``Unknown``
            for connections that were not successfully established.
        :rtype: :class:`unicode`
        zutf-8)r�r�r�ZSSL_get_versionrNr�)r�r�rsrsrt�get_protocol_version_namef	s	z$Connection.get_protocol_version_namecCstj|j�}|S)a
        Retrieve the SSL or TLS protocol version of the current connection.

        :returns: The TLS version of the current connection.  For example,
            it will return ``0x769`` for connections made over TLS version 1.
        :rtype: :class:`int`
        )r�ZSSL_versionrN)r�r�rsrsrt�get_protocol_versionr	szConnection.get_protocol_versioncCs@tjd�}tjd�}tj|j||�tj|d|d�dd�S)z�
        Get the protocol that was negotiated by NPN.

        :returns: A bytestring of the protocol name.  If no protocol has been
            negotiated yet, returns an empty string.

        .. versionadded:: 0.15
        zunsigned char **zunsigned int *rN)r�r�r�ZSSL_get0_next_proto_negotiatedrNr�)r�r��data_lenrsrsrt�get_next_proto_negotiated}	s


z$Connection.get_next_proto_negotiatedcCs>djtjdd�|D���}tjd|�}tj|j|t|��dS)ah
        Specify the client's ALPN protocol list.

        These protocols are offered to the server during protocol negotiation.

        :param protos: A list of the protocols to be offered to the server.
            This list should be a Python list of bytestrings representing the
            protocols to offer, e.g. ``[b'http/1.1', b'spdy/2']``.
        r�css|]}tt|��|fVqdS)N)rr�)r�r�rsrsrtr��	sz-Connection.set_alpn_protos.<locals>.<genexpr>zunsigned char[]N)	r�rr�r�r�r�ZSSL_set_alpn_protosrNr�)r�r�r�rArsrsrtrB�	s
zConnection.set_alpn_protoscCsHtjd�}tjd�}tj|j||�|s,dStj|d|d�dd�S)z�
        Get the protocol that was negotiated by ALPN.

        :returns: A bytestring of the protocol name.  If no protocol has been
            negotiated yet, returns an empty string.
        zunsigned char **zunsigned int *r�rN)r�r�r�ZSSL_get0_alpn_selectedrNr�)r�r�r�rsrsrt�get_alpn_proto_negotiated�	s

z$Connection.get_alpn_proto_negotiatedcCs tj|jtj�}t|dk�dS)a
        Called to request that the server sends stapled OCSP data, if
        available. If this is not called on the client side then the server
        will not send OCSP data. Should be used in conjunction with
        :meth:`Context.set_ocsp_client_callback`.
        ruN)r�ZSSL_set_tlsext_status_typerNZTLSEXT_STATUSTYPE_ocspr�)r�rErsrsrt�request_ocsp�	szConnection.request_ocsp)N)r)r)N)NN)N)Erprqrrrrr�r�rTrVrWrXrKrYr[r\rb�writerdrj�readrlrnrorprrrsrqrtrvrxrzr|r}r-r�r�r8r9r�r�r�r�r�r�r�r�r�r�r�r�r�r{ryr�r�r�r�r�r�r�r�r�r�rLr�rMrBr�r�rsrsrsrtrns|
6)
	

$

%
	

			
					"z:ConnectionType has been deprecated, use Connection instead)�rrR�sysr�	functoolsrr�	itertoolsrr�weakrefrrUrZcryptography.utilsr	Zsixr
r�rrr
Z
OpenSSL._utilrrrZ_exception_from_error_queuerr�rr�rZ_make_assertrr~rr�rrrreZOpenSSL.cryptorrrrrr�__all__r�ro�	NameError�objectrrrr r!r"ZSSL_SENT_SHUTDOWNr#ZSSL_RECEIVED_SHUTDOWNr$r%r&r'r(r)r*ZSSL_OP_NO_SSLv2r+ZSSL_OP_NO_SSLv3r,ZSSL_OP_NO_TLSv1r-ZSSL_OP_NO_TLSv1_1r.ZSSL_OP_NO_TLSv1_2r/ZSSL_MODE_RELEASE_BUFFERSr0ZSSL_OP_SINGLE_DH_USEr1ZSSL_OP_SINGLE_ECDH_USEr2ZSSL_OP_EPHEMERAL_RSAr3ZSSL_OP_MICROSOFT_SESS_ID_BUGr4ZSSL_OP_NETSCAPE_CHALLENGE_BUGr5Z'SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUGr6Z"SSL_OP_SSLREF2_REUSE_CERT_TYPE_BUGr7Z!SSL_OP_MICROSOFT_BIG_SSLV3_BUFFERr8ZSSL_OP_MSIE_SSLV2_RSA_PADDINGr9ZSSL_OP_SSLEAY_080_CLIENT_DH_BUGr:ZSSL_OP_TLS_D5_BUGr;ZSSL_OP_TLS_BLOCK_PADDING_BUGr<Z"SSL_OP_DONT_INSERT_EMPTY_FRAGMENTSr=ZSSL_OP_CIPHER_SERVER_PREFERENCEr>ZSSL_OP_TLS_ROLLBACK_BUGr?ZSSL_OP_PKCS1_CHECK_1r@ZSSL_OP_PKCS1_CHECK_2rAZSSL_OP_NETSCAPE_CA_DN_BUGrBZ&SSL_OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUGrCZSSL_OP_NO_COMPRESSIONrDZSSL_OP_NO_QUERY_MTUrEZSSL_OP_COOKIE_EXCHANGErFZSSL_OP_NO_TICKETrGZ
SSL_OP_ALLrHZSSL_VERIFY_PEERrIZSSL_VERIFY_FAIL_IF_NO_PEER_CERTrJZSSL_VERIFY_CLIENT_ONCErKZSSL_VERIFY_NONErLZSSL_SESS_CACHE_OFFrMZSSL_SESS_CACHE_CLIENTrNZSSL_SESS_CACHE_SERVERrOZSSL_SESS_CACHE_BOTHrPZSSL_SESS_CACHE_NO_AUTO_CLEARrQZ!SSL_SESS_CACHE_NO_INTERNAL_LOOKUPrRZ SSL_SESS_CACHE_NO_INTERNAL_STORErSZSSL_SESS_CACHE_NO_INTERNALrTrUrVrWZCryptography_HAS_SSL_STr{r|r}r~�extendrXrYrZr[r\r]r^r_r`rarbrcrdr�r�r�r�r�rer�r�rfrgrhrirjr�r�r�r�r�r�r�r�rkr�ZCryptography_HAS_NEXTPROTONEGrLZCryptography_HAS_ALPNrMZ Cryptography_HAS_TLSEXT_HOSTNAMErKrlrmrp�DeprecationWarningZContextTypernZConnectionTypeZSSL_library_initrsrsrsrt�<module>s�, 
')13C;	


ZIdebug.cpython-36.opt-1.pyc000064400000002123151730204570011221 0ustar003

�F\�@s�ddlmZddlZddlZddlZddlZddlZddlm	Z	dj
e	jejj
jejjj�jd�ejjejj�jd�eedd�ejejejej	ejejd	�
Zed
kr�ee�dS)�)�print_functionN�)�versionaBpyOpenSSL: {pyopenssl}
cryptography: {cryptography}
cffi: {cffi}
cryptography's compiled against OpenSSL: {crypto_openssl_compile}
cryptography's linked OpenSSL: {crypto_openssl_link}
Pythons's OpenSSL: {python_openssl}
Python executable: {python}
Python version: {python_version}
Platform: {platform}
sys.path: {sys_path}�asciiZOPENSSL_VERSIONzn/a)
Z	pyopensslZcrypto_openssl_compileZcrypto_openssl_linkZpython_openssl�cryptography�cffi�pythonZpython_version�platformZsys_path�__main__)Z
__future__rZssl�sysZOpenSSL.SSLZOpenSSLrr�r�format�__version__Z_utilZffi�string�libZOPENSSL_VERSION_TEXT�decodeZSSLZSSLeay_versionZSSLEAY_VERSION�getattr�
executabler	�pathZ	_env_info�__name__�print�rr�/usr/lib/python3.6/debug.py�<module>s.



__init__.cpython-36.pyc000064400000000161151730204570010733 0ustar003

�ft`
�@sdS)N�rrr�/usr/lib/python3.6/__init__.py�<module>srand.cpython-36.pyc000064400000002330151730204570010120 0ustar003

�F\�@s$dZddlmZdd�Zdd�ZdS)z*
PRNG management routines, thin wrappers.
�)�libcCs:t|t�std��t|t�s$td��tj|t|�|�dS)a�
    Mix bytes from *string* into the PRNG state.

    The *entropy* argument is (the lower bound of) an estimate of how much
    randomness is contained in *string*, measured in bytes.

    For more information, see e.g. :rfc:`1750`.

    This function is only relevant if you are forking Python processes and
    need to reseed the CSPRNG after fork.

    :param buffer: Buffer with random data.
    :param entropy: The entropy (in bytes) measurement of the buffer.

    :return: :obj:`None`
    zbuffer must be a byte stringzentropy must be an integerN)�
isinstance�bytes�	TypeError�int�_libZRAND_add�len)�bufferZentropy�r
�/usr/lib/python3.6/rand.py�adds


rcCstj�S)z}
    Check whether the PRNG has been seeded with enough data.

    :return: 1 if the PRNG is seeded enough, 0 otherwise.
    )rZRAND_statusr
r
r
r�status"sr
N)�__doc__Z
OpenSSL._utilrrrr
r
r
r
r�<module>scrypto.cpython-36.opt-1.pyc000064400000257571151730204570011476 0ustar003

�F\���$@s�ddlZddlmZddlmZddlmZmZmZm	Z	m
Z
mZddlm
ZmZmZddlmZddlmZmZddlmZdd	lmZmZmZ m!Z"m#Z$m%Z&m'Z(m)Z*d
ddd
ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-g$Z+ej,Z-ej.Z/dnZ0ej1Z2ej3Z4ej5Z6ej7Z8Gd1d�de9�Z:ee e:�Z;e*e:�Z<d2d3�Z=d4d5�Z>dod6d7�Z?d8d9�Z@d:d;�ZAd<d=�ZBGd>d?�d?eC�ZDGd@d�deC�ZEeeEeFdAeG�ZHGdBdC�dCeC�ZIdDd�ZJdEd�ZKGdFd�deC�ZLeeLeFdGeG�ZMGdHd�deC�ZNeeNeFdIeG�ZOGdJd�deC�ZPeePeFdKeG�ZQGdLd�deC�ZReeReFdMeG�ZSGdNd�deC�ZTGdOd�deC�ZUeeUeFdPeG�ZVGdQd�de9�ZWGdRd�deC�ZXdSd�ZYdTd�ZZdUd�Z[dpdVd�Z\GdWd�deC�Z]GdXd �d eC�Z^ee^eFdYeG�Z_GdZd!�d!eC�Z`ee`eFd[eG�ZaGd\d"�d"eC�ZbeebeFd]eG�ZcGd^d#�d#eC�ZdeedeFd_eG�ZeGd`da�daeC�Zfdbd$�Zgdqdcd%�Zhddd&�Zided'�Zjdfd(�Zkdgd)�Zldhd*�Zmdid+�Zndjd,�Zodrdkd-�Zpejq�ejr�ejsdl�dS)s�N)�	b16encode)�partial)�__eq__�__ne__�__lt__�__le__�__gt__�__ge__)�
integer_types�	text_type�PY3)�x509)�dsa�rsa)�
deprecated)�ffi�lib�exception_from_error_queue�byte_string�native�UNSPECIFIED�text_to_bytes_and_warn�make_assert�FILETYPE_PEM�
FILETYPE_ASN1�
FILETYPE_TEXT�TYPE_RSA�TYPE_DSA�Error�PKey�get_elliptic_curves�get_elliptic_curve�X509Name�
X509Extension�X509Req�X509�X509StoreFlags�	X509Store�X509StoreContextError�X509StoreContext�load_certificate�dump_certificate�dump_publickey�dump_privatekey�Revoked�CRL�PKCS7�PKCS12�NetscapeSPKI�load_publickey�load_privatekey�dump_certificate_request�load_certificate_request�sign�verify�dump_crl�load_crl�load_pkcs7_data�load_pkcs12���c@seZdZdZdS)rz7
    An error occurred in an `OpenSSL.crypto` API.
    N)�__name__�
__module__�__qualname__�__doc__�rDrD�/usr/lib/python3.6/crypto.pyrNscCsddlm}|S)ap
    Importing the backend from cryptography has the side effect of activating
    the osrandom engine. This mutates the global state of OpenSSL in the
    process and causes issues for various programs that use subinterpreters or
    embed Python. By putting the import in this function we can avoid
    triggering this side effect unless _get_backend is called.
    r)�backend)Z,cryptography.hazmat.backends.openssl.backendrF)rFrDrDrE�_get_backendXsrGcCstd|f��dS)z�
    An OpenSSL API failed somehow.  Additionally, the failure which was
    encountered isn't one that's exercised by the test suite so future behavior
    of pyOpenSSL is now somewhat less predictable.
    zUnknown %s failureN)�RuntimeError)�whererDrDrE�_untested_errordsrJcCsd|dkrtjtj��}tj}n(tjd|�}tj|t|��}|fdd�}t|tj	k�tj
||�}|S)z�
    Allocate a new OpenSSL memory BIO.

    Arrange for the garbage collector to clean it up automatically.

    :param buffer: None or some bytes to use to put into the BIO so that they
        can be read out.
    Nzchar[]cSs
tj|�S)N)�_lib�BIO_free)�bio�refrDrDrE�free~sz_new_mem_buf.<locals>.free)rK�BIO_new�	BIO_s_memrL�_ffi�newZBIO_new_mem_buf�len�_openssl_assert�NULL�gc)�bufferrMrO�datarDrDrE�_new_mem_bufms	rZcCs.tjd�}tj||�}tj|d|�dd�S)zO
    Copy the contents of an OpenSSL BIO object into a Python byte string.
    zchar**rN)rRrSrKZBIO_get_mem_datarX)rM�
result_bufferZ
buffer_lengthrDrDrE�_bio_to_string�s
r\cCs2t|t�std��tj||�}|dkr.td��dS)a�
    The the time value of an ASN1 time object.

    @param boundary: An ASN1_TIME pointer (or an object safely
        castable to that type) which will have its value set.
    @param when: A string representation of the desired time value.

    @raise TypeError: If C{when} is not a L{bytes} string.
    @raise ValueError: If C{when} does not represent a time in the required
        format.
    @raise RuntimeError: If the time value cannot be set for some other
        (unspecified) reason.
    zwhen must be a byte stringrzInvalid stringN)�
isinstance�bytes�	TypeErrorrKZASN1_TIME_set_string�
ValueError)�boundary�when�
set_resultrDrDrE�_set_asn1_time�s

rdcCs�tjd|�}tj|�dkrdStj|�tjkr>tjtj|��Stjd�}tj	||�|dtj
krltd�n6tjd|d�}tj|�}tj|�}tj|d�|SdS)a]
    Retrieve the time value of an ASN1 time object.

    @param timestamp: An ASN1_GENERALIZEDTIME* (or an object safely castable to
        that type) from which the time value will be retrieved.

    @return: The time value from C{timestamp} as a L{bytes} string in a certain
        format.  Or C{None} if the object contains no time value.
    zASN1_STRING*rNzASN1_GENERALIZEDTIME**�ASN1_TIME_to_generalizedtime)
rR�castrK�ASN1_STRING_lengthZASN1_STRING_typeZV_ASN1_GENERALIZEDTIME�string�ASN1_STRING_datarSrerVrJZASN1_GENERALIZEDTIME_free)Z	timestampZstring_timestampZgeneralized_timestampZstring_data�
string_resultrDrDrE�_get_asn1_time�s





rkc@s$eZdZdd�Zdd�Zdd�ZdS)�_X509NameInvalidatorcCs
g|_dS)N)�_names)�selfrDrDrE�__init__�sz_X509NameInvalidator.__init__cCs|jj|�dS)N)rm�append)rn�namerDrDrE�add�sz_X509NameInvalidator.addcCsx|jD]}|`qWdS)N)rm�_name)rnrqrDrDrE�clear�sz_X509NameInvalidator.clearN)r@rArBrorrrtrDrDrDrErl�srlc@sTeZdZdZdZdZdd�Zdd�Zedd	��Z	d
d�Z
dd
�Zdd�Zdd�Z
dS)rzD
    A class representing an DSA or RSA public key or key pair.
    FTcCs"tj�}tj|tj�|_d|_dS)NF)rKZEVP_PKEY_newrRrW�
EVP_PKEY_free�_pkey�_initialized)rn�pkeyrDrDrEro�sz
PKey.__init__cCs(t�}|jr|j|j�S|j|j�SdS)a
        Export as a ``cryptography`` key.

        :rtype: One of ``cryptography``'s `key interfaces`_.

        .. _key interfaces: https://cryptography.io/en/latest/hazmat/            primitives/asymmetric/rsa/#key-interfaces

        .. versionadded:: 16.1.0
        N)rG�_only_publicZ_evp_pkey_to_public_keyrvZ_evp_pkey_to_private_key)rnrFrDrDrE�to_cryptography_key�szPKey.to_cryptography_keycCsR|�}t|tjtjtjtjf�s(td��|j|_	t|tjtjf�rHd|_
d|_|S)z�
        Construct based on a ``cryptography`` *crypto_key*.

        :param crypto_key: A ``cryptography`` key.
        :type crypto_key: One of ``cryptography``'s `key interfaces`_.

        :rtype: PKey

        .. versionadded:: 16.1.0
        zUnsupported key typeT)r]rZRSAPublicKeyZ
RSAPrivateKeyrZDSAPublicKeyZ
DSAPrivateKeyr_Z	_evp_pkeyrvryrw)�clsZ
crypto_keyrxrDrDrE�from_cryptography_key�szPKey.from_cryptography_keycCs6t|t�std��t|t�s$td��|tkr�|dkr<td��tj�}tj|tj	�}tj
|tj�tj�}tj
|||tj�}t|dk�tj|j|�}t|dk�n�|tk�r$tj�}t|tjk�tj|tj�}tj||tjdtjtjtj�}t|dk�ttj|�dk�ttj|j|�dk�ntd��d|_dS)	a3
        Generate a key pair of the given type, with the given number of bits.

        This generates a key "into" the this object.

        :param type: The key type.
        :type type: :py:data:`TYPE_RSA` or :py:data:`TYPE_DSA`
        :param bits: The number of bits.
        :type bits: :py:data:`int` ``>= 0``
        :raises TypeError: If :py:data:`type` or :py:data:`bits` isn't
            of the appropriate type.
        :raises ValueError: If the number of bits isn't an integer of
            the appropriate size.
        :return: ``None``
        ztype must be an integerzbits must be an integerrzInvalid number of bitsr?zNo such key typeTN)r]�intr_rr`rK�BN_newrRrW�BN_freeZBN_set_wordZRSA_F4ZRSA_newZRSA_generate_key_exrVrUZEVP_PKEY_assign_RSArvrZDSA_newZDSA_freeZDSA_generate_parameters_exZDSA_generate_keyZEVP_PKEY_set1_DSArrw)rn�type�bitsZexponentr�resultr�resrDrDrE�generate_keys4


zPKey.generate_keycCs`|jrtd��tj|j��tjkr*td��tj|j�}tj	|tj
�}tj|�}|rVdSt�dS)ax
        Check the consistency of an RSA private key.

        This is the Python equivalent of OpenSSL's ``RSA_check_key``.

        :return: ``True`` if key is consistent.

        :raise OpenSSL.crypto.Error: if the key is inconsistent.

        :raise TypeError: if the key is of a type which cannot be checked.
            Only RSA keys can currently be checked.
        zpublic key onlyzkey type unsupportedTN)
ryr_rKZ
EVP_PKEY_typer��EVP_PKEY_RSA�EVP_PKEY_get1_RSArvrRrW�RSA_freeZ
RSA_check_key�_raise_current_error)rnrr�rDrDrE�checkGs

z
PKey.checkcCstj|j�S)zT
        Returns the type of the key

        :return: The type of the key.
        )rK�EVP_PKEY_idrv)rnrDrDrEr�asz	PKey.typecCstj|j�S)zh
        Returns the number of bits of the key

        :return: The number of bits of the key.
        )rKZ
EVP_PKEY_bitsrv)rnrDrDrEr�isz	PKey.bitsN)r@rArBrCryrwrorz�classmethodr|r�r�r�r�rDrDrDrEr�s8z.PKeyType has been deprecated, use PKey insteadcsdeZdZdZdZer �fdd�Zedd��Zedd��Z	ed	d
��Z
dd�Zd
d�Zdd�Z
�ZS)�_EllipticCurveaZ
    A representation of a supported elliptic curve.

    @cvar _curves: :py:obj:`None` until an attempt is made to load the curves.
        Thereafter, a :py:type:`set` containing :py:type:`_EllipticCurve`
        instances each of which represents one curve supported by the system.
    @type _curves: :py:type:`NoneType` or :py:type:`set`
    Ncst|t�rtt|�j|�StS)z�
            Implement cooperation with the right-hand side argument of ``!=``.

            Python 3 seems to have dropped this cooperation in this very narrow
            circumstance.
            )r]r��superr�NotImplemented)rn�other)�	__class__rDrEr�s
z_EllipticCurve.__ne__cs>�jtjd�}tjd|�}�j||�t��fdd�|D��S)z�
        Get the curves supported by OpenSSL.

        :param lib: The OpenSSL library binding object.

        :return: A :py:type:`set` of ``cls`` instances giving the names of the
            elliptic curves the underlying library supports.
        rzEC_builtin_curve[]c3s|]}�j�|j�VqdS)N)�from_nid�nid)�.0�c)r{rrDrE�	<genexpr>�sz7_EllipticCurve._load_elliptic_curves.<locals>.<genexpr>)ZEC_get_builtin_curvesrRrVrS�set)r{rZ
num_curvesZbuiltin_curvesrD)r{rrE�_load_elliptic_curves�s
z$_EllipticCurve._load_elliptic_curvescCs|jdkr|j|�|_|jS)a
        Get, cache, and return the curves supported by OpenSSL.

        :param lib: The OpenSSL library binding object.

        :return: A :py:type:`set` of ``cls`` instances giving the names of the
            elliptic curves the underlying library supports.
        N)�_curvesr�)r{rrDrDrE�_get_elliptic_curves�s

z#_EllipticCurve._get_elliptic_curvescCs|||tj|j|��jd��S)a�
        Instantiate a new :py:class:`_EllipticCurve` associated with the given
        OpenSSL NID.

        :param lib: The OpenSSL library binding object.

        :param nid: The OpenSSL NID the resulting curve object will represent.
            This must be a curve NID (and not, for example, a hash NID) or
            subsequent operations will fail in unpredictable ways.
        :type nid: :py:class:`int`

        :return: The curve object.
        �ascii)rRrh�
OBJ_nid2sn�decode)r{rr�rDrDrEr��sz_EllipticCurve.from_nidcCs||_||_||_dS)a�
        :param _lib: The :py:mod:`cryptography` binding instance used to
            interface with OpenSSL.

        :param _nid: The OpenSSL NID identifying the curve this object
            represents.
        :type _nid: :py:class:`int`

        :param name: The OpenSSL short name identifying the curve this object
            represents.
        :type name: :py:class:`unicode`
        N)rK�_nidrq)rnrr�rqrDrDrEro�s
z_EllipticCurve.__init__cCsd|jfS)Nz
<Curve %r>)rq)rnrDrDrE�__repr__�sz_EllipticCurve.__repr__cCs|jj|j�}tj|tj�S)z�
        Create a new OpenSSL EC_KEY structure initialized to use this curve.

        The structure is automatically garbage collected when the Python object
        is garbage collected.
        )rKZEC_KEY_new_by_curve_namer�rRrWZEC_KEY_free)rn�keyrDrDrE�
_to_EC_KEY�sz_EllipticCurve._to_EC_KEY)r@rArBrCr��_PY3rr�r�r�r�ror�r��
__classcell__rDrD)r�rEr�ysr�cCs
tjt�S)a�
    Return a set of objects representing the elliptic curves supported in the
    OpenSSL build in use.

    The curve objects have a :py:class:`unicode` ``name`` attribute by which
    they identify themselves.

    The curve objects are useful as values for the argument accepted by
    :py:meth:`Context.set_tmp_ecdh` to specify which elliptical curve should be
    used for ECDHE key exchange.
    )r�r�rKrDrDrDrEr �scCs,xt�D]}|j|kr|SqWtd|��dS)aT
    Return a single curve object selected by name.

    See :py:func:`get_elliptic_curves` for information about curve objects.

    :param name: The OpenSSL short name identifying the curve object to
        retrieve.
    :type name: :py:class:`unicode`

    If the named curve is not supported then :py:class:`ValueError` is raised.
    zunknown curve nameN)r rqr`)rqZcurverDrDrEr!�s
cs�eZdZdZdd�Z�fdd�Z�fdd�Zdd	�Zee�Zee	�Z	ee
�Z
ee�Zee�Zee
�Z
d
d�Zdd
�Zdd�Zdd�Z�ZS)r"a
    An X.509 Distinguished Name.

    :ivar countryName: The country of the entity.
    :ivar C: Alias for  :py:attr:`countryName`.

    :ivar stateOrProvinceName: The state or province of the entity.
    :ivar ST: Alias for :py:attr:`stateOrProvinceName`.

    :ivar localityName: The locality of the entity.
    :ivar L: Alias for :py:attr:`localityName`.

    :ivar organizationName: The organization name of the entity.
    :ivar O: Alias for :py:attr:`organizationName`.

    :ivar organizationalUnitName: The organizational unit of the entity.
    :ivar OU: Alias for :py:attr:`organizationalUnitName`

    :ivar commonName: The common name of the entity.
    :ivar CN: Alias for :py:attr:`commonName`.

    :ivar emailAddress: The e-mail address of the entity.
    cCs tj|j�}tj|tj�|_dS)z�
        Create a new X509Name, copying the given X509Name instance.

        :param name: The name to copy.
        :type name: :py:class:`X509Name`
        N)rK�
X509_NAME_duprsrRrW�X509_NAME_free)rnrqrDrDrEroszX509Name.__init__c	s|jd�rtt|�j||�St|�tk	r<tdt|�jf��tj	t
|��}|tjkr|y
t�Wnt
k
rrYnXtd��x\ttj|j��D]H}tj|j|�}tj|�}tj|�}||kr�tj|j|�}tj|�Pq�Wt|t�r�|jd�}tj|j|tj|ddd�}|�st�dS)	N�_z+attribute name must be string, not '%.200s'zNo such attributezutf-8r?r���r�)�
startswithr�r"�__setattr__r��strr_r@rK�OBJ_txt2nid�_byte_string�	NID_undefr�r�AttributeError�range�X509_NAME_entry_countrs�X509_NAME_get_entry�X509_NAME_ENTRY_get_object�OBJ_obj2nidZX509_NAME_delete_entryZX509_NAME_ENTRY_freer]�
_text_type�encodeZX509_NAME_add_entry_by_NIDZ
MBSTRING_UTF8)	rnrq�valuer��i�entZent_objZent_nid�
add_result)r�rDrEr�'s4







zX509Name.__setattr__c	s�tjt|��}|tjkrHy
t�Wntk
r6YnXtt|�j|�Stj	|j
|d�}|dkrddStj|j
|�}tj|�}t
jd�}tj||�}t|dk�z"t
j|d|�dd�jd�}Wdtj|d�X|S)a

        Find attribute. An X509Name object has the following attributes:
        countryName (alias C), stateOrProvince (alias ST), locality (alias L),
        organization (alias O), organizationalUnit (alias OU), commonName
        (alias CN) and more...
        r?Nzunsigned char**rzutf-8r�r�)rKr�r�r�r�rr�r"�__getattr__ZX509_NAME_get_index_by_NIDrsr��X509_NAME_ENTRY_get_datarRrSZASN1_STRING_to_UTF8rUrXr��OPENSSL_free)	rnrqr�Zentry_index�entryrYr[Zdata_lengthr�)r�rDrEr�Ks*




zX509Name.__getattr__cs�fdd�}|S)Ncs(t|t�stStj|j|j�}�|d�S)Nr)r]r"r�rKZ
X509_NAME_cmprs)rnr�r�)�oprDrE�fts
zX509Name._cmp.<locals>.frD)r�r�rD)r�rE�_cmpssz
X509Name._cmpcCsBtjdd�}tj|j|t|��}t|tjk�dttj	|��fS)z6
        String representation of an X509Name
        zchar[]iz<X509Name object '%s'>)
rRrSrKZX509_NAME_onelinersrTrUrV�_nativerh)rnr[Z
format_resultrDrDrEr��szX509Name.__repr__cCstj|j�S)a&
        Return an integer representation of the first four bytes of the
        MD5 digest of the DER representation of the name.

        This is the Python equivalent of OpenSSL's ``X509_NAME_hash``.

        :return: The (integer) hash of this name.
        :rtype: :py:class:`int`
        )rKZX509_NAME_hashrs)rnrDrDrE�hash�s
z
X509Name.hashcCsNtjd�}tj|j|�}t|dk�tj|d|�dd�}tj|d�|S)z�
        Return the DER encoding of this name.

        :return: The DER encoded form of this name.
        :rtype: :py:class:`bytes`
        zunsigned char**rN)rRrSrKZ
i2d_X509_NAMErsrUrXr�)rnr[Z
encode_resultrjrDrDrE�der�s
zX509Name.derc	Cs�g}x�ttj|j��D]n}tj|j|�}tj|�}tj|�}tj|�}tj|�}t	j
tj|�tj|��dd�}|j
t	j|�|f�qW|S)z�
        Returns the components of this name, as a sequence of 2-tuples.

        :return: The components of this name.
        :rtype: :py:class:`list` of ``name, value`` tuples.
        N)r�rKr�rsr�r�r�r�r�rRrXrirgrprh)	rnr�r�r�ZfnameZfvalr�rqr�rDrDrE�get_components�s



zX509Name.get_components)r@rArBrCror�r�r�rrrrrr	r�r�r�r�r�rDrD)r�rEr"s
$(z6X509NameType has been deprecated, use X509Name insteadc@sdeZdZdZddd�Zedd��Zejdej	dej
d	iZd
d�Zdd
�Z
dd�Zdd�Zdd�ZdS)r#z,
    An X.509 v3 certificate extension.
    NcCs�tjd�}tj|tjtjtjtjd�tj|�|dk	rRt|t�sJtd��|j	|_
|dk	rtt|t�sltd��|j	|_|r�d|}tjtj|||�}|tjkr�t
�tj|tj�|_dS)a�
        Initializes an X509 extension.

        :param type_name: The name of the type of extension_ to create.
        :type type_name: :py:data:`bytes`

        :param bool critical: A flag indicating whether this is a critical
            extension.

        :param value: The value of the extension.
        :type value: :py:data:`bytes`

        :param subject: Optional X509 certificate to use as subject.
        :type subject: :py:class:`X509`

        :param issuer: Optional X509 certificate to use as issuer.
        :type issuer: :py:class:`X509`

        .. _extension: https://www.openssl.org/docs/manmaster/man5/
            x509v3_config.html#STANDARD-EXTENSIONS
        zX509V3_CTX*rNzissuer must be an X509 instancez subject must be an X509 instances	critical,)rRrSrKZX509V3_set_ctxrVZX509V3_set_ctx_nodbr]r%r_�_x509�issuer_certZsubject_certZX509V3_EXT_nconfr�rW�X509_EXTENSION_free�
_extension)rnZ	type_nameZcriticalr��subject�issuerZctx�	extensionrDrDrEro�s"




zX509Extension.__init__cCstjtj|j��S)N)rKr��X509_EXTENSION_get_objectr�)rnrDrDrEr�szX509Extension._nidZemailZDNSZURIc
Cs�tjdtj|j��}tj|tj�}g}x�ttj|��D]�}tj	||�}y|j
|j}Wn8tk
r�t
�}tj||�|jtt|���Yq6Xttj|jjj|jjj�dd��}|j|d|�q6Wdj|�S)NzGENERAL_NAMES*�:z, )rRrfrKZX509V3_EXT_d2ir�rWZGENERAL_NAMES_freer�Zsk_GENERAL_NAME_numZsk_GENERAL_NAME_value�	_prefixesr��KeyErrorrZZGENERAL_NAME_printrpr�r\rX�dZia5rY�length�join)rn�names�partsr�rqZlabelrMr�rDrDrE�_subjectAltNameStrings "z#X509Extension._subjectAltNameStringcCsDtj|jkr|j�St�}tj||jdd�}t|dk�tt	|��S)zF
        :return: a nice text representation of the extension
        r)
rKZNID_subject_alt_namer�r�rZ�X509V3_EXT_printr�rUr�r\)rnrM�print_resultrDrDrE�__str__/szX509Extension.__str__cCstj|j�S)zk
        Returns the critical field of this X.509 extension.

        :return: The critical field.
        )rKZX509_EXTENSION_get_criticalr�)rnrDrDrE�get_critical<szX509Extension.get_criticalcCs&tj|j�}tj|�}tjtj|��S)z�
        Returns the short type name of this X.509 extension.

        The result is a byte string such as :py:const:`b"basicConstraints"`.

        :return: The short type name.
        :rtype: :py:data:`bytes`

        .. versionadded:: 0.12
        )rKr�r�r�rRrhr�)rn�objr�rDrDrE�get_short_nameDs
zX509Extension.get_short_namecCs@tj|j�}tjd|�}tj|�}tj|�}tj||�dd�S)z�
        Returns the data of the X509 extension, encoded as ASN.1.

        :return: The ASN.1 encoded data of this X509 extension.
        :rtype: :py:data:`bytes`

        .. versionadded:: 0.12
        zASN1_STRING*N)rK�X509_EXTENSION_get_datar�rRrfrirgrX)rnZoctet_resultrjZchar_result�
result_lengthrDrDrE�get_dataSs
	

zX509Extension.get_data)NN)r@rArBrCro�propertyr�rKZ	GEN_EMAILZGEN_DNSZGEN_URIr�r�r�r�r�r�rDrDrDrEr#�s
=

z@X509ExtensionType has been deprecated, use X509Extension insteadc@steZdZdZdd�Zdd�Zedd��Zdd	�Zd
d�Z	dd
�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�ZdS)r$z0
    An X.509 certificate signing requests.
    cCs&tj�}tj|tj�|_|jd�dS)Nr)rKZX509_REQ_newrRrW�
X509_REQ_free�_req�set_version)rn�reqrDrDrErooszX509Req.__init__cCsddlm}t�}|||j�S)z�
        Export as a ``cryptography`` certificate signing request.

        :rtype: ``cryptography.x509.CertificateSigningRequest``

        .. versionadded:: 17.1.0
        r)�_CertificateSigningRequest)�)cryptography.hazmat.backends.openssl.x509r�rGr�)rnr�rFrDrDrE�to_cryptographyuszX509Req.to_cryptographycCs&t|tj�std��|�}|j|_|S)a
        Construct based on a ``cryptography`` *crypto_req*.

        :param crypto_req: A ``cryptography`` X.509 certificate signing request
        :type crypto_req: ``cryptography.x509.CertificateSigningRequest``

        :rtype: X509Req

        .. versionadded:: 17.1.0
        z%Must be a certificate signing request)r]r
ZCertificateSigningRequestr_Z	_x509_reqr�)r{Z
crypto_reqr�rDrDrE�from_cryptography�s
zX509Req.from_cryptographycCs tj|j|j�}t|dk�dS)z�
        Set the public key of the certificate signing request.

        :param pkey: The public key to use.
        :type pkey: :py:class:`PKey`

        :return: ``None``
        r?N)rKZX509_REQ_set_pubkeyr�rvrU)rnrxrcrDrDrE�
set_pubkey�s	zX509Req.set_pubkeycCsDtjt�}tj|j�|_t|jtjk�tj	|jtj
�|_d|_|S)z�
        Get the public key of the certificate signing request.

        :return: The public key.
        :rtype: :py:class:`PKey`
        T)r�__new__rKZX509_REQ_get_pubkeyr�rvrUrRrVrWrury)rnrxrDrDrE�
get_pubkey�s
zX509Req.get_pubkeycCstj|j|�}t|dk�dS)z�
        Set the version subfield (RFC 2459, section 4.1.2.1) of the certificate
        request.

        :param int version: The version number.
        :return: ``None``
        r?N)rKZX509_REQ_set_versionr�rU)rn�versionrcrDrDrEr��szX509Req.set_versioncCstj|j�S)z�
        Get the version subfield (RFC 2459, section 4.1.2.1) of the certificate
        request.

        :return: The value of the version subfield.
        :rtype: :py:class:`int`
        )rKZX509_REQ_get_versionr�)rnrDrDrE�get_version�szX509Req.get_versioncCs2tjt�}tj|j�|_t|jtjk�||_	|S)a�
        Return the subject of this certificate signing request.

        This creates a new :class:`X509Name` that wraps the underlying subject
        name field on the certificate signing request. Modifying it will modify
        the underlying signing request, and will have the effect of modifying
        any other :class:`X509Name` that refers to this subject.

        :return: The subject of this certificate signing request.
        :rtype: :class:`X509Name`
        )
r"r�rKZX509_REQ_get_subject_namer�rsrUrRrV�_owner)rnrqrDrDrE�get_subject�s

zX509Req.get_subjectcCsptj�}t|tjk�tj|tj�}x,|D]$}t|t�s@t	d��tj
||j�q*Wtj|j
|�}t|dk�dS)z�
        Add extensions to the certificate signing request.

        :param extensions: The X.509 extensions to add.
        :type extensions: iterable of :py:class:`X509Extension`
        :return: ``None``
        z+One of the elements is not an X509Extensionr?N)rKZsk_X509_EXTENSION_new_nullrUrRrVrWZsk_X509_EXTENSION_freer]r#r`Zsk_X509_EXTENSION_pushr�ZX509_REQ_add_extensionsr�)rn�
extensions�stack�extr�rDrDrE�add_extensions�s

zX509Req.add_extensionscCsNg}tj|j�}x8ttj|��D]&}tjt�}tj||�|_|j	|�q W|S)z�
        Get X.509 extensions in the certificate signing request.

        :return: The X.509 extensions in this request.
        :rtype: :py:class:`list` of :py:class:`X509Extension` objects.

        .. versionadded:: 0.15
        )
rKZX509_REQ_get_extensionsr�r�Zsk_X509_EXTENSION_numr#r�Zsk_X509_EXTENSION_valuer�rp)rnZextsZnative_exts_objr�r�rDrDrE�get_extensions�s	
zX509Req.get_extensionscCs^|jrtd��|jstd��tjt|��}|tjkr<td��tj|j	|j
|�}t|dk�dS)ad
        Sign the certificate signing request with this key and digest type.

        :param pkey: The key pair to sign with.
        :type pkey: :py:class:`PKey`
        :param digest: The name of the message digest to use for the signature,
            e.g. :py:data:`b"sha256"`.
        :type digest: :py:class:`bytes`
        :return: ``None``
        zKey has only public partzKey is uninitializedzNo such digest methodrN)ryr`rwrK�EVP_get_digestbynamer�rRrVZ
X509_REQ_signr�rvrU)rnrx�digest�
digest_obj�sign_resultrDrDrEr7s
zX509Req.signcCs4t|t�std��tj|j|j�}|dkr0t�|S)a@
        Verifies the signature on this certificate signing request.

        :param PKey key: A public key.

        :return: ``True`` if the signature is correct.
        :rtype: bool

        :raises OpenSSL.crypto.Error: If the signature is invalid or there is a
            problem verifying the signature.
        zpkey must be a PKey instancer)r]rr_rKZX509_REQ_verifyr�rvr�)rnrxr�rDrDrEr8s
zX509Req.verifyN)r@rArBrCror�r�r�r�r�r�r�r�r�r�r7r8rDrDrDrEr$js
z4X509ReqType has been deprecated, use X509Req insteadc@seZdZdZdd�Zedd��Zdd�Zedd	��Zd
d�Z	dd
�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zdd�Zdd�Zd d!�Zd"d#�Zd$d%�Zd&d'�Zd(d)�Zd*d+�Zd,d-�Zd.d/�Zd0d1�Zd2d3�Zd4d5�Zd6d7�Zd8d9�Z d:d;�Z!d<d=�Z"d>d?�Z#d@dA�Z$dBS)Cr%z
    An X.509 certificate.
    cCs:tj�}t|tjk�tj|tj�|_t�|_	t�|_
dS)N)rKZX509_newrUrRrVrW�	X509_freer�rl�_issuer_invalidator�_subject_invalidator)rnr
rDrDrEro<s
z
X509.__init__cCs.|j|�}tj|tj�|_t�|_t�|_|S)N)	r�rRrWrKr�r�rlr�r�)r{r
�certrDrDrE�_from_raw_x509_ptrDs

zX509._from_raw_x509_ptrcCsddlm}t�}|||j�S)z�
        Export as a ``cryptography`` certificate.

        :rtype: ``cryptography.x509.Certificate``

        .. versionadded:: 17.1.0
        r)�_Certificate)r�r�rGr�)rnr�rFrDrDrEr�LszX509.to_cryptographycCs&t|tj�std��|�}|j|_|S)z�
        Construct based on a ``cryptography`` *crypto_cert*.

        :param crypto_key: A ``cryptography`` X.509 certificate.
        :type crypto_key: ``cryptography.x509.Certificate``

        :rtype: X509

        .. versionadded:: 17.1.0
        zMust be a certificate)r]r
ZCertificater_r�)r{Zcrypto_certr�rDrDrEr�Xs
zX509.from_cryptographycCs$t|t�std��tj|j|�dS)a	
        Set the version number of the certificate. Note that the
        version value is zero-based, eg. a value of 0 is V1.

        :param version: The version number of the certificate.
        :type version: :py:class:`int`

        :return: ``None``
        zversion must be an integerN)r]r}r_rKZX509_set_versionr�)rnr�rDrDrEr�ks

zX509.set_versioncCstj|j�S)z�
        Return the version number of the certificate.

        :return: The version number of the certificate.
        :rtype: :py:class:`int`
        )rKZX509_get_versionr�)rnrDrDrEr�zszX509.get_versioncCsFtjt�}tj|j�|_|jtjkr*t�tj	|jtj
�|_d|_|S)z{
        Get the public key of the certificate.

        :return: The public key.
        :rtype: :py:class:`PKey`
        T)rr�rK�X509_get_pubkeyr�rvrRrVr�rWrury)rnrxrDrDrEr��s
zX509.get_pubkeycCs2t|t�std��tj|j|j�}t|dk�dS)z�
        Set the public key of the certificate.

        :param pkey: The public key.
        :type pkey: :py:class:`PKey`

        :return: :py:data:`None`
        zpkey must be a PKey instancer?N)r]rr_rKZX509_set_pubkeyr�rvrU)rnrxrcrDrDrEr��s	
zX509.set_pubkeycCspt|t�std��|jr td��|js.td��tjt|��}|t	j
krNtd��tj|j|j
|�}t|dk�dS)a
        Sign the certificate with this key and digest type.

        :param pkey: The key to sign with.
        :type pkey: :py:class:`PKey`

        :param digest: The name of the message digest to use.
        :type digest: :py:class:`bytes`

        :return: :py:data:`None`
        zpkey must be a PKey instancezKey only has public partzKey is uninitializedzNo such digest methodrN)r]rr_ryr`rwrKr�r�rRrVZ	X509_signr�rvrU)rnrxr�Zevp_mdr�rDrDrEr7�s

z	X509.signcCs:tj|j�}tj|j�}|tjkr*td��tjtj	|��S)z�
        Return the signature algorithm used in the certificate.

        :return: The name of the algorithm.
        :rtype: :py:class:`bytes`

        :raises ValueError: If the signature algorithm is undefined.

        .. versionadded:: 0.13
        zUndefined signature algorithm)
rKZX509_get0_tbs_sigalgr�r��	algorithmr�r`rRrhZ
OBJ_nid2ln)rnZalgorr�rDrDrE�get_signature_algorithm�s

zX509.get_signature_algorithmcCs�tjt|��}|tjkr td��tjdtj�}tjdd�}t|�|d<tj	|j
|||�}t|dk�djdd�tj
||d�D��S)	a7
        Return the digest of the X509 object.

        :param digest_name: The name of the digest algorithm to use.
        :type digest_name: :py:class:`bytes`

        :return: The digest of the object, formatted as
            :py:const:`b":"`-delimited hex pairs.
        :rtype: :py:class:`bytes`
        zNo such digest methodzunsigned char[]zunsigned int[]r?r�:cSsg|]}t|�j��qSrD)r�upper)r�ZchrDrDrE�
<listcomp>�szX509.digest.<locals>.<listcomp>)rKr�r�rRrVr`rSZEVP_MAX_MD_SIZErTZX509_digestr�rUr�rX)rnZdigest_namer�r[r�Z
digest_resultrDrDrEr��s
zX509.digestcCstj|j�S)z�
        Return the hash of the X509 subject.

        :return: The hash of the subject.
        :rtype: :py:class:`bytes`
        )rKZX509_subject_name_hashr�)rnrDrDrE�subject_name_hash�szX509.subject_name_hashcCs�t|t�std��t|�dd�}t|t�s6|jd�}tjd�}tj	||�}|dtj
krztjtj|j
�|�}|r�t�nXtj|dtj
�}tj|d�|tj
kr�t�tj|tj�}tj|j
|�}t|dk�dS)z�
        Set the serial number of the certificate.

        :param serial: The new serial number.
        :type serial: :py:class:`int`

        :return: :py:data`None`
        zserial must be an integerr=Nr�zBIGNUM**rr?)r]�_integer_typesr_�hexr^r�rRrSrK�	BN_hex2bnrVZASN1_INTEGER_set�X509_get_serialNumberr�r��BN_to_ASN1_INTEGERrrW�ASN1_INTEGER_freeZX509_set_serialNumberrU)rn�serial�
hex_serial�
bignum_serialZsmall_serialrc�asn1_serialrDrDrE�set_serial_number�s&	




zX509.set_serial_numbercCs`tj|j�}tj|tj�}z4tj|�}ztj|�}t|d�}|Stj	|�XWdtj
|�XdS)zx
        Return the serial number of this certificate.

        :return: The serial number.
        :rtype: int
        r>N)rKrr�ZASN1_INTEGER_to_BNrRrVZ	BN_bn2hexrhr}r�r)rnr
rrZhexstring_serialr
rDrDrE�get_serial_numbers


zX509.get_serial_numbercCs.t|t�std��tj|j�}tj||�dS)z�
        Adjust the time stamp on which the certificate stops being valid.

        :param int amount: The number of seconds by which to adjust the
            timestamp.
        :return: ``None``
        zamount must be an integerN)r]r}r_rK�X509_get_notAfterr��X509_gmtime_adj)rn�amountZnotAfterrDrDrE�gmtime_adj_notAfter-s
zX509.gmtime_adj_notAftercCs.t|t�std��tj|j�}tj||�dS)z�
        Adjust the timestamp on which the certificate starts being valid.

        :param amount: The number of seconds by which to adjust the timestamp.
        :return: ``None``
        zamount must be an integerN)r]r}r_rK�X509_get_notBeforer�r)rnrZ	notBeforerDrDrE�gmtime_adj_notBefore;s
zX509.gmtime_adj_notBeforecCs(t|j��}tjj|d�}|tjj�kS)z�
        Check whether the certificate has expired.

        :return: ``True`` if the certificate has expired, ``False`` otherwise.
        :rtype: bool
        z
%Y%m%d%H%M%SZ)r��get_notAfter�datetimeZstrptimeZutcnow)rnZtime_stringZ	not_afterrDrDrE�has_expiredHszX509.has_expiredcCst||j��S)N)rkr�)rn�whichrDrDrE�_get_boundary_timeTszX509._get_boundary_timecCs|jtj�S)a

        Get the timestamp at which the certificate starts being valid.

        The timestamp is formatted as an ASN.1 TIME::

            YYYYMMDDhhmmssZ

        :return: A timestamp string, or ``None`` if there is none.
        :rtype: bytes or NoneType
        )rrKr)rnrDrDrE�
get_notBeforeWszX509.get_notBeforecCst||j�|�S)N)rdr�)rnrrbrDrDrE�_set_boundary_timedszX509._set_boundary_timecCs|jtj|�S)z�
        Set the timestamp at which the certificate starts being valid.

        The timestamp is formatted as an ASN.1 TIME::

            YYYYMMDDhhmmssZ

        :param bytes when: A timestamp string.
        :return: ``None``
        )rrKr)rnrbrDrDrE�
set_notBeforegszX509.set_notBeforecCs|jtj�S)a	
        Get the timestamp at which the certificate stops being valid.

        The timestamp is formatted as an ASN.1 TIME::

            YYYYMMDDhhmmssZ

        :return: A timestamp string, or ``None`` if there is none.
        :rtype: bytes or NoneType
        )rrKr)rnrDrDrErtszX509.get_notAftercCs|jtj|�S)z�
        Set the timestamp at which the certificate stops being valid.

        The timestamp is formatted as an ASN.1 TIME::

            YYYYMMDDhhmmssZ

        :param bytes when: A timestamp string.
        :return: ``None``
        )rrKr)rnrbrDrDrE�set_notAfter�szX509.set_notAftercCs0tjt�}||j�|_t|jtjk�||_|S)N)r"r�r�rsrUrRrVr�)rnrrqrDrDrE�	_get_name�s

zX509._get_namecCs0t|t�std��||j|j�}t|dk�dS)Nzname must be an X509Namer?)r]r"r_r�rsrU)rnrrqrcrDrDrE�	_set_name�s
zX509._set_namecCs|jtj�}|jj|�|S)a�
        Return the issuer of this certificate.

        This creates a new :class:`X509Name` that wraps the underlying issuer
        name field on the certificate. Modifying it will modify the underlying
        certificate, and will have the effect of modifying any other
        :class:`X509Name` that refers to this issuer.

        :return: The issuer of this certificate.
        :rtype: :class:`X509Name`
        )rrKZX509_get_issuer_namer�rr)rnrqrDrDrE�
get_issuer�szX509.get_issuercCs|jtj|�|jj�dS)z�
        Set the issuer of this certificate.

        :param issuer: The issuer.
        :type issuer: :py:class:`X509Name`

        :return: ``None``
        N)r rKZX509_set_issuer_namer�rt)rnr�rDrDrE�
set_issuer�s	zX509.set_issuercCs|jtj�}|jj|�|S)a�
        Return the subject of this certificate.

        This creates a new :class:`X509Name` that wraps the underlying subject
        name field on the certificate. Modifying it will modify the underlying
        certificate, and will have the effect of modifying any other
        :class:`X509Name` that refers to this subject.

        :return: The subject of this certificate.
        :rtype: :class:`X509Name`
        )rrK�X509_get_subject_namer�rr)rnrqrDrDrEr��szX509.get_subjectcCs|jtj|�|jj�dS)z�
        Set the subject of this certificate.

        :param subject: The subject.
        :type subject: :py:class:`X509Name`

        :return: ``None``
        N)r rKZX509_set_subject_namer�rt)rnr�rDrDrE�set_subject�s	zX509.set_subjectcCstj|j�S)z�
        Get the number of extensions on this certificate.

        :return: The number of extensions.
        :rtype: :py:class:`int`

        .. versionadded:: 0.12
        )rKZX509_get_ext_countr�)rnrDrDrE�get_extension_count�s	zX509.get_extension_countcCs@x:|D]2}t|t�std��tj|j|jd�}|st�qWdS)z�
        Add extensions to the certificate.

        :param extensions: The extensions to add.
        :type extensions: An iterable of :py:class:`X509Extension` objects.
        :return: ``None``
        z+One of the elements is not an X509Extensionr?Nr�)r]r#r`rKZX509_add_extr�r�r�)rnr�r�r�rDrDrEr��s

zX509.add_extensionscCsNtjt�}tj|j|�|_|jtjkr.td��tj	|j�}tj
|tj�|_|S)a�
        Get a specific extension of the certificate by index.

        Extensions on a certificate are kept in order. The index
        parameter selects which extension will be returned.

        :param int index: The index of the extension to retrieve.
        :return: The extension at the specified index.
        :rtype: :py:class:`X509Extension`
        :raises IndexError: If the extension index was out of bounds.

        .. versionadded:: 0.12
        zextension index out of bounds)r#r�rKZX509_get_extr�r�rRrV�
IndexErrorZX509_EXTENSION_duprWr�)rn�indexr�r�rDrDrE�
get_extension�s
zX509.get_extensionN)%r@rArBrCror�r�r�r�r�r�r�r�r7r�r�rrrrrrrrrrrrrr r!r"r�r$r%r�r(rDrDrDrEr%8sB		'




z.X509Type has been deprecated, use X509 insteadc@sReZdZdZejZejZej	Z
ejZej
ZejZejZejZejZejZejZdS)r&a
    Flags for X509 verification, used to change the behavior of
    :class:`X509Store`.

    See `OpenSSL Verification Flags`_ for details.

    .. _OpenSSL Verification Flags:
        https://www.openssl.org/docs/manmaster/man3/X509_VERIFY_PARAM_set_flags.html
    N)r@rArBrCrKZX509_V_FLAG_CRL_CHECKZ	CRL_CHECKZX509_V_FLAG_CRL_CHECK_ALLZ
CRL_CHECK_ALLZX509_V_FLAG_IGNORE_CRITICALZIGNORE_CRITICALZX509_V_FLAG_X509_STRICTZX509_STRICTZX509_V_FLAG_ALLOW_PROXY_CERTSZALLOW_PROXY_CERTSZX509_V_FLAG_POLICY_CHECKZPOLICY_CHECKZX509_V_FLAG_EXPLICIT_POLICYZEXPLICIT_POLICYZX509_V_FLAG_INHIBIT_MAPZINHIBIT_MAPZX509_V_FLAG_NOTIFY_POLICYZ
NOTIFY_POLICYZX509_V_FLAG_CHECK_SS_SIGNATUREZCHECK_SS_SIGNATUREZX509_V_FLAG_CB_ISSUER_CHECKZCB_ISSUER_CHECKrDrDrDrEr&s	c@s8eZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�ZdS)
r'a�
    An X.509 store.

    An X.509 store is used to describe a context in which to verify a
    certificate. A description of a context may include a set of certificates
    to trust, a set of certificate revocation lists, verification flags and
    more.

    An X.509 store, being only a description, cannot be used by itself to
    verify a certificate. To carry out the actual verification process, see
    :class:`X509StoreContext`.
    cCstj�}tj|tj�|_dS)N)rKZX509_STORE_newrRrWZX509_STORE_free�_store)rn�storerDrDrEro6szX509Store.__init__cCsPt|t�st��tj|j|j�dkrLtj�}tj|�}t	|tj
k�tj�dS)a�
        Adds a trusted certificate to this store.

        Adding a certificate with this method adds this certificate as a
        *trusted* certificate.

        :param X509 cert: The certificate to add to this store.

        :raises TypeError: If the certificate is not an :class:`X509`.

        :raises OpenSSL.crypto.Error: If OpenSSL was unhappy with your
            certificate.

        :return: ``None`` if the certificate was added successfully.
        rN)r]r%r_rKZX509_STORE_add_certr)r�ZERR_peek_errorZERR_GET_REASONrUZ!X509_R_CERT_ALREADY_IN_HASH_TABLEZERR_clear_error)rnr��codeZ
err_reasonrDrDrE�add_cert:s

zX509Store.add_certcCsttj|j|j�dk�dS)a�
        Add a certificate revocation list to this store.

        The certificate revocation lists added to a store will only be used if
        the associated flags are configured to check certificate revocation
        lists.

        .. versionadded:: 16.1.0

        :param CRL crl: The certificate revocation list to add to this store.
        :return: ``None`` if the certificate revocation list was added
            successfully.
        rN)rUrKZX509_STORE_add_crlr)�_crl)rn�crlrDrDrE�add_crlXszX509Store.add_crlcCsttj|j|�dk�dS)a�
        Set verification flags to this store.

        Verification flags can be combined by oring them together.

        .. note::

          Setting a verification flag sometimes requires clients to add
          additional information to the store, otherwise a suitable error will
          be raised.

          For example, in setting flags to enable CRL checking a
          suitable CRL must be added to the store otherwise an error will be
          raised.

        .. versionadded:: 16.1.0

        :param int flags: The verification flags to set on this store.
            See :class:`X509StoreFlags` for available constants.
        :return: ``None`` if the verification flags were successfully set.
        rN)rUrKZX509_STORE_set_flagsr))rn�flagsrDrDrE�	set_flagshszX509Store.set_flagscCsFtj�}tj|tj�}tj|t|jd���ttj	|j
|�dk�dS)a�
        Set the time against which the certificates are verified.

        Normally the current time is used.

        .. note::

          For example, you can determine if a certificate was valid at a given
          time.

        .. versionadded:: 17.0.0

        :param datetime vfy_time: The verification time to set on this store.
        :return: ``None`` if the verification time was successfully set.
        z%srN)rKZX509_VERIFY_PARAM_newrRrWZX509_VERIFY_PARAM_freeZX509_VERIFY_PARAM_set_timer}ZstrftimerUZX509_STORE_set1_paramr))rnZvfy_timeZparamrDrDrE�set_time�szX509Store.set_timeN)	r@rArBrCror,r/r1r2rDrDrDrEr'(sz8X509StoreType has been deprecated, use X509Store insteadcs eZdZdZ�fdd�Z�ZS)r(z�
    An exception raised when an error occurred while verifying a certificate
    using `OpenSSL.X509StoreContext.verify_certificate`.

    :ivar certificate: The certificate which caused verificate failure.
    :type certificate: :class:`X509`
    cstt|�j|�||_dS)N)r�r(ro�certificate)rn�messager3)r�rDrEro�szX509StoreContextError.__init__)r@rArBrCror�rDrD)r�rEr(�sc@s@eZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dS)r)a�
    An X.509 store context.

    An X.509 store context is used to carry out the actual verification process
    of a certificate in a described context. For describing such a context, see
    :class:`X509Store`.

    :ivar _store_ctx: The underlying X509_STORE_CTX structure used by this
        instance.  It is dynamically allocated and automatically garbage
        collected.
    :ivar _store: See the ``store`` ``__init__`` parameter.
    :ivar _cert: See the ``certificate`` ``__init__`` parameter.
    :param X509Store store: The certificates which will be trusted for the
        purposes of any verifications.
    :param X509 certificate: The certificate to be verified.
    cCs0tj�}tj|tj�|_||_||_|j�dS)N)	rKZX509_STORE_CTX_newrRrWZX509_STORE_CTX_free�
_store_ctxr)�_cert�_init)rnr*r3Z	store_ctxrDrDrEro�s
zX509StoreContext.__init__cCs.tj|j|jj|jjtj�}|dkr*t�dS)z�
        Set up the store context for a subsequent verification operation.

        Calling this method more than once without first calling
        :meth:`_cleanup` will leak memory.
        rN)	rKZX509_STORE_CTX_initr5r)r6r�rRrVr�)rn�retrDrDrEr7�szX509StoreContext._initcCstj|j�dS)z�
        Internally cleans up the store context.

        The store context can then be reused with a new call to :meth:`_init`.
        N)rKZX509_STORE_CTX_cleanupr5)rnrDrDrE�_cleanup�szX509StoreContext._cleanupcCs\tj|j�tj|j�ttjtjtj|j����g}tj|j�}tj	|�}t
j|�}t||�S)z�
        Convert an OpenSSL native context error failure into a Python
        exception.

        When a call to native OpenSSL X509_verify_cert fails, additional
        information about the failure can be obtained from the store context.
        )
rKZX509_STORE_CTX_get_errorr5ZX509_STORE_CTX_get_error_depthr�rRrhZX509_verify_cert_error_stringZX509_STORE_CTX_get_current_certZX509_dupr%r�r()rn�errorsr�r6�pycertrDrDrE�_exception_from_context�s	




z(X509StoreContext._exception_from_contextcCs
||_dS)z�
        Set the context's X.509 store.

        .. versionadded:: 0.15

        :param X509Store store: The store description which will be used for
            the purposes of any *future* verifications.
        N)r))rnr*rDrDrE�	set_store�s	zX509StoreContext.set_storecCs8|j�|j�tj|j�}|j�|dkr4|j��dS)a"
        Verify a certificate in a context.

        .. versionadded:: 0.15

        :raises X509StoreContextError: If an error occurred when validating a
          certificate in the context. Sets ``certificate`` attribute to
          indicate which certificate caused the error.
        rN)r9r7rKZX509_verify_certr5r<)rnr8rDrDrE�verify_certificate�sz#X509StoreContext.verify_certificateN)
r@rArBrCror7r9r<r=r>rDrDrDrEr)�s

cCsvt|t�r|jd�}t|�}|tkr<tj|tjtjtj�}n |t	krTtj
|tj�}ntd��|tjkrlt�t
j|�S)a
    Load a certificate (X509) from the string *buffer* encoded with the
    type *type*.

    :param type: The file type (one of FILETYPE_PEM, FILETYPE_ASN1)

    :param bytes buffer: The buffer the certificate is stored in

    :return: The X509 object
    r�z3type argument must be FILETYPE_PEM or FILETYPE_ASN1)r]r�r�rZrrKZPEM_read_bio_X509rRrVrZd2i_X509_bior`r�r%r�)r�rXrMr
rDrDrEr*s


cCsbt�}|tkrtj||j�}n<|tkr6tj||j�}n$|tkrRtj||jdd�}nt	d��t
|�S)a
    Dump the certificate *cert* into a buffer string encoded with the type
    *type*.

    :param type: The file type (one of FILETYPE_PEM, FILETYPE_ASN1, or
        FILETYPE_TEXT)
    :param cert: The certificate to dump
    :return: The buffer with the dumped certificate in
    rzCtype argument must be FILETYPE_PEM, FILETYPE_ASN1, or FILETYPE_TEXT)rZrrKZPEM_write_bio_X509r�rZi2d_X509_biorZ
X509_print_exr`r\)r�r�rM�result_coderDrDrEr+2s
cCsPt�}|tkrtj}n|tkr&tj}ntd��|||j�}|dkrHt�t	|�S)z�
    Dump a public key to a buffer.

    :param type: The file type (one of :data:`FILETYPE_PEM` or
        :data:`FILETYPE_ASN1`).
    :param PKey pkey: The public key to dump
    :return: The buffer with the dumped key in it.
    :rtype: bytes
    z3type argument must be FILETYPE_PEM or FILETYPE_ASN1r?)
rZrrKZPEM_write_bio_PUBKEYrZi2d_PUBKEY_bior`rvr�r\)r�rxrMZ	write_bior?rDrDrEr,Ms
c	Cst�}t|t�std��|dk	rR|dkr0td��tjt|��}|tjkrXt	d��ntj}t
||�}|tkr�tj||j
|tjd|j|j�}|j�nh|tkr�tj||j
�}nP|tkr�tj|j
�tjkr�td��tjtj|j
�tj�}tj||d�}nt	d��t|dk�t|�S)a�
    Dump the private key *pkey* into a buffer string encoded with the type
    *type*.  Optionally (if *type* is :const:`FILETYPE_PEM`) encrypting it
    using *cipher* and *passphrase*.

    :param type: The file type (one of :const:`FILETYPE_PEM`,
        :const:`FILETYPE_ASN1`, or :const:`FILETYPE_TEXT`)
    :param PKey pkey: The PKey to dump
    :param cipher: (optional) if encrypted PEM format, the cipher to use
    :param passphrase: (optional) if encrypted PEM format, this can be either
        the passphrase to use, or a callback for providing the passphrase.

    :return: The buffer with the dumped key in
    :rtype: bytes
    zpkey must be a PKeyNzDif a value is given for cipher one must also be given for passphrasezInvalid cipher namerz-Only RSA keys are supported for FILETYPE_TEXTzCtype argument must be FILETYPE_PEM, FILETYPE_ASN1, or FILETYPE_TEXT)rZr]rr_rKZEVP_get_cipherbynamer�rRrVr`�_PassphraseHelperrZPEM_write_bio_PrivateKeyrv�callback�
callback_args�raise_if_problemrZi2d_PrivateKey_biorr�r�rWr�r�Z	RSA_printrUr\)	r�rxZcipher�
passphraserMZ
cipher_obj�helperr?rrDrDrEr-fs<





c@sjeZdZdZdddddddgZd	d
�Zdd�Zd
d�Zdd�Zdd�Z	dd�Z
dd�Zdd�Zdd�Z
dS)r.z#
    A certificate revocation.
    sunspecifieds
keyCompromisesCACompromisesaffiliationChangeds
supersededscessationOfOperationscertificateHoldcCstj�}tj|tj�|_dS)N)rKZX509_REVOKED_newrRrW�X509_REVOKED_free�_revoked)rn�revokedrDrDrEro�szRevoked.__init__cCsftjtj�tj�}tjd�}||d<tj||�}|s<td��tjtj|tj	�tj
�}tj|j|�dS)z�
        Set the serial number.

        The serial number is formatted as a hexadecimal number encoded in
        ASCII.

        :param bytes hex_str: The new serial number.

        :return: ``None``
        zBIGNUM**rzbad hex stringN)
rRrWrKr~rrSrr`rrVr	ZX509_REVOKED_set_serialNumberrG)rnZhex_strrZ
bignum_ptrZ	bn_resultr
rDrDrE�
set_serial�s
zRevoked.set_serialcCs@t�}tj|j�}t|tjk�tj||�}t|dk�t|�S)z�
        Get the serial number.

        The serial number is formatted as a hexadecimal number encoded in
        ASCII.

        :return: The serial number.
        :rtype: bytes
        r)	rZrKZX509_REVOKED_get0_serialNumberrGrUrRrVZi2a_ASN1_INTEGERr\)rnrMZasn1_intr�rDrDrE�
get_serial�s
zRevoked.get_serialcCs`xZttj|j��D]F}tj|j|�}tj|�}tj|�tjkrtj|�tj	|j|�PqWdS)N)
r�rK�X509_REVOKED_get_ext_countrG�X509_REVOKED_get_extr�r��NID_crl_reasonr�ZX509_REVOKED_delete_ext)rnr�r�r�rDrDrE�_delete_reason�s

zRevoked._delete_reasoncCs�|dkr|j�n�t|t�s&td��n�|j�jdd�}dd�|jD�j|�}tj	�}t
|tjk�tj
|tj�}tj||�}t
|tjk�|j�tj|jtj|dd�}t
|dk�dS)	a�
        Set the reason of this revocation.

        If :data:`reason` is ``None``, delete the reason instead.

        :param reason: The reason string.
        :type reason: :class:`bytes` or :class:`NoneType`

        :return: ``None``

        .. seealso::

            :meth:`all_reasons`, which gives you a list of all supported
            reasons which you might pass to this method.
        Nz$reason must be None or a byte string� �cSsg|]}|j��qSrD)�lower)r��rrDrDrErsz&Revoked.set_reason.<locals>.<listcomp>rr?)rNr]r^r_rQ�replace�_crl_reasonsr'rKZASN1_ENUMERATED_newrUrRrVrWZASN1_ENUMERATED_freeZASN1_ENUMERATED_setZX509_REVOKED_add1_ext_i2drGrM)rn�reasonZreason_codeZnew_reason_extrcr�rDrDrE�
set_reason�s


zRevoked.set_reasoncCs�x�ttj|j��D]l}tj|j|�}tj|�}tj|�tjkrt�}tj	||dd�}|svtj
|tj|��}t|dk�t
|�SqWdS)a 
        Get the reason of this revocation.

        :return: The reason, or ``None`` if there is none.
        :rtype: bytes or NoneType

        .. seealso::

            :meth:`all_reasons`, which gives you a list of all supported
            reasons this method might return.
        rN)r�rKrKrGrLr�r�rMrZr�ZM_ASN1_OCTET_STRING_printr�rUr\)rnr�r�r�rMr�rDrDrE�
get_reasons
zRevoked.get_reasoncCs|jdd�S)a
        Return a list of all the supported reason strings.

        This list is a copy; modifying it does not change the supported reason
        strings.

        :return: A list of reason strings.
        :rtype: :class:`list` of :class:`bytes`
        N)rT)rnrDrDrE�all_reasons)s
zRevoked.all_reasonscCstj|j�}t||�S)z�
        Set the revocation timestamp.

        :param bytes when: The timestamp of the revocation,
            as ASN.1 TIME.
        :return: ``None``
        )rK� X509_REVOKED_get0_revocationDaterGrd)rnrb�dtrDrDrE�set_rev_date5szRevoked.set_rev_datecCstj|j�}t|�S)z�
        Get the revocation timestamp.

        :return: The timestamp of the revocation, as ASN.1 TIME.
        :rtype: bytes
        )rKrYrGrk)rnrZrDrDrE�get_rev_date@szRevoked.get_rev_dateN)r@rArBrCrTrorIrJrNrVrWrXr[r\rDrDrDrEr.�s"	$c@s|eZdZdZdd�Zdd�Zedd��Zdd	�Zd
d�Z	dd
�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zedefdd�ZdS)r/z(
    A certificate revocation list.
    cCstj�}tj|tj�|_dS)N)rKZX509_CRL_newrRrW�
X509_CRL_freer-)rnr.rDrDrEroPszCRL.__init__cCsddlm}t�}|||j�S)z�
        Export as a ``cryptography`` CRL.

        :rtype: ``cryptography.x509.CertificateRevocationList``

        .. versionadded:: 17.1.0
        r)�_CertificateRevocationList)r�r^rGr-)rnr^rFrDrDrEr�TszCRL.to_cryptographycCs&t|tj�std��|�}|j|_|S)a
        Construct based on a ``cryptography`` *crypto_crl*.

        :param crypto_crl: A ``cryptography`` certificate revocation list
        :type crypto_crl: ``cryptography.x509.CertificateRevocationList``

        :rtype: CRL

        .. versionadded:: 17.1.0
        z%Must be a certificate revocation list)r]r
ZCertificateRevocationListr_Z	_x509_crlr-)r{Z
crypto_crlr.rDrDrEr�bs
zCRL.from_cryptographycCsrg}tj|j�}xPttj|��D]>}tj||�}tj|�}tjt�}t	j
|tj�|_|j
|�q W|rnt|�SdS)aA
        Return the revocations in this certificate revocation list.

        These revocations will be provided by value, not by reference.
        That means it's okay to mutate them: it won't affect this CRL.

        :return: The revocations in this CRL.
        :rtype: :class:`tuple` of :class:`Revocation`
        N)rKZX509_CRL_get_REVOKEDr-r�Zsk_X509_REVOKED_numZsk_X509_REVOKED_value�Cryptography_X509_REVOKED_dupr.r�rRrWrFrGrp�tuple)rn�resultsZ
revoked_stackr�rHZrevoked_copyZpyrevrDrDrE�get_revokedus


zCRL.get_revokedcCs8tj|j�}t|tjk�tj|j|�}t|dk�dS)a9
        Add a revoked (by value not reference) to the CRL structure

        This revocation will be added by value, not by reference. That
        means it's okay to mutate it after adding: it won't affect
        this CRL.

        :param Revoked revoked: The new revocation.
        :return: ``None``
        rN)rKr_rGrUrRrVZX509_CRL_add0_revokedr-)rnrH�copyr�rDrDrE�add_revoked�szCRL.add_revokedcCsBtjtj|j��}t|tjk�tj|tj�}t	j
t	�}||_|S)zc
        Get the CRL's issuer.

        .. versionadded:: 16.1.0

        :rtype: X509Name
        )rKr�ZX509_CRL_get_issuerr-rUrRrVrWr�r"r�rs)rnZ_issuerr�rDrDrEr!�s
zCRL.get_issuercCsttj|j|�dk�dS)z�
        Set the CRL version.

        .. versionadded:: 16.1.0

        :param int version: The version of the CRL.
        :return: ``None``
        rN)rUrKZX509_CRL_set_versionr-)rnr�rDrDrEr��s	zCRL.set_versioncCst||j�|�S)N)rdr-)rnrrbrDrDrEr�szCRL._set_boundary_timecCs|jtj|�S)z�
        Set when the CRL was last updated.

        The timestamp is formatted as an ASN.1 TIME::

            YYYYMMDDhhmmssZ

        .. versionadded:: 16.1.0

        :param bytes when: A timestamp string.
        :return: ``None``
        )rrKZX509_CRL_get_lastUpdate)rnrbrDrDrE�set_lastUpdate�s
zCRL.set_lastUpdatecCs|jtj|�S)z�
        Set when the CRL will next be udpated.

        The timestamp is formatted as an ASN.1 TIME::

            YYYYMMDDhhmmssZ

        .. versionadded:: 16.1.0

        :param bytes when: A timestamp string.
        :return: ``None``
        )rrKZX509_CRL_get_nextUpdate)rnrbrDrDrE�set_nextUpdate�s
zCRL.set_nextUpdatecCs\tj|�}t|tjk�tj|jtj|j��tj	|j�tj
|j|j|�}t|dk�dS)a;
        Sign the CRL.

        Signing a CRL enables clients to associate the CRL itself with an
        issuer. Before a CRL is meaningful to other OpenSSL functions, it must
        be signed by an issuer.

        This method implicitly sets the issuer's name based on the issuer
        certificate and private key used to sign the CRL.

        .. versionadded:: 16.1.0

        :param X509 issuer_cert: The issuer's certificate.
        :param PKey issuer_key: The issuer's private key.
        :param bytes digest: The digest method to sign the CRL with.
        rN)rKr�rUrRrV�X509_CRL_set_issuer_namer-r#r�Z
X509_CRL_sort�
X509_CRL_signrv)rnr�Z
issuer_keyr�r�r�rDrDrEr7�s
zCRL.sign�dc
Cst|t�std��t|t�s$td��t|t�s6td��|tkrFtd��tj|�}|tj	krbt
d��tjtj��}t
|tj	k�tj�}t
|tj	k�tj|d�tj|j|�tj||ddd�tj|j|�tj|jtj|j��tj|j|j|�}	|	�st�t||�S)	a�
        Export the CRL as a string.

        :param X509 cert: The certificate used to sign the CRL.
        :param PKey key: The key used to sign the CRL.
        :param int type: The export format, either :data:`FILETYPE_PEM`,
            :data:`FILETYPE_ASN1`, or :data:`FILETYPE_TEXT`.
        :param int days: The number of days until the next update of this CRL.
        :param bytes digest: The name of the message digest to use (eg
            ``b"sha2566"``).
        :rtype: bytes
        zcert must be an X509 instancezkey must be a PKey instanceztype must be an integerzdigest must be providedzNo such digest methodr��<)r]r%r_rr}�_UNSPECIFIEDrKr�rRrVr`rPrQrUZ
ASN1_TIME_newrZX509_CRL_set_lastUpdater-ZX509_CRL_set_nextUpdatergr#r�rhrvr�r9)
rnr�r�r�Zdaysr�r�rMZsometimer�rDrDrE�export�s2




z
CRL.exportN)r@rArBrCror�r�r�rbrdr!r�rrerfr7rrlrmrDrDrDrEr/Ksz,CRLType has been deprecated, use CRL insteadc@s4eZdZdd�Zdd�Zdd�Zdd�Zd	d
�ZdS)r0cCsttj|j��S)zm
        Check if this NID_pkcs7_signed object

        :return: True if the PKCS7 is of type signed
        )�boolrKZPKCS7_type_is_signed�_pkcs7)rnrDrDrE�type_is_signed-	szPKCS7.type_is_signedcCsttj|j��S)zt
        Check if this NID_pkcs7_enveloped object

        :returns: True if the PKCS7 is of type enveloped
        )rnrKZPKCS7_type_is_envelopedro)rnrDrDrE�type_is_enveloped5	szPKCS7.type_is_envelopedcCsttj|j��S)z�
        Check if this NID_pkcs7_signedAndEnveloped object

        :returns: True if the PKCS7 is of type signedAndEnveloped
        )rnrKZ PKCS7_type_is_signedAndEnvelopedro)rnrDrDrE�type_is_signedAndEnveloped=	sz PKCS7.type_is_signedAndEnvelopedcCsttj|j��S)zi
        Check if this NID_pkcs7_data object

        :return: True if the PKCS7 is of type data
        )rnrKZPKCS7_type_is_dataro)rnrDrDrE�type_is_dataE	szPKCS7.type_is_datacCs"tj|jj�}tj|�}tj|�S)zk
        Returns the type name of the PKCS7 structure

        :return: A string with the typename
        )rKr�ror�r�rRrh)rnr�Zstring_typerDrDrE�
get_type_nameM	s
zPKCS7.get_type_nameN)r@rArBrprqrrrsrtrDrDrDrEr0,	s
z0PKCS7Type has been deprecated, use PKCS7 insteadc@sbeZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dd�Z
dd�Zdd�Zddd�Z
dS)r1z
    A PKCS #12 archive.
    cCsd|_d|_d|_d|_dS)N)rvr6�_cacerts�
_friendlyname)rnrDrDrErod	szPKCS12.__init__cCs|jS)z�
        Get the certificate in the PKCS #12 structure.

        :return: The certificate, or :py:const:`None` if there is none.
        :rtype: :py:class:`X509` or :py:const:`None`
        )r6)rnrDrDrE�get_certificatej	szPKCS12.get_certificatecCst|t�std��||_dS)z�
        Set the certificate in the PKCS #12 structure.

        :param cert: The new certificate, or :py:const:`None` to unset it.
        :type cert: :py:class:`X509` or :py:const:`None`

        :return: ``None``
        zcert must be an X509 instanceN)r]r%r_r6)rnr�rDrDrE�set_certificates	s	
zPKCS12.set_certificatecCs|jS)z�
        Get the private key in the PKCS #12 structure.

        :return: The private key, or :py:const:`None` if there is none.
        :rtype: :py:class:`PKey`
        )rv)rnrDrDrE�get_privatekey�	szPKCS12.get_privatekeycCst|t�std��||_dS)z�
        Set the certificate portion of the PKCS #12 structure.

        :param pkey: The new private key, or :py:const:`None` to unset it.
        :type pkey: :py:class:`PKey` or :py:const:`None`

        :return: ``None``
        zpkey must be a PKey instanceN)r]rr_rv)rnrxrDrDrE�set_privatekey�	s	
zPKCS12.set_privatekeycCs|jdk	rt|j�SdS)a
        Get the CA certificates in the PKCS #12 structure.

        :return: A tuple with the CA certificates in the chain, or
            :py:const:`None` if there are none.
        :rtype: :py:class:`tuple` of :py:class:`X509` or :py:const:`None`
        N)rur`)rnrDrDrE�get_ca_certificates�	s
zPKCS12.get_ca_certificatescCsB|dkrd|_n.t|�}x|D]}t|t�std��qW||_dS)a
        Replace or set the CA certificates within the PKCS12 object.

        :param cacerts: The new CA certificates, or :py:const:`None` to unset
            them.
        :type cacerts: An iterable of :py:class:`X509` or :py:const:`None`

        :return: ``None``
        Nz)iterable must only contain X509 instances)ru�listr]r%r_)rn�cacertsr�rDrDrE�set_ca_certificates�	s



zPKCS12.set_ca_certificatescCs2|dkrd|_nt|t�s(td|f��||_dS)z�
        Set the friendly name in the PKCS #12 structure.

        :param name: The new friendly name, or :py:const:`None` to unset.
        :type name: :py:class:`bytes` or :py:const:`None`

        :return: ``None``
        Nz+name must be a byte string or None (not %r))rvr]r^r_)rnrqrDrDrE�set_friendlyname�	s	
zPKCS12.set_friendlynamecCs|jS)z�
        Get the friendly name in the PKCS# 12 structure.

        :returns: The friendly name,  or :py:const:`None` if there is none.
        :rtype: :py:class:`bytes` or :py:const:`None`
        )rv)rnrDrDrE�get_friendlyname�	szPKCS12.get_friendlynameN�r?c
Cs�td|�}|jdkrtj}n4tj�}tj|tj�}x|jD]}tj||j	�q:W|dkr^tj}|j
}|dkrrtj}|jdkr�tj}n|jj}|jdkr�tj}n|jj	}tj
|||||tjtj||d�
}|tjkr�t�tj|tj�}t�}	tj|	|�t|	�S)a�
        Dump a PKCS12 object as a string.

        For more information, see the :c:func:`PKCS12_create` man page.

        :param passphrase: The passphrase used to encrypt the structure. Unlike
            some other passphrase arguments, this *must* be a string, not a
            callback.
        :type passphrase: :py:data:`bytes`

        :param iter: Number of times to repeat the encryption step.
        :type iter: :py:data:`int`

        :param maciter: Number of times to repeat the MAC step.
        :type maciter: :py:data:`int`

        :return: The string representation of the PKCS #12 structure.
        :rtype:
        rDNr)�_text_to_bytes_and_warnrurRrVrKZsk_X509_new_nullrW�sk_X509_freeZsk_X509_pushr�rvrvr6Z
PKCS12_createZ&NID_pbe_WithSHA1And3_Key_TripleDES_CBCr��PKCS12_freerZZi2d_PKCS12_bior\)
rnrD�iterZmaciterr}r��friendlynamerx�pkcs12rMrDrDrErm�	s:






z
PKCS12.export)Nr�r?)r@rArBrCrorwrxryrzr{r~rr�rmrDrDrDrEr1_	s	
	
	z2PKCS12Type has been deprecated, use PKCS12 insteadc@s@eZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dS)r2z!
    A Netscape SPKI object.
    cCstj�}tj|tj�|_dS)N)rKZNETSCAPE_SPKI_newrRrWZNETSCAPE_SPKI_free�_spki)rnZspkirDrDrEro
szNetscapeSPKI.__init__cCs^|jrtd��|jstd��tjt|��}|tjkr<td��tj|j	|j
|�}t|dk�dS)a
        Sign the certificate request with this key and digest type.

        :param pkey: The private key to sign with.
        :type pkey: :py:class:`PKey`

        :param digest: The message digest to use.
        :type digest: :py:class:`bytes`

        :return: ``None``
        zKey has only public partzKey is uninitializedzNo such digest methodrN)ryr`rwrKr�r�rRrVZNETSCAPE_SPKI_signr�rvrU)rnrxr�r�r�rDrDrEr7
s
zNetscapeSPKI.signcCs"tj|j|j�}|dkrt�dS)aY
        Verifies a signature on a certificate request.

        :param PKey key: The public key that signature is supposedly from.

        :return: ``True`` if the signature is correct.
        :rtype: bool

        :raises OpenSSL.crypto.Error: If the signature is invalid, or there was
            a problem verifying the signature.
        rT)rKZNETSCAPE_SPKI_verifyr�rvr�)rnr�ZanswerrDrDrEr88
szNetscapeSPKI.verifycCs$tj|j�}tj|�}tj|�|S)z�
        Generate a base64 encoded representation of this SPKI object.

        :return: The base64 encoded string.
        :rtype: :py:class:`bytes`
        )rKZNETSCAPE_SPKI_b64_encoder�rRrhr�)rnZencodedr�rDrDrE�
b64_encodeI
s

zNetscapeSPKI.b64_encodecCsDtjt�}tj|j�|_t|jtjk�tj	|jtj
�|_d|_|S)z|
        Get the public key of this certificate.

        :return: The public key.
        :rtype: :py:class:`PKey`
        T)rr�rKZNETSCAPE_SPKI_get_pubkeyr�rvrUrRrVrWrury)rnrxrDrDrEr�U
s
zNetscapeSPKI.get_pubkeycCs tj|j|j�}t|dk�dS)zv
        Set the public key of the certificate

        :param pkey: The public key
        :return: ``None``
        r?N)rKZNETSCAPE_SPKI_set_pubkeyr�rvrU)rnrxrcrDrDrEr�c
szNetscapeSPKI.set_pubkeyN)
r@rArBrCror7r8r�r�r�rDrDrDrEr2
sz>NetscapeSPKIType has been deprecated, use NetscapeSPKI insteadc@sBeZdZd
dd�Zedd��Zedd��Zefdd	�Zd
d�Z	dS)r@FcCs4|tkr|dk	rtd��||_||_||_g|_dS)Nz0only FILETYPE_PEM key format supports encryption)rr`�_passphrase�
_more_args�	_truncate�	_problems)rnr�rDZ	more_args�truncaterDrDrErov
sz_PassphraseHelper.__init__cCsF|jdkrtjSt|jt�r"tjSt|j�r:tjd|j�Std��dS)NZpem_password_cbz2Last argument must be a byte string or a callable.)	r�rRrVr]r^�callablerA�_read_passphraser_)rnrDrDrErA�
s

z_PassphraseHelper.callbackcCs>|jdkrtjSt|jt�r"|jSt|j�r2tjStd��dS)Nz2Last argument must be a byte string or a callable.)r�rRrVr]r^r�r_)rnrDrDrErB�
s

z_PassphraseHelper.callback_argscCs8|jr4yt|�Wn|k
r&YnX|jjd��dS)Nr)r��_exception_from_error_queue�pop)rnZ
exceptionTyperDrDrErC�
sz"_PassphraseHelper.raise_if_problemcCs�y�|jr|j|||�}n
|j|�}t|t�s4td��t|�|kr\|jrT|d|�}ntd��x(tt|��D]}|||d�||<qjWt|�Stk
r�}z|j	j
|�dSd}~XnXdS)NzString expectedz+passphrase returned by callback is too longr?r)r�r�r]r^r`rTr�r��	Exceptionr�rp)rnZbuf�sizeZrwflagZuserdatar�r��erDrDrEr��
s"

z"_PassphraseHelper._read_passphraseN)FF)
r@rArBror�rArBrrCr�rDrDrDrEr@u
s




r@cCs�t|t�r|jd�}t|�}|tkr<tj|tjtjtj�}n |t	krTtj
|tj�}ntd��|tjkrlt�t
jt
�}tj|tj�|_d|_|S)a<
    Load a public key from a buffer.

    :param type: The file type (one of :data:`FILETYPE_PEM`,
        :data:`FILETYPE_ASN1`).
    :param buffer: The buffer the key is stored in.
    :type buffer: A Python string object, either unicode or bytestring.
    :return: The PKey object.
    :rtype: :class:`PKey`
    r�z3type argument must be FILETYPE_PEM or FILETYPE_ASN1T)r]r�r�rZrrKZPEM_read_bio_PUBKEYrRrVrZd2i_PUBKEY_bior`r�rr�rWrurvry)r�rXrM�evp_pkeyrxrDrDrEr3�
s



cCs�t|t�r|jd�}t|�}t||�}|tkrNtj|tj	|j
|j�}|j�n |t
krftj|tj	�}ntd��|tj	kr~t�tjt�}tj|tj�|_|S)a�
    Load a private key (PKey) from the string *buffer* encoded with the type
    *type*.

    :param type: The file type (one of FILETYPE_PEM, FILETYPE_ASN1)
    :param buffer: The buffer the key is stored in
    :param passphrase: (optional) if encrypted PEM format, this can be
                       either the passphrase to use, or a callback for
                       providing the passphrase.

    :return: The PKey object
    r�z3type argument must be FILETYPE_PEM or FILETYPE_ASN1)r]r�r�rZr@rrKZPEM_read_bio_PrivateKeyrRrVrArBrCrZd2i_PrivateKey_bior`r�rr�rWrurv)r�rXrDrMrEr�rxrDrDrEr4�
s 





cCsnt�}|tkrtj||j�}n<|tkr6tj||j�}n$|tkrRtj||jdd�}nt	d��t
|dk�t|�S)a
    Dump the certificate request *req* into a buffer string encoded with the
    type *type*.

    :param type: The file type (one of FILETYPE_PEM, FILETYPE_ASN1)
    :param req: The certificate request to dump
    :return: The buffer with the dumped certificate request in
    rzCtype argument must be FILETYPE_PEM, FILETYPE_ASN1, or FILETYPE_TEXT)rZrrKZPEM_write_bio_X509_REQr�rZi2d_X509_REQ_biorZX509_REQ_print_exr`rUr\)r�r�rMr?rDrDrEr5s	cCs�t|t�r|jd�}t|�}|tkr<tj|tjtjtj�}n |t	krTtj
|tj�}ntd��t|tjk�t
jt
�}tj|tj�|_|S)a
    Load a certificate request (X509Req) from the string *buffer* encoded with
    the type *type*.

    :param type: The file type (one of FILETYPE_PEM, FILETYPE_ASN1)
    :param buffer: The buffer the certificate request is stored in
    :return: The X509Req object
    r�z3type argument must be FILETYPE_PEM or FILETYPE_ASN1)r]r�r�rZrrKZPEM_read_bio_X509_REQrRrVrZd2i_X509_REQ_bior`rUr$r�rWr�r�)r�rXrMr�Zx509reqrDrDrEr6s	


c	Cs�td|�}tjt|��}|tjkr*td��tj�}tj|tj	�}tj
||�tj||t|��tj
|j�}t|dk�tjd|�}tjd�}tj||||j�}t|dk�tj||d�dd�S)z�
    Sign a data string using the given key and message digest.

    :param pkey: PKey to sign with
    :param data: data to be signed
    :param digest: message digest to use
    :return: signature

    .. versionadded:: 0.11
    rYzNo such digest methodrzunsigned char[]zunsigned int *r?N)r�rKr�r�rRrVr`�Cryptography_EVP_MD_CTX_newrW�Cryptography_EVP_MD_CTX_freeZEVP_SignInitZEVP_SignUpdaterTZ
EVP_PKEY_sizervrUrSZ
EVP_SignFinalrX)	rxrYr�r��md_ctxr�Zsignature_bufferZsignature_lengthZfinal_resultrDrDrEr79s 


cCs�td|�}tjt|��}|tjkr*td��tj|j�}t	|tjk�tj
|tj�}tj�}tj
|tj
�}tj||�tj||t|��tj||t|�|�}|dkr�t�dS)a�
    Verify the signature for a data string.

    :param cert: signing certificate (X509 object) corresponding to the
        private key which generated the signature.
    :param signature: signature returned by sign function
    :param data: data to be verified
    :param digest: message digest to use
    :return: ``None`` if the signature is correct, raise exception otherwise.

    .. versionadded:: 0.11
    rYzNo such digest methodr?N)r�rKr�r�rRrVr`r�r�rUrWrur�r�ZEVP_VerifyInitZEVP_VerifyUpdaterTZEVP_VerifyFinalr�)r�Z	signaturerYr�r�rxr�Z
verify_resultrDrDrEr8[s

cCs^t�}|tkrtj||j�}n8|tkr6tj||j�}n |tkrNtj||j�}nt	d��t
|�S)a
    Dump a certificate revocation list to a buffer.

    :param type: The file type (one of ``FILETYPE_PEM``, ``FILETYPE_ASN1``, or
        ``FILETYPE_TEXT``).
    :param CRL crl: The CRL to dump.

    :return: The buffer with the CRL.
    :rtype: bytes
    zCtype argument must be FILETYPE_PEM, FILETYPE_ASN1, or FILETYPE_TEXT)rZrrKZPEM_write_bio_X509_CRLr-rZi2d_X509_CRL_biorZX509_CRL_printr`r\)r�r.rMr8rDrDrEr9scCs�t|t�r|jd�}t|�}|tkr<tj|tjtjtj�}n |t	krTtj
|tj�}ntd��|tjkrlt�t
jt
�}tj|tj�|_|S)a
    Load Certificate Revocation List (CRL) data from a string *buffer*.
    *buffer* encoded with the type *type*.

    :param type: The file type (one of FILETYPE_PEM, FILETYPE_ASN1)
    :param buffer: The buffer the CRL is stored in

    :return: The PKey object
    r�z3type argument must be FILETYPE_PEM or FILETYPE_ASN1)r]r�r�rZrrKZPEM_read_bio_X509_CRLrRrVrZd2i_X509_CRL_bior`r�r/r�rWr]r-)r�rXrMr.r�rDrDrEr:�s




cCs�t|t�r|jd�}t|�}|tkr<tj|tjtjtj�}n |t	krTtj
|tj�}ntd��|tjkrlt�t
jt
�}tj|tj�|_|S)z�
    Load pkcs7 data from the string *buffer* encoded with the type
    *type*.

    :param type: The file type (one of FILETYPE_PEM or FILETYPE_ASN1)
    :param buffer: The buffer with the pkcs7 data.
    :return: The PKCS7 object
    r�z3type argument must be FILETYPE_PEM or FILETYPE_ASN1)r]r�r�rZrrKZPEM_read_bio_PKCS7rRrVrZ
d2i_PKCS7_bior`r�r0r�rWZ
PKCS7_freero)r�rXrMZpkcs7Zpypkcs7rDrDrEr;�s	



cCs�td|�}t|t�r|jd�}t|�}|s0tj}tj|tj�}|tjkrNt	�tj
|tj�}tjd�}tjd�}tjd�}tj
|||||�}|s�t	�tj
|dtj�}y
t	�Wntk
r�YnX|dtjkr�d}ntjt�}tj
|dtj�|_|dtjk�rd}	d}
nPtj|d�}	tjd�}tj|d|�}tj||d�dd�}
|tjk�rdd}
g}
x8ttj|��D]&}tj||�}tj|�}|
j|��qxW|
�s�d}
tjt�}||_|	|_|
|_|
|_|S)	a�
    Load pkcs12 data from the string *buffer*. If the pkcs12 structure is
    encrypted, a *passphrase* must be included.  The MAC is always
    checked and thus required.

    See also the man page for the C function :py:func:`PKCS12_parse`.

    :param buffer: The buffer the certificate is stored in
    :param passphrase: (Optional) The password to decrypt the PKCS12 lump
    :returns: The PKCS12 object
    rDr�z
EVP_PKEY**zX509**zCryptography_STACK_OF_X509**rNzint*) r�r]r�r�rZrRrVrKZd2i_PKCS12_bior�rWr�rSZPKCS12_parser�rrr�rurvr%r�ZX509_alias_get0rXr�Zsk_X509_numZ
sk_X509_valuerpr1r6rurv)rXrDrMZp12rxr�r}Zparse_resultZpykeyr;r�Zfriendlyname_lengthZfriendlyname_bufferZ	pycacertsr�r
Zpycacertr�rDrDrEr<�sb











sutf8onlyii��)N)NN)N)N)tr�base64r�	functoolsr�operatorrrrrrr	Zsixr
rrr�rr�Zcryptographyr
Z)cryptography.hazmat.primitives.asymmetricrrZcryptography.utilsrZ
OpenSSL._utilrrRrrKrr�rr�rr�rrlrr�rZ_make_assert�__all__ZSSL_FILETYPE_PEMrZSSL_FILETYPE_ASN1rrr�rZEVP_PKEY_DSArZEVP_PKEY_DHZTYPE_DHZEVP_PKEY_ECZTYPE_ECr�rr�rUrGrJrZr\rdrk�objectrlrr@�DeprecationWarningZPKeyTyper�r r!r"ZX509NameTyper#ZX509ExtensionTyper$ZX509ReqTyper%ZX509Typer&r'Z
X509StoreTyper(r)r*r+r,r-r.r/ZCRLTyper0Z	PKCS7Typer1Z
PKCS12Typer2ZNetscapeSPKITyper@r3r4r5r6r7r8r9r:r;r<ZOpenSSL_add_all_algorithmsZSSL_load_error_stringsZ ASN1_STRING_set_default_mask_ascrDrDrDrE�<module>s$ (
	
	(
jBHUoh
;+[,/ZG!
$"$
`crypto.cpython-36.pyc000064400000257664151730204570010542 0ustar003

�F\���$@s�ddlZddlmZddlmZddlmZmZmZm	Z	m
Z
mZddlm
ZmZmZddlmZddlmZmZddlmZdd	lmZmZmZ m!Z"m#Z$m%Z&m'Z(m)Z*d
ddd
ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-g$Z+ej,Z-ej.Z/dnZ0ej1Z2ej3Z4ej5Z6ej7Z8Gd1d�de9�Z:ee e:�Z;e*e:�Z<d2d3�Z=d4d5�Z>dod6d7�Z?d8d9�Z@d:d;�ZAd<d=�ZBGd>d?�d?eC�ZDGd@d�deC�ZEeeEeFdAeG�ZHGdBdC�dCeC�ZIdDd�ZJdEd�ZKGdFd�deC�ZLeeLeFdGeG�ZMGdHd�deC�ZNeeNeFdIeG�ZOGdJd�deC�ZPeePeFdKeG�ZQGdLd�deC�ZReeReFdMeG�ZSGdNd�deC�ZTGdOd�deC�ZUeeUeFdPeG�ZVGdQd�de9�ZWGdRd�deC�ZXdSd�ZYdTd�ZZdUd�Z[dpdVd�Z\GdWd�deC�Z]GdXd �d eC�Z^ee^eFdYeG�Z_GdZd!�d!eC�Z`ee`eFd[eG�ZaGd\d"�d"eC�ZbeebeFd]eG�ZcGd^d#�d#eC�ZdeedeFd_eG�ZeGd`da�daeC�Zfdbd$�Zgdqdcd%�Zhddd&�Zided'�Zjdfd(�Zkdgd)�Zldhd*�Zmdid+�Zndjd,�Zodrdkd-�Zpejq�ejr�ejsdl�dS)s�N)�	b16encode)�partial)�__eq__�__ne__�__lt__�__le__�__gt__�__ge__)�
integer_types�	text_type�PY3)�x509)�dsa�rsa)�
deprecated)�ffi�lib�exception_from_error_queue�byte_string�native�UNSPECIFIED�text_to_bytes_and_warn�make_assert�FILETYPE_PEM�
FILETYPE_ASN1�
FILETYPE_TEXT�TYPE_RSA�TYPE_DSA�Error�PKey�get_elliptic_curves�get_elliptic_curve�X509Name�
X509Extension�X509Req�X509�X509StoreFlags�	X509Store�X509StoreContextError�X509StoreContext�load_certificate�dump_certificate�dump_publickey�dump_privatekey�Revoked�CRL�PKCS7�PKCS12�NetscapeSPKI�load_publickey�load_privatekey�dump_certificate_request�load_certificate_request�sign�verify�dump_crl�load_crl�load_pkcs7_data�load_pkcs12���c@seZdZdZdS)rz7
    An error occurred in an `OpenSSL.crypto` API.
    N)�__name__�
__module__�__qualname__�__doc__�rDrD�/usr/lib/python3.6/crypto.pyrNscCsddlm}|S)ap
    Importing the backend from cryptography has the side effect of activating
    the osrandom engine. This mutates the global state of OpenSSL in the
    process and causes issues for various programs that use subinterpreters or
    embed Python. By putting the import in this function we can avoid
    triggering this side effect unless _get_backend is called.
    r)�backend)Z,cryptography.hazmat.backends.openssl.backendrF)rFrDrDrE�_get_backendXsrGcCstd|f��dS)z�
    An OpenSSL API failed somehow.  Additionally, the failure which was
    encountered isn't one that's exercised by the test suite so future behavior
    of pyOpenSSL is now somewhat less predictable.
    zUnknown %s failureN)�RuntimeError)�whererDrDrE�_untested_errordsrJcCsd|dkrtjtj��}tj}n(tjd|�}tj|t|��}|fdd�}t|tj	k�tj
||�}|S)z�
    Allocate a new OpenSSL memory BIO.

    Arrange for the garbage collector to clean it up automatically.

    :param buffer: None or some bytes to use to put into the BIO so that they
        can be read out.
    Nzchar[]cSs
tj|�S)N)�_lib�BIO_free)�bio�refrDrDrE�free~sz_new_mem_buf.<locals>.free)rK�BIO_new�	BIO_s_memrL�_ffi�newZBIO_new_mem_buf�len�_openssl_assert�NULL�gc)�bufferrMrO�datarDrDrE�_new_mem_bufms	rZcCs.tjd�}tj||�}tj|d|�dd�S)zO
    Copy the contents of an OpenSSL BIO object into a Python byte string.
    zchar**rN)rRrSrKZBIO_get_mem_datarX)rM�
result_bufferZ
buffer_lengthrDrDrE�_bio_to_string�s
r\cCs2t|t�std��tj||�}|dkr.td��dS)a�
    The the time value of an ASN1 time object.

    @param boundary: An ASN1_TIME pointer (or an object safely
        castable to that type) which will have its value set.
    @param when: A string representation of the desired time value.

    @raise TypeError: If C{when} is not a L{bytes} string.
    @raise ValueError: If C{when} does not represent a time in the required
        format.
    @raise RuntimeError: If the time value cannot be set for some other
        (unspecified) reason.
    zwhen must be a byte stringrzInvalid stringN)�
isinstance�bytes�	TypeErrorrKZASN1_TIME_set_string�
ValueError)�boundary�when�
set_resultrDrDrE�_set_asn1_time�s

rdcCs�tjd|�}tj|�dkrdStj|�tjkr>tjtj|��Stjd�}tj	||�|dtj
krltd�n6tjd|d�}tj|�}tj|�}tj|d�|SdS)a]
    Retrieve the time value of an ASN1 time object.

    @param timestamp: An ASN1_GENERALIZEDTIME* (or an object safely castable to
        that type) from which the time value will be retrieved.

    @return: The time value from C{timestamp} as a L{bytes} string in a certain
        format.  Or C{None} if the object contains no time value.
    zASN1_STRING*rNzASN1_GENERALIZEDTIME**�ASN1_TIME_to_generalizedtime)
rR�castrK�ASN1_STRING_lengthZASN1_STRING_typeZV_ASN1_GENERALIZEDTIME�string�ASN1_STRING_datarSrerVrJZASN1_GENERALIZEDTIME_free)Z	timestampZstring_timestampZgeneralized_timestampZstring_data�
string_resultrDrDrE�_get_asn1_time�s





rkc@s$eZdZdd�Zdd�Zdd�ZdS)�_X509NameInvalidatorcCs
g|_dS)N)�_names)�selfrDrDrE�__init__�sz_X509NameInvalidator.__init__cCs|jj|�dS)N)rm�append)rn�namerDrDrE�add�sz_X509NameInvalidator.addcCsx|jD]}|`qWdS)N)rm�_name)rnrqrDrDrE�clear�sz_X509NameInvalidator.clearN)r@rArBrorrrtrDrDrDrErl�srlc@sTeZdZdZdZdZdd�Zdd�Zedd	��Z	d
d�Z
dd
�Zdd�Zdd�Z
dS)rzD
    A class representing an DSA or RSA public key or key pair.
    FTcCs"tj�}tj|tj�|_d|_dS)NF)rKZEVP_PKEY_newrRrW�
EVP_PKEY_free�_pkey�_initialized)rn�pkeyrDrDrEro�sz
PKey.__init__cCs(t�}|jr|j|j�S|j|j�SdS)a
        Export as a ``cryptography`` key.

        :rtype: One of ``cryptography``'s `key interfaces`_.

        .. _key interfaces: https://cryptography.io/en/latest/hazmat/            primitives/asymmetric/rsa/#key-interfaces

        .. versionadded:: 16.1.0
        N)rG�_only_publicZ_evp_pkey_to_public_keyrvZ_evp_pkey_to_private_key)rnrFrDrDrE�to_cryptography_key�szPKey.to_cryptography_keycCsR|�}t|tjtjtjtjf�s(td��|j|_	t|tjtjf�rHd|_
d|_|S)z�
        Construct based on a ``cryptography`` *crypto_key*.

        :param crypto_key: A ``cryptography`` key.
        :type crypto_key: One of ``cryptography``'s `key interfaces`_.

        :rtype: PKey

        .. versionadded:: 16.1.0
        zUnsupported key typeT)r]rZRSAPublicKeyZ
RSAPrivateKeyrZDSAPublicKeyZ
DSAPrivateKeyr_Z	_evp_pkeyrvryrw)�clsZ
crypto_keyrxrDrDrE�from_cryptography_key�szPKey.from_cryptography_keycCs6t|t�std��t|t�s$td��|tkr�|dkr<td��tj�}tj|tj	�}tj
|tj�tj�}tj
|||tj�}t|dk�tj|j|�}t|dk�n�|tk�r$tj�}t|tjk�tj|tj�}tj||tjdtjtjtj�}t|dk�ttj|�dk�ttj|j|�dk�ntd��d|_dS)	a3
        Generate a key pair of the given type, with the given number of bits.

        This generates a key "into" the this object.

        :param type: The key type.
        :type type: :py:data:`TYPE_RSA` or :py:data:`TYPE_DSA`
        :param bits: The number of bits.
        :type bits: :py:data:`int` ``>= 0``
        :raises TypeError: If :py:data:`type` or :py:data:`bits` isn't
            of the appropriate type.
        :raises ValueError: If the number of bits isn't an integer of
            the appropriate size.
        :return: ``None``
        ztype must be an integerzbits must be an integerrzInvalid number of bitsr?zNo such key typeTN)r]�intr_rr`rK�BN_newrRrW�BN_freeZBN_set_wordZRSA_F4ZRSA_newZRSA_generate_key_exrVrUZEVP_PKEY_assign_RSArvrZDSA_newZDSA_freeZDSA_generate_parameters_exZDSA_generate_keyZEVP_PKEY_set1_DSArrw)rn�type�bitsZexponentr�resultr�resrDrDrE�generate_keys4


zPKey.generate_keycCs`|jrtd��tj|j��tjkr*td��tj|j�}tj	|tj
�}tj|�}|rVdSt�dS)ax
        Check the consistency of an RSA private key.

        This is the Python equivalent of OpenSSL's ``RSA_check_key``.

        :return: ``True`` if key is consistent.

        :raise OpenSSL.crypto.Error: if the key is inconsistent.

        :raise TypeError: if the key is of a type which cannot be checked.
            Only RSA keys can currently be checked.
        zpublic key onlyzkey type unsupportedTN)
ryr_rKZ
EVP_PKEY_typer��EVP_PKEY_RSA�EVP_PKEY_get1_RSArvrRrW�RSA_freeZ
RSA_check_key�_raise_current_error)rnrr�rDrDrE�checkGs

z
PKey.checkcCstj|j�S)zT
        Returns the type of the key

        :return: The type of the key.
        )rK�EVP_PKEY_idrv)rnrDrDrEr�asz	PKey.typecCstj|j�S)zh
        Returns the number of bits of the key

        :return: The number of bits of the key.
        )rKZ
EVP_PKEY_bitsrv)rnrDrDrEr�isz	PKey.bitsN)r@rArBrCryrwrorz�classmethodr|r�r�r�r�rDrDrDrEr�s8z.PKeyType has been deprecated, use PKey insteadcsdeZdZdZdZer �fdd�Zedd��Zedd��Z	ed	d
��Z
dd�Zd
d�Zdd�Z
�ZS)�_EllipticCurveaZ
    A representation of a supported elliptic curve.

    @cvar _curves: :py:obj:`None` until an attempt is made to load the curves.
        Thereafter, a :py:type:`set` containing :py:type:`_EllipticCurve`
        instances each of which represents one curve supported by the system.
    @type _curves: :py:type:`NoneType` or :py:type:`set`
    Ncst|t�rtt|�j|�StS)z�
            Implement cooperation with the right-hand side argument of ``!=``.

            Python 3 seems to have dropped this cooperation in this very narrow
            circumstance.
            )r]r��superr�NotImplemented)rn�other)�	__class__rDrEr�s
z_EllipticCurve.__ne__cs>�jtjd�}tjd|�}�j||�t��fdd�|D��S)z�
        Get the curves supported by OpenSSL.

        :param lib: The OpenSSL library binding object.

        :return: A :py:type:`set` of ``cls`` instances giving the names of the
            elliptic curves the underlying library supports.
        rzEC_builtin_curve[]c3s|]}�j�|j�VqdS)N)�from_nid�nid)�.0�c)r{rrDrE�	<genexpr>�sz7_EllipticCurve._load_elliptic_curves.<locals>.<genexpr>)ZEC_get_builtin_curvesrRrVrS�set)r{rZ
num_curvesZbuiltin_curvesrD)r{rrE�_load_elliptic_curves�s
z$_EllipticCurve._load_elliptic_curvescCs|jdkr|j|�|_|jS)a
        Get, cache, and return the curves supported by OpenSSL.

        :param lib: The OpenSSL library binding object.

        :return: A :py:type:`set` of ``cls`` instances giving the names of the
            elliptic curves the underlying library supports.
        N)�_curvesr�)r{rrDrDrE�_get_elliptic_curves�s

z#_EllipticCurve._get_elliptic_curvescCs|||tj|j|��jd��S)a�
        Instantiate a new :py:class:`_EllipticCurve` associated with the given
        OpenSSL NID.

        :param lib: The OpenSSL library binding object.

        :param nid: The OpenSSL NID the resulting curve object will represent.
            This must be a curve NID (and not, for example, a hash NID) or
            subsequent operations will fail in unpredictable ways.
        :type nid: :py:class:`int`

        :return: The curve object.
        �ascii)rRrh�
OBJ_nid2sn�decode)r{rr�rDrDrEr��sz_EllipticCurve.from_nidcCs||_||_||_dS)a�
        :param _lib: The :py:mod:`cryptography` binding instance used to
            interface with OpenSSL.

        :param _nid: The OpenSSL NID identifying the curve this object
            represents.
        :type _nid: :py:class:`int`

        :param name: The OpenSSL short name identifying the curve this object
            represents.
        :type name: :py:class:`unicode`
        N)rK�_nidrq)rnrr�rqrDrDrEro�s
z_EllipticCurve.__init__cCsd|jfS)Nz
<Curve %r>)rq)rnrDrDrE�__repr__�sz_EllipticCurve.__repr__cCs|jj|j�}tj|tj�S)z�
        Create a new OpenSSL EC_KEY structure initialized to use this curve.

        The structure is automatically garbage collected when the Python object
        is garbage collected.
        )rKZEC_KEY_new_by_curve_namer�rRrWZEC_KEY_free)rn�keyrDrDrE�
_to_EC_KEY�sz_EllipticCurve._to_EC_KEY)r@rArBrCr��_PY3rr�r�r�r�ror�r��
__classcell__rDrD)r�rEr�ysr�cCs
tjt�S)a�
    Return a set of objects representing the elliptic curves supported in the
    OpenSSL build in use.

    The curve objects have a :py:class:`unicode` ``name`` attribute by which
    they identify themselves.

    The curve objects are useful as values for the argument accepted by
    :py:meth:`Context.set_tmp_ecdh` to specify which elliptical curve should be
    used for ECDHE key exchange.
    )r�r�rKrDrDrDrEr �scCs,xt�D]}|j|kr|SqWtd|��dS)aT
    Return a single curve object selected by name.

    See :py:func:`get_elliptic_curves` for information about curve objects.

    :param name: The OpenSSL short name identifying the curve object to
        retrieve.
    :type name: :py:class:`unicode`

    If the named curve is not supported then :py:class:`ValueError` is raised.
    zunknown curve nameN)r rqr`)rqZcurverDrDrEr!�s
cs�eZdZdZdd�Z�fdd�Z�fdd�Zdd	�Zee�Zee	�Z	ee
�Z
ee�Zee�Zee
�Z
d
d�Zdd
�Zdd�Zdd�Z�ZS)r"a
    An X.509 Distinguished Name.

    :ivar countryName: The country of the entity.
    :ivar C: Alias for  :py:attr:`countryName`.

    :ivar stateOrProvinceName: The state or province of the entity.
    :ivar ST: Alias for :py:attr:`stateOrProvinceName`.

    :ivar localityName: The locality of the entity.
    :ivar L: Alias for :py:attr:`localityName`.

    :ivar organizationName: The organization name of the entity.
    :ivar O: Alias for :py:attr:`organizationName`.

    :ivar organizationalUnitName: The organizational unit of the entity.
    :ivar OU: Alias for :py:attr:`organizationalUnitName`

    :ivar commonName: The common name of the entity.
    :ivar CN: Alias for :py:attr:`commonName`.

    :ivar emailAddress: The e-mail address of the entity.
    cCs tj|j�}tj|tj�|_dS)z�
        Create a new X509Name, copying the given X509Name instance.

        :param name: The name to copy.
        :type name: :py:class:`X509Name`
        N)rK�
X509_NAME_duprsrRrW�X509_NAME_free)rnrqrDrDrEroszX509Name.__init__c	s|jd�rtt|�j||�St|�tk	r<tdt|�jf��tj	t
|��}|tjkr|y
t�Wnt
k
rrYnXtd��x\ttj|j��D]H}tj|j|�}tj|�}tj|�}||kr�tj|j|�}tj|�Pq�Wt|t�r�|jd�}tj|j|tj|ddd�}|�st�dS)	N�_z+attribute name must be string, not '%.200s'zNo such attributezutf-8r?r���r�)�
startswithr�r"�__setattr__r��strr_r@rK�OBJ_txt2nid�_byte_string�	NID_undefr�r�AttributeError�range�X509_NAME_entry_countrs�X509_NAME_get_entry�X509_NAME_ENTRY_get_object�OBJ_obj2nidZX509_NAME_delete_entryZX509_NAME_ENTRY_freer]�
_text_type�encodeZX509_NAME_add_entry_by_NIDZ
MBSTRING_UTF8)	rnrq�valuer��i�entZent_objZent_nid�
add_result)r�rDrEr�'s4







zX509Name.__setattr__c	s�tjt|��}|tjkrHy
t�Wntk
r6YnXtt|�j|�Stj	|j
|d�}|dkrddStj|j
|�}tj|�}t
jd�}tj||�}t|dk�z"t
j|d|�dd�jd�}Wdtj|d�X|S)a

        Find attribute. An X509Name object has the following attributes:
        countryName (alias C), stateOrProvince (alias ST), locality (alias L),
        organization (alias O), organizationalUnit (alias OU), commonName
        (alias CN) and more...
        r?Nzunsigned char**rzutf-8r�r�)rKr�r�r�r�rr�r"�__getattr__ZX509_NAME_get_index_by_NIDrsr��X509_NAME_ENTRY_get_datarRrSZASN1_STRING_to_UTF8rUrXr��OPENSSL_free)	rnrqr�Zentry_index�entryrYr[Zdata_lengthr�)r�rDrEr�Ks*




zX509Name.__getattr__cs�fdd�}|S)Ncs(t|t�stStj|j|j�}�|d�S)Nr)r]r"r�rKZ
X509_NAME_cmprs)rnr�r�)�oprDrE�fts
zX509Name._cmp.<locals>.frD)r�r�rD)r�rE�_cmpssz
X509Name._cmpcCsBtjdd�}tj|j|t|��}t|tjk�dttj	|��fS)z6
        String representation of an X509Name
        zchar[]iz<X509Name object '%s'>)
rRrSrKZX509_NAME_onelinersrTrUrV�_nativerh)rnr[Z
format_resultrDrDrEr��szX509Name.__repr__cCstj|j�S)a&
        Return an integer representation of the first four bytes of the
        MD5 digest of the DER representation of the name.

        This is the Python equivalent of OpenSSL's ``X509_NAME_hash``.

        :return: The (integer) hash of this name.
        :rtype: :py:class:`int`
        )rKZX509_NAME_hashrs)rnrDrDrE�hash�s
z
X509Name.hashcCsNtjd�}tj|j|�}t|dk�tj|d|�dd�}tj|d�|S)z�
        Return the DER encoding of this name.

        :return: The DER encoded form of this name.
        :rtype: :py:class:`bytes`
        zunsigned char**rN)rRrSrKZ
i2d_X509_NAMErsrUrXr�)rnr[Z
encode_resultrjrDrDrE�der�s
zX509Name.derc	Cs�g}x�ttj|j��D]n}tj|j|�}tj|�}tj|�}tj|�}tj|�}t	j
tj|�tj|��dd�}|j
t	j|�|f�qW|S)z�
        Returns the components of this name, as a sequence of 2-tuples.

        :return: The components of this name.
        :rtype: :py:class:`list` of ``name, value`` tuples.
        N)r�rKr�rsr�r�r�r�r�rRrXrirgrprh)	rnr�r�r�ZfnameZfvalr�rqr�rDrDrE�get_components�s



zX509Name.get_components)r@rArBrCror�r�r�rrrrrr	r�r�r�r�r�rDrD)r�rEr"s
$(z6X509NameType has been deprecated, use X509Name insteadc@sdeZdZdZddd�Zedd��Zejdej	dej
d	iZd
d�Zdd
�Z
dd�Zdd�Zdd�ZdS)r#z,
    An X.509 v3 certificate extension.
    NcCs�tjd�}tj|tjtjtjtjd�tj|�|dk	rRt|t�sJtd��|j	|_
|dk	rtt|t�sltd��|j	|_|r�d|}tjtj|||�}|tjkr�t
�tj|tj�|_dS)a�
        Initializes an X509 extension.

        :param type_name: The name of the type of extension_ to create.
        :type type_name: :py:data:`bytes`

        :param bool critical: A flag indicating whether this is a critical
            extension.

        :param value: The value of the extension.
        :type value: :py:data:`bytes`

        :param subject: Optional X509 certificate to use as subject.
        :type subject: :py:class:`X509`

        :param issuer: Optional X509 certificate to use as issuer.
        :type issuer: :py:class:`X509`

        .. _extension: https://www.openssl.org/docs/manmaster/man5/
            x509v3_config.html#STANDARD-EXTENSIONS
        zX509V3_CTX*rNzissuer must be an X509 instancez subject must be an X509 instances	critical,)rRrSrKZX509V3_set_ctxrVZX509V3_set_ctx_nodbr]r%r_�_x509�issuer_certZsubject_certZX509V3_EXT_nconfr�rW�X509_EXTENSION_free�
_extension)rnZ	type_nameZcriticalr��subject�issuerZctx�	extensionrDrDrEro�s"




zX509Extension.__init__cCstjtj|j��S)N)rKr��X509_EXTENSION_get_objectr�)rnrDrDrEr�szX509Extension._nidZemailZDNSZURIc
Cs�tjdtj|j��}tj|tj�}g}x�ttj|��D]�}tj	||�}y|j
|j}Wn8tk
r�t
�}tj||�|jtt|���Yq6Xttj|jjj|jjj�dd��}|j|d|�q6Wdj|�S)NzGENERAL_NAMES*�:z, )rRrfrKZX509V3_EXT_d2ir�rWZGENERAL_NAMES_freer�Zsk_GENERAL_NAME_numZsk_GENERAL_NAME_value�	_prefixesr��KeyErrorrZZGENERAL_NAME_printrpr�r\rX�dZia5rY�length�join)rn�names�partsr�rqZlabelrMr�rDrDrE�_subjectAltNameStrings "z#X509Extension._subjectAltNameStringcCsDtj|jkr|j�St�}tj||jdd�}t|dk�tt	|��S)zF
        :return: a nice text representation of the extension
        r)
rKZNID_subject_alt_namer�r�rZ�X509V3_EXT_printr�rUr�r\)rnrM�print_resultrDrDrE�__str__/szX509Extension.__str__cCstj|j�S)zk
        Returns the critical field of this X.509 extension.

        :return: The critical field.
        )rKZX509_EXTENSION_get_criticalr�)rnrDrDrE�get_critical<szX509Extension.get_criticalcCs&tj|j�}tj|�}tjtj|��S)z�
        Returns the short type name of this X.509 extension.

        The result is a byte string such as :py:const:`b"basicConstraints"`.

        :return: The short type name.
        :rtype: :py:data:`bytes`

        .. versionadded:: 0.12
        )rKr�r�r�rRrhr�)rn�objr�rDrDrE�get_short_nameDs
zX509Extension.get_short_namecCs@tj|j�}tjd|�}tj|�}tj|�}tj||�dd�S)z�
        Returns the data of the X509 extension, encoded as ASN.1.

        :return: The ASN.1 encoded data of this X509 extension.
        :rtype: :py:data:`bytes`

        .. versionadded:: 0.12
        zASN1_STRING*N)rK�X509_EXTENSION_get_datar�rRrfrirgrX)rnZoctet_resultrjZchar_result�
result_lengthrDrDrE�get_dataSs
	

zX509Extension.get_data)NN)r@rArBrCro�propertyr�rKZ	GEN_EMAILZGEN_DNSZGEN_URIr�r�r�r�r�r�rDrDrDrEr#�s
=

z@X509ExtensionType has been deprecated, use X509Extension insteadc@steZdZdZdd�Zdd�Zedd��Zdd	�Zd
d�Z	dd
�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�ZdS)r$z0
    An X.509 certificate signing requests.
    cCs&tj�}tj|tj�|_|jd�dS)Nr)rKZX509_REQ_newrRrW�
X509_REQ_free�_req�set_version)rn�reqrDrDrErooszX509Req.__init__cCsddlm}t�}|||j�S)z�
        Export as a ``cryptography`` certificate signing request.

        :rtype: ``cryptography.x509.CertificateSigningRequest``

        .. versionadded:: 17.1.0
        r)�_CertificateSigningRequest)�)cryptography.hazmat.backends.openssl.x509r�rGr�)rnr�rFrDrDrE�to_cryptographyuszX509Req.to_cryptographycCs&t|tj�std��|�}|j|_|S)a
        Construct based on a ``cryptography`` *crypto_req*.

        :param crypto_req: A ``cryptography`` X.509 certificate signing request
        :type crypto_req: ``cryptography.x509.CertificateSigningRequest``

        :rtype: X509Req

        .. versionadded:: 17.1.0
        z%Must be a certificate signing request)r]r
ZCertificateSigningRequestr_Z	_x509_reqr�)r{Z
crypto_reqr�rDrDrE�from_cryptography�s
zX509Req.from_cryptographycCs tj|j|j�}t|dk�dS)z�
        Set the public key of the certificate signing request.

        :param pkey: The public key to use.
        :type pkey: :py:class:`PKey`

        :return: ``None``
        r?N)rKZX509_REQ_set_pubkeyr�rvrU)rnrxrcrDrDrE�
set_pubkey�s	zX509Req.set_pubkeycCsDtjt�}tj|j�|_t|jtjk�tj	|jtj
�|_d|_|S)z�
        Get the public key of the certificate signing request.

        :return: The public key.
        :rtype: :py:class:`PKey`
        T)r�__new__rKZX509_REQ_get_pubkeyr�rvrUrRrVrWrury)rnrxrDrDrE�
get_pubkey�s
zX509Req.get_pubkeycCstj|j|�}t|dk�dS)z�
        Set the version subfield (RFC 2459, section 4.1.2.1) of the certificate
        request.

        :param int version: The version number.
        :return: ``None``
        r?N)rKZX509_REQ_set_versionr�rU)rn�versionrcrDrDrEr��szX509Req.set_versioncCstj|j�S)z�
        Get the version subfield (RFC 2459, section 4.1.2.1) of the certificate
        request.

        :return: The value of the version subfield.
        :rtype: :py:class:`int`
        )rKZX509_REQ_get_versionr�)rnrDrDrE�get_version�szX509Req.get_versioncCs2tjt�}tj|j�|_t|jtjk�||_	|S)a�
        Return the subject of this certificate signing request.

        This creates a new :class:`X509Name` that wraps the underlying subject
        name field on the certificate signing request. Modifying it will modify
        the underlying signing request, and will have the effect of modifying
        any other :class:`X509Name` that refers to this subject.

        :return: The subject of this certificate signing request.
        :rtype: :class:`X509Name`
        )
r"r�rKZX509_REQ_get_subject_namer�rsrUrRrV�_owner)rnrqrDrDrE�get_subject�s

zX509Req.get_subjectcCsptj�}t|tjk�tj|tj�}x,|D]$}t|t�s@t	d��tj
||j�q*Wtj|j
|�}t|dk�dS)z�
        Add extensions to the certificate signing request.

        :param extensions: The X.509 extensions to add.
        :type extensions: iterable of :py:class:`X509Extension`
        :return: ``None``
        z+One of the elements is not an X509Extensionr?N)rKZsk_X509_EXTENSION_new_nullrUrRrVrWZsk_X509_EXTENSION_freer]r#r`Zsk_X509_EXTENSION_pushr�ZX509_REQ_add_extensionsr�)rn�
extensions�stack�extr�rDrDrE�add_extensions�s

zX509Req.add_extensionscCsNg}tj|j�}x8ttj|��D]&}tjt�}tj||�|_|j	|�q W|S)z�
        Get X.509 extensions in the certificate signing request.

        :return: The X.509 extensions in this request.
        :rtype: :py:class:`list` of :py:class:`X509Extension` objects.

        .. versionadded:: 0.15
        )
rKZX509_REQ_get_extensionsr�r�Zsk_X509_EXTENSION_numr#r�Zsk_X509_EXTENSION_valuer�rp)rnZextsZnative_exts_objr�r�rDrDrE�get_extensions�s	
zX509Req.get_extensionscCs^|jrtd��|jstd��tjt|��}|tjkr<td��tj|j	|j
|�}t|dk�dS)ad
        Sign the certificate signing request with this key and digest type.

        :param pkey: The key pair to sign with.
        :type pkey: :py:class:`PKey`
        :param digest: The name of the message digest to use for the signature,
            e.g. :py:data:`b"sha256"`.
        :type digest: :py:class:`bytes`
        :return: ``None``
        zKey has only public partzKey is uninitializedzNo such digest methodrN)ryr`rwrK�EVP_get_digestbynamer�rRrVZ
X509_REQ_signr�rvrU)rnrx�digest�
digest_obj�sign_resultrDrDrEr7s
zX509Req.signcCs4t|t�std��tj|j|j�}|dkr0t�|S)a@
        Verifies the signature on this certificate signing request.

        :param PKey key: A public key.

        :return: ``True`` if the signature is correct.
        :rtype: bool

        :raises OpenSSL.crypto.Error: If the signature is invalid or there is a
            problem verifying the signature.
        zpkey must be a PKey instancer)r]rr_rKZX509_REQ_verifyr�rvr�)rnrxr�rDrDrEr8s
zX509Req.verifyN)r@rArBrCror�r�r�r�r�r�r�r�r�r�r7r8rDrDrDrEr$js
z4X509ReqType has been deprecated, use X509Req insteadc@seZdZdZdd�Zedd��Zdd�Zedd	��Zd
d�Z	dd
�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zdd�Zdd�Zd d!�Zd"d#�Zd$d%�Zd&d'�Zd(d)�Zd*d+�Zd,d-�Zd.d/�Zd0d1�Zd2d3�Zd4d5�Zd6d7�Zd8d9�Z d:d;�Z!d<d=�Z"d>d?�Z#d@dA�Z$dBS)Cr%z
    An X.509 certificate.
    cCs:tj�}t|tjk�tj|tj�|_t�|_	t�|_
dS)N)rKZX509_newrUrRrVrW�	X509_freer�rl�_issuer_invalidator�_subject_invalidator)rnr
rDrDrEro<s
z
X509.__init__cCs.|j|�}tj|tj�|_t�|_t�|_|S)N)	r�rRrWrKr�r�rlr�r�)r{r
�certrDrDrE�_from_raw_x509_ptrDs

zX509._from_raw_x509_ptrcCsddlm}t�}|||j�S)z�
        Export as a ``cryptography`` certificate.

        :rtype: ``cryptography.x509.Certificate``

        .. versionadded:: 17.1.0
        r)�_Certificate)r�r�rGr�)rnr�rFrDrDrEr�LszX509.to_cryptographycCs&t|tj�std��|�}|j|_|S)z�
        Construct based on a ``cryptography`` *crypto_cert*.

        :param crypto_key: A ``cryptography`` X.509 certificate.
        :type crypto_key: ``cryptography.x509.Certificate``

        :rtype: X509

        .. versionadded:: 17.1.0
        zMust be a certificate)r]r
ZCertificater_r�)r{Zcrypto_certr�rDrDrEr�Xs
zX509.from_cryptographycCs$t|t�std��tj|j|�dS)a	
        Set the version number of the certificate. Note that the
        version value is zero-based, eg. a value of 0 is V1.

        :param version: The version number of the certificate.
        :type version: :py:class:`int`

        :return: ``None``
        zversion must be an integerN)r]r}r_rKZX509_set_versionr�)rnr�rDrDrEr�ks

zX509.set_versioncCstj|j�S)z�
        Return the version number of the certificate.

        :return: The version number of the certificate.
        :rtype: :py:class:`int`
        )rKZX509_get_versionr�)rnrDrDrEr�zszX509.get_versioncCsFtjt�}tj|j�|_|jtjkr*t�tj	|jtj
�|_d|_|S)z{
        Get the public key of the certificate.

        :return: The public key.
        :rtype: :py:class:`PKey`
        T)rr�rK�X509_get_pubkeyr�rvrRrVr�rWrury)rnrxrDrDrEr��s
zX509.get_pubkeycCs2t|t�std��tj|j|j�}t|dk�dS)z�
        Set the public key of the certificate.

        :param pkey: The public key.
        :type pkey: :py:class:`PKey`

        :return: :py:data:`None`
        zpkey must be a PKey instancer?N)r]rr_rKZX509_set_pubkeyr�rvrU)rnrxrcrDrDrEr��s	
zX509.set_pubkeycCspt|t�std��|jr td��|js.td��tjt|��}|t	j
krNtd��tj|j|j
|�}t|dk�dS)a
        Sign the certificate with this key and digest type.

        :param pkey: The key to sign with.
        :type pkey: :py:class:`PKey`

        :param digest: The name of the message digest to use.
        :type digest: :py:class:`bytes`

        :return: :py:data:`None`
        zpkey must be a PKey instancezKey only has public partzKey is uninitializedzNo such digest methodrN)r]rr_ryr`rwrKr�r�rRrVZ	X509_signr�rvrU)rnrxr�Zevp_mdr�rDrDrEr7�s

z	X509.signcCs:tj|j�}tj|j�}|tjkr*td��tjtj	|��S)z�
        Return the signature algorithm used in the certificate.

        :return: The name of the algorithm.
        :rtype: :py:class:`bytes`

        :raises ValueError: If the signature algorithm is undefined.

        .. versionadded:: 0.13
        zUndefined signature algorithm)
rKZX509_get0_tbs_sigalgr�r��	algorithmr�r`rRrhZ
OBJ_nid2ln)rnZalgorr�rDrDrE�get_signature_algorithm�s

zX509.get_signature_algorithmcCs�tjt|��}|tjkr td��tjdtj�}tjdd�}t|�|d<tj	|j
|||�}t|dk�djdd�tj
||d�D��S)	a7
        Return the digest of the X509 object.

        :param digest_name: The name of the digest algorithm to use.
        :type digest_name: :py:class:`bytes`

        :return: The digest of the object, formatted as
            :py:const:`b":"`-delimited hex pairs.
        :rtype: :py:class:`bytes`
        zNo such digest methodzunsigned char[]zunsigned int[]r?r�:cSsg|]}t|�j��qSrD)r�upper)r�ZchrDrDrE�
<listcomp>�szX509.digest.<locals>.<listcomp>)rKr�r�rRrVr`rSZEVP_MAX_MD_SIZErTZX509_digestr�rUr�rX)rnZdigest_namer�r[r�Z
digest_resultrDrDrEr��s
zX509.digestcCstj|j�S)z�
        Return the hash of the X509 subject.

        :return: The hash of the subject.
        :rtype: :py:class:`bytes`
        )rKZX509_subject_name_hashr�)rnrDrDrE�subject_name_hash�szX509.subject_name_hashcCs�t|t�std��t|�dd�}t|t�s6|jd�}tjd�}tj	||�}|dtj
krztjtj|j
�|�}|r�t�nXtj|dtj
�}tj|d�|tj
kr�t�tj|tj�}tj|j
|�}t|dk�dS)z�
        Set the serial number of the certificate.

        :param serial: The new serial number.
        :type serial: :py:class:`int`

        :return: :py:data`None`
        zserial must be an integerr=Nr�zBIGNUM**rr?)r]�_integer_typesr_�hexr^r�rRrSrK�	BN_hex2bnrVZASN1_INTEGER_set�X509_get_serialNumberr�r��BN_to_ASN1_INTEGERrrW�ASN1_INTEGER_freeZX509_set_serialNumberrU)rn�serial�
hex_serial�
bignum_serialZsmall_serialrc�asn1_serialrDrDrE�set_serial_number�s&	




zX509.set_serial_numbercCs`tj|j�}tj|tj�}z4tj|�}ztj|�}t|d�}|Stj	|�XWdtj
|�XdS)zx
        Return the serial number of this certificate.

        :return: The serial number.
        :rtype: int
        r>N)rKrr�ZASN1_INTEGER_to_BNrRrVZ	BN_bn2hexrhr}r�r)rnr
rrZhexstring_serialr
rDrDrE�get_serial_numbers


zX509.get_serial_numbercCs.t|t�std��tj|j�}tj||�dS)z�
        Adjust the time stamp on which the certificate stops being valid.

        :param int amount: The number of seconds by which to adjust the
            timestamp.
        :return: ``None``
        zamount must be an integerN)r]r}r_rK�X509_get_notAfterr��X509_gmtime_adj)rn�amountZnotAfterrDrDrE�gmtime_adj_notAfter-s
zX509.gmtime_adj_notAftercCs.t|t�std��tj|j�}tj||�dS)z�
        Adjust the timestamp on which the certificate starts being valid.

        :param amount: The number of seconds by which to adjust the timestamp.
        :return: ``None``
        zamount must be an integerN)r]r}r_rK�X509_get_notBeforer�r)rnrZ	notBeforerDrDrE�gmtime_adj_notBefore;s
zX509.gmtime_adj_notBeforecCs(t|j��}tjj|d�}|tjj�kS)z�
        Check whether the certificate has expired.

        :return: ``True`` if the certificate has expired, ``False`` otherwise.
        :rtype: bool
        z
%Y%m%d%H%M%SZ)r��get_notAfter�datetimeZstrptimeZutcnow)rnZtime_stringZ	not_afterrDrDrE�has_expiredHszX509.has_expiredcCst||j��S)N)rkr�)rn�whichrDrDrE�_get_boundary_timeTszX509._get_boundary_timecCs|jtj�S)a

        Get the timestamp at which the certificate starts being valid.

        The timestamp is formatted as an ASN.1 TIME::

            YYYYMMDDhhmmssZ

        :return: A timestamp string, or ``None`` if there is none.
        :rtype: bytes or NoneType
        )rrKr)rnrDrDrE�
get_notBeforeWszX509.get_notBeforecCst||j�|�S)N)rdr�)rnrrbrDrDrE�_set_boundary_timedszX509._set_boundary_timecCs|jtj|�S)z�
        Set the timestamp at which the certificate starts being valid.

        The timestamp is formatted as an ASN.1 TIME::

            YYYYMMDDhhmmssZ

        :param bytes when: A timestamp string.
        :return: ``None``
        )rrKr)rnrbrDrDrE�
set_notBeforegszX509.set_notBeforecCs|jtj�S)a	
        Get the timestamp at which the certificate stops being valid.

        The timestamp is formatted as an ASN.1 TIME::

            YYYYMMDDhhmmssZ

        :return: A timestamp string, or ``None`` if there is none.
        :rtype: bytes or NoneType
        )rrKr)rnrDrDrErtszX509.get_notAftercCs|jtj|�S)z�
        Set the timestamp at which the certificate stops being valid.

        The timestamp is formatted as an ASN.1 TIME::

            YYYYMMDDhhmmssZ

        :param bytes when: A timestamp string.
        :return: ``None``
        )rrKr)rnrbrDrDrE�set_notAfter�szX509.set_notAftercCs0tjt�}||j�|_t|jtjk�||_|S)N)r"r�r�rsrUrRrVr�)rnrrqrDrDrE�	_get_name�s

zX509._get_namecCs0t|t�std��||j|j�}t|dk�dS)Nzname must be an X509Namer?)r]r"r_r�rsrU)rnrrqrcrDrDrE�	_set_name�s
zX509._set_namecCs|jtj�}|jj|�|S)a�
        Return the issuer of this certificate.

        This creates a new :class:`X509Name` that wraps the underlying issuer
        name field on the certificate. Modifying it will modify the underlying
        certificate, and will have the effect of modifying any other
        :class:`X509Name` that refers to this issuer.

        :return: The issuer of this certificate.
        :rtype: :class:`X509Name`
        )rrKZX509_get_issuer_namer�rr)rnrqrDrDrE�
get_issuer�szX509.get_issuercCs|jtj|�|jj�dS)z�
        Set the issuer of this certificate.

        :param issuer: The issuer.
        :type issuer: :py:class:`X509Name`

        :return: ``None``
        N)r rKZX509_set_issuer_namer�rt)rnr�rDrDrE�
set_issuer�s	zX509.set_issuercCs|jtj�}|jj|�|S)a�
        Return the subject of this certificate.

        This creates a new :class:`X509Name` that wraps the underlying subject
        name field on the certificate. Modifying it will modify the underlying
        certificate, and will have the effect of modifying any other
        :class:`X509Name` that refers to this subject.

        :return: The subject of this certificate.
        :rtype: :class:`X509Name`
        )rrK�X509_get_subject_namer�rr)rnrqrDrDrEr��szX509.get_subjectcCs|jtj|�|jj�dS)z�
        Set the subject of this certificate.

        :param subject: The subject.
        :type subject: :py:class:`X509Name`

        :return: ``None``
        N)r rKZX509_set_subject_namer�rt)rnr�rDrDrE�set_subject�s	zX509.set_subjectcCstj|j�S)z�
        Get the number of extensions on this certificate.

        :return: The number of extensions.
        :rtype: :py:class:`int`

        .. versionadded:: 0.12
        )rKZX509_get_ext_countr�)rnrDrDrE�get_extension_count�s	zX509.get_extension_countcCs@x:|D]2}t|t�std��tj|j|jd�}|st�qWdS)z�
        Add extensions to the certificate.

        :param extensions: The extensions to add.
        :type extensions: An iterable of :py:class:`X509Extension` objects.
        :return: ``None``
        z+One of the elements is not an X509Extensionr?Nr�)r]r#r`rKZX509_add_extr�r�r�)rnr�r�r�rDrDrEr��s

zX509.add_extensionscCsNtjt�}tj|j|�|_|jtjkr.td��tj	|j�}tj
|tj�|_|S)a�
        Get a specific extension of the certificate by index.

        Extensions on a certificate are kept in order. The index
        parameter selects which extension will be returned.

        :param int index: The index of the extension to retrieve.
        :return: The extension at the specified index.
        :rtype: :py:class:`X509Extension`
        :raises IndexError: If the extension index was out of bounds.

        .. versionadded:: 0.12
        zextension index out of bounds)r#r�rKZX509_get_extr�r�rRrV�
IndexErrorZX509_EXTENSION_duprWr�)rn�indexr�r�rDrDrE�
get_extension�s
zX509.get_extensionN)%r@rArBrCror�r�r�r�r�r�r�r�r7r�r�rrrrrrrrrrrrrr r!r"r�r$r%r�r(rDrDrDrEr%8sB		'




z.X509Type has been deprecated, use X509 insteadc@sReZdZdZejZejZej	Z
ejZej
ZejZejZejZejZejZejZdS)r&a
    Flags for X509 verification, used to change the behavior of
    :class:`X509Store`.

    See `OpenSSL Verification Flags`_ for details.

    .. _OpenSSL Verification Flags:
        https://www.openssl.org/docs/manmaster/man3/X509_VERIFY_PARAM_set_flags.html
    N)r@rArBrCrKZX509_V_FLAG_CRL_CHECKZ	CRL_CHECKZX509_V_FLAG_CRL_CHECK_ALLZ
CRL_CHECK_ALLZX509_V_FLAG_IGNORE_CRITICALZIGNORE_CRITICALZX509_V_FLAG_X509_STRICTZX509_STRICTZX509_V_FLAG_ALLOW_PROXY_CERTSZALLOW_PROXY_CERTSZX509_V_FLAG_POLICY_CHECKZPOLICY_CHECKZX509_V_FLAG_EXPLICIT_POLICYZEXPLICIT_POLICYZX509_V_FLAG_INHIBIT_MAPZINHIBIT_MAPZX509_V_FLAG_NOTIFY_POLICYZ
NOTIFY_POLICYZX509_V_FLAG_CHECK_SS_SIGNATUREZCHECK_SS_SIGNATUREZX509_V_FLAG_CB_ISSUER_CHECKZCB_ISSUER_CHECKrDrDrDrEr&s	c@s8eZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�ZdS)
r'a�
    An X.509 store.

    An X.509 store is used to describe a context in which to verify a
    certificate. A description of a context may include a set of certificates
    to trust, a set of certificate revocation lists, verification flags and
    more.

    An X.509 store, being only a description, cannot be used by itself to
    verify a certificate. To carry out the actual verification process, see
    :class:`X509StoreContext`.
    cCstj�}tj|tj�|_dS)N)rKZX509_STORE_newrRrWZX509_STORE_free�_store)rn�storerDrDrEro6szX509Store.__init__cCsPt|t�st��tj|j|j�dkrLtj�}tj|�}t	|tj
k�tj�dS)a�
        Adds a trusted certificate to this store.

        Adding a certificate with this method adds this certificate as a
        *trusted* certificate.

        :param X509 cert: The certificate to add to this store.

        :raises TypeError: If the certificate is not an :class:`X509`.

        :raises OpenSSL.crypto.Error: If OpenSSL was unhappy with your
            certificate.

        :return: ``None`` if the certificate was added successfully.
        rN)r]r%r_rKZX509_STORE_add_certr)r�ZERR_peek_errorZERR_GET_REASONrUZ!X509_R_CERT_ALREADY_IN_HASH_TABLEZERR_clear_error)rnr��codeZ
err_reasonrDrDrE�add_cert:s

zX509Store.add_certcCsttj|j|j�dk�dS)a�
        Add a certificate revocation list to this store.

        The certificate revocation lists added to a store will only be used if
        the associated flags are configured to check certificate revocation
        lists.

        .. versionadded:: 16.1.0

        :param CRL crl: The certificate revocation list to add to this store.
        :return: ``None`` if the certificate revocation list was added
            successfully.
        rN)rUrKZX509_STORE_add_crlr)�_crl)rn�crlrDrDrE�add_crlXszX509Store.add_crlcCsttj|j|�dk�dS)a�
        Set verification flags to this store.

        Verification flags can be combined by oring them together.

        .. note::

          Setting a verification flag sometimes requires clients to add
          additional information to the store, otherwise a suitable error will
          be raised.

          For example, in setting flags to enable CRL checking a
          suitable CRL must be added to the store otherwise an error will be
          raised.

        .. versionadded:: 16.1.0

        :param int flags: The verification flags to set on this store.
            See :class:`X509StoreFlags` for available constants.
        :return: ``None`` if the verification flags were successfully set.
        rN)rUrKZX509_STORE_set_flagsr))rn�flagsrDrDrE�	set_flagshszX509Store.set_flagscCsFtj�}tj|tj�}tj|t|jd���ttj	|j
|�dk�dS)a�
        Set the time against which the certificates are verified.

        Normally the current time is used.

        .. note::

          For example, you can determine if a certificate was valid at a given
          time.

        .. versionadded:: 17.0.0

        :param datetime vfy_time: The verification time to set on this store.
        :return: ``None`` if the verification time was successfully set.
        z%srN)rKZX509_VERIFY_PARAM_newrRrWZX509_VERIFY_PARAM_freeZX509_VERIFY_PARAM_set_timer}ZstrftimerUZX509_STORE_set1_paramr))rnZvfy_timeZparamrDrDrE�set_time�szX509Store.set_timeN)	r@rArBrCror,r/r1r2rDrDrDrEr'(sz8X509StoreType has been deprecated, use X509Store insteadcs eZdZdZ�fdd�Z�ZS)r(z�
    An exception raised when an error occurred while verifying a certificate
    using `OpenSSL.X509StoreContext.verify_certificate`.

    :ivar certificate: The certificate which caused verificate failure.
    :type certificate: :class:`X509`
    cstt|�j|�||_dS)N)r�r(ro�certificate)rn�messager3)r�rDrEro�szX509StoreContextError.__init__)r@rArBrCror�rDrD)r�rEr(�sc@s@eZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dS)r)a�
    An X.509 store context.

    An X.509 store context is used to carry out the actual verification process
    of a certificate in a described context. For describing such a context, see
    :class:`X509Store`.

    :ivar _store_ctx: The underlying X509_STORE_CTX structure used by this
        instance.  It is dynamically allocated and automatically garbage
        collected.
    :ivar _store: See the ``store`` ``__init__`` parameter.
    :ivar _cert: See the ``certificate`` ``__init__`` parameter.
    :param X509Store store: The certificates which will be trusted for the
        purposes of any verifications.
    :param X509 certificate: The certificate to be verified.
    cCs0tj�}tj|tj�|_||_||_|j�dS)N)	rKZX509_STORE_CTX_newrRrWZX509_STORE_CTX_free�
_store_ctxr)�_cert�_init)rnr*r3Z	store_ctxrDrDrEro�s
zX509StoreContext.__init__cCs.tj|j|jj|jjtj�}|dkr*t�dS)z�
        Set up the store context for a subsequent verification operation.

        Calling this method more than once without first calling
        :meth:`_cleanup` will leak memory.
        rN)	rKZX509_STORE_CTX_initr5r)r6r�rRrVr�)rn�retrDrDrEr7�szX509StoreContext._initcCstj|j�dS)z�
        Internally cleans up the store context.

        The store context can then be reused with a new call to :meth:`_init`.
        N)rKZX509_STORE_CTX_cleanupr5)rnrDrDrE�_cleanup�szX509StoreContext._cleanupcCs\tj|j�tj|j�ttjtjtj|j����g}tj|j�}tj	|�}t
j|�}t||�S)z�
        Convert an OpenSSL native context error failure into a Python
        exception.

        When a call to native OpenSSL X509_verify_cert fails, additional
        information about the failure can be obtained from the store context.
        )
rKZX509_STORE_CTX_get_errorr5ZX509_STORE_CTX_get_error_depthr�rRrhZX509_verify_cert_error_stringZX509_STORE_CTX_get_current_certZX509_dupr%r�r()rn�errorsr�r6�pycertrDrDrE�_exception_from_context�s	




z(X509StoreContext._exception_from_contextcCs
||_dS)z�
        Set the context's X.509 store.

        .. versionadded:: 0.15

        :param X509Store store: The store description which will be used for
            the purposes of any *future* verifications.
        N)r))rnr*rDrDrE�	set_store�s	zX509StoreContext.set_storecCs8|j�|j�tj|j�}|j�|dkr4|j��dS)a"
        Verify a certificate in a context.

        .. versionadded:: 0.15

        :raises X509StoreContextError: If an error occurred when validating a
          certificate in the context. Sets ``certificate`` attribute to
          indicate which certificate caused the error.
        rN)r9r7rKZX509_verify_certr5r<)rnr8rDrDrE�verify_certificate�sz#X509StoreContext.verify_certificateN)
r@rArBrCror7r9r<r=r>rDrDrDrEr)�s

cCsvt|t�r|jd�}t|�}|tkr<tj|tjtjtj�}n |t	krTtj
|tj�}ntd��|tjkrlt�t
j|�S)a
    Load a certificate (X509) from the string *buffer* encoded with the
    type *type*.

    :param type: The file type (one of FILETYPE_PEM, FILETYPE_ASN1)

    :param bytes buffer: The buffer the certificate is stored in

    :return: The X509 object
    r�z3type argument must be FILETYPE_PEM or FILETYPE_ASN1)r]r�r�rZrrKZPEM_read_bio_X509rRrVrZd2i_X509_bior`r�r%r�)r�rXrMr
rDrDrEr*s


cCsnt�}|tkrtj||j�}n<|tkr6tj||j�}n$|tkrRtj||jdd�}nt	d��|dksft
�t|�S)a
    Dump the certificate *cert* into a buffer string encoded with the type
    *type*.

    :param type: The file type (one of FILETYPE_PEM, FILETYPE_ASN1, or
        FILETYPE_TEXT)
    :param cert: The certificate to dump
    :return: The buffer with the dumped certificate in
    rzCtype argument must be FILETYPE_PEM, FILETYPE_ASN1, or FILETYPE_TEXTr?)rZrrKZPEM_write_bio_X509r�rZi2d_X509_biorZ
X509_print_exr`�AssertionErrorr\)r�r�rM�result_coderDrDrEr+2s
cCsPt�}|tkrtj}n|tkr&tj}ntd��|||j�}|dkrHt�t	|�S)z�
    Dump a public key to a buffer.

    :param type: The file type (one of :data:`FILETYPE_PEM` or
        :data:`FILETYPE_ASN1`).
    :param PKey pkey: The public key to dump
    :return: The buffer with the dumped key in it.
    :rtype: bytes
    z3type argument must be FILETYPE_PEM or FILETYPE_ASN1r?)
rZrrKZPEM_write_bio_PUBKEYrZi2d_PUBKEY_bior`rvr�r\)r�rxrMZ	write_bior@rDrDrEr,Ms
c	Cst�}t|t�std��|dk	rR|dkr0td��tjt|��}|tjkrXt	d��ntj}t
||�}|tkr�tj||j
|tjd|j|j�}|j�nh|tkr�tj||j
�}nP|tkr�tj|j
�tjkr�td��tjtj|j
�tj�}tj||d�}nt	d��t|dk�t|�S)a�
    Dump the private key *pkey* into a buffer string encoded with the type
    *type*.  Optionally (if *type* is :const:`FILETYPE_PEM`) encrypting it
    using *cipher* and *passphrase*.

    :param type: The file type (one of :const:`FILETYPE_PEM`,
        :const:`FILETYPE_ASN1`, or :const:`FILETYPE_TEXT`)
    :param PKey pkey: The PKey to dump
    :param cipher: (optional) if encrypted PEM format, the cipher to use
    :param passphrase: (optional) if encrypted PEM format, this can be either
        the passphrase to use, or a callback for providing the passphrase.

    :return: The buffer with the dumped key in
    :rtype: bytes
    zpkey must be a PKeyNzDif a value is given for cipher one must also be given for passphrasezInvalid cipher namerz-Only RSA keys are supported for FILETYPE_TEXTzCtype argument must be FILETYPE_PEM, FILETYPE_ASN1, or FILETYPE_TEXT)rZr]rr_rKZEVP_get_cipherbynamer�rRrVr`�_PassphraseHelperrZPEM_write_bio_PrivateKeyrv�callback�
callback_args�raise_if_problemrZi2d_PrivateKey_biorr�r�rWr�r�Z	RSA_printrUr\)	r�rxZcipher�
passphraserMZ
cipher_obj�helperr@rrDrDrEr-fs<





c@sjeZdZdZdddddddgZd	d
�Zdd�Zd
d�Zdd�Zdd�Z	dd�Z
dd�Zdd�Zdd�Z
dS)r.z#
    A certificate revocation.
    sunspecifieds
keyCompromisesCACompromisesaffiliationChangeds
supersededscessationOfOperationscertificateHoldcCstj�}tj|tj�|_dS)N)rKZX509_REVOKED_newrRrW�X509_REVOKED_free�_revoked)rn�revokedrDrDrEro�szRevoked.__init__cCsftjtj�tj�}tjd�}||d<tj||�}|s<td��tjtj|tj	�tj
�}tj|j|�dS)z�
        Set the serial number.

        The serial number is formatted as a hexadecimal number encoded in
        ASCII.

        :param bytes hex_str: The new serial number.

        :return: ``None``
        zBIGNUM**rzbad hex stringN)
rRrWrKr~rrSrr`rrVr	ZX509_REVOKED_set_serialNumberrH)rnZhex_strrZ
bignum_ptrZ	bn_resultr
rDrDrE�
set_serial�s
zRevoked.set_serialcCs@t�}tj|j�}t|tjk�tj||�}t|dk�t|�S)z�
        Get the serial number.

        The serial number is formatted as a hexadecimal number encoded in
        ASCII.

        :return: The serial number.
        :rtype: bytes
        r)	rZrKZX509_REVOKED_get0_serialNumberrHrUrRrVZi2a_ASN1_INTEGERr\)rnrMZasn1_intr�rDrDrE�
get_serial�s
zRevoked.get_serialcCs`xZttj|j��D]F}tj|j|�}tj|�}tj|�tjkrtj|�tj	|j|�PqWdS)N)
r�rK�X509_REVOKED_get_ext_countrH�X509_REVOKED_get_extr�r��NID_crl_reasonr�ZX509_REVOKED_delete_ext)rnr�r�r�rDrDrE�_delete_reason�s

zRevoked._delete_reasoncCs�|dkr|j�n�t|t�s&td��n�|j�jdd�}dd�|jD�j|�}tj	�}t
|tjk�tj
|tj�}tj||�}t
|tjk�|j�tj|jtj|dd�}t
|dk�dS)	a�
        Set the reason of this revocation.

        If :data:`reason` is ``None``, delete the reason instead.

        :param reason: The reason string.
        :type reason: :class:`bytes` or :class:`NoneType`

        :return: ``None``

        .. seealso::

            :meth:`all_reasons`, which gives you a list of all supported
            reasons which you might pass to this method.
        Nz$reason must be None or a byte string� �cSsg|]}|j��qSrD)�lower)r��rrDrDrErsz&Revoked.set_reason.<locals>.<listcomp>rr?)rOr]r^r_rR�replace�_crl_reasonsr'rKZASN1_ENUMERATED_newrUrRrVrWZASN1_ENUMERATED_freeZASN1_ENUMERATED_setZX509_REVOKED_add1_ext_i2drHrN)rn�reasonZreason_codeZnew_reason_extrcr�rDrDrE�
set_reason�s


zRevoked.set_reasoncCs�x�ttj|j��D]l}tj|j|�}tj|�}tj|�tjkrt�}tj	||dd�}|svtj
|tj|��}t|dk�t
|�SqWdS)a 
        Get the reason of this revocation.

        :return: The reason, or ``None`` if there is none.
        :rtype: bytes or NoneType

        .. seealso::

            :meth:`all_reasons`, which gives you a list of all supported
            reasons this method might return.
        rN)r�rKrLrHrMr�r�rNrZr�ZM_ASN1_OCTET_STRING_printr�rUr\)rnr�r�r�rMr�rDrDrE�
get_reasons
zRevoked.get_reasoncCs|jdd�S)a
        Return a list of all the supported reason strings.

        This list is a copy; modifying it does not change the supported reason
        strings.

        :return: A list of reason strings.
        :rtype: :class:`list` of :class:`bytes`
        N)rU)rnrDrDrE�all_reasons)s
zRevoked.all_reasonscCstj|j�}t||�S)z�
        Set the revocation timestamp.

        :param bytes when: The timestamp of the revocation,
            as ASN.1 TIME.
        :return: ``None``
        )rK� X509_REVOKED_get0_revocationDaterHrd)rnrb�dtrDrDrE�set_rev_date5szRevoked.set_rev_datecCstj|j�}t|�S)z�
        Get the revocation timestamp.

        :return: The timestamp of the revocation, as ASN.1 TIME.
        :rtype: bytes
        )rKrZrHrk)rnr[rDrDrE�get_rev_date@szRevoked.get_rev_dateN)r@rArBrCrUrorJrKrOrWrXrYr\r]rDrDrDrEr.�s"	$c@s|eZdZdZdd�Zdd�Zedd��Zdd	�Zd
d�Z	dd
�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zedefdd�ZdS)r/z(
    A certificate revocation list.
    cCstj�}tj|tj�|_dS)N)rKZX509_CRL_newrRrW�
X509_CRL_freer-)rnr.rDrDrEroPszCRL.__init__cCsddlm}t�}|||j�S)z�
        Export as a ``cryptography`` CRL.

        :rtype: ``cryptography.x509.CertificateRevocationList``

        .. versionadded:: 17.1.0
        r)�_CertificateRevocationList)r�r_rGr-)rnr_rFrDrDrEr�TszCRL.to_cryptographycCs&t|tj�std��|�}|j|_|S)a
        Construct based on a ``cryptography`` *crypto_crl*.

        :param crypto_crl: A ``cryptography`` certificate revocation list
        :type crypto_crl: ``cryptography.x509.CertificateRevocationList``

        :rtype: CRL

        .. versionadded:: 17.1.0
        z%Must be a certificate revocation list)r]r
ZCertificateRevocationListr_Z	_x509_crlr-)r{Z
crypto_crlr.rDrDrEr�bs
zCRL.from_cryptographycCsrg}tj|j�}xPttj|��D]>}tj||�}tj|�}tjt�}t	j
|tj�|_|j
|�q W|rnt|�SdS)aA
        Return the revocations in this certificate revocation list.

        These revocations will be provided by value, not by reference.
        That means it's okay to mutate them: it won't affect this CRL.

        :return: The revocations in this CRL.
        :rtype: :class:`tuple` of :class:`Revocation`
        N)rKZX509_CRL_get_REVOKEDr-r�Zsk_X509_REVOKED_numZsk_X509_REVOKED_value�Cryptography_X509_REVOKED_dupr.r�rRrWrGrHrp�tuple)rn�resultsZ
revoked_stackr�rIZrevoked_copyZpyrevrDrDrE�get_revokedus


zCRL.get_revokedcCs8tj|j�}t|tjk�tj|j|�}t|dk�dS)a9
        Add a revoked (by value not reference) to the CRL structure

        This revocation will be added by value, not by reference. That
        means it's okay to mutate it after adding: it won't affect
        this CRL.

        :param Revoked revoked: The new revocation.
        :return: ``None``
        rN)rKr`rHrUrRrVZX509_CRL_add0_revokedr-)rnrI�copyr�rDrDrE�add_revoked�szCRL.add_revokedcCsBtjtj|j��}t|tjk�tj|tj�}t	j
t	�}||_|S)zc
        Get the CRL's issuer.

        .. versionadded:: 16.1.0

        :rtype: X509Name
        )rKr�ZX509_CRL_get_issuerr-rUrRrVrWr�r"r�rs)rnZ_issuerr�rDrDrEr!�s
zCRL.get_issuercCsttj|j|�dk�dS)z�
        Set the CRL version.

        .. versionadded:: 16.1.0

        :param int version: The version of the CRL.
        :return: ``None``
        rN)rUrKZX509_CRL_set_versionr-)rnr�rDrDrEr��s	zCRL.set_versioncCst||j�|�S)N)rdr-)rnrrbrDrDrEr�szCRL._set_boundary_timecCs|jtj|�S)z�
        Set when the CRL was last updated.

        The timestamp is formatted as an ASN.1 TIME::

            YYYYMMDDhhmmssZ

        .. versionadded:: 16.1.0

        :param bytes when: A timestamp string.
        :return: ``None``
        )rrKZX509_CRL_get_lastUpdate)rnrbrDrDrE�set_lastUpdate�s
zCRL.set_lastUpdatecCs|jtj|�S)z�
        Set when the CRL will next be udpated.

        The timestamp is formatted as an ASN.1 TIME::

            YYYYMMDDhhmmssZ

        .. versionadded:: 16.1.0

        :param bytes when: A timestamp string.
        :return: ``None``
        )rrKZX509_CRL_get_nextUpdate)rnrbrDrDrE�set_nextUpdate�s
zCRL.set_nextUpdatecCs\tj|�}t|tjk�tj|jtj|j��tj	|j�tj
|j|j|�}t|dk�dS)a;
        Sign the CRL.

        Signing a CRL enables clients to associate the CRL itself with an
        issuer. Before a CRL is meaningful to other OpenSSL functions, it must
        be signed by an issuer.

        This method implicitly sets the issuer's name based on the issuer
        certificate and private key used to sign the CRL.

        .. versionadded:: 16.1.0

        :param X509 issuer_cert: The issuer's certificate.
        :param PKey issuer_key: The issuer's private key.
        :param bytes digest: The digest method to sign the CRL with.
        rN)rKr�rUrRrV�X509_CRL_set_issuer_namer-r#r�Z
X509_CRL_sort�
X509_CRL_signrv)rnr�Z
issuer_keyr�r�r�rDrDrEr7�s
zCRL.sign�dc
Cst|t�std��t|t�s$td��t|t�s6td��|tkrFtd��tj|�}|tj	krbt
d��tjtj��}t
|tj	k�tj�}t
|tj	k�tj|d�tj|j|�tj||ddd�tj|j|�tj|jtj|j��tj|j|j|�}	|	�st�t||�S)	a�
        Export the CRL as a string.

        :param X509 cert: The certificate used to sign the CRL.
        :param PKey key: The key used to sign the CRL.
        :param int type: The export format, either :data:`FILETYPE_PEM`,
            :data:`FILETYPE_ASN1`, or :data:`FILETYPE_TEXT`.
        :param int days: The number of days until the next update of this CRL.
        :param bytes digest: The name of the message digest to use (eg
            ``b"sha2566"``).
        :rtype: bytes
        zcert must be an X509 instancezkey must be a PKey instanceztype must be an integerzdigest must be providedzNo such digest methodr��<)r]r%r_rr}�_UNSPECIFIEDrKr�rRrVr`rPrQrUZ
ASN1_TIME_newrZX509_CRL_set_lastUpdater-ZX509_CRL_set_nextUpdaterhr#r�rirvr�r9)
rnr�r�r�Zdaysr�r�rMZsometimer�rDrDrE�export�s2




z
CRL.exportN)r@rArBrCror�r�r�rcrer!r�rrfrgr7rrmrnrDrDrDrEr/Ksz,CRLType has been deprecated, use CRL insteadc@s4eZdZdd�Zdd�Zdd�Zdd�Zd	d
�ZdS)r0cCsttj|j��S)zm
        Check if this NID_pkcs7_signed object

        :return: True if the PKCS7 is of type signed
        )�boolrKZPKCS7_type_is_signed�_pkcs7)rnrDrDrE�type_is_signed-	szPKCS7.type_is_signedcCsttj|j��S)zt
        Check if this NID_pkcs7_enveloped object

        :returns: True if the PKCS7 is of type enveloped
        )rorKZPKCS7_type_is_envelopedrp)rnrDrDrE�type_is_enveloped5	szPKCS7.type_is_envelopedcCsttj|j��S)z�
        Check if this NID_pkcs7_signedAndEnveloped object

        :returns: True if the PKCS7 is of type signedAndEnveloped
        )rorKZ PKCS7_type_is_signedAndEnvelopedrp)rnrDrDrE�type_is_signedAndEnveloped=	sz PKCS7.type_is_signedAndEnvelopedcCsttj|j��S)zi
        Check if this NID_pkcs7_data object

        :return: True if the PKCS7 is of type data
        )rorKZPKCS7_type_is_datarp)rnrDrDrE�type_is_dataE	szPKCS7.type_is_datacCs"tj|jj�}tj|�}tj|�S)zk
        Returns the type name of the PKCS7 structure

        :return: A string with the typename
        )rKr�rpr�r�rRrh)rnr�Zstring_typerDrDrE�
get_type_nameM	s
zPKCS7.get_type_nameN)r@rArBrqrrrsrtrurDrDrDrEr0,	s
z0PKCS7Type has been deprecated, use PKCS7 insteadc@sbeZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dd�Z
dd�Zdd�Zddd�Z
dS)r1z
    A PKCS #12 archive.
    cCsd|_d|_d|_d|_dS)N)rvr6�_cacerts�
_friendlyname)rnrDrDrErod	szPKCS12.__init__cCs|jS)z�
        Get the certificate in the PKCS #12 structure.

        :return: The certificate, or :py:const:`None` if there is none.
        :rtype: :py:class:`X509` or :py:const:`None`
        )r6)rnrDrDrE�get_certificatej	szPKCS12.get_certificatecCst|t�std��||_dS)z�
        Set the certificate in the PKCS #12 structure.

        :param cert: The new certificate, or :py:const:`None` to unset it.
        :type cert: :py:class:`X509` or :py:const:`None`

        :return: ``None``
        zcert must be an X509 instanceN)r]r%r_r6)rnr�rDrDrE�set_certificates	s	
zPKCS12.set_certificatecCs|jS)z�
        Get the private key in the PKCS #12 structure.

        :return: The private key, or :py:const:`None` if there is none.
        :rtype: :py:class:`PKey`
        )rv)rnrDrDrE�get_privatekey�	szPKCS12.get_privatekeycCst|t�std��||_dS)z�
        Set the certificate portion of the PKCS #12 structure.

        :param pkey: The new private key, or :py:const:`None` to unset it.
        :type pkey: :py:class:`PKey` or :py:const:`None`

        :return: ``None``
        zpkey must be a PKey instanceN)r]rr_rv)rnrxrDrDrE�set_privatekey�	s	
zPKCS12.set_privatekeycCs|jdk	rt|j�SdS)a
        Get the CA certificates in the PKCS #12 structure.

        :return: A tuple with the CA certificates in the chain, or
            :py:const:`None` if there are none.
        :rtype: :py:class:`tuple` of :py:class:`X509` or :py:const:`None`
        N)rvra)rnrDrDrE�get_ca_certificates�	s
zPKCS12.get_ca_certificatescCsB|dkrd|_n.t|�}x|D]}t|t�std��qW||_dS)a
        Replace or set the CA certificates within the PKCS12 object.

        :param cacerts: The new CA certificates, or :py:const:`None` to unset
            them.
        :type cacerts: An iterable of :py:class:`X509` or :py:const:`None`

        :return: ``None``
        Nz)iterable must only contain X509 instances)rv�listr]r%r_)rn�cacertsr�rDrDrE�set_ca_certificates�	s



zPKCS12.set_ca_certificatescCs2|dkrd|_nt|t�s(td|f��||_dS)z�
        Set the friendly name in the PKCS #12 structure.

        :param name: The new friendly name, or :py:const:`None` to unset.
        :type name: :py:class:`bytes` or :py:const:`None`

        :return: ``None``
        Nz+name must be a byte string or None (not %r))rwr]r^r_)rnrqrDrDrE�set_friendlyname�	s	
zPKCS12.set_friendlynamecCs|jS)z�
        Get the friendly name in the PKCS# 12 structure.

        :returns: The friendly name,  or :py:const:`None` if there is none.
        :rtype: :py:class:`bytes` or :py:const:`None`
        )rw)rnrDrDrE�get_friendlyname�	szPKCS12.get_friendlynameN�r?c
Cs�td|�}|jdkrtj}n4tj�}tj|tj�}x|jD]}tj||j	�q:W|dkr^tj}|j
}|dkrrtj}|jdkr�tj}n|jj}|jdkr�tj}n|jj	}tj
|||||tjtj||d�
}|tjkr�t�tj|tj�}t�}	tj|	|�t|	�S)a�
        Dump a PKCS12 object as a string.

        For more information, see the :c:func:`PKCS12_create` man page.

        :param passphrase: The passphrase used to encrypt the structure. Unlike
            some other passphrase arguments, this *must* be a string, not a
            callback.
        :type passphrase: :py:data:`bytes`

        :param iter: Number of times to repeat the encryption step.
        :type iter: :py:data:`int`

        :param maciter: Number of times to repeat the MAC step.
        :type maciter: :py:data:`int`

        :return: The string representation of the PKCS #12 structure.
        :rtype:
        rENr)�_text_to_bytes_and_warnrvrRrVrKZsk_X509_new_nullrW�sk_X509_freeZsk_X509_pushr�rwrvr6Z
PKCS12_createZ&NID_pbe_WithSHA1And3_Key_TripleDES_CBCr��PKCS12_freerZZi2d_PKCS12_bior\)
rnrE�iterZmaciterr~r��friendlynamerx�pkcs12rMrDrDrErn�	s:






z
PKCS12.export)Nr�r?)r@rArBrCrorxryrzr{r|rr�r�rnrDrDrDrEr1_	s	
	
	z2PKCS12Type has been deprecated, use PKCS12 insteadc@s@eZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dS)r2z!
    A Netscape SPKI object.
    cCstj�}tj|tj�|_dS)N)rKZNETSCAPE_SPKI_newrRrWZNETSCAPE_SPKI_free�_spki)rnZspkirDrDrEro
szNetscapeSPKI.__init__cCs^|jrtd��|jstd��tjt|��}|tjkr<td��tj|j	|j
|�}t|dk�dS)a
        Sign the certificate request with this key and digest type.

        :param pkey: The private key to sign with.
        :type pkey: :py:class:`PKey`

        :param digest: The message digest to use.
        :type digest: :py:class:`bytes`

        :return: ``None``
        zKey has only public partzKey is uninitializedzNo such digest methodrN)ryr`rwrKr�r�rRrVZNETSCAPE_SPKI_signr�rvrU)rnrxr�r�r�rDrDrEr7
s
zNetscapeSPKI.signcCs"tj|j|j�}|dkrt�dS)aY
        Verifies a signature on a certificate request.

        :param PKey key: The public key that signature is supposedly from.

        :return: ``True`` if the signature is correct.
        :rtype: bool

        :raises OpenSSL.crypto.Error: If the signature is invalid, or there was
            a problem verifying the signature.
        rT)rKZNETSCAPE_SPKI_verifyr�rvr�)rnr�ZanswerrDrDrEr88
szNetscapeSPKI.verifycCs$tj|j�}tj|�}tj|�|S)z�
        Generate a base64 encoded representation of this SPKI object.

        :return: The base64 encoded string.
        :rtype: :py:class:`bytes`
        )rKZNETSCAPE_SPKI_b64_encoder�rRrhr�)rnZencodedr�rDrDrE�
b64_encodeI
s

zNetscapeSPKI.b64_encodecCsDtjt�}tj|j�|_t|jtjk�tj	|jtj
�|_d|_|S)z|
        Get the public key of this certificate.

        :return: The public key.
        :rtype: :py:class:`PKey`
        T)rr�rKZNETSCAPE_SPKI_get_pubkeyr�rvrUrRrVrWrury)rnrxrDrDrEr�U
s
zNetscapeSPKI.get_pubkeycCs tj|j|j�}t|dk�dS)zv
        Set the public key of the certificate

        :param pkey: The public key
        :return: ``None``
        r?N)rKZNETSCAPE_SPKI_set_pubkeyr�rvrU)rnrxrcrDrDrEr�c
szNetscapeSPKI.set_pubkeyN)
r@rArBrCror7r8r�r�r�rDrDrDrEr2
sz>NetscapeSPKIType has been deprecated, use NetscapeSPKI insteadc@sBeZdZd
dd�Zedd��Zedd��Zefdd	�Zd
d�Z	dS)rAFcCs4|tkr|dk	rtd��||_||_||_g|_dS)Nz0only FILETYPE_PEM key format supports encryption)rr`�_passphrase�
_more_args�	_truncate�	_problems)rnr�rEZ	more_args�truncaterDrDrErov
sz_PassphraseHelper.__init__cCsF|jdkrtjSt|jt�r"tjSt|j�r:tjd|j�Std��dS)NZpem_password_cbz2Last argument must be a byte string or a callable.)	r�rRrVr]r^�callablerB�_read_passphraser_)rnrDrDrErB�
s

z_PassphraseHelper.callbackcCs>|jdkrtjSt|jt�r"|jSt|j�r2tjStd��dS)Nz2Last argument must be a byte string or a callable.)r�rRrVr]r^r�r_)rnrDrDrErC�
s

z_PassphraseHelper.callback_argscCs8|jr4yt|�Wn|k
r&YnX|jjd��dS)Nr)r��_exception_from_error_queue�pop)rnZ
exceptionTyperDrDrErD�
sz"_PassphraseHelper.raise_if_problemcCs�y�|jr|j|||�}n
|j|�}t|t�s4td��t|�|kr\|jrT|d|�}ntd��x(tt|��D]}|||d�||<qjWt|�Stk
r�}z|j	j
|�dSd}~XnXdS)NzString expectedz+passphrase returned by callback is too longr?r)r�r�r]r^r`rTr�r��	Exceptionr�rp)rnZbuf�sizeZrwflagZuserdatar�r��erDrDrEr��
s"

z"_PassphraseHelper._read_passphraseN)FF)
r@rArBror�rBrCrrDr�rDrDrDrErAu
s




rAcCs�t|t�r|jd�}t|�}|tkr<tj|tjtjtj�}n |t	krTtj
|tj�}ntd��|tjkrlt�t
jt
�}tj|tj�|_d|_|S)a<
    Load a public key from a buffer.

    :param type: The file type (one of :data:`FILETYPE_PEM`,
        :data:`FILETYPE_ASN1`).
    :param buffer: The buffer the key is stored in.
    :type buffer: A Python string object, either unicode or bytestring.
    :return: The PKey object.
    :rtype: :class:`PKey`
    r�z3type argument must be FILETYPE_PEM or FILETYPE_ASN1T)r]r�r�rZrrKZPEM_read_bio_PUBKEYrRrVrZd2i_PUBKEY_bior`r�rr�rWrurvry)r�rXrM�evp_pkeyrxrDrDrEr3�
s



cCs�t|t�r|jd�}t|�}t||�}|tkrNtj|tj	|j
|j�}|j�n |t
krftj|tj	�}ntd��|tj	kr~t�tjt�}tj|tj�|_|S)a�
    Load a private key (PKey) from the string *buffer* encoded with the type
    *type*.

    :param type: The file type (one of FILETYPE_PEM, FILETYPE_ASN1)
    :param buffer: The buffer the key is stored in
    :param passphrase: (optional) if encrypted PEM format, this can be
                       either the passphrase to use, or a callback for
                       providing the passphrase.

    :return: The PKey object
    r�z3type argument must be FILETYPE_PEM or FILETYPE_ASN1)r]r�r�rZrArrKZPEM_read_bio_PrivateKeyrRrVrBrCrDrZd2i_PrivateKey_bior`r�rr�rWrurv)r�rXrErMrFr�rxrDrDrEr4�
s 





cCsnt�}|tkrtj||j�}n<|tkr6tj||j�}n$|tkrRtj||jdd�}nt	d��t
|dk�t|�S)a
    Dump the certificate request *req* into a buffer string encoded with the
    type *type*.

    :param type: The file type (one of FILETYPE_PEM, FILETYPE_ASN1)
    :param req: The certificate request to dump
    :return: The buffer with the dumped certificate request in
    rzCtype argument must be FILETYPE_PEM, FILETYPE_ASN1, or FILETYPE_TEXT)rZrrKZPEM_write_bio_X509_REQr�rZi2d_X509_REQ_biorZX509_REQ_print_exr`rUr\)r�r�rMr@rDrDrEr5s	cCs�t|t�r|jd�}t|�}|tkr<tj|tjtjtj�}n |t	krTtj
|tj�}ntd��t|tjk�t
jt
�}tj|tj�|_|S)a
    Load a certificate request (X509Req) from the string *buffer* encoded with
    the type *type*.

    :param type: The file type (one of FILETYPE_PEM, FILETYPE_ASN1)
    :param buffer: The buffer the certificate request is stored in
    :return: The X509Req object
    r�z3type argument must be FILETYPE_PEM or FILETYPE_ASN1)r]r�r�rZrrKZPEM_read_bio_X509_REQrRrVrZd2i_X509_REQ_bior`rUr$r�rWr�r�)r�rXrMr�Zx509reqrDrDrEr6s	


c	Cs�td|�}tjt|��}|tjkr*td��tj�}tj|tj	�}tj
||�tj||t|��tj
|j�}t|dk�tjd|�}tjd�}tj||||j�}t|dk�tj||d�dd�S)z�
    Sign a data string using the given key and message digest.

    :param pkey: PKey to sign with
    :param data: data to be signed
    :param digest: message digest to use
    :return: signature

    .. versionadded:: 0.11
    rYzNo such digest methodrzunsigned char[]zunsigned int *r?N)r�rKr�r�rRrVr`�Cryptography_EVP_MD_CTX_newrW�Cryptography_EVP_MD_CTX_freeZEVP_SignInitZEVP_SignUpdaterTZ
EVP_PKEY_sizervrUrSZ
EVP_SignFinalrX)	rxrYr�r��md_ctxr�Zsignature_bufferZsignature_lengthZfinal_resultrDrDrEr79s 


cCs�td|�}tjt|��}|tjkr*td��tj|j�}t	|tjk�tj
|tj�}tj�}tj
|tj
�}tj||�tj||t|��tj||t|�|�}|dkr�t�dS)a�
    Verify the signature for a data string.

    :param cert: signing certificate (X509 object) corresponding to the
        private key which generated the signature.
    :param signature: signature returned by sign function
    :param data: data to be verified
    :param digest: message digest to use
    :return: ``None`` if the signature is correct, raise exception otherwise.

    .. versionadded:: 0.11
    rYzNo such digest methodr?N)r�rKr�r�rRrVr`r�r�rUrWrur�r�ZEVP_VerifyInitZEVP_VerifyUpdaterTZEVP_VerifyFinalr�)r�Z	signaturerYr�r�rxr�Z
verify_resultrDrDrEr8[s

cCsjt�}|tkrtj||j�}n8|tkr6tj||j�}n |tkrNtj||j�}nt	d��|dksbt
�t|�S)a
    Dump a certificate revocation list to a buffer.

    :param type: The file type (one of ``FILETYPE_PEM``, ``FILETYPE_ASN1``, or
        ``FILETYPE_TEXT``).
    :param CRL crl: The CRL to dump.

    :return: The buffer with the CRL.
    :rtype: bytes
    zCtype argument must be FILETYPE_PEM, FILETYPE_ASN1, or FILETYPE_TEXTr?)rZrrKZPEM_write_bio_X509_CRLr-rZi2d_X509_CRL_biorZX509_CRL_printr`r?r\)r�r.rMr8rDrDrEr9scCs�t|t�r|jd�}t|�}|tkr<tj|tjtjtj�}n |t	krTtj
|tj�}ntd��|tjkrlt�t
jt
�}tj|tj�|_|S)a
    Load Certificate Revocation List (CRL) data from a string *buffer*.
    *buffer* encoded with the type *type*.

    :param type: The file type (one of FILETYPE_PEM, FILETYPE_ASN1)
    :param buffer: The buffer the CRL is stored in

    :return: The PKey object
    r�z3type argument must be FILETYPE_PEM or FILETYPE_ASN1)r]r�r�rZrrKZPEM_read_bio_X509_CRLrRrVrZd2i_X509_CRL_bior`r�r/r�rWr^r-)r�rXrMr.r�rDrDrEr:�s




cCs�t|t�r|jd�}t|�}|tkr<tj|tjtjtj�}n |t	krTtj
|tj�}ntd��|tjkrlt�t
jt
�}tj|tj�|_|S)z�
    Load pkcs7 data from the string *buffer* encoded with the type
    *type*.

    :param type: The file type (one of FILETYPE_PEM or FILETYPE_ASN1)
    :param buffer: The buffer with the pkcs7 data.
    :return: The PKCS7 object
    r�z3type argument must be FILETYPE_PEM or FILETYPE_ASN1)r]r�r�rZrrKZPEM_read_bio_PKCS7rRrVrZ
d2i_PKCS7_bior`r�r0r�rWZ
PKCS7_freerp)r�rXrMZpkcs7Zpypkcs7rDrDrEr;�s	



cCs�td|�}t|t�r|jd�}t|�}|s0tj}tj|tj�}|tjkrNt	�tj
|tj�}tjd�}tjd�}tjd�}tj
|||||�}|s�t	�tj
|dtj�}y
t	�Wntk
r�YnX|dtjkr�d}ntjt�}tj
|dtj�|_|dtjk�rd}	d}
nPtj|d�}	tjd�}tj|d|�}tj||d�dd�}
|tjk�rdd}
g}
x8ttj|��D]&}tj||�}tj|�}|
j|��qxW|
�s�d}
tjt�}||_|	|_|
|_|
|_|S)	a�
    Load pkcs12 data from the string *buffer*. If the pkcs12 structure is
    encrypted, a *passphrase* must be included.  The MAC is always
    checked and thus required.

    See also the man page for the C function :py:func:`PKCS12_parse`.

    :param buffer: The buffer the certificate is stored in
    :param passphrase: (Optional) The password to decrypt the PKCS12 lump
    :returns: The PKCS12 object
    rEr�z
EVP_PKEY**zX509**zCryptography_STACK_OF_X509**rNzint*) r�r]r�r�rZrRrVrKZd2i_PKCS12_bior�rWr�rSZPKCS12_parser�rrr�rurvr%r�ZX509_alias_get0rXr�Zsk_X509_numZ
sk_X509_valuerpr1r6rvrw)rXrErMZp12rxr�r~Zparse_resultZpykeyr;r�Zfriendlyname_lengthZfriendlyname_bufferZ	pycacertsr�r
Zpycacertr�rDrDrEr<�sb











sutf8onlyii��)N)NN)N)N)tr�base64r�	functoolsr�operatorrrrrrr	Zsixr
rrr�rr�Zcryptographyr
Z)cryptography.hazmat.primitives.asymmetricrrZcryptography.utilsrZ
OpenSSL._utilrrRrrKrr�rr�rr�rrmrr�rZ_make_assert�__all__ZSSL_FILETYPE_PEMrZSSL_FILETYPE_ASN1rrr�rZEVP_PKEY_DSArZEVP_PKEY_DHZTYPE_DHZEVP_PKEY_ECZTYPE_ECr�rr�rUrGrJrZr\rdrk�objectrlrr@�DeprecationWarningZPKeyTyper�r r!r"ZX509NameTyper#ZX509ExtensionTyper$ZX509ReqTyper%ZX509Typer&r'Z
X509StoreTyper(r)r*r+r,r-r.r/ZCRLTyper0Z	PKCS7Typer1Z
PKCS12Typer2ZNetscapeSPKITyperAr3r4r5r6r7r8r9r:r;r<ZOpenSSL_add_all_algorithmsZSSL_load_error_stringsZ ASN1_STRING_set_default_mask_ascrDrDrDrE�<module>s$ (
	
	(
jBHUoh
;+[,/ZG!
$"$
`__init__.cpython-36.opt-1.pyc000064400000000161151730204570011672 0ustar003

�ft`
�@sdS)N�rrr�/usr/lib/python3.6/__init__.py�<module>stsafe.cpython-36.pyc000064400000002655151730204570010310 0ustar003

�F\N�@sBddlZddlmZddlmZejdedd�Gdd�d�Z	dS)	�N)�RLock)�SSLz/OpenSSL.tsafe is deprecated and will be removed�)�
stacklevelc!@s2eZdZdd�Zxd&D]Zed$eef�qWd%S)'�
ConnectioncGstj|�|_t�|_dS)N)�_sslrZ	_ssl_conn�_RLock�_lock)�self�args�r�/usr/lib/python3.6/tsafe.py�__init__szConnection.__init__�get_context�pending�send�write�recv�read�renegotiate�bind�listen�connect�accept�setblocking�fileno�shutdown�close�get_cipher_list�getpeername�getsockname�
getsockopt�
setsockopt�makefile�get_app_data�set_app_data�state_string�
sock_shutdown�get_peer_certificate�get_peer_cert_chain�	want_read�
want_write�set_connect_state�set_accept_state�
connect_ex�sendallz�def %s(self, *args):
            self._lock.acquire()
            try:
                return self._ssl_conn.%s(*args)
            finally:
                self._lock.release()
N)!rrrrrrrrrrrrrrrrrr r!r"r#r$r%r&r'r(r)r*r+r,r-r.r/)�__name__�
__module__�__qualname__r�f�execrrrr
r
sr)
�warningsZ	threadingrrZOpenSSLrr�warn�DeprecationWarningrrrrr
�<module>s
SSL.cpython-36.opt-1.pyc000064400000227404151730204570010607 0ustar003

�F\�[�R@sddlZddlZddlmZddlmZmZddlmZm	Z	ddl
mZddlm
Z
ddlmZddlmZmZmZmZdd	lmZmZmZmZmZ m!Z"m#Z$m%Z&m'Z(dd
l)m*Z*m+Z+m,Z,m-Z-m.Z.m/Z/ddd
ddddddddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\gRZ0ye1Z2Wn&e3k
�r�Gd]d^�d^e4�Z2YnXej5Z5ej6Z6ej7Z7ej8Z8ej9Z9ej:Z:ej;Z<ej=Z>d_Z?d`Z@daZAdbZBdcZCddZDejEZFejGZHejIZJejKZLejMZNejOZPejQZRejSZTejUZVejWZXejYZZej[Z\ej]Z^ej_Z`ejaZbejcZdejeZfejgZhejiZjejkZlejmZnejoZpejqZrejsZtejuZvejwZxejyZzej{Z|ej}Z~ejZ�ej�Z�ej�Z�ej�Z�ej�Z�ej�Z�ej�Z�ej�Z�ej�Z�ej�Z�ej�Z�ej�Z�ej�Z�ej�Z�ej�Z�ej�Z�ej��r$ej�Z�ej�Z�ej�Z�ej�Z�e0j�dedfdgdhg�ej�Z�ej�Z�ej�Z�ej�Z�ej�Z�ej�Z�ej�Z�ej�Z�ej�Z�ej�Z�ej�Z�ej�Z�ej�Z�didjdkdldmgZ�dngZ�doZ�dpZ�GdqdS�dSe��Z�eee��Z�e e��Z�GdrdT�dTe��Z�GdsdU�dUe��Z�GdtdV�dVe��Z�GdudW�dWe��Z�GdvdX�dXe��Z�Gdwdx�dxe4�Z�Gdydz�dze��Z�Gd{d|�d|e��Z�Gd}d~�d~e��Z�Gdd��d�e��Z�Gd�d��d�e��Z�Gd�d��d�e��Z�d�d��Z�d�dY�Z�d�d��Z�e�ej�d��Z�e�ej�d��Z�e�ej�d��Z�Gd�dZ�dZe4�Z�Gd�d[�d[e4�Z�ee�e�d�eσZ�Gd�d\�d\e4�Z�ee�e�d�eσZ�ejӃdS)��N)�platform)�wraps�partial)�count�chain)�WeakValueDictionary)�	errorcode)�
deprecated)�binary_type�
integer_types�int2byte�
indexbytes)	�UNSPECIFIED�exception_from_error_queue�ffi�lib�make_assert�native�path_string�text_to_bytes_and_warn�no_zero_allocator)�FILETYPE_PEM�_PassphraseHelper�PKey�X509Name�X509�	X509Store�OPENSSL_VERSION_NUMBER�SSLEAY_VERSION�
SSLEAY_CFLAGS�SSLEAY_PLATFORM�
SSLEAY_DIR�SSLEAY_BUILT_ON�
SENT_SHUTDOWN�RECEIVED_SHUTDOWN�SSLv2_METHOD�SSLv3_METHOD�
SSLv23_METHOD�TLSv1_METHOD�TLSv1_1_METHOD�TLSv1_2_METHOD�OP_NO_SSLv2�OP_NO_SSLv3�OP_NO_TLSv1�
OP_NO_TLSv1_1�
OP_NO_TLSv1_2�MODE_RELEASE_BUFFERS�OP_SINGLE_DH_USE�OP_SINGLE_ECDH_USE�OP_EPHEMERAL_RSA�OP_MICROSOFT_SESS_ID_BUG�OP_NETSCAPE_CHALLENGE_BUG�#OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUG�OP_SSLREF2_REUSE_CERT_TYPE_BUG�OP_MICROSOFT_BIG_SSLV3_BUFFER�OP_MSIE_SSLV2_RSA_PADDING�OP_SSLEAY_080_CLIENT_DH_BUG�
OP_TLS_D5_BUG�OP_TLS_BLOCK_PADDING_BUG�OP_DONT_INSERT_EMPTY_FRAGMENTS�OP_CIPHER_SERVER_PREFERENCE�OP_TLS_ROLLBACK_BUG�OP_PKCS1_CHECK_1�OP_PKCS1_CHECK_2�OP_NETSCAPE_CA_DN_BUG�"OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUG�OP_NO_COMPRESSION�OP_NO_QUERY_MTU�OP_COOKIE_EXCHANGE�OP_NO_TICKET�OP_ALL�VERIFY_PEER�VERIFY_FAIL_IF_NO_PEER_CERT�VERIFY_CLIENT_ONCE�VERIFY_NONE�SESS_CACHE_OFF�SESS_CACHE_CLIENT�SESS_CACHE_SERVER�SESS_CACHE_BOTH�SESS_CACHE_NO_AUTO_CLEAR�SESS_CACHE_NO_INTERNAL_LOOKUP�SESS_CACHE_NO_INTERNAL_STORE�SESS_CACHE_NO_INTERNAL�SSL_ST_CONNECT�
SSL_ST_ACCEPT�SSL_ST_MASK�SSL_CB_LOOP�SSL_CB_EXIT�SSL_CB_READ�SSL_CB_WRITE�SSL_CB_ALERT�SSL_CB_READ_ALERT�SSL_CB_WRITE_ALERT�SSL_CB_ACCEPT_LOOP�SSL_CB_ACCEPT_EXIT�SSL_CB_CONNECT_LOOP�SSL_CB_CONNECT_EXIT�SSL_CB_HANDSHAKE_START�SSL_CB_HANDSHAKE_DONE�Error�
WantReadError�WantWriteError�WantX509LookupError�ZeroReturnError�SysCallError�SSLeay_version�Session�Context�
Connectionc@seZdZdS)�_bufferN)�__name__�
__module__�__qualname__�rsrs�/usr/lib/python3.6/SSL.pyrovsro�������SSL_ST_INIT�
SSL_ST_BEFORE�	SSL_ST_OK�SSL_ST_RENEGOTIATEz"/etc/ssl/certs/ca-certificates.crtz /etc/pki/tls/certs/ca-bundle.crtz/etc/ssl/ca-bundle.pemz/etc/pki/tls/cacert.pemz1/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pemz/etc/ssl/certss$/opt/pyca/cryptography/openssl/certss'/opt/pyca/cryptography/openssl/cert.pemc@seZdZdZdS)rez4
    An error occurred in an `OpenSSL.SSL` API.
    N)rprqrr�__doc__rsrsrsrtre�sc@seZdZdS)rfN)rprqrrrsrsrsrtrf�sc@seZdZdS)rgN)rprqrrrsrsrsrtrg�sc@seZdZdS)rhN)rprqrrrsrsrsrtrhsc@seZdZdS)riN)rprqrrrsrsrsrtrisc@seZdZdS)rjN)rprqrrrsrsrsrtrj	sc@s eZdZdZdd�Zdd�ZdS)�_CallbackExceptionHelpera�
    A base class for wrapper classes that allow for intelligent exception
    handling in OpenSSL callbacks.

    :ivar list _problems: Any exceptions that occurred while executing in a
        context where they could not be raised in the normal way.  Typically
        this is because OpenSSL has called into some Python code and requires a
        return value.  The exceptions are saved to be raised later when it is
        possible to do so.
    cCs
g|_dS)N)�	_problems)�selfrsrsrt�__init__sz!_CallbackExceptionHelper.__init__cCs6|jr2y
t�Wntk
r$YnX|jjd��dS)z�
        Raise an exception from the OpenSSL error queue or that was previously
        captured whe running a callback.
        rN)r��_raise_current_errorre�pop)r�rsrsrt�raise_if_problems
z)_CallbackExceptionHelper.raise_if_problemN)rprqrrrr�r�rsrsrsrtr�
s
r�c@seZdZdZdd�ZdS)�
_VerifyHelperz^
    Wrap a callback such that it can be used as a certificate verification
    callback.
    cs2tj��t����fdd��}tjd|��_dS)Ncs�tj|�}tj|�tj|�}tj|�}tj|�}tj�}tj||�}t	j
|}y�|||||�}	Wn,tk
r�}
z�jj
|
�dSd}
~
XnX|	r�tj|tj�dSdSdS)Nrru)�_libZX509_STORE_CTX_get_current_cert�X509_up_refr�_from_raw_x509_ptrZX509_STORE_CTX_get_errorZX509_STORE_CTX_get_error_depthZ"SSL_get_ex_data_X509_STORE_CTX_idxZX509_STORE_CTX_get_ex_datarn�_reverse_mapping�	Exceptionr��appendZX509_STORE_CTX_set_errorZ	X509_V_OK)�okZ	store_ctxZx509�certZerror_numberZerror_depth�index�sslZ
connection�result�e)�callbackr�rsrt�wrapper2s$





z'_VerifyHelper.__init__.<locals>.wrapperzint (*)(int, X509_STORE_CTX *))r�r�r�_ffir�)r�r�r�rs)r�r�rtr�/s
z_VerifyHelper.__init__N)rprqrrrr�rsrsrsrtr�)sr�c@seZdZdZdd�ZdS)�_NpnAdvertiseHelperzT
    Wrap a callback such that it can be used as an NPN advertisement callback.
    cs2tj��t����fdd��}tjd|��_dS)Ncs�yntj|}�|�}djtjdd�|D���}tjdt|��tjd|�g|_|jdd|d<|jd|d<dSt	k
r�}z�j
j|�dSd}~XnXdS)	N�css|]}tt|��|fVqdS)N)r�len)�.0�prsrsrt�	<genexpr>asz@_NpnAdvertiseHelper.__init__.<locals>.wrapper.<locals>.<genexpr>zunsigned int *zunsigned char[]rrurv)rnr��joinr�
from_iterabler��newr��_npn_advertise_callback_argsr�r�r�)r��out�outlen�arg�conn�protos�protostrr�)r�r�rsrtr�Xs
z-_NpnAdvertiseHelper.__init__.<locals>.wrapperz>int (*)(SSL *, const unsigned char **, unsigned int *, void *))r�r�rr�r�)r�r�r�rs)r�r�rtr�Us

z_NpnAdvertiseHelper.__init__N)rprqrrrr�rsrsrsrtr�Psr�c@seZdZdZdd�ZdS)�_NpnSelectHelperzP
    Wrap a callback such that it can be used as an NPN selection callback.
    cs2tj��t����fdd��}tjd|��_dS)Nc
s�y�tj|}tj||�dd�}g}x<|r`t|d�}	|d|	d�}
|j|
�||	dd�}q&W�||�}tjdt|��tjd|�g|_|jdd|d<|jd|d<dSt	k
r�}z�j
j|�dSd}~XnXdS)Nrruzunsigned char *zunsigned char[]rv)rnr�r��bufferr
r�r�r��_npn_select_callback_argsr�r�)
r�r�r��in_�inlenr�r��instr�	protolist�length�proto�outstrr�)r�r�rsrtr��s$



z*_NpnSelectHelper.__init__.<locals>.wrapperz^int (*)(SSL *, unsigned char **, unsigned char *, const unsigned char *, unsigned int, void *))r�r�rr�r�)r�r�r�rs)r�r�rtr�~s

"z_NpnSelectHelper.__init__N)rprqrrrr�rsrsrsrtr�ysr�c@seZdZdZdd�ZdS)�_ALPNSelectHelperzQ
    Wrap a callback such that it can be used as an ALPN selection callback.
    cs2tj��t����fdd��}tjd|��_dS)Nc
s�y�tj|}tj||�dd�}g}x<|r`t|d�}	|d|	d�}
|j|
�||	dd�}q&W�||�}t|t�s~td��tj	dt
|��tj	d|�g|_|jdd|d<|jd|d<dStk
r�}z�j
j|�dSd}~XnXdS)Nrruz'ALPN callback must return a bytestring.zunsigned char *zunsigned char[]rv)rnr�r�r�r
r��
isinstance�_binary_type�	TypeErrorr�r��_alpn_select_callback_argsr�r�)
r�r�r�r�r�r�r�r�r�Zencoded_lenr�r�r�)r�r�rsrtr��s(




z+_ALPNSelectHelper.__init__.<locals>.wrapperz^int (*)(SSL *, unsigned char **, unsigned char *, const unsigned char *, unsigned int, void *))r�r�rr�r�)r�r�r�rs)r�r�rtr��s

$z_ALPNSelectHelper.__init__N)rprqrrrr�rsrsrsrtr��sr�c@seZdZdZdd�ZdS)�_OCSPServerCallbackHelpera�
    Wrap a callback such that it can be used as an OCSP callback for the server
    side.

    Annoyingly, OpenSSL defines one OCSP callback but uses it in two different
    ways. For servers, that callback is expected to retrieve some OCSP data and
    hand it to OpenSSL, and may return only SSL_TLSEXT_ERR_OK,
    SSL_TLSEXT_ERR_FATAL, and SSL_TLSEXT_ERR_NOACK. For clients, that callback
    is expected to check the OCSP data, and returns a negative value on error,
    0 if the response is not acceptable, or positive if it is. These are
    mutually exclusive return code behaviours, and they mean that we need two
    helpers so that we always return an appropriate error code if the user's
    code throws an exception.

    Given that we have to have two helpers anyway, these helpers are a bit more
    helpery than most: specifically, they hide a few more of the OpenSSL
    functions so that the user has an easier time writing these callbacks.

    This helper implements the server side.
    cs2tj��t����fdd��}tjd|��_dS)Ncs�y�tj|}|tjkr"tj|�}nd}�||�}t|t�sBtd��|sJdSt|�}t	j
|�}|tj||�dd�<t	j|||�dSt
k
r�}z�jj|�dSd}~XnXdS)Nz'OCSP callback must return a bytestring.rwrrv)rnr�r��NULL�from_handler�r�r�r�r�ZOPENSSL_mallocr�ZSSL_set_tlsext_status_ocsp_respr�r�r�)r��cdatar��data�	ocsp_dataZocsp_data_lengthZdata_ptrr�)r�r�rsrtr��s&





z3_OCSPServerCallbackHelper.__init__.<locals>.wrapperzint (*)(SSL *, void *))r�r�rr�r�)r�r�r�rs)r�r�rtr��s
'z"_OCSPServerCallbackHelper.__init__N)rprqrrrr�rsrsrsrtr��sr�c@seZdZdZdd�ZdS)�_OCSPClientCallbackHelpera�
    Wrap a callback such that it can be used as an OCSP callback for the client
    side.

    Annoyingly, OpenSSL defines one OCSP callback but uses it in two different
    ways. For servers, that callback is expected to retrieve some OCSP data and
    hand it to OpenSSL, and may return only SSL_TLSEXT_ERR_OK,
    SSL_TLSEXT_ERR_FATAL, and SSL_TLSEXT_ERR_NOACK. For clients, that callback
    is expected to check the OCSP data, and returns a negative value on error,
    0 if the response is not acceptable, or positive if it is. These are
    mutually exclusive return code behaviours, and they mean that we need two
    helpers so that we always return an appropriate error code if the user's
    code throws an exception.

    Given that we have to have two helpers anyway, these helpers are a bit more
    helpery than most: specifically, they hide a few more of the OpenSSL
    functions so that the user has an easier time writing these callbacks.

    This helper implements the client side.
    cs2tj��t����fdd��}tjd|��_dS)Nc	s�yxtj|}|tjkr"tj|�}nd}tjd�}tj||�}|dkrJd}ntj|d|�dd�}�|||�}t	t
|��Stk
r�}z�jj
|�dSd}~XnXdS)Nzunsigned char **rr�ru���)rnr�r�r�r�r�r�ZSSL_get_tlsext_status_ocsp_respr��int�boolr�r�r�)	r�r�r�r�Zocsp_ptrZocsp_lenr�Zvalidr�)r�r�rsrtr�9s


z3_OCSPClientCallbackHelper.__init__.<locals>.wrapperzint (*)(SSL *, void *))r�r�rr�r�)r�r�r�rs)r�r�rtr�6s
z"_OCSPClientCallbackHelper.__init__N)rprqrrrr�rsrsrsrtr� sr�cCsdd}t|t�s(t|dd�}|dk	r(|�}t|t�r6|}t|t�sJtd��n|dkr`td|f��|S)N�filenoz3argument must be an int, or have a fileno() method.rz1file descriptor cannot be a negative integer (%i))r�r�getattrr��
ValueError)�obj�fd�methrsrsrt�_asFileDescriptor[s



r�cCstjtj|��S)z�
    Return a string describing the version of OpenSSL in use.

    :param type: One of the :const:`SSLEAY_` constants defined in this module.
    )r��stringr�rk)�typersrsrtrknscs��fdd�}|S)a�
    Builds a decorator that ensures that functions that rely on OpenSSL
    functions that are not present in this build raise NotImplementedError,
    rather than AttributeError coming out of cryptography.

    :param flag: A cryptography flag that guards the functions, e.g.
        ``Cryptography_HAS_NEXTPROTONEG``.
    :param error: The string to be used in the exception if the flag is false.
    cs$�st|��fdd��}|S|SdS)Ncst���dS)N)�NotImplementedError)�args�kwargs)�errorrsrt�explode�sz<_make_requires.<locals>._requires_decorator.<locals>.explode)r)�funcr�)r��flagrsrt�_requires_decorator�sz+_make_requires.<locals>._requires_decoratorrs)r�r�r�rs)r�r�rt�_make_requiresws
	r�zNPN not availablezALPN not availablezSNI not availablec@seZdZdZdS)rlz�
    A class representing an SSL session.  A session defines certain connection
    parameters which may be re-used to speed up the setup of subsequent
    connections.

    .. versionadded:: 0.14
    N)rprqrrrrsrsrsrtrl�sc@s�eZdZdZededededede	diZ
edd	�e
j�D��Z
d
d�Z
ded
d�Zdd�Zdfdd�Zdd�Zdd�Zdd�Zdd�Zefdd�Zdd�Zdd �Zd!d"�Zefd#d$�Zd%d&�Zd'd(�Zd)d*�Zd+d,�Zd-d.�Z d/d0�Z!d1d2�Z"d3d4�Z#d5d6�Z$d7d8�Z%d9d:�Z&d;d<�Z'd=d>�Z(d?d@�Z)dAdB�Z*dCdD�Z+dEdF�Z,dGdH�Z-dIdJ�Z.dKdL�Z/dMdN�Z0dOdP�Z1dQdR�Z2e3dSdT��Z4dUdV�Z5e6dWdX��Z7e6dYdZ��Z8e9d[d\��Z:e9d]d^��Z;d_d`�Z<dgdadb�Z=dhdcdd�Z>dS)irmz�
    :class:`OpenSSL.SSL.Context` instances define the parameters for setting
    up new SSL connections.

    :param method: One of SSLv2_METHOD, SSLv3_METHOD, SSLv23_METHOD, or
        TLSv1_METHOD.
    ZSSLv2_methodZSSLv3_methodZ
SSLv23_methodZTLSv1_methodZTLSv1_1_methodZTLSv1_2_methodccs0|](\}}tt|d�dk	r|tt|�fVqdS)N)r�r�)r�Z
identifier�namersrsrtr��szContext.<genexpr>cCs&t|t�std��y|j|}Wntk
r<td��YnX|�}t|tjk�t	j
|�}t|tjk�tj|t	j�}yt	j
|d�}t|dk�Wntk
r�YnX||_d|_d|_d|_d|_d|_d|_d|_d|_d|_d|_d|_d|_d|_d|_d|_d|_d|_ |j!t	j"�dS)Nzmethod must be an integerzNo such protocolru)#r�rr��_methods�KeyErrorr��_openssl_assertr�r�r�ZSSL_CTX_new�gcZSSL_CTX_freeZSSL_CTX_set_ecdh_auto�AttributeError�_context�_passphrase_helper�_passphrase_callback�_passphrase_userdata�_verify_helper�_verify_callback�_info_callback�_tlsext_servername_callback�	_app_data�_npn_advertise_helper�_npn_advertise_callback�_npn_select_helper�_npn_select_callback�_alpn_select_helper�_alpn_select_callback�_ocsp_helper�_ocsp_callback�
_ocsp_data�set_modeZSSL_MODE_ENABLE_PARTIAL_WRITE)r��methodZmethod_funcZ
method_obj�context�resrsrsrtr��sF

zContext.__init__NcCsN|dkrtj}nt|�}|dkr(tj}nt|�}tj|j||�}|sJt�dS)aU
        Let SSL know where we can find trusted certificates for the certificate
        chain.  Note that the certificates have to be in PEM format.

        If capath is passed, it must be a directory prepared using the
        ``c_rehash`` tool included with OpenSSL.  Either, but not both, of
        *pemfile* or *capath* may be :data:`None`.

        :param cafile: In which file we can find the certificates (``bytes`` or
            ``unicode``).
        :param capath: In which directory we can find the certificates
            (``bytes`` or ``unicode``).

        :return: None
        N)r�r��_path_stringr�ZSSL_CTX_load_verify_locationsr�r�)r��cafile�capathZload_resultrsrsrt�load_verify_locations�szContext.load_verify_locationscs&t����fdd��}tt|ddd�S)Ncs�||�j�S)N)r�)�sizeZverify�userdata)r�r�rsrtr�sz'Context._wrap_callback.<locals>.wrapperT)Z	more_args�truncate)rrr)r�r�r�rs)r�r�rt�_wrap_callback
szContext._wrap_callbackcCs@t|�std��|j|�|_|jj|_tj|j|j�||_	dS)a�
        Set the passphrase callback.  This function will be called
        when a private key with a passphrase is loaded.

        :param callback: The Python callback to use.  This must accept three
            positional arguments.  First, an integer giving the maximum length
            of the passphrase it may return.  If the returned passphrase is
            longer than this, it will be truncated.  Second, a boolean value
            which will be true if the user should be prompted for the
            passphrase twice and the callback should verify that the two values
            supplied are equal. Third, the value given as the *userdata*
            parameter to :meth:`set_passwd_cb`.  The *callback* must return
            a byte string. If an error occurs, *callback* should return a false
            value (e.g. an empty string).
        :param userdata: (optional) A Python object which will be given as
                         argument to the callback
        :return: None
        zcallback must be callableN)
�callabler�r�r�r�r�r�ZSSL_CTX_set_default_passwd_cbr�r�)r�r�r�rsrsrt�
set_passwd_cbs
zContext.set_passwd_cbcCs�tj|j�}t|dk�tjtj��jd�}tjtj��jd�}|j	||�s�tjtj
��}tjtj��}|tkr�|t
kr�|jtt�dS)a�
        Specify that the platform provided CA certificates are to be used for
        verification purposes. This method has some caveats related to the
        binary wheels that cryptography (pyOpenSSL's primary dependency) ships:

        *   macOS will only load certificates using this method if the user has
            the ``openssl@1.1`` `Homebrew <https://brew.sh>`_ formula installed
            in the default location.
        *   Windows will not work.
        *   manylinux1 cryptography wheels will work on most common Linux
            distributions in pyOpenSSL 17.1.0 and above.  pyOpenSSL detects the
            manylinux1 wheel and attempts to load roots via a fallback path.

        :return: None
        ru�asciiN)r�Z SSL_CTX_set_default_verify_pathsr�r�r�r�ZX509_get_default_cert_dir_env�decodeZX509_get_default_cert_file_env�_check_env_vars_setZX509_get_default_cert_dirZX509_get_default_cert_file�_CRYPTOGRAPHY_MANYLINUX1_CA_DIR� _CRYPTOGRAPHY_MANYLINUX1_CA_FILE�_fallback_default_verify_paths�_CERTIFICATE_FILE_LOCATIONS�_CERTIFICATE_PATH_LOCATIONS)r��
set_result�dir_env_var�file_env_varZdefault_dirZdefault_filersrsrt�set_default_verify_paths-s 

z Context.set_default_verify_pathscCs tjj|�dk	ptjj|�dk	S)zp
        Check to see if the default cert dir/file environment vars are present.

        :return: bool
        N)�os�environ�get)r�rrrsrsrtr�^szContext._check_env_vars_setcCsRx$|D]}tjj|�r|j|�PqWx&|D]}tjj|�r,|jd|�Pq,WdS)aW
        Default verify paths are based on the compiled version of OpenSSL.
        However, when pyca/cryptography is compiled as a manylinux1 wheel
        that compiled location can potentially be wrong. So, like Go, we
        will try a predefined set of paths and attempt to load roots
        from there.

        :return: None
        N)r�path�isfiler��isdir)r�Z	file_pathZdir_pathr�r�rsrsrtr�is



z&Context._fallback_default_verify_pathscCs$t|�}tj|j|�}|s t�dS)z�
        Load a certificate chain from a file.

        :param certfile: The name of the certificate chain file (``bytes`` or
            ``unicode``).  Must be PEM encoded.

        :return: None
        N)r�r�Z"SSL_CTX_use_certificate_chain_filer�r�)r��certfiler�rsrsrt�use_certificate_chain_file}s
	
z"Context.use_certificate_chain_filecCs8t|�}t|t�std��tj|j||�}|s4t�dS)ah
        Load a certificate from a file

        :param certfile: The name of the certificate file (``bytes`` or
            ``unicode``).
        :param filetype: (optional) The encoding of the file, which is either
            :const:`FILETYPE_PEM` or :const:`FILETYPE_ASN1`.  The default is
            :const:`FILETYPE_PEM`.

        :return: None
        zfiletype must be an integerN)r�r�rr�r�ZSSL_CTX_use_certificate_filer�r�)r�r
�filetype�
use_resultrsrsrt�use_certificate_file�s
zContext.use_certificate_filecCs0t|t�std��tj|j|j�}|s,t�dS)zs
        Load a certificate from a X509 object

        :param cert: The X509 object
        :return: None
        zcert must be an X509 instanceN)r�rr�r�ZSSL_CTX_use_certificater��_x509r�)r�r�r
rsrsrt�use_certificate�s

zContext.use_certificatecCsDt|t�std��tj|j�}tj|j|�}|s@tj|�t	�dS)z�
        Add certificate to chain

        :param certobj: The X509 certificate object to add to the chain
        :return: None
        z certobj must be an X509 instanceN)
r�rr�r��X509_duprZSSL_CTX_add_extra_chain_certr�Z	X509_freer�)r�Zcertobj�copy�
add_resultrsrsrt�add_extra_chain_cert�s

zContext.add_extra_chain_certcCs |jdk	r|jjt�t�dS)N)r�r�rer�)r�rsrsrt�_raise_passphrase_exception�s
z#Context._raise_passphrase_exceptioncCsHt|�}|tkrt}nt|t�s(td��tj|j||�}|sD|j	�dS)aR
        Load a private key from a file

        :param keyfile: The name of the key file (``bytes`` or ``unicode``)
        :param filetype: (optional) The encoding of the file, which is either
            :const:`FILETYPE_PEM` or :const:`FILETYPE_ASN1`.  The default is
            :const:`FILETYPE_PEM`.

        :return: None
        zfiletype must be an integerN)
r��_UNSPECIFIEDrr�rr�r�ZSSL_CTX_use_PrivateKey_filer�r)r�Zkeyfilerr
rsrsrt�use_privatekey_file�s
zContext.use_privatekey_filecCs2t|t�std��tj|j|j�}|s.|j�dS)zs
        Load a private key from a PKey object

        :param pkey: The PKey object
        :return: None
        zpkey must be a PKey instanceN)r�rr�r�ZSSL_CTX_use_PrivateKeyr�Z_pkeyr)r�Zpkeyr
rsrsrt�use_privatekey�s

zContext.use_privatekeycCstj|j�st�dS)z�
        Check if the private key (loaded with :meth:`use_privatekey`) matches
        the certificate (loaded with :meth:`use_certificate`)

        :return: :data:`None` (raises :exc:`Error` if something's wrong)
        N)r�ZSSL_CTX_check_private_keyr�r�)r�rsrsrt�check_privatekey�szContext.check_privatekeycCs0tjtd|��}t|tjk�tj|j|�dS)a%
        Load the trusted certificates that will be sent to the client.  Does
        not actually imply any of the certificates are trusted; that must be
        configured separately.

        :param bytes cafile: The path to a certificates file in PEM format.
        :return: None
        r�N)r�ZSSL_load_client_CA_file�_text_to_bytes_and_warnr�r�r��SSL_CTX_set_client_CA_listr�)r�r�Zca_listrsrsrt�load_client_ca�s	zContext.load_client_cacCs*td|�}ttj|j|t|��dk�dS)aV
        Set the session id to *buf* within which a session can be reused for
        this Context object.  This is needed when doing session resumption,
        because there is no way for a stored session to know which Context
        object it is associated with.

        :param bytes buf: The session id.

        :returns: None
        �bufruN)rr�r�ZSSL_CTX_set_session_id_contextr�r�)r�rrsrsrt�set_session_ids
zContext.set_session_idcCs t|t�std��tj|j|�S)a�
        Set the behavior of the session cache used by all connections using
        this Context.  The previously set mode is returned.  See
        :const:`SESS_CACHE_*` for details about particular modes.

        :param mode: One or more of the SESS_CACHE_* flags (combine using
            bitwise or)
        :returns: The previously set caching mode.

        .. versionadded:: 0.14
        zmode must be an integer)r�rr�r�ZSSL_CTX_set_session_cache_moder�)r��modersrsrt�set_session_cache_modes
zContext.set_session_cache_modecCstj|j�S)z�
        Get the current session cache mode.

        :returns: The currently used cache mode.

        .. versionadded:: 0.14
        )r�ZSSL_CTX_get_session_cache_moder�)r�rsrsrt�get_session_cache_mode,szContext.get_session_cache_modecCsLt|t�std��t|�s"td��t|�|_|jj|_tj	|j
||j�dS)a�
        et the verification flags for this Context object to *mode* and specify
        that *callback* should be used for verification callbacks.

        :param mode: The verify mode, this should be one of
            :const:`VERIFY_NONE` and :const:`VERIFY_PEER`. If
            :const:`VERIFY_PEER` is used, *mode* can be OR:ed with
            :const:`VERIFY_FAIL_IF_NO_PEER_CERT` and
            :const:`VERIFY_CLIENT_ONCE` to further control the behaviour.
        :param callback: The Python callback to use.  This should take five
            arguments: A Connection object, an X509 object, and three integer
            variables, which are in turn potential error number, error depth
            and return code. *callback* should return True if verification
            passes and False otherwise.
        :return: None

        See SSL_CTX_set_verify(3SSL) for further details.
        zmode must be an integerzcallback must be callableN)r�rr�r�r�r�r�r�r�ZSSL_CTX_set_verifyr�)r�rr�rsrsrt�
set_verify6s


zContext.set_verifycCs$t|t�std��tj|j|�dS)z�
        Set the maximum depth for the certificate chain verification that shall
        be allowed for this Context object.

        :param depth: An integer specifying the verify depth
        :return: None
        zdepth must be an integerN)r�rr�r�ZSSL_CTX_set_verify_depthr�)r��depthrsrsrt�set_verify_depthSs
zContext.set_verify_depthcCstj|j�S)z�
        Retrieve the Context object's verify mode, as set by
        :meth:`set_verify`.

        :return: The verify mode
        )r�ZSSL_CTX_get_verify_moder�)r�rsrsrt�get_verify_mode`szContext.get_verify_modecCstj|j�S)z�
        Retrieve the Context object's verify depth, as set by
        :meth:`set_verify_depth`.

        :return: The verify depth
        )r�ZSSL_CTX_get_verify_depthr�)r�rsrsrt�get_verify_depthiszContext.get_verify_depthcCsht|�}tj|d�}|tjkr$t�tj|tj�}tj|tjtjtj�}tj|tj	�}tj
|j|�dS)z�
        Load parameters for Ephemeral Diffie-Hellman

        :param dhfile: The file to load EDH parameters from (``bytes`` or
            ``unicode``).

        :return: None
        �rN)r�r�ZBIO_new_filer�r�r�r�ZBIO_freeZPEM_read_bio_DHparamsZDH_freeZSSL_CTX_set_tmp_dhr�)r�Zdhfile�bioZdhrsrsrt�load_tmp_dhrs	
zContext.load_tmp_dhcCstj|j|j��dS)a

        Select a curve to use for ECDHE key exchange.

        :param curve: A curve object to use as returned by either
            :meth:`OpenSSL.crypto.get_elliptic_curve` or
            :meth:`OpenSSL.crypto.get_elliptic_curves`.

        :return: None
        N)r�ZSSL_CTX_set_tmp_ecdhr�Z
_to_EC_KEY)r�Zcurversrsrt�set_tmp_ecdh�s
zContext.set_tmp_ecdhcCsVtd|�}t|t�std��ttj|j|�dk�t|d�}t|j	�dddgk�dS)z�
        Set the list of ciphers to be used in this context.

        See the OpenSSL manual for more information (e.g.
        :manpage:`ciphers(1)`).

        :param bytes cipher_list: An OpenSSL cipher string.
        :return: None
        �cipher_listz"cipher_list must be a byte string.ruNZTLS_AES_256_GCM_SHA384ZTLS_CHACHA20_POLY1305_SHA256ZTLS_AES_128_GCM_SHA256)
rr��bytesr�r�r�ZSSL_CTX_set_cipher_listr�rn�get_cipher_list)r�r+Ztmpconnrsrsrt�set_cipher_list�s



zContext.set_cipher_listcCs�tj�}t|tjk�yjxd|D]\}t|t�s@tdt|�j	f��tj
|j�}t|tjk�tj||�}|stj
|�t�qWWn tk
r�tj|��YnXtj|j|�dS)a_
        Set the list of preferred client certificate signers for this server
        context.

        This list of certificate authorities will be sent to the client when
        the server requests a client certificate.

        :param certificate_authorities: a sequence of X509Names.
        :return: None

        .. versionadded:: 0.10
        z3client CAs must be X509Name objects, not %s objectsN)r�Zsk_X509_NAME_new_nullr�r�r�r�rr�r�rp�
X509_NAME_dup�_nameZsk_X509_NAME_push�X509_NAME_freer�r�Zsk_X509_NAME_freerr�)r�Zcertificate_authoritiesZ
name_stackZca_namerZpush_resultrsrsrt�set_client_ca_list�s$




zContext.set_client_ca_listcCs2t|t�std��tj|j|j�}t|dk�dS)ai
        Add the CA certificate to the list of preferred signers for this
        context.

        The list of certificate authorities will be sent to the client when the
        server requests a client certificate.

        :param certificate_authority: certificate authority's X509 certificate.
        :return: None

        .. versionadded:: 0.10
        z.certificate_authority must be an X509 instanceruN)r�rr�r�ZSSL_CTX_add_client_CAr�rr�)r�Zcertificate_authorityrrsrsrt�
add_client_ca�s

zContext.add_client_cacCs t|t�std��tj|j|�S)aQ
        Set the timeout for newly created sessions for this Context object to
        *timeout*.  The default value is 300 seconds. See the OpenSSL manual
        for more information (e.g. :manpage:`SSL_CTX_set_timeout(3)`).

        :param timeout: The timeout in (whole) seconds
        :return: The previous session timeout
        ztimeout must be an integer)r�rr�r�ZSSL_CTX_set_timeoutr�)r�Ztimeoutrsrsrt�set_timeout�s	
zContext.set_timeoutcCstj|j�S)z�
        Retrieve session timeout, as set by :meth:`set_timeout`. The default
        is 300 seconds.

        :return: The session timeout
        )r�ZSSL_CTX_get_timeoutr�)r�rsrsrt�get_timeout�szContext.get_timeoutcs6t���fdd��}tjd|�|_tj|j|j�dS)a�
        Set the information callback to *callback*. This function will be
        called from time to time during SSL handshakes.

        :param callback: The Python callback to use.  This should take three
            arguments: a Connection object and two integers.  The first integer
            specifies where in the SSL handshake the function was called, and
            the other the return code from a (possibly failed) internal
            function call.
        :return: None
        cs�tj|||�dS)N)rnr�)r��whereZreturn_code)r�rsrtr�sz*Context.set_info_callback.<locals>.wrapperzvoid (*)(const SSL *, int, int)N)rr�r�r�r�ZSSL_CTX_set_info_callbackr�)r�r�r�rs)r�rt�set_info_callbacks
zContext.set_info_callbackcCs|jS)zw
        Get the application data (supplied via :meth:`set_app_data()`)

        :return: The application data
        )r�)r�rsrsrt�get_app_dataszContext.get_app_datacCs
||_dS)z�
        Set the application data (will be returned from get_app_data())

        :param data: Any Python object
        :return: None
        N)r�)r�r�rsrsrt�set_app_dataszContext.set_app_datacCs.tj|j�}|tjkrdStjt�}||_|S)z�
        Get the certificate store for the context.  This can be used to add
        "trusted" certificates without using the
        :meth:`load_verify_locations` method.

        :return: A X509Store object or None if it does not have one.
        N)r�ZSSL_CTX_get_cert_storer�r�r�r�__new__Z_store)r�ZstoreZpystorersrsrt�get_cert_store&s

zContext.get_cert_storecCs t|t�std��tj|j|�S)z�
        Add options. Options set before are not cleared!
        This method should be used with the :const:`OP_*` constants.

        :param options: The options to add.
        :return: The new option bitmask.
        zoptions must be an integer)r�rr�r�ZSSL_CTX_set_optionsr�)r�Zoptionsrsrsrt�set_options7s
zContext.set_optionscCs t|t�std��tj|j|�S)z�
        Add modes via bitmask. Modes set before are not cleared!  This method
        should be used with the :const:`MODE_*` constants.

        :param mode: The mode to add.
        :return: The new mode bitmask.
        zmode must be an integer)r�rr�r�ZSSL_CTX_set_moder�)r�rrsrsrtr�Ds
zContext.set_modecs6t���fdd��}tjd|�|_tj|j|j�dS)a
        Specify a callback function to be called when clients specify a server
        name.

        :param callback: The callback function.  It will be invoked with one
            argument, the Connection instance.

        .. versionadded:: 0.13
        cs�tj|�dS)Nr)rnr�)r�Zalertr�)r�rsrtr�\sz7Context.set_tlsext_servername_callback.<locals>.wrapperzint (*)(SSL *, int *, void *)N)rr�r�r�r�Z&SSL_CTX_set_tlsext_servername_callbackr�)r�r�r�rs)r�rt�set_tlsext_servername_callbackQs

z&Context.set_tlsext_servername_callbackcCs,t|t�std��ttj|j|�dk�dS)z�
        Enable support for negotiating SRTP keying material.

        :param bytes profiles: A colon delimited list of protection profile
            names, like ``b'SRTP_AES128_CM_SHA1_80:SRTP_AES128_CM_SHA1_32'``.
        :return: None
        zprofiles must be a byte string.rN)r�r,r�r�r�ZSSL_CTX_set_tlsext_use_srtpr�)r�Zprofilesrsrsrt�set_tlsext_use_srtpfs
zContext.set_tlsext_use_srtpcCs,t|�|_|jj|_tj|j|jtj�dS)a�
        Specify a callback function that will be called when offering `Next
        Protocol Negotiation
        <https://technotes.googlecode.com/git/nextprotoneg.html>`_ as a server.

        :param callback: The callback function.  It will be invoked with one
            argument, the :class:`Connection` instance.  It should return a
            list of bytestrings representing the advertised protocols, like
            ``[b'http/1.1', b'spdy/2']``.

        .. versionadded:: 0.15
        N)	r�r�r�r�r�Z%SSL_CTX_set_next_protos_advertised_cbr�r�r�)r�r�rsrsrt�set_npn_advertise_callbackus

z"Context.set_npn_advertise_callbackcCs,t|�|_|jj|_tj|j|jtj�dS)a�
        Specify a callback function that will be called when a server offers
        Next Protocol Negotiation options.

        :param callback: The callback function.  It will be invoked with two
            arguments: the Connection, and a list of offered protocols as
            bytestrings, e.g. ``[b'http/1.1', b'spdy/2']``.  It should return
            one of those bytestrings, the chosen protocol.

        .. versionadded:: 0.15
        N)	r�r�r�r�r�Z SSL_CTX_set_next_proto_select_cbr�r�r�)r�r�rsrsrt�set_npn_select_callback�s

zContext.set_npn_select_callbackcCs>djtjdd�|D���}tjd|�}tj|j|t|��dS)a�
        Specify the protocols that the client is prepared to speak after the
        TLS connection has been negotiated using Application Layer Protocol
        Negotiation.

        :param protos: A list of the protocols to be offered to the server.
            This list should be a Python list of bytestrings representing the
            protocols to offer, e.g. ``[b'http/1.1', b'spdy/2']``.
        r�css|]}tt|��|fVqdS)N)rr�)r�r�rsrsrtr��sz*Context.set_alpn_protos.<locals>.<genexpr>zunsigned char[]N)	r�rr�r�r�r�ZSSL_CTX_set_alpn_protosr�r�)r�r�r��	input_strrsrsrt�set_alpn_protos�s
zContext.set_alpn_protoscCs,t|�|_|jj|_tj|j|jtj�dS)a�
        Specify a callback function that will be called on the server when a
        client offers protocols using ALPN.

        :param callback: The callback function.  It will be invoked with two
            arguments: the Connection, and a list of offered protocols as
            bytestrings, e.g ``[b'http/1.1', b'spdy/2']``.  It should return
            one of those bytestrings, the chosen protocol.
        N)	r�r�r�r�r�ZSSL_CTX_set_alpn_select_cbr�r�r�)r�r�rsrsrt�set_alpn_select_callback�s

z Context.set_alpn_select_callbackcCsh||_|j|_|dkr tj|_ntj|�|_tj|j	|j�}t
|dk�tj|j	|j�}t
|dk�dS)z�
        This internal helper does the common work for
        ``set_ocsp_server_callback`` and ``set_ocsp_client_callback``, which is
        almost all of it.
        Nru)r�r�r�r�r�r�Z
new_handler�ZSSL_CTX_set_tlsext_status_cbr�r�ZSSL_CTX_set_tlsext_status_arg)r��helperr��rcrsrsrt�_set_ocsp_callback�s
zContext._set_ocsp_callbackcCst|�}|j||�dS)a�
        Set a callback to provide OCSP data to be stapled to the TLS handshake
        on the server side.

        :param callback: The callback function. It will be invoked with two
            arguments: the Connection, and the optional arbitrary data you have
            provided. The callback must return a bytestring that contains the
            OCSP data to staple to the handshake. If no OCSP data is available
            for this connection, return the empty bytestring.
        :param data: Some opaque data that will be passed into the callback
            function when called. This can be used to avoid needing to do
            complex data lookups or to keep track of what context is being
            used. This parameter is optional.
        N)r�rF)r�r�r�rDrsrsrt�set_ocsp_server_callback�sz Context.set_ocsp_server_callbackcCst|�}|j||�dS)a�
        Set a callback to validate OCSP data stapled to the TLS handshake on
        the client side.

        :param callback: The callback function. It will be invoked with three
            arguments: the Connection, a bytestring containing the stapled OCSP
            assertion, and the optional arbitrary data you have provided. The
            callback must return a boolean that indicates the result of
            validating the OCSP data: ``True`` if the OCSP data is valid and
            the certificate can be trusted, or ``False`` if either the OCSP
            data is invalid or the certificate has been revoked.
        :param data: Some opaque data that will be passed into the callback
            function when called. This can be used to avoid needing to do
            complex data lookups or to keep track of what context is being
            used. This parameter is optional.
        N)r�rF)r�r�r�rDrsrsrt�set_ocsp_client_callback�sz Context.set_ocsp_client_callback)N)N)N)N)?rprqrrrr%r&r'r(r)r*r��dict�itemsr�r�r�r�rr�r�rrrrrrrrrrrrr r!r"r$r%r&r)r*r.r2r3r4r5r7r8r9r;r<r��
_requires_snir=r>�
_requires_npnr?r@�_requires_alpnrBrCrFrGrHrsrsrsrtrm�sn.
 
1


		 %		


z4ContextType has been deprecated, use Context insteadc@seZdZdZe�Zdxdd�Zdd�Zdd�Zd	d
�Z	dd�Z
ed
d��Zedd��Z
dd�Zdydd�ZeZdzdd�Zd{dd�ZeZd|dd�Zdd�Zdd�Zd d!�Zd"d#�Zd$d%�Zd&d'�Zd(d)�Zd*d+�Zd,d-�Zd.d/�Zd0d1�Zd2d3�Z d4d5�Z!d6d7�Z"d8d9�Z#d:d;�Z$d<d=�Z%d>d?�Z&d@dA�Z'dBdC�Z(dDdE�Z)dFdG�Z*dHdI�Z+d}dJdK�Z,dLdM�Z-dNdO�Z.dPdQ�Z/dRdS�Z0dTdU�Z1dVdW�Z2dXdY�Z3dZd[�Z4d\d]�Z5d^d_�Z6d`da�Z7dbdc�Z8ddde�Z9dfdg�Z:dhdi�Z;djdk�Z<dldm�Z=dndo�Z>e?dpdq��Z@eAdrds��ZBeAdtdu��ZCdvdw�ZDdS)~rnz
    NcCst|t�std��tj|j�}tj|tj�|_	tj
|j	tj�||_d|_d|_
d|_d|_||j|j	<|dkr�d|_tjtj��|_t|jtjk�tjtj��|_t|jtjk�tj|j	|j|j�n2d|_d|_||_tj|j	t|j��}t|dk�dS)z�
        Create a new Connection object, using the given OpenSSL.SSL.Context
        instance and socket.

        :param context: An SSL Context to use for this connection
        :param socket: The socket to use for transport layer
        z"context must be a Context instanceNru)r�rmr�r�ZSSL_newr�r�r�ZSSL_free�_sslZSSL_set_modeZSSL_MODE_AUTO_RETRYr�r�r�r�r��_socketZBIO_newZ	BIO_s_mem�	_into_sslr�r��	_from_sslZSSL_set_bioZ
SSL_set_fdr�)r�r��socketr�rrsrsrtr�s0
zConnection.__init__cCs0|jdkr td|jj|f��nt|j|�SdS)zy
        Look up attributes on the wrapped socket object if they are not found
        on the Connection object.
        Nz!'%s' object has no attribute '%s')rOr��	__class__rpr�)r�r�rsrsrt�__getattr__<s
zConnection.__getattr__cCsT|jjdk	r|jjj�|jjdk	r0|jjj�|jjdk	rH|jjj�|jjdk	r`|jjj�|jjdk	rx|jjj�tj||�}|tj	kr�t
��n�|tjkr�t��n�|tj
kr�t��n�|tjkr�t��n�|tjk�r<tj�dk�r4|dk�r(tdk�rtj�d}ntj}|dk�r(t|tj|���tdd��nt�n|tjk�rJnt�dS)NrZwin32ruzUnexpected EOFr�)r�r�r�r�r�r�r�r�Z
SSL_get_errorZSSL_ERROR_WANT_READrfZSSL_ERROR_WANT_WRITErgZSSL_ERROR_ZERO_RETURNriZSSL_ERROR_WANT_X509_LOOKUPrhZSSL_ERROR_SYSCALLZERR_peek_errorrr�Zgetwinerror�errnorjrrr�ZSSL_ERROR_NONE)r�r�r�r�rUrsrsrt�_raise_ssl_errorHs@






zConnection._raise_ssl_errorcCs|jS)zh
        Retrieve the :class:`Context` object associated with this
        :class:`Connection`.
        )r�)r�rsrsrt�get_contextqszConnection.get_contextcCs,t|t�std��tj|j|j�||_dS)z�
        Switch this connection to a new session context.

        :param context: A :class:`Context` instance giving the new session
            context to use.
        z"context must be a Context instanceN)r�rmr�r�ZSSL_set_SSL_CTXrNr�)r�r�rsrsrt�set_contextxs
zConnection.set_contextcCs(tj|jtj�}|tjkrdStj|�S)z�
        Retrieve the servername extension value if provided in the client hello
        message, or None if there wasn't one.

        :return: A byte string giving the server name or :data:`None`.

        .. versionadded:: 0.13
        N)r�ZSSL_get_servernamerNZTLSEXT_NAMETYPE_host_namer�r�r�)r�r�rsrsrt�get_servername�s


zConnection.get_servernamecCs6t|t�std��nd|kr$td��tj|j|�dS)z�
        Set the value of the servername extension to send in the client hello.

        :param name: A byte string giving the name.

        .. versionadded:: 0.13
        zname must be a byte string�zname must not contain NUL byteN)r�r,r�r�ZSSL_set_tlsext_host_namerN)r�r�rsrsrt�set_tlsext_host_name�s
	

zConnection.set_tlsext_host_namecCstj|j�S)z�
        Get the number of bytes that can be safely read from the SSL buffer
        (**not** the underlying transport buffer).

        :return: The number of bytes available in the receive buffer.
        )r�ZSSL_pendingrN)r�rsrsrt�pending�szConnection.pendingrcCsztd|�}t|t�r|j�}t|t�r.t|�}t|t�s@td��t|�dkrTt	d��t
j|j|t|��}|j
|j|�|S)a�
        Send data on the connection. NOTE: If you get one of the WantRead,
        WantWrite or WantX509Lookup exceptions on this, you have to call the
        method again with the SAME buffer.

        :param buf: The string, buffer or memoryview to send
        :param flags: (optional) Included for compatibility with the socket
                      API, the value is ignored
        :return: The number of bytes written
        rz0data must be a memoryview, buffer or byte stringi���z,Cannot send more than 2**31-1 bytes at once.)rr��
memoryview�tobytesro�strr,r�r�r�r��	SSL_writerNrV)r�r�flagsr�rsrsrt�send�s



zConnection.sendcCs�td|�}t|t�r|j�}t|t�r.t|�}t|t�s@td��t|�}d}t	j
d|�}x@|r�tj|j
||t|d��}|j|j
|�||7}||8}qZWdS)a�
        Send "all" data on the connection. This calls send() repeatedly until
        all data is sent. If an error occurs, it's impossible to tell how much
        data has been sent.

        :param buf: The string, buffer or memoryview to send
        :param flags: (optional) Included for compatibility with the socket
                      API, the value is ignored
        :return: The number of bytes written
        rz/buf must be a memoryview, buffer or byte stringrzchar[]i���N)rr�r]r^ror_r,r�r�r�r�r�r`rN�minrV)r�rraZleft_to_sendZ
total_sentr�r�rsrsrt�sendall�s$



zConnection.sendallcCs`td|�}|dk	r.|tj@r.tj|j||�}ntj|j||�}|j|j|�tj	||�dd�S)a
        Receive data on the connection.

        :param bufsiz: The maximum number of bytes to read
        :param flags: (optional) The only supported flag is ``MSG_PEEK``,
            all other flags are ignored.
        :return: The string read from the Connection
        zchar[]N)
�_no_zero_allocatorrR�MSG_PEEKr��SSL_peekrN�SSL_readrVr�r�)r��bufsizrarr�rsrsrt�recv�s	
zConnection.recvcCs�|dkrt|�}nt|t|��}td|�}|dk	rN|tj@rNtj|j||�}ntj|j||�}|j	|j|�t
tj||��|d|�<|S)ae
        Receive data on the connection and copy it directly into the provided
        buffer, rather than creating a new string.

        :param buffer: The buffer to copy into.
        :param nbytes: (optional) The maximum number of bytes to read into the
            buffer. If not present, defaults to the size of the buffer. If
            larger than the size of the buffer, is reduced to the size of the
            buffer.
        :param flags: (optional) The only supported flag is ``MSG_PEEK``,
            all other flags are ignored.
        :return: The number of bytes read into the buffer.
        Nzchar[])
r�rcrerRrfr�rgrNrhrVr]r�r�)r�r��nbytesrarr�rsrsrt�	recv_intos

zConnection.recv_intocCsVtj|�rLtj|�rt��qRtj|�r.t��qRtj|�rBtd��qRtd��nt�dS)N�BIO_should_io_specialzunknown bio failure)	r�ZBIO_should_retryZBIO_should_readrfZBIO_should_writergrmr�r�)r�r(r�rsrsrt�_handle_bio_errors(s





zConnection._handle_bio_errorscCsh|jdkrtd��t|t�s$td��td|�}tj|j||�}|dkrT|j|j|�tj	||�dd�S)a�
        If the Connection was created with a memory BIO, this method can be
        used to read bytes from the write end of that memory BIO.  Many
        Connection methods will add bytes which must be read in this manner or
        the buffer will eventually fill up and the Connection will be able to
        take no further actions.

        :param bufsiz: The maximum number of bytes to read
        :return: The string read.
        NzConnection sock was not Nonezbufsiz must be an integerzchar[]r)
rQr�r�rrer�ZBIO_readrnr�r�)r�rirr�rsrsrt�bio_read:s


zConnection.bio_readcCsJtd|�}|jdkrtd��tj|j|t|��}|dkrF|j|j|�|S)aj
        If the Connection was created with a memory BIO, this method can be
        used to add bytes to the read end of that memory BIO.  The Connection
        can then read the bytes (for example, in response to a call to
        :meth:`recv`).

        :param buf: The string to put into the memory BIO.
        :return: The number of bytes written
        rNzConnection sock was not Noner)rrPr�r�Z	BIO_writer�rn)r�rr�rsrsrt�	bio_writeRs


zConnection.bio_writecCs$|j�s ttj|j�dk�dSdS)z�
        Renegotiate the session.

        :return: True if the renegotiation can be started, False otherwise
        :rtype: bool
        ruTF)�renegotiate_pendingr�r�ZSSL_renegotiaterN)r�rsrsrt�renegotiatefszConnection.renegotiatecCstj|j�}|j|j|�dS)a
        Perform an SSL handshake (usually called after :meth:`renegotiate` or
        one of :meth:`set_accept_state` or :meth:`set_accept_state`). This can
        raise the same exceptions as :meth:`send` and :meth:`recv`.

        :return: None.
        N)r�ZSSL_do_handshakerNrV)r�r�rsrsrt�do_handshakerszConnection.do_handshakecCstj|j�dkS)z�
        Check if there's a renegotiation in progress, it will return False once
        a renegotiation is finished.

        :return: Whether there's a renegotiation in progress
        :rtype: bool
        ru)r�ZSSL_renegotiate_pendingrN)r�rsrsrtrq}szConnection.renegotiate_pendingcCstj|j�S)z�
        Find out the total number of renegotiations.

        :return: The number of renegotiations.
        :rtype: int
        )r�ZSSL_total_renegotiationsrN)r�rsrsrt�total_renegotiations�szConnection.total_renegotiationscCstj|j�|jj|�S)a4
        Call the :meth:`connect` method of the underlying socket and set up SSL
        on the socket, using the :class:`Context` object supplied to this
        :class:`Connection` object at creation.

        :param addr: A remote address
        :return: What the socket's connect method returns
        )r��SSL_set_connect_staterNrO�connect)r��addrrsrsrtrv�s	zConnection.connectcCs|jj}|j�||�S)a�
        Call the :meth:`connect_ex` method of the underlying socket and set up
        SSL on the socket, using the Context object supplied to this Connection
        object at creation. Note that if the :meth:`connect_ex` method of the
        socket doesn't return 0, SSL won't be initialized.

        :param addr: A remove address
        :return: What the socket's connect_ex method returns
        )rO�
connect_ex�set_connect_state)r�rwrxrsrsrtrx�s
zConnection.connect_excCs*|jj�\}}t|j|�}|j�||fS)a�
        Call the :meth:`accept` method of the underlying socket and set up SSL
        on the returned socket, using the Context object supplied to this
        :class:`Connection` object at creation.

        :return: A *(conn, addr)* pair where *conn* is the new
            :class:`Connection` object created, and *address* is as returned by
            the socket's :meth:`accept`.
        )rO�acceptrnr��set_accept_state)r�Zclientrwr�rsrsrtrz�s
zConnection.acceptcCs$|jdkrtd��tj|jd�dS)z�
        If the Connection was created with a memory BIO, this method can be
        used to indicate that *end of file* has been reached on the read end of
        that memory BIO.

        :return: None
        NzConnection sock was not Noner)rQr�r�ZBIO_set_mem_eof_returnrP)r�rsrsrt�bio_shutdown�s
zConnection.bio_shutdowncCs8tj|j�}|dkr$|j|j|�n|dkr0dSdSdS)aQ
        Send the shutdown message to the Connection.

        :return: True if the shutdown completed successfully (i.e. both sides
                 have sent closure alerts), False otherwise (in which case you
                 call :meth:`recv` or :meth:`send` when the connection becomes
                 readable/writeable).
        rTFN)r�ZSSL_shutdownrNrV)r�r�rsrsrt�shutdown�s	zConnection.shutdowncCsFg}x<t�D]2}tj|j|�}|tjkr*P|jttj|���qW|S)z�
        Retrieve the list of ciphers used by the Connection object.

        :return: A list of native cipher strings.
        )	rr�ZSSL_get_cipher_listrNr�r�r��_nativer�)r�Zciphers�ir�rsrsrtr-�s
zConnection.get_cipher_listcCs�tj|j�}|tjkrgSg}x^ttj|��D]L}tj||�}tj|�}t	|tjk�t
jt
�}tj|tj
�|_|j|�q.W|S)a�
        Get CAs whose certificates are suggested for client authentication.

        :return: If this is a server connection, the list of certificate
            authorities that will be sent or has been sent to the client, as
            controlled by this :class:`Connection`'s :class:`Context`.

            If this is a client connection, the list will be empty until the
            connection with the server is established.

        .. versionadded:: 0.10
        )r�ZSSL_get_client_CA_listrNr�r��rangeZsk_X509_NAME_numZsk_X509_NAME_valuer/r�rr:r�r1r0r�)r�Zca_namesr�rr�rZpynamersrsrt�get_client_ca_list�s



zConnection.get_client_ca_listcOstd��dS)z�
        The makefile() method is not implemented, since there is no dup
        semantics for SSL connections

        :raise: NotImplementedError
        z1Cannot make file object of OpenSSL.SSL.ConnectionN)r�)r�r�r�rsrsrt�makefileszConnection.makefilecCs|jS)zr
        Retrieve application data as set by :meth:`set_app_data`.

        :return: The application data
        )r�)r�rsrsrtr8szConnection.get_app_datacCs
||_dS)zg
        Set application data

        :param data: The application data
        :return: None
        N)r�)r�r�rsrsrtr9szConnection.set_app_datacCstj|j�S)z�
        Get the shutdown state of the Connection.

        :return: The shutdown state, a bitvector of SENT_SHUTDOWN,
            RECEIVED_SHUTDOWN.
        )r�ZSSL_get_shutdownrN)r�rsrsrt�get_shutdownszConnection.get_shutdowncCs$t|t�std��tj|j|�dS)z�
        Set the shutdown state of the Connection.

        :param state: bitvector of SENT_SHUTDOWN, RECEIVED_SHUTDOWN.
        :return: None
        zstate must be an integerN)r�rr�r�ZSSL_set_shutdownrN)r��statersrsrt�set_shutdown&s
zConnection.set_shutdowncCstjtj|j��S)z�
        Retrieve a verbose string detailing the state of the Connection.

        :return: A string representing the state
        :rtype: bytes
        )r�r�r�ZSSL_state_string_longrN)r�rsrsrt�get_state_string2szConnection.get_state_stringcCsZtj|j�}|tjkrdStj|jtjd�}td|�}tj|j||�tj||�dd�S)z�
        Retrieve the random value used with the server hello message.

        :return: A string representing the state
        Nrzunsigned char[])r��SSL_get_sessionrNr�r�ZSSL_get_server_randomrer�)r��sessionr��outprsrsrt�
server_random;s

zConnection.server_randomcCsZtj|j�}|tjkrdStj|jtjd�}td|�}tj|j||�tj||�dd�S)z�
        Retrieve the random value used with the client hello message.

        :return: A string representing the state
        Nrzunsigned char[])r�r�rNr�r�ZSSL_get_client_randomrer�)r�r�r�r�rsrsrt�
client_randomJs

zConnection.client_randomcCsVtj|j�}|tjkrdStj|tjd�}td|�}tj|||�tj||�dd�S)zz
        Retrieve the value of the master key for this session.

        :return: A string representing the state
        Nrzunsigned char[])r�r�rNr�r�ZSSL_SESSION_get_master_keyrer�)r�r�r�r�rsrsrt�
master_keyZs

zConnection.master_keyc		Csntd|�}tj}d}d}|dk	r0|}t|�}d}tj|j|||t|�|||�}t|dk�tj||�dd�S)aH
        Obtain keying material for application use.

        :param: label - a disambiguating label string as described in RFC 5705
        :param: olen - the length of the exported key material in bytes
        :param: context - a per-association context value
        :return: the exported key material bytes or None
        zunsigned char[]rNru)	rer�r�r�r�ZSSL_export_keying_materialrNr�r�)	r�ZlabelZolenr�r�Zcontext_bufZcontext_lenZuse_context�successrsrsrt�export_keying_materialjs	
z!Connection.export_keying_materialcOs|jj||�S)z�
        Call the :meth:`shutdown` method of the underlying socket.
        See :manpage:`shutdown(2)`.

        :return: What the socket's shutdown() method returns
        )rOr})r�r�r�rsrsrt�
sock_shutdown�szConnection.sock_shutdowncCs.tj|j�}|tjkr*tj|�tj|�SdS)za
        Retrieve the local certificate (if any)

        :return: The local certificate
        N)r�ZSSL_get_certificaterNr�r�r�rr�)r�r�rsrsrt�get_certificate�s



zConnection.get_certificatecCs$tj|j�}|tjkr tj|�SdS)zi
        Retrieve the other side's certificate (if any)

        :return: The peer's certificate
        N)r�ZSSL_get_peer_certificaterNr�r�rr�)r�r�rsrsrt�get_peer_certificate�s

zConnection.get_peer_certificatecCs`tj|j�}|tjkrdSg}x<ttj|��D]*}tjtj||��}t	j
|�}|j|�q.W|S)z�
        Retrieve the other side's certificate (if any)

        :return: A list of X509 instances giving the peer's certificate chain,
                 or None if it does not have one.
        N)r�ZSSL_get_peer_cert_chainrNr�r�r�Zsk_X509_numrZ
sk_X509_valuerr�r�)r�Z
cert_stackr�rr�Zpycertrsrsrt�get_peer_cert_chain�s

zConnection.get_peer_cert_chaincCstj|j�S)z�
        Checks if more data has to be read from the transport layer to complete
        an operation.

        :return: True iff more data has to be read
        )r�Z
SSL_want_readrN)r�rsrsrt�	want_read�szConnection.want_readcCstj|j�S)z�
        Checks if there is data to write to the transport layer to complete an
        operation.

        :return: True iff there is data to write
        )r�ZSSL_want_writerN)r�rsrsrt�
want_write�szConnection.want_writecCstj|j�dS)z�
        Set the connection to work in server mode. The handshake will be
        handled automatically by read/write.

        :return: None
        N)r�ZSSL_set_accept_staterN)r�rsrsrtr{�szConnection.set_accept_statecCstj|j�dS)z�
        Set the connection to work in client mode. The handshake will be
        handled automatically by read/write.

        :return: None
        N)r�rurN)r�rsrsrtry�szConnection.set_connect_statecCs8tj|j�}|tjkrdStjt�}tj|tj�|_	|S)z�
        Returns the Session currently used.

        :return: An instance of :class:`OpenSSL.SSL.Session` or
            :obj:`None` if no session exists.

        .. versionadded:: 0.14
        N)
r�ZSSL_get1_sessionrNr�r�rlr:r�ZSSL_SESSION_free�_session)r�r�Z	pysessionrsrsrt�get_session�s	

zConnection.get_sessioncCs0t|t�std��tj|j|j�}|s,t�dS)z�
        Set the session to be used when the TLS/SSL connection is established.

        :param session: A Session instance representing the session to use.
        :returns: None

        .. versionadded:: 0.14
        z"session must be a Session instanceN)r�rlr�r�ZSSL_set_sessionrNr�r�)r�r�r�rsrsrt�set_session�s
	
zConnection.set_sessioncCsRtjdd�}||j|d�}|dkr&dStd|�}||j||�tj||�dd�S)a�
        Helper to implement :meth:`get_finished` and
        :meth:`get_peer_finished`.

        :param function: Either :data:`SSL_get_finished`: or
            :data:`SSL_get_peer_finished`.

        :return: :data:`None` if the desired message has not yet been
            received, otherwise the contents of the message.
        :rtype: :class:`bytes` or :class:`NoneType`
        zchar[]rN)r�r�rNrer�)r�Zfunction�emptyr�rrsrsrt�_get_finished_message�s
z Connection._get_finished_messagecCs|jtj�S)a
        Obtain the latest TLS Finished message that we sent.

        :return: The contents of the message or :obj:`None` if the TLS
            handshake has not yet completed.
        :rtype: :class:`bytes` or :class:`NoneType`

        .. versionadded:: 0.15
        )r�r�ZSSL_get_finished)r�rsrsrt�get_finished	s
zConnection.get_finishedcCs|jtj�S)a!
        Obtain the latest TLS Finished message that we received from the peer.

        :return: The contents of the message or :obj:`None` if the TLS
            handshake has not yet completed.
        :rtype: :class:`bytes` or :class:`NoneType`

        .. versionadded:: 0.15
        )r�r�ZSSL_get_peer_finished)r�rsrsrt�get_peer_finished(	s
zConnection.get_peer_finishedcCs8tj|j�}|tjkrdStjtj|��}|jd�SdS)a
        Obtain the name of the currently used cipher.

        :returns: The name of the currently used cipher or :obj:`None`
            if no connection has been established.
        :rtype: :class:`unicode` or :class:`NoneType`

        .. versionadded:: 0.15
        Nzutf-8)r��SSL_get_current_cipherrNr�r�r�ZSSL_CIPHER_get_namer�)r��cipherr�rsrsrt�get_cipher_name4	s


zConnection.get_cipher_namecCs,tj|j�}|tjkrdStj|tj�SdS)a.
        Obtain the number of secret bits of the currently used cipher.

        :returns: The number of secret bits of the currently used cipher
            or :obj:`None` if no connection has been established.
        :rtype: :class:`int` or :class:`NoneType`

        .. versionadded:: 0.15
        N)r�r�rNr�r�ZSSL_CIPHER_get_bits)r�r�rsrsrt�get_cipher_bitsE	s

zConnection.get_cipher_bitscCs8tj|j�}|tjkrdStjtj|��}|jd�SdS)a%
        Obtain the protocol version of the currently used cipher.

        :returns: The protocol name of the currently used cipher
            or :obj:`None` if no connection has been established.
        :rtype: :class:`unicode` or :class:`NoneType`

        .. versionadded:: 0.15
        Nzutf-8)r�r�rNr�r�r�ZSSL_CIPHER_get_versionr�)r�r��versionrsrsrt�get_cipher_versionU	s


zConnection.get_cipher_versioncCstjtj|j��}|jd�S)a>
        Retrieve the protocol version of the current connection.

        :returns: The TLS version of the current connection, for example
            the value for TLS 1.2 would be ``TLSv1.2``or ``Unknown``
            for connections that were not successfully established.
        :rtype: :class:`unicode`
        zutf-8)r�r�r�ZSSL_get_versionrNr�)r�r�rsrsrt�get_protocol_version_namef	s	z$Connection.get_protocol_version_namecCstj|j�}|S)a
        Retrieve the SSL or TLS protocol version of the current connection.

        :returns: The TLS version of the current connection.  For example,
            it will return ``0x769`` for connections made over TLS version 1.
        :rtype: :class:`int`
        )r�ZSSL_versionrN)r�r�rsrsrt�get_protocol_versionr	szConnection.get_protocol_versioncCs@tjd�}tjd�}tj|j||�tj|d|d�dd�S)z�
        Get the protocol that was negotiated by NPN.

        :returns: A bytestring of the protocol name.  If no protocol has been
            negotiated yet, returns an empty string.

        .. versionadded:: 0.15
        zunsigned char **zunsigned int *rN)r�r�r�ZSSL_get0_next_proto_negotiatedrNr�)r�r��data_lenrsrsrt�get_next_proto_negotiated}	s


z$Connection.get_next_proto_negotiatedcCs>djtjdd�|D���}tjd|�}tj|j|t|��dS)ah
        Specify the client's ALPN protocol list.

        These protocols are offered to the server during protocol negotiation.

        :param protos: A list of the protocols to be offered to the server.
            This list should be a Python list of bytestrings representing the
            protocols to offer, e.g. ``[b'http/1.1', b'spdy/2']``.
        r�css|]}tt|��|fVqdS)N)rr�)r�r�rsrsrtr��	sz-Connection.set_alpn_protos.<locals>.<genexpr>zunsigned char[]N)	r�rr�r�r�r�ZSSL_set_alpn_protosrNr�)r�r�r�rArsrsrtrB�	s
zConnection.set_alpn_protoscCsHtjd�}tjd�}tj|j||�|s,dStj|d|d�dd�S)z�
        Get the protocol that was negotiated by ALPN.

        :returns: A bytestring of the protocol name.  If no protocol has been
            negotiated yet, returns an empty string.
        zunsigned char **zunsigned int *r�rN)r�r�r�ZSSL_get0_alpn_selectedrNr�)r�r�r�rsrsrt�get_alpn_proto_negotiated�	s

z$Connection.get_alpn_proto_negotiatedcCs tj|jtj�}t|dk�dS)a
        Called to request that the server sends stapled OCSP data, if
        available. If this is not called on the client side then the server
        will not send OCSP data. Should be used in conjunction with
        :meth:`Context.set_ocsp_client_callback`.
        ruN)r�ZSSL_set_tlsext_status_typerNZTLSEXT_STATUSTYPE_ocspr�)r�rErsrsrt�request_ocsp�	szConnection.request_ocsp)N)r)r)N)NN)N)Erprqrrrrr�r�rTrVrWrXrKrYr[r\rb�writerdrj�readrlrnrorprrrsrqrtrvrxrzr|r}r-r�r�r8r9r�r�r�r�r�r�r�r�r�r�r�r�r�r{ryr�r�r�r�r�r�r�r�r�r�rLr�rMrBr�r�rsrsrsrtrns|
6)
	

$

%
	

			
					"z:ConnectionType has been deprecated, use Connection instead)�rrR�sysr�	functoolsrr�	itertoolsrr�weakrefrrUrZcryptography.utilsr	Zsixr
r�rrr
Z
OpenSSL._utilrrrZ_exception_from_error_queuerr�rr�rZ_make_assertrr~rr�rrrreZOpenSSL.cryptorrrrrr�__all__r�ro�	NameError�objectrrrr r!r"ZSSL_SENT_SHUTDOWNr#ZSSL_RECEIVED_SHUTDOWNr$r%r&r'r(r)r*ZSSL_OP_NO_SSLv2r+ZSSL_OP_NO_SSLv3r,ZSSL_OP_NO_TLSv1r-ZSSL_OP_NO_TLSv1_1r.ZSSL_OP_NO_TLSv1_2r/ZSSL_MODE_RELEASE_BUFFERSr0ZSSL_OP_SINGLE_DH_USEr1ZSSL_OP_SINGLE_ECDH_USEr2ZSSL_OP_EPHEMERAL_RSAr3ZSSL_OP_MICROSOFT_SESS_ID_BUGr4ZSSL_OP_NETSCAPE_CHALLENGE_BUGr5Z'SSL_OP_NETSCAPE_REUSE_CIPHER_CHANGE_BUGr6Z"SSL_OP_SSLREF2_REUSE_CERT_TYPE_BUGr7Z!SSL_OP_MICROSOFT_BIG_SSLV3_BUFFERr8ZSSL_OP_MSIE_SSLV2_RSA_PADDINGr9ZSSL_OP_SSLEAY_080_CLIENT_DH_BUGr:ZSSL_OP_TLS_D5_BUGr;ZSSL_OP_TLS_BLOCK_PADDING_BUGr<Z"SSL_OP_DONT_INSERT_EMPTY_FRAGMENTSr=ZSSL_OP_CIPHER_SERVER_PREFERENCEr>ZSSL_OP_TLS_ROLLBACK_BUGr?ZSSL_OP_PKCS1_CHECK_1r@ZSSL_OP_PKCS1_CHECK_2rAZSSL_OP_NETSCAPE_CA_DN_BUGrBZ&SSL_OP_NETSCAPE_DEMO_CIPHER_CHANGE_BUGrCZSSL_OP_NO_COMPRESSIONrDZSSL_OP_NO_QUERY_MTUrEZSSL_OP_COOKIE_EXCHANGErFZSSL_OP_NO_TICKETrGZ
SSL_OP_ALLrHZSSL_VERIFY_PEERrIZSSL_VERIFY_FAIL_IF_NO_PEER_CERTrJZSSL_VERIFY_CLIENT_ONCErKZSSL_VERIFY_NONErLZSSL_SESS_CACHE_OFFrMZSSL_SESS_CACHE_CLIENTrNZSSL_SESS_CACHE_SERVERrOZSSL_SESS_CACHE_BOTHrPZSSL_SESS_CACHE_NO_AUTO_CLEARrQZ!SSL_SESS_CACHE_NO_INTERNAL_LOOKUPrRZ SSL_SESS_CACHE_NO_INTERNAL_STORErSZSSL_SESS_CACHE_NO_INTERNALrTrUrVrWZCryptography_HAS_SSL_STr{r|r}r~�extendrXrYrZr[r\r]r^r_r`rarbrcrdr�r�r�r�r�rer�r�rfrgrhrirjr�r�r�r�r�r�r�r�rkr�ZCryptography_HAS_NEXTPROTONEGrLZCryptography_HAS_ALPNrMZ Cryptography_HAS_TLSEXT_HOSTNAMErKrlrmrp�DeprecationWarningZContextTypernZConnectionTypeZSSL_library_initrsrsrsrt�<module>s�, 
')13C;	


ZIversion.cpython-36.opt-1.pyc000064400000001147151730204570011625 0ustar003

�F\r�@sBdZddddddddgZd	Zd
ZdZdZd
ZdZdZdj	e�Z
dS)z9
pyOpenSSL - A simple wrapper around the OpenSSL library
�
__author__�
__copyright__�	__email__�__license__�__summary__�	__title__�__uri__�__version__z19.0.0Z	pyOpenSSLzhttps://pyopenssl.org/z0Python wrapper module around the OpenSSL libraryzThe pyOpenSSL developerszcryptography-dev@python.orgzApache License, Version 2.0zCopyright 2001-2017 {0}N)�__doc__�__all__rrrrrrr�formatr�rr�/usr/lib/python3.6/version.py�<module>s

__init__.cpython-36.opt-2.pyc000064400000000172151730541220011671 0ustar003

���i�@sdS)N�rrr�'/usr/lib64/python3.6/urllib/__init__.py�<module>s__main__.cpython-38.opt-1.pyc000064400000000462151730671120011660 0ustar00U

e5d��@s<dZddlZejd�d�r&dejd<ddlmZe�dS)zMain entry point�Nz__main__.pyzpython -m tkinter�)�_test)�__doc__�sys�argv�endswith�r�main�r
r
�(/usr/lib64/python3.8/tkinter/__main__.py�<module>s

__main__.cpython-38.pyc000064400000000462151730671120010721 0ustar00U

e5d��@s<dZddlZejd�d�r&dejd<ddlmZe�dS)zMain entry point�Nz__main__.pyzpython -m tkinter�)�_test)�__doc__�sys�argv�endswith�r�main�r
r
�(/usr/lib64/python3.8/tkinter/__main__.py�<module>s

__init__.cpython-38.pyc000064400000132546151730671120010751 0ustar00U

e5dC��	@s&dZddddddddd	g	Zd
dlZd
dlmZmZd
d
lm	Z
d
dlZd
dl
Zd
dlmZd
dlmZmZmZd
dlmZzd
dlmZWnek
r�YnXej� e�zd
dlm!Z!Wnek
r�YnXdd�Z"Gdd�dej#�Z$Gdd�dej%�Z&Gdd�dej'�Z(Gdd�de)�Z*Gdd�de+�Z,zd
dlm,Z,Wnek
�rVYnXzd
dlm-Z-Wnek
�r�d d!�Z-YnXd"ddd#�d$d�Z.d%d&�Z/zd
d'lm/Z/Wnek
�r�YnXGd(d�de+�Z0Gd)d	�d	ej1�Z2Gd*d�dej1�Z3Gd+d�dej�Z4Gd,d�dej5�Z6dS)-a?This module implements specialized container datatypes providing
alternatives to Python's general purpose built-in containers, dict,
list, set, and tuple.

* namedtuple   factory function for creating tuple subclasses with named fields
* deque        list-like container with fast appends and pops on either end
* ChainMap     dict-like class for creating a single view of multiple mappings
* Counter      dict subclass for counting hashable objects
* OrderedDict  dict subclass that remembers the order entries were added
* defaultdict  dict subclass that calls a factory function to supply missing values
* UserDict     wrapper around dictionary objects for easier dict subclassing
* UserList     wrapper around list objects for easier list subclassing
* UserString   wrapper around string objects for easier string subclassing

�deque�defaultdict�
namedtuple�UserDict�UserList�
UserString�Counter�OrderedDict�ChainMap�N)�
itemgetter�eq)�	iskeyword)�proxy)�repeat�chain�starmap)�recursive_repr)r)rcCsR|tjkr:tt|�}ddl}|jdtdd�|t�|<|Stdt�d|����dS)Nr
z�Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated since Python 3.3, and in 3.10 it will stop working���
stacklevelzmodule z has no attribute )	�_collections_abc�__all__�getattr�warnings�warn�DeprecationWarning�globals�AttributeError�__name__)�name�objr�r!�,/usr/lib64/python3.8/collections/__init__.py�__getattr__*s

�
r#c@seZdZdd�ZdS)�_OrderedDictKeysViewccst|j�EdHdS�N��reversed�_mapping��selfr!r!r"�__reversed__?sz!_OrderedDictKeysView.__reversed__N�r�
__module__�__qualname__r+r!r!r!r"r$=sr$c@seZdZdd�ZdS)�_OrderedDictItemsViewccs$t|j�D]}||j|fVq
dSr%r&�r*�keyr!r!r"r+Dsz"_OrderedDictItemsView.__reversed__Nr,r!r!r!r"r/Bsr/c@seZdZdd�ZdS)�_OrderedDictValuesViewccs t|j�D]}|j|Vq
dSr%r&r0r!r!r"r+Jsz#_OrderedDictValuesView.__reversed__Nr,r!r!r!r"r2Hsr2c@seZdZdZdS)�_Link)�prev�nextr1�__weakref__N)rr-r.�	__slots__r!r!r!r"r3Nsr3c@s�eZdZdZd+dd�Zejeefdd�Zej	fdd�Z	d	d
�Z
dd�Zd
d�Zd,dd�Z
d-dd�Zdd�ZejjZZdd�Zdd�Zdd�ZejjZe�Zefdd�Zd.dd �Ze�d!d"��Zd#d$�Zd%d&�Ze d/d'd(��Z!d)d*�Z"dS)0rz)Dictionary that remembers insertion orderr!cKs\z
|jWn>tk
rHt�|_t|j�|_}||_|_i|_YnX|j|f|�dS)z�Initialize an ordered dictionary.  The signature is the same as
        regular dictionaries.  Keyword argument order is preserved.
        N)	�_OrderedDict__rootrr3�_OrderedDict__hardroot�_proxyr4r5�_OrderedDict__map�_OrderedDict__update)r*�other�kwds�rootr!r!r"�__init__`s
zOrderedDict.__init__c	CsZ||krJ|�|j|<}|j}|j}||||_|_|_||_||�|_||||�dS)z!od.__setitem__(i, y) <==> od[i]=yN)r;r8r4r5r1)	r*r1�valueZdict_setitemrZLink�linkr?�lastr!r!r"�__setitem__ms
zOrderedDict.__setitem__cCs>|||�|j�|�}|j}|j}||_||_d|_d|_dS)z od.__delitem__(y) <==> del od[y]N)r;�popr4r5)r*r1Zdict_delitemrB�	link_prev�	link_nextr!r!r"�__delitem__{s
zOrderedDict.__delitem__ccs(|j}|j}||k	r$|jV|j}qdS)zod.__iter__() <==> iter(od)N)r8r5r1�r*r?Zcurrr!r!r"�__iter__�s
zOrderedDict.__iter__ccs(|j}|j}||k	r$|jV|j}qdS)z#od.__reversed__() <==> reversed(od)N)r8r4r1rIr!r!r"r+�s
zOrderedDict.__reversed__cCs*|j}||_|_|j��t�|�dS)z.od.clear() -> None.  Remove all items from od.N)r8r4r5r;�clear�dict)r*r?r!r!r"rK�s
zOrderedDict.clearTcCsj|std��|j}|r0|j}|j}||_||_n|j}|j}||_||_|j}|j|=t�||�}||fS)z�Remove and return a (key, value) pair from the dictionary.

        Pairs are returned in LIFO order if last is true or FIFO order if false.
        zdictionary is empty)�KeyErrorr8r4r5r1r;rLrE)r*rCr?rBrFrGr1rAr!r!r"�popitem�s zOrderedDict.popitemc	Cst|j|}|j}|j}|j}||_||_|j}|rR|j}||_||_||_||_n|j}||_||_||_||_dS)z�Move an existing element to the end (or beginning if last is false).

        Raise KeyError if the element does not exist.
        N)r;r4r5r8)	r*r1rCrBrFrGZ	soft_linkr?�firstr!r!r"�move_to_end�s$
zOrderedDict.move_to_endcCsVtj}t|�d}||j�}|||j�d7}|||j�|7}|||j�|7}|S)N�r)�_sys�	getsizeof�len�__dict__r;r9r8)r*Zsizeof�n�sizer!r!r"�
__sizeof__�s
zOrderedDict.__sizeof__cCst|�S)z:D.keys() -> a set-like object providing a view on D's keys)r$r)r!r!r"�keys�szOrderedDict.keyscCst|�S)z<D.items() -> a set-like object providing a view on D's items)r/r)r!r!r"�items�szOrderedDict.itemscCst|�S)z6D.values() -> an object providing a view on D's values)r2r)r!r!r"�values�szOrderedDict.valuescCs0||kr||}||=|S||jkr,t|��|S)z�od.pop(k[,d]) -> v, remove specified key and return the corresponding
        value.  If key is not found, d is returned if given, otherwise KeyError
        is raised.

        )�_OrderedDict__markerrM)r*r1�default�resultr!r!r"rE�s
zOrderedDict.popNcCs||kr||S|||<|S)z�Insert key with a value of default if key is not in the dictionary.

        Return the value for key if key is in the dictionary, else default.
        r!�r*r1r]r!r!r"�
setdefault�szOrderedDict.setdefaultcCs*|sd|jjfSd|jjt|���fS)zod.__repr__() <==> repr(od)�%s()z%s(%r))�	__class__r�listrZr)r!r!r"�__repr__szOrderedDict.__repr__cCsDt|���}tt��D]}|�|d�q|jd|p4ddt|���fS)z%Return state information for picklingNr!)�vars�copyrrErb�iterrZ)r*Z	inst_dict�kr!r!r"�
__reduce__szOrderedDict.__reduce__cCs
|�|�S)z!od.copy() -> a shallow copy of od�rbr)r!r!r"rfszOrderedDict.copycCs|�}|D]}|||<q
|S)zYCreate a new ordered dictionary with keys from iterable and values set to value.
        r!)�cls�iterablerAr*r1r!r!r"�fromkeyss
zOrderedDict.fromkeyscCs2t|t�r&t�||�o$ttt||��St�||�S)z�od.__eq__(y) <==> od==y.  Comparison to another OD is order-sensitive
        while comparison to a regular mapping is order-insensitive.

        )�
isinstancerrL�__eq__�all�map�_eq�r*r=r!r!r"ros
zOrderedDict.__eq__)r!)T)T)N)N)#rr-r.�__doc__r@rLrDr:r3rHrJr+rKrNrPrXr�MutableMapping�updater<rYrZr[�__ne__�objectr\rEr`�_recursive_reprrdrirf�classmethodrmror!r!r!r"rQs8
�

		

	


)r)�_tuplegettercCstt|�|d�S)N)�doc)�property�_itemgetter)�indexr|r!r!r"�<lambda>7�r�F)�rename�defaults�modulecs�t�t�r��dd����ttt����t�t|��}|r�t�}t	��D]B\}}|�
�rrt|�sr|�d�sr||kr�d|���|<|�
|�qH|g�D]D}t|�tk	r�td��|�
�s�td|����t|�r�td|����q�t�}�D]F}|�d��r
|�s
td|����||k�r"td|����|�
|�q�i}|d	k	�r|t|�}t|�t��k�r^td
��ttttt��t|�����}tttj����t���t���dd�d
d�}	dd�dd��D��d�tj�tttttf\�����d|	�d|	�d�}
�d|��d�}t|
|�|d}d|�d|	�d�|_|d	k	�r>||_t���fdd��}
d|�d�|
j_��fdd �}d!|�d"�|_�fd#d$�}��fd%d&�}�fd'd(�}||
j||||fD]}|�d)|j��|_�q�|�d|	�d�d*�||||
||||d+�}t	��D](\}}t�d,|���}t ||�||<�qt|tf|�}|d	k�rvzt�!d
�j"�#d-d.�}Wnt$tfk
�rtYnX|d	k	�r�||_%|S)/aCReturns a new subclass of tuple with named fields.

    >>> Point = namedtuple('Point', ['x', 'y'])
    >>> Point.__doc__                   # docstring for the new class
    'Point(x, y)'
    >>> p = Point(11, y=22)             # instantiate with positional args or keywords
    >>> p[0] + p[1]                     # indexable like a plain tuple
    33
    >>> x, y = p                        # unpack like a regular tuple
    >>> x, y
    (11, 22)
    >>> p.x + p.y                       # fields also accessible by name
    33
    >>> d = p._asdict()                 # convert to a dictionary
    >>> d['x']
    11
    >>> Point(**d)                      # convert from a dictionary
    Point(x=11, y=22)
    >>> p._replace(x=100)               # _replace() is like str.replace() but targets named fields
    Point(x=100, y=22)

    �,� �_z*Type names and field names must be stringsz6Type names and field names must be valid identifiers: z0Type names and field names cannot be a keyword: z-Field names cannot start with an underscore: z"Encountered duplicate field name: Nz(Got more default values than field names�'�rQ����(�, css|]}|�d�VqdS)z=%rNr!)�.0rr!r!r"�	<genexpr>�sznamedtuple.<locals>.<genexpr>�)zdef __new__(_cls, z): return _tuple_new(_cls, (z))�namedtuple_)�
_tuple_newr�__new__zCreate new instance of cs2�||�}�|��kr.td��dt|�����|S)Nz	Expected z arguments, got )�	TypeErrorrT)rkrlr^)�_len�
num_fields�	tuple_newr!r"�_make�s
znamedtuple.<locals>._makezMake a new z# object from a sequence or iterablecs.|��|j�|��}|r*tdt|�����|S)NzGot unexpected field names: )r�rE�
ValueErrorrc)r*r>r^)�_map�field_namesr!r"�_replace�sznamedtuple.<locals>._replacez
Return a new z2 object replacing specified fields with new valuescs|jj�|S)z/Return a nicely formatted representation string)rbrr))�repr_fmtr!r"rd�sznamedtuple.<locals>.__repr__cs��|j|��S)z9Return a new dict which maps field names to their values.)�_fieldsr))�_dict�_zipr!r"�_asdict�sznamedtuple.<locals>._asdictcs�|�S)z7Return self as a plain tuple.  Used by copy and pickle.r!r))�_tupler!r"�__getnewargs__�sz"namedtuple.<locals>.__getnewargs__�.r!)rtr7r��_field_defaults�_fields_defaultsr�r�r�rdr�r�zAlias for field number r�__main__)&rn�str�replace�splitrcrqrR�intern�set�	enumerate�isidentifier�
_iskeyword�
startswith�add�typer�r��tuplerTrLr'�zip�repr�joinr��execrt�__defaults__rz�__func__rr.r{�	_getframe�	f_globals�getrr-)�typenamer�r�r�r��seenrr�field_defaults�arg_list�s�	namespacer�r�r�rdr�r��method�class_namespacer|r^r!)	r�r�r�r�r�r�r�r�r�r"r9s�
���

�


��

cCs&|j}|D]}||d�d||<q
dS)z!Tally elements from the iterable.r
rQN)r�)�mappingrlZmapping_get�elemr!r!r"�_count_elements�sr�)r�cs�eZdZdZd/�fdd�	Zdd�Zd0dd�Zd	d
�Zed1dd��Z	d2�fd
d�	Z
d3dd�Zdd�Zdd�Z
�fdd�Zdd�Zdd�Zdd�Zdd�Zdd �Zd!d"�Zd#d$�Zd%d&�Zd'd(�Zd)d*�Zd+d,�Zd-d.�Z�ZS)4ra�Dict subclass for counting hashable items.  Sometimes called a bag
    or multiset.  Elements are stored as dictionary keys and their counts
    are stored as dictionary values.

    >>> c = Counter('abcdeabcdabcaba')  # count elements from a string

    >>> c.most_common(3)                # three most common elements
    [('a', 5), ('b', 4), ('c', 3)]
    >>> sorted(c)                       # list all unique elements
    ['a', 'b', 'c', 'd', 'e']
    >>> ''.join(sorted(c.elements()))   # list elements with repetitions
    'aaaaabbbbcccdde'
    >>> sum(c.values())                 # total of all counts
    15

    >>> c['a']                          # count of letter 'a'
    5
    >>> for elem in 'shazam':           # update counts from an iterable
    ...     c[elem] += 1                # by adding 1 to each element's count
    >>> c['a']                          # now there are seven 'a'
    7
    >>> del c['b']                      # remove all 'b'
    >>> c['b']                          # now there are zero 'b'
    0

    >>> d = Counter('simsalabim')       # make another counter
    >>> c.update(d)                     # add in the second counter
    >>> c['a']                          # now there are nine 'a'
    9

    >>> c.clear()                       # empty the counter
    >>> c
    Counter()

    Note:  If a count is set to zero or reduced to zero, it will remain
    in the counter until the entry is deleted or the counter is cleared:

    >>> c = Counter('aaabbc')
    >>> c['b'] -= 2                     # reduce the count of 'b' by two
    >>> c.most_common()                 # 'b' is still in, but its count is zero
    [('a', 3), ('c', 1), ('b', 0)]

    Ncs tt|���|j|f|�dS)a	Create a new, empty Counter object.  And if given, count elements
        from an input iterable.  Or, initialize the count from another mapping
        of elements to their counts.

        >>> c = Counter()                           # a new, empty counter
        >>> c = Counter('gallahad')                 # a new counter from an iterable
        >>> c = Counter({'a': 4, 'b': 2})           # a new counter from a mapping
        >>> c = Counter(a=4, b=2)                   # a new counter from keyword args

        N)�superrr@rv)r*rlr>rjr!r"r@szCounter.__init__cCsdS)z1The count of elements not in the Counter is zero.r
r!r0r!r!r"�__missing__*szCounter.__missing__cCs6|dkrt|��td�dd�Stj||��td�d�S)z�List the n most common elements and their counts from the most
        common to the least.  If n is None, then list all element counts.

        >>> Counter('abracadabra').most_common(3)
        [('a', 5), ('b', 2), ('r', 2)]

        NrQT)r1�reverse�r1)�sortedrZr~�_heapq�nlargest�r*rVr!r!r"�most_common/s	zCounter.most_commoncCst�tt|����S)a�Iterator over elements repeating each as many times as its count.

        >>> c = Counter('ABCABC')
        >>> sorted(c.elements())
        ['A', 'A', 'B', 'B', 'C', 'C']

        # Knuth's example for prime factors of 1836:  2**2 * 3**3 * 17**1
        >>> prime_factors = Counter({2: 2, 3: 3, 17: 1})
        >>> product = 1
        >>> for factor in prime_factors.elements():     # loop over factors
        ...     product *= factor                       # and multiply them
        >>> product
        1836

        Note, if an element's count has been set to zero or is a negative
        number, elements() will ignore it.

        )�_chain�
from_iterable�_starmap�_repeatrZr)r!r!r"�elements<szCounter.elementscCstd��dS)Nz@Counter.fromkeys() is undefined.  Use Counter(iterable) instead.)�NotImplementedError)rkrl�vr!r!r"rmTs	�zCounter.fromkeyscsr|dk	r`t|tj�rV|rD|j}|��D]\}}|||d�||<q&q`tt|��|�n
t||�|rn|�|�dS)a�Like dict.update() but add counts instead of replacing them.

        Source can be an iterable, a dictionary, or another Counter instance.

        >>> c = Counter('which')
        >>> c.update('witch')           # add elements from another iterable
        >>> d = Counter('watch')
        >>> c.update(d)                 # add elements from another counter
        >>> c['h']                      # four 'h' in which, witch, and watch
        4

        Nr
)	rnr�Mappingr�rZr�rrvr��r*rlr>�self_getr��countrjr!r"rv`s
zCounter.updatecKsn|dk	r\|j}t|tj�r@|��D]\}}||d�|||<q"n|D]}||d�d||<qD|rj|�|�dS)a�Like dict.update() but subtracts counts instead of replacing them.
        Counts can be reduced below zero.  Both the inputs and outputs are
        allowed to contain zero and negative counts.

        Source can be an iterable, a dictionary, or another Counter instance.

        >>> c = Counter('which')
        >>> c.subtract('witch')             # subtract elements from another iterable
        >>> c.subtract(Counter('watch'))    # subtract elements from another counter
        >>> c['h']                          # 2 in which, minus 1 in witch, minus 1 in watch
        0
        >>> c['w']                          # 1 in which, minus 1 in witch, minus 1 in watch
        -1

        Nr
rQ)r�rnrr�rZ�subtractr�r!r!r"r��szCounter.subtractcCs
|�|�S)zReturn a shallow copy.rjr)r!r!r"rf�szCounter.copycCs|jt|�ffSr%)rbrLr)r!r!r"ri�szCounter.__reduce__cs||krt��|�dS)zGLike dict.__delitem__() but does not raise KeyError for missing values.N)r�rH)r*r�rjr!r"rH�szCounter.__delitem__cCsf|sd|jjSz(d�tdj|����}d|jj|fWStk
r`d�|jjt|��YSXdS)Nrar�z%r: %rz%s({%s})z
{0}({1!r}))	rbrr�rq�__mod__r�r��formatrL)r*rZr!r!r"rd�szCounter.__repr__cCspt|t�stSt�}|��D]$\}}|||}|dkr|||<q|��D] \}}||krJ|dkrJ|||<qJ|S)zAdd counts from two counters.

        >>> Counter('abbb') + Counter('bcc')
        Counter({'b': 4, 'c': 2, 'a': 1})

        r
�rnr�NotImplementedrZ�r*r=r^r�r��newcountr!r!r"�__add__�s


zCounter.__add__cCstt|t�stSt�}|��D]$\}}|||}|dkr|||<q|��D]$\}}||krJ|dkrJd|||<qJ|S)z� Subtract count, but keep only results with positive counts.

        >>> Counter('abbbc') - Counter('bccd')
        Counter({'b': 2, 'a': 1})

        r
r�r�r!r!r"�__sub__�s

zCounter.__sub__cCs|t|t�stSt�}|��D]0\}}||}||kr8|n|}|dkr|||<q|��D] \}}||krV|dkrV|||<qV|S)z�Union is the maximum of value in either of the input counters.

        >>> Counter('abbb') | Counter('bcc')
        Counter({'b': 3, 'c': 2, 'a': 1})

        r
r��r*r=r^r�r��other_countr�r!r!r"�__or__�s


zCounter.__or__cCsRt|t�stSt�}|��D]0\}}||}||kr8|n|}|dkr|||<q|S)z� Intersection is the minimum of corresponding counts.

        >>> Counter('abbb') & Counter('bcc')
        Counter({'b': 1})

        r
r�r�r!r!r"�__and__�s

zCounter.__and__cCs,t�}|��D]\}}|dkr|||<q|S)zEAdds an empty counter, effectively stripping negative and zero countsr
�rrZ�r*r^r�r�r!r!r"�__pos__
s

zCounter.__pos__cCs0t�}|��D]\}}|dkrd|||<q|S)z{Subtracts from an empty counter.  Strips positive and zero counts,
        and flips the sign on negative counts.

        r
r�r�r!r!r"�__neg__s
zCounter.__neg__cCs&dd�|��D�}|D]
}||=q|S)z?Internal method to strip elements with a negative or zero countcSsg|]\}}|dks|�qS)r
r!)r�r�r�r!r!r"�
<listcomp>"sz*Counter._keep_positive.<locals>.<listcomp>)rZ)r*�nonpositiver�r!r!r"�_keep_positive szCounter._keep_positivecCs*|��D]\}}|||7<q|��S)z�Inplace add from another counter, keeping only positive counts.

        >>> c = Counter('abbb')
        >>> c += Counter('bcc')
        >>> c
        Counter({'b': 4, 'c': 2, 'a': 1})

        �rZr��r*r=r�r�r!r!r"�__iadd__'s	zCounter.__iadd__cCs*|��D]\}}|||8<q|��S)z�Inplace subtract counter, but keep only results with positive counts.

        >>> c = Counter('abbbc')
        >>> c -= Counter('bccd')
        >>> c
        Counter({'b': 2, 'a': 1})

        r�r�r!r!r"�__isub__4s	zCounter.__isub__cCs2|��D] \}}||}||kr|||<q|��S)z�Inplace union is the maximum of value from either counter.

        >>> c = Counter('abbb')
        >>> c |= Counter('bcc')
        >>> c
        Counter({'b': 3, 'c': 2, 'a': 1})

        r�)r*r=r�r�r�r!r!r"�__ior__As
	
zCounter.__ior__cCs2|��D] \}}||}||kr|||<q|��S)z�Inplace intersection is the minimum of corresponding counts.

        >>> c = Counter('abbb')
        >>> c &= Counter('bcc')
        >>> c
        Counter({'b': 1})

        r�)r*r=r�r�r�r!r!r"�__iand__Ps
	
zCounter.__iand__)N)N)N)N)N)rr-r.rtr@r�r�r�rzrmrvr�rfrirHrdr�r�r�r�r�r�r�r�r�r�r��
__classcell__r!r!rjr"r�s02

!


c@s�eZdZdZdd�Zdd�Zdd�Zd'd	d
�Zdd�Zd
d�Z	dd�Z
dd�Ze�dd��Z
edd��Zdd�ZeZd(dd�Zedd��Zdd�Zdd �Zd!d"�Zd#d$�Zd%d&�ZdS))r	a� A ChainMap groups multiple dicts (or other mappings) together
    to create a single, updateable view.

    The underlying mappings are stored in a list.  That list is public and can
    be accessed or updated using the *maps* attribute.  There is no other
    state.

    Lookups search the underlying mappings successively until a key is found.
    In contrast, writes, updates, and deletions only operate on the first
    mapping.

    cGst|�pig|_dS)z�Initialize a ChainMap by setting *maps* to the given mappings.
        If no mappings are provided, a single empty dictionary is used.

        N)rc�maps)r*r�r!r!r"r@rszChainMap.__init__cCst|��dSr%)rMr0r!r!r"r�yszChainMap.__missing__c	Cs:|jD](}z||WStk
r,YqXq|�|�Sr%)r�rMr�)r*r1r�r!r!r"�__getitem__|s
zChainMap.__getitem__NcCs||kr||S|Sr%r!r_r!r!r"r��szChainMap.getcCstt�j|j��Sr%)rTr��unionr�r)r!r!r"�__len__�szChainMap.__len__cCs&i}t|j�D]}|�|�qt|�Sr%)r'r�rvrg)r*�dr�r!r!r"rJ�szChainMap.__iter__cst�fdd�|jD��S)Nc3s|]}�|kVqdSr%r!)r��mr�r!r"r��sz(ChainMap.__contains__.<locals>.<genexpr>��anyr�r0r!r�r"�__contains__�szChainMap.__contains__cCs
t|j�Sr%r�r)r!r!r"�__bool__�szChainMap.__bool__cCs"|jj�dd�tt|j���d�S)Nr�r�r�)rbrr�rqr�r�r)r!r!r"rd�szChainMap.__repr__cGs|tj|f|���S)z?Create a ChainMap with a single dict created from the iterable.)rLrm)rkrl�argsr!r!r"rm�szChainMap.fromkeyscCs$|j|jd��f|jdd���S)zHNew ChainMap or subclass with a new copy of maps[0] and refs to maps[1:]r
rQN)rbr�rfr)r!r!r"rf�sz
ChainMap.copycCs|dkri}|j|f|j��S)zyNew ChainMap with a new map followed by all previous maps.
        If no map is provided, an empty dict is used.
        N�rbr�)r*r�r!r!r"�	new_child�szChainMap.new_childcCs|j|jdd��S)zNew ChainMap from maps[1:].rQNrr)r!r!r"�parents�szChainMap.parentscCs||jd|<dS�Nr
)r�)r*r1rAr!r!r"rD�szChainMap.__setitem__cCs8z|jd|=Wn"tk
r2td�|���YnXdS)Nr
�(Key not found in the first mapping: {!r})r�rMr�r0r!r!r"rH�szChainMap.__delitem__cCs2z|jd��WStk
r,td��YnXdS)zPRemove and return an item pair from maps[0]. Raise KeyError is maps[0] is empty.r
z#No keys found in the first mapping.N)r�rNrMr)r!r!r"rN�szChainMap.popitemcGs@z|jdj|f|��WStk
r:td�|���YnXdS)zWRemove *key* from maps[0] and return its value. Raise KeyError if *key* not in maps[0].r
rN)r�rErMr�)r*r1rr!r!r"rE�szChainMap.popcCs|jd��dS)z'Clear maps[0], leaving maps[1:] intact.r
N)r�rKr)r!r!r"rK�szChainMap.clear)N)N)rr-r.rtr@r�r�r�r�rJr�r�ryrdrzrmrf�__copy__rr}rrDrHrNrErKr!r!r!r"r	ds.





c@speZdZdd�Zde_dd�Zdd�Zdd	�Zd
d�Zdd
�Z	dd�Z
dd�Zdd�Zdd�Z
eddd��ZdS)rcOs�|std��|^}}t|�dkr0tdt|���|r>|d}n0d|krj|�d�}ddl}|jdtdd�nd}i|_|dk	r�|�|�|r�|�|�dS)	Nz<descriptor '__init__' of 'UserDict' object needs an argumentrQz$expected at most 1 arguments, got %dr
rLz0Passing 'dict' as keyword argument is deprecatedrr)r�rTrErrr�datarv)r�kwargsr*rLrr!r!r"r@�s(

�
zUserDict.__init__z($self, dict=None, /, **kwargs)cCs
t|j�Sr%�rTrr)r!r!r"r��r�zUserDict.__len__cCs:||jkr|j|St|jd�r.|j�||�St|��dS)Nr�)r�hasattrrbr�rMr0r!r!r"r��s


zUserDict.__getitem__cCs||j|<dSr%�r)r*r1�itemr!r!r"rD�r�zUserDict.__setitem__cCs|j|=dSr%rr0r!r!r"rH�r�zUserDict.__delitem__cCs
t|j�Sr%)rgrr)r!r!r"rJ�szUserDict.__iter__cCs
||jkSr%rr0r!r!r"r��szUserDict.__contains__cCs
t|j�Sr%�r�rr)r!r!r"rd�r�zUserDict.__repr__cCs4|j�|j�}|j�|j�|jd��|jd<|S�Nr)rbr�rUrvrf�r*�instr!r!r"r�szUserDict.__copy__cCsR|jtkrt|j���Sddl}|j}zi|_|�|�}W5||_X|�|�|Sr)rbrrrfrv)r*rfr�cr!r!r"rfs

z
UserDict.copyNcCs|�}|D]}|||<q
|Sr%r!)rkrlrAr�r1r!r!r"rms
zUserDict.fromkeys)N)rr-r.r@�__text_signature__r�r�rDrHrJr�rdrrfrzrmr!r!r!r"r�s
c@seZdZdZd@dd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zdd �Zd!d"�Zd#d$�ZeZd%d&�Zd'd(�Zd)d*�Zd+d,�ZdAd.d/�Zd0d1�Zd2d3�Zd4d5�Zd6d7�Zd8d9�Zd:d;�Z d<d=�Z!d>d?�Z"dS)BrzAA more or less complete user-defined wrapper around list objects.NcCsbg|_|dk	r^t|�t|j�kr0||jdd�<n.t|t�rT|jdd�|jdd�<n
t|�|_dSr%)rr�rnrrc)r*�initlistr!r!r"r@!s
zUserList.__init__cCs
t|j�Sr%r
r)r!r!r"rd+r�zUserList.__repr__cCs|j|�|�kSr%�r�_UserList__castrsr!r!r"�__lt__,r�zUserList.__lt__cCs|j|�|�kSr%rrsr!r!r"�__le__-r�zUserList.__le__cCs|j|�|�kSr%rrsr!r!r"ro.r�zUserList.__eq__cCs|j|�|�kSr%rrsr!r!r"�__gt__/r�zUserList.__gt__cCs|j|�|�kSr%rrsr!r!r"�__ge__0r�zUserList.__ge__cCst|t�r|jS|Sr%)rnrrrsr!r!r"�__cast1szUserList.__castcCs
||jkSr%r�r*rr!r!r"r�3r�zUserList.__contains__cCs
t|j�Sr%r	r)r!r!r"r�4r�zUserList.__len__cCs(t|t�r|�|j|�S|j|SdSr%)rn�slicerbr�r*�ir!r!r"r�5s
zUserList.__getitem__cCs||j|<dSr%r�r*rrr!r!r"rD:r�zUserList.__setitem__cCs|j|=dSr%rrr!r!r"rH;r�zUserList.__delitem__cCsPt|t�r|�|j|j�St|t|j��r<|�|j|�S|�|jt|��Sr%�rnrrbrr�rcrsr!r!r"r�<s

zUserList.__add__cCsPt|t�r|�|j|j�St|t|j��r<|�||j�S|�t|�|j�Sr%r rsr!r!r"�__radd__Bs

zUserList.__radd__cCsRt|t�r|j|j7_n2t|t|j��r<|j|7_n|jt|�7_|Sr%)rnrrr�rcrsr!r!r"r�Hs
zUserList.__iadd__cCs|�|j|�Sr%�rbrr�r!r!r"�__mul__PszUserList.__mul__cCs|j|9_|Sr%rr�r!r!r"�__imul__SszUserList.__imul__cCs8|j�|j�}|j�|j�|jddd�|jd<|Sr)rbr�rUrvrr!r!r"rVszUserList.__copy__cCs|j�|�dSr%)r�appendrr!r!r"r%\r�zUserList.appendcCs|j�||�dSr%)r�insertrr!r!r"r&]r�zUserList.insertr�cCs|j�|�Sr%)rrErr!r!r"rE^r�zUserList.popcCs|j�|�dSr%)r�removerr!r!r"r'_r�zUserList.removecCs|j��dSr%)rrKr)r!r!r"rK`r�zUserList.clearcCs
|�|�Sr%rjr)r!r!r"rfar�z
UserList.copycCs|j�|�Sr%)rr�rr!r!r"r�br�zUserList.countcGs|jj|f|��Sr%�rr)r*rrr!r!r"rcr�zUserList.indexcCs|j��dSr%)rr�r)r!r!r"r�dr�zUserList.reversecOs|jj||�dSr%)r�sort�r*rr>r!r!r"r)er�z
UserList.sortcCs*t|t�r|j�|j�n|j�|�dSr%)rnrr�extendrsr!r!r"r+fs
zUserList.extend)N)r�)#rr-r.rtr@rdrrrorrrr�r�r�rDrHr�r!r�r#�__rmul__r$rr%r&rEr'rKrfr�rr�r)r+r!r!r!r"rs@


c@sheZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zdd �Zd!d"�Zd#d$�Zd%d&�ZeZd'd(�Zd)d*�Zd+d,�Zd-d.�Zd/d0�Zd1ejfd2d3�Zd�d6d7�Zd1ejfd8d9�Z d�d;d<�Z!d1ejfd=d>�Z"d?d@�Z#dAdB�Z$d1ejfdCdD�Z%dEdF�Z&dGdH�Z'dIdJ�Z(dKdL�Z)dMdN�Z*dOdP�Z+dQdR�Z,dSdT�Z-dUdV�Z.dWdX�Z/dYdZ�Z0d[d\�Z1d]d^�Z2d_d`�Z3dadb�Z4d�ddde�Z5e6j7Z7dfdg�Z8d�didj�Z9d1ejfdkdl�Z:d1ejfdmdn�Z;dodp�Z<dqdr�Z=d�dsdt�Z>d�dudv�Z?d�dwdx�Z@d�dzd{�ZAd1ejfd|d}�ZBd�d~d�ZCd�d��ZDd�d��ZEd�d��ZFd�d��ZGd�d��ZHdcS)�rcCs<t|t�r||_n&t|t�r.|jdd�|_n
t|�|_dSr%)rnr�rr�r*�seqr!r!r"r@ss


zUserString.__init__cCs
t|j�Sr%)r�rr)r!r!r"�__str__zr�zUserString.__str__cCs
t|j�Sr%r
r)r!r!r"rd{r�zUserString.__repr__cCs
t|j�Sr%)�intrr)r!r!r"�__int__|r�zUserString.__int__cCs
t|j�Sr%)�floatrr)r!r!r"�	__float__}r�zUserString.__float__cCs
t|j�Sr%)�complexrr)r!r!r"�__complex__~r�zUserString.__complex__cCs
t|j�Sr%)�hashrr)r!r!r"�__hash__r�zUserString.__hash__cCs|jdd�fSr%rr)r!r!r"r��szUserString.__getnewargs__cCs t|t�r|j|jkS|j|kSr%�rnrr�r*�stringr!r!r"ro�s
zUserString.__eq__cCs t|t�r|j|jkS|j|kSr%r8r9r!r!r"r�s
zUserString.__lt__cCs t|t�r|j|jkS|j|kSr%r8r9r!r!r"r�s
zUserString.__le__cCs t|t�r|j|jkS|j|kSr%r8r9r!r!r"r�s
zUserString.__gt__cCs t|t�r|j|jkS|j|kSr%r8r9r!r!r"r�s
zUserString.__ge__cCst|t�r|j}||jkSr%r8)r*�charr!r!r"r��s
zUserString.__contains__cCs
t|j�Sr%r	r)r!r!r"r��r�zUserString.__len__cCs|�|j|�Sr%r")r*rr!r!r"r��r�zUserString.__getitem__cCsJt|t�r|�|j|j�St|t�r6|�|j|�S|�|jt|��Sr%)rnrrbrr�rsr!r!r"r��s


zUserString.__add__cCs.t|t�r|�||j�S|�t|�|j�Sr%)rnr�rbrrsr!r!r"r!�s
zUserString.__radd__cCs|�|j|�Sr%r"r�r!r!r"r#�szUserString.__mul__cCs|�|j|�Sr%r"�r*rr!r!r"r��szUserString.__mod__cCs|�t|�|�Sr%)rbr�)r*�templater!r!r"�__rmod__�szUserString.__rmod__cCs|�|j���Sr%)rbr�
capitalizer)r!r!r"r?�r�zUserString.capitalizecCs|�|j���Sr%)rbr�casefoldr)r!r!r"r@�szUserString.casefoldcGs|�|jj|f|���Sr%)rbr�center�r*�widthrr!r!r"rA�szUserString.centerr
cCs t|t�r|j}|j�|||�Sr%)rnrrr��r*�sub�start�endr!r!r"r��s
zUserString.count�utf-8�strictcCs.|dkrdn|}|dkrdn|}|j�||�S)NrHrI)r�encode)r*�encoding�errorsr!r!r"rJ�szUserString.encodecCs|j�|||�Sr%)r�endswith)r*�suffixrFrGr!r!r"rM�szUserString.endswith�cCs|�|j�|��Sr%)rbr�
expandtabs)r*�tabsizer!r!r"rP�szUserString.expandtabscCs t|t�r|j}|j�|||�Sr%)rnrr�findrDr!r!r"rR�s
zUserString.findcOs|jj||�Sr%)rr�r*r!r!r"r��szUserString.formatcCs|j�|�Sr%)r�
format_map)r*r�r!r!r"rS�szUserString.format_mapcCs|j�|||�Sr%r(rDr!r!r"r�szUserString.indexcCs
|j��Sr%)r�isalphar)r!r!r"rT�r�zUserString.isalphacCs
|j��Sr%)r�isalnumr)r!r!r"rU�r�zUserString.isalnumcCs
|j��Sr%)r�isasciir)r!r!r"rV�r�zUserString.isasciicCs
|j��Sr%)r�	isdecimalr)r!r!r"rW�r�zUserString.isdecimalcCs
|j��Sr%)r�isdigitr)r!r!r"rX�r�zUserString.isdigitcCs
|j��Sr%)rr�r)r!r!r"r��r�zUserString.isidentifiercCs
|j��Sr%)r�islowerr)r!r!r"rY�r�zUserString.islowercCs
|j��Sr%)r�	isnumericr)r!r!r"rZ�r�zUserString.isnumericcCs
|j��Sr%)r�isprintabler)r!r!r"r[�r�zUserString.isprintablecCs
|j��Sr%)r�isspacer)r!r!r"r\�r�zUserString.isspacecCs
|j��Sr%)r�istitler)r!r!r"r]�r�zUserString.istitlecCs
|j��Sr%)r�isupperr)r!r!r"r^�r�zUserString.isuppercCs|j�|�Sr%)rr�r-r!r!r"r��r�zUserString.joincGs|�|jj|f|���Sr%)rbr�ljustrBr!r!r"r_�szUserString.ljustcCs|�|j���Sr%)rbr�lowerr)r!r!r"r`�r�zUserString.lowerNcCs|�|j�|��Sr%)rbr�lstrip�r*�charsr!r!r"ra�r�zUserString.lstripcCs|j�|�Sr%)r�	partition�r*�sepr!r!r"rd�szUserString.partitionr�cCs6t|t�r|j}t|t�r |j}|�|j�|||��Sr%)rnrrrbr�)r*�old�new�maxsplitr!r!r"r��s


zUserString.replacecCs t|t�r|j}|j�|||�Sr%)rnrr�rfindrDr!r!r"rj�s
zUserString.rfindcCs|j�|||�Sr%)r�rindexrDr!r!r"rk�szUserString.rindexcGs|�|jj|f|���Sr%)rbr�rjustrBr!r!r"rl�szUserString.rjustcCs|j�|�Sr%)r�
rpartitionrer!r!r"rm�szUserString.rpartitioncCs|�|j�|��Sr%)rbr�rstriprbr!r!r"rn�szUserString.rstripcCs|j�||�Sr%)rr��r*rfrir!r!r"r��szUserString.splitcCs|j�||�Sr%)r�rsplitror!r!r"rp�szUserString.rsplitFcCs|j�|�Sr%)r�
splitlines)r*�keependsr!r!r"rq�r�zUserString.splitlinescCs|j�|||�Sr%)rr�)r*�prefixrFrGr!r!r"r��szUserString.startswithcCs|�|j�|��Sr%)rbr�striprbr!r!r"rt�r�zUserString.stripcCs|�|j���Sr%)rbr�swapcaser)r!r!r"ru�r�zUserString.swapcasecCs|�|j���Sr%)rbr�titler)r!r!r"rv�r�zUserString.titlecGs|�|jj|��Sr%)rbr�	translater<r!r!r"rw�szUserString.translatecCs|�|j���Sr%)rbr�upperr)r!r!r"rx�r�zUserString.uppercCs|�|j�|��Sr%)rbr�zfill)r*rCr!r!r"ry�r�zUserString.zfill)rHrI)rO)N)r�)N)Nr�)Nr�)F)N)Irr-r.r@r/rdr1r3r5r7r�rorrrrr�r�r�r�r!r#r,r�r>r?r@rArR�maxsizer�rJrMrPrRr�rSrrTrUrVrWrXr�rYrZr[r\r]r^r�r_r`rar��	maketransrdr�rjrkrlrmrnr�rprqr�rtrurvrwrxryr!r!r!r"rrs�








)7rtrr�operatorrr~rrr�keywordr
r��sysrR�heapqr��_weakrefrr:�	itertoolsrr�rr�rr��reprlibrry�_collectionsr�ImportError�MutableSequence�registerrr#�KeysViewr$�	ItemsViewr/�
ValuesViewr2rxr3rLrr{rr�rrur	rr�Sequencerr!r!r!r"�<module>sh
�Y&}nMS__init__.cpython-38.opt-1.pyc000064400000132546151730671120011710 0ustar00U

e5dC��	@s&dZddddddddd	g	Zd
dlZd
dlmZmZd
d
lm	Z
d
dlZd
dl
Zd
dlmZd
dlmZmZmZd
dlmZzd
dlmZWnek
r�YnXej� e�zd
dlm!Z!Wnek
r�YnXdd�Z"Gdd�dej#�Z$Gdd�dej%�Z&Gdd�dej'�Z(Gdd�de)�Z*Gdd�de+�Z,zd
dlm,Z,Wnek
�rVYnXzd
dlm-Z-Wnek
�r�d d!�Z-YnXd"ddd#�d$d�Z.d%d&�Z/zd
d'lm/Z/Wnek
�r�YnXGd(d�de+�Z0Gd)d	�d	ej1�Z2Gd*d�dej1�Z3Gd+d�dej�Z4Gd,d�dej5�Z6dS)-a?This module implements specialized container datatypes providing
alternatives to Python's general purpose built-in containers, dict,
list, set, and tuple.

* namedtuple   factory function for creating tuple subclasses with named fields
* deque        list-like container with fast appends and pops on either end
* ChainMap     dict-like class for creating a single view of multiple mappings
* Counter      dict subclass for counting hashable objects
* OrderedDict  dict subclass that remembers the order entries were added
* defaultdict  dict subclass that calls a factory function to supply missing values
* UserDict     wrapper around dictionary objects for easier dict subclassing
* UserList     wrapper around list objects for easier list subclassing
* UserString   wrapper around string objects for easier string subclassing

�deque�defaultdict�
namedtuple�UserDict�UserList�
UserString�Counter�OrderedDict�ChainMap�N)�
itemgetter�eq)�	iskeyword)�proxy)�repeat�chain�starmap)�recursive_repr)r)rcCsR|tjkr:tt|�}ddl}|jdtdd�|t�|<|Stdt�d|����dS)Nr
z�Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated since Python 3.3, and in 3.10 it will stop working���
stacklevelzmodule z has no attribute )	�_collections_abc�__all__�getattr�warnings�warn�DeprecationWarning�globals�AttributeError�__name__)�name�objr�r!�,/usr/lib64/python3.8/collections/__init__.py�__getattr__*s

�
r#c@seZdZdd�ZdS)�_OrderedDictKeysViewccst|j�EdHdS�N��reversed�_mapping��selfr!r!r"�__reversed__?sz!_OrderedDictKeysView.__reversed__N�r�
__module__�__qualname__r+r!r!r!r"r$=sr$c@seZdZdd�ZdS)�_OrderedDictItemsViewccs$t|j�D]}||j|fVq
dSr%r&�r*�keyr!r!r"r+Dsz"_OrderedDictItemsView.__reversed__Nr,r!r!r!r"r/Bsr/c@seZdZdd�ZdS)�_OrderedDictValuesViewccs t|j�D]}|j|Vq
dSr%r&r0r!r!r"r+Jsz#_OrderedDictValuesView.__reversed__Nr,r!r!r!r"r2Hsr2c@seZdZdZdS)�_Link)�prev�nextr1�__weakref__N)rr-r.�	__slots__r!r!r!r"r3Nsr3c@s�eZdZdZd+dd�Zejeefdd�Zej	fdd�Z	d	d
�Z
dd�Zd
d�Zd,dd�Z
d-dd�Zdd�ZejjZZdd�Zdd�Zdd�ZejjZe�Zefdd�Zd.dd �Ze�d!d"��Zd#d$�Zd%d&�Ze d/d'd(��Z!d)d*�Z"dS)0rz)Dictionary that remembers insertion orderr!cKs\z
|jWn>tk
rHt�|_t|j�|_}||_|_i|_YnX|j|f|�dS)z�Initialize an ordered dictionary.  The signature is the same as
        regular dictionaries.  Keyword argument order is preserved.
        N)	�_OrderedDict__rootrr3�_OrderedDict__hardroot�_proxyr4r5�_OrderedDict__map�_OrderedDict__update)r*�other�kwds�rootr!r!r"�__init__`s
zOrderedDict.__init__c	CsZ||krJ|�|j|<}|j}|j}||||_|_|_||_||�|_||||�dS)z!od.__setitem__(i, y) <==> od[i]=yN)r;r8r4r5r1)	r*r1�valueZdict_setitemrZLink�linkr?�lastr!r!r"�__setitem__ms
zOrderedDict.__setitem__cCs>|||�|j�|�}|j}|j}||_||_d|_d|_dS)z od.__delitem__(y) <==> del od[y]N)r;�popr4r5)r*r1Zdict_delitemrB�	link_prev�	link_nextr!r!r"�__delitem__{s
zOrderedDict.__delitem__ccs(|j}|j}||k	r$|jV|j}qdS)zod.__iter__() <==> iter(od)N)r8r5r1�r*r?Zcurrr!r!r"�__iter__�s
zOrderedDict.__iter__ccs(|j}|j}||k	r$|jV|j}qdS)z#od.__reversed__() <==> reversed(od)N)r8r4r1rIr!r!r"r+�s
zOrderedDict.__reversed__cCs*|j}||_|_|j��t�|�dS)z.od.clear() -> None.  Remove all items from od.N)r8r4r5r;�clear�dict)r*r?r!r!r"rK�s
zOrderedDict.clearTcCsj|std��|j}|r0|j}|j}||_||_n|j}|j}||_||_|j}|j|=t�||�}||fS)z�Remove and return a (key, value) pair from the dictionary.

        Pairs are returned in LIFO order if last is true or FIFO order if false.
        zdictionary is empty)�KeyErrorr8r4r5r1r;rLrE)r*rCr?rBrFrGr1rAr!r!r"�popitem�s zOrderedDict.popitemc	Cst|j|}|j}|j}|j}||_||_|j}|rR|j}||_||_||_||_n|j}||_||_||_||_dS)z�Move an existing element to the end (or beginning if last is false).

        Raise KeyError if the element does not exist.
        N)r;r4r5r8)	r*r1rCrBrFrGZ	soft_linkr?�firstr!r!r"�move_to_end�s$
zOrderedDict.move_to_endcCsVtj}t|�d}||j�}|||j�d7}|||j�|7}|||j�|7}|S)N�r)�_sys�	getsizeof�len�__dict__r;r9r8)r*Zsizeof�n�sizer!r!r"�
__sizeof__�s
zOrderedDict.__sizeof__cCst|�S)z:D.keys() -> a set-like object providing a view on D's keys)r$r)r!r!r"�keys�szOrderedDict.keyscCst|�S)z<D.items() -> a set-like object providing a view on D's items)r/r)r!r!r"�items�szOrderedDict.itemscCst|�S)z6D.values() -> an object providing a view on D's values)r2r)r!r!r"�values�szOrderedDict.valuescCs0||kr||}||=|S||jkr,t|��|S)z�od.pop(k[,d]) -> v, remove specified key and return the corresponding
        value.  If key is not found, d is returned if given, otherwise KeyError
        is raised.

        )�_OrderedDict__markerrM)r*r1�default�resultr!r!r"rE�s
zOrderedDict.popNcCs||kr||S|||<|S)z�Insert key with a value of default if key is not in the dictionary.

        Return the value for key if key is in the dictionary, else default.
        r!�r*r1r]r!r!r"�
setdefault�szOrderedDict.setdefaultcCs*|sd|jjfSd|jjt|���fS)zod.__repr__() <==> repr(od)�%s()z%s(%r))�	__class__r�listrZr)r!r!r"�__repr__szOrderedDict.__repr__cCsDt|���}tt��D]}|�|d�q|jd|p4ddt|���fS)z%Return state information for picklingNr!)�vars�copyrrErb�iterrZ)r*Z	inst_dict�kr!r!r"�
__reduce__szOrderedDict.__reduce__cCs
|�|�S)z!od.copy() -> a shallow copy of od�rbr)r!r!r"rfszOrderedDict.copycCs|�}|D]}|||<q
|S)zYCreate a new ordered dictionary with keys from iterable and values set to value.
        r!)�cls�iterablerAr*r1r!r!r"�fromkeyss
zOrderedDict.fromkeyscCs2t|t�r&t�||�o$ttt||��St�||�S)z�od.__eq__(y) <==> od==y.  Comparison to another OD is order-sensitive
        while comparison to a regular mapping is order-insensitive.

        )�
isinstancerrL�__eq__�all�map�_eq�r*r=r!r!r"ros
zOrderedDict.__eq__)r!)T)T)N)N)#rr-r.�__doc__r@rLrDr:r3rHrJr+rKrNrPrXr�MutableMapping�updater<rYrZr[�__ne__�objectr\rEr`�_recursive_reprrdrirf�classmethodrmror!r!r!r"rQs8
�

		

	


)r)�_tuplegettercCstt|�|d�S)N)�doc)�property�_itemgetter)�indexr|r!r!r"�<lambda>7�r�F)�rename�defaults�modulecs�t�t�r��dd����ttt����t�t|��}|r�t�}t	��D]B\}}|�
�rrt|�sr|�d�sr||kr�d|���|<|�
|�qH|g�D]D}t|�tk	r�td��|�
�s�td|����t|�r�td|����q�t�}�D]F}|�d��r
|�s
td|����||k�r"td|����|�
|�q�i}|d	k	�r|t|�}t|�t��k�r^td
��ttttt��t|�����}tttj����t���t���dd�d
d�}	dd�dd��D��d�tj�tttttf\�����d|	�d|	�d�}
�d|��d�}t|
|�|d}d|�d|	�d�|_|d	k	�r>||_t���fdd��}
d|�d�|
j_��fdd �}d!|�d"�|_�fd#d$�}��fd%d&�}�fd'd(�}||
j||||fD]}|�d)|j��|_�q�|�d|	�d�d*�||||
||||d+�}t	��D](\}}t�d,|���}t ||�||<�qt|tf|�}|d	k�rvzt�!d
�j"�#d-d.�}Wnt$tfk
�rtYnX|d	k	�r�||_%|S)/aCReturns a new subclass of tuple with named fields.

    >>> Point = namedtuple('Point', ['x', 'y'])
    >>> Point.__doc__                   # docstring for the new class
    'Point(x, y)'
    >>> p = Point(11, y=22)             # instantiate with positional args or keywords
    >>> p[0] + p[1]                     # indexable like a plain tuple
    33
    >>> x, y = p                        # unpack like a regular tuple
    >>> x, y
    (11, 22)
    >>> p.x + p.y                       # fields also accessible by name
    33
    >>> d = p._asdict()                 # convert to a dictionary
    >>> d['x']
    11
    >>> Point(**d)                      # convert from a dictionary
    Point(x=11, y=22)
    >>> p._replace(x=100)               # _replace() is like str.replace() but targets named fields
    Point(x=100, y=22)

    �,� �_z*Type names and field names must be stringsz6Type names and field names must be valid identifiers: z0Type names and field names cannot be a keyword: z-Field names cannot start with an underscore: z"Encountered duplicate field name: Nz(Got more default values than field names�'�rQ����(�, css|]}|�d�VqdS)z=%rNr!)�.0rr!r!r"�	<genexpr>�sznamedtuple.<locals>.<genexpr>�)zdef __new__(_cls, z): return _tuple_new(_cls, (z))�namedtuple_)�
_tuple_newr�__new__zCreate new instance of cs2�||�}�|��kr.td��dt|�����|S)Nz	Expected z arguments, got )�	TypeErrorrT)rkrlr^)�_len�
num_fields�	tuple_newr!r"�_make�s
znamedtuple.<locals>._makezMake a new z# object from a sequence or iterablecs.|��|j�|��}|r*tdt|�����|S)NzGot unexpected field names: )r�rE�
ValueErrorrc)r*r>r^)�_map�field_namesr!r"�_replace�sznamedtuple.<locals>._replacez
Return a new z2 object replacing specified fields with new valuescs|jj�|S)z/Return a nicely formatted representation string)rbrr))�repr_fmtr!r"rd�sznamedtuple.<locals>.__repr__cs��|j|��S)z9Return a new dict which maps field names to their values.)�_fieldsr))�_dict�_zipr!r"�_asdict�sznamedtuple.<locals>._asdictcs�|�S)z7Return self as a plain tuple.  Used by copy and pickle.r!r))�_tupler!r"�__getnewargs__�sz"namedtuple.<locals>.__getnewargs__�.r!)rtr7r��_field_defaults�_fields_defaultsr�r�r�rdr�r�zAlias for field number r�__main__)&rn�str�replace�splitrcrqrR�intern�set�	enumerate�isidentifier�
_iskeyword�
startswith�add�typer�r��tuplerTrLr'�zip�repr�joinr��execrt�__defaults__rz�__func__rr.r{�	_getframe�	f_globals�getrr-)�typenamer�r�r�r��seenrr�field_defaults�arg_list�s�	namespacer�r�r�rdr�r��method�class_namespacer|r^r!)	r�r�r�r�r�r�r�r�r�r"r9s�
���

�


��

cCs&|j}|D]}||d�d||<q
dS)z!Tally elements from the iterable.r
rQN)r�)�mappingrlZmapping_get�elemr!r!r"�_count_elements�sr�)r�cs�eZdZdZd/�fdd�	Zdd�Zd0dd�Zd	d
�Zed1dd��Z	d2�fd
d�	Z
d3dd�Zdd�Zdd�Z
�fdd�Zdd�Zdd�Zdd�Zdd�Zdd �Zd!d"�Zd#d$�Zd%d&�Zd'd(�Zd)d*�Zd+d,�Zd-d.�Z�ZS)4ra�Dict subclass for counting hashable items.  Sometimes called a bag
    or multiset.  Elements are stored as dictionary keys and their counts
    are stored as dictionary values.

    >>> c = Counter('abcdeabcdabcaba')  # count elements from a string

    >>> c.most_common(3)                # three most common elements
    [('a', 5), ('b', 4), ('c', 3)]
    >>> sorted(c)                       # list all unique elements
    ['a', 'b', 'c', 'd', 'e']
    >>> ''.join(sorted(c.elements()))   # list elements with repetitions
    'aaaaabbbbcccdde'
    >>> sum(c.values())                 # total of all counts
    15

    >>> c['a']                          # count of letter 'a'
    5
    >>> for elem in 'shazam':           # update counts from an iterable
    ...     c[elem] += 1                # by adding 1 to each element's count
    >>> c['a']                          # now there are seven 'a'
    7
    >>> del c['b']                      # remove all 'b'
    >>> c['b']                          # now there are zero 'b'
    0

    >>> d = Counter('simsalabim')       # make another counter
    >>> c.update(d)                     # add in the second counter
    >>> c['a']                          # now there are nine 'a'
    9

    >>> c.clear()                       # empty the counter
    >>> c
    Counter()

    Note:  If a count is set to zero or reduced to zero, it will remain
    in the counter until the entry is deleted or the counter is cleared:

    >>> c = Counter('aaabbc')
    >>> c['b'] -= 2                     # reduce the count of 'b' by two
    >>> c.most_common()                 # 'b' is still in, but its count is zero
    [('a', 3), ('c', 1), ('b', 0)]

    Ncs tt|���|j|f|�dS)a	Create a new, empty Counter object.  And if given, count elements
        from an input iterable.  Or, initialize the count from another mapping
        of elements to their counts.

        >>> c = Counter()                           # a new, empty counter
        >>> c = Counter('gallahad')                 # a new counter from an iterable
        >>> c = Counter({'a': 4, 'b': 2})           # a new counter from a mapping
        >>> c = Counter(a=4, b=2)                   # a new counter from keyword args

        N)�superrr@rv)r*rlr>rjr!r"r@szCounter.__init__cCsdS)z1The count of elements not in the Counter is zero.r
r!r0r!r!r"�__missing__*szCounter.__missing__cCs6|dkrt|��td�dd�Stj||��td�d�S)z�List the n most common elements and their counts from the most
        common to the least.  If n is None, then list all element counts.

        >>> Counter('abracadabra').most_common(3)
        [('a', 5), ('b', 2), ('r', 2)]

        NrQT)r1�reverse�r1)�sortedrZr~�_heapq�nlargest�r*rVr!r!r"�most_common/s	zCounter.most_commoncCst�tt|����S)a�Iterator over elements repeating each as many times as its count.

        >>> c = Counter('ABCABC')
        >>> sorted(c.elements())
        ['A', 'A', 'B', 'B', 'C', 'C']

        # Knuth's example for prime factors of 1836:  2**2 * 3**3 * 17**1
        >>> prime_factors = Counter({2: 2, 3: 3, 17: 1})
        >>> product = 1
        >>> for factor in prime_factors.elements():     # loop over factors
        ...     product *= factor                       # and multiply them
        >>> product
        1836

        Note, if an element's count has been set to zero or is a negative
        number, elements() will ignore it.

        )�_chain�
from_iterable�_starmap�_repeatrZr)r!r!r"�elements<szCounter.elementscCstd��dS)Nz@Counter.fromkeys() is undefined.  Use Counter(iterable) instead.)�NotImplementedError)rkrl�vr!r!r"rmTs	�zCounter.fromkeyscsr|dk	r`t|tj�rV|rD|j}|��D]\}}|||d�||<q&q`tt|��|�n
t||�|rn|�|�dS)a�Like dict.update() but add counts instead of replacing them.

        Source can be an iterable, a dictionary, or another Counter instance.

        >>> c = Counter('which')
        >>> c.update('witch')           # add elements from another iterable
        >>> d = Counter('watch')
        >>> c.update(d)                 # add elements from another counter
        >>> c['h']                      # four 'h' in which, witch, and watch
        4

        Nr
)	rnr�Mappingr�rZr�rrvr��r*rlr>�self_getr��countrjr!r"rv`s
zCounter.updatecKsn|dk	r\|j}t|tj�r@|��D]\}}||d�|||<q"n|D]}||d�d||<qD|rj|�|�dS)a�Like dict.update() but subtracts counts instead of replacing them.
        Counts can be reduced below zero.  Both the inputs and outputs are
        allowed to contain zero and negative counts.

        Source can be an iterable, a dictionary, or another Counter instance.

        >>> c = Counter('which')
        >>> c.subtract('witch')             # subtract elements from another iterable
        >>> c.subtract(Counter('watch'))    # subtract elements from another counter
        >>> c['h']                          # 2 in which, minus 1 in witch, minus 1 in watch
        0
        >>> c['w']                          # 1 in which, minus 1 in witch, minus 1 in watch
        -1

        Nr
rQ)r�rnrr�rZ�subtractr�r!r!r"r��szCounter.subtractcCs
|�|�S)zReturn a shallow copy.rjr)r!r!r"rf�szCounter.copycCs|jt|�ffSr%)rbrLr)r!r!r"ri�szCounter.__reduce__cs||krt��|�dS)zGLike dict.__delitem__() but does not raise KeyError for missing values.N)r�rH)r*r�rjr!r"rH�szCounter.__delitem__cCsf|sd|jjSz(d�tdj|����}d|jj|fWStk
r`d�|jjt|��YSXdS)Nrar�z%r: %rz%s({%s})z
{0}({1!r}))	rbrr�rq�__mod__r�r��formatrL)r*rZr!r!r"rd�szCounter.__repr__cCspt|t�stSt�}|��D]$\}}|||}|dkr|||<q|��D] \}}||krJ|dkrJ|||<qJ|S)zAdd counts from two counters.

        >>> Counter('abbb') + Counter('bcc')
        Counter({'b': 4, 'c': 2, 'a': 1})

        r
�rnr�NotImplementedrZ�r*r=r^r�r��newcountr!r!r"�__add__�s


zCounter.__add__cCstt|t�stSt�}|��D]$\}}|||}|dkr|||<q|��D]$\}}||krJ|dkrJd|||<qJ|S)z� Subtract count, but keep only results with positive counts.

        >>> Counter('abbbc') - Counter('bccd')
        Counter({'b': 2, 'a': 1})

        r
r�r�r!r!r"�__sub__�s

zCounter.__sub__cCs|t|t�stSt�}|��D]0\}}||}||kr8|n|}|dkr|||<q|��D] \}}||krV|dkrV|||<qV|S)z�Union is the maximum of value in either of the input counters.

        >>> Counter('abbb') | Counter('bcc')
        Counter({'b': 3, 'c': 2, 'a': 1})

        r
r��r*r=r^r�r��other_countr�r!r!r"�__or__�s


zCounter.__or__cCsRt|t�stSt�}|��D]0\}}||}||kr8|n|}|dkr|||<q|S)z� Intersection is the minimum of corresponding counts.

        >>> Counter('abbb') & Counter('bcc')
        Counter({'b': 1})

        r
r�r�r!r!r"�__and__�s

zCounter.__and__cCs,t�}|��D]\}}|dkr|||<q|S)zEAdds an empty counter, effectively stripping negative and zero countsr
�rrZ�r*r^r�r�r!r!r"�__pos__
s

zCounter.__pos__cCs0t�}|��D]\}}|dkrd|||<q|S)z{Subtracts from an empty counter.  Strips positive and zero counts,
        and flips the sign on negative counts.

        r
r�r�r!r!r"�__neg__s
zCounter.__neg__cCs&dd�|��D�}|D]
}||=q|S)z?Internal method to strip elements with a negative or zero countcSsg|]\}}|dks|�qS)r
r!)r�r�r�r!r!r"�
<listcomp>"sz*Counter._keep_positive.<locals>.<listcomp>)rZ)r*�nonpositiver�r!r!r"�_keep_positive szCounter._keep_positivecCs*|��D]\}}|||7<q|��S)z�Inplace add from another counter, keeping only positive counts.

        >>> c = Counter('abbb')
        >>> c += Counter('bcc')
        >>> c
        Counter({'b': 4, 'c': 2, 'a': 1})

        �rZr��r*r=r�r�r!r!r"�__iadd__'s	zCounter.__iadd__cCs*|��D]\}}|||8<q|��S)z�Inplace subtract counter, but keep only results with positive counts.

        >>> c = Counter('abbbc')
        >>> c -= Counter('bccd')
        >>> c
        Counter({'b': 2, 'a': 1})

        r�r�r!r!r"�__isub__4s	zCounter.__isub__cCs2|��D] \}}||}||kr|||<q|��S)z�Inplace union is the maximum of value from either counter.

        >>> c = Counter('abbb')
        >>> c |= Counter('bcc')
        >>> c
        Counter({'b': 3, 'c': 2, 'a': 1})

        r�)r*r=r�r�r�r!r!r"�__ior__As
	
zCounter.__ior__cCs2|��D] \}}||}||kr|||<q|��S)z�Inplace intersection is the minimum of corresponding counts.

        >>> c = Counter('abbb')
        >>> c &= Counter('bcc')
        >>> c
        Counter({'b': 1})

        r�)r*r=r�r�r�r!r!r"�__iand__Ps
	
zCounter.__iand__)N)N)N)N)N)rr-r.rtr@r�r�r�rzrmrvr�rfrirHrdr�r�r�r�r�r�r�r�r�r�r��
__classcell__r!r!rjr"r�s02

!


c@s�eZdZdZdd�Zdd�Zdd�Zd'd	d
�Zdd�Zd
d�Z	dd�Z
dd�Ze�dd��Z
edd��Zdd�ZeZd(dd�Zedd��Zdd�Zdd �Zd!d"�Zd#d$�Zd%d&�ZdS))r	a� A ChainMap groups multiple dicts (or other mappings) together
    to create a single, updateable view.

    The underlying mappings are stored in a list.  That list is public and can
    be accessed or updated using the *maps* attribute.  There is no other
    state.

    Lookups search the underlying mappings successively until a key is found.
    In contrast, writes, updates, and deletions only operate on the first
    mapping.

    cGst|�pig|_dS)z�Initialize a ChainMap by setting *maps* to the given mappings.
        If no mappings are provided, a single empty dictionary is used.

        N)rc�maps)r*r�r!r!r"r@rszChainMap.__init__cCst|��dSr%)rMr0r!r!r"r�yszChainMap.__missing__c	Cs:|jD](}z||WStk
r,YqXq|�|�Sr%)r�rMr�)r*r1r�r!r!r"�__getitem__|s
zChainMap.__getitem__NcCs||kr||S|Sr%r!r_r!r!r"r��szChainMap.getcCstt�j|j��Sr%)rTr��unionr�r)r!r!r"�__len__�szChainMap.__len__cCs&i}t|j�D]}|�|�qt|�Sr%)r'r�rvrg)r*�dr�r!r!r"rJ�szChainMap.__iter__cst�fdd�|jD��S)Nc3s|]}�|kVqdSr%r!)r��mr�r!r"r��sz(ChainMap.__contains__.<locals>.<genexpr>��anyr�r0r!r�r"�__contains__�szChainMap.__contains__cCs
t|j�Sr%r�r)r!r!r"�__bool__�szChainMap.__bool__cCs"|jj�dd�tt|j���d�S)Nr�r�r�)rbrr�rqr�r�r)r!r!r"rd�szChainMap.__repr__cGs|tj|f|���S)z?Create a ChainMap with a single dict created from the iterable.)rLrm)rkrl�argsr!r!r"rm�szChainMap.fromkeyscCs$|j|jd��f|jdd���S)zHNew ChainMap or subclass with a new copy of maps[0] and refs to maps[1:]r
rQN)rbr�rfr)r!r!r"rf�sz
ChainMap.copycCs|dkri}|j|f|j��S)zyNew ChainMap with a new map followed by all previous maps.
        If no map is provided, an empty dict is used.
        N�rbr�)r*r�r!r!r"�	new_child�szChainMap.new_childcCs|j|jdd��S)zNew ChainMap from maps[1:].rQNrr)r!r!r"�parents�szChainMap.parentscCs||jd|<dS�Nr
)r�)r*r1rAr!r!r"rD�szChainMap.__setitem__cCs8z|jd|=Wn"tk
r2td�|���YnXdS)Nr
�(Key not found in the first mapping: {!r})r�rMr�r0r!r!r"rH�szChainMap.__delitem__cCs2z|jd��WStk
r,td��YnXdS)zPRemove and return an item pair from maps[0]. Raise KeyError is maps[0] is empty.r
z#No keys found in the first mapping.N)r�rNrMr)r!r!r"rN�szChainMap.popitemcGs@z|jdj|f|��WStk
r:td�|���YnXdS)zWRemove *key* from maps[0] and return its value. Raise KeyError if *key* not in maps[0].r
rN)r�rErMr�)r*r1rr!r!r"rE�szChainMap.popcCs|jd��dS)z'Clear maps[0], leaving maps[1:] intact.r
N)r�rKr)r!r!r"rK�szChainMap.clear)N)N)rr-r.rtr@r�r�r�r�rJr�r�ryrdrzrmrf�__copy__rr}rrDrHrNrErKr!r!r!r"r	ds.





c@speZdZdd�Zde_dd�Zdd�Zdd	�Zd
d�Zdd
�Z	dd�Z
dd�Zdd�Zdd�Z
eddd��ZdS)rcOs�|std��|^}}t|�dkr0tdt|���|r>|d}n0d|krj|�d�}ddl}|jdtdd�nd}i|_|dk	r�|�|�|r�|�|�dS)	Nz<descriptor '__init__' of 'UserDict' object needs an argumentrQz$expected at most 1 arguments, got %dr
rLz0Passing 'dict' as keyword argument is deprecatedrr)r�rTrErrr�datarv)r�kwargsr*rLrr!r!r"r@�s(

�
zUserDict.__init__z($self, dict=None, /, **kwargs)cCs
t|j�Sr%�rTrr)r!r!r"r��r�zUserDict.__len__cCs:||jkr|j|St|jd�r.|j�||�St|��dS)Nr�)r�hasattrrbr�rMr0r!r!r"r��s


zUserDict.__getitem__cCs||j|<dSr%�r)r*r1�itemr!r!r"rD�r�zUserDict.__setitem__cCs|j|=dSr%rr0r!r!r"rH�r�zUserDict.__delitem__cCs
t|j�Sr%)rgrr)r!r!r"rJ�szUserDict.__iter__cCs
||jkSr%rr0r!r!r"r��szUserDict.__contains__cCs
t|j�Sr%�r�rr)r!r!r"rd�r�zUserDict.__repr__cCs4|j�|j�}|j�|j�|jd��|jd<|S�Nr)rbr�rUrvrf�r*�instr!r!r"r�szUserDict.__copy__cCsR|jtkrt|j���Sddl}|j}zi|_|�|�}W5||_X|�|�|Sr)rbrrrfrv)r*rfr�cr!r!r"rfs

z
UserDict.copyNcCs|�}|D]}|||<q
|Sr%r!)rkrlrAr�r1r!r!r"rms
zUserDict.fromkeys)N)rr-r.r@�__text_signature__r�r�rDrHrJr�rdrrfrzrmr!r!r!r"r�s
c@seZdZdZd@dd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zdd �Zd!d"�Zd#d$�ZeZd%d&�Zd'd(�Zd)d*�Zd+d,�ZdAd.d/�Zd0d1�Zd2d3�Zd4d5�Zd6d7�Zd8d9�Zd:d;�Z d<d=�Z!d>d?�Z"dS)BrzAA more or less complete user-defined wrapper around list objects.NcCsbg|_|dk	r^t|�t|j�kr0||jdd�<n.t|t�rT|jdd�|jdd�<n
t|�|_dSr%)rr�rnrrc)r*�initlistr!r!r"r@!s
zUserList.__init__cCs
t|j�Sr%r
r)r!r!r"rd+r�zUserList.__repr__cCs|j|�|�kSr%�r�_UserList__castrsr!r!r"�__lt__,r�zUserList.__lt__cCs|j|�|�kSr%rrsr!r!r"�__le__-r�zUserList.__le__cCs|j|�|�kSr%rrsr!r!r"ro.r�zUserList.__eq__cCs|j|�|�kSr%rrsr!r!r"�__gt__/r�zUserList.__gt__cCs|j|�|�kSr%rrsr!r!r"�__ge__0r�zUserList.__ge__cCst|t�r|jS|Sr%)rnrrrsr!r!r"�__cast1szUserList.__castcCs
||jkSr%r�r*rr!r!r"r�3r�zUserList.__contains__cCs
t|j�Sr%r	r)r!r!r"r�4r�zUserList.__len__cCs(t|t�r|�|j|�S|j|SdSr%)rn�slicerbr�r*�ir!r!r"r�5s
zUserList.__getitem__cCs||j|<dSr%r�r*rrr!r!r"rD:r�zUserList.__setitem__cCs|j|=dSr%rrr!r!r"rH;r�zUserList.__delitem__cCsPt|t�r|�|j|j�St|t|j��r<|�|j|�S|�|jt|��Sr%�rnrrbrr�rcrsr!r!r"r�<s

zUserList.__add__cCsPt|t�r|�|j|j�St|t|j��r<|�||j�S|�t|�|j�Sr%r rsr!r!r"�__radd__Bs

zUserList.__radd__cCsRt|t�r|j|j7_n2t|t|j��r<|j|7_n|jt|�7_|Sr%)rnrrr�rcrsr!r!r"r�Hs
zUserList.__iadd__cCs|�|j|�Sr%�rbrr�r!r!r"�__mul__PszUserList.__mul__cCs|j|9_|Sr%rr�r!r!r"�__imul__SszUserList.__imul__cCs8|j�|j�}|j�|j�|jddd�|jd<|Sr)rbr�rUrvrr!r!r"rVszUserList.__copy__cCs|j�|�dSr%)r�appendrr!r!r"r%\r�zUserList.appendcCs|j�||�dSr%)r�insertrr!r!r"r&]r�zUserList.insertr�cCs|j�|�Sr%)rrErr!r!r"rE^r�zUserList.popcCs|j�|�dSr%)r�removerr!r!r"r'_r�zUserList.removecCs|j��dSr%)rrKr)r!r!r"rK`r�zUserList.clearcCs
|�|�Sr%rjr)r!r!r"rfar�z
UserList.copycCs|j�|�Sr%)rr�rr!r!r"r�br�zUserList.countcGs|jj|f|��Sr%�rr)r*rrr!r!r"rcr�zUserList.indexcCs|j��dSr%)rr�r)r!r!r"r�dr�zUserList.reversecOs|jj||�dSr%)r�sort�r*rr>r!r!r"r)er�z
UserList.sortcCs*t|t�r|j�|j�n|j�|�dSr%)rnrr�extendrsr!r!r"r+fs
zUserList.extend)N)r�)#rr-r.rtr@rdrrrorrrr�r�r�rDrHr�r!r�r#�__rmul__r$rr%r&rEr'rKrfr�rr�r)r+r!r!r!r"rs@


c@sheZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zdd �Zd!d"�Zd#d$�Zd%d&�ZeZd'd(�Zd)d*�Zd+d,�Zd-d.�Zd/d0�Zd1ejfd2d3�Zd�d6d7�Zd1ejfd8d9�Z d�d;d<�Z!d1ejfd=d>�Z"d?d@�Z#dAdB�Z$d1ejfdCdD�Z%dEdF�Z&dGdH�Z'dIdJ�Z(dKdL�Z)dMdN�Z*dOdP�Z+dQdR�Z,dSdT�Z-dUdV�Z.dWdX�Z/dYdZ�Z0d[d\�Z1d]d^�Z2d_d`�Z3dadb�Z4d�ddde�Z5e6j7Z7dfdg�Z8d�didj�Z9d1ejfdkdl�Z:d1ejfdmdn�Z;dodp�Z<dqdr�Z=d�dsdt�Z>d�dudv�Z?d�dwdx�Z@d�dzd{�ZAd1ejfd|d}�ZBd�d~d�ZCd�d��ZDd�d��ZEd�d��ZFd�d��ZGd�d��ZHdcS)�rcCs<t|t�r||_n&t|t�r.|jdd�|_n
t|�|_dSr%)rnr�rr�r*�seqr!r!r"r@ss


zUserString.__init__cCs
t|j�Sr%)r�rr)r!r!r"�__str__zr�zUserString.__str__cCs
t|j�Sr%r
r)r!r!r"rd{r�zUserString.__repr__cCs
t|j�Sr%)�intrr)r!r!r"�__int__|r�zUserString.__int__cCs
t|j�Sr%)�floatrr)r!r!r"�	__float__}r�zUserString.__float__cCs
t|j�Sr%)�complexrr)r!r!r"�__complex__~r�zUserString.__complex__cCs
t|j�Sr%)�hashrr)r!r!r"�__hash__r�zUserString.__hash__cCs|jdd�fSr%rr)r!r!r"r��szUserString.__getnewargs__cCs t|t�r|j|jkS|j|kSr%�rnrr�r*�stringr!r!r"ro�s
zUserString.__eq__cCs t|t�r|j|jkS|j|kSr%r8r9r!r!r"r�s
zUserString.__lt__cCs t|t�r|j|jkS|j|kSr%r8r9r!r!r"r�s
zUserString.__le__cCs t|t�r|j|jkS|j|kSr%r8r9r!r!r"r�s
zUserString.__gt__cCs t|t�r|j|jkS|j|kSr%r8r9r!r!r"r�s
zUserString.__ge__cCst|t�r|j}||jkSr%r8)r*�charr!r!r"r��s
zUserString.__contains__cCs
t|j�Sr%r	r)r!r!r"r��r�zUserString.__len__cCs|�|j|�Sr%r")r*rr!r!r"r��r�zUserString.__getitem__cCsJt|t�r|�|j|j�St|t�r6|�|j|�S|�|jt|��Sr%)rnrrbrr�rsr!r!r"r��s


zUserString.__add__cCs.t|t�r|�||j�S|�t|�|j�Sr%)rnr�rbrrsr!r!r"r!�s
zUserString.__radd__cCs|�|j|�Sr%r"r�r!r!r"r#�szUserString.__mul__cCs|�|j|�Sr%r"�r*rr!r!r"r��szUserString.__mod__cCs|�t|�|�Sr%)rbr�)r*�templater!r!r"�__rmod__�szUserString.__rmod__cCs|�|j���Sr%)rbr�
capitalizer)r!r!r"r?�r�zUserString.capitalizecCs|�|j���Sr%)rbr�casefoldr)r!r!r"r@�szUserString.casefoldcGs|�|jj|f|���Sr%)rbr�center�r*�widthrr!r!r"rA�szUserString.centerr
cCs t|t�r|j}|j�|||�Sr%)rnrrr��r*�sub�start�endr!r!r"r��s
zUserString.count�utf-8�strictcCs.|dkrdn|}|dkrdn|}|j�||�S)NrHrI)r�encode)r*�encoding�errorsr!r!r"rJ�szUserString.encodecCs|j�|||�Sr%)r�endswith)r*�suffixrFrGr!r!r"rM�szUserString.endswith�cCs|�|j�|��Sr%)rbr�
expandtabs)r*�tabsizer!r!r"rP�szUserString.expandtabscCs t|t�r|j}|j�|||�Sr%)rnrr�findrDr!r!r"rR�s
zUserString.findcOs|jj||�Sr%)rr�r*r!r!r"r��szUserString.formatcCs|j�|�Sr%)r�
format_map)r*r�r!r!r"rS�szUserString.format_mapcCs|j�|||�Sr%r(rDr!r!r"r�szUserString.indexcCs
|j��Sr%)r�isalphar)r!r!r"rT�r�zUserString.isalphacCs
|j��Sr%)r�isalnumr)r!r!r"rU�r�zUserString.isalnumcCs
|j��Sr%)r�isasciir)r!r!r"rV�r�zUserString.isasciicCs
|j��Sr%)r�	isdecimalr)r!r!r"rW�r�zUserString.isdecimalcCs
|j��Sr%)r�isdigitr)r!r!r"rX�r�zUserString.isdigitcCs
|j��Sr%)rr�r)r!r!r"r��r�zUserString.isidentifiercCs
|j��Sr%)r�islowerr)r!r!r"rY�r�zUserString.islowercCs
|j��Sr%)r�	isnumericr)r!r!r"rZ�r�zUserString.isnumericcCs
|j��Sr%)r�isprintabler)r!r!r"r[�r�zUserString.isprintablecCs
|j��Sr%)r�isspacer)r!r!r"r\�r�zUserString.isspacecCs
|j��Sr%)r�istitler)r!r!r"r]�r�zUserString.istitlecCs
|j��Sr%)r�isupperr)r!r!r"r^�r�zUserString.isuppercCs|j�|�Sr%)rr�r-r!r!r"r��r�zUserString.joincGs|�|jj|f|���Sr%)rbr�ljustrBr!r!r"r_�szUserString.ljustcCs|�|j���Sr%)rbr�lowerr)r!r!r"r`�r�zUserString.lowerNcCs|�|j�|��Sr%)rbr�lstrip�r*�charsr!r!r"ra�r�zUserString.lstripcCs|j�|�Sr%)r�	partition�r*�sepr!r!r"rd�szUserString.partitionr�cCs6t|t�r|j}t|t�r |j}|�|j�|||��Sr%)rnrrrbr�)r*�old�new�maxsplitr!r!r"r��s


zUserString.replacecCs t|t�r|j}|j�|||�Sr%)rnrr�rfindrDr!r!r"rj�s
zUserString.rfindcCs|j�|||�Sr%)r�rindexrDr!r!r"rk�szUserString.rindexcGs|�|jj|f|���Sr%)rbr�rjustrBr!r!r"rl�szUserString.rjustcCs|j�|�Sr%)r�
rpartitionrer!r!r"rm�szUserString.rpartitioncCs|�|j�|��Sr%)rbr�rstriprbr!r!r"rn�szUserString.rstripcCs|j�||�Sr%)rr��r*rfrir!r!r"r��szUserString.splitcCs|j�||�Sr%)r�rsplitror!r!r"rp�szUserString.rsplitFcCs|j�|�Sr%)r�
splitlines)r*�keependsr!r!r"rq�r�zUserString.splitlinescCs|j�|||�Sr%)rr�)r*�prefixrFrGr!r!r"r��szUserString.startswithcCs|�|j�|��Sr%)rbr�striprbr!r!r"rt�r�zUserString.stripcCs|�|j���Sr%)rbr�swapcaser)r!r!r"ru�r�zUserString.swapcasecCs|�|j���Sr%)rbr�titler)r!r!r"rv�r�zUserString.titlecGs|�|jj|��Sr%)rbr�	translater<r!r!r"rw�szUserString.translatecCs|�|j���Sr%)rbr�upperr)r!r!r"rx�r�zUserString.uppercCs|�|j�|��Sr%)rbr�zfill)r*rCr!r!r"ry�r�zUserString.zfill)rHrI)rO)N)r�)N)Nr�)Nr�)F)N)Irr-r.r@r/rdr1r3r5r7r�rorrrrr�r�r�r�r!r#r,r�r>r?r@rArR�maxsizer�rJrMrPrRr�rSrrTrUrVrWrXr�rYrZr[r\r]r^r�r_r`rar��	maketransrdr�rjrkrlrmrnr�rprqr�rtrurvrwrxryr!r!r!r"rrs�








)7rtrr�operatorrr~rrr�keywordr
r��sysrR�heapqr��_weakrefrr:�	itertoolsrr�rr�rr��reprlibrry�_collectionsr�ImportError�MutableSequence�registerrr#�KeysViewr$�	ItemsViewr/�
ValuesViewr2rxr3rLrr{rr�rrur	rr�Sequencerr!r!r!r"�<module>sh
�Y&}nMShelper.cpython-36.pyc000064400000000256151730727350010466 0ustar003

��g$�@sdZdZdS)zThe helper maxnamelen� N)�__doc__ZHELPER_MAXNAMELEN�rr�/usr/lib/python3.6/helper.py�<module>sebtables.cpython-36.opt-1.pyc000064400000016336151730727350011735 0ustar003

��g�$�@s&dgZddlZddlmZddlmZddlmZm	Z	m
Z
ddlmZddl
mZddlmZmZddlZd	gd
ddgd
ddgd�ZiZiZiZx�ej�D]tZgee<e�ee<x\eeD]PZeejde�eejdeef�eejde�eejde�q�Wq�WGdd�de�ZdS)�ebtables�N)�runProg)�log)�tempFile�readfile�	splitArgs)�COMMANDS)�	ipXtables)�
FirewallError�INVALID_IPVZBROUTINGZ
PREROUTINGZPOSTROUTINGZOUTPUTZINPUTZFORWARD)ZbrouteZnat�filterz-N %s_directz-I %s 1 -j %s_directz-I %s_direct 1 -j RETURNz	%s_directc@s�eZdZdZdZdZdd�Zdd�Zdd�Zd	d
�Z	dd�Z
d
d�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zdd�Zdd�Zd/d d!�Zd"d#�Zd$d%�Zd&d'�Zd(d)�Zd0d+d,�Zd-d.�ZdS)1rZebFcCsBt|j|_td|j|_|j�|_|j�|_|j�g|_	dS)Nz
%s-restore)
r�ipv�_command�_restore_command�_detect_restore_noflush_optionZrestore_noflush_option�_detect_concurrent_option�concurrent_option�fill_exists�available_tables)�self�r�/usr/lib/python3.6/ebtables.py�__init__9s

zebtables.__init__cCs$tjj|j�|_tjj|j�|_dS)N)�os�path�existsrZcommand_existsrZrestore_command_exists)rrrrrAszebtables.fill_existscCs(d}t|jddg�}|ddkr$d}|S)N�z--concurrentz-Lr)rr)rr�retrrrrEs
z"ebtables._detect_concurrent_optioncCs.g}y|j|d�Wntk
r(dSXdS)N�offFT)�	set_rules�
ValueError)r�rulesrrrrOsz'ebtables._detect_restore_noflush_optioncCs�g}|jr |j|kr |j|j�|dd�|D�7}tjd|j|jdj|��t|j|�\}}|dkr~td|jdj|�|f��|S)NcSsg|]}d|�qS)z%sr)�.0�itemrrr�
<listcomp>^sz"ebtables.__run.<locals>.<listcomp>z	%s: %s %s� rz'%s %s' failed: %s)	r�appendr�debug2�	__class__r�joinrr )r�argsZ_args�statusrrrrZ__runYszebtables.__runcCs(x"dD]}||krttd|��qWdS)N�
%%REJECT%%�%%ICMP%%�%%LOGTYPE%%z'%s' invalid for ebtables)r,r-r.)r
r)r�rule�strrrr�_rule_validatefs
zebtables._rule_validatecCs|tko|t|kS)N)�BUILT_IN_CHAINS)rr
�table�chainrrr�is_chain_builtinlszebtables.is_chain_builtincCsJg}|r4|jd|d|g�|jd|d|dddg�n|jd|d|g�|S)Nz-tz-Nz-I�1z-jZRETURNz-X)r&)r�addr3r4r!rrr�build_chain_rulespszebtables.build_chain_rulescCs8d|g}|r |d|t|�g7}n|d|g7}||7}|S)Nz-tz-Iz-D)r0)rr7r3r4�indexr*r/rrr�
build_rule{szebtables.build_rulecCs
tj|�S)N)r	Zcommon_reverse_rule)rr*rrr�reverse_rule�szebtables.reverse_rulecCstj|�dS)N)r	Zcommon_check_passthrough)rr*rrr�check_passthrough�szebtables.check_passthroughcCs
tj|�S)N)r	Zcommon_reverse_passthrough)rr*rrr�reverse_passthrough�szebtables.reverse_passthroughc
Cs<t�}d}i}x�|D]�}|dd�}|j|�xTdD]L}y|j|�}	Wntk
rZYq4Xt|�|	dkr4|j|	�|j|	�}q4Wx^tt|��D]N}	xHtjD]>}
|
||	kr�||	j	d�o�||	j
d�r�d||	||	<q�Wq�W|j|g�j|�qWxD|D]<}|j
d|�x&||D]}|j
dj|�d	��qW�qW|j�tj|j�}tjd
|j|jd|j|jf�g}|jd�t|j||jd
�\}
}tj�dk�rt|j�}|dk	�rd}	xH|D]@}tjd|	|fddd�|j
d	��s�tjddd�|	d7}	�q�Wtj|j�|
dk�r8td|jdj|�|f��dS)Nr�-t�--table��"z"%s"z*%s
r%�
z	%s: %s %sz%s: %dz	--noflush)�stdin�z%8d: %sr)�nofmt�nlr)rEz'%s %s' failed: %s)r>r?)rr1r9r �len�pop�range�stringZ
whitespace�
startswith�endswith�
setdefaultr&�writer)�closer�stat�namerr'r(r�st_sizerZgetDebugLogLevelrZdebug3�unlink)rr!�
log_deniedZ	temp_filer3Ztable_rulesZ_ruler/�opt�i�crPr*r+r�lines�linerrrr�sZ




 




zebtables.set_rulescCs|j|�|j|�S)N)r1�_ebtables__run)rr/rTrrr�set_rule�s
zebtables.set_ruleNcCs�g}|r|gntj�}xp|D]h}||jkr6|j|�qy*|jd|dg�|jj|�|j|�Wqtk
r�tjd|�YqXqW|S)Nz-tz-Lz#ebtables table '%s' does not exist.)r2�keysrr&rZr rZdebug1)rr3rZtablesrrr�get_available_tables�s

zebtables.get_available_tablescCsiS)Nr)rr3rrr�get_zone_table_chains�szebtables.get_zone_table_chainscCsFg}x<tj�D]0}||j�kr qxdD]}|jd||g�q&WqW|S)N�-F�-X�-Zz-t)r_r`ra)r2r\r]r&)rr!r3�flagrrr�build_flush_rules�s
zebtables.build_flush_rulescCs^g}|dkrdn|}xDtj�D]8}||j�kr0qx$t|D]}|jd|d||g�q:WqW|S)NZPANICZDROPz-tz-P)r2r\r]r&)rZpolicyr!Z_policyr3r4rrr�build_set_policy_rules�szebtables.build_set_policy_rulescCsgS)Nr)rrrr�build_default_tables�szebtables.build_default_tablesrcCs�g}x�tD]�}||j�krq
t|dd�}|dkrJ|tkrJ|jt|�d|g}x:|D]2}t|�tkrx|j||�qX|j|t|��qXWq
W|S)Nrz-t)�
DEFAULT_RULESr]�	LOG_RULES�extend�type�listr&r)rrTZ
default_rulesr3Z_default_rules�prefixr/rrr�build_default_rules�s

zebtables.build_default_rulescCs
||jkS)N)r
)rr
rrr�is_ipv_supportedszebtables.is_ipv_supported)N)r)�__name__�
__module__�__qualname__r
rQZpolicies_supportedrrrrrZr1r5r8r:r;r<r=rr[r]r^rcrdrerlrmrrrrr4s0


	@


)�__all__Zos.pathrZfirewall.core.progrZfirewall.core.loggerrZfirewall.functionsrrrZfirewall.configrZ
firewall.corer	Zfirewall.errorsr
rrJr2rfrgZ
OUR_CHAINSr\r3�setr4r&r7�objectrrrrr�<module>s.
helper.cpython-36.opt-1.pyc000064400000000256151730727350011425 0ustar003

��g$�@sdZdZdS)zThe helper maxnamelen� N)�__doc__ZHELPER_MAXNAMELEN�rr�/usr/lib/python3.6/helper.py�<module>sfw.cpython-36.pyc000064400000066115151730727350007631 0ustar003

��g���@s�dgZddlZddlZddlZddlZddlZddlmZddlm	Z	ddl
mZddl
mZddl
m
Z
ddl
mZdd	l
mZdd
lmZddlmZddlmZdd
lmZddlmZddlmZddlmZddlmZddl m!Z!ddl"m#Z#ddl$m%Z%m&Z&ddl'm(Z(ddl)m*Z*ddl+m,Z,ddl-m.Z.ddl/m0Z0ddl1m2Z2m3Z3ddl4m5Z5ddl6m7Z7ddl8m9Z9ddl:m;Z;ddlm<Z<dd l=m>Z>Gd!d�de?�Z@dS)"�Firewall�N)�config)�	functions)�	ipXtables)�ebtables)�nftables)�ipset)�modules)�FirewallIcmpType)�FirewallService)�FirewallZone)�FirewallDirect)�FirewallConfig)�FirewallPolicies)�
FirewallIPSet)�FirewallTransaction)�FirewallHelper)�FirewallPolicy)�nm_get_bus_name�nm_get_interfaces_in_zone)�log)�firewalld_conf)�Direct)�service_reader)�icmptype_reader)�zone_reader�Zone)�ipset_reader)�IPSET_TYPES)�
helper_reader)�
policy_reader)�errors)�
FirewallErrorc@s�eZdZdedd�Zdd�Zdd�Zdd	�Zd
d�Zdfdd
�Zdd�Z	dgdd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zd d!�Zd"d#�Zd$d%�Zd&d'�Zdhd)d*�Zdid+d,�Zd-d.�Zdjd/d0�Zdkd1d2�Zdld3d4�Zd5d6�Zd7d8�Zd9d:�Zd;d<�Zd=d>�Z d?d@�Z!dAdB�Z"dCdD�Z#dEdF�Z$dGdH�Z%dIdJ�Z&dKdL�Z'dMdN�Z(dmdOdP�Z)dQdR�Z*dSdT�Z+dUdV�Z,dWdX�Z-dYdZ�Z.d[d\�Z/d]d^�Z0d_d`�Z1dadb�Z2dcdd�Z3d(S)nrFcCsttj�|_||_|jr>d|_d|_d|_d|_t	|_
d|_nrtj
|�|_d|_g|_tj|�|_d|_g|_tj�|_d|_tj�|_d|_g|_
tj|�|_d|_tj�|_t|�|_t|�|_t|�|_ t!|�|_"t#|�|_t$�|_%t&|�|_t'|�|_(t)|�|_*|j+�dS)NFT),rr�FIREWALLD_CONF�_firewalld_conf�_offline�ip4tables_enabled�ip6tables_enabled�ebtables_enabled�
ipset_enabledr�ipset_supported_types�nftables_enabledr�	ip4tables�ip4tables_backend�ipv4_supported_icmp_types�	ip6tables�ip6tables_backend�ipv6_supported_icmp_typesr�ebtables_backendr�
ipset_backendr�nftables_backendr	�modules_backendr
�icmptyper�servicer�zoner
�directrr�policiesrr�helperr�policy�_Firewall__init_vars)�selfZoffline�r?�/usr/lib/python3.6/fw.py�__init__CsB










zFirewall.__init__cCsDd|j|j|j|j|j|j|j|j|j|j	|j
|j|j|j
|jfS)Nz:%s(%r, %r, %r, %r, %r, %r, %r, %r, %r, %r, %r, %r, %r, %r))�	__class__r&r'r(�_state�_panic�
_default_zone�_module_refcount�_marks�cleanup_on_exit�cleanup_modules_on_exit�ipv6_rpfilter_enabledr)�_individual_calls�_log_denied)r>r?r?r@�__repr__kszFirewall.__repr__cCsjd|_d|_d|_i|_g|_tj|_tj|_	tj
|_tj|_
tj|_tj|_tj|_tj|_tj|_dS)NZINITF�)rCrDrErFrGrZFALLBACK_CLEANUP_ON_EXITrHZ FALLBACK_CLEANUP_MODULES_ON_EXITrIZFALLBACK_IPV6_RPFILTERrJZFALLBACK_INDIVIDUAL_CALLSrKZFALLBACK_LOG_DENIEDrLZFALLBACK_FIREWALL_BACKEND�_firewall_backendZFALLBACK_FLUSH_ALL_ON_RELOAD�_flush_all_on_reloadZFALLBACK_RFC3964_IPV4�
_rfc3964_ipv4ZFALLBACK_ALLOW_ZONE_DRIFTING�_allow_zone_drifting)r>r?r?r@Z__init_varstszFirewall.__init_varscCs�|jr$d|jj�kr$tjd�d|_|jrHd|jj�krHtjd�d|_|jrld|jj�krltjd�d|_|jr�|jr�|j	r�tj
d�tjd�dS)N�filterziptables is not usable.Fzip6tables is not usable.zebtables is not usable.zNo IPv4 and IPv6 firewall.�)
r&r-�get_available_tablesr�info1r'r0r(r2r+�fatal�sys�exit)r>r?r?r@�
_check_tables�s 



zFirewall._check_tablescCszy|jj�Wn*tk
r8tjd�d|_g|_YnX|jj�|_|jj	�|jj
s||jjrltjd�ntjd�d|_|j
r�|jjd�|_n|jr�|jj�|_ng|_|jj	�|jj
s�|jjr�tjd�ntjd�d|_|j
r�|jjd�|_n|j�r|jj�|_ng|_|jj	�|jj
�sN|jj�r>tjd	�ntjd
�d|_|j�rv|j�rv|jj�rvtjd�dS)Nz4ipset not usable, disabling ipset usage in firewall.FzFiptables-restore is missing, using individual calls for IPv4 firewall.zCiptables-restore and iptables are missing, disabling IPv4 firewall.�ipv4zGip6tables-restore is missing, using individual calls for IPv6 firewall.zEip6tables-restore and ip6tables are missing, disabling IPv6 firewall.�ipv6zHebtables-restore is missing, using individual calls for bridge firewall.zEebtables-restore and ebtables are missing, disabling bridge firewall.zSebtables-restore is not supporting the --noflush option, will therefore not be used)r3Zset_list�
ValueErrorr�warningr)r*Zset_supported_typesr-Zfill_exists�restore_command_existsZcommand_existsr&r+r4Zsupported_icmp_typesr.r0r'r1r2r(rK�restore_noflush_option�debug1)r>r?r?r@�_start_check�sL








zFirewall._start_checkc>Cs�tj}tjdtj�y|jj�Wn8tk
rZ}ztj|�tjd�WYdd}~X�n"X|jj	d�rt|jj	d�}|jj	d�r�|jj	d�}|dk	r�|j
�dBkr�d|_tjd|j�|jj	d	��r|jj	d	�}|dk	r�|j
�dCkr�d|_|dk	�r|j
�dDk�rd|_tjd
|j�|jj	d��rv|jj	d�}|dk	�rv|j
�dEk�rvtjd�y|j
j�Wntk
�rtYnX|jj	d��r�|jj	d�}|dk	�r�|j
�dFk�r�d|_|j
�dGk�r�d|_|j�r�tjd�n
tjd�|jj	d��r"|jj	d�}|dk	�r"|j
�dHk�r"tjd�d|_|jj	d��rt|jj	d�}|dk�sT|j
�dk�r\d|_n|j
�|_tjd|j�|jj	d��r�|jj	d�|_tjd|j�|jj	d��r�|jj	d�}|j
�dIk�r�d|_nd|_tjd|j�|jj	d��r&|jj	d�}|j
�dJk�rd|_nd|_tjd|j�|jj	d��r||jj	d�}|j
�dKk�rVd|_nd|_|j�sntjd�tjd |j�|jjtj|j��|j|j�|j�s�|j�tjd!�y|j
jj�WnZtk
�r }z<|j
j��r�tjd"|j
jj |�ntjd"|j
jj |�WYdd}~XnX|jj!tj|j
��|j"tj#d#�|j"tj$d#�|j"tj%d$�|j"tj&d$�t'|j(j)��d%k�r�tjd&�|j"tj*d'�|j"tj+d'�|j"tj,d(�|j"tj-d(�t'|j.j/��d%k�r�tjd)�|j"tj0d*�|j"tj1d*�t'|j2j3��d%k�r&tj4d+�t5j6d,�|j"tj7d-�|j"tj8d-�d}x.dLD]&}||j2j3�k�rLtj4d1|�d}�qLW|�r�t5j6d,�||j2j3�k�r�d2|j2j3�k�r�d2}nd3|j2j3�k�r�d3}nd.}tjd4||�|}ntjd5|�t9tj:�}	t;j<j=tj:��rRtjd6tj:�y|	j�Wn4tk
�rP}ztjd7tj:|�WYdd}~XnX|j>j?|	�|jj@tj|	��|jA|�|_B|j�r�dS|jC�tjD�d%k�r�tEjE�}
tF|�}|�s�|jG|d8�|�r�|�s�|jH�r�|jIjJ��r�|jKd�|jL�|�r|�rtjd9�|jMjN�|jO|d8�|jKd�|jL�|jH�rX|jIjJ��rXtjd:�|jIjP�tjd;�|jQ|d8�tjd<�|j2jR|d8�|j2jSd|jB|d8�tjd=�|jTjU|d8�|jKd�|jL�|j>jV��rVtjd>�|j>jW|�y|jKd�|jL�WnXtk
�r>}z$t|jXd?|jY�r&|jYnd@��WYdd}~Xntk
�rT�YnX~tjD�d,k�r�tEjE�}
tjZdA|
|
�dS)MNz"Loading firewalld config file '%s'z0Using fallback firewalld configuration settings.�DefaultZoneZ
CleanupOnExit�no�falseFzCleanupOnExit is set to '%s'ZCleanupModulesOnExit�yes�trueTz#CleanupModulesOnExit is set to '%s'ZLockdownzLockdown is enabledZ
IPv6_rpfilterzIPv6 rpfilter is enabledzIPV6 rpfilter is disabledZIndividualCallszIndividualCalls is enabled�	LogDeniedZoffzLogDenied is set to '%s'ZFirewallBackendzFirewallBackend is set to '%s'ZFlushAllOnReloadzFlushAllOnReload is set to '%s'ZRFC3964_IPv4zRFC3964_IPv4 is set to '%s'ZAllowZoneDriftingz�AllowZoneDrifting is enabled. This is considered an insecure configuration option. It will be removed in a future release. Please consider disabling it now.z AllowZoneDrifting is set to '%s'zLoading lockdown whitelistz*Failed to load lockdown whitelist '%s': %srr6rzNo icmptypes found.r;r7zNo services found.r8zNo zones found.rTr<�block�drop�trustedzZone '%s' is not available.ZpublicZexternalz+Default zone '%s' is not valid. Using '%s'.zUsing default zone '%s'zLoading direct rules file '%s'z)Failed to load direct rules file '%s': %s)�use_transactionzUnloading firewall moduleszApplying ipsetszApplying default rule setzApplying used zoneszApplying used policiesz2Applying direct chains rules and passthrough rulesz
Direct: %srNz%Flushing and applying took %f seconds)rdre)rfrg)rdre)rfrg)rdre)rfrg)rfrg)rdre)rdre)rdre)rirjrk)[rZ
FALLBACK_ZONErrar#r$�read�	Exceptionr^�get�lowerrHrIr:Zenable_lockdownr"rJrKrLrOrPrQrRr%Zset_firewalld_conf�copy�deepcopy�_select_firewall_backendrbZlockdown_whitelistZquery_lockdown�error�filenameZset_policies�_loaderZFIREWALLD_IPSETSZETC_FIREWALLD_IPSETSZFIREWALLD_ICMPTYPESZETC_FIREWALLD_ICMPTYPES�lenr6�
get_icmptypesZFIREWALLD_HELPERSZETC_FIREWALLD_HELPERSZFIREWALLD_SERVICESZETC_FIREWALLD_SERVICESr7�get_servicesZFIREWALLD_ZONESZETC_FIREWALLD_ZONESr8�	get_zonesrWrXrYZFIREWALLD_POLICIESZETC_FIREWALLD_POLICIESrZFIREWALLD_DIRECT�os�path�existsr9Zset_permanent_configZ
set_direct�
check_zonerErZZgetDebugLogLevel�timer�flushr)rZ
has_ipsets�execute�clearr5�unload_firewall_modules�apply_default_tablesZapply_ipsets�apply_default_rulesZapply_zones�change_default_zoner<Zapply_policiesZhas_configurationZapply_direct�code�msgZdebug2)r>�reload�complete_reloadZdefault_zoner��valuert�zr8�objZtm1�transaction�eZtm2r?r?r@�_start�st







 




















.zFirewall._startcCsHy|j�Wn&tk
r2d|_|jd��YnXd|_|jd�dS)N�FAILED�ACCEPT�RUNNING)r�rnrC�
set_policy)r>r?r?r@�start�s
zFirewall.startcCshtjj|�sdS|rZ|jtj�rV|dkrVt�}tjj|�|_|j	|j�||_d|_
nd}�x|ttj|��D�]h}|j
d�s�|jtj�rl|dkrltjjd||f�rl|jd||f|dd�qld||f}tjd||��y�|dk�r�t||�}|j|jj�k�r8|jj|j�}tjd	||j|j|j�|jj|j�n|jjtj��rNd|_
y|jj|�Wn<tk
�r�}	ztjd
|jt|	�f�WYdd}	~	XnX|jjtj|���n�|dk�rFt||�}|j|jj�k�r|jj |j�}tjd	||j|j|j�|jj!|j�n|jjtj��r$d|_
|jj"|�|jj"tj|���n.|dk�rnt#|||d�}|�r�dtjj|�tjj|�d
d�f|_|j	|j�tj|�}
|j|j$j%�k�r|j$j&|j�}|j$j'|j�|j(�r�tjd||j||�|j)|�ntjd	||j|j|j�n|jjtj��r,d|_
d|
_
|jj*|
�|�r^tjd||j||�|j)|�n|j$j*|��n|dk�rDt+||�}|j|j,j-�k�r�|j,j.|j�}tjd	||j|j|j�|j,j/|j�n|jjtj��r�d|_
y|j,j0|�Wn<tk
�r,}	ztj1d
|jt|	�f�WYdd}	~	XnX|jj0tj|���n0|dk�r�t2||�}|j|j3j4�k�r�|j3j5|j�}tjd	||j|j|j�|j3j6|j�n|jjtj��r�d|_
|j3j7|�|jj7tj|��n�|dk�rht8||�}|j|j9j:�k�r2|j9j;|j�}tjd	||j|j|j�|j9j<|j�n|jjtj��rHd|_
|j9j=|�|jj>tj|��ntj?d|�Wqltk
�r�}ztj@d|||�WYdd}~XqltAk
�r�tj@d||�tjB�YqlXqlW|�rd|j(�rd|j|j$j%�k�rX|j$j&|j�}tjd||j|j|j�y|j$j'|j�WntAk
�rHYnX|jjC|j�|j$j*|�dS)Nr8Fz.xmlz%s/%sT)�combinezLoading %s file '%s'r6z  Overloads %s '%s' ('%s/%s')z%s: %s, ignoring for run-time.r7)Z
no_check_namer�z  Combining %s '%s' ('%s/%s')rr;r<zUnknown reader type %szFailed to load %s file '%s': %szFailed to load %s file '%s':z0  Overloading and deactivating %s '%s' ('%s/%s')���)Dr{r|�isdir�
startswithrZ
ETC_FIREWALLDr�basename�nameZ
check_name�default�sorted�listdir�endswithrvrrarr6rxZget_icmptyperuZremove_icmptypeZadd_icmptyper"rV�strrqrrrr7ryZget_serviceZremove_serviceZadd_servicerr8rzZget_zoneZremove_zone�combinedr�Zadd_zonerr�
get_ipsets�	get_ipsetZremove_ipset�	add_ipsetr^rr;Zget_helpersZ
get_helperZ
remove_helperZ
add_helperr r<�get_policiesZ
get_policyZ
remove_policyZ
add_policyZadd_policy_objectrWrtrnZ	exceptionZforget_zone)r>r|Zreader_typer�Z
combined_zonerur�r�Zorig_objrtZ
config_objr�r?r?r@rvs


$







$




zFirewall._loadercCsp|jj�|jj�|jj�|jj�|jj�|jj�|jj�|jj�|j	j�|j
j�|j�dS)N)r6�cleanupr7r8rr;rr9r:r<r$r=)r>r?r?r@r��s









zFirewall.cleanupcCsN|jsB|jr(|j�|jj�|jd�|jrBtjd�|jj	�|j
�dS)Nr�z!Unloading firewall kernel modules)r%rHr�rr�rIrrar5r�r�)r>r?r?r@�stop�s



z
Firewall.stopc	Cs�d}d}x�t|�D]�\}}|r0|jj|�\}}n$|j|dkrDd}n|jj|�\}}|dkrn|d7}||7}q|r�|jj|d�|j|d7<q||jkr|j|d8<|j|dkr|j|=qW||fS)NrrNrT)�	enumerater5�load_modulerFZ
unload_module�
setdefault)	r>Z_modules�enableZ
num_failedZ
error_msgs�i�moduleZstatusr�r?r?r@�handle_modules�s(
zFirewall.handle_modulescCs|dkrd|_dS)NrF)r+)r>�backendr?r?r@rs�sz!Firewall._select_firewall_backendcCs4x|j�D]}|j|kr
|Sq
Wttjd|��dS)Nz'%s' backend does not exist)�all_backendsr�r"r!Z
UNKNOWN_ERROR)r>r�r�r?r?r@�get_backend_by_name�s

zFirewall.get_backend_by_namecCs\|jr|jS|dkr |jr |jS|dkr4|jr4|jS|dkrH|jrH|jStt	j
d|��dS)Nr[r\�ebz-'%s' is not a valid backend or is unavailable)r+r4r&r-r'r0r(r2r"r!�INVALID_IPV)r>�ipvr?r?r@�get_backend_by_ipv�szFirewall.get_backend_by_ipvcCsP|dkr|jr|jS|dkr(|jr(|jS|dkr<|jr<|jSttjd|��dS)Nr[r\r�z-'%s' is not a valid backend or is unavailable)	r&r-r'r0r(r2r"r!r�)r>r�r?r?r@�get_direct_backend_by_ipv�sz"Firewall.get_direct_backend_by_ipvcCs<|dkr|jS|dkr|jS|dkr*|jS|dkr8|jSdS)Nr,r/rrF)r&r'r(r+)r>r�r?r?r@�is_backend_enabled�szFirewall.is_backend_enabledcCs8|jr
dS|dkr|jS|dkr&|jS|dkr4|jSdS)NTr[r\r�F)r+r&r'r()r>r�r?r?r@�is_ipv_enabledszFirewall.is_ipv_enabledcCsRg}|jr|j|j�n6|jr*|j|j�|jr<|j|j�|jrN|j|j�|S)N)	r+�appendr4r&r-r'r0r(r2)r>�backendsr?r?r@�enabled_backendsszFirewall.enabled_backendscCsPg}|jr|j|j�|jr(|j|j�|jr:|j|j�|jrL|j|j�|S)N)	r&r�r-r'r0r(r2r+r4)r>r�r?r?r@r�szFirewall.all_backendsNcCsN|dkrt|�}n|}x |j�D]}|j||j��q W|dkrJ|jd�dS)NT)rr��	add_rulesZbuild_default_tablesr�)r>rlr�r�r?r?r@r�$s
zFirewall.apply_default_tablescCs�|dkrt|�}n|}x(|j�D]}|j|j�}|j||�q W|jd�r~|jd�}d|j�kr~|jr~|j	|j�}|j||�|jd�r�|j
r�|j�}|j||�|dkr�|jd�dS)Nr\�rawT)
rr�Zbuild_default_rulesrLr�r�r�rUrJZbuild_rpfilter_rulesrQZbuild_rfc3964_ipv4_rulesr�)r>rlr�r��rulesZipv6_backendr?r?r@r�0s"


zFirewall.apply_default_rulescCs|jr|jj�rdSdS)NTF)r+r9Zhas_runtime_configuration)r>r?r?r@�may_skip_flush_direct_backendsHsz'Firewall.may_skip_flush_direct_backendscCs`|dkrt|�}n|}x2|j�D]&}||j�kr2q |j�}|j||�q W|dkr\|jd�dS)NT)rr�r��build_flush_rulesr�r�)r>rlr�r�r�r?r?r@�flush_direct_backendsNs
zFirewall.flush_direct_backendscCsp|dkrt|�}n|}tjd�|j�s4|j|d�x$|j�D]}|j�}|j||�q>W|dkrl|jd�dS)NzFlushing rule set)rlT)	rrrar�r�r�r�r�r�)r>rlr�r�r�r?r?r@r�]s

zFirewall.flushcCs`|dkrt|�}n|}tjd|�x&|j�D]}|j|�}|j||�q,W|dkr\|jd�dS)NzSetting policy to '%s'T)rrrar�Zbuild_set_policy_rulesr�r�)r>r<rlr�r�r�r?r?r@r�os

zFirewall.set_policycCsB|sdS|j|�}|s&ttjd|��|j|�s4dS|j||j�S)NrNz'%s' is not a valid backend)r�r"r!r�r��set_rulerL)r>�backend_name�ruler�r?r?r@r��s


z
Firewall.rulecCs"ttd|��}|j|�}|s,ttjd|��|j|�s:dS|js\|js\|dkoX|j	j
�rx�t|�D]�\}}y|j||j
�Wqftk
�r}zjtjtj��tj|�xFt|d|��D]2}y|j|j|�|j
�Wq�tk
r�Yq�Xq�W|�WYdd}~XqfXqfWn|j||j
�dS)Nz'%s' is not a valid backendr)�listrSr�r"r!r�r�rKr_r2r`r�r�rLrnrra�	traceback�
format_excrt�reversedZreverse_ruleZ	set_rules)r>r�r�Z_rulesr�r�r�r�r?r?r@r��s.




zFirewall.rulescCs|jrttj��dS)N)rDr"r!Z
PANIC_MODE)r>r?r?r@�check_panic�szFirewall.check_paniccCs"|}||jj�krttj|��|S)N)r<r�r"r!ZINVALID_POLICY)r>r<Z_policyr?r?r@�check_policy�szFirewall.check_policycCs8|}|s|dkr|j�}||jj�kr4ttj|��|S)NrN)�get_default_zoner8rzr"r!ZINVALID_ZONE)r>r8�_zoner?r?r@r~�szFirewall.check_zonecCstj|�sttj|��dS)N)rZcheckInterfacer"r!ZINVALID_INTERFACE)r>�	interfacer?r?r@�check_interface�s
zFirewall.check_interfacecCs|jj|�dS)N)r7�
check_service)r>r7r?r?r@r��szFirewall.check_servicecCstj|�sttj|��dS)N)r�
check_portr"r!ZINVALID_PORT)r>Zportr?r?r@r��s
zFirewall.check_portcCs*|sttj��|dkr&ttjd|��dS)N�tcp�udp�sctp�dccpz''%s' not in {'tcp'|'udp'|'sctp'|'dccp'})r�r�r�r�)r"r!ZMISSING_PROTOCOLZINVALID_PROTOCOL)r>Zprotocolr?r?r@�check_tcpudp�s
zFirewall.check_tcpudpcCstj|�sttj|��dS)N)rZcheckIPr"r!�INVALID_ADDR)r>Zipr?r?r@�check_ip�s
zFirewall.check_ipcCsP|dkr tj|�sLttj|��n,|dkr@tj|�sLttj|��nttjd��dS)Nr[r\z'%s' not in {'ipv4'|'ipv6'})rZcheckIPnMaskr"r!r�Z
checkIP6nMaskr�)r>r��sourcer?r?r@�
check_address�s

zFirewall.check_addresscCs|jj|�dS)N)r6�check_icmptype)r>Zicmpr?r?r@r��szFirewall.check_icmptypecCs>t|t�std|t|�f��t|�dkr:ttjd|��dS)Nz%s is %s, expected intrz#timeout '%d' is not positive number)�
isinstance�int�	TypeError�typer"r!�
INVALID_VALUE)r>Ztimeoutr?r?r@�
check_timeout�s

zFirewall.check_timeoutc Cs`|j}|j}|sNi}x&|jj�D]}|jj|�d||<q W|jj�}|j�}g}x$|jj	�D]}	|j
|jj|	��q^W|s�|jd�|j
�|j�d}
y|jd|d�Wn&tk
r�}z
|}
WYdd}~XnX|�r(xL|D]D}|jj|j�s�x0|jj�D]"}
|
jdk�r�q�|
j|j��q�Wq�W|�s�|j�}||k�r�||k�rRi||<xFt||j��D]2\}}|d�rd||||||<|||=�qdWxb|jj�D]T}||k�r�x.||D]"}|jj|||||d��q�W||=ntjd|��q�Wt|�d	k�r6x(t|j��D]}tjd
|�||=�qW~x�|D]�}|jj|j��r�xx|jD]R}y|jj|j|�Wn6tk
�r�}z|jt j!k�r�|�WYdd}~XnX�qZWn|jj"|�|jj#|j��q>W|jj$|�t%�}|�r,x@|jj�dgD],}x$t&|�D]}|jj|||d��q
W�q�W||_|j�sD|jd
�|
�rVd|_'|
�nd|_'dS)N�
interfacesZDROPT)r�r�r�__default__�senderzNew zone '%s'.rz(Lost zone '%s', zone interfaces dropped.rN)r�r�r�r�)(rDrPr8rz�get_settingsr9Zget_runtime_configr�rr�r�r�r�r�r�r�rnZquery_ipsetr�r�Zset_destroyr��items�change_zone_of_interfacerrVrw�keysZentriesZ	add_entryr"r�r!�ALREADY_ENABLEDr�Zapply_ipsetZ
set_configrrrC)r>r�rDZ	flush_allZ_zone_interfacesr8Z_direct_config�_old_dzZ_ipset_objs�_nameZstart_exceptionr�r�r�Z_new_dz�iface�settingsZinterface_id�entryr�Znm_bus_namer�r?r?r@r��s�









zFirewall.reloadcCs|jS)N)rC)r>r?r?r@�	get_stateaszFirewall.get_statecCsZ|jrttjd��y|jd�Wn.tk
rN}zttj|��WYdd}~XnXd|_dS)Nzpanic mode already enabledZPANICT)rDr"r!r�r�rn�COMMAND_FAILED)r>r�r?r?r@�enable_panic_modefszFirewall.enable_panic_modecCsZ|jsttjd��y|jd�Wn.tk
rN}zttj|��WYdd}~XnXd|_dS)Nzpanic mode is not enabledr�F)rDr"r!ZNOT_ENABLEDr�rnr�)r>r�r?r?r@�disable_panic_modeqszFirewall.disable_panic_modecCs|jS)N)rD)r>r?r?r@�query_panic_mode|szFirewall.query_panic_modecCs|jS)N)rL)r>r?r?r@�get_log_denied�szFirewall.get_log_deniedcCsb|tjkr&ttjd|djtj�f��||j�krR||_|jj	d|�|jj
�nttj|��dS)Nz'%s', choose from '%s'z','rh)rZLOG_DENIED_VALUESr"r!r��joinr�rLr$�set�writeZALREADY_SET)r>r�r?r?r@�set_log_denied�s
zFirewall.set_log_deniedcCs|jS)N)rE)r>r?r?r@r��szFirewall.get_default_zonecCs�|j|�}||jkr�|j}||_|jjd|�|jj�|jj||�|jj|�}x@t|dj	��D]\}}|drd|jj
d|�qdWnttj
|��dS)Nrcr�r�rN)r~rEr$r�r�r8r�r�r�r�r�r"r!ZZONE_ALREADY_SET)r>r8r�r�Z_old_dz_settingsr�r�r?r?r@�set_default_zone�s


zFirewall.set_default_zonecCsH|j�}x:|j�D].\}}|s(t|t�r2|||<q||kr||=qW|S)N)rqr�r��bool)r>Z	permanentZruntimer��keyr�r?r?r@�'combine_runtime_with_permanent_settings�s

z0Firewall.combine_runtime_with_permanent_settingscCsi}i}x�t|j��t|j��BD]�}||kr"t||t�r�t||krN||ng�}tt||�|�||<t|t||�A|@�||<q"t||t�s�t||t�r�||r�||r�d||<q�||r�||r�d||<q"ttjdj	t
||�|���q"W||fS)NTFz Unhandled setting type {} key {})r�r�r�r�r�r�r"r!ZINVALID_SETTING�formatr�)r>Zold_settingsZnew_settingsZadd_settingsZremove_settingsr��oldr?r?r@�get_added_and_removed_settings�s

 z'Firewall.get_added_and_removed_settings)F)FF)F)N)N)N)N)N)F)4�__name__�
__module__�__qualname__rArMr=rZrbr�r�rvr�r�r�rsr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r~r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r?r?r?r@rBsh
(	;
 








 	
s)A�__all__Zos.pathr{rXrqrr�ZfirewallrrZ
firewall.corerrrrr	Zfirewall.core.fw_icmptyper
Zfirewall.core.fw_servicerZfirewall.core.fw_zonerZfirewall.core.fw_directr
Zfirewall.core.fw_configrZfirewall.core.fw_policiesrZfirewall.core.fw_ipsetrZfirewall.core.fw_transactionrZfirewall.core.fw_helperrZfirewall.core.fw_policyrZfirewall.core.fw_nmrrZfirewall.core.loggerrZfirewall.core.io.firewalld_confrZfirewall.core.io.directrZfirewall.core.io.servicerZfirewall.core.io.icmptyperZfirewall.core.io.zonerrZfirewall.core.io.ipsetrZfirewall.core.ipsetrZfirewall.core.io.helperrZfirewall.core.io.policyr r!Zfirewall.errorsr"�objectrr?r?r?r@�<module>sHlogger.cpython-36.opt-1.pyc000064400000055135151730727350011433 0ustar003

��g>y�@s�ddddgZddlZddlZddlZddlZddlZddlZddlZddlZddl	Z
ddl
Z
Gdd�de�ZGdd�de�Z
Gd	d
�d
e
�ZGdd�de�ZGd
d�de�ZGdd�de�Ze�ZdS)�	LogTarget�FileLog�Logger�log�Nc@s2eZdZdZdd�Zddd�Zdd�Zd	d
�ZdS)
rz% Abstract class for logging targets. cCs
d|_dS)N)�fd)�self�r�/usr/lib/python3.6/logger.py�__init__(szLogTarget.__init__rcCstd��dS)Nz%LogTarget.write is an abstract method)�NotImplementedError)r�data�level�logger�is_debugrrr	�write+szLogTarget.writecCstd��dS)Nz%LogTarget.flush is an abstract method)r)rrrr	�flush.szLogTarget.flushcCstd��dS)Nz%LogTarget.close is an abstract method)r)rrrr	�close1szLogTarget.closeN)r)�__name__�
__module__�__qualname__�__doc__r
rrrrrrr	r&s

c@s.eZdZdd�Zddd�Zdd�Zdd	�Zd
S)�
_StdoutLogcCstj|�tj|_dS)N)rr
�sys�stdoutr)rrrr	r
8s
z_StdoutLog.__init__rcCs|jj|�|j�dS)N)rrr)rrr
rrrrr	r<sz_StdoutLog.writecCs|j�dS)N)r)rrrr	rAsz_StdoutLog.closecCs|jj�dS)N)rr)rrrr	rDsz_StdoutLog.flushN)r)rrrr
rrrrrrr	r7s
rc@seZdZdd�ZdS)�
_StderrLogcCstj|�tj|_dS)N)rr
r�stderrr)rrrr	r
Ks
z_StderrLog.__init__N)rrrr
rrrr	rJsrc@s.eZdZdd�Zddd�Zdd�Zdd	�Zd
S)�
_SyslogLogcCs.tj|�tjtjjtjd�tj	tj
�dS)Nr)rr
�syslogZopenlog�os�path�basenamer�argvZLOG_PIDZ
LOG_DAEMON)rrrr	r
Ss
	z_SyslogLog.__init__rcCs�d}|rtj}nF||jkr"tj}n4||jkr4tj}n"||jkrFtj}n||jkrVtj	}|j
d�rt|dt|�d�}t|�dkr�|dkr�tj|�ntj||�dS)N�
�r)rZ	LOG_DEBUG�INFO1ZLOG_INFO�WARNINGZLOG_WARNING�ERRORZLOG_ERR�FATALZLOG_CRIT�endswith�len)rrr
rrZpriorityrrr	ras"




z_SyslogLog.writecCstj�dS)N)rZcloselog)rrrr	rwsz_SyslogLog.closecCsdS)Nr)rrrr	rzsz_SyslogLog.flushN)r)rrrr
rrrrrrr	rRs
rc@s<eZdZdZddd�Zdd�Zddd	�Zd
d�Zdd
�ZdS)rz< FileLog class.
    File will be opened on the first write. �wcCstj|�||_||_dS)N)rr
�filename�mode)rr+r,rrr	r
�s
zFileLog.__init__cCsv|jr
dStjtjB}|jjd�r,|tjO}tj|j|d�|_tj	|jd�tj
|j|j�|_tj|jtjtj
�dS)N�ai�)rr�O_CREAT�O_WRONLYr,�
startswith�O_APPEND�openr+�fchmod�fdopen�fcntlZF_SETFDZ
FD_CLOEXEC)r�flagsrrr	r2�s
zFileLog.openrcCs(|js|j�|jj|�|jj�dS)N)rr2rr)rrr
rrrrr	r�sz
FileLog.writecCs|js
dS|jj�d|_dS)N)rr)rrrr	r�s
z
FileLog.closecCs|js
dS|jj�dS)N)rr)rrrr	r�sz
FileLog.flushN)r*)r)	rrrrr
r2rrrrrrr	rs

c@s�eZdZdZd[Zd\Zd]Zd^Zd_ZdZ	e
�Ze�Z
e�Zd`d	d
�Zdd�Zdadd�Zdbdd�Zdcdd�Zdddd�Zdd�Zdd�Zdd�Zdd�Zdd�Zd d!�Zed"fd#d$�Zed"fd%d&�Zed"fd'd(�Zed"fd)d*�Zed"fd+d,�Z ed"fd-d.�Z!d/d0�Z"d1d2�Z#d3d4�Z$d5d6�Z%d7d8�Z&d9d:�Z'd;d<�Z(d=d>�Z)d?d@�Z*dAdB�Z+dCdD�Z,dedEdF�Z-dGdH�Z.dfdIdJ�Z/ed"dfdKdL�Z0ed"dfdMdN�Z1ed"dfdOdP�Z2dgdQdR�Z3dSdT�Z4dUdV�Z5dWdX�Z6dhdYdZ�Z7d"S)iraL	
    Format string:

    %(class)s      Calling class the function belongs to, else empty
    %(date)s       Date using Logger.date_format, see time module
    %(domain)s     Full Domain: %(module)s.%(class)s.%(function)s
    %(file)s       Filename of the module
    %(function)s   Function name, empty in __main__
    %(label)s      Label according to log function call from Logger.label
    %(level)d      Internal logging level
    %(line)d       Line number in module
    %(module)s     Module name
    %(message)s    Log message

    Standard levels:

    FATAL                 Fatal error messages
    ERROR                 Error messages
    WARNING               Warning messages
    INFOx, x in [1..5]    Information
    DEBUGy, y in [1..10]  Debug messages
    NO_INFO               No info output
    NO_DEBUG              No debug output
    INFO_MAX              Maximum info level
    DEBUG_MAX             Maximum debug level

    x and y depend on info_max and debug_max from Logger class
    initialization. See __init__ function.

    Default logging targets:

    stdout        Logs to stdout
    stderr        Logs to stderr
    syslog        Logs to syslog

    Additional arguments for logging functions (fatal, error, warning, info
    and debug):

    nl       Disable newline at the end with nl=0, default is nl=1.
    fmt      Format string for this logging entry, overloads global format
             string. Example: fmt="%(file)s:%(line)d %(message)s"
    nofmt    Only output message with nofmt=1. The nofmt argument wins over
             the fmt argument.

    Example:

    from logger import log
    log.setInfoLogLevel(log.INFO1)
    log.setDebugLogLevel(log.DEBUG1)
    for i in range(1, log.INFO_MAX+1):
        log.setInfoLogLabel(i, "INFO%d: " % i)
    log.setFormat("%(date)s %(module)s:%(line)d [%(domain)s] %(label)s: "
                  "%(level)d %(message)s")
    log.setDateFormat("%Y-%m-%d %H:%M:%S")

    fl = FileLog("/tmp/log", "a")
    log.addInfoLogging("*", fl)
    log.addDebugLogging("*", fl)
    log.addInfoLogging("*", log.syslog, fmt="%(label)s%(message)s")

    log.debug3("debug3")
    log.debug2("debug2")
    log.debug1("debug1")
    log.info2("info2")
    log.info1("info1")
    log.warning("warning\n", nl=0)
    log.error("error\n", nl=0)
    log.fatal("fatal")
    log.info(log.INFO1, "nofmt info", nofmt=1)

    ����r#r�
cCs�i|_i|_d|_d|_i|_i|_i|_i|_i|_i|_	|dkrPt
d|��|dkrdt
d|��|j|_||_
d|_||_|j|jd�|j|jd�|j|jd�|j|jd�xNtd|j
d�D]:}t|d	||�|j|d�t|d
|dd�||��q�WxTtd|jd�D]@}t|d
||�|j|d|�t|d|dd�||���qW|j|j�|j|j�|jd�|jd�|jd|j|j|j|jg�|jd|jdd�t|j|j
d�D��|jd|jdd�td|jd�D��dS)z Logger class initialization �r#zLogger: info_max %d is too lowrzLogger: debug_max %d is too lowz
FATAL ERROR: zERROR: z	WARNING: zINFO%dzinfo%dcs��fdd�S)Ncs�j�|f|�|�S)N)�info)�message�args�kwargs)r�xrr	�<lambda> sz3Logger.__init__.<locals>.<lambda>.<locals>.<lambda>r)rrAr)rrAr	rBsz!Logger.__init__.<locals>.<lambda>zDEBUG%dz	DEBUG%d: zdebug%dcs��fdd�S)Ncs�j�|f|�|�S)N)�debug)r>r?r@)rrArr	rB)sz3Logger.__init__.<locals>.<lambda>.<locals>.<lambda>r)rrAr)rrAr	rB(sz%(label)s%(message)sz%d %b %Y %H:%M:%S�*cSsg|]}|�qSrr)�.0�irrr	�
<listcomp>4sz#Logger.__init__.<locals>.<listcomp>cSsg|]}|�qSrr)rErFrrr	rG6sN) �_level�_debug_level�_format�_date_format�_label�_debug_label�_logging�_debug_logging�_domains�_debug_domains�
ValueErrorr%�NO_INFO�INFO_MAX�NO_DEBUG�	DEBUG_MAX�setInfoLogLabelr'�	TRACEBACKr&�range�setattr�setDebugLogLabel�setInfoLogLevelr$�setDebugLogLevel�	setFormat�
setDateFormat�setInfoLoggingrr�setDebugLogging)rZinfo_maxZ	debug_maxrHrrr	r
�sX






zLogger.__init__cCsNxHt|j|jd�D]2}||jkr$qx |j|D]\}}}|j�q0WqWdS)z Close all logging targets r#N)rYr'rVrNr)rr
�dummy�targetrrr	r8s

zLogger.closerDcCs$|j|�||jkr|j|S|jS)z Get info log level. )�_checkDomainrH�NOTHING)r�domainrrr	�getInfoLogLevel@s


zLogger.getInfoLogLevelcCs8|j|�||jkr|j}||jkr*|j}||j|<dS)z% Set log level [NOTHING .. INFO_MAX] N)rdrerTrH)rr
rfrrr	r\Gs


zLogger.setInfoLogLevelcCs*|j|�||jkr$|j||jS|jS)z Get debug log level. )rdrIrU)rrfrrr	�getDebugLogLevelPs

zLogger.getDebugLogLevelcCs:|j|�|dkrd}||jkr&|j}||j|j|<dS)z- Set debug log level [NO_DEBUG .. DEBUG_MAX] rN)rdrVrUrI)rr
rfrrr	r]Ws

zLogger.setDebugLogLevelcCs|jS)N)rJ)rrrr	�	getFormat`szLogger.getFormatcCs
||_dS)N)rJ)rrJrrr	r^cszLogger.setFormatcCs|jS)N)rK)rrrr	�
getDateFormatfszLogger.getDateFormatcCs
||_dS)N)rK)rrJrrr	r_iszLogger.setDateFormatcCs:|j|�}x*|D]"}|j||j|jd�||j|<qWdS)zU Set log label for level. Level can be a single level or an array
        of levels. )�	min_level�	max_levelN)�
_getLevels�_checkLogLevelr'rTrL)rr
�label�levelsrrr	rWls




zLogger.setInfoLogLabelcCs>|j|dd�}x*|D]"}|j||j|jd�||j|<qWdS)zU Set log label for level. Level can be a single level or an array
        of levels. r#)r)rkrlN)rmrnr$rVrM)rr
rorprrr	r[us



zLogger.setDebugLogLabelNcCs|j||||dd�dS)z� Set info log target for domain and level. Level can be a single
        level or an array of levels. Use level ALL to set for all levels.
        If no format is specified, the default format will be used. r)rN)�_setLogging)rrfrcr
�fmtrrr	r`~szLogger.setInfoLoggingcCs|j||||dd�dS)z� Set debug log target for domain and level. Level can be a single
        level or an array of levels. Use level ALL to set for all levels.
        If no format is specified, the default format will be used. r#)rN)rq)rrfrcr
rrrrr	ra�szLogger.setDebugLoggingcCs|j||||dd�dS)z� Add info log target for domain and level. Level can be a single
        level or an array of levels. Use level ALL to set for all levels.
        If no format is specified, the default format will be used. r)rN)�_addLogging)rrfrcr
rrrrr	�addInfoLogging�szLogger.addInfoLoggingcCs|j||||dd�dS)z� Add debg log target for domain and level. Level can be a single
        level or an array of levels. Use level ALL to set for all levels.
        If no format is specified, the default format will be used. r#)rN)rs)rrfrcr
rrrrr	�addDebugLogging�szLogger.addDebugLoggingcCs|j||||dd�dS)z� Delete info log target for domain and level. Level can be a single
        level or an array of levels. Use level ALL to set for all levels.
        If no format is specified, the default format will be used. r)rN)�_delLogging)rrfrcr
rrrrr	�delInfoLogging�szLogger.delInfoLoggingcCs|j||||dd�dS)z� Delete debug log target for domain and level. Level can be a single
        level or an array of levels. Use level ALL to set for all levels.
        If no format is specified, the default format will be used. r#)rN)rv)rrfrcr
rrrrr	�delDebugLogging�szLogger.delDebugLoggingcCs|j|dd�S)zN Is there currently any info logging for this log level (and
        domain)? r)r)�_isLoggingHere)rr
rrr	�isInfoLoggingHere�szLogger.isInfoLoggingHerecCs|j|dd�S)zO Is there currently any debug logging for this log level (and
        domain)? r#)r)ry)rr
rrr	�isDebugLoggingHere�szLogger.isDebugLoggingHerecOs,|j|�d|d<|j|j|f|�|�dS)z Fatal error log. rrN)�_checkKWargs�_logr')rrJr?r@rrr	�fatal�s
zLogger.fatalcOs,|j|�d|d<|j|j|f|�|�dS)z Error log. rrN)r|r}r&)rrJr?r@rrr	�error�s
zLogger.errorcOs,|j|�d|d<|j|j|f|�|�dS)z Warning log. rrN)r|r}r%)rrJr?r@rrr	�warning�s
zLogger.warningcOsB|j|d|jd�|j|�d|d<|j||j|f|�|�dS)z� Information log using info level [1..info_max].
        There are additional infox functions according to info_max from
        __init__r#)rkrlrrN)rnrTr|r}rS)rr
rJr?r@rrr	r=�s
zLogger.infocOs<|j|d|jd�|j|�d|d<|j||f|�|�dS)z� Debug log using debug level [1..debug_max].
        There are additional debugx functions according to debug_max
        from __init__r#)rkrlrN)rnrVr|r})rr
rJr?r@rrr	rC�s
zLogger.debugcCs|j|jtj�gid�dS)N)r?r@)r}rX�	traceback�
format_exc)rrrr	�	exception�szLogger.exceptioncCs&||ks||kr"td|||f��dS)Nz*Level %d out of range, should be [%d..%d].)rR)rr
rkrlrrr	rn�szLogger._checkLogLevelcCs2|sdSx$|j�D]}|dkrtd|��qWdS)N�nlrr�nofmtz0Key '%s' is not allowed as argument for logging.)r�rrr�)�keysrR)rr@�keyrrr	r|�s
zLogger._checkKWargscCs|s|dkrtd|��dS)Nr<zDomain '%s' is not valid.)rR)rrfrrr	rd�szLogger._checkDomaincCs�||jkrft|t�st|t�r$|}n|g}xp|D]0}|rL|j|d|jd�q0|j||j|jd�q0Wn6|r�dd�t|j	|j�D�}ndd�t|j|j�D�}|S)z Generate log level array. r#)rkrlcSsg|]}|�qSrr)rErFrrr	rG�sz%Logger._getLevels.<locals>.<listcomp>cSsg|]}|�qSrr)rErFrrr	rG�s)
�ALL�
isinstance�list�tuplernrVr'rTrYZDEBUG1)rr
rrprrr	rm�s


zLogger._getLevelscCsNt|t�st|t�r|}n|g}x(|D] }t|jt�s&td|jj��q&W|S)z Generate target array. z '%s' is no valid logging target.)r�r�r��
issubclass�	__class__rrRr)rrc�targetsZ_targetrrr	�_getTargets�s
zLogger._getTargetscCs�|r |j}|j}d|jdf}n|j}|j}|j|jdf}t|�dkrP|j�xVt	|d|d�D]@}||krrqdx0||D]$\}}}||kr||j
|g�j|�q|WqdWdS)z% Generate dict with domain by level. r#rN)rQrOrVrPrNr'rTr)�clearrY�
setdefault�append)rrrPrNZ_ranger
rfrbrrr	�_genDomainsszLogger._genDomainsc	Csl|j|�|j||�}|j|�}|r,|j}n|j}x*|D]"}x|D]}|||fg||<qBWq8W|j|�dS)N)rdrmr�rOrNr�)	rrfrcr
rrrrpr�rNrrr	rqs



zLogger._setLoggingc	Cst|j|�|j||�}|j|�}|r,|j}n|j}x2|D]*}x$|D]}|j|g�j|||f�qBWq8W|j|�dS)N)rdrmr�rOrNr�r�r�)	rrfrcr
rrrrpr�rNrrr	rs-s



 zLogger._addLoggingc
Cs�|j|�|j||�}|j|�}|r,|j}n|j}x�|D]|}	xv|D]n}|	|krPqB|||f||	kr�||	j|||f�t||	�dkr�||	=qB||jkrBtd|	||j	j
|f��qBWq8W|j|�dS)NrzDNo mathing logging for level %d, domain %s, target %s and format %s.)rdrmr�rOrN�remover)r�rRr�rr�)
rrfrcr
rrrrpr�rNrHrrr	rv<s&




zLogger._delLoggingcCst|j||�}|sdS|dd}|r,|j}n|j}x<||D]0\}}}|dksh|j|�shtj|d|�r<dSq<WdS)NFrf�.rDT)�_genDictrOrNr0�fnmatch�fnmatchcase)rr
r�_dict�point_domainrNrfrbrrr	ryUs
zLogger._isLoggingHerec	Cs�|jjdkrD|jjd}||jkrD|j|}|j|j|j�}|rD|Stj|j�}|j}|j|j	kr�t
|j	|jd�r�|j	|jj|kr�dSxT|j	j�D]F\}}t
|tj�r�t
||j�r�t||j�}t
|tj�r�|j|kr�|Sq�WdS)z7 Function to get calling class. Returns class or None. rZ	func_codeN)�f_code�co_argcount�co_varnames�f_locals�
_getClass2r��inspectZ	getmodule�co_name�__dict__�hasattr�__code__�itemsr��typesZ	ClassType�getattr�FunctionType)	r�frameZselfname�_self�obj�module�coderb�valuerrr	�	_getClassis*


zLogger._getClasscCsVx,|jj�D]}t|tj�r|j|kr|SqWx"|jD]}|j||�}|r6|Sq6WdS)z@ Internal function to get calling class. Returns class or None. N)r��valuesr�r�r�r��	__bases__r�)rr�r�r��baseZ_objrrr	r��s
zLogger._getClass2cOsld}d|kr|d}d}d|kr(|d}d}d|kr<|d}|j||�}|sPdSt|�dkrj|||d<n&t|�dkr�||d|d<n||d<|dd}	|r�|j}
n|j}
g}x�|
|D]�\}}
}|
|kr�q�|d	ks�|	j|d�s�tj|d|�r�|�s|j}d
|k�r|d
}|�r0|
j|d|||�n|
j|||||�|�rZ|
jd|||�|j	|
�q�WdS)Nrrr#r�r�r>rfr�rDrrr")
r�r)rOrNr0r�r�rJrr�)rr
rJr?r@rr�r�r�r�rNZused_targetsrfrcrrr	r}�sL
zLogger._logcCsg}d}|r |j}|j}|j}n|j}|j}|j}xN|D]F}|dkrh|||kr~d}t|�dkrdg}Pq8|||kr8|j|�q8W|r�t|�dkr�dS||kr�dStj	�}	x$|	r�|	j
r�|	jd|jkr�|	j
}	q�W|	s�t
d��|	jd}
|
d	}x|D]}|j|�r�g}Pq�W|	j}t|
�}
xx||D]l}|jd�}|dk�rD�q&n|dk�r\|d|�}n|}|
t|�k�r�|
j|��s�dSn|j|
��s&dS�q&Wd
}||k�r�||}|j|	j|
d
|jd
||tj|jtj��d�	}|dd
k�r�d
|d<d}x&||D]}|dk�r�q�d}P�q�W|jjd�dk�sR|jjd�dk�sR|�sRt|�dk�rl|j|	�}|�rl|j|d<d
|d|d<|dd
k�r�|dd	|d7<|dd
k�r�|dd	|d7<t|�dk�r�|S|dd	}x0|D](}|j|��stj|d|��r�|S�q�WdS)z Internal function. FrDTrr#Nrz Frame information not available.r�r<)	�file�liner��class�functionrfror
Zdater��?z	%(domain)z%(class)r�r�rf)rIrQrMrHrPrLr)r�r�Zcurrentframe�f_back�	f_globalsrrRr0r��find�co_filename�f_linenor��timeZstrftimerKZ	localtimerJr�rr�r�)rr
rZ
check_domainsZsimple_matchr�rPrLrf�fZmodule_nameZpoint_module�co�_lenrF�dZ	level_strZ
domain_neededr�r�rrr	r��s�














zLogger._genDict���������������)r7r;)rD)rD)rD)rD)r)r)r)r)8rrrrr�rer'rXr&r%rrrrrrr
rrgr\rhr]rir^rjr_rWr[r`rartrurwrxrzr{r~rr�r=rCr�rnr|rdrmr�r�rqrsrvryr�r�r}r�rrrr	r�sdG
;

	

					


 4)�__all__rr�r�r�r�rr�r5Zos.pathr�objectrrrrrrrrrrr	�<module>s.-(*4ipset.cpython-36.pyc000064400000021161151730727350010331 0ustar003

��gq2�@s�dZdddgZddlZddlZddlmZddlmZddl	m
Z
dd	lmZdd
l
mZmZddlmZdZd
ddddddddddgZddddd�Zdddd�ZGd d�de�Zd!d�Zd"d�Zd#d$�Zd%d&�Zd'd(�ZdS))zThe ipset command wrapper�ipset�check_ipset_name�remove_default_create_options�N)�errors)�
FirewallError)�runProg)�log)�tempFile�readfile)�COMMANDS� zhash:ipzhash:ip,portzhash:ip,port,ipzhash:ip,port,netzhash:ip,markzhash:netzhash:net,netz
hash:net,portzhash:net,port,netzhash:net,ifacezhash:macz
inet|inet6�valuez
value in secs)�family�hashsize�maxelem�timeoutZinetZ1024Z65536)rrrc@s�eZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Zd'd
d�Z	dd�Z
dd�Zdd�Zd(dd�Z
d)dd�Zdd�Zd*dd�Zd+dd�Zdd �Zd!d"�Zd#d$�Zd%d&�ZdS),rzipset command wrapper classcCstd|_d|_dS)Nr)r�_command�name)�self�r�/usr/lib/python3.6/ipset.py�__init__Ks
zipset.__init__cCs^dd�|D�}tjd|j|jdj|��t|j|�\}}|dkrZtd|jdj|�|f��|S)zCall ipset with argscSsg|]}d|�qS)z%sr)�.0�itemrrr�
<listcomp>Rszipset.__run.<locals>.<listcomp>z	%s: %s %s� rz'%s %s' failed: %s)r�debug2�	__class__r�joinr�
ValueError)r�argsZ_args�status�retrrrZ__runOszipset.__runcCs t|�tkrttjd|��dS)zCheck ipset namezipset name '%s' is not validN)�len�IPSET_MAXNAMELENrrZINVALID_NAME)rrrrr�
check_nameZszipset.check_namecCs�g}d}y|jdg�}Wn0tk
rH}ztjd|�WYdd}~XnX|j�}d}xT|D]L}|r�|j�jdd�}|d|kr�|dtkr�|j|d�|j	d�r\d	}q\W|S)
z?Return types that are supported by the ipset command and kernel�z--helpzipset error: %sNF�rzSupported set types:T)
�_ipset__runrrZdebug1�
splitlines�strip�split�IPSET_TYPES�append�
startswith)rr"�outputZex�linesZin_types�line�splitsrrr�set_supported_types`s  

zipset.set_supported_typescCs(t|�tks|tkr$ttjd|��dS)zCheck ipset typez!ipset type name '%s' is not validN)r#r$r,rrZINVALID_TYPE)r�	type_namerrr�
check_typeuszipset.check_typeNcCsd|j|�|j|�d||g}t|t�rZx0|j�D]$\}}|j|�|dkr2|j|�q2W|j|�S)z+Create an ipset with name, type and options�creater&)r%r5�
isinstance�dict�itemsr-r()r�set_namer4�optionsr �key�valrrr�
set_create{s




zipset.set_createcCs|j|�|jd|g�S)NZdestroy)r%r()rr:rrr�set_destroy�s
zipset.set_destroycCsd||g}|j|�S)N�add)r()rr:�entryr rrr�set_add�s
z
ipset.set_addcCsd||g}|j|�S)N�del)r()rr:rAr rrr�
set_delete�s
zipset.set_deletecCs,d||g}|r"|jddj|��|j|�S)N�testz%sr)r-rr()rr:rAr;r rrrrE�s
z
ipset.testcCs2dg}|r|j|�|r"|j|�|j|�jd�S)N�list�
)r-�extendr(r+)rr:r;r rrr�set_list�s

zipset.set_listcCs<|jdgd�}i}d}}i}�x|D�]}t|�dkr:q&dd�|jdd�D�}t|�dkr`q&q&|d	d
krv|d}q&|d	dkr�|d}q&|d	dkr&|dj�}d	}	x^|	t|�k�r||	}
|
dk�r�t|�|	kr�|	d7}	||	||
<ntjd|�iS|	d7}	q�W|�r$|�r$|t|�f||<d}}|j�q&W|S)z" Get active ipsets (only headers) z-terse)r;N�cSsg|]}|j��qSr)r*)r�xrrrr�sz.ipset.set_get_active_terse.<locals>.<listcomp>�:r'r�NameZTypeZHeaderrrrr�netmaskz&Malformed ipset list -terse output: %s)rrrrrN)rIr#r+r�errorr�clear)rr0r"�_nameZ_type�_optionsr1Zpairr2�i�optrrr�set_get_active_terse�sD

zipset.set_get_active_tersecCsdg}|r|j|�|j|�S)N�save)r-r()rr:r rrrrV�s
z
ipset.savecCs�|j|�|j|�t�}d|kr*d|}d||dg}|rlx0|j�D]$\}}	|j|�|	dkrD|j|	�qDW|jddj|��|jd|�xN|D]F}
d|
kr�d|
}
|r�|jd||
dj|�f�q�|jd	||
f�q�W|j�tj	|j
�}tjd
|j
|jd|j
|jf�dg}t|j||j
d
�\}}
tj�dk�r�yt|j
�Wntk
�r`YnVXd}xNt|j
�D]@}tjd||fddd�|jd��s�tjddd�|d7}�qrWtj|j
�|dk�r�td|jdj|�|
f��|
S)Nrz'%s'r6z-existr&z%s
z	flush %s
z
add %s %s %s
z
add %s %s
z%s: %s restore %sz%s: %dZrestore)�stdinr'rJz%8d: %sr)�nofmt�nlrG)rXz'%s %s' failed: %s)r%r5r	r9r-�writer�close�os�statrrrrr�st_sizerZgetDebugLogLevelr
�	ExceptionZdebug3�endswith�unlinkr)rr:r4�entriesZcreate_optionsZ
entry_optionsZ	temp_filer r<r=rAr]r!r"rSr1rrr�set_restore�sV




zipset.set_restorecCsdg}|r|j|�|j|�S)N�flush)r-r()rr:r rrr�	set_flushs
zipset.set_flushcCs|jd||g�S)N�rename)r()rZold_set_nameZnew_set_namerrrrf
szipset.renamecCs|jd||g�S)N�swap)r()rZ
set_name_1Z
set_name_2rrrrgsz
ipset.swapcCs|jdg�S)N�version)r()rrrrrhsz
ipset.version)N)N)NN)N)NN)�__name__�
__module__�__qualname__�__doc__rr(r%r3r5r>r?rBrDrErIrUrVrcrerfrgrhrrrrrHs&



'

7cCst|�tkrdSdS)z"Return true if ipset name is validFT)r#r$)rrrrrscCs8|j�}x*tD]"}||krt|||kr||=qW|S)z( Return only non default create options )�copy�IPSET_DEFAULT_CREATE_OPTIONS)r;rRrTrrrrs

c
Cshg}xX|jd�D]J}y&|jd�|jttj|dd���Wqtk
rX|j|�YqXqWdj|�S)z! Normalize IP addresses in entry �,�/F)�strict)r+�indexr-�str�	ipaddress�
ip_networkrr)rAZ_entryZ_partrrr�normalize_ipset_entry&s
rvcCsxt|jd��dkrdSytj|dd�}Wntk
r<dSXx4|D],}|jtj|dd��rDttjdj	||���qDWdS)z: Check if entry overlaps any entry in the list of entries rorJNF)rqz,Entry '{}' overlaps with existing entry '{}')
r#r+rtrur�overlapsrr�
INVALID_ENTRY�format)rArbZ
entry_networkZitrrrr�check_entry_overlaps_existing2s
rzcCs~ydd�|D�}Wntk
r&dSXt|�dkr8dS|j�|jd�}x.|D]&}|j|�rrttjdj||���|}qPWdS)z> Check if any entry overlaps any entry in the list of entries cSsg|]}tj|dd��qS)F)rq)rtru)rrKrrrrEsz1check_for_overlapping_entries.<locals>.<listcomp>NrzEntry '{}' overlaps entry '{}')	rr#�sort�poprwrrrxry)rbZprev_networkZcurrent_networkrrr�check_for_overlapping_entriesBs2


r})rl�__all__Zos.pathr\rtZfirewallrZfirewall.errorsrZfirewall.core.progrZfirewall.core.loggerrZfirewall.functionsr	r
Zfirewall.configrr$r,ZIPSET_CREATE_OPTIONSrn�objectrrrrvrzr}rrrr�<module>sF
P	fw_policy.cpython-36.opt-1.pyc000064400000154111151730727350012141 0ustar003

��g=V�@s�ddlZddlZddlmZddlmZmZmZmZm	Z	m
Z
mZmZm
Z
mZddlmZmZmZmZmZmZmZmZmZmZmZddlmZddlmZddlm Z ddl!m"Z"dd	l#m$Z$Gd
d�de%�Z&dS)�N)�log)
�portStr�checkIPnMask�
checkIP6nMask�
checkProtocol�enable_ip_forwarding�check_single_address�portInPortRange�get_nf_conntrack_short_name�coalescePortRange�breakPortRange)�	Rich_Rule�Rich_Accept�Rich_Service�	Rich_Port�
Rich_Protocol�Rich_Masquerade�Rich_ForwardPort�Rich_SourcePort�Rich_IcmpBlock�
Rich_IcmpType�	Rich_Mark)�FirewallTransaction)�errors)�
FirewallError)�LastUpdatedOrderedDict)�SOURCE_IPSET_TYPESc@s�eZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zdd�Zdd�Z
�ddd�Zdd�Zdd�Zdd�Z�dd d!�Z�d
d"d#�Z�dd$d%�Zd&d'�Zd(d)�Zd*d+�Zd,d-�Z�dd0d1�Zd2d3�Z�dd4d5�Zd6d7�Zd8d9�Zd:d;�Zd<d=�Zd>d?�Z �dd@dA�Z!dBdC�Z"�ddDdE�Z#dFdG�Z$dHdI�Z%dJdK�Z&dLdM�Z'dNdO�Z(dPdQ�Z)dRdS�Z*�ddTdU�Z+dVdW�Z,�ddXdY�Z-dZd[�Z.d\d]�Z/d^d_�Z0d`da�Z1dbdc�Z2�dddde�Z3dfdg�Z4�ddhdi�Z5djdk�Z6dldm�Z7dndo�Z8dpdq�Z9drds�Z:dtdu�Z;dvdw�Z<�ddxdy�Z=dzd{�Z>�dd|d}�Z?d~d�Z@d�d��ZAd�d��ZBd�d��ZCd�d��ZD�dd�d��ZEd�d��ZF�dd�d��ZGd�d��ZHd�d��ZId�d��ZJd�d��ZK�dd�d��ZLd�d��ZM�dd�d��ZNd�d��ZOd�d��ZPd�d��ZQd�d��ZR�dd�d��ZSd�d��ZT�dd�d��ZUd�d��ZVd�d��ZW�dd�d��ZX�d d�d��ZY�d!d�d��ZZd�d��Z[�d"d�d��Z\d�d��Z]�d#d�d��Z^d�d��Z_d�d��Z`d�d��Za�d$d�dÄZbd�dńZc�d%d�dDŽZdd�dɄZed�d˄Zfd�d̈́Zgd�dτZh�d&d�dфZid�dӄZjd�dՄZk�d'd�dׄZld�dلZmd�dۄZnd�d݄Zod�d߄Zpd�d�Zqd�d�Zrd�d�Zsd�d�Ztd�d�Zu�d(d�d�Zv�d)d�d�Zwd�d�Zxd�d�Zyd�d�Zzd�d��Z{�d*d�d��Z|d�d��Z}d�d��Z~d�d��Zd�d��Z��d�d�Z��d�d�Z��d�d�Z��d�d�Z��d+�d	�d
�Z�dS(,�FirewallPolicycCs||_i|_i|_dS)N)�_fw�_chains�	_policies)�self�fw�r#�/usr/lib/python3.6/fw_policy.py�__init__szFirewallPolicy.__init__cCsd|j|j|jfS)Nz
%s(%r, %r))�	__class__rr )r!r#r#r$�__repr__szFirewallPolicy.__repr__cCs|jj�|jj�dS)N)r�clearr )r!r#r#r$�cleanups
zFirewallPolicy.cleanupcCs
t|j�S)N)rr)r!r#r#r$�new_transaction$szFirewallPolicy.new_transactioncCst|jj��S)N)�sortedr �keys)r!r#r#r$�get_policies)szFirewallPolicy.get_policiescCs8g}x*|j�D]}|j|�}|js|j|�qWt|�S)N)r-�
get_policy�derived_from_zone�appendr+)r!Zpolicies�p�p_objr#r#r$�"get_policies_not_derived_from_zone,s
z1FirewallPolicy.get_policies_not_derived_from_zonecCs~g}xt|j�D]h}|j|�}t|d�t|jjj��tddg�B@rt|d�t|jjj��tddg�B@r|j|�qW|S)N�
ingress_zones�HOST�ANY�egress_zones)r3�get_settings�setr�zoneZget_active_zonesr0)r!Zactive_policies�policy�settingsr#r#r$�)get_active_policies_not_derived_from_zone4s
((z8FirewallPolicy.get_active_policies_not_derived_from_zonecCs|jj|�}|j|S)N)r�check_policyr )r!r;r1r#r#r$r.>szFirewallPolicy.get_policycCs,dd�dD�|_||j|j<|j|j�dS)NcSsi|]}t�|�qSr#)r)�.0�xr#r#r$�
<dictcomp>Csz-FirewallPolicy.add_policy.<locals>.<dictcomp>�services�ports�
masquerade�
forward_ports�source_ports�icmp_blocks�rules�	protocols�icmp_block_inversionr4r7)rBrCrDrErFrGrHrIrJr4r7)r<r �name�copy_permanent_to_runtime)r!�objr#r#r$�
add_policyBs
zFirewallPolicy.add_policycCs0|j|}|jr|j|�|jj�|j|=dS)N)r �applied�unapply_policy_settingsr<r()r!r;rMr#r#r$�
remove_policyNs



zFirewallPolicy.remove_policycCs�|j|}|jrdSx|jD]}|j||dd�qWx|jD]}|j||dd�q<Wx|jD]}|j||�q\Wx|jD]}|j	|f|��qxWx|j
D]}|j||�q�Wxf|jD]\}y|j
|f|��Wq�tk
�r}z$|jtjgkr�tj|�n|�WYdd}~Xq�Xq�Wx|jD]}|j||��qWxj|jD]`}y|j|f|��WnDtk
�r�}z&|jtjgk�r�tj|�n|�WYdd}~XnX�q:Wx|jD]}|j||��q�W|j�r�|j|�dS)NF)�allow_apply)r rOr4�add_ingress_zoner7�add_egress_zonerG�add_icmp_blockrE�add_forward_portrB�add_servicerC�add_portr�coder�ALREADY_ENABLEDr�warningrI�add_protocolrF�add_source_portrH�add_rulerD�add_masquerade)r!r;rM�args�errorr#r#r$rLUsB
z(FirewallPolicy.copy_permanent_to_runtimeNcCsNxH|j�D]<}|j|}|jr q
||j�kr
tjd|�|j||d�q
WdS)NzApplying policy '%s')�use_transaction)r-r r/r=rZdebug1�apply_policy_settings)r!rbr;r2r#r#r$�apply_policies|s
zFirewallPolicy.apply_policiescCs|j|}||_dS)N)r rO)r!r;rOrMr#r#r$�set_policy_applied�s
z!FirewallPolicy.set_policy_appliedcCstj�||d�}|S)N)Zdate�sender�timeout)�time)r!rgrf�retr#r#r$Z__gen_settings�szFirewallPolicy.__gen_settingscCs|j|�jS)N)r.r<)r!r;r#r#r$r8�szFirewallPolicy.get_settingscCsj|jj|�}|j|}|r |js.|r2|jr2dS|r<d|_|dkrN|j�}n|}|r�x8|jsh|j|�n|j|�D]\}}|j|d|||�qrW|j	|�}	|js�|j
|||��xV|	D�]L}
�xD|	|
D�]6}|
dkr�|j||||�q�|
dkr�q�q�|
dk�r|j|||f|��q�|
dk�r0|j
||||�q�|
dk�rV|j|||d|d|�q�|
d	k�rr|j||||�q�|
d
k�r�|j|||d|d|�q�|
dk�r�|j|||�q�|
dk�r�|j||t|d
�|�q�|
dk�r�q�q�|
dk�r�q�q�tjd||
|�q�Wq�W|�sRx<|j�s"|j|�n|j|�D]\}}|j|d|||��q,Wd|_|dk�rf|j|�dS)NTrGrJrErBrCr�rIrFrDrH)�rule_strr4r7z5Policy '%s': Unknown setting '%s:%s', unable to applyF)rr>r rOr*r/�%_get_table_chains_for_policy_dispatch�#_get_table_chains_for_zone_dispatch�gen_chain_rulesr8�_ingress_egress_zones�_icmp_block�
_forward_port�_service�_port�	_protocol�_source_port�_masquerade�_FirewallPolicy__ruler
rr[�execute)r!�enabler;rb�_policyrM�transaction�table�chainr<�keyr`r#r#r$�_policy_settings�sj













zFirewallPolicy._policy_settingscCs|jd||d�dS)NT)rb)r)r!r;rbr#r#r$rc�sz$FirewallPolicy.apply_policy_settingscCs|jd||d�dS)NF)rb)r)r!r;rbr#r#r$rP�sz&FirewallPolicy.unapply_policy_settingscCsr|j|�j�}|j|�|j|�|j|�|j|�|j|�|j|�|j|�|j	|�|j
|�|j|�d�
}|jj
||�S)zH
        :return: exported config updated with runtime settings
        )
rBrCrGrDrE�
rich_rulesrIrFr4r7)r.Zexport_config_dict�
list_services�
list_ports�list_icmp_blocks�query_masquerade�list_forward_ports�
list_rules�list_protocols�list_source_ports�list_ingress_zones�list_egress_zonesrZ'combine_runtime_with_permanent_settings)r!r;Z	permanentZruntimer#r#r$�get_config_with_settings_dict�sz,FirewallPolicy.get_config_with_settings_dictcs�ddlm�d
��fdd�	}��fdd�}�j�jf�j�jf�j�jf�j�j	f�j
�jf||f�j�j
f�j�jf�j�jf�j�jfd�
}�j|�}�jj||�\}}	xt|	D]l}
t|	|
t��rxV|	|
D]8}t|t�r�||
d|f|��q�||
d||�q�Wq�||
d|�q�Wx�|D]�}
t||
t��r�xn||
D]J}t|t��rv||
d|f|�d|d	��n||
d||d|d	��qFWn||
d|d|d	��q(WdS)Nr)r
cs�j|�|d�d|d�dS)N)rkr)rgrf)r^)r;rkrgrf)r
r!r#r$�add_rule_wrapper�szFFirewallPolicy.set_config_with_settings_dict.<locals>.add_rule_wrappercs�j|�|d��dS)N)rk)�remove_rule)r;rk)r
r!r#r$�remove_rule_wrapper�szIFirewallPolicy.set_config_with_settings_dict.<locals>.remove_rule_wrapper)
rBrCrGrDrEr�rIrFr4r7rj)rgrf)rN)�firewall.core.richr
rW�remove_servicerX�remove_portrU�remove_icmp_blockr_�remove_masqueraderV�remove_forward_portr\�remove_protocolr]�remove_source_portrS�remove_ingress_zonerT�remove_egress_zoner�rZget_added_and_removed_settings�
isinstance�list�tuple)r!r;r<rfr�r�Z
setting_to_fnZold_settingsZadd_settingsZremove_settingsr~r`r#)r
r!r$�set_config_with_settings_dict�s:











  z,FirewallPolicy.set_config_with_settings_dictcCs&|sttj��|dkr"|jj|�dS)Nr5r6)r5r6)rr�INVALID_ZONEr�
check_zone)r!r:r#r#r$�check_ingress_zones
z!FirewallPolicy.check_ingress_zonecCs|j|�|S)N)r�)r!r:r#r#r$Z__ingress_zone_id"s
z FirewallPolicy.__ingress_zone_idrTcCs�|jj|�}|jj|�|jj�|j|}|j|�}	|	|jdkrXttj	d||f��d|jdks�d|jdks�|dkr�|jdr�ttj
d��|dkr�d|jdkr�ttj
d��|dkr�|j�}
n|}
|�rJ|jr�|j
d||
�|j||	||�|
j|j||	�|j�s:||j�k�rH|j||
d	�|
j|j|d�n|j
d
||
�n |j||	||�|
j|j||	�|dk�r~|
jd
�dS)Nr4z'%s' already in '%s'r6r5zI'ingress-zones' may only contain one of: many regular zones, ANY, or HOSTr7zF'HOST' can only appear in either ingress or egress zones, but not bothF)rbT)r6r5)rr>�
check_timeout�check_panicr � _FirewallPolicy__ingress_zone_idr<rrrZr�r*rOro�&_FirewallPolicy__register_ingress_zone�add_fail�(_FirewallPolicy__unregister_ingress_zoner=rcrerx)r!r;r:rgrfrbrRrz�_obj�zone_idr{r#r#r$rS&s<




zFirewallPolicy.add_ingress_zonecCs|j||�|jd|<dS)Nr4)�_FirewallPolicy__gen_settingsr<)r!r�r�rgrfr#r#r$Z__register_ingress_zoneSsz&FirewallPolicy.__register_ingress_zonecCs�|jj|�}|jj�|j|}|j|�}||jdkrLttjd||f��|dkr^|j	�}n|}|j
r�t|jd�dkr�|j||�n|j
d||�|j||�|j|j||dd�||j�kr�|j
d||�n|j|j||�|dkr�|jd�|S)Nr4z'%s' not in '%s'rjFT)rr>r�r r�r<rr�NOT_ENABLEDr*rO�lenrPror�r�r�r=�add_postrx)r!r;r:rbrzr�r�r{r#r#r$r�Vs,




z"FirewallPolicy.remove_ingress_zonecCs||jdkr|jd|=dS)Nr4)r<)r!r�r�r#r#r$Z__unregister_ingress_zoneysz(FirewallPolicy.__unregister_ingress_zonecCs|j|�|j|�dkS)Nr4)r�r8)r!r;r:r#r#r$�query_ingress_zone}sz!FirewallPolicy.query_ingress_zonecCst|j|�dj��S)Nr4)r�r8r,)r!r;r#r#r$r��sz!FirewallPolicy.list_ingress_zonescCs&|sttj��|dkr"|jj|�dS)Nr5r6)r5r6)rrr�rr�)r!r:r#r#r$�check_egress_zone�s
z FirewallPolicy.check_egress_zonecCs|j|�|S)N)r�)r!r:r#r#r$Z__egress_zone_id�s
zFirewallPolicy.__egress_zone_idcCs�|jj|�}|jj|�|jj�|j|}|j|�}	|	|jdkrXttj	d||f��d|jdks�d|jdks�|dkr�|jdr�ttj
d��|dkr�d|jdkr�ttj
d��|dkr�|j�}
n|}
|�rJ|jr�|j
d||
�|j||	||�|
j|j||	�|j�s:||j�k�rH|j||
d	�|
j|j|d�n|j
d
||
�n |j||	||�|
j|j||	�|dk�r~|
jd
�dS)Nr7z'%s' already in '%s'r6r5zH'egress-zones' may only contain one of: many regular zones, ANY, or HOSTr4zF'HOST' can only appear in either ingress or egress zones, but not bothF)rbT)r6r5)rr>r�r�r �_FirewallPolicy__egress_zone_idr<rrrZr�r*rOro�%_FirewallPolicy__register_egress_zoner��'_FirewallPolicy__unregister_egress_zoner=rcrerx)r!r;r:rgrfrbrRrzr�r�r{r#r#r$rT�s<




zFirewallPolicy.add_egress_zonecCs|j||�|jd|<dS)Nr7)r�r<)r!r�r�rgrfr#r#r$Z__register_egress_zone�sz%FirewallPolicy.__register_egress_zonecCs�|jj|�}|jj�|j|}|j|�}||jdkrLttjd||f��|dkr^|j	�}n|}|j
r�t|jd�dkr�|j||�n|j
d||�|j||�|j|j||dd�||j�kr�|j
d||�n|j|j||�|dkr�|jd�|S)Nr7z'%s' not in '%s'rjFT)rr>r�r r�r<rrr�r*rOr�rPror�r�r�r=r�rx)r!r;r:rbrzr�r�r{r#r#r$r��s,




z!FirewallPolicy.remove_egress_zonecCs||jdkr|jd|=dS)Nr7)r<)r!r�r�r#r#r$Z__unregister_egress_zone�sz'FirewallPolicy.__unregister_egress_zonecCs|j|�|j|�dkS)Nr7)r�r8)r!r;r:r#r#r$�query_egress_zone�sz FirewallPolicy.query_egress_zonecCst|j|�dj��S)Nr7)r�r8r,)r!r;r#r#r$r��sz FirewallPolicy.list_egress_zonescCs|j�dS)N)Zcheck)r!�ruler#r#r$�
check_rule�szFirewallPolicy.check_rulecCs|j|�t|�S)N)r��str)r!r�r#r#r$Z	__rule_id�s
zFirewallPolicy.__rule_idcCsx|sdS|jr,t|j�rdSt|j�rtdSnHt|d�r@|jr@dSt|d�rt|jrt|j|j�|j|j�|j|j�SdS)N�ipv4�ipv6�mac��ipset)	Zaddrrr�hasattrr�r��_check_ipset_type_for_source�_check_ipset_applied�
_ipset_family)r!�sourcer#r#r$�_rule_source_ipv�s

zFirewallPolicy._rule_source_ipvcCs|j||||�dS)N)�
_rule_prepare)r!ryr;r�r{r#r#r$Z__ruleszFirewallPolicy.__rulecCsL|jj|�}|jj|�|jj�|j|}|j|�}||jdkrh|jrP|jn|}	tt	j
d||	f��|j�s�|jr�t|jt
�r�d|jdkr�tt	jd��d|jdkr�tt	jd��x6|jdD](}
|
dkr�q�|jjj|
�r�tt	jd	��q�W|j�r�t|jt��r�d|jdk�r,|jj�r�tt	jd
��nb|jd�r�|jj�sNtt	jd��x>|jdD]0}
|
dk�rl�qZ|jjj|
��rZtt	jd���qZW|j�r�t|jt��r�x>|jdD]0}
|
dk�rq�|jjj|
��r�tt	jd
���q�W|dk�r�|j�}n|}|j�r|jd|||�|j||||�|j|j||�|dk�rH|jd�|S)NrHz'%s' already in '%s'r5r7z.'masquerade' is invalid for egress zone 'HOST'r4z/'masquerade' is invalid for ingress zone 'HOST'r6zR'masquerade' cannot be used in a policy if an ingress zone has assigned interfaceszAA 'forward-port' with 'to-addr' is invalid for egress zone 'HOST'zC'forward-port' requires 'to-addr' if egress zone is 'ANY' or a zonezS'forward-port' cannot be used in a policy if an egress zone has assigned interfaceszR'mark' action cannot be used in a policy if an egress zone has assigned interfacesT)r6r5)rr>r�r�r �_FirewallPolicy__rule_idr<r/rrrZ�elementr�rr�r:�list_interfacesr�
to_address�INVALID_FORWARD�actionrr*rOrw�_FirewallPolicy__register_ruler�� _FirewallPolicy__unregister_rulerx)r!r;r�rgrfrbrzr��rule_id�_namer:r{r#r#r$r^
s`










zFirewallPolicy.add_rulecCs|j||�|jd|<dS)NrH)r�r<)r!r�r�rgrfr#r#r$Z__register_ruleEszFirewallPolicy.__register_rulec	Cs�|jj|�}|jj�|j|}|j|�}||jdkr\|jrD|jn|}ttj	d||f��|dkrn|j
�}n|}|jr�|jd|||�|j
|j||�|dkr�|jd�|S)NrHz'%s' not in '%s'FT)rr>r�r r�r<r/rrr�r*rOrwr�r�rx)	r!r;r�rbrzr�r�r�r{r#r#r$r�Is"




zFirewallPolicy.remove_rulecCs||jdkr|jd|=dS)NrH)r<)r!r�r�r#r#r$Z__unregister_ruledsz FirewallPolicy.__unregister_rulecCs|j|�|j|�dkS)NrH)r�r8)r!r;r�r#r#r$�
query_rulehszFirewallPolicy.query_rulecCst|j|�dj��S)NrH)r�r8r,)r!r;r#r#r$r�kszFirewallPolicy.list_rulescCs|jj|�dS)N)r�
check_service)r!�servicer#r#r$r�pszFirewallPolicy.check_servicecCs|j|�|S)N)r�)r!r�r#r#r$Z__service_idss
zFirewallPolicy.__service_idcCs�|jj|�}|jj|�|jj�|j|}|j|�}||jdkrh|jrP|jn|}	tt	j
d||	f��|dkrz|j�}
n|}
|jr�|j
d|||
�|j||||�|
j|j||�|dkr�|
jd�|S)NrBz'%s' already in '%s'T)rr>r�r�r �_FirewallPolicy__service_idr<r/rrrZr*rOrr�!_FirewallPolicy__register_servicer��#_FirewallPolicy__unregister_servicerx)r!r;r�rgrfrbrzr��
service_idr�r{r#r#r$rWws&




zFirewallPolicy.add_servicecCs|j||�|jd|<dS)NrB)r�r<)r!r�r�rgrfr#r#r$Z__register_service�sz!FirewallPolicy.__register_servicec	Cs�|jj|�}|jj�|j|}|j|�}||jdkr\|jrD|jn|}ttj	d||f��|dkrn|j
�}n|}|jr�|jd|||�|j
|j||�|dkr�|jd�|S)NrBz'%s' not in '%s'FT)rr>r�r r�r<r/rrr�r*rOrrr�r�rx)	r!r;r�rbrzr�r�r�r{r#r#r$r��s"




zFirewallPolicy.remove_servicecCs||jdkr|jd|=dS)NrB)r<)r!r�r�r#r#r$Z__unregister_service�sz#FirewallPolicy.__unregister_servicecCs|j|�|j|�dkS)NrB)r�r8)r!r;r�r#r#r$�
query_service�szFirewallPolicy.query_servicecCs|j|�dj�S)NrB)r8r,)r!r;r#r#r$r��szFirewallPolicy.list_servicescCsTg}xJ|D]B}y|jjj|�}Wn tk
r@ttj|��YnX|j|�q
W|S)N)r�helper�
get_helperrr�INVALID_HELPERr0)r!�helpers�_helpersr��_helperr#r#r$�get_helpers_for_service_helpers�s
z.FirewallPolicy.get_helpers_for_service_helperscCs�g}x�|D]�}y|jjj|�}Wn tk
r@ttj|��YnXt|j�dkr�t|j	�}y|jjj|�}|j
|�Wq�tk
r�|r�tjd|�w
Yq�Xq
|j
|�q
W|S)NrjzHelper '%s' is not available)
rr�r�rrr�r�rCr
�moduler0rr[)r!�modulesryr�r�r��_module_short_namer�r#r#r$�get_helpers_for_service_modules�s"


z.FirewallPolicy.get_helpers_for_service_modulescCs|jj|�|jj|�dS)N)r�
check_port�check_tcpudp)r!�port�protocolr#r#r$r��szFirewallPolicy.check_portcCs|j||�t|d�|fS)N�-)r�r)r!r�r�r#r#r$Z	__port_id�szFirewallPolicy.__port_idcs�|jj|�}|jj|�|jj�|j|}tt�fdd�|jd��}	x@|	D]8}
t||
d�rN|j	rl|j	n|}t
tjd|�|f��qNWt
|dd�|	D��\}}
|dkr�|j�}n|}|j�rx$|D]}|jd|t|d	��|�q�Wx$|
D]}|jd
|t|d	��|�q�Wx:|D]2}|j|��}
|j||
||�|j|j||
��qWx*|
D]"}|j|��}
|j|j||
��qNW|dk�r�|jd�|S)Ncs|d�kS)Nrjr#)r@)r�r#r$�<lambda>�sz)FirewallPolicy.add_port.<locals>.<lambda>rCrz'%s:%s' already in '%s'cSsg|]\}}|�qSr#r#)r?rsrtr#r#r$�
<listcomp>�sz+FirewallPolicy.add_port.<locals>.<listcomp>Tr�F)rr>r�r�r r��filterr<r	r/rrrZrr*rOrsr�_FirewallPolicy__port_id�_FirewallPolicy__register_portr�� _FirewallPolicy__unregister_portr�rx)r!r;r�r�rgrfrbrzr��existing_port_ids�port_idr��added_ranges�removed_rangesr{�ranger#)r�r$rX�s:









zFirewallPolicy.add_portcCs|j||�|jd|<dS)NrC)r�r<)r!r�r�rgrfr#r#r$Z__register_portszFirewallPolicy.__register_portcs�|jj|�}|jj�|j|}tt�fdd�|jd��}xB|D]}t||d�rBPqBW|jrf|jn|}	t	t
jd|�|	f��t|dd�|D��\}
}|dkr�|j
�}n|}|j�rx$|
D]}
|jd|t|
d	��|�q�Wx$|D]}
|jd
|t|
d	��|�q�Wx:|
D]2}
|j|
��}|j||dd�|j|j||��qWx*|D]"}
|j|
��}|j|j||��qDW|dk�r~|jd�|S)Ncs|d�kS)Nrjr#)r@)r�r#r$r�sz,FirewallPolicy.remove_port.<locals>.<lambda>rCrz'%s:%s' not in '%s'cSsg|]\}}|�qSr#r#)r?rsrtr#r#r$r�#sz.FirewallPolicy.remove_port.<locals>.<listcomp>Tr�F)rr>r�r r�r�r<r	r/rrr�rr*rOrsrr�r�r�r�r�rx)r!r;r�r�rbrzr�r�r�r�r�r�r{r�r#)r�r$r�s:









zFirewallPolicy.remove_portcCs||jdkr|jd|=dS)NrC)r<)r!r�r�r#r#r$Z__unregister_port=sz FirewallPolicy.__unregister_portcCs6x0|j|�dD]\}}t||�r||krdSqWdS)NrCTF)r8r	)r!r;r�r�rsrtr#r#r$�
query_portAszFirewallPolicy.query_portcCst|j|�dj��S)NrC)r�r8r,)r!r;r#r#r$r�HszFirewallPolicy.list_portscCst|�sttj|��dS)N)rrrZINVALID_PROTOCOL)r!r�r#r#r$�check_protocolMszFirewallPolicy.check_protocolcCs|j|�|S)N)r�)r!r�r#r#r$Z
__protocol_idQs
zFirewallPolicy.__protocol_idcCs�|jj|�}|jj|�|jj�|j|}|j|�}||jdkrh|jrP|jn|}	tt	j
d||	f��|dkrz|j�}
n|}
|jr�|j
d|||
�|j||||�|
j|j||�|dkr�|
jd�|S)NrIz'%s' already in '%s'T)rr>r�r�r �_FirewallPolicy__protocol_idr<r/rrrZr*rOrt�"_FirewallPolicy__register_protocolr��$_FirewallPolicy__unregister_protocolrx)r!r;r�rgrfrbrzr��protocol_idr�r{r#r#r$r\Us&




zFirewallPolicy.add_protocolcCs|j||�|jd|<dS)NrI)r�r<)r!r�r�rgrfr#r#r$Z__register_protocolrsz"FirewallPolicy.__register_protocolc	Cs�|jj|�}|jj�|j|}|j|�}||jdkr\|jrD|jn|}ttj	d||f��|dkrn|j
�}n|}|jr�|jd|||�|j
|j||�|dkr�|jd�|S)NrIz'%s' not in '%s'FT)rr>r�r r�r<r/rrr�r*rOrtr�r�rx)	r!r;r�rbrzr�r�r�r{r#r#r$r�vs$





zFirewallPolicy.remove_protocolcCs||jdkr|jd|=dS)NrI)r<)r!r�r�r#r#r$Z__unregister_protocol�sz$FirewallPolicy.__unregister_protocolcCs|j|�|j|�dkS)NrI)r�r8)r!r;r�r#r#r$�query_protocol�szFirewallPolicy.query_protocolcCst|j|�dj��S)NrI)r�r8r,)r!r;r#r#r$r��szFirewallPolicy.list_protocolscCs|j||�t|d�|fS)Nr�)r�r)r!r�r�r#r#r$Z__source_port_id�szFirewallPolicy.__source_port_idcs�|jj|�}|jj|�|jj�|j|}tt�fdd�|jd��}	x@|	D]8}
t||
d�rN|j	rl|j	n|}t
tjd|�|f��qNWt
|dd�|	D��\}}
|dkr�|j�}n|}|j�rx$|D]}|jd|t|d	��|�q�Wx$|
D]}|jd
|t|d	��|�q�Wx:|D]2}|j|��}
|j||
||�|j|j||
��qWx*|
D]"}|j|��}
|j|j||
��qNW|dk�r�|jd�|S)Ncs|d�kS)Nrjr#)r@)r�r#r$r��sz0FirewallPolicy.add_source_port.<locals>.<lambda>rFrz'%s:%s' already in '%s'cSsg|]\}}|�qSr#r#)r?rsrtr#r#r$r��sz2FirewallPolicy.add_source_port.<locals>.<listcomp>Tr�F)rr>r�r�r r�r�r<r	r/rrrZrr*rOrur�_FirewallPolicy__source_port_id�%_FirewallPolicy__register_source_portr��'_FirewallPolicy__unregister_source_portr�rx)r!r;r�r�rgrfrbrzr�r�r�r�r�r�r{r�r#)r�r$r]�s:









zFirewallPolicy.add_source_portcCs|j||�|jd|<dS)NrF)r�r<)r!r�r�rgrfr#r#r$Z__register_source_port�sz%FirewallPolicy.__register_source_portcs�|jj|�}|jj�|j|}tt�fdd�|jd��}xB|D]}t||d�rBPqBW|jrf|jn|}	t	t
jd|�|	f��t|dd�|D��\}
}|dkr�|j
�}n|}|j�rx$|
D]}
|jd|t|
d	��|�q�Wx$|D]}
|jd
|t|
d	��|�q�Wx:|
D]2}
|j|
��}|j||dd�|j|j||��qWx*|D]"}
|j|
��}|j|j||��qDW|dk�r~|jd�|S)Ncs|d�kS)Nrjr#)r@)r�r#r$r��sz3FirewallPolicy.remove_source_port.<locals>.<lambda>rFrz'%s:%s' not in '%s'cSsg|]\}}|�qSr#r#)r?rsrtr#r#r$r��sz5FirewallPolicy.remove_source_port.<locals>.<listcomp>Tr�F)rr>r�r r�r�r<r	r/rrr�rr*rOrurr�r�r�r�r�rx)r!r;r�r�rbrzr�r�r�r�r�r�r{r�r#)r�r$r��s:









z!FirewallPolicy.remove_source_portcCs||jdkr|jd|=dS)NrF)r<)r!r�r�r#r#r$Z__unregister_source_port�sz'FirewallPolicy.__unregister_source_portcCs6x0|j|�dD]\}}t||�r||krdSqWdS)NrFTF)r8r	)r!r;r�r�rsrtr#r#r$�query_source_port�sz FirewallPolicy.query_source_portcCst|j|�dj��S)NrF)r�r8r,)r!r;r#r#r$r�sz FirewallPolicy.list_source_portscCsdS)NTr#)r!r#r#r$Z__masquerade_idszFirewallPolicy.__masquerade_idcCs8|jj|�}|jj|�|jj�|j|}|j�}||jdkrb|jrN|jn|}tt	j
d|��|js�d|jdkr�tt	jd��d|jdkr�tt	jd��x6|jdD](}	|	dkr�q�|jjj
|	�r�tt	jd	��q�W|dkr�|j�}
n|}
|j�r|jd
||
�|j||||�|
j|j||�|dk�r4|
jd
�|S)NrDz"masquerade already enabled in '%s'r5r7z.'masquerade' is invalid for egress zone 'HOST'r4z/'masquerade' is invalid for ingress zone 'HOST'r6zR'masquerade' cannot be used in a policy if an ingress zone has assigned interfacesT)rr>r�r�r �_FirewallPolicy__masquerade_idr<r/rrrZr�r:r�r*rOrv�$_FirewallPolicy__register_masquerader��&_FirewallPolicy__unregister_masqueraderx)r!r;rgrfrbrzr��
masquerade_idr�r:r{r#r#r$r_
s:





zFirewallPolicy.add_masqueradecCs|j||�|jd|<dS)NrD)r�r<)r!r�r�rgrfr#r#r$Z__register_masquerade2sz$FirewallPolicy.__register_masqueradecCs�|jj|�}|jj�|j|}|j�}||jdkrV|jrB|jn|}ttj	d|��|dkrh|j
�}n|}|jr�|jd||�|j
|j||�|dkr�|jd�|S)NrDzmasquerade not enabled in '%s'FT)rr>r�r r�r<r/rrr�r*rOrvr�r�rx)r!r;rbrzr�r�r�r{r#r#r$r�6s"




z FirewallPolicy.remove_masqueradecCs||jdkr|jd|=dS)NrD)r<)r!r�r�r#r#r$Z__unregister_masqueradePsz&FirewallPolicy.__unregister_masqueradecCs|j�|j|�dkS)NrD)r�r8)r!r;r#r#r$r�TszFirewallPolicy.query_masqueradecCs^|jj|�|jj|�|r(|jj|�|rBt||�sBttj|��|rZ|rZttjd��dS)Nz.port-forwarding is missing to-port AND to-addr)rr�r�rrrZINVALID_ADDRr�)r!�ipvr�r��toport�toaddrr#r#r$�check_forward_portYs
z!FirewallPolicy.check_forward_portcCsLtd|�r|jd||||�n|jd||||�t|d�|t|d�t|�fS)Nr�r�r�)rrrr�)r!r�r�r�r�r#r#r$Z__forward_port_idfs


z FirewallPolicy.__forward_port_idc	CsZ|jj|�}	|jj|�|jj�|j|	}
|j||||�}||
jdkrt|
jrV|
jn|	}tt	j
d|||||f��|
js�d|
jdkr�|r�tt	jd��nR|
jdr�|s�tt	jd��x6|
jdD](}
|
dkr�q�|jjj
|
�r�tt	jd��q�W|dk�r|j�}n|}|
j�r"|jd	|	|||||�|j|
|||�|j|j|
|�|dk�rV|jd	�|	S)
NrEz'%s:%s:%s:%s' already in '%s'r5r7zAA 'forward-port' with 'to-addr' is invalid for egress zone 'HOST'zC'forward-port' requires 'to-addr' if egress zone is 'ANY' or a zoner6zS'forward-port' cannot be used in a policy if an egress zone has assigned interfacesT)rr>r�r�r � _FirewallPolicy__forward_port_idr<r/rrrZr�r:r�r�r*rOrq�&_FirewallPolicy__register_forward_portr��(_FirewallPolicy__unregister_forward_portrx)r!r;r�r�r�r�rgrfrbrzr��
forward_idr�r:r{r#r#r$rVnsB






zFirewallPolicy.add_forward_portcCs|j||�|jd|<dS)NrE)r�r<)r!r�rrgrfr#r#r$Z__register_forward_port�sz&FirewallPolicy.__register_forward_portcCs�|jj|�}|jj�|j|}|j||||�}	|	|jdkrh|jrJ|jn|}
ttj	d|||||
f��|dkrz|j
�}n|}|jr�|jd||||||�|j
|j||	�|dkr�|jd�|S)NrEz'%s:%s:%s:%s' not in '%s'FT)rr>r�r rr<r/rrr�r*rOrqr�rrx)r!r;r�r�r�r�rbrzr�rr�r{r#r#r$r��s&



z"FirewallPolicy.remove_forward_portcCs||jdkr|jd|=dS)NrE)r<)r!r�rr#r#r$Z__unregister_forward_port�sz(FirewallPolicy.__unregister_forward_portcCs"|j||||�}||j|�dkS)NrE)rr8)r!r;r�r�r�r�rr#r#r$�query_forward_port�sz!FirewallPolicy.query_forward_portcCst|j|�dj��S)NrE)r�r8r,)r!r;r#r#r$r��sz!FirewallPolicy.list_forward_portscCs|jj|�dS)N)rZcheck_icmptype)r!�icmpr#r#r$�check_icmp_block�szFirewallPolicy.check_icmp_blockcCs|j|�|S)N)r)r!rr#r#r$Z__icmp_block_id�s
zFirewallPolicy.__icmp_block_idcCs�|jj|�}|jj|�|jj�|j|}|j|�}||jdkrh|jrP|jn|}	tt	j
d||	f��|dkrz|j�}
n|}
|jr�|j
d|||
�|j||||�|
j|j||�|dkr�|
jd�|S)NrGz'%s' already in '%s'T)rr>r�r�r �_FirewallPolicy__icmp_block_idr<r/rrrZr*rOrp�$_FirewallPolicy__register_icmp_blockr��&_FirewallPolicy__unregister_icmp_blockrx)r!r;rrgrfrbrzr��icmp_idr�r{r#r#r$rU�s&




zFirewallPolicy.add_icmp_blockcCs|j||�|jd|<dS)NrG)r�r<)r!r�rrgrfr#r#r$Z__register_icmp_block�sz$FirewallPolicy.__register_icmp_blockc	Cs�|jj|�}|jj�|j|}|j|�}||jdkr\|jrD|jn|}ttj	d||f��|dkrn|j
�}n|}|jr�|jd|||�|j
|j||�|dkr�|jd�|S)NrGz'%s' not in '%s'FT)rr>r�r rr<r/rrr�r*rOrpr�r
rx)	r!r;rrbrzr�rr�r{r#r#r$r��s"




z FirewallPolicy.remove_icmp_blockcCs||jdkr|jd|=dS)NrG)r<)r!r�rr#r#r$Z__unregister_icmp_blocksz&FirewallPolicy.__unregister_icmp_blockcCs|j|�|j|�dkS)NrG)rr8)r!r;rr#r#r$�query_icmp_blockszFirewallPolicy.query_icmp_blockcCs|j|�dj�S)NrG)r8r,)r!r;r#r#r$r�szFirewallPolicy.list_icmp_blockscCsdS)NTr#)r!r#r#r$Z__icmp_block_inversion_idsz(FirewallPolicy.__icmp_block_inversion_idc
Cs|jj|�}|jj�|j|}|j�}||jdkrV|jrB|jn|}ttj	d|��|dkrh|j
�}n|}|jr�x&|j|�dD]}	|j
d||	|�q�W|jd||�|j|||�|j|j|||�|j�rx&|j|�dD]}	|j
d||	|�q�W|jd||�|dk�r|jd�|S)NrJz,icmp-block-inversion already enabled in '%s'rGFT)rr>r�r �(_FirewallPolicy__icmp_block_inversion_idr<r/rrrZr*rOr8rp�_icmp_block_inversion�._FirewallPolicy__register_icmp_block_inversionr��*_FirewallPolicy__undo_icmp_block_inversionrx)
r!r;rfrbrzr��icmp_block_inversion_idr�r{r`r#r#r$�add_icmp_block_inversions6





z'FirewallPolicy.add_icmp_block_inversioncCs|jd|�|jd|<dS)NrrJ)r�r<)r!r�rrfr#r#r$Z__register_icmp_block_inversionEsz.FirewallPolicy.__register_icmp_block_inversioncCs�|j�}|jr6x&|j|�dD]}|jd|||�qW||jdkrP|jd|=|jr~x&|j|�dD]}|jd|||�qfW|jd�dS)NrGFrJT)r*rOr8rpr<rx)r!rzr�rr{r`r#r#r$Z__undo_icmp_block_inversionJsz*FirewallPolicy.__undo_icmp_block_inversionc	Cs|jj|�}|jj�|j|}|j�}||jdkrV|jrB|jn|}ttj	d|��|dkrh|j
�}n|}|jr�x&|j|�dD]}|j
d|||�q�W|jd||�|j||�|j|j||d�|j�rx&|j|�dD]}|j
d|||�q�W|jd||�|dk�r|jd�|S)NrJz(icmp-block-inversion not enabled in '%s'rGFT)rr>r�r r
r<r/rrr�r*rOr8rpr�0_FirewallPolicy__unregister_icmp_block_inversionr�rrx)	r!r;rbrzr�rr�r{r`r#r#r$�remove_icmp_block_inversion\s6






z*FirewallPolicy.remove_icmp_block_inversioncCs||jdkr|jd|=dS)NrJ)r<)r!r�rr#r#r$Z!__unregister_icmp_block_inversion�sz0FirewallPolicy.__unregister_icmp_block_inversioncCs|j�|j|�dkS)NrJ)r
r8)r!r;r#r#r$�query_icmp_block_inversion�sz)FirewallPolicy.query_icmp_block_inversionc
Cs�|jjj|�}|jr*|jjj|jd}n|}|rT||jkrt||f|j|krtdSn ||jksp||f|j|krtdSx@|jj�D]2}|jr�||j	�kr�|j
||||�}	|j||	�q�W|j||||fg�|j
|j||||fg�dS)Nr)rr;r.r/r:Z_zone_policiesr�enabled_backends�policies_supportedZget_available_tablesZbuild_policy_chain_rules�	add_rules�_register_chainsr�)
r!r;�creater|r}r{rMZtracking_policy�backendrHr#r#r$rn�s$

zFirewallPolicy.gen_chain_rulescCsbx\|D]T\}}|r,|jj|g�j||f�q|j|j||f�t|j|�dkr|j|=qWdS)Nr)r�
setdefaultr0�remover�)r!r;rZtablesr|r}r#r#r$r�szFirewallPolicy._register_chainscCs$|jjj|�dkrdS|jjj|�S)Nzhash:mac)rr��get_typeZ
get_family)r!rKr#r#r$r��szFirewallPolicy._ipset_familycCs|jjj|�S)N)rr�r)r!rKr#r#r$Z__ipset_type�szFirewallPolicy.__ipset_typecCsdj|g|jjj|��S)N�,)�joinrr�Z
get_dimension)r!rK�flagr#r#r$�_ipset_match_flags�sz!FirewallPolicy._ipset_match_flagscCs|jjj|�S)N)rr�Z
check_applied)r!rKr#r#r$r��sz#FirewallPolicy._check_ipset_appliedcCs*|j|�}|tkr&ttjd||f��dS)Nz.ipset '%s' with type '%s' not usable as source)�_FirewallPolicy__ipset_typerrrZ
INVALID_IPSET)r!rKZ_typer#r#r$r��s
z+FirewallPolicy._check_ipset_type_for_sourcecs�t|j�tkr��jjj|jj�}|dkr2|jjg}xR|jD]H}||krHq:�j|�|j	|�t
j|�}||j_�j|||||d�q:Wg}	|j
r�|j
g}	nH|jr�t|jt�s�t|jt�r�jjj|jj���jr�fdd�dD�}	�j|j�}
|
�r&|j
�r |j
|
k�r&ttjd|
|j
f��n|
g}	|	�s4ddg}	�fdd�|	D�}	|	|_�x2t�fdd�|	D��D�]}t|j�tk�r��jjj|jj�}g}t|j�d	k�r�|j�r�ttjd
��xB|	D].}
|
|jk�r�|j|
��r�|j	|j|
��q�Wn
|j	d��x~|D�]�}t|j�tk�r�j|j |�}|�j!|j"�7}t#t|�dd�d
�}g}x�|D]�}|j$}t%|�}|j&dd�}|j	|�|j
dk�r�|j|j
��r��qTt|j'�dk�r�|j	|�n:x8|j'D].\}}|j(||||||j|�}|j)||��q�W�qTW|j*|�x4|j'D]*\}}|j+||||||�}|j)||��q
Wx.|j,D]$}|j-|||||�}|j)||��q@Wx4|j.D]*\}}|j/||||||�}|j)||��qpW�qW�qft|j�t0k�r�|jj1}|jj2}�j3||�|j+||||d|�}|j)||��qft|j�t4k�r<|jj5}�j6|�|j-|||d|�}|j)||��qft|j�t7k�r�|�rzx&|	D]}
|j|
��rX|j8t9|
��qXW|j:|||�}|j)||��qft|j�t;k�r4|jj1}|jj2}|jj<}|jj=}xD|	D]<}
|j|
��r�j>|
||||�|�r�|�r�|j8t9|
��q�W|j?|||||||�}|j)||��qft|j�t@k�r�|jj1}|jj2}�j3||�|j/||||d|�}|j)||�n�t|j�tk�s�t|j�tk�r>�jjj|jj��|j
�r�j�r�|j
�jk�r�ttjAd|j
|jjf��t|j�tk�r |j�r t|j�tk�r ttjd��|jB||�|�}|j)||�n>|jdk�rf|jC|||�}|j)||�nttjdt|j����qfWdS)N)�included_servicescsg|]}|�jkr|�qSr#)�destination)r?r�)�ictr#r$r��sz0FirewallPolicy._rule_prepare.<locals>.<listcomp>r�r�z;Source address family '%s' conflicts with rule family '%s'.csg|]}�jj|�r|�qSr#)r�is_ipv_enabled)r?r�)r!r#r$r��scsg|]}�jj|��qSr#)r�get_backend_by_ipv)r?r@)r!r#r$r��srz"Destination conflict with service.cSs|jS)N)rK)r@r#r#r$r�sz.FirewallPolicy._rule_prepare.<locals>.<lambda>)r~�	conntrack�natr�rjz3rich rule family '%s' conflicts with icmp type '%s'z'IcmpBlock not usable with accept actionzUnknown element %s)r�r�)D�typer�rrr��get_servicerK�includesr�r0�copy�deepcopyr��familyr�rr�config�get_icmptyper%r�r�rrZINVALID_RULE�ipvsr9r��is_ipv_supportedr�rr�r�r�r�r+r�r
�replacerC�build_policy_helper_ports_rulesrZadd_modules�build_policy_ports_rulesrI�build_policy_protocol_rulesrF�build_policy_source_ports_rulesrr�r�r�r�valuer�rr�r�build_policy_masquerade_rulesrZto_portr�r�build_policy_forward_port_rulesrZINVALID_ICMPTYPE�build_policy_icmp_block_rulesZ*build_policy_rich_source_destination_rules)r!ryr;r�r{r$�svc�includeZ_ruler3Z
source_ipvrZdestinationsr�r%r�r�r�r�r��
nat_moduler��protorHr�r�r�r#)r&r!r$r��s




 









zFirewallPolicy._rule_preparecCsb|jjj|�}|j|j|�}||j|j�7}tt|�dd�d�}|dkrN|g}x@|j	D]6}||krdqV|j
|�|j|�|j|||||d�qVWg}	xndD]f}
|jj
|
�s�q�|jj|
�}t|j�dkr�|
|jkr�|	j||j|
f�q�|df|	kr�|	j|df�q�W�xV|	D�]L\}}x�|D]�}
|
j}t|�}|
jjdd	�}|j|�|
jd
k�rf|j|
j��rf�qt|
j�dk�r�|j|�n:x8|
jD].\}}|j||||||
j|�}|j||��q�W�qWx2|jD](\}}|j|||||�}|j||��q�Wx,|jD]"}|j||||�}|j||��q�Wx2|jD](\}}|j|||||�}|j||��q,W�qWdS)
NcSs|jS)N)rK)r@r#r#r$r��sz)FirewallPolicy._service.<locals>.<lambda>)r~)r$r�r�rr)r*r�rj)r�r�) rr�r,r�r�r�r�r+r9r-r�r0rrr'r(r�r%r�r
r5Z
add_moduler0r4rCr6rKrr7rIr8rFr9)r!ryr;r�r{r$r>r�r?Zbackends_ipvr�rr%r�r�r�r@r�rArHr�r#r#r$rr�sb






zFirewallPolicy._servicecCs<x6|jj�D](}|jsq|j||||�}|j||�qWdS)N)rrrr7r)r!ryr;r�r�r{rrHr#r#r$rs�s
zFirewallPolicy._portcCs:x4|jj�D]&}|jsq|j|||�}|j||�qWdS)N)rrrr8r)r!ryr;r�r{rrHr#r#r$rt�s
zFirewallPolicy._protocolcCs<x6|jj�D](}|jsq|j||||�}|j||�qWdS)N)rrrr9r)r!ryr;r�r�r{rrHr#r#r$ru�s
zFirewallPolicy._source_portcCs8d}|jt|�|jj|�}|j||�}|j||�dS)Nr�)r�rrr(r;r)r!ryr;r{r�rrHr#r#r$rv�s
zFirewallPolicy._masqueradecCsXtd|�rd}nd}|r(|r(|jt|�|jj|�}	|	j||||||�}
|j|	|
�dS)Nr�r�)rr�rrr(r<r)r!ryr;r{r�r�r�r�r�rrHr#r#r$rq�s

zFirewallPolicy._forward_portc
Cs�|jjj|�}xl|jj�D]^}|js&qd}|jrXx&dD]}||jkr6|j|�s6d}Pq6W|r^q|j|||�}	|j||	�qWdS)NFr�r�T)r�r�)	rr1r2rrr%r4r=r)
r!ryr;rr{r&rZskip_backendr�rHr#r#r$rp�s


zFirewallPolicy._icmp_blockcCsh|j|j}|dkrdS|j|�r0|dkr0dSx2|jj�D]$}|jsHq<|j||�}|j||�q<WdS)N�DROP�
%%REJECT%%�REJECTZACCEPT)rBrCrD)r �targetrrrrZ'build_policy_icmp_block_inversion_rulesr)r!ryr;r{rErrHr#r#r$rsz$FirewallPolicy._icmp_block_inversionc	Cs�x|D]}|j|�qWx|D]}|j|�qWd|ks@d|krXt|�dkrXttjd��d|kshd|kr�t|�dkr�ttjd��|s�|r�|r�|r�d|kr�d|kr�ttjd|��|s�|r�|r�|r�d|kr�d|kr�ttjd|��dS)Nr6r5rjzI'ingress-zones' may only contain one of: many regular zones, ANY, or HOSTzH'egress-zones' may only contain one of: many regular zones, ANY, or HOSTzpolicy "%s" has no ingresszpolicy "%s" has no egress)r�r�r�rrr�)	r!r;r4r7�ingress_interfaces�egress_interfaces�ingress_sources�egress_sourcesr:r#r#r$�check_ingress_egress"s$

z#FirewallPolicy.check_ingress_egressc

Cs�|dkr&|dkr�|r�ttjd|��n�|dkrtd|krFttjd|��d|kr^ttjd|��|r�ttjd|��n||d	kr�d|kr�ttjd|��d|kr�ttjd|��nB|d
kr�d|kr�ttjd|��n |dkr�d|kr�ttjd
|��dS)N�
PREROUTING�rawzFpolicy "%s" egress-zones may not include a zone with added interfaces.�POSTROUTINGr5z/policy "%s" ingress-zones may not include HOST.z.policy "%s" egress-zones may not include HOST.zGpolicy "%s" ingress-zones may not include a zone with added interfaces.�FORWARD�INPUTz0policy "%s" egress-zones must include only HOST.�OUTPUTz1policy "%s" ingress-zones must include only HOST.)rrr�)
r!r;r|r}r4r7rFrGrHrIr#r#r$�check_ingress_egress_chain<s,z)FirewallPolicy.check_ingress_egress_chaincCs$|j�}|j|||�|jd�dS)NT)r*rorx)r!ryr;r{r#r#r$�!_ingress_egress_zones_transactionYsz0FirewallPolicy._ingress_egress_zones_transactioncCsL|j|}|jd}|jd}t�}t�}t�}	t�}
xB|D]:}|dkrJq<|t|jjj|��O}|	t|jjj|��O}	q<WxB|D]:}|dkr�q�|t|jjj|��O}|
t|jjj|��O}
q�W|j||||||	|
�xr|jj�D]d}|j	s�q�xV|j
|�D]H\}
}|j||
||||||	|
�	|j|||
||||	|
�}|j
||��q�Wq�WdS)Nr4r7r6r5)r6r5)r6r5)r r<r9rr:r�Zlist_sourcesrJrrrlrQZ!build_policy_ingress_egress_rulesr)r!ryr;r{rMr4r7rFrGrHrIr:rr|r}rHr#r#r$ro^s@






z$FirewallPolicy._ingress_egress_zonescCs6|j|}d|jdkrFd|jdkrFdddg}|jjsB|jd�|Sd|jdkrpdg}|jjsl|jd�|Sd|jdkr�dgSd|jdko�d|jdk�r�ddddg}|jj�s�|jd�|Sd|jdk�r.dddg}|jj�s�|jd�x4|jdD]}|jjj|�d�rP�qW|jd �|Sd|jdk�r�d!d"g}|jj�sZ|jd#�x>|jdD]}|jjj|�d�rfP�qfW|jd$�|jd%�|Sd&g}|jj�s�|jd'�x4|jdD]}|jjj|�d�r�P�q�W|jd(�x>|jdD]}|jjj|�d�r�P�q�W|jd)�|jd*�|SdS)+z:Create a list of (table, chain) needed for policy dispatchr6r4r5r7r�rOr*rK�manglerLrPrNrMZ
interfacesN)r�rO)r*rK)rSrK)rLrK)r�rO)rLrK)r�rP)r�rN)r*rK)r*rM)rSrK)rLrK)r�rN)r*rK)rSrK)rLrK)r*rM)r�rN)r*rM)rLrK)r*rK)rSrK)r�rN)rLrK)r*rM)r*rK)rSrK)r r<r�nftables_enabledr0r:r8)r!r;rM�tcr:r#r#r$rl�sj
















z4FirewallPolicy._get_table_chains_for_policy_dispatchcCsr|j|}d|jdkr4dg}|jjs0|jd�|Sd|jdkrLdddgSd|jdkrbddgStd|�SdS)z8Create a list of (table, chain) needed for zone dispatchr5r7r�rOrLrKr6�
FORWARD_INr*rSr4�FORWARD_OUTrMzInvalid policy: %sN)r�rO)rLrK)r�rV)r*rK)rSrK)r�rW)r*rM)r r<rrTr0r)r!r;rMrUr#r#r$rm�s

z2FirewallPolicy._get_table_chains_for_zone_dispatchFcCs�|jjj|�}|jr|j}n||}d|jdkrl|dkrBd|S|dkrRd|S|jsh|dkrhd|S�nJd|jd	kr�|js�|dkr�d
|S�n"d|jdk�r�|dkr�|jr�d|Sd
|Sn0|dkr�|r�d|Sd|Sn|dk�r�d|Sn�d|jd	k�rh|dk�r*|j�r d|Sd
|Sn<|dk�rL|�rBd|Sd|Sn|dk�r�|j�s�d|SnN|j�s�|dk�r�d
|S|dk�r�|�r�d|Sd|Sn|dk�r�d|Std|||f�S)Nr5r7r�ZIN_rLZPRE_rSr*r4ZOUT_r6ZFWDI_ZFWD_ZPOST_ZFWDO_z.Can't convert policy to chain name: %s, %s, %s)rSr*)rSrL)rSrL)rSrL)rr;r.r/r<r)r!r;r|Z
policy_prefixZisSNATrM�suffixr#r#r$�policy_base_chain_name�sb













z%FirewallPolicy.policy_base_chain_name)N)N)N)N)rNNT)N)rNNT)N)rNN)N)rNN)N)rNN)N)rNN)N)rNN)N)rNN)N)NN)NN)NNrNN)NNN)NN)rNN)N)NN)N)N)N)NN)F)��__name__�
__module__�__qualname__r%r'r)r*r-r3r=r.rNrQrLrdrer�r8rrcrPr�r�r�r�rSr�r�r�r�r�r�r�rTr�r�r�r�r�r�r�r�rwr^r�r�r�r�r�r�r�rWr�r�r�r�r�r�r�r�r�rXr�r�r�r�r�r�r�r\r�r�r�r�r�r�r]r�r�r�r�r�r�r_r�r�r�r�rrrVrr�rrr�rrrUr	r�r
rr�r
rrrrrrrnrr�r#r"r�r�r�rrrsrtrurvrqrprrJrQrRrorlrmrYr#r#r#r$rs$
'	?.,#,#:
'('('
+))@@		(Pr)'rhr.Zfirewall.core.loggerrZfirewall.functionsrrrrrrr	r
rrr�r
rrrrrrrrrrZfirewall.core.fw_transactionrZfirewallrZfirewall.errorsrZfirewall.fw_typesrZfirewall.core.baser�objectrr#r#r#r$�<module>s04logger.cpython-36.pyc000064400000055135151730727350010474 0ustar003

��g>y�@s�ddddgZddlZddlZddlZddlZddlZddlZddlZddlZddl	Z
ddl
Z
Gdd�de�ZGdd�de�Z
Gd	d
�d
e
�ZGdd�de�ZGd
d�de�ZGdd�de�Ze�ZdS)�	LogTarget�FileLog�Logger�log�Nc@s2eZdZdZdd�Zddd�Zdd�Zd	d
�ZdS)
rz% Abstract class for logging targets. cCs
d|_dS)N)�fd)�self�r�/usr/lib/python3.6/logger.py�__init__(szLogTarget.__init__rcCstd��dS)Nz%LogTarget.write is an abstract method)�NotImplementedError)r�data�level�logger�is_debugrrr	�write+szLogTarget.writecCstd��dS)Nz%LogTarget.flush is an abstract method)r)rrrr	�flush.szLogTarget.flushcCstd��dS)Nz%LogTarget.close is an abstract method)r)rrrr	�close1szLogTarget.closeN)r)�__name__�
__module__�__qualname__�__doc__r
rrrrrrr	r&s

c@s.eZdZdd�Zddd�Zdd�Zdd	�Zd
S)�
_StdoutLogcCstj|�tj|_dS)N)rr
�sys�stdoutr)rrrr	r
8s
z_StdoutLog.__init__rcCs|jj|�|j�dS)N)rrr)rrr
rrrrr	r<sz_StdoutLog.writecCs|j�dS)N)r)rrrr	rAsz_StdoutLog.closecCs|jj�dS)N)rr)rrrr	rDsz_StdoutLog.flushN)r)rrrr
rrrrrrr	r7s
rc@seZdZdd�ZdS)�
_StderrLogcCstj|�tj|_dS)N)rr
r�stderrr)rrrr	r
Ks
z_StderrLog.__init__N)rrrr
rrrr	rJsrc@s.eZdZdd�Zddd�Zdd�Zdd	�Zd
S)�
_SyslogLogcCs.tj|�tjtjjtjd�tj	tj
�dS)Nr)rr
�syslogZopenlog�os�path�basenamer�argvZLOG_PIDZ
LOG_DAEMON)rrrr	r
Ss
	z_SyslogLog.__init__rcCs�d}|rtj}nF||jkr"tj}n4||jkr4tj}n"||jkrFtj}n||jkrVtj	}|j
d�rt|dt|�d�}t|�dkr�|dkr�tj|�ntj||�dS)N�
�r)rZ	LOG_DEBUG�INFO1ZLOG_INFO�WARNINGZLOG_WARNING�ERRORZLOG_ERR�FATALZLOG_CRIT�endswith�len)rrr
rrZpriorityrrr	ras"




z_SyslogLog.writecCstj�dS)N)rZcloselog)rrrr	rwsz_SyslogLog.closecCsdS)Nr)rrrr	rzsz_SyslogLog.flushN)r)rrrr
rrrrrrr	rRs
rc@s<eZdZdZddd�Zdd�Zddd	�Zd
d�Zdd
�ZdS)rz< FileLog class.
    File will be opened on the first write. �wcCstj|�||_||_dS)N)rr
�filename�mode)rr+r,rrr	r
�s
zFileLog.__init__cCsv|jr
dStjtjB}|jjd�r,|tjO}tj|j|d�|_tj	|jd�tj
|j|j�|_tj|jtjtj
�dS)N�ai�)rr�O_CREAT�O_WRONLYr,�
startswith�O_APPEND�openr+�fchmod�fdopen�fcntlZF_SETFDZ
FD_CLOEXEC)r�flagsrrr	r2�s
zFileLog.openrcCs(|js|j�|jj|�|jj�dS)N)rr2rr)rrr
rrrrr	r�sz
FileLog.writecCs|js
dS|jj�d|_dS)N)rr)rrrr	r�s
z
FileLog.closecCs|js
dS|jj�dS)N)rr)rrrr	r�sz
FileLog.flushN)r*)r)	rrrrr
r2rrrrrrr	rs

c@s�eZdZdZd[Zd\Zd]Zd^Zd_ZdZ	e
�Ze�Z
e�Zd`d	d
�Zdd�Zdadd�Zdbdd�Zdcdd�Zdddd�Zdd�Zdd�Zdd�Zdd�Zdd�Zd d!�Zed"fd#d$�Zed"fd%d&�Zed"fd'd(�Zed"fd)d*�Zed"fd+d,�Z ed"fd-d.�Z!d/d0�Z"d1d2�Z#d3d4�Z$d5d6�Z%d7d8�Z&d9d:�Z'd;d<�Z(d=d>�Z)d?d@�Z*dAdB�Z+dCdD�Z,dedEdF�Z-dGdH�Z.dfdIdJ�Z/ed"dfdKdL�Z0ed"dfdMdN�Z1ed"dfdOdP�Z2dgdQdR�Z3dSdT�Z4dUdV�Z5dWdX�Z6dhdYdZ�Z7d"S)iraL	
    Format string:

    %(class)s      Calling class the function belongs to, else empty
    %(date)s       Date using Logger.date_format, see time module
    %(domain)s     Full Domain: %(module)s.%(class)s.%(function)s
    %(file)s       Filename of the module
    %(function)s   Function name, empty in __main__
    %(label)s      Label according to log function call from Logger.label
    %(level)d      Internal logging level
    %(line)d       Line number in module
    %(module)s     Module name
    %(message)s    Log message

    Standard levels:

    FATAL                 Fatal error messages
    ERROR                 Error messages
    WARNING               Warning messages
    INFOx, x in [1..5]    Information
    DEBUGy, y in [1..10]  Debug messages
    NO_INFO               No info output
    NO_DEBUG              No debug output
    INFO_MAX              Maximum info level
    DEBUG_MAX             Maximum debug level

    x and y depend on info_max and debug_max from Logger class
    initialization. See __init__ function.

    Default logging targets:

    stdout        Logs to stdout
    stderr        Logs to stderr
    syslog        Logs to syslog

    Additional arguments for logging functions (fatal, error, warning, info
    and debug):

    nl       Disable newline at the end with nl=0, default is nl=1.
    fmt      Format string for this logging entry, overloads global format
             string. Example: fmt="%(file)s:%(line)d %(message)s"
    nofmt    Only output message with nofmt=1. The nofmt argument wins over
             the fmt argument.

    Example:

    from logger import log
    log.setInfoLogLevel(log.INFO1)
    log.setDebugLogLevel(log.DEBUG1)
    for i in range(1, log.INFO_MAX+1):
        log.setInfoLogLabel(i, "INFO%d: " % i)
    log.setFormat("%(date)s %(module)s:%(line)d [%(domain)s] %(label)s: "
                  "%(level)d %(message)s")
    log.setDateFormat("%Y-%m-%d %H:%M:%S")

    fl = FileLog("/tmp/log", "a")
    log.addInfoLogging("*", fl)
    log.addDebugLogging("*", fl)
    log.addInfoLogging("*", log.syslog, fmt="%(label)s%(message)s")

    log.debug3("debug3")
    log.debug2("debug2")
    log.debug1("debug1")
    log.info2("info2")
    log.info1("info1")
    log.warning("warning\n", nl=0)
    log.error("error\n", nl=0)
    log.fatal("fatal")
    log.info(log.INFO1, "nofmt info", nofmt=1)

    ����r#r�
cCs�i|_i|_d|_d|_i|_i|_i|_i|_i|_i|_	|dkrPt
d|��|dkrdt
d|��|j|_||_
d|_||_|j|jd�|j|jd�|j|jd�|j|jd�xNtd|j
d�D]:}t|d	||�|j|d�t|d
|dd�||��q�WxTtd|jd�D]@}t|d
||�|j|d|�t|d|dd�||���qW|j|j�|j|j�|jd�|jd�|jd|j|j|j|jg�|jd|jdd�t|j|j
d�D��|jd|jdd�td|jd�D��dS)z Logger class initialization �r#zLogger: info_max %d is too lowrzLogger: debug_max %d is too lowz
FATAL ERROR: zERROR: z	WARNING: zINFO%dzinfo%dcs��fdd�S)Ncs�j�|f|�|�S)N)�info)�message�args�kwargs)r�xrr	�<lambda> sz3Logger.__init__.<locals>.<lambda>.<locals>.<lambda>r)rrAr)rrAr	rBsz!Logger.__init__.<locals>.<lambda>zDEBUG%dz	DEBUG%d: zdebug%dcs��fdd�S)Ncs�j�|f|�|�S)N)�debug)r>r?r@)rrArr	rB)sz3Logger.__init__.<locals>.<lambda>.<locals>.<lambda>r)rrAr)rrAr	rB(sz%(label)s%(message)sz%d %b %Y %H:%M:%S�*cSsg|]}|�qSrr)�.0�irrr	�
<listcomp>4sz#Logger.__init__.<locals>.<listcomp>cSsg|]}|�qSrr)rErFrrr	rG6sN) �_level�_debug_level�_format�_date_format�_label�_debug_label�_logging�_debug_logging�_domains�_debug_domains�
ValueErrorr%�NO_INFO�INFO_MAX�NO_DEBUG�	DEBUG_MAX�setInfoLogLabelr'�	TRACEBACKr&�range�setattr�setDebugLogLabel�setInfoLogLevelr$�setDebugLogLevel�	setFormat�
setDateFormat�setInfoLoggingrr�setDebugLogging)rZinfo_maxZ	debug_maxrHrrr	r
�sX






zLogger.__init__cCsNxHt|j|jd�D]2}||jkr$qx |j|D]\}}}|j�q0WqWdS)z Close all logging targets r#N)rYr'rVrNr)rr
�dummy�targetrrr	r8s

zLogger.closerDcCs$|j|�||jkr|j|S|jS)z Get info log level. )�_checkDomainrH�NOTHING)r�domainrrr	�getInfoLogLevel@s


zLogger.getInfoLogLevelcCs8|j|�||jkr|j}||jkr*|j}||j|<dS)z% Set log level [NOTHING .. INFO_MAX] N)rdrerTrH)rr
rfrrr	r\Gs


zLogger.setInfoLogLevelcCs*|j|�||jkr$|j||jS|jS)z Get debug log level. )rdrIrU)rrfrrr	�getDebugLogLevelPs

zLogger.getDebugLogLevelcCs:|j|�|dkrd}||jkr&|j}||j|j|<dS)z- Set debug log level [NO_DEBUG .. DEBUG_MAX] rN)rdrVrUrI)rr
rfrrr	r]Ws

zLogger.setDebugLogLevelcCs|jS)N)rJ)rrrr	�	getFormat`szLogger.getFormatcCs
||_dS)N)rJ)rrJrrr	r^cszLogger.setFormatcCs|jS)N)rK)rrrr	�
getDateFormatfszLogger.getDateFormatcCs
||_dS)N)rK)rrJrrr	r_iszLogger.setDateFormatcCs:|j|�}x*|D]"}|j||j|jd�||j|<qWdS)zU Set log label for level. Level can be a single level or an array
        of levels. )�	min_level�	max_levelN)�
_getLevels�_checkLogLevelr'rTrL)rr
�label�levelsrrr	rWls




zLogger.setInfoLogLabelcCs>|j|dd�}x*|D]"}|j||j|jd�||j|<qWdS)zU Set log label for level. Level can be a single level or an array
        of levels. r#)r)rkrlN)rmrnr$rVrM)rr
rorprrr	r[us



zLogger.setDebugLogLabelNcCs|j||||dd�dS)z� Set info log target for domain and level. Level can be a single
        level or an array of levels. Use level ALL to set for all levels.
        If no format is specified, the default format will be used. r)rN)�_setLogging)rrfrcr
�fmtrrr	r`~szLogger.setInfoLoggingcCs|j||||dd�dS)z� Set debug log target for domain and level. Level can be a single
        level or an array of levels. Use level ALL to set for all levels.
        If no format is specified, the default format will be used. r#)rN)rq)rrfrcr
rrrrr	ra�szLogger.setDebugLoggingcCs|j||||dd�dS)z� Add info log target for domain and level. Level can be a single
        level or an array of levels. Use level ALL to set for all levels.
        If no format is specified, the default format will be used. r)rN)�_addLogging)rrfrcr
rrrrr	�addInfoLogging�szLogger.addInfoLoggingcCs|j||||dd�dS)z� Add debg log target for domain and level. Level can be a single
        level or an array of levels. Use level ALL to set for all levels.
        If no format is specified, the default format will be used. r#)rN)rs)rrfrcr
rrrrr	�addDebugLogging�szLogger.addDebugLoggingcCs|j||||dd�dS)z� Delete info log target for domain and level. Level can be a single
        level or an array of levels. Use level ALL to set for all levels.
        If no format is specified, the default format will be used. r)rN)�_delLogging)rrfrcr
rrrrr	�delInfoLogging�szLogger.delInfoLoggingcCs|j||||dd�dS)z� Delete debug log target for domain and level. Level can be a single
        level or an array of levels. Use level ALL to set for all levels.
        If no format is specified, the default format will be used. r#)rN)rv)rrfrcr
rrrrr	�delDebugLogging�szLogger.delDebugLoggingcCs|j|dd�S)zN Is there currently any info logging for this log level (and
        domain)? r)r)�_isLoggingHere)rr
rrr	�isInfoLoggingHere�szLogger.isInfoLoggingHerecCs|j|dd�S)zO Is there currently any debug logging for this log level (and
        domain)? r#)r)ry)rr
rrr	�isDebugLoggingHere�szLogger.isDebugLoggingHerecOs,|j|�d|d<|j|j|f|�|�dS)z Fatal error log. rrN)�_checkKWargs�_logr')rrJr?r@rrr	�fatal�s
zLogger.fatalcOs,|j|�d|d<|j|j|f|�|�dS)z Error log. rrN)r|r}r&)rrJr?r@rrr	�error�s
zLogger.errorcOs,|j|�d|d<|j|j|f|�|�dS)z Warning log. rrN)r|r}r%)rrJr?r@rrr	�warning�s
zLogger.warningcOsB|j|d|jd�|j|�d|d<|j||j|f|�|�dS)z� Information log using info level [1..info_max].
        There are additional infox functions according to info_max from
        __init__r#)rkrlrrN)rnrTr|r}rS)rr
rJr?r@rrr	r=�s
zLogger.infocOs<|j|d|jd�|j|�d|d<|j||f|�|�dS)z� Debug log using debug level [1..debug_max].
        There are additional debugx functions according to debug_max
        from __init__r#)rkrlrN)rnrVr|r})rr
rJr?r@rrr	rC�s
zLogger.debugcCs|j|jtj�gid�dS)N)r?r@)r}rX�	traceback�
format_exc)rrrr	�	exception�szLogger.exceptioncCs&||ks||kr"td|||f��dS)Nz*Level %d out of range, should be [%d..%d].)rR)rr
rkrlrrr	rn�szLogger._checkLogLevelcCs2|sdSx$|j�D]}|dkrtd|��qWdS)N�nlrr�nofmtz0Key '%s' is not allowed as argument for logging.)r�rrr�)�keysrR)rr@�keyrrr	r|�s
zLogger._checkKWargscCs|s|dkrtd|��dS)Nr<zDomain '%s' is not valid.)rR)rrfrrr	rd�szLogger._checkDomaincCs�||jkrft|t�st|t�r$|}n|g}xp|D]0}|rL|j|d|jd�q0|j||j|jd�q0Wn6|r�dd�t|j	|j�D�}ndd�t|j|j�D�}|S)z Generate log level array. r#)rkrlcSsg|]}|�qSrr)rErFrrr	rG�sz%Logger._getLevels.<locals>.<listcomp>cSsg|]}|�qSrr)rErFrrr	rG�s)
�ALL�
isinstance�list�tuplernrVr'rTrYZDEBUG1)rr
rrprrr	rm�s


zLogger._getLevelscCsNt|t�st|t�r|}n|g}x(|D] }t|jt�s&td|jj��q&W|S)z Generate target array. z '%s' is no valid logging target.)r�r�r��
issubclass�	__class__rrRr)rrc�targetsZ_targetrrr	�_getTargets�s
zLogger._getTargetscCs�|r |j}|j}d|jdf}n|j}|j}|j|jdf}t|�dkrP|j�xVt	|d|d�D]@}||krrqdx0||D]$\}}}||kr||j
|g�j|�q|WqdWdS)z% Generate dict with domain by level. r#rN)rQrOrVrPrNr'rTr)�clearrY�
setdefault�append)rrrPrNZ_ranger
rfrbrrr	�_genDomainsszLogger._genDomainsc	Csl|j|�|j||�}|j|�}|r,|j}n|j}x*|D]"}x|D]}|||fg||<qBWq8W|j|�dS)N)rdrmr�rOrNr�)	rrfrcr
rrrrpr�rNrrr	rqs



zLogger._setLoggingc	Cst|j|�|j||�}|j|�}|r,|j}n|j}x2|D]*}x$|D]}|j|g�j|||f�qBWq8W|j|�dS)N)rdrmr�rOrNr�r�r�)	rrfrcr
rrrrpr�rNrrr	rs-s



 zLogger._addLoggingc
Cs�|j|�|j||�}|j|�}|r,|j}n|j}x�|D]|}	xv|D]n}|	|krPqB|||f||	kr�||	j|||f�t||	�dkr�||	=qB||jkrBtd|	||j	j
|f��qBWq8W|j|�dS)NrzDNo mathing logging for level %d, domain %s, target %s and format %s.)rdrmr�rOrN�remover)r�rRr�rr�)
rrfrcr
rrrrpr�rNrHrrr	rv<s&




zLogger._delLoggingcCst|j||�}|sdS|dd}|r,|j}n|j}x<||D]0\}}}|dksh|j|�shtj|d|�r<dSq<WdS)NFrf�.rDT)�_genDictrOrNr0�fnmatch�fnmatchcase)rr
r�_dict�point_domainrNrfrbrrr	ryUs
zLogger._isLoggingHerec	Cs�|jjdkrD|jjd}||jkrD|j|}|j|j|j�}|rD|Stj|j�}|j}|j|j	kr�t
|j	|jd�r�|j	|jj|kr�dSxT|j	j�D]F\}}t
|tj�r�t
||j�r�t||j�}t
|tj�r�|j|kr�|Sq�WdS)z7 Function to get calling class. Returns class or None. rZ	func_codeN)�f_code�co_argcount�co_varnames�f_locals�
_getClass2r��inspectZ	getmodule�co_name�__dict__�hasattr�__code__�itemsr��typesZ	ClassType�getattr�FunctionType)	r�frameZselfname�_self�obj�module�coderb�valuerrr	�	_getClassis*


zLogger._getClasscCsVx,|jj�D]}t|tj�r|j|kr|SqWx"|jD]}|j||�}|r6|Sq6WdS)z@ Internal function to get calling class. Returns class or None. N)r��valuesr�r�r�r��	__bases__r�)rr�r�r��baseZ_objrrr	r��s
zLogger._getClass2cOsld}d|kr|d}d}d|kr(|d}d}d|kr<|d}|j||�}|sPdSt|�dkrj|||d<n&t|�dkr�||d|d<n||d<|dd}	|r�|j}
n|j}
g}x�|
|D]�\}}
}|
|kr�q�|d	ks�|	j|d�s�tj|d|�r�|�s|j}d
|k�r|d
}|�r0|
j|d|||�n|
j|||||�|�rZ|
jd|||�|j	|
�q�WdS)Nrrr#r�r�r>rfr�rDrrr")
r�r)rOrNr0r�r�rJrr�)rr
rJr?r@rr�r�r�r�rNZused_targetsrfrcrrr	r}�sL
zLogger._logcCsg}d}|r |j}|j}|j}n|j}|j}|j}xN|D]F}|dkrh|||kr~d}t|�dkrdg}Pq8|||kr8|j|�q8W|r�t|�dkr�dS||kr�dStj	�}	x$|	r�|	j
r�|	jd|jkr�|	j
}	q�W|	s�t
d��|	jd}
|
d	}x|D]}|j|�r�g}Pq�W|	j}t|
�}
xx||D]l}|jd�}|dk�rD�q&n|dk�r\|d|�}n|}|
t|�k�r�|
j|��s�dSn|j|
��s&dS�q&Wd
}||k�r�||}|j|	j|
d
|jd
||tj|jtj��d�	}|dd
k�r�d
|d<d}x&||D]}|dk�r�q�d}P�q�W|jjd�dk�sR|jjd�dk�sR|�sRt|�dk�rl|j|	�}|�rl|j|d<d
|d|d<|dd
k�r�|dd	|d7<|dd
k�r�|dd	|d7<t|�dk�r�|S|dd	}x0|D](}|j|��stj|d|��r�|S�q�WdS)z Internal function. FrDTrr#Nrz Frame information not available.r�r<)	�file�liner��class�functionrfror
Zdater��?z	%(domain)z%(class)r�r�rf)rIrQrMrHrPrLr)r�r�Zcurrentframe�f_back�	f_globalsrrRr0r��find�co_filename�f_linenor��timeZstrftimerKZ	localtimerJr�rr�r�)rr
rZ
check_domainsZsimple_matchr�rPrLrf�fZmodule_nameZpoint_module�co�_lenrF�dZ	level_strZ
domain_neededr�r�rrr	r��s�














zLogger._genDict���������������)r7r;)rD)rD)rD)rD)r)r)r)r)8rrrrr�rer'rXr&r%rrrrrrr
rrgr\rhr]rir^rjr_rWr[r`rartrurwrxrzr{r~rr�r=rCr�rnr|rdrmr�r�rqrsrvryr�r�r}r�rrrr	r�sdG
;

	

					


 4)�__all__rr�r�r�r�rr�r5Zos.pathr�objectrrrrrrrrrrr	�<module>s.-(*4fw_service.cpython-36.opt-1.pyc000064400000003201151730727350012273 0ustar003

��gg�@s2dgZddlmZddlmZGdd�de�ZdS)�FirewallService�)�errors)�
FirewallErrorc@sLeZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dS)rcCs||_i|_dS)N)Z_fw�	_services)�self�fw�r� /usr/lib/python3.6/fw_service.py�__init__szFirewallService.__init__cCsd|j|jfS)Nz%s(%r))�	__class__r)rrrr	�__repr__ szFirewallService.__repr__cCs|jj�dS)N)r�clear)rrrr	�cleanup#szFirewallService.cleanupcCst|jj��S)N)�sortedr�keys)rrrr	�get_services(szFirewallService.get_servicescCs||jkrttj|��dS)N)rrrZINVALID_SERVICE)r�servicerrr	�
check_service+s
zFirewallService.check_servicecCs|j|�|j|S)N)rr)rrrrr	�get_service/s
zFirewallService.get_servicecCs||j|j<dS)N)r�name)r�objrrr	�add_service3szFirewallService.add_servicecCs|j|�|j|=dS)N)rr)rrrrr	�remove_service6s
zFirewallService.remove_serviceN)�__name__�
__module__�__qualname__r
rrrrrrrrrrr	rsN)�__all__ZfirewallrZfirewall.errorsr�objectrrrrr	�<module>snftables.cpython-36.pyc000064400000130376151730727350011014 0ustar003

��g��%@slddlmZddlZddlZddlZddlmZddlmZm	Z	m
Z
mZmZddl
mZmZmZmZmZmZmZddlmZmZmZmZmZmZmZddlmZdZed	d
Z dZ!dZ"id
ddCe"fiddDe"fdde"fd�dde"fdde"fdde"fdde"fd�d�Z#dEdd�Z$e$ddd�e$dd�e$dd�e$dd�e$ddd�e$ddd �e$ddd�e$dd!d"�e$ddd#�e$ddd"�e$dd$d"�e$ddd%�e$dd!d�e$ddd&�e$ddd�e$dd$�e$ddd'�e$ddd(�e$ddd)�e$dd!�e$dd$d"�e$dd*�e$dd+�e$dd,�e$ddd-�e$dd.�e$dd/�e$dd0�e$dd!d'�e$ddd1�e$dd!d)�e$ddd2�e$dd.d"�e$dd.d�d3�"e$d4dd'�e$d4d$d�e$d4dd)�e$d4dd"�e$d4d�e$d4d�e$d4d�e$d4dd-�e$d4d5�e$d4d6�e$d4d7�e$d4d8�e$d4d9�e$d4d:�e$d4dd�e$d4d;�e$d4d$�e$d4dd�e$d4d<�e$d4dd&�e$d4d=�e$d4d>�e$d4d.�e$d4d.d"�e$d4d.d�e$d4d$d"�e$d4d$d)�d?�d@�Z%GdAdB�dBe&�Z'dS)F�)�absolute_importN)�log)�	check_mac�getPortRange�normalizeIP6�check_single_address�
check_address)�
FirewallError�
UNKNOWN_ERROR�INVALID_RULE�INVALID_ICMPTYPE�INVALID_TYPE�
INVALID_ENTRY�INVALID_PORT)�Rich_Accept�Rich_Reject�	Rich_Drop�	Rich_Mark�Rich_Masquerade�Rich_ForwardPort�Rich_IcmpBlock)�NftablesZ	firewalld�_Zpolicy_dropZpolicy_�
�
PREROUTING�
prerouting��dZpostrouting)r�POSTROUTING�input�forward�output)r�INPUT�FORWARD�OUTPUT)�raw�mangle�nat�filtercCsHdd|dd�id|d�ig}|dk	rD|jdd|dd�id|d�i�|S)N�match�payload�type)�protocol�fieldz==)�left�op�right�code)�append)r,r+r1�	fragments�r4�/usr/lib/python3.6/nftables.py�_icmp_types_fragmentsSsr6�icmpzdestination-unreachable�
z
echo-replyzecho-request���redirect��zparameter-problem�����zrouter-advertisementzrouter-solicitationz
source-quench�z
time-exceededztimestamp-replyztimestamp-request��)"zcommunication-prohibitedzdestination-unreachablez
echo-replyzecho-requestzfragmentation-neededzhost-precedence-violationzhost-prohibitedz
host-redirectzhost-unknownzhost-unreachablez
ip-header-badznetwork-prohibitedznetwork-redirectznetwork-unknownznetwork-unreachablezparameter-problemzport-unreachablezprecedence-cutoffzprotocol-unreachabler;zrequired-option-missingzrouter-advertisementzrouter-solicitationz
source-quenchzsource-route-failedz
time-exceededztimestamp-replyztimestamp-requestztos-host-redirectztos-host-unreachableztos-network-redirectztos-network-unreachablezttl-zero-during-reassemblyzttl-zero-during-transit�icmpv6zmld-listener-donezmld-listener-queryzmld-listener-reportzmld2-listener-reportznd-neighbor-advertznd-neighbor-solicitzpacket-too-bigznd-redirectznd-router-advertznd-router-solicit)zaddress-unreachablez
bad-headerzbeyond-scopezcommunication-prohibitedzdestination-unreachablez
echo-replyzecho-requestz
failed-policyzmld-listener-donezmld-listener-queryzmld-listener-reportzmld2-listener-reportzneighbour-advertisementzneighbour-solicitationzno-routezpacket-too-bigzparameter-problemzport-unreachabler;zreject-routezrouter-advertisementzrouter-solicitationz
time-exceededzttl-zero-during-reassemblyzttl-zero-during-transitzunknown-header-typezunknown-option)�ipv4�ipv6c@s`eZdZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Z	dd
�Z
dd�Zd�dd�Zdd�Z
dd�Zdd�Zdd�Zd�dd�Zdd�Zd�d d!�Zd"d#�Zd�d%d&�Zd�d(d)�Zd�d*d+�Zd�d,d-�Zd.d/�Zd0d1�Zd2d3�Zd4d5�Zd6d7�Zd8d9�Zd:d;�Zd<d=�Z d>d?�Z!d@dA�Z"dBdC�Z#dDdE�Z$dFdG�Z%dHdI�Z&d�dJdK�Z'dLdM�Z(dNdO�Z)dPdQ�Z*dRdS�Z+d�dTdU�Z,d�dVdW�Z-d�dXdY�Z.dZd[�Z/d�d\d]�Z0d�d^d_�Z1d�d`da�Z2d�dbdc�Z3d�ddde�Z4dfdg�Z5d�dhdi�Z6djdk�Z7d�dldm�Z8dndo�Z9dpdq�Z:drds�Z;dtdu�Z<d�dvdw�Z=d�dxdy�Z>dzd{�Z?d�d|d}�Z@d~d�ZAd�d��ZBd�d��ZCd�d��ZDd�d��ZEd�d��ZFd�d��ZGd�d�d��ZHdS)��nftablesTcCsb||_d|_g|_i|_i|_i|_i|_i|_gggd�|_t	�|_
|j
jd�|j
jd�dS)NT)�inet�ip�ip6)
�_fwZrestore_command_existsZavailable_tables�rule_to_handle�rule_ref_count�rich_rule_priority_counts�policy_priority_counts�zone_source_index_cache�created_tablesrrIZset_echo_outputZset_handle_output)�self�fwr4r4r5�__init__�sznftables.__init__cCs�xdD]}||krPqWd||dkr`||ddd||dddf}||dd=n(d||dkr�d}||dd=ndS||dd	}|r�|dkr�||kr�|||kr�||j|�n�|dk�r�||kr�g||<|�r(|||k�r||j|�||jd
d�d�||j|�}n|jj�r8d
}nt||�}||}||=|d
k�rf||d<n |d8}||d<||ddd<dS)N�add�insert�deletez%%ZONE_SOURCE%%�rule�zone�addressz%%ZONE_INTERFACE%%�familycSs|dS)Nrr4)�xr4r4r5�<lambda>�sz3nftables._run_replace_zone_source.<locals>.<lambda>)�keyrr<�index)rWrXrY)�remover2�sortrarM�_allow_zone_drifting�len)rTrZrR�verbZzone_sourcer]ra�
_verb_snippetr4r4r5�_run_replace_zone_source�sD




z!nftables._run_replace_zone_sourcecCsBd|krdtj|d�iSd|kr4dtj|d�iSttd��dS)NrXrYrWzFailed to reverse rule)�copy�deepcopyr	r
)rT�dictr4r4r5�reverse_rule�s
znftables.reverse_rulec
Cs�xdD]}||krPqW|||dk�r�||d|}||d|=t|�tkr^ttd��||dd||ddf}|dkr�||ks�|||ks�|||dkr�ttd	��|||d
8<n�||kr�i||<|||kr�d|||<d}xVt||j��D]B}||k�r"|dk�r"P||||7}||k�r|dk�rP�qW|||d
7<||}	||=|dk�r�|	|d<n |d
8}|	|d<||ddd<dS)
NrWrXrYrZz%priority must be followed by a numberr]�chainrz*nonexistent or underflow of priority countr<ra)rWrXrY)r+�intr	rr
�sorted�keys)
rTrZZpriority_counts�tokenrf�priorityrmra�prgr4r4r5�_set_rule_replace_priority�sD

 


z#nftables._set_rule_replace_prioritycCsfx`d
D]X}||krd||krtj||d�}xdD]}||kr6||=q6Wtj|dd	�}|SqWdS)NrWrXrYrZra�handle�positionT)Z	sort_keys)rWrXrY)rarurv)rirj�json�dumps)rTrZrf�rule_keyZnon_keyr4r4r5�
_get_rule_keys


znftables._get_rule_keycCsLdddddg}dddg}g}g}tj|j�}tj|j�}tj|j�}	|jj�}
�x�|D�]�}t|�tkrvtt	d|��x|D]}||kr|Pq|W||kr�tt
d|��|j|�}
|
|
k�rDtj
d|j|
|
|
�|dkr�|
|
d	7<qVnX|
|
d	k�r|
|
d	8<qVn6|
|
d	k�r,|
|
d	8<ntt	d
|
|
|
f��n|
�r\|dk�r\d	|
|
<|j|�tj|�}|
�rttd||dd��||dd<|j||d
�|j||d�|j||	�|dk�rdd|ddd|ddd|ddd|j|
d�ii}|j|�qVWdddd	iig|i}tj�dk�rVtjd|jtj|��|jj|�\}}}|dk�r�tdd|tj|�f��||_||_|	|_|
|_d}x�|D]�}|d	7}|j|�}
|
�s̐q�d|k�r�|j|
=|j|
=�q�x"|D]}||d|k�r�P�q�W||d|k�r$�q�|d||dd|j|
<�q�WdS)NrWrXrY�flush�replacez#rule must be a dictionary, rule: %szno valid verb found, rule: %sz%s: prev rule ref cnt %d, %sr<z)rule ref count bug: rule_key '%s', cnt %drZ�exprz%%RICH_RULE_PRIORITY%%z%%POLICY_PRIORITY%%r]�tablerm)r]r~rmrurIZmetainfoZjson_schema_versionr@z.%s: calling python-nftables with JSON blob: %srz'%s' failed: %s
JSON blob:
%szpython-nftablesru)rirjrPrQrRrOr+rkr	r
rrzrZdebug2�	__class__r2�listr(rtrhrNZgetDebugLogLevelZdebug3rwrxrIZjson_cmd�
ValueError)rT�rules�
log_deniedZ_valid_verbsZ_valid_add_verbsZ_deduplicated_rulesZ_executed_rulesrPrQrRrOrZrfryZ_ruleZ	json_blobZrcr!�errorrar4r4r5�	set_rules+s�







&






znftables.set_rulescCs|j|g|�dS)N�)r�)rTrZr�r4r4r5�set_rule�sznftables.set_ruleNcCs|r
|gStj�S)N)�IPTABLES_TO_NFT_HOOKrp)rTr~r4r4r5�get_available_tables�sznftables.get_available_tablescCsFg}x<dD]4}|jdd||d�ii�|jdd||d�ii�q
W|S)	NrJrKrLrWr~)r]�namerY)rJrKrL)r2)rTr~r�r]r4r4r5�_build_delete_table_rules�s


z"nftables._build_delete_table_rulescCs�i}i}xB|jd�D]4}|j|�}||jkr|j|||<|j|||<qW||_||_i|_i|_i|_x*dD]"}t|j|krp|j|j	t�qpW|j
t�S)NTrJrKrL)rJrKrL)� _build_set_policy_rules_ct_rulesrzrNrOrPrQrR�
TABLE_NAMErSrbr�)rTZsaved_rule_to_handleZsaved_rule_ref_countrZ�
policy_keyr]r4r4r5�build_flush_rules�s 


znftables.build_flush_rulesc
Cslddd�|}g}xTdD]L}|j|ddtd	d
|fddd
diiddddgid�iddigd�ii�qW|S)NrWrY)TFrr r!rZrJz%s_%sr(r)�ctr`�state�in�set�established�related)r.r/r0�accept)r]r~rmr})rr r!)r2�TABLE_NAME_POLICY)rT�enable�add_delr��hookr4r4r5r��s


z)nftables._build_set_policy_rules_ct_rulescCstg}|dkrt|jdddtd�ii�|jdjt�x>dD]6}|jdddtd	d
|fd|dtd
dd�ii�q:W|dk�r�|jdddtd�ii�|jdjt�x>dD]6}|jdddtd	d|fd|dtd
dd�ii�q�W||jd�7}nz|dk�rfx4|jd�D]&}|j|�}||jk�r|j|��qW||jt�7}t|jdk�rp|jdjt�n
t	t
d�|S)NZPANICrWr~rJ)r]r�rr!rmz%s_%sr%r(i,r<�drop)r]r~r�r+r��prio�policy�DROPrr rT�ACCEPTFznot implemented)rr!i���)rr r!)r2r�rS�NFT_HOOK_OFFSETr�rzrNr�rbr	r
)rTr�r�r�rZr�r4r4r5�build_set_policy_rules�sH













znftables.build_set_policy_rulescCs<t�}x,|r|gntj�D]}|jt|j��qWt|�S)N)r��ICMP_TYPES_FRAGMENTSrp�updater�)rT�ipvZ	supportedZ_ipvr4r4r5�supported_icmp_types�sznftables.supported_icmp_typescCs>g}x4dD],}|jdd|td�ii�|j|jt�q
W|S)NrJrKrLrWr~)r]r�)rJrKrL)r2r�rS)rTZdefault_tablesr]r4r4r5�build_default_tabless

znftables.build_default_tables�offcCs�g}x�tdj�D]�}|jdddtd|ddtd|dtd|d	d
�ii�xz|jjrlddd
dgndd
dgD]X}|jdddtd||fd�ii�|jdddtd|ddd||fiigd�ii�qvWqWx�d?D]�}x�tdj�D]�}|jdd|td|ddtd|dtd|d	d
�ii�x~|jj�rJddd
dgndd
dgD]Z}|jdd|td||fd�ii�|jdd|td|ddd||fiigd�ii��qTWq�Wq�WxVtdj�D]F}|jdddtd|ddtd|dtd|d	d
�ii��q�W|jdddtddddddiid d!d"d#gid$�id%digd�ii�|jdddtdddddd&iid d'd$�id%digd�ii�|jdddtdddd(dd)iid*d+d$�id%digd�ii�x~|jj�r�ddd
dgndd
dgD]Z}|jdddtd,d|fd�ii�|jdddtddddd,d|fiigd�ii��q�W|d-k�r�|jdddtddddddiid d!d.gid$�i|j|�d/d0d1iigd�ii�|jdddtddddddiid d!d.gid$�id2digd�ii�|d-k�r$|jdddtdd|j|�d/d0d3iigd�ii�|jdddtddd4d5d6d7�igd�ii�|jdddtdd8ddddiid d!d"d#gid$�id%digd�ii�|jdddtdd8dddd&iid d'd$�id%digd�ii�|jdddtdd8dd(dd)iid*d+d$�id%digd�ii�xbd@D]Z}|jdddtd,d8|fd�ii�|jdddtdd8ddd,d8|fiigd�ii��qWx�dAD]�}xz|jj�r�dd
gnd
gD]^}|jdddtd;d8||fd�ii�|jdddtdd8ddd;d8||fiigd�ii��q�W�qvWxbdBD]Z}|jdddtd,d8|fd�ii�|jdddtdd8ddd,d8|fiigd�ii��qW|d-k�r�|jdddtdd8ddddiid d!d.gid$�i|j|�d/d0d1iigd�ii�|jdddtdd8ddddiid d!d.gid$�id2digd�ii�|d-k�r6|jdddtdd8|j|�d/d0d3iigd�ii�|jdddtdd8d4d5d6d7�igd�ii�|jdddtdd<ddddiid d!d"d#gid$�id%digd�ii�|jdddtd=dd(dd>iid*d+d$�id%digd�ii�xbdCD]Z}|jdddtd,d<|fd�ii�|jdddtdd<ddd,d<|fiigd�ii��q�WxbdDD]Z}|jdddtd,d<|fd�ii�|jdddtdd<ddd,d<|fiigd�ii��qHW|S)ENr&rWrmrJz	mangle_%sr(z%srr<)r]r~r�r+r�r��POLICIES_preZZONES_SOURCEZZONES�
POLICIES_postzmangle_%s_%s)r]r~r�rZ�jump�target)r]r~rmr}rKrLr'znat_%sz	nat_%s_%sz	filter_%sr"r)r�r`r�r�r�r�r�)r.r/r0r�Zstatus�dnat�meta�iifnamez==�lozfilter_%s_%sr�Zinvalidr�prefixzSTATE_INVALID_DROP: r�zFINAL_REJECT: �reject�icmpxzadmin-prohibited)r+r}r#�IN�OUTzfilter_%s_%s_%sr$�
filter_OUTPUT�oifname)rKrL)r�)r�r�)r�)r�)r�)r�rpr2r�rMrd�_pkttype_match_fragment)rTr�Z
default_rulesrmZdispatch_suffixr]�	directionr4r4r5�build_default_ruless�
$

(

&

.
 


&

&











&


.


&










&


&znftables.build_default_rulescCs4|dkrdddgS|dkr dgS|dkr0ddgSgS)	Nr(r"�
FORWARD_IN�FORWARD_OUTr&rr'rr4)rTr~r4r4r5�get_zone_table_chains�s
znftables.get_zone_table_chainsrJc
s��dkr\�dkr\g}
|
j�j�|��||||dd�	�|
j�j�|��||||dd�	�|
S�jjj|���jdkrxdnd��dkr��d	kr�d
nd}�jjj|�t|��g}g}
|r�|jdd
ddiiddt	|�id�i�|�r|
jdd
ddiiddt	|�id�i�ddd�}|�rlxT|D]L}�dk�rT�jj
j|�}||k�rT�||k�rT�q|j�jd|���qW|�r�xT|D]L}�dk�r��jj
j|�}||k�r��||k�r��qx|
j�jd|���qxW��������fdd�}g}
|�rHx�|D]P}|
�rxB|
D]}|
j|||���qWn"�dk�r0|�r0n|
j||d���q�Wn\�dk�rZ|�rZnJ|
�r�xB|
D]}|
j|d|���qfWn"�dk�r�|�r�n|
j|dd��|
S)Nr'rJrK)r]rLr�pre�postrTFr)r�r`r�z==r�)r.r/r0r�)rGrH�saddr�daddrcs�g}|r|j|�|r |j|�|jddd��fii��td���f|d�}|j�j����rrdd|iiSdd|iiSdS)	Nr�r�z%s_%sz%s_%s_POLICIES_%s)r]r~rmr}rWrZrY)r2r�r��_policy_priority_fragment)�ingress_fragment�egress_fragment�expr_fragmentsrZ)�_policyrm�chain_suffixr�r]�p_objrTr~r4r5�_generate_policy_dispatch_rules

zRnftables.build_policy_ingress_egress_rules.<locals>._generate_policy_dispatch_rule)
�extend�!build_policy_ingress_egress_rulesrMr�Z
get_policyrr�policy_base_chain_name�POLICY_CHAIN_PREFIXr2r�r[Zcheck_source�_rule_addr_fragment)rTr�r�r~rmZingress_interfacesZegress_interfacesZingress_sourcesZegress_sourcesr]r��isSNATZingress_fragmentsZegress_fragmentsZ
ipv_to_family�srcr��dstr�r�r�r4)r�rmr�r�r]r�rTr~r5r��sv









z*nftables.build_policy_ingress_egress_rulesFc	
Cs�|dkrT|dkrTg}	|	j|j|||||||d��|	j|j|||||||d��|	S|dkrh|dkrhdnd}
|jjj||t|
d�}d	d
d	d	d
d
d�|}|t|�dd
kr�|dt|�d�d}d}
|dkr�|
dd||fiig}n,ddd|iid|d�i|
dd||fiig}|�rL|�rLd}|td||f|d�}|j|j	��nP|�rnd}|td||f|d�}n.d}|td||f|d�}|�s�|j|j	��|d|iigS)Nr'rJrKrLrTF)r�r�r�)rrr"r�r�r$r<�+�*�gotor�z%s_%sr)r�r`z==)r.r/r0rXz%s_%s_ZONES)r]r~rmr}rWrYrZ)
r��!build_zone_source_interface_rulesrMr�r�r�rer�r��_zone_interface_fragment)rTr�r[r��	interfacer~rmr2r]r�r�r��opt�actionr�rfrZr4r4r5r�Qs\



z*nftables.build_zone_source_interface_rulesc	Csn|dkr�|dkr�g}|jd�r6|j|td�d��}	nd}	td|�sTt|�sT|	dkrp|j|j||||||d��td|�s�t|�s�|	dkr�|j|j||||||d��|S|dkr�|dkr�d	nd
}
|jjj	||t
|
d�}dd
d�|}ddddddd�|}
|jj�rd||f}nd||f}d}|t||j
|
|�|dd||fiigd�}|j|j||��|d|iigS)Nr'rJzipset:rGrKrHrLrTF)r�rXrY)TFr�r�)rrr"r�r�r$z%s_%s_ZONES_SOURCEz%s_%s_ZONESr�r�z%s_%s)r]r~rmr}rZ)�
startswith�_set_get_familyrerrr��build_zone_source_address_rulesrMr�r�r�rdr�r�r��_zone_source_fragment)rTr�r[r�r\r~rmr]r�Zipset_familyr�r�r�r�Zzone_dispatch_chainr�rZr4r4r5r��sB


z(nftables.build_zone_source_address_rulesc
Cs|dkrH|dkrHg}|j|j||||d��|j|j||||d��|Sddd�|}|dkrj|dkrjd	nd
}|jjj||t|d�}	g}|j|d|td
||	fd�ii�x0d!D](}
|j|d|td||	|
fd�ii�q�WxDd"D]<}
|j|d|td
||	fddd||	|
fiigd�ii�q�W|jjj|j	}|jj
�dk�r�|dk�r�|d#k�r�|}|dk�rhd}|j|d|td
||	f|j|jj
��ddd|	|fiigd�ii�|dk�r|d$k�r|d%k�r�|j�}
n|j
�di}
|j|d|td
||	f|
gd�ii�|�s|j�|S)&Nr'rJrKrLrWrY)TFrTF)r�rmz%s_%s)r]r~r�r�r�deny�allowr�z%s_%s_%srZr�r�)r]r~rmr}r�r(�REJECT�
%%REJECT%%r�r�z"filter_%s_%s: "r�)r�rr�r�r�)r�rr�r�r�)r�r�r�)r�r�r�r�)r�r�)r��build_policy_chain_rulesrMr�r�r�r2r�Z	_policiesr��get_log_deniedr��_reject_fragment�lower�reverse)rTr�r�r~rmr]r�r�r�r�r�r�Z
log_suffix�target_fragmentr4r4r5r��sZ





&




 





z!nftables.build_policy_chain_rulescCs<|dkriS|dkr,ddddiid	|d
�iSttd|��dS)
N�all�unicast�	broadcast�	multicastr)r�r`�pkttypez==)r.r/r0zInvalid pkttype "%s")r�r�r�)r	r)rTr�r4r4r5r��s
z nftables._pkttype_match_fragmentcCsdddd�idddd�idddd�idddd�idddd�idddd�idddd�idddd�idddd�idddd�iddd	d�iddd	d�iddd
d�iddd
d�iddd
d�idddd�idddd�iddd
d�iddd
d�idddd�idddd�idddiidddiid�}||S)Nr�r7zhost-prohibited)r+r}znet-prohibitedzadmin-prohibitedrFznet-unreachablezhost-unreachablezport-unreachabler�zprot-unreachablezaddr-unreachablezno-router+z	tcp reset)zicmp-host-prohibitedzhost-prohibzicmp-net-prohibitedz
net-prohibzicmp-admin-prohibitedzadmin-prohibzicmp6-adm-prohibitedzadm-prohibitedzicmp-net-unreachableznet-unreachzicmp-host-unreachablezhost-unreachzicmp-port-unreachablezicmp6-port-unreachablezport-unreachzicmp-proto-unreachablez
proto-unreachzicmp6-addr-unreachablezaddr-unreachzicmp6-no-routezno-routez	tcp-resetztcp-rstr4)rTZreject_typeZfragsr4r4r5�_reject_types_fragment�s0
znftables._reject_types_fragmentcCsdddd�iS)Nr�r�zadmin-prohibited)r+r}r4)rTr4r4r5r�sznftables._reject_fragmentcCs ddddiiddddgid	�iS)
Nr)r�r`�l4protoz==r�r7rF)r.r/r0r4)rTr4r4r5�_icmp_match_fragment"sznftables._icmp_match_fragmentcCsP|siSddddd�}|j�\}}|||d�}|j�}|dk	rH||d<d|iS)	N�secondZminuteZhourZday)�s�m�h�d)�rateZper�burst�limit)Zvalue_parseZburst_parse)rTr�Zrich_to_nftr�Zdurationr�r�r4r4r5�_rich_rule_limit_fragment'sz"nftables._rich_rule_limit_fragmentcCs�t|j�tttgkrn<|jrHt|j�tttt	gkrRt
tdt|j���n
t
td��|jdkr�t|j�ttgks�t|j�tt	gkr�dSt|j�tgks�t|j�ttgkr�dSn|jdkr�dSdSdS)NzUnknown action %szNo rule action specified.rr�r�r�r�)
r+�elementrrrr�rrrrr	rrr)rT�	rich_ruler4r4r5�_rich_rule_chain_suffix?s 


z nftables._rich_rule_chain_suffixcCs>|jr|jrttd��|jdkr(dS|jdkr6dSdSdS)NzNot log or auditrrr�r�)r�auditr	rrr)rTr�r4r4r5� _rich_rule_chain_suffix_from_logUs


z)nftables._rich_rule_chain_suffix_from_logcCsddiS)Nz%%ZONE_INTERFACE%%r4)rTr4r4r5r�`sz!nftables._zone_interface_fragmentcCsNtd|�rt|�}n,td|�r@|jd�}t|d�d|d}d||d�iS)NrH�/rr<z%%ZONE_SOURCE%%)r[r\)rrr�split)rTr[r\Z
addr_splitr4r4r5r�cs



znftables._zone_source_fragmentcCs
d|jiS)Nz%%POLICY_PRIORITY%%)rr)rTr�r4r4r5r�ksz"nftables._policy_priority_fragmentcCs|s|jdkriSd|jiS)Nrz%%RICH_RULE_PRIORITY%%)rr)rTr�r4r4r5�_rich_rule_priority_fragmentnsz%nftables._rich_rule_priority_fragmentcCs�|js
iS|jjj||t�}ddd�|}|j|�}i}	|jjrPd|jj|	d<|jjr|d|jjkrhdn|jj}
d|
|	d<d	td
|||f||j	|jj
�d|	igd�}|j|j|��|d
|iiS)NrWrY)TFz%sr�Zwarning�warn�levelrJz%s_%s_%sr)r]r~rmr}rZ)
rrMr�r�r�r�r�rr�r�r�r�r�)rTr�r�r�r~r�r�r�r�Zlog_optionsrrZr4r4r5�_rich_rule_logss&
znftables._rich_rule_logc
Cs�|js
iS|jjj||t�}ddd�|}|j|�}dtd|||f||j|jj�dddiigd	�}	|	j	|j
|��|d
|	iiS)NrWrY)TFrJz%s_%s_%srrr�)r]r~rmr}rZ)r�rMr�r�r�r�r�r�r�r�r�)
rTr�r�r�r~r�r�r�r�rZr4r4r5�_rich_rule_audit�s
znftables._rich_rule_auditc
Cs�|js
iS|jjj||t�}ddd�|}|j|�}d|||f}	t|j�tkr\ddi}
�nt|j�tkr�|jjr�|j	|jj�}
nddi}
n�t|j�t
kr�ddi}
n�t|j�tk�rHd}|jjj||t�}d|||f}	|jjj
d	�}t|�d
k�r,dddd
iiddddd
ii|d
gi|dgid�i}
ndddd
ii|dd�i}
nttdt|j���dt|	||j|jj�|
gd�}|j|j|��|d|iiS)NrWrY)TFz%s_%s_%sr�r�r�r&r�r<r�r`�mark�^�&r)r`�valuezUnknown action %srJ)r]r~rmr}rZ)r�rMr�r�r�r�r+rrr�rrr�r�rer	rr�r�r�r�r�)
rTr�r�r�r~r�r�r�r�rmZrule_actionrrZr4r4r5�_rich_rule_action�sB


,znftables._rich_rule_actioncCs�|jd�r0|j|td�d�d|kr(dnd|�St|�r>d}n�td|�rNd}nvtd|�r�d}tj|dd�}d	|jj	|j
d
�i}nDtd|�r�d}t|�}n,d}|jd
�}d	t|d�t
|d�d
�i}dd||d�i|r�dnd|d�iSdS)Nzipset:r�TF�etherrGrK)�strictr�)�addrrerHrLr�rr<r)r*)r,r-z!=z==)r.r/r0)r��_set_match_fragmentrerrr�	ipaddressZIPv4NetworkZnetwork_addressZ
compressedZ	prefixlenrr�rn)rTZ
addr_fieldr\�invertr]Znormalized_addressZaddr_lenr4r4r5r��s(
&





znftables._rule_addr_fragmentcCs6|siS|d
krttd|��ddddiid|d	�iS)NrGrHzInvalid familyr)r�r`�nfprotoz==)r.r/r0)rGrH)r	r)rTZrich_familyr4r4r5�_rich_rule_family_fragment�s
z#nftables._rich_rule_family_fragmentcCs8|siS|jr|j}n|jr&d|j}|jd||jd�S)Nzipset:r�)r)r�ipsetr�r)rTZ	rich_destr\r4r4r5�_rich_rule_destination_fragment�s
z(nftables._rich_rule_destination_fragmentcCsZ|siS|jr|j}n2t|d�r.|jr.|j}nt|d�rH|jrHd|j}|jd||jd�S)N�macrzipset:r�)r)r�hasattrrrr�r)rTZrich_sourcer\r4r4r5�_rich_rule_source_fragment�s
z#nftables._rich_rule_source_fragmentcCsPt|�}t|t�r$|dkr$tt��n(t|�dkr8|dSd|d|dgiSdS)Nrr<�range)r�
isinstancernr	rre)rT�portrr4r4r5�_port_fragments
znftables._port_fragmentc	Csbddd�|}d}|jjj||t�}	g}
|r>|
j|j|j��|rT|
j|jd|��|r||
j|j|j	��|
j|j
|j��|
jdd|dd	�id
|j|�d�i�|s�t
|j�tkr�|
jddd
diiddddgid�i�g}|�r0|j|j|||||
��|j|j|||||
��|j|j|||||
��n.|j|ddtd||	f|
ddigd�ii�|S)NrWrY)TFr(r�r)r*�dport)r,r-z==)r.r/r0r�r`r�r�r��new�	untrackedrZrJz%s_%s_allowr�)r]r~rmr})rMr�r�r�r2rr]r�r�destinationr�sourcerr+r�rrrrr�)rTr�r��protorrr�r�r~r�r�r�r4r4r5�build_policy_ports_ruless:


z!nftables.build_policy_ports_rulesc	CsZddd�|}d}|jjj||t�}g}	|r>|	j|j|j��|rT|	j|jd|��|r||	j|j|j	��|	j|j
|j��|	jdddd	iid
|d�i�|s�t|j
�tkr�|	jdddd
iiddddgid�i�g}
|�r(|
j|j|||||	��|
j|j|||||	��|
j|j|||||	��n.|
j|ddtd||f|	ddigd�ii�|
S)NrWrY)TFr(r�r)r�r`r�z==)r.r/r0r�r�r�r�rrrZrJz%s_%s_allowr�)r]r~rmr})rMr�r�r�r2rr]r�rrrrr+r�rrrrr�)rTr�r�r,rr�r�r~r�r�r�r4r4r5�build_policy_protocol_rules2s8

z$nftables.build_policy_protocol_rulesc	Csbddd�|}d}|jjj||t�}	g}
|r>|
j|j|j��|rT|
j|jd|��|r||
j|j|j	��|
j|j
|j��|
jdd|dd	�id
|j|�d�i�|s�t
|j�tkr�|
jddd
diiddddgid�i�g}|�r0|j|j|||||
��|j|j|||||
��|j|j|||||
��n.|j|ddtd||	f|
ddigd�ii�|S)NrWrY)TFr(r�r)r*�sport)r,r-z==)r.r/r0r�r`r�r�r�rrrZrJz%s_%s_allowr�)r]r~rmr})rMr�r�r�r2rr]r�rrrrrr+r�rrrrr�)rTr�r�rrrr�r�r~r�r�r�r4r4r5�build_policy_source_ports_rulesUs:


z(nftables.build_policy_source_ports_rulesc
	Cs�d}|jjj||t�}	ddd�|}
g}|rR|jdddtd||f||d�ii�g}|rl|j|jd	|��|jd
d|dd
�id|j|�d�i�|jdd||fi�|j|
ddtd|	|d�ii�|S)Nr(rWrY)TFz	ct helperrJzhelper-%s-%s)r]r~r�r+r,r�r)r*r)r,r-z==)r.r/r0rZzfilter_%s_allow)r]r~rmr})rMr�r�r�r2r�r�r)
rTr�r�rrrZhelper_nameZmodule_short_namer~r�r�r�r�r4r4r5�build_policy_helper_ports_ruleszs.



z(nftables.build_policy_helper_ports_rulescCs�ddd�|}|jjj||t�}g}	|rv|t|�ddkrT|dt|�d�d}ddd	d
iid|d�id
dig}
n|jd|�d
dig}
dtd||
d�}|	j|d|ii�|	S)NrWrY)TFr<r�r�r)r�r`r�z==)r.r/r0r�r�rJzfilter_%s_allow)r]r~rmr}rZ)rMr�r�r�rer�r�r2)rTr�r[r�r~r�rr�r�r�r}rZr4r4r5�build_zone_forward_rules�s"z!nftables.build_zone_forward_rulesc	Cs�d}|jjj||tdd�}ddd�|}g}|r`|j|j|j��|j|j|j��|j	|�}	nd}	|t
d||	f|d	d
ddiid
dd�iddigd�}
|
j|j|��|d|
iigS)Nr'T)r�rWrY)TFr�z	nat_%s_%sr)r�r`r�z!=r�)r.r/r0Z
masquerade)r]r~rmr}rZ)
rMr�r�r�r2rrrrr�r�r�r�)rTr�r�r]r�r~r�r�r�r�rZr4r4r5�"_build_policy_masquerade_nat_rules�s&
z+nftables._build_policy_masquerade_nat_rulesc
Cs^g}|rD|jr|jdks,|jrDtd|jj�rD|j|j||d|��nV|r�|jrX|jdksl|jr�td|jj�r�|j|j||d|��n|j|j||d|��d}|jjj||t	�}ddd�|}g}|r�|j
|j|j��|j
|j
|j��|j|�}	nd	}	d
td||	f|dd
ddiiddddgid�iddigd�}
|
j|j|��|j
|d|
ii�|S)NrHrLrGrKr(rWrY)TFr�rJzfilter_%s_%sr)r�r`r�r�r�rr)r.r/r0r�)r]r~rmr}rZ)r]rrrr�r&rMr�r�r�r2rrrr�r�r�r�)rTr�r�r�r�r~r�r�r�r�rZr4r4r5�build_policy_masquerade_rules�s8
z&nftables.build_policy_masquerade_rulesc	Cs$d}	|jjj||	t�}
ddd�|}g}|r\|j|j|j��|j|j|j��|j	|�}
nd}
|jdd|dd	�id
|j
|�d�i�|r�td|�r�t|�}|r�|d
kr�|jd||j
|�d�i�q�|jdd|ii�n|jdd|j
|�ii�|t
d|
|
f|d�}|j|j|��|d|iigS)Nr'rWrY)TFr�r)r*r)r,r-z==)r.r/r0rHr�r�)rrrr;rz	nat_%s_%s)r]r~rmr}rZ)rMr�r�r�r2rrrrr�rrrr�r�r�)rTr�r�rr,�toaddr�toportr]r�r~r�r�r�r�rZr4r4r5�$_build_policy_forward_port_nat_rules�s4


z-nftables._build_policy_forward_port_nat_rulesc	
Cs�g}|rF|jr|jdks&|rFtd|�rF|j|j||||||d|��n�|r�|jrZ|jdksh|r�td|�r�|j|j||||||d|��nL|r�td|�r�|j|j||||||d|��n|j|j||||||d|��|S)NrHrLrGrK)r]rr�r*)	rTr�r�rr,r)r(r�r�r4r4r5�build_policy_forward_port_rulessz(nftables.build_policy_forward_port_rulescCs2|t|krt||Sttd||j|f��dS)Nz)ICMP type '%s' not supported by %s for %s)r�r	rr�)rTr�Z	icmp_typer4r4r5�_icmp_types_to_nft_fragments(sz%nftables._icmp_types_to_nft_fragmentscCsBd}|jjj||t�}ddd�|}|r6|jr6|j}n<|jrjg}d|jkrT|jd�d|jkrr|jd�nddg}g}	�x�|D�]�}
|jjj|�r�d||f}ddi}nd	||f}|j�}g}
|r�|
j|j	|j
��|
j|j|j��|
j|j|j
��|
j|j|
|j��|�r�|	j|j|||||
��|	j|j|||||
��|j�rf|	j|j|||||
��nN|j|�}d
td|||f|
|j�gd�}|j|j|��|	j|d
|ii�q~|jj�dk�r|jjj|��r|	j|d
d
t||
|j|jj��ddd||fiigd�ii�|	j|d
d
t||
|gd�ii�q~W|	S)Nr(rWrY)TFrGrHz%s_%s_allowr�z
%s_%s_denyrJz%s_%s_%s)r]r~rmr}rZr�rr�z"%s_%s_ICMP_BLOCK: ")rMr�r�r��ipvsrr2�query_icmp_block_inversionr�rr]rrrr�r,r�rrr�rr�r�r�r�r�r�)rTr�r�Zictr�r~r�r�r-r�r�Zfinal_chainr�r�r�rZr4r4r5�build_policy_icmp_block_rules/sb





"
"
z&nftables.build_policy_icmp_block_rulescCs�d}|jjj||t�}g}ddd�|}|jjj|�r@|j�}nddi}|j|ddtd||fd	|j�|gd
�ii�|jj	�dkr�|jjj|�r�|j|ddtd||fd	|j�|j
|jj	��dd
d||fiigd
�ii�|S)Nr(rWrY)TFr�rZrJz%s_%sr9)r]r~rmrar}r�rr�z%s_%s_ICMP_BLOCK: )rMr�r�r�r.r�r2r�r�r�r�)rTr�r�r~r�r�r�r�r4r4r5�'build_policy_icmp_block_inversion_rulesks,




 z0nftables.build_policy_icmp_block_inversion_rulescCs�g}ddddiiddd�iddd	d
dgdd
�iddd�ig}|dkrV|jdddii�|jddi�|jdddtd|d�ii�|jdddtdddddd�iddddgid�id digd�ii�|S)!Nr)r�r`rz==rH)r.r/r0Zfibr�ZiifrZoif)�flags�resultFr�rr�zrpfilter_DROP: r�rXrZrJZfilter_PREROUTING)r]r~rmr}r*rFr+)r,r-r�znd-router-advertznd-neighbor-solicitr�)r2r�)rTr�r�r�r4r4r5�build_rpfilter_rules�s0

znftables.build_rpfilter_rulesc	Cs�ddddddddd	g	}d
d�|D�}dd
ddd�idd|id�ig}|jjd"krb|jdddii�|j|jd��g}|jdddtdd|d�ii�|jdddtd d!|d�ii�|S)#Nz::0.0.0.0/96z::ffff:0.0.0.0/96z2002:0000::/24z2002:0a00::/24z2002:7f00::/24z2002:ac10::/28z2002:c0a8::/32z2002:a9fe::/32z2002:e000::/19cSs2g|]*}d|jd�dt|jd�d�d�i�qS)r�r�rr<)rre)r�rn)�.0r^r4r4r5�
<listcomp>�sz5nftables.build_rfc3964_ipv4_rules.<locals>.<listcomp>r)r*rLr�)r,r-z==r�)r.r/r0r�r�rr�zRFC3964_IPv4_REJECT: zaddr-unreachrWrZrJr�r<)r]r~rmrar}Zfilter_FORWARDrB)r�r�)rMZ_log_deniedr2r�r�)rTZ	daddr_setr�r�r4r4r5�build_rfc3964_ipv4_rules�s:

z!nftables.build_rfc3964_ipv4_rulescCs�d}g}|j|j|j��|j|j|j��|j|j|j��g}|j|j|||||��|j|j|||||��|j|j	|||||��|S)Nr()
r2rr]rrrrrrr)rTr�r�r�r~r�r�r4r4r5�*build_policy_rich_source_destination_rules�sz3nftables.build_policy_rich_source_destination_rulescCs|dkrdSdS)NrGrH�ebTF)rGrHr8r4)rTr�r4r4r5�is_ipv_supported�sznftables.is_ipv_supportedc
Cs�ddd�}||||ddg||dd||g||dd||g||dg||||||g||ddg||dd||g||dgdd	�}||kr�||Sttd
|��dS)NZ	ipv4_addrZ	ipv6_addr)rGrHZ
inet_protoZinet_servicerZifnameZ
ether_addr)zhash:ipzhash:ip,portzhash:ip,port,ipzhash:ip,port,netzhash:ip,markzhash:netzhash:net,netz
hash:net,portzhash:net,port,netzhash:net,ifacezhash:macz!ipset type name '%s' is not valid)r	r
)rTr�r+Zipv_addr�typesr4r4r5�_set_type_list�s"

znftables._set_type_listc
Cs�|rd|kr|ddkrd}nd}t||j||�d�}x0|jd�djd�D]}|dkrLdg|d
<PqLW|r�d|kr�|d|d<d|kr�|d|d<g}x0dD](}d|i}	|	j|�|jdd|	ii�q�W|S)Nr]�inet6rHrG)r~r�r+�:r<�,rK�netrZintervalr1ZtimeoutZmaxelem�sizerJrLrWr�)rKr?r)rJrKrL)r�r;r�r�r2)
rTr�r+�optionsr�Zset_dict�tr�r]Z	rule_dictr4r4r5�build_set_create_rules�s*


znftables.build_set_create_rulescCs$|j|||�}|j||jj��dS)N)rCr�rMr�)rTr�r+rAr�r4r4r5�
set_createsznftables.set_createcCs8x2dD]*}dd|t|d�ii}|j||jj��qWdS)NrJrKrLrYr�)r]r~r�)rJrKrL)r�r�rMr�)rTr�r]rZr4r4r5�set_destroys

znftables.set_destroycCs6|jjj|�jjd�djd�}g}x�tt|��D]�}||dkrr|jdddii�|jdd	|rdd
ndd�i�q2||dkr�|jd|j|�|r�dndd�i�q2||dkr�|jdd|r�dndii�q2||dkr�|jdddii�q2t	d||��q2Wdt|�dk�rd|in|d|�r&dndd|d�iS)Nr=r<r>rr�r`r�r*Zthrr")r,r-rKr?rr�r�Zifacer�r�rz-Unsupported ipset type for match fragment: %sr)�concatrz!=z==�@)r.r/r0)rKr?r)
rMr�	get_ipsetr+r�rrer2r�r	)rTr�Z
match_destr�type_formatr3�ir4r4r5r s$ znftables._set_match_fragmentcCsN|jjj|�}|jjd�djd�}|jd�}t|�t|�krHttd��g}�x�tt|��D�]�}||dk�r,y||j	d�}Wn&t
k
r�|jd�||}	Yn,X|j||d|��|||dd�}	y|	j	d�}Wn t
k
�r|j|	�Yn(X|jd|	d|�|	|dd�gi�q\||dk�r d||k�rb|jd||jd�i�n�y||j	d�}WnLt
k
�r�||}
d|jk�r�|jdd
k�r�t
|
�}
|j|
�Yn^X||d|�}
d|jk�r�|jdd
k�r�t
|
�}
|jd|
t|||dd��d�i�q\|j||�q\Wt|�dk�rJd|igS|S)Nr=r<r>z+Number of values does not match ipset type.rZtcp�-rrKr?r�r]r<r�)rrerF)rKr?)rMrrHr+r�rer	rrrar�r2rArrn)rTr��entry�objrIZentry_tokensZfragmentrJraZport_strrr4r4r5�_set_entry_fragment7sL

("znftables._set_entry_fragmentc	Cs>g}|j||�}x(dD] }|jdd|t||d�ii�qW|S)NrJrKrLrWr�)r]r~r��elem)rJrKrL)rNr2r�)rTr�rLr�r�r]r4r4r5�build_set_add_rulesks

znftables.build_set_add_rulescCs"|j||�}|j||jj��dS)N)rPr�rMr�)rTr�rLr�r4r4r5�set_addusznftables.set_addcCsF|j||�}x4dD],}dd|t||d�ii}|j||jj��qWdS)NrJrKrLrYr�)r]r~r�rO)rJrKrL)rNr�r�rMr�)rTr�rLr�r]rZr4r4r5�
set_deleteys
znftables.set_deletecCs4g}x*dD]"}dd|t|d�ii}|j|�q
W|S)NrJrKrLr{r�)r]r~r�)rJrKrL)r�r2)rTr�r�r]rZr4r4r5�build_set_flush_rules�s
znftables.build_set_flush_rulescCs |j|�}|j||jj��dS)N)rSr�rMr�)rTr�r�r4r4r5�	set_flush�s
znftables.set_flushcCsJ|jjj|�}|jdkrd}n(|jrBd|jkrB|jddkrBd}nd}|S)Nzhash:macr	r]r<rLrK)rMrrHr+rA)rTr�rr]r4r4r5r��s
znftables._set_get_familyc	Cs�g}|j|j|||��|j|j|��d}x^|D]D}|j|j||��|d7}|dkr2|j||jj��|j�d}q2W|j||jj��dS)Nrr<i�)r�rCrSrPr�rMr��clear)	rTZset_nameZ	type_nameZentriesZcreate_optionsZ
entry_optionsr��chunkrLr4r4r5�set_restore�s
znftables.set_restore)N)N)r�)rJ)FrJ)rJ)rJ)F)NN)NN)NN)NN)N)N)N)N)N)F)N)N)F)NN)I�__name__�
__module__�__qualname__r�Zpolicies_supportedrVrhrlrtrzr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rrrr�rrrrr r!r#r$r%r&r'r*r+r,r/r0r3r6r7r9r;rCrDrErrNrPrQrRrSrTr�rWr4r4r4r5rI�s�/.`

4


R
i
;
-
9
 +


	
$
$
$


'
$

<
#


4
		rIij���i����)N)(Z
__future__rrirwr
Zfirewall.core.loggerrZfirewall.functionsrrrrrZfirewall.errorsr	r
rrr
rrZfirewall.core.richrrrrrrrZnftables.nftablesrr�r�r�r�r�r6r��objectrIr4r4r4r5�<module>s�$$





































icmp.cpython-36.pyc000064400000004265151730727350010143 0ustar003

��g�#@s�ddddgZddddddd	d
ddd
dddddddddddddddddddd d!d"d#d$�"Zd%d&d'd(d)dddd*d+d,d,d-d-d.d/d0d0d1d1d2d3�Zd4d5�Zd6d�Zd7d8�Zd9d�Zd:S);�
ICMP_TYPES�ICMPV6_TYPES�check_icmp_type�check_icmpv6_typez0/0z3/0z3/1z3/2z3/3z3/4z3/5z3/6z3/7z3/9z3/10z3/11z3/12z3/13z3/14z3/15z4/0z5/0z5/1z5/2z5/3z8/0z9/0z10/0z11/0z11/1z12/0z12/1z13/0z14/0z17/0z18/0)"z
echo-reply�pongznetwork-unreachablezhost-unreachablezprotocol-unreachablezport-unreachablezfragmentation-neededzsource-route-failedznetwork-unknownzhost-unknownznetwork-prohibitedzhost-prohibitedzTOS-network-unreachablezTOS-host-unreachablezcommunication-prohibitedzhost-precedence-violationzprecedence-cutoffz
source-quenchznetwork-redirectz
host-redirectzTOS-network-redirectzTOS-host-redirectzecho-request�pingzrouter-advertisementzrouter-solicitationzttl-zero-during-transitzttl-zero-during-reassemblyz
ip-header-badzrequired-option-missingztimestamp-requestztimestamp-replyzaddress-mask-requestzaddress-mask-replyz1/0z1/1z1/3z1/4z2/0z4/1z4/2z128/0z129/0z133/0z134/0z135/0z136/0z137/0)zno-routezcommunication-prohibitedzaddress-unreachablezport-unreachablezpacket-too-bigzttl-zero-during-transitzttl-zero-during-reassemblyz
bad-headerzunknown-header-typezunknown-optionzecho-requestrz
echo-replyrzrouter-solicitationzrouter-advertisementzneighbour-solicitationzneigbour-solicitationzneighbour-advertisementzneigbour-advertisementZredirectcCs|tkrdSdS)NTF)r)�_name�r�/usr/lib/python3.6/icmp.py�check_icmp_nameVsr
cCs|tj�krdSdS)NTF)r�values)�_typerrr	r[scCs|tkrdSdS)NTF)r)rrrr	�check_icmpv6_name`sr
cCs|tj�krdSdS)NTF)rr)rrrr	resN)�__all__rrr
rr
rrrrr	�<module>sxfw_icmptype.cpython-36.pyc000064400000004205151730727350011533 0ustar003

��g�	�@s>dgZddlmZddlmZddlmZGdd�de�ZdS)�FirewallIcmpType�)�log)�errors)�
FirewallErrorc@sLeZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dS)rcCs||_i|_dS)N)�_fw�
_icmptypes)�self�fw�r
�!/usr/lib/python3.6/fw_icmptype.py�__init__szFirewallIcmpType.__init__cCsd|j|jfS)Nz%s(%r))�	__class__r)rr
r
r�__repr__!szFirewallIcmpType.__repr__cCs|jj�dS)N)r�clear)rr
r
r�cleanup$szFirewallIcmpType.cleanupcCst|jj��S)N)�sortedr�keys)rr
r
r�
get_icmptypes)szFirewallIcmpType.get_icmptypescCs||jkrttj|��dS)N)rrrZINVALID_ICMPTYPE)r�icmptyper
r
r�check_icmptype,s
zFirewallIcmpType.check_icmptypecCs|j|�|j|S)N)rr)rrr
r
r�get_icmptype0s
zFirewallIcmpType.get_icmptypecCs�|j}t|�dkrddg}x�|D]z}|dkrL|jjrB|jjrBq |jj}n,|dkrt|jjrj|jjrjq |jj}ng}|jj	�|kr t
jd|j|f�q W||j|j<dS)NrZipv4Zipv6z5ICMP type '%s' is not supported by the kernel for %s.)
Zdestination�lenrZip4tables_enabledZnftables_enabledZipv4_supported_icmp_typesZip6tables_enabledZipv6_supported_icmp_types�name�lowerrZinfo1r)r�objZ	orig_ipvsZipvZsupported_icmpsr
r
r�add_icmptype4s 


zFirewallIcmpType.add_icmptypecCs|j|�|j|=dS)N)rr)rrr
r
r�remove_icmptypeGs
z FirewallIcmpType.remove_icmptypeN)�__name__�
__module__�__qualname__rrrrrrrrr
r
r
rrsN)	�__all__Zfirewall.core.loggerrZfirewallrZfirewall.errorsr�objectrr
r
r
r�<module>sfw_zone.cpython-36.pyc000064400000077522151730727350010670 0ustar003

��gy��@s�ddlZddlZddlmZmZmZddlmZddlm	Z	ddl
mZddlm
Z
mZmZmZmZmZmZmZmZddlmZmZmZddlmZdd	lmZdd
lmZGdd�de �Z!dS)
�N)�	SHORTCUTS�DEFAULT_ZONE_TARGET�SOURCE_IPSET_TYPES)�FirewallTransaction)�Policy)�log)	�Rich_Service�	Rich_Port�
Rich_Protocol�Rich_SourcePort�Rich_ForwardPort�Rich_IcmpBlock�
Rich_IcmpType�Rich_Masquerade�	Rich_Mark)�checkIPnMask�
checkIP6nMask�	check_mac)�errors)�
FirewallError)�LastUpdatedOrderedDictc@sNeZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zd�dd �Zd!d"�Zd#d$�Zd%d&�Zd�d'd(�Zd)d*�Zd+d,�Zd-d.�Zd�d/d0�Zd�d1d2�Zd3d4�Zd5d6�Zd7d8�Zd9d:�Zd;d<�Z d=d>�Z!d�d@dA�Z"dBdC�Z#d�dDdE�Z$d�dFdG�Z%d�dHdI�Z&dJdK�Z'dLdM�Z(dNdO�Z)d�dQdR�Z*d�dSdT�Z+d�dUdV�Z,dWdX�Z-d�dYdZ�Z.d�d[d\�Z/d]d^�Z0d_d`�Z1dadb�Z2d�dcdd�Z3dedf�Z4dgdh�Z5didj�Z6dkdl�Z7dmdn�Z8dodp�Z9d�dqdr�Z:dsdt�Z;dudv�Z<dwdx�Z=d�dydz�Z>d{d|�Z?d}d~�Z@dd��ZAd�d�d��ZBd�d��ZCd�d��ZDd�d��ZEd�d��ZFd�d�d��ZGd�d��ZHd�d��ZId�d��ZJd�d�d��ZKd�d��ZLd�d��ZMd�d��ZNd�d�d��ZOd�d��ZPd�d��ZQd�d�d��ZRd�d�d��ZSd�d�d��ZTd�d��ZUd�d�d��ZVd�d��ZWd�d��ZXd�d��ZYd�d�d��ZZd�d��Z[d�d��Z\d�d��Z]d�d��Z^d�d��Z_d�d�d��Z`d�d��Zad�d�d„Zbd�dĄZcd�dƄZddS)��FirewallZonercCs||_i|_i|_dS)N)�_fw�_zones�_zone_policies)�self�fw�r�/usr/lib/python3.6/fw_zone.py�__init__&szFirewallZone.__init__cCsd|j|jfS)Nz%s(%r))�	__class__r)rrrr�__repr__+szFirewallZone.__repr__cCs|jj�|jj�dS)N)r�clearr)rrrr�cleanup.s
zFirewallZone.cleanupcCs
t|j�S)N)rr)rrrr�new_transaction2szFirewallZone.new_transactioncCsdj||d�S)Nzzone_{fromZone}_{toZone})�fromZone�toZone)�format)rr%r&rrr�policy_name_from_zones5sz#FirewallZone.policy_name_from_zonescCst|jj��S)N)�sortedr�keys)rrrr�	get_zones:szFirewallZone.get_zonescCs8g}x.|j�D]"}|j|�s&|j|�r|j|�qW|S)N)r+�list_interfaces�list_sources�append)rZactive_zones�zonerrr�get_active_zones=s
zFirewallZone.get_active_zonescCs6|j|�}x&|jD]}||j|jdkr|SqWdS)N�
interfaces)�_FirewallZone__interface_idr�settings)r�	interface�interface_idr/rrr�get_zone_of_interfaceDs

z"FirewallZone.get_zone_of_interfacecCs6|j|�}x&|jD]}||j|jdkr|SqWdS)N�sources)�_FirewallZone__source_idrr3)r�source�	source_idr/rrr�get_zone_of_sourceLs

zFirewallZone.get_zone_of_sourcecCs|jj|�}|j|S)N)r�
check_zoner)rr/�zrrr�get_zoneTszFirewallZone.get_zonecCsBt�}|j|_|j||�|_|j|_|j|_|g|_|g|_�x�dD�]�}||jkr~|d	kr~|dkr~t	||t
jt||���qD|d
kr�||jkr�|d
kr�t	||t
jt||���qD||jko�|d
ko�|dk�r�t	||t
jt||���qD|dkrDg|_
xB|j
D]8}|j||�}||j|j|�k�r�|j
jt
j|���q�WqDW|S)N�services�ports�
masquerade�
forward_ports�source_ports�icmp_blocks�rules�	protocols�HOST�ANY)r?r@rArBrCrDrErF)r?r@rCrDrF)rA)rDrB)rE)r�nameZderived_from_zoner(�ZONE_POLICY_PRIORITYZpriority�targetZ
ingress_zonesZegress_zones�setattr�copy�deepcopy�getattrrE�_rich_rule_to_policiesr.)r�z_objr%r&�p_objZsetting�ruleZcurrent_policyrrr�policy_obj_from_zone_objXs6

z%FirewallZone.policy_obj_from_zone_objcCs�dd�d	D�|_||j|j<g|j|j<xX|jdfd|jf|jdfgD]8\}}|j|||�}|jjj|�|j|jj|j�qFW|j	|j�dS)
NcSsi|]}t�|�qSr)r)�.0�xrrr�
<dictcomp>sz)FirewallZone.add_zone.<locals>.<dictcomp>r1r7�icmp_block_inversion�forwardrGrH)r1r7rXrY)
r3rrIrrTr�policyZ
add_policyr.�copy_permanent_to_runtime)r�objr%r&rRrrr�add_zone~s

zFirewallZone.add_zonecCsn|j|}x|jD]}|j||dd�qWx|jD]}|j||dd�q2W|jrZ|j|�|jrj|j|�dS)NF)�allow_apply)	rr1�
add_interfacer7�
add_sourcerY�add_forwardrX�add_icmp_block_inversion)rr/r\�argrrrr[�s

z&FirewallZone.copy_permanent_to_runtimecCs8|j|}|jr|j|�|jj�|j|=|j|=dS)N)r�applied�unapply_zone_settingsr3r"r)rr/r\rrr�remove_zone�s


zFirewallZone.remove_zoneNcCsVxP|j�D]D}|j|}t|j�dks4t|j�dkr
tjd|�|j||d�q
WdS)NrzApplying zone '%s')�use_transaction)r+r�lenr1r7r�debug1�apply_zone_settings)rrgr/rQrrr�apply_zones�s

zFirewallZone.apply_zonescCs|j|}||_dS)N)rrd)rr/rdr\rrr�set_zone_applied�s
zFirewallZone.set_zone_appliedcCs�d|krdS|jd�}t|�dkr&dSd}x tD]}|dt|kr0|}q0W|dk	r�|d|j�krhdSt|�dks�t|�dkr�|ddkr�|d|fSdS)N�_�r���prer�deny�allow�post)rqrrrrsrt)�splitrhrr+)r�chainZsplits�_chainrVrrr�zone_from_chain�s 

zFirewallZone.zone_from_chaincCst|j|�}|dkrdS|\}}|d	kr0|}d}n4|d
krB|}d}n"|dkrTd}|}nttjd|��|j||�|fS)N�
PREROUTING�
FORWARD_INrH�INPUTrG�POSTROUTING�FORWARD_OUTz&chain '%s' can't be mapped to a policy)ryrz)r{)r|r})rxrrZ
INVALID_CHAINr()rrvrVr/rwr%r&rrr�policy_from_chain�s
zFirewallZone.policy_from_chainc	Csj|dkrf|j|�}|dk	rf|j|�\}}|dkr:|j�}n|}|jjj|d|||�|dkrf|jd�dS)N�ipv4�ipv6T)rr�)r~r$rrZZgen_chain_rules�execute)	r�ipv�tablervrgrVrZrw�transactionrrr�create_zone_base_by_chain�s

z&FirewallZone.create_zone_base_by_chaincCstj�||d�}|S)N)Zdate�sender�timeout)�time)rr�r��retrrrZ__gen_settings�szFirewallZone.__gen_settingscCs|j|�jS)N)r>r3)rr/rrr�get_settings�szFirewallZone.get_settingscCs�|j|�}x�|D]z}xt||D]h}|dkr<|j||||�q|dkr`|j|||d|d|�q|dkrlqq|dkrvqtjd|||�qWqW|r�|j|||�dS)Nr1r7rrorXrYz3Zone '%s': Unknown setting '%s:%s', unable to apply)r��
_interface�_sourcerZwarning�_icmp_block_inversion)r�enabler/r�r3�key�argsrrr�_zone_settingss

zFirewallZone._zone_settingscCs�|jj|�}|j|}|jr dSd|_|dkr8|j�}n|}x2|j|D]$}tjd||�|jjj	||d�qHW|j
d||�|dkr�|jd�dS)NTz+Applying policy (%s) derived from zone '%s')rg)rr<rrdr$rrrirZ�apply_policy_settingsr�r�)rr/rg�_zoner\r�rZrrrrjs

z FirewallZone.apply_zone_settingscCs�|jj|�}|j|}|js dS|dkr2|j�}n|}x$|j|D]}|jjj||d�qBW|jd||�|dkr||j	d�dS)N)rgFT)
rr<rrdr$rrZ�unapply_policy_settingsr�r�)rr/rgr�r\r�rZrrrre,s

z"FirewallZone.unapply_zone_settingscCs~|j|�}|j|�}g}x\td�D]P}|j|d|krZ|jtjt||j|d���q"|j||j|d�q"Wt|�S)zH
        :return: exported config updated with runtime settings
        �r)	r>�get_config_with_settings_dict�rangeZIMPORT_EXPORT_STRUCTUREr.rMrNrO�tuple)rr/r\Z	conf_dictZ	conf_list�irrr�get_config_with_settings?s

"z%FirewallZone.get_config_with_settingsc
Cs�|j|�j�}|dtkr"d|d<|j|�|j|�|j|�|j|�|j|�|j|�|j	|�|j
|�|j|�|j|�|j
|�|j|�d�}|jj||�S)zH
        :return: exported config updated with runtime settings
        rK�default)r?r@rDrArBr1r7�	rules_strrFrCrXrY)r>Zexport_config_dictr�
list_services�
list_ports�list_icmp_blocks�query_masquerade�list_forward_portsr,r-�
list_rules�list_protocols�list_source_ports�query_icmp_block_inversion�
query_forwardrZ'combine_runtime_with_permanent_settings)rr/Z	permanentZruntimerrrr�Os z*FirewallZone.get_config_with_settings_dictc
sddlm�d��fdd�	}��fdd�}�j�jf�j�jf�j�jf�j�j	f�j
�jf�j�j
f�j�jf||f�j�jf�j�jf�j�jf�j�jfd�}�j|�}�jj||�\}}	xv|	D]n}
t|	|
t��r$xX|	|
D]:}t|t��r||
d|f|��q�||
d||�q�Wq�||
d|�q�Wx�|D]�}
t||
t��r�x�||
D]l}|
dk�r�||
d|||d�nDt|t��r�||
d|f|�d|d��n||
d||d|d��q\Wn6|
dk�r�||
d||d�n||
d|d|d��q>WdS)Nr)�	Rich_Rulecs�j|�|d�d|d�dS)N)�rule_strr)r�r�)�add_rule)r/r�r�r�)r�rrr�add_rule_wrapperhszDFirewallZone.set_config_with_settings_dict.<locals>.add_rule_wrappercs�j|�|d��dS)N)r�)�remove_rule)r/r�)r�rrr�remove_rule_wrapperjszGFirewallZone.set_config_with_settings_dict.<locals>.remove_rule_wrapper)r?r@rDrArBr1r7r�rFrCrXrYror1r7)r�)r�r�rX)rN)r1r7)rX)�firewall.core.richr��add_service�remove_service�add_port�remove_port�add_icmp_block�remove_icmp_block�add_masquerade�remove_masquerade�add_forward_port�remove_forward_portr_�remove_interfacer`�
remove_source�add_protocol�remove_protocol�add_source_port�remove_source_portrb�remove_icmp_block_inversionra�remove_forwardr�rZget_added_and_removed_settings�
isinstance�listr�)rr/r3r�r�r�Z
setting_to_fnZold_settingsZadd_settingsZremove_settingsr�r�r)r�rr�set_config_with_settings_dictesF













  
z*FirewallZone.set_config_with_settings_dictcCs|jj|�dS)N)r�check_interface)rr4rrrr��szFirewallZone.check_interfacecCs\|jj|�}|j|}|j|�}||jdkrX|jd|}d|krX|ddk	rX|dSdS)Nr1r�)rr<rr2r3)rr/r4r��_objr5r3rrr�interface_get_sender�s

z!FirewallZone.interface_get_sendercCs|j|�|S)N)r�)rr4rrrZ__interface_id�s
zFirewallZone.__interface_idTc
Cs|jj�|jj|�}|j|}|j|�}||jdkrLttjd||f��|j	|�dk	rjttj
d|��tjd||f�|dkr�|j
�}	n|}	|jr�|r�|j||	d�|	j|j|d�|r�|jd|||	�|j||||�|	j|j||�|dk�r|	jd�|S)Nr1z'%s' already bound to '%s'z'%s' already bound to a zonez&Setting zone of interface '%s' to '%s')rgFT)r�check_panicr<rr2r3rr�ZONE_ALREADY_SETr6�
ZONE_CONFLICTrrir$rdrj�add_failrlr��!_FirewallZone__register_interface�#_FirewallZone__unregister_interfacer�)
rr/r4r�rgr^r�r�r5r�rrrr_�s8









zFirewallZone.add_interfacecCs6|jd|�|jd|<|p"|dk|jd|d<dS)Nrr1��__default__)�_FirewallZone__gen_settingsr3)rr�r5r/r�rrrZ__register_interface�sz!FirewallZone.__register_interfacecCsR|jj�|j|�}|jj|�}||kr,|S|dk	r@|j||�|j|||�}|S)N)rr�r6r<r�r_)rr/r4r��	_old_zone�	_new_zoner�rrr�change_zone_of_interface�s

z%FirewallZone.change_zone_of_interfacecCsz|jj�|dkr|j�}n|}|j||�|jd|d|dd�|dk	rd|dkrd|jd|d|dd�|dkrv|jd�dS)NT�+)r.r�F)rr�r$rjr�r�)rZold_zoneZnew_zonergr�rrr�change_default_zone�s

z FirewallZone.change_default_zonec	Cs�|jj�|j|�}|dkr,ttjd|��|dkr8|n
|jj|�}||krbttjd|||f��|dkrt|j�}n|}|j	|}|j
|�}|j|j||�|j
d|||�|dkr�|jd�|S)Nz'%s' is not in any zoner�z"remove_interface(%s, %s): zoi='%s'FT)rr�r6rrZUNKNOWN_INTERFACEr<r�r$rr2�add_postr�r�r�)	rr/r4rgZzoir�r�r�r5rrrr��s(






zFirewallZone.remove_interfacecCs||jdkr|jd|=dS)Nr1)r3)rr�r5rrrZ__unregister_interfacesz#FirewallZone.__unregister_interfacecCs|j|�|j|�dkS)Nr1)r2r�)rr/r4rrr�query_interfaceszFirewallZone.query_interfacecCs|j|�dj�S)Nr1)r�r*)rr/rrrr,"szFirewallZone.list_interfacesFcCsxt|�rdSt|�rdSt|�r$dS|jd�rh|j|dd��|rV|j|dd��|j|dd��Sttj	|��dS)Nrr�r�zipset:�)
rrr�
startswith�_check_ipset_type_for_source�_check_ipset_applied�
_ipset_familyrrZINVALID_ADDR)rr9rdrrr�check_source's
zFirewallZone.check_sourcecCs|j||d�}||fS)N)rd)r�)rr9rdr�rrrZ__source_id6szFirewallZone.__source_idc
Cs|jj�|jj|�}|j|}t|�r0|j�}|j||d�}||jdkr`tt	j
d||f��|j|�dk	r~tt	jd|��|dkr�|j
�}	n|}	|jr�|r�|j||	d�|	j|j|d�|r�|jd||d|d	|	�|j||||�|	j|j||�|dk�r|	jd�|S)
N)rdr7z'%s' already bound to '%s'z'%s' already bound to a zone)rgFTrro)rr�r<rr�upperr8r3rrr�r;r�r$rdrjr�rlr��_FirewallZone__register_source� _FirewallZone__unregister_sourcer�)
rr/r9r�rgr^r�r�r:r�rrrr`:s4





zFirewallZone.add_sourcecCs6|jd|�|jd|<|p"|dk|jd|d<dS)Nrr7r�r�)r�r3)rr�r:r/r�rrrZ__register_sourceaszFirewallZone.__register_sourcecCsb|jj�|j|�}|jj|�}||kr,|St|�r<|j�}|dk	rP|j||�|j|||�}|S)N)rr�r;r<rr�r�r`)rr/r9r�r�r�r�rrr�change_zone_of_sourcegs

z"FirewallZone.change_zone_of_sourcec	Cs�|jj�t|�r|j�}|j|�}|dkr<ttjd|��|dkrH|n
|jj|�}||krrttj	d|||f��|dkr�|j
�}n|}|j|}|j|�}|j
|j||�|jd||d|d|�|dkr�|jd�|S)Nz'%s' is not in any zoner�zremove_source(%s, %s): zos='%s'FrroT)rr�rr�r;rrZUNKNOWN_SOURCEr<r�r$rr8r�r�r�r�)	rr/r9rgZzosr�r�r�r:rrrr�ys,






zFirewallZone.remove_sourcecCs||jdkr|jd|=dS)Nr7)r3)rr�r:rrrZ__unregister_source�sz FirewallZone.__unregister_sourcecCs(t|�r|j�}|j|�|j|�dkS)Nr7)rr�r8r�)rr/r9rrr�query_source�szFirewallZone.query_sourcecCsdd�|j|�dj�D�S)NcSsg|]}|d�qS)ror)rU�krrr�
<listcomp>�sz-FirewallZone.list_sources.<locals>.<listcomp>r7)r�r*)rr/rrrr-�szFirewallZone.list_sourcescs�x��jj�D]�}|jsqxP�j|D]B}x<�jjj|�D]*\}}	|j||||||	|�}
|j||
�q8Wq$W�j|d�}�j	|�dr|d
kr|j
|||d|d�}
|j||
�qWxΈjjj�D]�}|�jjj|�kr�|�jjj
|�kr�q�|�jjj�k�rd�jjj|�j�rd|�r<t�j|��dk�r<�jjj||d�n&�jjjd	||�|j�fd
d�|�q�|r�|j�fdd�|�q�WdS)NrHrYr��*�filter)r4ro)rgFcs |�jjj�ko�jjjd|�S)NT)rrZ�)get_active_policies_not_derived_from_zone�!_ingress_egress_zones_transaction)�p)rrr�<lambda>�sz)FirewallZone._interface.<locals>.<lambda>cs|�jjj�ko�jjj|�S)N)rrZr�r�)r�)rrrr��s)r�r�)r�enabled_backends�policies_supportedrrZ�#_get_table_chains_for_zone_dispatchZ!build_zone_source_interface_rules�	add_rulesr(r��build_zone_forward_rules�"get_policies_not_derived_from_zone�list_ingress_zones�list_egress_zonesr��
get_policyrdrhr,r��_ingress_egress_zonesr�)rr�r/r4r�r.�backendrZr�rvrEr)rrr��s2$zFirewallZone._interfacecCs$|j|�dkrdS|jjj|dd�S)Nzhash:macF)rd)�_ipset_typer�ipsetZ
get_family)rrIrrrr��szFirewallZone._ipset_familycCs|jjj|dd�S)NF)rd)rr�Zget_type)rrIrrrr��szFirewallZone._ipset_typecCsdj|g|jjj|��S)N�,)�joinrr�Z
get_dimension)rrI�flagrrr�_ipset_match_flags�szFirewallZone._ipset_match_flagscCs|jjj|�S)N)rr�Z
check_applied)rrIrrrr��sz!FirewallZone._check_ipset_appliedcCs*|j|�}|tkr&ttjd||f��dS)Nz.ipset '%s' with type '%s' not usable as source)r�rrrZ
INVALID_IPSET)rrIZ_typerrrr��s
z)FirewallZone._check_ipset_type_for_sourcec
s�x�|r�jj|�gn�jj�D]�}|js*qxN�j|D]@}x:�jjj|�D](\}}	|j||||||	�}
|j||
�qJWq6W�j	|d�}�j
|�dr|j|||d|d�}
|j||
�qWxΈjjj�D]�}|�jjj
|�kr�|�jjj|�kr�q�|�jjj�k�rl�jjj|�j�rl|�rDt�j|��dk�rD�jjj||d�n&�jjjd||�|j�fdd	�|�q�|r�|j�fd
d	�|�q�WdS)NrHrYr�)r9ro)rgFcs |�jjj�ko�jjjd|�S)NT)rrZr�r�)r�)rrrr�sz&FirewallZone._source.<locals>.<lambda>cs|�jjj�ko�jjj|�S)N)rrZr�r�)r�)rrrr�
s)r�get_backend_by_ipvr�r�rrZr�Zbuild_zone_source_address_rulesr�r(r�r�r�r�r�r�r�rdrhr-r�r�r�)rr�r/r�r9r�r�rZr�rvrEr)rrr��s2"$zFirewallZone._sourcecCs0|jj|�}|j|d�}|jjj||||�|S)NrG)rr<r(rZr�)rr/�servicer�r��p_namerrrr�
szFirewallZone.add_servicecCs,|jj|�}|j|d�}|jjj||�|S)NrG)rr<r(rZr�)rr/r�r�rrrr�szFirewallZone.remove_servicecCs(|jj|�}|j|d�}|jjj||�S)NrG)rr<r(rZ�
query_service)rr/r�r�rrrr�szFirewallZone.query_servicecCs&|jj|�}|j|d�}|jjj|�S)NrG)rr<r(rZr�)rr/r�rrrr�szFirewallZone.list_servicescCs2|jj|�}|j|d�}|jjj|||||�|S)NrG)rr<r(rZr�)rr/�port�protocolr�r�r�rrrr�#szFirewallZone.add_portcCs.|jj|�}|j|d�}|jjj|||�|S)NrG)rr<r(rZr�)rr/r�r�r�rrrr�)szFirewallZone.remove_portcCs*|jj|�}|j|d�}|jjj|||�S)NrG)rr<r(rZ�
query_port)rr/r�r�r�rrrr/szFirewallZone.query_portcCs&|jj|�}|j|d�}|jjj|�S)NrG)rr<r(rZr�)rr/r�rrrr�4szFirewallZone.list_portscCs2|jj|�}|j|d�}|jjj|||||�|S)NrG)rr<r(rZr�)rr/�source_portr�r�r�r�rrrr�9szFirewallZone.add_source_portcCs.|jj|�}|j|d�}|jjj|||�|S)NrG)rr<r(rZr�)rr/rr�r�rrrr�?szFirewallZone.remove_source_portcCs*|jj|�}|j|d�}|jjj|||�S)NrG)rr<r(rZ�query_source_port)rr/rr�r�rrrrEszFirewallZone.query_source_portcCs&|jj|�}|j|d�}|jjj|�S)NrG)rr<r(rZr�)rr/r�rrrr�JszFirewallZone.list_source_portscCs�|jj|�}t|j�tkr(|j|d�gSt|j�ttt	t
gkrL|j|d�gSt|j�ttgkrv|j|d�|j|d�gSt|j�t
gkr�|j|d�gSt|j�tgkr�|jd|�gS|jdkr�|j|d�gStdt|j���dS)NrHrGz Rich rule type (%s) not handled.)rr<�type�actionrr(�elementrr	r
rr
rrrr)rr/rSrrrrPOs 

z#FirewallZone._rich_rule_to_policiescCs.x(|j||�D]}|jjj||||�qW|S)N)rPrrZr�)rr/rSr�r�r�rrrr�bszFirewallZone.add_rulecCs*x$|j||�D]}|jjj||�qW|S)N)rPrrZr�)rr/rSr�rrrr�gszFirewallZone.remove_rulecCs2d}x(|j||�D]}|o(|jjj||�}qW|S)NT)rPrrZ�
query_rule)rr/rSr�r�rrrrlszFirewallZone.query_rulecCs^|jj|�}t�}xB|j|d�|j|d�|jd|�gD]}|jt|jjj|���q6Wt|�S)NrHrG)rr<�setr(�updaterZr�r�)rr/r�r�rrrr�rs
zFirewallZone.list_rulescCs0|jj|�}|j|d�}|jjj||||�|S)NrG)rr<r(rZr�)rr/r�r�r�r�rrrr�{szFirewallZone.add_protocolcCs,|jj|�}|j|d�}|jjj||�|S)NrG)rr<r(rZr�)rr/r�r�rrrr��szFirewallZone.remove_protocolcCs(|jj|�}|j|d�}|jjj||�S)NrG)rr<r(rZ�query_protocol)rr/r�r�rrrr	�szFirewallZone.query_protocolcCs&|jj|�}|j|d�}|jjj|�S)NrG)rr<r(rZr�)rr/r�rrrr��szFirewallZone.list_protocolscCs.|jj|�}|jd|�}|jjj|||�|S)NrH)rr<r(rZr�)rr/r�r�r�rrrr��szFirewallZone.add_masqueradecCs*|jj|�}|jd|�}|jjj|�|S)NrH)rr<r(rZr�)rr/r�rrrr��szFirewallZone.remove_masqueradecCs&|jj|�}|jd|�}|jjj|�S)NrH)rr<r(rZr�)rr/r�rrrr��szFirewallZone.query_masqueradec	Cs6|jj|�}|j|d�}|jjj|||||||�|S)NrH)rr<r(rZr�)	rr/r�r��toport�toaddrr�r�r�rrrr��s
zFirewallZone.add_forward_portcCs2|jj|�}|j|d�}|jjj|||||�|S)NrH)rr<r(rZr�)rr/r�r�r
rr�rrrr��sz FirewallZone.remove_forward_portcCs.|jj|�}|j|d�}|jjj|||||�S)NrH)rr<r(rZ�query_forward_port)rr/r�r�r
rr�rrrr�szFirewallZone.query_forward_portcCs&|jj|�}|j|d�}|jjj|�S)NrH)rr<r(rZr�)rr/r�rrrr��szFirewallZone.list_forward_portscCsP|jj|�}|j|d�}|jjj||||�|j|d�}|jjj||||�|S)NrGrH)rr<r(rZr�)rr/�icmpr�r�r�rrrr��szFirewallZone.add_icmp_blockcCsH|jj|�}|j|d�}|jjj||�|j|d�}|jjj||�|S)NrGrH)rr<r(rZr�)rr/r
r�rrrr��szFirewallZone.remove_icmp_blockcCsD|jj|�}|j|d�}|j|d�}|jjj||�oB|jjj||�S)NrGrH)rr<r(rZ�query_icmp_block)rr/r
�p_name_host�
p_name_fwdrrrr�s
zFirewallZone.query_icmp_blockcCsH|jj|�}|j|d�}|j|d�}tt|jjj|�|jjj|���S)NrGrH)rr<r(r)rrZr�)rr/rrrrrr��s
zFirewallZone.list_icmp_blockscCsH|jj|�}|j|d�}|jjj||�|j|d�}|jjj||�|S)NrGrH)rr<r(rZrb)rr/r�r�rrrrb�sz%FirewallZone.add_icmp_block_inversioncCsL|jj|�}|j|d�}|jjj|||�|j|d�}|jjj|||�dS)NrGrH)rr<r(rZr�)rr�r/r�r�rrrr��s
z"FirewallZone._icmp_block_inversioncCsD|jj|�}|j|d�}|jjj|�|j|d�}|jjj|�|S)NrGrH)rr<r(rZr�)rr/r�rrrr��sz(FirewallZone.remove_icmp_block_inversioncCs@|jj|�}|j|d�}|j|d�}|jjj|�o>|jjj|�S)NrGrH)rr<r(rZr�)rr/rrrrrr��s
z'FirewallZone.query_icmp_block_inversionc
	Cs�|j|d�}xT|j|jdD]@}x:|jj�D],}|js:q.|j|||d|d�}|j||�q.WqWxj|j|jdD]V\}}	xL|r�|jj|�gn|jj�D],}|js�q�|j|||d|	d�}|j||�q�WqtWdS)NrHr1r�)r4r7)r9)	r(rr3rr�r�r�r�r�)
rr�r/r�r�r4r�rEr�r9rrr�_forward�s"zFirewallZone._forwardcCsdS)NTr)rrrrZ__forward_idszFirewallZone.__forward_idc	Cs�|jj|�}|jj|�|jj�|j|}|j�}||jdkrRttj	d|��|dkrd|j
�}n|}|jr||jd||�|j
||||�|j|j||�|dkr�|jd�|S)NrYzforward already enabled in '%s'T)rr<Z
check_timeoutr�r�_FirewallZone__forward_idr3rrZALREADY_ENABLEDr$rdr�_FirewallZone__register_forwardr��!_FirewallZone__unregister_forwardr�)	rr/r�r�rgr�r��
forward_idr�rrrras$




zFirewallZone.add_forwardcCs|j||�|jd|<dS)NrY)r�r3)rr�rr�r�rrrZ__register_forward.szFirewallZone.__register_forwardcCs�|jj|�}|jj�|j|}|j�}||jdkrFttjd|��|dkrX|j	�}n|}|j
rp|jd||�|j|j
||�|dkr�|jd�|S)NrYzforward not enabled in '%s'FT)rr<r�rrr3rrZNOT_ENABLEDr$rdrr�rr�)rr/rgr�r�rr�rrrr�2s 




zFirewallZone.remove_forwardcCs||jdkr|jd|=dS)NrY)r3)rr�rrrrZ__unregister_forwardKsz!FirewallZone.__unregister_forwardcCs|j�|j|�dkS)NrY)rr�)rr/rrrr�OszFirewallZone.query_forward)N)N)N)N)NNT)N)N)N)F)F)NNT)N)N)F)rN)rN)rN)rN)rN)rN)NNrN)NN)NN)rN)N)rNN)N)e�__name__�
__module__�__qualname__rJrr!r#r$r(r+r0r6r;r>rTr]r[rfrkrlrxr~r�r�r�r�rjrer�r�r�r�r�r2r_r�r�r�r�r�r�r,r�r8r`r�r�r�r�r�r-r�r�r�r�r�r�r�r�r�r�r�r�r�rr�r�r�rr�rPr�r�rr�r�r�r	r�r�r�r�r�r�rr�r�r�rr�rbr�r�r�rrrarr�rr�rrrrr#s�&



8
(





&


,(



	





		
		

r)"r�rMZfirewall.core.baserrrZfirewall.core.fw_transactionrZfirewall.core.io.policyrZfirewall.core.loggerrr�rr	r
rrr
rrrZfirewall.functionsrrrZfirewallrZfirewall.errorsrZfirewall.fw_typesr�objectrrrrr�<module>s,ipXtables.cpython-36.opt-1.pyc000064400000104137151730727350012104 0ustar003

��g���@s(ddlZddlZddlmZddlmZddlmZm	Z	m
Z
mZmZm
Z
mZmZddlmZddlmZmZmZmZmZddlmZmZmZmZmZmZmZddl Z dZ!d	d
dgdd
gdd
d	d
dgdd
d
gd	d
dgd�Z"ddd�Z#ddd�Z$dd�Z%dd�Z&dd�Z'Gdd�de(�Z)Gdd�de)�Z*dS)�N)�runProg)�log)�tempFile�readfile�	splitArgs�	check_mac�portStr�check_single_address�
check_address�normalizeIP6)�config)�
FirewallError�INVALID_PASSTHROUGH�INVALID_RULE�
UNKNOWN_ERROR�INVALID_ADDR)�Rich_Accept�Rich_Reject�	Rich_Drop�	Rich_Mark�Rich_Masquerade�Rich_ForwardPort�Rich_IcmpBlock��INPUT�OUTPUT�FORWARD�
PREROUTING�POSTROUTING)�security�raw�mangle�nat�filterzicmp-host-prohibitedzicmp6-adm-prohibited)�ipv4�ipv6�icmpz	ipv6-icmpcCs�ddddddd�}|dd�}x~|D]v}y|j|�}Wntk
rLw$YnX|d
kr�yt||d	�Wntk
r~YnX|j|d	�||||<q$W|S)z Inverse valid rule z-Dz--deletez-Xz--delete-chain)z-Az--appendz-Iz--insertz-Nz--new-chainN�-I�--insert�)r'r()�index�	Exception�int�pop)�args�replace_args�ret_args�arg�idx�r3�/usr/lib/python3.6/ipXtables.py�common_reverse_rule9s(
r5cCs�ddddddd�}|dd�}x�|D]x}y|j|�}Wntk
rLw$YnX|dkr�yt||d	�Wntk
r~YnX|j|d	�||||<|SWttd
��dS)z Reverse valid passthough rule z-Dz--deletez-Xz--delete-chain)z-Az--appendz-Iz--insertz-Nz--new-chainN�-I�--insertr)zno '-A', '-I' or '-N' arg)r6r7)r*�
ValueErrorr,r-r
r)r.r/r0�xr2r3r3r4�common_reverse_passthrough^s,
r:cCs�t|�}tddddddddd	d
ddd
dddddddg�}t||@�dkrbttdt||@�d��tddddddg�}t||@�dkr�ttd��dS)zZ Check if passthough rule is valid (only add, insert and new chain
    rules are allowed) z-Cz--checkz-Dz--deletez-Rz	--replacez-Lz--listz-Sz--list-rulesz-Fz--flushz-Zz--zeroz-Xz--delete-chainz-Pz--policyz-Ez--rename-chainrzarg '%s' is not allowedz-Az--appendz-Iz--insertz-Nz--new-chainzno '-A', '-I' or '-N' argN)�set�lenr
r�list)r.Znot_allowedZneededr3r3r4�common_check_passthrough�s*

r>c@s�eZdZdZdZdZdd�Zdd�Zdd�Zd	d
�Z	dd�Z
d
d�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd �Zdhd"d#�Zd$d%�Zd&d'�Zd(d)�Zd*d+�Zdid,d-�Zd.d/�Zdjd1d2�Zd3d4�Zd5d6�Zdkd8d9�Zdld:d;�Z d<d=�Z!d>d?�Z"d@dA�Z#dBdC�Z$dDdE�Z%dFdG�Z&dHdI�Z'dJdK�Z(dLdM�Z)dNdO�Z*dPdQ�Z+dmdRdS�Z,dndTdU�Z-dodVdW�Z.dXdY�Z/dpdZd[�Z0dqd\d]�Z1drd^d_�Z2dsd`da�Z3dbdc�Z4ddde�Z5dfdg�Z6d!S)t�	ip4tablesr$TcCsd||_tj|j|_tjd|j|_|j�|_|j�|_	|j
�g|_i|_i|_
g|_i|_dS)Nz
%s-restore)�_fwrZCOMMANDS�ipv�_command�_restore_command�_detect_wait_option�wait_option�_detect_restore_wait_option�restore_wait_option�fill_exists�available_tables�rich_rule_priority_counts�policy_priority_counts�zone_source_index_cache�
our_chains)�self�fwr3r3r4�__init__�s

zip4tables.__init__cCs$tjj|j�|_tjj|j�|_dS)N)�os�path�existsrBZcommand_existsrCZrestore_command_exists)rNr3r3r4rH�szip4tables.fill_existscCs�|jr(|j|kr(|jgdd�|D�}ndd�|D�}tjd|j|jdj|��t|j|�\}}|dkr�td|jdj|�|f��|S)NcSsg|]}d|�qS)z%sr3)�.0�itemr3r3r4�
<listcomp>�sz#ip4tables.__run.<locals>.<listcomp>cSsg|]}d|�qS)z%sr3)rTrUr3r3r4rV�sz	%s: %s %s� rz'%s %s' failed: %s)rEr�debug2�	__class__rB�joinrr8)rNr.Z_args�status�retr3r3r4Z__run�szip4tables.__runc
Cs<y|j|�}Wntk
r"dSX||||d�<dSdS)NF�T)r*r8)rN�rule�patternZreplacement�ir3r3r4�
_rule_replace�szip4tables._rule_replacecCs|tko|t|kS)N)�BUILT_IN_CHAINS)rNrA�table�chainr3r3r4�is_chain_builtin�szip4tables.is_chain_builtincCs2d|g}|r|jd�n
|jd�|j|�|gS)Nz-tz-Nz-X)�append)rN�addrcrdr^r3r3r4�build_chain_rules�s

zip4tables.build_chain_rulescCs8d|g}|r |d|t|�g7}n|d|g7}||7}|S)Nz-tz-Iz-D)�str)rNrgrcrdr*r.r^r3r3r4�
build_rule�szip4tables.build_rulecCst|�S)N)r5)rNr.r3r3r4�reverse_rule�szip4tables.reverse_rulecCst|�dS)N)r>)rNr.r3r3r4�check_passthrough�szip4tables.check_passthroughcCst|�S)N)r:)rNr.r3r3r4�reverse_passthrough�szip4tables.reverse_passthroughcCs�d}y|jd�}Wntk
r&YnXt|�|dkrD||d}d}xLd
D]D}y|j|�}Wntk
rtYqNXt|�|dkrN||d}qNW||fS)Nr#z-tr]�-A�--append�-I�--insert�-N�--new-chain)rnrorprqrrrs)r*r8r<)rNr.rcr`rd�optr3r3r4�passthrough_parse_table_chain�s$z'ip4tables.passthrough_parse_table_chaincCs4yH|jd�}|j|�|j|�}d|dkr:||df}n||df}WnFtk
r�y|jd�}|j|�d}Wntk
r�dSXYnXd}|ddkr�d}|r�|r�||kr�|j|�nn|�r0|�r�||kr�|j|�|jdd
�d�|j|�}n|jj�rd}nt|�}d|d<|j	dd|d�dS)Nz%%ZONE_SOURCE%%z-m���z%%ZONE_INTERFACE%%Tr�-D�--deleteFcSs|dS)Nrr3)r9r3r3r4�<lambda>&sz4ip4tables._run_replace_zone_source.<locals>.<lambda>)�keyz-Ir)z%dr])ryrz)
r*r-r8�removerf�sortr@�_allow_zone_driftingr<�insert)rNr^rLr`�zoneZzone_source�rule_addr*r3r3r4�_run_replace_zone_source	s>







z"ip4tables._run_replace_zone_sourcecCsy|j|�}Wntk
r$Y�n�Xd}d}d}|j|�|j|�}t|�tkr\ttd��d}	xLdD]D}
y|j|
�}Wntk
r�YqfXt|�|dkrf||d}	qfWxhdD]`}
y|j|
�}Wntk
r�Yq�Xt|�|dk�r�||d}|
dk�rd}|
dkr�d}q�W|	|f}|�sp||k�sP|||k�sP|||dk�rZttd��|||d8<n�||k�r�i||<|||k�r�d|||<d}
xHt	||j
��D]4}||k�r�|�r�P|
|||7}
||k�r�P�q�W|||d7<d
||<|j|dd|
�dS)a
        Change something like
          -t filter -I public_IN %%RICH_RULE_PRIORITY%% 123
        or
          -t filter -A public_IN %%RICH_RULE_PRIORITY%% 321
        into
          -t filter -I public_IN 4
        or
          -t filter -I public_IN
        TFr]z%priority must be followed by a numberr#�-t�--table�-A�--append�-I�--insert�-D�--deleterz*nonexistent or underflow of priority countr)z%dN���)r�r�)r�r�r�r�r�r�)r�r�)r�r�)r*r8r-�typer,r
rr<r�sorted�keysr�)rNr^Zpriority_counts�tokenr`r�r�Zinsert_add_index�priorityrcrt�jrdr*�pr3r3r4�_set_rule_replace_priority2sj








z$ip4tables._set_rule_replace_prioritycCsPt�}i}tj|j�}tj|j�}tj|j�}�x�|D�]�}|dd�}	|j|	dddt|jg�|j|	dt	|jg�y|	j
d�}
Wntk
r�Yn8X|dkr�q6|d$kr�d
dd|g|	|
|
d
�<n
|	j|
�|j
|	|d�|j
|	|d�|j|	|�d}xZd%D]R}y|	j
|�}
Wntk
�r,Yn(Xt|	�|
d
k�r|	j|
�|	j|
�}�qWxhtt|	��D]X}
xPtjD]F}
|
|	|
k�rt|	|
jd��o�|	|
jd��rtd|	|
|	|
<�qtW�qhW|j|g�j|	�q6WxR|D]J}||}|jd|�x"|D]}	|jdj|	�d��qW|jd��q�W|j�tj|j�}tjd|j|j d|j|j!f�g}|j"�rz|j|j"�|jd�t#|j ||jd�\}}tj$�dk�r
t%|j�}|dk	�r
d
}
xH|D]@}tj&d|
|fd
dd �|jd��s�tj&d!d
d"�|
d
7}
�q�Wtj'|j�|dk�r:td#|j dj|�|f��||_||_||_dS)&Nz
%%REJECT%%�REJECTz
--reject-withz%%ICMP%%z%%LOGTYPE%%�off�unicast�	broadcast�	multicastz-m�pkttypez
--pkt-typer]z%%RICH_RULE_PRIORITY%%z%%POLICY_PRIORITY%%r#�-t�--table�"z"%s"z*%s
rW�
zCOMMIT
z	%s: %s %sz%s: %dz-n)�stdinr)z%8d: %sr)�nofmt�nlr)r�z'%s %s' failed: %s)r�r�r�)r�r�)(r�copy�deepcopyrJrKrLra�DEFAULT_REJECT_TYPErA�ICMPr*r8r-r�r�r<�range�stringZ
whitespace�
startswith�endswith�
setdefaultrf�writerZ�closerQ�stat�namerrXrYrC�st_sizerGrZgetDebugLogLevelrZdebug3�unlink)rN�rules�
log_denied�	temp_fileZtable_rulesrJrKrLZ_ruler^r`rcrt�cr�r.r[r\�lines�liner3r3r4�	set_rules�s�









zip4tables.set_rulesc
Cs�|j|dddt|jg�|j|dt|jg�y|jd�}Wntk
rRYn:X|dkr`dS|dkr�ddd
|g|||d�<n
|j|�tj|j	�}tj|j
�}tj|j�}|j||d�|j||d�|j
||�|j|�}||_	||_
||_|S)Nz
%%REJECT%%r�z
--reject-withz%%ICMP%%z%%LOGTYPE%%r�rr�r�r�z-mr�z
--pkt-typer]z%%RICH_RULE_PRIORITY%%z%%POLICY_PRIORITY%%)r�r�r�)rar�rAr�r*r8r-r�r�rJrKrLr�r��_ip4tables__run)rNr^r�r`rJrKrL�outputr3r3r4�set_rule�s.

zip4tables.set_ruleNcCs�g}|r|gntj�}xx|D]p}||jkr6|j|�qy,|jd|ddg�|jj|�|j|�Wqtk
r�tjd|j|f�YqXqW|S)Nz-tz-Lz-nzA%s table '%s' does not exist (or not enough permission to check).)	rbr�rIrfr�r8r�debug1rA)rNrcr\Ztablesr3r3r4�get_available_tabless

zip4tables.get_available_tablescCs`d}t|jdddg�}|ddkr\d}t|jdddg�}|ddkrHd}tjd|j|j|�|S)Nrz-wz-Lz-nrz-w10z%s: %s will be using %s option.)rrBrrXrY)rNrEr\r3r3r4rDszip4tables._detect_wait_optioncCs�t�}|jd�|j�d}xJdD]B}t|j|g|jd�}|ddkr"d|dkr"d	|dkr"|}Pq"Wtjd
|j|j|�t	j
|j�|S)Nz#foor�-w�--wait=2)r�rzinvalid optionr]zunrecognized optionz%s: %s will be using %s option.)r�r�)rr�r�rrCr�rrXrYrQr�)rNr�rEZtest_optionr\r3r3r4rF"s

z%ip4tables._detect_restore_wait_optioncCsVi|_i|_g|_g}x:tj�D].}|j|�s0q xdD]}|jd||g�q6Wq W|S)N�-F�-X�-Zz-t)r�r�r�)rJrKrLrbr�r�rf)rNr�rc�flagr3r3r4�build_flush_rules5s

zip4tables.build_flush_rulescCsfg}|dkrdn|}xLtj�D]@}|j|�s.q|dkr8qx$t|D]}|jd|d||g�qBWqW|S)NZPANIC�DROPr"z-tz-P)rbr�r�rf)rN�policyr��_policyrcrdr3r3r4�build_set_policy_rulesDs
z ip4tables.build_set_policy_rulescCs g}d}y"|jd|jdkrdnddg�}WnJtk
rt}z.|jdkrVtjd|�ntjd|�WYd	d	}~XnX|j�}d
}x�|D]�}|r�|j�j�}|j�}xD|D]<}	|	j	d�r�|	j
d�r�|	d
d�}
n|	}
|
|kr�|j|
�q�W|jdko�|j	d��s|jdkr�|j	d�r�d}q�W|S)zQReturn ICMP types that are supported by the iptables/ip6tables command and kernelrz-pr$r&z	ipv6-icmpz--helpziptables error: %szip6tables error: %sNF�(�)r]zValid ICMP Types:r%zValid ICMPv6 Types:Tr�)r�rAr8rr��
splitlines�strip�lower�splitr�r�rf)rNrAr\r�Zexr�Zin_typesr�Zsplitsr�r9r3r3r4�supported_icmp_typesPs4
 

zip4tables.supported_icmp_typescCsgS)Nr3)rNr3r3r4�build_default_tablesqszip4tables.build_default_tablesr�c	Csi}|jd�rpg|d<t�|jd<xLtdD]@}|djd|�|djd||f�|jdjd|�q,W|jd��r\g|d<t�|jd<x�tdD]�}|djd|�|djd||f�|jdjd|�|dkr�xt|jjr�ddd	d
gndd	d
gD]R}|djd||f�|djd|||f�|jdjtd
||fg���qWq�W|jd��rNg|d<t�|jd<x�tdD]�}|djd|�|djd||f�|jdjd|�|dk�r�xv|jj�r�ddd	d
gndd	d
gD]R}|djd||f�|djd|||f�|jdjtd
||fg���q�W�q�W|jd��r@g|d<t�|jd<x�tdD]�}|djd|�|djd||f�|jdjd|�|d9k�rxxv|jj�r�ddd	d
gndd	d
gD]R}|djd||f�|djd|||f�|jdjtd
||fg���q�W�qxWg|d<t�|jd<|djd�|djd�|djd�|djd�|jdjtd��xf|jj�r�ddd	d
gndd	d
gD]B}|djd|�|djd|�|jdjtd|���q�W|dk�r |djd�|djd�|dk�rF|djd�|djd�|djd�|djd �|djd!�|djd"�|jdjtd#��xJd:D]B}|djd$|�|djd%|�|jdjtd&|���q�Wxzd;D]r}xj|jj�r
dd	gnd	gD]N}|djd)||f�|djd*||f�|jdjtd+||f���qW�q�WxJd<D]B}|djd$|�|djd%|�|jdjtd&|���qnW|dk�r�|djd,�|djd-�|dk�r�|djd.�|djd/�|dd0d1d2d3g7<|jdjtd4��xJd=D]B}|djd5|�|djd6|�|jdjtd7|���q2WxJd>D]B}|djd5|�|djd6|�|jdjtd7|���q~Wg}xJ|D]B}||j�k�r�q�x(||D]}|jd8|gt	|���q�W�q�W|S)?Nrz-N %s_directz-A %s -j %s_directz	%s_directr r�POLICIES_preZZONES_SOURCEZZONES�
POLICIES_postz-N %s_%sz-A %s -j %s_%sz%s_%sr!r"rr#zB-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED,DNAT -j ACCEPTz-A INPUT -i lo -j ACCEPTz-N INPUT_directz-A INPUT -j INPUT_directZINPUT_directz-N INPUT_%sz-A INPUT -j INPUT_%szINPUT_%sr�z^-A INPUT -m conntrack --ctstate INVALID %%LOGTYPE%% -j LOG --log-prefix 'STATE_INVALID_DROP: 'z/-A INPUT -m conntrack --ctstate INVALID -j DROPz9-A INPUT %%LOGTYPE%% -j LOG --log-prefix 'FINAL_REJECT: 'z-A INPUT -j %%REJECT%%zD-A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED,DNAT -j ACCEPTz-A FORWARD -i lo -j ACCEPTz-N FORWARD_directz-A FORWARD -j FORWARD_directZFORWARD_directz
-N FORWARD_%sz-A FORWARD -j FORWARD_%sz
FORWARD_%s�IN�OUTz-N FORWARD_%s_%sz-A FORWARD -j FORWARD_%s_%sz
FORWARD_%s_%sz`-A FORWARD -m conntrack --ctstate INVALID %%LOGTYPE%% -j LOG --log-prefix 'STATE_INVALID_DROP: 'z1-A FORWARD -m conntrack --ctstate INVALID -j DROPz;-A FORWARD %%LOGTYPE%% -j LOG --log-prefix 'FINAL_REJECT: 'z-A FORWARD -j %%REJECT%%z-N OUTPUT_directz>-A OUTPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPTz-A OUTPUT -o lo -j ACCEPTz-A OUTPUT -j OUTPUT_directZ
OUTPUT_directz-N OUTPUT_%sz-A OUTPUT -j OUTPUT_%sz	OUTPUT_%sz-t)rr)r�)r�r�)r�)r�)r�)
r�r;rMrbrfrgr@r�updater)	rNr�Z
default_rulesrdZdispatch_suffix�	directionZfinal_default_rulesrcr^r3r3r4�build_default_rulesus�
$(
&*
&*&



(






"zip4tables.build_default_rulescCsf|dkrdddhS|dkr,d|j�kr,dhS|dkrHd|j�krHddhS|d	krbd	|j�krbdhSiS)
Nr#r�
FORWARD_IN�FORWARD_OUTr!rr"rr )r�)rNrcr3r3r4�get_zone_table_chains�s
zip4tables.get_zone_table_chainsc	s�|jjj|���jdkrdnd��dkr4�dkr4dnd}	|jjj|�t|	��g}
g}x|D]}|
jd|g�qZWx|D]}|jd	|g�qvWxB|D]:}
|jjj|
�}|dkr�|j	|�r�q�|
j|j
d|
��q�Wx\|D]T}
|jjj|
�}|dk�r|j	|��rq�t|
��r�dk�rq�|j|j
d|
��q�W������fdd�}g}|
�r�x�|
D]F}|�r�x8|D]}|j|||���qdWn|�r�n|j||d���qTWnH|�r�n@|�r�x8|D]}|j|d|���q�Wn|�r�n|j|dd��|S)Nr�pre�postr"rTFz-iz-or$r%z-sr�rz-dcsVddd��}d�|d��fd�jg}|r6|j|�|rD|j|�|jd�g�|S)Nz-Az-D)TFz-tz%s_POLICIES_%sz%%POLICY_PRIORITY%%z-j)r��extend)�ingress_fragment�egress_fragment�add_delr^)r�rd�chain_suffix�enable�p_objrcr3r4�_generate_policy_dispatch_rules


zSip4tables.build_policy_ingress_egress_rules.<locals>._generate_policy_dispatch_rule)r$r%)r$r%)rr�r)r@r�Z
get_policyr��policy_base_chain_name�POLICY_CHAIN_PREFIXrfr�Zcheck_source�is_ipv_supported�_rule_addr_fragmentr)rNr�r�rcrdZingress_interfacesZegress_interfacesZingress_sourcesZegress_sources�isSNATZingress_fragmentsZegress_fragments�	interface�addrrAr�r�r�r�r3)r�rdr�r�r�rcr4�!build_policy_ingress_egress_rules�sR






z+ip4tables.build_policy_ingress_egress_rulesFc
Cs�|dkr|dkrdnd}|jjj||t|d�}	ddddddd�|}
d	}|rb|rbd
d|dg}n,|rtd
d|g}ndd|g}|s�|dg7}|d||
|||	g7}|gS)Nr"rTF)r�z-iz-o)rrrr�r�rz-gz-Iz%s_ZONESz%%ZONE_INTERFACE%%z-Az-Dz-t)r@r�r�r�)
rNr�r�r�r�rcrdrfr�r�rt�actionr^r3r3r4�!build_zone_source_interface_rulesKs&

z+ip4tables.build_zone_source_interface_rulescCs�|jd�rP|dd�}|dkr$d}nd}dj|g|jjj|��}ddd	||gSt|�rz|dkrjttd
��ddd|j�gSt	d
|�r�t
|�}n,td
|�r�|jd�}t
|d�d|d}||gSdS)Nzipset:�z-d�dst�src�,z-mr;z--match-setzCan't match a destination MAC.�macz--mac-sourcer%�/rr])
r�rZr@�ipsetZ
get_dimensionrr
r�upperr	rr
r�)rNrt�address�invertr��flags�
addr_splitr3r3r4r�es"





zip4tables._rule_addr_fragmentc
Cs�ddd�|}|dkr"|dkr"dnd}|jjj||t|d�}	d	d
d	d	d
d
d�|}
|jjrdd|}nd
|}t|�r�|dkr�gS||d|d|g}|j|j|
|��|jd|	g�|gS)Nz-Iz-D)TFr"rTF)r�z-sz-d)rrrr�r�rz%s_ZONES_SOURCEz%s_ZONESr�rz%%ZONE_SOURCE%%z-tz-g)rr�r)r@r�r�r�rrr�r�)
rNr�r�r�r�rcrdr�r�r�rtZzone_dispatch_chainr^r3r3r4�build_zone_source_address_rules{s&
z)ip4tables.build_zone_source_address_rulescCs>ddd�|}ddd�|}|dkr0|dkr0dnd	}|jjj||t|d
�}|j|jt|d|d|d
|d|d|g��g}	|	j||d|g�|	j|d
|d|g�|	j|d|d|g�|	j|d|d|g�|	j|d|d|g�|	j|d|d|g�|	j||d|dd
|g�|	j||d|dd|g�|	j||d|dd|g�|	j||d|dd|g�|	j||d|dd|g�|jjj|j	}
|jj
�dk�r|dk�r|
dk�r�|	j||d|ddddd|g	�|
dk�r|	j||d|ddddd|g	�|dk�r,|
dk�r,|	j||d|d|
g�|�s:|	j�|	S)Nz-Nz-X)TFz-Az-Dr"rTF)r�z%s_logz%s_denyz%s_prez%s_postz%s_allowz-tz-jr�r#r��
%%REJECT%%z%%LOGTYPE%%�LOGz--log-prefixz
"%s_REJECT: "r�z"%s_DROP: "�ACCEPT)r�r�)r�r�r�r�)r@r�r�r�rMr�r;rfZ	_policies�target�get_log_denied�reverse)rNr�r�rcrdZ
add_del_chainZadd_del_ruler�r�r�r�r3r3r4�build_policy_chain_rules�sN




z"ip4tables.build_policy_chain_rulescCs2|sgSddd|jg}|jdk	r.|d|jg7}|S)Nz-m�limitz--limitz
--limit-burst)�valueZburst)rNr�sr3r3r4�_rule_limit�s
zip4tables._rule_limitcCs�t|j�tttgkrn<|jrHt|j�tttt	gkrRt
tdt|j���n
t
td��|jdkr�t|j�ttgks�t|j�tt	gkr�dSt|j�tgks�t|j�ttgkr�dSn|jdkr�dSdSdS)NzUnknown action %szNo rule action specified.r�allowZdenyr�r�)
r��elementrrrr�rrrrr
rr�)rN�	rich_ruler3r3r4�_rich_rule_chain_suffix�s 


z!ip4tables._rich_rule_chain_suffixcCs>|jr|jrttd��|jdkr(dS|jdkr6dSdSdS)NzNot log or auditrrr�r�)r�auditr
rr�)rNrr3r3r4� _rich_rule_chain_suffix_from_log�s


z*ip4tables._rich_rule_chain_suffix_from_logcCs|jdkrgSd|jgS)Nrz%%RICH_RULE_PRIORITY%%)r�)rNrr3r3r4�_rich_rule_priority_fragment�s
z&ip4tables._rich_rule_priority_fragmentc
Cs�|js
gS|jjj||t�}ddd�|}|j|�}d||d||fg}	|	|j|�7}	|	|ddg7}	|jjr�|	dd	|jjg7}	|jjr�|	d
d|jjg7}	|	|j	|jj
�7}	|	S)Nz-Az-D)TFz-tz%s_%sz-jr�z--log-prefixz'%s'z--log-levelz%s)rr@r�r�r�rr�prefix�levelrr)
rNr�rr�rc�
rule_fragmentr�r�r�r^r3r3r4�_rich_rule_log�s
zip4tables._rich_rule_logcCs�|js
gSddd�|}|jjj||t�}|j|�}d||d||fg}	|	|j|�7}	|	|7}	t|j�t	krrd}
n,t|j�t
kr�d}
nt|j�tkr�d}
nd	}
|	d
dd|
g7}	|	|j|jj
�7}	|	S)
Nz-Az-D)TFz-tz%s_%sZacceptZrejectZdrop�unknownz-jZAUDITz--type)r
r@r�r�r�rrr�r�rrrrr)rNr�rr�rcrr�r�r�r^Z_typer3r3r4�_rich_rule_audits$
zip4tables._rich_rule_auditcCs2|js
gSddd�|}|jjj||t�}|j|�}d||f}	t|j�tkrXddg}
n�t|j�tkr�ddg}
|jjr�|
d|jjg7}
nnt|j�t	kr�dd	g}
nVt|j�t
kr�d
}|jjj||t�}d||f}	ddd|jjg}
ntt
d
t|j���d|||	g}||j|�7}|||
7}||j|jj�7}|S)Nz-Az-D)TFz%s_%sz-jr�r�z
--reject-withr�r!�MARKz--set-xmarkzUnknown action %sz-t)r�r@r�r�r�r	r�rrrrr;r
rrrr)rNr�rr�rcrr�r�r�rdZrule_actionr^r3r3r4�_rich_rule_action$s4


zip4tables._rich_rule_actioncCs�|sgSg}|jr�|jr"|jd�td|j�rB|dt|j�g7}q�td|j�r||jjd�}|dt|d�d|dg7}q�|d|jg7}nD|jr�|ddg7}|jr�|jd�|jj	j
|jd	�}|d
|j|g7}|S)N�!r%z-dr�rr]z-mr;r�z--match-set)r�r�rfr	rr
r�r�r@r��_ipset_match_flags)rNZ	rich_destrr�r�r3r3r4�_rich_rule_destination_fragmentFs&
"
z)ip4tables._rich_rule_destination_fragmentcCs|sgSg}|jr�|jr"|jd�td|j�rB|dt|j�g7}nHtd|j�r||jjd�}|dt|d�d|dg7}n|d|jg7}n�t|d�r�|jr�|ddg7}|jr�|jd�|d	|jg7}nPt|d
�o�|j	�r|ddg7}|jr�|jd�|j
jj|j	d�}|d
|j	|g7}|S)Nrr%z-sr�rr]r�z-mz--mac-sourcer�r;r�z--match-set)
r�r�rfr	rr
r��hasattrr�r�r@r�r)rNZrich_sourcerr�r�r3r3r4�_rich_rule_source_fragment^s0
"

z$ip4tables._rich_rule_source_fragmentcCsddd�|}d}|jjj||t�}	d|g}
|rD|
ddt|�g7}
|rT|
d|g7}
|rx|
|j|j�7}
|
|j|j�7}
|s�t	|j
�tkr�|
d	d
ddg7}
g}|r�|j|j
|||||
��|j|j|||||
��|j|j|||||
��n"|j|d
|	d|g|
ddg�|S)Nz-Az-D)TFr#z-pz--dportz%sz-dz-m�	conntrackz	--ctstatez
NEW,UNTRACKEDz%s_allowz-tz-jr�)r@r�r�r�rr�destinationr�sourcer�r�rrfrrr)rNr�r��proto�portrrr�rcr�rr�r3r3r4�build_policy_ports_rules{s*z"ip4tables.build_policy_ports_rulescCs�ddd�|}d}|jjj||t�}d|g}	|r<|	d|g7}	|r`|	|j|j�7}	|	|j|j�7}	|stt|j	�t
kr�|	ddd	d
g7}	g}
|r�|
j|j|||||	��|
j|j
|||||	��|
j|j|||||	��n"|
j|d|d|g|	d
dg�|
S)Nz-Az-D)TFr#z-pz-dz-mrz	--ctstatez
NEW,UNTRACKEDz%s_allowz-tz-jr�)r@r�r�r�rrrrr�r�rrfrrr)rNr�r��protocolrrr�rcr�rr�r3r3r4�build_policy_protocol_rules�s&z%ip4tables.build_policy_protocol_rulescCsddd�|}d}|jjj||t�}	d|g}
|rD|
ddt|�g7}
|rT|
d|g7}
|rx|
|j|j�7}
|
|j|j�7}
|s�t	|j
�tkr�|
d	d
ddg7}
g}|r�|j|j
|||||
��|j|j|||||
��|j|j|||||
��n"|j|d
|	d|g|
ddg�|S)Nz-Az-D)TFr#z-pz--sportz%sz-dz-mrz	--ctstatez
NEW,UNTRACKEDz%s_allowz-tz-jr�)r@r�r�r�rrrrrr�r�rrfrrr)rNr�r�rrrrr�rcr�rr�r3r3r4�build_policy_source_ports_rules�s*z)ip4tables.build_policy_source_ports_rulescCsvd}|jjj||t�}	ddd�|}
|
d|	ddd|g}|rP|dd	t|�g7}|r`|d
|g7}|ddd
|g7}|gS)Nr z-Az-D)TFz%s_allowz-tz-pz--dportz%sz-dz-jZCTz--helper)r@r�r�r�r)rNr�r�rrrZhelper_nameZmodule_short_namercr�r�r^r3r3r4�build_policy_helper_ports_rules�sz)ip4tables.build_policy_helper_ports_rulesc
	Cs�ddd�|}|jjj||t�}g}	|rH|	jdd|d|d|dd	g�n6t|�rTgS|	jdd|d|g|jd
|�dd	g�|	S)Nz-Az-D)TFz-tr#z%s_allowz-oz-jr�z-d)r@r�r�r�rfrr�)
rNr�r�r�rcr�rr�r�r�r3r3r4�build_zone_forward_rules�sz"ip4tables.build_zone_forward_rulesc
Cs,d}|jjj||tdd�}ddd�|}g}|rj|j|�}||j|�7}||j|j�7}||j|j	�7}nd}g}	|	j
dd|d	||fg|d
ddd
dg�g}|r�|j|�}||j|�7}||j|j�7}||j|j	�7}nd}d}|jjj||t�}|	j
dd|d	||fg|ddddd
dg�|	S)Nr"T)r�z-Az-D)TFrz-tz%s_%srz-o�loz-jZ
MASQUERADEr#z-mrz	--ctstatez
NEW,UNTRACKEDr�)r@r�r�r�r	rrrrrrf)
rNr�r�rrcr�r�rr�r�r3r3r4�build_policy_masquerade_rules�s6

z'ip4tables.build_policy_masquerade_rulesc
Cs
d}|jjj||t�}	ddd�|}
d}|rPtd|�rH|dt|�7}n||7}|rn|dkrn|dt|d	�7}g}|r�|j|�}
|j|�}||j	|j
�7}||j|j�7}nd
}
g}|r�|j
|j|||d|��|j
dd|
d|	|
fg|d
|dt|�ddd|g�|S)Nr"z-Az-D)TFrr%z[%s]z:%s�-rz-tz%s_%sz-pz--dportz-jZDNATz--to-destination)r@r�r�r�r	rrr	rrrrrrfr)rNr�r�rr ZtoportZtoaddrrrcr�r�Ztorr�r�r3r3r4�build_policy_forward_port_ruless2


z)ip4tables.build_policy_forward_port_rulescCs�d}|jjj||t�}ddd�|}|jdkrFddg}ddd	|jg}	ndd
g}ddd|jg}	g}
|jjj|�r|d
|}d}nd|}d}g}
|r�|
|j|j�7}
|
|j	|j
�7}
|
||	7}
|�rP|
j|j|||||
��|
j|j
|||||
��|j�r|
j|j|||||
��n:|j|�}|
jd||d||fg|j|�|
ddg�n`|jj�dk�r�|dk�r�|
j||d|g|
ddddd|g�|
j||d|g|
d|g�|
S)Nr#z-Az-D)TFr$z-pr&z-mz--icmp-typez	ipv6-icmpZicmp6z
--icmpv6-typez%s_allowr�z%s_denyz
%%REJECT%%z-tz%s_%sz-jr�z%%LOGTYPE%%r�z--log-prefixz"%s_ICMP_BLOCK: ")r@r�r�r�rAr��query_icmp_block_inversionrrrrrfrrr�rr	rr�)rNr�r�Zictrrcr�r�r�matchr�Zfinal_chainZfinal_targetrr�r3r3r4�build_policy_icmp_block_rules3sJ

 z'ip4tables.build_policy_icmp_block_rulesc	Cs�d}|jjj||t�}g}d}|jjj|�r�d}|jj�dkr�|rRd|t|�g}nd|g}|d|dd	d
ddd
d|g	}|j|�|d7}nd}|r�d|t|�g}nd|g}|d|dd	d|g}|j|�|S)Nr#r�z
%%REJECT%%r�z-Iz-Dz-tz-pz%%ICMP%%z%%LOGTYPE%%z-jr�z--log-prefixz"%s_ICMP_BLOCK: "r]r�)r@r�r�r�r)r�rirf)	rNr�r�rcr�r�Zrule_idxZ
ibi_targetr^r3r3r4�'build_policy_icmp_block_inversion_rulesds.



z1ip4tables.build_policy_icmp_block_inversion_rulescCsxd}g}||j|j�7}||j|j�7}g}|j|j|||||��|j|j|||||��|j|j|||||��|S)Nr#)rrrrrfrrr)rNr�r�rrcrr�r3r3r4�*build_policy_rich_source_destination_rules�sz4ip4tables.build_policy_rich_source_destination_rulescCs
||jkS)N)rA)rNrAr3r3r4r��szip4tables.is_ipv_supported)N)N)r�)F)F)NN)NN)NN)NN)N)N)N)7�__name__�
__module__�__qualname__rAr�Zpolicies_supportedrPrHr�rarerhrjrkrlrmrur�r�r�r�r�rDrFr�r�r�r�r�r�r�r�r�r�rrr	rrrrrrrrr!r"r#r$r&r(r+r,r-r�r3r3r3r4r?�sh

			)Pa#

!
zN

0"




&
!
1"r?c@s&eZdZdZdZddd�Zdd�ZdS)	�	ip6tablesr%Fc
Cs�g}|jddddddddd	d
g
�|dkrL|jddddddddd	dd
dg�|jdddddddd	dg	�|jdddddddd	dg	�|S)Nz-Irz-tr!z-mZrpfilterz--invertz--validmarkz-jr�r�r�z--log-prefixzrpfilter_DROP: z-pz	ipv6-icmpz$--icmpv6-type=neighbour-solicitationr�z"--icmpv6-type=router-advertisement)rf)rNr�r�r3r3r4�build_rpfilter_rules�s$



zip6tables.build_rpfilter_rulescCs�ddddddddd	g	}d
}|jdj|�g}|jddd
|g�xT|D]L}|jddd|d|ddddg
�|jjdkrF|jddd|d|ddddg
�qFW|jdddddd|g�|jdddddd|g�|S)Nz::0.0.0.0/96z::ffff:0.0.0.0/96z2002:0000::/24z2002:0a00::/24z2002:7f00::/24z2002:ac10::/28z2002:c0a8::/32z2002:a9fe::/32z2002:e000::/19ZRFC3964_IPv4r#z-tz-Nz-Iz-dz-jr�z
--reject-withzaddr-unreachr��allr�z--log-prefixz"RFC3964_IPv4_REJECT: "r�4r)r�r3)rMrgrfr@Z_log_denied)rNZ
daddr_listZ
chain_namer�Zdaddrr3r3r4�build_rfc3964_ipv4_rules�s4



z"ip6tables.build_rfc3964_ipv4_rulesN)F)r.r/r0rAr�r2r5r3r3r3r4r1�s
r1)+Zos.pathrQr�Zfirewall.core.progrZfirewall.core.loggerrZfirewall.functionsrrrrrr	r
rZfirewallrZfirewall.errorsr
rrrrZfirewall.core.richrrrrrrrr�r�rbr�r�r5r:r>�objectr?r1r3r3r3r4�<module>s@($%* xfw_policy.cpython-36.pyc000064400000154111151730727350011202 0ustar003

��g=V�@s�ddlZddlZddlmZddlmZmZmZmZm	Z	m
Z
mZmZm
Z
mZddlmZmZmZmZmZmZmZmZmZmZmZddlmZddlmZddlm Z ddl!m"Z"dd	l#m$Z$Gd
d�de%�Z&dS)�N)�log)
�portStr�checkIPnMask�
checkIP6nMask�
checkProtocol�enable_ip_forwarding�check_single_address�portInPortRange�get_nf_conntrack_short_name�coalescePortRange�breakPortRange)�	Rich_Rule�Rich_Accept�Rich_Service�	Rich_Port�
Rich_Protocol�Rich_Masquerade�Rich_ForwardPort�Rich_SourcePort�Rich_IcmpBlock�
Rich_IcmpType�	Rich_Mark)�FirewallTransaction)�errors)�
FirewallError)�LastUpdatedOrderedDict)�SOURCE_IPSET_TYPESc@s�eZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zdd�Zdd�Z
�ddd�Zdd�Zdd�Zdd�Z�dd d!�Z�d
d"d#�Z�dd$d%�Zd&d'�Zd(d)�Zd*d+�Zd,d-�Z�dd0d1�Zd2d3�Z�dd4d5�Zd6d7�Zd8d9�Zd:d;�Zd<d=�Zd>d?�Z �dd@dA�Z!dBdC�Z"�ddDdE�Z#dFdG�Z$dHdI�Z%dJdK�Z&dLdM�Z'dNdO�Z(dPdQ�Z)dRdS�Z*�ddTdU�Z+dVdW�Z,�ddXdY�Z-dZd[�Z.d\d]�Z/d^d_�Z0d`da�Z1dbdc�Z2�dddde�Z3dfdg�Z4�ddhdi�Z5djdk�Z6dldm�Z7dndo�Z8dpdq�Z9drds�Z:dtdu�Z;dvdw�Z<�ddxdy�Z=dzd{�Z>�dd|d}�Z?d~d�Z@d�d��ZAd�d��ZBd�d��ZCd�d��ZD�dd�d��ZEd�d��ZF�dd�d��ZGd�d��ZHd�d��ZId�d��ZJd�d��ZK�dd�d��ZLd�d��ZM�dd�d��ZNd�d��ZOd�d��ZPd�d��ZQd�d��ZR�dd�d��ZSd�d��ZT�dd�d��ZUd�d��ZVd�d��ZW�dd�d��ZX�d d�d��ZY�d!d�d��ZZd�d��Z[�d"d�d��Z\d�d��Z]�d#d�d��Z^d�d��Z_d�d��Z`d�d��Za�d$d�dÄZbd�dńZc�d%d�dDŽZdd�dɄZed�d˄Zfd�d̈́Zgd�dτZh�d&d�dфZid�dӄZjd�dՄZk�d'd�dׄZld�dلZmd�dۄZnd�d݄Zod�d߄Zpd�d�Zqd�d�Zrd�d�Zsd�d�Ztd�d�Zu�d(d�d�Zv�d)d�d�Zwd�d�Zxd�d�Zyd�d�Zzd�d��Z{�d*d�d��Z|d�d��Z}d�d��Z~d�d��Zd�d��Z��d�d�Z��d�d�Z��d�d�Z��d�d�Z��d+�d	�d
�Z�dS(,�FirewallPolicycCs||_i|_i|_dS)N)�_fw�_chains�	_policies)�self�fw�r#�/usr/lib/python3.6/fw_policy.py�__init__szFirewallPolicy.__init__cCsd|j|j|jfS)Nz
%s(%r, %r))�	__class__rr )r!r#r#r$�__repr__szFirewallPolicy.__repr__cCs|jj�|jj�dS)N)r�clearr )r!r#r#r$�cleanups
zFirewallPolicy.cleanupcCs
t|j�S)N)rr)r!r#r#r$�new_transaction$szFirewallPolicy.new_transactioncCst|jj��S)N)�sortedr �keys)r!r#r#r$�get_policies)szFirewallPolicy.get_policiescCs8g}x*|j�D]}|j|�}|js|j|�qWt|�S)N)r-�
get_policy�derived_from_zone�appendr+)r!Zpolicies�p�p_objr#r#r$�"get_policies_not_derived_from_zone,s
z1FirewallPolicy.get_policies_not_derived_from_zonecCs~g}xt|j�D]h}|j|�}t|d�t|jjj��tddg�B@rt|d�t|jjj��tddg�B@r|j|�qW|S)N�
ingress_zones�HOST�ANY�egress_zones)r3�get_settings�setr�zoneZget_active_zonesr0)r!Zactive_policies�policy�settingsr#r#r$�)get_active_policies_not_derived_from_zone4s
((z8FirewallPolicy.get_active_policies_not_derived_from_zonecCs|jj|�}|j|S)N)r�check_policyr )r!r;r1r#r#r$r.>szFirewallPolicy.get_policycCs,dd�dD�|_||j|j<|j|j�dS)NcSsi|]}t�|�qSr#)r)�.0�xr#r#r$�
<dictcomp>Csz-FirewallPolicy.add_policy.<locals>.<dictcomp>�services�ports�
masquerade�
forward_ports�source_ports�icmp_blocks�rules�	protocols�icmp_block_inversionr4r7)rBrCrDrErFrGrHrIrJr4r7)r<r �name�copy_permanent_to_runtime)r!�objr#r#r$�
add_policyBs
zFirewallPolicy.add_policycCs0|j|}|jr|j|�|jj�|j|=dS)N)r �applied�unapply_policy_settingsr<r()r!r;rMr#r#r$�
remove_policyNs



zFirewallPolicy.remove_policycCs�|j|}|jrdSx|jD]}|j||dd�qWx|jD]}|j||dd�q<Wx|jD]}|j||�q\Wx|jD]}|j	|f|��qxWx|j
D]}|j||�q�Wxf|jD]\}y|j
|f|��Wq�tk
�r}z$|jtjgkr�tj|�n|�WYdd}~Xq�Xq�Wx|jD]}|j||��qWxj|jD]`}y|j|f|��WnDtk
�r�}z&|jtjgk�r�tj|�n|�WYdd}~XnX�q:Wx|jD]}|j||��q�W|j�r�|j|�dS)NF)�allow_apply)r rOr4�add_ingress_zoner7�add_egress_zonerG�add_icmp_blockrE�add_forward_portrB�add_servicerC�add_portr�coder�ALREADY_ENABLEDr�warningrI�add_protocolrF�add_source_portrH�add_rulerD�add_masquerade)r!r;rM�args�errorr#r#r$rLUsB
z(FirewallPolicy.copy_permanent_to_runtimeNcCsNxH|j�D]<}|j|}|jr q
||j�kr
tjd|�|j||d�q
WdS)NzApplying policy '%s')�use_transaction)r-r r/r=rZdebug1�apply_policy_settings)r!rbr;r2r#r#r$�apply_policies|s
zFirewallPolicy.apply_policiescCs|j|}||_dS)N)r rO)r!r;rOrMr#r#r$�set_policy_applied�s
z!FirewallPolicy.set_policy_appliedcCstj�||d�}|S)N)Zdate�sender�timeout)�time)r!rgrf�retr#r#r$Z__gen_settings�szFirewallPolicy.__gen_settingscCs|j|�jS)N)r.r<)r!r;r#r#r$r8�szFirewallPolicy.get_settingscCsj|jj|�}|j|}|r |js.|r2|jr2dS|r<d|_|dkrN|j�}n|}|r�x8|jsh|j|�n|j|�D]\}}|j|d|||�qrW|j	|�}	|js�|j
|||��xV|	D�]L}
�xD|	|
D�]6}|
dkr�|j||||�q�|
dkr�q�q�|
dk�r|j|||f|��q�|
dk�r0|j
||||�q�|
dk�rV|j|||d|d|�q�|
d	k�rr|j||||�q�|
d
k�r�|j|||d|d|�q�|
dk�r�|j|||�q�|
dk�r�|j||t|d
�|�q�|
dk�r�q�q�|
dk�r�q�q�tjd||
|�q�Wq�W|�sRx<|j�s"|j|�n|j|�D]\}}|j|d|||��q,Wd|_|dk�rf|j|�dS)NTrGrJrErBrCr�rIrFrDrH)�rule_strr4r7z5Policy '%s': Unknown setting '%s:%s', unable to applyF)rr>r rOr*r/�%_get_table_chains_for_policy_dispatch�#_get_table_chains_for_zone_dispatch�gen_chain_rulesr8�_ingress_egress_zones�_icmp_block�
_forward_port�_service�_port�	_protocol�_source_port�_masquerade�_FirewallPolicy__ruler
rr[�execute)r!�enabler;rb�_policyrM�transaction�table�chainr<�keyr`r#r#r$�_policy_settings�sj













zFirewallPolicy._policy_settingscCs|jd||d�dS)NT)rb)r)r!r;rbr#r#r$rc�sz$FirewallPolicy.apply_policy_settingscCs|jd||d�dS)NF)rb)r)r!r;rbr#r#r$rP�sz&FirewallPolicy.unapply_policy_settingscCsr|j|�j�}|j|�|j|�|j|�|j|�|j|�|j|�|j|�|j	|�|j
|�|j|�d�
}|jj
||�S)zH
        :return: exported config updated with runtime settings
        )
rBrCrGrDrE�
rich_rulesrIrFr4r7)r.Zexport_config_dict�
list_services�
list_ports�list_icmp_blocks�query_masquerade�list_forward_ports�
list_rules�list_protocols�list_source_ports�list_ingress_zones�list_egress_zonesrZ'combine_runtime_with_permanent_settings)r!r;Z	permanentZruntimer#r#r$�get_config_with_settings_dict�sz,FirewallPolicy.get_config_with_settings_dictcs�ddlm�d
��fdd�	}��fdd�}�j�jf�j�jf�j�jf�j�j	f�j
�jf||f�j�j
f�j�jf�j�jf�j�jfd�
}�j|�}�jj||�\}}	xt|	D]l}
t|	|
t��rxV|	|
D]8}t|t�r�||
d|f|��q�||
d||�q�Wq�||
d|�q�Wx�|D]�}
t||
t��r�xn||
D]J}t|t��rv||
d|f|�d|d	��n||
d||d|d	��qFWn||
d|d|d	��q(WdS)Nr)r
cs�j|�|d�d|d�dS)N)rkr)rgrf)r^)r;rkrgrf)r
r!r#r$�add_rule_wrapper�szFFirewallPolicy.set_config_with_settings_dict.<locals>.add_rule_wrappercs�j|�|d��dS)N)rk)�remove_rule)r;rk)r
r!r#r$�remove_rule_wrapper�szIFirewallPolicy.set_config_with_settings_dict.<locals>.remove_rule_wrapper)
rBrCrGrDrEr�rIrFr4r7rj)rgrf)rN)�firewall.core.richr
rW�remove_servicerX�remove_portrU�remove_icmp_blockr_�remove_masqueraderV�remove_forward_portr\�remove_protocolr]�remove_source_portrS�remove_ingress_zonerT�remove_egress_zoner�rZget_added_and_removed_settings�
isinstance�list�tuple)r!r;r<rfr�r�Z
setting_to_fnZold_settingsZadd_settingsZremove_settingsr~r`r#)r
r!r$�set_config_with_settings_dict�s:











  z,FirewallPolicy.set_config_with_settings_dictcCs&|sttj��|dkr"|jj|�dS)Nr5r6)r5r6)rr�INVALID_ZONEr�
check_zone)r!r:r#r#r$�check_ingress_zones
z!FirewallPolicy.check_ingress_zonecCs|j|�|S)N)r�)r!r:r#r#r$Z__ingress_zone_id"s
z FirewallPolicy.__ingress_zone_idrTcCs�|jj|�}|jj|�|jj�|j|}|j|�}	|	|jdkrXttj	d||f��d|jdks�d|jdks�|dkr�|jdr�ttj
d��|dkr�d|jdkr�ttj
d��|dkr�|j�}
n|}
|�rJ|jr�|j
d||
�|j||	||�|
j|j||	�|j�s:||j�k�rH|j||
d	�|
j|j|d�n|j
d
||
�n |j||	||�|
j|j||	�|dk�r~|
jd
�dS)Nr4z'%s' already in '%s'r6r5zI'ingress-zones' may only contain one of: many regular zones, ANY, or HOSTr7zF'HOST' can only appear in either ingress or egress zones, but not bothF)rbT)r6r5)rr>�
check_timeout�check_panicr � _FirewallPolicy__ingress_zone_idr<rrrZr�r*rOro�&_FirewallPolicy__register_ingress_zone�add_fail�(_FirewallPolicy__unregister_ingress_zoner=rcrerx)r!r;r:rgrfrbrRrz�_obj�zone_idr{r#r#r$rS&s<




zFirewallPolicy.add_ingress_zonecCs|j||�|jd|<dS)Nr4)�_FirewallPolicy__gen_settingsr<)r!r�r�rgrfr#r#r$Z__register_ingress_zoneSsz&FirewallPolicy.__register_ingress_zonecCs�|jj|�}|jj�|j|}|j|�}||jdkrLttjd||f��|dkr^|j	�}n|}|j
r�t|jd�dkr�|j||�n|j
d||�|j||�|j|j||dd�||j�kr�|j
d||�n|j|j||�|dkr�|jd�|S)Nr4z'%s' not in '%s'rjFT)rr>r�r r�r<rr�NOT_ENABLEDr*rO�lenrPror�r�r�r=�add_postrx)r!r;r:rbrzr�r�r{r#r#r$r�Vs,




z"FirewallPolicy.remove_ingress_zonecCs||jdkr|jd|=dS)Nr4)r<)r!r�r�r#r#r$Z__unregister_ingress_zoneysz(FirewallPolicy.__unregister_ingress_zonecCs|j|�|j|�dkS)Nr4)r�r8)r!r;r:r#r#r$�query_ingress_zone}sz!FirewallPolicy.query_ingress_zonecCst|j|�dj��S)Nr4)r�r8r,)r!r;r#r#r$r��sz!FirewallPolicy.list_ingress_zonescCs&|sttj��|dkr"|jj|�dS)Nr5r6)r5r6)rrr�rr�)r!r:r#r#r$�check_egress_zone�s
z FirewallPolicy.check_egress_zonecCs|j|�|S)N)r�)r!r:r#r#r$Z__egress_zone_id�s
zFirewallPolicy.__egress_zone_idcCs�|jj|�}|jj|�|jj�|j|}|j|�}	|	|jdkrXttj	d||f��d|jdks�d|jdks�|dkr�|jdr�ttj
d��|dkr�d|jdkr�ttj
d��|dkr�|j�}
n|}
|�rJ|jr�|j
d||
�|j||	||�|
j|j||	�|j�s:||j�k�rH|j||
d	�|
j|j|d�n|j
d
||
�n |j||	||�|
j|j||	�|dk�r~|
jd
�dS)Nr7z'%s' already in '%s'r6r5zH'egress-zones' may only contain one of: many regular zones, ANY, or HOSTr4zF'HOST' can only appear in either ingress or egress zones, but not bothF)rbT)r6r5)rr>r�r�r �_FirewallPolicy__egress_zone_idr<rrrZr�r*rOro�%_FirewallPolicy__register_egress_zoner��'_FirewallPolicy__unregister_egress_zoner=rcrerx)r!r;r:rgrfrbrRrzr�r�r{r#r#r$rT�s<




zFirewallPolicy.add_egress_zonecCs|j||�|jd|<dS)Nr7)r�r<)r!r�r�rgrfr#r#r$Z__register_egress_zone�sz%FirewallPolicy.__register_egress_zonecCs�|jj|�}|jj�|j|}|j|�}||jdkrLttjd||f��|dkr^|j	�}n|}|j
r�t|jd�dkr�|j||�n|j
d||�|j||�|j|j||dd�||j�kr�|j
d||�n|j|j||�|dkr�|jd�|S)Nr7z'%s' not in '%s'rjFT)rr>r�r r�r<rrr�r*rOr�rPror�r�r�r=r�rx)r!r;r:rbrzr�r�r{r#r#r$r��s,




z!FirewallPolicy.remove_egress_zonecCs||jdkr|jd|=dS)Nr7)r<)r!r�r�r#r#r$Z__unregister_egress_zone�sz'FirewallPolicy.__unregister_egress_zonecCs|j|�|j|�dkS)Nr7)r�r8)r!r;r:r#r#r$�query_egress_zone�sz FirewallPolicy.query_egress_zonecCst|j|�dj��S)Nr7)r�r8r,)r!r;r#r#r$r��sz FirewallPolicy.list_egress_zonescCs|j�dS)N)Zcheck)r!�ruler#r#r$�
check_rule�szFirewallPolicy.check_rulecCs|j|�t|�S)N)r��str)r!r�r#r#r$Z	__rule_id�s
zFirewallPolicy.__rule_idcCsx|sdS|jr,t|j�rdSt|j�rtdSnHt|d�r@|jr@dSt|d�rt|jrt|j|j�|j|j�|j|j�SdS)N�ipv4�ipv6�mac��ipset)	Zaddrrr�hasattrr�r��_check_ipset_type_for_source�_check_ipset_applied�
_ipset_family)r!�sourcer#r#r$�_rule_source_ipv�s

zFirewallPolicy._rule_source_ipvcCs|j||||�dS)N)�
_rule_prepare)r!ryr;r�r{r#r#r$Z__ruleszFirewallPolicy.__rulecCsL|jj|�}|jj|�|jj�|j|}|j|�}||jdkrh|jrP|jn|}	tt	j
d||	f��|j�s�|jr�t|jt
�r�d|jdkr�tt	jd��d|jdkr�tt	jd��x6|jdD](}
|
dkr�q�|jjj|
�r�tt	jd	��q�W|j�r�t|jt��r�d|jdk�r,|jj�r�tt	jd
��nb|jd�r�|jj�sNtt	jd��x>|jdD]0}
|
dk�rl�qZ|jjj|
��rZtt	jd���qZW|j�r�t|jt��r�x>|jdD]0}
|
dk�rq�|jjj|
��r�tt	jd
���q�W|dk�r�|j�}n|}|j�r|jd|||�|j||||�|j|j||�|dk�rH|jd�|S)NrHz'%s' already in '%s'r5r7z.'masquerade' is invalid for egress zone 'HOST'r4z/'masquerade' is invalid for ingress zone 'HOST'r6zR'masquerade' cannot be used in a policy if an ingress zone has assigned interfaceszAA 'forward-port' with 'to-addr' is invalid for egress zone 'HOST'zC'forward-port' requires 'to-addr' if egress zone is 'ANY' or a zonezS'forward-port' cannot be used in a policy if an egress zone has assigned interfaceszR'mark' action cannot be used in a policy if an egress zone has assigned interfacesT)r6r5)rr>r�r�r �_FirewallPolicy__rule_idr<r/rrrZ�elementr�rr�r:�list_interfacesr�
to_address�INVALID_FORWARD�actionrr*rOrw�_FirewallPolicy__register_ruler�� _FirewallPolicy__unregister_rulerx)r!r;r�rgrfrbrzr��rule_id�_namer:r{r#r#r$r^
s`










zFirewallPolicy.add_rulecCs|j||�|jd|<dS)NrH)r�r<)r!r�r�rgrfr#r#r$Z__register_ruleEszFirewallPolicy.__register_rulec	Cs�|jj|�}|jj�|j|}|j|�}||jdkr\|jrD|jn|}ttj	d||f��|dkrn|j
�}n|}|jr�|jd|||�|j
|j||�|dkr�|jd�|S)NrHz'%s' not in '%s'FT)rr>r�r r�r<r/rrr�r*rOrwr�r�rx)	r!r;r�rbrzr�r�r�r{r#r#r$r�Is"




zFirewallPolicy.remove_rulecCs||jdkr|jd|=dS)NrH)r<)r!r�r�r#r#r$Z__unregister_ruledsz FirewallPolicy.__unregister_rulecCs|j|�|j|�dkS)NrH)r�r8)r!r;r�r#r#r$�
query_rulehszFirewallPolicy.query_rulecCst|j|�dj��S)NrH)r�r8r,)r!r;r#r#r$r�kszFirewallPolicy.list_rulescCs|jj|�dS)N)r�
check_service)r!�servicer#r#r$r�pszFirewallPolicy.check_servicecCs|j|�|S)N)r�)r!r�r#r#r$Z__service_idss
zFirewallPolicy.__service_idcCs�|jj|�}|jj|�|jj�|j|}|j|�}||jdkrh|jrP|jn|}	tt	j
d||	f��|dkrz|j�}
n|}
|jr�|j
d|||
�|j||||�|
j|j||�|dkr�|
jd�|S)NrBz'%s' already in '%s'T)rr>r�r�r �_FirewallPolicy__service_idr<r/rrrZr*rOrr�!_FirewallPolicy__register_servicer��#_FirewallPolicy__unregister_servicerx)r!r;r�rgrfrbrzr��
service_idr�r{r#r#r$rWws&




zFirewallPolicy.add_servicecCs|j||�|jd|<dS)NrB)r�r<)r!r�r�rgrfr#r#r$Z__register_service�sz!FirewallPolicy.__register_servicec	Cs�|jj|�}|jj�|j|}|j|�}||jdkr\|jrD|jn|}ttj	d||f��|dkrn|j
�}n|}|jr�|jd|||�|j
|j||�|dkr�|jd�|S)NrBz'%s' not in '%s'FT)rr>r�r r�r<r/rrr�r*rOrrr�r�rx)	r!r;r�rbrzr�r�r�r{r#r#r$r��s"




zFirewallPolicy.remove_servicecCs||jdkr|jd|=dS)NrB)r<)r!r�r�r#r#r$Z__unregister_service�sz#FirewallPolicy.__unregister_servicecCs|j|�|j|�dkS)NrB)r�r8)r!r;r�r#r#r$�
query_service�szFirewallPolicy.query_servicecCs|j|�dj�S)NrB)r8r,)r!r;r#r#r$r��szFirewallPolicy.list_servicescCsTg}xJ|D]B}y|jjj|�}Wn tk
r@ttj|��YnX|j|�q
W|S)N)r�helper�
get_helperrr�INVALID_HELPERr0)r!�helpers�_helpersr��_helperr#r#r$�get_helpers_for_service_helpers�s
z.FirewallPolicy.get_helpers_for_service_helperscCs�g}x�|D]�}y|jjj|�}Wn tk
r@ttj|��YnXt|j�dkr�t|j	�}y|jjj|�}|j
|�Wq�tk
r�|r�tjd|�w
Yq�Xq
|j
|�q
W|S)NrjzHelper '%s' is not available)
rr�r�rrr�r�rCr
�moduler0rr[)r!�modulesryr�r�r��_module_short_namer�r#r#r$�get_helpers_for_service_modules�s"


z.FirewallPolicy.get_helpers_for_service_modulescCs|jj|�|jj|�dS)N)r�
check_port�check_tcpudp)r!�port�protocolr#r#r$r��szFirewallPolicy.check_portcCs|j||�t|d�|fS)N�-)r�r)r!r�r�r#r#r$Z	__port_id�szFirewallPolicy.__port_idcs�|jj|�}|jj|�|jj�|j|}tt�fdd�|jd��}	x@|	D]8}
t||
d�rN|j	rl|j	n|}t
tjd|�|f��qNWt
|dd�|	D��\}}
|dkr�|j�}n|}|j�rx$|D]}|jd|t|d	��|�q�Wx$|
D]}|jd
|t|d	��|�q�Wx:|D]2}|j|��}
|j||
||�|j|j||
��qWx*|
D]"}|j|��}
|j|j||
��qNW|dk�r�|jd�|S)Ncs|d�kS)Nrjr#)r@)r�r#r$�<lambda>�sz)FirewallPolicy.add_port.<locals>.<lambda>rCrz'%s:%s' already in '%s'cSsg|]\}}|�qSr#r#)r?rsrtr#r#r$�
<listcomp>�sz+FirewallPolicy.add_port.<locals>.<listcomp>Tr�F)rr>r�r�r r��filterr<r	r/rrrZrr*rOrsr�_FirewallPolicy__port_id�_FirewallPolicy__register_portr�� _FirewallPolicy__unregister_portr�rx)r!r;r�r�rgrfrbrzr��existing_port_ids�port_idr��added_ranges�removed_rangesr{�ranger#)r�r$rX�s:









zFirewallPolicy.add_portcCs|j||�|jd|<dS)NrC)r�r<)r!r�r�rgrfr#r#r$Z__register_portszFirewallPolicy.__register_portcs�|jj|�}|jj�|j|}tt�fdd�|jd��}xB|D]}t||d�rBPqBW|jrf|jn|}	t	t
jd|�|	f��t|dd�|D��\}
}|dkr�|j
�}n|}|j�rx$|
D]}
|jd|t|
d	��|�q�Wx$|D]}
|jd
|t|
d	��|�q�Wx:|
D]2}
|j|
��}|j||dd�|j|j||��qWx*|D]"}
|j|
��}|j|j||��qDW|dk�r~|jd�|S)Ncs|d�kS)Nrjr#)r@)r�r#r$r�sz,FirewallPolicy.remove_port.<locals>.<lambda>rCrz'%s:%s' not in '%s'cSsg|]\}}|�qSr#r#)r?rsrtr#r#r$r�#sz.FirewallPolicy.remove_port.<locals>.<listcomp>Tr�F)rr>r�r r�r�r<r	r/rrr�rr*rOrsrr�r�r�r�r�rx)r!r;r�r�rbrzr�r�r�r�r�r�r{r�r#)r�r$r�s:









zFirewallPolicy.remove_portcCs||jdkr|jd|=dS)NrC)r<)r!r�r�r#r#r$Z__unregister_port=sz FirewallPolicy.__unregister_portcCs6x0|j|�dD]\}}t||�r||krdSqWdS)NrCTF)r8r	)r!r;r�r�rsrtr#r#r$�
query_portAszFirewallPolicy.query_portcCst|j|�dj��S)NrC)r�r8r,)r!r;r#r#r$r�HszFirewallPolicy.list_portscCst|�sttj|��dS)N)rrrZINVALID_PROTOCOL)r!r�r#r#r$�check_protocolMszFirewallPolicy.check_protocolcCs|j|�|S)N)r�)r!r�r#r#r$Z
__protocol_idQs
zFirewallPolicy.__protocol_idcCs�|jj|�}|jj|�|jj�|j|}|j|�}||jdkrh|jrP|jn|}	tt	j
d||	f��|dkrz|j�}
n|}
|jr�|j
d|||
�|j||||�|
j|j||�|dkr�|
jd�|S)NrIz'%s' already in '%s'T)rr>r�r�r �_FirewallPolicy__protocol_idr<r/rrrZr*rOrt�"_FirewallPolicy__register_protocolr��$_FirewallPolicy__unregister_protocolrx)r!r;r�rgrfrbrzr��protocol_idr�r{r#r#r$r\Us&




zFirewallPolicy.add_protocolcCs|j||�|jd|<dS)NrI)r�r<)r!r�r�rgrfr#r#r$Z__register_protocolrsz"FirewallPolicy.__register_protocolc	Cs�|jj|�}|jj�|j|}|j|�}||jdkr\|jrD|jn|}ttj	d||f��|dkrn|j
�}n|}|jr�|jd|||�|j
|j||�|dkr�|jd�|S)NrIz'%s' not in '%s'FT)rr>r�r r�r<r/rrr�r*rOrtr�r�rx)	r!r;r�rbrzr�r�r�r{r#r#r$r�vs$





zFirewallPolicy.remove_protocolcCs||jdkr|jd|=dS)NrI)r<)r!r�r�r#r#r$Z__unregister_protocol�sz$FirewallPolicy.__unregister_protocolcCs|j|�|j|�dkS)NrI)r�r8)r!r;r�r#r#r$�query_protocol�szFirewallPolicy.query_protocolcCst|j|�dj��S)NrI)r�r8r,)r!r;r#r#r$r��szFirewallPolicy.list_protocolscCs|j||�t|d�|fS)Nr�)r�r)r!r�r�r#r#r$Z__source_port_id�szFirewallPolicy.__source_port_idcs�|jj|�}|jj|�|jj�|j|}tt�fdd�|jd��}	x@|	D]8}
t||
d�rN|j	rl|j	n|}t
tjd|�|f��qNWt
|dd�|	D��\}}
|dkr�|j�}n|}|j�rx$|D]}|jd|t|d	��|�q�Wx$|
D]}|jd
|t|d	��|�q�Wx:|D]2}|j|��}
|j||
||�|j|j||
��qWx*|
D]"}|j|��}
|j|j||
��qNW|dk�r�|jd�|S)Ncs|d�kS)Nrjr#)r@)r�r#r$r��sz0FirewallPolicy.add_source_port.<locals>.<lambda>rFrz'%s:%s' already in '%s'cSsg|]\}}|�qSr#r#)r?rsrtr#r#r$r��sz2FirewallPolicy.add_source_port.<locals>.<listcomp>Tr�F)rr>r�r�r r�r�r<r	r/rrrZrr*rOrur�_FirewallPolicy__source_port_id�%_FirewallPolicy__register_source_portr��'_FirewallPolicy__unregister_source_portr�rx)r!r;r�r�rgrfrbrzr�r�r�r�r�r�r{r�r#)r�r$r]�s:









zFirewallPolicy.add_source_portcCs|j||�|jd|<dS)NrF)r�r<)r!r�r�rgrfr#r#r$Z__register_source_port�sz%FirewallPolicy.__register_source_portcs�|jj|�}|jj�|j|}tt�fdd�|jd��}xB|D]}t||d�rBPqBW|jrf|jn|}	t	t
jd|�|	f��t|dd�|D��\}
}|dkr�|j
�}n|}|j�rx$|
D]}
|jd|t|
d	��|�q�Wx$|D]}
|jd
|t|
d	��|�q�Wx:|
D]2}
|j|
��}|j||dd�|j|j||��qWx*|D]"}
|j|
��}|j|j||��qDW|dk�r~|jd�|S)Ncs|d�kS)Nrjr#)r@)r�r#r$r��sz3FirewallPolicy.remove_source_port.<locals>.<lambda>rFrz'%s:%s' not in '%s'cSsg|]\}}|�qSr#r#)r?rsrtr#r#r$r��sz5FirewallPolicy.remove_source_port.<locals>.<listcomp>Tr�F)rr>r�r r�r�r<r	r/rrr�rr*rOrurr�r�r�r�r�rx)r!r;r�r�rbrzr�r�r�r�r�r�r{r�r#)r�r$r��s:









z!FirewallPolicy.remove_source_portcCs||jdkr|jd|=dS)NrF)r<)r!r�r�r#r#r$Z__unregister_source_port�sz'FirewallPolicy.__unregister_source_portcCs6x0|j|�dD]\}}t||�r||krdSqWdS)NrFTF)r8r	)r!r;r�r�rsrtr#r#r$�query_source_port�sz FirewallPolicy.query_source_portcCst|j|�dj��S)NrF)r�r8r,)r!r;r#r#r$r�sz FirewallPolicy.list_source_portscCsdS)NTr#)r!r#r#r$Z__masquerade_idszFirewallPolicy.__masquerade_idcCs8|jj|�}|jj|�|jj�|j|}|j�}||jdkrb|jrN|jn|}tt	j
d|��|js�d|jdkr�tt	jd��d|jdkr�tt	jd��x6|jdD](}	|	dkr�q�|jjj
|	�r�tt	jd	��q�W|dkr�|j�}
n|}
|j�r|jd
||
�|j||||�|
j|j||�|dk�r4|
jd
�|S)NrDz"masquerade already enabled in '%s'r5r7z.'masquerade' is invalid for egress zone 'HOST'r4z/'masquerade' is invalid for ingress zone 'HOST'r6zR'masquerade' cannot be used in a policy if an ingress zone has assigned interfacesT)rr>r�r�r �_FirewallPolicy__masquerade_idr<r/rrrZr�r:r�r*rOrv�$_FirewallPolicy__register_masquerader��&_FirewallPolicy__unregister_masqueraderx)r!r;rgrfrbrzr��
masquerade_idr�r:r{r#r#r$r_
s:





zFirewallPolicy.add_masqueradecCs|j||�|jd|<dS)NrD)r�r<)r!r�r�rgrfr#r#r$Z__register_masquerade2sz$FirewallPolicy.__register_masqueradecCs�|jj|�}|jj�|j|}|j�}||jdkrV|jrB|jn|}ttj	d|��|dkrh|j
�}n|}|jr�|jd||�|j
|j||�|dkr�|jd�|S)NrDzmasquerade not enabled in '%s'FT)rr>r�r r�r<r/rrr�r*rOrvr�r�rx)r!r;rbrzr�r�r�r{r#r#r$r�6s"




z FirewallPolicy.remove_masqueradecCs||jdkr|jd|=dS)NrD)r<)r!r�r�r#r#r$Z__unregister_masqueradePsz&FirewallPolicy.__unregister_masqueradecCs|j�|j|�dkS)NrD)r�r8)r!r;r#r#r$r�TszFirewallPolicy.query_masqueradecCs^|jj|�|jj|�|r(|jj|�|rBt||�sBttj|��|rZ|rZttjd��dS)Nz.port-forwarding is missing to-port AND to-addr)rr�r�rrrZINVALID_ADDRr�)r!�ipvr�r��toport�toaddrr#r#r$�check_forward_portYs
z!FirewallPolicy.check_forward_portcCsLtd|�r|jd||||�n|jd||||�t|d�|t|d�t|�fS)Nr�r�r�)rrrr�)r!r�r�r�r�r#r#r$Z__forward_port_idfs


z FirewallPolicy.__forward_port_idc	CsZ|jj|�}	|jj|�|jj�|j|	}
|j||||�}||
jdkrt|
jrV|
jn|	}tt	j
d|||||f��|
js�d|
jdkr�|r�tt	jd��nR|
jdr�|s�tt	jd��x6|
jdD](}
|
dkr�q�|jjj
|
�r�tt	jd��q�W|dk�r|j�}n|}|
j�r"|jd	|	|||||�|j|
|||�|j|j|
|�|dk�rV|jd	�|	S)
NrEz'%s:%s:%s:%s' already in '%s'r5r7zAA 'forward-port' with 'to-addr' is invalid for egress zone 'HOST'zC'forward-port' requires 'to-addr' if egress zone is 'ANY' or a zoner6zS'forward-port' cannot be used in a policy if an egress zone has assigned interfacesT)rr>r�r�r � _FirewallPolicy__forward_port_idr<r/rrrZr�r:r�r�r*rOrq�&_FirewallPolicy__register_forward_portr��(_FirewallPolicy__unregister_forward_portrx)r!r;r�r�r�r�rgrfrbrzr��
forward_idr�r:r{r#r#r$rVnsB






zFirewallPolicy.add_forward_portcCs|j||�|jd|<dS)NrE)r�r<)r!r�rrgrfr#r#r$Z__register_forward_port�sz&FirewallPolicy.__register_forward_portcCs�|jj|�}|jj�|j|}|j||||�}	|	|jdkrh|jrJ|jn|}
ttj	d|||||
f��|dkrz|j
�}n|}|jr�|jd||||||�|j
|j||	�|dkr�|jd�|S)NrEz'%s:%s:%s:%s' not in '%s'FT)rr>r�r rr<r/rrr�r*rOrqr�rrx)r!r;r�r�r�r�rbrzr�rr�r{r#r#r$r��s&



z"FirewallPolicy.remove_forward_portcCs||jdkr|jd|=dS)NrE)r<)r!r�rr#r#r$Z__unregister_forward_port�sz(FirewallPolicy.__unregister_forward_portcCs"|j||||�}||j|�dkS)NrE)rr8)r!r;r�r�r�r�rr#r#r$�query_forward_port�sz!FirewallPolicy.query_forward_portcCst|j|�dj��S)NrE)r�r8r,)r!r;r#r#r$r��sz!FirewallPolicy.list_forward_portscCs|jj|�dS)N)rZcheck_icmptype)r!�icmpr#r#r$�check_icmp_block�szFirewallPolicy.check_icmp_blockcCs|j|�|S)N)r)r!rr#r#r$Z__icmp_block_id�s
zFirewallPolicy.__icmp_block_idcCs�|jj|�}|jj|�|jj�|j|}|j|�}||jdkrh|jrP|jn|}	tt	j
d||	f��|dkrz|j�}
n|}
|jr�|j
d|||
�|j||||�|
j|j||�|dkr�|
jd�|S)NrGz'%s' already in '%s'T)rr>r�r�r �_FirewallPolicy__icmp_block_idr<r/rrrZr*rOrp�$_FirewallPolicy__register_icmp_blockr��&_FirewallPolicy__unregister_icmp_blockrx)r!r;rrgrfrbrzr��icmp_idr�r{r#r#r$rU�s&




zFirewallPolicy.add_icmp_blockcCs|j||�|jd|<dS)NrG)r�r<)r!r�rrgrfr#r#r$Z__register_icmp_block�sz$FirewallPolicy.__register_icmp_blockc	Cs�|jj|�}|jj�|j|}|j|�}||jdkr\|jrD|jn|}ttj	d||f��|dkrn|j
�}n|}|jr�|jd|||�|j
|j||�|dkr�|jd�|S)NrGz'%s' not in '%s'FT)rr>r�r rr<r/rrr�r*rOrpr�r
rx)	r!r;rrbrzr�rr�r{r#r#r$r��s"




z FirewallPolicy.remove_icmp_blockcCs||jdkr|jd|=dS)NrG)r<)r!r�rr#r#r$Z__unregister_icmp_blocksz&FirewallPolicy.__unregister_icmp_blockcCs|j|�|j|�dkS)NrG)rr8)r!r;rr#r#r$�query_icmp_blockszFirewallPolicy.query_icmp_blockcCs|j|�dj�S)NrG)r8r,)r!r;r#r#r$r�szFirewallPolicy.list_icmp_blockscCsdS)NTr#)r!r#r#r$Z__icmp_block_inversion_idsz(FirewallPolicy.__icmp_block_inversion_idc
Cs|jj|�}|jj�|j|}|j�}||jdkrV|jrB|jn|}ttj	d|��|dkrh|j
�}n|}|jr�x&|j|�dD]}	|j
d||	|�q�W|jd||�|j|||�|j|j|||�|j�rx&|j|�dD]}	|j
d||	|�q�W|jd||�|dk�r|jd�|S)NrJz,icmp-block-inversion already enabled in '%s'rGFT)rr>r�r �(_FirewallPolicy__icmp_block_inversion_idr<r/rrrZr*rOr8rp�_icmp_block_inversion�._FirewallPolicy__register_icmp_block_inversionr��*_FirewallPolicy__undo_icmp_block_inversionrx)
r!r;rfrbrzr��icmp_block_inversion_idr�r{r`r#r#r$�add_icmp_block_inversions6





z'FirewallPolicy.add_icmp_block_inversioncCs|jd|�|jd|<dS)NrrJ)r�r<)r!r�rrfr#r#r$Z__register_icmp_block_inversionEsz.FirewallPolicy.__register_icmp_block_inversioncCs�|j�}|jr6x&|j|�dD]}|jd|||�qW||jdkrP|jd|=|jr~x&|j|�dD]}|jd|||�qfW|jd�dS)NrGFrJT)r*rOr8rpr<rx)r!rzr�rr{r`r#r#r$Z__undo_icmp_block_inversionJsz*FirewallPolicy.__undo_icmp_block_inversionc	Cs|jj|�}|jj�|j|}|j�}||jdkrV|jrB|jn|}ttj	d|��|dkrh|j
�}n|}|jr�x&|j|�dD]}|j
d|||�q�W|jd||�|j||�|j|j||d�|j�rx&|j|�dD]}|j
d|||�q�W|jd||�|dk�r|jd�|S)NrJz(icmp-block-inversion not enabled in '%s'rGFT)rr>r�r r
r<r/rrr�r*rOr8rpr�0_FirewallPolicy__unregister_icmp_block_inversionr�rrx)	r!r;rbrzr�rr�r{r`r#r#r$�remove_icmp_block_inversion\s6






z*FirewallPolicy.remove_icmp_block_inversioncCs||jdkr|jd|=dS)NrJ)r<)r!r�rr#r#r$Z!__unregister_icmp_block_inversion�sz0FirewallPolicy.__unregister_icmp_block_inversioncCs|j�|j|�dkS)NrJ)r
r8)r!r;r#r#r$�query_icmp_block_inversion�sz)FirewallPolicy.query_icmp_block_inversionc
Cs�|jjj|�}|jr*|jjj|jd}n|}|rT||jkrt||f|j|krtdSn ||jksp||f|j|krtdSx@|jj�D]2}|jr�||j	�kr�|j
||||�}	|j||	�q�W|j||||fg�|j
|j||||fg�dS)Nr)rr;r.r/r:Z_zone_policiesr�enabled_backends�policies_supportedZget_available_tablesZbuild_policy_chain_rules�	add_rules�_register_chainsr�)
r!r;�creater|r}r{rMZtracking_policy�backendrHr#r#r$rn�s$

zFirewallPolicy.gen_chain_rulescCsbx\|D]T\}}|r,|jj|g�j||f�q|j|j||f�t|j|�dkr|j|=qWdS)Nr)r�
setdefaultr0�remover�)r!r;rZtablesr|r}r#r#r$r�szFirewallPolicy._register_chainscCs$|jjj|�dkrdS|jjj|�S)Nzhash:mac)rr��get_typeZ
get_family)r!rKr#r#r$r��szFirewallPolicy._ipset_familycCs|jjj|�S)N)rr�r)r!rKr#r#r$Z__ipset_type�szFirewallPolicy.__ipset_typecCsdj|g|jjj|��S)N�,)�joinrr�Z
get_dimension)r!rK�flagr#r#r$�_ipset_match_flags�sz!FirewallPolicy._ipset_match_flagscCs|jjj|�S)N)rr�Z
check_applied)r!rKr#r#r$r��sz#FirewallPolicy._check_ipset_appliedcCs*|j|�}|tkr&ttjd||f��dS)Nz.ipset '%s' with type '%s' not usable as source)�_FirewallPolicy__ipset_typerrrZ
INVALID_IPSET)r!rKZ_typer#r#r$r��s
z+FirewallPolicy._check_ipset_type_for_sourcecs�t|j�tkr��jjj|jj�}|dkr2|jjg}xR|jD]H}||krHq:�j|�|j	|�t
j|�}||j_�j|||||d�q:Wg}	|j
r�|j
g}	nH|jr�t|jt�s�t|jt�r�jjj|jj���jr�fdd�dD�}	�j|j�}
|
�r&|j
�r |j
|
k�r&ttjd|
|j
f��n|
g}	|	�s4ddg}	�fdd�|	D�}	|	|_�x2t�fdd�|	D��D�]}t|j�tk�r��jjj|jj�}g}t|j�d	k�r�|j�r�ttjd
��xB|	D].}
|
|jk�r�|j|
��r�|j	|j|
��q�Wn
|j	d��x~|D�]�}t|j�tk�r�j|j |�}|�j!|j"�7}t#t|�dd�d
�}g}x�|D]�}|j$}t%|�}|j&dd�}|j	|�|j
dk�r�|j|j
��r��qTt|j'�dk�r�|j	|�n:x8|j'D].\}}|j(||||||j|�}|j)||��q�W�qTW|j*|�x4|j'D]*\}}|j+||||||�}|j)||��q
Wx.|j,D]$}|j-|||||�}|j)||��q@Wx4|j.D]*\}}|j/||||||�}|j)||��qpW�qW�qft|j�t0k�r�|jj1}|jj2}�j3||�|j+||||d|�}|j)||��qft|j�t4k�r<|jj5}�j6|�|j-|||d|�}|j)||��qft|j�t7k�r�|�rzx&|	D]}
|j|
��rX|j8t9|
��qXW|j:|||�}|j)||��qft|j�t;k�r4|jj1}|jj2}|jj<}|jj=}xD|	D]<}
|j|
��r�j>|
||||�|�r�|�r�|j8t9|
��q�W|j?|||||||�}|j)||��qft|j�t@k�r�|jj1}|jj2}�j3||�|j/||||d|�}|j)||�n�t|j�tk�s�t|j�tk�r>�jjj|jj��|j
�r�j�r�|j
�jk�r�ttjAd|j
|jjf��t|j�tk�r |j�r t|j�tk�r ttjd��|jB||�|�}|j)||�n>|jdk�rf|jC|||�}|j)||�nttjdt|j����qfWdS)N)�included_servicescsg|]}|�jkr|�qSr#)�destination)r?r�)�ictr#r$r��sz0FirewallPolicy._rule_prepare.<locals>.<listcomp>r�r�z;Source address family '%s' conflicts with rule family '%s'.csg|]}�jj|�r|�qSr#)r�is_ipv_enabled)r?r�)r!r#r$r��scsg|]}�jj|��qSr#)r�get_backend_by_ipv)r?r@)r!r#r$r��srz"Destination conflict with service.cSs|jS)N)rK)r@r#r#r$r�sz.FirewallPolicy._rule_prepare.<locals>.<lambda>)r~�	conntrack�natr�rjz3rich rule family '%s' conflicts with icmp type '%s'z'IcmpBlock not usable with accept actionzUnknown element %s)r�r�)D�typer�rrr��get_servicerK�includesr�r0�copy�deepcopyr��familyr�rr�config�get_icmptyper%r�r�rrZINVALID_RULE�ipvsr9r��is_ipv_supportedr�rr�r�r�r�r+r�r
�replacerC�build_policy_helper_ports_rulesrZadd_modules�build_policy_ports_rulesrI�build_policy_protocol_rulesrF�build_policy_source_ports_rulesrr�r�r�r�valuer�rr�r�build_policy_masquerade_rulesrZto_portr�r�build_policy_forward_port_rulesrZINVALID_ICMPTYPE�build_policy_icmp_block_rulesZ*build_policy_rich_source_destination_rules)r!ryr;r�r{r$�svc�includeZ_ruler3Z
source_ipvrZdestinationsr�r%r�r�r�r�r��
nat_moduler��protorHr�r�r�r#)r&r!r$r��s




 









zFirewallPolicy._rule_preparecCsb|jjj|�}|j|j|�}||j|j�7}tt|�dd�d�}|dkrN|g}x@|j	D]6}||krdqV|j
|�|j|�|j|||||d�qVWg}	xndD]f}
|jj
|
�s�q�|jj|
�}t|j�dkr�|
|jkr�|	j||j|
f�q�|df|	kr�|	j|df�q�W�xV|	D�]L\}}x�|D]�}
|
j}t|�}|
jjdd	�}|j|�|
jd
k�rf|j|
j��rf�qt|
j�dk�r�|j|�n:x8|
jD].\}}|j||||||
j|�}|j||��q�W�qWx2|jD](\}}|j|||||�}|j||��q�Wx,|jD]"}|j||||�}|j||��q�Wx2|jD](\}}|j|||||�}|j||��q,W�qWdS)
NcSs|jS)N)rK)r@r#r#r$r��sz)FirewallPolicy._service.<locals>.<lambda>)r~)r$r�r�rr)r*r�rj)r�r�) rr�r,r�r�r�r�r+r9r-r�r0rrr'r(r�r%r�r
r5Z
add_moduler0r4rCr6rKrr7rIr8rFr9)r!ryr;r�r{r$r>r�r?Zbackends_ipvr�rr%r�r�r�r@r�rArHr�r#r#r$rr�sb






zFirewallPolicy._servicecCs<x6|jj�D](}|jsq|j||||�}|j||�qWdS)N)rrrr7r)r!ryr;r�r�r{rrHr#r#r$rs�s
zFirewallPolicy._portcCs:x4|jj�D]&}|jsq|j|||�}|j||�qWdS)N)rrrr8r)r!ryr;r�r{rrHr#r#r$rt�s
zFirewallPolicy._protocolcCs<x6|jj�D](}|jsq|j||||�}|j||�qWdS)N)rrrr9r)r!ryr;r�r�r{rrHr#r#r$ru�s
zFirewallPolicy._source_portcCs8d}|jt|�|jj|�}|j||�}|j||�dS)Nr�)r�rrr(r;r)r!ryr;r{r�rrHr#r#r$rv�s
zFirewallPolicy._masqueradecCsXtd|�rd}nd}|r(|r(|jt|�|jj|�}	|	j||||||�}
|j|	|
�dS)Nr�r�)rr�rrr(r<r)r!ryr;r{r�r�r�r�r�rrHr#r#r$rq�s

zFirewallPolicy._forward_portc
Cs�|jjj|�}xl|jj�D]^}|js&qd}|jrXx&dD]}||jkr6|j|�s6d}Pq6W|r^q|j|||�}	|j||	�qWdS)NFr�r�T)r�r�)	rr1r2rrr%r4r=r)
r!ryr;rr{r&rZskip_backendr�rHr#r#r$rp�s


zFirewallPolicy._icmp_blockcCsh|j|j}|dkrdS|j|�r0|dkr0dSx2|jj�D]$}|jsHq<|j||�}|j||�q<WdS)N�DROP�
%%REJECT%%�REJECTZACCEPT)rBrCrD)r �targetrrrrZ'build_policy_icmp_block_inversion_rulesr)r!ryr;r{rErrHr#r#r$rsz$FirewallPolicy._icmp_block_inversionc	Cs�x|D]}|j|�qWx|D]}|j|�qWd|ks@d|krXt|�dkrXttjd��d|kshd|kr�t|�dkr�ttjd��|s�|r�|r�|r�d|kr�d|kr�ttjd|��|s�|r�|r�|r�d|kr�d|kr�ttjd|��dS)Nr6r5rjzI'ingress-zones' may only contain one of: many regular zones, ANY, or HOSTzH'egress-zones' may only contain one of: many regular zones, ANY, or HOSTzpolicy "%s" has no ingresszpolicy "%s" has no egress)r�r�r�rrr�)	r!r;r4r7�ingress_interfaces�egress_interfaces�ingress_sources�egress_sourcesr:r#r#r$�check_ingress_egress"s$

z#FirewallPolicy.check_ingress_egressc

Cs�|dkr&|dkr�|r�ttjd|��n�|dkrtd|krFttjd|��d|kr^ttjd|��|r�ttjd|��n||d	kr�d|kr�ttjd|��d|kr�ttjd|��nB|d
kr�d|kr�ttjd|��n |dkr�d|kr�ttjd
|��dS)N�
PREROUTING�rawzFpolicy "%s" egress-zones may not include a zone with added interfaces.�POSTROUTINGr5z/policy "%s" ingress-zones may not include HOST.z.policy "%s" egress-zones may not include HOST.zGpolicy "%s" ingress-zones may not include a zone with added interfaces.�FORWARD�INPUTz0policy "%s" egress-zones must include only HOST.�OUTPUTz1policy "%s" ingress-zones must include only HOST.)rrr�)
r!r;r|r}r4r7rFrGrHrIr#r#r$�check_ingress_egress_chain<s,z)FirewallPolicy.check_ingress_egress_chaincCs$|j�}|j|||�|jd�dS)NT)r*rorx)r!ryr;r{r#r#r$�!_ingress_egress_zones_transactionYsz0FirewallPolicy._ingress_egress_zones_transactioncCsL|j|}|jd}|jd}t�}t�}t�}	t�}
xB|D]:}|dkrJq<|t|jjj|��O}|	t|jjj|��O}	q<WxB|D]:}|dkr�q�|t|jjj|��O}|
t|jjj|��O}
q�W|j||||||	|
�xr|jj�D]d}|j	s�q�xV|j
|�D]H\}
}|j||
||||||	|
�	|j|||
||||	|
�}|j
||��q�Wq�WdS)Nr4r7r6r5)r6r5)r6r5)r r<r9rr:r�Zlist_sourcesrJrrrlrQZ!build_policy_ingress_egress_rulesr)r!ryr;r{rMr4r7rFrGrHrIr:rr|r}rHr#r#r$ro^s@






z$FirewallPolicy._ingress_egress_zonescCs6|j|}d|jdkrFd|jdkrFdddg}|jjsB|jd�|Sd|jdkrpdg}|jjsl|jd�|Sd|jdkr�dgSd|jdko�d|jdk�r�ddddg}|jj�s�|jd�|Sd|jdk�r.dddg}|jj�s�|jd�x4|jdD]}|jjj|�d�rP�qW|jd �|Sd|jdk�r�d!d"g}|jj�sZ|jd#�x>|jdD]}|jjj|�d�rfP�qfW|jd$�|jd%�|Sd&g}|jj�s�|jd'�x4|jdD]}|jjj|�d�r�P�q�W|jd(�x>|jdD]}|jjj|�d�r�P�q�W|jd)�|jd*�|SdS)+z:Create a list of (table, chain) needed for policy dispatchr6r4r5r7r�rOr*rK�manglerLrPrNrMZ
interfacesN)r�rO)r*rK)rSrK)rLrK)r�rO)rLrK)r�rP)r�rN)r*rK)r*rM)rSrK)rLrK)r�rN)r*rK)rSrK)rLrK)r*rM)r�rN)r*rM)rLrK)r*rK)rSrK)r�rN)rLrK)r*rM)r*rK)rSrK)r r<r�nftables_enabledr0r:r8)r!r;rM�tcr:r#r#r$rl�sj
















z4FirewallPolicy._get_table_chains_for_policy_dispatchcCsr|j|}d|jdkr4dg}|jjs0|jd�|Sd|jdkrLdddgSd|jdkrbddgStd|�SdS)z8Create a list of (table, chain) needed for zone dispatchr5r7r�rOrLrKr6�
FORWARD_INr*rSr4�FORWARD_OUTrMzInvalid policy: %sN)r�rO)rLrK)r�rV)r*rK)rSrK)r�rW)r*rM)r r<rrTr0r)r!r;rMrUr#r#r$rm�s

z2FirewallPolicy._get_table_chains_for_zone_dispatchFcCs�|jjj|�}|jr|j}n||}d|jdkrl|dkrBd|S|dkrRd|S|jsh|dkrhd|S�nJd|jd	kr�|js�|dkr�d
|S�n"d|jdk�r�|dkr�|jr�d|Sd
|Sn0|dkr�|r�d|Sd|Sn|dk�r�d|Sn�d|jd	k�rh|dk�r*|j�r d|Sd
|Sn<|dk�rL|�rBd|Sd|Sn|dk�r�|j�s�d|SnN|j�s�|dk�r�d
|S|dk�r�|�r�d|Sd|Sn|dk�r�d|Std|||f�S)Nr5r7r�ZIN_rLZPRE_rSr*r4ZOUT_r6ZFWDI_ZFWD_ZPOST_ZFWDO_z.Can't convert policy to chain name: %s, %s, %s)rSr*)rSrL)rSrL)rSrL)rr;r.r/r<r)r!r;r|Z
policy_prefixZisSNATrM�suffixr#r#r$�policy_base_chain_name�sb













z%FirewallPolicy.policy_base_chain_name)N)N)N)N)rNNT)N)rNNT)N)rNN)N)rNN)N)rNN)N)rNN)N)rNN)N)rNN)N)NN)NN)NNrNN)NNN)NN)rNN)N)NN)N)N)N)NN)F)��__name__�
__module__�__qualname__r%r'r)r*r-r3r=r.rNrQrLrdrer�r8rrcrPr�r�r�r�rSr�r�r�r�r�r�r�rTr�r�r�r�r�r�r�r�rwr^r�r�r�r�r�r�r�rWr�r�r�r�r�r�r�r�r�rXr�r�r�r�r�r�r�r\r�r�r�r�r�r�r]r�r�r�r�r�r�r_r�r�r�r�rrrVrr�rrr�rrrUr	r�r
rr�r
rrrrrrrnrr�r#r"r�r�r�rrrsrtrurvrqrprrJrQrRrorlrmrYr#r#r#r$rs$
'	?.,#,#:
'('('
+))@@		(Pr)'rhr.Zfirewall.core.loggerrZfirewall.functionsrrrrrrr	r
rrr�r
rrrrrrrrrrZfirewall.core.fw_transactionrZfirewallrZfirewall.errorsrZfirewall.fw_typesrZfirewall.core.baser�objectrr#r#r#r$�<module>s04fw_policies.cpython-36.pyc000064400000004432151730727350011512 0ustar003

��g�
�@sVdgZddlmZddlmZddlmZddlmZddlm	Z	Gdd�de
�ZdS)	�FirewallPolicies�)�config)�log)�LockdownWhitelist)�errors)�
FirewallErrorc@sDeZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dS)rcCsd|_ttj�|_dS)NF)�	_lockdownrrZLOCKDOWN_WHITELIST�lockdown_whitelist)�self�r�!/usr/lib/python3.6/fw_policies.py�__init__szFirewallPolicies.__init__cCsd|j|j|jfS)Nz
%s(%r, %r))�	__class__rr	)r
rrr�__repr__#s
zFirewallPolicies.__repr__cCsd|_|jj�dS)NF)rr	�cleanup)r
rrrr'szFirewallPolicies.cleanupcCs�|dkr2tjd|�|jj|�r�tjd�dSn�|dkrdtjd|�|jj|�r�tjd�dSnb|dkr�tjd	|�|jj|�r�tjd
�dSn0|dkr�tjd|�|jj|�r�tjd
�dSdS)N�contextz#Doing access check for context "%s"zcontext matches.TZuidzDoing access check for uid %dzuid matches.�userz Doing access check for user "%s"z
user matches.Zcommandz#Doing access check for command "%s"zcommand matches.F)rZdebug2r	Z
match_contextZdebug3Z	match_uidZ
match_userZ
match_command)r
�key�valuerrr�access_check-s*



zFirewallPolicies.access_checkcCs|jrttjd��d|_dS)Nzenable_lockdown()T)rrrZALREADY_ENABLED)r
rrr�enable_lockdownDsz FirewallPolicies.enable_lockdowncCs|jsttjd��d|_dS)Nzdisable_lockdown()F)rrrZNOT_ENABLED)r
rrr�disable_lockdownIsz!FirewallPolicies.disable_lockdowncCs|jS)N)r)r
rrr�query_lockdownNszFirewallPolicies.query_lockdownN)
�__name__�
__module__�__qualname__r
rrrrrrrrrrrsN)�__all__ZfirewallrZfirewall.core.loggerrZ#firewall.core.io.lockdown_whitelistrrZfirewall.errorsr�objectrrrrr�<module>sicmp.cpython-36.opt-1.pyc000064400000004265151730727350011102 0ustar003

��g�#@s�ddddgZddddddd	d
ddd
dddddddddddddddddddd d!d"d#d$�"Zd%d&d'd(d)dddd*d+d,d,d-d-d.d/d0d0d1d1d2d3�Zd4d5�Zd6d�Zd7d8�Zd9d�Zd:S);�
ICMP_TYPES�ICMPV6_TYPES�check_icmp_type�check_icmpv6_typez0/0z3/0z3/1z3/2z3/3z3/4z3/5z3/6z3/7z3/9z3/10z3/11z3/12z3/13z3/14z3/15z4/0z5/0z5/1z5/2z5/3z8/0z9/0z10/0z11/0z11/1z12/0z12/1z13/0z14/0z17/0z18/0)"z
echo-reply�pongznetwork-unreachablezhost-unreachablezprotocol-unreachablezport-unreachablezfragmentation-neededzsource-route-failedznetwork-unknownzhost-unknownznetwork-prohibitedzhost-prohibitedzTOS-network-unreachablezTOS-host-unreachablezcommunication-prohibitedzhost-precedence-violationzprecedence-cutoffz
source-quenchznetwork-redirectz
host-redirectzTOS-network-redirectzTOS-host-redirectzecho-request�pingzrouter-advertisementzrouter-solicitationzttl-zero-during-transitzttl-zero-during-reassemblyz
ip-header-badzrequired-option-missingztimestamp-requestztimestamp-replyzaddress-mask-requestzaddress-mask-replyz1/0z1/1z1/3z1/4z2/0z4/1z4/2z128/0z129/0z133/0z134/0z135/0z136/0z137/0)zno-routezcommunication-prohibitedzaddress-unreachablezport-unreachablezpacket-too-bigzttl-zero-during-transitzttl-zero-during-reassemblyz
bad-headerzunknown-header-typezunknown-optionzecho-requestrz
echo-replyrzrouter-solicitationzrouter-advertisementzneighbour-solicitationzneigbour-solicitationzneighbour-advertisementzneigbour-advertisementZredirectcCs|tkrdSdS)NTF)r)�_name�r�/usr/lib/python3.6/icmp.py�check_icmp_nameVsr
cCs|tj�krdSdS)NTF)r�values)�_typerrr	r[scCs|tkrdSdS)NTF)r)rrrr	�check_icmpv6_name`sr
cCs|tj�krdSdS)NTF)rr)rrrr	resN)�__all__rrr
rr
rrrrr	�<module>sxipset.cpython-36.opt-1.pyc000064400000021161151730727350011270 0ustar003

��gq2�@s�dZdddgZddlZddlZddlmZddlmZddl	m
Z
dd	lmZdd
l
mZmZddlmZdZd
ddddddddddgZddddd�Zdddd�ZGd d�de�Zd!d�Zd"d�Zd#d$�Zd%d&�Zd'd(�ZdS))zThe ipset command wrapper�ipset�check_ipset_name�remove_default_create_options�N)�errors)�
FirewallError)�runProg)�log)�tempFile�readfile)�COMMANDS� zhash:ipzhash:ip,portzhash:ip,port,ipzhash:ip,port,netzhash:ip,markzhash:netzhash:net,netz
hash:net,portzhash:net,port,netzhash:net,ifacezhash:macz
inet|inet6�valuez
value in secs)�family�hashsize�maxelem�timeoutZinetZ1024Z65536)rrrc@s�eZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Zd'd
d�Z	dd�Z
dd�Zdd�Zd(dd�Z
d)dd�Zdd�Zd*dd�Zd+dd�Zdd �Zd!d"�Zd#d$�Zd%d&�ZdS),rzipset command wrapper classcCstd|_d|_dS)Nr)r�_command�name)�self�r�/usr/lib/python3.6/ipset.py�__init__Ks
zipset.__init__cCs^dd�|D�}tjd|j|jdj|��t|j|�\}}|dkrZtd|jdj|�|f��|S)zCall ipset with argscSsg|]}d|�qS)z%sr)�.0�itemrrr�
<listcomp>Rszipset.__run.<locals>.<listcomp>z	%s: %s %s� rz'%s %s' failed: %s)r�debug2�	__class__r�joinr�
ValueError)r�argsZ_args�status�retrrrZ__runOszipset.__runcCs t|�tkrttjd|��dS)zCheck ipset namezipset name '%s' is not validN)�len�IPSET_MAXNAMELENrrZINVALID_NAME)rrrrr�
check_nameZszipset.check_namecCs�g}d}y|jdg�}Wn0tk
rH}ztjd|�WYdd}~XnX|j�}d}xT|D]L}|r�|j�jdd�}|d|kr�|dtkr�|j|d�|j	d�r\d	}q\W|S)
z?Return types that are supported by the ipset command and kernel�z--helpzipset error: %sNF�rzSupported set types:T)
�_ipset__runrrZdebug1�
splitlines�strip�split�IPSET_TYPES�append�
startswith)rr"�outputZex�linesZin_types�line�splitsrrr�set_supported_types`s  

zipset.set_supported_typescCs(t|�tks|tkr$ttjd|��dS)zCheck ipset typez!ipset type name '%s' is not validN)r#r$r,rrZINVALID_TYPE)r�	type_namerrr�
check_typeuszipset.check_typeNcCsd|j|�|j|�d||g}t|t�rZx0|j�D]$\}}|j|�|dkr2|j|�q2W|j|�S)z+Create an ipset with name, type and options�creater&)r%r5�
isinstance�dict�itemsr-r()r�set_namer4�optionsr �key�valrrr�
set_create{s




zipset.set_createcCs|j|�|jd|g�S)NZdestroy)r%r()rr:rrr�set_destroy�s
zipset.set_destroycCsd||g}|j|�S)N�add)r()rr:�entryr rrr�set_add�s
z
ipset.set_addcCsd||g}|j|�S)N�del)r()rr:rAr rrr�
set_delete�s
zipset.set_deletecCs,d||g}|r"|jddj|��|j|�S)N�testz%sr)r-rr()rr:rAr;r rrrrE�s
z
ipset.testcCs2dg}|r|j|�|r"|j|�|j|�jd�S)N�list�
)r-�extendr(r+)rr:r;r rrr�set_list�s

zipset.set_listcCs<|jdgd�}i}d}}i}�x|D�]}t|�dkr:q&dd�|jdd�D�}t|�dkr`q&q&|d	d
krv|d}q&|d	dkr�|d}q&|d	dkr&|dj�}d	}	x^|	t|�k�r||	}
|
dk�r�t|�|	kr�|	d7}	||	||
<ntjd|�iS|	d7}	q�W|�r$|�r$|t|�f||<d}}|j�q&W|S)z" Get active ipsets (only headers) z-terse)r;N�cSsg|]}|j��qSr)r*)r�xrrrr�sz.ipset.set_get_active_terse.<locals>.<listcomp>�:r'r�NameZTypeZHeaderrrrr�netmaskz&Malformed ipset list -terse output: %s)rrrrrN)rIr#r+r�errorr�clear)rr0r"�_nameZ_type�_optionsr1Zpairr2�i�optrrr�set_get_active_terse�sD

zipset.set_get_active_tersecCsdg}|r|j|�|j|�S)N�save)r-r()rr:r rrrrV�s
z
ipset.savecCs�|j|�|j|�t�}d|kr*d|}d||dg}|rlx0|j�D]$\}}	|j|�|	dkrD|j|	�qDW|jddj|��|jd|�xN|D]F}
d|
kr�d|
}
|r�|jd||
dj|�f�q�|jd	||
f�q�W|j�tj	|j
�}tjd
|j
|jd|j
|jf�dg}t|j||j
d
�\}}
tj�dk�r�yt|j
�Wntk
�r`YnVXd}xNt|j
�D]@}tjd||fddd�|jd��s�tjddd�|d7}�qrWtj|j
�|dk�r�td|jdj|�|
f��|
S)Nrz'%s'r6z-existr&z%s
z	flush %s
z
add %s %s %s
z
add %s %s
z%s: %s restore %sz%s: %dZrestore)�stdinr'rJz%8d: %sr)�nofmt�nlrG)rXz'%s %s' failed: %s)r%r5r	r9r-�writer�close�os�statrrrrr�st_sizerZgetDebugLogLevelr
�	ExceptionZdebug3�endswith�unlinkr)rr:r4�entriesZcreate_optionsZ
entry_optionsZ	temp_filer r<r=rAr]r!r"rSr1rrr�set_restore�sV




zipset.set_restorecCsdg}|r|j|�|j|�S)N�flush)r-r()rr:r rrr�	set_flushs
zipset.set_flushcCs|jd||g�S)N�rename)r()rZold_set_nameZnew_set_namerrrrf
szipset.renamecCs|jd||g�S)N�swap)r()rZ
set_name_1Z
set_name_2rrrrgsz
ipset.swapcCs|jdg�S)N�version)r()rrrrrhsz
ipset.version)N)N)NN)N)NN)�__name__�
__module__�__qualname__�__doc__rr(r%r3r5r>r?rBrDrErIrUrVrcrerfrgrhrrrrrHs&



'

7cCst|�tkrdSdS)z"Return true if ipset name is validFT)r#r$)rrrrrscCs8|j�}x*tD]"}||krt|||kr||=qW|S)z( Return only non default create options )�copy�IPSET_DEFAULT_CREATE_OPTIONS)r;rRrTrrrrs

c
Cshg}xX|jd�D]J}y&|jd�|jttj|dd���Wqtk
rX|j|�YqXqWdj|�S)z! Normalize IP addresses in entry �,�/F)�strict)r+�indexr-�str�	ipaddress�
ip_networkrr)rAZ_entryZ_partrrr�normalize_ipset_entry&s
rvcCsxt|jd��dkrdSytj|dd�}Wntk
r<dSXx4|D],}|jtj|dd��rDttjdj	||���qDWdS)z: Check if entry overlaps any entry in the list of entries rorJNF)rqz,Entry '{}' overlaps with existing entry '{}')
r#r+rtrur�overlapsrr�
INVALID_ENTRY�format)rArbZ
entry_networkZitrrrr�check_entry_overlaps_existing2s
rzcCs~ydd�|D�}Wntk
r&dSXt|�dkr8dS|j�|jd�}x.|D]&}|j|�rrttjdj||���|}qPWdS)z> Check if any entry overlaps any entry in the list of entries cSsg|]}tj|dd��qS)F)rq)rtru)rrKrrrrEsz1check_for_overlapping_entries.<locals>.<listcomp>NrzEntry '{}' overlaps entry '{}')	rr#�sort�poprwrrrxry)rbZprev_networkZcurrent_networkrrr�check_for_overlapping_entriesBs2


r})rl�__all__Zos.pathr\rtZfirewallrZfirewall.errorsrZfirewall.core.progrZfirewall.core.loggerrZfirewall.functionsr	r
Zfirewall.configrr$r,ZIPSET_CREATE_OPTIONSrn�objectrrrrvrzr}rrrr�<module>sF
P	fw_config.cpython-36.pyc000064400000077161151730727350011161 0ustar003

��g��@s�dgZddlZddlZddlZddlZddlmZddlmZddl	m
Z
mZmZddl
mZmZmZddlmZmZmZddlmZmZmZdd	lmZmZmZdd
lmZmZm Z ddlm!Z!ddl"m#Z#Gd
d�de$�Z%dS)�FirewallConfig�N)�config)�log)�IcmpType�icmptype_reader�icmptype_writer)�Service�service_reader�service_writer)�Zone�zone_reader�zone_writer)�IPSet�ipset_reader�ipset_writer)�Helper�
helper_reader�
helper_writer)�Policy�
policy_reader�
policy_writer)�errors)�
FirewallErrorc@s$eZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zdd �Zd!d"�Zd#d$�Zd%d&�Zd'd(�Zd)d*�Zd+d,�Zd-d.�Zd/d0�Zd1d2�Zd3d4�Zd5d6�Zd7d8�Zd9d:�Zd;d<�Z d=d>�Z!d?d@�Z"dAdB�Z#dCdD�Z$dEdF�Z%dGdH�Z&dIdJ�Z'dKdL�Z(dMdN�Z)dOdP�Z*dQdR�Z+dSdT�Z,dUdV�Z-dWdX�Z.dYdZ�Z/d[d\�Z0d]d^�Z1d_d`�Z2dadb�Z3dcdd�Z4dedf�Z5dgdh�Z6didj�Z7dkdl�Z8dmdn�Z9dodp�Z:dqdr�Z;dsdt�Z<dudv�Z=dwdx�Z>dydz�Z?d{d|�Z@d}d~�ZAdd��ZBd�d��ZCd�d��ZDd�d��ZEd�d��ZFd�d��ZGd�d��ZHd�d��ZId�d��ZJd�d��ZKd�d��ZLd�d��ZMd�d��ZNd�d��ZOd�d��ZPd�d��ZQd�d��ZRd�d��ZSd�d��ZTd�d��ZUd�d��ZVd�d��ZWd�d��ZXd�d��ZYd�d��ZZd�d��Z[d�d��Z\d�d��Z]d�d��Z^d�d��Z_d�d��Z`d�d��Zad�d��Zbd�d„Zcd�dĄZdd�dƄZed�S)�rcCs||_|j�dS)N)�_fw�_FirewallConfig__init_vars)�self�fw�r�/usr/lib/python3.6/fw_config.py�__init__(szFirewallConfig.__init__cCsHd|j|j|j|j|j|j|j|j|j|j	|j
|j|j|j
|j|jfS)Nz>%s(%r, %r, %r, %r, %r, %r, %r, %r, %r, %r, %r, %r, %r, %r, %r))�	__class__�_ipsets�
_icmptypes�	_services�_zones�_helpersZpolicy_objects�_builtin_ipsets�_builtin_icmptypes�_builtin_services�_builtin_zones�_builtin_helpers�_builtin_policy_objects�_firewalld_conf�	_policies�_direct)rrrr�__repr__,szFirewallConfig.__repr__cCs^i|_i|_i|_i|_i|_i|_i|_i|_i|_i|_	i|_
i|_d|_d|_
d|_dS)N)r!r"r#r$r%�_policy_objectsr&r'r(r)r*r+r,r-r.)rrrrZ__init_vars6szFirewallConfig.__init_varscCs4x,t|jj��D]}|j|j�|j|=qWx,t|jj��D]}|j|j�|j|=q>Wx,t|jj��D]}|j|j�|j|=qlWx,t|jj��D]}|j|j�|j|=q�Wx,t|jj��D]}|j|j�|j|=q�Wx,t|jj��D]}|j|j�|j|=q�Wx.t|j	j��D]}|j	|j�|j	|=�q$Wx.t|j
j��D]}|j
|j�|j
|=�qTWx.t|jj��D]}|j|j�|j|=�q�Wx.t|jj��D]}|j|j�|j|=�q�W|j
�r�|j
j�|`
d|_
|j�r|jj�|`d|_|j�r(|jj�|`d|_|j�dS)N)�listr&�keys�cleanupr!r'r"r(r#r)r$r*r%r,r-r.r)r�xrrrr3GsV


zFirewallConfig.cleanupcCs|jjj�S)N)r�policiesZquery_lockdown)rrrr�lockdown_enabled~szFirewallConfig.lockdown_enabledcCs|jjj||�S)N)rr5�access_check)r�key�valuerrrr7�szFirewallConfig.access_checkcCs
||_dS)N)r,)r�confrrr�set_firewalld_conf�sz!FirewallConfig.set_firewalld_confcCs|jS)N)r,)rrrr�get_firewalld_conf�sz!FirewallConfig.get_firewalld_confcCs(tjjtj�s|jj�n
|jj�dS)N)�os�path�existsrZFIREWALLD_CONFr,�clear�read)rrrr�update_firewalld_conf�sz$FirewallConfig.update_firewalld_confcCs
||_dS)N)r-)rr5rrr�set_policies�szFirewallConfig.set_policiescCs|jS)N)r-)rrrr�get_policies�szFirewallConfig.get_policiescCs,tjjtj�s|jjj�n|jjj�dS)N)	r=r>r?rZLOCKDOWN_WHITELISTr-Zlockdown_whitelistr3rA)rrrr�update_lockdown_whitelist�sz(FirewallConfig.update_lockdown_whitelistcCs
||_dS)N)r.)rZdirectrrr�
set_direct�szFirewallConfig.set_directcCs|jS)N)r.)rrrr�
get_direct�szFirewallConfig.get_directcCs(tjjtj�s|jj�n
|jj�dS)N)r=r>r?rZFIREWALLD_DIRECTr.r3rA)rrrr�
update_direct�szFirewallConfig.update_directcCs$ttt|jj��t|jj����S)N)�sorted�setr1r!r2r&)rrrr�
get_ipsets�szFirewallConfig.get_ipsetscCs$|jr||j|j<n||j|j<dS)N)�builtinr&�namer!)r�objrrr�	add_ipset�szFirewallConfig.add_ipsetcCs8||jkr|j|S||jkr(|j|Sttj|��dS)N)r!r&rr�
INVALID_IPSET)rrMrrr�	get_ipset�s




zFirewallConfig.get_ipsetcCst|j|jkrttj|j��nB|j|j|kr@ttjd|j��n|j|jkr^ttjd|j��|j|�|j|jS)Nzself._ipsets[%s] != objz'%s' not a built-in ipset)rMr!rr�NO_DEFAULTSr&�
_remove_ipset)rrNrrr�load_ipset_defaults�s
z"FirewallConfig.load_ipset_defaultscCs|j�S)N)�
export_config)rrNrrr�get_ipset_config�szFirewallConfig.get_ipset_configcCsj|jrPtj|�}|j|�tj|_d|_|j|jkr:d|_|j|�t|�|S|j|�t|�|SdS)NF)	rL�copy�
import_configr�ETC_FIREWALLD_IPSETSr>�defaultrOr)rrNr:r4rrr�set_ipset_config�s



zFirewallConfig.set_ipset_configcCsx||jks||jkr$ttjd|��t�}|j|�|j|�||_d||_	t
j|_d|_
d|_t|�|j|�|S)Nznew_ipset(): '%s'z%s.xmlFT)r!r&rr�
NAME_CONFLICTr�
check_namerXrM�filenamerrYr>rLrZrrO)rrMr:r4rrr�	new_ipset�s




zFirewallConfig.new_ipsetcCs�tjj|�}tjj|�}tjj|�s�|tjkr�x�|jj�D]D}|j|}|j	|kr:|j|=|j
|jkrvd|j|j
fSd|fSq:WnHxF|jj�D]8}|j|}|j	|kr�|j|=|j
|jkr�d|fSdSq�WdStj
d|�yt||�}Wn0tk
�r}ztjd||�dSd}~XnX|j
|jk�rJ|j
|jk�rJ|j|�d|fS|tjk�r�|j
|jk�r�|j|j
j|_||j|j
<d|fS|j
|jk�r�|j|j
=||j|j
<|j
|jk�r�d|fSd	Sd
S)N�update�removezLoading ipset file '%s'z"Failed to load ipset file '%s': %s�new)NN)NN)NN)NN)NN)r=r>�basename�dirnamer?rrYr!r2r^rMr&r�debug1r�	Exception�errorrOrZ)rrMr^r>r4rN�msgrrr�update_ipset_from_path�sP






z%FirewallConfig.update_ipset_from_pathcCs�|j|jkrttj|j��|jtjkr>ttjd|jtjf��d|j|jf}yt	j
|d|�Wn:tk
r�}ztj
d||�tj|�WYdd}~XnX|j|j=dS)Nz'%s' != '%s'z	%s/%s.xmlz%s.oldzBackup of file '%s' failed: %s)rMr!rrrPr>rrY�INVALID_DIRECTORY�shutil�moverfrrgr=ra)rrNrMrhrrrrS8szFirewallConfig._remove_ipsetcCs$|js|jr ttjd|j��dS)Nz'%s' is built-in ipset)rLrZrrZ
BUILTIN_IPSETrM)rrNrrr�check_builtin_ipsetIsz"FirewallConfig.check_builtin_ipsetcCs|j|�|j|�dS)N)rmrS)rrNrrr�remove_ipsetNs
zFirewallConfig.remove_ipsetcCs$|j|�|j||�}|j|�|S)N)rm�_copy_ipsetrS)rrNrMr_rrr�rename_ipsetRs

zFirewallConfig.rename_ipsetcCs|j||j��S)N)r_rU)rrNrMrrrroXszFirewallConfig._copy_ipsetcCs$ttt|jj��t|jj����S)N)rIrJr1r"r2r')rrrr�
get_icmptypes]szFirewallConfig.get_icmptypescCs$|jr||j|j<n||j|j<dS)N)rLr'rMr")rrNrrr�add_icmptypeaszFirewallConfig.add_icmptypecCs8||jkr|j|S||jkr(|j|Sttj|��dS)N)r"r'rr�INVALID_ICMPTYPE)rrMrrr�get_icmptypegs




zFirewallConfig.get_icmptypecCst|j|jkrttj|j��nB|j|j|kr@ttjd|j��n|j|jkr^ttjd|j��|j|�|j|jS)Nzself._icmptypes[%s] != objz'%s' not a built-in icmptype)rMr"rrrRr'�_remove_icmptype)rrNrrr�load_icmptype_defaultsns
z%FirewallConfig.load_icmptype_defaultscCs|j�S)N)rU)rrNrrr�get_icmptype_configzsz"FirewallConfig.get_icmptype_configcCsj|jrPtj|�}|j|�tj|_d|_|j|jkr:d|_|j|�t|�|S|j|�t|�|SdS)NF)	rLrWrXr�ETC_FIREWALLD_ICMPTYPESr>rZrrr)rrNr:r4rrr�set_icmptype_config}s



z"FirewallConfig.set_icmptype_configcCsx||jks||jkr$ttjd|��t�}|j|�|j|�||_d||_	t
j|_d|_
d|_t|�|j|�|S)Nznew_icmptype(): '%s'z%s.xmlFT)r"r'rrr\rr]rXrMr^rrxr>rLrZrrr)rrMr:r4rrr�new_icmptype�s




zFirewallConfig.new_icmptypecCs�tjj|�}tjj|�}tjj|�s�|tjkr�x�|jj�D]D}|j|}|j	|kr:|j|=|j
|jkrvd|j|j
fSd|fSq:WnHxF|jj�D]8}|j|}|j	|kr�|j|=|j
|jkr�d|fSdSq�WdStj
d|�yt||�}Wn0tk
�r}ztjd||�dSd}~XnX|j
|jk�rJ|j
|jk�rJ|j|�d|fS|tjk�r�|j
|jk�r�|j|j
j|_||j|j
<d|fS|j
|jk�r�|j|j
=||j|j
<|j
|jk�r�d|fSd	Sd
S)Nr`razLoading icmptype file '%s'z%Failed to load icmptype file '%s': %srb)NN)NN)NN)NN)NN)r=r>rcrdr?rrxr"r2r^rMr'rrerrfrgrrrZ)rrMr^r>r4rNrhrrr�update_icmptype_from_path�sP






z(FirewallConfig.update_icmptype_from_pathcCs�|j|jkrttj|j��|jtjkr>ttjd|jtjf��d|j|jf}yt	j
|d|�Wn:tk
r�}ztj
d||�tj|�WYdd}~XnX|j|j=dS)Nz'%s' != '%s'z	%s/%s.xmlz%s.oldzBackup of file '%s' failed: %s)rMr"rrrsr>rrxrjrkrlrfrrgr=ra)rrNrMrhrrrru�szFirewallConfig._remove_icmptypecCs$|js|jr ttjd|j��dS)Nz'%s' is built-in icmp type)rLrZrrZBUILTIN_ICMPTYPErM)rrNrrr�check_builtin_icmptype�sz%FirewallConfig.check_builtin_icmptypecCs|j|�|j|�dS)N)r|ru)rrNrrr�remove_icmptype�s
zFirewallConfig.remove_icmptypecCs$|j|�|j||�}|j|�|S)N)r|�_copy_icmptyperu)rrNrMrzrrr�rename_icmptype�s

zFirewallConfig.rename_icmptypecCs|j||j��S)N)rzrU)rrNrMrrrr~szFirewallConfig._copy_icmptypecCs$ttt|jj��t|jj����S)N)rIrJr1r#r2r()rrrr�get_services
szFirewallConfig.get_servicescCs$|jr||j|j<n||j|j<dS)N)rLr(rMr#)rrNrrr�add_serviceszFirewallConfig.add_servicecCs<||jkr|j|S||jkr(|j|Sttjd|��dS)Nzget_service(): '%s')r#r(rr�INVALID_SERVICE)rrMrrr�get_services




zFirewallConfig.get_servicecCst|j|jkrttj|j��nB|j|j|kr@ttjd|j��n|j|jkr^ttjd|j��|j|�|j|jS)Nzself._services[%s] != objz'%s' not a built-in service)rMr#rrrRr(�_remove_service)rrNrrr�load_service_defaultss
z$FirewallConfig.load_service_defaultscCsr|j�}g}x\td�D]P}|j|d|krN|jtjt||j|d���q|j||j|d�qWt|�S)N�r)�export_config_dict�range�IMPORT_EXPORT_STRUCTURE�appendrW�deepcopy�getattr�tuple)rrN�	conf_dict�	conf_list�irrr�get_service_config's"z!FirewallConfig.get_service_configcCs|j�S)N)r�)rrNrrr�get_service_config_dict3sz&FirewallConfig.get_service_config_dictcCs�i}x&t|�D]\}}|||j|d<qW|jr|tj|�}|j|�tj|_d|_|j|jkrfd|_|j	|�t
|�|S|j|�t
|�|SdS)NrF)�	enumerater�rLrW�import_config_dictr�ETC_FIREWALLD_SERVICESr>rZr�r
)rrNr:r�r�r9r4rrr�set_service_config6s 



z!FirewallConfig.set_service_configcCsj|jrPtj|�}|j|�tj|_d|_|j|jkr:d|_|j|�t|�|S|j|�t|�|SdS)NF)	rLrWr�rr�r>rZr�r
)rrNr:r4rrr�set_service_config_dictJs



z&FirewallConfig.set_service_config_dictcCs�||jks||jkr$ttjd|��i}x&t|�D]\}}||tj|d<q2Wt�}|j|�|j	|�||_
d||_tj
|_d|_d|_t|�|j|�|S)Nznew_service(): '%s'rz%s.xmlFT)r#r(rrr\r�rr�r]r�rMr^rr�r>rLrZr
r�)rrMr:r�r�r9r4rrr�new_serviceZs"




zFirewallConfig.new_servicecCsx||jks||jkr$ttjd|��t�}|j|�|j|�||_d||_	t
j|_d|_
d|_t|�|j|�|S)Nznew_service(): '%s'z%s.xmlFT)r#r(rrr\rr]r�rMr^rr�r>rLrZr
r�)rrMr:r4rrr�new_service_dictqs




zFirewallConfig.new_service_dictcCs�tjj|�}tjj|�}tjj|�s�|tjkr�x�|jj�D]D}|j|}|j	|kr:|j|=|j
|jkrvd|j|j
fSd|fSq:WnHxF|jj�D]8}|j|}|j	|kr�|j|=|j
|jkr�d|fSdSq�WdStj
d|�yt||�}Wn0tk
�r}ztjd||�dSd}~XnX|j
|jk�rJ|j
|jk�rJ|j|�d|fS|tjk�r�|j
|jk�r�|j|j
j|_||j|j
<d|fS|j
|jk�r�|j|j
=||j|j
<|j
|jk�r�d|fSd	Sd
S)Nr`razLoading service file '%s'z$Failed to load service file '%s': %srb)NN)NN)NN)NN)NN)r=r>rcrdr?rr�r#r2r^rMr(rrer	rfrgr�rZ)rrMr^r>r4rNrhrrr�update_service_from_path�sP






z'FirewallConfig.update_service_from_pathcCs�|j|jkrttj|j��|jtjkr>ttjd|jtjf��d|j|jf}yt	j
|d|�Wn:tk
r�}ztj
d||�tj|�WYdd}~XnX|j|j=dS)Nz'%s' != '%s'z	%s/%s.xmlz%s.oldzBackup of file '%s' failed: %s)rMr#rrr�r>rr�rjrkrlrfrrgr=ra)rrNrMrhrrrr��szFirewallConfig._remove_servicecCs$|js|jr ttjd|j��dS)Nz'%s' is built-in service)rLrZrrZBUILTIN_SERVICErM)rrNrrr�check_builtin_service�sz$FirewallConfig.check_builtin_servicecCs|j|�|j|�dS)N)r�r�)rrNrrr�remove_service�s
zFirewallConfig.remove_servicecCs$|j|�|j||�}|j|�|S)N)r��
_copy_servicer�)rrNrMr�rrr�rename_service�s

zFirewallConfig.rename_servicecCs|j||j��S)N)r�r�)rrNrMrrrr��szFirewallConfig._copy_servicecCs$ttt|jj��t|jj����S)N)rIrJr1r$r2r))rrrr�	get_zones�szFirewallConfig.get_zonescCs$|jr||j|j<n||j|j<dS)N)rLr)rMr$)rrNrrr�add_zone�szFirewallConfig.add_zonecCs(||jkr|j|=||jkr$|j|=dS)N)r)r$)rrMrrr�forget_zone�s

zFirewallConfig.forget_zonecCs<||jkr|j|S||jkr(|j|Sttjd|��dS)Nzget_zone(): %s)r$r)rr�INVALID_ZONE)rrMrrr�get_zone�s




zFirewallConfig.get_zonecCst|j|jkrttj|j��nB|j|j|kr@ttjd|j��n|j|jkr^ttjd|j��|j|�|j|jS)Nzself._zones[%s] != objz'%s' not a built-in zone)rMr$rrrRr)�_remove_zone)rrNrrr�load_zone_defaultss
z!FirewallConfig.load_zone_defaultscCsr|j�}g}x\td�D]P}|j|d|krN|jtjt||j|d���q|j||j|d�qWt|�S)N�r)r�r�r�r�rWr�r�r�)rrNr�r�r�rrr�get_zone_configs"zFirewallConfig.get_zone_configcCs|j�S)N)r�)rrNrrr�get_zone_config_dictsz#FirewallConfig.get_zone_config_dictcCs�i}x&t|�D]\}}|||j|d<qW|jr�tj|�}||_|j|�tj|_d|_|j|jkrld|_	|j
|�t|�|S||_|j|�t|�|SdS)NrF)r�r�rLrW�	fw_configr�r�ETC_FIREWALLD_ZONESr>rZr�r
)rrNr:r�r�r9r4rrr�set_zone_config s$



zFirewallConfig.set_zone_configcCsv|jrVtj|�}||_|j|�tj|_d|_|j|jkr@d|_|j|�t	|�|S||_|j|�t	|�|SdS)NF)
rLrWr�r�rr�r>rZr�r
)rrNr:r4rrr�set_zone_config_dict6s



z#FirewallConfig.set_zone_config_dictcCs�||jks||jkr$ttjd|��i}x&t|�D]\}}||tj|d<q2Wt�}||_|j	|�|j
|�||_d||_t
j|_d|_d|_t|�|j|�|S)Nznew_zone(): '%s'rz%s.xmlFT)r$r)rrr\r�rr�r�r]r�rMr^rr�r>rLrZr
r�)rrMr:r�r�r9r4rrr�new_zoneHs"



zFirewallConfig.new_zonecCs~||jks||jkr$ttjd|��t�}||_|j|�|j|�||_	d||_
tj|_
d|_d|_t|�|j|�|S)Nznew_zone(): '%s'z%s.xmlFT)r$r)rrr\rr�r]r�rMr^rr�r>rLrZr
r�)rrMr:r4rrr�
new_zone_dict_s



zFirewallConfig.new_zone_dictcCstjj|�}tjj|�}tjj|�s�|jtj�r�x�|jj	�D]D}|j|}|j
|kr<|j|=|j|jkrxd|j|jfSd|fSq<WnHxF|jj	�D]8}|j|}|j
|kr�|j|=|j|jkr�d|fSd	Sq�Wd
St
jd|�yt||�}Wn0tk
�r}zt
jd||�dSd}~XnX||_|jtj��rlt|�ttj�k�rldtjj|�tjj|�dd�f|_|j|jk�r�|j|jk�r�|j|�d|fS|jtj��r�|j|jk�r�|j|jj|_||j|j<d|fS|j|jk�r|j|j=||j|j<|j|jk�rd|fSd
SdS)Nr`razLoading zone file '%s'z!Failed to load zone file '%s': %sz%s/%sr�rb)NN)NN)NN���)NN)NN)r=r>rcrdr?�
startswithrr�r$r2r^rMr)rrerrfrgr��lenr�rZ)rrMr^r>r4rNrhrrr�update_zone_from_pathrsZ





z$FirewallConfig.update_zone_from_pathcCs�|j|jkrttj|j��|jjtj�s@ttj	d|jtjf��d|j|jf}yt
j|d|�Wn:tk
r�}zt
jd||�tj|�WYdd}~XnX|j|j=dS)Nz'%s' doesn't start with '%s'z	%s/%s.xmlz%s.oldzBackup of file '%s' failed: %s)rMr$rrr�r>r�rr�rjrkrlrfrrgr=ra)rrNrMrhrrrr��szFirewallConfig._remove_zonecCs$|js|jr ttjd|j��dS)Nz'%s' is built-in zone)rLrZrrZBUILTIN_ZONErM)rrNrrr�check_builtin_zone�sz!FirewallConfig.check_builtin_zonecCs|j|�|j|�dS)N)r�r�)rrNrrr�remove_zone�s
zFirewallConfig.remove_zonec	CsN|j|�|j�}|j|�y|j||�}Wn|j|j|��YnX|S)N)r�r�r�r�rM)rrNrMZobj_confr�rrr�rename_zone�s

zFirewallConfig.rename_zonecCs$ttt|jj��t|jj����S)N)rIrJr1r0r2r+)rrrr�get_policy_objects�sz!FirewallConfig.get_policy_objectscCs$|jr||j|j<n||j|j<dS)N)rLr+rMr0)rrNrrr�add_policy_object�sz FirewallConfig.add_policy_objectcCs<||jkr|j|S||jkr(|j|Sttjd|��dS)Nzget_policy_object(): %s)r0r+rr�INVALID_POLICY)rrMrrr�get_policy_object�s




z FirewallConfig.get_policy_objectcCst|j|jkrttj|j��nB|j|j|kr@ttjd|j��n|j|jkr^ttjd|j��|j|�|j|jS)Nzself._policy_objects[%s] != objz'%s' not a built-in policy)rMr0rrrRr+�_remove_policy_object)rrNrrr�load_policy_object_defaults�s
z*FirewallConfig.load_policy_object_defaultscCs|j�S)N)r�)rrNrrr�get_policy_object_config_dictsz,FirewallConfig.get_policy_object_config_dictcCsv|jrVtj|�}||_|j|�tj|_d|_|j|jkr@d|_|j|�t	|�|S||_|j|�t	|�|SdS)NF)
rLrWr�r�r�ETC_FIREWALLD_POLICIESr>rZr�r)rrNr:r4rrr�set_policy_object_config_dicts



z,FirewallConfig.set_policy_object_config_dictcCs~||jks||jkr$ttjd|��t�}||_|j|�|j|�||_	d||_
tj|_
d|_d|_t|�|j|�|S)Nznew_policy_object(): '%s'z%s.xmlFT)r0r+rrr\rr�r]r�rMr^rr�r>rLrZrr�)rrMr:r4rrr�new_policy_object_dicts



z%FirewallConfig.new_policy_object_dictcCstjj|�}tjj|�}tjj|�s�|jtj�r�x�|jj	�D]D}|j|}|j
|kr<|j|=|j|jkrxd|j|jfSd|fSq<WnHxF|jj	�D]8}|j|}|j
|kr�|j|=|j|jkr�d|fSd	Sq�Wd
St
jd|�yt||�}Wn0tk
�r}zt
jd||�dSd}~XnX||_|jtj��rlt|�ttj�k�rldtjj|�tjj|�dd�f|_|j|jk�r�|j|jk�r�|j|�d|fS|jtj��r�|j|jk�r�|j|jj|_||j|j<d|fS|j|jk�r|j|j=||j|j<|j|jk�rd|fSd
SdS)Nr`razLoading policy file '%s'z#Failed to load policy file '%s': %sz%s/%srr�rb)NN)NN)NNr�)NN)NN)r=r>rcrdr?r�rr�r0r2r^rMr+rrerrfrgr�r�r�rZ)rrMr^r>r4rNrhrrr�update_policy_object_from_path,sZ





z-FirewallConfig.update_policy_object_from_pathcCs�|j|jkrttj|j��|jjtj�s@ttj	d|jtjf��d|j|jf}yt
j|d|�Wn:tk
r�}zt
jd||�tj|�WYdd}~XnX|j|j=dS)Nz'%s' doesn't start with '%s'z	%s/%s.xmlz%s.oldzBackup of file '%s' failed: %s)rMr0rrr�r>r�rr�rjrkrlrfrrgr=ra)rrNrMrhrrrr�ysz$FirewallConfig._remove_policy_objectcCs$|js|jr ttjd|j��dS)Nz'%s' is built-in policy)rLrZrrZBUILTIN_POLICYrM)rrNrrr�check_builtin_policy_object�sz*FirewallConfig.check_builtin_policy_objectcCs|j|�|j|�dS)N)r�r�)rrNrrr�remove_policy_object�s
z#FirewallConfig.remove_policy_objectcCs$|j|�|j||�}|j|�|S)N)r��_copy_policy_objectr�)rrNrMZnew_policy_objectrrr�rename_policy_object�s

z#FirewallConfig.rename_policy_objectcCs|j||j��S)N)r�r�)rrNrMrrrr��sz"FirewallConfig._copy_policy_objectcCs$ttt|jj��t|jj����S)N)rIrJr1r%r2r*)rrrr�get_helpers�szFirewallConfig.get_helperscCs$|jr||j|j<n||j|j<dS)N)rLr*rMr%)rrNrrr�
add_helper�szFirewallConfig.add_helpercCs8||jkr|j|S||jkr(|j|Sttj|��dS)N)r%r*rr�INVALID_HELPER)rrMrrr�
get_helper�s




zFirewallConfig.get_helpercCst|j|jkrttj|j��nB|j|j|kr@ttjd|j��n|j|jkr^ttjd|j��|j|�|j|jS)Nzself._helpers[%s] != objz'%s' not a built-in helper)rMr%rrrRr*�_remove_helper)rrNrrr�load_helper_defaults�s
z#FirewallConfig.load_helper_defaultscCs|j�S)N)rU)rrNrrr�get_helper_config�sz FirewallConfig.get_helper_configcCsj|jrPtj|�}|j|�tj|_d|_|j|jkr:d|_|j|�t|�|S|j|�t|�|SdS)NF)	rLrWrXr�ETC_FIREWALLD_HELPERSr>rZr�r)rrNr:r4rrr�set_helper_config�s



z FirewallConfig.set_helper_configcCsx||jks||jkr$ttjd|��t�}|j|�|j|�||_d||_	t
j|_d|_
d|_t|�|j|�|S)Nznew_helper(): '%s'z%s.xmlFT)r%r*rrr\rr]rXrMr^rr�r>rLrZrr�)rrMr:r4rrr�
new_helper�s




zFirewallConfig.new_helpercCs�tjj|�}tjj|�}tjj|�s�|tjkr�x�|jj�D]D}|j|}|j	|kr:|j|=|j
|jkrvd|j|j
fSd|fSq:WnHxF|jj�D]8}|j|}|j	|kr�|j|=|j
|jkr�d|fSdSq�WdStj
d|�yt||�}Wn0tk
�r}ztjd||�dSd}~XnX|j
|jk�rJ|j
|jk�rJ|j|�d|fS|tjk�r�|j
|jk�r�|j|j
j|_||j|j
<d|fS|j
|jk�r�|j|j
=||j|j
<|j
|jk�r�d|fSd	Sd
S)Nr`razLoading helper file '%s'z#Failed to load helper file '%s': %srb)NN)NN)NN)NN)NN)r=r>rcrdr?rr�r%r2r^rMr*rrerrfrgr�rZ)rrMr^r>r4rNrhrrr�update_helper_from_path�sP






z&FirewallConfig.update_helper_from_pathcCs�|j|jkrttj|j��|jtjkr>ttjd|jtjf��d|j|jf}yt	j
|d|�Wn:tk
r�}ztj
d||�tj|�WYdd}~XnX|j|j=dS)Nz'%s' != '%s'z	%s/%s.xmlz%s.oldzBackup of file '%s' failed: %s)rMr%rrr�r>rr�rjrkrlrfrrgr=ra)rrNrMrhrrrr�&szFirewallConfig._remove_helpercCs$|js|jr ttjd|j��dS)Nz'%s' is built-in helper)rLrZrrZBUILTIN_HELPERrM)rrNrrr�check_builtin_helper7sz#FirewallConfig.check_builtin_helpercCs|j|�|j|�dS)N)r�r�)rrNrrr�
remove_helper<s
zFirewallConfig.remove_helpercCs$|j|�|j||�}|j|�|S)N)r��_copy_helperr�)rrNrMr�rrr�
rename_helper@s

zFirewallConfig.rename_helpercCs|j||j��S)N)r�rU)rrNrMrrrr�FszFirewallConfig._copy_helperN)f�__name__�
__module__�__qualname__rr/rr3r6r7r;r<rBrCrDrErFrGrHrKrOrQrTrVr[r_rirSrmrnrprorqrrrtrvrwryrzr{rur|r}rr~r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rrrrr's�
7EEEMME)&�__all__rWr=Zos.pathrkZfirewallrZfirewall.core.loggerrZfirewall.core.io.icmptyperrrZfirewall.core.io.servicerr	r
Zfirewall.core.io.zonerrr
Zfirewall.core.io.ipsetrrrZfirewall.core.io.helperrrrZfirewall.core.io.policyrrrrZfirewall.errorsr�objectrrrrr�<module>sfw_icmptype.cpython-36.opt-1.pyc000064400000004205151730727350012472 0ustar003

��g�	�@s>dgZddlmZddlmZddlmZGdd�de�ZdS)�FirewallIcmpType�)�log)�errors)�
FirewallErrorc@sLeZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dS)rcCs||_i|_dS)N)�_fw�
_icmptypes)�self�fw�r
�!/usr/lib/python3.6/fw_icmptype.py�__init__szFirewallIcmpType.__init__cCsd|j|jfS)Nz%s(%r))�	__class__r)rr
r
r�__repr__!szFirewallIcmpType.__repr__cCs|jj�dS)N)r�clear)rr
r
r�cleanup$szFirewallIcmpType.cleanupcCst|jj��S)N)�sortedr�keys)rr
r
r�
get_icmptypes)szFirewallIcmpType.get_icmptypescCs||jkrttj|��dS)N)rrrZINVALID_ICMPTYPE)r�icmptyper
r
r�check_icmptype,s
zFirewallIcmpType.check_icmptypecCs|j|�|j|S)N)rr)rrr
r
r�get_icmptype0s
zFirewallIcmpType.get_icmptypecCs�|j}t|�dkrddg}x�|D]z}|dkrL|jjrB|jjrBq |jj}n,|dkrt|jjrj|jjrjq |jj}ng}|jj	�|kr t
jd|j|f�q W||j|j<dS)NrZipv4Zipv6z5ICMP type '%s' is not supported by the kernel for %s.)
Zdestination�lenrZip4tables_enabledZnftables_enabledZipv4_supported_icmp_typesZip6tables_enabledZipv6_supported_icmp_types�name�lowerrZinfo1r)r�objZ	orig_ipvsZipvZsupported_icmpsr
r
r�add_icmptype4s 


zFirewallIcmpType.add_icmptypecCs|j|�|j|=dS)N)rr)rrr
r
r�remove_icmptypeGs
z FirewallIcmpType.remove_icmptypeN)�__name__�
__module__�__qualname__rrrrrrrrr
r
r
rrsN)	�__all__Zfirewall.core.loggerrZfirewallrZfirewall.errorsr�objectrr
r
r
r�<module>sfw_ifcfg.cpython-36.pyc000064400000002613151730727350010760 0ustar003

��g
�@sTdZddgZddlZddlZddlmZddlmZddlm	Z	dd�Z
d	d�ZdS)
z.Functions to search for and change ifcfg files�search_ifcfg_of_interface�ifcfg_set_zone_of_interface�N)�config)�log)�ifcfgcCs�tjjtj�sdSxtttjtj��D]`}|jd�s4q$xd
D]}|j|�r:q:q:Wd	|krXq$t	d
tj|f�}|j
�|jd�|kr$|Sq$Wdtj|f}tjj|�r�t	|�}|j
�|SdS)z6search ifcfg file for the interface in config.IFCFGDIRNzifcfg-�.bak�.orig�.rpmnew�.rpmorig�.rpmsave�-range�.z%s/%sZDEVICEz%s/ifcfg-%s)rrr	r
rr)�os�path�existsrZIFCFGDIR�sorted�listdir�
startswith�endswithr�read�get)�	interface�filenameZignored�
ifcfg_file�r�/usr/lib/python3.6/fw_ifcfg.pyr!s*

cCsn|dkrd}t|�}|dk	rj|jd�|krj|jd�dko>|dkrjtjd||jf�|jd|�|j�dS)zYSet zone (ZONE=<zone>) in the ifcfg file that uses the interface
    (DEVICE=<interface>)N�ZZONEzSetting ZONE=%s in '%s')rrrZdebug1r�set�write)Zzonerrrrrr?s)�__doc__�__all__rZos.pathZfirewallrZfirewall.core.loggerrZfirewall.core.io.ifcfgrrrrrrr�<module>sfw_ifcfg.cpython-36.opt-1.pyc000064400000002613151730727350011717 0ustar003

��g
�@sTdZddgZddlZddlZddlmZddlmZddlm	Z	dd�Z
d	d�ZdS)
z.Functions to search for and change ifcfg files�search_ifcfg_of_interface�ifcfg_set_zone_of_interface�N)�config)�log)�ifcfgcCs�tjjtj�sdSxtttjtj��D]`}|jd�s4q$xd
D]}|j|�r:q:q:Wd	|krXq$t	d
tj|f�}|j
�|jd�|kr$|Sq$Wdtj|f}tjj|�r�t	|�}|j
�|SdS)z6search ifcfg file for the interface in config.IFCFGDIRNzifcfg-�.bak�.orig�.rpmnew�.rpmorig�.rpmsave�-range�.z%s/%sZDEVICEz%s/ifcfg-%s)rrr	r
rr)�os�path�existsrZIFCFGDIR�sorted�listdir�
startswith�endswithr�read�get)�	interface�filenameZignored�
ifcfg_file�r�/usr/lib/python3.6/fw_ifcfg.pyr!s*

cCsn|dkrd}t|�}|dk	rj|jd�|krj|jd�dko>|dkrjtjd||jf�|jd|�|j�dS)zYSet zone (ZONE=<zone>) in the ifcfg file that uses the interface
    (DEVICE=<interface>)N�ZZONEzSetting ZONE=%s in '%s')rrrZdebug1r�set�write)Zzonerrrrrr?s)�__doc__�__all__rZos.pathZfirewallrZfirewall.core.loggerrZfirewall.core.io.ifcfgrrrrrrr�<module>sfw_direct.cpython-36.opt-1.pyc000064400000031230151730727350012110 0ustar003

��g�W�@sndgZddlmZddlmZddlmZddlmZddlm	Z	ddl
mZddlm
Z
Gd	d�de�Zd
S)�FirewallDirect�)�LastUpdatedOrderedDict)�	ipXtables)�ebtables)�FirewallTransaction)�log)�errors)�
FirewallErrorc@sLeZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dNdd�Zdd�Zdd�Z
dOdd�Zdd�Zdd�Zdd�Zd d!�ZdPd"d#�ZdQd$d%�Zd&d'�Zd(d)�Zd*d+�ZdRd,d-�ZdSd.d/�Zd0d1�Zd2d3�Zd4d5�Zd6d7�Zd8d9�Zd:d;�ZdTd<d=�Z dUd>d?�Z!d@dA�Z"dBdC�Z#dDdE�Z$dFdG�Z%dHdI�Z&dJdK�Z'dLdM�Z(dS)VrcCs||_|j�dS)N)�_fw�_FirewallDirect__init_vars)�self�fw�r�/usr/lib/python3.6/fw_direct.py�__init__'szFirewallDirect.__init__cCsd|j|j|j|jfS)Nz%s(%r, %r, %r))�	__class__�_chains�_rules�_rule_priority_positions)rrrr�__repr__+szFirewallDirect.__repr__cCs"i|_i|_i|_i|_d|_dS)N)rrr�
_passthroughs�_obj)rrrrZ__init_vars/s
zFirewallDirect.__init_varscCs|j�dS)N)r)rrrr�cleanup6szFirewallDirect.cleanupcCs
t|j�S)N)rr
)rrrr�new_transaction;szFirewallDirect.new_transactioncCs
||_dS)N)r)r�objrrr�set_permanent_config@sz#FirewallDirect.set_permanent_configcCs*t|j�t|j�t|j�dkr&dSdS)NrTF)�lenrrr)rrrr�has_runtime_configurationCs"z(FirewallDirect.has_runtime_configurationcCsB|j�rdSt|jj��t|jj��t|jj��dkr>dSdS)NTrF)rrr�get_all_chains�
get_all_rules�get_all_passthroughs)rrrr�has_configurationHsz FirewallDirect.has_configurationNcCsP|dkr|j�}n|}|j|jj�|jj�|jj�f|�|dkrL|jd�dS)NT)r�
set_configrrrr �execute)r�use_transaction�transactionrrr�apply_directQs

zFirewallDirect.apply_directcCsi}i}i}xL|jD]B}|\}}x4|j|D]&}|jj|||�s,|j|g�j|�q,WqWxf|jD]\}|\}}}xL|j|D]>\}	}
|jj||||	|
�s|||kr�t�||<|	|||	|
f<q|WqbWxP|jD]F}x@|j|D]2}
|jj	||
�s�||k�r�g||<||j|
�q�Wq�W|||fS)N)
rr�query_chain�
setdefault�appendr�
query_rulerr�query_passthrough)rZchains�rulesZpassthroughs�table_id�ipv�table�chain�chain_id�priority�argsrrr�get_runtime_configbs,


z!FirewallDirect.get_runtime_configcCs|j|j|jfS)N)rrr)rrrr�
get_config�szFirewallDirect.get_configcCs�|dkr|j�}n|}|\}}}x||D]t}|\}}	xf||D]Z}
|j||	|
�s<y|j||	|
|d�Wq<tk
r�}ztjt|��WYdd}~Xq<Xq<Wq&Wx�|D]�}|\}}	}
xt||D]h\}
}|j||	|
|
|�s�y|j||	|
|
||d�Wq�tk
�r"}ztjt|��WYdd}~Xq�Xq�Wq�Wxx|D]p}xh||D]\}|j	||��s@y|j
|||d�Wn2tk
�r�}ztjt|��WYdd}~XnX�q@W�q2W|dk�r�|jd�dS)N)r$T)rr'�	add_chainr	rZwarning�strr*�add_ruler+�add_passthroughr#)rZconfr$r%rrrr-r.r/r0�errorr1r2r3rrrr"�s@



(

(
,
zFirewallDirect.set_configcCs*dddg}||kr&ttjd||f��dS)N�ipv4�ipv6Zebz'%s' not in '%s')r	rZINVALID_IPV)rr.Zipvsrrr�
_check_ipv�s
zFirewallDirect._check_ipvcCsF|j|�|dkrtjj�ntjj�}||krBttjd||f��dS)Nr;r<z'%s' not in '%s')r;r<)r=r�BUILT_IN_CHAINS�keysrr	rZ
INVALID_TABLE)rr.r/Ztablesrrr�_check_ipv_table�s

zFirewallDirect._check_ipv_tablecCs�|dkr4tj|}|jjr i}qH|jj|�j|}ntj|}tj|}||kr`tt	j
d|��||krxtt	j
d|��|dkr�|jjj|�dk	r�tt	j
d|��dS)Nr;r<zchain '%s' is built-in chainzchain '%s' is reservedzChain '%s' is reserved)r;r<)r;r<)rr>r
�nftables_enabled�get_direct_backend_by_ipv�
our_chainsrZ
OUR_CHAINSr	rZ
BUILTIN_CHAIN�zoneZzone_from_chainZ
INVALID_CHAIN)rr.r/r0Zbuilt_in_chainsrCrrr�_check_builtin_chain�s"




z#FirewallDirect._check_builtin_chaincCsH|r|jj|g�j|�n*|j|j|�t|j|�dkrD|j|=dS)Nr)rr(r)�remover)rr-r0�addrrr�_register_chain�s
zFirewallDirect._register_chaincCsV|dkr|j�}n|}|jj�r.|j|jj�|jd||||�|dkrR|jd�dS)NT)rr
�may_skip_flush_direct_backends�add_pre�flush_direct_backends�_chainr#)rr.r/r0r$r%rrrr6�s

zFirewallDirect.add_chaincCs>|dkr|j�}n|}|jd||||�|dkr:|jd�dS)NFT)rrLr#)rr.r/r0r$r%rrr�remove_chain�s
zFirewallDirect.remove_chaincCs:|j||�|j|||�||f}||jko8||j|kS)N)r@rEr)rr.r/r0r-rrrr'�s

zFirewallDirect.query_chaincCs,|j||�||f}||jkr(|j|SgS)N)r@r)rr.r/r-rrr�
get_chains�s


zFirewallDirect.get_chainscCsDg}x:|jD]0}|\}}x"|j|D]}|j|||f�q$WqW|S)N)rr))r�r�keyr.r/r0rrrrszFirewallDirect.get_all_chainscCsZ|dkr|j�}n|}|jj�r.|j|jj�|jd||||||�|dkrV|jd�dS)NT)rr
rIrJrK�_ruler#)rr.r/r0r2r3r$r%rrrr8	s

zFirewallDirect.add_rulecCsB|dkr|j�}n|}|jd||||||�|dkr>|jd�dS)NFT)rrQr#)rr.r/r0r2r3r$r%rrr�remove_rules
zFirewallDirect.remove_rulecCs2|j||�|||f}||jko0||f|j|kS)N)r@r)rr.r/r0r2r3r1rrrr*#s

zFirewallDirect.query_rulecCs6|j||�|||f}||jkr2t|j|j��SgS)N)r@r�listr?)rr.r/r0r1rrr�	get_rules)s


zFirewallDirect.get_rulesc	CsRg}xH|jD]>}|\}}}x.|j|D] \}}|j||||t|�f�q&WqW|S)N)rr)rS)rrOrPr.r/r0r2r3rrrr0s
 zFirewallDirect.get_all_rulescCs�|rr||jkrt�|j|<||j||<||jkr<i|j|<||j|krb|j|||7<q�||j||<n<|j||=t|j|�dkr�|j|=|j|||8<dS)Nr)rrrr)r�rule_idr1r2�enable�countrrr�_register_rule8s


zFirewallDirect._register_rulecCsVy|jj|jj|�j|�Stk
rP}ztj|�ttj	|��WYdd}~XnXdS)N)
r
�rulerB�name�	ExceptionrZdebug2r	rZCOMMAND_FAILED)rr.r3�msgrrr�passthroughLs

zFirewallDirect.passthroughcCsX|r*||jkrg|j|<|j|j|�n*|j|j|�t|j|�dkrT|j|=dS)Nr)rr)rFr)rr.r3rVrrr�_register_passthroughTs

z$FirewallDirect._register_passthroughcCsX|dkr|j�}n|}|jj�r.|j|jj�|jd|t|�|�|dkrT|jd�dS)NT)rr
rIrJrK�_passthroughrSr#)rr.r3r$r%rrrr9^s

zFirewallDirect.add_passthroughcCs@|dkr|j�}n|}|jd|t|�|�|dkr<|jd�dS)NFT)rr_rSr#)rr.r3r$r%rrr�remove_passthroughls
z!FirewallDirect.remove_passthroughcCs||jkot|�|j|kS)N)r�tuple)rr.r3rrrr+ws
z FirewallDirect.query_passthroughcCs>g}x4|jD]*}x$|j|D]}|j|t|�f�qWqW|S)N)rr)rS)rrOr.r3rrrr {s
z#FirewallDirect.get_all_passthroughscCs4g}||jkr0x |j|D]}|jt|��qW|S)N)rr)rS)rr.rOr3rrr�get_passthroughs�s

zFirewallDirect.get_passthroughscCs�g}x�|D]�}d}x�|D]�}y|j|�}Wntk
r>YqXt|�|krd||dkrd}||djd�}x.|D]&}	|dd�}
|	|
|d<|j|
�qxWqW|s
|j|�q
W|S)z5Split values combined with commas for options in optsF�,�TN)�index�
ValueErrorr�splitr))rr,ZoptsZ	out_rulesrYZ	processed�opt�i�items�itemrQrrr�split_value�s$


zFirewallDirect.split_valuec
Cs*|j||�|jjr2|dkr2|jjj||||�|}|jj|�}	|jjrd|	j|||�rdd|}n:|jjr�|dd�dkr�|	j|||dd��r�|dd�}|||f}
||f}|r�|
|jkr�||j|
kr�tt	j
d||||f��nB|
|jk�s||j|
k�rtt	jd||||f��|j|
|}d}d	}
|
|jk�r�t
|j|
j��}d	}x@|t|�k�r�|||k�r�||j|
||7}|d7}�qTWt|�g}|j|d
dg�}|j|dd
g�}x<|D]4}|j|	|	j||||t|���|d7}|
d7}
�q�W|j||
|||
�|j|j||
|||
�dS)Nr;r<z	%s_direct�Z_directz"rule '%s' already is in '%s:%s:%s'zrule '%s' is not in '%s:%s:%s'rdrz-sz--sourcez-dz
--destination)r;r<i����i����i����)r@r
rArD�create_zone_base_by_chainrBZis_chain_builtinrr	r�ALREADY_ENABLED�NOT_ENABLEDr�sortedr?rrSrlr8Z
build_rulerarX�add_fail)rrVr.r/r0r2r3r%rL�backendr1rUrerWZ	positions�jZ	args_list�_argsrrrrQ�sZ




(

zFirewallDirect._rulecCs�|j||�|j|||�||f}|rV||jkr�||j|kr�ttjd|||f��n.||jksn||j|kr�ttjd|||f��|jj|�}|j	||j
|||��|j|||�|j|j|||�dS)Nz chain '%s' already is in '%s:%s'zchain '%s' is not in '%s:%s')
r@rErr	rrorpr
rBZ	add_rulesZbuild_chain_rulesrHrr)rrGr.r/r0r%r-rsrrrrLs$

zFirewallDirect._chainc
Cs�|j|�t|�}|rD||jkrp||j|krpttjd||f��n,||jks\||j|krpttjd||f��|jj|�}|r�|j	|�|dkr�|j
|�\}}|r�|r�|jjj|||�|}	n
|j
|�}	|j||	�|j|||�|j|j|||�dS)Nzpassthrough '%s', '%s'r;r<)r;r<)r=rarr	rrorpr
rBZcheck_passthroughZpassthrough_parse_table_chainrDrnZreverse_passthroughr8r^rr)
rrVr.r3r%Z
tuple_argsrsr/r0rurrrr_'s0




zFirewallDirect._passthrough)N)N)N)N)N)N)N)N))�__name__�
__module__�__qualname__rrrrrrrr!r&r4r5r"r=r@rErHr6rMr'rNrr8rRr*rTrrXr]r^r9r`r+r rbrlrQrLr_rrrrr&sL	

'	

	




jN)�__all__Zfirewall.fw_typesrZ
firewall.corerrZfirewall.core.fw_transactionrZfirewall.core.loggerrZfirewallrZfirewall.errorsr	�objectrrrrr�<module>sfw_nm.cpython-36.pyc000064400000011713151730727350010315 0ustar003

��g�@s dZddddddddgZd	d
lZd	dlmZyejdd
�Wnek
rTdZYn8Xyd	dlmZdZWn e	eej
fk
r�dZYnXd
ad	dlm
Z
d	dlmZd	dlmZd	d
lZdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd �Zd!d�Zd"d�Zd#d�Zd
S)$z(Functions for NetworkManager interaction�check_nm_imported�nm_is_imported�nm_get_zone_of_connection�nm_set_zone_of_connection�nm_get_connections�nm_get_connection_of_interface�nm_get_bus_name�nm_get_dbus_interface�N)�GLib�NMz1.0F)rT)�errors)�
FirewallError)�logcCststtjd��dS)zNCheck function to raise a MISSING_IMPORT error if the import of NM failed
    zgi.repository.NM = 1.0N)�_nm_importedr
rZMISSING_IMPORT�rr�/usr/lib/python3.6/fw_nm.pyr0scCstS)znReturns true if NM has been properly imported
    @return True if import was successful, False otherwirse
    )rrrrrr6scCststjjd�atS)z�Returns the NM client object or None if the import of NM failed
    @return NM.Client instance if import was successful, None otherwise
    N)�
_nm_clientrZClient�newrrrr�
nm_get_client<srcCs�t�t�j|�}|dkrdS|j�}|dkr2dSy |j�tjjtjjB@rPdSWn t	k
rr|j
�rndSYnX|j�}|dkr�d}|S)z�Get zone of connection from NM
    @param connection name
    @return zone string setting of connection, empty string if not set, None if connection is unknown
    N�)rr�get_connection_by_uuid�get_setting_connection�	get_flagsr�SettingsConnectionFlags�NM_GENERATED�NM_VOLATILE�AttributeError�get_unsavedZget_zone)�
connection�con�setting_con�zonerrrrEs$
cCsVt�t�j|�}|dkrdS|j�}|dkr2dS|dkr>d}|jd|�|jdd�S)zSet the zone for a connection
    @param zone name
    @param connection name
    @return True if zone was set, else False
    NFrr!T)rrrrZset_propertyZcommit_changes)r!rrr rrrrcsc	Cs~|j�|j�t�t�j�}xX|D]P}|j�r4q&|j�}|j�}|j�}|||<x |D]}|j�}|rZ|||<qZWq&WdS)znGet active connections from NM
    @param connections return dict
    @param connections_name return dict
    N)	�clearrr�get_active_connections�get_vpnZget_id�get_uuid�get_devices�get_ip_iface)	ZconnectionsZconnections_nameZactive_connections�
active_con�nameZuuidZdevices�dev�ip_ifacerrrrxs


cCs�t�g}x�t�j�D]|}|j�r$qy&|j�}|j�tjjtjj	B@rHwWnt
k
rh|j�rdwYnXx&|j�D]}|j
�}|rt|j|�qtWqW|S)zGGet active interfaces from NM
    @returns list of interface names
    )rrr#r$�get_connectionrrrrrrrr&r'�append)Zactive_interfacesr(rr*r+rrr�nm_get_interfaces�s$r.cCs6g}x,t�D]"}t|�}|t|�kr|j|�qW|S)N)r.rrr-)r!Z
interfaces�	interfaceZconnrrr�nm_get_interfaces_in_zone�sr0cCs<t�x0t�j�D]"}|j�}|dkr(q||kr|SqWdS)zzGet device from NM which has the given IP interface
    @param interface name
    @returns NM.Device instance or None
    N)rrr&r')r/�devicer+rrr�nm_get_device_by_ip_iface�sr2cCsxt�t|�}|dkrdS|j�}|dkr.dSy |j�}|j�tjj@rLdSWn tk
rn|j	�rjdSYnX|j
�S)z�Get connection from NM that is using the interface
    @param interface name
    @returns connection that is using interface or None
    N)rr2Zget_active_connectionr,rrrrrrr%)r/r1r(rrrrr�s
cCsRtsdSy&tj�}|jtjtj�}|j}~~|Stk
rLt	j
d�YnXdS)Nz(Failed to get bus name of NetworkManager)r�dbusZ	SystemBusZ
get_objectr�DBUS_INTERFACEZ	DBUS_PATHZbus_name�	ExceptionrZdebug2)Zbus�objr)rrrr�scCstsdStjS)Nr)rrr4rrrrr�s)�__doc__�__all__ZgiZ
gi.repositoryr
Zrequire_version�
ValueErrorrr�ImportError�ErrorrZfirewallrZfirewall.errorsr
Zfirewall.core.loggerrr3rrrrrrr.r0r2rrrrrrr�<module>s@

	 	
ipXtables.cpython-36.pyc000064400000104137151730727350011145 0ustar003

��g���@s(ddlZddlZddlmZddlmZddlmZm	Z	m
Z
mZmZm
Z
mZmZddlmZddlmZmZmZmZmZddlmZmZmZmZmZmZmZddl Z dZ!d	d
dgdd
gdd
d	d
dgdd
d
gd	d
dgd�Z"ddd�Z#ddd�Z$dd�Z%dd�Z&dd�Z'Gdd�de(�Z)Gdd�de)�Z*dS)�N)�runProg)�log)�tempFile�readfile�	splitArgs�	check_mac�portStr�check_single_address�
check_address�normalizeIP6)�config)�
FirewallError�INVALID_PASSTHROUGH�INVALID_RULE�
UNKNOWN_ERROR�INVALID_ADDR)�Rich_Accept�Rich_Reject�	Rich_Drop�	Rich_Mark�Rich_Masquerade�Rich_ForwardPort�Rich_IcmpBlock��INPUT�OUTPUT�FORWARD�
PREROUTING�POSTROUTING)�security�raw�mangle�nat�filterzicmp-host-prohibitedzicmp6-adm-prohibited)�ipv4�ipv6�icmpz	ipv6-icmpcCs�ddddddd�}|dd�}x~|D]v}y|j|�}Wntk
rLw$YnX|d
kr�yt||d	�Wntk
r~YnX|j|d	�||||<q$W|S)z Inverse valid rule z-Dz--deletez-Xz--delete-chain)z-Az--appendz-Iz--insertz-Nz--new-chainN�-I�--insert�)r'r()�index�	Exception�int�pop)�args�replace_args�ret_args�arg�idx�r3�/usr/lib/python3.6/ipXtables.py�common_reverse_rule9s(
r5cCs�ddddddd�}|dd�}x�|D]x}y|j|�}Wntk
rLw$YnX|dkr�yt||d	�Wntk
r~YnX|j|d	�||||<|SWttd
��dS)z Reverse valid passthough rule z-Dz--deletez-Xz--delete-chain)z-Az--appendz-Iz--insertz-Nz--new-chainN�-I�--insertr)zno '-A', '-I' or '-N' arg)r6r7)r*�
ValueErrorr,r-r
r)r.r/r0�xr2r3r3r4�common_reverse_passthrough^s,
r:cCs�t|�}tddddddddd	d
ddd
dddddddg�}t||@�dkrbttdt||@�d��tddddddg�}t||@�dkr�ttd��dS)zZ Check if passthough rule is valid (only add, insert and new chain
    rules are allowed) z-Cz--checkz-Dz--deletez-Rz	--replacez-Lz--listz-Sz--list-rulesz-Fz--flushz-Zz--zeroz-Xz--delete-chainz-Pz--policyz-Ez--rename-chainrzarg '%s' is not allowedz-Az--appendz-Iz--insertz-Nz--new-chainzno '-A', '-I' or '-N' argN)�set�lenr
r�list)r.Znot_allowedZneededr3r3r4�common_check_passthrough�s*

r>c@s�eZdZdZdZdZdd�Zdd�Zdd�Zd	d
�Z	dd�Z
d
d�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd �Zdhd"d#�Zd$d%�Zd&d'�Zd(d)�Zd*d+�Zdid,d-�Zd.d/�Zdjd1d2�Zd3d4�Zd5d6�Zdkd8d9�Zdld:d;�Z d<d=�Z!d>d?�Z"d@dA�Z#dBdC�Z$dDdE�Z%dFdG�Z&dHdI�Z'dJdK�Z(dLdM�Z)dNdO�Z*dPdQ�Z+dmdRdS�Z,dndTdU�Z-dodVdW�Z.dXdY�Z/dpdZd[�Z0dqd\d]�Z1drd^d_�Z2dsd`da�Z3dbdc�Z4ddde�Z5dfdg�Z6d!S)t�	ip4tablesr$TcCsd||_tj|j|_tjd|j|_|j�|_|j�|_	|j
�g|_i|_i|_
g|_i|_dS)Nz
%s-restore)�_fwrZCOMMANDS�ipv�_command�_restore_command�_detect_wait_option�wait_option�_detect_restore_wait_option�restore_wait_option�fill_exists�available_tables�rich_rule_priority_counts�policy_priority_counts�zone_source_index_cache�
our_chains)�self�fwr3r3r4�__init__�s

zip4tables.__init__cCs$tjj|j�|_tjj|j�|_dS)N)�os�path�existsrBZcommand_existsrCZrestore_command_exists)rNr3r3r4rH�szip4tables.fill_existscCs�|jr(|j|kr(|jgdd�|D�}ndd�|D�}tjd|j|jdj|��t|j|�\}}|dkr�td|jdj|�|f��|S)NcSsg|]}d|�qS)z%sr3)�.0�itemr3r3r4�
<listcomp>�sz#ip4tables.__run.<locals>.<listcomp>cSsg|]}d|�qS)z%sr3)rTrUr3r3r4rV�sz	%s: %s %s� rz'%s %s' failed: %s)rEr�debug2�	__class__rB�joinrr8)rNr.Z_args�status�retr3r3r4Z__run�szip4tables.__runc
Cs<y|j|�}Wntk
r"dSX||||d�<dSdS)NF�T)r*r8)rN�rule�patternZreplacement�ir3r3r4�
_rule_replace�szip4tables._rule_replacecCs|tko|t|kS)N)�BUILT_IN_CHAINS)rNrA�table�chainr3r3r4�is_chain_builtin�szip4tables.is_chain_builtincCs2d|g}|r|jd�n
|jd�|j|�|gS)Nz-tz-Nz-X)�append)rN�addrcrdr^r3r3r4�build_chain_rules�s

zip4tables.build_chain_rulescCs8d|g}|r |d|t|�g7}n|d|g7}||7}|S)Nz-tz-Iz-D)�str)rNrgrcrdr*r.r^r3r3r4�
build_rule�szip4tables.build_rulecCst|�S)N)r5)rNr.r3r3r4�reverse_rule�szip4tables.reverse_rulecCst|�dS)N)r>)rNr.r3r3r4�check_passthrough�szip4tables.check_passthroughcCst|�S)N)r:)rNr.r3r3r4�reverse_passthrough�szip4tables.reverse_passthroughcCs�d}y|jd�}Wntk
r&YnXt|�|dkrD||d}d}xLd
D]D}y|j|�}Wntk
rtYqNXt|�|dkrN||d}qNW||fS)Nr#z-tr]�-A�--append�-I�--insert�-N�--new-chain)rnrorprqrrrs)r*r8r<)rNr.rcr`rd�optr3r3r4�passthrough_parse_table_chain�s$z'ip4tables.passthrough_parse_table_chaincCs4yH|jd�}|j|�|j|�}d|dkr:||df}n||df}WnFtk
r�y|jd�}|j|�d}Wntk
r�dSXYnXd}|ddkr�d}|r�|r�||kr�|j|�nn|�r0|�r�||kr�|j|�|jdd
�d�|j|�}n|jj�rd}nt|�}d|d<|j	dd|d�dS)Nz%%ZONE_SOURCE%%z-m���z%%ZONE_INTERFACE%%Tr�-D�--deleteFcSs|dS)Nrr3)r9r3r3r4�<lambda>&sz4ip4tables._run_replace_zone_source.<locals>.<lambda>)�keyz-Ir)z%dr])ryrz)
r*r-r8�removerf�sortr@�_allow_zone_driftingr<�insert)rNr^rLr`�zoneZzone_source�rule_addr*r3r3r4�_run_replace_zone_source	s>







z"ip4tables._run_replace_zone_sourcecCsy|j|�}Wntk
r$Y�n�Xd}d}d}|j|�|j|�}t|�tkr\ttd��d}	xLdD]D}
y|j|
�}Wntk
r�YqfXt|�|dkrf||d}	qfWxhdD]`}
y|j|
�}Wntk
r�Yq�Xt|�|dk�r�||d}|
dk�rd}|
dkr�d}q�W|	|f}|�sp||k�sP|||k�sP|||dk�rZttd��|||d8<n�||k�r�i||<|||k�r�d|||<d}
xHt	||j
��D]4}||k�r�|�r�P|
|||7}
||k�r�P�q�W|||d7<d
||<|j|dd|
�dS)a
        Change something like
          -t filter -I public_IN %%RICH_RULE_PRIORITY%% 123
        or
          -t filter -A public_IN %%RICH_RULE_PRIORITY%% 321
        into
          -t filter -I public_IN 4
        or
          -t filter -I public_IN
        TFr]z%priority must be followed by a numberr#�-t�--table�-A�--append�-I�--insert�-D�--deleterz*nonexistent or underflow of priority countr)z%dN���)r�r�)r�r�r�r�r�r�)r�r�)r�r�)r*r8r-�typer,r
rr<r�sorted�keysr�)rNr^Zpriority_counts�tokenr`r�r�Zinsert_add_index�priorityrcrt�jrdr*�pr3r3r4�_set_rule_replace_priority2sj








z$ip4tables._set_rule_replace_prioritycCsPt�}i}tj|j�}tj|j�}tj|j�}�x�|D�]�}|dd�}	|j|	dddt|jg�|j|	dt	|jg�y|	j
d�}
Wntk
r�Yn8X|dkr�q6|d$kr�d
dd|g|	|
|
d
�<n
|	j|
�|j
|	|d�|j
|	|d�|j|	|�d}xZd%D]R}y|	j
|�}
Wntk
�r,Yn(Xt|	�|
d
k�r|	j|
�|	j|
�}�qWxhtt|	��D]X}
xPtjD]F}
|
|	|
k�rt|	|
jd��o�|	|
jd��rtd|	|
|	|
<�qtW�qhW|j|g�j|	�q6WxR|D]J}||}|jd|�x"|D]}	|jdj|	�d��qW|jd��q�W|j�tj|j�}tjd|j|j d|j|j!f�g}|j"�rz|j|j"�|jd�t#|j ||jd�\}}tj$�dk�r
t%|j�}|dk	�r
d
}
xH|D]@}tj&d|
|fd
dd �|jd��s�tj&d!d
d"�|
d
7}
�q�Wtj'|j�|dk�r:td#|j dj|�|f��||_||_||_dS)&Nz
%%REJECT%%�REJECTz
--reject-withz%%ICMP%%z%%LOGTYPE%%�off�unicast�	broadcast�	multicastz-m�pkttypez
--pkt-typer]z%%RICH_RULE_PRIORITY%%z%%POLICY_PRIORITY%%r#�-t�--table�"z"%s"z*%s
rW�
zCOMMIT
z	%s: %s %sz%s: %dz-n)�stdinr)z%8d: %sr)�nofmt�nlr)r�z'%s %s' failed: %s)r�r�r�)r�r�)(r�copy�deepcopyrJrKrLra�DEFAULT_REJECT_TYPErA�ICMPr*r8r-r�r�r<�range�stringZ
whitespace�
startswith�endswith�
setdefaultrf�writerZ�closerQ�stat�namerrXrYrC�st_sizerGrZgetDebugLogLevelrZdebug3�unlink)rN�rules�
log_denied�	temp_fileZtable_rulesrJrKrLZ_ruler^r`rcrt�cr�r.r[r\�lines�liner3r3r4�	set_rules�s�









zip4tables.set_rulesc
Cs�|j|dddt|jg�|j|dt|jg�y|jd�}Wntk
rRYn:X|dkr`dS|dkr�ddd
|g|||d�<n
|j|�tj|j	�}tj|j
�}tj|j�}|j||d�|j||d�|j
||�|j|�}||_	||_
||_|S)Nz
%%REJECT%%r�z
--reject-withz%%ICMP%%z%%LOGTYPE%%r�rr�r�r�z-mr�z
--pkt-typer]z%%RICH_RULE_PRIORITY%%z%%POLICY_PRIORITY%%)r�r�r�)rar�rAr�r*r8r-r�r�rJrKrLr�r��_ip4tables__run)rNr^r�r`rJrKrL�outputr3r3r4�set_rule�s.

zip4tables.set_ruleNcCs�g}|r|gntj�}xx|D]p}||jkr6|j|�qy,|jd|ddg�|jj|�|j|�Wqtk
r�tjd|j|f�YqXqW|S)Nz-tz-Lz-nzA%s table '%s' does not exist (or not enough permission to check).)	rbr�rIrfr�r8r�debug1rA)rNrcr\Ztablesr3r3r4�get_available_tabless

zip4tables.get_available_tablescCs`d}t|jdddg�}|ddkr\d}t|jdddg�}|ddkrHd}tjd|j|j|�|S)Nrz-wz-Lz-nrz-w10z%s: %s will be using %s option.)rrBrrXrY)rNrEr\r3r3r4rDszip4tables._detect_wait_optioncCs�t�}|jd�|j�d}xJdD]B}t|j|g|jd�}|ddkr"d|dkr"d	|dkr"|}Pq"Wtjd
|j|j|�t	j
|j�|S)Nz#foor�-w�--wait=2)r�rzinvalid optionr]zunrecognized optionz%s: %s will be using %s option.)r�r�)rr�r�rrCr�rrXrYrQr�)rNr�rEZtest_optionr\r3r3r4rF"s

z%ip4tables._detect_restore_wait_optioncCsVi|_i|_g|_g}x:tj�D].}|j|�s0q xdD]}|jd||g�q6Wq W|S)N�-F�-X�-Zz-t)r�r�r�)rJrKrLrbr�r�rf)rNr�rc�flagr3r3r4�build_flush_rules5s

zip4tables.build_flush_rulescCsfg}|dkrdn|}xLtj�D]@}|j|�s.q|dkr8qx$t|D]}|jd|d||g�qBWqW|S)NZPANIC�DROPr"z-tz-P)rbr�r�rf)rN�policyr��_policyrcrdr3r3r4�build_set_policy_rulesDs
z ip4tables.build_set_policy_rulescCs g}d}y"|jd|jdkrdnddg�}WnJtk
rt}z.|jdkrVtjd|�ntjd|�WYd	d	}~XnX|j�}d
}x�|D]�}|r�|j�j�}|j�}xD|D]<}	|	j	d�r�|	j
d�r�|	d
d�}
n|	}
|
|kr�|j|
�q�W|jdko�|j	d��s|jdkr�|j	d�r�d}q�W|S)zQReturn ICMP types that are supported by the iptables/ip6tables command and kernelrz-pr$r&z	ipv6-icmpz--helpziptables error: %szip6tables error: %sNF�(�)r]zValid ICMP Types:r%zValid ICMPv6 Types:Tr�)r�rAr8rr��
splitlines�strip�lower�splitr�r�rf)rNrAr\r�Zexr�Zin_typesr�Zsplitsr�r9r3r3r4�supported_icmp_typesPs4
 

zip4tables.supported_icmp_typescCsgS)Nr3)rNr3r3r4�build_default_tablesqszip4tables.build_default_tablesr�c	Csi}|jd�rpg|d<t�|jd<xLtdD]@}|djd|�|djd||f�|jdjd|�q,W|jd��r\g|d<t�|jd<x�tdD]�}|djd|�|djd||f�|jdjd|�|dkr�xt|jjr�ddd	d
gndd	d
gD]R}|djd||f�|djd|||f�|jdjtd
||fg���qWq�W|jd��rNg|d<t�|jd<x�tdD]�}|djd|�|djd||f�|jdjd|�|dk�r�xv|jj�r�ddd	d
gndd	d
gD]R}|djd||f�|djd|||f�|jdjtd
||fg���q�W�q�W|jd��r@g|d<t�|jd<x�tdD]�}|djd|�|djd||f�|jdjd|�|d9k�rxxv|jj�r�ddd	d
gndd	d
gD]R}|djd||f�|djd|||f�|jdjtd
||fg���q�W�qxWg|d<t�|jd<|djd�|djd�|djd�|djd�|jdjtd��xf|jj�r�ddd	d
gndd	d
gD]B}|djd|�|djd|�|jdjtd|���q�W|dk�r |djd�|djd�|dk�rF|djd�|djd�|djd�|djd �|djd!�|djd"�|jdjtd#��xJd:D]B}|djd$|�|djd%|�|jdjtd&|���q�Wxzd;D]r}xj|jj�r
dd	gnd	gD]N}|djd)||f�|djd*||f�|jdjtd+||f���qW�q�WxJd<D]B}|djd$|�|djd%|�|jdjtd&|���qnW|dk�r�|djd,�|djd-�|dk�r�|djd.�|djd/�|dd0d1d2d3g7<|jdjtd4��xJd=D]B}|djd5|�|djd6|�|jdjtd7|���q2WxJd>D]B}|djd5|�|djd6|�|jdjtd7|���q~Wg}xJ|D]B}||j�k�r�q�x(||D]}|jd8|gt	|���q�W�q�W|S)?Nrz-N %s_directz-A %s -j %s_directz	%s_directr r�POLICIES_preZZONES_SOURCEZZONES�
POLICIES_postz-N %s_%sz-A %s -j %s_%sz%s_%sr!r"rr#zB-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED,DNAT -j ACCEPTz-A INPUT -i lo -j ACCEPTz-N INPUT_directz-A INPUT -j INPUT_directZINPUT_directz-N INPUT_%sz-A INPUT -j INPUT_%szINPUT_%sr�z^-A INPUT -m conntrack --ctstate INVALID %%LOGTYPE%% -j LOG --log-prefix 'STATE_INVALID_DROP: 'z/-A INPUT -m conntrack --ctstate INVALID -j DROPz9-A INPUT %%LOGTYPE%% -j LOG --log-prefix 'FINAL_REJECT: 'z-A INPUT -j %%REJECT%%zD-A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED,DNAT -j ACCEPTz-A FORWARD -i lo -j ACCEPTz-N FORWARD_directz-A FORWARD -j FORWARD_directZFORWARD_directz
-N FORWARD_%sz-A FORWARD -j FORWARD_%sz
FORWARD_%s�IN�OUTz-N FORWARD_%s_%sz-A FORWARD -j FORWARD_%s_%sz
FORWARD_%s_%sz`-A FORWARD -m conntrack --ctstate INVALID %%LOGTYPE%% -j LOG --log-prefix 'STATE_INVALID_DROP: 'z1-A FORWARD -m conntrack --ctstate INVALID -j DROPz;-A FORWARD %%LOGTYPE%% -j LOG --log-prefix 'FINAL_REJECT: 'z-A FORWARD -j %%REJECT%%z-N OUTPUT_directz>-A OUTPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPTz-A OUTPUT -o lo -j ACCEPTz-A OUTPUT -j OUTPUT_directZ
OUTPUT_directz-N OUTPUT_%sz-A OUTPUT -j OUTPUT_%sz	OUTPUT_%sz-t)rr)r�)r�r�)r�)r�)r�)
r�r;rMrbrfrgr@r�updater)	rNr�Z
default_rulesrdZdispatch_suffix�	directionZfinal_default_rulesrcr^r3r3r4�build_default_rulesus�
$(
&*
&*&



(






"zip4tables.build_default_rulescCsf|dkrdddhS|dkr,d|j�kr,dhS|dkrHd|j�krHddhS|d	krbd	|j�krbdhSiS)
Nr#r�
FORWARD_IN�FORWARD_OUTr!rr"rr )r�)rNrcr3r3r4�get_zone_table_chains�s
zip4tables.get_zone_table_chainsc	s�|jjj|���jdkrdnd��dkr4�dkr4dnd}	|jjj|�t|	��g}
g}x|D]}|
jd|g�qZWx|D]}|jd	|g�qvWxB|D]:}
|jjj|
�}|dkr�|j	|�r�q�|
j|j
d|
��q�Wx\|D]T}
|jjj|
�}|dk�r|j	|��rq�t|
��r�dk�rq�|j|j
d|
��q�W������fdd�}g}|
�r�x�|
D]F}|�r�x8|D]}|j|||���qdWn|�r�n|j||d���qTWnH|�r�n@|�r�x8|D]}|j|d|���q�Wn|�r�n|j|dd��|S)Nr�pre�postr"rTFz-iz-or$r%z-sr�rz-dcsVddd��}d�|d��fd�jg}|r6|j|�|rD|j|�|jd�g�|S)Nz-Az-D)TFz-tz%s_POLICIES_%sz%%POLICY_PRIORITY%%z-j)r��extend)�ingress_fragment�egress_fragment�add_delr^)r�rd�chain_suffix�enable�p_objrcr3r4�_generate_policy_dispatch_rules


zSip4tables.build_policy_ingress_egress_rules.<locals>._generate_policy_dispatch_rule)r$r%)r$r%)rr�r)r@r�Z
get_policyr��policy_base_chain_name�POLICY_CHAIN_PREFIXrfr�Zcheck_source�is_ipv_supported�_rule_addr_fragmentr)rNr�r�rcrdZingress_interfacesZegress_interfacesZingress_sourcesZegress_sources�isSNATZingress_fragmentsZegress_fragments�	interface�addrrAr�r�r�r�r3)r�rdr�r�r�rcr4�!build_policy_ingress_egress_rules�sR






z+ip4tables.build_policy_ingress_egress_rulesFc
Cs�|dkr|dkrdnd}|jjj||t|d�}	ddddddd�|}
d	}|rb|rbd
d|dg}n,|rtd
d|g}ndd|g}|s�|dg7}|d||
|||	g7}|gS)Nr"rTF)r�z-iz-o)rrrr�r�rz-gz-Iz%s_ZONESz%%ZONE_INTERFACE%%z-Az-Dz-t)r@r�r�r�)
rNr�r�r�r�rcrdrfr�r�rt�actionr^r3r3r4�!build_zone_source_interface_rulesKs&

z+ip4tables.build_zone_source_interface_rulescCs�|jd�rP|dd�}|dkr$d}nd}dj|g|jjj|��}ddd	||gSt|�rz|dkrjttd
��ddd|j�gSt	d
|�r�t
|�}n,td
|�r�|jd�}t
|d�d|d}||gSdS)Nzipset:�z-d�dst�src�,z-mr;z--match-setzCan't match a destination MAC.�macz--mac-sourcer%�/rr])
r�rZr@�ipsetZ
get_dimensionrr
r�upperr	rr
r�)rNrt�address�invertr��flags�
addr_splitr3r3r4r�es"





zip4tables._rule_addr_fragmentc
Cs�ddd�|}|dkr"|dkr"dnd}|jjj||t|d�}	d	d
d	d	d
d
d�|}
|jjrdd|}nd
|}t|�r�|dkr�gS||d|d|g}|j|j|
|��|jd|	g�|gS)Nz-Iz-D)TFr"rTF)r�z-sz-d)rrrr�r�rz%s_ZONES_SOURCEz%s_ZONESr�rz%%ZONE_SOURCE%%z-tz-g)rr�r)r@r�r�r�rrr�r�)
rNr�r�r�r�rcrdr�r�r�rtZzone_dispatch_chainr^r3r3r4�build_zone_source_address_rules{s&
z)ip4tables.build_zone_source_address_rulescCs>ddd�|}ddd�|}|dkr0|dkr0dnd	}|jjj||t|d
�}|j|jt|d|d|d
|d|d|g��g}	|	j||d|g�|	j|d
|d|g�|	j|d|d|g�|	j|d|d|g�|	j|d|d|g�|	j|d|d|g�|	j||d|dd
|g�|	j||d|dd|g�|	j||d|dd|g�|	j||d|dd|g�|	j||d|dd|g�|jjj|j	}
|jj
�dk�r|dk�r|
dk�r�|	j||d|ddddd|g	�|
dk�r|	j||d|ddddd|g	�|dk�r,|
dk�r,|	j||d|d|
g�|�s:|	j�|	S)Nz-Nz-X)TFz-Az-Dr"rTF)r�z%s_logz%s_denyz%s_prez%s_postz%s_allowz-tz-jr�r#r��
%%REJECT%%z%%LOGTYPE%%�LOGz--log-prefixz
"%s_REJECT: "r�z"%s_DROP: "�ACCEPT)r�r�)r�r�r�r�)r@r�r�r�rMr�r;rfZ	_policies�target�get_log_denied�reverse)rNr�r�rcrdZ
add_del_chainZadd_del_ruler�r�r�r�r3r3r4�build_policy_chain_rules�sN




z"ip4tables.build_policy_chain_rulescCs2|sgSddd|jg}|jdk	r.|d|jg7}|S)Nz-m�limitz--limitz
--limit-burst)�valueZburst)rNr�sr3r3r4�_rule_limit�s
zip4tables._rule_limitcCs�t|j�tttgkrn<|jrHt|j�tttt	gkrRt
tdt|j���n
t
td��|jdkr�t|j�ttgks�t|j�tt	gkr�dSt|j�tgks�t|j�ttgkr�dSn|jdkr�dSdSdS)NzUnknown action %szNo rule action specified.r�allowZdenyr�r�)
r��elementrrrr�rrrrr
rr�)rN�	rich_ruler3r3r4�_rich_rule_chain_suffix�s 


z!ip4tables._rich_rule_chain_suffixcCs>|jr|jrttd��|jdkr(dS|jdkr6dSdSdS)NzNot log or auditrrr�r�)r�auditr
rr�)rNrr3r3r4� _rich_rule_chain_suffix_from_log�s


z*ip4tables._rich_rule_chain_suffix_from_logcCs|jdkrgSd|jgS)Nrz%%RICH_RULE_PRIORITY%%)r�)rNrr3r3r4�_rich_rule_priority_fragment�s
z&ip4tables._rich_rule_priority_fragmentc
Cs�|js
gS|jjj||t�}ddd�|}|j|�}d||d||fg}	|	|j|�7}	|	|ddg7}	|jjr�|	dd	|jjg7}	|jjr�|	d
d|jjg7}	|	|j	|jj
�7}	|	S)Nz-Az-D)TFz-tz%s_%sz-jr�z--log-prefixz'%s'z--log-levelz%s)rr@r�r�r�rr�prefix�levelrr)
rNr�rr�rc�
rule_fragmentr�r�r�r^r3r3r4�_rich_rule_log�s
zip4tables._rich_rule_logcCs�|js
gSddd�|}|jjj||t�}|j|�}d||d||fg}	|	|j|�7}	|	|7}	t|j�t	krrd}
n,t|j�t
kr�d}
nt|j�tkr�d}
nd	}
|	d
dd|
g7}	|	|j|jj
�7}	|	S)
Nz-Az-D)TFz-tz%s_%sZacceptZrejectZdrop�unknownz-jZAUDITz--type)r
r@r�r�r�rrr�r�rrrrr)rNr�rr�rcrr�r�r�r^Z_typer3r3r4�_rich_rule_audits$
zip4tables._rich_rule_auditcCs2|js
gSddd�|}|jjj||t�}|j|�}d||f}	t|j�tkrXddg}
n�t|j�tkr�ddg}
|jjr�|
d|jjg7}
nnt|j�t	kr�dd	g}
nVt|j�t
kr�d
}|jjj||t�}d||f}	ddd|jjg}
ntt
d
t|j���d|||	g}||j|�7}|||
7}||j|jj�7}|S)Nz-Az-D)TFz%s_%sz-jr�r�z
--reject-withr�r!�MARKz--set-xmarkzUnknown action %sz-t)r�r@r�r�r�r	r�rrrrr;r
rrrr)rNr�rr�rcrr�r�r�rdZrule_actionr^r3r3r4�_rich_rule_action$s4


zip4tables._rich_rule_actioncCs�|sgSg}|jr�|jr"|jd�td|j�rB|dt|j�g7}q�td|j�r||jjd�}|dt|d�d|dg7}q�|d|jg7}nD|jr�|ddg7}|jr�|jd�|jj	j
|jd	�}|d
|j|g7}|S)N�!r%z-dr�rr]z-mr;r�z--match-set)r�r�rfr	rr
r�r�r@r��_ipset_match_flags)rNZ	rich_destrr�r�r3r3r4�_rich_rule_destination_fragmentFs&
"
z)ip4tables._rich_rule_destination_fragmentcCs|sgSg}|jr�|jr"|jd�td|j�rB|dt|j�g7}nHtd|j�r||jjd�}|dt|d�d|dg7}n|d|jg7}n�t|d�r�|jr�|ddg7}|jr�|jd�|d	|jg7}nPt|d
�o�|j	�r|ddg7}|jr�|jd�|j
jj|j	d�}|d
|j	|g7}|S)Nrr%z-sr�rr]r�z-mz--mac-sourcer�r;r�z--match-set)
r�r�rfr	rr
r��hasattrr�r�r@r�r)rNZrich_sourcerr�r�r3r3r4�_rich_rule_source_fragment^s0
"

z$ip4tables._rich_rule_source_fragmentcCsddd�|}d}|jjj||t�}	d|g}
|rD|
ddt|�g7}
|rT|
d|g7}
|rx|
|j|j�7}
|
|j|j�7}
|s�t	|j
�tkr�|
d	d
ddg7}
g}|r�|j|j
|||||
��|j|j|||||
��|j|j|||||
��n"|j|d
|	d|g|
ddg�|S)Nz-Az-D)TFr#z-pz--dportz%sz-dz-m�	conntrackz	--ctstatez
NEW,UNTRACKEDz%s_allowz-tz-jr�)r@r�r�r�rr�destinationr�sourcer�r�rrfrrr)rNr�r��proto�portrrr�rcr�rr�r3r3r4�build_policy_ports_rules{s*z"ip4tables.build_policy_ports_rulescCs�ddd�|}d}|jjj||t�}d|g}	|r<|	d|g7}	|r`|	|j|j�7}	|	|j|j�7}	|stt|j	�t
kr�|	ddd	d
g7}	g}
|r�|
j|j|||||	��|
j|j
|||||	��|
j|j|||||	��n"|
j|d|d|g|	d
dg�|
S)Nz-Az-D)TFr#z-pz-dz-mrz	--ctstatez
NEW,UNTRACKEDz%s_allowz-tz-jr�)r@r�r�r�rrrrr�r�rrfrrr)rNr�r��protocolrrr�rcr�rr�r3r3r4�build_policy_protocol_rules�s&z%ip4tables.build_policy_protocol_rulescCsddd�|}d}|jjj||t�}	d|g}
|rD|
ddt|�g7}
|rT|
d|g7}
|rx|
|j|j�7}
|
|j|j�7}
|s�t	|j
�tkr�|
d	d
ddg7}
g}|r�|j|j
|||||
��|j|j|||||
��|j|j|||||
��n"|j|d
|	d|g|
ddg�|S)Nz-Az-D)TFr#z-pz--sportz%sz-dz-mrz	--ctstatez
NEW,UNTRACKEDz%s_allowz-tz-jr�)r@r�r�r�rrrrrr�r�rrfrrr)rNr�r�rrrrr�rcr�rr�r3r3r4�build_policy_source_ports_rules�s*z)ip4tables.build_policy_source_ports_rulescCsvd}|jjj||t�}	ddd�|}
|
d|	ddd|g}|rP|dd	t|�g7}|r`|d
|g7}|ddd
|g7}|gS)Nr z-Az-D)TFz%s_allowz-tz-pz--dportz%sz-dz-jZCTz--helper)r@r�r�r�r)rNr�r�rrrZhelper_nameZmodule_short_namercr�r�r^r3r3r4�build_policy_helper_ports_rules�sz)ip4tables.build_policy_helper_ports_rulesc
	Cs�ddd�|}|jjj||t�}g}	|rH|	jdd|d|d|dd	g�n6t|�rTgS|	jdd|d|g|jd
|�dd	g�|	S)Nz-Az-D)TFz-tr#z%s_allowz-oz-jr�z-d)r@r�r�r�rfrr�)
rNr�r�r�rcr�rr�r�r�r3r3r4�build_zone_forward_rules�sz"ip4tables.build_zone_forward_rulesc
Cs,d}|jjj||tdd�}ddd�|}g}|rj|j|�}||j|�7}||j|j�7}||j|j	�7}nd}g}	|	j
dd|d	||fg|d
ddd
dg�g}|r�|j|�}||j|�7}||j|j�7}||j|j	�7}nd}d}|jjj||t�}|	j
dd|d	||fg|ddddd
dg�|	S)Nr"T)r�z-Az-D)TFrz-tz%s_%srz-o�loz-jZ
MASQUERADEr#z-mrz	--ctstatez
NEW,UNTRACKEDr�)r@r�r�r�r	rrrrrrf)
rNr�r�rrcr�r�rr�r�r3r3r4�build_policy_masquerade_rules�s6

z'ip4tables.build_policy_masquerade_rulesc
Cs
d}|jjj||t�}	ddd�|}
d}|rPtd|�rH|dt|�7}n||7}|rn|dkrn|dt|d	�7}g}|r�|j|�}
|j|�}||j	|j
�7}||j|j�7}nd
}
g}|r�|j
|j|||d|��|j
dd|
d|	|
fg|d
|dt|�ddd|g�|S)Nr"z-Az-D)TFrr%z[%s]z:%s�-rz-tz%s_%sz-pz--dportz-jZDNATz--to-destination)r@r�r�r�r	rrr	rrrrrrfr)rNr�r�rr ZtoportZtoaddrrrcr�r�Ztorr�r�r3r3r4�build_policy_forward_port_ruless2


z)ip4tables.build_policy_forward_port_rulescCs�d}|jjj||t�}ddd�|}|jdkrFddg}ddd	|jg}	ndd
g}ddd|jg}	g}
|jjj|�r|d
|}d}nd|}d}g}
|r�|
|j|j�7}
|
|j	|j
�7}
|
||	7}
|�rP|
j|j|||||
��|
j|j
|||||
��|j�r|
j|j|||||
��n:|j|�}|
jd||d||fg|j|�|
ddg�n`|jj�dk�r�|dk�r�|
j||d|g|
ddddd|g�|
j||d|g|
d|g�|
S)Nr#z-Az-D)TFr$z-pr&z-mz--icmp-typez	ipv6-icmpZicmp6z
--icmpv6-typez%s_allowr�z%s_denyz
%%REJECT%%z-tz%s_%sz-jr�z%%LOGTYPE%%r�z--log-prefixz"%s_ICMP_BLOCK: ")r@r�r�r�rAr��query_icmp_block_inversionrrrrrfrrr�rr	rr�)rNr�r�Zictrrcr�r�r�matchr�Zfinal_chainZfinal_targetrr�r3r3r4�build_policy_icmp_block_rules3sJ

 z'ip4tables.build_policy_icmp_block_rulesc	Cs�d}|jjj||t�}g}d}|jjj|�r�d}|jj�dkr�|rRd|t|�g}nd|g}|d|dd	d
ddd
d|g	}|j|�|d7}nd}|r�d|t|�g}nd|g}|d|dd	d|g}|j|�|S)Nr#r�z
%%REJECT%%r�z-Iz-Dz-tz-pz%%ICMP%%z%%LOGTYPE%%z-jr�z--log-prefixz"%s_ICMP_BLOCK: "r]r�)r@r�r�r�r)r�rirf)	rNr�r�rcr�r�Zrule_idxZ
ibi_targetr^r3r3r4�'build_policy_icmp_block_inversion_rulesds.



z1ip4tables.build_policy_icmp_block_inversion_rulescCsxd}g}||j|j�7}||j|j�7}g}|j|j|||||��|j|j|||||��|j|j|||||��|S)Nr#)rrrrrfrrr)rNr�r�rrcrr�r3r3r4�*build_policy_rich_source_destination_rules�sz4ip4tables.build_policy_rich_source_destination_rulescCs
||jkS)N)rA)rNrAr3r3r4r��szip4tables.is_ipv_supported)N)N)r�)F)F)NN)NN)NN)NN)N)N)N)7�__name__�
__module__�__qualname__rAr�Zpolicies_supportedrPrHr�rarerhrjrkrlrmrur�r�r�r�r�rDrFr�r�r�r�r�r�r�r�r�r�rrr	rrrrrrrrr!r"r#r$r&r(r+r,r-r�r3r3r3r4r?�sh

			)Pa#

!
zN

0"




&
!
1"r?c@s&eZdZdZdZddd�Zdd�ZdS)	�	ip6tablesr%Fc
Cs�g}|jddddddddd	d
g
�|dkrL|jddddddddd	dd
dg�|jdddddddd	dg	�|jdddddddd	dg	�|S)Nz-Irz-tr!z-mZrpfilterz--invertz--validmarkz-jr�r�r�z--log-prefixzrpfilter_DROP: z-pz	ipv6-icmpz$--icmpv6-type=neighbour-solicitationr�z"--icmpv6-type=router-advertisement)rf)rNr�r�r3r3r4�build_rpfilter_rules�s$



zip6tables.build_rpfilter_rulescCs�ddddddddd	g	}d
}|jdj|�g}|jddd
|g�xT|D]L}|jddd|d|ddddg
�|jjdkrF|jddd|d|ddddg
�qFW|jdddddd|g�|jdddddd|g�|S)Nz::0.0.0.0/96z::ffff:0.0.0.0/96z2002:0000::/24z2002:0a00::/24z2002:7f00::/24z2002:ac10::/28z2002:c0a8::/32z2002:a9fe::/32z2002:e000::/19ZRFC3964_IPv4r#z-tz-Nz-Iz-dz-jr�z
--reject-withzaddr-unreachr��allr�z--log-prefixz"RFC3964_IPv4_REJECT: "r�4r)r�r3)rMrgrfr@Z_log_denied)rNZ
daddr_listZ
chain_namer�Zdaddrr3r3r4�build_rfc3964_ipv4_rules�s4



z"ip6tables.build_rfc3964_ipv4_rulesN)F)r.r/r0rAr�r2r5r3r3r3r4r1�s
r1)+Zos.pathrQr�Zfirewall.core.progrZfirewall.core.loggerrZfirewall.functionsrrrrrr	r
rZfirewallrZfirewall.errorsr
rrrrZfirewall.core.richrrrrrrrr�r�rbr�r�r5r:r>�objectr?r1r3r3r3r4�<module>s@($%* xfw_helper.cpython-36.pyc000064400000003705151730727350011164 0ustar003

��g)�@s6dZdgZddlmZddlmZGdd�de�ZdS)zhelper backend�FirewallHelper�)�errors)�
FirewallErrorc@s\eZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zdd�ZdS)rcCs||_i|_dS)N)Z_fw�_helpers)�self�fw�r�/usr/lib/python3.6/fw_helper.py�__init__szFirewallHelper.__init__cCsd|j|jfS)Nz%s(%r))�	__class__r)rrrr	�__repr__"szFirewallHelper.__repr__cCs|jj�dS)N)r�clear)rrrr	�cleanup'szFirewallHelper.cleanupcCs||j�krttj|��dS)N)�get_helpersrr�INVALID_HELPER)r�namerrr	�check_helper*szFirewallHelper.check_helpercCs||j�kS)N)r)rrrrr	�query_helper.szFirewallHelper.query_helpercCst|jj��S)N)�sortedr�keys)rrrr	r1szFirewallHelper.get_helperscCst|j�dkS)Nr)�lenr)rrrr	�has_helpers4szFirewallHelper.has_helperscCs|j|�|j|S)N)rr)rrrrr	�
get_helper7s
zFirewallHelper.get_helpercCs||j|j<dS)N)rr)r�objrrr	�
add_helper;szFirewallHelper.add_helpercCs"||jkrttj|��|j|=dS)N)rrrr)rrrrr	�
remove_helper>s
zFirewallHelper.remove_helperN)
�__name__�
__module__�__qualname__r
rrrrrrrrrrrrr	rsN)�__doc__�__all__ZfirewallrZfirewall.errorsr�objectrrrrr	�<module>sfw_ipset.cpython-36.pyc000064400000016503151730727350011031 0ustar003

��g�%�@sfdZdgZddlmZddlmZmZmZm	Z	ddl
mZddlm
Z
ddlmZGdd�de�Zd	S)
z
ipset backend�
FirewallIPSet�)�log)�remove_default_create_options�normalize_ipset_entry�check_entry_overlaps_existing�check_for_overlapping_entries)�IPSet)�errors)�
FirewallErrorc@s�eZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	d4dd�Z
dd�Zdd�Zd5dd�Z
dd�Zdd�Zdd�Zd6dd �Zd!d"�Zd#d$�Zd%d&�Zd7d'd(�Zd)d*�Zd+d,�Zd-d.�Zd/d0�Zd1d2�Zd3S)8rcCs||_i|_dS)N)�_fw�_ipsets)�self�fw�r�/usr/lib/python3.6/fw_ipset.py�__init__#szFirewallIPSet.__init__cCsd|j|jfS)Nz%s(%r))�	__class__r)r
rrr�__repr__'szFirewallIPSet.__repr__cCs|jj�dS)N)r�clear)r
rrr�cleanup,szFirewallIPSet.cleanupcCs||j�krttj|��dS)N)�
get_ipsetsr
r	Z
INVALID_IPSET)r
�namerrr�check_ipset/szFirewallIPSet.check_ipsetcCs||j�kS)N)r)r
rrrr�query_ipset3szFirewallIPSet.query_ipsetcCst|jj��S)N)�sortedr�keys)r
rrrr6szFirewallIPSet.get_ipsetscCst|j�dkS)Nr)�lenr)r
rrr�
has_ipsets9szFirewallIPSet.has_ipsetsFcCs&|j|�|j|}|r"|j|�|S)N)rr�check_applied_obj)r
r�applied�objrrr�	get_ipset<s



zFirewallIPSet.get_ipsetcCs4g}|jjr|j|jj�|jjr0|j|jj�|S)N)rZnftables_enabled�appendZnftables_backendZ
ipset_enabledZ
ipset_backend)r
�backendsrrrr#CszFirewallIPSet.backendscCs0|j|jjkr ttjd|j��||j|j<dS)Nz'%s' is not supported by ipset.)�typerZipset_supported_typesr
r	ZINVALID_TYPErr)r
r rrr�	add_ipsetKszFirewallIPSet.add_ipsetcCs�|j|}|jrh|rhy x|j�D]}|j|�q"WWqttk
rd}zttj|��WYdd}~XqtXntj	d|�|j|=dS)Nz,Keeping ipset '%s' because of timeout option)
rrr#�set_destroy�	Exceptionr
r	�COMMAND_FAILEDr�debug1)r
rZkeepr �backend�msgrrr�remove_ipsetQs
 zFirewallIPSet.remove_ipsetc<Cs$|j|}�x|j�D�]}|jdkr�|j�}||kr�d|jksv|jddksv|j||dksvt|j�||dkr�y|j|�Wn.tk
r�}zt	t
j|��WYdd}~XnX|jj
�r�y|j|j|j|j�Wn0tk
�r}zt	t
j|��WYdd}~Xn&Xd|_d|jk�r,|jddk�r,qy|j|j�Wn0tk
�rl}zt	t
j|��WYdd}~XnXx�|jD]J}y|j|j|�Wn0tk
�r�}zt	t
j|��WYdd}~XnX�qvWqy|j|j|j|j|jd�Wn0tk
�r}zt	t
j|��WYdd}~XqXd|_qWdS)N�ipset�timeout�0r�T)rr#rZset_get_active_terse�optionsr$�rm_def_cr_optsr&r'r
r	r(r�_individual_callsZ
set_creater�	set_flush�entries�set_add�set_restore)r
rr r*Zactiver+�entryrrr�apply_ipset]sL


&
zFirewallIPSet.apply_ipsetcCs>x8|j�D],}|j|}d|_tjd|�|j|�q
WdS)NFzApplying ipset '%s')rrrrr)r9)r
rr rrr�apply_ipsets�s

zFirewallIPSet.apply_ipsetscCs�xz|j�D]n}|jdkrq
x\|j�D]P}y|j|�|j|�Wq$tk
rr}z|jtjkrb|�WYdd}~Xq$Xq$Wq
WdS)NZnftables)	r#rr�
check_appliedr&r
�coder	�NOT_APPLIED)r
r*r-r+rrr�flush�s

zFirewallIPSet.flushTcCs|j||d�jS)N)r)r!r$)r
rrrrr�get_type�szFirewallIPSet.get_typecCst|j|dd�jjd��S)NT)r�,)rr!r$�split)r
rrrr�
get_dimension�szFirewallIPSet.get_dimensioncCs|j|�}|j|�dS)N)r!r)r
rr rrrr;�s
zFirewallIPSet.check_appliedcCs|jsttj|j��dS)N)rr
r	r=r)r
r rrrr�szFirewallIPSet.check_applied_objcCs.|j||d�}d|jkr*|jddkr*dSdS)N)rZfamilyZinet6Zipv6Zipv4)r!r1)r
rrr rrr�
get_family�s

zFirewallIPSet.get_familycCs�|j|dd�}t|�}tj||j|j�||jkrFttj	d||f��t
||j�y$x|j�D]}|j|j
|�q^WWn.tk
r�}zttj|��WYdd}~Xn&Xd|jks�|jddkr�|jj|�dS)NT)rz'%s' already is in '%s'r.r/)r!rr�check_entryr1r$r5r
r	ZALREADY_ENABLEDrr#r6rr'r(r")r
rr8r r*r+rrr�	add_entry�s
zFirewallIPSet.add_entrycCs�|j|dd�}t|�}||jkr4ttjd||f��y$x|j�D]}|j|j|�q@WWn.t	k
r�}zttj
|��WYdd}~Xn&Xd|jks�|jddkr�|jj|�dS)NT)rz'%s' not in '%s'r.r/)
r!rr5r
r	ZNOT_ENABLEDr#Z
set_deleterr'r(r1�remove)r
rr8r r*r+rrr�remove_entry�s
zFirewallIPSet.remove_entrycCsD|j|dd�}t|�}d|jkr:|jddkr:ttj|��||jkS)NT)rr.r/)r!rr1r
r	ZIPSET_WITH_TIMEOUTr5)r
rr8r rrr�query_entry�s
zFirewallIPSet.query_entrycCs|j|dd�}|jS)NT)r)r!r5)r
rr rrr�get_entries�szFirewallIPSet.get_entriescCs@|j|dd�}t|�x|D]}tj||j|j�qWd|jksN|jddkrT||_y"x|j�D]}|j|j	�q`WWn.t
k
r�}zttj
|��WYdd}~XnXd|_yXxR|j�D]F}|jjr�x8|jD]}|j|j	|�q�Wq�|j|j	|j|j|jd�q�WWn0t
k
�r4}zttj
|��WYdd}~XnXd|_dS)NT)rr.r/)r!rrrDr1r$r5r#r4rr'r
r	r(rrr3r6r7)r
rr5r r8r*r+rrr�set_entries�s.
zFirewallIPSet.set_entriesN)F)F)T)T)�__name__�
__module__�__qualname__rrrrrrrr!r#r%r,r9r:r>r?rBr;rrCrErGrHrIrJrrrrr"s0

1

		N)�__doc__�__all__Zfirewall.core.loggerrZfirewall.core.ipsetrr2rrrZfirewall.core.io.ipsetrZfirewallr	Zfirewall.errorsr
�objectrrrrr�<module>sfw_helper.cpython-36.opt-1.pyc000064400000003705151730727350012123 0ustar003

��g)�@s6dZdgZddlmZddlmZGdd�de�ZdS)zhelper backend�FirewallHelper�)�errors)�
FirewallErrorc@s\eZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zdd�ZdS)rcCs||_i|_dS)N)Z_fw�_helpers)�self�fw�r�/usr/lib/python3.6/fw_helper.py�__init__szFirewallHelper.__init__cCsd|j|jfS)Nz%s(%r))�	__class__r)rrrr	�__repr__"szFirewallHelper.__repr__cCs|jj�dS)N)r�clear)rrrr	�cleanup'szFirewallHelper.cleanupcCs||j�krttj|��dS)N)�get_helpersrr�INVALID_HELPER)r�namerrr	�check_helper*szFirewallHelper.check_helpercCs||j�kS)N)r)rrrrr	�query_helper.szFirewallHelper.query_helpercCst|jj��S)N)�sortedr�keys)rrrr	r1szFirewallHelper.get_helperscCst|j�dkS)Nr)�lenr)rrrr	�has_helpers4szFirewallHelper.has_helperscCs|j|�|j|S)N)rr)rrrrr	�
get_helper7s
zFirewallHelper.get_helpercCs||j|j<dS)N)rr)r�objrrr	�
add_helper;szFirewallHelper.add_helpercCs"||jkrttj|��|j|=dS)N)rrrr)rrrrr	�
remove_helper>s
zFirewallHelper.remove_helperN)
�__name__�
__module__�__qualname__r
rrrrrrrrrrrrr	rsN)�__doc__�__all__ZfirewallrZfirewall.errorsr�objectrrrrr	�<module>sfw_nm.cpython-36.opt-1.pyc000064400000011713151730727350011254 0ustar003

��g�@s dZddddddddgZd	d
lZd	dlmZyejdd
�Wnek
rTdZYn8Xyd	dlmZdZWn e	eej
fk
r�dZYnXd
ad	dlm
Z
d	dlmZd	dlmZd	d
lZdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd �Zd!d�Zd"d�Zd#d�Zd
S)$z(Functions for NetworkManager interaction�check_nm_imported�nm_is_imported�nm_get_zone_of_connection�nm_set_zone_of_connection�nm_get_connections�nm_get_connection_of_interface�nm_get_bus_name�nm_get_dbus_interface�N)�GLib�NMz1.0F)rT)�errors)�
FirewallError)�logcCststtjd��dS)zNCheck function to raise a MISSING_IMPORT error if the import of NM failed
    zgi.repository.NM = 1.0N)�_nm_importedr
rZMISSING_IMPORT�rr�/usr/lib/python3.6/fw_nm.pyr0scCstS)znReturns true if NM has been properly imported
    @return True if import was successful, False otherwirse
    )rrrrrr6scCststjjd�atS)z�Returns the NM client object or None if the import of NM failed
    @return NM.Client instance if import was successful, None otherwise
    N)�
_nm_clientrZClient�newrrrr�
nm_get_client<srcCs�t�t�j|�}|dkrdS|j�}|dkr2dSy |j�tjjtjjB@rPdSWn t	k
rr|j
�rndSYnX|j�}|dkr�d}|S)z�Get zone of connection from NM
    @param connection name
    @return zone string setting of connection, empty string if not set, None if connection is unknown
    N�)rr�get_connection_by_uuid�get_setting_connection�	get_flagsr�SettingsConnectionFlags�NM_GENERATED�NM_VOLATILE�AttributeError�get_unsavedZget_zone)�
connection�con�setting_con�zonerrrrEs$
cCsVt�t�j|�}|dkrdS|j�}|dkr2dS|dkr>d}|jd|�|jdd�S)zSet the zone for a connection
    @param zone name
    @param connection name
    @return True if zone was set, else False
    NFrr!T)rrrrZset_propertyZcommit_changes)r!rrr rrrrcsc	Cs~|j�|j�t�t�j�}xX|D]P}|j�r4q&|j�}|j�}|j�}|||<x |D]}|j�}|rZ|||<qZWq&WdS)znGet active connections from NM
    @param connections return dict
    @param connections_name return dict
    N)	�clearrr�get_active_connections�get_vpnZget_id�get_uuid�get_devices�get_ip_iface)	ZconnectionsZconnections_nameZactive_connections�
active_con�nameZuuidZdevices�dev�ip_ifacerrrrxs


cCs�t�g}x�t�j�D]|}|j�r$qy&|j�}|j�tjjtjj	B@rHwWnt
k
rh|j�rdwYnXx&|j�D]}|j
�}|rt|j|�qtWqW|S)zGGet active interfaces from NM
    @returns list of interface names
    )rrr#r$�get_connectionrrrrrrrr&r'�append)Zactive_interfacesr(rr*r+rrr�nm_get_interfaces�s$r.cCs6g}x,t�D]"}t|�}|t|�kr|j|�qW|S)N)r.rrr-)r!Z
interfaces�	interfaceZconnrrr�nm_get_interfaces_in_zone�sr0cCs<t�x0t�j�D]"}|j�}|dkr(q||kr|SqWdS)zzGet device from NM which has the given IP interface
    @param interface name
    @returns NM.Device instance or None
    N)rrr&r')r/�devicer+rrr�nm_get_device_by_ip_iface�sr2cCsxt�t|�}|dkrdS|j�}|dkr.dSy |j�}|j�tjj@rLdSWn tk
rn|j	�rjdSYnX|j
�S)z�Get connection from NM that is using the interface
    @param interface name
    @returns connection that is using interface or None
    N)rr2Zget_active_connectionr,rrrrrrr%)r/r1r(rrrrr�s
cCsRtsdSy&tj�}|jtjtj�}|j}~~|Stk
rLt	j
d�YnXdS)Nz(Failed to get bus name of NetworkManager)r�dbusZ	SystemBusZ
get_objectr�DBUS_INTERFACEZ	DBUS_PATHZbus_name�	ExceptionrZdebug2)Zbus�objr)rrrr�scCstsdStjS)Nr)rrr4rrrrr�s)�__doc__�__all__ZgiZ
gi.repositoryr
Zrequire_version�
ValueErrorrr�ImportError�ErrorrZfirewallrZfirewall.errorsr
Zfirewall.core.loggerrr3rrrrrrr.r0r2rrrrrrr�<module>s@

	 	
fw_config.cpython-36.opt-1.pyc000064400000077161151730727350012120 0ustar003

��g��@s�dgZddlZddlZddlZddlZddlmZddlmZddl	m
Z
mZmZddl
mZmZmZddlmZmZmZddlmZmZmZdd	lmZmZmZdd
lmZmZm Z ddlm!Z!ddl"m#Z#Gd
d�de$�Z%dS)�FirewallConfig�N)�config)�log)�IcmpType�icmptype_reader�icmptype_writer)�Service�service_reader�service_writer)�Zone�zone_reader�zone_writer)�IPSet�ipset_reader�ipset_writer)�Helper�
helper_reader�
helper_writer)�Policy�
policy_reader�
policy_writer)�errors)�
FirewallErrorc@s$eZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zdd �Zd!d"�Zd#d$�Zd%d&�Zd'd(�Zd)d*�Zd+d,�Zd-d.�Zd/d0�Zd1d2�Zd3d4�Zd5d6�Zd7d8�Zd9d:�Zd;d<�Z d=d>�Z!d?d@�Z"dAdB�Z#dCdD�Z$dEdF�Z%dGdH�Z&dIdJ�Z'dKdL�Z(dMdN�Z)dOdP�Z*dQdR�Z+dSdT�Z,dUdV�Z-dWdX�Z.dYdZ�Z/d[d\�Z0d]d^�Z1d_d`�Z2dadb�Z3dcdd�Z4dedf�Z5dgdh�Z6didj�Z7dkdl�Z8dmdn�Z9dodp�Z:dqdr�Z;dsdt�Z<dudv�Z=dwdx�Z>dydz�Z?d{d|�Z@d}d~�ZAdd��ZBd�d��ZCd�d��ZDd�d��ZEd�d��ZFd�d��ZGd�d��ZHd�d��ZId�d��ZJd�d��ZKd�d��ZLd�d��ZMd�d��ZNd�d��ZOd�d��ZPd�d��ZQd�d��ZRd�d��ZSd�d��ZTd�d��ZUd�d��ZVd�d��ZWd�d��ZXd�d��ZYd�d��ZZd�d��Z[d�d��Z\d�d��Z]d�d��Z^d�d��Z_d�d��Z`d�d��Zad�d��Zbd�d„Zcd�dĄZdd�dƄZed�S)�rcCs||_|j�dS)N)�_fw�_FirewallConfig__init_vars)�self�fw�r�/usr/lib/python3.6/fw_config.py�__init__(szFirewallConfig.__init__cCsHd|j|j|j|j|j|j|j|j|j|j	|j
|j|j|j
|j|jfS)Nz>%s(%r, %r, %r, %r, %r, %r, %r, %r, %r, %r, %r, %r, %r, %r, %r))�	__class__�_ipsets�
_icmptypes�	_services�_zones�_helpersZpolicy_objects�_builtin_ipsets�_builtin_icmptypes�_builtin_services�_builtin_zones�_builtin_helpers�_builtin_policy_objects�_firewalld_conf�	_policies�_direct)rrrr�__repr__,szFirewallConfig.__repr__cCs^i|_i|_i|_i|_i|_i|_i|_i|_i|_i|_	i|_
i|_d|_d|_
d|_dS)N)r!r"r#r$r%�_policy_objectsr&r'r(r)r*r+r,r-r.)rrrrZ__init_vars6szFirewallConfig.__init_varscCs4x,t|jj��D]}|j|j�|j|=qWx,t|jj��D]}|j|j�|j|=q>Wx,t|jj��D]}|j|j�|j|=qlWx,t|jj��D]}|j|j�|j|=q�Wx,t|jj��D]}|j|j�|j|=q�Wx,t|jj��D]}|j|j�|j|=q�Wx.t|j	j��D]}|j	|j�|j	|=�q$Wx.t|j
j��D]}|j
|j�|j
|=�qTWx.t|jj��D]}|j|j�|j|=�q�Wx.t|jj��D]}|j|j�|j|=�q�W|j
�r�|j
j�|`
d|_
|j�r|jj�|`d|_|j�r(|jj�|`d|_|j�dS)N)�listr&�keys�cleanupr!r'r"r(r#r)r$r*r%r,r-r.r)r�xrrrr3GsV


zFirewallConfig.cleanupcCs|jjj�S)N)r�policiesZquery_lockdown)rrrr�lockdown_enabled~szFirewallConfig.lockdown_enabledcCs|jjj||�S)N)rr5�access_check)r�key�valuerrrr7�szFirewallConfig.access_checkcCs
||_dS)N)r,)r�confrrr�set_firewalld_conf�sz!FirewallConfig.set_firewalld_confcCs|jS)N)r,)rrrr�get_firewalld_conf�sz!FirewallConfig.get_firewalld_confcCs(tjjtj�s|jj�n
|jj�dS)N)�os�path�existsrZFIREWALLD_CONFr,�clear�read)rrrr�update_firewalld_conf�sz$FirewallConfig.update_firewalld_confcCs
||_dS)N)r-)rr5rrr�set_policies�szFirewallConfig.set_policiescCs|jS)N)r-)rrrr�get_policies�szFirewallConfig.get_policiescCs,tjjtj�s|jjj�n|jjj�dS)N)	r=r>r?rZLOCKDOWN_WHITELISTr-Zlockdown_whitelistr3rA)rrrr�update_lockdown_whitelist�sz(FirewallConfig.update_lockdown_whitelistcCs
||_dS)N)r.)rZdirectrrr�
set_direct�szFirewallConfig.set_directcCs|jS)N)r.)rrrr�
get_direct�szFirewallConfig.get_directcCs(tjjtj�s|jj�n
|jj�dS)N)r=r>r?rZFIREWALLD_DIRECTr.r3rA)rrrr�
update_direct�szFirewallConfig.update_directcCs$ttt|jj��t|jj����S)N)�sorted�setr1r!r2r&)rrrr�
get_ipsets�szFirewallConfig.get_ipsetscCs$|jr||j|j<n||j|j<dS)N)�builtinr&�namer!)r�objrrr�	add_ipset�szFirewallConfig.add_ipsetcCs8||jkr|j|S||jkr(|j|Sttj|��dS)N)r!r&rr�
INVALID_IPSET)rrMrrr�	get_ipset�s




zFirewallConfig.get_ipsetcCst|j|jkrttj|j��nB|j|j|kr@ttjd|j��n|j|jkr^ttjd|j��|j|�|j|jS)Nzself._ipsets[%s] != objz'%s' not a built-in ipset)rMr!rr�NO_DEFAULTSr&�
_remove_ipset)rrNrrr�load_ipset_defaults�s
z"FirewallConfig.load_ipset_defaultscCs|j�S)N)�
export_config)rrNrrr�get_ipset_config�szFirewallConfig.get_ipset_configcCsj|jrPtj|�}|j|�tj|_d|_|j|jkr:d|_|j|�t|�|S|j|�t|�|SdS)NF)	rL�copy�
import_configr�ETC_FIREWALLD_IPSETSr>�defaultrOr)rrNr:r4rrr�set_ipset_config�s



zFirewallConfig.set_ipset_configcCsx||jks||jkr$ttjd|��t�}|j|�|j|�||_d||_	t
j|_d|_
d|_t|�|j|�|S)Nznew_ipset(): '%s'z%s.xmlFT)r!r&rr�
NAME_CONFLICTr�
check_namerXrM�filenamerrYr>rLrZrrO)rrMr:r4rrr�	new_ipset�s




zFirewallConfig.new_ipsetcCs�tjj|�}tjj|�}tjj|�s�|tjkr�x�|jj�D]D}|j|}|j	|kr:|j|=|j
|jkrvd|j|j
fSd|fSq:WnHxF|jj�D]8}|j|}|j	|kr�|j|=|j
|jkr�d|fSdSq�WdStj
d|�yt||�}Wn0tk
�r}ztjd||�dSd}~XnX|j
|jk�rJ|j
|jk�rJ|j|�d|fS|tjk�r�|j
|jk�r�|j|j
j|_||j|j
<d|fS|j
|jk�r�|j|j
=||j|j
<|j
|jk�r�d|fSd	Sd
S)N�update�removezLoading ipset file '%s'z"Failed to load ipset file '%s': %s�new)NN)NN)NN)NN)NN)r=r>�basename�dirnamer?rrYr!r2r^rMr&r�debug1r�	Exception�errorrOrZ)rrMr^r>r4rN�msgrrr�update_ipset_from_path�sP






z%FirewallConfig.update_ipset_from_pathcCs�|j|jkrttj|j��|jtjkr>ttjd|jtjf��d|j|jf}yt	j
|d|�Wn:tk
r�}ztj
d||�tj|�WYdd}~XnX|j|j=dS)Nz'%s' != '%s'z	%s/%s.xmlz%s.oldzBackup of file '%s' failed: %s)rMr!rrrPr>rrY�INVALID_DIRECTORY�shutil�moverfrrgr=ra)rrNrMrhrrrrS8szFirewallConfig._remove_ipsetcCs$|js|jr ttjd|j��dS)Nz'%s' is built-in ipset)rLrZrrZ
BUILTIN_IPSETrM)rrNrrr�check_builtin_ipsetIsz"FirewallConfig.check_builtin_ipsetcCs|j|�|j|�dS)N)rmrS)rrNrrr�remove_ipsetNs
zFirewallConfig.remove_ipsetcCs$|j|�|j||�}|j|�|S)N)rm�_copy_ipsetrS)rrNrMr_rrr�rename_ipsetRs

zFirewallConfig.rename_ipsetcCs|j||j��S)N)r_rU)rrNrMrrrroXszFirewallConfig._copy_ipsetcCs$ttt|jj��t|jj����S)N)rIrJr1r"r2r')rrrr�
get_icmptypes]szFirewallConfig.get_icmptypescCs$|jr||j|j<n||j|j<dS)N)rLr'rMr")rrNrrr�add_icmptypeaszFirewallConfig.add_icmptypecCs8||jkr|j|S||jkr(|j|Sttj|��dS)N)r"r'rr�INVALID_ICMPTYPE)rrMrrr�get_icmptypegs




zFirewallConfig.get_icmptypecCst|j|jkrttj|j��nB|j|j|kr@ttjd|j��n|j|jkr^ttjd|j��|j|�|j|jS)Nzself._icmptypes[%s] != objz'%s' not a built-in icmptype)rMr"rrrRr'�_remove_icmptype)rrNrrr�load_icmptype_defaultsns
z%FirewallConfig.load_icmptype_defaultscCs|j�S)N)rU)rrNrrr�get_icmptype_configzsz"FirewallConfig.get_icmptype_configcCsj|jrPtj|�}|j|�tj|_d|_|j|jkr:d|_|j|�t|�|S|j|�t|�|SdS)NF)	rLrWrXr�ETC_FIREWALLD_ICMPTYPESr>rZrrr)rrNr:r4rrr�set_icmptype_config}s



z"FirewallConfig.set_icmptype_configcCsx||jks||jkr$ttjd|��t�}|j|�|j|�||_d||_	t
j|_d|_
d|_t|�|j|�|S)Nznew_icmptype(): '%s'z%s.xmlFT)r"r'rrr\rr]rXrMr^rrxr>rLrZrrr)rrMr:r4rrr�new_icmptype�s




zFirewallConfig.new_icmptypecCs�tjj|�}tjj|�}tjj|�s�|tjkr�x�|jj�D]D}|j|}|j	|kr:|j|=|j
|jkrvd|j|j
fSd|fSq:WnHxF|jj�D]8}|j|}|j	|kr�|j|=|j
|jkr�d|fSdSq�WdStj
d|�yt||�}Wn0tk
�r}ztjd||�dSd}~XnX|j
|jk�rJ|j
|jk�rJ|j|�d|fS|tjk�r�|j
|jk�r�|j|j
j|_||j|j
<d|fS|j
|jk�r�|j|j
=||j|j
<|j
|jk�r�d|fSd	Sd
S)Nr`razLoading icmptype file '%s'z%Failed to load icmptype file '%s': %srb)NN)NN)NN)NN)NN)r=r>rcrdr?rrxr"r2r^rMr'rrerrfrgrrrZ)rrMr^r>r4rNrhrrr�update_icmptype_from_path�sP






z(FirewallConfig.update_icmptype_from_pathcCs�|j|jkrttj|j��|jtjkr>ttjd|jtjf��d|j|jf}yt	j
|d|�Wn:tk
r�}ztj
d||�tj|�WYdd}~XnX|j|j=dS)Nz'%s' != '%s'z	%s/%s.xmlz%s.oldzBackup of file '%s' failed: %s)rMr"rrrsr>rrxrjrkrlrfrrgr=ra)rrNrMrhrrrru�szFirewallConfig._remove_icmptypecCs$|js|jr ttjd|j��dS)Nz'%s' is built-in icmp type)rLrZrrZBUILTIN_ICMPTYPErM)rrNrrr�check_builtin_icmptype�sz%FirewallConfig.check_builtin_icmptypecCs|j|�|j|�dS)N)r|ru)rrNrrr�remove_icmptype�s
zFirewallConfig.remove_icmptypecCs$|j|�|j||�}|j|�|S)N)r|�_copy_icmptyperu)rrNrMrzrrr�rename_icmptype�s

zFirewallConfig.rename_icmptypecCs|j||j��S)N)rzrU)rrNrMrrrr~szFirewallConfig._copy_icmptypecCs$ttt|jj��t|jj����S)N)rIrJr1r#r2r()rrrr�get_services
szFirewallConfig.get_servicescCs$|jr||j|j<n||j|j<dS)N)rLr(rMr#)rrNrrr�add_serviceszFirewallConfig.add_servicecCs<||jkr|j|S||jkr(|j|Sttjd|��dS)Nzget_service(): '%s')r#r(rr�INVALID_SERVICE)rrMrrr�get_services




zFirewallConfig.get_servicecCst|j|jkrttj|j��nB|j|j|kr@ttjd|j��n|j|jkr^ttjd|j��|j|�|j|jS)Nzself._services[%s] != objz'%s' not a built-in service)rMr#rrrRr(�_remove_service)rrNrrr�load_service_defaultss
z$FirewallConfig.load_service_defaultscCsr|j�}g}x\td�D]P}|j|d|krN|jtjt||j|d���q|j||j|d�qWt|�S)N�r)�export_config_dict�range�IMPORT_EXPORT_STRUCTURE�appendrW�deepcopy�getattr�tuple)rrN�	conf_dict�	conf_list�irrr�get_service_config's"z!FirewallConfig.get_service_configcCs|j�S)N)r�)rrNrrr�get_service_config_dict3sz&FirewallConfig.get_service_config_dictcCs�i}x&t|�D]\}}|||j|d<qW|jr|tj|�}|j|�tj|_d|_|j|jkrfd|_|j	|�t
|�|S|j|�t
|�|SdS)NrF)�	enumerater�rLrW�import_config_dictr�ETC_FIREWALLD_SERVICESr>rZr�r
)rrNr:r�r�r9r4rrr�set_service_config6s 



z!FirewallConfig.set_service_configcCsj|jrPtj|�}|j|�tj|_d|_|j|jkr:d|_|j|�t|�|S|j|�t|�|SdS)NF)	rLrWr�rr�r>rZr�r
)rrNr:r4rrr�set_service_config_dictJs



z&FirewallConfig.set_service_config_dictcCs�||jks||jkr$ttjd|��i}x&t|�D]\}}||tj|d<q2Wt�}|j|�|j	|�||_
d||_tj
|_d|_d|_t|�|j|�|S)Nznew_service(): '%s'rz%s.xmlFT)r#r(rrr\r�rr�r]r�rMr^rr�r>rLrZr
r�)rrMr:r�r�r9r4rrr�new_serviceZs"




zFirewallConfig.new_servicecCsx||jks||jkr$ttjd|��t�}|j|�|j|�||_d||_	t
j|_d|_
d|_t|�|j|�|S)Nznew_service(): '%s'z%s.xmlFT)r#r(rrr\rr]r�rMr^rr�r>rLrZr
r�)rrMr:r4rrr�new_service_dictqs




zFirewallConfig.new_service_dictcCs�tjj|�}tjj|�}tjj|�s�|tjkr�x�|jj�D]D}|j|}|j	|kr:|j|=|j
|jkrvd|j|j
fSd|fSq:WnHxF|jj�D]8}|j|}|j	|kr�|j|=|j
|jkr�d|fSdSq�WdStj
d|�yt||�}Wn0tk
�r}ztjd||�dSd}~XnX|j
|jk�rJ|j
|jk�rJ|j|�d|fS|tjk�r�|j
|jk�r�|j|j
j|_||j|j
<d|fS|j
|jk�r�|j|j
=||j|j
<|j
|jk�r�d|fSd	Sd
S)Nr`razLoading service file '%s'z$Failed to load service file '%s': %srb)NN)NN)NN)NN)NN)r=r>rcrdr?rr�r#r2r^rMr(rrer	rfrgr�rZ)rrMr^r>r4rNrhrrr�update_service_from_path�sP






z'FirewallConfig.update_service_from_pathcCs�|j|jkrttj|j��|jtjkr>ttjd|jtjf��d|j|jf}yt	j
|d|�Wn:tk
r�}ztj
d||�tj|�WYdd}~XnX|j|j=dS)Nz'%s' != '%s'z	%s/%s.xmlz%s.oldzBackup of file '%s' failed: %s)rMr#rrr�r>rr�rjrkrlrfrrgr=ra)rrNrMrhrrrr��szFirewallConfig._remove_servicecCs$|js|jr ttjd|j��dS)Nz'%s' is built-in service)rLrZrrZBUILTIN_SERVICErM)rrNrrr�check_builtin_service�sz$FirewallConfig.check_builtin_servicecCs|j|�|j|�dS)N)r�r�)rrNrrr�remove_service�s
zFirewallConfig.remove_servicecCs$|j|�|j||�}|j|�|S)N)r��
_copy_servicer�)rrNrMr�rrr�rename_service�s

zFirewallConfig.rename_servicecCs|j||j��S)N)r�r�)rrNrMrrrr��szFirewallConfig._copy_servicecCs$ttt|jj��t|jj����S)N)rIrJr1r$r2r))rrrr�	get_zones�szFirewallConfig.get_zonescCs$|jr||j|j<n||j|j<dS)N)rLr)rMr$)rrNrrr�add_zone�szFirewallConfig.add_zonecCs(||jkr|j|=||jkr$|j|=dS)N)r)r$)rrMrrr�forget_zone�s

zFirewallConfig.forget_zonecCs<||jkr|j|S||jkr(|j|Sttjd|��dS)Nzget_zone(): %s)r$r)rr�INVALID_ZONE)rrMrrr�get_zone�s




zFirewallConfig.get_zonecCst|j|jkrttj|j��nB|j|j|kr@ttjd|j��n|j|jkr^ttjd|j��|j|�|j|jS)Nzself._zones[%s] != objz'%s' not a built-in zone)rMr$rrrRr)�_remove_zone)rrNrrr�load_zone_defaultss
z!FirewallConfig.load_zone_defaultscCsr|j�}g}x\td�D]P}|j|d|krN|jtjt||j|d���q|j||j|d�qWt|�S)N�r)r�r�r�r�rWr�r�r�)rrNr�r�r�rrr�get_zone_configs"zFirewallConfig.get_zone_configcCs|j�S)N)r�)rrNrrr�get_zone_config_dictsz#FirewallConfig.get_zone_config_dictcCs�i}x&t|�D]\}}|||j|d<qW|jr�tj|�}||_|j|�tj|_d|_|j|jkrld|_	|j
|�t|�|S||_|j|�t|�|SdS)NrF)r�r�rLrW�	fw_configr�r�ETC_FIREWALLD_ZONESr>rZr�r
)rrNr:r�r�r9r4rrr�set_zone_config s$



zFirewallConfig.set_zone_configcCsv|jrVtj|�}||_|j|�tj|_d|_|j|jkr@d|_|j|�t	|�|S||_|j|�t	|�|SdS)NF)
rLrWr�r�rr�r>rZr�r
)rrNr:r4rrr�set_zone_config_dict6s



z#FirewallConfig.set_zone_config_dictcCs�||jks||jkr$ttjd|��i}x&t|�D]\}}||tj|d<q2Wt�}||_|j	|�|j
|�||_d||_t
j|_d|_d|_t|�|j|�|S)Nznew_zone(): '%s'rz%s.xmlFT)r$r)rrr\r�rr�r�r]r�rMr^rr�r>rLrZr
r�)rrMr:r�r�r9r4rrr�new_zoneHs"



zFirewallConfig.new_zonecCs~||jks||jkr$ttjd|��t�}||_|j|�|j|�||_	d||_
tj|_
d|_d|_t|�|j|�|S)Nznew_zone(): '%s'z%s.xmlFT)r$r)rrr\rr�r]r�rMr^rr�r>rLrZr
r�)rrMr:r4rrr�
new_zone_dict_s



zFirewallConfig.new_zone_dictcCstjj|�}tjj|�}tjj|�s�|jtj�r�x�|jj	�D]D}|j|}|j
|kr<|j|=|j|jkrxd|j|jfSd|fSq<WnHxF|jj	�D]8}|j|}|j
|kr�|j|=|j|jkr�d|fSd	Sq�Wd
St
jd|�yt||�}Wn0tk
�r}zt
jd||�dSd}~XnX||_|jtj��rlt|�ttj�k�rldtjj|�tjj|�dd�f|_|j|jk�r�|j|jk�r�|j|�d|fS|jtj��r�|j|jk�r�|j|jj|_||j|j<d|fS|j|jk�r|j|j=||j|j<|j|jk�rd|fSd
SdS)Nr`razLoading zone file '%s'z!Failed to load zone file '%s': %sz%s/%sr�rb)NN)NN)NN���)NN)NN)r=r>rcrdr?�
startswithrr�r$r2r^rMr)rrerrfrgr��lenr�rZ)rrMr^r>r4rNrhrrr�update_zone_from_pathrsZ





z$FirewallConfig.update_zone_from_pathcCs�|j|jkrttj|j��|jjtj�s@ttj	d|jtjf��d|j|jf}yt
j|d|�Wn:tk
r�}zt
jd||�tj|�WYdd}~XnX|j|j=dS)Nz'%s' doesn't start with '%s'z	%s/%s.xmlz%s.oldzBackup of file '%s' failed: %s)rMr$rrr�r>r�rr�rjrkrlrfrrgr=ra)rrNrMrhrrrr��szFirewallConfig._remove_zonecCs$|js|jr ttjd|j��dS)Nz'%s' is built-in zone)rLrZrrZBUILTIN_ZONErM)rrNrrr�check_builtin_zone�sz!FirewallConfig.check_builtin_zonecCs|j|�|j|�dS)N)r�r�)rrNrrr�remove_zone�s
zFirewallConfig.remove_zonec	CsN|j|�|j�}|j|�y|j||�}Wn|j|j|��YnX|S)N)r�r�r�r�rM)rrNrMZobj_confr�rrr�rename_zone�s

zFirewallConfig.rename_zonecCs$ttt|jj��t|jj����S)N)rIrJr1r0r2r+)rrrr�get_policy_objects�sz!FirewallConfig.get_policy_objectscCs$|jr||j|j<n||j|j<dS)N)rLr+rMr0)rrNrrr�add_policy_object�sz FirewallConfig.add_policy_objectcCs<||jkr|j|S||jkr(|j|Sttjd|��dS)Nzget_policy_object(): %s)r0r+rr�INVALID_POLICY)rrMrrr�get_policy_object�s




z FirewallConfig.get_policy_objectcCst|j|jkrttj|j��nB|j|j|kr@ttjd|j��n|j|jkr^ttjd|j��|j|�|j|jS)Nzself._policy_objects[%s] != objz'%s' not a built-in policy)rMr0rrrRr+�_remove_policy_object)rrNrrr�load_policy_object_defaults�s
z*FirewallConfig.load_policy_object_defaultscCs|j�S)N)r�)rrNrrr�get_policy_object_config_dictsz,FirewallConfig.get_policy_object_config_dictcCsv|jrVtj|�}||_|j|�tj|_d|_|j|jkr@d|_|j|�t	|�|S||_|j|�t	|�|SdS)NF)
rLrWr�r�r�ETC_FIREWALLD_POLICIESr>rZr�r)rrNr:r4rrr�set_policy_object_config_dicts



z,FirewallConfig.set_policy_object_config_dictcCs~||jks||jkr$ttjd|��t�}||_|j|�|j|�||_	d||_
tj|_
d|_d|_t|�|j|�|S)Nznew_policy_object(): '%s'z%s.xmlFT)r0r+rrr\rr�r]r�rMr^rr�r>rLrZrr�)rrMr:r4rrr�new_policy_object_dicts



z%FirewallConfig.new_policy_object_dictcCstjj|�}tjj|�}tjj|�s�|jtj�r�x�|jj	�D]D}|j|}|j
|kr<|j|=|j|jkrxd|j|jfSd|fSq<WnHxF|jj	�D]8}|j|}|j
|kr�|j|=|j|jkr�d|fSd	Sq�Wd
St
jd|�yt||�}Wn0tk
�r}zt
jd||�dSd}~XnX||_|jtj��rlt|�ttj�k�rldtjj|�tjj|�dd�f|_|j|jk�r�|j|jk�r�|j|�d|fS|jtj��r�|j|jk�r�|j|jj|_||j|j<d|fS|j|jk�r|j|j=||j|j<|j|jk�rd|fSd
SdS)Nr`razLoading policy file '%s'z#Failed to load policy file '%s': %sz%s/%srr�rb)NN)NN)NNr�)NN)NN)r=r>rcrdr?r�rr�r0r2r^rMr+rrerrfrgr�r�r�rZ)rrMr^r>r4rNrhrrr�update_policy_object_from_path,sZ





z-FirewallConfig.update_policy_object_from_pathcCs�|j|jkrttj|j��|jjtj�s@ttj	d|jtjf��d|j|jf}yt
j|d|�Wn:tk
r�}zt
jd||�tj|�WYdd}~XnX|j|j=dS)Nz'%s' doesn't start with '%s'z	%s/%s.xmlz%s.oldzBackup of file '%s' failed: %s)rMr0rrr�r>r�rr�rjrkrlrfrrgr=ra)rrNrMrhrrrr�ysz$FirewallConfig._remove_policy_objectcCs$|js|jr ttjd|j��dS)Nz'%s' is built-in policy)rLrZrrZBUILTIN_POLICYrM)rrNrrr�check_builtin_policy_object�sz*FirewallConfig.check_builtin_policy_objectcCs|j|�|j|�dS)N)r�r�)rrNrrr�remove_policy_object�s
z#FirewallConfig.remove_policy_objectcCs$|j|�|j||�}|j|�|S)N)r��_copy_policy_objectr�)rrNrMZnew_policy_objectrrr�rename_policy_object�s

z#FirewallConfig.rename_policy_objectcCs|j||j��S)N)r�r�)rrNrMrrrr��sz"FirewallConfig._copy_policy_objectcCs$ttt|jj��t|jj����S)N)rIrJr1r%r2r*)rrrr�get_helpers�szFirewallConfig.get_helperscCs$|jr||j|j<n||j|j<dS)N)rLr*rMr%)rrNrrr�
add_helper�szFirewallConfig.add_helpercCs8||jkr|j|S||jkr(|j|Sttj|��dS)N)r%r*rr�INVALID_HELPER)rrMrrr�
get_helper�s




zFirewallConfig.get_helpercCst|j|jkrttj|j��nB|j|j|kr@ttjd|j��n|j|jkr^ttjd|j��|j|�|j|jS)Nzself._helpers[%s] != objz'%s' not a built-in helper)rMr%rrrRr*�_remove_helper)rrNrrr�load_helper_defaults�s
z#FirewallConfig.load_helper_defaultscCs|j�S)N)rU)rrNrrr�get_helper_config�sz FirewallConfig.get_helper_configcCsj|jrPtj|�}|j|�tj|_d|_|j|jkr:d|_|j|�t|�|S|j|�t|�|SdS)NF)	rLrWrXr�ETC_FIREWALLD_HELPERSr>rZr�r)rrNr:r4rrr�set_helper_config�s



z FirewallConfig.set_helper_configcCsx||jks||jkr$ttjd|��t�}|j|�|j|�||_d||_	t
j|_d|_
d|_t|�|j|�|S)Nznew_helper(): '%s'z%s.xmlFT)r%r*rrr\rr]rXrMr^rr�r>rLrZrr�)rrMr:r4rrr�
new_helper�s




zFirewallConfig.new_helpercCs�tjj|�}tjj|�}tjj|�s�|tjkr�x�|jj�D]D}|j|}|j	|kr:|j|=|j
|jkrvd|j|j
fSd|fSq:WnHxF|jj�D]8}|j|}|j	|kr�|j|=|j
|jkr�d|fSdSq�WdStj
d|�yt||�}Wn0tk
�r}ztjd||�dSd}~XnX|j
|jk�rJ|j
|jk�rJ|j|�d|fS|tjk�r�|j
|jk�r�|j|j
j|_||j|j
<d|fS|j
|jk�r�|j|j
=||j|j
<|j
|jk�r�d|fSd	Sd
S)Nr`razLoading helper file '%s'z#Failed to load helper file '%s': %srb)NN)NN)NN)NN)NN)r=r>rcrdr?rr�r%r2r^rMr*rrerrfrgr�rZ)rrMr^r>r4rNrhrrr�update_helper_from_path�sP






z&FirewallConfig.update_helper_from_pathcCs�|j|jkrttj|j��|jtjkr>ttjd|jtjf��d|j|jf}yt	j
|d|�Wn:tk
r�}ztj
d||�tj|�WYdd}~XnX|j|j=dS)Nz'%s' != '%s'z	%s/%s.xmlz%s.oldzBackup of file '%s' failed: %s)rMr%rrr�r>rr�rjrkrlrfrrgr=ra)rrNrMrhrrrr�&szFirewallConfig._remove_helpercCs$|js|jr ttjd|j��dS)Nz'%s' is built-in helper)rLrZrrZBUILTIN_HELPERrM)rrNrrr�check_builtin_helper7sz#FirewallConfig.check_builtin_helpercCs|j|�|j|�dS)N)r�r�)rrNrrr�
remove_helper<s
zFirewallConfig.remove_helpercCs$|j|�|j||�}|j|�|S)N)r��_copy_helperr�)rrNrMr�rrr�
rename_helper@s

zFirewallConfig.rename_helpercCs|j||j��S)N)r�rU)rrNrMrrrr�FszFirewallConfig._copy_helperN)f�__name__�
__module__�__qualname__rr/rr3r6r7r;r<rBrCrDrErFrGrHrKrOrQrTrVr[r_rirSrmrnrprorqrrrtrvrwryrzr{rur|r}rr~r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rrrrr's�
7EEEMME)&�__all__rWr=Zos.pathrkZfirewallrZfirewall.core.loggerrZfirewall.core.io.icmptyperrrZfirewall.core.io.servicerr	r
Zfirewall.core.io.zonerrr
Zfirewall.core.io.ipsetrrrZfirewall.core.io.helperrrrZfirewall.core.io.policyrrrrZfirewall.errorsr�objectrrrrr�<module>sprog.cpython-36.opt-1.pyc000064400000001266151730727350011117 0ustar003

��g��@sddlZdgZddd�ZdS)�N�runProgc
Cs�|dkrg}|g|}d}|r@t|d��}|j�j�}WdQRXddi}y tj|tjtjtjd|d�}Wntk
r|d
SX|j|�\}}	|j	dd	�}|j
|fS)N�rZLANG�CT)�stdin�stderr�stdoutZ	close_fds�env��zutf-8�replace)r	r
)�open�read�encode�
subprocess�Popen�PIPEZSTDOUT�OSErrorZcommunicate�decode�
returncode)
�prog�argvr�argsZinput_stringZhandlerZprocess�outputZ
err_output�r�/usr/lib/python3.6/prog.pyrs$

)NN)r�__all__rrrrr�<module>sfw_direct.cpython-36.pyc000064400000031230151730727350011151 0ustar003

��g�W�@sndgZddlmZddlmZddlmZddlmZddlm	Z	ddl
mZddlm
Z
Gd	d�de�Zd
S)�FirewallDirect�)�LastUpdatedOrderedDict)�	ipXtables)�ebtables)�FirewallTransaction)�log)�errors)�
FirewallErrorc@sLeZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dNdd�Zdd�Zdd�Z
dOdd�Zdd�Zdd�Zdd�Zd d!�ZdPd"d#�ZdQd$d%�Zd&d'�Zd(d)�Zd*d+�ZdRd,d-�ZdSd.d/�Zd0d1�Zd2d3�Zd4d5�Zd6d7�Zd8d9�Zd:d;�ZdTd<d=�Z dUd>d?�Z!d@dA�Z"dBdC�Z#dDdE�Z$dFdG�Z%dHdI�Z&dJdK�Z'dLdM�Z(dS)VrcCs||_|j�dS)N)�_fw�_FirewallDirect__init_vars)�self�fw�r�/usr/lib/python3.6/fw_direct.py�__init__'szFirewallDirect.__init__cCsd|j|j|j|jfS)Nz%s(%r, %r, %r))�	__class__�_chains�_rules�_rule_priority_positions)rrrr�__repr__+szFirewallDirect.__repr__cCs"i|_i|_i|_i|_d|_dS)N)rrr�
_passthroughs�_obj)rrrrZ__init_vars/s
zFirewallDirect.__init_varscCs|j�dS)N)r)rrrr�cleanup6szFirewallDirect.cleanupcCs
t|j�S)N)rr
)rrrr�new_transaction;szFirewallDirect.new_transactioncCs
||_dS)N)r)r�objrrr�set_permanent_config@sz#FirewallDirect.set_permanent_configcCs*t|j�t|j�t|j�dkr&dSdS)NrTF)�lenrrr)rrrr�has_runtime_configurationCs"z(FirewallDirect.has_runtime_configurationcCsB|j�rdSt|jj��t|jj��t|jj��dkr>dSdS)NTrF)rrr�get_all_chains�
get_all_rules�get_all_passthroughs)rrrr�has_configurationHsz FirewallDirect.has_configurationNcCsP|dkr|j�}n|}|j|jj�|jj�|jj�f|�|dkrL|jd�dS)NT)r�
set_configrrrr �execute)r�use_transaction�transactionrrr�apply_directQs

zFirewallDirect.apply_directcCsi}i}i}xL|jD]B}|\}}x4|j|D]&}|jj|||�s,|j|g�j|�q,WqWxf|jD]\}|\}}}xL|j|D]>\}	}
|jj||||	|
�s|||kr�t�||<|	|||	|
f<q|WqbWxP|jD]F}x@|j|D]2}
|jj	||
�s�||k�r�g||<||j|
�q�Wq�W|||fS)N)
rr�query_chain�
setdefault�appendr�
query_rulerr�query_passthrough)rZchains�rulesZpassthroughs�table_id�ipv�table�chain�chain_id�priority�argsrrr�get_runtime_configbs,


z!FirewallDirect.get_runtime_configcCs|j|j|jfS)N)rrr)rrrr�
get_config�szFirewallDirect.get_configcCs�|dkr|j�}n|}|\}}}x||D]t}|\}}	xf||D]Z}
|j||	|
�s<y|j||	|
|d�Wq<tk
r�}ztjt|��WYdd}~Xq<Xq<Wq&Wx�|D]�}|\}}	}
xt||D]h\}
}|j||	|
|
|�s�y|j||	|
|
||d�Wq�tk
�r"}ztjt|��WYdd}~Xq�Xq�Wq�Wxx|D]p}xh||D]\}|j	||��s@y|j
|||d�Wn2tk
�r�}ztjt|��WYdd}~XnX�q@W�q2W|dk�r�|jd�dS)N)r$T)rr'�	add_chainr	rZwarning�strr*�add_ruler+�add_passthroughr#)rZconfr$r%rrrr-r.r/r0�errorr1r2r3rrrr"�s@



(

(
,
zFirewallDirect.set_configcCs*dddg}||kr&ttjd||f��dS)N�ipv4�ipv6Zebz'%s' not in '%s')r	rZINVALID_IPV)rr.Zipvsrrr�
_check_ipv�s
zFirewallDirect._check_ipvcCsF|j|�|dkrtjj�ntjj�}||krBttjd||f��dS)Nr;r<z'%s' not in '%s')r;r<)r=r�BUILT_IN_CHAINS�keysrr	rZ
INVALID_TABLE)rr.r/Ztablesrrr�_check_ipv_table�s

zFirewallDirect._check_ipv_tablecCs�|dkr4tj|}|jjr i}qH|jj|�j|}ntj|}tj|}||kr`tt	j
d|��||krxtt	j
d|��|dkr�|jjj|�dk	r�tt	j
d|��dS)Nr;r<zchain '%s' is built-in chainzchain '%s' is reservedzChain '%s' is reserved)r;r<)r;r<)rr>r
�nftables_enabled�get_direct_backend_by_ipv�
our_chainsrZ
OUR_CHAINSr	rZ
BUILTIN_CHAIN�zoneZzone_from_chainZ
INVALID_CHAIN)rr.r/r0Zbuilt_in_chainsrCrrr�_check_builtin_chain�s"




z#FirewallDirect._check_builtin_chaincCsH|r|jj|g�j|�n*|j|j|�t|j|�dkrD|j|=dS)Nr)rr(r)�remover)rr-r0�addrrr�_register_chain�s
zFirewallDirect._register_chaincCsV|dkr|j�}n|}|jj�r.|j|jj�|jd||||�|dkrR|jd�dS)NT)rr
�may_skip_flush_direct_backends�add_pre�flush_direct_backends�_chainr#)rr.r/r0r$r%rrrr6�s

zFirewallDirect.add_chaincCs>|dkr|j�}n|}|jd||||�|dkr:|jd�dS)NFT)rrLr#)rr.r/r0r$r%rrr�remove_chain�s
zFirewallDirect.remove_chaincCs:|j||�|j|||�||f}||jko8||j|kS)N)r@rEr)rr.r/r0r-rrrr'�s

zFirewallDirect.query_chaincCs,|j||�||f}||jkr(|j|SgS)N)r@r)rr.r/r-rrr�
get_chains�s


zFirewallDirect.get_chainscCsDg}x:|jD]0}|\}}x"|j|D]}|j|||f�q$WqW|S)N)rr))r�r�keyr.r/r0rrrrszFirewallDirect.get_all_chainscCsZ|dkr|j�}n|}|jj�r.|j|jj�|jd||||||�|dkrV|jd�dS)NT)rr
rIrJrK�_ruler#)rr.r/r0r2r3r$r%rrrr8	s

zFirewallDirect.add_rulecCsB|dkr|j�}n|}|jd||||||�|dkr>|jd�dS)NFT)rrQr#)rr.r/r0r2r3r$r%rrr�remove_rules
zFirewallDirect.remove_rulecCs2|j||�|||f}||jko0||f|j|kS)N)r@r)rr.r/r0r2r3r1rrrr*#s

zFirewallDirect.query_rulecCs6|j||�|||f}||jkr2t|j|j��SgS)N)r@r�listr?)rr.r/r0r1rrr�	get_rules)s


zFirewallDirect.get_rulesc	CsRg}xH|jD]>}|\}}}x.|j|D] \}}|j||||t|�f�q&WqW|S)N)rr)rS)rrOrPr.r/r0r2r3rrrr0s
 zFirewallDirect.get_all_rulescCs�|rr||jkrt�|j|<||j||<||jkr<i|j|<||j|krb|j|||7<q�||j||<n<|j||=t|j|�dkr�|j|=|j|||8<dS)Nr)rrrr)r�rule_idr1r2�enable�countrrr�_register_rule8s


zFirewallDirect._register_rulecCsVy|jj|jj|�j|�Stk
rP}ztj|�ttj	|��WYdd}~XnXdS)N)
r
�rulerB�name�	ExceptionrZdebug2r	rZCOMMAND_FAILED)rr.r3�msgrrr�passthroughLs

zFirewallDirect.passthroughcCsX|r*||jkrg|j|<|j|j|�n*|j|j|�t|j|�dkrT|j|=dS)Nr)rr)rFr)rr.r3rVrrr�_register_passthroughTs

z$FirewallDirect._register_passthroughcCsX|dkr|j�}n|}|jj�r.|j|jj�|jd|t|�|�|dkrT|jd�dS)NT)rr
rIrJrK�_passthroughrSr#)rr.r3r$r%rrrr9^s

zFirewallDirect.add_passthroughcCs@|dkr|j�}n|}|jd|t|�|�|dkr<|jd�dS)NFT)rr_rSr#)rr.r3r$r%rrr�remove_passthroughls
z!FirewallDirect.remove_passthroughcCs||jkot|�|j|kS)N)r�tuple)rr.r3rrrr+ws
z FirewallDirect.query_passthroughcCs>g}x4|jD]*}x$|j|D]}|j|t|�f�qWqW|S)N)rr)rS)rrOr.r3rrrr {s
z#FirewallDirect.get_all_passthroughscCs4g}||jkr0x |j|D]}|jt|��qW|S)N)rr)rS)rr.rOr3rrr�get_passthroughs�s

zFirewallDirect.get_passthroughscCs�g}x�|D]�}d}x�|D]�}y|j|�}Wntk
r>YqXt|�|krd||dkrd}||djd�}x.|D]&}	|dd�}
|	|
|d<|j|
�qxWqW|s
|j|�q
W|S)z5Split values combined with commas for options in optsF�,�TN)�index�
ValueErrorr�splitr))rr,ZoptsZ	out_rulesrYZ	processed�opt�i�items�itemrQrrr�split_value�s$


zFirewallDirect.split_valuec
Cs*|j||�|jjr2|dkr2|jjj||||�|}|jj|�}	|jjrd|	j|||�rdd|}n:|jjr�|dd�dkr�|	j|||dd��r�|dd�}|||f}
||f}|r�|
|jkr�||j|
kr�tt	j
d||||f��nB|
|jk�s||j|
k�rtt	jd||||f��|j|
|}d}d	}
|
|jk�r�t
|j|
j��}d	}x@|t|�k�r�|||k�r�||j|
||7}|d7}�qTWt|�g}|j|d
dg�}|j|dd
g�}x<|D]4}|j|	|	j||||t|���|d7}|
d7}
�q�W|j||
|||
�|j|j||
|||
�dS)Nr;r<z	%s_direct�Z_directz"rule '%s' already is in '%s:%s:%s'zrule '%s' is not in '%s:%s:%s'rdrz-sz--sourcez-dz
--destination)r;r<i����i����i����)r@r
rArD�create_zone_base_by_chainrBZis_chain_builtinrr	r�ALREADY_ENABLED�NOT_ENABLEDr�sortedr?rrSrlr8Z
build_rulerarX�add_fail)rrVr.r/r0r2r3r%rL�backendr1rUrerWZ	positions�jZ	args_list�_argsrrrrQ�sZ




(

zFirewallDirect._rulecCs�|j||�|j|||�||f}|rV||jkr�||j|kr�ttjd|||f��n.||jksn||j|kr�ttjd|||f��|jj|�}|j	||j
|||��|j|||�|j|j|||�dS)Nz chain '%s' already is in '%s:%s'zchain '%s' is not in '%s:%s')
r@rErr	rrorpr
rBZ	add_rulesZbuild_chain_rulesrHrr)rrGr.r/r0r%r-rsrrrrLs$

zFirewallDirect._chainc
Cs�|j|�t|�}|rD||jkrp||j|krpttjd||f��n,||jks\||j|krpttjd||f��|jj|�}|r�|j	|�|dkr�|j
|�\}}|r�|r�|jjj|||�|}	n
|j
|�}	|j||	�|j|||�|j|j|||�dS)Nzpassthrough '%s', '%s'r;r<)r;r<)r=rarr	rrorpr
rBZcheck_passthroughZpassthrough_parse_table_chainrDrnZreverse_passthroughr8r^rr)
rrVr.r3r%Z
tuple_argsrsr/r0rurrrr_'s0




zFirewallDirect._passthrough)N)N)N)N)N)N)N)N))�__name__�
__module__�__qualname__rrrrrrrr!r&r4r5r"r=r@rErHr6rMr'rNrr8rRr*rTrrXr]r^r9r`r+r rbrlrQrLr_rrrrr&sL	

'	

	




jN)�__all__Zfirewall.fw_typesrZ
firewall.corerrZfirewall.core.fw_transactionrZfirewall.core.loggerrZfirewallrZfirewall.errorsr	�objectrrrrr�<module>srich.cpython-36.opt-1.pyc000064400000050640151730727350011075 0ustar003

��g8��@s�dddddddddd	d
ddd
ddddgZddlmZddlmZddlmZddlmZddlm	Z	Gdd�de
�ZGdd�de
�ZGdd�de
�Z
Gdd�de
�ZGdd�de�ZGdd�de
�ZGdd�de
�ZGdd�de
�ZGd d�de
�ZGd!d	�d	e
�ZGd"d
�d
e
�ZGd#d�de
�ZGd$d�de
�ZGd%d
�d
e
�ZGd&d�de�ZGd'd�de
�Zd(d)d/d1d+�ZGd,d�de
�ZGd-d�de
�Zd.S)2�Rich_Source�Rich_Destination�Rich_Service�	Rich_Port�
Rich_Protocol�Rich_Masquerade�Rich_IcmpBlock�
Rich_IcmpType�Rich_SourcePort�Rich_ForwardPort�Rich_Log�
Rich_Audit�Rich_Accept�Rich_Reject�	Rich_Drop�	Rich_Mark�
Rich_Limit�	Rich_Rule�)�	functions)�check_ipset_name)�REJECT_TYPES)�errors)�
FirewallErrorc@seZdZddd�Zdd�ZdS)rFcCs�||_|jdkrd|_||_|jdks0|jdkr8d|_n|jdk	rN|jj�|_||_|jdkrdd|_||_|jdkr�|jdkr�|jdkr�ttjd��dS)N�zno address, mac and ipset)�addr�mac�upper�ipset�invertrr�INVALID_RULE)�selfrrrr�r!�/usr/lib/python3.6/rich.py�__init__$s


zRich_Source.__init__cCsjd|jrdnd}|jdk	r*|d|jS|jdk	rB|d|jS|jdk	rZ|d|jSttjd��dS)Nz	source%s z NOTrzaddress="%s"zmac="%s"z
ipset="%s"zno address, mac and ipset)rrrrrrr)r �retr!r!r"�__str__5s


zRich_Source.__str__N)F)�__name__�
__module__�__qualname__r#r%r!r!r!r"r#s
c@seZdZddd�Zdd�ZdS)rFcCsV||_|jdkrd|_||_|jdkr,d|_||_|jdkrR|jdkrRttjd��dS)Nrzno address and ipset)rrrrrr)r rrrr!r!r"r#Bs

zRich_Destination.__init__cCsRd|jrdnd}|jdk	r*|d|jS|jdk	rB|d|jSttjd��dS)Nzdestination%s z NOTrzaddress="%s"z
ipset="%s"zno address and ipset)rrrrrr)r r$r!r!r"r%Ns

zRich_Destination.__str__N)F)r&r'r(r#r%r!r!r!r"rAs
c@seZdZdd�Zdd�ZdS)rcCs
||_dS)N)�name)r r)r!r!r"r#YszRich_Service.__init__cCs
d|jS)Nzservice name="%s")r))r r!r!r"r%\szRich_Service.__str__N)r&r'r(r#r%r!r!r!r"rXsc@seZdZdd�Zdd�ZdS)rcCs||_||_dS)N)�port�protocol)r r*r+r!r!r"r#`szRich_Port.__init__cCsd|j|jfS)Nzport port="%s" protocol="%s")r*r+)r r!r!r"r%dszRich_Port.__str__N)r&r'r(r#r%r!r!r!r"r_sc@seZdZdd�ZdS)r	cCsd|j|jfS)Nz#source-port port="%s" protocol="%s")r*r+)r r!r!r"r%hszRich_SourcePort.__str__N)r&r'r(r%r!r!r!r"r	gsc@seZdZdd�Zdd�ZdS)rcCs
||_dS)N)�value)r r,r!r!r"r#mszRich_Protocol.__init__cCs
d|jS)Nzprotocol value="%s")r,)r r!r!r"r%pszRich_Protocol.__str__N)r&r'r(r#r%r!r!r!r"rlsc@seZdZdd�Zdd�ZdS)rcCsdS)Nr!)r r!r!r"r#tszRich_Masquerade.__init__cCsdS)N�
masquerader!)r r!r!r"r%wszRich_Masquerade.__str__N)r&r'r(r#r%r!r!r!r"rssc@seZdZdd�Zdd�ZdS)rcCs
||_dS)N)r))r r)r!r!r"r#{szRich_IcmpBlock.__init__cCs
d|jS)Nzicmp-block name="%s")r))r r!r!r"r%~szRich_IcmpBlock.__str__N)r&r'r(r#r%r!r!r!r"rzsc@seZdZdd�Zdd�ZdS)rcCs
||_dS)N)r))r r)r!r!r"r#�szRich_IcmpType.__init__cCs
d|jS)Nzicmp-type name="%s")r))r r!r!r"r%�szRich_IcmpType.__str__N)r&r'r(r#r%r!r!r!r"r�sc@seZdZdd�Zdd�ZdS)r
cCs<||_||_||_||_|jdkr(d|_|jdkr8d|_dS)Nr)r*r+�to_port�
to_address)r r*r+r.r/r!r!r"r#�s

zRich_ForwardPort.__init__cCs<d|j|j|jdkrd|jnd|jdkr4d|jndfS)Nz(forward-port port="%s" protocol="%s"%s%srz
 to-port="%s"z
 to-addr="%s")r*r+r.r/)r r!r!r"r%�szRich_ForwardPort.__str__N)r&r'r(r#r%r!r!r!r"r
�sc@seZdZddd�Zdd�ZdS)rNcCs||_||_||_dS)N)�prefix�level�limit)r r0r1r2r!r!r"r#�szRich_Log.__init__cCs>d|jrd|jnd|jr$d|jnd|jr6d|jndfS)Nz	log%s%s%sz prefix="%s"rz level="%s"z %s)r0r1r2)r r!r!r"r%�szRich_Log.__str__)NNN)r&r'r(r#r%r!r!r!r"r�s
c@seZdZddd�Zdd�ZdS)rNcCs
||_dS)N)r2)r r2r!r!r"r#�szRich_Audit.__init__cCsd|jrd|jndS)Nzaudit%sz %sr)r2)r r!r!r"r%�szRich_Audit.__str__)N)r&r'r(r#r%r!r!r!r"r�s
c@seZdZddd�Zdd�ZdS)r
NcCs
||_dS)N)r2)r r2r!r!r"r#�szRich_Accept.__init__cCsd|jrd|jndS)Nzaccept%sz %sr)r2)r r!r!r"r%�szRich_Accept.__str__)N)r&r'r(r#r%r!r!r!r"r
�s
c@s&eZdZddd�Zdd�Zdd�ZdS)	rNcCs||_||_dS)N)�typer2)r Z_typer2r!r!r"r#�szRich_Reject.__init__cCs,d|jrd|jnd|jr$d|jndfS)Nz
reject%s%sz
 type="%s"rz %s)r3r2)r r!r!r"r%�szRich_Reject.__str__cCsT|jrP|sttjd��|dkrP|jt|krPdjt|�}ttjd|j|f��dS)Nz9When using reject type you must specify also rule family.�ipv4�ipv6z, z%Wrong reject type %s.
Use one of: %s.)r4r5)r3rrrr�join)r �familyZvalid_typesr!r!r"�check�szRich_Reject.check)NN)r&r'r(r#r%r8r!r!r!r"r�s
c@seZdZdd�ZdS)rcCsd|jrd|jndS)Nzdrop%sz %sr)r2)r r!r!r"r%�szRich_Drop.__str__N)r&r'r(r%r!r!r!r"r�sc@s&eZdZddd�Zdd�Zdd�ZdS)	rNcCs||_||_dS)N)�setr2)r Z_setr2r!r!r"r#�szRich_Mark.__init__cCsd|j|jrd|jndfS)Nz
mark set=%s%sz %sr)r9r2)r r!r!r"r%�szRich_Mark.__str__cCs�|jdk	r|j}nttjd��d|krv|jd�}t|�dkrHttj|��tj|d�shtj|d�r�ttj|��ntj|�s�ttj|��dS)Nzno value set�/�r�)r9rrZINVALID_MARK�split�lenrZcheckUINT32)r �x�splitsr!r!r"r8�s


zRich_Mark.check)N)r&r'r(r#r%r8r!r!r!r"r�s
r<�<�)�s�m�h�dc@s�eZdZddd�Zdd�Zedd��Zejdd��Zed	d
��Zejdd
��Ze	dd
��Z
dd�Ze	dd��Zdd�Z
dd�ZdS)rNcCs||_||_dS)N)r,�burst)r r,rGr!r!r"r#�szRich_Limit.__init__cCs|j�|j�dS)N)�value_parse�burst_parse)r r!r!r"r8�szRich_Limit.checkcCs|jS)N)�_value)r r!r!r"r,�szRich_Limit.valuecCsf|dkrd|_dSy|j|�\}}Wntk
r<|}YnX|�d|��}t|dd�|krb||_dS)Nr:rJ)rJ�_value_parser�getattr)r r,�rate�duration�vr!r!r"r,�s
cCs|jS)N)�_burst)r r!r!r"rGszRich_Limit.burstcCs\|dkrd|_dSy|j|�}Wntk
r8|}Yn
Xt|�}t|dd�|krX||_dS)NrP)rP�_burst_parser�strrL)r rG�br!r!r"rGs
cCs�d}d|kr|jd�}|s(t|�dkr4ttj|��|\}}yt|�}Wnttj|��YnX|dkrv|dd�}|dks�|dkr�ttj|��dt||d
kr�ttjd|f��|dkr�|dkr�ttjd|f��||fS)Nr:r;�second�minute�hour�dayr<rCrDrErFi'rz%s too fastz%s too slow)rTrUrVrW)rCrDrErF)r=r>rr�
INVALID_LIMIT�int�DURATION_TO_MULT)r,r@rMrNr!r!r"rKs&
zRich_Limit._value_parsecCs|j|j�S)N)rKrJ)r r!r!r"rH:szRich_Limit.value_parsec	CsR|dkrdSyt|�}Wnttj|��YnX|dksB|dkrNttj|��|S)Nr<i���)rYrrrX)rGrSr!r!r"rQ=szRich_Limit._burst_parsecCs|j|j�S)N)rQrP)r r!r!r"rIKszRich_Limit.burst_parsecCs,d|j�d�}|jdk	r(|d|j��7}|S)Nz
limit value="�"z burst=)rJrP)r rCr!r!r"r%Ns
zRich_Limit.__str__)N)r&r'r(r#r8�propertyr,�setterrG�staticmethodrKrHrQrIr%r!r!r!r"r�s
c@s>eZdZdZdZddd�Zdd�Zd	d
�Zdd�Zd
d�Z	dS)ri�i�NrcCsV|dk	rt|�|_nd|_||_d|_d|_d|_d|_d|_d|_|rR|j	|�dS)N)
rRr7�priority�source�destination�element�log�audit�action�_import_from_string)r r7�rule_strr_r!r!r"r#XszRich_Rule.__init__cCs�g}x|tj|�D]n}d|krp|jd�}t|�dksF|dsF|drVttjd|��|j|d|dd��q|jd|i�qW|jddi�|S)	z Lexical analysis �=r;rr<zinternal error in _lexer(): %s)�	attr_name�
attr_valuerb�EOL)rZ	splitArgsr=r>rrr�append)r rg�tokens�r�attrr!r!r"�_lexeris
 
zRich_Rule._lexercCs�|sttjd��tj|�}d|_d|_d|_d|_d|_	d|_
d|_d|_|j
|�}|rv|djd�dkrvttjd��i}g}d}�x`||jd�dko�|dgk�s�||jd�}||jd�}||jd�}|�r�|dHk�r�ttjd|���n�|dIk�r�|dk�r|j�rttjd+��n�|dk�r<|j�r<ttjd,��n�|dJk�rf|j	�rfttjd-||j	f��nh|d"k�r�|j
�r�ttjd.��nH|d#k�r�|j�r�ttjd/��n(|dKk�r�|j�r�ttjd0||jf��nttjd1|��t|�dk�r�|t|�d2nd3}	|	d3k�r�|�r`|�r`|d	k�r2ttjd4��n,|dk�rJttjd5��nttjd6||f��n*d|k�r�ttjd7||f��n
|jd��nL|	dk�rD|d	k�r�|dLk�r�ttjd:|��||_n||dk�ryt|�|_Wn&tk
�rttjd;|��YnXn:|�r6|dk�rd<}
nd=||f}
ttj|
��n
|j|��n�|	dk�r�|dMk�rb|||<nV|dNk�rvd>|d
<nBt|jd
�|jd�|jd�|jd
d?��|_|j�|j�|d2}�n|	dk�r,|dOk�r�|||<nN|dPk�r�d>|d
<n:t|jd
�|jd�|jd
d?��|_|j�|j�|d2}�n�|	dk�rd|dk�rTt|�|_	|j�nttjd@���nv|	dk�r�|dk�r�t|�|_	|j�nttjdA���n>|	dk�r�|dQk�r�|||<n0t|jd�|jd��|_	|j�|j�|d2}�n�|	dk�r&|dk�rt|�|_	|j�nttjdB���n�|	dk�r^|dk�rNt|�|_	|j�nttjdC���n||	dk�r�t�|_	|j�|j�|d2}�nN|	d k�r�|dRk�r�|||<n@t|jd�|jd�|jd�|jd��|_	|j�|j�|d2}�n�|	d!k�r@|dSk�r|||<n0t|jd�|jd��|_	|j�|j�|d2}�n�|	d"k�r�|dTk�r^|||<nN|d(k�rt|jd(�n8t |jd�|jd�|jd(��|_
|j�|j�|d2}�n*|	d#k�r�|d(k�r�|jd(�n(t!|jd(��|_|j�|j�|d2}�n�|	d$k�rH|d(k�r|jd(�n(t"|jd(��|_|j�|j�|d2}�n�|	d%k�r�|d(k�rh|jd(�n(t#|jd(��|_|j�|j�|d2}�nF|	d&k�r�|dk�r�|||<nF|d(k�r�|jd(�n0t$|jd�|jd(��|_|j�|j�|d2}n�|	d'k�r`|dk�r|||<nF|d(k�r.|jd(�n0t%|jd�|jd(��|_|j�|j�|d2}nz|	d(k�r�|dUk�r�||dD|��<nVdE|k�r�ttjdF��t&|dE|jdG��|d(<|jdEd�|jdGd�|j�|d2}|d2}q�W|j'�dS)VNz
empty rulerrbrk�rulerirjr_r7�addressrrrr,r*r+�to-port�to-addrr)r0r1r3r9rGzbad attribute '%s'r`ra�service�
icmp-block�	icmp-typer-�forward-port�source-portrcrd�accept�drop�reject�markr2�not�NOTzmore than one 'source' elementz#more than one 'destination' elementzFmore than one element. There cannot be both '%s' and '%s' in one rule.zmore than one 'log' elementzmore than one 'audit' elementzOmore than one 'action' element. There cannot be both '%s' and '%s' in one rule.zunknown element %sr<rz0'family' outside of rule. Use 'rule family=...'.z4'priority' outside of rule. Use 'rule priority=...'.z:'%s' outside of any element. Use 'rule <element> %s= ...'.z,'%s' outside of rule. Use 'rule ... %s ...'.r4r5zH'family' attribute cannot have '%s' value. Use 'ipv4' or 'ipv6' instead.z(invalid 'priority' attribute value '%s'.zdwrong 'protocol' usage. Use either 'rule protocol value=...' or  'rule [forward-]port protocol=...'.zDattribute '%s' outside of any element. Use 'rule <element> %s= ...'.TFzinvalid 'protocol' elementzinvalid 'service' elementzinvalid 'icmp-block' elementzinvalid 'icmp-type' elementzlimit.zlimit.valuezinvalid 'limit' elementzlimit.burst)r_r7rrrrrr,r*r+rsrtr)r0r1r3r9rG)rqr`rar+rur*rvrwr-rxryrcrdrzr{r|r}r2r~rrk)r+rur*rvrwr-rxry)rzr{r|r})r4r5)rrrrr)r~r)rrrr)r~r)r*r+)r*r+rsrt)r*r+)r0r1)r,rG)(rrrrZstripNonPrintableCharactersr_r7r`rarbrcrdrerp�getr>rlrY�
ValueError�INVALID_PRIORITYr�pop�clearrrrrrrrr
r	rrr
rrrrr8)r rgrmZattrsZin_elements�indexrbrirjZ
in_elementZerr_msgr!r!r"rfzs�

""













*




"






















(






 




















zRich_Rule._import_from_stringc	Cs`|jdk	r"|jd kr"ttj|j��|jdkrn|jdk	rB|jjdk	sL|jdk	rVttj��t|j	�t
krnttj��|j|jks�|j|j
kr�ttjd|j|j
f��|j	dko�|jdks�|jdk	o�|jdk�r
|jdkr�ttjd��|jdko�|jdko�|jdk�r
ttjd��t|j	�tt
tgk�rP|jdk�rP|jdk�rP|jdk�rPttjd��|jdk	�rj|jjdk	�r�|jdk�r�ttj��|jjdk	�r�ttjd��|jjdk	�r�ttjd	��tj|j|jj��sjttjt|jj���n�|jjdk	�r,|jjdk	�rttjd
��tj|jj��sjttjt|jj���n>|jjdk	�r^t|jj��sjttjt|jj���nttjd��|jdk	�r|jjdk	�r�|jdk�r�ttj��|jjdk	�r�ttjd	��tj|j|jj��sttjt|jj���n>|jjdk	�rt|jj��sttjt|jj���nttjd��t|j	�t k�rd|j	j!dk�sLt"|j	j!�d
k�r`ttj#t|j	j!����n�t|j	�t$k�r�tj%|j	j&��s�ttj'|j	j&��|j	j(d!k�r`ttj)|j	j(���n�t|j	�t*k�r�tj+|j	j,��s`ttj)|j	j,���nvt|j	�tk�r<|jdk	�rttjd��|jdk	�r`|jjdk	�r`ttjd���n$t|j	�tk�r�|j	j!dk�slt"|j	j!�d
k�r�ttj-t|j	j!���|j�r`ttjd���n�t|j	�t.k�r�|j	j!dk�s�t"|j	j!�d
k�r`ttj-t|j	j!����n�t|j	�t
k�r�tj%|j	j&��sttj'|j	j&��|j	j(d"k�r.ttj)|j	j(��|j	j/dk�rZ|j	j0dk�rZttj'|j	j/��|j	j/dk�r�tj%|j	j/��r�ttj'|j	j/��|j	j0dk�r�tj1|j|j	j0��r�ttj|j	j0��|jdk�r�ttj��|jdk	�r`ttjd��nrt|j	�t2k�r>tj%|j	j&��sttj'|j	j&��|j	j(d#k�r`ttj)|j	j(��n"|j	dk	�r`ttjdt|j	���|jdk	�r�|jj3�r�|jj3d$k�r�ttj4|jj3��|jj5dk	�r�|jj5j6�|jdk	�r�t|j�t7t8t9gk�r�ttj:t|j���|jj5dk	�r�|jj5j6�|jdk	�r\t|j�t8k�r(|jj6|j�nt|j�t;k�rB|jj6�|jj5dk	�r\|jj5j6�dS)%Nr4r5z/'priority' attribute must be between %d and %d.rzno element, no actionz%no element, no source, no destinationzno action, no log, no auditzaddress and maczaddress and ipsetz
mac and ipsetzinvalid sourcezinvalid destinationr<�tcp�udp�sctp�dccpzmasquerade and actionzmasquerade and mac sourcezicmp-block and actionrzforward-port and actionzUnknown element %s�emerg�alert�crit�error�warning�notice�info�debug)r4r5)r�r�r�r�)r�r�r�r�)r�r�r�r�)r�r�r�r�r�r�r�r�)<r7rrZINVALID_FAMILYr`rraZMISSING_FAMILYr3rbr
r_�priority_min�priority_maxr�rcrerrrrdrrrZ
check_addressZINVALID_ADDRrRZ	check_macZINVALID_MACrZ
INVALID_IPSETZINVALID_DESTINATIONrr)r>ZINVALID_SERVICErZ
check_portr*ZINVALID_PORTr+ZINVALID_PROTOCOLrZ
checkProtocolr,ZINVALID_ICMPTYPErr.r/Zcheck_single_addressr	r1ZINVALID_LOG_LEVELr2r8r
rrZINVALID_AUDIT_TYPEr)r r!r!r"r8hs�




 
 



   


zRich_Rule.checkcCs�d}|jr|d|j7}|jr,|d|j7}|jr@|d|j7}|jrT|d|j7}|jrh|d|j7}|jr||d|j7}|jr�|d|j7}|jr�|d|j7}tj	r�tj
|�S|S)Nrqz priority="%d"z family="%s"z %s)r_r7r`rarbrcrdrerZPY2Zu2b)r r$r!r!r"r%s$zRich_Rule.__str__i���)NNr)
r&r'r(r�r�r#rprfr8r%r!r!r!r"rTs
o-Nii�i�Q)�__all__ZfirewallrZfirewall.core.ipsetrZfirewall.core.baserrZfirewall.errorsr�objectrrrrr	rrrrr
rrr
rrrrZrrr!r!r!r"�<module>s@
dmodules.cpython-36.pyc000064400000005500151730727350010654 0ustar003

��g��@sBdZdgZddlmZddlmZddlmZGdd�de�Z	dS)zmodules backend�modules�)�runProg)�log)�COMMANDSc@sLeZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dS)rcCstd|_td|_dS)NZmodprobeZrmmod)r�
_load_command�_unload_command)�self�r	�/usr/lib/python3.6/modules.py�__init__s
zmodules.__init__cCs
d|jS)Nz%s)�	__class__)rr	r	r
�__repr__$szmodules.__repr__cCs�g}i}y�tdd��p}xh|D]`}|s&P|j�}|j�}|j|d�|ddkrp|djd�dd	�||d<qg||d<qWWdQRXWntk
r�YnX||fS)
z6 get all loaded kernel modules and their dependencies z
/proc/modules�rr��-�,N����)�open�strip�split�append�FileNotFoundError)r�mods�deps�f�lineZsplitsr	r	r
�loaded_modules's 
 zmodules.loaded_modulescCs"tjd|j|j|�t|j|g�S)Nz	%s: %s %s)r�debug2rrr)r�moduler	r	r
�load_module<szmodules.load_modulecCs"tjd|j|j|�t|j|g�S)Nz	%s: %s %s)rrrrr)rrr	r	r
�
unload_module@szmodules.unload_modulecCsT||krdSx0||D]$}|j|||�||kr|j|�qW||krP|j|�dS)z  get all dependants of a module N)�get_depsr)rrr�ret�modr	r	r
r"Dszmodules.get_depscCs�g}|j�\}}|jd||�x*dD]"}||kr$|j|�|jd|�q$Wx^|D]V}|dks�|jd�s�|jd	�s�|jd
�s�|jd�s�|jd�s�|jd
�rP|j|||�qPW|S)z) get all loaded firewall-related modules Znf_conntrack�nf_conntrack_ipv4�nf_conntrack_ipv6r�	ip_tables�
ip6_tables�ebtablesZiptable_Z	ip6table_Znf_Zxt_Zipt_Zip6t_)r%r&r)r'r(r))rr"�remove�insert�
startswith)rrZmods2rZbad_bad_moduler$r	r	r
�get_firewall_modulesOs


zmodules.get_firewall_modulescCs>x8|j�D],}|j|�\}}|dkr
tjd||f�q
WdS)z% unload all firewall-related modules rz Failed to unload module '%s': %sN)r-r!rZdebug1)rrZstatusr#r	r	r
�unload_firewall_modulesdszmodules.unload_firewall_modulesN)�__name__�
__module__�__qualname__rr
rr r!r"r-r.r	r	r	r
rsN)
�__doc__�__all__Zfirewall.core.progrZfirewall.core.loggerrZfirewall.configr�objectrr	r	r	r
�<module>s
fw_transaction.cpython-36.opt-1.pyc000064400000011650151730727350013167 0ustar003

��g��@sJdZdgZddlZddlmZddlmZddlmZGdd�de	�Z
dS)z!Transaction classes for firewalld�FirewallTransaction�N)�log)�errors)�
FirewallErrorc@s�eZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zdd �Zd!d"�Zd#S)$rcCs(||_i|_g|_g|_g|_g|_dS)N)�fw�rules�	pre_funcs�
post_funcs�
fail_funcs�modules)�selfr�r
�$/usr/lib/python3.6/fw_transaction.py�__init__!szFirewallTransaction.__init__cCs2|jj�|jdd�=|jdd�=|jdd�=dS)N)r�clearrr	r
)rr
r
rr)s
zFirewallTransaction.clearcCs|jj|jg�j|�dS)N)r�
setdefault�name�append)r�backend�ruler
r
r�add_rule/szFirewallTransaction.add_rulecCsx|D]}|j||�qWdS)N)r)rrrrr
r
r�	add_rules2s
zFirewallTransaction.add_rulescCs|j|jko||j|jkS)N)rr)rrrr
r
r�
query_rule6szFirewallTransaction.query_rulecCs2|j|jkr.||j|jkr.|j|jj|�dS)N)rr�remove)rrrr
r
r�remove_rule9szFirewallTransaction.remove_rulecGs|jj||f�dS)N)rr)r�func�argsr
r
r�add_pre=szFirewallTransaction.add_precGs|jj||f�dS)N)r	r)rrrr
r
r�add_post@szFirewallTransaction.add_postcGs|jj||f�dS)N)r
r)rrrr
r
r�add_failCszFirewallTransaction.add_failcCs||jkr|jj|�dS)N)rr)r�moduler
r
r�
add_moduleFs
zFirewallTransaction.add_modulecCs||jkr|jj|�dS)N)rr)rr r
r
r�
remove_moduleJs
z!FirewallTransaction.remove_modulecCsx|D]}|j|�qWdS)N)r!)rrr r
r
r�add_modulesNs
zFirewallTransaction.add_modulescCsx|D]}|j|�qWdS)N)r")rrr r
r
r�remove_modulesRs
z"FirewallTransaction.remove_modulescCs�tjdt|�|df�i}|sjxp|jD]<}x6t|j|�D]$}|j|g�j|jj|�j	|��q<Wq(Wn(x&|jD]}|j|g�j
|j|�qrW||jfS)Nz%s.prepare(%s, %s)z...)r�debug4�typer�reversedrrr�get_backend_by_name�reverse_rule�extendr)r�enabler�backend_namerr
r
r�prepareVszFirewallTransaction.preparecCstjdt|�|f�|j|�\}}|j�d}d}g}xp|D]h}y|jj|||�WnBtk
r�}z&d}|}tjt	j
��tj|�WYdd}~Xq>X|j|�q>W|s�|jj
||�}	|	r�|	\}
}|
r�tj|�|�ri}xH|D]@}g||<x2t||�D]"}||j|jj|�j|���qWq�Wxb|D]Z}y|jj|||�Wn<tk
�r�}ztjt	j
��tj|�WYdd}~XnX�q0Wxh|jD]^\}
}y|
|�WnFtk
�r�}z(tjt	j
��tjd|
||f�WYdd}~XnX�q�Wttj|��|j�dS)Nz%s.execute(%s)F�Tz#Calling fail func %s(%s) failed: %s)rr%r&r-�prerr�	Exception�debug1�	traceback�
format_exc�errorrZhandle_modulesr'r(r)r
rrZCOMMAND_FAILED�post)rr+rrr4ZerrorMsg�doner,�msgZ
module_returnZstatusZ
undo_rulesrrrr
r
r�executefsV



"&zFirewallTransaction.executecCs|tjdt|��xd|jD]Z\}}y||�Wqtk
rr}z(tjtj��tjd|||f�WYdd}~XqXqWdS)Nz%s.pre()z"Calling pre func %s(%s) failed: %s)	rr%r&rr0r1r2r3r4)rrrr7r
r
rr/�szFirewallTransaction.precCs|tjdt|��xd|jD]Z\}}y||�Wqtk
rr}z(tjtj��tjd|||f�WYdd}~XqXqWdS)Nz	%s.post()z#Calling post func %s(%s) failed: %s)	rr%r&r	r0r1r2r3r4)rrrr7r
r
rr5�szFirewallTransaction.postN)�__name__�
__module__�__qualname__rrrrrrrrrr!r"r#r$r-r8r/r5r
r
r
rr s"@)�__doc__�__all__r2Zfirewall.core.loggerrZfirewallrZfirewall.errorsr�objectrr
r
r
r�<module>sfw_transaction.cpython-36.pyc000064400000011650151730727350012230 0ustar003

��g��@sJdZdgZddlZddlmZddlmZddlmZGdd�de	�Z
dS)z!Transaction classes for firewalld�FirewallTransaction�N)�log)�errors)�
FirewallErrorc@s�eZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zdd �Zd!d"�Zd#S)$rcCs(||_i|_g|_g|_g|_g|_dS)N)�fw�rules�	pre_funcs�
post_funcs�
fail_funcs�modules)�selfr�r
�$/usr/lib/python3.6/fw_transaction.py�__init__!szFirewallTransaction.__init__cCs2|jj�|jdd�=|jdd�=|jdd�=dS)N)r�clearrr	r
)rr
r
rr)s
zFirewallTransaction.clearcCs|jj|jg�j|�dS)N)r�
setdefault�name�append)r�backend�ruler
r
r�add_rule/szFirewallTransaction.add_rulecCsx|D]}|j||�qWdS)N)r)rrrrr
r
r�	add_rules2s
zFirewallTransaction.add_rulescCs|j|jko||j|jkS)N)rr)rrrr
r
r�
query_rule6szFirewallTransaction.query_rulecCs2|j|jkr.||j|jkr.|j|jj|�dS)N)rr�remove)rrrr
r
r�remove_rule9szFirewallTransaction.remove_rulecGs|jj||f�dS)N)rr)r�func�argsr
r
r�add_pre=szFirewallTransaction.add_precGs|jj||f�dS)N)r	r)rrrr
r
r�add_post@szFirewallTransaction.add_postcGs|jj||f�dS)N)r
r)rrrr
r
r�add_failCszFirewallTransaction.add_failcCs||jkr|jj|�dS)N)rr)r�moduler
r
r�
add_moduleFs
zFirewallTransaction.add_modulecCs||jkr|jj|�dS)N)rr)rr r
r
r�
remove_moduleJs
z!FirewallTransaction.remove_modulecCsx|D]}|j|�qWdS)N)r!)rrr r
r
r�add_modulesNs
zFirewallTransaction.add_modulescCsx|D]}|j|�qWdS)N)r")rrr r
r
r�remove_modulesRs
z"FirewallTransaction.remove_modulescCs�tjdt|�|df�i}|sjxp|jD]<}x6t|j|�D]$}|j|g�j|jj|�j	|��q<Wq(Wn(x&|jD]}|j|g�j
|j|�qrW||jfS)Nz%s.prepare(%s, %s)z...)r�debug4�typer�reversedrrr�get_backend_by_name�reverse_rule�extendr)r�enabler�backend_namerr
r
r�prepareVszFirewallTransaction.preparecCstjdt|�|f�|j|�\}}|j�d}d}g}xp|D]h}y|jj|||�WnBtk
r�}z&d}|}tjt	j
��tj|�WYdd}~Xq>X|j|�q>W|s�|jj
||�}	|	r�|	\}
}|
r�tj|�|�ri}xH|D]@}g||<x2t||�D]"}||j|jj|�j|���qWq�Wxb|D]Z}y|jj|||�Wn<tk
�r�}ztjt	j
��tj|�WYdd}~XnX�q0Wxh|jD]^\}
}y|
|�WnFtk
�r�}z(tjt	j
��tjd|
||f�WYdd}~XnX�q�Wttj|��|j�dS)Nz%s.execute(%s)F�Tz#Calling fail func %s(%s) failed: %s)rr%r&r-�prerr�	Exception�debug1�	traceback�
format_exc�errorrZhandle_modulesr'r(r)r
rrZCOMMAND_FAILED�post)rr+rrr4ZerrorMsg�doner,�msgZ
module_returnZstatusZ
undo_rulesrrrr
r
r�executefsV



"&zFirewallTransaction.executecCs|tjdt|��xd|jD]Z\}}y||�Wqtk
rr}z(tjtj��tjd|||f�WYdd}~XqXqWdS)Nz%s.pre()z"Calling pre func %s(%s) failed: %s)	rr%r&rr0r1r2r3r4)rrrr7r
r
rr/�szFirewallTransaction.precCs|tjdt|��xd|jD]Z\}}y||�Wqtk
rr}z(tjtj��tjd|||f�WYdd}~XqXqWdS)Nz	%s.post()z#Calling post func %s(%s) failed: %s)	rr%r&r	r0r1r2r3r4)rrrr7r
r
rr5�szFirewallTransaction.postN)�__name__�
__module__�__qualname__rrrrrrrrrr!r"r#r$r-r8r/r5r
r
r
rr s"@)�__doc__�__all__r2Zfirewall.core.loggerrZfirewallrZfirewall.errorsr�objectrr
r
r
r�<module>snftables.cpython-36.opt-1.pyc000064400000130376151730727350011753 0ustar003

��g��%@slddlmZddlZddlZddlZddlmZddlmZm	Z	m
Z
mZmZddl
mZmZmZmZmZmZmZddlmZmZmZmZmZmZmZddlmZdZed	d
Z dZ!dZ"id
ddCe"fiddDe"fdde"fd�dde"fdde"fdde"fdde"fd�d�Z#dEdd�Z$e$ddd�e$dd�e$dd�e$dd�e$ddd�e$ddd �e$ddd�e$dd!d"�e$ddd#�e$ddd"�e$dd$d"�e$ddd%�e$dd!d�e$ddd&�e$ddd�e$dd$�e$ddd'�e$ddd(�e$ddd)�e$dd!�e$dd$d"�e$dd*�e$dd+�e$dd,�e$ddd-�e$dd.�e$dd/�e$dd0�e$dd!d'�e$ddd1�e$dd!d)�e$ddd2�e$dd.d"�e$dd.d�d3�"e$d4dd'�e$d4d$d�e$d4dd)�e$d4dd"�e$d4d�e$d4d�e$d4d�e$d4dd-�e$d4d5�e$d4d6�e$d4d7�e$d4d8�e$d4d9�e$d4d:�e$d4dd�e$d4d;�e$d4d$�e$d4dd�e$d4d<�e$d4dd&�e$d4d=�e$d4d>�e$d4d.�e$d4d.d"�e$d4d.d�e$d4d$d"�e$d4d$d)�d?�d@�Z%GdAdB�dBe&�Z'dS)F�)�absolute_importN)�log)�	check_mac�getPortRange�normalizeIP6�check_single_address�
check_address)�
FirewallError�
UNKNOWN_ERROR�INVALID_RULE�INVALID_ICMPTYPE�INVALID_TYPE�
INVALID_ENTRY�INVALID_PORT)�Rich_Accept�Rich_Reject�	Rich_Drop�	Rich_Mark�Rich_Masquerade�Rich_ForwardPort�Rich_IcmpBlock)�NftablesZ	firewalld�_Zpolicy_dropZpolicy_�
�
PREROUTING�
prerouting��dZpostrouting)r�POSTROUTING�input�forward�output)r�INPUT�FORWARD�OUTPUT)�raw�mangle�nat�filtercCsHdd|dd�id|d�ig}|dk	rD|jdd|dd�id|d�i�|S)N�match�payload�type)�protocol�fieldz==)�left�op�right�code)�append)r,r+r1�	fragments�r4�/usr/lib/python3.6/nftables.py�_icmp_types_fragmentsSsr6�icmpzdestination-unreachable�
z
echo-replyzecho-request���redirect��zparameter-problem�����zrouter-advertisementzrouter-solicitationz
source-quench�z
time-exceededztimestamp-replyztimestamp-request��)"zcommunication-prohibitedzdestination-unreachablez
echo-replyzecho-requestzfragmentation-neededzhost-precedence-violationzhost-prohibitedz
host-redirectzhost-unknownzhost-unreachablez
ip-header-badznetwork-prohibitedznetwork-redirectznetwork-unknownznetwork-unreachablezparameter-problemzport-unreachablezprecedence-cutoffzprotocol-unreachabler;zrequired-option-missingzrouter-advertisementzrouter-solicitationz
source-quenchzsource-route-failedz
time-exceededztimestamp-replyztimestamp-requestztos-host-redirectztos-host-unreachableztos-network-redirectztos-network-unreachablezttl-zero-during-reassemblyzttl-zero-during-transit�icmpv6zmld-listener-donezmld-listener-queryzmld-listener-reportzmld2-listener-reportznd-neighbor-advertznd-neighbor-solicitzpacket-too-bigznd-redirectznd-router-advertznd-router-solicit)zaddress-unreachablez
bad-headerzbeyond-scopezcommunication-prohibitedzdestination-unreachablez
echo-replyzecho-requestz
failed-policyzmld-listener-donezmld-listener-queryzmld-listener-reportzmld2-listener-reportzneighbour-advertisementzneighbour-solicitationzno-routezpacket-too-bigzparameter-problemzport-unreachabler;zreject-routezrouter-advertisementzrouter-solicitationz
time-exceededzttl-zero-during-reassemblyzttl-zero-during-transitzunknown-header-typezunknown-option)�ipv4�ipv6c@s`eZdZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Z	dd
�Z
dd�Zd�dd�Zdd�Z
dd�Zdd�Zdd�Zd�dd�Zdd�Zd�d d!�Zd"d#�Zd�d%d&�Zd�d(d)�Zd�d*d+�Zd�d,d-�Zd.d/�Zd0d1�Zd2d3�Zd4d5�Zd6d7�Zd8d9�Zd:d;�Zd<d=�Z d>d?�Z!d@dA�Z"dBdC�Z#dDdE�Z$dFdG�Z%dHdI�Z&d�dJdK�Z'dLdM�Z(dNdO�Z)dPdQ�Z*dRdS�Z+d�dTdU�Z,d�dVdW�Z-d�dXdY�Z.dZd[�Z/d�d\d]�Z0d�d^d_�Z1d�d`da�Z2d�dbdc�Z3d�ddde�Z4dfdg�Z5d�dhdi�Z6djdk�Z7d�dldm�Z8dndo�Z9dpdq�Z:drds�Z;dtdu�Z<d�dvdw�Z=d�dxdy�Z>dzd{�Z?d�d|d}�Z@d~d�ZAd�d��ZBd�d��ZCd�d��ZDd�d��ZEd�d��ZFd�d��ZGd�d�d��ZHdS)��nftablesTcCsb||_d|_g|_i|_i|_i|_i|_i|_gggd�|_t	�|_
|j
jd�|j
jd�dS)NT)�inet�ip�ip6)
�_fwZrestore_command_existsZavailable_tables�rule_to_handle�rule_ref_count�rich_rule_priority_counts�policy_priority_counts�zone_source_index_cache�created_tablesrrIZset_echo_outputZset_handle_output)�self�fwr4r4r5�__init__�sznftables.__init__cCs�xdD]}||krPqWd||dkr`||ddd||dddf}||dd=n(d||dkr�d}||dd=ndS||dd	}|r�|dkr�||kr�|||kr�||j|�n�|dk�r�||kr�g||<|�r(|||k�r||j|�||jd
d�d�||j|�}n|jj�r8d
}nt||�}||}||=|d
k�rf||d<n |d8}||d<||ddd<dS)N�add�insert�deletez%%ZONE_SOURCE%%�rule�zone�addressz%%ZONE_INTERFACE%%�familycSs|dS)Nrr4)�xr4r4r5�<lambda>�sz3nftables._run_replace_zone_source.<locals>.<lambda>)�keyrr<�index)rWrXrY)�remover2�sortrarM�_allow_zone_drifting�len)rTrZrR�verbZzone_sourcer]ra�
_verb_snippetr4r4r5�_run_replace_zone_source�sD




z!nftables._run_replace_zone_sourcecCsBd|krdtj|d�iSd|kr4dtj|d�iSttd��dS)NrXrYrWzFailed to reverse rule)�copy�deepcopyr	r
)rT�dictr4r4r5�reverse_rule�s
znftables.reverse_rulec
Cs�xdD]}||krPqW|||dk�r�||d|}||d|=t|�tkr^ttd��||dd||ddf}|dkr�||ks�|||ks�|||dkr�ttd	��|||d
8<n�||kr�i||<|||kr�d|||<d}xVt||j��D]B}||k�r"|dk�r"P||||7}||k�r|dk�rP�qW|||d
7<||}	||=|dk�r�|	|d<n |d
8}|	|d<||ddd<dS)
NrWrXrYrZz%priority must be followed by a numberr]�chainrz*nonexistent or underflow of priority countr<ra)rWrXrY)r+�intr	rr
�sorted�keys)
rTrZZpriority_counts�tokenrf�priorityrmra�prgr4r4r5�_set_rule_replace_priority�sD

 


z#nftables._set_rule_replace_prioritycCsfx`d
D]X}||krd||krtj||d�}xdD]}||kr6||=q6Wtj|dd	�}|SqWdS)NrWrXrYrZra�handle�positionT)Z	sort_keys)rWrXrY)rarurv)rirj�json�dumps)rTrZrf�rule_keyZnon_keyr4r4r5�
_get_rule_keys


znftables._get_rule_keycCsLdddddg}dddg}g}g}tj|j�}tj|j�}tj|j�}	|jj�}
�x�|D�]�}t|�tkrvtt	d|��x|D]}||kr|Pq|W||kr�tt
d|��|j|�}
|
|
k�rDtj
d|j|
|
|
�|dkr�|
|
d	7<qVnX|
|
d	k�r|
|
d	8<qVn6|
|
d	k�r,|
|
d	8<ntt	d
|
|
|
f��n|
�r\|dk�r\d	|
|
<|j|�tj|�}|
�rttd||dd��||dd<|j||d
�|j||d�|j||	�|dk�rdd|ddd|ddd|ddd|j|
d�ii}|j|�qVWdddd	iig|i}tj�dk�rVtjd|jtj|��|jj|�\}}}|dk�r�tdd|tj|�f��||_||_|	|_|
|_d}x�|D]�}|d	7}|j|�}
|
�s̐q�d|k�r�|j|
=|j|
=�q�x"|D]}||d|k�r�P�q�W||d|k�r$�q�|d||dd|j|
<�q�WdS)NrWrXrY�flush�replacez#rule must be a dictionary, rule: %szno valid verb found, rule: %sz%s: prev rule ref cnt %d, %sr<z)rule ref count bug: rule_key '%s', cnt %drZ�exprz%%RICH_RULE_PRIORITY%%z%%POLICY_PRIORITY%%r]�tablerm)r]r~rmrurIZmetainfoZjson_schema_versionr@z.%s: calling python-nftables with JSON blob: %srz'%s' failed: %s
JSON blob:
%szpython-nftablesru)rirjrPrQrRrOr+rkr	r
rrzrZdebug2�	__class__r2�listr(rtrhrNZgetDebugLogLevelZdebug3rwrxrIZjson_cmd�
ValueError)rT�rules�
log_deniedZ_valid_verbsZ_valid_add_verbsZ_deduplicated_rulesZ_executed_rulesrPrQrRrOrZrfryZ_ruleZ	json_blobZrcr!�errorrar4r4r5�	set_rules+s�







&






znftables.set_rulescCs|j|g|�dS)N�)r�)rTrZr�r4r4r5�set_rule�sznftables.set_ruleNcCs|r
|gStj�S)N)�IPTABLES_TO_NFT_HOOKrp)rTr~r4r4r5�get_available_tables�sznftables.get_available_tablescCsFg}x<dD]4}|jdd||d�ii�|jdd||d�ii�q
W|S)	NrJrKrLrWr~)r]�namerY)rJrKrL)r2)rTr~r�r]r4r4r5�_build_delete_table_rules�s


z"nftables._build_delete_table_rulescCs�i}i}xB|jd�D]4}|j|�}||jkr|j|||<|j|||<qW||_||_i|_i|_i|_x*dD]"}t|j|krp|j|j	t�qpW|j
t�S)NTrJrKrL)rJrKrL)� _build_set_policy_rules_ct_rulesrzrNrOrPrQrR�
TABLE_NAMErSrbr�)rTZsaved_rule_to_handleZsaved_rule_ref_countrZ�
policy_keyr]r4r4r5�build_flush_rules�s 


znftables.build_flush_rulesc
Cslddd�|}g}xTdD]L}|j|ddtd	d
|fddd
diiddddgid�iddigd�ii�qW|S)NrWrY)TFrr r!rZrJz%s_%sr(r)�ctr`�state�in�set�established�related)r.r/r0�accept)r]r~rmr})rr r!)r2�TABLE_NAME_POLICY)rT�enable�add_delr��hookr4r4r5r��s


z)nftables._build_set_policy_rules_ct_rulescCstg}|dkrt|jdddtd�ii�|jdjt�x>dD]6}|jdddtd	d
|fd|dtd
dd�ii�q:W|dk�r�|jdddtd�ii�|jdjt�x>dD]6}|jdddtd	d|fd|dtd
dd�ii�q�W||jd�7}nz|dk�rfx4|jd�D]&}|j|�}||jk�r|j|��qW||jt�7}t|jdk�rp|jdjt�n
t	t
d�|S)NZPANICrWr~rJ)r]r�rr!rmz%s_%sr%r(i,r<�drop)r]r~r�r+r��prio�policy�DROPrr rT�ACCEPTFznot implemented)rr!i���)rr r!)r2r�rS�NFT_HOOK_OFFSETr�rzrNr�rbr	r
)rTr�r�r�rZr�r4r4r5�build_set_policy_rules�sH













znftables.build_set_policy_rulescCs<t�}x,|r|gntj�D]}|jt|j��qWt|�S)N)r��ICMP_TYPES_FRAGMENTSrp�updater�)rT�ipvZ	supportedZ_ipvr4r4r5�supported_icmp_types�sznftables.supported_icmp_typescCs>g}x4dD],}|jdd|td�ii�|j|jt�q
W|S)NrJrKrLrWr~)r]r�)rJrKrL)r2r�rS)rTZdefault_tablesr]r4r4r5�build_default_tabless

znftables.build_default_tables�offcCs�g}x�tdj�D]�}|jdddtd|ddtd|dtd|d	d
�ii�xz|jjrlddd
dgndd
dgD]X}|jdddtd||fd�ii�|jdddtd|ddd||fiigd�ii�qvWqWx�d?D]�}x�tdj�D]�}|jdd|td|ddtd|dtd|d	d
�ii�x~|jj�rJddd
dgndd
dgD]Z}|jdd|td||fd�ii�|jdd|td|ddd||fiigd�ii��qTWq�Wq�WxVtdj�D]F}|jdddtd|ddtd|dtd|d	d
�ii��q�W|jdddtddddddiid d!d"d#gid$�id%digd�ii�|jdddtdddddd&iid d'd$�id%digd�ii�|jdddtdddd(dd)iid*d+d$�id%digd�ii�x~|jj�r�ddd
dgndd
dgD]Z}|jdddtd,d|fd�ii�|jdddtddddd,d|fiigd�ii��q�W|d-k�r�|jdddtddddddiid d!d.gid$�i|j|�d/d0d1iigd�ii�|jdddtddddddiid d!d.gid$�id2digd�ii�|d-k�r$|jdddtdd|j|�d/d0d3iigd�ii�|jdddtddd4d5d6d7�igd�ii�|jdddtdd8ddddiid d!d"d#gid$�id%digd�ii�|jdddtdd8dddd&iid d'd$�id%digd�ii�|jdddtdd8dd(dd)iid*d+d$�id%digd�ii�xbd@D]Z}|jdddtd,d8|fd�ii�|jdddtdd8ddd,d8|fiigd�ii��qWx�dAD]�}xz|jj�r�dd
gnd
gD]^}|jdddtd;d8||fd�ii�|jdddtdd8ddd;d8||fiigd�ii��q�W�qvWxbdBD]Z}|jdddtd,d8|fd�ii�|jdddtdd8ddd,d8|fiigd�ii��qW|d-k�r�|jdddtdd8ddddiid d!d.gid$�i|j|�d/d0d1iigd�ii�|jdddtdd8ddddiid d!d.gid$�id2digd�ii�|d-k�r6|jdddtdd8|j|�d/d0d3iigd�ii�|jdddtdd8d4d5d6d7�igd�ii�|jdddtdd<ddddiid d!d"d#gid$�id%digd�ii�|jdddtd=dd(dd>iid*d+d$�id%digd�ii�xbdCD]Z}|jdddtd,d<|fd�ii�|jdddtdd<ddd,d<|fiigd�ii��q�WxbdDD]Z}|jdddtd,d<|fd�ii�|jdddtdd<ddd,d<|fiigd�ii��qHW|S)ENr&rWrmrJz	mangle_%sr(z%srr<)r]r~r�r+r�r��POLICIES_preZZONES_SOURCEZZONES�
POLICIES_postzmangle_%s_%s)r]r~r�rZ�jump�target)r]r~rmr}rKrLr'znat_%sz	nat_%s_%sz	filter_%sr"r)r�r`r�r�r�r�r�)r.r/r0r�Zstatus�dnat�meta�iifnamez==�lozfilter_%s_%sr�Zinvalidr�prefixzSTATE_INVALID_DROP: r�zFINAL_REJECT: �reject�icmpxzadmin-prohibited)r+r}r#�IN�OUTzfilter_%s_%s_%sr$�
filter_OUTPUT�oifname)rKrL)r�)r�r�)r�)r�)r�)r�rpr2r�rMrd�_pkttype_match_fragment)rTr�Z
default_rulesrmZdispatch_suffixr]�	directionr4r4r5�build_default_ruless�
$

(

&

.
 


&

&











&


.


&










&


&znftables.build_default_rulescCs4|dkrdddgS|dkr dgS|dkr0ddgSgS)	Nr(r"�
FORWARD_IN�FORWARD_OUTr&rr'rr4)rTr~r4r4r5�get_zone_table_chains�s
znftables.get_zone_table_chainsrJc
s��dkr\�dkr\g}
|
j�j�|��||||dd�	�|
j�j�|��||||dd�	�|
S�jjj|���jdkrxdnd��dkr��d	kr�d
nd}�jjj|�t|��g}g}
|r�|jdd
ddiiddt	|�id�i�|�r|
jdd
ddiiddt	|�id�i�ddd�}|�rlxT|D]L}�dk�rT�jj
j|�}||k�rT�||k�rT�q|j�jd|���qW|�r�xT|D]L}�dk�r��jj
j|�}||k�r��||k�r��qx|
j�jd|���qxW��������fdd�}g}
|�rHx�|D]P}|
�rxB|
D]}|
j|||���qWn"�dk�r0|�r0n|
j||d���q�Wn\�dk�rZ|�rZnJ|
�r�xB|
D]}|
j|d|���qfWn"�dk�r�|�r�n|
j|dd��|
S)Nr'rJrK)r]rLr�pre�postrTFr)r�r`r�z==r�)r.r/r0r�)rGrH�saddr�daddrcs�g}|r|j|�|r |j|�|jddd��fii��td���f|d�}|j�j����rrdd|iiSdd|iiSdS)	Nr�r�z%s_%sz%s_%s_POLICIES_%s)r]r~rmr}rWrZrY)r2r�r��_policy_priority_fragment)�ingress_fragment�egress_fragment�expr_fragmentsrZ)�_policyrm�chain_suffixr�r]�p_objrTr~r4r5�_generate_policy_dispatch_rules

zRnftables.build_policy_ingress_egress_rules.<locals>._generate_policy_dispatch_rule)
�extend�!build_policy_ingress_egress_rulesrMr�Z
get_policyrr�policy_base_chain_name�POLICY_CHAIN_PREFIXr2r�r[Zcheck_source�_rule_addr_fragment)rTr�r�r~rmZingress_interfacesZegress_interfacesZingress_sourcesZegress_sourcesr]r��isSNATZingress_fragmentsZegress_fragmentsZ
ipv_to_family�srcr��dstr�r�r�r4)r�rmr�r�r]r�rTr~r5r��sv









z*nftables.build_policy_ingress_egress_rulesFc	
Cs�|dkrT|dkrTg}	|	j|j|||||||d��|	j|j|||||||d��|	S|dkrh|dkrhdnd}
|jjj||t|
d�}d	d
d	d	d
d
d�|}|t|�dd
kr�|dt|�d�d}d}
|dkr�|
dd||fiig}n,ddd|iid|d�i|
dd||fiig}|�rL|�rLd}|td||f|d�}|j|j	��nP|�rnd}|td||f|d�}n.d}|td||f|d�}|�s�|j|j	��|d|iigS)Nr'rJrKrLrTF)r�r�r�)rrr"r�r�r$r<�+�*�gotor�z%s_%sr)r�r`z==)r.r/r0rXz%s_%s_ZONES)r]r~rmr}rWrYrZ)
r��!build_zone_source_interface_rulesrMr�r�r�rer�r��_zone_interface_fragment)rTr�r[r��	interfacer~rmr2r]r�r�r��opt�actionr�rfrZr4r4r5r�Qs\



z*nftables.build_zone_source_interface_rulesc	Csn|dkr�|dkr�g}|jd�r6|j|td�d��}	nd}	td|�sTt|�sT|	dkrp|j|j||||||d��td|�s�t|�s�|	dkr�|j|j||||||d��|S|dkr�|dkr�d	nd
}
|jjj	||t
|
d�}dd
d�|}ddddddd�|}
|jj�rd||f}nd||f}d}|t||j
|
|�|dd||fiigd�}|j|j||��|d|iigS)Nr'rJzipset:rGrKrHrLrTF)r�rXrY)TFr�r�)rrr"r�r�r$z%s_%s_ZONES_SOURCEz%s_%s_ZONESr�r�z%s_%s)r]r~rmr}rZ)�
startswith�_set_get_familyrerrr��build_zone_source_address_rulesrMr�r�r�rdr�r�r��_zone_source_fragment)rTr�r[r�r\r~rmr]r�Zipset_familyr�r�r�r�Zzone_dispatch_chainr�rZr4r4r5r��sB


z(nftables.build_zone_source_address_rulesc
Cs|dkrH|dkrHg}|j|j||||d��|j|j||||d��|Sddd�|}|dkrj|dkrjd	nd
}|jjj||t|d�}	g}|j|d|td
||	fd�ii�x0d!D](}
|j|d|td||	|
fd�ii�q�WxDd"D]<}
|j|d|td
||	fddd||	|
fiigd�ii�q�W|jjj|j	}|jj
�dk�r�|dk�r�|d#k�r�|}|dk�rhd}|j|d|td
||	f|j|jj
��ddd|	|fiigd�ii�|dk�r|d$k�r|d%k�r�|j�}
n|j
�di}
|j|d|td
||	f|
gd�ii�|�s|j�|S)&Nr'rJrKrLrWrY)TFrTF)r�rmz%s_%s)r]r~r�r�r�deny�allowr�z%s_%s_%srZr�r�)r]r~rmr}r�r(�REJECT�
%%REJECT%%r�r�z"filter_%s_%s: "r�)r�rr�r�r�)r�rr�r�r�)r�r�r�)r�r�r�r�)r�r�)r��build_policy_chain_rulesrMr�r�r�r2r�Z	_policiesr��get_log_deniedr��_reject_fragment�lower�reverse)rTr�r�r~rmr]r�r�r�r�r�r�Z
log_suffix�target_fragmentr4r4r5r��sZ





&




 





z!nftables.build_policy_chain_rulescCs<|dkriS|dkr,ddddiid	|d
�iSttd|��dS)
N�all�unicast�	broadcast�	multicastr)r�r`�pkttypez==)r.r/r0zInvalid pkttype "%s")r�r�r�)r	r)rTr�r4r4r5r��s
z nftables._pkttype_match_fragmentcCsdddd�idddd�idddd�idddd�idddd�idddd�idddd�idddd�idddd�idddd�iddd	d�iddd	d�iddd
d�iddd
d�iddd
d�idddd�idddd�iddd
d�iddd
d�idddd�idddd�idddiidddiid�}||S)Nr�r7zhost-prohibited)r+r}znet-prohibitedzadmin-prohibitedrFznet-unreachablezhost-unreachablezport-unreachabler�zprot-unreachablezaddr-unreachablezno-router+z	tcp reset)zicmp-host-prohibitedzhost-prohibzicmp-net-prohibitedz
net-prohibzicmp-admin-prohibitedzadmin-prohibzicmp6-adm-prohibitedzadm-prohibitedzicmp-net-unreachableznet-unreachzicmp-host-unreachablezhost-unreachzicmp-port-unreachablezicmp6-port-unreachablezport-unreachzicmp-proto-unreachablez
proto-unreachzicmp6-addr-unreachablezaddr-unreachzicmp6-no-routezno-routez	tcp-resetztcp-rstr4)rTZreject_typeZfragsr4r4r5�_reject_types_fragment�s0
znftables._reject_types_fragmentcCsdddd�iS)Nr�r�zadmin-prohibited)r+r}r4)rTr4r4r5r�sznftables._reject_fragmentcCs ddddiiddddgid	�iS)
Nr)r�r`�l4protoz==r�r7rF)r.r/r0r4)rTr4r4r5�_icmp_match_fragment"sznftables._icmp_match_fragmentcCsP|siSddddd�}|j�\}}|||d�}|j�}|dk	rH||d<d|iS)	N�secondZminuteZhourZday)�s�m�h�d)�rateZper�burst�limit)Zvalue_parseZburst_parse)rTr�Zrich_to_nftr�Zdurationr�r�r4r4r5�_rich_rule_limit_fragment'sz"nftables._rich_rule_limit_fragmentcCs�t|j�tttgkrn<|jrHt|j�tttt	gkrRt
tdt|j���n
t
td��|jdkr�t|j�ttgks�t|j�tt	gkr�dSt|j�tgks�t|j�ttgkr�dSn|jdkr�dSdSdS)NzUnknown action %szNo rule action specified.rr�r�r�r�)
r+�elementrrrr�rrrrr	rrr)rT�	rich_ruler4r4r5�_rich_rule_chain_suffix?s 


z nftables._rich_rule_chain_suffixcCs>|jr|jrttd��|jdkr(dS|jdkr6dSdSdS)NzNot log or auditrrr�r�)r�auditr	rrr)rTr�r4r4r5� _rich_rule_chain_suffix_from_logUs


z)nftables._rich_rule_chain_suffix_from_logcCsddiS)Nz%%ZONE_INTERFACE%%r4)rTr4r4r5r�`sz!nftables._zone_interface_fragmentcCsNtd|�rt|�}n,td|�r@|jd�}t|d�d|d}d||d�iS)NrH�/rr<z%%ZONE_SOURCE%%)r[r\)rrr�split)rTr[r\Z
addr_splitr4r4r5r�cs



znftables._zone_source_fragmentcCs
d|jiS)Nz%%POLICY_PRIORITY%%)rr)rTr�r4r4r5r�ksz"nftables._policy_priority_fragmentcCs|s|jdkriSd|jiS)Nrz%%RICH_RULE_PRIORITY%%)rr)rTr�r4r4r5�_rich_rule_priority_fragmentnsz%nftables._rich_rule_priority_fragmentcCs�|js
iS|jjj||t�}ddd�|}|j|�}i}	|jjrPd|jj|	d<|jjr|d|jjkrhdn|jj}
d|
|	d<d	td
|||f||j	|jj
�d|	igd�}|j|j|��|d
|iiS)NrWrY)TFz%sr�Zwarning�warn�levelrJz%s_%s_%sr)r]r~rmr}rZ)
rrMr�r�r�r�r�rr�r�r�r�r�)rTr�r�r�r~r�r�r�r�Zlog_optionsrrZr4r4r5�_rich_rule_logss&
znftables._rich_rule_logc
Cs�|js
iS|jjj||t�}ddd�|}|j|�}dtd|||f||j|jj�dddiigd	�}	|	j	|j
|��|d
|	iiS)NrWrY)TFrJz%s_%s_%srrr�)r]r~rmr}rZ)r�rMr�r�r�r�r�r�r�r�r�)
rTr�r�r�r~r�r�r�r�rZr4r4r5�_rich_rule_audit�s
znftables._rich_rule_auditc
Cs�|js
iS|jjj||t�}ddd�|}|j|�}d|||f}	t|j�tkr\ddi}
�nt|j�tkr�|jjr�|j	|jj�}
nddi}
n�t|j�t
kr�ddi}
n�t|j�tk�rHd}|jjj||t�}d|||f}	|jjj
d	�}t|�d
k�r,dddd
iiddddd
ii|d
gi|dgid�i}
ndddd
ii|dd�i}
nttdt|j���dt|	||j|jj�|
gd�}|j|j|��|d|iiS)NrWrY)TFz%s_%s_%sr�r�r�r&r�r<r�r`�mark�^�&r)r`�valuezUnknown action %srJ)r]r~rmr}rZ)r�rMr�r�r�r�r+rrr�rrr�r�rer	rr�r�r�r�r�)
rTr�r�r�r~r�r�r�r�rmZrule_actionrrZr4r4r5�_rich_rule_action�sB


,znftables._rich_rule_actioncCs�|jd�r0|j|td�d�d|kr(dnd|�St|�r>d}n�td|�rNd}nvtd|�r�d}tj|dd�}d	|jj	|j
d
�i}nDtd|�r�d}t|�}n,d}|jd
�}d	t|d�t
|d�d
�i}dd||d�i|r�dnd|d�iSdS)Nzipset:r�TF�etherrGrK)�strictr�)�addrrerHrLr�rr<r)r*)r,r-z!=z==)r.r/r0)r��_set_match_fragmentrerrr�	ipaddressZIPv4NetworkZnetwork_addressZ
compressedZ	prefixlenrr�rn)rTZ
addr_fieldr\�invertr]Znormalized_addressZaddr_lenr4r4r5r��s(
&





znftables._rule_addr_fragmentcCs6|siS|d
krttd|��ddddiid|d	�iS)NrGrHzInvalid familyr)r�r`�nfprotoz==)r.r/r0)rGrH)r	r)rTZrich_familyr4r4r5�_rich_rule_family_fragment�s
z#nftables._rich_rule_family_fragmentcCs8|siS|jr|j}n|jr&d|j}|jd||jd�S)Nzipset:r�)r)r�ipsetr�r)rTZ	rich_destr\r4r4r5�_rich_rule_destination_fragment�s
z(nftables._rich_rule_destination_fragmentcCsZ|siS|jr|j}n2t|d�r.|jr.|j}nt|d�rH|jrHd|j}|jd||jd�S)N�macrzipset:r�)r)r�hasattrrrr�r)rTZrich_sourcer\r4r4r5�_rich_rule_source_fragment�s
z#nftables._rich_rule_source_fragmentcCsPt|�}t|t�r$|dkr$tt��n(t|�dkr8|dSd|d|dgiSdS)Nrr<�range)r�
isinstancernr	rre)rT�portrr4r4r5�_port_fragments
znftables._port_fragmentc	Csbddd�|}d}|jjj||t�}	g}
|r>|
j|j|j��|rT|
j|jd|��|r||
j|j|j	��|
j|j
|j��|
jdd|dd	�id
|j|�d�i�|s�t
|j�tkr�|
jddd
diiddddgid�i�g}|�r0|j|j|||||
��|j|j|||||
��|j|j|||||
��n.|j|ddtd||	f|
ddigd�ii�|S)NrWrY)TFr(r�r)r*�dport)r,r-z==)r.r/r0r�r`r�r�r��new�	untrackedrZrJz%s_%s_allowr�)r]r~rmr})rMr�r�r�r2rr]r�r�destinationr�sourcerr+r�rrrrr�)rTr�r��protorrr�r�r~r�r�r�r4r4r5�build_policy_ports_ruless:


z!nftables.build_policy_ports_rulesc	CsZddd�|}d}|jjj||t�}g}	|r>|	j|j|j��|rT|	j|jd|��|r||	j|j|j	��|	j|j
|j��|	jdddd	iid
|d�i�|s�t|j
�tkr�|	jdddd
iiddddgid�i�g}
|�r(|
j|j|||||	��|
j|j|||||	��|
j|j|||||	��n.|
j|ddtd||f|	ddigd�ii�|
S)NrWrY)TFr(r�r)r�r`r�z==)r.r/r0r�r�r�r�rrrZrJz%s_%s_allowr�)r]r~rmr})rMr�r�r�r2rr]r�rrrrr+r�rrrrr�)rTr�r�r,rr�r�r~r�r�r�r4r4r5�build_policy_protocol_rules2s8

z$nftables.build_policy_protocol_rulesc	Csbddd�|}d}|jjj||t�}	g}
|r>|
j|j|j��|rT|
j|jd|��|r||
j|j|j	��|
j|j
|j��|
jdd|dd	�id
|j|�d�i�|s�t
|j�tkr�|
jddd
diiddddgid�i�g}|�r0|j|j|||||
��|j|j|||||
��|j|j|||||
��n.|j|ddtd||	f|
ddigd�ii�|S)NrWrY)TFr(r�r)r*�sport)r,r-z==)r.r/r0r�r`r�r�r�rrrZrJz%s_%s_allowr�)r]r~rmr})rMr�r�r�r2rr]r�rrrrrr+r�rrrrr�)rTr�r�rrrr�r�r~r�r�r�r4r4r5�build_policy_source_ports_rulesUs:


z(nftables.build_policy_source_ports_rulesc
	Cs�d}|jjj||t�}	ddd�|}
g}|rR|jdddtd||f||d�ii�g}|rl|j|jd	|��|jd
d|dd
�id|j|�d�i�|jdd||fi�|j|
ddtd|	|d�ii�|S)Nr(rWrY)TFz	ct helperrJzhelper-%s-%s)r]r~r�r+r,r�r)r*r)r,r-z==)r.r/r0rZzfilter_%s_allow)r]r~rmr})rMr�r�r�r2r�r�r)
rTr�r�rrrZhelper_nameZmodule_short_namer~r�r�r�r�r4r4r5�build_policy_helper_ports_ruleszs.



z(nftables.build_policy_helper_ports_rulescCs�ddd�|}|jjj||t�}g}	|rv|t|�ddkrT|dt|�d�d}ddd	d
iid|d�id
dig}
n|jd|�d
dig}
dtd||
d�}|	j|d|ii�|	S)NrWrY)TFr<r�r�r)r�r`r�z==)r.r/r0r�r�rJzfilter_%s_allow)r]r~rmr}rZ)rMr�r�r�rer�r�r2)rTr�r[r�r~r�rr�r�r�r}rZr4r4r5�build_zone_forward_rules�s"z!nftables.build_zone_forward_rulesc	Cs�d}|jjj||tdd�}ddd�|}g}|r`|j|j|j��|j|j|j��|j	|�}	nd}	|t
d||	f|d	d
ddiid
dd�iddigd�}
|
j|j|��|d|
iigS)Nr'T)r�rWrY)TFr�z	nat_%s_%sr)r�r`r�z!=r�)r.r/r0Z
masquerade)r]r~rmr}rZ)
rMr�r�r�r2rrrrr�r�r�r�)rTr�r�r]r�r~r�r�r�r�rZr4r4r5�"_build_policy_masquerade_nat_rules�s&
z+nftables._build_policy_masquerade_nat_rulesc
Cs^g}|rD|jr|jdks,|jrDtd|jj�rD|j|j||d|��nV|r�|jrX|jdksl|jr�td|jj�r�|j|j||d|��n|j|j||d|��d}|jjj||t	�}ddd�|}g}|r�|j
|j|j��|j
|j
|j��|j|�}	nd	}	d
td||	f|dd
ddiiddddgid�iddigd�}
|
j|j|��|j
|d|
ii�|S)NrHrLrGrKr(rWrY)TFr�rJzfilter_%s_%sr)r�r`r�r�r�rr)r.r/r0r�)r]r~rmr}rZ)r]rrrr�r&rMr�r�r�r2rrrr�r�r�r�)rTr�r�r�r�r~r�r�r�r�rZr4r4r5�build_policy_masquerade_rules�s8
z&nftables.build_policy_masquerade_rulesc	Cs$d}	|jjj||	t�}
ddd�|}g}|r\|j|j|j��|j|j|j��|j	|�}
nd}
|jdd|dd	�id
|j
|�d�i�|r�td|�r�t|�}|r�|d
kr�|jd||j
|�d�i�q�|jdd|ii�n|jdd|j
|�ii�|t
d|
|
f|d�}|j|j|��|d|iigS)Nr'rWrY)TFr�r)r*r)r,r-z==)r.r/r0rHr�r�)rrrr;rz	nat_%s_%s)r]r~rmr}rZ)rMr�r�r�r2rrrrr�rrrr�r�r�)rTr�r�rr,�toaddr�toportr]r�r~r�r�r�r�rZr4r4r5�$_build_policy_forward_port_nat_rules�s4


z-nftables._build_policy_forward_port_nat_rulesc	
Cs�g}|rF|jr|jdks&|rFtd|�rF|j|j||||||d|��n�|r�|jrZ|jdksh|r�td|�r�|j|j||||||d|��nL|r�td|�r�|j|j||||||d|��n|j|j||||||d|��|S)NrHrLrGrK)r]rr�r*)	rTr�r�rr,r)r(r�r�r4r4r5�build_policy_forward_port_rulessz(nftables.build_policy_forward_port_rulescCs2|t|krt||Sttd||j|f��dS)Nz)ICMP type '%s' not supported by %s for %s)r�r	rr�)rTr�Z	icmp_typer4r4r5�_icmp_types_to_nft_fragments(sz%nftables._icmp_types_to_nft_fragmentscCsBd}|jjj||t�}ddd�|}|r6|jr6|j}n<|jrjg}d|jkrT|jd�d|jkrr|jd�nddg}g}	�x�|D�]�}
|jjj|�r�d||f}ddi}nd	||f}|j�}g}
|r�|
j|j	|j
��|
j|j|j��|
j|j|j
��|
j|j|
|j��|�r�|	j|j|||||
��|	j|j|||||
��|j�rf|	j|j|||||
��nN|j|�}d
td|||f|
|j�gd�}|j|j|��|	j|d
|ii�q~|jj�dk�r|jjj|��r|	j|d
d
t||
|j|jj��ddd||fiigd�ii�|	j|d
d
t||
|gd�ii�q~W|	S)Nr(rWrY)TFrGrHz%s_%s_allowr�z
%s_%s_denyrJz%s_%s_%s)r]r~rmr}rZr�rr�z"%s_%s_ICMP_BLOCK: ")rMr�r�r��ipvsrr2�query_icmp_block_inversionr�rr]rrrr�r,r�rrr�rr�r�r�r�r�r�)rTr�r�Zictr�r~r�r�r-r�r�Zfinal_chainr�r�r�rZr4r4r5�build_policy_icmp_block_rules/sb





"
"
z&nftables.build_policy_icmp_block_rulescCs�d}|jjj||t�}g}ddd�|}|jjj|�r@|j�}nddi}|j|ddtd||fd	|j�|gd
�ii�|jj	�dkr�|jjj|�r�|j|ddtd||fd	|j�|j
|jj	��dd
d||fiigd
�ii�|S)Nr(rWrY)TFr�rZrJz%s_%sr9)r]r~rmrar}r�rr�z%s_%s_ICMP_BLOCK: )rMr�r�r�r.r�r2r�r�r�r�)rTr�r�r~r�r�r�r�r4r4r5�'build_policy_icmp_block_inversion_rulesks,




 z0nftables.build_policy_icmp_block_inversion_rulescCs�g}ddddiiddd�iddd	d
dgdd
�iddd�ig}|dkrV|jdddii�|jddi�|jdddtd|d�ii�|jdddtdddddd�iddddgid�id digd�ii�|S)!Nr)r�r`rz==rH)r.r/r0Zfibr�ZiifrZoif)�flags�resultFr�rr�zrpfilter_DROP: r�rXrZrJZfilter_PREROUTING)r]r~rmr}r*rFr+)r,r-r�znd-router-advertznd-neighbor-solicitr�)r2r�)rTr�r�r�r4r4r5�build_rpfilter_rules�s0

znftables.build_rpfilter_rulesc	Cs�ddddddddd	g	}d
d�|D�}dd
ddd�idd|id�ig}|jjd"krb|jdddii�|j|jd��g}|jdddtdd|d�ii�|jdddtd d!|d�ii�|S)#Nz::0.0.0.0/96z::ffff:0.0.0.0/96z2002:0000::/24z2002:0a00::/24z2002:7f00::/24z2002:ac10::/28z2002:c0a8::/32z2002:a9fe::/32z2002:e000::/19cSs2g|]*}d|jd�dt|jd�d�d�i�qS)r�r�rr<)rre)r�rn)�.0r^r4r4r5�
<listcomp>�sz5nftables.build_rfc3964_ipv4_rules.<locals>.<listcomp>r)r*rLr�)r,r-z==r�)r.r/r0r�r�rr�zRFC3964_IPv4_REJECT: zaddr-unreachrWrZrJr�r<)r]r~rmrar}Zfilter_FORWARDrB)r�r�)rMZ_log_deniedr2r�r�)rTZ	daddr_setr�r�r4r4r5�build_rfc3964_ipv4_rules�s:

z!nftables.build_rfc3964_ipv4_rulescCs�d}g}|j|j|j��|j|j|j��|j|j|j��g}|j|j|||||��|j|j|||||��|j|j	|||||��|S)Nr()
r2rr]rrrrrrr)rTr�r�r�r~r�r�r4r4r5�*build_policy_rich_source_destination_rules�sz3nftables.build_policy_rich_source_destination_rulescCs|dkrdSdS)NrGrH�ebTF)rGrHr8r4)rTr�r4r4r5�is_ipv_supported�sznftables.is_ipv_supportedc
Cs�ddd�}||||ddg||dd||g||dd||g||dg||||||g||ddg||dd||g||dgdd	�}||kr�||Sttd
|��dS)NZ	ipv4_addrZ	ipv6_addr)rGrHZ
inet_protoZinet_servicerZifnameZ
ether_addr)zhash:ipzhash:ip,portzhash:ip,port,ipzhash:ip,port,netzhash:ip,markzhash:netzhash:net,netz
hash:net,portzhash:net,port,netzhash:net,ifacezhash:macz!ipset type name '%s' is not valid)r	r
)rTr�r+Zipv_addr�typesr4r4r5�_set_type_list�s"

znftables._set_type_listc
Cs�|rd|kr|ddkrd}nd}t||j||�d�}x0|jd�djd�D]}|dkrLdg|d
<PqLW|r�d|kr�|d|d<d|kr�|d|d<g}x0dD](}d|i}	|	j|�|jdd|	ii�q�W|S)Nr]�inet6rHrG)r~r�r+�:r<�,rK�netrZintervalr1ZtimeoutZmaxelem�sizerJrLrWr�)rKr?r)rJrKrL)r�r;r�r�r2)
rTr�r+�optionsr�Zset_dict�tr�r]Z	rule_dictr4r4r5�build_set_create_rules�s*


znftables.build_set_create_rulescCs$|j|||�}|j||jj��dS)N)rCr�rMr�)rTr�r+rAr�r4r4r5�
set_createsznftables.set_createcCs8x2dD]*}dd|t|d�ii}|j||jj��qWdS)NrJrKrLrYr�)r]r~r�)rJrKrL)r�r�rMr�)rTr�r]rZr4r4r5�set_destroys

znftables.set_destroycCs6|jjj|�jjd�djd�}g}x�tt|��D]�}||dkrr|jdddii�|jdd	|rdd
ndd�i�q2||dkr�|jd|j|�|r�dndd�i�q2||dkr�|jdd|r�dndii�q2||dkr�|jdddii�q2t	d||��q2Wdt|�dk�rd|in|d|�r&dndd|d�iS)Nr=r<r>rr�r`r�r*Zthrr")r,r-rKr?rr�r�Zifacer�r�rz-Unsupported ipset type for match fragment: %sr)�concatrz!=z==�@)r.r/r0)rKr?r)
rMr�	get_ipsetr+r�rrer2r�r	)rTr�Z
match_destr�type_formatr3�ir4r4r5r s$ znftables._set_match_fragmentcCsN|jjj|�}|jjd�djd�}|jd�}t|�t|�krHttd��g}�x�tt|��D�]�}||dk�r,y||j	d�}Wn&t
k
r�|jd�||}	Yn,X|j||d|��|||dd�}	y|	j	d�}Wn t
k
�r|j|	�Yn(X|jd|	d|�|	|dd�gi�q\||dk�r d||k�rb|jd||jd�i�n�y||j	d�}WnLt
k
�r�||}
d|jk�r�|jdd
k�r�t
|
�}
|j|
�Yn^X||d|�}
d|jk�r�|jdd
k�r�t
|
�}
|jd|
t|||dd��d�i�q\|j||�q\Wt|�dk�rJd|igS|S)Nr=r<r>z+Number of values does not match ipset type.rZtcp�-rrKr?r�r]r<r�)rrerF)rKr?)rMrrHr+r�rer	rrrar�r2rArrn)rTr��entry�objrIZentry_tokensZfragmentrJraZport_strrr4r4r5�_set_entry_fragment7sL

("znftables._set_entry_fragmentc	Cs>g}|j||�}x(dD] }|jdd|t||d�ii�qW|S)NrJrKrLrWr�)r]r~r��elem)rJrKrL)rNr2r�)rTr�rLr�r�r]r4r4r5�build_set_add_rulesks

znftables.build_set_add_rulescCs"|j||�}|j||jj��dS)N)rPr�rMr�)rTr�rLr�r4r4r5�set_addusznftables.set_addcCsF|j||�}x4dD],}dd|t||d�ii}|j||jj��qWdS)NrJrKrLrYr�)r]r~r�rO)rJrKrL)rNr�r�rMr�)rTr�rLr�r]rZr4r4r5�
set_deleteys
znftables.set_deletecCs4g}x*dD]"}dd|t|d�ii}|j|�q
W|S)NrJrKrLr{r�)r]r~r�)rJrKrL)r�r2)rTr�r�r]rZr4r4r5�build_set_flush_rules�s
znftables.build_set_flush_rulescCs |j|�}|j||jj��dS)N)rSr�rMr�)rTr�r�r4r4r5�	set_flush�s
znftables.set_flushcCsJ|jjj|�}|jdkrd}n(|jrBd|jkrB|jddkrBd}nd}|S)Nzhash:macr	r]r<rLrK)rMrrHr+rA)rTr�rr]r4r4r5r��s
znftables._set_get_familyc	Cs�g}|j|j|||��|j|j|��d}x^|D]D}|j|j||��|d7}|dkr2|j||jj��|j�d}q2W|j||jj��dS)Nrr<i�)r�rCrSrPr�rMr��clear)	rTZset_nameZ	type_nameZentriesZcreate_optionsZ
entry_optionsr��chunkrLr4r4r5�set_restore�s
znftables.set_restore)N)N)r�)rJ)FrJ)rJ)rJ)F)NN)NN)NN)NN)N)N)N)N)N)F)N)N)F)NN)I�__name__�
__module__�__qualname__r�Zpolicies_supportedrVrhrlrtrzr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rrrr�rrrrr r!r#r$r%r&r'r*r+r,r/r0r3r6r7r9r;rCrDrErrNrPrQrRrSrTr�rWr4r4r4r5rI�s�/.`

4


R
i
;
-
9
 +


	
$
$
$


'
$

<
#


4
		rIij���i����)N)(Z
__future__rrirwr
Zfirewall.core.loggerrZfirewall.functionsrrrrrZfirewall.errorsr	r
rrr
rrZfirewall.core.richrrrrrrrZnftables.nftablesrr�r�r�r�r�r6r��objectrIr4r4r4r5�<module>s�$$





































watcher.cpython-36.pyc000064400000005256151730727350010651 0ustar003

��g��@s*dgZddlmZmZGdd�de�ZdS)�Watcher�)�Gio�GLibc@sdeZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zdd�Zdd�Z
dS)rcCs"||_||_i|_i|_g|_dS)N)�	_callback�_timeout�	_monitors�	_timeouts�_blocked)�self�callbackZtimeout�r�/usr/lib/python3.6/watcher.py�__init__s
zWatcher.__init__cCs:tjj|�}|jtjjd�|j|<|j|jd|j�dS)N�changed)	r�File�new_for_pathZmonitor_directory�FileMonitorFlags�NONEr�connect�_file_changed_cb)r
Z	directory�gfilerrr
�
add_watch_dir"szWatcher.add_watch_dircCs:tjj|�}|jtjjd�|j|<|j|jd|j�dS)Nr)	rrrZmonitor_filerrrrr)r
�filenamerrrr
�add_watch_file(szWatcher.add_watch_filecCs
|jj�S)N)r�keys)r
rrr
�get_watches.szWatcher.get_watchescCs
||jkS)N)r)r
rrrr
�	has_watch1szWatcher.has_watchcCs|j|=dS)N)r)r
rrrr
�remove_watch4szWatcher.remove_watchcCs||jkr|jj|�dS)N)r	�append)r
rrrr
�block_source7s
zWatcher.block_sourcecCs||jkr|jj|�dS)N)r	�remove)r
rrrr
�unblock_source;s
zWatcher.unblock_sourcecCs4x.t|jj��D]}tj|j|�|j|=qWdS)N)�listrrr�
source_remove)r
rrrr
�clear_timeouts?szWatcher.clear_timeoutscCs ||jkr|j|�|j|=dS)N)r	rr)r
rrrr
�_call_callbackDs

zWatcher._call_callbackcCs�|j�}||jkr8||jkr4tj|j|�|j|=dS|tjjksh|tjjksh|tjj	ksh|tjj
kr�||jkr�tj|j|�|j|=tj|j|j
|�|j|<dS)N)Zget_parse_namer	rrr#rZFileMonitorEventZCHANGEDZCREATEDZDELETEDZATTRIBUTE_CHANGEDZtimeout_add_secondsrr%)r
ZmonitorZgio_fileZgio_other_fileZeventrrrr
rIs


zWatcher._file_changed_cbN)�__name__�
__module__�__qualname__rrrrrrrr!r$r%rrrrr
rsN)�__all__Z
gi.repositoryrr�objectrrrrr
�<module>sfw.cpython-36.opt-1.pyc000064400000066115151730727350010570 0ustar003

��g���@s�dgZddlZddlZddlZddlZddlZddlmZddlm	Z	ddl
mZddl
mZddl
m
Z
ddl
mZdd	l
mZdd
lmZddlmZddlmZdd
lmZddlmZddlmZddlmZddlmZddl m!Z!ddl"m#Z#ddl$m%Z%m&Z&ddl'm(Z(ddl)m*Z*ddl+m,Z,ddl-m.Z.ddl/m0Z0ddl1m2Z2m3Z3ddl4m5Z5ddl6m7Z7ddl8m9Z9ddl:m;Z;ddlm<Z<dd l=m>Z>Gd!d�de?�Z@dS)"�Firewall�N)�config)�	functions)�	ipXtables)�ebtables)�nftables)�ipset)�modules)�FirewallIcmpType)�FirewallService)�FirewallZone)�FirewallDirect)�FirewallConfig)�FirewallPolicies)�
FirewallIPSet)�FirewallTransaction)�FirewallHelper)�FirewallPolicy)�nm_get_bus_name�nm_get_interfaces_in_zone)�log)�firewalld_conf)�Direct)�service_reader)�icmptype_reader)�zone_reader�Zone)�ipset_reader)�IPSET_TYPES)�
helper_reader)�
policy_reader)�errors)�
FirewallErrorc@s�eZdZdedd�Zdd�Zdd�Zdd	�Zd
d�Zdfdd
�Zdd�Z	dgdd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zd d!�Zd"d#�Zd$d%�Zd&d'�Zdhd)d*�Zdid+d,�Zd-d.�Zdjd/d0�Zdkd1d2�Zdld3d4�Zd5d6�Zd7d8�Zd9d:�Zd;d<�Zd=d>�Z d?d@�Z!dAdB�Z"dCdD�Z#dEdF�Z$dGdH�Z%dIdJ�Z&dKdL�Z'dMdN�Z(dmdOdP�Z)dQdR�Z*dSdT�Z+dUdV�Z,dWdX�Z-dYdZ�Z.d[d\�Z/d]d^�Z0d_d`�Z1dadb�Z2dcdd�Z3d(S)nrFcCsttj�|_||_|jr>d|_d|_d|_d|_t	|_
d|_nrtj
|�|_d|_g|_tj|�|_d|_g|_tj�|_d|_tj�|_d|_g|_
tj|�|_d|_tj�|_t|�|_t|�|_t|�|_ t!|�|_"t#|�|_t$�|_%t&|�|_t'|�|_(t)|�|_*|j+�dS)NFT),rr�FIREWALLD_CONF�_firewalld_conf�_offline�ip4tables_enabled�ip6tables_enabled�ebtables_enabled�
ipset_enabledr�ipset_supported_types�nftables_enabledr�	ip4tables�ip4tables_backend�ipv4_supported_icmp_types�	ip6tables�ip6tables_backend�ipv6_supported_icmp_typesr�ebtables_backendr�
ipset_backendr�nftables_backendr	�modules_backendr
�icmptyper�servicer�zoner
�directrr�policiesrr�helperr�policy�_Firewall__init_vars)�selfZoffline�r?�/usr/lib/python3.6/fw.py�__init__CsB










zFirewall.__init__cCsDd|j|j|j|j|j|j|j|j|j|j	|j
|j|j|j
|jfS)Nz:%s(%r, %r, %r, %r, %r, %r, %r, %r, %r, %r, %r, %r, %r, %r))�	__class__r&r'r(�_state�_panic�
_default_zone�_module_refcount�_marks�cleanup_on_exit�cleanup_modules_on_exit�ipv6_rpfilter_enabledr)�_individual_calls�_log_denied)r>r?r?r@�__repr__kszFirewall.__repr__cCsjd|_d|_d|_i|_g|_tj|_tj|_	tj
|_tj|_
tj|_tj|_tj|_tj|_tj|_dS)NZINITF�)rCrDrErFrGrZFALLBACK_CLEANUP_ON_EXITrHZ FALLBACK_CLEANUP_MODULES_ON_EXITrIZFALLBACK_IPV6_RPFILTERrJZFALLBACK_INDIVIDUAL_CALLSrKZFALLBACK_LOG_DENIEDrLZFALLBACK_FIREWALL_BACKEND�_firewall_backendZFALLBACK_FLUSH_ALL_ON_RELOAD�_flush_all_on_reloadZFALLBACK_RFC3964_IPV4�
_rfc3964_ipv4ZFALLBACK_ALLOW_ZONE_DRIFTING�_allow_zone_drifting)r>r?r?r@Z__init_varstszFirewall.__init_varscCs�|jr$d|jj�kr$tjd�d|_|jrHd|jj�krHtjd�d|_|jrld|jj�krltjd�d|_|jr�|jr�|j	r�tj
d�tjd�dS)N�filterziptables is not usable.Fzip6tables is not usable.zebtables is not usable.zNo IPv4 and IPv6 firewall.�)
r&r-�get_available_tablesr�info1r'r0r(r2r+�fatal�sys�exit)r>r?r?r@�
_check_tables�s 



zFirewall._check_tablescCszy|jj�Wn*tk
r8tjd�d|_g|_YnX|jj�|_|jj	�|jj
s||jjrltjd�ntjd�d|_|j
r�|jjd�|_n|jr�|jj�|_ng|_|jj	�|jj
s�|jjr�tjd�ntjd�d|_|j
r�|jjd�|_n|j�r|jj�|_ng|_|jj	�|jj
�sN|jj�r>tjd	�ntjd
�d|_|j�rv|j�rv|jj�rvtjd�dS)Nz4ipset not usable, disabling ipset usage in firewall.FzFiptables-restore is missing, using individual calls for IPv4 firewall.zCiptables-restore and iptables are missing, disabling IPv4 firewall.�ipv4zGip6tables-restore is missing, using individual calls for IPv6 firewall.zEip6tables-restore and ip6tables are missing, disabling IPv6 firewall.�ipv6zHebtables-restore is missing, using individual calls for bridge firewall.zEebtables-restore and ebtables are missing, disabling bridge firewall.zSebtables-restore is not supporting the --noflush option, will therefore not be used)r3Zset_list�
ValueErrorr�warningr)r*Zset_supported_typesr-Zfill_exists�restore_command_existsZcommand_existsr&r+r4Zsupported_icmp_typesr.r0r'r1r2r(rK�restore_noflush_option�debug1)r>r?r?r@�_start_check�sL








zFirewall._start_checkc>Cs�tj}tjdtj�y|jj�Wn8tk
rZ}ztj|�tjd�WYdd}~X�n"X|jj	d�rt|jj	d�}|jj	d�r�|jj	d�}|dk	r�|j
�dBkr�d|_tjd|j�|jj	d	��r|jj	d	�}|dk	r�|j
�dCkr�d|_|dk	�r|j
�dDk�rd|_tjd
|j�|jj	d��rv|jj	d�}|dk	�rv|j
�dEk�rvtjd�y|j
j�Wntk
�rtYnX|jj	d��r�|jj	d�}|dk	�r�|j
�dFk�r�d|_|j
�dGk�r�d|_|j�r�tjd�n
tjd�|jj	d��r"|jj	d�}|dk	�r"|j
�dHk�r"tjd�d|_|jj	d��rt|jj	d�}|dk�sT|j
�dk�r\d|_n|j
�|_tjd|j�|jj	d��r�|jj	d�|_tjd|j�|jj	d��r�|jj	d�}|j
�dIk�r�d|_nd|_tjd|j�|jj	d��r&|jj	d�}|j
�dJk�rd|_nd|_tjd|j�|jj	d��r||jj	d�}|j
�dKk�rVd|_nd|_|j�sntjd�tjd |j�|jjtj|j��|j|j�|j�s�|j�tjd!�y|j
jj�WnZtk
�r }z<|j
j��r�tjd"|j
jj |�ntjd"|j
jj |�WYdd}~XnX|jj!tj|j
��|j"tj#d#�|j"tj$d#�|j"tj%d$�|j"tj&d$�t'|j(j)��d%k�r�tjd&�|j"tj*d'�|j"tj+d'�|j"tj,d(�|j"tj-d(�t'|j.j/��d%k�r�tjd)�|j"tj0d*�|j"tj1d*�t'|j2j3��d%k�r&tj4d+�t5j6d,�|j"tj7d-�|j"tj8d-�d}x.dLD]&}||j2j3�k�rLtj4d1|�d}�qLW|�r�t5j6d,�||j2j3�k�r�d2|j2j3�k�r�d2}nd3|j2j3�k�r�d3}nd.}tjd4||�|}ntjd5|�t9tj:�}	t;j<j=tj:��rRtjd6tj:�y|	j�Wn4tk
�rP}ztjd7tj:|�WYdd}~XnX|j>j?|	�|jj@tj|	��|jA|�|_B|j�r�dS|jC�tjD�d%k�r�tEjE�}
tF|�}|�s�|jG|d8�|�r�|�s�|jH�r�|jIjJ��r�|jKd�|jL�|�r|�rtjd9�|jMjN�|jO|d8�|jKd�|jL�|jH�rX|jIjJ��rXtjd:�|jIjP�tjd;�|jQ|d8�tjd<�|j2jR|d8�|j2jSd|jB|d8�tjd=�|jTjU|d8�|jKd�|jL�|j>jV��rVtjd>�|j>jW|�y|jKd�|jL�WnXtk
�r>}z$t|jXd?|jY�r&|jYnd@��WYdd}~Xntk
�rT�YnX~tjD�d,k�r�tEjE�}
tjZdA|
|
�dS)MNz"Loading firewalld config file '%s'z0Using fallback firewalld configuration settings.�DefaultZoneZ
CleanupOnExit�no�falseFzCleanupOnExit is set to '%s'ZCleanupModulesOnExit�yes�trueTz#CleanupModulesOnExit is set to '%s'ZLockdownzLockdown is enabledZ
IPv6_rpfilterzIPv6 rpfilter is enabledzIPV6 rpfilter is disabledZIndividualCallszIndividualCalls is enabled�	LogDeniedZoffzLogDenied is set to '%s'ZFirewallBackendzFirewallBackend is set to '%s'ZFlushAllOnReloadzFlushAllOnReload is set to '%s'ZRFC3964_IPv4zRFC3964_IPv4 is set to '%s'ZAllowZoneDriftingz�AllowZoneDrifting is enabled. This is considered an insecure configuration option. It will be removed in a future release. Please consider disabling it now.z AllowZoneDrifting is set to '%s'zLoading lockdown whitelistz*Failed to load lockdown whitelist '%s': %srr6rzNo icmptypes found.r;r7zNo services found.r8zNo zones found.rTr<�block�drop�trustedzZone '%s' is not available.ZpublicZexternalz+Default zone '%s' is not valid. Using '%s'.zUsing default zone '%s'zLoading direct rules file '%s'z)Failed to load direct rules file '%s': %s)�use_transactionzUnloading firewall moduleszApplying ipsetszApplying default rule setzApplying used zoneszApplying used policiesz2Applying direct chains rules and passthrough rulesz
Direct: %srNz%Flushing and applying took %f seconds)rdre)rfrg)rdre)rfrg)rdre)rfrg)rfrg)rdre)rdre)rdre)rirjrk)[rZ
FALLBACK_ZONErrar#r$�read�	Exceptionr^�get�lowerrHrIr:Zenable_lockdownr"rJrKrLrOrPrQrRr%Zset_firewalld_conf�copy�deepcopy�_select_firewall_backendrbZlockdown_whitelistZquery_lockdown�error�filenameZset_policies�_loaderZFIREWALLD_IPSETSZETC_FIREWALLD_IPSETSZFIREWALLD_ICMPTYPESZETC_FIREWALLD_ICMPTYPES�lenr6�
get_icmptypesZFIREWALLD_HELPERSZETC_FIREWALLD_HELPERSZFIREWALLD_SERVICESZETC_FIREWALLD_SERVICESr7�get_servicesZFIREWALLD_ZONESZETC_FIREWALLD_ZONESr8�	get_zonesrWrXrYZFIREWALLD_POLICIESZETC_FIREWALLD_POLICIESrZFIREWALLD_DIRECT�os�path�existsr9Zset_permanent_configZ
set_direct�
check_zonerErZZgetDebugLogLevel�timer�flushr)rZ
has_ipsets�execute�clearr5�unload_firewall_modules�apply_default_tablesZapply_ipsets�apply_default_rulesZapply_zones�change_default_zoner<Zapply_policiesZhas_configurationZapply_direct�code�msgZdebug2)r>�reload�complete_reloadZdefault_zoner��valuert�zr8�objZtm1�transaction�eZtm2r?r?r@�_start�st







 




















.zFirewall._startcCsHy|j�Wn&tk
r2d|_|jd��YnXd|_|jd�dS)N�FAILED�ACCEPT�RUNNING)r�rnrC�
set_policy)r>r?r?r@�start�s
zFirewall.startcCshtjj|�sdS|rZ|jtj�rV|dkrVt�}tjj|�|_|j	|j�||_d|_
nd}�x|ttj|��D�]h}|j
d�s�|jtj�rl|dkrltjjd||f�rl|jd||f|dd�qld||f}tjd||��y�|dk�r�t||�}|j|jj�k�r8|jj|j�}tjd	||j|j|j�|jj|j�n|jjtj��rNd|_
y|jj|�Wn<tk
�r�}	ztjd
|jt|	�f�WYdd}	~	XnX|jjtj|���n�|dk�rFt||�}|j|jj�k�r|jj |j�}tjd	||j|j|j�|jj!|j�n|jjtj��r$d|_
|jj"|�|jj"tj|���n.|dk�rnt#|||d�}|�r�dtjj|�tjj|�d
d�f|_|j	|j�tj|�}
|j|j$j%�k�r|j$j&|j�}|j$j'|j�|j(�r�tjd||j||�|j)|�ntjd	||j|j|j�n|jjtj��r,d|_
d|
_
|jj*|
�|�r^tjd||j||�|j)|�n|j$j*|��n|dk�rDt+||�}|j|j,j-�k�r�|j,j.|j�}tjd	||j|j|j�|j,j/|j�n|jjtj��r�d|_
y|j,j0|�Wn<tk
�r,}	ztj1d
|jt|	�f�WYdd}	~	XnX|jj0tj|���n0|dk�r�t2||�}|j|j3j4�k�r�|j3j5|j�}tjd	||j|j|j�|j3j6|j�n|jjtj��r�d|_
|j3j7|�|jj7tj|��n�|dk�rht8||�}|j|j9j:�k�r2|j9j;|j�}tjd	||j|j|j�|j9j<|j�n|jjtj��rHd|_
|j9j=|�|jj>tj|��ntj?d|�Wqltk
�r�}ztj@d|||�WYdd}~XqltAk
�r�tj@d||�tjB�YqlXqlW|�rd|j(�rd|j|j$j%�k�rX|j$j&|j�}tjd||j|j|j�y|j$j'|j�WntAk
�rHYnX|jjC|j�|j$j*|�dS)Nr8Fz.xmlz%s/%sT)�combinezLoading %s file '%s'r6z  Overloads %s '%s' ('%s/%s')z%s: %s, ignoring for run-time.r7)Z
no_check_namer�z  Combining %s '%s' ('%s/%s')rr;r<zUnknown reader type %szFailed to load %s file '%s': %szFailed to load %s file '%s':z0  Overloading and deactivating %s '%s' ('%s/%s')���)Dr{r|�isdir�
startswithrZ
ETC_FIREWALLDr�basename�nameZ
check_name�default�sorted�listdir�endswithrvrrarr6rxZget_icmptyperuZremove_icmptypeZadd_icmptyper"rV�strrqrrrr7ryZget_serviceZremove_serviceZadd_servicerr8rzZget_zoneZremove_zone�combinedr�Zadd_zonerr�
get_ipsets�	get_ipsetZremove_ipset�	add_ipsetr^rr;Zget_helpersZ
get_helperZ
remove_helperZ
add_helperr r<�get_policiesZ
get_policyZ
remove_policyZ
add_policyZadd_policy_objectrWrtrnZ	exceptionZforget_zone)r>r|Zreader_typer�Z
combined_zonerur�r�Zorig_objrtZ
config_objr�r?r?r@rvs


$







$




zFirewall._loadercCsp|jj�|jj�|jj�|jj�|jj�|jj�|jj�|jj�|j	j�|j
j�|j�dS)N)r6�cleanupr7r8rr;rr9r:r<r$r=)r>r?r?r@r��s









zFirewall.cleanupcCsN|jsB|jr(|j�|jj�|jd�|jrBtjd�|jj	�|j
�dS)Nr�z!Unloading firewall kernel modules)r%rHr�rr�rIrrar5r�r�)r>r?r?r@�stop�s



z
Firewall.stopc	Cs�d}d}x�t|�D]�\}}|r0|jj|�\}}n$|j|dkrDd}n|jj|�\}}|dkrn|d7}||7}q|r�|jj|d�|j|d7<q||jkr|j|d8<|j|dkr|j|=qW||fS)NrrNrT)�	enumerater5�load_modulerFZ
unload_module�
setdefault)	r>Z_modules�enableZ
num_failedZ
error_msgs�i�moduleZstatusr�r?r?r@�handle_modules�s(
zFirewall.handle_modulescCs|dkrd|_dS)NrF)r+)r>�backendr?r?r@rs�sz!Firewall._select_firewall_backendcCs4x|j�D]}|j|kr
|Sq
Wttjd|��dS)Nz'%s' backend does not exist)�all_backendsr�r"r!Z
UNKNOWN_ERROR)r>r�r�r?r?r@�get_backend_by_name�s

zFirewall.get_backend_by_namecCs\|jr|jS|dkr |jr |jS|dkr4|jr4|jS|dkrH|jrH|jStt	j
d|��dS)Nr[r\�ebz-'%s' is not a valid backend or is unavailable)r+r4r&r-r'r0r(r2r"r!�INVALID_IPV)r>�ipvr?r?r@�get_backend_by_ipv�szFirewall.get_backend_by_ipvcCsP|dkr|jr|jS|dkr(|jr(|jS|dkr<|jr<|jSttjd|��dS)Nr[r\r�z-'%s' is not a valid backend or is unavailable)	r&r-r'r0r(r2r"r!r�)r>r�r?r?r@�get_direct_backend_by_ipv�sz"Firewall.get_direct_backend_by_ipvcCs<|dkr|jS|dkr|jS|dkr*|jS|dkr8|jSdS)Nr,r/rrF)r&r'r(r+)r>r�r?r?r@�is_backend_enabled�szFirewall.is_backend_enabledcCs8|jr
dS|dkr|jS|dkr&|jS|dkr4|jSdS)NTr[r\r�F)r+r&r'r()r>r�r?r?r@�is_ipv_enabledszFirewall.is_ipv_enabledcCsRg}|jr|j|j�n6|jr*|j|j�|jr<|j|j�|jrN|j|j�|S)N)	r+�appendr4r&r-r'r0r(r2)r>�backendsr?r?r@�enabled_backendsszFirewall.enabled_backendscCsPg}|jr|j|j�|jr(|j|j�|jr:|j|j�|jrL|j|j�|S)N)	r&r�r-r'r0r(r2r+r4)r>r�r?r?r@r�szFirewall.all_backendsNcCsN|dkrt|�}n|}x |j�D]}|j||j��q W|dkrJ|jd�dS)NT)rr��	add_rulesZbuild_default_tablesr�)r>rlr�r�r?r?r@r�$s
zFirewall.apply_default_tablescCs�|dkrt|�}n|}x(|j�D]}|j|j�}|j||�q W|jd�r~|jd�}d|j�kr~|jr~|j	|j�}|j||�|jd�r�|j
r�|j�}|j||�|dkr�|jd�dS)Nr\�rawT)
rr�Zbuild_default_rulesrLr�r�r�rUrJZbuild_rpfilter_rulesrQZbuild_rfc3964_ipv4_rulesr�)r>rlr�r��rulesZipv6_backendr?r?r@r�0s"


zFirewall.apply_default_rulescCs|jr|jj�rdSdS)NTF)r+r9Zhas_runtime_configuration)r>r?r?r@�may_skip_flush_direct_backendsHsz'Firewall.may_skip_flush_direct_backendscCs`|dkrt|�}n|}x2|j�D]&}||j�kr2q |j�}|j||�q W|dkr\|jd�dS)NT)rr�r��build_flush_rulesr�r�)r>rlr�r�r�r?r?r@�flush_direct_backendsNs
zFirewall.flush_direct_backendscCsp|dkrt|�}n|}tjd�|j�s4|j|d�x$|j�D]}|j�}|j||�q>W|dkrl|jd�dS)NzFlushing rule set)rlT)	rrrar�r�r�r�r�r�)r>rlr�r�r�r?r?r@r�]s

zFirewall.flushcCs`|dkrt|�}n|}tjd|�x&|j�D]}|j|�}|j||�q,W|dkr\|jd�dS)NzSetting policy to '%s'T)rrrar�Zbuild_set_policy_rulesr�r�)r>r<rlr�r�r�r?r?r@r�os

zFirewall.set_policycCsB|sdS|j|�}|s&ttjd|��|j|�s4dS|j||j�S)NrNz'%s' is not a valid backend)r�r"r!r�r��set_rulerL)r>�backend_name�ruler�r?r?r@r��s


z
Firewall.rulecCs"ttd|��}|j|�}|s,ttjd|��|j|�s:dS|js\|js\|dkoX|j	j
�rx�t|�D]�\}}y|j||j
�Wqftk
�r}zjtjtj��tj|�xFt|d|��D]2}y|j|j|�|j
�Wq�tk
r�Yq�Xq�W|�WYdd}~XqfXqfWn|j||j
�dS)Nz'%s' is not a valid backendr)�listrSr�r"r!r�r�rKr_r2r`r�r�rLrnrra�	traceback�
format_excrt�reversedZreverse_ruleZ	set_rules)r>r�r�Z_rulesr�r�r�r�r?r?r@r��s.




zFirewall.rulescCs|jrttj��dS)N)rDr"r!Z
PANIC_MODE)r>r?r?r@�check_panic�szFirewall.check_paniccCs"|}||jj�krttj|��|S)N)r<r�r"r!ZINVALID_POLICY)r>r<Z_policyr?r?r@�check_policy�szFirewall.check_policycCs8|}|s|dkr|j�}||jj�kr4ttj|��|S)NrN)�get_default_zoner8rzr"r!ZINVALID_ZONE)r>r8�_zoner?r?r@r~�szFirewall.check_zonecCstj|�sttj|��dS)N)rZcheckInterfacer"r!ZINVALID_INTERFACE)r>�	interfacer?r?r@�check_interface�s
zFirewall.check_interfacecCs|jj|�dS)N)r7�
check_service)r>r7r?r?r@r��szFirewall.check_servicecCstj|�sttj|��dS)N)r�
check_portr"r!ZINVALID_PORT)r>Zportr?r?r@r��s
zFirewall.check_portcCs*|sttj��|dkr&ttjd|��dS)N�tcp�udp�sctp�dccpz''%s' not in {'tcp'|'udp'|'sctp'|'dccp'})r�r�r�r�)r"r!ZMISSING_PROTOCOLZINVALID_PROTOCOL)r>Zprotocolr?r?r@�check_tcpudp�s
zFirewall.check_tcpudpcCstj|�sttj|��dS)N)rZcheckIPr"r!�INVALID_ADDR)r>Zipr?r?r@�check_ip�s
zFirewall.check_ipcCsP|dkr tj|�sLttj|��n,|dkr@tj|�sLttj|��nttjd��dS)Nr[r\z'%s' not in {'ipv4'|'ipv6'})rZcheckIPnMaskr"r!r�Z
checkIP6nMaskr�)r>r��sourcer?r?r@�
check_address�s

zFirewall.check_addresscCs|jj|�dS)N)r6�check_icmptype)r>Zicmpr?r?r@r��szFirewall.check_icmptypecCs>t|t�std|t|�f��t|�dkr:ttjd|��dS)Nz%s is %s, expected intrz#timeout '%d' is not positive number)�
isinstance�int�	TypeError�typer"r!�
INVALID_VALUE)r>Ztimeoutr?r?r@�
check_timeout�s

zFirewall.check_timeoutc Cs`|j}|j}|sNi}x&|jj�D]}|jj|�d||<q W|jj�}|j�}g}x$|jj	�D]}	|j
|jj|	��q^W|s�|jd�|j
�|j�d}
y|jd|d�Wn&tk
r�}z
|}
WYdd}~XnX|�r(xL|D]D}|jj|j�s�x0|jj�D]"}
|
jdk�r�q�|
j|j��q�Wq�W|�s�|j�}||k�r�||k�rRi||<xFt||j��D]2\}}|d�rd||||||<|||=�qdWxb|jj�D]T}||k�r�x.||D]"}|jj|||||d��q�W||=ntjd|��q�Wt|�d	k�r6x(t|j��D]}tjd
|�||=�qW~x�|D]�}|jj|j��r�xx|jD]R}y|jj|j|�Wn6tk
�r�}z|jt j!k�r�|�WYdd}~XnX�qZWn|jj"|�|jj#|j��q>W|jj$|�t%�}|�r,x@|jj�dgD],}x$t&|�D]}|jj|||d��q
W�q�W||_|j�sD|jd
�|
�rVd|_'|
�nd|_'dS)N�
interfacesZDROPT)r�r�r�__default__�senderzNew zone '%s'.rz(Lost zone '%s', zone interfaces dropped.rN)r�r�r�r�)(rDrPr8rz�get_settingsr9Zget_runtime_configr�rr�r�r�r�r�r�r�rnZquery_ipsetr�r�Zset_destroyr��items�change_zone_of_interfacerrVrw�keysZentriesZ	add_entryr"r�r!�ALREADY_ENABLEDr�Zapply_ipsetZ
set_configrrrC)r>r�rDZ	flush_allZ_zone_interfacesr8Z_direct_config�_old_dzZ_ipset_objs�_nameZstart_exceptionr�r�r�Z_new_dz�iface�settingsZinterface_id�entryr�Znm_bus_namer�r?r?r@r��s�









zFirewall.reloadcCs|jS)N)rC)r>r?r?r@�	get_stateaszFirewall.get_statecCsZ|jrttjd��y|jd�Wn.tk
rN}zttj|��WYdd}~XnXd|_dS)Nzpanic mode already enabledZPANICT)rDr"r!r�r�rn�COMMAND_FAILED)r>r�r?r?r@�enable_panic_modefszFirewall.enable_panic_modecCsZ|jsttjd��y|jd�Wn.tk
rN}zttj|��WYdd}~XnXd|_dS)Nzpanic mode is not enabledr�F)rDr"r!ZNOT_ENABLEDr�rnr�)r>r�r?r?r@�disable_panic_modeqszFirewall.disable_panic_modecCs|jS)N)rD)r>r?r?r@�query_panic_mode|szFirewall.query_panic_modecCs|jS)N)rL)r>r?r?r@�get_log_denied�szFirewall.get_log_deniedcCsb|tjkr&ttjd|djtj�f��||j�krR||_|jj	d|�|jj
�nttj|��dS)Nz'%s', choose from '%s'z','rh)rZLOG_DENIED_VALUESr"r!r��joinr�rLr$�set�writeZALREADY_SET)r>r�r?r?r@�set_log_denied�s
zFirewall.set_log_deniedcCs|jS)N)rE)r>r?r?r@r��szFirewall.get_default_zonecCs�|j|�}||jkr�|j}||_|jjd|�|jj�|jj||�|jj|�}x@t|dj	��D]\}}|drd|jj
d|�qdWnttj
|��dS)Nrcr�r�rN)r~rEr$r�r�r8r�r�r�r�r�r"r!ZZONE_ALREADY_SET)r>r8r�r�Z_old_dz_settingsr�r�r?r?r@�set_default_zone�s


zFirewall.set_default_zonecCsH|j�}x:|j�D].\}}|s(t|t�r2|||<q||kr||=qW|S)N)rqr�r��bool)r>Z	permanentZruntimer��keyr�r?r?r@�'combine_runtime_with_permanent_settings�s

z0Firewall.combine_runtime_with_permanent_settingscCsi}i}x�t|j��t|j��BD]�}||kr"t||t�r�t||krN||ng�}tt||�|�||<t|t||�A|@�||<q"t||t�s�t||t�r�||r�||r�d||<q�||r�||r�d||<q"ttjdj	t
||�|���q"W||fS)NTFz Unhandled setting type {} key {})r�r�r�r�r�r�r"r!ZINVALID_SETTING�formatr�)r>Zold_settingsZnew_settingsZadd_settingsZremove_settingsr��oldr?r?r@�get_added_and_removed_settings�s

 z'Firewall.get_added_and_removed_settings)F)FF)F)N)N)N)N)N)F)4�__name__�
__module__�__qualname__rArMr=rZrbr�r�rvr�r�r�rsr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r~r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r?r?r?r@rBsh
(	;
 








 	
s)A�__all__Zos.pathr{rXrqrr�ZfirewallrrZ
firewall.corerrrrr	Zfirewall.core.fw_icmptyper
Zfirewall.core.fw_servicerZfirewall.core.fw_zonerZfirewall.core.fw_directr
Zfirewall.core.fw_configrZfirewall.core.fw_policiesrZfirewall.core.fw_ipsetrZfirewall.core.fw_transactionrZfirewall.core.fw_helperrZfirewall.core.fw_policyrZfirewall.core.fw_nmrrZfirewall.core.loggerrZfirewall.core.io.firewalld_confrZfirewall.core.io.directrZfirewall.core.io.servicerZfirewall.core.io.icmptyperZfirewall.core.io.zonerrZfirewall.core.io.ipsetrZfirewall.core.ipsetrZfirewall.core.io.helperrZfirewall.core.io.policyr r!Zfirewall.errorsr"�objectrr?r?r?r@�<module>sHfw_service.cpython-36.pyc000064400000003201151730727350011334 0ustar003

��gg�@s2dgZddlmZddlmZGdd�de�ZdS)�FirewallService�)�errors)�
FirewallErrorc@sLeZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dS)rcCs||_i|_dS)N)Z_fw�	_services)�self�fw�r� /usr/lib/python3.6/fw_service.py�__init__szFirewallService.__init__cCsd|j|jfS)Nz%s(%r))�	__class__r)rrrr	�__repr__ szFirewallService.__repr__cCs|jj�dS)N)r�clear)rrrr	�cleanup#szFirewallService.cleanupcCst|jj��S)N)�sortedr�keys)rrrr	�get_services(szFirewallService.get_servicescCs||jkrttj|��dS)N)rrrZINVALID_SERVICE)r�servicerrr	�
check_service+s
zFirewallService.check_servicecCs|j|�|j|S)N)rr)rrrrr	�get_service/s
zFirewallService.get_servicecCs||j|j<dS)N)r�name)r�objrrr	�add_service3szFirewallService.add_servicecCs|j|�|j|=dS)N)rr)rrrrr	�remove_service6s
zFirewallService.remove_serviceN)�__name__�
__module__�__qualname__r
rrrrrrrrrrr	rsN)�__all__ZfirewallrZfirewall.errorsr�objectrrrrr	�<module>srich.cpython-36.pyc000064400000050640151730727350010136 0ustar003

��g8��@s�dddddddddd	d
ddd
ddddgZddlmZddlmZddlmZddlmZddlm	Z	Gdd�de
�ZGdd�de
�ZGdd�de
�Z
Gdd�de
�ZGdd�de�ZGdd�de
�ZGdd�de
�ZGdd�de
�ZGd d�de
�ZGd!d	�d	e
�ZGd"d
�d
e
�ZGd#d�de
�ZGd$d�de
�ZGd%d
�d
e
�ZGd&d�de�ZGd'd�de
�Zd(d)d/d1d+�ZGd,d�de
�ZGd-d�de
�Zd.S)2�Rich_Source�Rich_Destination�Rich_Service�	Rich_Port�
Rich_Protocol�Rich_Masquerade�Rich_IcmpBlock�
Rich_IcmpType�Rich_SourcePort�Rich_ForwardPort�Rich_Log�
Rich_Audit�Rich_Accept�Rich_Reject�	Rich_Drop�	Rich_Mark�
Rich_Limit�	Rich_Rule�)�	functions)�check_ipset_name)�REJECT_TYPES)�errors)�
FirewallErrorc@seZdZddd�Zdd�ZdS)rFcCs�||_|jdkrd|_||_|jdks0|jdkr8d|_n|jdk	rN|jj�|_||_|jdkrdd|_||_|jdkr�|jdkr�|jdkr�ttjd��dS)N�zno address, mac and ipset)�addr�mac�upper�ipset�invertrr�INVALID_RULE)�selfrrrr�r!�/usr/lib/python3.6/rich.py�__init__$s


zRich_Source.__init__cCsjd|jrdnd}|jdk	r*|d|jS|jdk	rB|d|jS|jdk	rZ|d|jSttjd��dS)Nz	source%s z NOTrzaddress="%s"zmac="%s"z
ipset="%s"zno address, mac and ipset)rrrrrrr)r �retr!r!r"�__str__5s


zRich_Source.__str__N)F)�__name__�
__module__�__qualname__r#r%r!r!r!r"r#s
c@seZdZddd�Zdd�ZdS)rFcCsV||_|jdkrd|_||_|jdkr,d|_||_|jdkrR|jdkrRttjd��dS)Nrzno address and ipset)rrrrrr)r rrrr!r!r"r#Bs

zRich_Destination.__init__cCsRd|jrdnd}|jdk	r*|d|jS|jdk	rB|d|jSttjd��dS)Nzdestination%s z NOTrzaddress="%s"z
ipset="%s"zno address and ipset)rrrrrr)r r$r!r!r"r%Ns

zRich_Destination.__str__N)F)r&r'r(r#r%r!r!r!r"rAs
c@seZdZdd�Zdd�ZdS)rcCs
||_dS)N)�name)r r)r!r!r"r#YszRich_Service.__init__cCs
d|jS)Nzservice name="%s")r))r r!r!r"r%\szRich_Service.__str__N)r&r'r(r#r%r!r!r!r"rXsc@seZdZdd�Zdd�ZdS)rcCs||_||_dS)N)�port�protocol)r r*r+r!r!r"r#`szRich_Port.__init__cCsd|j|jfS)Nzport port="%s" protocol="%s")r*r+)r r!r!r"r%dszRich_Port.__str__N)r&r'r(r#r%r!r!r!r"r_sc@seZdZdd�ZdS)r	cCsd|j|jfS)Nz#source-port port="%s" protocol="%s")r*r+)r r!r!r"r%hszRich_SourcePort.__str__N)r&r'r(r%r!r!r!r"r	gsc@seZdZdd�Zdd�ZdS)rcCs
||_dS)N)�value)r r,r!r!r"r#mszRich_Protocol.__init__cCs
d|jS)Nzprotocol value="%s")r,)r r!r!r"r%pszRich_Protocol.__str__N)r&r'r(r#r%r!r!r!r"rlsc@seZdZdd�Zdd�ZdS)rcCsdS)Nr!)r r!r!r"r#tszRich_Masquerade.__init__cCsdS)N�
masquerader!)r r!r!r"r%wszRich_Masquerade.__str__N)r&r'r(r#r%r!r!r!r"rssc@seZdZdd�Zdd�ZdS)rcCs
||_dS)N)r))r r)r!r!r"r#{szRich_IcmpBlock.__init__cCs
d|jS)Nzicmp-block name="%s")r))r r!r!r"r%~szRich_IcmpBlock.__str__N)r&r'r(r#r%r!r!r!r"rzsc@seZdZdd�Zdd�ZdS)rcCs
||_dS)N)r))r r)r!r!r"r#�szRich_IcmpType.__init__cCs
d|jS)Nzicmp-type name="%s")r))r r!r!r"r%�szRich_IcmpType.__str__N)r&r'r(r#r%r!r!r!r"r�sc@seZdZdd�Zdd�ZdS)r
cCs<||_||_||_||_|jdkr(d|_|jdkr8d|_dS)Nr)r*r+�to_port�
to_address)r r*r+r.r/r!r!r"r#�s

zRich_ForwardPort.__init__cCs<d|j|j|jdkrd|jnd|jdkr4d|jndfS)Nz(forward-port port="%s" protocol="%s"%s%srz
 to-port="%s"z
 to-addr="%s")r*r+r.r/)r r!r!r"r%�szRich_ForwardPort.__str__N)r&r'r(r#r%r!r!r!r"r
�sc@seZdZddd�Zdd�ZdS)rNcCs||_||_||_dS)N)�prefix�level�limit)r r0r1r2r!r!r"r#�szRich_Log.__init__cCs>d|jrd|jnd|jr$d|jnd|jr6d|jndfS)Nz	log%s%s%sz prefix="%s"rz level="%s"z %s)r0r1r2)r r!r!r"r%�szRich_Log.__str__)NNN)r&r'r(r#r%r!r!r!r"r�s
c@seZdZddd�Zdd�ZdS)rNcCs
||_dS)N)r2)r r2r!r!r"r#�szRich_Audit.__init__cCsd|jrd|jndS)Nzaudit%sz %sr)r2)r r!r!r"r%�szRich_Audit.__str__)N)r&r'r(r#r%r!r!r!r"r�s
c@seZdZddd�Zdd�ZdS)r
NcCs
||_dS)N)r2)r r2r!r!r"r#�szRich_Accept.__init__cCsd|jrd|jndS)Nzaccept%sz %sr)r2)r r!r!r"r%�szRich_Accept.__str__)N)r&r'r(r#r%r!r!r!r"r
�s
c@s&eZdZddd�Zdd�Zdd�ZdS)	rNcCs||_||_dS)N)�typer2)r Z_typer2r!r!r"r#�szRich_Reject.__init__cCs,d|jrd|jnd|jr$d|jndfS)Nz
reject%s%sz
 type="%s"rz %s)r3r2)r r!r!r"r%�szRich_Reject.__str__cCsT|jrP|sttjd��|dkrP|jt|krPdjt|�}ttjd|j|f��dS)Nz9When using reject type you must specify also rule family.�ipv4�ipv6z, z%Wrong reject type %s.
Use one of: %s.)r4r5)r3rrrr�join)r �familyZvalid_typesr!r!r"�check�szRich_Reject.check)NN)r&r'r(r#r%r8r!r!r!r"r�s
c@seZdZdd�ZdS)rcCsd|jrd|jndS)Nzdrop%sz %sr)r2)r r!r!r"r%�szRich_Drop.__str__N)r&r'r(r%r!r!r!r"r�sc@s&eZdZddd�Zdd�Zdd�ZdS)	rNcCs||_||_dS)N)�setr2)r Z_setr2r!r!r"r#�szRich_Mark.__init__cCsd|j|jrd|jndfS)Nz
mark set=%s%sz %sr)r9r2)r r!r!r"r%�szRich_Mark.__str__cCs�|jdk	r|j}nttjd��d|krv|jd�}t|�dkrHttj|��tj|d�shtj|d�r�ttj|��ntj|�s�ttj|��dS)Nzno value set�/�r�)r9rrZINVALID_MARK�split�lenrZcheckUINT32)r �x�splitsr!r!r"r8�s


zRich_Mark.check)N)r&r'r(r#r%r8r!r!r!r"r�s
r<�<�)�s�m�h�dc@s�eZdZddd�Zdd�Zedd��Zejdd��Zed	d
��Zejdd
��Ze	dd
��Z
dd�Ze	dd��Zdd�Z
dd�ZdS)rNcCs||_||_dS)N)r,�burst)r r,rGr!r!r"r#�szRich_Limit.__init__cCs|j�|j�dS)N)�value_parse�burst_parse)r r!r!r"r8�szRich_Limit.checkcCs|jS)N)�_value)r r!r!r"r,�szRich_Limit.valuecCsf|dkrd|_dSy|j|�\}}Wntk
r<|}YnX|�d|��}t|dd�|krb||_dS)Nr:rJ)rJ�_value_parser�getattr)r r,�rate�duration�vr!r!r"r,�s
cCs|jS)N)�_burst)r r!r!r"rGszRich_Limit.burstcCs\|dkrd|_dSy|j|�}Wntk
r8|}Yn
Xt|�}t|dd�|krX||_dS)NrP)rP�_burst_parser�strrL)r rG�br!r!r"rGs
cCs�d}d|kr|jd�}|s(t|�dkr4ttj|��|\}}yt|�}Wnttj|��YnX|dkrv|dd�}|dks�|dkr�ttj|��dt||d
kr�ttjd|f��|dkr�|dkr�ttjd|f��||fS)Nr:r;�second�minute�hour�dayr<rCrDrErFi'rz%s too fastz%s too slow)rTrUrVrW)rCrDrErF)r=r>rr�
INVALID_LIMIT�int�DURATION_TO_MULT)r,r@rMrNr!r!r"rKs&
zRich_Limit._value_parsecCs|j|j�S)N)rKrJ)r r!r!r"rH:szRich_Limit.value_parsec	CsR|dkrdSyt|�}Wnttj|��YnX|dksB|dkrNttj|��|S)Nr<i���)rYrrrX)rGrSr!r!r"rQ=szRich_Limit._burst_parsecCs|j|j�S)N)rQrP)r r!r!r"rIKszRich_Limit.burst_parsecCs,d|j�d�}|jdk	r(|d|j��7}|S)Nz
limit value="�"z burst=)rJrP)r rCr!r!r"r%Ns
zRich_Limit.__str__)N)r&r'r(r#r8�propertyr,�setterrG�staticmethodrKrHrQrIr%r!r!r!r"r�s
c@s>eZdZdZdZddd�Zdd�Zd	d
�Zdd�Zd
d�Z	dS)ri�i�NrcCsV|dk	rt|�|_nd|_||_d|_d|_d|_d|_d|_d|_|rR|j	|�dS)N)
rRr7�priority�source�destination�element�log�audit�action�_import_from_string)r r7�rule_strr_r!r!r"r#XszRich_Rule.__init__cCs�g}x|tj|�D]n}d|krp|jd�}t|�dksF|dsF|drVttjd|��|j|d|dd��q|jd|i�qW|jddi�|S)	z Lexical analysis �=r;rr<zinternal error in _lexer(): %s)�	attr_name�
attr_valuerb�EOL)rZ	splitArgsr=r>rrr�append)r rg�tokens�r�attrr!r!r"�_lexeris
 
zRich_Rule._lexercCs�|sttjd��tj|�}d|_d|_d|_d|_d|_	d|_
d|_d|_|j
|�}|rv|djd�dkrvttjd��i}g}d}�x`||jd�dko�|dgk�s�||jd�}||jd�}||jd�}|�r�|dHk�r�ttjd|���n�|dIk�r�|dk�r|j�rttjd+��n�|dk�r<|j�r<ttjd,��n�|dJk�rf|j	�rfttjd-||j	f��nh|d"k�r�|j
�r�ttjd.��nH|d#k�r�|j�r�ttjd/��n(|dKk�r�|j�r�ttjd0||jf��nttjd1|��t|�dk�r�|t|�d2nd3}	|	d3k�r�|�r`|�r`|d	k�r2ttjd4��n,|dk�rJttjd5��nttjd6||f��n*d|k�r�ttjd7||f��n
|jd��nL|	dk�rD|d	k�r�|dLk�r�ttjd:|��||_n||dk�ryt|�|_Wn&tk
�rttjd;|��YnXn:|�r6|dk�rd<}
nd=||f}
ttj|
��n
|j|��n�|	dk�r�|dMk�rb|||<nV|dNk�rvd>|d
<nBt|jd
�|jd�|jd�|jd
d?��|_|j�|j�|d2}�n|	dk�r,|dOk�r�|||<nN|dPk�r�d>|d
<n:t|jd
�|jd�|jd
d?��|_|j�|j�|d2}�n�|	dk�rd|dk�rTt|�|_	|j�nttjd@���nv|	dk�r�|dk�r�t|�|_	|j�nttjdA���n>|	dk�r�|dQk�r�|||<n0t|jd�|jd��|_	|j�|j�|d2}�n�|	dk�r&|dk�rt|�|_	|j�nttjdB���n�|	dk�r^|dk�rNt|�|_	|j�nttjdC���n||	dk�r�t�|_	|j�|j�|d2}�nN|	d k�r�|dRk�r�|||<n@t|jd�|jd�|jd�|jd��|_	|j�|j�|d2}�n�|	d!k�r@|dSk�r|||<n0t|jd�|jd��|_	|j�|j�|d2}�n�|	d"k�r�|dTk�r^|||<nN|d(k�rt|jd(�n8t |jd�|jd�|jd(��|_
|j�|j�|d2}�n*|	d#k�r�|d(k�r�|jd(�n(t!|jd(��|_|j�|j�|d2}�n�|	d$k�rH|d(k�r|jd(�n(t"|jd(��|_|j�|j�|d2}�n�|	d%k�r�|d(k�rh|jd(�n(t#|jd(��|_|j�|j�|d2}�nF|	d&k�r�|dk�r�|||<nF|d(k�r�|jd(�n0t$|jd�|jd(��|_|j�|j�|d2}n�|	d'k�r`|dk�r|||<nF|d(k�r.|jd(�n0t%|jd�|jd(��|_|j�|j�|d2}nz|	d(k�r�|dUk�r�||dD|��<nVdE|k�r�ttjdF��t&|dE|jdG��|d(<|jdEd�|jdGd�|j�|d2}|d2}q�W|j'�dS)VNz
empty rulerrbrk�rulerirjr_r7�addressrrrr,r*r+�to-port�to-addrr)r0r1r3r9rGzbad attribute '%s'r`ra�service�
icmp-block�	icmp-typer-�forward-port�source-portrcrd�accept�drop�reject�markr2�not�NOTzmore than one 'source' elementz#more than one 'destination' elementzFmore than one element. There cannot be both '%s' and '%s' in one rule.zmore than one 'log' elementzmore than one 'audit' elementzOmore than one 'action' element. There cannot be both '%s' and '%s' in one rule.zunknown element %sr<rz0'family' outside of rule. Use 'rule family=...'.z4'priority' outside of rule. Use 'rule priority=...'.z:'%s' outside of any element. Use 'rule <element> %s= ...'.z,'%s' outside of rule. Use 'rule ... %s ...'.r4r5zH'family' attribute cannot have '%s' value. Use 'ipv4' or 'ipv6' instead.z(invalid 'priority' attribute value '%s'.zdwrong 'protocol' usage. Use either 'rule protocol value=...' or  'rule [forward-]port protocol=...'.zDattribute '%s' outside of any element. Use 'rule <element> %s= ...'.TFzinvalid 'protocol' elementzinvalid 'service' elementzinvalid 'icmp-block' elementzinvalid 'icmp-type' elementzlimit.zlimit.valuezinvalid 'limit' elementzlimit.burst)r_r7rrrrrr,r*r+rsrtr)r0r1r3r9rG)rqr`rar+rur*rvrwr-rxryrcrdrzr{r|r}r2r~rrk)r+rur*rvrwr-rxry)rzr{r|r})r4r5)rrrrr)r~r)rrrr)r~r)r*r+)r*r+rsrt)r*r+)r0r1)r,rG)(rrrrZstripNonPrintableCharactersr_r7r`rarbrcrdrerp�getr>rlrY�
ValueError�INVALID_PRIORITYr�pop�clearrrrrrrrr
r	rrr
rrrrr8)r rgrmZattrsZin_elements�indexrbrirjZ
in_elementZerr_msgr!r!r"rfzs�

""













*




"






















(






 




















zRich_Rule._import_from_stringc	Cs`|jdk	r"|jd kr"ttj|j��|jdkrn|jdk	rB|jjdk	sL|jdk	rVttj��t|j	�t
krnttj��|j|jks�|j|j
kr�ttjd|j|j
f��|j	dko�|jdks�|jdk	o�|jdk�r
|jdkr�ttjd��|jdko�|jdko�|jdk�r
ttjd��t|j	�tt
tgk�rP|jdk�rP|jdk�rP|jdk�rPttjd��|jdk	�rj|jjdk	�r�|jdk�r�ttj��|jjdk	�r�ttjd��|jjdk	�r�ttjd	��tj|j|jj��sjttjt|jj���n�|jjdk	�r,|jjdk	�rttjd
��tj|jj��sjttjt|jj���n>|jjdk	�r^t|jj��sjttjt|jj���nttjd��|jdk	�r|jjdk	�r�|jdk�r�ttj��|jjdk	�r�ttjd	��tj|j|jj��sttjt|jj���n>|jjdk	�rt|jj��sttjt|jj���nttjd��t|j	�t k�rd|j	j!dk�sLt"|j	j!�d
k�r`ttj#t|j	j!����n�t|j	�t$k�r�tj%|j	j&��s�ttj'|j	j&��|j	j(d!k�r`ttj)|j	j(���n�t|j	�t*k�r�tj+|j	j,��s`ttj)|j	j,���nvt|j	�tk�r<|jdk	�rttjd��|jdk	�r`|jjdk	�r`ttjd���n$t|j	�tk�r�|j	j!dk�slt"|j	j!�d
k�r�ttj-t|j	j!���|j�r`ttjd���n�t|j	�t.k�r�|j	j!dk�s�t"|j	j!�d
k�r`ttj-t|j	j!����n�t|j	�t
k�r�tj%|j	j&��sttj'|j	j&��|j	j(d"k�r.ttj)|j	j(��|j	j/dk�rZ|j	j0dk�rZttj'|j	j/��|j	j/dk�r�tj%|j	j/��r�ttj'|j	j/��|j	j0dk�r�tj1|j|j	j0��r�ttj|j	j0��|jdk�r�ttj��|jdk	�r`ttjd��nrt|j	�t2k�r>tj%|j	j&��sttj'|j	j&��|j	j(d#k�r`ttj)|j	j(��n"|j	dk	�r`ttjdt|j	���|jdk	�r�|jj3�r�|jj3d$k�r�ttj4|jj3��|jj5dk	�r�|jj5j6�|jdk	�r�t|j�t7t8t9gk�r�ttj:t|j���|jj5dk	�r�|jj5j6�|jdk	�r\t|j�t8k�r(|jj6|j�nt|j�t;k�rB|jj6�|jj5dk	�r\|jj5j6�dS)%Nr4r5z/'priority' attribute must be between %d and %d.rzno element, no actionz%no element, no source, no destinationzno action, no log, no auditzaddress and maczaddress and ipsetz
mac and ipsetzinvalid sourcezinvalid destinationr<�tcp�udp�sctp�dccpzmasquerade and actionzmasquerade and mac sourcezicmp-block and actionrzforward-port and actionzUnknown element %s�emerg�alert�crit�error�warning�notice�info�debug)r4r5)r�r�r�r�)r�r�r�r�)r�r�r�r�)r�r�r�r�r�r�r�r�)<r7rrZINVALID_FAMILYr`rraZMISSING_FAMILYr3rbr
r_�priority_min�priority_maxr�rcrerrrrdrrrZ
check_addressZINVALID_ADDRrRZ	check_macZINVALID_MACrZ
INVALID_IPSETZINVALID_DESTINATIONrr)r>ZINVALID_SERVICErZ
check_portr*ZINVALID_PORTr+ZINVALID_PROTOCOLrZ
checkProtocolr,ZINVALID_ICMPTYPErr.r/Zcheck_single_addressr	r1ZINVALID_LOG_LEVELr2r8r
rrZINVALID_AUDIT_TYPEr)r r!r!r"r8hs�




 
 



   


zRich_Rule.checkcCs�d}|jr|d|j7}|jr,|d|j7}|jr@|d|j7}|jrT|d|j7}|jrh|d|j7}|jr||d|j7}|jr�|d|j7}|jr�|d|j7}tj	r�tj
|�S|S)Nrqz priority="%d"z family="%s"z %s)r_r7r`rarbrcrdrerZPY2Zu2b)r r$r!r!r"r%s$zRich_Rule.__str__i���)NNr)
r&r'r(r�r�r#rprfr8r%r!r!r!r"rTs
o-Nii�i�Q)�__all__ZfirewallrZfirewall.core.ipsetrZfirewall.core.baserrZfirewall.errorsr�objectrrrrr	rrrrr
rrr
rrrrZrrr!r!r!r"�<module>s@
dmodules.cpython-36.opt-1.pyc000064400000005500151730727350011613 0ustar003

��g��@sBdZdgZddlmZddlmZddlmZGdd�de�Z	dS)zmodules backend�modules�)�runProg)�log)�COMMANDSc@sLeZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dS)rcCstd|_td|_dS)NZmodprobeZrmmod)r�
_load_command�_unload_command)�self�r	�/usr/lib/python3.6/modules.py�__init__s
zmodules.__init__cCs
d|jS)Nz%s)�	__class__)rr	r	r
�__repr__$szmodules.__repr__cCs�g}i}y�tdd��p}xh|D]`}|s&P|j�}|j�}|j|d�|ddkrp|djd�dd	�||d<qg||d<qWWdQRXWntk
r�YnX||fS)
z6 get all loaded kernel modules and their dependencies z
/proc/modules�rr��-�,N����)�open�strip�split�append�FileNotFoundError)r�mods�deps�f�lineZsplitsr	r	r
�loaded_modules's 
 zmodules.loaded_modulescCs"tjd|j|j|�t|j|g�S)Nz	%s: %s %s)r�debug2rrr)r�moduler	r	r
�load_module<szmodules.load_modulecCs"tjd|j|j|�t|j|g�S)Nz	%s: %s %s)rrrrr)rrr	r	r
�
unload_module@szmodules.unload_modulecCsT||krdSx0||D]$}|j|||�||kr|j|�qW||krP|j|�dS)z  get all dependants of a module N)�get_depsr)rrr�ret�modr	r	r
r"Dszmodules.get_depscCs�g}|j�\}}|jd||�x*dD]"}||kr$|j|�|jd|�q$Wx^|D]V}|dks�|jd�s�|jd	�s�|jd
�s�|jd�s�|jd�s�|jd
�rP|j|||�qPW|S)z) get all loaded firewall-related modules Znf_conntrack�nf_conntrack_ipv4�nf_conntrack_ipv6r�	ip_tables�
ip6_tables�ebtablesZiptable_Z	ip6table_Znf_Zxt_Zipt_Zip6t_)r%r&r)r'r(r))rr"�remove�insert�
startswith)rrZmods2rZbad_bad_moduler$r	r	r
�get_firewall_modulesOs


zmodules.get_firewall_modulescCs>x8|j�D],}|j|�\}}|dkr
tjd||f�q
WdS)z% unload all firewall-related modules rz Failed to unload module '%s': %sN)r-r!rZdebug1)rrZstatusr#r	r	r
�unload_firewall_modulesdszmodules.unload_firewall_modulesN)�__name__�
__module__�__qualname__rr
rr r!r"r-r.r	r	r	r
rsN)
�__doc__�__all__Zfirewall.core.progrZfirewall.core.loggerrZfirewall.configr�objectrr	r	r	r
�<module>s
fw_policies.cpython-36.opt-1.pyc000064400000004432151730727350012451 0ustar003

��g�
�@sVdgZddlmZddlmZddlmZddlmZddlm	Z	Gdd�de
�ZdS)	�FirewallPolicies�)�config)�log)�LockdownWhitelist)�errors)�
FirewallErrorc@sDeZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dS)rcCsd|_ttj�|_dS)NF)�	_lockdownrrZLOCKDOWN_WHITELIST�lockdown_whitelist)�self�r�!/usr/lib/python3.6/fw_policies.py�__init__szFirewallPolicies.__init__cCsd|j|j|jfS)Nz
%s(%r, %r))�	__class__rr	)r
rrr�__repr__#s
zFirewallPolicies.__repr__cCsd|_|jj�dS)NF)rr	�cleanup)r
rrrr'szFirewallPolicies.cleanupcCs�|dkr2tjd|�|jj|�r�tjd�dSn�|dkrdtjd|�|jj|�r�tjd�dSnb|dkr�tjd	|�|jj|�r�tjd
�dSn0|dkr�tjd|�|jj|�r�tjd
�dSdS)N�contextz#Doing access check for context "%s"zcontext matches.TZuidzDoing access check for uid %dzuid matches.�userz Doing access check for user "%s"z
user matches.Zcommandz#Doing access check for command "%s"zcommand matches.F)rZdebug2r	Z
match_contextZdebug3Z	match_uidZ
match_userZ
match_command)r
�key�valuerrr�access_check-s*



zFirewallPolicies.access_checkcCs|jrttjd��d|_dS)Nzenable_lockdown()T)rrrZALREADY_ENABLED)r
rrr�enable_lockdownDsz FirewallPolicies.enable_lockdowncCs|jsttjd��d|_dS)Nzdisable_lockdown()F)rrrZNOT_ENABLED)r
rrr�disable_lockdownIsz!FirewallPolicies.disable_lockdowncCs|jS)N)r)r
rrr�query_lockdownNszFirewallPolicies.query_lockdownN)
�__name__�
__module__�__qualname__r
rrrrrrrrrrrsN)�__all__ZfirewallrZfirewall.core.loggerrZ#firewall.core.io.lockdown_whitelistrrZfirewall.errorsr�objectrrrrr�<module>sfw_zone.cpython-36.opt-1.pyc000064400000077522151730727350011627 0ustar003

��gy��@s�ddlZddlZddlmZmZmZddlmZddlm	Z	ddl
mZddlm
Z
mZmZmZmZmZmZmZmZddlmZmZmZddlmZdd	lmZdd
lmZGdd�de �Z!dS)
�N)�	SHORTCUTS�DEFAULT_ZONE_TARGET�SOURCE_IPSET_TYPES)�FirewallTransaction)�Policy)�log)	�Rich_Service�	Rich_Port�
Rich_Protocol�Rich_SourcePort�Rich_ForwardPort�Rich_IcmpBlock�
Rich_IcmpType�Rich_Masquerade�	Rich_Mark)�checkIPnMask�
checkIP6nMask�	check_mac)�errors)�
FirewallError)�LastUpdatedOrderedDictc@sNeZdZdZdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zd�dd �Zd!d"�Zd#d$�Zd%d&�Zd�d'd(�Zd)d*�Zd+d,�Zd-d.�Zd�d/d0�Zd�d1d2�Zd3d4�Zd5d6�Zd7d8�Zd9d:�Zd;d<�Z d=d>�Z!d�d@dA�Z"dBdC�Z#d�dDdE�Z$d�dFdG�Z%d�dHdI�Z&dJdK�Z'dLdM�Z(dNdO�Z)d�dQdR�Z*d�dSdT�Z+d�dUdV�Z,dWdX�Z-d�dYdZ�Z.d�d[d\�Z/d]d^�Z0d_d`�Z1dadb�Z2d�dcdd�Z3dedf�Z4dgdh�Z5didj�Z6dkdl�Z7dmdn�Z8dodp�Z9d�dqdr�Z:dsdt�Z;dudv�Z<dwdx�Z=d�dydz�Z>d{d|�Z?d}d~�Z@dd��ZAd�d�d��ZBd�d��ZCd�d��ZDd�d��ZEd�d��ZFd�d�d��ZGd�d��ZHd�d��ZId�d��ZJd�d�d��ZKd�d��ZLd�d��ZMd�d��ZNd�d�d��ZOd�d��ZPd�d��ZQd�d�d��ZRd�d�d��ZSd�d�d��ZTd�d��ZUd�d�d��ZVd�d��ZWd�d��ZXd�d��ZYd�d�d��ZZd�d��Z[d�d��Z\d�d��Z]d�d��Z^d�d��Z_d�d�d��Z`d�d��Zad�d�d„Zbd�dĄZcd�dƄZddS)��FirewallZonercCs||_i|_i|_dS)N)�_fw�_zones�_zone_policies)�self�fw�r�/usr/lib/python3.6/fw_zone.py�__init__&szFirewallZone.__init__cCsd|j|jfS)Nz%s(%r))�	__class__r)rrrr�__repr__+szFirewallZone.__repr__cCs|jj�|jj�dS)N)r�clearr)rrrr�cleanup.s
zFirewallZone.cleanupcCs
t|j�S)N)rr)rrrr�new_transaction2szFirewallZone.new_transactioncCsdj||d�S)Nzzone_{fromZone}_{toZone})�fromZone�toZone)�format)rr%r&rrr�policy_name_from_zones5sz#FirewallZone.policy_name_from_zonescCst|jj��S)N)�sortedr�keys)rrrr�	get_zones:szFirewallZone.get_zonescCs8g}x.|j�D]"}|j|�s&|j|�r|j|�qW|S)N)r+�list_interfaces�list_sources�append)rZactive_zones�zonerrr�get_active_zones=s
zFirewallZone.get_active_zonescCs6|j|�}x&|jD]}||j|jdkr|SqWdS)N�
interfaces)�_FirewallZone__interface_idr�settings)r�	interface�interface_idr/rrr�get_zone_of_interfaceDs

z"FirewallZone.get_zone_of_interfacecCs6|j|�}x&|jD]}||j|jdkr|SqWdS)N�sources)�_FirewallZone__source_idrr3)r�source�	source_idr/rrr�get_zone_of_sourceLs

zFirewallZone.get_zone_of_sourcecCs|jj|�}|j|S)N)r�
check_zoner)rr/�zrrr�get_zoneTszFirewallZone.get_zonecCsBt�}|j|_|j||�|_|j|_|j|_|g|_|g|_�x�dD�]�}||jkr~|d	kr~|dkr~t	||t
jt||���qD|d
kr�||jkr�|d
kr�t	||t
jt||���qD||jko�|d
ko�|dk�r�t	||t
jt||���qD|dkrDg|_
xB|j
D]8}|j||�}||j|j|�k�r�|j
jt
j|���q�WqDW|S)N�services�ports�
masquerade�
forward_ports�source_ports�icmp_blocks�rules�	protocols�HOST�ANY)r?r@rArBrCrDrErF)r?r@rCrDrF)rA)rDrB)rE)r�nameZderived_from_zoner(�ZONE_POLICY_PRIORITYZpriority�targetZ
ingress_zonesZegress_zones�setattr�copy�deepcopy�getattrrE�_rich_rule_to_policiesr.)r�z_objr%r&�p_objZsetting�ruleZcurrent_policyrrr�policy_obj_from_zone_objXs6

z%FirewallZone.policy_obj_from_zone_objcCs�dd�d	D�|_||j|j<g|j|j<xX|jdfd|jf|jdfgD]8\}}|j|||�}|jjj|�|j|jj|j�qFW|j	|j�dS)
NcSsi|]}t�|�qSr)r)�.0�xrrr�
<dictcomp>sz)FirewallZone.add_zone.<locals>.<dictcomp>r1r7�icmp_block_inversion�forwardrGrH)r1r7rXrY)
r3rrIrrTr�policyZ
add_policyr.�copy_permanent_to_runtime)r�objr%r&rRrrr�add_zone~s

zFirewallZone.add_zonecCsn|j|}x|jD]}|j||dd�qWx|jD]}|j||dd�q2W|jrZ|j|�|jrj|j|�dS)NF)�allow_apply)	rr1�
add_interfacer7�
add_sourcerY�add_forwardrX�add_icmp_block_inversion)rr/r\�argrrrr[�s

z&FirewallZone.copy_permanent_to_runtimecCs8|j|}|jr|j|�|jj�|j|=|j|=dS)N)r�applied�unapply_zone_settingsr3r"r)rr/r\rrr�remove_zone�s


zFirewallZone.remove_zoneNcCsVxP|j�D]D}|j|}t|j�dks4t|j�dkr
tjd|�|j||d�q
WdS)NrzApplying zone '%s')�use_transaction)r+r�lenr1r7r�debug1�apply_zone_settings)rrgr/rQrrr�apply_zones�s

zFirewallZone.apply_zonescCs|j|}||_dS)N)rrd)rr/rdr\rrr�set_zone_applied�s
zFirewallZone.set_zone_appliedcCs�d|krdS|jd�}t|�dkr&dSd}x tD]}|dt|kr0|}q0W|dk	r�|d|j�krhdSt|�dks�t|�dkr�|ddkr�|d|fSdS)N�_�r���prer�deny�allow�post)rqrrrrsrt)�splitrhrr+)r�chainZsplits�_chainrVrrr�zone_from_chain�s 

zFirewallZone.zone_from_chaincCst|j|�}|dkrdS|\}}|d	kr0|}d}n4|d
krB|}d}n"|dkrTd}|}nttjd|��|j||�|fS)N�
PREROUTING�
FORWARD_INrH�INPUTrG�POSTROUTING�FORWARD_OUTz&chain '%s' can't be mapped to a policy)ryrz)r{)r|r})rxrrZ
INVALID_CHAINr()rrvrVr/rwr%r&rrr�policy_from_chain�s
zFirewallZone.policy_from_chainc	Csj|dkrf|j|�}|dk	rf|j|�\}}|dkr:|j�}n|}|jjj|d|||�|dkrf|jd�dS)N�ipv4�ipv6T)rr�)r~r$rrZZgen_chain_rules�execute)	r�ipv�tablervrgrVrZrw�transactionrrr�create_zone_base_by_chain�s

z&FirewallZone.create_zone_base_by_chaincCstj�||d�}|S)N)Zdate�sender�timeout)�time)rr�r��retrrrZ__gen_settings�szFirewallZone.__gen_settingscCs|j|�jS)N)r>r3)rr/rrr�get_settings�szFirewallZone.get_settingscCs�|j|�}x�|D]z}xt||D]h}|dkr<|j||||�q|dkr`|j|||d|d|�q|dkrlqq|dkrvqtjd|||�qWqW|r�|j|||�dS)Nr1r7rrorXrYz3Zone '%s': Unknown setting '%s:%s', unable to apply)r��
_interface�_sourcerZwarning�_icmp_block_inversion)r�enabler/r�r3�key�argsrrr�_zone_settingss

zFirewallZone._zone_settingscCs�|jj|�}|j|}|jr dSd|_|dkr8|j�}n|}x2|j|D]$}tjd||�|jjj	||d�qHW|j
d||�|dkr�|jd�dS)NTz+Applying policy (%s) derived from zone '%s')rg)rr<rrdr$rrrirZ�apply_policy_settingsr�r�)rr/rg�_zoner\r�rZrrrrjs

z FirewallZone.apply_zone_settingscCs�|jj|�}|j|}|js dS|dkr2|j�}n|}x$|j|D]}|jjj||d�qBW|jd||�|dkr||j	d�dS)N)rgFT)
rr<rrdr$rrZ�unapply_policy_settingsr�r�)rr/rgr�r\r�rZrrrre,s

z"FirewallZone.unapply_zone_settingscCs~|j|�}|j|�}g}x\td�D]P}|j|d|krZ|jtjt||j|d���q"|j||j|d�q"Wt|�S)zH
        :return: exported config updated with runtime settings
        �r)	r>�get_config_with_settings_dict�rangeZIMPORT_EXPORT_STRUCTUREr.rMrNrO�tuple)rr/r\Z	conf_dictZ	conf_list�irrr�get_config_with_settings?s

"z%FirewallZone.get_config_with_settingsc
Cs�|j|�j�}|dtkr"d|d<|j|�|j|�|j|�|j|�|j|�|j|�|j	|�|j
|�|j|�|j|�|j
|�|j|�d�}|jj||�S)zH
        :return: exported config updated with runtime settings
        rK�default)r?r@rDrArBr1r7�	rules_strrFrCrXrY)r>Zexport_config_dictr�
list_services�
list_ports�list_icmp_blocks�query_masquerade�list_forward_portsr,r-�
list_rules�list_protocols�list_source_ports�query_icmp_block_inversion�
query_forwardrZ'combine_runtime_with_permanent_settings)rr/Z	permanentZruntimerrrr�Os z*FirewallZone.get_config_with_settings_dictc
sddlm�d��fdd�	}��fdd�}�j�jf�j�jf�j�jf�j�j	f�j
�jf�j�j
f�j�jf||f�j�jf�j�jf�j�jf�j�jfd�}�j|�}�jj||�\}}	xv|	D]n}
t|	|
t��r$xX|	|
D]:}t|t��r||
d|f|��q�||
d||�q�Wq�||
d|�q�Wx�|D]�}
t||
t��r�x�||
D]l}|
dk�r�||
d|||d�nDt|t��r�||
d|f|�d|d��n||
d||d|d��q\Wn6|
dk�r�||
d||d�n||
d|d|d��q>WdS)Nr)�	Rich_Rulecs�j|�|d�d|d�dS)N)�rule_strr)r�r�)�add_rule)r/r�r�r�)r�rrr�add_rule_wrapperhszDFirewallZone.set_config_with_settings_dict.<locals>.add_rule_wrappercs�j|�|d��dS)N)r�)�remove_rule)r/r�)r�rrr�remove_rule_wrapperjszGFirewallZone.set_config_with_settings_dict.<locals>.remove_rule_wrapper)r?r@rDrArBr1r7r�rFrCrXrYror1r7)r�)r�r�rX)rN)r1r7)rX)�firewall.core.richr��add_service�remove_service�add_port�remove_port�add_icmp_block�remove_icmp_block�add_masquerade�remove_masquerade�add_forward_port�remove_forward_portr_�remove_interfacer`�
remove_source�add_protocol�remove_protocol�add_source_port�remove_source_portrb�remove_icmp_block_inversionra�remove_forwardr�rZget_added_and_removed_settings�
isinstance�listr�)rr/r3r�r�r�Z
setting_to_fnZold_settingsZadd_settingsZremove_settingsr�r�r)r�rr�set_config_with_settings_dictesF













  
z*FirewallZone.set_config_with_settings_dictcCs|jj|�dS)N)r�check_interface)rr4rrrr��szFirewallZone.check_interfacecCs\|jj|�}|j|}|j|�}||jdkrX|jd|}d|krX|ddk	rX|dSdS)Nr1r�)rr<rr2r3)rr/r4r��_objr5r3rrr�interface_get_sender�s

z!FirewallZone.interface_get_sendercCs|j|�|S)N)r�)rr4rrrZ__interface_id�s
zFirewallZone.__interface_idTc
Cs|jj�|jj|�}|j|}|j|�}||jdkrLttjd||f��|j	|�dk	rjttj
d|��tjd||f�|dkr�|j
�}	n|}	|jr�|r�|j||	d�|	j|j|d�|r�|jd|||	�|j||||�|	j|j||�|dk�r|	jd�|S)Nr1z'%s' already bound to '%s'z'%s' already bound to a zonez&Setting zone of interface '%s' to '%s')rgFT)r�check_panicr<rr2r3rr�ZONE_ALREADY_SETr6�
ZONE_CONFLICTrrir$rdrj�add_failrlr��!_FirewallZone__register_interface�#_FirewallZone__unregister_interfacer�)
rr/r4r�rgr^r�r�r5r�rrrr_�s8









zFirewallZone.add_interfacecCs6|jd|�|jd|<|p"|dk|jd|d<dS)Nrr1��__default__)�_FirewallZone__gen_settingsr3)rr�r5r/r�rrrZ__register_interface�sz!FirewallZone.__register_interfacecCsR|jj�|j|�}|jj|�}||kr,|S|dk	r@|j||�|j|||�}|S)N)rr�r6r<r�r_)rr/r4r��	_old_zone�	_new_zoner�rrr�change_zone_of_interface�s

z%FirewallZone.change_zone_of_interfacecCsz|jj�|dkr|j�}n|}|j||�|jd|d|dd�|dk	rd|dkrd|jd|d|dd�|dkrv|jd�dS)NT�+)r.r�F)rr�r$rjr�r�)rZold_zoneZnew_zonergr�rrr�change_default_zone�s

z FirewallZone.change_default_zonec	Cs�|jj�|j|�}|dkr,ttjd|��|dkr8|n
|jj|�}||krbttjd|||f��|dkrt|j�}n|}|j	|}|j
|�}|j|j||�|j
d|||�|dkr�|jd�|S)Nz'%s' is not in any zoner�z"remove_interface(%s, %s): zoi='%s'FT)rr�r6rrZUNKNOWN_INTERFACEr<r�r$rr2�add_postr�r�r�)	rr/r4rgZzoir�r�r�r5rrrr��s(






zFirewallZone.remove_interfacecCs||jdkr|jd|=dS)Nr1)r3)rr�r5rrrZ__unregister_interfacesz#FirewallZone.__unregister_interfacecCs|j|�|j|�dkS)Nr1)r2r�)rr/r4rrr�query_interfaceszFirewallZone.query_interfacecCs|j|�dj�S)Nr1)r�r*)rr/rrrr,"szFirewallZone.list_interfacesFcCsxt|�rdSt|�rdSt|�r$dS|jd�rh|j|dd��|rV|j|dd��|j|dd��Sttj	|��dS)Nrr�r�zipset:�)
rrr�
startswith�_check_ipset_type_for_source�_check_ipset_applied�
_ipset_familyrrZINVALID_ADDR)rr9rdrrr�check_source's
zFirewallZone.check_sourcecCs|j||d�}||fS)N)rd)r�)rr9rdr�rrrZ__source_id6szFirewallZone.__source_idc
Cs|jj�|jj|�}|j|}t|�r0|j�}|j||d�}||jdkr`tt	j
d||f��|j|�dk	r~tt	jd|��|dkr�|j
�}	n|}	|jr�|r�|j||	d�|	j|j|d�|r�|jd||d|d	|	�|j||||�|	j|j||�|dk�r|	jd�|S)
N)rdr7z'%s' already bound to '%s'z'%s' already bound to a zone)rgFTrro)rr�r<rr�upperr8r3rrr�r;r�r$rdrjr�rlr��_FirewallZone__register_source� _FirewallZone__unregister_sourcer�)
rr/r9r�rgr^r�r�r:r�rrrr`:s4





zFirewallZone.add_sourcecCs6|jd|�|jd|<|p"|dk|jd|d<dS)Nrr7r�r�)r�r3)rr�r:r/r�rrrZ__register_sourceaszFirewallZone.__register_sourcecCsb|jj�|j|�}|jj|�}||kr,|St|�r<|j�}|dk	rP|j||�|j|||�}|S)N)rr�r;r<rr�r�r`)rr/r9r�r�r�r�rrr�change_zone_of_sourcegs

z"FirewallZone.change_zone_of_sourcec	Cs�|jj�t|�r|j�}|j|�}|dkr<ttjd|��|dkrH|n
|jj|�}||krrttj	d|||f��|dkr�|j
�}n|}|j|}|j|�}|j
|j||�|jd||d|d|�|dkr�|jd�|S)Nz'%s' is not in any zoner�zremove_source(%s, %s): zos='%s'FrroT)rr�rr�r;rrZUNKNOWN_SOURCEr<r�r$rr8r�r�r�r�)	rr/r9rgZzosr�r�r�r:rrrr�ys,






zFirewallZone.remove_sourcecCs||jdkr|jd|=dS)Nr7)r3)rr�r:rrrZ__unregister_source�sz FirewallZone.__unregister_sourcecCs(t|�r|j�}|j|�|j|�dkS)Nr7)rr�r8r�)rr/r9rrr�query_source�szFirewallZone.query_sourcecCsdd�|j|�dj�D�S)NcSsg|]}|d�qS)ror)rU�krrr�
<listcomp>�sz-FirewallZone.list_sources.<locals>.<listcomp>r7)r�r*)rr/rrrr-�szFirewallZone.list_sourcescs�x��jj�D]�}|jsqxP�j|D]B}x<�jjj|�D]*\}}	|j||||||	|�}
|j||
�q8Wq$W�j|d�}�j	|�dr|d
kr|j
|||d|d�}
|j||
�qWxΈjjj�D]�}|�jjj|�kr�|�jjj
|�kr�q�|�jjj�k�rd�jjj|�j�rd|�r<t�j|��dk�r<�jjj||d�n&�jjjd	||�|j�fd
d�|�q�|r�|j�fdd�|�q�WdS)NrHrYr��*�filter)r4ro)rgFcs |�jjj�ko�jjjd|�S)NT)rrZ�)get_active_policies_not_derived_from_zone�!_ingress_egress_zones_transaction)�p)rrr�<lambda>�sz)FirewallZone._interface.<locals>.<lambda>cs|�jjj�ko�jjj|�S)N)rrZr�r�)r�)rrrr��s)r�r�)r�enabled_backends�policies_supportedrrZ�#_get_table_chains_for_zone_dispatchZ!build_zone_source_interface_rules�	add_rulesr(r��build_zone_forward_rules�"get_policies_not_derived_from_zone�list_ingress_zones�list_egress_zonesr��
get_policyrdrhr,r��_ingress_egress_zonesr�)rr�r/r4r�r.�backendrZr�rvrEr)rrr��s2$zFirewallZone._interfacecCs$|j|�dkrdS|jjj|dd�S)Nzhash:macF)rd)�_ipset_typer�ipsetZ
get_family)rrIrrrr��szFirewallZone._ipset_familycCs|jjj|dd�S)NF)rd)rr�Zget_type)rrIrrrr��szFirewallZone._ipset_typecCsdj|g|jjj|��S)N�,)�joinrr�Z
get_dimension)rrI�flagrrr�_ipset_match_flags�szFirewallZone._ipset_match_flagscCs|jjj|�S)N)rr�Z
check_applied)rrIrrrr��sz!FirewallZone._check_ipset_appliedcCs*|j|�}|tkr&ttjd||f��dS)Nz.ipset '%s' with type '%s' not usable as source)r�rrrZ
INVALID_IPSET)rrIZ_typerrrr��s
z)FirewallZone._check_ipset_type_for_sourcec
s�x�|r�jj|�gn�jj�D]�}|js*qxN�j|D]@}x:�jjj|�D](\}}	|j||||||	�}
|j||
�qJWq6W�j	|d�}�j
|�dr|j|||d|d�}
|j||
�qWxΈjjj�D]�}|�jjj
|�kr�|�jjj|�kr�q�|�jjj�k�rl�jjj|�j�rl|�rDt�j|��dk�rD�jjj||d�n&�jjjd||�|j�fdd	�|�q�|r�|j�fd
d	�|�q�WdS)NrHrYr�)r9ro)rgFcs |�jjj�ko�jjjd|�S)NT)rrZr�r�)r�)rrrr�sz&FirewallZone._source.<locals>.<lambda>cs|�jjj�ko�jjj|�S)N)rrZr�r�)r�)rrrr�
s)r�get_backend_by_ipvr�r�rrZr�Zbuild_zone_source_address_rulesr�r(r�r�r�r�r�r�r�rdrhr-r�r�r�)rr�r/r�r9r�r�rZr�rvrEr)rrr��s2"$zFirewallZone._sourcecCs0|jj|�}|j|d�}|jjj||||�|S)NrG)rr<r(rZr�)rr/�servicer�r��p_namerrrr�
szFirewallZone.add_servicecCs,|jj|�}|j|d�}|jjj||�|S)NrG)rr<r(rZr�)rr/r�r�rrrr�szFirewallZone.remove_servicecCs(|jj|�}|j|d�}|jjj||�S)NrG)rr<r(rZ�
query_service)rr/r�r�rrrr�szFirewallZone.query_servicecCs&|jj|�}|j|d�}|jjj|�S)NrG)rr<r(rZr�)rr/r�rrrr�szFirewallZone.list_servicescCs2|jj|�}|j|d�}|jjj|||||�|S)NrG)rr<r(rZr�)rr/�port�protocolr�r�r�rrrr�#szFirewallZone.add_portcCs.|jj|�}|j|d�}|jjj|||�|S)NrG)rr<r(rZr�)rr/r�r�r�rrrr�)szFirewallZone.remove_portcCs*|jj|�}|j|d�}|jjj|||�S)NrG)rr<r(rZ�
query_port)rr/r�r�r�rrrr/szFirewallZone.query_portcCs&|jj|�}|j|d�}|jjj|�S)NrG)rr<r(rZr�)rr/r�rrrr�4szFirewallZone.list_portscCs2|jj|�}|j|d�}|jjj|||||�|S)NrG)rr<r(rZr�)rr/�source_portr�r�r�r�rrrr�9szFirewallZone.add_source_portcCs.|jj|�}|j|d�}|jjj|||�|S)NrG)rr<r(rZr�)rr/rr�r�rrrr�?szFirewallZone.remove_source_portcCs*|jj|�}|j|d�}|jjj|||�S)NrG)rr<r(rZ�query_source_port)rr/rr�r�rrrrEszFirewallZone.query_source_portcCs&|jj|�}|j|d�}|jjj|�S)NrG)rr<r(rZr�)rr/r�rrrr�JszFirewallZone.list_source_portscCs�|jj|�}t|j�tkr(|j|d�gSt|j�ttt	t
gkrL|j|d�gSt|j�ttgkrv|j|d�|j|d�gSt|j�t
gkr�|j|d�gSt|j�tgkr�|jd|�gS|jdkr�|j|d�gStdt|j���dS)NrHrGz Rich rule type (%s) not handled.)rr<�type�actionrr(�elementrr	r
rr
rrrr)rr/rSrrrrPOs 

z#FirewallZone._rich_rule_to_policiescCs.x(|j||�D]}|jjj||||�qW|S)N)rPrrZr�)rr/rSr�r�r�rrrr�bszFirewallZone.add_rulecCs*x$|j||�D]}|jjj||�qW|S)N)rPrrZr�)rr/rSr�rrrr�gszFirewallZone.remove_rulecCs2d}x(|j||�D]}|o(|jjj||�}qW|S)NT)rPrrZ�
query_rule)rr/rSr�r�rrrrlszFirewallZone.query_rulecCs^|jj|�}t�}xB|j|d�|j|d�|jd|�gD]}|jt|jjj|���q6Wt|�S)NrHrG)rr<�setr(�updaterZr�r�)rr/r�r�rrrr�rs
zFirewallZone.list_rulescCs0|jj|�}|j|d�}|jjj||||�|S)NrG)rr<r(rZr�)rr/r�r�r�r�rrrr�{szFirewallZone.add_protocolcCs,|jj|�}|j|d�}|jjj||�|S)NrG)rr<r(rZr�)rr/r�r�rrrr��szFirewallZone.remove_protocolcCs(|jj|�}|j|d�}|jjj||�S)NrG)rr<r(rZ�query_protocol)rr/r�r�rrrr	�szFirewallZone.query_protocolcCs&|jj|�}|j|d�}|jjj|�S)NrG)rr<r(rZr�)rr/r�rrrr��szFirewallZone.list_protocolscCs.|jj|�}|jd|�}|jjj|||�|S)NrH)rr<r(rZr�)rr/r�r�r�rrrr��szFirewallZone.add_masqueradecCs*|jj|�}|jd|�}|jjj|�|S)NrH)rr<r(rZr�)rr/r�rrrr��szFirewallZone.remove_masqueradecCs&|jj|�}|jd|�}|jjj|�S)NrH)rr<r(rZr�)rr/r�rrrr��szFirewallZone.query_masqueradec	Cs6|jj|�}|j|d�}|jjj|||||||�|S)NrH)rr<r(rZr�)	rr/r�r��toport�toaddrr�r�r�rrrr��s
zFirewallZone.add_forward_portcCs2|jj|�}|j|d�}|jjj|||||�|S)NrH)rr<r(rZr�)rr/r�r�r
rr�rrrr��sz FirewallZone.remove_forward_portcCs.|jj|�}|j|d�}|jjj|||||�S)NrH)rr<r(rZ�query_forward_port)rr/r�r�r
rr�rrrr�szFirewallZone.query_forward_portcCs&|jj|�}|j|d�}|jjj|�S)NrH)rr<r(rZr�)rr/r�rrrr��szFirewallZone.list_forward_portscCsP|jj|�}|j|d�}|jjj||||�|j|d�}|jjj||||�|S)NrGrH)rr<r(rZr�)rr/�icmpr�r�r�rrrr��szFirewallZone.add_icmp_blockcCsH|jj|�}|j|d�}|jjj||�|j|d�}|jjj||�|S)NrGrH)rr<r(rZr�)rr/r
r�rrrr��szFirewallZone.remove_icmp_blockcCsD|jj|�}|j|d�}|j|d�}|jjj||�oB|jjj||�S)NrGrH)rr<r(rZ�query_icmp_block)rr/r
�p_name_host�
p_name_fwdrrrr�s
zFirewallZone.query_icmp_blockcCsH|jj|�}|j|d�}|j|d�}tt|jjj|�|jjj|���S)NrGrH)rr<r(r)rrZr�)rr/rrrrrr��s
zFirewallZone.list_icmp_blockscCsH|jj|�}|j|d�}|jjj||�|j|d�}|jjj||�|S)NrGrH)rr<r(rZrb)rr/r�r�rrrrb�sz%FirewallZone.add_icmp_block_inversioncCsL|jj|�}|j|d�}|jjj|||�|j|d�}|jjj|||�dS)NrGrH)rr<r(rZr�)rr�r/r�r�rrrr��s
z"FirewallZone._icmp_block_inversioncCsD|jj|�}|j|d�}|jjj|�|j|d�}|jjj|�|S)NrGrH)rr<r(rZr�)rr/r�rrrr��sz(FirewallZone.remove_icmp_block_inversioncCs@|jj|�}|j|d�}|j|d�}|jjj|�o>|jjj|�S)NrGrH)rr<r(rZr�)rr/rrrrrr��s
z'FirewallZone.query_icmp_block_inversionc
	Cs�|j|d�}xT|j|jdD]@}x:|jj�D],}|js:q.|j|||d|d�}|j||�q.WqWxj|j|jdD]V\}}	xL|r�|jj|�gn|jj�D],}|js�q�|j|||d|	d�}|j||�q�WqtWdS)NrHr1r�)r4r7)r9)	r(rr3rr�r�r�r�r�)
rr�r/r�r�r4r�rEr�r9rrr�_forward�s"zFirewallZone._forwardcCsdS)NTr)rrrrZ__forward_idszFirewallZone.__forward_idc	Cs�|jj|�}|jj|�|jj�|j|}|j�}||jdkrRttj	d|��|dkrd|j
�}n|}|jr||jd||�|j
||||�|j|j||�|dkr�|jd�|S)NrYzforward already enabled in '%s'T)rr<Z
check_timeoutr�r�_FirewallZone__forward_idr3rrZALREADY_ENABLEDr$rdr�_FirewallZone__register_forwardr��!_FirewallZone__unregister_forwardr�)	rr/r�r�rgr�r��
forward_idr�rrrras$




zFirewallZone.add_forwardcCs|j||�|jd|<dS)NrY)r�r3)rr�rr�r�rrrZ__register_forward.szFirewallZone.__register_forwardcCs�|jj|�}|jj�|j|}|j�}||jdkrFttjd|��|dkrX|j	�}n|}|j
rp|jd||�|j|j
||�|dkr�|jd�|S)NrYzforward not enabled in '%s'FT)rr<r�rrr3rrZNOT_ENABLEDr$rdrr�rr�)rr/rgr�r�rr�rrrr�2s 




zFirewallZone.remove_forwardcCs||jdkr|jd|=dS)NrY)r3)rr�rrrrZ__unregister_forwardKsz!FirewallZone.__unregister_forwardcCs|j�|j|�dkS)NrY)rr�)rr/rrrr�OszFirewallZone.query_forward)N)N)N)N)NNT)N)N)N)F)F)NNT)N)N)F)rN)rN)rN)rN)rN)rN)NNrN)NN)NN)rN)N)rNN)N)e�__name__�
__module__�__qualname__rJrr!r#r$r(r+r0r6r;r>rTr]r[rfrkrlrxr~r�r�r�r�rjrer�r�r�r�r�r2r_r�r�r�r�r�r�r,r�r8r`r�r�r�r�r�r-r�r�r�r�r�r�r�r�r�r�r�r�r�rr�r�r�rr�rPr�r�rr�r�r�r	r�r�r�r�r�r�rr�r�r�rr�rbr�r�r�rrrarr�rr�rrrrr#s�&



8
(





&


,(



	





		
		

r)"r�rMZfirewall.core.baserrrZfirewall.core.fw_transactionrZfirewall.core.io.policyrZfirewall.core.loggerrr�rr	r
rrr
rrrZfirewall.functionsrrrZfirewallrZfirewall.errorsrZfirewall.fw_typesr�objectrrrrr�<module>s,fw_ipset.cpython-36.opt-1.pyc000064400000016503151730727350011770 0ustar003

��g�%�@sfdZdgZddlmZddlmZmZmZm	Z	ddl
mZddlm
Z
ddlmZGdd�de�Zd	S)
z
ipset backend�
FirewallIPSet�)�log)�remove_default_create_options�normalize_ipset_entry�check_entry_overlaps_existing�check_for_overlapping_entries)�IPSet)�errors)�
FirewallErrorc@s�eZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	d4dd�Z
dd�Zdd�Zd5dd�Z
dd�Zdd�Zdd�Zd6dd �Zd!d"�Zd#d$�Zd%d&�Zd7d'd(�Zd)d*�Zd+d,�Zd-d.�Zd/d0�Zd1d2�Zd3S)8rcCs||_i|_dS)N)�_fw�_ipsets)�self�fw�r�/usr/lib/python3.6/fw_ipset.py�__init__#szFirewallIPSet.__init__cCsd|j|jfS)Nz%s(%r))�	__class__r)r
rrr�__repr__'szFirewallIPSet.__repr__cCs|jj�dS)N)r�clear)r
rrr�cleanup,szFirewallIPSet.cleanupcCs||j�krttj|��dS)N)�
get_ipsetsr
r	Z
INVALID_IPSET)r
�namerrr�check_ipset/szFirewallIPSet.check_ipsetcCs||j�kS)N)r)r
rrrr�query_ipset3szFirewallIPSet.query_ipsetcCst|jj��S)N)�sortedr�keys)r
rrrr6szFirewallIPSet.get_ipsetscCst|j�dkS)Nr)�lenr)r
rrr�
has_ipsets9szFirewallIPSet.has_ipsetsFcCs&|j|�|j|}|r"|j|�|S)N)rr�check_applied_obj)r
r�applied�objrrr�	get_ipset<s



zFirewallIPSet.get_ipsetcCs4g}|jjr|j|jj�|jjr0|j|jj�|S)N)rZnftables_enabled�appendZnftables_backendZ
ipset_enabledZ
ipset_backend)r
�backendsrrrr#CszFirewallIPSet.backendscCs0|j|jjkr ttjd|j��||j|j<dS)Nz'%s' is not supported by ipset.)�typerZipset_supported_typesr
r	ZINVALID_TYPErr)r
r rrr�	add_ipsetKszFirewallIPSet.add_ipsetcCs�|j|}|jrh|rhy x|j�D]}|j|�q"WWqttk
rd}zttj|��WYdd}~XqtXntj	d|�|j|=dS)Nz,Keeping ipset '%s' because of timeout option)
rrr#�set_destroy�	Exceptionr
r	�COMMAND_FAILEDr�debug1)r
rZkeepr �backend�msgrrr�remove_ipsetQs
 zFirewallIPSet.remove_ipsetc<Cs$|j|}�x|j�D�]}|jdkr�|j�}||kr�d|jksv|jddksv|j||dksvt|j�||dkr�y|j|�Wn.tk
r�}zt	t
j|��WYdd}~XnX|jj
�r�y|j|j|j|j�Wn0tk
�r}zt	t
j|��WYdd}~Xn&Xd|_d|jk�r,|jddk�r,qy|j|j�Wn0tk
�rl}zt	t
j|��WYdd}~XnXx�|jD]J}y|j|j|�Wn0tk
�r�}zt	t
j|��WYdd}~XnX�qvWqy|j|j|j|j|jd�Wn0tk
�r}zt	t
j|��WYdd}~XqXd|_qWdS)N�ipset�timeout�0r�T)rr#rZset_get_active_terse�optionsr$�rm_def_cr_optsr&r'r
r	r(r�_individual_callsZ
set_creater�	set_flush�entries�set_add�set_restore)r
rr r*Zactiver+�entryrrr�apply_ipset]sL


&
zFirewallIPSet.apply_ipsetcCs>x8|j�D],}|j|}d|_tjd|�|j|�q
WdS)NFzApplying ipset '%s')rrrrr)r9)r
rr rrr�apply_ipsets�s

zFirewallIPSet.apply_ipsetscCs�xz|j�D]n}|jdkrq
x\|j�D]P}y|j|�|j|�Wq$tk
rr}z|jtjkrb|�WYdd}~Xq$Xq$Wq
WdS)NZnftables)	r#rr�
check_appliedr&r
�coder	�NOT_APPLIED)r
r*r-r+rrr�flush�s

zFirewallIPSet.flushTcCs|j||d�jS)N)r)r!r$)r
rrrrr�get_type�szFirewallIPSet.get_typecCst|j|dd�jjd��S)NT)r�,)rr!r$�split)r
rrrr�
get_dimension�szFirewallIPSet.get_dimensioncCs|j|�}|j|�dS)N)r!r)r
rr rrrr;�s
zFirewallIPSet.check_appliedcCs|jsttj|j��dS)N)rr
r	r=r)r
r rrrr�szFirewallIPSet.check_applied_objcCs.|j||d�}d|jkr*|jddkr*dSdS)N)rZfamilyZinet6Zipv6Zipv4)r!r1)r
rrr rrr�
get_family�s

zFirewallIPSet.get_familycCs�|j|dd�}t|�}tj||j|j�||jkrFttj	d||f��t
||j�y$x|j�D]}|j|j
|�q^WWn.tk
r�}zttj|��WYdd}~Xn&Xd|jks�|jddkr�|jj|�dS)NT)rz'%s' already is in '%s'r.r/)r!rr�check_entryr1r$r5r
r	ZALREADY_ENABLEDrr#r6rr'r(r")r
rr8r r*r+rrr�	add_entry�s
zFirewallIPSet.add_entrycCs�|j|dd�}t|�}||jkr4ttjd||f��y$x|j�D]}|j|j|�q@WWn.t	k
r�}zttj
|��WYdd}~Xn&Xd|jks�|jddkr�|jj|�dS)NT)rz'%s' not in '%s'r.r/)
r!rr5r
r	ZNOT_ENABLEDr#Z
set_deleterr'r(r1�remove)r
rr8r r*r+rrr�remove_entry�s
zFirewallIPSet.remove_entrycCsD|j|dd�}t|�}d|jkr:|jddkr:ttj|��||jkS)NT)rr.r/)r!rr1r
r	ZIPSET_WITH_TIMEOUTr5)r
rr8r rrr�query_entry�s
zFirewallIPSet.query_entrycCs|j|dd�}|jS)NT)r)r!r5)r
rr rrr�get_entries�szFirewallIPSet.get_entriescCs@|j|dd�}t|�x|D]}tj||j|j�qWd|jksN|jddkrT||_y"x|j�D]}|j|j	�q`WWn.t
k
r�}zttj
|��WYdd}~XnXd|_yXxR|j�D]F}|jjr�x8|jD]}|j|j	|�q�Wq�|j|j	|j|j|jd�q�WWn0t
k
�r4}zttj
|��WYdd}~XnXd|_dS)NT)rr.r/)r!rrrDr1r$r5r#r4rr'r
r	r(rrr3r6r7)r
rr5r r8r*r+rrr�set_entries�s.
zFirewallIPSet.set_entriesN)F)F)T)T)�__name__�
__module__�__qualname__rrrrrrrr!r#r%r,r9r:r>r?rBr;rrCrErGrHrIrJrrrrr"s0

1

		N)�__doc__�__all__Zfirewall.core.loggerrZfirewall.core.ipsetrr2rrrZfirewall.core.io.ipsetrZfirewallr	Zfirewall.errorsr
�objectrrrrr�<module>sebtables.cpython-36.pyc000064400000016336151730727350010776 0ustar003

��g�$�@s&dgZddlZddlmZddlmZddlmZm	Z	m
Z
ddlmZddl
mZddlmZmZddlZd	gd
ddgd
ddgd�ZiZiZiZx�ej�D]tZgee<e�ee<x\eeD]PZeejde�eejdeef�eejde�eejde�q�Wq�WGdd�de�ZdS)�ebtables�N)�runProg)�log)�tempFile�readfile�	splitArgs)�COMMANDS)�	ipXtables)�
FirewallError�INVALID_IPVZBROUTINGZ
PREROUTINGZPOSTROUTINGZOUTPUTZINPUTZFORWARD)ZbrouteZnat�filterz-N %s_directz-I %s 1 -j %s_directz-I %s_direct 1 -j RETURNz	%s_directc@s�eZdZdZdZdZdd�Zdd�Zdd�Zd	d
�Z	dd�Z
d
d�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zdd�Zdd�Zd/d d!�Zd"d#�Zd$d%�Zd&d'�Zd(d)�Zd0d+d,�Zd-d.�ZdS)1rZebFcCsBt|j|_td|j|_|j�|_|j�|_|j�g|_	dS)Nz
%s-restore)
r�ipv�_command�_restore_command�_detect_restore_noflush_optionZrestore_noflush_option�_detect_concurrent_option�concurrent_option�fill_exists�available_tables)�self�r�/usr/lib/python3.6/ebtables.py�__init__9s

zebtables.__init__cCs$tjj|j�|_tjj|j�|_dS)N)�os�path�existsrZcommand_existsrZrestore_command_exists)rrrrrAszebtables.fill_existscCs(d}t|jddg�}|ddkr$d}|S)N�z--concurrentz-Lr)rr)rr�retrrrrEs
z"ebtables._detect_concurrent_optioncCs.g}y|j|d�Wntk
r(dSXdS)N�offFT)�	set_rules�
ValueError)r�rulesrrrrOsz'ebtables._detect_restore_noflush_optioncCs�g}|jr |j|kr |j|j�|dd�|D�7}tjd|j|jdj|��t|j|�\}}|dkr~td|jdj|�|f��|S)NcSsg|]}d|�qS)z%sr)�.0�itemrrr�
<listcomp>^sz"ebtables.__run.<locals>.<listcomp>z	%s: %s %s� rz'%s %s' failed: %s)	r�appendr�debug2�	__class__r�joinrr )r�argsZ_args�statusrrrrZ__runYszebtables.__runcCs(x"dD]}||krttd|��qWdS)N�
%%REJECT%%�%%ICMP%%�%%LOGTYPE%%z'%s' invalid for ebtables)r,r-r.)r
r)r�rule�strrrr�_rule_validatefs
zebtables._rule_validatecCs|tko|t|kS)N)�BUILT_IN_CHAINS)rr
�table�chainrrr�is_chain_builtinlszebtables.is_chain_builtincCsJg}|r4|jd|d|g�|jd|d|dddg�n|jd|d|g�|S)Nz-tz-Nz-I�1z-jZRETURNz-X)r&)r�addr3r4r!rrr�build_chain_rulespszebtables.build_chain_rulescCs8d|g}|r |d|t|�g7}n|d|g7}||7}|S)Nz-tz-Iz-D)r0)rr7r3r4�indexr*r/rrr�
build_rule{szebtables.build_rulecCs
tj|�S)N)r	Zcommon_reverse_rule)rr*rrr�reverse_rule�szebtables.reverse_rulecCstj|�dS)N)r	Zcommon_check_passthrough)rr*rrr�check_passthrough�szebtables.check_passthroughcCs
tj|�S)N)r	Zcommon_reverse_passthrough)rr*rrr�reverse_passthrough�szebtables.reverse_passthroughc
Cs<t�}d}i}x�|D]�}|dd�}|j|�xTdD]L}y|j|�}	Wntk
rZYq4Xt|�|	dkr4|j|	�|j|	�}q4Wx^tt|��D]N}	xHtjD]>}
|
||	kr�||	j	d�o�||	j
d�r�d||	||	<q�Wq�W|j|g�j|�qWxD|D]<}|j
d|�x&||D]}|j
dj|�d	��qW�qW|j�tj|j�}tjd
|j|jd|j|jf�g}|jd�t|j||jd
�\}
}tj�dk�rt|j�}|dk	�rd}	xH|D]@}tjd|	|fddd�|j
d	��s�tjddd�|	d7}	�q�Wtj|j�|
dk�r8td|jdj|�|f��dS)Nr�-t�--table��"z"%s"z*%s
r%�
z	%s: %s %sz%s: %dz	--noflush)�stdin�z%8d: %sr)�nofmt�nlr)rEz'%s %s' failed: %s)r>r?)rr1r9r �len�pop�range�stringZ
whitespace�
startswith�endswith�
setdefaultr&�writer)�closer�stat�namerr'r(r�st_sizerZgetDebugLogLevelrZdebug3�unlink)rr!�
log_deniedZ	temp_filer3Ztable_rulesZ_ruler/�opt�i�crPr*r+r�lines�linerrrr�sZ




 




zebtables.set_rulescCs|j|�|j|�S)N)r1�_ebtables__run)rr/rTrrr�set_rule�s
zebtables.set_ruleNcCs�g}|r|gntj�}xp|D]h}||jkr6|j|�qy*|jd|dg�|jj|�|j|�Wqtk
r�tjd|�YqXqW|S)Nz-tz-Lz#ebtables table '%s' does not exist.)r2�keysrr&rZr rZdebug1)rr3rZtablesrrr�get_available_tables�s

zebtables.get_available_tablescCsiS)Nr)rr3rrr�get_zone_table_chains�szebtables.get_zone_table_chainscCsFg}x<tj�D]0}||j�kr qxdD]}|jd||g�q&WqW|S)N�-F�-X�-Zz-t)r_r`ra)r2r\r]r&)rr!r3�flagrrr�build_flush_rules�s
zebtables.build_flush_rulescCs^g}|dkrdn|}xDtj�D]8}||j�kr0qx$t|D]}|jd|d||g�q:WqW|S)NZPANICZDROPz-tz-P)r2r\r]r&)rZpolicyr!Z_policyr3r4rrr�build_set_policy_rules�szebtables.build_set_policy_rulescCsgS)Nr)rrrr�build_default_tables�szebtables.build_default_tablesrcCs�g}x�tD]�}||j�krq
t|dd�}|dkrJ|tkrJ|jt|�d|g}x:|D]2}t|�tkrx|j||�qX|j|t|��qXWq
W|S)Nrz-t)�
DEFAULT_RULESr]�	LOG_RULES�extend�type�listr&r)rrTZ
default_rulesr3Z_default_rules�prefixr/rrr�build_default_rules�s

zebtables.build_default_rulescCs
||jkS)N)r
)rr
rrr�is_ipv_supportedszebtables.is_ipv_supported)N)r)�__name__�
__module__�__qualname__r
rQZpolicies_supportedrrrrrZr1r5r8r:r;r<r=rr[r]r^rcrdrerlrmrrrrr4s0


	@


)�__all__Zos.pathrZfirewall.core.progrZfirewall.core.loggerrZfirewall.functionsrrrZfirewall.configrZ
firewall.corer	Zfirewall.errorsr
rrJr2rfrgZ
OUR_CHAINSr\r3�setr4r&r7�objectrrrrr�<module>s.
prog.cpython-36.pyc000064400000001266151730727350010160 0ustar003

��g��@sddlZdgZddd�ZdS)�N�runProgc
Cs�|dkrg}|g|}d}|r@t|d��}|j�j�}WdQRXddi}y tj|tjtjtjd|d�}Wntk
r|d
SX|j|�\}}	|j	dd	�}|j
|fS)N�rZLANG�CT)�stdin�stderr�stdoutZ	close_fds�env��zutf-8�replace)r	r
)�open�read�encode�
subprocess�Popen�PIPEZSTDOUT�OSErrorZcommunicate�decode�
returncode)
�prog�argvr�argsZinput_stringZhandlerZprocess�outputZ
err_output�r�/usr/lib/python3.6/prog.pyrs$

)NN)r�__all__rrrrr�<module>sbase.cpython-36.pyc000064400000002172151730727350010120 0ustar003

��g6�@s�dZdZdZd0ZdddedgZddddgZd	d
ddd
dd�Zddddddddddddddddgd d!d"d#d$d%d&ddg	d'�Zd(d)d*d+d,d-d.gZd/S)1zBase firewall settingsz{chain}_{zone}ZCONTINUE�ZACCEPTz
%%REJECT%%ZDROP�defaultZREJECTZPREZPOST�INZFWDIZFWDOZOUT)Z
PREROUTINGZPOSTROUTINGZINPUTZ
FORWARD_INZFORWARD_OUTZOUTPUTzicmp-host-prohibitedzhost-prohibzicmp-net-unreachableznet-unreachzicmp-host-unreachablezhost-unreachzicmp-port-unreachablezport-unreachzicmp-proto-unreachablez
proto-unreachzicmp-net-prohibitedz
net-prohibz	tcp-resetztcp-rstzicmp-admin-prohibitedzadmin-prohibzicmp6-adm-prohibitedzadm-prohibitedzicmp6-no-routezno-routezicmp6-addr-unreachablezaddr-unreachzicmp6-port-unreachable)Zipv4Zipv6zhash:ipzhash:ip,portzhash:ip,markzhash:netz
hash:net,portzhash:net,ifacezhash:macN���)	�__doc__ZDEFAULT_ZONE_TARGETZDEFAULT_POLICY_TARGETZDEFAULT_POLICY_PRIORITYZZONE_TARGETSZPOLICY_TARGETSZ	SHORTCUTSZREJECT_TYPESZSOURCE_IPSET_TYPES�rr�/usr/lib/python3.6/base.py�<module>s.watcher.cpython-36.opt-1.pyc000064400000005256151730727350011610 0ustar003

��g��@s*dgZddlmZmZGdd�de�ZdS)�Watcher�)�Gio�GLibc@sdeZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zdd�Zdd�Z
dS)rcCs"||_||_i|_i|_g|_dS)N)�	_callback�_timeout�	_monitors�	_timeouts�_blocked)�self�callbackZtimeout�r�/usr/lib/python3.6/watcher.py�__init__s
zWatcher.__init__cCs:tjj|�}|jtjjd�|j|<|j|jd|j�dS)N�changed)	r�File�new_for_pathZmonitor_directory�FileMonitorFlags�NONEr�connect�_file_changed_cb)r
Z	directory�gfilerrr
�
add_watch_dir"szWatcher.add_watch_dircCs:tjj|�}|jtjjd�|j|<|j|jd|j�dS)Nr)	rrrZmonitor_filerrrrr)r
�filenamerrrr
�add_watch_file(szWatcher.add_watch_filecCs
|jj�S)N)r�keys)r
rrr
�get_watches.szWatcher.get_watchescCs
||jkS)N)r)r
rrrr
�	has_watch1szWatcher.has_watchcCs|j|=dS)N)r)r
rrrr
�remove_watch4szWatcher.remove_watchcCs||jkr|jj|�dS)N)r	�append)r
rrrr
�block_source7s
zWatcher.block_sourcecCs||jkr|jj|�dS)N)r	�remove)r
rrrr
�unblock_source;s
zWatcher.unblock_sourcecCs4x.t|jj��D]}tj|j|�|j|=qWdS)N)�listrrr�
source_remove)r
rrrr
�clear_timeouts?szWatcher.clear_timeoutscCs ||jkr|j|�|j|=dS)N)r	rr)r
rrrr
�_call_callbackDs

zWatcher._call_callbackcCs�|j�}||jkr8||jkr4tj|j|�|j|=dS|tjjksh|tjjksh|tjj	ksh|tjj
kr�||jkr�tj|j|�|j|=tj|j|j
|�|j|<dS)N)Zget_parse_namer	rrr#rZFileMonitorEventZCHANGEDZCREATEDZDELETEDZATTRIBUTE_CHANGEDZtimeout_add_secondsrr%)r
ZmonitorZgio_fileZgio_other_fileZeventrrrr
rIs


zWatcher._file_changed_cbN)�__name__�
__module__�__qualname__rrrrrrrr!r$r%rrrrr
rsN)�__all__Z
gi.repositoryrr�objectrrrrr
�<module>sbase.cpython-36.opt-1.pyc000064400000002172151730727350011057 0ustar003

��g6�@s�dZdZdZd0ZdddedgZddddgZd	d
ddd
dd�Zddddddddddddddddgd d!d"d#d$d%d&ddg	d'�Zd(d)d*d+d,d-d.gZd/S)1zBase firewall settingsz{chain}_{zone}ZCONTINUE�ZACCEPTz
%%REJECT%%ZDROP�defaultZREJECTZPREZPOST�INZFWDIZFWDOZOUT)Z
PREROUTINGZPOSTROUTINGZINPUTZ
FORWARD_INZFORWARD_OUTZOUTPUTzicmp-host-prohibitedzhost-prohibzicmp-net-unreachableznet-unreachzicmp-host-unreachablezhost-unreachzicmp-port-unreachablezport-unreachzicmp-proto-unreachablez
proto-unreachzicmp-net-prohibitedz
net-prohibz	tcp-resetztcp-rstzicmp-admin-prohibitedzadmin-prohibzicmp6-adm-prohibitedzadm-prohibitedzicmp6-no-routezno-routezicmp6-addr-unreachablezaddr-unreachzicmp6-port-unreachable)Zipv4Zipv6zhash:ipzhash:ip,portzhash:ip,markzhash:netz
hash:net,portzhash:net,ifacezhash:macN���)	�__doc__ZDEFAULT_ZONE_TARGETZDEFAULT_POLICY_TARGETZDEFAULT_POLICY_PRIORITYZZONE_TARGETSZPOLICY_TARGETSZ	SHORTCUTSZREJECT_TYPESZSOURCE_IPSET_TYPES�rr�/usr/lib/python3.6/base.py�<module>s.encoding.cpython-36.opt-1.pyc000064400000001747151731422210011726 0ustar003

�Pf��@sjddlZddlZddlZejdfejdfejdfejdfejdfejdfej	dfgZ
ejd	�Zd
d�Z
dS)�N�utf8�utf16zutf16-bezutf16-le�utf32zutf32-bezutf32-lescoding[:=]\s*([-\w.]+)cCs�x0tD](\}}|j|�r|t|�d�j|�SqWxV|jd�dd�D]@}|dd�dkrFtj|�rFtj|�j�djd�}|j|�SqFW|jtj	d��S)	z�Check a bytes string for a BOM to correctly detect the encoding

    Fallback to locale.getpreferredencoding(False) like open() on Python3N�
�r��#�asciiF)
�BOMS�
startswith�len�decode�split�ENCODING_RE�search�groups�locale�getpreferredencoding)�dataZbom�encoding�line�r�/usr/lib/python3.6/encoding.py�auto_decodes
r)�codecsr�re�BOM_UTF8�	BOM_UTF16�BOM_UTF16_BE�BOM_UTF16_LE�	BOM_UTF32�BOM_UTF32_BE�BOM_UTF32_LEr
�compilerrrrrr�<module>s
logging.cpython-36.pyc000064400000007447151731422210010632 0ustar003

�Pf��@sddlmZddlZddlZddlZddlZyddlZWnek
rTddlZYnXddl	m
Z
ddlmZyddl
mZWnek
r�dZYnXej�Zde_ejddd��Zd	d
�ZGdd�dej�Zd
d�ZGdd�dej�ZGdd�dejj�ZGdd�dej�ZdS)�)�absolute_importN)�WINDOWS)�
ensure_dir)�colorama�ccs.tj|7_z
dVWdtj|8_XdS)zv
    A context manager which will cause the log output to be indented for any
    log messages emitted inside it.
    N)�
_log_state�indentation)Znum�r	�/usr/lib/python3.6/logging.py�
indent_logs
rcCsttdd�S)Nrr)�getattrrr	r	r	r
�get_indentation)sr
c@seZdZdd�ZdS)�IndentingFormattercCs,tjj||�}djdd�|jd�D��}|S)z�
        Calls the standard formatter, but will indent all of the log messages
        by our current indentation level.
        �cSsg|]}dt�|�qS)� )r
)�.0�liner	r	r
�
<listcomp>6sz-IndentingFormatter.format.<locals>.<listcomp>T)�logging�	Formatter�format�join�
splitlines)�self�recordZ	formattedr	r	r
r/s
zIndentingFormatter.formatN)�__name__�
__module__�__qualname__rr	r	r	r
r-srcs�fdd�}|S)Ncsdjt��|tjjg�S)Nr)r�listrZStyleZ	RESET_ALL)Zinp)�colorsr	r
�wrapped=sz_color_wrap.<locals>.wrappedr	)rr r	)rr
�_color_wrap<sr!c@sTeZdZer2ejeejj�fej	eejj
�fgZngZddd�Zdd�Z
dd�ZdS)	�ColorizedStreamHandlerNcCs(tjj||�tr$tr$tj|j�|_dS)N)r�
StreamHandler�__init__rr�AnsiToWin32�stream)rr&r	r	r
r$NszColorizedStreamHandler.__init__cCsRtsdSt|jtj�s|jn|jj}t|d�r:|j�r:dStjj	d�dkrNdSdS)NF�isattyTZTERMZANSI)
r�
isinstancer&r%r �hasattrr'�os�environ�get)rZreal_streamr	r	r
�should_colorTsz#ColorizedStreamHandler.should_colorcCsBtjj||�}|j�r>x&|jD]\}}|j|kr||�}PqW|S)N)rr#rr-�COLORS�levelno)rr�msg�levelZcolorr	r	r
ris
zColorizedStreamHandler.format)N)rrrrrZERRORr!ZForeZREDZWARNINGZYELLOWr.r$r-rr	r	r	r
r"Bs
r"c@seZdZdd�ZdS)�BetterRotatingFileHandlercCs ttjj|j��tjjj|�S)N)	rr*�path�dirnameZbaseFilenamer�handlers�RotatingFileHandler�_open)rr	r	r
r7wszBetterRotatingFileHandler._openN)rrrr7r	r	r	r
r2usr2c@seZdZdd�Zdd�ZdS)�MaxLevelFiltercCs
||_dS)N)r1)rr1r	r	r
r$~szMaxLevelFilter.__init__cCs|j|jkS)N)r/r1)rrr	r	r
�filter�szMaxLevelFilter.filterN)rrrr$r9r	r	r	r
r8|sr8)r) Z
__future__r�
contextlibrZlogging.handlersr*Z	threading�ImportErrorZdummy_threadingZ
pip.compatrZ	pip.utilsrZpip._vendorr�	ExceptionZlocalrr�contextmanagerrr
rrr!r#r"r5r6r2�Filterr8r	r	r	r
�<module>s0
3filesystem.cpython-36.pyc000064400000001064151731422210011355 0ustar003

�Pf��@s(ddlZddlZddlmZdd�ZdS)�N)�get_path_uidcCs�ttd�sdSd}xp||kr�tjj|�rntj�dkr^yt|�}Wntk
rTdSX|dkStj|tj�Sq|tjj	|�}}qWdS)N�geteuidTrF)
�hasattr�os�path�lexistsrr�OSError�access�W_OK�dirname)rZpreviousZpath_uid�r� /usr/lib/python3.6/filesystem.py�check_path_owners

r)rZos.pathZ
pip.compatrrrrrr
�<module>spackaging.cpython-36.pyc000064400000003657151731422210011127 0ustar003

�Pf �@s~ddlmZddlmZddlZddlZddlmZddlmZddl	m
Z
ddlmZej
e�Zdd	�Zd
d�Zdd
�ZdS)�)�absolute_import)�
FeedParserN)�
specifiers)�version)�
pkg_resources)�
exceptionscCs>|dkrdStj|�}tjdjtttjdd����}||kS)aG
    Check if the python version in use match the `requires_python` specifier.

    Returns `True` if the version of python in use matches the requirement.
    Returns `False` if the version of python in use does not matches the
    requirement.

    Raises an InvalidSpecifier if `requires_python` have an invalid format.
    NT�.�)	rZSpecifierSetr�parse�join�map�str�sys�version_info)�requires_pythonZrequires_python_specifierZpython_version�r�/usr/lib/python3.6/packaging.py�check_requires_pythons


 rcCs8t|tj�r |jd�r |jd�S|jd�r4|jd�SdS)NZMETADATAzPKG-INFO)�
isinstancerZDistInfoDistributionZhas_metadata�get_metadata)�distrrrr%s



rcCs�t|�}t�}|j|�|j�}|jd�}y8t|�s`tjd|j|dj	t
ttj
dd���f��Wn8tjk
r�}ztjd|j||f�dSd}~XnXdS)NzRequires-Pythonz4%s requires Python '%s' but the running Python is %srr	z7Package %s has an invalid Requires-Python entry %s - %s)rrZfeed�close�getrrZUnsupportedPythonVersionZproject_namerrr
rrrZInvalidSpecifier�loggerZwarning)rZmetadataZfeed_parserZ
pkg_info_dictr�errr�check_dist_requires_python-s"

$r)Z
__future__rZemail.parserrZloggingrZpip._vendor.packagingrrZpip._vendorrZpiprZ	getLogger�__name__rrrrrrrr�<module>s
glibc.cpython-36.opt-1.pyc000064400000002503151731422210011207 0ustar003

�Pf{�@sPddlmZddlZddlZddlZddlZdd�Zdd�Zdd�Zd	d
�Z	dS)�)�absolute_importNcCsPtjd�}y
|j}Wntk
r(dSXtj|_|�}t|t�sL|jd�}|S)z9Returns glibc version string, or None if not using glibc.N�ascii)	�ctypesZCDLL�gnu_get_libc_version�AttributeErrorZc_char_pZrestype�
isinstance�str�decode)Zprocess_namespacer�version_str�r�/usr/lib/python3.6/glibc.py�glibc_version_string	s



r
cCsHtjd|�}|s$tjd|t�dSt|jd��|koFt|jd��|kS)Nz$(?P<major>[0-9]+)\.(?P<minor>[0-9]+)z=Expected glibc version with 2 components major.minor, got: %sF�major�minor)�re�match�warnings�warn�RuntimeWarning�int�group)r
�required_major�
minimum_minor�mrrr�check_glibc_version#s
rcCst�}|dkrdSt|||�S)NF)r
r)rrr
rrr�have_compatible_glibc3srcCs"t�}|dkrtj�Sd|fSdS)NZglibc)r
�platform�libc_ver)Z
glibc_versionrrrrKsr)
Z
__future__rrrrrr
rrrrrrr�<module>sbuild.cpython-36.pyc000064400000002420151731422220010266 0ustar003

�Pf �@s<ddlmZddlZddlZddlmZGdd�de�ZdS)�)�absolute_importN)�rmtreec@s6eZdZddd�Zdd�Zdd�Zdd	�Zd
d�ZdS)
�BuildDirectoryNcCsL|dkr|dkrd}|dkr<tjjtjdd��}|dkr<d}||_||_dS)NTz
pip-build-)�prefix)�os�path�realpath�tempfileZmkdtemp�name�delete)�selfr
r�r
�/usr/lib/python3.6/build.py�__init__szBuildDirectory.__init__cCsdj|jj|j�S)Nz	<{} {!r}>)�format�	__class__�__name__r
)rr
r
r�__repr__szBuildDirectory.__repr__cCs|jS)N)r
)rr
r
r�	__enter__"szBuildDirectory.__enter__cCs|j�dS)N)�cleanup)r�exc�value�tbr
r
r�__exit__%szBuildDirectory.__exit__cCs|jrt|j�dS)N)rrr
)rr
r
rr(szBuildDirectory.cleanup)NN)r�
__module__�__qualname__rrrrrr
r
r
rr	s

r)	Z
__future__rZos.pathrr	Z	pip.utilsr�objectrr
r
r
r�<module>spackaging.cpython-36.opt-1.pyc000064400000003657151731422220012067 0ustar003

�Pf �@s~ddlmZddlmZddlZddlZddlmZddlmZddl	m
Z
ddlmZej
e�Zdd	�Zd
d�Zdd
�ZdS)�)�absolute_import)�
FeedParserN)�
specifiers)�version)�
pkg_resources)�
exceptionscCs>|dkrdStj|�}tjdjtttjdd����}||kS)aG
    Check if the python version in use match the `requires_python` specifier.

    Returns `True` if the version of python in use matches the requirement.
    Returns `False` if the version of python in use does not matches the
    requirement.

    Raises an InvalidSpecifier if `requires_python` have an invalid format.
    NT�.�)	rZSpecifierSetr�parse�join�map�str�sys�version_info)�requires_pythonZrequires_python_specifierZpython_version�r�/usr/lib/python3.6/packaging.py�check_requires_pythons


 rcCs8t|tj�r |jd�r |jd�S|jd�r4|jd�SdS)NZMETADATAzPKG-INFO)�
isinstancerZDistInfoDistributionZhas_metadata�get_metadata)�distrrrr%s



rcCs�t|�}t�}|j|�|j�}|jd�}y8t|�s`tjd|j|dj	t
ttj
dd���f��Wn8tjk
r�}ztjd|j||f�dSd}~XnXdS)NzRequires-Pythonz4%s requires Python '%s' but the running Python is %srr	z7Package %s has an invalid Requires-Python entry %s - %s)rrZfeed�close�getrrZUnsupportedPythonVersionZproject_namerrr
rrrZInvalidSpecifier�loggerZwarning)rZmetadataZfeed_parserZ
pkg_info_dictr�errr�check_dist_requires_python-s"

$r)Z
__future__rZemail.parserrZloggingrZpip._vendor.packagingrrZpip._vendorrZpiprZ	getLogger�__name__rrrrrrrr�<module>s
encoding.cpython-36.pyc000064400000001747151731422220010770 0ustar003

�Pf��@sjddlZddlZddlZejdfejdfejdfejdfejdfejdfej	dfgZ
ejd	�Zd
d�Z
dS)�N�utf8�utf16zutf16-bezutf16-le�utf32zutf32-bezutf32-lescoding[:=]\s*([-\w.]+)cCs�x0tD](\}}|j|�r|t|�d�j|�SqWxV|jd�dd�D]@}|dd�dkrFtj|�rFtj|�j�djd�}|j|�SqFW|jtj	d��S)	z�Check a bytes string for a BOM to correctly detect the encoding

    Fallback to locale.getpreferredencoding(False) like open() on Python3N�
�r��#�asciiF)
�BOMS�
startswith�len�decode�split�ENCODING_RE�search�groups�locale�getpreferredencoding)�dataZbom�encoding�line�r�/usr/lib/python3.6/encoding.py�auto_decodes
r)�codecsr�re�BOM_UTF8�	BOM_UTF16�BOM_UTF16_BE�BOM_UTF16_LE�	BOM_UTF32�BOM_UTF32_BE�BOM_UTF32_LEr
�compilerrrrrr�<module>s
outdated.cpython-36.opt-1.pyc000064400000011147151731422220011745 0ustar003

�Pfe�@s�ddlmZddlZddlZddlZddlZddlZddlm	Z	ddl
mZddl
mZmZddlmZddlmZmZddlmZmZdd	lmZd
Zeje�ZGdd�de�ZGd
d�de�Z dd�Z!dd�Z"dd�Z#dS)�)�absolute_importN)�lockfile)�version)�
total_seconds�WINDOWS)�PyPI)�USER_CACHE_DIR�running_under_virtualenv)�
ensure_dir�get_installed_version)�check_path_ownerz%Y-%m-%dT%H:%M:%SZc@seZdZdd�Zdd�ZdS)�VirtualenvSelfCheckStatecCs\tjjtjd�|_y&t|j��}tj|�|_	WdQRXWnt
tfk
rVi|_	YnXdS)Nzpip-selfcheck.json)�os�path�join�sys�prefix�statefile_path�open�json�load�state�IOError�
ValueError)�self�	statefile�r�/usr/lib/python3.6/outdated.py�__init__sz!VirtualenvSelfCheckState.__init__c
Cs:t|jd��$}tj|jt�|d�|ddd�WdQRXdS)N�w)�
last_check�pypi_versionT�,�:)�	sort_keys�
separators)r"r#)rrr�dump�strftime�SELFCHECK_DATE_FMT)rr!�current_timerrrr�save$szVirtualenvSelfCheckState.saveN)�__name__�
__module__�__qualname__rr*rrrrr
s
r
c@seZdZdd�Zdd�ZdS)�GlobalSelfCheckStatecCsbtjjtd�|_y,t|j��}tj|�tj	|_
WdQRXWn ttt
fk
r\i|_
YnXdS)Nzselfcheck.json)rrrrrrrrrrrrr�KeyError)rrrrrr3s zGlobalSelfCheckState.__init__cCs�ttjj|j��sdSttjj|j��tj|j��ztjj|j�rft	|j��}t
j|�}WdQRXni}|jt
�|d�|tj<t	|jd��}t
j||ddd�WdQRXWdQRXdS)N)r r!rTr"r#)r$r%)r"r#)rrr�dirnamerr
rZLockFile�existsrrrr'r(rrr&)rr!r)rrrrrr*=s
zGlobalSelfCheckState.saveN)r+r,r-rr*rrrrr.2s
r.cCst�rt�St�SdS)N)r	r
r.rrrr�load_selfcheck_statefileXsr2cCsFddl}y"|jd�}|jd�o*d|jd�kS|jk
r@dSXdS)z�Checks whether pip was installed by pip

    This is used not to display the upgrade message when pip is in fact
    installed by system package manager, such as dnf on Fedora.
    rN�pipZ	INSTALLERF)�
pkg_resourcesZget_distributionZhas_metadataZget_metadata_linesZDistributionNotFound)r4Zdistrrr�pip_installed_by_pip_s

r5c
CsFtd�}|dkrdStj|�}d}�y�t�}tjj�}d|jkrxd|jkrxtjj|jdt�}t	||�dkrx|jd}|dkr�|j
tjdd	id
�}|j
�dd�tt|j�d
�tjd�D�d}|j||�tj|�}||k�r|j|jk�rt��rt�rd}	nd}	tjd|||	�Wn$tk
�r@tjddd�YnXdS)z�Check for an update for pip.

    Limit the frequency of checks to once per week. State is stored either in
    the active virtualenv or in the user's USER_CACHE_DIR keyed off the prefix
    of the pip script path.
    r3Nr r!���<ZAcceptzapplication/json)ZheaderscSsg|]}tj|�js|�qSr)�packaging_version�parseZ
is_prerelease)�.0�vrrr�
<listcomp>�sz%pip_version_check.<locals>.<listcomp>Zreleases)�key�z
python -m pipz�You are using pip version %s, however version %s is available.
You should consider upgrading via the '%s install --upgrade pip' command.z5There was an error checking the latest version of pipT)�exc_info�i`'i�:	���)rr9r:r2�datetimeZutcnowrZstrptimer(r�getrZpip_json_urlZraise_for_status�sorted�listrr*Zbase_versionr5r�loggerZwarning�	Exception�debug)
ZsessionZinstalled_versionZpip_versionr!rr)r ZrespZremote_versionZpip_cmdrrr�pip_version_checknsL




rJ)$Z
__future__rrCrZloggingZos.pathrrZpip._vendorrZpip._vendor.packagingrr9Z
pip.compatrrZ
pip.modelsrZ
pip.locationsrr	Z	pip.utilsr
rZpip.utils.filesystemrr(Z	getLoggerr+rG�objectr
r.r2r5rJrrrr�<module>s&
&glibc.cpython-36.pyc000064400000002503151731422220010251 0ustar003

�Pf{�@sPddlmZddlZddlZddlZddlZdd�Zdd�Zdd�Zd	d
�Z	dS)�)�absolute_importNcCsPtjd�}y
|j}Wntk
r(dSXtj|_|�}t|t�sL|jd�}|S)z9Returns glibc version string, or None if not using glibc.N�ascii)	�ctypesZCDLL�gnu_get_libc_version�AttributeErrorZc_char_pZrestype�
isinstance�str�decode)Zprocess_namespacer�version_str�r�/usr/lib/python3.6/glibc.py�glibc_version_string	s



r
cCsHtjd|�}|s$tjd|t�dSt|jd��|koFt|jd��|kS)Nz$(?P<major>[0-9]+)\.(?P<minor>[0-9]+)z=Expected glibc version with 2 components major.minor, got: %sF�major�minor)�re�match�warnings�warn�RuntimeWarning�int�group)r
�required_major�
minimum_minor�mrrr�check_glibc_version#s
rcCst�}|dkrdSt|||�S)NF)r
r)rrr
rrr�have_compatible_glibc3srcCs"t�}|dkrtj�Sd|fSdS)NZglibc)r
�platform�libc_ver)Z
glibc_versionrrrrKsr)
Z
__future__rrrrrr
rrrrrrr�<module>shashes.cpython-36.pyc000064400000006227151731422220010453 0ustar003

�Pf2�@szddlmZddlZddlmZmZmZddlmZddl	m
Z
mZmZdZ
dddgZGd	d
�d
e�ZGdd�de�ZdS)
�)�absolute_importN)�HashMismatch�HashMissing�InstallationError)�read_chunks)�	iteritems�iterkeys�
itervaluesZsha256Zsha384Zsha512c@sJeZdZdZddd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dS)�HasheszaA wrapper that builds multiple hashes at once and checks them against
    known-good values

    NcCs|dkrin||_dS)zo
        :param hashes: A dict of algorithm names pointing to lists of allowed
            hex digests
        N)�_allowed)�self�hashes�r�/usr/lib/python3.6/hashes.py�__init__szHashes.__init__c
Cs�i}xJt|j�D]<}ytj|�||<Wqttfk
rJtd|��YqXqWx(|D] }xt|�D]}|j|�qdWqVWx*t	|�D]\}}|j
�|j|kr�dSq�W|j|�dS)z�Check good hashes against ones built from iterable of chunks of
        data.

        Raise HashMismatch if none match.

        zUnknown hash name: %sN)rr�hashlib�new�
ValueError�	TypeErrorrr	�updater�	hexdigest�_raise)rZchunks�gotsZ	hash_name�chunk�hashZgotrrr�check_against_chunks s
zHashes.check_against_chunkscCst|j|��dS)N)rr)rrrrrr7sz
Hashes._raisecCs|jt|��S)zaCheck good hashes against a file-like object

        Raise HashMismatch if none match.

        )rr)r�filerrr�check_against_file:szHashes.check_against_filec	Cs t|d��}|j|�SQRXdS)N�rb)�openr)r�pathrrrr�check_against_pathBszHashes.check_against_pathcCs
t|j�S)z,Return whether I know any known-good hashes.)�boolr)rrrr�__nonzero__FszHashes.__nonzero__cCs|j�S)N)r#)rrrr�__bool__JszHashes.__bool__)N)�__name__�
__module__�__qualname__�__doc__rrrrr!r#r$rrrrr
s
r
cs(eZdZdZ�fdd�Zdd�Z�ZS)�
MissingHashesz�A workalike for Hashes used when we're missing a hash for a requirement

    It computes the actual hash of the requirement and raises a HashMissing
    exception showing it to the user.

    cstt|�jtgid�dS)z!Don't offer the ``hashes`` kwarg.)r
N)�superr)r�
FAVORITE_HASH)r)�	__class__rrrUszMissingHashes.__init__cCst|tj���dS)N)rr+r)rrrrrr[szMissingHashes._raise)r%r&r'r(rr�
__classcell__rr)r,rr)Nsr))Z
__future__rrZpip.exceptionsrrrZ	pip.utilsrZpip._vendor.sixrrr	r+Z
STRONG_HASHES�objectr
r)rrrr�<module>s
:ui.cpython-36.pyc000064400000022534151731422230007615 0ustar003

�PfM-�@s�ddlmZddlmZddlZddlZddlmZmZmZddlZddl	Z	ddl
Z
ddlmZddl
mZddlmZddlmZdd	lmZmZdd
lmZmZmZddlmZyddlmZWnek
r�dZYnXe
je�Z d
d�Z!e!ee�Z"Gdd�de#�Z$Gdd�de#�Z%Gdd�de#�Z&Gdd�de&e$e%e"�Z'Gdd�de&e$e%ee�Z(e	j)dd��Z*Gdd�de#�Z+Gdd�de#�Z,Gdd �d e#�Z-e	j)d!d"��Z.dS)#�)�absolute_import)�divisionN)�signal�SIGINT�default_int_handler)�WINDOWS)�format_size)�get_indentation)�six)�Bar�IncrementalBar)�WritelnMixin�HIDE_CURSOR�SHOW_CURSOR)�Spinner)�coloramacCs�t|jdd�}|s|St|dtj��t|dtj��g}|tt|dg��7}ytj�j|�j|�Wntk
rv|SX|SdS)N�encodingZ
empty_fillZfill�phases)�getattr�filer
Z	text_type�list�join�encode�UnicodeEncodeError)Z	preferredZfallbackrZ
characters�r�/usr/lib/python3.6/ui.py�_select_progress_classsrcs4eZdZdZ�fdd�Z�fdd�Zdd�Z�ZS)�InterruptibleMixina�
    Helper to ensure that self.finish() gets called on keyboard interrupt.

    This allows downloads to be interrupted without leaving temporary state
    (like hidden cursors) behind.

    This class is similar to the progress library's existing SigIntMixin
    helper, but as of version 1.2, that helper has the following problems:

    1. It calls sys.exit().
    2. It discards the existing SIGINT handler completely.
    3. It leaves its own handler in place even after an uninterrupted finish,
       which will have unexpected delayed effects if the user triggers an
       unrelated keyboard interrupt some time after a progress-displaying
       download has already completed, for example.
    cs4tt|�j||�tt|j�|_|jdkr0t|_dS)z=
        Save the original SIGINT handler for later.
        N)�superr�__init__rr�
handle_sigint�original_handlerr)�self�args�kwargs)�	__class__rrrNs
zInterruptibleMixin.__init__cstt|�j�tt|j�dS)z�
        Restore the original SIGINT handler after finishing.

        This should happen regardless of whether the progress display finishes
        normally, or gets interrupted.
        N)rr�finishrrr!)r")r%rrr&^szInterruptibleMixin.finishcCs|j�|j||�dS)z�
        Call self.finish() before delegating to the original SIGINT handler.

        This handler should only be in place while the progress display is
        active.
        N)r&r!)r"Zsignum�framerrrr hsz InterruptibleMixin.handle_sigint)�__name__�
__module__�__qualname__�__doc__rr&r �
__classcell__rr)r%rr<s
rcsJeZdZ�fdd�Zedd��Zedd��Zedd��Zdd
d�Z�Z	S)
�DownloadProgressMixincs,tt|�j||�dt�d|j|_dS)N� �)rr-rr	�message)r"r#r$)r%rrruszDownloadProgressMixin.__init__cCs
t|j�S)N)r�index)r"rrr�
downloadedysz DownloadProgressMixin.downloadedcCs |jdkrdStd|j�dS)Ngz...�z/s)Zavgr)r"rrr�download_speed}s
z$DownloadProgressMixin.download_speedcCs|jrd|jSdS)Nzeta %s�)ZetaZeta_td)r"rrr�
pretty_eta�s
z DownloadProgressMixin.pretty_etar3ccs*x|D]}|V|j|�qW|j�dS)N)�nextr&)r"�it�n�xrrr�iter�s
zDownloadProgressMixin.iter)r3)
r(r)r*r�propertyr2r4r6r;r,rr)r%rr-ss
r-cseZdZ�fdd�Z�ZS)�WindowsMixincs\tr�jrd�_tt��j||�trXtrXtj�j��_�fdd��j_�fdd��j_	dS)NFcs�jjj�S)N)r�wrapped�isattyr)r"rr�<lambda>�sz'WindowsMixin.__init__.<locals>.<lambda>cs�jjj�S)N)rr>�flushr)r"rrr@�s)
rZhide_cursorrr=rrZAnsiToWin32rr?rA)r"r#r$)r%)r"rr�s
zWindowsMixin.__init__)r(r)r*rr,rr)r%rr=�sr=c@seZdZejZdZdZdS)�DownloadProgressBarz
%(percent)d%%z0%(downloaded)s %(download_speed)s %(pretty_eta)sN)r(r)r*�sys�stdoutrr0�suffixrrrrrB�srBc@s&eZdZejZdZdd�Zdd�ZdS)�DownloadProgressSpinnerz!%(downloaded)s %(download_speed)scCs"t|d�stj|j�|_t|j�S)N�_phaser)�hasattr�	itertools�cyclerrGr7)r"rrr�
next_phase�s
z"DownloadProgressSpinner.next_phasecCsN|j|}|j�}|j|}dj||r*dnd||r6dnd|g�}|j|�dS)Nr5r.)r0rKrErZwriteln)r"r0ZphaserE�linerrr�update�s



zDownloadProgressSpinner.updateN)	r(r)r*rCrDrrErKrMrrrrrF�srFccsRtrdVnB|j�s$tj�tjkr,dVn"|jt�z
dVWd|jt�XdS)N)	rr?�logger�getEffectiveLevel�logging�INFO�writerr)rrrr�
hidden_cursor�s

rSc@s$eZdZdd�Zdd�Zdd�ZdS)�RateLimitercCs||_d|_dS)Nr)�_min_update_interval_seconds�_last_update)r"�min_update_interval_secondsrrrr�szRateLimiter.__init__cCstj�}||j}||jkS)N)�timerVrU)r"ZnowZdeltarrr�ready�s
zRateLimiter.readycCstj�|_dS)N)rXrV)r"rrr�reset�szRateLimiter.resetN)r(r)r*rrYrZrrrrrT�srTc@s.eZdZddd�Zdd�Zdd	�Zd
d�ZdS)
�InteractiveSpinnerN�-\|/��?cCs\||_|dkrtj}||_t|�|_d|_tj|�|_	|jj
dt�|jd�d|_dS)NFr.z ... r)
�_messagerCrD�_filerT�
_rate_limiter�	_finishedrIrJ�_spin_cyclerRr	�_width)r"r0rZ
spin_charsrWrrrr�s
zInteractiveSpinner.__init__cCs^|jst�d|j}|jj|d|j|�|jj|�t|�|_|jj�|jj�dS)N�r.)	ra�AssertionErrorrcr_rR�lenrAr`rZ)r"�statusZbackuprrr�_write	s


zInteractiveSpinner._writecCs,|jr
dS|jj�sdS|jt|j��dS)N)rar`rYrhr7rb)r"rrr�spins

zInteractiveSpinner.spincCs4|jr
dS|j|�|jjd�|jj�d|_dS)N�
T)rarhr_rRrA)r"�final_statusrrrr&s

zInteractiveSpinner.finish)Nr\r])r(r)r*rrhrir&rrrrr[�s


r[c@s.eZdZddd�Zdd�Zdd�Zdd	�Zd
S)�NonInteractiveSpinner�<cCs$||_d|_t|�|_|jd�dS)NFZstarted)r^rarTr`�_update)r"r0rWrrrr*s
zNonInteractiveSpinner.__init__cCs*|jst�|jj�tjd|j|�dS)Nz%s: %s)rarer`rZrN�infor^)r"rgrrrrn0s
zNonInteractiveSpinner._updatecCs&|jr
dS|jj�sdS|jd�dS)Nzstill running...)rar`rYrn)r"rrrri5s

zNonInteractiveSpinner.spincCs$|jr
dS|jd|f�d|_dS)Nzfinished with status '%s'T)rarn)r"rkrrrr&<szNonInteractiveSpinner.finishN)rm)r(r)r*rrnrir&rrrrrl)s
rlccs�tjj�r"tj�tjkr"t|�}nt|�}y t	tj��|VWdQRXWn>t
k
rj|jd��Yn*tk
r�|jd��YnX|jd�dS)NZcanceled�error�done)
rCrDr?rNrOrPrQr[rlrS�KeyboardInterruptr&�	Exception)r0Zspinnerrrr�open_spinnerCs


rt)/Z
__future__rrrIrCrrrrX�
contextlibrPZ
pip.compatrZ	pip.utilsrZpip.utils.loggingr	Zpip._vendorr
Zpip._vendor.progress.barrrZpip._vendor.progress.helpersr
rrZpip._vendor.progress.spinnerrrrsZ	getLoggerr(rNrZ_BaseBar�objectrr-r=rBrF�contextmanagerrSrTr[rlrtrrrr�<module>sB


7
!0appdirs.cpython-36.pyc000064400000017002151731422230010634 0ustar003

�Pfk"�@s�dZddlmZddlZddlZddlmZmZddlm	Z	m
Z
dd�Zdd	d
�Zddd
�Z
dd�Zdd�Zdd�Zer�yddlZeZWnek
r�eZYnXdd�ZdS)zd
This code was taken from https://github.com/ActiveState/appdirs and modified
to suit our purposes.
�)�absolute_importN)�WINDOWS�
expanduser)�PY2�	text_typecCs�tr<tjjtd��}tr*t|t�r*t|�}tjj	||d�}n@t
jdkr^td�}tjj	||�}ntj
dtd��}tjj	||�}|S)a5
    Return full path to the user-specific cache dir for this application.

        "appname" is the name of application.

    Typical user cache directories are:
        macOS:      ~/Library/Caches/<AppName>
        Unix:       ~/.cache/<AppName> (XDG default)
        Windows:    C:\Users\<username>\AppData\Local\<AppName>\Cache

    On Windows the only suggestion in the MSDN docs is that local settings go
    in the `CSIDL_LOCAL_APPDATA` directory. This is identical to the
    non-roaming app data dir (the default returned by `user_data_dir`). Apps
    typically put cache data somewhere *under* the given dir here. Some
    examples:
        ...\Mozilla\Firefox\Profiles\<ProfileName>\Cache
        ...\Acme\SuperApp\Cache\1.0

    OPINION: This function appends "Cache" to the `CSIDL_LOCAL_APPDATA` value.
    �CSIDL_LOCAL_APPDATAZCache�darwinz~/Library/CachesZXDG_CACHE_HOMEz~/.cache)r�os�path�normpath�_get_win_folderr�
isinstancer�_win_path_to_bytes�join�sys�platformr�getenv)�appnamer
�r�/usr/lib/python3.6/appdirs.py�user_cache_dirs
rFcCshtr,|rdpd}tjjtjjt|��|�}n8tjdkrJtjjtd�|�}ntjjtj	dtd��|�}|S)aS
    Return full path to the user-specific data dir for this application.

        "appname" is the name of application.
            If None, just the system directory is returned.
        "roaming" (boolean, default False) can be set True to use the Windows
            roaming appdata directory. That means that for users on a Windows
            network setup for roaming profiles, this user data will be
            sync'd on login. See
            <http://technet.microsoft.com/en-us/library/cc766489(WS.10).aspx>
            for a discussion of issues.

    Typical user data directories are:
        macOS:                  ~/Library/Application Support/<AppName>
        Unix:                   ~/.local/share/<AppName>    # or in
                                $XDG_DATA_HOME, if defined
        Win XP (not roaming):   C:\Documents and Settings\<username>\ ...
                                ...Application Data\<AppName>
        Win XP (roaming):       C:\Documents and Settings\<username>\Local ...
                                ...Settings\Application Data\<AppName>
        Win 7  (not roaming):   C:\Users\<username>\AppData\Local\<AppName>
        Win 7  (roaming):       C:\Users\<username>\AppData\Roaming\<AppName>

    For Unix, we follow the XDG spec and support $XDG_DATA_HOME.
    That means, by default "~/.local/share/<AppName>".
    �
CSIDL_APPDATArrz~/Library/Application Support/Z
XDG_DATA_HOMEz~/.local/share)
rr	r
rrrrrrr)r�roaming�constr
rrr�
user_data_dir>s
rTcCsHtrt||d�}n2tjdkr&t|�}ntjdtd��}tjj||�}|S)arReturn full path to the user-specific config dir for this application.

        "appname" is the name of application.
            If None, just the system directory is returned.
        "roaming" (boolean, default True) can be set False to not use the
            Windows roaming appdata directory. That means that for users on a
            Windows network setup for roaming profiles, this user data will be
            sync'd on login. See
            <http://technet.microsoft.com/en-us/library/cc766489(WS.10).aspx>
            for a discussion of issues.

    Typical user data directories are:
        macOS:                  same as user_data_dir
        Unix:                   ~/.config/<AppName>
        Win *:                  same as user_data_dir

    For Unix, we follow the XDG spec and support $XDG_CONFIG_HOME.
    That means, by default "~/.config/<AppName>".
    )rrZXDG_CONFIG_HOMEz	~/.config)	rrrrr	rrr
r)rrr
rrr�user_config_dirjs

rcs�tr&tjjtd��}tjj|��g}nVtjdkrBtjjd��g}n:tjdd�}|rn�fdd�|j	tj
�D�}ng}|jd�|S)	a�Return a list of potential user-shared config dirs for this application.

        "appname" is the name of application.

    Typical user config directories are:
        macOS:      /Library/Application Support/<AppName>/
        Unix:       /etc or $XDG_CONFIG_DIRS[i]/<AppName>/ for each value in
                    $XDG_CONFIG_DIRS
        Win XP:     C:\Documents and Settings\All Users\Application ...
                    ...Data\<AppName>        Vista:      (Fail! "C:\ProgramData" is a hidden *system* directory
                    on Vista.)
        Win 7:      Hidden, but writeable on Win 7:
                    C:\ProgramData\<AppName>    �CSIDL_COMMON_APPDATArz/Library/Application SupportZXDG_CONFIG_DIRSz/etc/xdgcsg|]}tjjt|����qSr)r	r
rr)�.0�x)rrr�
<listcomp>�sz$site_config_dirs.<locals>.<listcomp>z/etc)rr	r
rrrrrr�split�pathsep�append)rr
ZpathlistZxdg_config_dirsr)rr�site_config_dirs�s


r#cCs:ddl}dddd�|}|j|jd�}|j||�\}}|S)z�
    This is a fallback technique at best. I'm not sure if using the
    registry for this guarantees us the correct answer for all CSIDL_*
    names.
    rNZAppDatazCommon AppDataz
Local AppData)rrrz@Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders)�_winreg�OpenKey�HKEY_CURRENT_USERZQueryValueEx)�
csidl_namer$Zshell_folder_name�keyZ	directoryZ_typerrr�_get_win_folder_from_registry�sr)cCs�dddd�|}tjd�}tjjjd|dd|�d}x|D]}t|�dkr:d	}Pq:W|rztjd�}tjjj|j|d�rz|}|jS)
N��#�)rrrirF�T)	�ctypesZcreate_unicode_bufferZwindllZshell32ZSHGetFolderPathW�ordZkernel32ZGetShortPathNameW�value)r'Zcsidl_constZbufZ
has_high_char�cZbuf2rrr�_get_win_folder_with_ctypes�s 


r2c
Cs6x0dD](}y
|j|�Sttfk
r,YqXqW|S)a�Encode Windows paths to bytes. Only used on Python 2.

    Motivation is to be consistent with other operating systems where paths
    are also returned as bytes. This avoids problems mixing bytes and Unicode
    elsewhere in the codebase. For more details and discussion see
    <https://github.com/pypa/pip/issues/3463>.

    If encoding using ASCII and MBCS fails, return the original Unicode path.
    �ASCII�MBCS)r3r4)�encode�UnicodeEncodeError�LookupError)r
�encodingrrrr�s



r)F)T)�__doc__Z
__future__rr	rZ
pip.compatrrZpip._vendor.sixrrrrrr#r)r2r.r�ImportErrorrrrrr�<module>s$0
,
!(
outdated.cpython-36.pyc000064400000011147151731422230011007 0ustar003

�Pfe�@s�ddlmZddlZddlZddlZddlZddlZddlm	Z	ddl
mZddl
mZmZddlmZddlmZmZddlmZmZdd	lmZd
Zeje�ZGdd�de�ZGd
d�de�Z dd�Z!dd�Z"dd�Z#dS)�)�absolute_importN)�lockfile)�version)�
total_seconds�WINDOWS)�PyPI)�USER_CACHE_DIR�running_under_virtualenv)�
ensure_dir�get_installed_version)�check_path_ownerz%Y-%m-%dT%H:%M:%SZc@seZdZdd�Zdd�ZdS)�VirtualenvSelfCheckStatecCs\tjjtjd�|_y&t|j��}tj|�|_	WdQRXWnt
tfk
rVi|_	YnXdS)Nzpip-selfcheck.json)�os�path�join�sys�prefix�statefile_path�open�json�load�state�IOError�
ValueError)�self�	statefile�r�/usr/lib/python3.6/outdated.py�__init__sz!VirtualenvSelfCheckState.__init__c
Cs:t|jd��$}tj|jt�|d�|ddd�WdQRXdS)N�w)�
last_check�pypi_versionT�,�:)�	sort_keys�
separators)r"r#)rrr�dump�strftime�SELFCHECK_DATE_FMT)rr!�current_timerrrr�save$szVirtualenvSelfCheckState.saveN)�__name__�
__module__�__qualname__rr*rrrrr
s
r
c@seZdZdd�Zdd�ZdS)�GlobalSelfCheckStatecCsbtjjtd�|_y,t|j��}tj|�tj	|_
WdQRXWn ttt
fk
r\i|_
YnXdS)Nzselfcheck.json)rrrrrrrrrrrrr�KeyError)rrrrrr3s zGlobalSelfCheckState.__init__cCs�ttjj|j��sdSttjj|j��tj|j��ztjj|j�rft	|j��}t
j|�}WdQRXni}|jt
�|d�|tj<t	|jd��}t
j||ddd�WdQRXWdQRXdS)N)r r!rTr"r#)r$r%)r"r#)rrr�dirnamerr
rZLockFile�existsrrrr'r(rrr&)rr!r)rrrrrr*=s
zGlobalSelfCheckState.saveN)r+r,r-rr*rrrrr.2s
r.cCst�rt�St�SdS)N)r	r
r.rrrr�load_selfcheck_statefileXsr2cCsFddl}y"|jd�}|jd�o*d|jd�kS|jk
r@dSXdS)z�Checks whether pip was installed by pip

    This is used not to display the upgrade message when pip is in fact
    installed by system package manager, such as dnf on Fedora.
    rN�pipZ	INSTALLERF)�
pkg_resourcesZget_distributionZhas_metadataZget_metadata_linesZDistributionNotFound)r4Zdistrrr�pip_installed_by_pip_s

r5c
CsFtd�}|dkrdStj|�}d}�y�t�}tjj�}d|jkrxd|jkrxtjj|jdt�}t	||�dkrx|jd}|dkr�|j
tjdd	id
�}|j
�dd�tt|j�d
�tjd�D�d}|j||�tj|�}||k�r|j|jk�rt��rt�rd}	nd}	tjd|||	�Wn$tk
�r@tjddd�YnXdS)z�Check for an update for pip.

    Limit the frequency of checks to once per week. State is stored either in
    the active virtualenv or in the user's USER_CACHE_DIR keyed off the prefix
    of the pip script path.
    r3Nr r!���<ZAcceptzapplication/json)ZheaderscSsg|]}tj|�js|�qSr)�packaging_version�parseZ
is_prerelease)�.0�vrrr�
<listcomp>�sz%pip_version_check.<locals>.<listcomp>Zreleases)�key�z
python -m pipz�You are using pip version %s, however version %s is available.
You should consider upgrading via the '%s install --upgrade pip' command.z5There was an error checking the latest version of pipT)�exc_info�i`'i�:	���)rr9r:r2�datetimeZutcnowrZstrptimer(r�getrZpip_json_urlZraise_for_status�sorted�listrr*Zbase_versionr5r�loggerZwarning�	Exception�debug)
ZsessionZinstalled_versionZpip_versionr!rr)r ZrespZremote_versionZpip_cmdrrr�pip_version_checknsL




rJ)$Z
__future__rrCrZloggingZos.pathrrZpip._vendorrZpip._vendor.packagingrr9Z
pip.compatrrZ
pip.modelsrZ
pip.locationsrr	Z	pip.utilsr
rZpip.utils.filesystemrr(Z	getLoggerr+rG�objectr
r.r2r5rJrrrr�<module>s&
&setuptools_build.cpython-36.pyc000064400000000464151731422230012576 0ustar003

�Pf�@sdZdS)z�import setuptools, tokenize;__file__=%r;f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))N)ZSETUPTOOLS_SHIM�rr�&/usr/lib/python3.6/setuptools_build.py�<module>shashes.cpython-36.opt-1.pyc000064400000006227151731422230011413 0ustar003

�Pf2�@szddlmZddlZddlmZmZmZddlmZddl	m
Z
mZmZdZ
dddgZGd	d
�d
e�ZGdd�de�ZdS)
�)�absolute_importN)�HashMismatch�HashMissing�InstallationError)�read_chunks)�	iteritems�iterkeys�
itervaluesZsha256Zsha384Zsha512c@sJeZdZdZddd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dS)�HasheszaA wrapper that builds multiple hashes at once and checks them against
    known-good values

    NcCs|dkrin||_dS)zo
        :param hashes: A dict of algorithm names pointing to lists of allowed
            hex digests
        N)�_allowed)�self�hashes�r�/usr/lib/python3.6/hashes.py�__init__szHashes.__init__c
Cs�i}xJt|j�D]<}ytj|�||<Wqttfk
rJtd|��YqXqWx(|D] }xt|�D]}|j|�qdWqVWx*t	|�D]\}}|j
�|j|kr�dSq�W|j|�dS)z�Check good hashes against ones built from iterable of chunks of
        data.

        Raise HashMismatch if none match.

        zUnknown hash name: %sN)rr�hashlib�new�
ValueError�	TypeErrorrr	�updater�	hexdigest�_raise)rZchunks�gotsZ	hash_name�chunk�hashZgotrrr�check_against_chunks s
zHashes.check_against_chunkscCst|j|��dS)N)rr)rrrrrr7sz
Hashes._raisecCs|jt|��S)zaCheck good hashes against a file-like object

        Raise HashMismatch if none match.

        )rr)r�filerrr�check_against_file:szHashes.check_against_filec	Cs t|d��}|j|�SQRXdS)N�rb)�openr)r�pathrrrr�check_against_pathBszHashes.check_against_pathcCs
t|j�S)z,Return whether I know any known-good hashes.)�boolr)rrrr�__nonzero__FszHashes.__nonzero__cCs|j�S)N)r#)rrrr�__bool__JszHashes.__bool__)N)�__name__�
__module__�__qualname__�__doc__rrrrr!r#r$rrrrr
s
r
cs(eZdZdZ�fdd�Zdd�Z�ZS)�
MissingHashesz�A workalike for Hashes used when we're missing a hash for a requirement

    It computes the actual hash of the requirement and raises a HashMissing
    exception showing it to the user.

    cstt|�jtgid�dS)z!Don't offer the ``hashes`` kwarg.)r
N)�superr)r�
FAVORITE_HASH)r)�	__class__rrrUszMissingHashes.__init__cCst|tj���dS)N)rr+r)rrrrrr[szMissingHashes._raise)r%r&r'r(rr�
__classcell__rr)r,rr)Nsr))Z
__future__rrZpip.exceptionsrrrZ	pip.utilsrZpip._vendor.sixrrr	r+Z
STRONG_HASHES�objectr
r)rrrr�<module>s
:logging.cpython-36.opt-1.pyc000064400000007447151731422230011573 0ustar003

�Pf��@sddlmZddlZddlZddlZddlZyddlZWnek
rTddlZYnXddl	m
Z
ddlmZyddl
mZWnek
r�dZYnXej�Zde_ejddd��Zd	d
�ZGdd�dej�Zd
d�ZGdd�dej�ZGdd�dejj�ZGdd�dej�ZdS)�)�absolute_importN)�WINDOWS)�
ensure_dir)�colorama�ccs.tj|7_z
dVWdtj|8_XdS)zv
    A context manager which will cause the log output to be indented for any
    log messages emitted inside it.
    N)�
_log_state�indentation)Znum�r	�/usr/lib/python3.6/logging.py�
indent_logs
rcCsttdd�S)Nrr)�getattrrr	r	r	r
�get_indentation)sr
c@seZdZdd�ZdS)�IndentingFormattercCs,tjj||�}djdd�|jd�D��}|S)z�
        Calls the standard formatter, but will indent all of the log messages
        by our current indentation level.
        �cSsg|]}dt�|�qS)� )r
)�.0�liner	r	r
�
<listcomp>6sz-IndentingFormatter.format.<locals>.<listcomp>T)�logging�	Formatter�format�join�
splitlines)�self�recordZ	formattedr	r	r
r/s
zIndentingFormatter.formatN)�__name__�
__module__�__qualname__rr	r	r	r
r-srcs�fdd�}|S)Ncsdjt��|tjjg�S)Nr)r�listrZStyleZ	RESET_ALL)Zinp)�colorsr	r
�wrapped=sz_color_wrap.<locals>.wrappedr	)rr r	)rr
�_color_wrap<sr!c@sTeZdZer2ejeejj�fej	eejj
�fgZngZddd�Zdd�Z
dd�ZdS)	�ColorizedStreamHandlerNcCs(tjj||�tr$tr$tj|j�|_dS)N)r�
StreamHandler�__init__rr�AnsiToWin32�stream)rr&r	r	r
r$NszColorizedStreamHandler.__init__cCsRtsdSt|jtj�s|jn|jj}t|d�r:|j�r:dStjj	d�dkrNdSdS)NF�isattyTZTERMZANSI)
r�
isinstancer&r%r �hasattrr'�os�environ�get)rZreal_streamr	r	r
�should_colorTsz#ColorizedStreamHandler.should_colorcCsBtjj||�}|j�r>x&|jD]\}}|j|kr||�}PqW|S)N)rr#rr-�COLORS�levelno)rr�msg�levelZcolorr	r	r
ris
zColorizedStreamHandler.format)N)rrrrrZERRORr!ZForeZREDZWARNINGZYELLOWr.r$r-rr	r	r	r
r"Bs
r"c@seZdZdd�ZdS)�BetterRotatingFileHandlercCs ttjj|j��tjjj|�S)N)	rr*�path�dirnameZbaseFilenamer�handlers�RotatingFileHandler�_open)rr	r	r
r7wszBetterRotatingFileHandler._openN)rrrr7r	r	r	r
r2usr2c@seZdZdd�Zdd�ZdS)�MaxLevelFiltercCs
||_dS)N)r1)rr1r	r	r
r$~szMaxLevelFilter.__init__cCs|j|jkS)N)r/r1)rrr	r	r
�filter�szMaxLevelFilter.filterN)rrrr$r9r	r	r	r
r8|sr8)r) Z
__future__r�
contextlibrZlogging.handlersr*Z	threading�ImportErrorZdummy_threadingZ
pip.compatrZ	pip.utilsrZpip._vendorr�	ExceptionZlocalrr�contextmanagerrr
rrr!r#r"r5r6r2�Filterr8r	r	r	r
�<module>s0
3deprecation.cpython-36.opt-1.pyc000064400000003255151731422230012433 0ustar003

�Pf��@s�dZddlmZddlZddlZGdd�de�ZGdd�de�ZGdd	�d	e�Z	Gd
d�dee�Z
Gdd
�d
e�Zdaddd�Z
dd�ZdS)zN
A module that implements tooling to enable easy warnings about deprecations.
�)�absolute_importNc@seZdZdS)�PipDeprecationWarningN)�__name__�
__module__�__qualname__�rr�!/usr/lib/python3.6/deprecation.pyr
src@seZdZdS)�PendingN)rrrrrrrr	sr	c@seZdZdS)�RemovedInPip10WarningN)rrrrrrrr
sr
c@seZdZdS)�RemovedInPip11WarningN)rrrrrrrrsrc@seZdZdS)�Python26DeprecationWarningN)rrrrrrrrsrcCsx|dk	r$tdk	rtt||||||�nPt|t�rbtjd�}d|}t|t�rV|j|�qt|j|�nt||||||�dS)Nzpip.deprecationszDEPRECATION: %s)�_warnings_showwarning�
issubclassr�loggingZ	getLoggerr	Zwarning�error)�message�category�filename�lineno�file�lineZloggerZlog_messagerrr�_showwarning$s


rcCs(tjdtdd�tdkr$tjatt_dS)N�defaultT)�append)�warnings�simplefilterrr
�showwarningrrrrr�install_warning_loggerDsr)NN)�__doc__Z
__future__rrr�Warningr�objectr	r
rrr
rrrrrr�<module>s
 filesystem.cpython-36.opt-1.pyc000064400000001064151731422240012317 0ustar003

�Pf��@s(ddlZddlZddlmZdd�ZdS)�N)�get_path_uidcCs�ttd�sdSd}xp||kr�tjj|�rntj�dkr^yt|�}Wntk
rTdSX|dkStj|tj�Sq|tjj	|�}}qWdS)N�geteuidTrF)
�hasattr�os�path�lexistsrr�OSError�access�W_OK�dirname)rZpreviousZpath_uid�r� /usr/lib/python3.6/filesystem.py�check_path_owners

r)rZos.pathZ
pip.compatrrrrrr
�<module>sdeprecation.cpython-36.pyc000064400000003255151731422240011475 0ustar003

�Pf��@s�dZddlmZddlZddlZGdd�de�ZGdd�de�ZGdd	�d	e�Z	Gd
d�dee�Z
Gdd
�d
e�Zdaddd�Z
dd�ZdS)zN
A module that implements tooling to enable easy warnings about deprecations.
�)�absolute_importNc@seZdZdS)�PipDeprecationWarningN)�__name__�
__module__�__qualname__�rr�!/usr/lib/python3.6/deprecation.pyr
src@seZdZdS)�PendingN)rrrrrrrr	sr	c@seZdZdS)�RemovedInPip10WarningN)rrrrrrrr
sr
c@seZdZdS)�RemovedInPip11WarningN)rrrrrrrrsrc@seZdZdS)�Python26DeprecationWarningN)rrrrrrrrsrcCsx|dk	r$tdk	rtt||||||�nPt|t�rbtjd�}d|}t|t�rV|j|�qt|j|�nt||||||�dS)Nzpip.deprecationszDEPRECATION: %s)�_warnings_showwarning�
issubclassr�loggingZ	getLoggerr	Zwarning�error)�message�category�filename�lineno�file�lineZloggerZlog_messagerrr�_showwarning$s


rcCs(tjdtdd�tdkr$tjatt_dS)N�defaultT)�append)�warnings�simplefilterrr
�showwarningrrrrr�install_warning_loggerDsr)NN)�__doc__Z
__future__rrr�Warningr�objectr	r
rrr
rrrrrr�<module>s
 build.cpython-36.opt-1.pyc000064400000002420151731422250011230 0ustar003

�Pf �@s<ddlmZddlZddlZddlmZGdd�de�ZdS)�)�absolute_importN)�rmtreec@s6eZdZddd�Zdd�Zdd�Zdd	�Zd
d�ZdS)
�BuildDirectoryNcCsL|dkr|dkrd}|dkr<tjjtjdd��}|dkr<d}||_||_dS)NTz
pip-build-)�prefix)�os�path�realpath�tempfileZmkdtemp�name�delete)�selfr
r�r
�/usr/lib/python3.6/build.py�__init__szBuildDirectory.__init__cCsdj|jj|j�S)Nz	<{} {!r}>)�format�	__class__�__name__r
)rr
r
r�__repr__szBuildDirectory.__repr__cCs|jS)N)r
)rr
r
r�	__enter__"szBuildDirectory.__enter__cCs|j�dS)N)�cleanup)r�exc�value�tbr
r
r�__exit__%szBuildDirectory.__exit__cCs|jrt|j�dS)N)rrr
)rr
r
rr(szBuildDirectory.cleanup)NN)r�
__module__�__qualname__rrrrrr
r
r
rr	s

r)	Z
__future__rZos.pathrr	Z	pip.utilsr�objectrr
r
r
r�<module>ssetuptools_build.cpython-36.opt-1.pyc000064400000000464151731422250013537 0ustar003

�Pf�@sdZdS)z�import setuptools, tokenize;__file__=%r;f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))N)ZSETUPTOOLS_SHIM�rr�&/usr/lib/python3.6/setuptools_build.py�<module>sappdirs.cpython-36.opt-1.pyc000064400000017002151731422250011575 0ustar003

�Pfk"�@s�dZddlmZddlZddlZddlmZmZddlm	Z	m
Z
dd�Zdd	d
�Zddd
�Z
dd�Zdd�Zdd�Zer�yddlZeZWnek
r�eZYnXdd�ZdS)zd
This code was taken from https://github.com/ActiveState/appdirs and modified
to suit our purposes.
�)�absolute_importN)�WINDOWS�
expanduser)�PY2�	text_typecCs�tr<tjjtd��}tr*t|t�r*t|�}tjj	||d�}n@t
jdkr^td�}tjj	||�}ntj
dtd��}tjj	||�}|S)a5
    Return full path to the user-specific cache dir for this application.

        "appname" is the name of application.

    Typical user cache directories are:
        macOS:      ~/Library/Caches/<AppName>
        Unix:       ~/.cache/<AppName> (XDG default)
        Windows:    C:\Users\<username>\AppData\Local\<AppName>\Cache

    On Windows the only suggestion in the MSDN docs is that local settings go
    in the `CSIDL_LOCAL_APPDATA` directory. This is identical to the
    non-roaming app data dir (the default returned by `user_data_dir`). Apps
    typically put cache data somewhere *under* the given dir here. Some
    examples:
        ...\Mozilla\Firefox\Profiles\<ProfileName>\Cache
        ...\Acme\SuperApp\Cache\1.0

    OPINION: This function appends "Cache" to the `CSIDL_LOCAL_APPDATA` value.
    �CSIDL_LOCAL_APPDATAZCache�darwinz~/Library/CachesZXDG_CACHE_HOMEz~/.cache)r�os�path�normpath�_get_win_folderr�
isinstancer�_win_path_to_bytes�join�sys�platformr�getenv)�appnamer
�r�/usr/lib/python3.6/appdirs.py�user_cache_dirs
rFcCshtr,|rdpd}tjjtjjt|��|�}n8tjdkrJtjjtd�|�}ntjjtj	dtd��|�}|S)aS
    Return full path to the user-specific data dir for this application.

        "appname" is the name of application.
            If None, just the system directory is returned.
        "roaming" (boolean, default False) can be set True to use the Windows
            roaming appdata directory. That means that for users on a Windows
            network setup for roaming profiles, this user data will be
            sync'd on login. See
            <http://technet.microsoft.com/en-us/library/cc766489(WS.10).aspx>
            for a discussion of issues.

    Typical user data directories are:
        macOS:                  ~/Library/Application Support/<AppName>
        Unix:                   ~/.local/share/<AppName>    # or in
                                $XDG_DATA_HOME, if defined
        Win XP (not roaming):   C:\Documents and Settings\<username>\ ...
                                ...Application Data\<AppName>
        Win XP (roaming):       C:\Documents and Settings\<username>\Local ...
                                ...Settings\Application Data\<AppName>
        Win 7  (not roaming):   C:\Users\<username>\AppData\Local\<AppName>
        Win 7  (roaming):       C:\Users\<username>\AppData\Roaming\<AppName>

    For Unix, we follow the XDG spec and support $XDG_DATA_HOME.
    That means, by default "~/.local/share/<AppName>".
    �
CSIDL_APPDATArrz~/Library/Application Support/Z
XDG_DATA_HOMEz~/.local/share)
rr	r
rrrrrrr)r�roaming�constr
rrr�
user_data_dir>s
rTcCsHtrt||d�}n2tjdkr&t|�}ntjdtd��}tjj||�}|S)arReturn full path to the user-specific config dir for this application.

        "appname" is the name of application.
            If None, just the system directory is returned.
        "roaming" (boolean, default True) can be set False to not use the
            Windows roaming appdata directory. That means that for users on a
            Windows network setup for roaming profiles, this user data will be
            sync'd on login. See
            <http://technet.microsoft.com/en-us/library/cc766489(WS.10).aspx>
            for a discussion of issues.

    Typical user data directories are:
        macOS:                  same as user_data_dir
        Unix:                   ~/.config/<AppName>
        Win *:                  same as user_data_dir

    For Unix, we follow the XDG spec and support $XDG_CONFIG_HOME.
    That means, by default "~/.config/<AppName>".
    )rrZXDG_CONFIG_HOMEz	~/.config)	rrrrr	rrr
r)rrr
rrr�user_config_dirjs

rcs�tr&tjjtd��}tjj|��g}nVtjdkrBtjjd��g}n:tjdd�}|rn�fdd�|j	tj
�D�}ng}|jd�|S)	a�Return a list of potential user-shared config dirs for this application.

        "appname" is the name of application.

    Typical user config directories are:
        macOS:      /Library/Application Support/<AppName>/
        Unix:       /etc or $XDG_CONFIG_DIRS[i]/<AppName>/ for each value in
                    $XDG_CONFIG_DIRS
        Win XP:     C:\Documents and Settings\All Users\Application ...
                    ...Data\<AppName>        Vista:      (Fail! "C:\ProgramData" is a hidden *system* directory
                    on Vista.)
        Win 7:      Hidden, but writeable on Win 7:
                    C:\ProgramData\<AppName>    �CSIDL_COMMON_APPDATArz/Library/Application SupportZXDG_CONFIG_DIRSz/etc/xdgcsg|]}tjjt|����qSr)r	r
rr)�.0�x)rrr�
<listcomp>�sz$site_config_dirs.<locals>.<listcomp>z/etc)rr	r
rrrrrr�split�pathsep�append)rr
ZpathlistZxdg_config_dirsr)rr�site_config_dirs�s


r#cCs:ddl}dddd�|}|j|jd�}|j||�\}}|S)z�
    This is a fallback technique at best. I'm not sure if using the
    registry for this guarantees us the correct answer for all CSIDL_*
    names.
    rNZAppDatazCommon AppDataz
Local AppData)rrrz@Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders)�_winreg�OpenKey�HKEY_CURRENT_USERZQueryValueEx)�
csidl_namer$Zshell_folder_name�keyZ	directoryZ_typerrr�_get_win_folder_from_registry�sr)cCs�dddd�|}tjd�}tjjjd|dd|�d}x|D]}t|�dkr:d	}Pq:W|rztjd�}tjjj|j|d�rz|}|jS)
N��#�)rrrirF�T)	�ctypesZcreate_unicode_bufferZwindllZshell32ZSHGetFolderPathW�ordZkernel32ZGetShortPathNameW�value)r'Zcsidl_constZbufZ
has_high_char�cZbuf2rrr�_get_win_folder_with_ctypes�s 


r2c
Cs6x0dD](}y
|j|�Sttfk
r,YqXqW|S)a�Encode Windows paths to bytes. Only used on Python 2.

    Motivation is to be consistent with other operating systems where paths
    are also returned as bytes. This avoids problems mixing bytes and Unicode
    elsewhere in the codebase. For more details and discussion see
    <https://github.com/pypa/pip/issues/3463>.

    If encoding using ASCII and MBCS fails, return the original Unicode path.
    �ASCII�MBCS)r3r4)�encode�UnicodeEncodeError�LookupError)r
�encodingrrrr�s



r)F)T)�__doc__Z
__future__rr	rZ
pip.compatrrZpip._vendor.sixrrrrrr#r)r2r.r�ImportErrorrrrrr�<module>s$0
,
!(
ui.cpython-36.opt-1.pyc000064400000022441151731422250010553 0ustar003

�PfM-�@s�ddlmZddlmZddlZddlZddlmZmZmZddlZddl	Z	ddl
Z
ddlmZddl
mZddlmZddlmZdd	lmZmZdd
lmZmZmZddlmZyddlmZWnek
r�dZYnXe
je�Z d
d�Z!e!ee�Z"Gdd�de#�Z$Gdd�de#�Z%Gdd�de#�Z&Gdd�de&e$e%e"�Z'Gdd�de&e$e%ee�Z(e	j)dd��Z*Gdd�de#�Z+Gdd�de#�Z,Gdd �d e#�Z-e	j)d!d"��Z.dS)#�)�absolute_import)�divisionN)�signal�SIGINT�default_int_handler)�WINDOWS)�format_size)�get_indentation)�six)�Bar�IncrementalBar)�WritelnMixin�HIDE_CURSOR�SHOW_CURSOR)�Spinner)�coloramacCs�t|jdd�}|s|St|dtj��t|dtj��g}|tt|dg��7}ytj�j|�j|�Wntk
rv|SX|SdS)N�encodingZ
empty_fillZfill�phases)�getattr�filer
Z	text_type�list�join�encode�UnicodeEncodeError)Z	preferredZfallbackrZ
characters�r�/usr/lib/python3.6/ui.py�_select_progress_classsrcs4eZdZdZ�fdd�Z�fdd�Zdd�Z�ZS)�InterruptibleMixina�
    Helper to ensure that self.finish() gets called on keyboard interrupt.

    This allows downloads to be interrupted without leaving temporary state
    (like hidden cursors) behind.

    This class is similar to the progress library's existing SigIntMixin
    helper, but as of version 1.2, that helper has the following problems:

    1. It calls sys.exit().
    2. It discards the existing SIGINT handler completely.
    3. It leaves its own handler in place even after an uninterrupted finish,
       which will have unexpected delayed effects if the user triggers an
       unrelated keyboard interrupt some time after a progress-displaying
       download has already completed, for example.
    cs4tt|�j||�tt|j�|_|jdkr0t|_dS)z=
        Save the original SIGINT handler for later.
        N)�superr�__init__rr�
handle_sigint�original_handlerr)�self�args�kwargs)�	__class__rrrNs
zInterruptibleMixin.__init__cstt|�j�tt|j�dS)z�
        Restore the original SIGINT handler after finishing.

        This should happen regardless of whether the progress display finishes
        normally, or gets interrupted.
        N)rr�finishrrr!)r")r%rrr&^szInterruptibleMixin.finishcCs|j�|j||�dS)z�
        Call self.finish() before delegating to the original SIGINT handler.

        This handler should only be in place while the progress display is
        active.
        N)r&r!)r"Zsignum�framerrrr hsz InterruptibleMixin.handle_sigint)�__name__�
__module__�__qualname__�__doc__rr&r �
__classcell__rr)r%rr<s
rcsJeZdZ�fdd�Zedd��Zedd��Zedd��Zdd
d�Z�Z	S)
�DownloadProgressMixincs,tt|�j||�dt�d|j|_dS)N� �)rr-rr	�message)r"r#r$)r%rrruszDownloadProgressMixin.__init__cCs
t|j�S)N)r�index)r"rrr�
downloadedysz DownloadProgressMixin.downloadedcCs |jdkrdStd|j�dS)Ngz...�z/s)Zavgr)r"rrr�download_speed}s
z$DownloadProgressMixin.download_speedcCs|jrd|jSdS)Nzeta %s�)ZetaZeta_td)r"rrr�
pretty_eta�s
z DownloadProgressMixin.pretty_etar3ccs*x|D]}|V|j|�qW|j�dS)N)�nextr&)r"�it�n�xrrr�iter�s
zDownloadProgressMixin.iter)r3)
r(r)r*r�propertyr2r4r6r;r,rr)r%rr-ss
r-cseZdZ�fdd�Z�ZS)�WindowsMixincs\tr�jrd�_tt��j||�trXtrXtj�j��_�fdd��j_�fdd��j_	dS)NFcs�jjj�S)N)r�wrapped�isattyr)r"rr�<lambda>�sz'WindowsMixin.__init__.<locals>.<lambda>cs�jjj�S)N)rr>�flushr)r"rrr@�s)
rZhide_cursorrr=rrZAnsiToWin32rr?rA)r"r#r$)r%)r"rr�s
zWindowsMixin.__init__)r(r)r*rr,rr)r%rr=�sr=c@seZdZejZdZdZdS)�DownloadProgressBarz
%(percent)d%%z0%(downloaded)s %(download_speed)s %(pretty_eta)sN)r(r)r*�sys�stdoutrr0�suffixrrrrrB�srBc@s&eZdZejZdZdd�Zdd�ZdS)�DownloadProgressSpinnerz!%(downloaded)s %(download_speed)scCs"t|d�stj|j�|_t|j�S)N�_phaser)�hasattr�	itertools�cyclerrGr7)r"rrr�
next_phase�s
z"DownloadProgressSpinner.next_phasecCsN|j|}|j�}|j|}dj||r*dnd||r6dnd|g�}|j|�dS)Nr5r.)r0rKrErZwriteln)r"r0ZphaserE�linerrr�update�s



zDownloadProgressSpinner.updateN)	r(r)r*rCrDrrErKrMrrrrrF�srFccsRtrdVnB|j�s$tj�tjkr,dVn"|jt�z
dVWd|jt�XdS)N)	rr?�logger�getEffectiveLevel�logging�INFO�writerr)rrrr�
hidden_cursor�s

rSc@s$eZdZdd�Zdd�Zdd�ZdS)�RateLimitercCs||_d|_dS)Nr)�_min_update_interval_seconds�_last_update)r"�min_update_interval_secondsrrrr�szRateLimiter.__init__cCstj�}||j}||jkS)N)�timerVrU)r"ZnowZdeltarrr�ready�s
zRateLimiter.readycCstj�|_dS)N)rXrV)r"rrr�reset�szRateLimiter.resetN)r(r)r*rrYrZrrrrrT�srTc@s.eZdZddd�Zdd�Zdd	�Zd
d�ZdS)
�InteractiveSpinnerN�-\|/��?cCs\||_|dkrtj}||_t|�|_d|_tj|�|_	|jj
dt�|jd�d|_dS)NFr.z ... r)
�_messagerCrD�_filerT�
_rate_limiter�	_finishedrIrJ�_spin_cyclerRr	�_width)r"r0rZ
spin_charsrWrrrr�s
zInteractiveSpinner.__init__cCsRd|j}|jj|d|j|�|jj|�t|�|_|jj�|jj�dS)N�r.)rcr_rR�lenrAr`rZ)r"�statusZbackuprrr�_write	s


zInteractiveSpinner._writecCs,|jr
dS|jj�sdS|jt|j��dS)N)rar`rYrgr7rb)r"rrr�spins

zInteractiveSpinner.spincCs4|jr
dS|j|�|jjd�|jj�d|_dS)N�
T)rargr_rRrA)r"�final_statusrrrr&s

zInteractiveSpinner.finish)Nr\r])r(r)r*rrgrhr&rrrrr[�s


r[c@s.eZdZddd�Zdd�Zdd�Zdd	�Zd
S)�NonInteractiveSpinner�<cCs$||_d|_t|�|_|jd�dS)NFZstarted)r^rarTr`�_update)r"r0rWrrrr*s
zNonInteractiveSpinner.__init__cCs|jj�tjd|j|�dS)Nz%s: %s)r`rZrN�infor^)r"rfrrrrm0s
zNonInteractiveSpinner._updatecCs&|jr
dS|jj�sdS|jd�dS)Nzstill running...)rar`rYrm)r"rrrrh5s

zNonInteractiveSpinner.spincCs$|jr
dS|jd|f�d|_dS)Nzfinished with status '%s'T)rarm)r"rjrrrr&<szNonInteractiveSpinner.finishN)rl)r(r)r*rrmrhr&rrrrrk)s
rkccs�tjj�r"tj�tjkr"t|�}nt|�}y t	tj��|VWdQRXWn>t
k
rj|jd��Yn*tk
r�|jd��YnX|jd�dS)NZcanceled�error�done)
rCrDr?rNrOrPrQr[rkrS�KeyboardInterruptr&�	Exception)r0Zspinnerrrr�open_spinnerCs


rs)/Z
__future__rrrIrCrrrrX�
contextlibrPZ
pip.compatrZ	pip.utilsrZpip.utils.loggingr	Zpip._vendorr
Zpip._vendor.progress.barrrZpip._vendor.progress.helpersr
rrZpip._vendor.progress.spinnerrrrrZ	getLoggerr(rNrZ_BaseBar�objectrr-r=rBrF�contextmanagerrSrTr[rkrsrrrr�<module>sB


7
!0interfaces.cpython-36.opt-1.pyc000064400000002400151731443700012255 0ustar003

�<�eL�@s$Gdd�de�ZGdd�de�ZdS)c@seZdZdS)�ExportableInterfaceN)�__name__�
__module__�__qualname__�rr� /usr/lib/python3.6/interfaces.pyrsrc@s<eZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
S)�ExporterInterfacecCs
t��dS)N)�NotImplementedError)�self�methodZin_signature�
out_signaturerrr�exportszExporterInterface.exportcCs
t��dS)N)r)r	r
rrrr�signal	szExporterInterface.signalcOs
t��dS)N)r)r	r
�args�kwargsrrr�send_signal
szExporterInterface.send_signalcCs
t��dS)N)r)r	rrr�startszExporterInterface.startcCs
t��dS)N)r)r	rrr�stopszExporterInterface.stopcCsdS)Nr)r	rrr�period_checkszExporterInterface.period_checkN)	rrrrr
rrrrrrrrrsrN)�objectrrrrrr�<module>sunix_socket_exporter.cpython-36.pyc000064400000021134151731443710013464 0ustar003

�<�e��@s�ddlZddlZddlZddlZddlmZddlZddlj	Z	ddl
mZddlZddl
Z
ddlZejj�ZGdd�dej�ZdS)�N�)�
interfaces)�ismethodc@s�eZdZdZejejejejej	fdd�Z
dd�Zdd�Zdd	�Z
d
d�Zdd
�Zdd�Zdd�Zdd�Zdd�Zd$dd�Zd%dd�Zdd�Zdd�Zd d!�Zd"d#�ZdS)&�UnixSocketExportera9
	Export method calls through Unix Domain Socket Interface.

	We take a method to be exported and create a simple wrapper function
	to call it. This is required as we need the original function to be
	bound to the original object instance. While the wrapper will be bound
	to an object we dynamically construct.
	cCs||_d|_|rtjd|�ng|_g|_dd	g|_|r�|j�}x�t|dd��D]�\}}yt|�|j|<WqPt	k
r�y2|dkr�t
j|�j|j|<nt
j|�j|j|<Wn2tk
r�tjd|dkr�dnd|f�YnXYqPXqPW||_||_i|_t�|_d|_d|_dS)
Nz,;r�rz(%s '%s' does not exists, leaving defaultZUserZGroup���r)�_socket_path�_socket_object�re�split�_socket_signal_pathsZ_socket_signal_objects�
_ownership�	enumerate�int�
ValueError�pwd�getpwnamZpw_uid�grpZgetgrnamZgr_gid�KeyError�log�error�_permissions�_connections_backlog�_unix_socket_methods�set�_signalsZ_connZ_channel)�selfZsocket_pathZsignal_pathsZ	ownershipZpermissionsZconnections_backlog�i�o�r�*/usr/lib/python3.6/unix_socket_exporter.py�__init__s.
.zUnixSocketExporter.__init__cCs
|jdk	S)N)r	)rrrr �running;szUnixSocketExporter.runningcsTt��std���j}||jkr,td|��G�fdd�dt�}|||�|j|<dS)Nz#Only bound methods can be exported.z/Method with this name (%s) is already exported.cs eZdZdd�Z�fdd�ZdS)z*UnixSocketExporter.export.<locals>.wrappercSs||_||_dS)N)Z
_in_signature�_out_signature)r�in_signature�
out_signaturerrr r!Gsz3UnixSocketExporter.export.<locals>.wrapper.__init__cs
�||�S)Nr)r�args�kwargs)�methodrr �__call__Ksz3UnixSocketExporter.export.<locals>.wrapper.__call__N)�__name__�
__module__�__qualname__r!r)r)r(rr �wrapperFsr-)r�	Exceptionr*r�object)rr(r$r%�method_namer-r)r(r �export>s
zUnixSocketExporter.exportcs^t��std���j}||jkr,td|��G�fdd�dt�}||�|j|<|jj|�dS)Nz#Only bound methods can be exported.z/Method with this name (%s) is already exported.cs eZdZdd�Z�fdd�ZdS)z*UnixSocketExporter.signal.<locals>.wrappercSs
||_dS)N)r#)rr%rrr r!Ysz3UnixSocketExporter.signal.<locals>.wrapper.__init__cs
�||�S)Nr)rr&r')r(rr r)\sz3UnixSocketExporter.signal.<locals>.wrapper.__call__N)r*r+r,r!r)r)r(rr r-Xsr-)rr.r*rr/r�add)rr(r%r0r-r)r(r �signalPs
zUnixSocketExporter.signalcOs�||jkrtd|��x�|jD]�}tjd|�yDtjtjtj�}|jd�|j	|�|j
|d||d��|j�Wqtk
r�}ztj
d|||f�WYdd}~XqXqWdS)NzSignal '%s' doesn't exist.zSending signal on socket %sFz2.0)�jsonrpcr(�paramsz2Error while sending signal '%s' to socket '%s': %s)rr.rr�debug�socket�AF_UNIX�SOCK_STREAMZsetblockingZconnect�
_send_data�close�OSError�warning)rr3r&r'�p�s�errr �send_signalbs


zUnixSocketExporter.send_signalcCs|jj|�dS)N)r�append)r�pathrrr �register_signal_pathpsz'UnixSocketExporter.register_signal_pathcCs�|jr�tjj|j�r tj|j�tjtjtj�|_|jj	|j�|jj
|j�tj|j|j
d|j
d�|jr�tj|j|j�dS)Nrr)r�osrC�exists�unlinkr7r8r9r	ZbindZlistenr�chownr
r�chmod)rrrr �_construct_socket_objectssz+UnixSocketExporter._construct_socket_objectcCs |j�rdS|j�|j�dS)N)r"�stoprJ)rrrr �start~szUnixSocketExporter.startcCs|jr|jj�dS)N)r	r;)rrrr rK�szUnixSocketExporter.stopcCsbtjd|�y|jtj|�jd��Wn4tk
r\}ztjd||f�WYdd}~XnXdS)NzSending socket data: %s)zutf-8zFailed to send data '%s': %s)rr6�send�json�dumps�encoder.r=)rr?�datar@rrr r:�s
zUnixSocketExporter._send_dataFcCs$d|d�}|r||d<n||d<|S)Nz2.0)r4�idr�resultr)rrQrRr�resrrr �_create_response�s
z#UnixSocketExporter._create_responseNcCs|j|||d�d|d�S)N)�code�messagerQT)rrR)rU)rrVrWrRrQrrr �_create_error_responce�s
z)UnixSocketExporter._create_error_responcecCs|j||�S)N)rU)rrSrRrrr �_create_result_response�sz*UnixSocketExporter._create_result_responsecCs|jd�r|SdS)NrR)�get)rrQrrr �	_check_id�s
zUnixSocketExporter._check_idcCsnt|�tks&|jd�dks&|jd�r2|jdd�S|jd�}d}|d|jkrb|j|jdd|��Sy�|jd	�s�|j|d�}njt|d	�ttfkr�|j|d|d	�}n>t|d	�tkr�|j|df|d	�}n|j|jdd|��SWnntk
�r$}z|j|jdd|t	|���Sd}~Xn8t
k
�rZ}z|j|jdd
|t	|���Sd}~XnX|j|j||��S)Nr4z2.0r(iXzInvalid RequestrRiYzMethod not foundr5iZzInvalid paramsr�Errori����i����i����i����)�type�dictrZrXrr[�list�tuple�	TypeError�strr.rY)r�reqrR�retr@rrr �_process_request�s&&

$&z#UnixSocketExporter._process_requestc	#Cs�|j�sdS�x�tj|jgffd�\}}}|�r�|jj�\}}y*d}x |jd�j�}|sZP||7}qFWWn2tk
r�}ztjd|�wWYdd}~XnX|�r�yt	j
|�}WnRtk
�r}z4tjd||f�|j||jddt
|���wWYdd}~XnXt|�tttfk�r>tjd	�|j||jd
dt
|���qt|�ttfk�r�t|�dk�rz|j||jddt
|���qg}x(|D] }|j|�}|�r�|j|��q�W|�r�|j||�n|j|�}|�r�|j||�qdSqWdS)a�
		Periodically checks socket object for new calls. This allows to function without special thread.
		Interface is according JSON-RPC 2.0 Specification (see https://www.jsonrpc.org/specification)
		
		Example calls:
		
		printf '[{"jsonrpc": "2.0", "method": "active_profile", "id": 1}, {"jsonrpc": "2.0", "method": "profiles", "id": 2}]' | nc -U /run/tuned/tuned.sock
		printf '{"jsonrpc": "2.0", "method": "switch_profile", "params": {"profile_name": "balanced"}, "id": 1}' | nc -U /run/tuned/tuned.sock
		Nr�iz"Failed to load data of message: %sz!Failed to load json data '%s': %si�zParse errorzWrong format of calliXzInvalid RequestiD���iD���i����)r"�selectr	ZacceptZrecv�decoder.rrrN�loadsr:rXrbr]r`r_r^�lenrerB)	r�r�_ZconnrQZrec_datar@rTrcrrr �period_check�sT




zUnixSocketExporter.period_check)F)NN)r*r+r,�__doc__�constsZCFG_DEF_UNIX_SOCKET_PATHZ CFG_DEF_UNIX_SOCKET_SIGNAL_PATHSZCFG_DEF_UNIX_SOCKET_OWNERSHIPZCFG_DEF_UNIX_SOCKET_PERMISIONSZ'CFG_DEF_UNIX_SOCKET_CONNECTIONS_BACKLOGr!r"r1r3rArDrJrLrKr:rUrXrYr[rermrrrr rs*

r)rEr
rrrfrZ
tuned.logsZtunedZtuned.constsro�inspectrr7rNrgZlogsrZrZExporterInterfacerrrrr �<module>s

dbus_exporter_with_properties.cpython-36.opt-1.pyc000064400000006315151731443720016341 0ustar003

�<�e*�@sTddlmZddlmZmZddlmZddlmZddl	m
Z
Gdd�de
�ZdS)	�)�ismethod)�method�signal)�PROPERTIES_IFACE)�
DBusException)�DBusExportercs4eZdZ�fdd�Zdd�Zdd�Zdd�Z�ZS)	�DBusExporterWithPropertiesc	s�tt��j||||�i�_i�_�fdd�}�fdd�}�fdd�}�fdd�}ttd	d
d�|��jd<ttd
d�|��jd<ttddd�|��jd<ttdd�|��jd<�j	j
d�dS)Ncs<|�jkrtd|��|�jkr,td|���j|}|�S)NzUnknown interface: %szNo such property: %s)�_interface_namer�_property_getters)�_�interface_name�
property_name�getter)�self��3/usr/lib/python3.6/dbus_exporter_with_properties.py�Gets


z0DBusExporterWithProperties.__init__.<locals>.GetcsB|�jkrtd|��|�jkr,td|���j|}||�dS)NzUnknown interface: %szNo such property: %s)r	r�_property_setters)rrr
�value�setter)rrr�Sets


z0DBusExporterWithProperties.__init__.<locals>.Setcs*|�jkrtd|��dd��jj�D�S)NzUnknown interface: %scSsi|]\}}|�|�qSrr)�.0�namerrrr�
<dictcomp>!szGDBusExporterWithProperties.__init__.<locals>.GetAll.<locals>.<dictcomp>)r	rr
�items)rr)rrr�GetAlls
z3DBusExporterWithProperties.__init__.<locals>.GetAllcs|�jkrtd|��dS)NzUnknown interface: %s)r	r)rrZchanged_propertiesZinvalidated_properties)rrr�PropertiesChanged#s
z>DBusExporterWithProperties.__init__.<locals>.PropertiesChangedZss�v)�in_signatureZ
out_signaturerZssv)rr�sza{sv}rzsa{sv}as)Z	signaturer)�superr�__init__rr
rrZ
_dbus_methodsrZ_signals�add)	rZbus_namerZobject_name�	namespacerrrr)�	__class__)rrr!	sz#DBusExporterWithProperties.__init__cCs|jd|j||ii�dS)Nr)Zsend_signalr	)rr
rrrr�property_changed-sz+DBusExporterWithProperties.property_changedcCs0t|�std��||jkr"td��||j|<dS)Nz#Only bound methods can be exported.z1A getter for this property is already registered.)r�	Exceptionr
)rrr
rrr�property_getter0s

z*DBusExporterWithProperties.property_gettercCs0t|�std��||jkr"td��||j|<dS)Nz#Only bound methods can be exported.z1A setter for this property is already registered.)rr&r)rrr
rrr�property_setter7s

z*DBusExporterWithProperties.property_setter)�__name__�
__module__�__qualname__r!r%r'r(�
__classcell__rr)r$rrs$rN)�inspectrZdbus.servicerrZdbusrZdbus.exceptionsrZtuned.exports.dbus_exporterrrrrrr�<module>s
controller.cpython-36.pyc000064400000011237151731443720011370 0ustar003

�<�e�
�@s4ddlmZddlZddlZGdd�dejj�ZdS)�)�
interfaces�Ncs�eZdZdZ�fdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zdd�Zd d!�Zd"d#�Z�ZS)$�ExportsControllerz4
	Controls and manages object interface exporting.
	cs$tt|�j�g|_g|_d|_dS)NF)�superr�__init__�
_exporters�_objects�_exports_initialized)�self)�	__class__�� /usr/lib/python3.6/controller.pyr
szExportsController.__init__cCs|jj|�dS)zRegister objects exporter.N)r�append)r
�instancerrr
�register_exportersz#ExportsController.register_exportercCs|jj|�dS)zRegister object to be exported.N)rr)r
rrrr
�register_objectsz!ExportsController.register_objectcCstj|�ot|d�S)z8Check if method was marked with @exports.export wrapper.�
export_params)�inspect�ismethod�hasattr)r
�methodrrr
�_is_exportable_methodsz'ExportsController._is_exportable_methodcCstj|�ot|d�S)z8Check if method was marked with @exports.signal wrapper.�
signal_params)rrr)r
rrrr
�_is_exportable_signalsz'ExportsController._is_exportable_signalcCstj|�ot|d�S)z>Check if method was marked with @exports.get_property wrapper.�property_get_params)rrr)r
rrrr
�_is_exportable_getter sz'ExportsController._is_exportable_gettercCstj|�ot|d�S)z>Check if method was marked with @exports.set_property wrapper.�property_set_params)rrr)r
rrrr
�_is_exportable_setter$sz'ExportsController._is_exportable_settercCs:x4|jD]*}|jd}|jd}|j|f|�|�qWdS)z!Register method to all exporters.rrN)rrZexport)r
r�exporter�args�kwargsrrr
�_export_method(s

z ExportsController._export_methodcCs:x4|jD]*}|jd}|jd}|j|f|�|�qWdS)z!Register signal to all exporters.rrN)rr�signal)r
rrrr rrr
�_export_signal/s

z ExportsController._export_signalcCs:x4|jD]*}|jd}|jd}|j|f|�|�qWdS)z*Register property getter to all exporters.rrN)rrZproperty_getter)r
rrrr rrr
�_export_getter6s

z ExportsController._export_gettercCs:x4|jD]*}|jd}|jd}|j|f|�|�qWdS)z*Register property setter to all exporters.rrN)rrZproperty_setter)r
rrrr rrr
�_export_setter=s

z ExportsController._export_settercOs&x |jD]}|j|f|�|�qWdS)z!Register signal to all exporters.N)r�send_signal)r
r"rr rrrr
r&DszExportsController.send_signalcOs x|jD]}|j||�qWdS)N)r�property_changed)r
rr rrrr
r'Isz"ExportsController.property_changedcCsx|jD]}|j�qWdS)z=Allows to perform checks on exporters without special thread.N)r�period_check)r
rrrr
r(MszExportsController.period_checkcCs�|jr
dSx�|jD]�}x$tj||j�D]\}}|j|�q&Wx$tj||j�D]\}}|j|�qLWx$tj||j�D]\}}|j	|�qrWx$tj||j
�D]\}}|j|�q�WqWd|_dS)NT)r	rrZ
getmembersrr!rr#rr$rr%)r
r�namerrrr
�_initialize_exportsRsz%ExportsController._initialize_exportscCs$|j�x|jD]}|j�qWdS)zStart the exports.N)r*r�start)r
rrrr
r+bszExportsController.startcCsx|jD]}|j�qWdS)zStop the exports.N)r�stop)r
rrrr
r,hszExportsController.stop)�__name__�
__module__�__qualname__�__doc__rrrrrrrr!r#r$r%r&r'r(r*r+r,�
__classcell__rr)rr
rs$r)�rrZtuned.patternsZtunedZpatternsZ	Singletonrrrrr
�<module>sunix_socket_exporter.cpython-36.opt-1.pyc000064400000021134151731443740014426 0ustar003

�<�e��@s�ddlZddlZddlZddlZddlmZddlZddlj	Z	ddl
mZddlZddl
Z
ddlZejj�ZGdd�dej�ZdS)�N�)�
interfaces)�ismethodc@s�eZdZdZejejejejej	fdd�Z
dd�Zdd�Zdd	�Z
d
d�Zdd
�Zdd�Zdd�Zdd�Zdd�Zd$dd�Zd%dd�Zdd�Zdd�Zd d!�Zd"d#�ZdS)&�UnixSocketExportera9
	Export method calls through Unix Domain Socket Interface.

	We take a method to be exported and create a simple wrapper function
	to call it. This is required as we need the original function to be
	bound to the original object instance. While the wrapper will be bound
	to an object we dynamically construct.
	cCs||_d|_|rtjd|�ng|_g|_dd	g|_|r�|j�}x�t|dd��D]�\}}yt|�|j|<WqPt	k
r�y2|dkr�t
j|�j|j|<nt
j|�j|j|<Wn2tk
r�tjd|dkr�dnd|f�YnXYqPXqPW||_||_i|_t�|_d|_d|_dS)
Nz,;r�rz(%s '%s' does not exists, leaving defaultZUserZGroup���r)�_socket_path�_socket_object�re�split�_socket_signal_pathsZ_socket_signal_objects�
_ownership�	enumerate�int�
ValueError�pwd�getpwnamZpw_uid�grpZgetgrnamZgr_gid�KeyError�log�error�_permissions�_connections_backlog�_unix_socket_methods�set�_signalsZ_connZ_channel)�selfZsocket_pathZsignal_pathsZ	ownershipZpermissionsZconnections_backlog�i�o�r�*/usr/lib/python3.6/unix_socket_exporter.py�__init__s.
.zUnixSocketExporter.__init__cCs
|jdk	S)N)r	)rrrr �running;szUnixSocketExporter.runningcsTt��std���j}||jkr,td|��G�fdd�dt�}|||�|j|<dS)Nz#Only bound methods can be exported.z/Method with this name (%s) is already exported.cs eZdZdd�Z�fdd�ZdS)z*UnixSocketExporter.export.<locals>.wrappercSs||_||_dS)N)Z
_in_signature�_out_signature)r�in_signature�
out_signaturerrr r!Gsz3UnixSocketExporter.export.<locals>.wrapper.__init__cs
�||�S)Nr)r�args�kwargs)�methodrr �__call__Ksz3UnixSocketExporter.export.<locals>.wrapper.__call__N)�__name__�
__module__�__qualname__r!r)r)r(rr �wrapperFsr-)r�	Exceptionr*r�object)rr(r$r%�method_namer-r)r(r �export>s
zUnixSocketExporter.exportcs^t��std���j}||jkr,td|��G�fdd�dt�}||�|j|<|jj|�dS)Nz#Only bound methods can be exported.z/Method with this name (%s) is already exported.cs eZdZdd�Z�fdd�ZdS)z*UnixSocketExporter.signal.<locals>.wrappercSs
||_dS)N)r#)rr%rrr r!Ysz3UnixSocketExporter.signal.<locals>.wrapper.__init__cs
�||�S)Nr)rr&r')r(rr r)\sz3UnixSocketExporter.signal.<locals>.wrapper.__call__N)r*r+r,r!r)r)r(rr r-Xsr-)rr.r*rr/r�add)rr(r%r0r-r)r(r �signalPs
zUnixSocketExporter.signalcOs�||jkrtd|��x�|jD]�}tjd|�yDtjtjtj�}|jd�|j	|�|j
|d||d��|j�Wqtk
r�}ztj
d|||f�WYdd}~XqXqWdS)NzSignal '%s' doesn't exist.zSending signal on socket %sFz2.0)�jsonrpcr(�paramsz2Error while sending signal '%s' to socket '%s': %s)rr.rr�debug�socket�AF_UNIX�SOCK_STREAMZsetblockingZconnect�
_send_data�close�OSError�warning)rr3r&r'�p�s�errr �send_signalbs


zUnixSocketExporter.send_signalcCs|jj|�dS)N)r�append)r�pathrrr �register_signal_pathpsz'UnixSocketExporter.register_signal_pathcCs�|jr�tjj|j�r tj|j�tjtjtj�|_|jj	|j�|jj
|j�tj|j|j
d|j
d�|jr�tj|j|j�dS)Nrr)r�osrC�exists�unlinkr7r8r9r	ZbindZlistenr�chownr
r�chmod)rrrr �_construct_socket_objectssz+UnixSocketExporter._construct_socket_objectcCs |j�rdS|j�|j�dS)N)r"�stoprJ)rrrr �start~szUnixSocketExporter.startcCs|jr|jj�dS)N)r	r;)rrrr rK�szUnixSocketExporter.stopcCsbtjd|�y|jtj|�jd��Wn4tk
r\}ztjd||f�WYdd}~XnXdS)NzSending socket data: %s)zutf-8zFailed to send data '%s': %s)rr6�send�json�dumps�encoder.r=)rr?�datar@rrr r:�s
zUnixSocketExporter._send_dataFcCs$d|d�}|r||d<n||d<|S)Nz2.0)r4�idr�resultr)rrQrRr�resrrr �_create_response�s
z#UnixSocketExporter._create_responseNcCs|j|||d�d|d�S)N)�code�messagerQT)rrR)rU)rrVrWrRrQrrr �_create_error_responce�s
z)UnixSocketExporter._create_error_responcecCs|j||�S)N)rU)rrSrRrrr �_create_result_response�sz*UnixSocketExporter._create_result_responsecCs|jd�r|SdS)NrR)�get)rrQrrr �	_check_id�s
zUnixSocketExporter._check_idcCsnt|�tks&|jd�dks&|jd�r2|jdd�S|jd�}d}|d|jkrb|j|jdd|��Sy�|jd	�s�|j|d�}njt|d	�ttfkr�|j|d|d	�}n>t|d	�tkr�|j|df|d	�}n|j|jdd|��SWnntk
�r$}z|j|jdd|t	|���Sd}~Xn8t
k
�rZ}z|j|jdd
|t	|���Sd}~XnX|j|j||��S)Nr4z2.0r(iXzInvalid RequestrRiYzMethod not foundr5iZzInvalid paramsr�Errori����i����i����i����)�type�dictrZrXrr[�list�tuple�	TypeError�strr.rY)r�reqrR�retr@rrr �_process_request�s&&

$&z#UnixSocketExporter._process_requestc	#Cs�|j�sdS�x�tj|jgffd�\}}}|�r�|jj�\}}y*d}x |jd�j�}|sZP||7}qFWWn2tk
r�}ztjd|�wWYdd}~XnX|�r�yt	j
|�}WnRtk
�r}z4tjd||f�|j||jddt
|���wWYdd}~XnXt|�tttfk�r>tjd	�|j||jd
dt
|���qt|�ttfk�r�t|�dk�rz|j||jddt
|���qg}x(|D] }|j|�}|�r�|j|��q�W|�r�|j||�n|j|�}|�r�|j||�qdSqWdS)a�
		Periodically checks socket object for new calls. This allows to function without special thread.
		Interface is according JSON-RPC 2.0 Specification (see https://www.jsonrpc.org/specification)
		
		Example calls:
		
		printf '[{"jsonrpc": "2.0", "method": "active_profile", "id": 1}, {"jsonrpc": "2.0", "method": "profiles", "id": 2}]' | nc -U /run/tuned/tuned.sock
		printf '{"jsonrpc": "2.0", "method": "switch_profile", "params": {"profile_name": "balanced"}, "id": 1}' | nc -U /run/tuned/tuned.sock
		Nr�iz"Failed to load data of message: %sz!Failed to load json data '%s': %si�zParse errorzWrong format of calliXzInvalid RequestiD���iD���i����)r"�selectr	ZacceptZrecv�decoder.rrrN�loadsr:rXrbr]r`r_r^�lenrerB)	r�r�_ZconnrQZrec_datar@rTrcrrr �period_check�sT




zUnixSocketExporter.period_check)F)NN)r*r+r,�__doc__�constsZCFG_DEF_UNIX_SOCKET_PATHZ CFG_DEF_UNIX_SOCKET_SIGNAL_PATHSZCFG_DEF_UNIX_SOCKET_OWNERSHIPZCFG_DEF_UNIX_SOCKET_PERMISIONSZ'CFG_DEF_UNIX_SOCKET_CONNECTIONS_BACKLOGr!r"r1r3rArDrJrLrKr:rUrXrYr[rermrrrr rs*

r)rEr
rrrfrZ
tuned.logsZtunedZtuned.constsro�inspectrr7rNrgZlogsrZrZExporterInterfacerrrrr �<module>s

interfaces.cpython-36.pyc000064400000002400151731443740011322 0ustar003

�<�eL�@s$Gdd�de�ZGdd�de�ZdS)c@seZdZdS)�ExportableInterfaceN)�__name__�
__module__�__qualname__�rr� /usr/lib/python3.6/interfaces.pyrsrc@s<eZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
S)�ExporterInterfacecCs
t��dS)N)�NotImplementedError)�self�methodZin_signature�
out_signaturerrr�exportszExporterInterface.exportcCs
t��dS)N)r)r	r
rrrr�signal	szExporterInterface.signalcOs
t��dS)N)r)r	r
�args�kwargsrrr�send_signal
szExporterInterface.send_signalcCs
t��dS)N)r)r	rrr�startszExporterInterface.startcCs
t��dS)N)r)r	rrr�stopszExporterInterface.stopcCsdS)Nr)r	rrr�period_checkszExporterInterface.period_checkN)	rrrrr
rrrrrrrrrsrN)�objectrrrrrr�<module>sdbus_exporter.cpython-36.pyc000064400000015573151731443750012104 0ustar003

�<�eO�@sddlmZddlZddlZddlZddlZddlZddlZ	ddl
jZddlZddl
Z
ddlmZddlmZddlmZddlmZddlmZdd	lmZydd
lmZdd�ZWn ek
r�dd
lmZYnXe	jj�Zdd�ZGdd�dej �Z!dS)�)�
interfaces�N)�ismethod)�polkit)�GLib)�FunctionType)�
DBusException)�ErrorMessage)�getfullargspeccCst|�S)N)r
)�func�r�#/usr/lib/python3.6/dbus_exporter.py�
getargspecsr)rcCs�t|dd�}|dk	rn0t|dd�dkr4d|jj}nd|j|jjf}t|t�rZ|j�}ndjtj	|j|��}t
|||�}|j�s�|j|�dS)NZ_dbus_error_name�
__module__��__main__zorg.freedesktop.DBus.Python.%sz!org.freedesktop.DBus.Python.%s.%s)rr)
�getattr�	__class__�__name__r�
isinstancerZget_dbus_message�join�	traceback�format_exception_onlyr	Zget_no_replyZsend_message)Z
connection�messageZ	exception�name�contentsZreplyrrr
�_method_reply_error$s

rc@s�eZdZdZdd�Zedd��Zedd��Zedd	��Zd
d�Z	dd
�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�ZdS)�DBusExportera+
	Export method calls through DBus Interface.

	We take a method to be exported and create a simple wrapper function
	to call it. This is required as we need the original function to be
	bound to the original object instance. While the wrapper will be bound
	to an object we dynamically construct.
	cCs�tj�tjkrttj_tjjj	dd�d|_
d|_i|_t
�|_||_||_||_||_d|_d|_t�|_tjtj�}tj�|_tjtj|�dS)NT)Zset_as_default)�logZgetEffectiveLevel�logging�DEBUGr�dbus�serviceZmainloopZglibZ
DBusGMainLoop�_dbus_object_clsZ_dbus_object�
_dbus_methods�set�_signals�	_bus_name�_interface_name�_object_name�
_namespace�_thread�_bus_objectr�_polkit�signal�	getsignal�SIGINTrZMainLoop�
_main_loop)�self�bus_name�interface_name�object_name�	namespaceZsignal_handlerrrr
�__init__Bs"
zDBusExporter.__init__cCs|jS)N)r')r2rrr
r3`szDBusExporter.bus_namecCs|jS)N)r()r2rrr
r4dszDBusExporter.interface_namecCs|jS)N)r))r2rrr
r5hszDBusExporter.object_namecCs
|jdk	S)N)r+)r2rrr
�runninglszDBusExporter.runningcCsNdj|jdjt|j�j�d�}t|dt|j�d�}t	|j
dt�|j�}|S)Nz2def {name}({args}):
					return wrapper({args})
		z, )r�argsz<decorator-gen-%d>�execr)�formatrrr�__func__r9�compile�lenr$r�	co_consts�locals)r2�method�wrapper�source�coderrrr
�_prepare_for_dbusoszDBusExporter._prepare_for_dbuscsjt��std���j}|�jkr(td����fdd�}�j�|�}tjj�j||dd�|�}|�j|<dS)Nz#Only bound methods can be exported.z*Method with this name is already exported.cs
�jd�j}|d}tjd||f��jj||�}|}|dkrXtjd||f�n�|dkrttjd||f�n�|dkr�tjd||f�t|dd
��d	g}nZ|dkr�tjd
||f�t|dd��d	g}n(tj	d||f�t|dd��d	g}�||�S)N�.rz?checking authorization for action '%s' requested by caller '%s'zJaction '%s' requested by caller '%s' was successfully authorized by polkit�zepolkit error, but action '%s' requested by caller '%s' was successfully authorized by fallback methodrzLaction '%s' requested by caller '%s' wasn't authorized, ignoring the requestrzppolkit error and action '%s' requested by caller '%s' wasn't authorized by fallback method, ignoring the requestzvpolkit error and unable to use fallback method to authorize action '%s' requested by caller '%s', ignoring the request���rHrHrHrH)
r*rr�debugr-Zcheck_authorization�warn�info�list�error)�ownerr9�kwargsZ	action_id�caller�retZ	args_copy)rAr2rr
rB�s$z$DBusExporter.export.<locals>.wrapperrP)Zsender_keyword)	r�	Exceptionrr$rEr!r"rAr()r2rAZin_signature�
out_signature�method_namerBr)rAr2r
�export}s
zDBusExporter.exportcsnt��std���j}||jkr(td���fdd�}|j�|�}tjj|j|�|�}||j|<|j	j
|�dS)Nz#Only bound methods can be exported.z*Method with this name is already exported.cs
�||�S)Nr)rNr9rO)rArr
rB�sz$DBusExporter.signal.<locals>.wrapper)rrRrr$rEr!r"r.r(r&�add)r2rArSrTrBr)rAr
r.�s

zDBusExporter.signalcOsfd}||jks|jdkrd}yt|j|�}Wntk
rDd}YnX|rXtd|��n
|||�dS)NFTzSignal '%s' doesn't exist.)r&r,r�AttributeErrorrR)r2r.r9rO�errrArrr
�send_signal�s
zDBusExporter.send_signalcCs<|jdk	rtd��dt|�}t|tjjf|j�}||_dS)Nz%The exporter class was already build.zDBusExporter_%d)r#rR�id�typer!r"ZObjectr$)r2Zunique_name�clsrrr
�_construct_dbus_object_class�s

z)DBusExporter._construct_dbus_object_classcCsn|j�rdS|jdkr|j�|j�tj�}tjj|j|�}|j||j	|�|_
tj|j
d�|_|jj�dS)N)�target)r8r#r]�stopr!Z	SystemBusr"ZBusNamer'r)r,�	threadingZThread�_thread_coder+�start)r2Zbusr3rrr
rb�s
zDBusExporter.startcCs2|jdk	r.|jj�r.|jj�|jj�d|_dS)N)r+Zis_aliver1�quitr)r2rrr
r_�s

zDBusExporter.stopcCs|jj�|`d|_dS)N)r1Zrunr,)r2rrr
ra�s
zDBusExporter._thread_codeN)rr�__qualname__�__doc__r7�propertyr3r4r5r8rErUr.rYr]rbr_rarrrr
r8s"
	
r)"rrZdbus.servicer!Zdbus.mainloop.glibZdbus.exceptionsr`r.Z
tuned.logsZtunedZtuned.constsZconstsrr�inspectrZtuned.utils.polkitrZ
gi.repositoryr�typesrrZ
dbus.lowlevelr	r
r�ImportErrorZlogs�getrrZExporterInterfacerrrrr
�<module>s.

dbus_exporter_with_properties.cpython-36.pyc000064400000006315151731443760015406 0ustar003

�<�e*�@sTddlmZddlmZmZddlmZddlmZddl	m
Z
Gdd�de
�ZdS)	�)�ismethod)�method�signal)�PROPERTIES_IFACE)�
DBusException)�DBusExportercs4eZdZ�fdd�Zdd�Zdd�Zdd�Z�ZS)	�DBusExporterWithPropertiesc	s�tt��j||||�i�_i�_�fdd�}�fdd�}�fdd�}�fdd�}ttd	d
d�|��jd<ttd
d�|��jd<ttddd�|��jd<ttdd�|��jd<�j	j
d�dS)Ncs<|�jkrtd|��|�jkr,td|���j|}|�S)NzUnknown interface: %szNo such property: %s)�_interface_namer�_property_getters)�_�interface_name�
property_name�getter)�self��3/usr/lib/python3.6/dbus_exporter_with_properties.py�Gets


z0DBusExporterWithProperties.__init__.<locals>.GetcsB|�jkrtd|��|�jkr,td|���j|}||�dS)NzUnknown interface: %szNo such property: %s)r	r�_property_setters)rrr
�value�setter)rrr�Sets


z0DBusExporterWithProperties.__init__.<locals>.Setcs*|�jkrtd|��dd��jj�D�S)NzUnknown interface: %scSsi|]\}}|�|�qSrr)�.0�namerrrr�
<dictcomp>!szGDBusExporterWithProperties.__init__.<locals>.GetAll.<locals>.<dictcomp>)r	rr
�items)rr)rrr�GetAlls
z3DBusExporterWithProperties.__init__.<locals>.GetAllcs|�jkrtd|��dS)NzUnknown interface: %s)r	r)rrZchanged_propertiesZinvalidated_properties)rrr�PropertiesChanged#s
z>DBusExporterWithProperties.__init__.<locals>.PropertiesChangedZss�v)�in_signatureZ
out_signaturerZssv)rr�sza{sv}rzsa{sv}as)Z	signaturer)�superr�__init__rr
rrZ
_dbus_methodsrZ_signals�add)	rZbus_namerZobject_name�	namespacerrrr)�	__class__)rrr!	sz#DBusExporterWithProperties.__init__cCs|jd|j||ii�dS)Nr)Zsend_signalr	)rr
rrrr�property_changed-sz+DBusExporterWithProperties.property_changedcCs0t|�std��||jkr"td��||j|<dS)Nz#Only bound methods can be exported.z1A getter for this property is already registered.)r�	Exceptionr
)rrr
rrr�property_getter0s

z*DBusExporterWithProperties.property_gettercCs0t|�std��||jkr"td��||j|<dS)Nz#Only bound methods can be exported.z1A setter for this property is already registered.)rr&r)rrr
rrr�property_setter7s

z*DBusExporterWithProperties.property_setter)�__name__�
__module__�__qualname__r!r%r'r(�
__classcell__rr)r$rrs$rN)�inspectrZdbus.servicerrZdbusrZdbus.exceptionsrZtuned.exports.dbus_exporterrrrrrr�<module>s
controller.cpython-36.opt-1.pyc000064400000011237151731443760012333 0ustar003

�<�e�
�@s4ddlmZddlZddlZGdd�dejj�ZdS)�)�
interfaces�Ncs�eZdZdZ�fdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zdd�Zd d!�Zd"d#�Z�ZS)$�ExportsControllerz4
	Controls and manages object interface exporting.
	cs$tt|�j�g|_g|_d|_dS)NF)�superr�__init__�
_exporters�_objects�_exports_initialized)�self)�	__class__�� /usr/lib/python3.6/controller.pyr
szExportsController.__init__cCs|jj|�dS)zRegister objects exporter.N)r�append)r
�instancerrr
�register_exportersz#ExportsController.register_exportercCs|jj|�dS)zRegister object to be exported.N)rr)r
rrrr
�register_objectsz!ExportsController.register_objectcCstj|�ot|d�S)z8Check if method was marked with @exports.export wrapper.�
export_params)�inspect�ismethod�hasattr)r
�methodrrr
�_is_exportable_methodsz'ExportsController._is_exportable_methodcCstj|�ot|d�S)z8Check if method was marked with @exports.signal wrapper.�
signal_params)rrr)r
rrrr
�_is_exportable_signalsz'ExportsController._is_exportable_signalcCstj|�ot|d�S)z>Check if method was marked with @exports.get_property wrapper.�property_get_params)rrr)r
rrrr
�_is_exportable_getter sz'ExportsController._is_exportable_gettercCstj|�ot|d�S)z>Check if method was marked with @exports.set_property wrapper.�property_set_params)rrr)r
rrrr
�_is_exportable_setter$sz'ExportsController._is_exportable_settercCs:x4|jD]*}|jd}|jd}|j|f|�|�qWdS)z!Register method to all exporters.rrN)rrZexport)r
r�exporter�args�kwargsrrr
�_export_method(s

z ExportsController._export_methodcCs:x4|jD]*}|jd}|jd}|j|f|�|�qWdS)z!Register signal to all exporters.rrN)rr�signal)r
rrrr rrr
�_export_signal/s

z ExportsController._export_signalcCs:x4|jD]*}|jd}|jd}|j|f|�|�qWdS)z*Register property getter to all exporters.rrN)rrZproperty_getter)r
rrrr rrr
�_export_getter6s

z ExportsController._export_gettercCs:x4|jD]*}|jd}|jd}|j|f|�|�qWdS)z*Register property setter to all exporters.rrN)rrZproperty_setter)r
rrrr rrr
�_export_setter=s

z ExportsController._export_settercOs&x |jD]}|j|f|�|�qWdS)z!Register signal to all exporters.N)r�send_signal)r
r"rr rrrr
r&DszExportsController.send_signalcOs x|jD]}|j||�qWdS)N)r�property_changed)r
rr rrrr
r'Isz"ExportsController.property_changedcCsx|jD]}|j�qWdS)z=Allows to perform checks on exporters without special thread.N)r�period_check)r
rrrr
r(MszExportsController.period_checkcCs�|jr
dSx�|jD]�}x$tj||j�D]\}}|j|�q&Wx$tj||j�D]\}}|j|�qLWx$tj||j�D]\}}|j	|�qrWx$tj||j
�D]\}}|j|�q�WqWd|_dS)NT)r	rrZ
getmembersrr!rr#rr$rr%)r
r�namerrrr
�_initialize_exportsRsz%ExportsController._initialize_exportscCs$|j�x|jD]}|j�qWdS)zStart the exports.N)r*r�start)r
rrrr
r+bszExportsController.startcCsx|jD]}|j�qWdS)zStop the exports.N)r�stop)r
rrrr
r,hszExportsController.stop)�__name__�
__module__�__qualname__�__doc__rrrrrrrr!r#r$r%r&r'r(r*r+r,�
__classcell__rr)rr
rs$r)�rrZtuned.patternsZtunedZpatternsZ	Singletonrrrrr
�<module>sdbus_exporter.cpython-36.opt-1.pyc000064400000015573151731443770013045 0ustar003

�<�eO�@sddlmZddlZddlZddlZddlZddlZddlZ	ddl
jZddlZddl
Z
ddlmZddlmZddlmZddlmZddlmZdd	lmZydd
lmZdd�ZWn ek
r�dd
lmZYnXe	jj�Zdd�ZGdd�dej �Z!dS)�)�
interfaces�N)�ismethod)�polkit)�GLib)�FunctionType)�
DBusException)�ErrorMessage)�getfullargspeccCst|�S)N)r
)�func�r�#/usr/lib/python3.6/dbus_exporter.py�
getargspecsr)rcCs�t|dd�}|dk	rn0t|dd�dkr4d|jj}nd|j|jjf}t|t�rZ|j�}ndjtj	|j|��}t
|||�}|j�s�|j|�dS)NZ_dbus_error_name�
__module__��__main__zorg.freedesktop.DBus.Python.%sz!org.freedesktop.DBus.Python.%s.%s)rr)
�getattr�	__class__�__name__r�
isinstancerZget_dbus_message�join�	traceback�format_exception_onlyr	Zget_no_replyZsend_message)Z
connection�messageZ	exception�name�contentsZreplyrrr
�_method_reply_error$s

rc@s�eZdZdZdd�Zedd��Zedd��Zedd	��Zd
d�Z	dd
�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�ZdS)�DBusExportera+
	Export method calls through DBus Interface.

	We take a method to be exported and create a simple wrapper function
	to call it. This is required as we need the original function to be
	bound to the original object instance. While the wrapper will be bound
	to an object we dynamically construct.
	cCs�tj�tjkrttj_tjjj	dd�d|_
d|_i|_t
�|_||_||_||_||_d|_d|_t�|_tjtj�}tj�|_tjtj|�dS)NT)Zset_as_default)�logZgetEffectiveLevel�logging�DEBUGr�dbus�serviceZmainloopZglibZ
DBusGMainLoop�_dbus_object_clsZ_dbus_object�
_dbus_methods�set�_signals�	_bus_name�_interface_name�_object_name�
_namespace�_thread�_bus_objectr�_polkit�signal�	getsignal�SIGINTrZMainLoop�
_main_loop)�self�bus_name�interface_name�object_name�	namespaceZsignal_handlerrrr
�__init__Bs"
zDBusExporter.__init__cCs|jS)N)r')r2rrr
r3`szDBusExporter.bus_namecCs|jS)N)r()r2rrr
r4dszDBusExporter.interface_namecCs|jS)N)r))r2rrr
r5hszDBusExporter.object_namecCs
|jdk	S)N)r+)r2rrr
�runninglszDBusExporter.runningcCsNdj|jdjt|j�j�d�}t|dt|j�d�}t	|j
dt�|j�}|S)Nz2def {name}({args}):
					return wrapper({args})
		z, )r�argsz<decorator-gen-%d>�execr)�formatrrr�__func__r9�compile�lenr$r�	co_consts�locals)r2�method�wrapper�source�coderrrr
�_prepare_for_dbusoszDBusExporter._prepare_for_dbuscsjt��std���j}|�jkr(td����fdd�}�j�|�}tjj�j||dd�|�}|�j|<dS)Nz#Only bound methods can be exported.z*Method with this name is already exported.cs
�jd�j}|d}tjd||f��jj||�}|}|dkrXtjd||f�n�|dkrttjd||f�n�|dkr�tjd||f�t|dd
��d	g}nZ|dkr�tjd
||f�t|dd��d	g}n(tj	d||f�t|dd��d	g}�||�S)N�.rz?checking authorization for action '%s' requested by caller '%s'zJaction '%s' requested by caller '%s' was successfully authorized by polkit�zepolkit error, but action '%s' requested by caller '%s' was successfully authorized by fallback methodrzLaction '%s' requested by caller '%s' wasn't authorized, ignoring the requestrzppolkit error and action '%s' requested by caller '%s' wasn't authorized by fallback method, ignoring the requestzvpolkit error and unable to use fallback method to authorize action '%s' requested by caller '%s', ignoring the request���rHrHrHrH)
r*rr�debugr-Zcheck_authorization�warn�info�list�error)�ownerr9�kwargsZ	action_id�caller�retZ	args_copy)rAr2rr
rB�s$z$DBusExporter.export.<locals>.wrapperrP)Zsender_keyword)	r�	Exceptionrr$rEr!r"rAr()r2rAZin_signature�
out_signature�method_namerBr)rAr2r
�export}s
zDBusExporter.exportcsnt��std���j}||jkr(td���fdd�}|j�|�}tjj|j|�|�}||j|<|j	j
|�dS)Nz#Only bound methods can be exported.z*Method with this name is already exported.cs
�||�S)Nr)rNr9rO)rArr
rB�sz$DBusExporter.signal.<locals>.wrapper)rrRrr$rEr!r"r.r(r&�add)r2rArSrTrBr)rAr
r.�s

zDBusExporter.signalcOsfd}||jks|jdkrd}yt|j|�}Wntk
rDd}YnX|rXtd|��n
|||�dS)NFTzSignal '%s' doesn't exist.)r&r,r�AttributeErrorrR)r2r.r9rO�errrArrr
�send_signal�s
zDBusExporter.send_signalcCs<|jdk	rtd��dt|�}t|tjjf|j�}||_dS)Nz%The exporter class was already build.zDBusExporter_%d)r#rR�id�typer!r"ZObjectr$)r2Zunique_name�clsrrr
�_construct_dbus_object_class�s

z)DBusExporter._construct_dbus_object_classcCsn|j�rdS|jdkr|j�|j�tj�}tjj|j|�}|j||j	|�|_
tj|j
d�|_|jj�dS)N)�target)r8r#r]�stopr!Z	SystemBusr"ZBusNamer'r)r,�	threadingZThread�_thread_coder+�start)r2Zbusr3rrr
rb�s
zDBusExporter.startcCs2|jdk	r.|jj�r.|jj�|jj�d|_dS)N)r+Zis_aliver1�quitr)r2rrr
r_�s

zDBusExporter.stopcCs|jj�|`d|_dS)N)r1Zrunr,)r2rrr
ra�s
zDBusExporter._thread_codeN)rr�__qualname__�__doc__r7�propertyr3r4r5r8rErUr.rYr]rbr_rarrrr
r8s"
	
r)"rrZdbus.servicer!Zdbus.mainloop.glibZdbus.exceptionsr`r.Z
tuned.logsZtunedZtuned.constsZconstsrr�inspectrZtuned.utils.polkitrZ
gi.repositoryr�typesrrZ
dbus.lowlevelr	r
r�ImportErrorZlogs�getrrZExporterInterfacerrrrr
�<module>s.

server.cpython-36.pyc000064400000077030151732672750010526 0ustar003

���i���@s�dZdZddddgZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddl
Z
ddlZddlZddlZddlZddlZddlZddlZddlmZd	Zd
ZGdd�dej�ZGdd�dej�ZGd
d�de�Zdd�Zdadd�Z dd�Z!Gdd�de�Z"eedddfdd�Z#e$dk�r�ej%�Z&e&j'dddd�e&j'dd dd!d"d#�e&j'd$d%de(d&d'd(�e&j)�Z*e*j+�r~e"Z,neZ,e#e,e*j-e*j.d)�dS)*a@HTTP server classes.

Note: BaseHTTPRequestHandler doesn't implement any HTTP request; see
SimpleHTTPRequestHandler for simple implementations of GET, HEAD and POST,
and CGIHTTPRequestHandler for CGI scripts.

It does, however, optionally implement HTTP/1.1 persistent connections,
as of version 0.3.

Notes on CGIHTTPRequestHandler
------------------------------

This class implements GET and POST requests to cgi-bin scripts.

If the os.fork() function is not present (e.g. on Windows),
subprocess.Popen() is used as a fallback, with slightly altered semantics.

In all cases, the implementation is intentionally naive -- all
requests are executed synchronously.

SECURITY WARNING: DON'T USE THIS CODE UNLESS YOU ARE INSIDE A FIREWALL
-- it may execute arbitrary Python code or external programs.

Note that status code 200 is sent prior to execution of a CGI script, so
scripts cannot send other status codes such as 302 (redirect).

XXX To do:

- log requests even later (to capture byte count)
- log user-agent header and other interesting goodies
- send error log to separate file
z0.6�
HTTPServer�BaseHTTPRequestHandler�SimpleHTTPRequestHandler�CGIHTTPRequestHandler�N)�
HTTPStatusa�<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
        "http://www.w3.org/TR/html4/strict.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
        <title>Error response</title>
    </head>
    <body>
        <h1>Error response</h1>
        <p>Error code: %(code)d</p>
        <p>Message: %(message)s.</p>
        <p>Error code explanation: %(code)s - %(explain)s.</p>
    </body>
</html>
ztext/html;charset=utf-8c@seZdZdZdd�ZdS)r�cCs4tjj|�|jdd�\}}tj|�|_||_dS)z.Override server_bind to store the server name.N�)�socketserver�	TCPServer�server_bind�server_address�socketZgetfqdn�server_name�server_port)�self�host�port�r�#/usr/lib64/python3.6/http/server.pyr�szHTTPServer.server_bindN)�__name__�
__module__�__qualname__Zallow_reuse_addressrrrrrr�sc
@seZdZdZdejj�dZdeZ	e
ZeZ
dZdd�Zdd	�Zd
d�Zdd
�Zd@dd�ZdAdd�ZdBdd�Zdd�Zdd�Zdd�ZdCdd�Zdd�Zd d!�Zd"d#�ZdDd$d%�Zd&d'�Zd(d)d*d+d,d-d.gZdd/d0d1d2d3d4d5d6d7d8d9d:g
Z d;d<�Z!d=Z"e#j$j%Z&d>d?�e'j(j)�D�Z*dS)Era�HTTP request handler base class.

    The following explanation of HTTP serves to guide you through the
    code as well as to expose any misunderstandings I may have about
    HTTP (so you don't need to read the code to figure out I'm wrong
    :-).

    HTTP (HyperText Transfer Protocol) is an extensible protocol on
    top of a reliable stream transport (e.g. TCP/IP).  The protocol
    recognizes three parts to a request:

    1. One line identifying the request type and path
    2. An optional set of RFC-822-style headers
    3. An optional data part

    The headers and data are separated by a blank line.

    The first line of the request has the form

    <command> <path> <version>

    where <command> is a (case-sensitive) keyword such as GET or POST,
    <path> is a string containing path information for the request,
    and <version> should be the string "HTTP/1.0" or "HTTP/1.1".
    <path> is encoded using the URL encoding scheme (using %xx to signify
    the ASCII character with hex code xx).

    The specification specifies that lines are separated by CRLF but
    for compatibility with the widest range of clients recommends
    servers also handle LF.  Similarly, whitespace in the request line
    is treated sensibly (allowing multiple spaces between components
    and allowing trailing whitespace).

    Similarly, for output, lines ought to be separated by CRLF pairs
    but most clients grok LF characters just fine.

    If the first line of the request has the form

    <command> <path>

    (i.e. <version> is left out) then this is assumed to be an HTTP
    0.9 request; this form has no optional headers and data part and
    the reply consists of just the data.

    The reply form of the HTTP 1.x protocol again has three parts:

    1. One line giving the response code
    2. An optional set of RFC-822-style headers
    3. The data

    Again, the headers and data are separated by a blank line.

    The response code line has the form

    <version> <responsecode> <responsestring>

    where <version> is the protocol version ("HTTP/1.0" or "HTTP/1.1"),
    <responsecode> is a 3-digit response code indicating success or
    failure of the request, and <responsestring> is an optional
    human-readable string explaining what the response code means.

    This server parses the request and the headers, and then calls a
    function specific to the request type (<command>).  Specifically,
    a request SPAM will be handled by a method do_SPAM().  If no
    such method exists the server sends an error response to the
    client.  If it exists, it is called with no arguments:

    do_SPAM()

    Note that the request name is case sensitive (i.e. SPAM and spam
    are different requests).

    The various request details are stored in instance variables:

    - client_address is the client IP address in the form (host,
    port);

    - command, path and version are the broken-down request line;

    - headers is an instance of email.message.Message (or a derived
    class) containing the header information;

    - rfile is a file object open for reading positioned at the
    start of the optional input data part;

    - wfile is a file object open for writing.

    IT IS IMPORTANT TO ADHERE TO THE PROTOCOL FOR WRITING!

    The first thing to be written must be the response line.  Then
    follow 0 or more header lines, then a blank line, and then the
    actual data (if any).  The meaning of the header lines depends on
    the command executed by the server; in most cases, when data is
    returned, there should be at least one header line of the form

    Content-type: <type>/<subtype>

    where <type> and <subtype> should be registered MIME types,
    e.g. "text/html" or "text/plain".

    zPython/rz	BaseHTTP/zHTTP/0.9cCs�d|_|j|_}d|_t|jd�}|jd�}||_|j�}t	|�dk�r|\}}}yZ|dd�dkrjt
�|jdd	�d	}|jd
�}t	|�dkr�t
�t|d�t|d	�f}Wn*t
tfk
r�|j
tjd
|�dSX|dkr�|jdkr�d|_|dk�rr|j
tjd|�dSn^t	|�dk�rR|\}}d|_|dk�rr|j
tjd|�dSn |�s\dS|j
tjd|�dS||||_|_|_|jjd��r�d|jjd�|_ytjj|j|jd�|_Wnrtjjk
�r�}z|j
tjdt|��dSd}~Xn:tjjk
�r4}z|j
tjdt|��dSd}~XnX|jjdd�}	|	j�dk�rZd|_n |	j�dk�rz|jdk�rzd|_|jjdd�}
|
j�dk�r�|jdk�r�|jdk�r�|j ��s�dSdS) a'Parse a request (internal).

        The request should be stored in self.raw_requestline; the results
        are in self.command, self.path, self.request_version and
        self.headers.

        Return True for success, False for failure; on failure, an
        error is sent back.

        NTz
iso-8859-1z
��zHTTP/�/r�.rrzBad request version (%r)FzHTTP/1.1zInvalid HTTP version (%s)ZGETzBad HTTP/0.9 request type (%r)zBad request syntax (%r)z//)Z_classz
Line too longzToo many headers�
Connection��closez
keep-aliveZExpectz100-continue)rr)rr)!�command�default_request_version�request_version�close_connection�str�raw_requestline�rstrip�requestline�split�len�
ValueError�int�
IndexError�
send_errorrZBAD_REQUEST�protocol_versionZHTTP_VERSION_NOT_SUPPORTED�path�
startswith�lstrip�http�clientZ
parse_headers�rfile�MessageClass�headersZLineTooLongZREQUEST_HEADER_FIELDS_TOO_LARGEZ
HTTPException�get�lower�handle_expect_100)r�versionr&�wordsrr.Zbase_version_numberZversion_number�errZconntypeZexpectrrr�
parse_requests�












z$BaseHTTPRequestHandler.parse_requestcCs|jtj�|j�dS)a7Decide what to do with an "Expect: 100-continue" header.

        If the client is expecting a 100 Continue response, we must
        respond with either a 100 Continue or a final response before
        waiting for the request body. The default is to always respond
        with a 100 Continue. You can behave differently (for example,
        reject unauthorized requests) by overriding this method.

        This method should either return True (possibly after sending
        a 100 Continue response) or send an error response and return
        False.

        T)�send_response_onlyrZCONTINUE�end_headers)rrrrr8nsz(BaseHTTPRequestHandler.handle_expect_100cCs�y�|jjd�|_t|j�dkr@d|_d|_d|_|jtj	�dS|jsPd|_
dS|j�s\dSd|j}t||�s�|jtj
d|j�dSt||�}|�|jj�Wn4tjk
r�}z|jd|�d|_
dSd}~XnXdS)	z�Handle a single HTTP request.

        You normally don't need to override this method; see the class
        __doc__ string for information on how to handle specific HTTP
        commands such as GET and POST.

        iirNTZdo_zUnsupported method (%r)zRequest timed out: %r)r3�readliner$r(r&r!rr,rZREQUEST_URI_TOO_LONGr"r<�hasattr�NOT_IMPLEMENTED�getattr�wfile�flushr
Ztimeout�	log_error)rZmname�method�errr�handle_one_request�s4


z)BaseHTTPRequestHandler.handle_one_requestcCs&d|_|j�x|js |j�qWdS)z&Handle multiple requests if necessary.TN)r"rH)rrrr�handle�szBaseHTTPRequestHandler.handleNcCs
y|j|\}}Wntk
r.d\}}YnX|dkr<|}|dkrH|}|jd||�|j||�|jdd�d}|dkr�|tjtjtjfkr�|j	|t
j|dd�t
j|dd�d	�}|jd
d�}|jd|j
�|jd
tt|���|j�|jdko�|�r|jj|�dS)akSend and log an error reply.

        Arguments are
        * code:    an HTTP error code
                   3 digits
        * message: a simple optional 1 line reason phrase.
                   *( HTAB / SP / VCHAR / %x80-FF )
                   defaults to short entry matching the response code
        * explain: a detailed message defaults to the long entry
                   matching the response code.

        This sends an error response (so it must be called before any
        output has been generated), logs the error, and finally sends
        a piece of HTML explaining the error to the user.

        �???Nzcode %d, message %srr��F)�quote)�code�message�explainzUTF-8�replacezContent-TypezContent-LengthZHEAD)rJrJ)�	responses�KeyErrorrE�
send_response�send_headerrZ
NO_CONTENTZ
RESET_CONTENTZNOT_MODIFIED�error_message_format�html�escape�encode�error_content_typer#r(r>rrC�write)rrMrNrOZshortmsgZlongmsgZbodyZcontentrrrr,�s4
z!BaseHTTPRequestHandler.send_errorcCs:|j|�|j||�|jd|j��|jd|j��dS)z�Add the response header to the headers buffer and log the
        response code.

        Also send two standard headers with the server software
        version and the current date.

        ZServerZDateN)�log_requestr=rT�version_string�date_time_string)rrMrNrrrrS�s
z$BaseHTTPRequestHandler.send_responsecCsd|jdkr`|dkr0||jkr,|j|d}nd}t|d�s@g|_|jjd|j||fjdd��dS)	zSend the response header only.zHTTP/0.9Nrr�_headers_bufferz
%s %d %s
zlatin-1�strict)r!rQr@r^�appendr-rX)rrMrNrrrr=�s


z)BaseHTTPRequestHandler.send_response_onlycCsl|jdkr6t|d�sg|_|jjd||fjdd��|j�dkrh|j�dkrVd|_n|j�d	krhd
|_dS)z)Send a MIME header to the headers buffer.zHTTP/0.9r^z%s: %s
zlatin-1r_Z
connectionrTz
keep-aliveFN)r!r@r^r`rXr7r")r�keyword�valuerrrrT�s

z"BaseHTTPRequestHandler.send_headercCs"|jdkr|jjd�|j�dS)z,Send the blank line ending the MIME headers.zHTTP/0.9s
N)r!r^r`�
flush_headers)rrrrr>s
z"BaseHTTPRequestHandler.end_headerscCs(t|d�r$|jjdj|j��g|_dS)Nr^�)r@rCrZ�joinr^)rrrrrcs
z$BaseHTTPRequestHandler.flush_headers�-cCs.t|t�r|j}|jd|jt|�t|��dS)zNLog an accepted request.

        This is called by send_response().

        z
"%s" %s %sN)�
isinstancerrb�log_messager&r#)rrM�sizerrrr[s
z"BaseHTTPRequestHandler.log_requestcGs|j|f|��dS)z�Log an error.

        This is called when a request cannot be fulfilled.  By
        default it passes the message on to log_message().

        Arguments are the same as for log_message().

        XXX This should go to the separate error log.

        N)rh)r�format�argsrrrrE!sz BaseHTTPRequestHandler.log_errorcGs&tjjd|j�|j�||f�dS)a�Log an arbitrary message.

        This is used by all other logging functions.  Override
        it if you have specific logging wishes.

        The first argument, FORMAT, is a format string for the
        message to be logged.  If the format string contains
        any % escapes requiring parameters, they should be
        specified as subsequent arguments (it's just like
        printf!).

        The client ip and current date/time are prefixed to
        every message.

        z%s - - [%s] %s
N)�sys�stderrrZ�address_string�log_date_time_string)rrjrkrrrrh/sz"BaseHTTPRequestHandler.log_messagecCs|jd|jS)z*Return the server software version string.� )�server_version�sys_version)rrrrr\Esz%BaseHTTPRequestHandler.version_stringcCs |dkrtj�}tjj|dd�S)z@Return the current date and time formatted for a message header.NT)Zusegmt)�time�emailZutilsZ
formatdate)rZ	timestamprrrr]Isz'BaseHTTPRequestHandler.date_time_stringc	CsBtj�}tj|�\	}}}}}}}}	}
d||j|||||f}|S)z.Return the current time formatted for logging.z%02d/%3s/%04d %02d:%02d:%02d)rsZ	localtime�	monthname)rZnowZyearZmonthZdayZhhZmmZss�x�y�z�srrrroOs
z+BaseHTTPRequestHandler.log_date_time_stringZMonZTueZWedZThuZFriZSatZSunZJanZFebZMarZAprZMayZJunZJulZAugZSepZOctZNovZDeccCs
|jdS)zReturn the client address.r)�client_address)rrrrrn]sz%BaseHTTPRequestHandler.address_stringzHTTP/1.0cCsi|]}|j|jf|�qSr)�phraseZdescription)�.0�vrrr�
<dictcomp>lsz!BaseHTTPRequestHandler.<dictcomp>)NN)N)N)rfrf)N)+rrr�__doc__rlr9r'rr�__version__rq�DEFAULT_ERROR_MESSAGErU�DEFAULT_ERROR_CONTENT_TYPErYr r<r8rHrIr,rSr=rTr>rcr[rErhr\r]roZweekdaynamerurnr-r1r2ZHTTPMessager4r�__members__�valuesrQrrrrr�s>fg%
5



	c@s|eZdZdZdeZdd�Zdd�Zdd�Zd	d
�Z	dd�Z
d
d�Zdd�Ze
jsZe
j�e
jj�Zejddddd��dS)raWSimple HTTP request handler with GET and HEAD commands.

    This serves files from the current directory and any of its
    subdirectories.  The MIME type for files is determined by
    calling the .guess_type() method.

    The GET and HEAD requests are identical except that the HEAD
    request omits the actual contents of the file.

    zSimpleHTTP/c
Cs.|j�}|r*z|j||j�Wd|j�XdS)zServe a GET request.N)�	send_head�copyfilerCr)r�frrr�do_GET�s
zSimpleHTTPRequestHandler.do_GETcCs|j�}|r|j�dS)zServe a HEAD request.N)r�r)rr�rrr�do_HEAD�sz SimpleHTTPRequestHandler.do_HEADc	Csx|j|j�}d}tjj|�r�tjj|j�}|jjd�s�|jt	j
�|d|d|dd|d|df}tjj|�}|jd|�|j
�dSx6dD]$}tjj||�}tjj|�r�|}Pq�W|j|�S|j|�}yt|d�}Wn$tk
�r|jt	jd�dSXyZ|jt	j�|jd
|�tj|j��}|jdt|d��|jd|j|j��|j
�|S|j��YnXdS)a{Common code for GET and HEAD commands.

        This sends the response code and MIME headers.

        Return value is either a file object (which has to be copied
        to the outputfile by the caller unless the command was HEAD,
        and must be closed by the caller under all circumstances), or
        None, in which case the caller has nothing further to do.

        Nrrrrr�ZLocation�
index.html�	index.htm�rbzFile not foundzContent-typezContent-Length�z
Last-Modified)r�r�)�translate_pathr.�os�isdir�urllib�parseZurlsplit�endswithrSrZMOVED_PERMANENTLYZ
urlunsplitrTr>re�exists�list_directory�
guess_type�open�OSErrorr,�	NOT_FOUND�OK�fstat�filenor#r]�st_mtimer)	rr.r��partsZ	new_partsZnew_url�indexZctypeZfsrrrr��sF


z"SimpleHTTPRequestHandler.send_headc
Cs�ytj|�}Wn"tk
r0|jtjd�dSX|jdd�d�g}ytjj	|j
dd�}Wn tk
r|tjj	|�}YnXtj
|dd	�}tj�}d
|}|jd�|jd�|jd
|�|jd|�|jd|�|jd�x~|D]v}tj
j||�}|}	}
tj
j|��r"|d}	|d}
tj
j|��r8|d}	|jdtjj|
dd�tj
|	dd	�f�q�W|jd�dj|�j|d�}tj�}|j|�|jd�|jtj�|jdd|�|jdtt|���|j�|S)z�Helper to produce a directory listing (absent index.html).

        Return value is either a file object, or None (indicating an
        error).  In either case, the headers are sent, making the
        interface the same as for send_head().

        zNo permission to list directoryNcSs|j�S)N)r7)�arrr�<lambda>�sz9SimpleHTTPRequestHandler.list_directory.<locals>.<lambda>)�key�
surrogatepass)�errorsF)rLzDirectory listing for %szZ<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">z
<html>
<head>z@<meta http-equiv="Content-Type" content="text/html; charset=%s">z<title>%s</title>
</head>z<body>
<h1>%s</h1>z	<hr>
<ul>r�@z<li><a href="%s">%s</a></li>z</ul>
<hr>
</body>
</html>
�
�surrogateescaperzContent-typeztext/html; charset=%szContent-Length) r��listdirr�r,rr��sortr�r��unquoter.�UnicodeDecodeErrorrVrWrl�getfilesystemencodingr`rer��islinkrLrX�io�BytesIOrZ�seekrSr�rTr#r(r>)
rr.�list�rZdisplaypath�enc�title�name�fullnameZdisplaynameZlinknameZencodedr�rrrr��s\







z'SimpleHTTPRequestHandler.list_directorycCs�|jdd�d}|jdd�d}|j�jd�}ytjj|dd�}Wn tk
rbtjj|�}YnXtj|�}|jd�}t	d|�}t
j�}x8|D]0}t
jj
|�s�|t
jt
jfkr�q�t
jj||�}q�W|r�|d7}|S)	z�Translate a /-separated PATH to the local filename syntax.

        Components that mean special things to the local file system
        (e.g. drive or directory names) are ignored.  (XXX They should
        probably be diagnosed.)

        �?rr�#rr�)r�N)r'r%r�r�r�r�r��	posixpath�normpath�filterr��getcwdr.�dirname�curdir�pardirre)rr.Ztrailing_slashr:Zwordrrrr��s$	



z'SimpleHTTPRequestHandler.translate_pathcCstj||�dS)a�Copy all data between two file objects.

        The SOURCE argument is a file object open for reading
        (or anything with a read() method) and the DESTINATION
        argument is a file object open for writing (or
        anything with a write() method).

        The only reason for overriding this would be to change
        the block size or perhaps to replace newlines by CRLF
        -- note however that this the default server uses this
        to copy binary data as well.

        N)�shutilZcopyfileobj)r�sourceZ
outputfilerrrr�sz!SimpleHTTPRequestHandler.copyfilecCsLtj|�\}}||jkr"|j|S|j�}||jkr>|j|S|jdSdS)a�Guess the type of a file.

        Argument is a PATH (a filename).

        Return value is a string of the form type/subtype,
        usable for a MIME Content-type header.

        The default implementation looks the file's extension
        up in the table self.extensions_map, using application/octet-stream
        as a default; however it would be permissible (if
        slow) to look inside the data to make a better guess.

        rN)r��splitext�extensions_mapr7)rr.�baseZextrrrr�)s



z#SimpleHTTPRequestHandler.guess_typezapplication/octet-streamz
text/plain)rz.pyz.cz.hN)rrrrr�rqr�r�r�r�r�r�r��	mimetypesZinitedZinitZ	types_map�copyr��updaterrrrrrs"	1:
c	Cs�|jd�\}}}tjj|�}|jd�}g}x<|dd�D],}|dkrN|j�q8|r8|dkr8|j|�q8W|r�|j�}|r�|dkr�|j�d}q�|dkr�d}nd}|r�dj||f�}ddj|�|f}dj|�}|S)	a�
    Given a URL path, remove extra '/'s and '.' path elements and collapse
    any '..' references and returns a collapsed path.

    Implements something akin to RFC-2396 5.2 step 6 to parse relative paths.
    The utility of this function is limited to is_cgi method and helps
    preventing some security attacks.

    Returns: The reconstituted URL, which will always start with a '/'.

    Raises: IndexError if too many '..' occur within the path.

    r�rNrz..rr���)�	partitionr�r�r�r'�popr`re)	r.�_�query�
path_partsZ
head_parts�partZ	tail_partZ	splitpath�collapsed_pathrrr�_url_collapse_pathNs.


r�cCsptrtSyddl}Wntk
r(dSXy|jd�daWn.tk
rjdtdd�|j�D��aYnXtS)	z$Internal routine to get nobody's uidrNr�nobodyrcss|]}|dVqdS)rNr)r|rvrrr�	<genexpr>�sznobody_uid.<locals>.<genexpr>r�)r��pwd�ImportError�getpwnamrR�maxZgetpwall)r�rrr�
nobody_uid�s r�cCstj|tj�S)zTest for executable file.)r��access�X_OK)r.rrr�
executable�sr�c@sVeZdZdZeed�ZdZdd�Zdd�Z	dd	�Z
d
dgZdd
�Zdd�Z
dd�ZdS)rz�Complete HTTP server with GET, HEAD and POST commands.

    GET and HEAD also support running CGI scripts.

    The POST command is *only* implemented for CGI scripts.

    �forkrcCs$|j�r|j�n|jtjd�dS)zRServe a POST request.

        This is only implemented for CGI scripts.

        zCan only POST to CGI scriptsN)�is_cgi�run_cgir,rrA)rrrr�do_POST�s

zCGIHTTPRequestHandler.do_POSTcCs|j�r|j�Stj|�SdS)z-Version of send_head that support CGI scriptsN)r�r�rr�)rrrrr��szCGIHTTPRequestHandler.send_headcCsPt|j�}|jdd�}|d|�||dd�}}||jkrL||f|_dSdS)a3Test whether self.path corresponds to a CGI script.

        Returns True and updates the cgi_info attribute to the tuple
        (dir, rest) if self.path requires running a CGI script.
        Returns False otherwise.

        If any exception is raised, the caller should assume that
        self.path was rejected as invalid and act accordingly.

        The default implementation tests whether the normalized url
        path begins with one of the strings in self.cgi_directories
        (and the next character is a '/' or the end of the string).

        rrNTF)r�r.�find�cgi_directories�cgi_info)rr�Zdir_sep�head�tailrrrr��s


zCGIHTTPRequestHandler.is_cgiz/cgi-binz/htbincCst|�S)z1Test whether argument path is an executable file.)r�)rr.rrr�
is_executable�sz#CGIHTTPRequestHandler.is_executablecCstjj|�\}}|j�dkS)z.Test whether argument path is a Python script.�.py�.pyw)r�r�)r�r.r�r7)rr.r�r�rrr�	is_python�szCGIHTTPRequestHandler.is_pythonc)Cs�|j\}}|d|}|jdt|�d�}x`|dkr�|d|�}||dd�}|j|�}tjj|�r�||}}|jdt|�d�}q,Pq,W|jd�\}}}	|jd�}|dkr�|d|�||d�}
}n
|d}
}|d|
}|j|�}tjj|��s|j	t
jd|�dStjj|��s2|j	t
j
d|�dS|j|�}
|j�sL|
�rn|j|��sn|j	t
j
d	|�dStjtj�}|j�|d
<|jj|d<d|d
<|j|d<t|jj�|d<|j|d<tjj|�}||d<|j|�|d<||d<|	�r�|	|d<|jd|d<|jj d�}|�r�|j!�}t|�dk�r�ddl"}ddl#}|d|d<|dj$�dk�r�y"|dj%d�}|j&|�j'd�}Wn|j(t)fk
�r�Yn&X|j!d�}t|�dk�r�|d|d<|jj d�dk�r�|jj*�|d<n|jd|d<|jj d�}|�r||d <|jj d!�}|�r"||d"<g}xN|jj+d#�D]>}|dd�d$k�rZ|j,|j-��n||d%d�j!d&�}�q4Wd&j.|�|d'<|jj d(�}|�r�||d)<t/d|jj0d*g��}d+j.|�}|�r�||d,<xd=D]}|j1|d��q�W|j2t
j3d.�|j4�|	j5d/d0�}|j�r.|
g}d1|k�r*|j,|�t6�}|j7j8�tj9�}|dk�r�tj:|d�\}}x0t;j;|j<gggd�d�r�|j<j=d��s^P�q^W|�r�|j>d2|�dSy\ytj?|�Wnt@k
�r�YnXtjA|j<jB�d�tjA|j7jB�d�tjC|||�Wn(|jjD|jE|j�tjFd3�YnX�n�ddlG} |g}!|j|��r�tHjI}"|"j$�jJd4��rv|"dd>�|"d?d�}"|"d7g|!}!d1|	k�r�|!j,|	�|jKd8| jL|!��ytM|�}#WntNtOfk
�r�d}#YnX| jP|!| jQ| jQ| jQ|d9�}$|jj$�d:k�r|#dk�r|j<j=|#�}%nd}%x4t;j;|j<jRgggd�d�rN|j<jRjSd��sP�qW|$jT|%�\}&}'|j7jU|&�|'�r||j>d;|'�|$jVjW�|$jXjW�|$jY}(|(�r�|j>d2|(�n
|jKd<�dS)@zExecute a CGI script.rrrNr�rzNo such CGI script (%r)z#CGI script is not a plain file (%r)z!CGI script is not executable (%r)ZSERVER_SOFTWAREZSERVER_NAMEzCGI/1.1ZGATEWAY_INTERFACEZSERVER_PROTOCOLZSERVER_PORTZREQUEST_METHODZ	PATH_INFOZPATH_TRANSLATEDZSCRIPT_NAME�QUERY_STRINGZREMOTE_ADDR�
authorizationrZ	AUTH_TYPEZbasic�ascii�:ZREMOTE_USERzcontent-typeZCONTENT_TYPEzcontent-length�CONTENT_LENGTH�referer�HTTP_REFERER�acceptz	

 ��,ZHTTP_ACCEPTz
user-agent�HTTP_USER_AGENTZcookiez, �HTTP_COOKIE�REMOTE_HOSTzScript output follows�+rp�=zCGI script exit status %#x�zw.exerr�z-uzcommand: %s)�stdin�stdoutrm�envZpostz%szCGI script exited OK)r�r�r�r�r�r�������)Zr�r�r(r�r�r.r�r�r�r,rr��isfileZ	FORBIDDENr��	have_forkr�r��deepcopy�environr\Zserverrr-r#rrr�r�r�rzr5r6r'�base64�binasciir7rXZdecodebytes�decode�Error�UnicodeErrorZget_content_typeZgetallmatchingheadersr`�striprer�Zget_all�
setdefaultrSr�rcrPr�rCrDr��waitpid�selectr3�readrE�setuidr��dup2r��execveZhandle_errorZrequest�_exit�
subprocessrlr�r�rhZlist2cmdliner*�	TypeErrorr)�Popen�PIPEZ_sockZrecvZcommunicaterZrmrr��
returncode))r�dir�restr.�iZnextdirZnextrestZ	scriptdirr�r�ZscriptZ
scriptnameZ
scriptfileZispyr�Zuqrestr�rrZlengthr�r��lineZua�coZ
cookie_str�kZ
decoded_queryrkr��pid�stsrZcmdlineZinterp�nbytes�p�datar�rmZstatusrrrr��s4

























zCGIHTTPRequestHandler.run_cgiN)rrrrr@r�r�Zrbufsizer�r�r�r�r�r�r�rrrrr�s
zHTTP/1.0i@rc	Cs�||f}||_|||��b}|jj�}d}t|j|d|dd��y|j�Wn&tk
rttd�tjd�YnXWdQRXdS)zmTest the HTTP request handler class.

    This runs an HTTP server on port 8000 (or the port argument).

    z>Serving HTTP on {host} port {port} (http://{host}:{port}/) ...rr)rrz&
Keyboard interrupt received, exiting.N)	r-r
Zgetsockname�printrjZ
serve_forever�KeyboardInterruptrl�exit)	�HandlerClassZServerClassZprotocolr�bindrZhttpdZsaZ
serve_messagerrr�test�s
r%�__main__z--cgi�
store_truezRun as CGI Server)�action�helpz--bindz-bZADDRESSz8Specify alternate bind address [default: all interfaces])�default�metavarr)rZstorer�z&Specify alternate port [default: 8000])r(r*�type�nargsr))r#rr$)/rr��__all__Zemail.utilsrtrVZhttp.clientr1r�r�r�r�r
r�r
r	rlrsZurllib.parser�r��argparserr�r�r
rZStreamRequestHandlerrrr�r�r�r�rr%r�ArgumentParser�parser�add_argumentr*�
parse_argsrkZcgiZ
handler_classrr$rrrr�<module> sj3g]0
cookies.cpython-36.opt-1.pyc000064400000037352151732672750011616 0ustar003


 \�S�
@s|dZddlZddlZdddgZdjZdjZdjZd	d
�ZGdd�de	�Z
ejejdZ
e
d
Zdd�eed��eeee��D�Zejed�ded�di�ejdeje
��jZdd�Zejd�Zejd�Zdd�Zddddd d!d"gZdd#d$d%d&d'd(d)d*d+d,d-d.g
Zdeefd/d0�ZGd1d2�d2e �Z!d3Z"e"d4Z#ejd5e"d6e#d7ej$ej%B�Z&Gd8d�de �Z'Gd9d�de'�Z(dS):a.

Here's a sample session to show how to use this module.
At the moment, this is the only documentation.

The Basics
----------

Importing is easy...

   >>> from http import cookies

Most of the time you start by creating a cookie.

   >>> C = cookies.SimpleCookie()

Once you've created your Cookie, you can add values just as if it were
a dictionary.

   >>> C = cookies.SimpleCookie()
   >>> C["fig"] = "newton"
   >>> C["sugar"] = "wafer"
   >>> C.output()
   'Set-Cookie: fig=newton\r\nSet-Cookie: sugar=wafer'

Notice that the printable representation of a Cookie is the
appropriate format for a Set-Cookie: header.  This is the
default behavior.  You can change the header and printed
attributes by using the .output() function

   >>> C = cookies.SimpleCookie()
   >>> C["rocky"] = "road"
   >>> C["rocky"]["path"] = "/cookie"
   >>> print(C.output(header="Cookie:"))
   Cookie: rocky=road; Path=/cookie
   >>> print(C.output(attrs=[], header="Cookie:"))
   Cookie: rocky=road

The load() method of a Cookie extracts cookies from a string.  In a
CGI script, you would use this method to extract the cookies from the
HTTP_COOKIE environment variable.

   >>> C = cookies.SimpleCookie()
   >>> C.load("chips=ahoy; vienna=finger")
   >>> C.output()
   'Set-Cookie: chips=ahoy\r\nSet-Cookie: vienna=finger'

The load() method is darn-tootin smart about identifying cookies
within a string.  Escaped quotation marks, nested semicolons, and other
such trickeries do not confuse it.

   >>> C = cookies.SimpleCookie()
   >>> C.load('keebler="E=everybody; L=\\"Loves\\"; fudge=\\012;";')
   >>> print(C)
   Set-Cookie: keebler="E=everybody; L=\"Loves\"; fudge=\012;"

Each element of the Cookie also supports all of the RFC 2109
Cookie attributes.  Here's an example which sets the Path
attribute.

   >>> C = cookies.SimpleCookie()
   >>> C["oreo"] = "doublestuff"
   >>> C["oreo"]["path"] = "/"
   >>> print(C)
   Set-Cookie: oreo=doublestuff; Path=/

Each dictionary element has a 'value' attribute, which gives you
back the value associated with the key.

   >>> C = cookies.SimpleCookie()
   >>> C["twix"] = "none for you"
   >>> C["twix"].value
   'none for you'

The SimpleCookie expects that all values should be standard strings.
Just to be sure, SimpleCookie invokes the str() builtin to convert
the value to a string, when the values are set dictionary-style.

   >>> C = cookies.SimpleCookie()
   >>> C["number"] = 7
   >>> C["string"] = "seven"
   >>> C["number"].value
   '7'
   >>> C["string"].value
   'seven'
   >>> C.output()
   'Set-Cookie: number=7\r\nSet-Cookie: string=seven'

Finis.
�N�CookieError�
BaseCookie�SimpleCookie�z; � cCs$ddl}d|}|j|tdd�dS)NrzvThe .%s setter is deprecated. The attribute will be read-only in future releases. Please use the set() method instead.�)�
stacklevel)�warnings�warn�DeprecationWarning)�setterr	�msg�r�$/usr/lib64/python3.6/http/cookies.py�_warn_deprecated_setter�src@seZdZdS)rN)�__name__�
__module__�__qualname__rrrrr�sz!#$%&'*+-.^_`|~:z
 ()/<=>?@[]{}cCsi|]}d||�qS)z\%03or)�.0�nrrr�
<dictcomp>�sr��"z\"�\z\\z[%s]+cCs*|dkst|�r|Sd|jt�dSdS)z�Quote a string for use in a cookie header.

    If the string does not need to be double-quoted, then just return the
    string.  Otherwise, surround the string in doublequotes and quote
    (with a \) special characters.
    Nr)�
_is_legal_key�	translate�_Translator)�strrrr�_quote�srz\\[0-3][0-7][0-7]z[\\].cCsT|dkst|�dkr|S|ddks0|ddkr4|S|dd�}d}t|�}g}x�d|kod|kn�rJtj||�}tj||�}|r�|r�|j||d��Pd	}}|r�|jd�}|r�|jd�}|o�|s�||k�r
|j|||��|j||d�|d}qR|j|||��|jtt||d|d�d���|d}qRWt|�S)
N�rr������r#r#)	�len�
_OctalPatt�search�
_QuotePatt�append�start�chr�int�	_nulljoin)r�ir�resZo_matchZq_match�j�krrr�_unquote�s6


$r1ZMonZTueZWedZThuZFriZSatZSunZJanZFebZMarZAprZMayZJunZJulZAugZSepZOctZNovZDecc	CsRddlm}m}|�}|||�\	}}}}	}
}}}
}d|||||||	|
|fS)Nr)�gmtime�timez#%s, %02d %3s %4d %02d:%02d:%02d GMT)r3r2)ZfutureZweekdaynameZ	monthnamer2r3ZnowZyearZmonthZdayZhhZmmZssZwd�y�zrrr�_getdate�s
r6c	@seZdZdZdddddddd	d
�ZddhZd
d�Zedd��Zej	dd��Zedd��Z
e
j	dd��Z
edd��Zej	dd��Zdd�Zd4dd�Z
dd�ZejZdd �Zd!d"�Zd#d$�Zefd%d&�Zd'd(�Zd)d*�Zd5d,d-�ZeZd.d/�Zd6d0d1�Zd7d2d3�ZdS)8�Morsela�A class to hold ONE (key, value) pair.

    In a cookie, each such pair may have several attributes, so this class is
    used to keep the attributes associated with the appropriate key,value pair.
    This class also includes a coded_value attribute, which is used to hold
    the network representation of the value.  This is most useful when Python
    objects are pickled for network transit.
    �expiresZPath�CommentZDomainzMax-AgeZSecureZHttpOnlyZVersion)r8�path�commentZdomainzmax-age�secure�httponly�versionr<r=cCs4d|_|_|_x|jD]}tj||d�qWdS)Nr)�_key�_value�_coded_value�	_reserved�dict�__setitem__)�self�keyrrr�__init__&szMorsel.__init__cCs|jS)N)r?)rErrrrF.sz
Morsel.keycCstd�||_dS)NrF)rr?)rErFrrrrF2scCs|jS)N)r@)rErrr�value7szMorsel.valuecCstd�||_dS)NrH)rr@)rErHrrrrH;scCs|jS)N)rA)rErrr�coded_value@szMorsel.coded_valuecCstd�||_dS)NrI)rrA)rErIrrrrIDscCs2|j�}||jkr td|f��tj|||�dS)NzInvalid attribute %r)�lowerrBrrCrD)rE�K�VrrrrDIs
zMorsel.__setitem__NcCs.|j�}||jkr td|f��tj|||�S)NzInvalid attribute %r)rJrBrrC�
setdefault)rErF�valrrrrMOs
zMorsel.setdefaultcCs>t|t�stStj||�o<|j|jko<|j|jko<|j|jkS)N)�
isinstancer7�NotImplementedrC�__eq__r@r?rA)rE�morselrrrrQUs
z
Morsel.__eq__cCs$t�}tj||�|jj|j�|S)N)r7rC�update�__dict__)rErRrrr�copy_szMorsel.copycCsVi}x@t|�j�D]0\}}|j�}||jkr:td|f��|||<qWtj||�dS)NzInvalid attribute %r)rC�itemsrJrBrrS)rE�values�datarFrNrrrrSes
z
Morsel.updatecCs|j�|jkS)N)rJrB)rErKrrr�
isReservedKeynszMorsel.isReservedKeycCsh|tkr ddl}|jdtdd�|j�|jkr<td|f��t|�sRtd|f��||_||_	||_
dS)NrzSLegalChars parameter is deprecated, ignored and will be removed in future versions.r)rz Attempt to set a reserved key %rzIllegal key %r)�_LegalCharsr	r
rrJrBrrr?r@rA)rErFrNZ	coded_valZ
LegalCharsr	rrr�setqsz
Morsel.setcCs|j|j|jd�S)N)rFrHrI)r?r@rA)rErrr�__getstate__�szMorsel.__getstate__cCs"|d|_|d|_|d|_dS)NrFrHrI)r?r@rA)rE�staterrr�__setstate__�s

zMorsel.__setstate__�Set-Cookie:cCsd||j|�fS)Nz%s %s)�OutputString)rE�attrs�headerrrr�output�sz
Morsel.outputcCsd|jj|j�fS)Nz<%s: %s>)�	__class__rr`)rErrr�__repr__�szMorsel.__repr__cCsd|j|�jdd�S)Nz�
        <script type="text/javascript">
        <!-- begin hiding
        document.cookie = "%s";
        // end hiding -->
        </script>
        rz\")r`�replace)rErarrr�	js_output�szMorsel.js_outputcCs(g}|j}|d|j|jf�|dkr,|j}t|j��}x�|D]�\}}|dkrPq>||krZq>|dkr�t|t�r�|d|j|t|�f�q>|dkr�t|t�r�|d|j||f�q>|dkr�t|t	�r�|d|j|t
|�f�q>||jk�r|�r|t	|j|��q>|d|j||f�q>Wt|�S)Nz%s=%srr8zmax-agez%s=%dr;)
r(rFrIrB�sortedrVrOr+r6rr�_flags�_semispacejoin)rEra�resultr(rVrFrHrrrr`�s,zMorsel.OutputString)N)Nr_)N)N)rrr�__doc__rBrirG�propertyrFrrHrIrDrMrQ�object�__ne__rUrSrYrZr[r\r^rc�__str__rergr`rrrrr7s@
	


r7z,\w\d!#%&'~_`><@,:/\$\*\+\-\.\^\|\)\(\?\}\{\=z\[\]z�
    \s*                            # Optional whitespace at start of cookie
    (?P<key>                       # Start of group 'key'
    [a	]+?   # Any word of at least one letter
    )                              # End of group 'key'
    (                              # Optional group: there may not be a value.
    \s*=\s*                          # Equal Sign
    (?P<val>                         # Start of group 'val'
    "(?:[^\\"]|\\.)*"                  # Any doublequoted string
    |                                  # or
    \w{3},\s[\w\d\s-]{9,11}\s[\d:]{8}\sGMT  # Special case for "expires" attr
    |                                  # or
    [a-]*      # Any word or empty string
    )                                # End of group 'val'
    )?                             # End of optional value group
    \s*                            # Any number of spaces.
    (\s+|;|$)                      # Ending either at space, semicolon, or EOS.
    c@sneZdZdZdd�Zdd�Zddd�Zd	d
�Zdd�Zddd�Z	e	Z
dd�Zddd�Zdd�Z
efdd�ZdS)rz'A container class for a set of Morsels.cCs||fS)a
real_value, coded_value = value_decode(STRING)
        Called prior to setting a cookie's value from the network
        representation.  The VALUE is the value read from HTTP
        header.
        Override this function to modify the behavior of cookies.
        r)rErNrrr�value_decode�szBaseCookie.value_decodecCst|�}||fS)z�real_value, coded_value = value_encode(VALUE)
        Called prior to setting a cookie's value from the dictionary
        representation.  The VALUE is the value being assigned.
        Override this function to modify the behavior of cookies.
        )r)rErN�strvalrrr�value_encode�szBaseCookie.value_encodeNcCs|r|j|�dS)N)�load)rE�inputrrrrG�szBaseCookie.__init__cCs.|j|t��}|j|||�tj|||�dS)z+Private method for setting a cookie's valueN)�getr7r[rCrD)rErFZ
real_valuerI�MrrrZ__set�szBaseCookie.__setcCs:t|t�rtj|||�n|j|�\}}|j|||�dS)zDictionary style assignment.N)rOr7rCrDrs�_BaseCookie__set)rErFrH�rval�cvalrrrrDs
zBaseCookie.__setitem__�Set-Cookie:�
cCs>g}t|j��}x"|D]\}}|j|j||��qW|j|�S)z"Return a string suitable for HTTP.)rhrVr(rc�join)rErarb�seprkrVrFrHrrrrc
s
zBaseCookie.outputcCsNg}t|j��}x(|D] \}}|jd|t|j�f�qWd|jjt|�fS)Nz%s=%sz<%s: %s>)rhrVr(�reprrHrdr�
_spacejoin)rE�lrVrFrHrrrres
zBaseCookie.__repr__cCs:g}t|j��}x |D]\}}|j|j|��qWt|�S)z(Return a string suitable for JavaScript.)rhrVr(rgr,)rErarkrVrFrHrrrrgs
zBaseCookie.js_outputcCs8t|t�r|j|�nx|j�D]\}}|||<q WdS)z�Load cookies from a string (presumably HTTP_COOKIE) or
        from a dictionary.  Loading cookies from a dictionary 'd'
        is equivalent to calling:
            map(Cookie.__setitem__, d.keys(), d.values())
        N)rOr�_BaseCookie__parse_stringrV)rEZrawdatarFrHrrrrt&s

zBaseCookie.loadcCspd}t|�}g}d}d}d}�xd|ko2|kn�r|j||�}	|	sLP|	jd�|	jd�}
}|	jd�}|
ddkr�|s~q |j||
dd�|f�q |
j�tjkr�|s�dS|dkr�|
j�tjkr�|j||
df�q�dSn|j||
t	|�f�q |dk	�r|j||
|j
|�f�d}q dSq Wd}xF|D]>\}
}
}|
|k�rH|||
<n|\}}|j|
||�||
}�q*WdS)	NrFr rrFrN�$T)r$�match�group�endr(rJr7rBrir1rqrx)rErZpattr-rZparsed_itemsZmorsel_seenZTYPE_ATTRIBUTEZ
TYPE_KEYVALUEr�rFrHrw�tpryrzrrrZ__parse_string4sF



zBaseCookie.__parse_string)N)Nr{r|)N)rrrrlrqrsrGrxrDrcrprergrt�_CookiePatternr�rrrrr�s		
	

c@s eZdZdZdd�Zdd�ZdS)rz�
    SimpleCookie supports strings as cookie values.  When setting
    the value using the dictionary assignment notation, SimpleCookie
    calls the builtin str() to convert the value to a string.  Values
    received from HTTP are kept as strings.
    cCst|�|fS)N)r1)rErNrrrrqxszSimpleCookie.value_decodecCst|�}|t|�fS)N)rr)rErNrrrrrrs{szSimpleCookie.value_encodeN)rrrrlrqrsrrrrrqs))rl�re�string�__all__r}r,rjr�r�	ExceptionrZ
ascii_lettersZdigitsrZZ_UnescapedCharsr[�range�map�ordrrS�compile�escape�	fullmatchrrr%r'r1Z_weekdaynameZ
_monthnamer6rCr7Z_LegalKeyCharsZ_LegalValueChars�ASCII�VERBOSEr�rrrrrr�<module>sF
	

2J
client.cpython-36.opt-1.pyc000064400000104460151732672750011433 0ustar003

���i*��@srdZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
mZdddddd	d
ddd
ddddddddgZdZ
dZdZdZdZdZe�jejj�dd�ejjj�D�ZdZdZd Zejd!�jZejd"�jZ ejd#�Z!ejd$�Z"d%d&d'hZ#dCd)d*�Z$Gd+d,�d,ej%j&�Z'd-d.�Z(e'fd/d0�Z)Gd1d�dej*�Z+Gd2d�d�Z,yddl-Z-Wne.k
�rlYnXGd3d4�d4e,�Z/ej0d4�Gd5d�de1�Z2Gd6d�de2�Z3Gd7d�de2�Z4Gd8d�de2�Z5Gd9d	�d	e2�Z6Gd:d
�d
e2�Z7Gd;d�de2�Z8Gd<d
�d
e2�Z9Gd=d�de9�Z:Gd>d�de9�Z;Gd?d�de9�Z<Gd@d�de2�Z=GdAd�de2�Z>GdBd�de?e=�Z@e2ZAdS)Da�
HTTP/1.1 client library

<intro stuff goes here>
<other stuff, too>

HTTPConnection goes through a number of "states", which define when a client
may legally make another request or fetch the response for a particular
request. This diagram details these state transitions:

    (null)
      |
      | HTTPConnection()
      v
    Idle
      |
      | putrequest()
      v
    Request-started
      |
      | ( putheader() )*  endheaders()
      v
    Request-sent
      |\_____________________________
      |                              | getresponse() raises
      | response = getresponse()     | ConnectionError
      v                              v
    Unread-response                Idle
    [Response-headers-read]
      |\____________________
      |                     |
      | response.read()     | putrequest()
      v                     v
    Idle                  Req-started-unread-response
                     ______/|
                   /        |
   response.read() |        | ( putheader() )*  endheaders()
                   v        v
       Request-started    Req-sent-unread-response
                            |
                            | response.read()
                            v
                          Request-sent

This diagram presents the following rules:
  -- a second request may not be started until {response-headers-read}
  -- a response [object] cannot be retrieved until {request-sent}
  -- there is no differentiation between an unread response body and a
     partially read response body

Note: this enforcement is applied by the HTTPConnection class. The
      HTTPResponse class does not enforce this state machine, which
      implies sophisticated clients may accelerate the request/response
      pipeline. Caution should be taken, though: accelerating the states
      beyond the above pattern may imply knowledge of the server's
      connection-close behavior for certain requests. For example, it
      is impossible to tell whether the server will close the connection
      UNTIL the response headers have been read; this means that further
      requests cannot be placed into the pipeline until it is known that
      the server will NOT be closing the connection.

Logical State                  __state            __response
-------------                  -------            ----------
Idle                           _CS_IDLE           None
Request-started                _CS_REQ_STARTED    None
Request-sent                   _CS_REQ_SENT       None
Unread-response                _CS_IDLE           <response_class>
Req-started-unread-response    _CS_REQ_STARTED    <response_class>
Req-sent-unread-response       _CS_REQ_SENT       <response_class>
�N)�urlsplit�HTTPResponse�HTTPConnection�
HTTPException�NotConnected�UnknownProtocol�UnknownTransferEncoding�UnimplementedFileMode�IncompleteRead�
InvalidURL�ImproperConnectionState�CannotSendRequest�CannotSendHeader�ResponseNotReady�
BadStatusLine�LineTooLong�RemoteDisconnected�error�	responses�Pi�ZUNKNOWNZIdlezRequest-startedzRequest-sentcCsi|]}|j|�qS�)�phrase)�.0�vrr�#/usr/lib64/python3.6/http/client.py�
<dictcomp>ksrii�ds[^:\s][^:\r\n]*s\n(?![ \t])|\r(?![ \t\n])z[- ]z[-]ZPATCHZPOSTZPUT�datacCsfy
|jd�Stk
r`}z:t|j|j|j|jd|j�||j|j�|f�d�WYdd}~XnXdS)z<Call data.encode("latin-1") but show a better error message.zlatin-1z`%s (%.20r) is not valid Latin-1. Use %s.encode('utf-8') if you want to send it encoded in UTF-8.N)�encode�UnicodeEncodeError�encoding�object�start�end�title)r�name�errrrr�_encode�s
r'c@seZdZdd�ZdS)�HTTPMessagecCsn|j�d}t|�}g}d}xL|j�D]@}|d|�j�|krDd}n|dd�j�sXd}|r&|j|�q&W|S)a�Find all header lines matching a given header name.

        Look through the list of headers and find all lines matching a given
        header name (and their continuation lines).  A list of the lines is
        returned, without interpretation.  If the header does not occur, an
        empty list is returned.  If the header occurs multiple times, all
        occurrences are returned.  Case is not important in the header name.

        �:rN�)�lower�len�keys�isspace�append)�selfr%�nZlstZhit�linerrr�getallmatchingheaders�s
z!HTTPMessage.getallmatchingheadersN)�__name__�
__module__�__qualname__r3rrrrr(�sr(cCs\g}xR|jtd�}t|�tkr(td��|j|�t|�tkrJtdt��|dkrPqW|S)z�Reads potential header lines into a list from a file pointer.

    Length of line is limited by _MAXLINE, and number of
    headers is limited by _MAXHEADERS.
    r*zheader linezgot more than %d headers�
�
�)r7r8r9)�readline�_MAXLINEr,rr/�_MAXHEADERSr)�fp�headersr2rrr�
_read_headers�s
r?cCs,t|�}dj|�jd�}tjj|d�j|�S)aGParses only RFC2822 headers from a file pointer.

    email Parser wants to see strings rather than bytes.
    But a TextIOWrapper around self.rfile would buffer too many bytes
    from the stream, bytes which we later need to read as bytes.
    So we read the correct bytes here, as bytes, for email Parser
    to parse.

    r9z
iso-8859-1)�_class)r?�join�decode�email�parserZParserZparsestr)r=r@r>Zhstringrrr�
parse_headers�s
rEcseZdZd@dd�Zdd�Zdd�Zd	d
�Zdd�Z�fd
d�Z�fdd�Z	dd�Z
dd�ZdAdd�Zdd�Z
dd�Zdd�Zdd�Zdd �Zd!d"�Zd#d$�Zd%d&�ZdCd(d)�ZdEd*d+�ZdG�fd,d-�	Zd.d/�Zd0d1�Zd2d3�ZdHd4d5�Zd6d7�Zd8d9�Zd:d;�Zd<d=�Zd>d?�Z �Z!S)IrrNcCsR|jd�|_||_||_d|_|_t|_t|_t|_	t|_
t|_t|_t|_
dS)N�rb)�makefiler=�
debuglevel�_methodr>�msg�_UNKNOWN�version�status�reason�chunked�
chunk_left�length�
will_close)r0�sockrH�method�urlrrr�__init__�szHTTPResponse.__init__cCst|jjtd�d�}t|�tkr*td��|jdkrBtdt|��|sNt	d��y|j
dd�\}}}WnFtk
r�y|j
dd�\}}d}Wntk
r�d}YnXYnX|jd	�s�|j
�t|��y$t|�}|d
ks�|dkr�t|��Wntk
�rt|��YnX|||fS)Nr*z
iso-8859-1zstatus linerzreply:z-Remote end closed connection without response��zHTTP/ri�)�strr=r:r;r,rrH�print�reprr�split�
ValueError�
startswith�_close_connr�int)r0r2rLrMrNrrr�_read_statuss2

zHTTPResponse._read_statuscCs�|jdk	rdSx<|j�\}}}|tkr(Pt|j�}|jdkrFtd|�~qW||_|_|j	�|_
|dkrrd|_n|jd�r�d|_nt
|��t|j�|_|_|jdkr�x&|jD]}td|d	|jj|��q�W|jjd
�}|r�|j�dkr�d|_d|_nd
|_|j�|_d|_|jjd�}|jjd
�}|�rx|j�rxyt|�|_Wntk
�rbd|_YnX|jdk�r~d|_nd|_|tk�s�|tk�s�d|k�o�dkn�s�|jdk�r�d|_|j�r�|j�r�|jdk�r�d|_dS)Nrzheaders:�HTTP/1.0�HTTP/0.9�
zHTTP/1.�zheader:r)ztransfer-encodingrOTFzcontent-lengthr���HEAD)rbrc)r>raZCONTINUEr?r=rHrZ�coderM�striprNrLr^rrErJ�getr+rOrP�_check_closerRrQr`r]Z
NO_CONTENTZNOT_MODIFIEDrI)r0rLrMrNZskipped_headers�hdrZtr_encrQrrr�begin9s\









zHTTPResponse.begincCs�|jjd�}|jdkr:|jjd�}|r6d|j�kr6dSdS|jjd�rJdS|r^d|j�kr^dS|jjd�}|r~d|j�kr~dSdS)NZ
connectionre�closeTFz
keep-alivezproxy-connection)r>rjrLr+)r0ZconnZpconnrrrrk�s
zHTTPResponse._check_closecCs|j}d|_|j�dS)N)r=rn)r0r=rrrr_�szHTTPResponse._close_connc
s$zt�j�Wd|jr|j�XdS)N)�superrnr=r_)r0)�	__class__rrrn�szHTTPResponse.closecst�j�|jr|jj�dS)N)ro�flushr=)r0)rprrrq�s
zHTTPResponse.flushcCsdS)zAlways returns TrueTr)r0rrr�readable�szHTTPResponse.readablecCs
|jdkS)z!True if the connection is closed.N)r=)r0rrr�isclosed�szHTTPResponse.isclosedcCs�|jdkrdS|jdkr$|j�dS|dk	rRt|�}|j|�}t|�d|�j�S|jr`|j�S|j	dkrv|jj
�}n6y|j|j	�}Wntk
r�|j��YnXd|_	|j�|SdS)Nr9rgr)
r=rIr_�	bytearray�readinto�
memoryview�tobytesrO�_readall_chunkedrQ�read�
_safe_readr
)r0�amt�br1�srrrry�s*



zHTTPResponse.readcCs�|jdkrdS|jdkr$|j�dS|jr4|j|�S|jdk	r^t|�|jkr^t|�d|j�}|jj|�}|r~|r~|j�n&|jdk	r�|j|8_|js�|j�|S)z^Read up to len(b) bytes into bytearray b and return the number
        of bytes read.
        Nrrg)	r=rIr_rO�_readinto_chunkedrQr,rvru)r0r|r1rrrru�s$






zHTTPResponse.readintocCsp|jjtd�}t|�tkr$td��|jd�}|dkrB|d|�}y
t|d�Stk
rj|j��YnXdS)Nr*z
chunk size�;r�)	r=r:r;r,r�findr`r]r_)r0r2�irrr�_read_next_chunk_size
s

z"HTTPResponse._read_next_chunk_sizecCs>x8|jjtd�}t|�tkr&td��|s,P|dkrPqWdS)Nr*ztrailer line�
r8r9)r�r8r9)r=r:r;r,r)r0r2rrr�_read_and_discard_trailersz&HTTPResponse._read_and_discard_trailercCsl|j}|sh|dk	r|jd�y|j�}Wntk
rDtd��YnX|dkrb|j�|j�d}||_|S)NrWr9r)rPrzr�r]r
r�r_)r0rPrrr�_get_chunk_left(s
zHTTPResponse._get_chunk_leftcCsdg}y8x,|j�}|dkrP|j|j|��d|_qWdj|�Stk
r^tdj|���YnXdS)Nrr9)r�r/rzrPrAr
)r0�valuerPrrrrx@s

zHTTPResponse._readall_chunkedcCs�d}t|�}yvxp|j�}|dkr$|St|�|krL|j|�}|||_||S|d|�}|j|�}||d�}||7}d|_qWWn(tk
r�tt|d|����YnXdS)Nr)rvr�r,�_safe_readintorPr
�bytes)r0r|�total_bytes�mvbrPr1�temp_mvbrrrr~Ns$


zHTTPResponse._readinto_chunkedcCsXg}xH|dkrL|jjt|t��}|s4tdj|�|��|j|�|t|�8}qWdj|�S)aVRead the number of bytes requested, compensating for partial reads.

        Normally, we have a blocking socket, but a read() can be interrupted
        by a signal (resulting in a partial read).

        Note that we cannot distinguish between EOF and an interrupt when zero
        bytes have been read. IncompleteRead() will be raised in this
        situation.

        This function should be used when <amt> bytes "should" be present for
        reading. If the bytes are truly not available (due to EOF), then the
        IncompleteRead exception can be used to detect the problem.
        rr9)r=ry�min�	MAXAMOUNTr
rAr/r,)r0r{r}�chunkrrrrzfs

zHTTPResponse._safe_readcCs�d}t|�}xt|t|�kr�tt|�kr@|dt�}|jj|�}n|jj|�}|sjtt|d|��t|���||d�}||7}qW|S)z2Same as _safe_read, but for reading into a buffer.rN)rvr,r�r=rur
r�)r0r|r�r�r�r1rrrr�}szHTTPResponse._safe_readintor*cCs�|jdks|jdkrdS|jr(|j|�S|jdk	rJ|dksD||jkrJ|j}y|jj|�}Wn*tk
r�|dkrt�|jjd�}YnX|r�|r�|j�n|jdk	r�|jt|�8_|S)zvRead with at most one underlying system call.  If at least one
        byte is buffered, return that instead.
        Nrgr9rr�ii@)	r=rIrO�_read1_chunkedrQ�read1r]r_r,)r0r1�resultrrrr��s"



zHTTPResponse.read1cCs4|jdks|jdkrdS|jr(|j|�S|jj|�S)Nrgr9)r=rIrO�
_peek_chunked�peek)r0r1rrrr��s

zHTTPResponse.peekcs�|jdks|jdkrdS|jr*t�j|�S|jdk	rL|dksF||jkrL|j}|jj|�}|rl|rl|j�n|jdk	r�|jt|�8_|S)Nrgr9r)r=rIrOror:rQr_r,)r0�limitr�)rprrr:�s


zHTTPResponse.readlinecCsf|j�}|dks|dkrdSd|ko.|kns8|}|jj|�}|jt|�8_|sbtd��|S)Nrr9)r�r=r�rPr,r
)r0r1rPryrrrr��szHTTPResponse._read1_chunkedcCsBy|j�}Wntk
r dSX|dkr.dS|jj|�d|�S)Nr9)r�r
r=r�)r0r1rPrrrr��szHTTPResponse._peek_chunkedcCs
|jj�S)N)r=�fileno)r0rrrr��szHTTPResponse.filenocCsH|jdkrt��|jj|�p|}t|t�s6t|d�r:|Sdj|�SdS)axReturns the value of the header matching *name*.

        If there are multiple matching headers, the values are
        combined into a single string separated by commas and spaces.

        If no matching header is found, returns *default* or None if
        the *default* is not specified.

        If the headers are unknown, raises http.client.ResponseNotReady.

        N�__iter__z, )r>rZget_all�
isinstancerY�hasattrrA)r0r%�defaultr>rrr�	getheader�s
zHTTPResponse.getheadercCs|jdkrt��t|jj��S)z&Return list of (header, value) tuples.N)r>r�list�items)r0rrr�
getheaders�s
zHTTPResponse.getheaderscCs|S)Nr)r0rrrr��szHTTPResponse.__iter__cCs|jS)ajReturns an instance of the class mimetools.Message containing
        meta-information associated with the URL.

        When the method is HTTP, these headers are those returned by
        the server at the head of the retrieved HTML page (including
        Content-Length and Content-Type).

        When the method is FTP, a Content-Length header will be
        present if (as is now usual) the server passed back a file
        length in response to the FTP retrieval request. A
        Content-Type header will be present if the MIME type can be
        guessed.

        When the method is local-file, returned headers will include
        a Date representing the file's last-modified time, a
        Content-Length giving file size, and a Content-Type
        containing a guess at the file's type. See also the
        description of the mimetools module.

        )r>)r0rrr�info�szHTTPResponse.infocCs|jS)aZReturn the real URL of the page.

        In some cases, the HTTP server redirects a client to another
        URL. The urlopen() function handles this transparently, but in
        some cases the caller needs to know which URL the client was
        redirected to. The geturl() method can be used to get at this
        redirected URL.

        )rU)r0rrr�geturls
zHTTPResponse.geturlcCs|jS)zuReturn the HTTP status code that was sent with the response,
        or None if the URL is not an HTTP URL.

        )rM)r0rrr�getcodeszHTTPResponse.getcode)rNN)N���)r�r�)r�r�)r�)N)"r4r5r6rVrarmrkr_rnrqrrrsryrur�r�r�rxr~rzr�r�r�r:r�r�r�r�r�r�r�r�r��
__classcell__rr)rprr�s<	
!K

 "

	

c@s�eZdZdZdZeZeZdZ	dZ
edd��Zedd��Z
d	ejd	fd
d�Zd0dd
�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zd1dd �Zd2d!d"�Zd#d$�Zd%d&�Zd3dd'�d(d)�Zd	ifdd'�d*d+�Zd,d-�Z d.d/�Z!d	S)4rrezHTTP/1.1r*rcCst|tj�S)zFTest whether a file-like object is a text or a binary stream.
        )r��io�
TextIOBase)�streamrrr�
_is_textIO0szHTTPConnection._is_textIOcCsd|dkr|j�tkrdSdSt|d�r*dSyt|�}|jStk
rLYnXt|t�r`t|�SdS)aGet the content-length based on the body.

        If the body is None, we set Content-Length: 0 for methods that expect
        a body (RFC 7230, Section 3.3.2). We also set the Content-Length for
        any method if the body is a str or bytes-like object and not a file.
        Nrry)	�upper�_METHODS_EXPECTING_BODYr�rv�nbytes�	TypeErrorr�rYr,)�bodyrTZmvrrr�_get_content_length6s

z"HTTPConnection._get_content_lengthNcCs\||_||_d|_g|_d|_t|_d|_d|_d|_	i|_
|j||�\|_|_
tj|_dS)N)�timeout�source_addressrS�_buffer�_HTTPConnection__response�_CS_IDLE�_HTTPConnection__staterI�_tunnel_host�_tunnel_port�_tunnel_headers�
_get_hostport�host�port�socketZcreate_connection�_create_connection)r0r�r�r�r�rrrrVVszHTTPConnection.__init__cCs<|jrtd��|j||�\|_|_|r.||_n
|jj�dS)aDSet up host and port for HTTP CONNECT tunnelling.

        In a connection that uses HTTP CONNECT tunneling, the host passed to the
        constructor is used as a proxy server that relays all communication to
        the endpoint passed to `set_tunnel`. This done by sending an HTTP
        CONNECT request to the proxy server when the connection is established.

        This method must be called before the HTML connection has been
        established.

        The headers argument should be a mapping of extra HTTP headers to send
        with the CONNECT request.
        z.Can't set up tunnel for established connectionN)rS�RuntimeErrorr�r�r�r��clear)r0r�r�r>rrr�
set_tunneliszHTTPConnection.set_tunnelcCs�|dkr�|jd�}|jd�}||kr�yt||dd��}WnHtk
r�||dd�dkrh|j}ntd||dd���YnX|d|�}n|j}|r�|ddkr�|ddkr�|dd	�}||fS)
Nr)�]r*rXznonnumeric port: '%s'r�[r�r�)�rfindr`r]�default_portr)r0r�r�r��jrrrr��s

zHTTPConnection._get_hostportcCs
||_dS)N)rH)r0�levelrrr�set_debuglevel�szHTTPConnection.set_debuglevelcCsd|j|jf}|jd�}|j|�x6|jj�D](\}}d||f}|jd�}|j|�q0W|jd�|j|j|jd�}|j	�\}}	}
|	t
jjkr�|j
�td|	|
j�f��xP|jjtd�}t|�tkr�td	��|s�P|dkr�P|jdkr�td
|j��q�WdS)NzCONNECT %s:%d HTTP/1.0
�asciiz%s: %s
zlatin-1�
)rTzTunnel connection failed: %d %sr*zheader liner8r9rzheader:)r�r8r9)r�r�r�sendr�r��response_classrSrIra�http�
HTTPStatusZOKrn�OSErrorrir=r:r;r,rrHrZrB)r0Zconnect_strZ
connect_bytes�headerr�Z
header_strZheader_bytes�responserLrh�messager2rrr�_tunnel�s2





zHTTPConnection._tunnelcCsB|j|j|jf|j|j�|_|jjtjtj	d�|j
r>|j�dS)z3Connect to the host and port specified in __init__.r*N)r�r�r�r�r�rSZ
setsockoptr�ZIPPROTO_TCPZTCP_NODELAYr�r�)r0rrr�connect�s
zHTTPConnection.connectcCsBt|_z|j}|r d|_|j�Wd|j}|r<d|_|j�XdS)z(Close the connection to the HTTP server.N)r�r�rSrnr�)r0rSr�rrrrn�szHTTPConnection.closecCs|jdkr |jr|j�nt��|jdkr8tdt|��d}t|d�r�|jdkrXtd�|j|�}|rx|jdkrxtd�x.|j	|�}|s�P|r�|j
d�}|jj|�qzWdSy|jj|�WnNtk
�r
t
|tj�r�x*|D]}|jj|�q�Wntd	t|���YnXdS)
z�Send `data' to the server.
        ``data`` can be a string object, a bytes object, an array object, a
        file-like object that supports a .read() method, or an iterable object.
        Nrzsend:i ryzsendIng a read()ablezencoding file using iso-8859-1z
iso-8859-1z9data should be a bytes-like object or an iterable, got %r)rS�	auto_openr�rrHrZr[r�r�ryrZsendallr�r��collections�Iterable�type)r0r�	blocksizer�	datablock�drrrr��s:








zHTTPConnection.sendcCs|jj|�dS)zuAdd a line of output to the current request buffer.

        Assumes that the line does *not* end with \r\n.
        N)r�r/)r0r}rrr�_output�szHTTPConnection._outputccsdd}|jdkrtd�|j|�}|r6|jdkr6td�x(|j|�}|sHP|rV|jd�}|Vq8WdS)Ni rzsendIng a read()ablezencoding file using iso-8859-1z
iso-8859-1)rHrZr�ryr)r0rrr�rr�rrr�_read_readable�s



zHTTPConnection._read_readableFcCs$|jjd
�dj|j�}|jdd�=|j|�|dk	�r t|d�rN|j|�}nZyt|�WnFtk
r�yt|�}Wn$tk
r�tdt	|���YnXYnX|f}xZ|D]R}|s�|j
dkr�td�q�|r�|jdkr�t
|�d	�d
�jd�|d}|j|�q�W|�r |jdk�r |jd�dS)z�Send the currently buffered request and clear the buffer.

        Appends an extra \r\n to the buffer.
        A message_body may be specified, to be appended to the request.
        r9s
NryzAmessage_body should be a bytes-like object or an iterable, got %rrzZero length chunk ignoredre�Xz
r�s0

)r9r9)r��extendrAr�r�r�rvr��iterr�rHrZ�	_http_vsnr,r)r0�message_body�encode_chunkedrJZchunksr�rrr�_send_outputs4




zHTTPConnection._send_outputc

Cs�|jr|jj�rd|_|jtkr(t|_n
t|j��|j|�||_|sJd}tj	|�}|rrt
d|�d|j��d���d|||jf}|j
|jd��|jdk�r�|�s�d	}|jd
�r�t|�\}}}}}|�ry|jd�}	Wntk
r�|jd�}	YnX|jd|	�n�|j�r|j}
|j}n|j}
|j}y|
jd�}Wn tk
�rV|
jd�}YnX|
jd
�dk�rtd|d}||jk�r�|jd|�n|jd�}|jdd||f�|�s�|jdd�ndS)a`Send a request to the server.

        `method' specifies an HTTP request method, e.g. 'GET'.
        `url' specifies the object being requested, e.g. '/index.html'.
        `skip_host' if True does not add automatically a 'Host:' header
        `skip_accept_encoding' if True does not add automatically an
           'Accept-Encoding:' header
        N�/z&URL can't contain control characters. z (found at least �)z%s %s %sr�rerXr�ZidnaZHostr)r�[�]z%s:%szAccept-EncodingZidentity)r�rsr�r��_CS_REQ_STARTEDr
�_validate_methodrI�!_contains_disallowed_url_pchar_re�searchr�group�
_http_vsn_strr�rr�r^rr�	putheaderr�r�r�r�r�r�rB)
r0rTrU�	skip_host�skip_accept_encoding�match�requestZnetlocZnilZ
netloc_encr�r�Zhost_encrrr�
putrequestAsV






zHTTPConnection.putrequestcCs,tj|�}|r(td|�d|j��d���dS)z&Validate a method name for putrequest.z)method can't contain control characters. z (found at least r�N)�$_contains_disallowed_method_pchar_rer�r]r�)r0rTr�rrrr��s
zHTTPConnection._validate_methodcGs�|jtkrt��t|d�r$|jd�}t|�s:td|f��t|�}xht|�D]\\}}t|d�rn|jd�||<nt	|t
�r�t|�jd�||<t||�rLtd||f��qLWdj
|�}|d|}|j|�dS)	zkSend a request header line to the server.

        For example: h.putheader('Accept', 'text/html')
        rr�zInvalid header name %rzlatin-1zInvalid header value %rs
	s: N)r�r�rr�r�_is_legal_header_namer]r��	enumerater�r`rY�_is_illegal_header_valuerAr�)r0r��valuesr�Z	one_valuer�rrrr��s"





zHTTPConnection.putheader)r�cCs*|jtkrt|_nt��|j||d�dS)z�Indicate that the last header line has been sent to the server.

        This method sends the request to the server.  The optional message_body
        argument can be used to pass a message body associated with the
        request.
        )r�N)r�r��_CS_REQ_SENTrr�)r0r�r�rrr�
endheaders�s
zHTTPConnection.endheaderscCs|j|||||�dS)z&Send a complete request to the server.N)�
_send_request)r0rTrUr�r>r�rrrr��szHTTPConnection.requestcCs�tdd�|D��}i}d|kr&d|d<d|kr6d|d<|j||f|�d|kr�d	|kr�d
}|j||�}|dkr�|dk	r�|jdkr�td|�d
}|jdd�q�|jdt|��nd
}x |j�D]\}	}
|j|	|
�q�Wt|t�r�t	|d�}|j
||d�dS)Ncss|]}|j�VqdS)N)r+)r�krrr�	<genexpr>�sz/HTTPConnection._send_request.<locals>.<genexpr>r�r*r�zaccept-encodingr�zcontent-lengthztransfer-encodingFrzUnable to determine size of %rTzTransfer-EncodingrOzContent-Lengthr�)r�)�	frozensetr�r�rHrZr�rYr�r�r'r�)r0rTrUr�r>r�Zheader_namesZskipsZcontent_lengthrlr�rrrr��s0	


zHTTPConnection._send_requestcCs�|jr|jj�rd|_|jtks&|jr0t|j��|jdkrR|j|j|j|jd�}n|j|j|jd�}yLy|j	�Wnt
k
r�|j��YnXt|_|j
r�|j�n||_|S|j��YnXdS)a)Get the response from the server.

        If the HTTPConnection is in the correct state, returns an
        instance of HTTPResponse or of whatever object is returned by
        the response_class variable.

        If a request has not been sent or if a previous response has
        not be handled, ResponseNotReady is raised.  If the HTTP
        response indicates that the connection should be closed, then
        it will be closed before the response is returned.  When the
        connection is closed, the underlying socket is closed.
        Nr)rT)r�rsr�r�rrHr�rSrIrm�ConnectionErrorrnr�rR)r0r�rrr�getresponse)s,


zHTTPConnection.getresponse)NN)NF)FF)N)"r4r5r6r�r�rr��	HTTP_PORTr�r�rH�staticmethodr�r�r��_GLOBAL_DEFAULT_TIMEOUTrVr�r�r�r�r�rnr�r�r�r�r�r�r�r�r�r�r�rrrrr&s< 
	'
6
	
.csFeZdZdZeZdddejdfddd��fdd�Z�fdd�Z	�Z
S)�HTTPSConnectionz(This class allows communication via SSL.N)�context�check_hostnamecs�tt|�j||||�|dk	s.|dk	s.|dk	rDddl}	|	jdtd�||_||_|dkrptj	�}|j
dk	rpd|_
|jtjk}
|dkr�|j
}|r�|
r�td��|s�|r�|j||�|j
dk	r�d|_
||_||_dS)NrzTkey_file, cert_file and check_hostname are deprecated, use a custom context instead.rWTzMcheck_hostname needs a SSL context with either CERT_OPTIONAL or CERT_REQUIRED)rorrV�warnings�warn�DeprecationWarning�key_file�	cert_file�sslZ_create_default_https_contextZpost_handshake_authZverify_modeZ	CERT_NONErr]Zload_cert_chain�_context�_check_hostname)r0r�r�rr	r�r�rrrZwill_verify)rprrrVts0


zHTTPSConnection.__init__cs�t�j�|jr|j}n|j}|jj|j|d�|_|jjr�|jr�yt	j
|jj�|�Wn.tk
r�|jj
tj�|jj��YnXdS)z(Connect to a host on a given (SSL) port.)�server_hostnameN)ror�r�r�rZwrap_socketrSrrr
Zmatch_hostnameZgetpeercert�	ExceptionZshutdownr�Z	SHUT_RDWRrn)r0r
)rprrr��s



zHTTPSConnection.connect)r4r5r6�__doc__�
HTTPS_PORTr�r�rrVr�r�rr)rprrmsrc@seZdZdS)rN)r4r5r6rrrrr�sc@seZdZdS)rN)r4r5r6rrrrr�sc@seZdZdS)rN)r4r5r6rrrrr�sc@seZdZdd�ZdS)rcCs|f|_||_dS)N)�argsrL)r0rLrrrrV�szUnknownProtocol.__init__N)r4r5r6rVrrrrr�sc@seZdZdS)rN)r4r5r6rrrrr�sc@seZdZdS)r	N)r4r5r6rrrrr	�sc@s&eZdZddd�Zdd�Zdd�ZdS)	r
NcCs|f|_||_||_dS)N)r�partial�expected)r0rrrrrrV�szIncompleteRead.__init__cCs2|jdk	rd|j}nd}d|jjt|j�|fS)Nz, %i more expectedrXz%s(%i bytes read%s))rrpr4r,r)r0�errr�__repr__�s

zIncompleteRead.__repr__cCst|�S)N)r[)r0rrr�__str__�szIncompleteRead.__str__)N)r4r5r6rVrrrrrrr
�s
c@seZdZdS)rN)r4r5r6rrrrr�sc@seZdZdS)r
N)r4r5r6rrrrr
�sc@seZdZdS)rN)r4r5r6rrrrr�sc@seZdZdS)rN)r4r5r6rrrrr�sc@seZdZdd�ZdS)rcCs|st|�}|f|_||_dS)N)r[rr2)r0r2rrrrV�szBadStatusLine.__init__N)r4r5r6rVrrrrr�sc@seZdZdd�ZdS)rcCstj|dt|f�dS)Nz&got more than %d bytes when reading %s)rrVr;)r0Z	line_typerrrrV�szLineTooLong.__init__N)r4r5r6rVrrrrr�sc@seZdZdd�ZdS)rcOs"tj|d�tj|f|�|�dS)NrX)rrV�ConnectionResetError)r0�pos�kwrrrrV�szRemoteDisconnected.__init__N)r4r5r6rVrrrrr�s)r)BrZemail.parserrCZ
email.messager�r��os�rer�r�Zurllib.parser�__all__r�rrKr�r�r��globals�updater��__members__r�rr�r;r<�compile�	fullmatchr�r�r�r�r�r�r'r�ZMessager(r?rE�BufferedIOBaserrr
�ImportErrorrr/rrrrrrr	r
rr
rrrrrrrrrrr�<module>Es�



9F=
server.cpython-36.opt-1.pyc000064400000077030151732672750011465 0ustar003

���i���@s�dZdZddddgZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddl
Z
ddlZddlZddlZddlZddlZddlZddlZddlmZd	Zd
ZGdd�dej�ZGdd�dej�ZGd
d�de�Zdd�Zdadd�Z dd�Z!Gdd�de�Z"eedddfdd�Z#e$dk�r�ej%�Z&e&j'dddd�e&j'dd dd!d"d#�e&j'd$d%de(d&d'd(�e&j)�Z*e*j+�r~e"Z,neZ,e#e,e*j-e*j.d)�dS)*a@HTTP server classes.

Note: BaseHTTPRequestHandler doesn't implement any HTTP request; see
SimpleHTTPRequestHandler for simple implementations of GET, HEAD and POST,
and CGIHTTPRequestHandler for CGI scripts.

It does, however, optionally implement HTTP/1.1 persistent connections,
as of version 0.3.

Notes on CGIHTTPRequestHandler
------------------------------

This class implements GET and POST requests to cgi-bin scripts.

If the os.fork() function is not present (e.g. on Windows),
subprocess.Popen() is used as a fallback, with slightly altered semantics.

In all cases, the implementation is intentionally naive -- all
requests are executed synchronously.

SECURITY WARNING: DON'T USE THIS CODE UNLESS YOU ARE INSIDE A FIREWALL
-- it may execute arbitrary Python code or external programs.

Note that status code 200 is sent prior to execution of a CGI script, so
scripts cannot send other status codes such as 302 (redirect).

XXX To do:

- log requests even later (to capture byte count)
- log user-agent header and other interesting goodies
- send error log to separate file
z0.6�
HTTPServer�BaseHTTPRequestHandler�SimpleHTTPRequestHandler�CGIHTTPRequestHandler�N)�
HTTPStatusa�<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
        "http://www.w3.org/TR/html4/strict.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
        <title>Error response</title>
    </head>
    <body>
        <h1>Error response</h1>
        <p>Error code: %(code)d</p>
        <p>Message: %(message)s.</p>
        <p>Error code explanation: %(code)s - %(explain)s.</p>
    </body>
</html>
ztext/html;charset=utf-8c@seZdZdZdd�ZdS)r�cCs4tjj|�|jdd�\}}tj|�|_||_dS)z.Override server_bind to store the server name.N�)�socketserver�	TCPServer�server_bind�server_address�socketZgetfqdn�server_name�server_port)�self�host�port�r�#/usr/lib64/python3.6/http/server.pyr�szHTTPServer.server_bindN)�__name__�
__module__�__qualname__Zallow_reuse_addressrrrrrr�sc
@seZdZdZdejj�dZdeZ	e
ZeZ
dZdd�Zdd	�Zd
d�Zdd
�Zd@dd�ZdAdd�ZdBdd�Zdd�Zdd�Zdd�ZdCdd�Zdd�Zd d!�Zd"d#�ZdDd$d%�Zd&d'�Zd(d)d*d+d,d-d.gZdd/d0d1d2d3d4d5d6d7d8d9d:g
Z d;d<�Z!d=Z"e#j$j%Z&d>d?�e'j(j)�D�Z*dS)Era�HTTP request handler base class.

    The following explanation of HTTP serves to guide you through the
    code as well as to expose any misunderstandings I may have about
    HTTP (so you don't need to read the code to figure out I'm wrong
    :-).

    HTTP (HyperText Transfer Protocol) is an extensible protocol on
    top of a reliable stream transport (e.g. TCP/IP).  The protocol
    recognizes three parts to a request:

    1. One line identifying the request type and path
    2. An optional set of RFC-822-style headers
    3. An optional data part

    The headers and data are separated by a blank line.

    The first line of the request has the form

    <command> <path> <version>

    where <command> is a (case-sensitive) keyword such as GET or POST,
    <path> is a string containing path information for the request,
    and <version> should be the string "HTTP/1.0" or "HTTP/1.1".
    <path> is encoded using the URL encoding scheme (using %xx to signify
    the ASCII character with hex code xx).

    The specification specifies that lines are separated by CRLF but
    for compatibility with the widest range of clients recommends
    servers also handle LF.  Similarly, whitespace in the request line
    is treated sensibly (allowing multiple spaces between components
    and allowing trailing whitespace).

    Similarly, for output, lines ought to be separated by CRLF pairs
    but most clients grok LF characters just fine.

    If the first line of the request has the form

    <command> <path>

    (i.e. <version> is left out) then this is assumed to be an HTTP
    0.9 request; this form has no optional headers and data part and
    the reply consists of just the data.

    The reply form of the HTTP 1.x protocol again has three parts:

    1. One line giving the response code
    2. An optional set of RFC-822-style headers
    3. The data

    Again, the headers and data are separated by a blank line.

    The response code line has the form

    <version> <responsecode> <responsestring>

    where <version> is the protocol version ("HTTP/1.0" or "HTTP/1.1"),
    <responsecode> is a 3-digit response code indicating success or
    failure of the request, and <responsestring> is an optional
    human-readable string explaining what the response code means.

    This server parses the request and the headers, and then calls a
    function specific to the request type (<command>).  Specifically,
    a request SPAM will be handled by a method do_SPAM().  If no
    such method exists the server sends an error response to the
    client.  If it exists, it is called with no arguments:

    do_SPAM()

    Note that the request name is case sensitive (i.e. SPAM and spam
    are different requests).

    The various request details are stored in instance variables:

    - client_address is the client IP address in the form (host,
    port);

    - command, path and version are the broken-down request line;

    - headers is an instance of email.message.Message (or a derived
    class) containing the header information;

    - rfile is a file object open for reading positioned at the
    start of the optional input data part;

    - wfile is a file object open for writing.

    IT IS IMPORTANT TO ADHERE TO THE PROTOCOL FOR WRITING!

    The first thing to be written must be the response line.  Then
    follow 0 or more header lines, then a blank line, and then the
    actual data (if any).  The meaning of the header lines depends on
    the command executed by the server; in most cases, when data is
    returned, there should be at least one header line of the form

    Content-type: <type>/<subtype>

    where <type> and <subtype> should be registered MIME types,
    e.g. "text/html" or "text/plain".

    zPython/rz	BaseHTTP/zHTTP/0.9cCs�d|_|j|_}d|_t|jd�}|jd�}||_|j�}t	|�dk�r|\}}}yZ|dd�dkrjt
�|jdd	�d	}|jd
�}t	|�dkr�t
�t|d�t|d	�f}Wn*t
tfk
r�|j
tjd
|�dSX|dkr�|jdkr�d|_|dk�rr|j
tjd|�dSn^t	|�dk�rR|\}}d|_|dk�rr|j
tjd|�dSn |�s\dS|j
tjd|�dS||||_|_|_|jjd��r�d|jjd�|_ytjj|j|jd�|_Wnrtjjk
�r�}z|j
tjdt|��dSd}~Xn:tjjk
�r4}z|j
tjdt|��dSd}~XnX|jjdd�}	|	j�dk�rZd|_n |	j�dk�rz|jdk�rzd|_|jjdd�}
|
j�dk�r�|jdk�r�|jdk�r�|j ��s�dSdS) a'Parse a request (internal).

        The request should be stored in self.raw_requestline; the results
        are in self.command, self.path, self.request_version and
        self.headers.

        Return True for success, False for failure; on failure, an
        error is sent back.

        NTz
iso-8859-1z
��zHTTP/�/r�.rrzBad request version (%r)FzHTTP/1.1zInvalid HTTP version (%s)ZGETzBad HTTP/0.9 request type (%r)zBad request syntax (%r)z//)Z_classz
Line too longzToo many headers�
Connection��closez
keep-aliveZExpectz100-continue)rr)rr)!�command�default_request_version�request_version�close_connection�str�raw_requestline�rstrip�requestline�split�len�
ValueError�int�
IndexError�
send_errorrZBAD_REQUEST�protocol_versionZHTTP_VERSION_NOT_SUPPORTED�path�
startswith�lstrip�http�clientZ
parse_headers�rfile�MessageClass�headersZLineTooLongZREQUEST_HEADER_FIELDS_TOO_LARGEZ
HTTPException�get�lower�handle_expect_100)r�versionr&�wordsrr.Zbase_version_numberZversion_number�errZconntypeZexpectrrr�
parse_requests�












z$BaseHTTPRequestHandler.parse_requestcCs|jtj�|j�dS)a7Decide what to do with an "Expect: 100-continue" header.

        If the client is expecting a 100 Continue response, we must
        respond with either a 100 Continue or a final response before
        waiting for the request body. The default is to always respond
        with a 100 Continue. You can behave differently (for example,
        reject unauthorized requests) by overriding this method.

        This method should either return True (possibly after sending
        a 100 Continue response) or send an error response and return
        False.

        T)�send_response_onlyrZCONTINUE�end_headers)rrrrr8nsz(BaseHTTPRequestHandler.handle_expect_100cCs�y�|jjd�|_t|j�dkr@d|_d|_d|_|jtj	�dS|jsPd|_
dS|j�s\dSd|j}t||�s�|jtj
d|j�dSt||�}|�|jj�Wn4tjk
r�}z|jd|�d|_
dSd}~XnXdS)	z�Handle a single HTTP request.

        You normally don't need to override this method; see the class
        __doc__ string for information on how to handle specific HTTP
        commands such as GET and POST.

        iirNTZdo_zUnsupported method (%r)zRequest timed out: %r)r3�readliner$r(r&r!rr,rZREQUEST_URI_TOO_LONGr"r<�hasattr�NOT_IMPLEMENTED�getattr�wfile�flushr
Ztimeout�	log_error)rZmname�method�errr�handle_one_request�s4


z)BaseHTTPRequestHandler.handle_one_requestcCs&d|_|j�x|js |j�qWdS)z&Handle multiple requests if necessary.TN)r"rH)rrrr�handle�szBaseHTTPRequestHandler.handleNcCs
y|j|\}}Wntk
r.d\}}YnX|dkr<|}|dkrH|}|jd||�|j||�|jdd�d}|dkr�|tjtjtjfkr�|j	|t
j|dd�t
j|dd�d	�}|jd
d�}|jd|j
�|jd
tt|���|j�|jdko�|�r|jj|�dS)akSend and log an error reply.

        Arguments are
        * code:    an HTTP error code
                   3 digits
        * message: a simple optional 1 line reason phrase.
                   *( HTAB / SP / VCHAR / %x80-FF )
                   defaults to short entry matching the response code
        * explain: a detailed message defaults to the long entry
                   matching the response code.

        This sends an error response (so it must be called before any
        output has been generated), logs the error, and finally sends
        a piece of HTML explaining the error to the user.

        �???Nzcode %d, message %srr��F)�quote)�code�message�explainzUTF-8�replacezContent-TypezContent-LengthZHEAD)rJrJ)�	responses�KeyErrorrE�
send_response�send_headerrZ
NO_CONTENTZ
RESET_CONTENTZNOT_MODIFIED�error_message_format�html�escape�encode�error_content_typer#r(r>rrC�write)rrMrNrOZshortmsgZlongmsgZbodyZcontentrrrr,�s4
z!BaseHTTPRequestHandler.send_errorcCs:|j|�|j||�|jd|j��|jd|j��dS)z�Add the response header to the headers buffer and log the
        response code.

        Also send two standard headers with the server software
        version and the current date.

        ZServerZDateN)�log_requestr=rT�version_string�date_time_string)rrMrNrrrrS�s
z$BaseHTTPRequestHandler.send_responsecCsd|jdkr`|dkr0||jkr,|j|d}nd}t|d�s@g|_|jjd|j||fjdd��dS)	zSend the response header only.zHTTP/0.9Nrr�_headers_bufferz
%s %d %s
zlatin-1�strict)r!rQr@r^�appendr-rX)rrMrNrrrr=�s


z)BaseHTTPRequestHandler.send_response_onlycCsl|jdkr6t|d�sg|_|jjd||fjdd��|j�dkrh|j�dkrVd|_n|j�d	krhd
|_dS)z)Send a MIME header to the headers buffer.zHTTP/0.9r^z%s: %s
zlatin-1r_Z
connectionrTz
keep-aliveFN)r!r@r^r`rXr7r")r�keyword�valuerrrrT�s

z"BaseHTTPRequestHandler.send_headercCs"|jdkr|jjd�|j�dS)z,Send the blank line ending the MIME headers.zHTTP/0.9s
N)r!r^r`�
flush_headers)rrrrr>s
z"BaseHTTPRequestHandler.end_headerscCs(t|d�r$|jjdj|j��g|_dS)Nr^�)r@rCrZ�joinr^)rrrrrcs
z$BaseHTTPRequestHandler.flush_headers�-cCs.t|t�r|j}|jd|jt|�t|��dS)zNLog an accepted request.

        This is called by send_response().

        z
"%s" %s %sN)�
isinstancerrb�log_messager&r#)rrM�sizerrrr[s
z"BaseHTTPRequestHandler.log_requestcGs|j|f|��dS)z�Log an error.

        This is called when a request cannot be fulfilled.  By
        default it passes the message on to log_message().

        Arguments are the same as for log_message().

        XXX This should go to the separate error log.

        N)rh)r�format�argsrrrrE!sz BaseHTTPRequestHandler.log_errorcGs&tjjd|j�|j�||f�dS)a�Log an arbitrary message.

        This is used by all other logging functions.  Override
        it if you have specific logging wishes.

        The first argument, FORMAT, is a format string for the
        message to be logged.  If the format string contains
        any % escapes requiring parameters, they should be
        specified as subsequent arguments (it's just like
        printf!).

        The client ip and current date/time are prefixed to
        every message.

        z%s - - [%s] %s
N)�sys�stderrrZ�address_string�log_date_time_string)rrjrkrrrrh/sz"BaseHTTPRequestHandler.log_messagecCs|jd|jS)z*Return the server software version string.� )�server_version�sys_version)rrrrr\Esz%BaseHTTPRequestHandler.version_stringcCs |dkrtj�}tjj|dd�S)z@Return the current date and time formatted for a message header.NT)Zusegmt)�time�emailZutilsZ
formatdate)rZ	timestamprrrr]Isz'BaseHTTPRequestHandler.date_time_stringc	CsBtj�}tj|�\	}}}}}}}}	}
d||j|||||f}|S)z.Return the current time formatted for logging.z%02d/%3s/%04d %02d:%02d:%02d)rsZ	localtime�	monthname)rZnowZyearZmonthZdayZhhZmmZss�x�y�z�srrrroOs
z+BaseHTTPRequestHandler.log_date_time_stringZMonZTueZWedZThuZFriZSatZSunZJanZFebZMarZAprZMayZJunZJulZAugZSepZOctZNovZDeccCs
|jdS)zReturn the client address.r)�client_address)rrrrrn]sz%BaseHTTPRequestHandler.address_stringzHTTP/1.0cCsi|]}|j|jf|�qSr)�phraseZdescription)�.0�vrrr�
<dictcomp>lsz!BaseHTTPRequestHandler.<dictcomp>)NN)N)N)rfrf)N)+rrr�__doc__rlr9r'rr�__version__rq�DEFAULT_ERROR_MESSAGErU�DEFAULT_ERROR_CONTENT_TYPErYr r<r8rHrIr,rSr=rTr>rcr[rErhr\r]roZweekdaynamerurnr-r1r2ZHTTPMessager4r�__members__�valuesrQrrrrr�s>fg%
5



	c@s|eZdZdZdeZdd�Zdd�Zdd�Zd	d
�Z	dd�Z
d
d�Zdd�Ze
jsZe
j�e
jj�Zejddddd��dS)raWSimple HTTP request handler with GET and HEAD commands.

    This serves files from the current directory and any of its
    subdirectories.  The MIME type for files is determined by
    calling the .guess_type() method.

    The GET and HEAD requests are identical except that the HEAD
    request omits the actual contents of the file.

    zSimpleHTTP/c
Cs.|j�}|r*z|j||j�Wd|j�XdS)zServe a GET request.N)�	send_head�copyfilerCr)r�frrr�do_GET�s
zSimpleHTTPRequestHandler.do_GETcCs|j�}|r|j�dS)zServe a HEAD request.N)r�r)rr�rrr�do_HEAD�sz SimpleHTTPRequestHandler.do_HEADc	Csx|j|j�}d}tjj|�r�tjj|j�}|jjd�s�|jt	j
�|d|d|dd|d|df}tjj|�}|jd|�|j
�dSx6dD]$}tjj||�}tjj|�r�|}Pq�W|j|�S|j|�}yt|d�}Wn$tk
�r|jt	jd�dSXyZ|jt	j�|jd
|�tj|j��}|jdt|d��|jd|j|j��|j
�|S|j��YnXdS)a{Common code for GET and HEAD commands.

        This sends the response code and MIME headers.

        Return value is either a file object (which has to be copied
        to the outputfile by the caller unless the command was HEAD,
        and must be closed by the caller under all circumstances), or
        None, in which case the caller has nothing further to do.

        Nrrrrr�ZLocation�
index.html�	index.htm�rbzFile not foundzContent-typezContent-Length�z
Last-Modified)r�r�)�translate_pathr.�os�isdir�urllib�parseZurlsplit�endswithrSrZMOVED_PERMANENTLYZ
urlunsplitrTr>re�exists�list_directory�
guess_type�open�OSErrorr,�	NOT_FOUND�OK�fstat�filenor#r]�st_mtimer)	rr.r��partsZ	new_partsZnew_url�indexZctypeZfsrrrr��sF


z"SimpleHTTPRequestHandler.send_headc
Cs�ytj|�}Wn"tk
r0|jtjd�dSX|jdd�d�g}ytjj	|j
dd�}Wn tk
r|tjj	|�}YnXtj
|dd	�}tj�}d
|}|jd�|jd�|jd
|�|jd|�|jd|�|jd�x~|D]v}tj
j||�}|}	}
tj
j|��r"|d}	|d}
tj
j|��r8|d}	|jdtjj|
dd�tj
|	dd	�f�q�W|jd�dj|�j|d�}tj�}|j|�|jd�|jtj�|jdd|�|jdtt|���|j�|S)z�Helper to produce a directory listing (absent index.html).

        Return value is either a file object, or None (indicating an
        error).  In either case, the headers are sent, making the
        interface the same as for send_head().

        zNo permission to list directoryNcSs|j�S)N)r7)�arrr�<lambda>�sz9SimpleHTTPRequestHandler.list_directory.<locals>.<lambda>)�key�
surrogatepass)�errorsF)rLzDirectory listing for %szZ<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">z
<html>
<head>z@<meta http-equiv="Content-Type" content="text/html; charset=%s">z<title>%s</title>
</head>z<body>
<h1>%s</h1>z	<hr>
<ul>r�@z<li><a href="%s">%s</a></li>z</ul>
<hr>
</body>
</html>
�
�surrogateescaperzContent-typeztext/html; charset=%szContent-Length) r��listdirr�r,rr��sortr�r��unquoter.�UnicodeDecodeErrorrVrWrl�getfilesystemencodingr`rer��islinkrLrX�io�BytesIOrZ�seekrSr�rTr#r(r>)
rr.�list�rZdisplaypath�enc�title�name�fullnameZdisplaynameZlinknameZencodedr�rrrr��s\







z'SimpleHTTPRequestHandler.list_directorycCs�|jdd�d}|jdd�d}|j�jd�}ytjj|dd�}Wn tk
rbtjj|�}YnXtj|�}|jd�}t	d|�}t
j�}x8|D]0}t
jj
|�s�|t
jt
jfkr�q�t
jj||�}q�W|r�|d7}|S)	z�Translate a /-separated PATH to the local filename syntax.

        Components that mean special things to the local file system
        (e.g. drive or directory names) are ignored.  (XXX They should
        probably be diagnosed.)

        �?rr�#rr�)r�N)r'r%r�r�r�r�r��	posixpath�normpath�filterr��getcwdr.�dirname�curdir�pardirre)rr.Ztrailing_slashr:Zwordrrrr��s$	



z'SimpleHTTPRequestHandler.translate_pathcCstj||�dS)a�Copy all data between two file objects.

        The SOURCE argument is a file object open for reading
        (or anything with a read() method) and the DESTINATION
        argument is a file object open for writing (or
        anything with a write() method).

        The only reason for overriding this would be to change
        the block size or perhaps to replace newlines by CRLF
        -- note however that this the default server uses this
        to copy binary data as well.

        N)�shutilZcopyfileobj)r�sourceZ
outputfilerrrr�sz!SimpleHTTPRequestHandler.copyfilecCsLtj|�\}}||jkr"|j|S|j�}||jkr>|j|S|jdSdS)a�Guess the type of a file.

        Argument is a PATH (a filename).

        Return value is a string of the form type/subtype,
        usable for a MIME Content-type header.

        The default implementation looks the file's extension
        up in the table self.extensions_map, using application/octet-stream
        as a default; however it would be permissible (if
        slow) to look inside the data to make a better guess.

        rN)r��splitext�extensions_mapr7)rr.�baseZextrrrr�)s



z#SimpleHTTPRequestHandler.guess_typezapplication/octet-streamz
text/plain)rz.pyz.cz.hN)rrrrr�rqr�r�r�r�r�r�r��	mimetypesZinitedZinitZ	types_map�copyr��updaterrrrrrs"	1:
c	Cs�|jd�\}}}tjj|�}|jd�}g}x<|dd�D],}|dkrN|j�q8|r8|dkr8|j|�q8W|r�|j�}|r�|dkr�|j�d}q�|dkr�d}nd}|r�dj||f�}ddj|�|f}dj|�}|S)	a�
    Given a URL path, remove extra '/'s and '.' path elements and collapse
    any '..' references and returns a collapsed path.

    Implements something akin to RFC-2396 5.2 step 6 to parse relative paths.
    The utility of this function is limited to is_cgi method and helps
    preventing some security attacks.

    Returns: The reconstituted URL, which will always start with a '/'.

    Raises: IndexError if too many '..' occur within the path.

    r�rNrz..rr���)�	partitionr�r�r�r'�popr`re)	r.�_�query�
path_partsZ
head_parts�partZ	tail_partZ	splitpath�collapsed_pathrrr�_url_collapse_pathNs.


r�cCsptrtSyddl}Wntk
r(dSXy|jd�daWn.tk
rjdtdd�|j�D��aYnXtS)	z$Internal routine to get nobody's uidrNr�nobodyrcss|]}|dVqdS)rNr)r|rvrrr�	<genexpr>�sznobody_uid.<locals>.<genexpr>r�)r��pwd�ImportError�getpwnamrR�maxZgetpwall)r�rrr�
nobody_uid�s r�cCstj|tj�S)zTest for executable file.)r��access�X_OK)r.rrr�
executable�sr�c@sVeZdZdZeed�ZdZdd�Zdd�Z	dd	�Z
d
dgZdd
�Zdd�Z
dd�ZdS)rz�Complete HTTP server with GET, HEAD and POST commands.

    GET and HEAD also support running CGI scripts.

    The POST command is *only* implemented for CGI scripts.

    �forkrcCs$|j�r|j�n|jtjd�dS)zRServe a POST request.

        This is only implemented for CGI scripts.

        zCan only POST to CGI scriptsN)�is_cgi�run_cgir,rrA)rrrr�do_POST�s

zCGIHTTPRequestHandler.do_POSTcCs|j�r|j�Stj|�SdS)z-Version of send_head that support CGI scriptsN)r�r�rr�)rrrrr��szCGIHTTPRequestHandler.send_headcCsPt|j�}|jdd�}|d|�||dd�}}||jkrL||f|_dSdS)a3Test whether self.path corresponds to a CGI script.

        Returns True and updates the cgi_info attribute to the tuple
        (dir, rest) if self.path requires running a CGI script.
        Returns False otherwise.

        If any exception is raised, the caller should assume that
        self.path was rejected as invalid and act accordingly.

        The default implementation tests whether the normalized url
        path begins with one of the strings in self.cgi_directories
        (and the next character is a '/' or the end of the string).

        rrNTF)r�r.�find�cgi_directories�cgi_info)rr�Zdir_sep�head�tailrrrr��s


zCGIHTTPRequestHandler.is_cgiz/cgi-binz/htbincCst|�S)z1Test whether argument path is an executable file.)r�)rr.rrr�
is_executable�sz#CGIHTTPRequestHandler.is_executablecCstjj|�\}}|j�dkS)z.Test whether argument path is a Python script.�.py�.pyw)r�r�)r�r.r�r7)rr.r�r�rrr�	is_python�szCGIHTTPRequestHandler.is_pythonc)Cs�|j\}}|d|}|jdt|�d�}x`|dkr�|d|�}||dd�}|j|�}tjj|�r�||}}|jdt|�d�}q,Pq,W|jd�\}}}	|jd�}|dkr�|d|�||d�}
}n
|d}
}|d|
}|j|�}tjj|��s|j	t
jd|�dStjj|��s2|j	t
j
d|�dS|j|�}
|j�sL|
�rn|j|��sn|j	t
j
d	|�dStjtj�}|j�|d
<|jj|d<d|d
<|j|d<t|jj�|d<|j|d<tjj|�}||d<|j|�|d<||d<|	�r�|	|d<|jd|d<|jj d�}|�r�|j!�}t|�dk�r�ddl"}ddl#}|d|d<|dj$�dk�r�y"|dj%d�}|j&|�j'd�}Wn|j(t)fk
�r�Yn&X|j!d�}t|�dk�r�|d|d<|jj d�dk�r�|jj*�|d<n|jd|d<|jj d�}|�r||d <|jj d!�}|�r"||d"<g}xN|jj+d#�D]>}|dd�d$k�rZ|j,|j-��n||d%d�j!d&�}�q4Wd&j.|�|d'<|jj d(�}|�r�||d)<t/d|jj0d*g��}d+j.|�}|�r�||d,<xd=D]}|j1|d��q�W|j2t
j3d.�|j4�|	j5d/d0�}|j�r.|
g}d1|k�r*|j,|�t6�}|j7j8�tj9�}|dk�r�tj:|d�\}}x0t;j;|j<gggd�d�r�|j<j=d��s^P�q^W|�r�|j>d2|�dSy\ytj?|�Wnt@k
�r�YnXtjA|j<jB�d�tjA|j7jB�d�tjC|||�Wn(|jjD|jE|j�tjFd3�YnX�n�ddlG} |g}!|j|��r�tHjI}"|"j$�jJd4��rv|"dd>�|"d?d�}"|"d7g|!}!d1|	k�r�|!j,|	�|jKd8| jL|!��ytM|�}#WntNtOfk
�r�d}#YnX| jP|!| jQ| jQ| jQ|d9�}$|jj$�d:k�r|#dk�r|j<j=|#�}%nd}%x4t;j;|j<jRgggd�d�rN|j<jRjSd��sP�qW|$jT|%�\}&}'|j7jU|&�|'�r||j>d;|'�|$jVjW�|$jXjW�|$jY}(|(�r�|j>d2|(�n
|jKd<�dS)@zExecute a CGI script.rrrNr�rzNo such CGI script (%r)z#CGI script is not a plain file (%r)z!CGI script is not executable (%r)ZSERVER_SOFTWAREZSERVER_NAMEzCGI/1.1ZGATEWAY_INTERFACEZSERVER_PROTOCOLZSERVER_PORTZREQUEST_METHODZ	PATH_INFOZPATH_TRANSLATEDZSCRIPT_NAME�QUERY_STRINGZREMOTE_ADDR�
authorizationrZ	AUTH_TYPEZbasic�ascii�:ZREMOTE_USERzcontent-typeZCONTENT_TYPEzcontent-length�CONTENT_LENGTH�referer�HTTP_REFERER�acceptz	

 ��,ZHTTP_ACCEPTz
user-agent�HTTP_USER_AGENTZcookiez, �HTTP_COOKIE�REMOTE_HOSTzScript output follows�+rp�=zCGI script exit status %#x�zw.exerr�z-uzcommand: %s)�stdin�stdoutrm�envZpostz%szCGI script exited OK)r�r�r�r�r�r�������)Zr�r�r(r�r�r.r�r�r�r,rr��isfileZ	FORBIDDENr��	have_forkr�r��deepcopy�environr\Zserverrr-r#rrr�r�r�rzr5r6r'�base64�binasciir7rXZdecodebytes�decode�Error�UnicodeErrorZget_content_typeZgetallmatchingheadersr`�striprer�Zget_all�
setdefaultrSr�rcrPr�rCrDr��waitpid�selectr3�readrE�setuidr��dup2r��execveZhandle_errorZrequest�_exit�
subprocessrlr�r�rhZlist2cmdliner*�	TypeErrorr)�Popen�PIPEZ_sockZrecvZcommunicaterZrmrr��
returncode))r�dir�restr.�iZnextdirZnextrestZ	scriptdirr�r�ZscriptZ
scriptnameZ
scriptfileZispyr�Zuqrestr�rrZlengthr�r��lineZua�coZ
cookie_str�kZ
decoded_queryrkr��pid�stsrZcmdlineZinterp�nbytes�p�datar�rmZstatusrrrr��s4

























zCGIHTTPRequestHandler.run_cgiN)rrrrr@r�r�Zrbufsizer�r�r�r�r�r�r�rrrrr�s
zHTTP/1.0i@rc	Cs�||f}||_|||��b}|jj�}d}t|j|d|dd��y|j�Wn&tk
rttd�tjd�YnXWdQRXdS)zmTest the HTTP request handler class.

    This runs an HTTP server on port 8000 (or the port argument).

    z>Serving HTTP on {host} port {port} (http://{host}:{port}/) ...rr)rrz&
Keyboard interrupt received, exiting.N)	r-r
Zgetsockname�printrjZ
serve_forever�KeyboardInterruptrl�exit)	�HandlerClassZServerClassZprotocolr�bindrZhttpdZsaZ
serve_messagerrr�test�s
r%�__main__z--cgi�
store_truezRun as CGI Server)�action�helpz--bindz-bZADDRESSz8Specify alternate bind address [default: all interfaces])�default�metavarr)rZstorer�z&Specify alternate port [default: 8000])r(r*�type�nargsr))r#rr$)/rr��__all__Zemail.utilsrtrVZhttp.clientr1r�r�r�r�r
r�r
r	rlrsZurllib.parser�r��argparserr�r�r
rZStreamRequestHandlerrrr�r�r�r�rr%r�ArgumentParser�parser�add_argumentr*�
parse_argsrkZcgiZ
handler_classrr$rrrr�<module> sj3g]0
cookies.cpython-36.pyc000064400000037432151732672750010656 0ustar003


 \�S�
@s|dZddlZddlZdddgZdjZdjZdjZd	d
�ZGdd�de	�Z
ejejdZ
e
d
Zdd�eed��eeee��D�Zejed�ded�di�ejdeje
��jZdd�Zejd�Zejd�Zdd�Zddddd d!d"gZdd#d$d%d&d'd(d)d*d+d,d-d.g
Zdeefd/d0�ZGd1d2�d2e �Z!d3Z"e"d4Z#ejd5e"d6e#d7ej$ej%B�Z&Gd8d�de �Z'Gd9d�de'�Z(dS):a.

Here's a sample session to show how to use this module.
At the moment, this is the only documentation.

The Basics
----------

Importing is easy...

   >>> from http import cookies

Most of the time you start by creating a cookie.

   >>> C = cookies.SimpleCookie()

Once you've created your Cookie, you can add values just as if it were
a dictionary.

   >>> C = cookies.SimpleCookie()
   >>> C["fig"] = "newton"
   >>> C["sugar"] = "wafer"
   >>> C.output()
   'Set-Cookie: fig=newton\r\nSet-Cookie: sugar=wafer'

Notice that the printable representation of a Cookie is the
appropriate format for a Set-Cookie: header.  This is the
default behavior.  You can change the header and printed
attributes by using the .output() function

   >>> C = cookies.SimpleCookie()
   >>> C["rocky"] = "road"
   >>> C["rocky"]["path"] = "/cookie"
   >>> print(C.output(header="Cookie:"))
   Cookie: rocky=road; Path=/cookie
   >>> print(C.output(attrs=[], header="Cookie:"))
   Cookie: rocky=road

The load() method of a Cookie extracts cookies from a string.  In a
CGI script, you would use this method to extract the cookies from the
HTTP_COOKIE environment variable.

   >>> C = cookies.SimpleCookie()
   >>> C.load("chips=ahoy; vienna=finger")
   >>> C.output()
   'Set-Cookie: chips=ahoy\r\nSet-Cookie: vienna=finger'

The load() method is darn-tootin smart about identifying cookies
within a string.  Escaped quotation marks, nested semicolons, and other
such trickeries do not confuse it.

   >>> C = cookies.SimpleCookie()
   >>> C.load('keebler="E=everybody; L=\\"Loves\\"; fudge=\\012;";')
   >>> print(C)
   Set-Cookie: keebler="E=everybody; L=\"Loves\"; fudge=\012;"

Each element of the Cookie also supports all of the RFC 2109
Cookie attributes.  Here's an example which sets the Path
attribute.

   >>> C = cookies.SimpleCookie()
   >>> C["oreo"] = "doublestuff"
   >>> C["oreo"]["path"] = "/"
   >>> print(C)
   Set-Cookie: oreo=doublestuff; Path=/

Each dictionary element has a 'value' attribute, which gives you
back the value associated with the key.

   >>> C = cookies.SimpleCookie()
   >>> C["twix"] = "none for you"
   >>> C["twix"].value
   'none for you'

The SimpleCookie expects that all values should be standard strings.
Just to be sure, SimpleCookie invokes the str() builtin to convert
the value to a string, when the values are set dictionary-style.

   >>> C = cookies.SimpleCookie()
   >>> C["number"] = 7
   >>> C["string"] = "seven"
   >>> C["number"].value
   '7'
   >>> C["string"].value
   'seven'
   >>> C.output()
   'Set-Cookie: number=7\r\nSet-Cookie: string=seven'

Finis.
�N�CookieError�
BaseCookie�SimpleCookie�z; � cCs$ddl}d|}|j|tdd�dS)NrzvThe .%s setter is deprecated. The attribute will be read-only in future releases. Please use the set() method instead.�)�
stacklevel)�warnings�warn�DeprecationWarning)�setterr	�msg�r�$/usr/lib64/python3.6/http/cookies.py�_warn_deprecated_setter�src@seZdZdS)rN)�__name__�
__module__�__qualname__rrrrr�sz!#$%&'*+-.^_`|~:z
 ()/<=>?@[]{}cCsi|]}d||�qS)z\%03or)�.0�nrrr�
<dictcomp>�sr��"z\"�\z\\z[%s]+cCs*|dkst|�r|Sd|jt�dSdS)z�Quote a string for use in a cookie header.

    If the string does not need to be double-quoted, then just return the
    string.  Otherwise, surround the string in doublequotes and quote
    (with a \) special characters.
    Nr)�
_is_legal_key�	translate�_Translator)�strrrr�_quote�srz\\[0-3][0-7][0-7]z[\\].cCsT|dkst|�dkr|S|ddks0|ddkr4|S|dd�}d}t|�}g}x�d|kod|kn�rJtj||�}tj||�}|r�|r�|j||d��Pd	}}|r�|jd�}|r�|jd�}|o�|s�||k�r
|j|||��|j||d�|d}qR|j|||��|jtt||d|d�d���|d}qRWt|�S)
N�rr������r#r#)	�len�
_OctalPatt�search�
_QuotePatt�append�start�chr�int�	_nulljoin)r�ir�resZo_matchZq_match�j�krrr�_unquote�s6


$r1ZMonZTueZWedZThuZFriZSatZSunZJanZFebZMarZAprZMayZJunZJulZAugZSepZOctZNovZDecc	CsRddlm}m}|�}|||�\	}}}}	}
}}}
}d|||||||	|
|fS)Nr)�gmtime�timez#%s, %02d %3s %4d %02d:%02d:%02d GMT)r3r2)ZfutureZweekdaynameZ	monthnamer2r3ZnowZyearZmonthZdayZhhZmmZssZwd�y�zrrr�_getdate�s
r6c	@seZdZdZdddddddd	d
�ZddhZd
d�Zedd��Zej	dd��Zedd��Z
e
j	dd��Z
edd��Zej	dd��Zdd�Zd4dd�Z
dd�ZejZdd �Zd!d"�Zd#d$�Zefd%d&�Zd'd(�Zd)d*�Zd5d,d-�ZeZd.d/�Zd6d0d1�Zd7d2d3�ZdS)8�Morsela�A class to hold ONE (key, value) pair.

    In a cookie, each such pair may have several attributes, so this class is
    used to keep the attributes associated with the appropriate key,value pair.
    This class also includes a coded_value attribute, which is used to hold
    the network representation of the value.  This is most useful when Python
    objects are pickled for network transit.
    �expiresZPath�CommentZDomainzMax-AgeZSecureZHttpOnlyZVersion)r8�path�commentZdomainzmax-age�secure�httponly�versionr<r=cCs4d|_|_|_x|jD]}tj||d�qWdS)Nr)�_key�_value�_coded_value�	_reserved�dict�__setitem__)�self�keyrrr�__init__&szMorsel.__init__cCs|jS)N)r?)rErrrrF.sz
Morsel.keycCstd�||_dS)NrF)rr?)rErFrrrrF2scCs|jS)N)r@)rErrr�value7szMorsel.valuecCstd�||_dS)NrH)rr@)rErHrrrrH;scCs|jS)N)rA)rErrr�coded_value@szMorsel.coded_valuecCstd�||_dS)NrI)rrA)rErIrrrrIDscCs2|j�}||jkr td|f��tj|||�dS)NzInvalid attribute %r)�lowerrBrrCrD)rE�K�VrrrrDIs
zMorsel.__setitem__NcCs.|j�}||jkr td|f��tj|||�S)NzInvalid attribute %r)rJrBrrC�
setdefault)rErF�valrrrrMOs
zMorsel.setdefaultcCs>t|t�stStj||�o<|j|jko<|j|jko<|j|jkS)N)�
isinstancer7�NotImplementedrC�__eq__r@r?rA)rE�morselrrrrQUs
z
Morsel.__eq__cCs$t�}tj||�|jj|j�|S)N)r7rC�update�__dict__)rErRrrr�copy_szMorsel.copycCsVi}x@t|�j�D]0\}}|j�}||jkr:td|f��|||<qWtj||�dS)NzInvalid attribute %r)rC�itemsrJrBrrS)rE�values�datarFrNrrrrSes
z
Morsel.updatecCs|j�|jkS)N)rJrB)rErKrrr�
isReservedKeynszMorsel.isReservedKeycCsh|tkr ddl}|jdtdd�|j�|jkr<td|f��t|�sRtd|f��||_||_	||_
dS)NrzSLegalChars parameter is deprecated, ignored and will be removed in future versions.r)rz Attempt to set a reserved key %rzIllegal key %r)�_LegalCharsr	r
rrJrBrrr?r@rA)rErFrNZ	coded_valZ
LegalCharsr	rrr�setqsz
Morsel.setcCs|j|j|jd�S)N)rFrHrI)r?r@rA)rErrr�__getstate__�szMorsel.__getstate__cCs"|d|_|d|_|d|_dS)NrFrHrI)r?r@rA)rE�staterrr�__setstate__�s

zMorsel.__setstate__�Set-Cookie:cCsd||j|�fS)Nz%s %s)�OutputString)rE�attrs�headerrrr�output�sz
Morsel.outputcCsd|jj|j�fS)Nz<%s: %s>)�	__class__rr`)rErrr�__repr__�szMorsel.__repr__cCsd|j|�jdd�S)Nz�
        <script type="text/javascript">
        <!-- begin hiding
        document.cookie = "%s";
        // end hiding -->
        </script>
        rz\")r`�replace)rErarrr�	js_output�szMorsel.js_outputcCs(g}|j}|d|j|jf�|dkr,|j}t|j��}x�|D]�\}}|dkrPq>||krZq>|dkr�t|t�r�|d|j|t|�f�q>|dkr�t|t�r�|d|j||f�q>|dkr�t|t	�r�|d|j|t
|�f�q>||jk�r|�r|t	|j|��q>|d|j||f�q>Wt|�S)Nz%s=%srr8zmax-agez%s=%dr;)
r(rFrIrB�sortedrVrOr+r6rr�_flags�_semispacejoin)rEra�resultr(rVrFrHrrrr`�s,zMorsel.OutputString)N)Nr_)N)N)rrr�__doc__rBrirG�propertyrFrrHrIrDrMrQ�object�__ne__rUrSrYrZr[r\r^rc�__str__rergr`rrrrr7s@
	


r7z,\w\d!#%&'~_`><@,:/\$\*\+\-\.\^\|\)\(\?\}\{\=z\[\]z�
    \s*                            # Optional whitespace at start of cookie
    (?P<key>                       # Start of group 'key'
    [a	]+?   # Any word of at least one letter
    )                              # End of group 'key'
    (                              # Optional group: there may not be a value.
    \s*=\s*                          # Equal Sign
    (?P<val>                         # Start of group 'val'
    "(?:[^\\"]|\\.)*"                  # Any doublequoted string
    |                                  # or
    \w{3},\s[\w\d\s-]{9,11}\s[\d:]{8}\sGMT  # Special case for "expires" attr
    |                                  # or
    [a-]*      # Any word or empty string
    )                                # End of group 'val'
    )?                             # End of optional value group
    \s*                            # Any number of spaces.
    (\s+|;|$)                      # Ending either at space, semicolon, or EOS.
    c@sneZdZdZdd�Zdd�Zddd�Zd	d
�Zdd�Zddd�Z	e	Z
dd�Zddd�Zdd�Z
efdd�ZdS)rz'A container class for a set of Morsels.cCs||fS)a
real_value, coded_value = value_decode(STRING)
        Called prior to setting a cookie's value from the network
        representation.  The VALUE is the value read from HTTP
        header.
        Override this function to modify the behavior of cookies.
        r)rErNrrr�value_decode�szBaseCookie.value_decodecCst|�}||fS)z�real_value, coded_value = value_encode(VALUE)
        Called prior to setting a cookie's value from the dictionary
        representation.  The VALUE is the value being assigned.
        Override this function to modify the behavior of cookies.
        )r)rErN�strvalrrr�value_encode�szBaseCookie.value_encodeNcCs|r|j|�dS)N)�load)rE�inputrrrrG�szBaseCookie.__init__cCs.|j|t��}|j|||�tj|||�dS)z+Private method for setting a cookie's valueN)�getr7r[rCrD)rErFZ
real_valuerI�MrrrZ__set�szBaseCookie.__setcCs:t|t�rtj|||�n|j|�\}}|j|||�dS)zDictionary style assignment.N)rOr7rCrDrs�_BaseCookie__set)rErFrH�rval�cvalrrrrDs
zBaseCookie.__setitem__�Set-Cookie:�
cCs>g}t|j��}x"|D]\}}|j|j||��qW|j|�S)z"Return a string suitable for HTTP.)rhrVr(rc�join)rErarb�seprkrVrFrHrrrrc
s
zBaseCookie.outputcCsNg}t|j��}x(|D] \}}|jd|t|j�f�qWd|jjt|�fS)Nz%s=%sz<%s: %s>)rhrVr(�reprrHrdr�
_spacejoin)rE�lrVrFrHrrrres
zBaseCookie.__repr__cCs:g}t|j��}x |D]\}}|j|j|��qWt|�S)z(Return a string suitable for JavaScript.)rhrVr(rgr,)rErarkrVrFrHrrrrgs
zBaseCookie.js_outputcCs8t|t�r|j|�nx|j�D]\}}|||<q WdS)z�Load cookies from a string (presumably HTTP_COOKIE) or
        from a dictionary.  Loading cookies from a dictionary 'd'
        is equivalent to calling:
            map(Cookie.__setitem__, d.keys(), d.values())
        N)rOr�_BaseCookie__parse_stringrV)rEZrawdatarFrHrrrrt&s

zBaseCookie.loadcCs�d}t|�}g}d}d}d}�xd|ko2|kn�r|j||�}	|	sLP|	jd�|	jd�}
}|	jd�}|
ddkr�|s~q |j||
dd�|f�q |
j�tjkr�|s�dS|dkr�|
j�tjkr�|j||
df�q�dSn|j||
t	|�f�q |dk	�r|j||
|j
|�f�d}q dSq Wd}xb|D]Z\}
}
}|
|k�rV|dk	�sLt�|||
<n,|
|k�sdt�|\}}|j|
||�||
}�q*WdS)	NrFr rrFrN�$T)
r$�match�group�endr(rJr7rBrir1rq�AssertionErrorrx)rErZpattr-rZparsed_itemsZmorsel_seenZTYPE_ATTRIBUTEZ
TYPE_KEYVALUEr�rFrHrw�tpryrzrrrZ__parse_string4sJ



zBaseCookie.__parse_string)N)Nr{r|)N)rrrrlrqrsrGrxrDrcrprergrt�_CookiePatternr�rrrrr�s		
	

c@s eZdZdZdd�Zdd�ZdS)rz�
    SimpleCookie supports strings as cookie values.  When setting
    the value using the dictionary assignment notation, SimpleCookie
    calls the builtin str() to convert the value to a string.  Values
    received from HTTP are kept as strings.
    cCst|�|fS)N)r1)rErNrrrrqxszSimpleCookie.value_decodecCst|�}|t|�fS)N)rr)rErNrrrrrrs{szSimpleCookie.value_encodeN)rrrrlrqrsrrrrrqs))rl�re�string�__all__r}r,rjr�r�	ExceptionrZ
ascii_lettersZdigitsrZZ_UnescapedCharsr[�range�map�ordrrS�compile�escape�	fullmatchrrr%r'r1Z_weekdaynameZ
_monthnamer6rCr7Z_LegalKeyCharsZ_LegalValueChars�ASCII�VERBOSEr�rrrrrr�<module>sF
	

2J
client.cpython-36.opt-2.pyc000064400000062146151732672750011440 0ustar003

���i*��@snddlZddlZddlZddlZddlZddlZddlZddlZddl	m
Z
ddddddd	d
ddd
dddddddgZdZdZ
dZdZdZdZe�jejj�dd�ejjj�D�ZdZdZdZejd �jZejd!�jZejd"�Z ejd#�Z!d$d%d&hZ"dBd(d)�Z#Gd*d+�d+ej$j%�Z&d,d-�Z'e&fd.d/�Z(Gd0d�dej)�Z*Gd1d�d�Z+yddl,Z,Wne-k
�rhYnXGd2d3�d3e+�Z.ej/d3�Gd4d�de0�Z1Gd5d�de1�Z2Gd6d�de1�Z3Gd7d�de1�Z4Gd8d�de1�Z5Gd9d	�d	e1�Z6Gd:d
�d
e1�Z7Gd;d�de1�Z8Gd<d
�d
e8�Z9Gd=d�de8�Z:Gd>d�de8�Z;Gd?d�de1�Z<Gd@d�de1�Z=GdAd�de>e<�Z?e1Z@dS)C�N)�urlsplit�HTTPResponse�HTTPConnection�
HTTPException�NotConnected�UnknownProtocol�UnknownTransferEncoding�UnimplementedFileMode�IncompleteRead�
InvalidURL�ImproperConnectionState�CannotSendRequest�CannotSendHeader�ResponseNotReady�
BadStatusLine�LineTooLong�RemoteDisconnected�error�	responses�Pi�ZUNKNOWNZIdlezRequest-startedzRequest-sentcCsi|]}|j|�qS�)�phrase)�.0�vrr�#/usr/lib64/python3.6/http/client.py�
<dictcomp>ksrii�ds[^:\s][^:\r\n]*s\n(?![ \t])|\r(?![ \t\n])z[- ]z[-]ZPATCHZPOSTZPUT�datacCsfy
|jd�Stk
r`}z:t|j|j|j|jd|j�||j|j�|f�d�WYdd}~XnXdS)Nzlatin-1z`%s (%.20r) is not valid Latin-1. Use %s.encode('utf-8') if you want to send it encoded in UTF-8.)�encode�UnicodeEncodeError�encoding�object�start�end�title)r�name�errrrr�_encode�s
r'c@seZdZdd�ZdS)�HTTPMessagecCsn|j�d}t|�}g}d}xL|j�D]@}|d|�j�|krDd}n|dd�j�sXd}|r&|j|�q&W|S)N�:r�)�lower�len�keys�isspace�append)�selfr%�nZlstZhit�linerrr�getallmatchingheaders�s
z!HTTPMessage.getallmatchingheadersN)�__name__�
__module__�__qualname__r3rrrrr(�sr(cCs\g}xR|jtd�}t|�tkr(td��|j|�t|�tkrJtdt��|dkrPqW|S)Nr*zheader linezgot more than %d headers�
�
�)r7r8r9)�readline�_MAXLINEr,rr/�_MAXHEADERSr)�fp�headersr2rrr�
_read_headers�s
r?cCs,t|�}dj|�jd�}tjj|d�j|�S)Nr9z
iso-8859-1)�_class)r?�join�decode�email�parserZParserZparsestr)r=r@r>Zhstringrrr�
parse_headers�s
rEcseZdZd@dd�Zdd�Zdd�Zd	d
�Zdd�Z�fd
d�Z�fdd�Z	dd�Z
dd�ZdAdd�Zdd�Z
dd�Zdd�Zdd�Zdd �Zd!d"�Zd#d$�Zd%d&�ZdCd(d)�ZdEd*d+�ZdG�fd,d-�	Zd.d/�Zd0d1�Zd2d3�ZdHd4d5�Zd6d7�Zd8d9�Zd:d;�Zd<d=�Zd>d?�Z �Z!S)IrrNcCsR|jd�|_||_||_d|_|_t|_t|_t|_	t|_
t|_t|_t|_
dS)N�rb)�makefiler=�
debuglevel�_methodr>�msg�_UNKNOWN�version�status�reason�chunked�
chunk_left�length�
will_close)r0�sockrH�method�urlrrr�__init__�szHTTPResponse.__init__cCst|jjtd�d�}t|�tkr*td��|jdkrBtdt|��|sNt	d��y|j
dd�\}}}WnFtk
r�y|j
dd�\}}d}Wntk
r�d}YnXYnX|jd	�s�|j
�t|��y$t|�}|d
ks�|dkr�t|��Wntk
�rt|��YnX|||fS)Nr*z
iso-8859-1zstatus linerzreply:z-Remote end closed connection without response��zHTTP/ri�)�strr=r:r;r,rrH�print�reprr�split�
ValueError�
startswith�_close_connr�int)r0r2rLrMrNrrr�_read_statuss2

zHTTPResponse._read_statuscCs�|jdk	rdSx<|j�\}}}|tkr(Pt|j�}|jdkrFtd|�~qW||_|_|j	�|_
|dkrrd|_n|jd�r�d|_nt
|��t|j�|_|_|jdkr�x&|jD]}td|d	|jj|��q�W|jjd
�}|r�|j�dkr�d|_d|_nd
|_|j�|_d|_|jjd�}|jjd
�}|�rx|j�rxyt|�|_Wntk
�rbd|_YnX|jdk�r~d|_nd|_|tk�s�|tk�s�d|k�o�dkn�s�|jdk�r�d|_|j�r�|j�r�|jdk�r�d|_dS)Nrzheaders:�HTTP/1.0�HTTP/0.9�
zHTTP/1.�zheader:r)ztransfer-encodingrOTFzcontent-lengthr���HEAD)rbrc)r>raZCONTINUEr?r=rHrZ�coderM�striprNrLr^rrErJ�getr+rOrP�_check_closerRrQr`r]Z
NO_CONTENTZNOT_MODIFIEDrI)r0rLrMrNZskipped_headers�hdrZtr_encrQrrr�begin9s\









zHTTPResponse.begincCs�|jjd�}|jdkr:|jjd�}|r6d|j�kr6dSdS|jjd�rJdS|r^d|j�kr^dS|jjd�}|r~d|j�kr~dSdS)NZ
connectionre�closeTFz
keep-alivezproxy-connection)r>rjrLr+)r0ZconnZpconnrrrrk�s
zHTTPResponse._check_closecCs|j}d|_|j�dS)N)r=rn)r0r=rrrr_�szHTTPResponse._close_connc
s$zt�j�Wd|jr|j�XdS)N)�superrnr=r_)r0)�	__class__rrrn�szHTTPResponse.closecst�j�|jr|jj�dS)N)ro�flushr=)r0)rprrrq�s
zHTTPResponse.flushcCsdS)NTr)r0rrr�readable�szHTTPResponse.readablecCs
|jdkS)N)r=)r0rrr�isclosed�szHTTPResponse.isclosedcCs�|jdkrdS|jdkr$|j�dS|dk	rRt|�}|j|�}t|�d|�j�S|jr`|j�S|j	dkrv|jj
�}n6y|j|j	�}Wntk
r�|j��YnXd|_	|j�|SdS)Nr9rgr)
r=rIr_�	bytearray�readinto�
memoryview�tobytesrO�_readall_chunkedrQ�read�
_safe_readr
)r0�amt�br1�srrrry�s*



zHTTPResponse.readcCs�|jdkrdS|jdkr$|j�dS|jr4|j|�S|jdk	r^t|�|jkr^t|�d|j�}|jj|�}|r~|r~|j�n&|jdk	r�|j|8_|js�|j�|S)Nrrg)	r=rIr_rO�_readinto_chunkedrQr,rvru)r0r|r1rrrru�s$






zHTTPResponse.readintocCsp|jjtd�}t|�tkr$td��|jd�}|dkrB|d|�}y
t|d�Stk
rj|j��YnXdS)Nr*z
chunk size�;r�)	r=r:r;r,r�findr`r]r_)r0r2�irrr�_read_next_chunk_size
s

z"HTTPResponse._read_next_chunk_sizecCs>x8|jjtd�}t|�tkr&td��|s,P|dkrPqWdS)Nr*ztrailer line�
r8r9)r�r8r9)r=r:r;r,r)r0r2rrr�_read_and_discard_trailersz&HTTPResponse._read_and_discard_trailercCsl|j}|sh|dk	r|jd�y|j�}Wntk
rDtd��YnX|dkrb|j�|j�d}||_|S)NrWr9r)rPrzr�r]r
r�r_)r0rPrrr�_get_chunk_left(s
zHTTPResponse._get_chunk_leftcCsdg}y8x,|j�}|dkrP|j|j|��d|_qWdj|�Stk
r^tdj|���YnXdS)Nrr9)r�r/rzrPrAr
)r0�valuerPrrrrx@s

zHTTPResponse._readall_chunkedcCs�d}t|�}yvxp|j�}|dkr$|St|�|krL|j|�}|||_||S|d|�}|j|�}||d�}||7}d|_qWWn(tk
r�tt|d|����YnXdS)Nr)rvr�r,�_safe_readintorPr
�bytes)r0r|�total_bytes�mvbrPr1�temp_mvbrrrr~Ns$


zHTTPResponse._readinto_chunkedcCsXg}xH|dkrL|jjt|t��}|s4tdj|�|��|j|�|t|�8}qWdj|�S)Nrr9)r=ry�min�	MAXAMOUNTr
rAr/r,)r0r{r}�chunkrrrrzfs

zHTTPResponse._safe_readcCs�d}t|�}xt|t|�kr�tt|�kr@|dt�}|jj|�}n|jj|�}|sjtt|d|��t|���||d�}||7}qW|S)Nr)rvr,r�r=rur
r�)r0r|r�r�r�r1rrrr�}szHTTPResponse._safe_readintor*cCs�|jdks|jdkrdS|jr(|j|�S|jdk	rJ|dksD||jkrJ|j}y|jj|�}Wn*tk
r�|dkrt�|jjd�}YnX|r�|r�|j�n|jdk	r�|jt|�8_|S)Nrgr9rr�ii@)	r=rIrO�_read1_chunkedrQ�read1r]r_r,)r0r1�resultrrrr��s"



zHTTPResponse.read1cCs4|jdks|jdkrdS|jr(|j|�S|jj|�S)Nrgr9)r=rIrO�
_peek_chunked�peek)r0r1rrrr��s

zHTTPResponse.peekcs�|jdks|jdkrdS|jr*t�j|�S|jdk	rL|dksF||jkrL|j}|jj|�}|rl|rl|j�n|jdk	r�|jt|�8_|S)Nrgr9r)r=rIrOror:rQr_r,)r0�limitr�)rprrr:�s


zHTTPResponse.readlinecCsf|j�}|dks|dkrdSd|ko.|kns8|}|jj|�}|jt|�8_|sbtd��|S)Nrr9)r�r=r�rPr,r
)r0r1rPryrrrr��szHTTPResponse._read1_chunkedcCsBy|j�}Wntk
r dSX|dkr.dS|jj|�d|�S)Nr9)r�r
r=r�)r0r1rPrrrr��szHTTPResponse._peek_chunkedcCs
|jj�S)N)r=�fileno)r0rrrr��szHTTPResponse.filenocCsH|jdkrt��|jj|�p|}t|t�s6t|d�r:|Sdj|�SdS)N�__iter__z, )r>rZget_all�
isinstancerY�hasattrrA)r0r%�defaultr>rrr�	getheader�s
zHTTPResponse.getheadercCs|jdkrt��t|jj��S)N)r>r�list�items)r0rrr�
getheaders�s
zHTTPResponse.getheaderscCs|S)Nr)r0rrrr��szHTTPResponse.__iter__cCs|jS)N)r>)r0rrr�info�szHTTPResponse.infocCs|jS)N)rU)r0rrr�geturls
zHTTPResponse.geturlcCs|jS)N)rM)r0rrr�getcodeszHTTPResponse.getcode)rNN)N���)r�r�)r�r�)r�)N)"r4r5r6rVrarmrkr_rnrqrrrsryrur�r�r�rxr~rzr�r�r�r:r�r�r�r�r�r�r�r�r��
__classcell__rr)rprr�s<	
!K

 "

	

c@s�eZdZdZdZeZeZdZ	dZ
edd��Zedd��Z
d	ejd	fd
d�Zd0dd
�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zd1dd �Zd2d!d"�Zd#d$�Zd%d&�Zd3dd'�d(d)�Zd	ifdd'�d*d+�Zd,d-�Z d.d/�Z!d	S)4rrezHTTP/1.1r*rcCst|tj�S)N)r��io�
TextIOBase)�streamrrr�
_is_textIO0szHTTPConnection._is_textIOcCsd|dkr|j�tkrdSdSt|d�r*dSyt|�}|jStk
rLYnXt|t�r`t|�SdS)Nrry)	�upper�_METHODS_EXPECTING_BODYr�rv�nbytes�	TypeErrorr�rYr,)�bodyrTZmvrrr�_get_content_length6s

z"HTTPConnection._get_content_lengthNcCs\||_||_d|_g|_d|_t|_d|_d|_d|_	i|_
|j||�\|_|_
tj|_dS)N)�timeout�source_addressrS�_buffer�_HTTPConnection__response�_CS_IDLE�_HTTPConnection__staterI�_tunnel_host�_tunnel_port�_tunnel_headers�
_get_hostport�host�port�socketZcreate_connection�_create_connection)r0r�r�r�r�rrrrVVszHTTPConnection.__init__cCs<|jrtd��|j||�\|_|_|r.||_n
|jj�dS)Nz.Can't set up tunnel for established connection)rS�RuntimeErrorr�r�r�r��clear)r0r�r�r>rrr�
set_tunneliszHTTPConnection.set_tunnelcCs�|dkr�|jd�}|jd�}||kr�yt||dd��}WnHtk
r�||dd�dkrh|j}ntd||dd���YnX|d|�}n|j}|r�|ddkr�|ddkr�|dd	�}||fS)
Nr)�]r*rXznonnumeric port: '%s'r�[r�r�)�rfindr`r]�default_portr)r0r�r�r��jrrrr��s

zHTTPConnection._get_hostportcCs
||_dS)N)rH)r0�levelrrr�set_debuglevel�szHTTPConnection.set_debuglevelcCsd|j|jf}|jd�}|j|�x6|jj�D](\}}d||f}|jd�}|j|�q0W|jd�|j|j|jd�}|j	�\}}	}
|	t
jjkr�|j
�td|	|
j�f��xP|jjtd�}t|�tkr�td	��|s�P|dkr�P|jdkr�td
|j��q�WdS)NzCONNECT %s:%d HTTP/1.0
�asciiz%s: %s
zlatin-1�
)rTzTunnel connection failed: %d %sr*zheader liner8r9rzheader:)r�r8r9)r�r�r�sendr�r��response_classrSrIra�http�
HTTPStatusZOKrn�OSErrorrir=r:r;r,rrHrZrB)r0Zconnect_strZ
connect_bytes�headerr�Z
header_strZheader_bytes�responserLrh�messager2rrr�_tunnel�s2





zHTTPConnection._tunnelcCsB|j|j|jf|j|j�|_|jjtjtj	d�|j
r>|j�dS)Nr*)r�r�r�r�r�rSZ
setsockoptr�ZIPPROTO_TCPZTCP_NODELAYr�r�)r0rrr�connect�s
zHTTPConnection.connectcCsBt|_z|j}|r d|_|j�Wd|j}|r<d|_|j�XdS)N)r�r�rSrnr�)r0rSr�rrrrn�szHTTPConnection.closecCs|jdkr |jr|j�nt��|jdkr8tdt|��d}t|d�r�|jdkrXtd�|j|�}|rx|jdkrxtd�x.|j	|�}|s�P|r�|j
d�}|jj|�qzWdSy|jj|�WnNtk
�r
t
|tj�r�x*|D]}|jj|�q�Wntdt|���YnXdS)	Nrzsend:i ryzsendIng a read()ablezencoding file using iso-8859-1z
iso-8859-1z9data should be a bytes-like object or an iterable, got %r)rS�	auto_openr�rrHrZr[r�r�ryrZsendallr�r��collections�Iterable�type)r0r�	blocksizer�	datablock�drrrr��s:








zHTTPConnection.sendcCs|jj|�dS)N)r�r/)r0r}rrr�_output�szHTTPConnection._outputccsdd}|jdkrtd�|j|�}|r6|jdkr6td�x(|j|�}|sHP|rV|jd�}|Vq8WdS)Ni rzsendIng a read()ablezencoding file using iso-8859-1z
iso-8859-1)rHrZr�ryr)r0rrr�rr�rrr�_read_readable�s



zHTTPConnection._read_readableFcCs$|jjd�dj|j�}|jdd�=|j|�|dk	�r t|d�rN|j|�}nZyt|�WnFtk
r�yt|�}Wn$tk
r�tdt	|���YnXYnX|f}xZ|D]R}|s�|j
dkr�td�q�|r�|jdkr�t
|�d�d	�jd
�|d}|j|�q�W|�r |jdk�r |jd�dS)
Nr9s
ryzAmessage_body should be a bytes-like object or an iterable, got %rrzZero length chunk ignoredre�Xz
r�s0

)r9r9)r��extendrAr�r�r�rvr��iterr�rHrZ�	_http_vsnr,r)r0�message_body�encode_chunkedrJZchunksr�rrr�_send_outputs4




zHTTPConnection._send_outputc

Cs�|jr|jj�rd|_|jtkr(t|_n
t|j��|j|�||_|sJd}tj	|�}|rrt
d|�d|j��d���d|||jf}|j
|jd��|jdk�r�|�s�d}|jd	�r�t|�\}}}}}|�ry|jd�}	Wntk
r�|jd
�}	YnX|jd|	�n�|j�r|j}
|j}n|j}
|j}y|
jd�}Wn tk
�rV|
jd
�}YnX|
jd�d
k�rtd|d}||jk�r�|jd|�n|jd�}|jdd||f�|�s�|jdd�ndS)N�/z&URL can't contain control characters. z (found at least �)z%s %s %sr�rerXr�ZidnaZHostr)r�[�]z%s:%szAccept-EncodingZidentity)r�rsr�r��_CS_REQ_STARTEDr
�_validate_methodrI�!_contains_disallowed_url_pchar_re�searchr�group�
_http_vsn_strr�rr�r^rr�	putheaderr�r�r�r�r�r�rB)
r0rTrU�	skip_host�skip_accept_encoding�match�requestZnetlocZnilZ
netloc_encr�r�Zhost_encrrr�
putrequestAsV






zHTTPConnection.putrequestcCs,tj|�}|r(td|�d|j��d���dS)Nz)method can't contain control characters. z (found at least r�)�$_contains_disallowed_method_pchar_rer�r]r�)r0rTr�rrrr��s
zHTTPConnection._validate_methodcGs�|jtkrt��t|d�r$|jd�}t|�s:td|f��t|�}xht|�D]\\}}t|d�rn|jd�||<nt	|t
�r�t|�jd�||<t||�rLtd||f��qLWdj
|�}|d|}|j|�dS)Nrr�zInvalid header name %rzlatin-1zInvalid header value %rs
	s: )r�r�rr�r�_is_legal_header_namer]r��	enumerater�r`rY�_is_illegal_header_valuerAr�)r0r��valuesr�Z	one_valuer�rrrr��s"





zHTTPConnection.putheader)r�cCs*|jtkrt|_nt��|j||d�dS)N)r�)r�r��_CS_REQ_SENTrr�)r0r�r�rrr�
endheaders�s
zHTTPConnection.endheaderscCs|j|||||�dS)N)�
_send_request)r0rTrUr�r>r�rrrr��szHTTPConnection.requestcCs�tdd�|D��}i}d|kr&d|d<d|kr6d|d<|j||f|�d|kr�d	|kr�d
}|j||�}|dkr�|dk	r�|jdkr�td|�d
}|jdd�q�|jdt|��nd
}x |j�D]\}	}
|j|	|
�q�Wt|t�r�t	|d�}|j
||d�dS)Ncss|]}|j�VqdS)N)r+)r�krrr�	<genexpr>�sz/HTTPConnection._send_request.<locals>.<genexpr>r�r*r�zaccept-encodingr�zcontent-lengthztransfer-encodingFrzUnable to determine size of %rTzTransfer-EncodingrOzContent-Lengthr�)r�)�	frozensetr�r�rHrZr�rYr�r�r'r�)r0rTrUr�r>r�Zheader_namesZskipsZcontent_lengthrlr�rrrr��s0	


zHTTPConnection._send_requestcCs�|jr|jj�rd|_|jtks&|jr0t|j��|jdkrR|j|j|j|jd�}n|j|j|jd�}yLy|j	�Wnt
k
r�|j��YnXt|_|j
r�|j�n||_|S|j��YnXdS)Nr)rT)r�rsr�r�rrHr�rSrIrm�ConnectionErrorrnr�rR)r0r�rrr�getresponse)s,


zHTTPConnection.getresponse)NN)NF)FF)N)"r4r5r6r�r�rr��	HTTP_PORTr�r�rH�staticmethodr�r�r��_GLOBAL_DEFAULT_TIMEOUTrVr�r�r�r�r�rnr�r�r�r�r�r�r�r�r�r�r�rrrrr&s< 
	'
6
	
.csBeZdZeZdddejdfddd��fdd�Z�fdd�Z�Z	S)�HTTPSConnectionN)�context�check_hostnamecs�tt|�j||||�|dk	s.|dk	s.|dk	rDddl}	|	jdtd�||_||_|dkrptj	�}|j
dk	rpd|_
|jtjk}
|dkr�|j
}|r�|
r�td��|s�|r�|j||�|j
dk	r�d|_
||_||_dS)NrzTkey_file, cert_file and check_hostname are deprecated, use a custom context instead.rWTzMcheck_hostname needs a SSL context with either CERT_OPTIONAL or CERT_REQUIRED)rorrV�warnings�warn�DeprecationWarning�key_file�	cert_file�sslZ_create_default_https_contextZpost_handshake_authZverify_modeZ	CERT_NONErr]Zload_cert_chain�_context�_check_hostname)r0r�r�rr	r�r�rrrZwill_verify)rprrrVts0


zHTTPSConnection.__init__cs�t�j�|jr|j}n|j}|jj|j|d�|_|jjr�|jr�yt	j
|jj�|�Wn.tk
r�|jj
tj�|jj��YnXdS)N)�server_hostname)ror�r�r�rZwrap_socketrSrrr
Zmatch_hostnameZgetpeercert�	ExceptionZshutdownr�Z	SHUT_RDWRrn)r0r
)rprrr��s



zHTTPSConnection.connect)
r4r5r6�
HTTPS_PORTr�r�rrVr�r�rr)rprrmsrc@seZdZdS)rN)r4r5r6rrrrr�sc@seZdZdS)rN)r4r5r6rrrrr�sc@seZdZdS)rN)r4r5r6rrrrr�sc@seZdZdd�ZdS)rcCs|f|_||_dS)N)�argsrL)r0rLrrrrV�szUnknownProtocol.__init__N)r4r5r6rVrrrrr�sc@seZdZdS)rN)r4r5r6rrrrr�sc@seZdZdS)r	N)r4r5r6rrrrr	�sc@s&eZdZddd�Zdd�Zdd�ZdS)	r
NcCs|f|_||_||_dS)N)r�partial�expected)r0rrrrrrV�szIncompleteRead.__init__cCs2|jdk	rd|j}nd}d|jjt|j�|fS)Nz, %i more expectedrXz%s(%i bytes read%s))rrpr4r,r)r0�errr�__repr__�s

zIncompleteRead.__repr__cCst|�S)N)r[)r0rrr�__str__�szIncompleteRead.__str__)N)r4r5r6rVrrrrrrr
�s
c@seZdZdS)rN)r4r5r6rrrrr�sc@seZdZdS)r
N)r4r5r6rrrrr
�sc@seZdZdS)rN)r4r5r6rrrrr�sc@seZdZdS)rN)r4r5r6rrrrr�sc@seZdZdd�ZdS)rcCs|st|�}|f|_||_dS)N)r[rr2)r0r2rrrrV�szBadStatusLine.__init__N)r4r5r6rVrrrrr�sc@seZdZdd�ZdS)rcCstj|dt|f�dS)Nz&got more than %d bytes when reading %s)rrVr;)r0Z	line_typerrrrV�szLineTooLong.__init__N)r4r5r6rVrrrrr�sc@seZdZdd�ZdS)rcOs"tj|d�tj|f|�|�dS)NrX)rrV�ConnectionResetError)r0�pos�kwrrrrV�szRemoteDisconnected.__init__N)r4r5r6rVrrrrr�s)r)AZemail.parserrCZ
email.messager�r��os�rer�r�Zurllib.parser�__all__r�rrKr�r�r��globals�updater��__members__r�rr�r;r<�compile�	fullmatchr�r�r�r�r�r�r'r�ZMessager(r?rE�BufferedIOBaserrr
�ImportErrorrr/rrrrrrr	r
rr
rrrrrrrrrrr�<module>Gs�



9F=
cookiejar.cpython-36.opt-1.pyc000064400000151077151732672750012131 0ustar003

���ir+�@s*dZddddddddgZd	d
lZd	d
lZd	d
lZd	d
lZd	d
lZd	d
lZyd	d
l	Z
Wnek
rpd	d
lZ
YnXd	d
l
Zd	dlmZdZd
ad
d�Zeejj�ZdZdd�ZdZdd�ZdddddddgZddddd d!d"d#d$d%d&d'gZgZxeD]Zej ej!��q�Wdud(d)�Z"dvd*d+�Z#d
d
d
d
d,�Z$ej%d-ej&�Z'd.d/�Z(d0d1�Z)ej%d2ej&�Z*ej%d3ej+ej&B�Z,ej%d4ej-ej&B�Z.d5d6�Z/ej%d7ej-ej&B�Z0d8d9�Z1d:d;�Z2ej%d<�Z3ej%d=�Z4ej%d>�Z5ej%d?�Z6d@dA�Z7ej%dB�Z8dCdD�Z9dEdF�Z:dGdH�Z;ej%dIej&�Z<dJdK�Z=dLdM�Z>dNdO�Z?dPdQ�Z@ej%dRej&�ZAdSdT�ZBdUdV�ZCdWdX�ZDdYdZ�ZEd[ZFej%d\�ZGd]d^�ZHd_d`�ZIdadb�ZJdcdd�ZKGded�d�ZLGdfd�d�ZMGdgd�deM�ZNdhdi�ZOdjdk�ZPGdldm�dm�ZQGdnd�d�ZRGdod�deS�ZTGdpd�deR�ZUdqdr�ZVGdsd�deU�ZWGdtd�deU�ZXd
S)wa�HTTP cookie handling for web clients.

This module has (now fairly distant) origins in Gisle Aas' Perl module
HTTP::Cookies, from the libwww-perl library.

Docstrings, comments and debug strings in this code refer to the
attributes of the HTTP cookie system as cookie-attributes, to distinguish
them clearly from Python attributes.

Class diagram (note that BSDDBCookieJar and the MSIE* classes are not
distributed with the Python standard library, but are available from
http://wwwsearch.sf.net/):

                        CookieJar____
                        /     \      \
            FileCookieJar      \      \
             /    |   \         \      \
 MozillaCookieJar | LWPCookieJar \      \
                  |               |      \
                  |   ---MSIEBase |       \
                  |  /      |     |        \
                  | /   MSIEDBCookieJar BSDDBCookieJar
                  |/
               MSIECookieJar

�Cookie�	CookieJar�CookiePolicy�DefaultCookiePolicy�
FileCookieJar�LWPCookieJar�	LoadError�MozillaCookieJar�N)�timegmFcGs(tsdStsddl}|jd�atj|�S)Nr	zhttp.cookiejar)�debug�logger�loggingZ	getLogger)�argsr
�r�&/usr/lib64/python3.6/http/cookiejar.py�_debug.s
rzQa filename was not supplied (nor was the CookieJar instance initialised with one)cCsJddl}ddl}ddl}|j�}|jd|�|j�}|jd|dd�dS)Nr	zhttp.cookiejar bug!
%s�)�
stacklevel)�io�warnings�	traceback�StringIO�	print_exc�getvalue�warn)rrr�f�msgrrr�_warn_unhandled_exception<s
ri�cCs�|dd�\}}}}}}|tkr�d|ko2dknr�d|koJdknr�d|kobdknr�d|kozdknr�d|ko�dknr�t|�SdSdS)	N����r	��;�=)�
EPOCH_YEARr
)�tt�year�monthZmday�hour�min�secrrr�_timegmKs
8Hr,ZMonZTueZWedZThuZFriZSatZSunZJanZFebZMarZAprZMayZJunZJulZAugZSepZOctZNovZDeccCs@|dkrtjj�}ntjj|�}d|j|j|j|j|j|jfS)aHReturn a string representing time in seconds since epoch, t.

    If the function is called without an argument, it will use the current
    time.

    The format of the returned string is like "YYYY-MM-DD hh:mm:ssZ",
    representing Universal Time (UTC, aka GMT).  An example of this format is:

    1994-11-24 08:49:37Z

    Nz%04d-%02d-%02d %02d:%02d:%02dZ)	�datetime�utcnow�utcfromtimestampr'r(�dayr)�minute�second)�t�dtrrr�	time2isozYs
r5cCsR|dkrtjj�}ntjj|�}dt|j�|jt|jd|j|j	|j
|jfS)z�Return a string representing time in seconds since epoch, t.

    If the function is called without an argument, it will use the current
    time.

    The format of the returned string is like this:

    Wed, DD-Mon-YYYY HH:MM:SS GMT

    Nz#%s, %02d-%s-%04d %02d:%02d:%02d GMTr)r-r.r/�DAYSZweekdayr0�MONTHSr(r'r)r1r2)r3r4rrr�
time2netscapelsr8)ZGMT�UTCZUT�Zz^([-+])?(\d\d?):?(\d\d)?$cCsjd}|tkrd}nTtj|�}|rfdt|jd��}|jd�rR|dt|jd��}|jd�dkrf|}|S)Nr	ir��<r�-)�	UTC_ZONES�TIMEZONE_RE�search�int�group)�tz�offset�mrrr�offset_from_tz_string�s

rFc
Cs�t|�}|tjkrdSytj|j��d}WnXtk
r�yt|�}Wntk
r\dSXd|kopdknr||}ndSYnX|dkr�d}|dkr�d}|dkr�d}t|�}t|�}t|�}t|�}|dk�r0tjtj��d}|d}	|}
|||	}|	|
}	t	|	�dk�r0|	dk�r(|d}n|d}t
|||||||f�}|dk	�r�|dk�r^d}|j�}t|�}|dk�r|dS||}|S)Nrr r	i��d�2r9)
rAr-ZMAXYEAR�MONTHS_LOWER�index�lower�
ValueError�timeZ	localtime�absr,�upperrF)
r0�mon�yr�hrr*r+rCZimonZcur_yrrEZtmpr3rDrrr�	_str2time�sV







rSzV^[SMTWF][a-z][a-z], (\d\d) ([JFMASOND][a-z][a-z]) (\d\d\d\d) (\d\d):(\d\d):(\d\d) GMT$z+^(?:Sun|Mon|Tue|Wed|Thu|Fri|Sat)[a-z]*,?\s*a�^
    (\d\d?)            # day
       (?:\s+|[-\/])
    (\w+)              # month
        (?:\s+|[-\/])
    (\d+)              # year
    (?:
          (?:\s+|:)    # separator before clock
       (\d\d?):(\d\d)  # hour:min
       (?::(\d\d))?    # optional seconds
    )?                 # optional clock
       \s*
    ([-+]?\d{2,4}|(?![APap][Mm]\b)[A-Za-z]+)? # timezone
       \s*
    (?:\(\w+\))?       # ASCII representation of timezone in parens.
       \s*$cCs�tj|�}|rl|j�}tj|dj��d}t|d�|t|d�t|d�t|d�t|d�f}t|�S|j	�}t
jd|d�}dgd	\}}}}}}	}
tj|�}|dk	r�|j�\}}}}}}	}
ndSt
||||||	|
�S)
a�Returns time in seconds since epoch of time represented by a string.

    Return value is an integer.

    None is returned if the format of str is unrecognized, the time is outside
    the representable range, or the timezone string is not recognized.  If the
    string contains no timezone, UTC is assumed.

    The timezone in the string may be numerical (like "-0800" or "+0100") or a
    string timezone (like "UTC", "GMT", "BST" or "EST").  Currently, only the
    timezone strings equivalent to UTC (zero offset) are known to the function.

    The function loosely parses the following formats:

    Wed, 09 Feb 1994 22:23:32 GMT       -- HTTP format
    Tuesday, 08-Feb-94 14:15:29 GMT     -- old rfc850 HTTP format
    Tuesday, 08-Feb-1994 14:15:29 GMT   -- broken rfc850 HTTP format
    09 Feb 1994 22:23:32 GMT            -- HTTP format (no weekday)
    08-Feb-94 14:15:29 GMT              -- rfc850 format (no weekday)
    08-Feb-1994 14:15:29 GMT            -- broken rfc850 format (no weekday)

    The parser ignores leading and trailing whitespace.  The time may be
    absent.

    If the year is given with only 2 digits, the function will select the
    century that makes the year closest to the current date.

    rrr	r;���N�)�STRICT_DATE_REr@�groupsrIrJrKrA�floatr,�lstrip�
WEEKDAY_RE�sub�LOOSE_HTTP_DATE_RErS)�textrE�grPr&r0rQrRr*r+rCrrr�	http2time�s
"
raa�^
    (\d{4})              # year
       [-\/]?
    (\d\d?)              # numerical month
       [-\/]?
    (\d\d?)              # day
   (?:
         (?:\s+|[-:Tt])  # separator before clock
      (\d\d?):?(\d\d)    # hour:min
      (?::?(\d\d(?:\.\d*)?))?  # optional seconds (and fractional)
   )?                    # optional clock
      \s*
   ([-+]?\d\d?:?(:?\d\d)?
    |Z|z)?               # timezone  (Z is "zero meridian", i.e. GMT)
      \s*$c
Csd|j�}dgd\}}}}}}}tj|�}|dk	rL|j�\}}}}}}}}	ndSt|||||||�S)av
    As for http2time, but parses the ISO 8601 formats:

    1994-02-03 14:15:29 -0100    -- ISO 8601 format
    1994-02-03 14:15:29          -- zone is optional
    1994-02-03                   -- only date
    1994-02-03T14:15:29          -- Use T as separator
    19940203T141529Z             -- ISO 8601 compact format
    19940203                     -- only date

    NrW)r[�ISO_DATE_REr@rYrS)
r_r0rPrQrRr*r+rCrE�_rrr�iso2time's

rdcCs*|jd�\}}|jd|�|j|d�S)z)Return unmatched part of re.Match object.r	N)�span�string)�match�start�endrrr�	unmatchedHsrjz^\s*([^=\s;,]+)z&^\s*=\s*\"([^\"\\]*(?:\\.[^\"\\]*)*)\"z^\s*=\s*([^\s;,]*)z\\(.)c
Csg}�x|D]�}|}g}x�|r�tj|�}|r�t|�}|jd�}tj|�}|rlt|�}|jd�}tjd|�}n.tj|�}|r�t|�}|jd�}|j�}nd}|j	||f�q|j
�jd�r�|j
�dd�}|r�|j	|�g}qtj
dd|�\}}	|}qW|r|j	|�qW|S)amParse header values into a list of lists containing key,value pairs.

    The function knows how to deal with ",", ";" and "=" as well as quoted
    values after "=".  A list of space separated tokens are parsed as if they
    were separated by ";".

    If the header_values passed as argument contains multiple values, then they
    are treated as if they were a single value separated by comma ",".

    This means that this function is useful for parsing header fields that
    follow this syntax (BNF as from the HTTP/1.1 specification, but we relax
    the requirement for tokens).

      headers           = #header
      header            = (token | parameter) *( [";"] (token | parameter))

      token             = 1*<any CHAR except CTLs or separators>
      separators        = "(" | ")" | "<" | ">" | "@"
                        | "," | ";" | ":" | "\" | <">
                        | "/" | "[" | "]" | "?" | "="
                        | "{" | "}" | SP | HT

      quoted-string     = ( <"> *(qdtext | quoted-pair ) <"> )
      qdtext            = <any TEXT except <">>
      quoted-pair       = "\" CHAR

      parameter         = attribute "=" value
      attribute         = token
      value             = token | quoted-string

    Each header is represented by a list of key/value pairs.  The value for a
    simple token (not part of a parameter) is None.  Syntactically incorrect
    headers will not necessarily be parsed as you would want.

    This is easier to describe with some examples:

    >>> split_header_words(['foo="bar"; port="80,81"; discard, bar=baz'])
    [[('foo', 'bar'), ('port', '80,81'), ('discard', None)], [('bar', 'baz')]]
    >>> split_header_words(['text/html; charset="iso-8859-1"'])
    [[('text/html', None), ('charset', 'iso-8859-1')]]
    >>> split_header_words([r'Basic realm="\"foo\bar\""'])
    [[('Basic', None), ('realm', '"foobar"')]]

    rz\1N�,z^[=\s;]*rV)�HEADER_TOKEN_REr@rjrB�HEADER_QUOTED_VALUE_RE�HEADER_ESCAPE_REr]�HEADER_VALUE_RE�rstrip�appendr[�
startswith�re�subn)
Z
header_values�resultr_Z	orig_text�pairsrE�name�valueZnon_junkZ
nr_junk_charsrrr�split_header_wordsQs>.







ryz([\"\\])cCs�g}xt|D]l}g}xN|D]F\}}|dk	rTtjd|�sHtjd|�}d|}d||f}|j|�qW|r
|jdj|��q
Wdj|�S)a�Do the inverse (almost) of the conversion done by split_header_words.

    Takes a list of lists of (key, value) pairs and produces a single header
    value.  Attribute values are quoted if needed.

    >>> join_header_words([[("text/plain", None), ("charset", "iso-8859-1")]])
    'text/plain; charset="iso-8859-1"'
    >>> join_header_words([[("text/plain", None)], [("charset", "iso-8859-1")]])
    'text/plain, charset="iso-8859-1"'

    Nz^\w+$z\\\1z"%s"z%s=%sz; z, )rsr@�HEADER_JOIN_ESCAPE_REr]rq�join)Zlists�headersrv�attr�k�vrrr�join_header_words�s
r�cCs0|jd�r|dd�}|jd�r,|dd�}|S)N�"r���)rr�endswith)r_rrr�strip_quotes�s


r�cCsd}g}x�|D]�}g}d}x�t|jd	��D]�\}}|j�}|jd
�\}}	}
|j�}|sd|dkr*Pnq*|	rp|
j�nd}
|dkr�|j�}||kr�|}|dkr�|
dk	r�t|
�}
d
}n|dkr�|
dk	r�tt|
��}
|j||
f�q*W|r|�s�|jd�|j|�qW|S)a5Ad-hoc parser for Netscape protocol cookie-attributes.

    The old Netscape cookie format for Set-Cookie can for instance contain
    an unquoted "," in the expires field, so we have to use this ad-hoc
    parser instead of split_header_words.

    XXX This may not make the best possible effort to parse all the crap
    that Netscape Cookie headers contain.  Ronald Tschalar's HTTPClient
    parser is probably better, so could do worse than following that if
    this ever gives any trouble.

    Currently, this is also used for parsing RFC 2109 cookies.

    �expires�domain�path�secure�version�port�max-ageF�;�=r	NT�0)r�r�r�r�r�r�r�)r�r�)�	enumerate�split�strip�	partitionrKr�rarq)Z
ns_headersZknown_attrsruZ	ns_headerrv�version_setZiiZparam�key�sep�val�lcrrr�parse_ns_headers�s@

r�z\.\d+$cCs:tj|�rdS|dkrdS|ddks2|ddkr6dSdS)z*Return True if text is a host domain name.FrVr	�.rTr�)�IPV4_REr@)r_rrr�is_HDNs
r�cCsl|j�}|j�}||krdSt|�s(dS|j|�}|dksB|dkrFdS|jd�sTdSt|dd��shdSdS)a�Return True if domain A domain-matches domain B, according to RFC 2965.

    A and B may be host domain names or IP addresses.

    RFC 2965, section 1:

    Host names can be specified either as an IP address or a HDN string.
    Sometimes we compare one host name with another.  (Such comparisons SHALL
    be case-insensitive.)  Host A's name domain-matches host B's if

         *  their host name strings string-compare equal; or

         * A is a HDN string and has the form NB, where N is a non-empty
            name string, B has the form .B', and B' is a HDN string.  (So,
            x.y.com domain-matches .Y.com but not Y.com.)

    Note that domain-match is not a commutative operation: a.b.c.com
    domain-matches .c.com, but not the reverse.

    TFrr	r�Nr�)rKr��rfindrr)�A�B�irrr�domain_matchs

r�cCstj|�rdSdS)zdReturn True if text is a sort-of-like a host domain name.

    For accepting/blocking domains.

    FT)r�r@)r_rrr�liberal_is_HDNBs
r�cCsb|j�}|j�}t|�ot|�s0||kr,dSdS|jd�}|rL|j|�rLdS|r^||kr^dSdS)z\For blocking/accepting domains.

    A and B may be host domain names or IP addresses.

    TFr�)rKr�rrr�)r�r��initial_dotrrr�user_domain_matchLs
r�z:\d+$cCsB|j�}tjj|�d}|dkr,|jdd�}tjd|d�}|j�S)z�Return request-host, as defined by RFC 2965.

    Variation from RFC: returned value is lowercased, for convenient
    comparison.

    rrVZHost)�get_full_url�urllib�parseZurlparseZ
get_header�cut_port_rer]rK)�request�url�hostrrr�request_hostasr�cCs6t|�}}|jd�dkr.tj|�r.|d}||fS)zzReturn a tuple (request-host, effective request-host name).

    As defined by RFC 2965, except both are lowercased.

    r�rz.localr�)r��findr�r@)r��erhn�req_hostrrr�eff_request_hostqsr�cCs4|j�}tjj|�}t|j�}|jd�s0d|}|S)z6Path component of request-URI, as defined by RFC 2965.�/)r�r�r�Zurlsplit�escape_pathr�rr)r�r��partsr�rrr�request_path|s

r�cCs^|j}|jd�}|dkrV||dd�}yt|�WqZtk
rRtd|�dSXnt}|S)N�:r	rznonnumeric port: '%s')r�r�rArLr�DEFAULT_HTTP_PORT)r�r�r�r�rrr�request_port�s

r�z%/;:@&=+$,!~*'()z%([0-9a-fA-F][0-9a-fA-F])cCsd|jd�j�S)Nz%%%sr)rBrO)rgrrr�uppercase_escaped_char�sr�cCstjj|t�}tjt|�}|S)zEEscape any invalid characters in HTTP URL, and uppercase all escapes.)r�r�Zquote�HTTP_PATH_SAFE�ESCAPED_CHAR_REr]r�)r�rrrr��s
r�cCsP|jd�}|dkrL||dd�}|jd�}t|�rL|dksD|dkrLd|S|S)aBReturn reach of host h, as defined by RFC 2965, section 1.

    The reach R of a host name H is defined as follows:

       *  If

          -  H is the host domain name of a host; and,

          -  H has the form A.B; and

          -  A has no embedded (that is, interior) dots; and

          -  B has at least one embedded dot, or B is the string "local".
             then the reach of H is .B.

       *  Otherwise, the reach of H is H.

    >>> reach("www.acme.com")
    '.acme.com'
    >>> reach("acme.com")
    'acme.com'
    >>> reach("acme.local")
    '.local'

    r�r	rNZlocal)r�r�)�hr��brrr�reach�s

r�cCs$t|�}t|t|j��sdSdSdS)z�

    RFC 2965, section 3.3.6:

        An unverifiable transaction is to a third-party host if its request-
        host U does not domain-match the reach R of the request-host O in the
        origin transaction.

    TFN)r�r�r�Zorigin_req_host)r�r�rrr�is_third_party�s
r�c@sNeZdZdZddd�Zdd�Zddd	�Zd
d�Zddd
�Zdd�Z	dd�Z
dS)ra�HTTP Cookie.

    This class represents both Netscape and RFC 2965 cookies.

    This is deliberately a very simple class.  It just holds attributes.  It's
    possible to construct Cookie instances that don't comply with the cookie
    standards.  CookieJar.make_cookies is the factory function for Cookie
    objects -- it deals with cookie parsing, supplying defaults, and
    normalising to the representation used in this class.  CookiePolicy is
    responsible for checking them to see whether they should be accepted from
    and returned to the server.

    Note that the port may be present in the headers, but unspecified ("Port"
    rather than"Port=80", for example); if this is the case, port is None.

    FcCs�|dk	rt|�}|dk	r$tt|��}|dkr<|dkr<td��||_||_||_||_||_|j�|_	||_
||_|	|_|
|_
||_||_|
|_||_||_||_tj|�|_dS)NTz-if port is None, port_specified must be false)rArZrLr�rwrxr��port_specifiedrKr��domain_specified�domain_initial_dotr��path_specifiedr�r��discard�comment�comment_url�rfc2109�copy�_rest)�selfr�rwrxr�r�r�r�r�r�r�r�r�r�r�r��restr�rrr�__init__�s.

zCookie.__init__cCs
||jkS)N)r�)r�rwrrr�has_nonstandard_attrszCookie.has_nonstandard_attrNcCs|jj||�S)N)r��get)r�rw�defaultrrr�get_nonstandard_attrszCookie.get_nonstandard_attrcCs||j|<dS)N)r�)r�rwrxrrr�set_nonstandard_attrszCookie.set_nonstandard_attrcCs,|dkrtj�}|jdk	r(|j|kr(dSdS)NTF)rMr�)r��nowrrr�
is_expireds
zCookie.is_expiredcCsX|jdkrd}n
d|j}|j||j}|jdk	rFd|j|jf}n|j}d||fS)NrVr�z%s=%sz<Cookie %s for %s>)r�r�r�rxrw)r��p�limitZ	namevaluerrr�__str__%s


zCookie.__str__cCspg}x,dD]$}t||�}|jd|t|�f�q
W|jdt|j��|jdt|j��d|jjdj|�fS)Nr�rwrxr�r�r�r�r�r�r�r�r�r�r�r�z%s=%szrest=%sz
rfc2109=%sz%s(%s)z, )r�rwrxr�r�r�r�r�r�r�r�r�r�r�r�)�getattrrq�reprr�r��	__class__�__name__r{)r�rrwr}rrr�__repr__/s
zCookie.__repr__)F)N)N)r��
__module__�__qualname__�__doc__r�r�r�r�r�r�r�rrrrr�s
 


c@s0eZdZdZdd�Zdd�Zdd�Zdd	�Zd
S)ra Defines which cookies get accepted from and returned to server.

    May also modify cookies, though this is probably a bad idea.

    The subclass DefaultCookiePolicy defines the standard rules for Netscape
    and RFC 2965 cookies -- override that if you want a customized policy.

    cCs
t��dS)z�Return true if (and only if) cookie should be accepted from server.

        Currently, pre-expired cookies never get this far -- the CookieJar
        class deletes such cookies itself.

        N)�NotImplementedError)r��cookier�rrr�set_okGszCookiePolicy.set_okcCs
t��dS)zAReturn true if (and only if) cookie should be returned to server.N)r�)r�r�r�rrr�	return_okPszCookiePolicy.return_okcCsdS)zMReturn false if cookies should not be returned, given cookie domain.
        Tr)r�r�r�rrr�domain_return_okTszCookiePolicy.domain_return_okcCsdS)zKReturn false if cookies should not be returned, given cookie path.
        Tr)r�r�r�rrr�path_return_okYszCookiePolicy.path_return_okN)r�r�r�r�r�r�r�r�rrrrr>s
	c@s�eZdZdZdZdZdZdZeeBZdddddddddeddfd	d
�Z	dd�Z
d
d�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd �Zd!d"�Zd#d$�Zd%d&�Zd'd(�Zd)d*�Zd+d,�Zd-d.�Zd/d0�Zd1d2�Zd3d4�Zd5d6�ZdS)7rzBImplements the standard rules for accepting and returning cookies.rrrTr	NTFc

Csp||_||_||_||_||_||_|	|_|
|_||_||_	|dk	rPt
|�|_nf|_|dk	rft
|�}||_dS)zAConstructor arguments should be passed as keyword arguments only.N)
�netscape�rfc2965�rfc2109_as_netscape�hide_cookie2�
strict_domain�strict_rfc2965_unverifiable�strict_ns_unverifiable�strict_ns_domain�strict_ns_set_initial_dollar�strict_ns_set_path�tuple�_blocked_domains�_allowed_domains)
r��blocked_domains�allowed_domainsr�r�r�r�r�r�r�r�r�r�rrrr�is 
zDefaultCookiePolicy.__init__cCs|jS)z4Return the sequence of blocked domains (as a tuple).)r�)r�rrrr��sz#DefaultCookiePolicy.blocked_domainscCst|�|_dS)z$Set the sequence of blocked domains.N)r�r�)r�r�rrr�set_blocked_domains�sz'DefaultCookiePolicy.set_blocked_domainscCs"x|jD]}t||�rdSqWdS)NTF)r�r�)r�r�Zblocked_domainrrr�
is_blocked�s
zDefaultCookiePolicy.is_blockedcCs|jS)z=Return None, or the sequence of allowed domains (as a tuple).)r�)r�rrrr��sz#DefaultCookiePolicy.allowed_domainscCs|dk	rt|�}||_dS)z-Set the sequence of allowed domains, or None.N)r�r�)r�r�rrr�set_allowed_domains�sz'DefaultCookiePolicy.set_allowed_domainscCs0|jdkrdSx|jD]}t||�rdSqWdS)NFT)r�r�)r�r�Zallowed_domainrrr�is_not_allowed�s

z"DefaultCookiePolicy.is_not_allowedcCsBtd|j|j�x,dD]$}d|}t||�}|||�sd	SqWd
S)z�
        If you override .set_ok(), be sure to call this method.  If it returns
        false, so should your subclass (assuming your subclass wants to be more
        strict about which cookies to accept).

        z - checking cookie %s=%sr��
verifiabilityrwr�r�r�Zset_ok_FT)r�r�rwr�r�r�)rrwrxr�)r�r�r��n�fn_name�fnrrrr��s


zDefaultCookiePolicy.set_okcCs^|jdkrtd|j|j�dS|jdkr<|jr<td�dS|jdkrZ|jrZtd�dSdS)Nz0   Set-Cookie2 without version attribute (%s=%s)Fr	z$   RFC 2965 cookies are switched offz$   Netscape cookies are switched offT)r�rrwrxr�r�)r�r�r�rrr�set_ok_version�s
z"DefaultCookiePolicy.set_ok_versioncCsJ|jrFt|�rF|jdkr*|jr*td�dS|jdkrF|jrFtd�dSdS)Nr	z>   third-party RFC 2965 cookie during unverifiable transactionFz>   third-party Netscape cookie during unverifiable transactionT)�unverifiabler�r�r�rr�)r�r�r�rrr�set_ok_verifiability�sz(DefaultCookiePolicy.set_ok_verifiabilitycCs0|jdkr,|jr,|jjd�r,td|j�dSdS)Nr	�$z'   illegal name (starts with '$'): '%s'FT)r�r�rwrrr)r�r�r�rrr�set_ok_name�s
zDefaultCookiePolicy.set_ok_namecCsL|jrHt|�}|jdks(|jdkrH|jrH|j|j�rHtd|j|�dSdS)Nr	z7   path attribute %s is not a prefix of request path %sFT)r�r�r�r�rrr�r)r�r�r��req_pathrrr�set_ok_path�s

zDefaultCookiePolicy.set_ok_pathc
Cs�|j|j�rtd|j�dS|j|j�r8td|j�dS|j�r�t|�\}}|j}|jr�|jd�dkr�|jd�}|jdd|�}|dkr�||dd�}||d|�}	|	j	�d$kr�t
|�dkr�td|�dS|jd��r�|dd�}
n|}
|
jd�dk}|�r|dk�rtd|�dS|j
dk�rb|j|��rb|jd��rbd|j|��rbtd ||�dS|j
dk�s||j|j@�r�t||��s�td!||�dS|j
dk�s�|j|j@�r�|dt
|��}|jd�dk�r�tj|��r�td"||�dSd#S)%Nz"   domain %s is in user block-listFz&   domain %s is not in user allow-listr�rr	r�co�ac�com�edu�org�net�gov�milrA�aero�biz�cat�coop�info�jobs�mobi�museumrw�pro�travel�euz&   country-code second level domain %sz.localz/   non-local domain %s contains no embedded dotzO   effective request-host %s (even with added initial dot) does not end with %sz5   effective request-host %s does not domain-match %sz.   host prefix %s for domain %s contains a dotT)rrrrrrrrrAr	r
rrr
rrrrwrrr)r�r�rr�r�r�r��countr�rK�lenrrr�r�r�r��DomainRFC2965Matchr��DomainStrictNoDotsr�r@)
r�r�r�r�r�r�r��jZtldZsldZundotted_domainZ
embedded_dotsZhost_prefixrrr�
set_ok_domain�sf

z!DefaultCookiePolicy.set_ok_domaincCs�|jr�t|�}|dkrd}nt|�}x\|jjd�D]:}yt|�Wntk
r`td|�dSX||kr2Pq2Wtd||j�dSdS)N�80rkz   bad port %s (not numeric)Fz$   request port (%s) not found in %sT)r�r��strr�r�rArLr)r�r�r��req_portr�rrr�set_ok_port%s"

zDefaultCookiePolicy.set_ok_portcCsBtd|j|j�x,dD]$}d|}t||�}|||�sd	SqWd
S)z�
        If you override .return_ok(), be sure to call this method.  If it
        returns false, so should your subclass (assuming your subclass wants to
        be more strict about which cookies to return).

        z - checking cookie %s=%sr�r�r�r�r�r�Z
return_ok_FT)r�r�r�r�r�r�)rrwrxr�)r�r�r�r�r�r�rrrr�:s	


zDefaultCookiePolicy.return_okcCs@|jdkr|jrtd�dS|jdkr<|jr<td�dSdS)Nr	z$   RFC 2965 cookies are switched offFz$   Netscape cookies are switched offT)r�r�rr�)r�r�r�rrr�return_ok_versionLsz%DefaultCookiePolicy.return_ok_versioncCsJ|jrFt|�rF|jdkr*|jr*td�dS|jdkrF|jrFtd�dSdS)Nr	z>   third-party RFC 2965 cookie during unverifiable transactionFz>   third-party Netscape cookie during unverifiable transactionT)r�r�r�r�rr�)r�r�r�rrr�return_ok_verifiabilityUsz+DefaultCookiePolicy.return_ok_verifiabilitycCs |jr|jdkrtd�dSdS)NZhttpsz(   secure cookie with non-secure requestFT)r��typer)r�r�r�rrr�return_ok_secureasz$DefaultCookiePolicy.return_ok_securecCs|j|j�rtd�dSdS)Nz   cookie expiredFT)r��_nowr)r�r�r�rrr�return_ok_expiresgsz%DefaultCookiePolicy.return_ok_expirescCsP|jrLt|�}|dkrd}x0|jjd�D]}||kr(Pq(Wtd||j�dSdS)Nrrkz0   request port %s does not match cookie port %sFT)r�r�r�r)r�r�r�rr�rrr�return_ok_portms
z"DefaultCookiePolicy.return_ok_portcCs�t|�\}}|j}|r,|jd�r,d|}n|}|jdkrb|j|j@rb|jrb||krbtd�dS|jdkr�t||�r�td||�dS|jdkr�d|j	|�r�td||�dSdS)Nr�r	zQ   cookie with unspecified domain does not string-compare equal to request domainFzQ   effective request-host name %s does not domain-match RFC 2965 cookie domain %sz;   request-host %s does not match Netscape cookie domain %sT)
r�r�rrr�r��DomainStrictNonDomainr�rr�r�)r�r�r�r�r�r��	dotdomainrrr�return_ok_domain{s&

z$DefaultCookiePolicy.return_ok_domaincCs�t|�\}}|jd�sd|}|jd�s0d|}|rJ|jd�rJd|}n|}|j|�p`|j|�sfdS|j|�r~td|�dS|j|�r�td|�dSdS)Nr�Fz"   domain %s is in user block-listz&   domain %s is not in user allow-listT)r�rrr�r�rr�)r�r�r�r�r�r&rrrr��s"






z$DefaultCookiePolicy.domain_return_okcCs0td|�t|�}|j|�s,td||�dSdS)Nz- checking cookie path=%sz  %s does not path-match %sFT)rr�rr)r�r�r�r�rrrr��s

z"DefaultCookiePolicy.path_return_ok) r�r�r�r�rr%rZ
DomainLiberalZDomainStrictr�r�r�r�r�r�r�r�r�r�r�rrrr�rrr!r#r$r'r�r�rrrrr_sL	;	cCst|j��}t|j|�S)N)�sorted�keys�mapr�)Zadictr)rrr�vals_sorted_by_key�sr+ccsZt|�}xL|D]D}d}y
|jWntk
r4YnXd}t|�EdH|s|VqWdS)zBIterates over nested mapping, depth-first, in sorted order by key.FTN)r+�items�AttributeError�
deepvalues)�mapping�values�objrrrr.�s

r.c@seZdZdS)�AbsentN)r�r�r�rrrrr2�sr2c@s�eZdZdZejd�Zejd�Zejd�Zejd�Z	ejd�Z
ejdej�Zd3d	d
�Z
dd�Zd
d�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd �Zd!d"�Zd#d$�Zd4d%d&�Zd'd(�Zd)d*�Zd+d,�Zd-d.�Zd/d0�Z d1d2�Z!dS)5rz�Collection of HTTP cookies.

    You may not need to know about this class: try
    urllib.request.build_opener(HTTPCookieProcessor).open(url).
    z\Wz([\"\\])z\.?[^.]*z[^.]*z^\.+z^\#LWP-Cookies-(\d+\.\d+)NcCs(|dkrt�}||_tj�|_i|_dS)N)r�_policy�
_threading�RLock�
_cookies_lock�_cookies)r��policyrrrr��s

zCookieJar.__init__cCs
||_dS)N)r3)r�r8rrr�
set_policy�szCookieJar.set_policycCs�g}|jj||�sgStd|�|j|}xd|j�D]X}|jj||�sHq4||}x:|j�D].}|jj||�svtd�qZtd�|j|�qZWq4W|S)Nz!Checking %s for cookies to returnz   not returning cookiez   it's a match)	r3r�rr7r)r�r0r�rq)r�r�r��cookiesZcookies_by_pathr�Zcookies_by_namer�rrr�_cookies_for_domain�s 

zCookieJar._cookies_for_domaincCs.g}x$|jj�D]}|j|j||��qW|S)z2Return a list of cookies to be returned to server.)r7r)�extendr;)r�r�r:r�rrr�_cookies_for_request�szCookieJar._cookies_for_requestc	CsF|jdd�dd�d}g}�x$|D�]}|j}|sLd}|dkrL|jd|�|jdk	r~|jj|j�r~|dkr~|jjd	|j�}n|j}|jdkr�|j|j�n|jd
|j|f�|dkr"|j	r�|jd|j
�|jjd��r|j}|j
o�|jd��r|d
d�}|jd|�|jdk	r"d}|j�r4|d|j}|j|�q"W|S)z�Return a list of cookie-attributes to be returned to server.

        like ['foo="bar"; $Path="/"', ...]

        The $Version attribute is also added when appropriate (currently only
        once per request).

        cSs
t|j�S)N)rr�)�arrr�<lambda>sz)CookieJar._cookie_attrs.<locals>.<lambda>T)r��reverseFr	z$Version=%sNz\\\1z%s=%sz
$Path="%s"r�rz$Domain="%s"z$Portz="%s")�sortr�rqrx�non_word_rer@�quote_rer]rwr�r�r�rrr�r�r�)	r�r:r��attrsr�r�rxr�r�rrr�
_cookie_attrss>



zCookieJar._cookie_attrsc
Cs�td�|jj�z�ttj��|j_|_|j|�}|j|�}|r^|j	d�s^|j
ddj|��|jjr�|jj
r�|j	d�r�x$|D]}|jdkr�|j
dd�Pq�WWd|jj�X|j�dS)z�Add correct Cookie: header to request (urllib.request.Request object).

        The Cookie2 header is also added unless policy.hide_cookie2 is true.

        �add_cookie_headerrz; ZCookie2rz$Version="1"N)rr6�acquirerArMr3r"r=rEZ
has_headerZadd_unredirected_headerr{r�r�r��release�clear_expired_cookies)r�r�r:rDr�rrrrF?s$






zCookieJar.add_cookie_headercCs�g}d}d}�x||D�]r}|d\}}d}d}	i}
i}�x4|d
d�D�]"\}}
|j�}||ksh||krl|}||kr�|
dkr�d}
||
kr�qF|dkr�|
dkr�td�d}	P|
j�}
|dkr�|r�qF|
dkr�td�qF|dk�rd}yt|
�}
Wn$tk
�rtd�d}	PYnXd}|j|
}
||k�s2||k�rb|
dk�rX|dk�rXtd|�d}	P|
|
|<qF|
||<qFW|	�rvq|j|||
|f�qW|S)aReturn list of tuples containing normalised cookie information.

        attrs_set is the list of lists of key,value pairs extracted from
        the Set-Cookie or Set-Cookie2 headers.

        Tuples are name, value, standard, rest, where name and value are the
        cookie name and value, standard is a dictionary containing the standard
        cookie-attributes (discard, secure, version, expires or max-age,
        domain, path and port) and rest is a dictionary containing the rest of
        the cookie-attributes.

        r�r�r�r��max-ager�r�r�r��
commenturlr	FrNTz%   missing value for domain attributezM   missing or invalid value for expires attribute: treating as session cookiez?   missing or invalid (non-numeric) value for max-age attributez!   missing value for %s attribute)r�r�)r�r�rJr�r�r�r�rK)r�r�rK)rKrrArLr"rq)r��	attrs_set�
cookie_tuples�
boolean_attrs�value_attrsZcookie_attrsrwrxZmax_age_setZ
bad_cookie�standardr�r~rr�rrr�_normalized_cookie_tuples`sl






z#CookieJar._normalized_cookie_tuplesc!Cs$|\}}}}|jdt�}|jdt�}|jdt�}	|jdt�}
|jdd�}|dk	rryt|�}Wntk
rpdSX|jdd�}|jdd�}
|jd	d�}|jd
d�}|tk	r�|dkr�d}t|�}nXd}t|�}|jd
�}|dk�r|dkr�|d|�}n|d|d�}t|�dk�rd
}|tk	}d}|�r8t|j	d��}|tk�rTt
|�\}}|}n|j	d��shd|}d}|	tk	�r�|	dk�r�t|�}	nd}tj
dd|	�}	nd}	|
tk�r�d}
d}
nH|
|jk�r�y|j|||�Wntk
�r�YnXtd|||�dSt||||	||||||||
|
|||�S)Nr�r�r�r�r�r�Fr�r�rKrVTr�rr	r�z\s+z2Expiring cookie, domain='%s', path='%s', name='%s'r�)r�r2rArLr�r�r�r�boolrrr�r�rsr]r"�clear�KeyErrorrr)r��tupr�rwrxrPr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rrr�_cookie_from_cookie_tuple�s�








z#CookieJar._cookie_from_cookie_tuplecCs:|j|�}g}x&|D]}|j||�}|r|j|�qW|S)N)rQrVrq)r�rLr�rMr:rUr�rrr�_cookies_from_attrs_sets

z!CookieJar._cookies_from_attrs_setcCsLt|jdd�}|dkr |jj}x&|D]}|jdkr&d|_|r&d|_q&WdS)Nr�rTr	)r�r3r�r�r�)r�r:Z
rfc2109_as_nsr�rrr�_process_rfc2109_cookies&s


z"CookieJar._process_rfc2109_cookiesc
Cs6|j�}|jdg�}|jdg�}|jj}|jj}|r<|s`|rH|s`|rT|s`|rd|rdgSy|jt|�|�}Wntk
r�t�g}YnX|o�|�r2y|jt	|�|�}	Wntk
r�t�g}	YnX|j
|	�|�r"i}
x |D]}d|
|j|j|j
f<q�W|
fdd�}t||	�}	|	�r2|j|	�|S)zAReturn sequence of Cookie objects extracted from response object.zSet-Cookie2z
Set-CookieNcSs|j|j|jf}||kS)N)r�r�rw)Z	ns_cookie�lookupr�rrr�no_matching_rfc2965^sz3CookieJar.make_cookies.<locals>.no_matching_rfc2965)r
Zget_allr3r�r�rWry�	Exceptionrr�rXr�r�rw�filterr<)
r��responser�r|Zrfc2965_hdrsZns_hdrsr�r�r:Z
ns_cookiesrYr�rZrrr�make_cookies2sB






zCookieJar.make_cookiesc
CsN|jj�z2ttj��|j_|_|jj||�r:|j|�Wd|jj�XdS)z-Set a cookie if policy says it's OK to do so.N)	r6rGrArMr3r"r��
set_cookierH)r�r�r�rrr�set_cookie_if_okhs
zCookieJar.set_cookie_if_okc
Csl|j}|jj�zJ|j|kr&i||j<||j}|j|krDi||j<||j}|||j<Wd|jj�XdS)z?Set a cookie, without checking whether or not it should be set.N)r7r6rGr�r�rwrH)r�r��cZc2Zc3rrrr_us






zCookieJar.set_cookiec
Cs|td|j��|jj�zRttj��|j_|_x6|j||�D]&}|jj	||�r>td|�|j
|�q>WWd|jj�XdS)zAExtract cookies from response, where allowable given the request.zextract_cookies: %sz setting cookie: %sN)rr
r6rGrArMr3r"r^r�r_rH)r�r]r�r�rrr�extract_cookies�s

zCookieJar.extract_cookiescCst|dk	r2|dks|dkr td��|j|||=n>|dk	rX|dkrJtd��|j||=n|dk	rj|j|=ni|_dS)a�Clear some cookies.

        Invoking this method without arguments will clear all cookies.  If
        given a single argument, only cookies belonging to that domain will be
        removed.  If given two arguments, cookies belonging to the specified
        path within that domain are removed.  If given three arguments, then
        the cookie with the specified name, path and domain is removed.

        Raises KeyError if no matching cookie exists.

        Nz8domain and path must be given to remove a cookie by namez.domain must be given to remove cookies by path)rLr7)r�r�r�rwrrrrS�s
zCookieJar.clearcCsH|jj�z,x&|D]}|jr|j|j|j|j�qWWd|jj�XdS)z�Discard all session cookies.

        Note that the .save() method won't save session cookies anyway, unless
        you ask otherwise by passing a true ignore_discard argument.

        N)r6rGr�rSr�r�rwrH)r�r�rrr�clear_session_cookies�s

zCookieJar.clear_session_cookiescCsT|jj�z8tj�}x*|D]"}|j|�r|j|j|j|j�qWWd|jj�XdS)a�Discard all expired cookies.

        You probably don't need to call this method: expired cookies are never
        sent back to the server (provided you're using DefaultCookiePolicy),
        this method is called by CookieJar itself every so often, and the
        .save() method won't save expired cookies anyway (unless you ask
        otherwise by passing a true ignore_expires argument).

        N)	r6rGrMr�rSr�r�rwrH)r�r�r�rrrrI�s



zCookieJar.clear_expired_cookiescCs
t|j�S)N)r.r7)r�rrr�__iter__�szCookieJar.__iter__cCsd}x|D]}|d}q
W|S)z#Return number of contained cookies.r	rr)r�r�r�rrr�__len__�s
zCookieJar.__len__cCs6g}x|D]}|jt|��q
Wd|jjdj|�fS)Nz<%s[%s]>z, )rqr�r�r�r{)r��rr�rrrr��s
zCookieJar.__repr__cCs6g}x|D]}|jt|��q
Wd|jjdj|�fS)Nz<%s[%s]>z, )rqrr�r�r{)r�rfr�rrrr��s
zCookieJar.__str__)N)NNN)"r�r�r�r�rs�compilerBrCZstrict_domain_reZ	domain_reZdots_re�ASCII�magic_rer�r9r;r=rErFrQrVrWrXr^r`r_rbrSrcrIrdrer�r�rrrrr�s8





;!a\	6


c@seZdZdS)rN)r�r�r�rrrrr�sc@s8eZdZdZddd�Zd
dd�Zddd	�Zdd
d�ZdS)rz6CookieJar that can be loaded from and saved to a file.NFc	CsJtj||�|dk	r6y|dWntd��YnX||_t|�|_dS)z}
        Cookies are NOT loaded from the named file until either the .load() or
        .revert() method is called.

        NrVzfilename must be string-like)rr�rL�filenamerR�	delayload)r�rjrkr8rrrr��szFileCookieJar.__init__cCs
t��dS)zSave cookies to a file.N)r�)r�rj�ignore_discard�ignore_expiresrrr�save�szFileCookieJar.savecCsJ|dkr"|jdk	r|j}ntt��t|��}|j||||�WdQRXdS)zLoad cookies from a file.N)rjrL�MISSING_FILENAME_TEXT�open�_really_load)r�rjrlrmrrrr�load�s

zFileCookieJar.loadcCs�|dkr"|jdk	r|j}ntt��|jj�zFtj|j�}i|_y|j|||�Wnt	k
rn||_�YnXWd|jj
�XdS)z�Clear all cookies and reload cookies from a saved file.

        Raises LoadError (or OSError) if reversion is not successful; the
        object's state will not be altered if this happens.

        N)rjrLror6rGr��deepcopyr7rr�OSErrorrH)r�rjrlrmZ	old_staterrr�reverts

zFileCookieJar.revert)NFN)NFF)NFF)NFF)r�r�r�r�r�rnrrrurrrrr�s


	cCs$|j|jfd|jfd|jfg}|jdk	r8|jd|jf�|jrH|jd�|jrX|jd�|jrh|jd�|j	rx|jd�|j
r�|jd	tt|j
��f�|j
r�|jd�|jr�|jd|jf�|jr�|jd|jf�t|jj��}x$|D]}|j|t|j|�f�q�W|jd
t|j�f�t|g�S)z�Return string representation of Cookie in the LWP cookie file format.

    Actually, the format is extended a bit -- see module docstring.

    r�r�Nr��	path_spec�	port_spec�
domain_dotr�r�r�r�rKr�)rvN)rwN)rxN)r�N)r�N)rwrxr�r�r�rqr�r�r�r�r�r5rZr�r�r�r(r�r)rr�r�)r�r�r)r~rrr�lwp_cookie_strs6







ryc@s,eZdZdZddd�Zddd�Zd	d
�ZdS)
ra[
    The LWPCookieJar saves a sequence of "Set-Cookie3" lines.
    "Set-Cookie3" is the format used by the libwww-perl library, not known
    to be compatible with any browser, but which is easy to read and
    doesn't lose information about RFC 2965 cookies.

    Additional methods

    as_lwp_str(ignore_discard=True, ignore_expired=True)

    TcCs\tj�}g}x>|D]6}|r$|jr$q|r6|j|�r6q|jdt|��qWdj|dg�S)z�Return cookies as a string of "\n"-separated "Set-Cookie3" headers.

        ignore_discard and ignore_expires: see docstring for FileCookieJar.save

        zSet-Cookie3: %s�
rV)rMr�r�rqryr{)r�rlrmr�rfr�rrr�
as_lwp_strGs
zLWPCookieJar.as_lwp_strNFcCsX|dkr"|jdk	r|j}ntt��t|d��"}|jd�|j|j||��WdQRXdS)N�wz#LWP-Cookies-2.0
)rjrLrorp�writer{)r�rjrlrmrrrrrnWs

zLWPCookieJar.savecCsL|j�}|jj|�s$d|}t|��tj�}d}d}	d}
�yʐx�|j�}|dkrRP|j|�s^q@|t|�d�j�}�x�t|g�D�]x}|d\}
}i}i}x|	D]}d||<q�Wx�|dd�D]t\}}|dk	r�|j	�}nd}||
k�s�||	k�r�|}||	k�r|dk�rd}|||<q�||
k�r*|||<q�|||<q�W|j
}|d�}|d�}|dk	�r^t|�}|dk�rld}|d�}|jd�}t|d�|
||d	�|d�|||d�|d
�|d�|d�|||d
�|d�|�}|�r�|j
�r�q�|�r�|j|��r�q�|j|�q�Wq@WWnBtk
�r�Yn,tk
�rFt�td||f��YnXdS)Nz5%r does not look like a Set-Cookie3 (LWP) format filezSet-Cookie3:rwrvrxr�r�r�r�r�r�r�r�rKrVr	FrTr�z&invalid Set-Cookie3 format file %r: %r)rwrvrxr�r�)r�r�r�r�r�r�rK)�readlinerir@rrMrrrr�ryrKr�rdrr�r�r_rtr[r)r�rrjrlrm�magicrr��headerrNrO�line�datarwrxrPr�r~rr�r�r�r�r�r�rarrrrqcs�











zLWPCookieJar._really_load)TT)NFF)r�r�r�r�r{rnrqrrrrr:s

c@s0eZdZdZejd�ZdZdd�Zd
dd	�Z	dS)ra�

    WARNING: you may want to backup your browser's cookies file if you use
    this class to save cookies.  I *think* it works, but there have been
    bugs in the past!

    This class differs from CookieJar only in the format it uses to save and
    load cookies to and from a file.  This class uses the Mozilla/Netscape
    `cookies.txt' format.  lynx uses this file format, too.

    Don't expect cookies saved while the browser is running to be noticed by
    the browser (in fact, Mozilla on unix will overwrite your saved cookies if
    you change them on disk while it's running; on Windows, you probably can't
    save at all while the browser is running).

    Note that the Mozilla/Netscape format will downgrade RFC2965 cookies to
    Netscape cookies on saving.

    In particular, the cookie version and port number information is lost,
    together with information about whether or not Path, Port and Discard were
    specified by the Set-Cookie2 (or Set-Cookie) header, and whether or not the
    domain as set in the HTTP header started with a dot (yes, I'm aware some
    domains in Netscape files start with a dot and some don't -- trust me, you
    really don't want to know any more about this).

    Note that though Mozilla and Netscape use the same format, they use
    slightly different headers.  The class saves cookies using the Netscape
    header by default (Mozilla can cope with that).

    z#( Netscape)? HTTP Cookie Filezr# Netscape HTTP Cookie File
# http://curl.haxx.se/rfc/cookie_spec.html
# This is a generated file!  Do not edit.

cCsntj�}|j�}|jj|�s(td|���y�x�|j�}|dkr@P|jd�rV|dd�}|j�jd�s.|j�dkrrq.|jd�\}}	}
}}}
}|dk}|	dk}	|
dkr�|}
d}|jd	�}d
}|dkr�d}d}t	d|
|dd
||	||
d
|||ddi�}|�r|j
�rq.|�r|j|��rq.|j|�q.WWnBt
k
�r>�Yn,tk
�rht�td
||f��YnXdS)Nz4%r does not look like a Netscape format cookies filerVrzr�#r��	�TRUEr�FTr	z+invalid Netscape format cookies file %r: %rr�)r�r�)rMr~rir@rr�r�rrr�rr�r�r_rtr[r)r�rrjrlrmr�rr�r�r�r�r�r�rwrxr�r�rarrrrq�s`

zMozillaCookieJar._really_loadNFcCs|dkr"|jdk	r|j}ntt��t|d���}|j|j�tj�}x�|D]�}|rZ|jrZqH|rl|j|�rlqH|j	rxd}nd}|j
jd�r�d}nd}|jdk	r�t
|j�}	nd}	|jdkr�d}
|j}n|j}
|j}|jdj|j
||j||	|
|g�d�qHWWdQRXdS)Nr|r�ZFALSEr�rVr�rz)rjrLrorpr}r�rMr�r�r�r�rrr�rrxrwr{r�)r�rjrlrmrr�r�r�r�r�rwrxrrrrns<



zMozillaCookieJar.save)NFF)
r�r�r�r�rsrgrir�rqrnrrrrr�s

A)N)N)Yr��__all__r�r-rsrMZurllib.parser�Zurllib.requestZ	threadingr4�ImportErrorZdummy_threadingZhttp.clientZhttpZcalendarr
rrrrZclientZ	HTTP_PORTr�rorr%r,r6r7rIr(rqrKr5r8r>rgrhr?rFrSrX�Ir\�Xr^rarbrdrjrlrmrornryrzr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rrrr+r.r2rrtrrryrrrrrr�<module>s�



88!



U
D'


#b!\:xserver.cpython-36.opt-2.pyc000064400000047615151732672750011474 0ustar003

���i���@s�dZddddgZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddl
Z
ddlZddlZddlZddlZddlZddlZddlmZdZd	ZGd
d�dej�ZGdd�dej�ZGdd�de�Zd
d�Zdadd�Zdd�Z Gdd�de�Z!eedddfdd�Z"e#dk�r�ej$�Z%e%j&dddd�e%j&dddd d!d"�e%j&d#d$de'd%d&d'�e%j(�Z)e)j*�rze!Z+neZ+e"e+e)j,e)j-d(�dS))z0.6�
HTTPServer�BaseHTTPRequestHandler�SimpleHTTPRequestHandler�CGIHTTPRequestHandler�N)�
HTTPStatusa�<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
        "http://www.w3.org/TR/html4/strict.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
        <title>Error response</title>
    </head>
    <body>
        <h1>Error response</h1>
        <p>Error code: %(code)d</p>
        <p>Message: %(message)s.</p>
        <p>Error code explanation: %(code)s - %(explain)s.</p>
    </body>
</html>
ztext/html;charset=utf-8c@seZdZdZdd�ZdS)r�cCs4tjj|�|jdd�\}}tj|�|_||_dS)N�)�socketserver�	TCPServer�server_bind�server_address�socketZgetfqdn�server_name�server_port)�self�host�port�r�#/usr/lib64/python3.6/http/server.pyr�szHTTPServer.server_bindN)�__name__�
__module__�__qualname__Zallow_reuse_addressrrrrrr�sc
@seZdZdejj�dZdeZe	Z
eZdZ
dd�Zdd�Zd	d
�Zdd�Zd?dd�Zd@dd�ZdAdd�Zdd�Zdd�Zdd�ZdBdd�Zdd�Zdd �Zd!d"�ZdCd#d$�Zd%d&�Zd'd(d)d*d+d,d-gZd
d.d/d0d1d2d3d4d5d6d7d8d9g
Zd:d;�Z d<Z!e"j#j$Z%d=d>�e&j'j(�D�Z)d
S)DrzPython/rz	BaseHTTP/zHTTP/0.9cCs�d|_|j|_}d|_t|jd�}|jd�}||_|j�}t	|�dk�r|\}}}yZ|dd�dkrjt
�|jdd�d}|jd	�}t	|�d
kr�t
�t|d�t|d�f}Wn*t
tfk
r�|j
tjd|�d
SX|dkr�|jdkr�d
|_|dk�rr|j
tjd|�d
Sn^t	|�d
k�rR|\}}d|_|dk�rr|j
tjd|�d
Sn |�s\d
S|j
tjd|�d
S||||_|_|_|jjd��r�d|jjd�|_ytjj|j|jd�|_Wnrtjjk
�r�}z|j
tjdt|��d
Sd}~Xn:tjjk
�r4}z|j
tjdt|��d
Sd}~XnX|jjdd�}	|	j�dk�rZd|_n |	j�dk�rz|jdk�rzd
|_|jjdd�}
|
j�dk�r�|jdk�r�|jdk�r�|j ��s�d
SdS)NTz
iso-8859-1z
��zHTTP/�/r�.rrzBad request version (%r)FzHTTP/1.1zInvalid HTTP version (%s)ZGETzBad HTTP/0.9 request type (%r)zBad request syntax (%r)z//)Z_classz
Line too longzToo many headers�
Connection��closez
keep-aliveZExpectz100-continue)rr)rr)!�command�default_request_version�request_version�close_connection�str�raw_requestline�rstrip�requestline�split�len�
ValueError�int�
IndexError�
send_errorrZBAD_REQUEST�protocol_versionZHTTP_VERSION_NOT_SUPPORTED�path�
startswith�lstrip�http�clientZ
parse_headers�rfile�MessageClass�headersZLineTooLongZREQUEST_HEADER_FIELDS_TOO_LARGEZ
HTTPException�get�lower�handle_expect_100)r�versionr&�wordsrr.Zbase_version_numberZversion_number�errZconntypeZexpectrrr�
parse_requests�












z$BaseHTTPRequestHandler.parse_requestcCs|jtj�|j�dS)NT)�send_response_onlyrZCONTINUE�end_headers)rrrrr8nsz(BaseHTTPRequestHandler.handle_expect_100cCs�y�|jjd�|_t|j�dkr@d|_d|_d|_|jtj	�dS|jsPd|_
dS|j�s\dSd|j}t||�s�|jtj
d|j�dSt||�}|�|jj�Wn4tjk
r�}z|jd|�d|_
dSd}~XnXdS)NiirTZdo_zUnsupported method (%r)zRequest timed out: %r)r3�readliner$r(r&r!rr,rZREQUEST_URI_TOO_LONGr"r<�hasattr�NOT_IMPLEMENTED�getattr�wfile�flushr
Ztimeout�	log_error)rZmname�method�errr�handle_one_request�s4


z)BaseHTTPRequestHandler.handle_one_requestcCs&d|_|j�x|js |j�qWdS)NT)r"rH)rrrr�handle�szBaseHTTPRequestHandler.handleNcCs
y|j|\}}Wntk
r.d\}}YnX|dkr<|}|dkrH|}|jd||�|j||�|jdd�d}|dkr�|tjtjtjfkr�|j	|t
j|dd�t
j|dd�d�}|jd	d
�}|jd|j
�|jdtt|���|j�|jd
ko�|�r|jj|�dS)N�???zcode %d, message %srr��F)�quote)�code�message�explainzUTF-8�replacezContent-TypezContent-LengthZHEAD)rJrJ)�	responses�KeyErrorrE�
send_response�send_headerrZ
NO_CONTENTZ
RESET_CONTENTZNOT_MODIFIED�error_message_format�html�escape�encode�error_content_typer#r(r>rrC�write)rrMrNrOZshortmsgZlongmsgZbodyZcontentrrrr,�s4
z!BaseHTTPRequestHandler.send_errorcCs:|j|�|j||�|jd|j��|jd|j��dS)NZServerZDate)�log_requestr=rT�version_string�date_time_string)rrMrNrrrrS�s
z$BaseHTTPRequestHandler.send_responsecCsd|jdkr`|dkr0||jkr,|j|d}nd}t|d�s@g|_|jjd|j||fjdd��dS)NzHTTP/0.9rr�_headers_bufferz
%s %d %s
zlatin-1�strict)r!rQr@r^�appendr-rX)rrMrNrrrr=�s


z)BaseHTTPRequestHandler.send_response_onlycCsl|jdkr6t|d�sg|_|jjd||fjdd��|j�dkrh|j�dkrVd|_n|j�d	krhd
|_dS)NzHTTP/0.9r^z%s: %s
zlatin-1r_Z
connectionrTz
keep-aliveF)r!r@r^r`rXr7r")r�keyword�valuerrrrT�s

z"BaseHTTPRequestHandler.send_headercCs"|jdkr|jjd�|j�dS)NzHTTP/0.9s
)r!r^r`�
flush_headers)rrrrr>s
z"BaseHTTPRequestHandler.end_headerscCs(t|d�r$|jjdj|j��g|_dS)Nr^�)r@rCrZ�joinr^)rrrrrcs
z$BaseHTTPRequestHandler.flush_headers�-cCs.t|t�r|j}|jd|jt|�t|��dS)Nz
"%s" %s %s)�
isinstancerrb�log_messager&r#)rrM�sizerrrr[s
z"BaseHTTPRequestHandler.log_requestcGs|j|f|��dS)N)rh)r�format�argsrrrrE!sz BaseHTTPRequestHandler.log_errorcGs&tjjd|j�|j�||f�dS)Nz%s - - [%s] %s
)�sys�stderrrZ�address_string�log_date_time_string)rrjrkrrrrh/sz"BaseHTTPRequestHandler.log_messagecCs|jd|jS)N� )�server_version�sys_version)rrrrr\Esz%BaseHTTPRequestHandler.version_stringcCs |dkrtj�}tjj|dd�S)NT)Zusegmt)�time�emailZutilsZ
formatdate)rZ	timestamprrrr]Isz'BaseHTTPRequestHandler.date_time_stringc	CsBtj�}tj|�\	}}}}}}}}	}
d||j|||||f}|S)Nz%02d/%3s/%04d %02d:%02d:%02d)rsZ	localtime�	monthname)rZnowZyearZmonthZdayZhhZmmZss�x�y�z�srrrroOs
z+BaseHTTPRequestHandler.log_date_time_stringZMonZTueZWedZThuZFriZSatZSunZJanZFebZMarZAprZMayZJunZJulZAugZSepZOctZNovZDeccCs
|jdS)Nr)�client_address)rrrrrn]sz%BaseHTTPRequestHandler.address_stringzHTTP/1.0cCsi|]}|j|jf|�qSr)�phraseZdescription)�.0�vrrr�
<dictcomp>lsz!BaseHTTPRequestHandler.<dictcomp>)NN)N)N)rfrf)N)*rrrrlr9r'rr�__version__rq�DEFAULT_ERROR_MESSAGErU�DEFAULT_ERROR_CONTENT_TYPErYr r<r8rHrIr,rSr=rTr>rcr[rErhr\r]roZweekdaynamerurnr-r1r2ZHTTPMessager4r�__members__�valuesrQrrrrr�s<ig%
5



	c@sxeZdZdeZdd�Zdd�Zdd�Zdd	�Zd
d�Z	dd
�Z
dd�Zej
sVej�ejj�Zejddddd��dS)rzSimpleHTTP/c
Cs.|j�}|r*z|j||j�Wd|j�XdS)N)�	send_head�copyfilerCr)r�frrr�do_GET�s
zSimpleHTTPRequestHandler.do_GETcCs|j�}|r|j�dS)N)r�r)rr�rrr�do_HEAD�sz SimpleHTTPRequestHandler.do_HEADc	Csx|j|j�}d}tjj|�r�tjj|j�}|jjd�s�|jt	j
�|d|d|dd|d|df}tjj|�}|jd|�|j
�dSx6dD]$}tjj||�}tjj|�r�|}Pq�W|j|�S|j|�}yt|d
�}Wn$tk
�r|jt	jd�dSXyZ|jt	j�|jd|�tj|j��}|jd
t|d��|jd|j|j��|j
�|S|j��YnXdS)Nrrrrr�ZLocation�
index.html�	index.htm�rbzFile not foundzContent-typezContent-Length�z
Last-Modified)r�r�)�translate_pathr.�os�isdir�urllib�parseZurlsplit�endswithrSrZMOVED_PERMANENTLYZ
urlunsplitrTr>re�exists�list_directory�
guess_type�open�OSErrorr,�	NOT_FOUND�OK�fstat�filenor#r]�st_mtimer)	rr.r��partsZ	new_partsZnew_url�indexZctypeZfsrrrr��sF


z"SimpleHTTPRequestHandler.send_headc
Cs�ytj|�}Wn"tk
r0|jtjd�dSX|jdd�d�g}ytjj	|j
dd�}Wn tk
r|tjj	|�}YnXtj
|dd�}tj�}d	|}|jd
�|jd�|jd|�|jd
|�|jd|�|jd�x~|D]v}tj
j||�}|}	}
tj
j|��r"|d}	|d}
tj
j|��r8|d}	|jdtjj|
dd�tj
|	dd�f�q�W|jd�dj|�j|d�}tj�}|j|�|jd�|jtj�|jdd|�|jdtt|���|j�|S)NzNo permission to list directorycSs|j�S)N)r7)�arrr�<lambda>�sz9SimpleHTTPRequestHandler.list_directory.<locals>.<lambda>)�key�
surrogatepass)�errorsF)rLzDirectory listing for %szZ<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">z
<html>
<head>z@<meta http-equiv="Content-Type" content="text/html; charset=%s">z<title>%s</title>
</head>z<body>
<h1>%s</h1>z	<hr>
<ul>r�@z<li><a href="%s">%s</a></li>z</ul>
<hr>
</body>
</html>
�
�surrogateescaperzContent-typeztext/html; charset=%szContent-Length) r��listdirr�r,rr��sortr�r��unquoter.�UnicodeDecodeErrorrVrWrl�getfilesystemencodingr`rer��islinkrLrX�io�BytesIOrZ�seekrSr�rTr#r(r>)
rr.�list�rZdisplaypath�enc�title�name�fullnameZdisplaynameZlinknameZencodedr�rrrr��s\







z'SimpleHTTPRequestHandler.list_directorycCs�|jdd�d}|jdd�d}|j�jd�}ytjj|dd�}Wn tk
rbtjj|�}YnXtj|�}|jd�}t	d|�}t
j�}x8|D]0}t
jj
|�s�|t
jt
jfkr�q�t
jj||�}q�W|r�|d7}|S)N�?rr�#rr�)r�)r'r%r�r�r�r�r��	posixpath�normpath�filterr��getcwdr.�dirname�curdir�pardirre)rr.Ztrailing_slashr:Zwordrrrr��s$	



z'SimpleHTTPRequestHandler.translate_pathcCstj||�dS)N)�shutilZcopyfileobj)r�sourceZ
outputfilerrrr�sz!SimpleHTTPRequestHandler.copyfilecCsLtj|�\}}||jkr"|j|S|j�}||jkr>|j|S|jdSdS)Nr)r��splitext�extensions_mapr7)rr.�baseZextrrrr�)s



z#SimpleHTTPRequestHandler.guess_typezapplication/octet-streamz
text/plain)rz.pyz.cz.hN)rrrrrqr�r�r�r�r�r�r��	mimetypesZinitedZinitZ	types_map�copyr��updaterrrrrrs 
	1:
c	Cs�|jd�\}}}tjj|�}|jd�}g}x<|dd�D],}|dkrN|j�q8|r8|dkr8|j|�q8W|r�|j�}|r�|dkr�|j�d}q�|dkr�d}nd}|r�dj||f�}ddj|�|f}dj|�}|S)Nr�rrz..rr���)�	partitionr�r�r�r'�popr`re)	r.�_�query�
path_partsZ
head_parts�partZ	tail_partZ	splitpath�collapsed_pathrrr�_url_collapse_pathNs.


r�cCsptrtSyddl}Wntk
r(dSXy|jd�daWn.tk
rjdtdd�|j�D��aYnXtS)Nrr�nobodyrcss|]}|dVqdS)rNr)r|rvrrr�	<genexpr>�sznobody_uid.<locals>.<genexpr>r�)r��pwd�ImportError�getpwnamrR�maxZgetpwall)r�rrr�
nobody_uid�s r�cCstj|tj�S)N)r��access�X_OK)r.rrr�
executable�sr�c@sReZdZeed�ZdZdd�Zdd�Zdd�Z	d	d
gZ
dd�Zd
d�Zdd�Z
dS)r�forkrcCs$|j�r|j�n|jtjd�dS)NzCan only POST to CGI scripts)�is_cgi�run_cgir,rrA)rrrr�do_POST�s

zCGIHTTPRequestHandler.do_POSTcCs|j�r|j�Stj|�SdS)N)r�r�rr�)rrrrr��szCGIHTTPRequestHandler.send_headcCsPt|j�}|jdd�}|d|�||dd�}}||jkrL||f|_dSdS)NrrTF)r�r.�find�cgi_directories�cgi_info)rr�Zdir_sep�head�tailrrrr��s


zCGIHTTPRequestHandler.is_cgiz/cgi-binz/htbincCst|�S)N)r�)rr.rrr�
is_executable�sz#CGIHTTPRequestHandler.is_executablecCstjj|�\}}|j�dkS)N�.py�.pyw)r�r�)r�r.r�r7)rr.r�r�rrr�	is_python�szCGIHTTPRequestHandler.is_pythonc)Cs�|j\}}|d|}|jdt|�d�}x`|dkr�|d|�}||dd�}|j|�}tjj|�r�||}}|jdt|�d�}q,Pq,W|jd�\}}}	|jd�}|dkr�|d|�||d�}
}n
|d}
}|d|
}|j|�}tjj|��s|j	t
jd|�dStjj|��s2|j	t
j
d|�dS|j|�}
|j�sL|
�rn|j|��sn|j	t
j
d|�dStjtj�}|j�|d	<|jj|d
<d|d<|j|d
<t|jj�|d<|j|d<tjj|�}||d<|j|�|d<||d<|	�r�|	|d<|jd|d<|jj d�}|�r�|j!�}t|�dk�r�ddl"}ddl#}|d|d<|dj$�dk�r�y"|dj%d�}|j&|�j'd�}Wn|j(t)fk
�r�Yn&X|j!d�}t|�dk�r�|d|d<|jj d�dk�r�|jj*�|d<n|jd|d<|jj d�}|�r||d<|jj d �}|�r"||d!<g}xN|jj+d"�D]>}|dd�d#k�rZ|j,|j-��n||d$d�j!d%�}�q4Wd%j.|�|d&<|jj d'�}|�r�||d(<t/d|jj0d)g��}d*j.|�}|�r�||d+<xd<D]}|j1|d��q�W|j2t
j3d-�|j4�|	j5d.d/�}|j�r.|
g}d0|k�r*|j,|�t6�}|j7j8�tj9�}|dk�r�tj:|d�\}}x0t;j;|j<gggd�d�r�|j<j=d��s^P�q^W|�r�|j>d1|�dSy\ytj?|�Wnt@k
�r�YnXtjA|j<jB�d�tjA|j7jB�d�tjC|||�Wn(|jjD|jE|j�tjFd2�YnX�n�ddlG} |g}!|j|��r�tHjI}"|"j$�jJd3��rv|"dd=�|"d>d�}"|"d6g|!}!d0|	k�r�|!j,|	�|jKd7| jL|!��ytM|�}#WntNtOfk
�r�d}#YnX| jP|!| jQ| jQ| jQ|d8�}$|jj$�d9k�r|#dk�r|j<j=|#�}%nd}%x4t;j;|j<jRgggd�d�rN|j<jRjSd��sP�qW|$jT|%�\}&}'|j7jU|&�|'�r||j>d:|'�|$jVjW�|$jXjW�|$jY}(|(�r�|j>d1|(�n
|jKd;�dS)?Nrrrr�rzNo such CGI script (%r)z#CGI script is not a plain file (%r)z!CGI script is not executable (%r)ZSERVER_SOFTWAREZSERVER_NAMEzCGI/1.1ZGATEWAY_INTERFACEZSERVER_PROTOCOLZSERVER_PORTZREQUEST_METHODZ	PATH_INFOZPATH_TRANSLATEDZSCRIPT_NAME�QUERY_STRINGZREMOTE_ADDR�
authorizationrZ	AUTH_TYPEZbasic�ascii�:ZREMOTE_USERzcontent-typeZCONTENT_TYPEzcontent-length�CONTENT_LENGTH�referer�HTTP_REFERER�acceptz	

 ��,ZHTTP_ACCEPTz
user-agent�HTTP_USER_AGENTZcookiez, �HTTP_COOKIE�REMOTE_HOSTzScript output follows�+rp�=zCGI script exit status %#x�zw.exerr�z-uzcommand: %s)�stdin�stdoutrm�envZpostz%szCGI script exited OK)r�r�r�r�r�r�������)Zr�r�r(r�r�r.r�r�r�r,rr��isfileZ	FORBIDDENr��	have_forkr�r��deepcopy�environr\Zserverrr-r#rrr�r�r�rzr5r6r'�base64�binasciir7rXZdecodebytes�decode�Error�UnicodeErrorZget_content_typeZgetallmatchingheadersr`�striprer�Zget_all�
setdefaultrSr�rcrPr�rCrDr��waitpid�selectr3�readrE�setuidr��dup2r��execveZhandle_errorZrequest�_exit�
subprocessrlr�r�rhZlist2cmdliner*�	TypeErrorr)�Popen�PIPEZ_sockZrecvZcommunicaterZrmrr��
returncode))r�dir�restr.�iZnextdirZnextrestZ	scriptdirr�r�ZscriptZ
scriptnameZ
scriptfileZispyr�Zuqrestr�rrZlengthr�r��lineZua�coZ
cookie_str�kZ
decoded_queryrkr��pid�stsrZcmdlineZinterp�nbytes�p�datar�rmZstatusrrrr��s4

























zCGIHTTPRequestHandler.run_cgiN)rrrr@r�r�Zrbufsizer�r�r�r�r�r�r�rrrrr�s
zHTTP/1.0i@rc	Cs�||f}||_|||��b}|jj�}d}t|j|d|dd��y|j�Wn&tk
rttd�tjd�YnXWdQRXdS)Nz>Serving HTTP on {host} port {port} (http://{host}:{port}/) ...rr)rrz&
Keyboard interrupt received, exiting.)	r-r
Zgetsockname�printrjZ
serve_forever�KeyboardInterruptrl�exit)	�HandlerClassZServerClassZprotocolr�bindrZhttpdZsaZ
serve_messagerrr�test�s
r$�__main__z--cgi�
store_truezRun as CGI Server)�action�helpz--bindz-bZADDRESSz8Specify alternate bind address [default: all interfaces])�default�metavarr(rZstorer�z&Specify alternate port [default: 8000])r'r)�type�nargsr()r"rr#).r�__all__Zemail.utilsrtrVZhttp.clientr1r�r�r�r�r	r�r
r	rlrsZurllib.parser�r��argparserr�r�r
rZStreamRequestHandlerrrr�r�r�r�rr$r�ArgumentParser�parser�add_argumentr*�
parse_argsrkZcgiZ
handler_classrr#rrrr�<module>Sshg]0
cookies.cpython-36.opt-2.pyc000064400000026541151732672750011615 0ustar003


 \�S�
@sxddlZddlZdddgZdjZdjZdjZdd	�ZGd
d�de�Z	ej
ejdZedZ
d
d�eed��eeee
��D�Zejed�ded�di�ejdeje��jZdd�Zejd�Zejd�Zdd�Zdddddd d!gZdd"d#d$d%d&d'd(d)d*d+d,d-g
Zdeefd.d/�ZGd0d1�d1e�Z d2Z!e!d3Z"ejd4e!d5e"d6ej#ej$B�Z%Gd7d�de�Z&Gd8d�de&�Z'dS)9�N�CookieError�
BaseCookie�SimpleCookie�z; � cCs$ddl}d|}|j|tdd�dS)NrzvThe .%s setter is deprecated. The attribute will be read-only in future releases. Please use the set() method instead.�)�
stacklevel)�warnings�warn�DeprecationWarning)�setterr	�msg�r�$/usr/lib64/python3.6/http/cookies.py�_warn_deprecated_setter�src@seZdZdS)rN)�__name__�
__module__�__qualname__rrrrr�sz!#$%&'*+-.^_`|~:z
 ()/<=>?@[]{}cCsi|]}d||�qS)z\%03or)�.0�nrrr�
<dictcomp>�sr��"z\"�\z\\z[%s]+cCs*|dkst|�r|Sd|jt�dSdS)Nr)�
_is_legal_key�	translate�_Translator)�strrrr�_quote�srz\\[0-3][0-7][0-7]z[\\].cCsT|dkst|�dkr|S|ddks0|ddkr4|S|dd�}d}t|�}g}x�d|kod|kn�rJtj||�}tj||�}|r�|r�|j||d��Pd	}}|r�|jd�}|r�|jd�}|o�|s�||k�r
|j|||��|j||d�|d}qR|j|||��|jtt||d|d�d���|d}qRWt|�S)
N�rr������r#r#)	�len�
_OctalPatt�search�
_QuotePatt�append�start�chr�int�	_nulljoin)r�ir�resZo_matchZq_match�j�krrr�_unquote�s6


$r1ZMonZTueZWedZThuZFriZSatZSunZJanZFebZMarZAprZMayZJunZJulZAugZSepZOctZNovZDecc	CsRddlm}m}|�}|||�\	}}}}	}
}}}
}d|||||||	|
|fS)Nr)�gmtime�timez#%s, %02d %3s %4d %02d:%02d:%02d GMT)r3r2)ZfutureZweekdaynameZ	monthnamer2r3ZnowZyearZmonthZdayZhhZmmZssZwd�y�zrrr�_getdate�s
r6c	@s�eZdZddddddddd	�Zd
dhZdd
�Zedd��Zejdd��Zedd��Z	e	jdd��Z	edd��Z
e
jdd��Z
dd�Zd3dd�Zdd�Z
ejZdd�Zd d!�Zd"d#�Zefd$d%�Zd&d'�Zd(d)�Zd4d+d,�ZeZd-d.�Zd5d/d0�Zd6d1d2�ZdS)7�Morsel�expiresZPath�CommentZDomainzMax-AgeZSecureZHttpOnlyZVersion)r8�path�commentZdomainzmax-age�secure�httponly�versionr<r=cCs4d|_|_|_x|jD]}tj||d�qWdS)Nr)�_key�_value�_coded_value�	_reserved�dict�__setitem__)�self�keyrrr�__init__&szMorsel.__init__cCs|jS)N)r?)rErrrrF.sz
Morsel.keycCstd�||_dS)NrF)rr?)rErFrrrrF2scCs|jS)N)r@)rErrr�value7szMorsel.valuecCstd�||_dS)NrH)rr@)rErHrrrrH;scCs|jS)N)rA)rErrr�coded_value@szMorsel.coded_valuecCstd�||_dS)NrI)rrA)rErIrrrrIDscCs2|j�}||jkr td|f��tj|||�dS)NzInvalid attribute %r)�lowerrBrrCrD)rE�K�VrrrrDIs
zMorsel.__setitem__NcCs.|j�}||jkr td|f��tj|||�S)NzInvalid attribute %r)rJrBrrC�
setdefault)rErF�valrrrrMOs
zMorsel.setdefaultcCs>t|t�stStj||�o<|j|jko<|j|jko<|j|jkS)N)�
isinstancer7�NotImplementedrC�__eq__r@r?rA)rE�morselrrrrQUs
z
Morsel.__eq__cCs$t�}tj||�|jj|j�|S)N)r7rC�update�__dict__)rErRrrr�copy_szMorsel.copycCsVi}x@t|�j�D]0\}}|j�}||jkr:td|f��|||<qWtj||�dS)NzInvalid attribute %r)rC�itemsrJrBrrS)rE�values�datarFrNrrrrSes
z
Morsel.updatecCs|j�|jkS)N)rJrB)rErKrrr�
isReservedKeynszMorsel.isReservedKeycCsh|tkr ddl}|jdtdd�|j�|jkr<td|f��t|�sRtd|f��||_||_	||_
dS)NrzSLegalChars parameter is deprecated, ignored and will be removed in future versions.r)rz Attempt to set a reserved key %rzIllegal key %r)�_LegalCharsr	r
rrJrBrrr?r@rA)rErFrNZ	coded_valZ
LegalCharsr	rrr�setqsz
Morsel.setcCs|j|j|jd�S)N)rFrHrI)r?r@rA)rErrr�__getstate__�szMorsel.__getstate__cCs"|d|_|d|_|d|_dS)NrFrHrI)r?r@rA)rE�staterrr�__setstate__�s

zMorsel.__setstate__�Set-Cookie:cCsd||j|�fS)Nz%s %s)�OutputString)rE�attrs�headerrrr�output�sz
Morsel.outputcCsd|jj|j�fS)Nz<%s: %s>)�	__class__rr`)rErrr�__repr__�szMorsel.__repr__cCsd|j|�jdd�S)Nz�
        <script type="text/javascript">
        <!-- begin hiding
        document.cookie = "%s";
        // end hiding -->
        </script>
        rz\")r`�replace)rErarrr�	js_output�szMorsel.js_outputcCs(g}|j}|d|j|jf�|dkr,|j}t|j��}x�|D]�\}}|dkrPq>||krZq>|dkr�t|t�r�|d|j|t|�f�q>|dkr�t|t�r�|d|j||f�q>|dkr�t|t	�r�|d|j|t
|�f�q>||jk�r|�r|t	|j|��q>|d|j||f�q>Wt|�S)Nz%s=%srr8zmax-agez%s=%dr;)
r(rFrIrB�sortedrVrOr+r6rr�_flags�_semispacejoin)rEra�resultr(rVrFrHrrrr`�s,zMorsel.OutputString)N)Nr_)N)N)rrrrBrirG�propertyrFrrHrIrDrMrQ�object�__ne__rUrSrYrZr[r\r^rc�__str__rergr`rrrrr7s>
	


r7z,\w\d!#%&'~_`><@,:/\$\*\+\-\.\^\|\)\(\?\}\{\=z\[\]z�
    \s*                            # Optional whitespace at start of cookie
    (?P<key>                       # Start of group 'key'
    [a	]+?   # Any word of at least one letter
    )                              # End of group 'key'
    (                              # Optional group: there may not be a value.
    \s*=\s*                          # Equal Sign
    (?P<val>                         # Start of group 'val'
    "(?:[^\\"]|\\.)*"                  # Any doublequoted string
    |                                  # or
    \w{3},\s[\w\d\s-]{9,11}\s[\d:]{8}\sGMT  # Special case for "expires" attr
    |                                  # or
    [a-]*      # Any word or empty string
    )                                # End of group 'val'
    )?                             # End of optional value group
    \s*                            # Any number of spaces.
    (\s+|;|$)                      # Ending either at space, semicolon, or EOS.
    c@sjeZdZdd�Zdd�Zddd�Zdd	�Zd
d�Zddd�ZeZ	dd�Z
ddd�Zdd�Ze
fdd�ZdS)rcCs||fS)Nr)rErNrrr�value_decode�szBaseCookie.value_decodecCst|�}||fS)N)r)rErN�strvalrrr�value_encode�szBaseCookie.value_encodeNcCs|r|j|�dS)N)�load)rE�inputrrrrG�szBaseCookie.__init__cCs.|j|t��}|j|||�tj|||�dS)N)�getr7r[rCrD)rErFZ
real_valuerI�MrrrZ__set�szBaseCookie.__setcCs:t|t�rtj|||�n|j|�\}}|j|||�dS)N)rOr7rCrDrr�_BaseCookie__set)rErFrH�rval�cvalrrrrDs
zBaseCookie.__setitem__�Set-Cookie:�
cCs>g}t|j��}x"|D]\}}|j|j||��qW|j|�S)N)rhrVr(rc�join)rErarb�seprkrVrFrHrrrrc
s
zBaseCookie.outputcCsNg}t|j��}x(|D] \}}|jd|t|j�f�qWd|jjt|�fS)Nz%s=%sz<%s: %s>)rhrVr(�reprrHrdr�
_spacejoin)rE�lrVrFrHrrrres
zBaseCookie.__repr__cCs:g}t|j��}x |D]\}}|j|j|��qWt|�S)N)rhrVr(rgr,)rErarkrVrFrHrrrrgs
zBaseCookie.js_outputcCs8t|t�r|j|�nx|j�D]\}}|||<q WdS)N)rOr�_BaseCookie__parse_stringrV)rEZrawdatarFrHrrrrs&s

zBaseCookie.loadcCspd}t|�}g}d}d}d}�xd|ko2|kn�r|j||�}	|	sLP|	jd�|	jd�}
}|	jd�}|
ddkr�|s~q |j||
dd�|f�q |
j�tjkr�|s�dS|dkr�|
j�tjkr�|j||
df�q�dSn|j||
t	|�f�q |dk	�r|j||
|j
|�f�d}q dSq Wd}xF|D]>\}
}
}|
|k�rH|||
<n|\}}|j|
||�||
}�q*WdS)	NrFr rrFrN�$T)r$�match�group�endr(rJr7rBrir1rprw)rErZpattr-rZparsed_itemsZmorsel_seenZTYPE_ATTRIBUTEZ
TYPE_KEYVALUEr�rFrHrv�tprxryrrrZ__parse_string4sF



zBaseCookie.__parse_string)N)Nrzr{)N)rrrrprrrGrwrDrcrorergrs�_CookiePatternr�rrrrr�s		
	

c@seZdZdd�Zdd�ZdS)rcCst|�|fS)N)r1)rErNrrrrpxszSimpleCookie.value_decodecCst|�}|t|�fS)N)rr)rErNrqrrrrr{szSimpleCookie.value_encodeN)rrrrprrrrrrrqs)(�re�string�__all__r|r,rjrr�	ExceptionrZ
ascii_lettersZdigitsrZZ_UnescapedCharsr[�range�map�ordrrS�compile�escape�	fullmatchrrr%r'r1Z_weekdaynameZ
_monthnamer6rCr7Z_LegalKeyCharsZ_LegalValueChars�ASCII�VERBOSEr�rrrrrr�<module>�sD
	

2J
cookiejar.cpython-36.opt-2.pyc000064400000112411151732672750012117 0ustar003

���ir+�@s&ddddddddgZdd	lZdd	lZdd	lZdd	lZdd	lZdd	lZydd	lZ	Wne
k
rldd	lZ	YnXdd	lZ
dd
lmZdZd	add
�Zee
jj�ZdZdd�ZdZdd�ZdddddddgZdddddd d!d"d#d$d%d&gZgZxeD]Zejej ��q�Wdtd'd(�Z!dud)d*�Z"d	d	d	d	d+�Z#ej$d,ej%�Z&d-d.�Z'd/d0�Z(ej$d1ej%�Z)ej$d2ej*ej%B�Z+ej$d3ej,ej%B�Z-d4d5�Z.ej$d6ej,ej%B�Z/d7d8�Z0d9d:�Z1ej$d;�Z2ej$d<�Z3ej$d=�Z4ej$d>�Z5d?d@�Z6ej$dA�Z7dBdC�Z8dDdE�Z9dFdG�Z:ej$dHej%�Z;dIdJ�Z<dKdL�Z=dMdN�Z>dOdP�Z?ej$dQej%�Z@dRdS�ZAdTdU�ZBdVdW�ZCdXdY�ZDdZZEej$d[�ZFd\d]�ZGd^d_�ZHd`da�ZIdbdc�ZJGddd�d�ZKGded�d�ZLGdfd�deL�ZMdgdh�ZNdidj�ZOGdkdl�dl�ZPGdmd�d�ZQGdnd�deR�ZSGdod�deQ�ZTdpdq�ZUGdrd�deT�ZVGdsd�deT�ZWd	S)v�Cookie�	CookieJar�CookiePolicy�DefaultCookiePolicy�
FileCookieJar�LWPCookieJar�	LoadError�MozillaCookieJar�N)�timegmFcGs(tsdStsddl}|jd�atj|�S)Nr	zhttp.cookiejar)�debug�logger�loggingZ	getLogger)�argsr
�r�&/usr/lib64/python3.6/http/cookiejar.py�_debug.s
rzQa filename was not supplied (nor was the CookieJar instance initialised with one)cCsJddl}ddl}ddl}|j�}|jd|�|j�}|jd|dd�dS)Nr	zhttp.cookiejar bug!
%s�)�
stacklevel)�io�warnings�	traceback�StringIO�	print_exc�getvalue�warn)rrr�f�msgrrr�_warn_unhandled_exception<s
ri�cCs�|dd�\}}}}}}|tkr�d|ko2dknr�d|koJdknr�d|kobdknr�d|kozdknr�d|ko�dknr�t|�SdSdS)	N����r	��;�=)�
EPOCH_YEARr
)�tt�year�monthZmday�hour�min�secrrr�_timegmKs
8Hr,ZMonZTueZWedZThuZFriZSatZSunZJanZFebZMarZAprZMayZJunZJulZAugZSepZOctZNovZDeccCs@|dkrtjj�}ntjj|�}d|j|j|j|j|j|jfS)Nz%04d-%02d-%02d %02d:%02d:%02dZ)	�datetime�utcnow�utcfromtimestampr'r(�dayr)�minute�second)�t�dtrrr�	time2isozYs
r5cCsR|dkrtjj�}ntjj|�}dt|j�|jt|jd|j|j	|j
|jfS)Nz#%s, %02d-%s-%04d %02d:%02d:%02d GMTr)r-r.r/�DAYSZweekdayr0�MONTHSr(r'r)r1r2)r3r4rrr�
time2netscapelsr8)ZGMT�UTCZUT�Zz^([-+])?(\d\d?):?(\d\d)?$cCsjd}|tkrd}nTtj|�}|rfdt|jd��}|jd�rR|dt|jd��}|jd�dkrf|}|S)Nr	ir��<r�-)�	UTC_ZONES�TIMEZONE_RE�search�int�group)�tz�offset�mrrr�offset_from_tz_string�s

rFc
Cs�t|�}|tjkrdSytj|j��d}WnXtk
r�yt|�}Wntk
r\dSXd|kopdknr||}ndSYnX|dkr�d}|dkr�d}|dkr�d}t|�}t|�}t|�}t|�}|dk�r0tjtj��d}|d}	|}
|||	}|	|
}	t	|	�dk�r0|	dk�r(|d}n|d}t
|||||||f�}|dk	�r�|dk�r^d}|j�}t|�}|dk�r|dS||}|S)Nrr r	i��d�2r9)
rAr-ZMAXYEAR�MONTHS_LOWER�index�lower�
ValueError�timeZ	localtime�absr,�upperrF)
r0�mon�yr�hrr*r+rCZimonZcur_yrrEZtmpr3rDrrr�	_str2time�sV







rSzV^[SMTWF][a-z][a-z], (\d\d) ([JFMASOND][a-z][a-z]) (\d\d\d\d) (\d\d):(\d\d):(\d\d) GMT$z+^(?:Sun|Mon|Tue|Wed|Thu|Fri|Sat)[a-z]*,?\s*a�^
    (\d\d?)            # day
       (?:\s+|[-\/])
    (\w+)              # month
        (?:\s+|[-\/])
    (\d+)              # year
    (?:
          (?:\s+|:)    # separator before clock
       (\d\d?):(\d\d)  # hour:min
       (?::(\d\d))?    # optional seconds
    )?                 # optional clock
       \s*
    ([-+]?\d{2,4}|(?![APap][Mm]\b)[A-Za-z]+)? # timezone
       \s*
    (?:\(\w+\))?       # ASCII representation of timezone in parens.
       \s*$cCs�tj|�}|rl|j�}tj|dj��d}t|d�|t|d�t|d�t|d�t|d�f}t|�S|j	�}t
jd|d�}dgd\}}}}}}	}
tj|�}|dk	r�|j�\}}}}}}	}
ndSt
||||||	|
�S)	Nrrr	r;����)�STRICT_DATE_REr@�groupsrIrJrKrA�floatr,�lstrip�
WEEKDAY_RE�sub�LOOSE_HTTP_DATE_RErS)�textrE�grPr&r0rQrRr*r+rCrrr�	http2time�s
"
raa�^
    (\d{4})              # year
       [-\/]?
    (\d\d?)              # numerical month
       [-\/]?
    (\d\d?)              # day
   (?:
         (?:\s+|[-:Tt])  # separator before clock
      (\d\d?):?(\d\d)    # hour:min
      (?::?(\d\d(?:\.\d*)?))?  # optional seconds (and fractional)
   )?                    # optional clock
      \s*
   ([-+]?\d\d?:?(:?\d\d)?
    |Z|z)?               # timezone  (Z is "zero meridian", i.e. GMT)
      \s*$c
Csd|j�}dgd\}}}}}}}tj|�}|dk	rL|j�\}}}}}}}}	ndSt|||||||�S)NrW)r[�ISO_DATE_REr@rYrS)
r_r0rPrQrRr*r+rCrE�_rrr�iso2time's

rdcCs*|jd�\}}|jd|�|j|d�S)Nr	)�span�string)�match�start�endrrr�	unmatchedHsrjz^\s*([^=\s;,]+)z&^\s*=\s*\"([^\"\\]*(?:\\.[^\"\\]*)*)\"z^\s*=\s*([^\s;,]*)z\\(.)c
Csg}�x|D]�}|}g}x�|r�tj|�}|r�t|�}|jd�}tj|�}|rlt|�}|jd�}tjd|�}n.tj|�}|r�t|�}|jd�}|j�}nd}|j	||f�q|j
�jd�r�|j
�dd�}|r�|j	|�g}qtj
dd|�\}}	|}qW|r|j	|�qW|S)Nrz\1�,z^[=\s;]*rV)�HEADER_TOKEN_REr@rjrB�HEADER_QUOTED_VALUE_RE�HEADER_ESCAPE_REr]�HEADER_VALUE_RE�rstrip�appendr[�
startswith�re�subn)
Z
header_values�resultr_Z	orig_text�pairsrE�name�valueZnon_junkZ
nr_junk_charsrrr�split_header_wordsQs>.







ryz([\"\\])cCs�g}xt|D]l}g}xN|D]F\}}|dk	rTtjd|�sHtjd|�}d|}d||f}|j|�qW|r
|jdj|��q
Wdj|�S)Nz^\w+$z\\\1z"%s"z%s=%sz; z, )rsr@�HEADER_JOIN_ESCAPE_REr]rq�join)Zlists�headersrv�attr�k�vrrr�join_header_words�s
r�cCs0|jd�r|dd�}|jd�r,|dd�}|S)N�"r���)rr�endswith)r_rrr�strip_quotes�s


r�cCsd}g}x�|D]�}g}d}x�t|jd	��D]�\}}|j�}|jd
�\}}	}
|j�}|sd|dkr*Pnq*|	rp|
j�nd}
|dkr�|j�}||kr�|}|dkr�|
dk	r�t|
�}
d}n|dkr�|
dk	r�tt|
��}
|j||
f�q*W|r|�s�|jd�|j|�qW|S)N�expires�domain�path�secure�version�port�max-ageF�;�=r	T�0)r�r�r�r�r�r�r�)r�r�)�	enumerate�split�strip�	partitionrKr�rarq)Z
ns_headersZknown_attrsruZ	ns_headerrv�version_setZiiZparam�key�sep�val�lcrrr�parse_ns_headers�s@

r�z\.\d+$cCs:tj|�rdS|dkrdS|ddks2|ddkr6dSdS)NFrVr	�.rTr�)�IPV4_REr@)r_rrr�is_HDNs
r�cCsl|j�}|j�}||krdSt|�s(dS|j|�}|dksB|dkrFdS|jd�sTdSt|dd��shdSdS)NTFrr	r�r�)rKr��rfindrr)�A�B�irrr�domain_matchs

r�cCstj|�rdSdS)NFT)r�r@)r_rrr�liberal_is_HDNBs
r�cCsb|j�}|j�}t|�ot|�s0||kr,dSdS|jd�}|rL|j|�rLdS|r^||kr^dSdS)NTFr�)rKr�rrr�)r�r��initial_dotrrr�user_domain_matchLs
r�z:\d+$cCsB|j�}tjj|�d}|dkr,|jdd�}tjd|d�}|j�S)NrrVZHost)�get_full_url�urllib�parseZurlparseZ
get_header�cut_port_rer]rK)�request�url�hostrrr�request_hostasr�cCs6t|�}}|jd�dkr.tj|�r.|d}||fS)Nr�rz.localr�)r��findr�r@)r��erhn�req_hostrrr�eff_request_hostqsr�cCs4|j�}tjj|�}t|j�}|jd�s0d|}|S)N�/)r�r�r�Zurlsplit�escape_pathr�rr)r�r��partsr�rrr�request_path|s

r�cCs^|j}|jd�}|dkrV||dd�}yt|�WqZtk
rRtd|�dSXnt}|S)N�:r	rznonnumeric port: '%s')r�r�rArLr�DEFAULT_HTTP_PORT)r�r�r�r�rrr�request_port�s

r�z%/;:@&=+$,!~*'()z%([0-9a-fA-F][0-9a-fA-F])cCsd|jd�j�S)Nz%%%sr)rBrO)rgrrr�uppercase_escaped_char�sr�cCstjj|t�}tjt|�}|S)N)r�r�Zquote�HTTP_PATH_SAFE�ESCAPED_CHAR_REr]r�)r�rrrr��s
r�cCsP|jd�}|dkrL||dd�}|jd�}t|�rL|dksD|dkrLd|S|S)Nr�r	rZlocal)r�r�)�hr��brrr�reach�s

r�cCs$t|�}t|t|j��sdSdSdS)NTF)r�r�r�Zorigin_req_host)r�r�rrr�is_third_party�s
r�c@sJeZdZddd�Zdd�Zddd�Zd	d
�Zddd�Zd
d�Zdd�Z	dS)rFcCs�|dk	rt|�}|dk	r$tt|��}|dkr<|dkr<td��||_||_||_||_||_|j�|_	||_
||_|	|_|
|_
||_||_|
|_||_||_||_tj|�|_dS)NTz-if port is None, port_specified must be false)rArZrLr�rwrxr��port_specifiedrKr��domain_specified�domain_initial_dotr��path_specifiedr�r��discard�comment�comment_url�rfc2109�copy�_rest)�selfr�rwrxr�r�r�r�r�r�r�r�r�r�r�r��restr�rrr�__init__�s.

zCookie.__init__cCs
||jkS)N)r�)r�rwrrr�has_nonstandard_attrszCookie.has_nonstandard_attrNcCs|jj||�S)N)r��get)r�rw�defaultrrr�get_nonstandard_attrszCookie.get_nonstandard_attrcCs||j|<dS)N)r�)r�rwrxrrr�set_nonstandard_attrszCookie.set_nonstandard_attrcCs,|dkrtj�}|jdk	r(|j|kr(dSdS)NTF)rMr�)r��nowrrr�
is_expireds
zCookie.is_expiredcCsX|jdkrd}n
d|j}|j||j}|jdk	rFd|j|jf}n|j}d||fS)NrVr�z%s=%sz<Cookie %s for %s>)r�r�r�rxrw)r��p�limitZ	namevaluerrr�__str__%s


zCookie.__str__cCspg}x,dD]$}t||�}|jd|t|�f�q
W|jdt|j��|jdt|j��d|jjdj|�fS)Nr�rwrxr�r�r�r�r�r�r�r�r�r�r�r�z%s=%szrest=%sz
rfc2109=%sz%s(%s)z, )r�rwrxr�r�r�r�r�r�r�r�r�r�r�r�)�getattrrq�reprr�r��	__class__�__name__r{)r�rrwr}rrr�__repr__/s
zCookie.__repr__)F)N)N)
r��
__module__�__qualname__r�r�r�r�r�r�r�rrrrr�s
 


c@s,eZdZdd�Zdd�Zdd�Zdd�Zd	S)
rcCs
t��dS)N)�NotImplementedError)r��cookier�rrr�set_okGszCookiePolicy.set_okcCs
t��dS)N)r�)r�r�r�rrr�	return_okPszCookiePolicy.return_okcCsdS)NTr)r�r�r�rrr�domain_return_okTszCookiePolicy.domain_return_okcCsdS)NTr)r�r�r�rrr�path_return_okYszCookiePolicy.path_return_okN)r�r�r�r�r�r�r�rrrrr>s		c@s�eZdZdZdZdZdZeeBZdddddddddeddfdd	�Zd
d�Z	dd
�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zdd�Zdd�Zd d!�Zd"d#�Zd$d%�Zd&d'�Zd(d)�Zd*d+�Zd,d-�Zd.d/�Zd0d1�Zd2d3�Zd4d5�ZdS)6rrrrTr	NTFc

Csp||_||_||_||_||_||_|	|_|
|_||_||_	|dk	rPt
|�|_nf|_|dk	rft
|�}||_dS)N)
�netscape�rfc2965�rfc2109_as_netscape�hide_cookie2�
strict_domain�strict_rfc2965_unverifiable�strict_ns_unverifiable�strict_ns_domain�strict_ns_set_initial_dollar�strict_ns_set_path�tuple�_blocked_domains�_allowed_domains)
r��blocked_domains�allowed_domainsr�r�r�r�r�r�r�r�r�r�rrrr�is 
zDefaultCookiePolicy.__init__cCs|jS)N)r�)r�rrrr��sz#DefaultCookiePolicy.blocked_domainscCst|�|_dS)N)r�r�)r�r�rrr�set_blocked_domains�sz'DefaultCookiePolicy.set_blocked_domainscCs"x|jD]}t||�rdSqWdS)NTF)r�r�)r�r�Zblocked_domainrrr�
is_blocked�s
zDefaultCookiePolicy.is_blockedcCs|jS)N)r�)r�rrrr��sz#DefaultCookiePolicy.allowed_domainscCs|dk	rt|�}||_dS)N)r�r�)r�r�rrr�set_allowed_domains�sz'DefaultCookiePolicy.set_allowed_domainscCs0|jdkrdSx|jD]}t||�rdSqWdS)NFT)r�r�)r�r�Zallowed_domainrrr�is_not_allowed�s

z"DefaultCookiePolicy.is_not_allowedcCsBtd|j|j�x,dD]$}d|}t||�}|||�sd	SqWd
S)Nz - checking cookie %s=%sr��
verifiabilityrwr�r�r�Zset_ok_FT)r�r�rwr�r�r�)rrwrxr�)r�r�r��n�fn_name�fnrrrr��s


zDefaultCookiePolicy.set_okcCs^|jdkrtd|j|j�dS|jdkr<|jr<td�dS|jdkrZ|jrZtd�dSdS)Nz0   Set-Cookie2 without version attribute (%s=%s)Fr	z$   RFC 2965 cookies are switched offz$   Netscape cookies are switched offT)r�rrwrxr�r�)r�r�r�rrr�set_ok_version�s
z"DefaultCookiePolicy.set_ok_versioncCsJ|jrFt|�rF|jdkr*|jr*td�dS|jdkrF|jrFtd�dSdS)Nr	z>   third-party RFC 2965 cookie during unverifiable transactionFz>   third-party Netscape cookie during unverifiable transactionT)�unverifiabler�r�r�rr�)r�r�r�rrr�set_ok_verifiability�sz(DefaultCookiePolicy.set_ok_verifiabilitycCs0|jdkr,|jr,|jjd�r,td|j�dSdS)Nr	�$z'   illegal name (starts with '$'): '%s'FT)r�r�rwrrr)r�r�r�rrr�set_ok_name�s
zDefaultCookiePolicy.set_ok_namecCsL|jrHt|�}|jdks(|jdkrH|jrH|j|j�rHtd|j|�dSdS)Nr	z7   path attribute %s is not a prefix of request path %sFT)r�r�r�r�rrr�r)r�r�r��req_pathrrr�set_ok_path�s

zDefaultCookiePolicy.set_ok_pathc
Cs�|j|j�rtd|j�dS|j|j�r8td|j�dS|j�r�t|�\}}|j}|jr�|jd�dkr�|jd�}|jdd|�}|dkr�||dd�}||d|�}	|	j	�d$kr�t
|�dkr�td|�dS|jd��r�|dd�}
n|}
|
jd�dk}|�r|dk�rtd|�dS|j
dk�rb|j|��rb|jd��rbd|j|��rbtd ||�dS|j
dk�s||j|j@�r�t||��s�td!||�dS|j
dk�s�|j|j@�r�|dt
|��}|jd�dk�r�tj|��r�td"||�dSd#S)%Nz"   domain %s is in user block-listFz&   domain %s is not in user allow-listr�rr	r�co�ac�com�edu�org�net�gov�milrA�aero�biz�cat�coop�info�jobs�mobi�museumrw�pro�travel�euz&   country-code second level domain %sz.localz/   non-local domain %s contains no embedded dotzO   effective request-host %s (even with added initial dot) does not end with %sz5   effective request-host %s does not domain-match %sz.   host prefix %s for domain %s contains a dotT)rrrrrrrrrArr	r
rrr
rrrwrrr)r�r�rr�r�r�r��countr�rK�lenrrr�r�r�r��DomainRFC2965Matchr��DomainStrictNoDotsr�r@)
r�r�r�r�r�r�r��jZtldZsldZundotted_domainZ
embedded_dotsZhost_prefixrrr�
set_ok_domain�sf

z!DefaultCookiePolicy.set_ok_domaincCs�|jr�t|�}|dkrd}nt|�}x\|jjd�D]:}yt|�Wntk
r`td|�dSX||kr2Pq2Wtd||j�dSdS)N�80rkz   bad port %s (not numeric)Fz$   request port (%s) not found in %sT)r�r��strr�r�rArLr)r�r�r��req_portr�rrr�set_ok_port%s"

zDefaultCookiePolicy.set_ok_portcCsBtd|j|j�x,dD]$}d|}t||�}|||�sd	SqWd
S)Nz - checking cookie %s=%sr�r�r�r�r�r�Z
return_ok_FT)r�r�r�r�r�r�)rrwrxr�)r�r�r�r�r�r�rrrr�:s	


zDefaultCookiePolicy.return_okcCs@|jdkr|jrtd�dS|jdkr<|jr<td�dSdS)Nr	z$   RFC 2965 cookies are switched offFz$   Netscape cookies are switched offT)r�r�rr�)r�r�r�rrr�return_ok_versionLsz%DefaultCookiePolicy.return_ok_versioncCsJ|jrFt|�rF|jdkr*|jr*td�dS|jdkrF|jrFtd�dSdS)Nr	z>   third-party RFC 2965 cookie during unverifiable transactionFz>   third-party Netscape cookie during unverifiable transactionT)r�r�r�r�rr�)r�r�r�rrr�return_ok_verifiabilityUsz+DefaultCookiePolicy.return_ok_verifiabilitycCs |jr|jdkrtd�dSdS)NZhttpsz(   secure cookie with non-secure requestFT)r��typer)r�r�r�rrr�return_ok_secureasz$DefaultCookiePolicy.return_ok_securecCs|j|j�rtd�dSdS)Nz   cookie expiredFT)r��_nowr)r�r�r�rrr�return_ok_expiresgsz%DefaultCookiePolicy.return_ok_expirescCsP|jrLt|�}|dkrd}x0|jjd�D]}||kr(Pq(Wtd||j�dSdS)Nrrkz0   request port %s does not match cookie port %sFT)r�r�r�r)r�r�r�rr�rrr�return_ok_portms
z"DefaultCookiePolicy.return_ok_portcCs�t|�\}}|j}|r,|jd�r,d|}n|}|jdkrb|j|j@rb|jrb||krbtd�dS|jdkr�t||�r�td||�dS|jdkr�d|j	|�r�td||�dSdS)Nr�r	zQ   cookie with unspecified domain does not string-compare equal to request domainFzQ   effective request-host name %s does not domain-match RFC 2965 cookie domain %sz;   request-host %s does not match Netscape cookie domain %sT)
r�r�rrr�r��DomainStrictNonDomainr�rr�r�)r�r�r�r�r�r��	dotdomainrrr�return_ok_domain{s&

z$DefaultCookiePolicy.return_ok_domaincCs�t|�\}}|jd�sd|}|jd�s0d|}|rJ|jd�rJd|}n|}|j|�p`|j|�sfdS|j|�r~td|�dS|j|�r�td|�dSdS)Nr�Fz"   domain %s is in user block-listz&   domain %s is not in user allow-listT)r�rrr�r�rr�)r�r�r�r�r�r%rrrr��s"






z$DefaultCookiePolicy.domain_return_okcCs0td|�t|�}|j|�s,td||�dSdS)Nz- checking cookie path=%sz  %s does not path-match %sFT)rr�rr)r�r�r�r�rrrr��s

z"DefaultCookiePolicy.path_return_ok)r�r�r�rr$rZ
DomainLiberalZDomainStrictr�r�r�r�r�r�r�r�r�r�r�r�rrr�rrr r"r#r&r�r�rrrrr_sJ	;	cCst|j��}t|j|�S)N)�sorted�keys�mapr�)Zadictr(rrr�vals_sorted_by_key�sr*ccsZt|�}xL|D]D}d}y
|jWntk
r4YnXd}t|�EdH|s|VqWdS)NFT)r*�items�AttributeError�
deepvalues)�mapping�values�objrrrr-�s

r-c@seZdZdS)�AbsentN)r�r�r�rrrrr1�sr1c@s�eZdZejd�Zejd�Zejd�Zejd�Zejd�Z	ejdej
�Zd2dd	�Zd
d�Z
dd
�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zd d!�Zd"d#�Zd3d$d%�Zd&d'�Zd(d)�Zd*d+�Zd,d-�Zd.d/�Zd0d1�Z dS)4rz\Wz([\"\\])z\.?[^.]*z[^.]*z^\.+z^\#LWP-Cookies-(\d+\.\d+)NcCs(|dkrt�}||_tj�|_i|_dS)N)r�_policy�
_threading�RLock�
_cookies_lock�_cookies)r��policyrrrr��s

zCookieJar.__init__cCs
||_dS)N)r2)r�r7rrr�
set_policy�szCookieJar.set_policycCs�g}|jj||�sgStd|�|j|}xd|j�D]X}|jj||�sHq4||}x:|j�D].}|jj||�svtd�qZtd�|j|�qZWq4W|S)Nz!Checking %s for cookies to returnz   not returning cookiez   it's a match)	r2r�rr6r(r�r/r�rq)r�r�r��cookiesZcookies_by_pathr�Zcookies_by_namer�rrr�_cookies_for_domain�s 

zCookieJar._cookies_for_domaincCs.g}x$|jj�D]}|j|j||��qW|S)N)r6r(�extendr:)r�r�r9r�rrr�_cookies_for_request�szCookieJar._cookies_for_requestc	CsF|jdd�dd�d}g}�x$|D�]}|j}|sLd}|dkrL|jd|�|jdk	r~|jj|j�r~|dkr~|jjd|j�}n|j}|jdkr�|j|j�n|jd	|j|f�|dkr"|j	r�|jd
|j
�|jjd��r|j}|j
o�|jd��r|dd�}|jd
|�|jdk	r"d}|j�r4|d|j}|j|�q"W|S)NcSs
t|j�S)N)rr�)�arrr�<lambda>sz)CookieJar._cookie_attrs.<locals>.<lambda>T)r��reverseFr	z$Version=%sz\\\1z%s=%sz
$Path="%s"r�rz$Domain="%s"z$Portz="%s")�sortr�rqrx�non_word_rer@�quote_rer]rwr�r�r�rrr�r�r�)	r�r9r��attrsr�r�rxr�r�rrr�
_cookie_attrss>



zCookieJar._cookie_attrsc
Cs�td�|jj�z�ttj��|j_|_|j|�}|j|�}|r^|j	d�s^|j
ddj|��|jjr�|jj
r�|j	d�r�x$|D]}|jdkr�|j
dd�Pq�WWd|jj�X|j�dS)N�add_cookie_headerrz; ZCookie2rz$Version="1")rr5�acquirerArMr2r!r<rDZ
has_headerZadd_unredirected_headerr{r�r�r��release�clear_expired_cookies)r�r�r9rCr�rrrrE?s$






zCookieJar.add_cookie_headercCs�g}d}d}�x||D�]r}|d\}}d}d}	i}
i}�x4|d
d�D�]"\}}
|j�}||ksh||krl|}||kr�|
dkr�d}
||
kr�qF|dkr�|
dkr�td�d}	P|
j�}
|dkr�|r�qF|
dkr�td�qF|dk�rd}yt|
�}
Wn$tk
�rtd�d}	PYnXd}|j|
}
||k�s2||k�rb|
dk�rX|dk�rXtd|�d}	P|
|
|<qF|
||<qFW|	�rvq|j|||
|f�qW|S)Nr�r�r�r��max-ager�r�r�r��
commenturlr	FrTz%   missing value for domain attributezM   missing or invalid value for expires attribute: treating as session cookiez?   missing or invalid (non-numeric) value for max-age attributez!   missing value for %s attribute)r�r�)r�r�rIr�r�r�r�rJ)r�r�rJ)rKrrArLr!rq)r��	attrs_set�
cookie_tuples�
boolean_attrs�value_attrsZcookie_attrsrwrxZmax_age_setZ
bad_cookie�standardr�r~rr�rrr�_normalized_cookie_tuples`sl






z#CookieJar._normalized_cookie_tuplesc!Cs$|\}}}}|jdt�}|jdt�}|jdt�}	|jdt�}
|jdd�}|dk	rryt|�}Wntk
rpdSX|jdd�}|jdd�}
|jd	d�}|jd
d�}|tk	r�|dkr�d}t|�}nXd}t|�}|jd
�}|dk�r|dkr�|d|�}n|d|d�}t|�dk�rd
}|tk	}d}|�r8t|j	d��}|tk�rTt
|�\}}|}n|j	d��shd|}d}|	tk	�r�|	dk�r�t|�}	nd}tj
dd|	�}	nd}	|
tk�r�d}
d}
nH|
|jk�r�y|j|||�Wntk
�r�YnXtd|||�dSt||||	||||||||
|
|||�S)Nr�r�r�r�r�r�Fr�r�rJrVTr�rr	r�z\s+z2Expiring cookie, domain='%s', path='%s', name='%s'r�)r�r1rArLr�r�r�r�boolrrr�r�rsr]r!�clear�KeyErrorrr)r��tupr�rwrxrOr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rrr�_cookie_from_cookie_tuple�s�








z#CookieJar._cookie_from_cookie_tuplecCs:|j|�}g}x&|D]}|j||�}|r|j|�qW|S)N)rPrUrq)r�rKr�rLr9rTr�rrr�_cookies_from_attrs_sets

z!CookieJar._cookies_from_attrs_setcCsLt|jdd�}|dkr |jj}x&|D]}|jdkr&d|_|r&d|_q&WdS)Nr�rTr	)r�r2r�r�r�)r�r9Z
rfc2109_as_nsr�rrr�_process_rfc2109_cookies&s


z"CookieJar._process_rfc2109_cookiesc
Cs6|j�}|jdg�}|jdg�}|jj}|jj}|r<|s`|rH|s`|rT|s`|rd|rdgSy|jt|�|�}Wntk
r�t�g}YnX|o�|�r2y|jt	|�|�}	Wntk
r�t�g}	YnX|j
|	�|�r"i}
x |D]}d|
|j|j|j
f<q�W|
fdd�}t||	�}	|	�r2|j|	�|S)NzSet-Cookie2z
Set-CookiecSs|j|j|jf}||kS)N)r�r�rw)Z	ns_cookie�lookupr�rrr�no_matching_rfc2965^sz3CookieJar.make_cookies.<locals>.no_matching_rfc2965)rZget_allr2r�r�rVry�	Exceptionrr�rWr�r�rw�filterr;)
r��responser�r|Zrfc2965_hdrsZns_hdrsr�r�r9Z
ns_cookiesrXr�rYrrr�make_cookies2sB






zCookieJar.make_cookiesc
CsN|jj�z2ttj��|j_|_|jj||�r:|j|�Wd|jj�XdS)N)	r5rFrArMr2r!r��
set_cookierG)r�r�r�rrr�set_cookie_if_okhs
zCookieJar.set_cookie_if_okc
Csl|j}|jj�zJ|j|kr&i||j<||j}|j|krDi||j<||j}|||j<Wd|jj�XdS)N)r6r5rFr�r�rwrG)r�r��cZc2Zc3rrrr^us






zCookieJar.set_cookiec
Cs|td|j��|jj�zRttj��|j_|_x6|j||�D]&}|jj	||�r>td|�|j
|�q>WWd|jj�XdS)Nzextract_cookies: %sz setting cookie: %s)rrr5rFrArMr2r!r]r�r^rG)r�r\r�r�rrr�extract_cookies�s

zCookieJar.extract_cookiescCst|dk	r2|dks|dkr td��|j|||=n>|dk	rX|dkrJtd��|j||=n|dk	rj|j|=ni|_dS)Nz8domain and path must be given to remove a cookie by namez.domain must be given to remove cookies by path)rLr6)r�r�r�rwrrrrR�s
zCookieJar.clearcCsH|jj�z,x&|D]}|jr|j|j|j|j�qWWd|jj�XdS)N)r5rFr�rRr�r�rwrG)r�r�rrr�clear_session_cookies�s

zCookieJar.clear_session_cookiescCsT|jj�z8tj�}x*|D]"}|j|�r|j|j|j|j�qWWd|jj�XdS)N)	r5rFrMr�rRr�r�rwrG)r�r�r�rrrrH�s



zCookieJar.clear_expired_cookiescCs
t|j�S)N)r-r6)r�rrr�__iter__�szCookieJar.__iter__cCsd}x|D]}|d}q
W|S)Nr	rr)r�r�r�rrr�__len__�s
zCookieJar.__len__cCs6g}x|D]}|jt|��q
Wd|jjdj|�fS)Nz<%s[%s]>z, )rqr�r�r�r{)r��rr�rrrr��s
zCookieJar.__repr__cCs6g}x|D]}|jt|��q
Wd|jjdj|�fS)Nz<%s[%s]>z, )rqrr�r�r{)r�rer�rrrr��s
zCookieJar.__str__)N)NNN)!r�r�r�rs�compilerArBZstrict_domain_reZ	domain_reZdots_re�ASCII�magic_rer�r8r:r<rDrErPrUrVrWr]r_r^rarRrbrHrcrdr�r�rrrrr�s6





;!a\	6


c@seZdZdS)rN)r�r�r�rrrrr�sc@s4eZdZddd�Zddd�Zd
dd�Zdd	d
�ZdS)rNFc	CsJtj||�|dk	r6y|dWntd��YnX||_t|�|_dS)NrVzfilename must be string-like)rr�rL�filenamerQ�	delayload)r�rirjr7rrrr��szFileCookieJar.__init__cCs
t��dS)N)r�)r�ri�ignore_discard�ignore_expiresrrr�save�szFileCookieJar.savecCsJ|dkr"|jdk	r|j}ntt��t|��}|j||||�WdQRXdS)N)rirL�MISSING_FILENAME_TEXT�open�_really_load)r�rirkrlrrrr�load�s

zFileCookieJar.loadcCs�|dkr"|jdk	r|j}ntt��|jj�zFtj|j�}i|_y|j|||�Wnt	k
rn||_�YnXWd|jj
�XdS)N)rirLrnr5rFr��deepcopyr6rq�OSErrorrG)r�rirkrlZ	old_staterrr�reverts

zFileCookieJar.revert)NFN)NFF)NFF)NFF)r�r�r�r�rmrqrtrrrrr�s



	cCs$|j|jfd|jfd|jfg}|jdk	r8|jd|jf�|jrH|jd
�|jrX|jd�|jrh|jd�|j	rx|jd�|j
r�|jdtt|j
��f�|j
r�|jd�|jr�|jd
|jf�|jr�|jd|jf�t|jj��}x$|D]}|j|t|j|�f�q�W|jdt|j�f�t|g�S)Nr�r�r��	path_spec�	port_spec�
domain_dotr�r�r�r�rJr�)ruN)rvN)rwN)r�N)r�N)rwrxr�r�r�rqr�r�r�r�r�r5rZr�r�r�r'r�r(rr�r�)r�r�r(r~rrr�lwp_cookie_strs6







rxc@s(eZdZd
dd�Zddd�Zdd	�ZdS)rTcCs\tj�}g}x>|D]6}|r$|jr$q|r6|j|�r6q|jdt|��qWdj|dg�S)NzSet-Cookie3: %s�
rV)rMr�r�rqrxr{)r�rkrlr�rer�rrr�
as_lwp_strGs
zLWPCookieJar.as_lwp_strNFcCsX|dkr"|jdk	r|j}ntt��t|d��"}|jd�|j|j||��WdQRXdS)N�wz#LWP-Cookies-2.0
)rirLrnro�writerz)r�rirkrlrrrrrmWs

zLWPCookieJar.savecCsL|j�}|jj|�s$d|}t|��tj�}d}d}	d}
�yʐx�|j�}|dkrRP|j|�s^q@|t|�d�j�}�x�t|g�D�]x}|d\}
}i}i}x|	D]}d||<q�Wx�|dd�D]t\}}|dk	r�|j	�}nd}||
k�s�||	k�r�|}||	k�r|dk�rd}|||<q�||
k�r*|||<q�|||<q�W|j
}|d�}|d�}|dk	�r^t|�}|dk�rld}|d�}|jd�}t|d�|
||d	�|d�|||d�|d
�|d�|d�|||d
�|d�|�}|�r�|j
�r�q�|�r�|j|��r�q�|j|�q�Wq@WWnBtk
�r�Yn,tk
�rFt�td||f��YnXdS)Nz5%r does not look like a Set-Cookie3 (LWP) format filezSet-Cookie3:rvrurwr�r�r�r�r�r�r�r�rJrVr	FrTr�z&invalid Set-Cookie3 format file %r: %r)rvrurwr�r�)r�r�r�r�r�r�rJ)�readlinerhr@rrMrrrr�ryrKr�rdrr�r�r^rsrZr)r�rrirkrl�magicrr��headerrMrN�line�datarwrxrOr�r~rr�r�r�r�r�r�r`rrrrpcs�











zLWPCookieJar._really_load)TT)NFF)r�r�r�rzrmrprrrrr:s

c@s,eZdZejd�ZdZdd�Zd	dd�ZdS)
rz#( Netscape)? HTTP Cookie Filezr# Netscape HTTP Cookie File
# http://curl.haxx.se/rfc/cookie_spec.html
# This is a generated file!  Do not edit.

cCsntj�}|j�}|jj|�s(td|���y�x�|j�}|dkr@P|jd�rV|dd�}|j�jd�s.|j�dkrrq.|jd�\}}	}
}}}
}|dk}|	dk}	|
dkr�|}
d}|jd	�}d
}|dkr�d}d}t	d|
|dd
||	||
d
|||ddi�}|�r|j
�rq.|�r|j|��rq.|j|�q.WWnBt
k
�r>�Yn,tk
�rht�td
||f��YnXdS)Nz4%r does not look like a Netscape format cookies filerVryr�#r��	�TRUEr�FTr	z+invalid Netscape format cookies file %r: %rr�)r�r�)rMr}rhr@rr�r�rrr�rr�r�r^rsrZr)r�rrirkrlr�r~r�r�r�r�r�r�rwrxr�r�r`rrrrp�s`

zMozillaCookieJar._really_loadNFcCs|dkr"|jdk	r|j}ntt��t|d���}|j|j�tj�}x�|D]�}|rZ|jrZqH|rl|j|�rlqH|j	rxd}nd}|j
jd�r�d}nd}|jdk	r�t
|j�}	nd}	|jdkr�d}
|j}n|j}
|j}|jdj|j
||j||	|
|g�d�qHWWdQRXdS)Nr{r�ZFALSEr�rVr�ry)rirLrnror|rrMr�r�r�r�rrr�rrxrwr{r�)r�rirkrlrr�r�r�r�r�rwrxrrrrms<



zMozillaCookieJar.save)NFF)	r�r�r�rsrfrhrrprmrrrrr�s
A)N)N)X�__all__r�r-rsrMZurllib.parser�Zurllib.requestZ	threadingr3�ImportErrorZdummy_threadingZhttp.clientZhttpZcalendarr
rrrrZclientZ	HTTP_PORTr�rnrr%r,r6r7rIr(rqrKr5r8r>rfrgr?rFrSrX�Ir\�Xr^rarbrdrjrlrmrornryrzr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rrrr*r-r1rrsrrrxrrrrrr�<module>s�



88!



U
D'


#b!\:xcookiejar.cpython-36.pyc000064400000151360151732672750011165 0ustar003

���ir+�@s*dZddddddddgZd	d
lZd	d
lZd	d
lZd	d
lZd	d
lZd	d
lZyd	d
l	Z
Wnek
rpd	d
lZ
YnXd	d
l
Zd	dlmZdZd
ad
d�Zeejj�ZdZdd�ZdZdd�ZdddddddgZddddd d!d"d#d$d%d&d'gZgZxeD]Zej ej!��q�Wdud(d)�Z"dvd*d+�Z#d
d
d
d
d,�Z$ej%d-ej&�Z'd.d/�Z(d0d1�Z)ej%d2ej&�Z*ej%d3ej+ej&B�Z,ej%d4ej-ej&B�Z.d5d6�Z/ej%d7ej-ej&B�Z0d8d9�Z1d:d;�Z2ej%d<�Z3ej%d=�Z4ej%d>�Z5ej%d?�Z6d@dA�Z7ej%dB�Z8dCdD�Z9dEdF�Z:dGdH�Z;ej%dIej&�Z<dJdK�Z=dLdM�Z>dNdO�Z?dPdQ�Z@ej%dRej&�ZAdSdT�ZBdUdV�ZCdWdX�ZDdYdZ�ZEd[ZFej%d\�ZGd]d^�ZHd_d`�ZIdadb�ZJdcdd�ZKGded�d�ZLGdfd�d�ZMGdgd�deM�ZNdhdi�ZOdjdk�ZPGdldm�dm�ZQGdnd�d�ZRGdod�deS�ZTGdpd�deR�ZUdqdr�ZVGdsd�deU�ZWGdtd�deU�ZXd
S)wa�HTTP cookie handling for web clients.

This module has (now fairly distant) origins in Gisle Aas' Perl module
HTTP::Cookies, from the libwww-perl library.

Docstrings, comments and debug strings in this code refer to the
attributes of the HTTP cookie system as cookie-attributes, to distinguish
them clearly from Python attributes.

Class diagram (note that BSDDBCookieJar and the MSIE* classes are not
distributed with the Python standard library, but are available from
http://wwwsearch.sf.net/):

                        CookieJar____
                        /     \      \
            FileCookieJar      \      \
             /    |   \         \      \
 MozillaCookieJar | LWPCookieJar \      \
                  |               |      \
                  |   ---MSIEBase |       \
                  |  /      |     |        \
                  | /   MSIEDBCookieJar BSDDBCookieJar
                  |/
               MSIECookieJar

�Cookie�	CookieJar�CookiePolicy�DefaultCookiePolicy�
FileCookieJar�LWPCookieJar�	LoadError�MozillaCookieJar�N)�timegmFcGs(tsdStsddl}|jd�atj|�S)Nr	zhttp.cookiejar)�debug�logger�loggingZ	getLogger)�argsr
�r�&/usr/lib64/python3.6/http/cookiejar.py�_debug.s
rzQa filename was not supplied (nor was the CookieJar instance initialised with one)cCsJddl}ddl}ddl}|j�}|jd|�|j�}|jd|dd�dS)Nr	zhttp.cookiejar bug!
%s�)�
stacklevel)�io�warnings�	traceback�StringIO�	print_exc�getvalue�warn)rrr�f�msgrrr�_warn_unhandled_exception<s
ri�cCs�|dd�\}}}}}}|tkr�d|ko2dknr�d|koJdknr�d|kobdknr�d|kozdknr�d|ko�dknr�t|�SdSdS)	N����r	��;�=)�
EPOCH_YEARr
)�tt�year�monthZmday�hour�min�secrrr�_timegmKs
8Hr,ZMonZTueZWedZThuZFriZSatZSunZJanZFebZMarZAprZMayZJunZJulZAugZSepZOctZNovZDeccCs@|dkrtjj�}ntjj|�}d|j|j|j|j|j|jfS)aHReturn a string representing time in seconds since epoch, t.

    If the function is called without an argument, it will use the current
    time.

    The format of the returned string is like "YYYY-MM-DD hh:mm:ssZ",
    representing Universal Time (UTC, aka GMT).  An example of this format is:

    1994-11-24 08:49:37Z

    Nz%04d-%02d-%02d %02d:%02d:%02dZ)	�datetime�utcnow�utcfromtimestampr'r(�dayr)�minute�second)�t�dtrrr�	time2isozYs
r5cCsR|dkrtjj�}ntjj|�}dt|j�|jt|jd|j|j	|j
|jfS)z�Return a string representing time in seconds since epoch, t.

    If the function is called without an argument, it will use the current
    time.

    The format of the returned string is like this:

    Wed, DD-Mon-YYYY HH:MM:SS GMT

    Nz#%s, %02d-%s-%04d %02d:%02d:%02d GMTr)r-r.r/�DAYSZweekdayr0�MONTHSr(r'r)r1r2)r3r4rrr�
time2netscapelsr8)ZGMT�UTCZUT�Zz^([-+])?(\d\d?):?(\d\d)?$cCsjd}|tkrd}nTtj|�}|rfdt|jd��}|jd�rR|dt|jd��}|jd�dkrf|}|S)Nr	ir��<r�-)�	UTC_ZONES�TIMEZONE_RE�search�int�group)�tz�offset�mrrr�offset_from_tz_string�s

rFc
Cs�t|�}|tjkrdSytj|j��d}WnXtk
r�yt|�}Wntk
r\dSXd|kopdknr||}ndSYnX|dkr�d}|dkr�d}|dkr�d}t|�}t|�}t|�}t|�}|dk�r0tjtj��d}|d}	|}
|||	}|	|
}	t	|	�dk�r0|	dk�r(|d}n|d}t
|||||||f�}|dk	�r�|dk�r^d}|j�}t|�}|dk�r|dS||}|S)Nrr r	i��d�2r9)
rAr-ZMAXYEAR�MONTHS_LOWER�index�lower�
ValueError�timeZ	localtime�absr,�upperrF)
r0�mon�yr�hrr*r+rCZimonZcur_yrrEZtmpr3rDrrr�	_str2time�sV







rSzV^[SMTWF][a-z][a-z], (\d\d) ([JFMASOND][a-z][a-z]) (\d\d\d\d) (\d\d):(\d\d):(\d\d) GMT$z+^(?:Sun|Mon|Tue|Wed|Thu|Fri|Sat)[a-z]*,?\s*a�^
    (\d\d?)            # day
       (?:\s+|[-\/])
    (\w+)              # month
        (?:\s+|[-\/])
    (\d+)              # year
    (?:
          (?:\s+|:)    # separator before clock
       (\d\d?):(\d\d)  # hour:min
       (?::(\d\d))?    # optional seconds
    )?                 # optional clock
       \s*
    ([-+]?\d{2,4}|(?![APap][Mm]\b)[A-Za-z]+)? # timezone
       \s*
    (?:\(\w+\))?       # ASCII representation of timezone in parens.
       \s*$cCs�tj|�}|rl|j�}tj|dj��d}t|d�|t|d�t|d�t|d�t|d�f}t|�S|j	�}t
jd|d�}dgd	\}}}}}}	}
tj|�}|dk	r�|j�\}}}}}}	}
ndSt
||||||	|
�S)
a�Returns time in seconds since epoch of time represented by a string.

    Return value is an integer.

    None is returned if the format of str is unrecognized, the time is outside
    the representable range, or the timezone string is not recognized.  If the
    string contains no timezone, UTC is assumed.

    The timezone in the string may be numerical (like "-0800" or "+0100") or a
    string timezone (like "UTC", "GMT", "BST" or "EST").  Currently, only the
    timezone strings equivalent to UTC (zero offset) are known to the function.

    The function loosely parses the following formats:

    Wed, 09 Feb 1994 22:23:32 GMT       -- HTTP format
    Tuesday, 08-Feb-94 14:15:29 GMT     -- old rfc850 HTTP format
    Tuesday, 08-Feb-1994 14:15:29 GMT   -- broken rfc850 HTTP format
    09 Feb 1994 22:23:32 GMT            -- HTTP format (no weekday)
    08-Feb-94 14:15:29 GMT              -- rfc850 format (no weekday)
    08-Feb-1994 14:15:29 GMT            -- broken rfc850 format (no weekday)

    The parser ignores leading and trailing whitespace.  The time may be
    absent.

    If the year is given with only 2 digits, the function will select the
    century that makes the year closest to the current date.

    rrr	r;���N�)�STRICT_DATE_REr@�groupsrIrJrKrA�floatr,�lstrip�
WEEKDAY_RE�sub�LOOSE_HTTP_DATE_RErS)�textrE�grPr&r0rQrRr*r+rCrrr�	http2time�s
"
raa�^
    (\d{4})              # year
       [-\/]?
    (\d\d?)              # numerical month
       [-\/]?
    (\d\d?)              # day
   (?:
         (?:\s+|[-:Tt])  # separator before clock
      (\d\d?):?(\d\d)    # hour:min
      (?::?(\d\d(?:\.\d*)?))?  # optional seconds (and fractional)
   )?                    # optional clock
      \s*
   ([-+]?\d\d?:?(:?\d\d)?
    |Z|z)?               # timezone  (Z is "zero meridian", i.e. GMT)
      \s*$c
Csd|j�}dgd\}}}}}}}tj|�}|dk	rL|j�\}}}}}}}}	ndSt|||||||�S)av
    As for http2time, but parses the ISO 8601 formats:

    1994-02-03 14:15:29 -0100    -- ISO 8601 format
    1994-02-03 14:15:29          -- zone is optional
    1994-02-03                   -- only date
    1994-02-03T14:15:29          -- Use T as separator
    19940203T141529Z             -- ISO 8601 compact format
    19940203                     -- only date

    NrW)r[�ISO_DATE_REr@rYrS)
r_r0rPrQrRr*r+rCrE�_rrr�iso2time's

rdcCs*|jd�\}}|jd|�|j|d�S)z)Return unmatched part of re.Match object.r	N)�span�string)�match�start�endrrr�	unmatchedHsrjz^\s*([^=\s;,]+)z&^\s*=\s*\"([^\"\\]*(?:\\.[^\"\\]*)*)\"z^\s*=\s*([^\s;,]*)z\\(.)c
Cs<t|t�st�g}�x |D�]}|}g}x�|�r$tj|�}|r�t|�}|jd�}tj|�}|r�t|�}|jd�}tj	d|�}n.t
j|�}|r�t|�}|jd�}|j�}nd}|j||f�q,|j
�jd�r�|j
�dd�}|r�|j|�g}q,tjdd|�\}}	|	dk�std|||f��|}q,W|r|j|�qW|S)	amParse header values into a list of lists containing key,value pairs.

    The function knows how to deal with ",", ";" and "=" as well as quoted
    values after "=".  A list of space separated tokens are parsed as if they
    were separated by ";".

    If the header_values passed as argument contains multiple values, then they
    are treated as if they were a single value separated by comma ",".

    This means that this function is useful for parsing header fields that
    follow this syntax (BNF as from the HTTP/1.1 specification, but we relax
    the requirement for tokens).

      headers           = #header
      header            = (token | parameter) *( [";"] (token | parameter))

      token             = 1*<any CHAR except CTLs or separators>
      separators        = "(" | ")" | "<" | ">" | "@"
                        | "," | ";" | ":" | "\" | <">
                        | "/" | "[" | "]" | "?" | "="
                        | "{" | "}" | SP | HT

      quoted-string     = ( <"> *(qdtext | quoted-pair ) <"> )
      qdtext            = <any TEXT except <">>
      quoted-pair       = "\" CHAR

      parameter         = attribute "=" value
      attribute         = token
      value             = token | quoted-string

    Each header is represented by a list of key/value pairs.  The value for a
    simple token (not part of a parameter) is None.  Syntactically incorrect
    headers will not necessarily be parsed as you would want.

    This is easier to describe with some examples:

    >>> split_header_words(['foo="bar"; port="80,81"; discard, bar=baz'])
    [[('foo', 'bar'), ('port', '80,81'), ('discard', None)], [('bar', 'baz')]]
    >>> split_header_words(['text/html; charset="iso-8859-1"'])
    [[('text/html', None), ('charset', 'iso-8859-1')]]
    >>> split_header_words([r'Basic realm="\"foo\bar\""'])
    [[('Basic', None), ('realm', '"foobar"')]]

    rz\1N�,z^[=\s;]*rVr	z&split_header_words bug: '%s', '%s', %s)�
isinstance�str�AssertionError�HEADER_TOKEN_REr@rjrB�HEADER_QUOTED_VALUE_RE�HEADER_ESCAPE_REr]�HEADER_VALUE_RE�rstrip�appendr[�
startswith�re�subn)
Z
header_values�resultr_Z	orig_text�pairsrE�name�valueZnon_junkZ
nr_junk_charsrrr�split_header_wordsQsF-







r|z([\"\\])cCs�g}xt|D]l}g}xN|D]F\}}|dk	rTtjd|�sHtjd|�}d|}d||f}|j|�qW|r
|jdj|��q
Wdj|�S)a�Do the inverse (almost) of the conversion done by split_header_words.

    Takes a list of lists of (key, value) pairs and produces a single header
    value.  Attribute values are quoted if needed.

    >>> join_header_words([[("text/plain", None), ("charset", "iso-8859-1")]])
    'text/plain; charset="iso-8859-1"'
    >>> join_header_words([[("text/plain", None)], [("charset", "iso-8859-1")]])
    'text/plain, charset="iso-8859-1"'

    Nz^\w+$z\\\1z"%s"z%s=%sz; z, )rvr@�HEADER_JOIN_ESCAPE_REr]rt�join)Zlists�headersry�attr�k�vrrr�join_header_words�s
r�cCs0|jd�r|dd�}|jd�r,|dd�}|S)N�"r���)ru�endswith)r_rrr�strip_quotes�s


r�cCsd}g}x�|D]�}g}d}x�t|jd	��D]�\}}|j�}|jd
�\}}	}
|j�}|sd|dkr*Pnq*|	rp|
j�nd}
|dkr�|j�}||kr�|}|dkr�|
dk	r�t|
�}
d
}n|dkr�|
dk	r�tt|
��}
|j||
f�q*W|r|�s�|jd�|j|�qW|S)a5Ad-hoc parser for Netscape protocol cookie-attributes.

    The old Netscape cookie format for Set-Cookie can for instance contain
    an unquoted "," in the expires field, so we have to use this ad-hoc
    parser instead of split_header_words.

    XXX This may not make the best possible effort to parse all the crap
    that Netscape Cookie headers contain.  Ronald Tschalar's HTTPClient
    parser is probably better, so could do worse than following that if
    this ever gives any trouble.

    Currently, this is also used for parsing RFC 2109 cookies.

    �expires�domain�path�secure�version�port�max-ageF�;�=r	NT�0)r�r�r�r�r�r�r�)r�r�)�	enumerate�split�strip�	partitionrKr�rart)Z
ns_headersZknown_attrsrxZ	ns_headerry�version_setZiiZparam�key�sep�val�lcrrr�parse_ns_headers�s@

r�z\.\d+$cCs:tj|�rdS|dkrdS|ddks2|ddkr6dSdS)z*Return True if text is a host domain name.FrVr	�.rTr�)�IPV4_REr@)r_rrr�is_HDNs
r�cCsl|j�}|j�}||krdSt|�s(dS|j|�}|dksB|dkrFdS|jd�sTdSt|dd��shdSdS)a�Return True if domain A domain-matches domain B, according to RFC 2965.

    A and B may be host domain names or IP addresses.

    RFC 2965, section 1:

    Host names can be specified either as an IP address or a HDN string.
    Sometimes we compare one host name with another.  (Such comparisons SHALL
    be case-insensitive.)  Host A's name domain-matches host B's if

         *  their host name strings string-compare equal; or

         * A is a HDN string and has the form NB, where N is a non-empty
            name string, B has the form .B', and B' is a HDN string.  (So,
            x.y.com domain-matches .Y.com but not Y.com.)

    Note that domain-match is not a commutative operation: a.b.c.com
    domain-matches .c.com, but not the reverse.

    TFrr	r�Nr�)rKr��rfindru)�A�B�irrr�domain_matchs

r�cCstj|�rdSdS)zdReturn True if text is a sort-of-like a host domain name.

    For accepting/blocking domains.

    FT)r�r@)r_rrr�liberal_is_HDNBs
r�cCsb|j�}|j�}t|�ot|�s0||kr,dSdS|jd�}|rL|j|�rLdS|r^||kr^dSdS)z\For blocking/accepting domains.

    A and B may be host domain names or IP addresses.

    TFr�)rKr�rur�)r�r��initial_dotrrr�user_domain_matchLs
r�z:\d+$cCsB|j�}tjj|�d}|dkr,|jdd�}tjd|d�}|j�S)z�Return request-host, as defined by RFC 2965.

    Variation from RFC: returned value is lowercased, for convenient
    comparison.

    rrVZHost)�get_full_url�urllib�parseZurlparseZ
get_header�cut_port_rer]rK)�request�url�hostrrr�request_hostasr�cCs6t|�}}|jd�dkr.tj|�r.|d}||fS)zzReturn a tuple (request-host, effective request-host name).

    As defined by RFC 2965, except both are lowercased.

    r�rz.localr�)r��findr�r@)r��erhn�req_hostrrr�eff_request_hostqsr�cCs4|j�}tjj|�}t|j�}|jd�s0d|}|S)z6Path component of request-URI, as defined by RFC 2965.�/)r�r�r�Zurlsplit�escape_pathr�ru)r�r��partsr�rrr�request_path|s

r�cCs^|j}|jd�}|dkrV||dd�}yt|�WqZtk
rRtd|�dSXnt}|S)N�:r	rznonnumeric port: '%s')r�r�rArLr�DEFAULT_HTTP_PORT)r�r�r�r�rrr�request_port�s

r�z%/;:@&=+$,!~*'()z%([0-9a-fA-F][0-9a-fA-F])cCsd|jd�j�S)Nz%%%sr)rBrO)rgrrr�uppercase_escaped_char�sr�cCstjj|t�}tjt|�}|S)zEEscape any invalid characters in HTTP URL, and uppercase all escapes.)r�r�Zquote�HTTP_PATH_SAFE�ESCAPED_CHAR_REr]r�)r�rrrr��s
r�cCsP|jd�}|dkrL||dd�}|jd�}t|�rL|dksD|dkrLd|S|S)aBReturn reach of host h, as defined by RFC 2965, section 1.

    The reach R of a host name H is defined as follows:

       *  If

          -  H is the host domain name of a host; and,

          -  H has the form A.B; and

          -  A has no embedded (that is, interior) dots; and

          -  B has at least one embedded dot, or B is the string "local".
             then the reach of H is .B.

       *  Otherwise, the reach of H is H.

    >>> reach("www.acme.com")
    '.acme.com'
    >>> reach("acme.com")
    'acme.com'
    >>> reach("acme.local")
    '.local'

    r�r	rNZlocal)r�r�)�hr��brrr�reach�s

r�cCs$t|�}t|t|j��sdSdSdS)z�

    RFC 2965, section 3.3.6:

        An unverifiable transaction is to a third-party host if its request-
        host U does not domain-match the reach R of the request-host O in the
        origin transaction.

    TFN)r�r�r�Zorigin_req_host)r�r�rrr�is_third_party�s
r�c@sNeZdZdZddd�Zdd�Zddd	�Zd
d�Zddd
�Zdd�Z	dd�Z
dS)ra�HTTP Cookie.

    This class represents both Netscape and RFC 2965 cookies.

    This is deliberately a very simple class.  It just holds attributes.  It's
    possible to construct Cookie instances that don't comply with the cookie
    standards.  CookieJar.make_cookies is the factory function for Cookie
    objects -- it deals with cookie parsing, supplying defaults, and
    normalising to the representation used in this class.  CookiePolicy is
    responsible for checking them to see whether they should be accepted from
    and returned to the server.

    Note that the port may be present in the headers, but unspecified ("Port"
    rather than"Port=80", for example); if this is the case, port is None.

    FcCs�|dk	rt|�}|dk	r$tt|��}|dkr<|dkr<td��||_||_||_||_||_|j�|_	||_
||_|	|_|
|_
||_||_|
|_||_||_||_tj|�|_dS)NTz-if port is None, port_specified must be false)rArZrLr�rzr{r��port_specifiedrKr��domain_specified�domain_initial_dotr��path_specifiedr�r��discard�comment�comment_url�rfc2109�copy�_rest)�selfr�rzr{r�r�r�r�r�r�r�r�r�r�r�r��restr�rrr�__init__�s.

zCookie.__init__cCs
||jkS)N)r�)r�rzrrr�has_nonstandard_attrszCookie.has_nonstandard_attrNcCs|jj||�S)N)r��get)r�rz�defaultrrr�get_nonstandard_attrszCookie.get_nonstandard_attrcCs||j|<dS)N)r�)r�rzr{rrr�set_nonstandard_attrszCookie.set_nonstandard_attrcCs,|dkrtj�}|jdk	r(|j|kr(dSdS)NTF)rMr�)r��nowrrr�
is_expireds
zCookie.is_expiredcCsX|jdkrd}n
d|j}|j||j}|jdk	rFd|j|jf}n|j}d||fS)NrVr�z%s=%sz<Cookie %s for %s>)r�r�r�r{rz)r��p�limitZ	namevaluerrr�__str__%s


zCookie.__str__cCspg}x,dD]$}t||�}|jd|t|�f�q
W|jdt|j��|jdt|j��d|jjdj|�fS)Nr�rzr{r�r�r�r�r�r�r�r�r�r�r�r�z%s=%szrest=%sz
rfc2109=%sz%s(%s)z, )r�rzr{r�r�r�r�r�r�r�r�r�r�r�r�)�getattrrt�reprr�r��	__class__�__name__r~)r�rrzr�rrr�__repr__/s
zCookie.__repr__)F)N)N)r��
__module__�__qualname__�__doc__r�r�r�r�r�r�r�rrrrr�s
 


c@s0eZdZdZdd�Zdd�Zdd�Zdd	�Zd
S)ra Defines which cookies get accepted from and returned to server.

    May also modify cookies, though this is probably a bad idea.

    The subclass DefaultCookiePolicy defines the standard rules for Netscape
    and RFC 2965 cookies -- override that if you want a customized policy.

    cCs
t��dS)z�Return true if (and only if) cookie should be accepted from server.

        Currently, pre-expired cookies never get this far -- the CookieJar
        class deletes such cookies itself.

        N)�NotImplementedError)r��cookier�rrr�set_okGszCookiePolicy.set_okcCs
t��dS)zAReturn true if (and only if) cookie should be returned to server.N)r�)r�r�r�rrr�	return_okPszCookiePolicy.return_okcCsdS)zMReturn false if cookies should not be returned, given cookie domain.
        Tr)r�r�r�rrr�domain_return_okTszCookiePolicy.domain_return_okcCsdS)zKReturn false if cookies should not be returned, given cookie path.
        Tr)r�r�r�rrr�path_return_okYszCookiePolicy.path_return_okN)r�r�r�r�r�r�r�r�rrrrr>s
	c@s�eZdZdZdZdZdZdZeeBZdddddddddeddfd	d
�Z	dd�Z
d
d�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd �Zd!d"�Zd#d$�Zd%d&�Zd'd(�Zd)d*�Zd+d,�Zd-d.�Zd/d0�Zd1d2�Zd3d4�Zd5d6�ZdS)7rzBImplements the standard rules for accepting and returning cookies.rrrTr	NTFc

Csp||_||_||_||_||_||_|	|_|
|_||_||_	|dk	rPt
|�|_nf|_|dk	rft
|�}||_dS)zAConstructor arguments should be passed as keyword arguments only.N)
�netscape�rfc2965�rfc2109_as_netscape�hide_cookie2�
strict_domain�strict_rfc2965_unverifiable�strict_ns_unverifiable�strict_ns_domain�strict_ns_set_initial_dollar�strict_ns_set_path�tuple�_blocked_domains�_allowed_domains)
r��blocked_domains�allowed_domainsr�r�r�r�r�r�r�r�r�r�rrrr�is 
zDefaultCookiePolicy.__init__cCs|jS)z4Return the sequence of blocked domains (as a tuple).)r�)r�rrrr��sz#DefaultCookiePolicy.blocked_domainscCst|�|_dS)z$Set the sequence of blocked domains.N)r�r�)r�r�rrr�set_blocked_domains�sz'DefaultCookiePolicy.set_blocked_domainscCs"x|jD]}t||�rdSqWdS)NTF)r�r�)r�r�Zblocked_domainrrr�
is_blocked�s
zDefaultCookiePolicy.is_blockedcCs|jS)z=Return None, or the sequence of allowed domains (as a tuple).)r�)r�rrrr��sz#DefaultCookiePolicy.allowed_domainscCs|dk	rt|�}||_dS)z-Set the sequence of allowed domains, or None.N)r�r�)r�r�rrr�set_allowed_domains�sz'DefaultCookiePolicy.set_allowed_domainscCs0|jdkrdSx|jD]}t||�rdSqWdS)NFT)r�r�)r�r�Zallowed_domainrrr�is_not_allowed�s

z"DefaultCookiePolicy.is_not_allowedcCsPtd|j|j�|jdk	st�x,dD]$}d	|}t||�}|||�s$d
Sq$WdS)
z�
        If you override .set_ok(), be sure to call this method.  If it returns
        false, so should your subclass (assuming your subclass wants to be more
        strict about which cookies to accept).

        z - checking cookie %s=%sNr��
verifiabilityrzr�r�r�Zset_ok_FT)r�r�rzr�r�r�)rrzr{rnr�)r�r�r��n�fn_name�fnrrrr��s


zDefaultCookiePolicy.set_okcCs^|jdkrtd|j|j�dS|jdkr<|jr<td�dS|jdkrZ|jrZtd�dSdS)Nz0   Set-Cookie2 without version attribute (%s=%s)Fr	z$   RFC 2965 cookies are switched offz$   Netscape cookies are switched offT)r�rrzr{r�r�)r�r�r�rrr�set_ok_version�s
z"DefaultCookiePolicy.set_ok_versioncCsJ|jrFt|�rF|jdkr*|jr*td�dS|jdkrF|jrFtd�dSdS)Nr	z>   third-party RFC 2965 cookie during unverifiable transactionFz>   third-party Netscape cookie during unverifiable transactionT)�unverifiabler�r�r�rr�)r�r�r�rrr�set_ok_verifiability�sz(DefaultCookiePolicy.set_ok_verifiabilitycCs0|jdkr,|jr,|jjd�r,td|j�dSdS)Nr	�$z'   illegal name (starts with '$'): '%s'FT)r�r�rzrur)r�r�r�rrr�set_ok_name�s
zDefaultCookiePolicy.set_ok_namecCsL|jrHt|�}|jdks(|jdkrH|jrH|j|j�rHtd|j|�dSdS)Nr	z7   path attribute %s is not a prefix of request path %sFT)r�r�r�r�rur�r)r�r�r��req_pathrrr�set_ok_path�s

zDefaultCookiePolicy.set_ok_pathc
Cs�|j|j�rtd|j�dS|j|j�r8td|j�dS|j�r�t|�\}}|j}|jr�|jd�dkr�|jd�}|jdd|�}|dkr�||dd�}||d|�}	|	j	�d$kr�t
|�dkr�td|�dS|jd��r�|dd�}
n|}
|
jd�dk}|�r|dk�rtd|�dS|j
dk�rb|j|��rb|jd��rbd|j|��rbtd ||�dS|j
dk�s||j|j@�r�t||��s�td!||�dS|j
dk�s�|j|j@�r�|dt
|��}|jd�dk�r�tj|��r�td"||�dSd#S)%Nz"   domain %s is in user block-listFz&   domain %s is not in user allow-listr�rr	r�co�ac�com�edu�org�net�gov�milrA�aero�biz�cat�coop�info�jobs�mobi�museumrz�pro�travel�euz&   country-code second level domain %sz.localz/   non-local domain %s contains no embedded dotzO   effective request-host %s (even with added initial dot) does not end with %sz5   effective request-host %s does not domain-match %sz.   host prefix %s for domain %s contains a dotT)rrrrrr	r
rrArr
rrrrrrrzrrr)r�r�rr�r�r�r��countr�rK�lenrur�r�r�r��DomainRFC2965Matchr��DomainStrictNoDotsr�r@)
r�r�r�r�r�r�r��jZtldZsldZundotted_domainZ
embedded_dotsZhost_prefixrrr�
set_ok_domain�sf

z!DefaultCookiePolicy.set_ok_domaincCs�|jr�t|�}|dkrd}nt|�}x\|jjd�D]:}yt|�Wntk
r`td|�dSX||kr2Pq2Wtd||j�dSdS)N�80rkz   bad port %s (not numeric)Fz$   request port (%s) not found in %sT)r�r�rmr�r�rArLr)r�r�r��req_portr�rrr�set_ok_port%s"

zDefaultCookiePolicy.set_ok_portcCsBtd|j|j�x,dD]$}d|}t||�}|||�sd	SqWd
S)z�
        If you override .return_ok(), be sure to call this method.  If it
        returns false, so should your subclass (assuming your subclass wants to
        be more strict about which cookies to return).

        z - checking cookie %s=%sr�r�r�r�r�r�Z
return_ok_FT)r�r�r�r�r�r�)rrzr{r�)r�r�r�r�r�r�rrrr�:s	


zDefaultCookiePolicy.return_okcCs@|jdkr|jrtd�dS|jdkr<|jr<td�dSdS)Nr	z$   RFC 2965 cookies are switched offFz$   Netscape cookies are switched offT)r�r�rr�)r�r�r�rrr�return_ok_versionLsz%DefaultCookiePolicy.return_ok_versioncCsJ|jrFt|�rF|jdkr*|jr*td�dS|jdkrF|jrFtd�dSdS)Nr	z>   third-party RFC 2965 cookie during unverifiable transactionFz>   third-party Netscape cookie during unverifiable transactionT)r�r�r�r�rr�)r�r�r�rrr�return_ok_verifiabilityUsz+DefaultCookiePolicy.return_ok_verifiabilitycCs |jr|jdkrtd�dSdS)NZhttpsz(   secure cookie with non-secure requestFT)r��typer)r�r�r�rrr�return_ok_secureasz$DefaultCookiePolicy.return_ok_securecCs|j|j�rtd�dSdS)Nz   cookie expiredFT)r��_nowr)r�r�r�rrr�return_ok_expiresgsz%DefaultCookiePolicy.return_ok_expirescCsP|jrLt|�}|dkrd}x0|jjd�D]}||kr(Pq(Wtd||j�dSdS)Nrrkz0   request port %s does not match cookie port %sFT)r�r�r�r)r�r�r�rr�rrr�return_ok_portms
z"DefaultCookiePolicy.return_ok_portcCs�t|�\}}|j}|r,|jd�r,d|}n|}|jdkrb|j|j@rb|jrb||krbtd�dS|jdkr�t||�r�td||�dS|jdkr�d|j	|�r�td||�dSdS)Nr�r	zQ   cookie with unspecified domain does not string-compare equal to request domainFzQ   effective request-host name %s does not domain-match RFC 2965 cookie domain %sz;   request-host %s does not match Netscape cookie domain %sT)
r�r�rur�r��DomainStrictNonDomainr�rr�r�)r�r�r�r�r�r��	dotdomainrrr�return_ok_domain{s&

z$DefaultCookiePolicy.return_ok_domaincCs�t|�\}}|jd�sd|}|jd�s0d|}|rJ|jd�rJd|}n|}|j|�p`|j|�sfdS|j|�r~td|�dS|j|�r�td|�dSdS)Nr�Fz"   domain %s is in user block-listz&   domain %s is not in user allow-listT)r�rur�r�rr�)r�r�r�r�r�r(rrrr��s"






z$DefaultCookiePolicy.domain_return_okcCs0td|�t|�}|j|�s,td||�dSdS)Nz- checking cookie path=%sz  %s does not path-match %sFT)rr�ru)r�r�r�rrrrr��s

z"DefaultCookiePolicy.path_return_ok) r�r�r�r�rr'rZ
DomainLiberalZDomainStrictr�r�r�r�r�r�r�r�r�r�rrrrr�r r!r#r%r&r)r�r�rrrrr_sL	;	cCst|j��}t|j|�S)N)�sorted�keys�mapr�)Zadictr+rrr�vals_sorted_by_key�sr-ccsZt|�}xL|D]D}d}y
|jWntk
r4YnXd}t|�EdH|s|VqWdS)zBIterates over nested mapping, depth-first, in sorted order by key.FTN)r-�items�AttributeError�
deepvalues)�mapping�values�objrrrr0�s

r0c@seZdZdS)�AbsentN)r�r�r�rrrrr4�sr4c@s�eZdZdZejd�Zejd�Zejd�Zejd�Z	ejd�Z
ejdej�Zd3d	d
�Z
dd�Zd
d�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd �Zd!d"�Zd#d$�Zd4d%d&�Zd'd(�Zd)d*�Zd+d,�Zd-d.�Zd/d0�Z d1d2�Z!dS)5rz�Collection of HTTP cookies.

    You may not need to know about this class: try
    urllib.request.build_opener(HTTPCookieProcessor).open(url).
    z\Wz([\"\\])z\.?[^.]*z[^.]*z^\.+z^\#LWP-Cookies-(\d+\.\d+)NcCs(|dkrt�}||_tj�|_i|_dS)N)r�_policy�
_threading�RLock�
_cookies_lock�_cookies)r��policyrrrr��s

zCookieJar.__init__cCs
||_dS)N)r5)r�r:rrr�
set_policy�szCookieJar.set_policycCs�g}|jj||�sgStd|�|j|}xd|j�D]X}|jj||�sHq4||}x:|j�D].}|jj||�svtd�qZtd�|j|�qZWq4W|S)Nz!Checking %s for cookies to returnz   not returning cookiez   it's a match)	r5r�rr9r+r�r2r�rt)r�r�r��cookiesZcookies_by_pathr�Zcookies_by_namer�rrr�_cookies_for_domain�s 

zCookieJar._cookies_for_domaincCs.g}x$|jj�D]}|j|j||��qW|S)z2Return a list of cookies to be returned to server.)r9r+�extendr=)r�r�r<r�rrr�_cookies_for_request�szCookieJar._cookies_for_requestc	CsF|jdd�dd�d}g}�x$|D�]}|j}|sLd}|dkrL|jd|�|jdk	r~|jj|j�r~|dkr~|jjd	|j�}n|j}|jdkr�|j|j�n|jd
|j|f�|dkr"|j	r�|jd|j
�|jjd��r|j}|j
o�|jd��r|d
d�}|jd|�|jdk	r"d}|j�r4|d|j}|j|�q"W|S)z�Return a list of cookie-attributes to be returned to server.

        like ['foo="bar"; $Path="/"', ...]

        The $Version attribute is also added when appropriate (currently only
        once per request).

        cSs
t|j�S)N)rr�)�arrr�<lambda>sz)CookieJar._cookie_attrs.<locals>.<lambda>T)r��reverseFr	z$Version=%sNz\\\1z%s=%sz
$Path="%s"r�rz$Domain="%s"z$Portz="%s")�sortr�rtr{�non_word_rer@�quote_rer]rzr�r�r�rur�r�r�)	r�r<r��attrsr�r�r{r�r�rrr�
_cookie_attrss>



zCookieJar._cookie_attrsc
Cs�td�|jj�z�ttj��|j_|_|j|�}|j|�}|r^|j	d�s^|j
ddj|��|jjr�|jj
r�|j	d�r�x$|D]}|jdkr�|j
dd�Pq�WWd|jj�X|j�dS)z�Add correct Cookie: header to request (urllib.request.Request object).

        The Cookie2 header is also added unless policy.hide_cookie2 is true.

        �add_cookie_headerrz; ZCookie2rz$Version="1"N)rr8�acquirerArMr5r$r?rGZ
has_headerZadd_unredirected_headerr~r�r�r��release�clear_expired_cookies)r�r�r<rFr�rrrrH?s$






zCookieJar.add_cookie_headercCs�g}d}d}�x||D�]r}|d\}}d}d}	i}
i}�x4|d
d�D�]"\}}
|j�}||ksh||krl|}||kr�|
dkr�d}
||
kr�qF|dkr�|
dkr�td�d}	P|
j�}
|dkr�|r�qF|
dkr�td�qF|dk�rd}yt|
�}
Wn$tk
�rtd�d}	PYnXd}|j|
}
||k�s2||k�rb|
dk�rX|dk�rXtd|�d}	P|
|
|<qF|
||<qFW|	�rvq|j|||
|f�qW|S)aReturn list of tuples containing normalised cookie information.

        attrs_set is the list of lists of key,value pairs extracted from
        the Set-Cookie or Set-Cookie2 headers.

        Tuples are name, value, standard, rest, where name and value are the
        cookie name and value, standard is a dictionary containing the standard
        cookie-attributes (discard, secure, version, expires or max-age,
        domain, path and port) and rest is a dictionary containing the rest of
        the cookie-attributes.

        r�r�r�r��max-ager�r�r�r��
commenturlr	FrNTz%   missing value for domain attributezM   missing or invalid value for expires attribute: treating as session cookiez?   missing or invalid (non-numeric) value for max-age attributez!   missing value for %s attribute)r�r�)r�r�rLr�r�r�r�rM)r�r�rM)rKrrArLr$rt)r��	attrs_set�
cookie_tuples�
boolean_attrs�value_attrsZcookie_attrsrzr{Zmax_age_setZ
bad_cookie�standardr�r�r�r�rrr�_normalized_cookie_tuples`sl






z#CookieJar._normalized_cookie_tuplesc!Cs$|\}}}}|jdt�}|jdt�}|jdt�}	|jdt�}
|jdd�}|dk	rryt|�}Wntk
rpdSX|jdd�}|jdd�}
|jd	d�}|jd
d�}|tk	r�|dkr�d}t|�}nXd}t|�}|jd
�}|dk�r|dkr�|d|�}n|d|d�}t|�dk�rd
}|tk	}d}|�r8t|j	d��}|tk�rTt
|�\}}|}n|j	d��shd|}d}|	tk	�r�|	dk�r�t|�}	nd}tj
dd|	�}	nd}	|
tk�r�d}
d}
nH|
|jk�r�y|j|||�Wntk
�r�YnXtd|||�dSt||||	||||||||
|
|||�S)Nr�r�r�r�r�r�Fr�r�rMrVTr�rr	r�z\s+z2Expiring cookie, domain='%s', path='%s', name='%s'r�)r�r4rArLr�r�r�r�boolrur�r�rvr]r$�clear�KeyErrorrr)r��tupr�rzr{rRr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rrr�_cookie_from_cookie_tuple�s�








z#CookieJar._cookie_from_cookie_tuplecCs:|j|�}g}x&|D]}|j||�}|r|j|�qW|S)N)rSrXrt)r�rNr�rOr<rWr�rrr�_cookies_from_attrs_sets

z!CookieJar._cookies_from_attrs_setcCsLt|jdd�}|dkr |jj}x&|D]}|jdkr&d|_|r&d|_q&WdS)Nr�rTr	)r�r5r�r�r�)r�r<Z
rfc2109_as_nsr�rrr�_process_rfc2109_cookies&s


z"CookieJar._process_rfc2109_cookiesc
Cs6|j�}|jdg�}|jdg�}|jj}|jj}|r<|s`|rH|s`|rT|s`|rd|rdgSy|jt|�|�}Wntk
r�t�g}YnX|o�|�r2y|jt	|�|�}	Wntk
r�t�g}	YnX|j
|	�|�r"i}
x |D]}d|
|j|j|j
f<q�W|
fdd�}t||	�}	|	�r2|j|	�|S)zAReturn sequence of Cookie objects extracted from response object.zSet-Cookie2z
Set-CookieNcSs|j|j|jf}||kS)N)r�r�rz)Z	ns_cookie�lookupr�rrr�no_matching_rfc2965^sz3CookieJar.make_cookies.<locals>.no_matching_rfc2965)rZget_allr5r�r�rYr|�	Exceptionrr�rZr�r�rz�filterr>)
r��responser�rZrfc2965_hdrsZns_hdrsr�r�r<Z
ns_cookiesr[r�r\rrr�make_cookies2sB






zCookieJar.make_cookiesc
CsN|jj�z2ttj��|j_|_|jj||�r:|j|�Wd|jj�XdS)z-Set a cookie if policy says it's OK to do so.N)	r8rIrArMr5r$r��
set_cookierJ)r�r�r�rrr�set_cookie_if_okhs
zCookieJar.set_cookie_if_okc
Csl|j}|jj�zJ|j|kr&i||j<||j}|j|krDi||j<||j}|||j<Wd|jj�XdS)z?Set a cookie, without checking whether or not it should be set.N)r9r8rIr�r�rzrJ)r�r��cZc2Zc3rrrraus






zCookieJar.set_cookiec
Cs|td|j��|jj�zRttj��|j_|_x6|j||�D]&}|jj	||�r>td|�|j
|�q>WWd|jj�XdS)zAExtract cookies from response, where allowable given the request.zextract_cookies: %sz setting cookie: %sN)rrr8rIrArMr5r$r`r�rarJ)r�r_r�r�rrr�extract_cookies�s

zCookieJar.extract_cookiescCst|dk	r2|dks|dkr td��|j|||=n>|dk	rX|dkrJtd��|j||=n|dk	rj|j|=ni|_dS)a�Clear some cookies.

        Invoking this method without arguments will clear all cookies.  If
        given a single argument, only cookies belonging to that domain will be
        removed.  If given two arguments, cookies belonging to the specified
        path within that domain are removed.  If given three arguments, then
        the cookie with the specified name, path and domain is removed.

        Raises KeyError if no matching cookie exists.

        Nz8domain and path must be given to remove a cookie by namez.domain must be given to remove cookies by path)rLr9)r�r�r�rzrrrrU�s
zCookieJar.clearcCsH|jj�z,x&|D]}|jr|j|j|j|j�qWWd|jj�XdS)z�Discard all session cookies.

        Note that the .save() method won't save session cookies anyway, unless
        you ask otherwise by passing a true ignore_discard argument.

        N)r8rIr�rUr�r�rzrJ)r�r�rrr�clear_session_cookies�s

zCookieJar.clear_session_cookiescCsT|jj�z8tj�}x*|D]"}|j|�r|j|j|j|j�qWWd|jj�XdS)a�Discard all expired cookies.

        You probably don't need to call this method: expired cookies are never
        sent back to the server (provided you're using DefaultCookiePolicy),
        this method is called by CookieJar itself every so often, and the
        .save() method won't save expired cookies anyway (unless you ask
        otherwise by passing a true ignore_expires argument).

        N)	r8rIrMr�rUr�r�rzrJ)r�r�r�rrrrK�s



zCookieJar.clear_expired_cookiescCs
t|j�S)N)r0r9)r�rrr�__iter__�szCookieJar.__iter__cCsd}x|D]}|d}q
W|S)z#Return number of contained cookies.r	rr)r�r�r�rrr�__len__�s
zCookieJar.__len__cCs6g}x|D]}|jt|��q
Wd|jjdj|�fS)Nz<%s[%s]>z, )rtr�r�r�r~)r��rr�rrrr��s
zCookieJar.__repr__cCs6g}x|D]}|jt|��q
Wd|jjdj|�fS)Nz<%s[%s]>z, )rtrmr�r�r~)r�rhr�rrrr��s
zCookieJar.__str__)N)NNN)"r�r�r�r�rv�compilerDrEZstrict_domain_reZ	domain_reZdots_re�ASCII�magic_rer�r;r=r?rGrHrSrXrYrZr`rbrardrUrerKrfrgr�r�rrrrr�s8





;!a\	6


c@seZdZdS)rN)r�r�r�rrrrr�sc@s8eZdZdZddd�Zd
dd�Zddd	�Zdd
d�ZdS)rz6CookieJar that can be loaded from and saved to a file.NFc	CsJtj||�|dk	r6y|dWntd��YnX||_t|�|_dS)z}
        Cookies are NOT loaded from the named file until either the .load() or
        .revert() method is called.

        NrVzfilename must be string-like)rr�rL�filenamerT�	delayload)r�rlrmr:rrrr��szFileCookieJar.__init__cCs
t��dS)zSave cookies to a file.N)r�)r�rl�ignore_discard�ignore_expiresrrr�save�szFileCookieJar.savecCsJ|dkr"|jdk	r|j}ntt��t|��}|j||||�WdQRXdS)zLoad cookies from a file.N)rlrL�MISSING_FILENAME_TEXT�open�_really_load)r�rlrnrorrrr�load�s

zFileCookieJar.loadcCs�|dkr"|jdk	r|j}ntt��|jj�zFtj|j�}i|_y|j|||�Wnt	k
rn||_�YnXWd|jj
�XdS)z�Clear all cookies and reload cookies from a saved file.

        Raises LoadError (or OSError) if reversion is not successful; the
        object's state will not be altered if this happens.

        N)rlrLrqr8rIr��deepcopyr9rt�OSErrorrJ)r�rlrnroZ	old_staterrr�reverts

zFileCookieJar.revert)NFN)NFF)NFF)NFF)r�r�r�r�r�rprtrwrrrrr�s


	cCs$|j|jfd|jfd|jfg}|jdk	r8|jd|jf�|jrH|jd�|jrX|jd�|jrh|jd�|j	rx|jd�|j
r�|jd	tt|j
��f�|j
r�|jd�|jr�|jd|jf�|jr�|jd|jf�t|jj��}x$|D]}|j|t|j|�f�q�W|jd
t|j�f�t|g�S)z�Return string representation of Cookie in the LWP cookie file format.

    Actually, the format is extended a bit -- see module docstring.

    r�r�Nr��	path_spec�	port_spec�
domain_dotr�r�r�r�rMr�)rxN)ryN)rzN)r�N)r�N)rzr{r�r�r�rtr�r�r�r�r�r5rZr�r�r�r*r�r+rmr�r�)r�r�r+r�rrr�lwp_cookie_strs6







r{c@s,eZdZdZddd�Zddd�Zd	d
�ZdS)
ra[
    The LWPCookieJar saves a sequence of "Set-Cookie3" lines.
    "Set-Cookie3" is the format used by the libwww-perl library, not known
    to be compatible with any browser, but which is easy to read and
    doesn't lose information about RFC 2965 cookies.

    Additional methods

    as_lwp_str(ignore_discard=True, ignore_expired=True)

    TcCs\tj�}g}x>|D]6}|r$|jr$q|r6|j|�r6q|jdt|��qWdj|dg�S)z�Return cookies as a string of "\n"-separated "Set-Cookie3" headers.

        ignore_discard and ignore_expires: see docstring for FileCookieJar.save

        zSet-Cookie3: %s�
rV)rMr�r�rtr{r~)r�rnror�rhr�rrr�
as_lwp_strGs
zLWPCookieJar.as_lwp_strNFcCsX|dkr"|jdk	r|j}ntt��t|d��"}|jd�|j|j||��WdQRXdS)N�wz#LWP-Cookies-2.0
)rlrLrqrr�writer})r�rlrnrorrrrrpWs

zLWPCookieJar.savecCsL|j�}|jj|�s$d|}t|��tj�}d}d}	d}
�yʐx�|j�}|dkrRP|j|�s^q@|t|�d�j�}�x�t|g�D�]x}|d\}
}i}i}x|	D]}d||<q�Wx�|dd�D]t\}}|dk	r�|j	�}nd}||
k�s�||	k�r�|}||	k�r|dk�rd}|||<q�||
k�r*|||<q�|||<q�W|j
}|d�}|d�}|dk	�r^t|�}|dk�rld}|d�}|jd�}t|d�|
||d	�|d�|||d�|d
�|d�|d�|||d
�|d�|�}|�r�|j
�r�q�|�r�|j|��r�q�|j|�q�Wq@WWnBtk
�r�Yn,tk
�rFt�td||f��YnXdS)Nz5%r does not look like a Set-Cookie3 (LWP) format filezSet-Cookie3:ryrxrzr�r�r�r�r�r�r�r�rMrVr	FrTr�z&invalid Set-Cookie3 format file %r: %r)ryrxrzr�r�)r�r�r�r�r�r�rM)�readlinerkr@rrMrurr�r|rKr�rdrr�r�rarvr]r)r�rrlrnro�magicrr��headerrPrQ�line�datarzr{rRr�r�r�r�r�r�r�r�r�rcrrrrscs�











zLWPCookieJar._really_load)TT)NFF)r�r�r�r�r}rprsrrrrr:s

c@s0eZdZdZejd�ZdZdd�Zd
dd	�Z	dS)ra�

    WARNING: you may want to backup your browser's cookies file if you use
    this class to save cookies.  I *think* it works, but there have been
    bugs in the past!

    This class differs from CookieJar only in the format it uses to save and
    load cookies to and from a file.  This class uses the Mozilla/Netscape
    `cookies.txt' format.  lynx uses this file format, too.

    Don't expect cookies saved while the browser is running to be noticed by
    the browser (in fact, Mozilla on unix will overwrite your saved cookies if
    you change them on disk while it's running; on Windows, you probably can't
    save at all while the browser is running).

    Note that the Mozilla/Netscape format will downgrade RFC2965 cookies to
    Netscape cookies on saving.

    In particular, the cookie version and port number information is lost,
    together with information about whether or not Path, Port and Discard were
    specified by the Set-Cookie2 (or Set-Cookie) header, and whether or not the
    domain as set in the HTTP header started with a dot (yes, I'm aware some
    domains in Netscape files start with a dot and some don't -- trust me, you
    really don't want to know any more about this).

    Note that though Mozilla and Netscape use the same format, they use
    slightly different headers.  The class saves cookies using the Netscape
    header by default (Mozilla can cope with that).

    z#( Netscape)? HTTP Cookie Filezr# Netscape HTTP Cookie File
# http://curl.haxx.se/rfc/cookie_spec.html
# This is a generated file!  Do not edit.

cCs|tj�}|j�}|jj|�s(td|���y
�x|j�}|dkrBP|jd�rX|dd�}|j�jd�s0|j�dkrtq0|jd�\}}	}
}}}
}|dk}|	dk}	|
dkr�|}
d}|jd	�}|	|ks�t	�d
}|dkr�d}d}t
d|
|dd
||	||
d
|||ddi�}|�r|j�rq0|�r$|j|��r$q0|j
|�q0WWnBtk
�rL�Yn,tk
�rvt�td
||f��YnXdS)Nz4%r does not look like a Netscape format cookies filerVr|r�#r�	�TRUEr�FTr	z+invalid Netscape format cookies file %r: %rr�)r�r)rMr�rkr@rr�r�rur�rnrr�r�rarvr]r)r�rrlrnror�r�r�r�r�r�r�r�rzr{r�r�rcrrrrs�sb

zMozillaCookieJar._really_loadNFcCs|dkr"|jdk	r|j}ntt��t|d���}|j|j�tj�}x�|D]�}|rZ|jrZqH|rl|j|�rlqH|j	rxd}nd}|j
jd�r�d}nd}|jdk	r�t
|j�}	nd}	|jdkr�d}
|j}n|j}
|j}|jdj|j
||j||	|
|g�d�qHWWdQRXdS)Nr~r�ZFALSEr�rVr�r|)rlrLrqrrrr�rMr�r�r�r�rur�rmr{rzr~r�)r�rlrnrorr�r�r�r�r�rzr{rrrrps<



zMozillaCookieJar.save)NFF)
r�r�r�r�rvrirkr�rsrprrrrr�s

A)N)N)Yr��__all__r�r-rvrMZurllib.parser�Zurllib.requestZ	threadingr6�ImportErrorZdummy_threadingZhttp.clientZhttpZcalendarr
rrrrmZclientZ	HTTP_PORTr�rqrr%r,r6r7rIr(rtrKr5r8r>rirjr?rFrSrX�Ir\�Xr^rarbrdrjrorprrrqr|r}r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�rrrr-r0r4rrvrrr{rrrrrr�<module>s�



88!



U
D'


#b!\:xclient.cpython-36.pyc000064400000104623151732672750010475 0ustar003

���i*��@srdZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
mZdddddd	d
ddd
ddddddddgZdZ
dZdZdZdZdZe�jejj�dd�ejjj�D�ZdZdZd Zejd!�jZejd"�jZ ejd#�Z!ejd$�Z"d%d&d'hZ#dCd)d*�Z$Gd+d,�d,ej%j&�Z'd-d.�Z(e'fd/d0�Z)Gd1d�dej*�Z+Gd2d�d�Z,yddl-Z-Wne.k
�rlYnXGd3d4�d4e,�Z/ej0d4�Gd5d�de1�Z2Gd6d�de2�Z3Gd7d�de2�Z4Gd8d�de2�Z5Gd9d	�d	e2�Z6Gd:d
�d
e2�Z7Gd;d�de2�Z8Gd<d
�d
e2�Z9Gd=d�de9�Z:Gd>d�de9�Z;Gd?d�de9�Z<Gd@d�de2�Z=GdAd�de2�Z>GdBd�de?e=�Z@e2ZAdS)Da�
HTTP/1.1 client library

<intro stuff goes here>
<other stuff, too>

HTTPConnection goes through a number of "states", which define when a client
may legally make another request or fetch the response for a particular
request. This diagram details these state transitions:

    (null)
      |
      | HTTPConnection()
      v
    Idle
      |
      | putrequest()
      v
    Request-started
      |
      | ( putheader() )*  endheaders()
      v
    Request-sent
      |\_____________________________
      |                              | getresponse() raises
      | response = getresponse()     | ConnectionError
      v                              v
    Unread-response                Idle
    [Response-headers-read]
      |\____________________
      |                     |
      | response.read()     | putrequest()
      v                     v
    Idle                  Req-started-unread-response
                     ______/|
                   /        |
   response.read() |        | ( putheader() )*  endheaders()
                   v        v
       Request-started    Req-sent-unread-response
                            |
                            | response.read()
                            v
                          Request-sent

This diagram presents the following rules:
  -- a second request may not be started until {response-headers-read}
  -- a response [object] cannot be retrieved until {request-sent}
  -- there is no differentiation between an unread response body and a
     partially read response body

Note: this enforcement is applied by the HTTPConnection class. The
      HTTPResponse class does not enforce this state machine, which
      implies sophisticated clients may accelerate the request/response
      pipeline. Caution should be taken, though: accelerating the states
      beyond the above pattern may imply knowledge of the server's
      connection-close behavior for certain requests. For example, it
      is impossible to tell whether the server will close the connection
      UNTIL the response headers have been read; this means that further
      requests cannot be placed into the pipeline until it is known that
      the server will NOT be closing the connection.

Logical State                  __state            __response
-------------                  -------            ----------
Idle                           _CS_IDLE           None
Request-started                _CS_REQ_STARTED    None
Request-sent                   _CS_REQ_SENT       None
Unread-response                _CS_IDLE           <response_class>
Req-started-unread-response    _CS_REQ_STARTED    <response_class>
Req-sent-unread-response       _CS_REQ_SENT       <response_class>
�N)�urlsplit�HTTPResponse�HTTPConnection�
HTTPException�NotConnected�UnknownProtocol�UnknownTransferEncoding�UnimplementedFileMode�IncompleteRead�
InvalidURL�ImproperConnectionState�CannotSendRequest�CannotSendHeader�ResponseNotReady�
BadStatusLine�LineTooLong�RemoteDisconnected�error�	responses�Pi�ZUNKNOWNZIdlezRequest-startedzRequest-sentcCsi|]}|j|�qS�)�phrase)�.0�vrr�#/usr/lib64/python3.6/http/client.py�
<dictcomp>ksrii�ds[^:\s][^:\r\n]*s\n(?![ \t])|\r(?![ \t\n])z[- ]z[-]ZPATCHZPOSTZPUT�datacCsfy
|jd�Stk
r`}z:t|j|j|j|jd|j�||j|j�|f�d�WYdd}~XnXdS)z<Call data.encode("latin-1") but show a better error message.zlatin-1z`%s (%.20r) is not valid Latin-1. Use %s.encode('utf-8') if you want to send it encoded in UTF-8.N)�encode�UnicodeEncodeError�encoding�object�start�end�title)r�name�errrrr�_encode�s
r'c@seZdZdd�ZdS)�HTTPMessagecCsn|j�d}t|�}g}d}xL|j�D]@}|d|�j�|krDd}n|dd�j�sXd}|r&|j|�q&W|S)a�Find all header lines matching a given header name.

        Look through the list of headers and find all lines matching a given
        header name (and their continuation lines).  A list of the lines is
        returned, without interpretation.  If the header does not occur, an
        empty list is returned.  If the header occurs multiple times, all
        occurrences are returned.  Case is not important in the header name.

        �:rN�)�lower�len�keys�isspace�append)�selfr%�nZlstZhit�linerrr�getallmatchingheaders�s
z!HTTPMessage.getallmatchingheadersN)�__name__�
__module__�__qualname__r3rrrrr(�sr(cCs\g}xR|jtd�}t|�tkr(td��|j|�t|�tkrJtdt��|dkrPqW|S)z�Reads potential header lines into a list from a file pointer.

    Length of line is limited by _MAXLINE, and number of
    headers is limited by _MAXHEADERS.
    r*zheader linezgot more than %d headers�
�
�)r7r8r9)�readline�_MAXLINEr,rr/�_MAXHEADERSr)�fp�headersr2rrr�
_read_headers�s
r?cCs,t|�}dj|�jd�}tjj|d�j|�S)aGParses only RFC2822 headers from a file pointer.

    email Parser wants to see strings rather than bytes.
    But a TextIOWrapper around self.rfile would buffer too many bytes
    from the stream, bytes which we later need to read as bytes.
    So we read the correct bytes here, as bytes, for email Parser
    to parse.

    r9z
iso-8859-1)�_class)r?�join�decode�email�parserZParserZparsestr)r=r@r>Zhstringrrr�
parse_headers�s
rEcseZdZd@dd�Zdd�Zdd�Zd	d
�Zdd�Z�fd
d�Z�fdd�Z	dd�Z
dd�ZdAdd�Zdd�Z
dd�Zdd�Zdd�Zdd �Zd!d"�Zd#d$�Zd%d&�ZdCd(d)�ZdEd*d+�ZdG�fd,d-�	Zd.d/�Zd0d1�Zd2d3�ZdHd4d5�Zd6d7�Zd8d9�Zd:d;�Zd<d=�Zd>d?�Z �Z!S)IrrNcCsR|jd�|_||_||_d|_|_t|_t|_t|_	t|_
t|_t|_t|_
dS)N�rb)�makefiler=�
debuglevel�_methodr>�msg�_UNKNOWN�version�status�reason�chunked�
chunk_left�length�
will_close)r0�sockrH�method�urlrrr�__init__�szHTTPResponse.__init__cCst|jjtd�d�}t|�tkr*td��|jdkrBtdt|��|sNt	d��y|j
dd�\}}}WnFtk
r�y|j
dd�\}}d}Wntk
r�d}YnXYnX|jd	�s�|j
�t|��y$t|�}|d
ks�|dkr�t|��Wntk
�rt|��YnX|||fS)Nr*z
iso-8859-1zstatus linerzreply:z-Remote end closed connection without response��zHTTP/ri�)�strr=r:r;r,rrH�print�reprr�split�
ValueError�
startswith�_close_connr�int)r0r2rLrMrNrrr�_read_statuss2

zHTTPResponse._read_statuscCs�|jdk	rdSx<|j�\}}}|tkr(Pt|j�}|jdkrFtd|�~qW||_|_|j	�|_
|dkrrd|_n|jd�r�d|_nt
|��t|j�|_|_|jdkr�x&|jD]}td|d	|jj|��q�W|jjd
�}|r�|j�dkr�d|_d|_nd
|_|j�|_d|_|jjd�}|jjd
�}|�rx|j�rxyt|�|_Wntk
�rbd|_YnX|jdk�r~d|_nd|_|tk�s�|tk�s�d|k�o�dkn�s�|jdk�r�d|_|j�r�|j�r�|jdk�r�d|_dS)Nrzheaders:�HTTP/1.0�HTTP/0.9�
zHTTP/1.�zheader:r)ztransfer-encodingrOTFzcontent-lengthr���HEAD)rbrc)r>raZCONTINUEr?r=rHrZ�coderM�striprNrLr^rrErJ�getr+rOrP�_check_closerRrQr`r]Z
NO_CONTENTZNOT_MODIFIEDrI)r0rLrMrNZskipped_headers�hdrZtr_encrQrrr�begin9s\









zHTTPResponse.begincCs�|jjd�}|jdkr:|jjd�}|r6d|j�kr6dSdS|jjd�rJdS|r^d|j�kr^dS|jjd�}|r~d|j�kr~dSdS)NZ
connectionre�closeTFz
keep-alivezproxy-connection)r>rjrLr+)r0ZconnZpconnrrrrk�s
zHTTPResponse._check_closecCs|j}d|_|j�dS)N)r=rn)r0r=rrrr_�szHTTPResponse._close_connc
s$zt�j�Wd|jr|j�XdS)N)�superrnr=r_)r0)�	__class__rrrn�szHTTPResponse.closecst�j�|jr|jj�dS)N)ro�flushr=)r0)rprrrq�s
zHTTPResponse.flushcCsdS)zAlways returns TrueTr)r0rrr�readable�szHTTPResponse.readablecCs
|jdkS)z!True if the connection is closed.N)r=)r0rrr�isclosed�szHTTPResponse.isclosedcCs�|jdkrdS|jdkr$|j�dS|dk	rRt|�}|j|�}t|�d|�j�S|jr`|j�S|j	dkrv|jj
�}n6y|j|j	�}Wntk
r�|j��YnXd|_	|j�|SdS)Nr9rgr)
r=rIr_�	bytearray�readinto�
memoryview�tobytesrO�_readall_chunkedrQ�read�
_safe_readr
)r0�amt�br1�srrrry�s*



zHTTPResponse.readcCs�|jdkrdS|jdkr$|j�dS|jr4|j|�S|jdk	r^t|�|jkr^t|�d|j�}|jj|�}|r~|r~|j�n&|jdk	r�|j|8_|js�|j�|S)z^Read up to len(b) bytes into bytearray b and return the number
        of bytes read.
        Nrrg)	r=rIr_rO�_readinto_chunkedrQr,rvru)r0r|r1rrrru�s$






zHTTPResponse.readintocCsp|jjtd�}t|�tkr$td��|jd�}|dkrB|d|�}y
t|d�Stk
rj|j��YnXdS)Nr*z
chunk size�;r�)	r=r:r;r,r�findr`r]r_)r0r2�irrr�_read_next_chunk_size
s

z"HTTPResponse._read_next_chunk_sizecCs>x8|jjtd�}t|�tkr&td��|s,P|dkrPqWdS)Nr*ztrailer line�
r8r9)r�r8r9)r=r:r;r,r)r0r2rrr�_read_and_discard_trailersz&HTTPResponse._read_and_discard_trailercCsl|j}|sh|dk	r|jd�y|j�}Wntk
rDtd��YnX|dkrb|j�|j�d}||_|S)NrWr9r)rPrzr�r]r
r�r_)r0rPrrr�_get_chunk_left(s
zHTTPResponse._get_chunk_leftcCsr|jtkst�g}y8x,|j�}|dkr(P|j|j|��d|_qWdj|�Stk
rltdj|���YnXdS)Nrr9)	rOrK�AssertionErrorr�r/rzrPrAr
)r0�valuerPrrrrx@s

zHTTPResponse._readall_chunkedcCs�|jtkst�d}t|�}yvxp|j�}|dkr2|St|�|krZ|j|�}|||_||S|d|�}|j|�}||d�}||7}d|_qWWn(tk
r�tt	|d|����YnXdS)Nr)
rOrKr�rvr�r,�_safe_readintorPr
�bytes)r0r|�total_bytes�mvbrPr1�temp_mvbrrrr~Ns&


zHTTPResponse._readinto_chunkedcCsXg}xH|dkrL|jjt|t��}|s4tdj|�|��|j|�|t|�8}qWdj|�S)aVRead the number of bytes requested, compensating for partial reads.

        Normally, we have a blocking socket, but a read() can be interrupted
        by a signal (resulting in a partial read).

        Note that we cannot distinguish between EOF and an interrupt when zero
        bytes have been read. IncompleteRead() will be raised in this
        situation.

        This function should be used when <amt> bytes "should" be present for
        reading. If the bytes are truly not available (due to EOF), then the
        IncompleteRead exception can be used to detect the problem.
        rr9)r=ry�min�	MAXAMOUNTr
rAr/r,)r0r{r}�chunkrrrrzfs

zHTTPResponse._safe_readcCs�d}t|�}xt|t|�kr�tt|�kr@|dt�}|jj|�}n|jj|�}|sjtt|d|��t|���||d�}||7}qW|S)z2Same as _safe_read, but for reading into a buffer.rN)rvr,r�r=rur
r�)r0r|r�r�r�r1rrrr�}szHTTPResponse._safe_readintor*cCs�|jdks|jdkrdS|jr(|j|�S|jdk	rJ|dksD||jkrJ|j}y|jj|�}Wn*tk
r�|dkrt�|jjd�}YnX|r�|r�|j�n|jdk	r�|jt|�8_|S)zvRead with at most one underlying system call.  If at least one
        byte is buffered, return that instead.
        Nrgr9rr�ii@)	r=rIrO�_read1_chunkedrQ�read1r]r_r,)r0r1�resultrrrr��s"



zHTTPResponse.read1cCs4|jdks|jdkrdS|jr(|j|�S|jj|�S)Nrgr9)r=rIrO�
_peek_chunked�peek)r0r1rrrr��s

zHTTPResponse.peekcs�|jdks|jdkrdS|jr*t�j|�S|jdk	rL|dksF||jkrL|j}|jj|�}|rl|rl|j�n|jdk	r�|jt|�8_|S)Nrgr9r)r=rIrOror:rQr_r,)r0�limitr�)rprrr:�s


zHTTPResponse.readlinecCsf|j�}|dks|dkrdSd|ko.|kns8|}|jj|�}|jt|�8_|sbtd��|S)Nrr9)r�r=r�rPr,r
)r0r1rPryrrrr��szHTTPResponse._read1_chunkedcCsBy|j�}Wntk
r dSX|dkr.dS|jj|�d|�S)Nr9)r�r
r=r�)r0r1rPrrrr��szHTTPResponse._peek_chunkedcCs
|jj�S)N)r=�fileno)r0rrrr��szHTTPResponse.filenocCsH|jdkrt��|jj|�p|}t|t�s6t|d�r:|Sdj|�SdS)axReturns the value of the header matching *name*.

        If there are multiple matching headers, the values are
        combined into a single string separated by commas and spaces.

        If no matching header is found, returns *default* or None if
        the *default* is not specified.

        If the headers are unknown, raises http.client.ResponseNotReady.

        N�__iter__z, )r>rZget_all�
isinstancerY�hasattrrA)r0r%�defaultr>rrr�	getheader�s
zHTTPResponse.getheadercCs|jdkrt��t|jj��S)z&Return list of (header, value) tuples.N)r>r�list�items)r0rrr�
getheaders�s
zHTTPResponse.getheaderscCs|S)Nr)r0rrrr��szHTTPResponse.__iter__cCs|jS)ajReturns an instance of the class mimetools.Message containing
        meta-information associated with the URL.

        When the method is HTTP, these headers are those returned by
        the server at the head of the retrieved HTML page (including
        Content-Length and Content-Type).

        When the method is FTP, a Content-Length header will be
        present if (as is now usual) the server passed back a file
        length in response to the FTP retrieval request. A
        Content-Type header will be present if the MIME type can be
        guessed.

        When the method is local-file, returned headers will include
        a Date representing the file's last-modified time, a
        Content-Length giving file size, and a Content-Type
        containing a guess at the file's type. See also the
        description of the mimetools module.

        )r>)r0rrr�info�szHTTPResponse.infocCs|jS)aZReturn the real URL of the page.

        In some cases, the HTTP server redirects a client to another
        URL. The urlopen() function handles this transparently, but in
        some cases the caller needs to know which URL the client was
        redirected to. The geturl() method can be used to get at this
        redirected URL.

        )rU)r0rrr�geturls
zHTTPResponse.geturlcCs|jS)zuReturn the HTTP status code that was sent with the response,
        or None if the URL is not an HTTP URL.

        )rM)r0rrr�getcodeszHTTPResponse.getcode)rNN)N���)r�r�)r�r�)r�)N)"r4r5r6rVrarmrkr_rnrqrrrsryrur�r�r�rxr~rzr�r�r�r:r�r�r�r�r�r�r�r�r��
__classcell__rr)rprr�s<	
!K

 "

	

c@s�eZdZdZdZeZeZdZ	dZ
edd��Zedd��Z
d	ejd	fd
d�Zd0dd
�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zdd�Zd1dd �Zd2d!d"�Zd#d$�Zd%d&�Zd3dd'�d(d)�Zd	ifdd'�d*d+�Zd,d-�Z d.d/�Z!d	S)4rrezHTTP/1.1r*rcCst|tj�S)zFTest whether a file-like object is a text or a binary stream.
        )r��io�
TextIOBase)�streamrrr�
_is_textIO0szHTTPConnection._is_textIOcCsd|dkr|j�tkrdSdSt|d�r*dSyt|�}|jStk
rLYnXt|t�r`t|�SdS)aGet the content-length based on the body.

        If the body is None, we set Content-Length: 0 for methods that expect
        a body (RFC 7230, Section 3.3.2). We also set the Content-Length for
        any method if the body is a str or bytes-like object and not a file.
        Nrry)	�upper�_METHODS_EXPECTING_BODYr�rv�nbytes�	TypeErrorr�rYr,)�bodyrTZmvrrr�_get_content_length6s

z"HTTPConnection._get_content_lengthNcCs\||_||_d|_g|_d|_t|_d|_d|_d|_	i|_
|j||�\|_|_
tj|_dS)N)�timeout�source_addressrS�_buffer�_HTTPConnection__response�_CS_IDLE�_HTTPConnection__staterI�_tunnel_host�_tunnel_port�_tunnel_headers�
_get_hostport�host�port�socketZcreate_connection�_create_connection)r0r�r�r�r�rrrrVVszHTTPConnection.__init__cCs<|jrtd��|j||�\|_|_|r.||_n
|jj�dS)aDSet up host and port for HTTP CONNECT tunnelling.

        In a connection that uses HTTP CONNECT tunneling, the host passed to the
        constructor is used as a proxy server that relays all communication to
        the endpoint passed to `set_tunnel`. This done by sending an HTTP
        CONNECT request to the proxy server when the connection is established.

        This method must be called before the HTML connection has been
        established.

        The headers argument should be a mapping of extra HTTP headers to send
        with the CONNECT request.
        z.Can't set up tunnel for established connectionN)rS�RuntimeErrorr�r�r�r��clear)r0r�r�r>rrr�
set_tunneliszHTTPConnection.set_tunnelcCs�|dkr�|jd�}|jd�}||kr�yt||dd��}WnHtk
r�||dd�dkrh|j}ntd||dd���YnX|d|�}n|j}|r�|ddkr�|ddkr�|dd	�}||fS)
Nr)�]r*rXznonnumeric port: '%s'r�[r�r�)�rfindr`r]�default_portr)r0r�r�r��jrrrr��s

zHTTPConnection._get_hostportcCs
||_dS)N)rH)r0�levelrrr�set_debuglevel�szHTTPConnection.set_debuglevelcCsd|j|jf}|jd�}|j|�x6|jj�D](\}}d||f}|jd�}|j|�q0W|jd�|j|j|jd�}|j	�\}}	}
|	t
jjkr�|j
�td|	|
j�f��xP|jjtd�}t|�tkr�td	��|s�P|dkr�P|jdkr�td
|j��q�WdS)NzCONNECT %s:%d HTTP/1.0
�asciiz%s: %s
zlatin-1�
)rTzTunnel connection failed: %d %sr*zheader liner8r9rzheader:)r�r8r9)r�r�r�sendr�r��response_classrSrIra�http�
HTTPStatusZOKrn�OSErrorrir=r:r;r,rrHrZrB)r0Zconnect_strZ
connect_bytes�headerr�Z
header_strZheader_bytes�responserLrh�messager2rrr�_tunnel�s2





zHTTPConnection._tunnelcCsB|j|j|jf|j|j�|_|jjtjtj	d�|j
r>|j�dS)z3Connect to the host and port specified in __init__.r*N)r�r�r�r�r�rSZ
setsockoptr�ZIPPROTO_TCPZTCP_NODELAYr�r�)r0rrr�connect�s
zHTTPConnection.connectcCsBt|_z|j}|r d|_|j�Wd|j}|r<d|_|j�XdS)z(Close the connection to the HTTP server.N)r�r�rSrnr�)r0rSr�rrrrn�szHTTPConnection.closecCs|jdkr |jr|j�nt��|jdkr8tdt|��d}t|d�r�|jdkrXtd�|j|�}|rx|jdkrxtd�x.|j	|�}|s�P|r�|j
d�}|jj|�qzWdSy|jj|�WnNtk
�r
t
|tj�r�x*|D]}|jj|�q�Wntd	t|���YnXdS)
z�Send `data' to the server.
        ``data`` can be a string object, a bytes object, an array object, a
        file-like object that supports a .read() method, or an iterable object.
        Nrzsend:i ryzsendIng a read()ablezencoding file using iso-8859-1z
iso-8859-1z9data should be a bytes-like object or an iterable, got %r)rS�	auto_openr�rrHrZr[r�r�ryrZsendallr�r��collections�Iterable�type)r0r�	blocksizer�	datablock�drrrr��s:








zHTTPConnection.sendcCs|jj|�dS)zuAdd a line of output to the current request buffer.

        Assumes that the line does *not* end with \r\n.
        N)r�r/)r0r}rrr�_output�szHTTPConnection._outputccsdd}|jdkrtd�|j|�}|r6|jdkr6td�x(|j|�}|sHP|rV|jd�}|Vq8WdS)Ni rzsendIng a read()ablezencoding file using iso-8859-1z
iso-8859-1)rHrZr�ryr)r0rrr�rr�rrr�_read_readable�s



zHTTPConnection._read_readableFcCs$|jjd
�dj|j�}|jdd�=|j|�|dk	�r t|d�rN|j|�}nZyt|�WnFtk
r�yt|�}Wn$tk
r�tdt	|���YnXYnX|f}xZ|D]R}|s�|j
dkr�td�q�|r�|jdkr�t
|�d	�d
�jd�|d}|j|�q�W|�r |jdk�r |jd�dS)z�Send the currently buffered request and clear the buffer.

        Appends an extra \r\n to the buffer.
        A message_body may be specified, to be appended to the request.
        r9s
NryzAmessage_body should be a bytes-like object or an iterable, got %rrzZero length chunk ignoredre�Xz
r�s0

)r9r9)r��extendrAr�r�r�rvr��iterr�rHrZ�	_http_vsnr,r)r0�message_body�encode_chunkedrJZchunksr�rrr�_send_outputs4




zHTTPConnection._send_outputc

Cs�|jr|jj�rd|_|jtkr(t|_n
t|j��|j|�||_|sJd}tj	|�}|rrt
d|�d|j��d���d|||jf}|j
|jd��|jdk�r�|�s�d	}|jd
�r�t|�\}}}}}|�ry|jd�}	Wntk
r�|jd�}	YnX|jd|	�n�|j�r|j}
|j}n|j}
|j}y|
jd�}Wn tk
�rV|
jd�}YnX|
jd
�dk�rtd|d}||jk�r�|jd|�n|jd�}|jdd||f�|�s�|jdd�ndS)a`Send a request to the server.

        `method' specifies an HTTP request method, e.g. 'GET'.
        `url' specifies the object being requested, e.g. '/index.html'.
        `skip_host' if True does not add automatically a 'Host:' header
        `skip_accept_encoding' if True does not add automatically an
           'Accept-Encoding:' header
        N�/z&URL can't contain control characters. z (found at least �)z%s %s %sr�rerXr�ZidnaZHostr)r�[�]z%s:%szAccept-EncodingZidentity)r�rsr�r��_CS_REQ_STARTEDr
�_validate_methodrI�!_contains_disallowed_url_pchar_re�searchr�group�
_http_vsn_strr�rr�r^rr�	putheaderr�r�r�r�r�r�rB)
r0rTrU�	skip_host�skip_accept_encoding�match�requestZnetlocZnilZ
netloc_encr�r�Zhost_encrrr�
putrequestAsV






zHTTPConnection.putrequestcCs,tj|�}|r(td|�d|j��d���dS)z&Validate a method name for putrequest.z)method can't contain control characters. z (found at least r�N)�$_contains_disallowed_method_pchar_rer�r]r�)r0rTr�rrrr��s
zHTTPConnection._validate_methodcGs�|jtkrt��t|d�r$|jd�}t|�s:td|f��t|�}xht|�D]\\}}t|d�rn|jd�||<nt	|t
�r�t|�jd�||<t||�rLtd||f��qLWdj
|�}|d|}|j|�dS)	zkSend a request header line to the server.

        For example: h.putheader('Accept', 'text/html')
        rr�zInvalid header name %rzlatin-1zInvalid header value %rs
	s: N)r�r�rr�r�_is_legal_header_namer]r��	enumerater�r`rY�_is_illegal_header_valuerAr�)r0r��valuesr�Z	one_valuer�rrrr��s"





zHTTPConnection.putheader)r�cCs*|jtkrt|_nt��|j||d�dS)z�Indicate that the last header line has been sent to the server.

        This method sends the request to the server.  The optional message_body
        argument can be used to pass a message body associated with the
        request.
        )r�N)r�r��_CS_REQ_SENTrr�)r0r�r�rrr�
endheaders�s
zHTTPConnection.endheaderscCs|j|||||�dS)z&Send a complete request to the server.N)�
_send_request)r0rTrUr�r>r�rrrr��szHTTPConnection.requestcCs�tdd�|D��}i}d|kr&d|d<d|kr6d|d<|j||f|�d|kr�d	|kr�d
}|j||�}|dkr�|dk	r�|jdkr�td|�d
}|jdd�q�|jdt|��nd
}x |j�D]\}	}
|j|	|
�q�Wt|t�r�t	|d�}|j
||d�dS)Ncss|]}|j�VqdS)N)r+)r�krrr�	<genexpr>�sz/HTTPConnection._send_request.<locals>.<genexpr>r�r*r�zaccept-encodingr�zcontent-lengthztransfer-encodingFrzUnable to determine size of %rTzTransfer-EncodingrOzContent-Lengthr�)r�)�	frozensetr�r�rHrZr�rYr�r�r'r�)r0rTrUr�r>r�Zheader_namesZskipsZcontent_lengthrlr�rrrr��s0	


zHTTPConnection._send_requestcCs�|jr|jj�rd|_|jtks&|jr0t|j��|jdkrR|j|j|j|jd�}n|j|j|jd�}yZy|j	�Wnt
k
r�|j��YnX|jt
ks�t�t|_|jr�|j�n||_|S|j��YnXdS)a)Get the response from the server.

        If the HTTPConnection is in the correct state, returns an
        instance of HTTPResponse or of whatever object is returned by
        the response_class variable.

        If a request has not been sent or if a previous response has
        not be handled, ResponseNotReady is raised.  If the HTTP
        response indicates that the connection should be closed, then
        it will be closed before the response is returned.  When the
        connection is closed, the underlying socket is closed.
        Nr)rT)r�rsr�r�rrHr�rSrIrm�ConnectionErrorrnrRrKr�r�)r0r�rrr�getresponse)s.


zHTTPConnection.getresponse)NN)NF)FF)N)"r4r5r6r�r�rr��	HTTP_PORTr�r�rH�staticmethodr�r�r��_GLOBAL_DEFAULT_TIMEOUTrVr�r�r�r�r�rnr�r�r�r�r�r�r�r�r�r�r�rrrrr&s< 
	'
6
	
.csFeZdZdZeZdddejdfddd��fdd�Z�fdd�Z	�Z
S)�HTTPSConnectionz(This class allows communication via SSL.N)�context�check_hostnamecs�tt|�j||||�|dk	s.|dk	s.|dk	rDddl}	|	jdtd�||_||_|dkrptj	�}|j
dk	rpd|_
|jtjk}
|dkr�|j
}|r�|
r�td��|s�|r�|j||�|j
dk	r�d|_
||_||_dS)NrzTkey_file, cert_file and check_hostname are deprecated, use a custom context instead.rWTzMcheck_hostname needs a SSL context with either CERT_OPTIONAL or CERT_REQUIRED)rorrV�warnings�warn�DeprecationWarning�key_file�	cert_file�sslZ_create_default_https_contextZpost_handshake_authZverify_modeZ	CERT_NONErr]Zload_cert_chain�_context�_check_hostname)r0r�r�r	r
r�r�rrrZwill_verify)rprrrVts0


zHTTPSConnection.__init__cs�t�j�|jr|j}n|j}|jj|j|d�|_|jjr�|jr�yt	j
|jj�|�Wn.tk
r�|jj
tj�|jj��YnXdS)z(Connect to a host on a given (SSL) port.)�server_hostnameN)ror�r�r�rZwrap_socketrSrr
rZmatch_hostnameZgetpeercert�	ExceptionZshutdownr�Z	SHUT_RDWRrn)r0r)rprrr��s



zHTTPSConnection.connect)r4r5r6�__doc__�
HTTPS_PORTr�r�rrVr�r�rr)rprrmsrc@seZdZdS)rN)r4r5r6rrrrr�sc@seZdZdS)rN)r4r5r6rrrrr�sc@seZdZdS)rN)r4r5r6rrrrr�sc@seZdZdd�ZdS)rcCs|f|_||_dS)N)�argsrL)r0rLrrrrV�szUnknownProtocol.__init__N)r4r5r6rVrrrrr�sc@seZdZdS)rN)r4r5r6rrrrr�sc@seZdZdS)r	N)r4r5r6rrrrr	�sc@s&eZdZddd�Zdd�Zdd�ZdS)	r
NcCs|f|_||_||_dS)N)r�partial�expected)r0rrrrrrV�szIncompleteRead.__init__cCs2|jdk	rd|j}nd}d|jjt|j�|fS)Nz, %i more expectedrXz%s(%i bytes read%s))rrpr4r,r)r0�errr�__repr__�s

zIncompleteRead.__repr__cCst|�S)N)r[)r0rrr�__str__�szIncompleteRead.__str__)N)r4r5r6rVrrrrrrr
�s
c@seZdZdS)rN)r4r5r6rrrrr�sc@seZdZdS)r
N)r4r5r6rrrrr
�sc@seZdZdS)rN)r4r5r6rrrrr�sc@seZdZdS)rN)r4r5r6rrrrr�sc@seZdZdd�ZdS)rcCs|st|�}|f|_||_dS)N)r[rr2)r0r2rrrrV�szBadStatusLine.__init__N)r4r5r6rVrrrrr�sc@seZdZdd�ZdS)rcCstj|dt|f�dS)Nz&got more than %d bytes when reading %s)rrVr;)r0Z	line_typerrrrV�szLineTooLong.__init__N)r4r5r6rVrrrrr�sc@seZdZdd�ZdS)rcOs"tj|d�tj|f|�|�dS)NrX)rrV�ConnectionResetError)r0�pos�kwrrrrV�szRemoteDisconnected.__init__N)r4r5r6rVrrrrr�s)r)BrZemail.parserrCZ
email.messager�r��os�rer�r�Zurllib.parser�__all__rrrKr�r�r��globals�updater��__members__r�rr�r;r<�compile�	fullmatchr�r�r�r�r�r�r'r�ZMessager(r?rE�BufferedIOBaserrr�ImportErrorrr/rrrrrrr	r
rr
rrrrrrrrrrr�<module>Es�



9F=
panel.cpython-36.pyc000064400000000331151732704210010270 0ustar003


 \W�@sdZddlTdS)z3curses.panel

Module for using panels with curses.
�)�*N)�__doc__Z
_curses_panel�rr�$/usr/lib64/python3.6/curses/panel.py�<module>stextpad.cpython-36.opt-1.pyc000064400000013426151732704210011612 0ustar003


 \��@sVdZddlZddlZdd�ZGdd�d�ZedkrRdd	�Zeje�Ze	d
e
e��dS)z:Simple textbox editing widget with Emacs-like keybindings.�NcCs�|j|d|tj||d�|j||dtj||d�|j||dtj||d�|j|d|tj||d�|j||tj�|j||tj�|j||tj�|j||tj	�dS)z^Draw a rectangle with corners at the provided upper-left
    and lower-right coordinates.
    �N)
Zvline�cursesZ	ACS_VLINEZhlineZ	ACS_HLINE�addchZACS_ULCORNERZACS_URCORNERZACS_LRCORNERZACS_LLCORNER)�win�uly�ulxZlryZlrx�r�&/usr/lib64/python3.6/curses/textpad.py�	rectanglesr
c@sLeZdZdZddd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	ddd�Z
dS)�TextboxadEditing widget using the interior of a window object.
     Supports the following Emacs-like key bindings:

    Ctrl-A      Go to left edge of window.
    Ctrl-B      Cursor left, wrapping to previous line if appropriate.
    Ctrl-D      Delete character under cursor.
    Ctrl-E      Go to right edge (stripspaces off) or end of line (stripspaces on).
    Ctrl-F      Cursor right, wrapping to next line when appropriate.
    Ctrl-G      Terminate, returning the window contents.
    Ctrl-H      Delete character backward.
    Ctrl-J      Terminate if the window is 1 line, otherwise insert newline.
    Ctrl-K      If line is blank, delete it, otherwise clear to end of line.
    Ctrl-L      Refresh screen.
    Ctrl-N      Cursor down; move down one line.
    Ctrl-O      Insert a blank line at cursor location.
    Ctrl-P      Cursor up; move up one line.

    Move operations do nothing if the cursor is at an edge where the movement
    is not possible.  The following synonyms are supported where possible:

    KEY_LEFT = Ctrl-B, KEY_RIGHT = Ctrl-F, KEY_UP = Ctrl-P, KEY_DOWN = Ctrl-N
    KEY_BACKSPACE = Ctrl-h
    FcCs.||_||_|j�d|_d|_|jd�dS)Nr)r�insert_mode�_update_max_yx�stripspaces�lastcmdZkeypad)�selfrrrrr	�__init__+szTextbox.__init__cCs&|jj�\}}|d|_|d|_dS)Nr)rZgetmaxyx�maxy�maxx)rrrrrr	r
3s
zTextbox._update_max_yxcCs\|j�|j}xHtjj|jj||��tjjkrBt|j|d�}Pn
|dkrLP|d}qW|S)zuGo to the location of the first blank on the given line,
        returning the index of the last non-blank character.rr)r
rr�asciir�inchZSP�min)r�yZlastrrr	�_end_of_line8szTextbox._end_of_linecCs�|j�|jj�\}}d}x�||jks0||jkr�|jr@|jj�}y|jj|�Wntj	k
rfYnX|js~tj
j|�r�P|}|jj�\}}|dkr||f}qW|dk	r�|jj|�dS)N)
r
r�getyxrrrrrr�errorr�isprint�move)r�chr�xZbackyxZoldchrrr	�_insert_printable_charFs$
zTextbox._insert_printable_charcCsV|j�|jj�\}}||_tjj|�rJ||jks<||jkrF|j	|��n|tjj
krh|jj|d��n�|tjjtj
tjjtjfk�r|dkr�|jj||d�nB|dkr�n8|jr�|jj|d|j|d��n|jj|d|j�|tjjtjfk�rR|jj��nL|tjjk�r"|jj��n0|tjjk�rb|j�rN|jj||j|��n|jj||j��n�|tjjtjfk�r�||jk�r�|jj||d�n ||jk�r�n|jj|dd��n�|tjjk�r�dS|tjjk�r|jdk�r�dS||jk�rR|jj|dd��nF|tjjk�rZ|dk�r@|j|�dk�r@|jj�n|jj||�|jj�n�|tjjk�rt|jj�n�|tjjtjfk�r�||jk�rR|jj|d|�||j|d�k�rR|jj|d|j|d��nz|tjj k�r�|jj!�n`|tjj"tj#fk�rR|dk�rR|jj|d|�||j|d�k�rR|jj|d|j|d��dS)z!Process a single editing command.rr)$r
rrrrrrrrrZSOHrZSTXZKEY_LEFTZBSZ
KEY_BACKSPACErrZdelchZEOTZENQZACKZ	KEY_RIGHTZBEL�NLZVTZdeletelnZclrtoeolZFF�refresh�SOZKEY_DOWNZSIZinsertlnZDLEZKEY_UP)rrrrrrr	�
do_command_sr
zTextbox.do_commandcCs�d}|j�x�t|jd�D]�}|jj|d�|j|�}|dkrH|jrHqxDt|jd�D]2}|jrl||krlP|tt	j
j
|jj||���}qXW|jdkr|d}qW|S)z.Collect and return the contents of the window.�rr�
)r
�rangerrrrrr�chrrrr)r�resultr�stoprrrr	�gather�s
"
zTextbox.gatherNcCs@x6|jj�}|r||�}|sq|j|�s*P|jj�qW|j�S)z2Edit in the widget window and collect the results.)rZgetchr#r!r*)rZvalidaterrrr	�edit�s

zTextbox.edit)F)N)�__name__�
__module__�__qualname__�__doc__rr
rrr#r*r+rrrr	rs
Ar�__main__cCsfd\}}d	\}}|j|d|d�tj||||�}t||d|d||||�|j�t|�j�S)
N�	����zUse Ctrl-G to end editing.r)r1r2)r3r4)ZaddstrrZnewwinr
r!rr+)ZstdscrZncolsZnlinesrrrrrr	�test_editbox�s r6zContents of text box:)r/rZcurses.asciir
rr,r6�wrapper�str�print�reprrrrr	�<module>s
,	
panel.cpython-36.opt-2.pyc000064400000000225151732704210011232 0ustar003


 \W�@sddlTdS)�)�*N)Z
_curses_panel�rr�$/usr/lib64/python3.6/curses/panel.py�<module>shas_key.cpython-36.opt-1.pyc000064400000010227151732704210011560 0ustar003


 \�*@sddlZejdejdejdejdejdejdejdejd	ej	d
ej
dejdejd
ej
dejdejdejdejdejdejdejdejdejdejdejdejdejdejdejdejdejdejd ej d!ej!d"ej"d#ej#d$ej$d%ej%d&ej&d'ej'd(ej(d)ej)d*ej*d+ej+d,ej,d-ej-d.ej.d/ej/d0ej0d1ej1d2ej2d3ej3d4ej4d5ej5d6ej6d7ej7d8ej8d9ej9d:ej:d;ej;d<ej<d=ej=d>ej>d?ej?d@ej@dAejAdBejBdCejCdDejDdEejEdFejFdGejGdHejHdIejIdJejJdKejKdLejLdMejMdNejNdOejOdPejPdQejQdRejRdSejSdTejTdUejUdVejVdWejWdXejXdYejYdZejZd[ej[d\ej\d]ej]d^ej^d_ej_d`ej`daejadbejbdcejcddejddeejedfejfdgejgdhejhdiejidjejjdkejkdlejldmejmdnejndoejodpejpdqejqdrejrdsejsdtejtduejudvejvdwejwdxejxdyejydzejzd{ej{d|ej|d}ej}d~ej~dejd�ej�d�ej�d�ej�d�ej�d�ej�d�ej�d�ej�d�ej�d�ej�d�ej�d�ej�d�ej�d�ej�d�ej�d�ej�d�ej�d�ej�d�ej�d�ej�d�ej�d�ej�d�ej�d�i�Z�d�d��Z�e�d�k�rzZgZ�ej��xHe�j��D]<Z�ej�e��Z�e�e��Z�e�e�k�r�e�j�d�ej�e��e�e�f��q�WWdej��xe�D]Z�e�e���qWXdS)��NZka1Zka3Zkb2ZkbsZkbegZkcbtZkc1Zkc3ZkcanZktbcZkclrZkcloZkcmdZkcpyZkcrtZkctabZkdch1Zkdl1Zkcud1ZkrmirZkendZkentZkelZkedZkextZkf0Zkf1Zkf10Zkf11Zkf12Zkf13Zkf14Zkf15Zkf16Zkf17Zkf18Zkf19Zkf2Zkf20Zkf21Zkf22Zkf23Zkf24Zkf25Zkf26Zkf27Zkf28Zkf29Zkf3Zkf30Zkf31Zkf32Zkf33Zkf34Zkf35Zkf36Zkf37Zkf38Zkf39Zkf4Zkf40Zkf41Zkf42Zkf43Zkf44Zkf45Zkf46Zkf47Zkf48Zkf49Zkf5Zkf50Zkf51Zkf52Zkf53Zkf54Zkf55Zkf56Zkf57Zkf58Zkf59Zkf6Zkf60Zkf61Zkf62Zkf63Zkf7Zkf8Zkf9ZkfndZkhlpZkhomeZkich1Zkil1Zkcub1ZkllZkmrkZkmsgZkmovZknxtZknpZkopnZkoptZkppZkprvZkprtZkrdoZkrefZkrfrZkrplZkrstZkresZkcuf1ZksavZkBEGZkCANZkCMDZkCPYZkCRTZkDCZkDLZksltZkENDZkEOLZkEXTZkindZkFNDZkHLPZkHOMZkICZkLFTZkMSGZkMOVZkNXTZkOPTZkPRVZkPRTZkriZkRDOZkRPLZkRITZkRESZkSAVZkSPDZkhtsZkUNDZkspdZkundZkcuu1cCs>t|t�rt|�}tj|�}|dkr(dStj|�r6dSdSdS)NFT)�
isinstance�str�ord�_capability_names�get�_cursesZtigetstr)ZchZcapability_name�r�&/usr/lib64/python3.6/curses/has_key.py�has_key�s


r
�__main__z)Mismatch for key %s, system=%i, Python=%i)�rZKEY_A1ZKEY_A3ZKEY_B2Z
KEY_BACKSPACEZKEY_BEGZKEY_BTABZKEY_C1ZKEY_C3Z
KEY_CANCELZ	KEY_CATABZ	KEY_CLEARZ	KEY_CLOSEZKEY_COMMANDZKEY_COPYZ
KEY_CREATEZKEY_CTABZKEY_DCZKEY_DLZKEY_DOWNZKEY_EICZKEY_ENDZ	KEY_ENTERZKEY_EOLZKEY_EOSZKEY_EXITZKEY_F0ZKEY_F1ZKEY_F10ZKEY_F11ZKEY_F12ZKEY_F13ZKEY_F14ZKEY_F15ZKEY_F16ZKEY_F17ZKEY_F18ZKEY_F19ZKEY_F2ZKEY_F20ZKEY_F21ZKEY_F22ZKEY_F23ZKEY_F24ZKEY_F25ZKEY_F26ZKEY_F27ZKEY_F28ZKEY_F29ZKEY_F3ZKEY_F30ZKEY_F31ZKEY_F32ZKEY_F33ZKEY_F34ZKEY_F35ZKEY_F36ZKEY_F37ZKEY_F38ZKEY_F39ZKEY_F4ZKEY_F40ZKEY_F41ZKEY_F42ZKEY_F43ZKEY_F44ZKEY_F45ZKEY_F46ZKEY_F47ZKEY_F48ZKEY_F49ZKEY_F5ZKEY_F50ZKEY_F51ZKEY_F52ZKEY_F53ZKEY_F54ZKEY_F55ZKEY_F56ZKEY_F57ZKEY_F58ZKEY_F59ZKEY_F6ZKEY_F60ZKEY_F61ZKEY_F62ZKEY_F63ZKEY_F7ZKEY_F8ZKEY_F9ZKEY_FINDZKEY_HELPZKEY_HOMEZKEY_ICZKEY_ILZKEY_LEFTZKEY_LLZKEY_MARKZKEY_MESSAGEZKEY_MOVEZKEY_NEXTZ	KEY_NPAGEZKEY_OPENZKEY_OPTIONSZ	KEY_PPAGEZKEY_PREVIOUSZ	KEY_PRINTZKEY_REDOZ
KEY_REFERENCEZKEY_REFRESHZKEY_REPLACEZKEY_RESTARTZ
KEY_RESUMEZ	KEY_RIGHTZKEY_SAVEZKEY_SBEGZKEY_SCANCELZKEY_SCOMMANDZ	KEY_SCOPYZKEY_SCREATEZKEY_SDCZKEY_SDLZ
KEY_SELECTZKEY_SENDZKEY_SEOLZ	KEY_SEXITZKEY_SFZ	KEY_SFINDZ	KEY_SHELPZ	KEY_SHOMEZKEY_SICZ	KEY_SLEFTZKEY_SMESSAGEZ	KEY_SMOVEZ	KEY_SNEXTZKEY_SOPTIONSZ
KEY_SPREVIOUSZ
KEY_SPRINTZKEY_SRZ	KEY_SREDOZKEY_SREPLACEZ
KEY_SRIGHTZ
KEY_SRSUMEZ	KEY_SSAVEZKEY_SSUSPENDZKEY_STABZ	KEY_SUNDOZKEY_SUSPENDZKEY_UNDOZKEY_UPrr
�__name__�LZinitscr�keys�key�system�python�appendZkeynameZendwin�i�printrrrr	�<module>sF




textpad.cpython-36.opt-2.pyc000064400000010375151732704220011614 0ustar003


 \��@sRddlZddlZdd�ZGdd�d�ZedkrNdd�Zeje�Zed	e	e��dS)
�NcCs�|j|d|tj||d�|j||dtj||d�|j||dtj||d�|j|d|tj||d�|j||tj�|j||tj�|j||tj�|j||tj	�dS)N�)
Zvline�cursesZ	ACS_VLINEZhlineZ	ACS_HLINE�addchZACS_ULCORNERZACS_URCORNERZACS_LRCORNERZACS_LLCORNER)�win�uly�ulxZlryZlrx�r�&/usr/lib64/python3.6/curses/textpad.py�	rectanglesr
c@sHeZdZddd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Zddd�Z	dS)�TextboxFcCs.||_||_|j�d|_d|_|jd�dS)Nr)r�insert_mode�_update_max_yx�stripspaces�lastcmdZkeypad)�selfrrrrr	�__init__+szTextbox.__init__cCs&|jj�\}}|d|_|d|_dS)Nr)rZgetmaxyx�maxy�maxx)rrrrrr	r
3s
zTextbox._update_max_yxcCs\|j�|j}xHtjj|jj||��tjjkrBt|j|d�}Pn
|dkrLP|d}qW|S)Nrr)r
rr�asciir�inchZSP�min)r�yZlastrrr	�_end_of_line8szTextbox._end_of_linecCs�|j�|jj�\}}d}x�||jks0||jkr�|jr@|jj�}y|jj|�Wntj	k
rfYnX|js~tj
j|�r�P|}|jj�\}}|dkr||f}qW|dk	r�|jj|�dS)N)
r
r�getyxrrrrrr�errorr�isprint�move)r�chr�xZbackyxZoldchrrr	�_insert_printable_charFs$
zTextbox._insert_printable_charcCsV|j�|jj�\}}||_tjj|�rJ||jks<||jkrF|j	|��n|tjj
krh|jj|d��n�|tjjtj
tjjtjfk�r|dkr�|jj||d�nB|dkr�n8|jr�|jj|d|j|d��n|jj|d|j�|tjjtjfk�rR|jj��nL|tjjk�r"|jj��n0|tjjk�rb|j�rN|jj||j|��n|jj||j��n�|tjjtjfk�r�||jk�r�|jj||d�n ||jk�r�n|jj|dd��n�|tjjk�r�dS|tjjk�r|jdk�r�dS||jk�rR|jj|dd��nF|tjjk�rZ|dk�r@|j|�dk�r@|jj�n|jj||�|jj�n�|tjjk�rt|jj�n�|tjjtjfk�r�||jk�rR|jj|d|�||j|d�k�rR|jj|d|j|d��nz|tjj k�r�|jj!�n`|tjj"tj#fk�rR|dk�rR|jj|d|�||j|d�k�rR|jj|d|j|d��dS)Nrr)$r
rrrrrrrrrZSOHrZSTXZKEY_LEFTZBSZ
KEY_BACKSPACErrZdelchZEOTZENQZACKZ	KEY_RIGHTZBEL�NLZVTZdeletelnZclrtoeolZFF�refresh�SOZKEY_DOWNZSIZinsertlnZDLEZKEY_UP)rrrrrrr	�
do_command_sr
zTextbox.do_commandcCs�d}|j�x�t|jd�D]�}|jj|d�|j|�}|dkrH|jrHqxDt|jd�D]2}|jrl||krlP|tt	j
j
|jj||���}qXW|jdkr|d}qW|S)N�rr�
)r
�rangerrrrrr�chrrrr)r�resultr�stoprrrr	�gather�s
"
zTextbox.gatherNcCs@x6|jj�}|r||�}|sq|j|�s*P|jj�qW|j�S)N)rZgetchr#r!r*)rZvalidaterrrr	�edit�s

zTextbox.edit)F)N)
�__name__�
__module__�__qualname__rr
rrr#r*r+rrrr	rs
Ar�__main__cCsfd\}}d	\}}|j|d|d�tj||||�}t||d|d||||�|j�t|�j�S)
N�	����zUse Ctrl-G to end editing.r)r0r1)r2r3)ZaddstrrZnewwinr
r!rr+)ZstdscrZncolsZnlinesrrrrrr	�test_editbox�s r5zContents of text box:)
rZcurses.asciir
rr,r5�wrapper�str�print�reprrrrr	�<module>s
,	
panel.cpython-36.opt-1.pyc000064400000000331151732704220011230 0ustar003


 \W�@sdZddlTdS)z3curses.panel

Module for using panels with curses.
�)�*N)�__doc__Z
_curses_panel�rr�$/usr/lib64/python3.6/curses/panel.py�<module>shas_key.cpython-36.opt-2.pyc000064400000010227151732704220011562 0ustar003


 \�*@sddlZejdejdejdejdejdejdejdejd	ej	d
ej
dejdejd
ej
dejdejdejdejdejdejdejdejdejdejdejdejdejdejdejdejdejdejd ej d!ej!d"ej"d#ej#d$ej$d%ej%d&ej&d'ej'd(ej(d)ej)d*ej*d+ej+d,ej,d-ej-d.ej.d/ej/d0ej0d1ej1d2ej2d3ej3d4ej4d5ej5d6ej6d7ej7d8ej8d9ej9d:ej:d;ej;d<ej<d=ej=d>ej>d?ej?d@ej@dAejAdBejBdCejCdDejDdEejEdFejFdGejGdHejHdIejIdJejJdKejKdLejLdMejMdNejNdOejOdPejPdQejQdRejRdSejSdTejTdUejUdVejVdWejWdXejXdYejYdZejZd[ej[d\ej\d]ej]d^ej^d_ej_d`ej`daejadbejbdcejcddejddeejedfejfdgejgdhejhdiejidjejjdkejkdlejldmejmdnejndoejodpejpdqejqdrejrdsejsdtejtduejudvejvdwejwdxejxdyejydzejzd{ej{d|ej|d}ej}d~ej~dejd�ej�d�ej�d�ej�d�ej�d�ej�d�ej�d�ej�d�ej�d�ej�d�ej�d�ej�d�ej�d�ej�d�ej�d�ej�d�ej�d�ej�d�ej�d�ej�d�ej�d�ej�d�ej�d�i�Z�d�d��Z�e�d�k�rzZgZ�ej��xHe�j��D]<Z�ej�e��Z�e�e��Z�e�e�k�r�e�j�d�ej�e��e�e�f��q�WWdej��xe�D]Z�e�e���qWXdS)��NZka1Zka3Zkb2ZkbsZkbegZkcbtZkc1Zkc3ZkcanZktbcZkclrZkcloZkcmdZkcpyZkcrtZkctabZkdch1Zkdl1Zkcud1ZkrmirZkendZkentZkelZkedZkextZkf0Zkf1Zkf10Zkf11Zkf12Zkf13Zkf14Zkf15Zkf16Zkf17Zkf18Zkf19Zkf2Zkf20Zkf21Zkf22Zkf23Zkf24Zkf25Zkf26Zkf27Zkf28Zkf29Zkf3Zkf30Zkf31Zkf32Zkf33Zkf34Zkf35Zkf36Zkf37Zkf38Zkf39Zkf4Zkf40Zkf41Zkf42Zkf43Zkf44Zkf45Zkf46Zkf47Zkf48Zkf49Zkf5Zkf50Zkf51Zkf52Zkf53Zkf54Zkf55Zkf56Zkf57Zkf58Zkf59Zkf6Zkf60Zkf61Zkf62Zkf63Zkf7Zkf8Zkf9ZkfndZkhlpZkhomeZkich1Zkil1Zkcub1ZkllZkmrkZkmsgZkmovZknxtZknpZkopnZkoptZkppZkprvZkprtZkrdoZkrefZkrfrZkrplZkrstZkresZkcuf1ZksavZkBEGZkCANZkCMDZkCPYZkCRTZkDCZkDLZksltZkENDZkEOLZkEXTZkindZkFNDZkHLPZkHOMZkICZkLFTZkMSGZkMOVZkNXTZkOPTZkPRVZkPRTZkriZkRDOZkRPLZkRITZkRESZkSAVZkSPDZkhtsZkUNDZkspdZkundZkcuu1cCs>t|t�rt|�}tj|�}|dkr(dStj|�r6dSdSdS)NFT)�
isinstance�str�ord�_capability_names�get�_cursesZtigetstr)ZchZcapability_name�r�&/usr/lib64/python3.6/curses/has_key.py�has_key�s


r
�__main__z)Mismatch for key %s, system=%i, Python=%i)�rZKEY_A1ZKEY_A3ZKEY_B2Z
KEY_BACKSPACEZKEY_BEGZKEY_BTABZKEY_C1ZKEY_C3Z
KEY_CANCELZ	KEY_CATABZ	KEY_CLEARZ	KEY_CLOSEZKEY_COMMANDZKEY_COPYZ
KEY_CREATEZKEY_CTABZKEY_DCZKEY_DLZKEY_DOWNZKEY_EICZKEY_ENDZ	KEY_ENTERZKEY_EOLZKEY_EOSZKEY_EXITZKEY_F0ZKEY_F1ZKEY_F10ZKEY_F11ZKEY_F12ZKEY_F13ZKEY_F14ZKEY_F15ZKEY_F16ZKEY_F17ZKEY_F18ZKEY_F19ZKEY_F2ZKEY_F20ZKEY_F21ZKEY_F22ZKEY_F23ZKEY_F24ZKEY_F25ZKEY_F26ZKEY_F27ZKEY_F28ZKEY_F29ZKEY_F3ZKEY_F30ZKEY_F31ZKEY_F32ZKEY_F33ZKEY_F34ZKEY_F35ZKEY_F36ZKEY_F37ZKEY_F38ZKEY_F39ZKEY_F4ZKEY_F40ZKEY_F41ZKEY_F42ZKEY_F43ZKEY_F44ZKEY_F45ZKEY_F46ZKEY_F47ZKEY_F48ZKEY_F49ZKEY_F5ZKEY_F50ZKEY_F51ZKEY_F52ZKEY_F53ZKEY_F54ZKEY_F55ZKEY_F56ZKEY_F57ZKEY_F58ZKEY_F59ZKEY_F6ZKEY_F60ZKEY_F61ZKEY_F62ZKEY_F63ZKEY_F7ZKEY_F8ZKEY_F9ZKEY_FINDZKEY_HELPZKEY_HOMEZKEY_ICZKEY_ILZKEY_LEFTZKEY_LLZKEY_MARKZKEY_MESSAGEZKEY_MOVEZKEY_NEXTZ	KEY_NPAGEZKEY_OPENZKEY_OPTIONSZ	KEY_PPAGEZKEY_PREVIOUSZ	KEY_PRINTZKEY_REDOZ
KEY_REFERENCEZKEY_REFRESHZKEY_REPLACEZKEY_RESTARTZ
KEY_RESUMEZ	KEY_RIGHTZKEY_SAVEZKEY_SBEGZKEY_SCANCELZKEY_SCOMMANDZ	KEY_SCOPYZKEY_SCREATEZKEY_SDCZKEY_SDLZ
KEY_SELECTZKEY_SENDZKEY_SEOLZ	KEY_SEXITZKEY_SFZ	KEY_SFINDZ	KEY_SHELPZ	KEY_SHOMEZKEY_SICZ	KEY_SLEFTZKEY_SMESSAGEZ	KEY_SMOVEZ	KEY_SNEXTZKEY_SOPTIONSZ
KEY_SPREVIOUSZ
KEY_SPRINTZKEY_SRZ	KEY_SREDOZKEY_SREPLACEZ
KEY_SRIGHTZ
KEY_SRSUMEZ	KEY_SSAVEZKEY_SSUSPENDZKEY_STABZ	KEY_SUNDOZKEY_SUSPENDZKEY_UNDOZKEY_UPrr
�__name__�LZinitscr�keys�key�system�python�appendZkeynameZendwin�i�printrrrr	�<module>sF




ascii.cpython-36.pyc000064400000007523151732704220010274 0ustar003


 \�	�!@s~dZdZdZdZdZdZdZdZdZd	Z	d
Z
d
ZdZdZ
dZd
ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!d Z"d!Z#d"Z$d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCg!Z%dDdE�Z&dFdG�Z'dHdI�Z(dJdK�Z)dLdM�Z*dNdO�Z+dPdQ�Z,dRdS�Z-dTdU�Z.dVdW�Z/dXdY�Z0dZd[�Z1d\d]�Z2d^d_�Z3d`da�Z4dbdc�Z5ddde�Z6dfdg�Z7dhdi�Z8djdk�Z9dlS)mz3Constants and membership tests for ASCII characters����������	�
���
������������������� ��NUL�SOH�STX�ETX�EOT�ENQ�ACK�BEL�BS�HT�LF�VT�FF�CR�SO�SI�DLE�DC1�DC2�DC3�DC4�NAK�SYN�ETB�CAN�EM�SUB�ESC�FS�GS�RS�US�SPcCs t|�td�krt|�S|SdS)N�)�type�ord)�c�rH�$/usr/lib64/python3.6/curses/ascii.py�_ctoi0srJcCst|�pt|�S)N)�isalpha�isdigit)rGrHrHrI�isalnum6srMcCst|�pt|�S)N)�isupper�islower)rGrHrHrIrK7srKcCsdt|�kodkSS)Nrr")rJ)rGrHrHrI�isascii8srPcCst|�dkS)Nr
r!)r
r!)rJ)rGrHrHrI�isblank9srQcCs(dt|�kodknp&t|�dkS)Nrr r")rJ)rGrHrHrI�iscntrl:srRcCsdt|�kodkSS)N�0�9)rJ)rGrHrHrIrL;srLcCsdt|�kodkSS)N�!�~)rJ)rGrHrHrI�isgraph<srWcCsdt|�kodkSS)N�a�z)rJ)rGrHrHrIrO=srOcCsdt|�kodkSS)Nr!rV)rJ)rGrHrHrI�isprint>srZcCst|�ot|�S)N)rWrM)rGrHrHrI�ispunct?sr[cCst|�dkS)Nr
rrr
rr!)r
rrr
rr!)rJ)rGrHrHrI�isspace@sr\cCsdt|�kodkSS)N�A�Z)rJ)rGrHrHrIrNAsrNcCs@t|�p>dt|�kodknp>dt|�ko:dkSS)Nr]�FrX�f)rLrJ)rGrHrHrI�isxdigitBsracCsdt|�kodkSS)Nrr!)rJ)rGrHrHrI�isctrlDsrbcCst|�dkS)Nr")rJ)rGrHrHrI�ismetaEsrccCs0t|�td�kr tt|�d@�St|�d@SdS)NrDr")rE�chrrJ)rGrHrHrI�asciiGsrecCs0t|�td�kr tt|�d@�St|�d@SdS)NrDr )rErdrJ)rGrHrHrI�ctrlMsrfcCs0t|�td�kr tt|�dB�St|�dBSdS)NrD�)rErdrJ)rGrHrHrI�altSsrhcCs\t|�}|dkrd}n2t|d@�r0t|d@�}ndt|d@dBd�}|d@rXd|S|S)Nr"z^?�^r!rg�!)rJrZrd)rG�bitsZreprHrHrI�unctrlYsrlN):�__doc__r#r$r%r&r'r(r)r*r+ZTABr,r-�NLr.r/r0r1r2r3r4r5r6r7r8r9r:r;r<r=r>r?r@rArBrCZDELZcontrolnamesrJrMrKrPrQrRrLrWrOrZr[r\rNrarbrcrerfrhrlrHrHrHrI�<module>szascii.cpython-36.opt-2.pyc000064400000007417151732704220011236 0ustar003


 \�	�!@szdZdZdZdZdZdZdZdZdZd	Z	d	Z
d
Zd
ZdZ
dZd
ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!d Z"d!Z#d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBg!Z$dCdD�Z%dEdF�Z&dGdH�Z'dIdJ�Z(dKdL�Z)dMdN�Z*dOdP�Z+dQdR�Z,dSdT�Z-dUdV�Z.dWdX�Z/dYdZ�Z0d[d\�Z1d]d^�Z2d_d`�Z3dadb�Z4dcdd�Z5dedf�Z6dgdh�Z7didj�Z8dkS)l����������	�
���
������������������� ��NUL�SOH�STX�ETX�EOT�ENQ�ACK�BEL�BS�HT�LF�VT�FF�CR�SO�SI�DLE�DC1�DC2�DC3�DC4�NAK�SYN�ETB�CAN�EM�SUB�ESC�FS�GS�RS�US�SPcCs t|�td�krt|�S|SdS)N�)�type�ord)�c�rH�$/usr/lib64/python3.6/curses/ascii.py�_ctoi0srJcCst|�pt|�S)N)�isalpha�isdigit)rGrHrHrI�isalnum6srMcCst|�pt|�S)N)�isupper�islower)rGrHrHrIrK7srKcCsdt|�kodkSS)Nrr")rJ)rGrHrHrI�isascii8srPcCst|�dkS)Nr
r!)r
r!)rJ)rGrHrHrI�isblank9srQcCs(dt|�kodknp&t|�dkS)Nrr r")rJ)rGrHrHrI�iscntrl:srRcCsdt|�kodkSS)N�0�9)rJ)rGrHrHrIrL;srLcCsdt|�kodkSS)N�!�~)rJ)rGrHrHrI�isgraph<srWcCsdt|�kodkSS)N�a�z)rJ)rGrHrHrIrO=srOcCsdt|�kodkSS)Nr!rV)rJ)rGrHrHrI�isprint>srZcCst|�ot|�S)N)rWrM)rGrHrHrI�ispunct?sr[cCst|�dkS)Nr
rrr
rr!)r
rrr
rr!)rJ)rGrHrHrI�isspace@sr\cCsdt|�kodkSS)N�A�Z)rJ)rGrHrHrIrNAsrNcCs@t|�p>dt|�kodknp>dt|�ko:dkSS)Nr]�FrX�f)rLrJ)rGrHrHrI�isxdigitBsracCsdt|�kodkSS)Nrr!)rJ)rGrHrHrI�isctrlDsrbcCst|�dkS)Nr")rJ)rGrHrHrI�ismetaEsrccCs0t|�td�kr tt|�d@�St|�d@SdS)NrDr")rE�chrrJ)rGrHrHrI�asciiGsrecCs0t|�td�kr tt|�d@�St|�d@SdS)NrDr )rErdrJ)rGrHrHrI�ctrlMsrfcCs0t|�td�kr tt|�dB�St|�dBSdS)NrD�)rErdrJ)rGrHrHrI�altSsrhcCs\t|�}|dkrd}n2t|d@�r0t|d@�}ndt|d@dBd�}|d@rXd|S|S)Nr"z^?�^r!rg�!)rJrZrd)rG�bitsZreprHrHrI�unctrlYsrlN)9r#r$r%r&r'r(r)r*r+ZTABr,r-�NLr.r/r0r1r2r3r4r5r6r7r8r9r:r;r<r=r>r?r@rArBrCZDELZcontrolnamesrJrMrKrPrQrRrLrWrOrZr[r\rNrarbrcrerfrhrlrHrHrHrI�<module>sxtextpad.cpython-36.pyc000064400000013426151732704220010654 0ustar003


 \��@sVdZddlZddlZdd�ZGdd�d�ZedkrRdd	�Zeje�Ze	d
e
e��dS)z:Simple textbox editing widget with Emacs-like keybindings.�NcCs�|j|d|tj||d�|j||dtj||d�|j||dtj||d�|j|d|tj||d�|j||tj�|j||tj�|j||tj�|j||tj	�dS)z^Draw a rectangle with corners at the provided upper-left
    and lower-right coordinates.
    �N)
Zvline�cursesZ	ACS_VLINEZhlineZ	ACS_HLINE�addchZACS_ULCORNERZACS_URCORNERZACS_LRCORNERZACS_LLCORNER)�win�uly�ulxZlryZlrx�r�&/usr/lib64/python3.6/curses/textpad.py�	rectanglesr
c@sLeZdZdZddd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	ddd�Z
dS)�TextboxadEditing widget using the interior of a window object.
     Supports the following Emacs-like key bindings:

    Ctrl-A      Go to left edge of window.
    Ctrl-B      Cursor left, wrapping to previous line if appropriate.
    Ctrl-D      Delete character under cursor.
    Ctrl-E      Go to right edge (stripspaces off) or end of line (stripspaces on).
    Ctrl-F      Cursor right, wrapping to next line when appropriate.
    Ctrl-G      Terminate, returning the window contents.
    Ctrl-H      Delete character backward.
    Ctrl-J      Terminate if the window is 1 line, otherwise insert newline.
    Ctrl-K      If line is blank, delete it, otherwise clear to end of line.
    Ctrl-L      Refresh screen.
    Ctrl-N      Cursor down; move down one line.
    Ctrl-O      Insert a blank line at cursor location.
    Ctrl-P      Cursor up; move up one line.

    Move operations do nothing if the cursor is at an edge where the movement
    is not possible.  The following synonyms are supported where possible:

    KEY_LEFT = Ctrl-B, KEY_RIGHT = Ctrl-F, KEY_UP = Ctrl-P, KEY_DOWN = Ctrl-N
    KEY_BACKSPACE = Ctrl-h
    FcCs.||_||_|j�d|_d|_|jd�dS)Nr)r�insert_mode�_update_max_yx�stripspaces�lastcmdZkeypad)�selfrrrrr	�__init__+szTextbox.__init__cCs&|jj�\}}|d|_|d|_dS)Nr)rZgetmaxyx�maxy�maxx)rrrrrr	r
3s
zTextbox._update_max_yxcCs\|j�|j}xHtjj|jj||��tjjkrBt|j|d�}Pn
|dkrLP|d}qW|S)zuGo to the location of the first blank on the given line,
        returning the index of the last non-blank character.rr)r
rr�asciir�inchZSP�min)r�yZlastrrr	�_end_of_line8szTextbox._end_of_linecCs�|j�|jj�\}}d}x�||jks0||jkr�|jr@|jj�}y|jj|�Wntj	k
rfYnX|js~tj
j|�r�P|}|jj�\}}|dkr||f}qW|dk	r�|jj|�dS)N)
r
r�getyxrrrrrr�errorr�isprint�move)r�chr�xZbackyxZoldchrrr	�_insert_printable_charFs$
zTextbox._insert_printable_charcCsV|j�|jj�\}}||_tjj|�rJ||jks<||jkrF|j	|��n|tjj
krh|jj|d��n�|tjjtj
tjjtjfk�r|dkr�|jj||d�nB|dkr�n8|jr�|jj|d|j|d��n|jj|d|j�|tjjtjfk�rR|jj��nL|tjjk�r"|jj��n0|tjjk�rb|j�rN|jj||j|��n|jj||j��n�|tjjtjfk�r�||jk�r�|jj||d�n ||jk�r�n|jj|dd��n�|tjjk�r�dS|tjjk�r|jdk�r�dS||jk�rR|jj|dd��nF|tjjk�rZ|dk�r@|j|�dk�r@|jj�n|jj||�|jj�n�|tjjk�rt|jj�n�|tjjtjfk�r�||jk�rR|jj|d|�||j|d�k�rR|jj|d|j|d��nz|tjj k�r�|jj!�n`|tjj"tj#fk�rR|dk�rR|jj|d|�||j|d�k�rR|jj|d|j|d��dS)z!Process a single editing command.rr)$r
rrrrrrrrrZSOHrZSTXZKEY_LEFTZBSZ
KEY_BACKSPACErrZdelchZEOTZENQZACKZ	KEY_RIGHTZBEL�NLZVTZdeletelnZclrtoeolZFF�refresh�SOZKEY_DOWNZSIZinsertlnZDLEZKEY_UP)rrrrrrr	�
do_command_sr
zTextbox.do_commandcCs�d}|j�x�t|jd�D]�}|jj|d�|j|�}|dkrH|jrHqxDt|jd�D]2}|jrl||krlP|tt	j
j
|jj||���}qXW|jdkr|d}qW|S)z.Collect and return the contents of the window.�rr�
)r
�rangerrrrrr�chrrrr)r�resultr�stoprrrr	�gather�s
"
zTextbox.gatherNcCs@x6|jj�}|r||�}|sq|j|�s*P|jj�qW|j�S)z2Edit in the widget window and collect the results.)rZgetchr#r!r*)rZvalidaterrrr	�edit�s

zTextbox.edit)F)N)�__name__�
__module__�__qualname__�__doc__rr
rrr#r*r+rrrr	rs
Ar�__main__cCsfd\}}d	\}}|j|d|d�tj||||�}t||d|d||||�|j�t|�j�S)
N�	����zUse Ctrl-G to end editing.r)r1r2)r3r4)ZaddstrrZnewwinr
r!rr+)ZstdscrZncolsZnlinesrrrrrr	�test_editbox�s r6zContents of text box:)r/rZcurses.asciir
rr,r6�wrapper�str�print�reprrrrr	�<module>s
,	
ascii.cpython-36.opt-1.pyc000064400000007523151732704220011233 0ustar003


 \�	�!@s~dZdZdZdZdZdZdZdZdZd	Z	d
Z
d
ZdZdZ
dZd
ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!d Z"d!Z#d"Z$d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCg!Z%dDdE�Z&dFdG�Z'dHdI�Z(dJdK�Z)dLdM�Z*dNdO�Z+dPdQ�Z,dRdS�Z-dTdU�Z.dVdW�Z/dXdY�Z0dZd[�Z1d\d]�Z2d^d_�Z3d`da�Z4dbdc�Z5ddde�Z6dfdg�Z7dhdi�Z8djdk�Z9dlS)mz3Constants and membership tests for ASCII characters����������	�
���
������������������� ��NUL�SOH�STX�ETX�EOT�ENQ�ACK�BEL�BS�HT�LF�VT�FF�CR�SO�SI�DLE�DC1�DC2�DC3�DC4�NAK�SYN�ETB�CAN�EM�SUB�ESC�FS�GS�RS�US�SPcCs t|�td�krt|�S|SdS)N�)�type�ord)�c�rH�$/usr/lib64/python3.6/curses/ascii.py�_ctoi0srJcCst|�pt|�S)N)�isalpha�isdigit)rGrHrHrI�isalnum6srMcCst|�pt|�S)N)�isupper�islower)rGrHrHrIrK7srKcCsdt|�kodkSS)Nrr")rJ)rGrHrHrI�isascii8srPcCst|�dkS)Nr
r!)r
r!)rJ)rGrHrHrI�isblank9srQcCs(dt|�kodknp&t|�dkS)Nrr r")rJ)rGrHrHrI�iscntrl:srRcCsdt|�kodkSS)N�0�9)rJ)rGrHrHrIrL;srLcCsdt|�kodkSS)N�!�~)rJ)rGrHrHrI�isgraph<srWcCsdt|�kodkSS)N�a�z)rJ)rGrHrHrIrO=srOcCsdt|�kodkSS)Nr!rV)rJ)rGrHrHrI�isprint>srZcCst|�ot|�S)N)rWrM)rGrHrHrI�ispunct?sr[cCst|�dkS)Nr
rrr
rr!)r
rrr
rr!)rJ)rGrHrHrI�isspace@sr\cCsdt|�kodkSS)N�A�Z)rJ)rGrHrHrIrNAsrNcCs@t|�p>dt|�kodknp>dt|�ko:dkSS)Nr]�FrX�f)rLrJ)rGrHrHrI�isxdigitBsracCsdt|�kodkSS)Nrr!)rJ)rGrHrHrI�isctrlDsrbcCst|�dkS)Nr")rJ)rGrHrHrI�ismetaEsrccCs0t|�td�kr tt|�d@�St|�d@SdS)NrDr")rE�chrrJ)rGrHrHrI�asciiGsrecCs0t|�td�kr tt|�d@�St|�d@SdS)NrDr )rErdrJ)rGrHrHrI�ctrlMsrfcCs0t|�td�kr tt|�dB�St|�dBSdS)NrD�)rErdrJ)rGrHrHrI�altSsrhcCs\t|�}|dkrd}n2t|d@�r0t|d@�}ndt|d@dBd�}|d@rXd|S|S)Nr"z^?�^r!rg�!)rJrZrd)rG�bitsZreprHrHrI�unctrlYsrlN):�__doc__r#r$r%r&r'r(r)r*r+ZTABr,r-�NLr.r/r0r1r2r3r4r5r6r7r8r9r:r;r<r=r>r?r@rArBrCZDELZcontrolnamesrJrMrKrPrQrRrLrWrOrZr[r\rNrarbrcrerfrhrlrHrHrHrI�<module>szhas_key.cpython-36.pyc000064400000010227151732704220010622 0ustar003


 \�*@sddlZejdejdejdejdejdejdejdejd	ej	d
ej
dejdejd
ej
dejdejdejdejdejdejdejdejdejdejdejdejdejdejdejdejdejdejd ej d!ej!d"ej"d#ej#d$ej$d%ej%d&ej&d'ej'd(ej(d)ej)d*ej*d+ej+d,ej,d-ej-d.ej.d/ej/d0ej0d1ej1d2ej2d3ej3d4ej4d5ej5d6ej6d7ej7d8ej8d9ej9d:ej:d;ej;d<ej<d=ej=d>ej>d?ej?d@ej@dAejAdBejBdCejCdDejDdEejEdFejFdGejGdHejHdIejIdJejJdKejKdLejLdMejMdNejNdOejOdPejPdQejQdRejRdSejSdTejTdUejUdVejVdWejWdXejXdYejYdZejZd[ej[d\ej\d]ej]d^ej^d_ej_d`ej`daejadbejbdcejcddejddeejedfejfdgejgdhejhdiejidjejjdkejkdlejldmejmdnejndoejodpejpdqejqdrejrdsejsdtejtduejudvejvdwejwdxejxdyejydzejzd{ej{d|ej|d}ej}d~ej~dejd�ej�d�ej�d�ej�d�ej�d�ej�d�ej�d�ej�d�ej�d�ej�d�ej�d�ej�d�ej�d�ej�d�ej�d�ej�d�ej�d�ej�d�ej�d�ej�d�ej�d�ej�d�ej�d�i�Z�d�d��Z�e�d�k�rzZgZ�ej��xHe�j��D]<Z�ej�e��Z�e�e��Z�e�e�k�r�e�j�d�ej�e��e�e�f��q�WWdej��xe�D]Z�e�e���qWXdS)��NZka1Zka3Zkb2ZkbsZkbegZkcbtZkc1Zkc3ZkcanZktbcZkclrZkcloZkcmdZkcpyZkcrtZkctabZkdch1Zkdl1Zkcud1ZkrmirZkendZkentZkelZkedZkextZkf0Zkf1Zkf10Zkf11Zkf12Zkf13Zkf14Zkf15Zkf16Zkf17Zkf18Zkf19Zkf2Zkf20Zkf21Zkf22Zkf23Zkf24Zkf25Zkf26Zkf27Zkf28Zkf29Zkf3Zkf30Zkf31Zkf32Zkf33Zkf34Zkf35Zkf36Zkf37Zkf38Zkf39Zkf4Zkf40Zkf41Zkf42Zkf43Zkf44Zkf45Zkf46Zkf47Zkf48Zkf49Zkf5Zkf50Zkf51Zkf52Zkf53Zkf54Zkf55Zkf56Zkf57Zkf58Zkf59Zkf6Zkf60Zkf61Zkf62Zkf63Zkf7Zkf8Zkf9ZkfndZkhlpZkhomeZkich1Zkil1Zkcub1ZkllZkmrkZkmsgZkmovZknxtZknpZkopnZkoptZkppZkprvZkprtZkrdoZkrefZkrfrZkrplZkrstZkresZkcuf1ZksavZkBEGZkCANZkCMDZkCPYZkCRTZkDCZkDLZksltZkENDZkEOLZkEXTZkindZkFNDZkHLPZkHOMZkICZkLFTZkMSGZkMOVZkNXTZkOPTZkPRVZkPRTZkriZkRDOZkRPLZkRITZkRESZkSAVZkSPDZkhtsZkUNDZkspdZkundZkcuu1cCs>t|t�rt|�}tj|�}|dkr(dStj|�r6dSdSdS)NFT)�
isinstance�str�ord�_capability_names�get�_cursesZtigetstr)ZchZcapability_name�r�&/usr/lib64/python3.6/curses/has_key.py�has_key�s


r
�__main__z)Mismatch for key %s, system=%i, Python=%i)�rZKEY_A1ZKEY_A3ZKEY_B2Z
KEY_BACKSPACEZKEY_BEGZKEY_BTABZKEY_C1ZKEY_C3Z
KEY_CANCELZ	KEY_CATABZ	KEY_CLEARZ	KEY_CLOSEZKEY_COMMANDZKEY_COPYZ
KEY_CREATEZKEY_CTABZKEY_DCZKEY_DLZKEY_DOWNZKEY_EICZKEY_ENDZ	KEY_ENTERZKEY_EOLZKEY_EOSZKEY_EXITZKEY_F0ZKEY_F1ZKEY_F10ZKEY_F11ZKEY_F12ZKEY_F13ZKEY_F14ZKEY_F15ZKEY_F16ZKEY_F17ZKEY_F18ZKEY_F19ZKEY_F2ZKEY_F20ZKEY_F21ZKEY_F22ZKEY_F23ZKEY_F24ZKEY_F25ZKEY_F26ZKEY_F27ZKEY_F28ZKEY_F29ZKEY_F3ZKEY_F30ZKEY_F31ZKEY_F32ZKEY_F33ZKEY_F34ZKEY_F35ZKEY_F36ZKEY_F37ZKEY_F38ZKEY_F39ZKEY_F4ZKEY_F40ZKEY_F41ZKEY_F42ZKEY_F43ZKEY_F44ZKEY_F45ZKEY_F46ZKEY_F47ZKEY_F48ZKEY_F49ZKEY_F5ZKEY_F50ZKEY_F51ZKEY_F52ZKEY_F53ZKEY_F54ZKEY_F55ZKEY_F56ZKEY_F57ZKEY_F58ZKEY_F59ZKEY_F6ZKEY_F60ZKEY_F61ZKEY_F62ZKEY_F63ZKEY_F7ZKEY_F8ZKEY_F9ZKEY_FINDZKEY_HELPZKEY_HOMEZKEY_ICZKEY_ILZKEY_LEFTZKEY_LLZKEY_MARKZKEY_MESSAGEZKEY_MOVEZKEY_NEXTZ	KEY_NPAGEZKEY_OPENZKEY_OPTIONSZ	KEY_PPAGEZKEY_PREVIOUSZ	KEY_PRINTZKEY_REDOZ
KEY_REFERENCEZKEY_REFRESHZKEY_REPLACEZKEY_RESTARTZ
KEY_RESUMEZ	KEY_RIGHTZKEY_SAVEZKEY_SBEGZKEY_SCANCELZKEY_SCOMMANDZ	KEY_SCOPYZKEY_SCREATEZKEY_SDCZKEY_SDLZ
KEY_SELECTZKEY_SENDZKEY_SEOLZ	KEY_SEXITZKEY_SFZ	KEY_SFINDZ	KEY_SHELPZ	KEY_SHOMEZKEY_SICZ	KEY_SLEFTZKEY_SMESSAGEZ	KEY_SMOVEZ	KEY_SNEXTZKEY_SOPTIONSZ
KEY_SPREVIOUSZ
KEY_SPRINTZKEY_SRZ	KEY_SREDOZKEY_SREPLACEZ
KEY_SRIGHTZ
KEY_SRSUMEZ	KEY_SSAVEZKEY_SSUSPENDZKEY_STABZ	KEY_SUNDOZKEY_SUSPENDZKEY_UNDOZKEY_UPrr
�__name__�LZinitscr�keys�key�system�python�appendZkeynameZendwin�i�printrrrr	�<module>sF




simpledialog.cpython-38.pyc000064400000025370151732766100011664 0ustar00U

e5d�-�@s�dZddlTddlmZmZGdd�d�ZGdd�de�Zdd	�ZGd
d�de�ZGdd
�d
e�Z	dd�Z
Gdd�de�Zdd�ZGdd�de�Z
dd�Zedkr�dd�Ze�dS)a&This modules handles dialog boxes.

It contains the following public symbols:

SimpleDialog -- A simple but flexible modal dialog box

Dialog -- a base class for dialogs

askinteger -- get an integer from the user

askfloat -- get a float from the user

askstring -- get a string from the user
�)�*)�
messagebox�_get_default_rootc@sLeZdZdgddddfdd�Zddd�Zd	d
�Zdd�Zd
d�Zdd�ZdS)�SimpleDialog�NcCs|rt||d�|_n
t|�|_|r:|j�|�|j�|�t|j�t|j|dd�|_|jjdtd�t	|j�|_
|j
��||_||_||_
|j�d|j�tt|��D]L}||}	t|j
|	||fdd�d	�}
||kr�|
jtd
d�|
jttdd�q�|j�d
|j�|�|�dS)N)�class_i�)�textZaspect�)�expand�fill�<Return>cSs
|�|�S�N)�done��self�num�r�,/usr/lib64/python3.8/tkinter/simpledialog.py�<lambda>8�z'SimpleDialog.__init__.<locals>.<lambda>�r�command�)ZreliefZborderwidth)�siderr
�WM_DELETE_WINDOW)�Toplevel�root�titleZiconname�
_setup_dialogZMessage�message�packZBOTH�Frame�framer�cancel�default�bind�return_event�range�len�ButtonZconfigZRIDGE�LEFT�protocol�wm_delete_window�_set_transient)r�masterr�buttonsr$r#rrr�s�brrr�__init__ s2


�zSimpleDialog.__init__��?�333333�?c
Cs|j}|��|�|�|��|��rJ|��}|��}|��}|��}n|�	�}|�
�}d}}|��}	|��}
|||	|}|||
|}||	|�	�kr�|�	�|	}n|dkr�d}||
|�
�kr�|�
�|
}n|dkr�d}|�
d||f�|��dS)Nr�+%d+%d)r�withdraw�	transient�update_idletasksZwinfo_ismappedZwinfo_widthZwinfo_height�winfo_rootx�winfo_rootyZwinfo_screenwidthZwinfo_screenheightZwinfo_reqwidthZwinfo_reqheight�geometry�	deiconify)
rr.ZrelxZrelyZwidgetZm_widthZm_heightZm_xZm_yZw_widthZw_height�x�yrrrr-?s4

zSimpleDialog._set_transientcCs.|j��|j��|j��|j��|jSr
)r�wait_visibility�grab_set�mainloop�destroyr�rrrr�go\s




zSimpleDialog.gocCs&|jdkr|j��n|�|j�dSr
)r$r�bellr�rZeventrrrr&cs
zSimpleDialog.return_eventcCs&|jdkr|j��n|�|j�dSr
)r#rrErrCrrrr,is
zSimpleDialog.wm_delete_windowcCs||_|j��dSr
)rr�quitrrrrroszSimpleDialog.done)r3r4)	�__name__�
__module__�__qualname__r2r-rDr&r,rrrrrrs�

rc@sVeZdZdZddd�Zdd�Zdd�Zd	d
�Zddd�Zdd
d�Z	dd�Z
dd�ZdS)�DialogzZClass to open dialogs.

    This class is intended as a base class for custom dialogs
    NcCs�|}|std�}t�||�|��|dk	r>|��r>|�|�|rL|�|�t|�||_d|_	t
|�}|�|�|_|j
ddd�|��|js�||_|�d|j�|dk	r�|�d|��d|��df�|��|j��|��|��|�|�dS)z�Initialize a dialog.

        Arguments:

            parent -- a parent window (the application window)

            title -- the dialog title
        zcreate dialog windowN�)�padx�padyrr5�2)rrr2r6Zwinfo_viewabler7rr�parent�resultr!�body�
initial_focusr �	buttonboxr+r#r;r9r:r<�	focus_setr?r@Zwait_window)rrPrr.rRrrrr2{s8	


�
zDialog.__init__cCsd|_t�|�dS)zDestroy the windowN)rSrrBrCrrrrB�szDialog.destroycCsdS)z�create dialog body.

        return widget that should have initial focus.
        This method should be overridden, and is called
        by the __init__ method.
        Nr)rr.rrrrR�szDialog.bodycCsvt|�}t|dd|jtd�}|jtddd�t|dd|jd�}|jtddd�|�d|j�|�d	|j�|��d
S)z[add standard button box.

        override if you do not want the standard buttons
        ZOK�
)r�widthrr$rL)rrMrN�Cancel)rrWrrz<Escape>N)r!r)�okZACTIVEr r*r#r%)rZbox�wrrrrT�szDialog.buttonboxcCsB|��s|j��dS|��|��z|��W5|��XdSr
)�validaterSrUr6r8r#�applyrFrrrrY�s
z	Dialog.okcCs |jdk	r|j��|��dSr
)rPrUrBrFrrrr#�s

z
Dialog.cancelcCsdS)z�validate the data

        This method is called automatically to validate the data before the
        dialog is destroyed. By default, it always validates OK.
        r	rrCrrrr[�szDialog.validatecCsdS)z�process the data

        This method is called automatically to process the data, *after*
        the dialog is destroyed. By default, it does nothing.
        NrrCrrrr\�szDialog.apply)N)N)N)rHrIrJ�__doc__r2rBrRrTrYr#r[r\rrrrrKts
7	


	rKcCs:|jdkr |j�dd|dd�n|jdkr6|�dd�dS)	NZaquaz!::tk::unsupported::MacWindowStyleZstyleZ
moveableModalrZx11z-typeZdialog)Z_windowingsystemZtkZcallZ
wm_attributes)rZrrrrs

�
rc@s.eZdZd
dd�Zdd�Zdd�Zdd	�ZdS)�_QueryDialogNcCs*||_||_||_||_t�|||�dSr
)�prompt�minvalue�maxvalue�initialvaluerKr2)rrr_rbr`rarPrrrr2s
z_QueryDialog.__init__cCsd|_t�|�dSr
)�entryrKrBrCrrrrBsz_QueryDialog.destroycCsrt||jtd�}|jddtd�t|dd�|_|jjddttd�|jdk	rl|j�	d|j�|j�
dt�|jS)N)rZjustifyrrL)�rowrMZstickyrc)�namer	)ZLabelr_r*Zgrid�WZEntryrc�Erb�insertZselect_rangeZEND)rr.rZrrrrR s
z_QueryDialog.bodycCs�z|��}Wn,tk
r8tjd|jd|d�YdSX|jdk	rh||jkrhtjdd|j|d�dS|jdk	r�||jkr�tjdd|j|d�dS||_d	S)
Nz
Illegal valuez
Please try again)rPrz	Too smallz2The allowed minimum value is %s. Please try again.z	Too largez2The allowed maximum value is %s. Please try again.r	)�	getresult�
ValueErrorr�showwarning�errormessager`rarQ)rrQrrrr[.s:�����z_QueryDialog.validate)NNNN)rHrIrJr2rBrRr[rrrrr^
s�

r^c@seZdZdZdd�ZdS)�
_QueryIntegerzNot an integer.cCs|�|j���Sr
)Zgetintrc�getrCrrrriSsz_QueryInteger.getresultN�rHrIrJrlrirrrrrmPsrmcKst||f|�}|jS)z�get an integer from the user

    Arguments:

        title -- the dialog title
        prompt -- the label text
        **kw -- see SimpleDialog class

    Return value is an integer
    )rmrQ�rr_�kw�drrr�
askintegerWsrsc@seZdZdZdd�ZdS)�_QueryFloatzNot a floating point value.cCs|�|j���Sr
)Z	getdoublercrnrCrrrriisz_QueryFloat.getresultNrorrrrrtfsrtcKst||f|�}|jS)z�get a float from the user

    Arguments:

        title -- the dialog title
        prompt -- the label text
        **kw -- see SimpleDialog class

    Return value is a float
    )rtrQrprrr�askfloatmsruc@s$eZdZdd�Zdd�Zdd�ZdS)�_QueryStringcOs6d|kr|d|_|d=nd|_tj|f|�|�dS)N�show)�_QueryString__showr^r2)r�argsrqrrrr2}s

z_QueryString.__init__cCs(t�||�}|jdk	r$|j|jd�|S)N)rw)r^rRrxZ	configure)rr.rcrrrrR�s
z_QueryString.bodycCs
|j��Sr
)rcrnrCrrrri�sz_QueryString.getresultN)rHrIrJr2rRrirrrrrv|srvcKst||f|�}|jS)z�get a string from the user

    Arguments:

        title -- the dialog title
        prompt -- the label text
        **kw -- see SimpleDialog class

    Return value is a string
    )rvrQrprrr�	askstring�srz�__main__cCsLt�}|fdd�}t|d|d�}|��t|d|jd�}|��|��dS)NcSs^t|ddddgdddd�}t|���ttd	d
dd��ttd	d
ddd��ttd	d��dS)Nz�This is a test dialog.  Would this have been an actual dialog, the buttons below would have been glowing in soft pink light.
Do you believe this?ZYesZNorXr�zTest Dialog)rr/r$r#rZSpamz	Egg count�)rbzEgg weight
(in tons)r	�d)r`raz	Egg label)r�printrDrsrurz)rrrrrr�doit�s�

�ztest.<locals>.doitZTestrZQuit)ZTkr)r rGrA)rr��t�qrrr�test�sr�N)r]ZtkinterrrrrrKrr^rmrsrtrurvrzrHr�rrrr�<module>s V
Cdialog.cpython-38.pyc000064400000002702151732766100010444 0ustar00U

e5d��@srddlTddlmZdZGdd�de�Zdd�Zedkrned	d
ddeeii�Z	ed	d
d
de	j
eii�Ze	��d	S)�)�*)�	_cnfmergeZ	questheadc@s"eZdZdifdd�Zdd�ZdS)�DialogNc
Ks�t||f�}d|_t�|||�|j�|jjd|j|d|d|d|df|d���|_zt�	|�Wnt
k
r~YnXdS)NZ
__dialog__Z	tk_dialog�title�text�bitmap�default�strings)rZ
widgetName�Widget�_setupZtkZgetintZcallZ_w�num�destroyZTclError)�selfZmasterZcnf�kw�r�&/usr/lib64/python3.8/tkinter/dialog.py�__init__
s&���zDialog.__init__cCsdS)Nr)rrrrr
�zDialog.destroy)�__name__�
__module__�__qualname__rr
rrrrr	s
rcCs$tdddtddd��}t|j�dS)Nz
File ModifiedzzFile "Python.h" has been modified since the last time it was saved. Do you want to save it before exiting the application.r)z	Save FilezDiscard ChangeszReturn to Editor)rrrrr	)r�DIALOG_ICON�printr)�drrr�_tests�r�__main__NrZTestZcommandZQuit)
Ztkinterrrr
rrrZButtonZPack�t�quit�qZmainlooprrrr�<module>s$��ttk.cpython-38.opt-2.pyc000064400000067035151732766100010761 0ustar00U

e5d���@s�dZdZdddddddd	d
ddd
dddddddddddddgZddlZddlmZmZmZmZejdkrldnd Z	d!d"�Z
dWd#d$�ZdXd%d&�Zd'd(�Z
dYd)d*�ZdZd+d,�Zd[d.d/�Zd0d1�Zd2d3�Zd4d5�Zd6d7�Zd8d9�Zd:d;�Zd<d=�Zd>d�Zd\d?d�ZGd@d�de�ZGdAdB�dBej�ZGdCd�de�ZGdDd�de�ZGdEd�deej�ZGdFd�de�Z GdGd�de�Z!GdHd�de�Z"GdId�de�Z#e#Z$GdJd
�d
e�Z%GdKd�de�Z&GdLd�deej'�Z(e(Z'GdMd�de�Z)GdNd�de�Z*GdOd�deej+�Z+GdPd�deej,�Z,GdQd�de�Z-GdRd�de�Z.GdSd�de�Z/GdTd�deej0ej1�Z2GdUd�de!�Z3GdVd�de%�Z4dS)]z0.3.1z!Guilherme Polo <ggpolo@gmail.com>�Button�Checkbutton�Combobox�Entry�Frame�Label�
Labelframe�
LabelFrame�
Menubutton�Notebook�Panedwindow�PanedWindow�Progressbar�Radiobutton�Scale�	Scrollbar�	Separator�Sizegrip�Spinbox�Style�Treeview�LabeledScale�
OptionMenu�
tclobjs_to_py�setup_master�N)�_flatten�_join�
_stringify�
_splitdictg!@TFcCsBtr>ddl}|j�d�}|r,|j�d|�|j�d�d|_dS)NrZTILE_LIBRARYz(global auto_path; lappend auto_path {%s}zpackage require tileT)�
_REQUIRE_TILE�os�environ�get�tk�eval�_tile_loaded)�masterr Ztilelib�r'�#/usr/lib64/python3.8/tkinter/ttk.py�
_load_tile"s��r)cCs(|rt|�}nt|ttf�r$t|�}|S�N)r�
isinstance�list�tupler)�value�scriptr'r'r(�_format_optvalue1s

r0cCsPg}|��D]:\}}|r ||kr|�d|�|dk	r|�t||��qt|�S�N�-%s)�items�appendr0r)Zoptdictr/�ignore�opts�optr.r'r'r(�_format_optdict;sr8cCsXg}|D]J�^}}t|�dkr,|dp(d}n
d�|�}|�|�|dk	r|�|�q|S)N�r�� )�len�joinr4)r3Zopt_val�state�valr'r'r(�_mapdict_valuesKs

r@cCs:g}|��D]$\}}|�d|tt|�|�f�qt|�Sr1)r3�extendr0r@r)Zmapdictr/r6r7r.r'r'r(�_format_mapdict`s

�rBcOs�d}d}|dkr�|dkrB|d}tt|dd���}d||f}n2|dd�\}}	tt|dd���}
d||	|
f}t||�}n,|d	kr�|d}t|�dkr�t|d|�f}|r�d
|}d�|�}||fS)Nr')�imageZvsapirCrr9z%s %s�z%s %s %s�fromz{%s}r;)rr@r8r<r0r=)�etyper/�args�kw�specr6ZinameZ	imagespec�
class_nameZpart_idZstatemapr'r'r(�_format_elemcreateqs&
rKrDc
Cs�g}|D]�}|\}}|pi}d�t|dd��}dd|||rDd|ndf}d|kr�|�|d�||7}t|d||�\}	}|�|	�||8}|�d	d|�q|�|�qd
�|�|fS)Nr;T)�childrenz%s%s%sz %sr:rLz -children {z%s}�
)r=r8r4�_format_layoutlist)
�layout�indentZindent_sizer/Zlayout_elem�elemr6Zfopts�headZ	newscriptr'r'r(rN�s"
�
rNcCsXg}|��D�]>\}}|�d�rFd�t|dd��}|�d||f�|�d�rvd�t|dd��}|�d||f�d|kr�|ds�d}nt|d�\}}|�d	||f�|�d
�r|d
}|d}d}|t|�kr�t||d
�s�|d7}q�|d|�}	|t|�k�r||�r||ni}
t	|df|	�|
�\}}|�d||||f�qd�|�S)N�	configurer;Tzttk::style configure %s %s;�mapzttk::style map %s %s;rO�nullzttk::style layout %s {
%s
}zelement createrr9r3z%ttk::style element create %s %s %s %srM)
r3r"r=r8r4rBrNr<�hasattrrK)�settingsr/�namer6�s�_ZeoptsrFZargcZelemargsZelemkwrIr'r'r(�_script_from_settings�s:



$�
r[cCs�t|t�r|Sg}t|�}t||�D]j\}}t|d�rDt|���}n(t|t�rX|��}nt|ttf�sl|f}t|d�r~t|�}|�||f��q$|S)N�typename)	r+�str�iter�ziprV�splitr-r,r4)Zstuple�result�itr>r?r'r'r(�_list_from_statespec�s




rccCs�|�|�}g}d}|t|�kr�||}i}|�||f�|d7}|t|�kr|||d�\}}|�d�slq|dd�}|d7}|dkr�t||�}|||<q@q|S)Nrr9rD�-rL)�	splitlistr<r4�
startswith�_list_from_layouttuple)r#Zltuple�resZindxrXr6r7r?r'r'r(rgs$


rgcGs4t|�}|j||�}t|�dr&|St||td�S)NrD)�conv)r8�callr<r�
_tclobj_to_py)r#�optionsrGrhr'r'r(�_val_or_dict!s
rmc	Cs2t|�}zt|�}Wnttfk
r,YnX|Sr*)r]�int�
ValueError�	TypeError)r.r'r'r(�_convert_stringval1srqcCs(t|t�r$d|krt|�}nt|�}|S)N�.)r+r]�floatrn)�xr'r'r(�
_to_number;s


rucCs\|rFt|d�rFt|t�sFt|ddd�dkr6t|�}qXttt|��}nt|d�rXt|�}|S)N�__len__rr\Z	StateSpec)rVr+r]�getattrrcr,rTrq)r?r'r'r(rkCs

rkcCs"|��D]\}}t|�||<q|Sr*)r3rk)Zadictr7r?r'r'r(rPscCs|dkrt��}|Sr*)�tkinterZ_get_default_root)r&r'r'r(rXsc@s~eZdZdZddd�Zddd�Zddd�Zdd	d
�Zddd�Zd
d�Z	dd�Z
dd�Zd dd�Zdd�Z
dd�Zd!dd�ZdS)"rz
ttk::styleNcCs0t|�}t|dd�st|�||_|jj|_dS)Nr%F)rrwr)r&r#)�selfr&r'r'r(�__init__is
zStyle.__init__cKs4|dk	rd||<t|j||jd|�}|s,|r0|SdS)NrS)rmr#�_name�ry�styleZ	query_optrHrar'r'r(rSts
zStyle.configurecsj|dk	r0�j��jd|d|�}t�j�|��S�jj�jd|ft|���}�fdd�t�j|���D�S)NrTr2cs"i|]\}}|t�j�|���qSr')rcr#re)�.0�k�v�ryr'r(�
<dictcomp>�s�zStyle.map.<locals>.<dictcomp>)r#rjr{rcrerBrr3r|r'r�r(rT�s
�z	Style.mapcCs.|rd�|�nd}|j�|jd|d|||�S)Nr;r:�lookupr2)r=r#rjr{)ryr}�optionr>�defaultr'r'r(r��s
�zStyle.lookupcCs>d}|rt|�d}n|dk	r"d}t|j|j�|jd||��S)NrrUrO)rNrgr#rjr{)ryr}Z
layoutspecZlspecr'r'r(rO�s �zStyle.layoutcOs8t|df|�|�\}}|jj|jdd|||f|��dS)NF�element�create)rKr#rjr{)ry�elementnamerFrGrHrIr6r'r'r(�element_create�s��zStyle.element_createc	Cs(tdd�|j�|j�|jdd��D��S)Ncss|]}|�d�VqdS�rdN��lstrip)r~�nr'r'r(�	<genexpr>�sz&Style.element_names.<locals>.<genexpr>r��names�r-r#rerjr{r�r'r'r(�
element_names�s�zStyle.element_namesc
Cs*tdd�|j�|j�|jdd|��D��S)Ncss|]}|�d�VqdSr�r�)r~�or'r'r(r��sz(Style.element_options.<locals>.<genexpr>r�rlr�)ryr�r'r'r(�element_options�s�zStyle.element_optionsc
CsN|rt|�nd}|r2|j�|jdd|d|d|�n|j�|jdd|d|�dS)Nr:�themer�z-parentz	-settings�r[r#rjr{)ry�	themename�parentrWr/r'r'r(�theme_create�s��zStyle.theme_createcCs"t|�}|j�|jdd||�dS)Nr�rWr�)ryr�rWr/r'r'r(�theme_settings�szStyle.theme_settingscCs|j�|j�|jdd��S)Nr�r�)r#rerjr{r�r'r'r(�theme_names�szStyle.theme_namescCs&|dkr|j�d�S|j�d|�dS)Nzreturn $ttk::currentThemez
ttk::setTheme)r#r$rj)ryr�r'r'r(�	theme_use�szStyle.theme_use)N)N)N)NN)N)NN)N)�__name__�
__module__�__qualname__r{rzrSrTr�rOr�r�r�r�r�r�r�r'r'r'r(rds




+
c@s2eZdZd
dd�Zdd�Zddd�Zddd	�ZdS)
�WidgetNcCs4t|�}t|dd�st|�tjj||||d�dS)Nr%F)rH)rrwr)rxr�rz)ryr&Z
widgetnamerHr'r'r(rzszWidget.__init__cCs|j�|jd||�S�N�identify�r#rj�_w�ryrt�yr'r'r(r�+szWidget.identifyc	Os6|j�|j�|jdd�|���}|r2|r2|||�S|S)N�instater;)r#�
getbooleanrjr�r=)ry�	statespec�callbackrGrHZretr'r'r(r�3s�
zWidget.instatecCs0|dk	rd�|�}|j�t|j�|jd|���S)Nr;r>)r=r#rer]rjr�)ryr�r'r'r(r>Bs
zWidget.state)N)N)N)r�r�r�rzr�r�r>r'r'r'r(r�
s

r�c@seZdZddd�Zdd�ZdS)rNcKst�||d|�dS)Nzttk::button�r�rz�ryr&rHr'r'r(rzSszButton.__init__cCs|j�|jd�S�N�invoker�r�r'r'r(r�bsz
Button.invoke)N�r�r�r�rzr�r'r'r'r(rOs
c@seZdZddd�Zdd�ZdS)rNcKst�||d|�dS)Nzttk::checkbuttonr�r�r'r'r(rzjszCheckbutton.__init__cCs|j�|jd�Sr�r�r�r'r'r(r�yszCheckbutton.invoke)Nr�r'r'r'r(rgs
c@s.eZdZd
dd�Zdd�Zdd�Zdd	�ZdS)rNcKst�|||pd|�dS)Nz
ttk::entryr�)ryr&ZwidgetrHr'r'r(rz�szEntry.__init__cCs|�|j�|jd|��S)N�bbox�Z_getintsr#rjr�)ry�indexr'r'r(r��sz
Entry.bboxcCs|j�|jd||�Sr�r�r�r'r'r(r��szEntry.identifycCs|j�|j�|jd��S)N�validate�r#r�rjr�r�r'r'r(r��szEntry.validate)NN)r�r�r�rzr�r�r�r'r'r'r(r�s
c@s(eZdZddd�Zd	dd�Zdd�ZdS)
rNcKstj||df|�dS)Nz
ttk::combobox�rrzr�r'r'r(rz�szCombobox.__init__cCs2|dkr |j�|j�|jd��S|j�|jd|�S)N�current�r#Zgetintrjr�)ryZnewindexr'r'r(r��szCombobox.currentcCs|j�|jd|�dS�N�setr��ryr.r'r'r(r��szCombobox.set)N)N)r�r�r�rzr�r�r'r'r'r(r�s


c@seZdZddd�ZdS)rNcKst�||d|�dS)Nz
ttk::framer�r�r'r'r(rz�szFrame.__init__)N�r�r�r�rzr'r'r'r(r�sc@seZdZddd�ZdS)rNcKst�||d|�dS)Nz
ttk::labelr�r�r'r'r(rz�s
zLabel.__init__)Nr�r'r'r'r(r�sc@seZdZddd�ZdS)rNcKst�||d|�dS)Nzttk::labelframer�r�r'r'r(rz�szLabelframe.__init__)Nr�r'r'r'r(r�sc@seZdZddd�ZdS)r	NcKst�||d|�dS)Nzttk::menubuttonr�r�r'r'r(rzszMenubutton.__init__)Nr�r'r'r'r(r	
sc@sjeZdZddd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Zdd�Z	ddd�Z
ddd�Zdd�Zdd�Z
dS)r
NcKst�||d|�dS)Nz
ttk::notebookr�r�r'r'r(rz"szNotebook.__init__cKs |jj|jd|ft|���dS�N�add�r#rjr�r8)ry�childrHr'r'r(r�BszNotebook.addcCs|j�|jd|�dS)N�forgetr��ry�tab_idr'r'r(r�JszNotebook.forgetcCs|j�|jd|�dS)N�hider�r�r'r'r(r�Psz
Notebook.hidecCs|j�|jd||�Sr�r�r�r'r'r(r�YszNotebook.identifycCs|j�|j�|jd|��S�Nr�r�r�r'r'r(r�_szNotebook.indexcKs"|jj|jd||ft|���dS�N�insertr��ry�posr�rHr'r'r(r�eszNotebook.insertcCs|j�|jd|�S)N�selectr�r�r'r'r(r�nszNotebook.selectcKs$|dk	rd||<t|j||jd|�S)N�tab�rmr#r�)ryr�r�rHr'r'r(r�xszNotebook.tabcCs|j�|j�|jd�pd�S)N�tabsr'�r#rerjr�r�r'r'r(r��sz
Notebook.tabscCs|j�d|j�dS)Nzttk::notebook::enableTraversalr�r�r'r'r(�enable_traversal�szNotebook.enable_traversal)N)N)N)r�r�r�rzr�r�r�r�r�r�r�r�r�r�r'r'r'r(r
s
 		


c@s:eZdZd
dd�ZejjZdd�Zddd�Zddd	�Z	dS)
rNcKst�||d|�dS)Nzttk::panedwindowr�r�r'r'r(rz�szPanedwindow.__init__cKs"|jj|jd||ft|���dSr�r�r�r'r'r(r��szPanedwindow.insertcKs$|dk	rd||<t|j||jd|�S)N�paner�)ryr�r�rHr'r'r(r��szPanedwindow.panecCs|j�|j�|jd||��S)N�sashposr�)ryr�Znewposr'r'r(r��szPanedwindow.sashpos)N)N)N)
r�r�r�rzrxrr�r�r�r�r'r'r'r(r�s

	
c@s2eZdZd
dd�Zddd�Zddd�Zdd	�ZdS)
r
NcKst�||d|�dS)Nzttk::progressbarr�r�r'r'r(rz�szProgressbar.__init__cCs|j�|jd|�dS)N�startr�)ryZintervalr'r'r(r��szProgressbar.startcCs|j�|jd|�dS)N�stepr�)ryZamountr'r'r(r��szProgressbar.stepcCs|j�|jd�dS)N�stopr�r�r'r'r(r�szProgressbar.stop)N)N)N)r�r�r�rzr�r�r�r'r'r'r(r
�s


c@seZdZddd�Zdd�ZdS)rNcKst�||d|�dS)Nzttk::radiobuttonr�r�r'r'r(rzszRadiobutton.__init__cCs|j�|jd�Sr�r�r�r'r'r(r�szRadiobutton.invoke)Nr�r'r'r'r(rs
c@s*eZdZddd�Zd	dd�Zd
dd�ZdS)rNcKst�||d|�dS)Nz
ttk::scaler�r�r'r'r(rz'szScale.__init__cKsTtj||f|�}t|td�tf�s,|�|�td|kd|kd|kg�rP|�d�|S)NrE�from_�to�<<RangeChanged>>)r�rSr+�typer]�update�anyZevent_generate)ryZcnfrHZretvalr'r'r(rS5s

zScale.configurecCs|j�|jd||�S)Nr"r�r�r'r'r(r"Bsz	Scale.get)N)N)NN)r�r�r�rzrSr"r'r'r'r(r#s


c@seZdZddd�ZdS)rNcKst�||d|�dS)Nzttk::scrollbarr�r�r'r'r(rzNszScrollbar.__init__)Nr�r'r'r'r(rKsc@seZdZddd�ZdS)rNcKst�||d|�dS)Nzttk::separatorr�r�r'r'r(rz`szSeparator.__init__)Nr�r'r'r'r(r\sc@seZdZddd�ZdS)rNcKst�||d|�dS)Nz
ttk::sizegripr�r�r'r'r(rzrszSizegrip.__init__)Nr�r'r'r'r(rnsc@seZdZddd�Zdd�ZdS)rNcKstj||df|�dS)Nzttk::spinboxr�r�r'r'r(rz�szSpinbox.__init__cCs|j�|jd|�dSr�r�r�r'r'r(r��szSpinbox.set)N)r�r�r�rzr�r'r'r'r(r|s
c@s0eZdZdDdd�ZdEdd�ZdFdd�Zdd	�ZdGd
d�Zdd
�Zdd�Z	dd�Z
dHdd�ZdIdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zd d!�ZdJd"d#�ZdKd$d%�Zd&d'�ZeZd(d)�Zd*d+�Zd,d-�Zd.d/�Zd0d1�Zd2d3�Zd4d5�Zd6d7�Zd8d9�Zd:d;�Z dLd<d=�Z!dMd>d?�Z"dNd@dA�Z#dOdBdC�Z$dS)PrNcKst�||d|�dS)Nz
ttk::treeviewr�r�r'r'r(rz�szTreeview.__init__cCs|�|j�|jd||��pdS)Nr�r:r�)ry�item�columnr'r'r(r��sz
Treeview.bboxcCs"|j�|j�|jd|pd�pd�S)NrLr:r'r��ryr�r'r'r(�get_children�s�zTreeview.get_childrencGs|j�|jd||�dS)NrLr�)ryr�Znewchildrenr'r'r(�set_children�szTreeview.set_childrencKs$|dk	rd||<t|j||jd|�S)Nr�r�)ryr�r�rHr'r'r(r��szTreeview.columncGs|j�|jd|�dS)N�deleter��ryr3r'r'r(r��szTreeview.deletecGs|j�|jd|�dS)N�detachr�r�r'r'r(r��szTreeview.detachcCs|j�|j�|jd|��S)N�existsr�r�r'r'r(r��szTreeview.existscCs|j�|jd|�S)N�focusr�r�r'r'r(r��szTreeview.focuscKsP|�d�}|r,t|t�s,|j�||j�|d<|dk	r<d||<t|j||jd|�S)N�command�heading)	r"r+r]r&�registerZ_substitutermr#r�)ryr�r�rH�cmdr'r'r(r��s
zTreeview.headingcCs|j�|jd|||�Sr�r�)ryZ	componentrtr�r'r'r(r�szTreeview.identifycCs|�dd|�S)N�rowr�r�)ryr�r'r'r(�identify_rowszTreeview.identify_rowcCs|�d|d�S)Nr�rr�)ryrtr'r'r(�identify_column"szTreeview.identify_columncCs|�d||�S)NZregionr�r�r'r'r(�identify_region)s	zTreeview.identify_regioncCs|�d||�S)Nr�r�r�r'r'r(�identify_element5szTreeview.identify_elementcCs|j�|j�|jd|��Sr�r�r�r'r'r(r�<szTreeview.indexcKsNt|�}|dk	r0|jj|jd||d|f|��}n|jj|jd||f|��}|S)Nr�z-id)r8r#rjr�)ryr�r�ZiidrHr6rhr'r'r(r�Bs
��zTreeview.insertcKs$|dk	rd||<t|j||jd|�S)Nr�r�)ryr�r�rHr'r'r(r�Ysz
Treeview.itemcCs|j�|jd|||�dS)N�mover�)ryr�r�r�r'r'r(r�esz
Treeview.movecCs|j�|jd|�S)N�nextr�r�r'r'r(r�qsz
Treeview.nextcCs|j�|jd|�S)Nr�r�r�r'r'r(r�wszTreeview.parentcCs|j�|jd|�S)N�prevr�r�r'r'r(r�}sz
Treeview.prevcCs|j�|jd|�dS)N�seer�r�r'r'r(r��szTreeview.seecCs|j�|j�|jd��S)N�	selectionr�r�r'r'r(r��szTreeview.selectioncCs>t|�dkr&t|dttf�r&|d}|j�|jd||�dS)Nr9rr�)r<r+r-r,r#rjr�)ryZselopr3r'r'r(�
_selection�szTreeview._selectioncGs|�d|�dSr��r�r�r'r'r(�
selection_set�szTreeview.selection_setcGs|�d|�dSr�r�r�r'r'r(�
selection_add�szTreeview.selection_addcGs|�d|�dS)N�remover�r�r'r'r(�selection_remove�szTreeview.selection_removecGs|�d|�dS)NZtoggler�r�r'r'r(�selection_toggle�szTreeview.selection_togglecCs@|j�|jd|||�}|dkr8|dkr8t|j|dtd�S|SdS)Nr�F)Z	cut_minusri)r#rjr�rrk)ryr�r�r.rhr'r'r(r��s�zTreeview.setcCs |j|jdd|f||dd�dS)N�tag�bindr)r�)Z_bindr�)ry�tagnameZsequencer�r'r'r(�tag_bind�szTreeview.tag_bindcKs&|dk	rd||<t|j||jdd|�S)Nr�rSr�)ryr�r�rHr'r'r(�
tag_configure�s
�zTreeview.tag_configurec	CsF|dkr$|j�|j�|jdd|��S|j�|j�|jdd||��SdS)Nr�Zhas)r#rerjr�r�)ryr�r�r'r'r(�tag_has�s��zTreeview.tag_has)N)N)N)N)N)N)N)N)NN)NN)N)N)%r�r�r�rzr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�Zreattachr�r�r�r�r�r�r�r�r�r�r�r�r�r�r'r'r'r(r�sD



	
	

 

		



csHeZdZd
dd�Z�fdd�Zdd	�Zed
d��Zejdd��Z�Z	S)rNr�
c	Ks|�dd�dk|_tj||f|�|p.t�|�|_|j�|�||_t	|�|_
t||j||d�|_|j�
d|j�|jr|dnd}|dkr�dnd}|jj|dd�t	|�}|j|d�|��|j
j|dkr�d	nd
d�|j�d|j�|_|�
d
|j�|�
d|j�dS)NZcompound�top)�variabler�r�r�Zbottomrt)�sideZfill)rr�rY)Zanchor�wz<Configure>z<Map>)�pop�
_label_toprrzrxZIntVar�	_variabler��_last_validr�labelr�scaler��_adjustZpack�lowerZplaceZtrace_variable�_LabeledScale__tracecb)	ryr&rr�r�rHZ
scale_sideZ
label_sideZdummyr'r'r(rz�s$
zLabeledScale.__init__csHz|j�d|j�Wntk
r(YnX|`t���d|_d|_dS)Nr)rZ
trace_vdeleter�AttributeError�super�destroyrr	r���	__class__r'r(rs
zLabeledScale.destroycs��fdd�}t�jd�}t�jd�}||kr:||}}�j��}||krX|ksfn�j�_dS|�_|�jd<��|�dS)NcsZ����j��\}}�jr2�j���j��}n�j���j��}�jj||d�dS)N�rtr�)Zupdate_idletasksr	ZcoordsrZwinfo_yrZwinfo_reqheightZplace_configurerr�r'r(�adjust_labelsz*LabeledScale._adjust.<locals>.adjust_labelrEr��text)rur	rr"rr.rZ
after_idle)ryrGrr�r�Znewvalr'r�r(r
s


zLabeledScale._adjustcCs
|j��Sr*)rr"r�r'r'r(r.4szLabeledScale.valuecCs|j�|�dSr*)rr�)ryr?r'r'r(r.9s)NNrr�)
r�r�r�rzrr
�propertyr.�setter�
__classcell__r'r'rr(r�s
&

cs8eZdZd
dd�Zdd�Zddd�Z�fdd	�Z�ZS)rNcOs�||�dd�|�dd�d�}tj||f|�tj|dd�|d<||_|�dd�|_|rpt�dtt	|�
�����|j|f|��dS)	Nr}�	direction)Ztextvariabler}rF)Ztearoff�menur�zunknown option -%s)rr	rzrxZMenur�	_callbackZTclErrorr�r^�keys�set_menu)ryr&rr��values�kwargsrHr'r'r(rzCs
��zOptionMenu.__init__cCs&|dkr|�t�||��St�||�S)Nr)Znametowidgetr	�__getitem__r�r'r'r(r`szOptionMenu.__getitem__cGsR|d}|�dd�|D]$}|j|t�|j||j�|jd�q|rN|j�|�dS)Nrr�end)rr�r)r�Zadd_radiobuttonrxZ_setitrrr�)ryr�rrr?r'r'r(rgs�zOptionMenu.set_menucs,z|`Wntk
rYnXt���dSr*)rr
rrr�rr'r(rus
zOptionMenu.destroy)N)N)r�r�r�rzrrrrr'r'rr(r?s

)F)FN)F)F)rrD)N)5�__version__�
__author__�__all__rxrrrrZ	TkVersionrr)r0r8r@rBrKrNr[rcrgrmrqrurkrr�objectrr�rrrrrrrrr	r
rrr
rrrrrrZXViewZYViewrrrr'r'r'r(�<module>s��	




%
1*


*B*"8*(J`messagebox.cpython-38.opt-2.pyc000064400000005123151732766100012302 0ustar00U

e5d}�@sHddlmZdZdZdZdZdZdZdZd	Z	d
Z
dZdZd
Z
dZdZdZdZdZGdd�de�Zd5dd�Zd6dd�Zd7dd�Zd8dd�Zd9dd�Zd:dd �Zd;d!d"�Zd<d#d$�Zd=d%d&�Zed'k�rDeded(d)��eded(d*��eded(d+��eded(d,��ed-ed(d.��ed/ed(d0��ed1ed(d2��ed3ed(d4��dS)>�)�Dialog�error�infoZquestionZwarningZabortretryignore�okZokcancelZretrycancelZyesnoZyesnocancel�abortZretry�ignoreZcancelZyesZnoc@seZdZdZdS)�MessageZ
tk_messageBoxN)�__name__�
__module__�__qualname__Zcommand�rr�*/usr/lib64/python3.8/tkinter/messagebox.pyr9srNcKsl|rd|kr||d<|r(d|kr(||d<|r4||d<|r@||d<tf|���}t|t�rd|r`tStSt|�S)NZicon�type�title�message)rZshow�
isinstance�bool�YES�NO�str)rrZ_iconZ_type�options�resrrr
�_showCs
rcKst||ttf|�S�N)r�INFO�OK�rrrrrr
�showinfoRsrcKst||ttf|�Sr)r�WARNINGrrrrr
�showwarningWsrcKst||ttf|�Sr)r�ERRORrrrrr
�	showerror\sr!cKst||ttf|�Sr)r�QUESTION�YESNOrrrr
�askquestionasr$cKst||ttf|�}|tkSr)rr"�OKCANCELr�rrr�srrr
�askokcancelfsr(cKst||ttf|�}|tkSr)rr"r#rr&rrr
�askyesnolsr)cKs.t||ttf|�}t|�}|tkr&dS|tkSr)rr"�YESNOCANCELr�CANCELrr&rrr
�askyesnocancelrs
r,cKst||ttf|�}|tkSr)rr�RETRYCANCEL�RETRYr&rrr
�askretrycancel|sr/�__main__ZSpamzEgg InformationzEgg Warningz	Egg Alertz	Question?ZproceedzProceed?zyes/nozGot it?z
yes/no/cancelzWant it?z	try againz
Try again?)NNNN)NN)NN)NN)NN)NN)NN)NN)NN)Ztkinter.commondialogrr rr"rZABORTRETRYIGNORErr%r-r#r*ZABORTr.ZIGNOREr+rrrrrrr!r$r(r)r,r/r	�printrrrr
�<module>sH










	
filedialog.cpython-38.opt-1.pyc000064400000030021151732766100012236 0ustar00U

e5d�8�@sdZddlTddlmZddlmZddlmZddlZddlZiZ	Gdd�d�Z
Gd	d
�d
e
�ZGdd�de
�ZGd
d�dej�Z
Gdd�de
�ZGdd�de
�ZGdd�dej�Zdd�Zdd�Zdd�Zd(dd�Zd)dd�Zd*d!d"�Zd#d$�Zd%d&�Zed'k�re�dS)+aUFile selection dialog classes.

Classes:

- FileDialog
- LoadFileDialog
- SaveFileDialog

This module also presents tk common file dialogues, it provides interfaces
to the native file dialogues available in Tk 4.2 and newer, and the
directory dialogue available in Tk 8.3 and newer.
These interfaces were written by Fredrik Lundh, May 1997.
�)�*)�Dialog)�commondialog)�
_setup_dialogNc@s�eZdZdZdZd$dd�Zejdddfdd	�Zd%d
d�Z	dd
�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zd&dd�Zdd�Zdd�Zd'dd�Zd d!�Zd"d#�ZdS)(�
FileDialoga�Standard file selection dialog -- no checks on selected file.

    Usage:

        d = FileDialog(master)
        fname = d.go(dir_or_file, pattern, default, key)
        if fname is None: ...canceled...
        else: ...open file...

    All arguments to go() are optional.

    The 'key' argument specifies a key in the global dictionary
    'dialogstates', which keeps track of the values for the directory
    and pattern arguments, overriding the values passed in (it does
    not keep track of the default argument!).  If no key is specified,
    the dialog keeps no memory of previous state.  Note that memory is
    kept even when the dialog is canceled.  (All this emulates the
    behavior of the Macintosh file selection dialogs.)

    zFile Selection DialogNcCs�|dkr|j}||_d|_t|�|_|j�|�|j�|�t|j�t|j�|_|jj	t
td�t|j�|_
|j
j	t
td�|j
�d|j�t|j�|_|jj	ttd�|j�d|j�t|j�|_|jj	ttd�t|j�|_|jj	ttd�t|jd|jdfd�|_|jj	tttd�|j��}|j�|dd�|dd��|j�d	|j�|j�d
|j�|jj|jdfd�t|j�|_ |j j	t!td�t|jd|j dfd�|_"|j"j	t!ttd�|j j|j"dfd�|j"��}|j"�|dd�|dd��|j"�d	|j#�|j"�d
|j$�t%|jd
|j&d�|_'|j'j	t!d�t%|jd|jd�|_(|j(j	t!td�t%|jd|j)d�|_*|j*j	td�|j�+d|j)�|j�d|j)�|j�d|j)�dS)N)�side�fillz<Return>)�expandrr�set)ZexportselectionZyscrollcommand)rr	r�z<ButtonRelease-1>z<Double-ButtonRelease-1>Zyview)�commandZOK)�textr)rZFilter)rr	�CancelZWM_DELETE_WINDOWz<Alt-w>z<Alt-W>),�title�master�	directoryZToplevel�topZiconnamerZFrameZbotframeZpackZBOTTOM�XZEntry�	selectionZbind�ok_event�filterZTOP�filter_commandZmidframeZYESZBOTHZ	ScrollbarZfilesbarZRIGHT�YZListbox�filesZbindtags�files_select_event�files_double_eventZconfigZdirsbarZLEFT�dirs�dirs_select_event�dirs_double_eventZButton�
ok_commandZ	ok_buttonZ
filter_button�cancel_commandZ
cancel_buttonZprotocol)�selfrrZbtags�r"�*/usr/lib64/python3.8/tkinter/filedialog.py�__init__4st

�
 �
 ���zFileDialog.__init__r�cCs�|r|tkrt|\|_}n2tj�|�}tj�|�r<||_ntj�|�\|_}|�|j|�|�|�|�	�|j
��|j�
�|j��d|_|j��|r�|��\}}|jr�tj�|j�}||ft|<|j��|jS�N)�dialogstatesr�os�path�
expanduser�isdir�split�
set_filter�
set_selectionrrZ	focus_setrZwait_visibilityZgrab_set�howrZmainloop�
get_filter�dirnameZdestroy)r!Zdir_or_file�pattern�default�keyrr"r"r#�gots*





z
FileDialog.gocCs||_|j��dSr&)r/r�quit)r!r/r"r"r#r6�szFileDialog.quitcCs|��dSr&)r�r!�eventr"r"r#r�szFileDialog.dirs_double_eventcCs@|��\}}|j�d�}tj�tj�|j|��}|�||�dS�NZactive)	r0r�getr(r)�normpath�joinrr-)r!r8�dir�patZsubdirr"r"r#r�szFileDialog.dirs_select_eventcCs|��dSr&�rr7r"r"r#r�szFileDialog.files_double_eventcCs|j�d�}|�|�dSr9)rr:r.)r!r8�filer"r"r#r�szFileDialog.files_select_eventcCs|��dSr&r?r7r"r"r#r�szFileDialog.ok_eventcCs|�|���dSr&)r6�
get_selection�r!r"r"r#r�szFileDialog.ok_commandcCs&|��\}}zt�|�}Wn tk
r:|j��YdSX||_|�||�|��tj	g}g}|D]@}tj
�||�}tj
�|�r�|�
|�qft�||�rf|�
|�qf|j�dt�|D]}|j�t|�q�|j�dt�|D]}|j�t|�q�tj
�|���\}	}
|
tjk�rd}
|�|
�dS)Nrr%)r0r(�listdir�OSErrorr�bellrr-�sort�pardirr)r<r+�append�fnmatchr�delete�END�insertrr,rA�curdirr.)r!r8r=r>�namesZsubdirsZ
matchingfiles�name�fullname�head�tailr"r"r#r�s6
zFileDialog.filter_commandcCsN|j��}tj�|�}|dd�tjks4tj�|�rBtj�|d�}tj�|�S)N���r)	rr:r(r)r*�sepr+r<r,)r!rr"r"r#r0�s

zFileDialog.get_filtercCs|j��}tj�|�}|Sr&)rr:r(r)r*�r!r@r"r"r#rA�s
zFileDialog.get_selectioncCs|��dSr&)r6r7r"r"r#r �szFileDialog.cancel_commandcCs�tj�|�sPzt��}Wntk
r0d}YnX|rPtj�||�}tj�|�}|j�dt	�|j�
t	tj�|pttj|pzd��dS)Nrr)r(r)�isabs�getcwdrDr<r;rrJrKrLrM)r!r=r>�pwdr"r"r#r-�s
zFileDialog.set_filtercCs,|j�dt�|j�ttj�|j|��dS)Nr)rrJrKrLr(r)r<rrUr"r"r#r.�szFileDialog.set_selection)N)N)N)N)�__name__�
__module__�__qualname__�__doc__rr$r(rMr5r6rrrrrrrr0rAr r-r.r"r"r"r#rs"
@


rc@seZdZdZdZdd�ZdS)�LoadFileDialogz8File selection dialog which checks that the file exists.zLoad File Selection DialogcCs.|��}tj�|�s |j��n
|�|�dSr&)rAr(r)�isfilerrEr6rUr"r"r#r�szLoadFileDialog.ok_commandN�rYrZr[r\rrr"r"r"r#r]�sr]c@seZdZdZdZdd�ZdS)�SaveFileDialogz@File selection dialog which checks that the file may be created.zSave File Selection DialogcCs�|��}tj�|�rZtj�|�r.|j��dSt|jdd|fdddd�}|j	dkr�dSn*tj�
|�\}}tj�|�s�|j��dS|�|�dS)Nz Overwrite Existing File QuestionzOverwrite existing file %r?Z	questheadr)ZYesr)rr
Zbitmapr3Zstringsr)rAr(r)�existsr+rrErrZnumr,r6)r!r@�drQrRr"r"r#r�s&
�

zSaveFileDialog.ok_commandNr_r"r"r"r#r`�sr`c@seZdZdd�Zdd�ZdS)�_DialogcCs2zt|jd�|jd<Wntk
r,YnXdS)N�	filetypes)�tuple�options�KeyErrorrBr"r"r#�_fixoptions,sz_Dialog._fixoptionscCsR|rHz
|j}Wntk
r"YnXtj�|�\}}||jd<||jd<||_|S)N�
initialdirZinitialfile)�string�AttributeErrorr(r)r,rf�filename�r!�widget�resultr)r@r"r"r#�
_fixresult3s


z_Dialog._fixresultN)rYrZr[rhrpr"r"r"r#rc*srcc@seZdZdZdZdd�ZdS)�Open�Ask for a filename to openZtk_getOpenFilecCsxt|t�rBtdd�|D��}|r>tj�|d�\}}||jd<|S|j��sjd|jkrj|�||j�	|��St
�|||�S)NcSsg|]}t|d|��qS)rj)�getattr)�.0�rr"r"r#�
<listcomp>Nsz#Open._fixresult.<locals>.<listcomp>rri�multiple)�
isinstancerer(r)r,rfZtkZwantobjectsrpZ	splitlistrcrmr"r"r#rpKs

zOpen._fixresultN�rYrZr[r\rrpr"r"r"r#rqFsrqc@seZdZdZdZdS)�SaveAs�Ask for a filename to save asZtk_getSaveFileN)rYrZr[r\rr"r"r"r#rzZsrzc@seZdZdZdZdd�ZdS)�	DirectoryzAsk for a directoryZtk_chooseDirectorycCs8|r.z
|j}Wntk
r"YnX||jd<||_|S)Nri)rjrkrfr)r!rnror"r"r#rpfs

zDirectory._fixresultNryr"r"r"r#r|asr|cKstf|���S)rr�rq�show�rfr"r"r#�askopenfilenamewsr�cKstf|���S)r{)rzr~rr"r"r#�asksaveasfilename}sr�cKsd|d<tf|���S)ztAsk for multiple filenames to open

    Returns a list of filenames or empty list if
    cancel button selected
    rrwr}rr"r"r#�askopenfilenames�sr�rucKs tf|���}|rt||�SdS)z8Ask for a filename to open, and returned the opened fileN)rqr~�open��moderfrlr"r"r#�askopenfile�s
r�cKs4tf|�}|r0g}|D]}|�t||��q|}|S)z�Ask for multiple filenames and return the open file
    objects

    returns a list of open file objects or an empty list if
    cancel selected
    )r�rHr�)r�rfrZofilesrlr"r"r#�askopenfiles�s
r��wcKs tf|���}|rt||�SdS)z;Ask for a filename to save as, and returned the opened fileN)rzr~r�r�r"r"r#�
asksaveasfile�s
r�cKstf|���S)z-Ask for a directory, and return the file name)r|r~rr"r"r#�askdirectory�sr�c
	Cs�t�}|��t|�}|jdd�}t|�}|jdd�}t||�d}ddl}z&ddl}|�|j	d�|�
|j�}Wntt
fk
r�YnXtdgd�}zt|d	�}|��Wn$td
�t|��d�YnXtd|�|��t�}	td
|	�|��dS)zSimple test program.�test)r4zutf-8rNr%)z	all filesr)rdruzCould not open File: rr�Zsaveas)ZTkZwithdrawr]r5r`�print�sys�locale�	setlocale�LC_ALL�nl_langinfo�CODESET�ImportErrorrkr�r��close�exc_info�encoder�)
�root�fdZloadfileZsavefile�encr�r�Zopenfilename�fpZsaveasfilenamer"r"r#r��s2

r��__main__)ru)ru)r�)r\ZtkinterZtkinter.dialogrrZtkinter.simpledialogrr(rIr'rr]r`rcrqrzr|r�r�r�r�r�r�r�r�rYr"r"r"r#�<module>s2I9
	

	,
constants.cpython-38.opt-1.pyc000064400000003170151732766100012160 0ustar00U

e5d��@s8dZZZdZZZdZdZdZdZ	dZ
dZdZd	Z
d
ZdZdZd
ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!dZ"dZ#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,Z0d-Z1d.Z2d/Z3d0Z4d1Z5d2Z6d3Z7d4Z8d5Z9d6Z:d7Z;d8Z<d9Z=d:Z>d;Z?d<Z@d=ZAd>ZBd?ZCd@ZDdAZEdBZFdCZGdDZHdEZIdFZJdGZKdHZLdIS)J���n�s�w�eZnw�sw�neZse�nsZewZnsew�centerZnone�x�yZboth�left�top�rightZbottomZraisedZsunkenZflatZridgeZgrooveZsolidZ
horizontalZvertical�numeric�charZwordZbaselineZinsideZoutsideZselz	sel.firstzsel.last�end�insertZcurrentZanchor�allZnormalZdisabledZactiveZhiddenZcascadeZcheckbuttonZcommandZradiobuttonZ	separatorZsingleZbrowseZmultipleZextendedZdotboxZ	underlineZpiesliceZchordZarc�firstZlastZbuttZ
projecting�roundZbevelZmiterZmovetoZscrollZunitsZpagesN)MZNOZFALSEZOFFZYESZTRUEZON�N�S�W�EZNWZSWZNEZSEZNSZEWZNSEWZCENTERZNONE�X�YZBOTHZLEFTZTOPZRIGHTZBOTTOMZRAISEDZSUNKENZFLATZRIDGEZGROOVEZSOLIDZ
HORIZONTALZVERTICALZNUMERICZCHARZWORDZBASELINEZINSIDEZOUTSIDEZSELZ	SEL_FIRSTZSEL_LASTZENDZINSERTZCURRENTZANCHORZALLZNORMALZDISABLEDZACTIVEZHIDDENZCASCADEZCHECKBUTTONZCOMMANDZRADIOBUTTONZ	SEPARATORZSINGLEZBROWSEZMULTIPLEZEXTENDEDZDOTBOXZ	UNDERLINEZPIESLICEZCHORDZARCZFIRSTZLASTZBUTTZ
PROJECTINGZROUNDZBEVELZMITERZMOVETOZSCROLLZUNITSZPAGES�rr�)/usr/lib64/python3.8/tkinter/constants.py�<module>s�colorchooser.cpython-38.opt-2.pyc000064400000002103151732766100012641 0ustar00U

e5dA
�@s>ddlmZGdd�de�Zd	dd�Zedkr:ede��dS)
�)�Dialogc@s eZdZdZdd�Zdd�ZdS)�ChooserZtk_chooseColorcCs@z&|jd}t|t�r$d||jd<Wntk
r:YnXdS)N�initialcolorz
#%02x%02x%02x)�options�
isinstance�tuple�KeyError)�self�color�r�,/usr/lib64/python3.8/tkinter/colorchooser.py�_fixoptions!s

zChooser._fixoptionscCs>|rt|�sdS|�|�\}}}|d|d|dft|�fS)N)NN�)�strZ	winfo_rgb)r	Zwidget�result�r�g�brrr�
_fixresult.szChooser._fixresultN)�__name__�
__module__�__qualname__Zcommandr
rrrrrrs
rNcKs"|r|��}||d<tf|���S)Nr)�copyrZshow)r
rrrr�askcolorBsr�__main__r
)N)Ztkinter.commondialogrrrr�printrrrr�<module>s3
dnd.cpython-38.opt-1.pyc000064400000026000151732766100010706 0ustar00U

e5d�,�@sXdZddlZdd�ZGdd�d�ZGdd�d�ZGd	d
�d
�Zdd�Zed
krTe�dS)aFDrag-and-drop support for Tkinter.

This is very preliminary.  I currently only support dnd *within* one
application, between different windows (or within the same window).

I am trying to make this as generic as possible -- not dependent on
the use of a particular widget or icon type, etc.  I also hope that
this will work with Pmw.

To enable an object to be dragged, you must create an event binding
for it that starts the drag-and-drop process. Typically, you should
bind <ButtonPress> to a callback function that you write. The function
should call Tkdnd.dnd_start(source, event), where 'source' is the
object to be dragged, and 'event' is the event that invoked the call
(the argument to your callback function).  Even though this is a class
instantiation, the returned instance should not be stored -- it will
be kept alive automatically for the duration of the drag-and-drop.

When a drag-and-drop is already in process for the Tk interpreter, the
call is *ignored*; this normally averts starting multiple simultaneous
dnd processes, e.g. because different button callbacks all
dnd_start().

The object is *not* necessarily a widget -- it can be any
application-specific object that is meaningful to potential
drag-and-drop targets.

Potential drag-and-drop targets are discovered as follows.  Whenever
the mouse moves, and at the start and end of a drag-and-drop move, the
Tk widget directly under the mouse is inspected.  This is the target
widget (not to be confused with the target object, yet to be
determined).  If there is no target widget, there is no dnd target
object.  If there is a target widget, and it has an attribute
dnd_accept, this should be a function (or any callable object).  The
function is called as dnd_accept(source, event), where 'source' is the
object being dragged (the object passed to dnd_start() above), and
'event' is the most recent event object (generally a <Motion> event;
it can also be <ButtonPress> or <ButtonRelease>).  If the dnd_accept()
function returns something other than None, this is the new dnd target
object.  If dnd_accept() returns None, or if the target widget has no
dnd_accept attribute, the target widget's parent is considered as the
target widget, and the search for a target object is repeated from
there.  If necessary, the search is repeated all the way up to the
root widget.  If none of the target widgets can produce a target
object, there is no target object (the target object is None).

The target object thus produced, if any, is called the new target
object.  It is compared with the old target object (or None, if there
was no old target widget).  There are several cases ('source' is the
source object, and 'event' is the most recent event object):

- Both the old and new target objects are None.  Nothing happens.

- The old and new target objects are the same object.  Its method
dnd_motion(source, event) is called.

- The old target object was None, and the new target object is not
None.  The new target object's method dnd_enter(source, event) is
called.

- The new target object is None, and the old target object is not
None.  The old target object's method dnd_leave(source, event) is
called.

- The old and new target objects differ and neither is None.  The old
target object's method dnd_leave(source, event), and then the new
target object's method dnd_enter(source, event) is called.

Once this is done, the new target object replaces the old one, and the
Tk mainloop proceeds.  The return value of the methods mentioned above
is ignored; if they raise an exception, the normal exception handling
mechanisms take over.

The drag-and-drop processes can end in two ways: a final target object
is selected, or no final target object is selected.  When a final
target object is selected, it will always have been notified of the
potential drop by a call to its dnd_enter() method, as described
above, and possibly one or more calls to its dnd_motion() method; its
dnd_leave() method has not been called since the last call to
dnd_enter().  The target is notified of the drop by a call to its
method dnd_commit(source, event).

If no final target object is selected, and there was an old target
object, its dnd_leave(source, event) method is called to complete the
dnd sequence.

Finally, the source object is notified that the drag-and-drop process
is over, by a call to source.dnd_end(target, event), specifying either
the selected target object, or None if no target object was selected.
The source object can use this to implement the commit action; this is
sometimes simpler than to do it in the target's dnd_commit().  The
target's dnd_commit() method could then simply be aliased to
dnd_leave().

At any time during a dnd sequence, the application can cancel the
sequence by calling the cancel() method on the object returned by
dnd_start().  This will call dnd_leave() if a target is currently
active; it will never call dnd_commit().

�NcCst||�}|jr|SdSdS�N)�
DndHandler�root)�source�event�h�r�#/usr/lib64/python3.8/tkinter/dnd.py�	dnd_startls
r
c@sDeZdZdZdd�Zdd�Zdd�Zdd	�Zdd
d�Zdd
d�Z	dS)rNcCs�|jdkrdS|j��}z|jWdStk
rD||_||_YnX||_d|_|j|_}|j|_	}d||f|_
|dp�d|_|�|j
|j
�|�d|j�d|d<dS)N�z<B%d-ButtonRelease-%d>�cursor��<Motion>Zhand2)Znum�widgetZ_root�_DndHandler__dnd�AttributeErrorrr�targetZinitial_button�initial_widget�release_pattern�save_cursor�bind�
on_release�	on_motion)�selfrrrZbuttonrrrr	�__init__zs$

zDndHandler.__init__cCs2|j}d|_|r.z|`Wntk
r,YnXdSr)rrr�rrrrr	�__del__�szDndHandler.__del__c	Cs�|j|j}}|j�||�}|j}d}|rbz
|j}Wntk
rHYnX|||�}|rZqb|j}q&|j}||kr�|r�|�	||�n,|r�d|_|�
||�|r�|�||�||_dSr)�x_root�y_rootrZwinfo_containingr�
dnd_acceptrZmasterr�
dnd_motion�	dnd_leave�	dnd_enter)	rr�x�yZ
target_widgetr�
new_target�attrZ
old_targetrrr	r�s.

zDndHandler.on_motioncCs|�|d�dS)N���finish�rrrrr	r�szDndHandler.on_releasecCs|�|d�dS)Nrr(r*rrr	�cancel�szDndHandler.cancelrc
Cs�|j}|j}|j}|j}zf|`|j�|j�|j�d�|j|d<d|_|_|_|_|r||rp|�	||�n|�
||�W5|�||�XdS)Nrr)rrrr�dnd_endrZunbindrr�
dnd_commitr!)rrZcommitrrrrrrr	r)�s
zDndHandler.finish)N)r)
�__name__�
__module__�__qualname__rrrrrr+r)rrrr	rvs	
rc@sNeZdZdd�Zddd�Zdd�Zdd	�Zd
d�Zdd
�Zdd�Z	dd�Z
dS)�IconcCs||_d|_|_|_dSr)�name�canvas�label�id)rr2rrr	r�sz
Icon.__init__�
cCs�||jkr |j�|j||�dS|jr.|��|s6dStj||jddd�}|j|||dd�}||_||_||_|�	d|j
�dS)N�Zraised)�textZborderwidthZreliefZnw)ZwindowZanchorz
<ButtonPress>)r3�coordsr5�detach�tkinterZLabelr2Z
create_windowr4r�press)rr3r#r$r4r5rrr	�attach�s 

�zIcon.attachcCsB|j}|sdS|j}|j}d|_|_|_|�|�|��dSr)r3r5r4�deleteZdestroy)rr3r5r4rrr	r:�s
zIcon.detachcCs4t||�r0|j|_|j|_|j�|j�\|_|_	dSr)
r
r#�x_offr$�y_offr3r9r5�x_orig�y_origr*rrr	r<�s
z
Icon.presscCs(|�|j|�\}}|j�|j||�dSr)�wherer3r9r5)rrr#r$rrr	�move�sz	Icon.movecCs|j�|j|j|j�dSr)r3r9r5rArB)rrrr	�putback�szIcon.putbackcCs8|��}|��}|j|}|j|}||j||jfSr)Zwinfo_rootxZwinfo_rootyrrr?r@)rr3rZx_orgZy_orgr#r$rrr	rC�s


z
Icon.wherecCsdSrr)rrrrrr	r,szIcon.dnd_endN)r6r6)r.r/r0rr=r:r<rDrErCr,rrrr	r1�s


r1c@s<eZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
S)�TestercCs>t�|�|_tj|jddd�|_|jjddd�|j|j_dS)N�d)�widthZheightZbothr')Zfill�expand)r;ZToplevel�topZCanvasr3�packrrrrr	rszTester.__init__cCs|Srr�rrrrrr	rszTester.dnd_acceptcCsp|j��|�|j|�\}}|j�|j�\}}}}||||}	}
|j�||||	||
�|_|�||�dSr)r3�	focus_setrC�bboxr5Zcreate_rectangle�dndidr )rrrr#r$�x1�y1�x2�y2ZdxZdyrrr	r"s
zTester.dnd_enterc	CsF|�|j|�\}}|j�|j�\}}}}|j�|j||||�dSr)rCr3rNrOrD)	rrrr#r$rPrQrRrSrrr	r szTester.dnd_motioncCs"|j��|j�|j�d|_dSr)rJrMr3r>rOrLrrr	r!$s
zTester.dnd_leavecCs2|�||�|�|j|�\}}|�|j||�dSr)r!rCr3r=)rrrr#r$rrr	r-)szTester.dnd_commitN)	r.r/r0rrr"r r!r-rrrr	rFsrFcCs�t��}|�d�tj|jdd���t|�}|j�d�t|�}|j�d�t|�}|j�d�td�}td�}td	�}|�	|j
�|�	|j
�|�	|j
�|��dS)
Nz+1+1ZQuit)Zcommandr8z+1+60z+120+60z+240+60ZICON1ZICON2ZICON3)r;ZTkZgeometryZButton�quitrKrFrJr1r=r3Zmainloop)r�t1�t2Zt3Zi1Zi2Zi3rrr	�test/s 
rW�__main__)�__doc__r;r
rr1rFrWr.rrrr	�<module>sf
Y=#font.cpython-38.opt-1.pyc000064400000014241151732766100011113 0ustar00U

e5d@�@szdZddlZddlZdZdZdZdZdd�ZGd	d
�d
�Zd dd�Z	d!d
d�Z
edk�rve��Z
edded�Zee���ee�d��ee�d��ee���ee�d��ee�d��ee
��ee�d�e�d��eeje
d��edd�Zee�d�ejde
d��eje
ded�Ze��eje
de
jd�Ze��eedd���Zejed�ejed�e��dS)"z0.9�NZnormalZroman�boldZitaliccCst|dd�S)zFGiven the name of a tk named font, returns a Font representation.
    T)�name�exists)�Font�r�r�$/usr/lib64/python3.8/tkinter/font.py�
nametofontsr	c@s�eZdZdZe�d�Zdd�Zdd�Zdd�Z	d#dd�Z
d
d�Zdd�Zdd�Z
dd�Zdd�Zdd�Zd$dd�Zdd�Zdd�ZeZd%dd �Zd!d"�Zd	S)&ra�Represents a named font.

    Constructor options are:

    font -- font specifier (name, system font, or (family, size, style)-tuple)
    name -- name to use for this font configuration (defaults to a unique name)
    exists -- does a named font by this name already exist?
       Creates a new named font if False, points to the existing font if True.
       Raises _tkinter.TclError if the assertion is false.

       the following are ignored if font is specified:

    family -- font 'family', e.g. Courier, Times, Helvetica
    size -- font size in points
    weight -- font thickness: NORMAL, BOLD
    slant -- font slant: ROMAN, ITALIC
    underline -- font underlining: false (0), true (1)
    overstrike -- font strikeout: false (0), true (1)

    �cCs:g}|��D]$\}}|�d|�|�t|��qt|�S�N�-)�items�append�str�tuple)�self�kw�options�k�vrrr�_set1s
z	Font._setcCs$g}|D]}|�d|�qt|�Sr)rr)r�argsrrrrr�_get8sz	Font._getcCs:i}tdt|�d�D] }||d|||dd�<q|S)Nr�r
)�range�len)rrr�irrr�_mkdict>szFont._mkdictNFcKs�|st�d�}t|d|�}|r4|�|�dd|��}n
|�|�}|sTdtt|j��}||_	|r�d|_
|j	|�|�dd��kr�tj�d|j	f��|r�|jdd|j	f|��n|jdd	|j	f|��d
|_
||_
|j|_|j|_dS)Nzuse font�tk�font�actualF�namesz$named font %s does not already exist�	configureZcreateT)�tkinter�_get_default_root�getattr�	splitlist�callrr�next�counterr�delete_fontZ_tkinterZTclError�_tk�_split�_call)r�rootrrrrrrrr�__init__Ds,


�z
Font.__init__cCs|jS�Nr�rrrr�__str__cszFont.__str__cCs&t|t�stS|j|jko$|j|jkSr0)�
isinstancer�NotImplementedrr+)r�otherrrr�__eq__fs
zFont.__eq__cCs
|�|�Sr0)�cget)r�keyrrr�__getitem__kszFont.__getitem__cCs|jf||i�dSr0)r")rr8�valuerrr�__setitem__nszFont.__setitem__cCs4z|jr|�dd|j�Wntk
r.YnXdS)Nr�delete)r*r-r�	Exceptionr1rrr�__del__qs
zFont.__del__cCst|jf|���S)z*Return a distinct copy of the current font)rr+r r1rrr�copyxsz	Font.copycCs^d}|rd|f}|r8|d|f}|jdd|jf|��S|�|�|jdd|jf|����SdS)zReturn actual font attributesr�
-displayofrrr N)r-rrr,)r�option�	displayofrrrrr |s�zFont.actualcCs|�dd|jd|�S)zGet font attributer�configr)r-r)rrArrrr7�sz	Font.cgetc	KsB|r"|jdd|jf|�|���n|�|�|�dd|j���SdS)zModify font attributesrrCN)r-rrrr,)rrrrrrC�s��zFont.configcCs2|f}|rd||f}|j�|jdd|jf|���S)zReturn text widthr@r�measure)r+�getintr-r)r�textrBrrrrrD�s
zFont.measurecOs�d}|�dd�}|rd|f}|rL||�|�}|j�|jdd|jf|���S|�|jdd|jf|���}i}tdt|�d�D](}|j�||d	�|||d	d�<q||SdS)
z}Return font metrics.

        For best performance, create a dummy widget
        using this font before calling this method.rrBNr@r�metricsrrr
)	�poprr+rEr-rr,rr)rrrrrB�resrrrrrG�s�&zFont.metrics)NNNF)NN)N)�__name__�
__module__�__qualname__�__doc__�	itertools�countr)rrrr/r2r6r9r;r>r?r r7rCr"rDrGrrrrrs$


	
rcCs6|st�d�}d}|rd|f}|j�|jjd|���S)zGet font families (as a tuple)zuse font.families()rr@r�families)rrP�r#r$rr&r')r.rBrrrrrP�s
rPcCs$|st�d�}|j�|j�dd��S)z'Get names of defined fonts (as a tuple)zuse font.names()rr!rQ)r.rrrr!�s
r!�__main__�times�)�family�size�weightrUrWZhelloZ	linespace)rB)ZCourier�r)rzHello, world)rFrzQuit!)rFZcommandr)rW)NN)N)�__version__rNr#ZNORMALZROMANZBOLDZITALICr	rrPr!rJZTkr.�f�printr rCr7rDrGZLabel�wZpackZButtonZdestroyr?ZfbZmainlooprrrr�<module>sB






font.cpython-38.pyc000064400000014241151732766100010154 0ustar00U

e5d@�@szdZddlZddlZdZdZdZdZdd�ZGd	d
�d
�Zd dd�Z	d!d
d�Z
edk�rve��Z
edded�Zee���ee�d��ee�d��ee���ee�d��ee�d��ee
��ee�d�e�d��eeje
d��edd�Zee�d�ejde
d��eje
ded�Ze��eje
de
jd�Ze��eedd���Zejed�ejed�e��dS)"z0.9�NZnormalZroman�boldZitaliccCst|dd�S)zFGiven the name of a tk named font, returns a Font representation.
    T)�name�exists)�Font�r�r�$/usr/lib64/python3.8/tkinter/font.py�
nametofontsr	c@s�eZdZdZe�d�Zdd�Zdd�Zdd�Z	d#dd�Z
d
d�Zdd�Zdd�Z
dd�Zdd�Zdd�Zd$dd�Zdd�Zdd�ZeZd%dd �Zd!d"�Zd	S)&ra�Represents a named font.

    Constructor options are:

    font -- font specifier (name, system font, or (family, size, style)-tuple)
    name -- name to use for this font configuration (defaults to a unique name)
    exists -- does a named font by this name already exist?
       Creates a new named font if False, points to the existing font if True.
       Raises _tkinter.TclError if the assertion is false.

       the following are ignored if font is specified:

    family -- font 'family', e.g. Courier, Times, Helvetica
    size -- font size in points
    weight -- font thickness: NORMAL, BOLD
    slant -- font slant: ROMAN, ITALIC
    underline -- font underlining: false (0), true (1)
    overstrike -- font strikeout: false (0), true (1)

    �cCs:g}|��D]$\}}|�d|�|�t|��qt|�S�N�-)�items�append�str�tuple)�self�kw�options�k�vrrr�_set1s
z	Font._setcCs$g}|D]}|�d|�qt|�Sr)rr)r�argsrrrrr�_get8sz	Font._getcCs:i}tdt|�d�D] }||d|||dd�<q|S)Nr�r
)�range�len)rrr�irrr�_mkdict>szFont._mkdictNFcKs�|st�d�}t|d|�}|r4|�|�dd|��}n
|�|�}|sTdtt|j��}||_	|r�d|_
|j	|�|�dd��kr�tj�d|j	f��|r�|jdd|j	f|��n|jdd	|j	f|��d
|_
||_
|j|_|j|_dS)Nzuse font�tk�font�actualF�namesz$named font %s does not already exist�	configureZcreateT)�tkinter�_get_default_root�getattr�	splitlist�callrr�next�counterr�delete_fontZ_tkinterZTclError�_tk�_split�_call)r�rootrrrrrrrr�__init__Ds,


�z
Font.__init__cCs|jS�Nr�rrrr�__str__cszFont.__str__cCs&t|t�stS|j|jko$|j|jkSr0)�
isinstancer�NotImplementedrr+)r�otherrrr�__eq__fs
zFont.__eq__cCs
|�|�Sr0)�cget)r�keyrrr�__getitem__kszFont.__getitem__cCs|jf||i�dSr0)r")rr8�valuerrr�__setitem__nszFont.__setitem__cCs4z|jr|�dd|j�Wntk
r.YnXdS)Nr�delete)r*r-r�	Exceptionr1rrr�__del__qs
zFont.__del__cCst|jf|���S)z*Return a distinct copy of the current font)rr+r r1rrr�copyxsz	Font.copycCs^d}|rd|f}|r8|d|f}|jdd|jf|��S|�|�|jdd|jf|����SdS)zReturn actual font attributesr�
-displayofrrr N)r-rrr,)r�option�	displayofrrrrr |s�zFont.actualcCs|�dd|jd|�S)zGet font attributer�configr)r-r)rrArrrr7�sz	Font.cgetc	KsB|r"|jdd|jf|�|���n|�|�|�dd|j���SdS)zModify font attributesrrCN)r-rrrr,)rrrrrrC�s��zFont.configcCs2|f}|rd||f}|j�|jdd|jf|���S)zReturn text widthr@r�measure)r+�getintr-r)r�textrBrrrrrD�s
zFont.measurecOs�d}|�dd�}|rd|f}|rL||�|�}|j�|jdd|jf|���S|�|jdd|jf|���}i}tdt|�d�D](}|j�||d	�|||d	d�<q||SdS)
z}Return font metrics.

        For best performance, create a dummy widget
        using this font before calling this method.rrBNr@r�metricsrrr
)	�poprr+rEr-rr,rr)rrrrrB�resrrrrrG�s�&zFont.metrics)NNNF)NN)N)�__name__�
__module__�__qualname__�__doc__�	itertools�countr)rrrr/r2r6r9r;r>r?r r7rCr"rDrGrrrrrs$


	
rcCs6|st�d�}d}|rd|f}|j�|jjd|���S)zGet font families (as a tuple)zuse font.families()rr@r�families)rrP�r#r$rr&r')r.rBrrrrrP�s
rPcCs$|st�d�}|j�|j�dd��S)z'Get names of defined fonts (as a tuple)zuse font.names()rr!rQ)r.rrrr!�s
r!�__main__�times�)�family�size�weightrUrWZhelloZ	linespace)rB)ZCourier�r)rzHello, world)rFrzQuit!)rFZcommandr)rW)NN)N)�__version__rNr#ZNORMALZROMANZBOLDZITALICr	rrPr!rJZTkr.�f�printr rCr7rDrGZLabel�wZpackZButtonZdestroyr?ZfbZmainlooprrrr�<module>sB






commondialog.cpython-38.pyc000064400000002132151732766100011652 0ustar00U

e5d��@sddlTGdd�d�ZdS)�)�*c@s2eZdZdZd
dd�Zdd�Zdd�Zdd	�ZdS)�DialogNcKs|s|�d�}||_||_dS)N�parent)�get�master�options)�selfrr�r	�,/usr/lib64/python3.8/tkinter/commondialog.py�__init__s
zDialog.__init__cCsdS�Nr	)rr	r	r
�_fixoptionsszDialog._fixoptionscCs|Srr	)rZwidget�resultr	r	r
�
_fixresultszDialog._fixresultcKs||��D]\}}||j|<q|��t|j�}z,|jj|jf|�	|j���}|�
||�}W5z|��WnYnXX|Sr)�itemsrr
ZFramerZdestroyZtkZcall�commandZ_optionsr)rr�k�v�w�sr	r	r
�shows
zDialog.show)N)�__name__�
__module__�__qualname__rrr
rrr	r	r	r
rs

rN)Ztkinterrr	r	r	r
�<module>sfiledialog.cpython-38.pyc000064400000030021151732766100011277 0ustar00U

e5d�8�@sdZddlTddlmZddlmZddlmZddlZddlZiZ	Gdd�d�Z
Gd	d
�d
e
�ZGdd�de
�ZGd
d�dej�Z
Gdd�de
�ZGdd�de
�ZGdd�dej�Zdd�Zdd�Zdd�Zd(dd�Zd)dd�Zd*d!d"�Zd#d$�Zd%d&�Zed'k�re�dS)+aUFile selection dialog classes.

Classes:

- FileDialog
- LoadFileDialog
- SaveFileDialog

This module also presents tk common file dialogues, it provides interfaces
to the native file dialogues available in Tk 4.2 and newer, and the
directory dialogue available in Tk 8.3 and newer.
These interfaces were written by Fredrik Lundh, May 1997.
�)�*)�Dialog)�commondialog)�
_setup_dialogNc@s�eZdZdZdZd$dd�Zejdddfdd	�Zd%d
d�Z	dd
�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zd&dd�Zdd�Zdd�Zd'dd�Zd d!�Zd"d#�ZdS)(�
FileDialoga�Standard file selection dialog -- no checks on selected file.

    Usage:

        d = FileDialog(master)
        fname = d.go(dir_or_file, pattern, default, key)
        if fname is None: ...canceled...
        else: ...open file...

    All arguments to go() are optional.

    The 'key' argument specifies a key in the global dictionary
    'dialogstates', which keeps track of the values for the directory
    and pattern arguments, overriding the values passed in (it does
    not keep track of the default argument!).  If no key is specified,
    the dialog keeps no memory of previous state.  Note that memory is
    kept even when the dialog is canceled.  (All this emulates the
    behavior of the Macintosh file selection dialogs.)

    zFile Selection DialogNcCs�|dkr|j}||_d|_t|�|_|j�|�|j�|�t|j�t|j�|_|jj	t
td�t|j�|_
|j
j	t
td�|j
�d|j�t|j�|_|jj	ttd�|j�d|j�t|j�|_|jj	ttd�t|j�|_|jj	ttd�t|jd|jdfd�|_|jj	tttd�|j��}|j�|dd�|dd��|j�d	|j�|j�d
|j�|jj|jdfd�t|j�|_ |j j	t!td�t|jd|j dfd�|_"|j"j	t!ttd�|j j|j"dfd�|j"��}|j"�|dd�|dd��|j"�d	|j#�|j"�d
|j$�t%|jd
|j&d�|_'|j'j	t!d�t%|jd|jd�|_(|j(j	t!td�t%|jd|j)d�|_*|j*j	td�|j�+d|j)�|j�d|j)�|j�d|j)�dS)N)�side�fillz<Return>)�expandrr�set)ZexportselectionZyscrollcommand)rr	r�z<ButtonRelease-1>z<Double-ButtonRelease-1>Zyview)�commandZOK)�textr)rZFilter)rr	�CancelZWM_DELETE_WINDOWz<Alt-w>z<Alt-W>),�title�master�	directoryZToplevel�topZiconnamerZFrameZbotframeZpackZBOTTOM�XZEntry�	selectionZbind�ok_event�filterZTOP�filter_commandZmidframeZYESZBOTHZ	ScrollbarZfilesbarZRIGHT�YZListbox�filesZbindtags�files_select_event�files_double_eventZconfigZdirsbarZLEFT�dirs�dirs_select_event�dirs_double_eventZButton�
ok_commandZ	ok_buttonZ
filter_button�cancel_commandZ
cancel_buttonZprotocol)�selfrrZbtags�r"�*/usr/lib64/python3.8/tkinter/filedialog.py�__init__4st

�
 �
 ���zFileDialog.__init__r�cCs�|r|tkrt|\|_}n2tj�|�}tj�|�r<||_ntj�|�\|_}|�|j|�|�|�|�	�|j
��|j�
�|j��d|_|j��|r�|��\}}|jr�tj�|j�}||ft|<|j��|jS�N)�dialogstatesr�os�path�
expanduser�isdir�split�
set_filter�
set_selectionrrZ	focus_setrZwait_visibilityZgrab_set�howrZmainloop�
get_filter�dirnameZdestroy)r!Zdir_or_file�pattern�default�keyrr"r"r#�gots*





z
FileDialog.gocCs||_|j��dSr&)r/r�quit)r!r/r"r"r#r6�szFileDialog.quitcCs|��dSr&)r�r!�eventr"r"r#r�szFileDialog.dirs_double_eventcCs@|��\}}|j�d�}tj�tj�|j|��}|�||�dS�NZactive)	r0r�getr(r)�normpath�joinrr-)r!r8�dir�patZsubdirr"r"r#r�szFileDialog.dirs_select_eventcCs|��dSr&�rr7r"r"r#r�szFileDialog.files_double_eventcCs|j�d�}|�|�dSr9)rr:r.)r!r8�filer"r"r#r�szFileDialog.files_select_eventcCs|��dSr&r?r7r"r"r#r�szFileDialog.ok_eventcCs|�|���dSr&)r6�
get_selection�r!r"r"r#r�szFileDialog.ok_commandcCs&|��\}}zt�|�}Wn tk
r:|j��YdSX||_|�||�|��tj	g}g}|D]@}tj
�||�}tj
�|�r�|�
|�qft�||�rf|�
|�qf|j�dt�|D]}|j�t|�q�|j�dt�|D]}|j�t|�q�tj
�|���\}	}
|
tjk�rd}
|�|
�dS)Nrr%)r0r(�listdir�OSErrorr�bellrr-�sort�pardirr)r<r+�append�fnmatchr�delete�END�insertrr,rA�curdirr.)r!r8r=r>�namesZsubdirsZ
matchingfiles�name�fullname�head�tailr"r"r#r�s6
zFileDialog.filter_commandcCsN|j��}tj�|�}|dd�tjks4tj�|�rBtj�|d�}tj�|�S)N���r)	rr:r(r)r*�sepr+r<r,)r!rr"r"r#r0�s

zFileDialog.get_filtercCs|j��}tj�|�}|Sr&)rr:r(r)r*�r!r@r"r"r#rA�s
zFileDialog.get_selectioncCs|��dSr&)r6r7r"r"r#r �szFileDialog.cancel_commandcCs�tj�|�sPzt��}Wntk
r0d}YnX|rPtj�||�}tj�|�}|j�dt	�|j�
t	tj�|pttj|pzd��dS)Nrr)r(r)�isabs�getcwdrDr<r;rrJrKrLrM)r!r=r>�pwdr"r"r#r-�s
zFileDialog.set_filtercCs,|j�dt�|j�ttj�|j|��dS)Nr)rrJrKrLr(r)r<rrUr"r"r#r.�szFileDialog.set_selection)N)N)N)N)�__name__�
__module__�__qualname__�__doc__rr$r(rMr5r6rrrrrrrr0rAr r-r.r"r"r"r#rs"
@


rc@seZdZdZdZdd�ZdS)�LoadFileDialogz8File selection dialog which checks that the file exists.zLoad File Selection DialogcCs.|��}tj�|�s |j��n
|�|�dSr&)rAr(r)�isfilerrEr6rUr"r"r#r�szLoadFileDialog.ok_commandN�rYrZr[r\rrr"r"r"r#r]�sr]c@seZdZdZdZdd�ZdS)�SaveFileDialogz@File selection dialog which checks that the file may be created.zSave File Selection DialogcCs�|��}tj�|�rZtj�|�r.|j��dSt|jdd|fdddd�}|j	dkr�dSn*tj�
|�\}}tj�|�s�|j��dS|�|�dS)Nz Overwrite Existing File QuestionzOverwrite existing file %r?Z	questheadr)ZYesr)rr
Zbitmapr3Zstringsr)rAr(r)�existsr+rrErrZnumr,r6)r!r@�drQrRr"r"r#r�s&
�

zSaveFileDialog.ok_commandNr_r"r"r"r#r`�sr`c@seZdZdd�Zdd�ZdS)�_DialogcCs2zt|jd�|jd<Wntk
r,YnXdS)N�	filetypes)�tuple�options�KeyErrorrBr"r"r#�_fixoptions,sz_Dialog._fixoptionscCsR|rHz
|j}Wntk
r"YnXtj�|�\}}||jd<||jd<||_|S)N�
initialdirZinitialfile)�string�AttributeErrorr(r)r,rf�filename�r!�widget�resultr)r@r"r"r#�
_fixresult3s


z_Dialog._fixresultN)rYrZr[rhrpr"r"r"r#rc*srcc@seZdZdZdZdd�ZdS)�Open�Ask for a filename to openZtk_getOpenFilecCsxt|t�rBtdd�|D��}|r>tj�|d�\}}||jd<|S|j��sjd|jkrj|�||j�	|��St
�|||�S)NcSsg|]}t|d|��qS)rj)�getattr)�.0�rr"r"r#�
<listcomp>Nsz#Open._fixresult.<locals>.<listcomp>rri�multiple)�
isinstancerer(r)r,rfZtkZwantobjectsrpZ	splitlistrcrmr"r"r#rpKs

zOpen._fixresultN�rYrZr[r\rrpr"r"r"r#rqFsrqc@seZdZdZdZdS)�SaveAs�Ask for a filename to save asZtk_getSaveFileN)rYrZr[r\rr"r"r"r#rzZsrzc@seZdZdZdZdd�ZdS)�	DirectoryzAsk for a directoryZtk_chooseDirectorycCs8|r.z
|j}Wntk
r"YnX||jd<||_|S)Nri)rjrkrfr)r!rnror"r"r#rpfs

zDirectory._fixresultNryr"r"r"r#r|asr|cKstf|���S)rr�rq�show�rfr"r"r#�askopenfilenamewsr�cKstf|���S)r{)rzr~rr"r"r#�asksaveasfilename}sr�cKsd|d<tf|���S)ztAsk for multiple filenames to open

    Returns a list of filenames or empty list if
    cancel button selected
    rrwr}rr"r"r#�askopenfilenames�sr�rucKs tf|���}|rt||�SdS)z8Ask for a filename to open, and returned the opened fileN)rqr~�open��moderfrlr"r"r#�askopenfile�s
r�cKs4tf|�}|r0g}|D]}|�t||��q|}|S)z�Ask for multiple filenames and return the open file
    objects

    returns a list of open file objects or an empty list if
    cancel selected
    )r�rHr�)r�rfrZofilesrlr"r"r#�askopenfiles�s
r��wcKs tf|���}|rt||�SdS)z;Ask for a filename to save as, and returned the opened fileN)rzr~r�r�r"r"r#�
asksaveasfile�s
r�cKstf|���S)z-Ask for a directory, and return the file name)r|r~rr"r"r#�askdirectory�sr�c
	Cs�t�}|��t|�}|jdd�}t|�}|jdd�}t||�d}ddl}z&ddl}|�|j	d�|�
|j�}Wntt
fk
r�YnXtdgd�}zt|d	�}|��Wn$td
�t|��d�YnXtd|�|��t�}	td
|	�|��dS)zSimple test program.�test)r4zutf-8rNr%)z	all filesr)rdruzCould not open File: rr�Zsaveas)ZTkZwithdrawr]r5r`�print�sys�locale�	setlocale�LC_ALL�nl_langinfo�CODESET�ImportErrorrkr�r��close�exc_info�encoder�)
�root�fdZloadfileZsavefile�encr�r�Zopenfilename�fpZsaveasfilenamer"r"r#r��s2

r��__main__)ru)ru)r�)r\ZtkinterZtkinter.dialogrrZtkinter.simpledialogrr(rIr'rr]r`rcrqrzr|r�r�r�r�r�r�r�r�rYr"r"r"r#�<module>s2I9
	

	,
dialog.cpython-38.opt-1.pyc000064400000002702151732766100011403 0ustar00U

e5d��@srddlTddlmZdZGdd�de�Zdd�Zedkrned	d
ddeeii�Z	ed	d
d
de	j
eii�Ze	��d	S)�)�*)�	_cnfmergeZ	questheadc@s"eZdZdifdd�Zdd�ZdS)�DialogNc
Ks�t||f�}d|_t�|||�|j�|jjd|j|d|d|d|df|d���|_zt�	|�Wnt
k
r~YnXdS)NZ
__dialog__Z	tk_dialog�title�text�bitmap�default�strings)rZ
widgetName�Widget�_setupZtkZgetintZcallZ_w�num�destroyZTclError)�selfZmasterZcnf�kw�r�&/usr/lib64/python3.8/tkinter/dialog.py�__init__
s&���zDialog.__init__cCsdS)Nr)rrrrr
�zDialog.destroy)�__name__�
__module__�__qualname__rr
rrrrr	s
rcCs$tdddtddd��}t|j�dS)Nz
File ModifiedzzFile "Python.h" has been modified since the last time it was saved. Do you want to save it before exiting the application.r)z	Save FilezDiscard ChangeszReturn to Editor)rrrrr	)r�DIALOG_ICON�printr)�drrr�_tests�r�__main__NrZTestZcommandZQuit)
Ztkinterrrr
rrrZButtonZPack�t�quit�qZmainlooprrrr�<module>s$��tix.cpython-38.pyc000064400000233061151732766100010015 0ustar00U

e5d-,�@sLddlZddlZddlTddlmZddlZdZdZdZdZdZd	Z	d
Z
dZdZd
Z
dZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZGdd �d �Z Gd!d"�d"ej!e �Z!Gd#d$�d$�Z"ej#j$e"fej#_$Gd%d&�d&ej#�Z%Gd'd(�d(e%�Z&Gd)d*�d*�Z'Gd+d,�d,e%�Z(Gd-d.�d.e%�Z)Gd/d0�d0e%�Z*Gd1d2�d2e%�Z+Gd3d4�d4e%�Z,Gd5d6�d6e%�Z-Gd7d8�d8e%�Z.Gd9d:�d:e%�Z/Gd;d<�d<e%�Z0Gd=d>�d>e%�Z1Gd?d@�d@e%�Z2GdAdB�dBe%�Z3GdCdD�dDe%�Z4GdEdF�dFe%e5e6�Z7GdGdH�dHe%�Z8GdIdJ�dJe%�Z9GdKdL�dLe%�Z:GdMdN�dNe%�Z;GdOdP�dPe%�Z<GdQdR�dRe%�Z=GdSdT�dTe%�Z>GdUdV�dVe%�Z?GdWdX�dXe%�Z@GdYdZ�dZe%�ZAGd[d\�d\e%�ZBGd]d^�d^e%�ZCGd_d`�d`e%�ZDGdadb�dbe%�ZEGdcdd�dde%�ZFGdedf�dfe%�ZGGdgdh�dhe%�ZHGdidj�dje%�ZIGdkdl�dle%�ZJGdmdn�dne%�ZKGdodp�dpe%e5e6�ZLGdqdr�dre%�ZMGdsdt�dte%�ZNGdudv�dveOe&�ZPGdwdx�dxeQe&�ZRGdydz�dzeSe&�ZTGd{d|�d|eUe&�ZVGd}d~�d~eWe&�ZXGdd��d�eYe&�ZZGd�d��d�e[e&�Z\Gd�d��d�e]e&�Z^Gd�d��d�e_e&�Z`Gd�d��d�eae&�ZbGd�d��d�eDe&�ZcGd�d��d�e7e&�ZdGd�d��d�eCe&�ZeGd�d��d�eLe&�ZfGd�d��d�e*e&�ZgGd�d��d�e,e&�ZhGd�d��d�e.e&�ZiGd�d��d�e/e&�ZjGd�d��d�e2e&�ZkGd�d��d�e*e&�ZlGd�d��d�eKe&�ZmGd�d��d�e>e&�ZnGd�d��d�e@e&�Zod�d��Zpd�d��ZqGd�d��d�e%�ZrGd�d��d�e%e5e6�ZsGd�d��d�es�ZtdS)��N)�*)�	_cnfmerge�window�textZstatusZ	immediate�imageZ	imagetextZballoon�autoZ	acrosstop�asciiZcell�columnZ
decreasingZ
increasingZinteger�main�max�real�rowzs-regionzx-regionzy-region����� c@sVeZdZdZdd�Zdd�Zddd�Zdd	d
�Zdd�Zd
d�Z	dd�Z
ddd�ZdS)�
tixCommanda�The tix commands provide access to miscellaneous  elements
    of  Tix's  internal state and the Tix application context.
    Most of the information manipulated by these  commands pertains
    to  the  application  as a whole, or to a screen or
    display, rather than to a particular window.

    This is a mixin class, assumed to be mixed to Tkinter.Tk
    that supports the self.tk.call method.
    cCs|j�dd|�S)a�Tix maintains a list of directories under which
        the  tix_getimage  and tix_getbitmap commands will
        search for image files. The standard bitmap  directory
        is $TIX_LIBRARY/bitmaps. The addbitmapdir command
        adds directory into this list. By  using  this
        command, the  image  files  of an applications can
        also be located using the tix_getimage or tix_getbitmap
        command.
        �tixZaddbitmapdir��tk�call)�selfZ	directory�r�#/usr/lib64/python3.8/tkinter/tix.py�tix_addbitmapdirRs
ztixCommand.tix_addbitmapdircCs|j�dd|�S)z�Returns  the  current  value  of the configuration
        option given by option. Option may be  any  of  the
        options described in the CONFIGURATION OPTIONS section.
        r�cgetr�r�optionrrr�tix_cget^sztixCommand.tix_cgetNcKsd|rt||f�}n|rt|�}|dkr2|�dd�St|t�rN|�ddd|�S|j�d|�|��S)a�Query or modify the configuration options of the Tix application
        context. If no option is specified, returns a dictionary all of the
        available options.  If option is specified with no value, then the
        command returns a list describing the one named option (this list
        will be identical to the corresponding sublist of the value
        returned if no option is specified).  If one or more option-value
        pairs are specified, then the command modifies the given option(s)
        to have the given value(s); in this case the command returns an
        empty string. Option may be any of the configuration options.
        Nr�	configure�-)rr )r�
_getconfigure�
isinstance�strZ_getconfigure1rr�_options�r�cnf�kwrrr�
tix_configurees
ztixCommand.tix_configurecCs*|dk	r|j�dd|�S|j�dd�SdS)a�Returns the file selection dialog that may be shared among
        different calls from this application.  This command will create a
        file selection dialog widget when it is called the first time. This
        dialog will be returned by all subsequent calls to tix_filedialog.
        An optional dlgclass parameter can be passed to specified what type
        of file selection dialog widget is desired. Possible options are
        tix FileSelectDialog or tixExFileSelectDialog.
        NrZ
filedialogr)rZdlgclassrrr�tix_filedialog{s	ztixCommand.tix_filedialogcCs|j�dd|�S)a�Locates a bitmap file of the name name.xpm or name in one of the
        bitmap directories (see the tix_addbitmapdir command above).  By
        using tix_getbitmap, you can avoid hard coding the pathnames of the
        bitmap files in your application. When successful, it returns the
        complete pathname of the bitmap file, prefixed with the character
        '@'.  The returned value can be used to configure the -bitmap
        option of the TK and Tix widgets.
        rZ	getbitmapr�r�namerrr�
tix_getbitmap�s	ztixCommand.tix_getbitmapcCs|j�dd|�S)a�Locates an image file of the name name.xpm, name.xbm or name.ppm
        in one of the bitmap directories (see the addbitmapdir command
        above). If more than one file with the same name (but different
        extensions) exist, then the image type is chosen according to the
        depth of the X display: xbm images are chosen on monochrome
        displays and color images are chosen on color displays. By using
        tix_ getimage, you can avoid hard coding the pathnames of the
        image files in your application. When successful, this command
        returns the name of the newly created image, which can be used to
        configure the -image option of the Tk and Tix widgets.
        rZgetimagerr+rrr�tix_getimage�sztixCommand.tix_getimagecCs|j�ddd|�S)a@Gets  the options  maintained  by  the  Tix
        scheme mechanism. Available options include:

            active_bg       active_fg      bg
            bold_font       dark1_bg       dark1_fg
            dark2_bg        dark2_fg       disabled_fg
            fg              fixed_font     font
            inactive_bg     inactive_fg    input1_bg
            input2_bg       italic_font    light1_bg
            light1_fg       light2_bg      light2_fg
            menu_font       output1_bg     output2_bg
            select_bg       select_fg      selector
            rr�getrr+rrr�tix_option_get�sztixCommand.tix_option_getcCs2|dk	r|j�dd|||�S|j�dd||�SdS)a�Resets the scheme and fontset of the Tix application to
        newScheme and newFontSet, respectively.  This affects only those
        widgets created after this call. Therefore, it is best to call the
        resetoptions command before the creation of any widgets in a Tix
        application.

        The optional parameter newScmPrio can be given to reset the
        priority level of the Tk options set by the Tix schemes.

        Because of the way Tk handles the X option database, after Tix has
        been has imported and inited, it is not possible to reset the color
        schemes and font sets using the tix config command.  Instead, the
        tix_resetoptions command must be used.
        NrZresetoptionsr)rZ	newSchemeZ
newFontSetZ
newScmPriorrr�tix_resetoptions�sztixCommand.tix_resetoptions)N)N)N)�__name__�
__module__�__qualname__�__doc__rrr)r*r-r.r0r1rrrrrGs


rc@s"eZdZdZddd�Zdd�ZdS)	�Tkz{Toplevel widget of Tix which represents mostly the main window
    of an application. It has an associated Tcl interpreter.N�TixcCsbtj�||||�tj�d�}|j�d�|dk	rR|j�d|�|j�d|�|j�d�dS)NZTIX_LIBRARYz<global auto_path; lappend auto_path [file dir [info nameof]]z(global auto_path; lappend auto_path {%s}z,global tcl_pkgPath; lappend tcl_pkgPath {%s}zpackage require Tix)�tkinterr6�__init__�os�environr/r�eval)rZ
screenNameZbaseNameZ	classNameZtixlibrrrr9�szTk.__init__cCs|�dd�tj�|�dS)NZWM_DELETE_WINDOW�)Zprotocolr8r6�destroy�rrrrr>�sz
Tk.destroy)NNr7�r2r3r4r5r9r>rrrrr6�s
r6c@sTeZdZdZifdd�ZeZdd�Zdd�Zdd	�Zddd�Z	ddd�Z
dd�Zd
S)�Formz�The Tix Form geometry manager

    Widgets can be arranged by specifying attachments to other widgets.
    See Tix documentation for complete detailscKs"|jjd|jf|�||���dS)N�tixForm�rr�_wr%r&rrr�config�szForm.configcCst�|||i�dS�N)rA�form�r�key�valuerrr�__setitem__�szForm.__setitem__cCs|j�dd|j�S)NrB�check�rrrDr?rrrrL�sz
Form.checkcCs|j�dd|j�dS)NrB�forgetrMr?rrrrN�szForm.forgetrcCs`|sJ|sJ|j�dd|j�}|j�|�}d}|D]}||j�|�f}q.|S|j�dd|j||�S)NrB�gridr)rrrD�	splitlistZgetint)rZxsizeZysize�x�y�zrrrrO�sz	Form.gridNcCs>|s|j�dd|j�S|ddkr*d|}|j�dd|j|�S)NrB�inforr!rMrrrrrT�s
z	Form.infocs(�fdd��j��j�dd�j��D�S)Ncsg|]}��|��qSr)�
_nametowidget��.0rQr?rr�
<listcomp>szForm.slaves.<locals>.<listcomp>rB�slaves�rrPrrDr?rr?rrYs
���zForm.slaves)rr)N)r2r3r4r5rErGrKrLrNrOrTrYrrrrrA�s


rAc@sreZdZdZdddiifdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zidfdd�Zdd�Z
dS)�	TixWidgetaQA TixWidget class is used to package all (or most) Tix widgets.

    Widget initialization is extended in two ways:
       1) It is possible to give a list of options which must be part of
       the creation command (so called Tix 'static' options). These cannot be
       given as a 'config' command later.
       2) It is possible to give the name of an existing TK widget. These are
       child widgets created automatically by a Tix mega-widget. The Tk call
       to create these widgets is therefore bypassed in TixWidget.__init__

    Both options are for use by subclasses only.
    Nc	Cs�|rt||f�}nt|�}d}|r.|�d�ndg}t|���D]&\}}||kr@|d||f}||=q@||_t�|||�|r�|jj||j	f|��|r�t�
||�i|_dS)Nr�optionsr!)r�append�list�items�
widgetName�Widget�_setuprrrDrE�subwidget_list)	r�masterr`Zstatic_optionsr'r(Zextra�k�vrrrr9s$zTixWidget.__init__cCs ||jkr|j|St|��dSrF)rc�AttributeErrorr+rrr�__getattr__Gs

zTixWidget.__getattr__cCs|j�d|j|�dS)z1Set a variable without calling its action routineZtixSetSilentNrM)rrJrrr�
set_silentLszTixWidget.set_silentcCsD|�|�}|s$td|d|j��|t|j�dd�}|�|�S)zSReturn the named subwidget (which must have been created by
        the sub-class).z
Subwidget z not child of �N)�_subwidget_name�TclError�_name�lenrDrU)rr,�nrrr�	subwidgetPs

zTixWidget.subwidgetcCsZ|��}|sgSg}|D]<}|t|j�dd�}z|�|�|��WqYqXq|S)zReturn all subwidgets.rjN)�_subwidget_namesrnrDr]rU)r�namesZretlistr,rrr�subwidgets_allZszTixWidget.subwidgets_allcCs0z|j�|jd|�WStk
r*YdSXdS)z7Get a subwidget name (returns a String, not a Widget !)rpN)rrrDrlr+rrrrkiszTixWidget._subwidget_namecCs<z |j�|jdd�}|j�|�WStk
r6YdSXdS)z"Return the name of all subwidgets.Z
subwidgetsz-allN)rrrDrPrl)rrQrrrrqps
zTixWidget._subwidget_namescCs\|dkrdSt|t�st|�}t|t�s0t|�}|��}|D]}|j�|dd||�q<dS)z8Set configuration options for all subwidgets (and self).r=Nr r!)r#r$�reprrqrr)rrrJrrr,rrr�
config_allxs

zTixWidget.config_allcKst|s|}|r|rt||f�}n|r&|}d}|��D]*\}}t|�rL|�|�}|d||f}q2|j�dd|f|�S)Nrr!r�create)rr_�callable�	_registerrr)rZimgtyper'rdr(r\rerfrrr�image_create�s
zTixWidget.image_createcCs.z|j�dd|�Wntk
r(YnXdS)Nr�delete)rrrl)rZimgnamerrr�image_delete�szTixWidget.image_delete)r2r3r4r5r9rhrirprsrkrqruryr{rrrrr[
s�
-
r[c@s"eZdZdZddd�Zdd�ZdS)	�TixSubWidgetz�Subwidget class.

    This is used to mirror child widgets automatically created
    by Tix/Tk as part of a mega-widget in Python (which is not informed
    of this)rjc
Cs�|rD|�|�}z$|t|j�dd�}|�d�}Wng}YnX|s`t�||ddd|i�n�|}tt|�d�D]V}d�|d|d��}	z|�|	�}
|
}Wqtt	k
r�t
|||ddd�}YqtXqt|r�|d}t�||ddd|i�||_dS)Nrj�.r,r)�destroy_physically�check_intermediate���)rkrnrD�splitr[r9�range�joinrU�KeyErrorr|r~)rrdr,r~r�pathZplist�parent�iro�wrrrr9�s0



�zTixSubWidget.__init__cCsjt|j���D]}|��q|j|jjkr6|jj|j=|j|jjkrP|jj|j=|jrf|j�	d|j
�dS)Nr>)r^�children�valuesr>rmrdrcr~rrrD�r�crrrr>�s
zTixSubWidget.destroyN)rjrjr@rrrrr|�s
�
 r|c@sVeZdZdZifdd�dd�Zdd�Zdd	�Zd
d�Zdd
�Zifdd�Z	dd�Z
dS)�DisplayStylezRDisplayStyle - handle configuration options shared by
    (multiple) Display ItemsN)rdcKs\|s2d|kr|d}nd|kr(|d}n
t�d�}|j|_|jjd|f|�||���|_dS)NZ	refwindowzcreate display styleZtixDisplayStyle)r8Z_get_default_rootrrr%�	stylename)r�itemtyper'rdr(rrrr9�s



�zDisplayStyle.__init__cCs|jSrF)r�r?rrr�__str__�szDisplayStyle.__str__cCsH|r|rt||f�}n|r|}d}|��D]\}}|d||f}q*|S)Nrr!)rr_)rr'r(Zoptsrerfrrrr%�szDisplayStyle._optionscCs|j�|jd�dS�Nrz�rrr�r?rrrrz�szDisplayStyle.deletecCs|j�|jdd||�dS)Nr �-%sr�rHrrrrK�szDisplayStyle.__setitem__cKs|j|jdf|�||���S)Nr )r"r�r%r&rrrrE�s�
�zDisplayStyle.configcCs|j�|jdd|�S)Nrr�r�)rrIrrr�__getitem__�szDisplayStyle.__getitem__)r2r3r4r5r9r�r%rzrKrEr�rrrrr��s
r�c@s2eZdZdZdifdd�Zifdd�Zdd�ZdS)	�BalloonzBalloon help widget.

    Subwidget       Class
    ---------       -----
    label           Label
    message         MessageNcKsNdddddg}t�||d|||�t|ddd	�|jd<t|d
dd	�|jd
<dS)Nr\ZinstallcolormapZinitwaitZ	statusbarZcursorZ
tixBalloon�labelr�r~�message�r[r9�_dummyLabelrc�rrdr'r(Zstaticrrrr9	s���zBalloon.__init__cKs&|jj|jd|jf|�||���dS)zkBind balloon widget to another.
        One balloon widget may be bound to several widgets at the same time�bindNrC)r�widgetr'r(rrr�bind_widgetszBalloon.bind_widgetcCs|j�|jd|j�dS�NZunbindrM�rr�rrr�
unbind_widgetszBalloon.unbind_widget)r2r3r4r5r9r�r�rrrrr�s
r�c@s2eZdZdZdifdd�Zifdd�Zdd�ZdS)	�	ButtonBoxzgButtonBox - A container for pushbuttons.
    Subwidgets are the buttons added with the add method.
    NcKst�||dddg||�dS)NZtixButtonBox�orientationr\�r[r9�rrdr'r(rrrr9s

�zButtonBox.__init__cKs4|jj|jd|f|�||���}t||�|j|<|S)z$Add a button with given name to box.�add�rrrDr%�_dummyButtonrc)rr,r'r(Zbtnrrrr�#s z
ButtonBox.addcCs ||jkr|j�|jd|�dS�N�invoke�rcrrrDr+rrrr�*s
zButtonBox.invoke�r2r3r4r5r9r�r�rrrrr�sr�c@s>eZdZdZdifdd�Zdd�Zdd�Zd	d
�Zdd�ZdS)
�ComboBoxa�ComboBox - an Entry field with a dropdown menu. The user can select a
    choice by either typing in the entry subwidget or selecting from the
    listbox subwidget.

    Subwidget       Class
    ---------       -----
    entry       Entry
    arrow       Button
    slistbox    ScrolledListBox
    tick        Button
    cross       Button : present if created with the fancy optionNc	Ks�t�||dddddg||�t|d�|jd<t|d�|jd<t|d�|jd<t|d	�|jd	<z$t|d
�|jd
<t|d�|jd<Wntk
r�YnXdS)NZtixComboBoxZeditableZdropdown�fancyr\r��entry�arrow�slistbox�tick�cross)r[r9r�rc�_dummyEntryr��_dummyScrolledListBox�	TypeErrorr�rrrr9<s 

��
zComboBox.__init__cCs|j�|jd|�dS)NZ
addhistoryrM�rr$rrr�add_historyNszComboBox.add_historycCs|j�|jd|�dS)NZ
appendhistoryrMr�rrr�append_historyQszComboBox.append_historycCs|j�|jd||�dS�N�insertrM)r�indexr$rrrr�TszComboBox.insertcCs|j�|jd|�dS)N�pickrM�rr�rrrr�Wsz
ComboBox.pick)	r2r3r4r5r9r�r�r�r�rrrrr�.s
r�c@s>eZdZdZdifdd�Zdd�Zdd�Zd	d
�Zdd�ZdS)
�Controla�Control - An entry field with value change arrows.  The user can
    adjust the value by pressing the two arrow buttons or by entering
    the value directly into the entry. The new value will be checked
    against the user-defined upper and lower limits.

    Subwidget       Class
    ---------       -----
    incr       Button
    decr       Button
    entry       Entry
    label       LabelNcKsZt�||ddg||�t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<dS)NZ
tixControlr\�incr�decrr�r�)r[r9r�rcr�r�r�rrrr9hs
zControl.__init__cCs|j�|jd�dS)Nr�rMr?rrr�	decrementoszControl.decrementcCs|j�|jd�dS)Nr�rMr?rrr�	incrementrszControl.incrementcCs|j�|jd�dSr�rMr?rrrr�uszControl.invokecCs|j�|jd�dS)N�updaterMr?rrrr�xszControl.update)	r2r3r4r5r9r�r�r�r�rrrrr�Zs
r�c@s$eZdZdZifdd�Zdd�ZdS)�DirListaRDirList - displays a list view of a directory, its previous
    directories and its sub-directories. The user can choose one of
    the directories displayed in the list or change to another directory.

    Subwidget       Class
    ---------       -----
    hlist       HList
    hsb              Scrollbar
    vsb              ScrollbarcKsJt�||ddg||�t|d�|jd<t|d�|jd<t|d�|jd<dS)NZ
tixDirListr\�hlist�vsb�hsb�r[r9�_dummyHListrc�_dummyScrollbarr�rrrr9�szDirList.__init__cCs|j�|jd|�dS�N�chdirrM�r�dirrrrr��sz
DirList.chdirN�r2r3r4r5r9r�rrrrr�{sr�c@s$eZdZdZifdd�Zdd�ZdS)�DirTreea�DirTree - Directory Listing in a hierarchical view.
    Displays a tree view of a directory, its previous directories and its
    sub-directories. The user can choose one of the directories displayed
    in the list or change to another directory.

    Subwidget       Class
    ---------       -----
    hlist           HList
    hsb             Scrollbar
    vsb             ScrollbarcKsJt�||ddg||�t|d�|jd<t|d�|jd<t|d�|jd<dS)NZ
tixDirTreer\r�r�r�r�r�rrrr9�szDirTree.__init__cCs|j�|jd|�dSr�rMr�rrrr��sz
DirTree.chdirNr�rrrrr��sr�c@seZdZdZifdd�ZdS)�DirSelectBoxa�DirSelectBox - Motif style file select box.
    It is generally used for
    the user to choose a file. FileSelectBox stores the files mostly
    recently selected into a ComboBox widget so that they can be quickly
    selected again.

    Subwidget       Class
    ---------       -----
    selection       ComboBox
    filter          ComboBox
    dirlist         ScrolledListBox
    filelist        ScrolledListBoxcKs:t�||ddg||�t|d�|jd<t|d�|jd<dS)NZtixDirSelectBoxr\�dirlist�dircbx)r[r9�
_dummyDirListrc�_dummyFileComboBoxr�rrrr9�szDirSelectBox.__init__N�r2r3r4r5r9rrrrr��s
r�c@s,eZdZdZifdd�Zdd�Zdd�ZdS)	�ExFileSelectBoxa�ExFileSelectBox - MS Windows style file select box.
    It provides a convenient method for the user to select files.

    Subwidget       Class
    ---------       -----
    cancel       Button
    ok              Button
    hidden       Checkbutton
    types       ComboBox
    dir              ComboBox
    file       ComboBox
    dirlist       ScrolledListBox
    filelist       ScrolledListBoxcKs�t�||ddg||�t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<t|d	�|jd	<t|d
�|jd
<dS)NZtixExFileSelectBoxr\�cancel�ok�hidden�typesr�r��file�filelist)r[r9r�rc�_dummyCheckbutton�_dummyComboBoxr�r�r�rrrr9�szExFileSelectBox.__init__cCs|j�|jd�dS�N�filterrMr?rrrr��szExFileSelectBox.filtercCs|j�|jd�dSr�rMr?rrrr��szExFileSelectBox.invokeN)r2r3r4r5r9r�r�rrrrr��sr�c@s,eZdZdZifdd�Zdd�Zdd�ZdS)	�DirSelectDialoga#The DirSelectDialog widget presents the directories in the file
    system in a dialog window. The user can use this dialog window to
    navigate through the file system to select the desired directory.

    Subwidgets       Class
    ----------       -----
    dirbox       DirSelectDialogcKs*t�||ddg||�t|d�|jd<dS)NZtixDirSelectDialogr\Zdirbox)r[r9�_dummyDirSelectBoxrcr�rrrr9�s
�zDirSelectDialog.__init__cCs|j�|jd�dS�N�popuprMr?rrrr��szDirSelectDialog.popupcCs|j�|jd�dS�N�popdownrMr?rrrr��szDirSelectDialog.popdownN�r2r3r4r5r9r�r�rrrrr��s	r�c@s,eZdZdZifdd�Zdd�Zdd�ZdS)	�ExFileSelectDialogz�ExFileSelectDialog - MS Windows style file select dialog.
    It provides a convenient method for the user to select files.

    Subwidgets       Class
    ----------       -----
    fsbox       ExFileSelectBoxcKs*t�||ddg||�t|d�|jd<dS)NZtixExFileSelectDialogr\�fsbox)r[r9�_dummyExFileSelectBoxrcr�rrrr9�s
�zExFileSelectDialog.__init__cCs|j�|jd�dSr�rMr?rrrr�szExFileSelectDialog.popupcCs|j�|jd�dSr�rMr?rrrr�szExFileSelectDialog.popdownNr�rrrrr��sr�c@s,eZdZdZifdd�Zdd�Zdd�ZdS)	�
FileSelectBoxa�ExFileSelectBox - Motif style file select box.
    It is generally used for
    the user to choose a file. FileSelectBox stores the files mostly
    recently selected into a ComboBox widget so that they can be quickly
    selected again.

    Subwidget       Class
    ---------       -----
    selection       ComboBox
    filter          ComboBox
    dirlist         ScrolledListBox
    filelist        ScrolledListBoxcKsZt�||ddg||�t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<dS)NZtixFileSelectBoxr\r�r�r��	selection)r[r9r�rcr�r�rrrr9s
zFileSelectBox.__init__cCs|j�|jd�dSr�rMr?rrr�apply_filterszFileSelectBox.apply_filtercCs|j�|jd�dSr�rMr?rrrr�szFileSelectBox.invokeN)r2r3r4r5r9r�r�rrrrr�s
r�c@s,eZdZdZifdd�Zdd�Zdd�ZdS)	�FileSelectDialogz�FileSelectDialog - Motif style file select dialog.

    Subwidgets       Class
    ----------       -----
    btns       StdButtonBox
    fsbox       FileSelectBoxcKs:t�||ddg||�t|d�|jd<t|d�|jd<dS)NZtixFileSelectDialogr\Zbtnsr�)r[r9�_dummyStdButtonBoxrc�_dummyFileSelectBoxr�rrrr9,s
�zFileSelectDialog.__init__cCs|j�|jd�dSr�rMr?rrrr�2szFileSelectDialog.popupcCs|j�|jd�dSr�rMr?rrrr�5szFileSelectDialog.popdownNr�rrrrr�#sr�c@s,eZdZdZifdd�Zdd�Zdd�ZdS)	�	FileEntrya_FileEntry - Entry field with button that invokes a FileSelectDialog.
    The user can type in the filename manually. Alternatively, the user can
    press the button widget that sits next to the entry, which will bring
    up a file selection dialog.

    Subwidgets       Class
    ----------       -----
    button       Button
    entry       EntrycKs<t�||dddg||�t|d�|jd<t|d�|jd<dS)NZtixFileEntryZ
dialogtyper\Zbuttonr�)r[r9r�rcr�r�rrrr9Ds
�zFileEntry.__init__cCs|j�|jd�dSr�rMr?rrrr�JszFileEntry.invokecCsdSrFrr?rrr�file_dialogMszFileEntry.file_dialogN)r2r3r4r5r9r�r�rrrrr�8sr�c@s�eZdZdZdifdd�Zifdd�Zdifdd�Zd	d
�Zdd�Zdldd�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zifd d!�Zifd"d#�Zd$d%�Zd&d'�ZeZd(d)�Zd*d+�Zd,d-�Zifd.d/�Zifd0d1�Zd2d3�Zd4d5�Zd6d7�Zd8d9�Zd:d;�Z d<d=�Z!dmd>d?�Z"d@dA�Z#dBdC�Z$dDdE�Z%dFdG�Z&dHdI�Z'dJdK�Z(dLdM�Z)dNdO�Z*dPdQ�Z+dRdS�Z,ifdTdU�Z-ifdVdW�Z.dXdY�Z/dZd[�Z0d\d]�Z1ifd^d_�Z2d`da�Z3dbdc�Z4ifddde�Z5dfdg�Z6dndhdi�Z7djdk�Z8dS)o�HListaHList - Hierarchy display  widget can be used to display any data
    that have a hierarchical structure, for example, file system directory
    trees. The list entries are indented and connected by branch lines
    according to their places in the hierarchy.

    Subwidgets - NoneNcKst�||dddg||�dS)NZtixHList�columnsr\r�r�rrrr9Ys

�zHList.__init__cKs |jj|jd|f|�||���S�Nr�rC�rr�r'r(rrrr�]sz	HList.addcKs(|sd}|jj|jd|f|�||���S)Nr=ZaddchildrC)rr�r'r(rrr�	add_child`s�
�zHList.add_childcCs|j�|jdd|�dS�N�anchor�setrM�rr�rrr�
anchor_setfszHList.anchor_setcCs|j�|jdd�dS�Nr��clearrMr?rrr�anchor_cleariszHList.anchor_clearrcCs6|s|j�|jdd||�S|j�|jdd|d|�SdS)Nr	�widthz-charrM)r�colr�charsrrr�column_widthls�zHList.column_widthcCs|j�|jdd�dS)Nrz�allrMr?rrr�
delete_allsszHList.delete_allcCs|j�|jdd|�dS)Nrzr�rMr�rrr�delete_entryvszHList.delete_entrycCs|j�|jdd|�dS)NrzZ
offspringsrMr�rrr�delete_offspringsyszHList.delete_offspringscCs|j�|jdd|�dS)NrzZsiblingsrMr�rrr�delete_siblings|szHList.delete_siblingscCs|j�|jdd|�dS�N�dragsiter�rMr�rrr�dragsite_setszHList.dragsite_setcCs|j�|jdd�dS�NrrrMr?rrr�dragsite_clear�szHList.dragsite_clearcCs|j�|jdd|�dS�N�dropsiter�rMr�rrr�dropsite_set�szHList.dropsite_setcCs|j�|jdd�dS�NrrrMr?rrr�dropsite_clear�szHList.dropsite_clearcKs&|jj|jdd|f|�||���dS)N�headerrvrC�rrr'r(rrr�
header_create�szHList.header_createcKs@|dkr|�|jdd|�S|jj|jdd|f|�||���dS)Nrr �r"rDrrr%rrrr�header_configure�s

�zHList.header_configurecCs|j�|jdd||�S)NrrrM)rr�optrrr�header_cget�szHList.header_cgetcCs|j�|j�|jdd|��S)NrZexist)rZ
getbooleanrrD�rrrrr�
header_exists�szHList.header_existscCs|j�|jdd|�dS)NrrzrMrrrr�
header_delete�szHList.header_deletecCs|j�|jdd|�S)Nr�sizerMrrrr�header_size�szHList.header_sizecCs|j�|jdd|�dS)N�hider�rMr�rrr�
hide_entry�szHList.hide_entrycKs&|jj|jdd|f|�||���dS)N�	indicatorrvrCr�rrr�indicator_create�s�
�zHList.indicator_createcKs@|dkr|�|jdd|�S|jj|jdd|f|�||���dS)Nr#r rr�rrr�indicator_configure�s��
�zHList.indicator_configurecCs|j�|jdd||�S)Nr#rrM�rr�rrrr�indicator_cget�szHList.indicator_cgetcCs|j�|jdd|�S)Nr#�existsrMr�rrr�indicator_exists�szHList.indicator_existscCs|j�|jdd|�dS)Nr#rzrMr�rrr�indicator_delete�szHList.indicator_deletecCs|j�|jdd|�S)Nr#rrMr�rrr�indicator_size�szHList.indicator_sizecCs|j�|jdd�S�NrTr�rMr?rrr�info_anchor�szHList.info_anchorcCs|�|j�|jdd|��pdS�NrTZbbox)�_getintsrrrDr�rrr�	info_bbox�s
��zHList.info_bboxcCs |j�|jdd|�}|j�|�S)NrTr��rrrDrP)rr�r�rrr�
info_children�szHList.info_childrencCs|j�|jdd|�S)NrT�datarMr�rrr�	info_data�szHList.info_datacCs|j�|jdd�S)NrTrrMr?rrr�
info_dragsite�szHList.info_dragsitecCs|j�|jdd�S)NrTrrMr?rrr�
info_dropsite�szHList.info_dropsitecCs|j�|jdd|�S)NrTr(rMr�rrr�info_exists�szHList.info_existscCs|j�|jdd|�S)NrTr�rMr�rrr�info_hidden�szHList.info_hiddencCs|j�|jdd|�S)NrT�nextrMr�rrr�	info_next�szHList.info_nextcCs|j�|jdd|�S)NrTr�rMr�rrr�info_parent�szHList.info_parentcCs|j�|jdd|�S)NrT�prevrMr�rrr�	info_prev�szHList.info_prevcCs|j�|jdd�}|j�|�S�NrTr�r1r�rrr�info_selection�szHList.info_selectioncCs|j�|jdd|||�S)N�itemrrM)rr�rrrrr�	item_cget�szHList.item_cgetcKsD|dkr|�|jdd||�S|jj|jdd||f|�||���dS)Nr@r r�rr�rr'r(rrr�item_configure�s

�zHList.item_configurecKs(|jj|jdd||f|�||���dS)Nr@rvrCrBrrr�item_create�s�
�zHList.item_createcCs|j�|jdd||�S)Nr@r(rM�rr�rrrr�item_exists�szHList.item_existscCs|j�|jdd||�dS)Nr@rzrMrErrr�item_delete�szHList.item_deletecCs|j�|jd||�S)N�	entrycgetrMr&rrrrH�szHList.entrycgetcKs<|dkr|�|jd|�S|jj|jd|f|�||���dS�N�entryconfigurerr�rrrrJ�s

�zHList.entryconfigurecCs|j�|jd|�S�N�nearestrM)rrRrrrrLsz
HList.nearestcCs|j�|jd|�dS�N�seerMr�rrrrNsz	HList.seecKs$|jj|jddf|�||���dS�Nr�rrCr&rrr�selection_clearszHList.selection_clearcCs|j�|jdd|�S�Nr�ZincludesrMr�rrr�selection_includes
szHList.selection_includescCs|j�|jdd||�dS�Nr�r�rM�r�firstZlastrrr�
selection_set
szHList.selection_setcCs|j�|jdd|�S)N�showr�rMr�rrr�
show_entryszHList.show_entry)rNN)N)N)9r2r3r4r5r9r�r�r�rrrrr	r
r
rrrrrrrZheader_existrr r"r$r%r'r)r*r+r-r0r2r4r5r6r7r8r:r;r=r?rArCrDrFrGrHrJrLrNrPrRrVrXrrrrr�Qsl


r�c@seZdZdZdifdd�ZdS)�	InputOnlyz?InputOnly - Invisible widget. Unix only.

    Subwidgets - NoneNcKst�||dd||�dS)NZtixInputOnlyr�r�rrrr9szInputOnly.__init__r�rrrrrYsrYc@seZdZdZdifdd�ZdS)�
LabelEntryaLabelEntry - Entry field with label. Packages an entry widget
    and a label into one mega widget. It can be used to simplify the creation
    of ``entry-form'' type of interface.

    Subwidgets       Class
    ----------       -----
    label       Label
    entry       EntryNcKs<t�||dddg||�t|d�|jd<t|d�|jd<dS)NZ
tixLabelEntry�	labelsider\r�r�)r[r9r�rcr�r�rrrr9%s
�zLabelEntry.__init__r�rrrrrZs	rZc@seZdZdZdifdd�ZdS)�
LabelFrameaeLabelFrame - Labelled Frame container. Packages a frame widget
    and a label into one mega widget. To create widgets inside a
    LabelFrame widget, one creates the new widgets relative to the
    frame subwidget and manage them inside the frame subwidget.

    Subwidgets       Class
    ----------       -----
    label       Label
    frame       FrameNcKs<t�||dddg||�t|d�|jd<t|d�|jd<dS)NZ
tixLabelFramer[r\r��frame)r[r9r�rc�_dummyFramer�rrrr96s
�zLabelFrame.__init__r�rrrrr\+s
r\c@s@eZdZdZifdd�Zifdd�Zdd�Zdd	�Zd
d�ZdS)
�ListNoteBookaA ListNoteBook widget is very similar to the TixNoteBook widget:
    it can be used to display many windows in a limited space using a
    notebook metaphor. The notebook is divided into a stack of pages
    (windows). At one time only one of these pages can be shown.
    The user can navigate through these pages by
    choosing the name of the desired page in the hlist subwidget.cKsNt�||ddg||�t|ddd�|jd<t|d�|jd<t|d�|jd<dS)NZtixListNoteBookr\Zpanerr�r�Zshlist)r[r9�_dummyPanedWindowrcr��_dummyScrolledHListr�rrrr9Es�zListNoteBook.__init__cKs:|jj|jd|f|�||���t||�|j|<|j|Sr��rrrDr%r|rc�rr,r'r(rrrr�Ms zListNoteBook.addcCs
|�|�SrF�rpr+rrr�pageRszListNoteBook.pagecCs:|j�|j�|jd��}g}|D]}|�|�|��q |S�N�pages�rrPrrDr]rp�rrrZretrQrrrrgUs
zListNoteBook.pagescCs|j�|jd|�dS�N�raiserMr+rrr�
raise_page]szListNoteBook.raise_pageN)	r2r3r4r5r9r�rergrlrrrrr_=sr_c@seZdZdZdifdd�ZdS)�MeterzuThe Meter widget can be used to show the progress of a background
    job which may take a long time to execute.
    NcKst�||ddg||�dS)NZtixMeterr\r�r�rrrr9es

�zMeter.__init__r�rrrrrm`srmc@sReZdZdZdifdd�Zifdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dS)�NoteBookz�NoteBook - Multi-page container widget (tabbed notebook metaphor).

    Subwidgets       Class
    ----------       -----
    nbframe       NoteBookFrame
    <pages>       page widgets added dynamically with the add methodNcKs.t�||ddg||�t|ddd�|jd<dS)NZtixNoteBookr\Znbframerr�)r[r9r|rcr�rrrr9qs�zNoteBook.__init__cKs:|jj|jd|f|�||���t||�|j|<|j|Sr�rbrcrrrr�vs zNoteBook.addcCs,|j�|jd|�|j|��|j|=dSr��rrrDrcr>r+rrrrz{szNoteBook.deletecCs
|�|�SrFrdr+rrrre�sz
NoteBook.pagecCs:|j�|j�|jd��}g}|D]}|�|�|��q |Srfrhrirrrrg�s
zNoteBook.pagescCs|j�|jd|�dSrjrMr+rrrrl�szNoteBook.raise_pagecCs|j�|jd�S)N�raisedrMr?rrrrp�szNoteBook.raised)r2r3r4r5r9r�rzrergrlrprrrrrnisrnc@seZdZdS)�
NoteBookFrameN)r2r3r4rrrrrq�srqc@sLeZdZdZifdd�Zifdd�Zifdd�Zdd	�Zd
d�Zdd
�Z	dS)�
OptionMenuz�OptionMenu - creates a menu button of options.

    Subwidget       Class
    ---------       -----
    menubutton      Menubutton
    menu            MenucKs:t�||ddg||�t|d�|jd<t|d�|jd<dS)NZ
tixOptionMenur\�
menubutton�menu�r[r9�_dummyMenubuttonrc�
_dummyMenur�rrrr9�szOptionMenu.__init__cKs&|jj|jdd|f|�||���dS)Nr��commandrCrcrrr�add_command�szOptionMenu.add_commandcKs&|jj|jdd|f|�||���dS)Nr�Z	separatorrCrcrrr�
add_separator�szOptionMenu.add_separatorcCs|j�|jd|�dSr�rMr+rrrrz�szOptionMenu.deletecCs|j�|jd|�dS)N�disablerMr+rrrr{�szOptionMenu.disablecCs|j�|jd|�dS)N�enablerMr+rrrr|�szOptionMenu.enableN)
r2r3r4r5r9ryrzrzr{r|rrrrrr�srrc@sTeZdZdZifdd�Zifdd�Zdd�Zdd	�Zd
d�Zifdd
�Z	dd�Z
dS)�PanedWindowa�PanedWindow - Multi-pane container widget
    allows the user to interactively manipulate the sizes of several
    panes. The panes can be arranged either vertically or horizontally.The
    user changes the sizes of the panes by dragging the resize handle
    between two panes.

    Subwidgets       Class
    ----------       -----
    <panes>       g/p widgets added dynamically with the add method.cKst�||dddg||�dS)NZtixPanedWindowr�r\r�r�rrrr9�szPanedWindow.__init__cKs>|jj|jd|f|�||���t||dd�|j|<|j|S)Nr�r)rrbrcrrrr��s
 �zPanedWindow.addcCs,|j�|jd|�|j|��|j|=dSr�ror+rrrrz�szPanedWindow.deletecCs|j�|jd|�dS)NrNrMr+rrrrN�szPanedWindow.forgetcCs|j�|jd||�S)N�panecgetrMr&rrrr~�szPanedWindow.panecgetcKs<|dkr|�|jd|�S|jj|jd|f|�||���dS)N�
paneconfigurerr�rrrr�szPanedWindow.paneconfigurecs*�j��j��jd��}�fdd�|D�S)N�panescsg|]}��|��qSrrdrVr?rrrX�sz%PanedWindow.panes.<locals>.<listcomp>rZ)rrrrr?rr��szPanedWindow.panesN)r2r3r4r5r9r�rzrNr~rr�rrrrr}�s
r}c@s4eZdZdZifdd�Zdd�Zdd�Zdd	�Zd
S)�	PopupMenuaPopupMenu widget can be used as a replacement of the tk_popup command.
    The advantage of the Tix PopupMenu widget is it requires less application
    code to manipulate.


    Subwidgets       Class
    ----------       -----
    menubutton       Menubutton
    menu       MenucKs:t�||ddg||�t|d�|jd<t|d�|jd<dS)NZtixPopupMenur\rsrtrur�rrrr9�szPopupMenu.__init__cCs|j�|jd|j�dS)Nr�rMr�rrrr��szPopupMenu.bind_widgetcCs|j�|jd|j�dSr�rMr�rrrr��szPopupMenu.unbind_widgetcCs|j�|jd|j||�dS)NZpostrM)rr�rQrRrrr�post_widget�szPopupMenu.post_widgetN)r2r3r4r5r9r�r�r�rrrrr��s
r�c@s<eZdZdZifdd�Zdd�Zdd�Zdd	�Zd
d�ZdS)
�ResizeHandlez;Internal widget to draw resize handles on Scrolled widgets.c	Ks.ddddddddd	g	}t�||d
|||�dS)Nr\rxZcursorfgZcursorbgZ
handlesizeZ	hintcolorZ	hintwidthrQrRZtixResizeHandler�)rrdr'r(�flagsrrrr9�s�
�zResizeHandle.__init__cCs|j�|jd|j�dS)NZattachwidgetrMr�rrr�
attach_widgetszResizeHandle.attach_widgetcCs|j�|jd|j�dS)NZdetachwidgetrMr�rrr�
detach_widgetszResizeHandle.detach_widgetcCs|j�|jd|j�dS)Nr!rMr�rrrr!szResizeHandle.hidecCs|j�|jd|j�dS)NrWrMr�rrrrW	szResizeHandle.showN)	r2r3r4r5r9r�r�r!rWrrrrr��s
r�c@seZdZdZifdd�ZdS)�
ScrolledHListz0ScrolledHList - HList with automatic scrollbars.cKsJt�||ddg||�t|d�|jd<t|d�|jd<t|d�|jd<dS)NZtixScrolledHListr\r�r�r�r�r�rrrr9s�zScrolledHList.__init__Nr�rrrrr�sr�c@seZdZdZifdd�ZdS)�ScrolledListBoxz4ScrolledListBox - Listbox with automatic scrollbars.cKsJt�||ddg||�t|d�|jd<t|d�|jd<t|d�|jd<dS)NZtixScrolledListBoxr\�listboxr�r�)r[r9�
_dummyListboxrcr�r�rrrr9szScrolledListBox.__init__Nr�rrrrr�sr�c@seZdZdZifdd�ZdS)�ScrolledTextz.ScrolledText - Text with automatic scrollbars.cKsJt�||ddg||�t|d�|jd<t|d�|jd<t|d�|jd<dS)NZtixScrolledTextr\rr�r�)r[r9�
_dummyTextrcr�r�rrrr9%szScrolledText.__init__Nr�rrrrr�!sr�c@seZdZdZifdd�ZdS)�
ScrolledTListz0ScrolledTList - TList with automatic scrollbars.cKsJt�||ddg||�t|d�|jd<t|d�|jd<t|d�|jd<dS)NZtixScrolledTListr\Ztlistr�r�)r[r9�_dummyTListrcr�r�rrrr9/s�zScrolledTList.__init__Nr�rrrrr�+sr�c@seZdZdZifdd�ZdS)�ScrolledWindowz2ScrolledWindow - Window with automatic scrollbars.cKsJt�||ddg||�t|d�|jd<t|d�|jd<t|d�|jd<dS)NZtixScrolledWindowr\rr�r�)r[r9r^rcr�r�rrrr9:szScrolledWindow.__init__Nr�rrrrr�6sr�c@s0eZdZdZifdd�Zifdd�Zdd�ZdS)	�Selectz�Select - Container of button subwidgets. It can be used to provide
    radio-box or check-box style of selection options for the user.

    Subwidgets are buttons added dynamically using the add method.c
Ks2t�||ddddddg||�t|d�|jd<dS)NZ	tixSelectZ	allowzero�radior�r[r\r�r�r�rrrr9Gs
��zSelect.__init__cKs:|jj|jd|f|�||���t||�|j|<|j|Sr�r�rcrrrr�Ns z
Select.addcCs|j�|jd|�dSr�rMr+rrrr�Ssz
Select.invokeNr�rrrrr�@sr�c@seZdZdZdifdd�ZdS)�Shellz'Toplevel window.

    Subwidgets - NoneNcKst�||dddg||�dS)NZtixShellr\�titler�r�rrrr9[szShell.__init__r�rrrrr�Vsr�c@s6eZdZdZdifdd�Zdd�Zdd�Zd	d
�ZdS)�DialogShellz�Toplevel window, with popup popdown and center methods.
    It tells the window manager that it is a dialog window and should be
    treated specially. The exact treatment depends on the treatment of
    the window manager.

    Subwidgets - NoneNcKs&t�||ddddddddg||�dS)	NZtixDialogShellr\r�ZmappedZ	minheightZminwidthr�Z	transientr�r�rrrr9gs��zDialogShell.__init__cCs|j�|jd�dSr�rMr?rrrr�nszDialogShell.popdowncCs|j�|jd�dSr�rMr?rrrr�qszDialogShell.popupcCs|j�|jd�dS)N�centerrMr?rrrr�tszDialogShell.center)r2r3r4r5r9r�r�r�rrrrr�^s
r�c@s&eZdZdZdifdd�Zdd�ZdS)�StdButtonBoxz@StdButtonBox - Standard Button Box (OK, Apply, Cancel and Help) NcKs\t�||dddg||�t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<dS)NZtixStdButtonBoxr�r\r��applyr��help)r[r9r�rcr�rrrr9zs
�zStdButtonBox.__init__cCs ||jkr|j�|jd|�dSr�r�r+rrrr��s
zStdButtonBox.invoke)r2r3r4r5r9r�rrrrr�wsr�c@s�eZdZdZdifdd�Zdd�Zdd�Zd	d
�Zdd�Zd3d
d�Z	dd�Z
dd�Zdd�Zdd�Z
ifdd�Zdd�Zdd�Zdd�Zdd �Zd!d"�Zd#d$�Zd%d&�Zd'd(�Zd)d*�Zd+d,�Zifd-d.�Zd/d0�Zd4d1d2�ZdS)5�TLista�TList - Hierarchy display widget which can be
    used to display data in a tabular format. The list entries of a TList
    widget are similar to the entries in the Tk listbox widget. The main
    differences are (1) the TList widget can display the list entries in a
    two dimensional format and (2) you can use graphical images as well as
    multiple colors and fonts for the list entries.

    Subwidgets - NoneNcKst�||ddg||�dS)NZtixTListr\r�r�rrrr9�szTList.__init__cCs|j�|jdd|�dS)N�activer�rMr�rrr�
active_set�szTList.active_setcCs|j�|jdd�dS)Nr�rrMr?rrr�active_clear�szTList.active_clearcCs|j�|jdd|�dSr�rMr�rrrr��szTList.anchor_setcCs|j�|jdd�dSr�rMr?rrrr�szTList.anchor_clearcCs|j�|jd||�dSr�rM�r�from_�torrrrz�szTList.deletecCs|j�|jdd|�dSrrMr�rrrr
�szTList.dragsite_setcCs|j�|jdd�dSrrMr?rrrr�szTList.dragsite_clearcCs|j�|jdd|�dSrrMr�rrrr�szTList.dropsite_setcCs|j�|jdd�dSrrMr?rrrr�szTList.dropsite_clearcKs$|jj|jd|f|�||���dSr�rC)rr�r'r(rrrr��szTList.insertcCs|j�|jdd�S)NrTr�rMr?rrr�info_active�szTList.info_activecCs|j�|jdd�Sr,rMr?rrrr-�szTList.info_anchorcCs|j�|jdd|�S)NrTZdownrMr�rrr�	info_down�szTList.info_downcCs|j�|jdd|�S)NrT�leftrMr�rrr�	info_left�szTList.info_leftcCs|j�|jdd|�S)NrT�rightrMr�rrr�
info_right�szTList.info_rightcCs|j�|jdd�}|j�|�Sr>r1r�rrrr?�szTList.info_selectioncCs|j�|jdd�S)NrTrrMr?rrr�	info_size�szTList.info_sizecCs|j�|jdd|�S)NrTZuprMr�rrr�info_up�sz
TList.info_upcCs|j�|jd||�SrKrM�rrQrRrrrrL�sz
TList.nearestcCs|j�|jd|�dSrMrMr�rrrrN�sz	TList.seecKs$|jj|jddf|�||���dSrOrCr&rrrrP�szTList.selection_clearcCs|j�|jdd|�SrQrMr�rrrrR�szTList.selection_includescCs|j�|jdd||�dSrSrMrTrrrrV�szTList.selection_set)N)N)r2r3r4r5r9r�r�r�rrzr
rrrr�r�r-r�r�r�r?r�r�rLrNrPrRrVrrrrr��s2	
r�c@sHeZdZdZdifdd�Zdd�Zdd�Zd	d
�Zdd�Zddd�Z	dS)�Treez�Tree - The tixTree widget can be used to display hierarchical
    data in a tree form. The user can adjust
    the view of the tree by opening or closing parts of the tree.NcKsJt�||ddg||�t|d�|jd<t|d�|jd<t|d�|jd<dS)NZtixTreer\r�r�r�r�r�rrrr9�s
�z
Tree.__init__cCs|j�|jd�dS�aThis command calls the setmode method for all the entries in this
     Tree widget: if an entry has no child entries, its mode is set to
     none. Otherwise, if the entry has any hidden child entries, its mode is
     set to open; otherwise its mode is set to close.�autosetmodeNrMr?rrrr��szTree.autosetmodecCs|j�|jd|�dS�z8Close the entry given by entryPath if its mode is close.�closeNrM�r�	entrypathrrrr��sz
Tree.closecCs|j�|jd|�S�z9Returns the current mode of the entry given by entryPath.�getmoderMr�rrrr��szTree.getmodecCs|j�|jd|�dS�z6Open the entry given by entryPath if its mode is open.�openNrMr�rrrr��sz	Tree.open�nonecCs|j�|jd||�dS)a�This command is used to indicate whether the entry given by
     entryPath has children entries and whether the children are visible. mode
     must be one of open, close or none. If mode is set to open, a (+)
     indicator is drawn next the entry. If mode is set to close, a (-)
     indicator is drawn next the entry. If mode is set to none, no
     indicators will be drawn for this entry. The default mode is none. The
     open mode indicates the entry has hidden children and this entry can be
     opened by the user. The close mode indicates that all the children of the
     entry are now visible and the entry can be closed by the user.�setmodeNrM�rr��moderrrr��s
zTree.setmode)r�)
r2r3r4r5r9r�r�r�r�r�rrrrr��sr�c@sZeZdZdZdifdd�Zdd�Zdd�Zd	d
�Zdd�Zddd�Z	dd�Z
ddd�ZdS)�	CheckListz�The CheckList widget
    displays a list of items to be selected by the user. CheckList acts
    similarly to the Tk checkbutton or radiobutton widgets, except it is
    capable of handling many more items than checkbuttons or radiobuttons.
    NcKsLt�||dddg||�t|d�|jd<t|d�|jd<t|d�|jd<dS)NZtixCheckListr\r�r�r�r�r�r�rrrr9s
�zCheckList.__init__cCs|j�|jd�dSr�rMr?rrrr�szCheckList.autosetmodecCs|j�|jd|�dSr�rMr�rrrr�szCheckList.closecCs|j�|jd|�Sr�rMr�rrrr� szCheckList.getmodecCs|j�|jd|�dSr�rMr�rrrr�$szCheckList.open�oncCs|j�|j�|jd|��S)z�Returns a list of items whose status matches status. If status is
     not specified, the list of items in the "on" status will be returned.
     Mode can be on, off, default�getselectionrZ)rr�rrrr�(szCheckList.getselectioncCs|j�|jd|�S)z(Returns the current status of entryPath.�	getstatusrMr�rrrr�.szCheckList.getstatuscCs|j�|jd||�dS)z~Sets the status of entryPath to be status. A bitmap will be
     displayed next to the entry its status is on, off or default.�	setstatusNrMr�rrrr�2szCheckList.setstatus)r�)r�)r2r3r4r5r9r�r�r�r�r�r�r�rrrrr�s
r�c@seZdZddd�ZdS)r�rjcCst�||||�dSrF�r|r9�rrdr,r~rrrr9>sz_dummyButton.__init__N)rj�r2r3r4r9rrrrr�=sr�c@seZdZddd�ZdS)r�rjcCst�||||�dSrFr�r�rrrr9Bsz_dummyCheckbutton.__init__N)rjr�rrrrr�Asr�c@seZdZddd�ZdS)r�rjcCst�||||�dSrFr�r�rrrr9Fsz_dummyEntry.__init__N)rjr�rrrrr�Esr�c@seZdZddd�ZdS)r^rjcCst�||||�dSrFr�r�rrrr9Jsz_dummyFrame.__init__N)rjr�rrrrr^Isr^c@seZdZddd�ZdS)r�rjcCst�||||�dSrFr�r�rrrr9Nsz_dummyLabel.__init__N)rjr�rrrrr�Msr�c@seZdZddd�ZdS)r�rjcCst�||||�dSrFr�r�rrrr9Rsz_dummyListbox.__init__N)rjr�rrrrr�Qsr�c@seZdZddd�ZdS)rwrjcCst�||||�dSrFr�r�rrrr9Vsz_dummyMenu.__init__N)rjr�rrrrrwUsrwc@seZdZddd�ZdS)rvrjcCst�||||�dSrFr�r�rrrr9Zsz_dummyMenubutton.__init__N)rjr�rrrrrvYsrvc@seZdZddd�ZdS)r�rjcCst�||||�dSrFr�r�rrrr9^sz_dummyScrollbar.__init__N)rjr�rrrrr�]sr�c@seZdZddd�ZdS)r�rjcCst�||||�dSrFr�r�rrrr9bsz_dummyText.__init__N)rjr�rrrrr�asr�c@seZdZddd�ZdS)r�rjcCsDt�||||�t|d�|jd<t|d�|jd<t|d�|jd<dS)Nr�r�r�)r|r9r�rcr�r�rrrr9fsz_dummyScrolledListBox.__init__N)rjr�rrrrr�esr�c@seZdZddd�ZdS)r�rjcCst�||||�dSrFr�r�rrrr9msz_dummyHList.__init__N)rjr�rrrrr�lsr�c@seZdZddd�ZdS)rarjcCsDt�||||�t|d�|jd<t|d�|jd<t|d�|jd<dS�Nr�r�r��r|r9r�rcr�r�rrrr9qsz_dummyScrolledHList.__init__N)rjr�rrrrrapsrac@seZdZddd�ZdS)r�rjcCst�||||�dSrFr�r�rrrr9xsz_dummyTList.__init__N)rjr�rrrrr�wsr�c@seZdZddd�ZdS)r�rjcCs�t�|||d|g�t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<z$t|d�|jd<t|d�|jd<Wntk
r�YnXdS)Nr�r�r�r�r�r�r�)r|r9r�rcr�r�r�r�r�rrrr9|s�
z_dummyComboBox.__init__N)rjr�rrrrr�{sr�c@seZdZddd�ZdS)r�rjcCsDt�||||�t|d�|jd<t|d�|jd<t|d�|jd<dSr�r�r�rrrr9�sz_dummyDirList.__init__N)rjr�rrrrr��sr�c@seZdZddd�ZdS)r�rjcCs4t�||||�t|d�|jd<t|d�|jd<dS)Nr�r�)r|r9r�rcr�r�rrrr9�sz_dummyDirSelectBox.__init__N)rjr�rrrrr��sr�c@seZdZddd�ZdS)r�rjcCs�t�||||�t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<dS)	Nr�r�r�r�r�r�r�r�)r|r9r�rcr�r�r�r�rrrr9�sz_dummyExFileSelectBox.__init__N)rjr�rrrrr��sr�c@seZdZddd�ZdS)r�rjcCsTt�||||�t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<dS)Nr�r�r�r�)r|r9r�rcr�r�rrrr9�s
z_dummyFileSelectBox.__init__N)rjr�rrrrr��sr�c@seZdZddd�ZdS)r�rjcCs$t�||||�t|d�|jd<dS)Nr�)r|r9r�rcr�rrrr9�sz_dummyFileComboBox.__init__N)rjr�rrrrr��sr�c@seZdZddd�ZdS)r�rjcCsTt�||||�t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<dS)Nr�r�r�r�)r|r9r�rcr�rrrr9�s
z_dummyStdButtonBox.__init__N)rjr�rrrrr��sr�c@seZdZddd�ZdS)�_dummyNoteBookFramercCst�||||�dSrFr�r�rrrr9�sz_dummyNoteBookFrame.__init__N)rr�rrrrr��sr�c@seZdZddd�ZdS)r`rjcCst�||||�dSrFr�r�rrrr9�sz_dummyPanedWindow.__init__N)rjr�rrrrr`�sr`cCs|j�d|j�S)zzReturns the qualified path name for the widget. Normally used to set
    default options for subwidgets. See tixwidgets.pyZ
tixOptionNamerM)r�rrr�
OptionName�sr�cCs:d}|��D](}|d|d|d||d}q|S)Nr=z{{z} {z - z}} )�keys)�dict�s�typerrr�FileTypeList�s&r�c@seZdZdZdS)�CObjViewaBThis file implements the Canvas Object View widget. This is a base
    class of IconView. It implements automatic placement/adjustment of the
    scrollbars according to the canvas objects inside the canvas subwidget.
    The scrollbars are adjusted so that the canvas is just large enough
    to see all the objects.
    N)r2r3r4r5rrrrr��sr�c@s�eZdZdZdifdd�Zdd�Zdd�Zd	d
�Zd)dd�Zd*d
d�Z	dd�Z
dd�Zdd�Zd+dd�Z
dd�Zdd�Zdd�Zdd�Zdd �Zd,d!d"�Zd#d$�Zd%d&�Zd'd(�ZdS)-�Grida}The Tix Grid command creates a new window  and makes it into a
    tixGrid widget. Additional options, may be specified on the command
    line or in the option database to configure aspects such as its cursor
    and relief.

    A Grid widget displays its contents in a two dimensional grid of cells.
    Each cell may contain one Tix display item, which may be in text,
    graphics or other formats. See the DisplayStyle class for more information
    about Tix display items. Individual cells, or groups of cells, can be
    formatted with a wide range of attributes, such as its color, relief and
    border.

    Subwidgets - NoneNcKs"g}||_t�||d|||�dS)NZtixGrid�r'r[r9r�rrrr9�sz
Grid.__init__cCs|j�|dd�dS)zRemoves the selection anchor.r�rNrr?rrrrszGrid.anchor_clearcCs|�|j�|dd��S)z3Get the (x,y) coordinate of the current anchor cellr�r/�r/rrr?rrr�
anchor_getszGrid.anchor_getcCs|j�|dd||�dS)z/Set the selection anchor to the cell at (x, y).r�r�Nrr�rrrr�szGrid.anchor_setcCs4|dkr|j�|dd|�n|j�|dd||�dS)zdDelete rows between from_ and to inclusive.
        If to is not provided,  delete only row at from_Nrzr
rr�rrr�
delete_rowszGrid.delete_rowcCs4|dkr|j�|dd|�n|j�|dd||�dS)zjDelete columns between from_ and to inclusive.
        If to is not provided,  delete only column at from_Nrzr	rr�rrr�
delete_columnszGrid.delete_columncCs|j�|dd�dS)zUIf any cell is being edited, de-highlight the cell  and  applies
        the changes.�editr�Nrr?rrr�
edit_applyszGrid.edit_applycCs|j�|dd||�dS)zmHighlights  the  cell  at  (x, y) for editing, if the -editnotify
        command returns True for this cell.r�r�Nrr�rrr�edit_set!sz
Grid.edit_setcCs,|r|ddkrd|}|j�|d|||�S)z&Get the option value for cell at (x,y)rr!rHr)rrQrRrrrrrH&szGrid.entrycgetcKs|�d||f||�SrI)Z
_configure)rrQrRr'r(rrrrJ,szGrid.entryconfigurec	Cs|�|j�|dd||��S)z+Return True if display item exists at (x,y)rTr()Z_getbooleanrrr�rrrr72szGrid.info_existscCs|j�|dd||�Sr.rr�rrrr06szGrid.info_bboxcCs|j�|dd|||�dS)z�Moves the range of columns from position FROM through TO by
        the distance indicated by OFFSET. For example, move_column(2, 4, 1)
        moves the columns 2,3,4 to columns 3,4,5.�mover	Nr�rr�r��offsetrrr�move_column:szGrid.move_columncCs|j�|dd|||�dS)z�Moves the range of rows from position FROM through TO by
        the distance indicated by OFFSET.
        For example, move_row(2, 4, 1) moves the rows 2,3,4 to rows 3,4,5.r�r
Nrr�rrr�move_row@sz
Grid.move_rowcCs|�|j�|d||��S)z8Return coordinate of cell nearest pixel coordinate (x,y)rLr�r�rrrrLFszGrid.nearestcKs>|�|j|�}|dk	r"d|f|}|jj|d||f|��dS)Nz	-itemtyper�)r%r'rr)rrQrRr�r(�argsrrrr�PszGrid.setcKs*|j�|jj|jdd|f|�i|����S)a�Queries or sets the size of the column given by
        INDEX.  INDEX may be any non-negative
        integer that gives the position of a given column.
        INDEX can also be the string "default"; in this case, this command
        queries or sets the default size of all columns.
        When no option-value pair is given, this command returns a tuple
        containing the current size setting of the given column.  When
        option-value pairs are given, the corresponding options of the
        size setting of the given column are changed. Options may be one
        of the following:
              pad0 pixels
                     Specifies the paddings to the left of a column.
              pad1 pixels
                     Specifies the paddings to the right of a column.
              size val
                     Specifies the width of a column.  Val may be:
                     "auto" -- the width of the column is set to the
                     width of the widest cell in the column;
                     a valid Tk screen distance unit;
                     or a real number following by the word chars
                     (e.g. 3.4chars) that sets the width of the column to the
                     given number of characters.rr	)rrPrrDr%�rr�r(rrr�size_columnVs
�zGrid.size_columncKs(|j�|jj|dd|f|�i|����S)a�Queries or sets the size of the row given by
        INDEX. INDEX may be any non-negative
        integer that gives the position of a given row .
        INDEX can also be the string "default"; in this case, this command
        queries or sets the default size of all rows.
        When no option-value pair is given, this command returns a list con-
        taining the current size setting of the given row . When option-value
        pairs are given, the corresponding options of the size setting of the
        given row are changed. Options may be one of the following:
              pad0 pixels
                     Specifies the paddings to the top of a row.
              pad1 pixels
                     Specifies the paddings to the bottom of a row.
              size val
                     Specifies the height of a row.  Val may be:
                     "auto" -- the height of the row is set to the
                     height of the highest cell in the row;
                     a valid Tk screen distance unit;
                     or a real number following by the word chars
                     (e.g. 3.4chars) that sets the height of the row to the
                     given number of characters.rr
)rrPrr%r�rrr�size_rowps�
�z
Grid.size_rowcCs|j�|jd||�dS)z7Clears the cell at (x, y) by removing its display item.�unsetNrMr�rrrr��sz
Grid.unset)N)N)N)N)r2r3r4r5r9rr�r�r�r�r�r�rHrJr7r0r�r�rLr�r�r�r�rrrrr��s(	




r�c@seZdZdZdifdd�ZdS)�ScrolledGridzScrolled Grid widgetsNcKs"g}||_t�||d|||�dS)NZtixScrolledGridr�r�rrrr9�szScrolledGrid.__init__r�rrrrr��sr�)ur:r8rZ_tkinterZWINDOWZTEXTZSTATUSZ	IMMEDIATEZIMAGEZ	IMAGETEXTZBALLOONZAUTOZ	ACROSSTOP�ASCIIZCELLZCOLUMNZ
DECREASINGZ
INCREASINGZINTEGERZMAIN�MAXZREALZROWZS_REGIONZX_REGIONZY_REGIONZ
TCL_DONT_WAITZTCL_WINDOW_EVENTSZTCL_FILE_EVENTSZTCL_TIMER_EVENTSZTCL_IDLE_EVENTSZTCL_ALL_EVENTSrr6rAra�	__bases__r[r|r�r�r�r�r�r�r�r�r�r�r�r�r�r�ZXViewZYViewr�rYrZr\r_rmrnrqrrr}r�r�r�r�r�r�r�r�r�r�r�r�r�r�ZButtonr�ZCheckbuttonr�ZEntryr�ZFramer^ZLabelr�ZListboxr�ZMenurwZ
MenubuttonrvZ	Scrollbarr�ZTextr�r�r�rar�r�r�r�r�r�r�r�r�r`r�r�r�r�r�rrrr�<module>s�-
8/,!"C#	()


S.6

*commondialog.cpython-38.opt-1.pyc000064400000002132151732766100012611 0ustar00U

e5d��@sddlTGdd�d�ZdS)�)�*c@s2eZdZdZd
dd�Zdd�Zdd�Zdd	�ZdS)�DialogNcKs|s|�d�}||_||_dS)N�parent)�get�master�options)�selfrr�r	�,/usr/lib64/python3.8/tkinter/commondialog.py�__init__s
zDialog.__init__cCsdS�Nr	)rr	r	r
�_fixoptionsszDialog._fixoptionscCs|Srr	)rZwidget�resultr	r	r
�
_fixresultszDialog._fixresultcKs||��D]\}}||j|<q|��t|j�}z,|jj|jf|�	|j���}|�
||�}W5z|��WnYnXX|Sr)�itemsrr
ZFramerZdestroyZtkZcall�commandZ_optionsr)rr�k�v�w�sr	r	r
�shows
zDialog.show)N)�__name__�
__module__�__qualname__rrr
rrr	r	r	r
rs

rN)Ztkinterrr	r	r	r
�<module>s__init__.cpython-38.opt-2.pyc000064400000106011151732766100011702 0ustar00U

e5dC��	@s"dddddddddg	Zd	d
lZd	dlmZmZd	dlmZ	d	d
l
Zd	d
lZ
d	d
lmZd	dlmZmZmZd	dlmZzd	dlmZWnek
r�YnXej�e�zd	dlm Z Wnek
r�YnXdd�Z!Gdd�dej"�Z#Gdd�dej$�Z%Gdd�dej&�Z'Gdd�de(�Z)Gdd�de*�Z+zd	dlm+Z+Wnek
�rRYnXzd	dlm,Z,Wnek
�r�dd �Z,YnXd!d
d
d"�d#d�Z-d$d%�Z.zd	d&lm.Z.Wnek
�r�YnXGd'd�de*�Z/Gd(d�dej0�Z1Gd)d�dej0�Z2Gd*d�dej�Z3Gd+d�dej4�Z5d
S),�deque�defaultdict�
namedtuple�UserDict�UserList�
UserString�Counter�OrderedDict�ChainMap�N)�
itemgetter�eq)�	iskeyword)�proxy)�repeat�chain�starmap)�recursive_repr)r)rcCsR|tjkr:tt|�}ddl}|jdtdd�|t�|<|Stdt�d|����dS)Nr
z�Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated since Python 3.3, and in 3.10 it will stop working���
stacklevelzmodule z has no attribute )	�_collections_abc�__all__�getattr�warnings�warn�DeprecationWarning�globals�AttributeError�__name__)�name�objr�r!�,/usr/lib64/python3.8/collections/__init__.py�__getattr__*s

�
r#c@seZdZdd�ZdS)�_OrderedDictKeysViewccst|j�EdHdS�N��reversed�_mapping��selfr!r!r"�__reversed__?sz!_OrderedDictKeysView.__reversed__N�r�
__module__�__qualname__r+r!r!r!r"r$=sr$c@seZdZdd�ZdS)�_OrderedDictItemsViewccs$t|j�D]}||j|fVq
dSr%r&�r*�keyr!r!r"r+Dsz"_OrderedDictItemsView.__reversed__Nr,r!r!r!r"r/Bsr/c@seZdZdd�ZdS)�_OrderedDictValuesViewccs t|j�D]}|j|Vq
dSr%r&r0r!r!r"r+Jsz#_OrderedDictValuesView.__reversed__Nr,r!r!r!r"r2Hsr2c@seZdZdZdS)�_Link)�prev�nextr1�__weakref__N)rr-r.�	__slots__r!r!r!r"r3Nsr3c@s�eZdZd*dd�Zejeefdd�Zejfdd�Zdd	�Z	d
d�Z
dd
�Zd+dd�Zd,dd�Z
dd�ZejjZZdd�Zdd�Zdd�ZejjZe�Zefdd�Zd-dd�Ze�d d!��Zd"d#�Zd$d%�Zed.d&d'��Z d(d)�Z!dS)/rr!cKs\z
|jWn>tk
rHt�|_t|j�|_}||_|_i|_YnX|j|f|�dSr%)	�_OrderedDict__rootrr3�_OrderedDict__hardroot�_proxyr4r5�_OrderedDict__map�_OrderedDict__update)r*�other�kwds�rootr!r!r"�__init__`s
zOrderedDict.__init__c	CsZ||krJ|�|j|<}|j}|j}||||_|_|_||_||�|_||||�dSr%)r;r8r4r5r1)	r*r1�valueZdict_setitemrZLink�linkr?�lastr!r!r"�__setitem__ms
zOrderedDict.__setitem__cCs>|||�|j�|�}|j}|j}||_||_d|_d|_dSr%)r;�popr4r5)r*r1Zdict_delitemrB�	link_prev�	link_nextr!r!r"�__delitem__{s
zOrderedDict.__delitem__ccs(|j}|j}||k	r$|jV|j}qdSr%)r8r5r1�r*r?Zcurrr!r!r"�__iter__�s
zOrderedDict.__iter__ccs(|j}|j}||k	r$|jV|j}qdSr%)r8r4r1rIr!r!r"r+�s
zOrderedDict.__reversed__cCs*|j}||_|_|j��t�|�dSr%)r8r4r5r;�clear�dict)r*r?r!r!r"rK�s
zOrderedDict.clearTcCsj|std��|j}|r0|j}|j}||_||_n|j}|j}||_||_|j}|j|=t�||�}||fS)Nzdictionary is empty)�KeyErrorr8r4r5r1r;rLrE)r*rCr?rBrFrGr1rAr!r!r"�popitem�s zOrderedDict.popitemc	Cst|j|}|j}|j}|j}||_||_|j}|rR|j}||_||_||_||_n|j}||_||_||_||_dSr%)r;r4r5r8)	r*r1rCrBrFrGZ	soft_linkr?�firstr!r!r"�move_to_end�s$
zOrderedDict.move_to_endcCsVtj}t|�d}||j�}|||j�d7}|||j�|7}|||j�|7}|S)N�r)�_sys�	getsizeof�len�__dict__r;r9r8)r*Zsizeof�n�sizer!r!r"�
__sizeof__�s
zOrderedDict.__sizeof__cCst|�Sr%)r$r)r!r!r"�keys�szOrderedDict.keyscCst|�Sr%)r/r)r!r!r"�items�szOrderedDict.itemscCst|�Sr%)r2r)r!r!r"�values�szOrderedDict.valuescCs0||kr||}||=|S||jkr,t|��|Sr%)�_OrderedDict__markerrM)r*r1�default�resultr!r!r"rE�s
zOrderedDict.popNcCs||kr||S|||<|Sr%r!�r*r1r]r!r!r"�
setdefault�szOrderedDict.setdefaultcCs*|sd|jjfSd|jjt|���fS)N�%s()z%s(%r))�	__class__r�listrZr)r!r!r"�__repr__szOrderedDict.__repr__cCsDt|���}tt��D]}|�|d�q|jd|p4ddt|���fS)Nr!)�vars�copyrrErb�iterrZ)r*Z	inst_dict�kr!r!r"�
__reduce__szOrderedDict.__reduce__cCs
|�|�Sr%�rbr)r!r!r"rfszOrderedDict.copycCs|�}|D]}|||<q
|Sr%r!)�cls�iterablerAr*r1r!r!r"�fromkeyss
zOrderedDict.fromkeyscCs2t|t�r&t�||�o$ttt||��St�||�Sr%)�
isinstancerrL�__eq__�all�map�_eq�r*r=r!r!r"ros
zOrderedDict.__eq__)r!)T)T)N)N)"rr-r.r@rLrDr:r3rHrJr+rKrNrPrXr�MutableMapping�updater<rYrZr[�__ne__�objectr\rEr`�_recursive_reprrdrirf�classmethodrmror!r!r!r"rQs6
�

		

	


)r)�_tuplegettercCstt|�|d�S)N)�doc)�property�_itemgetter)�indexr{r!r!r"�<lambda>7�rF)�rename�defaults�modulecs�t�t�r��dd����ttt����t�t|��}|r�t�}t	��D]B\}}|�
�rrt|�sr|�d�sr||kr�d|���|<|�
|�qH|g�D]D}t|�tk	r�td��|�
�s�td|����t|�r�td|����q�t�}�D]F}|�d��r
|�s
td|����||k�r"td|����|�
|�q�i}|dk	�r|t|�}t|�t��k�r^td	��ttttt��t|�����}tttj����t���t���d
d�dd
�}	dd�dd��D��d�tj�tttttf\�����d|	�d|	�d�}
�d|��d�}t|
|�|d}d|�d|	�d�|_|dk	�r>||_t���fdd��}
d|�d�|
j_��fdd�}d |�d!�|_�fd"d#�}��fd$d%�}�fd&d'�}||
j||||fD]}|�d(|j��|_�q�|�d|	�d�d)�||||
||||d*�}t	��D](\}}t�d+|���}t ||�||<�qt|tf|�}|dk�rvzt�!d�j"�#d,d-�}Wnt$tfk
�rtYnX|dk	�r�||_%|S).N�,� �_z*Type names and field names must be stringsz6Type names and field names must be valid identifiers: z0Type names and field names cannot be a keyword: z-Field names cannot start with an underscore: z"Encountered duplicate field name: z(Got more default values than field names�'�rQ����(�, css|]}|�d�VqdS)z=%rNr!)�.0rr!r!r"�	<genexpr>�sznamedtuple.<locals>.<genexpr>�)zdef __new__(_cls, z): return _tuple_new(_cls, (z))�namedtuple_)�
_tuple_newr�__new__zCreate new instance of cs2�||�}�|��kr.td��dt|�����|S)Nz	Expected z arguments, got )�	TypeErrorrT)rkrlr^)�_len�
num_fields�	tuple_newr!r"�_make�s
znamedtuple.<locals>._makezMake a new z# object from a sequence or iterablecs.|��|j�|��}|r*tdt|�����|S)NzGot unexpected field names: )r�rE�
ValueErrorrc)r*r>r^)�_map�field_namesr!r"�_replace�sznamedtuple.<locals>._replacez
Return a new z2 object replacing specified fields with new valuescs|jj�|Sr%)rbrr))�repr_fmtr!r"rd�sznamedtuple.<locals>.__repr__cs��|j|��Sr%)�_fieldsr))�_dict�_zipr!r"�_asdict�sznamedtuple.<locals>._asdictcs�|�Sr%r!r))�_tupler!r"�__getnewargs__�sz"namedtuple.<locals>.__getnewargs__�.r!)�__doc__r7r��_field_defaults�_fields_defaultsr�r�r�rdr�r�zAlias for field number r�__main__)&rn�str�replace�splitrcrqrR�intern�set�	enumerate�isidentifier�
_iskeyword�
startswith�add�typer�r��tuplerTrLr'�zip�repr�joinr��execr��__defaults__ry�__func__rr.rz�	_getframe�	f_globals�getrr-)�typenamer�r�r�r��seenr~r�field_defaults�arg_list�s�	namespacer�r�r�rdr�r��method�class_namespacer{r^r!)	r�r�r�r�r�r�r�r�r�r"r9s�
���

�


��

cCs&|j}|D]}||d�d||<q
dS�Nr
rQ)r�)�mappingrlZmapping_get�elemr!r!r"�_count_elements�sr�)r�cs�eZdZd.�fdd�	Zdd�Zd/dd�Zdd	�Zed0d
d��Zd1�fdd
�	Z	d2dd�Z
dd�Zdd�Z�fdd�Z
dd�Zdd�Zdd�Zdd�Zdd�Zd d!�Zd"d#�Zd$d%�Zd&d'�Zd(d)�Zd*d+�Zd,d-�Z�ZS)3rNcs tt|���|j|f|�dSr%)�superrr@ru)r*rlr>rjr!r"r@szCounter.__init__cCsdS�Nr
r!r0r!r!r"�__missing__*szCounter.__missing__cCs6|dkrt|��td�dd�Stj||��td�d�S)NrQT)r1�reverse�r1)�sortedrZr}�_heapq�nlargest�r*rVr!r!r"�most_common/s	zCounter.most_commoncCst�tt|����Sr%)�_chain�
from_iterable�_starmap�_repeatrZr)r!r!r"�elements<szCounter.elementscCstd��dS)Nz@Counter.fromkeys() is undefined.  Use Counter(iterable) instead.)�NotImplementedError)rkrl�vr!r!r"rmTs	�zCounter.fromkeyscsr|dk	r`t|tj�rV|rD|j}|��D]\}}|||d�||<q&q`tt|��|�n
t||�|rn|�|�dSr�)	rnr�Mappingr�rZr�rrur��r*rlr>�self_getr��countrjr!r"ru`s
zCounter.updatecKsn|dk	r\|j}t|tj�r@|��D]\}}||d�|||<q"n|D]}||d�d||<qD|rj|�|�dSr�)r�rnrr�rZ�subtractr�r!r!r"r��szCounter.subtractcCs
|�|�Sr%rjr)r!r!r"rf�szCounter.copycCs|jt|�ffSr%)rbrLr)r!r!r"ri�szCounter.__reduce__cs||krt��|�dSr%)r�rH)r*r�rjr!r"rH�szCounter.__delitem__cCsf|sd|jjSz(d�tdj|����}d|jj|fWStk
r`d�|jjt|��YSXdS)Nrar�z%r: %rz%s({%s})z
{0}({1!r}))	rbrr�rq�__mod__r�r��formatrL)r*rZr!r!r"rd�szCounter.__repr__cCspt|t�stSt�}|��D]$\}}|||}|dkr|||<q|��D] \}}||krJ|dkrJ|||<qJ|Sr��rnr�NotImplementedrZ�r*r=r^r�r��newcountr!r!r"�__add__�s


zCounter.__add__cCstt|t�stSt�}|��D]$\}}|||}|dkr|||<q|��D]$\}}||krJ|dkrJd|||<qJ|Sr�r�r�r!r!r"�__sub__�s

zCounter.__sub__cCs|t|t�stSt�}|��D]0\}}||}||kr8|n|}|dkr|||<q|��D] \}}||krV|dkrV|||<qV|Sr�r��r*r=r^r�r��other_countr�r!r!r"�__or__�s


zCounter.__or__cCsRt|t�stSt�}|��D]0\}}||}||kr8|n|}|dkr|||<q|Sr�r�r�r!r!r"�__and__�s

zCounter.__and__cCs,t�}|��D]\}}|dkr|||<q|Sr��rrZ�r*r^r�r�r!r!r"�__pos__
s

zCounter.__pos__cCs0t�}|��D]\}}|dkrd|||<q|Sr�r�r�r!r!r"�__neg__s
zCounter.__neg__cCs&dd�|��D�}|D]
}||=q|S)NcSsg|]\}}|dks|�qS)r
r!)r�r�r�r!r!r"�
<listcomp>"sz*Counter._keep_positive.<locals>.<listcomp>)rZ)r*�nonpositiver�r!r!r"�_keep_positive szCounter._keep_positivecCs*|��D]\}}|||7<q|��Sr%�rZr��r*r=r�r�r!r!r"�__iadd__'s	zCounter.__iadd__cCs*|��D]\}}|||8<q|��Sr%r�r�r!r!r"�__isub__4s	zCounter.__isub__cCs2|��D] \}}||}||kr|||<q|��Sr%r�)r*r=r�r�r�r!r!r"�__ior__As
	
zCounter.__ior__cCs2|��D] \}}||}||kr|||<q|��Sr%r�)r*r=r�r�r�r!r!r"�__iand__Ps
	
zCounter.__iand__)N)N)N)N)N)rr-r.r@r�r�r�ryrmrur�rfrirHrdr�r�r�r�r�r�r�r�r�r�r��
__classcell__r!r!rjr"r�s.3

!


c@s�eZdZdd�Zdd�Zdd�Zd&dd	�Zd
d�Zdd
�Zdd�Z	dd�Z
e�dd��Ze
dd��Zdd�ZeZd'dd�Zedd��Zdd�Zdd�Zd d!�Zd"d#�Zd$d%�ZdS)(r	cGst|�pig|_dSr%)rc�maps)r*r�r!r!r"r@rszChainMap.__init__cCst|��dSr%)rMr0r!r!r"r�yszChainMap.__missing__c	Cs:|jD](}z||WStk
r,YqXq|�|�Sr%)r�rMr�)r*r1r�r!r!r"�__getitem__|s
zChainMap.__getitem__NcCs||kr||S|Sr%r!r_r!r!r"r��szChainMap.getcCstt�j|j��Sr%)rTr��unionr�r)r!r!r"�__len__�szChainMap.__len__cCs&i}t|j�D]}|�|�qt|�Sr%)r'r�rurg)r*�dr�r!r!r"rJ�szChainMap.__iter__cst�fdd�|jD��S)Nc3s|]}�|kVqdSr%r!)r��mr�r!r"r��sz(ChainMap.__contains__.<locals>.<genexpr>��anyr�r0r!r�r"�__contains__�szChainMap.__contains__cCs
t|j�Sr%r�r)r!r!r"�__bool__�szChainMap.__bool__cCs"|jj�dd�tt|j���d�S)Nr�r�r�)rbrr�rqr�r�r)r!r!r"rd�szChainMap.__repr__cGs|tj|f|���Sr%)rLrm)rkrl�argsr!r!r"rm�szChainMap.fromkeyscCs$|j|jd��f|jdd���Sr�)rbr�rfr)r!r!r"rf�sz
ChainMap.copycCs|dkri}|j|f|j��Sr%�rbr�)r*r�r!r!r"�	new_child�szChainMap.new_childcCs|j|jdd��S)NrQrr)r!r!r"�parents�szChainMap.parentscCs||jd|<dSr�)r�)r*r1rAr!r!r"rD�szChainMap.__setitem__cCs8z|jd|=Wn"tk
r2td�|���YnXdS�Nr
z(Key not found in the first mapping: {!r})r�rMr�r0r!r!r"rH�szChainMap.__delitem__cCs2z|jd��WStk
r,td��YnXdS)Nr
z#No keys found in the first mapping.)r�rNrMr)r!r!r"rN�szChainMap.popitemcGs@z|jdj|f|��WStk
r:td�|���YnXdSr)r�rErMr�)r*r1rr!r!r"rE�szChainMap.popcCs|jd��dSr�)r�rKr)r!r!r"rK�szChainMap.clear)N)N)rr-r.r@r�r�r�r�rJrrrxrdryrmrf�__copy__rr|rrDrHrNrErKr!r!r!r"r	ds,




c@speZdZdd�Zde_dd�Zdd�Zdd	�Zd
d�Zdd
�Z	dd�Z
dd�Zdd�Zdd�Z
eddd��ZdS)rcOs�|std��|^}}t|�dkr0tdt|���|r>|d}n0d|krj|�d�}ddl}|jdtdd�nd}i|_|dk	r�|�|�|r�|�|�dS)	Nz<descriptor '__init__' of 'UserDict' object needs an argumentrQz$expected at most 1 arguments, got %dr
rLz0Passing 'dict' as keyword argument is deprecatedrr)r�rTrErrr�dataru)r�kwargsr*rLrr!r!r"r@�s(

�
zUserDict.__init__z($self, dict=None, /, **kwargs)cCs
t|j�Sr%�rTrr)r!r!r"r��r�zUserDict.__len__cCs:||jkr|j|St|jd�r.|j�||�St|��dS)Nr�)r�hasattrrbr�rMr0r!r!r"r��s


zUserDict.__getitem__cCs||j|<dSr%�r)r*r1�itemr!r!r"rD�r�zUserDict.__setitem__cCs|j|=dSr%rr0r!r!r"rH�r�zUserDict.__delitem__cCs
t|j�Sr%)rgrr)r!r!r"rJ�szUserDict.__iter__cCs
||jkSr%rr0r!r!r"r�szUserDict.__contains__cCs
t|j�Sr%�r�rr)r!r!r"rd�r�zUserDict.__repr__cCs4|j�|j�}|j�|j�|jd��|jd<|S�Nr)rbr�rUrurf�r*�instr!r!r"r�szUserDict.__copy__cCsR|jtkrt|j���Sddl}|j}zi|_|�|�}W5||_X|�|�|Sr�)rbrrrfru)r*rfr�cr!r!r"rfs

z
UserDict.copyNcCs|�}|D]}|||<q
|Sr%r!)rkrlrAr�r1r!r!r"rms
zUserDict.fromkeys)N)rr-r.r@�__text_signature__r�r�rDrHrJrrdrrfryrmr!r!r!r"r�s
c@seZdZd?dd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Zdd�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zd d!�Zd"d#�ZeZd$d%�Zd&d'�Zd(d)�Zd*d+�Zd@d-d.�Zd/d0�Zd1d2�Zd3d4�Zd5d6�Zd7d8�Zd9d:�Zd;d<�Z d=d>�Z!dS)ArNcCsbg|_|dk	r^t|�t|j�kr0||jdd�<n.t|t�rT|jdd�|jdd�<n
t|�|_dSr%)rr�rnrrc)r*�initlistr!r!r"r@!s
zUserList.__init__cCs
t|j�Sr%rr)r!r!r"rd+r�zUserList.__repr__cCs|j|�|�kSr%�r�_UserList__castrsr!r!r"�__lt__,r�zUserList.__lt__cCs|j|�|�kSr%rrsr!r!r"�__le__-r�zUserList.__le__cCs|j|�|�kSr%rrsr!r!r"ro.r�zUserList.__eq__cCs|j|�|�kSr%rrsr!r!r"�__gt__/r�zUserList.__gt__cCs|j|�|�kSr%rrsr!r!r"�__ge__0r�zUserList.__ge__cCst|t�r|jS|Sr%)rnrrrsr!r!r"�__cast1szUserList.__castcCs
||jkSr%r�r*r
r!r!r"r3r�zUserList.__contains__cCs
t|j�Sr%r
r)r!r!r"r�4r�zUserList.__len__cCs(t|t�r|�|j|�S|j|SdSr%)rn�slicerbr�r*�ir!r!r"r�5s
zUserList.__getitem__cCs||j|<dSr%r�r*rr
r!r!r"rD:r�zUserList.__setitem__cCs|j|=dSr%rrr!r!r"rH;r�zUserList.__delitem__cCsPt|t�r|�|j|j�St|t|j��r<|�|j|�S|�|jt|��Sr%�rnrrbrr�rcrsr!r!r"r�<s

zUserList.__add__cCsPt|t�r|�|j|j�St|t|j��r<|�||j�S|�t|�|j�Sr%r!rsr!r!r"�__radd__Bs

zUserList.__radd__cCsRt|t�r|j|j7_n2t|t|j��r<|j|7_n|jt|�7_|Sr%)rnrrr�rcrsr!r!r"r�Hs
zUserList.__iadd__cCs|�|j|�Sr%�rbrr�r!r!r"�__mul__PszUserList.__mul__cCs|j|9_|Sr%rr�r!r!r"�__imul__SszUserList.__imul__cCs8|j�|j�}|j�|j�|jddd�|jd<|Sr)rbr�rUrurr!r!r"rVszUserList.__copy__cCs|j�|�dSr%)r�appendrr!r!r"r&\r�zUserList.appendcCs|j�||�dSr%)r�insertr r!r!r"r']r�zUserList.insertr�cCs|j�|�Sr%)rrErr!r!r"rE^r�zUserList.popcCs|j�|�dSr%)r�removerr!r!r"r(_r�zUserList.removecCs|j��dSr%)rrKr)r!r!r"rK`r�zUserList.clearcCs
|�|�Sr%rjr)r!r!r"rfar�z
UserList.copycCs|j�|�Sr%)rr�rr!r!r"r�br�zUserList.countcGs|jj|f|��Sr%�rr~)r*r
rr!r!r"r~cr�zUserList.indexcCs|j��dSr%)rr�r)r!r!r"r�dr�zUserList.reversecOs|jj||�dSr%)r�sort�r*rr>r!r!r"r*er�z
UserList.sortcCs*t|t�r|j�|j�n|j�|�dSr%)rnrr�extendrsr!r!r"r,fs
zUserList.extend)N)r�)"rr-r.r@rdrrrorrrrr�r�rDrHr�r"r�r$�__rmul__r%rr&r'rEr(rKrfr�r~r�r*r,r!r!r!r"rs>


c@sheZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zdd �Zd!d"�Zd#d$�Zd%d&�ZeZd'd(�Zd)d*�Zd+d,�Zd-d.�Zd/d0�Zd1ejfd2d3�Zd�d6d7�Zd1ejfd8d9�Z d�d;d<�Z!d1ejfd=d>�Z"d?d@�Z#dAdB�Z$d1ejfdCdD�Z%dEdF�Z&dGdH�Z'dIdJ�Z(dKdL�Z)dMdN�Z*dOdP�Z+dQdR�Z,dSdT�Z-dUdV�Z.dWdX�Z/dYdZ�Z0d[d\�Z1d]d^�Z2d_d`�Z3dadb�Z4d�ddde�Z5e6j7Z7dfdg�Z8d�didj�Z9d1ejfdkdl�Z:d1ejfdmdn�Z;dodp�Z<dqdr�Z=d�dsdt�Z>d�dudv�Z?d�dwdx�Z@d�dzd{�ZAd1ejfd|d}�ZBd�d~d�ZCd�d��ZDd�d��ZEd�d��ZFd�d��ZGd�d��ZHdcS)�rcCs<t|t�r||_n&t|t�r.|jdd�|_n
t|�|_dSr%)rnr�rr�r*�seqr!r!r"r@ss


zUserString.__init__cCs
t|j�Sr%)r�rr)r!r!r"�__str__zr�zUserString.__str__cCs
t|j�Sr%rr)r!r!r"rd{r�zUserString.__repr__cCs
t|j�Sr%)�intrr)r!r!r"�__int__|r�zUserString.__int__cCs
t|j�Sr%)�floatrr)r!r!r"�	__float__}r�zUserString.__float__cCs
t|j�Sr%)�complexrr)r!r!r"�__complex__~r�zUserString.__complex__cCs
t|j�Sr%)�hashrr)r!r!r"�__hash__r�zUserString.__hash__cCs|jdd�fSr%rr)r!r!r"r��szUserString.__getnewargs__cCs t|t�r|j|jkS|j|kSr%�rnrr�r*�stringr!r!r"ro�s
zUserString.__eq__cCs t|t�r|j|jkS|j|kSr%r9r:r!r!r"r�s
zUserString.__lt__cCs t|t�r|j|jkS|j|kSr%r9r:r!r!r"r�s
zUserString.__le__cCs t|t�r|j|jkS|j|kSr%r9r:r!r!r"r�s
zUserString.__gt__cCs t|t�r|j|jkS|j|kSr%r9r:r!r!r"r�s
zUserString.__ge__cCst|t�r|j}||jkSr%r9)r*�charr!r!r"r�s
zUserString.__contains__cCs
t|j�Sr%r
r)r!r!r"r��r�zUserString.__len__cCs|�|j|�Sr%r#)r*r~r!r!r"r��r�zUserString.__getitem__cCsJt|t�r|�|j|j�St|t�r6|�|j|�S|�|jt|��Sr%)rnrrbrr�rsr!r!r"r��s


zUserString.__add__cCs.t|t�r|�||j�S|�t|�|j�Sr%)rnr�rbrrsr!r!r"r"�s
zUserString.__radd__cCs|�|j|�Sr%r#r�r!r!r"r$�szUserString.__mul__cCs|�|j|�Sr%r#�r*rr!r!r"r��szUserString.__mod__cCs|�t|�|�Sr%)rbr�)r*�templater!r!r"�__rmod__�szUserString.__rmod__cCs|�|j���Sr%)rbr�
capitalizer)r!r!r"r@�r�zUserString.capitalizecCs|�|j���Sr%)rbr�casefoldr)r!r!r"rA�szUserString.casefoldcGs|�|jj|f|���Sr%)rbr�center�r*�widthrr!r!r"rB�szUserString.centerr
cCs t|t�r|j}|j�|||�Sr%)rnrrr��r*�sub�start�endr!r!r"r��s
zUserString.count�utf-8�strictcCs.|dkrdn|}|dkrdn|}|j�||�S)NrIrJ)r�encode)r*�encoding�errorsr!r!r"rK�szUserString.encodecCs|j�|||�Sr%)r�endswith)r*�suffixrGrHr!r!r"rN�szUserString.endswith�cCs|�|j�|��Sr%)rbr�
expandtabs)r*�tabsizer!r!r"rQ�szUserString.expandtabscCs t|t�r|j}|j�|||�Sr%)rnrr�findrEr!r!r"rS�s
zUserString.findcOs|jj||�Sr%)rr�r+r!r!r"r��szUserString.formatcCs|j�|�Sr%)r�
format_map)r*r�r!r!r"rT�szUserString.format_mapcCs|j�|||�Sr%r)rEr!r!r"r~�szUserString.indexcCs
|j��Sr%)r�isalphar)r!r!r"rU�r�zUserString.isalphacCs
|j��Sr%)r�isalnumr)r!r!r"rV�r�zUserString.isalnumcCs
|j��Sr%)r�isasciir)r!r!r"rW�r�zUserString.isasciicCs
|j��Sr%)r�	isdecimalr)r!r!r"rX�r�zUserString.isdecimalcCs
|j��Sr%)r�isdigitr)r!r!r"rY�r�zUserString.isdigitcCs
|j��Sr%)rr�r)r!r!r"r��r�zUserString.isidentifiercCs
|j��Sr%)r�islowerr)r!r!r"rZ�r�zUserString.islowercCs
|j��Sr%)r�	isnumericr)r!r!r"r[�r�zUserString.isnumericcCs
|j��Sr%)r�isprintabler)r!r!r"r\�r�zUserString.isprintablecCs
|j��Sr%)r�isspacer)r!r!r"r]�r�zUserString.isspacecCs
|j��Sr%)r�istitler)r!r!r"r^�r�zUserString.istitlecCs
|j��Sr%)r�isupperr)r!r!r"r_�r�zUserString.isuppercCs|j�|�Sr%)rr�r.r!r!r"r��r�zUserString.joincGs|�|jj|f|���Sr%)rbr�ljustrCr!r!r"r`�szUserString.ljustcCs|�|j���Sr%)rbr�lowerr)r!r!r"ra�r�zUserString.lowerNcCs|�|j�|��Sr%)rbr�lstrip�r*�charsr!r!r"rb�r�zUserString.lstripcCs|j�|�Sr%)r�	partition�r*�sepr!r!r"re�szUserString.partitionr�cCs6t|t�r|j}t|t�r |j}|�|j�|||��Sr%)rnrrrbr�)r*�old�new�maxsplitr!r!r"r��s


zUserString.replacecCs t|t�r|j}|j�|||�Sr%)rnrr�rfindrEr!r!r"rk�s
zUserString.rfindcCs|j�|||�Sr%)r�rindexrEr!r!r"rl�szUserString.rindexcGs|�|jj|f|���Sr%)rbr�rjustrCr!r!r"rm�szUserString.rjustcCs|j�|�Sr%)r�
rpartitionrfr!r!r"rn�szUserString.rpartitioncCs|�|j�|��Sr%)rbr�rstriprcr!r!r"ro�szUserString.rstripcCs|j�||�Sr%)rr��r*rgrjr!r!r"r��szUserString.splitcCs|j�||�Sr%)r�rsplitrpr!r!r"rq�szUserString.rsplitFcCs|j�|�Sr%)r�
splitlines)r*�keependsr!r!r"rr�r�zUserString.splitlinescCs|j�|||�Sr%)rr�)r*�prefixrGrHr!r!r"r��szUserString.startswithcCs|�|j�|��Sr%)rbr�striprcr!r!r"ru�r�zUserString.stripcCs|�|j���Sr%)rbr�swapcaser)r!r!r"rv�r�zUserString.swapcasecCs|�|j���Sr%)rbr�titler)r!r!r"rw�r�zUserString.titlecGs|�|jj|��Sr%)rbr�	translater=r!r!r"rx�szUserString.translatecCs|�|j���Sr%)rbr�upperr)r!r!r"ry�r�zUserString.uppercCs|�|j�|��Sr%)rbr�zfill)r*rDr!r!r"rz�r�zUserString.zfill)rIrJ)rP)N)r�)N)Nr�)Nr�)F)N)Irr-r.r@r0rdr2r4r6r8r�rorrrrrr�r�r�r"r$r-r�r?r@rArBrR�maxsizer�rKrNrQrSr�rTr~rUrVrWrXrYr�rZr[r\r]r^r_r�r`rarbr��	maketransrer�rkrlrmrnror�rqrrr�rurvrwrxryrzr!r!r!r"rrs�








)6rr�operatorrr}rrr�keywordr
r��sysrR�heapqr��_weakrefrr:�	itertoolsrr�rr�rr��reprlibrrx�_collectionsr�ImportError�MutableSequence�registerrr#�KeysViewr$�	ItemsViewr/�
ValuesViewr2rwr3rLrrzrr�rrtr	rr�Sequencerr!r!r!r"�<module>sf
�Y&}nMSttk.cpython-38.opt-1.pyc000064400000156574151732766100010767 0ustar00U

e5d���@s�dZdZdZddddddd	d
ddd
ddddddddddddddgZddlZddlmZmZmZmZej	dkrpd nd!Z
d"d#�ZdXd$d%�ZdYd&d'�Z
d(d)�ZdZd*d+�Zd[d,d-�Zd\d/d0�Zd1d2�Zd3d4�Zd5d6�Zd7d8�Zd9d:�Zd;d<�Zd=d>�Zd?d�Zd]d@d�ZGdAd�de�ZGdBdC�dCej�ZGdDd�de�ZGdEd�de�ZGdFd�deej �Z GdGd�de �Z!GdHd�de�Z"GdId�de�Z#GdJd	�d	e�Z$e$Z%GdKd�de�Z&GdLd�de�Z'GdMd
�d
eej(�Z)e)Z(GdNd�de�Z*GdOd�de�Z+GdPd�deej,�Z,GdQd�deej-�Z-GdRd�de�Z.GdSd�de�Z/GdTd�de �Z0GdUd�deej1ej2�Z3GdVd�de"�Z4GdWd�de&�Z5dS)^a�Ttk wrapper.

This module provides classes to allow using Tk themed widget set.

Ttk is based on a revised and enhanced version of
TIP #48 (http://tip.tcl.tk/48) specified style engine.

Its basic idea is to separate, to the extent possible, the code
implementing a widget's behavior from the code implementing its
appearance. Widget class bindings are primarily responsible for
maintaining the widget state and invoking callbacks, all aspects
of the widgets appearance lies at Themes.
z0.3.1z!Guilherme Polo <ggpolo@gmail.com>�Button�Checkbutton�Combobox�Entry�Frame�Label�
Labelframe�
LabelFrame�
Menubutton�Notebook�Panedwindow�PanedWindow�Progressbar�Radiobutton�Scale�	Scrollbar�	Separator�Sizegrip�Spinbox�Style�Treeview�LabeledScale�
OptionMenu�
tclobjs_to_py�setup_master�N)�_flatten�_join�
_stringify�
_splitdictg!@TFcCsBtr>ddl}|j�d�}|r,|j�d|�|j�d�d|_dS)NrZTILE_LIBRARYz(global auto_path; lappend auto_path {%s}zpackage require tileT)�
_REQUIRE_TILE�os�environ�get�tk�eval�_tile_loaded)�masterr Ztilelib�r'�#/usr/lib64/python3.8/tkinter/ttk.py�
_load_tile"s��r)cCs(|rt|�}nt|ttf�r$t|�}|S)zInternal function.)r�
isinstance�list�tupler)�value�scriptr'r'r(�_format_optvalue1s

r/cCsPg}|��D]:\}}|r ||kr|�d|�|dk	r|�t||��qt|�S)z�Formats optdict to a tuple to pass it to tk.call.

    E.g. (script=False):
      {'foreground': 'blue', 'padding': [1, 2, 3, 4]} returns:
      ('-foreground', 'blue', '-padding', '1 2 3 4')�-%sN)�items�appendr/r)Zoptdictr.�ignore�opts�optr-r'r'r(�_format_optdict;sr6cCsXg}|D]J�^}}t|�dkr,|dp(d}n
d�|�}|�|�|dk	r|�|�q|S)N�r�� )�len�joinr2)r1Zopt_val�state�valr'r'r(�_mapdict_valuesKs

r>cCs:g}|��D]$\}}|�d|tt|�|�f�qt|�S)z�Formats mapdict to pass it to tk.call.

    E.g. (script=False):
      {'expand': [('active', 'selected', 'grey'), ('focus', [1, 2, 3, 4])]}

      returns:

      ('-expand', '{active selected} grey focus {1, 2, 3, 4}')r0)r1�extendr/r>r)Zmapdictr.r4r5r-r'r'r(�_format_mapdict`s

�r@cOs�d}d}|dkr�|dkrB|d}tt|dd���}d||f}n2|dd�\}}	tt|dd���}
d	||	|
f}t||�}n,|d
kr�|d}t|�dkr�t|d|�f}|r�d|}d�|�}||fS)
zAFormats args and kw according to the given element factory etype.Nr')�imageZvsapirArr7z%s %s�z%s %s %s�fromz{%s}r9)rr>r6r:r/r;)�etyper.�args�kw�specr4ZinameZ	imagespec�
class_nameZpart_idZstatemapr'r'r(�_format_elemcreateqs&
rIrBc
Cs�g}|D]�}|\}}|pi}d�t|dd��}dd|||rDd|ndf}d|kr�|�|d�||7}t|d||�\}	}|�|	�||8}|�d	d|�q|�|�qd
�|�|fS)a$Formats a layout list so we can pass the result to ttk::style
    layout and ttk::style settings. Note that the layout doesn't have to
    be a list necessarily.

    E.g.:
      [("Menubutton.background", None),
       ("Menubutton.button", {"children":
           [("Menubutton.focus", {"children":
               [("Menubutton.padding", {"children":
                [("Menubutton.label", {"side": "left", "expand": 1})]
               })]
           })]
       }),
       ("Menubutton.indicator", {"side": "right"})
      ]

      returns:

      Menubutton.background
      Menubutton.button -children {
        Menubutton.focus -children {
          Menubutton.padding -children {
            Menubutton.label -side left -expand 1
          }
        }
      }
      Menubutton.indicator -side rightr9T)�childrenz%s%s%sz %sr8rJz -children {z%s}�
)r;r6r2�_format_layoutlist)
�layout�indentZindent_sizer.Zlayout_elem�elemr4Zfopts�headZ	newscriptr'r'r(rL�s"
�
rLcCsXg}|��D�]>\}}|�d�rFd�t|dd��}|�d||f�|�d�rvd�t|dd��}|�d||f�d|kr�|ds�d}nt|d�\}}|�d	||f�|�d
�r|d
}|d}d}|t|�kr�t||d
�s�|d7}q�|d|�}	|t|�k�r||�r||ni}
t	|df|	�|
�\}}|�d||||f�qd�|�S)z�Returns an appropriate script, based on settings, according to
    theme_settings definition to be used by theme_settings and
    theme_create.�	configurer9Tzttk::style configure %s %s;�mapzttk::style map %s %s;rM�nullzttk::style layout %s {
%s
}zelement createrr7r1z%ttk::style element create %s %s %s %srK)
r1r"r;r6r2r@rLr:�hasattrrI)�settingsr.�namer4�s�_ZeoptsrDZargcZelemargsZelemkwrGr'r'r(�_script_from_settings�s:



$�
rYcCs�t|t�r|Sg}t|�}t||�D]j\}}t|d�rDt|���}n(t|t�rX|��}nt|ttf�sl|f}t|d�r~t|�}|�||f��q$|S)ztConstruct a list from the given statespec tuple according to the
    accepted statespec accepted by _format_mapdict.�typename)	r*�str�iter�ziprT�splitr,r+r2)Zstuple�result�itr<r=r'r'r(�_list_from_statespec�s




racCs�|�|�}g}d}|t|�kr�||}i}|�||f�|d7}|t|�kr|||d�\}}|�d�slq|dd�}|d7}|dkr�t||�}|||<q@q|S)zpConstruct a list from the tuple returned by ttk::layout, this is
    somewhat the reverse of _format_layoutlist.rr7rB�-NrJ)�	splitlistr:r2�
startswith�_list_from_layouttuple)r#Zltuple�resZindxrVr4r5r=r'r'r(res$


recGs4t|�}|j||�}t|�dr&|St||td�S)ahFormat options then call Tk command with args and options and return
    the appropriate result.

    If no option is specified, a dict is returned. If an option is
    specified with the None value, the value for that option is returned.
    Otherwise, the function just sets the passed options and the caller
    shouldn't be expecting a return value anyway.rB)�conv)r6�callr:r�
_tclobj_to_py)r#�optionsrErfr'r'r(�_val_or_dict!s
rkc	Cs2t|�}zt|�}Wnttfk
r,YnX|S)zAConverts a value to, hopefully, a more appropriate Python object.)r[�int�
ValueError�	TypeError)r-r'r'r(�_convert_stringval1srocCs(t|t�r$d|krt|�}nt|�}|S)N�.)r*r[�floatrl)�xr'r'r(�
_to_number;s


rscCs\|rFt|d�rFt|t�sFt|ddd�dkr6t|�}qXttt|��}nt|d�rXt|�}|S)z8Return value converted from Tcl object to Python object.�__len__rrZNZ	StateSpec)rTr*r[�getattrrar+rRro)r=r'r'r(riCs

ricCs"|��D]\}}t|�||<q|S)zOReturns adict with its values converted from Tcl objects to Python
    objects.)r1ri)Zadictr5r=r'r'r(rPscCs|dkrt��}|S)aIf master is not None, itself is returned. If master is None,
    the default master is returned if there is one, otherwise a new
    master is created and returned.

    If it is not allowed to use the default root and master is None,
    RuntimeError is raised.N)�tkinterZ_get_default_root)r&r'r'r(rXsc@s�eZdZdZdZddd�Zddd�Zddd	�Zdd
d�Zd dd
�Z	dd�Z
dd�Zdd�Zd!dd�Z
dd�Zdd�Zd"dd�ZdS)#rzManipulate style database.z
ttk::styleNcCs0t|�}t|dd�st|�||_|jj|_dS)Nr%F)rrur)r&r#)�selfr&r'r'r(�__init__is
zStyle.__init__cKs4|dk	rd||<t|j||jd|�}|s,|r0|SdS)z�Query or sets the default value of the specified option(s) in
        style.

        Each key in kw is an option and each value is either a string or
        a sequence identifying the value for that option.NrQ)rkr#�_name�rw�styleZ	query_optrFr_r'r'r(rQts
zStyle.configurecsj|dk	r0�j��jd|d|�}t�j�|��S�jj�jd|ft|���}�fdd�t�j|���D�S)aSQuery or sets dynamic values of the specified option(s) in
        style.

        Each key in kw is an option and each value should be a list or a
        tuple (usually) containing statespecs grouped in tuples, or list,
        or something else of your preference. A statespec is compound of
        one or more states and then a value.NrRr0cs"i|]\}}|t�j�|���qSr')rar#rc)�.0�k�v�rwr'r(�
<dictcomp>�s�zStyle.map.<locals>.<dictcomp>)r#rhryrarcr@rr1rzr'rr(rR�s
�z	Style.mapcCs.|rd�|�nd}|j�|jd|d|||�S)aReturns the value specified for option in style.

        If state is specified it is expected to be a sequence of one
        or more states. If the default argument is set, it is used as
        a fallback value in case no specification for option is found.r9r8�lookupr0)r;r#rhry)rwr{�optionr<�defaultr'r'r(r��s
�zStyle.lookupcCs>d}|rt|�d}n|dk	r"d}t|j|j�|jd||��S)a�Define the widget layout for given style. If layoutspec is
        omitted, return the layout specification for given style.

        layoutspec is expected to be a list or an object different than
        None that evaluates to False if you want to "turn off" that style.
        If it is a list (or tuple, or something else), each item should be
        a tuple where the first item is the layout name and the second item
        should have the format described below:

        LAYOUTS

            A layout can contain the value None, if takes no options, or
            a dict of options specifying how to arrange the element.
            The layout mechanism uses a simplified version of the pack
            geometry manager: given an initial cavity, each element is
            allocated a parcel. Valid options/values are:

                side: whichside
                    Specifies which side of the cavity to place the
                    element; one of top, right, bottom or left. If
                    omitted, the element occupies the entire cavity.

                sticky: nswe
                    Specifies where the element is placed inside its
                    allocated parcel.

                children: [sublayout... ]
                    Specifies a list of elements to place inside the
                    element. Each element is a tuple (or other sequence)
                    where the first item is the layout name, and the other
                    is a LAYOUT.NrrSrM)rLrer#rhry)rwr{Z
layoutspecZlspecr'r'r(rM�s �zStyle.layoutcOs8t|df|�|�\}}|jj|jdd|||f|��dS)z9Create a new element in the current theme of given etype.F�element�createN)rIr#rhry)rw�elementnamerDrErFrGr4r'r'r(�element_create�s��zStyle.element_createc	Cs(tdd�|j�|j�|jdd��D��S)z:Returns the list of elements defined in the current theme.css|]}|�d�VqdS�rbN��lstrip)r|�nr'r'r(�	<genexpr>�sz&Style.element_names.<locals>.<genexpr>r��names�r,r#rcrhryrr'r'r(�
element_names�s�zStyle.element_namesc
Cs*tdd�|j�|j�|jdd|��D��S)z)Return the list of elementname's options.css|]}|�d�VqdSr�r�)r|�or'r'r(r��sz(Style.element_options.<locals>.<genexpr>r�rjr�)rwr�r'r'r(�element_options�s�zStyle.element_optionsc
CsN|rt|�nd}|r2|j�|jdd|d|d|�n|j�|jdd|d|�dS)a.Creates a new theme.

        It is an error if themename already exists. If parent is
        specified, the new theme will inherit styles, elements and
        layouts from the specified parent theme. If settings are present,
        they are expected to have the same syntax used for theme_settings.r8�themer�z-parentz	-settingsN�rYr#rhry)rw�	themename�parentrUr.r'r'r(�theme_create�s��zStyle.theme_createcCs"t|�}|j�|jdd||�dS)a�Temporarily sets the current theme to themename, apply specified
        settings and then restore the previous theme.

        Each key in settings is a style and each value may contain the
        keys 'configure', 'map', 'layout' and 'element create' and they
        are expected to have the same format as specified by the methods
        configure, map, layout and element_create respectively.r�rUNr�)rwr�rUr.r'r'r(�theme_settings�szStyle.theme_settingscCs|j�|j�|jdd��S)z#Returns a list of all known themes.r�r�)r#rcrhryrr'r'r(�theme_names�szStyle.theme_namescCs&|dkr|j�d�S|j�d|�dS)z�If themename is None, returns the theme in use, otherwise, set
        the current theme to themename, refreshes all widgets and emits
        a <<ThemeChanged>> event.Nzreturn $ttk::currentThemez
ttk::setTheme)r#r$rh)rwr�r'r'r(�	theme_use�szStyle.theme_use)N)N)N)NN)N)NN)N)�__name__�
__module__�__qualname__�__doc__ryrxrQrRr�rMr�r�r�r�r�r�r�r'r'r'r(rds




+
c@s6eZdZdZddd�Zdd�Zddd�Zd
d	d
�ZdS)�Widgetz!Base class for Tk themed widgets.NcCs4t|�}t|dd�st|�tjj||||d�dS)a�Constructs a Ttk Widget with the parent master.

        STANDARD OPTIONS

            class, cursor, takefocus, style

        SCROLLABLE WIDGET OPTIONS

            xscrollcommand, yscrollcommand

        LABEL WIDGET OPTIONS

            text, textvariable, underline, image, compound, width

        WIDGET STATES

            active, disabled, focus, pressed, selected, background,
            readonly, alternate, invalid
        r%F)rFN)rrur)rvr�rx)rwr&Z
widgetnamerFr'r'r(rxszWidget.__init__cCs|j�|jd||�S)z�Returns the name of the element at position x, y, or the empty
        string if the point does not lie within any element.

        x and y are pixel coordinates relative to the widget.�identify�r#rh�_w�rwrr�yr'r'r(r�+szWidget.identifyc	Os6|j�|j�|jdd�|���}|r2|r2|||�S|S)a1Test the widget's state.

        If callback is not specified, returns True if the widget state
        matches statespec and False otherwise. If callback is specified,
        then it will be invoked with *args, **kw if the widget state
        matches statespec. statespec is expected to be a sequence.�instater9)r#�
getbooleanrhr�r;)rw�	statespec�callbackrErFZretr'r'r(r�3s�
zWidget.instatecCs0|dk	rd�|�}|j�t|j�|jd|���S)aModify or inquire widget state.

        Widget state is returned if statespec is None, otherwise it is
        set according to the statespec flags and then a new state spec
        is returned indicating which flags were changed. statespec is
        expected to be a sequence.Nr9r<)r;r#rcr[rhr�)rwr�r'r'r(r<Bs
zWidget.state)N)N)N)r�r�r�r�rxr�r�r<r'r'r'r(r�
s


r�c@s"eZdZdZddd�Zdd�ZdS)rzcTtk Button widget, displays a textual label and/or image, and
    evaluates a command when pressed.NcKst�||d|�dS)aConstruct a Ttk Button widget with the parent master.

        STANDARD OPTIONS

            class, compound, cursor, image, state, style, takefocus,
            text, textvariable, underline, width

        WIDGET-SPECIFIC OPTIONS

            command, default, width
        zttk::buttonN�r�rx�rwr&rFr'r'r(rxSszButton.__init__cCs|j�|jd�S)z/Invokes the command associated with the button.�invoker�rr'r'r(r�bsz
Button.invoke)N�r�r�r�r�rxr�r'r'r'r(rOs
c@s"eZdZdZddd�Zdd�ZdS)rz;Ttk Checkbutton widget which is either in on- or off-state.NcKst�||d|�dS)a'Construct a Ttk Checkbutton widget with the parent master.

        STANDARD OPTIONS

            class, compound, cursor, image, state, style, takefocus,
            text, textvariable, underline, width

        WIDGET-SPECIFIC OPTIONS

            command, offvalue, onvalue, variable
        zttk::checkbuttonNr�r�r'r'r(rxjszCheckbutton.__init__cCs|j�|jd�S)aWToggles between the selected and deselected states and
        invokes the associated command. If the widget is currently
        selected, sets the option variable to the offvalue option
        and deselects the widget; otherwise, sets the option variable
        to the option onvalue.

        Returns the result of the associated command.r�r�rr'r'r(r�yszCheckbutton.invoke)Nr�r'r'r'r(rgs
c@s2eZdZdZddd�Zdd�Zdd�Zd	d
�ZdS)rzeTtk Entry widget displays a one-line text string and allows that
    string to be edited by the user.NcKst�|||pd|�dS)a�Constructs a Ttk Entry widget with the parent master.

        STANDARD OPTIONS

            class, cursor, style, takefocus, xscrollcommand

        WIDGET-SPECIFIC OPTIONS

            exportselection, invalidcommand, justify, show, state,
            textvariable, validate, validatecommand, width

        VALIDATION MODES

            none, key, focus, focusin, focusout, all
        z
ttk::entryNr�)rwr&ZwidgetrFr'r'r(rx�szEntry.__init__cCs|�|j�|jd|��S)zqReturn a tuple of (x, y, width, height) which describes the
        bounding box of the character given by index.�bbox�Z_getintsr#rhr�)rw�indexr'r'r(r��sz
Entry.bboxcCs|j�|jd||�S)zxReturns the name of the element at position x, y, or the
        empty string if the coordinates are outside the window.r�r�r�r'r'r(r��szEntry.identifycCs|j�|j�|jd��S)z�Force revalidation, independent of the conditions specified
        by the validate option. Returns False if validation fails, True
        if it succeeds. Sets or clears the invalid state accordingly.�validate�r#r�rhr�rr'r'r(r��szEntry.validate)NN)r�r�r�r�rxr�r�r�r'r'r'r(r�s

c@s,eZdZdZd	dd�Zd
dd�Zdd�ZdS)rzMTtk Combobox widget combines a text field with a pop-down list of
    values.NcKstj||df|�dS)aConstruct a Ttk Combobox widget with the parent master.

        STANDARD OPTIONS

            class, cursor, style, takefocus

        WIDGET-SPECIFIC OPTIONS

            exportselection, justify, height, postcommand, state,
            textvariable, values, width
        z
ttk::comboboxN�rrxr�r'r'r(rx�szCombobox.__init__cCs2|dkr |j�|j�|jd��S|j�|jd|�S)aIf newindex is supplied, sets the combobox value to the
        element at position newindex in the list of values. Otherwise,
        returns the index of the current value in the list of values
        or -1 if the current value does not appear in the list.N�current�r#Zgetintrhr�)rwZnewindexr'r'r(r��szCombobox.currentcCs|j�|jd|�dS)z(Sets the value of the combobox to value.�setNr��rwr-r'r'r(r��szCombobox.set)N)N)r�r�r�r�rxr�r�r'r'r'r(r�s


c@seZdZdZddd�ZdS)rzJTtk Frame widget is a container, used to group other widgets
    together.NcKst�||d|�dS)z�Construct a Ttk Frame with parent master.

        STANDARD OPTIONS

            class, cursor, style, takefocus

        WIDGET-SPECIFIC OPTIONS

            borderwidth, relief, padding, width, height
        z
ttk::frameNr�r�r'r'r(rx�szFrame.__init__)N�r�r�r�r�rxr'r'r'r(r�sc@seZdZdZddd�ZdS)rz7Ttk Label widget displays a textual label and/or image.NcKst�||d|�dS)aGConstruct a Ttk Label with parent master.

        STANDARD OPTIONS

            class, compound, cursor, image, style, takefocus, text,
            textvariable, underline, width

        WIDGET-SPECIFIC OPTIONS

            anchor, background, font, foreground, justify, padding,
            relief, text, wraplength
        z
ttk::labelNr�r�r'r'r(rx�s
zLabel.__init__)Nr�r'r'r'r(r�sc@seZdZdZddd�ZdS)rz�Ttk Labelframe widget is a container used to group other widgets
    together. It has an optional label, which may be a plain text string
    or another widget.NcKst�||d|�dS)z�Construct a Ttk Labelframe with parent master.

        STANDARD OPTIONS

            class, cursor, style, takefocus

        WIDGET-SPECIFIC OPTIONS
            labelanchor, text, underline, padding, labelwidget, width,
            height
        zttk::labelframeNr�r�r'r'r(rx�szLabelframe.__init__)Nr�r'r'r'r(r�sc@seZdZdZddd�ZdS)r	zbTtk Menubutton widget displays a textual label and/or image, and
    displays a menu when pressed.NcKst�||d|�dS)aConstruct a Ttk Menubutton with parent master.

        STANDARD OPTIONS

            class, compound, cursor, image, state, style, takefocus,
            text, textvariable, underline, width

        WIDGET-SPECIFIC OPTIONS

            direction, menu
        zttk::menubuttonNr�r�r'r'r(rxszMenubutton.__init__)Nr�r'r'r'r(r	
sc@sneZdZdZddd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
ddd�Zddd�Zdd�Z
dd�ZdS)r
z�Ttk Notebook widget manages a collection of windows and displays
    a single one at a time. Each child window is associated with a tab,
    which the user may select to change the currently-displayed window.NcKst�||d|�dS)a\Construct a Ttk Notebook with parent master.

        STANDARD OPTIONS

            class, cursor, style, takefocus

        WIDGET-SPECIFIC OPTIONS

            height, padding, width

        TAB OPTIONS

            state, sticky, padding, text, image, compound, underline

        TAB IDENTIFIERS (tab_id)

            The tab_id argument found in several methods may take any of
            the following forms:

                * An integer between zero and the number of tabs
                * The name of a child window
                * A positional specification of the form "@x,y", which
                  defines the tab
                * The string "current", which identifies the
                  currently-selected tab
                * The string "end", which returns the number of tabs (only
                  valid for method index)
        z
ttk::notebookNr�r�r'r'r(rx"szNotebook.__init__cKs |jj|jd|ft|���dS)z�Adds a new tab to the notebook.

        If window is currently managed by the notebook but hidden, it is
        restored to its previous position.�addN�r#rhr�r6)rw�childrFr'r'r(r�BszNotebook.addcCs|j�|jd|�dS)zXRemoves the tab specified by tab_id, unmaps and unmanages the
        associated window.�forgetNr��rw�tab_idr'r'r(r�JszNotebook.forgetcCs|j�|jd|�dS)z�Hides the tab specified by tab_id.

        The tab will not be displayed, but the associated window remains
        managed by the notebook and its configuration remembered. Hidden
        tabs may be restored with the add command.�hideNr�r�r'r'r(r�Psz
Notebook.hidecCs|j�|jd||�S)zZReturns the name of the tab element at position x, y, or the
        empty string if none.r�r�r�r'r'r(r�YszNotebook.identifycCs|j�|j�|jd|��S)z|Returns the numeric index of the tab specified by tab_id, or
        the total number of tabs if tab_id is the string "end".r�r�r�r'r'r(r�_szNotebook.indexcKs"|jj|jd||ft|���dS)z�Inserts a pane at the specified position.

        pos is either the string end, an integer index, or the name of
        a managed child. If child is already managed by the notebook,
        moves it to the specified position.�insertNr��rw�posr�rFr'r'r(r�eszNotebook.insertcCs|j�|jd|�S)z�Selects the specified tab.

        The associated child window will be displayed, and the
        previously-selected window (if different) is unmapped. If tab_id
        is omitted, returns the widget name of the currently selected
        pane.�selectr�r�r'r'r(r�nszNotebook.selectcKs$|dk	rd||<t|j||jd|�S)z�Query or modify the options of the specific tab_id.

        If kw is not given, returns a dict of the tab option values. If option
        is specified, returns the value of that option. Otherwise, sets the
        options to the corresponding values.N�tab�rkr#r�)rwr�r�rFr'r'r(r�xszNotebook.tabcCs|j�|j�|jd�pd�S)z2Returns a list of windows managed by the notebook.�tabsr'�r#rcrhr�rr'r'r(r��sz
Notebook.tabscCs|j�d|j�dS)a�Enable keyboard traversal for a toplevel window containing
        this notebook.

        This will extend the bindings for the toplevel window containing
        this notebook as follows:

            Control-Tab: selects the tab following the currently selected
                         one

            Shift-Control-Tab: selects the tab preceding the currently
                               selected one

            Alt-K: where K is the mnemonic (underlined) character of any
                   tab, will select that tab.

        Multiple notebooks in a single toplevel may be enabled for
        traversal, including nested notebooks. However, notebook traversal
        only works properly if all panes are direct children of the
        notebook.zttk::notebook::enableTraversalNr�rr'r'r(�enable_traversal�szNotebook.enable_traversal)N)N)N)r�r�r�r�rxr�r�r�r�r�r�r�r�r�r�r'r'r'r(r
s
 		


c@s>eZdZdZddd�ZejjZdd�Zddd�Z	d
d	d
�Z
dS)rzfTtk Panedwindow widget displays a number of subwindows, stacked
    either vertically or horizontally.NcKst�||d|�dS)z�Construct a Ttk Panedwindow with parent master.

        STANDARD OPTIONS

            class, cursor, style, takefocus

        WIDGET-SPECIFIC OPTIONS

            orient, width, height

        PANE OPTIONS

            weight
        zttk::panedwindowNr�r�r'r'r(rx�szPanedwindow.__init__cKs"|jj|jd||ft|���dS)z�Inserts a pane at the specified positions.

        pos is either the string end, and integer index, or the name
        of a child. If child is already managed by the paned window,
        moves it to the specified position.r�Nr�r�r'r'r(r��szPanedwindow.insertcKs$|dk	rd||<t|j||jd|�S)aQQuery or modify the options of the specified pane.

        pane is either an integer index or the name of a managed subwindow.
        If kw is not given, returns a dict of the pane option values. If
        option is specified then the value for that option is returned.
        Otherwise, sets the options to the corresponding values.N�paner�)rwr�r�rFr'r'r(r��szPanedwindow.panecCs|j�|j�|jd||��S)aLIf newpos is specified, sets the position of sash number index.

        May adjust the positions of adjacent sashes to ensure that
        positions are monotonically increasing. Sash positions are further
        constrained to be between 0 and the total size of the widget.

        Returns the new position of sash number index.�sashposr�)rwr�Znewposr'r'r(r��szPanedwindow.sashpos)N)N)N)r�r�r�r�rxrvrr�r�r�r�r'r'r'r(r�s
	
c@s6eZdZdZddd�Zddd�Zd
dd�Zd	d
�ZdS)r
a6Ttk Progressbar widget shows the status of a long-running
    operation. They can operate in two modes: determinate mode shows the
    amount completed relative to the total amount of work to be done, and
    indeterminate mode provides an animated display to let the user know
    that something is happening.NcKst�||d|�dS)z�Construct a Ttk Progressbar with parent master.

        STANDARD OPTIONS

            class, cursor, style, takefocus

        WIDGET-SPECIFIC OPTIONS

            orient, length, mode, maximum, value, variable, phase
        zttk::progressbarNr�r�r'r'r(rx�szProgressbar.__init__cCs|j�|jd|�dS)z�Begin autoincrement mode: schedules a recurring timer event
        that calls method step every interval milliseconds.

        interval defaults to 50 milliseconds (20 steps/second) if omitted.�startNr�)rwZintervalr'r'r(r��szProgressbar.startcCs|j�|jd|�dS)zRIncrements the value option by amount.

        amount defaults to 1.0 if omitted.�stepNr�)rwZamountr'r'r(r��szProgressbar.stepcCs|j�|jd�dS)zVStop autoincrement mode: cancels any recurring timer event
        initiated by start.�stopNr�rr'r'r(r�szProgressbar.stop)N)N)N)r�r�r�r�rxr�r�r�r'r'r'r(r
�s



c@s"eZdZdZddd�Zdd�ZdS)rzeTtk Radiobutton widgets are used in groups to show or change a
    set of mutually-exclusive options.NcKst�||d|�dS)aConstruct a Ttk Radiobutton with parent master.

        STANDARD OPTIONS

            class, compound, cursor, image, state, style, takefocus,
            text, textvariable, underline, width

        WIDGET-SPECIFIC OPTIONS

            command, value, variable
        zttk::radiobuttonNr�r�r'r'r(rxszRadiobutton.__init__cCs|j�|jd�S)z�Sets the option variable to the option value, selects the
        widget, and invokes the associated command.

        Returns the result of the command, or an empty string if
        no command is specified.r�r�rr'r'r(r�szRadiobutton.invoke)Nr�r'r'r'r(rs
c@s.eZdZdZd	dd�Zd
dd�Zddd�ZdS)rzTtk Scale widget is typically used to control the numeric value of
    a linked variable that varies uniformly over some range.NcKst�||d|�dS)z�Construct a Ttk Scale with parent master.

        STANDARD OPTIONS

            class, cursor, style, takefocus

        WIDGET-SPECIFIC OPTIONS

            command, from, length, orient, to, value, variable
        z
ttk::scaleNr�r�r'r'r(rx'szScale.__init__cKsTtj||f|�}t|td�tf�s,|�|�td|kd|kd|kg�rP|�d�|S)z�Modify or query scale options.

        Setting a value for any of the "from", "from_" or "to" options
        generates a <<RangeChanged>> event.NrC�from_�to�<<RangeChanged>>)r�rQr*�typer[�update�anyZevent_generate)rwZcnfrFZretvalr'r'r(rQ5s

zScale.configurecCs|j�|jd||�S)z�Get the current value of the value option, or the value
        corresponding to the coordinates x, y if they are specified.

        x and y are pixel coordinates relative to the scale widget
        origin.r"r�r�r'r'r(r"Bsz	Scale.get)N)N)NN)r�r�r�r�rxrQr"r'r'r'r(r#s


c@seZdZdZddd�ZdS)rz;Ttk Scrollbar controls the viewport of a scrollable widget.NcKst�||d|�dS)z�Construct a Ttk Scrollbar with parent master.

        STANDARD OPTIONS

            class, cursor, style, takefocus

        WIDGET-SPECIFIC OPTIONS

            command, orient
        zttk::scrollbarNr�r�r'r'r(rxNszScrollbar.__init__)Nr�r'r'r'r(rKsc@seZdZdZddd�ZdS)rzITtk Separator widget displays a horizontal or vertical separator
    bar.NcKst�||d|�dS)z�Construct a Ttk Separator with parent master.

        STANDARD OPTIONS

            class, cursor, style, takefocus

        WIDGET-SPECIFIC OPTIONS

            orient
        zttk::separatorNr�r�r'r'r(rx`szSeparator.__init__)Nr�r'r'r'r(r\sc@seZdZdZddd�ZdS)rzlTtk Sizegrip allows the user to resize the containing toplevel
    window by pressing and dragging the grip.NcKst�||d|�dS)z�Construct a Ttk Sizegrip with parent master.

        STANDARD OPTIONS

            class, cursor, state, style, takefocus
        z
ttk::sizegripNr�r�r'r'r(rxrszSizegrip.__init__)Nr�r'r'r'r(rnsc@s"eZdZdZddd�Zdd�ZdS)rz�Ttk Spinbox is an Entry with increment and decrement arrows

    It is commonly used for number entry or to select from a list of
    string values.
    NcKstj||df|�dS)a/Construct a Ttk Spinbox widget with the parent master.

        STANDARD OPTIONS

            class, cursor, style, takefocus, validate,
            validatecommand, xscrollcommand, invalidcommand

        WIDGET-SPECIFIC OPTIONS

            to, from_, increment, values, wrap, format, command
        zttk::spinboxNr�r�r'r'r(rx�szSpinbox.__init__cCs|j�|jd|�dS)z'Sets the value of the Spinbox to value.r�Nr�r�r'r'r(r��szSpinbox.set)N)r�r�r�r�rxr�r'r'r'r(r|s
c@s4eZdZdZdEdd�ZdFdd�ZdGdd�Zd	d
�ZdHdd�Zd
d�Z	dd�Z
dd�ZdIdd�ZdJdd�Z
dd�Zdd�Zdd�Zdd�Zdd �Zd!d"�ZdKd#d$�ZdLd%d&�Zd'd(�ZeZd)d*�Zd+d,�Zd-d.�Zd/d0�Zd1d2�Zd3d4�Zd5d6�Zd7d8�Zd9d:�Z d;d<�Z!dMd=d>�Z"dNd?d@�Z#dOdAdB�Z$dPdCdD�Z%dS)Qrz�Ttk Treeview widget displays a hierarchical collection of items.

    Each item has a textual label, an optional image, and an optional list
    of data values. The data values are displayed in successive columns
    after the tree label.NcKst�||d|�dS)a�Construct a Ttk Treeview with parent master.

        STANDARD OPTIONS

            class, cursor, style, takefocus, xscrollcommand,
            yscrollcommand

        WIDGET-SPECIFIC OPTIONS

            columns, displaycolumns, height, padding, selectmode, show

        ITEM OPTIONS

            text, image, values, open, tags

        TAG OPTIONS

            foreground, background, font, image
        z
ttk::treeviewNr�r�r'r'r(rx�szTreeview.__init__cCs|�|j�|jd||��pdS)aTReturns the bounding box (relative to the treeview widget's
        window) of the specified item in the form x y width height.

        If column is specified, returns the bounding box of that cell.
        If the item is not visible (i.e., if it is a descendant of a
        closed item or is scrolled offscreen), returns an empty string.r�r8r�)rw�item�columnr'r'r(r��sz
Treeview.bboxcCs"|j�|j�|jd|pd�pd�S)zhReturns a tuple of children belonging to item.

        If item is not specified, returns root children.rJr8r'r��rwr�r'r'r(�get_children�s�zTreeview.get_childrencGs|j�|jd||�dS)z�Replaces item's child with newchildren.

        Children present in item that are not present in newchildren
        are detached from tree. No items in newchildren may be an
        ancestor of item.rJNr�)rwr�Znewchildrenr'r'r(�set_children�szTreeview.set_childrencKs$|dk	rd||<t|j||jd|�S)a
Query or modify the options for the specified column.

        If kw is not given, returns a dict of the column option values. If
        option is specified then the value for that option is returned.
        Otherwise, sets the options to the corresponding values.Nr�r�)rwr�r�rFr'r'r(r��szTreeview.columncGs|j�|jd|�dS)z_Delete all specified items and all their descendants. The root
        item may not be deleted.�deleteNr��rwr1r'r'r(r��szTreeview.deletecGs|j�|jd|�dS)z�Unlinks all of the specified items from the tree.

        The items and all of their descendants are still present, and may
        be reinserted at another point in the tree, but will not be
        displayed. The root item may not be detached.�detachNr�r�r'r'r(r��szTreeview.detachcCs|j�|j�|jd|��S)zSReturns True if the specified item is present in the tree,
        False otherwise.�existsr�r�r'r'r(r��szTreeview.existscCs|j�|jd|�S)z}If item is specified, sets the focus item to item. Otherwise,
        returns the current focus item, or '' if there is none.�focusr�r�r'r'r(r��szTreeview.focuscKsP|�d�}|r,t|t�s,|j�||j�|d<|dk	r<d||<t|j||jd|�S)a_Query or modify the heading options for the specified column.

        If kw is not given, returns a dict of the heading option values. If
        option is specified then the value for that option is returned.
        Otherwise, sets the options to the corresponding values.

        Valid options/values are:
            text: text
                The text to display in the column heading
            image: image_name
                Specifies an image to display to the right of the column
                heading
            anchor: anchor
                Specifies how the heading text should be aligned. One of
                the standard Tk anchor values
            command: callback
                A callback to be invoked when the heading label is
                pressed.

        To configure the tree column heading, call this with column = "#0" �commandN�heading)	r"r*r[r&�registerZ_substituterkr#r�)rwr�r�rF�cmdr'r'r(r��s
zTreeview.headingcCs|j�|jd|||�S)z�Returns a description of the specified component under the
        point given by x and y, or the empty string if no such component
        is present at that position.r�r�)rwZ	componentrrr�r'r'r(r�szTreeview.identifycCs|�dd|�S)z.Returns the item ID of the item at position y.�rowr�r�)rwr�r'r'r(�identify_rowszTreeview.identify_rowcCs|�d|d�S)zaReturns the data column identifier of the cell at position x.

        The tree column has ID #0.r�rr�)rwrrr'r'r(�identify_column"szTreeview.identify_columncCs|�d||�S)z�Returns one of:

        heading: Tree heading area.
        separator: Space between two columns headings;
        tree: The tree area.
        cell: A data cell.

        * Availability: Tk 8.6Zregionr�r�r'r'r(�identify_region)s	zTreeview.identify_regioncCs|�d||�S)zEReturns the element at position x, y.

        * Availability: Tk 8.6r�r�r�r'r'r(�identify_element5szTreeview.identify_elementcCs|j�|j�|jd|��S)zOReturns the integer index of item within its parent's list
        of children.r�r�r�r'r'r(r�<szTreeview.indexcKsNt|�}|dk	r0|jj|jd||d|f|��}n|jj|jd||f|��}|S)a�Creates a new item and return the item identifier of the newly
        created item.

        parent is the item ID of the parent item, or the empty string
        to create a new top-level item. index is an integer, or the value
        end, specifying where in the list of parent's children to insert
        the new item. If index is less than or equal to zero, the new node
        is inserted at the beginning, if index is greater than or equal to
        the current number of children, it is inserted at the end. If iid
        is specified, it is used as the item identifier, iid must not
        already exist in the tree. Otherwise, a new unique identifier
        is generated.Nr�z-id)r6r#rhr�)rwr�r�ZiidrFr4rfr'r'r(r�Bs
��zTreeview.insertcKs$|dk	rd||<t|j||jd|�S)a-Query or modify the options for the specified item.

        If no options are given, a dict with options/values for the item
        is returned. If option is specified then the value for that option
        is returned. Otherwise, sets the options to the corresponding
        values as given by kw.Nr�r�)rwr�r�rFr'r'r(r�Ysz
Treeview.itemcCs|j�|jd|||�dS)aRMoves item to position index in parent's list of children.

        It is illegal to move an item under one of its descendants. If
        index is less than or equal to zero, item is moved to the
        beginning, if greater than or equal to the number of children,
        it is moved to the end. If item was detached it is reattached.�moveNr�)rwr�r�r�r'r'r(r�esz
Treeview.movecCs|j�|jd|�S)zeReturns the identifier of item's next sibling, or '' if item
        is the last child of its parent.�nextr�r�r'r'r(r�qsz
Treeview.nextcCs|j�|jd|�S)zaReturns the ID of the parent of item, or '' if item is at the
        top level of the hierarchy.r�r�r�r'r'r(r�wszTreeview.parentcCs|j�|jd|�S)zjReturns the identifier of item's previous sibling, or '' if
        item is the first child of its parent.�prevr�r�r'r'r(r�}sz
Treeview.prevcCs|j�|jd|�dS)z�Ensure that item is visible.

        Sets all of item's ancestors open option to True, and scrolls
        the widget if necessary so that item is within the visible
        portion of the tree.�seeNr�r�r'r'r(r��szTreeview.seecCs|j�|j�|jd��S)z$Returns the tuple of selected items.�	selectionr�rr'r'r(r��szTreeview.selectioncCs>t|�dkr&t|dttf�r&|d}|j�|jd||�dS)Nr7rr�)r:r*r,r+r#rhr�)rwZselopr1r'r'r(�
_selection�szTreeview._selectioncGs|�d|�dS)z.The specified items becomes the new selection.r�N�r�r�r'r'r(�
selection_set�szTreeview.selection_setcGs|�d|�dS)z0Add all of the specified items to the selection.r�Nr�r�r'r'r(�
selection_add�szTreeview.selection_addcGs|�d|�dS)z5Remove all of the specified items from the selection.�removeNr�r�r'r'r(�selection_remove�szTreeview.selection_removecGs|�d|�dS)z2Toggle the selection state of each specified item.ZtoggleNr�r�r'r'r(�selection_toggle�szTreeview.selection_togglecCs@|j�|jd|||�}|dkr8|dkr8t|j|dtd�S|SdS)a;Query or set the value of given item.

        With one argument, return a dictionary of column/value pairs
        for the specified item. With two arguments, return the current
        value of the specified column. With three arguments, set the
        value of given column in given item to the specified value.r�NF)Z	cut_minusrg)r#rhr�rri)rwr�r�r-rfr'r'r(r��s�zTreeview.setcCs |j|jdd|f||dd�dS)z�Bind a callback for the given event sequence to the tag tagname.
        When an event is delivered to an item, the callbacks for each
        of the item's tags option are called.�tag�bindr)r�N)Z_bindr�)rw�tagnameZsequencer�r'r'r(�tag_bind�szTreeview.tag_bindcKs&|dk	rd||<t|j||jdd|�S)aBQuery or modify the options for the specified tagname.

        If kw is not given, returns a dict of the option settings for tagname.
        If option is specified, returns the value for that option for the
        specified tagname. Otherwise, sets the options to the corresponding
        values for the given tagname.Nr�rQr�)rwr�r�rFr'r'r(�
tag_configure�s
�zTreeview.tag_configurec	CsF|dkr$|j�|j�|jdd|��S|j�|j�|jdd||��SdS)z�If item is specified, returns 1 or 0 depending on whether the
        specified item has the given tagname. Otherwise, returns a list of
        all items which have the specified tag.

        * Availability: Tk 8.6Nr�Zhas)r#rcrhr�r�)rwr�r�r'r'r(�tag_has�s��zTreeview.tag_has)N)N)N)N)N)N)N)N)NN)NN)N)N)&r�r�r�r�rxr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�Zreattachr�r�r�r�r�r�r�r�r�r�r�r�r�r�r'r'r'r(r�sF



	
	

 

		



csLeZdZdZddd�Z�fdd�Zd	d
�Zedd��Zej	d
d��Z�Z
S)rz�A Ttk Scale widget with a Ttk Label widget indicating its
    current value.

    The Ttk Scale can be accessed through instance.scale, and Ttk Label
    can be accessed through instance.labelNr�
c	Ks|�dd�dk|_tj||f|�|p.t�|�|_|j�|�||_t	|�|_
t||j||d�|_|j�
d|j�|jr|dnd}|dkr�dnd}|jj|dd�t	|�}|j|d�|��|j
j|dkr�d	nd
d�|j�d|j�|_|�
d
|j�|�
d|j�dS)a�Construct a horizontal LabeledScale with parent master, a
        variable to be associated with the Ttk Scale widget and its range.
        If variable is not specified, a tkinter.IntVar is created.

        WIDGET-SPECIFIC OPTIONS

            compound: 'top' or 'bottom'
                Specifies how to display the label relative to the scale.
                Defaults to 'top'.
        Zcompound�top)�variabler�r�r�Zbottomrr)�sideZfill)r�r�rW)Zanchor�wz<Configure>z<Map>N)�pop�
_label_toprrxrvZIntVar�	_variabler��_last_validr�labelr�scaler��_adjustZpack�lowerZplaceZtrace_variable�_LabeledScale__tracecb)	rwr&r�r�r�rFZ
scale_sideZ
label_sideZdummyr'r'r(rx�s$
zLabeledScale.__init__csHz|j�d|j�Wntk
r(YnX|`t���d|_d|_dS)z9Destroy this widget and possibly its associated variable.r�N)r�Z
trace_vdeleter�AttributeError�super�destroyrrr��	__class__r'r(rs
zLabeledScale.destroycs��fdd�}t�jd�}t�jd�}||kr:||}}�j��}||krX|ksfn�j�_dS|�_|�jd<��|�dS)z1Adjust the label position according to the scale.csZ����j��\}}�jr2�j���j��}n�j���j��}�jj||d�dS)N�rrr�)Zupdate_idletasksrZcoordsr�Zwinfo_yrZwinfo_reqheightZplace_configurerrr'r(�adjust_labelsz*LabeledScale._adjust.<locals>.adjust_labelrCr�N�text)rsrr�r"rr-rZ
after_idle)rwrErr�r�Znewvalr'rr(rs


zLabeledScale._adjustcCs
|j��S)zReturn current scale value.)r�r"rr'r'r(r-4szLabeledScale.valuecCs|j�|�dS)zSet new scale value.N)r�r�)rwr=r'r'r(r-9s)NNrr�)r�r�r�r�rxrr�propertyr-�setter�
__classcell__r'r'r	r(r�s
&

cs<eZdZdZddd�Zdd�Zddd�Z�fd	d
�Z�ZS)
rzmThemed OptionMenu, based after tkinter's OptionMenu, which allows
    the user to select a value from a menu.NcOs�||�dd�|�dd�d�}tj||f|�tj|dd�|d<||_|�dd�|_|rpt�d	tt	|�
�����|j|f|��dS)
a9Construct a themed OptionMenu widget with master as the parent,
        the resource textvariable set to variable, the initially selected
        value specified by the default parameter, the menu values given by
        *values and additional keywords.

        WIDGET-SPECIFIC OPTIONS

            style: stylename
                Menubutton style.
            direction: 'above', 'below', 'left', 'right', or 'flush'
                Menubutton direction.
            command: callback
                A callback that will be invoked after selecting an item.
        r{N�	direction)Ztextvariabler{rF)Ztearoff�menur�zunknown option -%s)r�r	rxrvZMenur��	_callbackZTclErrorr�r\�keys�set_menu)rwr&r�r��values�kwargsrFr'r'r(rxCs
��zOptionMenu.__init__cCs&|dkr|�t�||��St�||�S)Nr)Znametowidgetr	�__getitem__r�r'r'r(r`szOptionMenu.__getitem__cGsR|d}|�dd�|D]$}|j|t�|j||j�|jd�q|rN|j�|�dS)zUBuild a new menu of radiobuttons with *values and optionally
        a default value.rr�end)rr�r�N)r�Zadd_radiobuttonrvZ_setitr�rr�)rwr�rrr=r'r'r(rgs�zOptionMenu.set_menucs,z|`Wntk
rYnXt���dS)z0Destroy this widget and its associated variable.N)r�rrrrr	r'r(rus
zOptionMenu.destroy)N)N)	r�r�r�r�rxrrrrr'r'r	r(r?s


)F)FN)F)F)rrB)N)6r��__version__�
__author__�__all__rvrrrrZ	TkVersionrr)r/r6r>r@rIrLrYrarerkrorsrirr�objectrr�rrrrrrrrr	r
rrr
rrrrrrZXViewZYViewrrrr'r'r'r(�<module>s��	




%
1*


*B*"8*(J`__main__.cpython-38.opt-2.pyc000064400000000421151732766100011661 0ustar00U

e5d��@s8ddlZejd�d�r"dejd<ddlmZe�dS)�Nz__main__.pyzpython -m tkinter�)�_test)�sys�argv�endswith�r�main�r	r	�(/usr/lib64/python3.8/tkinter/__main__.py�<module>s
tix.cpython-38.opt-1.pyc000064400000233061151732766100010754 0ustar00U

e5d-,�@sLddlZddlZddlTddlmZddlZdZdZdZdZdZd	Z	d
Z
dZdZd
Z
dZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZGdd �d �Z Gd!d"�d"ej!e �Z!Gd#d$�d$�Z"ej#j$e"fej#_$Gd%d&�d&ej#�Z%Gd'd(�d(e%�Z&Gd)d*�d*�Z'Gd+d,�d,e%�Z(Gd-d.�d.e%�Z)Gd/d0�d0e%�Z*Gd1d2�d2e%�Z+Gd3d4�d4e%�Z,Gd5d6�d6e%�Z-Gd7d8�d8e%�Z.Gd9d:�d:e%�Z/Gd;d<�d<e%�Z0Gd=d>�d>e%�Z1Gd?d@�d@e%�Z2GdAdB�dBe%�Z3GdCdD�dDe%�Z4GdEdF�dFe%e5e6�Z7GdGdH�dHe%�Z8GdIdJ�dJe%�Z9GdKdL�dLe%�Z:GdMdN�dNe%�Z;GdOdP�dPe%�Z<GdQdR�dRe%�Z=GdSdT�dTe%�Z>GdUdV�dVe%�Z?GdWdX�dXe%�Z@GdYdZ�dZe%�ZAGd[d\�d\e%�ZBGd]d^�d^e%�ZCGd_d`�d`e%�ZDGdadb�dbe%�ZEGdcdd�dde%�ZFGdedf�dfe%�ZGGdgdh�dhe%�ZHGdidj�dje%�ZIGdkdl�dle%�ZJGdmdn�dne%�ZKGdodp�dpe%e5e6�ZLGdqdr�dre%�ZMGdsdt�dte%�ZNGdudv�dveOe&�ZPGdwdx�dxeQe&�ZRGdydz�dzeSe&�ZTGd{d|�d|eUe&�ZVGd}d~�d~eWe&�ZXGdd��d�eYe&�ZZGd�d��d�e[e&�Z\Gd�d��d�e]e&�Z^Gd�d��d�e_e&�Z`Gd�d��d�eae&�ZbGd�d��d�eDe&�ZcGd�d��d�e7e&�ZdGd�d��d�eCe&�ZeGd�d��d�eLe&�ZfGd�d��d�e*e&�ZgGd�d��d�e,e&�ZhGd�d��d�e.e&�ZiGd�d��d�e/e&�ZjGd�d��d�e2e&�ZkGd�d��d�e*e&�ZlGd�d��d�eKe&�ZmGd�d��d�e>e&�ZnGd�d��d�e@e&�Zod�d��Zpd�d��ZqGd�d��d�e%�ZrGd�d��d�e%e5e6�ZsGd�d��d�es�ZtdS)��N)�*)�	_cnfmerge�window�textZstatusZ	immediate�imageZ	imagetextZballoon�autoZ	acrosstop�asciiZcell�columnZ
decreasingZ
increasingZinteger�main�max�real�rowzs-regionzx-regionzy-region����� c@sVeZdZdZdd�Zdd�Zddd�Zdd	d
�Zdd�Zd
d�Z	dd�Z
ddd�ZdS)�
tixCommanda�The tix commands provide access to miscellaneous  elements
    of  Tix's  internal state and the Tix application context.
    Most of the information manipulated by these  commands pertains
    to  the  application  as a whole, or to a screen or
    display, rather than to a particular window.

    This is a mixin class, assumed to be mixed to Tkinter.Tk
    that supports the self.tk.call method.
    cCs|j�dd|�S)a�Tix maintains a list of directories under which
        the  tix_getimage  and tix_getbitmap commands will
        search for image files. The standard bitmap  directory
        is $TIX_LIBRARY/bitmaps. The addbitmapdir command
        adds directory into this list. By  using  this
        command, the  image  files  of an applications can
        also be located using the tix_getimage or tix_getbitmap
        command.
        �tixZaddbitmapdir��tk�call)�selfZ	directory�r�#/usr/lib64/python3.8/tkinter/tix.py�tix_addbitmapdirRs
ztixCommand.tix_addbitmapdircCs|j�dd|�S)z�Returns  the  current  value  of the configuration
        option given by option. Option may be  any  of  the
        options described in the CONFIGURATION OPTIONS section.
        r�cgetr�r�optionrrr�tix_cget^sztixCommand.tix_cgetNcKsd|rt||f�}n|rt|�}|dkr2|�dd�St|t�rN|�ddd|�S|j�d|�|��S)a�Query or modify the configuration options of the Tix application
        context. If no option is specified, returns a dictionary all of the
        available options.  If option is specified with no value, then the
        command returns a list describing the one named option (this list
        will be identical to the corresponding sublist of the value
        returned if no option is specified).  If one or more option-value
        pairs are specified, then the command modifies the given option(s)
        to have the given value(s); in this case the command returns an
        empty string. Option may be any of the configuration options.
        Nr�	configure�-)rr )r�
_getconfigure�
isinstance�strZ_getconfigure1rr�_options�r�cnf�kwrrr�
tix_configurees
ztixCommand.tix_configurecCs*|dk	r|j�dd|�S|j�dd�SdS)a�Returns the file selection dialog that may be shared among
        different calls from this application.  This command will create a
        file selection dialog widget when it is called the first time. This
        dialog will be returned by all subsequent calls to tix_filedialog.
        An optional dlgclass parameter can be passed to specified what type
        of file selection dialog widget is desired. Possible options are
        tix FileSelectDialog or tixExFileSelectDialog.
        NrZ
filedialogr)rZdlgclassrrr�tix_filedialog{s	ztixCommand.tix_filedialogcCs|j�dd|�S)a�Locates a bitmap file of the name name.xpm or name in one of the
        bitmap directories (see the tix_addbitmapdir command above).  By
        using tix_getbitmap, you can avoid hard coding the pathnames of the
        bitmap files in your application. When successful, it returns the
        complete pathname of the bitmap file, prefixed with the character
        '@'.  The returned value can be used to configure the -bitmap
        option of the TK and Tix widgets.
        rZ	getbitmapr�r�namerrr�
tix_getbitmap�s	ztixCommand.tix_getbitmapcCs|j�dd|�S)a�Locates an image file of the name name.xpm, name.xbm or name.ppm
        in one of the bitmap directories (see the addbitmapdir command
        above). If more than one file with the same name (but different
        extensions) exist, then the image type is chosen according to the
        depth of the X display: xbm images are chosen on monochrome
        displays and color images are chosen on color displays. By using
        tix_ getimage, you can avoid hard coding the pathnames of the
        image files in your application. When successful, this command
        returns the name of the newly created image, which can be used to
        configure the -image option of the Tk and Tix widgets.
        rZgetimagerr+rrr�tix_getimage�sztixCommand.tix_getimagecCs|j�ddd|�S)a@Gets  the options  maintained  by  the  Tix
        scheme mechanism. Available options include:

            active_bg       active_fg      bg
            bold_font       dark1_bg       dark1_fg
            dark2_bg        dark2_fg       disabled_fg
            fg              fixed_font     font
            inactive_bg     inactive_fg    input1_bg
            input2_bg       italic_font    light1_bg
            light1_fg       light2_bg      light2_fg
            menu_font       output1_bg     output2_bg
            select_bg       select_fg      selector
            rr�getrr+rrr�tix_option_get�sztixCommand.tix_option_getcCs2|dk	r|j�dd|||�S|j�dd||�SdS)a�Resets the scheme and fontset of the Tix application to
        newScheme and newFontSet, respectively.  This affects only those
        widgets created after this call. Therefore, it is best to call the
        resetoptions command before the creation of any widgets in a Tix
        application.

        The optional parameter newScmPrio can be given to reset the
        priority level of the Tk options set by the Tix schemes.

        Because of the way Tk handles the X option database, after Tix has
        been has imported and inited, it is not possible to reset the color
        schemes and font sets using the tix config command.  Instead, the
        tix_resetoptions command must be used.
        NrZresetoptionsr)rZ	newSchemeZ
newFontSetZ
newScmPriorrr�tix_resetoptions�sztixCommand.tix_resetoptions)N)N)N)�__name__�
__module__�__qualname__�__doc__rrr)r*r-r.r0r1rrrrrGs


rc@s"eZdZdZddd�Zdd�ZdS)	�Tkz{Toplevel widget of Tix which represents mostly the main window
    of an application. It has an associated Tcl interpreter.N�TixcCsbtj�||||�tj�d�}|j�d�|dk	rR|j�d|�|j�d|�|j�d�dS)NZTIX_LIBRARYz<global auto_path; lappend auto_path [file dir [info nameof]]z(global auto_path; lappend auto_path {%s}z,global tcl_pkgPath; lappend tcl_pkgPath {%s}zpackage require Tix)�tkinterr6�__init__�os�environr/r�eval)rZ
screenNameZbaseNameZ	classNameZtixlibrrrr9�szTk.__init__cCs|�dd�tj�|�dS)NZWM_DELETE_WINDOW�)Zprotocolr8r6�destroy�rrrrr>�sz
Tk.destroy)NNr7�r2r3r4r5r9r>rrrrr6�s
r6c@sTeZdZdZifdd�ZeZdd�Zdd�Zdd	�Zddd�Z	ddd�Z
dd�Zd
S)�Formz�The Tix Form geometry manager

    Widgets can be arranged by specifying attachments to other widgets.
    See Tix documentation for complete detailscKs"|jjd|jf|�||���dS)N�tixForm�rr�_wr%r&rrr�config�szForm.configcCst�|||i�dS�N)rA�form�r�key�valuerrr�__setitem__�szForm.__setitem__cCs|j�dd|j�S)NrB�check�rrrDr?rrrrL�sz
Form.checkcCs|j�dd|j�dS)NrB�forgetrMr?rrrrN�szForm.forgetrcCs`|sJ|sJ|j�dd|j�}|j�|�}d}|D]}||j�|�f}q.|S|j�dd|j||�S)NrB�gridr)rrrD�	splitlistZgetint)rZxsizeZysize�x�y�zrrrrO�sz	Form.gridNcCs>|s|j�dd|j�S|ddkr*d|}|j�dd|j|�S)NrB�inforr!rMrrrrrT�s
z	Form.infocs(�fdd��j��j�dd�j��D�S)Ncsg|]}��|��qSr)�
_nametowidget��.0rQr?rr�
<listcomp>szForm.slaves.<locals>.<listcomp>rB�slaves�rrPrrDr?rr?rrYs
���zForm.slaves)rr)N)r2r3r4r5rErGrKrLrNrOrTrYrrrrrA�s


rAc@sreZdZdZdddiifdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zidfdd�Zdd�Z
dS)�	TixWidgetaQA TixWidget class is used to package all (or most) Tix widgets.

    Widget initialization is extended in two ways:
       1) It is possible to give a list of options which must be part of
       the creation command (so called Tix 'static' options). These cannot be
       given as a 'config' command later.
       2) It is possible to give the name of an existing TK widget. These are
       child widgets created automatically by a Tix mega-widget. The Tk call
       to create these widgets is therefore bypassed in TixWidget.__init__

    Both options are for use by subclasses only.
    Nc	Cs�|rt||f�}nt|�}d}|r.|�d�ndg}t|���D]&\}}||kr@|d||f}||=q@||_t�|||�|r�|jj||j	f|��|r�t�
||�i|_dS)Nr�optionsr!)r�append�list�items�
widgetName�Widget�_setuprrrDrE�subwidget_list)	r�masterr`Zstatic_optionsr'r(Zextra�k�vrrrr9s$zTixWidget.__init__cCs ||jkr|j|St|��dSrF)rc�AttributeErrorr+rrr�__getattr__Gs

zTixWidget.__getattr__cCs|j�d|j|�dS)z1Set a variable without calling its action routineZtixSetSilentNrM)rrJrrr�
set_silentLszTixWidget.set_silentcCsD|�|�}|s$td|d|j��|t|j�dd�}|�|�S)zSReturn the named subwidget (which must have been created by
        the sub-class).z
Subwidget z not child of �N)�_subwidget_name�TclError�_name�lenrDrU)rr,�nrrr�	subwidgetPs

zTixWidget.subwidgetcCsZ|��}|sgSg}|D]<}|t|j�dd�}z|�|�|��WqYqXq|S)zReturn all subwidgets.rjN)�_subwidget_namesrnrDr]rU)r�namesZretlistr,rrr�subwidgets_allZszTixWidget.subwidgets_allcCs0z|j�|jd|�WStk
r*YdSXdS)z7Get a subwidget name (returns a String, not a Widget !)rpN)rrrDrlr+rrrrkiszTixWidget._subwidget_namecCs<z |j�|jdd�}|j�|�WStk
r6YdSXdS)z"Return the name of all subwidgets.Z
subwidgetsz-allN)rrrDrPrl)rrQrrrrqps
zTixWidget._subwidget_namescCs\|dkrdSt|t�st|�}t|t�s0t|�}|��}|D]}|j�|dd||�q<dS)z8Set configuration options for all subwidgets (and self).r=Nr r!)r#r$�reprrqrr)rrrJrrr,rrr�
config_allxs

zTixWidget.config_allcKst|s|}|r|rt||f�}n|r&|}d}|��D]*\}}t|�rL|�|�}|d||f}q2|j�dd|f|�S)Nrr!r�create)rr_�callable�	_registerrr)rZimgtyper'rdr(r\rerfrrr�image_create�s
zTixWidget.image_createcCs.z|j�dd|�Wntk
r(YnXdS)Nr�delete)rrrl)rZimgnamerrr�image_delete�szTixWidget.image_delete)r2r3r4r5r9rhrirprsrkrqruryr{rrrrr[
s�
-
r[c@s"eZdZdZddd�Zdd�ZdS)	�TixSubWidgetz�Subwidget class.

    This is used to mirror child widgets automatically created
    by Tix/Tk as part of a mega-widget in Python (which is not informed
    of this)rjc
Cs�|rD|�|�}z$|t|j�dd�}|�d�}Wng}YnX|s`t�||ddd|i�n�|}tt|�d�D]V}d�|d|d��}	z|�|	�}
|
}Wqtt	k
r�t
|||ddd�}YqtXqt|r�|d}t�||ddd|i�||_dS)Nrj�.r,r)�destroy_physically�check_intermediate���)rkrnrD�splitr[r9�range�joinrU�KeyErrorr|r~)rrdr,r~r�pathZplist�parent�iro�wrrrr9�s0



�zTixSubWidget.__init__cCsjt|j���D]}|��q|j|jjkr6|jj|j=|j|jjkrP|jj|j=|jrf|j�	d|j
�dS)Nr>)r^�children�valuesr>rmrdrcr~rrrD�r�crrrr>�s
zTixSubWidget.destroyN)rjrjr@rrrrr|�s
�
 r|c@sVeZdZdZifdd�dd�Zdd�Zdd	�Zd
d�Zdd
�Zifdd�Z	dd�Z
dS)�DisplayStylezRDisplayStyle - handle configuration options shared by
    (multiple) Display ItemsN)rdcKs\|s2d|kr|d}nd|kr(|d}n
t�d�}|j|_|jjd|f|�||���|_dS)NZ	refwindowzcreate display styleZtixDisplayStyle)r8Z_get_default_rootrrr%�	stylename)r�itemtyper'rdr(rrrr9�s



�zDisplayStyle.__init__cCs|jSrF)r�r?rrr�__str__�szDisplayStyle.__str__cCsH|r|rt||f�}n|r|}d}|��D]\}}|d||f}q*|S)Nrr!)rr_)rr'r(Zoptsrerfrrrr%�szDisplayStyle._optionscCs|j�|jd�dS�Nrz�rrr�r?rrrrz�szDisplayStyle.deletecCs|j�|jdd||�dS)Nr �-%sr�rHrrrrK�szDisplayStyle.__setitem__cKs|j|jdf|�||���S)Nr )r"r�r%r&rrrrE�s�
�zDisplayStyle.configcCs|j�|jdd|�S)Nrr�r�)rrIrrr�__getitem__�szDisplayStyle.__getitem__)r2r3r4r5r9r�r%rzrKrEr�rrrrr��s
r�c@s2eZdZdZdifdd�Zifdd�Zdd�ZdS)	�BalloonzBalloon help widget.

    Subwidget       Class
    ---------       -----
    label           Label
    message         MessageNcKsNdddddg}t�||d|||�t|ddd	�|jd<t|d
dd	�|jd
<dS)Nr\ZinstallcolormapZinitwaitZ	statusbarZcursorZ
tixBalloon�labelr�r~�message�r[r9�_dummyLabelrc�rrdr'r(Zstaticrrrr9	s���zBalloon.__init__cKs&|jj|jd|jf|�||���dS)zkBind balloon widget to another.
        One balloon widget may be bound to several widgets at the same time�bindNrC)r�widgetr'r(rrr�bind_widgetszBalloon.bind_widgetcCs|j�|jd|j�dS�NZunbindrM�rr�rrr�
unbind_widgetszBalloon.unbind_widget)r2r3r4r5r9r�r�rrrrr�s
r�c@s2eZdZdZdifdd�Zifdd�Zdd�ZdS)	�	ButtonBoxzgButtonBox - A container for pushbuttons.
    Subwidgets are the buttons added with the add method.
    NcKst�||dddg||�dS)NZtixButtonBox�orientationr\�r[r9�rrdr'r(rrrr9s

�zButtonBox.__init__cKs4|jj|jd|f|�||���}t||�|j|<|S)z$Add a button with given name to box.�add�rrrDr%�_dummyButtonrc)rr,r'r(Zbtnrrrr�#s z
ButtonBox.addcCs ||jkr|j�|jd|�dS�N�invoke�rcrrrDr+rrrr�*s
zButtonBox.invoke�r2r3r4r5r9r�r�rrrrr�sr�c@s>eZdZdZdifdd�Zdd�Zdd�Zd	d
�Zdd�ZdS)
�ComboBoxa�ComboBox - an Entry field with a dropdown menu. The user can select a
    choice by either typing in the entry subwidget or selecting from the
    listbox subwidget.

    Subwidget       Class
    ---------       -----
    entry       Entry
    arrow       Button
    slistbox    ScrolledListBox
    tick        Button
    cross       Button : present if created with the fancy optionNc	Ks�t�||dddddg||�t|d�|jd<t|d�|jd<t|d�|jd<t|d	�|jd	<z$t|d
�|jd
<t|d�|jd<Wntk
r�YnXdS)NZtixComboBoxZeditableZdropdown�fancyr\r��entry�arrow�slistbox�tick�cross)r[r9r�rc�_dummyEntryr��_dummyScrolledListBox�	TypeErrorr�rrrr9<s 

��
zComboBox.__init__cCs|j�|jd|�dS)NZ
addhistoryrM�rr$rrr�add_historyNszComboBox.add_historycCs|j�|jd|�dS)NZ
appendhistoryrMr�rrr�append_historyQszComboBox.append_historycCs|j�|jd||�dS�N�insertrM)r�indexr$rrrr�TszComboBox.insertcCs|j�|jd|�dS)N�pickrM�rr�rrrr�Wsz
ComboBox.pick)	r2r3r4r5r9r�r�r�r�rrrrr�.s
r�c@s>eZdZdZdifdd�Zdd�Zdd�Zd	d
�Zdd�ZdS)
�Controla�Control - An entry field with value change arrows.  The user can
    adjust the value by pressing the two arrow buttons or by entering
    the value directly into the entry. The new value will be checked
    against the user-defined upper and lower limits.

    Subwidget       Class
    ---------       -----
    incr       Button
    decr       Button
    entry       Entry
    label       LabelNcKsZt�||ddg||�t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<dS)NZ
tixControlr\�incr�decrr�r�)r[r9r�rcr�r�r�rrrr9hs
zControl.__init__cCs|j�|jd�dS)Nr�rMr?rrr�	decrementoszControl.decrementcCs|j�|jd�dS)Nr�rMr?rrr�	incrementrszControl.incrementcCs|j�|jd�dSr�rMr?rrrr�uszControl.invokecCs|j�|jd�dS)N�updaterMr?rrrr�xszControl.update)	r2r3r4r5r9r�r�r�r�rrrrr�Zs
r�c@s$eZdZdZifdd�Zdd�ZdS)�DirListaRDirList - displays a list view of a directory, its previous
    directories and its sub-directories. The user can choose one of
    the directories displayed in the list or change to another directory.

    Subwidget       Class
    ---------       -----
    hlist       HList
    hsb              Scrollbar
    vsb              ScrollbarcKsJt�||ddg||�t|d�|jd<t|d�|jd<t|d�|jd<dS)NZ
tixDirListr\�hlist�vsb�hsb�r[r9�_dummyHListrc�_dummyScrollbarr�rrrr9�szDirList.__init__cCs|j�|jd|�dS�N�chdirrM�r�dirrrrr��sz
DirList.chdirN�r2r3r4r5r9r�rrrrr�{sr�c@s$eZdZdZifdd�Zdd�ZdS)�DirTreea�DirTree - Directory Listing in a hierarchical view.
    Displays a tree view of a directory, its previous directories and its
    sub-directories. The user can choose one of the directories displayed
    in the list or change to another directory.

    Subwidget       Class
    ---------       -----
    hlist           HList
    hsb             Scrollbar
    vsb             ScrollbarcKsJt�||ddg||�t|d�|jd<t|d�|jd<t|d�|jd<dS)NZ
tixDirTreer\r�r�r�r�r�rrrr9�szDirTree.__init__cCs|j�|jd|�dSr�rMr�rrrr��sz
DirTree.chdirNr�rrrrr��sr�c@seZdZdZifdd�ZdS)�DirSelectBoxa�DirSelectBox - Motif style file select box.
    It is generally used for
    the user to choose a file. FileSelectBox stores the files mostly
    recently selected into a ComboBox widget so that they can be quickly
    selected again.

    Subwidget       Class
    ---------       -----
    selection       ComboBox
    filter          ComboBox
    dirlist         ScrolledListBox
    filelist        ScrolledListBoxcKs:t�||ddg||�t|d�|jd<t|d�|jd<dS)NZtixDirSelectBoxr\�dirlist�dircbx)r[r9�
_dummyDirListrc�_dummyFileComboBoxr�rrrr9�szDirSelectBox.__init__N�r2r3r4r5r9rrrrr��s
r�c@s,eZdZdZifdd�Zdd�Zdd�ZdS)	�ExFileSelectBoxa�ExFileSelectBox - MS Windows style file select box.
    It provides a convenient method for the user to select files.

    Subwidget       Class
    ---------       -----
    cancel       Button
    ok              Button
    hidden       Checkbutton
    types       ComboBox
    dir              ComboBox
    file       ComboBox
    dirlist       ScrolledListBox
    filelist       ScrolledListBoxcKs�t�||ddg||�t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<t|d	�|jd	<t|d
�|jd
<dS)NZtixExFileSelectBoxr\�cancel�ok�hidden�typesr�r��file�filelist)r[r9r�rc�_dummyCheckbutton�_dummyComboBoxr�r�r�rrrr9�szExFileSelectBox.__init__cCs|j�|jd�dS�N�filterrMr?rrrr��szExFileSelectBox.filtercCs|j�|jd�dSr�rMr?rrrr��szExFileSelectBox.invokeN)r2r3r4r5r9r�r�rrrrr��sr�c@s,eZdZdZifdd�Zdd�Zdd�ZdS)	�DirSelectDialoga#The DirSelectDialog widget presents the directories in the file
    system in a dialog window. The user can use this dialog window to
    navigate through the file system to select the desired directory.

    Subwidgets       Class
    ----------       -----
    dirbox       DirSelectDialogcKs*t�||ddg||�t|d�|jd<dS)NZtixDirSelectDialogr\Zdirbox)r[r9�_dummyDirSelectBoxrcr�rrrr9�s
�zDirSelectDialog.__init__cCs|j�|jd�dS�N�popuprMr?rrrr��szDirSelectDialog.popupcCs|j�|jd�dS�N�popdownrMr?rrrr��szDirSelectDialog.popdownN�r2r3r4r5r9r�r�rrrrr��s	r�c@s,eZdZdZifdd�Zdd�Zdd�ZdS)	�ExFileSelectDialogz�ExFileSelectDialog - MS Windows style file select dialog.
    It provides a convenient method for the user to select files.

    Subwidgets       Class
    ----------       -----
    fsbox       ExFileSelectBoxcKs*t�||ddg||�t|d�|jd<dS)NZtixExFileSelectDialogr\�fsbox)r[r9�_dummyExFileSelectBoxrcr�rrrr9�s
�zExFileSelectDialog.__init__cCs|j�|jd�dSr�rMr?rrrr�szExFileSelectDialog.popupcCs|j�|jd�dSr�rMr?rrrr�szExFileSelectDialog.popdownNr�rrrrr��sr�c@s,eZdZdZifdd�Zdd�Zdd�ZdS)	�
FileSelectBoxa�ExFileSelectBox - Motif style file select box.
    It is generally used for
    the user to choose a file. FileSelectBox stores the files mostly
    recently selected into a ComboBox widget so that they can be quickly
    selected again.

    Subwidget       Class
    ---------       -----
    selection       ComboBox
    filter          ComboBox
    dirlist         ScrolledListBox
    filelist        ScrolledListBoxcKsZt�||ddg||�t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<dS)NZtixFileSelectBoxr\r�r�r��	selection)r[r9r�rcr�r�rrrr9s
zFileSelectBox.__init__cCs|j�|jd�dSr�rMr?rrr�apply_filterszFileSelectBox.apply_filtercCs|j�|jd�dSr�rMr?rrrr�szFileSelectBox.invokeN)r2r3r4r5r9r�r�rrrrr�s
r�c@s,eZdZdZifdd�Zdd�Zdd�ZdS)	�FileSelectDialogz�FileSelectDialog - Motif style file select dialog.

    Subwidgets       Class
    ----------       -----
    btns       StdButtonBox
    fsbox       FileSelectBoxcKs:t�||ddg||�t|d�|jd<t|d�|jd<dS)NZtixFileSelectDialogr\Zbtnsr�)r[r9�_dummyStdButtonBoxrc�_dummyFileSelectBoxr�rrrr9,s
�zFileSelectDialog.__init__cCs|j�|jd�dSr�rMr?rrrr�2szFileSelectDialog.popupcCs|j�|jd�dSr�rMr?rrrr�5szFileSelectDialog.popdownNr�rrrrr�#sr�c@s,eZdZdZifdd�Zdd�Zdd�ZdS)	�	FileEntrya_FileEntry - Entry field with button that invokes a FileSelectDialog.
    The user can type in the filename manually. Alternatively, the user can
    press the button widget that sits next to the entry, which will bring
    up a file selection dialog.

    Subwidgets       Class
    ----------       -----
    button       Button
    entry       EntrycKs<t�||dddg||�t|d�|jd<t|d�|jd<dS)NZtixFileEntryZ
dialogtyper\Zbuttonr�)r[r9r�rcr�r�rrrr9Ds
�zFileEntry.__init__cCs|j�|jd�dSr�rMr?rrrr�JszFileEntry.invokecCsdSrFrr?rrr�file_dialogMszFileEntry.file_dialogN)r2r3r4r5r9r�r�rrrrr�8sr�c@s�eZdZdZdifdd�Zifdd�Zdifdd�Zd	d
�Zdd�Zdldd�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zifd d!�Zifd"d#�Zd$d%�Zd&d'�ZeZd(d)�Zd*d+�Zd,d-�Zifd.d/�Zifd0d1�Zd2d3�Zd4d5�Zd6d7�Zd8d9�Zd:d;�Z d<d=�Z!dmd>d?�Z"d@dA�Z#dBdC�Z$dDdE�Z%dFdG�Z&dHdI�Z'dJdK�Z(dLdM�Z)dNdO�Z*dPdQ�Z+dRdS�Z,ifdTdU�Z-ifdVdW�Z.dXdY�Z/dZd[�Z0d\d]�Z1ifd^d_�Z2d`da�Z3dbdc�Z4ifddde�Z5dfdg�Z6dndhdi�Z7djdk�Z8dS)o�HListaHList - Hierarchy display  widget can be used to display any data
    that have a hierarchical structure, for example, file system directory
    trees. The list entries are indented and connected by branch lines
    according to their places in the hierarchy.

    Subwidgets - NoneNcKst�||dddg||�dS)NZtixHList�columnsr\r�r�rrrr9Ys

�zHList.__init__cKs |jj|jd|f|�||���S�Nr�rC�rr�r'r(rrrr�]sz	HList.addcKs(|sd}|jj|jd|f|�||���S)Nr=ZaddchildrC)rr�r'r(rrr�	add_child`s�
�zHList.add_childcCs|j�|jdd|�dS�N�anchor�setrM�rr�rrr�
anchor_setfszHList.anchor_setcCs|j�|jdd�dS�Nr��clearrMr?rrr�anchor_cleariszHList.anchor_clearrcCs6|s|j�|jdd||�S|j�|jdd|d|�SdS)Nr	�widthz-charrM)r�colr�charsrrr�column_widthls�zHList.column_widthcCs|j�|jdd�dS)Nrz�allrMr?rrr�
delete_allsszHList.delete_allcCs|j�|jdd|�dS)Nrzr�rMr�rrr�delete_entryvszHList.delete_entrycCs|j�|jdd|�dS)NrzZ
offspringsrMr�rrr�delete_offspringsyszHList.delete_offspringscCs|j�|jdd|�dS)NrzZsiblingsrMr�rrr�delete_siblings|szHList.delete_siblingscCs|j�|jdd|�dS�N�dragsiter�rMr�rrr�dragsite_setszHList.dragsite_setcCs|j�|jdd�dS�NrrrMr?rrr�dragsite_clear�szHList.dragsite_clearcCs|j�|jdd|�dS�N�dropsiter�rMr�rrr�dropsite_set�szHList.dropsite_setcCs|j�|jdd�dS�NrrrMr?rrr�dropsite_clear�szHList.dropsite_clearcKs&|jj|jdd|f|�||���dS)N�headerrvrC�rrr'r(rrr�
header_create�szHList.header_createcKs@|dkr|�|jdd|�S|jj|jdd|f|�||���dS)Nrr �r"rDrrr%rrrr�header_configure�s

�zHList.header_configurecCs|j�|jdd||�S)NrrrM)rr�optrrr�header_cget�szHList.header_cgetcCs|j�|j�|jdd|��S)NrZexist)rZ
getbooleanrrD�rrrrr�
header_exists�szHList.header_existscCs|j�|jdd|�dS)NrrzrMrrrr�
header_delete�szHList.header_deletecCs|j�|jdd|�S)Nr�sizerMrrrr�header_size�szHList.header_sizecCs|j�|jdd|�dS)N�hider�rMr�rrr�
hide_entry�szHList.hide_entrycKs&|jj|jdd|f|�||���dS)N�	indicatorrvrCr�rrr�indicator_create�s�
�zHList.indicator_createcKs@|dkr|�|jdd|�S|jj|jdd|f|�||���dS)Nr#r rr�rrr�indicator_configure�s��
�zHList.indicator_configurecCs|j�|jdd||�S)Nr#rrM�rr�rrrr�indicator_cget�szHList.indicator_cgetcCs|j�|jdd|�S)Nr#�existsrMr�rrr�indicator_exists�szHList.indicator_existscCs|j�|jdd|�dS)Nr#rzrMr�rrr�indicator_delete�szHList.indicator_deletecCs|j�|jdd|�S)Nr#rrMr�rrr�indicator_size�szHList.indicator_sizecCs|j�|jdd�S�NrTr�rMr?rrr�info_anchor�szHList.info_anchorcCs|�|j�|jdd|��pdS�NrTZbbox)�_getintsrrrDr�rrr�	info_bbox�s
��zHList.info_bboxcCs |j�|jdd|�}|j�|�S)NrTr��rrrDrP)rr�r�rrr�
info_children�szHList.info_childrencCs|j�|jdd|�S)NrT�datarMr�rrr�	info_data�szHList.info_datacCs|j�|jdd�S)NrTrrMr?rrr�
info_dragsite�szHList.info_dragsitecCs|j�|jdd�S)NrTrrMr?rrr�
info_dropsite�szHList.info_dropsitecCs|j�|jdd|�S)NrTr(rMr�rrr�info_exists�szHList.info_existscCs|j�|jdd|�S)NrTr�rMr�rrr�info_hidden�szHList.info_hiddencCs|j�|jdd|�S)NrT�nextrMr�rrr�	info_next�szHList.info_nextcCs|j�|jdd|�S)NrTr�rMr�rrr�info_parent�szHList.info_parentcCs|j�|jdd|�S)NrT�prevrMr�rrr�	info_prev�szHList.info_prevcCs|j�|jdd�}|j�|�S�NrTr�r1r�rrr�info_selection�szHList.info_selectioncCs|j�|jdd|||�S)N�itemrrM)rr�rrrrr�	item_cget�szHList.item_cgetcKsD|dkr|�|jdd||�S|jj|jdd||f|�||���dS)Nr@r r�rr�rr'r(rrr�item_configure�s

�zHList.item_configurecKs(|jj|jdd||f|�||���dS)Nr@rvrCrBrrr�item_create�s�
�zHList.item_createcCs|j�|jdd||�S)Nr@r(rM�rr�rrrr�item_exists�szHList.item_existscCs|j�|jdd||�dS)Nr@rzrMrErrr�item_delete�szHList.item_deletecCs|j�|jd||�S)N�	entrycgetrMr&rrrrH�szHList.entrycgetcKs<|dkr|�|jd|�S|jj|jd|f|�||���dS�N�entryconfigurerr�rrrrJ�s

�zHList.entryconfigurecCs|j�|jd|�S�N�nearestrM)rrRrrrrLsz
HList.nearestcCs|j�|jd|�dS�N�seerMr�rrrrNsz	HList.seecKs$|jj|jddf|�||���dS�Nr�rrCr&rrr�selection_clearszHList.selection_clearcCs|j�|jdd|�S�Nr�ZincludesrMr�rrr�selection_includes
szHList.selection_includescCs|j�|jdd||�dS�Nr�r�rM�r�firstZlastrrr�
selection_set
szHList.selection_setcCs|j�|jdd|�S)N�showr�rMr�rrr�
show_entryszHList.show_entry)rNN)N)N)9r2r3r4r5r9r�r�r�rrrrr	r
r
rrrrrrrZheader_existrr r"r$r%r'r)r*r+r-r0r2r4r5r6r7r8r:r;r=r?rArCrDrFrGrHrJrLrNrPrRrVrXrrrrr�Qsl


r�c@seZdZdZdifdd�ZdS)�	InputOnlyz?InputOnly - Invisible widget. Unix only.

    Subwidgets - NoneNcKst�||dd||�dS)NZtixInputOnlyr�r�rrrr9szInputOnly.__init__r�rrrrrYsrYc@seZdZdZdifdd�ZdS)�
LabelEntryaLabelEntry - Entry field with label. Packages an entry widget
    and a label into one mega widget. It can be used to simplify the creation
    of ``entry-form'' type of interface.

    Subwidgets       Class
    ----------       -----
    label       Label
    entry       EntryNcKs<t�||dddg||�t|d�|jd<t|d�|jd<dS)NZ
tixLabelEntry�	labelsider\r�r�)r[r9r�rcr�r�rrrr9%s
�zLabelEntry.__init__r�rrrrrZs	rZc@seZdZdZdifdd�ZdS)�
LabelFrameaeLabelFrame - Labelled Frame container. Packages a frame widget
    and a label into one mega widget. To create widgets inside a
    LabelFrame widget, one creates the new widgets relative to the
    frame subwidget and manage them inside the frame subwidget.

    Subwidgets       Class
    ----------       -----
    label       Label
    frame       FrameNcKs<t�||dddg||�t|d�|jd<t|d�|jd<dS)NZ
tixLabelFramer[r\r��frame)r[r9r�rc�_dummyFramer�rrrr96s
�zLabelFrame.__init__r�rrrrr\+s
r\c@s@eZdZdZifdd�Zifdd�Zdd�Zdd	�Zd
d�ZdS)
�ListNoteBookaA ListNoteBook widget is very similar to the TixNoteBook widget:
    it can be used to display many windows in a limited space using a
    notebook metaphor. The notebook is divided into a stack of pages
    (windows). At one time only one of these pages can be shown.
    The user can navigate through these pages by
    choosing the name of the desired page in the hlist subwidget.cKsNt�||ddg||�t|ddd�|jd<t|d�|jd<t|d�|jd<dS)NZtixListNoteBookr\Zpanerr�r�Zshlist)r[r9�_dummyPanedWindowrcr��_dummyScrolledHListr�rrrr9Es�zListNoteBook.__init__cKs:|jj|jd|f|�||���t||�|j|<|j|Sr��rrrDr%r|rc�rr,r'r(rrrr�Ms zListNoteBook.addcCs
|�|�SrF�rpr+rrr�pageRszListNoteBook.pagecCs:|j�|j�|jd��}g}|D]}|�|�|��q |S�N�pages�rrPrrDr]rp�rrrZretrQrrrrgUs
zListNoteBook.pagescCs|j�|jd|�dS�N�raiserMr+rrr�
raise_page]szListNoteBook.raise_pageN)	r2r3r4r5r9r�rergrlrrrrr_=sr_c@seZdZdZdifdd�ZdS)�MeterzuThe Meter widget can be used to show the progress of a background
    job which may take a long time to execute.
    NcKst�||ddg||�dS)NZtixMeterr\r�r�rrrr9es

�zMeter.__init__r�rrrrrm`srmc@sReZdZdZdifdd�Zifdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dS)�NoteBookz�NoteBook - Multi-page container widget (tabbed notebook metaphor).

    Subwidgets       Class
    ----------       -----
    nbframe       NoteBookFrame
    <pages>       page widgets added dynamically with the add methodNcKs.t�||ddg||�t|ddd�|jd<dS)NZtixNoteBookr\Znbframerr�)r[r9r|rcr�rrrr9qs�zNoteBook.__init__cKs:|jj|jd|f|�||���t||�|j|<|j|Sr�rbrcrrrr�vs zNoteBook.addcCs,|j�|jd|�|j|��|j|=dSr��rrrDrcr>r+rrrrz{szNoteBook.deletecCs
|�|�SrFrdr+rrrre�sz
NoteBook.pagecCs:|j�|j�|jd��}g}|D]}|�|�|��q |Srfrhrirrrrg�s
zNoteBook.pagescCs|j�|jd|�dSrjrMr+rrrrl�szNoteBook.raise_pagecCs|j�|jd�S)N�raisedrMr?rrrrp�szNoteBook.raised)r2r3r4r5r9r�rzrergrlrprrrrrnisrnc@seZdZdS)�
NoteBookFrameN)r2r3r4rrrrrq�srqc@sLeZdZdZifdd�Zifdd�Zifdd�Zdd	�Zd
d�Zdd
�Z	dS)�
OptionMenuz�OptionMenu - creates a menu button of options.

    Subwidget       Class
    ---------       -----
    menubutton      Menubutton
    menu            MenucKs:t�||ddg||�t|d�|jd<t|d�|jd<dS)NZ
tixOptionMenur\�
menubutton�menu�r[r9�_dummyMenubuttonrc�
_dummyMenur�rrrr9�szOptionMenu.__init__cKs&|jj|jdd|f|�||���dS)Nr��commandrCrcrrr�add_command�szOptionMenu.add_commandcKs&|jj|jdd|f|�||���dS)Nr�Z	separatorrCrcrrr�
add_separator�szOptionMenu.add_separatorcCs|j�|jd|�dSr�rMr+rrrrz�szOptionMenu.deletecCs|j�|jd|�dS)N�disablerMr+rrrr{�szOptionMenu.disablecCs|j�|jd|�dS)N�enablerMr+rrrr|�szOptionMenu.enableN)
r2r3r4r5r9ryrzrzr{r|rrrrrr�srrc@sTeZdZdZifdd�Zifdd�Zdd�Zdd	�Zd
d�Zifdd
�Z	dd�Z
dS)�PanedWindowa�PanedWindow - Multi-pane container widget
    allows the user to interactively manipulate the sizes of several
    panes. The panes can be arranged either vertically or horizontally.The
    user changes the sizes of the panes by dragging the resize handle
    between two panes.

    Subwidgets       Class
    ----------       -----
    <panes>       g/p widgets added dynamically with the add method.cKst�||dddg||�dS)NZtixPanedWindowr�r\r�r�rrrr9�szPanedWindow.__init__cKs>|jj|jd|f|�||���t||dd�|j|<|j|S)Nr�r)rrbrcrrrr��s
 �zPanedWindow.addcCs,|j�|jd|�|j|��|j|=dSr�ror+rrrrz�szPanedWindow.deletecCs|j�|jd|�dS)NrNrMr+rrrrN�szPanedWindow.forgetcCs|j�|jd||�S)N�panecgetrMr&rrrr~�szPanedWindow.panecgetcKs<|dkr|�|jd|�S|jj|jd|f|�||���dS)N�
paneconfigurerr�rrrr�szPanedWindow.paneconfigurecs*�j��j��jd��}�fdd�|D�S)N�panescsg|]}��|��qSrrdrVr?rrrX�sz%PanedWindow.panes.<locals>.<listcomp>rZ)rrrrr?rr��szPanedWindow.panesN)r2r3r4r5r9r�rzrNr~rr�rrrrr}�s
r}c@s4eZdZdZifdd�Zdd�Zdd�Zdd	�Zd
S)�	PopupMenuaPopupMenu widget can be used as a replacement of the tk_popup command.
    The advantage of the Tix PopupMenu widget is it requires less application
    code to manipulate.


    Subwidgets       Class
    ----------       -----
    menubutton       Menubutton
    menu       MenucKs:t�||ddg||�t|d�|jd<t|d�|jd<dS)NZtixPopupMenur\rsrtrur�rrrr9�szPopupMenu.__init__cCs|j�|jd|j�dS)Nr�rMr�rrrr��szPopupMenu.bind_widgetcCs|j�|jd|j�dSr�rMr�rrrr��szPopupMenu.unbind_widgetcCs|j�|jd|j||�dS)NZpostrM)rr�rQrRrrr�post_widget�szPopupMenu.post_widgetN)r2r3r4r5r9r�r�r�rrrrr��s
r�c@s<eZdZdZifdd�Zdd�Zdd�Zdd	�Zd
d�ZdS)
�ResizeHandlez;Internal widget to draw resize handles on Scrolled widgets.c	Ks.ddddddddd	g	}t�||d
|||�dS)Nr\rxZcursorfgZcursorbgZ
handlesizeZ	hintcolorZ	hintwidthrQrRZtixResizeHandler�)rrdr'r(�flagsrrrr9�s�
�zResizeHandle.__init__cCs|j�|jd|j�dS)NZattachwidgetrMr�rrr�
attach_widgetszResizeHandle.attach_widgetcCs|j�|jd|j�dS)NZdetachwidgetrMr�rrr�
detach_widgetszResizeHandle.detach_widgetcCs|j�|jd|j�dS)Nr!rMr�rrrr!szResizeHandle.hidecCs|j�|jd|j�dS)NrWrMr�rrrrW	szResizeHandle.showN)	r2r3r4r5r9r�r�r!rWrrrrr��s
r�c@seZdZdZifdd�ZdS)�
ScrolledHListz0ScrolledHList - HList with automatic scrollbars.cKsJt�||ddg||�t|d�|jd<t|d�|jd<t|d�|jd<dS)NZtixScrolledHListr\r�r�r�r�r�rrrr9s�zScrolledHList.__init__Nr�rrrrr�sr�c@seZdZdZifdd�ZdS)�ScrolledListBoxz4ScrolledListBox - Listbox with automatic scrollbars.cKsJt�||ddg||�t|d�|jd<t|d�|jd<t|d�|jd<dS)NZtixScrolledListBoxr\�listboxr�r�)r[r9�
_dummyListboxrcr�r�rrrr9szScrolledListBox.__init__Nr�rrrrr�sr�c@seZdZdZifdd�ZdS)�ScrolledTextz.ScrolledText - Text with automatic scrollbars.cKsJt�||ddg||�t|d�|jd<t|d�|jd<t|d�|jd<dS)NZtixScrolledTextr\rr�r�)r[r9�
_dummyTextrcr�r�rrrr9%szScrolledText.__init__Nr�rrrrr�!sr�c@seZdZdZifdd�ZdS)�
ScrolledTListz0ScrolledTList - TList with automatic scrollbars.cKsJt�||ddg||�t|d�|jd<t|d�|jd<t|d�|jd<dS)NZtixScrolledTListr\Ztlistr�r�)r[r9�_dummyTListrcr�r�rrrr9/s�zScrolledTList.__init__Nr�rrrrr�+sr�c@seZdZdZifdd�ZdS)�ScrolledWindowz2ScrolledWindow - Window with automatic scrollbars.cKsJt�||ddg||�t|d�|jd<t|d�|jd<t|d�|jd<dS)NZtixScrolledWindowr\rr�r�)r[r9r^rcr�r�rrrr9:szScrolledWindow.__init__Nr�rrrrr�6sr�c@s0eZdZdZifdd�Zifdd�Zdd�ZdS)	�Selectz�Select - Container of button subwidgets. It can be used to provide
    radio-box or check-box style of selection options for the user.

    Subwidgets are buttons added dynamically using the add method.c
Ks2t�||ddddddg||�t|d�|jd<dS)NZ	tixSelectZ	allowzero�radior�r[r\r�r�r�rrrr9Gs
��zSelect.__init__cKs:|jj|jd|f|�||���t||�|j|<|j|Sr�r�rcrrrr�Ns z
Select.addcCs|j�|jd|�dSr�rMr+rrrr�Ssz
Select.invokeNr�rrrrr�@sr�c@seZdZdZdifdd�ZdS)�Shellz'Toplevel window.

    Subwidgets - NoneNcKst�||dddg||�dS)NZtixShellr\�titler�r�rrrr9[szShell.__init__r�rrrrr�Vsr�c@s6eZdZdZdifdd�Zdd�Zdd�Zd	d
�ZdS)�DialogShellz�Toplevel window, with popup popdown and center methods.
    It tells the window manager that it is a dialog window and should be
    treated specially. The exact treatment depends on the treatment of
    the window manager.

    Subwidgets - NoneNcKs&t�||ddddddddg||�dS)	NZtixDialogShellr\r�ZmappedZ	minheightZminwidthr�Z	transientr�r�rrrr9gs��zDialogShell.__init__cCs|j�|jd�dSr�rMr?rrrr�nszDialogShell.popdowncCs|j�|jd�dSr�rMr?rrrr�qszDialogShell.popupcCs|j�|jd�dS)N�centerrMr?rrrr�tszDialogShell.center)r2r3r4r5r9r�r�r�rrrrr�^s
r�c@s&eZdZdZdifdd�Zdd�ZdS)�StdButtonBoxz@StdButtonBox - Standard Button Box (OK, Apply, Cancel and Help) NcKs\t�||dddg||�t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<dS)NZtixStdButtonBoxr�r\r��applyr��help)r[r9r�rcr�rrrr9zs
�zStdButtonBox.__init__cCs ||jkr|j�|jd|�dSr�r�r+rrrr��s
zStdButtonBox.invoke)r2r3r4r5r9r�rrrrr�wsr�c@s�eZdZdZdifdd�Zdd�Zdd�Zd	d
�Zdd�Zd3d
d�Z	dd�Z
dd�Zdd�Zdd�Z
ifdd�Zdd�Zdd�Zdd�Zdd �Zd!d"�Zd#d$�Zd%d&�Zd'd(�Zd)d*�Zd+d,�Zifd-d.�Zd/d0�Zd4d1d2�ZdS)5�TLista�TList - Hierarchy display widget which can be
    used to display data in a tabular format. The list entries of a TList
    widget are similar to the entries in the Tk listbox widget. The main
    differences are (1) the TList widget can display the list entries in a
    two dimensional format and (2) you can use graphical images as well as
    multiple colors and fonts for the list entries.

    Subwidgets - NoneNcKst�||ddg||�dS)NZtixTListr\r�r�rrrr9�szTList.__init__cCs|j�|jdd|�dS)N�activer�rMr�rrr�
active_set�szTList.active_setcCs|j�|jdd�dS)Nr�rrMr?rrr�active_clear�szTList.active_clearcCs|j�|jdd|�dSr�rMr�rrrr��szTList.anchor_setcCs|j�|jdd�dSr�rMr?rrrr�szTList.anchor_clearcCs|j�|jd||�dSr�rM�r�from_�torrrrz�szTList.deletecCs|j�|jdd|�dSrrMr�rrrr
�szTList.dragsite_setcCs|j�|jdd�dSrrMr?rrrr�szTList.dragsite_clearcCs|j�|jdd|�dSrrMr�rrrr�szTList.dropsite_setcCs|j�|jdd�dSrrMr?rrrr�szTList.dropsite_clearcKs$|jj|jd|f|�||���dSr�rC)rr�r'r(rrrr��szTList.insertcCs|j�|jdd�S)NrTr�rMr?rrr�info_active�szTList.info_activecCs|j�|jdd�Sr,rMr?rrrr-�szTList.info_anchorcCs|j�|jdd|�S)NrTZdownrMr�rrr�	info_down�szTList.info_downcCs|j�|jdd|�S)NrT�leftrMr�rrr�	info_left�szTList.info_leftcCs|j�|jdd|�S)NrT�rightrMr�rrr�
info_right�szTList.info_rightcCs|j�|jdd�}|j�|�Sr>r1r�rrrr?�szTList.info_selectioncCs|j�|jdd�S)NrTrrMr?rrr�	info_size�szTList.info_sizecCs|j�|jdd|�S)NrTZuprMr�rrr�info_up�sz
TList.info_upcCs|j�|jd||�SrKrM�rrQrRrrrrL�sz
TList.nearestcCs|j�|jd|�dSrMrMr�rrrrN�sz	TList.seecKs$|jj|jddf|�||���dSrOrCr&rrrrP�szTList.selection_clearcCs|j�|jdd|�SrQrMr�rrrrR�szTList.selection_includescCs|j�|jdd||�dSrSrMrTrrrrV�szTList.selection_set)N)N)r2r3r4r5r9r�r�r�rrzr
rrrr�r�r-r�r�r�r?r�r�rLrNrPrRrVrrrrr��s2	
r�c@sHeZdZdZdifdd�Zdd�Zdd�Zd	d
�Zdd�Zddd�Z	dS)�Treez�Tree - The tixTree widget can be used to display hierarchical
    data in a tree form. The user can adjust
    the view of the tree by opening or closing parts of the tree.NcKsJt�||ddg||�t|d�|jd<t|d�|jd<t|d�|jd<dS)NZtixTreer\r�r�r�r�r�rrrr9�s
�z
Tree.__init__cCs|j�|jd�dS�aThis command calls the setmode method for all the entries in this
     Tree widget: if an entry has no child entries, its mode is set to
     none. Otherwise, if the entry has any hidden child entries, its mode is
     set to open; otherwise its mode is set to close.�autosetmodeNrMr?rrrr��szTree.autosetmodecCs|j�|jd|�dS�z8Close the entry given by entryPath if its mode is close.�closeNrM�r�	entrypathrrrr��sz
Tree.closecCs|j�|jd|�S�z9Returns the current mode of the entry given by entryPath.�getmoderMr�rrrr��szTree.getmodecCs|j�|jd|�dS�z6Open the entry given by entryPath if its mode is open.�openNrMr�rrrr��sz	Tree.open�nonecCs|j�|jd||�dS)a�This command is used to indicate whether the entry given by
     entryPath has children entries and whether the children are visible. mode
     must be one of open, close or none. If mode is set to open, a (+)
     indicator is drawn next the entry. If mode is set to close, a (-)
     indicator is drawn next the entry. If mode is set to none, no
     indicators will be drawn for this entry. The default mode is none. The
     open mode indicates the entry has hidden children and this entry can be
     opened by the user. The close mode indicates that all the children of the
     entry are now visible and the entry can be closed by the user.�setmodeNrM�rr��moderrrr��s
zTree.setmode)r�)
r2r3r4r5r9r�r�r�r�r�rrrrr��sr�c@sZeZdZdZdifdd�Zdd�Zdd�Zd	d
�Zdd�Zddd�Z	dd�Z
ddd�ZdS)�	CheckListz�The CheckList widget
    displays a list of items to be selected by the user. CheckList acts
    similarly to the Tk checkbutton or radiobutton widgets, except it is
    capable of handling many more items than checkbuttons or radiobuttons.
    NcKsLt�||dddg||�t|d�|jd<t|d�|jd<t|d�|jd<dS)NZtixCheckListr\r�r�r�r�r�r�rrrr9s
�zCheckList.__init__cCs|j�|jd�dSr�rMr?rrrr�szCheckList.autosetmodecCs|j�|jd|�dSr�rMr�rrrr�szCheckList.closecCs|j�|jd|�Sr�rMr�rrrr� szCheckList.getmodecCs|j�|jd|�dSr�rMr�rrrr�$szCheckList.open�oncCs|j�|j�|jd|��S)z�Returns a list of items whose status matches status. If status is
     not specified, the list of items in the "on" status will be returned.
     Mode can be on, off, default�getselectionrZ)rr�rrrr�(szCheckList.getselectioncCs|j�|jd|�S)z(Returns the current status of entryPath.�	getstatusrMr�rrrr�.szCheckList.getstatuscCs|j�|jd||�dS)z~Sets the status of entryPath to be status. A bitmap will be
     displayed next to the entry its status is on, off or default.�	setstatusNrMr�rrrr�2szCheckList.setstatus)r�)r�)r2r3r4r5r9r�r�r�r�r�r�r�rrrrr�s
r�c@seZdZddd�ZdS)r�rjcCst�||||�dSrF�r|r9�rrdr,r~rrrr9>sz_dummyButton.__init__N)rj�r2r3r4r9rrrrr�=sr�c@seZdZddd�ZdS)r�rjcCst�||||�dSrFr�r�rrrr9Bsz_dummyCheckbutton.__init__N)rjr�rrrrr�Asr�c@seZdZddd�ZdS)r�rjcCst�||||�dSrFr�r�rrrr9Fsz_dummyEntry.__init__N)rjr�rrrrr�Esr�c@seZdZddd�ZdS)r^rjcCst�||||�dSrFr�r�rrrr9Jsz_dummyFrame.__init__N)rjr�rrrrr^Isr^c@seZdZddd�ZdS)r�rjcCst�||||�dSrFr�r�rrrr9Nsz_dummyLabel.__init__N)rjr�rrrrr�Msr�c@seZdZddd�ZdS)r�rjcCst�||||�dSrFr�r�rrrr9Rsz_dummyListbox.__init__N)rjr�rrrrr�Qsr�c@seZdZddd�ZdS)rwrjcCst�||||�dSrFr�r�rrrr9Vsz_dummyMenu.__init__N)rjr�rrrrrwUsrwc@seZdZddd�ZdS)rvrjcCst�||||�dSrFr�r�rrrr9Zsz_dummyMenubutton.__init__N)rjr�rrrrrvYsrvc@seZdZddd�ZdS)r�rjcCst�||||�dSrFr�r�rrrr9^sz_dummyScrollbar.__init__N)rjr�rrrrr�]sr�c@seZdZddd�ZdS)r�rjcCst�||||�dSrFr�r�rrrr9bsz_dummyText.__init__N)rjr�rrrrr�asr�c@seZdZddd�ZdS)r�rjcCsDt�||||�t|d�|jd<t|d�|jd<t|d�|jd<dS)Nr�r�r�)r|r9r�rcr�r�rrrr9fsz_dummyScrolledListBox.__init__N)rjr�rrrrr�esr�c@seZdZddd�ZdS)r�rjcCst�||||�dSrFr�r�rrrr9msz_dummyHList.__init__N)rjr�rrrrr�lsr�c@seZdZddd�ZdS)rarjcCsDt�||||�t|d�|jd<t|d�|jd<t|d�|jd<dS�Nr�r�r��r|r9r�rcr�r�rrrr9qsz_dummyScrolledHList.__init__N)rjr�rrrrrapsrac@seZdZddd�ZdS)r�rjcCst�||||�dSrFr�r�rrrr9xsz_dummyTList.__init__N)rjr�rrrrr�wsr�c@seZdZddd�ZdS)r�rjcCs�t�|||d|g�t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<z$t|d�|jd<t|d�|jd<Wntk
r�YnXdS)Nr�r�r�r�r�r�r�)r|r9r�rcr�r�r�r�r�rrrr9|s�
z_dummyComboBox.__init__N)rjr�rrrrr�{sr�c@seZdZddd�ZdS)r�rjcCsDt�||||�t|d�|jd<t|d�|jd<t|d�|jd<dSr�r�r�rrrr9�sz_dummyDirList.__init__N)rjr�rrrrr��sr�c@seZdZddd�ZdS)r�rjcCs4t�||||�t|d�|jd<t|d�|jd<dS)Nr�r�)r|r9r�rcr�r�rrrr9�sz_dummyDirSelectBox.__init__N)rjr�rrrrr��sr�c@seZdZddd�ZdS)r�rjcCs�t�||||�t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<dS)	Nr�r�r�r�r�r�r�r�)r|r9r�rcr�r�r�r�rrrr9�sz_dummyExFileSelectBox.__init__N)rjr�rrrrr��sr�c@seZdZddd�ZdS)r�rjcCsTt�||||�t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<dS)Nr�r�r�r�)r|r9r�rcr�r�rrrr9�s
z_dummyFileSelectBox.__init__N)rjr�rrrrr��sr�c@seZdZddd�ZdS)r�rjcCs$t�||||�t|d�|jd<dS)Nr�)r|r9r�rcr�rrrr9�sz_dummyFileComboBox.__init__N)rjr�rrrrr��sr�c@seZdZddd�ZdS)r�rjcCsTt�||||�t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<dS)Nr�r�r�r�)r|r9r�rcr�rrrr9�s
z_dummyStdButtonBox.__init__N)rjr�rrrrr��sr�c@seZdZddd�ZdS)�_dummyNoteBookFramercCst�||||�dSrFr�r�rrrr9�sz_dummyNoteBookFrame.__init__N)rr�rrrrr��sr�c@seZdZddd�ZdS)r`rjcCst�||||�dSrFr�r�rrrr9�sz_dummyPanedWindow.__init__N)rjr�rrrrr`�sr`cCs|j�d|j�S)zzReturns the qualified path name for the widget. Normally used to set
    default options for subwidgets. See tixwidgets.pyZ
tixOptionNamerM)r�rrr�
OptionName�sr�cCs:d}|��D](}|d|d|d||d}q|S)Nr=z{{z} {z - z}} )�keys)�dict�s�typerrr�FileTypeList�s&r�c@seZdZdZdS)�CObjViewaBThis file implements the Canvas Object View widget. This is a base
    class of IconView. It implements automatic placement/adjustment of the
    scrollbars according to the canvas objects inside the canvas subwidget.
    The scrollbars are adjusted so that the canvas is just large enough
    to see all the objects.
    N)r2r3r4r5rrrrr��sr�c@s�eZdZdZdifdd�Zdd�Zdd�Zd	d
�Zd)dd�Zd*d
d�Z	dd�Z
dd�Zdd�Zd+dd�Z
dd�Zdd�Zdd�Zdd�Zdd �Zd,d!d"�Zd#d$�Zd%d&�Zd'd(�ZdS)-�Grida}The Tix Grid command creates a new window  and makes it into a
    tixGrid widget. Additional options, may be specified on the command
    line or in the option database to configure aspects such as its cursor
    and relief.

    A Grid widget displays its contents in a two dimensional grid of cells.
    Each cell may contain one Tix display item, which may be in text,
    graphics or other formats. See the DisplayStyle class for more information
    about Tix display items. Individual cells, or groups of cells, can be
    formatted with a wide range of attributes, such as its color, relief and
    border.

    Subwidgets - NoneNcKs"g}||_t�||d|||�dS)NZtixGrid�r'r[r9r�rrrr9�sz
Grid.__init__cCs|j�|dd�dS)zRemoves the selection anchor.r�rNrr?rrrrszGrid.anchor_clearcCs|�|j�|dd��S)z3Get the (x,y) coordinate of the current anchor cellr�r/�r/rrr?rrr�
anchor_getszGrid.anchor_getcCs|j�|dd||�dS)z/Set the selection anchor to the cell at (x, y).r�r�Nrr�rrrr�szGrid.anchor_setcCs4|dkr|j�|dd|�n|j�|dd||�dS)zdDelete rows between from_ and to inclusive.
        If to is not provided,  delete only row at from_Nrzr
rr�rrr�
delete_rowszGrid.delete_rowcCs4|dkr|j�|dd|�n|j�|dd||�dS)zjDelete columns between from_ and to inclusive.
        If to is not provided,  delete only column at from_Nrzr	rr�rrr�
delete_columnszGrid.delete_columncCs|j�|dd�dS)zUIf any cell is being edited, de-highlight the cell  and  applies
        the changes.�editr�Nrr?rrr�
edit_applyszGrid.edit_applycCs|j�|dd||�dS)zmHighlights  the  cell  at  (x, y) for editing, if the -editnotify
        command returns True for this cell.r�r�Nrr�rrr�edit_set!sz
Grid.edit_setcCs,|r|ddkrd|}|j�|d|||�S)z&Get the option value for cell at (x,y)rr!rHr)rrQrRrrrrrH&szGrid.entrycgetcKs|�d||f||�SrI)Z
_configure)rrQrRr'r(rrrrJ,szGrid.entryconfigurec	Cs|�|j�|dd||��S)z+Return True if display item exists at (x,y)rTr()Z_getbooleanrrr�rrrr72szGrid.info_existscCs|j�|dd||�Sr.rr�rrrr06szGrid.info_bboxcCs|j�|dd|||�dS)z�Moves the range of columns from position FROM through TO by
        the distance indicated by OFFSET. For example, move_column(2, 4, 1)
        moves the columns 2,3,4 to columns 3,4,5.�mover	Nr�rr�r��offsetrrr�move_column:szGrid.move_columncCs|j�|dd|||�dS)z�Moves the range of rows from position FROM through TO by
        the distance indicated by OFFSET.
        For example, move_row(2, 4, 1) moves the rows 2,3,4 to rows 3,4,5.r�r
Nrr�rrr�move_row@sz
Grid.move_rowcCs|�|j�|d||��S)z8Return coordinate of cell nearest pixel coordinate (x,y)rLr�r�rrrrLFszGrid.nearestcKs>|�|j|�}|dk	r"d|f|}|jj|d||f|��dS)Nz	-itemtyper�)r%r'rr)rrQrRr�r(�argsrrrr�PszGrid.setcKs*|j�|jj|jdd|f|�i|����S)a�Queries or sets the size of the column given by
        INDEX.  INDEX may be any non-negative
        integer that gives the position of a given column.
        INDEX can also be the string "default"; in this case, this command
        queries or sets the default size of all columns.
        When no option-value pair is given, this command returns a tuple
        containing the current size setting of the given column.  When
        option-value pairs are given, the corresponding options of the
        size setting of the given column are changed. Options may be one
        of the following:
              pad0 pixels
                     Specifies the paddings to the left of a column.
              pad1 pixels
                     Specifies the paddings to the right of a column.
              size val
                     Specifies the width of a column.  Val may be:
                     "auto" -- the width of the column is set to the
                     width of the widest cell in the column;
                     a valid Tk screen distance unit;
                     or a real number following by the word chars
                     (e.g. 3.4chars) that sets the width of the column to the
                     given number of characters.rr	)rrPrrDr%�rr�r(rrr�size_columnVs
�zGrid.size_columncKs(|j�|jj|dd|f|�i|����S)a�Queries or sets the size of the row given by
        INDEX. INDEX may be any non-negative
        integer that gives the position of a given row .
        INDEX can also be the string "default"; in this case, this command
        queries or sets the default size of all rows.
        When no option-value pair is given, this command returns a list con-
        taining the current size setting of the given row . When option-value
        pairs are given, the corresponding options of the size setting of the
        given row are changed. Options may be one of the following:
              pad0 pixels
                     Specifies the paddings to the top of a row.
              pad1 pixels
                     Specifies the paddings to the bottom of a row.
              size val
                     Specifies the height of a row.  Val may be:
                     "auto" -- the height of the row is set to the
                     height of the highest cell in the row;
                     a valid Tk screen distance unit;
                     or a real number following by the word chars
                     (e.g. 3.4chars) that sets the height of the row to the
                     given number of characters.rr
)rrPrr%r�rrr�size_rowps�
�z
Grid.size_rowcCs|j�|jd||�dS)z7Clears the cell at (x, y) by removing its display item.�unsetNrMr�rrrr��sz
Grid.unset)N)N)N)N)r2r3r4r5r9rr�r�r�r�r�r�rHrJr7r0r�r�rLr�r�r�r�rrrrr��s(	




r�c@seZdZdZdifdd�ZdS)�ScrolledGridzScrolled Grid widgetsNcKs"g}||_t�||d|||�dS)NZtixScrolledGridr�r�rrrr9�szScrolledGrid.__init__r�rrrrr��sr�)ur:r8rZ_tkinterZWINDOWZTEXTZSTATUSZ	IMMEDIATEZIMAGEZ	IMAGETEXTZBALLOONZAUTOZ	ACROSSTOP�ASCIIZCELLZCOLUMNZ
DECREASINGZ
INCREASINGZINTEGERZMAIN�MAXZREALZROWZS_REGIONZX_REGIONZY_REGIONZ
TCL_DONT_WAITZTCL_WINDOW_EVENTSZTCL_FILE_EVENTSZTCL_TIMER_EVENTSZTCL_IDLE_EVENTSZTCL_ALL_EVENTSrr6rAra�	__bases__r[r|r�r�r�r�r�r�r�r�r�r�r�r�r�r�ZXViewZYViewr�rYrZr\r_rmrnrqrrr}r�r�r�r�r�r�r�r�r�r�r�r�r�r�ZButtonr�ZCheckbuttonr�ZEntryr�ZFramer^ZLabelr�ZListboxr�ZMenurwZ
MenubuttonrvZ	Scrollbarr�ZTextr�r�r�rar�r�r�r�r�r�r�r�r�r`r�r�r�r�r�rrrr�<module>s�-
8/,!"C#	()


S.6

*colorchooser.cpython-38.pyc000064400000004316151732766100011711 0ustar00U

e5dA
�@s>ddlmZGdd�de�Zd	dd�Zedkr:ede��dS)
�)�Dialogc@s$eZdZdZdZdd�Zdd�ZdS)�Choosera�Create a dialog for the tk_chooseColor command.

    Args:
        master: The master widget for this dialog.  If not provided,
            defaults to options['parent'] (if defined).
        options: Dictionary of options for the tk_chooseColor call.
            initialcolor: Specifies the selected color when the
                dialog is first displayed.  This can be a tk color
                string or a 3-tuple of ints in the range (0, 255)
                for an RGB triplet.
            parent: The parent window of the color dialog.  The
                color dialog is displayed on top of this.
            title: A string for the title of the dialog box.
    Ztk_chooseColorcCs@z&|jd}t|t�r$d||jd<Wntk
r:YnXdS)zvEnsure initialcolor is a tk color string.

        Convert initialcolor from a RGB triplet to a color string.
        �initialcolorz
#%02x%02x%02xN)�options�
isinstance�tuple�KeyError)�self�color�r�,/usr/lib64/python3.8/tkinter/colorchooser.py�_fixoptions!s

zChooser._fixoptionscCs>|rt|�sdS|�|�\}}}|d|d|dft|�fS)z�Adjust result returned from call to tk_chooseColor.

        Return both an RGB tuple of ints in the range (0, 255) and the
        tk color string in the form #rrggbb.
        )NN�)�strZ	winfo_rgb)r	Zwidget�result�r�g�brrr�
_fixresult.szChooser._fixresultN)�__name__�
__module__�__qualname__�__doc__Zcommandr
rrrrrrs
rNcKs"|r|��}||d<tf|���S)z�Display dialog window for selection of a color.

    Convenience wrapper for the Chooser class.  Displays the color
    chooser dialog with color as the initial value.
    r)�copyrZshow)r
rrrr�askcolorBsr�__main__r
)N)Ztkinter.commondialogrrrr�printrrrr�<module>s3
scrolledtext.cpython-38.opt-1.pyc000064400000004203151732766100012656 0ustar00U

e5d�@sldZdgZddlmZmZmZmZmZmZddl	m
Z
mZmZm
Z
Gdd�de�Zdd�Zedkrhe�d	S)
aA ScrolledText widget feels like a text widget but also has a
vertical scroll bar on its right.  (Later, options may be added to
add a horizontal bar as well, to make the bars disappear
automatically when not needed, to move them to the other side of the
window, etc.)

Configuration options are passed to the Text widget.
A Frame widget is inserted between the master and the text, to hold
the Scrollbar widget.
Most methods calls are inherited from the Text widget; Pack, Grid and
Place methods are redirected to the Frame widget however.
�ScrolledText�)�Frame�Text�	Scrollbar�Pack�Grid�Place)�RIGHT�LEFT�Y�BOTHc@seZdZddd�Zdd�ZdS)rNcKs�t|�|_t|j�|_|jjttd�|�d|jji�t	j
||jf|�|jttdd�|j
|jd<tt	���}tt���tt���Btt���B}|�|�}|D]4}|ddkr�|dkr�|d	kr�t||t|j|��q�dS)
N)�side�fillZyscrollcommandT)r
r�expandZcommandr�_ZconfigZ	configure)r�framerZvbar�packr	r�update�setr�__init__r
rZyview�vars�keysrrr�
difference�setattr�getattr)�selfZmaster�kwZ
text_meths�methods�m�r�,/usr/lib64/python3.8/tkinter/scrolledtext.pyrs
$
zScrolledText.__init__cCs
t|j�S)N)�strr)rrrr �__str__)szScrolledText.__str__)N)�__name__�
__module__�__qualname__rr"rrrr rs
cCsHddlm}tddd�}|�|t�|jttdd�|��|�	�dS)Nr)�ENDZwhite�
)ZbgZheightT)rr
r)
�tkinter.constantsr&r�insert�__doc__rrr
Z	focus_setZmainloop)r&Zstextrrr �example-sr+�__main__N)r*�__all__Ztkinterrrrrrrr(r	r
rrrr+r#rrrr �<module>s
 
dialog.cpython-38.opt-2.pyc000064400000002702151732766100011404 0ustar00U

e5d��@srddlTddlmZdZGdd�de�Zdd�Zedkrned	d
ddeeii�Z	ed	d
d
de	j
eii�Ze	��d	S)�)�*)�	_cnfmergeZ	questheadc@s"eZdZdifdd�Zdd�ZdS)�DialogNc
Ks�t||f�}d|_t�|||�|j�|jjd|j|d|d|d|df|d���|_zt�	|�Wnt
k
r~YnXdS)NZ
__dialog__Z	tk_dialog�title�text�bitmap�default�strings)rZ
widgetName�Widget�_setupZtkZgetintZcallZ_w�num�destroyZTclError)�selfZmasterZcnf�kw�r�&/usr/lib64/python3.8/tkinter/dialog.py�__init__
s&���zDialog.__init__cCsdS)Nr)rrrrr
�zDialog.destroy)�__name__�
__module__�__qualname__rr
rrrrr	s
rcCs$tdddtddd��}t|j�dS)Nz
File ModifiedzzFile "Python.h" has been modified since the last time it was saved. Do you want to save it before exiting the application.r)z	Save FilezDiscard ChangeszReturn to Editor)rrrrr	)r�DIALOG_ICON�printr)�drrr�_tests�r�__main__NrZTestZcommandZQuit)
Ztkinterrrr
rrrZButtonZPack�t�quit�qZmainlooprrrr�<module>s$��commondialog.cpython-38.opt-2.pyc000064400000002132151732766100012612 0ustar00U

e5d��@sddlTGdd�d�ZdS)�)�*c@s2eZdZdZd
dd�Zdd�Zdd�Zdd	�ZdS)�DialogNcKs|s|�d�}||_||_dS)N�parent)�get�master�options)�selfrr�r	�,/usr/lib64/python3.8/tkinter/commondialog.py�__init__s
zDialog.__init__cCsdS�Nr	)rr	r	r
�_fixoptionsszDialog._fixoptionscCs|Srr	)rZwidget�resultr	r	r
�
_fixresultszDialog._fixresultcKs||��D]\}}||j|<q|��t|j�}z,|jj|jf|�	|j���}|�
||�}W5z|��WnYnXX|Sr)�itemsrr
ZFramerZdestroyZtkZcall�commandZ_optionsr)rr�k�v�w�sr	r	r
�shows
zDialog.show)N)�__name__�
__module__�__qualname__rrr
rrr	r	r	r
rs

rN)Ztkinterrr	r	r	r
�<module>sfont.cpython-38.opt-2.pyc000064400000012005151732766100011110 0ustar00U

e5d@�@szdZddlZddlZdZdZdZdZdd�ZGd	d
�d
�Zd dd�Z	d!d
d�Z
edk�rve��Z
edded�Zee���ee�d��ee�d��ee���ee�d��ee�d��ee
��ee�d�e�d��eeje
d��edd�Zee�d�ejde
d��eje
ded�Ze��eje
de
jd�Ze��eedd���Zejed�ejed�e��dS)"z0.9�NZnormalZroman�boldZitaliccCst|dd�S)NT)�name�exists)�Font�r�r�$/usr/lib64/python3.8/tkinter/font.py�
nametofontsr	c@s�eZdZe�d�Zdd�Zdd�Zdd�Zd"d
d�Z	dd
�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zd#dd�Zdd�Zdd�ZeZd$dd�Zd d!�ZdS)%r�cCs:g}|��D]$\}}|�d|�|�t|��qt|�S�N�-)�items�append�str�tuple)�self�kw�options�k�vrrr�_set1s
z	Font._setcCs$g}|D]}|�d|�qt|�Sr)rr)r�argsrrrrr�_get8sz	Font._getcCs:i}tdt|�d�D] }||d|||dd�<q|S)Nr�r
)�range�len)rrr�irrr�_mkdict>szFont._mkdictNFcKs�|st�d�}t|d|�}|r4|�|�dd|��}n
|�|�}|sTdtt|j��}||_	|r�d|_
|j	|�|�dd��kr�tj�d|j	f��|r�|jdd|j	f|��n|jdd	|j	f|��d
|_
||_
|j|_|j|_dS)Nzuse font�tk�font�actualF�namesz$named font %s does not already exist�	configureZcreateT)�tkinter�_get_default_root�getattr�	splitlist�callrr�next�counterr�delete_fontZ_tkinterZTclError�_tk�_split�_call)r�rootrrrrrrrr�__init__Ds,


�z
Font.__init__cCs|jS�Nr�rrrr�__str__cszFont.__str__cCs&t|t�stS|j|jko$|j|jkSr0)�
isinstancer�NotImplementedrr+)r�otherrrr�__eq__fs
zFont.__eq__cCs
|�|�Sr0)�cget)r�keyrrr�__getitem__kszFont.__getitem__cCs|jf||i�dSr0)r")rr8�valuerrr�__setitem__nszFont.__setitem__cCs4z|jr|�dd|j�Wntk
r.YnXdS)Nr�delete)r*r-r�	Exceptionr1rrr�__del__qs
zFont.__del__cCst|jf|���Sr0)rr+r r1rrr�copyxsz	Font.copycCs^d}|rd|f}|r8|d|f}|jdd|jf|��S|�|�|jdd|jf|����SdS)Nr�
-displayofrrr )r-rrr,)r�option�	displayofrrrrr |s�zFont.actualcCs|�dd|jd|�S)Nr�configr)r-r)rrArrrr7�sz	Font.cgetc	KsB|r"|jdd|jf|�|���n|�|�|�dd|j���SdS)NrrC)r-rrrr,)rrrrrrC�s��zFont.configcCs2|f}|rd||f}|j�|jdd|jf|���S)Nr@r�measure)r+�getintr-r)r�textrBrrrrrD�s
zFont.measurecOs�d}|�dd�}|rd|f}|rL||�|�}|j�|jdd|jf|���S|�|jdd|jf|���}i}tdt|�d�D](}|j�||d�|||dd�<q||SdS)	NrrBr@r�metricsrrr
)	�poprr+rEr-rr,rr)rrrrrB�resrrrrrG�s�&zFont.metrics)NNNF)NN)N)�__name__�
__module__�__qualname__�	itertools�countr)rrrr/r2r6r9r;r>r?r r7rCr"rDrGrrrrrs"


	
rcCs6|st�d�}d}|rd|f}|j�|jjd|���S)Nzuse font.families()rr@r�families)rrO�r#r$rr&r')r.rBrrrrrO�s
rOcCs$|st�d�}|j�|j�dd��S)Nzuse font.names()rr!rP)r.rrrr!�s
r!�__main__�times�)�family�size�weightrTrVZhelloZ	linespace)rB)ZCourier�r)rzHello, world)rFrzQuit!)rFZcommandr)rV)NN)N)�__version__rMr#ZNORMALZROMANZBOLDZITALICr	rrOr!rJZTkr.�f�printr rCr7rDrGZLabel�wZpackZButtonZdestroyr?ZfbZmainlooprrrr�<module>sB






ttk.cpython-38.pyc000064400000156574151732766100010030 0ustar00U

e5d���@s�dZdZdZddddddd	d
ddd
ddddddddddddddgZddlZddlmZmZmZmZej	dkrpd nd!Z
d"d#�ZdXd$d%�ZdYd&d'�Z
d(d)�ZdZd*d+�Zd[d,d-�Zd\d/d0�Zd1d2�Zd3d4�Zd5d6�Zd7d8�Zd9d:�Zd;d<�Zd=d>�Zd?d�Zd]d@d�ZGdAd�de�ZGdBdC�dCej�ZGdDd�de�ZGdEd�de�ZGdFd�deej �Z GdGd�de �Z!GdHd�de�Z"GdId�de�Z#GdJd	�d	e�Z$e$Z%GdKd�de�Z&GdLd�de�Z'GdMd
�d
eej(�Z)e)Z(GdNd�de�Z*GdOd�de�Z+GdPd�deej,�Z,GdQd�deej-�Z-GdRd�de�Z.GdSd�de�Z/GdTd�de �Z0GdUd�deej1ej2�Z3GdVd�de"�Z4GdWd�de&�Z5dS)^a�Ttk wrapper.

This module provides classes to allow using Tk themed widget set.

Ttk is based on a revised and enhanced version of
TIP #48 (http://tip.tcl.tk/48) specified style engine.

Its basic idea is to separate, to the extent possible, the code
implementing a widget's behavior from the code implementing its
appearance. Widget class bindings are primarily responsible for
maintaining the widget state and invoking callbacks, all aspects
of the widgets appearance lies at Themes.
z0.3.1z!Guilherme Polo <ggpolo@gmail.com>�Button�Checkbutton�Combobox�Entry�Frame�Label�
Labelframe�
LabelFrame�
Menubutton�Notebook�Panedwindow�PanedWindow�Progressbar�Radiobutton�Scale�	Scrollbar�	Separator�Sizegrip�Spinbox�Style�Treeview�LabeledScale�
OptionMenu�
tclobjs_to_py�setup_master�N)�_flatten�_join�
_stringify�
_splitdictg!@TFcCsBtr>ddl}|j�d�}|r,|j�d|�|j�d�d|_dS)NrZTILE_LIBRARYz(global auto_path; lappend auto_path {%s}zpackage require tileT)�
_REQUIRE_TILE�os�environ�get�tk�eval�_tile_loaded)�masterr Ztilelib�r'�#/usr/lib64/python3.8/tkinter/ttk.py�
_load_tile"s��r)cCs(|rt|�}nt|ttf�r$t|�}|S)zInternal function.)r�
isinstance�list�tupler)�value�scriptr'r'r(�_format_optvalue1s

r/cCsPg}|��D]:\}}|r ||kr|�d|�|dk	r|�t||��qt|�S)z�Formats optdict to a tuple to pass it to tk.call.

    E.g. (script=False):
      {'foreground': 'blue', 'padding': [1, 2, 3, 4]} returns:
      ('-foreground', 'blue', '-padding', '1 2 3 4')�-%sN)�items�appendr/r)Zoptdictr.�ignore�opts�optr-r'r'r(�_format_optdict;sr6cCsXg}|D]J�^}}t|�dkr,|dp(d}n
d�|�}|�|�|dk	r|�|�q|S)N�r�� )�len�joinr2)r1Zopt_val�state�valr'r'r(�_mapdict_valuesKs

r>cCs:g}|��D]$\}}|�d|tt|�|�f�qt|�S)z�Formats mapdict to pass it to tk.call.

    E.g. (script=False):
      {'expand': [('active', 'selected', 'grey'), ('focus', [1, 2, 3, 4])]}

      returns:

      ('-expand', '{active selected} grey focus {1, 2, 3, 4}')r0)r1�extendr/r>r)Zmapdictr.r4r5r-r'r'r(�_format_mapdict`s

�r@cOs�d}d}|dkr�|dkrB|d}tt|dd���}d||f}n2|dd�\}}	tt|dd���}
d	||	|
f}t||�}n,|d
kr�|d}t|�dkr�t|d|�f}|r�d|}d�|�}||fS)
zAFormats args and kw according to the given element factory etype.Nr')�imageZvsapirArr7z%s %s�z%s %s %s�fromz{%s}r9)rr>r6r:r/r;)�etyper.�args�kw�specr4ZinameZ	imagespec�
class_nameZpart_idZstatemapr'r'r(�_format_elemcreateqs&
rIrBc
Cs�g}|D]�}|\}}|pi}d�t|dd��}dd|||rDd|ndf}d|kr�|�|d�||7}t|d||�\}	}|�|	�||8}|�d	d|�q|�|�qd
�|�|fS)a$Formats a layout list so we can pass the result to ttk::style
    layout and ttk::style settings. Note that the layout doesn't have to
    be a list necessarily.

    E.g.:
      [("Menubutton.background", None),
       ("Menubutton.button", {"children":
           [("Menubutton.focus", {"children":
               [("Menubutton.padding", {"children":
                [("Menubutton.label", {"side": "left", "expand": 1})]
               })]
           })]
       }),
       ("Menubutton.indicator", {"side": "right"})
      ]

      returns:

      Menubutton.background
      Menubutton.button -children {
        Menubutton.focus -children {
          Menubutton.padding -children {
            Menubutton.label -side left -expand 1
          }
        }
      }
      Menubutton.indicator -side rightr9T)�childrenz%s%s%sz %sr8rJz -children {z%s}�
)r;r6r2�_format_layoutlist)
�layout�indentZindent_sizer.Zlayout_elem�elemr4Zfopts�headZ	newscriptr'r'r(rL�s"
�
rLcCsXg}|��D�]>\}}|�d�rFd�t|dd��}|�d||f�|�d�rvd�t|dd��}|�d||f�d|kr�|ds�d}nt|d�\}}|�d	||f�|�d
�r|d
}|d}d}|t|�kr�t||d
�s�|d7}q�|d|�}	|t|�k�r||�r||ni}
t	|df|	�|
�\}}|�d||||f�qd�|�S)z�Returns an appropriate script, based on settings, according to
    theme_settings definition to be used by theme_settings and
    theme_create.�	configurer9Tzttk::style configure %s %s;�mapzttk::style map %s %s;rM�nullzttk::style layout %s {
%s
}zelement createrr7r1z%ttk::style element create %s %s %s %srK)
r1r"r;r6r2r@rLr:�hasattrrI)�settingsr.�namer4�s�_ZeoptsrDZargcZelemargsZelemkwrGr'r'r(�_script_from_settings�s:



$�
rYcCs�t|t�r|Sg}t|�}t||�D]j\}}t|d�rDt|���}n(t|t�rX|��}nt|ttf�sl|f}t|d�r~t|�}|�||f��q$|S)ztConstruct a list from the given statespec tuple according to the
    accepted statespec accepted by _format_mapdict.�typename)	r*�str�iter�ziprT�splitr,r+r2)Zstuple�result�itr<r=r'r'r(�_list_from_statespec�s




racCs�|�|�}g}d}|t|�kr�||}i}|�||f�|d7}|t|�kr|||d�\}}|�d�slq|dd�}|d7}|dkr�t||�}|||<q@q|S)zpConstruct a list from the tuple returned by ttk::layout, this is
    somewhat the reverse of _format_layoutlist.rr7rB�-NrJ)�	splitlistr:r2�
startswith�_list_from_layouttuple)r#Zltuple�resZindxrVr4r5r=r'r'r(res$


recGs4t|�}|j||�}t|�dr&|St||td�S)ahFormat options then call Tk command with args and options and return
    the appropriate result.

    If no option is specified, a dict is returned. If an option is
    specified with the None value, the value for that option is returned.
    Otherwise, the function just sets the passed options and the caller
    shouldn't be expecting a return value anyway.rB)�conv)r6�callr:r�
_tclobj_to_py)r#�optionsrErfr'r'r(�_val_or_dict!s
rkc	Cs2t|�}zt|�}Wnttfk
r,YnX|S)zAConverts a value to, hopefully, a more appropriate Python object.)r[�int�
ValueError�	TypeError)r-r'r'r(�_convert_stringval1srocCs(t|t�r$d|krt|�}nt|�}|S)N�.)r*r[�floatrl)�xr'r'r(�
_to_number;s


rscCs\|rFt|d�rFt|t�sFt|ddd�dkr6t|�}qXttt|��}nt|d�rXt|�}|S)z8Return value converted from Tcl object to Python object.�__len__rrZNZ	StateSpec)rTr*r[�getattrrar+rRro)r=r'r'r(riCs

ricCs"|��D]\}}t|�||<q|S)zOReturns adict with its values converted from Tcl objects to Python
    objects.)r1ri)Zadictr5r=r'r'r(rPscCs|dkrt��}|S)aIf master is not None, itself is returned. If master is None,
    the default master is returned if there is one, otherwise a new
    master is created and returned.

    If it is not allowed to use the default root and master is None,
    RuntimeError is raised.N)�tkinterZ_get_default_root)r&r'r'r(rXsc@s�eZdZdZdZddd�Zddd�Zddd	�Zdd
d�Zd dd
�Z	dd�Z
dd�Zdd�Zd!dd�Z
dd�Zdd�Zd"dd�ZdS)#rzManipulate style database.z
ttk::styleNcCs0t|�}t|dd�st|�||_|jj|_dS)Nr%F)rrur)r&r#)�selfr&r'r'r(�__init__is
zStyle.__init__cKs4|dk	rd||<t|j||jd|�}|s,|r0|SdS)z�Query or sets the default value of the specified option(s) in
        style.

        Each key in kw is an option and each value is either a string or
        a sequence identifying the value for that option.NrQ)rkr#�_name�rw�styleZ	query_optrFr_r'r'r(rQts
zStyle.configurecsj|dk	r0�j��jd|d|�}t�j�|��S�jj�jd|ft|���}�fdd�t�j|���D�S)aSQuery or sets dynamic values of the specified option(s) in
        style.

        Each key in kw is an option and each value should be a list or a
        tuple (usually) containing statespecs grouped in tuples, or list,
        or something else of your preference. A statespec is compound of
        one or more states and then a value.NrRr0cs"i|]\}}|t�j�|���qSr')rar#rc)�.0�k�v�rwr'r(�
<dictcomp>�s�zStyle.map.<locals>.<dictcomp>)r#rhryrarcr@rr1rzr'rr(rR�s
�z	Style.mapcCs.|rd�|�nd}|j�|jd|d|||�S)aReturns the value specified for option in style.

        If state is specified it is expected to be a sequence of one
        or more states. If the default argument is set, it is used as
        a fallback value in case no specification for option is found.r9r8�lookupr0)r;r#rhry)rwr{�optionr<�defaultr'r'r(r��s
�zStyle.lookupcCs>d}|rt|�d}n|dk	r"d}t|j|j�|jd||��S)a�Define the widget layout for given style. If layoutspec is
        omitted, return the layout specification for given style.

        layoutspec is expected to be a list or an object different than
        None that evaluates to False if you want to "turn off" that style.
        If it is a list (or tuple, or something else), each item should be
        a tuple where the first item is the layout name and the second item
        should have the format described below:

        LAYOUTS

            A layout can contain the value None, if takes no options, or
            a dict of options specifying how to arrange the element.
            The layout mechanism uses a simplified version of the pack
            geometry manager: given an initial cavity, each element is
            allocated a parcel. Valid options/values are:

                side: whichside
                    Specifies which side of the cavity to place the
                    element; one of top, right, bottom or left. If
                    omitted, the element occupies the entire cavity.

                sticky: nswe
                    Specifies where the element is placed inside its
                    allocated parcel.

                children: [sublayout... ]
                    Specifies a list of elements to place inside the
                    element. Each element is a tuple (or other sequence)
                    where the first item is the layout name, and the other
                    is a LAYOUT.NrrSrM)rLrer#rhry)rwr{Z
layoutspecZlspecr'r'r(rM�s �zStyle.layoutcOs8t|df|�|�\}}|jj|jdd|||f|��dS)z9Create a new element in the current theme of given etype.F�element�createN)rIr#rhry)rw�elementnamerDrErFrGr4r'r'r(�element_create�s��zStyle.element_createc	Cs(tdd�|j�|j�|jdd��D��S)z:Returns the list of elements defined in the current theme.css|]}|�d�VqdS�rbN��lstrip)r|�nr'r'r(�	<genexpr>�sz&Style.element_names.<locals>.<genexpr>r��names�r,r#rcrhryrr'r'r(�
element_names�s�zStyle.element_namesc
Cs*tdd�|j�|j�|jdd|��D��S)z)Return the list of elementname's options.css|]}|�d�VqdSr�r�)r|�or'r'r(r��sz(Style.element_options.<locals>.<genexpr>r�rjr�)rwr�r'r'r(�element_options�s�zStyle.element_optionsc
CsN|rt|�nd}|r2|j�|jdd|d|d|�n|j�|jdd|d|�dS)a.Creates a new theme.

        It is an error if themename already exists. If parent is
        specified, the new theme will inherit styles, elements and
        layouts from the specified parent theme. If settings are present,
        they are expected to have the same syntax used for theme_settings.r8�themer�z-parentz	-settingsN�rYr#rhry)rw�	themename�parentrUr.r'r'r(�theme_create�s��zStyle.theme_createcCs"t|�}|j�|jdd||�dS)a�Temporarily sets the current theme to themename, apply specified
        settings and then restore the previous theme.

        Each key in settings is a style and each value may contain the
        keys 'configure', 'map', 'layout' and 'element create' and they
        are expected to have the same format as specified by the methods
        configure, map, layout and element_create respectively.r�rUNr�)rwr�rUr.r'r'r(�theme_settings�szStyle.theme_settingscCs|j�|j�|jdd��S)z#Returns a list of all known themes.r�r�)r#rcrhryrr'r'r(�theme_names�szStyle.theme_namescCs&|dkr|j�d�S|j�d|�dS)z�If themename is None, returns the theme in use, otherwise, set
        the current theme to themename, refreshes all widgets and emits
        a <<ThemeChanged>> event.Nzreturn $ttk::currentThemez
ttk::setTheme)r#r$rh)rwr�r'r'r(�	theme_use�szStyle.theme_use)N)N)N)NN)N)NN)N)�__name__�
__module__�__qualname__�__doc__ryrxrQrRr�rMr�r�r�r�r�r�r�r'r'r'r(rds




+
c@s6eZdZdZddd�Zdd�Zddd�Zd
d	d
�ZdS)�Widgetz!Base class for Tk themed widgets.NcCs4t|�}t|dd�st|�tjj||||d�dS)a�Constructs a Ttk Widget with the parent master.

        STANDARD OPTIONS

            class, cursor, takefocus, style

        SCROLLABLE WIDGET OPTIONS

            xscrollcommand, yscrollcommand

        LABEL WIDGET OPTIONS

            text, textvariable, underline, image, compound, width

        WIDGET STATES

            active, disabled, focus, pressed, selected, background,
            readonly, alternate, invalid
        r%F)rFN)rrur)rvr�rx)rwr&Z
widgetnamerFr'r'r(rxszWidget.__init__cCs|j�|jd||�S)z�Returns the name of the element at position x, y, or the empty
        string if the point does not lie within any element.

        x and y are pixel coordinates relative to the widget.�identify�r#rh�_w�rwrr�yr'r'r(r�+szWidget.identifyc	Os6|j�|j�|jdd�|���}|r2|r2|||�S|S)a1Test the widget's state.

        If callback is not specified, returns True if the widget state
        matches statespec and False otherwise. If callback is specified,
        then it will be invoked with *args, **kw if the widget state
        matches statespec. statespec is expected to be a sequence.�instater9)r#�
getbooleanrhr�r;)rw�	statespec�callbackrErFZretr'r'r(r�3s�
zWidget.instatecCs0|dk	rd�|�}|j�t|j�|jd|���S)aModify or inquire widget state.

        Widget state is returned if statespec is None, otherwise it is
        set according to the statespec flags and then a new state spec
        is returned indicating which flags were changed. statespec is
        expected to be a sequence.Nr9r<)r;r#rcr[rhr�)rwr�r'r'r(r<Bs
zWidget.state)N)N)N)r�r�r�r�rxr�r�r<r'r'r'r(r�
s


r�c@s"eZdZdZddd�Zdd�ZdS)rzcTtk Button widget, displays a textual label and/or image, and
    evaluates a command when pressed.NcKst�||d|�dS)aConstruct a Ttk Button widget with the parent master.

        STANDARD OPTIONS

            class, compound, cursor, image, state, style, takefocus,
            text, textvariable, underline, width

        WIDGET-SPECIFIC OPTIONS

            command, default, width
        zttk::buttonN�r�rx�rwr&rFr'r'r(rxSszButton.__init__cCs|j�|jd�S)z/Invokes the command associated with the button.�invoker�rr'r'r(r�bsz
Button.invoke)N�r�r�r�r�rxr�r'r'r'r(rOs
c@s"eZdZdZddd�Zdd�ZdS)rz;Ttk Checkbutton widget which is either in on- or off-state.NcKst�||d|�dS)a'Construct a Ttk Checkbutton widget with the parent master.

        STANDARD OPTIONS

            class, compound, cursor, image, state, style, takefocus,
            text, textvariable, underline, width

        WIDGET-SPECIFIC OPTIONS

            command, offvalue, onvalue, variable
        zttk::checkbuttonNr�r�r'r'r(rxjszCheckbutton.__init__cCs|j�|jd�S)aWToggles between the selected and deselected states and
        invokes the associated command. If the widget is currently
        selected, sets the option variable to the offvalue option
        and deselects the widget; otherwise, sets the option variable
        to the option onvalue.

        Returns the result of the associated command.r�r�rr'r'r(r�yszCheckbutton.invoke)Nr�r'r'r'r(rgs
c@s2eZdZdZddd�Zdd�Zdd�Zd	d
�ZdS)rzeTtk Entry widget displays a one-line text string and allows that
    string to be edited by the user.NcKst�|||pd|�dS)a�Constructs a Ttk Entry widget with the parent master.

        STANDARD OPTIONS

            class, cursor, style, takefocus, xscrollcommand

        WIDGET-SPECIFIC OPTIONS

            exportselection, invalidcommand, justify, show, state,
            textvariable, validate, validatecommand, width

        VALIDATION MODES

            none, key, focus, focusin, focusout, all
        z
ttk::entryNr�)rwr&ZwidgetrFr'r'r(rx�szEntry.__init__cCs|�|j�|jd|��S)zqReturn a tuple of (x, y, width, height) which describes the
        bounding box of the character given by index.�bbox�Z_getintsr#rhr�)rw�indexr'r'r(r��sz
Entry.bboxcCs|j�|jd||�S)zxReturns the name of the element at position x, y, or the
        empty string if the coordinates are outside the window.r�r�r�r'r'r(r��szEntry.identifycCs|j�|j�|jd��S)z�Force revalidation, independent of the conditions specified
        by the validate option. Returns False if validation fails, True
        if it succeeds. Sets or clears the invalid state accordingly.�validate�r#r�rhr�rr'r'r(r��szEntry.validate)NN)r�r�r�r�rxr�r�r�r'r'r'r(r�s

c@s,eZdZdZd	dd�Zd
dd�Zdd�ZdS)rzMTtk Combobox widget combines a text field with a pop-down list of
    values.NcKstj||df|�dS)aConstruct a Ttk Combobox widget with the parent master.

        STANDARD OPTIONS

            class, cursor, style, takefocus

        WIDGET-SPECIFIC OPTIONS

            exportselection, justify, height, postcommand, state,
            textvariable, values, width
        z
ttk::comboboxN�rrxr�r'r'r(rx�szCombobox.__init__cCs2|dkr |j�|j�|jd��S|j�|jd|�S)aIf newindex is supplied, sets the combobox value to the
        element at position newindex in the list of values. Otherwise,
        returns the index of the current value in the list of values
        or -1 if the current value does not appear in the list.N�current�r#Zgetintrhr�)rwZnewindexr'r'r(r��szCombobox.currentcCs|j�|jd|�dS)z(Sets the value of the combobox to value.�setNr��rwr-r'r'r(r��szCombobox.set)N)N)r�r�r�r�rxr�r�r'r'r'r(r�s


c@seZdZdZddd�ZdS)rzJTtk Frame widget is a container, used to group other widgets
    together.NcKst�||d|�dS)z�Construct a Ttk Frame with parent master.

        STANDARD OPTIONS

            class, cursor, style, takefocus

        WIDGET-SPECIFIC OPTIONS

            borderwidth, relief, padding, width, height
        z
ttk::frameNr�r�r'r'r(rx�szFrame.__init__)N�r�r�r�r�rxr'r'r'r(r�sc@seZdZdZddd�ZdS)rz7Ttk Label widget displays a textual label and/or image.NcKst�||d|�dS)aGConstruct a Ttk Label with parent master.

        STANDARD OPTIONS

            class, compound, cursor, image, style, takefocus, text,
            textvariable, underline, width

        WIDGET-SPECIFIC OPTIONS

            anchor, background, font, foreground, justify, padding,
            relief, text, wraplength
        z
ttk::labelNr�r�r'r'r(rx�s
zLabel.__init__)Nr�r'r'r'r(r�sc@seZdZdZddd�ZdS)rz�Ttk Labelframe widget is a container used to group other widgets
    together. It has an optional label, which may be a plain text string
    or another widget.NcKst�||d|�dS)z�Construct a Ttk Labelframe with parent master.

        STANDARD OPTIONS

            class, cursor, style, takefocus

        WIDGET-SPECIFIC OPTIONS
            labelanchor, text, underline, padding, labelwidget, width,
            height
        zttk::labelframeNr�r�r'r'r(rx�szLabelframe.__init__)Nr�r'r'r'r(r�sc@seZdZdZddd�ZdS)r	zbTtk Menubutton widget displays a textual label and/or image, and
    displays a menu when pressed.NcKst�||d|�dS)aConstruct a Ttk Menubutton with parent master.

        STANDARD OPTIONS

            class, compound, cursor, image, state, style, takefocus,
            text, textvariable, underline, width

        WIDGET-SPECIFIC OPTIONS

            direction, menu
        zttk::menubuttonNr�r�r'r'r(rxszMenubutton.__init__)Nr�r'r'r'r(r	
sc@sneZdZdZddd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
ddd�Zddd�Zdd�Z
dd�ZdS)r
z�Ttk Notebook widget manages a collection of windows and displays
    a single one at a time. Each child window is associated with a tab,
    which the user may select to change the currently-displayed window.NcKst�||d|�dS)a\Construct a Ttk Notebook with parent master.

        STANDARD OPTIONS

            class, cursor, style, takefocus

        WIDGET-SPECIFIC OPTIONS

            height, padding, width

        TAB OPTIONS

            state, sticky, padding, text, image, compound, underline

        TAB IDENTIFIERS (tab_id)

            The tab_id argument found in several methods may take any of
            the following forms:

                * An integer between zero and the number of tabs
                * The name of a child window
                * A positional specification of the form "@x,y", which
                  defines the tab
                * The string "current", which identifies the
                  currently-selected tab
                * The string "end", which returns the number of tabs (only
                  valid for method index)
        z
ttk::notebookNr�r�r'r'r(rx"szNotebook.__init__cKs |jj|jd|ft|���dS)z�Adds a new tab to the notebook.

        If window is currently managed by the notebook but hidden, it is
        restored to its previous position.�addN�r#rhr�r6)rw�childrFr'r'r(r�BszNotebook.addcCs|j�|jd|�dS)zXRemoves the tab specified by tab_id, unmaps and unmanages the
        associated window.�forgetNr��rw�tab_idr'r'r(r�JszNotebook.forgetcCs|j�|jd|�dS)z�Hides the tab specified by tab_id.

        The tab will not be displayed, but the associated window remains
        managed by the notebook and its configuration remembered. Hidden
        tabs may be restored with the add command.�hideNr�r�r'r'r(r�Psz
Notebook.hidecCs|j�|jd||�S)zZReturns the name of the tab element at position x, y, or the
        empty string if none.r�r�r�r'r'r(r�YszNotebook.identifycCs|j�|j�|jd|��S)z|Returns the numeric index of the tab specified by tab_id, or
        the total number of tabs if tab_id is the string "end".r�r�r�r'r'r(r�_szNotebook.indexcKs"|jj|jd||ft|���dS)z�Inserts a pane at the specified position.

        pos is either the string end, an integer index, or the name of
        a managed child. If child is already managed by the notebook,
        moves it to the specified position.�insertNr��rw�posr�rFr'r'r(r�eszNotebook.insertcCs|j�|jd|�S)z�Selects the specified tab.

        The associated child window will be displayed, and the
        previously-selected window (if different) is unmapped. If tab_id
        is omitted, returns the widget name of the currently selected
        pane.�selectr�r�r'r'r(r�nszNotebook.selectcKs$|dk	rd||<t|j||jd|�S)z�Query or modify the options of the specific tab_id.

        If kw is not given, returns a dict of the tab option values. If option
        is specified, returns the value of that option. Otherwise, sets the
        options to the corresponding values.N�tab�rkr#r�)rwr�r�rFr'r'r(r�xszNotebook.tabcCs|j�|j�|jd�pd�S)z2Returns a list of windows managed by the notebook.�tabsr'�r#rcrhr�rr'r'r(r��sz
Notebook.tabscCs|j�d|j�dS)a�Enable keyboard traversal for a toplevel window containing
        this notebook.

        This will extend the bindings for the toplevel window containing
        this notebook as follows:

            Control-Tab: selects the tab following the currently selected
                         one

            Shift-Control-Tab: selects the tab preceding the currently
                               selected one

            Alt-K: where K is the mnemonic (underlined) character of any
                   tab, will select that tab.

        Multiple notebooks in a single toplevel may be enabled for
        traversal, including nested notebooks. However, notebook traversal
        only works properly if all panes are direct children of the
        notebook.zttk::notebook::enableTraversalNr�rr'r'r(�enable_traversal�szNotebook.enable_traversal)N)N)N)r�r�r�r�rxr�r�r�r�r�r�r�r�r�r�r'r'r'r(r
s
 		


c@s>eZdZdZddd�ZejjZdd�Zddd�Z	d
d	d
�Z
dS)rzfTtk Panedwindow widget displays a number of subwindows, stacked
    either vertically or horizontally.NcKst�||d|�dS)z�Construct a Ttk Panedwindow with parent master.

        STANDARD OPTIONS

            class, cursor, style, takefocus

        WIDGET-SPECIFIC OPTIONS

            orient, width, height

        PANE OPTIONS

            weight
        zttk::panedwindowNr�r�r'r'r(rx�szPanedwindow.__init__cKs"|jj|jd||ft|���dS)z�Inserts a pane at the specified positions.

        pos is either the string end, and integer index, or the name
        of a child. If child is already managed by the paned window,
        moves it to the specified position.r�Nr�r�r'r'r(r��szPanedwindow.insertcKs$|dk	rd||<t|j||jd|�S)aQQuery or modify the options of the specified pane.

        pane is either an integer index or the name of a managed subwindow.
        If kw is not given, returns a dict of the pane option values. If
        option is specified then the value for that option is returned.
        Otherwise, sets the options to the corresponding values.N�paner�)rwr�r�rFr'r'r(r��szPanedwindow.panecCs|j�|j�|jd||��S)aLIf newpos is specified, sets the position of sash number index.

        May adjust the positions of adjacent sashes to ensure that
        positions are monotonically increasing. Sash positions are further
        constrained to be between 0 and the total size of the widget.

        Returns the new position of sash number index.�sashposr�)rwr�Znewposr'r'r(r��szPanedwindow.sashpos)N)N)N)r�r�r�r�rxrvrr�r�r�r�r'r'r'r(r�s
	
c@s6eZdZdZddd�Zddd�Zd
dd�Zd	d
�ZdS)r
a6Ttk Progressbar widget shows the status of a long-running
    operation. They can operate in two modes: determinate mode shows the
    amount completed relative to the total amount of work to be done, and
    indeterminate mode provides an animated display to let the user know
    that something is happening.NcKst�||d|�dS)z�Construct a Ttk Progressbar with parent master.

        STANDARD OPTIONS

            class, cursor, style, takefocus

        WIDGET-SPECIFIC OPTIONS

            orient, length, mode, maximum, value, variable, phase
        zttk::progressbarNr�r�r'r'r(rx�szProgressbar.__init__cCs|j�|jd|�dS)z�Begin autoincrement mode: schedules a recurring timer event
        that calls method step every interval milliseconds.

        interval defaults to 50 milliseconds (20 steps/second) if omitted.�startNr�)rwZintervalr'r'r(r��szProgressbar.startcCs|j�|jd|�dS)zRIncrements the value option by amount.

        amount defaults to 1.0 if omitted.�stepNr�)rwZamountr'r'r(r��szProgressbar.stepcCs|j�|jd�dS)zVStop autoincrement mode: cancels any recurring timer event
        initiated by start.�stopNr�rr'r'r(r�szProgressbar.stop)N)N)N)r�r�r�r�rxr�r�r�r'r'r'r(r
�s



c@s"eZdZdZddd�Zdd�ZdS)rzeTtk Radiobutton widgets are used in groups to show or change a
    set of mutually-exclusive options.NcKst�||d|�dS)aConstruct a Ttk Radiobutton with parent master.

        STANDARD OPTIONS

            class, compound, cursor, image, state, style, takefocus,
            text, textvariable, underline, width

        WIDGET-SPECIFIC OPTIONS

            command, value, variable
        zttk::radiobuttonNr�r�r'r'r(rxszRadiobutton.__init__cCs|j�|jd�S)z�Sets the option variable to the option value, selects the
        widget, and invokes the associated command.

        Returns the result of the command, or an empty string if
        no command is specified.r�r�rr'r'r(r�szRadiobutton.invoke)Nr�r'r'r'r(rs
c@s.eZdZdZd	dd�Zd
dd�Zddd�ZdS)rzTtk Scale widget is typically used to control the numeric value of
    a linked variable that varies uniformly over some range.NcKst�||d|�dS)z�Construct a Ttk Scale with parent master.

        STANDARD OPTIONS

            class, cursor, style, takefocus

        WIDGET-SPECIFIC OPTIONS

            command, from, length, orient, to, value, variable
        z
ttk::scaleNr�r�r'r'r(rx'szScale.__init__cKsTtj||f|�}t|td�tf�s,|�|�td|kd|kd|kg�rP|�d�|S)z�Modify or query scale options.

        Setting a value for any of the "from", "from_" or "to" options
        generates a <<RangeChanged>> event.NrC�from_�to�<<RangeChanged>>)r�rQr*�typer[�update�anyZevent_generate)rwZcnfrFZretvalr'r'r(rQ5s

zScale.configurecCs|j�|jd||�S)z�Get the current value of the value option, or the value
        corresponding to the coordinates x, y if they are specified.

        x and y are pixel coordinates relative to the scale widget
        origin.r"r�r�r'r'r(r"Bsz	Scale.get)N)N)NN)r�r�r�r�rxrQr"r'r'r'r(r#s


c@seZdZdZddd�ZdS)rz;Ttk Scrollbar controls the viewport of a scrollable widget.NcKst�||d|�dS)z�Construct a Ttk Scrollbar with parent master.

        STANDARD OPTIONS

            class, cursor, style, takefocus

        WIDGET-SPECIFIC OPTIONS

            command, orient
        zttk::scrollbarNr�r�r'r'r(rxNszScrollbar.__init__)Nr�r'r'r'r(rKsc@seZdZdZddd�ZdS)rzITtk Separator widget displays a horizontal or vertical separator
    bar.NcKst�||d|�dS)z�Construct a Ttk Separator with parent master.

        STANDARD OPTIONS

            class, cursor, style, takefocus

        WIDGET-SPECIFIC OPTIONS

            orient
        zttk::separatorNr�r�r'r'r(rx`szSeparator.__init__)Nr�r'r'r'r(r\sc@seZdZdZddd�ZdS)rzlTtk Sizegrip allows the user to resize the containing toplevel
    window by pressing and dragging the grip.NcKst�||d|�dS)z�Construct a Ttk Sizegrip with parent master.

        STANDARD OPTIONS

            class, cursor, state, style, takefocus
        z
ttk::sizegripNr�r�r'r'r(rxrszSizegrip.__init__)Nr�r'r'r'r(rnsc@s"eZdZdZddd�Zdd�ZdS)rz�Ttk Spinbox is an Entry with increment and decrement arrows

    It is commonly used for number entry or to select from a list of
    string values.
    NcKstj||df|�dS)a/Construct a Ttk Spinbox widget with the parent master.

        STANDARD OPTIONS

            class, cursor, style, takefocus, validate,
            validatecommand, xscrollcommand, invalidcommand

        WIDGET-SPECIFIC OPTIONS

            to, from_, increment, values, wrap, format, command
        zttk::spinboxNr�r�r'r'r(rx�szSpinbox.__init__cCs|j�|jd|�dS)z'Sets the value of the Spinbox to value.r�Nr�r�r'r'r(r��szSpinbox.set)N)r�r�r�r�rxr�r'r'r'r(r|s
c@s4eZdZdZdEdd�ZdFdd�ZdGdd�Zd	d
�ZdHdd�Zd
d�Z	dd�Z
dd�ZdIdd�ZdJdd�Z
dd�Zdd�Zdd�Zdd�Zdd �Zd!d"�ZdKd#d$�ZdLd%d&�Zd'd(�ZeZd)d*�Zd+d,�Zd-d.�Zd/d0�Zd1d2�Zd3d4�Zd5d6�Zd7d8�Zd9d:�Z d;d<�Z!dMd=d>�Z"dNd?d@�Z#dOdAdB�Z$dPdCdD�Z%dS)Qrz�Ttk Treeview widget displays a hierarchical collection of items.

    Each item has a textual label, an optional image, and an optional list
    of data values. The data values are displayed in successive columns
    after the tree label.NcKst�||d|�dS)a�Construct a Ttk Treeview with parent master.

        STANDARD OPTIONS

            class, cursor, style, takefocus, xscrollcommand,
            yscrollcommand

        WIDGET-SPECIFIC OPTIONS

            columns, displaycolumns, height, padding, selectmode, show

        ITEM OPTIONS

            text, image, values, open, tags

        TAG OPTIONS

            foreground, background, font, image
        z
ttk::treeviewNr�r�r'r'r(rx�szTreeview.__init__cCs|�|j�|jd||��pdS)aTReturns the bounding box (relative to the treeview widget's
        window) of the specified item in the form x y width height.

        If column is specified, returns the bounding box of that cell.
        If the item is not visible (i.e., if it is a descendant of a
        closed item or is scrolled offscreen), returns an empty string.r�r8r�)rw�item�columnr'r'r(r��sz
Treeview.bboxcCs"|j�|j�|jd|pd�pd�S)zhReturns a tuple of children belonging to item.

        If item is not specified, returns root children.rJr8r'r��rwr�r'r'r(�get_children�s�zTreeview.get_childrencGs|j�|jd||�dS)z�Replaces item's child with newchildren.

        Children present in item that are not present in newchildren
        are detached from tree. No items in newchildren may be an
        ancestor of item.rJNr�)rwr�Znewchildrenr'r'r(�set_children�szTreeview.set_childrencKs$|dk	rd||<t|j||jd|�S)a
Query or modify the options for the specified column.

        If kw is not given, returns a dict of the column option values. If
        option is specified then the value for that option is returned.
        Otherwise, sets the options to the corresponding values.Nr�r�)rwr�r�rFr'r'r(r��szTreeview.columncGs|j�|jd|�dS)z_Delete all specified items and all their descendants. The root
        item may not be deleted.�deleteNr��rwr1r'r'r(r��szTreeview.deletecGs|j�|jd|�dS)z�Unlinks all of the specified items from the tree.

        The items and all of their descendants are still present, and may
        be reinserted at another point in the tree, but will not be
        displayed. The root item may not be detached.�detachNr�r�r'r'r(r��szTreeview.detachcCs|j�|j�|jd|��S)zSReturns True if the specified item is present in the tree,
        False otherwise.�existsr�r�r'r'r(r��szTreeview.existscCs|j�|jd|�S)z}If item is specified, sets the focus item to item. Otherwise,
        returns the current focus item, or '' if there is none.�focusr�r�r'r'r(r��szTreeview.focuscKsP|�d�}|r,t|t�s,|j�||j�|d<|dk	r<d||<t|j||jd|�S)a_Query or modify the heading options for the specified column.

        If kw is not given, returns a dict of the heading option values. If
        option is specified then the value for that option is returned.
        Otherwise, sets the options to the corresponding values.

        Valid options/values are:
            text: text
                The text to display in the column heading
            image: image_name
                Specifies an image to display to the right of the column
                heading
            anchor: anchor
                Specifies how the heading text should be aligned. One of
                the standard Tk anchor values
            command: callback
                A callback to be invoked when the heading label is
                pressed.

        To configure the tree column heading, call this with column = "#0" �commandN�heading)	r"r*r[r&�registerZ_substituterkr#r�)rwr�r�rF�cmdr'r'r(r��s
zTreeview.headingcCs|j�|jd|||�S)z�Returns a description of the specified component under the
        point given by x and y, or the empty string if no such component
        is present at that position.r�r�)rwZ	componentrrr�r'r'r(r�szTreeview.identifycCs|�dd|�S)z.Returns the item ID of the item at position y.�rowr�r�)rwr�r'r'r(�identify_rowszTreeview.identify_rowcCs|�d|d�S)zaReturns the data column identifier of the cell at position x.

        The tree column has ID #0.r�rr�)rwrrr'r'r(�identify_column"szTreeview.identify_columncCs|�d||�S)z�Returns one of:

        heading: Tree heading area.
        separator: Space between two columns headings;
        tree: The tree area.
        cell: A data cell.

        * Availability: Tk 8.6Zregionr�r�r'r'r(�identify_region)s	zTreeview.identify_regioncCs|�d||�S)zEReturns the element at position x, y.

        * Availability: Tk 8.6r�r�r�r'r'r(�identify_element5szTreeview.identify_elementcCs|j�|j�|jd|��S)zOReturns the integer index of item within its parent's list
        of children.r�r�r�r'r'r(r�<szTreeview.indexcKsNt|�}|dk	r0|jj|jd||d|f|��}n|jj|jd||f|��}|S)a�Creates a new item and return the item identifier of the newly
        created item.

        parent is the item ID of the parent item, or the empty string
        to create a new top-level item. index is an integer, or the value
        end, specifying where in the list of parent's children to insert
        the new item. If index is less than or equal to zero, the new node
        is inserted at the beginning, if index is greater than or equal to
        the current number of children, it is inserted at the end. If iid
        is specified, it is used as the item identifier, iid must not
        already exist in the tree. Otherwise, a new unique identifier
        is generated.Nr�z-id)r6r#rhr�)rwr�r�ZiidrFr4rfr'r'r(r�Bs
��zTreeview.insertcKs$|dk	rd||<t|j||jd|�S)a-Query or modify the options for the specified item.

        If no options are given, a dict with options/values for the item
        is returned. If option is specified then the value for that option
        is returned. Otherwise, sets the options to the corresponding
        values as given by kw.Nr�r�)rwr�r�rFr'r'r(r�Ysz
Treeview.itemcCs|j�|jd|||�dS)aRMoves item to position index in parent's list of children.

        It is illegal to move an item under one of its descendants. If
        index is less than or equal to zero, item is moved to the
        beginning, if greater than or equal to the number of children,
        it is moved to the end. If item was detached it is reattached.�moveNr�)rwr�r�r�r'r'r(r�esz
Treeview.movecCs|j�|jd|�S)zeReturns the identifier of item's next sibling, or '' if item
        is the last child of its parent.�nextr�r�r'r'r(r�qsz
Treeview.nextcCs|j�|jd|�S)zaReturns the ID of the parent of item, or '' if item is at the
        top level of the hierarchy.r�r�r�r'r'r(r�wszTreeview.parentcCs|j�|jd|�S)zjReturns the identifier of item's previous sibling, or '' if
        item is the first child of its parent.�prevr�r�r'r'r(r�}sz
Treeview.prevcCs|j�|jd|�dS)z�Ensure that item is visible.

        Sets all of item's ancestors open option to True, and scrolls
        the widget if necessary so that item is within the visible
        portion of the tree.�seeNr�r�r'r'r(r��szTreeview.seecCs|j�|j�|jd��S)z$Returns the tuple of selected items.�	selectionr�rr'r'r(r��szTreeview.selectioncCs>t|�dkr&t|dttf�r&|d}|j�|jd||�dS)Nr7rr�)r:r*r,r+r#rhr�)rwZselopr1r'r'r(�
_selection�szTreeview._selectioncGs|�d|�dS)z.The specified items becomes the new selection.r�N�r�r�r'r'r(�
selection_set�szTreeview.selection_setcGs|�d|�dS)z0Add all of the specified items to the selection.r�Nr�r�r'r'r(�
selection_add�szTreeview.selection_addcGs|�d|�dS)z5Remove all of the specified items from the selection.�removeNr�r�r'r'r(�selection_remove�szTreeview.selection_removecGs|�d|�dS)z2Toggle the selection state of each specified item.ZtoggleNr�r�r'r'r(�selection_toggle�szTreeview.selection_togglecCs@|j�|jd|||�}|dkr8|dkr8t|j|dtd�S|SdS)a;Query or set the value of given item.

        With one argument, return a dictionary of column/value pairs
        for the specified item. With two arguments, return the current
        value of the specified column. With three arguments, set the
        value of given column in given item to the specified value.r�NF)Z	cut_minusrg)r#rhr�rri)rwr�r�r-rfr'r'r(r��s�zTreeview.setcCs |j|jdd|f||dd�dS)z�Bind a callback for the given event sequence to the tag tagname.
        When an event is delivered to an item, the callbacks for each
        of the item's tags option are called.�tag�bindr)r�N)Z_bindr�)rw�tagnameZsequencer�r'r'r(�tag_bind�szTreeview.tag_bindcKs&|dk	rd||<t|j||jdd|�S)aBQuery or modify the options for the specified tagname.

        If kw is not given, returns a dict of the option settings for tagname.
        If option is specified, returns the value for that option for the
        specified tagname. Otherwise, sets the options to the corresponding
        values for the given tagname.Nr�rQr�)rwr�r�rFr'r'r(�
tag_configure�s
�zTreeview.tag_configurec	CsF|dkr$|j�|j�|jdd|��S|j�|j�|jdd||��SdS)z�If item is specified, returns 1 or 0 depending on whether the
        specified item has the given tagname. Otherwise, returns a list of
        all items which have the specified tag.

        * Availability: Tk 8.6Nr�Zhas)r#rcrhr�r�)rwr�r�r'r'r(�tag_has�s��zTreeview.tag_has)N)N)N)N)N)N)N)N)NN)NN)N)N)&r�r�r�r�rxr�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�r�Zreattachr�r�r�r�r�r�r�r�r�r�r�r�r�r�r'r'r'r(r�sF



	
	

 

		



csLeZdZdZddd�Z�fdd�Zd	d
�Zedd��Zej	d
d��Z�Z
S)rz�A Ttk Scale widget with a Ttk Label widget indicating its
    current value.

    The Ttk Scale can be accessed through instance.scale, and Ttk Label
    can be accessed through instance.labelNr�
c	Ks|�dd�dk|_tj||f|�|p.t�|�|_|j�|�||_t	|�|_
t||j||d�|_|j�
d|j�|jr|dnd}|dkr�dnd}|jj|dd�t	|�}|j|d�|��|j
j|dkr�d	nd
d�|j�d|j�|_|�
d
|j�|�
d|j�dS)a�Construct a horizontal LabeledScale with parent master, a
        variable to be associated with the Ttk Scale widget and its range.
        If variable is not specified, a tkinter.IntVar is created.

        WIDGET-SPECIFIC OPTIONS

            compound: 'top' or 'bottom'
                Specifies how to display the label relative to the scale.
                Defaults to 'top'.
        Zcompound�top)�variabler�r�r�Zbottomrr)�sideZfill)r�r�rW)Zanchor�wz<Configure>z<Map>N)�pop�
_label_toprrxrvZIntVar�	_variabler��_last_validr�labelr�scaler��_adjustZpack�lowerZplaceZtrace_variable�_LabeledScale__tracecb)	rwr&r�r�r�rFZ
scale_sideZ
label_sideZdummyr'r'r(rx�s$
zLabeledScale.__init__csHz|j�d|j�Wntk
r(YnX|`t���d|_d|_dS)z9Destroy this widget and possibly its associated variable.r�N)r�Z
trace_vdeleter�AttributeError�super�destroyrrr��	__class__r'r(rs
zLabeledScale.destroycs��fdd�}t�jd�}t�jd�}||kr:||}}�j��}||krX|ksfn�j�_dS|�_|�jd<��|�dS)z1Adjust the label position according to the scale.csZ����j��\}}�jr2�j���j��}n�j���j��}�jj||d�dS)N�rrr�)Zupdate_idletasksrZcoordsr�Zwinfo_yrZwinfo_reqheightZplace_configurerrr'r(�adjust_labelsz*LabeledScale._adjust.<locals>.adjust_labelrCr�N�text)rsrr�r"rr-rZ
after_idle)rwrErr�r�Znewvalr'rr(rs


zLabeledScale._adjustcCs
|j��S)zReturn current scale value.)r�r"rr'r'r(r-4szLabeledScale.valuecCs|j�|�dS)zSet new scale value.N)r�r�)rwr=r'r'r(r-9s)NNrr�)r�r�r�r�rxrr�propertyr-�setter�
__classcell__r'r'r	r(r�s
&

cs<eZdZdZddd�Zdd�Zddd�Z�fd	d
�Z�ZS)
rzmThemed OptionMenu, based after tkinter's OptionMenu, which allows
    the user to select a value from a menu.NcOs�||�dd�|�dd�d�}tj||f|�tj|dd�|d<||_|�dd�|_|rpt�d	tt	|�
�����|j|f|��dS)
a9Construct a themed OptionMenu widget with master as the parent,
        the resource textvariable set to variable, the initially selected
        value specified by the default parameter, the menu values given by
        *values and additional keywords.

        WIDGET-SPECIFIC OPTIONS

            style: stylename
                Menubutton style.
            direction: 'above', 'below', 'left', 'right', or 'flush'
                Menubutton direction.
            command: callback
                A callback that will be invoked after selecting an item.
        r{N�	direction)Ztextvariabler{rF)Ztearoff�menur�zunknown option -%s)r�r	rxrvZMenur��	_callbackZTclErrorr�r\�keys�set_menu)rwr&r�r��values�kwargsrFr'r'r(rxCs
��zOptionMenu.__init__cCs&|dkr|�t�||��St�||�S)Nr)Znametowidgetr	�__getitem__r�r'r'r(r`szOptionMenu.__getitem__cGsR|d}|�dd�|D]$}|j|t�|j||j�|jd�q|rN|j�|�dS)zUBuild a new menu of radiobuttons with *values and optionally
        a default value.rr�end)rr�r�N)r�Zadd_radiobuttonrvZ_setitr�rr�)rwr�rrr=r'r'r(rgs�zOptionMenu.set_menucs,z|`Wntk
rYnXt���dS)z0Destroy this widget and its associated variable.N)r�rrrrr	r'r(rus
zOptionMenu.destroy)N)N)	r�r�r�r�rxrrrrr'r'r	r(r?s


)F)FN)F)F)rrB)N)6r��__version__�
__author__�__all__rvrrrrZ	TkVersionrr)r/r6r>r@rIrLrYrarerkrorsrirr�objectrr�rrrrrrrrr	r
rrr
rrrrrrZXViewZYViewrrrr'r'r'r(�<module>s��	




%
1*


*B*"8*(J`constants.cpython-38.opt-2.pyc000064400000003170151732766100012161 0ustar00U

e5d��@s8dZZZdZZZdZdZdZdZ	dZ
dZdZd	Z
d
ZdZdZd
ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!dZ"dZ#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,Z0d-Z1d.Z2d/Z3d0Z4d1Z5d2Z6d3Z7d4Z8d5Z9d6Z:d7Z;d8Z<d9Z=d:Z>d;Z?d<Z@d=ZAd>ZBd?ZCd@ZDdAZEdBZFdCZGdDZHdEZIdFZJdGZKdHZLdIS)J���n�s�w�eZnw�sw�neZse�nsZewZnsew�centerZnone�x�yZboth�left�top�rightZbottomZraisedZsunkenZflatZridgeZgrooveZsolidZ
horizontalZvertical�numeric�charZwordZbaselineZinsideZoutsideZselz	sel.firstzsel.last�end�insertZcurrentZanchor�allZnormalZdisabledZactiveZhiddenZcascadeZcheckbuttonZcommandZradiobuttonZ	separatorZsingleZbrowseZmultipleZextendedZdotboxZ	underlineZpiesliceZchordZarc�firstZlastZbuttZ
projecting�roundZbevelZmiterZmovetoZscrollZunitsZpagesN)MZNOZFALSEZOFFZYESZTRUEZON�N�S�W�EZNWZSWZNEZSEZNSZEWZNSEWZCENTERZNONE�X�YZBOTHZLEFTZTOPZRIGHTZBOTTOMZRAISEDZSUNKENZFLATZRIDGEZGROOVEZSOLIDZ
HORIZONTALZVERTICALZNUMERICZCHARZWORDZBASELINEZINSIDEZOUTSIDEZSELZ	SEL_FIRSTZSEL_LASTZENDZINSERTZCURRENTZANCHORZALLZNORMALZDISABLEDZACTIVEZHIDDENZCASCADEZCHECKBUTTONZCOMMANDZRADIOBUTTONZ	SEPARATORZSINGLEZBROWSEZMULTIPLEZEXTENDEDZDOTBOXZ	UNDERLINEZPIESLICEZCHORDZARCZFIRSTZLASTZBUTTZ
PROJECTINGZROUNDZBEVELZMITERZMOVETOZSCROLLZUNITSZPAGES�rr�)/usr/lib64/python3.8/tkinter/constants.py�<module>s�filedialog.cpython-38.opt-2.pyc000064400000024362151732766100012252 0ustar00U

e5d�8�@sddlTddlmZddlmZddlmZddlZddlZiZGdd�d�Z	Gdd	�d	e	�Z
Gd
d�de	�ZGdd
�d
ej�ZGdd�de�Z
Gdd�de�ZGdd�dej�Zdd�Zdd�Zdd�Zd'dd�Zd(dd�Zd)d d!�Zd"d#�Zd$d%�Zed&k�re�dS)*�)�*)�Dialog)�commondialog)�
_setup_dialogNc@s�eZdZdZd#dd�Zejdddfdd�Zd$d	d
�Zdd�Z	d
d�Z
dd�Zdd�Zdd�Z
dd�Zd%dd�Zdd�Zdd�Zd&dd�Zdd �Zd!d"�ZdS)'�
FileDialogzFile Selection DialogNcCs�|dkr|j}||_d|_t|�|_|j�|�|j�|�t|j�t|j�|_|jj	t
td�t|j�|_
|j
j	t
td�|j
�d|j�t|j�|_|jj	ttd�|j�d|j�t|j�|_|jj	ttd�t|j�|_|jj	ttd�t|jd|jdfd�|_|jj	tttd�|j��}|j�|dd�|dd��|j�d	|j�|j�d
|j�|jj|jdfd�t|j�|_ |j j	t!td�t|jd|j dfd�|_"|j"j	t!ttd�|j j|j"dfd�|j"��}|j"�|dd�|dd��|j"�d	|j#�|j"�d
|j$�t%|jd
|j&d�|_'|j'j	t!d�t%|jd|jd�|_(|j(j	t!td�t%|jd|j)d�|_*|j*j	td�|j�+d|j)�|j�d|j)�|j�d|j)�dS)N)�side�fillz<Return>)�expandrr�set)ZexportselectionZyscrollcommand)rr	r�z<ButtonRelease-1>z<Double-ButtonRelease-1>Zyview)�commandZOK)�textr)rZFilter)rr	�CancelZWM_DELETE_WINDOWz<Alt-w>z<Alt-W>),�title�master�	directoryZToplevel�topZiconnamerZFrameZbotframeZpackZBOTTOM�XZEntry�	selectionZbind�ok_event�filterZTOP�filter_commandZmidframeZYESZBOTHZ	ScrollbarZfilesbarZRIGHT�YZListbox�filesZbindtags�files_select_event�files_double_eventZconfigZdirsbarZLEFT�dirs�dirs_select_event�dirs_double_eventZButton�
ok_commandZ	ok_buttonZ
filter_button�cancel_commandZ
cancel_buttonZprotocol)�selfrrZbtags�r"�*/usr/lib64/python3.8/tkinter/filedialog.py�__init__4st

�
 �
 ���zFileDialog.__init__r�cCs�|r|tkrt|\|_}n2tj�|�}tj�|�r<||_ntj�|�\|_}|�|j|�|�|�|�	�|j
��|j�
�|j��d|_|j��|r�|��\}}|jr�tj�|j�}||ft|<|j��|jS�N)�dialogstatesr�os�path�
expanduser�isdir�split�
set_filter�
set_selectionrrZ	focus_setrZwait_visibilityZgrab_set�howrZmainloop�
get_filter�dirnameZdestroy)r!Zdir_or_file�pattern�default�keyrr"r"r#�gots*





z
FileDialog.gocCs||_|j��dSr&)r/r�quit)r!r/r"r"r#r6�szFileDialog.quitcCs|��dSr&)r�r!�eventr"r"r#r�szFileDialog.dirs_double_eventcCs@|��\}}|j�d�}tj�tj�|j|��}|�||�dS�NZactive)	r0r�getr(r)�normpath�joinrr-)r!r8�dir�patZsubdirr"r"r#r�szFileDialog.dirs_select_eventcCs|��dSr&�rr7r"r"r#r�szFileDialog.files_double_eventcCs|j�d�}|�|�dSr9)rr:r.)r!r8�filer"r"r#r�szFileDialog.files_select_eventcCs|��dSr&r?r7r"r"r#r�szFileDialog.ok_eventcCs|�|���dSr&)r6�
get_selection�r!r"r"r#r�szFileDialog.ok_commandcCs&|��\}}zt�|�}Wn tk
r:|j��YdSX||_|�||�|��tj	g}g}|D]@}tj
�||�}tj
�|�r�|�
|�qft�||�rf|�
|�qf|j�dt�|D]}|j�t|�q�|j�dt�|D]}|j�t|�q�tj
�|���\}	}
|
tjk�rd}
|�|
�dS)Nrr%)r0r(�listdir�OSErrorr�bellrr-�sort�pardirr)r<r+�append�fnmatchr�delete�END�insertrr,rA�curdirr.)r!r8r=r>�namesZsubdirsZ
matchingfiles�name�fullname�head�tailr"r"r#r�s6
zFileDialog.filter_commandcCsN|j��}tj�|�}|dd�tjks4tj�|�rBtj�|d�}tj�|�S)N���r)	rr:r(r)r*�sepr+r<r,)r!rr"r"r#r0�s

zFileDialog.get_filtercCs|j��}tj�|�}|Sr&)rr:r(r)r*�r!r@r"r"r#rA�s
zFileDialog.get_selectioncCs|��dSr&)r6r7r"r"r#r �szFileDialog.cancel_commandcCs�tj�|�sPzt��}Wntk
r0d}YnX|rPtj�||�}tj�|�}|j�dt	�|j�
t	tj�|pttj|pzd��dS)Nrr)r(r)�isabs�getcwdrDr<r;rrJrKrLrM)r!r=r>�pwdr"r"r#r-�s
zFileDialog.set_filtercCs,|j�dt�|j�ttj�|j|��dS)Nr)rrJrKrLr(r)r<rrUr"r"r#r.�szFileDialog.set_selection)N)N)N)N)�__name__�
__module__�__qualname__rr$r(rMr5r6rrrrrrrr0rAr r-r.r"r"r"r#rs 
@


rc@seZdZdZdd�ZdS)�LoadFileDialogzLoad File Selection DialogcCs.|��}tj�|�s |j��n
|�|�dSr&)rAr(r)�isfilerrEr6rUr"r"r#r�szLoadFileDialog.ok_commandN�rYrZr[rrr"r"r"r#r\�sr\c@seZdZdZdd�ZdS)�SaveFileDialogzSave File Selection DialogcCs�|��}tj�|�rZtj�|�r.|j��dSt|jdd|fdddd�}|j	dkr�dSn*tj�
|�\}}tj�|�s�|j��dS|�|�dS)Nz Overwrite Existing File QuestionzOverwrite existing file %r?Z	questheadr)ZYesr)rr
Zbitmapr3Zstringsr)rAr(r)�existsr+rrErrZnumr,r6)r!r@�drQrRr"r"r#r�s&
�

zSaveFileDialog.ok_commandNr^r"r"r"r#r_�sr_c@seZdZdd�Zdd�ZdS)�_DialogcCs2zt|jd�|jd<Wntk
r,YnXdS)N�	filetypes)�tuple�options�KeyErrorrBr"r"r#�_fixoptions,sz_Dialog._fixoptionscCsR|rHz
|j}Wntk
r"YnXtj�|�\}}||jd<||jd<||_|S)N�
initialdirZinitialfile)�string�AttributeErrorr(r)r,re�filename�r!�widget�resultr)r@r"r"r#�
_fixresult3s


z_Dialog._fixresultN)rYrZr[rgror"r"r"r#rb*srbc@seZdZdZdd�ZdS)�OpenZtk_getOpenFilecCsxt|t�rBtdd�|D��}|r>tj�|d�\}}||jd<|S|j��sjd|jkrj|�||j�	|��St
�|||�S)NcSsg|]}t|d|��qS)ri)�getattr)�.0�rr"r"r#�
<listcomp>Nsz#Open._fixresult.<locals>.<listcomp>rrh�multiple)�
isinstancerdr(r)r,reZtkZwantobjectsroZ	splitlistrbrlr"r"r#roKs

zOpen._fixresultN�rYrZr[rror"r"r"r#rpFsrpc@seZdZdZdS)�SaveAsZtk_getSaveFileN)rYrZr[rr"r"r"r#rxZsrxc@seZdZdZdd�ZdS)�	DirectoryZtk_chooseDirectorycCs8|r.z
|j}Wntk
r"YnX||jd<||_|S)Nrh)rirjrer)r!rmrnr"r"r#rofs

zDirectory._fixresultNrwr"r"r"r#ryasrycKstf|���Sr&�rp�show�rer"r"r#�askopenfilenamewsr}cKstf|���Sr&)rxr{r|r"r"r#�asksaveasfilename}sr~cKsd|d<tf|���S)Nrrurzr|r"r"r#�askopenfilenames�srrscKs tf|���}|rt||�SdSr&)rpr{�open��modererkr"r"r#�askopenfile�s
r�cKs4tf|�}|r0g}|D]}|�t||��q|}|Sr&)rrHr�)r�rerZofilesrkr"r"r#�askopenfiles�s
r��wcKs tf|���}|rt||�SdSr&)rxr{r�r�r"r"r#�
asksaveasfile�s
r�cKstf|���Sr&)ryr{r|r"r"r#�askdirectory�sr�c
	Cs�t�}|��t|�}|jdd�}t|�}|jdd�}t||�d}ddl}z&ddl}|�|j	d�|�
|j�}Wntt
fk
r�YnXtdgd�}zt|d�}|��Wn$td	�t|��d
�YnXtd|�|��t�}	td|	�|��dS)
N�test)r4zutf-8rr%)z	all filesr)rcrszCould not open File: rr�Zsaveas)ZTkZwithdrawr\r5r_�print�sys�locale�	setlocale�LC_ALL�nl_langinfo�CODESET�ImportErrorrjr}r��close�exc_info�encoder~)
�root�fdZloadfileZsavefile�encr�r�Zopenfilename�fpZsaveasfilenamer"r"r#r��s2

r��__main__)rs)rs)r�)ZtkinterZtkinter.dialogrrZtkinter.simpledialogrr(rIr'rr\r_rbrprxryr}r~rr�r�r�r�r�rYr"r"r"r#�<module>s0I9
	

	,
colorchooser.cpython-38.opt-1.pyc000064400000004316151732766100012650 0ustar00U

e5dA
�@s>ddlmZGdd�de�Zd	dd�Zedkr:ede��dS)
�)�Dialogc@s$eZdZdZdZdd�Zdd�ZdS)�Choosera�Create a dialog for the tk_chooseColor command.

    Args:
        master: The master widget for this dialog.  If not provided,
            defaults to options['parent'] (if defined).
        options: Dictionary of options for the tk_chooseColor call.
            initialcolor: Specifies the selected color when the
                dialog is first displayed.  This can be a tk color
                string or a 3-tuple of ints in the range (0, 255)
                for an RGB triplet.
            parent: The parent window of the color dialog.  The
                color dialog is displayed on top of this.
            title: A string for the title of the dialog box.
    Ztk_chooseColorcCs@z&|jd}t|t�r$d||jd<Wntk
r:YnXdS)zvEnsure initialcolor is a tk color string.

        Convert initialcolor from a RGB triplet to a color string.
        �initialcolorz
#%02x%02x%02xN)�options�
isinstance�tuple�KeyError)�self�color�r�,/usr/lib64/python3.8/tkinter/colorchooser.py�_fixoptions!s

zChooser._fixoptionscCs>|rt|�sdS|�|�\}}}|d|d|dft|�fS)z�Adjust result returned from call to tk_chooseColor.

        Return both an RGB tuple of ints in the range (0, 255) and the
        tk color string in the form #rrggbb.
        )NN�)�strZ	winfo_rgb)r	Zwidget�result�r�g�brrr�
_fixresult.szChooser._fixresultN)�__name__�
__module__�__qualname__�__doc__Zcommandr
rrrrrrs
rNcKs"|r|��}||d<tf|���S)z�Display dialog window for selection of a color.

    Convenience wrapper for the Chooser class.  Displays the color
    chooser dialog with color as the initial value.
    r)�copyrZshow)r
rrrr�askcolorBsr�__main__r
)N)Ztkinter.commondialogrrrr�printrrrr�<module>s3
constants.cpython-38.pyc000064400000003170151732766100011221 0ustar00U

e5d��@s8dZZZdZZZdZdZdZdZ	dZ
dZdZd	Z
d
ZdZdZd
ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!dZ"dZ#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,Z0d-Z1d.Z2d/Z3d0Z4d1Z5d2Z6d3Z7d4Z8d5Z9d6Z:d7Z;d8Z<d9Z=d:Z>d;Z?d<Z@d=ZAd>ZBd?ZCd@ZDdAZEdBZFdCZGdDZHdEZIdFZJdGZKdHZLdIS)J���n�s�w�eZnw�sw�neZse�nsZewZnsew�centerZnone�x�yZboth�left�top�rightZbottomZraisedZsunkenZflatZridgeZgrooveZsolidZ
horizontalZverticalZnumeric�charZwordZbaselineZinsideZoutsideZselz	sel.firstzsel.last�end�insertZcurrentZanchor�allZnormalZdisabledZactiveZhiddenZcascadeZcheckbuttonZcommandZradiobuttonZ	separatorZsingleZbrowseZmultipleZextendedZdotboxZ	underlineZpiesliceZchordZarc�firstZlastZbuttZ
projecting�roundZbevelZmiterZmovetoZscrollZunitsZpagesN)MZNOZFALSEZOFFZYESZTRUEZON�N�S�W�EZNWZSWZNEZSEZNSZEWZNSEWZCENTERZNONE�X�YZBOTHZLEFTZTOPZRIGHTZBOTTOMZRAISEDZSUNKENZFLATZRIDGEZGROOVEZSOLIDZ
HORIZONTALZVERTICALZNUMERICZCHARZWORDZBASELINEZINSIDEZOUTSIDEZSELZ	SEL_FIRSTZSEL_LASTZENDZINSERTZCURRENTZANCHORZALLZNORMALZDISABLEDZACTIVEZHIDDENZCASCADEZCHECKBUTTONZCOMMANDZRADIOBUTTONZ	SEPARATORZSINGLEZBROWSEZMULTIPLEZEXTENDEDZDOTBOXZ	UNDERLINEZPIESLICEZCHORDZARCZFIRSTZLASTZBUTTZ
PROJECTINGZROUNDZBEVELZMITERZMOVETOZSCROLLZUNITSZPAGES�rr�)/usr/lib64/python3.8/tkinter/constants.py�<module>s�dnd.cpython-38.opt-2.pyc000064400000014246151732766100010720 0ustar00U

e5d�,�@sTddlZdd�ZGdd�d�ZGdd�d�ZGdd	�d	�Zd
d�ZedkrPe�dS)
�NcCst||�}|jr|SdSdS�N)�
DndHandler�root)�source�event�h�r�#/usr/lib64/python3.8/tkinter/dnd.py�	dnd_startls
r
c@sDeZdZdZdd�Zdd�Zdd�Zdd	�Zdd
d�Zdd
d�Z	dS)rNcCs�|jdkrdS|j��}z|jWdStk
rD||_||_YnX||_d|_|j|_}|j|_	}d||f|_
|dp�d|_|�|j
|j
�|�d|j�d|d<dS)N�z<B%d-ButtonRelease-%d>�cursor��<Motion>Zhand2)Znum�widgetZ_root�_DndHandler__dnd�AttributeErrorrr�targetZinitial_button�initial_widget�release_pattern�save_cursor�bind�
on_release�	on_motion)�selfrrrZbuttonrrrr	�__init__zs$

zDndHandler.__init__cCs2|j}d|_|r.z|`Wntk
r,YnXdSr)rrr�rrrrr	�__del__�szDndHandler.__del__c	Cs�|j|j}}|j�||�}|j}d}|rbz
|j}Wntk
rHYnX|||�}|rZqb|j}q&|j}||kr�|r�|�	||�n,|r�d|_|�
||�|r�|�||�||_dSr)�x_root�y_rootrZwinfo_containingr�
dnd_acceptrZmasterr�
dnd_motion�	dnd_leave�	dnd_enter)	rr�x�yZ
target_widgetr�
new_target�attrZ
old_targetrrr	r�s.

zDndHandler.on_motioncCs|�|d�dS)N���finish�rrrrr	r�szDndHandler.on_releasecCs|�|d�dS)Nrr(r*rrr	�cancel�szDndHandler.cancelrc
Cs�|j}|j}|j}|j}zf|`|j�|j�|j�d�|j|d<d|_|_|_|_|r||rp|�	||�n|�
||�W5|�||�XdS)Nrr)rrrr�dnd_endrZunbindrr�
dnd_commitr!)rrZcommitrrrrrrr	r)�s
zDndHandler.finish)N)r)
�__name__�
__module__�__qualname__rrrrrr+r)rrrr	rvs	
rc@sNeZdZdd�Zddd�Zdd�Zdd	�Zd
d�Zdd
�Zdd�Z	dd�Z
dS)�IconcCs||_d|_|_|_dSr)�name�canvas�label�id)rr2rrr	r�sz
Icon.__init__�
cCs�||jkr |j�|j||�dS|jr.|��|s6dStj||jddd�}|j|||dd�}||_||_||_|�	d|j
�dS)N�Zraised)�textZborderwidthZreliefZnw)ZwindowZanchorz
<ButtonPress>)r3�coordsr5�detach�tkinterZLabelr2Z
create_windowr4r�press)rr3r#r$r4r5rrr	�attach�s 

�zIcon.attachcCsB|j}|sdS|j}|j}d|_|_|_|�|�|��dSr)r3r5r4�deleteZdestroy)rr3r5r4rrr	r:�s
zIcon.detachcCs4t||�r0|j|_|j|_|j�|j�\|_|_	dSr)
r
r#�x_offr$�y_offr3r9r5�x_orig�y_origr*rrr	r<�s
z
Icon.presscCs(|�|j|�\}}|j�|j||�dSr)�wherer3r9r5)rrr#r$rrr	�move�sz	Icon.movecCs|j�|j|j|j�dSr)r3r9r5rArB)rrrr	�putback�szIcon.putbackcCs8|��}|��}|j|}|j|}||j||jfSr)Zwinfo_rootxZwinfo_rootyrrr?r@)rr3rZx_orgZy_orgr#r$rrr	rC�s


z
Icon.wherecCsdSrr)rrrrrr	r,szIcon.dnd_endN)r6r6)r.r/r0rr=r:r<rDrErCr,rrrr	r1�s


r1c@s<eZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
S)�TestercCs>t�|�|_tj|jddd�|_|jjddd�|j|j_dS)N�d)�widthZheightZbothr')Zfill�expand)r;ZToplevel�topZCanvasr3�packrrrrr	rszTester.__init__cCs|Srr�rrrrrr	rszTester.dnd_acceptcCsp|j��|�|j|�\}}|j�|j�\}}}}||||}	}
|j�||||	||
�|_|�||�dSr)r3�	focus_setrC�bboxr5Zcreate_rectangle�dndidr )rrrr#r$�x1�y1�x2�y2ZdxZdyrrr	r"s
zTester.dnd_enterc	CsF|�|j|�\}}|j�|j�\}}}}|j�|j||||�dSr)rCr3rNrOrD)	rrrr#r$rPrQrRrSrrr	r szTester.dnd_motioncCs"|j��|j�|j�d|_dSr)rJrMr3r>rOrLrrr	r!$s
zTester.dnd_leavecCs2|�||�|�|j|�\}}|�|j||�dSr)r!rCr3r=)rrrr#r$rrr	r-)szTester.dnd_commitN)	r.r/r0rrr"r r!r-rrrr	rFsrFcCs�t��}|�d�tj|jdd���t|�}|j�d�t|�}|j�d�t|�}|j�d�td�}td�}td	�}|�	|j
�|�	|j
�|�	|j
�|��dS)
Nz+1+1ZQuit)Zcommandr8z+1+60z+120+60z+240+60ZICON1ZICON2ZICON3)r;ZTkZgeometryZButton�quitrKrFrJr1r=r3Zmainloop)r�t1�t2Zt3Zi1Zi2Zi3rrr	�test/s 
rW�__main__)r;r
rr1rFrWr.rrrr	�<module>gs
Y=#simpledialog.cpython-38.opt-1.pyc000064400000025370151732766100012623 0ustar00U

e5d�-�@s�dZddlTddlmZmZGdd�d�ZGdd�de�Zdd	�ZGd
d�de�ZGdd
�d
e�Z	dd�Z
Gdd�de�Zdd�ZGdd�de�Z
dd�Zedkr�dd�Ze�dS)a&This modules handles dialog boxes.

It contains the following public symbols:

SimpleDialog -- A simple but flexible modal dialog box

Dialog -- a base class for dialogs

askinteger -- get an integer from the user

askfloat -- get a float from the user

askstring -- get a string from the user
�)�*)�
messagebox�_get_default_rootc@sLeZdZdgddddfdd�Zddd�Zd	d
�Zdd�Zd
d�Zdd�ZdS)�SimpleDialog�NcCs|rt||d�|_n
t|�|_|r:|j�|�|j�|�t|j�t|j|dd�|_|jjdtd�t	|j�|_
|j
��||_||_||_
|j�d|j�tt|��D]L}||}	t|j
|	||fdd�d	�}
||kr�|
jtd
d�|
jttdd�q�|j�d
|j�|�|�dS)N)�class_i�)�textZaspect�)�expand�fill�<Return>cSs
|�|�S�N)�done��self�num�r�,/usr/lib64/python3.8/tkinter/simpledialog.py�<lambda>8�z'SimpleDialog.__init__.<locals>.<lambda>�r�command�)ZreliefZborderwidth)�siderr
�WM_DELETE_WINDOW)�Toplevel�root�titleZiconname�
_setup_dialogZMessage�message�packZBOTH�Frame�framer�cancel�default�bind�return_event�range�len�ButtonZconfigZRIDGE�LEFT�protocol�wm_delete_window�_set_transient)r�masterr�buttonsr$r#rrr�s�brrr�__init__ s2


�zSimpleDialog.__init__��?�333333�?c
Cs|j}|��|�|�|��|��rJ|��}|��}|��}|��}n|�	�}|�
�}d}}|��}	|��}
|||	|}|||
|}||	|�	�kr�|�	�|	}n|dkr�d}||
|�
�kr�|�
�|
}n|dkr�d}|�
d||f�|��dS)Nr�+%d+%d)r�withdraw�	transient�update_idletasksZwinfo_ismappedZwinfo_widthZwinfo_height�winfo_rootx�winfo_rootyZwinfo_screenwidthZwinfo_screenheightZwinfo_reqwidthZwinfo_reqheight�geometry�	deiconify)
rr.ZrelxZrelyZwidgetZm_widthZm_heightZm_xZm_yZw_widthZw_height�x�yrrrr-?s4

zSimpleDialog._set_transientcCs.|j��|j��|j��|j��|jSr
)r�wait_visibility�grab_set�mainloop�destroyr�rrrr�go\s




zSimpleDialog.gocCs&|jdkr|j��n|�|j�dSr
)r$r�bellr�rZeventrrrr&cs
zSimpleDialog.return_eventcCs&|jdkr|j��n|�|j�dSr
)r#rrErrCrrrr,is
zSimpleDialog.wm_delete_windowcCs||_|j��dSr
)rr�quitrrrrroszSimpleDialog.done)r3r4)	�__name__�
__module__�__qualname__r2r-rDr&r,rrrrrrs�

rc@sVeZdZdZddd�Zdd�Zdd�Zd	d
�Zddd�Zdd
d�Z	dd�Z
dd�ZdS)�DialogzZClass to open dialogs.

    This class is intended as a base class for custom dialogs
    NcCs�|}|std�}t�||�|��|dk	r>|��r>|�|�|rL|�|�t|�||_d|_	t
|�}|�|�|_|j
ddd�|��|js�||_|�d|j�|dk	r�|�d|��d|��df�|��|j��|��|��|�|�dS)z�Initialize a dialog.

        Arguments:

            parent -- a parent window (the application window)

            title -- the dialog title
        zcreate dialog windowN�)�padx�padyrr5�2)rrr2r6Zwinfo_viewabler7rr�parent�resultr!�body�
initial_focusr �	buttonboxr+r#r;r9r:r<�	focus_setr?r@Zwait_window)rrPrr.rRrrrr2{s8	


�
zDialog.__init__cCsd|_t�|�dS)zDestroy the windowN)rSrrBrCrrrrB�szDialog.destroycCsdS)z�create dialog body.

        return widget that should have initial focus.
        This method should be overridden, and is called
        by the __init__ method.
        Nr)rr.rrrrR�szDialog.bodycCsvt|�}t|dd|jtd�}|jtddd�t|dd|jd�}|jtddd�|�d|j�|�d	|j�|��d
S)z[add standard button box.

        override if you do not want the standard buttons
        ZOK�
)r�widthrr$rL)rrMrN�Cancel)rrWrrz<Escape>N)r!r)�okZACTIVEr r*r#r%)rZbox�wrrrrT�szDialog.buttonboxcCsB|��s|j��dS|��|��z|��W5|��XdSr
)�validaterSrUr6r8r#�applyrFrrrrY�s
z	Dialog.okcCs |jdk	r|j��|��dSr
)rPrUrBrFrrrr#�s

z
Dialog.cancelcCsdS)z�validate the data

        This method is called automatically to validate the data before the
        dialog is destroyed. By default, it always validates OK.
        r	rrCrrrr[�szDialog.validatecCsdS)z�process the data

        This method is called automatically to process the data, *after*
        the dialog is destroyed. By default, it does nothing.
        NrrCrrrr\�szDialog.apply)N)N)N)rHrIrJ�__doc__r2rBrRrTrYr#r[r\rrrrrKts
7	


	rKcCs:|jdkr |j�dd|dd�n|jdkr6|�dd�dS)	NZaquaz!::tk::unsupported::MacWindowStyleZstyleZ
moveableModalrZx11z-typeZdialog)Z_windowingsystemZtkZcallZ
wm_attributes)rZrrrrs

�
rc@s.eZdZd
dd�Zdd�Zdd�Zdd	�ZdS)�_QueryDialogNcCs*||_||_||_||_t�|||�dSr
)�prompt�minvalue�maxvalue�initialvaluerKr2)rrr_rbr`rarPrrrr2s
z_QueryDialog.__init__cCsd|_t�|�dSr
)�entryrKrBrCrrrrBsz_QueryDialog.destroycCsrt||jtd�}|jddtd�t|dd�|_|jjddttd�|jdk	rl|j�	d|j�|j�
dt�|jS)N)rZjustifyrrL)�rowrMZstickyrc)�namer	)ZLabelr_r*Zgrid�WZEntryrc�Erb�insertZselect_rangeZEND)rr.rZrrrrR s
z_QueryDialog.bodycCs�z|��}Wn,tk
r8tjd|jd|d�YdSX|jdk	rh||jkrhtjdd|j|d�dS|jdk	r�||jkr�tjdd|j|d�dS||_d	S)
Nz
Illegal valuez
Please try again)rPrz	Too smallz2The allowed minimum value is %s. Please try again.z	Too largez2The allowed maximum value is %s. Please try again.r	)�	getresult�
ValueErrorr�showwarning�errormessager`rarQ)rrQrrrr[.s:�����z_QueryDialog.validate)NNNN)rHrIrJr2rBrRr[rrrrr^
s�

r^c@seZdZdZdd�ZdS)�
_QueryIntegerzNot an integer.cCs|�|j���Sr
)Zgetintrc�getrCrrrriSsz_QueryInteger.getresultN�rHrIrJrlrirrrrrmPsrmcKst||f|�}|jS)z�get an integer from the user

    Arguments:

        title -- the dialog title
        prompt -- the label text
        **kw -- see SimpleDialog class

    Return value is an integer
    )rmrQ�rr_�kw�drrr�
askintegerWsrsc@seZdZdZdd�ZdS)�_QueryFloatzNot a floating point value.cCs|�|j���Sr
)Z	getdoublercrnrCrrrriisz_QueryFloat.getresultNrorrrrrtfsrtcKst||f|�}|jS)z�get a float from the user

    Arguments:

        title -- the dialog title
        prompt -- the label text
        **kw -- see SimpleDialog class

    Return value is a float
    )rtrQrprrr�askfloatmsruc@s$eZdZdd�Zdd�Zdd�ZdS)�_QueryStringcOs6d|kr|d|_|d=nd|_tj|f|�|�dS)N�show)�_QueryString__showr^r2)r�argsrqrrrr2}s

z_QueryString.__init__cCs(t�||�}|jdk	r$|j|jd�|S)N)rw)r^rRrxZ	configure)rr.rcrrrrR�s
z_QueryString.bodycCs
|j��Sr
)rcrnrCrrrri�sz_QueryString.getresultN)rHrIrJr2rRrirrrrrv|srvcKst||f|�}|jS)z�get a string from the user

    Arguments:

        title -- the dialog title
        prompt -- the label text
        **kw -- see SimpleDialog class

    Return value is a string
    )rvrQrprrr�	askstring�srz�__main__cCsLt�}|fdd�}t|d|d�}|��t|d|jd�}|��|��dS)NcSs^t|ddddgdddd�}t|���ttd	d
dd��ttd	d
ddd��ttd	d��dS)Nz�This is a test dialog.  Would this have been an actual dialog, the buttons below would have been glowing in soft pink light.
Do you believe this?ZYesZNorXr�zTest Dialog)rr/r$r#rZSpamz	Egg count�)rbzEgg weight
(in tons)r	�d)r`raz	Egg label)r�printrDrsrurz)rrrrrr�doit�s�

�ztest.<locals>.doitZTestrZQuit)ZTkr)r rGrA)rr��t�qrrr�test�sr�N)r]ZtkinterrrrrrKrr^rmrsrtrurvrzrHr�rrrr�<module>s V
Cmessagebox.cpython-38.opt-1.pyc000064400000005661151732766100012310 0ustar00U

e5d}�@sHddlmZdZdZdZdZdZdZdZd	Z	d
Z
dZdZd
Z
dZdZdZdZdZGdd�de�Zd5dd�Zd6dd�Zd7dd�Zd8dd�Zd9dd�Zd:dd �Zd;d!d"�Zd<d#d$�Zd=d%d&�Zed'k�rDeded(d)��eded(d*��eded(d+��eded(d,��ed-ed(d.��ed/ed(d0��ed1ed(d2��ed3ed(d4��dS)>�)�Dialog�error�infoZquestionZwarningZabortretryignore�okZokcancelZretrycancelZyesnoZyesnocancel�abortZretry�ignoreZcancelZyesZnoc@seZdZdZdZdS)�Messagez
A message boxZ
tk_messageBoxN)�__name__�
__module__�__qualname__�__doc__Zcommand�r
r
�*/usr/lib64/python3.8/tkinter/messagebox.pyr9srNcKsl|rd|kr||d<|r(d|kr(||d<|r4||d<|r@||d<tf|���}t|t�rd|r`tStSt|�S)NZicon�type�title�message)rZshow�
isinstance�bool�YES�NO�str)rrZ_iconZ_type�options�resr
r
r�_showCs
rcKst||ttf|�S)zShow an info message)r�INFO�OK�rrrr
r
r�showinfoRsrcKst||ttf|�S)zShow a warning message)r�WARNINGrrr
r
r�showwarningWsrcKst||ttf|�S)zShow an error message)r�ERRORrrr
r
r�	showerror\sr!cKst||ttf|�S)zAsk a question)r�QUESTION�YESNOrr
r
r�askquestionasr$cKst||ttf|�}|tkS)z@Ask if operation should proceed; return true if the answer is ok)rr"�OKCANCELr�rrr�sr
r
r�askokcancelfsr(cKst||ttf|�}|tkS)z0Ask a question; return true if the answer is yes)rr"r#rr&r
r
r�askyesnolsr)cKs.t||ttf|�}t|�}|tkr&dS|tkS)zDAsk a question; return true if the answer is yes, None if cancelled.N)rr"�YESNOCANCELr�CANCELrr&r
r
r�askyesnocancelrs
r,cKst||ttf|�}|tkS)zDAsk if operation should be retried; return true if the answer is yes)rr�RETRYCANCEL�RETRYr&r
r
r�askretrycancel|sr/�__main__ZSpamzEgg InformationzEgg Warningz	Egg Alertz	Question?ZproceedzProceed?zyes/nozGot it?z
yes/no/cancelzWant it?z	try againz
Try again?)NNNN)NN)NN)NN)NN)NN)NN)NN)NN)Ztkinter.commondialogrr rr"rZABORTRETRYIGNORErr%r-r#r*ZABORTr.ZIGNOREr+rrrrrrr!r$r(r)r,r/r	�printr
r
r
r�<module>sH










	
messagebox.cpython-38.pyc000064400000005661151732766100011351 0ustar00U

e5d}�@sHddlmZdZdZdZdZdZdZdZd	Z	d
Z
dZdZd
Z
dZdZdZdZdZGdd�de�Zd5dd�Zd6dd�Zd7dd�Zd8dd�Zd9dd�Zd:dd �Zd;d!d"�Zd<d#d$�Zd=d%d&�Zed'k�rDeded(d)��eded(d*��eded(d+��eded(d,��ed-ed(d.��ed/ed(d0��ed1ed(d2��ed3ed(d4��dS)>�)�Dialog�error�infoZquestionZwarningZabortretryignore�okZokcancelZretrycancelZyesnoZyesnocancel�abortZretry�ignoreZcancelZyesZnoc@seZdZdZdZdS)�Messagez
A message boxZ
tk_messageBoxN)�__name__�
__module__�__qualname__�__doc__Zcommand�r
r
�*/usr/lib64/python3.8/tkinter/messagebox.pyr9srNcKsl|rd|kr||d<|r(d|kr(||d<|r4||d<|r@||d<tf|���}t|t�rd|r`tStSt|�S)NZicon�type�title�message)rZshow�
isinstance�bool�YES�NO�str)rrZ_iconZ_type�options�resr
r
r�_showCs
rcKst||ttf|�S)zShow an info message)r�INFO�OK�rrrr
r
r�showinfoRsrcKst||ttf|�S)zShow a warning message)r�WARNINGrrr
r
r�showwarningWsrcKst||ttf|�S)zShow an error message)r�ERRORrrr
r
r�	showerror\sr!cKst||ttf|�S)zAsk a question)r�QUESTION�YESNOrr
r
r�askquestionasr$cKst||ttf|�}|tkS)z@Ask if operation should proceed; return true if the answer is ok)rr"�OKCANCELr�rrr�sr
r
r�askokcancelfsr(cKst||ttf|�}|tkS)z0Ask a question; return true if the answer is yes)rr"r#rr&r
r
r�askyesnolsr)cKs.t||ttf|�}t|�}|tkr&dS|tkS)zDAsk a question; return true if the answer is yes, None if cancelled.N)rr"�YESNOCANCELr�CANCELrr&r
r
r�askyesnocancelrs
r,cKst||ttf|�}|tkS)zDAsk if operation should be retried; return true if the answer is yes)rr�RETRYCANCEL�RETRYr&r
r
r�askretrycancel|sr/�__main__ZSpamzEgg InformationzEgg Warningz	Egg Alertz	Question?ZproceedzProceed?zyes/nozGot it?z
yes/no/cancelzWant it?z	try againz
Try again?)NNNN)NN)NN)NN)NN)NN)NN)NN)NN)Ztkinter.commondialogrr rr"rZABORTRETRYIGNORErr%r-r#r*ZABORTr.ZIGNOREr+rrrrrrr!r$r(r)r,r/r	�printr
r
r
r�<module>sH










	
scrolledtext.cpython-38.opt-2.pyc000064400000003126151732766100012662 0ustar00U

e5d�@shdgZddlmZmZmZmZmZmZddlm	Z	m
Z
mZmZGdd�de�Z
dd�Zedkrde�dS)	�ScrolledText�)�Frame�Text�	Scrollbar�Pack�Grid�Place)�RIGHT�LEFT�Y�BOTHc@seZdZddd�Zdd�ZdS)rNcKs�t|�|_t|j�|_|jjttd�|�d|jji�t	j
||jf|�|jttdd�|j
|jd<tt	���}tt���tt���Btt���B}|�|�}|D]4}|ddkr�|dkr�|d	kr�t||t|j|��q�dS)
N)�side�fillZyscrollcommandT)r
r�expandZcommandr�_ZconfigZ	configure)r�framerZvbar�packr	r�update�setr�__init__r
rZyview�vars�keysrrr�
difference�setattr�getattr)�selfZmaster�kwZ
text_meths�methods�m�r�,/usr/lib64/python3.8/tkinter/scrolledtext.pyrs
$
zScrolledText.__init__cCs
t|j�S)N)�strr)rrrr �__str__)szScrolledText.__str__)N)�__name__�
__module__�__qualname__rr"rrrr rs
cCsHddlm}tddd�}|�|t�|jttdd�|��|�	�dS)Nr)�ENDZwhite�
)ZbgZheightT)rr
r)
�tkinter.constantsr&r�insert�__doc__rrr
Z	focus_setZmainloop)r&Zstextrrr �example-sr+�__main__N)�__all__Ztkinterrrrrrrr(r	r
rrrr+r#rrrr �<module>s 
dnd.cpython-38.pyc000064400000026000151732766100007747 0ustar00U

e5d�,�@sXdZddlZdd�ZGdd�d�ZGdd�d�ZGd	d
�d
�Zdd�Zed
krTe�dS)aFDrag-and-drop support for Tkinter.

This is very preliminary.  I currently only support dnd *within* one
application, between different windows (or within the same window).

I am trying to make this as generic as possible -- not dependent on
the use of a particular widget or icon type, etc.  I also hope that
this will work with Pmw.

To enable an object to be dragged, you must create an event binding
for it that starts the drag-and-drop process. Typically, you should
bind <ButtonPress> to a callback function that you write. The function
should call Tkdnd.dnd_start(source, event), where 'source' is the
object to be dragged, and 'event' is the event that invoked the call
(the argument to your callback function).  Even though this is a class
instantiation, the returned instance should not be stored -- it will
be kept alive automatically for the duration of the drag-and-drop.

When a drag-and-drop is already in process for the Tk interpreter, the
call is *ignored*; this normally averts starting multiple simultaneous
dnd processes, e.g. because different button callbacks all
dnd_start().

The object is *not* necessarily a widget -- it can be any
application-specific object that is meaningful to potential
drag-and-drop targets.

Potential drag-and-drop targets are discovered as follows.  Whenever
the mouse moves, and at the start and end of a drag-and-drop move, the
Tk widget directly under the mouse is inspected.  This is the target
widget (not to be confused with the target object, yet to be
determined).  If there is no target widget, there is no dnd target
object.  If there is a target widget, and it has an attribute
dnd_accept, this should be a function (or any callable object).  The
function is called as dnd_accept(source, event), where 'source' is the
object being dragged (the object passed to dnd_start() above), and
'event' is the most recent event object (generally a <Motion> event;
it can also be <ButtonPress> or <ButtonRelease>).  If the dnd_accept()
function returns something other than None, this is the new dnd target
object.  If dnd_accept() returns None, or if the target widget has no
dnd_accept attribute, the target widget's parent is considered as the
target widget, and the search for a target object is repeated from
there.  If necessary, the search is repeated all the way up to the
root widget.  If none of the target widgets can produce a target
object, there is no target object (the target object is None).

The target object thus produced, if any, is called the new target
object.  It is compared with the old target object (or None, if there
was no old target widget).  There are several cases ('source' is the
source object, and 'event' is the most recent event object):

- Both the old and new target objects are None.  Nothing happens.

- The old and new target objects are the same object.  Its method
dnd_motion(source, event) is called.

- The old target object was None, and the new target object is not
None.  The new target object's method dnd_enter(source, event) is
called.

- The new target object is None, and the old target object is not
None.  The old target object's method dnd_leave(source, event) is
called.

- The old and new target objects differ and neither is None.  The old
target object's method dnd_leave(source, event), and then the new
target object's method dnd_enter(source, event) is called.

Once this is done, the new target object replaces the old one, and the
Tk mainloop proceeds.  The return value of the methods mentioned above
is ignored; if they raise an exception, the normal exception handling
mechanisms take over.

The drag-and-drop processes can end in two ways: a final target object
is selected, or no final target object is selected.  When a final
target object is selected, it will always have been notified of the
potential drop by a call to its dnd_enter() method, as described
above, and possibly one or more calls to its dnd_motion() method; its
dnd_leave() method has not been called since the last call to
dnd_enter().  The target is notified of the drop by a call to its
method dnd_commit(source, event).

If no final target object is selected, and there was an old target
object, its dnd_leave(source, event) method is called to complete the
dnd sequence.

Finally, the source object is notified that the drag-and-drop process
is over, by a call to source.dnd_end(target, event), specifying either
the selected target object, or None if no target object was selected.
The source object can use this to implement the commit action; this is
sometimes simpler than to do it in the target's dnd_commit().  The
target's dnd_commit() method could then simply be aliased to
dnd_leave().

At any time during a dnd sequence, the application can cancel the
sequence by calling the cancel() method on the object returned by
dnd_start().  This will call dnd_leave() if a target is currently
active; it will never call dnd_commit().

�NcCst||�}|jr|SdSdS�N)�
DndHandler�root)�source�event�h�r�#/usr/lib64/python3.8/tkinter/dnd.py�	dnd_startls
r
c@sDeZdZdZdd�Zdd�Zdd�Zdd	�Zdd
d�Zdd
d�Z	dS)rNcCs�|jdkrdS|j��}z|jWdStk
rD||_||_YnX||_d|_|j|_}|j|_	}d||f|_
|dp�d|_|�|j
|j
�|�d|j�d|d<dS)N�z<B%d-ButtonRelease-%d>�cursor��<Motion>Zhand2)Znum�widgetZ_root�_DndHandler__dnd�AttributeErrorrr�targetZinitial_button�initial_widget�release_pattern�save_cursor�bind�
on_release�	on_motion)�selfrrrZbuttonrrrr	�__init__zs$

zDndHandler.__init__cCs2|j}d|_|r.z|`Wntk
r,YnXdSr)rrr�rrrrr	�__del__�szDndHandler.__del__c	Cs�|j|j}}|j�||�}|j}d}|rbz
|j}Wntk
rHYnX|||�}|rZqb|j}q&|j}||kr�|r�|�	||�n,|r�d|_|�
||�|r�|�||�||_dSr)�x_root�y_rootrZwinfo_containingr�
dnd_acceptrZmasterr�
dnd_motion�	dnd_leave�	dnd_enter)	rr�x�yZ
target_widgetr�
new_target�attrZ
old_targetrrr	r�s.

zDndHandler.on_motioncCs|�|d�dS)N���finish�rrrrr	r�szDndHandler.on_releasecCs|�|d�dS)Nrr(r*rrr	�cancel�szDndHandler.cancelrc
Cs�|j}|j}|j}|j}zf|`|j�|j�|j�d�|j|d<d|_|_|_|_|r||rp|�	||�n|�
||�W5|�||�XdS)Nrr)rrrr�dnd_endrZunbindrr�
dnd_commitr!)rrZcommitrrrrrrr	r)�s
zDndHandler.finish)N)r)
�__name__�
__module__�__qualname__rrrrrr+r)rrrr	rvs	
rc@sNeZdZdd�Zddd�Zdd�Zdd	�Zd
d�Zdd
�Zdd�Z	dd�Z
dS)�IconcCs||_d|_|_|_dSr)�name�canvas�label�id)rr2rrr	r�sz
Icon.__init__�
cCs�||jkr |j�|j||�dS|jr.|��|s6dStj||jddd�}|j|||dd�}||_||_||_|�	d|j
�dS)N�Zraised)�textZborderwidthZreliefZnw)ZwindowZanchorz
<ButtonPress>)r3�coordsr5�detach�tkinterZLabelr2Z
create_windowr4r�press)rr3r#r$r4r5rrr	�attach�s 

�zIcon.attachcCsB|j}|sdS|j}|j}d|_|_|_|�|�|��dSr)r3r5r4�deleteZdestroy)rr3r5r4rrr	r:�s
zIcon.detachcCs4t||�r0|j|_|j|_|j�|j�\|_|_	dSr)
r
r#�x_offr$�y_offr3r9r5�x_orig�y_origr*rrr	r<�s
z
Icon.presscCs(|�|j|�\}}|j�|j||�dSr)�wherer3r9r5)rrr#r$rrr	�move�sz	Icon.movecCs|j�|j|j|j�dSr)r3r9r5rArB)rrrr	�putback�szIcon.putbackcCs8|��}|��}|j|}|j|}||j||jfSr)Zwinfo_rootxZwinfo_rootyrrr?r@)rr3rZx_orgZy_orgr#r$rrr	rC�s


z
Icon.wherecCsdSrr)rrrrrr	r,szIcon.dnd_endN)r6r6)r.r/r0rr=r:r<rDrErCr,rrrr	r1�s


r1c@s<eZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
S)�TestercCs>t�|�|_tj|jddd�|_|jjddd�|j|j_dS)N�d)�widthZheightZbothr')Zfill�expand)r;ZToplevel�topZCanvasr3�packrrrrr	rszTester.__init__cCs|Srr�rrrrrr	rszTester.dnd_acceptcCsp|j��|�|j|�\}}|j�|j�\}}}}||||}	}
|j�||||	||
�|_|�||�dSr)r3�	focus_setrC�bboxr5Zcreate_rectangle�dndidr )rrrr#r$�x1�y1�x2�y2ZdxZdyrrr	r"s
zTester.dnd_enterc	CsF|�|j|�\}}|j�|j�\}}}}|j�|j||||�dSr)rCr3rNrOrD)	rrrr#r$rPrQrRrSrrr	r szTester.dnd_motioncCs"|j��|j�|j�d|_dSr)rJrMr3r>rOrLrrr	r!$s
zTester.dnd_leavecCs2|�||�|�|j|�\}}|�|j||�dSr)r!rCr3r=)rrrr#r$rrr	r-)szTester.dnd_commitN)	r.r/r0rrr"r r!r-rrrr	rFsrFcCs�t��}|�d�tj|jdd���t|�}|j�d�t|�}|j�d�t|�}|j�d�td�}td�}td	�}|�	|j
�|�	|j
�|�	|j
�|��dS)
Nz+1+1ZQuit)Zcommandr8z+1+60z+120+60z+240+60ZICON1ZICON2ZICON3)r;ZTkZgeometryZButton�quitrKrFrJr1r=r3Zmainloop)r�t1�t2Zt3Zi1Zi2Zi3rrr	�test/s 
rW�__main__)�__doc__r;r
rr1rFrWr.rrrr	�<module>sf
Y=#tix.cpython-38.opt-2.pyc000064400000161511151732766100010755 0ustar00U

e5d-,�@sLddlZddlZddlTddlmZddlZdZdZdZdZdZd	Z	d
Z
dZdZd
Z
dZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZGdd �d �Z Gd!d"�d"ej!e �Z!Gd#d$�d$�Z"ej#j$e"fej#_$Gd%d&�d&ej#�Z%Gd'd(�d(e%�Z&Gd)d*�d*�Z'Gd+d,�d,e%�Z(Gd-d.�d.e%�Z)Gd/d0�d0e%�Z*Gd1d2�d2e%�Z+Gd3d4�d4e%�Z,Gd5d6�d6e%�Z-Gd7d8�d8e%�Z.Gd9d:�d:e%�Z/Gd;d<�d<e%�Z0Gd=d>�d>e%�Z1Gd?d@�d@e%�Z2GdAdB�dBe%�Z3GdCdD�dDe%�Z4GdEdF�dFe%e5e6�Z7GdGdH�dHe%�Z8GdIdJ�dJe%�Z9GdKdL�dLe%�Z:GdMdN�dNe%�Z;GdOdP�dPe%�Z<GdQdR�dRe%�Z=GdSdT�dTe%�Z>GdUdV�dVe%�Z?GdWdX�dXe%�Z@GdYdZ�dZe%�ZAGd[d\�d\e%�ZBGd]d^�d^e%�ZCGd_d`�d`e%�ZDGdadb�dbe%�ZEGdcdd�dde%�ZFGdedf�dfe%�ZGGdgdh�dhe%�ZHGdidj�dje%�ZIGdkdl�dle%�ZJGdmdn�dne%�ZKGdodp�dpe%e5e6�ZLGdqdr�dre%�ZMGdsdt�dte%�ZNGdudv�dveOe&�ZPGdwdx�dxeQe&�ZRGdydz�dzeSe&�ZTGd{d|�d|eUe&�ZVGd}d~�d~eWe&�ZXGdd��d�eYe&�ZZGd�d��d�e[e&�Z\Gd�d��d�e]e&�Z^Gd�d��d�e_e&�Z`Gd�d��d�eae&�ZbGd�d��d�eDe&�ZcGd�d��d�e7e&�ZdGd�d��d�eCe&�ZeGd�d��d�eLe&�ZfGd�d��d�e*e&�ZgGd�d��d�e,e&�ZhGd�d��d�e.e&�ZiGd�d��d�e/e&�ZjGd�d��d�e2e&�ZkGd�d��d�e*e&�ZlGd�d��d�eKe&�ZmGd�d��d�e>e&�ZnGd�d��d�e@e&�Zod�d��Zpd�d��ZqGd�d��d�e%�ZrGd�d��d�e%e5e6�ZsGd�d��d�es�ZtdS)��N)�*)�	_cnfmerge�window�textZstatusZ	immediate�imageZ	imagetextZballoon�autoZ	acrosstop�asciiZcell�columnZ
decreasingZ
increasingZinteger�main�max�real�rowzs-regionzx-regionzy-region����� c@sReZdZdd�Zdd�Zddd�Zddd	�Zd
d�Zdd
�Zdd�Z	ddd�Z
dS)�
tixCommandcCs|j�dd|�S)N�tixZaddbitmapdir��tk�call)�selfZ	directory�r�#/usr/lib64/python3.8/tkinter/tix.py�tix_addbitmapdirRs
ztixCommand.tix_addbitmapdircCs|j�dd|�S)Nr�cgetr�r�optionrrr�tix_cget^sztixCommand.tix_cgetNcKsd|rt||f�}n|rt|�}|dkr2|�dd�St|t�rN|�ddd|�S|j�d|�|��S)Nr�	configure�-)rr )r�
_getconfigure�
isinstance�strZ_getconfigure1rr�_options�r�cnf�kwrrr�
tix_configurees
ztixCommand.tix_configurecCs*|dk	r|j�dd|�S|j�dd�SdS)NrZ
filedialogr)rZdlgclassrrr�tix_filedialog{s	ztixCommand.tix_filedialogcCs|j�dd|�S)NrZ	getbitmapr�r�namerrr�
tix_getbitmap�s	ztixCommand.tix_getbitmapcCs|j�dd|�S)NrZgetimagerr+rrr�tix_getimage�sztixCommand.tix_getimagecCs|j�ddd|�S)Nrr�getrr+rrr�tix_option_get�sztixCommand.tix_option_getcCs2|dk	r|j�dd|||�S|j�dd||�SdS)NrZresetoptionsr)rZ	newSchemeZ
newFontSetZ
newScmPriorrr�tix_resetoptions�sztixCommand.tix_resetoptions)N)N)N)�__name__�
__module__�__qualname__rrr)r*r-r.r0r1rrrrrGs

rc@seZdZddd�Zdd�ZdS)�TkN�TixcCsbtj�||||�tj�d�}|j�d�|dk	rR|j�d|�|j�d|�|j�d�dS)NZTIX_LIBRARYz<global auto_path; lappend auto_path [file dir [info nameof]]z(global auto_path; lappend auto_path {%s}z,global tcl_pkgPath; lappend tcl_pkgPath {%s}zpackage require Tix)�tkinterr5�__init__�os�environr/r�eval)rZ
screenNameZbaseNameZ	classNameZtixlibrrrr8�szTk.__init__cCs|�dd�tj�|�dS)NZWM_DELETE_WINDOW�)Zprotocolr7r5�destroy�rrrrr=�sz
Tk.destroy)NNr6�r2r3r4r8r=rrrrr5�s
r5c@sPeZdZifdd�ZeZdd�Zdd�Zdd�Zdd
d�Zdd
d�Z	dd�Z
dS)�FormcKs"|jjd|jf|�||���dS)N�tixForm�rr�_wr%r&rrr�config�szForm.configcCst�|||i�dS�N)r@�form�r�key�valuerrr�__setitem__�szForm.__setitem__cCs|j�dd|j�S)NrA�check�rrrCr>rrrrK�sz
Form.checkcCs|j�dd|j�dS)NrA�forgetrLr>rrrrM�szForm.forgetrcCs`|sJ|sJ|j�dd|j�}|j�|�}d}|D]}||j�|�f}q.|S|j�dd|j||�S)NrA�gridr)rrrC�	splitlistZgetint)rZxsizeZysize�x�y�zrrrrN�sz	Form.gridNcCs>|s|j�dd|j�S|ddkr*d|}|j�dd|j|�S)NrA�inforr!rLrrrrrS�s
z	Form.infocs(�fdd��j��j�dd�j��D�S)Ncsg|]}��|��qSr)�
_nametowidget��.0rPr>rr�
<listcomp>szForm.slaves.<locals>.<listcomp>rA�slaves�rrOrrCr>rr>rrXs
���zForm.slaves)rr)N)r2r3r4rDrFrJrKrMrNrSrXrrrrr@�s


r@c@sneZdZdddiifdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Zdd�Z	dd�Z
idfdd�Zdd�ZdS)�	TixWidgetNc	Cs�|rt||f�}nt|�}d}|r.|�d�ndg}t|���D]&\}}||kr@|d||f}||=q@||_t�|||�|r�|jj||j	f|��|r�t�
||�i|_dS)Nr�optionsr!)r�append�list�items�
widgetName�Widget�_setuprrrCrD�subwidget_list)	r�masterr_Zstatic_optionsr'r(Zextra�k�vrrrr8s$zTixWidget.__init__cCs ||jkr|j|St|��dSrE)rb�AttributeErrorr+rrr�__getattr__Gs

zTixWidget.__getattr__cCs|j�d|j|�dS)NZtixSetSilentrL)rrIrrr�
set_silentLszTixWidget.set_silentcCsD|�|�}|s$td|d|j��|t|j�dd�}|�|�S)Nz
Subwidget z not child of �)�_subwidget_name�TclError�_name�lenrCrT)rr,�nrrr�	subwidgetPs

zTixWidget.subwidgetcCsZ|��}|sgSg}|D]<}|t|j�dd�}z|�|�|��WqYqXq|S)Nri)�_subwidget_namesrmrCr\rT)r�namesZretlistr,rrr�subwidgets_allZszTixWidget.subwidgets_allcCs0z|j�|jd|�WStk
r*YdSXdS)Nro)rrrCrkr+rrrrjiszTixWidget._subwidget_namecCs<z |j�|jdd�}|j�|�WStk
r6YdSXdS)NZ
subwidgetsz-all)rrrCrOrk)rrPrrrrpps
zTixWidget._subwidget_namescCs\|dkrdSt|t�st|�}t|t�s0t|�}|��}|D]}|j�|dd||�q<dS)Nr<r r!)r#r$�reprrprr)rrrIrqr,rrr�
config_allxs

zTixWidget.config_allcKst|s|}|r|rt||f�}n|r&|}d}|��D]*\}}t|�rL|�|�}|d||f}q2|j�dd|f|�S)Nrr!r�create)rr^�callable�	_registerrr)rZimgtyper'rcr(r[rdrerrr�image_create�s
zTixWidget.image_createcCs.z|j�dd|�Wntk
r(YnXdS)Nr�delete)rrrk)rZimgnamerrr�image_delete�szTixWidget.image_delete)
r2r3r4r8rgrhrorrrjrprtrxrzrrrrrZ
s
�
-
rZc@seZdZddd�Zdd�ZdS)�TixSubWidgetric
Cs�|rD|�|�}z$|t|j�dd�}|�d�}Wng}YnX|s`t�||ddd|i�n�|}tt|�d�D]V}d�|d|d��}	z|�|	�}
|
}Wqtt	k
r�t
|||ddd�}YqtXqt|r�|d}t�||ddd|i�||_dS)Nri�.r,r)�destroy_physically�check_intermediate���)rjrmrC�splitrZr8�range�joinrT�KeyErrorr{r})rrcr,r}r~�pathZplist�parent�irn�wrrrr8�s0



�zTixSubWidget.__init__cCsjt|j���D]}|��q|j|jjkr6|jj|j=|j|jjkrP|jj|j=|jrf|j�	d|j
�dS)Nr=)r]�children�valuesr=rlrcrbr}rrrC�r�crrrr=�s
zTixSubWidget.destroyN)ririr?rrrrr{�s�
 r{c@sReZdZifdd�dd�Zdd�Zdd�Zd	d
�Zdd�Zifd
d�Zdd�Z	dS)�DisplayStyleN)rccKs\|s2d|kr|d}nd|kr(|d}n
t�d�}|j|_|jjd|f|�||���|_dS)NZ	refwindowzcreate display styleZtixDisplayStyle)r7Z_get_default_rootrrr%�	stylename)r�itemtyper'rcr(rrrr8�s



�zDisplayStyle.__init__cCs|jSrE)r�r>rrr�__str__�szDisplayStyle.__str__cCsH|r|rt||f�}n|r|}d}|��D]\}}|d||f}q*|S)Nrr!)rr^)rr'r(Zoptsrdrerrrr%�szDisplayStyle._optionscCs|j�|jd�dS�Nry�rrr�r>rrrry�szDisplayStyle.deletecCs|j�|jdd||�dS)Nr �-%sr�rGrrrrJ�szDisplayStyle.__setitem__cKs|j|jdf|�||���S)Nr )r"r�r%r&rrrrD�s�
�zDisplayStyle.configcCs|j�|jdd|�S)Nrr�r�)rrHrrr�__getitem__�szDisplayStyle.__getitem__)
r2r3r4r8r�r%ryrJrDr�rrrrr��s
r�c@s.eZdZdifdd�Zifdd�Zdd�ZdS)�BalloonNcKsNdddddg}t�||d|||�t|ddd	�|jd<t|d
dd	�|jd
<dS)Nr[ZinstallcolormapZinitwaitZ	statusbarZcursorZ
tixBalloon�labelr�r}�message�rZr8�_dummyLabelrb�rrcr'r(Zstaticrrrr8	s���zBalloon.__init__cKs&|jj|jd|jf|�||���dS�NZbindrB)r�widgetr'r(rrr�bind_widgetszBalloon.bind_widgetcCs|j�|jd|j�dS�NZunbindrL�rr�rrr�
unbind_widgetszBalloon.unbind_widget)r2r3r4r8r�r�rrrrr�s	
r�c@s.eZdZdifdd�Zifdd�Zdd�ZdS)�	ButtonBoxNcKst�||dddg||�dS)NZtixButtonBox�orientationr[�rZr8�rrcr'r(rrrr8s

�zButtonBox.__init__cKs4|jj|jd|f|�||���}t||�|j|<|S�N�add�rrrCr%�_dummyButtonrb)rr,r'r(Zbtnrrrr�#s z
ButtonBox.addcCs ||jkr|j�|jd|�dS�N�invoke�rbrrrCr+rrrr�*s
zButtonBox.invoke�r2r3r4r8r�r�rrrrr�sr�c@s:eZdZdifdd�Zdd�Zdd�Zdd	�Zd
d�ZdS)�ComboBoxNc	Ks�t�||dddddg||�t|d�|jd<t|d�|jd<t|d�|jd<t|d	�|jd	<z$t|d
�|jd
<t|d�|jd<Wntk
r�YnXdS)NZtixComboBoxZeditableZdropdown�fancyr[r��entry�arrow�slistbox�tick�cross)rZr8r�rb�_dummyEntryr��_dummyScrolledListBox�	TypeErrorr�rrrr8<s 

��
zComboBox.__init__cCs|j�|jd|�dS)NZ
addhistoryrL�rr$rrr�add_historyNszComboBox.add_historycCs|j�|jd|�dS)NZ
appendhistoryrLr�rrr�append_historyQszComboBox.append_historycCs|j�|jd||�dS�N�insertrL)r�indexr$rrrr�TszComboBox.insertcCs|j�|jd|�dS)N�pickrL�rr�rrrr�Wsz
ComboBox.pick)r2r3r4r8r�r�r�r�rrrrr�.s
r�c@s:eZdZdifdd�Zdd�Zdd�Zdd	�Zd
d�ZdS)�ControlNcKsZt�||ddg||�t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<dS)NZ
tixControlr[�incr�decrr�r�)rZr8r�rbr�r�r�rrrr8hs
zControl.__init__cCs|j�|jd�dS)Nr�rLr>rrr�	decrementoszControl.decrementcCs|j�|jd�dS)Nr�rLr>rrr�	incrementrszControl.incrementcCs|j�|jd�dSr�rLr>rrrr�uszControl.invokecCs|j�|jd�dS)N�updaterLr>rrrr�xszControl.update)r2r3r4r8r�r�r�r�rrrrr�Zs
r�c@s eZdZifdd�Zdd�ZdS)�DirListcKsJt�||ddg||�t|d�|jd<t|d�|jd<t|d�|jd<dS)NZ
tixDirListr[�hlist�vsb�hsb�rZr8�_dummyHListrb�_dummyScrollbarr�rrrr8�szDirList.__init__cCs|j�|jd|�dS�N�chdirrL�r�dirrrrr��sz
DirList.chdirN�r2r3r4r8r�rrrrr�{sr�c@s eZdZifdd�Zdd�ZdS)�DirTreecKsJt�||ddg||�t|d�|jd<t|d�|jd<t|d�|jd<dS)NZ
tixDirTreer[r�r�r�r�r�rrrr8�szDirTree.__init__cCs|j�|jd|�dSr�rLr�rrrr��sz
DirTree.chdirNr�rrrrr��s
r�c@seZdZifdd�ZdS)�DirSelectBoxcKs:t�||ddg||�t|d�|jd<t|d�|jd<dS)NZtixDirSelectBoxr[�dirlist�dircbx)rZr8�
_dummyDirListrb�_dummyFileComboBoxr�rrrr8�szDirSelectBox.__init__N�r2r3r4r8rrrrr��sr�c@s(eZdZifdd�Zdd�Zdd�ZdS)�ExFileSelectBoxcKs�t�||ddg||�t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<t|d	�|jd	<t|d
�|jd
<dS)NZtixExFileSelectBoxr[�cancel�ok�hidden�typesr�r��file�filelist)rZr8r�rb�_dummyCheckbutton�_dummyComboBoxr�r�r�rrrr8�szExFileSelectBox.__init__cCs|j�|jd�dS�N�filterrLr>rrrr��szExFileSelectBox.filtercCs|j�|jd�dSr�rLr>rrrr��szExFileSelectBox.invokeN)r2r3r4r8r�r�rrrrr��sr�c@s(eZdZifdd�Zdd�Zdd�ZdS)�DirSelectDialogcKs*t�||ddg||�t|d�|jd<dS)NZtixDirSelectDialogr[Zdirbox)rZr8�_dummyDirSelectBoxrbr�rrrr8�s
�zDirSelectDialog.__init__cCs|j�|jd�dS�N�popuprLr>rrrr��szDirSelectDialog.popupcCs|j�|jd�dS�N�popdownrLr>rrrr��szDirSelectDialog.popdownN�r2r3r4r8r�r�rrrrr��s
r�c@s(eZdZifdd�Zdd�Zdd�ZdS)�ExFileSelectDialogcKs*t�||ddg||�t|d�|jd<dS)NZtixExFileSelectDialogr[�fsbox)rZr8�_dummyExFileSelectBoxrbr�rrrr8�s
�zExFileSelectDialog.__init__cCs|j�|jd�dSr�rLr>rrrr�szExFileSelectDialog.popupcCs|j�|jd�dSr�rLr>rrrr�szExFileSelectDialog.popdownNr�rrrrr��s	r�c@s(eZdZifdd�Zdd�Zdd�ZdS)�
FileSelectBoxcKsZt�||ddg||�t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<dS)NZtixFileSelectBoxr[r�r�r��	selection)rZr8r�rbr�r�rrrr8s
zFileSelectBox.__init__cCs|j�|jd�dSr�rLr>rrr�apply_filterszFileSelectBox.apply_filtercCs|j�|jd�dSr�rLr>rrrr�szFileSelectBox.invokeN)r2r3r4r8r�r�rrrrr�sr�c@s(eZdZifdd�Zdd�Zdd�ZdS)�FileSelectDialogcKs:t�||ddg||�t|d�|jd<t|d�|jd<dS)NZtixFileSelectDialogr[Zbtnsr�)rZr8�_dummyStdButtonBoxrb�_dummyFileSelectBoxr�rrrr8,s
�zFileSelectDialog.__init__cCs|j�|jd�dSr�rLr>rrrr�2szFileSelectDialog.popupcCs|j�|jd�dSr�rLr>rrrr�5szFileSelectDialog.popdownNr�rrrrr�#s	r�c@s(eZdZifdd�Zdd�Zdd�ZdS)�	FileEntrycKs<t�||dddg||�t|d�|jd<t|d�|jd<dS)NZtixFileEntryZ
dialogtyper[Zbuttonr�)rZr8r�rbr�r�rrrr8Ds
�zFileEntry.__init__cCs|j�|jd�dSr�rLr>rrrr�JszFileEntry.invokecCsdSrErr>rrr�file_dialogMszFileEntry.file_dialogN)r2r3r4r8r�r�rrrrr�8sr�c@s�eZdZdifdd�Zifdd�Zdifdd�Zdd	�Zd
d�Zdkd
d�Zdd�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zifdd �Zifd!d"�Zd#d$�Zd%d&�ZeZd'd(�Zd)d*�Zd+d,�Zifd-d.�Zifd/d0�Zd1d2�Zd3d4�Zd5d6�Zd7d8�Zd9d:�Zd;d<�Z dld=d>�Z!d?d@�Z"dAdB�Z#dCdD�Z$dEdF�Z%dGdH�Z&dIdJ�Z'dKdL�Z(dMdN�Z)dOdP�Z*dQdR�Z+ifdSdT�Z,ifdUdV�Z-dWdX�Z.dYdZ�Z/d[d\�Z0ifd]d^�Z1d_d`�Z2dadb�Z3ifdcdd�Z4dedf�Z5dmdgdh�Z6didj�Z7dS)n�HListNcKst�||dddg||�dS)NZtixHList�columnsr[r�r�rrrr8Ys

�zHList.__init__cKs |jj|jd|f|�||���Sr�rB�rr�r'r(rrrr�]sz	HList.addcKs(|sd}|jj|jd|f|�||���S)Nr<ZaddchildrB)rr�r'r(rrr�	add_child`s�
�zHList.add_childcCs|j�|jdd|�dS�N�anchor�setrL�rr�rrr�
anchor_setfszHList.anchor_setcCs|j�|jdd�dS�Nr��clearrLr>rrr�anchor_cleariszHList.anchor_clearrcCs6|s|j�|jdd||�S|j�|jdd|d|�SdS)Nr	�widthz-charrL)r�colr�charsrrr�column_widthls�zHList.column_widthcCs|j�|jdd�dS)Nry�allrLr>rrr�
delete_allsszHList.delete_allcCs|j�|jdd|�dS)Nryr�rLr�rrr�delete_entryvszHList.delete_entrycCs|j�|jdd|�dS)NryZ
offspringsrLr�rrr�delete_offspringsyszHList.delete_offspringscCs|j�|jdd|�dS)NryZsiblingsrLr�rrr�delete_siblings|szHList.delete_siblingscCs|j�|jdd|�dS�N�dragsiter�rLr�rrr�dragsite_setszHList.dragsite_setcCs|j�|jdd�dS�Nrr�rLr>rrr�dragsite_clear�szHList.dragsite_clearcCs|j�|jdd|�dS�N�dropsiter�rLr�rrr�dropsite_set�szHList.dropsite_setcCs|j�|jdd�dS�Nrr�rLr>rrr�dropsite_clear�szHList.dropsite_clearcKs&|jj|jdd|f|�||���dS)N�headerrurB�rrr'r(rrr�
header_create�szHList.header_createcKs@|dkr|�|jdd|�S|jj|jdd|f|�||���dS)Nrr �r"rCrrr%rrrr�header_configure�s

�zHList.header_configurecCs|j�|jdd||�S)NrrrL)rr�optrrr�header_cget�szHList.header_cgetcCs|j�|j�|jdd|��S)NrZexist)rZ
getbooleanrrC�rrrrr�
header_exists�szHList.header_existscCs|j�|jdd|�dS)NrryrLrrrr�
header_delete�szHList.header_deletecCs|j�|jdd|�S)Nr�sizerLrrrr�header_size�szHList.header_sizecCs|j�|jdd|�dS)N�hider�rLr�rrr�
hide_entry�szHList.hide_entrycKs&|jj|jdd|f|�||���dS)N�	indicatorrurBr�rrr�indicator_create�s�
�zHList.indicator_createcKs@|dkr|�|jdd|�S|jj|jdd|f|�||���dS)Nr"r rr�rrr�indicator_configure�s��
�zHList.indicator_configurecCs|j�|jdd||�S)Nr"rrL�rr�rrrr�indicator_cget�szHList.indicator_cgetcCs|j�|jdd|�S)Nr"�existsrLr�rrr�indicator_exists�szHList.indicator_existscCs|j�|jdd|�dS)Nr"ryrLr�rrr�indicator_delete�szHList.indicator_deletecCs|j�|jdd|�S)Nr"rrLr�rrr�indicator_size�szHList.indicator_sizecCs|j�|jdd�S�NrSr�rLr>rrr�info_anchor�szHList.info_anchorcCs|�|j�|jdd|��pdS�NrSZbbox)�_getintsrrrCr�rrr�	info_bbox�s
��zHList.info_bboxcCs |j�|jdd|�}|j�|�S)NrSr��rrrCrO)rr�r�rrr�
info_children�szHList.info_childrencCs|j�|jdd|�S)NrS�datarLr�rrr�	info_data�szHList.info_datacCs|j�|jdd�S)NrSrrLr>rrr�
info_dragsite�szHList.info_dragsitecCs|j�|jdd�S)NrSrrLr>rrr�
info_dropsite�szHList.info_dropsitecCs|j�|jdd|�S�NrSr'rLr�rrr�info_exists�szHList.info_existscCs|j�|jdd|�S)NrSr�rLr�rrr�info_hidden�szHList.info_hiddencCs|j�|jdd|�S)NrS�nextrLr�rrr�	info_next�szHList.info_nextcCs|j�|jdd|�S)NrSr�rLr�rrr�info_parent�szHList.info_parentcCs|j�|jdd|�S)NrS�prevrLr�rrr�	info_prev�szHList.info_prevcCs|j�|jdd�}|j�|�S�NrSr�r0r�rrr�info_selection�szHList.info_selectioncCs|j�|jdd|||�S)N�itemrrL)rr�rrrrr�	item_cget�szHList.item_cgetcKsD|dkr|�|jdd||�S|jj|jdd||f|�||���dS)Nr@r r�rr�rr'r(rrr�item_configure�s

�zHList.item_configurecKs(|jj|jdd||f|�||���dS)Nr@rurBrBrrr�item_create�s�
�zHList.item_createcCs|j�|jdd||�S)Nr@r'rL�rr�rrrr�item_exists�szHList.item_existscCs|j�|jdd||�dS)Nr@ryrLrErrr�item_delete�szHList.item_deletecCs|j�|jd||�S)N�	entrycgetrLr%rrrrH�szHList.entrycgetcKs<|dkr|�|jd|�S|jj|jd|f|�||���dS�N�entryconfigurerr�rrrrJ�s

�zHList.entryconfigurecCs|j�|jd|�S�N�nearestrL)rrQrrrrLsz
HList.nearestcCs|j�|jd|�dS�N�seerLr�rrrrNsz	HList.seecKs$|jj|jddf|�||���dS�Nr�r�rBr&rrr�selection_clearszHList.selection_clearcCs|j�|jdd|�S�Nr�ZincludesrLr�rrr�selection_includes
szHList.selection_includescCs|j�|jdd||�dS�Nr�r�rL�r�firstZlastrrr�
selection_set
szHList.selection_setcCs|j�|jdd|�S)N�showr�rLr�rrr�
show_entryszHList.show_entry)rNN)N)N)8r2r3r4r8r�r�r�rrrrrr	rrrrrrrrZheader_existrrr!r#r$r&r(r)r*r,r/r1r3r4r5r7r8r:r;r=r?rArCrDrFrGrHrJrLrNrPrRrVrXrrrrr�Qsj


r�c@seZdZdifdd�ZdS)�	InputOnlyNcKst�||dd||�dS)NZtixInputOnlyr�r�rrrr8szInputOnly.__init__r�rrrrrYsrYc@seZdZdifdd�ZdS)�
LabelEntryNcKs<t�||dddg||�t|d�|jd<t|d�|jd<dS)NZ
tixLabelEntry�	labelsider[r�r�)rZr8r�rbr�r�rrrr8%s
�zLabelEntry.__init__r�rrrrrZs
rZc@seZdZdifdd�ZdS)�
LabelFrameNcKs<t�||dddg||�t|d�|jd<t|d�|jd<dS)NZ
tixLabelFramer[r[r��frame)rZr8r�rb�_dummyFramer�rrrr86s
�zLabelFrame.__init__r�rrrrr\+sr\c@s<eZdZifdd�Zifdd�Zdd�Zdd�Zd	d
�ZdS)�ListNoteBookcKsNt�||ddg||�t|ddd�|jd<t|d�|jd<t|d�|jd<dS)NZtixListNoteBookr[Zpanerr�r�Zshlist)rZr8�_dummyPanedWindowrbr��_dummyScrolledHListr�rrrr8Es�zListNoteBook.__init__cKs:|jj|jd|f|�||���t||�|j|<|j|Sr��rrrCr%r{rb�rr,r'r(rrrr�Ms zListNoteBook.addcCs
|�|�SrE�ror+rrr�pageRszListNoteBook.pagecCs:|j�|j�|jd��}g}|D]}|�|�|��q |S�N�pages�rrOrrCr\ro�rrqZretrPrrrrgUs
zListNoteBook.pagescCs|j�|jd|�dS�N�raiserLr+rrr�
raise_page]szListNoteBook.raise_pageN)r2r3r4r8r�rergrlrrrrr_=s
r_c@seZdZdifdd�ZdS)�MeterNcKst�||ddg||�dS)NZtixMeterr[r�r�rrrr8es

�zMeter.__init__r�rrrrrm`srmc@sNeZdZdifdd�Zifdd�Zdd�Zdd	�Zd
d�Zdd
�Zdd�Z	dS)�NoteBookNcKs.t�||ddg||�t|ddd�|jd<dS)NZtixNoteBookr[Znbframerr�)rZr8r{rbr�rrrr8qs�zNoteBook.__init__cKs:|jj|jd|f|�||���t||�|j|<|j|Sr�rbrcrrrr�vs zNoteBook.addcCs,|j�|jd|�|j|��|j|=dSr��rrrCrbr=r+rrrry{szNoteBook.deletecCs
|�|�SrErdr+rrrre�sz
NoteBook.pagecCs:|j�|j�|jd��}g}|D]}|�|�|��q |Srfrhrirrrrg�s
zNoteBook.pagescCs|j�|jd|�dSrjrLr+rrrrl�szNoteBook.raise_pagecCs|j�|jd�S)N�raisedrLr>rrrrp�szNoteBook.raised)
r2r3r4r8r�ryrergrlrprrrrrnisrnc@seZdZdS)�
NoteBookFrameN�r2r3r4rrrrrq�srqc@sHeZdZifdd�Zifdd�Zifdd�Zdd�Zd	d
�Zdd�Zd
S)�
OptionMenucKs:t�||ddg||�t|d�|jd<t|d�|jd<dS)NZ
tixOptionMenur[�
menubutton�menu�rZr8�_dummyMenubuttonrb�
_dummyMenur�rrrr8�szOptionMenu.__init__cKs&|jj|jdd|f|�||���dS)Nr��commandrBrcrrr�add_command�szOptionMenu.add_commandcKs&|jj|jdd|f|�||���dS)Nr�Z	separatorrBrcrrr�
add_separator�szOptionMenu.add_separatorcCs|j�|jd|�dSr�rLr+rrrry�szOptionMenu.deletecCs|j�|jd|�dS)N�disablerLr+rrrr|�szOptionMenu.disablecCs|j�|jd|�dS)N�enablerLr+rrrr}�szOptionMenu.enableN)	r2r3r4r8rzr{ryr|r}rrrrrs�srsc@sPeZdZifdd�Zifdd�Zdd�Zdd�Zd	d
�Zifdd�Zd
d�Z	dS)�PanedWindowcKst�||dddg||�dS)NZtixPanedWindowr�r[r�r�rrrr8�szPanedWindow.__init__cKs>|jj|jd|f|�||���t||dd�|j|<|j|S)Nr�r)r~rbrcrrrr��s
 �zPanedWindow.addcCs,|j�|jd|�|j|��|j|=dSr�ror+rrrry�szPanedWindow.deletecCs|j�|jd|�dS)NrMrLr+rrrrM�szPanedWindow.forgetcCs|j�|jd||�S)N�panecgetrLr%rrrr�szPanedWindow.panecgetcKs<|dkr|�|jd|�S|jj|jd|f|�||���dS)N�
paneconfigurerr�rrrr��szPanedWindow.paneconfigurecs*�j��j��jd��}�fdd�|D�S)N�panescsg|]}��|��qSrrdrUr>rrrW�sz%PanedWindow.panes.<locals>.<listcomp>rY)rrqrr>rr��szPanedWindow.panesN)
r2r3r4r8r�ryrMrr�r�rrrrr~�sr~c@s0eZdZifdd�Zdd�Zdd�Zdd�Zd	S)
�	PopupMenucKs:t�||ddg||�t|d�|jd<t|d�|jd<dS)NZtixPopupMenur[rtrurvr�rrrr8�szPopupMenu.__init__cCs|j�|jd|j�dSr�rLr�rrrr��szPopupMenu.bind_widgetcCs|j�|jd|j�dSr�rLr�rrrr��szPopupMenu.unbind_widgetcCs|j�|jd|j||�dS)NZpostrL)rr�rPrQrrr�post_widget�szPopupMenu.post_widgetN)r2r3r4r8r�r�r�rrrrr��sr�c@s8eZdZifdd�Zdd�Zdd�Zdd�Zd	d
�ZdS)�ResizeHandlec	Ks.ddddddddd	g	}t�||d
|||�dS)Nr[ryZcursorfgZcursorbgZ
handlesizeZ	hintcolorZ	hintwidthrPrQZtixResizeHandler�)rrcr'r(�flagsrrrr8�s�
�zResizeHandle.__init__cCs|j�|jd|j�dS)NZattachwidgetrLr�rrr�
attach_widgetszResizeHandle.attach_widgetcCs|j�|jd|j�dS)NZdetachwidgetrLr�rrr�
detach_widgetszResizeHandle.detach_widgetcCs|j�|jd|j�dS)Nr rLr�rrrr szResizeHandle.hidecCs|j�|jd|j�dS)NrWrLr�rrrrW	szResizeHandle.showN)r2r3r4r8r�r�r rWrrrrr��s

r�c@seZdZifdd�ZdS)�
ScrolledHListcKsJt�||ddg||�t|d�|jd<t|d�|jd<t|d�|jd<dS)NZtixScrolledHListr[r�r�r�r�r�rrrr8s�zScrolledHList.__init__Nr�rrrrr�sr�c@seZdZifdd�ZdS)�ScrolledListBoxcKsJt�||ddg||�t|d�|jd<t|d�|jd<t|d�|jd<dS)NZtixScrolledListBoxr[�listboxr�r�)rZr8�
_dummyListboxrbr�r�rrrr8szScrolledListBox.__init__Nr�rrrrr�sr�c@seZdZifdd�ZdS)�ScrolledTextcKsJt�||ddg||�t|d�|jd<t|d�|jd<t|d�|jd<dS)NZtixScrolledTextr[rr�r�)rZr8�
_dummyTextrbr�r�rrrr8%szScrolledText.__init__Nr�rrrrr�!sr�c@seZdZifdd�ZdS)�
ScrolledTListcKsJt�||ddg||�t|d�|jd<t|d�|jd<t|d�|jd<dS)NZtixScrolledTListr[Ztlistr�r�)rZr8�_dummyTListrbr�r�rrrr8/s�zScrolledTList.__init__Nr�rrrrr�+sr�c@seZdZifdd�ZdS)�ScrolledWindowcKsJt�||ddg||�t|d�|jd<t|d�|jd<t|d�|jd<dS)NZtixScrolledWindowr[rr�r�)rZr8r^rbr�r�rrrr8:szScrolledWindow.__init__Nr�rrrrr�6sr�c@s,eZdZifdd�Zifdd�Zdd�ZdS)�Selectc
Ks2t�||ddddddg||�t|d�|jd<dS)NZ	tixSelectZ	allowzero�radior�r[r[r�r�r�rrrr8Gs
��zSelect.__init__cKs:|jj|jd|f|�||���t||�|j|<|j|Sr�r�rcrrrr�Ns z
Select.addcCs|j�|jd|�dSr�rLr+rrrr�Ssz
Select.invokeNr�rrrrr�@sr�c@seZdZdifdd�ZdS)�ShellNcKst�||dddg||�dS)NZtixShellr[�titler�r�rrrr8[szShell.__init__r�rrrrr�Vsr�c@s2eZdZdifdd�Zdd�Zdd�Zdd	�ZdS)
�DialogShellNcKs&t�||ddddddddg||�dS)	NZtixDialogShellr[r�ZmappedZ	minheightZminwidthr�Z	transientr�r�rrrr8gs��zDialogShell.__init__cCs|j�|jd�dSr�rLr>rrrr�nszDialogShell.popdowncCs|j�|jd�dSr�rLr>rrrr�qszDialogShell.popupcCs|j�|jd�dS)N�centerrLr>rrrr�tszDialogShell.center)r2r3r4r8r�r�r�rrrrr�^s	r�c@s"eZdZdifdd�Zdd�ZdS)�StdButtonBoxNcKs\t�||dddg||�t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<dS)NZtixStdButtonBoxr�r[r��applyr��help)rZr8r�rbr�rrrr8zs
�zStdButtonBox.__init__cCs ||jkr|j�|jd|�dSr�r�r+rrrr��s
zStdButtonBox.invoke)r2r3r4r8r�rrrrr�wsr�c@s�eZdZdifdd�Zdd�Zdd�Zdd	�Zd
d�Zd2dd
�Zdd�Z	dd�Z
dd�Zdd�Zifdd�Z
dd�Zdd�Zdd�Zdd�Zd d!�Zd"d#�Zd$d%�Zd&d'�Zd(d)�Zd*d+�Zifd,d-�Zd.d/�Zd3d0d1�ZdS)4�TListNcKst�||ddg||�dS)NZtixTListr[r�r�rrrr8�szTList.__init__cCs|j�|jdd|�dS)N�activer�rLr�rrr�
active_set�szTList.active_setcCs|j�|jdd�dS)Nr�r�rLr>rrr�active_clear�szTList.active_clearcCs|j�|jdd|�dSr�rLr�rrrr��szTList.anchor_setcCs|j�|jdd�dSr�rLr>rrrr�szTList.anchor_clearcCs|j�|jd||�dSr�rL�r�from_�torrrry�szTList.deletecCs|j�|jdd|�dSr
rLr�rrrr�szTList.dragsite_setcCs|j�|jdd�dSr
rLr>rrrr�szTList.dragsite_clearcCs|j�|jdd|�dSrrLr�rrrr�szTList.dropsite_setcCs|j�|jdd�dSrrLr>rrrr�szTList.dropsite_clearcKs$|jj|jd|f|�||���dSr�rB)rr�r'r(rrrr��szTList.insertcCs|j�|jdd�S)NrSr�rLr>rrr�info_active�szTList.info_activecCs|j�|jdd�Sr+rLr>rrrr,�szTList.info_anchorcCs|j�|jdd|�S)NrSZdownrLr�rrr�	info_down�szTList.info_downcCs|j�|jdd|�S)NrS�leftrLr�rrr�	info_left�szTList.info_leftcCs|j�|jdd|�S)NrS�rightrLr�rrr�
info_right�szTList.info_rightcCs|j�|jdd�}|j�|�Sr>r0r�rrrr?�szTList.info_selectioncCs|j�|jdd�S)NrSrrLr>rrr�	info_size�szTList.info_sizecCs|j�|jdd|�S)NrSZuprLr�rrr�info_up�sz
TList.info_upcCs|j�|jd||�SrKrL�rrPrQrrrrL�sz
TList.nearestcCs|j�|jd|�dSrMrLr�rrrrN�sz	TList.seecKs$|jj|jddf|�||���dSrOrBr&rrrrP�szTList.selection_clearcCs|j�|jdd|�SrQrLr�rrrrR�szTList.selection_includescCs|j�|jdd||�dSrSrLrTrrrrV�szTList.selection_set)N)N)r2r3r4r8r�r�r�rryrrrrr�r�r,r�r�r�r?r�r�rLrNrPrRrVrrrrr��s0

r�c@sDeZdZdifdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
d�ZdS)�TreeNcKsJt�||ddg||�t|d�|jd<t|d�|jd<t|d�|jd<dS)NZtixTreer[r�r�r�r�r�rrrr8�s
�z
Tree.__init__cCs|j�|jd�dS�N�autosetmoderLr>rrrr��szTree.autosetmodecCs|j�|jd|�dS�N�closerL�r�	entrypathrrrr��sz
Tree.closecCs|j�|jd|�S�N�getmoderLr�rrrr��szTree.getmodecCs|j�|jd|�dS�N�openrLr�rrrr��sz	Tree.open�nonecCs|j�|jd||�dS)N�setmoderL�rr��moderrrr��s
zTree.setmode)r�)	r2r3r4r8r�r�r�r�r�rrrrr��sr�c@sVeZdZdifdd�Zdd�Zdd�Zdd	�Zd
d�Zdd
d�Zdd�Z	ddd�Z
dS)�	CheckListNcKsLt�||dddg||�t|d�|jd<t|d�|jd<t|d�|jd<dS)NZtixCheckListr[r�r�r�r�r�r�rrrr8s
�zCheckList.__init__cCs|j�|jd�dSr�rLr>rrrr�szCheckList.autosetmodecCs|j�|jd|�dSr�rLr�rrrr�szCheckList.closecCs|j�|jd|�Sr�rLr�rrrr� szCheckList.getmodecCs|j�|jd|�dSr�rLr�rrrr�$szCheckList.open�oncCs|j�|j�|jd|��S)N�getselectionrY)rr�rrrr�(szCheckList.getselectioncCs|j�|jd|�S)N�	getstatusrLr�rrrr�.szCheckList.getstatuscCs|j�|jd||�dS)N�	setstatusrLr�rrrr�2szCheckList.setstatus)r�)r�)r2r3r4r8r�r�r�r�r�r�r�rrrrr�s
r�c@seZdZddd�ZdS)r�ricCst�||||�dSrE�r{r8�rrcr,r}rrrr8>sz_dummyButton.__init__N)rir�rrrrr�=sr�c@seZdZddd�ZdS)r�ricCst�||||�dSrEr�r�rrrr8Bsz_dummyCheckbutton.__init__N)rir�rrrrr�Asr�c@seZdZddd�ZdS)r�ricCst�||||�dSrEr�r�rrrr8Fsz_dummyEntry.__init__N)rir�rrrrr�Esr�c@seZdZddd�ZdS)r^ricCst�||||�dSrEr�r�rrrr8Jsz_dummyFrame.__init__N)rir�rrrrr^Isr^c@seZdZddd�ZdS)r�ricCst�||||�dSrEr�r�rrrr8Nsz_dummyLabel.__init__N)rir�rrrrr�Msr�c@seZdZddd�ZdS)r�ricCst�||||�dSrEr�r�rrrr8Rsz_dummyListbox.__init__N)rir�rrrrr�Qsr�c@seZdZddd�ZdS)rxricCst�||||�dSrEr�r�rrrr8Vsz_dummyMenu.__init__N)rir�rrrrrxUsrxc@seZdZddd�ZdS)rwricCst�||||�dSrEr�r�rrrr8Zsz_dummyMenubutton.__init__N)rir�rrrrrwYsrwc@seZdZddd�ZdS)r�ricCst�||||�dSrEr�r�rrrr8^sz_dummyScrollbar.__init__N)rir�rrrrr�]sr�c@seZdZddd�ZdS)r�ricCst�||||�dSrEr�r�rrrr8bsz_dummyText.__init__N)rir�rrrrr�asr�c@seZdZddd�ZdS)r�ricCsDt�||||�t|d�|jd<t|d�|jd<t|d�|jd<dS)Nr�r�r�)r{r8r�rbr�r�rrrr8fsz_dummyScrolledListBox.__init__N)rir�rrrrr�esr�c@seZdZddd�ZdS)r�ricCst�||||�dSrEr�r�rrrr8msz_dummyHList.__init__N)rir�rrrrr�lsr�c@seZdZddd�ZdS)raricCsDt�||||�t|d�|jd<t|d�|jd<t|d�|jd<dS�Nr�r�r��r{r8r�rbr�r�rrrr8qsz_dummyScrolledHList.__init__N)rir�rrrrrapsrac@seZdZddd�ZdS)r�ricCst�||||�dSrEr�r�rrrr8xsz_dummyTList.__init__N)rir�rrrrr�wsr�c@seZdZddd�ZdS)r�ricCs�t�|||d|g�t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<z$t|d�|jd<t|d�|jd<Wntk
r�YnXdS)Nr�r�r�r�r�r�r�)r{r8r�rbr�r�r�r�r�rrrr8|s�
z_dummyComboBox.__init__N)rir�rrrrr�{sr�c@seZdZddd�ZdS)r�ricCsDt�||||�t|d�|jd<t|d�|jd<t|d�|jd<dSr�r�r�rrrr8�sz_dummyDirList.__init__N)rir�rrrrr��sr�c@seZdZddd�ZdS)r�ricCs4t�||||�t|d�|jd<t|d�|jd<dS)Nr�r�)r{r8r�rbr�r�rrrr8�sz_dummyDirSelectBox.__init__N)rir�rrrrr��sr�c@seZdZddd�ZdS)r�ricCs�t�||||�t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<dS)	Nr�r�r�r�r�r�r�r�)r{r8r�rbr�r�r�r�rrrr8�sz_dummyExFileSelectBox.__init__N)rir�rrrrr��sr�c@seZdZddd�ZdS)r�ricCsTt�||||�t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<dS)Nr�r�r�r�)r{r8r�rbr�r�rrrr8�s
z_dummyFileSelectBox.__init__N)rir�rrrrr��sr�c@seZdZddd�ZdS)r�ricCs$t�||||�t|d�|jd<dS)Nr�)r{r8r�rbr�rrrr8�sz_dummyFileComboBox.__init__N)rir�rrrrr��sr�c@seZdZddd�ZdS)r�ricCsTt�||||�t|d�|jd<t|d�|jd<t|d�|jd<t|d�|jd<dS)Nr�r�r�r�)r{r8r�rbr�rrrr8�s
z_dummyStdButtonBox.__init__N)rir�rrrrr��sr�c@seZdZddd�ZdS)�_dummyNoteBookFramercCst�||||�dSrEr�r�rrrr8�sz_dummyNoteBookFrame.__init__N)rr�rrrrr��sr�c@seZdZddd�ZdS)r`ricCst�||||�dSrEr�r�rrrr8�sz_dummyPanedWindow.__init__N)rir�rrrrr`�sr`cCs|j�d|j�S)NZ
tixOptionNamerL)r�rrr�
OptionName�sr�cCs:d}|��D](}|d|d|d||d}q|S)Nr<z{{z} {z - z}} )�keys)�dict�s�typerrr�FileTypeList�s&r�c@seZdZdS)�CObjViewNrrrrrrr��sr�c@s�eZdZdifdd�Zdd�Zdd�Zdd	�Zd(d
d�Zd)dd
�Zdd�Z	dd�Z
dd�Zd*dd�Zdd�Z
dd�Zdd�Zdd�Zdd�Zd+d d!�Zd"d#�Zd$d%�Zd&d'�ZdS),�GridNcKs"g}||_t�||d|||�dS)NZtixGrid�r'rZr8r�rrrr8�sz
Grid.__init__cCs|j�|dd�dSr�rr>rrrrszGrid.anchor_clearcCs|�|j�|dd��S)Nr�r/�r.rrr>rrr�
anchor_getszGrid.anchor_getcCs|j�|dd||�dSr�rr�rrrr�szGrid.anchor_setcCs4|dkr|j�|dd|�n|j�|dd||�dS)Nryr
rr�rrr�
delete_rowszGrid.delete_rowcCs4|dkr|j�|dd|�n|j�|dd||�dS)Nryr	rr�rrr�
delete_columnszGrid.delete_columncCs|j�|dd�dS)N�editr�rr>rrr�
edit_applyszGrid.edit_applycCs|j�|dd||�dS)Nr�r�rr�rrr�edit_set!sz
Grid.edit_setcCs,|r|ddkrd|}|j�|d|||�S)Nrr!rHr)rrPrQrrrrrH&szGrid.entrycgetcKs|�d||f||�SrI)Z
_configure)rrPrQr'r(rrrrJ,szGrid.entryconfigurec	Cs|�|j�|dd||��Sr6)Z_getbooleanrrr�rrrr72szGrid.info_existscCs|j�|dd||�Sr-rr�rrrr/6szGrid.info_bboxcCs|j�|dd|||�dS)N�mover	r�rr�r��offsetrrr�move_column:szGrid.move_columncCs|j�|dd|||�dS)Nr�r
rr�rrr�move_row@sz
Grid.move_rowcCs|�|j�|d||��SrKr�r�rrrrLFszGrid.nearestcKs>|�|j|�}|dk	r"d|f|}|jj|d||f|��dS)Nz	-itemtyper�)r%r'rr)rrPrQr�r(�argsrrrr�PszGrid.setcKs*|j�|jj|jdd|f|�i|����S)Nrr	)rrOrrCr%�rr�r(rrr�size_columnVs
�zGrid.size_columncKs(|j�|jj|dd|f|�i|����S)Nrr
)rrOrr%r�rrr�size_rowps�
�z
Grid.size_rowcCs|j�|jd||�dS)N�unsetrLr�rrrr��sz
Grid.unset)N)N)N)N)r2r3r4r8rr�r�r�r�r�r�rHrJr7r/r�r�rLr�r�r�r�rrrrr��s&	




r�c@seZdZdifdd�ZdS)�ScrolledGridNcKs"g}||_t�||d|||�dS)NZtixScrolledGridr�r�rrrr8�szScrolledGrid.__init__r�rrrrr��sr�)ur9r7rZ_tkinterZWINDOWZTEXTZSTATUSZ	IMMEDIATEZIMAGEZ	IMAGETEXTZBALLOONZAUTOZ	ACROSSTOP�ASCIIZCELLZCOLUMNZ
DECREASINGZ
INCREASINGZINTEGERZMAIN�MAXZREALZROWZS_REGIONZX_REGIONZY_REGIONZ
TCL_DONT_WAITZTCL_WINDOW_EVENTSZTCL_FILE_EVENTSZTCL_TIMER_EVENTSZTCL_IDLE_EVENTSZTCL_ALL_EVENTSrr5r@r`�	__bases__rZr{r�r�r�r�r�r�r�r�r�r�r�r�r�r�ZXViewZYViewr�rYrZr\r_rmrnrqrsr~r�r�r�r�r�r�r�r�r�r�r�r�r�r�ZButtonr�ZCheckbuttonr�ZEntryr�ZFramer^ZLabelr�ZListboxr�ZMenurxZ
MenubuttonrwZ	Scrollbarr�ZTextr�r�r�rar�r�r�r�r�r�r�r�r�r`r�r�r�r�r�rrrr�<module>s�-
8/,!"C#	()


S.6

*simpledialog.cpython-38.opt-2.pyc000064400000022062151732766110012620 0ustar00U

e5d�-�@s�ddlTddlmZmZGdd�d�ZGdd�de�Zdd�ZGd	d
�d
e�ZGdd�de�Zd
d�Z	Gdd�de�Z
dd�ZGdd�de�Zdd�Z
edkr�dd�Ze�dS)�)�*)�
messagebox�_get_default_rootc@sLeZdZdgddddfdd�Zddd�Zd	d
�Zdd�Zd
d�Zdd�ZdS)�SimpleDialog�NcCs|rt||d�|_n
t|�|_|r:|j�|�|j�|�t|j�t|j|dd�|_|jjdtd�t	|j�|_
|j
��||_||_||_
|j�d|j�tt|��D]L}||}	t|j
|	||fdd�d	�}
||kr�|
jtd
d�|
jttdd�q�|j�d
|j�|�|�dS)N)�class_i�)�textZaspect�)�expand�fill�<Return>cSs
|�|�S�N)�done��self�num�r�,/usr/lib64/python3.8/tkinter/simpledialog.py�<lambda>8�z'SimpleDialog.__init__.<locals>.<lambda>�r�command�)ZreliefZborderwidth)�siderr
�WM_DELETE_WINDOW)�Toplevel�root�titleZiconname�
_setup_dialogZMessage�message�packZBOTH�Frame�framer�cancel�default�bind�return_event�range�len�ButtonZconfigZRIDGE�LEFT�protocol�wm_delete_window�_set_transient)r�masterr�buttonsr$r#rrr�s�brrr�__init__ s2


�zSimpleDialog.__init__��?�333333�?c
Cs|j}|��|�|�|��|��rJ|��}|��}|��}|��}n|�	�}|�
�}d}}|��}	|��}
|||	|}|||
|}||	|�	�kr�|�	�|	}n|dkr�d}||
|�
�kr�|�
�|
}n|dkr�d}|�
d||f�|��dS)Nr�+%d+%d)r�withdraw�	transient�update_idletasksZwinfo_ismappedZwinfo_widthZwinfo_height�winfo_rootx�winfo_rootyZwinfo_screenwidthZwinfo_screenheightZwinfo_reqwidthZwinfo_reqheight�geometry�	deiconify)
rr.ZrelxZrelyZwidgetZm_widthZm_heightZm_xZm_yZw_widthZw_height�x�yrrrr-?s4

zSimpleDialog._set_transientcCs.|j��|j��|j��|j��|jSr
)r�wait_visibility�grab_set�mainloop�destroyr�rrrr�go\s




zSimpleDialog.gocCs&|jdkr|j��n|�|j�dSr
)r$r�bellr�rZeventrrrr&cs
zSimpleDialog.return_eventcCs&|jdkr|j��n|�|j�dSr
)r#rrErrCrrrr,is
zSimpleDialog.wm_delete_windowcCs||_|j��dSr
)rr�quitrrrrroszSimpleDialog.done)r3r4)	�__name__�
__module__�__qualname__r2r-rDr&r,rrrrrrs�

rc@sReZdZddd�Zdd�Zdd�Zdd	�Zdd
d�Zddd
�Zdd�Z	dd�Z
dS)�DialogNcCs�|}|std�}t�||�|��|dk	r>|��r>|�|�|rL|�|�t|�||_d|_	t
|�}|�|�|_|j
ddd�|��|js�||_|�d|j�|dk	r�|�d|��d|��df�|��|j��|��|��|�|�dS)Nzcreate dialog window�)�padx�padyrr5�2)rrr2r6Zwinfo_viewabler7rr�parent�resultr!�body�
initial_focusr �	buttonboxr+r#r;r9r:r<�	focus_setr?r@Zwait_window)rrPrr.rRrrrr2{s8	


�
zDialog.__init__cCsd|_t�|�dSr
)rSrrBrCrrrrB�szDialog.destroycCsdSr
r)rr.rrrrR�szDialog.bodycCsvt|�}t|dd|jtd�}|jtddd�t|dd|jd�}|jtddd�|�d|j�|�d	|j�|��dS)
NZOK�
)r�widthrr$rL)rrMrN�Cancel)rrWrrz<Escape>)r!r)�okZACTIVEr r*r#r%)rZbox�wrrrrT�szDialog.buttonboxcCsB|��s|j��dS|��|��z|��W5|��XdSr
)�validaterSrUr6r8r#�applyrFrrrrY�s
z	Dialog.okcCs |jdk	r|j��|��dSr
)rPrUrBrFrrrr#�s

z
Dialog.cancelcCsdS)Nr	rrCrrrr[�szDialog.validatecCsdSr
rrCrrrr\�szDialog.apply)N)N)N)rHrIrJr2rBrRrTrYr#r[r\rrrrrKts
7	


	rKcCs:|jdkr |j�dd|dd�n|jdkr6|�dd�dS)	NZaquaz!::tk::unsupported::MacWindowStyleZstyleZ
moveableModalrZx11z-typeZdialog)Z_windowingsystemZtkZcallZ
wm_attributes)rZrrrrs

�
rc@s.eZdZd
dd�Zdd�Zdd�Zdd	�ZdS)�_QueryDialogNcCs*||_||_||_||_t�|||�dSr
)�prompt�minvalue�maxvalue�initialvaluerKr2)rrr^rar_r`rPrrrr2s
z_QueryDialog.__init__cCsd|_t�|�dSr
)�entryrKrBrCrrrrBsz_QueryDialog.destroycCsrt||jtd�}|jddtd�t|dd�|_|jjddttd�|jdk	rl|j�	d|j�|j�
dt�|jS)N)rZjustifyrrL)�rowrMZstickyrb)�namer	)ZLabelr^r*Zgrid�WZEntryrb�Era�insertZselect_rangeZEND)rr.rZrrrrR s
z_QueryDialog.bodycCs�z|��}Wn,tk
r8tjd|jd|d�YdSX|jdk	rh||jkrhtjdd|j|d�dS|jdk	r�||jkr�tjdd|j|d�dS||_d	S)
Nz
Illegal valuez
Please try again)rPrz	Too smallz2The allowed minimum value is %s. Please try again.z	Too largez2The allowed maximum value is %s. Please try again.r	)�	getresult�
ValueErrorr�showwarning�errormessager_r`rQ)rrQrrrr[.s:�����z_QueryDialog.validate)NNNN)rHrIrJr2rBrRr[rrrrr]
s�

r]c@seZdZdZdd�ZdS)�
_QueryIntegerzNot an integer.cCs|�|j���Sr
)Zgetintrb�getrCrrrrhSsz_QueryInteger.getresultN�rHrIrJrkrhrrrrrlPsrlcKst||f|�}|jSr
)rlrQ�rr^�kw�drrr�
askintegerWsrrc@seZdZdZdd�ZdS)�_QueryFloatzNot a floating point value.cCs|�|j���Sr
)Z	getdoublerbrmrCrrrrhisz_QueryFloat.getresultNrnrrrrrsfsrscKst||f|�}|jSr
)rsrQrorrr�askfloatmsrtc@s$eZdZdd�Zdd�Zdd�ZdS)�_QueryStringcOs6d|kr|d|_|d=nd|_tj|f|�|�dS)N�show)�_QueryString__showr]r2)r�argsrprrrr2}s

z_QueryString.__init__cCs(t�||�}|jdk	r$|j|jd�|S)N)rv)r]rRrwZ	configure)rr.rbrrrrR�s
z_QueryString.bodycCs
|j��Sr
)rbrmrCrrrrh�sz_QueryString.getresultN)rHrIrJr2rRrhrrrrru|srucKst||f|�}|jSr
)rurQrorrr�	askstring�sry�__main__cCsLt�}|fdd�}t|d|d�}|��t|d|jd�}|��|��dS)NcSs^t|ddddgdddd�}t|���ttd	d
dd��ttd	d
ddd��ttd	d��dS)Nz�This is a test dialog.  Would this have been an actual dialog, the buttons below would have been glowing in soft pink light.
Do you believe this?ZYesZNorXr�zTest Dialog)rr/r$r#rZSpamz	Egg count�)razEgg weight
(in tons)r	�d)r_r`z	Egg label)r�printrDrrrtry)rrqrrr�doit�s�

�ztest.<locals>.doitZTestrZQuit)ZTkr)r rGrA)rr�t�qrrr�test�sr�N)ZtkinterrrrrrKrr]rlrrrsrtruryrHr�rrrr�<module>sV
Cscrolledtext.cpython-38.pyc000064400000004203151732766110011720 0ustar00U

e5d�@sldZdgZddlmZmZmZmZmZmZddl	m
Z
mZmZm
Z
Gdd�de�Zdd�Zedkrhe�d	S)
aA ScrolledText widget feels like a text widget but also has a
vertical scroll bar on its right.  (Later, options may be added to
add a horizontal bar as well, to make the bars disappear
automatically when not needed, to move them to the other side of the
window, etc.)

Configuration options are passed to the Text widget.
A Frame widget is inserted between the master and the text, to hold
the Scrollbar widget.
Most methods calls are inherited from the Text widget; Pack, Grid and
Place methods are redirected to the Frame widget however.
�ScrolledText�)�Frame�Text�	Scrollbar�Pack�Grid�Place)�RIGHT�LEFT�Y�BOTHc@seZdZddd�Zdd�ZdS)rNcKs�t|�|_t|j�|_|jjttd�|�d|jji�t	j
||jf|�|jttdd�|j
|jd<tt	���}tt���tt���Btt���B}|�|�}|D]4}|ddkr�|dkr�|d	kr�t||t|j|��q�dS)
N)�side�fillZyscrollcommandT)r
r�expandZcommandr�_ZconfigZ	configure)r�framerZvbar�packr	r�update�setr�__init__r
rZyview�vars�keysrrr�
difference�setattr�getattr)�selfZmaster�kwZ
text_meths�methods�m�r�,/usr/lib64/python3.8/tkinter/scrolledtext.pyrs
$
zScrolledText.__init__cCs
t|j�S)N)�strr)rrrr �__str__)szScrolledText.__str__)N)�__name__�
__module__�__qualname__rr"rrrr rs
cCsHddlm}tddd�}|�|t�|jttdd�|��|�	�dS)Nr)�ENDZwhite�
)ZbgZheightT)rr
r)
�tkinter.constantsr&r�insert�__doc__rrr
Z	focus_setZmainloop)r&Zstextrrr �example-sr+�__main__N)r*�__all__Ztkinterrrrrrrr(r	r
rrrr+r#rrrr �<module>s
 
request.cpython-38.opt-2.pyc000064400000165443151733313270011646 0ustar00U

e5d���!@s�ddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddl
Z
ddlZddlZddlZddlmZmZmZddlmZmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'ddl(m)Z)m*Z*zddl+Z+Wne,k
�rdZ-YnXdZ-ddd	d
ddd
ddddddddddddddddddd d!d"d#d$d%d&d'g!Z.d(ej/dd)�Z0da1de
j2fddddd*�d+d�Z3d,d�Z4gZ5d}d-d$�Z6d.d%�Z7e	�8d/e	j9�Z:d0d1�Z;Gd2d�d�Z<Gd3d�d�Z=d4d �Z>Gd5d	�d	�Z?Gd6d�de?�Z@Gd7d
�d
e?�ZAGd8d�de?�ZBd9d:�ZCGd;d
�d
e?�ZDGd<d�d�ZEGd=d�deE�ZFGd>d�deF�ZGGd?d�d�ZHGd@d�deHe?�ZIGdAd�deHe?�ZJejKZLGdBd�d�ZMGdCd�de?eM�ZNGdDd�de?eM�ZOGdEdF�dFe?�ZPGdGd�deP�ZQeRejSdH��r&GdIdJ�dJeP�ZTe.�UdJ�GdKd�de?�ZVGdLd�de?�ZWdMdN�ZXdOdP�ZYGdQd�de?�ZZdRdS�Z[GdTd�de?�Z\GdUd�de\�Z]GdVd�de?�Z^dWZ_ej`dXk�r�ddYlambZbmcZcndZd"�Zbd[d!�ZciZdGd\d&�d&�ZeGd]d'�d'ee�Zfdagd^d_�Zhdaid`da�Zjdakdbdc�Zldamddde�ZnGdfdg�dg�Zodhdi�Zpd~djdk�Zqdldm�Zrejsdnk�r�ddoltmuZumvZvdpdq�Zwdrds�Zxdtdu�Zydvd#�Zzn6ej`dXk�r�dwdx�Z{dyd#�Zzdzd{�Z|d|du�ZynepZzeqZydS)�N)�URLError�	HTTPError�ContentTooShortError)�urlparse�urlsplit�urljoin�unwrap�quote�unquote�
_splittype�
_splithost�
_splitport�
_splituser�_splitpasswd�
_splitattr�_splitquery�_splitvalue�	_splittag�	_to_bytes�unquote_to_bytes�
urlunparse)�
addinfourl�addclosehookFT�Request�OpenerDirector�BaseHandler�HTTPDefaultErrorHandler�HTTPRedirectHandler�HTTPCookieProcessor�ProxyHandler�HTTPPasswordMgr�HTTPPasswordMgrWithDefaultRealm�HTTPPasswordMgrWithPriorAuth�AbstractBasicAuthHandler�HTTPBasicAuthHandler�ProxyBasicAuthHandler�AbstractDigestAuthHandler�HTTPDigestAuthHandler�ProxyDigestAuthHandler�HTTPHandler�FileHandler�
FTPHandler�CacheFTPHandler�DataHandler�UnknownHandler�HTTPErrorProcessor�urlopen�install_opener�build_opener�pathname2url�url2pathname�
getproxies�urlretrieve�
urlcleanup�	URLopener�FancyURLopenerz%d.%d�)�cafile�capath�	cadefault�contextc
Cs�|s|s|rfddl}|�dtd�|dk	r2td��ts>td��tjtjj||d�}t	|d�}t
|�}	n0|r~t	|d�}t
|�}	ntdkr�t
�a}	nt}	|	�|||�S)NrzJcafile, capath and cadefault are deprecated, use a custom context instead.r:zDYou can't pass both context and any of cafile, capath, and cadefaultzSSL support not available)r;r<)r>)
�warnings�warn�DeprecationWarning�
ValueError�	_have_ssl�sslZcreate_default_contextZPurposeZSERVER_AUTH�HTTPSHandlerr2�_opener�open)
�url�data�timeoutr;r<r=r>r?Z
https_handler�opener�rL�&/usr/lib64/python3.8/urllib/request.pyr0�s2<��
�



cCs|adS�N)rF)rKrLrLrMr1�sc
Cs:t|�\}}t�t||����}|��}|dkrN|sNtj�|�|fW5QR�S|r^t|d�}nt	j
dd�}|j}t�
|�|��||f}	d}
d}d}d}
d|kr�t|d	�}|r�||
|
|�|�|
�}|s�q�|t|�7}|�|�|
d
7}
|r�||
|
|�q�W5QRXW5QRX|dk�r6||k�r6td||f|	��|	S)N�file�wbF)�delete� ���r�content-length�Content-Length��1retrieval incomplete: got only %i out of %i bytes)r�
contextlib�closingr0�info�os�path�normpathrG�tempfileZNamedTemporaryFile�name�_url_tempfiles�append�int�read�len�writer)rH�filename�
reporthookrIZurl_typer\�fp�headers�tfp�result�bs�sizerc�blocknum�blockrLrLrMr6�sH


"��c	CsDtD](}zt�|�Wqtk
r*YqXqtdd�=tr@dadSrN)r`r[�unlink�OSErrorrF)Z	temp_filerLrLrMr7$s
z:\d+$cCs<|j}t|�d}|dkr&|�dd�}t�d|d�}|��S)NrV��Host)�full_urlr�
get_header�_cut_port_re�sub�lower)�requestrH�hostrLrLrM�request_host3sr{c@s�eZdZdidddfdd�Zedd��Zejdd��Zejdd��Zed	d
��Zejdd
��Zejdd
��Zd
d�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zd#dd�Zdd �Zd!d"�ZdS)$rNFc	Csl||_i|_i|_d|_||_d|_|��D]\}}|�||�q,|dkrRt|�}||_	||_
|rh||_dSrN)rtri�unredirected_hdrs�_datarI�_tunnel_host�items�
add_headerr{�origin_req_host�unverifiable�method)	�selfrHrIrir�r�r��key�valuerLrLrM�__init__EszRequest.__init__cCs|jrd�|j|j�S|jS)Nz{}#{})�fragment�format�	_full_url�r�rLrLrMrtWszRequest.full_urlcCs(t|�|_t|j�\|_|_|��dSrN)rr�rr��_parse�r�rHrLrLrMrt]s
cCsd|_d|_d|_dS�Nrr)r�r��selectorr�rLrLrMrtdscCs|jSrN)r}r�rLrLrMrIjszRequest.datacCs(||jkr$||_|�d�r$|�d�dS)N�Content-length)r}�
has_header�
remove_header)r�rIrLrLrMrIns

cCs
d|_dSrN)rIr�rLrLrMrIxscCsNt|j�\|_}|jdkr(td|j��t|�\|_|_|jrJt|j�|_dS)Nzunknown url type: %r)	rr��typerBrtrrzr�r
)r��restrLrLrMr�|s
zRequest._parsecCs|jdk	rdnd}t|d|�S)N�POST�GETr�)rI�getattr)r�Zdefault_methodrLrLrM�
get_method�szRequest.get_methodcCs|jSrN)rtr�rLrLrM�get_full_url�szRequest.get_full_urlcCs2|jdkr|js|j|_n||_|j|_||_dS)N�https)r�r~rzrtr�)r�rzr�rLrLrM�	set_proxy�s

zRequest.set_proxycCs|j|jkSrN)r�rtr�rLrLrM�	has_proxy�szRequest.has_proxycCs||j|��<dSrN)ri�
capitalize�r�r��valrLrLrMr��szRequest.add_headercCs||j|��<dSrN)r|r�r�rLrLrM�add_unredirected_header�szRequest.add_unredirected_headercCs||jkp||jkSrN)rir|�r��header_namerLrLrMr��s
�zRequest.has_headercCs|j�||j�||��SrN)ri�getr|)r�r��defaultrLrLrMru�s�zRequest.get_headercCs |j�|d�|j�|d�dSrN)ri�popr|r�rLrLrMr��szRequest.remove_headercCs|j|j�}t|���SrN)r|ri�listr)r��hdrsrLrLrM�header_items�szRequest.header_items)N)�__name__�
__module__�__qualname__r��propertyrt�setter�deleterrIr�r�r�r�r�r�r�r�rur�r�rLrLrLrMrCs8�





	

c@sNeZdZdd�Zdd�Zdd�Zdd�Zd	ejfd
d�Z	ddd
�Z
dd�Zd	S)rcCs6dt}d|fg|_g|_i|_i|_i|_i|_dS)N�Python-urllib/%sz
User-agent)�__version__�
addheaders�handlers�handle_open�handle_error�process_response�process_request)r�Zclient_versionrLrLrMr��szOpenerDirector.__init__c	CsTt|d�stdt|���d}t|�D�]}|dkr6q&|�d�}|d|�}||dd�}|�d�r�|�d�|d}||dd�}zt|�}Wntk
r�YnX|j�	|i�}	|	|j|<n>|dkr�|}|j
}	n*|d	kr�|}|j}	n|d
kr&|}|j}	nq&|	�
|g�}
|
�r"t�|
|�n
|
�|�d}q&|�rPt�|j|�|�|�dS)N�
add_parentz%expected BaseHandler instance, got %rF)�redirect_request�do_open�
proxy_open�_rV�errorrG�responseryT)�hasattr�	TypeErrorr��dir�find�
startswithrbrBr�r�r�r�r��
setdefault�bisectZinsortrar�r�)r��handlerZadded�meth�i�protocolZ	condition�j�kind�lookupr�rLrLrM�add_handler�sL
�


zOpenerDirector.add_handlercCsdSrNrLr�rLrLrM�close�szOpenerDirector.closec	Gs<|�|d�}|D]&}t||�}||�}|dk	r|SqdS)NrL)r�r�)	r��chainr��	meth_name�argsr�r��funcrkrLrLrM�_call_chain�s
zOpenerDirector._call_chainNc
Cs�t|t�rt||�}n|}|dk	r(||_||_|j}|d}|j�|g�D]}t||�}||�}qJt	�
d|j|j|j|�
��|�||�}	|d}|j�|g�D]}t||�}|||	�}	q�|	S)NZ_requestzurllib.RequestZ	_response)�
isinstance�strrrIrJr�r�r�r��sys�auditrtrir��_openr�)
r��fullurlrIrJ�reqr�r�Z	processorr�r�rLrLrMrG�s$



zOpenerDirector.opencCsP|�|jdd|�}|r|S|j}|�|j||d|�}|r>|S|�|jdd|�S)Nr�Zdefault_openr��unknown�unknown_open)r�r�r�)r�r�rIrkr�rLrLrMr�s$
���
�zOpenerDirector._opencGs~|dkr,|jd}|d}d|}d}|}n|j}|d}d}|||f|}|j|�}|r^|S|rz|dd	f|}|j|�SdS)
N��httpr�r�r:z
http_error_%srVZ_errorrr��http_error_default)r�r�)r��protor��dictr�Zhttp_errZ	orig_argsrkrLrLrMr�&s 

zOpenerDirector.error)N)r�r�r�r�r�r�r��socket�_GLOBAL_DEFAULT_TIMEOUTrGr�r�rLrLrLrMr�s/
c	Gs�t�}ttttttttt	g	}t
tjd�r2|�
t�t�}|D]B}|D]8}t|t�rht||�r||�|�qDt||�rD|�|�qDq<|D]}|�|�q�|D]}|�|��q�|D]}t|t�r�|�}|�|�q�|S)N�HTTPSConnection)rrr.r)rrr+r*r/r-r�r��clientrarE�setr�r��
issubclass�add�remover�)r�rKZdefault_classes�skip�klassZcheck�hrLrLrMr2?s8	�




c@s(eZdZdZdd�Zdd�Zdd�ZdS)	r��cCs
||_dSrN)�parent)r�r�rLrLrMr�fszBaseHandler.add_parentcCsdSrNrLr�rLrLrMr�iszBaseHandler.closecCst|d�sdS|j|jkS)N�
handler_orderT)r�r�)r��otherrLrLrM�__lt__ms
zBaseHandler.__lt__N)r�r�r�r�r�r�r�rLrLrLrMrcsc@seZdZdZdd�ZeZdS)r/i�cCsH|j|j|��}}}d|kr,dksDn|j�d|||||�}|S)N���,r�)�code�msgrZr�r�)r�ryr�r�r�r�rLrLrM�
http_responsezs�z HTTPErrorProcessor.http_responseN)r�r�r�r�r��https_responserLrLrLrMr/vsc@seZdZdd�ZdS)rcCst|j||||��dSrN)rrt)r�r�rhr�r�r�rLrLrMr��sz*HTTPDefaultErrorHandler.http_error_defaultN)r�r�r�r�rLrLrLrMr�sc@s4eZdZdZdZdd�Zdd�ZeZZZ	dZ
dS)	r��
c	st|��}|dkr|dks:|dkr(|dks:t|j||||��|�dd�}d��fdd	�|j��D�}t|||jd
d�S)N)�-�.�/i3)r�ZHEAD)r�r�r�r�� z%20)rTzcontent-typecs"i|]\}}|���kr||�qSrL)rx��.0�k�v�ZCONTENT_HEADERSrLrM�
<dictcomp>�s�z8HTTPRedirectHandler.redirect_request.<locals>.<dictcomp>T)rir�r�)r�rrt�replacerirrr�)	r�r�rhr�r�ri�newurl�mZ
newheadersrLrrMr��s
���z$HTTPRedirectHandler.redirect_requestc
CsLd|kr|d}nd|kr$|d}ndSt|�}|jdkrRt||d||f||��|jsn|jrnt|�}d|d<t|�}t|dtj	d�}t
|j|�}|�||||||�}|dkr�dSt
|d	��r|j}	|_|	�|d
�|jks�t|	�|jk�rt|j||j|||��ni}	|_|_|	�|d
�d|	|<|��|��|jj||jd�S)
N�location�uri�r�r��ftprrz+%s - Redirection to url '%s' is not allowed�/r:z
iso-8859-1)�encoding�safe�
redirect_dictrrV�rJ)r�schemerr\Znetlocr�rr	�stringZpunctuationrrtr�r�r
r��max_repeatsrd�max_redirections�inf_msgrcr�r�rGrJ)
r�r�rhr�r�rir�urlparts�newZvisitedrLrLrM�http_error_302�sT



����z"HTTPRedirectHandler.http_error_302zoThe HTTP server returned a redirect error that would lead to an infinite loop.
The last 30x error message was:
N)r�r�r�rrr�r�http_error_301�http_error_303�http_error_307rrLrLrLrMr�s&<c
Cs�t|�\}}|�d�s d}|}nZ|�d�s6td|��d|krV|�d�}|�d|�}n|�dd�}|dkrnd}|d|�}t|�\}}|dk	r�t|�\}}	nd}}	|||	|fS)Nr
�//zproxy URL with no authority: %r�@r:rS)rr�rBr�rr)
�proxyrZr_scheme�	authorityZhost_separator�endZuserinfo�hostport�user�passwordrLrLrM�_parse_proxy�s$


r"c@s"eZdZdZddd�Zdd�ZdS)r�dNcCsP|dkrt�}||_|��D].\}}|��}t|d||||jfdd��qdS)Nz%s_opencSs||||�SrNrL)�rrr�r�rLrLrM�<lambda>)sz'ProxyHandler.__init__.<locals>.<lambda>)r5�proxiesrrx�setattrr�)r�r&r�rHrLrLrMr�!s
�zProxyHandler.__init__cCs�|j}t|�\}}}}|dkr"|}|jr6t|j�r6dS|rv|rvdt|�t|�f}	t�|	����d�}
|�	dd|
�t|�}|�
||�||ks�|dkr�dS|jj||j
d�SdS)N�%s:%s�ascii�Proxy-authorization�Basic r�r)r�r"rz�proxy_bypassr
�base64�	b64encode�encode�decoder�r�r�rGrJ)r�r�rr�Z	orig_typeZ
proxy_typer r!rZ	user_passZcredsrLrLrMr�,s"�zProxyHandler.proxy_open)N)r�r�r�r�r�r�rLrLrLrMrs
c@s6eZdZdd�Zdd�Zdd�Zd
dd	�Zd
d�ZdS)r cCs
i|_dSrN)�passwdr�rLrLrMr�JszHTTPPasswordMgr.__init__cs\t|t�r|g}|�jkr$i�j|<dD].�t��fdd�|D��}||f�j||<q(dS)N�TFc3s|]}��|��VqdSrN)�
reduce_uri)r��u��default_portr�rLrM�	<genexpr>Tsz/HTTPPasswordMgr.add_password.<locals>.<genexpr>)r�r�r1�tuple)r��realmrr r1�reduced_urirLr5rM�add_passwordMs


�zHTTPPasswordMgr.add_passwordc	Cs`|j�|i�}dD]H}|�||�}|��D].\}}|D] }|�||�r6|Sq6q*qdS)Nr2�NN)r1r�r3r�	is_suburi)	r�r9�authuriZdomainsr6�reduced_authuriZurisZauthinforrLrLrM�find_user_passwordXsz"HTTPPasswordMgr.find_user_passwordTc
Cs�t|�}|dr.|d}|d}|dp*d}nd}|}d}t|�\}}|r~|dkr~|dk	r~ddd��|�}	|	dk	r~d||	f}||fS)	NrVrr:r
�Pi�r�z%s:%d)rr
r�)
r�rr6�partsrrr\rz�portZdportrLrLrMr3bs$��zHTTPPasswordMgr.reduce_uricCsN||krdS|d|dkr dS|d}|dd�dkr@|d7}|d�|�S)NTrFrVrSr
)r�)r��base�test�prefixrLrLrMr=yszHTTPPasswordMgr.is_suburiN)T)r�r�r�r�r;r@r3r=rLrLrLrMr Hs


c@seZdZdd�ZdS)r!cCs0t�|||�\}}|dk	r"||fSt�|d|�SrN)r r@)r�r9r>r r!rLrLrMr@�s�z2HTTPPasswordMgrWithDefaultRealm.find_user_passwordN)r�r�r�r@rLrLrLrMr!�scs<eZdZ�fdd�Zd
�fdd�	Zddd�Zdd	�Z�ZS)r"csi|_t�j||�dSrN)�
authenticated�superr��r�r��kwargs��	__class__rLrMr��sz%HTTPPasswordMgrWithPriorAuth.__init__Fcs<|�||�|dk	r&t��d|||�t��||||�dSrN)�update_authenticatedrHr;)r�r9rr r1�is_authenticatedrKrLrMr;�sz)HTTPPasswordMgrWithPriorAuth.add_passwordcCs>t|t�r|g}dD]$}|D]}|�||�}||j|<qqdS�Nr2)r�r�r3rG)r�rrNr6r4r:rLrLrMrM�s
z1HTTPPasswordMgrWithPriorAuth.update_authenticatedcCsDdD]:}|�||�}|jD]"}|�||�r|j|SqqdSrO)r3rGr=)r�r>r6r?rrLrLrMrN�s

z-HTTPPasswordMgrWithPriorAuth.is_authenticated)F)F)r�r�r�r�r;rMrN�
__classcell__rLrLrKrMr"�s

c@sTeZdZe�dej�Zddd�Zdd�Zdd�Z	d	d
�Z
dd�Zd
d�ZeZ
eZdS)r#z1(?:^|,)[ 	]*([^ 	,]+)[ 	]+realm=(["']?)([^"']*)\2NcCs"|dkrt�}||_|jj|_dSrN)r r1r;)r�Zpassword_mgrrLrLrMr��sz!AbstractBasicAuthHandler.__init__ccspd}tj�|�D]6}|��\}}}|dkr8t�dtd�||fVd}q|sl|r^|��d}nd}|dfVdS)NF)�"�'zBasic Auth Realm was unquoted�Trrr)r#�rx�finditer�groupsr?r@�UserWarning�split)r��headerZfound_challengeZmorr	r9rLrLrM�_parse_realm�s�
z%AbstractBasicAuthHandler._parse_realmc	Cs~|�|�}|sdSd}|D]H}|�|�D]8\}}|��dkrB|}q(|dk	r(|�|||�Sq(q|dk	rztd|f��dS)N�basiczBAbstractBasicAuthHandler does not support the following scheme: %r)Zget_allrZrx�retry_http_basic_authrB)	r��authreqrzr�riZunsupportedrYrr9rLrLrM�http_error_auth_reqed�s
�z.AbstractBasicAuthHandler.http_error_auth_reqedcCs||j�||�\}}|dk	rtd||f}dt�|����d�}|�|jd�|krTdS|�|j|�|j	j
||jd�SdSdS)Nr(r+r)r)r1r@r-r.r/r0ru�auth_headerr�r�rGrJ)r�rzr�r9r �pw�raw�authrLrLrMr\�sz.AbstractBasicAuthHandler.retry_http_basic_authcCstt|jd�r|j�|j�s|S|�d�sp|j�d|j�\}}d�||���}t�	|��
�}|�dd�|����|S)NrN�
Authorizationz{0}:{1}zBasic {})
r�r1rNrtr�r@r�r/r-Zstandard_b64encoder0r��strip)r�r�r r1ZcredentialsZauth_strrLrLrM�http_requests�
�z%AbstractBasicAuthHandler.http_requestcCsLt|jd�rHd|jkr"dkr8nn|j�|jd�n|j�|jd�|S)NrNr�r�TF)r�r1r�rMrt)r�r�r�rLrLrMr�s
z&AbstractBasicAuthHandler.http_response)N)r�r�r��re�compile�IrTr�rZr^r\rer��
https_requestr�rLrLrLrMr#�s�

c@seZdZdZdd�ZdS)r$rccCs|j}|�d|||�}|S)N�www-authenticate)rtr^)r�r�rhr�r�rirHr�rLrLrM�http_error_401$s�z#HTTPBasicAuthHandler.http_error_401N)r�r�r�r_rkrLrLrLrMr$ sc@seZdZdZdd�ZdS)r%r*cCs|j}|�d|||�}|S�N�proxy-authenticate)rzr^)r�r�rhr�r�rirr�rLrLrM�http_error_407/s�z$ProxyBasicAuthHandler.http_error_407N)r�r�r�r_rnrLrLrLrMr%+sc@sNeZdZddd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Zdd�Z	dd�Z
dS)r&NcCs4|dkrt�}||_|jj|_d|_d|_d|_dS�Nr)r r1r;�retried�nonce_count�
last_nonce)r�r1rLrLrMr�Is
z"AbstractDigestAuthHandler.__init__cCs
d|_dSro)rpr�rLrLrM�reset_retry_countRsz+AbstractDigestAuthHandler.reset_retry_countcCs||�|d�}|jdkr*t|jdd|d��n|jd7_|rx|��d}|��dkr`|�||�S|��dkrxtd|��dS)	N�i�zdigest auth failedrVrZdigestr[zEAbstractDigestAuthHandler does not support the following scheme: '%s')r�rprrtrXrx�retry_http_digest_authrB)r�r_rzr�rir]rrLrLrMr^Us

��z/AbstractDigestAuthHandler.http_error_auth_reqedcCsz|�dd�\}}ttdt|���}|�||�}|rvd|}|j�|jd�|krRdS|�|j|�|j	j
||jd�}|SdS)Nr�rVz	Digest %sr)rX�parse_keqv_list�filter�parse_http_list�get_authorizationrir�r_r�r�rGrJ)r�r�rb�tokenZ	challenge�chalZauth_valZresprLrLrMruisz0AbstractDigestAuthHandler.retry_http_digest_authcCs@d|j|t��f}|�d�td�}t�|���}|dd�S)Nz	%s:%s:%s:r)��)rq�time�ctimer/�_randombytes�hashlib�sha1�	hexdigest)r��nonce�s�b�digrLrLrM�
get_cnonceusz$AbstractDigestAuthHandler.get_cnoncecCs�z6|d}|d}|�d�}|�dd�}|�dd�}Wntk
rLYdSX|�|�\}}	|dkrhdS|j�||j�\}
}|
dkr�dS|jdk	r�|�|j|�}nd}d|
||f}
d|��|j	f}|dkr�|	||
�d|||�f�}n~d	|�
d
�k�r\||jk�r|jd7_nd|_||_d|j}|�
|�}d
|||d	||�f}|	||
�|�}ntd|��d|
|||j	|f}|�r�|d|7}|�r�|d|7}|d|7}|�r�|d||f7}|S)Nr9r��qop�	algorithm�MD5�opaquez%s:%s:%sr(rb�,rVz%08xz%s:%s:%s:%s:%szqop '%s' is not supported.z>username="%s", realm="%s", nonce="%s", uri="%s", response="%s"z
, opaque="%s"z
, digest="%s"z, algorithm="%s"z, qop=auth, nc=%s, cnonce="%s")r��KeyError�get_algorithm_implsr1r@rtrI�get_entity_digestr�r�rXrrrqr�r)r�r�r{r9r�r�r�r��H�KDr r`ZentdigZA1ZA2ZrespdigZncvalueZcnonceZnoncebitrDrLrLrMry�s\

�


��z+AbstractDigestAuthHandler.get_authorizationcsD|dkrdd��n|dkr$dd��ntd|���fdd�}�|fS)Nr�cSst�|�d����S�Nr))r�Zmd5r/r���xrLrLrMr%��z?AbstractDigestAuthHandler.get_algorithm_impls.<locals>.<lambda>ZSHAcSst�|�d����Sr�)r�r�r/r�r�rLrLrMr%�r�z.Unsupported digest authentication algorithm %rcs�d||f�S)Nr(rL)r��d�r�rLrMr%�r�)rB)r�r�r�rLr�rMr��s

�z-AbstractDigestAuthHandler.get_algorithm_implscCsdSrNrL)r�rIr{rLrLrMr��sz+AbstractDigestAuthHandler.get_entity_digest)N)r�r�r�r�rsr^rur�ryr�r�rLrLrLrMr&>s
	>
c@seZdZdZdZdd�ZdS)r'rc��cCs*t|j�d}|�d|||�}|��|S)NrVrj)rrtr^rs�r�r�rhr�r�rirz�retryrLrLrMrk�s�z$HTTPDigestAuthHandler.http_error_401N)r�r�r�r_r�rkrLrLrLrMr'�sc@seZdZdZdZdd�ZdS)r(�Proxy-Authorizationr�cCs"|j}|�d|||�}|��|Srl)rzr^rsr�rLrLrMrn�s�z%ProxyDigestAuthHandler.http_error_407N)r�r�r�r_r�rnrLrLrLrMr(�sc@s6eZdZd
dd�Zdd�Zdd�Zdd	�Zd
d�ZdS)�AbstractHTTPHandlerrcCs
||_dSrN��_debuglevel)r��
debuglevelrLrLrMr��szAbstractHTTPHandler.__init__cCs
||_dSrNr�)r��levelrLrLrM�set_http_debuglevel�sz'AbstractHTTPHandler.set_http_debuglevelcCstjj�|j|���SrN)r�r��HTTPConnection�_get_content_lengthrIr��r�ryrLrLrMr��s�z'AbstractHTTPHandler._get_content_lengthcCs|j}|std��|jdk	r�|j}t|t�r8d}t|��|�d�sN|�dd�|�d�s�|�d�s�|�|�}|dk	r�|�dt|��n|�dd�|}|�	�r�t
|j�\}}t|�\}}	|�d�s�|�d|�|j
jD]&\}
}|
��}
|�|
�s�|�|
|�q�|S)	N�
no host givenz\POST data should be bytes, an iterable of bytes, or a file object. It cannot be of type str.zContent-type�!application/x-www-form-urlencodedr��Transfer-encodingZchunkedrs)rzrrIr�r�r�r�r�r�r�rr�rr�r�r�)r�ryrzrIr�Zcontent_lengthZsel_hostrZselZsel_pathr_r�rLrLrM�do_request_�sJ


�
�
��

zAbstractHTTPHandler.do_request_c

sT|j}|std��||fd|ji|��}|�|j�t|j�����fdd�|j�	�D��d�d<dd���	�D��|j
r�i}d}|�kr��|||<�|=|j|j
|d	�z`z&|j|�
�|j|j�|�d
�d�Wn,tk
�r}zt|��W5d}~XYnX|��}	Wn|���YnX|j�r>|j��d|_|��|	_|	j|	_|	S)Nr�rJcsi|]\}}|�kr||�qSrLrLr��rirLrMr/s�z/AbstractHTTPHandler.do_open.<locals>.<dictcomp>r��
ConnectioncSsi|]\}}|��|�qSrL)�title)r�r_r�rLrLrMr<sr�r�r�)Zencode_chunked)rzrrJZset_debuglevelr�r�r|�updaterirr~Z
set_tunnelryr�r�rIr�rq�getresponser�Zsockr�rH�reasonr�)
r�Z
http_classr�Zhttp_conn_argsrzr�Ztunnel_headersZproxy_auth_hdr�errr$rLr�rMr�!sB
�


zAbstractHTTPHandler.do_openN)r)r�r�r�r�r�r�r�r�rLrLrLrMr��s

&r�c@seZdZdd�ZejZdS)r)cCs|�tjj|�SrN)r�r�r�r��r�r�rLrLrM�	http_openfszHTTPHandler.http_openN)r�r�r�r�r�r�rerLrLrLrMr)dsr�c@s$eZdZddd�Zdd�ZejZdS)rErNcCst�||�||_||_dSrN)r�r��_context�_check_hostname)r�r�r>�check_hostnamerLrLrMr�oszHTTPSHandler.__init__cCs|jtjj||j|jd�S)N)r>r�)r�r�r�r�r�r�r�rLrLrM�
https_opents�zHTTPSHandler.https_open)rNN)r�r�r�r�r�r�r�rirLrLrLrMrEms
rEc@s.eZdZddd�Zdd�Zdd�ZeZeZdS)	rNcCs$ddl}|dkr|j��}||_dSro)Zhttp.cookiejar�	cookiejarZ	CookieJar)r�r�r�rLrLrMr�}s
zHTTPCookieProcessor.__init__cCs|j�|�|SrN)r�Zadd_cookie_headerr�rLrLrMre�sz HTTPCookieProcessor.http_requestcCs|j�||�|SrN)r�Zextract_cookies)r�ryr�rLrLrMr��sz!HTTPCookieProcessor.http_response)N)r�r�r�r�rer�rir�rLrLrLrMr|s

c@seZdZdd�ZdS)r.cCs|j}td|��dS)Nzunknown url type: %s)r�r)r�r�r�rLrLrMr��szUnknownHandler.unknown_openN)r�r�r�r�rLrLrLrMr.�scCsNi}|D]@}|�dd�\}}|ddkr@|ddkr@|dd�}|||<q|S)N�=rVrrQrS)rX)�lZparsedZeltr�rrLrLrMrv�s
rvcCs�g}d}d}}|D]l}|r*||7}d}q|rT|dkr>d}qn|dkrJd}||7}q|dkrl|�|�d}q|dkrxd}||7}q|r�|�|�dd�|D�S)	NrrF�\TrQr�cSsg|]}|���qSrL)rd)r��partrLrLrM�
<listcomp>�sz#parse_http_list.<locals>.<listcomp>)ra)r��resr��escaper	ZcurrLrLrMrx�s4	


rxc@s(eZdZdd�ZdZdd�Zdd�ZdS)r*cCs\|j}|dd�dkrN|dd�dkrN|jrN|jdkrN|j|��krXtd��n
|�|�SdS)Nr:rrSr
�	localhost�-file:// scheme is supported only on localhost)r�rz�	get_namesr�open_local_file)r�r�rHrLrLrM�	file_open�s&�
zFileHandler.file_openNcCs`tjdkrZz*tt�d�dt�t���d�t_Wn$tjk
rXt�d�ft_YnXtjS)Nr�r:)r*�namesr8r��gethostbyname_ex�gethostname�gaierror�
gethostbynamer�rLrLrMr��s
��
zFileHandler.get_namesc
Cs�ddl}ddl}|j}|j}t|�}z�t�|�}|j}|jj	|j
dd�}	|�|�d}
|�d|
pbd||	f�}|r~t
|�\}}|r�|s�t|�|��kr�|r�d||}
nd|}
tt|d�||
�WSWn*tk
r�}zt|��W5d}~XYnXtd��dS)	NrT�Zusegmtz6Content-type: %s
Content-length: %d
Last-modified: %s
�
text/plain�file://�rbzfile not on local host)�email.utils�	mimetypesrzr�r4r[�stat�st_size�utils�
formatdate�st_mtime�
guess_type�message_from_stringr
�_safe_gethostbynamer�rrGrqr)r�r��emailr�rzrfZ	localfile�statsrm�modified�mtyperirCZorigurl�exprLrLrMr��s:
����zFileHandler.open_local_file)r�r�r�r�r�r�r�rLrLrLrMr*�s
cCs*zt�|�WStjk
r$YdSXdSrN)r�r�r�)rzrLrLrMr��sr�c@seZdZdd�Zdd�ZdS)r+c
Cs*ddl}ddl}|j}|s"td��t|�\}}|dkr>|j}nt|�}t|�\}}|rdt|�\}}nd}t	|�}|pvd}|p~d}zt
�|�}Wn*tk
r�}zt|��W5d}~XYnXt
|j�\}	}
|	�d�}ttt	|��}|dd�|d}}|�r|d�s|dd�}z�|�||||||j�}
|�r6d�p8d}|
D]2}t|�\}}|��d	k�r>|d
k�r>|��}�q>|
�||�\}}d}|�|j�d}|�r�|d|7}|dk	�r�|dk�r�|d|7}t�|�}t|||j�WS|jk
�r$}z"td
|�}|�t� �d��W5d}~XYnXdS)Nr�ftp error: no host givenrrr
rSrVrh�Dr���a�Ar�rhr�r�zContent-type: %s
zContent-length: %d
�
ftp error: %rr:)!�ftplibr�rzrr
�FTP_PORTrbrrr
r�r�rqrr�rXr��map�connect_ftprJrrx�upper�retrfiler�rtr�r�r�
all_errors�with_tracebackr��exc_info)r�r�r�r�rzrCr r1r�r\�attrs�dirsrO�fwr��attrr�rh�retrlenrir�r��excrLrLrM�ftp_opens^
�
zFTPHandler.ftp_openc	Cst||||||dd�S)NF)�
persistent)�
ftpwrapper)r�r r1rzrCr�rJrLrLrMr�7s�zFTPHandler.connect_ftpN)r�r�r�r�r�rLrLrLrMr+s5c@s<eZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
S)r,cCs"i|_i|_d|_d|_d|_dS)Nr�<r})�cacherJ�soonest�delay�	max_connsr�rLrLrMr�>s
zCacheFTPHandler.__init__cCs
||_dSrN)r�)r��trLrLrM�
setTimeoutEszCacheFTPHandler.setTimeoutcCs
||_dSrN)r�)r�rrLrLrM�setMaxConnsHszCacheFTPHandler.setMaxConnscCsr|||d�|�|f}||jkr4t��|j|j|<n,t||||||�|j|<t��|j|j|<|��|j|S)Nr
)�joinr�r~r�rJr��check_cache)r�r r1rzrCr�rJr�rLrLrMr�Ks

�
zCacheFTPHandler.connect_ftpcCs�t��}|j|krPt|j���D].\}}||kr |j|��|j|=|j|=q tt|j����|_t	|j�|j
kr�t|j���D]&\}}||jkr�|j|=|j|=q�q�tt|j����|_dSrN)r~r�r�rJrr�r��min�valuesrdr�)r�r�r�rrLrLrMr�Vs


zCacheFTPHandler.check_cachecCs0|j��D]}|��q
|j��|j��dSrN)r�r�r��clearrJ)r��connrLrLrM�clear_cachejs

zCacheFTPHandler.clear_cacheN)	r�r�r�r�r�r�r�r�rrLrLrLrMr,;sc@seZdZdd�ZdS)r-cCs~|j}|�dd�\}}|�dd�\}}t|�}|�d�rNt�|�}|dd�}|sVd}t�d|t|�f�}t	t
�|�||�S)N�:rVr�z;base64i�����text/plain;charset=US-ASCIIz$Content-type: %s
Content-length: %d
)rtrXr�endswithr-�decodebytesr�r�rdr�io�BytesIO)r�r�rHrrIZ	mediatyperirLrLrM�	data_openqs



�zDataHandler.data_openN)r�r�r�r	rLrLrLrMr-psr��nt)r4r3cCst|�SrN)r
��pathnamerLrLrMr4�scCst|�SrN)r	rrLrLrMr3�sc@s�eZdZdZdeZd)dd�Zdd�Zdd�Zd	d
�Z	dd�Z
d*d
d�Zd+dd�Zd,dd�Z
d-dd�Zdd�Zd.dd�Zd/dd�Zdd�Zer�dd�Zd0dd �Zd!d"�Zd#d$�Zd%d&�Zd1d'd(�ZdS)2r8Nr�cKszdd|jji}tj|tdd�|dkr.t�}||_|�d�|_|�d�|_	d|j
fdg|_g|_t
j|_d|_t|_dS)	NzW%(class)s style of invoking requests is deprecated. Use newer urlopen functions/methods�classrS)�
stacklevel�key_file�	cert_filez
User-Agent)ZAcceptz*/*)rLr�r?r@rAr5r&r�rr�versionr��_URLopener__tempfilesr[rp�_URLopener__unlink�	tempcache�ftpcache)r�r&Zx509r�rLrLrMr��s
�zURLopener.__init__cCs|��dSrN)r�r�rLrLrM�__del__�szURLopener.__del__cCs|��dSrN)�cleanupr�rLrLrMr��szURLopener.closec	CsV|jrB|jD](}z|�|�Wqtk
r2YqXq|jdd�=|jrR|j��dSrN)rrrqrr)r�rOrLrLrMr�s
zURLopener.cleanupcGs|j�|�dSrN)r�ra)r�r�rLrLrM�	addheader�szURLopener.addheaderc
Csptt|��}t|dd�}|jrL||jkrL|j|\}}t|d�}t|||�St|�\}}|s`d}||jkr�|j|}t|�\}}	t|	�\}
}|
|f}nd}d|}||_	|�
dd�}t||�r�|dkr�|r�|�|||�S|�
||�Sz0|dk�rt||�|�WSt||�||�WSWnVttfk
�r0�Yn<tk
�rj}
ztd	|
��t��d
��W5d}
~
XYnXdS)Nz%/:=&?~#+!$,;'@()*[]|�rr�rOZopen_�-r�r�zsocket errorr:)rrr	rrGrrr&rr�rr��open_unknown_proxy�open_unknownr�rrrqr�r�r�)r�r�rIrfrirh�urltyperHr�	proxyhostrzr�r_r�rLrLrMrG�s<




zURLopener.opencCst|�\}}tdd|��dS)N�	url errorzunknown url type�rrq)r�r�rIr�rHrLrLrMr
szURLopener.open_unknowncCs t|�\}}tdd||��dS)Nrzinvalid proxy for %sr )r�rr�rIr�rHrLrLrMrszURLopener.open_unknown_proxyc
Cstt|��}|jr&||jkr&|j|St|�\}}|dkr�|rF|dkr�z0|�|�}|��}|��tt|�d�|fWSt	k
r�}	zW5d}	~	XYnX|�
||�}�z<|��}
|r�t
|d�}nrt|�\}}
t|
p�d�\}}
t|
p�d�\}
}t|
p�d�\}
}t
j�|
�d}t�|�\}}|j�|�t
�|d�}z�||
f}|jdk	�rT||j|<d}d}d}d}d|
k�rzt|
d	�}|�r�||||�|�|�}|�s��q�|t|�7}|�|�|d7}|�r�||||��q�W5|��XW5|��X|dk�r||k�rtd
||f|��|S)NrOrVrPrrrRrSrrTrUrW)rrrrr�rZr�r4rrqrGrrr[r\�splitextr^Zmkstemprra�fdopenrbrcrdrer)r�rHrfrgrIr�Zurl1rhr�r�rirjZgarbager\�suffix�fdrkrlrmrcrnrorLrLrM�retrievesn






��zURLopener.retrievecCs$d}d}t|t�r<t|�\}}|r6t|�\}}t|�}|}nt|\}}t|�\}}t|�\}	}
|
}d}|	��dkrvd}n:t|
�\}}
|r�t|�\}}|r�d|	||
f}t|�r�|}|s�tdd��|r�t|�}t	�
|����d�}nd}|�rt|�}t	�
|����d�}nd}||�}
i}|�r*d||d<|�r<d||d<|�rJ||d	<d
|d<|j
D]\}}|||<�qX|dk	�r�d|d
<|
�d|||�n|
jd||d�z|
��}Wn"tjjk
�r�td��YnXd|jk�r�dk�rnnt||jd||j�S|�||j|j|j|j|�SdS)Nr�z	%s://%s%sz
http errorr�r)zBasic %sr�rcrsr�r�r�zContent-Typer�r�r�z$http protocol error: bad status liner�r��http:)r�r�rrr
rrxr,rqr-r.r/r0r�ryr�r�r�Z
BadStatusLinerZstatusrr��
http_errorrhr�)r�Zconnection_factoryrHrIZuser_passwdZproxy_passwdrzr�Zrealhostrr�Z
proxy_authrbZ	http_connrirYr�r�rLrLrM�_open_generic_httpVs~



��zURLopener._open_generic_httpcCs|�tjj||�SrN)r(r�r�r��r�rHrIrLrLrM�	open_http�szURLopener.open_httpc
Csbd|}t||�rPt||�}|dkr6||||||�}	n|||||||�}	|	rP|	S|�|||||�S)Nz
http_error_%d)r�r�r�)
r�rHrh�errcode�errmsgrirIr_r�rkrLrLrMr'�s

zURLopener.http_errorcCs|��t||||d��dSrN)r�r�r�rHrhr+r,rirLrLrMr��szURLopener.http_error_defaultcCstjj||j|jd�S)N)rr)r�r�r�rr)r�rzrLrLrM�_https_connection�s�zURLopener._https_connectioncCs|�|j||�SrN)r(r.r)rLrLrM�
open_https�szURLopener.open_httpscCs^t|t�std��|dd�dkrP|dd�dkrP|dd���dkrPtd��n
|�|�SdS)	NzEfile error: proxy support for file protocol currently not implementedr:rrSr
�z
localhost/r�)r�r�rrxrBr�r�rLrLrM�	open_file�s

4
zURLopener.open_filec
Cs\ddl}ddl}t|�\}}t|�}zt�|�}Wn0tk
rb}zt|j|j	��W5d}~XYnX|j
}	|jj|j
dd�}
|�|�d}|�d|p�d|	|
f�}|s�|}
|dd�dkr�d|}
tt|d	�||
�St|�\}}|�sPt�|�t�ft�k�rP|}
|dd�dk�r d|}
n|dd
�dk�r>td|��tt|d	�||
�Std
��dS)NrTr�z6Content-Type: %s
Content-Length: %d
Last-modified: %s
r�rVr
r�r�r:z./zAlocal file url may start with / or file:. Unknown url of type: %sz#local file error: not on local host)r�r�rr4r[r�rqr�strerrorrfr�r�r�r�r�r�rrGr
r�r�r��thishostrB)r�rHr�r�rzrOZ	localnamer��ermr�r�riZurlfilerCrLrLrMr��s@ ���
zURLopener.open_local_filec
Cs�t|t�std��ddl}t|�\}}|s2td��t|�\}}t|�\}}|r\t|�\}}nd}t|�}t|ppd�}t|p|d�}t	�
|�}|s�ddl}|j}nt
|�}t|�\}}	t|�}|�d�}
|
dd�|
d}
}|
r�|
ds�|
dd�}
|
�r
|
d�s
d|
d<|||d�|
�f}t|j�tk�rbt|j�D]*}
|
|k�r6|j|
}|j|
=|���q6z�||jk�r�t|||||
�|j|<|�s�d}nd	}|	D]2}t|�\}}|��d
k�r�|dk�r�|��}�q�|j|�||�\}}|�d|�d}d}|�r|d
|7}|dk	�r,|dk�r,|d|7}t�|�}t||d|�WSt�k
�r�}ztd|�� t!�"�d��W5d}~XYnXdS)NzCftp error: proxy support for ftp protocol currently not implementedrr�rrr
rSrVr�rhr�r�zftp:zContent-Type: %s
zContent-Length: %d
zftp error %rr:)#r�r�rr�rr
rrr
r�r�r�r�rbrrXr�rdr�MAXFTPCACHEr�r�r�rrxr�r�r�r�r�r�	ftperrorsr�r�r�)r�rHr�rzr\rCr r1r�r�r�rOr�r�rr�r�r�rhr�r�rir�rLrLrM�open_ftp�st




��
zURLopener.open_ftpc	
Cs<t|t�std��z|�dd�\}}Wntk
rDtdd��YnX|sNd}|�d�}|dkr�d	||d�kr�||dd�}|d|�}nd
}g}|�dt�	dt�
t�����|�d
|�|dkr�t�|�
d���d�}nt|�}|�dt|��|�d
�|�|�d�|�}t�|�}t�|�}t|||�S)NzEdata error: proxy support for data protocol currently not implementedr�rVz
data errorzbad data URLr�;rr�rrzDate: %sz%a, %d %b %Y %H:%M:%S GMTzContent-type: %sr-r)zlatin-1zContent-Length: %d�
)r�r�rrXrBrq�rfindrar~�strftime�gmtimer-rr/r0r
rdr�r�r�r�StringIOr)	r�rHrIr�Zsemirr�ri�frLrLrM�	open_data8s8

�




zURLopener.open_data)N)N)N)N)NNN)N)N)N)N)r�r�r�rr�rr�rr�rrrGrrr%r(r*r'r�rCr.r/r1r�r7r?rLrLrLrMr8�s,

$


A\


	 :c@s�eZdZdd�Zdd�Zd"dd�Zdd	�Zd#d
d�Zd$dd
�Zd%dd�Z	d&dd�Z
d'dd�Zd(dd�Zd)dd�Z
d*dd�Zd+dd�Zd,dd�Zd d!�ZdS)-r9cOs(tj|f|�|�i|_d|_d|_dS)Nrr�)r8r��
auth_cache�tries�maxtriesrIrLrLrMr�eszFancyURLopener.__init__cCst||d||�S)Nr&)rr-rLrLrMr�ksz!FancyURLopener.http_error_defaultNc	Csv|jd7_zZ|jrN|j|jkrNt|d�r4|j}n|j}|||dd|�W�S|�||||||�}|W�Sd|_XdS)NrVr�http_error_500r�z)Internal Server Error: Redirect Recursion)rArBr�rCr��redirect_internal)	r�rHrhr+r,rirIr�rkrLrLrMros 
��zFancyURLopener.http_error_302c	Csxd|kr|d}nd|kr$|d}ndS|��t|jd||�}t|�}|jdkrnt|||d|||��|�|�S)Nrrrrz( Redirection to url '%s' is not allowed.)r�rr�rrrrG)	r�rHrhr+r,rirIrrrLrLrMrD�s"


��z FancyURLopener.redirect_internalcCs|�||||||�SrN�r�r�rHrhr+r,rirIrLrLrMr�szFancyURLopener.http_error_301cCs|�||||||�SrNrErFrLrLrMr�szFancyURLopener.http_error_303cCs2|dkr|�||||||�S|�|||||�SdSrN)rr�rFrLrLrMr�szFancyURLopener.http_error_307Fc
Cs�d|krt�||||||�|d}t�d|�}	|	sHt�||||||�|	��\}
}|
��dkrtt�||||||�|s�t�||||||�d|jd}|dkr�t||�||�St||�|||�SdS)Nrj�![ 	]*([^ 	]+)[ 	]+realm="([^"]*)"r[Zretry_�_basic_auth�r8r�rf�matchrVrxr�r��
r�rHrhr+r,rirIr�ZstuffrJrr9r_rLrLrMrk�s:
�
�
��zFancyURLopener.http_error_401c
Cs�d|krt�||||||�|d}t�d|�}	|	sHt�||||||�|	��\}
}|
��dkrtt�||||||�|s�t�||||||�d|jd}|dkr�t||�||�St||�|||�SdS)NrmrGr[Zretry_proxy_rHrIrKrLrLrMrn�s:
�
�
��zFancyURLopener.http_error_407cCs�t|�\}}d||}|jd}t|�\}}	t|	�\}	}
|	�d�d}|	|d�}	|�|	||�\}}
|sr|
srdSdt|dd�t|
dd�|	f}	d|	|
|jd<|dkr�|�|�S|�||�SdS)N�http://r�rrV�%s:%s@%srrr�rr&rr��get_user_passwdr	rG�r�rHr9rIrzr�rrrrZ
proxyselectorr�r r1rLrLrM�retry_proxy_http_basic_auth�s$

�
z*FancyURLopener.retry_proxy_http_basic_authcCs�t|�\}}d||}|jd}t|�\}}	t|	�\}	}
|	�d�d}|	|d�}	|�|	||�\}}
|sr|
srdSdt|dd�t|
dd�|	f}	d|	|
|jd<|dkr�|�|�S|�||�SdS)N�https://r�rrVrMrrrrNrPrLrLrM�retry_proxy_https_basic_auth�s$

�
z+FancyURLopener.retry_proxy_https_basic_authc
Cs�t|�\}}|�d�d}||d�}|�|||�\}}|sD|sDdSdt|dd�t|dd�|f}d||}	|dkr�|�|	�S|�|	|�SdS)NrrVrMrrrrL�rr�rOr	rG�
r�rHr9rIrzr�r�r r1rrLrLrMr\	s
�
z$FancyURLopener.retry_http_basic_authc
Cs�t|�\}}|�d�d}||d�}|�|||�\}}|sD|sDdSdt|dd�t|dd�|f}d||}	|dkr�|�|	�S|�|	|�SdS)NrrVrMrrrrRrTrUrLrLrM�retry_https_basic_auth	s
�
z%FancyURLopener.retry_https_basic_authrcCs`|d|��}||jkr2|r(|j|=n
|j|S|�||�\}}|sJ|rX||f|j|<||fS)Nr)rxr@�prompt_user_passwd)r�rzr9rr�r r1rLrLrMrO	s


zFancyURLopener.get_user_passwdcCsXddl}z.td||f�}|�d|||f�}||fWStk
rRt�YdSXdS)NrzEnter username for %s at %s: z#Enter password for %s in %s at %s: r<)�getpass�input�KeyboardInterrupt�print)r�rzr9rXr r1rLrLrMrW)	s�
z!FancyURLopener.prompt_user_passwd)N)N)N)N)NF)NF)N)N)N)N)r)r�r�r�r�r�rrDrrrrkrnrQrSr\rVrOrWrLrLrLrMr9bs&



�
�





cCstdkrt�d�atS)Nr�)�
_localhostr�r�rLrLrLrMr�9	s
r�cCsPtdkrLztt�t���d�aWn(tjk
rJtt�d�d�aYnXtS)Nr:r�)�	_thishostr8r�r�r�r�rLrLrLrMr3A	sr3cCstdkrddl}|jatSro)�
_ftperrorsr�r�)r�rLrLrMr6L	sr6cCstdkrt�d�atSr�)�
_noheadersr�r�rLrLrLrM�	noheadersU	s
r`c@sFeZdZddd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Zdd�Z	dS)r�NTcCsX||_||_||_||_||_||_d|_||_z|��Wn|�	��YnXdSro)
r r1rzrCr�rJ�refcount�	keepalive�initr�)r�r r1rzrCr�rJr�rLrLrMr�b	szftpwrapper.__init__cCs\ddl}d|_|��|_|j�|j|j|j�|j�|j	|j
�d�|j�}|j�
|�dS)Nrr
)r��busyZFTPr	ZconnectrzrCrJZloginr r1r�r��cwd)r�r�Z_targetrLrLrMrcr	s
zftpwrapper.initc
Cs�ddl}|��|dkr"d}d}nd|}d}z|j�|�Wn*|jk
rh|��|j�|�YnXd}|r�|s�zd|}|j�|�\}}WnR|jk
r�}z2t|�dd�dkr�t	d	|��
t��d
��W5d}~XYnX|�s�|j�d�|�rl|j�
�}	zJz|j�|�Wn4|jk
�rN}zt	d	|�|�W5d}~XYnXW5|j�|	�Xd|}nd}|j�|�\}}d|_t|�d
�|j�}
|jd7_|��|
|fS)Nr)r�r�zTYPE ArVzTYPE zRETR rSZ550r�r:zLIST ZLISTr�)r��endtransferr	Zvoidcmdr�rcZntransfercmdZ
error_permr�rr�r�r��pwdrerdrZmakefile�
file_closerar�)r�rOr�r��cmd�isdirrr�r�rgZftpobjrLrLrMr�{	sP
�
$
zftpwrapper.retrfilecCs
d|_dSro)rdr�rLrLrMrf�	szftpwrapper.endtransfercCsd|_|jdkr|��dS)NFr)rbra�
real_closer�rLrLrMr��	s
zftpwrapper.closecCs2|��|jd8_|jdkr.|js.|��dS)NrVr)rfrarbrkr�rLrLrMrh�	szftpwrapper.file_closecCs2|��z|j��Wnt�k
r,YnXdSrN)rfr	r�r6r�rLrLrMrk�	s
zftpwrapper.real_close)NT)
r�r�r�r�rcr�rfr�rhrkrLrLrLrMr�_	s�
	-r�cCs�i}tj��D]4\}}|��}|r|dd�dkr|||dd�<qdtjkrZ|�dd�tj��D]J\}}|dd�dkrd|��}|r�|||dd�<qd|�|dd�d�qd|S)Ni�����_proxyZREQUEST_METHODr�)r[�environrrxr�)r&r_r�rLrLrM�getproxies_environment�	s	
rncCs�|dkrt�}z|d}Wntk
r0YdSX|dkr>dS|��}t|�\}}|�d�D]Z}|��}|r\|�d�}|��}||ks�||kr�dSd|}|�|�s�|�|�r\dSq\dS)NZnoF�*Tr��.)rnr�rxr
rXrd�lstripr)rzr&Zno_proxy�hostonlyrCr_rLrLrM�proxy_bypass_environment�	s*
rsc	Cs0ddlm}t|�\}}dd�}d|kr4|dr4dSd}|�dd	�D]�}|sNqDt�d
|�}|dk	�r|dkr�zt�|�}||�}Wntk
r�YqDYnX||�d��}	|�d�}
|
dkr�d
|�d��	d�d}
nt
|
dd��}
|
dksD|
dkr�qDd|
}
||
?|	|
?k�r*dSqD|||�rDdSqDdS)Nr)�fnmatchcSsh|�d�}ttt|��}t|�dkr<|ddddgdd�}|dd>|dd>B|dd>B|d	BS)
Nrpr�r�rVr}r:r|rS)rXr�r�rbrd)ZipAddrrBrLrLrM�ip2num
s

z,_proxy_bypass_macosx_sysconf.<locals>.ip2numrpZexclude_simpleT�
exceptionsrLz(\d+(?:\.\d+)*)(/\d+)?rVr:r|� F)rtr
r�rfrJr�r�rq�group�countrb)rz�proxy_settingsrtrrrCrvZhostIPr�rrD�maskrLrLrM�_proxy_bypass_macosx_sysconf
s>




r}�darwin)�_get_proxy_settings�_get_proxiescCst�}t||�SrN)rr})rzr{rLrLrM�proxy_bypass_macosx_sysconfF
sr�cCst�SrN)r�rLrLrLrM�getproxies_macosx_sysconfJ
sr�cCs t�}|rt||�St|�SdSrN)rnrsr��rzr&rLrLrMr,T
s
r,cCst�p
t�SrN)rnr�rLrLrLrMr5a
sc
Csi}zddl}Wntk
r(|YSXz�|�|jd�}|�|d�d}|r�t|�|d�d�}d|kr�|�d�D]4}|�dd�\}}t�d|�s�d	||f}|||<qtn>|dd
�dkr�||d<n$d
||d<d||d<d||d<|�	�Wnt
ttfk
�rYnX|S)Nr�;Software\Microsoft\Windows\CurrentVersion\Internet Settings�ProxyEnableZProxyServerr�r8rVz
(?:[^/:]+)://z%s://%srtr&r�z	http://%sz
https://%sr�zftp://%sr	)
�winreg�ImportError�OpenKey�HKEY_CURRENT_USER�QueryValueExr�rXrfrJZCloserqrBr�)r&r��internetSettings�proxyEnableZproxyServer�pr�ZaddressrLrLrM�getproxies_registryf
sF
�����
r�cCst�p
t�SrN)rnr�rLrLrLrMr5�
scCs|zddl}Wntk
r"YdSXz6|�|jd�}|�|d�d}t|�|d�d�}Wntk
rpYdSX|rz|s~dSt|�\}}|g}z t�	|�}||kr�|�
|�Wntk
r�YnXz t�|�}||kr�|�
|�Wntk
�r�YnX|�d�}|D]j}	|	dk�r*d|k�r*dS|	�
dd	�}	|	�
d
d�}	|	�
dd�}	|D] }
t�|	|
tj��rRdS�qR�qdS)
Nrr�r�Z
ProxyOverrider8z<local>rprVz\.roz.*�?)r�r�r�r�r�r�rqr
r�r�raZgetfqdnrXrrfrJrh)rzr�r�r�Z
proxyOverrideZrawHostrCZaddrZfqdnrEr�rLrLrM�proxy_bypass_registry�
s`�����





r�cCs t�}|rt||�St|�SdSrN)rnrsr�r�rLrLrMr,�
s
)NNN)N)}r-r�r�r�Zhttp.clientr�rr[�	posixpathrfr�rr�r~r^rXr?Zurllib.errorrrrZurllib.parserrrrr	r
rrr
rrrrrrrrrZurllib.responserrrDr�rC�__all__�version_infor�rFr�r0r1r`r6r7rg�ASCIIrvr{rrr2rr/rrr"rr r!r"r#r$r%�urandomr�r&r'r(r�r)r�r�rErarr.rvrxr*r�r+r,r-r5r_Z
nturl2pathr4r3rr8r9r\r�r]r3r^r6r_r`r�rnrsr}�platformZ_scproxyrr�r�r�r,r5r�r�rLrLrLrM�<module>TsP
��U
?m$q!+@
ov

+3:5!@W

_
%A

-	2
response.cpython-38.pyc000064400000006333151733313270011044 0ustar00U

e5d��@s^dZddlZddddgZGdd�dej�ZGdd�de�ZGd	d�de�ZGd
d�de�ZdS)aResponse classes used by urllib.

The base class, addbase, defines a minimal file-like interface,
including read() and readline().  The typical response object is an
addinfourl instance, which defines an info() method that returns
headers and a geturl() method that returns the url.
�N�addbase�addclosehook�addinfo�
addinfourlcs8eZdZdZ�fdd�Zdd�Zdd�Zdd	�Z�ZS)
rzOBase class for addinfo and addclosehook. Is a good idea for garbage collection.cs tt|�j|ddd�||_dS)Nz<urllib response>F)�delete)�superr�__init__�fp)�selfr	��	__class__��'/usr/lib64/python3.8/urllib/response.pyrszaddbase.__init__cCsd|jjt|�|jfS)Nz<%s at %r whose fp = %r>)r�__name__�id�file�r
r
r
r�__repr__s�zaddbase.__repr__cCs|jjrtd��|S)NzI/O operation on closed file)r	�closed�
ValueErrorrr
r
r�	__enter__szaddbase.__enter__cCs|��dS�N)�close)r
�type�value�	tracebackr
r
r�__exit__!szaddbase.__exit__)	r�
__module__�__qualname__�__doc__rrrr�
__classcell__r
r
rrrs
cs,eZdZdZ�fdd�Z�fdd�Z�ZS)rz*Class to add a close hook to an open file.cs tt|��|�||_||_dSr)rrr�	closehook�hookargs)r
r	r!r"rr
rr(szaddclosehook.__init__c	s>z(|j}|j}|r&d|_d|_||�W5tt|���XdSr)rrrr!r")r
r!r"rr
rr-szaddclosehook.close)rrrrrrr r
r
rrr%scs(eZdZdZ�fdd�Zdd�Z�ZS)rz.class to add an info() method to an open file.cstt|��|�||_dSr)rrr�headers)r
r	r#rr
rr<szaddinfo.__init__cCs|jSr)r#rr
r
r�info@szaddinfo.info)rrrrrr$r r
r
rrr9scs2eZdZdZd	�fdd�	Zdd�Zdd�Z�ZS)
rz9class to add info() and geturl() methods to an open file.Ncs"tt|��||�||_||_dSr)rrr�url�code)r
r	r#r%r&rr
rrGszaddinfourl.__init__cCs|jSr)r&rr
r
r�getcodeLszaddinfourl.getcodecCs|jSr)r%rr
r
r�geturlOszaddinfourl.geturl)N)rrrrrr'r(r r
r
rrrDs)rZtempfile�__all__Z_TemporaryFileWrapperrrrrr
r
r
r�<module>srequest.cpython-38.opt-1.pyc000064400000215451151733313270011640 0ustar00U

e5d���!@s�dZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddl
Z
ddlZddlZddlZddlZddlmZmZmZddlmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(ddl)m*Z*m+Z+zddl,Z,Wne-k
�rdZ.YnXdZ.dd	d
ddd
ddddddddddddddddddd d!d"d#d$d%d&d'd(g!Z/d)e
j0dd*�Z1da2dej3fddddd+�d,d�Z4d-d �Z5gZ6d~d.d%�Z7d/d&�Z8e
�9d0e
j:�Z;d1d2�Z<Gd3d�d�Z=Gd4d	�d	�Z>d5d!�Z?Gd6d
�d
�Z@Gd7d�de@�ZAGd8d�de@�ZBGd9d�de@�ZCd:d;�ZDGd<d�de@�ZEGd=d�d�ZFGd>d�deF�ZGGd?d�deG�ZHGd@d�d�ZIGdAd�deIe@�ZJGdBd�deIe@�ZKejLZMGdCd�d�ZNGdDd�de@eN�ZOGdEd�de@eN�ZPGdFdG�dGe@�ZQGdHd�deQ�ZReSejTdI��r*GdJdK�dKeQ�ZUe/�VdK�GdLd
�d
e@�ZWGdMd�de@�ZXdNdO�ZYdPdQ�ZZGdRd�de@�Z[dSdT�Z\GdUd�de@�Z]GdVd�de]�Z^GdWd�de@�Z_dXZ`ejadYk�r�ddZlbmcZcmdZdnd[d#�Zcd\d"�ZdiZeGd]d'�d'�ZfGd^d(�d(ef�Zgdahd_d`�Zidajdadb�Zkdaldcdd�Zmdandedf�ZoGdgdh�dh�Zpdidj�Zqddkdl�Zrdmdn�Zse
jtdok�r�ddplumvZvmwZwdqdr�Zxdsdt�Zydudv�Zzdwd$�Z{n6ejadYk�r�dxdy�Z|dzd$�Z{d{d|�Z}d}dv�ZzneqZ{erZzdS)�a�
An extensible library for opening URLs using a variety of protocols

The simplest way to use this module is to call the urlopen function,
which accepts a string containing a URL or a Request object (described
below).  It opens the URL and returns the results as file-like
object; the returned object has some extra methods described below.

The OpenerDirector manages a collection of Handler objects that do
all the actual work.  Each Handler implements a particular protocol or
option.  The OpenerDirector is a composite object that invokes the
Handlers needed to open the requested URL.  For example, the
HTTPHandler performs HTTP GET and POST requests and deals with
non-error returns.  The HTTPRedirectHandler automatically deals with
HTTP 301, 302, 303 and 307 redirect errors, and the HTTPDigestAuthHandler
deals with digest authentication.

urlopen(url, data=None) -- Basic usage is the same as original
urllib.  pass the url and optionally data to post to an HTTP URL, and
get a file-like object back.  One difference is that you can also pass
a Request instance instead of URL.  Raises a URLError (subclass of
OSError); for HTTP errors, raises an HTTPError, which can also be
treated as a valid response.

build_opener -- Function that creates a new OpenerDirector instance.
Will install the default handlers.  Accepts one or more Handlers as
arguments, either instances or Handler classes that it will
instantiate.  If one of the argument is a subclass of the default
handler, the argument will be installed instead of the default.

install_opener -- Installs a new opener as the default opener.

objects of interest:

OpenerDirector -- Sets up the User Agent as the Python-urllib client and manages
the Handler classes, while dealing with requests and responses.

Request -- An object that encapsulates the state of a request.  The
state can be as simple as the URL.  It can also include extra HTTP
headers, e.g. a User-Agent.

BaseHandler --

internals:
BaseHandler and parent
_call_chain conventions

Example usage:

import urllib.request

# set up authentication info
authinfo = urllib.request.HTTPBasicAuthHandler()
authinfo.add_password(realm='PDQ Application',
                      uri='https://mahler:8092/site-updates.py',
                      user='klem',
                      passwd='geheim$parole')

proxy_support = urllib.request.ProxyHandler({"http" : "http://ahad-haam:3128"})

# build a new opener that adds authentication and caching FTP handlers
opener = urllib.request.build_opener(proxy_support, authinfo,
                                     urllib.request.CacheFTPHandler)

# install it
urllib.request.install_opener(opener)

f = urllib.request.urlopen('http://www.python.org/')
�N)�URLError�	HTTPError�ContentTooShortError)�urlparse�urlsplit�urljoin�unwrap�quote�unquote�
_splittype�
_splithost�
_splitport�
_splituser�_splitpasswd�
_splitattr�_splitquery�_splitvalue�	_splittag�	_to_bytes�unquote_to_bytes�
urlunparse)�
addinfourl�addclosehookFT�Request�OpenerDirector�BaseHandler�HTTPDefaultErrorHandler�HTTPRedirectHandler�HTTPCookieProcessor�ProxyHandler�HTTPPasswordMgr�HTTPPasswordMgrWithDefaultRealm�HTTPPasswordMgrWithPriorAuth�AbstractBasicAuthHandler�HTTPBasicAuthHandler�ProxyBasicAuthHandler�AbstractDigestAuthHandler�HTTPDigestAuthHandler�ProxyDigestAuthHandler�HTTPHandler�FileHandler�
FTPHandler�CacheFTPHandler�DataHandler�UnknownHandler�HTTPErrorProcessor�urlopen�install_opener�build_opener�pathname2url�url2pathname�
getproxies�urlretrieve�
urlcleanup�	URLopener�FancyURLopenerz%d.%d�)�cafile�capath�	cadefault�contextc
Cs�|s|s|rfddl}|�dtd�|dk	r2td��ts>td��tjtjj||d�}t	|d�}t
|�}	n0|r~t	|d�}t
|�}	ntdkr�t
�a}	nt}	|	�|||�S)	a$
Open the URL url, which can be either a string or a Request object.

    *data* must be an object specifying additional data to be sent to
    the server, or None if no such data is needed.  See Request for
    details.

    urllib.request module uses HTTP/1.1 and includes a "Connection:close"
    header in its HTTP requests.

    The optional *timeout* parameter specifies a timeout in seconds for
    blocking operations like the connection attempt (if not specified, the
    global default timeout setting will be used). This only works for HTTP,
    HTTPS and FTP connections.

    If *context* is specified, it must be a ssl.SSLContext instance describing
    the various SSL options. See HTTPSConnection for more details.

    The optional *cafile* and *capath* parameters specify a set of trusted CA
    certificates for HTTPS requests. cafile should point to a single file
    containing a bundle of CA certificates, whereas capath should point to a
    directory of hashed certificate files. More information can be found in
    ssl.SSLContext.load_verify_locations().

    The *cadefault* parameter is ignored.

    This function always returns an object which can work as a context
    manager and has methods such as

    * geturl() - return the URL of the resource retrieved, commonly used to
      determine if a redirect was followed

    * info() - return the meta-information of the page, such as headers, in the
      form of an email.message_from_string() instance (see Quick Reference to
      HTTP Headers)

    * getcode() - return the HTTP status code of the response.  Raises URLError
      on errors.

    For HTTP and HTTPS URLs, this function returns a http.client.HTTPResponse
    object slightly modified. In addition to the three new methods above, the
    msg attribute contains the same information as the reason attribute ---
    the reason phrase returned by the server --- instead of the response
    headers as it is specified in the documentation for HTTPResponse.

    For FTP, file, and data URLs and requests explicitly handled by legacy
    URLopener and FancyURLopener classes, this function returns a
    urllib.response.addinfourl object.

    Note that None may be returned if no handler handles the request (though
    the default installed global OpenerDirector uses UnknownHandler to ensure
    this never happens).

    In addition, if proxy settings are detected (for example, when a *_proxy
    environment variable like http_proxy is set), ProxyHandler is default
    installed and makes sure the requests are handled through the proxy.

    rNzJcafile, capath and cadefault are deprecated, use a custom context instead.r:zDYou can't pass both context and any of cafile, capath, and cadefaultzSSL support not available)r;r<)r>)
�warnings�warn�DeprecationWarning�
ValueError�	_have_ssl�sslZcreate_default_contextZPurposeZSERVER_AUTH�HTTPSHandlerr2�_opener�open)
�url�data�timeoutr;r<r=r>r?Z
https_handler�opener�rL�&/usr/lib64/python3.8/urllib/request.pyr0�s2<��
�



cCs|adS�N)rF)rKrLrLrMr1�sc
Cs:t|�\}}t�t||����}|��}|dkrN|sNtj�|�|fW5QR�S|r^t|d�}nt	j
dd�}|j}t�
|�|��||f}	d}
d}d}d}
d|kr�t|d	�}|r�||
|
|�|�|
�}|s�q�|t|�7}|�|�|
d
7}
|r�||
|
|�q�W5QRXW5QRX|dk�r6||k�r6td||f|	��|	S)aW
    Retrieve a URL into a temporary location on disk.

    Requires a URL argument. If a filename is passed, it is used as
    the temporary file location. The reporthook argument should be
    a callable that accepts a block number, a read size, and the
    total file size of the URL target. The data argument should be
    valid URL encoded data.

    If a filename is passed and the URL points to a local resource,
    the result is a copy from local file to new file.

    Returns a tuple containing the path to the newly created
    data file as well as the resulting HTTPMessage object.
    �file�wbF)�delete� ���r�content-length�Content-Length��1retrieval incomplete: got only %i out of %i bytes)r�
contextlib�closingr0�info�os�path�normpathrG�tempfileZNamedTemporaryFile�name�_url_tempfiles�append�int�read�len�writer)rH�filename�
reporthookrIZurl_typer\�fp�headers�tfp�result�bs�sizerc�blocknum�blockrLrLrMr6�sH


"��c	CsDtD](}zt�|�Wqtk
r*YqXqtdd�=tr@dadS)z0Clean up temporary files from urlretrieve calls.N)r`r[�unlink�OSErrorrF)Z	temp_filerLrLrMr7$s
z:\d+$cCs<|j}t|�d}|dkr&|�dd�}t�d|d�}|��S)z�Return request-host, as defined by RFC 2965.

    Variation from RFC: returned value is lowercased, for convenient
    comparison.

    rV��Host)�full_urlr�
get_header�_cut_port_re�sub�lower)�requestrH�hostrLrLrM�request_host3sr{c@s�eZdZdidddfdd�Zedd��Zejdd��Zejdd��Zed	d
��Zejdd
��Zejdd
��Zd
d�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zd#dd�Zdd �Zd!d"�ZdS)$rNFc	Csl||_i|_i|_d|_||_d|_|��D]\}}|�||�q,|dkrRt|�}||_	||_
|rh||_dSrN)rtri�unredirected_hdrs�_datarI�_tunnel_host�items�
add_headerr{�origin_req_host�unverifiable�method)	�selfrHrIrir�r�r��key�valuerLrLrM�__init__EszRequest.__init__cCs|jrd�|j|j�S|jS)Nz{}#{})�fragment�format�	_full_url�r�rLrLrMrtWszRequest.full_urlcCs(t|�|_t|j�\|_|_|��dSrN)rr�rr��_parse�r�rHrLrLrMrt]s
cCsd|_d|_d|_dS)Nrr)r�r��selectorr�rLrLrMrtdscCs|jSrN)r}r�rLrLrMrIjszRequest.datacCs(||jkr$||_|�d�r$|�d�dS)N�Content-length)r}�
has_header�
remove_header)r�rIrLrLrMrIns

cCs
d|_dSrN)rIr�rLrLrMrIxscCsNt|j�\|_}|jdkr(td|j��t|�\|_|_|jrJt|j�|_dS)Nzunknown url type: %r)	rr��typerBrtrrzr�r
)r��restrLrLrMr�|s
zRequest._parsecCs|jdk	rdnd}t|d|�S)z3Return a string indicating the HTTP request method.N�POST�GETr�)rI�getattr)r�Zdefault_methodrLrLrM�
get_method�szRequest.get_methodcCs|jSrN)rtr�rLrLrM�get_full_url�szRequest.get_full_urlcCs2|jdkr|js|j|_n||_|j|_||_dS)N�https)r�r~rzrtr�)r�rzr�rLrLrM�	set_proxy�s

zRequest.set_proxycCs|j|jkSrN)r�rtr�rLrLrM�	has_proxy�szRequest.has_proxycCs||j|��<dSrN)ri�
capitalize�r�r��valrLrLrMr��szRequest.add_headercCs||j|��<dSrN)r|r�r�rLrLrM�add_unredirected_header�szRequest.add_unredirected_headercCs||jkp||jkSrN)rir|�r��header_namerLrLrMr��s
�zRequest.has_headercCs|j�||j�||��SrN)ri�getr|)r�r��defaultrLrLrMru�s�zRequest.get_headercCs |j�|d�|j�|d�dSrN)ri�popr|r�rLrLrMr��szRequest.remove_headercCs|j|j�}t|���SrN)r|ri�listr)r��hdrsrLrLrM�header_items�szRequest.header_items)N)�__name__�
__module__�__qualname__r��propertyrt�setter�deleterrIr�r�r�r�r�r�r�r�rur�r�rLrLrLrMrCs8�





	

c@sNeZdZdd�Zdd�Zdd�Zdd�Zd	ejfd
d�Z	ddd
�Z
dd�Zd	S)rcCs6dt}d|fg|_g|_i|_i|_i|_i|_dS)N�Python-urllib/%sz
User-agent)�__version__�
addheaders�handlers�handle_open�handle_error�process_response�process_request)r�Zclient_versionrLrLrMr��szOpenerDirector.__init__c	CsTt|d�stdt|���d}t|�D�]}|dkr6q&|�d�}|d|�}||dd�}|�d�r�|�d�|d}||dd�}zt|�}Wntk
r�YnX|j�	|i�}	|	|j|<n>|dkr�|}|j
}	n*|d	kr�|}|j}	n|d
kr&|}|j}	nq&|	�
|g�}
|
�r"t�|
|�n
|
�|�d}q&|�rPt�|j|�|�|�dS)N�
add_parentz%expected BaseHandler instance, got %rF)�redirect_request�do_open�
proxy_open�_rV�errorrG�responseryT)�hasattr�	TypeErrorr��dir�find�
startswithrbrBr�r�r�r�r��
setdefault�bisectZinsortrar�r�)r��handlerZadded�meth�i�protocolZ	condition�j�kind�lookupr�rLrLrM�add_handler�sL
�


zOpenerDirector.add_handlercCsdSrNrLr�rLrLrM�close�szOpenerDirector.closec	Gs<|�|d�}|D]&}t||�}||�}|dk	r|SqdS)NrL)r�r�)	r��chainr��	meth_name�argsr�r��funcrkrLrLrM�_call_chain�s
zOpenerDirector._call_chainNc
Cs�t|t�rt||�}n|}|dk	r(||_||_|j}|d}|j�|g�D]}t||�}||�}qJt	�
d|j|j|j|�
��|�||�}	|d}|j�|g�D]}t||�}|||	�}	q�|	S)NZ_requestzurllib.RequestZ	_response)�
isinstance�strrrIrJr�r�r�r��sys�auditrtrir��_openr�)
r��fullurlrIrJ�reqr�r�Z	processorr�r�rLrLrMrG�s$



zOpenerDirector.opencCsP|�|jdd|�}|r|S|j}|�|j||d|�}|r>|S|�|jdd|�S)Nr�Zdefault_openr��unknown�unknown_open)r�r�r�)r�r�rIrkr�rLrLrMr�s$
���
�zOpenerDirector._opencGs~|dkr,|jd}|d}d|}d}|}n|j}|d}d}|||f|}|j|�}|r^|S|rz|dd	f|}|j|�SdS)
N��httpr�r�r:z
http_error_%srVZ_errorrr��http_error_default)r�r�)r��protor��dictr�Zhttp_errZ	orig_argsrkrLrLrMr�&s 

zOpenerDirector.error)N)r�r�r�r�r�r�r��socket�_GLOBAL_DEFAULT_TIMEOUTrGr�r�rLrLrLrMr�s/
c	Gs�t�}ttttttttt	g	}t
tjd�r2|�
t�t�}|D]B}|D]8}t|t�rht||�r||�|�qDt||�rD|�|�qDq<|D]}|�|�q�|D]}|�|��q�|D]}t|t�r�|�}|�|�q�|S)a*Create an opener object from a list of handlers.

    The opener will use several default handlers, including support
    for HTTP, FTP and when applicable HTTPS.

    If any of the handlers passed as arguments are subclasses of the
    default handlers, the default handlers will not be used.
    �HTTPSConnection)rrr.r)rrr+r*r/r-r�r��clientrarE�setr�r��
issubclass�add�remover�)r�rKZdefault_classes�skip�klassZcheck�hrLrLrMr2?s8	�




c@s(eZdZdZdd�Zdd�Zdd�ZdS)	r��cCs
||_dSrN)�parent)r�r�rLrLrMr�fszBaseHandler.add_parentcCsdSrNrLr�rLrLrMr�iszBaseHandler.closecCst|d�sdS|j|jkS)N�
handler_orderT)r�r�)r��otherrLrLrM�__lt__ms
zBaseHandler.__lt__N)r�r�r�r�r�r�r�rLrLrLrMrcsc@s eZdZdZdZdd�ZeZdS)r/zProcess HTTP error responses.i�cCsH|j|j|��}}}d|kr,dksDn|j�d|||||�}|S)N���,r�)�code�msgrZr�r�)r�ryr�r�r�r�rLrLrM�
http_responsezs�z HTTPErrorProcessor.http_responseN)r�r�r��__doc__r�r��https_responserLrLrLrMr/vsc@seZdZdd�ZdS)rcCst|j||||��dSrN)rrt)r�r�rhr�r�r�rLrLrMr��sz*HTTPDefaultErrorHandler.http_error_defaultN)r�r�r�r�rLrLrLrMr�sc@s4eZdZdZdZdd�Zdd�ZeZZZ	dZ
dS)	r��
c	st|��}|dkr|dks:|dkr(|dks:t|j||||��|�dd�}d��fdd	�|j��D�}t|||jd
d�S)a�Return a Request or None in response to a redirect.

        This is called by the http_error_30x methods when a
        redirection response is received.  If a redirection should
        take place, return a new Request to allow http_error_30x to
        perform the redirect.  Otherwise, raise HTTPError if no-one
        else should try to handle this url.  Return None if you can't
        but another Handler might.
        )�-�.�/i3)r�ZHEAD)r�r�r�r�� z%20)rTzcontent-typecs"i|]\}}|���kr||�qSrL)rx��.0�k�v�ZCONTENT_HEADERSrLrM�
<dictcomp>�s�z8HTTPRedirectHandler.redirect_request.<locals>.<dictcomp>T)rir�r�)r�rrt�replacerirrr�)	r�r�rhr�r�ri�newurl�mZ
newheadersrLrrMr��s
���z$HTTPRedirectHandler.redirect_requestc
CsLd|kr|d}nd|kr$|d}ndSt|�}|jdkrRt||d||f||��|jsn|jrnt|�}d|d<t|�}t|dtj	d�}t
|j|�}|�||||||�}|dkr�dSt
|d	��r|j}	|_|	�|d
�|jks�t|	�|jk�rt|j||j|||��ni}	|_|_|	�|d
�d|	|<|��|��|jj||jd�S)
N�location�uri�r�r��ftprrz+%s - Redirection to url '%s' is not allowed�/r:z
iso-8859-1)�encoding�safe�
redirect_dictrrV�rJ)r�schemerr\Znetlocr�rr	�stringZpunctuationrrtr�r�r
r��max_repeatsrd�max_redirections�inf_msgrcr�r�rGrJ)
r�r�rhr�r�rir�urlparts�newZvisitedrLrLrM�http_error_302�sT



����z"HTTPRedirectHandler.http_error_302zoThe HTTP server returned a redirect error that would lead to an infinite loop.
The last 30x error message was:
N)r�r�r�rrr�r�http_error_301�http_error_303�http_error_307rrLrLrLrMr�s&<c
Cs�t|�\}}|�d�s d}|}nZ|�d�s6td|��d|krV|�d�}|�d|�}n|�dd�}|dkrnd}|d|�}t|�\}}|dk	r�t|�\}}	nd}}	|||	|fS)aReturn (scheme, user, password, host/port) given a URL or an authority.

    If a URL is supplied, it must have an authority (host:port) component.
    According to RFC 3986, having an authority component means the URL must
    have two slashes after the scheme.
    r
N�//zproxy URL with no authority: %r�@r:rS)rr�rBr�rr)
�proxyrZr_scheme�	authorityZhost_separator�endZuserinfo�hostport�user�passwordrLrLrM�_parse_proxy�s$


r"c@s"eZdZdZddd�Zdd�ZdS)r�dNcCsP|dkrt�}||_|��D].\}}|��}t|d||||jfdd��qdS)Nz%s_opencSs||||�SrNrL)�rrr�r�rLrLrM�<lambda>)sz'ProxyHandler.__init__.<locals>.<lambda>)r5�proxiesrrx�setattrr�)r�r&r�rHrLrLrMr�!s
�zProxyHandler.__init__cCs�|j}t|�\}}}}|dkr"|}|jr6t|j�r6dS|rv|rvdt|�t|�f}	t�|	����d�}
|�	dd|
�t|�}|�
||�||ks�|dkr�dS|jj||j
d�SdS)N�%s:%s�ascii�Proxy-authorization�Basic r�r)r�r"rz�proxy_bypassr
�base64�	b64encode�encode�decoder�r�r�rGrJ)r�r�rr�Z	orig_typeZ
proxy_typer r!rZ	user_passZcredsrLrLrMr�,s"�zProxyHandler.proxy_open)N)r�r�r�r�r�r�rLrLrLrMrs
c@s6eZdZdd�Zdd�Zdd�Zd
dd	�Zd
d�ZdS)r cCs
i|_dSrN)�passwdr�rLrLrMr�JszHTTPPasswordMgr.__init__cs\t|t�r|g}|�jkr$i�j|<dD].�t��fdd�|D��}||f�j||<q(dS)N�TFc3s|]}��|��VqdSrN)�
reduce_uri)r��u��default_portr�rLrM�	<genexpr>Tsz/HTTPPasswordMgr.add_password.<locals>.<genexpr>)r�r�r1�tuple)r��realmrr r1�reduced_urirLr5rM�add_passwordMs


�zHTTPPasswordMgr.add_passwordc	Cs`|j�|i�}dD]H}|�||�}|��D].\}}|D] }|�||�r6|Sq6q*qdS)Nr2�NN)r1r�r3r�	is_suburi)	r�r9�authuriZdomainsr6�reduced_authuriZurisZauthinforrLrLrM�find_user_passwordXsz"HTTPPasswordMgr.find_user_passwordTc
Cs�t|�}|dr.|d}|d}|dp*d}nd}|}d}t|�\}}|r~|dkr~|dk	r~ddd��|�}	|	dk	r~d	||	f}||fS)
z@Accept authority or URI and extract only the authority and path.rVrr:r
N�Pi�r�z%s:%d)rr
r�)
r�rr6�partsrrr\rz�portZdportrLrLrMr3bs$��zHTTPPasswordMgr.reduce_uricCsN||krdS|d|dkr dS|d}|dd�dkr@|d7}|d�|�S)zcCheck if test is below base in a URI tree

        Both args must be URIs in reduced form.
        TrFrVrSNr
)r�)r��base�test�prefixrLrLrMr=yszHTTPPasswordMgr.is_suburiN)T)r�r�r�r�r;r@r3r=rLrLrLrMr Hs


c@seZdZdd�ZdS)r!cCs0t�|||�\}}|dk	r"||fSt�|d|�SrN)r r@)r�r9r>r r!rLrLrMr@�s�z2HTTPPasswordMgrWithDefaultRealm.find_user_passwordN)r�r�r�r@rLrLrLrMr!�scs<eZdZ�fdd�Zd
�fdd�	Zddd�Zdd	�Z�ZS)r"csi|_t�j||�dSrN)�
authenticated�superr��r�r��kwargs��	__class__rLrMr��sz%HTTPPasswordMgrWithPriorAuth.__init__Fcs<|�||�|dk	r&t��d|||�t��||||�dSrN)�update_authenticatedrHr;)r�r9rr r1�is_authenticatedrKrLrMr;�sz)HTTPPasswordMgrWithPriorAuth.add_passwordcCs>t|t�r|g}dD]$}|D]}|�||�}||j|<qqdS�Nr2)r�r�r3rG)r�rrNr6r4r:rLrLrMrM�s
z1HTTPPasswordMgrWithPriorAuth.update_authenticatedcCsDdD]:}|�||�}|jD]"}|�||�r|j|SqqdSrO)r3rGr=)r�r>r6r?rrLrLrMrN�s

z-HTTPPasswordMgrWithPriorAuth.is_authenticated)F)F)r�r�r�r�r;rMrN�
__classcell__rLrLrKrMr"�s

c@sTeZdZe�dej�Zddd�Zdd�Zdd�Z	d	d
�Z
dd�Zd
d�ZeZ
eZdS)r#z1(?:^|,)[ 	]*([^ 	,]+)[ 	]+realm=(["']?)([^"']*)\2NcCs"|dkrt�}||_|jj|_dSrN)r r1r;)r�Zpassword_mgrrLrLrMr��sz!AbstractBasicAuthHandler.__init__ccspd}tj�|�D]6}|��\}}}|dkr8t�dtd�||fVd}q|sl|r^|��d}nd}|dfVdS)NF)�"�'zBasic Auth Realm was unquoted�Trrr)r#�rx�finditer�groupsr?r@�UserWarning�split)r��headerZfound_challengeZmorr	r9rLrLrM�_parse_realm�s�
z%AbstractBasicAuthHandler._parse_realmc	Cs~|�|�}|sdSd}|D]H}|�|�D]8\}}|��dkrB|}q(|dk	r(|�|||�Sq(q|dk	rztd|f��dS)N�basiczBAbstractBasicAuthHandler does not support the following scheme: %r)Zget_allrZrx�retry_http_basic_authrB)	r��authreqrzr�riZunsupportedrYrr9rLrLrM�http_error_auth_reqed�s
�z.AbstractBasicAuthHandler.http_error_auth_reqedcCs||j�||�\}}|dk	rtd||f}dt�|����d�}|�|jd�|krTdS|�|j|�|j	j
||jd�SdSdS)Nr(r+r)r)r1r@r-r.r/r0ru�auth_headerr�r�rGrJ)r�rzr�r9r �pw�raw�authrLrLrMr\�sz.AbstractBasicAuthHandler.retry_http_basic_authcCstt|jd�r|j�|j�s|S|�d�sp|j�d|j�\}}d�||���}t�	|��
�}|�dd�|����|S)NrN�
Authorizationz{0}:{1}zBasic {})
r�r1rNrtr�r@r�r/r-Zstandard_b64encoder0r��strip)r�r�r r1ZcredentialsZauth_strrLrLrM�http_requests�
�z%AbstractBasicAuthHandler.http_requestcCsLt|jd�rHd|jkr"dkr8nn|j�|jd�n|j�|jd�|S)NrNr�r�TF)r�r1r�rMrt)r�r�r�rLrLrMr�s
z&AbstractBasicAuthHandler.http_response)N)r�r�r��re�compile�IrTr�rZr^r\rer��
https_requestr�rLrLrLrMr#�s�

c@seZdZdZdd�ZdS)r$rccCs|j}|�d|||�}|S)N�www-authenticate)rtr^)r�r�rhr�r�rirHr�rLrLrM�http_error_401$s�z#HTTPBasicAuthHandler.http_error_401N)r�r�r�r_rkrLrLrLrMr$ sc@seZdZdZdd�ZdS)r%r*cCs|j}|�d|||�}|S�N�proxy-authenticate)rzr^)r�r�rhr�r�rirr�rLrLrM�http_error_407/s�z$ProxyBasicAuthHandler.http_error_407N)r�r�r�r_rnrLrLrLrMr%+sc@sNeZdZddd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Zdd�Z	dd�Z
dS)r&NcCs4|dkrt�}||_|jj|_d|_d|_d|_dS�Nr)r r1r;�retried�nonce_count�
last_nonce)r�r1rLrLrMr�Is
z"AbstractDigestAuthHandler.__init__cCs
d|_dSro)rpr�rLrLrM�reset_retry_countRsz+AbstractDigestAuthHandler.reset_retry_countcCs||�|d�}|jdkr*t|jdd|d��n|jd7_|rx|��d}|��dkr`|�||�S|��dkrxtd|��dS)	N�i�zdigest auth failedrVrZdigestr[zEAbstractDigestAuthHandler does not support the following scheme: '%s')r�rprrtrXrx�retry_http_digest_authrB)r�r_rzr�rir]rrLrLrMr^Us

��z/AbstractDigestAuthHandler.http_error_auth_reqedcCsz|�dd�\}}ttdt|���}|�||�}|rvd|}|j�|jd�|krRdS|�|j|�|j	j
||jd�}|SdS)Nr�rVz	Digest %sr)rX�parse_keqv_list�filter�parse_http_list�get_authorizationrir�r_r�r�rGrJ)r�r�rb�tokenZ	challenge�chalZauth_valZresprLrLrMruisz0AbstractDigestAuthHandler.retry_http_digest_authcCs@d|j|t��f}|�d�td�}t�|���}|dd�S)Nz	%s:%s:%s:r)��)rq�time�ctimer/�_randombytes�hashlib�sha1�	hexdigest)r��nonce�s�b�digrLrLrM�
get_cnonceusz$AbstractDigestAuthHandler.get_cnoncecCs�z6|d}|d}|�d�}|�dd�}|�dd�}Wntk
rLYdSX|�|�\}}	|dkrhdS|j�||j�\}
}|
dkr�dS|jdk	r�|�|j|�}nd}d|
||f}
d|��|j	f}|dkr�|	||
�d|||�f�}n~d	|�
d
�k�r\||jk�r|jd7_nd|_||_d|j}|�
|�}d
|||d	||�f}|	||
�|�}ntd|��d|
|||j	|f}|�r�|d|7}|�r�|d|7}|d|7}|�r�|d||f7}|S)Nr9r��qop�	algorithm�MD5�opaquez%s:%s:%sr(rb�,rVz%08xz%s:%s:%s:%s:%szqop '%s' is not supported.z>username="%s", realm="%s", nonce="%s", uri="%s", response="%s"z
, opaque="%s"z
, digest="%s"z, algorithm="%s"z, qop=auth, nc=%s, cnonce="%s")r��KeyError�get_algorithm_implsr1r@rtrI�get_entity_digestr�r�rXrrrqr�r)r�r�r{r9r�r�r�r��H�KDr r`ZentdigZA1ZA2ZrespdigZncvalueZcnonceZnoncebitrDrLrLrMry�s\

�


��z+AbstractDigestAuthHandler.get_authorizationcsD|dkrdd��n|dkr$dd��ntd|���fdd�}�|fS)Nr�cSst�|�d����S�Nr))r�Zmd5r/r���xrLrLrMr%��z?AbstractDigestAuthHandler.get_algorithm_impls.<locals>.<lambda>ZSHAcSst�|�d����Sr�)r�r�r/r�r�rLrLrMr%�r�z.Unsupported digest authentication algorithm %rcs�d||f�S)Nr(rL)r��d�r�rLrMr%�r�)rB)r�r�r�rLr�rMr��s

�z-AbstractDigestAuthHandler.get_algorithm_implscCsdSrNrL)r�rIr{rLrLrMr��sz+AbstractDigestAuthHandler.get_entity_digest)N)r�r�r�r�rsr^rur�ryr�r�rLrLrLrMr&>s
	>
c@s eZdZdZdZdZdd�ZdS)r'z�An authentication protocol defined by RFC 2069

    Digest authentication improves on basic authentication because it
    does not transmit passwords in the clear.
    rc��cCs*t|j�d}|�d|||�}|��|S)NrVrj)rrtr^rs�r�r�rhr�r�rirz�retryrLrLrMrk�s�z$HTTPDigestAuthHandler.http_error_401N)r�r�r�r�r_r�rkrLrLrLrMr'�sc@seZdZdZdZdd�ZdS)r(�Proxy-Authorizationr�cCs"|j}|�d|||�}|��|Srl)rzr^rsr�rLrLrMrn�s�z%ProxyDigestAuthHandler.http_error_407N)r�r�r�r_r�rnrLrLrLrMr(�sc@s6eZdZd
dd�Zdd�Zdd�Zdd	�Zd
d�ZdS)�AbstractHTTPHandlerrcCs
||_dSrN��_debuglevel)r��
debuglevelrLrLrMr��szAbstractHTTPHandler.__init__cCs
||_dSrNr�)r��levelrLrLrM�set_http_debuglevel�sz'AbstractHTTPHandler.set_http_debuglevelcCstjj�|j|���SrN)r�r��HTTPConnection�_get_content_lengthrIr��r�ryrLrLrMr��s�z'AbstractHTTPHandler._get_content_lengthcCs|j}|std��|jdk	r�|j}t|t�r8d}t|��|�d�sN|�dd�|�d�s�|�d�s�|�|�}|dk	r�|�dt|��n|�dd�|}|�	�r�t
|j�\}}t|�\}}	|�d�s�|�d|�|j
jD]&\}
}|
��}
|�|
�s�|�|
|�q�|S)	N�
no host givenz\POST data should be bytes, an iterable of bytes, or a file object. It cannot be of type str.zContent-type�!application/x-www-form-urlencodedr��Transfer-encodingZchunkedrs)rzrrIr�r�r�r�r�r�r�rr�rr�r�r�)r�ryrzrIr�Zcontent_lengthZsel_hostrZselZsel_pathr_r�rLrLrM�do_request_�sJ


�
�
��

zAbstractHTTPHandler.do_request_c

sT|j}|std��||fd|ji|��}|�|j�t|j�����fdd�|j�	�D��d�d<dd���	�D��|j
r�i}d}|�kr��|||<�|=|j|j
|d	�z`z&|j|�
�|j|j�|�d
�d�Wn,tk
�r}zt|��W5d}~XYnX|��}	Wn|���YnX|j�r>|j��d|_|��|	_|	j|	_|	S)
z�Return an HTTPResponse object for the request, using http_class.

        http_class must implement the HTTPConnection API from http.client.
        r�rJcsi|]\}}|�kr||�qSrLrLr��rirLrMr/s�z/AbstractHTTPHandler.do_open.<locals>.<dictcomp>r��
ConnectioncSsi|]\}}|��|�qSrL)�title)r�r_r�rLrLrMr<sr�r�r�)Zencode_chunkedN)rzrrJZset_debuglevelr�r�r|�updaterirr~Z
set_tunnelryr�r�rIr�rq�getresponser�Zsockr�rH�reasonr�)
r�Z
http_classr�Zhttp_conn_argsrzr�Ztunnel_headersZproxy_auth_hdr�errr$rLr�rMr�!sB
�


zAbstractHTTPHandler.do_openN)r)r�r�r�r�r�r�r�r�rLrLrLrMr��s

&r�c@seZdZdd�ZejZdS)r)cCs|�tjj|�SrN)r�r�r�r��r�r�rLrLrM�	http_openfszHTTPHandler.http_openN)r�r�r�r�r�r�rerLrLrLrMr)dsr�c@s$eZdZddd�Zdd�ZejZdS)rErNcCst�||�||_||_dSrN)r�r��_context�_check_hostname)r�r�r>�check_hostnamerLrLrMr�oszHTTPSHandler.__init__cCs|jtjj||j|jd�S)N)r>r�)r�r�r�r�r�r�r�rLrLrM�
https_opents�zHTTPSHandler.https_open)rNN)r�r�r�r�r�r�r�rirLrLrLrMrEms
rEc@s.eZdZddd�Zdd�Zdd�ZeZeZdS)	rNcCs$ddl}|dkr|j��}||_dSro)Zhttp.cookiejar�	cookiejarZ	CookieJar)r�r�r�rLrLrMr�}s
zHTTPCookieProcessor.__init__cCs|j�|�|SrN)r�Zadd_cookie_headerr�rLrLrMre�sz HTTPCookieProcessor.http_requestcCs|j�||�|SrN)r�Zextract_cookies)r�ryr�rLrLrMr��sz!HTTPCookieProcessor.http_response)N)r�r�r�r�rer�rir�rLrLrLrMr|s

c@seZdZdd�ZdS)r.cCs|j}td|��dS)Nzunknown url type: %s)r�r)r�r�r�rLrLrMr��szUnknownHandler.unknown_openN)r�r�r�r�rLrLrLrMr.�scCsNi}|D]@}|�dd�\}}|ddkr@|ddkr@|dd�}|||<q|S)z>Parse list of key=value strings where keys are not duplicated.�=rVrrQrS)rX)�lZparsedZeltr�rrLrLrMrv�s
rvcCs�g}d}d}}|D]l}|r*||7}d}q|rT|dkr>d}qn|dkrJd}||7}q|dkrl|�|�d}q|dkrxd}||7}q|r�|�|�dd�|D�S)	apParse lists as described by RFC 2068 Section 2.

    In particular, parse comma-separated lists where the elements of
    the list may include quoted-strings.  A quoted-string could
    contain a comma.  A non-quoted string could have quotes in the
    middle.  Neither commas nor quotes count if they are escaped.
    Only double-quotes count, not single-quotes.
    rrF�\TrQr�cSsg|]}|���qSrL)rd)r��partrLrLrM�
<listcomp>�sz#parse_http_list.<locals>.<listcomp>)ra)r��resr��escaper	ZcurrLrLrMrx�s4	


rxc@s(eZdZdd�ZdZdd�Zdd�ZdS)r*cCs\|j}|dd�dkrN|dd�dkrN|jrN|jdkrN|j|��krXtd��n
|�|�SdS)Nr:rrSr
�	localhost�-file:// scheme is supported only on localhost)r�rz�	get_namesr�open_local_file)r�r�rHrLrLrM�	file_open�s&�
zFileHandler.file_openNcCs`tjdkrZz*tt�d�dt�t���d�t_Wn$tjk
rXt�d�ft_YnXtjS)Nr�r:)r*�namesr8r��gethostbyname_ex�gethostname�gaierror�
gethostbynamer�rLrLrMr��s
��
zFileHandler.get_namesc
Cs�ddl}ddl}|j}|j}t|�}z�t�|�}|j}|jj	|j
dd�}	|�|�d}
|�d|
pbd||	f�}|r~t
|�\}}|r�|s�t|�|��kr�|r�d||}
nd|}
tt|d�||
�WSWn*tk
r�}zt|��W5d}~XYnXtd��dS)	NrT�Zusegmtz6Content-type: %s
Content-length: %d
Last-modified: %s
�
text/plain�file://�rbzfile not on local host)�email.utils�	mimetypesrzr�r4r[�stat�st_size�utils�
formatdate�st_mtime�
guess_type�message_from_stringr
�_safe_gethostbynamer�rrGrqr)r�r��emailr�rzrfZ	localfile�statsrm�modified�mtyperirCZorigurl�exprLrLrMr��s:
����zFileHandler.open_local_file)r�r�r�r�r�r�r�rLrLrLrMr*�s
cCs*zt�|�WStjk
r$YdSXdSrN)r�r�r�)rzrLrLrMr��sr�c@seZdZdd�Zdd�ZdS)r+c
Cs*ddl}ddl}|j}|s"td��t|�\}}|dkr>|j}nt|�}t|�\}}|rdt|�\}}nd}t	|�}|pvd}|p~d}zt
�|�}Wn*tk
r�}zt|��W5d}~XYnXt
|j�\}	}
|	�d�}ttt	|��}|dd�|d}}|�r|d�s|dd�}z�|�||||||j�}
|�r6d�p8d}|
D]2}t|�\}}|��d	k�r>|d
k�r>|��}�q>|
�||�\}}d}|�|j�d}|�r�|d|7}|dk	�r�|dk�r�|d|7}t�|�}t|||j�WS|jk
�r$}z"td
|�}|�t� �d��W5d}~XYnXdS)Nr�ftp error: no host givenrrr
rSrVrh�Dr���a�Ar�rhr�r�zContent-type: %s
zContent-length: %d
�
ftp error: %rr:)!�ftplibr�rzrr
�FTP_PORTrbrrr
r�r�rqrr�rXr��map�connect_ftprJrrx�upper�retrfiler�rtr�r�r�
all_errors�with_tracebackr��exc_info)r�r�r�r�rzrCr r1r�r\�attrs�dirsrO�fwr��attrr�rh�retrlenrir�r��excrLrLrM�ftp_opens^
�
zFTPHandler.ftp_openc	Cst||||||dd�S)NF)�
persistent)�
ftpwrapper)r�r r1rzrCr�rJrLrLrMr�7s�zFTPHandler.connect_ftpN)r�r�r�r�r�rLrLrLrMr+s5c@s<eZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
S)r,cCs"i|_i|_d|_d|_d|_dS)Nr�<r})�cacherJ�soonest�delay�	max_connsr�rLrLrMr�>s
zCacheFTPHandler.__init__cCs
||_dSrN)r�)r��trLrLrM�
setTimeoutEszCacheFTPHandler.setTimeoutcCs
||_dSrN)r�)r�rrLrLrM�setMaxConnsHszCacheFTPHandler.setMaxConnscCsr|||d�|�|f}||jkr4t��|j|j|<n,t||||||�|j|<t��|j|j|<|��|j|S)Nr
)�joinr�r~r�rJr��check_cache)r�r r1rzrCr�rJr�rLrLrMr�Ks

�
zCacheFTPHandler.connect_ftpcCs�t��}|j|krPt|j���D].\}}||kr |j|��|j|=|j|=q tt|j����|_t	|j�|j
kr�t|j���D]&\}}||jkr�|j|=|j|=q�q�tt|j����|_dSrN)r~r�r�rJrr�r��min�valuesrdr�)r�r�r�rrLrLrMr�Vs


zCacheFTPHandler.check_cachecCs0|j��D]}|��q
|j��|j��dSrN)r�r�r��clearrJ)r��connrLrLrM�clear_cachejs

zCacheFTPHandler.clear_cacheN)	r�r�r�r�r�r�r�r�rrLrLrLrMr,;sc@seZdZdd�ZdS)r-cCs~|j}|�dd�\}}|�dd�\}}t|�}|�d�rNt�|�}|dd�}|sVd}t�d|t|�f�}t	t
�|�||�S)N�:rVr�z;base64i�����text/plain;charset=US-ASCIIz$Content-type: %s
Content-length: %d
)rtrXr�endswithr-�decodebytesr�r�rdr�io�BytesIO)r�r�rHrrIZ	mediatyperirLrLrM�	data_openqs



�zDataHandler.data_openN)r�r�r�r	rLrLrLrMr-psr��nt)r4r3cCst|�S)zOS-specific conversion from a relative URL of the 'file' scheme
        to a file system path; not recommended for general use.)r
��pathnamerLrLrMr4�scCst|�S)zOS-specific conversion from a file system path to a relative URL
        of the 'file' scheme; not recommended for general use.)r	rrLrLrMr3�sc@s�eZdZdZdZdeZd*dd�Zdd�Zdd	�Z	d
d�Z
dd
�Zd+dd�Zd,dd�Z
d-dd�Zd.dd�Zdd�Zd/dd�Zd0dd�Zdd�Zer�dd�Zd1d d!�Zd"d#�Zd$d%�Zd&d'�Zd2d(d)�ZdS)3r8a,Class to open URLs.
    This is a class rather than just a subroutine because we may need
    more than one set of global protocol-specific options.
    Note -- this is a base class for those who don't want the
    automatic handling of errors type 302 (relocated) and 401
    (authorization needed).Nr�cKszdd|jji}tj|tdd�|dkr.t�}||_|�d�|_|�d�|_	d|j
fdg|_g|_t
j|_d|_t|_dS)	NzW%(class)s style of invoking requests is deprecated. Use newer urlopen functions/methods�classrS)�
stacklevel�key_file�	cert_filez
User-Agent)ZAcceptz*/*)rLr�r?r@rAr5r&r�rr�versionr��_URLopener__tempfilesr[rp�_URLopener__unlink�	tempcache�ftpcache)r�r&Zx509r�rLrLrMr��s
�zURLopener.__init__cCs|��dSrN)r�r�rLrLrM�__del__�szURLopener.__del__cCs|��dSrN)�cleanupr�rLrLrMr��szURLopener.closec	CsV|jrB|jD](}z|�|�Wqtk
r2YqXq|jdd�=|jrR|j��dSrN)rrrqrr)r�rOrLrLrMr�s
zURLopener.cleanupcGs|j�|�dS)zdAdd a header to be used by the HTTP interface only
        e.g. u.addheader('Accept', 'sound/basic')N)r�ra)r�r�rLrLrM�	addheader�szURLopener.addheaderc
Csptt|��}t|dd�}|jrL||jkrL|j|\}}t|d�}t|||�St|�\}}|s`d}||jkr�|j|}t|�\}}	t|	�\}
}|
|f}nd}d|}||_	|�
dd�}t||�r�|d	kr�|r�|�|||�S|�
||�Sz0|dk�rt||�|�WSt||�||�WSWnVttfk
�r0�Yn<tk
�rj}
ztd
|
��t��d��W5d}
~
XYnXdS)z6Use URLopener().open(file) instead of open(file, 'r').z%/:=&?~#+!$,;'@()*[]|�rr�rONZopen_�-r�r�zsocket errorr:)rrr	rrGrrr&rr�rr��open_unknown_proxy�open_unknownr�rrrqr�r�r�)r�r�rIrfrirh�urltyperHr�	proxyhostrzr�r_r�rLrLrMrG�s<




zURLopener.opencCst|�\}}tdd|��dS)�/Overridable interface to open unknown URL type.�	url errorzunknown url typeN�rrq)r�r�rIr�rHrLrLrMr
szURLopener.open_unknowncCs t|�\}}tdd||��dS)rr zinvalid proxy for %sNr!)r�rr�rIr�rHrLrLrMrszURLopener.open_unknown_proxyc
Cstt|��}|jr&||jkr&|j|St|�\}}|dkr�|rF|dkr�z0|�|�}|��}|��tt|�d�|fWSt	k
r�}	zW5d}	~	XYnX|�
||�}�z<|��}
|r�t
|d�}nrt|�\}}
t|
p�d�\}}
t|
p�d�\}
}t|
p�d�\}
}t
j�|
�d}t�|�\}}|j�|�t
�|d�}z�||
f}|jdk	�rT||j|<d}d}d}d}d	|
k�rzt|
d
�}|�r�||||�|�|�}|�s��q�|t|�7}|�|�|d7}|�r�||||��q�W5|��XW5|��X|dk�r||k�rtd||f|��|S)ztretrieve(url) returns (filename, headers) for a local object
        or (tempfilename, headers) for a remote object.NrOrVrPrrrRrSrrTrUrW)rrrrr�rZr�r4rrqrGrrr[r\�splitextr^Zmkstemprra�fdopenrbrcrdrer)r�rHrfrgrIr�Zurl1rhr�r�rirjZgarbager\�suffix�fdrkrlrmrcrnrorLrLrM�retrievesn






��zURLopener.retrievecCs$d}d}t|t�r<t|�\}}|r6t|�\}}t|�}|}nt|\}}t|�\}}t|�\}	}
|
}d}|	��dkrvd}n:t|
�\}}
|r�t|�\}}|r�d|	||
f}t|�r�|}|s�tdd��|r�t|�}t	�
|����d�}nd}|�rt|�}t	�
|����d�}nd}||�}
i}|�r*d||d<|�r<d||d	<|�rJ||d
<d|d<|j
D]\}}|||<�qX|dk	�r�d
|d<|
�d|||�n|
jd||d�z|
��}Wn"tjjk
�r�td��YnXd|jk�r�dk�rnnt||jd||j�S|�||j|j|j|j|�SdS)a�Make an HTTP connection using connection_class.

        This is an internal method that should be called from
        open_http() or open_https().

        Arguments:
        - connection_factory should take a host name and return an
          HTTPConnection instance.
        - url is the url to retrieval or a host, relative-path pair.
        - data is payload for a POST request or None.
        Nr�z	%s://%s%sz
http errorr�r)zBasic %sr�rcrsr�r�r�zContent-Typer�r�r�z$http protocol error: bad status liner�r��http:)r�r�rrr
rrxr,rqr-r.r/r0r�ryr�r�r�Z
BadStatusLinerZstatusrr��
http_errorrhr�)r�Zconnection_factoryrHrIZuser_passwdZproxy_passwdrzr�Zrealhostrr�Z
proxy_authrbZ	http_connrirYr�r�rLrLrM�_open_generic_httpVs~



��zURLopener._open_generic_httpcCs|�tjj||�S)zUse HTTP protocol.)r)r�r�r��r�rHrIrLrLrM�	open_http�szURLopener.open_httpc
Csbd|}t||�rPt||�}|dkr6||||||�}	n|||||||�}	|	rP|	S|�|||||�S)z�Handle http errors.

        Derived class can override this, or provide specific handlers
        named http_error_DDD where DDD is the 3-digit error code.z
http_error_%dN)r�r�r�)
r�rHrh�errcode�errmsgrirIr_r�rkrLrLrMr(�s

zURLopener.http_errorcCs|��t||||d��dS)z>Default error handler: close the connection and raise OSError.N)r�r�r�rHrhr,r-rirLrLrMr��szURLopener.http_error_defaultcCstjj||j|jd�S)N)rr)r�r�r�rr)r�rzrLrLrM�_https_connection�s�zURLopener._https_connectioncCs|�|j||�S)zUse HTTPS protocol.)r)r/r*rLrLrM�
open_https�szURLopener.open_httpscCs^t|t�std��|dd�dkrP|dd�dkrP|dd���dkrPtd	��n
|�|�SdS)
z/Use local file or FTP depending on form of URL.zEfile error: proxy support for file protocol currently not implementedNr:rrSr
�z
localhost/r�)r�r�rrxrBr�r�rLrLrM�	open_file�s

4
zURLopener.open_filec
Cs\ddl}ddl}t|�\}}t|�}zt�|�}Wn0tk
rb}zt|j|j	��W5d}~XYnX|j
}	|jj|j
dd�}
|�|�d}|�d|p�d|	|
f�}|s�|}
|dd�dkr�d	|}
tt|d
�||
�St|�\}}|�sPt�|�t�ft�k�rP|}
|dd�dk�r d	|}
n|dd�dk�r>td
|��tt|d
�||
�Std��dS)zUse local file.rNTr�z6Content-Type: %s
Content-Length: %d
Last-modified: %s
r�rVr
r�r�r:z./zAlocal file url may start with / or file:. Unknown url of type: %sz#local file error: not on local host)r�r�rr4r[r�rqr�strerrorrfr�r�r�r�r�r�rrGr
r�r�r��thishostrB)r�rHr�r�rzrOZ	localnamer��ermr�r�riZurlfilerCrLrLrMr��s@ ���
zURLopener.open_local_filec
Cs�t|t�std��ddl}t|�\}}|s2td��t|�\}}t|�\}}|r\t|�\}}nd}t|�}t|ppd�}t|p|d�}t	�
|�}|s�ddl}|j}nt
|�}t|�\}}	t|�}|�d�}
|
dd�|
d}
}|
r�|
ds�|
dd�}
|
�r
|
d�s
d|
d<|||d�|
�f}t|j�tk�rbt|j�D]*}
|
|k�r6|j|
}|j|
=|���q6z�||jk�r�t|||||
�|j|<|�s�d	}nd
}|	D]2}t|�\}}|��dk�r�|dk�r�|��}�q�|j|�||�\}}|�d
|�d}d}|�r|d|7}|dk	�r,|dk�r,|d|7}t�|�}t||d
|�WSt�k
�r�}ztd|�� t!�"�d��W5d}~XYnXdS)zUse FTP protocol.zCftp error: proxy support for ftp protocol currently not implementedrNr�rrr
rSrVr�rhr�r�zftp:zContent-Type: %s
zContent-Length: %d
zftp error %rr:)#r�r�rr�rr
rrr
r�r�r�r�rbrrXr�rdr�MAXFTPCACHEr�r�r�rrxr�r�r�r�r�r�	ftperrorsr�r�r�)r�rHr�rzr\rCr r1r�r�r�rOr�r�rr�r�r�rhr�r�rir�rLrLrM�open_ftp�st




��
zURLopener.open_ftpc	
Cs<t|t�std��z|�dd�\}}Wntk
rDtdd��YnX|sNd}|�d�}|dkr�d	||d
�kr�||dd
�}|d
|�}nd}g}|�dt�	d
t�
t�����|�d|�|dkr�t�|�
d���d�}nt|�}|�dt|��|�d�|�|�d�|�}t�|�}t�|�}t|||�S)zUse "data" URL.zEdata error: proxy support for data protocol currently not implementedr�rVz
data errorzbad data URLr�;rr�NrrzDate: %sz%a, %d %b %Y %H:%M:%S GMTzContent-type: %sr-r)zlatin-1zContent-Length: %d�
)r�r�rrXrBrq�rfindrar~�strftime�gmtimer-rr/r0r
rdr�r�r�r�StringIOr)	r�rHrIr�Zsemirr�ri�frLrLrM�	open_data8s8

�




zURLopener.open_data)N)N)N)N)NNN)N)N)N)N)r�r�r�r�rr�rr�rr�rrrGrrr&r)r+r(r�rCr/r0r2r�r8r@rLrLrLrMr8�s.

$


A\


	 :c@s�eZdZdZdd�Zdd�Zd#dd�Zd	d
�Zd$dd�Zd%d
d�Z	d&dd�Z
d'dd�Zd(dd�Zd)dd�Z
d*dd�Zd+dd�Zd,dd�Zd-dd �Zd!d"�ZdS).r9z?Derived class with handlers for errors we can handle (perhaps).cOs(tj|f|�|�i|_d|_d|_dS)Nrr�)r8r��
auth_cache�tries�maxtriesrIrLrLrMr�eszFancyURLopener.__init__cCst||d||�S)z3Default error handling -- don't raise an exception.r')rr.rLrLrMr�ksz!FancyURLopener.http_error_defaultNc	Csv|jd7_zZ|jrN|j|jkrNt|d�r4|j}n|j}|||dd|�W�S|�||||||�}|W�Sd|_XdS)z%Error 302 -- relocated (temporarily).rVr�http_error_500r�z)Internal Server Error: Redirect RecursionN)rBrCr�rDr��redirect_internal)	r�rHrhr,r-rirIr�rkrLrLrMros 
��zFancyURLopener.http_error_302c	Csxd|kr|d}nd|kr$|d}ndS|��t|jd||�}t|�}|jdkrnt|||d|||��|�|�S)Nrrrrz( Redirection to url '%s' is not allowed.)r�rr�rrrrG)	r�rHrhr,r-rirIrrrLrLrMrE�s"


��z FancyURLopener.redirect_internalcCs|�||||||�S)z*Error 301 -- also relocated (permanently).�r�r�rHrhr,r-rirIrLrLrMr�szFancyURLopener.http_error_301cCs|�||||||�S)z;Error 303 -- also relocated (essentially identical to 302).rFrGrLrLrMr�szFancyURLopener.http_error_303cCs2|dkr|�||||||�S|�|||||�SdS)z1Error 307 -- relocated, but turn POST into error.N)rr�rGrLrLrMr�szFancyURLopener.http_error_307Fc
Cs�d|krt�||||||�|d}t�d|�}	|	sHt�||||||�|	��\}
}|
��dkrtt�||||||�|s�t�||||||�d|jd}|dkr�t||�||�St||�|||�SdS)z_Error 401 -- authentication required.
        This function supports Basic authentication only.rj�![ 	]*([^ 	]+)[ 	]+realm="([^"]*)"r[Zretry_�_basic_authN�r8r�rf�matchrVrxr�r��
r�rHrhr,r-rirIr�ZstuffrKrr9r_rLrLrMrk�s:
�
�
��zFancyURLopener.http_error_401c
Cs�d|krt�||||||�|d}t�d|�}	|	sHt�||||||�|	��\}
}|
��dkrtt�||||||�|s�t�||||||�d|jd}|dkr�t||�||�St||�|||�SdS)zeError 407 -- proxy authentication required.
        This function supports Basic authentication only.rmrHr[Zretry_proxy_rINrJrLrLrLrMrn�s:
�
�
��zFancyURLopener.http_error_407cCs�t|�\}}d||}|jd}t|�\}}	t|	�\}	}
|	�d�d}|	|d�}	|�|	||�\}}
|sr|
srdSdt|dd�t|
dd�|	f}	d|	|
|jd<|dkr�|�|�S|�||�SdS)N�http://r�rrV�%s:%s@%srrr�rr&rr��get_user_passwdr	rG�r�rHr9rIrzr�rrrrZ
proxyselectorr�r r1rLrLrM�retry_proxy_http_basic_auth�s$

�
z*FancyURLopener.retry_proxy_http_basic_authcCs�t|�\}}d||}|jd}t|�\}}	t|	�\}	}
|	�d�d}|	|d�}	|�|	||�\}}
|sr|
srdSdt|dd�t|
dd�|	f}	d|	|
|jd<|dkr�|�|�S|�||�SdS)N�https://r�rrVrNrrrrOrQrLrLrM�retry_proxy_https_basic_auth�s$

�
z+FancyURLopener.retry_proxy_https_basic_authc
Cs�t|�\}}|�d�d}||d�}|�|||�\}}|sD|sDdSdt|dd�t|dd�|f}d||}	|dkr�|�|	�S|�|	|�SdS)NrrVrNrrrrM�rr�rPr	rG�
r�rHr9rIrzr�r�r r1rrLrLrMr\	s
�
z$FancyURLopener.retry_http_basic_authc
Cs�t|�\}}|�d�d}||d�}|�|||�\}}|sD|sDdSdt|dd�t|dd�|f}d||}	|dkr�|�|	�S|�|	|�SdS)NrrVrNrrrrSrUrVrLrLrM�retry_https_basic_auth	s
�
z%FancyURLopener.retry_https_basic_authrcCs`|d|��}||jkr2|r(|j|=n
|j|S|�||�\}}|sJ|rX||f|j|<||fS)Nr)rxrA�prompt_user_passwd)r�rzr9rr�r r1rLrLrMrP	s


zFancyURLopener.get_user_passwdcCsXddl}z.td||f�}|�d|||f�}||fWStk
rRt�YdSXdS)z#Override this in a GUI environment!rNzEnter username for %s at %s: z#Enter password for %s in %s at %s: r<)�getpass�input�KeyboardInterrupt�print)r�rzr9rYr r1rLrLrMrX)	s�
z!FancyURLopener.prompt_user_passwd)N)N)N)N)NF)NF)N)N)N)N)r)r�r�r�r�r�r�rrErrrrkrnrRrTr\rWrPrXrLrLrLrMr9bs(



�
�





cCstdkrt�d�atS)z8Return the IP address of the magic hostname 'localhost'.Nr�)�
_localhostr�r�rLrLrLrMr�9	s
r�cCsPtdkrLztt�t���d�aWn(tjk
rJtt�d�d�aYnXtS)z,Return the IP addresses of the current host.Nr:r�)�	_thishostr8r�r�r�r�rLrLrLrMr4A	sr4cCstdkrddl}|jatS)z1Return the set of errors raised by the FTP class.Nr)�
_ftperrorsr�r�)r�rLrLrMr7L	sr7cCstdkrt�d�atS)z%Return an empty email Message object.Nrr)�
_noheadersr�r�rLrLrLrM�	noheadersU	s
rac@sJeZdZdZddd�Zdd�Zdd	�Zd
d�Zdd
�Zdd�Z	dd�Z
dS)r�z;Class used by open_ftp() for cache of open FTP connections.NTcCsX||_||_||_||_||_||_d|_||_z|��Wn|�	��YnXdSro)
r r1rzrCr�rJ�refcount�	keepalive�initr�)r�r r1rzrCr�rJr�rLrLrMr�b	szftpwrapper.__init__cCs\ddl}d|_|��|_|j�|j|j|j�|j�|j	|j
�d�|j�}|j�
|�dS)Nrr
)r��busyZFTPr	ZconnectrzrCrJZloginr r1r�r��cwd)r�r�Z_targetrLrLrMrdr	s
zftpwrapper.initc
Cs�ddl}|��|dkr"d}d}nd|}d}z|j�|�Wn*|jk
rh|��|j�|�YnXd}|r�|s�zd|}|j�|�\}}WnR|jk
r�}z2t|�dd�dkr�t	d	|��
t��d
��W5d}~XYnX|�s�|j�d�|�rl|j�
�}	zJz|j�|�Wn4|jk
�rN}zt	d	|�|�W5d}~XYnXW5|j�|	�Xd|}nd}|j�|�\}}d|_t|�d
�|j�}
|jd7_|��|
|fS)Nr)r�r�zTYPE ArVzTYPE zRETR rSZ550r�r:zLIST ZLISTr�)r��endtransferr	Zvoidcmdr�rdZntransfercmdZ
error_permr�rr�r�r��pwdrfrerZmakefile�
file_closerbr�)r�rOr�r��cmd�isdirrr�r�rhZftpobjrLrLrMr�{	sP
�
$
zftpwrapper.retrfilecCs
d|_dSro)rer�rLrLrMrg�	szftpwrapper.endtransfercCsd|_|jdkr|��dS)NFr)rcrb�
real_closer�rLrLrMr��	s
zftpwrapper.closecCs2|��|jd8_|jdkr.|js.|��dS)NrVr)rgrbrcrlr�rLrLrMri�	szftpwrapper.file_closecCs2|��z|j��Wnt�k
r,YnXdSrN)rgr	r�r7r�rLrLrMrl�	s
zftpwrapper.real_close)NT)r�r�r�r�r�rdr�rgr�rirlrLrLrLrMr�_	s�
	-r�cCs�i}tj��D]4\}}|��}|r|dd�dkr|||dd�<qdtjkrZ|�dd�tj��D]J\}}|dd�dkrd|��}|r�|||dd�<qd|�|dd�d�qd|S)aReturn a dictionary of scheme -> proxy server URL mappings.

    Scan the environment for variables named <scheme>_proxy;
    this seems to be the standard convention.  If you need a
    different way, you can pass a proxies dictionary to the
    [Fancy]URLopener constructor.

    i����N�_proxyZREQUEST_METHODr�)r[�environrrxr�)r&r_r�rLrLrM�getproxies_environment�	s	
rocCs�|dkrt�}z|d}Wntk
r0YdSX|dkr>dS|��}t|�\}}|�d�D]Z}|��}|r\|�d�}|��}||ks�||kr�dSd|}|�|�s�|�|�r\dSq\dS)z�Test if proxies should not be used for a particular host.

    Checks the proxy dict for the value of no_proxy, which should
    be a list of comma separated DNS suffixes, or '*' for all hosts.

    NZnoF�*Tr��.)ror�rxr
rXrd�lstripr)rzr&Zno_proxy�hostonlyrCr_rLrLrM�proxy_bypass_environment�	s*
rtc	Cs0ddlm}t|�\}}dd�}d|kr4|dr4dSd}|�d	d
�D]�}|sNqDt�d|�}|dk	�r|dkr�zt�|�}||�}Wntk
r�YqDYnX||�d��}	|�d
�}
|
dkr�d|�d��	d�d}
nt
|
dd��}
|
dksD|
dkr�qDd|
}
||
?|	|
?k�r*dSqD|||�rDdSqDdS)aj
    Return True iff this host shouldn't be accessed using a proxy

    This function uses the MacOSX framework SystemConfiguration
    to fetch the proxy information.

    proxy_settings come from _scproxy._get_proxy_settings or get mocked ie:
    { 'exclude_simple': bool,
      'exceptions': ['foo.bar', '*.bar.com', '127.0.0.1', '10.1', '10.0/16']
    }
    r)�fnmatchcSsh|�d�}ttt|��}t|�dkr<|ddddgdd�}|dd>|dd>B|dd>B|d	BS)
Nrqr�r�rVr}r:r|rS)rXr�r�rbrd)ZipAddrrBrLrLrM�ip2num
s

z,_proxy_bypass_macosx_sysconf.<locals>.ip2numrqZexclude_simpleTN�
exceptionsrLz(\d+(?:\.\d+)*)(/\d+)?rVr:r|� F)rur
r�rfrKr�r�rq�group�countrb)rz�proxy_settingsrursrCrwZhostIPr�rrD�maskrLrLrM�_proxy_bypass_macosx_sysconf
s>




r~�darwin)�_get_proxy_settings�_get_proxiescCst�}t||�SrN)r�r~)rzr|rLrLrM�proxy_bypass_macosx_sysconfF
sr�cCst�S)z�Return a dictionary of scheme -> proxy server URL mappings.

        This function uses the MacOSX framework SystemConfiguration
        to fetch the proxy information.
        )r�rLrLrLrM�getproxies_macosx_sysconfJ
sr�cCs t�}|rt||�St|�SdS)z�Return True, if host should be bypassed.

        Checks proxy settings gathered from the environment, if specified,
        or from the MacOSX framework SystemConfiguration.

        N)rortr��rzr&rLrLrMr,T
s
r,cCst�p
t�SrN)ror�rLrLrLrMr5a
sc
Csi}zddl}Wntk
r(|YSXz�|�|jd�}|�|d�d}|r�t|�|d�d�}d|kr�|�d�D]4}|�dd�\}}t�d	|�s�d
||f}|||<qtn>|dd�dkr�||d
<n$d||d
<d||d<d||d<|�	�Wnt
ttfk
�rYnX|S)zxReturn a dictionary of scheme -> proxy server URL mappings.

        Win32 uses the registry to store proxies.

        rN�;Software\Microsoft\Windows\CurrentVersion\Internet Settings�ProxyEnableZProxyServerr�r9rVz
(?:[^/:]+)://z%s://%srtr'r�z	http://%sz
https://%sr�zftp://%sr	)
�winreg�ImportError�OpenKey�HKEY_CURRENT_USER�QueryValueExr�rXrfrKZCloserqrBr�)r&r��internetSettings�proxyEnableZproxyServer�pr�ZaddressrLrLrM�getproxies_registryf
sF
�����
r�cCst�p
t�S)z�Return a dictionary of scheme -> proxy server URL mappings.

        Returns settings gathered from the environment, if specified,
        or the registry.

        )ror�rLrLrLrMr5�
scCs|zddl}Wntk
r"YdSXz6|�|jd�}|�|d�d}t|�|d�d�}Wntk
rpYdSX|rz|s~dSt|�\}}|g}z t�	|�}||kr�|�
|�Wntk
r�YnXz t�|�}||kr�|�
|�Wntk
�r�YnX|�d�}|D]j}	|	dk�r*d|k�r*dS|	�
dd	�}	|	�
d
d�}	|	�
dd�}	|D] }
t�|	|
tj��rRdS�qR�qdS)
Nrr�r�Z
ProxyOverrider9z<local>rqrVz\.rpz.*�?)r�r�r�r�r�r�rqr
r�r�raZgetfqdnrXrrfrKrh)rzr�r�r�Z
proxyOverrideZrawHostrCZaddrZfqdnrEr�rLrLrM�proxy_bypass_registry�
s`�����





r�cCs t�}|rt||�St|�SdS)z�Return True, if host should be bypassed.

        Checks proxy settings gathered from the environment, if specified,
        or the registry.

        N)rortr�r�rLrLrMr,�
s
)NNN)N)~r�r-r�r�r�Zhttp.clientr�rr[�	posixpathrfr�rr�r~r^rXr?Zurllib.errorrrrZurllib.parserrrrr	r
rrr
rrrrrrrrrZurllib.responserrrDr�rC�__all__�version_infor�rFr�r0r1r`r6r7rg�ASCIIrvr{rrr2rr/rrr"rr r!r"r#r$r%�urandomr�r&r'r(r�r)r�r�rErarr.rvrxr*r�r+r,r-r6r_Z
nturl2pathr4r3rr8r9r]r�r^r4r_r7r`rar�rortr~�platformZ_scproxyr�r�r�r�r,r5r�r�rLrLrLrM�<module>s SP
��U
?m$q!+@
ov

+3:5!@W

_
%A

-	2
robotparser.cpython-38.opt-1.pyc000064400000016241151733313270012506 0ustar00U

e5d�$�@s\dZddlZddlZddlZdgZe�dd�ZGdd�d�ZGdd�d�Z	Gd	d
�d
�Z
dS)a% robotparser.py

    Copyright (C) 2000  Bastian Kleineidam

    You can choose between two licenses when using this package:
    1) GNU GPLv2
    2) PSF license for Python 2.2

    The robots.txt Exclusion Protocol is implemented as specified in
    http://www.robotstxt.org/norobots-rfc.txt
�N�RobotFileParser�RequestRatezrequests secondsc@sreZdZdZddd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�ZdS)rzs This class provides a set of methods to read, parse and answer
    questions about a single robots.txt file.

    �cCs2g|_g|_d|_d|_d|_|�|�d|_dS)NFr)�entries�sitemaps�
default_entry�disallow_all�	allow_all�set_url�last_checked��self�url�r�*/usr/lib64/python3.8/urllib/robotparser.py�__init__s
zRobotFileParser.__init__cCs|jS)z�Returns the time the robots.txt file was last fetched.

        This is useful for long-running web spiders that need to
        check for new robots.txt files periodically.

        )r�r
rrr�mtime%szRobotFileParser.mtimecCsddl}|��|_dS)zYSets the time the robots.txt file was last fetched to the
        current time.

        rN)�timer)r
rrrr�modified.szRobotFileParser.modifiedcCs&||_tj�|�dd�\|_|_dS)z,Sets the URL referring to a robots.txt file.��N)r�urllib�parse�urlparseZhost�pathrrrrr
6szRobotFileParser.set_urlc
Cs�ztj�|j�}WnRtjjk
rd}z0|jdkr:d|_n|jdkrT|jdkrTd|_W5d}~XYnX|�	�}|�
|�d����dS)z4Reads the robots.txt URL and feeds it to the parser.)i�i�Ti�i�Nzutf-8)
rZrequestZurlopenr�errorZ	HTTPError�coderr	�readr�decode�
splitlines)r
�f�err�rawrrrr;s
zRobotFileParser.readcCs,d|jkr|jdkr(||_n|j�|�dS�N�*)�
useragentsrr�append)r
�entryrrr�
_add_entryHs

zRobotFileParser._add_entrycCsPd}t�}|��|D�]}|sP|dkr4t�}d}n|dkrP|�|�t�}d}|�d�}|dkrn|d|�}|��}|s|q|�dd�}t|�dkr|d����|d<tj	�
|d���|d<|ddkr�|dkr�|�|�t�}|j�|d�d}q|ddk�r.|dk�r6|j
�t|dd	��d}q|dd
k�rb|dk�r6|j
�t|dd��d}q|ddk�r�|dk�r6|d�����r�t|d�|_d}q|dd
k�r|dk�r6|d�d�}t|�dk�r|d�����r|d�����rtt|d�t|d��|_d}q|ddkr|j�|d�q|dk�rL|�|�dS)z�Parse the input lines from a robots.txt file.

        We allow that a user-agent: line is not preceded by
        one or more blank lines.
        rr��#N�:z
user-agentZdisallowFZallowTzcrawl-delayzrequest-rate�/Zsitemap)�Entryrr)�find�strip�split�len�lowerrr�unquoter&r'�	rulelines�RuleLine�isdigit�int�delayr�req_rater)r
�lines�stater(�line�iZnumbersrrrrQsj








 �
zRobotFileParser.parsecCs�|jr
dS|jrdS|jsdStj�tj�|��}tj�dd|j|j	|j
|jf�}tj�|�}|sfd}|j
D]}|�|�rl|�|�Sql|jr�|j�|�SdS)z=using the parsed robots.txt decide if useragent can fetch urlFTrr-)rr	rrrrr4�
urlunparserZparamsZqueryZfragment�quoter�
applies_to�	allowancer)r
�	useragentrZ
parsed_urlr(rrr�	can_fetch�s*�

zRobotFileParser.can_fetchcCs>|��sdS|jD]}|�|�r|jSq|jr:|jjSdS�N)rrrAr9r�r
rCr(rrr�crawl_delay�s

zRobotFileParser.crawl_delaycCs>|��sdS|jD]}|�|�r|jSq|jr:|jjSdSrE)rrrAr:rrFrrr�request_rate�s

zRobotFileParser.request_ratecCs|js
dS|jSrE)rrrrr�	site_maps�szRobotFileParser.site_mapscCs,|j}|jdk	r||jg}d�tt|��S)Nz

)rr�join�map�str)r
rrrr�__str__�s
zRobotFileParser.__str__N)r)�__name__�
__module__�__qualname__�__doc__rrrr
rr)rrDrGrHrIrMrrrrrs
		
	I

c@s(eZdZdZdd�Zdd�Zdd�ZdS)	r6zoA rule line is a single "Allow:" (allowance==True) or "Disallow:"
       (allowance==False) followed by a path.cCs<|dkr|sd}tj�tj�|��}tj�|�|_||_dS)NrT)rrr?rr@rrB)r
rrBrrrr�s
zRuleLine.__init__cCs|jdkp|�|j�Sr$)r�
startswith)r
�filenamerrrrA�szRuleLine.applies_tocCs|jr
dndd|jS)NZAllowZDisallowz: )rBrrrrrrM�szRuleLine.__str__N)rNrOrPrQrrArMrrrrr6�sr6c@s0eZdZdZdd�Zdd�Zdd�Zdd	�Zd
S)r.z?An entry has one or more user-agents and zero or more rulelinescCsg|_g|_d|_d|_dSrE)r&r5r9r:rrrrr�szEntry.__init__cCs�g}|jD]}|�d|���q
|jdk	r<|�d|j���|jdk	rf|j}|�d|j�d|j���|�tt|j	��d�
|�S)NzUser-agent: z
Crawl-delay: zRequest-rate: r-�
)r&r'r9r:ZrequestsZseconds�extendrKrLr5rJ)r
Zret�agentZraterrrrM�s


z
Entry.__str__cCsF|�d�d��}|jD](}|dkr*dS|��}||krdSqdS)z2check if this entry applies to the specified agentr-rr%TF)r1r3r&)r
rCrVrrrrA�s
zEntry.applies_tocCs$|jD]}|�|�r|jSqdS)zZPreconditions:
        - our agent applies to this entry
        - filename is URL decodedT)r5rArB)r
rSr=rrrrB
s

zEntry.allowanceN)rNrOrPrQrrMrArBrrrrr.�s

r.)rQ�collectionsZurllib.parserZurllib.request�__all__�
namedtuplerrr6r.rrrr�<module>sBerror.cpython-38.opt-2.pyc000064400000004130151733313270011270 0ustar00U

e5dH
�@sLddlZdddgZGdd�de�ZGdd�deejj�ZGdd�de�ZdS)�N�URLError�	HTTPError�ContentTooShortErrorc@seZdZddd�Zdd�ZdS)rNcCs |f|_||_|dk	r||_dS�N)�args�reason�filename)�selfrr�r
�$/usr/lib64/python3.8/urllib/error.py�__init__szURLError.__init__cCs
d|jS)Nz<urlopen error %s>)r�r	r
r
r�__str__szURLError.__str__)N)�__name__�
__module__�__qualname__rrr
r
r
rrs
c@sTeZdZejjjZdd�Zdd�Zdd�Z	e
dd��Ze
d	d
��Zej
dd
��ZdS)
rcCs:||_||_||_||_||_|dk	r6|�||||�dSr)�code�msg�hdrs�fpr�_HTTPError__super_init)r	Zurlrrrrr
r
rr'szHTTPError.__init__cCsd|j|jfS)NzHTTP Error %s: %s�rrr
r
r
rr4szHTTPError.__str__cCsd|j|jfS)Nz<HTTPError %s: %r>rr
r
r
r�__repr__7szHTTPError.__repr__cCs|jSr)rr
r
r
rr<szHTTPError.reasoncCs|jSr�rr
r
r
r�headers@szHTTPError.headerscCs
||_dSrr)r	rr
r
rrDsN)rrr�urllib�response�
addinfourlrrrr�propertyrr�setterr
r
r
rr#s



c@seZdZdd�ZdS)rcCst�||�||_dSr)rr�content)r	�messager r
r
rrKszContentTooShortError.__init__N)rrrrr
r
r
rrIs)	Zurllib.responser�__all__�OSErrorrrrrrr
r
r
r�<module>s
&error.cpython-38.opt-1.pyc000064400000005373151733313270011301 0ustar00U

e5dH
�@sPdZddlZdddgZGdd�de�ZGdd�deejj�ZGdd�de�Z	dS)	a�Exception classes raised by urllib.

The base exception class is URLError, which inherits from OSError.  It
doesn't define any behavior of its own, but is the base class for all
exceptions defined in this package.

HTTPError is an exception class that is also a valid HTTP response
instance.  It behaves this way because HTTP protocol errors are valid
responses, with a status code, headers, and a body.  In some contexts,
an application may want to handle an exception like a regular
response.
�N�URLError�	HTTPError�ContentTooShortErrorc@seZdZddd�Zdd�ZdS)rNcCs |f|_||_|dk	r||_dS�N)�args�reason�filename)�selfrr�r
�$/usr/lib64/python3.8/urllib/error.py�__init__szURLError.__init__cCs
d|jS)Nz<urlopen error %s>)r�r	r
r
r�__str__szURLError.__str__)N)�__name__�
__module__�__qualname__rrr
r
r
rrs
c@sXeZdZdZejjjZdd�Zdd�Z	dd�Z
edd	��Zed
d��Z
e
jdd��Z
d
S)rzBRaised when HTTP error occurs, but also acts like non-error returncCs:||_||_||_||_||_|dk	r6|�||||�dSr)�code�msg�hdrs�fpr�_HTTPError__super_init)r	Zurlrrrrr
r
rr'szHTTPError.__init__cCsd|j|jfS)NzHTTP Error %s: %s�rrr
r
r
rr4szHTTPError.__str__cCsd|j|jfS)Nz<HTTPError %s: %r>rr
r
r
r�__repr__7szHTTPError.__repr__cCs|jSr)rr
r
r
rr<szHTTPError.reasoncCs|jSr�rr
r
r
r�headers@szHTTPError.headerscCs
||_dSrr)r	rr
r
rrDsN)rrr�__doc__�urllib�response�
addinfourlrrrr�propertyrr�setterr
r
r
rr#s



c@seZdZdZdd�ZdS)rzDException raised when downloaded size does not match content-length.cCst�||�||_dSr)rr�content)r	�messager!r
r
rrKszContentTooShortError.__init__N)rrrrrr
r
r
rrIs)
rZurllib.responser�__all__�OSErrorrrrrrr
r
r
r�<module>s


&response.cpython-38.opt-2.pyc000064400000005230151733313270011777 0ustar00U

e5d��@sZddlZddddgZGdd�dej�ZGdd�de�ZGdd�de�ZGd	d�de�ZdS)
�N�addbase�addclosehook�addinfo�
addinfourlcs4eZdZ�fdd�Zdd�Zdd�Zdd�Z�ZS)	rcs tt|�j|ddd�||_dS)Nz<urllib response>F)�delete)�superr�__init__�fp)�selfr	��	__class__��'/usr/lib64/python3.8/urllib/response.pyrszaddbase.__init__cCsd|jjt|�|jfS)Nz<%s at %r whose fp = %r>)r�__name__�id�file�r
r
r
r�__repr__s�zaddbase.__repr__cCs|jjrtd��|S)NzI/O operation on closed file)r	�closed�
ValueErrorrr
r
r�	__enter__szaddbase.__enter__cCs|��dS�N)�close)r
�type�value�	tracebackr
r
r�__exit__!szaddbase.__exit__)r�
__module__�__qualname__rrrr�
__classcell__r
r
rrrscs(eZdZ�fdd�Z�fdd�Z�ZS)rcs tt|��|�||_||_dSr)rrr�	closehook�hookargs)r
r	r r!rr
rr(szaddclosehook.__init__c	s>z(|j}|j}|r&d|_d|_||�W5tt|���XdSr)rrrr r!)r
r r!rr
rr-szaddclosehook.close)rrrrrrr
r
rrr%scs$eZdZ�fdd�Zdd�Z�ZS)rcstt|��|�||_dSr)rrr�headers)r
r	r"rr
rr<szaddinfo.__init__cCs|jSr)r"rr
r
r�info@szaddinfo.info)rrrrr#rr
r
rrr9scs.eZdZd�fdd�	Zdd�Zdd�Z�ZS)	rNcs"tt|��||�||_||_dSr)rrr�url�code)r
r	r"r$r%rr
rrGszaddinfourl.__init__cCs|jSr)r%rr
r
r�getcodeLszaddinfourl.getcodecCs|jSr)r$rr
r
r�geturlOszaddinfourl.geturl)N)rrrrr&r'rr
r
rrrDs)Ztempfile�__all__Z_TemporaryFileWrapperrrrrr
r
r
r�<module>	s
error.cpython-38.pyc000064400000005373151733313270010342 0ustar00U

e5dH
�@sPdZddlZdddgZGdd�de�ZGdd�deejj�ZGdd�de�Z	dS)	a�Exception classes raised by urllib.

The base exception class is URLError, which inherits from OSError.  It
doesn't define any behavior of its own, but is the base class for all
exceptions defined in this package.

HTTPError is an exception class that is also a valid HTTP response
instance.  It behaves this way because HTTP protocol errors are valid
responses, with a status code, headers, and a body.  In some contexts,
an application may want to handle an exception like a regular
response.
�N�URLError�	HTTPError�ContentTooShortErrorc@seZdZddd�Zdd�ZdS)rNcCs |f|_||_|dk	r||_dS�N)�args�reason�filename)�selfrr�r
�$/usr/lib64/python3.8/urllib/error.py�__init__szURLError.__init__cCs
d|jS)Nz<urlopen error %s>)r�r	r
r
r�__str__szURLError.__str__)N)�__name__�
__module__�__qualname__rrr
r
r
rrs
c@sXeZdZdZejjjZdd�Zdd�Z	dd�Z
edd	��Zed
d��Z
e
jdd��Z
d
S)rzBRaised when HTTP error occurs, but also acts like non-error returncCs:||_||_||_||_||_|dk	r6|�||||�dSr)�code�msg�hdrs�fpr�_HTTPError__super_init)r	Zurlrrrrr
r
rr'szHTTPError.__init__cCsd|j|jfS)NzHTTP Error %s: %s�rrr
r
r
rr4szHTTPError.__str__cCsd|j|jfS)Nz<HTTPError %s: %r>rr
r
r
r�__repr__7szHTTPError.__repr__cCs|jSr)rr
r
r
rr<szHTTPError.reasoncCs|jSr�rr
r
r
r�headers@szHTTPError.headerscCs
||_dSrr)r	rr
r
rrDsN)rrr�__doc__�urllib�response�
addinfourlrrrr�propertyrr�setterr
r
r
rr#s



c@seZdZdZdd�ZdS)rzDException raised when downloaded size does not match content-length.cCst�||�||_dSr)rr�content)r	�messager!r
r
rrKszContentTooShortError.__init__N)rrrrrr
r
r
rrIs)
rZurllib.responser�__all__�OSErrorrrrrrr
r
r
r�<module>s


&robotparser.cpython-38.opt-2.pyc000064400000013511151733313270012504 0ustar00U

e5d�$�@sXddlZddlZddlZdgZe�dd�ZGdd�d�ZGdd�d�ZGdd	�d	�Z	dS)
�N�RobotFileParser�RequestRatezrequests secondsc@sneZdZddd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Zdd�Z	dd�Z
dd�Zdd�Zdd�Z
dd�ZdS)r�cCs2g|_g|_d|_d|_d|_|�|�d|_dS)NFr)�entries�sitemaps�
default_entry�disallow_all�	allow_all�set_url�last_checked��self�url�r�*/usr/lib64/python3.8/urllib/robotparser.py�__init__s
zRobotFileParser.__init__cCs|jS�N)r�r
rrr�mtime%szRobotFileParser.mtimecCsddl}|��|_dS)Nr)�timer)r
rrrr�modified.szRobotFileParser.modifiedcCs&||_tj�|�dd�\|_|_dS)N��)r�urllib�parse�urlparseZhost�pathrrrrr
6szRobotFileParser.set_urlc
Cs�ztj�|j�}WnRtjjk
rd}z0|jdkr:d|_n|jdkrT|jdkrTd|_W5d}~XYnX|�	�}|�
|�d����dS)N)i�i�Ti�i�zutf-8)
rZrequestZurlopenr�errorZ	HTTPError�coderr	�readr�decode�
splitlines)r
�f�err�rawrrrr;s
zRobotFileParser.readcCs,d|jkr|jdkr(||_n|j�|�dS�N�*)�
useragentsrr�append)r
�entryrrr�
_add_entryHs

zRobotFileParser._add_entrycCsPd}t�}|��|D�]}|sP|dkr4t�}d}n|dkrP|�|�t�}d}|�d�}|dkrn|d|�}|��}|s|q|�dd�}t|�dkr|d����|d<tj	�
|d���|d<|ddkr�|dkr�|�|�t�}|j�|d�d}q|ddk�r.|dk�r6|j
�t|dd��d}q|dd	k�rb|dk�r6|j
�t|dd
��d}q|ddk�r�|dk�r6|d�����r�t|d�|_d}q|ddk�r|dk�r6|d�d
�}t|�dk�r|d�����r|d�����rtt|d�t|d��|_d}q|ddkr|j�|d�q|dk�rL|�|�dS)Nrr��#�:z
user-agentZdisallowFZallowTzcrawl-delayzrequest-rate�/Zsitemap)�Entryrr*�find�strip�split�len�lowerrr�unquoter'r(�	rulelines�RuleLine�isdigit�int�delayr�req_rater)r
�lines�stater)�line�iZnumbersrrrrQsj








 �
zRobotFileParser.parsecCs�|jr
dS|jrdS|jsdStj�tj�|��}tj�dd|j|j	|j
|jf�}tj�|�}|sfd}|j
D]}|�|�rl|�|�Sql|jr�|j�|�SdS)NFTrr.)rr	rrrrr5�
urlunparserZparamsZqueryZfragment�quoter�
applies_to�	allowancer)r
�	useragentrZ
parsed_urlr)rrr�	can_fetch�s*�

zRobotFileParser.can_fetchcCs>|��sdS|jD]}|�|�r|jSq|jr:|jjSdSr)rrrBr:r�r
rDr)rrr�crawl_delay�s

zRobotFileParser.crawl_delaycCs>|��sdS|jD]}|�|�r|jSq|jr:|jjSdSr)rrrBr;rrFrrr�request_rate�s

zRobotFileParser.request_ratecCs|js
dS|jSr)rrrrr�	site_maps�szRobotFileParser.site_mapscCs,|j}|jdk	r||jg}d�tt|��S)Nz

)rr�join�map�str)r
rrrr�__str__�s
zRobotFileParser.__str__N)r)�__name__�
__module__�__qualname__rrrr
rr*rrErGrHrIrMrrrrrs
		
	I

c@s$eZdZdd�Zdd�Zdd�ZdS)r7cCs<|dkr|sd}tj�tj�|��}tj�|�|_||_dS)NrT)rrr@rrArrC)r
rrCrrrr�s
zRuleLine.__init__cCs|jdkp|�|j�Sr%)r�
startswith)r
�filenamerrrrB�szRuleLine.applies_tocCs|jr
dndd|jS)NZAllowZDisallowz: )rCrrrrrrM�szRuleLine.__str__N)rNrOrPrrBrMrrrrr7�sr7c@s,eZdZdd�Zdd�Zdd�Zdd�Zd	S)
r/cCsg|_g|_d|_d|_dSr)r'r6r:r;rrrrr�szEntry.__init__cCs�g}|jD]}|�d|���q
|jdk	r<|�d|j���|jdk	rf|j}|�d|j�d|j���|�tt|j	��d�
|�S)NzUser-agent: z
Crawl-delay: zRequest-rate: r.�
)r'r(r:r;ZrequestsZseconds�extendrKrLr6rJ)r
Zret�agentZraterrrrM�s


z
Entry.__str__cCsF|�d�d��}|jD](}|dkr*dS|��}||krdSqdS)Nr.rr&TF)r2r4r')r
rDrUrrrrB�s
zEntry.applies_tocCs$|jD]}|�|�r|jSqdS)NT)r6rBrC)r
rRr>rrrrC
s

zEntry.allowanceN)rNrOrPrrMrBrCrrrrr/�s
r/)
�collectionsZurllib.parserZurllib.request�__all__�
namedtuplerrr7r/rrrr�<module>
sBparse.cpython-38.pyc000064400000107252151733313270010322 0ustar00U

&�.e���@s�dZddlZddlZddlZddlZddlZddddddd	d
ddd
ddddddddddgZddddddddd d!d"d#d$d%d&d'd(d)d*gZdddddd+dddd"d d!d,d#d$d%d-d'd(d&d.d/d0d)d*gZddd1d#ddd d!d$d%d2d3d"d&d4gZ	dd1d5d6d+ddd,d2d3g
Z
ddddd d!d"dd$d%d2d3gZddd1ddd6ddd d!d,dd#g
Zd7Z
d8Zd9d:d;gZd<ZiZd=d>�Zd?Zd@ZdAdB�ZeefdCdD�ZeefdEdF�ZdGdH�ZGdIdJ�dJe�ZGdKdL�dLe�ZGdMdN�dNe�ZGdOdP�dPee�ZGdQdR�dRee�ZddSlmZeddT�Z eddU�Z!eddV�Z"dWe _dXe j#_dYe j$_dZe!_d[e!j%_d\e!j&_d]e!j'_d^e!j(_d_e!j$_d`e"_e!j%je"j%_e!j&je"j&_e!j'je"j'_dae"j)_e!j(je"j(_e!j$je"j$_eZ*Gdbd�de e�Z+Gdcd�de!e�Z,Gddd�de"e�Z-Gded�de e�Z.Gdfd�de!e�Z/Gdgd�de"e�Z0dhdi�Z1e1�[1d�dkd�Z2dldm�Z3d�dndo�Z4dpdq�Z5drds�Z6d�dtd�Z7dud�Z8dvd�Z9d�dwd�Z:dxd�Z;dyZ<da=dzd�Z>e�?d{�Z@d�d~d�ZAd�d�d
�ZBGd�d��d�eC�ZDd�ZEdaFd�d�d�ZGd�d�d�ZHeId��ZJeKeJ�ZLiZMGd�d��d�ejN�ZOd�d�d�ZPd�d�d
�ZQd�d�d�ZRddddeQfd�d	�ZSd�d��ZTd�d��ZUd�d��ZVd�d��ZWdaXd�d��ZYd�d��ZZda[d�d��Z\d�d��Z]d�d��Z^d�d��Z_d�d��Z`d�d��Zadabd�d��Zcd�d�d��Zdd�d�d��Zed�d��Zfd�d��Zgd�d��Zhd�d��Zid�d��Zjd�d��Zkd�d��Zld�d��ZmdS)�a3Parse (absolute and relative) URLs.

urlparse module is based upon the following RFC specifications.

RFC 3986 (STD66): "Uniform Resource Identifiers" by T. Berners-Lee, R. Fielding
and L.  Masinter, January 2005.

RFC 2732 : "Format for Literal IPv6 Addresses in URL's by R.Hinden, B.Carpenter
and L.Masinter, December 1999.

RFC 2396:  "Uniform Resource Identifiers (URI)": Generic Syntax by T.
Berners-Lee, R. Fielding, and L. Masinter, August 1998.

RFC 2368: "The mailto URL scheme", by P.Hoffman , L Masinter, J. Zawinski, July 1998.

RFC 1808: "Relative Uniform Resource Locators", by R. Fielding, UC Irvine, June
1995.

RFC 1738: "Uniform Resource Locators (URL)" by T. Berners-Lee, L. Masinter, M.
McCahill, December 1994

RFC 3986 is considered the current standard and any future changes to
urlparse module should conform with it.  The urlparse module is
currently not entirely compliant with this RFC due to defacto
scenarios for parsing, and for backward compatibility purposes, some
parsing quirks from older RFCs are retained. The testcases in
test_urlparse.py provides a good indicator of parsing behavior.

The WHATWG URL Parser spec should also be considered.  We are not compliant with
it either due to existing user code API behavior expectations (Hyrum's Law).
It serves as a useful guide when making changes.
�N�urlparse�
urlunparse�urljoin�	urldefrag�urlsplit�
urlunsplit�	urlencode�parse_qs�	parse_qsl�quote�
quote_plus�quote_from_bytes�unquote�unquote_plus�unquote_to_bytes�DefragResult�ParseResult�SplitResult�DefragResultBytes�ParseResultBytes�SplitResultBytes�Zftp�httpZgopherZnntpZimapZwais�fileZhttpsZshttpZmmsZprosperoZrtspZrtspuZsftpZsvnzsvn+sshZwsZwssZtelnetZsnewsZrsyncZnfsZgitzgit+sshZhdlZsipZsipsZtelZmailtoZnewszAabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+-.z!	

 �	�
�
�cCst��t��dS)z,Clear the parse cache and the quoters cache.N)�_parse_cache�clear�
_safe_quoters�r!r!�$/usr/lib64/python3.8/urllib/parse.py�clear_cache`sr#�ascii�strictcCs|S�Nr!)�objr!r!r"�_nooposr(cCs|�||�Sr&��encode)r'�encoding�errorsr!r!r"�_encode_resultrsr-cst��fdd�|D��S)Nc3s"|]}|r|����ndVqdS)rN��decode��.0�x�r+r,r!r"�	<genexpr>xsz_decode_args.<locals>.<genexpr>)�tuple)�argsr+r,r!r3r"�_decode_argsvsr7cGsVt|dt�}|dd�D]}|rt|t�|krtd��q|rH|tfSt|�tfS)Nr�z$Cannot mix str and non-str arguments)�
isinstance�str�	TypeErrorr(r7r-)r6Z	str_input�argr!r!r"�_coerce_argszs

r=c@seZdZdZdZddd�ZdS)	�_ResultMixinStrz>Standard approach to encoding parsed results from str to bytesr!r$r%cs|j��fdd�|D��S)Nc3s|]}|����VqdSr&r)r0r3r!r"r4�sz)_ResultMixinStr.encode.<locals>.<genexpr>)�_encoded_counterpart��selfr+r,r!r3r"r*�sz_ResultMixinStr.encodeN)r$r%)�__name__�
__module__�__qualname__�__doc__�	__slots__r*r!r!r!r"r>�sr>c@seZdZdZdZddd�ZdS)	�_ResultMixinBytesz>Standard approach to decoding parsed results from bytes to strr!r$r%cs|j��fdd�|D��S)Nc3s|]}|����VqdSr&r.r0r3r!r"r4�sz+_ResultMixinBytes.decode.<locals>.<genexpr>)�_decoded_counterpartr@r!r3r"r/�sz_ResultMixinBytes.decodeN)r$r%)rBrCrDrErFr/r!r!r!r"rG�srGc@sDeZdZdZdZedd��Zedd��Zedd��Zed	d
��Z	dS)�_NetlocResultMixinBasezHShared methods for the parsed result objects containing a netloc elementr!cCs
|jdS)Nr��	_userinfo�rAr!r!r"�username�sz_NetlocResultMixinBase.usernamecCs
|jdS)Nr8rJrLr!r!r"�password�sz_NetlocResultMixinBase.passwordcCsD|jd}|sdSt|t�r dnd}|�|�\}}}|��||S)Nr�%�%)�	_hostinfor9r:�	partition�lower)rA�hostname�	separatorZpercentZzoner!r!r"rT�s
z_NetlocResultMixinBase.hostnamecCsl|jd}|dk	rhzt|d�}Wn(tk
rHd|��}t|�d�YnXd|kr^dkshntd��|S)Nr8�
z+Port could not be cast to integer value as ri��zPort out of range 0-65535)rQ�int�
ValueError)rA�port�messager!r!r"rY�s

z_NetlocResultMixinBase.portN)
rBrCrDrErF�propertyrMrNrTrYr!r!r!r"rI�s



rIc@s(eZdZdZedd��Zedd��ZdS)�_NetlocResultMixinStrr!cCsD|j}|�d�\}}}|r4|�d�\}}}|s<d}nd}}||fS)N�@�:��netloc�
rpartitionrR�rAr`ZuserinfoZ	have_info�hostinforMZ
have_passwordrNr!r!r"rK�sz_NetlocResultMixinStr._userinfocCsl|j}|�d�\}}}|�d�\}}}|rL|�d�\}}}|�d�\}}}n|�d�\}}}|sdd}||fS)Nr]�[�]r^r_�rAr`�_rcZhave_open_brZ	bracketedrTrYr!r!r"rQ�sz_NetlocResultMixinStr._hostinfoN�rBrCrDrFr[rKrQr!r!r!r"r\�s

r\c@s(eZdZdZedd��Zedd��ZdS)�_NetlocResultMixinBytesr!cCsD|j}|�d�\}}}|r4|�d�\}}}|s<d}nd}}||fS)N�@�:r_rbr!r!r"rK�sz!_NetlocResultMixinBytes._userinfocCsl|j}|�d�\}}}|�d�\}}}|rL|�d�\}}}|�d�\}}}n|�d�\}}}|sdd}||fS)Nrj�[�]rkr_rfr!r!r"rQ�sz!_NetlocResultMixinBytes._hostinfoNrhr!r!r!r"ri�s

ri)�
namedtuplezurl fragmentz!scheme netloc path query fragmentz(scheme netloc path params query fragmentz�
DefragResult(url, fragment)

A 2-tuple that contains the url without fragment identifier and the fragment
identifier as a separate argument.
z$The URL with no fragment identifier.z�
Fragment identifier separated from URL, that allows indirect identification of a
secondary resource by reference to a primary resource and additional identifying
information.
z�
SplitResult(scheme, netloc, path, query, fragment)

A 5-tuple that contains the different components of a URL. Similar to
ParseResult, but does not split params.
z%Specifies URL scheme for the request.z0
Network location where the request is made to.
z@
The hierarchical path, such as the path to a file to download.
z�
The query component, that contains non-hierarchical data, that along with data
in path component, identifies a resource in the scope of URI's scheme and
network location.
z�
Fragment identifier, that allows indirect identification of a secondary resource
by reference to a primary resource and additional identifying information.
zq
ParseResult(scheme, netloc, path, params, query, fragment)

A 6-tuple that contains components of a parsed URL.
z�
Parameters for last path element used to dereference the URI in order to provide
access to perform some operation on the resource.
c@seZdZdZdd�ZdS)rr!cCs |jr|jd|jS|jSdS)N�#��fragment�urlrLr!r!r"�geturlIszDefragResult.geturlN�rBrCrDrFrsr!r!r!r"rGsc@seZdZdZdd�ZdS)rr!cCst|�Sr&�rrLr!r!r"rsQszSplitResult.geturlNrtr!r!r!r"rOsc@seZdZdZdd�ZdS)rr!cCst|�Sr&�rrLr!r!r"rsVszParseResult.geturlNrtr!r!r!r"rTsc@seZdZdZdd�ZdS)rr!cCs |jr|jd|jS|jSdS)N�#rprLr!r!r"rs\szDefragResultBytes.geturlNrtr!r!r!r"rZsc@seZdZdZdd�ZdS)rr!cCst|�Sr&rurLr!r!r"rsdszSplitResultBytes.geturlNrtr!r!r!r"rbsc@seZdZdZdd�ZdS)rr!cCst|�Sr&rvrLr!r!r"rsiszParseResultBytes.geturlNrtr!r!r!r"rgscCs4ttfttfttff}|D]\}}||_||_qdSr&)rrrrrrr?rH)Z
_result_pairsZ_decodedZ_encodedr!r!r"�_fix_result_transcodingms�rxTc
Csft||�\}}}t|||�}|\}}}}}|tkrHd|krHt|�\}}nd}t||||||�}	||	�S)a#Parse a URL into 6 components:
    <scheme>://<netloc>/<path>;<params>?<query>#<fragment>
    Return a 6-tuple: (scheme, netloc, path, params, query, fragment).
    Note that we don't break the components up in smaller bits
    (e.g. netloc is a single string) and we don't expand % escapes.�;r)r=r�uses_params�_splitparamsr)
rr�scheme�allow_fragments�_coerce_resultZsplitresultr`�queryrq�params�resultr!r!r"rzscCsRd|kr,|�d|�d��}|dkr6|dfSn
|�d�}|d|�||dd�fS)N�/ryrrr8)�find�rfind)rr�ir!r!r"r{�s

r{cCsHt|�}dD]"}|�||�}|dkrt||�}q|||�||d�fS)Nz/?#r)�lenr��min)rr�start�delim�cZwdelimr!r!r"�_splitnetloc�sr�cCs�|r|��rdSddl}|�dd�}|�dd�}|�dd�}|�dd�}|�d|�}||kr`dSdD] }||krdtd	|d
d��qddS)Nrr]rr^ro�?�NFKCz/?#@:znetloc 'z' contains invalid z#characters under NFKC normalization)�isascii�unicodedata�replace�	normalizerX)r`r��nZnetloc2r�r!r!r"�_checknetloc�s�r�cCstD]}|�|d�}q|S)Nr)�_UNSAFE_URL_BYTES_TO_REMOVEr�)rr�br!r!r"�_remove_unsafe_bytes_from_url�sr�c
Cs�t||�\}}}t|�}t|�}|�t�}|�t�}t|�}|||t|�t|�f}t�|d�}|rj||�St	t�t
kr|t�d}}}|�d�}	|	dk�r�|d|	�dk�rn||	dd�}|dd�dk�rt
|d�\}}d	|kr�d
|k�sd
|k�rd	|k�rtd��|�r,d|k�r,|�dd�\}}d
|k�rF|�d
d�\}}t|�td||||�}
|
t|<||
�S|d|	�D]}|tk�rz�qҐqz||	dd�}|�r�tdd�|D���r�|d|	���|}}|dd�dk�r"t
|d�\}}d	|k�rd
|k�sd
|k�r"d	|k�r"td��|�rBd|k�rB|�dd�\}}d
|k�r\|�d
d�\}}t|�t|||||�}
|
t|<||
�S)aParse a URL into 5 components:
    <scheme>://<netloc>/<path>?<query>#<fragment>
    Return a 5-tuple: (scheme, netloc, path, query, fragment).
    Note that we don't break the components up in smaller bits
    (e.g. netloc is a single string) and we don't expand % escapes.Nrr^rrr8��//rdrezInvalid IPv6 URLror�css|]}|dkVqdS)�
0123456789Nr!�r1r�r!r!r"r4�szurlsplit.<locals>.<genexpr>)r=r��lstrip�_WHATWG_C0_CONTROL_OR_SPACE�strip�bool�typer�getr��MAX_CACHE_SIZEr#r�r�rX�splitr�r�scheme_chars�anyrS)
rrr|r}r~�key�cachedr`rrqr��vr��restr!r!r"r�sn



��


��
cCs<t|�\}}}}}}}|r&d||f}|t|||||f��S)z�Put a parsed URL back together again.  This may result in a
    slightly different, but equivalent URL, if the URL that was parsed
    originally had redundant delimiters, e.g. a ? with an empty query
    (the draft states that these are equivalent).z%s;%s)r=r)�
componentsr|r`rrr�rrqr~r!r!r"r�s
�cCs�t|�\}}}}}}|s4|r`|tkr`|dd�dkr`|rP|dd�dkrPd|}d|pXd|}|rp|d|}|r�|d|}|r�|d	|}||�S)
akCombine the elements of a tuple as returned by urlsplit() into a
    complete URL as a string. The data argument can be any five-item iterable.
    This may result in a slightly different, but equivalent URL, if the URL that
    was parsed originally had unnecessary delimiters (for example, a ? with an
    empty query; the RFC states that these are equivalent).Nr�r�r8r�rr^r�ro)r=�uses_netloc)r�r|r`rrrrqr~r!r!r"r�s� c	Cs�|s|S|s|St||�\}}}t|d|�\}}}}}}	t|||�\}
}}}
}}|
|ks`|
tkrh||�S|
tkr�|r�|t|
|||
||f��S|}|s�|
s�|}|}
|s�|}|t|
|||
||f��S|�d�}|ddkr�|d=|dd�dkr�|�d�}n(||�d�}td|dd��|dd�<g}|D]P}|dk�r\z|��Wntk
�rXYnXn|dk�rl�q(n
|�	|��q(|ddk�r�|�	d�|t|
|d�
|��p�d|
||f��S)	zaJoin a base URL and a possibly relative URL to form an absolute
    interpretation of the latter.rr����Nr8�..�.)r�r�)r=r�
uses_relativer�rr��filter�pop�
IndexError�append�join)�baserrr}r~ZbschemeZbnetlocZbpathZbparamsZbqueryZ	bfragmentr|r`�pathr�rrqZ
base_partsZsegmentsZ
resolved_pathZsegr!r!r"rsp
�
�
�
�



��c	CsTt|�\}}d|kr>t|�\}}}}}}t|||||df�}nd}|}|t||��S)z�Removes any existing fragment from URL.

    Returns a tuple of the defragmented URL and the fragment.  If
    the URL contained no fragments, the second element is the
    empty string.
    ror)r=rrr)	rrr~�sr��p�a�qZfragZdefragr!r!r"rTsZ0123456789ABCDEFabcdefc	Cs�|s|jdSt|t�r"|�d�}|�d�}t|�dkr<|S|dg}|j}tdkrbdd�tD�a|dd�D]R}z(|t|dd	��||d	d��Wqntk
r�|d�||�YqnXqnd�	|�S)
z,unquote_to_bytes('abc%20def') -> b'abc def'.��utf-8rPr8rNcSs.i|]&}tD]}||��t�||��qqSr!)�_hexdigr*�bytes�fromhex)r1r�r�r!r!r"�
<dictcomp>zs
�
z$unquote_to_bytes.<locals>.<dictcomp>r�)
r�r9r:r*r�r��
_hextobyter��KeyErrorr�)�string�bits�resr��itemr!r!r"rgs,



�z([-]+)r�r�cCs�t|t�rtd��d|kr$|j|S|dkr0d}|dkr<d}t�|�}|dg}|j}tdt|�d�D],}|t||��	||��|||d�qfd	�
|�S)
a�Replace %xx escapes by their single-character equivalent. The optional
    encoding and errors parameters specify how to decode percent-encoded
    sequences into Unicode characters, as accepted by the bytes.decode()
    method.
    By default, percent-encoded sequences are decoded with UTF-8, and invalid
    sequences are replaced by a placeholder character.

    unquote('abc%20def') -> 'abc def'.
    zExpected str, got bytesrONr�r�rr8r�r)r9r�r;r��_asciirer��ranger�rr/r�)r�r+r,r�r�r�r�r!r!r"r�s 



Fc	CsNi}t|||||||d�}|D]*\}	}
|	|kr>||	�|
�q|
g||	<q|S)aXParse a query given as a string argument.

        Arguments:

        qs: percent-encoded query string to be parsed

        keep_blank_values: flag indicating whether blank values in
            percent-encoded queries should be treated as blank strings.
            A true value indicates that blanks should be retained as
            blank strings.  The default false value indicates that
            blank values are to be ignored and treated as if they were
            not included.

        strict_parsing: flag indicating what to do with parsing errors.
            If false (the default), errors are silently ignored.
            If true, errors raise a ValueError exception.

        encoding and errors: specify how to decode percent-encoded sequences
            into Unicode characters, as accepted by the bytes.decode() method.

        max_num_fields: int. If set, then throws a ValueError if there
            are more than n fields read by parse_qsl().

        separator: str. The symbol to use for separating the query arguments.
            Defaults to &.

        Returns a dictionary.
    )r+r,�max_num_fieldsrU)r
r�)�qs�keep_blank_values�strict_parsingr+r,r�rUZ
parsed_result�pairs�name�valuer!r!r"r	�s�c@seZdZdZdS)�_QueryStringSeparatorWarningz>Warning for using default `separator` in parse_qs or parse_qslN)rBrCrDrEr!r!r!r"r��sr�z/etc/python/urllib.cfgc	Cs�t|�\}}t|t�r |�d�}|r2t|ttf�sB|dk	rBtd��t�}|dk�rRt}d}	|dkrrtj	�
|	�}d}
|dkr�ztt�}Wnt
k
r�YnJX|�:ddl}|jddd�}
|
�|�|
j
d	|	dd
�}|aW5QRXt}
|dk�rd|k�rddlm}|d
tdd�d}n:|dk�r(|}n*t|�dk�rRt|	�d|
�d�dd��|dk	�r�||k�r�d|�d�|�d�}nd|�|�}||k�r�td��||k�r�dd�|�d�D�}ndd�|�|�D�}g}|D]�}|�s�|�s�q�|�dd�}t|�dk�r4|�rtd|f��|�r�|�d�n�q�t|d��sH|�r�|d�dd�}t|||d �}||�}|d�dd�}t|||d �}||�}|�||f��q�|S)!aXParse a query given as a string argument.

        Arguments:

        qs: percent-encoded query string to be parsed

        keep_blank_values: flag indicating whether blank values in
            percent-encoded queries should be treated as blank strings.
            A true value indicates that blanks should be retained as blank
            strings.  The default false value indicates that blank values
            are to be ignored and treated as if they were  not included.

        strict_parsing: flag indicating what to do with parsing errors. If
            false (the default), errors are silently ignored. If true,
            errors raise a ValueError exception.

        encoding and errors: specify how to decode percent-encoded sequences
            into Unicode characters, as accepted by the bytes.decode() method.

        max_num_fields: int. If set, then throws a ValueError
            if there are more than n fields read by parse_qsl().

        separator: str. The symbol to use for separating the query arguments.
            Defaults to &.

        Returns a list, as G-d intended.
    r$Nz*Separator must be of type string or bytes.ZPYTHON_URLLIB_QS_SEPARATORzenvironment variabler)ro)Z
interpolationZcomment_prefixesr	)Zfallbackry)�warnaThe default separator of urllib.parse.parse_qsl and parse_qs was changed to '&' to avoid a web cache poisoning issue (CVE-2021-23336). By default, semicolons no longer act as query field separators. See https://access.redhat.com/articles/5860431 for more details.r���
stacklevel�&Zlegacyr8z (from z) must contain z1 character, or "legacy". See z<https://access.redhat.com/articles/5860431 for more details.zMax number of fields exceededcSs g|]}|�d�D]}|�qqS)ry�r�)r1�s1�s2r!r!r"�
<listcomp>7szparse_qsl.<locals>.<listcomp>cSsg|]}|�qSr!r!)r1r�r!r!r"r�9s�=zbad query field: %rr�+� r3)r=r9r�r/r:rX�object�_default_qs_separator�os�environr��open�_QS_SEPARATOR_CONFIG_FILENAME�FileNotFoundError�configparserZConfigParserZ	read_file�warningsr�r�r��countr�r�r�r)r�r�r�r+r,r�rUr~Z_legacyZenvvar_nameZ
config_sourcerr�Zconfigr��
num_fieldsr��rZ
name_valueZnvr�r�r!r!r"r
�s�


�


�
���	



cCs|�dd�}t|||�S)z�Like unquote(), but also replace plus signs by spaces, as required for
    unquoting HTML form values.

    unquote_plus('%7e/abc+def') -> '~/abc def'
    r�r�)r�r)r�r+r,r!r!r"rQssBABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_.-~c@s(eZdZdZdd�Zdd�Zdd�ZdS)	�Quoterz�A mapping from bytes (in range(0,256)) to strings.

    String values are percent-encoded byte values, unless the key < 128, and
    in the "safe" set (either the specified safe set, or default set).
    cCst�|�|_dS)zsafe: bytes object.N)�_ALWAYS_SAFE�union�safe)rAr�r!r!r"�__init__iszQuoter.__init__cCsd|jjt|�fS)Nz<%s %r>)�	__class__rB�dictrLr!r!r"�__repr__mszQuoter.__repr__cCs(||jkrt|�nd�|�}|||<|S)Nz%{:02X})r��chr�format)rAr�r�r!r!r"�__missing__qszQuoter.__missing__N)rBrCrDrEr�r�r�r!r!r!r"r�asr�r�cCsbt|t�r8|s|S|dkrd}|dkr*d}|�||�}n |dk	rHtd��|dk	rXtd��t||�S)a�quote('abc def') -> 'abc%20def'

    Each part of a URL, e.g. the path info, the query, etc., has a
    different set of reserved characters that must be quoted. The
    quote function offers a cautious (not minimal) way to quote a
    string for most of these parts.

    RFC 3986 Uniform Resource Identifier (URI): Generic Syntax lists
    the following (un)reserved characters.

    unreserved    = ALPHA / DIGIT / "-" / "." / "_" / "~"
    reserved      = gen-delims / sub-delims
    gen-delims    = ":" / "/" / "?" / "#" / "[" / "]" / "@"
    sub-delims    = "!" / "$" / "&" / "'" / "(" / ")"
                  / "*" / "+" / "," / ";" / "="

    Each of the reserved characters is reserved in some component of a URL,
    but not necessarily in all of them.

    The quote function %-escapes all characters that are neither in the
    unreserved chars ("always safe") nor the additional chars set via the
    safe arg.

    The default for the safe arg is '/'. The character is reserved, but in
    typical usage the quote function is being called on a path where the
    existing slash characters are to be preserved.

    Python 3.7 updates from using RFC 2396 to RFC 3986 to quote URL strings.
    Now, "~" is included in the set of unreserved characters.

    string and safe may be either str or bytes objects. encoding and errors
    must not be specified if string is a bytes object.

    The optional encoding and errors parameters specify how to deal with
    non-ASCII characters, as accepted by the str.encode method.
    By default, encoding='utf-8' (characters are encoded with UTF-8), and
    errors='strict' (unsupported characters raise a UnicodeEncodeError).
    Nr�r%z,quote() doesn't support 'encoding' for bytesz*quote() doesn't support 'errors' for bytes)r9r:r*r;r
)r�r�r+r,r!r!r"rws'
cCsdt|t�rd|ks$t|t�r2d|kr2t||||�St|t�rBd}nd}t|||||�}|�dd�S)z�Like quote(), but also replace ' ' with '+', as required for quoting
    HTML form values. Plus signs in the original string are escaped unless
    they are included in safe. It also does not have safe default to '/'.
    r�� r�)r9r:r�rr�)r�r�r+r,Zspacer!r!r"r�s��
cs�t|ttf�std��|sdSt|t�r6|�dd�}ntdd�|D��}|�t|�s^|��Szt	|�Wn&t
k
r�t|�jt	|<�YnXd�
�fdd�|D��S)z�Like quote(), but accepts a bytes object rather than a str, and does
    not perform string-to-bytes encoding.  It always returns an ASCII string.
    quote_from_bytes(b'abc def?') -> 'abc%20def%3f'
    z!quote_from_bytes() expected bytesrr$�ignorecSsg|]}|dkr|�qS)�r!r�r!r!r"r��sz$quote_from_bytes.<locals>.<listcomp>csg|]}�|��qSr!r!)r1�char�Zquoterr!r"r��s)r9r��	bytearrayr;r:r*�rstrip�_ALWAYS_SAFE_BYTESr/r r�r��__getitem__r�)Zbsr�r!r�r"r
�s
c	Cst|d�r|��}nPzt|�r0t|dt�s0t�Wn0tk
rbt��\}}}td��|��YnXg}	|s�|D]j\}
}t|
t	�r�||
|�}
n|t
|
�|||�}
t|t	�r�|||�}n|t
|�|||�}|	�|
d|�qp�n"|D�]\}
}t|
t	��r||
|�}
n|t
|
�|||�}
t|t	��rB|||�}|	�|
d|�q�t|t
��rp|||||�}|	�|
d|�q�zt|�}Wn:tk
�r�|t
|�|||�}|	�|
d|�Yq�X|D]B}
t|
t	��r�||
|�}
n|t
|
�|||�}
|	�|
d|
��q�q�d�|	�S)a^Encode a dict or sequence of two-element tuples into a URL query string.

    If any values in the query arg are sequences and doseq is true, each
    sequence element is converted to a separate parameter.

    If the query arg is a sequence of two-element tuples, the order of the
    parameters in the output will match the order of parameters in the
    input.

    The components of a query arg may each be either a string or a bytes type.

    The safe, encoding, and errors parameters are passed down to the function
    specified by quote_via (encoding and errors only if a component is a str).
    �itemsrz1not a valid non-string sequence or mapping objectr�r�)
�hasattrr�r�r9r5r;�sys�exc_info�with_tracebackr�r:r�r�)rZdoseqr�r+r,Z	quote_viaZtyZva�tb�l�kr�r2Zeltr!r!r"r�sR

�



cCstjdtdd�t|�S)Nz/urllib.parse.to_bytes() is deprecated as of 3.8r�r�)r�r��DeprecationWarning�	_to_bytes�rrr!r!r"�to_bytes%s
�rcCsJt|t�rFz|�d���}Wn(tk
rDtdt|�d��YnX|S)zto_bytes(u"URL") --> 'URL'.�ASCIIzURL z contains non-ASCII characters)r9r:r*r/�UnicodeError�reprrr!r!r"r+s
�rcCs`t|���}|dd�dkr<|dd�dkr<|dd���}|dd�dkr\|dd���}|S)z�Transform a string like '<URL:scheme://host/path>' into 'scheme://host/path'.

    The string is returned unchanged if it's not a wrapped URL.
    Nr8�<r��>�zURL:)r:r�rr!r!r"�unwrap9s r
cCstjdtdd�t|�S)NzUurllib.parse.splittype() is deprecated as of 3.8, use urllib.parse.urlparse() insteadr�r�)r�r�r�
_splittyperr!r!r"�	splittypeFs
�rcCsDtdkrt�dtj�at�|�}|r<|��\}}|��|fSd|fS)z:splittype('type:opaquestring') --> 'type', 'opaquestring'.Nz
([^/:]+):(.*))�	_typeprog�re�compile�DOTALL�match�groupsrS)rrrr|�datar!r!r"rNs
rcCstjdtdd�t|�S)NzUurllib.parse.splithost() is deprecated as of 3.8, use urllib.parse.urlparse() insteadr�r�)r�r�r�
_splithostrr!r!r"�	splithost[s
�rcCsXtdkrt�dtj�at�|�}|rP|��\}}|rH|ddkrHd|}||fSd|fS)z;splithost('//host[:port]/path') --> 'host[:port]', '/path'.Nz//([^/#?]*)(.*)rr�)�	_hostprogrrrrr)rrrZ	host_portr�r!r!r"rcs
rcCstjdtdd�t|�S)NzUurllib.parse.splituser() is deprecated as of 3.8, use urllib.parse.urlparse() insteadr�r�)r�r�r�
_splituser��hostr!r!r"�	splituserrs
�rcCs |�d�\}}}|r|nd|fS)zJsplituser('user[:passwd]@host[:port]') --> 'user[:passwd]', 'host[:port]'.r]N�ra)r�userr�r!r!r"rysrcCstjdtdd�t|�S)NzWurllib.parse.splitpasswd() is deprecated as of 3.8, use urllib.parse.urlparse() insteadr�r�)r�r�r�_splitpasswd)rr!r!r"�splitpasswds
�r!cCs |�d�\}}}||r|ndfS)z/splitpasswd('user:passwd') -> 'user', 'passwd'.r^N�rR)rr�Zpasswdr!r!r"r �sr cCstjdtdd�t|�S)NzUurllib.parse.splitport() is deprecated as of 3.8, use urllib.parse.urlparse() insteadr�r�)r�r�r�
_splitportrr!r!r"�	splitport�s
�r$cCsDtdkrt�dtj�at�|�}|r<|��\}}|r<||fS|dfS)z*splitport('host:port') --> 'host', 'port'.Nz
(.*):([0-9]*))�	_portprogrrr�	fullmatchr)rrrYr!r!r"r#�s
r#r�cCstjdtdd�t||�S)NzVurllib.parse.splitnport() is deprecated as of 3.8, use urllib.parse.urlparse() insteadr�r�)r�r�r�_splitnport)r�defportr!r!r"�
splitnport�s
�r)cCsT|�d�\}}}|s|}n2|rLzt|�}Wntk
rBd}YnX||fS||fS)z�Split host and port, returning numeric port.
    Return given default port if no ':' found; defaults to -1.
    Return numerical port if a valid number are found after ':'.
    Return None if ':' but not a valid number.r^N)rarWrX)rr(r�rYZnportr!r!r"r'�s
r'cCstjdtdd�t|�S)NzVurllib.parse.splitquery() is deprecated as of 3.8, use urllib.parse.urlparse() insteadr�r�)r�r�r�_splitqueryrr!r!r"�
splitquery�s
�r+cCs$|�d�\}}}|r||fS|dfS)z/splitquery('/path?query') --> '/path', 'query'.r�Nr)rrr�r�rr!r!r"r*�sr*cCstjdtdd�t|�S)NzTurllib.parse.splittag() is deprecated as of 3.8, use urllib.parse.urlparse() insteadr�r�)r�r�r�	_splittagrr!r!r"�splittag�s
�r-cCs$|�d�\}}}|r||fS|dfS)z)splittag('/path#tag') --> '/path', 'tag'.roNr)rrr�r��tagr!r!r"r,�sr,cCstjdtdd�t|�S)NzUurllib.parse.splitattr() is deprecated as of 3.8, use urllib.parse.urlparse() insteadr�r�)r�r�r�
_splitattrrr!r!r"�	splitattr�s
�r0cCs|�d�}|d|dd�fS)zksplitattr('/path;attr1=value1;attr2=value2;...') ->
        '/path', ['attr1=value1', 'attr2=value2', ...].ryrr8Nr�)rrZwordsr!r!r"r/�s
r/cCstjdtdd�t|�S)NzWurllib.parse.splitvalue() is deprecated as of 3.8, use urllib.parse.parse_qsl() insteadr�r�)r�r�r�_splitvalue)�attrr!r!r"�
splitvalue�s
�r3cCs |�d�\}}}||r|ndfS)z-splitvalue('attr=value') --> 'attr', 'value'.r�Nr")r2r�r�r!r!r"r1�sr1)rT)r)rT)T)r�r�)FFr�r�NN)FFr�r�NN)r�r�)r�NN)rNN)r�)r�)r�)nrErr�r��collectionsr��__all__r�r�rzZnon_hierarchicalZ
uses_queryZ
uses_fragmentr�r�r�r�rr#Z_implicit_encodingZ_implicit_errorsr(r-r7r=r�r>rGrIr\rirnZ_DefragResultBaseZ_SplitResultBaseZ_ParseResultBaserrrqr|r`r�rr�Z
ResultBaserrrrrrrxrr{r�r�r�rrrrrr�r�rrr�rr	�RuntimeWarningr�r�r�r
r�	frozensetr�r�r�r �defaultdictr�rrr
rrrr
rrrrrrrrr!r r$r%r#r)r'r+r*r-r,r0r/r3r1r!r!r!r"�<module>s�!�������
�
�
%
��

	

?
E

�
)�
}
	
6

�
Q



response.cpython-38.opt-1.pyc000064400000006333151733313270012003 0ustar00U

e5d��@s^dZddlZddddgZGdd�dej�ZGdd�de�ZGd	d�de�ZGd
d�de�ZdS)aResponse classes used by urllib.

The base class, addbase, defines a minimal file-like interface,
including read() and readline().  The typical response object is an
addinfourl instance, which defines an info() method that returns
headers and a geturl() method that returns the url.
�N�addbase�addclosehook�addinfo�
addinfourlcs8eZdZdZ�fdd�Zdd�Zdd�Zdd	�Z�ZS)
rzOBase class for addinfo and addclosehook. Is a good idea for garbage collection.cs tt|�j|ddd�||_dS)Nz<urllib response>F)�delete)�superr�__init__�fp)�selfr	��	__class__��'/usr/lib64/python3.8/urllib/response.pyrszaddbase.__init__cCsd|jjt|�|jfS)Nz<%s at %r whose fp = %r>)r�__name__�id�file�r
r
r
r�__repr__s�zaddbase.__repr__cCs|jjrtd��|S)NzI/O operation on closed file)r	�closed�
ValueErrorrr
r
r�	__enter__szaddbase.__enter__cCs|��dS�N)�close)r
�type�value�	tracebackr
r
r�__exit__!szaddbase.__exit__)	r�
__module__�__qualname__�__doc__rrrr�
__classcell__r
r
rrrs
cs,eZdZdZ�fdd�Z�fdd�Z�ZS)rz*Class to add a close hook to an open file.cs tt|��|�||_||_dSr)rrr�	closehook�hookargs)r
r	r!r"rr
rr(szaddclosehook.__init__c	s>z(|j}|j}|r&d|_d|_||�W5tt|���XdSr)rrrr!r")r
r!r"rr
rr-szaddclosehook.close)rrrrrrr r
r
rrr%scs(eZdZdZ�fdd�Zdd�Z�ZS)rz.class to add an info() method to an open file.cstt|��|�||_dSr)rrr�headers)r
r	r#rr
rr<szaddinfo.__init__cCs|jSr)r#rr
r
r�info@szaddinfo.info)rrrrrr$r r
r
rrr9scs2eZdZdZd	�fdd�	Zdd�Zdd�Z�ZS)
rz9class to add info() and geturl() methods to an open file.Ncs"tt|��||�||_||_dSr)rrr�url�code)r
r	r#r%r&rr
rrGszaddinfourl.__init__cCs|jSr)r&rr
r
r�getcodeLszaddinfourl.getcodecCs|jSr)r%rr
r
r�geturlOszaddinfourl.geturl)N)rrrrrr'r(r r
r
rrrDs)rZtempfile�__all__Z_TemporaryFileWrapperrrrrr
r
r
r�<module>sparse.cpython-38.opt-2.pyc000064400000063741151733313270011266 0ustar00U

&�.e���@s�ddlZddlZddlZddlZddlZdddddddd	d
ddd
dddddddddgZdddddddddd d!d"d#d$d%d&d'd(d)gZdddddd*dddd!dd d+d"d#d$d,d&d'd%d-d.d/d(d)gZddd0d"dddd d#d$d1d2d!d%d3gZdd0d4d5d*ddd+d1d2g
Z	dddddd d!dd#d$d1d2gZ
ddd0ddd5dddd d+dd"g
Zd6Zd7Z
d8d9d:gZd;ZiZd<d=�Zd>Zd?Zd@dA�ZeefdBdC�ZeefdDdE�ZdFdG�ZGdHdI�dIe�ZGdJdK�dKe�ZGdLdM�dMe�ZGdNdO�dOee�ZGdPdQ�dQee�ZddRlmZeddS�ZeddT�Z eddU�Z!dVe_"dWej#_"dXej$_"dYe _"dZe j%_"d[e j&_"d\e j'_"d]e j(_"d^e j$_"d_e!_"e j%j"e!j%_"e j&j"e!j&_"e j'j"e!j'_"d`e!j)_"e j(j"e!j(_"e j$j"e!j$_"eZ*Gdad�dee�Z+Gdbd�de e�Z,Gdcd�de!e�Z-Gddd�dee�Z.Gded�de e�Z/Gdfd�de!e�Z0dgdh�Z1e1�[1d�djd�Z2dkdl�Z3d�dmdn�Z4dodp�Z5dqdr�Z6d�dsd�Z7dtd�Z8dud�Z9d�dvd�Z:dwd�Z;dxZ<da=dyd�Z>e�?dz�Z@d�d}d�ZAd�dd	�ZBGd�d��d�eC�ZDd�ZEdaFd�d�d
�ZGd�d�d�ZHeId��ZJeKeJ�ZLiZMGd�d��d�ejN�ZOd�d�d�ZPd�d�d�ZQd�d�d
�ZRd~dddeQfd�d�ZSd�d��ZTd�d��ZUd�d��ZVd�d��ZWdaXd�d��ZYd�d��ZZda[d�d��Z\d�d��Z]d�d��Z^d�d��Z_d�d��Z`d�d��Zadabd�d��Zcd�d�d��Zdd�d�d��Zed�d��Zfd�d��Zgd�d��Zhd�d��Zid�d��Zjd�d��Zkd�d��Zld�d��ZmdS)��N�urlparse�
urlunparse�urljoin�	urldefrag�urlsplit�
urlunsplit�	urlencode�parse_qs�	parse_qsl�quote�
quote_plus�quote_from_bytes�unquote�unquote_plus�unquote_to_bytes�DefragResult�ParseResult�SplitResult�DefragResultBytes�ParseResultBytes�SplitResultBytes�Zftp�httpZgopherZnntpZimapZwais�fileZhttpsZshttpZmmsZprosperoZrtspZrtspuZsftpZsvnzsvn+sshZwsZwssZtelnetZsnewsZrsyncZnfsZgitzgit+sshZhdlZsipZsipsZtelZmailtoZnewszAabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+-.z!	

 �	�
�
�cCst��t��dS�N)�_parse_cache�clear�
_safe_quoters�r"r"�$/usr/lib64/python3.8/urllib/parse.py�clear_cache`sr$�ascii�strictcCs|Srr")�objr"r"r#�_nooposr(cCs|�||�Sr��encode)r'�encoding�errorsr"r"r#�_encode_resultrsr-cst��fdd�|D��S)Nc3s"|]}|r|����ndVqdS)rN��decode��.0�x�r+r,r"r#�	<genexpr>xsz_decode_args.<locals>.<genexpr>)�tuple)�argsr+r,r"r3r#�_decode_argsvsr7cGsVt|dt�}|dd�D]}|rt|t�|krtd��q|rH|tfSt|�tfS)Nr�z$Cannot mix str and non-str arguments)�
isinstance�str�	TypeErrorr(r7r-)r6Z	str_input�argr"r"r#�_coerce_argszs

r=c@seZdZdZddd�ZdS)�_ResultMixinStrr"r%r&cs|j��fdd�|D��S)Nc3s|]}|����VqdSrr)r0r3r"r#r4�sz)_ResultMixinStr.encode.<locals>.<genexpr>)�_encoded_counterpart��selfr+r,r"r3r#r*�sz_ResultMixinStr.encodeN)r%r&)�__name__�
__module__�__qualname__�	__slots__r*r"r"r"r#r>�sr>c@seZdZdZddd�ZdS)�_ResultMixinBytesr"r%r&cs|j��fdd�|D��S)Nc3s|]}|����VqdSrr.r0r3r"r#r4�sz+_ResultMixinBytes.decode.<locals>.<genexpr>)�_decoded_counterpartr@r"r3r#r/�sz_ResultMixinBytes.decodeN)r%r&)rBrCrDrEr/r"r"r"r#rF�srFc@s@eZdZdZedd��Zedd��Zedd��Zedd	��Zd
S)�_NetlocResultMixinBaser"cCs
|jdS)Nr��	_userinfo�rAr"r"r#�username�sz_NetlocResultMixinBase.usernamecCs
|jdS)Nr8rIrKr"r"r#�password�sz_NetlocResultMixinBase.passwordcCsD|jd}|sdSt|t�r dnd}|�|�\}}}|��||S)Nr�%�%)�	_hostinfor9r:�	partition�lower)rA�hostname�	separatorZpercentZzoner"r"r#rS�s
z_NetlocResultMixinBase.hostnamecCsl|jd}|dk	rhzt|d�}Wn(tk
rHd|��}t|�d�YnXd|kr^dkshntd��|S)Nr8�
z+Port could not be cast to integer value as ri��zPort out of range 0-65535)rP�int�
ValueError)rA�port�messager"r"r#rX�s

z_NetlocResultMixinBase.portN)	rBrCrDrE�propertyrLrMrSrXr"r"r"r#rH�s



rHc@s(eZdZdZedd��Zedd��ZdS)�_NetlocResultMixinStrr"cCsD|j}|�d�\}}}|r4|�d�\}}}|s<d}nd}}||fS)N�@�:��netloc�
rpartitionrQ�rAr_ZuserinfoZ	have_info�hostinforLZ
have_passwordrMr"r"r#rJ�sz_NetlocResultMixinStr._userinfocCsl|j}|�d�\}}}|�d�\}}}|rL|�d�\}}}|�d�\}}}n|�d�\}}}|sdd}||fS)Nr\�[�]r]r^�rAr_�_rbZhave_open_brZ	bracketedrSrXr"r"r#rP�sz_NetlocResultMixinStr._hostinfoN�rBrCrDrErZrJrPr"r"r"r#r[�s

r[c@s(eZdZdZedd��Zedd��ZdS)�_NetlocResultMixinBytesr"cCsD|j}|�d�\}}}|r4|�d�\}}}|s<d}nd}}||fS)N�@�:r^rar"r"r#rJ�sz!_NetlocResultMixinBytes._userinfocCsl|j}|�d�\}}}|�d�\}}}|rL|�d�\}}}|�d�\}}}n|�d�\}}}|sdd}||fS)Nri�[�]rjr^rer"r"r#rP�sz!_NetlocResultMixinBytes._hostinfoNrgr"r"r"r#rh�s

rh)�
namedtuplezurl fragmentz!scheme netloc path query fragmentz(scheme netloc path params query fragmentz�
DefragResult(url, fragment)

A 2-tuple that contains the url without fragment identifier and the fragment
identifier as a separate argument.
z$The URL with no fragment identifier.z�
Fragment identifier separated from URL, that allows indirect identification of a
secondary resource by reference to a primary resource and additional identifying
information.
z�
SplitResult(scheme, netloc, path, query, fragment)

A 5-tuple that contains the different components of a URL. Similar to
ParseResult, but does not split params.
z%Specifies URL scheme for the request.z0
Network location where the request is made to.
z@
The hierarchical path, such as the path to a file to download.
z�
The query component, that contains non-hierarchical data, that along with data
in path component, identifies a resource in the scope of URI's scheme and
network location.
z�
Fragment identifier, that allows indirect identification of a secondary resource
by reference to a primary resource and additional identifying information.
zq
ParseResult(scheme, netloc, path, params, query, fragment)

A 6-tuple that contains components of a parsed URL.
z�
Parameters for last path element used to dereference the URI in order to provide
access to perform some operation on the resource.
c@seZdZdZdd�ZdS)rr"cCs |jr|jd|jS|jSdS�N�#��fragment�urlrKr"r"r#�geturlIszDefragResult.geturlN�rBrCrDrErsr"r"r"r#rGsc@seZdZdZdd�ZdS)rr"cCst|�Sr�rrKr"r"r#rsQszSplitResult.geturlNrtr"r"r"r#rOsc@seZdZdZdd�ZdS)rr"cCst|�Sr�rrKr"r"r#rsVszParseResult.geturlNrtr"r"r"r#rTsc@seZdZdZdd�ZdS)rr"cCs |jr|jd|jS|jSdS)N�#rprKr"r"r#rs\szDefragResultBytes.geturlNrtr"r"r"r#rZsc@seZdZdZdd�ZdS)rr"cCst|�SrrurKr"r"r#rsdszSplitResultBytes.geturlNrtr"r"r"r#rbsc@seZdZdZdd�ZdS)rr"cCst|�SrrvrKr"r"r#rsiszParseResultBytes.geturlNrtr"r"r"r#rgscCs4ttfttfttff}|D]\}}||_||_qdSr)rrrrrrr?rG)Z
_result_pairsZ_decodedZ_encodedr"r"r#�_fix_result_transcodingms�rxTc
Csft||�\}}}t|||�}|\}}}}}|tkrHd|krHt|�\}}nd}t||||||�}	||	�S)N�;r)r=r�uses_params�_splitparamsr)
rr�scheme�allow_fragments�_coerce_resultZsplitresultr_�queryrq�params�resultr"r"r#rzscCsRd|kr,|�d|�d��}|dkr6|dfSn
|�d�}|d|�||dd�fS)N�/ryrrr8)�find�rfind)rr�ir"r"r#r{�s

r{cCsHt|�}dD]"}|�||�}|dkrt||�}q|||�||d�fS)Nz/?#r)�lenr��min)rr�start�delim�cZwdelimr"r"r#�_splitnetloc�sr�cCs�|r|��rdSddl}|�dd�}|�dd�}|�dd�}|�dd�}|�d|�}||kr`dSdD] }||krdtd	|d
d��qddS)Nrr\rr]ro�?�NFKCz/?#@:znetloc 'z' contains invalid z#characters under NFKC normalization)�isascii�unicodedata�replace�	normalizerW)r_r��nZnetloc2r�r"r"r#�_checknetloc�s�r�cCstD]}|�|d�}q|S)Nr)�_UNSAFE_URL_BYTES_TO_REMOVEr�)rr�br"r"r#�_remove_unsafe_bytes_from_url�sr�c
Cs�t||�\}}}t|�}t|�}|�t�}|�t�}t|�}|||t|�t|�f}t�|d�}|rj||�St	t�t
kr|t�d}}}|�d�}	|	dk�r�|d|	�dk�rn||	dd�}|dd�dk�rt
|d�\}}d|kr�d	|k�sd	|k�rd|k�rtd
��|�r,d|k�r,|�dd�\}}d|k�rF|�dd�\}}t|�td||||�}
|
t|<||
�S|d|	�D]}|tk�rz�qҐqz||	dd�}|�r�td
d�|D���r�|d|	���|}}|dd�dk�r"t
|d�\}}d|k�rd	|k�sd	|k�r"d|k�r"td
��|�rBd|k�rB|�dd�\}}d|k�r\|�dd�\}}t|�t|||||�}
|
t|<||
�S)Nrr]rrr8��//rcrdzInvalid IPv6 URLror�css|]}|dkVqdS)�
0123456789Nr"�r1r�r"r"r#r4�szurlsplit.<locals>.<genexpr>)r=r��lstrip�_WHATWG_C0_CONTROL_OR_SPACE�strip�bool�typer�getr��MAX_CACHE_SIZEr$r�r�rW�splitr�r�scheme_chars�anyrR)
rrr|r}r~�key�cachedr_rrqr��vr��restr"r"r#r�sn



��


��
cCs<t|�\}}}}}}}|r&d||f}|t|||||f��S)Nz%s;%s)r=r)�
componentsr|r_rrr�rrqr~r"r"r#r�s
�cCs�t|�\}}}}}}|s4|r`|tkr`|dd�dkr`|rP|dd�dkrPd|}d|pXd|}|rp|d|}|r�|d|}|r�|d|}||�S)	Nr�r�r8r�rr]r�ro)r=�uses_netloc)r�r|r_rrrrqr~r"r"r#r�s� c	Cs�|s|S|s|St||�\}}}t|d|�\}}}}}}	t|||�\}
}}}
}}|
|ks`|
tkrh||�S|
tkr�|r�|t|
|||
||f��S|}|s�|
s�|}|}
|s�|}|t|
|||
||f��S|�d�}|ddkr�|d=|dd�dkr�|�d�}n(||�d�}td|dd��|dd�<g}|D]P}|dk�r\z|��Wntk
�rXYnXn|dk�rl�q(n
|�	|��q(|ddk�r�|�	d�|t|
|d�
|��p�d|
||f��S)Nrr����r8�..�.)r�r�)r=r�
uses_relativer�rr��filter�pop�
IndexError�append�join)�baserrr}r~ZbschemeZbnetlocZbpathZbparamsZbqueryZ	bfragmentr|r_�pathr�rrqZ
base_partsZsegmentsZ
resolved_pathZsegr"r"r#rsp
�
�
�
�



��c	CsTt|�\}}d|kr>t|�\}}}}}}t|||||df�}nd}|}|t||��S)Nror)r=rrr)	rrr~�sr��p�a�qZfragZdefragr"r"r#rTsZ0123456789ABCDEFabcdefc	Cs�|s|jdSt|t�r"|�d�}|�d�}t|�dkr<|S|dg}|j}tdkrbdd�tD�a|dd�D]R}z(|t|dd��||dd��Wqntk
r�|d�||�YqnXqnd�	|�S)	N��utf-8rOr8rcSs.i|]&}tD]}||��t�||��qqSr")�_hexdigr*�bytes�fromhex)r1r�r�r"r"r#�
<dictcomp>zs
�
z$unquote_to_bytes.<locals>.<dictcomp>r�)
r�r9r:r*r�r��
_hextobyter��KeyErrorr�)�string�bits�resr��itemr"r"r#rgs,



�z([-]+)r�r�cCs�t|t�rtd��d|kr$|j|S|dkr0d}|dkr<d}t�|�}|dg}|j}tdt|�d�D],}|t||��	||��|||d�qfd�
|�S)	NzExpected str, got bytesrNr�r�rr8r�r)r9r�r;r��_asciirer��ranger�rr/r�)r�r+r,r�r�r�r�r"r"r#r�s 



Fc	CsNi}t|||||||d�}|D]*\}	}
|	|kr>||	�|
�q|
g||	<q|S)N)r+r,�max_num_fieldsrT)r
r�)�qs�keep_blank_values�strict_parsingr+r,r�rTZ
parsed_result�pairs�name�valuer"r"r#r	�s�c@seZdZdS)�_QueryStringSeparatorWarningN)rBrCrDr"r"r"r#r��sr�z/etc/python/urllib.cfgc	Cs�t|�\}}t|t�r |�d�}|r2t|ttf�sB|dk	rBtd��t�}|dk�rRt}d}	|dkrrtj	�
|	�}d}
|dkr�ztt�}Wnt
k
r�YnJX|�:ddl}|jddd�}
|
�|�|
j
d|	dd	�}|aW5QRXt}
|dk�rd
|k�rddlm}|dtd
d�d}n:|dk�r(|}n*t|�dk�rRt|	�d|
�d�dd��|dk	�r�||k�r�d|�d�|�d
�}nd|�|�}||k�r�td��||k�r�dd�|�d�D�}ndd�|�|�D�}g}|D]�}|�s�|�s�q�|�dd�}t|�d
k�r4|�rtd|f��|�r�|�d�n�q�t|d��sH|�r�|d�dd�}t|||d�}||�}|d�dd�}t|||d�}||�}|�||f��q�|S) Nr%z*Separator must be of type string or bytes.ZPYTHON_URLLIB_QS_SEPARATORzenvironment variabler)ro)Z
interpolationZcomment_prefixesr	)Zfallbackry)�warnaThe default separator of urllib.parse.parse_qsl and parse_qs was changed to '&' to avoid a web cache poisoning issue (CVE-2021-23336). By default, semicolons no longer act as query field separators. See https://access.redhat.com/articles/5860431 for more details.r���
stacklevel�&Zlegacyr8z (from z) must contain z1 character, or "legacy". See z<https://access.redhat.com/articles/5860431 for more details.zMax number of fields exceededcSs g|]}|�d�D]}|�qqS)ry�r�)r1�s1�s2r"r"r#�
<listcomp>7szparse_qsl.<locals>.<listcomp>cSsg|]}|�qSr"r")r1r�r"r"r#r�9s�=zbad query field: %rr�+� r3)r=r9r�r/r:rW�object�_default_qs_separator�os�environr��open�_QS_SEPARATOR_CONFIG_FILENAME�FileNotFoundError�configparserZConfigParserZ	read_file�warningsr�r�r��countr�r�r�r)r�r�r�r+r,r�rTr~Z_legacyZenvvar_nameZ
config_sourcerr�Zconfigr��
num_fieldsr��rZ
name_valueZnvr�r�r"r"r#r
�s�


�


�
���	



cCs|�dd�}t|||�S)Nr�r�)r�r)r�r+r,r"r"r#rQssBABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_.-~c@s$eZdZdd�Zdd�Zdd�ZdS)�QuotercCst�|�|_dSr)�_ALWAYS_SAFE�union�safe)rAr�r"r"r#�__init__iszQuoter.__init__cCsd|jjt|�fS)Nz<%s %r>)�	__class__rB�dictrKr"r"r#�__repr__mszQuoter.__repr__cCs(||jkrt|�nd�|�}|||<|S)Nz%{:02X})r��chr�format)rAr�r�r"r"r#�__missing__qszQuoter.__missing__N)rBrCrDr�r�r�r"r"r"r#r�asr�r�cCsbt|t�r8|s|S|dkrd}|dkr*d}|�||�}n |dk	rHtd��|dk	rXtd��t||�S)Nr�r&z,quote() doesn't support 'encoding' for bytesz*quote() doesn't support 'errors' for bytes)r9r:r*r;r
)r�r�r+r,r"r"r#rws'
cCsdt|t�rd|ks$t|t�r2d|kr2t||||�St|t�rBd}nd}t|||||�}|�dd�S)Nr�� r�)r9r:r�rr�)r�r�r+r,Zspacer"r"r#r�s��
cs�t|ttf�std��|sdSt|t�r6|�dd�}ntdd�|D��}|�t|�s^|��Szt	|�Wn&t
k
r�t|�jt	|<�YnXd�
�fdd�|D��S)Nz!quote_from_bytes() expected bytesrr%�ignorecSsg|]}|dkr|�qS)�r"r�r"r"r#r��sz$quote_from_bytes.<locals>.<listcomp>csg|]}�|��qSr"r")r1�char�Zquoterr"r#r��s)r9r��	bytearrayr;r:r*�rstrip�_ALWAYS_SAFE_BYTESr/r!r�r��__getitem__r�)Zbsr�r"r�r#r
�s
c	Cst|d�r|��}nPzt|�r0t|dt�s0t�Wn0tk
rbt��\}}}td��|��YnXg}	|s�|D]j\}
}t|
t	�r�||
|�}
n|t
|
�|||�}
t|t	�r�|||�}n|t
|�|||�}|	�|
d|�qp�n"|D�]\}
}t|
t	��r||
|�}
n|t
|
�|||�}
t|t	��rB|||�}|	�|
d|�q�t|t
��rp|||||�}|	�|
d|�q�zt|�}Wn:tk
�r�|t
|�|||�}|	�|
d|�Yq�X|D]B}
t|
t	��r�||
|�}
n|t
|
�|||�}
|	�|
d|
��q�q�d�|	�S)N�itemsrz1not a valid non-string sequence or mapping objectr�r�)
�hasattrr�r�r9r5r;�sys�exc_info�with_tracebackr�r:r�r�)rZdoseqr�r+r,Z	quote_viaZtyZva�tb�l�kr�r2Zeltr"r"r#r�sR

�



cCstjdtdd�t|�S)Nz/urllib.parse.to_bytes() is deprecated as of 3.8r�r�)r�r��DeprecationWarning�	_to_bytes�rrr"r"r#�to_bytes%s
�rcCsJt|t�rFz|�d���}Wn(tk
rDtdt|�d��YnX|S)N�ASCIIzURL z contains non-ASCII characters)r9r:r*r/�UnicodeError�reprrr"r"r#r+s
�rcCs`t|���}|dd�dkr<|dd�dkr<|dd���}|dd�dkr\|dd���}|S)Nr8�<r��>�zURL:)r:r�rr"r"r#�unwrap9s r
cCstjdtdd�t|�S)NzUurllib.parse.splittype() is deprecated as of 3.8, use urllib.parse.urlparse() insteadr�r�)r�r�r�
_splittyperr"r"r#�	splittypeFs
�rcCsDtdkrt�dtj�at�|�}|r<|��\}}|��|fSd|fS)Nz
([^/:]+):(.*))�	_typeprog�re�compile�DOTALL�match�groupsrR)rrrr|�datar"r"r#rNs
rcCstjdtdd�t|�S)NzUurllib.parse.splithost() is deprecated as of 3.8, use urllib.parse.urlparse() insteadr�r�)r�r�r�
_splithostrr"r"r#�	splithost[s
�rcCsXtdkrt�dtj�at�|�}|rP|��\}}|rH|ddkrHd|}||fSd|fS)Nz//([^/#?]*)(.*)rr�)�	_hostprogrrrrr)rrrZ	host_portr�r"r"r#rcs
rcCstjdtdd�t|�S)NzUurllib.parse.splituser() is deprecated as of 3.8, use urllib.parse.urlparse() insteadr�r�)r�r�r�
_splituser��hostr"r"r#�	splituserrs
�rcCs |�d�\}}}|r|nd|fS)Nr\�r`)r�userr�r"r"r#rysrcCstjdtdd�t|�S)NzWurllib.parse.splitpasswd() is deprecated as of 3.8, use urllib.parse.urlparse() insteadr�r�)r�r�r�_splitpasswd)rr"r"r#�splitpasswds
�r!cCs |�d�\}}}||r|ndfS�Nr]�rQ)rr�Zpasswdr"r"r#r �sr cCstjdtdd�t|�S)NzUurllib.parse.splitport() is deprecated as of 3.8, use urllib.parse.urlparse() insteadr�r�)r�r�r�
_splitportrr"r"r#�	splitport�s
�r%cCsDtdkrt�dtj�at�|�}|r<|��\}}|r<||fS|dfS)Nz
(.*):([0-9]*))�	_portprogrrr�	fullmatchr)rrrXr"r"r#r$�s
r$r�cCstjdtdd�t||�S)NzVurllib.parse.splitnport() is deprecated as of 3.8, use urllib.parse.urlparse() insteadr�r�)r�r�r�_splitnport)r�defportr"r"r#�
splitnport�s
�r*cCsT|�d�\}}}|s|}n2|rLzt|�}Wntk
rBd}YnX||fS||fSr")r`rVrW)rr)r�rXZnportr"r"r#r(�s
r(cCstjdtdd�t|�S)NzVurllib.parse.splitquery() is deprecated as of 3.8, use urllib.parse.urlparse() insteadr�r�)r�r�r�_splitqueryrr"r"r#�
splitquery�s
�r,cCs$|�d�\}}}|r||fS|dfS)Nr�r)rrr�r�rr"r"r#r+�sr+cCstjdtdd�t|�S)NzTurllib.parse.splittag() is deprecated as of 3.8, use urllib.parse.urlparse() insteadr�r�)r�r�r�	_splittagrr"r"r#�splittag�s
�r.cCs$|�d�\}}}|r||fS|dfSrnr)rrr�r��tagr"r"r#r-�sr-cCstjdtdd�t|�S)NzUurllib.parse.splitattr() is deprecated as of 3.8, use urllib.parse.urlparse() insteadr�r�)r�r�r�
_splitattrrr"r"r#�	splitattr�s
�r1cCs|�d�}|d|dd�fS)Nryrr8r�)rrZwordsr"r"r#r0�s
r0cCstjdtdd�t|�S)NzWurllib.parse.splitvalue() is deprecated as of 3.8, use urllib.parse.parse_qsl() insteadr�r�)r�r�r�_splitvalue)�attrr"r"r#�
splitvalue�s
�r4cCs |�d�\}}}||r|ndfS)Nr�r#)r3r�r�r"r"r#r2�sr2)rT)r)rT)T)r�r�)FFr�r�NN)FFr�r�NN)r�r�)r�NN)rNN)r�)r�)r�)nrr�r��collectionsr��__all__r�r�rzZnon_hierarchicalZ
uses_queryZ
uses_fragmentr�r�r�r�rr$Z_implicit_encodingZ_implicit_errorsr(r-r7r=r�r>rFrHr[rhrmZ_DefragResultBaseZ_SplitResultBaseZ_ParseResultBase�__doc__rrrqr|r_r�rr�Z
ResultBaserrrrrrrxrr{r�r�r�rrrrrr�r�rrr�rr	�RuntimeWarningr�r�r�r
r�	frozensetr�r�r�r!�defaultdictr�rrr
rrrr
rrrrrrrrr!r r%r&r$r*r(r,r+r.r-r1r0r4r2r"r"r"r#�<module>"s��������
�
�
%
��

	

?
E

�
)�
}
	
6

�
Q



request.cpython-38.pyc000064400000215633151733313270010703 0ustar00U

e5d���!@s�dZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddl
Z
ddlZddlZddlZddlZddlmZmZmZddlmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(ddl)m*Z*m+Z+zddl,Z,Wne-k
�rdZ.YnXdZ.dd	d
ddd
ddddddddddddddddddd d!d"d#d$d%d&d'd(g!Z/d)e
j0dd*�Z1da2dej3fddddd+�d,d�Z4d-d �Z5gZ6d~d.d%�Z7d/d&�Z8e
�9d0e
j:�Z;d1d2�Z<Gd3d�d�Z=Gd4d	�d	�Z>d5d!�Z?Gd6d
�d
�Z@Gd7d�de@�ZAGd8d�de@�ZBGd9d�de@�ZCd:d;�ZDGd<d�de@�ZEGd=d�d�ZFGd>d�deF�ZGGd?d�deG�ZHGd@d�d�ZIGdAd�deIe@�ZJGdBd�deIe@�ZKejLZMGdCd�d�ZNGdDd�de@eN�ZOGdEd�de@eN�ZPGdFdG�dGe@�ZQGdHd�deQ�ZReSejTdI��r*GdJdK�dKeQ�ZUe/�VdK�GdLd
�d
e@�ZWGdMd�de@�ZXdNdO�ZYdPdQ�ZZGdRd�de@�Z[dSdT�Z\GdUd�de@�Z]GdVd�de]�Z^GdWd�de@�Z_dXZ`ejadYk�r�ddZlbmcZcmdZdnd[d#�Zcd\d"�ZdiZeGd]d'�d'�ZfGd^d(�d(ef�Zgdahd_d`�Zidajdadb�Zkdaldcdd�Zmdandedf�ZoGdgdh�dh�Zpdidj�Zqddkdl�Zrdmdn�Zse
jtdok�r�ddplumvZvmwZwdqdr�Zxdsdt�Zydudv�Zzdwd$�Z{n6ejadYk�r�dxdy�Z|dzd$�Z{d{d|�Z}d}dv�ZzneqZ{erZzdS)�a�
An extensible library for opening URLs using a variety of protocols

The simplest way to use this module is to call the urlopen function,
which accepts a string containing a URL or a Request object (described
below).  It opens the URL and returns the results as file-like
object; the returned object has some extra methods described below.

The OpenerDirector manages a collection of Handler objects that do
all the actual work.  Each Handler implements a particular protocol or
option.  The OpenerDirector is a composite object that invokes the
Handlers needed to open the requested URL.  For example, the
HTTPHandler performs HTTP GET and POST requests and deals with
non-error returns.  The HTTPRedirectHandler automatically deals with
HTTP 301, 302, 303 and 307 redirect errors, and the HTTPDigestAuthHandler
deals with digest authentication.

urlopen(url, data=None) -- Basic usage is the same as original
urllib.  pass the url and optionally data to post to an HTTP URL, and
get a file-like object back.  One difference is that you can also pass
a Request instance instead of URL.  Raises a URLError (subclass of
OSError); for HTTP errors, raises an HTTPError, which can also be
treated as a valid response.

build_opener -- Function that creates a new OpenerDirector instance.
Will install the default handlers.  Accepts one or more Handlers as
arguments, either instances or Handler classes that it will
instantiate.  If one of the argument is a subclass of the default
handler, the argument will be installed instead of the default.

install_opener -- Installs a new opener as the default opener.

objects of interest:

OpenerDirector -- Sets up the User Agent as the Python-urllib client and manages
the Handler classes, while dealing with requests and responses.

Request -- An object that encapsulates the state of a request.  The
state can be as simple as the URL.  It can also include extra HTTP
headers, e.g. a User-Agent.

BaseHandler --

internals:
BaseHandler and parent
_call_chain conventions

Example usage:

import urllib.request

# set up authentication info
authinfo = urllib.request.HTTPBasicAuthHandler()
authinfo.add_password(realm='PDQ Application',
                      uri='https://mahler:8092/site-updates.py',
                      user='klem',
                      passwd='geheim$parole')

proxy_support = urllib.request.ProxyHandler({"http" : "http://ahad-haam:3128"})

# build a new opener that adds authentication and caching FTP handlers
opener = urllib.request.build_opener(proxy_support, authinfo,
                                     urllib.request.CacheFTPHandler)

# install it
urllib.request.install_opener(opener)

f = urllib.request.urlopen('http://www.python.org/')
�N)�URLError�	HTTPError�ContentTooShortError)�urlparse�urlsplit�urljoin�unwrap�quote�unquote�
_splittype�
_splithost�
_splitport�
_splituser�_splitpasswd�
_splitattr�_splitquery�_splitvalue�	_splittag�	_to_bytes�unquote_to_bytes�
urlunparse)�
addinfourl�addclosehookFT�Request�OpenerDirector�BaseHandler�HTTPDefaultErrorHandler�HTTPRedirectHandler�HTTPCookieProcessor�ProxyHandler�HTTPPasswordMgr�HTTPPasswordMgrWithDefaultRealm�HTTPPasswordMgrWithPriorAuth�AbstractBasicAuthHandler�HTTPBasicAuthHandler�ProxyBasicAuthHandler�AbstractDigestAuthHandler�HTTPDigestAuthHandler�ProxyDigestAuthHandler�HTTPHandler�FileHandler�
FTPHandler�CacheFTPHandler�DataHandler�UnknownHandler�HTTPErrorProcessor�urlopen�install_opener�build_opener�pathname2url�url2pathname�
getproxies�urlretrieve�
urlcleanup�	URLopener�FancyURLopenerz%d.%d�)�cafile�capath�	cadefault�contextc
Cs�|s|s|rfddl}|�dtd�|dk	r2td��ts>td��tjtjj||d�}t	|d�}t
|�}	n0|r~t	|d�}t
|�}	ntdkr�t
�a}	nt}	|	�|||�S)	a$
Open the URL url, which can be either a string or a Request object.

    *data* must be an object specifying additional data to be sent to
    the server, or None if no such data is needed.  See Request for
    details.

    urllib.request module uses HTTP/1.1 and includes a "Connection:close"
    header in its HTTP requests.

    The optional *timeout* parameter specifies a timeout in seconds for
    blocking operations like the connection attempt (if not specified, the
    global default timeout setting will be used). This only works for HTTP,
    HTTPS and FTP connections.

    If *context* is specified, it must be a ssl.SSLContext instance describing
    the various SSL options. See HTTPSConnection for more details.

    The optional *cafile* and *capath* parameters specify a set of trusted CA
    certificates for HTTPS requests. cafile should point to a single file
    containing a bundle of CA certificates, whereas capath should point to a
    directory of hashed certificate files. More information can be found in
    ssl.SSLContext.load_verify_locations().

    The *cadefault* parameter is ignored.

    This function always returns an object which can work as a context
    manager and has methods such as

    * geturl() - return the URL of the resource retrieved, commonly used to
      determine if a redirect was followed

    * info() - return the meta-information of the page, such as headers, in the
      form of an email.message_from_string() instance (see Quick Reference to
      HTTP Headers)

    * getcode() - return the HTTP status code of the response.  Raises URLError
      on errors.

    For HTTP and HTTPS URLs, this function returns a http.client.HTTPResponse
    object slightly modified. In addition to the three new methods above, the
    msg attribute contains the same information as the reason attribute ---
    the reason phrase returned by the server --- instead of the response
    headers as it is specified in the documentation for HTTPResponse.

    For FTP, file, and data URLs and requests explicitly handled by legacy
    URLopener and FancyURLopener classes, this function returns a
    urllib.response.addinfourl object.

    Note that None may be returned if no handler handles the request (though
    the default installed global OpenerDirector uses UnknownHandler to ensure
    this never happens).

    In addition, if proxy settings are detected (for example, when a *_proxy
    environment variable like http_proxy is set), ProxyHandler is default
    installed and makes sure the requests are handled through the proxy.

    rNzJcafile, capath and cadefault are deprecated, use a custom context instead.r:zDYou can't pass both context and any of cafile, capath, and cadefaultzSSL support not available)r;r<)r>)
�warnings�warn�DeprecationWarning�
ValueError�	_have_ssl�sslZcreate_default_contextZPurposeZSERVER_AUTH�HTTPSHandlerr2�_opener�open)
�url�data�timeoutr;r<r=r>r?Z
https_handler�opener�rL�&/usr/lib64/python3.8/urllib/request.pyr0�s2<��
�



cCs|adS�N)rF)rKrLrLrMr1�sc
Cs:t|�\}}t�t||����}|��}|dkrN|sNtj�|�|fW5QR�S|r^t|d�}nt	j
dd�}|j}t�
|�|��||f}	d}
d}d}d}
d|kr�t|d	�}|r�||
|
|�|�|
�}|s�q�|t|�7}|�|�|
d
7}
|r�||
|
|�q�W5QRXW5QRX|dk�r6||k�r6td||f|	��|	S)aW
    Retrieve a URL into a temporary location on disk.

    Requires a URL argument. If a filename is passed, it is used as
    the temporary file location. The reporthook argument should be
    a callable that accepts a block number, a read size, and the
    total file size of the URL target. The data argument should be
    valid URL encoded data.

    If a filename is passed and the URL points to a local resource,
    the result is a copy from local file to new file.

    Returns a tuple containing the path to the newly created
    data file as well as the resulting HTTPMessage object.
    �file�wbF)�delete� ���r�content-length�Content-Length��1retrieval incomplete: got only %i out of %i bytes)r�
contextlib�closingr0�info�os�path�normpathrG�tempfileZNamedTemporaryFile�name�_url_tempfiles�append�int�read�len�writer)rH�filename�
reporthookrIZurl_typer\�fp�headers�tfp�result�bs�sizerc�blocknum�blockrLrLrMr6�sH


"��c	CsDtD](}zt�|�Wqtk
r*YqXqtdd�=tr@dadS)z0Clean up temporary files from urlretrieve calls.N)r`r[�unlink�OSErrorrF)Z	temp_filerLrLrMr7$s
z:\d+$cCs<|j}t|�d}|dkr&|�dd�}t�d|d�}|��S)z�Return request-host, as defined by RFC 2965.

    Variation from RFC: returned value is lowercased, for convenient
    comparison.

    rV��Host)�full_urlr�
get_header�_cut_port_re�sub�lower)�requestrH�hostrLrLrM�request_host3sr{c@s�eZdZdidddfdd�Zedd��Zejdd��Zejdd��Zed	d
��Zejdd
��Zejdd
��Zd
d�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zd#dd�Zdd �Zd!d"�ZdS)$rNFc	Csl||_i|_i|_d|_||_d|_|��D]\}}|�||�q,|dkrRt|�}||_	||_
|rh||_dSrN)rtri�unredirected_hdrs�_datarI�_tunnel_host�items�
add_headerr{�origin_req_host�unverifiable�method)	�selfrHrIrir�r�r��key�valuerLrLrM�__init__EszRequest.__init__cCs|jrd�|j|j�S|jS)Nz{}#{})�fragment�format�	_full_url�r�rLrLrMrtWszRequest.full_urlcCs(t|�|_t|j�\|_|_|��dSrN)rr�rr��_parse�r�rHrLrLrMrt]s
cCsd|_d|_d|_dS)Nrr)r�r��selectorr�rLrLrMrtdscCs|jSrN)r}r�rLrLrMrIjszRequest.datacCs(||jkr$||_|�d�r$|�d�dS)N�Content-length)r}�
has_header�
remove_header)r�rIrLrLrMrIns

cCs
d|_dSrN)rIr�rLrLrMrIxscCsNt|j�\|_}|jdkr(td|j��t|�\|_|_|jrJt|j�|_dS)Nzunknown url type: %r)	rr��typerBrtrrzr�r
)r��restrLrLrMr�|s
zRequest._parsecCs|jdk	rdnd}t|d|�S)z3Return a string indicating the HTTP request method.N�POST�GETr�)rI�getattr)r�Zdefault_methodrLrLrM�
get_method�szRequest.get_methodcCs|jSrN)rtr�rLrLrM�get_full_url�szRequest.get_full_urlcCs2|jdkr|js|j|_n||_|j|_||_dS)N�https)r�r~rzrtr�)r�rzr�rLrLrM�	set_proxy�s

zRequest.set_proxycCs|j|jkSrN)r�rtr�rLrLrM�	has_proxy�szRequest.has_proxycCs||j|��<dSrN)ri�
capitalize�r�r��valrLrLrMr��szRequest.add_headercCs||j|��<dSrN)r|r�r�rLrLrM�add_unredirected_header�szRequest.add_unredirected_headercCs||jkp||jkSrN)rir|�r��header_namerLrLrMr��s
�zRequest.has_headercCs|j�||j�||��SrN)ri�getr|)r�r��defaultrLrLrMru�s�zRequest.get_headercCs |j�|d�|j�|d�dSrN)ri�popr|r�rLrLrMr��szRequest.remove_headercCs|j|j�}t|���SrN)r|ri�listr)r��hdrsrLrLrM�header_items�szRequest.header_items)N)�__name__�
__module__�__qualname__r��propertyrt�setter�deleterrIr�r�r�r�r�r�r�r�rur�r�rLrLrLrMrCs8�





	

c@sNeZdZdd�Zdd�Zdd�Zdd�Zd	ejfd
d�Z	ddd
�Z
dd�Zd	S)rcCs6dt}d|fg|_g|_i|_i|_i|_i|_dS)N�Python-urllib/%sz
User-agent)�__version__�
addheaders�handlers�handle_open�handle_error�process_response�process_request)r�Zclient_versionrLrLrMr��szOpenerDirector.__init__c	CsTt|d�stdt|���d}t|�D�]}|dkr6q&|�d�}|d|�}||dd�}|�d�r�|�d�|d}||dd�}zt|�}Wntk
r�YnX|j�	|i�}	|	|j|<n>|dkr�|}|j
}	n*|d	kr�|}|j}	n|d
kr&|}|j}	nq&|	�
|g�}
|
�r"t�|
|�n
|
�|�d}q&|�rPt�|j|�|�|�dS)N�
add_parentz%expected BaseHandler instance, got %rF)�redirect_request�do_open�
proxy_open�_rV�errorrG�responseryT)�hasattr�	TypeErrorr��dir�find�
startswithrbrBr�r�r�r�r��
setdefault�bisectZinsortrar�r�)r��handlerZadded�meth�i�protocolZ	condition�j�kind�lookupr�rLrLrM�add_handler�sL
�


zOpenerDirector.add_handlercCsdSrNrLr�rLrLrM�close�szOpenerDirector.closec	Gs<|�|d�}|D]&}t||�}||�}|dk	r|SqdS)NrL)r�r�)	r��chainr��	meth_name�argsr�r��funcrkrLrLrM�_call_chain�s
zOpenerDirector._call_chainNc
Cs�t|t�rt||�}n|}|dk	r(||_||_|j}|d}|j�|g�D]}t||�}||�}qJt	�
d|j|j|j|�
��|�||�}	|d}|j�|g�D]}t||�}|||	�}	q�|	S)NZ_requestzurllib.RequestZ	_response)�
isinstance�strrrIrJr�r�r�r��sys�auditrtrir��_openr�)
r��fullurlrIrJ�reqr�r�Z	processorr�r�rLrLrMrG�s$



zOpenerDirector.opencCsP|�|jdd|�}|r|S|j}|�|j||d|�}|r>|S|�|jdd|�S)Nr�Zdefault_openr��unknown�unknown_open)r�r�r�)r�r�rIrkr�rLrLrMr�s$
���
�zOpenerDirector._opencGs~|dkr,|jd}|d}d|}d}|}n|j}|d}d}|||f|}|j|�}|r^|S|rz|dd	f|}|j|�SdS)
N��httpr�r�r:z
http_error_%srVZ_errorrr��http_error_default)r�r�)r��protor��dictr�Zhttp_errZ	orig_argsrkrLrLrMr�&s 

zOpenerDirector.error)N)r�r�r�r�r�r�r��socket�_GLOBAL_DEFAULT_TIMEOUTrGr�r�rLrLrLrMr�s/
c	Gs�t�}ttttttttt	g	}t
tjd�r2|�
t�t�}|D]B}|D]8}t|t�rht||�r||�|�qDt||�rD|�|�qDq<|D]}|�|�q�|D]}|�|��q�|D]}t|t�r�|�}|�|�q�|S)a*Create an opener object from a list of handlers.

    The opener will use several default handlers, including support
    for HTTP, FTP and when applicable HTTPS.

    If any of the handlers passed as arguments are subclasses of the
    default handlers, the default handlers will not be used.
    �HTTPSConnection)rrr.r)rrr+r*r/r-r�r��clientrarE�setr�r��
issubclass�add�remover�)r�rKZdefault_classes�skip�klassZcheck�hrLrLrMr2?s8	�




c@s(eZdZdZdd�Zdd�Zdd�ZdS)	r��cCs
||_dSrN)�parent)r�r�rLrLrMr�fszBaseHandler.add_parentcCsdSrNrLr�rLrLrMr�iszBaseHandler.closecCst|d�sdS|j|jkS)N�
handler_orderT)r�r�)r��otherrLrLrM�__lt__ms
zBaseHandler.__lt__N)r�r�r�r�r�r�r�rLrLrLrMrcsc@s eZdZdZdZdd�ZeZdS)r/zProcess HTTP error responses.i�cCsH|j|j|��}}}d|kr,dksDn|j�d|||||�}|S)N���,r�)�code�msgrZr�r�)r�ryr�r�r�r�rLrLrM�
http_responsezs�z HTTPErrorProcessor.http_responseN)r�r�r��__doc__r�r��https_responserLrLrLrMr/vsc@seZdZdd�ZdS)rcCst|j||||��dSrN)rrt)r�r�rhr�r�r�rLrLrMr��sz*HTTPDefaultErrorHandler.http_error_defaultN)r�r�r�r�rLrLrLrMr�sc@s4eZdZdZdZdd�Zdd�ZeZZZ	dZ
dS)	r��
c	st|��}|dkr|dks:|dkr(|dks:t|j||||��|�dd�}d��fdd	�|j��D�}t|||jd
d�S)a�Return a Request or None in response to a redirect.

        This is called by the http_error_30x methods when a
        redirection response is received.  If a redirection should
        take place, return a new Request to allow http_error_30x to
        perform the redirect.  Otherwise, raise HTTPError if no-one
        else should try to handle this url.  Return None if you can't
        but another Handler might.
        )�-�.�/i3)r�ZHEAD)r�r�r�r�� z%20)rTzcontent-typecs"i|]\}}|���kr||�qSrL)rx��.0�k�v�ZCONTENT_HEADERSrLrM�
<dictcomp>�s�z8HTTPRedirectHandler.redirect_request.<locals>.<dictcomp>T)rir�r�)r�rrt�replacerirrr�)	r�r�rhr�r�ri�newurl�mZ
newheadersrLrrMr��s
���z$HTTPRedirectHandler.redirect_requestc
CsLd|kr|d}nd|kr$|d}ndSt|�}|jdkrRt||d||f||��|jsn|jrnt|�}d|d<t|�}t|dtj	d�}t
|j|�}|�||||||�}|dkr�dSt
|d	��r|j}	|_|	�|d
�|jks�t|	�|jk�rt|j||j|||��ni}	|_|_|	�|d
�d|	|<|��|��|jj||jd�S)
N�location�uri�r�r��ftprrz+%s - Redirection to url '%s' is not allowed�/r:z
iso-8859-1)�encoding�safe�
redirect_dictrrV�rJ)r�schemerr\Znetlocr�rr	�stringZpunctuationrrtr�r�r
r��max_repeatsrd�max_redirections�inf_msgrcr�r�rGrJ)
r�r�rhr�r�rir�urlparts�newZvisitedrLrLrM�http_error_302�sT



����z"HTTPRedirectHandler.http_error_302zoThe HTTP server returned a redirect error that would lead to an infinite loop.
The last 30x error message was:
N)r�r�r�rrr�r�http_error_301�http_error_303�http_error_307rrLrLrLrMr�s&<c
Cs�t|�\}}|�d�s d}|}nZ|�d�s6td|��d|krV|�d�}|�d|�}n|�dd�}|dkrnd}|d|�}t|�\}}|dk	r�t|�\}}	nd}}	|||	|fS)aReturn (scheme, user, password, host/port) given a URL or an authority.

    If a URL is supplied, it must have an authority (host:port) component.
    According to RFC 3986, having an authority component means the URL must
    have two slashes after the scheme.
    r
N�//zproxy URL with no authority: %r�@r:rS)rr�rBr�rr)
�proxyrZr_scheme�	authorityZhost_separator�endZuserinfo�hostport�user�passwordrLrLrM�_parse_proxy�s$


r"c@s"eZdZdZddd�Zdd�ZdS)r�dNcCsb|dkrt�}t|d�s td��||_|��D].\}}|��}t|d||||jfdd��q.dS)N�keys�proxies must be a mappingz%s_opencSs||||�SrNrL)�rrr�r�rLrLrM�<lambda>)sz'ProxyHandler.__init__.<locals>.<lambda>)r5r��AssertionError�proxiesrrx�setattrr�)r�r)r�rHrLrLrMr�!s
�zProxyHandler.__init__cCs�|j}t|�\}}}}|dkr"|}|jr6t|j�r6dS|rv|rvdt|�t|�f}	t�|	����d�}
|�	dd|
�t|�}|�
||�||ks�|dkr�dS|jj||j
d�SdS)N�%s:%s�ascii�Proxy-authorization�Basic r�r)r�r"rz�proxy_bypassr
�base64�	b64encode�encode�decoder�r�r�rGrJ)r�r�rr�Z	orig_typeZ
proxy_typer r!rZ	user_passZcredsrLrLrMr�,s"�zProxyHandler.proxy_open)N)r�r�r�r�r�r�rLrLrLrMrs
c@s6eZdZdd�Zdd�Zdd�Zd
dd	�Zd
d�ZdS)r cCs
i|_dSrN)�passwdr�rLrLrMr�JszHTTPPasswordMgr.__init__cs\t|t�r|g}|�jkr$i�j|<dD].�t��fdd�|D��}||f�j||<q(dS)N�TFc3s|]}��|��VqdSrN)�
reduce_uri)r��u��default_portr�rLrM�	<genexpr>Tsz/HTTPPasswordMgr.add_password.<locals>.<genexpr>)r�r�r4�tuple)r��realmrr r4�reduced_urirLr8rM�add_passwordMs


�zHTTPPasswordMgr.add_passwordc	Cs`|j�|i�}dD]H}|�||�}|��D].\}}|D] }|�||�r6|Sq6q*qdS)Nr5�NN)r4r�r6r�	is_suburi)	r�r<�authuriZdomainsr9�reduced_authuriZurisZauthinforrLrLrM�find_user_passwordXsz"HTTPPasswordMgr.find_user_passwordTc
Cs�t|�}|dr.|d}|d}|dp*d}nd}|}d}t|�\}}|r~|dkr~|dk	r~ddd��|�}	|	dk	r~d	||	f}||fS)
z@Accept authority or URI and extract only the authority and path.rVrr:r
N�Pi�r�z%s:%d)rr
r�)
r�rr9�partsrrr\rz�portZdportrLrLrMr6bs$��zHTTPPasswordMgr.reduce_uricCsN||krdS|d|dkr dS|d}|dd�dkr@|d7}|d�|�S)zcCheck if test is below base in a URI tree

        Both args must be URIs in reduced form.
        TrFrVrSNr
)r�)r��base�test�prefixrLrLrMr@yszHTTPPasswordMgr.is_suburiN)T)r�r�r�r�r>rCr6r@rLrLrLrMr Hs


c@seZdZdd�ZdS)r!cCs0t�|||�\}}|dk	r"||fSt�|d|�SrN)r rC)r�r<rAr r!rLrLrMrC�s�z2HTTPPasswordMgrWithDefaultRealm.find_user_passwordN)r�r�r�rCrLrLrLrMr!�scs<eZdZ�fdd�Zd
�fdd�	Zddd�Zdd	�Z�ZS)r"csi|_t�j||�dSrN)�
authenticated�superr��r�r��kwargs��	__class__rLrMr��sz%HTTPPasswordMgrWithPriorAuth.__init__Fcs<|�||�|dk	r&t��d|||�t��||||�dSrN)�update_authenticatedrKr>)r�r<rr r4�is_authenticatedrNrLrMr>�sz)HTTPPasswordMgrWithPriorAuth.add_passwordcCs>t|t�r|g}dD]$}|D]}|�||�}||j|<qqdS�Nr5)r�r�r6rJ)r�rrQr9r7r=rLrLrMrP�s
z1HTTPPasswordMgrWithPriorAuth.update_authenticatedcCsDdD]:}|�||�}|jD]"}|�||�r|j|SqqdSrR)r6rJr@)r�rAr9rBrrLrLrMrQ�s

z-HTTPPasswordMgrWithPriorAuth.is_authenticated)F)F)r�r�r�r�r>rPrQ�
__classcell__rLrLrNrMr"�s

c@sTeZdZe�dej�Zddd�Zdd�Zdd�Z	d	d
�Z
dd�Zd
d�ZeZ
eZdS)r#z1(?:^|,)[ 	]*([^ 	,]+)[ 	]+realm=(["']?)([^"']*)\2NcCs"|dkrt�}||_|jj|_dSrN)r r4r>)r�Zpassword_mgrrLrLrMr��sz!AbstractBasicAuthHandler.__init__ccspd}tj�|�D]6}|��\}}}|dkr8t�dtd�||fVd}q|sl|r^|��d}nd}|dfVdS)NF)�"�'zBasic Auth Realm was unquoted�Trrr)r#�rx�finditer�groupsr?r@�UserWarning�split)r��headerZfound_challengeZmorr	r<rLrLrM�_parse_realm�s�
z%AbstractBasicAuthHandler._parse_realmc	Cs~|�|�}|sdSd}|D]H}|�|�D]8\}}|��dkrB|}q(|dk	r(|�|||�Sq(q|dk	rztd|f��dS)N�basiczBAbstractBasicAuthHandler does not support the following scheme: %r)Zget_allr]rx�retry_http_basic_authrB)	r��authreqrzr�riZunsupportedr\rr<rLrLrM�http_error_auth_reqed�s
�z.AbstractBasicAuthHandler.http_error_auth_reqedcCs||j�||�\}}|dk	rtd||f}dt�|����d�}|�|jd�|krTdS|�|j|�|j	j
||jd�SdSdS)Nr+r.r,r)r4rCr0r1r2r3ru�auth_headerr�r�rGrJ)r�rzr�r<r �pw�raw�authrLrLrMr_�sz.AbstractBasicAuthHandler.retry_http_basic_authcCstt|jd�r|j�|j�s|S|�d�sp|j�d|j�\}}d�||���}t�	|��
�}|�dd�|����|S)NrQ�
Authorizationz{0}:{1}zBasic {})
r�r4rQrtr�rCr�r2r0Zstandard_b64encoder3r��strip)r�r�r r4ZcredentialsZauth_strrLrLrM�http_requests�
�z%AbstractBasicAuthHandler.http_requestcCsLt|jd�rHd|jkr"dkr8nn|j�|jd�n|j�|jd�|S)NrQr�r�TF)r�r4r�rPrt)r�r�r�rLrLrMr�s
z&AbstractBasicAuthHandler.http_response)N)r�r�r��re�compile�IrWr�r]rar_rhr��
https_requestr�rLrLrLrMr#�s�

c@seZdZdZdd�ZdS)r$rfcCs|j}|�d|||�}|S)N�www-authenticate)rtra)r�r�rhr�r�rirHr�rLrLrM�http_error_401$s�z#HTTPBasicAuthHandler.http_error_401N)r�r�r�rbrnrLrLrLrMr$ sc@seZdZdZdd�ZdS)r%r-cCs|j}|�d|||�}|S�N�proxy-authenticate)rzra)r�r�rhr�r�rirr�rLrLrM�http_error_407/s�z$ProxyBasicAuthHandler.http_error_407N)r�r�r�rbrqrLrLrLrMr%+sc@sNeZdZddd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Zdd�Z	dd�Z
dS)r&NcCs4|dkrt�}||_|jj|_d|_d|_d|_dS�Nr)r r4r>�retried�nonce_count�
last_nonce)r�r4rLrLrMr�Is
z"AbstractDigestAuthHandler.__init__cCs
d|_dSrr)rsr�rLrLrM�reset_retry_countRsz+AbstractDigestAuthHandler.reset_retry_countcCs||�|d�}|jdkr*t|jdd|d��n|jd7_|rx|��d}|��dkr`|�||�S|��dkrxtd|��dS)	N�i�zdigest auth failedrVrZdigestr^zEAbstractDigestAuthHandler does not support the following scheme: '%s')r�rsrrtr[rx�retry_http_digest_authrB)r�rbrzr�rir`rrLrLrMraUs

��z/AbstractDigestAuthHandler.http_error_auth_reqedcCsz|�dd�\}}ttdt|���}|�||�}|rvd|}|j�|jd�|krRdS|�|j|�|j	j
||jd�}|SdS)Nr�rVz	Digest %sr)r[�parse_keqv_list�filter�parse_http_list�get_authorizationrir�rbr�r�rGrJ)r�r�re�tokenZ	challenge�chalZauth_valZresprLrLrMrxisz0AbstractDigestAuthHandler.retry_http_digest_authcCs@d|j|t��f}|�d�td�}t�|���}|dd�S)Nz	%s:%s:%s:r,��)rt�time�ctimer2�_randombytes�hashlib�sha1�	hexdigest)r��nonce�s�b�digrLrLrM�
get_cnonceusz$AbstractDigestAuthHandler.get_cnoncecCs�z6|d}|d}|�d�}|�dd�}|�dd�}Wntk
rLYdSX|�|�\}}	|dkrhdS|j�||j�\}
}|
dkr�dS|jdk	r�|�|j|�}nd}d|
||f}
d|��|j	f}|dkr�|	||
�d|||�f�}n~d	|�
d
�k�r\||jk�r|jd7_nd|_||_d|j}|�
|�}d
|||d	||�f}|	||
�|�}ntd|��d|
|||j	|f}|�r�|d|7}|�r�|d|7}|d|7}|�r�|d||f7}|S)Nr<r��qop�	algorithm�MD5�opaquez%s:%s:%sr+re�,rVz%08xz%s:%s:%s:%s:%szqop '%s' is not supported.z>username="%s", realm="%s", nonce="%s", uri="%s", response="%s"z
, opaque="%s"z
, digest="%s"z, algorithm="%s"z, qop=auth, nc=%s, cnonce="%s")r��KeyError�get_algorithm_implsr4rCrtrI�get_entity_digestr�r�r[rurtr�r)r�r�r~r<r�r�r�r��H�KDr rcZentdigZA1ZA2ZrespdigZncvalueZcnonceZnoncebitrGrLrLrMr|�s\

�


��z+AbstractDigestAuthHandler.get_authorizationcsD|dkrdd��n|dkr$dd��ntd|���fdd�}�|fS)Nr�cSst�|�d����S�Nr,)r�Zmd5r2r���xrLrLrMr'��z?AbstractDigestAuthHandler.get_algorithm_impls.<locals>.<lambda>ZSHAcSst�|�d����Sr�)r�r�r2r�r�rLrLrMr'�r�z.Unsupported digest authentication algorithm %rcs�d||f�S)Nr+rL)r��d�r�rLrMr'�r�)rB)r�r�r�rLr�rMr��s

�z-AbstractDigestAuthHandler.get_algorithm_implscCsdSrNrL)r�rIr~rLrLrMr��sz+AbstractDigestAuthHandler.get_entity_digest)N)r�r�r�r�rvrarxr�r|r�r�rLrLrLrMr&>s
	>
c@s eZdZdZdZdZdd�ZdS)r'z�An authentication protocol defined by RFC 2069

    Digest authentication improves on basic authentication because it
    does not transmit passwords in the clear.
    rf��cCs*t|j�d}|�d|||�}|��|S)NrVrm)rrtrarv�r�r�rhr�r�rirz�retryrLrLrMrn�s�z$HTTPDigestAuthHandler.http_error_401N)r�r�r�r�rbr�rnrLrLrLrMr'�sc@seZdZdZdZdd�ZdS)r(�Proxy-Authorizationr�cCs"|j}|�d|||�}|��|Sro)rzrarvr�rLrLrMrq�s�z%ProxyDigestAuthHandler.http_error_407N)r�r�r�rbr�rqrLrLrLrMr(�sc@s6eZdZd
dd�Zdd�Zdd�Zdd	�Zd
d�ZdS)�AbstractHTTPHandlerrcCs
||_dSrN��_debuglevel)r��
debuglevelrLrLrMr��szAbstractHTTPHandler.__init__cCs
||_dSrNr�)r��levelrLrLrM�set_http_debuglevel�sz'AbstractHTTPHandler.set_http_debuglevelcCstjj�|j|���SrN)r�r��HTTPConnection�_get_content_lengthrIr��r�ryrLrLrMr��s�z'AbstractHTTPHandler._get_content_lengthcCs|j}|std��|jdk	r�|j}t|t�r8d}t|��|�d�sN|�dd�|�d�s�|�d�s�|�|�}|dk	r�|�dt|��n|�dd�|}|�	�r�t
|j�\}}t|�\}}	|�d�s�|�d|�|j
jD]&\}
}|
��}
|�|
�s�|�|
|�q�|S)	N�
no host givenz\POST data should be bytes, an iterable of bytes, or a file object. It cannot be of type str.zContent-type�!application/x-www-form-urlencodedr��Transfer-encodingZchunkedrs)rzrrIr�r�r�r�r�r�r�rr�rr�r�r�)r�ryrzrIr�Zcontent_lengthZsel_hostrZselZsel_pathr_r�rLrLrM�do_request_�sJ


�
�
��

zAbstractHTTPHandler.do_request_c

sT|j}|std��||fd|ji|��}|�|j�t|j�����fdd�|j�	�D��d�d<dd���	�D��|j
r�i}d}|�kr��|||<�|=|j|j
|d	�z`z&|j|�
�|j|j�|�d
�d�Wn,tk
�r}zt|��W5d}~XYnX|��}	Wn|���YnX|j�r>|j��d|_|��|	_|	j|	_|	S)
z�Return an HTTPResponse object for the request, using http_class.

        http_class must implement the HTTPConnection API from http.client.
        r�rJcsi|]\}}|�kr||�qSrLrLr��rirLrMr/s�z/AbstractHTTPHandler.do_open.<locals>.<dictcomp>r��
ConnectioncSsi|]\}}|��|�qSrL)�title)r�r_r�rLrLrMr<sr�r�r�)Zencode_chunkedN)rzrrJZset_debuglevelr�r�r|�updaterirr~Z
set_tunnelryr�r�rIr�rq�getresponser�Zsockr�rH�reasonr�)
r�Z
http_classr�Zhttp_conn_argsrzr�Ztunnel_headersZproxy_auth_hdr�errr&rLr�rMr�!sB
�


zAbstractHTTPHandler.do_openN)r)r�r�r�r�r�r�r�r�rLrLrLrMr��s

&r�c@seZdZdd�ZejZdS)r)cCs|�tjj|�SrN)r�r�r�r��r�r�rLrLrM�	http_openfszHTTPHandler.http_openN)r�r�r�r�r�r�rhrLrLrLrMr)dsr�c@s$eZdZddd�Zdd�ZejZdS)rErNcCst�||�||_||_dSrN)r�r��_context�_check_hostname)r�r�r>�check_hostnamerLrLrMr�oszHTTPSHandler.__init__cCs|jtjj||j|jd�S)N)r>r�)r�r�r�r�r�r�r�rLrLrM�
https_opents�zHTTPSHandler.https_open)rNN)r�r�r�r�r�r�r�rlrLrLrLrMrEms
rEc@s.eZdZddd�Zdd�Zdd�ZeZeZdS)	rNcCs$ddl}|dkr|j��}||_dSrr)Zhttp.cookiejar�	cookiejarZ	CookieJar)r�r�r�rLrLrMr�}s
zHTTPCookieProcessor.__init__cCs|j�|�|SrN)r�Zadd_cookie_headerr�rLrLrMrh�sz HTTPCookieProcessor.http_requestcCs|j�||�|SrN)r�Zextract_cookies)r�ryr�rLrLrMr��sz!HTTPCookieProcessor.http_response)N)r�r�r�r�rhr�rlr�rLrLrLrMr|s

c@seZdZdd�ZdS)r.cCs|j}td|��dS)Nzunknown url type: %s)r�r)r�r�r�rLrLrMr��szUnknownHandler.unknown_openN)r�r�r�r�rLrLrLrMr.�scCsNi}|D]@}|�dd�\}}|ddkr@|ddkr@|dd�}|||<q|S)z>Parse list of key=value strings where keys are not duplicated.�=rVrrTrS)r[)�lZparsedZeltr�rrLrLrMry�s
rycCs�g}d}d}}|D]l}|r*||7}d}q|rT|dkr>d}qn|dkrJd}||7}q|dkrl|�|�d}q|dkrxd}||7}q|r�|�|�dd�|D�S)	apParse lists as described by RFC 2068 Section 2.

    In particular, parse comma-separated lists where the elements of
    the list may include quoted-strings.  A quoted-string could
    contain a comma.  A non-quoted string could have quotes in the
    middle.  Neither commas nor quotes count if they are escaped.
    Only double-quotes count, not single-quotes.
    rrF�\TrTr�cSsg|]}|���qSrL)rg)r��partrLrLrM�
<listcomp>�sz#parse_http_list.<locals>.<listcomp>)ra)r��resr��escaper	ZcurrLrLrMr{�s4	


r{c@s(eZdZdd�ZdZdd�Zdd�ZdS)r*cCs\|j}|dd�dkrN|dd�dkrN|jrN|jdkrN|j|��krXtd��n
|�|�SdS)Nr:rrVr
�	localhost�-file:// scheme is supported only on localhost)r�rz�	get_namesr�open_local_file)r�r�rHrLrLrM�	file_open�s&�
zFileHandler.file_openNcCs`tjdkrZz*tt�d�dt�t���d�t_Wn$tjk
rXt�d�ft_YnXtjS)Nr�r:)r*�namesr;r��gethostbyname_ex�gethostname�gaierror�
gethostbynamer�rLrLrMr��s
��
zFileHandler.get_namesc
Cs�ddl}ddl}|j}|j}t|�}z�t�|�}|j}|jj	|j
dd�}	|�|�d}
|�d|
pbd||	f�}|r~t
|�\}}|r�|s�t|�|��kr�|r�d||}
nd|}
tt|d�||
�WSWn*tk
r�}zt|��W5d}~XYnXtd��dS)	NrT�Zusegmtz6Content-type: %s
Content-length: %d
Last-modified: %s
�
text/plain�file://�rbzfile not on local host)�email.utils�	mimetypesrzr�r4r[�stat�st_size�utils�
formatdate�st_mtime�
guess_type�message_from_stringr
�_safe_gethostbynamer�rrGrqr)r�r��emailr�rzrfZ	localfile�statsrm�modified�mtyperirFZorigurl�exprLrLrMr��s:
����zFileHandler.open_local_file)r�r�r�r�r�r�r�rLrLrLrMr*�s
cCs*zt�|�WStjk
r$YdSXdSrN)r�r�r�)rzrLrLrMr��sr�c@seZdZdd�Zdd�ZdS)r+c
Cs*ddl}ddl}|j}|s"td��t|�\}}|dkr>|j}nt|�}t|�\}}|rdt|�\}}nd}t	|�}|pvd}|p~d}zt
�|�}Wn*tk
r�}zt|��W5d}~XYnXt
|j�\}	}
|	�d�}ttt	|��}|dd�|d}}|�r|d�s|dd�}z�|�||||||j�}
|�r6d�p8d}|
D]2}t|�\}}|��d	k�r>|d
k�r>|��}�q>|
�||�\}}d}|�|j�d}|�r�|d|7}|dk	�r�|dk�r�|d|7}t�|�}t|||j�WS|jk
�r$}z"td
|�}|�t� �d��W5d}~XYnXdS)Nr�ftp error: no host givenrrr
rSrVrk�Dr���a�Ar�rkr�r�zContent-type: %s
zContent-length: %d
�
ftp error: %rr:)!�ftplibr�rzrr
�FTP_PORTrbrrr
r�r�rqrr�r[r��map�connect_ftprJrrx�upper�retrfiler�rtr�r�r�
all_errors�with_tracebackr��exc_info)r�r�r�r�rzrFr r4r�r\�attrs�dirsrO�fwr��attrr�rh�retrlenrir�r��excrLrLrM�ftp_opens^
�
zFTPHandler.ftp_openc	Cst||||||dd�S)NF)�
persistent)�
ftpwrapper)r�r r4rzrFr�rJrLrLrMr�7s�zFTPHandler.connect_ftpN)r�r�r�r�r�rLrLrLrMr+s5c@s<eZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
S)r,cCs"i|_i|_d|_d|_d|_dS)Nr�<r�)�cacherJ�soonest�delay�	max_connsr�rLrLrMr�>s
zCacheFTPHandler.__init__cCs
||_dSrN)r�)r��trLrLrM�
setTimeoutEszCacheFTPHandler.setTimeoutcCs
||_dSrN)r�)r�rrLrLrM�setMaxConnsHszCacheFTPHandler.setMaxConnscCsr|||d�|�|f}||jkr4t��|j|j|<n,t||||||�|j|<t��|j|j|<|��|j|S)Nr
)�joinr�r�r�rJr��check_cache)r�r r4rzrFr�rJr�rLrLrMr�Ks

�
zCacheFTPHandler.connect_ftpcCs�t��}|j|krPt|j���D].\}}||kr |j|��|j|=|j|=q tt|j����|_t	|j�|j
kr�t|j���D]&\}}||jkr�|j|=|j|=q�q�tt|j����|_dSrN)r�r�r�rJrr�r��min�valuesrdr�)r�r�r�rrLrLrMrVs


zCacheFTPHandler.check_cachecCs0|j��D]}|��q
|j��|j��dSrN)r�rr��clearrJ)r��connrLrLrM�clear_cachejs

zCacheFTPHandler.clear_cacheN)	r�r�r�r�r�r�r�rrrLrLrLrMr,;sc@seZdZdd�ZdS)r-cCs~|j}|�dd�\}}|�dd�\}}t|�}|�d�rNt�|�}|dd�}|sVd}t�d|t|�f�}t	t
�|�||�S)N�:rVr�z;base64i�����text/plain;charset=US-ASCIIz$Content-type: %s
Content-length: %d
)rtr[r�endswithr0�decodebytesr�r�rdr�io�BytesIO)r�r�rHrrIZ	mediatyperirLrLrM�	data_openqs



�zDataHandler.data_openN)r�r�r�rrLrLrLrMr-psr��nt)r4r3cCst|�S)zOS-specific conversion from a relative URL of the 'file' scheme
        to a file system path; not recommended for general use.)r
��pathnamerLrLrMr4�scCst|�S)zOS-specific conversion from a file system path to a relative URL
        of the 'file' scheme; not recommended for general use.)r	rrLrLrMr3�sc@s�eZdZdZdZdeZd*dd�Zdd�Zdd	�Z	d
d�Z
dd
�Zd+dd�Zd,dd�Z
d-dd�Zd.dd�Zdd�Zd/dd�Zd0dd�Zdd�Zer�dd�Zd1d d!�Zd"d#�Zd$d%�Zd&d'�Zd2d(d)�ZdS)3r8a,Class to open URLs.
    This is a class rather than just a subroutine because we may need
    more than one set of global protocol-specific options.
    Note -- this is a base class for those who don't want the
    automatic handling of errors type 302 (relocated) and 401
    (authorization needed).Nr�cKs�dd|jji}tj|tdd�|dkr.t�}t|d�s@td��||_|�	d�|_
|�	d�|_d	|jfd
g|_
g|_tj|_d|_t|_dS)NzW%(class)s style of invoking requests is deprecated. Use newer urlopen functions/methods�classrV)�
stacklevelr$r%�key_file�	cert_filez
User-Agent)ZAcceptz*/*)rOr�r?r@rAr5r�r(r)r�rr�versionr��_URLopener__tempfilesr[rp�_URLopener__unlink�	tempcache�ftpcache)r�r)Zx509r�rLrLrMr��s
�zURLopener.__init__cCs|��dSrN)r�r�rLrLrM�__del__�szURLopener.__del__cCs|��dSrN)�cleanupr�rLrLrMr��szURLopener.closec	CsV|jrB|jD](}z|�|�Wqtk
r2YqXq|jdd�=|jrR|j��dSrN)rrrqrr)r�rOrLrLrMr�s
zURLopener.cleanupcGs|j�|�dS)zdAdd a header to be used by the HTTP interface only
        e.g. u.addheader('Accept', 'sound/basic')N)r�ra)r�r�rLrLrM�	addheader�szURLopener.addheaderc
Csptt|��}t|dd�}|jrL||jkrL|j|\}}t|d�}t|||�St|�\}}|s`d}||jkr�|j|}t|�\}}	t|	�\}
}|
|f}nd}d|}||_	|�
dd�}t||�r�|d	kr�|r�|�|||�S|�
||�Sz0|dk�rt||�|�WSt||�||�WSWnVttfk
�r0�Yn<tk
�rj}
ztd
|
��t��d��W5d}
~
XYnXdS)z6Use URLopener().open(file) instead of open(file, 'r').z%/:=&?~#+!$,;'@()*[]|�rr�rONZopen_�-r�r�zsocket errorr:)rrr	rrGrrr)rr�rr��open_unknown_proxy�open_unknownr�rrrqr�r�r�)r�r�rIrfrirh�urltyperHr�	proxyhostrzr�r_r�rLrLrMrG�s<




zURLopener.opencCst|�\}}tdd|��dS)�/Overridable interface to open unknown URL type.�	url errorzunknown url typeN�rrq)r�r�rIr�rHrLrLrMr
szURLopener.open_unknowncCs t|�\}}tdd||��dS)r"r#zinvalid proxy for %sNr$)r�rr�rIr�rHrLrLrMrszURLopener.open_unknown_proxyc
Cstt|��}|jr&||jkr&|j|St|�\}}|dkr�|rF|dkr�z0|�|�}|��}|��tt|�d�|fWSt	k
r�}	zW5d}	~	XYnX|�
||�}�z<|��}
|r�t
|d�}nrt|�\}}
t|
p�d�\}}
t|
p�d�\}
}t|
p�d�\}
}t
j�|
�d}t�|�\}}|j�|�t
�|d�}z�||
f}|jdk	�rT||j|<d}d}d}d}d	|
k�rzt|
d
�}|�r�||||�|�|�}|�s��q�|t|�7}|�|�|d7}|�r�||||��q�W5|��XW5|��X|dk�r||k�rtd||f|��|S)ztretrieve(url) returns (filename, headers) for a local object
        or (tempfilename, headers) for a remote object.NrOrVrPrrrRrSrrTrUrW)rrrrr�rZr�r4rrqrGrrr[r\�splitextr^Zmkstemprra�fdopenrbrcrdrer)r�rHrfrgrIr�Zurl1rhr�r�rirjZgarbager\�suffix�fdrkrlrmrcrnrorLrLrM�retrievesn






��zURLopener.retrievecCs$d}d}t|t�r<t|�\}}|r6t|�\}}t|�}|}nt|\}}t|�\}}t|�\}	}
|
}d}|	��dkrvd}n:t|
�\}}
|r�t|�\}}|r�d|	||
f}t|�r�|}|s�tdd��|r�t|�}t	�
|����d�}nd}|�rt|�}t	�
|����d�}nd}||�}
i}|�r*d||d<|�r<d||d	<|�rJ||d
<d|d<|j
D]\}}|||<�qX|dk	�r�d
|d<|
�d|||�n|
jd||d�z|
��}Wn"tjjk
�r�td��YnXd|jk�r�dk�rnnt||jd||j�S|�||j|j|j|j|�SdS)a�Make an HTTP connection using connection_class.

        This is an internal method that should be called from
        open_http() or open_https().

        Arguments:
        - connection_factory should take a host name and return an
          HTTPConnection instance.
        - url is the url to retrieval or a host, relative-path pair.
        - data is payload for a POST request or None.
        Nr�z	%s://%s%sz
http errorr�r,zBasic %sr�rfrsr�r�r�zContent-Typer�r�r�z$http protocol error: bad status liner�r��http:)r�r�rrr
rrxr/rqr0r1r2r3r�ryr�r�r�Z
BadStatusLinerZstatusrr��
http_errorrhr�)r�Zconnection_factoryrHrIZuser_passwdZproxy_passwdrzr�Zrealhostr r�Z
proxy_authreZ	http_connrir\r�r�rLrLrM�_open_generic_httpVs~



��zURLopener._open_generic_httpcCs|�tjj||�S)zUse HTTP protocol.)r,r�r�r��r�rHrIrLrLrM�	open_http�szURLopener.open_httpc
Csbd|}t||�rPt||�}|dkr6||||||�}	n|||||||�}	|	rP|	S|�|||||�S)z�Handle http errors.

        Derived class can override this, or provide specific handlers
        named http_error_DDD where DDD is the 3-digit error code.z
http_error_%dN)r�r�r�)
r�rHrh�errcode�errmsgrirIr_r�rkrLrLrMr+�s

zURLopener.http_errorcCs|��t||||d��dS)z>Default error handler: close the connection and raise OSError.N)r�r�r�rHrhr/r0rirLrLrMr��szURLopener.http_error_defaultcCstjj||j|jd�S)N)rr)r�r�r�rr)r�rzrLrLrM�_https_connection�s�zURLopener._https_connectioncCs|�|j||�S)zUse HTTPS protocol.)r,r2r-rLrLrM�
open_https�szURLopener.open_httpscCs^t|t�std��|dd�dkrP|dd�dkrP|dd���dkrPtd	��n
|�|�SdS)
z/Use local file or FTP depending on form of URL.zEfile error: proxy support for file protocol currently not implementedNr:rrVr
�z
localhost/r�)r�r�rrxrBr�r�rLrLrM�	open_file�s

4
zURLopener.open_filec
Cs\ddl}ddl}t|�\}}t|�}zt�|�}Wn0tk
rb}zt|j|j	��W5d}~XYnX|j
}	|jj|j
dd�}
|�|�d}|�d|p�d|	|
f�}|s�|}
|dd�dkr�d	|}
tt|d
�||
�St|�\}}|�sPt�|�t�ft�k�rP|}
|dd�dk�r d	|}
n|dd�dk�r>td
|��tt|d
�||
�Std��dS)zUse local file.rNTr�z6Content-Type: %s
Content-Length: %d
Last-modified: %s
r�rVr
r�r�r:z./zAlocal file url may start with / or file:. Unknown url of type: %sz#local file error: not on local host)r�r�rr4r[r�rqr�strerrorrfr�r�r�r�r�r�rrGr
r�r�r��thishostrB)r�rHr�r�rzrOZ	localnamer��ermr�r�riZurlfilerFrLrLrMr��s@ ���
zURLopener.open_local_filec
Cs�t|t�std��ddl}t|�\}}|s2td��t|�\}}t|�\}}|r\t|�\}}nd}t|�}t|ppd�}t|p|d�}t	�
|�}|s�ddl}|j}nt
|�}t|�\}}	t|�}|�d�}
|
dd�|
d}
}|
r�|
ds�|
dd�}
|
�r
|
d�s
d|
d<|||d�|
�f}t|j�tk�rbt|j�D]*}
|
|k�r6|j|
}|j|
=|���q6z�||jk�r�t|||||
�|j|<|�s�d	}nd
}|	D]2}t|�\}}|��dk�r�|dk�r�|��}�q�|j|�||�\}}|�d
|�d}d}|�r|d|7}|dk	�r,|dk�r,|d|7}t�|�}t||d
|�WSt�k
�r�}ztd|�� t!�"�d��W5d}~XYnXdS)zUse FTP protocol.zCftp error: proxy support for ftp protocol currently not implementedrNr�rrr
rSrVr�rkr�r�zftp:zContent-Type: %s
zContent-Length: %d
zftp error %rr:)#r�r�rr�rr
rrr
r�r�r�r�rbrr[r�rdr�MAXFTPCACHEr�r�r�rrxr�r�r�r�r�r�	ftperrorsr�r�r�)r�rHr�rzr\rFr r4r�r�r�rOr�r�rr�r�r�rhr�r�rir�rLrLrM�open_ftp�st




��
zURLopener.open_ftpc	
Cs<t|t�std��z|�dd�\}}Wntk
rDtdd��YnX|sNd}|�d�}|dkr�d	||d
�kr�||dd
�}|d
|�}nd}g}|�dt�	d
t�
t�����|�d|�|dkr�t�|�
d���d�}nt|�}|�dt|��|�d�|�|�d�|�}t�|�}t�|�}t|||�S)zUse "data" URL.zEdata error: proxy support for data protocol currently not implementedr�rVz
data errorzbad data URLr�;rr�NrrzDate: %sz%a, %d %b %Y %H:%M:%S GMTzContent-type: %sr0r,zlatin-1zContent-Length: %d�
)r�r�rr[rBrq�rfindrar��strftime�gmtimer0r	r2r3r
rdr�r�r�r
�StringIOr)	r�rHrIr�Zsemirr�ri�frLrLrM�	open_data8s8

�




zURLopener.open_data)N)N)N)N)NNN)N)N)N)N)r�r�r�r�rr�rr�rr�rrrGrrr)r,r.r+r�rCr2r3r5r�r;rCrLrLrLrMr8�s.

$


A\


	 :c@s�eZdZdZdd�Zdd�Zd#dd�Zd	d
�Zd$dd�Zd%d
d�Z	d&dd�Z
d'dd�Zd(dd�Zd)dd�Z
d*dd�Zd+dd�Zd,dd�Zd-dd �Zd!d"�ZdS).r9z?Derived class with handlers for errors we can handle (perhaps).cOs(tj|f|�|�i|_d|_d|_dS)Nrr�)r8r��
auth_cache�tries�maxtriesrLrLrLrMr�eszFancyURLopener.__init__cCst||d||�S)z3Default error handling -- don't raise an exception.r*)rr1rLrLrMr�ksz!FancyURLopener.http_error_defaultNc	Csv|jd7_zZ|jrN|j|jkrNt|d�r4|j}n|j}|||dd|�W�S|�||||||�}|W�Sd|_XdS)z%Error 302 -- relocated (temporarily).rVr�http_error_500r�z)Internal Server Error: Redirect RecursionN)rErFr�rGr��redirect_internal)	r�rHrhr/r0rirIr�rkrLrLrMros 
��zFancyURLopener.http_error_302c	Csxd|kr|d}nd|kr$|d}ndS|��t|jd||�}t|�}|jdkrnt|||d|||��|�|�S)Nrrrrz( Redirection to url '%s' is not allowed.)r�rr�rrrrG)	r�rHrhr/r0rirIrrrLrLrMrH�s"


��z FancyURLopener.redirect_internalcCs|�||||||�S)z*Error 301 -- also relocated (permanently).�r�r�rHrhr/r0rirIrLrLrMr�szFancyURLopener.http_error_301cCs|�||||||�S)z;Error 303 -- also relocated (essentially identical to 302).rIrJrLrLrMr�szFancyURLopener.http_error_303cCs2|dkr|�||||||�S|�|||||�SdS)z1Error 307 -- relocated, but turn POST into error.N)rr�rJrLrLrMr�szFancyURLopener.http_error_307Fc
Cs�d|krt�||||||�|d}t�d|�}	|	sHt�||||||�|	��\}
}|
��dkrtt�||||||�|s�t�||||||�d|jd}|dkr�t||�||�St||�|||�SdS)z_Error 401 -- authentication required.
        This function supports Basic authentication only.rm�![ 	]*([^ 	]+)[ 	]+realm="([^"]*)"r^Zretry_�_basic_authN�r8r�ri�matchrYrxr�r��
r�rHrhr/r0rirIr�ZstuffrNrr<r_rLrLrMrn�s:
�
�
��zFancyURLopener.http_error_401c
Cs�d|krt�||||||�|d}t�d|�}	|	sHt�||||||�|	��\}
}|
��dkrtt�||||||�|s�t�||||||�d|jd}|dkr�t||�||�St||�|||�SdS)zeError 407 -- proxy authentication required.
        This function supports Basic authentication only.rprKr^Zretry_proxy_rLNrMrOrLrLrMrq�s:
�
�
��zFancyURLopener.http_error_407cCs�t|�\}}d||}|jd}t|�\}}	t|	�\}	}
|	�d�d}|	|d�}	|�|	||�\}}
|sr|
srdSdt|dd�t|
dd�|	f}	d|	|
|jd<|dkr�|�|�S|�||�SdS)N�http://r�rrV�%s:%s@%srrr�rr)rr��get_user_passwdr	rG�r�rHr<rIrzr�rrr r!Z
proxyselectorr�r r4rLrLrM�retry_proxy_http_basic_auth�s$

�
z*FancyURLopener.retry_proxy_http_basic_authcCs�t|�\}}d||}|jd}t|�\}}	t|	�\}	}
|	�d�d}|	|d�}	|�|	||�\}}
|sr|
srdSdt|dd�t|
dd�|	f}	d|	|
|jd<|dkr�|�|�S|�||�SdS)N�https://r�rrVrQrrrrRrTrLrLrM�retry_proxy_https_basic_auth�s$

�
z+FancyURLopener.retry_proxy_https_basic_authc
Cs�t|�\}}|�d�d}||d�}|�|||�\}}|sD|sDdSdt|dd�t|dd�|f}d||}	|dkr�|�|	�S|�|	|�SdS)NrrVrQrrrrP�rr�rSr	rG�
r�rHr<rIrzr�r�r r4rrLrLrMr_	s
�
z$FancyURLopener.retry_http_basic_authc
Cs�t|�\}}|�d�d}||d�}|�|||�\}}|sD|sDdSdt|dd�t|dd�|f}d||}	|dkr�|�|	�S|�|	|�SdS)NrrVrQrrrrVrXrYrLrLrM�retry_https_basic_auth	s
�
z%FancyURLopener.retry_https_basic_authrcCs`|d|��}||jkr2|r(|j|=n
|j|S|�||�\}}|sJ|rX||f|j|<||fS)Nr)rxrD�prompt_user_passwd)r�rzr<rr�r r4rLrLrMrS	s


zFancyURLopener.get_user_passwdcCsXddl}z.td||f�}|�d|||f�}||fWStk
rRt�YdSXdS)z#Override this in a GUI environment!rNzEnter username for %s at %s: z#Enter password for %s in %s at %s: r?)�getpass�input�KeyboardInterrupt�print)r�rzr<r\r r4rLrLrMr[)	s�
z!FancyURLopener.prompt_user_passwd)N)N)N)N)NF)NF)N)N)N)N)r)r�r�r�r�r�r�rrHrrrrnrqrUrWr_rZrSr[rLrLrLrMr9bs(



�
�





cCstdkrt�d�atS)z8Return the IP address of the magic hostname 'localhost'.Nr�)�
_localhostr�r�rLrLrLrMr�9	s
r�cCsPtdkrLztt�t���d�aWn(tjk
rJtt�d�d�aYnXtS)z,Return the IP addresses of the current host.Nr:r�)�	_thishostr;r�r�r�r�rLrLrLrMr7A	sr7cCstdkrddl}|jatS)z1Return the set of errors raised by the FTP class.Nr)�
_ftperrorsr�r�)r�rLrLrMr:L	sr:cCstdkrt�d�atS)z%Return an empty email Message object.Nrr)�
_noheadersr�r�rLrLrLrM�	noheadersU	s
rdc@sJeZdZdZddd�Zdd�Zdd	�Zd
d�Zdd
�Zdd�Z	dd�Z
dS)r�z;Class used by open_ftp() for cache of open FTP connections.NTcCsX||_||_||_||_||_||_d|_||_z|��Wn|�	��YnXdSrr)
r r4rzrFr�rJ�refcount�	keepalive�initr�)r�r r4rzrFr�rJr�rLrLrMr�b	szftpwrapper.__init__cCs\ddl}d|_|��|_|j�|j|j|j�|j�|j	|j
�d�|j�}|j�
|�dS)Nrr
)r��busyZFTPr	ZconnectrzrFrJZloginr r4r�r��cwd)r�r�Z_targetrLrLrMrgr	s
zftpwrapper.initc
Cs�ddl}|��|dkr"d}d}nd|}d}z|j�|�Wn*|jk
rh|��|j�|�YnXd}|r�|s�zd|}|j�|�\}}WnR|jk
r�}z2t|�dd�dkr�t	d	|��
t��d
��W5d}~XYnX|�s�|j�d�|�rl|j�
�}	zJz|j�|�Wn4|jk
�rN}zt	d	|�|�W5d}~XYnXW5|j�|	�Xd|}nd}|j�|�\}}d|_t|�d
�|j�}
|jd7_|��|
|fS)Nr)r�r�zTYPE ArVzTYPE zRETR rVZ550r�r:zLIST ZLISTr�)r��endtransferr	Zvoidcmdr�rgZntransfercmdZ
error_permr�rr�r�r��pwdrirhrZmakefile�
file_closerer�)r�rOr�r��cmd�isdirrr�r�rkZftpobjrLrLrMr�{	sP
�
$
zftpwrapper.retrfilecCs
d|_dSrr)rhr�rLrLrMrj�	szftpwrapper.endtransfercCsd|_|jdkr|��dS)NFr)rfre�
real_closer�rLrLrMr��	s
zftpwrapper.closecCs2|��|jd8_|jdkr.|js.|��dS)NrVr)rjrerfror�rLrLrMrl�	szftpwrapper.file_closecCs2|��z|j��Wnt�k
r,YnXdSrN)rjr	r�r:r�rLrLrMro�	s
zftpwrapper.real_close)NT)r�r�r�r�r�rgr�rjr�rlrorLrLrLrMr�_	s�
	-r�cCs�i}tj��D]4\}}|��}|r|dd�dkr|||dd�<qdtjkrZ|�dd�tj��D]J\}}|dd�dkrd|��}|r�|||dd�<qd|�|dd�d�qd|S)aReturn a dictionary of scheme -> proxy server URL mappings.

    Scan the environment for variables named <scheme>_proxy;
    this seems to be the standard convention.  If you need a
    different way, you can pass a proxies dictionary to the
    [Fancy]URLopener constructor.

    i����N�_proxyZREQUEST_METHODr�)r[�environrrxr�)r)r_r�rLrLrM�getproxies_environment�	s	
rrcCs�|dkrt�}z|d}Wntk
r0YdSX|dkr>dS|��}t|�\}}|�d�D]Z}|��}|r\|�d�}|��}||ks�||kr�dSd|}|�|�s�|�|�r\dSq\dS)z�Test if proxies should not be used for a particular host.

    Checks the proxy dict for the value of no_proxy, which should
    be a list of comma separated DNS suffixes, or '*' for all hosts.

    NZnoF�*Tr��.)rrr�rxr
r[rg�lstripr)rzr)Zno_proxy�hostonlyrFr_rLrLrM�proxy_bypass_environment�	s*
rwc	Cs0ddlm}t|�\}}dd�}d|kr4|dr4dSd}|�d	d
�D]�}|sNqDt�d|�}|dk	�r|dkr�zt�|�}||�}Wntk
r�YqDYnX||�d��}	|�d
�}
|
dkr�d|�d��	d�d}
nt
|
dd��}
|
dksD|
dkr�qDd|
}
||
?|	|
?k�r*dSqD|||�rDdSqDdS)aj
    Return True iff this host shouldn't be accessed using a proxy

    This function uses the MacOSX framework SystemConfiguration
    to fetch the proxy information.

    proxy_settings come from _scproxy._get_proxy_settings or get mocked ie:
    { 'exclude_simple': bool,
      'exceptions': ['foo.bar', '*.bar.com', '127.0.0.1', '10.1', '10.0/16']
    }
    r)�fnmatchcSsh|�d�}ttt|��}t|�dkr<|ddddgdd�}|dd>|dd>B|dd>B|d	BS)
Nrtr�r�rVr�r:rrV)r[r�r�rbrd)ZipAddrrErLrLrM�ip2num
s

z,_proxy_bypass_macosx_sysconf.<locals>.ip2numrtZexclude_simpleTN�
exceptionsrLz(\d+(?:\.\d+)*)(/\d+)?rVr:r� F)rxr
r�rirNr�r�rq�group�countrb)rz�proxy_settingsrxrvrFrzZhostIPr�rrG�maskrLrLrM�_proxy_bypass_macosx_sysconf
s>




r��darwin)�_get_proxy_settings�_get_proxiescCst�}t||�SrN)r�r�)rzrrLrLrM�proxy_bypass_macosx_sysconfF
sr�cCst�S)z�Return a dictionary of scheme -> proxy server URL mappings.

        This function uses the MacOSX framework SystemConfiguration
        to fetch the proxy information.
        )r�rLrLrLrM�getproxies_macosx_sysconfJ
sr�cCs t�}|rt||�St|�SdS)z�Return True, if host should be bypassed.

        Checks proxy settings gathered from the environment, if specified,
        or from the MacOSX framework SystemConfiguration.

        N)rrrwr��rzr)rLrLrMr/T
s
r/cCst�p
t�SrN)rrr�rLrLrLrMr5a
sc
Csi}zddl}Wntk
r(|YSXz�|�|jd�}|�|d�d}|r�t|�|d�d�}d|kr�|�d�D]4}|�dd�\}}t�d	|�s�d
||f}|||<qtn>|dd�dkr�||d
<n$d||d
<d||d<d||d<|�	�Wnt
ttfk
�rYnX|S)zxReturn a dictionary of scheme -> proxy server URL mappings.

        Win32 uses the registry to store proxies.

        rN�;Software\Microsoft\Windows\CurrentVersion\Internet Settings�ProxyEnableZProxyServerr�r<rVz
(?:[^/:]+)://z%s://%srwr*r�z	http://%sz
https://%sr�zftp://%sr	)
�winreg�ImportError�OpenKey�HKEY_CURRENT_USER�QueryValueExr�r[rirNZCloserqrBr�)r)r��internetSettings�proxyEnableZproxyServer�pr�ZaddressrLrLrM�getproxies_registryf
sF
�����
r�cCst�p
t�S)z�Return a dictionary of scheme -> proxy server URL mappings.

        Returns settings gathered from the environment, if specified,
        or the registry.

        )rrr�rLrLrLrMr5�
scCs|zddl}Wntk
r"YdSXz6|�|jd�}|�|d�d}t|�|d�d�}Wntk
rpYdSX|rz|s~dSt|�\}}|g}z t�	|�}||kr�|�
|�Wntk
r�YnXz t�|�}||kr�|�
|�Wntk
�r�YnX|�d�}|D]j}	|	dk�r*d|k�r*dS|	�
dd	�}	|	�
d
d�}	|	�
dd�}	|D] }
t�|	|
tj��rRdS�qR�qdS)
Nrr�r�Z
ProxyOverrider<z<local>rtrVz\.rsz.*�?)r�r�r�r�r�r�rqr
r�r�raZgetfqdnr[rrirNrk)rzr�r�r�Z
proxyOverrideZrawHostrFZaddrZfqdnrHr�rLrLrM�proxy_bypass_registry�
s`�����





r�cCs t�}|rt||�St|�SdS)z�Return True, if host should be bypassed.

        Checks proxy settings gathered from the environment, if specified,
        or the registry.

        N)rrrwr�r�rLrLrMr/�
s
)NNN)N)~r�r0r�r�r�Zhttp.clientr�r
r[�	posixpathrir�rr�r�r^rXr?Zurllib.errorrrrZurllib.parserrrrr	r
rrr
rrrrrrrrrZurllib.responserrrDr�rC�__all__�version_infor�rFr�r0r1r`r6r7rj�ASCIIrvr{rrr2rr/rrr"rr r!r"r#r$r%�urandomr�r&r'r(r�r)r�r�rErarr.ryr{r*r�r+r,r-r9r_Z
nturl2pathr4r3rr8r9r`r�rar7rbr:rcrdr�rrrwr��platformZ_scproxyr�r�r�r�r/r5r�r�rLrLrLrM�<module>s SP
��U
?m$q!+@
ov

+3:5!@W

_
%A

-	2
parse.cpython-38.opt-1.pyc000064400000107252151733313270011261 0ustar00U

&�.e���@s�dZddlZddlZddlZddlZddlZddddddd	d
ddd
ddddddddddgZddddddddd d!d"d#d$d%d&d'd(d)d*gZdddddd+dddd"d d!d,d#d$d%d-d'd(d&d.d/d0d)d*gZddd1d#ddd d!d$d%d2d3d"d&d4gZ	dd1d5d6d+ddd,d2d3g
Z
ddddd d!d"dd$d%d2d3gZddd1ddd6ddd d!d,dd#g
Zd7Z
d8Zd9d:d;gZd<ZiZd=d>�Zd?Zd@ZdAdB�ZeefdCdD�ZeefdEdF�ZdGdH�ZGdIdJ�dJe�ZGdKdL�dLe�ZGdMdN�dNe�ZGdOdP�dPee�ZGdQdR�dRee�ZddSlmZeddT�Z eddU�Z!eddV�Z"dWe _dXe j#_dYe j$_dZe!_d[e!j%_d\e!j&_d]e!j'_d^e!j(_d_e!j$_d`e"_e!j%je"j%_e!j&je"j&_e!j'je"j'_dae"j)_e!j(je"j(_e!j$je"j$_eZ*Gdbd�de e�Z+Gdcd�de!e�Z,Gddd�de"e�Z-Gded�de e�Z.Gdfd�de!e�Z/Gdgd�de"e�Z0dhdi�Z1e1�[1d�dkd�Z2dldm�Z3d�dndo�Z4dpdq�Z5drds�Z6d�dtd�Z7dud�Z8dvd�Z9d�dwd�Z:dxd�Z;dyZ<da=dzd�Z>e�?d{�Z@d�d~d�ZAd�d�d
�ZBGd�d��d�eC�ZDd�ZEdaFd�d�d�ZGd�d�d�ZHeId��ZJeKeJ�ZLiZMGd�d��d�ejN�ZOd�d�d�ZPd�d�d
�ZQd�d�d�ZRddddeQfd�d	�ZSd�d��ZTd�d��ZUd�d��ZVd�d��ZWdaXd�d��ZYd�d��ZZda[d�d��Z\d�d��Z]d�d��Z^d�d��Z_d�d��Z`d�d��Zadabd�d��Zcd�d�d��Zdd�d�d��Zed�d��Zfd�d��Zgd�d��Zhd�d��Zid�d��Zjd�d��Zkd�d��Zld�d��ZmdS)�a3Parse (absolute and relative) URLs.

urlparse module is based upon the following RFC specifications.

RFC 3986 (STD66): "Uniform Resource Identifiers" by T. Berners-Lee, R. Fielding
and L.  Masinter, January 2005.

RFC 2732 : "Format for Literal IPv6 Addresses in URL's by R.Hinden, B.Carpenter
and L.Masinter, December 1999.

RFC 2396:  "Uniform Resource Identifiers (URI)": Generic Syntax by T.
Berners-Lee, R. Fielding, and L. Masinter, August 1998.

RFC 2368: "The mailto URL scheme", by P.Hoffman , L Masinter, J. Zawinski, July 1998.

RFC 1808: "Relative Uniform Resource Locators", by R. Fielding, UC Irvine, June
1995.

RFC 1738: "Uniform Resource Locators (URL)" by T. Berners-Lee, L. Masinter, M.
McCahill, December 1994

RFC 3986 is considered the current standard and any future changes to
urlparse module should conform with it.  The urlparse module is
currently not entirely compliant with this RFC due to defacto
scenarios for parsing, and for backward compatibility purposes, some
parsing quirks from older RFCs are retained. The testcases in
test_urlparse.py provides a good indicator of parsing behavior.

The WHATWG URL Parser spec should also be considered.  We are not compliant with
it either due to existing user code API behavior expectations (Hyrum's Law).
It serves as a useful guide when making changes.
�N�urlparse�
urlunparse�urljoin�	urldefrag�urlsplit�
urlunsplit�	urlencode�parse_qs�	parse_qsl�quote�
quote_plus�quote_from_bytes�unquote�unquote_plus�unquote_to_bytes�DefragResult�ParseResult�SplitResult�DefragResultBytes�ParseResultBytes�SplitResultBytes�Zftp�httpZgopherZnntpZimapZwais�fileZhttpsZshttpZmmsZprosperoZrtspZrtspuZsftpZsvnzsvn+sshZwsZwssZtelnetZsnewsZrsyncZnfsZgitzgit+sshZhdlZsipZsipsZtelZmailtoZnewszAabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+-.z!	

 �	�
�
�cCst��t��dS)z,Clear the parse cache and the quoters cache.N)�_parse_cache�clear�
_safe_quoters�r!r!�$/usr/lib64/python3.8/urllib/parse.py�clear_cache`sr#�ascii�strictcCs|S�Nr!)�objr!r!r"�_nooposr(cCs|�||�Sr&��encode)r'�encoding�errorsr!r!r"�_encode_resultrsr-cst��fdd�|D��S)Nc3s"|]}|r|����ndVqdS)rN��decode��.0�x�r+r,r!r"�	<genexpr>xsz_decode_args.<locals>.<genexpr>)�tuple)�argsr+r,r!r3r"�_decode_argsvsr7cGsVt|dt�}|dd�D]}|rt|t�|krtd��q|rH|tfSt|�tfS)Nr�z$Cannot mix str and non-str arguments)�
isinstance�str�	TypeErrorr(r7r-)r6Z	str_input�argr!r!r"�_coerce_argszs

r=c@seZdZdZdZddd�ZdS)	�_ResultMixinStrz>Standard approach to encoding parsed results from str to bytesr!r$r%cs|j��fdd�|D��S)Nc3s|]}|����VqdSr&r)r0r3r!r"r4�sz)_ResultMixinStr.encode.<locals>.<genexpr>)�_encoded_counterpart��selfr+r,r!r3r"r*�sz_ResultMixinStr.encodeN)r$r%)�__name__�
__module__�__qualname__�__doc__�	__slots__r*r!r!r!r"r>�sr>c@seZdZdZdZddd�ZdS)	�_ResultMixinBytesz>Standard approach to decoding parsed results from bytes to strr!r$r%cs|j��fdd�|D��S)Nc3s|]}|����VqdSr&r.r0r3r!r"r4�sz+_ResultMixinBytes.decode.<locals>.<genexpr>)�_decoded_counterpartr@r!r3r"r/�sz_ResultMixinBytes.decodeN)r$r%)rBrCrDrErFr/r!r!r!r"rG�srGc@sDeZdZdZdZedd��Zedd��Zedd��Zed	d
��Z	dS)�_NetlocResultMixinBasezHShared methods for the parsed result objects containing a netloc elementr!cCs
|jdS)Nr��	_userinfo�rAr!r!r"�username�sz_NetlocResultMixinBase.usernamecCs
|jdS)Nr8rJrLr!r!r"�password�sz_NetlocResultMixinBase.passwordcCsD|jd}|sdSt|t�r dnd}|�|�\}}}|��||S)Nr�%�%)�	_hostinfor9r:�	partition�lower)rA�hostname�	separatorZpercentZzoner!r!r"rT�s
z_NetlocResultMixinBase.hostnamecCsl|jd}|dk	rhzt|d�}Wn(tk
rHd|��}t|�d�YnXd|kr^dkshntd��|S)Nr8�
z+Port could not be cast to integer value as ri��zPort out of range 0-65535)rQ�int�
ValueError)rA�port�messager!r!r"rY�s

z_NetlocResultMixinBase.portN)
rBrCrDrErF�propertyrMrNrTrYr!r!r!r"rI�s



rIc@s(eZdZdZedd��Zedd��ZdS)�_NetlocResultMixinStrr!cCsD|j}|�d�\}}}|r4|�d�\}}}|s<d}nd}}||fS)N�@�:��netloc�
rpartitionrR�rAr`ZuserinfoZ	have_info�hostinforMZ
have_passwordrNr!r!r"rK�sz_NetlocResultMixinStr._userinfocCsl|j}|�d�\}}}|�d�\}}}|rL|�d�\}}}|�d�\}}}n|�d�\}}}|sdd}||fS)Nr]�[�]r^r_�rAr`�_rcZhave_open_brZ	bracketedrTrYr!r!r"rQ�sz_NetlocResultMixinStr._hostinfoN�rBrCrDrFr[rKrQr!r!r!r"r\�s

r\c@s(eZdZdZedd��Zedd��ZdS)�_NetlocResultMixinBytesr!cCsD|j}|�d�\}}}|r4|�d�\}}}|s<d}nd}}||fS)N�@�:r_rbr!r!r"rK�sz!_NetlocResultMixinBytes._userinfocCsl|j}|�d�\}}}|�d�\}}}|rL|�d�\}}}|�d�\}}}n|�d�\}}}|sdd}||fS)Nrj�[�]rkr_rfr!r!r"rQ�sz!_NetlocResultMixinBytes._hostinfoNrhr!r!r!r"ri�s

ri)�
namedtuplezurl fragmentz!scheme netloc path query fragmentz(scheme netloc path params query fragmentz�
DefragResult(url, fragment)

A 2-tuple that contains the url without fragment identifier and the fragment
identifier as a separate argument.
z$The URL with no fragment identifier.z�
Fragment identifier separated from URL, that allows indirect identification of a
secondary resource by reference to a primary resource and additional identifying
information.
z�
SplitResult(scheme, netloc, path, query, fragment)

A 5-tuple that contains the different components of a URL. Similar to
ParseResult, but does not split params.
z%Specifies URL scheme for the request.z0
Network location where the request is made to.
z@
The hierarchical path, such as the path to a file to download.
z�
The query component, that contains non-hierarchical data, that along with data
in path component, identifies a resource in the scope of URI's scheme and
network location.
z�
Fragment identifier, that allows indirect identification of a secondary resource
by reference to a primary resource and additional identifying information.
zq
ParseResult(scheme, netloc, path, params, query, fragment)

A 6-tuple that contains components of a parsed URL.
z�
Parameters for last path element used to dereference the URI in order to provide
access to perform some operation on the resource.
c@seZdZdZdd�ZdS)rr!cCs |jr|jd|jS|jSdS)N�#��fragment�urlrLr!r!r"�geturlIszDefragResult.geturlN�rBrCrDrFrsr!r!r!r"rGsc@seZdZdZdd�ZdS)rr!cCst|�Sr&�rrLr!r!r"rsQszSplitResult.geturlNrtr!r!r!r"rOsc@seZdZdZdd�ZdS)rr!cCst|�Sr&�rrLr!r!r"rsVszParseResult.geturlNrtr!r!r!r"rTsc@seZdZdZdd�ZdS)rr!cCs |jr|jd|jS|jSdS)N�#rprLr!r!r"rs\szDefragResultBytes.geturlNrtr!r!r!r"rZsc@seZdZdZdd�ZdS)rr!cCst|�Sr&rurLr!r!r"rsdszSplitResultBytes.geturlNrtr!r!r!r"rbsc@seZdZdZdd�ZdS)rr!cCst|�Sr&rvrLr!r!r"rsiszParseResultBytes.geturlNrtr!r!r!r"rgscCs4ttfttfttff}|D]\}}||_||_qdSr&)rrrrrrr?rH)Z
_result_pairsZ_decodedZ_encodedr!r!r"�_fix_result_transcodingms�rxTc
Csft||�\}}}t|||�}|\}}}}}|tkrHd|krHt|�\}}nd}t||||||�}	||	�S)a#Parse a URL into 6 components:
    <scheme>://<netloc>/<path>;<params>?<query>#<fragment>
    Return a 6-tuple: (scheme, netloc, path, params, query, fragment).
    Note that we don't break the components up in smaller bits
    (e.g. netloc is a single string) and we don't expand % escapes.�;r)r=r�uses_params�_splitparamsr)
rr�scheme�allow_fragments�_coerce_resultZsplitresultr`�queryrq�params�resultr!r!r"rzscCsRd|kr,|�d|�d��}|dkr6|dfSn
|�d�}|d|�||dd�fS)N�/ryrrr8)�find�rfind)rr�ir!r!r"r{�s

r{cCsHt|�}dD]"}|�||�}|dkrt||�}q|||�||d�fS)Nz/?#r)�lenr��min)rr�start�delim�cZwdelimr!r!r"�_splitnetloc�sr�cCs�|r|��rdSddl}|�dd�}|�dd�}|�dd�}|�dd�}|�d|�}||kr`dSdD] }||krdtd	|d
d��qddS)Nrr]rr^ro�?�NFKCz/?#@:znetloc 'z' contains invalid z#characters under NFKC normalization)�isascii�unicodedata�replace�	normalizerX)r`r��nZnetloc2r�r!r!r"�_checknetloc�s�r�cCstD]}|�|d�}q|S)Nr)�_UNSAFE_URL_BYTES_TO_REMOVEr�)rr�br!r!r"�_remove_unsafe_bytes_from_url�sr�c
Cs�t||�\}}}t|�}t|�}|�t�}|�t�}t|�}|||t|�t|�f}t�|d�}|rj||�St	t�t
kr|t�d}}}|�d�}	|	dk�r�|d|	�dk�rn||	dd�}|dd�dk�rt
|d�\}}d	|kr�d
|k�sd
|k�rd	|k�rtd��|�r,d|k�r,|�dd�\}}d
|k�rF|�d
d�\}}t|�td||||�}
|
t|<||
�S|d|	�D]}|tk�rz�qҐqz||	dd�}|�r�tdd�|D���r�|d|	���|}}|dd�dk�r"t
|d�\}}d	|k�rd
|k�sd
|k�r"d	|k�r"td��|�rBd|k�rB|�dd�\}}d
|k�r\|�d
d�\}}t|�t|||||�}
|
t|<||
�S)aParse a URL into 5 components:
    <scheme>://<netloc>/<path>?<query>#<fragment>
    Return a 5-tuple: (scheme, netloc, path, query, fragment).
    Note that we don't break the components up in smaller bits
    (e.g. netloc is a single string) and we don't expand % escapes.Nrr^rrr8��//rdrezInvalid IPv6 URLror�css|]}|dkVqdS)�
0123456789Nr!�r1r�r!r!r"r4�szurlsplit.<locals>.<genexpr>)r=r��lstrip�_WHATWG_C0_CONTROL_OR_SPACE�strip�bool�typer�getr��MAX_CACHE_SIZEr#r�r�rX�splitr�r�scheme_chars�anyrS)
rrr|r}r~�key�cachedr`rrqr��vr��restr!r!r"r�sn



��


��
cCs<t|�\}}}}}}}|r&d||f}|t|||||f��S)z�Put a parsed URL back together again.  This may result in a
    slightly different, but equivalent URL, if the URL that was parsed
    originally had redundant delimiters, e.g. a ? with an empty query
    (the draft states that these are equivalent).z%s;%s)r=r)�
componentsr|r`rrr�rrqr~r!r!r"r�s
�cCs�t|�\}}}}}}|s4|r`|tkr`|dd�dkr`|rP|dd�dkrPd|}d|pXd|}|rp|d|}|r�|d|}|r�|d	|}||�S)
akCombine the elements of a tuple as returned by urlsplit() into a
    complete URL as a string. The data argument can be any five-item iterable.
    This may result in a slightly different, but equivalent URL, if the URL that
    was parsed originally had unnecessary delimiters (for example, a ? with an
    empty query; the RFC states that these are equivalent).Nr�r�r8r�rr^r�ro)r=�uses_netloc)r�r|r`rrrrqr~r!r!r"r�s� c	Cs�|s|S|s|St||�\}}}t|d|�\}}}}}}	t|||�\}
}}}
}}|
|ks`|
tkrh||�S|
tkr�|r�|t|
|||
||f��S|}|s�|
s�|}|}
|s�|}|t|
|||
||f��S|�d�}|ddkr�|d=|dd�dkr�|�d�}n(||�d�}td|dd��|dd�<g}|D]P}|dk�r\z|��Wntk
�rXYnXn|dk�rl�q(n
|�	|��q(|ddk�r�|�	d�|t|
|d�
|��p�d|
||f��S)	zaJoin a base URL and a possibly relative URL to form an absolute
    interpretation of the latter.rr����Nr8�..�.)r�r�)r=r�
uses_relativer�rr��filter�pop�
IndexError�append�join)�baserrr}r~ZbschemeZbnetlocZbpathZbparamsZbqueryZ	bfragmentr|r`�pathr�rrqZ
base_partsZsegmentsZ
resolved_pathZsegr!r!r"rsp
�
�
�
�



��c	CsTt|�\}}d|kr>t|�\}}}}}}t|||||df�}nd}|}|t||��S)z�Removes any existing fragment from URL.

    Returns a tuple of the defragmented URL and the fragment.  If
    the URL contained no fragments, the second element is the
    empty string.
    ror)r=rrr)	rrr~�sr��p�a�qZfragZdefragr!r!r"rTsZ0123456789ABCDEFabcdefc	Cs�|s|jdSt|t�r"|�d�}|�d�}t|�dkr<|S|dg}|j}tdkrbdd�tD�a|dd�D]R}z(|t|dd	��||d	d��Wqntk
r�|d�||�YqnXqnd�	|�S)
z,unquote_to_bytes('abc%20def') -> b'abc def'.��utf-8rPr8rNcSs.i|]&}tD]}||��t�||��qqSr!)�_hexdigr*�bytes�fromhex)r1r�r�r!r!r"�
<dictcomp>zs
�
z$unquote_to_bytes.<locals>.<dictcomp>r�)
r�r9r:r*r�r��
_hextobyter��KeyErrorr�)�string�bits�resr��itemr!r!r"rgs,



�z([-]+)r�r�cCs�t|t�rtd��d|kr$|j|S|dkr0d}|dkr<d}t�|�}|dg}|j}tdt|�d�D],}|t||��	||��|||d�qfd	�
|�S)
a�Replace %xx escapes by their single-character equivalent. The optional
    encoding and errors parameters specify how to decode percent-encoded
    sequences into Unicode characters, as accepted by the bytes.decode()
    method.
    By default, percent-encoded sequences are decoded with UTF-8, and invalid
    sequences are replaced by a placeholder character.

    unquote('abc%20def') -> 'abc def'.
    zExpected str, got bytesrONr�r�rr8r�r)r9r�r;r��_asciirer��ranger�rr/r�)r�r+r,r�r�r�r�r!r!r"r�s 



Fc	CsNi}t|||||||d�}|D]*\}	}
|	|kr>||	�|
�q|
g||	<q|S)aXParse a query given as a string argument.

        Arguments:

        qs: percent-encoded query string to be parsed

        keep_blank_values: flag indicating whether blank values in
            percent-encoded queries should be treated as blank strings.
            A true value indicates that blanks should be retained as
            blank strings.  The default false value indicates that
            blank values are to be ignored and treated as if they were
            not included.

        strict_parsing: flag indicating what to do with parsing errors.
            If false (the default), errors are silently ignored.
            If true, errors raise a ValueError exception.

        encoding and errors: specify how to decode percent-encoded sequences
            into Unicode characters, as accepted by the bytes.decode() method.

        max_num_fields: int. If set, then throws a ValueError if there
            are more than n fields read by parse_qsl().

        separator: str. The symbol to use for separating the query arguments.
            Defaults to &.

        Returns a dictionary.
    )r+r,�max_num_fieldsrU)r
r�)�qs�keep_blank_values�strict_parsingr+r,r�rUZ
parsed_result�pairs�name�valuer!r!r"r	�s�c@seZdZdZdS)�_QueryStringSeparatorWarningz>Warning for using default `separator` in parse_qs or parse_qslN)rBrCrDrEr!r!r!r"r��sr�z/etc/python/urllib.cfgc	Cs�t|�\}}t|t�r |�d�}|r2t|ttf�sB|dk	rBtd��t�}|dk�rRt}d}	|dkrrtj	�
|	�}d}
|dkr�ztt�}Wnt
k
r�YnJX|�:ddl}|jddd�}
|
�|�|
j
d	|	dd
�}|aW5QRXt}
|dk�rd|k�rddlm}|d
tdd�d}n:|dk�r(|}n*t|�dk�rRt|	�d|
�d�dd��|dk	�r�||k�r�d|�d�|�d�}nd|�|�}||k�r�td��||k�r�dd�|�d�D�}ndd�|�|�D�}g}|D]�}|�s�|�s�q�|�dd�}t|�dk�r4|�rtd|f��|�r�|�d�n�q�t|d��sH|�r�|d�dd�}t|||d �}||�}|d�dd�}t|||d �}||�}|�||f��q�|S)!aXParse a query given as a string argument.

        Arguments:

        qs: percent-encoded query string to be parsed

        keep_blank_values: flag indicating whether blank values in
            percent-encoded queries should be treated as blank strings.
            A true value indicates that blanks should be retained as blank
            strings.  The default false value indicates that blank values
            are to be ignored and treated as if they were  not included.

        strict_parsing: flag indicating what to do with parsing errors. If
            false (the default), errors are silently ignored. If true,
            errors raise a ValueError exception.

        encoding and errors: specify how to decode percent-encoded sequences
            into Unicode characters, as accepted by the bytes.decode() method.

        max_num_fields: int. If set, then throws a ValueError
            if there are more than n fields read by parse_qsl().

        separator: str. The symbol to use for separating the query arguments.
            Defaults to &.

        Returns a list, as G-d intended.
    r$Nz*Separator must be of type string or bytes.ZPYTHON_URLLIB_QS_SEPARATORzenvironment variabler)ro)Z
interpolationZcomment_prefixesr	)Zfallbackry)�warnaThe default separator of urllib.parse.parse_qsl and parse_qs was changed to '&' to avoid a web cache poisoning issue (CVE-2021-23336). By default, semicolons no longer act as query field separators. See https://access.redhat.com/articles/5860431 for more details.r���
stacklevel�&Zlegacyr8z (from z) must contain z1 character, or "legacy". See z<https://access.redhat.com/articles/5860431 for more details.zMax number of fields exceededcSs g|]}|�d�D]}|�qqS)ry�r�)r1�s1�s2r!r!r"�
<listcomp>7szparse_qsl.<locals>.<listcomp>cSsg|]}|�qSr!r!)r1r�r!r!r"r�9s�=zbad query field: %rr�+� r3)r=r9r�r/r:rX�object�_default_qs_separator�os�environr��open�_QS_SEPARATOR_CONFIG_FILENAME�FileNotFoundError�configparserZConfigParserZ	read_file�warningsr�r�r��countr�r�r�r)r�r�r�r+r,r�rUr~Z_legacyZenvvar_nameZ
config_sourcerr�Zconfigr��
num_fieldsr��rZ
name_valueZnvr�r�r!r!r"r
�s�


�


�
���	



cCs|�dd�}t|||�S)z�Like unquote(), but also replace plus signs by spaces, as required for
    unquoting HTML form values.

    unquote_plus('%7e/abc+def') -> '~/abc def'
    r�r�)r�r)r�r+r,r!r!r"rQssBABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_.-~c@s(eZdZdZdd�Zdd�Zdd�ZdS)	�Quoterz�A mapping from bytes (in range(0,256)) to strings.

    String values are percent-encoded byte values, unless the key < 128, and
    in the "safe" set (either the specified safe set, or default set).
    cCst�|�|_dS)zsafe: bytes object.N)�_ALWAYS_SAFE�union�safe)rAr�r!r!r"�__init__iszQuoter.__init__cCsd|jjt|�fS)Nz<%s %r>)�	__class__rB�dictrLr!r!r"�__repr__mszQuoter.__repr__cCs(||jkrt|�nd�|�}|||<|S)Nz%{:02X})r��chr�format)rAr�r�r!r!r"�__missing__qszQuoter.__missing__N)rBrCrDrEr�r�r�r!r!r!r"r�asr�r�cCsbt|t�r8|s|S|dkrd}|dkr*d}|�||�}n |dk	rHtd��|dk	rXtd��t||�S)a�quote('abc def') -> 'abc%20def'

    Each part of a URL, e.g. the path info, the query, etc., has a
    different set of reserved characters that must be quoted. The
    quote function offers a cautious (not minimal) way to quote a
    string for most of these parts.

    RFC 3986 Uniform Resource Identifier (URI): Generic Syntax lists
    the following (un)reserved characters.

    unreserved    = ALPHA / DIGIT / "-" / "." / "_" / "~"
    reserved      = gen-delims / sub-delims
    gen-delims    = ":" / "/" / "?" / "#" / "[" / "]" / "@"
    sub-delims    = "!" / "$" / "&" / "'" / "(" / ")"
                  / "*" / "+" / "," / ";" / "="

    Each of the reserved characters is reserved in some component of a URL,
    but not necessarily in all of them.

    The quote function %-escapes all characters that are neither in the
    unreserved chars ("always safe") nor the additional chars set via the
    safe arg.

    The default for the safe arg is '/'. The character is reserved, but in
    typical usage the quote function is being called on a path where the
    existing slash characters are to be preserved.

    Python 3.7 updates from using RFC 2396 to RFC 3986 to quote URL strings.
    Now, "~" is included in the set of unreserved characters.

    string and safe may be either str or bytes objects. encoding and errors
    must not be specified if string is a bytes object.

    The optional encoding and errors parameters specify how to deal with
    non-ASCII characters, as accepted by the str.encode method.
    By default, encoding='utf-8' (characters are encoded with UTF-8), and
    errors='strict' (unsupported characters raise a UnicodeEncodeError).
    Nr�r%z,quote() doesn't support 'encoding' for bytesz*quote() doesn't support 'errors' for bytes)r9r:r*r;r
)r�r�r+r,r!r!r"rws'
cCsdt|t�rd|ks$t|t�r2d|kr2t||||�St|t�rBd}nd}t|||||�}|�dd�S)z�Like quote(), but also replace ' ' with '+', as required for quoting
    HTML form values. Plus signs in the original string are escaped unless
    they are included in safe. It also does not have safe default to '/'.
    r�� r�)r9r:r�rr�)r�r�r+r,Zspacer!r!r"r�s��
cs�t|ttf�std��|sdSt|t�r6|�dd�}ntdd�|D��}|�t|�s^|��Szt	|�Wn&t
k
r�t|�jt	|<�YnXd�
�fdd�|D��S)z�Like quote(), but accepts a bytes object rather than a str, and does
    not perform string-to-bytes encoding.  It always returns an ASCII string.
    quote_from_bytes(b'abc def?') -> 'abc%20def%3f'
    z!quote_from_bytes() expected bytesrr$�ignorecSsg|]}|dkr|�qS)�r!r�r!r!r"r��sz$quote_from_bytes.<locals>.<listcomp>csg|]}�|��qSr!r!)r1�char�Zquoterr!r"r��s)r9r��	bytearrayr;r:r*�rstrip�_ALWAYS_SAFE_BYTESr/r r�r��__getitem__r�)Zbsr�r!r�r"r
�s
c	Cst|d�r|��}nPzt|�r0t|dt�s0t�Wn0tk
rbt��\}}}td��|��YnXg}	|s�|D]j\}
}t|
t	�r�||
|�}
n|t
|
�|||�}
t|t	�r�|||�}n|t
|�|||�}|	�|
d|�qp�n"|D�]\}
}t|
t	��r||
|�}
n|t
|
�|||�}
t|t	��rB|||�}|	�|
d|�q�t|t
��rp|||||�}|	�|
d|�q�zt|�}Wn:tk
�r�|t
|�|||�}|	�|
d|�Yq�X|D]B}
t|
t	��r�||
|�}
n|t
|
�|||�}
|	�|
d|
��q�q�d�|	�S)a^Encode a dict or sequence of two-element tuples into a URL query string.

    If any values in the query arg are sequences and doseq is true, each
    sequence element is converted to a separate parameter.

    If the query arg is a sequence of two-element tuples, the order of the
    parameters in the output will match the order of parameters in the
    input.

    The components of a query arg may each be either a string or a bytes type.

    The safe, encoding, and errors parameters are passed down to the function
    specified by quote_via (encoding and errors only if a component is a str).
    �itemsrz1not a valid non-string sequence or mapping objectr�r�)
�hasattrr�r�r9r5r;�sys�exc_info�with_tracebackr�r:r�r�)rZdoseqr�r+r,Z	quote_viaZtyZva�tb�l�kr�r2Zeltr!r!r"r�sR

�



cCstjdtdd�t|�S)Nz/urllib.parse.to_bytes() is deprecated as of 3.8r�r�)r�r��DeprecationWarning�	_to_bytes�rrr!r!r"�to_bytes%s
�rcCsJt|t�rFz|�d���}Wn(tk
rDtdt|�d��YnX|S)zto_bytes(u"URL") --> 'URL'.�ASCIIzURL z contains non-ASCII characters)r9r:r*r/�UnicodeError�reprrr!r!r"r+s
�rcCs`t|���}|dd�dkr<|dd�dkr<|dd���}|dd�dkr\|dd���}|S)z�Transform a string like '<URL:scheme://host/path>' into 'scheme://host/path'.

    The string is returned unchanged if it's not a wrapped URL.
    Nr8�<r��>�zURL:)r:r�rr!r!r"�unwrap9s r
cCstjdtdd�t|�S)NzUurllib.parse.splittype() is deprecated as of 3.8, use urllib.parse.urlparse() insteadr�r�)r�r�r�
_splittyperr!r!r"�	splittypeFs
�rcCsDtdkrt�dtj�at�|�}|r<|��\}}|��|fSd|fS)z:splittype('type:opaquestring') --> 'type', 'opaquestring'.Nz
([^/:]+):(.*))�	_typeprog�re�compile�DOTALL�match�groupsrS)rrrr|�datar!r!r"rNs
rcCstjdtdd�t|�S)NzUurllib.parse.splithost() is deprecated as of 3.8, use urllib.parse.urlparse() insteadr�r�)r�r�r�
_splithostrr!r!r"�	splithost[s
�rcCsXtdkrt�dtj�at�|�}|rP|��\}}|rH|ddkrHd|}||fSd|fS)z;splithost('//host[:port]/path') --> 'host[:port]', '/path'.Nz//([^/#?]*)(.*)rr�)�	_hostprogrrrrr)rrrZ	host_portr�r!r!r"rcs
rcCstjdtdd�t|�S)NzUurllib.parse.splituser() is deprecated as of 3.8, use urllib.parse.urlparse() insteadr�r�)r�r�r�
_splituser��hostr!r!r"�	splituserrs
�rcCs |�d�\}}}|r|nd|fS)zJsplituser('user[:passwd]@host[:port]') --> 'user[:passwd]', 'host[:port]'.r]N�ra)r�userr�r!r!r"rysrcCstjdtdd�t|�S)NzWurllib.parse.splitpasswd() is deprecated as of 3.8, use urllib.parse.urlparse() insteadr�r�)r�r�r�_splitpasswd)rr!r!r"�splitpasswds
�r!cCs |�d�\}}}||r|ndfS)z/splitpasswd('user:passwd') -> 'user', 'passwd'.r^N�rR)rr�Zpasswdr!r!r"r �sr cCstjdtdd�t|�S)NzUurllib.parse.splitport() is deprecated as of 3.8, use urllib.parse.urlparse() insteadr�r�)r�r�r�
_splitportrr!r!r"�	splitport�s
�r$cCsDtdkrt�dtj�at�|�}|r<|��\}}|r<||fS|dfS)z*splitport('host:port') --> 'host', 'port'.Nz
(.*):([0-9]*))�	_portprogrrr�	fullmatchr)rrrYr!r!r"r#�s
r#r�cCstjdtdd�t||�S)NzVurllib.parse.splitnport() is deprecated as of 3.8, use urllib.parse.urlparse() insteadr�r�)r�r�r�_splitnport)r�defportr!r!r"�
splitnport�s
�r)cCsT|�d�\}}}|s|}n2|rLzt|�}Wntk
rBd}YnX||fS||fS)z�Split host and port, returning numeric port.
    Return given default port if no ':' found; defaults to -1.
    Return numerical port if a valid number are found after ':'.
    Return None if ':' but not a valid number.r^N)rarWrX)rr(r�rYZnportr!r!r"r'�s
r'cCstjdtdd�t|�S)NzVurllib.parse.splitquery() is deprecated as of 3.8, use urllib.parse.urlparse() insteadr�r�)r�r�r�_splitqueryrr!r!r"�
splitquery�s
�r+cCs$|�d�\}}}|r||fS|dfS)z/splitquery('/path?query') --> '/path', 'query'.r�Nr)rrr�r�rr!r!r"r*�sr*cCstjdtdd�t|�S)NzTurllib.parse.splittag() is deprecated as of 3.8, use urllib.parse.urlparse() insteadr�r�)r�r�r�	_splittagrr!r!r"�splittag�s
�r-cCs$|�d�\}}}|r||fS|dfS)z)splittag('/path#tag') --> '/path', 'tag'.roNr)rrr�r��tagr!r!r"r,�sr,cCstjdtdd�t|�S)NzUurllib.parse.splitattr() is deprecated as of 3.8, use urllib.parse.urlparse() insteadr�r�)r�r�r�
_splitattrrr!r!r"�	splitattr�s
�r0cCs|�d�}|d|dd�fS)zksplitattr('/path;attr1=value1;attr2=value2;...') ->
        '/path', ['attr1=value1', 'attr2=value2', ...].ryrr8Nr�)rrZwordsr!r!r"r/�s
r/cCstjdtdd�t|�S)NzWurllib.parse.splitvalue() is deprecated as of 3.8, use urllib.parse.parse_qsl() insteadr�r�)r�r�r�_splitvalue)�attrr!r!r"�
splitvalue�s
�r3cCs |�d�\}}}||r|ndfS)z-splitvalue('attr=value') --> 'attr', 'value'.r�Nr")r2r�r�r!r!r"r1�sr1)rT)r)rT)T)r�r�)FFr�r�NN)FFr�r�NN)r�r�)r�NN)rNN)r�)r�)r�)nrErr�r��collectionsr��__all__r�r�rzZnon_hierarchicalZ
uses_queryZ
uses_fragmentr�r�r�r�rr#Z_implicit_encodingZ_implicit_errorsr(r-r7r=r�r>rGrIr\rirnZ_DefragResultBaseZ_SplitResultBaseZ_ParseResultBaserrrqr|r`r�rr�Z
ResultBaserrrrrrrxrr{r�r�r�rrrrrr�r�rrr�rr	�RuntimeWarningr�r�r�r
r�	frozensetr�r�r�r �defaultdictr�rrr
rrrr
rrrrrrrrr!r r$r%r#r)r'r+r*r-r,r0r/r3r1r!r!r!r"�<module>s�!�������
�
�
%
��

	

?
E

�
)�
}
	
6

�
Q



robotparser.cpython-38.pyc000064400000016241151733313270011547 0ustar00U

e5d�$�@s\dZddlZddlZddlZdgZe�dd�ZGdd�d�ZGdd�d�Z	Gd	d
�d
�Z
dS)a% robotparser.py

    Copyright (C) 2000  Bastian Kleineidam

    You can choose between two licenses when using this package:
    1) GNU GPLv2
    2) PSF license for Python 2.2

    The robots.txt Exclusion Protocol is implemented as specified in
    http://www.robotstxt.org/norobots-rfc.txt
�N�RobotFileParser�RequestRatezrequests secondsc@sreZdZdZddd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�ZdS)rzs This class provides a set of methods to read, parse and answer
    questions about a single robots.txt file.

    �cCs2g|_g|_d|_d|_d|_|�|�d|_dS)NFr)�entries�sitemaps�
default_entry�disallow_all�	allow_all�set_url�last_checked��self�url�r�*/usr/lib64/python3.8/urllib/robotparser.py�__init__s
zRobotFileParser.__init__cCs|jS)z�Returns the time the robots.txt file was last fetched.

        This is useful for long-running web spiders that need to
        check for new robots.txt files periodically.

        )r�r
rrr�mtime%szRobotFileParser.mtimecCsddl}|��|_dS)zYSets the time the robots.txt file was last fetched to the
        current time.

        rN)�timer)r
rrrr�modified.szRobotFileParser.modifiedcCs&||_tj�|�dd�\|_|_dS)z,Sets the URL referring to a robots.txt file.��N)r�urllib�parse�urlparseZhost�pathrrrrr
6szRobotFileParser.set_urlc
Cs�ztj�|j�}WnRtjjk
rd}z0|jdkr:d|_n|jdkrT|jdkrTd|_W5d}~XYnX|�	�}|�
|�d����dS)z4Reads the robots.txt URL and feeds it to the parser.)i�i�Ti�i�Nzutf-8)
rZrequestZurlopenr�errorZ	HTTPError�coderr	�readr�decode�
splitlines)r
�f�err�rawrrrr;s
zRobotFileParser.readcCs,d|jkr|jdkr(||_n|j�|�dS�N�*)�
useragentsrr�append)r
�entryrrr�
_add_entryHs

zRobotFileParser._add_entrycCsPd}t�}|��|D�]}|sP|dkr4t�}d}n|dkrP|�|�t�}d}|�d�}|dkrn|d|�}|��}|s|q|�dd�}t|�dkr|d����|d<tj	�
|d���|d<|ddkr�|dkr�|�|�t�}|j�|d�d}q|ddk�r.|dk�r6|j
�t|dd	��d}q|dd
k�rb|dk�r6|j
�t|dd��d}q|ddk�r�|dk�r6|d�����r�t|d�|_d}q|dd
k�r|dk�r6|d�d�}t|�dk�r|d�����r|d�����rtt|d�t|d��|_d}q|ddkr|j�|d�q|dk�rL|�|�dS)z�Parse the input lines from a robots.txt file.

        We allow that a user-agent: line is not preceded by
        one or more blank lines.
        rr��#N�:z
user-agentZdisallowFZallowTzcrawl-delayzrequest-rate�/Zsitemap)�Entryrr)�find�strip�split�len�lowerrr�unquoter&r'�	rulelines�RuleLine�isdigit�int�delayr�req_rater)r
�lines�stater(�line�iZnumbersrrrrQsj








 �
zRobotFileParser.parsecCs�|jr
dS|jrdS|jsdStj�tj�|��}tj�dd|j|j	|j
|jf�}tj�|�}|sfd}|j
D]}|�|�rl|�|�Sql|jr�|j�|�SdS)z=using the parsed robots.txt decide if useragent can fetch urlFTrr-)rr	rrrrr4�
urlunparserZparamsZqueryZfragment�quoter�
applies_to�	allowancer)r
�	useragentrZ
parsed_urlr(rrr�	can_fetch�s*�

zRobotFileParser.can_fetchcCs>|��sdS|jD]}|�|�r|jSq|jr:|jjSdS�N)rrrAr9r�r
rCr(rrr�crawl_delay�s

zRobotFileParser.crawl_delaycCs>|��sdS|jD]}|�|�r|jSq|jr:|jjSdSrE)rrrAr:rrFrrr�request_rate�s

zRobotFileParser.request_ratecCs|js
dS|jSrE)rrrrr�	site_maps�szRobotFileParser.site_mapscCs,|j}|jdk	r||jg}d�tt|��S)Nz

)rr�join�map�str)r
rrrr�__str__�s
zRobotFileParser.__str__N)r)�__name__�
__module__�__qualname__�__doc__rrrr
rr)rrDrGrHrIrMrrrrrs
		
	I

c@s(eZdZdZdd�Zdd�Zdd�ZdS)	r6zoA rule line is a single "Allow:" (allowance==True) or "Disallow:"
       (allowance==False) followed by a path.cCs<|dkr|sd}tj�tj�|��}tj�|�|_||_dS)NrT)rrr?rr@rrB)r
rrBrrrr�s
zRuleLine.__init__cCs|jdkp|�|j�Sr$)r�
startswith)r
�filenamerrrrA�szRuleLine.applies_tocCs|jr
dndd|jS)NZAllowZDisallowz: )rBrrrrrrM�szRuleLine.__str__N)rNrOrPrQrrArMrrrrr6�sr6c@s0eZdZdZdd�Zdd�Zdd�Zdd	�Zd
S)r.z?An entry has one or more user-agents and zero or more rulelinescCsg|_g|_d|_d|_dSrE)r&r5r9r:rrrrr�szEntry.__init__cCs�g}|jD]}|�d|���q
|jdk	r<|�d|j���|jdk	rf|j}|�d|j�d|j���|�tt|j	��d�
|�S)NzUser-agent: z
Crawl-delay: zRequest-rate: r-�
)r&r'r9r:ZrequestsZseconds�extendrKrLr5rJ)r
Zret�agentZraterrrrM�s


z
Entry.__str__cCsF|�d�d��}|jD](}|dkr*dS|��}||krdSqdS)z2check if this entry applies to the specified agentr-rr%TF)r1r3r&)r
rCrVrrrrA�s
zEntry.applies_tocCs$|jD]}|�|�r|jSqdS)zZPreconditions:
        - our agent applies to this entry
        - filename is URL decodedT)r5rArB)r
rSr=rrrrB
s

zEntry.allowanceN)rNrOrPrQrrMrArBrrrrr.�s

r.)rQ�collectionsZurllib.parserZurllib.request�__all__�
namedtuplerrr6r.rrrr�<module>sBresponse.cpython-36.opt-1.pyc000064400000006235151733320370012001 0ustar003


 \��@s^dZddlZddddgZGdd�dej�ZGdd�de�ZGd	d�de�ZGd
d�de�ZdS)aResponse classes used by urllib.

The base class, addbase, defines a minimal file-like interface,
including read() and readline().  The typical response object is an
addinfourl instance, which defines an info() method that returns
headers and a geturl() method that returns the url.
�N�addbase�addclosehook�addinfo�
addinfourlcs8eZdZdZ�fdd�Zdd�Zdd�Zdd	�Z�ZS)
rzOBase class for addinfo and addclosehook. Is a good idea for garbage collection.cs tt|�j|ddd�||_dS)Nz<urllib response>F)�delete)�superr�__init__�fp)�selfr	)�	__class__��'/usr/lib64/python3.6/urllib/response.pyrszaddbase.__init__cCsd|jjt|�|jfS)Nz<%s at %r whose fp = %r>)r�__name__�id�file)r
rrr
�__repr__szaddbase.__repr__cCs|jjrtd��|S)NzI/O operation on closed file)r	�closed�
ValueError)r
rrr
�	__enter__szaddbase.__enter__cCs|j�dS)N)�close)r
�type�value�	tracebackrrr
�__exit__!szaddbase.__exit__)	r�
__module__�__qualname__�__doc__rrrr�
__classcell__rr)rr
rs
cs,eZdZdZ�fdd�Z�fdd�Z�ZS)rz*Class to add a close hook to an open file.cs tt|�j|�||_||_dS)N)rrr�	closehook�hookargs)r
r	rr)rrr
r(szaddclosehook.__init__cs>z(|j}|j}|r&d|_d|_||�Wdtt|�j�XdS)N)rrrrr)r
rr)rrr
r-szaddclosehook.close)rrrrrrrrr)rr
r%scs(eZdZdZ�fdd�Zdd�Z�ZS)rz.class to add an info() method to an open file.cstt|�j|�||_dS)N)rrr�headers)r
r	r )rrr
r<szaddinfo.__init__cCs|jS)N)r )r
rrr
�info@szaddinfo.info)rrrrrr!rrr)rr
r9scs2eZdZdZd	�fdd�	Zdd�Zdd�Z�ZS)
rz9class to add info() and geturl() methods to an open file.Ncs"tt|�j||�||_||_dS)N)rrr�url�code)r
r	r r"r#)rrr
rGszaddinfourl.__init__cCs|jS)N)r#)r
rrr
�getcodeLszaddinfourl.getcodecCs|jS)N)r")r
rrr
�geturlOszaddinfourl.geturl)N)rrrrrr$r%rrr)rr
rDs)rZtempfile�__all__Z_TemporaryFileWrapperrrrrrrrr
�<module>serror.cpython-36.opt-1.pyc000064400000005304151733320370011270 0ustar003


 \Q
�@sPdZddlZdddgZGdd�de�ZGdd�deejj�ZGdd�de�Z	dS)	a�Exception classes raised by urllib.

The base exception class is URLError, which inherits from OSError.  It
doesn't define any behavior of its own, but is the base class for all
exceptions defined in this package.

HTTPError is an exception class that is also a valid HTTP response
instance.  It behaves this way because HTTP protocol errors are valid
responses, with a status code, headers, and a body.  In some contexts,
an application may want to handle an exception like a regular
response.
�N�URLError�	HTTPError�ContentTooShortErrorc@seZdZddd�Zdd�ZdS)rNcCs |f|_||_|dk	r||_dS)N)�args�reason�filename)�selfrr�r	�$/usr/lib64/python3.6/urllib/error.py�__init__szURLError.__init__cCs
d|jS)Nz<urlopen error %s>)r)rr	r	r
�__str__szURLError.__str__)N)�__name__�
__module__�__qualname__rrr	r	r	r
rs
c@sXeZdZdZejjjZdd�Zdd�Z	dd�Z
edd	��Zed
d��Z
e
jdd��Z
d
S)rzBRaised when HTTP error occurs, but also acts like non-error returncCs:||_||_||_||_||_|dk	r6|j||||�dS)N)�code�msg�hdrs�fpr�_HTTPError__super_init)rZurlrrrrr	r	r
r'szHTTPError.__init__cCsd|j|jfS)NzHTTP Error %s: %s)rr)rr	r	r
r4szHTTPError.__str__cCsd|j|jfS)Nz<HTTPError %s: %r>)rr)rr	r	r
�__repr__7szHTTPError.__repr__cCs|jS)N)r)rr	r	r
r<szHTTPError.reasoncCs|jS)N)r)rr	r	r
�headers@szHTTPError.headerscCs
||_dS)N)r)rrr	r	r
rDsN)r
rr�__doc__�urllib�response�
addinfourlrrrr�propertyrr�setterr	r	r	r
r#s

c@seZdZdZdd�ZdS)rzDException raised when downloaded size does not match content-length.cCstj||�||_dS)N)rr�content)r�messagerr	r	r
rKszContentTooShortError.__init__N)r
rrrrr	r	r	r
rIs)
rZurllib.responser�__all__�OSErrorrrrrrr	r	r	r
�<module>s

&response.cpython-36.opt-2.pyc000064400000005132151733320400011767 0ustar003


 \��@sZddlZddddgZGdd�dej�ZGdd�de�ZGdd�de�ZGd	d�de�ZdS)
�N�addbase�addclosehook�addinfo�
addinfourlcs4eZdZ�fdd�Zdd�Zdd�Zdd�Z�ZS)	rcs tt|�j|ddd�||_dS)Nz<urllib response>F)�delete)�superr�__init__�fp)�selfr	)�	__class__��'/usr/lib64/python3.6/urllib/response.pyrszaddbase.__init__cCsd|jjt|�|jfS)Nz<%s at %r whose fp = %r>)r�__name__�id�file)r
rrr
�__repr__szaddbase.__repr__cCs|jjrtd��|S)NzI/O operation on closed file)r	�closed�
ValueError)r
rrr
�	__enter__szaddbase.__enter__cCs|j�dS)N)�close)r
�type�value�	tracebackrrr
�__exit__!szaddbase.__exit__)r�
__module__�__qualname__rrrr�
__classcell__rr)rr
rscs(eZdZ�fdd�Z�fdd�Z�ZS)rcs tt|�j|�||_||_dS)N)rrr�	closehook�hookargs)r
r	rr)rrr
r(szaddclosehook.__init__cs>z(|j}|j}|r&d|_d|_||�Wdtt|�j�XdS)N)rrrrr)r
rr)rrr
r-szaddclosehook.close)rrrrrrrr)rr
r%scs$eZdZ�fdd�Zdd�Z�ZS)rcstt|�j|�||_dS)N)rrr�headers)r
r	r)rrr
r<szaddinfo.__init__cCs|jS)N)r)r
rrr
�info@szaddinfo.info)rrrrr rrr)rr
r9scs.eZdZd�fdd�	Zdd�Zdd�Z�ZS)	rNcs"tt|�j||�||_||_dS)N)rrr�url�code)r
r	rr!r")rrr
rGszaddinfourl.__init__cCs|jS)N)r")r
rrr
�getcodeLszaddinfourl.getcodecCs|jS)N)r!)r
rrr
�geturlOszaddinfourl.geturl)N)rrrrr#r$rrr)rr
rDs)Ztempfile�__all__Z_TemporaryFileWrapperrrrrrrrr
�<module>	s
request.cpython-36.opt-2.pyc000064400000166062151733320400011633 0ustar003

���i~��)@s�ddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddl
Z
ddlZddlZddlZddlZddlmZmZmZddlmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(ddl)m*Z*m+Z+yddl,Z,Wne-k
�r"dZ.YnXdZ.ddd	d
ddd
ddddddddddddddddddd d!d"d#d$d%d&d'g!Z/d(ej0dd)�Z1da2de
j3fddddd*�d+d�Z4d,d�Z5gZ6d}d-d$�Z7d.d%�Z8e	j9d/e	j:�Z;d0d1�Z<Gd2d�d�Z=Gd3d�d�Z>d4d �Z?Gd5d	�d	�Z@Gd6d�de@�ZAGd7d
�d
e@�ZBGd8d�de@�ZCd9d:�ZDGd;d
�d
e@�ZEGd<d�d�ZFGd=d�deF�ZGGd>d�deG�ZHGd?d�d�ZIGd@d�deIe@�ZJGdAd�deIe@�ZKejLZMGdBd�d�ZNGdCd�de@eN�ZOGdDd�de@eN�ZPGdEdF�dFe@�ZQGdGd�deQ�ZReSejTdH��r.GdIdJ�dJeQ�ZUe/jVdJ�GdKd�de@�ZWGdLd�de@�ZXdMdN�ZYdOdP�ZZGdQd�de@�Z[dRdS�Z\GdTd�de@�Z]GdUd�de]�Z^GdVd�de@�Z_dWZ`ejadXk�r�ddYlbmcZcmdZdndZd"�Zcd[d!�ZdiZeGd\d&�d&�ZfGd]d'�d'ef�Zgdahd^d_�Zidajd`da�Zkdaldbdc�Zmdanddde�ZoGdfdg�dg�Zpdhdi�Zqd~djdk�Zrdldm�Zsejtdnk�r�ddolumvZvmwZwdpdq�Zxdrds�Zydtdu�Zzdvd#�Z{n6ejadXk�r�dwdx�Z|dyd#�Z{dzd{�Z}d|du�ZzneqZ{erZzdS)�N)�URLError�	HTTPError�ContentTooShortError)�urlparse�urlsplit�urljoin�unwrap�quote�unquote�	splittype�	splithost�	splitport�	splituser�splitpasswd�	splitattr�
splitquery�
splitvalue�splittag�to_bytes�unquote_to_bytes�
urlunparse)�
addinfourl�addclosehookFT�Request�OpenerDirector�BaseHandler�HTTPDefaultErrorHandler�HTTPRedirectHandler�HTTPCookieProcessor�ProxyHandler�HTTPPasswordMgr�HTTPPasswordMgrWithDefaultRealm�HTTPPasswordMgrWithPriorAuth�AbstractBasicAuthHandler�HTTPBasicAuthHandler�ProxyBasicAuthHandler�AbstractDigestAuthHandler�HTTPDigestAuthHandler�ProxyDigestAuthHandler�HTTPHandler�FileHandler�
FTPHandler�CacheFTPHandler�DataHandler�UnknownHandler�HTTPErrorProcessor�urlopen�install_opener�build_opener�pathname2url�url2pathname�
getproxies�urlretrieve�
urlcleanup�	URLopener�FancyURLopenerz%d.%d�)�cafile�capath�	cadefault�contextc
Cs�|s|s|rfddl}|jdtd�|dk	r2td��ts>td��tjtjj||d�}t	|d�}t
|�}	n0|r~t	|d�}t
|�}	ntdkr�t
�a}	nt}	|	j|||�S)NrzJcafile, capath and cadefault are deprecated, use a custom context instead.r:zDYou can't pass both context and any of cafile, capath, and cadefaultzSSL support not available)r;r<)r>)
�warnings�warn�DeprecationWarning�
ValueError�	_have_ssl�sslZcreate_default_contextZPurposeZSERVER_AUTH�HTTPSHandlerr2�_opener�open)
�url�data�timeoutr;r<r=r>r?Z
https_handler�opener�rL�&/usr/lib64/python3.6/urllib/request.pyr0�s*<




cCs|adS)N)rF)rKrLrLrMr1�scCs4t|�\}}tjt||����}|j�}|dkrD|rDtjj|�|fS|rTt|d�}nt	j
dd�}|j}tj
|�|��||f}	d}
d
}d}d}
d	|kr�t|d
�}|r�||
|
|�xB|j|
�}|s�P|t|�7}|j|�|
d7}
|r�||
|
|�q�WWdQRXWdQRX|dk�r0||k�r0td||f|	��|	S)N�file�wbF)�deletei��rzcontent-lengthzContent-Lengthz1retrieval incomplete: got only %i out of %i bytesi ���)r�
contextlib�closingr0�info�os�path�normpathrG�tempfileZNamedTemporaryFile�name�_url_tempfiles�append�int�read�len�writer)rH�filename�
reporthookrIZurl_typerX�fp�headers�tfp�result�bs�sizer_�blocknum�blockrLrLrMr6�sD


$cCsHx0tD](}ytj|�Wqtk
r,YqXqWtdd�=trDdadS)N)r\rW�unlink�OSErrorrF)Z	temp_filerLrLrMr7%s


z:\d+$cCs<|j}t|�d}|dkr&|jdd�}tjd|d�}|j�S)NrR��Host)�full_urlr�
get_header�_cut_port_re�sub�lower)�requestrH�hostrLrLrM�request_host4srwc@s�eZdZdidddfdd�Zedd��Zejdd��Zejdd��Zed	d
��Zejdd
��Zejdd
��Zd
d�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zd#dd�Zdd �Zd!d"�ZdS)$rNFc	Csp||_i|_i|_d|_||_d|_x |j�D]\}}|j||�q.W|dkrVt|�}||_	||_
|rl||_dS)N)rpre�unredirected_hdrs�_datarI�_tunnel_host�items�
add_headerrw�origin_req_host�unverifiable�method)	�selfrHrIrer}r~r�key�valuerLrLrM�__init__FszRequest.__init__cCs|jrdj|j|j�S|jS)Nz{}#{})�fragment�format�	_full_url)r�rLrLrMrpXszRequest.full_urlcCs(t|�|_t|j�\|_|_|j�dS)N)rr�rr��_parse)r�rHrLrLrMrp^s
cCsd|_d|_d|_dS)Nrn)r�r��selector)r�rLrLrMrpescCs|jS)N)ry)r�rLrLrMrIkszRequest.datacCs(||jkr$||_|jd�r$|jd�dS)NzContent-length)ry�
has_header�
remove_header)r�rIrLrLrMrIos

cCs
d|_dS)N)rI)r�rLrLrMrIyscCsNt|j�\|_}|jdkr(td|j��t|�\|_|_|jrJt|j�|_dS)Nzunknown url type: %r)	rr��typerBrprrvr�r
)r��restrLrLrMr�}s
zRequest._parsecCs|jdk	rdnd}t|d|�S)N�POST�GETr)rI�getattr)r�Zdefault_methodrLrLrM�
get_method�szRequest.get_methodcCs|jS)N)rp)r�rLrLrM�get_full_url�szRequest.get_full_urlcCs4|jdkr|jr|j|_n||_|j|_||_dS)N�https)r�rzrvrpr�)r�rvr�rLrLrM�	set_proxy�s

zRequest.set_proxycCs|j|jkS)N)r�rp)r�rLrLrM�	has_proxy�szRequest.has_proxycCs||j|j�<dS)N)re�
capitalize)r�r��valrLrLrMr|�szRequest.add_headercCs||j|j�<dS)N)rxr�)r�r�r�rLrLrM�add_unredirected_header�szRequest.add_unredirected_headercCs||jkp||jkS)N)rerx)r��header_namerLrLrMr��s
zRequest.has_headercCs|jj||jj||��S)N)re�getrx)r�r��defaultrLrLrMrq�szRequest.get_headercCs |jj|d�|jj|d�dS)N)re�poprx)r�r�rLrLrMr��szRequest.remove_headercCs"|jj�}|j|j�t|j��S)N)rx�copy�updatere�listr{)r��hdrsrLrLrM�header_items�s
zRequest.header_items)N)�__name__�
__module__�__qualname__r��propertyrp�setter�deleterrIr�r�r�r�r�r|r�r�rqr�r�rLrLrLrMrDs(

c@sNeZdZdd�Zdd�Zdd�Zdd�Zd	ejfd
d�Z	ddd
�Z
dd�Zd	S)rcCs6dt}d|fg|_g|_i|_i|_i|_i|_dS)NzPython-urllib/%sz
User-agent)�__version__�
addheaders�handlers�handle_open�handle_error�process_response�process_request)r�Zclient_versionrLrLrMr��szOpenerDirector.__init__cCsZt|d�stdt|���d}�xt|�D�]}|dkr:q*|jd�}|d|�}||dd�}|jd	�r�|jd�|d}||dd�}yt|�}Wntk
r�YnX|jj	|i�}	|	|j|<n>|d
kr�|}|j
}	n*|dkr�|}|j}	n|dkr*|}|j}	nq*|	j
|g�}
|
�r&tj|
|�n
|
j|�d
}q*W|�rVtj|j|�|j|�dS)N�
add_parentz%expected BaseHandler instance, got %rF�redirect_request�do_open�
proxy_open�_rR�errorrG�responseruT)r�r�r�)�hasattr�	TypeErrorr��dir�find�
startswithr^rBr�r�r�r�r��
setdefault�bisectZinsortr]r�r�)r��handlerZadded�meth�i�protocolZ	condition�j�kind�lookupr�rLrLrM�add_handler�sJ



zOpenerDirector.add_handlercCsdS)NrL)r�rLrLrM�close�szOpenerDirector.closec	Gs<|j|f�}x*|D]"}t||�}||�}|dk	r|SqWdS)N)r�r�)	r��chainr��	meth_name�argsr�r��funcrgrLrLrM�_call_chain�s

zOpenerDirector._call_chainNc
Cs�t|t�rt||�}n|}|dk	r(||_||_|j}|d}x(|jj|g�D]}t||�}||�}qLW|j	||�}	|d}x*|j
j|g�D]}t||�}|||	�}	q�W|	S)NZ_requestZ	_response)�
isinstance�strrrIrJr�r�r�r��_openr�)
r��fullurlrIrJ�reqr�r�Z	processorr�r�rLrLrMrG�s"


zOpenerDirector.opencCsP|j|jdd|�}|r|S|j}|j|j||d|�}|r>|S|j|jdd|�S)Nr�Zdefault_openr��unknown�unknown_open)r�r�r�)r�r�rIrgr�rLrLrMr�s


zOpenerDirector._opencGs~|d
kr,|jd}|d}d|}d}|}n|j}|d}d}|||f|}|j|�}|r^|S|rz|dd	f|}|j|�SdS)N�httpr�r:z
http_error_%srRZ_errorrr��http_error_default)r�r�)r�r�)r��protor��dictr�Zhttp_errZ	orig_argsrgrLrLrMr�'s 

zOpenerDirector.error)N)r�r�r�r�r�r�r��socket�_GLOBAL_DEFAULT_TIMEOUTrGr�r�rLrLrLrMr�s/
c	Gs�t�}ttttttttt	g	}t
tjd�r2|j
t�t�}xN|D]F}x@|D]8}t|t�rlt||�r�|j|�qHt||�rH|j|�qHWq>Wx|D]}|j|�q�Wx|D]}|j|��q�Wx&|D]}t|t�r�|�}|j|�q�W|S)N�HTTPSConnection)rrr.r)rrr+r*r/r-r�r��clientr]rE�setr�r��
issubclass�add�remover�)r�rKZdefault_classes�skip�klassZcheck�hrLrLrMr2@s0	









c@s(eZdZdZdd�Zdd�Zdd�ZdS)	ri�cCs
||_dS)N)�parent)r�r�rLrLrMr�gszBaseHandler.add_parentcCsdS)NrL)r�rLrLrMr�jszBaseHandler.closecCst|d�sdS|j|jkS)N�
handler_orderT)r�r�)r��otherrLrLrM�__lt__ns
zBaseHandler.__lt__N)r�r�r�r�r�r�r�rLrLrLrMrdsc@seZdZdZdd�ZeZdS)r/i�cCsJ|j|j|j�}}}d|ko*dknsF|jjd|||||�}|S)N��i,r�)�code�msgrVr�r�)r�rur�r�r�r�rLrLrM�
http_response{s
z HTTPErrorProcessor.http_responseN)r�r�r�r�r��https_responserLrLrLrMr/wsc@seZdZdd�ZdS)rcCst|j||||��dS)N)rrp)r�r�rdr�r�r�rLrLrMr��sz*HTTPDefaultErrorHandler.http_error_defaultN)r�r�r�r�rLrLrLrMr�sc@s4eZdZdZdZdd�Zdd�ZeZZZ	dZ
dS)	r��
c	sx|j�}|dkr|dkp&|dko&|dks:t|j||||��|jdd	�}d�t�fdd
�|jj�D��}t|||jdd�S)N�-�.�/�3r��HEADr�� z%20�content-length�content-typec3s&|]\}}|j��kr||fVqdS)N)rt)�.0�k�v)�CONTENT_HEADERSrLrM�	<genexpr>�sz7HTTPRedirectHandler.redirect_request.<locals>.<genexpr>T)rer}r~)r�r�r�r�)r�r�)r�r�r�)r�r�)	r�rrp�replacer�rer{rr})	r�r�rdr�r�re�newurl�mZ
newheadersrL)r�rMr��s
z$HTTPRedirectHandler.redirect_requestc
CsNd|kr|d}nd|kr$|d}ndSt|�}|jdkrRt||d||f||��|jrp|jrpt|�}d|d	<t|�}t|d
tj	d�}t
|j|�}|j||||||�}|dkr�dSt
|d��r|j}	|_|	j|d
�|jks�t|	�|jk�rt|j||j|||��ni}	|_|_|	j|d
�d|	|<|j�|j�|jj||jd�S)N�location�urir�r��ftprnz+%s - Redirection to url '%s' is not allowed�/r:z
iso-8859-1)�encoding�safe�
redirect_dictrrR)rJ)r�r�r�rn)r�schemerrXZnetlocr�rr	�stringZpunctuationrrpr�r�rr��max_repeatsr`�max_redirections�inf_msgr_r�r�rGrJ)
r�r�rdr�r�rer��urlparts�newZvisitedrLrLrM�http_error_302�s@



z"HTTPRedirectHandler.http_error_302zoThe HTTP server returned a redirect error that would lead to an infinite loop.
The last 30x error message was:
N)r�r�r�rrr�r	�http_error_301�http_error_303�http_error_307rrLrLrLrMr�s&<c	Cs�t|�\}}|jd�s d}|}n:|jd�s6td|��|jdd�}|dkrNd}|d|�}t|�\}}|dk	r|t|�\}}nd}}||||fS)Nr�z//zproxy URL with no authority: %rr:rRrS)rr�rBr�rr)	�proxyrZr_scheme�	authority�endZuserinfo�hostport�user�passwordrLrLrM�_parse_proxy�s

rc@s"eZdZdZddd�Zdd�ZdS)r�dNcCsL|dkrt�}||_x2|j�D]&\}}t|d||||jfdd��qWdS)Nz%s_opencSs||||�S)NrL)�rr
r�r�rLrLrM�<lambda>%sz'ProxyHandler.__init__.<locals>.<lambda>)r5�proxiesr{�setattrr�)r�rr�rHrLrLrMr�s
zProxyHandler.__init__cCs�|j}t|�\}}}}|dkr"|}|jr6t|j�r6dS|rv|rvdt|�t|�f}	tj|	j��jd�}
|j	dd|
�t|�}|j
||�||ks�|dkr�dS|jj||j
d�SdS)Nz%s:%s�asciizProxy-authorizationzBasic r�)rJ)r�rrv�proxy_bypassr
�base64�	b64encode�encode�decoder|r�r�rGrJ)r�r�r
r�Z	orig_typeZ
proxy_typerrrZ	user_passZcredsrLrLrMr�(s zProxyHandler.proxy_open)N)r�r�r�r�r�r�rLrLrLrMrs

c@s6eZdZdd�Zdd�Zdd�Zd
dd	�Zd
d�ZdS)r cCs
i|_dS)N)�passwd)r�rLrLrMr�FszHTTPPasswordMgr.__init__cs`t|t�r|g}|�jkr$i�j|<x6dD].�t��fdd�|D��}||f�j||<q*WdS)NTFcsg|]}�j|���qSrL)�
reduce_uri)r��u)�default_portr�rLrM�
<listcomp>Qsz0HTTPPasswordMgr.add_password.<locals>.<listcomp>)TF)r�r�r�tuple)r��realmr�rr�reduced_urirL)r"r�rM�add_passwordIs



zHTTPPasswordMgr.add_passwordc	Cs`|jj|i�}xLdD]D}|j||�}x2|j�D]&\}}x|D]}|j||�r<|Sq<Wq.WqWdS)NTF)TF)NN)rr�r r{�	is_suburi)	r�r%�authuriZdomainsr"�reduced_authuriZurisZauthinfor�rLrLrM�find_user_passwordTs

z"HTTPPasswordMgr.find_user_passwordTc
Cs�t|�}|dr.|d}|d}|dp*d}nd}|}d}t|�\}}|r~|dkr~|dk	r~ddd�j|�}	|	dk	r~d||	f}||fS)	NrRrr:r��Pi�)r�r�z%s:%d)rr
r�)
r�r�r"�partsrrrXrv�portZdportrLrLrMr ^s zHTTPPasswordMgr.reduce_uricCsR||krdS|d|dkr dStj|d|df�}t|�t|d�krNdSdS)NTrFrR)�	posixpath�commonprefixr`)r��base�test�commonrLrLrMr(uszHTTPPasswordMgr.is_suburiN)T)r�r�r�r�r'r+r r(rLrLrLrMr Ds


c@seZdZdd�ZdS)r!cCs0tj|||�\}}|dk	r"||fStj|d|�S)N)r r+)r�r%r)rrrLrLrMr+�s

z2HTTPPasswordMgrWithDefaultRealm.find_user_passwordN)r�r�r�r+rLrLrLrMr!�scs<eZdZ�fdd�Zd
�fdd�	Zddd�Zdd	�Z�ZS)r"csi|_t�j||�dS)N)�
authenticated�superr�)r�r��kwargs)�	__class__rLrMr��sz%HTTPPasswordMgrWithPriorAuth.__init__Fcs<|j||�|dk	r&t�jd|||�t�j||||�dS)N)�update_authenticatedr5r')r�r%r�rr�is_authenticated)r7rLrMr'�sz)HTTPPasswordMgrWithPriorAuth.add_passwordcCsFt|t�r|g}x0dD](}x"|D]}|j||�}||j|<q WqWdS)NTF)TF)r�r�r r4)r�r�r9r"r!r&rLrLrMr8�s


z1HTTPPasswordMgrWithPriorAuth.update_authenticatedcCsDx>dD]6}|j||�}x$|jD]}|j||�r|j|SqWqWdS)NTF)TF)r r4r()r�r)r"r*r�rLrLrMr9�s

z-HTTPPasswordMgrWithPriorAuth.is_authenticated)F)F)r�r�r�r�r'r8r9�
__classcell__rLrL)r7rMr"�s

c@sTeZdZejdej�Zddd�Zdd�Zdd�Z	d	d
�Z
dd�Zd
d�ZeZ
eZdS)r#z1(?:^|,)[ 	]*([^ 	,]+)[ 	]+realm=(["']?)([^"']*)\2NcCs"|dkrt�}||_|jj|_dS)N)r rr')r�Zpassword_mgrrLrLrMr��sz!AbstractBasicAuthHandler.__init__ccstd}xFtjj|�D]6}|j�\}}}|d	kr:tjdtd�||fVd}qW|sp|rb|j�d}nd}|dfVdS)
NF�"�'zBasic Auth Realm was unquoted�Trrn)r;r<)r#�rx�finditer�groupsr?r@�UserWarning�split)r��headerZfound_challengeZmorr	r%rLrLrM�_parse_realm�s
z%AbstractBasicAuthHandler._parse_realmc	Cs~|j|�}|sdSd}xL|D]D}x>|j|�D]0\}}|j�dkrF|}q,|dk	r,|j|||�Sq,WqW|dk	rztd|f��dS)N�basiczBAbstractBasicAuthHandler does not support the following scheme: %r)Zget_allrDrt�retry_http_basic_authrB)	r��authreqrvr�reZunsupportedrCrr%rLrLrM�http_error_auth_reqed�s

z.AbstractBasicAuthHandler.http_error_auth_reqedcCs||jj||�\}}|dk	rtd||f}dtj|j��jd�}|j|jd�|krTdS|j|j|�|j	j
||jd�SdSdS)Nz%s:%szBasic r)rJ)rr+rrrrrq�auth_headerr�r�rGrJ)r�rvr�r%r�pw�raw�authrLrLrMrF�sz.AbstractBasicAuthHandler.retry_http_basic_authcCsxt|jd�s|jj|j�r"|S|jd�st|jjd|j�\}}dj||�j�}tj	|�j
�}|jddj|j���|S)Nr9�
Authorizationz{0}:{1}zBasic {})
r�rr9rpr�r+r�rrZstandard_b64encoderr��strip)r�r�rrZcredentialsZauth_strrLrLrM�http_requests
z%AbstractBasicAuthHandler.http_requestcCsLt|jd�rHd|jko dknr8|jj|jd�n|jj|jd�|S)Nr9r�i,TF)r�rr�r8rp)r�r�r�rLrLrMr�s
z&AbstractBasicAuthHandler.http_response)N)r�r�r��re�compile�Ir>r�rDrHrFrOr��
https_requestr�rLrLrLrMr#�s

c@seZdZdZdd�ZdS)r$rMcCs|j}|jd|||�}|S)Nzwww-authenticate)rprH)r�r�rdr�r�rerHr�rLrLrM�http_error_401 s
z#HTTPBasicAuthHandler.http_error_401N)r�r�r�rIrTrLrLrLrMr$sc@seZdZdZdd�ZdS)r%zProxy-authorizationcCs|j}|jd|||�}|S)Nzproxy-authenticate)rvrH)r�r�rdr�r�rerr�rLrLrM�http_error_407+s
z$ProxyBasicAuthHandler.http_error_407N)r�r�r�rIrUrLrLrLrMr%'sc@sNeZdZddd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Zdd�Z	dd�Z
dS)r&NcCs4|dkrt�}||_|jj|_d|_d|_d|_dS)Nr)r rr'�retried�nonce_count�
last_nonce)r�rrLrLrMr�Es
z"AbstractDigestAuthHandler.__init__cCs
d|_dS)Nr)rV)r�rLrLrM�reset_retry_countNsz+AbstractDigestAuthHandler.reset_retry_countcCs||j|d�}|jdkr*t|jdd|d��n|jd7_|rx|j�d}|j�dkr`|j||�S|j�dkrxtd|��dS)	N�i�zdigest auth failedrRrZdigestrEzEAbstractDigestAuthHandler does not support the following scheme: '%s')r�rVrrprBrt�retry_http_digest_authrB)r�rIrvr�rerGrrLrLrMrHQs


z/AbstractDigestAuthHandler.http_error_auth_reqedcCsz|jdd�\}}ttdt|���}|j||�}|rvd|}|jj|jd�|krRdS|j|j|�|j	j
||jd�}|SdS)Nr�rRz	Digest %s)rJ)rB�parse_keqv_list�filter�parse_http_list�get_authorizationrer�rIr�r�rGrJ)r�r�rL�tokenZ	challenge�chalZauth_valZresprLrLrMr[esz0AbstractDigestAuthHandler.retry_http_digest_authcCs@d|j|tj�f}|jd�td�}tj|�j�}|dd�S)Nz	%s:%s:%s:rrQ�)rW�timeZctimer�_randombytes�hashlib�sha1�	hexdigest)r��nonce�s�b�digrLrLrM�
get_cnonceqsz$AbstractDigestAuthHandler.get_cnoncecCs�y6|d}|d}|jd�}|jdd�}|jdd�}Wntk
rJdSX|j|�\}}	|dkrfdS|jj||j�\}
}|
dkr�dS|jdk	r�|j|j|�}nd}d|
||f}
d|j�|j	f}|d	k�r.||j
kr�|jd
7_nd
|_||_
d|j}|j|�}d||||||�f}|	||
�|�}n2|dk�rT|	||
�d|||�f�}nt
d
|��d|
|||j	|f}|�r�|d|7}|�r�|d|7}|d|7}|�r�|d||f7}|S)Nr%rh�qop�	algorithm�MD5�opaquez%s:%s:%sz%s:%srLrRz%08xz%s:%s:%s:%s:%szqop '%s' is not supported.z>username="%s", realm="%s", nonce="%s", uri="%s", response="%s"z
, opaque="%s"z
, digest="%s"z, algorithm="%s"z, qop=auth, nc=%s, cnonce="%s")r��KeyError�get_algorithm_implsrr+rprI�get_entity_digestr�r�rXrWrlr)r�r�rar%rhrmrnrp�H�KDrrJZentdigZA1ZA2ZncvalueZcnonceZnoncebitZrespdigr1rLrLrMr_|sV








z+AbstractDigestAuthHandler.get_authorizationcsD|dkrdd��n|dkr$dd��ntd|���fdd�}�|fS)NrocSstj|jd��j�S)Nr)reZmd5rrg)�xrLrLrMr�sz?AbstractDigestAuthHandler.get_algorithm_impls.<locals>.<lambda>ZSHAcSstj|jd��j�S)Nr)rerfrrg)rvrLrLrMr�sz.Unsupported digest authentication algorithm %rcs�d||f�S)Nz%s:%srL)ri�d)rtrLrMr�s)rB)r�rnrurL)rtrMrr�s

z-AbstractDigestAuthHandler.get_algorithm_implscCsdS)NrL)r�rIrarLrLrMrs�sz+AbstractDigestAuthHandler.get_entity_digest)N)r�r�r�r�rYrHr[rlr_rrrsrLrLrLrMr&:s
	<
c@seZdZdZdZdd�ZdS)r'rMi�cCs*t|j�d}|jd|||�}|j�|S)NrRzwww-authenticate)rrprHrY)r�r�rdr�r�rerv�retryrLrLrMrT�s

z$HTTPDigestAuthHandler.http_error_401N)r�r�r�rIr�rTrLrLrLrMr'�sc@seZdZdZdZdd�ZdS)r(zProxy-Authorizationi�cCs"|j}|jd|||�}|j�|S)Nzproxy-authenticate)rvrHrY)r�r�rdr�r�rervrxrLrLrMrU�s

z%ProxyDigestAuthHandler.http_error_407N)r�r�r�rIr�rUrLrLrLrMr(�sc@s6eZdZd
dd�Zdd�Zdd�Zdd	�Zd
d�ZdS)�AbstractHTTPHandlerrcCs
||_dS)N)�_debuglevel)r��
debuglevelrLrLrMr��szAbstractHTTPHandler.__init__cCs
||_dS)N)rz)r��levelrLrLrM�set_http_debuglevel�sz'AbstractHTTPHandler.set_http_debuglevelcCstjjj|j|j��S)N)r�r��HTTPConnection�_get_content_lengthrIr�)r�rurLrLrMr�sz'AbstractHTTPHandler._get_content_lengthcCs
|j}|std��|jdk	r�|j}t|t�r8d}t|��|jd�sN|jdd�|jd�r�|jd�r�|j|�}|dk	r�|jdt|��n|jdd�|}|j	�r�t
|j�\}}t|�\}}	|jd�s�|jd|�x2|j
jD]&\}
}|
j�}
|j|
�s�|j|
|�q�W|S)	Nz
no host givenz\POST data should be bytes, an iterable of bytes, or a file object. It cannot be of type str.zContent-typez!application/x-www-form-urlencodedzContent-lengthzTransfer-encodingZchunkedro)rvrrIr�r�r�r�r�rr�rr�rr�r�r�)r�rurvrIr�Zcontent_lengthZsel_hostrZselZsel_pathr[r�rLrLrM�do_request_�s>





zAbstractHTTPHandler.do_request_c
s\|j}|std��||fd|ji|��}|j|j�t|j���jt�fdd�|jj	�D���d�d<tdd��j	�D���|j
r�i}d}|�kr��|||<�|=|j|j
|d	�y`y&|j|j
�|j|j�|jd
�d�Wn,tk
�r
}zt|��WYdd}~XnX|j�}	Wn|j��YnX|j�rF|jj�d|_|j�|	_|	j|	_|	S)Nz
no host givenrJc3s"|]\}}|�kr||fVqdS)NrL)r�r�r�)rerLrMr�)sz.AbstractHTTPHandler.do_open.<locals>.<genexpr>r��
Connectioncss|]\}}|j�|fVqdS)N)�title)r�r[r�rLrLrMr�6szProxy-Authorization)rezTransfer-encoding)Zencode_chunked)rvrrJZset_debuglevelrzr�rxr�rer{rzZ
set_tunnelrur�r�rIr�rm�getresponser�Zsockr�rH�reasonr�)
r�Z
http_classr�Zhttp_conn_argsrvr�Ztunnel_headersZproxy_auth_hdr�errrrL)rerMr�s@
"

zAbstractHTTPHandler.do_openN)r)r�r�r�r�r}rr�r�rLrLrLrMry�s

&ryc@seZdZdd�ZejZdS)r)cCs|jtjj|�S)N)r�r�r�r~)r�r�rLrLrM�	http_open`szHTTPHandler.http_openN)r�r�r�r�ryr�rOrLrLrLrMr)^sr�c@s$eZdZddd�Zdd�ZejZdS)rErNcCstj||�||_||_dS)N)ryr��_context�_check_hostname)r�r{r>�check_hostnamerLrLrMr�iszHTTPSHandler.__init__cCs|jtjj||j|jd�S)N)r>r�)r�r�r�r�r�r�)r�r�rLrLrM�
https_opennszHTTPSHandler.https_open)rNN)r�r�r�r�r�ryr�rSrLrLrLrMrEgs
rEc@s.eZdZddd�Zdd�Zdd�ZeZeZdS)	rNcCs$ddl}|dkr|jj�}||_dS)Nr)Zhttp.cookiejar�	cookiejarZ	CookieJar)r�r�r�rLrLrMr�ws
zHTTPCookieProcessor.__init__cCs|jj|�|S)N)r�Zadd_cookie_header)r�rurLrLrMrO}sz HTTPCookieProcessor.http_requestcCs|jj||�|S)N)r�Zextract_cookies)r�rur�rLrLrMr��sz!HTTPCookieProcessor.http_response)N)r�r�r�r�rOr�rSr�rLrLrLrMrvs

c@seZdZdd�ZdS)r.cCs|j}td|��dS)Nzunknown url type: %s)r�r)r�r�r�rLrLrMr��szUnknownHandler.unknown_openN)r�r�r�r�rLrLrLrMr.�scCsRi}xH|D]@}|jdd�\}}|ddkrB|ddkrB|dd�}|||<q
W|S)N�=rRrr;rSrS)rB)�lZparsedZeltr�r�rLrLrMr\�s
r\cCs�g}d}d}}xt|D]l}|r,||7}d}q|rV|dkr@d}qn|dkrLd}||7}q|dkrn|j|�d}q|dkrzd}||7}qW|r�|j|�dd�|D�S)	NrnF�\Tr;�,cSsg|]}|j��qSrL)rN)r��partrLrLrMr#�sz#parse_http_list.<locals>.<listcomp>)r])ri�resr��escaper	ZcurrLrLrMr^�s4	


r^c@s(eZdZdd�ZdZdd�Zdd�ZdS)r*cCs\|j}|dd�dkrN|dd�dkrN|jrN|jdkrN|j|j�krXtd��n
|j|�SdS)Nr:z//r=r��	localhostz-file:// scheme is supported only on localhost)r�rv�	get_namesr�open_local_file)r�r�rHrLrLrM�	file_open�s&

zFileHandler.file_openNcCs`tjdkrZy*ttjd�dtjtj��d�t_Wn$tjk
rXtjd�ft_YnXtjS)Nr�r:)r*�namesr$r��gethostbyname_ex�gethostname�gaierror�
gethostbyname)r�rLrLrMr��s
zFileHandler.get_namescCsddl}ddl}|j}|j}t|�}y�tj|�}|j}|jj	|j
dd�}	|j|�d}
|jd|
pbd||	f�}|r~t
|�\}}|s�|r�t|�|j�kr�|r�d||}
nd|}
tt|d�||
�SWn*tk
r�}zt|��WYdd}~XnXtd��dS)	NrT)�usegmtz6Content-type: %s
Content-length: %d
Last-modified: %s
z
text/plainzfile://�rbzfile not on local host)�email.utils�	mimetypesrvr�r4rW�stat�st_size�utils�
formatdate�st_mtime�
guess_type�message_from_stringr
�_safe_gethostbynamer�rrGrmr)r�r��emailr�rvrbZ	localfile�statsri�modified�mtyperer.Zorigurl�exprLrLrMr��s0
zFileHandler.open_local_file)r�r�r�r�r�r�r�rLrLrLrMr*�s
cCs&y
tj|�Stjk
r dSXdS)N)r�r�r�)rvrLrLrMr��s
r�c@seZdZdd�Zdd�ZdS)r+cCs.ddl}ddl}|j}|s"td��t|�\}}|dkr>|j}nt|�}t|�\}}|rdt|�\}}nd}t	|�}|pvd}|p~d}yt
j|�}Wn*tk
r�}zt|��WYdd}~XnXt
|j�\}	}
|	jd�}ttt	|��}|dd�|d}}|�r|d�r|dd�}y�|j||||||j�}
|�r8d�p:d}x:|
D]2}t|�\}}|j�dk�rB|dk�rB|j�}�qBW|
j||�\}}d}|j|j�d}|�r�|d
|7}|dk	�r�|dk�r�|d|7}tj|�}t|||j�S|jk
�r(}z$td|�}|jtj �d��WYdd}~XnXdS)Nrzftp error: no host givenrnr�rRrR�Dr��a�Ar�rwzContent-type: %s
zContent-length: %d
z
ftp error: %rr:rSrS)r�r�r�rRrwr�)!�ftplibr�rvrr
�FTP_PORTr^rrr
r�r�rmrr�rBr��map�connect_ftprJrrt�upper�retrfiler�rpr�r�r�
all_errors�with_traceback�sys�exc_info)r�r�r�r�rvr.rrr�rX�attrs�dirsrN�fwr��attrr�rd�retrlenrer�r��excrLrLrM�ftp_open�s\



zFTPHandler.ftp_openc	Cst||||||dd�S)NF)�
persistent)�
ftpwrapper)r�rrrvr.r�rJrLrLrMr�1szFTPHandler.connect_ftpN)r�r�r�r�r�rLrLrLrMr+�s5c@s<eZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
S)r,cCs"i|_i|_d|_d|_d|_dS)Nr�<rb)�cacherJ�soonest�delay�	max_conns)r�rLrLrMr�8s
zCacheFTPHandler.__init__cCs
||_dS)N)r�)r��trLrLrM�
setTimeout?szCacheFTPHandler.setTimeoutcCs
||_dS)N)r�)r�r�rLrLrM�setMaxConnsBszCacheFTPHandler.setMaxConnscCsr|||dj|�|f}||jkr4tj�|j|j|<n,t||||||�|j|<tj�|j|j|<|j�|j|S)Nr�)�joinr�rcr�rJr��check_cache)r�rrrvr.r�rJr�rLrLrMr�Es

zCacheFTPHandler.connect_ftpcCs�tj�}|j|krTx@t|jj��D].\}}||kr"|j|j�|j|=|j|=q"Wtt|jj���|_t	|j�|j
kr�x6t|jj��D]$\}}||jkr�|j|=|j|=Pq�Wtt|jj���|_dS)N)rcr�r�rJr{r�r��min�valuesr`r�)r�r�r�r�rLrLrMr�Ps

zCacheFTPHandler.check_cachecCs4x|jj�D]}|j�qW|jj�|jj�dS)N)r�r�r��clearrJ)r��connrLrLrM�clear_cacheds
zCacheFTPHandler.clear_cacheN)	r�r�r�r�r�r�r�r�r�rLrLrLrMr,5sc@seZdZdd�ZdS)r-cCs~|j}|jdd�\}}|jdd�\}}t|�}|jd�rNtj|�}|dd�}|sVd}tjd|t|�f�}t	t
j|�||�S)	N�:rRr�z;base64�ztext/plain;charset=US-ASCIIz$Content-type: %s
Content-length: %d
i����)rprBr�endswithr�decodebytesr�r�r`r�io�BytesIO)r�r�rHrrIZ	mediatypererLrLrM�	data_openks


zDataHandler.data_openN)r�r�r�r�rLrLrLrMr-jsr��nt)r4r3cCst|�S)N)r
)�pathnamerLrLrMr4�scCst|�S)N)r	)r�rLrLrMr3�sc@s�eZdZdZdeZd)dd�Zdd�Zdd�Zd	d
�Z	dd�Z
d*d
d�Zd+dd�Zd,dd�Z
d-dd�Zdd�Zd.dd�Zd/dd�Zdd�Zer�dd�Zd0dd �Zd!d"�Zd#d$�Zd%d&�Zd1d'd(�ZdS)2r8NzPython-urllib/%scKszdd|jji}tj|tdd�|dkr.t�}||_|jd�|_|jd�|_	d|j
fd
g|_g|_t
j|_d|_t|_dS)NzW%(class)s style of invoking requests is deprecated. Use newer urlopen functions/methods�classr=)�
stacklevel�key_file�	cert_filez
User-Agent�Accept�*/*)r�r�)r7r�r?r@rAr5rr�r�r��versionr��_URLopener__tempfilesrWrl�_URLopener__unlink�	tempcache�ftpcache)r�rZx509r�rLrLrMr��szURLopener.__init__cCs|j�dS)N)r�)r�rLrLrM�__del__�szURLopener.__del__cCs|j�dS)N)�cleanup)r�rLrLrMr��szURLopener.closecCsZ|jrFx2|jD](}y|j|�Wqtk
r4YqXqW|jdd�=|jrV|jj�dS)N)r�r�rmr�r�)r�rNrLrLrMr��s
zURLopener.cleanupcGs|jj|�dS)N)r�r])r�r�rLrLrM�	addheader�szURLopener.addheadercCsntt|��}t|dd�}|jrL||jkrL|j|\}}t|d�}t|||�St|�\}}|s`d}||jkr�|j|}t|�\}}	t|	�\}
}|
|f}nd}d|}||_	|j
dd�}t||�s�|dkr�|r�|j|||�S|j
||�Sy,|dk�rt||�|�St||�||�SWnVttfk
�r.�Yn<tk
�rh}
ztd	|
�jtj�d
��WYdd}
~
XnXdS)Nz%/:=&?~#+!$,;'@()*[]|)rr�rNZopen_�-r�r�zsocket errorr:)rrr	r�rGrrrrr�r�r��open_unknown_proxy�open_unknownr�rrrmr�r�r�)r�r�rIrbrerd�urltyperHr
�	proxyhostrvr�r[r�rLrLrMrG�s<




zURLopener.opencCst|�\}}tdd|��dS)Nz	url errorzunknown url type)rrm)r�r�rIr�rHrLrLrMr�szURLopener.open_unknowncCs t|�\}}tdd||��dS)Nz	url errorzinvalid proxy for %s)rrm)r�r
r�rIr�rHrLrLrMr�	szURLopener.open_unknown_proxyc Cs&tt|��}|jr&||jkr&|j|St|�\}}|dkr�|sH|dkr�y.|j|�}|j�}|j�tt|�d�|fSt	k
r�}	zWYdd}	~	XnX|j
||�}�zH|j�}
|r�t
|d�}n|ddl}t|�\}
}t|p�d�\}
}t|p�d�\}}
t
|�pd�\}}
tjj|�d}|j|�\}}|jj|�tj|d�}z�||
f}|jdk	�r^||j|<d}d}d}d}d|
k�r�t|
d	�}|�r�||||�xH|j|�}|�s�P|t|�7}|j|�|d7}|�r�||||��q�WWd|j�XWd|j�X|dk�r"||k�r"td
||f|��|S)
NrNrRrOrrnirQzcontent-lengthzContent-Lengthz1retrieval incomplete: got only %i out of %i bytesi rS)rrr�rr�rVr�r4rrmrGrZrrrWrX�splitextZmkstempr�r]�fdopenr^r_r`rar)r�rHrbrcrIr�Zurl1rdr�r�rerfrZZgarbagerX�suffix�fdrgrhrir_rjrkrLrLrM�retrievesl






zURLopener.retrievecCs(d}d}t|t�r<t|�\}}|r6t|�\}}t|�}|}nt|\}}t|�\}}t|�\}	}
|
}d}|	j�dkrvd}n:t|
�\}}
|r�t|�\}}|r�d|	||
f}t|�r�|}|s�tdd��|r�t|�}t	j
|j��jd�}nd}|�rt|�}t	j
|j��jd�}nd}||�}
i}|�r*d||d<|�r<d||d<|�rJ||d	<d
|d<x|j
D]\}}|||<�qZW|dk	�r�d|d
<|
jd|||�n|
jd||d�y|
j�}Wn"tjjk
�r�td��YnXd|jk�o�dkn�rt||jd||j�S|j||j|j|j|j|�SdS)Nr�z	%s://%s%sz
http errorz
no host givenrzBasic %szProxy-AuthorizationrMror�r�z!application/x-www-form-urlencodedzContent-Typer�r�)rez$http protocol error: bad status liner�i,zhttp:)r�r�rrr
rrtrrmrrrrr�rur�r�r�Z
BadStatusLinerZstatusrr��
http_errorrdr�)r�Zconnection_factoryrHrIZuser_passwdZproxy_passwdrvr�Zrealhostr�r�Z
proxy_authrLZ	http_connrerCr�r�rLrLrM�_open_generic_httpQsr



zURLopener._open_generic_httpcCs|jtjj||�S)N)r�r�r�r~)r�rHrIrLrLrM�	open_http�szURLopener.open_httpc
Csbd|}t||�rPt||�}|dkr6||||||�}	n|||||||�}	|	rP|	S|j|||||�S)Nz
http_error_%d)r�r�r�)
r�rHrd�errcode�errmsgrerIr[rrgrLrLrMr��s

zURLopener.http_errorcCs|j�t||||d��dS)N)r�r)r�rHrdr�r�rerLrLrMr��szURLopener.http_error_defaultcCstjj||j|jd�S)N)r�r�)r�r�r�r�r�)r�rvrLrLrM�_https_connection�szURLopener._https_connectioncCs|j|j||�S)N)r�r�)r�rHrIrLrLrM�
open_https�szURLopener.open_httpscCs^t|t�std��|dd�dkrP|dd�dkrP|dd�j�dkrPtd��n
|j|�SdS)	NzEfile error: proxy support for file protocol currently not implementedr:z//r=r��z
localhost/z-file:// scheme is supported only on localhost)r�r�rrtrBr�)r�rHrLrLrM�	open_file�s

4
zURLopener.open_filecCs\ddl}ddl}t|�\}}t|�}ytj|�}Wn0tk
rb}zt|j|j	��WYdd}~XnX|j
}	|jj|j
dd�}
|j|�d}|jd|p�d|	|
f�}|s�|}
|dd�dkr�d|}
tt|d	�||
�St|�\}}|o�tj|�t�ft�k�rP|}
|dd�dk�r d|}
n|dd
�dk�r>td|��tt|d	�||
�Std
��dS)NrT)r�z6Content-Type: %s
Content-Length: %d
Last-modified: %s
z
text/plainrRr�zfile://r�r:z./zAlocal file url may start with / or file:. Unknown url of type: %sz#local file error: not on local host)r�r�rr4rWr�rmr�strerrorrbr�r�r�r�r�r�rrGr
r�r�r��thishostrB)r�rHr�r�rvrNZ	localnamer��erir�r�reZurlfiler.rLrLrMr��s: 
zURLopener.open_local_filecCs�t|t�std��ddl}t|�\}}|s2td��t|�\}}t|�\}}|r\t|�\}}nd}t|�}t|ppd�}t|p|d�}t	j
|�}|s�ddl}|j}nt
|�}t|�\}}	t|�}|jd�}
|
dd�|
d}
}|
o�|
d�r�|
dd�}
|
�r|
d�rd|
d<|||dj|
�f}t|j�tk�rlx8t|j�D]*}
|
|k�r>|j|
}|j|
=|j��q>Wy�||jk�r�t|||||
�|j|<|�s�d}nd}x:|	D]2}t|�\}}|j�d	k�r�|dk�r�|j�}�q�W|j|j||�\}}|jd|�d}d}|�r|d|7}|dk	�r:|dk�r:|d|7}tj|�}t||d|�St�k
�r�}z td|�j t!j"�d��WYdd}~XnXdS)NzCftp error: proxy support for ftp protocol currently not implementedrzftp error: no host givenrnr�rRr�rRr�r�r�r�rwzftp:zContent-Type: %s
zContent-Length: %d
zftp error %rr:rSrS)r�r�r�rRrwr�)#r�r�rr�rr
rrr
r�r�r�r�r^rrBr�r`r��MAXFTPCACHEr�r�r�rrtr�r�r�r�r�r�	ftperrorsr�r�r�)r�rHr�rvrXr.rrr�r�r�rNr�r�r�r�r�r�rdr�r�rer�rLrLrM�open_ftp�sp







zURLopener.open_ftpc	Cs<t|t�std��y|jdd�\}}Wntk
rDtdd��YnX|sNd}|jd�}|dkr�d	||d�kr�||dd�}|d|�}nd
}g}|jdtj	dtj
tj����|jd
|�|dkr�tj|j
d��jd�}nt|�}|jdt|��|jd
�|j|�dj|�}tj|�}tj|�}t|||�S)NzEdata error: proxy support for data protocol currently not implementedr�rRz
data errorzbad data URLztext/plain;charset=US-ASCII�;rr�rnzDate: %sz%a, %d %b %Y %H:%M:%S GMTzContent-type: %srrzlatin-1zContent-Length: %d�
)r�r�rrBrBrm�rfindr]rcZstrftimeZgmtimerr�rrr
r`r�r�r�r��StringIOr)	r�rHrIr�Zsemir�r�re�frLrLrM�	open_data3s6






zURLopener.open_data)N)N)N)N)NNN)N)N)N)N)r�r�r�r�r�r�r�r�r�r�r�rGr�r�r�r�r�r�r�rCr�r�r�r�rrrLrLrLrMr8�s,

$


B\


	 :c@s�eZdZdd�Zdd�Zd"dd�Zdd	�Zd#d
d�Zd$dd
�Zd%dd�Z	d&dd�Z
d'dd�Zd(dd�Zd)dd�Z
d*dd�Zd+dd�Zd,dd�Zd d!�ZdS)-r9cOs(tj|f|�|�i|_d|_d|_dS)Nrr�)r8r��
auth_cache�tries�maxtries)r�r�r6rLrLrMr�`szFancyURLopener.__init__cCst||d||�S)Nzhttp:)r)r�rHrdr�r�rerLrLrMr�fsz!FancyURLopener.http_error_defaultNc	
Csn|jd7_zR|jrJ|j|jkrJt|d�r4|j}n|j}|||dd|�S|j||||||�}|Sd|_XdS)NrR�http_error_500i�z)Internal Server Error: Redirect Recursionr)r	r
r�rr��redirect_internal)	r�rHrdr�r�rerIr�rgrLrLrMr	js
zFancyURLopener.http_error_302c	Csxd|kr|d}nd|kr$|d}ndS|j�t|jd||�}t|�}|jd	krnt|||d|||��|j|�S)
Nr�r�r�r�r�r�rnz( Redirection to url '%s' is not allowed.)r�r�r�rn)r�rr�rrrrG)	r�rHrdr�r�rerIr�rrLrLrMr|s


z FancyURLopener.redirect_internalcCs|j||||||�S)N)r	)r�rHrdr�r�rerIrLrLrMr
�szFancyURLopener.http_error_301cCs|j||||||�S)N)r	)r�rHrdr�r�rerIrLrLrMr�szFancyURLopener.http_error_303cCs2|dkr|j||||||�S|j|||||�SdS)N)r	r�)r�rHrdr�r�rerIrLrLrMr�szFancyURLopener.http_error_307Fc
Cs�d|krtj||||||�|d}tjd|�}	|	sHtj||||||�|	j�\}
}|
j�dkrttj||||||�|s�tj||||||�d|jd}|dkr�t||�||�St||�|||�SdS)Nzwww-authenticatez![ 	]*([^ 	]+)[ 	]+realm="([^"]*)"rEZretry_�_basic_auth)r8r�rP�matchr@rtr�r�)
r�rHrdr�r�rerIrx�stuffrrr%r[rLrLrMrT�s&





zFancyURLopener.http_error_401c
Cs�d|krtj||||||�|d}tjd|�}	|	sHtj||||||�|	j�\}
}|
j�dkrttj||||||�|s�tj||||||�d|jd}|dkr�t||�||�St||�|||�SdS)Nzproxy-authenticatez![ 	]*([^ 	]+)[ 	]+realm="([^"]*)"rEZretry_proxy_r
)r8r�rPrr@rtr�r�)
r�rHrdr�r�rerIrxrrrr%r[rLrLrMrU�s&





zFancyURLopener.http_error_407cCs�t|�\}}d||}|jd}t|�\}}	t|	�\}	}
|	jd�d}|	|d�}	|j|	||�\}}
|pl|
srdSdt|dd�t|
dd�|	f}	d|	|
|jd<|dkr�|j|�S|j||�SdS)Nzhttp://r��@rRz%s:%s@%srn)r)rrrr��get_user_passwdr	rG)r�rHr%rIrvr�r�r
r�r��
proxyselectorr�rrrLrLrM�retry_proxy_http_basic_auth�s 

z*FancyURLopener.retry_proxy_http_basic_authcCs�t|�\}}d||}|jd}t|�\}}	t|	�\}	}
|	jd�d}|	|d�}	|j|	||�\}}
|pl|
srdSdt|dd�t|
dd�|	f}	d|	|
|jd<|dkr�|j|�S|j||�SdS)Nzhttps://r�rrRz%s:%s@%srn)r)rrrr�rr	rG)r�rHr%rIrvr�r�r
r�r�rr�rrrLrLrM�retry_proxy_https_basic_auth�s 

z+FancyURLopener.retry_proxy_https_basic_authc
Cs�t|�\}}|jd�d}||d�}|j|||�\}}|p>|sDdSdt|dd�t|dd�|f}d||}	|dkr�|j|	�S|j|	|�SdS)NrrRz%s:%s@%srn)rzhttp://)rr�rr	rG)
r�rHr%rIrvr�r�rrr�rLrLrMrF�s
z$FancyURLopener.retry_http_basic_authc
Cs�t|�\}}|jd�d}||d�}|j|||�\}}|p>|sDdSdt|dd�t|dd�|f}d||}	|dkr�|j|	�S|j|	|�SdS)NrrRz%s:%s@%srn)rzhttps://)rr�rr	rG)
r�rHr%rIrvr�r�rrr�rLrLrM�retry_https_basic_auth	s
z%FancyURLopener.retry_https_basic_authrcCs`|d|j�}||jkr2|r(|j|=n
|j|S|j||�\}}|sJ|rX||f|j|<||fS)Nr)rtr�prompt_user_passwd)r�rvr%r�r�rrrLrLrMr	s


zFancyURLopener.get_user_passwdcCsTddl}y,td||f�}|jd|||f�}||fStk
rNt�dSXdS)NrzEnter username for %s at %s: z#Enter password for %s in %s at %s: )NN)�getpass�input�KeyboardInterrupt�print)r�rvr%rrrrLrLrMr$	sz!FancyURLopener.prompt_user_passwd)N)N)N)N)NF)NF)N)N)N)N)r)r�r�r�r�r�r	rr
rrrTrUrrrFrrrrLrLrLrMr9]s"










cCstdkrtjd�atS)Nr�)�
_localhostr�r�rLrLrLrMr�4	s
r�cCsPtdkrLyttjtj��d�aWn(tjk
rJttjd�d�aYnXtS)Nr:r�)�	_thishostr$r�r�r�r�rLrLrLrMr�<	sr�cCstdkrddl}|jatS)Nr)�
_ftperrorsr�r�)r�rLrLrMrG	srcCstdkrtjd�atS)Nrn)�
_noheadersr�r�rLrLrLrM�	noheadersP	s
rc@sFeZdZddd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Zdd�Z	dS)r�NTc	CsX||_||_||_||_||_||_d|_||_y|j�Wn|j	��YnXdS)Nr)
rrrvr.r�rJ�refcount�	keepalive�initr�)r�rrrvr.r�rJr�rLrLrMr�]	szftpwrapper.__init__cCs\ddl}d|_|j�|_|jj|j|j|j�|jj|j	|j
�dj|j�}|jj
|�dS)Nrr�)r��busyZFTPr�Zconnectrvr.rJZloginrrr�r��cwd)r�r�Z_targetrLrLrMr"m	s
zftpwrapper.initc-Cs�ddl}|j�|dkr"d}d}nd|}d}y|jj|�Wn*|jk
rh|j�|jj|�YnXd}|r�|r�yd|}|jj|�\}}WnR|jk
r�}z4t|�dd�d	kr�t	d
|�j
tj�d��WYdd}~XnX|�s�|jjd�|�rn|jj
�}	zJy|jj|�Wn4|jk
�rP}zt	d
|�|�WYdd}~XnXWd|jj|	�Xd|}nd
}|jj|�\}}d|_t|jd�|j�}
|jd7_|j�|
|fS)Nrrwr�zTYPE ArRzTYPE zRETR r=Z550z
ftp error: %rr:zLIST ZLISTr�)rwr�)r��endtransferr�Zvoidcmdr�r"ZntransfercmdZ
error_permr�rr�r�r��pwdr$r#r�makefile�
file_closer r�)r�rNr�r��cmd�isdirr�r�r�r&ZftpobjrLrLrMr�v	sN
 
$
zftpwrapper.retrfilecCs
d|_dS)Nr)r#)r�rLrLrMr%�	szftpwrapper.endtransfercCsd|_|jdkr|j�dS)NFr)r!r �
real_close)r�rLrLrMr��	s
zftpwrapper.closecCs4|j�|jd8_|jdkr0|jr0|j�dS)NrRr)r%r r!r+)r�rLrLrMr(�	szftpwrapper.file_closecCs2|j�y|jj�Wnt�k
r,YnXdS)N)r%r�r�r)r�rLrLrMr+�	s
zftpwrapper.real_close)NT)
r�r�r�r�r"r�r%r�r(r+rLrLrLrMr�Z	s
	-r�cCs�i}xBtjj�D]4\}}|j�}|r|dd�dkr|||dd�<qWdtjkr^|jdd�xXtjj�D]J\}}|dd�dkrj|j�}|r�|||dd�<qj|j|dd	�d�qjW|S)
N��_proxyZREQUEST_METHODr�i����i����i����i����i����)rW�environr{rtr�)rr[r�rLrLrM�getproxies_environment�	s	
r/c
Cs�|dkrt�}y|d}Wntk
r.dSX|dkr<dSt|�\}}dd�|jd�D�}xP|D]H}|rb|jd�}tj|�}d	|}tj||tj�s�tj||tj�rbdSqbWdS)
N�nor�*rRcSsg|]}|j��qSrL)rN)r�r
rLrLrMr#�	sz,proxy_bypass_environment.<locals>.<listcomp>r��.z
(.+\.)?%s$)	r/rqr
rB�lstriprPr�rrR)rvrZno_proxy�hostonlyr.Z
no_proxy_listr[�patternrLrLrM�proxy_bypass_environment�	s&


r6c
Csddlm}t|�\}}dd�}d|kr4|dr4dSd}x�|jdf�D]�}|sPqFtjd	|�}|dk	�r|dkr�ytj|�}||�}Wntk
r�wFYnX||jd
��}	|jd�}
|
dkr�d|jd
�j	d�d
}
nt
|
d
d��}
d
|
}
||
?|	|
?k�rdSqF|||�rFdSqFWdS)Nr)�fnmatchcSsh|jd�}ttt|��}t|�dkr<|ddddgdd�}|dd>|dd>B|dd>B|d	BS)
Nr2r�r�rRrbr:rQr=)rBr�r�r^r`)ZipAddrr-rLrLrM�ip2num
s

z,_proxy_bypass_macosx_sysconf.<locals>.ip2numr2Zexclude_simpleT�
exceptionsz(\d+(?:\.\d+)*)(/\d+)?rRr:rQ� F)r7r
r�rPrr�r�rm�group�countr^)rv�proxy_settingsr7r4r.r9ZhostIPr�r�r1�maskrLrLrM�_proxy_bypass_macosx_sysconf�	s:



r@�darwin)�_get_proxy_settings�_get_proxiescCst�}t||�S)N)rBr@)rvr>rLrLrM�proxy_bypass_macosx_sysconf:
srDcCst�S)N)rCrLrLrLrM�getproxies_macosx_sysconf>
srEcCs t�}|rt||�St|�SdS)N)r/r6rD)rvrrLrLrMrH
s
rcCst�p
t�S)N)r/rErLrLrLrMr5U
scCsi}yddl}Wntk
r$|SXy�|j|jd�}|j|d�d}|r�t|j|d�d�}d|kr�x�|jd�D]4}|jdd�\}}tjd|�s�d	||f}|||<qrWn>|dd
�dkr�||d<n$d
||d<d||d<d||d<|j	�Wnt
ttfk
�rYnX|S)Nrz;Software\Microsoft\Windows\CurrentVersion\Internet Settings�ProxyEnableZProxyServerr�rrRz^([^/:]+)://z%s://%srZzhttp:r�z	http://%sz
https://%sr�zftp://%sr�)
�winreg�ImportError�OpenKey�HKEY_CURRENT_USER�QueryValueExr�rBrPrZClosermrBr�)rrG�internetSettings�proxyEnableZproxyServer�pr�ZaddressrLrLrM�getproxies_registryZ
s8

rOcCst�p
t�S)N)r/rOrLrLrLrMr5�
sc&Cs~yddl}Wntk
r dSXy6|j|jd�}|j|d�d}t|j|d�d�}Wntk
rldSX|sz|r~dSt|�\}}|g}y tj	|�}||kr�|j
|�Wntk
r�YnXy tj|�}||kr�|j
|�Wntk
�r�YnX|jd�}xp|D]h}	|	dk�r*d|k�r*dS|	j
dd	�}	|	j
d
d�}	|	j
dd�}	x$|D]}
tj|	|
tj��rTdS�qTW�qWdS)
Nrz;Software\Microsoft\Windows\CurrentVersion\Internet SettingsrFZ
ProxyOverriderz<local>r2rRz\.r1z.*�?)rGrHrIrJrKr�rmr
r�r�r]ZgetfqdnrBr�rPrrR)rvrGrLrMZ
proxyOverrideZrawHostr.ZaddrZfqdnr2r�rLrLrM�proxy_bypass_registry�
sR







rQcCs t�}|rt||�St|�SdS)N)r/r6rQ)rvrrLrLrMr�
s
)NNN)N)~rr�r�reZhttp.clientr�r�rWr/rPr�rr�rc�collectionsrZrTr?Zurllib.errorrrrZurllib.parserrrrr	r
rrr
rrrrrrrrrZurllib.responserrrDrHrC�__all__�version_infor�rFr�r0r1r\r6r7rQ�ASCIIrrrwrrr2rr/rrrrr r!r"r#r$r%�urandomrdr&r'r(ryr)r�r�rEr]rr.r\r^r*r�r+r,r-r�r[Z
nturl2pathr4r3r�r8r9rr�rr�rrrrr�r/r6r@�platformZ_scproxyrBrCrDrErr5rOrQrLrLrLrM�<module>Ts�P
T
?n$q*@
ov

+3:5!AW

_
#<

-	2
robotparser.cpython-36.pyc000064400000015615151733320400011542 0ustar003


 \�"�@s\dZddlZddlZddlZdgZejdd�ZGdd�d�ZGdd�d�Z	Gd	d
�d
�Z
dS)a% robotparser.py

    Copyright (C) 2000  Bastian Kleineidam

    You can choose between two licenses when using this package:
    1) GNU GPLv2
    2) PSF license for Python 2.2

    The robots.txt Exclusion Protocol is implemented as specified in
    http://www.robotstxt.org/norobots-rfc.txt
�N�RobotFileParser�RequestRatezrequests secondsc@sjeZdZdZddd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zdd�Zdd�Z
dd�ZdS)rzs This class provides a set of methods to read, parse and answer
    questions about a single robots.txt file.

    �cCs,g|_d|_d|_d|_|j|�d|_dS)NFr)�entries�
default_entry�disallow_all�	allow_all�set_url�last_checked)�self�url�r
�*/usr/lib64/python3.6/urllib/robotparser.py�__init__s
zRobotFileParser.__init__cCs|jS)z�Returns the time the robots.txt file was last fetched.

        This is useful for long-running web spiders that need to
        check for new robots.txt files periodically.

        )r
)rr
r
r�mtime$szRobotFileParser.mtimecCsddl}|j�|_dS)zYSets the time the robots.txt file was last fetched to the
        current time.

        rN)�timer
)rrr
r
r�modified-szRobotFileParser.modifiedcCs&||_tjj|�dd�\|_|_dS)z,Sets the URL referring to a robots.txt file.��N)r�urllib�parse�urlparse�host�path)rrr
r
rr	5szRobotFileParser.set_urlcCs�ytjj|j�}WnRtjjk
rd}z2|jdkr:d|_n|jdkrT|jdkrTd|_WYdd}~XnX|j	�}|j
|jd�j��dS)	z4Reads the robots.txt URL and feeds it to the parser.��Ti�i�Nzutf-8)rr)
rZrequestZurlopenr�errorZ	HTTPError�coderr�readr�decode�
splitlines)r�f�err�rawr
r
rr:s
zRobotFileParser.readcCs,d|jkr|jdkr(||_n|jj|�dS)N�*)�
useragentsrr�append)r�entryr
r
r�
_add_entryGs

zRobotFileParser._add_entrycCs6d}t�}|j��x|D�]�}|sT|dkr8t�}d}n|dkrT|j|�t�}d}|jd�}|dkrr|d|�}|j�}|s�q|jdd�}t|�dkr|dj�j�|d<tj	j
|dj��|d<|ddk�r|dkr�|j|�t�}|jj|d�d}q|ddk�r4|dk�r|j
jt|dd	��d}q|dd
k�rh|dk�r|j
jt|dd��d}q|ddk�r�|dk�r|dj�j��r�t|d�|_d}q|dd
kr|dkr|djd�}t|�dk�r|dj�j��r|dj�j��rtt|d�t|d��|_d}qW|dk�r2|j|�dS)z�Parse the input lines from a robots.txt file.

        We allow that a user-agent: line is not preceded by
        one or more blank lines.
        rr��#N�:z
user-agentZdisallowFZallowTzcrawl-delayzrequest-rate�/)�Entryrr(�find�strip�split�len�lowerrr�unquoter%r&�	rulelines�RuleLine�isdigit�int�delayr�req_rate)r�lines�stater'�line�iZnumbersr
r
rrPsd






 
zRobotFileParser.parsecCs�|jr
dS|jrdS|jsdStjjtjj|��}tjjdd|j|j	|j
|jf�}tjj|�}|sfd}x"|j
D]}|j|�rn|j|�SqnW|jr�|jj|�SdS)z=using the parsed robots.txt decide if useragent can fetch urlFTrr,)rrr
rrrr3�
urlunparserZparamsZqueryZfragment�quoter�
applies_to�	allowancer)r�	useragentrZ
parsed_urlr'r
r
r�	can_fetch�s$
zRobotFileParser.can_fetchcCs4|j�sdSx|jD]}|j|�r|jSqW|jjS)N)rrr@r8r)rrBr'r
r
r�crawl_delay�s

zRobotFileParser.crawl_delaycCs4|j�sdSx|jD]}|j|�r|jSqW|jjS)N)rrr@r9r)rrBr'r
r
r�request_rate�s

zRobotFileParser.request_ratecCs0|j}|jdk	r||jg}djtt|��dS)N�
)rr�join�map�str)rrr
r
r�__str__�s
zRobotFileParser.__str__N)r)�__name__�
__module__�__qualname__�__doc__rrrr	rr(rrCrDrErJr
r
r
rrs
	
	Cc@s(eZdZdZdd�Zdd�Zdd�ZdS)	r5zoA rule line is a single "Allow:" (allowance==True) or "Disallow:"
       (allowance==False) followed by a path.cCs>|dkr|rd}tjjtjj|��}tjj|�|_||_dS)NrT)rrr>rr?rrA)rrrAr
r
rr�s
zRuleLine.__init__cCs|jdkp|j|j�S)Nr$)r�
startswith)r�filenamer
r
rr@�szRuleLine.applies_tocCs|jr
dndd|jS)NZAllowZDisallowz: )rAr)rr
r
rrJ�szRuleLine.__str__N)rKrLrMrNrr@rJr
r
r
rr5�sr5c@s0eZdZdZdd�Zdd�Zdd�Zdd	�Zd
S)r-z?An entry has one or more user-agents and zero or more rulelinescCsg|_g|_d|_d|_dS)N)r%r4r8r9)rr
r
rr�szEntry.__init__cCs�g}x|jD]}|jd|���qW|jdk	r@|jd|j���|jdk	rj|j}|jd|j�d|j���|jtt|j	��|jd�dj
|�S)NzUser-agent: z
Crawl-delay: zRequest-rate: r,rrF)r%r&r8r9ZrequestsZseconds�extendrHrIr4rG)rZret�agentZrater
r
rrJ�s


z
Entry.__str__cCsF|jd�dj�}x.|jD]$}|dkr*dS|j�}||krdSqWdS)z2check if this entry applies to the specified agentr,rr$TF)r0r2r%)rrBrRr
r
rr@�szEntry.applies_tocCs$x|jD]}|j|�r|jSqWdS)zZPreconditions:
        - our agent applies to this entry
        - filename is URL decodedT)r4r@rA)rrPr<r
r
rrA�s

zEntry.allowanceN)rKrLrMrNrrJr@rAr
r
r
rr-�s


r-)rN�collectionsZurllib.parserZurllib.request�__all__�
namedtuplerrr5r-r
r
r
r�<module>s2request.cpython-36.opt-1.pyc000064400000216172151733320400011630 0ustar003

���i~��)@s�dZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddl
Z
ddlZddlZddlZddlZddlZddlmZmZmZddlmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)ddl*m+Z+m,Z,yddl-Z-Wne.k
�r&dZ/YnXdZ/dd	d
ddd
ddddddddddddddddddd d!d"d#d$d%d&d'd(g!Z0d)e
j1dd*�Z2da3dej4fddddd+�d,d�Z5d-d �Z6gZ7d~d.d%�Z8d/d&�Z9e
j:d0e
j;�Z<d1d2�Z=Gd3d�d�Z>Gd4d	�d	�Z?d5d!�Z@Gd6d
�d
�ZAGd7d�deA�ZBGd8d�deA�ZCGd9d�deA�ZDd:d;�ZEGd<d�deA�ZFGd=d�d�ZGGd>d�deG�ZHGd?d�deH�ZIGd@d�d�ZJGdAd�deJeA�ZKGdBd�deJeA�ZLejMZNGdCd�d�ZOGdDd�deAeO�ZPGdEd�deAeO�ZQGdFdG�dGeA�ZRGdHd�deR�ZSeTejUdI��r2GdJdK�dKeR�ZVe0jWdK�GdLd
�d
eA�ZXGdMd�deA�ZYdNdO�ZZdPdQ�Z[GdRd�deA�Z\dSdT�Z]GdUd�deA�Z^GdVd�de^�Z_GdWd�deA�Z`dXZaejbdYk�r�ddZlcmdZdmeZend[d#�Zdd\d"�ZeiZfGd]d'�d'�ZgGd^d(�d(eg�Zhdaid_d`�Zjdakdadb�Zldamdcdd�Zndaodedf�ZpGdgdh�dh�Zqdidj�Zrddkdl�Zsdmdn�Zte
judok�r�ddplvmwZwmxZxdqdr�Zydsdt�Zzdudv�Z{dwd$�Z|n6ejbdYk�r�dxdy�Z}dzd$�Z|d{d|�Z~d}dv�Z{nerZ|esZ{dS)�a�
An extensible library for opening URLs using a variety of protocols

The simplest way to use this module is to call the urlopen function,
which accepts a string containing a URL or a Request object (described
below).  It opens the URL and returns the results as file-like
object; the returned object has some extra methods described below.

The OpenerDirector manages a collection of Handler objects that do
all the actual work.  Each Handler implements a particular protocol or
option.  The OpenerDirector is a composite object that invokes the
Handlers needed to open the requested URL.  For example, the
HTTPHandler performs HTTP GET and POST requests and deals with
non-error returns.  The HTTPRedirectHandler automatically deals with
HTTP 301, 302, 303 and 307 redirect errors, and the HTTPDigestAuthHandler
deals with digest authentication.

urlopen(url, data=None) -- Basic usage is the same as original
urllib.  pass the url and optionally data to post to an HTTP URL, and
get a file-like object back.  One difference is that you can also pass
a Request instance instead of URL.  Raises a URLError (subclass of
OSError); for HTTP errors, raises an HTTPError, which can also be
treated as a valid response.

build_opener -- Function that creates a new OpenerDirector instance.
Will install the default handlers.  Accepts one or more Handlers as
arguments, either instances or Handler classes that it will
instantiate.  If one of the argument is a subclass of the default
handler, the argument will be installed instead of the default.

install_opener -- Installs a new opener as the default opener.

objects of interest:

OpenerDirector -- Sets up the User Agent as the Python-urllib client and manages
the Handler classes, while dealing with requests and responses.

Request -- An object that encapsulates the state of a request.  The
state can be as simple as the URL.  It can also include extra HTTP
headers, e.g. a User-Agent.

BaseHandler --

internals:
BaseHandler and parent
_call_chain conventions

Example usage:

import urllib.request

# set up authentication info
authinfo = urllib.request.HTTPBasicAuthHandler()
authinfo.add_password(realm='PDQ Application',
                      uri='https://mahler:8092/site-updates.py',
                      user='klem',
                      passwd='geheim$parole')

proxy_support = urllib.request.ProxyHandler({"http" : "http://ahad-haam:3128"})

# build a new opener that adds authentication and caching FTP handlers
opener = urllib.request.build_opener(proxy_support, authinfo,
                                     urllib.request.CacheFTPHandler)

# install it
urllib.request.install_opener(opener)

f = urllib.request.urlopen('http://www.python.org/')
�N)�URLError�	HTTPError�ContentTooShortError)�urlparse�urlsplit�urljoin�unwrap�quote�unquote�	splittype�	splithost�	splitport�	splituser�splitpasswd�	splitattr�
splitquery�
splitvalue�splittag�to_bytes�unquote_to_bytes�
urlunparse)�
addinfourl�addclosehookFT�Request�OpenerDirector�BaseHandler�HTTPDefaultErrorHandler�HTTPRedirectHandler�HTTPCookieProcessor�ProxyHandler�HTTPPasswordMgr�HTTPPasswordMgrWithDefaultRealm�HTTPPasswordMgrWithPriorAuth�AbstractBasicAuthHandler�HTTPBasicAuthHandler�ProxyBasicAuthHandler�AbstractDigestAuthHandler�HTTPDigestAuthHandler�ProxyDigestAuthHandler�HTTPHandler�FileHandler�
FTPHandler�CacheFTPHandler�DataHandler�UnknownHandler�HTTPErrorProcessor�urlopen�install_opener�build_opener�pathname2url�url2pathname�
getproxies�urlretrieve�
urlcleanup�	URLopener�FancyURLopenerz%d.%d�)�cafile�capath�	cadefault�contextc
Cs�|s|s|rfddl}|jdtd�|dk	r2td��ts>td��tjtjj||d�}t	|d�}t
|�}	n0|r~t	|d�}t
|�}	ntdkr�t
�a}	nt}	|	j|||�S)	a$
Open the URL url, which can be either a string or a Request object.

    *data* must be an object specifying additional data to be sent to
    the server, or None if no such data is needed.  See Request for
    details.

    urllib.request module uses HTTP/1.1 and includes a "Connection:close"
    header in its HTTP requests.

    The optional *timeout* parameter specifies a timeout in seconds for
    blocking operations like the connection attempt (if not specified, the
    global default timeout setting will be used). This only works for HTTP,
    HTTPS and FTP connections.

    If *context* is specified, it must be a ssl.SSLContext instance describing
    the various SSL options. See HTTPSConnection for more details.

    The optional *cafile* and *capath* parameters specify a set of trusted CA
    certificates for HTTPS requests. cafile should point to a single file
    containing a bundle of CA certificates, whereas capath should point to a
    directory of hashed certificate files. More information can be found in
    ssl.SSLContext.load_verify_locations().

    The *cadefault* parameter is ignored.

    This function always returns an object which can work as a context
    manager and has methods such as

    * geturl() - return the URL of the resource retrieved, commonly used to
      determine if a redirect was followed

    * info() - return the meta-information of the page, such as headers, in the
      form of an email.message_from_string() instance (see Quick Reference to
      HTTP Headers)

    * getcode() - return the HTTP status code of the response.  Raises URLError
      on errors.

    For HTTP and HTTPS URLs, this function returns a http.client.HTTPResponse
    object slightly modified. In addition to the three new methods above, the
    msg attribute contains the same information as the reason attribute ---
    the reason phrase returned by the server --- instead of the response
    headers as it is specified in the documentation for HTTPResponse.

    For FTP, file, and data URLs and requests explicitly handled by legacy
    URLopener and FancyURLopener classes, this function returns a
    urllib.response.addinfourl object.

    Note that None may be returned if no handler handles the request (though
    the default installed global OpenerDirector uses UnknownHandler to ensure
    this never happens).

    In addition, if proxy settings are detected (for example, when a *_proxy
    environment variable like http_proxy is set), ProxyHandler is default
    installed and makes sure the requests are handled through the proxy.

    rNzJcafile, capath and cadefault are deprecated, use a custom context instead.r:zDYou can't pass both context and any of cafile, capath, and cadefaultzSSL support not available)r;r<)r>)
�warnings�warn�DeprecationWarning�
ValueError�	_have_ssl�sslZcreate_default_contextZPurposeZSERVER_AUTH�HTTPSHandlerr2�_opener�open)
�url�data�timeoutr;r<r=r>r?Z
https_handler�opener�rL�&/usr/lib64/python3.6/urllib/request.pyr0�s*<




cCs|adS)N)rF)rKrLrLrMr1�scCs4t|�\}}tjt||����}|j�}|dkrD|rDtjj|�|fS|rTt|d�}nt	j
dd�}|j}tj
|�|��||f}	d
}
d}d}d}
d	|kr�t|d
�}|r�||
|
|�xB|j|
�}|s�P|t|�7}|j|�|
d7}
|r�||
|
|�q�WWdQRXWdQRX|dk�r0||k�r0td||f|	��|	S)aW
    Retrieve a URL into a temporary location on disk.

    Requires a URL argument. If a filename is passed, it is used as
    the temporary file location. The reporthook argument should be
    a callable that accepts a block number, a read size, and the
    total file size of the URL target. The data argument should be
    valid URL encoded data.

    If a filename is passed and the URL points to a local resource,
    the result is a copy from local file to new file.

    Returns a tuple containing the path to the newly created
    data file as well as the resulting HTTPMessage object.
    �file�wbF)�deletei��rzcontent-lengthzContent-LengthNz1retrieval incomplete: got only %i out of %i bytesi ���)r�
contextlib�closingr0�info�os�path�normpathrG�tempfileZNamedTemporaryFile�name�_url_tempfiles�append�int�read�len�writer)rH�filename�
reporthookrIZurl_typerX�fp�headers�tfp�result�bs�sizer_�blocknum�blockrLrLrMr6�sD


$cCsHx0tD](}ytj|�Wqtk
r,YqXqWtdd�=trDdadS)z0Clean up temporary files from urlretrieve calls.N)r\rW�unlink�OSErrorrF)Z	temp_filerLrLrMr7%s


z:\d+$cCs<|j}t|�d}|dkr&|jdd�}tjd|d�}|j�S)z�Return request-host, as defined by RFC 2965.

    Variation from RFC: returned value is lowercased, for convenient
    comparison.

    rR��Host)�full_urlr�
get_header�_cut_port_re�sub�lower)�requestrH�hostrLrLrM�request_host4srwc@s�eZdZdidddfdd�Zedd��Zejdd��Zejdd��Zed	d
��Zejdd
��Zejdd
��Zd
d�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zd#dd�Zdd �Zd!d"�ZdS)$rNFc	Csp||_i|_i|_d|_||_d|_x |j�D]\}}|j||�q.W|dkrVt|�}||_	||_
|rl||_dS)N)rpre�unredirected_hdrs�_datarI�_tunnel_host�items�
add_headerrw�origin_req_host�unverifiable�method)	�selfrHrIrer}r~r�key�valuerLrLrM�__init__FszRequest.__init__cCs|jrdj|j|j�S|jS)Nz{}#{})�fragment�format�	_full_url)r�rLrLrMrpXszRequest.full_urlcCs(t|�|_t|j�\|_|_|j�dS)N)rr�rr��_parse)r�rHrLrLrMrp^s
cCsd|_d|_d|_dS)Nrn)r�r��selector)r�rLrLrMrpescCs|jS)N)ry)r�rLrLrMrIkszRequest.datacCs(||jkr$||_|jd�r$|jd�dS)NzContent-length)ry�
has_header�
remove_header)r�rIrLrLrMrIos

cCs
d|_dS)N)rI)r�rLrLrMrIyscCsNt|j�\|_}|jdkr(td|j��t|�\|_|_|jrJt|j�|_dS)Nzunknown url type: %r)	rr��typerBrprrvr�r
)r��restrLrLrMr�}s
zRequest._parsecCs|jdk	rdnd}t|d|�S)z3Return a string indicating the HTTP request method.N�POST�GETr)rI�getattr)r�Zdefault_methodrLrLrM�
get_method�szRequest.get_methodcCs|jS)N)rp)r�rLrLrM�get_full_url�szRequest.get_full_urlcCs4|jdkr|jr|j|_n||_|j|_||_dS)N�https)r�rzrvrpr�)r�rvr�rLrLrM�	set_proxy�s

zRequest.set_proxycCs|j|jkS)N)r�rp)r�rLrLrM�	has_proxy�szRequest.has_proxycCs||j|j�<dS)N)re�
capitalize)r�r��valrLrLrMr|�szRequest.add_headercCs||j|j�<dS)N)rxr�)r�r�r�rLrLrM�add_unredirected_header�szRequest.add_unredirected_headercCs||jkp||jkS)N)rerx)r��header_namerLrLrMr��s
zRequest.has_headercCs|jj||jj||��S)N)re�getrx)r�r��defaultrLrLrMrq�szRequest.get_headercCs |jj|d�|jj|d�dS)N)re�poprx)r�r�rLrLrMr��szRequest.remove_headercCs"|jj�}|j|j�t|j��S)N)rx�copy�updatere�listr{)r��hdrsrLrLrM�header_items�s
zRequest.header_items)N)�__name__�
__module__�__qualname__r��propertyrp�setter�deleterrIr�r�r�r�r�r|r�r�rqr�r�rLrLrLrMrDs(

c@sNeZdZdd�Zdd�Zdd�Zdd�Zd	ejfd
d�Z	ddd
�Z
dd�Zd	S)rcCs6dt}d|fg|_g|_i|_i|_i|_i|_dS)NzPython-urllib/%sz
User-agent)�__version__�
addheaders�handlers�handle_open�handle_error�process_response�process_request)r�Zclient_versionrLrLrMr��szOpenerDirector.__init__cCsZt|d�stdt|���d}�xt|�D�]}|dkr:q*|jd�}|d|�}||dd�}|jd	�r�|jd�|d}||dd�}yt|�}Wntk
r�YnX|jj	|i�}	|	|j|<n>|d
kr�|}|j
}	n*|dkr�|}|j}	n|dkr*|}|j}	nq*|	j
|g�}
|
�r&tj|
|�n
|
j|�d
}q*W|�rVtj|j|�|j|�dS)N�
add_parentz%expected BaseHandler instance, got %rF�redirect_request�do_open�
proxy_open�_rR�errorrG�responseruT)r�r�r�)�hasattr�	TypeErrorr��dir�find�
startswithr^rBr�r�r�r�r��
setdefault�bisectZinsortr]r�r�)r��handlerZadded�meth�i�protocolZ	condition�j�kind�lookupr�rLrLrM�add_handler�sJ



zOpenerDirector.add_handlercCsdS)NrL)r�rLrLrM�close�szOpenerDirector.closec	Gs<|j|f�}x*|D]"}t||�}||�}|dk	r|SqWdS)N)r�r�)	r��chainr��	meth_name�argsr�r��funcrgrLrLrM�_call_chain�s

zOpenerDirector._call_chainNc
Cs�t|t�rt||�}n|}|dk	r(||_||_|j}|d}x(|jj|g�D]}t||�}||�}qLW|j	||�}	|d}x*|j
j|g�D]}t||�}|||	�}	q�W|	S)NZ_requestZ	_response)�
isinstance�strrrIrJr�r�r�r��_openr�)
r��fullurlrIrJ�reqr�r�Z	processorr�r�rLrLrMrG�s"


zOpenerDirector.opencCsP|j|jdd|�}|r|S|j}|j|j||d|�}|r>|S|j|jdd|�S)Nr�Zdefault_openr��unknown�unknown_open)r�r�r�)r�r�rIrgr�rLrLrMr�s


zOpenerDirector._opencGs~|d
kr,|jd}|d}d|}d}|}n|j}|d}d}|||f|}|j|�}|r^|S|rz|dd	f|}|j|�SdS)N�httpr�r:z
http_error_%srRZ_errorrr��http_error_default)r�r�)r�r�)r��protor��dictr�Zhttp_errZ	orig_argsrgrLrLrMr�'s 

zOpenerDirector.error)N)r�r�r�r�r�r�r��socket�_GLOBAL_DEFAULT_TIMEOUTrGr�r�rLrLrLrMr�s/
c	Gs�t�}ttttttttt	g	}t
tjd�r2|j
t�t�}xN|D]F}x@|D]8}t|t�rlt||�r�|j|�qHt||�rH|j|�qHWq>Wx|D]}|j|�q�Wx|D]}|j|��q�Wx&|D]}t|t�r�|�}|j|�q�W|S)a*Create an opener object from a list of handlers.

    The opener will use several default handlers, including support
    for HTTP, FTP and when applicable HTTPS.

    If any of the handlers passed as arguments are subclasses of the
    default handlers, the default handlers will not be used.
    �HTTPSConnection)rrr.r)rrr+r*r/r-r�r��clientr]rE�setr�r��
issubclass�add�remover�)r�rKZdefault_classes�skip�klassZcheck�hrLrLrMr2@s0	









c@s(eZdZdZdd�Zdd�Zdd�ZdS)	ri�cCs
||_dS)N)�parent)r�r�rLrLrMr�gszBaseHandler.add_parentcCsdS)NrL)r�rLrLrMr�jszBaseHandler.closecCst|d�sdS|j|jkS)N�
handler_orderT)r�r�)r��otherrLrLrM�__lt__ns
zBaseHandler.__lt__N)r�r�r�r�r�r�r�rLrLrLrMrdsc@s eZdZdZdZdd�ZeZdS)r/zProcess HTTP error responses.i�cCsJ|j|j|j�}}}d|ko*dknsF|jjd|||||�}|S)N��i,r�)�code�msgrVr�r�)r�rur�r�r�r�rLrLrM�
http_response{s
z HTTPErrorProcessor.http_responseN)r�r�r��__doc__r�r��https_responserLrLrLrMr/wsc@seZdZdd�ZdS)rcCst|j||||��dS)N)rrp)r�r�rdr�r�r�rLrLrMr��sz*HTTPDefaultErrorHandler.http_error_defaultN)r�r�r�r�rLrLrLrMr�sc@s4eZdZdZdZdd�Zdd�ZeZZZ	dZ
dS)	r��
c	sx|j�}|dkr|dkp&|dko&|dks:t|j||||��|jdd	�}d�t�fdd
�|jj�D��}t|||jdd�S)a�Return a Request or None in response to a redirect.

        This is called by the http_error_30x methods when a
        redirection response is received.  If a redirection should
        take place, return a new Request to allow http_error_30x to
        perform the redirect.  Otherwise, raise HTTPError if no-one
        else should try to handle this url.  Return None if you can't
        but another Handler might.
        �-�.�/�3r��HEADr�� z%20�content-length�content-typec3s&|]\}}|j��kr||fVqdS)N)rt)�.0�k�v)�CONTENT_HEADERSrLrM�	<genexpr>�sz7HTTPRedirectHandler.redirect_request.<locals>.<genexpr>T)rer}r~)r�r�r�r�)r�r�)r�r�r�)r�r�)	r�rrp�replacer�rer{rr})	r�r�rdr�r�re�newurl�mZ
newheadersrL)r�rMr��s
z$HTTPRedirectHandler.redirect_requestc
CsNd|kr|d}nd|kr$|d}ndSt|�}|jdkrRt||d||f||��|jrp|jrpt|�}d|d	<t|�}t|d
tj	d�}t
|j|�}|j||||||�}|dkr�dSt
|d��r|j}	|_|	j|d
�|jks�t|	�|jk�rt|j||j|||��ni}	|_|_|	j|d
�d|	|<|j�|j�|jj||jd�S)N�location�urir�r��ftprnz+%s - Redirection to url '%s' is not allowed�/r:z
iso-8859-1)�encoding�safe�
redirect_dictrrR)rJ)r�r�r�rn)r�schemerrXZnetlocr�rr	�stringZpunctuationrrpr�r�rr��max_repeatsr`�max_redirections�inf_msgr_r�r�rGrJ)
r�r�rdr�r�rer��urlparts�newZvisitedrLrLrM�http_error_302�s@



z"HTTPRedirectHandler.http_error_302zoThe HTTP server returned a redirect error that would lead to an infinite loop.
The last 30x error message was:
N)r�r�r�rrr�r
�http_error_301�http_error_303�http_error_307rrLrLrLrMr�s&<c	Cs�t|�\}}|jd�s d}|}n:|jd�s6td|��|jdd�}|dkrNd}|d|�}t|�\}}|dk	r|t|�\}}nd}}||||fS)aReturn (scheme, user, password, host/port) given a URL or an authority.

    If a URL is supplied, it must have an authority (host:port) component.
    According to RFC 3986, having an authority component means the URL must
    have two slashes after the scheme.
    r�Nz//zproxy URL with no authority: %rr:rRrS)rr�rBr�rr)	�proxyrZr_scheme�	authority�endZuserinfo�hostport�user�passwordrLrLrM�_parse_proxy�s

rc@s"eZdZdZddd�Zdd�ZdS)r�dNcCsL|dkrt�}||_x2|j�D]&\}}t|d||||jfdd��qWdS)Nz%s_opencSs||||�S)NrL)�rrr�r�rLrLrM�<lambda>%sz'ProxyHandler.__init__.<locals>.<lambda>)r5�proxiesr{�setattrr�)r�rr�rHrLrLrMr�s
zProxyHandler.__init__cCs�|j}t|�\}}}}|dkr"|}|jr6t|j�r6dS|rv|rvdt|�t|�f}	tj|	j��jd�}
|j	dd|
�t|�}|j
||�||ks�|dkr�dS|jj||j
d�SdS)Nz%s:%s�asciizProxy-authorizationzBasic r�)rJ)r�rrv�proxy_bypassr
�base64�	b64encode�encode�decoder|r�r�rGrJ)r�r�rr�Z	orig_typeZ
proxy_typerrrZ	user_passZcredsrLrLrMr�(s zProxyHandler.proxy_open)N)r�r�r�r�r�r�rLrLrLrMrs

c@s6eZdZdd�Zdd�Zdd�Zd
dd	�Zd
d�ZdS)r cCs
i|_dS)N)�passwd)r�rLrLrMr�FszHTTPPasswordMgr.__init__cs`t|t�r|g}|�jkr$i�j|<x6dD].�t��fdd�|D��}||f�j||<q*WdS)NTFcsg|]}�j|���qSrL)�
reduce_uri)r��u)�default_portr�rLrM�
<listcomp>Qsz0HTTPPasswordMgr.add_password.<locals>.<listcomp>)TF)r�r�r �tuple)r��realmr�rr �reduced_urirL)r#r�rM�add_passwordIs



zHTTPPasswordMgr.add_passwordc	Cs`|jj|i�}xLdD]D}|j||�}x2|j�D]&\}}x|D]}|j||�r<|Sq<Wq.WqWdS)NTF)TF)NN)r r�r!r{�	is_suburi)	r�r&�authuriZdomainsr#�reduced_authuriZurisZauthinfor�rLrLrM�find_user_passwordTs

z"HTTPPasswordMgr.find_user_passwordTc
Cs�t|�}|dr.|d}|d}|dp*d}nd}|}d}t|�\}}|r~|dkr~|dk	r~ddd�j|�}	|	dk	r~d	||	f}||fS)
z@Accept authority or URI and extract only the authority and path.rRrr:r�N�Pi�)r�r�z%s:%d)rr
r�)
r�r�r#�partsrrrXrv�portZdportrLrLrMr!^s zHTTPPasswordMgr.reduce_uricCsR||krdS|d|dkr dStj|d|df�}t|�t|d�krNdSdS)zcCheck if test is below base in a URI tree

        Both args must be URIs in reduced form.
        TrFrR)�	posixpath�commonprefixr`)r��base�test�commonrLrLrMr)uszHTTPPasswordMgr.is_suburiN)T)r�r�r�r�r(r,r!r)rLrLrLrMr Ds


c@seZdZdd�ZdS)r!cCs0tj|||�\}}|dk	r"||fStj|d|�S)N)r r,)r�r&r*rrrLrLrMr,�s

z2HTTPPasswordMgrWithDefaultRealm.find_user_passwordN)r�r�r�r,rLrLrLrMr!�scs<eZdZ�fdd�Zd
�fdd�	Zddd�Zdd	�Z�ZS)r"csi|_t�j||�dS)N)�
authenticated�superr�)r�r��kwargs)�	__class__rLrMr��sz%HTTPPasswordMgrWithPriorAuth.__init__Fcs<|j||�|dk	r&t�jd|||�t�j||||�dS)N)�update_authenticatedr6r()r�r&r�rr �is_authenticated)r8rLrMr(�sz)HTTPPasswordMgrWithPriorAuth.add_passwordcCsFt|t�r|g}x0dD](}x"|D]}|j||�}||j|<q WqWdS)NTF)TF)r�r�r!r5)r�r�r:r#r"r'rLrLrMr9�s


z1HTTPPasswordMgrWithPriorAuth.update_authenticatedcCsDx>dD]6}|j||�}x$|jD]}|j||�r|j|SqWqWdS)NTF)TF)r!r5r))r�r*r#r+r�rLrLrMr:�s

z-HTTPPasswordMgrWithPriorAuth.is_authenticated)F)F)r�r�r�r�r(r9r:�
__classcell__rLrL)r8rMr"�s

c@sTeZdZejdej�Zddd�Zdd�Zdd�Z	d	d
�Z
dd�Zd
d�ZeZ
eZdS)r#z1(?:^|,)[ 	]*([^ 	,]+)[ 	]+realm=(["']?)([^"']*)\2NcCs"|dkrt�}||_|jj|_dS)N)r r r()r�Zpassword_mgrrLrLrMr��sz!AbstractBasicAuthHandler.__init__ccstd}xFtjj|�D]6}|j�\}}}|d	kr:tjdtd�||fVd}qW|sp|rb|j�d}nd}|dfVdS)
NF�"�'zBasic Auth Realm was unquoted�Trrn)r<r=)r#�rx�finditer�groupsr?r@�UserWarning�split)r��headerZfound_challengeZmorr	r&rLrLrM�_parse_realm�s
z%AbstractBasicAuthHandler._parse_realmc	Cs~|j|�}|sdSd}xL|D]D}x>|j|�D]0\}}|j�dkrF|}q,|dk	r,|j|||�Sq,WqW|dk	rztd|f��dS)N�basiczBAbstractBasicAuthHandler does not support the following scheme: %r)Zget_allrErt�retry_http_basic_authrB)	r��authreqrvr�reZunsupportedrDrr&rLrLrM�http_error_auth_reqed�s

z.AbstractBasicAuthHandler.http_error_auth_reqedcCs||jj||�\}}|dk	rtd||f}dtj|j��jd�}|j|jd�|krTdS|j|j|�|j	j
||jd�SdSdS)Nz%s:%szBasic r)rJ)r r,rrrrrq�auth_headerr�r�rGrJ)r�rvr�r&r�pw�raw�authrLrLrMrG�sz.AbstractBasicAuthHandler.retry_http_basic_authcCsxt|jd�s|jj|j�r"|S|jd�st|jjd|j�\}}dj||�j�}tj	|�j
�}|jddj|j���|S)Nr:�
Authorizationz{0}:{1}zBasic {})
r�r r:rpr�r,r�rrZstandard_b64encoderr��strip)r�r�rr ZcredentialsZauth_strrLrLrM�http_requests
z%AbstractBasicAuthHandler.http_requestcCsLt|jd�rHd|jko dknr8|jj|jd�n|jj|jd�|S)Nr:r�i,TF)r�r r�r9rp)r�r�r�rLrLrMr�s
z&AbstractBasicAuthHandler.http_response)N)r�r�r��re�compile�Ir?r�rErIrGrPr��
https_requestr�rLrLrLrMr#�s

c@seZdZdZdd�ZdS)r$rNcCs|j}|jd|||�}|S)Nzwww-authenticate)rprI)r�r�rdr�r�rerHr�rLrLrM�http_error_401 s
z#HTTPBasicAuthHandler.http_error_401N)r�r�r�rJrUrLrLrLrMr$sc@seZdZdZdd�ZdS)r%zProxy-authorizationcCs|j}|jd|||�}|S)Nzproxy-authenticate)rvrI)r�r�rdr�r�rerr�rLrLrM�http_error_407+s
z$ProxyBasicAuthHandler.http_error_407N)r�r�r�rJrVrLrLrLrMr%'sc@sNeZdZddd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Zdd�Z	dd�Z
dS)r&NcCs4|dkrt�}||_|jj|_d|_d|_d|_dS)Nr)r r r(�retried�nonce_count�
last_nonce)r�r rLrLrMr�Es
z"AbstractDigestAuthHandler.__init__cCs
d|_dS)Nr)rW)r�rLrLrM�reset_retry_countNsz+AbstractDigestAuthHandler.reset_retry_countcCs||j|d�}|jdkr*t|jdd|d��n|jd7_|rx|j�d}|j�dkr`|j||�S|j�dkrxtd|��dS)	N�i�zdigest auth failedrRrZdigestrFzEAbstractDigestAuthHandler does not support the following scheme: '%s')r�rWrrprCrt�retry_http_digest_authrB)r�rJrvr�rerHrrLrLrMrIQs


z/AbstractDigestAuthHandler.http_error_auth_reqedcCsz|jdd�\}}ttdt|���}|j||�}|rvd|}|jj|jd�|krRdS|j|j|�|j	j
||jd�}|SdS)Nr�rRz	Digest %s)rJ)rC�parse_keqv_list�filter�parse_http_list�get_authorizationrer�rJr�r�rGrJ)r�r�rM�tokenZ	challenge�chalZauth_valZresprLrLrMr\esz0AbstractDigestAuthHandler.retry_http_digest_authcCs@d|j|tj�f}|jd�td�}tj|�j�}|dd�S)Nz	%s:%s:%s:rrQ�)rX�timeZctimer�_randombytes�hashlib�sha1�	hexdigest)r��nonce�s�b�digrLrLrM�
get_cnonceqsz$AbstractDigestAuthHandler.get_cnoncecCs�y6|d}|d}|jd�}|jdd�}|jdd�}Wntk
rJdSX|j|�\}}	|dkrfdS|jj||j�\}
}|
dkr�dS|jdk	r�|j|j|�}nd}d|
||f}
d|j�|j	f}|d	k�r.||j
kr�|jd
7_nd
|_||_
d|j}|j|�}d||||||�f}|	||
�|�}n2|dk�rT|	||
�d|||�f�}nt
d
|��d|
|||j	|f}|�r�|d|7}|�r�|d|7}|d|7}|�r�|d||f7}|S)Nr&ri�qop�	algorithm�MD5�opaquez%s:%s:%sz%s:%srMrRz%08xz%s:%s:%s:%s:%szqop '%s' is not supported.z>username="%s", realm="%s", nonce="%s", uri="%s", response="%s"z
, opaque="%s"z
, digest="%s"z, algorithm="%s"z, qop=auth, nc=%s, cnonce="%s")r��KeyError�get_algorithm_implsr r,rprI�get_entity_digestr�r�rYrXrmr)r�r�rbr&rirnrorq�H�KDrrKZentdigZA1ZA2ZncvalueZcnonceZnoncebitZrespdigr2rLrLrMr`|sV








z+AbstractDigestAuthHandler.get_authorizationcsD|dkrdd��n|dkr$dd��ntd|���fdd�}�|fS)NrpcSstj|jd��j�S)Nr)rfZmd5rrh)�xrLrLrMr�sz?AbstractDigestAuthHandler.get_algorithm_impls.<locals>.<lambda>ZSHAcSstj|jd��j�S)Nr)rfrgrrh)rwrLrLrMr�sz.Unsupported digest authentication algorithm %rcs�d||f�S)Nz%s:%srL)rj�d)rurLrMr�s)rB)r�rorvrL)rurMrs�s

z-AbstractDigestAuthHandler.get_algorithm_implscCsdS)NrL)r�rIrbrLrLrMrt�sz+AbstractDigestAuthHandler.get_entity_digest)N)r�r�r�r�rZrIr\rmr`rsrtrLrLrLrMr&:s
	<
c@s eZdZdZdZdZdd�ZdS)r'z�An authentication protocol defined by RFC 2069

    Digest authentication improves on basic authentication because it
    does not transmit passwords in the clear.
    rNi�cCs*t|j�d}|jd|||�}|j�|S)NrRzwww-authenticate)rrprIrZ)r�r�rdr�r�rerv�retryrLrLrMrU�s

z$HTTPDigestAuthHandler.http_error_401N)r�r�r�r�rJr�rUrLrLrLrMr'�sc@seZdZdZdZdd�ZdS)r(zProxy-Authorizationi�cCs"|j}|jd|||�}|j�|S)Nzproxy-authenticate)rvrIrZ)r�r�rdr�r�rervryrLrLrMrV�s

z%ProxyDigestAuthHandler.http_error_407N)r�r�r�rJr�rVrLrLrLrMr(�sc@s6eZdZd
dd�Zdd�Zdd�Zdd	�Zd
d�ZdS)�AbstractHTTPHandlerrcCs
||_dS)N)�_debuglevel)r��
debuglevelrLrLrMr��szAbstractHTTPHandler.__init__cCs
||_dS)N)r{)r��levelrLrLrM�set_http_debuglevel�sz'AbstractHTTPHandler.set_http_debuglevelcCstjjj|j|j��S)N)r�r��HTTPConnection�_get_content_lengthrIr�)r�rurLrLrMr��sz'AbstractHTTPHandler._get_content_lengthcCs
|j}|std��|jdk	r�|j}t|t�r8d}t|��|jd�sN|jdd�|jd�r�|jd�r�|j|�}|dk	r�|jdt|��n|jdd�|}|j	�r�t
|j�\}}t|�\}}	|jd�s�|jd|�x2|j
jD]&\}
}|
j�}
|j|
�s�|j|
|�q�W|S)	Nz
no host givenz\POST data should be bytes, an iterable of bytes, or a file object. It cannot be of type str.zContent-typez!application/x-www-form-urlencodedzContent-lengthzTransfer-encodingZchunkedro)rvrrIr�r�r�r�r�r�r�rr�rr�r�r�)r�rurvrIr�Zcontent_lengthZsel_hostrZselZsel_pathr[r�rLrLrM�do_request_�s>





zAbstractHTTPHandler.do_request_c
s\|j}|std��||fd|ji|��}|j|j�t|j���jt�fdd�|jj	�D���d�d<tdd��j	�D���|j
r�i}d}|�kr��|||<�|=|j|j
|d	�y`y&|j|j
�|j|j�|jd
�d�Wn,tk
�r
}zt|��WYdd}~XnX|j�}	Wn|j��YnX|j�rF|jj�d|_|j�|	_|	j|	_|	S)
z�Return an HTTPResponse object for the request, using http_class.

        http_class must implement the HTTPConnection API from http.client.
        z
no host givenrJc3s"|]\}}|�kr||fVqdS)NrL)r�r�r�)rerLrMr�)sz.AbstractHTTPHandler.do_open.<locals>.<genexpr>r��
Connectioncss|]\}}|j�|fVqdS)N)�title)r�r[r�rLrLrMr�6szProxy-Authorization)rezTransfer-encoding)Zencode_chunkedN)rvrrJZset_debuglevelr{r�rxr�rer{rzZ
set_tunnelrur�r�rIr�rm�getresponser�Zsockr�rH�reasonr�)
r�Z
http_classr�Zhttp_conn_argsrvr�Ztunnel_headersZproxy_auth_hdr�errrrL)rerMr�s@
"

zAbstractHTTPHandler.do_openN)r)r�r�r�r�r~r�r�r�rLrLrLrMrz�s

&rzc@seZdZdd�ZejZdS)r)cCs|jtjj|�S)N)r�r�r�r)r�r�rLrLrM�	http_open`szHTTPHandler.http_openN)r�r�r�r�rzr�rPrLrLrLrMr)^sr�c@s$eZdZddd�Zdd�ZejZdS)rErNcCstj||�||_||_dS)N)rzr��_context�_check_hostname)r�r|r>�check_hostnamerLrLrMr�iszHTTPSHandler.__init__cCs|jtjj||j|jd�S)N)r>r�)r�r�r�r�r�r�)r�r�rLrLrM�
https_opennszHTTPSHandler.https_open)rNN)r�r�r�r�r�rzr�rTrLrLrLrMrEgs
rEc@s.eZdZddd�Zdd�Zdd�ZeZeZdS)	rNcCs$ddl}|dkr|jj�}||_dS)Nr)Zhttp.cookiejar�	cookiejarZ	CookieJar)r�r�r�rLrLrMr�ws
zHTTPCookieProcessor.__init__cCs|jj|�|S)N)r�Zadd_cookie_header)r�rurLrLrMrP}sz HTTPCookieProcessor.http_requestcCs|jj||�|S)N)r�Zextract_cookies)r�rur�rLrLrMr��sz!HTTPCookieProcessor.http_response)N)r�r�r�r�rPr�rTr�rLrLrLrMrvs

c@seZdZdd�ZdS)r.cCs|j}td|��dS)Nzunknown url type: %s)r�r)r�r�r�rLrLrMr��szUnknownHandler.unknown_openN)r�r�r�r�rLrLrLrMr.�scCsRi}xH|D]@}|jdd�\}}|ddkrB|ddkrB|dd�}|||<q
W|S)z>Parse list of key=value strings where keys are not duplicated.�=rRrr<rSrS)rC)�lZparsedZeltr�r�rLrLrMr]�s
r]cCs�g}d}d}}xt|D]l}|r,||7}d}q|rV|dkr@d}qn|dkrLd}||7}q|dkrn|j|�d}q|dkrzd}||7}qW|r�|j|�dd�|D�S)	apParse lists as described by RFC 2068 Section 2.

    In particular, parse comma-separated lists where the elements of
    the list may include quoted-strings.  A quoted-string could
    contain a comma.  A non-quoted string could have quotes in the
    middle.  Neither commas nor quotes count if they are escaped.
    Only double-quotes count, not single-quotes.
    rnF�\Tr<�,cSsg|]}|j��qSrL)rO)r��partrLrLrMr$�sz#parse_http_list.<locals>.<listcomp>)r])rj�resr��escaper	ZcurrLrLrMr_�s4	


r_c@s(eZdZdd�ZdZdd�Zdd�ZdS)r*cCs\|j}|dd�dkrN|dd�dkrN|jrN|jdkrN|j|j�krXtd��n
|j|�SdS)Nr:z//r>r��	localhostz-file:// scheme is supported only on localhost)r�rv�	get_namesr�open_local_file)r�r�rHrLrLrM�	file_open�s&

zFileHandler.file_openNcCs`tjdkrZy*ttjd�dtjtj��d�t_Wn$tjk
rXtjd�ft_YnXtjS)Nr�r:)r*�namesr%r��gethostbyname_ex�gethostname�gaierror�
gethostbyname)r�rLrLrMr��s
zFileHandler.get_namescCsddl}ddl}|j}|j}t|�}y�tj|�}|j}|jj	|j
dd�}	|j|�d}
|jd|
pbd||	f�}|r~t
|�\}}|s�|r�t|�|j�kr�|r�d||}
nd|}
tt|d�||
�SWn*tk
r�}zt|��WYdd}~XnXtd��dS)	NrT)�usegmtz6Content-type: %s
Content-length: %d
Last-modified: %s
z
text/plainzfile://�rbzfile not on local host)�email.utils�	mimetypesrvr�r4rW�stat�st_size�utils�
formatdate�st_mtime�
guess_type�message_from_stringr
�_safe_gethostbynamer�rrGrmr)r�r��emailr�rvrbZ	localfile�statsri�modified�mtyperer/Zorigurl�exprLrLrMr��s0
zFileHandler.open_local_file)r�r�r�r�r�r�r�rLrLrLrMr*�s
cCs&y
tj|�Stjk
r dSXdS)N)r�r�r�)rvrLrLrMr��s
r�c@seZdZdd�Zdd�ZdS)r+cCs.ddl}ddl}|j}|s"td��t|�\}}|dkr>|j}nt|�}t|�\}}|rdt|�\}}nd}t	|�}|pvd}|p~d}yt
j|�}Wn*tk
r�}zt|��WYdd}~XnXt
|j�\}	}
|	jd�}ttt	|��}|dd�|d}}|�r|d�r|dd�}y�|j||||||j�}
|�r8d�p:d}x:|
D]2}t|�\}}|j�dk�rB|dk�rB|j�}�qBW|
j||�\}}d}|j|j�d}|�r�|d
|7}|dk	�r�|dk�r�|d|7}tj|�}t|||j�S|jk
�r(}z$td|�}|jtj �d��WYdd}~XnXdS)Nrzftp error: no host givenrnr�rRrS�Dr��a�Ar�rxzContent-type: %s
zContent-length: %d
z
ftp error: %rr:rSrS)r�r�r�rSrxr�)!�ftplibr�rvrr
�FTP_PORTr^rrr
r�r�rmrr�rCr��map�connect_ftprJrrt�upper�retrfiler�rpr�r�r�
all_errors�with_traceback�sys�exc_info)r�r�r�r�rvr/rr r�rX�attrs�dirsrN�fwr��attrr�rd�retrlenrer�r��excrLrLrM�ftp_open�s\



zFTPHandler.ftp_openc	Cst||||||dd�S)NF)�
persistent)�
ftpwrapper)r�rr rvr/r�rJrLrLrMr�1szFTPHandler.connect_ftpN)r�r�r�r�r�rLrLrLrMr+�s5c@s<eZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
S)r,cCs"i|_i|_d|_d|_d|_dS)Nr�<rc)�cacherJ�soonest�delay�	max_conns)r�rLrLrMr�8s
zCacheFTPHandler.__init__cCs
||_dS)N)r�)r��trLrLrM�
setTimeout?szCacheFTPHandler.setTimeoutcCs
||_dS)N)r�)r�r�rLrLrM�setMaxConnsBszCacheFTPHandler.setMaxConnscCsr|||dj|�|f}||jkr4tj�|j|j|<n,t||||||�|j|<tj�|j|j|<|j�|j|S)Nr�)�joinr�rdr�rJr��check_cache)r�rr rvr/r�rJr�rLrLrMr�Es

zCacheFTPHandler.connect_ftpcCs�tj�}|j|krTx@t|jj��D].\}}||kr"|j|j�|j|=|j|=q"Wtt|jj���|_t	|j�|j
kr�x6t|jj��D]$\}}||jkr�|j|=|j|=Pq�Wtt|jj���|_dS)N)rdr�r�rJr{r�r��min�valuesr`r�)r�r�r�r�rLrLrMr�Ps

zCacheFTPHandler.check_cachecCs4x|jj�D]}|j�qW|jj�|jj�dS)N)r�r�r��clearrJ)r��connrLrLrM�clear_cacheds
zCacheFTPHandler.clear_cacheN)	r�r�r�r�r�r�r�r�r�rLrLrLrMr,5sc@seZdZdd�ZdS)r-cCs~|j}|jdd�\}}|jdd�\}}t|�}|jd�rNtj|�}|dd�}|sVd}tjd|t|�f�}t	t
j|�||�S)	N�:rRr�z;base64�ztext/plain;charset=US-ASCIIz$Content-type: %s
Content-length: %d
i����)rprCr�endswithr�decodebytesr�r�r`r�io�BytesIO)r�r�rHrrIZ	mediatypererLrLrM�	data_openks


zDataHandler.data_openN)r�r�r�r�rLrLrLrMr-jsr��nt)r4r3cCst|�S)zOS-specific conversion from a relative URL of the 'file' scheme
        to a file system path; not recommended for general use.)r
)�pathnamerLrLrMr4�scCst|�S)zOS-specific conversion from a file system path to a relative URL
        of the 'file' scheme; not recommended for general use.)r	)r�rLrLrMr3�sc@s�eZdZdZdZdeZd*dd�Zdd�Zdd	�Z	d
d�Z
dd
�Zd+dd�Zd,dd�Z
d-dd�Zd.dd�Zdd�Zd/dd�Zd0dd�Zdd�Zer�dd�Zd1d d!�Zd"d#�Zd$d%�Zd&d'�Zd2d(d)�ZdS)3r8a,Class to open URLs.
    This is a class rather than just a subroutine because we may need
    more than one set of global protocol-specific options.
    Note -- this is a base class for those who don't want the
    automatic handling of errors type 302 (relocated) and 401
    (authorization needed).NzPython-urllib/%scKszdd|jji}tj|tdd�|dkr.t�}||_|jd�|_|jd�|_	d|j
fd
g|_g|_t
j|_d|_t|_dS)NzW%(class)s style of invoking requests is deprecated. Use newer urlopen functions/methods�classr>)�
stacklevel�key_file�	cert_filez
User-Agent�Accept�*/*)r�r�)r8r�r?r@rAr5rr�r�r��versionr��_URLopener__tempfilesrWrl�_URLopener__unlink�	tempcache�ftpcache)r�rZx509r�rLrLrMr��szURLopener.__init__cCs|j�dS)N)r�)r�rLrLrM�__del__�szURLopener.__del__cCs|j�dS)N)�cleanup)r�rLrLrMr��szURLopener.closecCsZ|jrFx2|jD](}y|j|�Wqtk
r4YqXqW|jdd�=|jrV|jj�dS)N)r�r�rmr�r�)r�rNrLrLrMr��s
zURLopener.cleanupcGs|jj|�dS)zdAdd a header to be used by the HTTP interface only
        e.g. u.addheader('Accept', 'sound/basic')N)r�r])r�r�rLrLrM�	addheader�szURLopener.addheadercCsntt|��}t|dd�}|jrL||jkrL|j|\}}t|d�}t|||�St|�\}}|s`d}||jkr�|j|}t|�\}}	t|	�\}
}|
|f}nd}d|}||_	|j
dd�}t||�s�|d	kr�|r�|j|||�S|j
||�Sy,|dk�rt||�|�St||�||�SWnVttfk
�r.�Yn<tk
�rh}
ztd
|
�jtj�d��WYdd}
~
XnXdS)z6Use URLopener().open(file) instead of open(file, 'r').z%/:=&?~#+!$,;'@()*[]|)rr�rNNZopen_�-r�r�zsocket errorr:)rrr	r�rGrrrrr�r�r��open_unknown_proxy�open_unknownr�rrrmr�r�r�)r�r�rIrbrerd�urltyperHr�	proxyhostrvr�r[r�rLrLrMrG�s<




zURLopener.opencCst|�\}}tdd|��dS)z/Overridable interface to open unknown URL type.z	url errorzunknown url typeN)rrm)r�r�rIr�rHrLrLrMr�szURLopener.open_unknowncCs t|�\}}tdd||��dS)z/Overridable interface to open unknown URL type.z	url errorzinvalid proxy for %sN)rrm)r�rr�rIr�rHrLrLrMr�	szURLopener.open_unknown_proxyc Cs&tt|��}|jr&||jkr&|j|St|�\}}|dkr�|sH|dkr�y.|j|�}|j�}|j�tt|�d�|fSt	k
r�}	zWYdd}	~	XnX|j
||�}�zH|j�}
|r�t
|d�}n|ddl}t|�\}
}t|p�d�\}
}t|p�d�\}}
t
|�pd�\}}
tjj|�d}|j|�\}}|jj|�tj|d�}z�||
f}|jdk	�r^||j|<d}d
}d}d}d	|
k�r�t|
d
�}|�r�||||�xH|j|�}|�s�P|t|�7}|j|�|d7}|�r�||||��q�WWd|j�XWd|j�X|dk�r"||k�r"td||f|��|S)ztretrieve(url) returns (filename, headers) for a local object
        or (tempfilename, headers) for a remote object.NrNrRrOrrnirQzcontent-lengthzContent-Lengthz1retrieval incomplete: got only %i out of %i bytesi rS)rrr�rr�rVr�r4rrmrGrZrrrWrX�splitextZmkstempr�r]�fdopenr^r_r`rar)r�rHrbrcrIr�Zurl1rdr�r�rerfrZZgarbagerX�suffix�fdrgrhrir_rjrkrLrLrM�retrievesl






zURLopener.retrievecCs(d}d}t|t�r<t|�\}}|r6t|�\}}t|�}|}nt|\}}t|�\}}t|�\}	}
|
}d}|	j�dkrvd}n:t|
�\}}
|r�t|�\}}|r�d|	||
f}t|�r�|}|s�tdd��|r�t|�}t	j
|j��jd�}nd}|�rt|�}t	j
|j��jd�}nd}||�}
i}|�r*d||d<|�r<d||d	<|�rJ||d
<d|d<x|j
D]\}}|||<�qZW|dk	�r�d
|d<|
jd|||�n|
jd||d�y|
j�}Wn"tjjk
�r�td��YnXd|jk�o�dkn�rt||jd||j�S|j||j|j|j|j|�SdS)a�Make an HTTP connection using connection_class.

        This is an internal method that should be called from
        open_http() or open_https().

        Arguments:
        - connection_factory should take a host name and return an
          HTTPConnection instance.
        - url is the url to retrieval or a host, relative-path pair.
        - data is payload for a POST request or None.
        Nr�z	%s://%s%sz
http errorz
no host givenrzBasic %szProxy-AuthorizationrNror�r�z!application/x-www-form-urlencodedzContent-Typer�r�)rez$http protocol error: bad status liner�i,zhttp:)r�r�rrr
rrtrrmrrrrr�rur�r�r�Z
BadStatusLinerZstatusrr��
http_errorrdr�)r�Zconnection_factoryrHrIZuser_passwdZproxy_passwdrvr�Zrealhostr�r�Z
proxy_authrMZ	http_connrerDr�r�rLrLrM�_open_generic_httpQsr



zURLopener._open_generic_httpcCs|jtjj||�S)zUse HTTP protocol.)r�r�r�r)r�rHrIrLrLrM�	open_http�szURLopener.open_httpc
Csbd|}t||�rPt||�}|dkr6||||||�}	n|||||||�}	|	rP|	S|j|||||�S)z�Handle http errors.

        Derived class can override this, or provide specific handlers
        named http_error_DDD where DDD is the 3-digit error code.z
http_error_%dN)r�r�r�)
r�rHrd�errcode�errmsgrerIr[rrgrLrLrMr��s

zURLopener.http_errorcCs|j�t||||d��dS)z>Default error handler: close the connection and raise OSError.N)r�r)r�rHrdr�r�rerLrLrMr��szURLopener.http_error_defaultcCstjj||j|jd�S)N)r�r�)r�r�r�r�r�)r�rvrLrLrM�_https_connection�szURLopener._https_connectioncCs|j|j||�S)zUse HTTPS protocol.)r�r�)r�rHrIrLrLrM�
open_https�szURLopener.open_httpscCs^t|t�std��|dd�dkrP|dd�dkrP|dd�j�dkrPtd	��n
|j|�SdS)
z/Use local file or FTP depending on form of URL.zEfile error: proxy support for file protocol currently not implementedNr:z//r>r��z
localhost/z-file:// scheme is supported only on localhost)r�r�rrtrBr�)r�rHrLrLrM�	open_file�s

4
zURLopener.open_filecCs\ddl}ddl}t|�\}}t|�}ytj|�}Wn0tk
rb}zt|j|j	��WYdd}~XnX|j
}	|jj|j
dd�}
|j|�d}|jd|p�d|	|
f�}|s�|}
|dd�dkr�d	|}
tt|d
�||
�St|�\}}|o�tj|�t�ft�k�rP|}
|dd�dk�r d	|}
n|dd�dk�r>td
|��tt|d
�||
�Std��dS)zUse local file.rNT)r�z6Content-Type: %s
Content-Length: %d
Last-modified: %s
z
text/plainrRr�zfile://r�r:z./zAlocal file url may start with / or file:. Unknown url of type: %sz#local file error: not on local host)r�r�rr4rWr�rmr�strerrorrbr�r�r�r�r�r�rrGr
r�r�r��thishostrB)r�rHr�r�rvrNZ	localnamer��erir�r�reZurlfiler/rLrLrMr��s: 
zURLopener.open_local_filecCs�t|t�std��ddl}t|�\}}|s2td��t|�\}}t|�\}}|r\t|�\}}nd}t|�}t|ppd�}t|p|d�}t	j
|�}|s�ddl}|j}nt
|�}t|�\}}	t|�}|jd�}
|
dd�|
d}
}|
o�|
d�r�|
dd�}
|
�r|
d�rd|
d<|||dj|
�f}t|j�tk�rlx8t|j�D]*}
|
|k�r>|j|
}|j|
=|j��q>Wy�||jk�r�t|||||
�|j|<|�s�d}nd	}x:|	D]2}t|�\}}|j�d
k�r�|dk�r�|j�}�q�W|j|j||�\}}|jd|�d}d}|�r|d|7}|dk	�r:|dk�r:|d|7}tj|�}t||d|�St�k
�r�}z td|�j t!j"�d��WYdd}~XnXdS)zUse FTP protocol.zCftp error: proxy support for ftp protocol currently not implementedrNzftp error: no host givenrnr�rRr�rSr�r�r�r�rxzftp:zContent-Type: %s
zContent-Length: %d
zftp error %rr:rSrS)r�r�r�rSrxr�)#r�r�rr�rr
rrr
r�r�r�r�r^rrCr�r`r��MAXFTPCACHEr�r�r�rrtr�r�r�r�r�r�	ftperrorsr�r�r�)r�rHr�rvrXr/rr r�r�r�rNr�r�r�r�r�r�rdr�r�rer�rLrLrM�open_ftp�sp







zURLopener.open_ftpc	Cs<t|t�std��y|jdd�\}}Wntk
rDtdd��YnX|sNd}|jd�}|dkr�d	||d
�kr�||dd
�}|d
|�}nd}g}|jdtj	d
tj
tj����|jd|�|dkr�tj|j
d��jd�}nt|�}|jdt|��|jd�|j|�dj|�}tj|�}tj|�}t|||�S)zUse "data" URL.zEdata error: proxy support for data protocol currently not implementedr�rRz
data errorzbad data URLztext/plain;charset=US-ASCII�;rr�NrnzDate: %sz%a, %d %b %Y %H:%M:%S GMTzContent-type: %srrzlatin-1zContent-Length: %d�
)r�r�rrCrBrm�rfindr]rdZstrftimeZgmtimerr�rrr
r`r�r�r�r��StringIOr)	r�rHrIr�Zsemirr�re�frLrLrM�	open_data3s6






zURLopener.open_data)N)N)N)N)NNN)N)N)N)N)r�r�r�r�r�r�r�r�r�r�r�r�rGr�r�r�r�r�r�r�rCr�r�r�r�rrrLrLrLrMr8�s.

$


B\


	 :c@s�eZdZdZdd�Zdd�Zd#dd�Zd	d
�Zd$dd�Zd%d
d�Z	d&dd�Z
d'dd�Zd(dd�Zd)dd�Z
d*dd�Zd+dd�Zd,dd�Zd-dd �Zd!d"�ZdS).r9z?Derived class with handlers for errors we can handle (perhaps).cOs(tj|f|�|�i|_d|_d|_dS)Nrr�)r8r��
auth_cache�tries�maxtries)r�r�r7rLrLrMr�`szFancyURLopener.__init__cCst||d||�S)z3Default error handling -- don't raise an exception.zhttp:)r)r�rHrdr�r�rerLrLrMr�fsz!FancyURLopener.http_error_defaultNc	
Csn|jd7_zR|jrJ|j|jkrJt|d�r4|j}n|j}|||dd|�S|j||||||�}|Sd|_XdS)z%Error 302 -- relocated (temporarily).rR�http_error_500i�z)Internal Server Error: Redirect RecursionNr)r
rr�rr��redirect_internal)	r�rHrdr�r�rerIr�rgrLrLrMr
js
zFancyURLopener.http_error_302c	Csxd|kr|d}nd|kr$|d}ndS|j�t|jd||�}t|�}|jd	krnt|||d|||��|j|�S)
Nr�r�r�r�r�r�rnz( Redirection to url '%s' is not allowed.)r�r�r�rn)r�rr�rrrrG)	r�rHrdr�r�rerIr�rrLrLrMr
|s


z FancyURLopener.redirect_internalcCs|j||||||�S)z*Error 301 -- also relocated (permanently).)r
)r�rHrdr�r�rerIrLrLrMr�szFancyURLopener.http_error_301cCs|j||||||�S)z;Error 303 -- also relocated (essentially identical to 302).)r
)r�rHrdr�r�rerIrLrLrMr�szFancyURLopener.http_error_303cCs2|dkr|j||||||�S|j|||||�SdS)z1Error 307 -- relocated, but turn POST into error.N)r
r�)r�rHrdr�r�rerIrLrLrMr
�szFancyURLopener.http_error_307Fc
Cs�d|krtj||||||�|d}tjd|�}	|	sHtj||||||�|	j�\}
}|
j�dkrttj||||||�|s�tj||||||�d|jd}|dkr�t||�||�St||�|||�SdS)z_Error 401 -- authentication required.
        This function supports Basic authentication only.zwww-authenticatez![ 	]*([^ 	]+)[ 	]+realm="([^"]*)"rFZretry_�_basic_authN)r8r�rQ�matchrArtr�r�)
r�rHrdr�r�rerIry�stuffrrr&r[rLrLrMrU�s&





zFancyURLopener.http_error_401c
Cs�d|krtj||||||�|d}tjd|�}	|	sHtj||||||�|	j�\}
}|
j�dkrttj||||||�|s�tj||||||�d|jd}|dkr�t||�||�St||�|||�SdS)zeError 407 -- proxy authentication required.
        This function supports Basic authentication only.zproxy-authenticatez![ 	]*([^ 	]+)[ 	]+realm="([^"]*)"rFZretry_proxy_rN)r8r�rQrrArtr�r�)
r�rHrdr�r�rerIryrrrr&r[rLrLrMrV�s&





zFancyURLopener.http_error_407cCs�t|�\}}d||}|jd}t|�\}}	t|	�\}	}
|	jd�d}|	|d�}	|j|	||�\}}
|pl|
srdSdt|dd�t|
dd�|	f}	d|	|
|jd<|dkr�|j|�S|j||�SdS)Nzhttp://r��@rRz%s:%s@%srn)r)rrrr��get_user_passwdr	rG)r�rHr&rIrvr�r�rr�r��
proxyselectorr�rr rLrLrM�retry_proxy_http_basic_auth�s 

z*FancyURLopener.retry_proxy_http_basic_authcCs�t|�\}}d||}|jd}t|�\}}	t|	�\}	}
|	jd�d}|	|d�}	|j|	||�\}}
|pl|
srdSdt|dd�t|
dd�|	f}	d|	|
|jd<|dkr�|j|�S|j||�SdS)Nzhttps://r�rrRz%s:%s@%srn)r)rrrr�rr	rG)r�rHr&rIrvr�r�rr�r�rr�rr rLrLrM�retry_proxy_https_basic_auth�s 

z+FancyURLopener.retry_proxy_https_basic_authc
Cs�t|�\}}|jd�d}||d�}|j|||�\}}|p>|sDdSdt|dd�t|dd�|f}d||}	|dkr�|j|	�S|j|	|�SdS)NrrRz%s:%s@%srn)rzhttp://)rr�rr	rG)
r�rHr&rIrvr�r�rr r�rLrLrMrG�s
z$FancyURLopener.retry_http_basic_authc
Cs�t|�\}}|jd�d}||d�}|j|||�\}}|p>|sDdSdt|dd�t|dd�|f}d||}	|dkr�|j|	�S|j|	|�SdS)NrrRz%s:%s@%srn)rzhttps://)rr�rr	rG)
r�rHr&rIrvr�r�rr r�rLrLrM�retry_https_basic_auth	s
z%FancyURLopener.retry_https_basic_authrcCs`|d|j�}||jkr2|r(|j|=n
|j|S|j||�\}}|sJ|rX||f|j|<||fS)Nr)rtr	�prompt_user_passwd)r�rvr&r�r�rr rLrLrMr	s


zFancyURLopener.get_user_passwdcCsTddl}y,td||f�}|jd|||f�}||fStk
rNt�dSXdS)z#Override this in a GUI environment!rNzEnter username for %s at %s: z#Enter password for %s in %s at %s: )NN)�getpass�input�KeyboardInterrupt�print)r�rvr&rrr rLrLrMr$	sz!FancyURLopener.prompt_user_passwd)N)N)N)N)NF)NF)N)N)N)N)r)r�r�r�r�r�r�r
r
rrr
rUrVrrrGrrrrLrLrLrMr9]s$










cCstdkrtjd�atS)z8Return the IP address of the magic hostname 'localhost'.Nr�)�
_localhostr�r�rLrLrLrMr�4	s
r�cCsPtdkrLyttjtj��d�aWn(tjk
rJttjd�d�aYnXtS)z,Return the IP addresses of the current host.Nr:r�)�	_thishostr%r�r�r�r�rLrLrLrMr�<	sr�cCstdkrddl}|jatS)z1Return the set of errors raised by the FTP class.Nr)�
_ftperrorsr�r�)r�rLrLrMrG	srcCstdkrtjd�atS)z%Return an empty email Message object.Nrn)�
_noheadersr�r�rLrLrLrM�	noheadersP	s
r c@sJeZdZdZddd�Zdd�Zdd	�Zd
d�Zdd
�Zdd�Z	dd�Z
dS)r�z;Class used by open_ftp() for cache of open FTP connections.NTc	CsX||_||_||_||_||_||_d|_||_y|j�Wn|j	��YnXdS)Nr)
rr rvr/r�rJ�refcount�	keepalive�initr�)r�rr rvr/r�rJr�rLrLrMr�]	szftpwrapper.__init__cCs\ddl}d|_|j�|_|jj|j|j|j�|jj|j	|j
�dj|j�}|jj
|�dS)Nrr�)r��busyZFTPr�Zconnectrvr/rJZloginrr r�r��cwd)r�r�Z_targetrLrLrMr#m	s
zftpwrapper.initc-Cs�ddl}|j�|dkr"d}d}nd|}d}y|jj|�Wn*|jk
rh|j�|jj|�YnXd}|r�|r�yd|}|jj|�\}}WnR|jk
r�}z4t|�dd�d	kr�t	d
|�j
tj�d��WYdd}~XnX|�s�|jjd�|�rn|jj
�}	zJy|jj|�Wn4|jk
�rP}zt	d
|�|�WYdd}~XnXWd|jj|	�Xd|}nd
}|jj|�\}}d|_t|jd�|j�}
|jd7_|j�|
|fS)Nrrxr�zTYPE ArRzTYPE zRETR r>Z550z
ftp error: %rr:zLIST ZLISTr�)rxr�)r��endtransferr�Zvoidcmdr�r#ZntransfercmdZ
error_permr�rr�r�r��pwdr%r$r�makefile�
file_closer!r�)r�rNr�r��cmd�isdirr�r�r�r'ZftpobjrLrLrMr�v	sN
 
$
zftpwrapper.retrfilecCs
d|_dS)Nr)r$)r�rLrLrMr&�	szftpwrapper.endtransfercCsd|_|jdkr|j�dS)NFr)r"r!�
real_close)r�rLrLrMr��	s
zftpwrapper.closecCs4|j�|jd8_|jdkr0|jr0|j�dS)NrRr)r&r!r"r,)r�rLrLrMr)�	szftpwrapper.file_closecCs2|j�y|jj�Wnt�k
r,YnXdS)N)r&r�r�r)r�rLrLrMr,�	s
zftpwrapper.real_close)NT)r�r�r�r�r�r#r�r&r�r)r,rLrLrLrMr�Z	s
	-r�cCs�i}xBtjj�D]4\}}|j�}|r|dd�dkr|||dd�<qWdtjkr^|jdd�xXtjj�D]J\}}|dd�dkrj|j�}|r�|||dd	�<qj|j|dd
�d�qjW|S)aReturn a dictionary of scheme -> proxy server URL mappings.

    Scan the environment for variables named <scheme>_proxy;
    this seems to be the standard convention.  If you need a
    different way, you can pass a proxies dictionary to the
    [Fancy]URLopener constructor.

    �N�_proxyZREQUEST_METHODr�i����i����i����i����i����)rW�environr{rtr�)rr[r�rLrLrM�getproxies_environment�	s	
r0c
Cs�|dkrt�}y|d}Wntk
r.dSX|dkr<dSt|�\}}dd�|jd�D�}xP|D]H}|rb|jd	�}tj|�}d
|}tj||tj�s�tj||tj�rbdSqbWdS)z�Test if proxies should not be used for a particular host.

    Checks the proxy dict for the value of no_proxy, which should
    be a list of comma separated DNS suffixes, or '*' for all hosts.

    N�nor�*rRcSsg|]}|j��qSrL)rO)r�rrLrLrMr$�	sz,proxy_bypass_environment.<locals>.<listcomp>r��.z
(.+\.)?%s$)	r0rrr
rC�lstriprQr�rrS)rvrZno_proxy�hostonlyr/Z
no_proxy_listr[�patternrLrLrM�proxy_bypass_environment�	s&


r7c
Csddlm}t|�\}}dd�}d|kr4|dr4dSd}x�|jd	f�D]�}|sPqFtjd
|�}|dk	�r|dkr�ytj|�}||�}Wntk
r�wFYnX||jd��}	|jd�}
|
dkr�d
|jd�j	d�d}
nt
|
dd��}
d|
}
||
?|	|
?k�rdSqF|||�rFdSqFWdS)aj
    Return True iff this host shouldn't be accessed using a proxy

    This function uses the MacOSX framework SystemConfiguration
    to fetch the proxy information.

    proxy_settings come from _scproxy._get_proxy_settings or get mocked ie:
    { 'exclude_simple': bool,
      'exceptions': ['foo.bar', '*.bar.com', '127.0.0.1', '10.1', '10.0/16']
    }
    r)�fnmatchcSsh|jd�}ttt|��}t|�dkr<|ddddgdd�}|dd>|dd>B|dd>B|d	BS)
Nr3r�r�rRrcr:rQr>)rCr�r�r^r`)ZipAddrr.rLrLrM�ip2num
s

z,_proxy_bypass_macosx_sysconf.<locals>.ip2numr3Zexclude_simpleTN�
exceptionsz(\d+(?:\.\d+)*)(/\d+)?rRr:rQ� F)r8r
r�rQrr�r�rm�group�countr^)rv�proxy_settingsr8r5r/r:ZhostIPr�r�r2�maskrLrLrM�_proxy_bypass_macosx_sysconf�	s:



rA�darwin)�_get_proxy_settings�_get_proxiescCst�}t||�S)N)rCrA)rvr?rLrLrM�proxy_bypass_macosx_sysconf:
srEcCst�S)z�Return a dictionary of scheme -> proxy server URL mappings.

        This function uses the MacOSX framework SystemConfiguration
        to fetch the proxy information.
        )rDrLrLrLrM�getproxies_macosx_sysconf>
srFcCs t�}|rt||�St|�SdS)z�Return True, if host should be bypassed.

        Checks proxy settings gathered from the environment, if specified,
        or from the MacOSX framework SystemConfiguration.

        N)r0r7rE)rvrrLrLrMrH
s
rcCst�p
t�S)N)r0rFrLrLrLrMr5U
scCsi}yddl}Wntk
r$|SXy�|j|jd�}|j|d�d}|r�t|j|d�d�}d|kr�x�|jd�D]4}|jdd�\}}tjd	|�s�d
||f}|||<qrWn>|dd�dkr�||d
<n$d||d
<d||d<d||d<|j	�Wnt
ttfk
�rYnX|S)zxReturn a dictionary of scheme -> proxy server URL mappings.

        Win32 uses the registry to store proxies.

        rNz;Software\Microsoft\Windows\CurrentVersion\Internet Settings�ProxyEnableZProxyServerr�rrRz^([^/:]+)://z%s://%sr[zhttp:r�z	http://%sz
https://%sr�zftp://%sr�)
�winreg�ImportError�OpenKey�HKEY_CURRENT_USER�QueryValueExr�rCrQrZClosermrBr�)rrH�internetSettings�proxyEnableZproxyServer�pr�ZaddressrLrLrM�getproxies_registryZ
s8

rPcCst�p
t�S)z�Return a dictionary of scheme -> proxy server URL mappings.

        Returns settings gathered from the environment, if specified,
        or the registry.

        )r0rPrLrLrLrMr5�
sc&Cs~yddl}Wntk
r dSXy6|j|jd�}|j|d�d}t|j|d�d�}Wntk
rldSX|sz|r~dSt|�\}}|g}y tj	|�}||kr�|j
|�Wntk
r�YnXy tj|�}||kr�|j
|�Wntk
�r�YnX|jd�}xp|D]h}	|	dk�r*d|k�r*dS|	j
dd	�}	|	j
d
d�}	|	j
dd�}	x$|D]}
tj|	|
tj��rTdS�qTW�qWdS)
Nrz;Software\Microsoft\Windows\CurrentVersion\Internet SettingsrGZ
ProxyOverriderz<local>r3rRz\.r2z.*�?)rHrIrJrKrLr�rmr
r�r�r]ZgetfqdnrCr�rQrrS)rvrHrMrNZ
proxyOverrideZrawHostr/ZaddrZfqdnr3r�rLrLrM�proxy_bypass_registry�
sR







rRcCs t�}|rt||�St|�SdS)z�Return True, if host should be bypassed.

        Checks proxy settings gathered from the environment, if specified,
        or the registry.

        N)r0r7rR)rvrrLrLrMr�
s
)NNN)N)r�rr�r�rfZhttp.clientr�r�rWr0rQr�rr�rd�collectionsrZrTr?Zurllib.errorrrrZurllib.parserrrrr	r
rrr
rrrrrrrrrZurllib.responserrrDrIrC�__all__�version_infor�rFr�r0r1r\r6r7rR�ASCIIrrrwrrr2rr/rrrrr r!r"r#r$r%�urandomrer&r'r(rzr)r�r�rEr]rr.r]r_r*r�r+r,r-rr[Z
nturl2pathr4r3r�r8r9rr�rr�rrrr r�r0r7rA�platformZ_scproxyrCrDrErFrr5rPrRrLrLrLrM�<module>Ds�P
T
?n$q*@
ov

+3:5!AW

_
#<

-	2
parse.cpython-36.opt-2.pyc000064400000062001151733320400011241 0ustar003

���ie��@s�ddlZddlZddlZddlZddlZdddddddd	d
ddd
dddddddddgZdddddddddd d!d"d#d$d%d&d'd(d)gZdddddd*dddd!dd d+d"d#d$d,d&d'd%d-d.d/d(d)gZddd0d"dddd d#d$d1d2d!d%d3gZdd0d4d5d*ddd+d1d2g
Z	dddddd d!dd#d$d1d2gZ
ddd0ddd5dddd d+dd"g
Zd6Zd7Z
d8d9d:gZd;ZiZd<d=�Zd>Zd?Zd@dA�ZeefdBdC�ZeefdDdE�ZdFdG�ZGdHdI�dIe�ZGdJdK�dKe�ZGdLdM�dMe�ZGdNdO�dOee�ZGdPdQ�dQee�ZddRlmZeddS�ZeddT�Z eddU�Z!dVe_"dWej#_"dXej$_"dYe _"dZe j%_"d[e j&_"d\e j'_"d]e j(_"d^e j$_"d_e!_"e j%j"e!j%_"e j&j"e!j&_"e j'j"e!j'_"d`e!j)_"e j(j"e!j(_"e j$j"e!j$_"eZ*Gdad�dee�Z+Gdbd�de e�Z,Gdcd�de!e�Z-Gddd�dee�Z.Gded�de e�Z/Gdfd�de!e�Z0dgdh�Z1e1�[1d�djd�Z2dkdl�Z3d�dmdn�Z4dodp�Z5dqdr�Z6dsdt�Z7dudv�Z8d�dwd�Z9dxd�Z:dyd�Z;d�dzd�Z<d{d�Z=d|Z>da?d}d�Z@ejAd~�ZBd�d�d�ZCd�d�d	�ZDGd�d��d�eE�ZFd�ZGdaHd�d�d
�ZId�d�d�ZJeKd��ZLeMeL�ZNiZOGd�d��d�ejP�ZQd�d�d�ZRd�d�d�ZSd�d�d
�ZTd�dddeSfd�d�ZUd�d��ZVd�d��ZWdaXd�d��ZYdaZd�d��Z[d�d��Z\d�d��Z]da^d�d��Z_d�d�d��Z`d�d��Zad�d��Zbd�d��Zcd�d��ZddS)��N�urlparse�
urlunparse�urljoin�	urldefrag�urlsplit�
urlunsplit�	urlencode�parse_qs�	parse_qsl�quote�
quote_plus�quote_from_bytes�unquote�unquote_plus�unquote_to_bytes�DefragResult�ParseResult�SplitResult�DefragResultBytes�ParseResultBytes�SplitResultBytes�Zftp�httpZgopherZnntpZimapZwais�fileZhttpsZshttpZmmsZprosperoZrtspZrtspuZsftpZsvnzsvn+sshZwsZwssZtelnetZsnewsZrsyncZnfsZgitzgit+sshZhdlZsipZsipsZtelZmailtoZnewszAabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+-.z!	

 �	�
�
�cCstj�tj�dS)N)�_parse_cache�clear�
_safe_quoters�r!r!�$/usr/lib64/python3.6/urllib/parse.py�clear_cache`sr#�ascii�strictcCs|S)Nr!)�objr!r!r"�_nooposr'cCs|j||�S)N)�encode)r&�encoding�errorsr!r!r"�_encode_resultrsr+cst��fdd�|D��S)Nc3s"|]}|r|j���ndVqdS)rN)�decode)�.0�x)r)r*r!r"�	<genexpr>xsz_decode_args.<locals>.<genexpr>)�tuple)�argsr)r*r!)r)r*r"�_decode_argsvsr2cGsZt|dt�}x.|dd�D]}|rt|t�|krtd��qW|rL|tfSt|�tfS)Nr�z$Cannot mix str and non-str arguments)�
isinstance�str�	TypeErrorr'r2r+)r1Z	str_input�argr!r!r"�_coerce_argszs
r8c@seZdZfZddd�ZdS)�_ResultMixinStrr$r%cs|j��fdd�|D��S)Nc3s|]}|j���VqdS)N)r()r-r.)r)r*r!r"r/�sz)_ResultMixinStr.encode.<locals>.<genexpr>)�_encoded_counterpart)�selfr)r*r!)r)r*r"r(�sz_ResultMixinStr.encodeN)r$r%)�__name__�
__module__�__qualname__�	__slots__r(r!r!r!r"r9�sr9c@seZdZfZddd�ZdS)�_ResultMixinBytesr$r%cs|j��fdd�|D��S)Nc3s|]}|j���VqdS)N)r,)r-r.)r)r*r!r"r/�sz+_ResultMixinBytes.decode.<locals>.<genexpr>)�_decoded_counterpart)r;r)r*r!)r)r*r"r,�sz_ResultMixinBytes.decodeN)r$r%)r<r=r>r?r,r!r!r!r"r@�sr@c@s@eZdZfZedd��Zedd��Zedd��Zedd��Zd	S)
�_NetlocResultMixinBasecCs
|jdS)Nr)�	_userinfo)r;r!r!r"�username�sz_NetlocResultMixinBase.usernamecCs
|jdS)Nr3)rC)r;r!r!r"�password�sz_NetlocResultMixinBase.passwordcCsD|jd}|sdSt|t�r dnd}|j|�\}}}|j�||S)Nr�%�%)�	_hostinfor4r5�	partition�lower)r;�hostname�	separatorZpercentZzoner!r!r"rK�s
z_NetlocResultMixinBase.hostnamecCs@|jd}|dk	r<t|d�}d|ko.dkns<td��|S)Nr3�
ri��zPort out of range 0-65535)rH�int�
ValueError)r;�portr!r!r"rP�s

z_NetlocResultMixinBase.portN)	r<r=r>r?�propertyrDrErKrPr!r!r!r"rB�s
rBc@s(eZdZfZedd��Zedd��ZdS)�_NetlocResultMixinStrcCsD|j}|jd�\}}}|r4|jd�\}}}|s<d}nd}}||fS)N�@�:)�netloc�
rpartitionrI)r;rU�userinfo�	have_info�hostinforD�
have_passwordrEr!r!r"rC�sz_NetlocResultMixinStr._userinfocCsl|j}|jd�\}}}|jd�\}}}|rL|jd�\}}}|jd�\}}}n|jd�\}}}|sdd}||fS)NrS�[�]rT)rUrVrI)r;rU�_rY�have_open_br�	bracketedrKrPr!r!r"rH�sz_NetlocResultMixinStr._hostinfoN)r<r=r>r?rQrCrHr!r!r!r"rR�srRc@s(eZdZfZedd��Zedd��ZdS)�_NetlocResultMixinBytescCsD|j}|jd�\}}}|r4|jd�\}}}|s<d}nd}}||fS)N�@�:)rUrVrI)r;rUrWrXrYrDrZrEr!r!r"rC�sz!_NetlocResultMixinBytes._userinfocCsl|j}|jd�\}}}|jd�\}}}|rL|jd�\}}}|jd�\}}}n|jd�\}}}|sdd}||fS)Nra�[�]rb)rUrVrI)r;rUr]rYr^r_rKrPr!r!r"rH�sz!_NetlocResultMixinBytes._hostinfoN)r<r=r>r?rQrCrHr!r!r!r"r`�sr`)�
namedtuplezurl fragmentz!scheme netloc path query fragmentz(scheme netloc path params query fragmentz�
DefragResult(url, fragment)

A 2-tuple that contains the url without fragment identifier and the fragment
identifier as a separate argument.
z$The URL with no fragment identifier.z�
Fragment identifier separated from URL, that allows indirect identification of a
secondary resource by reference to a primary resource and additional identifying
information.
z�
SplitResult(scheme, netloc, path, query, fragment)

A 5-tuple that contains the different components of a URL. Similar to
ParseResult, but does not split params.
z%Specifies URL scheme for the request.z0
Network location where the request is made to.
z@
The hierarchical path, such as the path to a file to download.
z�
The query component, that contains non-hierarchical data, that along with data
in path component, identifies a resource in the scope of URI's scheme and
network location.
z�
Fragment identifier, that allows indirect identification of a secondary resource
by reference to a primary resource and additional identifying information.
zr
ParseResult(scheme, netloc, path, params,  query, fragment)

A 6-tuple that contains components of a parsed URL.
z�
Parameters for last path element used to dereference the URI in order to provide
access to perform some operation on the resource.
c@seZdZfZdd�ZdS)rcCs |jr|jd|jS|jSdS)N�#)�fragment�url)r;r!r!r"�geturlEszDefragResult.geturlN)r<r=r>r?rir!r!r!r"rCsc@seZdZfZdd�ZdS)rcCst|�S)N)r)r;r!r!r"riMszSplitResult.geturlN)r<r=r>r?rir!r!r!r"rKsc@seZdZfZdd�ZdS)rcCst|�S)N)r)r;r!r!r"riRszParseResult.geturlN)r<r=r>r?rir!r!r!r"rPsc@seZdZfZdd�ZdS)rcCs |jr|jd|jS|jSdS)N�#)rgrh)r;r!r!r"riXszDefragResultBytes.geturlN)r<r=r>r?rir!r!r!r"rVsc@seZdZfZdd�ZdS)rcCst|�S)N)r)r;r!r!r"ri`szSplitResultBytes.geturlN)r<r=r>r?rir!r!r!r"r^sc@seZdZfZdd�ZdS)rcCst|�S)N)r)r;r!r!r"rieszParseResultBytes.geturlN)r<r=r>r?rir!r!r!r"rcscCs8ttfttfttff}x|D]\}}||_||_qWdS)N)rrrrrrr:rA)Z
_result_pairsZ_decodedZ_encodedr!r!r"�_fix_result_transcodingis
rkTc
Csft||�\}}}t|||�}|\}}}}}|tkrHd|krHt|�\}}nd}t||||||�}	||	�S)N�;r)r8r�uses_params�_splitparamsr)
rh�scheme�allow_fragments�_coerce_resultZsplitresultrU�queryrg�params�resultr!r!r"rvscCsRd|kr,|jd|jd��}|dkr6|dfSn
|jd�}|d|�||dd�fS)N�/rlrrr3)�find�rfind)rh�ir!r!r"rn�s

rncCsLt|�}x*dD]"}|j||�}|dkrt||�}qW|||�||d�fS)Nz/?#r)�lenrv�min)rh�start�delim�cZwdelimr!r!r"�_splitnetloc�s
r~cCs�|stdd�|D��rdSddl}|jdd�}|jdd�}|jdd�}|jdd�}|jd	|�}||krndSx(d
D] }||krttd|dd
��qtWdS)Ncss|]}t|�dkVqdS)�N)�ord)r-r}r!r!r"r/�sz_checknetloc.<locals>.<genexpr>rrSrrTrf�?�NFKCz/?#@:znetloc 'z' contains invalid z#characters under NFKC normalization)�any�unicodedata�replace�	normalizerO)rUr��nZnetloc2r}r!r!r"�_checknetloc�s
r�cCsxtD]}|j|d�}qW|S)Nr)�_UNSAFE_URL_BYTES_TO_REMOVEr�)rh�br!r!r"�_remove_unsafe_bytes_from_url�s
r�cCst|jd�d}|jd�\}}}|rX|r.td��|jd�\}}}|rh|jd�rhtd��n|jd�\}}}t|�dS)NrS�r[zInvalid IPv6 URLr\rT)rVrIrO�
startswith�_check_bracketed_host)rUZhostname_and_portZbefore_bracketr^r_rKr]rPr!r!r"�_check_bracketed_netloc�s
r�cCsB|jd�r tjd|�s>td��ntj|�}t|tj�r>td��dS)N�vz\Av[a-fA-F0-9]+\..+\ZzIPvFuture address is invalidz%An IPv4 address cannot be in brackets)r��re�matchrO�	ipaddressZ
ip_addressr4ZIPv4Address)rKZipr!r!r"r��s


r�c
Cs�t||�\}}}t|�}t|�}|jt�}|jt�}t|�}|||t|�t|�f}tj|d�}|rj||�St	t�t
kr|t�d}}}|jd�}	|	dk�r�|d|	�dk�r~|d|	�j
�}||	dd�}|dd�dk�rt|d�\}}d|ko�d	|k�sd	|k�rd|k�rtd
��|�r<d|k�r<|jdd�\}}d|k�rV|jdd�\}}t|�t|||||�}
|
t|<||
�Sxd|d|	�D]}|tk�r�P�q�W||	dd�}|�s�td
d�|D���r�|d|	�j
�|}}|dd�dk�rPt|d�\}}d|k�rd	|k�s,d	|k�r4d|k�r4td
��d|k�rPd	|k�rPt|�|�rpd|k�rp|jdd�\}}d|k�r�|jdd�\}}t|�t|||||�}
|
t|<||
�S)NrrTrrr3r�z//r[r\zInvalid IPv6 URLrfr�css|]}|dkVqdS)�
0123456789Nr!)r-r}r!r!r"r/�szurlsplit.<locals>.<genexpr>)r8r��lstrip�_WHATWG_C0_CONTROL_OR_SPACE�strip�bool�typer�getry�MAX_CACHE_SIZEr#rvrJr~rO�splitr�r�scheme_charsr�r�)
rhrorprq�key�cachedrUrrrgrxr�r}�restr!r!r"r�sh






cCs<t|�\}}}}}}}|r&d||f}|t|||||f��S)Nz%s;%s)r8r)�
componentsrorUrhrsrrrgrqr!r!r"rscCs�t|�\}}}}}}|s4|r`|tkr`|dd�dkr`|rP|dd�dkrPd|}d|pXd|}|rp|d|}|r�|d|}|r�|d|}||�S)	Nr�z//r3rurrTr�rf)r8�uses_netloc)r�rorUrhrrrgrqr!r!r"rs cCs�|s|S|s|St||�\}}}t|d|�\}}}}}}	t|||�\}
}}}
}}|
|ks`|
tkrh||�S|
tkr�|r�|t|
|||
||f��S|}|r�|
r�|}|}
|s�|}|t|
|||
||f��S|jd�}|ddkr�|d=|dd�dk�r�|jd�}n(||jd�}td|dd��|dd	�<g}xX|D]P}|dk�rdy|j�Wntk
�r`YnXn|dk�rt�q0n
|j	|��q0W|d
dk�r�|j	d�|t|
|dj
|��p�d|
||f��S)Nrrur3�..�.���r�r�r�r�)r�r�)r8r�
uses_relativer�rr��filter�pop�
IndexError�append�join)�baserhrprqZbschemeZbnetlocZbpathZbparamsZbqueryZ	bfragmentrorU�pathrsrrrgZ
base_partsZsegmentsZ
resolved_pathZsegr!r!r"r*sT






c	CsTt|�\}}d|kr>t|�\}}}}}}t|||||df�}nd}|}|t||��S)Nrfr)r8rrr)	rhrq�sr��p�a�qZfragZdefragr!r!r"rosZ0123456789ABCDEFabcdefcCs�|s|jdSt|t�r"|jd�}|jd�}t|�dkr<|S|dg}|j}tdkrbdd�tD�axb|dd�D]R}y(|t|dd��||dd��Wqptk
r�|d�||�YqpXqpWdj	|�S)	N�zutf-8rGr3rcSs4i|],}tD]"}tt||d�g�||j��qqS)�)�_hexdig�bytesrNr()r-r�r�r!r!r"�
<dictcomp>�sz$unquote_to_bytes.<locals>.<dictcomp>r�)
r�r4r5r(ryr��
_hextobyter��KeyErrorr�)�string�bits�resr��itemr!r!r"r�s*



z([-]+)�utf-8r�cCs�d|kr|j|S|dkrd}|dkr*d}tj|�}|dg}|j}x@tdt|�d�D],}|t||�j||��|||d�qVWdj|�S)NrFzutf-8r�rr3r�r)r��_asciirer��rangeryrr,r�)r�r)r*r�r�r�rxr!r!r"r�s


Fc	CsRi}t|||||||d�}x2|D]*\}	}
|	|kr@||	j|
�q |
g||	<q W|S)N)r)r*�max_num_fieldsrL)r
r�)�qs�keep_blank_values�strict_parsingr)r*r�rLZ
parsed_result�pairs�name�valuer!r!r"r	�sc@seZdZdS)�_QueryStringSeparatorWarningN)r<r=r>r!r!r!r"r��sr�z/etc/python/urllib.cfgcCs�t|�\}}t|t�r |jd�}|s6t|ttf�rF|dk	rFtd��t�}|dk�rVt}d}	|dkrvtj	j
|	�}d}
|dkr�ytt�}Wnt
k
r�YnJX|�:ddl}|jdd&d�}
|
j|�|
j
d|	dd	�}|aWdQRXt}
|dk�rd
|k�rddlm}|d,tdd�d}n:|dk�r,|}n*t|�dk�rVt|	�d|
�d�dd��|dk	�r�||k�r�d|jd�|jd
�}nd|j|�}||k�r�td��||k�r�dd�|jd�D�}ndd�|j|�D�}g}x�|D]�}|�r�|�r��q�|jd d�}t|�dk�r>|�r(td!|f��|�r�|jd"�n�q�t|d��sR|�r�|djd#d$�}t|||d%�}||�}|djd#d$�}t|||d%�}||�}|j||f��q�W|S)-Nr$z*Separator must be of type string or bytes.ZPYTHON_URLLIB_QS_SEPARATORzenvironment variablerrf)Z
interpolationZcomment_prefixesr	)Zfallbackrl)�warnz4The default separator of urllib.parse.parse_qsl and z1parse_qs was changed to '&' to avoid a web cache z"poisoning issue (CVE-2021-23336). z4By default, semicolons no longer act as query field zseparators. z3See https://access.redhat.com/articles/5860431 for z
more details.r�)�
stacklevel�&Zlegacyr3z (from z) must contain z1 character, or "legacy". See z<https://access.redhat.com/articles/5860431 for more details.zMax number of fields exceededcSs g|]}|jd�D]}|�qqS)rl)r�)r-�s1�s2r!r!r"�
<listcomp>Lszparse_qsl.<locals>.<listcomp>cSsg|]}|�qSr!r!)r-r�r!r!r"r�Ns�=zbad query field: %rr�+� )r)r*)rfzeThe default separator of urllib.parse.parse_qsl and parse_qs was changed to '&' to avoid a web cache z�The default separator of urllib.parse.parse_qsl and parse_qs was changed to '&' to avoid a web cache poisoning issue (CVE-2021-23336). z�The default separator of urllib.parse.parse_qsl and parse_qs was changed to '&' to avoid a web cache poisoning issue (CVE-2021-23336). By default, semicolons no longer act as query field z�The default separator of urllib.parse.parse_qsl and parse_qs was changed to '&' to avoid a web cache poisoning issue (CVE-2021-23336). By default, semicolons no longer act as query field separators. z�The default separator of urllib.parse.parse_qsl and parse_qs was changed to '&' to avoid a web cache poisoning issue (CVE-2021-23336). By default, semicolons no longer act as query field separators. See https://access.redhat.com/articles/5860431 for aThe default separator of urllib.parse.parse_qsl and parse_qs was changed to '&' to avoid a web cache poisoning issue (CVE-2021-23336). By default, semicolons no longer act as query field separators. See https://access.redhat.com/articles/5860431 for more details.)r8r4r�r,r5rO�object�_default_qs_separator�os�environr��open�_QS_SEPARATOR_CONFIG_FILENAME�FileNotFoundError�configparserZConfigParserZ	read_file�warningsr�r�ry�countr�r�r�r)r�r�r�r)r*r�rLrqZ_legacyZenvvar_nameZ
config_sourcerr��configr��
num_fieldsr��rZ
name_valueZnvr�r�r!r!r"r
�s�












cCs|jdd�}t|||�S)Nr�r�)r�r)r�r)r*r!r!r"rfssAABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_.-c@s$eZdZdd�Zdd�Zdd�ZdS)�QuotercCstj|�|_dS)N)�_ALWAYS_SAFE�union�safe)r;r�r!r!r"�__init__~szQuoter.__init__cCsd|jjt|�fS)Nz<%s %r>)�	__class__r<�dict)r;r!r!r"�__repr__�szQuoter.__repr__cCs(||jkrt|�ndj|�}|||<|S)Nz%{:02X})r��chr�format)r;r�r�r!r!r"�__missing__�szQuoter.__missing__N)r<r=r>r�r�r�r!r!r!r"r�vsr�rucCsbt|t�r8|s|S|dkrd}|dkr*d}|j||�}n |dk	rHtd��|dk	rXtd��t||�S)Nzutf-8r%z,quote() doesn't support 'encoding' for bytesz*quote() doesn't support 'errors' for bytes)r4r5r(r6r
)r�r�r)r*r!r!r"r�s
cCsdt|t�rd|ks$t|t�r2d|kr2t||||�St|t�rBd}nd}t|||||�}|jdd�S)Nr�� r�)r4r5r�rr�)r�r�r)r*Zspacer!r!r"r�s
cs�t|ttf�std��|sdSt|t�r6|jdd�}ntdd�|D��}|jt|�s^|j�Syt	|�Wn&t
k
r�t|�jt	|<�YnXdj
�fdd�|D��S)Nz!quote_from_bytes() expected bytesrr$�ignorecSsg|]}|dkr|�qS)�r!)r-r}r!r!r"r��sz$quote_from_bytes.<locals>.<listcomp>csg|]}�|��qSr!r!)r-�char)�quoterr!r"r��s)r4r��	bytearrayr6r5r(�rstrip�_ALWAYS_SAFE_BYTESr,r r�r��__getitem__r�)Zbsr�r!)r�r"r
�s
cCst|d�r|j�}nRy t|�r2t|dt�r2t�Wn0tk
rdtj�\}}}td�j|��YnXg}	|s�xr|D]j\}
}t|
t	�r�||
|�}
n|t
|
�|||�}
t|t	�r�|||�}n|t
|�|||�}|	j|
d|�qtW�n,�x(|D�]\}
}t|
t	��r||
|�}
n|t
|
�|||�}
t|t	��rL|||�}|	j|
d|�q�t|t
��rz|||||�}|	j|
d|�q�yt|�}Wn:tk
�r�|t
|�|||�}|	j|
d|�Yq�XxJ|D]B}
t|
t	��r�||
|�}
n|t
|
�|||�}
|	j|
d|
��q�Wq�Wdj|	�S)N�itemsrz1not a valid non-string sequence or mapping objectr�r�)
�hasattrr�ryr4r0r6�sys�exc_info�with_tracebackr�r5r�r�)rrZdoseqr�r)r*Z	quote_viaZtyZva�tb�l�kr�r.Zeltr!r!r"r�sP





cCsJt|t�rFy|jd�j�}Wn(tk
rDtdt|�d��YnX|S)N�ASCIIzURL z contains non-ASCII characters)r4r5r(r,�UnicodeError�repr)rhr!r!r"�to_bytes/s
r�cCs`t|�j�}|dd�dkr<|dd�dkr<|dd�j�}|dd�dkr\|dd�j�}|S)Nr3�<�>�zURL:r�r�)r5r�)rhr!r!r"�unwrap<s rcCsDtdkrtjdtj�atj|�}|r<|j�\}}|j�|fSd|fS)Nz
([^/:]+):(.*))�	_typeprogr��compile�DOTALLr��groupsrJ)rhr�ro�datar!r!r"�	splittypeEs
rcCsXtdkrtjdtj�atj|�}|rP|j�\}}|rH|ddkrHd|}||fSd|fS)Nz//([^/#?]*)(.*)rru)�	_hostprogr�rrr�r)rhr�Z	host_portr�r!r!r"�	splithostRs
r	cCs |jd�\}}}|r|nd|fS)NrS)rV)�host�userr|r!r!r"�	splituser`srcCs |jd�\}}}||r|ndfS)NrT)rI)rr|Zpasswdr!r!r"�splitpasswdesr
cCsDtdkrtjdtj�atj|�}|r<|j�\}}|r<||fS|dfS)Nz(.*):([0-9]*)$)�	_portprogr�rrr�r)r
r�rPr!r!r"�	splitportls
rr3cCsT|jd�\}}}|s|}n2|rLyt|�}Wntk
rBd}YnX||fS||fS)NrT)rVrNrO)r
Zdefportr|rPZnportr!r!r"�
splitnportys
rcCs$|jd�\}}}|r||fS|dfS)Nr�)rV)rhr�r|rrr!r!r"�
splitquery�srcCs$|jd�\}}}|r||fS|dfS)Nrf)rV)rhr�r|�tagr!r!r"�splittag�srcCs|jd�}|d|dd�fS)Nrlrr3)r�)rhZwordsr!r!r"�	splitattr�s
rcCs |jd�\}}}||r|ndfS)Nr�)rI)�attrr|r�r!r!r"�
splitvalue�sr)rT)r)rT)T)r�r�)FFr�r�NN)FFr�r�NN)r�r�)ruNN)rNN)rur�)r�)er�r�r��collectionsr��__all__r�r�rmZnon_hierarchicalZ
uses_queryZ
uses_fragmentr�r�r�r�rr#Z_implicit_encodingZ_implicit_errorsr'r+r2r8r�r9r@rBrRr`reZ_DefragResultBaseZ_SplitResultBaseZ_ParseResultBase�__doc__rhrgrorUr�rrrsZ
ResultBaserrrrrrrkrrnr~r�r�r�r�rrrrrr�r�rrr�rr	�RuntimeWarningr�r�r�r
r�	frozensetr�r�r�r �defaultdictr�rrr
rr�rrrrr	rr
rrrrrrrr!r!r!r"�<module>"s





!


	
	
B
E


&
y
	
,

O

error.cpython-36.opt-2.pyc000064400000004041151733320400011260 0ustar003


 \Q
�@sLddlZdddgZGdd�de�ZGdd�deejj�ZGdd�de�ZdS)�N�URLError�	HTTPError�ContentTooShortErrorc@seZdZddd�Zdd�ZdS)rNcCs |f|_||_|dk	r||_dS)N)�args�reason�filename)�selfrr�r	�$/usr/lib64/python3.6/urllib/error.py�__init__szURLError.__init__cCs
d|jS)Nz<urlopen error %s>)r)rr	r	r
�__str__szURLError.__str__)N)�__name__�
__module__�__qualname__rrr	r	r	r
rs
c@sTeZdZejjjZdd�Zdd�Zdd�Z	e
dd��Ze
d	d
��Zej
dd
��ZdS)
rcCs:||_||_||_||_||_|dk	r6|j||||�dS)N)�code�msg�hdrs�fpr�_HTTPError__super_init)rZurlrrrrr	r	r
r'szHTTPError.__init__cCsd|j|jfS)NzHTTP Error %s: %s)rr)rr	r	r
r4szHTTPError.__str__cCsd|j|jfS)Nz<HTTPError %s: %r>)rr)rr	r	r
�__repr__7szHTTPError.__repr__cCs|jS)N)r)rr	r	r
r<szHTTPError.reasoncCs|jS)N)r)rr	r	r
�headers@szHTTPError.headerscCs
||_dS)N)r)rrr	r	r
rDsN)r
rr�urllib�response�
addinfourlrrrr�propertyrr�setterr	r	r	r
r#s

c@seZdZdd�ZdS)rcCstj||�||_dS)N)rr�content)r�messagerr	r	r
rKszContentTooShortError.__init__N)r
rrrr	r	r	r
rIs)	Zurllib.responser�__all__�OSErrorrrrrrr	r	r	r
�<module>s
&robotparser.cpython-36.opt-1.pyc000064400000015615151733320400012501 0ustar003


 \�"�@s\dZddlZddlZddlZdgZejdd�ZGdd�d�ZGdd�d�Z	Gd	d
�d
�Z
dS)a% robotparser.py

    Copyright (C) 2000  Bastian Kleineidam

    You can choose between two licenses when using this package:
    1) GNU GPLv2
    2) PSF license for Python 2.2

    The robots.txt Exclusion Protocol is implemented as specified in
    http://www.robotstxt.org/norobots-rfc.txt
�N�RobotFileParser�RequestRatezrequests secondsc@sjeZdZdZddd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zdd�Zdd�Z
dd�ZdS)rzs This class provides a set of methods to read, parse and answer
    questions about a single robots.txt file.

    �cCs,g|_d|_d|_d|_|j|�d|_dS)NFr)�entries�
default_entry�disallow_all�	allow_all�set_url�last_checked)�self�url�r
�*/usr/lib64/python3.6/urllib/robotparser.py�__init__s
zRobotFileParser.__init__cCs|jS)z�Returns the time the robots.txt file was last fetched.

        This is useful for long-running web spiders that need to
        check for new robots.txt files periodically.

        )r
)rr
r
r�mtime$szRobotFileParser.mtimecCsddl}|j�|_dS)zYSets the time the robots.txt file was last fetched to the
        current time.

        rN)�timer
)rrr
r
r�modified-szRobotFileParser.modifiedcCs&||_tjj|�dd�\|_|_dS)z,Sets the URL referring to a robots.txt file.��N)r�urllib�parse�urlparse�host�path)rrr
r
rr	5szRobotFileParser.set_urlcCs�ytjj|j�}WnRtjjk
rd}z2|jdkr:d|_n|jdkrT|jdkrTd|_WYdd}~XnX|j	�}|j
|jd�j��dS)	z4Reads the robots.txt URL and feeds it to the parser.��Ti�i�Nzutf-8)rr)
rZrequestZurlopenr�errorZ	HTTPError�coderr�readr�decode�
splitlines)r�f�err�rawr
r
rr:s
zRobotFileParser.readcCs,d|jkr|jdkr(||_n|jj|�dS)N�*)�
useragentsrr�append)r�entryr
r
r�
_add_entryGs

zRobotFileParser._add_entrycCs6d}t�}|j��x|D�]�}|sT|dkr8t�}d}n|dkrT|j|�t�}d}|jd�}|dkrr|d|�}|j�}|s�q|jdd�}t|�dkr|dj�j�|d<tj	j
|dj��|d<|ddk�r|dkr�|j|�t�}|jj|d�d}q|ddk�r4|dk�r|j
jt|dd	��d}q|dd
k�rh|dk�r|j
jt|dd��d}q|ddk�r�|dk�r|dj�j��r�t|d�|_d}q|dd
kr|dkr|djd�}t|�dk�r|dj�j��r|dj�j��rtt|d�t|d��|_d}qW|dk�r2|j|�dS)z�Parse the input lines from a robots.txt file.

        We allow that a user-agent: line is not preceded by
        one or more blank lines.
        rr��#N�:z
user-agentZdisallowFZallowTzcrawl-delayzrequest-rate�/)�Entryrr(�find�strip�split�len�lowerrr�unquoter%r&�	rulelines�RuleLine�isdigit�int�delayr�req_rate)r�lines�stater'�line�iZnumbersr
r
rrPsd






 
zRobotFileParser.parsecCs�|jr
dS|jrdS|jsdStjjtjj|��}tjjdd|j|j	|j
|jf�}tjj|�}|sfd}x"|j
D]}|j|�rn|j|�SqnW|jr�|jj|�SdS)z=using the parsed robots.txt decide if useragent can fetch urlFTrr,)rrr
rrrr3�
urlunparserZparamsZqueryZfragment�quoter�
applies_to�	allowancer)r�	useragentrZ
parsed_urlr'r
r
r�	can_fetch�s$
zRobotFileParser.can_fetchcCs4|j�sdSx|jD]}|j|�r|jSqW|jjS)N)rrr@r8r)rrBr'r
r
r�crawl_delay�s

zRobotFileParser.crawl_delaycCs4|j�sdSx|jD]}|j|�r|jSqW|jjS)N)rrr@r9r)rrBr'r
r
r�request_rate�s

zRobotFileParser.request_ratecCs0|j}|jdk	r||jg}djtt|��dS)N�
)rr�join�map�str)rrr
r
r�__str__�s
zRobotFileParser.__str__N)r)�__name__�
__module__�__qualname__�__doc__rrrr	rr(rrCrDrErJr
r
r
rrs
	
	Cc@s(eZdZdZdd�Zdd�Zdd�ZdS)	r5zoA rule line is a single "Allow:" (allowance==True) or "Disallow:"
       (allowance==False) followed by a path.cCs>|dkr|rd}tjjtjj|��}tjj|�|_||_dS)NrT)rrr>rr?rrA)rrrAr
r
rr�s
zRuleLine.__init__cCs|jdkp|j|j�S)Nr$)r�
startswith)r�filenamer
r
rr@�szRuleLine.applies_tocCs|jr
dndd|jS)NZAllowZDisallowz: )rAr)rr
r
rrJ�szRuleLine.__str__N)rKrLrMrNrr@rJr
r
r
rr5�sr5c@s0eZdZdZdd�Zdd�Zdd�Zdd	�Zd
S)r-z?An entry has one or more user-agents and zero or more rulelinescCsg|_g|_d|_d|_dS)N)r%r4r8r9)rr
r
rr�szEntry.__init__cCs�g}x|jD]}|jd|���qW|jdk	r@|jd|j���|jdk	rj|j}|jd|j�d|j���|jtt|j	��|jd�dj
|�S)NzUser-agent: z
Crawl-delay: zRequest-rate: r,rrF)r%r&r8r9ZrequestsZseconds�extendrHrIr4rG)rZret�agentZrater
r
rrJ�s


z
Entry.__str__cCsF|jd�dj�}x.|jD]$}|dkr*dS|j�}||krdSqWdS)z2check if this entry applies to the specified agentr,rr$TF)r0r2r%)rrBrRr
r
rr@�szEntry.applies_tocCs$x|jD]}|j|�r|jSqWdS)zZPreconditions:
        - our agent applies to this entry
        - filename is URL decodedT)r4r@rA)rrPr<r
r
rrA�s

zEntry.allowanceN)rKrLrMrNrrJr@rAr
r
r
rr-�s


r-)rN�collectionsZurllib.parserZurllib.request�__all__�
namedtuplerrr5r-r
r
r
r�<module>s2error.cpython-36.pyc000064400000005304151733320400010323 0ustar003


 \Q
�@sPdZddlZdddgZGdd�de�ZGdd�deejj�ZGdd�de�Z	dS)	a�Exception classes raised by urllib.

The base exception class is URLError, which inherits from OSError.  It
doesn't define any behavior of its own, but is the base class for all
exceptions defined in this package.

HTTPError is an exception class that is also a valid HTTP response
instance.  It behaves this way because HTTP protocol errors are valid
responses, with a status code, headers, and a body.  In some contexts,
an application may want to handle an exception like a regular
response.
�N�URLError�	HTTPError�ContentTooShortErrorc@seZdZddd�Zdd�ZdS)rNcCs |f|_||_|dk	r||_dS)N)�args�reason�filename)�selfrr�r	�$/usr/lib64/python3.6/urllib/error.py�__init__szURLError.__init__cCs
d|jS)Nz<urlopen error %s>)r)rr	r	r
�__str__szURLError.__str__)N)�__name__�
__module__�__qualname__rrr	r	r	r
rs
c@sXeZdZdZejjjZdd�Zdd�Z	dd�Z
edd	��Zed
d��Z
e
jdd��Z
d
S)rzBRaised when HTTP error occurs, but also acts like non-error returncCs:||_||_||_||_||_|dk	r6|j||||�dS)N)�code�msg�hdrs�fpr�_HTTPError__super_init)rZurlrrrrr	r	r
r'szHTTPError.__init__cCsd|j|jfS)NzHTTP Error %s: %s)rr)rr	r	r
r4szHTTPError.__str__cCsd|j|jfS)Nz<HTTPError %s: %r>)rr)rr	r	r
�__repr__7szHTTPError.__repr__cCs|jS)N)r)rr	r	r
r<szHTTPError.reasoncCs|jS)N)r)rr	r	r
�headers@szHTTPError.headerscCs
||_dS)N)r)rrr	r	r
rDsN)r
rr�__doc__�urllib�response�
addinfourlrrrr�propertyrr�setterr	r	r	r
r#s

c@seZdZdZdd�ZdS)rzDException raised when downloaded size does not match content-length.cCstj||�||_dS)N)rr�content)r�messagerr	r	r
rKszContentTooShortError.__init__N)r
rrrrr	r	r	r
rIs)
rZurllib.responser�__all__�OSErrorrrrrrr	r	r	r
�<module>s

&parse.cpython-36.pyc000064400000103660151733320400010310 0ustar003

���ie��@s�dZddlZddlZddlZddlZddlZddddddd	d
ddd
ddddddddddgZddddddddd d!d"d#d$d%d&d'd(d)d*gZdddddd+dddd"d d!d,d#d$d%d-d'd(d&d.d/d0d)d*gZddd1d#ddd d!d$d%d2d3d"d&d4gZ	dd1d5d6d+ddd,d2d3g
Z
ddddd d!d"dd$d%d2d3gZddd1ddd6ddd d!d,dd#g
Zd7Z
d8Zd9d:d;gZd<ZiZd=d>�Zd?Zd@ZdAdB�ZeefdCdD�ZeefdEdF�ZdGdH�ZGdIdJ�dJe�ZGdKdL�dLe�ZGdMdN�dNe�ZGdOdP�dPee�ZGdQdR�dRee�ZddSlmZeddT�Z eddU�Z!eddV�Z"dWe _dXe j#_dYe j$_dZe!_d[e!j%_d\e!j&_d]e!j'_d^e!j(_d_e!j$_d`e"_e!j%je"j%_e!j&je"j&_e!j'je"j'_dae"j)_e!j(je"j(_e!j$je"j$_eZ*Gdbd�de e�Z+Gdcd�de!e�Z,Gddd�de"e�Z-Gded�de e�Z.Gdfd�de!e�Z/Gdgd�de"e�Z0dhdi�Z1e1�[1d�dkd�Z2dldm�Z3d�dndo�Z4dpdq�Z5drds�Z6dtdu�Z7dvdw�Z8d�dxd�Z9dyd�Z:dzd�Z;d�d{d�Z<d|d�Z=d}Z>da?d~d�Z@ejAd�ZBd�d�d�ZCd�d�d
�ZDGd�d��d�eE�ZFd�ZGdaHd�d�d�ZId�d�d�ZJeKd��ZLeMeL�ZNiZOGd�d��d�ejP�ZQd�d�d�ZRd�d�d
�ZSd�d�d�ZTd�dddeSfd�d	�ZUd�d��ZVd�d��ZWdaXd�d��ZYdaZd�d��Z[d�d��Z\d�d��Z]da^d�d��Z_d�d�d��Z`d�d��Zad�d��Zbd�d��Zcd�d��ZddS)�a3Parse (absolute and relative) URLs.

urlparse module is based upon the following RFC specifications.

RFC 3986 (STD66): "Uniform Resource Identifiers" by T. Berners-Lee, R. Fielding
and L.  Masinter, January 2005.

RFC 2732 : "Format for Literal IPv6 Addresses in URL's by R.Hinden, B.Carpenter
and L.Masinter, December 1999.

RFC 2396:  "Uniform Resource Identifiers (URI)": Generic Syntax by T.
Berners-Lee, R. Fielding, and L. Masinter, August 1998.

RFC 2368: "The mailto URL scheme", by P.Hoffman , L Masinter, J. Zawinski, July 1998.

RFC 1808: "Relative Uniform Resource Locators", by R. Fielding, UC Irvine, June
1995.

RFC 1738: "Uniform Resource Locators (URL)" by T. Berners-Lee, L. Masinter, M.
McCahill, December 1994

RFC 3986 is considered the current standard and any future changes to
urlparse module should conform with it.  The urlparse module is
currently not entirely compliant with this RFC due to defacto
scenarios for parsing, and for backward compatibility purposes, some
parsing quirks from older RFCs are retained. The testcases in
test_urlparse.py provides a good indicator of parsing behavior.

The WHATWG URL Parser spec should also be considered.  We are not compliant with
it either due to existing user code API behavior expectations (Hyrum's Law).
It serves as a useful guide when making changes.
�N�urlparse�
urlunparse�urljoin�	urldefrag�urlsplit�
urlunsplit�	urlencode�parse_qs�	parse_qsl�quote�
quote_plus�quote_from_bytes�unquote�unquote_plus�unquote_to_bytes�DefragResult�ParseResult�SplitResult�DefragResultBytes�ParseResultBytes�SplitResultBytes�Zftp�httpZgopherZnntpZimapZwais�fileZhttpsZshttpZmmsZprosperoZrtspZrtspuZsftpZsvnzsvn+sshZwsZwssZtelnetZsnewsZrsyncZnfsZgitzgit+sshZhdlZsipZsipsZtelZmailtoZnewszAabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+-.z!	

 �	�
�
�cCstj�tj�dS)z,Clear the parse cache and the quoters cache.N)�_parse_cache�clear�
_safe_quoters�r!r!�$/usr/lib64/python3.6/urllib/parse.py�clear_cache`sr#�ascii�strictcCs|S)Nr!)�objr!r!r"�_nooposr'cCs|j||�S)N)�encode)r&�encoding�errorsr!r!r"�_encode_resultrsr+cst��fdd�|D��S)Nc3s"|]}|r|j���ndVqdS)rN)�decode)�.0�x)r)r*r!r"�	<genexpr>xsz_decode_args.<locals>.<genexpr>)�tuple)�argsr)r*r!)r)r*r"�_decode_argsvsr2cGsZt|dt�}x.|dd�D]}|rt|t�|krtd��qW|rL|tfSt|�tfS)Nr�z$Cannot mix str and non-str arguments)�
isinstance�str�	TypeErrorr'r2r+)r1Z	str_input�argr!r!r"�_coerce_argszs
r8c@seZdZdZfZddd�ZdS)�_ResultMixinStrz>Standard approach to encoding parsed results from str to bytesr$r%cs|j��fdd�|D��S)Nc3s|]}|j���VqdS)N)r()r-r.)r)r*r!r"r/�sz)_ResultMixinStr.encode.<locals>.<genexpr>)�_encoded_counterpart)�selfr)r*r!)r)r*r"r(�sz_ResultMixinStr.encodeN)r$r%)�__name__�
__module__�__qualname__�__doc__�	__slots__r(r!r!r!r"r9�sr9c@seZdZdZfZddd�ZdS)�_ResultMixinBytesz>Standard approach to decoding parsed results from bytes to strr$r%cs|j��fdd�|D��S)Nc3s|]}|j���VqdS)N)r,)r-r.)r)r*r!r"r/�sz+_ResultMixinBytes.decode.<locals>.<genexpr>)�_decoded_counterpart)r;r)r*r!)r)r*r"r,�sz_ResultMixinBytes.decodeN)r$r%)r<r=r>r?r@r,r!r!r!r"rA�srAc@sDeZdZdZfZedd��Zedd��Zedd��Zedd	��Z	d
S)�_NetlocResultMixinBasezHShared methods for the parsed result objects containing a netloc elementcCs
|jdS)Nr)�	_userinfo)r;r!r!r"�username�sz_NetlocResultMixinBase.usernamecCs
|jdS)Nr3)rD)r;r!r!r"�password�sz_NetlocResultMixinBase.passwordcCsD|jd}|sdSt|t�r dnd}|j|�\}}}|j�||S)Nr�%�%)�	_hostinfor4r5�	partition�lower)r;�hostname�	separatorZpercentZzoner!r!r"rL�s
z_NetlocResultMixinBase.hostnamecCs@|jd}|dk	r<t|d�}d|ko.dkns<td��|S)Nr3�
ri��zPort out of range 0-65535)rI�int�
ValueError)r;�portr!r!r"rQ�s

z_NetlocResultMixinBase.portN)
r<r=r>r?r@�propertyrErFrLrQr!r!r!r"rC�srCc@s(eZdZfZedd��Zedd��ZdS)�_NetlocResultMixinStrcCsD|j}|jd�\}}}|r4|jd�\}}}|s<d}nd}}||fS)N�@�:)�netloc�
rpartitionrJ)r;rV�userinfo�	have_info�hostinforE�
have_passwordrFr!r!r"rD�sz_NetlocResultMixinStr._userinfocCsl|j}|jd�\}}}|jd�\}}}|rL|jd�\}}}|jd�\}}}n|jd�\}}}|sdd}||fS)NrT�[�]rU)rVrWrJ)r;rV�_rZ�have_open_br�	bracketedrLrQr!r!r"rI�sz_NetlocResultMixinStr._hostinfoN)r<r=r>r@rRrDrIr!r!r!r"rS�srSc@s(eZdZfZedd��Zedd��ZdS)�_NetlocResultMixinBytescCsD|j}|jd�\}}}|r4|jd�\}}}|s<d}nd}}||fS)N�@�:)rVrWrJ)r;rVrXrYrZrEr[rFr!r!r"rD�sz!_NetlocResultMixinBytes._userinfocCsl|j}|jd�\}}}|jd�\}}}|rL|jd�\}}}|jd�\}}}n|jd�\}}}|sdd}||fS)Nrb�[�]rc)rVrWrJ)r;rVr^rZr_r`rLrQr!r!r"rI�sz!_NetlocResultMixinBytes._hostinfoN)r<r=r>r@rRrDrIr!r!r!r"ra�sra)�
namedtuplezurl fragmentz!scheme netloc path query fragmentz(scheme netloc path params query fragmentz�
DefragResult(url, fragment)

A 2-tuple that contains the url without fragment identifier and the fragment
identifier as a separate argument.
z$The URL with no fragment identifier.z�
Fragment identifier separated from URL, that allows indirect identification of a
secondary resource by reference to a primary resource and additional identifying
information.
z�
SplitResult(scheme, netloc, path, query, fragment)

A 5-tuple that contains the different components of a URL. Similar to
ParseResult, but does not split params.
z%Specifies URL scheme for the request.z0
Network location where the request is made to.
z@
The hierarchical path, such as the path to a file to download.
z�
The query component, that contains non-hierarchical data, that along with data
in path component, identifies a resource in the scope of URI's scheme and
network location.
z�
Fragment identifier, that allows indirect identification of a secondary resource
by reference to a primary resource and additional identifying information.
zr
ParseResult(scheme, netloc, path, params,  query, fragment)

A 6-tuple that contains components of a parsed URL.
z�
Parameters for last path element used to dereference the URI in order to provide
access to perform some operation on the resource.
c@seZdZfZdd�ZdS)rcCs |jr|jd|jS|jSdS)N�#)�fragment�url)r;r!r!r"�geturlEszDefragResult.geturlN)r<r=r>r@rjr!r!r!r"rCsc@seZdZfZdd�ZdS)rcCst|�S)N)r)r;r!r!r"rjMszSplitResult.geturlN)r<r=r>r@rjr!r!r!r"rKsc@seZdZfZdd�ZdS)rcCst|�S)N)r)r;r!r!r"rjRszParseResult.geturlN)r<r=r>r@rjr!r!r!r"rPsc@seZdZfZdd�ZdS)rcCs |jr|jd|jS|jSdS)N�#)rhri)r;r!r!r"rjXszDefragResultBytes.geturlN)r<r=r>r@rjr!r!r!r"rVsc@seZdZfZdd�ZdS)rcCst|�S)N)r)r;r!r!r"rj`szSplitResultBytes.geturlN)r<r=r>r@rjr!r!r!r"r^sc@seZdZfZdd�ZdS)rcCst|�S)N)r)r;r!r!r"rjeszParseResultBytes.geturlN)r<r=r>r@rjr!r!r!r"rcscCs8ttfttfttff}x|D]\}}||_||_qWdS)N)rrrrrrr:rB)Z
_result_pairsZ_decodedZ_encodedr!r!r"�_fix_result_transcodingis
rlTc
Csft||�\}}}t|||�}|\}}}}}|tkrHd|krHt|�\}}nd}t||||||�}	||	�S)a#Parse a URL into 6 components:
    <scheme>://<netloc>/<path>;<params>?<query>#<fragment>
    Return a 6-tuple: (scheme, netloc, path, params, query, fragment).
    Note that we don't break the components up in smaller bits
    (e.g. netloc is a single string) and we don't expand % escapes.�;r)r8r�uses_params�_splitparamsr)
ri�scheme�allow_fragments�_coerce_resultZsplitresultrV�queryrh�params�resultr!r!r"rvscCsRd|kr,|jd|jd��}|dkr6|dfSn
|jd�}|d|�||dd�fS)N�/rmrrr3)�find�rfind)ri�ir!r!r"ro�s

rocCsLt|�}x*dD]"}|j||�}|dkrt||�}qW|||�||d�fS)Nz/?#r)�lenrw�min)ri�start�delim�cZwdelimr!r!r"�_splitnetloc�s
rcCs�|stdd�|D��rdSddl}|jdd�}|jdd�}|jdd�}|jdd�}|jd	|�}||krndSx(d
D] }||krttd|dd
��qtWdS)Ncss|]}t|�dkVqdS)�N)�ord)r-r~r!r!r"r/�sz_checknetloc.<locals>.<genexpr>rrTrrUrg�?�NFKCz/?#@:znetloc 'z' contains invalid z#characters under NFKC normalization)�any�unicodedata�replace�	normalizerP)rVr��nZnetloc2r~r!r!r"�_checknetloc�s
r�cCsxtD]}|j|d�}qW|S)Nr)�_UNSAFE_URL_BYTES_TO_REMOVEr�)ri�br!r!r"�_remove_unsafe_bytes_from_url�s
r�cCst|jd�d}|jd�\}}}|rX|r.td��|jd�\}}}|rh|jd�rhtd��n|jd�\}}}t|�dS)NrT�r\zInvalid IPv6 URLr]rU)rWrJrP�
startswith�_check_bracketed_host)rVZhostname_and_portZbefore_bracketr_r`rLr^rQr!r!r"�_check_bracketed_netloc�s
r�cCsB|jd�r tjd|�s>td��ntj|�}t|tj�r>td��dS)N�vz\Av[a-fA-F0-9]+\..+\ZzIPvFuture address is invalidz%An IPv4 address cannot be in brackets)r��re�matchrP�	ipaddressZ
ip_addressr4ZIPv4Address)rLZipr!r!r"r��s


r�c
Cs�t||�\}}}t|�}t|�}|jt�}|jt�}t|�}|||t|�t|�f}tj|d�}|rj||�St	t�t
kr|t�d}}}|jd�}	|	dk�r�|d|	�dk�r~|d|	�j
�}||	dd�}|dd�dk�rt|d�\}}d	|ko�d
|k�sd
|k�rd	|k�rtd��|�r<d|k�r<|jdd�\}}d
|k�rV|jd
d�\}}t|�t|||||�}
|
t|<||
�Sxd|d|	�D]}|tk�r�P�q�W||	dd�}|�s�tdd�|D���r�|d|	�j
�|}}|dd�dk�rPt|d�\}}d	|k�rd
|k�s,d
|k�r4d	|k�r4td��d	|k�rPd
|k�rPt|�|�rpd|k�rp|jdd�\}}d
|k�r�|jd
d�\}}t|�t|||||�}
|
t|<||
�S)aParse a URL into 5 components:
    <scheme>://<netloc>/<path>?<query>#<fragment>
    Return a 5-tuple: (scheme, netloc, path, query, fragment).
    Note that we don't break the components up in smaller bits
    (e.g. netloc is a single string) and we don't expand % escapes.NrrUrrr3r�z//r\r]zInvalid IPv6 URLrgr�css|]}|dkVqdS)�
0123456789Nr!)r-r~r!r!r"r/�szurlsplit.<locals>.<genexpr>)r8r��lstrip�_WHATWG_C0_CONTROL_OR_SPACE�strip�bool�typer�getrz�MAX_CACHE_SIZEr#rwrKrrP�splitr�r�scheme_charsr�r�)
rirprqrr�key�cachedrVrsrhryr�r~�restr!r!r"r�sh






cCs<t|�\}}}}}}}|r&d||f}|t|||||f��S)z�Put a parsed URL back together again.  This may result in a
    slightly different, but equivalent URL, if the URL that was parsed
    originally had redundant delimiters, e.g. a ? with an empty query
    (the draft states that these are equivalent).z%s;%s)r8r)�
componentsrprVrirtrsrhrrr!r!r"rscCs�t|�\}}}}}}|s4|r`|tkr`|dd�dkr`|rP|dd�dkrPd|}d|pXd|}|rp|d|}|r�|d|}|r�|d	|}||�S)
akCombine the elements of a tuple as returned by urlsplit() into a
    complete URL as a string. The data argument can be any five-item iterable.
    This may result in a slightly different, but equivalent URL, if the URL that
    was parsed originally had unnecessary delimiters (for example, a ? with an
    empty query; the RFC states that these are equivalent).Nr�z//r3rvrrUr�rg)r8�uses_netloc)r�rprVrirsrhrrr!r!r"rs cCs�|s|S|s|St||�\}}}t|d|�\}}}}}}	t|||�\}
}}}
}}|
|ks`|
tkrh||�S|
tkr�|r�|t|
|||
||f��S|}|r�|
r�|}|}
|s�|}|t|
|||
||f��S|jd�}|ddkr�|d=|dd�dk�r�|jd�}n(||jd�}td|dd	��|dd
�<g}xX|D]P}|dk�rdy|j�Wntk
�r`YnXn|dk�rt�q0n
|j	|��q0W|ddk�r�|j	d�|t|
|dj
|��p�d|
||f��S)
zaJoin a base URL and a possibly relative URL to form an absolute
    interpretation of the latter.rrvr3N�..�.���r�r�r�r�)r�r�)r8r�
uses_relativer�rr��filter�pop�
IndexError�append�join)�baserirqrrZbschemeZbnetlocZbpathZbparamsZbqueryZ	bfragmentrprV�pathrtrsrhZ
base_partsZsegmentsZ
resolved_pathZsegr!r!r"r*sT






c	CsTt|�\}}d|kr>t|�\}}}}}}t|||||df�}nd}|}|t||��S)z�Removes any existing fragment from URL.

    Returns a tuple of the defragmented URL and the fragment.  If
    the URL contained no fragments, the second element is the
    empty string.
    rgr)r8rrr)	rirr�sr��p�a�qZfragZdefragr!r!r"rosZ0123456789ABCDEFabcdefcCs�|s|jdSt|t�r"|jd�}|jd�}t|�dkr<|S|dg}|j}tdkrbdd�tD�axb|dd�D]R}y(|t|dd	��||d	d��Wqptk
r�|d�||�YqpXqpWdj	|�S)
z,unquote_to_bytes('abc%20def') -> b'abc def'.�zutf-8rHr3rNcSs4i|],}tD]"}tt||d�g�||j��qqS)�)�_hexdig�bytesrOr()r-r�r�r!r!r"�
<dictcomp>�sz$unquote_to_bytes.<locals>.<dictcomp>r�)
r�r4r5r(rzr��
_hextobyter��KeyErrorr�)�string�bits�resr��itemr!r!r"r�s*



z([-]+)�utf-8r�cCs�d|kr|j|S|dkrd}|dkr*d}tj|�}|dg}|j}x@tdt|�d�D],}|t||�j||��|||d�qVWdj|�S)	a�Replace %xx escapes by their single-character equivalent. The optional
    encoding and errors parameters specify how to decode percent-encoded
    sequences into Unicode characters, as accepted by the bytes.decode()
    method.
    By default, percent-encoded sequences are decoded with UTF-8, and invalid
    sequences are replaced by a placeholder character.

    unquote('abc%20def') -> 'abc def'.
    rGNzutf-8r�rr3r�r)r��_asciirer��rangerzrr,r�)r�r)r*r�r�r�ryr!r!r"r�s


Fc	CsRi}t|||||||d�}x2|D]*\}	}
|	|kr@||	j|
�q |
g||	<q W|S)a�Parse a query given as a string argument.

        Arguments:

        qs: percent-encoded query string to be parsed

        keep_blank_values: flag indicating whether blank values in
            percent-encoded queries should be treated as blank strings.
            A true value indicates that blanks should be retained as
            blank strings.  The default false value indicates that
            blank values are to be ignored and treated as if they were
            not included.

        strict_parsing: flag indicating what to do with parsing errors.
            If false (the default), errors are silently ignored.
            If true, errors raise a ValueError exception.

        encoding and errors: specify how to decode percent-encoded sequences
            into Unicode characters, as accepted by the bytes.decode() method.

        max_num_fields: int. If set, then throws a ValueError if there
            are more than n fields read by parse_qsl().

        Returns a dictionary.
    )r)r*�max_num_fieldsrM)r
r�)�qs�keep_blank_values�strict_parsingr)r*r�rMZ
parsed_result�pairs�name�valuer!r!r"r	�sc@seZdZdZdS)�_QueryStringSeparatorWarningz>Warning for using default `separator` in parse_qs or parse_qslN)r<r=r>r?r!r!r!r"r��sr�z/etc/python/urllib.cfgcCs�t|�\}}t|t�r |jd�}|s6t|ttf�rF|dk	rFtd��t�}|dk�rVt}d}	|dkrvtj	j
|	�}d}
|dkr�ytt�}Wnt
k
r�YnJX|�:ddl}|jdd'd�}
|
j|�|
j
d	|	dd
�}|aWdQRXt}
|dk�rd|k�rddlm}|d-tdd�d}n:|dk�r,|}n*t|�dk�rVt|	�d|
�d�dd��|dk	�r�||k�r�d|jd�|jd�}nd|j|�}||k�r�td��||k�r�dd�|jd�D�}nd d�|j|�D�}g}x�|D]�}|�r�|�r��q�|jd!d�}t|�dk�r>|�r(td"|f��|�r�|jd#�n�q�t|d��sR|�r�|djd$d%�}t|||d&�}||�}|djd$d%�}t|||d&�}||�}|j||f��q�W|S).a�Parse a query given as a string argument.

        Arguments:

        qs: percent-encoded query string to be parsed

        keep_blank_values: flag indicating whether blank values in
            percent-encoded queries should be treated as blank strings.
            A true value indicates that blanks should be retained as blank
            strings.  The default false value indicates that blank values
            are to be ignored and treated as if they were  not included.

        strict_parsing: flag indicating what to do with parsing errors. If
            false (the default), errors are silently ignored. If true,
            errors raise a ValueError exception.

        encoding and errors: specify how to decode percent-encoded sequences
            into Unicode characters, as accepted by the bytes.decode() method.

        max_num_fields: int. If set, then throws a ValueError
            if there are more than n fields read by parse_qsl().

        Returns a list, as G-d intended.
    r$Nz*Separator must be of type string or bytes.ZPYTHON_URLLIB_QS_SEPARATORzenvironment variablerrg)Z
interpolationZcomment_prefixesr	)Zfallbackrm)�warnz4The default separator of urllib.parse.parse_qsl and z1parse_qs was changed to '&' to avoid a web cache z"poisoning issue (CVE-2021-23336). z4By default, semicolons no longer act as query field zseparators. z3See https://access.redhat.com/articles/5860431 for z
more details.r�)�
stacklevel�&Zlegacyr3z (from z) must contain z1 character, or "legacy". See z<https://access.redhat.com/articles/5860431 for more details.zMax number of fields exceededcSs g|]}|jd�D]}|�qqS)rm)r�)r-�s1�s2r!r!r"�
<listcomp>Lszparse_qsl.<locals>.<listcomp>cSsg|]}|�qSr!r!)r-r�r!r!r"r�Ns�=zbad query field: %rr�+� )r)r*)rgzeThe default separator of urllib.parse.parse_qsl and parse_qs was changed to '&' to avoid a web cache z�The default separator of urllib.parse.parse_qsl and parse_qs was changed to '&' to avoid a web cache poisoning issue (CVE-2021-23336). z�The default separator of urllib.parse.parse_qsl and parse_qs was changed to '&' to avoid a web cache poisoning issue (CVE-2021-23336). By default, semicolons no longer act as query field z�The default separator of urllib.parse.parse_qsl and parse_qs was changed to '&' to avoid a web cache poisoning issue (CVE-2021-23336). By default, semicolons no longer act as query field separators. z�The default separator of urllib.parse.parse_qsl and parse_qs was changed to '&' to avoid a web cache poisoning issue (CVE-2021-23336). By default, semicolons no longer act as query field separators. See https://access.redhat.com/articles/5860431 for aThe default separator of urllib.parse.parse_qsl and parse_qs was changed to '&' to avoid a web cache poisoning issue (CVE-2021-23336). By default, semicolons no longer act as query field separators. See https://access.redhat.com/articles/5860431 for more details.)r8r4r�r,r5rP�object�_default_qs_separator�os�environr��open�_QS_SEPARATOR_CONFIG_FILENAME�FileNotFoundError�configparserZConfigParserZ	read_file�warningsr�r�rz�countr�r�r�r)r�r�r�r)r*r�rMrrZ_legacyZenvvar_nameZ
config_sourcerr��configr��
num_fieldsr��rZ
name_valueZnvr�r�r!r!r"r
�s�












cCs|jdd�}t|||�S)z�Like unquote(), but also replace plus signs by spaces, as required for
    unquoting HTML form values.

    unquote_plus('%7e/abc+def') -> '~/abc def'
    r�r�)r�r)r�r)r*r!r!r"rfssAABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_.-c@s(eZdZdZdd�Zdd�Zdd�ZdS)	�Quoterz�A mapping from bytes (in range(0,256)) to strings.

    String values are percent-encoded byte values, unless the key < 128, and
    in the "safe" set (either the specified safe set, or default set).
    cCstj|�|_dS)zsafe: bytes object.N)�_ALWAYS_SAFE�union�safe)r;r�r!r!r"�__init__~szQuoter.__init__cCsd|jjt|�fS)Nz<%s %r>)�	__class__r<�dict)r;r!r!r"�__repr__�szQuoter.__repr__cCs(||jkrt|�ndj|�}|||<|S)Nz%{:02X})r��chr�format)r;r�r�r!r!r"�__missing__�szQuoter.__missing__N)r<r=r>r?r�r�r�r!r!r!r"r�vsr�rvcCsbt|t�r8|s|S|dkrd}|dkr*d}|j||�}n |dk	rHtd��|dk	rXtd��t||�S)a�quote('abc def') -> 'abc%20def'

    Each part of a URL, e.g. the path info, the query, etc., has a
    different set of reserved characters that must be quoted.

    RFC 2396 Uniform Resource Identifiers (URI): Generic Syntax lists
    the following reserved characters.

    reserved    = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" |
                  "$" | ","

    Each of these characters is reserved in some component of a URL,
    but not necessarily in all of them.

    By default, the quote function is intended for quoting the path
    section of a URL.  Thus, it will not encode '/'.  This character
    is reserved, but in typical usage the quote function is being
    called on a path where the existing slash characters are used as
    reserved characters.

    string and safe may be either str or bytes objects. encoding and errors
    must not be specified if string is a bytes object.

    The optional encoding and errors parameters specify how to deal with
    non-ASCII characters, as accepted by the str.encode method.
    By default, encoding='utf-8' (characters are encoded with UTF-8), and
    errors='strict' (unsupported characters raise a UnicodeEncodeError).
    Nzutf-8r%z,quote() doesn't support 'encoding' for bytesz*quote() doesn't support 'errors' for bytes)r4r5r(r6r
)r�r�r)r*r!r!r"r�s
cCsdt|t�rd|ks$t|t�r2d|kr2t||||�St|t�rBd}nd}t|||||�}|jdd�S)z�Like quote(), but also replace ' ' with '+', as required for quoting
    HTML form values. Plus signs in the original string are escaped unless
    they are included in safe. It also does not have safe default to '/'.
    r�� r�)r4r5r�rr�)r�r�r)r*Zspacer!r!r"r�s
cs�t|ttf�std��|sdSt|t�r6|jdd�}ntdd�|D��}|jt|�s^|j�Syt	|�Wn&t
k
r�t|�jt	|<�YnXdj
�fdd�|D��S)z�Like quote(), but accepts a bytes object rather than a str, and does
    not perform string-to-bytes encoding.  It always returns an ASCII string.
    quote_from_bytes(b'abc def?') -> 'abc%20def%3f'
    z!quote_from_bytes() expected bytesrr$�ignorecSsg|]}|dkr|�qS)�r!)r-r~r!r!r"r��sz$quote_from_bytes.<locals>.<listcomp>csg|]}�|��qSr!r!)r-�char)�quoterr!r"r��s)r4r��	bytearrayr6r5r(�rstrip�_ALWAYS_SAFE_BYTESr,r r�r��__getitem__r�)Zbsr�r!)r�r"r
�s
cCst|d�r|j�}nRy t|�r2t|dt�r2t�Wn0tk
rdtj�\}}}td�j|��YnXg}	|s�xr|D]j\}
}t|
t	�r�||
|�}
n|t
|
�|||�}
t|t	�r�|||�}n|t
|�|||�}|	j|
d|�qtW�n,�x(|D�]\}
}t|
t	��r||
|�}
n|t
|
�|||�}
t|t	��rL|||�}|	j|
d|�q�t|t
��rz|||||�}|	j|
d|�q�yt|�}Wn:tk
�r�|t
|�|||�}|	j|
d|�Yq�XxJ|D]B}
t|
t	��r�||
|�}
n|t
|
�|||�}
|	j|
d|
��q�Wq�Wdj|	�S)a^Encode a dict or sequence of two-element tuples into a URL query string.

    If any values in the query arg are sequences and doseq is true, each
    sequence element is converted to a separate parameter.

    If the query arg is a sequence of two-element tuples, the order of the
    parameters in the output will match the order of parameters in the
    input.

    The components of a query arg may each be either a string or a bytes type.

    The safe, encoding, and errors parameters are passed down to the function
    specified by quote_via (encoding and errors only if a component is a str).
    �itemsrz1not a valid non-string sequence or mapping objectr�r�)
�hasattrr�rzr4r0r6�sys�exc_info�with_tracebackr�r5r�r�)rsZdoseqr�r)r*Z	quote_viaZtyZva�tb�l�kr�r.Zeltr!r!r"r�sP





cCsJt|t�rFy|jd�j�}Wn(tk
rDtdt|�d��YnX|S)zto_bytes(u"URL") --> 'URL'.�ASCIIzURL z contains non-ASCII characters)r4r5r(r,�UnicodeError�repr)rir!r!r"�to_bytes/s
r�cCs`t|�j�}|dd�dkr<|dd�dkr<|dd�j�}|dd�dkr\|dd�j�}|S)	z8unwrap('<URL:type://host/path>') --> 'type://host/path'.Nr3�<�>�zURL:r�r�)r5r�)rir!r!r"�unwrap<s rcCsDtdkrtjdtj�atj|�}|r<|j�\}}|j�|fSd|fS)z:splittype('type:opaquestring') --> 'type', 'opaquestring'.Nz
([^/:]+):(.*))�	_typeprogr��compile�DOTALLr��groupsrK)rir�rp�datar!r!r"�	splittypeEs
rcCsXtdkrtjdtj�atj|�}|rP|j�\}}|rH|ddkrHd|}||fSd|fS)z;splithost('//host[:port]/path') --> 'host[:port]', '/path'.Nz//([^/#?]*)(.*)rrv)�	_hostprogr�rrr�r)rir�Z	host_portr�r!r!r"�	splithostRs
r
cCs |jd�\}}}|r|nd|fS)zJsplituser('user[:passwd]@host[:port]') --> 'user[:passwd]', 'host[:port]'.rTN)rW)�host�userr}r!r!r"�	splituser`sr
cCs |jd�\}}}||r|ndfS)z/splitpasswd('user:passwd') -> 'user', 'passwd'.rUN)rJ)rr}Zpasswdr!r!r"�splitpasswdesrcCsDtdkrtjdtj�atj|�}|r<|j�\}}|r<||fS|dfS)z*splitport('host:port') --> 'host', 'port'.Nz(.*):([0-9]*)$)�	_portprogr�rrr�r)rr�rQr!r!r"�	splitportls
rr3cCsT|jd�\}}}|s|}n2|rLyt|�}Wntk
rBd}YnX||fS||fS)z�Split host and port, returning numeric port.
    Return given default port if no ':' found; defaults to -1.
    Return numerical port if a valid number are found after ':'.
    Return None if ':' but not a valid number.rUN)rWrOrP)rZdefportr}rQZnportr!r!r"�
splitnportys
rcCs$|jd�\}}}|r||fS|dfS)z/splitquery('/path?query') --> '/path', 'query'.r�N)rW)rir�r}rsr!r!r"�
splitquery�srcCs$|jd�\}}}|r||fS|dfS)z)splittag('/path#tag') --> '/path', 'tag'.rgN)rW)rir�r}�tagr!r!r"�splittag�srcCs|jd�}|d|dd�fS)zksplitattr('/path;attr1=value1;attr2=value2;...') ->
        '/path', ['attr1=value1', 'attr2=value2', ...].rmrr3N)r�)riZwordsr!r!r"�	splitattr�s
rcCs |jd�\}}}||r|ndfS)z-splitvalue('attr=value') --> 'attr', 'value'.r�N)rJ)�attrr}r�r!r!r"�
splitvalue�sr)rT)r)rT)T)r�r�)FFr�r�NN)FFr�r�NN)r�r�)rvNN)rNN)rvr�)r�)er?r�r�r��collectionsr��__all__r�r�rnZnon_hierarchicalZ
uses_queryZ
uses_fragmentr�r�r�r�rr#Z_implicit_encodingZ_implicit_errorsr'r+r2r8r�r9rArCrSrarfZ_DefragResultBaseZ_SplitResultBaseZ_ParseResultBaserirhrprVr�rsrtZ
ResultBaserrrrrrrlrrorr�r�r�r�rrrrrr�r�rrr�rr	�RuntimeWarningr�r�r�r
r�	frozensetr�r�r�r �defaultdictr�rrr
rr�rrrr	r
r
rrrrrrrrr!r!r!r"�<module> s





!


	
	
B
E


&
y
	
,

O

response.cpython-36.pyc000064400000006235151733320400011034 0ustar003


 \��@s^dZddlZddddgZGdd�dej�ZGdd�de�ZGd	d�de�ZGd
d�de�ZdS)aResponse classes used by urllib.

The base class, addbase, defines a minimal file-like interface,
including read() and readline().  The typical response object is an
addinfourl instance, which defines an info() method that returns
headers and a geturl() method that returns the url.
�N�addbase�addclosehook�addinfo�
addinfourlcs8eZdZdZ�fdd�Zdd�Zdd�Zdd	�Z�ZS)
rzOBase class for addinfo and addclosehook. Is a good idea for garbage collection.cs tt|�j|ddd�||_dS)Nz<urllib response>F)�delete)�superr�__init__�fp)�selfr	)�	__class__��'/usr/lib64/python3.6/urllib/response.pyrszaddbase.__init__cCsd|jjt|�|jfS)Nz<%s at %r whose fp = %r>)r�__name__�id�file)r
rrr
�__repr__szaddbase.__repr__cCs|jjrtd��|S)NzI/O operation on closed file)r	�closed�
ValueError)r
rrr
�	__enter__szaddbase.__enter__cCs|j�dS)N)�close)r
�type�value�	tracebackrrr
�__exit__!szaddbase.__exit__)	r�
__module__�__qualname__�__doc__rrrr�
__classcell__rr)rr
rs
cs,eZdZdZ�fdd�Z�fdd�Z�ZS)rz*Class to add a close hook to an open file.cs tt|�j|�||_||_dS)N)rrr�	closehook�hookargs)r
r	rr)rrr
r(szaddclosehook.__init__cs>z(|j}|j}|r&d|_d|_||�Wdtt|�j�XdS)N)rrrrr)r
rr)rrr
r-szaddclosehook.close)rrrrrrrrr)rr
r%scs(eZdZdZ�fdd�Zdd�Z�ZS)rz.class to add an info() method to an open file.cstt|�j|�||_dS)N)rrr�headers)r
r	r )rrr
r<szaddinfo.__init__cCs|jS)N)r )r
rrr
�info@szaddinfo.info)rrrrrr!rrr)rr
r9scs2eZdZdZd	�fdd�	Zdd�Zdd�Z�ZS)
rz9class to add info() and geturl() methods to an open file.Ncs"tt|�j||�||_||_dS)N)rrr�url�code)r
r	r r"r#)rrr
rGszaddinfourl.__init__cCs|jS)N)r#)r
rrr
�getcodeLszaddinfourl.getcodecCs|jS)N)r")r
rrr
�geturlOszaddinfourl.geturl)N)rrrrrr$r%rrr)rr
rDs)rZtempfile�__all__Z_TemporaryFileWrapperrrrrrrrr
�<module>srobotparser.cpython-36.opt-2.pyc000064400000013063151733320400012475 0ustar003


 \�"�@sXddlZddlZddlZdgZejdd�ZGdd�d�ZGdd�d�ZGdd	�d	�Z	dS)
�N�RobotFileParser�RequestRatezrequests secondsc@sfeZdZddd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Zdd�Z	dd�Z
dd�Zdd�Zdd�Z
dS)r�cCs,g|_d|_d|_d|_|j|�d|_dS)NFr)�entries�
default_entry�disallow_all�	allow_all�set_url�last_checked)�self�url�r
�*/usr/lib64/python3.6/urllib/robotparser.py�__init__s
zRobotFileParser.__init__cCs|jS)N)r
)rr
r
r�mtime$szRobotFileParser.mtimecCsddl}|j�|_dS)Nr)�timer
)rrr
r
r�modified-szRobotFileParser.modifiedcCs&||_tjj|�dd�\|_|_dS)N��)r�urllib�parse�urlparse�host�path)rrr
r
rr	5szRobotFileParser.set_urlcCs�ytjj|j�}WnRtjjk
rd}z2|jdkr:d|_n|jdkrT|jdkrTd|_WYdd}~XnX|j	�}|j
|jd�j��dS)N��Ti�i�zutf-8)rr)
rZrequestZurlopenr�errorZ	HTTPError�coderr�readr�decode�
splitlines)r�f�err�rawr
r
rr:s
zRobotFileParser.readcCs,d|jkr|jdkr(||_n|jj|�dS)N�*)�
useragentsrr�append)r�entryr
r
r�
_add_entryGs

zRobotFileParser._add_entrycCs6d}t�}|j��x|D�]�}|sT|dkr8t�}d}n|dkrT|j|�t�}d}|jd�}|dkrr|d|�}|j�}|s�q|jdd�}t|�dkr|dj�j�|d<tj	j
|dj��|d<|ddk�r|dkr�|j|�t�}|jj|d�d}q|ddk�r4|dk�r|j
jt|dd��d}q|dd	k�rh|dk�r|j
jt|dd
��d}q|ddk�r�|dk�r|dj�j��r�t|d�|_d}q|ddkr|dkr|djd
�}t|�dk�r|dj�j��r|dj�j��rtt|d�t|d��|_d}qW|dk�r2|j|�dS)Nrr��#�:z
user-agentZdisallowFZallowTzcrawl-delayzrequest-rate�/)�Entryrr(�find�strip�split�len�lowerrr�unquoter%r&�	rulelines�RuleLine�isdigit�int�delayr�req_rate)r�lines�stater'�line�iZnumbersr
r
rrPsd






 
zRobotFileParser.parsecCs�|jr
dS|jrdS|jsdStjjtjj|��}tjjdd|j|j	|j
|jf�}tjj|�}|sfd}x"|j
D]}|j|�rn|j|�SqnW|jr�|jj|�SdS)NFTrr,)rrr
rrrr3�
urlunparserZparamsZqueryZfragment�quoter�
applies_to�	allowancer)r�	useragentrZ
parsed_urlr'r
r
r�	can_fetch�s$
zRobotFileParser.can_fetchcCs4|j�sdSx|jD]}|j|�r|jSqW|jjS)N)rrr@r8r)rrBr'r
r
r�crawl_delay�s

zRobotFileParser.crawl_delaycCs4|j�sdSx|jD]}|j|�r|jSqW|jjS)N)rrr@r9r)rrBr'r
r
r�request_rate�s

zRobotFileParser.request_ratecCs0|j}|jdk	r||jg}djtt|��dS)N�
)rr�join�map�str)rrr
r
r�__str__�s
zRobotFileParser.__str__N)r)�__name__�
__module__�__qualname__rrrr	rr(rrCrDrErJr
r
r
rrs
	
	Cc@s$eZdZdd�Zdd�Zdd�ZdS)r5cCs>|dkr|rd}tjjtjj|��}tjj|�|_||_dS)NrT)rrr>rr?rrA)rrrAr
r
rr�s
zRuleLine.__init__cCs|jdkp|j|j�S)Nr$)r�
startswith)r�filenamer
r
rr@�szRuleLine.applies_tocCs|jr
dndd|jS)NZAllowZDisallowz: )rAr)rr
r
rrJ�szRuleLine.__str__N)rKrLrMrr@rJr
r
r
rr5�sr5c@s,eZdZdd�Zdd�Zdd�Zdd�Zd	S)
r-cCsg|_g|_d|_d|_dS)N)r%r4r8r9)rr
r
rr�szEntry.__init__cCs�g}x|jD]}|jd|���qW|jdk	r@|jd|j���|jdk	rj|j}|jd|j�d|j���|jtt|j	��|jd�dj
|�S)NzUser-agent: z
Crawl-delay: zRequest-rate: r,rrF)r%r&r8r9ZrequestsZseconds�extendrHrIr4rG)rZret�agentZrater
r
rrJ�s


z
Entry.__str__cCsF|jd�dj�}x.|jD]$}|dkr*dS|j�}||krdSqWdS)Nr,rr$TF)r0r2r%)rrBrQr
r
rr@�szEntry.applies_tocCs$x|jD]}|j|�r|jSqWdS)NT)r4r@rA)rrOr<r
r
rrA�s

zEntry.allowanceN)rKrLrMrrJr@rAr
r
r
rr-�s

r-)
�collectionsZurllib.parserZurllib.request�__all__�
namedtuplerrr5r-r
r
r
r�<module>
s2request.cpython-36.pyc000064400000216402151733320400010665 0ustar003

���i~��)@s�dZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddl
Z
ddlZddlZddlZddlZddlZddlmZmZmZddlmZmZmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)ddl*m+Z+m,Z,yddl-Z-Wne.k
�r&dZ/YnXdZ/dd	d
ddd
ddddddddddddddddddd d!d"d#d$d%d&d'd(g!Z0d)e
j1dd*�Z2da3dej4fddddd+�d,d�Z5d-d �Z6gZ7d~d.d%�Z8d/d&�Z9e
j:d0e
j;�Z<d1d2�Z=Gd3d�d�Z>Gd4d	�d	�Z?d5d!�Z@Gd6d
�d
�ZAGd7d�deA�ZBGd8d�deA�ZCGd9d�deA�ZDd:d;�ZEGd<d�deA�ZFGd=d�d�ZGGd>d�deG�ZHGd?d�deH�ZIGd@d�d�ZJGdAd�deJeA�ZKGdBd�deJeA�ZLejMZNGdCd�d�ZOGdDd�deAeO�ZPGdEd�deAeO�ZQGdFdG�dGeA�ZRGdHd�deR�ZSeTejUdI��r2GdJdK�dKeR�ZVe0jWdK�GdLd
�d
eA�ZXGdMd�deA�ZYdNdO�ZZdPdQ�Z[GdRd�deA�Z\dSdT�Z]GdUd�deA�Z^GdVd�de^�Z_GdWd�deA�Z`dXZaejbdYk�r�ddZlcmdZdmeZend[d#�Zdd\d"�ZeiZfGd]d'�d'�ZgGd^d(�d(eg�Zhdaid_d`�Zjdakdadb�Zldamdcdd�Zndaodedf�ZpGdgdh�dh�Zqdidj�Zrddkdl�Zsdmdn�Zte
judok�r�ddplvmwZwmxZxdqdr�Zydsdt�Zzdudv�Z{dwd$�Z|n6ejbdYk�r�dxdy�Z}dzd$�Z|d{d|�Z~d}dv�Z{nerZ|esZ{dS)�a�
An extensible library for opening URLs using a variety of protocols

The simplest way to use this module is to call the urlopen function,
which accepts a string containing a URL or a Request object (described
below).  It opens the URL and returns the results as file-like
object; the returned object has some extra methods described below.

The OpenerDirector manages a collection of Handler objects that do
all the actual work.  Each Handler implements a particular protocol or
option.  The OpenerDirector is a composite object that invokes the
Handlers needed to open the requested URL.  For example, the
HTTPHandler performs HTTP GET and POST requests and deals with
non-error returns.  The HTTPRedirectHandler automatically deals with
HTTP 301, 302, 303 and 307 redirect errors, and the HTTPDigestAuthHandler
deals with digest authentication.

urlopen(url, data=None) -- Basic usage is the same as original
urllib.  pass the url and optionally data to post to an HTTP URL, and
get a file-like object back.  One difference is that you can also pass
a Request instance instead of URL.  Raises a URLError (subclass of
OSError); for HTTP errors, raises an HTTPError, which can also be
treated as a valid response.

build_opener -- Function that creates a new OpenerDirector instance.
Will install the default handlers.  Accepts one or more Handlers as
arguments, either instances or Handler classes that it will
instantiate.  If one of the argument is a subclass of the default
handler, the argument will be installed instead of the default.

install_opener -- Installs a new opener as the default opener.

objects of interest:

OpenerDirector -- Sets up the User Agent as the Python-urllib client and manages
the Handler classes, while dealing with requests and responses.

Request -- An object that encapsulates the state of a request.  The
state can be as simple as the URL.  It can also include extra HTTP
headers, e.g. a User-Agent.

BaseHandler --

internals:
BaseHandler and parent
_call_chain conventions

Example usage:

import urllib.request

# set up authentication info
authinfo = urllib.request.HTTPBasicAuthHandler()
authinfo.add_password(realm='PDQ Application',
                      uri='https://mahler:8092/site-updates.py',
                      user='klem',
                      passwd='geheim$parole')

proxy_support = urllib.request.ProxyHandler({"http" : "http://ahad-haam:3128"})

# build a new opener that adds authentication and caching FTP handlers
opener = urllib.request.build_opener(proxy_support, authinfo,
                                     urllib.request.CacheFTPHandler)

# install it
urllib.request.install_opener(opener)

f = urllib.request.urlopen('http://www.python.org/')
�N)�URLError�	HTTPError�ContentTooShortError)�urlparse�urlsplit�urljoin�unwrap�quote�unquote�	splittype�	splithost�	splitport�	splituser�splitpasswd�	splitattr�
splitquery�
splitvalue�splittag�to_bytes�unquote_to_bytes�
urlunparse)�
addinfourl�addclosehookFT�Request�OpenerDirector�BaseHandler�HTTPDefaultErrorHandler�HTTPRedirectHandler�HTTPCookieProcessor�ProxyHandler�HTTPPasswordMgr�HTTPPasswordMgrWithDefaultRealm�HTTPPasswordMgrWithPriorAuth�AbstractBasicAuthHandler�HTTPBasicAuthHandler�ProxyBasicAuthHandler�AbstractDigestAuthHandler�HTTPDigestAuthHandler�ProxyDigestAuthHandler�HTTPHandler�FileHandler�
FTPHandler�CacheFTPHandler�DataHandler�UnknownHandler�HTTPErrorProcessor�urlopen�install_opener�build_opener�pathname2url�url2pathname�
getproxies�urlretrieve�
urlcleanup�	URLopener�FancyURLopenerz%d.%d�)�cafile�capath�	cadefault�contextc
Cs�|s|s|rfddl}|jdtd�|dk	r2td��ts>td��tjtjj||d�}t	|d�}t
|�}	n0|r~t	|d�}t
|�}	ntdkr�t
�a}	nt}	|	j|||�S)	a$
Open the URL url, which can be either a string or a Request object.

    *data* must be an object specifying additional data to be sent to
    the server, or None if no such data is needed.  See Request for
    details.

    urllib.request module uses HTTP/1.1 and includes a "Connection:close"
    header in its HTTP requests.

    The optional *timeout* parameter specifies a timeout in seconds for
    blocking operations like the connection attempt (if not specified, the
    global default timeout setting will be used). This only works for HTTP,
    HTTPS and FTP connections.

    If *context* is specified, it must be a ssl.SSLContext instance describing
    the various SSL options. See HTTPSConnection for more details.

    The optional *cafile* and *capath* parameters specify a set of trusted CA
    certificates for HTTPS requests. cafile should point to a single file
    containing a bundle of CA certificates, whereas capath should point to a
    directory of hashed certificate files. More information can be found in
    ssl.SSLContext.load_verify_locations().

    The *cadefault* parameter is ignored.

    This function always returns an object which can work as a context
    manager and has methods such as

    * geturl() - return the URL of the resource retrieved, commonly used to
      determine if a redirect was followed

    * info() - return the meta-information of the page, such as headers, in the
      form of an email.message_from_string() instance (see Quick Reference to
      HTTP Headers)

    * getcode() - return the HTTP status code of the response.  Raises URLError
      on errors.

    For HTTP and HTTPS URLs, this function returns a http.client.HTTPResponse
    object slightly modified. In addition to the three new methods above, the
    msg attribute contains the same information as the reason attribute ---
    the reason phrase returned by the server --- instead of the response
    headers as it is specified in the documentation for HTTPResponse.

    For FTP, file, and data URLs and requests explicitly handled by legacy
    URLopener and FancyURLopener classes, this function returns a
    urllib.response.addinfourl object.

    Note that None may be returned if no handler handles the request (though
    the default installed global OpenerDirector uses UnknownHandler to ensure
    this never happens).

    In addition, if proxy settings are detected (for example, when a *_proxy
    environment variable like http_proxy is set), ProxyHandler is default
    installed and makes sure the requests are handled through the proxy.

    rNzJcafile, capath and cadefault are deprecated, use a custom context instead.r:zDYou can't pass both context and any of cafile, capath, and cadefaultzSSL support not available)r;r<)r>)
�warnings�warn�DeprecationWarning�
ValueError�	_have_ssl�sslZcreate_default_contextZPurposeZSERVER_AUTH�HTTPSHandlerr2�_opener�open)
�url�data�timeoutr;r<r=r>r?Z
https_handler�opener�rL�&/usr/lib64/python3.6/urllib/request.pyr0�s*<




cCs|adS)N)rF)rKrLrLrMr1�scCs4t|�\}}tjt||����}|j�}|dkrD|rDtjj|�|fS|rTt|d�}nt	j
dd�}|j}tj
|�|��||f}	d
}
d}d}d}
d	|kr�t|d
�}|r�||
|
|�xB|j|
�}|s�P|t|�7}|j|�|
d7}
|r�||
|
|�q�WWdQRXWdQRX|dk�r0||k�r0td||f|	��|	S)aW
    Retrieve a URL into a temporary location on disk.

    Requires a URL argument. If a filename is passed, it is used as
    the temporary file location. The reporthook argument should be
    a callable that accepts a block number, a read size, and the
    total file size of the URL target. The data argument should be
    valid URL encoded data.

    If a filename is passed and the URL points to a local resource,
    the result is a copy from local file to new file.

    Returns a tuple containing the path to the newly created
    data file as well as the resulting HTTPMessage object.
    �file�wbF)�deletei��rzcontent-lengthzContent-LengthNz1retrieval incomplete: got only %i out of %i bytesi ���)r�
contextlib�closingr0�info�os�path�normpathrG�tempfileZNamedTemporaryFile�name�_url_tempfiles�append�int�read�len�writer)rH�filename�
reporthookrIZurl_typerX�fp�headers�tfp�result�bs�sizer_�blocknum�blockrLrLrMr6�sD


$cCsHx0tD](}ytj|�Wqtk
r,YqXqWtdd�=trDdadS)z0Clean up temporary files from urlretrieve calls.N)r\rW�unlink�OSErrorrF)Z	temp_filerLrLrMr7%s


z:\d+$cCs<|j}t|�d}|dkr&|jdd�}tjd|d�}|j�S)z�Return request-host, as defined by RFC 2965.

    Variation from RFC: returned value is lowercased, for convenient
    comparison.

    rR��Host)�full_urlr�
get_header�_cut_port_re�sub�lower)�requestrH�hostrLrLrM�request_host4srwc@s�eZdZdidddfdd�Zedd��Zejdd��Zejdd��Zed	d
��Zejdd
��Zejdd
��Zd
d�Z	dd�Z
dd�Zdd�Zdd�Z
dd�Zdd�Zdd�Zd#dd�Zdd �Zd!d"�ZdS)$rNFc	Csp||_i|_i|_d|_||_d|_x |j�D]\}}|j||�q.W|dkrVt|�}||_	||_
|rl||_dS)N)rpre�unredirected_hdrs�_datarI�_tunnel_host�items�
add_headerrw�origin_req_host�unverifiable�method)	�selfrHrIrer}r~r�key�valuerLrLrM�__init__FszRequest.__init__cCs|jrdj|j|j�S|jS)Nz{}#{})�fragment�format�	_full_url)r�rLrLrMrpXszRequest.full_urlcCs(t|�|_t|j�\|_|_|j�dS)N)rr�rr��_parse)r�rHrLrLrMrp^s
cCsd|_d|_d|_dS)Nrn)r�r��selector)r�rLrLrMrpescCs|jS)N)ry)r�rLrLrMrIkszRequest.datacCs(||jkr$||_|jd�r$|jd�dS)NzContent-length)ry�
has_header�
remove_header)r�rIrLrLrMrIos

cCs
d|_dS)N)rI)r�rLrLrMrIyscCsNt|j�\|_}|jdkr(td|j��t|�\|_|_|jrJt|j�|_dS)Nzunknown url type: %r)	rr��typerBrprrvr�r
)r��restrLrLrMr�}s
zRequest._parsecCs|jdk	rdnd}t|d|�S)z3Return a string indicating the HTTP request method.N�POST�GETr)rI�getattr)r�Zdefault_methodrLrLrM�
get_method�szRequest.get_methodcCs|jS)N)rp)r�rLrLrM�get_full_url�szRequest.get_full_urlcCs4|jdkr|jr|j|_n||_|j|_||_dS)N�https)r�rzrvrpr�)r�rvr�rLrLrM�	set_proxy�s

zRequest.set_proxycCs|j|jkS)N)r�rp)r�rLrLrM�	has_proxy�szRequest.has_proxycCs||j|j�<dS)N)re�
capitalize)r�r��valrLrLrMr|�szRequest.add_headercCs||j|j�<dS)N)rxr�)r�r�r�rLrLrM�add_unredirected_header�szRequest.add_unredirected_headercCs||jkp||jkS)N)rerx)r��header_namerLrLrMr��s
zRequest.has_headercCs|jj||jj||��S)N)re�getrx)r�r��defaultrLrLrMrq�szRequest.get_headercCs |jj|d�|jj|d�dS)N)re�poprx)r�r�rLrLrMr��szRequest.remove_headercCs"|jj�}|j|j�t|j��S)N)rx�copy�updatere�listr{)r��hdrsrLrLrM�header_items�s
zRequest.header_items)N)�__name__�
__module__�__qualname__r��propertyrp�setter�deleterrIr�r�r�r�r�r|r�r�rqr�r�rLrLrLrMrDs(

c@sNeZdZdd�Zdd�Zdd�Zdd�Zd	ejfd
d�Z	ddd
�Z
dd�Zd	S)rcCs6dt}d|fg|_g|_i|_i|_i|_i|_dS)NzPython-urllib/%sz
User-agent)�__version__�
addheaders�handlers�handle_open�handle_error�process_response�process_request)r�Zclient_versionrLrLrMr��szOpenerDirector.__init__cCsZt|d�stdt|���d}�xt|�D�]}|dkr:q*|jd�}|d|�}||dd�}|jd	�r�|jd�|d}||dd�}yt|�}Wntk
r�YnX|jj	|i�}	|	|j|<n>|d
kr�|}|j
}	n*|dkr�|}|j}	n|dkr*|}|j}	nq*|	j
|g�}
|
�r&tj|
|�n
|
j|�d
}q*W|�rVtj|j|�|j|�dS)N�
add_parentz%expected BaseHandler instance, got %rF�redirect_request�do_open�
proxy_open�_rR�errorrG�responseruT)r�r�r�)�hasattr�	TypeErrorr��dir�find�
startswithr^rBr�r�r�r�r��
setdefault�bisectZinsortr]r�r�)r��handlerZadded�meth�i�protocolZ	condition�j�kind�lookupr�rLrLrM�add_handler�sJ



zOpenerDirector.add_handlercCsdS)NrL)r�rLrLrM�close�szOpenerDirector.closec	Gs<|j|f�}x*|D]"}t||�}||�}|dk	r|SqWdS)N)r�r�)	r��chainr��	meth_name�argsr�r��funcrgrLrLrM�_call_chain�s

zOpenerDirector._call_chainNc
Cs�t|t�rt||�}n|}|dk	r(||_||_|j}|d}x(|jj|g�D]}t||�}||�}qLW|j	||�}	|d}x*|j
j|g�D]}t||�}|||	�}	q�W|	S)NZ_requestZ	_response)�
isinstance�strrrIrJr�r�r�r��_openr�)
r��fullurlrIrJ�reqr�r�Z	processorr�r�rLrLrMrG�s"


zOpenerDirector.opencCsP|j|jdd|�}|r|S|j}|j|j||d|�}|r>|S|j|jdd|�S)Nr�Zdefault_openr��unknown�unknown_open)r�r�r�)r�r�rIrgr�rLrLrMr�s


zOpenerDirector._opencGs~|d
kr,|jd}|d}d|}d}|}n|j}|d}d}|||f|}|j|�}|r^|S|rz|dd	f|}|j|�SdS)N�httpr�r:z
http_error_%srRZ_errorrr��http_error_default)r�r�)r�r�)r��protor��dictr�Zhttp_errZ	orig_argsrgrLrLrMr�'s 

zOpenerDirector.error)N)r�r�r�r�r�r�r��socket�_GLOBAL_DEFAULT_TIMEOUTrGr�r�rLrLrLrMr�s/
c	Gs�t�}ttttttttt	g	}t
tjd�r2|j
t�t�}xN|D]F}x@|D]8}t|t�rlt||�r�|j|�qHt||�rH|j|�qHWq>Wx|D]}|j|�q�Wx|D]}|j|��q�Wx&|D]}t|t�r�|�}|j|�q�W|S)a*Create an opener object from a list of handlers.

    The opener will use several default handlers, including support
    for HTTP, FTP and when applicable HTTPS.

    If any of the handlers passed as arguments are subclasses of the
    default handlers, the default handlers will not be used.
    �HTTPSConnection)rrr.r)rrr+r*r/r-r�r��clientr]rE�setr�r��
issubclass�add�remover�)r�rKZdefault_classes�skip�klassZcheck�hrLrLrMr2@s0	









c@s(eZdZdZdd�Zdd�Zdd�ZdS)	ri�cCs
||_dS)N)�parent)r�r�rLrLrMr�gszBaseHandler.add_parentcCsdS)NrL)r�rLrLrMr�jszBaseHandler.closecCst|d�sdS|j|jkS)N�
handler_orderT)r�r�)r��otherrLrLrM�__lt__ns
zBaseHandler.__lt__N)r�r�r�r�r�r�r�rLrLrLrMrdsc@s eZdZdZdZdd�ZeZdS)r/zProcess HTTP error responses.i�cCsJ|j|j|j�}}}d|ko*dknsF|jjd|||||�}|S)N��i,r�)�code�msgrVr�r�)r�rur�r�r�r�rLrLrM�
http_response{s
z HTTPErrorProcessor.http_responseN)r�r�r��__doc__r�r��https_responserLrLrLrMr/wsc@seZdZdd�ZdS)rcCst|j||||��dS)N)rrp)r�r�rdr�r�r�rLrLrMr��sz*HTTPDefaultErrorHandler.http_error_defaultN)r�r�r�r�rLrLrLrMr�sc@s4eZdZdZdZdd�Zdd�ZeZZZ	dZ
dS)	r��
c	sx|j�}|dkr|dkp&|dko&|dks:t|j||||��|jdd	�}d�t�fdd
�|jj�D��}t|||jdd�S)a�Return a Request or None in response to a redirect.

        This is called by the http_error_30x methods when a
        redirection response is received.  If a redirection should
        take place, return a new Request to allow http_error_30x to
        perform the redirect.  Otherwise, raise HTTPError if no-one
        else should try to handle this url.  Return None if you can't
        but another Handler might.
        �-�.�/�3r��HEADr�� z%20�content-length�content-typec3s&|]\}}|j��kr||fVqdS)N)rt)�.0�k�v)�CONTENT_HEADERSrLrM�	<genexpr>�sz7HTTPRedirectHandler.redirect_request.<locals>.<genexpr>T)rer}r~)r�r�r�r�)r�r�)r�r�r�)r�r�)	r�rrp�replacer�rer{rr})	r�r�rdr�r�re�newurl�mZ
newheadersrL)r�rMr��s
z$HTTPRedirectHandler.redirect_requestc
CsNd|kr|d}nd|kr$|d}ndSt|�}|jdkrRt||d||f||��|jrp|jrpt|�}d|d	<t|�}t|d
tj	d�}t
|j|�}|j||||||�}|dkr�dSt
|d��r|j}	|_|	j|d
�|jks�t|	�|jk�rt|j||j|||��ni}	|_|_|	j|d
�d|	|<|j�|j�|jj||jd�S)N�location�urir�r��ftprnz+%s - Redirection to url '%s' is not allowed�/r:z
iso-8859-1)�encoding�safe�
redirect_dictrrR)rJ)r�r�r�rn)r�schemerrXZnetlocr�rr	�stringZpunctuationrrpr�r�rr��max_repeatsr`�max_redirections�inf_msgr_r�r�rGrJ)
r�r�rdr�r�rer��urlparts�newZvisitedrLrLrM�http_error_302�s@



z"HTTPRedirectHandler.http_error_302zoThe HTTP server returned a redirect error that would lead to an infinite loop.
The last 30x error message was:
N)r�r�r�rrr�r
�http_error_301�http_error_303�http_error_307rrLrLrLrMr�s&<c	Cs�t|�\}}|jd�s d}|}n:|jd�s6td|��|jdd�}|dkrNd}|d|�}t|�\}}|dk	r|t|�\}}nd}}||||fS)aReturn (scheme, user, password, host/port) given a URL or an authority.

    If a URL is supplied, it must have an authority (host:port) component.
    According to RFC 3986, having an authority component means the URL must
    have two slashes after the scheme.
    r�Nz//zproxy URL with no authority: %rr:rRrS)rr�rBr�rr)	�proxyrZr_scheme�	authority�endZuserinfo�hostport�user�passwordrLrLrM�_parse_proxy�s

rc@s"eZdZdZddd�Zdd�ZdS)r�dNcCs^|dkrt�}t|d�s td��||_x2|j�D]&\}}t|d||||jfdd��q0WdS)N�keyszproxies must be a mappingz%s_opencSs||||�S)NrL)�rrr�r�rLrLrM�<lambda>%sz'ProxyHandler.__init__.<locals>.<lambda>)r5r��AssertionError�proxiesr{�setattrr�)r�rr�rHrLrLrMr�s
zProxyHandler.__init__cCs�|j}t|�\}}}}|dkr"|}|jr6t|j�r6dS|rv|rvdt|�t|�f}	tj|	j��jd�}
|j	dd|
�t|�}|j
||�||ks�|dkr�dS|jj||j
d�SdS)Nz%s:%s�asciizProxy-authorizationzBasic r�)rJ)r�rrv�proxy_bypassr
�base64�	b64encode�encode�decoder|r�r�rGrJ)r�r�rr�Z	orig_typeZ
proxy_typerrrZ	user_passZcredsrLrLrMr�(s zProxyHandler.proxy_open)N)r�r�r�r�r�r�rLrLrLrMrs

c@s6eZdZdd�Zdd�Zdd�Zd
dd	�Zd
d�ZdS)r cCs
i|_dS)N)�passwd)r�rLrLrMr�FszHTTPPasswordMgr.__init__cs`t|t�r|g}|�jkr$i�j|<x6dD].�t��fdd�|D��}||f�j||<q*WdS)NTFcsg|]}�j|���qSrL)�
reduce_uri)r��u)�default_portr�rLrM�
<listcomp>Qsz0HTTPPasswordMgr.add_password.<locals>.<listcomp>)TF)r�r�r"�tuple)r��realmr�rr"�reduced_urirL)r%r�rM�add_passwordIs



zHTTPPasswordMgr.add_passwordc	Cs`|jj|i�}xLdD]D}|j||�}x2|j�D]&\}}x|D]}|j||�r<|Sq<Wq.WqWdS)NTF)TF)NN)r"r�r#r{�	is_suburi)	r�r(�authuriZdomainsr%�reduced_authuriZurisZauthinfor�rLrLrM�find_user_passwordTs

z"HTTPPasswordMgr.find_user_passwordTc
Cs�t|�}|dr.|d}|d}|dp*d}nd}|}d}t|�\}}|r~|dkr~|dk	r~ddd�j|�}	|	dk	r~d	||	f}||fS)
z@Accept authority or URI and extract only the authority and path.rRrr:r�N�Pi�)r�r�z%s:%d)rr
r�)
r�r�r%�partsrrrXrv�portZdportrLrLrMr#^s zHTTPPasswordMgr.reduce_uricCsR||krdS|d|dkr dStj|d|df�}t|�t|d�krNdSdS)zcCheck if test is below base in a URI tree

        Both args must be URIs in reduced form.
        TrFrR)�	posixpath�commonprefixr`)r��base�test�commonrLrLrMr+uszHTTPPasswordMgr.is_suburiN)T)r�r�r�r�r*r.r#r+rLrLrLrMr Ds


c@seZdZdd�ZdS)r!cCs0tj|||�\}}|dk	r"||fStj|d|�S)N)r r.)r�r(r,rrrLrLrMr.�s

z2HTTPPasswordMgrWithDefaultRealm.find_user_passwordN)r�r�r�r.rLrLrLrMr!�scs<eZdZ�fdd�Zd
�fdd�	Zddd�Zdd	�Z�ZS)r"csi|_t�j||�dS)N)�
authenticated�superr�)r�r��kwargs)�	__class__rLrMr��sz%HTTPPasswordMgrWithPriorAuth.__init__Fcs<|j||�|dk	r&t�jd|||�t�j||||�dS)N)�update_authenticatedr8r*)r�r(r�rr"�is_authenticated)r:rLrMr*�sz)HTTPPasswordMgrWithPriorAuth.add_passwordcCsFt|t�r|g}x0dD](}x"|D]}|j||�}||j|<q WqWdS)NTF)TF)r�r�r#r7)r�r�r<r%r$r)rLrLrMr;�s


z1HTTPPasswordMgrWithPriorAuth.update_authenticatedcCsDx>dD]6}|j||�}x$|jD]}|j||�r|j|SqWqWdS)NTF)TF)r#r7r+)r�r,r%r-r�rLrLrMr<�s

z-HTTPPasswordMgrWithPriorAuth.is_authenticated)F)F)r�r�r�r�r*r;r<�
__classcell__rLrL)r:rMr"�s

c@sTeZdZejdej�Zddd�Zdd�Zdd�Z	d	d
�Z
dd�Zd
d�ZeZ
eZdS)r#z1(?:^|,)[ 	]*([^ 	,]+)[ 	]+realm=(["']?)([^"']*)\2NcCs"|dkrt�}||_|jj|_dS)N)r r"r*)r�Zpassword_mgrrLrLrMr��sz!AbstractBasicAuthHandler.__init__ccstd}xFtjj|�D]6}|j�\}}}|d	kr:tjdtd�||fVd}qW|sp|rb|j�d}nd}|dfVdS)
NF�"�'zBasic Auth Realm was unquoted�Trrn)r>r?)r#�rx�finditer�groupsr?r@�UserWarning�split)r��headerZfound_challengeZmorr	r(rLrLrM�_parse_realm�s
z%AbstractBasicAuthHandler._parse_realmc	Cs~|j|�}|sdSd}xL|D]D}x>|j|�D]0\}}|j�dkrF|}q,|dk	r,|j|||�Sq,WqW|dk	rztd|f��dS)N�basiczBAbstractBasicAuthHandler does not support the following scheme: %r)Zget_allrGrt�retry_http_basic_authrB)	r��authreqrvr�reZunsupportedrFrr(rLrLrM�http_error_auth_reqed�s

z.AbstractBasicAuthHandler.http_error_auth_reqedcCs||jj||�\}}|dk	rtd||f}dtj|j��jd�}|j|jd�|krTdS|j|j|�|j	j
||jd�SdSdS)Nz%s:%szBasic r)rJ)r"r.rrr r!rq�auth_headerr�r�rGrJ)r�rvr�r(r�pw�raw�authrLrLrMrI�sz.AbstractBasicAuthHandler.retry_http_basic_authcCsxt|jd�s|jj|j�r"|S|jd�st|jjd|j�\}}dj||�j�}tj	|�j
�}|jddj|j���|S)Nr<�
Authorizationz{0}:{1}zBasic {})
r�r"r<rpr�r.r�r rZstandard_b64encoder!r��strip)r�r�rr"ZcredentialsZauth_strrLrLrM�http_requests
z%AbstractBasicAuthHandler.http_requestcCsLt|jd�rHd|jko dknr8|jj|jd�n|jj|jd�|S)Nr<r�i,TF)r�r"r�r;rp)r�r�r�rLrLrMr�s
z&AbstractBasicAuthHandler.http_response)N)r�r�r��re�compile�IrAr�rGrKrIrRr��
https_requestr�rLrLrLrMr#�s

c@seZdZdZdd�ZdS)r$rPcCs|j}|jd|||�}|S)Nzwww-authenticate)rprK)r�r�rdr�r�rerHr�rLrLrM�http_error_401 s
z#HTTPBasicAuthHandler.http_error_401N)r�r�r�rLrWrLrLrLrMr$sc@seZdZdZdd�ZdS)r%zProxy-authorizationcCs|j}|jd|||�}|S)Nzproxy-authenticate)rvrK)r�r�rdr�r�rerr�rLrLrM�http_error_407+s
z$ProxyBasicAuthHandler.http_error_407N)r�r�r�rLrXrLrLrLrMr%'sc@sNeZdZddd�Zdd�Zdd�Zdd	�Zd
d�Zdd
�Zdd�Z	dd�Z
dS)r&NcCs4|dkrt�}||_|jj|_d|_d|_d|_dS)Nr)r r"r*�retried�nonce_count�
last_nonce)r�r"rLrLrMr�Es
z"AbstractDigestAuthHandler.__init__cCs
d|_dS)Nr)rY)r�rLrLrM�reset_retry_countNsz+AbstractDigestAuthHandler.reset_retry_countcCs||j|d�}|jdkr*t|jdd|d��n|jd7_|rx|j�d}|j�dkr`|j||�S|j�dkrxtd|��dS)	N�i�zdigest auth failedrRrZdigestrHzEAbstractDigestAuthHandler does not support the following scheme: '%s')r�rYrrprErt�retry_http_digest_authrB)r�rLrvr�rerJrrLrLrMrKQs


z/AbstractDigestAuthHandler.http_error_auth_reqedcCsz|jdd�\}}ttdt|���}|j||�}|rvd|}|jj|jd�|krRdS|j|j|�|j	j
||jd�}|SdS)Nr�rRz	Digest %s)rJ)rE�parse_keqv_list�filter�parse_http_list�get_authorizationrer�rLr�r�rGrJ)r�r�rO�tokenZ	challenge�chalZauth_valZresprLrLrMr^esz0AbstractDigestAuthHandler.retry_http_digest_authcCs@d|j|tj�f}|jd�td�}tj|�j�}|dd�S)Nz	%s:%s:%s:rrQ�)rZ�timeZctimer �_randombytes�hashlib�sha1�	hexdigest)r��nonce�s�b�digrLrLrM�
get_cnonceqsz$AbstractDigestAuthHandler.get_cnoncecCs�y6|d}|d}|jd�}|jdd�}|jdd�}Wntk
rJdSX|j|�\}}	|dkrfdS|jj||j�\}
}|
dkr�dS|jdk	r�|j|j|�}nd}d|
||f}
d|j�|j	f}|d	k�r.||j
kr�|jd
7_nd
|_||_
d|j}|j|�}d||||||�f}|	||
�|�}n2|dk�rT|	||
�d|||�f�}nt
d
|��d|
|||j	|f}|�r�|d|7}|�r�|d|7}|d|7}|�r�|d||f7}|S)Nr(rk�qop�	algorithm�MD5�opaquez%s:%s:%sz%s:%srOrRz%08xz%s:%s:%s:%s:%szqop '%s' is not supported.z>username="%s", realm="%s", nonce="%s", uri="%s", response="%s"z
, opaque="%s"z
, digest="%s"z, algorithm="%s"z, qop=auth, nc=%s, cnonce="%s")r��KeyError�get_algorithm_implsr"r.rprI�get_entity_digestr�r�r[rZror)r�r�rdr(rkrprqrs�H�KDrrMZentdigZA1ZA2ZncvalueZcnonceZnoncebitZrespdigr4rLrLrMrb|sV








z+AbstractDigestAuthHandler.get_authorizationcsD|dkrdd��n|dkr$dd��ntd|���fdd�}�|fS)NrrcSstj|jd��j�S)Nr)rhZmd5r rj)�xrLrLrMr�sz?AbstractDigestAuthHandler.get_algorithm_impls.<locals>.<lambda>ZSHAcSstj|jd��j�S)Nr)rhrir rj)ryrLrLrMr�sz.Unsupported digest authentication algorithm %rcs�d||f�S)Nz%s:%srL)rl�d)rwrLrMr�s)rB)r�rqrxrL)rwrMru�s

z-AbstractDigestAuthHandler.get_algorithm_implscCsdS)NrL)r�rIrdrLrLrMrv�sz+AbstractDigestAuthHandler.get_entity_digest)N)r�r�r�r�r\rKr^rorbrurvrLrLrLrMr&:s
	<
c@s eZdZdZdZdZdd�ZdS)r'z�An authentication protocol defined by RFC 2069

    Digest authentication improves on basic authentication because it
    does not transmit passwords in the clear.
    rPi�cCs*t|j�d}|jd|||�}|j�|S)NrRzwww-authenticate)rrprKr\)r�r�rdr�r�rerv�retryrLrLrMrW�s

z$HTTPDigestAuthHandler.http_error_401N)r�r�r�r�rLr�rWrLrLrLrMr'�sc@seZdZdZdZdd�ZdS)r(zProxy-Authorizationi�cCs"|j}|jd|||�}|j�|S)Nzproxy-authenticate)rvrKr\)r�r�rdr�r�rervr{rLrLrMrX�s

z%ProxyDigestAuthHandler.http_error_407N)r�r�r�rLr�rXrLrLrLrMr(�sc@s6eZdZd
dd�Zdd�Zdd�Zdd	�Zd
d�ZdS)�AbstractHTTPHandlerrcCs
||_dS)N)�_debuglevel)r��
debuglevelrLrLrMr��szAbstractHTTPHandler.__init__cCs
||_dS)N)r})r��levelrLrLrM�set_http_debuglevel�sz'AbstractHTTPHandler.set_http_debuglevelcCstjjj|j|j��S)N)r�r��HTTPConnection�_get_content_lengthrIr�)r�rurLrLrMr��sz'AbstractHTTPHandler._get_content_lengthcCs
|j}|std��|jdk	r�|j}t|t�r8d}t|��|jd�sN|jdd�|jd�r�|jd�r�|j|�}|dk	r�|jdt|��n|jdd�|}|j	�r�t
|j�\}}t|�\}}	|jd�s�|jd|�x2|j
jD]&\}
}|
j�}
|j|
�s�|j|
|�q�W|S)	Nz
no host givenz\POST data should be bytes, an iterable of bytes, or a file object. It cannot be of type str.zContent-typez!application/x-www-form-urlencodedzContent-lengthzTransfer-encodingZchunkedro)rvrrIr�r�r�r�r�r�r�rr�rr�r�r�)r�rurvrIr�Zcontent_lengthZsel_hostrZselZsel_pathr[r�rLrLrM�do_request_�s>





zAbstractHTTPHandler.do_request_c
s\|j}|std��||fd|ji|��}|j|j�t|j���jt�fdd�|jj	�D���d�d<tdd��j	�D���|j
r�i}d}|�kr��|||<�|=|j|j
|d	�y`y&|j|j
�|j|j�|jd
�d�Wn,tk
�r
}zt|��WYdd}~XnX|j�}	Wn|j��YnX|j�rF|jj�d|_|j�|	_|	j|	_|	S)
z�Return an HTTPResponse object for the request, using http_class.

        http_class must implement the HTTPConnection API from http.client.
        z
no host givenrJc3s"|]\}}|�kr||fVqdS)NrL)r�r�r�)rerLrMr�)sz.AbstractHTTPHandler.do_open.<locals>.<genexpr>r��
Connectioncss|]\}}|j�|fVqdS)N)�title)r�r[r�rLrLrMr�6szProxy-Authorization)rezTransfer-encoding)Zencode_chunkedN)rvrrJZset_debuglevelr}r�rxr�rer{rzZ
set_tunnelrur�r�rIr�rm�getresponser�Zsockr�rH�reasonr�)
r�Z
http_classr�Zhttp_conn_argsrvr�Ztunnel_headersZproxy_auth_hdr�errrrL)rerMr�s@
"

zAbstractHTTPHandler.do_openN)r)r�r�r�r�r�r�r�r�rLrLrLrMr|�s

&r|c@seZdZdd�ZejZdS)r)cCs|jtjj|�S)N)r�r�r�r�)r�r�rLrLrM�	http_open`szHTTPHandler.http_openN)r�r�r�r�r|r�rRrLrLrLrMr)^sr�c@s$eZdZddd�Zdd�ZejZdS)rErNcCstj||�||_||_dS)N)r|r��_context�_check_hostname)r�r~r>�check_hostnamerLrLrMr�iszHTTPSHandler.__init__cCs|jtjj||j|jd�S)N)r>r�)r�r�r�r�r�r�)r�r�rLrLrM�
https_opennszHTTPSHandler.https_open)rNN)r�r�r�r�r�r|r�rVrLrLrLrMrEgs
rEc@s.eZdZddd�Zdd�Zdd�ZeZeZdS)	rNcCs$ddl}|dkr|jj�}||_dS)Nr)Zhttp.cookiejar�	cookiejarZ	CookieJar)r�r�r�rLrLrMr�ws
zHTTPCookieProcessor.__init__cCs|jj|�|S)N)r�Zadd_cookie_header)r�rurLrLrMrR}sz HTTPCookieProcessor.http_requestcCs|jj||�|S)N)r�Zextract_cookies)r�rur�rLrLrMr��sz!HTTPCookieProcessor.http_response)N)r�r�r�r�rRr�rVr�rLrLrLrMrvs

c@seZdZdd�ZdS)r.cCs|j}td|��dS)Nzunknown url type: %s)r�r)r�r�r�rLrLrMr��szUnknownHandler.unknown_openN)r�r�r�r�rLrLrLrMr.�scCsRi}xH|D]@}|jdd�\}}|ddkrB|ddkrB|dd�}|||<q
W|S)z>Parse list of key=value strings where keys are not duplicated.�=rRrr>rSrS)rE)�lZparsedZeltr�r�rLrLrMr_�s
r_cCs�g}d}d}}xt|D]l}|r,||7}d}q|rV|dkr@d}qn|dkrLd}||7}q|dkrn|j|�d}q|dkrzd}||7}qW|r�|j|�dd�|D�S)	apParse lists as described by RFC 2068 Section 2.

    In particular, parse comma-separated lists where the elements of
    the list may include quoted-strings.  A quoted-string could
    contain a comma.  A non-quoted string could have quotes in the
    middle.  Neither commas nor quotes count if they are escaped.
    Only double-quotes count, not single-quotes.
    rnF�\Tr>�,cSsg|]}|j��qSrL)rQ)r��partrLrLrMr&�sz#parse_http_list.<locals>.<listcomp>)r])rl�resr��escaper	ZcurrLrLrMra�s4	


rac@s(eZdZdd�ZdZdd�Zdd�ZdS)r*cCs\|j}|dd�dkrN|dd�dkrN|jrN|jdkrN|j|j�krXtd��n
|j|�SdS)Nr:z//r@r��	localhostz-file:// scheme is supported only on localhost)r�rv�	get_namesr�open_local_file)r�r�rHrLrLrM�	file_open�s&

zFileHandler.file_openNcCs`tjdkrZy*ttjd�dtjtj��d�t_Wn$tjk
rXtjd�ft_YnXtjS)Nr�r:)r*�namesr'r��gethostbyname_ex�gethostname�gaierror�
gethostbyname)r�rLrLrMr��s
zFileHandler.get_namescCsddl}ddl}|j}|j}t|�}y�tj|�}|j}|jj	|j
dd�}	|j|�d}
|jd|
pbd||	f�}|r~t
|�\}}|s�|r�t|�|j�kr�|r�d||}
nd|}
tt|d�||
�SWn*tk
r�}zt|��WYdd}~XnXtd��dS)	NrT)�usegmtz6Content-type: %s
Content-length: %d
Last-modified: %s
z
text/plainzfile://�rbzfile not on local host)�email.utils�	mimetypesrvr�r4rW�stat�st_size�utils�
formatdate�st_mtime�
guess_type�message_from_stringr
�_safe_gethostbynamer�rrGrmr)r�r��emailr�rvrbZ	localfile�statsri�modified�mtyperer1Zorigurl�exprLrLrMr��s0
zFileHandler.open_local_file)r�r�r�r�r�r�r�rLrLrLrMr*�s
cCs&y
tj|�Stjk
r dSXdS)N)r�r�r�)rvrLrLrMr��s
r�c@seZdZdd�Zdd�ZdS)r+cCs.ddl}ddl}|j}|s"td��t|�\}}|dkr>|j}nt|�}t|�\}}|rdt|�\}}nd}t	|�}|pvd}|p~d}yt
j|�}Wn*tk
r�}zt|��WYdd}~XnXt
|j�\}	}
|	jd�}ttt	|��}|dd�|d}}|�r|d�r|dd�}y�|j||||||j�}
|�r8d�p:d}x:|
D]2}t|�\}}|j�dk�rB|dk�rB|j�}�qBW|
j||�\}}d}|j|j�d}|�r�|d
|7}|dk	�r�|dk�r�|d|7}tj|�}t|||j�S|jk
�r(}z$td|�}|jtj �d��WYdd}~XnXdS)Nrzftp error: no host givenrnr�rRrU�Dr��a�Ar�rzzContent-type: %s
zContent-length: %d
z
ftp error: %rr:rSrS)r�r�r�rUrzr�)!�ftplibr�rvrr
�FTP_PORTr^rrr
r�r�rmrr�rEr��map�connect_ftprJrrt�upper�retrfiler�rpr�r�r�
all_errors�with_traceback�sys�exc_info)r�r�r�r�rvr1rr"r�rX�attrs�dirsrN�fwr��attrr�rd�retrlenrer�r��excrLrLrM�ftp_open�s\



zFTPHandler.ftp_openc	Cst||||||dd�S)NF)�
persistent)�
ftpwrapper)r�rr"rvr1r�rJrLrLrMr�1szFTPHandler.connect_ftpN)r�r�r�r�r�rLrLrLrMr+�s5c@s<eZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
S)r,cCs"i|_i|_d|_d|_d|_dS)Nr�<re)�cacherJ�soonest�delay�	max_conns)r�rLrLrMr�8s
zCacheFTPHandler.__init__cCs
||_dS)N)r�)r��trLrLrM�
setTimeout?szCacheFTPHandler.setTimeoutcCs
||_dS)N)r�)r�r�rLrLrM�setMaxConnsBszCacheFTPHandler.setMaxConnscCsr|||dj|�|f}||jkr4tj�|j|j|<n,t||||||�|j|<tj�|j|j|<|j�|j|S)Nr�)�joinr�rfr�rJr��check_cache)r�rr"rvr1r�rJr�rLrLrMr�Es

zCacheFTPHandler.connect_ftpcCs�tj�}|j|krTx@t|jj��D].\}}||kr"|j|j�|j|=|j|=q"Wtt|jj���|_t	|j�|j
kr�x6t|jj��D]$\}}||jkr�|j|=|j|=Pq�Wtt|jj���|_dS)N)rfr�r�rJr{r�r��min�valuesr`r�)r�r�r�r�rLrLrMr�Ps

zCacheFTPHandler.check_cachecCs4x|jj�D]}|j�qW|jj�|jj�dS)N)r�r�r��clearrJ)r��connrLrLrM�clear_cacheds
zCacheFTPHandler.clear_cacheN)	r�r�r�r�r�r�r�r�r�rLrLrLrMr,5sc@seZdZdd�ZdS)r-cCs~|j}|jdd�\}}|jdd�\}}t|�}|jd�rNtj|�}|dd�}|sVd}tjd|t|�f�}t	t
j|�||�S)	N�:rRr�z;base64�ztext/plain;charset=US-ASCIIz$Content-type: %s
Content-length: %d
i����)rprEr�endswithr�decodebytesr�r�r`r�io�BytesIO)r�r�rHrrIZ	mediatypererLrLrM�	data_openks


zDataHandler.data_openN)r�r�r�r�rLrLrLrMr-jsr��nt)r4r3cCst|�S)zOS-specific conversion from a relative URL of the 'file' scheme
        to a file system path; not recommended for general use.)r
)�pathnamerLrLrMr4�scCst|�S)zOS-specific conversion from a file system path to a relative URL
        of the 'file' scheme; not recommended for general use.)r	)r�rLrLrMr3�sc@s�eZdZdZdZdeZd*dd�Zdd�Zdd	�Z	d
d�Z
dd
�Zd+dd�Zd,dd�Z
d-dd�Zd.dd�Zdd�Zd/dd�Zd0dd�Zdd�Zer�dd�Zd1d d!�Zd"d#�Zd$d%�Zd&d'�Zd2d(d)�ZdS)3r8a,Class to open URLs.
    This is a class rather than just a subroutine because we may need
    more than one set of global protocol-specific options.
    Note -- this is a base class for those who don't want the
    automatic handling of errors type 302 (relocated) and 401
    (authorization needed).NzPython-urllib/%scKs�dd|jji}tj|tdd�|dkr.t�}t|d�s@td��||_|j	d�|_
|j	d�|_d	|jfdg|_
g|_tj|_d|_t|_dS)
NzW%(class)s style of invoking requests is deprecated. Use newer urlopen functions/methods�classr@)�
stacklevelrzproxies must be a mapping�key_file�	cert_filez
User-Agent�Accept�*/*)r�r�)r:r�r?r@rAr5r�rrr�r�r��versionr��_URLopener__tempfilesrWrl�_URLopener__unlink�	tempcache�ftpcache)r�rZx509r�rLrLrMr��szURLopener.__init__cCs|j�dS)N)r�)r�rLrLrM�__del__�szURLopener.__del__cCs|j�dS)N)�cleanup)r�rLrLrMr��szURLopener.closecCsZ|jrFx2|jD](}y|j|�Wqtk
r4YqXqW|jdd�=|jrV|jj�dS)N)r�r�rmr�r�)r�rNrLrLrMr��s
zURLopener.cleanupcGs|jj|�dS)zdAdd a header to be used by the HTTP interface only
        e.g. u.addheader('Accept', 'sound/basic')N)r�r])r�r�rLrLrM�	addheader�szURLopener.addheadercCsntt|��}t|dd�}|jrL||jkrL|j|\}}t|d�}t|||�St|�\}}|s`d}||jkr�|j|}t|�\}}	t|	�\}
}|
|f}nd}d|}||_	|j
dd�}t||�s�|d	kr�|r�|j|||�S|j
||�Sy,|dk�rt||�|�St||�||�SWnVttfk
�r.�Yn<tk
�rh}
ztd
|
�jtj�d��WYdd}
~
XnXdS)z6Use URLopener().open(file) instead of open(file, 'r').z%/:=&?~#+!$,;'@()*[]|)rr�rNNZopen_�-r�r�zsocket errorr:)rrr	r�rGrrrrr�r�r��open_unknown_proxy�open_unknownr�rrrmr�r�r�)r�r�rIrbrerd�urltyperHr�	proxyhostrvr�r[r�rLrLrMrG�s<




zURLopener.opencCst|�\}}tdd|��dS)z/Overridable interface to open unknown URL type.z	url errorzunknown url typeN)rrm)r�r�rIr�rHrLrLrMr�szURLopener.open_unknowncCs t|�\}}tdd||��dS)z/Overridable interface to open unknown URL type.z	url errorzinvalid proxy for %sN)rrm)r�rr�rIr�rHrLrLrMr�	szURLopener.open_unknown_proxyc Cs&tt|��}|jr&||jkr&|j|St|�\}}|dkr�|sH|dkr�y.|j|�}|j�}|j�tt|�d�|fSt	k
r�}	zWYdd}	~	XnX|j
||�}�zH|j�}
|r�t
|d�}n|ddl}t|�\}
}t|p�d�\}
}t|p�d�\}}
t
|�pd�\}}
tjj|�d}|j|�\}}|jj|�tj|d�}z�||
f}|jdk	�r^||j|<d}d
}d}d}d	|
k�r�t|
d
�}|�r�||||�xH|j|�}|�s�P|t|�7}|j|�|d7}|�r�||||��q�WWd|j�XWd|j�X|dk�r"||k�r"td||f|��|S)ztretrieve(url) returns (filename, headers) for a local object
        or (tempfilename, headers) for a remote object.NrNrRrOrrnirQzcontent-lengthzContent-Lengthz1retrieval incomplete: got only %i out of %i bytesi rS)rrr�rr�rVr�r4rrmrGrZrrrWrX�splitextZmkstempr�r]�fdopenr^r_r`rar)r�rHrbrcrIr�Zurl1rdr�r�rerfrZZgarbagerX�suffix�fdrgrhrir_rjrkrLrLrM�retrievesl






zURLopener.retrievecCs(d}d}t|t�r<t|�\}}|r6t|�\}}t|�}|}nt|\}}t|�\}}t|�\}	}
|
}d}|	j�dkrvd}n:t|
�\}}
|r�t|�\}}|r�d|	||
f}t|�r�|}|s�tdd��|r�t|�}t	j
|j��jd�}nd}|�rt|�}t	j
|j��jd�}nd}||�}
i}|�r*d||d<|�r<d||d	<|�rJ||d
<d|d<x|j
D]\}}|||<�qZW|dk	�r�d
|d<|
jd|||�n|
jd||d�y|
j�}Wn"tjjk
�r�td��YnXd|jk�o�dkn�rt||jd||j�S|j||j|j|j|j|�SdS)a�Make an HTTP connection using connection_class.

        This is an internal method that should be called from
        open_http() or open_https().

        Arguments:
        - connection_factory should take a host name and return an
          HTTPConnection instance.
        - url is the url to retrieval or a host, relative-path pair.
        - data is payload for a POST request or None.
        Nr�z	%s://%s%sz
http errorz
no host givenrzBasic %szProxy-AuthorizationrPror�r�z!application/x-www-form-urlencodedzContent-Typer�r�)rez$http protocol error: bad status liner�i,zhttp:)r�r�rrr
rrtrrmrrr r!r�rur�r�r�Z
BadStatusLinerZstatusrr��
http_errorrdr�)r�Zconnection_factoryrHrIZuser_passwdZproxy_passwdrvr�Zrealhostr�r�Z
proxy_authrOZ	http_connrerFr�r�rLrLrM�_open_generic_httpQsr



zURLopener._open_generic_httpcCs|jtjj||�S)zUse HTTP protocol.)r�r�r�r�)r�rHrIrLrLrM�	open_http�szURLopener.open_httpc
Csbd|}t||�rPt||�}|dkr6||||||�}	n|||||||�}	|	rP|	S|j|||||�S)z�Handle http errors.

        Derived class can override this, or provide specific handlers
        named http_error_DDD where DDD is the 3-digit error code.z
http_error_%dN)r�r�r�)
r�rHrd�errcode�errmsgrerIr[rrgrLrLrMr��s

zURLopener.http_errorcCs|j�t||||d��dS)z>Default error handler: close the connection and raise OSError.N)r�r)r�rHrdr�r�rerLrLrMr��szURLopener.http_error_defaultcCstjj||j|jd�S)N)r�r�)r�r�r�r�r�)r�rvrLrLrM�_https_connection�szURLopener._https_connectioncCs|j|j||�S)zUse HTTPS protocol.)r�r�)r�rHrIrLrLrM�
open_https�szURLopener.open_httpscCs^t|t�std��|dd�dkrP|dd�dkrP|dd�j�dkrPtd	��n
|j|�SdS)
z/Use local file or FTP depending on form of URL.zEfile error: proxy support for file protocol currently not implementedNr:z//r@r��z
localhost/z-file:// scheme is supported only on localhost)r�r�rrtrBr�)r�rHrLrLrM�	open_file�s

4
zURLopener.open_filecCs\ddl}ddl}t|�\}}t|�}ytj|�}Wn0tk
rb}zt|j|j	��WYdd}~XnX|j
}	|jj|j
dd�}
|j|�d}|jd|p�d|	|
f�}|s�|}
|dd�dkr�d	|}
tt|d
�||
�St|�\}}|o�tj|�t�ft�k�rP|}
|dd�dk�r d	|}
n|dd�dk�r>td
|��tt|d
�||
�Std��dS)zUse local file.rNT)r�z6Content-Type: %s
Content-Length: %d
Last-modified: %s
z
text/plainrRr�zfile://r�r:z./zAlocal file url may start with / or file:. Unknown url of type: %sz#local file error: not on local host)r�r�rr4rWr�rmr�strerrorrbr�r�r�r�r�r�rrGr
r�r�r��thishostrB)r�rHr�r�rvrNZ	localnamer��erir�r�reZurlfiler1rLrLrMr��s: 
zURLopener.open_local_filecCs�t|t�std��ddl}t|�\}}|s2td��t|�\}}t|�\}}|r\t|�\}}nd}t|�}t|ppd�}t|p|d�}t	j
|�}|s�ddl}|j}nt
|�}t|�\}}	t|�}|jd�}
|
dd�|
d}
}|
o�|
d�r�|
dd�}
|
�r|
d�rd|
d<|||dj|
�f}t|j�tk�rlx8t|j�D]*}
|
|k�r>|j|
}|j|
=|j��q>Wy�||jk�r�t|||||
�|j|<|�s�d}nd	}x:|	D]2}t|�\}}|j�d
k�r�|dk�r�|j�}�q�W|j|j||�\}}|jd|�d}d}|�r|d|7}|dk	�r:|dk�r:|d|7}tj|�}t||d|�St�k
�r�}z td|�j t!j"�d��WYdd}~XnXdS)zUse FTP protocol.zCftp error: proxy support for ftp protocol currently not implementedrNzftp error: no host givenrnr�rRr�rUr�r�r�r�rzzftp:zContent-Type: %s
zContent-Length: %d
zftp error %rr:rSrS)r�r�r�rUrzr�)#r�r�rr�rr
rrr
r�r�r�r�r^rrEr�r`r��MAXFTPCACHEr�r�r�rrtr�r�r�r�r�r�	ftperrorsr�r�r�)r�rHr�rvrXr1rr"r�r�r�rNr�r�r�r�r�r�rdr�r�rer�rLrLrM�open_ftp�sp







zURLopener.open_ftpc	Cs<t|t�std��y|jdd�\}}Wntk
rDtdd��YnX|sNd}|jd�}|dkr�d	||d
�kr�||dd
�}|d
|�}nd}g}|jdtj	d
tj
tj����|jd|�|dkr�tj|j
d��jd�}nt|�}|jdt|��|jd�|j|�dj|�}tj|�}tj|�}t|||�S)zUse "data" URL.zEdata error: proxy support for data protocol currently not implementedr�rRz
data errorzbad data URLztext/plain;charset=US-ASCII�;rr�NrnzDate: %sz%a, %d %b %Y %H:%M:%S GMTzContent-type: %srrzlatin-1zContent-Length: %d�
)r�r�rrErBrm�rfindr]rfZstrftimeZgmtimerr�r r!r
r`r�r�r�r��StringIOr)	r�rHrIr�Zsemirr�re�frLrLrM�	open_data3s6






zURLopener.open_data)N)N)N)N)NNN)N)N)N)N)r�r�r�r�r�r�r�r�r�r�r�r�rGr�r�r�r�r�r�r�rCr�r�r�r�rr
rLrLrLrMr8�s.

$


B\


	 :c@s�eZdZdZdd�Zdd�Zd#dd�Zd	d
�Zd$dd�Zd%d
d�Z	d&dd�Z
d'dd�Zd(dd�Zd)dd�Z
d*dd�Zd+dd�Zd,dd�Zd-dd �Zd!d"�ZdS).r9z?Derived class with handlers for errors we can handle (perhaps).cOs(tj|f|�|�i|_d|_d|_dS)Nrr�)r8r��
auth_cache�tries�maxtries)r�r�r9rLrLrMr�`szFancyURLopener.__init__cCst||d||�S)z3Default error handling -- don't raise an exception.zhttp:)r)r�rHrdr�r�rerLrLrMr�fsz!FancyURLopener.http_error_defaultNc	
Csn|jd7_zR|jrJ|j|jkrJt|d�r4|j}n|j}|||dd|�S|j||||||�}|Sd|_XdS)z%Error 302 -- relocated (temporarily).rR�http_error_500i�z)Internal Server Error: Redirect RecursionNr)rr
r�rr��redirect_internal)	r�rHrdr�r�rerIr�rgrLrLrMr
js
zFancyURLopener.http_error_302c	Csxd|kr|d}nd|kr$|d}ndS|j�t|jd||�}t|�}|jd	krnt|||d|||��|j|�S)
Nr�r�r�r�r�r�rnz( Redirection to url '%s' is not allowed.)r�r�r�rn)r�rr�rrrrG)	r�rHrdr�r�rerIr�rrLrLrMr|s


z FancyURLopener.redirect_internalcCs|j||||||�S)z*Error 301 -- also relocated (permanently).)r
)r�rHrdr�r�rerIrLrLrMr�szFancyURLopener.http_error_301cCs|j||||||�S)z;Error 303 -- also relocated (essentially identical to 302).)r
)r�rHrdr�r�rerIrLrLrMr�szFancyURLopener.http_error_303cCs2|dkr|j||||||�S|j|||||�SdS)z1Error 307 -- relocated, but turn POST into error.N)r
r�)r�rHrdr�r�rerIrLrLrMr
�szFancyURLopener.http_error_307Fc
Cs�d|krtj||||||�|d}tjd|�}	|	sHtj||||||�|	j�\}
}|
j�dkrttj||||||�|s�tj||||||�d|jd}|dkr�t||�||�St||�|||�SdS)z_Error 401 -- authentication required.
        This function supports Basic authentication only.zwww-authenticatez![ 	]*([^ 	]+)[ 	]+realm="([^"]*)"rHZretry_�_basic_authN)r8r�rS�matchrCrtr�r�)
r�rHrdr�r�rerIr{�stuffrrr(r[rLrLrMrW�s&





zFancyURLopener.http_error_401c
Cs�d|krtj||||||�|d}tjd|�}	|	sHtj||||||�|	j�\}
}|
j�dkrttj||||||�|s�tj||||||�d|jd}|dkr�t||�||�St||�|||�SdS)zeError 407 -- proxy authentication required.
        This function supports Basic authentication only.zproxy-authenticatez![ 	]*([^ 	]+)[ 	]+realm="([^"]*)"rHZretry_proxy_rN)r8r�rSrrCrtr�r�)
r�rHrdr�r�rerIr{rrrr(r[rLrLrMrX�s&





zFancyURLopener.http_error_407cCs�t|�\}}d||}|jd}t|�\}}	t|	�\}	}
|	jd�d}|	|d�}	|j|	||�\}}
|pl|
srdSdt|dd�t|
dd�|	f}	d|	|
|jd<|dkr�|j|�S|j||�SdS)Nzhttp://r��@rRz%s:%s@%srn)r)rrrr��get_user_passwdr	rG)r�rHr(rIrvr�r�rr�r��
proxyselectorr�rr"rLrLrM�retry_proxy_http_basic_auth�s 

z*FancyURLopener.retry_proxy_http_basic_authcCs�t|�\}}d||}|jd}t|�\}}	t|	�\}	}
|	jd�d}|	|d�}	|j|	||�\}}
|pl|
srdSdt|dd�t|
dd�|	f}	d|	|
|jd<|dkr�|j|�S|j||�SdS)Nzhttps://r�rrRz%s:%s@%srn)r)rrrr�rr	rG)r�rHr(rIrvr�r�rr�r�rr�rr"rLrLrM�retry_proxy_https_basic_auth�s 

z+FancyURLopener.retry_proxy_https_basic_authc
Cs�t|�\}}|jd�d}||d�}|j|||�\}}|p>|sDdSdt|dd�t|dd�|f}d||}	|dkr�|j|	�S|j|	|�SdS)NrrRz%s:%s@%srn)rzhttp://)rr�rr	rG)
r�rHr(rIrvr�r�rr"r�rLrLrMrI�s
z$FancyURLopener.retry_http_basic_authc
Cs�t|�\}}|jd�d}||d�}|j|||�\}}|p>|sDdSdt|dd�t|dd�|f}d||}	|dkr�|j|	�S|j|	|�SdS)NrrRz%s:%s@%srn)rzhttps://)rr�rr	rG)
r�rHr(rIrvr�r�rr"r�rLrLrM�retry_https_basic_auth	s
z%FancyURLopener.retry_https_basic_authrcCs`|d|j�}||jkr2|r(|j|=n
|j|S|j||�\}}|sJ|rX||f|j|<||fS)Nr)rtr�prompt_user_passwd)r�rvr(r�r�rr"rLrLrMr	s


zFancyURLopener.get_user_passwdcCsTddl}y,td||f�}|jd|||f�}||fStk
rNt�dSXdS)z#Override this in a GUI environment!rNzEnter username for %s at %s: z#Enter password for %s in %s at %s: )NN)�getpass�input�KeyboardInterrupt�print)r�rvr(rrr"rLrLrMr$	sz!FancyURLopener.prompt_user_passwd)N)N)N)N)NF)NF)N)N)N)N)r)r�r�r�r�r�r�r
rrrr
rWrXrrrIrrrrLrLrLrMr9]s$










cCstdkrtjd�atS)z8Return the IP address of the magic hostname 'localhost'.Nr�)�
_localhostr�r�rLrLrLrMr�4	s
r�cCsPtdkrLyttjtj��d�aWn(tjk
rJttjd�d�aYnXtS)z,Return the IP addresses of the current host.Nr:r�)�	_thishostr'r�r�r�r�rLrLrLrMr<	srcCstdkrddl}|jatS)z1Return the set of errors raised by the FTP class.Nr)�
_ftperrorsr�r�)r�rLrLrMrG	srcCstdkrtjd�atS)z%Return an empty email Message object.Nrn)�
_noheadersr�r�rLrLrLrM�	noheadersP	s
r"c@sJeZdZdZddd�Zdd�Zdd	�Zd
d�Zdd
�Zdd�Z	dd�Z
dS)r�z;Class used by open_ftp() for cache of open FTP connections.NTc	CsX||_||_||_||_||_||_d|_||_y|j�Wn|j	��YnXdS)Nr)
rr"rvr1r�rJ�refcount�	keepalive�initr�)r�rr"rvr1r�rJr�rLrLrMr�]	szftpwrapper.__init__cCs\ddl}d|_|j�|_|jj|j|j|j�|jj|j	|j
�dj|j�}|jj
|�dS)Nrr�)r��busyZFTPr�Zconnectrvr1rJZloginrr"r�r��cwd)r�r�Z_targetrLrLrMr%m	s
zftpwrapper.initc-Cs�ddl}|j�|dkr"d}d}nd|}d}y|jj|�Wn*|jk
rh|j�|jj|�YnXd}|r�|r�yd|}|jj|�\}}WnR|jk
r�}z4t|�dd�d	kr�t	d
|�j
tj�d��WYdd}~XnX|�s�|jjd�|�rn|jj
�}	zJy|jj|�Wn4|jk
�rP}zt	d
|�|�WYdd}~XnXWd|jj|	�Xd|}nd
}|jj|�\}}d|_t|jd�|j�}
|jd7_|j�|
|fS)Nrrzr�zTYPE ArRzTYPE zRETR r@Z550z
ftp error: %rr:zLIST ZLISTr�)rzr�)r��endtransferr�Zvoidcmdr�r%ZntransfercmdZ
error_permr�rr�r�r��pwdr'r&r�makefile�
file_closer#r�)r�rNr�r��cmd�isdirr�r�r�r)ZftpobjrLrLrMr�v	sN
 
$
zftpwrapper.retrfilecCs
d|_dS)Nr)r&)r�rLrLrMr(�	szftpwrapper.endtransfercCsd|_|jdkr|j�dS)NFr)r$r#�
real_close)r�rLrLrMr��	s
zftpwrapper.closecCs4|j�|jd8_|jdkr0|jr0|j�dS)NrRr)r(r#r$r.)r�rLrLrMr+�	szftpwrapper.file_closecCs2|j�y|jj�Wnt�k
r,YnXdS)N)r(r�r�r)r�rLrLrMr.�	s
zftpwrapper.real_close)NT)r�r�r�r�r�r%r�r(r�r+r.rLrLrLrMr�Z	s
	-r�cCs�i}xBtjj�D]4\}}|j�}|r|dd�dkr|||dd�<qWdtjkr^|jdd�xXtjj�D]J\}}|dd�dkrj|j�}|r�|||dd	�<qj|j|dd
�d�qjW|S)aReturn a dictionary of scheme -> proxy server URL mappings.

    Scan the environment for variables named <scheme>_proxy;
    this seems to be the standard convention.  If you need a
    different way, you can pass a proxies dictionary to the
    [Fancy]URLopener constructor.

    �N�_proxyZREQUEST_METHODr�i����i����i����i����i����)rW�environr{rtr�)rr[r�rLrLrM�getproxies_environment�	s	
r2c
Cs�|dkrt�}y|d}Wntk
r.dSX|dkr<dSt|�\}}dd�|jd�D�}xP|D]H}|rb|jd	�}tj|�}d
|}tj||tj�s�tj||tj�rbdSqbWdS)z�Test if proxies should not be used for a particular host.

    Checks the proxy dict for the value of no_proxy, which should
    be a list of comma separated DNS suffixes, or '*' for all hosts.

    N�nor�*rRcSsg|]}|j��qSrL)rQ)r�rrLrLrMr&�	sz,proxy_bypass_environment.<locals>.<listcomp>r��.z
(.+\.)?%s$)	r2rtr
rE�lstriprSr�rrU)rvrZno_proxy�hostonlyr1Z
no_proxy_listr[�patternrLrLrM�proxy_bypass_environment�	s&


r9c
Csddlm}t|�\}}dd�}d|kr4|dr4dSd}x�|jd	f�D]�}|sPqFtjd
|�}|dk	�r|dkr�ytj|�}||�}Wntk
r�wFYnX||jd��}	|jd�}
|
dkr�d
|jd�j	d�d}
nt
|
dd��}
d|
}
||
?|	|
?k�rdSqF|||�rFdSqFWdS)aj
    Return True iff this host shouldn't be accessed using a proxy

    This function uses the MacOSX framework SystemConfiguration
    to fetch the proxy information.

    proxy_settings come from _scproxy._get_proxy_settings or get mocked ie:
    { 'exclude_simple': bool,
      'exceptions': ['foo.bar', '*.bar.com', '127.0.0.1', '10.1', '10.0/16']
    }
    r)�fnmatchcSsh|jd�}ttt|��}t|�dkr<|ddddgdd�}|dd>|dd>B|dd>B|d	BS)
Nr5r�r�rRrer:rQr@)rEr�r�r^r`)ZipAddrr0rLrLrM�ip2num
s

z,_proxy_bypass_macosx_sysconf.<locals>.ip2numr5Zexclude_simpleTN�
exceptionsz(\d+(?:\.\d+)*)(/\d+)?rRr:rQ� F)r:r
r�rSrr�r�rm�group�countr^)rv�proxy_settingsr:r7r1r<ZhostIPr�r�r4�maskrLrLrM�_proxy_bypass_macosx_sysconf�	s:



rC�darwin)�_get_proxy_settings�_get_proxiescCst�}t||�S)N)rErC)rvrArLrLrM�proxy_bypass_macosx_sysconf:
srGcCst�S)z�Return a dictionary of scheme -> proxy server URL mappings.

        This function uses the MacOSX framework SystemConfiguration
        to fetch the proxy information.
        )rFrLrLrLrM�getproxies_macosx_sysconf>
srHcCs t�}|rt||�St|�SdS)z�Return True, if host should be bypassed.

        Checks proxy settings gathered from the environment, if specified,
        or from the MacOSX framework SystemConfiguration.

        N)r2r9rG)rvrrLrLrMrH
s
rcCst�p
t�S)N)r2rHrLrLrLrMr5U
scCsi}yddl}Wntk
r$|SXy�|j|jd�}|j|d�d}|r�t|j|d�d�}d|kr�x�|jd�D]4}|jdd�\}}tjd	|�s�d
||f}|||<qrWn>|dd�dkr�||d
<n$d||d
<d||d<d||d<|j	�Wnt
ttfk
�rYnX|S)zxReturn a dictionary of scheme -> proxy server URL mappings.

        Win32 uses the registry to store proxies.

        rNz;Software\Microsoft\Windows\CurrentVersion\Internet Settings�ProxyEnableZProxyServerr�rrRz^([^/:]+)://z%s://%sr]zhttp:r�z	http://%sz
https://%sr�zftp://%sr�)
�winreg�ImportError�OpenKey�HKEY_CURRENT_USER�QueryValueExr�rErSrZClosermrBr�)rrJ�internetSettings�proxyEnableZproxyServer�pr�ZaddressrLrLrM�getproxies_registryZ
s8

rRcCst�p
t�S)z�Return a dictionary of scheme -> proxy server URL mappings.

        Returns settings gathered from the environment, if specified,
        or the registry.

        )r2rRrLrLrLrMr5�
sc&Cs~yddl}Wntk
r dSXy6|j|jd�}|j|d�d}t|j|d�d�}Wntk
rldSX|sz|r~dSt|�\}}|g}y tj	|�}||kr�|j
|�Wntk
r�YnXy tj|�}||kr�|j
|�Wntk
�r�YnX|jd�}xp|D]h}	|	dk�r*d|k�r*dS|	j
dd	�}	|	j
d
d�}	|	j
dd�}	x$|D]}
tj|	|
tj��rTdS�qTW�qWdS)
Nrz;Software\Microsoft\Windows\CurrentVersion\Internet SettingsrIZ
ProxyOverriderz<local>r5rRz\.r4z.*�?)rJrKrLrMrNr�rmr
r�r�r]ZgetfqdnrEr�rSrrU)rvrJrOrPZ
proxyOverrideZrawHostr1ZaddrZfqdnr5r�rLrLrM�proxy_bypass_registry�
sR







rTcCs t�}|rt||�St|�SdS)z�Return True, if host should be bypassed.

        Checks proxy settings gathered from the environment, if specified,
        or the registry.

        N)r2r9rT)rvrrLrLrMr�
s
)NNN)N)r�rr�r�rhZhttp.clientr�r�rWr2rSr�rr�rf�collectionsrZrTr?Zurllib.errorrrrZurllib.parserrrrr	r
rrr
rrrrrrrrrZurllib.responserrrDrKrC�__all__�version_infor�rFr�r0r1r\r6r7rT�ASCIIrrrwrrr2rr/rrrrr r!r"r#r$r%�urandomrgr&r'r(r|r)r�r�rEr]rr.r_rar*r�r+r,r-rr[Z
nturl2pathr4r3r�r8r9rr�rrr rr!r"r�r2r9rC�platformZ_scproxyrErFrGrHrr5rRrTrLrLrLrM�<module>Ds�P
T
?n$q*@
ov

+3:5!AW

_
#<

-	2
parse.cpython-36.opt-1.pyc000064400000103660151733320400011247 0ustar003

���ie��@s�dZddlZddlZddlZddlZddlZddddddd	d
ddd
ddddddddddgZddddddddd d!d"d#d$d%d&d'd(d)d*gZdddddd+dddd"d d!d,d#d$d%d-d'd(d&d.d/d0d)d*gZddd1d#ddd d!d$d%d2d3d"d&d4gZ	dd1d5d6d+ddd,d2d3g
Z
ddddd d!d"dd$d%d2d3gZddd1ddd6ddd d!d,dd#g
Zd7Z
d8Zd9d:d;gZd<ZiZd=d>�Zd?Zd@ZdAdB�ZeefdCdD�ZeefdEdF�ZdGdH�ZGdIdJ�dJe�ZGdKdL�dLe�ZGdMdN�dNe�ZGdOdP�dPee�ZGdQdR�dRee�ZddSlmZeddT�Z eddU�Z!eddV�Z"dWe _dXe j#_dYe j$_dZe!_d[e!j%_d\e!j&_d]e!j'_d^e!j(_d_e!j$_d`e"_e!j%je"j%_e!j&je"j&_e!j'je"j'_dae"j)_e!j(je"j(_e!j$je"j$_eZ*Gdbd�de e�Z+Gdcd�de!e�Z,Gddd�de"e�Z-Gded�de e�Z.Gdfd�de!e�Z/Gdgd�de"e�Z0dhdi�Z1e1�[1d�dkd�Z2dldm�Z3d�dndo�Z4dpdq�Z5drds�Z6dtdu�Z7dvdw�Z8d�dxd�Z9dyd�Z:dzd�Z;d�d{d�Z<d|d�Z=d}Z>da?d~d�Z@ejAd�ZBd�d�d�ZCd�d�d
�ZDGd�d��d�eE�ZFd�ZGdaHd�d�d�ZId�d�d�ZJeKd��ZLeMeL�ZNiZOGd�d��d�ejP�ZQd�d�d�ZRd�d�d
�ZSd�d�d�ZTd�dddeSfd�d	�ZUd�d��ZVd�d��ZWdaXd�d��ZYdaZd�d��Z[d�d��Z\d�d��Z]da^d�d��Z_d�d�d��Z`d�d��Zad�d��Zbd�d��Zcd�d��ZddS)�a3Parse (absolute and relative) URLs.

urlparse module is based upon the following RFC specifications.

RFC 3986 (STD66): "Uniform Resource Identifiers" by T. Berners-Lee, R. Fielding
and L.  Masinter, January 2005.

RFC 2732 : "Format for Literal IPv6 Addresses in URL's by R.Hinden, B.Carpenter
and L.Masinter, December 1999.

RFC 2396:  "Uniform Resource Identifiers (URI)": Generic Syntax by T.
Berners-Lee, R. Fielding, and L. Masinter, August 1998.

RFC 2368: "The mailto URL scheme", by P.Hoffman , L Masinter, J. Zawinski, July 1998.

RFC 1808: "Relative Uniform Resource Locators", by R. Fielding, UC Irvine, June
1995.

RFC 1738: "Uniform Resource Locators (URL)" by T. Berners-Lee, L. Masinter, M.
McCahill, December 1994

RFC 3986 is considered the current standard and any future changes to
urlparse module should conform with it.  The urlparse module is
currently not entirely compliant with this RFC due to defacto
scenarios for parsing, and for backward compatibility purposes, some
parsing quirks from older RFCs are retained. The testcases in
test_urlparse.py provides a good indicator of parsing behavior.

The WHATWG URL Parser spec should also be considered.  We are not compliant with
it either due to existing user code API behavior expectations (Hyrum's Law).
It serves as a useful guide when making changes.
�N�urlparse�
urlunparse�urljoin�	urldefrag�urlsplit�
urlunsplit�	urlencode�parse_qs�	parse_qsl�quote�
quote_plus�quote_from_bytes�unquote�unquote_plus�unquote_to_bytes�DefragResult�ParseResult�SplitResult�DefragResultBytes�ParseResultBytes�SplitResultBytes�Zftp�httpZgopherZnntpZimapZwais�fileZhttpsZshttpZmmsZprosperoZrtspZrtspuZsftpZsvnzsvn+sshZwsZwssZtelnetZsnewsZrsyncZnfsZgitzgit+sshZhdlZsipZsipsZtelZmailtoZnewszAabcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+-.z!	

 �	�
�
�cCstj�tj�dS)z,Clear the parse cache and the quoters cache.N)�_parse_cache�clear�
_safe_quoters�r!r!�$/usr/lib64/python3.6/urllib/parse.py�clear_cache`sr#�ascii�strictcCs|S)Nr!)�objr!r!r"�_nooposr'cCs|j||�S)N)�encode)r&�encoding�errorsr!r!r"�_encode_resultrsr+cst��fdd�|D��S)Nc3s"|]}|r|j���ndVqdS)rN)�decode)�.0�x)r)r*r!r"�	<genexpr>xsz_decode_args.<locals>.<genexpr>)�tuple)�argsr)r*r!)r)r*r"�_decode_argsvsr2cGsZt|dt�}x.|dd�D]}|rt|t�|krtd��qW|rL|tfSt|�tfS)Nr�z$Cannot mix str and non-str arguments)�
isinstance�str�	TypeErrorr'r2r+)r1Z	str_input�argr!r!r"�_coerce_argszs
r8c@seZdZdZfZddd�ZdS)�_ResultMixinStrz>Standard approach to encoding parsed results from str to bytesr$r%cs|j��fdd�|D��S)Nc3s|]}|j���VqdS)N)r()r-r.)r)r*r!r"r/�sz)_ResultMixinStr.encode.<locals>.<genexpr>)�_encoded_counterpart)�selfr)r*r!)r)r*r"r(�sz_ResultMixinStr.encodeN)r$r%)�__name__�
__module__�__qualname__�__doc__�	__slots__r(r!r!r!r"r9�sr9c@seZdZdZfZddd�ZdS)�_ResultMixinBytesz>Standard approach to decoding parsed results from bytes to strr$r%cs|j��fdd�|D��S)Nc3s|]}|j���VqdS)N)r,)r-r.)r)r*r!r"r/�sz+_ResultMixinBytes.decode.<locals>.<genexpr>)�_decoded_counterpart)r;r)r*r!)r)r*r"r,�sz_ResultMixinBytes.decodeN)r$r%)r<r=r>r?r@r,r!r!r!r"rA�srAc@sDeZdZdZfZedd��Zedd��Zedd��Zedd	��Z	d
S)�_NetlocResultMixinBasezHShared methods for the parsed result objects containing a netloc elementcCs
|jdS)Nr)�	_userinfo)r;r!r!r"�username�sz_NetlocResultMixinBase.usernamecCs
|jdS)Nr3)rD)r;r!r!r"�password�sz_NetlocResultMixinBase.passwordcCsD|jd}|sdSt|t�r dnd}|j|�\}}}|j�||S)Nr�%�%)�	_hostinfor4r5�	partition�lower)r;�hostname�	separatorZpercentZzoner!r!r"rL�s
z_NetlocResultMixinBase.hostnamecCs@|jd}|dk	r<t|d�}d|ko.dkns<td��|S)Nr3�
ri��zPort out of range 0-65535)rI�int�
ValueError)r;�portr!r!r"rQ�s

z_NetlocResultMixinBase.portN)
r<r=r>r?r@�propertyrErFrLrQr!r!r!r"rC�srCc@s(eZdZfZedd��Zedd��ZdS)�_NetlocResultMixinStrcCsD|j}|jd�\}}}|r4|jd�\}}}|s<d}nd}}||fS)N�@�:)�netloc�
rpartitionrJ)r;rV�userinfo�	have_info�hostinforE�
have_passwordrFr!r!r"rD�sz_NetlocResultMixinStr._userinfocCsl|j}|jd�\}}}|jd�\}}}|rL|jd�\}}}|jd�\}}}n|jd�\}}}|sdd}||fS)NrT�[�]rU)rVrWrJ)r;rV�_rZ�have_open_br�	bracketedrLrQr!r!r"rI�sz_NetlocResultMixinStr._hostinfoN)r<r=r>r@rRrDrIr!r!r!r"rS�srSc@s(eZdZfZedd��Zedd��ZdS)�_NetlocResultMixinBytescCsD|j}|jd�\}}}|r4|jd�\}}}|s<d}nd}}||fS)N�@�:)rVrWrJ)r;rVrXrYrZrEr[rFr!r!r"rD�sz!_NetlocResultMixinBytes._userinfocCsl|j}|jd�\}}}|jd�\}}}|rL|jd�\}}}|jd�\}}}n|jd�\}}}|sdd}||fS)Nrb�[�]rc)rVrWrJ)r;rVr^rZr_r`rLrQr!r!r"rI�sz!_NetlocResultMixinBytes._hostinfoN)r<r=r>r@rRrDrIr!r!r!r"ra�sra)�
namedtuplezurl fragmentz!scheme netloc path query fragmentz(scheme netloc path params query fragmentz�
DefragResult(url, fragment)

A 2-tuple that contains the url without fragment identifier and the fragment
identifier as a separate argument.
z$The URL with no fragment identifier.z�
Fragment identifier separated from URL, that allows indirect identification of a
secondary resource by reference to a primary resource and additional identifying
information.
z�
SplitResult(scheme, netloc, path, query, fragment)

A 5-tuple that contains the different components of a URL. Similar to
ParseResult, but does not split params.
z%Specifies URL scheme for the request.z0
Network location where the request is made to.
z@
The hierarchical path, such as the path to a file to download.
z�
The query component, that contains non-hierarchical data, that along with data
in path component, identifies a resource in the scope of URI's scheme and
network location.
z�
Fragment identifier, that allows indirect identification of a secondary resource
by reference to a primary resource and additional identifying information.
zr
ParseResult(scheme, netloc, path, params,  query, fragment)

A 6-tuple that contains components of a parsed URL.
z�
Parameters for last path element used to dereference the URI in order to provide
access to perform some operation on the resource.
c@seZdZfZdd�ZdS)rcCs |jr|jd|jS|jSdS)N�#)�fragment�url)r;r!r!r"�geturlEszDefragResult.geturlN)r<r=r>r@rjr!r!r!r"rCsc@seZdZfZdd�ZdS)rcCst|�S)N)r)r;r!r!r"rjMszSplitResult.geturlN)r<r=r>r@rjr!r!r!r"rKsc@seZdZfZdd�ZdS)rcCst|�S)N)r)r;r!r!r"rjRszParseResult.geturlN)r<r=r>r@rjr!r!r!r"rPsc@seZdZfZdd�ZdS)rcCs |jr|jd|jS|jSdS)N�#)rhri)r;r!r!r"rjXszDefragResultBytes.geturlN)r<r=r>r@rjr!r!r!r"rVsc@seZdZfZdd�ZdS)rcCst|�S)N)r)r;r!r!r"rj`szSplitResultBytes.geturlN)r<r=r>r@rjr!r!r!r"r^sc@seZdZfZdd�ZdS)rcCst|�S)N)r)r;r!r!r"rjeszParseResultBytes.geturlN)r<r=r>r@rjr!r!r!r"rcscCs8ttfttfttff}x|D]\}}||_||_qWdS)N)rrrrrrr:rB)Z
_result_pairsZ_decodedZ_encodedr!r!r"�_fix_result_transcodingis
rlTc
Csft||�\}}}t|||�}|\}}}}}|tkrHd|krHt|�\}}nd}t||||||�}	||	�S)a#Parse a URL into 6 components:
    <scheme>://<netloc>/<path>;<params>?<query>#<fragment>
    Return a 6-tuple: (scheme, netloc, path, params, query, fragment).
    Note that we don't break the components up in smaller bits
    (e.g. netloc is a single string) and we don't expand % escapes.�;r)r8r�uses_params�_splitparamsr)
ri�scheme�allow_fragments�_coerce_resultZsplitresultrV�queryrh�params�resultr!r!r"rvscCsRd|kr,|jd|jd��}|dkr6|dfSn
|jd�}|d|�||dd�fS)N�/rmrrr3)�find�rfind)ri�ir!r!r"ro�s

rocCsLt|�}x*dD]"}|j||�}|dkrt||�}qW|||�||d�fS)Nz/?#r)�lenrw�min)ri�start�delim�cZwdelimr!r!r"�_splitnetloc�s
rcCs�|stdd�|D��rdSddl}|jdd�}|jdd�}|jdd�}|jdd�}|jd	|�}||krndSx(d
D] }||krttd|dd
��qtWdS)Ncss|]}t|�dkVqdS)�N)�ord)r-r~r!r!r"r/�sz_checknetloc.<locals>.<genexpr>rrTrrUrg�?�NFKCz/?#@:znetloc 'z' contains invalid z#characters under NFKC normalization)�any�unicodedata�replace�	normalizerP)rVr��nZnetloc2r~r!r!r"�_checknetloc�s
r�cCsxtD]}|j|d�}qW|S)Nr)�_UNSAFE_URL_BYTES_TO_REMOVEr�)ri�br!r!r"�_remove_unsafe_bytes_from_url�s
r�cCst|jd�d}|jd�\}}}|rX|r.td��|jd�\}}}|rh|jd�rhtd��n|jd�\}}}t|�dS)NrT�r\zInvalid IPv6 URLr]rU)rWrJrP�
startswith�_check_bracketed_host)rVZhostname_and_portZbefore_bracketr_r`rLr^rQr!r!r"�_check_bracketed_netloc�s
r�cCsB|jd�r tjd|�s>td��ntj|�}t|tj�r>td��dS)N�vz\Av[a-fA-F0-9]+\..+\ZzIPvFuture address is invalidz%An IPv4 address cannot be in brackets)r��re�matchrP�	ipaddressZ
ip_addressr4ZIPv4Address)rLZipr!r!r"r��s


r�c
Cs�t||�\}}}t|�}t|�}|jt�}|jt�}t|�}|||t|�t|�f}tj|d�}|rj||�St	t�t
kr|t�d}}}|jd�}	|	dk�r�|d|	�dk�r~|d|	�j
�}||	dd�}|dd�dk�rt|d�\}}d	|ko�d
|k�sd
|k�rd	|k�rtd��|�r<d|k�r<|jdd�\}}d
|k�rV|jd
d�\}}t|�t|||||�}
|
t|<||
�Sxd|d|	�D]}|tk�r�P�q�W||	dd�}|�s�tdd�|D���r�|d|	�j
�|}}|dd�dk�rPt|d�\}}d	|k�rd
|k�s,d
|k�r4d	|k�r4td��d	|k�rPd
|k�rPt|�|�rpd|k�rp|jdd�\}}d
|k�r�|jd
d�\}}t|�t|||||�}
|
t|<||
�S)aParse a URL into 5 components:
    <scheme>://<netloc>/<path>?<query>#<fragment>
    Return a 5-tuple: (scheme, netloc, path, query, fragment).
    Note that we don't break the components up in smaller bits
    (e.g. netloc is a single string) and we don't expand % escapes.NrrUrrr3r�z//r\r]zInvalid IPv6 URLrgr�css|]}|dkVqdS)�
0123456789Nr!)r-r~r!r!r"r/�szurlsplit.<locals>.<genexpr>)r8r��lstrip�_WHATWG_C0_CONTROL_OR_SPACE�strip�bool�typer�getrz�MAX_CACHE_SIZEr#rwrKrrP�splitr�r�scheme_charsr�r�)
rirprqrr�key�cachedrVrsrhryr�r~�restr!r!r"r�sh






cCs<t|�\}}}}}}}|r&d||f}|t|||||f��S)z�Put a parsed URL back together again.  This may result in a
    slightly different, but equivalent URL, if the URL that was parsed
    originally had redundant delimiters, e.g. a ? with an empty query
    (the draft states that these are equivalent).z%s;%s)r8r)�
componentsrprVrirtrsrhrrr!r!r"rscCs�t|�\}}}}}}|s4|r`|tkr`|dd�dkr`|rP|dd�dkrPd|}d|pXd|}|rp|d|}|r�|d|}|r�|d	|}||�S)
akCombine the elements of a tuple as returned by urlsplit() into a
    complete URL as a string. The data argument can be any five-item iterable.
    This may result in a slightly different, but equivalent URL, if the URL that
    was parsed originally had unnecessary delimiters (for example, a ? with an
    empty query; the RFC states that these are equivalent).Nr�z//r3rvrrUr�rg)r8�uses_netloc)r�rprVrirsrhrrr!r!r"rs cCs�|s|S|s|St||�\}}}t|d|�\}}}}}}	t|||�\}
}}}
}}|
|ks`|
tkrh||�S|
tkr�|r�|t|
|||
||f��S|}|r�|
r�|}|}
|s�|}|t|
|||
||f��S|jd�}|ddkr�|d=|dd�dk�r�|jd�}n(||jd�}td|dd	��|dd
�<g}xX|D]P}|dk�rdy|j�Wntk
�r`YnXn|dk�rt�q0n
|j	|��q0W|ddk�r�|j	d�|t|
|dj
|��p�d|
||f��S)
zaJoin a base URL and a possibly relative URL to form an absolute
    interpretation of the latter.rrvr3N�..�.���r�r�r�r�)r�r�)r8r�
uses_relativer�rr��filter�pop�
IndexError�append�join)�baserirqrrZbschemeZbnetlocZbpathZbparamsZbqueryZ	bfragmentrprV�pathrtrsrhZ
base_partsZsegmentsZ
resolved_pathZsegr!r!r"r*sT






c	CsTt|�\}}d|kr>t|�\}}}}}}t|||||df�}nd}|}|t||��S)z�Removes any existing fragment from URL.

    Returns a tuple of the defragmented URL and the fragment.  If
    the URL contained no fragments, the second element is the
    empty string.
    rgr)r8rrr)	rirr�sr��p�a�qZfragZdefragr!r!r"rosZ0123456789ABCDEFabcdefcCs�|s|jdSt|t�r"|jd�}|jd�}t|�dkr<|S|dg}|j}tdkrbdd�tD�axb|dd�D]R}y(|t|dd	��||d	d��Wqptk
r�|d�||�YqpXqpWdj	|�S)
z,unquote_to_bytes('abc%20def') -> b'abc def'.�zutf-8rHr3rNcSs4i|],}tD]"}tt||d�g�||j��qqS)�)�_hexdig�bytesrOr()r-r�r�r!r!r"�
<dictcomp>�sz$unquote_to_bytes.<locals>.<dictcomp>r�)
r�r4r5r(rzr��
_hextobyter��KeyErrorr�)�string�bits�resr��itemr!r!r"r�s*



z([-]+)�utf-8r�cCs�d|kr|j|S|dkrd}|dkr*d}tj|�}|dg}|j}x@tdt|�d�D],}|t||�j||��|||d�qVWdj|�S)	a�Replace %xx escapes by their single-character equivalent. The optional
    encoding and errors parameters specify how to decode percent-encoded
    sequences into Unicode characters, as accepted by the bytes.decode()
    method.
    By default, percent-encoded sequences are decoded with UTF-8, and invalid
    sequences are replaced by a placeholder character.

    unquote('abc%20def') -> 'abc def'.
    rGNzutf-8r�rr3r�r)r��_asciirer��rangerzrr,r�)r�r)r*r�r�r�ryr!r!r"r�s


Fc	CsRi}t|||||||d�}x2|D]*\}	}
|	|kr@||	j|
�q |
g||	<q W|S)a�Parse a query given as a string argument.

        Arguments:

        qs: percent-encoded query string to be parsed

        keep_blank_values: flag indicating whether blank values in
            percent-encoded queries should be treated as blank strings.
            A true value indicates that blanks should be retained as
            blank strings.  The default false value indicates that
            blank values are to be ignored and treated as if they were
            not included.

        strict_parsing: flag indicating what to do with parsing errors.
            If false (the default), errors are silently ignored.
            If true, errors raise a ValueError exception.

        encoding and errors: specify how to decode percent-encoded sequences
            into Unicode characters, as accepted by the bytes.decode() method.

        max_num_fields: int. If set, then throws a ValueError if there
            are more than n fields read by parse_qsl().

        Returns a dictionary.
    )r)r*�max_num_fieldsrM)r
r�)�qs�keep_blank_values�strict_parsingr)r*r�rMZ
parsed_result�pairs�name�valuer!r!r"r	�sc@seZdZdZdS)�_QueryStringSeparatorWarningz>Warning for using default `separator` in parse_qs or parse_qslN)r<r=r>r?r!r!r!r"r��sr�z/etc/python/urllib.cfgcCs�t|�\}}t|t�r |jd�}|s6t|ttf�rF|dk	rFtd��t�}|dk�rVt}d}	|dkrvtj	j
|	�}d}
|dkr�ytt�}Wnt
k
r�YnJX|�:ddl}|jdd'd�}
|
j|�|
j
d	|	dd
�}|aWdQRXt}
|dk�rd|k�rddlm}|d-tdd�d}n:|dk�r,|}n*t|�dk�rVt|	�d|
�d�dd��|dk	�r�||k�r�d|jd�|jd�}nd|j|�}||k�r�td��||k�r�dd�|jd�D�}nd d�|j|�D�}g}x�|D]�}|�r�|�r��q�|jd!d�}t|�dk�r>|�r(td"|f��|�r�|jd#�n�q�t|d��sR|�r�|djd$d%�}t|||d&�}||�}|djd$d%�}t|||d&�}||�}|j||f��q�W|S).a�Parse a query given as a string argument.

        Arguments:

        qs: percent-encoded query string to be parsed

        keep_blank_values: flag indicating whether blank values in
            percent-encoded queries should be treated as blank strings.
            A true value indicates that blanks should be retained as blank
            strings.  The default false value indicates that blank values
            are to be ignored and treated as if they were  not included.

        strict_parsing: flag indicating what to do with parsing errors. If
            false (the default), errors are silently ignored. If true,
            errors raise a ValueError exception.

        encoding and errors: specify how to decode percent-encoded sequences
            into Unicode characters, as accepted by the bytes.decode() method.

        max_num_fields: int. If set, then throws a ValueError
            if there are more than n fields read by parse_qsl().

        Returns a list, as G-d intended.
    r$Nz*Separator must be of type string or bytes.ZPYTHON_URLLIB_QS_SEPARATORzenvironment variablerrg)Z
interpolationZcomment_prefixesr	)Zfallbackrm)�warnz4The default separator of urllib.parse.parse_qsl and z1parse_qs was changed to '&' to avoid a web cache z"poisoning issue (CVE-2021-23336). z4By default, semicolons no longer act as query field zseparators. z3See https://access.redhat.com/articles/5860431 for z
more details.r�)�
stacklevel�&Zlegacyr3z (from z) must contain z1 character, or "legacy". See z<https://access.redhat.com/articles/5860431 for more details.zMax number of fields exceededcSs g|]}|jd�D]}|�qqS)rm)r�)r-�s1�s2r!r!r"�
<listcomp>Lszparse_qsl.<locals>.<listcomp>cSsg|]}|�qSr!r!)r-r�r!r!r"r�Ns�=zbad query field: %rr�+� )r)r*)rgzeThe default separator of urllib.parse.parse_qsl and parse_qs was changed to '&' to avoid a web cache z�The default separator of urllib.parse.parse_qsl and parse_qs was changed to '&' to avoid a web cache poisoning issue (CVE-2021-23336). z�The default separator of urllib.parse.parse_qsl and parse_qs was changed to '&' to avoid a web cache poisoning issue (CVE-2021-23336). By default, semicolons no longer act as query field z�The default separator of urllib.parse.parse_qsl and parse_qs was changed to '&' to avoid a web cache poisoning issue (CVE-2021-23336). By default, semicolons no longer act as query field separators. z�The default separator of urllib.parse.parse_qsl and parse_qs was changed to '&' to avoid a web cache poisoning issue (CVE-2021-23336). By default, semicolons no longer act as query field separators. See https://access.redhat.com/articles/5860431 for aThe default separator of urllib.parse.parse_qsl and parse_qs was changed to '&' to avoid a web cache poisoning issue (CVE-2021-23336). By default, semicolons no longer act as query field separators. See https://access.redhat.com/articles/5860431 for more details.)r8r4r�r,r5rP�object�_default_qs_separator�os�environr��open�_QS_SEPARATOR_CONFIG_FILENAME�FileNotFoundError�configparserZConfigParserZ	read_file�warningsr�r�rz�countr�r�r�r)r�r�r�r)r*r�rMrrZ_legacyZenvvar_nameZ
config_sourcerr��configr��
num_fieldsr��rZ
name_valueZnvr�r�r!r!r"r
�s�












cCs|jdd�}t|||�S)z�Like unquote(), but also replace plus signs by spaces, as required for
    unquoting HTML form values.

    unquote_plus('%7e/abc+def') -> '~/abc def'
    r�r�)r�r)r�r)r*r!r!r"rfssAABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_.-c@s(eZdZdZdd�Zdd�Zdd�ZdS)	�Quoterz�A mapping from bytes (in range(0,256)) to strings.

    String values are percent-encoded byte values, unless the key < 128, and
    in the "safe" set (either the specified safe set, or default set).
    cCstj|�|_dS)zsafe: bytes object.N)�_ALWAYS_SAFE�union�safe)r;r�r!r!r"�__init__~szQuoter.__init__cCsd|jjt|�fS)Nz<%s %r>)�	__class__r<�dict)r;r!r!r"�__repr__�szQuoter.__repr__cCs(||jkrt|�ndj|�}|||<|S)Nz%{:02X})r��chr�format)r;r�r�r!r!r"�__missing__�szQuoter.__missing__N)r<r=r>r?r�r�r�r!r!r!r"r�vsr�rvcCsbt|t�r8|s|S|dkrd}|dkr*d}|j||�}n |dk	rHtd��|dk	rXtd��t||�S)a�quote('abc def') -> 'abc%20def'

    Each part of a URL, e.g. the path info, the query, etc., has a
    different set of reserved characters that must be quoted.

    RFC 2396 Uniform Resource Identifiers (URI): Generic Syntax lists
    the following reserved characters.

    reserved    = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" |
                  "$" | ","

    Each of these characters is reserved in some component of a URL,
    but not necessarily in all of them.

    By default, the quote function is intended for quoting the path
    section of a URL.  Thus, it will not encode '/'.  This character
    is reserved, but in typical usage the quote function is being
    called on a path where the existing slash characters are used as
    reserved characters.

    string and safe may be either str or bytes objects. encoding and errors
    must not be specified if string is a bytes object.

    The optional encoding and errors parameters specify how to deal with
    non-ASCII characters, as accepted by the str.encode method.
    By default, encoding='utf-8' (characters are encoded with UTF-8), and
    errors='strict' (unsupported characters raise a UnicodeEncodeError).
    Nzutf-8r%z,quote() doesn't support 'encoding' for bytesz*quote() doesn't support 'errors' for bytes)r4r5r(r6r
)r�r�r)r*r!r!r"r�s
cCsdt|t�rd|ks$t|t�r2d|kr2t||||�St|t�rBd}nd}t|||||�}|jdd�S)z�Like quote(), but also replace ' ' with '+', as required for quoting
    HTML form values. Plus signs in the original string are escaped unless
    they are included in safe. It also does not have safe default to '/'.
    r�� r�)r4r5r�rr�)r�r�r)r*Zspacer!r!r"r�s
cs�t|ttf�std��|sdSt|t�r6|jdd�}ntdd�|D��}|jt|�s^|j�Syt	|�Wn&t
k
r�t|�jt	|<�YnXdj
�fdd�|D��S)z�Like quote(), but accepts a bytes object rather than a str, and does
    not perform string-to-bytes encoding.  It always returns an ASCII string.
    quote_from_bytes(b'abc def?') -> 'abc%20def%3f'
    z!quote_from_bytes() expected bytesrr$�ignorecSsg|]}|dkr|�qS)�r!)r-r~r!r!r"r��sz$quote_from_bytes.<locals>.<listcomp>csg|]}�|��qSr!r!)r-�char)�quoterr!r"r��s)r4r��	bytearrayr6r5r(�rstrip�_ALWAYS_SAFE_BYTESr,r r�r��__getitem__r�)Zbsr�r!)r�r"r
�s
cCst|d�r|j�}nRy t|�r2t|dt�r2t�Wn0tk
rdtj�\}}}td�j|��YnXg}	|s�xr|D]j\}
}t|
t	�r�||
|�}
n|t
|
�|||�}
t|t	�r�|||�}n|t
|�|||�}|	j|
d|�qtW�n,�x(|D�]\}
}t|
t	��r||
|�}
n|t
|
�|||�}
t|t	��rL|||�}|	j|
d|�q�t|t
��rz|||||�}|	j|
d|�q�yt|�}Wn:tk
�r�|t
|�|||�}|	j|
d|�Yq�XxJ|D]B}
t|
t	��r�||
|�}
n|t
|
�|||�}
|	j|
d|
��q�Wq�Wdj|	�S)a^Encode a dict or sequence of two-element tuples into a URL query string.

    If any values in the query arg are sequences and doseq is true, each
    sequence element is converted to a separate parameter.

    If the query arg is a sequence of two-element tuples, the order of the
    parameters in the output will match the order of parameters in the
    input.

    The components of a query arg may each be either a string or a bytes type.

    The safe, encoding, and errors parameters are passed down to the function
    specified by quote_via (encoding and errors only if a component is a str).
    �itemsrz1not a valid non-string sequence or mapping objectr�r�)
�hasattrr�rzr4r0r6�sys�exc_info�with_tracebackr�r5r�r�)rsZdoseqr�r)r*Z	quote_viaZtyZva�tb�l�kr�r.Zeltr!r!r"r�sP





cCsJt|t�rFy|jd�j�}Wn(tk
rDtdt|�d��YnX|S)zto_bytes(u"URL") --> 'URL'.�ASCIIzURL z contains non-ASCII characters)r4r5r(r,�UnicodeError�repr)rir!r!r"�to_bytes/s
r�cCs`t|�j�}|dd�dkr<|dd�dkr<|dd�j�}|dd�dkr\|dd�j�}|S)	z8unwrap('<URL:type://host/path>') --> 'type://host/path'.Nr3�<�>�zURL:r�r�)r5r�)rir!r!r"�unwrap<s rcCsDtdkrtjdtj�atj|�}|r<|j�\}}|j�|fSd|fS)z:splittype('type:opaquestring') --> 'type', 'opaquestring'.Nz
([^/:]+):(.*))�	_typeprogr��compile�DOTALLr��groupsrK)rir�rp�datar!r!r"�	splittypeEs
rcCsXtdkrtjdtj�atj|�}|rP|j�\}}|rH|ddkrHd|}||fSd|fS)z;splithost('//host[:port]/path') --> 'host[:port]', '/path'.Nz//([^/#?]*)(.*)rrv)�	_hostprogr�rrr�r)rir�Z	host_portr�r!r!r"�	splithostRs
r
cCs |jd�\}}}|r|nd|fS)zJsplituser('user[:passwd]@host[:port]') --> 'user[:passwd]', 'host[:port]'.rTN)rW)�host�userr}r!r!r"�	splituser`sr
cCs |jd�\}}}||r|ndfS)z/splitpasswd('user:passwd') -> 'user', 'passwd'.rUN)rJ)rr}Zpasswdr!r!r"�splitpasswdesrcCsDtdkrtjdtj�atj|�}|r<|j�\}}|r<||fS|dfS)z*splitport('host:port') --> 'host', 'port'.Nz(.*):([0-9]*)$)�	_portprogr�rrr�r)rr�rQr!r!r"�	splitportls
rr3cCsT|jd�\}}}|s|}n2|rLyt|�}Wntk
rBd}YnX||fS||fS)z�Split host and port, returning numeric port.
    Return given default port if no ':' found; defaults to -1.
    Return numerical port if a valid number are found after ':'.
    Return None if ':' but not a valid number.rUN)rWrOrP)rZdefportr}rQZnportr!r!r"�
splitnportys
rcCs$|jd�\}}}|r||fS|dfS)z/splitquery('/path?query') --> '/path', 'query'.r�N)rW)rir�r}rsr!r!r"�
splitquery�srcCs$|jd�\}}}|r||fS|dfS)z)splittag('/path#tag') --> '/path', 'tag'.rgN)rW)rir�r}�tagr!r!r"�splittag�srcCs|jd�}|d|dd�fS)zksplitattr('/path;attr1=value1;attr2=value2;...') ->
        '/path', ['attr1=value1', 'attr2=value2', ...].rmrr3N)r�)riZwordsr!r!r"�	splitattr�s
rcCs |jd�\}}}||r|ndfS)z-splitvalue('attr=value') --> 'attr', 'value'.r�N)rJ)�attrr}r�r!r!r"�
splitvalue�sr)rT)r)rT)T)r�r�)FFr�r�NN)FFr�r�NN)r�r�)rvNN)rNN)rvr�)r�)er?r�r�r��collectionsr��__all__r�r�rnZnon_hierarchicalZ
uses_queryZ
uses_fragmentr�r�r�r�rr#Z_implicit_encodingZ_implicit_errorsr'r+r2r8r�r9rArCrSrarfZ_DefragResultBaseZ_SplitResultBaseZ_ParseResultBaserirhrprVr�rsrtZ
ResultBaserrrrrrrlrrorr�r�r�r�rrrrrr�r�rrr�rr	�RuntimeWarningr�r�r�r
r�	frozensetr�r�r�r �defaultdictr�rrr
rr�rrrr	r
r
rrrrrrrrr!r!r!r"�<module> s





!


	
	
B
E


&
y
	
,

O

group.cpython-36.pyc000064400000034130151733361510010334 0ustar003

��g�<�@s�ddlZddlZddlZddlZddlmZddlm	Z	ddl
Z
Gdd�de�ZGdd�de�Z
Gdd	�d	e�ZGd
d�de�ZdS)�N)�_)�loggerc@sleZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zdd�Zdd�Z
dd�ZdS)�
PersistorBasecCsBt|tjjj�s ttt|����||_i|_i|_	i|_
i|_dS)N)�
isinstance�dnf�db�historyZ
SwdbInterface�AssertionError�str�type�
_installed�_removed�	_upgraded�_downgraded)�selfr�r�/usr/lib/python3.6/group.py�__init__ s zPersistorBase.__init__cCs(t|j�t|j�t|j�t|j�S)N)�lenrr
rr)rrrr�__len__(szPersistorBase.__len__cCsi|_i|_i|_i|_dS)N)rr
rr)rrrr�clean+szPersistorBase.cleancCst�dS)N)�NotImplementedError)r�objrrr�_get_obj_id1szPersistorBase._get_obj_idcCs*|jjj|d|tjj�}|jtjj�dS)N�)r�swdb�addItem�libdnf�transaction�TransactionItemReason_USERZsetStateZTransactionItemState_DONE)r�item�action�tirrr�_add_to_history4szPersistorBase._add_to_historycCs$||j|j|�<|j|tjj�dS)N)rrr#rr�TransactionItemAction_INSTALL)rrrrr�install8szPersistorBase.installcCs$||j|j|�<|j|tjj�dS)N)r
rr#rr�TransactionItemAction_REMOVE)rrrrr�remove<szPersistorBase.removecCs$||j|j|�<|j|tjj�dS)N)rrr#rr�TransactionItemAction_UPGRADE)rrrrr�upgrade@szPersistorBase.upgradecCs$||j|j|�<|j|tjj�dS)N)rrr#rr�TransactionItemAction_DOWNGRADE)rrrrr�	downgradeDszPersistorBase.downgradecCst�dS)N)r)r�obj_id�name�translated_name�	pkg_typesrrr�newHszPersistorBase.newcCst�dS)N)r)rr,rrr�getKszPersistorBase.getcCst�dS)N)r)r�patternrrr�search_by_patternNszPersistorBase.search_by_patternN)�__name__�
__module__�__qualname__rrrrr#r%r'r)r+r0r1r3rrrrrsrc@sDeZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dS)�GroupPersistorcCs"|jjj�}dd�|D�}t|�S)NcSsg|]}|j�r|�qSr)�getCompsGroupItem)�.0�irrr�
<listcomp>Vsz+GroupPersistor.__iter__.<locals>.<listcomp>)rr�getItems�iter)r�itemsrrr�__iter__TszGroupPersistor.__iter__cCs|j�S)N)�
getGroupId)rrrrrrYszGroupPersistor._get_obj_idcCsH|jjj�}|j|�|dk	r(|j|�|dk	r:|j|�|j|�|S)N)rrZcreateCompsGroupItemZ
setGroupId�setName�setTranslatedName�setPackageTypes)rr,r-r.r/�
swdb_grouprrrr0\s



zGroupPersistor.newcCs"|jjj|�}|sdS|j�}|S)N)rrr8)rr,rDrrrr1fs
zGroupPersistor.getcCs|jjj|�S)N)rrZgetCompsGroupItemsByPattern)rr2rrrr3msz GroupPersistor.search_by_patterncCs|jjj|�S)N)rrZgetPackageCompsGroups)r�pkg_namerrr�get_package_groupspsz!GroupPersistor.get_package_groupscCs�|jjj|dd�}|tjjkr"dSt|j|��}xJ|jj	�D]<\}}x2|j
�D]&}|j�|kr`qN|j�sjqN|j
|�qNWq<WxJ|jj	�D]<\}}x2|j
�D]&}|j�|kr�q�|j�s�q�|j|�q�Wq�W|r�dSdS)Nr�FT���)rr�resolveRPMTransactionItemReasonrrZTransactionItemReason_GROUP�setrFr
r>ZgetPackagesZgetName�getInstalledr'r�add)rrE�reasonZpackage_groups�group_id�group�pkgrrr�is_removable_pkgss*zGroupPersistor.is_removable_pkgN)
r4r5r6r?rr0r1r3rFrQrrrrr7Rs
r7c@sDeZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dS)�EnvironmentPersistorcCs"|jjj�}dd�|D�}t|�S)NcSsg|]}|j�r|�qSr)�getCompsEnvironmentItem)r9r:rrrr;�sz1EnvironmentPersistor.__iter__.<locals>.<listcomp>)rrr<r=)rr>rrrr?�szEnvironmentPersistor.__iter__cCs|j�S)N)ZgetEnvironmentId)rrrrrr�sz EnvironmentPersistor._get_obj_idcCsH|jjj�}|j|�|dk	r(|j|�|dk	r:|j|�|j|�|S)N)rrZcreateCompsEnvironmentItemZsetEnvironmentIdrArBrC)rr,r-r.r/�swdb_envrrrr0�s



zEnvironmentPersistor.newcCs"|jjj|�}|sdS|j�}|S)N)rrrS)rr,rTrrrr1�s
zEnvironmentPersistor.getcCs|jjj|�S)N)rrZ!getCompsEnvironmentItemsByPattern)rr2rrrr3�sz&EnvironmentPersistor.search_by_patterncCs|jjj|�S)N)rrZgetCompsGroupEnvironments)rrNrrr�get_group_environments�sz+EnvironmentPersistor.get_group_environmentscCs�|jjj|�}|sdSt|j|��}xJ|jj�D]<\}}x2|j�D]&}|j�|krTqB|j	�s^qB|j
|�qBWq0WxJ|jj�D]<\}}x2|j�D]&}|j�|kr�q�|j	�s�q�|j|�q�Wq|W|r�dSdS)NFT)
rrOr1rJrUr
r>Z	getGroupsr@rKr'rrL)rrNrDZgroup_environmentsZenv_id�envrOrrr�is_removable_group�s*z'EnvironmentPersistor.is_removable_groupN)
r4r5r6r?rr0r1r3rUrWrrrrrR�s
rRc@s�eZdZd,dd�Zdd�Zdd�Zdd	�Zd-d
d�Zdd
�Zdd�Z	dd�Z
d.dd�Zd/dd�Zd0dd�Z
d1dd�Zd2dd�Zd3dd�Zd4dd�Zd d!�Zd"d#�Zed$d%��Zed&d'��Zd(d)�Zd*d+�ZdS)5�RPMTransactionNc	Cs:||_||_|js0y|jjj�WnYnXi|_dS)N)rrrZinitTransaction�_swdb_ti_pkg)rrrrrrr�szRPMTransaction.__init__cs8�jr�jj�}n�jjj�}�fdd�|D�}t|�S)Ncs&g|]}|j�rtjjj�j|��qSr)�
getRPMItemrrr�RPMTransactionItemWrapper)r9r:)rrrr;�sz+RPMTransaction.__iter__.<locals>.<listcomp>)rr<rrr=)rr>r)rrr?�s
zRPMTransaction.__iter__cs8�jr�jj�}n�jjj�}�fdd�|D�}t|�S)Ncs&g|]}|j�rtjjj�j|��qSr)rZrrrr[)r9r:)rrrr;�sz*RPMTransaction.__len__.<locals>.<listcomp>)rr<rrr)rr>r)rrr�s
zRPMTransaction.__len__cCsP|jjj�}|j|j�|j|jp$d�|j|j�|j	|j
�|j|j�|S)Nr)
rrZ
createRPMItemrAr-ZsetEpochZepochZ
setVersion�versionZ
setRelease�releaseZsetArch�arch)rrP�rpm_itemrrr�_pkg_to_swdb_rpm_item�sz$RPMTransaction._pkg_to_swdb_rpm_itemcCsV|j|�}|j|�}|dkr&|j|�}|jjj||||�}|rH|j|�||j|<|S)N)r`�
get_repoid�
get_reasonrrr�
addReplacedByrY)rrPr!rM�replaced_byr_Zrepoid�resultrrrr0�s




zRPMTransaction.newcCst|dd�}|r|S|jS)NZ_force_swdb_repoid)�getattrZreponame)rrPrerrrra�szRPMTransaction.get_repoidcCs|jjj|j|jd�S)zGet reason for package����)rrrIr-r^)rrPrrrrbszRPMTransaction.get_reasoncCstjj|j|��S)zGet reason for package)rrZTransactionItemReasonToStringrb)rrPrrr�get_reason_nameszRPMTransaction.get_reason_namecCs8|pg}x*|D]"}|j|tjj�}|r|j|�qWdS)N)r0rr�TransactionItemAction_OBSOLETEDrc)r�	obsoletedrdZobsr"rrr�_add_obsoleted
s

zRPMTransaction._add_obsoletedcCs6|j|tjj�}|j|tjj|d�}|j||d�dS)N)rd)r0rrr*� TransactionItemAction_DOWNGRADEDrl)rr0�oldrk�ti_new�ti_oldrrr�
add_downgradeszRPMTransaction.add_downgradecCs|j||�dS)N)�
add_remove)rrnrMrrr�	add_eraseszRPMTransaction.add_erasecCs4|dkrtjj}|j|tjj|�}|j||d�dS)N)rd)rrrr0r$rl)rr0rkrMrorrr�add_installszRPMTransaction.add_installcCs6|j|tjj�}|j|tjj|d�}|j||d�dS)N)rd)r0rr�TransactionItemAction_REINSTALL�!TransactionItemAction_REINSTALLEDrl)rr0rnrkrorprrr�
add_reinstallszRPMTransaction.add_reinstallcCs"|p
tjj}|j|tjj|�}dS)N)rrrr0r&)rrnrMrprrrrr$szRPMTransaction.add_removecCs6|j|tjj�}|j|tjj|d�}|j||d�dS)N)rd)r0rrr(�TransactionItemAction_UPGRADEDrl)rr0rnrkrorprrr�add_upgrade(szRPMTransaction.add_upgradecCs^|jr
dS|jjrdSy.|drB|j�rBtjtd�j|��dSWntk
rXdSXdS)NrZmodularitylabelz\No available modular metadata for modular package '{}', it cannot be installed on the systemrg)	Z
_from_cmdlineZrepoZmodule_hotfixesZ_is_in_active_modulerZcriticalr�format�
ValueError)r�hdrrPrrr�_test_fail_safe-szRPMTransaction._test_fail_safecCsRd}�x0|D�]&}�y�|jtjjkrP|jj}||j||j�7}|j||d��n�|jtjjkrp|j	|jj
��n�|jtjjkr�|jj}||j||j�7}|j||d��nL|jtjjkr�|jj}||j||j�7}|j||d��n|jtjj
k�r|j	|jj
�n�|jtjjk�r<|jj}||j||j�7}|j||�n�|jtjjk�r\|j	|jj
�n�|jtjjk�r||j	|jj
�nz|jtjjk�r�|jj}||j||j�7}|j||d�n@|jtjjk�r�|j	|jj
�n |jtjjk�r�ntd|j��Wqtjk
�r2}ztjjtd|���WYdd}~XqXqW|�rNtjjtd���|S)z!Populate the RPM transaction set.r�ur:z%TransactionItemAction not handled: %szAn rpm exception occurred: %sNz1No available modular metadata for modular package)r!rrr*rPZ_headerr}Z
addInstallrmZaddErase�idxr$ZTransactionItemAction_OBSOLETErjruZaddReinstallrvr&r(rxZ#TransactionItemAction_REASON_CHANGE�RuntimeError�rpm�errorr�
exceptions�Errorr)rZtsZmodular_problems�tsir|�errr�_populate_rpm_ts;sR*zRPMTransaction._populate_rpm_tscCsXt�}xL|D]D}|jtjjkry|j|j�Wqtk
rNtd|��YqXqW|S)Nz*TransactionItem is has no RPM attached: %s)	rJr!rrZFORWARD_ACTIONSrLrP�KeyErrorr�)rrer�rrr�install_setms
zRPMTransaction.install_setcCsbt�}xV|D]N}|jtjjtjjgkry|j|j�Wqt	k
rXt
d|��YqXqW|S)Nz*TransactionItem is has no RPM attached: %s)rJr!rrZBACKWARD_ACTIONSrrvrLrPr�r�)rrer�rrr�
remove_setys
zRPMTransaction.remove_setcCs,dd�|jD�}t|�r(td�|dSdS)zj Ensures all the members can be passed to rpm as they are to perform
            the transaction.
        cSsg|]}|jdkr|�qS)�src)r^)r9rPrrrr;�sz3RPMTransaction._rpm_limitations.<locals>.<listcomp>z+Will not install a source rpm package (%s).rN)r�rr)rZsrc_installsrrr�_rpm_limitations�s

zRPMTransaction._rpm_limitationscs�fdd�|D�S)Ncsg|]}|j�kr|�qSr)r!)r9r�)r!rrr;�sz-RPMTransaction._get_items.<locals>.<listcomp>r)rr!r)r!r�
_get_items�szRPMTransaction._get_items)N)NN)N)N)N)NN)N)N)N)r4r5r6rr?rr`r0rarbrirlrqrsrtrwrrryr}r��propertyr�r�r�r�rrrrrX�s*
		







2
rX)Zlibdnf.transactionrZdnf.db.historyrZdnf.transactionZdnf.exceptionsZdnf.i18nrZdnf.utilrr��objectrr7rRrXrrrr�<module>s3<<history.cpython-36.pyc000064400000043306151733361510010706 0ustar003

�ft`%:�@s�ddlZddlZddlZddlZddlZddlmZddlm	Z	ddl
mZddlm
Z
mZmZGdd�de�ZGd	d
�d
e�ZGdd�de�ZGd
d�de�ZdS)�N)�ucd)�misc)�
DatabaseError�)�GroupPersistor�EnvironmentPersistor�RPMTransactionc@sjeZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zdd�Zdd�Z
edd��Zedd��Zedd��Zedd��Zedd ��Zed!d"��Zed#d$��Zed%d&��Zejd'd&��Zed(d)��Zejd*d)��Zed+d,��Zed-d.��Zed/d0��Zejd1d0��Zed2d3��Zd4d5�Zed6d7��Zd8d9�Zed:d;��Z ed<d=��Z!ed>d?��Z"d@S)A�RPMTransactionItemWrappercCs|dk	st�||_||_dS)N)�AssertionError�_swdb�_item)�self�swdb�item�r�/usr/lib/python3.6/history.py�__init__#sz"RPMTransactionItemWrapper.__init__cCs|jj�j�S)N)rZgetItemZtoStr)r
rrr�__str__(sz!RPMTransactionItemWrapper.__str__cCs|j|jkS)N)r)r
�otherrrr�__lt__+sz RPMTransactionItemWrapper.__lt__cCs|j|jkS)N)r)r
rrrr�__eq__.sz RPMTransactionItemWrapper.__eq__cCs
|jj�S)N)r�__hash__)r
rrrr1sz"RPMTransactionItemWrapper.__hash__cCsdS)NTr)r
�patternrrr�match4szRPMTransactionItemWrapper.matchcCs|jj�dk	S)N)r�
getRPMItem)r
rrr�
is_package7sz$RPMTransactionItemWrapper.is_packagecCs|jj�dk	S)N)r�getCompsGroupItem)r
rrr�is_group:sz"RPMTransactionItemWrapper.is_groupcCs|jj�dk	S)N)r�getCompsEnvironmentItem)r
rrr�is_environment=sz(RPMTransactionItemWrapper.is_environmentcCs
|jj�S)N)rr)r
rrr�	get_group@sz#RPMTransactionItemWrapper.get_groupcCs
|jj�S)N)rr)r
rrr�get_environmentCsz)RPMTransactionItemWrapper.get_environmentcCs|jj�j�S)N)rrZgetName)r
rrr�nameFszRPMTransactionItemWrapper.namecCs|jj�j�S)N)rrZgetEpoch)r
rrr�epochJszRPMTransactionItemWrapper.epochcCs|jj�j�S)N)rrZ
getVersion)r
rrr�versionNsz!RPMTransactionItemWrapper.versioncCs|jj�j�S)N)rrZ
getRelease)r
rrr�releaseRsz!RPMTransactionItemWrapper.releasecCs|jj�j�S)N)rrZgetArch)r
rrr�archVszRPMTransactionItemWrapper.archcCs*|jrdj|j|j|j�Sdj|j|j�S)Nz{}:{}-{}z{}-{})r#�formatr$r%)r
rrr�evrZszRPMTransactionItemWrapper.evrcCs|jj�j�S)N)rrZgetNEVRA)r
rrr�nevra`szRPMTransactionItemWrapper.nevracCs
|jj�S)N)rZ	getAction)r
rrr�actiondsz RPMTransactionItemWrapper.actioncCs|jj|�dS)N)rZ	setAction)r
�valuerrrr*hscCs
|jj�S)N)rZ	getReason)r
rrr�reasonlsz RPMTransactionItemWrapper.reasoncCs|jj|�S)N)rZ	setReason)r
r+rrrr,pscCs$y
|jj�Stk
rdSXdS)N�)rZ
getActionName�AttributeError)r
rrr�action_namets
z%RPMTransactionItemWrapper.action_namecCs$y
|jj�Stk
rdSXdS)Nr-)rZgetActionShortr.)r
rrr�action_short{s
z&RPMTransactionItemWrapper.action_shortcCs
|jj�S)N)r�getState)r
rrr�state�szRPMTransactionItemWrapper.statecCs|jj|�dS)N)r�setState)r
r+rrrr2�scCs
|jj�S)N)r�	getRepoid)r
rrr�	from_repo�sz#RPMTransactionItemWrapper.from_repocCs|jj�sdSd|jj�S)Nr-�@)rr4)r
rrr�ui_from_repo�s
z&RPMTransactionItemWrapper.ui_from_repocCsdS)Nr)r
rrr�
obsoleting�sz$RPMTransactionItemWrapper.obsoletingcCs|jjj|�S)N)r�rpm�
get_reason)r
rrrr:�sz$RPMTransactionItemWrapper.get_reasoncCs|jjj|jS)N)rr9Z_swdb_ti_pkgr)r
rrr�pkg�szRPMTransactionItemWrapper.pkgcCs|jjS)N)r;�files)r
rrrr<�szRPMTransactionItemWrapper.filescCs|jS)N)r;)r
rrr�_active�sz!RPMTransactionItemWrapper._activeN)#�__name__�
__module__�__qualname__rrrrrrrrrr r!�propertyr"r#r$r%r&r(r)r*�setterr,r/r0r2r5r7r8r:r;r<r=rrrrr	"sBr	c@s�eZdZdZdZdd�Zedd��Zedd��Zedd	��Z	ed
d��Z
edd
��Zedd��Zedd��Z
edd��Zedd��Zedd��Zedd��Zedd��Zdd�Zdd�Zd d!�Zd"d#�Zd$d%�Zd&d'�Zd(S))�TransactionWrapperFcCs
||_dS)N)�_trans)r
�transrrrr�szTransactionWrapper.__init__cCs
|jj�S)N)rD�getId)r
rrr�tid�szTransactionWrapper.tidcCs
|jj�S)N)rDZ
getCmdline)r
rrr�cmdline�szTransactionWrapper.cmdlinecCs
|jj�S)N)rDZ
getReleasever)r
rrr�
releasever�szTransactionWrapper.releasevercCs
|jj�S)N)rDZ
getDtBegin)r
rrr�
beg_timestamp�sz TransactionWrapper.beg_timestampcCs
|jj�S)N)rDZgetDtEnd)r
rrr�
end_timestamp�sz TransactionWrapper.end_timestampcCs
|jj�S)N)rD�getRpmdbVersionBegin)r
rrr�beg_rpmdb_version�sz$TransactionWrapper.beg_rpmdb_versioncCs
|jj�S)N)rD�getRpmdbVersionEnd)r
rrr�end_rpmdb_version�sz$TransactionWrapper.end_rpmdb_versioncCst|jj�tjjk�S)N)�intrDr1�libdnf�transaction�TransactionItemState_DONE)r
rrr�return_code�szTransactionWrapper.return_codecCs
|jj�S)N)rDZ	getUserId)r
rrr�loginuid�szTransactionWrapper.loginuidcCs|jS)N)�packages)r
rrr�data�szTransactionWrapper.datacCs|jj�}t|�S)N)rD�getConsoleOutput�bool)r
�outputrrr�	is_output�s
zTransactionWrapper.is_outputcCs
|jj�S)N)rDZ
getComment)r
rrr�comment�szTransactionWrapper.commentcCs|jj�gS)N)rDrF)r
rrr�tids�szTransactionWrapper.tidscCsgS)Nr)r
rrr�performed_with�sz!TransactionWrapper.performed_withcs�jj�}�fdd�|D�S)Ncsg|]}t�|��qSr)r	)�.0�i)r
rr�
<listcomp>�sz/TransactionWrapper.packages.<locals>.<listcomp>)rDZgetItems)r
�resultr)r
rrV�s
zTransactionWrapper.packagescCsdd�|jj�D�S)NcSsg|]}|d�qS)rr)r_r`rrrra�sz-TransactionWrapper.output.<locals>.<listcomp>)rDrX)r
rrrrZ�szTransactionWrapper.outputcCsgS)Nr)r
rrr�error�szTransactionWrapper.errorcCs|jj�|k|_dS)N)rDrN�altered_gt_rpmdb)r
Zrpmdbvrrr�compare_rpmdbv�sz!TransactionWrapper.compare_rpmdbvN)r>r?r@�altered_lt_rpmdbrdrrArGrHrIrJrKrMrOrTrUrWr[r\r]r^rVrZrcrerrrrrC�s*rCc@sheZdZdd�Zdd�Zedd��Zdd�Zed	d
��Zedd��Z	ed
d��Z
edd��Zdd�ZdS)�MergedTransactionWrappercCstjj|j�|_dS)N)rQrRZMergedTransactionrD)r
rErrrr�sz!MergedTransactionWrapper.__init__cCs|jj|j�dS)N)rD�merge)r
rErrrrh�szMergedTransactionWrapper.mergecCs
|jj�S)N)rDZlistUserIds)r
rrrrU�sz!MergedTransactionWrapper.loginuidcCs
|jj�S)N)rDZlistIds)r
rrrr]szMergedTransactionWrapper.tidscCsdd�|jj�D�S)NcSsg|]}t|tjjk��qSr)rPrQrRrS)r_r`rrrrasz8MergedTransactionWrapper.return_code.<locals>.<listcomp>)rDZ
listStates)r
rrrrTsz$MergedTransactionWrapper.return_codecCs
|jj�S)N)rDZlistCmdlines)r
rrrrHsz MergedTransactionWrapper.cmdlinecCs
|jj�S)N)rDZlistReleasevers)r
rrrrIsz#MergedTransactionWrapper.releasevercCs
|jj�S)N)rDZlistComments)r
rrrr\sz MergedTransactionWrapper.commentcCsdd�|jj�D�S)NcSsg|]}|d�qS)rr)r_r`rrrrasz3MergedTransactionWrapper.output.<locals>.<listcomp>)rDrX)r
rrrrZszMergedTransactionWrapper.outputN)
r>r?r@rrhrArUr]rTrHrIr\rZrrrrrg�srgc@s�eZdZd6dd�Zdd�Zedd��Zedd	��Zed
d��Zedd
��Z	edd��Z
dd�Zdd�Zedd��Z
dd�Zd7dd�Zd8dd�Zd d!�Zd"d#�Zd$d%�Zd&d'�Zd9d(d)�Zd*d+�Zd,d-�Zd:d.d/�Zd;d0d1�Zd2d3�Zd4d5�ZdS)<�
SwdbInterfacer-cCs8t|�|_d|_d|_d|_d|_d|_||_g|_dS)N)	�strrI�_rpm�_group�_envZ_addon_datar�_db_dir�_output)r
Zdb_dirrIrrrrs
zSwdbInterface.__init__cCs|j�dS)N)�close)r
rrr�__del__%szSwdbInterface.__del__cCs|jdkrt|�|_|jS)N)rkr)r
rrrr9(s

zSwdbInterface.rpmcCs|jdkrt|�|_|jS)N)rlr)r
rrr�group.s

zSwdbInterface.groupcCs|jdkrt|�|_|jS)N)rmr)r
rrr�env4s

zSwdbInterface.envcCstjj|jtjjj�S)N)�os�path�joinrnrQrR�SwdbZdefaultDatabaseName)r
rrr�dbpath:szSwdbInterface.dbpathcCsZ|jsTytjj|j�|_Wn.tk
rH}ztt|���WYdd}~XnX|jj�|jS)z Lazy initialize Swdb object N)	rrQrRrwrx�RuntimeErrorrrj�initTransaction)r
Zexrrrr>s
zSwdbInterface.swdbcCstjj||j�}|j�dS)N)rQrRZTransformerrx�	transform)r
Z	input_dirZtransformerrrrr{KszSwdbInterface.transformcCsZy|`Wntk
rYnXd|_d|_d|_|jrJ|jj�|jj�d|_g|_dS)N)	�_tidr.rkrlrmrZcloseTransactionZ
closeDatabasero)r
rrrrpOs

zSwdbInterface.closecCs
|jj�S)N)rZgetPath)r
rrrru]szSwdbInterface.pathcCs
|jj�S)N)rZ
resetDatabase)r
rrr�reset_dbaszSwdbInterface.reset_dbTcCs|jj�}|sdSt|�S)N)rZgetLastTransactionrC)r
�complete_transactions_only�trrr�lastes
zSwdbInterface.lastNrFcs��pg�dd��D��|jj�}dd�|D�}�rD�fdd�|D�}xJt|�D]>\}}|dkr`qN||d}|jj�|jj�krNd|_d|_qNW|ddd�S)	NcSsg|]}t|��qSr)rP)r_r`rrrraosz%SwdbInterface.old.<locals>.<listcomp>cSsg|]}t|��qSr)rC)r_r`rrrraqscsg|]}|j�kr|�qSr)rG)r_r`)r]rrratsrrT���)rZlistTransactions�	enumeraterDrLrNrfrd)r
r]�limitr~rbr`rEZ
prev_transr)r]r�oldms

zSwdbInterface.oldcCst|jj��S)N)rCrZ
getCurrent)r
rrr�get_current�szSwdbInterface.get_currentcCsB|jj|�}|j|�}tjj}|jj||||�}|jtjj	�|S)zSet reason for package)
r9Z_pkg_to_swdb_rpm_item�reporQrRZ#TransactionItemAction_REASON_CHANGErZaddItemr3rS)r
r;r,�rpm_itemZrepoidr*Ztirrr�
set_reason�s
zSwdbInterface.set_reasoncCs|jjt|��S)zGet repository of package)rZ
getRPMReporj)r
r;rrrr��szSwdbInterface.repocCs*|jjt|��}|dkr|St||�}|S)zGet package data for packageN)rZgetRPMTransactionItemrjr	)r
r;rbrrr�package_data�s

zSwdbInterface.package_datacCsfy|jj�WnYnX|jjttjtj���t|�|p>dtt	j
��|�}|jj|j�||_
|S)Nr-)rrzZbeginTransactionrP�calendarZtimegm�timeZgmtimerjrZgetloginuidZ
setReleaseverrIr|)r
Z
rpmdb_versionZ
using_pkgsZtsisrHr\rGrrr�beg�s
zSwdbInterface.begcCsN|jj�}|j|j�|j|jp"d�|j|j�|j|j	�|j
|j�|S)Nr)rZ
createRPMItemZsetNamer"ZsetEpochr#Z
setVersionr$Z
setReleaser%ZsetArchr&)r
Zpor�rrr�pkg_to_swdb_rpm_item�s
z"SwdbInterface.pkg_to_swdb_rpm_itemcCsDt|d�sdS|sdSx(|j�D]}t|�}|jjd|f�q WdS)Nr|r)�hasattr�
splitlinesrro�append)r
�msg�linerrr�log_scriptlet_output�s
z"SwdbInterface.log_scriptlet_outputcCs�t|d�sdS|dkrFtjj}x&|jD]}|jtjjkr&tjj}Pq&Wx |jD]\}}|j	j
||�qNWg|_|j	jtt
j
��t|�|�dS)Nr|)r�rQrRZTransactionState_DONEr9r2ZTransactionItemState_ERRORZTransactionState_ERRORrorZaddConsoleOutputLineZendTransactionrPr�rj)r
rOrT�errorsZtsiZfile_descriptorr�rrr�end�s

zSwdbInterface.endcCs|jj|�S)z{ Search for history transactions which contain specified
            packages al. la. "yum list". Returns transaction ids. )rZsearchTransactionsByRPM)r
ZpatternsZignore_caserrr�search�szSwdbInterface.searchcCs8|jj|j|jd�}|tjjkr$dS|tjjkr4dSdS)z)Returns True if package is user installedrTFr�)r�resolveRPMTransactionItemReasonr"r&rQrR�TransactionItemReason_USER�TransactionItemReason_UNKNOWN)r
r;r,rrr�user_installed�szSwdbInterface.user_installedcCsF|r|jj|j|j|�}n|jj|j|jd�}|tjjkrBtjj}|S)a2Get reason of package before transaction being undone. If package
        is already installed in the system, keep his reason.

        :param pkg: package being installed
        :param first_trans: id of first transaction being undone
        :param rollback: True if transaction is performing a rollbackrr�)rr�r"r&rQrRr�r�)r
r;Zfirst_transZrollbackrbrrr�get_erased_reason�szSwdbInterface.get_erased_reason)r-)T)NrF)Nr-)r-NN)T)r>r?r@rrqrAr9rrrsrxrr{rprur}r�r�r�r�r�r�r�r�r�r�r�r�r�rrrrris0




	

ri)r�rtr�Zlibdnf.transactionrQZlibdnf.utilsZdnf.i18nrZdnf.yumrZdnf.exceptionsrrrrrr�objectr	rCrgrirrrr�<module>sM"group.cpython-36.opt-1.pyc000064400000033766151733361510011311 0ustar003

��g�<�@s�ddlZddlZddlZddlZddlmZddlm	Z	ddl
Z
Gdd�de�ZGdd�de�Z
Gdd	�d	e�ZGd
d�de�ZdS)�N)�_)�loggerc@sleZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zdd�Zdd�Z
dd�ZdS)�
PersistorBasecCs"||_i|_i|_i|_i|_dS)N)�history�
_installed�_removed�	_upgraded�_downgraded)�selfr�r�/usr/lib/python3.6/group.py�__init__ s
zPersistorBase.__init__cCs(t|j�t|j�t|j�t|j�S)N)�lenrrrr	)r
rrr�__len__(szPersistorBase.__len__cCsi|_i|_i|_i|_dS)N)rrrr	)r
rrr�clean+szPersistorBase.cleancCst�dS)N)�NotImplementedError)r
�objrrr�_get_obj_id1szPersistorBase._get_obj_idcCs*|jjj|d|tjj�}|jtjj�dS)N�)r�swdb�addItem�libdnf�transaction�TransactionItemReason_USERZsetStateZTransactionItemState_DONE)r
�item�action�tirrr�_add_to_history4szPersistorBase._add_to_historycCs$||j|j|�<|j|tjj�dS)N)rrrrr�TransactionItemAction_INSTALL)r
rrrr�install8szPersistorBase.installcCs$||j|j|�<|j|tjj�dS)N)rrrrr�TransactionItemAction_REMOVE)r
rrrr�remove<szPersistorBase.removecCs$||j|j|�<|j|tjj�dS)N)rrrrr�TransactionItemAction_UPGRADE)r
rrrr�upgrade@szPersistorBase.upgradecCs$||j|j|�<|j|tjj�dS)N)r	rrrr�TransactionItemAction_DOWNGRADE)r
rrrr�	downgradeDszPersistorBase.downgradecCst�dS)N)r)r
�obj_id�name�translated_name�	pkg_typesrrr�newHszPersistorBase.newcCst�dS)N)r)r
r&rrr�getKszPersistorBase.getcCst�dS)N)r)r
�patternrrr�search_by_patternNszPersistorBase.search_by_patternN)�__name__�
__module__�__qualname__r
rrrrrr!r#r%r*r+r-rrrrrsrc@sDeZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dS)�GroupPersistorcCs"|jjj�}dd�|D�}t|�S)NcSsg|]}|j�r|�qSr)�getCompsGroupItem)�.0�irrr�
<listcomp>Vsz+GroupPersistor.__iter__.<locals>.<listcomp>)rr�getItems�iter)r
�itemsrrr�__iter__TszGroupPersistor.__iter__cCs|j�S)N)�
getGroupId)r
rrrrrYszGroupPersistor._get_obj_idcCsH|jjj�}|j|�|dk	r(|j|�|dk	r:|j|�|j|�|S)N)rrZcreateCompsGroupItemZ
setGroupId�setName�setTranslatedName�setPackageTypes)r
r&r'r(r)�
swdb_grouprrrr*\s



zGroupPersistor.newcCs"|jjj|�}|sdS|j�}|S)N)rrr2)r
r&r>rrrr+fs
zGroupPersistor.getcCs|jjj|�S)N)rrZgetCompsGroupItemsByPattern)r
r,rrrr-msz GroupPersistor.search_by_patterncCs|jjj|�S)N)rrZgetPackageCompsGroups)r
�pkg_namerrr�get_package_groupspsz!GroupPersistor.get_package_groupscCs�|jjj|dd�}|tjjkr"dSt|j|��}xJ|jj	�D]<\}}x2|j
�D]&}|j�|kr`qN|j�sjqN|j
|�qNWq<WxJ|jj	�D]<\}}x2|j
�D]&}|j�|kr�q�|j�s�q�|j|�q�Wq�W|r�dSdS)Nr�FT���)rr�resolveRPMTransactionItemReasonrrZTransactionItemReason_GROUP�setr@rr8ZgetPackagesZgetName�getInstalledr!r�add)r
r?�reasonZpackage_groups�group_id�group�pkgrrr�is_removable_pkgss*zGroupPersistor.is_removable_pkgN)
r.r/r0r9rr*r+r-r@rKrrrrr1Rs
r1c@sDeZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dS)�EnvironmentPersistorcCs"|jjj�}dd�|D�}t|�S)NcSsg|]}|j�r|�qSr)�getCompsEnvironmentItem)r3r4rrrr5�sz1EnvironmentPersistor.__iter__.<locals>.<listcomp>)rrr6r7)r
r8rrrr9�szEnvironmentPersistor.__iter__cCs|j�S)N)ZgetEnvironmentId)r
rrrrr�sz EnvironmentPersistor._get_obj_idcCsH|jjj�}|j|�|dk	r(|j|�|dk	r:|j|�|j|�|S)N)rrZcreateCompsEnvironmentItemZsetEnvironmentIdr;r<r=)r
r&r'r(r)�swdb_envrrrr*�s



zEnvironmentPersistor.newcCs"|jjj|�}|sdS|j�}|S)N)rrrM)r
r&rNrrrr+�s
zEnvironmentPersistor.getcCs|jjj|�S)N)rrZ!getCompsEnvironmentItemsByPattern)r
r,rrrr-�sz&EnvironmentPersistor.search_by_patterncCs|jjj|�S)N)rrZgetCompsGroupEnvironments)r
rHrrr�get_group_environments�sz+EnvironmentPersistor.get_group_environmentscCs�|jjj|�}|sdSt|j|��}xJ|jj�D]<\}}x2|j�D]&}|j�|krTqB|j	�s^qB|j
|�qBWq0WxJ|jj�D]<\}}x2|j�D]&}|j�|kr�q�|j	�s�q�|j|�q�Wq|W|r�dSdS)NFT)
rrIr+rDrOrr8Z	getGroupsr:rEr!rrF)r
rHr>Zgroup_environmentsZenv_id�envrIrrr�is_removable_group�s*z'EnvironmentPersistor.is_removable_groupN)
r.r/r0r9rr*r+r-rOrQrrrrrL�s
rLc@s�eZdZd,dd�Zdd�Zdd�Zdd	�Zd-d
d�Zdd
�Zdd�Z	dd�Z
d.dd�Zd/dd�Zd0dd�Z
d1dd�Zd2dd�Zd3dd�Zd4dd�Zd d!�Zd"d#�Zed$d%��Zed&d'��Zd(d)�Zd*d+�ZdS)5�RPMTransactionNc	Cs:||_||_|js0y|jjj�WnYnXi|_dS)N)rrrZinitTransaction�_swdb_ti_pkg)r
rrrrrr
�szRPMTransaction.__init__cs8�jr�jj�}n�jjj�}�fdd�|D�}t|�S)Ncs&g|]}|j�rtjjj�j|��qSr)�
getRPMItem�dnf�dbr�RPMTransactionItemWrapper)r3r4)r
rrr5�sz+RPMTransaction.__iter__.<locals>.<listcomp>)rr6rrr7)r
r8r)r
rr9�s
zRPMTransaction.__iter__cs8�jr�jj�}n�jjj�}�fdd�|D�}t|�S)Ncs&g|]}|j�rtjjj�j|��qSr)rTrUrVrrW)r3r4)r
rrr5�sz*RPMTransaction.__len__.<locals>.<listcomp>)rr6rrr)r
r8r)r
rr�s
zRPMTransaction.__len__cCsP|jjj�}|j|j�|j|jp$d�|j|j�|j	|j
�|j|j�|S)Nr)
rrZ
createRPMItemr;r'ZsetEpochZepochZ
setVersion�versionZ
setRelease�releaseZsetArch�arch)r
rJ�rpm_itemrrr�_pkg_to_swdb_rpm_item�sz$RPMTransaction._pkg_to_swdb_rpm_itemcCsV|j|�}|j|�}|dkr&|j|�}|jjj||||�}|rH|j|�||j|<|S)N)r\�
get_repoid�
get_reasonrrr�
addReplacedByrS)r
rJrrG�replaced_byr[Zrepoid�resultrrrr*�s




zRPMTransaction.newcCst|dd�}|r|S|jS)NZ_force_swdb_repoid)�getattrZreponame)r
rJrarrrr]�szRPMTransaction.get_repoidcCs|jjj|j|jd�S)zGet reason for package����)rrrCr'rZ)r
rJrrrr^szRPMTransaction.get_reasoncCstjj|j|��S)zGet reason for package)rrZTransactionItemReasonToStringr^)r
rJrrr�get_reason_nameszRPMTransaction.get_reason_namecCs8|pg}x*|D]"}|j|tjj�}|r|j|�qWdS)N)r*rr�TransactionItemAction_OBSOLETEDr_)r
�	obsoletedr`Zobsrrrr�_add_obsoleted
s

zRPMTransaction._add_obsoletedcCs6|j|tjj�}|j|tjj|d�}|j||d�dS)N)r`)r*rrr$� TransactionItemAction_DOWNGRADEDrh)r
r*�oldrg�ti_new�ti_oldrrr�
add_downgradeszRPMTransaction.add_downgradecCs|j||�dS)N)�
add_remove)r
rjrGrrr�	add_eraseszRPMTransaction.add_erasecCs4|dkrtjj}|j|tjj|�}|j||d�dS)N)r`)rrrr*rrh)r
r*rgrGrkrrr�add_installszRPMTransaction.add_installcCs6|j|tjj�}|j|tjj|d�}|j||d�dS)N)r`)r*rr�TransactionItemAction_REINSTALL�!TransactionItemAction_REINSTALLEDrh)r
r*rjrgrkrlrrr�
add_reinstallszRPMTransaction.add_reinstallcCs"|p
tjj}|j|tjj|�}dS)N)rrrr*r )r
rjrGrlrrrrn$szRPMTransaction.add_removecCs6|j|tjj�}|j|tjj|d�}|j||d�dS)N)r`)r*rrr"�TransactionItemAction_UPGRADEDrh)r
r*rjrgrkrlrrr�add_upgrade(szRPMTransaction.add_upgradecCs^|jr
dS|jjrdSy.|drB|j�rBtjtd�j|��dSWntk
rXdSXdS)NrZmodularitylabelz\No available modular metadata for modular package '{}', it cannot be installed on the systemrc)	Z
_from_cmdlineZrepoZmodule_hotfixesZ_is_in_active_modulerZcriticalr�format�
ValueError)r
�hdrrJrrr�_test_fail_safe-szRPMTransaction._test_fail_safecCsRd}�x0|D�]&}�y�|jtjjkrP|jj}||j||j�7}|j||d��n�|jtjjkrp|j	|jj
��n�|jtjjkr�|jj}||j||j�7}|j||d��nL|jtjjkr�|jj}||j||j�7}|j||d��n|jtjj
k�r|j	|jj
�n�|jtjjk�r<|jj}||j||j�7}|j||�n�|jtjjk�r\|j	|jj
�n�|jtjjk�r||j	|jj
�nz|jtjjk�r�|jj}||j||j�7}|j||d�n@|jtjjk�r�|j	|jj
�n |jtjjk�r�ntd|j��Wqtjk
�r2}ztjjtd|���WYdd}~XqXqW|�rNtjjtd���|S)z!Populate the RPM transaction set.r�ur4z%TransactionItemAction not handled: %szAn rpm exception occurred: %sNz1No available modular metadata for modular package)rrrr$rJZ_headerryZ
addInstallriZaddErase�idxrZTransactionItemAction_OBSOLETErfrqZaddReinstallrrr r"rtZ#TransactionItemAction_REASON_CHANGE�RuntimeError�rpm�errorrU�
exceptions�Errorr)r
ZtsZmodular_problems�tsirx�errr�_populate_rpm_ts;sR*zRPMTransaction._populate_rpm_tscCsXt�}xL|D]D}|jtjjkry|j|j�Wqtk
rNtd|��YqXqW|S)Nz*TransactionItem is has no RPM attached: %s)	rDrrUrZFORWARD_ACTIONSrFrJ�KeyErrorr|)r
rar�rrr�install_setms
zRPMTransaction.install_setcCsbt�}xV|D]N}|jtjjtjjgkry|j|j�Wqt	k
rXt
d|��YqXqW|S)Nz*TransactionItem is has no RPM attached: %s)rDrrUrZBACKWARD_ACTIONSrrrrFrJr�r|)r
rar�rrr�
remove_setys
zRPMTransaction.remove_setcCs,dd�|jD�}t|�r(td�|dSdS)zj Ensures all the members can be passed to rpm as they are to perform
            the transaction.
        cSsg|]}|jdkr|�qS)�src)rZ)r3rJrrrr5�sz3RPMTransaction._rpm_limitations.<locals>.<listcomp>z+Will not install a source rpm package (%s).rN)r�rr)r
Zsrc_installsrrr�_rpm_limitations�s

zRPMTransaction._rpm_limitationscs�fdd�|D�S)Ncsg|]}|j�kr|�qSr)r)r3r�)rrrr5�sz-RPMTransaction._get_items.<locals>.<listcomp>r)r
rr)rr�
_get_items�szRPMTransaction._get_items)N)NN)N)N)N)NN)N)N)N)r.r/r0r
r9rr\r*r]r^rerhrmrorprsrnruryr��propertyr�r�r�r�rrrrrR�s*
		







2
rR)Zlibdnf.transactionrZdnf.db.historyrUZdnf.transactionZdnf.exceptionsZdnf.i18nrZdnf.utilrr}�objectrr1rLrRrrrr�<module>s3<<history.cpython-36.opt-1.pyc000064400000043250151733361510011643 0ustar003

�ft`%:�@s�ddlZddlZddlZddlZddlZddlmZddlm	Z	ddl
mZddlm
Z
mZmZGdd�de�ZGd	d
�d
e�ZGdd�de�ZGd
d�de�ZdS)�N)�ucd)�misc)�
DatabaseError�)�GroupPersistor�EnvironmentPersistor�RPMTransactionc@sjeZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
d�Z	dd�Z
dd�Zdd�Zdd�Z
edd��Zedd��Zedd��Zedd��Zedd ��Zed!d"��Zed#d$��Zed%d&��Zejd'd&��Zed(d)��Zejd*d)��Zed+d,��Zed-d.��Zed/d0��Zejd1d0��Zed2d3��Zd4d5�Zed6d7��Zd8d9�Zed:d;��Z ed<d=��Z!ed>d?��Z"d@S)A�RPMTransactionItemWrappercCs||_||_dS)N)�_swdb�_item)�self�swdb�item�r�/usr/lib/python3.6/history.py�__init__#sz"RPMTransactionItemWrapper.__init__cCs|jj�j�S)N)rZgetItemZtoStr)rrrr�__str__(sz!RPMTransactionItemWrapper.__str__cCs|j|jkS)N)r)r�otherrrr�__lt__+sz RPMTransactionItemWrapper.__lt__cCs|j|jkS)N)r)rrrrr�__eq__.sz RPMTransactionItemWrapper.__eq__cCs
|jj�S)N)r�__hash__)rrrrr1sz"RPMTransactionItemWrapper.__hash__cCsdS)NTr)r�patternrrr�match4szRPMTransactionItemWrapper.matchcCs|jj�dk	S)N)r�
getRPMItem)rrrr�
is_package7sz$RPMTransactionItemWrapper.is_packagecCs|jj�dk	S)N)r�getCompsGroupItem)rrrr�is_group:sz"RPMTransactionItemWrapper.is_groupcCs|jj�dk	S)N)r�getCompsEnvironmentItem)rrrr�is_environment=sz(RPMTransactionItemWrapper.is_environmentcCs
|jj�S)N)rr)rrrr�	get_group@sz#RPMTransactionItemWrapper.get_groupcCs
|jj�S)N)rr)rrrr�get_environmentCsz)RPMTransactionItemWrapper.get_environmentcCs|jj�j�S)N)rrZgetName)rrrr�nameFszRPMTransactionItemWrapper.namecCs|jj�j�S)N)rrZgetEpoch)rrrr�epochJszRPMTransactionItemWrapper.epochcCs|jj�j�S)N)rrZ
getVersion)rrrr�versionNsz!RPMTransactionItemWrapper.versioncCs|jj�j�S)N)rrZ
getRelease)rrrr�releaseRsz!RPMTransactionItemWrapper.releasecCs|jj�j�S)N)rrZgetArch)rrrr�archVszRPMTransactionItemWrapper.archcCs*|jrdj|j|j|j�Sdj|j|j�S)Nz{}:{}-{}z{}-{})r"�formatr#r$)rrrr�evrZszRPMTransactionItemWrapper.evrcCs|jj�j�S)N)rrZgetNEVRA)rrrr�nevra`szRPMTransactionItemWrapper.nevracCs
|jj�S)N)rZ	getAction)rrrr�actiondsz RPMTransactionItemWrapper.actioncCs|jj|�dS)N)rZ	setAction)r�valuerrrr)hscCs
|jj�S)N)rZ	getReason)rrrr�reasonlsz RPMTransactionItemWrapper.reasoncCs|jj|�S)N)rZ	setReason)rr*rrrr+pscCs$y
|jj�Stk
rdSXdS)N�)rZ
getActionName�AttributeError)rrrr�action_namets
z%RPMTransactionItemWrapper.action_namecCs$y
|jj�Stk
rdSXdS)Nr,)rZgetActionShortr-)rrrr�action_short{s
z&RPMTransactionItemWrapper.action_shortcCs
|jj�S)N)r�getState)rrrr�state�szRPMTransactionItemWrapper.statecCs|jj|�dS)N)r�setState)rr*rrrr1�scCs
|jj�S)N)r�	getRepoid)rrrr�	from_repo�sz#RPMTransactionItemWrapper.from_repocCs|jj�sdSd|jj�S)Nr,�@)rr3)rrrr�ui_from_repo�s
z&RPMTransactionItemWrapper.ui_from_repocCsdS)Nr)rrrr�
obsoleting�sz$RPMTransactionItemWrapper.obsoletingcCs|jjj|�S)N)r
�rpm�
get_reason)rrrrr9�sz$RPMTransactionItemWrapper.get_reasoncCs|jjj|jS)N)r
r8Z_swdb_ti_pkgr)rrrr�pkg�szRPMTransactionItemWrapper.pkgcCs|jjS)N)r:�files)rrrrr;�szRPMTransactionItemWrapper.filescCs|jS)N)r:)rrrr�_active�sz!RPMTransactionItemWrapper._activeN)#�__name__�
__module__�__qualname__rrrrrrrrrrr �propertyr!r"r#r$r%r'r(r)�setterr+r.r/r1r4r6r7r9r:r;r<rrrrr	"sBr	c@s�eZdZdZdZdd�Zedd��Zedd��Zedd	��Z	ed
d��Z
edd
��Zedd��Zedd��Z
edd��Zedd��Zedd��Zedd��Zedd��Zdd�Zdd�Zd d!�Zd"d#�Zd$d%�Zd&d'�Zd(S))�TransactionWrapperFcCs
||_dS)N)�_trans)r�transrrrr�szTransactionWrapper.__init__cCs
|jj�S)N)rC�getId)rrrr�tid�szTransactionWrapper.tidcCs
|jj�S)N)rCZ
getCmdline)rrrr�cmdline�szTransactionWrapper.cmdlinecCs
|jj�S)N)rCZ
getReleasever)rrrr�
releasever�szTransactionWrapper.releasevercCs
|jj�S)N)rCZ
getDtBegin)rrrr�
beg_timestamp�sz TransactionWrapper.beg_timestampcCs
|jj�S)N)rCZgetDtEnd)rrrr�
end_timestamp�sz TransactionWrapper.end_timestampcCs
|jj�S)N)rC�getRpmdbVersionBegin)rrrr�beg_rpmdb_version�sz$TransactionWrapper.beg_rpmdb_versioncCs
|jj�S)N)rC�getRpmdbVersionEnd)rrrr�end_rpmdb_version�sz$TransactionWrapper.end_rpmdb_versioncCst|jj�tjjk�S)N)�intrCr0�libdnf�transaction�TransactionItemState_DONE)rrrr�return_code�szTransactionWrapper.return_codecCs
|jj�S)N)rCZ	getUserId)rrrr�loginuid�szTransactionWrapper.loginuidcCs|jS)N)�packages)rrrr�data�szTransactionWrapper.datacCs|jj�}t|�S)N)rC�getConsoleOutput�bool)r�outputrrr�	is_output�s
zTransactionWrapper.is_outputcCs
|jj�S)N)rCZ
getComment)rrrr�comment�szTransactionWrapper.commentcCs|jj�gS)N)rCrE)rrrr�tids�szTransactionWrapper.tidscCsgS)Nr)rrrr�performed_with�sz!TransactionWrapper.performed_withcs�jj�}�fdd�|D�S)Ncsg|]}t�|��qSr)r	)�.0�i)rrr�
<listcomp>�sz/TransactionWrapper.packages.<locals>.<listcomp>)rCZgetItems)r�resultr)rrrU�s
zTransactionWrapper.packagescCsdd�|jj�D�S)NcSsg|]}|d�qS)rr)r^r_rrrr`�sz-TransactionWrapper.output.<locals>.<listcomp>)rCrW)rrrrrY�szTransactionWrapper.outputcCsgS)Nr)rrrr�error�szTransactionWrapper.errorcCs|jj�|k|_dS)N)rCrM�altered_gt_rpmdb)rZrpmdbvrrr�compare_rpmdbv�sz!TransactionWrapper.compare_rpmdbvN)r=r>r?�altered_lt_rpmdbrcrr@rFrGrHrIrJrLrNrSrTrVrZr[r\r]rUrYrbrdrrrrrB�s*rBc@sheZdZdd�Zdd�Zedd��Zdd�Zed	d
��Zedd��Z	ed
d��Z
edd��Zdd�ZdS)�MergedTransactionWrappercCstjj|j�|_dS)N)rPrQZMergedTransactionrC)rrDrrrr�sz!MergedTransactionWrapper.__init__cCs|jj|j�dS)N)rC�merge)rrDrrrrg�szMergedTransactionWrapper.mergecCs
|jj�S)N)rCZlistUserIds)rrrrrT�sz!MergedTransactionWrapper.loginuidcCs
|jj�S)N)rCZlistIds)rrrrr\szMergedTransactionWrapper.tidscCsdd�|jj�D�S)NcSsg|]}t|tjjk��qSr)rOrPrQrR)r^r_rrrr`sz8MergedTransactionWrapper.return_code.<locals>.<listcomp>)rCZ
listStates)rrrrrSsz$MergedTransactionWrapper.return_codecCs
|jj�S)N)rCZlistCmdlines)rrrrrGsz MergedTransactionWrapper.cmdlinecCs
|jj�S)N)rCZlistReleasevers)rrrrrHsz#MergedTransactionWrapper.releasevercCs
|jj�S)N)rCZlistComments)rrrrr[sz MergedTransactionWrapper.commentcCsdd�|jj�D�S)NcSsg|]}|d�qS)rr)r^r_rrrr`sz3MergedTransactionWrapper.output.<locals>.<listcomp>)rCrW)rrrrrYszMergedTransactionWrapper.outputN)
r=r>r?rrgr@rTr\rSrGrHr[rYrrrrrf�srfc@s�eZdZd6dd�Zdd�Zedd��Zedd	��Zed
d��Zedd
��Z	edd��Z
dd�Zdd�Zedd��Z
dd�Zd7dd�Zd8dd�Zd d!�Zd"d#�Zd$d%�Zd&d'�Zd9d(d)�Zd*d+�Zd,d-�Zd:d.d/�Zd;d0d1�Zd2d3�Zd4d5�ZdS)<�
SwdbInterfacer,cCs8t|�|_d|_d|_d|_d|_d|_||_g|_dS)N)	�strrH�_rpm�_group�_envZ_addon_datar
�_db_dir�_output)rZdb_dirrHrrrrs
zSwdbInterface.__init__cCs|j�dS)N)�close)rrrr�__del__%szSwdbInterface.__del__cCs|jdkrt|�|_|jS)N)rjr)rrrrr8(s

zSwdbInterface.rpmcCs|jdkrt|�|_|jS)N)rkr)rrrr�group.s

zSwdbInterface.groupcCs|jdkrt|�|_|jS)N)rlr)rrrr�env4s

zSwdbInterface.envcCstjj|jtjjj�S)N)�os�path�joinrmrPrQ�SwdbZdefaultDatabaseName)rrrr�dbpath:szSwdbInterface.dbpathcCsZ|jsTytjj|j�|_Wn.tk
rH}ztt|���WYdd}~XnX|jj�|jS)z Lazy initialize Swdb object N)	r
rPrQrvrw�RuntimeErrorrri�initTransaction)rZexrrrr
>s
zSwdbInterface.swdbcCstjj||j�}|j�dS)N)rPrQZTransformerrw�	transform)rZ	input_dirZtransformerrrrrzKszSwdbInterface.transformcCsZy|`Wntk
rYnXd|_d|_d|_|jrJ|jj�|jj�d|_g|_dS)N)	�_tidr-rjrkrlr
ZcloseTransactionZ
closeDatabasern)rrrrroOs

zSwdbInterface.closecCs
|jj�S)N)r
ZgetPath)rrrrrt]szSwdbInterface.pathcCs
|jj�S)N)r
Z
resetDatabase)rrrr�reset_dbaszSwdbInterface.reset_dbTcCs|jj�}|sdSt|�S)N)r
ZgetLastTransactionrB)r�complete_transactions_only�trrr�lastes
zSwdbInterface.lastNrFcs��pg�dd��D��|jj�}dd�|D�}�rD�fdd�|D�}xJt|�D]>\}}|dkr`qN||d}|jj�|jj�krNd|_d|_qNW|ddd�S)	NcSsg|]}t|��qSr)rO)r^r_rrrr`osz%SwdbInterface.old.<locals>.<listcomp>cSsg|]}t|��qSr)rB)r^r_rrrr`qscsg|]}|j�kr|�qSr)rF)r^r_)r\rrr`tsrrT���)r
ZlistTransactions�	enumeraterCrKrMrerc)rr\�limitr}rar_rDZ
prev_transr)r\r�oldms

zSwdbInterface.oldcCst|jj��S)N)rBr
Z
getCurrent)rrrr�get_current�szSwdbInterface.get_currentcCsB|jj|�}|j|�}tjj}|jj||||�}|jtjj	�|S)zSet reason for package)
r8Z_pkg_to_swdb_rpm_item�reporPrQZ#TransactionItemAction_REASON_CHANGEr
ZaddItemr2rR)rr:r+�rpm_itemZrepoidr)Ztirrr�
set_reason�s
zSwdbInterface.set_reasoncCs|jjt|��S)zGet repository of package)r
Z
getRPMRepori)rr:rrrr��szSwdbInterface.repocCs*|jjt|��}|dkr|St||�}|S)zGet package data for packageN)r
ZgetRPMTransactionItemrir	)rr:rarrr�package_data�s

zSwdbInterface.package_datacCsfy|jj�WnYnX|jjttjtj���t|�|p>dtt	j
��|�}|jj|j�||_
|S)Nr,)r
ryZbeginTransactionrO�calendarZtimegm�timeZgmtimerirZgetloginuidZ
setReleaseverrHr{)rZ
rpmdb_versionZ
using_pkgsZtsisrGr[rFrrr�beg�s
zSwdbInterface.begcCsN|jj�}|j|j�|j|jp"d�|j|j�|j|j	�|j
|j�|S)Nr)r
Z
createRPMItemZsetNamer!ZsetEpochr"Z
setVersionr#Z
setReleaser$ZsetArchr%)rZpor�rrr�pkg_to_swdb_rpm_item�s
z"SwdbInterface.pkg_to_swdb_rpm_itemcCsDt|d�sdS|sdSx(|j�D]}t|�}|jjd|f�q WdS)Nr{r)�hasattr�
splitlinesrrn�append)r�msg�linerrr�log_scriptlet_output�s
z"SwdbInterface.log_scriptlet_outputcCs�t|d�sdS|dkrFtjj}x&|jD]}|jtjjkr&tjj}Pq&Wx |jD]\}}|j	j
||�qNWg|_|j	jtt
j
��t|�|�dS)Nr{)r�rPrQZTransactionState_DONEr8r1ZTransactionItemState_ERRORZTransactionState_ERRORrnr
ZaddConsoleOutputLineZendTransactionrOr�ri)rrNrS�errorsZtsiZfile_descriptorr�rrr�end�s

zSwdbInterface.endcCs|jj|�S)z{ Search for history transactions which contain specified
            packages al. la. "yum list". Returns transaction ids. )r
ZsearchTransactionsByRPM)rZpatternsZignore_caserrr�search�szSwdbInterface.searchcCs8|jj|j|jd�}|tjjkr$dS|tjjkr4dSdS)z)Returns True if package is user installedrTFr�)r
�resolveRPMTransactionItemReasonr!r%rPrQ�TransactionItemReason_USER�TransactionItemReason_UNKNOWN)rr:r+rrr�user_installed�szSwdbInterface.user_installedcCsF|r|jj|j|j|�}n|jj|j|jd�}|tjjkrBtjj}|S)a2Get reason of package before transaction being undone. If package
        is already installed in the system, keep his reason.

        :param pkg: package being installed
        :param first_trans: id of first transaction being undone
        :param rollback: True if transaction is performing a rollbackrr�)r
r�r!r%rPrQr�r�)rr:Zfirst_transZrollbackrarrr�get_erased_reason�szSwdbInterface.get_erased_reason)r,)T)NrF)Nr,)r,NN)T)r=r>r?rrpr@r8rqrrrwr
rzrortr|rr�r�r�r�r�r�r�r�r�r�r�r�rrrrrhs0




	

rh)r�rsr�Zlibdnf.transactionrPZlibdnf.utilsZdnf.i18nrZdnf.yumrZdnf.exceptionsrrqrrr�objectr	rBrfrhrrrr�<module>sM"detectcp.cpython-36.pyc000064400000001144151733372440010776 0ustar003

�vei��@sddlZdd�ZdS)�NcCs`tjjd�rdStjjd�s(tjjd�r,dStjjd�r<dStjjd�rLd	Stjjd
�r\dSdS)
Nz/usr/local/cpanel/cpanelZcPanelz"/usr/local/directadmin/directadminz(/usr/local/directadmin/custombuild/buildZDirectAdminz/usr/local/interworx/iworx.iniZ	InterWorxz/usr/local/ispmgr/bin/ispmgrZ
ISPManagerz/usr/local/psa/version�PleskZUnknown)�os�path�isfile�rr�#/opt/alt/alt-php-config/detectcp.py�	getCPNamesr)rrrrrr�<module>sabc.cpython-38.opt-1.pyc000064400000000301151733473260010665 0ustar00U

e5dD�@sddlTddlmZdS)�)�*)�__all__N)�_collections_abcr�rr�'/usr/lib64/python3.8/collections/abc.py�<module>sabc.cpython-38.pyc000064400000000301151733473270007727 0ustar00U

e5dD�@sddlTddlmZdS)�)�*)�__all__N)�_collections_abcr�rr�'/usr/lib64/python3.8/collections/abc.py�<module>sabc.cpython-38.opt-2.pyc000064400000000301151733473270010667 0ustar00U

e5dD�@sddlTddlmZdS)�)�*)�__all__N)�_collections_abcr�rr�'/usr/lib64/python3.8/collections/abc.py�<module>s