From 3d46e510ff095f9cd7aedac111dce16d3c08aad7 Mon Sep 17 00:00:00 2001
From: Jean-Laurent DUZANT <jean-laurent.duzant@xelians.fr>
Date: Mon, 13 Mar 2023 15:54:12 +0100
Subject: [PATCH] FIX #23967 TIME 0:45 implement check before adding a
 watermark

---
 .../controllers/WatermarkController.php       | 38 +++++++++++++++++++
 1 file changed, 38 insertions(+)

diff --git a/src/app/document/controllers/WatermarkController.php b/src/app/document/controllers/WatermarkController.php
index bc04049355..d7781cf751 100644
--- a/src/app/document/controllers/WatermarkController.php
+++ b/src/app/document/controllers/WatermarkController.php
@@ -60,10 +60,16 @@ class WatermarkController
             require_once($libPath);
         }
 
+        $fileContent = null;
         try {
             $watermarkFile = CoreConfigModel::getTmpPath() . "tmp_file_{$GLOBALS['id']}_" .rand(). "_watermark.pdf";
             file_put_contents($watermarkFile, base64_decode($args['encodedDocument']));
 
+            $isSigned = WatermarkController::checkDocumentSignatureField(['encodedDocument' => $args['encodedDocument']]);
+            if(!empty($isSigned)) {
+                return $fileContent;
+            }
+
             $pdf = new Fpdi('P', 'pt');
             $nbPages = $pdf->setSourceFile($watermarkFile);
             $pdf->setPrintHeader(false);
@@ -81,8 +87,40 @@ class WatermarkController
             $fileContent = $pdf->Output('', 'S');
         } catch (\Exception $e) {
             $fileContent = null;
+            var_dump($e);
         }
 
         return $fileContent;
     }
+
+    public static function checkDocumentSignatureField(array $args)
+    {
+        $libDir = CoreConfigModel::getLibrariesDirectory();
+        $alreadySigned = false;
+
+        if (!empty($libDir) && is_file($libDir . 'SetaPDF-FormFiller-Full/library/SetaPDF/Autoload.php')) {
+            require_once($libDir . 'SetaPDF-FormFiller-Full/library/SetaPDF/Autoload.php');
+
+            $targetFile = CoreConfigModel::getTmpPath() . "tmp_file_{$GLOBALS['id']}_" . rand() . "_target_watermark.pdf";
+            file_put_contents($targetFile, base64_decode($args['encodedDocument']));
+            $document = \SetaPDF_Core_Document::loadByFilename($targetFile);
+
+            $formFiller = new \SetaPDF_FormFiller($document);
+            $fields = $formFiller->getFields();
+            $allFields = $fields->getAll();
+
+            foreach ($allFields as $fieldValue) {
+                if ($fieldValue instanceof \SetaPDF_FormFiller_Field_Signature) {
+                    $alreadySigned = true;
+                    break;
+                }
+            }
+            // Release objects to free memory and cycled references.
+            // After calling this method the instance of $document is unusable!
+            $document->cleanUp();
+            unlink($targetFile);
+        }
+
+        return $alreadySigned;
+    }
 }
-- 
GitLab