From b7d84aee6c0a99b452c12f005c02beef32762b1d Mon Sep 17 00:00:00 2001 From: JabLuszko Date: Fri, 20 Sep 2024 01:53:18 +0200 Subject: [PATCH 01/10] Update wizard.py --- mapadroid/mad_apk/wizard.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/mapadroid/mad_apk/wizard.py b/mapadroid/mad_apk/wizard.py index 22ecc48cc..d2cbad1d7 100644 --- a/mapadroid/mad_apk/wizard.py +++ b/mapadroid/mad_apk/wizard.py @@ -13,6 +13,7 @@ from apksearch.entities import PackageBase, PackageVariant from apksearch.search import HEADERS from apkutils.apkfile import BadZipFile, LargeZipFile +from bs4 import BeautifulSoup from loguru import logger from mapadroid.utils import global_variables @@ -537,12 +538,13 @@ def normalize_package(self) -> NoReturn: apk = apkutils.APK().from_io(bytes_of_apk).parse_resource() manifest = apk.get_manifest() try: - self.package_version = manifest['@android:versionName'] - self.package_name = manifest['@package'] + soup = BeautifulSoup(manifest, 'lxml-xml') + self.package_version = soup.manifest['android:versionName'] + self.package_name = soup.manifest['package'] except KeyError: pass try: - filename = manifest['@split'] + filename = soup.manifest['@split'] if filename[-3:] == 'dpi': continue except KeyError: From e9098d710867d13fff6aaf967d35b88fb69be1ff Mon Sep 17 00:00:00 2001 From: JabLuszko Date: Fri, 20 Sep 2024 02:03:05 +0200 Subject: [PATCH 02/10] Update MadApkEndpoint.py --- mapadroid/madmin/endpoints/api/apks/MadApkEndpoint.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/mapadroid/madmin/endpoints/api/apks/MadApkEndpoint.py b/mapadroid/madmin/endpoints/api/apks/MadApkEndpoint.py index 75d89d6e4..2e196e968 100644 --- a/mapadroid/madmin/endpoints/api/apks/MadApkEndpoint.py +++ b/mapadroid/madmin/endpoints/api/apks/MadApkEndpoint.py @@ -39,6 +39,10 @@ async def get(self): except KeyError: return await self._json_response(data=data[apk_type]) + def allowed_file(filename): + ALLOWED_EXTENSIONS = set(['apk', 'apkm', 'zip']) + return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS + async def post(self): apk_type_raw: str = self.request.match_info.get('apk_type') apk_arch_raw: str = self.request.match_info.get('apk_arch') @@ -58,7 +62,7 @@ async def post(self): elif not file.filename: await self._add_notice_message('No file selected for uploading') raise web.HTTPFound(self._url_for("upload")) - elif not allowed_file(file.filename): + elif not self.allowed_file(file.filename): await self._add_notice_message('Allowed file type is apk only!') raise web.HTTPFound(self._url_for("upload")) filename = secure_filename(file.filename) From 4119ae8b73963fa904ffd0543e3fe0be6b86f208 Mon Sep 17 00:00:00 2001 From: JabLuszko Date: Fri, 20 Sep 2024 02:03:17 +0200 Subject: [PATCH 03/10] Update MadApkEndpoint.py --- mapadroid/madmin/endpoints/api/apks/MadApkEndpoint.py | 1 - 1 file changed, 1 deletion(-) diff --git a/mapadroid/madmin/endpoints/api/apks/MadApkEndpoint.py b/mapadroid/madmin/endpoints/api/apks/MadApkEndpoint.py index 2e196e968..e85ef061e 100644 --- a/mapadroid/madmin/endpoints/api/apks/MadApkEndpoint.py +++ b/mapadroid/madmin/endpoints/api/apks/MadApkEndpoint.py @@ -13,7 +13,6 @@ from mapadroid.mad_apk.wizard import APKWizard, PackageImporter, WizardError from mapadroid.madmin.AbstractMadminRootEndpoint import ( AbstractMadminRootEndpoint, check_authorization_header) -from mapadroid.madmin.functions import allowed_file from mapadroid.utils.apk_enums import APKArch, APKType from mapadroid.utils.custom_types import MADapks From ffb1b46c1d58b3b4d669b5029a661e88b574151d Mon Sep 17 00:00:00 2001 From: JabLuszko Date: Fri, 20 Sep 2024 02:03:39 +0200 Subject: [PATCH 04/10] Update MadApkEndpoint.py --- mapadroid/madmin/endpoints/api/apks/MadApkEndpoint.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mapadroid/madmin/endpoints/api/apks/MadApkEndpoint.py b/mapadroid/madmin/endpoints/api/apks/MadApkEndpoint.py index e85ef061e..9740d5f1b 100644 --- a/mapadroid/madmin/endpoints/api/apks/MadApkEndpoint.py +++ b/mapadroid/madmin/endpoints/api/apks/MadApkEndpoint.py @@ -38,7 +38,7 @@ async def get(self): except KeyError: return await self._json_response(data=data[apk_type]) - def allowed_file(filename): + def allowed_file(self, filename): ALLOWED_EXTENSIONS = set(['apk', 'apkm', 'zip']) return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS From dc39ec9a3d0cfc0209b189b6ce022cba85825937 Mon Sep 17 00:00:00 2001 From: JabLuszko Date: Fri, 20 Sep 2024 17:43:29 +0200 Subject: [PATCH 05/10] apks -> apkm Fix even more checks (?) --- mapadroid/madmin/endpoints/api/apks/MadApkEndpoint.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mapadroid/madmin/endpoints/api/apks/MadApkEndpoint.py b/mapadroid/madmin/endpoints/api/apks/MadApkEndpoint.py index 9740d5f1b..e44702b68 100644 --- a/mapadroid/madmin/endpoints/api/apks/MadApkEndpoint.py +++ b/mapadroid/madmin/endpoints/api/apks/MadApkEndpoint.py @@ -121,7 +121,7 @@ async def handle_file_upload(self, apk: io.BytesIO, apk_arch: Optional[APKArch], except KeyError: return web.Response(text="Non-supported Type / Architecture", status=406) filename_split = filename.rsplit('.', 1) - if filename_split[1] in ['zip', 'apks']: + if filename_split[1] in ['zip', 'apkm']: mimetype = 'application/zip' elif filename_split[1] == 'apk': mimetype = 'application/vnd.android.package-archive' From 3ddf47bd2d99f3a5f16e1c2cec61c1034866ae3b Mon Sep 17 00:00:00 2001 From: JabLuszko Date: Sun, 22 Sep 2024 01:16:26 +0200 Subject: [PATCH 06/10] Update MadApkInfoEndpoint.py --- mapadroid/mitm_receiver/endpoints/mad_apk/MadApkInfoEndpoint.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mapadroid/mitm_receiver/endpoints/mad_apk/MadApkInfoEndpoint.py b/mapadroid/mitm_receiver/endpoints/mad_apk/MadApkInfoEndpoint.py index f381ea5d2..aa88c92b7 100644 --- a/mapadroid/mitm_receiver/endpoints/mad_apk/MadApkInfoEndpoint.py +++ b/mapadroid/mitm_receiver/endpoints/mad_apk/MadApkInfoEndpoint.py @@ -20,6 +20,8 @@ class MadApkInfoEndpoint(AbstractMitmReceiverRootEndpoint): # TODO: Auth/preprocessing for autoconfig? async def get(self): + logger.warning("Device {} checking package {} (arch: {}) version", self.request.headers["origin"], + self.request.match_info.get('apk_type'), self.request.match_info.get('apk_arch')) parsed = self._parse_frontend() if type(parsed) == web.Response: return parsed From 51e677bc1cba3015b819391e24fc77c21d24fcae Mon Sep 17 00:00:00 2001 From: JabLuszko Date: Sun, 22 Sep 2024 01:16:57 +0200 Subject: [PATCH 07/10] Update MadApkInfoEndpoint.py --- mapadroid/mitm_receiver/endpoints/mad_apk/MadApkInfoEndpoint.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mapadroid/mitm_receiver/endpoints/mad_apk/MadApkInfoEndpoint.py b/mapadroid/mitm_receiver/endpoints/mad_apk/MadApkInfoEndpoint.py index aa88c92b7..adce47fc6 100644 --- a/mapadroid/mitm_receiver/endpoints/mad_apk/MadApkInfoEndpoint.py +++ b/mapadroid/mitm_receiver/endpoints/mad_apk/MadApkInfoEndpoint.py @@ -20,7 +20,7 @@ class MadApkInfoEndpoint(AbstractMitmReceiverRootEndpoint): # TODO: Auth/preprocessing for autoconfig? async def get(self): - logger.warning("Device {} checking package {} (arch: {}) version", self.request.headers["origin"], + logger.info("Device {} checking package {} (arch: {}) version", self.request.headers["origin"], self.request.match_info.get('apk_type'), self.request.match_info.get('apk_arch')) parsed = self._parse_frontend() if type(parsed) == web.Response: From 7e7616651fc712a631025aa12828c81766b3f2cf Mon Sep 17 00:00:00 2001 From: JabLuszko Date: Sun, 22 Sep 2024 01:18:04 +0200 Subject: [PATCH 08/10] Update MadApkDownloadEndpoint.py --- .../mitm_receiver/endpoints/mad_apk/MadApkDownloadEndpoint.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/mapadroid/mitm_receiver/endpoints/mad_apk/MadApkDownloadEndpoint.py b/mapadroid/mitm_receiver/endpoints/mad_apk/MadApkDownloadEndpoint.py index 8cfdcbb68..a555a1509 100644 --- a/mapadroid/mitm_receiver/endpoints/mad_apk/MadApkDownloadEndpoint.py +++ b/mapadroid/mitm_receiver/endpoints/mad_apk/MadApkDownloadEndpoint.py @@ -16,6 +16,8 @@ class MadApkDownloadEndpoint(AbstractMitmReceiverRootEndpoint): # TODO: Auth/preprocessing for autoconfig? async def head(self): + logger.info("Device {} checking package {} (arch: {}) content-type", self.request.headers["origin"], + self.request.match_info.get('apk_type'), self.request.match_info.get('apk_arch')) data_generator, response = await self.__handle_download_request() return response @@ -26,6 +28,8 @@ async def get(self): return response async def __handle_download_request(self): + logger.info("Device {} downloading package {} (arch: {}) content-type", self.request.headers["origin"], + self.request.match_info.get('apk_type'), self.request.match_info.get('apk_arch')) parsed = self._parse_frontend() apk_type, apk_arch = parsed response = web.StreamResponse() From 8f8a356330bb4999bed014c960e8954f4ce603f3 Mon Sep 17 00:00:00 2001 From: JabLuszko Date: Sun, 22 Sep 2024 01:22:47 +0200 Subject: [PATCH 09/10] Update MadApkInfoEndpoint.py --- mapadroid/mitm_receiver/endpoints/mad_apk/MadApkInfoEndpoint.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mapadroid/mitm_receiver/endpoints/mad_apk/MadApkInfoEndpoint.py b/mapadroid/mitm_receiver/endpoints/mad_apk/MadApkInfoEndpoint.py index adce47fc6..e6d00ebdf 100644 --- a/mapadroid/mitm_receiver/endpoints/mad_apk/MadApkInfoEndpoint.py +++ b/mapadroid/mitm_receiver/endpoints/mad_apk/MadApkInfoEndpoint.py @@ -2,6 +2,8 @@ from aiohttp import web +from loguru import logger + from mapadroid.mad_apk.utils import lookup_package_info, supported_pogo_version from mapadroid.mitm_receiver.endpoints.AbstractMitmReceiverRootEndpoint import \ AbstractMitmReceiverRootEndpoint From 82d67a31b1c005371335910864b1235e0d53e120 Mon Sep 17 00:00:00 2001 From: JabLuszko Date: Sun, 22 Sep 2024 01:23:41 +0200 Subject: [PATCH 10/10] Update MadApkDownloadEndpoint.py --- .../endpoints/mad_apk/MadApkDownloadEndpoint.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/mapadroid/mitm_receiver/endpoints/mad_apk/MadApkDownloadEndpoint.py b/mapadroid/mitm_receiver/endpoints/mad_apk/MadApkDownloadEndpoint.py index a555a1509..4622e01a5 100644 --- a/mapadroid/mitm_receiver/endpoints/mad_apk/MadApkDownloadEndpoint.py +++ b/mapadroid/mitm_receiver/endpoints/mad_apk/MadApkDownloadEndpoint.py @@ -2,6 +2,8 @@ from aiohttp import web +from loguru import logger + from mapadroid.mad_apk.utils import stream_package from mapadroid.mitm_receiver.endpoints.AbstractMitmReceiverRootEndpoint import AbstractMitmReceiverRootEndpoint @@ -16,20 +18,18 @@ class MadApkDownloadEndpoint(AbstractMitmReceiverRootEndpoint): # TODO: Auth/preprocessing for autoconfig? async def head(self): - logger.info("Device {} checking package {} (arch: {}) content-type", self.request.headers["origin"], - self.request.match_info.get('apk_type'), self.request.match_info.get('apk_arch')) data_generator, response = await self.__handle_download_request() return response async def get(self): + logger.info("Device {} downloading package {} (arch: {})", self.request.headers["origin"], + self.request.match_info.get('apk_type'), self.request.match_info.get('apk_arch')) data_generator, response = await self.__handle_download_request() async for data in data_generator: await response.write(data) return response async def __handle_download_request(self): - logger.info("Device {} downloading package {} (arch: {}) content-type", self.request.headers["origin"], - self.request.match_info.get('apk_type'), self.request.match_info.get('apk_arch')) parsed = self._parse_frontend() apk_type, apk_arch = parsed response = web.StreamResponse()