From 2c77dcadb5343d496176cc9fd75dd85b4ada8e33 Mon Sep 17 00:00:00 2001 From: Sylvia van Os Date: Mon, 17 Mar 2025 18:37:28 +0100 Subject: [PATCH] Support pkpass files without any extra data Previously, the code assumed one of "boardingPass", "coupon", "eventTicket", "generic" existed and refused to pass a pkpass file without any of them --- .../java/protect/card_locker/PkpassParser.kt | 18 ++--- .../java/protect/card_locker/PkpassTest.kt | 63 ++++++++++++++++++ .../Eurowings.pkpass | Bin 0 -> 25991 bytes .../logo@2x.png | Bin 0 -> 7689 bytes 4 files changed, 68 insertions(+), 13 deletions(-) create mode 100644 app/src/test/res/protect/card_locker/pkpass/Eurowings_fake_empty_for_gh_issue_2317/Eurowings.pkpass create mode 100644 app/src/test/res/protect/card_locker/pkpass/Eurowings_fake_empty_for_gh_issue_2317/logo@2x.png diff --git a/app/src/main/java/protect/card_locker/PkpassParser.kt b/app/src/main/java/protect/card_locker/PkpassParser.kt index 313c3bb35..d8ecf22fe 100644 --- a/app/src/main/java/protect/card_locker/PkpassParser.kt +++ b/app/src/main/java/protect/card_locker/PkpassParser.kt @@ -296,30 +296,22 @@ class PkpassParser(context: Context, uri: Uri?) { } // Append type-specific info to the pass - noteText.append("\n\n") // Find the relevant pass type and parse it - var hasPassData = false for (passType in listOf("boardingPass", "coupon", "eventTicket", "generic")) { try { - noteText.append( - parsePassJSONPassFields( - jsonObject.getJSONObject(passType), - locale - ) + var extraText = parsePassJSONPassFields( + jsonObject.getJSONObject(passType), + locale ) - hasPassData = true + noteText.append("\n\n") + noteText.append(extraText) break } catch (ignored: JSONException) {} } - // Failed to parse anything, error out - if (!hasPassData) { - throw FormatException(mContext.getString(R.string.errorReadingFile)) - } - note = noteText.toString() } diff --git a/app/src/test/java/protect/card_locker/PkpassTest.kt b/app/src/test/java/protect/card_locker/PkpassTest.kt index 242e046a1..56cef6434 100644 --- a/app/src/test/java/protect/card_locker/PkpassTest.kt +++ b/app/src/test/java/protect/card_locker/PkpassTest.kt @@ -176,6 +176,69 @@ class PkpassTest { Assert.assertTrue(imageBitmap.sameAs(parser.image)) } + @Test + fun testFakeEmptyEurowingsPassForGitHubIssue2317() { + // Prepare + val context: Context = ApplicationProvider.getApplicationContext() + val pkpass = "pkpass/Eurowings_fake_empty_for_gh_issue_2317/Eurowings.pkpass" + val image = "pkpass/Eurowings_fake_empty_for_gh_issue_2317/logo@2x.png" + + val pkpassUri = Uri.parse(pkpass) + val imageUri = Uri.parse(image) + ShadowContentResolver().registerInputStream(pkpassUri, javaClass.getResourceAsStream(pkpass)) + ShadowContentResolver().registerInputStream(imageUri, javaClass.getResourceAsStream(image)) + + val parser = PkpassParser(context, pkpassUri) + val imageBitmap = BitmapFactory.decodeStream(context.contentResolver.openInputStream(imageUri)) + + // Confirm this does not have languages + Assert.assertEquals(listOf("de", "en"), parser.listLocales()) + + // Confirm correct parsing (en) + var parsedCard = parser.toLoyaltyCard("de") + + Assert.assertEquals(-1, parsedCard.id) + Assert.assertEquals("EUROWINGS", parsedCard.store) + Assert.assertEquals("Eurowings Boarding Pass", parsedCard.note) + Assert.assertEquals(Date(1567911600000), parsedCard.validFrom) + Assert.assertEquals(null, parsedCard.expiry) + Assert.assertEquals(BigDecimal(0), parsedCard.balance) + Assert.assertEquals(null, parsedCard.balanceType) + Assert.assertEquals("M1DOE/JOHN JBZPPP CGNDBVEW 0954 251A012D0073 148>5181W 9250BEW 00000000000002A0000000000000 0 N", parsedCard.cardId) + Assert.assertEquals(null, parsedCard.barcodeId) + Assert.assertEquals(BarcodeFormat.AZTEC, parsedCard.barcodeType!!.format()) + Assert.assertEquals(Color.parseColor("#FFFFFF"), parsedCard.headerColor) + Assert.assertEquals(0, parsedCard.starStatus) + Assert.assertEquals(0, parsedCard.archiveStatus) + Assert.assertEquals(0, parsedCard.lastUsed) + Assert.assertEquals(DBHelper.DEFAULT_ZOOM_LEVEL, parsedCard.zoomLevel) + + // Confirm correct image is used + Assert.assertTrue(imageBitmap.sameAs(parser.image)) + + // Confirm correct parsing (en) + parsedCard = parser.toLoyaltyCard("en") + + Assert.assertEquals(-1, parsedCard.id) + Assert.assertEquals("EUROWINGS", parsedCard.store) + Assert.assertEquals("Eurowings Boarding Pass", parsedCard.note) + Assert.assertEquals(Date(1567911600000), parsedCard.validFrom) + Assert.assertEquals(null, parsedCard.expiry) + Assert.assertEquals(BigDecimal(0), parsedCard.balance) + Assert.assertEquals(null, parsedCard.balanceType) + Assert.assertEquals("M1DOE/JOHN JBZPPP CGNDBVEW 0954 251A012D0073 148>5181W 9250BEW 00000000000002A0000000000000 0 N", parsedCard.cardId) + Assert.assertEquals(null, parsedCard.barcodeId) + Assert.assertEquals(BarcodeFormat.AZTEC, parsedCard.barcodeType!!.format()) + Assert.assertEquals(Color.parseColor("#FFFFFF"), parsedCard.headerColor) + Assert.assertEquals(0, parsedCard.starStatus) + Assert.assertEquals(0, parsedCard.archiveStatus) + Assert.assertEquals(0, parsedCard.lastUsed) + Assert.assertEquals(DBHelper.DEFAULT_ZOOM_LEVEL, parsedCard.zoomLevel) + + // Confirm correct image is used + Assert.assertTrue(imageBitmap.sameAs(parser.image)) + } + @Test fun testDCBPkPass() { // Prepare diff --git a/app/src/test/res/protect/card_locker/pkpass/Eurowings_fake_empty_for_gh_issue_2317/Eurowings.pkpass b/app/src/test/res/protect/card_locker/pkpass/Eurowings_fake_empty_for_gh_issue_2317/Eurowings.pkpass new file mode 100644 index 0000000000000000000000000000000000000000..42f58029a08e8bb0071feefceb118afcc11a2d53 GIT binary patch literal 25991 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

+G+Y+bQxnf<;phB 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 GNB;#dKZ}t7 literal 0 HcmV?d00001 diff --git a/app/src/test/res/protect/card_locker/pkpass/Eurowings_fake_empty_for_gh_issue_2317/logo@2x.png b/app/src/test/res/protect/card_locker/pkpass/Eurowings_fake_empty_for_gh_issue_2317/logo@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..ba1a78ff58c5a7854946843c2391cce6ecfdecb3 GIT binary patch literal 7689 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 literal 0 HcmV?d00001