Hi,

wb.write(tempData.getOutputStream)
tempData.getOutputStream.close()

Closing the outputStream like above removes the file content and causes
following error (the error comes from val opc =
OPCPackage.open(tempData.getInputStream).

Caused by: org.apache.poi.EmptyFileException: The supplied file was empty
(zero bytes long)
at org.apache.poi.util.IOUtils.peekFirstNBytes(IOUtils.java:144)
at org.apache.poi.poifs.filesystem.FileMagic.valueOf(FileMagic.java:209)
at
org.apache.poi.openxml4j.opc.internal.ZipHelper.verifyZipHeader(ZipHelper.java:143)
at
org.apache.poi.openxml4j.opc.internal.ZipHelper.openZipStream(ZipHelper.java:175)
at org.apache.poi.openxml4j.opc.ZipPackage.<init>(ZipPackage.java:130)
at org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:312)
at fi.oph.koski.raportit.ExcelWriter$.writeExcel(ExcelWriter.scala:57)
at
fi.oph.koski.raportit.ExcelWriterSpec.withExcel(ExcelWriterSpec.scala:382)
at
fi.oph.koski.raportit.ExcelWriterSpec.$anonfun$new$18(ExcelWriterSpec.scala:60)
at org.scalatest.SuperEngine.registerNestedBranch(Engine.scala:609)
at
org.scalatest.freespec.AnyFreeSpecLike$FreeSpecStringWrapper.$minus(AnyFreeSpecLike.scala:284)
... 21 more


I debugged what happens to the temporary file after the
tempData.getOutputStream.close() and it seems that the file contents is
cleared or something at that point, at least the size of the temporary file
drops from 6336 bytes to 16 bytes.

ls -la

-rw-------    1 xxxxx  yyyyy  6336 May 17 08:54
poi-temp-data130676899731199660.tmp


ls -la

-rw-------    1 xxxxx  yyyyy    16 May 17 08:54
poi-temp-data130676899731199660.tmp


Any ideas what to try out next?

Br,
Juha

On Wed, May 11, 2022 at 3:39 PM PJ Fanning <[email protected]>
wrote:

> You should close the output stream immediately
>
>  wb.write(tempData.getOutputStream)
>
> You should not leave the output stream open while then turning around and
> trying to read from the tempData.
>
>
>
>
>
>
> On Wednesday 11 May 2022, 11:58:25 GMT+2, Juha Rantanen <
> [email protected]> wrote:
>
>
>
>
>
> Hi,
>
> I'm trying to upgrade poi-ooxml version 3.17. I encountered an error:
> "java.io.IOException: javax.crypto.BadPaddingException: Given final block
> not properly padded. Such issues can arise if a bad key is used during
> decryption." I have tried to upgrade to all possible versions starting from
> 4.0.0, also versions 5.0.0 and 5.2.2 without success. All versions above
> 4.0.0 causes same error. The code we use has not changed, it has been
> working properly with version 3.17 and below. Below is the code we use. The
> failure happens at "val opc = OPCPackage.open(tempData.getInputStream)". I
> have commented out all data writing to see that this is not data related.
>
>   def writeExcel(workbookSettings: WorkbookSettings, sheets: Seq[Sheet],
> out: OutputStream): Unit = {
>
>     val wb = if (workbookSettings.password.isEmpty) new SXSSFWorkbook else
> new SXSSFWorkbookWithCustomZipEntrySource
>     try {
>       val coreProps = wb.getXSSFWorkbook.getProperties.getCoreProperties
>       coreProps.setTitle(workbookSettings.title)
>       coreProps.setCreator("Koski")
> //      sheets.foreach { sheet =>
> //        val sh = createSheet(sheet, wb)
> //        sheet match {
> //          case ds: SheetWithColumnSettings => writeDataSheet(wb, sh, ds)
> //          case ds: DocumentationSheet => writeDocumentationSheet(wb, sh,
> ds)
> //        }
> //      }
>       if (workbookSettings.password.isEmpty) {
>         wb.write(out)
>       } else {
>         // based on
>
> https://github.com/apache/poi/blob/f509d1deae86866ed531f10f2eba7db17e098473/src/examples/src/org/apache/poi/xssf/streaming/examples/SavePasswordProtectedXlsx.java
>         val tempData = new EncryptedTempData
>         try {
>           wb.write(tempData.getOutputStream)
> *          val opc = OPCPackage.open(tempData.getInputStream) //FAILURE
> HAPPENS HERE*
>           val fs = new POIFSFileSystem
>           val enc = Encryptor.getInstance(new
> EncryptionInfo(EncryptionMode.agile))
>           enc.confirmPassword(workbookSettings.password.get)
>           opc.save(enc.getDataStream(fs))
>           fs.writeFilesystem(out)
>         } finally {
>           tempData.dispose()
>         }
>       }
>       out.close()
>     } finally {
>       // deletes temporary files from disk
>       wb.dispose()
>     }
>   }
>
> To see the whole code you can checkout our public repository and the file
> above:
>
> https://github.com/Opetushallitus/koski/blob/snyk-fix-892cc871099e9787cbc96ed1b5c58ba4/src/main/scala/fi/oph/koski/raportit/ExcelWriter.scala
>
> And the branch is here including the code change I made to try to simplify
> the error: https://github.com/Opetushallitus/koski/pull/1100
>
> The error can be reproduced with the test found in here:
>
> https://github.com/Opetushallitus/koski/blob/snyk-fix-892cc871099e9787cbc96ed1b5c58ba4/src/test/scala/fi/oph/koski/raportit/ExcelWriterSpec.scala
>
> The full stacktrace of the error is:
>
> An unexpected java.io.IOException was thrown.
> ScalaTestFailureLocation: org.scalatest.matchers.MatchersHelper$ at
> (ExcelWriterSpec.scala:21)
> org.scalatest.exceptions.TestFailedException: An unexpected
> java.io.IOException was thrown.
> at
>
> org.scalatest.matchers.MatchersHelper$.indicateFailure(MatchersHelper.scala:402)
> at
>
> org.scalatest.matchers.dsl.NoExceptionWord.shouldBe(NoExceptionWord.scala:58)
> at
>
> fi.oph.koski.raportit.ExcelWriterSpec.$anonfun$new$2(ExcelWriterSpec.scala:22)
> at org.scalatest.OutcomeOf.outcomeOf(OutcomeOf.scala:85)
> at org.scalatest.OutcomeOf.outcomeOf$(OutcomeOf.scala:83)
> at org.scalatest.OutcomeOf$.outcomeOf(OutcomeOf.scala:104)
> at org.scalatest.Transformer.apply(Transformer.scala:22)
> at org.scalatest.Transformer.apply(Transformer.scala:20)
> at
>
> org.scalatest.freespec.AnyFreeSpecLike$$anon$1.apply(AnyFreeSpecLike.scala:430)
> at org.scalatest.TestSuite.withFixture(TestSuite.scala:196)
> at org.scalatest.TestSuite.withFixture$(TestSuite.scala:195)
> at org.scalatest.freespec.AnyFreeSpec.withFixture(AnyFreeSpec.scala:1739)
> at
>
> org.scalatest.freespec.AnyFreeSpecLike.invokeWithFixture$1(AnyFreeSpecLike.scala:428)
> at
>
> org.scalatest.freespec.AnyFreeSpecLike.$anonfun$runTest$1(AnyFreeSpecLike.scala:440)
> at org.scalatest.SuperEngine.runTestImpl(Engine.scala:306)
> at
> org.scalatest.freespec.AnyFreeSpecLike.runTest(AnyFreeSpecLike.scala:440)
> at
> org.scalatest.freespec.AnyFreeSpecLike.runTest$(AnyFreeSpecLike.scala:422)
> at org.scalatest.freespec.AnyFreeSpec.runTest(AnyFreeSpec.scala:1739)
> at
>
> org.scalatest.freespec.AnyFreeSpecLike.$anonfun$runTests$1(AnyFreeSpecLike.scala:499)
> at org.scalatest.SuperEngine.$anonfun$runTestsInBranch$1(Engine.scala:413)
> at scala.collection.immutable.List.foreach(List.scala:431)
> at org.scalatest.SuperEngine.traverseSubNodes$1(Engine.scala:401)
> at org.scalatest.SuperEngine.runTestsInBranch(Engine.scala:390)
> at org.scalatest.SuperEngine.$anonfun$runTestsInBranch$1(Engine.scala:427)
> at scala.collection.immutable.List.foreach(List.scala:431)
> at org.scalatest.SuperEngine.traverseSubNodes$1(Engine.scala:401)
> at org.scalatest.SuperEngine.runTestsInBranch(Engine.scala:396)
> at org.scalatest.SuperEngine.runTestsImpl(Engine.scala:475)
> at
> org.scalatest.freespec.AnyFreeSpecLike.runTests(AnyFreeSpecLike.scala:499)
> at
> org.scalatest.freespec.AnyFreeSpecLike.runTests$(AnyFreeSpecLike.scala:498)
> at org.scalatest.freespec.AnyFreeSpec.runTests(AnyFreeSpec.scala:1739)
> at org.scalatest.Suite.run(Suite.scala:1112)
> at org.scalatest.Suite.run$(Suite.scala:1094)
> at org.scalatest.freespec.AnyFreeSpec.org
> $scalatest$freespec$AnyFreeSpecLike$$super$run(AnyFreeSpec.scala:1739)
> at
>
> org.scalatest.freespec.AnyFreeSpecLike.$anonfun$run$1(AnyFreeSpecLike.scala:543)
> at org.scalatest.SuperEngine.runImpl(Engine.scala:535)
> at org.scalatest.freespec.AnyFreeSpecLike.run(AnyFreeSpecLike.scala:543)
> at org.scalatest.freespec.AnyFreeSpecLike.run$(AnyFreeSpecLike.scala:542)
> at org.scalatest.freespec.AnyFreeSpec.run(AnyFreeSpec.scala:1739)
> at org.scalatest.tools.SuiteRunner.run(SuiteRunner.scala:45)
> at
>
> org.scalatest.tools.Runner$.$anonfun$doRunRunRunDaDoRunRun$13(Runner.scala:1322)
> at
>
> org.scalatest.tools.Runner$.$anonfun$doRunRunRunDaDoRunRun$13$adapted(Runner.scala:1316)
> at scala.collection.immutable.List.foreach(List.scala:431)
> at org.scalatest.tools.Runner$.doRunRunRunDaDoRunRun(Runner.scala:1316)
> at
>
> org.scalatest.tools.Runner$.$anonfun$runOptionallyWithPassFailReporter$24(Runner.scala:993)
> at
>
> org.scalatest.tools.Runner$.$anonfun$runOptionallyWithPassFailReporter$24$adapted(Runner.scala:971)
> at
>
> org.scalatest.tools.Runner$.withClassLoaderAndDispatchReporter(Runner.scala:1482)
> at
>
> org.scalatest.tools.Runner$.runOptionallyWithPassFailReporter(Runner.scala:971)
> at org.scalatest.tools.Runner$.run(Runner.scala:798)
> at org.scalatest.tools.Runner.run(Runner.scala)
> at
>
> org.jetbrains.plugins.scala.testingSupport.scalaTest.ScalaTestRunner.runScalaTest2(ScalaTestRunner.java:133)
> at
>
> org.jetbrains.plugins.scala.testingSupport.scalaTest.ScalaTestRunner.main(ScalaTestRunner.java:27)
> Caused by: java.io.IOException: javax.crypto.BadPaddingException: Given
> final block not properly padded. Such issues can arise if a bad key is used
> during decryption.
> at javax.crypto.CipherInputStream.getMoreData(CipherInputStream.java:128)
> at javax.crypto.CipherInputStream.read(CipherInputStream.java:246)
> at java.io.BufferedInputStream.fill(BufferedInputStream.java:246)
> at java.io.BufferedInputStream.read(BufferedInputStream.java:265)
> at java.io.FilterInputStream.read(FilterInputStream.java:83)
> at java.io.PushbackInputStream.read(PushbackInputStream.java:139)
> at
>
> org.apache.commons.compress.archivers.zip.ZipArchiveInputStream.readOneByte(ZipArchiveInputStream.java:1213)
> at
>
> org.apache.commons.compress.archivers.zip.ZipArchiveInputStream.findEocdRecord(ZipArchiveInputStream.java:1149)
> at
>
> org.apache.commons.compress.archivers.zip.ZipArchiveInputStream.skipRemainderOfArchive(ZipArchiveInputStream.java:1127)
> at
>
> org.apache.commons.compress.archivers.zip.ZipArchiveInputStream.getNextZipEntry(ZipArchiveInputStream.java:293)
> at
>
> org.apache.poi.openxml4j.util.ZipArchiveThresholdInputStream.getNextEntry(ZipArchiveThresholdInputStream.java:152)
> at
>
> org.apache.poi.openxml4j.util.ZipInputStreamZipEntrySource.<init>(ZipInputStreamZipEntrySource.java:94)
> at org.apache.poi.openxml4j.opc.ZipPackage.<init>(ZipPackage.java:132)
> at org.apache.poi.openxml4j.opc.OPCPackage.open(OPCPackage.java:312)
> at fi.oph.koski.raportit.ExcelWriter$.writeExcel(ExcelWriter.scala:45)
> at
> fi.oph.koski.raportit.ExcelWriterSpec.withExcel(ExcelWriterSpec.scala:48)
> at
>
> fi.oph.koski.raportit.ExcelWriterSpec.$anonfun$new$3(ExcelWriterSpec.scala:22)
> at scala.runtime.java8.JFunction0$mcV$sp.apply(JFunction0$mcV$sp.java:23)
> at
>
> org.scalatest.matchers.should.Matchers.$anonfun$thrownBy$1(Matchers.scala:3029)
> at
>
> org.scalatest.matchers.dsl.ResultOfThrownByApplication.execute(ResultOfThrownByApplication.scala:30)
> at
>
> org.scalatest.matchers.dsl.NoExceptionWord.shouldBe(NoExceptionWord.scala:52)
> ... 50 more
> Caused by: javax.crypto.BadPaddingException: Given final block not properly
> padded. Such issues can arise if a bad key is used during decryption.
> at com.sun.crypto.provider.CipherCore.unpad(CipherCore.java:975)
> at
> com.sun.crypto.provider.CipherCore.fillOutputBuffer(CipherCore.java:1056)
> at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:853)
> at com.sun.crypto.provider.AESCipher.engineDoFinal(AESCipher.java:446)
> at javax.crypto.Cipher.doFinal(Cipher.java:2051)
> at javax.crypto.CipherInputStream.getMoreData(CipherInputStream.java:125)
> ... 70 more
>
> Any ideas what goes wrong in here?
>
> Br,
> Juha
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [email protected]
> For additional commands, e-mail: [email protected]
>
>

Reply via email to