???<!-- GIF89;a -->
123123123123
.....................................................................................................................................???<!-- GIF89;a -->
123123123123
.....................................................................................................................................U
    &Ì.eéŸ ã                   @   s
  d Z dZdZddlmZ ddlZddlZddlZddl	Z	ddl
Z
ddlZddlZddlZddlZddlZzddlZW n ek
rŒ   dZY nX zddlZW n ek
r²   dZY nX eefZzeef7 ZW n ek
rÞ   Y nX dddd	d
ddddddddddgZdZdZdZdZe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#Z)d$Z*d%Z+d&Z,d'Z-d(Z.d)Z/d*Z0d+Z1dZ2d,Z3d-Z4e4Z5e#e$e%e&e)e*e+e'e(e,e-e.fZ6e#e$e+e.fZ7e,e-e.fZ8d.Z9d/d0d1d2hZ:e;e;e;e<e<e<d3œZ=ej>d4kràd5Z?ne @¡ Z?d6d7„ ZAd8d9„ ZBd:d;„ ZCd<e5fd=d>„ZDd?d@„ ZEdedfdAdB„ZFdCdD„ ZGG dEd	„ d	eHƒZIG dFd„ deIƒZJG dGd
„ d
eIƒZKG dHd„ deIƒZLG dId„ deIƒZMG dJd„ deIƒZNG dKdL„ dLeNƒZOG dMdN„ dNeNƒZPG dOdP„ dPeNƒZQG dQdR„ dReNƒZRG dSdT„ dTeNƒZSG dUdV„ dVƒZTG dWdX„ dXƒZUG dYdZ„ dZeVƒZWG d[d\„ d\eVƒZXG d]d^„ d^ejYƒZZG d_d`„ d`eIƒZ[G dadb„ dbe[ƒZ\G dcdd„ dde[ƒZ]G dedf„ dfe[ƒZ^G dgdh„ dhe[ƒZ_G didj„ dje[ƒZ`dzdkdl„Zadmdn„ Zbdodp„ Zcdqdr„ ZdebeceddsœZeeVƒ ZfG dtd„ deVƒZgG dud„ deVƒZhdvd„ ZiehjZdwdx„ Zjekdykrejƒ  dS ){z0.9.0u"   Lars GustÃ¤bel (lars@gustaebel.de)u4   Gustavo Niemeyer, Niels GustÃ¤bel, Richard Townsend.é    )ÚopenNÚTarFileÚTarInfoÚ
is_tarfileÚTarErrorÚ	ReadErrorÚCompressionErrorÚStreamErrorÚExtractErrorÚHeaderErrorÚENCODINGÚUSTAR_FORMATÚ
GNU_FORMATÚ
PAX_FORMATÚDEFAULT_FORMATr   Tz/etc/python/tarfile.cfgó    i   é   s   ustar   s   ustar 00éd   é›   ó   0ó   1ó   2ó   3ó   4ó   5ó   6ó   7ó   Ló   Kó   Só   xó   gó   Xé   é   )ÚpathÚlinkpathÚsizeÚmtimeÚuidÚgidÚunameÚgnamer%   r&   r+   r,   )ZatimeÚctimer(   r)   r*   r'   Úntúutf-8c                 C   s8   | d krt dƒ‚|  ||¡} | d |… |t| ƒ t  S )Nzmetadata cannot contain None)Ú
ValueErrorÚencodeÚlenÚNUL)ÚsÚlengthÚencodingÚerrors© r8   ú/usr/lib64/python3.8/tarfile.pyÚstn§   s    r:   c                 C   s*   |   d¡}|dkr| d |… } |  ||¡S )Nr   éÿÿÿÿ)ÚfindÚdecode)r4   r6   r7   Úpr8   r8   r9   Únts¯   s    
r?   c                 C   s¦   | d dkrbd}t t| ƒd ƒD ]}|dK }|| |d  7 }q | d dkr¢dt| ƒd  |  }n@z"t| ddƒ} t|  ¡ p|d	dƒ}W n tk
r    td
ƒ‚Y nX |S )Nr   )é€   éÿ   r#   é   rA   é   ÚasciiÚstrictÚ0úinvalid header)Úranger2   r?   ÚintÚstripr0   ÚInvalidHeaderError)r4   ÚnÚir8   r8   r9   Únti·   s    rN   rB   c                 C   sØ   t | ƒ} d|   kr$d|d  k rDn ntd|d | f dƒt }n|tkrÌd|d   |   krrd|d  k rÌn nV| dkrŠtdgƒ}ntdgƒ}d| |  } t|d ƒD ]}| d| d@ ¡ | dL } q¬ntd	ƒ‚|S )
Nr   rB   r#   z%0*orD   rC   r@   rA   zoverflow in number field)rI   Úbytesr3   r   Ú	bytearrayrH   Úinsertr0   )rL   ÚdigitsÚformatr4   rM   r8   r8   r9   ÚitnË   s     2
rT   c                 C   s0   dt t d| ¡ƒ }dt t d| ¡ƒ }||fS )NrC   Z
148B8x356BZ
148b8x356b)ÚsumÚstructZunpack_from)ÚbufZunsigned_chksumZsigned_chksumr8   r8   r9   Úcalc_chksumsè   s    	rX   c           	      C   s¦   |pd}|dkrd S |d kr.t  | ||¡ d S t||ƒ\}}t|ƒD ],}|  |¡}t|ƒ|k rf|dƒ‚| |¡ qD|dkr¢|  |¡}t|ƒ|k r˜|dƒ‚| |¡ d S )Ni @  r   úunexpected end of data)ÚshutilÚcopyfileobjÚdivmodrH   Úreadr2   Úwrite)	ÚsrcZdstr5   Ú	exceptionÚbufsizeÚblocksÚ	remainderÚbrW   r8   r8   r9   r[   õ   s$    


r[   c                 C   s8   t tjdd ƒ}|d k	r(|  |d¡ |¡} t| dd d S )Nr6   Úbackslashreplaceú )Úend)ÚgetattrÚsysÚstdoutr1   r=   Úprint)r4   r6   r8   r8   r9   Ú_safe_print  s    rl   c                   @   s   e Zd ZdS )r   N©Ú__name__Ú
__module__Ú__qualname__r8   r8   r8   r9   r     s   c                   @   s   e Zd ZdS )r
   Nrm   r8   r8   r8   r9   r
     s   c                   @   s   e Zd ZdS )r   Nrm   r8   r8   r8   r9   r     s   c                   @   s   e Zd ZdS )r   Nrm   r8   r8   r8   r9   r     s   c                   @   s   e Zd ZdS )r	   Nrm   r8   r8   r8   r9   r	   !  s   c                   @   s   e Zd ZdS )r   Nrm   r8   r8   r8   r9   r   $  s   c                   @   s   e Zd ZdS )ÚEmptyHeaderErrorNrm   r8   r8   r8   r9   rq   '  s   rq   c                   @   s   e Zd ZdS )ÚTruncatedHeaderErrorNrm   r8   r8   r8   r9   rr   *  s   rr   c                   @   s   e Zd ZdS )ÚEOFHeaderErrorNrm   r8   r8   r8   r9   rs   -  s   rs   c                   @   s   e Zd ZdS )rK   Nrm   r8   r8   r8   r9   rK   0  s   rK   c                   @   s   e Zd ZdS )ÚSubsequentHeaderErrorNrm   r8   r8   r8   r9   rt   3  s   rt   c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
Ú_LowLevelFilec                 C   sF   t jt jt jB t jB dœ| }tt dƒr2|t jO }t  ||d¡| _d S )N©ÚrÚwÚO_BINARYi¶  )	ÚosÚO_RDONLYÚO_WRONLYÚO_CREATÚO_TRUNCÚhasattrry   r   Úfd)ÚselfÚnameÚmoder8   r8   r9   Ú__init__@  s    þý

z_LowLevelFile.__init__c                 C   s   t  | j¡ d S ©N)rz   Úcloser€   ©r   r8   r8   r9   r†   I  s    z_LowLevelFile.closec                 C   s   t  | j|¡S r…   )rz   r]   r€   ©r   r'   r8   r8   r9   r]   L  s    z_LowLevelFile.readc                 C   s   t  | j|¡ d S r…   )rz   r^   r€   ©r   r4   r8   r8   r9   r^   O  s    z_LowLevelFile.writeN)rn   ro   rp   r„   r†   r]   r^   r8   r8   r8   r9   ru   :  s   	ru   c                   @   sn   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
ddd„Zdd„ Zdd„ Zdd„ ZdS )Ú_Streamc           	      C   sä  d| _ |d krt||ƒ}d| _ |dkr6t|ƒ}| ¡ }|p<d| _|| _|| _|| _|| _d| _	d| _
d| _zL|dkrÖzdd l}W n tk
rž   tdƒ‚Y nX || _| d¡| _|d	krÌ|  ¡  |j| _n|  ¡  nà|d
kr:zdd l}W n tk
r
   tdƒ‚Y nX |d	kr.d| _| ¡ | _t| _n
| ¡ | _n||dkr zdd l}W n tk
rn   tdƒ‚Y nX |d	kr”d| _| ¡ | _|j| _n
| ¡ | _n|dkr¶td| ƒ‚W n&   | j sÒ| j ¡  d| _‚ Y nX d S )NTFÚ*Ú ó    r   Úgzzzlib module is not availablerw   Úbz2úbz2 module is not availableÚxzúlzma module is not availableÚtarúunknown compression type %r) Ú_extfileobjru   Ú_StreamProxyÚgetcomptyper‚   rƒ   ÚcomptypeÚfileobjra   rW   ÚposÚclosedÚzlibÚImportErrorr   Úcrc32ÚcrcÚ_init_read_gzÚerrorr`   Ú_init_write_gzr   ÚdbufZBZ2DecompressorÚcmpÚOSErrorZBZ2CompressorÚlzmaZLZMADecompressorÚ	LZMAErrorZLZMACompressorr†   )	r   r‚   rƒ   r˜   r™   ra   rœ   r   r¦   r8   r8   r9   r„   ]  sl    












z_Stream.__init__c                 C   s   t | dƒr| js|  ¡  d S )Nr›   )r   r›   r†   r‡   r8   r8   r9   Ú__del__£  s    z_Stream.__del__c                 C   s’   | j  d| j j| j j | j jd¡| _t dtt	 	¡ ƒ¡}|  
d| d ¡ | j d¡rf| jd d… | _tj | j¡| _|  
| j dd	¡t ¡ d S )
Né	   r   ú<Ls   ‹s   ÿú.gzéýÿÿÿz
iso-8859-1Úreplace)rœ   ZcompressobjZDEFLATEDÚ	MAX_WBITSZDEF_MEM_LEVELr¤   rV   ÚpackrI   ÚtimeÚ_Stream__writer‚   Úendswithrz   r%   Úbasenamer1   r3   )r   Z	timestampr8   r8   r9   r¢   §  s    ýz_Stream._init_write_gzc                 C   sR   | j dkr| j || j¡| _|  jt|ƒ7  _| j dkrD| j |¡}|  |¡ d S )NrŽ   r“   )	r˜   rœ   rž   rŸ   rš   r2   r¤   Úcompressr±   r‰   r8   r8   r9   r^   ·  s    

z_Stream.writec                 C   sN   |  j |7  _ t| j ƒ| jkrJ| j | j d | j… ¡ | j | jd … | _ qd S r…   )rW   r2   ra   r™   r^   r‰   r8   r8   r9   Z__writeÁ  s    z_Stream.__writec                 C   s²   | j r
d S d| _ zŠ| jdkr:| jdkr:|  j| j ¡ 7  _| jdkr˜| jr˜| j 	| j¡ d| _| jdkr˜| j 	t
 d| j¡¡ | j 	t
 d| jd@ ¡¡ W 5 | js¬| j ¡  X d S )NTrx   r“   r   rŽ   rª   l   ÿÿ )r›   r•   r™   r†   rƒ   r˜   rW   r¤   Úflushr^   rV   r¯   rŸ   rš   r‡   r8   r8   r9   r†   Ê  s    
z_Stream.closec                 C   sê   | j  | j j ¡| _d| _|  d¡dkr0tdƒ‚|  d¡dkrFtdƒ‚t|  d¡ƒ}|  d¡ |d	@ rt|  d¡ƒd
t|  d¡ƒ  }|  	|¡ |d@ r²|  d¡}|r²|t
kr˜q²q˜|d@ rÔ|  d¡}|rÔ|t
krºqÔqº|d@ ræ|  d¡ d S )Nr   r$   s   ‹únot a gzip filer#   ó   zunsupported compression methodé   é   rC   rB   é   )rœ   Zdecompressobjr®   r¤   r£   Ú_Stream__readr   r   Úordr]   r3   )r   ÚflagZxlenr4   r8   r8   r9   r    à  s*    
 


z_Stream._init_read_gzc                 C   s   | j S r…   )rš   r‡   r8   r8   r9   Útellÿ  s    z_Stream.tellr   c                 C   sX   || j  dkrJt|| j  | jƒ\}}t|ƒD ]}|  | j¡ q,|  |¡ ntdƒ‚| j S )Nr   z seeking backwards is not allowed)rš   r\   ra   rH   r]   r	   )r   rš   rb   rc   rM   r8   r8   r9   Úseek  s    z_Stream.seekc                 C   s    |   |¡}|  jt|ƒ7  _|S r…   )Ú_readrš   r2   )r   r'   rW   r8   r8   r9   r]     s    
z_Stream.readc                 C   sÂ   | j dkr|  |¡S t| jƒ}| jg}||k rž| jrB| j}d| _n| j | j¡}|sVqžz| j 	|¡}W n | j
k
r„   tdƒ‚Y nX | |¡ |t|ƒ7 }q&d |¡}||d … | _|d |… S )Nr“   r   zinvalid compressed data)r˜   r»   r2   r£   rW   r™   r]   ra   r¤   Ú
decompressr`   r   ÚappendÚjoin©r   r'   ÚcÚtrW   r8   r8   r9   rÀ     s(    




z_Stream._readc                 C   sj   t | jƒ}| jg}||k rF| j | j¡}|s.qF| |¡ |t |ƒ7 }qd |¡}||d … | _|d |… S )Nr   )r2   rW   r™   r]   ra   rÂ   rÃ   rÄ   r8   r8   r9   Z__read3  s    


z_Stream.__readN)r   )rn   ro   rp   r„   r¨   r¢   r^   r±   r†   r    r¾   r¿   r]   rÀ   r»   r8   r8   r8   r9   rŠ   R  s   F
	
rŠ   c                   @   s,   e Zd Zdd„ Zdd„ Zdd„ Zdd„ Zd	S )
r–   c                 C   s   || _ | j  t¡| _d S r…   )r™   r]   Ú	BLOCKSIZErW   )r   r™   r8   r8   r9   r„   I  s    z_StreamProxy.__init__c                 C   s   | j j| _| jS r…   )r™   r]   rW   rˆ   r8   r8   r9   r]   M  s    
z_StreamProxy.readc                 C   sP   | j  d¡rdS | j dd… dkr8| j dd… dkr8d	S | j  d
¡rHdS dS d S )Ns   ‹rŽ   r   é   s   BZhr¹   é
   s   1AY&SYr   )s   ]  €s   ý7zXZr‘   r“   )rW   Ú
startswithr‡   r8   r8   r9   r—   Q  s    $z_StreamProxy.getcomptypec                 C   s   | j  ¡  d S r…   )r™   r†   r‡   r8   r8   r9   r†   [  s    z_StreamProxy.closeN)rn   ro   rp   r„   r]   r—   r†   r8   r8   r8   r9   r–   D  s   
r–   c                   @   sf   e Zd Zddd„Zdd„ Zdd„ Zdd	„ Zd
d„ Zdd„ Ze	j
fdd„Zddd„Zdd„ Zdd„ ZdS )Ú_FileInFileNc                 C   sÊ   || _ || _|| _d| _t|dd ƒ| _d| _|d kr>d|fg}d| _g | _d}| j}|D ]L\}}||kr|| j 	d||d f¡ | j 	d||| |f¡ ||7 }|| }qX|| jk rÆ| j 	d|| jd f¡ d S )Nr   r‚   FT)
r™   Úoffsetr'   Úpositionrh   r‚   r›   Ú	map_indexÚmaprÂ   )r   r™   rÌ   r'   Z	blockinfoZlastposZrealposr8   r8   r9   r„   h  s(    


z_FileInFile.__init__c                 C   s   d S r…   r8   r‡   r8   r8   r9   rµ     s    z_FileInFile.flushc                 C   s   dS ©NTr8   r‡   r8   r8   r9   Úreadable„  s    z_FileInFile.readablec                 C   s   dS )NFr8   r‡   r8   r8   r9   Úwritable‡  s    z_FileInFile.writablec                 C   s
   | j  ¡ S r…   )r™   Úseekabler‡   r8   r8   r9   rÓ   Š  s    z_FileInFile.seekablec                 C   s   | j S r…   )rÍ   r‡   r8   r8   r9   r¾     s    z_FileInFile.tellc                 C   s   |t jkr tt|dƒ| jƒ| _nj|t jkr\|dk rFt| j| dƒ| _qŠt| j| | jƒ| _n.|t jkr‚tt| j| | jƒdƒ| _ntdƒ‚| jS )Nr   zInvalid argument)	ÚioÚSEEK_SETÚminÚmaxr'   rÍ   ÚSEEK_CURÚSEEK_ENDr0   )r   rÍ   Úwhencer8   r8   r9   r¿   ’  s    


z_FileInFile.seekc           	      C   s
  |d kr| j | j }nt|| j | j ƒ}d}|dkr| j| j \}}}}|| j  kr`|k rhqŽ nqŽq6|  jd7  _| jt| jƒkr6d| _q6t||| j ƒ}|râ| j || j|  ¡ | j |¡}t|ƒ|krØt	dƒ‚||7 }n|t
| 7 }||8 }|  j|7  _q,|S )Nr   r   r#   rY   )r'   rÍ   rÖ   rÏ   rÎ   r2   r™   r¿   r]   r   r3   )	r   r'   rW   ÚdataÚstartÚstoprÌ   r5   rd   r8   r8   r9   r]   ¢  s,    

z_FileInFile.readc                 C   s&   |   t|ƒ¡}||d t|ƒ…< t|ƒS r…   )r]   r2   )r   rd   rW   r8   r8   r9   ÚreadintoÁ  s    z_FileInFile.readintoc                 C   s
   d| _ d S rÐ   )r›   r‡   r8   r8   r9   r†   Æ  s    z_FileInFile.close)N)N)rn   ro   rp   r„   rµ   rÑ   rÒ   rÓ   r¾   rÔ   rÕ   r¿   r]   rÞ   r†   r8   r8   r8   r9   rË   b  s   

rË   c                       s   e Zd Z‡ fdd„Z‡  ZS )ÚExFileObjectc                    s&   t |j|j|j|jƒ}tƒ  |¡ d S r…   )rË   r™   Úoffset_datar'   ÚsparseÚsuperr„   )r   ÚtarfileÚtarinfor™   ©Ú	__class__r8   r9   r„   Ì  s
    
 ÿzExFileObject.__init__©rn   ro   rp   r„   Ú__classcell__r8   r8   rå   r9   rß   Ê  s   rß   c                   @   s   e Zd ZdS )ÚFilterErrorNrm   r8   r8   r8   r9   ré   ×  s   ré   c                       s   e Zd Z‡ fdd„Z‡  ZS )ÚAbsolutePathErrorc                    s    || _ tƒ  d|j›d¡ d S )Nzmember z has an absolute path©rä   râ   r„   r‚   ©r   rä   rå   r8   r9   r„   Û  s    zAbsolutePathError.__init__rç   r8   r8   rå   r9   rê   Ú  s   rê   c                       s   e Zd Z‡ fdd„Z‡  ZS )ÚOutsideDestinationErrorc                    s.   || _ || _tƒ  |j›d|›dd ¡ d S )Nz would be extracted to ú, ú which is outside the destination©rä   Ú_pathrâ   r„   r‚   ©r   rä   r%   rå   r8   r9   r„   à  s
    ÿz OutsideDestinationError.__init__rç   r8   r8   rå   r9   rí   ß  s   rí   c                       s   e Zd Z‡ fdd„Z‡  ZS )ÚSpecialFileErrorc                    s   || _ tƒ  |j›d¡ d S )Nz is a special filerë   rì   rå   r8   r9   r„   ç  s    zSpecialFileError.__init__rç   r8   r8   rå   r9   ró   æ  s   ró   c                       s   e Zd Z‡ fdd„Z‡  ZS )ÚAbsoluteLinkErrorc                    s   || _ tƒ  |j›d¡ d S )Nz! is a symlink to an absolute pathrë   rì   rå   r8   r9   r„   ì  s    zAbsoluteLinkError.__init__rç   r8   r8   rå   r9   rô   ë  s   rô   c                       s   e Zd Z‡ fdd„Z‡  ZS )ÚLinkOutsideDestinationErrorc                    s.   || _ || _tƒ  |j›d|›dd ¡ d S )Nz would link to rî   rï   rð   rò   rå   r8   r9   r„   ñ  s
    ÿz$LinkOutsideDestinationError.__init__rç   r8   r8   rå   r9   rõ   ð  s   rõ   c                 C   sä  i }| j }tj |¡}| dtjf¡r@| j dtj ¡ }|d< tj |¡rTt| ƒ‚tj tj 	||¡¡}tj 
||g¡|krˆt| |ƒ‚| j}|d k	rü|d@ }|rê|  ¡ s²|  ¡ rÌ|d@ sÂ|dM }|dO }n|  ¡ sÜ|  ¡ râd }nt| ƒ‚|| jkrü||d< |rà| jd k	rd |d< | jd k	r*d |d	< | jd k	r>d |d
< | jd k	rRd |d< |  ¡ sf|  ¡ ràtj | j¡r~t| ƒ‚|  ¡ r¤tj 	|tj |¡| j¡}ntj 	|| j¡}tj |¡}tj 
||g¡|kràt| |ƒ‚|S )Nú/r‚   ií  é@   i¶ÿÿÿé€  rƒ   r)   r*   r+   r,   )r‚   rz   r%   ÚrealpathrÊ   ÚsepÚlstripÚisabsrê   rÃ   Ú
commonpathrí   rƒ   ÚisregÚislnkÚisdirÚissymró   r)   r*   r+   r,   Úlinknamerô   Údirnamerõ   )ÚmemberÚ	dest_pathZfor_dataÚ	new_attrsr‚   Ztarget_pathrƒ   r8   r8   r9   Ú_get_filtered_attrs÷  s^    




þÿ
r  c                 C   s   | S r…   r8   )r  r  r8   r8   r9   Úfully_trusted_filter6  s    r  c                 C   s(   t | |dƒ}|r$| jf |ddi—ŽS | S )NFÚdeep©r  r­   ©r  r  r  r8   r8   r9   Ú
tar_filter9  s    r  c                 C   s(   t | |dƒ}|r$| jf |ddi—ŽS | S )NTr	  Fr
  r  r8   r8   r9   Údata_filter?  s    r  )Zfully_trustedr“   rÛ   c                   @   sÖ  e Zd Zeddddddddd	d
dddddddddddZdhdd„Zedd„ ƒZejdd„ ƒZedd„ ƒZ	e	jdd„ ƒZ	dd„ Z
eeeeeeeeded œ
d!d"„Zd#d$„ Zeed%fd&d'„Zd(d)„ Zd*d+„ Zd,d-„ Zed.d/„ ƒZd0d1„ Zed2d3„ ƒZed4d5„ ƒZed6d7„ ƒZed8d9„ ƒZed:d;„ ƒZe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'dRdS„ Z(dTdU„ Z)dVdW„ Z*dXdY„ Z+dZd[„ Z,d\d]„ Z-d^d_„ Z.d`da„ Z/dbdc„ Z0ddde„ Z1dfdg„ Z2dS )ir   zName of the archive member.zPermission bits.z6User ID of the user who originally stored this member.z7Group ID of the user who originally stored this member.zSize in bytes.zTime of last modification.zHeader checksum.z–File type. type is usually one of these constants: REGTYPE, AREGTYPE, LNKTYPE, SYMTYPE, DIRTYPE, FIFOTYPE, CONTTYPE, CHRTYPE, BLKTYPE, GNUTYPE_SPARSE.zcName of the target file name, which is only present in TarInfo objects of type LNKTYPE and SYMTYPE.z
User name.zGroup name.zDevice major number.zDevice minor number.zThe tar header starts here.zThe file's data starts here.zMA dictionary containing key-value pairs of an associated pax extended header.zSparse member information.N)r‚   rƒ   r)   r*   r'   r(   ÚchksumÚtyper  r+   r,   ÚdevmajorÚdevminorrÌ   rà   Úpax_headersrá   rã   Ú_sparse_structsÚ_link_targetrŒ   c                 C   sj   || _ d| _d| _d| _d| _d| _d| _t| _d| _	d| _
d| _d| _d| _d| _d| _d | _i | _d S )Ni¤  r   rŒ   )r‚   rƒ   r)   r*   r'   r(   r  ÚREGTYPEr  r  r+   r,   r  r  rÌ   rà   rá   r  ©r   r‚   r8   r8   r9   r„   u  s"    zTarInfo.__init__c                 C   s   | j S r…   ©r‚   r‡   r8   r8   r9   r%     s    zTarInfo.pathc                 C   s
   || _ d S r…   r  r  r8   r8   r9   r%   ’  s    c                 C   s   | j S r…   ©r  r‡   r8   r8   r9   r&   –  s    zTarInfo.linkpathc                 C   s
   || _ d S r…   r  )r   r  r8   r8   r9   r&   ›  s    c                 C   s   d| j j| jt| ƒf S )Nz<%s %r at %#x>)ræ   rn   r‚   Úidr‡   r8   r8   r9   Ú__repr__Ÿ  s    zTarInfo.__repr__T)
r‚   r(   rƒ   r  r)   r*   r+   r,   r	  Ú_KEEPc       
         C   sŽ   |	rt  | ¡}n
t   | ¡}||
k	r(||_||
k	r6||_||
k	rD||_||
k	rR||_||
k	r`||_||
k	rn||_||
k	r|||_||
k	rŠ||_	|S r…   )
ÚcopyZdeepcopyr‚   r(   rƒ   r  r)   r*   r+   r,   )r   r‚   r(   rƒ   r  r)   r*   r+   r,   r	  r  Úresultr8   r8   r9   r­   ¢  s(    
zTarInfo.replacec                 C   s€   | j d krd }n
| j d@ }| j|| j| j| j| j| j| j| j| j	| j
| j| jdœ}|d tkr||d  d¡s||d  d7  < |S )Néÿ  )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  ÚDIRTYPEr²   )r   rƒ   Úinfor8   r8   r9   Úget_info¾  s(    

ózTarInfo.get_infoÚsurrogateescapec                 C   sz   |   ¡ }| ¡ D ]\}}|d krtd| ƒ‚q|tkrD|  |||¡S |tkrZ|  |||¡S |tkrn|  ||¡S tdƒ‚d S )Nz%s may not be Nonezinvalid format)	r!  Úitemsr0   r   Úcreate_ustar_headerr   Úcreate_gnu_headerr   Úcreate_pax_header)r   rS   r6   r7   r   r‚   Úvaluer8   r8   r9   ÚtobufÚ  s    zTarInfo.tobufc                 C   sn   t |d< t|d  ||¡ƒtkr(tdƒ‚t|d  ||¡ƒtkr^|  |d ||¡\|d< |d< |  |t||¡S )NÚmagicr  zlinkname is too longr‚   Úprefix)	ÚPOSIX_MAGICr2   r1   ÚLENGTH_LINKr0   ÚLENGTH_NAMEÚ_posix_split_nameÚ_create_headerr   )r   r   r6   r7   r8   r8   r9   r$  ë  s    zTarInfo.create_ustar_headerc                 C   s€   t |d< d}t|d  ||¡ƒtkr<||  |d t||¡7 }t|d  ||¡ƒtkrl||  |d t||¡7 }||  |t	||¡ S )Nr)  r   r  r‚   )
Ú	GNU_MAGICr2   r1   r,  Ú_create_gnu_long_headerÚGNUTYPE_LONGLINKr-  ÚGNUTYPE_LONGNAMEr/  r   )r   r   r6   r7   rW   r8   r8   r9   r%  ø  s    zTarInfo.create_gnu_headerc           
   	   C   s*  t |d< | j ¡ }ddtfddtfddfD ]j\}}}||kr>q*z||  dd	¡ W n$ tk
rv   || ||< Y q*Y nX t|| ƒ|kr*|| ||< q*d
D ]`\}}||kr´d||< qš|| }d|  krØd|d  k ræn n
t|t	ƒršt
|ƒ||< d||< qš|r|  |t|¡}	nd}	|	|  |tdd¡ S )Nr)  r‚   r%   r  r&   )r+   r+   é    )r,   r,   r4  rD   rE   ))r)   rB   )r*   rB   )r'   é   )r(   r5  r   rB   r#   r   r­   )r+  r  r  r-  r,  r1   ÚUnicodeEncodeErrorr2   Ú
isinstanceÚfloatÚstrÚ_create_pax_generic_headerÚXHDTYPEr/  r   )
r   r   r6   r  r‚   Zhnamer5   rR   ÚvalrW   r8   r8   r9   r&    s8    
  þ
*
zTarInfo.create_pax_headerc                 C   s   |   |td¡S )Nr/   )r:  ÚXGLTYPE)Úclsr  r8   r8   r9   Úcreate_pax_global_header7  s    z TarInfo.create_pax_global_headerc                 C   s~   |  d¡}tdt|ƒƒD ]T}d |d |… ¡}d ||d … ¡}t| ||¡ƒtkrt| ||¡ƒtkr qvqtdƒ‚||fS )Nrö   r#   zname is too long)ÚsplitrH   r2   rÃ   r1   ÚLENGTH_PREFIXr-  r0   )r   r‚   r6   r7   Z
componentsrM   r*  r8   r8   r9   r.  =  s    
ÿzTarInfo._posix_split_namec                 C   sÆ  |   d¡ttfk}|r@t|   dd¡d|ƒ}t|   dd¡d|ƒ}ntdd||ƒ}tdd||ƒ}|   dt¡}|d krxtdƒ‚t|   dd¡d	||ƒt|   d
d¡d@ d|ƒt|   dd¡d|ƒt|   dd¡d|ƒt|   dd¡d|ƒt|   dd¡d|ƒd|t|   dd¡d	||ƒ|   dt¡t|   dd¡d||ƒt|   dd¡d||ƒt|   dd¡d|ƒt|   dd¡d|ƒt|   dd¡d||ƒg}t 	dt
 d |¡¡}	t|	t
 d … ƒd }
|	d d… td|
 dƒ |	dd …  }	|	S )Nr  r  r   rB   r  rŒ   zTarInfo.type must not be Noner‚   r   rƒ   r  r)   r*   r'   r5  r(   s           r  r)  r+   r4  r,   r*  r   z%dsr   i”þÿÿz%06o rD   i›þÿÿ)ÚgetÚCHRTYPEÚBLKTYPErT   r:   r  r0   r+  rV   r¯   rÇ   rÃ   rX   rO   )r   rS   r6   r7   Zhas_device_fieldsr  r  ZfiletypeÚpartsrW   r  r8   r8   r9   r/  M  s:    
ñ&zTarInfo._create_headerc                 C   s.   t t| ƒtƒ\}}|dkr*| t| t 7 } | S )Nr   )r\   r2   rÇ   r3   )Zpayloadrb   rc   r8   r8   r9   Ú_create_payloadw  s    zTarInfo._create_payloadc                 C   sR   |  ||¡t }i }d|d< ||d< t|ƒ|d< t|d< |  |t||¡|  |¡ S )Nz././@LongLinkr‚   r  r'   r)  )r1   r3   r2   r0  r/  r   rF  )r>  r‚   r  r6   r7   r   r8   r8   r9   r1    s    ÿzTarInfo._create_gnu_long_headerc              	   C   s2  d}|  ¡ D ]8\}}z| dd¡ W q tk
rB   d}Y  qFY qX qd}|rV|d7 }|  ¡ D ]\}}| d¡}|r‚| |d¡}n
| d¡}t|ƒt|ƒ d }d	 }	}
|tt|
ƒƒ }	|	|
krÂqÈ|	}
q¨|tt|
ƒd
ƒd | d | d 7 }q^i }d|d< ||d< t|ƒ|d< t|d< |  |td
d¡|  	|¡ S )NFr/   rE   Tr   s   21 hdrcharset=BINARY
r"  rÈ   r   rD   ó    ó   =ó   
z././@PaxHeaderr‚   r  r'   r)  r­   )
r#  r1   r6  r2   r9  rO   r+  r/  r   rF  )r>  r  r  r6   ZbinaryÚkeywordr'  ZrecordsÚlrL   r>   r   r8   r8   r9   r:  ’  s<    

(ÿz"TarInfo._create_pax_generic_headerc              	   C   sv  t |ƒdkrtdƒ‚t |ƒtkr(tdƒ‚| t¡tkr>tdƒ‚t|dd… ƒ}|t|ƒkrbt	dƒ‚| ƒ }t
|dd… ||ƒ|_t|dd	… ƒ|_t|d	d
… ƒ|_t|d
d… ƒ|_t|dd… ƒ|_t|dd… ƒ|_||_|dd… |_t
|dd… ||ƒ|_t
|dd… ||ƒ|_t
|dd… ||ƒ|_t|dd… ƒ|_t|dd… ƒ|_t
|dd… ||ƒ}|jtkr†|j d¡r†t|_|jtkr8d}g }tdƒD ]l}	z0t|||d … ƒ}
t||d |d … ƒ}W n tk
rô   Y  qY nX | |
|f¡ |d7 }q¢t|d ƒ}t|dd… ƒ}|||f|_ | !¡ rP|j "d¡|_|rr|jt#krr|d |j |_|S )Nr   zempty headerztruncated headerzend of file headeré”   éœ   zbad checksumr   él   ét   é|   éˆ   é   i  i	  i)  iI  iQ  iY  iô  rö   i‚  r¹   r5  é   iâ  iã  iï  )$r2   rq   rÇ   rr   Úcountr3   rs   rN   rX   rK   r?   r‚   rƒ   r)   r*   r'   r(   r  r  r  r+   r,   r  r  ÚAREGTYPEr²   r  ÚGNUTYPE_SPARSErH   r0   rÂ   Úboolr  r   ÚrstripÚ	GNU_TYPES)r>  rW   r6   r7   r  Úobjr*  rš   ÚstructsrM   rÌ   ÚnumbytesÚ
isextendedÚorigsizer8   r8   r9   ÚfrombufÅ  sZ    
zTarInfo.frombufc                 C   s8   |j  t¡}|  ||j|j¡}|j  ¡ t |_| |¡S r…   )	r™   r]   rÇ   r_  r6   r7   r¾   rÌ   Ú_proc_member)r>  rã   rW   rZ  r8   r8   r9   Úfromtarfile  s    zTarInfo.fromtarfilec                 C   sT   | j ttfkr|  |¡S | j tkr,|  |¡S | j tttfkrF|  	|¡S |  
|¡S d S r…   )r  r3  r2  Ú_proc_gnulongrV  Ú_proc_sparser;  r=  ÚSOLARIS_XHDTYPEÚ	_proc_paxÚ_proc_builtin)r   rã   r8   r8   r9   r`    s    



zTarInfo._proc_memberc                 C   sR   |j  ¡ | _| j}|  ¡ s$| jtkr4||  | j¡7 }||_|  	|j
|j|j¡ | S r…   )r™   r¾   rà   rþ   r  ÚSUPPORTED_TYPESÚ_blockr'   rÌ   Ú_apply_pax_infor  r6   r7   )r   rã   rÌ   r8   r8   r9   rf  &  s    zTarInfo._proc_builtinc                 C   s†   |j  |  | j¡¡}z|  |¡}W n tk
r>   tdƒ‚Y nX | j|_| jt	krft
||j|jƒ|_n| jtkr‚t
||j|jƒ|_|S )Nú missing or bad subsequent header)r™   r]   rh  r'   ra  r   rt   rÌ   r  r3  r?   r6   r7   r‚   r2  r  )r   rã   rW   Únextr8   r8   r9   rb  7  s    

zTarInfo._proc_gnulongc           
   	   C   sÚ   | j \}}}| ` |rª|j t¡}d}tdƒD ]n}z0t|||d … ƒ}t||d |d … ƒ}	W n tk
rz   Y  qœY nX |r’|	r’| ||	f¡ |d7 }q,t|d ƒ}q|| _	|j 
¡ | _| j|  | j¡ |_|| _| S )Nr   é   r5  rS  iø  )r  r™   r]   rÇ   rH   rN   r0   rÂ   rW  rá   r¾   rà   rh  r'   rÌ   )
r   rã   r[  r]  r^  rW   rš   rM   rÌ   r\  r8   r8   r9   rc  M  s(    
zTarInfo._proc_sparsec                 C   s.  |j  |  | j¡¡}| jtkr&|j}n
|j ¡ }t 	d|¡}|d k	rX| 
d¡ d¡|d< | d¡}|dkrr|j}nd}t d¡}d}| ||¡}|s˜q6| ¡ \}	}
t|	ƒ}	|	dkr¼tdƒ‚|| d	¡d | d¡|	 d … }|  |
dd|j¡}
|
tkr|  |||j|j¡}n|  |dd|j¡}|||
< ||	7 }q„z|  |¡}W n tk
rb   td
ƒ‚Y nX d|kr||  ||¡ nHd|kr–|  |||¡ n.| d¡dkrÄ| d¡dkrÄ|  |||¡ | jttfkr*|  ||j|j¡ | j!|_!d|kr*|j"}| #¡ s|jt$kr$|| |j¡7 }||_!|S )Ns   \d+ hdrcharset=([^\n]+)\nr#   r/   Ú
hdrcharsetZBINARYs   (\d+) ([^=]+)=r   rG   r$   rj  úGNU.sparse.mapúGNU.sparse.sizezGNU.sparse.majorÚ1zGNU.sparse.minorrF   r'   )%r™   r]   rh  r'   r  r=  r  r  ÚreÚsearchÚgroupr=   rB  r6   ÚcompileÚmatchÚgroupsrI   rK   rg   rÜ   Ú_decode_pax_fieldr7   ÚPAX_NAME_FIELDSra  r   rt   Ú_proc_gnusparse_01Ú_proc_gnusparse_00Ú_proc_gnusparse_10r;  rd  ri  rÌ   rà   rþ   rg  )r   rã   rW   r  ru  rm  r6   Zregexrš   r5   rJ  r'  rk  rÌ   r8   r8   r9   re  i  sh    



$	
ÿ
ÿ
ÿ


 
zTarInfo._proc_paxc                 C   sh   g }t  d|¡D ]}| t| d¡ƒ¡ qg }t  d|¡D ]}| t| d¡ƒ¡ q:tt||ƒƒ|_d S )Ns   \d+ GNU.sparse.offset=(\d+)\nr#   s   \d+ GNU.sparse.numbytes=(\d+)\n)rq  ÚfinditerrÂ   rI   rs  ÚlistÚziprá   )r   rk  r  rW   Zoffsetsru  r\  r8   r8   r9   rz  Ñ  s    zTarInfo._proc_gnusparse_00c                 C   s@   dd„ |d   d¡D ƒ}tt|d d d… |dd d… ƒƒ|_d S )Nc                 S   s   g | ]}t |ƒ‘qS r8   )rI   )Ú.0Úxr8   r8   r9   Ú
<listcomp>ß  s     z.TarInfo._proc_gnusparse_01.<locals>.<listcomp>rn  ú,r$   r#   )r@  r}  r~  rá   )r   rk  r  rá   r8   r8   r9   ry  Ü  s    zTarInfo._proc_gnusparse_01c                 C   s¨   d }g }|j  t¡}| dd¡\}}t|ƒ}t|ƒ|d k rtd|krT||j  t¡7 }| dd¡\}}| t|ƒ¡ q,|j  ¡ |_t	t
|d d d… |dd d… ƒƒ|_d S )NrI  r#   r$   )r™   r]   rÇ   r@  rI   r2   rÂ   r¾   rà   r}  r~  rá   )r   rk  r  rã   Zfieldsrá   rW   Znumberr8   r8   r9   r{  â  s    zTarInfo._proc_gnusparse_10c              	   C   sÂ   |  ¡ D ]ª\}}|dkr&t| d|ƒ q|dkr@t| dt|ƒƒ q|dkrZt| dt|ƒƒ q|tkr|tkr”zt| |ƒ}W n tk
r’   d}Y nX |dkr¦| d¡}t| ||ƒ q| ¡ | _d S )NzGNU.sparse.namer%   ro  r'   zGNU.sparse.realsizer   rö   )	r#  ÚsetattrrI   Ú
PAX_FIELDSÚPAX_NUMBER_FIELDSr0   rX  r  r  )r   r  r6   r7   rJ  r'  r8   r8   r9   ri  ò  s"    

zTarInfo._apply_pax_infoc                 C   s4   z|  |d¡W S  tk
r.   |  ||¡ Y S X d S )NrE   )r=   ÚUnicodeDecodeError)r   r'  r6   Zfallback_encodingZfallback_errorsr8   r8   r9   rw  	  s    zTarInfo._decode_pax_fieldc                 C   s"   t |tƒ\}}|r|d7 }|t S )Nr#   )r\   rÇ   )r   rT  rb   rc   r8   r8   r9   rh    s    zTarInfo._blockc                 C   s
   | j tkS r…   )r  ÚREGULAR_TYPESr‡   r8   r8   r9   rþ     s    zTarInfo.isregc                 C   s   |   ¡ S r…   )rþ   r‡   r8   r8   r9   Úisfile  s    zTarInfo.isfilec                 C   s
   | j tkS r…   )r  r  r‡   r8   r8   r9   r   "  s    zTarInfo.isdirc                 C   s
   | j tkS r…   )r  ÚSYMTYPEr‡   r8   r8   r9   r  &  s    zTarInfo.issymc                 C   s
   | j tkS r…   )r  ÚLNKTYPEr‡   r8   r8   r9   rÿ   *  s    zTarInfo.islnkc                 C   s
   | j tkS r…   )r  rC  r‡   r8   r8   r9   Úischr.  s    zTarInfo.ischrc                 C   s
   | j tkS r…   )r  rD  r‡   r8   r8   r9   Úisblk2  s    zTarInfo.isblkc                 C   s
   | j tkS r…   )r  ÚFIFOTYPEr‡   r8   r8   r9   Úisfifo6  s    zTarInfo.isfifoc                 C   s
   | j d k	S r…   )rá   r‡   r8   r8   r9   Úissparse:  s    zTarInfo.issparsec                 C   s   | j tttfkS r…   )r  rC  rD  r  r‡   r8   r8   r9   Úisdev=  s    zTarInfo.isdev)rŒ   )3rn   ro   rp   ÚdictÚ	__slots__r„   Úpropertyr%   Úsetterr&   r  r  r­   r!  r   r   r(  r$  r%  r&  Úclassmethodr?  r.  Ústaticmethodr/  rF  r1  r:  r_  ra  r`  rf  rb  rc  re  rz  ry  r{  ri  rw  rh  rþ   rˆ  r   r  rÿ   r‹  rŒ  rŽ  r  r  r8   r8   r8   r9   r   R  s¨   è




       ý1

)
	

2
>
h	c                   @   sà  e Zd ZdZdZdZdZeZe	Z
dZeZeZdZdedd„Zedddefd	d
„ƒZedfdd„ƒZedgdd„ƒZedhdd„ƒZedidd„ƒZdddddœZdd„ Zdd„ Zdd„ Zdd „ Zdjd!d"„Zdkdd$œd%d&„Zdldd'œd(d)„Z dmd*d+„Z!d,d-„ Z"dnddd/œd0d1„Z#doddd/œd3d4„Z$d5d6„ Z%d7d8„ Z&d9d:„ Z'd;d<„ Z(d=d>„ Z)dpd?d@„Z*dAdB„ Z+dCdD„ Z,dEdF„ Z-dGdH„ Z.dIdJ„ Z/dKdL„ Z0dMdN„ Z1dOdP„ Z2dQdR„ Z3dSdT„ Z4dqdUdV„Z5dWdX„ Z6drdYdZ„Z7d[d\„ Z8d]d^„ Z9d_d`„ Z:dadb„ Z;dcdd„ Z<dS )sr   r   Fr#   Nrw   r"  c              
   C   sª  dddddœ}||krt dƒ‚|| _|| | _|sh| jdkrTtj |¡sTd| _d| _t|| jƒ}d	| _n@|d krt|d
ƒrt	|j
ttfƒr|j
}t|dƒr¢|j| _d| _|r¸tj |¡nd | _
|| _|d k	rÒ|| _|d k	rà|| _|d k	rî|| _|d k	rü|| _|d k	r|| _|	| _|
d k	r0| jtkr0|
| _ni | _|d k	rF|| _|d k	rV|| _|| _d	| _g | _d	| _| j ¡ | _i | _zþ| jdkržd | _ |  !¡ | _ | jdkr2| j "| j¡ z| j #| ¡}| j $|¡ W nX t%k
rþ   | j "| j¡ Y q2Y n0 t&k
r, } zt't|ƒƒ‚W 5 d }~X Y nX qª| jdkr|d| _| jr|| j (| j )¡ ¡}| j *|¡ |  jt+|ƒ7  _W n&   | js˜| j ,¡  d| _‚ Y nX d S )NÚrbzr+bÚwbZxb©rw   Úarx   r€  ú!mode must be 'r', 'a', 'w' or 'x'rš  rx   Fr‚   rƒ   Trw   ©rš  rx   r€  )-r0   rƒ   Ú_moderz   r%   ÚexistsÚ	bltn_openr•   r   r7  r‚   r9  rO   Úabspathr™   rS   rä   ÚdereferenceÚignore_zerosr6   r7   r   r  ÚdebugÚ
errorlevelÚcopybufsizer›   ÚmembersÚ_loadedr¾   rÌ   ÚinodesÚfirstmemberrk  r¿   ra  rÂ   rs   r   r   r?  r  r^   r2   r†   )r   r‚   rƒ   r™   rS   rä   r¡  r¢  r6   r7   r  r£  r¤  r¥  ZmodesÚerW   r8   r8   r9   r„   ^  sŠ    
ÿ





"
zTarFile.__init__c              
      sº  |s|st dƒ‚|dkrª‡ fdd„}tˆ j|dD ]j}tˆ ˆ j| ƒ}|d k	rV| ¡ }	z||d|f|ŽW   S  ttfk
rš   |d k	r’| |	¡ Y q2Y q2X q2tdƒ‚nd|kr| dd	¡\}
}|
pÊd}
|pÒd
}|ˆ jkrðtˆ ˆ j| ƒ}ntd| ƒ‚|||
|f|ŽS d|kr’| dd	¡\}
}|
p.d}
|p8d
}|
dkrLt dƒ‚t	||
|||ƒ}zˆ ||
|f|Ž}W n   | 
¡  ‚ Y nX d|_|S |dkr®ˆ j|||f|ŽS t dƒ‚d S )Nznothing to open)rw   úr:*c                    s   ˆ j |  dkS )NÚtaropen)Ú	OPEN_METH)r˜   ©r>  r8   r9   Únot_compressed÷  s    z$TarFile.open.<locals>.not_compressed)Úkeyrw   z%file could not be opened successfullyú:r#   r“   r”   ú|rv   zmode must be 'r' or 'w'Frœ  zundiscernible mode)r0   Úsortedr­  rh   r¾   r   r   r¿   r@  rŠ   r†   r•   r¬  )r>  r‚   rƒ   r™   ra   Úkwargsr¯  r˜   ÚfuncZ	saved_posÚfilemodeÚstreamrÆ   r8   r®  r9   r   Í  sP    %







zTarFile.openc                 K   s    |dkrt dƒ‚| |||f|ŽS )Nr™  r›  )r0   )r>  r‚   rƒ   r™   r´  r8   r8   r9   r¬  (  s    zTarFile.taropenr©   c                 K   sè   |dkrt dƒ‚zddlm} W n tk
r<   tdƒ‚Y nX z|||d ||ƒ}W n. tk
r‚   |d k	r||dkr|tdƒ‚‚ Y nX z| j|||f|Ž}W nB tk
rÈ   | ¡  |dkrÂtdƒ‚‚ Y n   | ¡  ‚ Y nX d	|_	|S )
N©rw   rx   r€  úmode must be 'r', 'w' or 'x'r   )ÚGzipFilezgzip module is not availablerd   rw   r¶   F)
r0   Zgziprº  r   r   r¥   r   r¬  r†   r•   )r>  r‚   rƒ   r™   Úcompresslevelr´  rº  rÆ   r8   r8   r9   Úgzopen0  s0    zTarFile.gzopenc              	   K   s¸   |dkrt dƒ‚zddlm} W n tk
r<   tdƒ‚Y nX ||pF|||d}z| j|||f|Ž}W nF ttfk
r˜   | ¡  |dkr’t	dƒ‚‚ Y n   | ¡  ‚ Y nX d	|_
|S )
Nr¸  r¹  r   )ÚBZ2Filer   )r»  rw   znot a bzip2 fileF)r0   r   r½  r   r   r¬  r¥   ÚEOFErrorr†   r   r•   )r>  r‚   rƒ   r™   r»  r´  r½  rÆ   r8   r8   r9   Úbz2openQ  s&    zTarFile.bz2openc           	   	   K   s¼   |dkrt dƒ‚zddlm}m} W n tk
r@   tdƒ‚Y nX ||pJ|||d}z| j|||f|Ž}W nF |tfk
rœ   | ¡  |dkr–t	dƒ‚‚ Y n   | ¡  ‚ Y nX d	|_
|S )
Nr¸  r¹  r   )ÚLZMAFiler§   r’   )Úpresetrw   znot an lzma fileF)r0   r¦   rÀ  r§   r   r   r¬  r¾  r†   r   r•   )	r>  r‚   rƒ   r™   rÁ  r´  rÀ  r§   rÆ   r8   r8   r9   Úxzopenm  s&    zTarFile.xzopenr¬  r¼  r¿  rÂ  )r“   rŽ   r   r‘   c                 C   sˆ   | j r
d S d| _ z`| jdkrn| j ttd  ¡ |  jtd 7  _t	| jt
ƒ\}}|dkrn| j tt
|  ¡ W 5 | js‚| j ¡  X d S )NTrœ  r$   r   )r›   r•   r™   r†   rƒ   r^   r3   rÇ   rÌ   r\   Ú
RECORDSIZE)r   rb   rc   r8   r8   r9   r†   ”  s    
zTarFile.closec                 C   s"   |   |¡}|d krtd| ƒ‚|S )Nzfilename %r not found)Ú
_getmemberÚKeyError)r   r‚   rä   r8   r8   r9   Ú	getmember©  s    
zTarFile.getmemberc                 C   s   |   ¡  | js|  ¡  | jS r…   )Ú_checkr§  Ú_loadr¦  r‡   r8   r8   r9   Ú
getmembers´  s    zTarFile.getmembersc                 C   s   dd„ |   ¡ D ƒS )Nc                 S   s   g | ]
}|j ‘qS r8   r  )r  rä   r8   r8   r9   r  Â  s     z$TarFile.getnames.<locals>.<listcomp>)rÉ  r‡   r8   r8   r9   Úgetnames¾  s    zTarFile.getnamesc                 C   s^  |   d¡ |d k	r|j}|d kr$|}tj |¡\}}| tjd¡}| d¡}|  ¡ }| |_	|d kr€| j
stt |¡}qŽt |¡}nt | ¡ ¡}d}|j}t |¡rþ|j|jf}	| j
sæ|jdkræ|	| jkræ|| j|	 kræt}
| j|	 }nt}
|	d rü|| j|	< nht |¡rt}
nVt |¡r"t}
nDt |¡r>t}
t |¡}n(t |¡rPt}
nt  |¡rbt!}
nd S ||_||_"|j#|_$|j%|_&|
tkr–|j'|_(nd|_(|j)|_*|
|_+||_,t-räzt- .|j$¡d |_/W n t0k
râ   Y nX t1rzt1 2|j&¡d |_3W n t0k
r   Y nX |
tt!fkrZt4tdƒrZt4tdƒrZt 5|j6¡|_7t 8|j6¡|_9|S )NÚawxrö   rŒ   r#   r   ÚmajorÚminor):rÇ  r‚   rz   r%   Ú
splitdriver­   rú   rû   rä   rã   r¡  ÚlstatÚstatÚfstatÚfilenoÚst_modeÚS_ISREGÚst_inoÚst_devÚst_nlinkr¨  rŠ  r  ÚS_ISDIRr  ÚS_ISFIFOr  ÚS_ISLNKr‰  ÚreadlinkÚS_ISCHRrC  ÚS_ISBLKrD  rƒ   Úst_uidr)   Úst_gidr*   Úst_sizer'   Úst_mtimer(   r  r  ÚpwdÚgetpwuidr+   rÅ  ÚgrpZgetgrgidr,   r   rÌ  Úst_rdevr  rÍ  r  )r   r‚   Úarcnamer™   Zdrvrä   Zstatresr  ZstmdÚinoder  r8   r8   r9   Ú
gettarinfoÄ  s„    	


ÿÿ

zTarFile.gettarinfoT)r¦  c                C   s*  |   ¡  |d kr| }|D ]
}|rÎ|jd kr6tdƒ ntt |j¡ƒ td|jpT|j|jp^|jf ƒ | 	¡ sv| 
¡ rtdd|j|jf  ƒ ntd|j ƒ |jd kr²tdƒ ntdt |j¡d d…  ƒ t|j| ¡ ràd	nd
 ƒ |r| ¡ rtd|j ƒ | ¡ rtd|j ƒ tƒ  qd S )Nz
??????????z%s/%sz%10sz%d,%dz%10dz????-??-?? ??:??:??z%d-%02d-%02d %02d:%02d:%02dr¸   rö   rŒ   z-> zlink to )rÇ  rƒ   rl   rÐ  r¶  r+   r)   r,   r*   r‹  rŒ  r  r  r'   r(   r°   Ú	localtimer‚   r   r  r  rÿ   rk   )r   Úverboser¦  rä   r8   r8   r9   r}  '  s8    



ÿÿ

ÿ

zTarFile.list©Úfilterc             	   C   s6  |   d¡ |d kr|}| jd k	rFtj |¡| jkrF|  dd| ¡ d S |  d|¡ |  ||¡}|d krz|  dd| ¡ d S |d k	r¦||ƒ}|d kr¦|  dd| ¡ d S | ¡ rÒt|dƒ}|  	||¡ W 5 Q R X n`| 
¡ r(|  	|¡ |r2tt |¡ƒD ]*}| jtj ||¡tj ||¡||d qún
|  	|¡ d S )	NrË  r$   ztarfile: Skipped %rr#   ztarfile: Unsupported type %rútarfile: Excluded %rr—  rë  )rÇ  r‚   rz   r%   r   Ú_dbgrè  rþ   rŸ  Úaddfiler   r³  ÚlistdirÚaddrÃ   )r   r‚   ræ  Ú	recursiverì  rä   Úfr8   r8   r9   rñ  M  s8    



 ÿ
zTarFile.addc                 C   s¾   |   d¡ t |¡}| | j| j| j¡}| j |¡ |  jt	|ƒ7  _| j
}|d k	r®t|| j|j|d t|jtƒ\}}|dkrœ| j tt|  ¡ |d7 }|  j|t 7  _| j |¡ d S )NrË  )ra   r   r#   )rÇ  r  r(  rS   r6   r7   r™   r^   rÌ   r2   r¥  r[   r'   r\   rÇ   r3   r¦  rÂ   )r   rä   r™   rW   ra   rb   rc   r8   r8   r9   rï  €  s    

zTarFile.addfilec              	   C   sB  |d krü| j }|d krætj d¡}|d krŒzttƒ}W n tk
rJ   Y nBX dd l}|jd dd}| | 	|¡ W 5 Q R X |jdddd}|rÎzt
| }W n& tk
rÂ   td|›d	ƒd ‚Y nX || _ |S trât d
t¡ tS tS t|tƒrøtdƒ‚|S t|ƒr
|S z
t
| W S  tk
r<   td|›d	ƒd ‚Y nX d S )NZ PYTHON_TARFILE_EXTRACTION_FILTERr   )ú#)ZinterpolationZcomment_prefixesrã   rŒ   )Zfallbackzfilter z
 not founda  The default behavior of tarfile extraction has been changed to disallow common exploits (including CVE-2007-4559). By default, absolute/parent paths are disallowed and some mode bits are cleared. See https://access.redhat.com/articles/7004769 for more details.zrString names are not supported for TarFile.extraction_filter. Use a function such as tarfile.data_filter directly.)Úextraction_filterrz   ÚenvironrB  rŸ  Ú_CONFIG_FILENAMEÚFileNotFoundErrorÚconfigparserZConfigParserZ	read_fileÚ_NAMED_FILTERSrÅ  r0   Ú_RH_SAFER_DEFAULTÚwarningsÚwarnÚRuntimeWarningr  r  r7  r9  Ú	TypeErrorÚcallable)r   rì  r‚   Úfilerù  Zconfr8   r8   r9   Ú_get_filter_function™  sZ    þþø	
ÿ

zTarFile._get_filter_functionÚ.)Únumeric_ownerrì  c                C   sð   g }|   |¡}|d kr| }|D ]F}|  |||¡}|d kr:q| ¡ rL| |¡ | j||| ¡  |d q|jdd„ dd |D ]n}tj ||j	¡}	z,| j
||	|d |  ||	¡ |  ||	¡ W q| tk
rè }
 z|  |
¡ W 5 d }
~
X Y q|X q|d S )N©Ú	set_attrsr  c                 S   s   | j S r…   r  )rš  r8   r8   r9   Ú<lambda>ï  r   z$TarFile.extractall.<locals>.<lambda>T)r°  Úreverse)r  )r  Ú_get_extract_tarinfor   rÂ   Ú_extract_oneÚsortrz   r%   rÃ   r‚   ÚchownÚutimeÚchmodr
   Ú_handle_nonfatal_error)r   r%   r¦  r  rì  ZdirectoriesÚfilter_functionr  rä   Údirpathrª  r8   r8   r9   Ú
extractallÎ  s,    

ÿzTarFile.extractallrŒ   c                C   s4   |   |¡}|  |||¡}|d k	r0|  ||||¡ d S r…   )r  r	  r
  )r   r  r%   r  r  rì  r  rä   r8   r8   r9   Úextractû  s    
zTarFile.extractc              
   C   sÎ   t |tƒr|  |¡}n|}|}z|||ƒ}W nZ ttfk
r\ } z|  |¡ W 5 d }~X Y n, tk
r† } z|  |¡ W 5 d }~X Y nX |d kr¦|  dd|j	 ¡ d S | 
¡ rÊt |¡}tj ||j¡|_|S )Nr$   rí  )r7  r9  rÆ  r¥   ré   Ú_handle_fatal_errorr
   r  rî  r‚   rÿ   r  rz   r%   rÃ   r  r  )r   r  r  r%   rä   Z
unfilteredrª  r8   r8   r9   r	  	  s"    

zTarFile._get_extract_tarinfoc              
   C   sˆ   |   d¡ z"| j|tj ||j¡||d W nV tk
rX } z|  |¡ W 5 d }~X Y n, tk
r‚ } z|  	|¡ W 5 d }~X Y nX d S )Nrw   r  )
rÇ  Ú_extract_memberrz   r%   rÃ   r‚   r¥   r  r
   r  )r   rä   r%   r  r  rª  r8   r8   r9   r
  %	  s    
þ
zTarFile._extract_onec                 C   s"   | j dkr‚ n|  dd| ¡ d S )Nr#   útarfile: %s)r¤  rî  ©r   rª  r8   r8   r9   r  2	  s    
zTarFile._handle_nonfatal_errorc                 C   sn   | j dkr‚ n\t|tƒrP|jd kr6|  dd|j ¡ qj|  dd|j|jf ¡ n|  ddt|ƒj|f ¡ d S )Nr   r#   r  ztarfile: %s %rztarfile: %s %s)r¤  r7  r¥   Úfilenamerî  Ústrerrorr  rn   r  r8   r8   r9   r  9	  s    


zTarFile._handle_fatal_errorc                 C   s‚   |   d¡ t|tƒr |  |¡}n|}| ¡ s6|jtkrB|  | |¡S | ¡ sR| 	¡ rzt| j
tƒrhtdƒ‚q~|  |  |¡¡S nd S d S )Nrw   z'cannot extract (sym)link as file object)rÇ  r7  r9  rÆ  rþ   r  rg  Ú
fileobjectrÿ   r  r™   rŠ   r	   ÚextractfileÚ_find_link_target)r   r  rä   r8   r8   r9   r  E	  s    


zTarFile.extractfilec                 C   sT  |  d¡}| dtj¡}tj |¡}|r>tj |¡s>t |¡ | ¡ sN| 	¡ rh|  
dd|j|jf ¡ n|  
d|j¡ | ¡ rŒ|  ||¡ nŽ| ¡ r¢|  ||¡ nx| ¡ r¸|  ||¡ nb| ¡ sÈ| ¡ rÖ|  ||¡ nD| ¡ sæ| 	¡ rô|  ||¡ n&|jtkr|  ||¡ n|  ||¡ |rP|  |||¡ | 	¡ sP|  ||¡ |  ||¡ d S )Nrö   r#   z%s -> %s)rX  r­   rz   rú   r%   r  rž  Úmakedirsrÿ   r  rî  r‚   r  rþ   Úmakefiler   ÚmakedirrŽ  Úmakefifor‹  rŒ  ÚmakedevÚmakelinkr  rg  Úmakeunknownr  r  r  )r   rä   Ú
targetpathr  r  Z	upperdirsr8   r8   r9   r  d	  s4    


zTarFile._extract_memberc                 C   s@   z&|j d krt |¡ nt |d¡ W n tk
r:   Y nX d S )NiÀ  )rƒ   rz   ÚmkdirÚFileExistsError©r   rä   r$  r8   r8   r9   r  •	  s    
zTarFile.makedirc              	   C   sŽ   | j }| |j¡ | j}t|dƒb}|jd k	rn|jD ]"\}}| |¡ t|||t|ƒ q4| |j¡ | 	¡  nt|||jt|ƒ W 5 Q R X d S )Nr˜  )
r™   r¿   rà   r¥  rŸ  rá   r[   r   r'   Útruncate)r   rä   r$  Úsourcera   ÚtargetrÌ   r'   r8   r8   r9   r  £	  s    


zTarFile.makefilec                 C   s"   |   ||¡ |  dd|j ¡ d S )Nr#   z9tarfile: Unknown file type %r, extracted as regular file.)r  rî  r  r'  r8   r8   r9   r#  ³	  s    ÿzTarFile.makeunknownc                 C   s"   t tdƒrt |¡ ntdƒ‚d S )NÚmkfifozfifo not supported by system)r   rz   r+  r
   r'  r8   r8   r9   r   »	  s    
zTarFile.makefifoc                 C   sj   t tdƒrt tdƒstdƒ‚|j}|d kr.d}| ¡ rB|tjO }n
|tjO }t ||t 	|j
|j¡¡ d S )NÚmknodr!  z'special devices not supported by systemrø   )r   rz   r
   rƒ   rŒ  rÐ  ÚS_IFBLKÚS_IFCHRr,  r!  r  r  )r   rä   r$  rƒ   r8   r8   r9   r!  Ã	  s    
ÿzTarFile.makedevc                 C   s°   zb|  ¡ r0tj |¡r t |¡ t |j|¡ n0tj |j¡rNt 	|j|¡ n|  
|  |¡|¡ W nH tk
rª   z|  
|  |¡|¡ W n tk
r¤   tdƒ‚Y nX Y nX d S )Nz%unable to resolve link inside archive)r  rz   r%   ÚlexistsÚunlinkÚsymlinkr  rž  r  Úlinkr  r  Úsymlink_exceptionrÅ  r
   r'  r8   r8   r9   r"  Õ	  s"    
ÿÿzTarFile.makelinkc                 C   sü   t tdƒrøt ¡ dkrø|j}|j}|sŽztrB|jrBt |j¡d }W n tk
rX   Y nX zt	rv|j
rvt	 |j
¡d }W n tk
rŒ   Y nX |d kršd}|d kr¦d}z4| ¡ rÊt tdƒrÊt |||¡ nt |||¡ W n tk
rö   tdƒ‚Y nX d S )NÚgeteuidr   r$   r;   Úlchownzcould not change owner)r   rz   r4  r*   r)   rä  r,   ZgetgrnamrÅ  râ  r+   Úgetpwnamr  r5  r  r¥   r
   )r   rä   r$  r  ÚgÚur8   r8   r9   r  î	  s0    

zTarFile.chownc                 C   sB   |j d krd S zt ||j ¡ W n tk
r<   tdƒ‚Y nX d S )Nzcould not change mode)rƒ   rz   r  r¥   r
   r'  r8   r8   r9   r  
  s    
zTarFile.chmodc                 C   sV   |j }|d krd S ttdƒs d S zt |||f¡ W n tk
rP   tdƒ‚Y nX d S )Nr  z"could not change modification time)r(   r   rz   r  r¥   r
   )r   rä   r$  r(   r8   r8   r9   r  
  s    
zTarFile.utimec              
   C   sð  |   d¡ | jd k	r$| j}d | _|S | j| j ¡ krZ| j | jd ¡ | j d¡sZtdƒ‚d }z| j 	| ¡}W qÎ t
k
rÆ } z6| jr´|  dd| j|f ¡ |  jt7  _W Y ¢q^W 5 d }~X Y qÎ tk
r6 } zR| jr|  dd| j|f ¡ |  jt7  _W Y ¢ q^n| jdkr&tt|ƒƒ‚W 5 d }~X Y n’ tk
r^   | jdkrZtdƒ‚Y nj tk
r˜ } z| jdkrˆtt|ƒƒ‚W 5 d }~X Y n0 tk
rÆ } ztt|ƒƒ‚W 5 d }~X Y nX qÎq^|d k	ræ| j |¡ nd| _|S )	NZrar#   rY   r$   z0x%X: %sr   z
empty fileT)rÇ  r©  rÌ   r™   r¾   r¿   r]   r   rä   ra  rs   r¢  rî  rÇ   rK   r9  rq   rr   rt   r¦  rÂ   r§  )r   Úmrä   rª  r8   r8   r9   rk  '
  sJ    



zTarFile.nextc           	      C   s¶   |   ¡ }d}|d k	rHz| |¡}W n tk
r:   d}Y nX |d |… }|rXtj |¡}t|ƒD ]D}|rz|j|jkr`d}q`|rŽtj |j¡}n|j}||kr`|  S q`|r²t|ƒ‚d S )NFT)	rÉ  Úindexr0   rz   r%   ÚnormpathÚreversedrÌ   r‚   )	r   r‚   rä   Ú	normalizer¦  Zskippingr:  r  Úmember_namer8   r8   r9   rÄ  ]
  s,    

zTarFile._getmemberc                 C   s   |   ¡ }|d kr qq d| _d S rÐ   )rk  r§  rì   r8   r8   r9   rÈ  …
  s    zTarFile._loadc                 C   s:   | j rtd| jj ƒ‚|d k	r6| j|kr6td| j ƒ‚d S )Nz%s is closedzbad operation for mode %r)r›   r¥   ræ   rn   rƒ   )r   rƒ   r8   r8   r9   rÇ  
  s    zTarFile._checkc                 C   s`   |  ¡ r.d td tj |j¡|jfƒ¡}d }n
|j}|}| j||dd}|d kr\t	d| ƒ‚|S )Nrö   T)rä   r=  zlinkname %r not found)
r  rÃ   rì  rz   r%   r  r‚   r  rÄ  rÅ  )r   rä   r  Úlimitr  r8   r8   r9   r  ˜
  s     zTarFile._find_link_targetc                 c   sŠ   | j r| jE d H  d S d}| jd k	r:|  ¡ }|d7 }|V  |t| jƒk rT| j| }n"| j sr|  ¡ }|svd| _ d S nd S |d7 }|V  q:d S )Nr   r#   T)r§  r¦  r©  rk  r2   )r   r:  rä   r8   r8   r9   Ú__iter__«
  s$    
zTarFile.__iter__c                 C   s   || j krt|tjd d S )N©r  )r£  rk   ri   Ústderr)r   ÚlevelÚmsgr8   r8   r9   rî  Ê
  s    
zTarFile._dbgc                 C   s   |   ¡  | S r…   )rÇ  r‡   r8   r8   r9   Ú	__enter__Ð
  s    zTarFile.__enter__c                 C   s,   |d kr|   ¡  n| js"| j  ¡  d| _d S rÐ   )r†   r•   r™   r›   )r   r  r'  Ú	tracebackr8   r8   r9   Ú__exit__Ô
  s
    

zTarFile.__exit__)Nrw   NNNNNNr"  NNNN)rw   N)rw   Nr©   )rw   Nr©   )rw   NN)NNN)T)NT)N)r  N)rŒ   T)TF)NF)N)=rn   ro   rp   r£  r¡  r¢  r¤  r   rS   r   r6   r7   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  rk  rÄ  rÈ  rÇ  r  r@  rî  rE  rG  r8   r8   r8   r9   r   B  sš                   ý
oZ ü


c&3
5ÿ-ÿ  ÿ
1!
6
(

	c                 C   s2   zt | ƒ}| ¡  W dS  tk
r,   Y dS X d S )NTF)r   r†   r   )r‚   rÆ   r8   r8   r9   r   â
  s    c               	   C   s  dd l } d}| j|d}|jdddddd	 |jd
dtdd |jdd}|jddddd |jdddddd |jdddddd |jdd dd!d | ¡ }|jrº|jd krº| d"d#¡ |j	d k	r4|j	}t
|ƒrt|d$ƒ }| ¡  t| ¡ tjd% W 5 Q R X |jr0td& |¡ƒ n| d"d' |¡¡ nÐ|jd k	rŽ|j}t
|ƒrxt |d(¡}|j|jd) W 5 Q R X n| d"d' |¡¡ nv|jd k	rbt|jƒd"kr¼|jd }tj}n,t|jƒd*krØ|j\}}n| d"| ¡ ¡ t
|ƒrNt |d(¡}|j||jd+ W 5 Q R X |jr`|d,kr8d- |¡}	nd. ||¡}	t|	ƒ n| d"d' |¡¡ n¢|jd k	r|j d¡}
tj |
¡\}}d/d/d0d0d1d1d1d1d2œ}||kr¶d3||  nd4}|j}t |
|¡}|D ]}| |¡ qÒW 5 Q R X |jrtd5 |
¡ƒ d S )6Nr   z3A simple command-line interface for tarfile module.)Údescriptionz-vz	--verboseÚ
store_trueFzVerbose output)ÚactionÚdefaultÚhelpz--filterz<filtername>zFilter for extraction)ÚmetavarÚchoicesrL  T)Zrequiredz-lz--listú	<tarfile>zShow listing of a tarfile)rM  rL  z-ez	--extractú+)rO  z<output_dir>zExtract tarfile into target dir)ÚnargsrM  rL  z-cz--create)z<name>z<file>zCreate tarfile from sourcesz-tz--testzTest if a tarfile is validr#   z&--filter is only valid for extraction
rw   rA  z{!r} is a tar archive.z{!r} is not a tar archive.
r«  )rê  r$   )r%   rì  r  z{!r} file is extracted.z+{!r} file is extracted into {!r} directory.rŽ   r‘   r   )r«   z.tgzz.xzz.txzz.bz2z.tbzz.tbz2z.tb2zw:rx   z{!r} file created.)ÚargparseÚArgumentParserÚadd_argumentrú  Zadd_mutually_exclusive_groupÚ
parse_argsrì  r  ÚexitZtestr   r   rÉ  rk   ri   rB  rê  rS   r}  r   r2   rz   ÚcurdirZformat_helpr  ZcreateÚpopr%   Úsplitextrñ  )rR  rH  Úparserrs  Úargsr_   r“   ZtfrW  rD  Ztar_nameÚ_ZextZcompressionsZtar_modeZ	tar_filesÚ	file_namer8   r8   r9   Úmainð
  s¢    ÿþ
ÿ
þ
þ
ÿ




 ÿ
õr^  Ú__main__)T)lÚversionÚ
__author__Ú__credits__Úbuiltinsr   rŸ  ri   rz   rÔ   rZ   rÐ  r°   rV   r  rq  rü  râ  r   rä  ÚAttributeErrorÚNotImplementedErrorr3  r¥   Ú	NameErrorÚ__all__rû  r÷  r3   rÇ   rÃ  r0  r+  r-  r,  rA  r  rU  rŠ  r‰  rC  rD  r  r  ZCONTTYPEr3  r2  rV  r;  r=  rd  r   r   r   r   rg  r‡  rY  r„  rx  r8  rI   r…  r‚   r   Úgetfilesystemencodingr:   r?   rN   rT   rX   r[   rl   Ú	Exceptionr   r
   r   r   r	   r   rq   rr   rs   rK   rt   ru   rŠ   Úobjectr–   rË   ÚBufferedReaderrß   ré   rê   rí   ró   rô   rõ   r  r  r  r  rú  r  r   r   r   r^  rn   r8   r8   r8   r9   Ú<module>    s:  


       ý     ü ÿÿú sh
?ý     u         )_
