o
    IAf3                     @   s^  	 d Z ddlmZmZmZ ddlmZ ddlZddlZddl	Z
ddlmZ ddlmZ ddlZddlZddlZddlZg dZdadad	d
 Zdd Zdd Zdd ZeadadejdddfddZd1ddZdd Zdd Z G dd dZ!G dd dZ"ejfd d!Z#d2d"d#Z$ejfd$d%Z%d&d' Z&d(d) Z'd*d+ Z(d,d- Z)d.d/ Z*e+d0kre#  dS dS )3z2.6    )StringIOBytesIOTextIOWrapper)MappingN)
FeedParser)Message)MiniFieldStorageFieldStorageparseparse_multipartparse_headertestprint_exceptionprint_environ
print_formprint_directoryprint_argumentsprint_environ_usage c                  G   sZ   	 t jdtdd tr ts z	ttdddaW n	 ty   Y nw ts%tant	at|   d S )Nz7cgi.log() is deprecated as of 3.10. Use logging instead   )
stacklevelalocale)encoding)
warningswarnDeprecationWarninglogfilelogfpopenOSErrornologlogdologZallargs r%   /usr/lib/python3.10/cgi.pyinitlog9   s   r'   c                 G   s   	 t | | d  d S )N
)r   write)fmtargsr%   r%   r&   r#   ^   s   r#   c                  G   s   	 d S Nr%   r$   r%   r%   r&   r!   b   s   r!   c                   C   s   	 da trt  d atad S )Nr   )r   r   closer'   r"   r%   r%   r%   r&   closelogf   s   r.   &c           
      C   sX  	 | d u rt j} t| dr| j}nd}t| tr| j} d|vr#d|d< |d dkrt|d \}}|dkr<t| ||dS |d	krYt	|d
 }t
rP|t
krPtd| ||}	nd}	d|v rl|	re|	d }	|	|d  }	nt jdd  r|	ry|	d }	|	t jd  }	|	|d< nd|v r|d }	nt jdd  rt jd }	nd}	|	|d< tjj|	||||dS )Nr   zlatin-1REQUEST_METHODGETPOSTCONTENT_TYPEzmultipart/form-data)	separator!application/x-www-form-urlencodedCONTENT_LENGTHMaximum content length exceededr   QUERY_STRINGr/      )r   r4   )sysstdinhasattrr   
isinstancer   bufferr   r   intmaxlen
ValueErrorreaddecodeargvurllibr
   parse_qs)
fpenvironkeep_blank_valuesstrict_parsingr4   r   ctypepdictZclengthqsr%   r%   r&   r
   y   sH   



r
   utf-8replacec                    sx   	 |d  d}d|}t }|| z|d |d< W n	 ty&   Y nw t| |||ddi|d  fd	d
 D S )Nboundaryasciiz multipart/form-data; boundary={}zCONTENT-LENGTHzContent-Lengthr0   r2   )headersr   errorsrH   r4   c                    s   i | ]}|  |qS r%   )getlist).0kfsr%   r&   
<dictcomp>   s    z#parse_multipart.<locals>.<dictcomp>)rC   formatr   Zset_typeKeyErrorr	   )rG   rL   r   rS   r4   rP   rK   rR   r%   rW   r&   r      s   


r   c                 c   s    | d d dkrg| dd  } |  d}|dkrD| dd|| dd| d rD|  d|d }|dkrD| dd|| dd| d s(|dk rLt| }| d | }| V  | |d  } | d d dks	d S d S )Nr9   ;r   "\"r   )findcountlenstrip)sendfr%   r%   r&   _parseparam   s   
((
rf   c                 C   s   	 t d|  }| }i }|D ]I}|d}|dkrX|d |   }||d d   }t|dkrT|d |d   krBdkrTn n|dd }|dd	d
d}|||< q||fS )Nr\   =r   r9   r   r]   z\\\r^   )rf   __next__r_   rb   lowerra   rO   )linepartskeyrL   pinamevaluer%   r%   r&   r      s   
,r   c                   @   s>   e Zd Z	 dZdZdZdZi ZdZi Z	i Z
dd Zdd ZdS )r   Nc                 C   s   	 || _ || _d S r,   rq   rr   selfrq   rr   r%   r%   r&   __init__  s   
zMiniFieldStorage.__init__c                 C   s   	 d| j | jf S )NzMiniFieldStorage(%r, %r)rs   ru   r%   r%   r&   __repr__  s   zMiniFieldStorage.__repr__)__name__
__module____qualname__filenamelisttypefiletype_optionsdispositiondisposition_optionsrR   rv   rx   r%   r%   r%   r&   r      s    r   c                   @   s   e Zd Z	 dddejdddddddfddZd	d
 Zdd Zdd Zdd Z	dd Z
dd Zdd Zd:ddZd:ddZdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& ZdZd'd( Zd)d* Zd+Zd,d- Zd.d/ Zd0d1 Zd2d3 Zd4d5 Zd6d7 Zd8d9 ZdS );r	   N    r   rN   rO   r/   c                 C   sL  	 d}|| _ || _|
| _|| _d|v r|d  }d | _|dks$|dkrPd|v r-|d }ntjdd  r:tjd }nd}|t	
 d}t|}|d u rPdd	i}|d u r|i }|d
kr^d	|d< d|v rh|d |d< d|v rq|d | _d|v r{|d |d< nt|ttfstd|| _|d u rtjj| _nt|tr|j| _nt|drt|dstd|| _|| _|	| _t|tstdt|j || _d| _|| _di }}d| jv rt| jd \}}|| _|| _ d | _!d|v r|d | _!d | _"d|v r|d | _"| j"d u| _#d| jv rt| jd \}}n| js|d
kr"di }}nd	i }}|| _|| _$d|v r>|d | j| j| _%nd| _%d}d| jv riz	t&| jd }W n
 t'y\   Y nw t(ri|t(krit'd|| _)| jd u rz|dkrz|| _d  | _*| _+d| _,|d	kr| -  d S |d d dkr| .||| d S | /  d S )Nr1   r0   ZHEADr8   r9   r   surrogateescapezcontent-typer5   r2   r3   r6   content-lengthz?headers must be mapping or an instance of email.message.MessagerB   readlinezfp must be file pointerz#outerboundary must be bytes, not %sr   zcontent-dispositionrq   r|   z
text/plainrP   r   rh   r7   
   z
multipart/)0rI   rJ   max_num_fieldsr4   upper
qs_on_postr:   rD   encoder   getpreferredencodingr   r=   r   r   	TypeErrorrR   r;   r>   rG   r   r<   r   rS   bytesr~   ry   outerboundary
bytes_readlimitr   r   r   rq   r|   _binary_filer   innerboundaryr?   rA   r@   lengthr}   r   doneread_urlencoded
read_multiread_single)ru   rG   rR   r   rH   rI   rJ   r   r   rS   r   r4   methodrM   ZcdisprL   rK   Zclenr%   r%   r&   rv   B  s   +











zFieldStorage.__init__c                 C   s&   z| j   W d S  ty   Y d S w r,   )r   r-   AttributeErrorrw   r%   r%   r&   __del__  s
   zFieldStorage.__del__c                 C   s   | S r,   r%   rw   r%   r%   r&   	__enter__  s   zFieldStorage.__enter__c                 G   s   | j   d S r,   )r   r-   )ru   r+   r%   r%   r&   __exit__  s   zFieldStorage.__exit__c                 C   s   	 d| j | j| jf S )NzFieldStorage(%r, %r, %r))rq   r|   rr   rw   r%   r%   r&   rx     s   zFieldStorage.__repr__c                 C   s   t |  S r,   )iterkeysrw   r%   r%   r&   __iter__     zFieldStorage.__iter__c                 C   sX   |dkrt || jr| jd | j }| jd |S | jd ur(| j}|S d }|S )Nrr   r   )r   r   seekrB   r}   rt   r%   r%   r&   __getattr__  s   

zFieldStorage.__getattr__c                 C   s\   	 | j d u r
tdg }| j D ]}|j|kr|| q|s"t|t|dkr,|d S |S )Nnot indexabler9   r   )r}   r   rq   appendr[   ra   )ru   rn   founditemr%   r%   r&   __getitem__  s   

zFieldStorage.__getitem__c                 C   s4   	 || v r| | }t |trdd |D S |jS |S )Nc                 S      g | ]}|j qS r%   rr   rU   xr%   r%   r&   
<listcomp>      z)FieldStorage.getvalue.<locals>.<listcomp>r=   r}   rr   ru   rn   defaultrr   r%   r%   r&   getvalue  s   
zFieldStorage.getvaluec                 C   s0   	 || v r| | }t |tr|d jS |jS |S Nr   r   r   r%   r%   r&   getfirst!  s   

zFieldStorage.getfirstc                 C   s6   	 || v r| | }t |trdd |D S |jgS g S )Nc                 S   r   r%   r   r   r%   r%   r&   r   1  r   z(FieldStorage.getlist.<locals>.<listcomp>r   )ru   rn   rr   r%   r%   r&   rT   ,  s   
zFieldStorage.getlistc                 C   s,   	 | j d u r
tdt tdd | j D S )Nr   c                 s   s    | ]}|j V  qd S r,   rq   rU   r   r%   r%   r&   	<genexpr>;  s    z$FieldStorage.keys.<locals>.<genexpr>)r}   r   setrw   r%   r%   r&   r   7     
zFieldStorage.keysc                    s,   	 | j d u r
tdt fdd| j D S )Nr   c                 3   s    | ]}|j  kV  qd S r,   r   r   rn   r%   r&   r   A  s    z,FieldStorage.__contains__.<locals>.<genexpr>)r}   r   any)ru   rn   r%   r   r&   __contains__=  r   zFieldStorage.__contains__c                 C   s   	 t |  S r,   )ra   r   rw   r%   r%   r&   __len__C     zFieldStorage.__len__c                 C   s   | j d u r	tdt| j S )NzCannot be converted to bool.)r}   r   boolrw   r%   r%   r&   __bool__G  s   

zFieldStorage.__bool__c              	   C   s   	 | j | j}t|tstd| j t|jf || j	| j
}| jr+|d| j 7 }tjj|| j| j| j	| j
| j| jd}dd |D | _|   d S )N%s should return bytes, got %sr/   r   rS   r   r4   c                 S   s   g | ]	\}}t ||qS r%   r   rU   rn   rr   r%   r%   r&   r   Y  s    z0FieldStorage.read_urlencoded.<locals>.<listcomp>)rG   rB   r   r=   r   rA   r~   ry   rC   r   rS   r   rE   r
   	parse_qslrI   rJ   r   r4   r}   
skip_lines)ru   rM   queryr%   r%   r&   r   L  s    

zFieldStorage.read_urlencodedc                 C   sL  	 | j }t|std|f g | _| jr4tjj| j| j| j	| j
| j| j| jd}| jdd |D  | jp9| j}| j }t|tsPtd| jt|jf |  jt|7  _| d| j  kr}|r}| j }|  jt|7  _| d| j  kr}|sd| j}|d ur|t| j8 }	 t }	d}
	 | j }|
|7 }
| snq|
sn||  jt|
7  _|	|
| j
| j |	 }d	|v r|d	= | jd u rd n| j| j }|| j||||||| j
| j|| j}|d ur|d
8 }|jr|t|j8 }|dk rtd|  j|j7  _| j| |j s| j| j!  krdkrn nnq| "  d S )Nz&Invalid boundary in multipart form: %rr   c                 s   s    | ]
\}}t ||V  qd S r,   r   r   r%   r%   r&   r   i  s    z*FieldStorage.read_multi.<locals>.<genexpr>r      --Tr   r   r9   r   zMax number of fields exceeded)#r   valid_boundaryrA   r}   r   rE   r
   r   rI   rJ   r   rS   r   r4   extendFieldStorageClass	__class__rG   r   r=   r   r~   ry   r   ra   rb   r   ZfeedrC   r-   r   r   r   r   r   )ru   rH   rI   rJ   Zibr   klassZ
first_liner   parserZhdr_textdatarR   r   partr%   r%   r&   r   ^  s   




($zFieldStorage.read_multic                 C   s6   	 | j dkr|   |   n|   | jd d S r   )r   read_binaryr   
read_linesr   r   rw   r%   r%   r&   r     s   

zFieldStorage.read_singlei    c                 C   s   	 |   | _| j}|dkrN|dkrP| jt|| j}t|ts,t	d| jt
|jf |  jt|7  _|s<d| _d S | j| |t| }|dksd S d S d S )Nr   r   rh   )	make_filer   r   rG   rB   minbufsizer=   r   rA   r~   ry   r   ra   r   r)   )ru   Ztodor   r%   r%   r&   r     s&   

zFieldStorage.read_binaryc                 C   sD   	 | j rt  | _| _nt  | _| _| jr|   d S |   d S r,   )r   r   r   _FieldStorage__filer   r   read_lines_to_outerboundaryread_lines_to_eofrw   r%   r%   r&   r     s   zFieldStorage.read_linesc                 C   sz   	 | j d ur$| j  t| dkr$|  | _| j  }| j| d | _ | jr/| j| d S | j|| j	| j
 d S )Ni  )r   tellra   r   r   r   r)   r   rC   r   rS   )ru   rl   r   r%   r%   r&   Z__write  s   


zFieldStorage.__writec                 C   s<   	 	 | j d}|  jt|7  _|sd| _d S | | q)Nr9      rh   )rG   r   r   ra   r   _FieldStorage__write)ru   rl   r%   r%   r&   r     s   
zFieldStorage.read_lines_to_eofc           	      C   sB  	 d| j  }|d }d}d}d}	 | jd ur#d| j  kr"|kr#d S  | jd}|  jt|7  _|t|7 }|s?d| _d S |dkrI|| }d}|drc|rc| }||krZd S ||krcd| _d S |}|	d	rud	}|d d
 }d}n$|	drd}|d d }d}n|	drd}|d d }d}nd}d}| 
||  q)Nr   r   Tr   r9   r   rh      s   
   
F)r   r   rG   r   r   ra   r   
startswithrstripendswithr   )	ru   next_boundarylast_boundarydelimlast_line_lfend_readrl   strippedlineZodelimr%   r%   r&   r     sV   



z(FieldStorage.read_lines_to_outerboundaryc                 C   s   	 | j r| jr	d S d| j  }|d }d}	 | jd}|  jt|7  _|s+d| _d S |drE|rE| }||kr<d S ||krEd| _d S |d}q)Nr   Tr   rh   r9   r   )r   r   rG   r   r   ra   r   rb   )ru   r   r   r   rl   r   r%   r%   r&   r     s*   

zFieldStorage.skip_linesc                 C   s$   	 | j r	tdS tjd| jddS )Nzwb+zw+r(   )r   newline)r   tempfileTemporaryFiler   rw   r%   r%   r&   r   +  s   
zFieldStorage.make_filer,   ) ry   rz   r{   osrH   rv   r   r   r   rx   r   r   r   r   r   rT   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r%   r%   r%   r&   r	     sD    )
 &

E	
2r	   c                 C   s   	 t d t   tjt_z't }t  t  t| t|  t	  dd }|fdd}t d |  W n   t
  Y t d dazt }t  t  t| t|  W d S    t
  Y d S )	NzContent-type: text/htmlc                   S   s   t d d S )Nz,testing print_exception() -- <I>italics?</I>)execr%   r%   r%   r&   re   ^  r   ztest.<locals>.fc                 S   s
   |   d S r,   r%   )re   r%   r%   r&   g`  s   
ztest.<locals>.gz9<H3>What follows is a test, not an actual exception:</H3>z*<H1>Second try with a small maxlen...</H1>2   )printr:   stdoutstderrr	   r   r   r   r   r   r   r@   )rH   formre   r   r%   r%   r&   r   M  s6   
r   c              	   C   sx   | d u rt  \} }}dd l}t  td ||||| | }tdtd|d d t|d f  ~d S )Nr   z+<H3>Traceback (most recent call last):</H3>z<PRE>%s<B>%s</B></PRE>r   rh   )	r:   exc_info	tracebackr   	format_tbformat_exception_onlyhtmlescapejoin)r~   rr   tbr   r   r}   r%   r%   r&   r   t  s   

r   c              	   C   s^   	 t |  }t  td td |D ]}tdt|dt| |  qtd t  d S )Nz<H3>Shell Environment:</H3><DL><DT><DD></DL>)sortedr   r   r   r   )rH   r   rn   r%   r%   r&   r     s    
r   c                 C   s   	 t |  }t  td |std td |D ]-}tdt| d dd | | }tdttt| d	  td
tt|  qtd t  d S )Nz<H3>Form Contents:</H3>z<P>No form fields.r   r   : )rd   z<i>z</i>r   r   )r   r   r   r   r   reprr~   )r   r   rn   rr   r%   r%   r&   r     s   
r   c               
   C   sn   	 t   t d zt } W n ty* } zt dtt| W Y d }~nd }~ww t t|  t   d S )Nz#<H3>Current Working Directory:</H3>zOSError:)r   r   getcwdr    r   r   str)pwdmsgr%   r%   r&   r     s    
r   c                   C   s(   t   t d t   t tj t   d S )Nz <H3>Command Line Arguments:</H3>)r   r:   rD   r%   r%   r%   r&   r     s
   

r   c                   C   s   	 t d d S )Na  
<H3>These environment variables could have been set:</H3>
<UL>
<LI>AUTH_TYPE
<LI>CONTENT_LENGTH
<LI>CONTENT_TYPE
<LI>DATE_GMT
<LI>DATE_LOCAL
<LI>DOCUMENT_NAME
<LI>DOCUMENT_ROOT
<LI>DOCUMENT_URI
<LI>GATEWAY_INTERFACE
<LI>LAST_MODIFIED
<LI>PATH
<LI>PATH_INFO
<LI>PATH_TRANSLATED
<LI>QUERY_STRING
<LI>REMOTE_ADDR
<LI>REMOTE_HOST
<LI>REMOTE_IDENT
<LI>REMOTE_USER
<LI>REQUEST_METHOD
<LI>SCRIPT_NAME
<LI>SERVER_NAME
<LI>SERVER_PORT
<LI>SERVER_PROTOCOL
<LI>SERVER_ROOT
<LI>SERVER_SOFTWARE
</UL>
In addition, HTTP headers sent by the server may be passed in the
environment as well.  Here are some common variable names:
<UL>
<LI>HTTP_ACCEPT
<LI>HTTP_CONNECTION
<LI>HTTP_HOST
<LI>HTTP_PRAGMA
<LI>HTTP_REFERER
<LI>HTTP_USER_AGENT
</UL>
)r   r%   r%   r%   r&   r     r   r   c                 C   s(   dd l }t| trd}nd}||| S )Nr   s   ^[ -~]{0,200}[!-~]$z^[ -~]{0,200}[!-~]$)rer=   r   match)rc   r  Z_vb_patternr%   r%   r&   r     s
   
r   __main__)rN   rO   r/   )NNNN),__version__ior   r   r   collections.abcr   r:   r   urllib.parserE   Zemail.parserr   Zemail.messager   r   r   r   r   __all__r   r   r'   r#   r!   r.   r"   r@   rH   r
   r   rf   r   r   r	   r   r   r   r   r   r   r   r   ry   r%   r%   r%   r&   <module>   sZ   %	

F    :
'/
