def add_filter(info: tarfile.TarInfo) -> Optional[tarfile.TarInfo]: """Filter files targeted to be added to tarfile. Args: info: Information on the file targeted to be added Returns: None: if file is not to be added TarInfo: when file is to be added. Modified as needed. Notes: exclude is captured from parent """ if not (info.isfile() or info.isdir() or info.issym()): return None if _exclude_matcher(info.name, exclude): return None # Workaround https://bugs.python.org/issue32713. Fixed in Python 3.7 if info.mtime < 0 or info.mtime > 8 ** 11 - 1: info.mtime = int(info.mtime) # do not leak client information to service info.uid = 0 info.uname = info.gname = "root" if sys.platform == "win32": info.mode = info.mode & 0o755 | 0o111 return info
def filter(self, tarinfo: tarfile.TarInfo): if not tarinfo.isfile(): return tarinfo for regex in self.regexes: if regex.search(tarinfo.name) is not None: logger.debug(f"Excluding file {tarinfo.name}") return None logger.debug(f"Adding file to tarball: {tarinfo.name}") return tarinfo
def _tar_info_to_zip_info(tar_info: TarInfo, file_name) -> ZipInfo: modified_time = time.gmtime(tar_info.mtime) zip_info = ZipInfo(filename=file_name, date_time=(modified_time.tm_year, modified_time.tm_mon, modified_time.tm_mday, modified_time.tm_hour, modified_time.tm_min, modified_time.tm_sec)) if tar_info.isfile(): zip_info.external_attr = tar_info.mode << 16 else: raise ValueError return zip_info
def _member_is_safe(member: tarfile.TarInfo) -> bool: if member.isfile(): return getattr(member, 'sparse', None) is None return member.isdir() or member.issym() or member.islnk()
def my_filter(tarinfo: tarfile.TarInfo): if tarinfo.isfile() or tarinfo.isdir(): # only handle basic file types for now return tarinfo else: return None
def _member_is_safe(member: tarfile.TarInfo) -> bool: return ( member.isfile() or member.isdir() or member.issym() or member.islnk() )