rajah 6 mēneši atpakaļ
vecāks
revīzija
efc1d1a990

+ 1 - 1
src/main/java/fr/triplea/demovote/security/GlobalExceptionHandler.java

@@ -13,7 +13,7 @@ import fr.triplea.demovote.security.jwt.RefreshTokenException;
 public class GlobalExceptionHandler 
 {
 
-  // TODO en mode production, masquer les requêtes SQL (ne pas donner d'indices sur le schema)
+  // TODO : en mode production, masquer les requêtes SQL (ne pas donner d'indices sur le schema)
   
   @ExceptionHandler(value = RefreshTokenException.class)
   @ResponseStatus(HttpStatus.FORBIDDEN)

+ 1 - 1
src/main/java/fr/triplea/demovote/web/controller/AuthController.java

@@ -38,7 +38,7 @@ import jakarta.validation.Valid;
 @RequestMapping("/sign")
 public class AuthController 
 {
-  // TODO: captcha ?
+  // TODO : captcha ?
   
   @SuppressWarnings("unused") 
   private static final Logger LOG = LoggerFactory.getLogger(AuthController.class);

+ 1 - 1
src/main/java/fr/triplea/demovote/web/controller/CategorieController.java

@@ -115,7 +115,7 @@ public class CategorieController
   { 
     Locale locale = localeResolver.resolveLocale(request);
 
-    Categorie c = categorieRepository.getReferenceById(id);
+    Categorie c = categorieRepository.findById(id);
     
     if (c != null)
     {

+ 2 - 2
src/main/java/fr/triplea/demovote/web/controller/ParticipantController.java

@@ -69,7 +69,7 @@ public class ParticipantController
     
     if (choixTri == 1) { return participantRepository.getListOrderedByDateInscription(filtreNom, filtreStatut, filtreArrive); }
     
-    // TODO pagination pour réduire affichage
+    // TODO : pagination pour réduire affichage
     
     return participantRepository.getListOrderedByNom(filtreNom, filtreStatut, filtreArrive);
   }
@@ -362,7 +362,7 @@ public class ParticipantController
   { 
     Locale locale = localeResolver.resolveLocale(request);
 
-    Participant found = participantRepository.getReferenceById(id);
+    Participant found = participantRepository.findById(id);
     
     if (found != null)
     {

+ 1 - 1
src/main/java/fr/triplea/demovote/web/controller/PresentationController.java

@@ -57,7 +57,7 @@ public class PresentationController
   //@SuppressWarnings("unused") 
   private static final Logger LOG = LoggerFactory.getLogger(PresentationController.class);
 
-  // TODO raccourci ouvrir/fermer/calculer les votes
+  // TODO : raccourci ouvrir/fermer/calculer les votes
   
   @Autowired
   private PresentationRepository presentationRepository;

+ 22 - 13
src/main/java/fr/triplea/demovote/web/controller/ProductionController.java

@@ -4,6 +4,7 @@ package fr.triplea.demovote.web.controller;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
+import java.security.MessageDigest;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Locale;
@@ -47,6 +48,7 @@ import fr.triplea.demovote.model.Production;
 import fr.triplea.demovote.model.ProductionType;
 import io.hypersistence.utils.hibernate.type.basic.Inet;
 import jakarta.servlet.http.HttpServletRequest;
+import jakarta.xml.bind.DatatypeConverter;
 
 @RestController
 @RequestMapping("/production")
@@ -90,7 +92,7 @@ public class ProductionController
   @ResponseBody
   public ResponseEntity<Resource> getFile(@PathVariable int id, final Authentication authentication) 
   {
-    // TODO après résultats affichés, download autorisé pour tous
+    // TODO : après résultats affichés, download autorisé pour tous
     
     Production p = productionRepository.findById(id);
     
@@ -321,7 +323,7 @@ public class ProductionController
   }
   @PostMapping(value = "/merge-chunks/{id}")
   @PreAuthorize("hasRole('USER')")
-  public ResponseEntity<Object> merge_chunks(@PathVariable int id, @RequestParam String fileName, @RequestParam int lastChunkIndex, final Authentication authentication, HttpServletRequest request) 
+  public ResponseEntity<Object> merge_chunks(@PathVariable int id, @RequestParam String fileName, @RequestParam int lastChunkIndex, @RequestParam String checksum, final Authentication authentication, HttpServletRequest request) 
   { 
     Locale locale = localeResolver.resolveLocale(request);
 
@@ -349,22 +351,25 @@ public class ProductionController
         
         int num = dir.listFiles().length;
         
-        // TODO : checksum MD5 ?
-        
         if (num == lastChunkIndex)
         {
           FileOutputStream os = null;
-
+          
           try 
           {
-            os = new FileOutputStream(fic);
+            MessageDigest md = MessageDigest.getInstance("MD5");
+            md.reset();
             
+            os = new FileOutputStream(fic);
+
             for (int i = 0; i < num; i++)
             {
               File chk = new File(dir, "chunk_" + i);
               
               byte[] bin = FileUtils.readFileToByteArray(chk);
                             
+              md.update(bin);
+              
               FileOutputStream fos = new FileOutputStream(fic, true);
               fos.write(bin);
               fos.flush();
@@ -375,11 +380,17 @@ public class ProductionController
 
             os.close();
            
-            found.setNomArchive(fileName);
-            found.setNomLocal(nomLocal);
-            found.setNumeroVersion(found.getNumeroVersion() + 1);
+            String digestat = DatatypeConverter.printHexBinary(md.digest());
+                
+            if (checksum.equalsIgnoreCase(digestat)) 
+            {
+              found.setNomArchive(fileName);
+              found.setNomLocal(nomLocal);
+              found.setNumeroVersion(found.getNumeroVersion() + 1);
 
-            succes = true;
+              succes = true;
+            }
+            else { LOG.error(messageSource.getMessage("chunk.checksum.failed", new Object[] { fileName, checksum, digestat }, locale)); }
           }
           catch(Exception e) 
           { 
@@ -415,11 +426,9 @@ public class ProductionController
   @PreAuthorize("hasRole('USER')")
   public ResponseEntity<Object> disableProduction(@PathVariable int id, final Authentication authentication, HttpServletRequest request) 
   { 
-    // TODO : à corriger, session apparemment perdue.
-    
     Locale locale = localeResolver.resolveLocale(request);
 
-    Production found = productionRepository.getReferenceById(id);
+    Production found = productionRepository.findById(id);
     
     if (found != null)
     {

+ 1 - 1
src/main/resources/langs/messages_en.properties

@@ -59,4 +59,4 @@ chunk.upload.failed=Failure uploading chunk {0} of file {1}.
 chunk.merged.success=Succes uploading file {0}.
 chunk.merged.failed=Failure uploading file {0}.
 chunk.count.failed=Count error on {0} file parts (expected: {1}, seen: {2}).
-chunk.hash.md5.failed=Failure checking with MD5 hashing on {0} file (expected: {1}, computed: {2}).
+chunk.checksum.failed=Failure checking with MD5 hashing on {0} file (expected: {1}, computed: {2}).

+ 1 - 1
src/main/resources/langs/messages_fr.properties

@@ -59,4 +59,4 @@ chunk.upload.failed=Echec pour le t
 chunk.merged.success=Succès pour le téléversement du fichier {0}.
 chunk.merged.failed=Echec pour le téléversement fichier {0}.
 chunk.count.failed=Décompte erroné pour les parties du fichier {0} (attendu: {1}, vu: {2}).
-chunk.hash.md5.failed=Echec de la vérification par hachage MD5 du fichier {0} (attendu: {1}, calculé: {2}).
+chunk.checksum.failed=Echec de la vérification par hachage MD5 du fichier {0} (attendu: {1}, calculé: {2}).