Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
def setUp(self):
file_path = os.path.abspath(os.path.join(
os.path.dirname(__file__), "..", 'data', 'test'))
with zipfile.ZipFile(file_path, mode="r") as zf:
data = zf.read('resources.arsc')
self.arscobj = ARSCParser(data)
self.package = self.arscobj.get_packages_names()[0]
if not args or args[0] not in ('-l', '-c', '-e', '-t'):
print(USAGE)
sys.exit(1)
if args[0] == '-l':
if len(args) != 2:
print(USAGE)
sys.exit(1)
with ZipFile(args[1], 'r') as zf:
zf.printdir()
elif args[0] == '-t':
if len(args) != 2:
print(USAGE)
sys.exit(1)
with ZipFile(args[1], 'r') as zf:
badfile = zf.testzip()
if badfile:
print(
"The following enclosed file is corrupted: {!r}".format(badfile))
print("Done testing")
elif args[0] == '-e':
if len(args) != 3:
print(USAGE)
sys.exit(1)
with ZipFile(args[1], 'r') as zf:
zf.extractall(args[2])
elif args[0] == '-c':
if len(args) < 3:
if len(args) != 2:
print(USAGE)
sys.exit(1)
with ZipFile(args[1], 'r') as zf:
badfile = zf.testzip()
if badfile:
print(
"The following enclosed file is corrupted: {!r}".format(badfile))
print("Done testing")
elif args[0] == '-e':
if len(args) != 3:
print(USAGE)
sys.exit(1)
with ZipFile(args[1], 'r') as zf:
zf.extractall(args[2])
elif args[0] == '-c':
if len(args) < 3:
print(USAGE)
sys.exit(1)
def addToZip(zf, path, zippath):
if os.path.isfile(path):
zf.write(path, zippath, ZIP_DEFLATED)
elif os.path.isdir(path):
if zippath:
zf.write(path, zippath)
for nm in os.listdir(path):
addToZip(zf,
os.path.join(path, nm), os.path.join(zippath, nm))
zipfile.py -t zipfile.zip # Test if a zipfile is valid
zipfile.py -e zipfile.zip target # Extract zipfile into target dir
zipfile.py -c zipfile.zip src ... # Create zipfile from sources
""")
if args is None:
args = sys.argv[1:]
if not args or args[0] not in ('-l', '-c', '-e', '-t'):
print(USAGE)
sys.exit(1)
if args[0] == '-l':
if len(args) != 2:
print(USAGE)
sys.exit(1)
with ZipFile(args[1], 'r') as zf:
zf.printdir()
elif args[0] == '-t':
if len(args) != 2:
print(USAGE)
sys.exit(1)
with ZipFile(args[1], 'r') as zf:
badfile = zf.testzip()
if badfile:
print(
"The following enclosed file is corrupted: {!r}".format(badfile))
print("Done testing")
elif args[0] == '-e':
if len(args) != 3:
print(USAGE)
if len(args) < 3:
print(USAGE)
sys.exit(1)
def addToZip(zf, path, zippath):
if os.path.isfile(path):
zf.write(path, zippath, ZIP_DEFLATED)
elif os.path.isdir(path):
if zippath:
zf.write(path, zippath)
for nm in os.listdir(path):
addToZip(zf,
os.path.join(path, nm), os.path.join(zippath, nm))
# else: ignore
with ZipFile(args[1], 'w') as zf:
for path in args[2:]:
zippath = os.path.basename(path)
if not zippath:
zippath = os.path.basename(os.path.dirname(path))
if zippath in ('', os.curdir, os.pardir):
zippath = ''
addToZip(zf, path, zippath)
def normalize_package(self) -> NoReturn:
""" Normalize the package
Validate that only valid APK files are present within the package and have the correct extension. Exclude the
DPI APK as it is not relevant to the installation
"""
pruned_zip = io.BytesIO()
zout = zipfile.ZipFile(pruned_zip, 'w')
with zipfile.ZipFile(self._data) as zip_data:
for item in zip_data.infolist():
try:
with zip_data.open(item, 'r') as fh:
apk = apkutils.APK(io.BytesIO(fh.read()))
manifest = apk.get_manifest()
try:
self.package_version = manifest['@android:versionName']
self.package_name = manifest['@package']
except KeyError:
pass
try:
filename = manifest['@split']
if filename[-3:] == 'dpi':
continue
except KeyError:
filename = item.filename
else:
try:
# The architectures use dash but we are required to use underscores
self.package_arch = lookup_arch_enum(filename.rsplit('.', 1)[1].replace('-', '_'))
elems[apk_type][apk_arch]
except KeyError:
return ('Non-supported Type / Architecture', 406)
filename_split = filename.rsplit('.', 1)
if filename_split[1] in ['zip', 'apks']:
mimetype = 'application/zip'
elif filename_split[1] == 'apk':
mimetype = 'application/vnd.android.package-archive'
else:
return ('Unsupported extension', 406)
try:
PackageImporter(apk_type, apk_arch, self.storage_obj, apk, mimetype)
if 'multipart/form-data' in self.api_req.content_type:
return flask.redirect(None, code=201)
return (None, 201)
except (BadZipFile, LargeZipFile) as err:
return (str(err), 406)
except WizardError as err:
self._logger.warning(err)
return (str(err), 406)
except Exception:
self._logger.opt(exception=True).critical("An unhanded exception occurred!")
return (None, 500)
else:
try:
call = self.api_req.data['call']
wizard = APKWizard(self.dbc, self.storage_obj)
if call == 'import':
thread_args = (apk_type, apk_arch)
t = Thread(name='PackageWizard',
target=wizard.apk_download,
args=thread_args)
try:
filename = manifest['@split']
if filename[-3:] == 'dpi':
continue
except KeyError:
filename = item.filename
else:
try:
# The architectures use dash but we are required to use underscores
self.package_arch = lookup_arch_enum(filename.rsplit('.', 1)[1].replace('-', '_'))
except (IndexError, KeyError, ValueError):
pass
if filename[-3:] != 'apk':
filename += '.apk'
zout.writestr(filename, zip_data.read(item.filename))
except (BadZipFile, LargeZipFile):
continue
zout.close()
if not self.package_version:
raise InvalidFile('Unable to extract information from file')
self._data = pruned_zip
def _init_app_icon(self):
files = self.get_files()
result = re.search(r':icon="@(.*?)"', self.get_org_manifest())
ids = '0x' + result.groups()[0].lower()
try:
with apkfile.ZipFile(self.apk_path, 'r') as z:
data = z.read('resources.arsc')
self.arscobj = ARSCParser(data)
self.package = self.arscobj.get_packages_names()[0]
datas = xmltodict.parse(
self.arscobj.get_public_resources(self.package))
for item in datas['resources']['public']:
if ids != item['@id']:
continue
for f in files:
name = f['name']
if item['@type'] in name and item['@name'] in name:
self.app_icon = name
except Exception as ex:
raise ex
endrec = struct.pack(structEndArchive, stringEndArchive,
0, 0, centDirCount, centDirCount,
centDirSize, centDirOffset, len(self._comment))
self.fp.write(endrec)
self.fp.write(self._comment)
self.fp.flush()
def _fpclose(self, fp):
assert self._fileRefCnt > 0
self._fileRefCnt -= 1
if not self._fileRefCnt and not self._filePassed:
fp.close()
class PyZipFile(ZipFile):
"""Class to create ZIP archives with Python library files and packages."""
def __init__(self, file, mode="r", compression=ZIP_STORED,
allowZip64=True, optimize=-1):
ZipFile.__init__(self, file, mode=mode, compression=compression,
allowZip64=allowZip64)
self._optimize = optimize
def writepy(self, pathname, basename="", filterfunc=None):
"""Add all files from "pathname" to the ZIP archive.
If pathname is a package directory, search the directory and
all package subdirectories recursively for all *.py and enter
the modules into the archive. If pathname is a plain
directory, listdir *.py and enter all modules. Else, pathname
must be a Python *.py file and the module will be put into the