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<AccessEnforcement_Detection_Image> 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){};
|
}
|
|
}
|
}
|