package art.servers.gost.access.utils; import art.library.interop.serialization.Serialization; import art.library.model.devices.gost.access.types.AccessEnforcement_Detection; import art.library.model.devices.gost.access.types.AccessEnforcement_Detection_Image; import art.library.utils.licence.Licence; import java.io.BufferedOutputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.nio.file.Files; import java.security.MessageDigest; import java.text.SimpleDateFormat; import java.util.List; import java.util.zip.CRC32; import javax.xml.bind.DatatypeConverter; import net.lingala.zip4j.io.outputstream.ZipOutputStream; import net.lingala.zip4j.model.ZipParameters; import net.lingala.zip4j.model.enums.AesKeyStrength; import net.lingala.zip4j.model.enums.CompressionLevel; import net.lingala.zip4j.model.enums.CompressionMethod; import net.lingala.zip4j.model.enums.EncryptionMethod; public class ZIP { public static void zip(AccessEnforcement_Detection detection, String password, String storageFolder) throws Exception { ByteArrayOutputStream bos = null; ZipOutputStream zos = null; try { SimpleDateFormat formato1 = new SimpleDateFormat("yyyy/MM/dd"); SimpleDateFormat formato2 = new SimpleDateFormat("yyyyMMddHHmmssSSS"); CRC32 crc = new CRC32(); bos = new ByteArrayOutputStream(); zos = new ZipOutputStream(new BufferedOutputStream(bos), Licence.decrypt(password).toCharArray()); ZipParameters zipParameters = new ZipParameters(); zipParameters.setCompressionMethod(CompressionMethod.DEFLATE); zipParameters.setCompressionLevel(CompressionLevel.FAST); zipParameters.setEncryptFiles(true); zipParameters.setEncryptionMethod(EncryptionMethod.AES); zipParameters.setAesKeyStrength(AesKeyStrength.KEY_STRENGTH_256); List images = detection.images; // Remove images, we don't want to serialize detection.images = null; // Detection zip entry { byte[] data = Serialization.toPrettyString(detection).getBytes(); zipParameters.setFileNameInZip("detection.json"); crc.reset(); crc.update(data); zipParameters.setEntryCRC(crc.getValue()); zos.putNextEntry(zipParameters); zos.write(data); zos.closeEntry(); } // Images if (images!= null) { for (AccessEnforcement_Detection_Image image : images) { // Write zip entry { zipParameters.setFileNameInZip(image.name + "." + image.format); crc.reset(); crc.update(image.data); zos.putNextEntry(zipParameters); zipParameters.setEntryCRC(crc.getValue()); zos.write(image.data); zos.closeEntry(); } } } // Once finished, adding images again to detection detection.images = images; bos.flush(); bos.close(); zos.flush(); zos.close(); byte[] zipdata = bos.toByteArray(); // Save zip { File destination = new File(storageFolder + "/" + formato1.format(detection.timestamp) + "/" + formato2.format(detection.timestamp) + ".zip"); destination.getParentFile().mkdirs(); Files.write(destination.toPath(), zipdata); } // Save sha { File destination = new File(storageFolder + "/" + formato1.format(detection.timestamp) + "/" + formato2.format(detection.timestamp) + ".sha"); MessageDigest messageDigest = MessageDigest.getInstance("SHA-512"); messageDigest.reset(); messageDigest.update(zipdata); String sha512 = DatatypeConverter.printHexBinary(messageDigest.digest()); Files.write(destination.toPath(), sha512.getBytes()); } } finally { try { bos.close(); } catch (Exception e){}; try { zos.close(); } catch (Exception e){}; } } }