From 4ec1a947bc33c433483b616987fc3139ac6c9387 Mon Sep 17 00:00:00 2001 From: "FC (Fay) Stegerman" Date: Tue, 22 Oct 2024 21:00:32 +0200 Subject: [PATCH 1/2] modify stocard ZIP files to include spanned archive marker --- .../test/res/protect/card_locker/stocard.zip | Bin 159098 -> 159102 bytes .../test/res/protect/card_locker/stocard2.zip | Bin 162484 -> 162488 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/app/src/test/res/protect/card_locker/stocard.zip b/app/src/test/res/protect/card_locker/stocard.zip index bf645db8128f5f5d4cd802c9c1607b8e45aa718f..bcf055d6a3af406bc92b0cd7fddf1f216c7d0cf0 100644 GIT binary patch delta 954 zcmZuwT}V@L6yN>%QBJ$wRfdghX)O&!P?siU-A(Po<=U9F=G4t8Go6aP1U&>=27(a6 ztxnCb9+G@1h)BvOdo2+5B-qysDx@MGd@_*E-KB}H`*P3kq{uGzu?`n39E5dTvD-t;nzmy=q)V{Z@__)ObSZBc}~7kOOkrFhFuOMDlc@ zfL0qJNnN^Jo%Tq&U)HxNG~_}zmDX{7m@d~Lin26~>pumvGM^?=tRAwEM)@c4Mfjk; z9w`nfPM4G30TG^zc!m^!+URDSHEJqBfs4(OxV{s&tE{9PE2yhy$f@yGUbRwha0p(abqMm)RYOFX^Xe(v%`?9zryHN}>@m6A7^inlaHK?A1S)Gn zgr?8K4ugr>gYYS1dT!^3nfwLVNs|}2!;k++d34*u(%in}EHjN>Wa)K&vQ(i?A`4e2 z>O~Cp1DhOyW@MAo$6tBQyh)M^kxrHtt{XX+EJ?Jh6*Bq@lO>T>TDjnjq771|x{D&p z^uvheLmQ-F=!#XMgRTa+-FO^~P<=ZCUx})W(4P{%iKZZr5~e^9F+nD42Y%vVxu#1N z81D9PgXK{zgp-`h>Kkd@!}?FHiUUhS7}^vHF9Vz$Q9ZyafQ(% z33|U)!PLnWmX2!l?{2s;b1VT2^s$F$E&mUc94pVP0Gxtv delta 1025 zcmY+DT}V@57{_=1evBQ8=5eqVC z^8l=LEQD-YYegD8sfUQy2};2LIrnmFC{Ya}D~W}aypN}pC27DB`J5zDO$(gl@^GJE z)HC;uHfm}{0WIxE7Cyygtn{vxr`EQh4qj8VCpE=E7aDoqCbJH@njquc1`X6GiV}P& z8mL|;^d~h+N5w)id${bmr~wDPQ0D#euzbW4NBvk#Q@|CvE5j{J(Xxz1WY|;|8BaG- zu#LOE#(+rm2U+}4x>k`w*@t+QnMZVB@}e0Zr!-)U_-`fCikEfnOs|LOwAc+$&j)h)DDR{pKaN_c-N)ORbLiCBjYdoq=)l~AHiQdx@UsWq7%kF4 zSut$1xCCXRk6TIC+pTJrqPe%yn-*=m4e_z zKOBT0ifE>fRd4RlX={j&<>5{ZoWaE!?SGf@ie!AN)qsQEhxvTp_OeiEn1vp@;!=L0 qgenGcPncIeLzE-&*i%F7-}T*8Ify}pR4M*tQuqYK1{^Lhh~bLaZN4q z^1*1aF^ms1*}@mYH*3oH;x!-4%)Vz-bfd5B?a z118bW3ZquW=~g_@zH!8gKAiI9s1-Gi8~$dR3Zz+?pBrTGj{>RwZm@!5tB|AhGi^17 zF&^mR2ZLs^w@~;ajuzrAx+Xa}Q;KjDLz7*h&=4~%YouF8u*?0r22H3Aal098wjsFc!@aw#2%bP7jSbSN{{2{;qw2C?k6%eb*7M6%QdJ;tM5)^4Lef7vAa zB*qO49A1wc^cdYh&-)u>)|sgj-Av)^+bD^hCMVzlJM8!otHcS%xwsHESBSfOngSQO zp;9&y%ic64XTUxNdza|&5&%c3LQ*QtO delta 1062 zcmY+DNla5w7=_#Ouv*bl1{DfgM5{FzDUx8+2(@Av#5#deA>fEM3P`A0F)!ZOf>rUJz8}2@}2*jd+-0>cb^U!9}XGgRxVTG z*yKj)q0FP1`bU{)aqD$F?}i6UbZjnxgDJ&u;f@OV3<~Je_^ue&^>-tm8Xhdg1cpn* zRDnoh7n>Hr#M`BC;Og@6n(J`=v zs>YaTS%VDrcrcM&RWRY_7_}a<#@l$yBU?W=YJn9i5WvN;(P|Mp>i!G9jMqxb$IWEP zDmmftaZ$k*N-!lx4&=hd@&Ag}$nH+`m`23Lgpnf|XsN&y1k7rgp0%*?O@*vdkQh^D z^Jb+e@kucygx@2uitX!U;?*g!vW@$zMEN0;twWGrucW&tst|IfCUC)e5zbAD3X@}f z8rZP`W>!~6rj)9se^#ReuhKMgak`0pHIlw;i3%C~TCYuMI?kmJubGj|d$n-tef(C7 zFZ%E7uR|{it&#F+dN!gGX_+d7zF3n(&!!r=a+56k>pwA>rJH4T15^KXCbD3QG}ktb zx!Z7o)3!>ia(V==67>Rhn+D-}c=S1RY{LN7bTI706+YN52HOn{`flh=?C{Ak8`$r| z2gRHN=H{T4t{reHFEk3!kt>&ywG%Fd4%MJac}!{$*Qs3a+dORIlLj%^=c;s!hZ}_k zqjV+@lX%^a89dnpi_)Dp>~ieFX5~-5N|!jNS^o34Y;MM&VxK>3c{^Ww4q5DLk*oRG zAXhVaA^ZJkV^@oG)2l)|ulXf?pM8FO!cd`RXk3iM$g*|@_sA=G?TpD*p4ct7W?l{h zd;Eyw-o0Y5x->(203Ic|2%)fPJ%dF^;`@N~`glY!)999|bncTj4=jxt&GfdyYuM_B HPN(||o+xG? From 98f4e0dd7f0ce9aa43d126ede2cb5d89be14568c Mon Sep 17 00:00:00 2001 From: "FC (Fay) Stegerman" Date: Tue, 22 Oct 2024 06:08:44 +0200 Subject: [PATCH 2/2] StocardImporter: use ZipFile (fixes spanned archive marker breaking import) --- .../importexport/StocardImporter.java | 23 +++++++++---------- 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/protect/card_locker/importexport/StocardImporter.java b/app/src/main/java/protect/card_locker/importexport/StocardImporter.java index 263719d03..94aa98aa2 100644 --- a/app/src/main/java/protect/card_locker/importexport/StocardImporter.java +++ b/app/src/main/java/protect/card_locker/importexport/StocardImporter.java @@ -9,8 +9,9 @@ import androidx.annotation.NonNull; import com.google.zxing.BarcodeFormat; +import net.lingala.zip4j.ZipFile; import net.lingala.zip4j.io.inputstream.ZipInputStream; -import net.lingala.zip4j.model.LocalFileHeader; +import net.lingala.zip4j.model.FileHeader; import org.apache.commons.csv.CSVFormat; import org.apache.commons.csv.CSVParser; @@ -20,9 +21,7 @@ import org.json.JSONException; import org.json.JSONObject; import java.io.File; -import java.io.FileInputStream; import java.io.IOException; -import java.io.InputStream; import java.io.InputStreamReader; import java.math.BigDecimal; import java.nio.charset.StandardCharsets; @@ -130,11 +129,9 @@ public class StocardImporter implements Importer { throw new FormatException("Issue parsing CSV data", e); } - InputStream input = new FileInputStream(inputFile); - ZipInputStream zipInputStream = new ZipInputStream(input, password); - zipData = importZIP(zipInputStream, zipData); - zipInputStream.close(); - input.close(); + ZipFile zipFile = new ZipFile(inputFile, password); + zipData = importZIP(zipFile, zipData); + zipFile.close(); if (zipData.cards.keySet().size() == 0) { throw new FormatException("Couldn't find any loyalty cards in this Stocard export."); @@ -144,7 +141,7 @@ public class StocardImporter implements Importer { saveAndDeduplicate(context, database, importedData); } - public ZIPData importZIP(ZipInputStream zipInputStream, final ZIPData zipData) throws IOException, FormatException, JSONException { + public ZIPData importZIP(ZipFile zipFile, final ZIPData zipData) throws IOException, FormatException, JSONException { Map cards = zipData.cards; Map providers = zipData.providers; @@ -152,9 +149,8 @@ public class StocardImporter implements Importer { String[] cardBaseName = null; String customProviderId = ""; String cardName = ""; - LocalFileHeader localFileHeader; - while ((localFileHeader = zipInputStream.getNextEntry()) != null) { - String fileName = localFileHeader.getFileName(); + for (FileHeader fileHeader : zipFile.getFileHeaders()) { + String fileName = fileHeader.getFileName(); String[] nameParts = fileName.split("/"); if (nameParts.length < 2) { @@ -162,6 +158,7 @@ public class StocardImporter implements Importer { } String userId = nameParts[1]; + ZipInputStream zipInputStream = zipFile.getInputStream(fileHeader); if (customProvidersBaseName == null) { // FIXME: can we use the points-account/statement/content.json balance info somehow? @@ -302,6 +299,8 @@ public class StocardImporter implements Importer { } else if (!fileName.endsWith("/")) { Log.d(TAG, "Unknown or unused file " + fileName + ", skipping..."); } + + zipInputStream.close(); } return new ZIPData(cards, providers);