コード例 #1
0
    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)
コード例 #2
0
    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)
コード例 #3
0
    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")
コード例 #4
0
    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
        )
コード例 #5
0
    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)
コード例 #6
0
    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)
コード例 #7
0
    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"]
        )
コード例 #8
0
    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)
コード例 #9
0
    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)
コード例 #10
0
    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())
コード例 #11
0
    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()
        )