asd
Alejandro Acuña
2024-09-16 816cb391a192e357426312ab8e591fd49d1d242e
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
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){};
        }
        
    }
}