From caeba57a4236c97d6cac008f30003d7a12973431 Mon Sep 17 00:00:00 2001 From: Sylvia van Os Date: Mon, 12 May 2025 19:33:28 +0200 Subject: [PATCH] Fix crash on pkpass with no barcodes --- .../java/protect/card_locker/PkpassParser.kt | 5 +- .../java/protect/card_locker/PkpassTest.kt | 157 ++++++++++++++++++ .../Eurowings.pkpass | Bin 0 -> 25703 bytes .../logo@2x.png | Bin 0 -> 7689 bytes 4 files changed, 161 insertions(+), 1 deletion(-) create mode 100644 app/src/test/res/protect/card_locker/pkpass/Eurowings_fake_no_barcode_for_gh_issue_2503/Eurowings.pkpass create mode 100644 app/src/test/res/protect/card_locker/pkpass/Eurowings_fake_no_barcode_for_gh_issue_2503/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 52eca4577..918d8b69b 100644 --- a/app/src/main/java/protect/card_locker/PkpassParser.kt +++ b/app/src/main/java/protect/card_locker/PkpassParser.kt @@ -34,7 +34,10 @@ class PkpassParser(context: Context, uri: Uri?) { private var expiry: Date? = null private val balance: BigDecimal = BigDecimal(0) private val balanceType: Currency? = null - private var cardId: String? = null + // FIXME: Some cards may not have any barcodes, but Catima doesn't accept null card ID + // An empty string card ID would prevent a crash, but would be blocked in the edit activity + // Setting the default to the "No barcode" text at least prevents a crash, but it is definitely a hack + private var cardId: String = context.getString(R.string.noBarcode) private var barcodeId: String? = null private var barcodeType: CatimaBarcode? = null private var headerColor: Int? = null diff --git a/app/src/test/java/protect/card_locker/PkpassTest.kt b/app/src/test/java/protect/card_locker/PkpassTest.kt index 6fd8c0090..953a1c792 100644 --- a/app/src/test/java/protect/card_locker/PkpassTest.kt +++ b/app/src/test/java/protect/card_locker/PkpassTest.kt @@ -241,6 +241,163 @@ class PkpassTest { Assert.assertTrue(imageBitmap.sameAs(parser.image)) } + @Test + fun testFakeNoBarcodeEurowingsPassForGitHubIssue2503() { + // This pass.json has been edited to not contain any barcodes. It is otherwise identical to the original Eurowings test + + // Prepare + val context: Context = ApplicationProvider.getApplicationContext() + val pkpass = "pkpass/Eurowings_fake_no_barcode_for_gh_issue_2503/Eurowings.pkpass" + val image = "pkpass/Eurowings_fake_no_barcode_for_gh_issue_2503/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\n" + + "\n" + + "Gate: B61\n" + + "Sitz: 12D\n" + + "\n" + + "Cologne-Bonn: CGN\n" + + "Dubrovnik: DBV\n" + + "\n" + + "Name: John Doe\n" + + "Status: -\n" + + "Gruppe: GROUP 1\n" + + "Tarif: SMART\n" + + "\n" + + "Flug: EW 954\n" + + "Datum: 08/09/2019\n" + + "Boarding: 05:00\n" + + "Gate Schließt: 05:15\n" + + "\n" + + "Eurowings wünscht Ihnen einen angenehmen Flug.\n" + + "\n" + + "Wir bitten Sie, sich zur angegeben Boarding Zeit am Gate einzufinden.\n" + + "Buchungscode: JBZPPP\n" + + "Sequenz: 73\n" + + "Hinweis: Bitte beachten Sie, dass obwohl Ihr Flug verspätet sein mag, Sie dennoch wie geplant pünktlich am Check-in und am Abfluggate erscheinen müssen.\n" + + "\n" + + "Kostenlose Mitnahme eines Handgepäckstücks (8 Kg, 55 x 40 x 23cm).\n" + + "Mitnahme von Flüssigkeiten im Handgepäck: Neben den sonstigen Beschränkungen für das Handgepäck ist für alle Abflüge innerhalb der Europäischen Union sowie vielen weiteren Ländern (u.a. Schweiz, Russland, Island, Kroatien, Israel, Ägypten, Marokko, Tunesien, Norwegen) die Mitnahme von vor der Fluggastkontrolle erworbenen bzw. mitgebrachten Flüssigkeiten und Gels nur noch eingeschränkt erlaubt:\n" + + "\n" + + "- Sämtliche Flüssigkeiten (wie Kosmetik- und Toilettenartikel, Gels, Pasten, Cremes, Lotionen, Gemische aus flüssigen und festen Stoffen, Parfums, Behälter unter Druck, Dosen, Wasserflaschen etc.) sowie wachs- oder gelartige Stoffe dürfen nur noch in Behältnissen bis zu 100 ml bzw. 100 g mit an Bord genommen werden.\n" + + "\n" + + "- Diese Flüssigkeiten bzw. Stoffe müssen in einem transparenten, wiederverschließbaren Plastikbeutel (max. 1 kg Inhalt) vollständig geschlossen, verpackt sein.\n" + + "\n" + + "- Diese Beutel müssen Fluggäste selbst vor dem Abflug erwerben. Sie sind in vielen Supermärkten z. B. als Gefrierbeutel erhältlich. Es besteht zurzeit keine Möglichkeit, entsprechende Plastikbeutel am Eurowings Check-In zu erwerben bzw. auszugeben.\n" + + "\n" + + "- Verschreibungspflichtige Medikamente sowie Babynahrung dürfen weiterhin im Handgepäck transportiert werden. Der Fluggast muss nachweisen, dass die Medikamente und Babynahrung während des Fluges benötigt werden.\n" + + "\n" + + "- Produkte und Beutel, die nicht den Maßgaben entsprechen oder die nur mit Gummiband oder ähnlichem verschlossen sind, müssen leider abgegeben werden.\n" + + "\n" + + "Flüssigkeiten und Gels, die Sie nicht zwingend während Ihres Aufenthalts an Bord benötigen, sollten zur raschen Fluggastabfertigung nach Möglichkeit im aufzugebenden Gepäck untergebracht werden.\n" + + "\n" + + "Selbstverständlich ist die Mitnahme von allen Flüssigkeiten/Gels/Getränken aus Travel-Value oder Duty Free-Shops, die nach der Fluggastkontrolle erworben werden, weiterhin erlaubt.\n" + + "\n" + + "Eurowings übernimmt keine Haftung für Gegenstände, die der Fluggast nicht im Handgepäck mitführen darf und deshalb aus Sicherheitsgründen an der Fluggastkontrolle abgeben muss.\n" + + "Kontakt: Sie erreichen das deutsche Call Center unter der Telefonnummer\n" + + "\n" + + "0180 6 320 320 ( 0:00 Uhr - 24:00 Uhr )\n" + + "\n" + + "(0,20 € pro Anruf aus dem Festnetz der Deutschen Telekom - Mobilfunk maximal 0,60 € pro Anruf).", 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("No barcode", parsedCard.cardId) + Assert.assertEquals(null, parsedCard.barcodeId) + Assert.assertEquals(null, parsedCard.barcodeType) + 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) + Assert.assertEquals(DBHelper.DEFAULT_ZOOM_LEVEL_WIDTH, parsedCard.zoomLevelWidth) + + // 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\n" + + "\n" + + "Gate: B61\n" + + "Seat: 12D\n" + + "\n" + + "Cologne-Bonn: CGN\n" + + "Dubrovnik: DBV\n" + + "\n" + + "Name: John Doe\n" + + "Status: -\n" + + "Group: GROUP 1\n" + + "Fare: SMART\n" + + "\n" + + "Flight: EW 954\n" + + "Date: 08/09/2019\n" + + "Boarding: 05:00\n" + + "Gate closure: 05:15\n" + + "\n" + + "Eurowings wishes you a pleasant flight .\n" + + "\n" + + "We kindly ask you to be present at your departure gate on time.\n" + + "Booking code: JBZPPP\n" + + "Sequence: 73\n" + + "Notice: Please note that although your flight may be delayed, you will still need to check in and go to your departure gate on time as scheduled.\n" + + "\n" + + "Carry on one item of hand luggage (8 kg, 55 x 40 x 23 cm) for free.\n" + + "Carrying liquids in hand luggage: In addition to other restrictions on hand luggage, there are still restrictions on liquids and gels brought by the passenger or purchased before the security control on all departures within the European Union, as well as to many other countries (including Switzerland, Russia, Iceland, Croatia, Israel, Egypt, Morocco, Tunisia and Norway):\n" + + "\n" + + "- All liquids (such as toiletries and cosmetics, gels, pastes, creams, lotions, mixtures of liquids and solids, perfumes, pressurised containers, cans, water bottles etc) as well as wax and gel-like substances may only be carried on board in amounts less than 100ml or 100g.\n" + + "\n" + + "- These liquids or substances must be packed in closed containers in a transparent, re-sealable plastic bag (max. contents 1 kg).\n" + + "\n" + + "- It is the passenger’s responsibility to purchase this bag before departure. They are available in many supermarkets, e.g. as freezer bags. It is currently not possible for passengers to obtain or purchase the required bags from Eurowings check-in.\n" + + "\n" + + "- Prescription medicines and baby food may still be carried in hand baggage. The passenger must prove that such medicines and/or baby food are needed during the flight.\n" + + "\n" + + "- Products and bags which do not meet the requirements or are only sealed with a rubber band or similar will unfortunately have to be surrendered by passengers\n" + + "\n" + + "In order to pass through the airport as quickly as possible, you are strongly advised to pack any liquids or gels which are not essential for your journey on board the aircraft in your checked baggage if possible.\n" + + "\n" + + "As a matter of course, liquids from the Travel Value / Duty Free shops which have been purchased after you have passed through security are still allowed on board.\n" + + "\n" + + "Eurowings shall not be liable for any items which passengers are prohibited from carrying in their hand baggage for security reasons and are required to surrender at the security checkpoint.\n" + + "Contact: https://mobile.eurowings.com/booking/StaticContactInfo.aspx?culture=en-GB&back=home", 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("No barcode", parsedCard.cardId) + Assert.assertEquals(null, parsedCard.barcodeId) + Assert.assertEquals(null, parsedCard.barcodeType) + 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) + Assert.assertEquals(DBHelper.DEFAULT_ZOOM_LEVEL_WIDTH, parsedCard.zoomLevelWidth) + + // 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_no_barcode_for_gh_issue_2503/Eurowings.pkpass b/app/src/test/res/protect/card_locker/pkpass/Eurowings_fake_no_barcode_for_gh_issue_2503/Eurowings.pkpass new file mode 100644 index 0000000000000000000000000000000000000000..5c444d78c1027c5374c3e88cf29e09426e2f6f61 GIT binary patch literal 25703 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 literal 0 HcmV?d00001