Skip to content

Commit

Permalink
Write meta.plist separately in case the downloaded file is not a zip …
Browse files Browse the repository at this point in the history
…file (e.g. "macOS" IPA files)
  • Loading branch information
davipt authored and NyaMisty committed Feb 8, 2024
1 parent 66367dc commit ecf2e0a
Showing 1 changed file with 56 additions and 47 deletions.
103 changes: 56 additions & 47 deletions main.py
Original file line number Diff line number Diff line change
Expand Up @@ -485,54 +485,63 @@ def downloadOne(self, args):
filepath = os.path.join(args.output_dir, filename)
logger.info("Downloading ipa to %s" % filepath)
downloadFile(downInfo.URL, filepath)
with zipfile.ZipFile(filepath, 'a') as ipaFile:
logger.info("Writing out iTunesMetadata.plist...")
metadata = downInfo.metadata.as_dict()
if appleid:
metadata["apple-id"] = appleid
metadata["userName"] = appleid
logger.debug("Writing iTunesMetadata.plist")
ipaFile.writestr(zipfile.ZipInfo("iTunesMetadata.plist", get_zipinfo_datetime()), plistlib.dumps(metadata))
logger.debug("Writing IPAToolInfo.plist")
ipaFile.writestr(zipfile.ZipInfo("IPAToolInfo.plist", get_zipinfo_datetime()), plistlib.dumps(downResp.as_dict()))

def findAppContentPath(c):
if not c.startswith('Payload/'):
return False
pathparts = c.strip('/').split('/')
if len(pathparts) != 2:
return False
if not pathparts[1].endswith(".app"):
return False
return True
appContentDirChoices = [c for c in ipaFile.namelist() if findAppContentPath(c)]
if len(appContentDirChoices) != 1:
raise Exception("failed to find appContentDir, choices %s", appContentDirChoices)
appContentDir = appContentDirChoices[0].rstrip('/')

processedSinf = False
if (appContentDir + '/SC_Info/Manifest.plist') in ipaFile.namelist():
#Try to get the Manifest.plist file, since it doesn't always exist.
scManifestData = ipaFile.read(appContentDir + '/SC_Info/Manifest.plist')
logger.debug("Got SC_Info/Manifest.plist: %s", scManifestData)
scManifest = plistlib.loads(scManifestData)
sinfs = {c.id: c.sinf for c in downInfo.sinfs}
if 'SinfPaths' in scManifest:
for i, sinfPath in enumerate(scManifest['SinfPaths']):
logger.debug("Writing sinf to %s", sinfPath)
ipaFile.writestr(appContentDir + '/' + sinfPath, sinfs[i])
metadata = downInfo.metadata.as_dict()
if appleid:
metadata["apple-id"] = appleid
metadata["userName"] = appleid
logger.info("Writing out iTunesMetadata.plist...")
if zipfile.is_zipfile(filepath):
with zipfile.ZipFile(filepath, 'a') as ipaFile:
logger.debug("Writing iTunesMetadata.plist")
ipaFile.writestr(zipfile.ZipInfo("iTunesMetadata.plist", get_zipinfo_datetime()), plistlib.dumps(metadata))
logger.debug("Writing IPAToolInfo.plist")
ipaFile.writestr(zipfile.ZipInfo("IPAToolInfo.plist", get_zipinfo_datetime()), plistlib.dumps(downResp.as_dict()))

def findAppContentPath(c):
if not c.startswith('Payload/'):
return False
pathparts = c.strip('/').split('/')
if len(pathparts) != 2:
return False
if not pathparts[1].endswith(".app"):
return False
return True
appContentDirChoices = [c for c in ipaFile.namelist() if findAppContentPath(c)]
if len(appContentDirChoices) != 1:
raise Exception("failed to find appContentDir, choices %s", appContentDirChoices)
appContentDir = appContentDirChoices[0].rstrip('/')

processedSinf = False
if (appContentDir + '/SC_Info/Manifest.plist') in ipaFile.namelist():
#Try to get the Manifest.plist file, since it doesn't always exist.
scManifestData = ipaFile.read(appContentDir + '/SC_Info/Manifest.plist')
logger.debug("Got SC_Info/Manifest.plist: %s", scManifestData)
scManifest = plistlib.loads(scManifestData)
sinfs = {c.id: c.sinf for c in downInfo.sinfs}
if 'SinfPaths' in scManifest:
for i, sinfPath in enumerate(scManifest['SinfPaths']):
logger.debug("Writing sinf to %s", sinfPath)
ipaFile.writestr(appContentDir + '/' + sinfPath, sinfs[i])
processedSinf = True
if not processedSinf:
logger.info('Manifest.plist does not exist! Assuming it is an old app without one...')
infoListData = ipaFile.read(appContentDir + '/Info.plist') #Is this not loaded anywhere yet?
infoList = plistlib.loads(infoListData)
sinfPath = appContentDir + '/SC_Info/'+infoList['CFBundleExecutable']+".sinf"
logger.debug("Writing sinf to %s", sinfPath)
#Assuming there is only one .sinf file, hence the 0
ipaFile.writestr(sinfPath, downInfo.sinfs[0].sinf)
processedSinf = True
if not processedSinf:
logger.info('Manifest.plist does not exist! Assuming it is an old app without one...')
infoListData = ipaFile.read(appContentDir + '/Info.plist') #Is this not loaded anywhere yet?
infoList = plistlib.loads(infoListData)
sinfPath = appContentDir + '/SC_Info/'+infoList['CFBundleExecutable']+".sinf"
logger.debug("Writing sinf to %s", sinfPath)
#Assuming there is only one .sinf file, hence the 0
ipaFile.writestr(sinfPath, downInfo.sinfs[0].sinf)
processedSinf = True

logger.info("Downloaded ipa to %s" % filename)

logger.info("Downloaded ipa to %s" % filename)
else:
plist = filepath[:-4]+".info.plist"
with open(plist, "wb") as f:
f.write(plistlib.dumps(downResp.as_dict()))
plist = filepath[:-4]+".plist"
with open(plist, "wb") as f:
f.write(plistlib.dumps(metadata))
logger.info("Downloaded ipa to %s and plist to %s" % (filename, plist))

self._outputJson({
"appName": appName,
Expand Down

0 comments on commit ecf2e0a

Please sign in to comment.