https://issues.apache.org/bugzilla/show_bug.cgi?id=52690
p...@spencer.es changed: What |Removed |Added ---------------------------------------------------------------------------- Status|NEEDINFO |NEW --- Comment #3 from p...@spencer.es 2012-02-20 21:52:28 UTC --- Sorry, Buzilla and/or my browser lost my original description of the problem The issue is that the classic POI 'myDecrypt' method below in general produces output files that are considered corrupt by Micrososft Office If say you use MS Word to open a .docx file decrypted by this method you will get an error dialog saying the file is corrupt and asking if you would like attempt recovery (which incidentally will succeed) The problem is that the output length is too long. Output must be truncated to the length specified in the input data stream and currently discarded for example in "EcmaDecryptor>>getDataStream(DirectoryNode dir)" This is the offending line 128: long size = dis.readLong(); The solution is to save this length in an instance variable of the class Decryptor so that it is accessible to user written code (Decryptor>>getLength()). Then myDecrypt method can then be modified to work correctly. ===== private void myDecrypt(String filename, String password) throws FileNotFoundException, IOException { File inFile = new File(filename); File outFile = new File(new File(filename).getParentFile(), "Decrypted" + new File(filename).getName()); System.err.println("Attempting to decrypt " + inFile.getAbsolutePath() + " to " + outFile.getAbsolutePath()); POIFSFileSystem filesystem = new POIFSFileSystem(new FileInputStream(inFile)); EncryptionInfo info = new EncryptionInfo(filesystem); Decryptor d = Decryptor.getInstance(info); try { if (!d.verifyPassword(password)) { throw new RuntimeException("Unable to process: wrong password"); } InputStream dataStream = d.getDataStream(filesystem); OutputStream out = new FileOutputStream(outFile); byte buf[] = new byte[1024]; int len; while ((len = dataStream.read(buf)) > 0) out.write(buf, 0, len); out.close(); dataStream.close(); } catch (GeneralSecurityException ex) { throw new RuntimeException("Unable to process encrypted document", ex); } System.err.println("Finished " + inFile.getAbsolutePath()); } -- Configure bugmail: https://issues.apache.org/bugzilla/userprefs.cgi?tab=email ------- You are receiving this mail because: ------- You are the assignee for the bug. --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@poi.apache.org For additional commands, e-mail: dev-h...@poi.apache.org