CasperSecurity

Current Path : /usr/lib/python3.10/wsgiref/__pycache__/
Upload File :
Current File : //usr/lib/python3.10/wsgiref/__pycache__/validate.cpython-310.pyc

o

`�wi�:�@s�dZdgZddlZddlZddlZe�d�Ze�d�ZGdd�de�Z	dd	�Z
d
d�Zdd�ZGd
d�d�Z
Gdd�d�ZGdd�d�ZGdd�d�ZGdd�d�Zdd�Zdd�Zdd�Zdd�Zdd �Zd!d"�Zd#d$�Zd%d&�ZdS)'a&
Middleware to check for obedience to the WSGI specification.

Some of the things this checks:

* Signature of the application and start_response (including that
  keyword arguments are not used).

* Environment checks:

  - Environment is a dictionary (and not a subclass).

  - That all the required keys are in the environment: REQUEST_METHOD,
    SERVER_NAME, SERVER_PORT, wsgi.version, wsgi.input, wsgi.errors,
    wsgi.multithread, wsgi.multiprocess, wsgi.run_once

  - That HTTP_CONTENT_TYPE and HTTP_CONTENT_LENGTH are not in the
    environment (these headers should appear as CONTENT_LENGTH and
    CONTENT_TYPE).

  - Warns if QUERY_STRING is missing, as the cgi module acts
    unpredictably in that case.

  - That CGI-style variables (that don't contain a .) have
    (non-unicode) string values

  - That wsgi.version is a tuple

  - That wsgi.url_scheme is 'http' or 'https' (@@: is this too
    restrictive?)

  - Warns if the REQUEST_METHOD is not known (@@: probably too
    restrictive).

  - That SCRIPT_NAME and PATH_INFO are empty or start with /

  - That at least one of SCRIPT_NAME or PATH_INFO are set.

  - That CONTENT_LENGTH is a positive integer.

  - That SCRIPT_NAME is not '/' (it should be '', and PATH_INFO should
    be '/').

  - That wsgi.input has the methods read, readline, readlines, and
    __iter__

  - That wsgi.errors has the methods flush, write, writelines

* The status is a string, contains a space, starts with an integer,
  and that integer is in range (> 100).

* That the headers is a list (not a subclass, not another kind of
  sequence).

* That the items of the headers are tuples of strings.

* That there is no 'status' header (that is used in CGI, but not in
  WSGI).

* That the headers don't contain newlines or colons, end in _ or -, or
  contain characters codes below 037.

* That Content-Type is given if there is content (CGI often has a
  default content type, but WSGI does not).

* That no Content-Type is given when there is no content (@@: is this
  too restrictive?)

* That the exc_info argument to start_response is a tuple or None.

* That all calls to the writer are with strings, and no other methods
  on the writer are accessed.

* That wsgi.input is used properly:

  - .read() is called with exactly one argument

  - That it returns a string

  - That readline, readlines, and __iter__ return strings

  - That .close() is not called

  - No other methods are provided

* That wsgi.errors is used properly:

  - .write() and .writelines() is called with a string

  - That .close() is not called, and no other methods are provided.

* The response iterator:

  - That it is not a string (it should be a list of a single string; a
    string will work, but perform horribly).

  - That .__next__() returns a string

  - That the iterator is not iterated over until start_response has
    been called (that can signal either a server or application
    error).

  - That .close() is called (doesn't raise exception, only prints to
    sys.stderr, because we only know it isn't called when the object
    is garbage collected).
�	validator�Nz^[a-zA-Z][a-zA-Z0-9\-_]*$z[\000-\037]c@seZdZdZdS)�WSGIWarningz:
    Raised in response to WSGI-spec-related warnings
    N)�__name__�
__module__�__qualname__�__doc__�rr�'/usr/lib/python3.10/wsgiref/validate.pyrysrcGs|st|��dS�N)�AssertionError)�cond�argsrrr	�assert_~s�rcCs$t|�tur|Std�|t|����)Nz!{0} must be of type str (got {1}))�type�strr�format�repr)�value�titlerrr	�check_string_type�s
�rcs�fdd�}|S)a�
    When applied between a WSGI server and a WSGI application, this
    middleware will check for WSGI compliance on a number of levels.
    This middleware does not modify the request or response in any
    way, but will raise an AssertionError if anything seems off
    (except for a failure to close the application iterator, which
    will be printed to stderr -- there's no way to raise an exception
    at that point).
    cs�tt|�dkd�t|d�|\}�t|�g���fdd�}t|d�|d<t|d�|d<�||�}t|duo=|dkd	�t|�t|��S)
N�zTwo arguments required�No keyword arguments allowedcs�tt|�dkpt|�dkd|f�t|d�|d}|d}t|�dkr+|d}nd}t|�t|�t||�t|���d�t�|��S)Nr�zInvalid number of arguments: %srr�)r�len�check_status�
check_headers�check_content_type�check_exc_info�append�WriteWrapper)r
�kw�status�headers�exc_info��start_response�start_response_startedrr	�start_response_wrapper�s�


z;validator.<locals>.lint_app.<locals>.start_response_wrapper�
wsgi.input�wsgi.errorsFz>The application must return an iterator, if only an empty list)rr�
check_environ�InputWrapper�ErrorWrapper�check_iterator�IteratorWrapper)r
r!�environr(�iterator��applicationr%r	�lint_app�s
�
zvalidator.<locals>.lint_appr)r3r4rr2r	r�s)c@s<eZdZdd�Zdd�Zdd�Zdd�Zd	d
�Zdd�Zd
S)r,cC�
||_dSr
)�input)�self�
wsgi_inputrrr	�__init__��
zInputWrapper.__init__cGs0tt|�dk�|jj|�}tt|�tu�|S�Nr)rrr6�readr�bytes�r7r
�vrrr	r<��zInputWrapper.readcGs0tt|�dk�|jj|�}tt|�tu�|Sr;)rrr6�readlinerr=r>rrr	rA�r@zInputWrapper.readlinecGsJtt|�dk�|jj|�}tt|�tu�|D]
}tt|�tu�q|Sr;)rrr6�	readlinesr�listr=)r7r
�lines�linerrr	rB�szInputWrapper.readlinesccs�	|��}|s
dS|Vqr
)rA)r7rErrr	�__iter__�s��zInputWrapper.__iter__cC�tdd�dS)Nrz input.close() must not be called�r�r7rrr	�close��zInputWrapper.closeN)	rrrr9r<rArBrFrJrrrr	r,�sr,c@�4eZdZdd�Zdd�Zdd�Zdd�Zd	d
�ZdS)r-cCr5r
)�errors)r7�wsgi_errorsrrr	r9�r:zErrorWrapper.__init__cCs tt|�tu�|j�|�dSr
)rrrrM�write�r7�srrr	rO�szErrorWrapper.writecCs|j��dSr
)rM�flushrIrrr	rR�rKzErrorWrapper.flushcCs|D]}|�|�qdSr
)rO)r7�seqrErrr	�
writelines�s�zErrorWrapper.writelinescCrG)Nrz!errors.close() must not be calledrHrIrrr	rJ�rKzErrorWrapper.closeN)rrrr9rOrRrTrJrrrr	r-�sr-c@�eZdZdd�Zdd�ZdS)r cCr5r
)�writer)r7�wsgi_writerrrr	r9�r:zWriteWrapper.__init__cCstt|�tu�|�|�dSr
)rrr=rVrPrrr	�__call__�szWriteWrapper.__call__N)rrrr9rXrrrr	r ��r c@rU)�PartialIteratorWrappercCr5r
�r1)r7�
wsgi_iteratorrrr	r9r:zPartialIteratorWrapper.__init__cCst|jd�Sr
)r/r1rIrrr	rFszPartialIteratorWrapper.__iter__N)rrrr9rFrrrr	rZ�rYrZc@rL)r/cCs ||_t|�|_d|_||_dS)NF)�original_iterator�iterr1�closed�check_start_response)r7r\r`rrr	r9	s

zIteratorWrapper.__init__cCs|Sr
rrIrrr	rFszIteratorWrapper.__iter__cCsTt|jd�t|j�}t|�turtdd|f�|jdur(t|jd�d|_|S)NzIterator read after closedFz$Iterator yielded non-bytestring (%r)zjThe application returns and we started iterating over its body, but start_response has not yet been called)rr_�nextr1rr=r`)r7r?rrr	�__next__s�

�zIteratorWrapper.__next__cCs$d|_t|jd�r|j��dSdS)NTrJ)r_�hasattrr]rJrIrrr	rJs�zIteratorWrapper.closecCs"|js	tj�d�t|jd�dS)Nz/Iterator garbage collected without being closed)r_�sys�stderrrOrrIrrr	�__del__#s��zIteratorWrapper.__del__N)rrrr9rFrbrJrfrrrr	r/sr/cCs�tt|�tudt|�|f�dD]}t||vd|f�qdD]}t||vd||dd�f�q d|vr<t�dt�|��D]}d	|vrGq@tt||�tud
|t||�||f�q@tt|d�tud|df�t|d
dvd|d
�t	|d�t
|d�|ddvr�t�d|dt�t|�d�p�|d�d�d|d�t|�d�p�|d�d�d|d�|�d�r�tt
|d�dkd|d�|�d�s�td|vd�t|�d�dkd�dS)Nz:Environment is not of the right type: %r (environment: %r))	�REQUEST_METHOD�SERVER_NAME�SERVER_PORT�wsgi.versionr)r*zwsgi.multithreadzwsgi.multiprocessz
wsgi.run_oncez$Environment missing required key: %r)�HTTP_CONTENT_TYPE�HTTP_CONTENT_LENGTHz8Environment should not have the key: %s (use %s instead)��QUERY_STRINGz�QUERY_STRING is not in the WSGI environment; the cgi module will use sys.argv when this variable is missing, so application errors are more likely�.z9Environmental variable %s is not a string: %r (value: %r)rjz#wsgi.version should be a tuple (%r)zwsgi.url_scheme)�http�httpszwsgi.url_scheme unknown: %rr)r*rg)�GET�HEAD�POST�OPTIONS�PATCH�PUT�DELETE�TRACEzUnknown REQUEST_METHOD: %r�SCRIPT_NAME�/z$SCRIPT_NAME doesn't start with /: %r�	PATH_INFOz"PATH_INFO doesn't start with /: %r�CONTENT_LENGTHrzInvalid CONTENT_LENGTH: %rzgOne of SCRIPT_NAME or PATH_INFO are required (PATH_INFO should at least be '/' if SCRIPT_NAME is empty)zOSCRIPT_NAME cannot be '/'; it should instead be '', and PATH_INFO should be '/')rr�dict�warnings�warnr�keysr�tuple�check_input�check_errors�get�
startswith�int)r0�keyrrr	r+*sx
���������
�
�
�
�

�
��r+cC�&dD]}tt||�d||f�qdS)N)r<rArBrFz-wsgi.input (%r) doesn't have the attribute %s�rrc)r8�attrrrr	r�k�
���r�cCr�)N)rRrOrTz.wsgi.errors (%r) doesn't have the attribute %sr�)rNr�rrr	r�qr�r�cCszt|d�}|�dd�d}tt|�dkd|�t|�}t|dkd|�t|�dks1|dd	kr;t�d
|t�dSdS)N�Statusrrrz)Status codes must be three characters: %r�dzStatus code is invalid: %r�� zjThe status string (%r) should be a three-digit integer followed by a single space and a status explanation)r�splitrrr�rr�r)r"�status_code�
status_intrrr	rws
����rcCstt|�tud|t|�f�|D]n}tt|�tud|t|�f�tt|�dk�|\}}t|d�}t|d�}t|��dkd|�td|voKd	|vd
|�tt�|�d|�t|�	d�of|�	d
�d|�t
�|�rtdd|t
�|��d�f�qdS)Nz%Headers (%r) must be of type list: %rz1Individual headers (%r) must be of type tuple: %rr�Header namezHeader valuer"zyThe Status header cannot be used; it conflicts with CGI script, and HTTP status is not given through headers (value: %r).�
�:z,Header names may not contain ':' or '\n': %rzBad header name: %r�-�_z#Names may not end in '-' or '_': %rrz#Bad header value: %r (bad char: %r))rrrCr�rr�lower�	header_re�search�endswith�bad_header_value_re�group)r#�item�namerrrr	r�sB
��
��

����
���rcCs�t|d�}t|�dd�d�}d}|D]\}}t|d�}|��dkr0||vr)dStdd|�q||vr>tdd|�dSdS)	Nr�rr)��i0r�zcontent-typezJContent-Type header found in a %s response, which must not return content.z,No Content-Type header found in headers (%s))rr�r�r�r)r"r#�code�NO_MESSAGE_BODYr�rrrr	r�s

���rcCs*t|dup
t|�tud|t|�f�dS)Nz exc_info (%r) is not a tuple: %r)rrr�)r$rrr	r�s�rcCstt|ttf�d�dS)NzwYou should not return a string as your application iterator, instead return a single-item list containing a bytestring.)r�
isinstancerr=r[rrr	r.�s�r.)r�__all__�rerdr�compiler�r��Warningrrrrr,r-r rZr/r+r�r�rrrrr.rrrr	�<module>s0j

7#		#A
Hacker Blog, Shell İndir, Sql İnjection, XSS Attacks, LFI Attacks, Social Hacking, Exploit Bot, Proxy Tools, Web Shell, PHP Shell, Alfa Shell İndir, Hacking Training Set, DDoS Script, Denial Of Service, Botnet, RFI Attacks, Encryption
Telegram @BIBIL_0DAY