def test_parse_cert(self, mock_popen): mock_popen.return_value = any_popen(b"any-cert") cert = CertParser.parse_cert("any-file-path") assert_popen_called_once_with(mock_popen, "keytool -printcert -file any-file-path") self.assertEqual("any-cert", cert)
def test_execute_dump_xmltree(self, mock_popen): mock_popen.return_value = any_popen(b"any-result") result = Aapt._execute_dump_xmltree("any-file-path") assert_popen_called_once(mock_popen) self.assertEqual("any-result", result)
def test_parse_fails_when_keytool_fails(self, mock_file_parser, mock_popen): mock_file_parser.return_value = any_file_parser(file=any_file()) mock_popen.return_value = any_popen(b"keytool error") with self.assertRaises(CertParsingError): self.sut.parse("any-file-path", "any-file-name") assert_popen_called_once_with(mock_popen, "keytool -printcert -file any-file-path")
def test_get_apk_info(self, mock_popen): dump_badging = b"package: name='com.example.app' versionCode='1' versionName='1.0' platformBuildVersionName='4'\n" \ b"sdkVersion:'10'\n" \ b"maxSdkVersion:'20'\n" \ b"targetSdkVersion:'15'" mock_popen.return_value = any_popen(dump_badging) apk = Aapt.get_apk_info("any-file-path") assert_popen_called_once(mock_popen) self.assertEqual( { "package_name": "com.example.app", "version": { "code": 1, "name": "1.0" }, "sdk": { "max": "20", "min": "10", "target": "15" } }, apk )
def test_get_app_name(self, mock_popen): mock_popen.return_value = any_popen(b"application: label='Example' icon='res/ic_launcher.png'\n") app_name = Aapt.get_app_name("any-file-path") assert_popen_called_once(mock_popen) self.assertEqual("Example", app_name)
def test_get_manifest_info(self, mock_popen): dump_xmltree = b"N: android=http://schemas.android.com/apk/res/android\n" \ b" E: manifest (line=2)\n" \ b" E: application (line=8)\n" \ b" E: activity (line=9)\n" \ b" A: android:name(0x01010003)=\"any-activity\" (Raw: \"any-activity\")\n" \ b" E: activity (line=15)\n" \ b" A: android:name(0x01010003)=\"any-other-activity\" (Raw: \"any-other-activity\")\n" \ b" E: service (line=25)\n" \ b" A: android:name(0x01010003)=\"any-service\" (Raw: \"any-service\")\n" \ b" E: service (line=26)\n" \ b" A: android:name(0x01010003)=\"any-other-service\" (Raw: \"any-other-service\")\n" \ b" E: receiver (line=28)\n" \ b" A: android:name(0x01010003)=\"any-receiver\" (Raw: \"any-receiver\")\n" \ b" E: receiver (line=29)\n" \ b" A: android:name(0x01010003)=\"any-other-receiver\" (Raw: \"any-other-receiver\")" mock_popen.return_value = any_popen(dump_xmltree) manifest = Aapt.get_manifest_info("any-file-path") assert_popen_called_once(mock_popen) self.assertEqual( { "activities": ["any-activity", "any-other-activity"], "services": ["any-service", "any-other-service"], "receivers": ["any-receiver", "any-other-receiver"] }, manifest)
def test_get_apk_info_with_invalid_version_code(self, mock_popen): mock_popen.return_value = any_popen(b"package: name='com.example.app' versionCode='A' versionName='1.0'\n") apk = Aapt.get_apk_info("any-file-path") assert_popen_called_once(mock_popen) self.assertEqual( { "code": "", # NOTE: None is converted into an empty string "name": "1.0" }, apk["version"] )
def test_parse_strings(self, mock_popen): mock_popen.return_value = any_popen( b"1-any-string\n2-any-other-string\n0-yet-another-string") strings = DexParser.parse_strings("any-file-path") assert_popen_called_once_with(mock_popen, "strings any-file-path") # NOTE: the strings are returned alphabetically ordered self.assertEqual([ "0-yet-another-string", "1-any-string", "2-any-other-string", ], strings)
def test_get_app_permissions(self, mock_popen): dump_permissions = b"package: com.example.app\n" \ b"uses-permission: name='android.permission.READ_EXTERNAL_STORAGE'\n" \ b"uses-permission: name='android.permission.RECEIVE_BOOT_COMPLETED'\n" \ b"uses-permission: name='android.permission.WRITE_EXTERNAL_STORAGE'\n" \ b"uses-permission: name='android.permission.INTERNET'" mock_popen.return_value = any_popen(dump_permissions) permissions = Aapt.get_app_permissions("any-file-path") assert_popen_called_once(mock_popen) self.assertEqual([ "android.permission.INTERNET", "android.permission.READ_EXTERNAL_STORAGE", "android.permission.RECEIVE_BOOT_COMPLETED", "android.permission.WRITE_EXTERNAL_STORAGE" ], permissions)
def test_parse(self, mock_file_parser, mock_popen, mock_uri_signature, mock_shell_signature): file = any_file() mock_parser_instance = any_file_parser(file=file) mock_file_parser.return_value = mock_parser_instance mock_popen.return_value = any_popen( b"any-string\nany-url\nany-command") mock_uri_signature.return_value = self.any_signature( matches=[(None, False), ("any-url", True), (None, False)]) mock_shell_signature.return_value = self.any_signature( matches=[(None, False), (None, False), ("any-command", True)]) dex = DexParser().parse("any-file-path", "any-file-name") assert_file_parser_called_once_with(mock_parser_instance, filepath="any-file-path", filename="any-file-name") assert_popen_called_once_with(mock_popen, "strings any-file-path") assert_file_equal(self, expected=file, actual=dex) self.assertEqual(["any-command", "any-string", "any-url"], dex.get_strings()) self.assertEqual(["any-url"], dex.get_urls()) self.assertEqual(["any-command"], dex.get_shell_commands()) self.assertEqual([], dex.get_custom_signatures())
def test_init(self, mock_file_parser, mock_get_localzone, mock_popen): file = any_file() mock_parser_instance = any_file_parser(file=file) mock_file_parser.return_value = mock_parser_instance mock_popen.return_value = any_popen( response=b"Owner: CN=OwnerName, OU=OwnerUnit, O=OwnerOrganization, L=OwnerCity, ST=OwnerState, C=OwnerCountry\n" \ b"Issuer: CN=IssuerName, OU=IssuerUnit, O=IssuerOrganization, L=IssuerCity, ST=IssuerState, C=IssuerCountry\n" \ b"Serial number: 558e7595\n" \ b"Valid from: Sat Jun 27 12:06:13 CEST 2015 until: Tue Feb 26 11:06:13 CET 2515\n" \ b"Certificate fingerprints:\n" \ b"\t MD5: 90:22:EF:0C:DB:C3:78:87:7B:C3:A3:6C:5A:68:E6:45\n" \ b"\t SHA1: 5A:C0:6C:32:63:7F:5D:BE:CA:F9:38:38:4C:FA:FF:ED:20:52:43:B6\n" \ b"\t SHA256: E5:15:CC:BC:5E:BF:B2:9D:A6:13:03:63:CF:19:33:FA:CE:AF:DC:ED:5D:2F:F5:98:7C:CE:37:13:64:4A:CF:77\n" \ b"Signature algorithm name: SHA1withRSA\n" \ b"Subject Public Key Algorithm: 1024-bit RSA key\n" \ b"Version: 3" ) mock_get_localzone.return_value.localize.side_effect = ValueError() cert = self.sut.parse("any-file-path", "any-file-name") assert_file_parser_called_once_with(mock_parser_instance, filepath="any-file-path", filename="any-file-name") assert_popen_called_once_with(mock_popen, "keytool -printcert -file any-file-path") assert_file_equal(self, expected=file, actual=cert) self.assertEqual("558e7595", cert.get_serial_number()) self.assertEqual( CertValidity(valid_from="Sat Jun 27 12:06:13 CEST 2015", valid_to="Tue Feb 26 11:06:13 CET 2515"), cert.get_validity() ) self.assertEqual( CertFingerprint( md5="90:22:EF:0C:DB:C3:78:87:7B:C3:A3:6C:5A:68:E6:45", sha1="5A:C0:6C:32:63:7F:5D:BE:CA:F9:38:38:4C:FA:FF:ED:20:52:43:B6", sha256="E5:15:CC:BC:5E:BF:B2:9D:A6:13:03:63:CF:19:33:FA:CE:AF:DC:ED:5D:2F:F5:98:7C:CE:37:13:64:4A:CF:77", signature="SHA1withRSA", version="3" ), cert.get_fingerprint() ) self.assertEqual( CertParticipant( name="OwnerName", email="", unit="OwnerUnit", organization="OwnerOrganization", city="OwnerCity", state="OwnerState", country="OwnerCountry", domain="" ), cert.get_owner() ) self.assertEqual( CertParticipant( name="IssuerName", email="", unit="IssuerUnit", organization="IssuerOrganization", city="IssuerCity", state="IssuerState", country="IssuerCountry", domain="" ), cert.get_issuer() )