a 9zi+ @s dZdZdZddlmZddlZddlZddlZddl Z ddl Z ddl Z ddl Z ddl Z ddlZddlZz ddlZWneydZYn0z ddlZWneydZYn0eefZzeef7ZWneyYn0gdZdZdZd Zd Zed Zd Zd ZdZ dZ!dZ"dZ#d Z$dZ%dZ&dZ'dZ(dZ)dZ*dZ+dZ,dZ-dZ.dZ/dZ0dZ1dZ2dZ3dZ4e4Z5e#e$e%e&e)e*e+e'e(e,e-e.f Z6e#e$e+e.fZ7e,e-e.fZ8d Z9hd!Z:e;e;e;ed#krd$Z?ne@Z?d%d&ZAd'd(ZBd)d*ZCd+e5fd,d-ZDd.d/ZEdedfd0d1ZFd2d3ZGGd4d5d5eHZIGd6d7d7eIZJGd8d9d9eIZKGd:d;d;eIZLGdd?d?eIZNGd@dAdAeNZOGdBdCdCeNZPGdDdEdEeNZQGdFdGdGeNZRGdHdIdIeNZSGdJdKdKZTGdLdMdMZUGdNdOdOeVZWGdPdQdQeVZXGdRdSdSejYZZGdTdUdUeIZ[GdVdWdWe[Z\GdXdYdYe[Z]GdZd[d[e[Z^Gd\d]d]e[Z_Gd^d_d_e[Z`Gd`dadae[Zae[eeJfZbdudbdcZcdddeZddfdgZedhdiZfedeeefdjZgeVZheidkZjGdldmdmeVZkGdndodoeVZldpdqZmeljZdrdsZneodtkrendS)vz0.9.0u"Lars Gustäbel (lars@gustaebel.de)u4Gustavo Niemeyer, Niels Gustäbel, Richard Townsend.)openN)TarFileTarInfo is_tarfileTarError ReadErrorCompressionError StreamError ExtractError HeaderErrorENCODING USTAR_FORMAT GNU_FORMAT PAX_FORMATDEFAULT_FORMATrTz/etc/python/tarfile.cfgisustar sustar00d01234567LKSxgX)pathlinkpathsizemtimeuidgidunamegname>r,r%r+r&)Zatimectimer(r)r*r'ntutf-8cCs8|durtd|||}|d||t|tS)Nzmetadata cannot contain None) ValueErrorencodelenNUL)slengthencodingerrorsr8/usr/lib64/python3.9/tarfile.pystns r:cCs*|d}|dkr|d|}|||S)Nr)finddecode)r4r6r7pr8r8r9ntss  r?cCs|ddvrbd}tt|dD]}|dK}|||d7}q |ddkrdt|d| }n>z"t|dd}t|p|d d}Wntytd Yn0|S) Nr)r#rAasciistrict0invalid header)ranger2r?intstripr0InvalidHeaderError)r4nir8r8r9ntis    rNrBcCst|}d|kr$d|dkrDnntd|d|fdt}n|tkrd|d |krrd|dkrnnV|dkrtdg}ntdg}d||}t|dD]}|d|d@|dL}qntd |S) NrrBr#z%0*orDrCr@rAzoverflow in number field)rIbytesr3r bytearrayrHinsertr0)rLdigitsformatr4rMr8r8r9itns  2    rTcCs0dttd|}dttd|}||fS)NrCZ 148B8x356BZ 148b8x356b)sumstruct unpack_from)bufZunsigned_chksumZ signed_chksumr8r8r9 calc_chksumss rYc Cs|pd}|dkrdS|dur.t|||dSt||\}}t|D],}||}t||krf|d||qD|dkr||}t||kr|d||dS)Ni@runexpected end of data)shutil copyfileobjdivmodrHreadr2write) srcdstr5 exceptionbufsizeblocks remainderbrXr8r8r9r\s$       r\cCs8ttjdd}|dur(||d|}t|dddS)Nr6backslashreplace )end)getattrsysstdoutr1r=print)r4r6r8r8r9 _safe_printsrnc@s eZdZdS)rN__name__ __module__ __qualname__r8r8r8r9rsrc@s eZdZdS)r Nror8r8r8r9r sr c@s eZdZdS)rNror8r8r8r9rsrc@s eZdZdS)rNror8r8r8r9rsrc@s eZdZdS)r Nror8r8r8r9r !sr c@s eZdZdS)r Nror8r8r8r9r $sr c@s eZdZdS)EmptyHeaderErrorNror8r8r8r9rs'srsc@s eZdZdS)TruncatedHeaderErrorNror8r8r8r9rt*srtc@s eZdZdS)EOFHeaderErrorNror8r8r8r9ru-sruc@s eZdZdS)rKNror8r8r8r9rK0srKc@s eZdZdS)SubsequentHeaderErrorNror8r8r8r9rv3srvc@s,eZdZddZddZddZddZd S) _LowLevelFilecCsFtjtjtjBtjBd|}ttdr2|tjO}t||d|_dS)NrwO_BINARYi) osO_RDONLYO_WRONLYO_CREATO_TRUNChasattrr{rfd)selfnamemoder8r8r9__init__@s  z_LowLevelFile.__init__cCst|jdSN)r|closerrr8r8r9rIsz_LowLevelFile.closecCst|j|Sr)r|r^rrr'r8r8r9r^Lsz_LowLevelFile.readcCst|j|dSr)r|r_rrr4r8r8r9r_Osz_LowLevelFile.writeN)rprqrrrrr^r_r8r8r8r9rw:s rwc@sneZdZddZddZddZddZd d Zd d Zd dZ ddZ dddZ ddZ ddZ ddZdS)_Streamc Csd|_|durt||}d|_|dkr6t|}|}|pd|fg}d|_g|_d}|j}|D]L\}}||kr||j d||df|j d||||f||7}||}qX||jkr|j d||jdfdS)NrrFT) roffsetr'positionrjrr map_indexmapr)rrrr'Z blockinfoZlastposZrealposr8r8r9rhs(    z_FileInFile.__init__cCsdSrr8rr8r8r9rsz_FileInFile.flushcCsdSNTr8rr8r8r9readablesz_FileInFile.readablecCsdS)NFr8rr8r8r9writablesz_FileInFile.writablecCs |jSr)rseekablerr8r8r9rsz_FileInFile.seekablecCs|jSr)rrr8r8r9rsz_FileInFile.tellcCs|tjkr tt|d|j|_nj|tjkr\|dkrFt|j|d|_qt|j||j|_n.|tjkrtt|j||jd|_ntd|jS)NrzInvalid argument) ioSEEK_SETminmaxr'rSEEK_CURSEEK_ENDr0)rrwhencer8r8r9rs   z_FileInFile.seekc Cs |dur|j|j}nt||j|j}d}|dkr|j|j\}}}}||jkr`|krhqnqq6|jd7_|jt|jkr6d|_q6t|||j}|r|j||j||j|}t||krt d||7}n |t |7}||8}|j|7_q,|S)Nrrr#rZ) r'rrrrr2rrr^rr3) rr'rXdatastartstoprr5rfr8r8r9r^s,     z_FileInFile.readcCs&|t|}||dt|<t|Sr)r^r2)rrfrXr8r8r9readintosz_FileInFile.readintocCs d|_dSr)rrr8r8r9rsz_FileInFile.close)N)N)rprqrrrrrrrrrrrr^rrr8r8r8r9rbs  rcseZdZfddZZS) ExFileObjectcs&t|j|j|j|j}t|dSr)rr offset_datar'sparsesuperr)rtarfiletarinfor __class__r8r9rs zExFileObject.__init__rprqrrr __classcell__r8r8rr9rsrc@s eZdZdS) FilterErrorNror8r8r8r9rsrcseZdZfddZZS)AbsolutePathErrorcs ||_td|jddS)Nzmember z has an absolute pathrrrrrrrr8r9rszAbsolutePathError.__init__rr8r8rr9rsrcseZdZfddZZS)OutsideDestinationErrorcs.||_||_t|jd|dddS)Nz would be extracted to , which is outside the destinationr_pathrrrrrr%rr8r9rs z OutsideDestinationError.__init__rr8r8rr9rsrcseZdZfddZZS)SpecialFileErrorcs||_t|jddS)Nz is a special filerrrr8r9rszSpecialFileError.__init__rr8r8rr9rsrcseZdZfddZZS)AbsoluteLinkErrorcs||_t|jddS)Nz is a link to an absolute pathrrrr8r9rszAbsoluteLinkError.__init__rr8r8rr9rsrcseZdZfddZZS)LinkOutsideDestinationErrorcs.||_||_t|jd|dddS)Nz would link to rrrrrr8r9rs z$LinkOutsideDestinationError.__init__rr8r8rr9rsrcseZdZfddZZS)LinkFallbackErrorcs2||_||_td|jdd|ddS)Nzlink z would be extracted as a zcopy of z, which was rejectedrrrr8r9rs  zLinkFallbackError.__init__rr8r8rr9rsrcCs"i}|j}tjj|tjjd}|dtjfrH|jdtj}|d<tj|r\t |tjjtj ||tjjd}tj ||g|krt |||j }|dur|d@}|r|s|r|d@s|dM}|dO}n|s|rd}nt|||j kr||d<|r|jdur*d|d <|jdur>d|d <|jdurRd|d <|jdurfd|d <|sz|rtj|jrt|tj|j}||jkr||d <|rtj |tj||j}ntj ||j}tjj|tjjd}tj ||g|krt|||S)N)rE/ri@irr)r*r+r,linkname)rr|r%realpath ALLOW_MISSINGrseplstripisabsrr commonpathrrisregislnkisdirissymrr)r*r+r,rrnormpathdirnamer)member dest_pathZfor_data new_attrsrZ target_pathrZ normalizedr8r8r9_get_filtered_attrssl             rcCs|Srr8)rrr8r8r9fully_trusted_filterGsrcCs,t||d}|r(|jfi|ddiS|S)NFdeeprrrrrr8r8r9 tar_filterJs rcCs,t||d}|r(|jfi|ddiS|S)NTrFrrr8r8r9 data_filterPs r)Z fully_trustedrrs([0-9]{1,20}) c@seZdZeddddddddd d d d d ddddddddZdhddZeddZejddZeddZ e jddZ ddZ e e e e e e e e de d d!d"Z d#d$Z eed%fd&d'Zd(d)Zd*d+Zd,d-Zed.d/Zd0d1Zed2d3Zed4d5Zed6d7Zed8d9Zed:d;Zedd?Zd@dAZdBdCZ dDdEZ!dFdGZ"dHdIZ#dJdKZ$dLdMZ%dNdOZ&dPdQZ'dRdSZ(dTdUZ)dVdWZ*dXdYZ+dZd[Z,d\d]Z-d^d_Z.d`daZ/dbdcZ0dddeZ1dfdgZ2dS)irzName of the archive member.zPermission bits.z6User ID of the user who originally stored this member.z7Group ID of the user who originally stored this member.zSize in bytes.zTime of last modification.zHeader checksum.zFile 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.zDevice major number.zDevice minor number.zThe tar header starts here.zThe file's data starts here.zMA dictionary containing key-value pairs of an associated pax extended header.zSparse member information.N)rrr)r*r'r(chksumtyperr+r,devmajordevminorrr pax_headersrr_sparse_structs _link_targetrcCsj||_d|_d|_d|_d|_d|_d|_t|_d|_ d|_ d|_ d|_ d|_ d|_d|_d|_i|_dS)Nirr)rrr)r*r'r(rREGTYPErrr+r,rrrrrrrrr8r8r9rs"zTarInfo.__init__cCs|jSrrrr8r8r9r%sz TarInfo.pathcCs ||_dSrr$r#r8r8r9r%scCs|jSrrrr8r8r9r&szTarInfo.linkpathcCs ||_dSrr%)rrr8r8r9r&scCsd|jj|jt|fS)Nz<%s %r at %#x>)rrpridrr8r8r9__repr__szTarInfo.__repr__T) rr(rrr)r*r+r,r_KEEPc Cs| rt|} n t|} || ur(|| _|| ur6|| _|| urD|| _|| urR|| _|| ur`|| _|| urn|| _|| ur||| _|| ur|| _ | Sr) copydeepcopyrr(rrr)r*r+r,) rrr(rrr)r*r+r,rr(resultr8r8r9rs(  zTarInfo.replacecCs|jdurd}n |jd@}|j||j|j|j|j|j|j|j|j |j |j |j d }|dt kr||dds||dd7<|S)N) rrr)r*r'r(rrrr+r,rrrrr)rrr)r*r'r(rrrr+r,rrDIRTYPEr)rrinfor8r8r9get_infos(  zTarInfo.get_infosurrogateescapecCsz|}|D]\}}|durtd|q|tkrD||||S|tkrZ||||S|tkrn|||StddS)Nz%s may not be Nonezinvalid format) r/itemsr0r create_ustar_headerrcreate_gnu_headerrcreate_pax_header)rrSr6r7r.rvaluer8r8r9tobufs z TarInfo.tobufcCsnt|d<t|d||tkr(tdt|d||tkr^||d||\|d<|d<||t||S)Nmagicrzlinkname is too longrprefix) POSIX_MAGICr2r1 LENGTH_LINKr0 LENGTH_NAME_posix_split_name_create_headerr )rr.r6r7r8r8r9r2s zTarInfo.create_ustar_headercCst|d<d}t|d||tkr<|||dt||7}t|d||tkrl|||dt||7}|||t ||S)Nr7rrr) GNU_MAGICr2r1r:_create_gnu_long_headerGNUTYPE_LONGLINKr;GNUTYPE_LONGNAMEr=r)rr.r6r7rXr8r8r9r3 szTarInfo.create_gnu_headerc CsLt|d<|j}ddtfddtfddfD]h\}}}||vr>q*z||dd Wn"tyt||||<Yq*Yn0t|||kr*||||<q*d D]\}}d }||} t| t } | rt | n| } d | krd |dksnd ||<d}n| r| ||<d}|r||vrt | ||<q|r4| |t |} nd} | ||tddS)Nr7rr%rr&)r+r+ )r,r,rBrDrE))r)rB)r*rB)r' )r(rCFrrBr#Trr)r9rr)r;r:r1UnicodeEncodeErrorr2 isinstancefloatroundstr_create_pax_generic_headerXHDTYPEr=r ) rr.r6rrZhnamer5rRZ needs_paxvalZ val_is_floatZval_intrXr8r8r9r4s>       zTarInfo.create_pax_headercCs||tdS)Nr/)rIXGLTYPE)clsrr8r8r9create_pax_global_headerTsz TarInfo.create_pax_global_headercCs~|d}tdt|D]T}d|d|}d||d}t|||tkrt|||tkrqvqtd||fS)Nrr#zname is too long)splitrHr2rr1 LENGTH_PREFIXr;r0)rrr6r7 componentsrMr8r8r8r9r<Zs zTarInfo._posix_split_namec Cs|dttfv}|r@t|ddd|}t|ddd|}ntdd||}tdd||}|dt}|durxtdt|ddd ||t|d dd @d|t|d dd|t|d dd|t|ddd|t|ddd|d|t|ddd |||dtt|ddd||t|ddd||||t|ddd||g}t dt d |} t | t dd} | ddt d| d| dd} | S)NrrrrBrrzTarInfo.type must not be Nonerrrr,r)r*r'rCr(s rr7r+rBr,r8rz%dsriz%06orDi)getCHRTYPEBLKTYPErTr:r"r0r9rVrrrrYrO) r.rSr6r7Zhas_device_fieldsrrZfiletypepartsrXrr8r8r9r=js:  &zTarInfo._create_headercCs.tt|t\}}|dkr*|t|t7}|S)Nr)r]r2rr3)payloadrdrer8r8r9_create_payloadszTarInfo._create_payloadcCsR|||t}i}d|d<||d<t||d<t|d<||t||||S)Nz ././@LongLinkrrr'r7)r1r3r2r>r=r rW)rMrrr6r7r.r8r8r9r?s zTarInfo._create_gnu_long_headerc Cs0d}|D]6\}}z|ddWq ty@d}YqDYq 0q d}|rT|d7}|D]\}}|d}|r||d}n |d}t|t|d}d } } |tt| } | | krq| } q|tt| d d |d |d 7}q\i} d| d<|| d<t|| d<t| d<|| td d| |S)NFr/rETrs21 hdrcharset=BINARY r0rrrD = z././@PaxHeaderrrr'r7r) r1r1rDr2rHrOr9r=r rW) rMrrr6binarykeywordr5recordslrLr>r.r8r8r9rIs<   ( z"TarInfo._create_pax_generic_headerc Cstt|dkrtdt|tkr(td|ttkr>tdt|dd}|t|vrbt d|}t |dd|||_ t|dd |_ t|d d |_ t|d d |_t|d d |_t|d d|_||_|dd |_t |d d|||_t |dd|||_t |dd|||_t|dd|_t|dd|_t |dd||}|jtkr|j drt|_|jtkr6d}g}tdD]j} z0t|||d} t||d|d} WntyYqYn0|| | f|d7}qt|d} t|dd} || | f|_ |!rN|j "d|_ |rp|jt#vrp|d|j |_ |S)Nrz empty headerztruncated headerzend of file headerz bad checksumrlt|ii i)iIiQiYirirrCiii)$r2rsrrtcountr3rurNrYrKr?rrr)r*r'r(rrrr+r,rrAREGTYPErr-GNUTYPE_SPARSErHr0rboolr r rstrip GNU_TYPES)rMrXr6r7robjr8rstructsrMrnumbytes isextendedorigsizer8r8r9frombufsZ         zTarInfo.frombufcCs8|jt}|||j|j}|jt|_||Sr) rr^rrrr6r7rr _proc_member)rMrrXrmr8r8r9 fromtarfile!s zTarInfo.fromtarfilecCsT|jttfvr||S|jtkr,||S|jtttfvrF| |S| |SdSr) rrAr@ _proc_gnulongri _proc_sparserJrLSOLARIS_XHDTYPE _proc_pax _proc_builtin)rrr8r8r9rs6s    zTarInfo._proc_membercCsR|j|_|j}|s$|jtvr4|||j7}||_| |j |j |j |Sr) rrrr rSUPPORTED_TYPES_blockr'r_apply_pax_inforr6r7)rrrr8r8r9ryCs zTarInfo._proc_builtincCs|j||j}z||}Wnty<tdYn0|j|_|jt krdt ||j |j |_ n|jtkrt ||j |j |_|S)N missing or bad subsequent header)rr^r{r'rtr rvrrrAr?r6r7rr@r)rrrXnextr8r8r9ruTs   zTarInfo._proc_gnulongc Cs|j\}}}|`|r|jt}d}tdD]l}z0t|||d}t||d|d} WntyxYqYn0|r| r||| f|d7}q,t|d}q||_ |j |_ |j | |j |_||_ |S)NrrCrfi)r rr^rrHrNr0rrjrrrr{r'r) rrrnrprqrXrrMrror8r8r9rvjs(       zTarInfo._proc_sparsecCs|j||j}|jtkr&|j}n |j}d}d}g}t||krh||dkrht ||}spt dzt | d}Wntyt dYn0|dkrt d||t|krt d|d|d} ||dd| } | d\} } } | r| dks|| dkr$t d||| | f| dkr^|dur^| dkrZ|j}nd }||7}q<|durvd }|D]X\}} } || d d |j}|tvr|| ||j|j}n|| d d |j}|||<qzz||}Wntytd Yn0d |vr|||nFd |vr0|||n.|d dkr^|ddkr^|||||jttfvr| ||j|j|j!|_!d|vr|j"}|#s|jt$vr|||j7}||_!|S)NrrGr#rYrs hdrcharsetsBINARYr/r}GNU.sparse.mapGNU.sparse.sizezGNU.sparse.major1zGNU.sparse.minorrFr')%rr^r{r'rrLrr)r2_header_length_prefix_rematchrKrIgroupr0rri partitionrr6_decode_pax_fieldr7PAX_NAME_FIELDSrtr rv_proc_gnusparse_01_proc_gnusparse_00rR_proc_gnusparse_10rJrwr|rrr rz)rrrXrrr6 raw_headersrr5Zheader_value_end_offsetZkeyword_and_valueZ raw_keywordZequalsZ raw_valuer\r5r~rr8r8r9rxs|                zTarInfo._proc_paxc Csg}g}|D]\}}}|dkrRz|t|WqtyNtdYq0q |dkr z|t|Wq tytdYq 0q tt|||_dS)NsGNU.sparse.offsetrGsGNU.sparse.numbytes)rrIr=r0rKlistzipr)rr~rZoffsetsro_r\r5r8r8r9rs  zTarInfo._proc_gnusparse_00cCs@dd|ddD}tt|ddd|ddd|_dS)NcSsg|] }t|qSr8)rI).0xr8r8r9 rz.TarInfo._proc_gnusparse_01..r,r$r#)rOrrr)rr~rrr8r8r9rszTarInfo._proc_gnusparse_01cCsd}g}|jt}|dd\}}t|}t||dkrtd|vrT||jt7}|dd\}}|t|q,|j|_t t |ddd|ddd|_ dS)NrZr#r$) rr^rrOrIr2rrrrrr)rr~rrfieldsrrXnumberr8r8r9rs  zTarInfo._proc_gnusparse_10c Cs|D]\}}|dkr&t|d|q|dkr@t|dt|q|dkrZt|dt|q|tvr|tvrzt||}Wntyd}Yn0|dkr|d}t|||q||_dS)NzGNU.sparse.namer%rr'zGNU.sparse.realsizerr) r1setattrrI PAX_FIELDSPAX_NUMBER_FIELDSr0rkr)r)rrr6r7r\r5r8r8r9r|)s"   zTarInfo._apply_pax_infocCs2z||dWSty,|||YS0dS)NrE)r=UnicodeDecodeError)rr5r6Zfallback_encodingZfallback_errorsr8r8r9r@s zTarInfo._decode_pax_fieldcCs2|dkrtdt|t\}}|r*|d7}|tS)Nrzinvalid offsetr#)rKr]r)rrgrdrer8r8r9r{Hs zTarInfo._blockcCs |jtvSr)r REGULAR_TYPESrr8r8r9r Tsz TarInfo.isregcCs|Sr)r rr8r8r9isfileXszTarInfo.isfilecCs |jtkSr)rr-rr8r8r9r \sz TarInfo.isdircCs |jtkSr)rSYMTYPErr8r8r9r`sz TarInfo.issymcCs |jtkSr)rLNKTYPErr8r8r9r dsz TarInfo.islnkcCs |jtkSr)rrSrr8r8r9ischrhsz TarInfo.ischrcCs |jtkSr)rrTrr8r8r9isblklsz TarInfo.isblkcCs |jtkSr)rFIFOTYPErr8r8r9isfifopszTarInfo.isfifocCs |jduSr)rrr8r8r9issparsetszTarInfo.issparsecCs|jtttfvSr)rrSrTrrr8r8r9isdevwsz TarInfo.isdev)r)3rprqrrdict __slots__rpropertyr%setterr&r'r(rr/rr r6r2r3r4 classmethodrNr< staticmethodr=rWr?rIrrrtrsryrurvrxrrrr|rr{r rr rr rrrrrr8r8r8r9rfs       :  )   2 >  y rc @seZdZdZdZdZdZeZe Z dZ e Z eZdZdjddZedddefd d Zedkd d ZedlddZedmddZednddZdddddZddZddZddZdd Zdod!d"Zdpdd$d%d&Zdqdd'd(d)Z drd*d+Z!d,d-Z"dsddd/d0d1Z#d2d3Z$dtddd/d5d6Z%d7d8Z&dud9d:Z'd;d<Z(d=d>Z)d?d@Z*dvdddAdBdCZ+dDdEZ,dFdGZ-dHdIZ.dJdKZ/dLdMZ0dNdOZ1dPdQZ2dRdSZ3dTdUZ4dVdWZ5dXdYZ6dwdZd[Z7d\d]Z8dxd^d_Z9d`daZ:dbdcZ;dddeZdS)yrrFr#Nryr0c Csddddd}||vrtd||_|||_|sh|jdkrTtj|sTd|_d|_t||j}d |_n@|durt|d rt |j t t fr|j }t|d r|j|_d |_|rtj |nd|_ ||_|dur||_|dur||_|dur||_|dur||_|dur ||_| |_| dur0|jtkr0| |_ni|_| durF| |_| durV| |_| |_d |_g|_d |_|j|_i|_z|jd krd|_ |!|_ |jdkr2|j"|jz|j#|}|j$|WnXt%y|j"|jYq2Yn2t&y,}zt't |WYd}~n d}~00q|jdvr|d |_|jr||j(|j)}|j*||jt+|7_Wn&|js|j,d |_Yn0dS)Nrbzr+bwbxbryarzr!mode must be 'r', 'a', 'w' or 'x'rrzFrrTryrrzr)-r0r_moder|r%exists bltn_openrrrErrHrOabspathrrSr dereference ignore_zerosr6r7rrdebug errorlevel copybufsizermembers_loadedrrinodes firstmemberr~rrtrrur rrNr)r_r2r)rrrrrSrrrr6r7rrrrZmodeserXr8r8r9rs             &   zTarFile.__init__c s|s|std|dvrfdd}tj|dD]l}tj|}|durV|} z||d|fi|WSttfy|dur|| Yq2Yq20q2tdnd|vr|dd \} }| pd} |pd }|jvrtj|}n td |||| |fi|Sd |vr|d d \} }| p4d} |p>d }| d vrRtdt || |||} z|| | fi|} Wn| Yn0d| _ | S|dvrj |||fi|StddS)Nznothing to open)ryr:*csj|dkS)Ntaropen) OPEN_METH)rrMr8r9not_compressed1sz$TarFile.open..not_compressed)keyryz%file could not be opened successfully:r#rr|rxzmode must be 'r' or 'w'Frzundiscernible mode) r0sortedrrjrrrrrOrrrr) rMrrrrckwargsrrfuncZ saved_posfilemodestreamrr8rr9rsP%            z TarFile.opencKs$|dvrtd||||fi|S)Nrr)r0)rMrrrrr8r8r9rbszTarFile.taropenrcKs|dvrtdzddlm}Wnty:tdYn0z|||d||}Wn,ty~|durx|dkrxtdYn0z|j|||fi|}Wn@ty||dkrtdYn|Yn0d |_ |S) Nryrzrmode must be 'r', 'w' or 'x'r)GzipFilezgzip module is not availablerfryrF) r0gziprrrrrrrr)rMrrr compresslevelrrrr8r8r9gzopenjs0   zTarFile.gzopenc Ks|dvrtdzddlm}Wnty:tdYn0||pD|||d}z|j|||fi|}WnDttfy||dkrt dYn|Yn0d |_ |S) Nrrr)BZ2Filer)rryznot a bzip2 fileF) r0rrrrrrEOFErrorrrr)rMrrrrrrrr8r8r9bz2opens& zTarFile.bz2openc Ks|dvrtdzddlm}m}Wnty>tdYn0||pH|||d}z|j|||fi|}WnD|tfy||dkrt dYn|Yn0d |_ |S) Nrrr)LZMAFilerr)presetryznot an lzma fileF) r0rrrrrrrrrr) rMrrrrrrrrr8r8r9xzopens& zTarFile.xzopenrrrr)rrrrcCs|jr dSd|_zp|jdvrn|jttd|jtd7_t|jt\}}|dkrn|jtt|W|j s|j n|j s|j 0dS)NTrr$r) rrrr_r3rrr] RECORDSIZErr)rrdrer8r8r9rs  z TarFile.closecCs(||d}|dur$td||S)Nrzfilename %r not found) _getmemberrkKeyError)rrrr8r8r9 getmembers zTarFile.getmembercCs||js||jSr)_checkr_loadrrr8r8r9 getmembersszTarFile.getmemberscCsdd|DS)NcSsg|] }|jqSr8r$)rrr8r8r9rrz$TarFile.getnames..)rrr8r8r9getnamesszTarFile.getnamesc CsZ|d|dur|j}|dur$|}tj|\}}|tjd}|d}|}||_ |dur|j stt |}qt |}nt |}d}|j}t |r|j|jf} |j s|jdkr| |jvr||j| krt} |j| }nt} | dr||j| <nht |rt} nVt |r"t} nDt |r>t} t|}n(t |rPt} nt |rbt!} ndS||_||_"|j#|_$|j%|_&| tkr|j'|_(nd|_(|j)|_*| |_+||_,t-rzt-.|j$d|_/Wnt0yYn0t1rzt12|j&d|_3Wnt0yYn0| tt!fvrVt4tdrVt4tdrVt5|j6|_7t8|j6|_9|S)Nawxrrr#rmajorminor):rrr|r% splitdriverrrrrrlstatstatfstatfilenost_modeS_ISREGst_inost_devst_nlinkrrr"S_ISDIRr-S_ISFIFOrS_ISLNKrreadlinkS_ISCHRrSS_ISBLKrTrst_uidr)st_gidr*st_sizer'st_mtimer(rrpwdgetpwuidr+rgrpgetgrgidr,rrst_rdevrrr) rrarcnamerdrvrZstatresrZstmdinoderr8r8r9 gettarinfos                 zTarFile.gettarinfoT)rcCs*||dur|}|D] }|r|jdur6tdntt|jtd|jpT|j|jp^|jf| sv| rtdd|j |j fntd|j |jdurtdntdt|jddt|j|rd nd |r|rtd |j|rtd |jtqdS) Nz ??????????z%s/%sz%10sz%d,%dz%10dz????-??-?? ??:??:??z%d-%02d-%02d %02d:%02d:%02drrrz-> zlink to )rrrnrrr+r)r,r*rrrrr'r(r localtimerr rrr rm)rverboserrr8r8r9ras8        z TarFile.listfiltercCsL|d|dur|}|jdurFtj||jkrF|dd|dS|d||||}|durz|dd|dS|dur||}|dur|dd|dS|rt|d}| ||Wdn1s0Ynb| r>| ||rHt t |D],}|j tj||tj||||dqn | |dS) Nrr$ztarfile: Skipped %rr#ztarfile: Unsupported type %rtarfile: Excluded %rrr)rrr|r%r_dbgrr raddfiler rlistdiraddr)rrr recursiverrfr8r8r9r s6    ,   z TarFile.addcCs|dt|}||j|j|j}|j||jt |7_|j }|durt ||j|j |dt |j t\}}|dkr|jtt||d7}|j|t7_|j|dS)Nr)rcrr#)rr)r6rSr6r7rr_rr2rr\r'r]rr3rr)rrrrXrcrdrer8r8r9rs   zTarFile.addfilecCsT|dur|j}|durtjd}|durz tt}WntyJYnV0ddl}|jddd}|| |Wdn1s0Y|jdddd}|rz t |}Wn$t yt d|d dYn0||_|St rtd ttStSt|tr td |St|r|Sz t |WSt yNt d|d dYn0dS) NZ PYTHON_TARFILE_EXTRACTION_FILTERr)#)Z interpolationZcomment_prefixesrr)fallbackzfilter z not foundaThe 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_filterr|environrRr_CONFIG_FILENAMEFileNotFoundError configparser ConfigParserZ read_file_NAMED_FILTERSrr0_RH_SAFER_DEFAULTwarningswarnRuntimeWarningrrrErH TypeErrorcallable)rrrfilerZconfr8r8r9_get_filter_functionsZ    (      zTarFile._get_filter_function.) numeric_ownerrc Csg}||}|dur|}|D]L}||||\}} |dur>q|rP|| |j||| ||dq|jdddd|D]0} zz|| |}WnBty} z*|| t| WYd} ~ WqWYd} ~ n d} ~ 00|dur|| dWqt j ||j } zt | } Wn&ty8||dYWqYn0t| jsX||dWq|j|| |d ||| ||| Wqty} z|| WYd} ~ qd} ~ 00qdS) N) set_attrsrfilter_functioncSs|jSrr$)rr8r8r9+ rz$TarFile.extractall..T)rreversezexcluded by filtermissingznot a directory)r)r_get_extract_tarinfor r _extract_onesort_FILTER_ERRORS_log_no_directory_fixupreprr|r%rrrrrrrchownutimechmodr _handle_nonfatal_error)rr%rrrZ directoriesr rr unfilteredexcdirpathrrr8r8r9 extractall sV   $    zTarFile.extractallcCs|dd|j|fdS)Nr$z(tarfile: Not fixing up directory %r (%s))rr)rrreasonr8r8r9r(M szTarFile._log_no_directory_fixuprc Cs8||}||||\}}|dur4|||||dSr)rr$r%) rrr%rrrr rr.r8r8r9extractQ s  zTarFile.extractc Cst|tr||}n|}d}z|||}Wn^ttfy^}z||WYd}~n6d}~0ty}z||WYd}~n d}~00|dur|dd|j dS| rt |}t j ||j|_||fS)Nr$r)NN)rErHrrr_handle_fatal_errorr r-rrr r)r|r%rrr!)rrr r%r.filteredrr8r8r9r$e s"    zTarFile._get_extract_tarinfoc Cs|dz&|j|tj||j||||dWnZty^}z||WYd}~n6d}~0ty}z| |WYd}~n d}~00dS)Nry)rrr extraction_root) r_extract_memberr|r%rrrr4r r-)rrr%rrr rr8r8r9r% s  zTarFile._extract_onecCs"|jdkrn|dd|dS)Nr# tarfile: %s)rrrrr8r8r9r- s zTarFile._handle_nonfatal_errorcCsn|jdkrn\t|trP|jdur6|dd|jqj|dd|j|jfn|ddt|j|fdS)Nrr#r8ztarfile: %s %rztarfile: %s %s)rrErfilenamerstrerrorrrpr9r8r8r9r4 s   zTarFile._handle_fatal_errorcCs|dt|tr ||}n|}|s6|jtvrB|||S|sR| rzt|j t rht dq~| ||SndSdS)Nryz'cannot extract (sym)link as file object)rrErHrr rrz fileobjectr rrrr extractfile_find_link_target)rrrr8r8r9r= s      zTarFile.extractfiler r6cCsZ|d}|dtj}tj|}|r>tj|s>t||sN| rh| dd|j |j fn| d|j | r|||n|r|||n~|r|||nh|s|r|||nJ|s| r|j||||dn&|jtvr|||n ||||rV||||| sV||||||dS)Nrr#z%s -> %sr?)rkrr|rr%rrmakedirsr rrrrr makefiler makedirrmakefiforrmakedevmakelink_with_filterrrz makeunknownr*r,r+)rr targetpathrrr r6Z upperdirsr8r8r9r7 s<       zTarFile._extract_membercCs>z&|jdurt|n t|dWnty8Yn0dS)Ni)rr|mkdirFileExistsErrorrrrGr8r8r9rB s    zTarFile.makedircCs|j}||j|j}t|dl}|jdurn|jD]"\}}||t|||t|q4||j| nt|||jt|Wdn1s0YdS)Nr) rrrrrrr\rr'truncate)rrrGsourcerctargetrr'r8r8r9rA s      zTarFile.makefilecCs"||||dd|jdS)Nr#z9tarfile: Unknown file type %r, extracted as regular file.)rArrrJr8r8r9rF s zTarFile.makeunknowncCs"ttdrt|ntddS)Nmkfifozfifo not supported by system)rr|rNr rJr8r8r9rC( s  zTarFile.makefifocCsjttdrttdstd|j}|dur.d}|rB|tjO}n |tjO}t||t |j |j dS)NmknodrDz'special devices not supported by systemr) rr|r rrrS_IFBLKS_IFCHRrOrDrr)rrrGrr8r8r9rD0 s  zTarFile.makedevcCs|||ddSr)rErJr8r8r9makelinkB szTarFile.makelinkc Cs(d}zX|r8tj|r$t|t|j|WdStj|jrZt |j|WdSWnt yrd}Yn0z| |}Wn"t y|rt dnYn0|dur|}nT|durt dz|||}Wn4ty}zt||j|WYd}~n d}~00|dur$|j||||ddS)NFTz%unable to resolve link inside archivez[makelink_with_filter: if filter_function is not None, extraction_root must also not be Noner?)rr|r%lexistsunlinksymlinkrrr!linksymlink_exceptionr>rr r'rrr7) rrrGr r6Zkeyerror_to_extracterrorr.r5causer8r8r9rEE sF       $ zTarFile.makelink_with_filtercCsttdrtdkr|j}|j}|sztrB|jrBt|jd}WntyVYn0zt rt|j rtt |j d}WntyYn0|durd}|durd}z4| rttdrt |||nt|||WntytdYn0dS)Ngeteuidrr$r;lchownzcould not change owner)rr|rYr*r)rr,getgrnamrrr+getpwnamrrZr*rr )rrrGrgur8r8r9r*w s0     z TarFile.chowncCs@|jdurdSzt||jWnty:tdYn0dS)Nzcould not change mode)rr|r,rr rJr8r8r9r, s   z TarFile.chmodcCsT|j}|durdSttds dSzt|||fWntyNtdYn0dS)Nr+z"could not change modification time)r(rr|r+rr )rrrGr(r8r8r9r+ s  z TarFile.utimec Csl|d|jdur$|j}d|_|S|j|jkrZ|j|jd|jdsZtdd}z|j |}WqJt y}zD|j r| dd|j|f|jt 7_WYd}~q^WYd}~qJd}~0tyD}z`|j r| dd|j|f|jt 7_WYd}~q^n|jdkr.tt|WYd}~qJd}~0tyj|jdkrftdYnty}z$|jdkrtt|WYd}~nd}~0ty}ztt|WYd}~nvd}~0tyB}zTz.ddl}t||jrtd|n|Wnty,|Yn0WYd}~n d}~00qJq^|durb|j|nd |_|S) NZrar#rZr$z0x%X: %srz empty filez zlib error: T)rrrrrrr^rrrtrurrrrKrHrsrtrv ExceptionrrErrrrr)rmrrrr8r8r9r~ sZ   " "       z TarFile.nextc Cs|}d}|durFz||}Wnty8d}Yn0|d|}|rVtj|}t|D]D}|rx|j|jkr^d}q^|rtj|j}n|j}||kr^|Sq^|rt|dS)NFT) rindexr0r|r%rreversedrr) rrr normalizerZskippingrar member_namer8r8r9r s,       zTarFile._getmembercCs|}|durqqd|_dSr)r~rrr8r8r9r sz TarFile._loadcCs:|jrtd|jj|dur6|j|vr6td|jdS)Nz %s is closedzbad operation for mode %r)rrrrpr)rrr8r8r9r! szTarFile._checkcCs`|r.dtdtj|j|jf}d}n |j}|}|j||dd}|dur\t d||S)NrT)rrczlinkname %r not found) rrrr|r%rrrrr)rrrlimitrr8r8r9r>* s  zTarFile._find_link_targetccs|jr|jEdHdSd}|jdur:|}|d7}|V|t|jkrT|j|}n"|jsr|}|svd|_dSndS|d7}|Vq:dS)Nrr#T)rrrr~r2)rrarr8r8r9__iter__= s$   zTarFile.__iter__cCs||jkrt|tjddS)Nr)rrmrkstderr)rlevelmsgr8r8r9r\ s z TarFile._dbgcCs ||Sr)rrr8r8r9 __enter__b szTarFile.__enter__cCs,|dur|n|js"|jd|_dSr)rrrr)rrr5 tracebackr8r8r9__exit__f s   zTarFile.__exit__) NryNNNNNNr0NNNN)ryN)ryNr)ryNr)ryNN)NNN)T)NT)N)rN)rT)N)TF)NF)N)?rprqrrrrrrrrSr r6r7rrrr<rrrrrrrrrrrrrrrrr rrr1r(r3r$r%r-r4r=r7rBrArFrCrDrRrEr*r,r+r~rrrr>rfrrkrmr8r8r8r9r|s oZ        c&3 5 E     82! ? ( rcCsFz,t|drt|d}nt|}|WdSty@YdS0dS)Nr^)rTF)rrrr)rrr8r8r9rt s   rc Cs`ddl}d}|j|d}|jdddddd |jd d td d |jdd}|jddddd|jdddddd|jdddddd|jdd dd!d|}|jr|jdur|d"d#|j durJ|j }t |r4t |d$*}| t | tjd%Wdn1s0Y|jrFt d&|n|d"d'|n|jdur|j}t |rt |d(}|j|jd)Wdn1s0Yn|d"d'|n|jdurt|jd"kr|jd}tj}n,t|jd*kr|j\}}n|d"|t |rt |d( }|j||jd+Wdn1sR0Y|jr|d,krzd-|} n d.||} t | n|d"d'|n|jdur\|jd} tj| \} } d/d/d0d0d1d1d1d1d2} | | vrd3| | nd4}|j}t | |&}|D]}||qWdn1s<0Y|jr\t d5| dS)6Nrz3A simple command-line interface for tarfile module.) descriptionz-vz --verbose store_trueFzVerbose output)actiondefaulthelpz--filterz zFilter for extraction)metavarchoicesrrT)requiredz-lz--list zShow listing of a tarfile)rsrrz-ez --extract+)rvz zExtract tarfile into target dir)nargsrsrrz-cz--create)zzzCreate tarfile from sourcesz-tz--testzTest if a tarfile is validr#z&--filter is only valid for extraction ryrgz{!r} is a tar archive.z{!r} is not a tar archive. r)rr$)r%rrz{!r} file is extracted.z+{!r} file is extracted into {!r} directory.rrr)rz.tgzz.xzz.txzz.bz2z.tbzz.tbz2z.tb2zw:rzz{!r} file created.)argparseArgumentParser add_argumentradd_mutually_exclusive_group parse_argsrr3exittestrrrrmrkrhrrSrrr2r|curdir format_helpr1Zcreatepopr%splitextr )ryrnparserrargsr`rZtfrrjZtar_namerextZ compressionsZtar_modeZ tar_files file_namer8r8r9main s           2  0    0      .r__main__)T)pversion __author__ __credits__builtinsrrrkr|rr[rrrVr)rerrrrAttributeErrorNotImplementedErrorrWr NameError__all__rrr3rrr>r9r;r:rPr"rhrrrSrTr-rZCONTTYPErAr@rirJrLrwr rrrrzrrlrrrFrIrrr getfilesystemencodingr:r?rNrTrYr\rnr_rr rrr r rsrtrurKrvrwrobjectrrBufferedReaderrrrrrrrrr'rrrrrr(compilerrrrrrpr8r8r8r9 s"          sh   D  _