diff --git a/src/app/document/controllers/CertificateSignatureController.php b/src/app/document/controllers/CertificateSignatureController.php index 911befdd18f6476c85fe33946976df84c00045fe..dc9d44f2c5da428e03313b5d1aa3a65cde4df23f 100755 --- a/src/app/document/controllers/CertificateSignatureController.php +++ b/src/app/document/controllers/CertificateSignatureController.php @@ -14,75 +14,59 @@ namespace Document\controllers; -use Document\models\DocumentModel; -use Group\controllers\PrivilegeController; -use History\controllers\HistoryController; -use Slim\Http\Request; -use Slim\Http\Response; - class CertificateSignatureController { - public function getHashedCertificate(array $args) + public static $signatureLength = 30000; + + public static function getHashedCertificate(array $args) { - if (isset($_SESSION['tmpDocument'])) { - @unlink($_SESSION['tmpDocument']->getWriter()->getPath()); - } $data = json_decode(file_get_contents('php://input')); - if (!isset($data->certificate)) { - throw new Exception('Missing certificate!'); - } // load the PDF document $document = \SetaPDF_Core_Document::loadByString($args['document']); - // create a signer instance + $signer = new \SetaPDF_Signer($document); - // create a module instance - $module = new \SetaPDF_Signer_Signature_Module_Pades(); // create a certificate instance - $certificate = new \SetaPDF_Signer_X509_Certificate($data->certificate); // pass the user certificate to the module - $module->setCertificate($certificate); // setup information resolver manager + $module = new \SetaPDF_Signer_Signature_Module_Pades(); + $certificate = new \SetaPDF_Signer_X509_Certificate($args['certificate']); + + $module->setCertificate($certificate); + $informationResolverManager = new \SetaPDF_Signer_InformationResolver_Manager(); - $informationResolverManager->addResolver(new \SetaPDF_Signer_InformationResolver_HttpCurlResolver()); $extraCerts = new \SetaPDF_Signer_X509_Collection(); // get issuer certificates - if (isset($data->useAIA) && $data->useAIA) { - $certificates = [$certificate]; - while (count($certificates) > 0) { - /** @var \SetaPDF_Signer_X509_Certificate $currentCertificate */ - $currentCertificate = array_pop($certificates); - /** @var \SetaPDF_Signer_X509_Extension_AuthorityInformationAccess $aia */ - $aia = $currentCertificate->getExtensions()->get(\SetaPDF_Signer_X509_Extension_AuthorityInformationAccess::OID); - if ($aia instanceof \SetaPDF_Signer_X509_Extension_AuthorityInformationAccess) { - foreach ($aia->fetchIssuers($informationResolverManager)->getAll() as $issuer) { - $extraCerts->add($issuer); - $certificates[] = $issuer; - } + $informationResolverManager->addResolver(new \SetaPDF_Signer_InformationResolver_HttpCurlResolver()); + $extraCerts = new \SetaPDF_Signer_X509_Collection(); + + + $certificates = [$certificate]; + while (count($certificates) > 0) { + $currentCertificate = array_pop($certificates); + + $aia = $currentCertificate->getExtensions()->get(\SetaPDF_Signer_X509_Extension_AuthorityInformationAccess::OID); + if ($aia instanceof \SetaPDF_Signer_X509_Extension_AuthorityInformationAccess) { + foreach ($aia->fetchIssuers($informationResolverManager)->getAll() as $issuer) { + $extraCerts->add($issuer); + $certificates[] = $issuer; } } - } $module->setExtraCertificates($extraCerts); $signatureContentLength = 10000; + } + + $module->setExtraCertificates($extraCerts); + $signatureContentLength = CertificateSignatureController::$signatureLength; foreach ($extraCerts->getAll() as $extraCert) { $signatureContentLength += (strlen($extraCert->get(\SetaPDF_Signer_X509_Format::DER)) * 2); - } $signer->setSignatureContentLength($signatureContentLength); unset($_SESSION['tsUrl']); - // get timestamp information and use it - if (isset($data->useTimestamp) && $data->useTimestamp) { - /** @var \SetaPDF_Signer_X509_Extension_TimeStamp $ts */ - $ts = $certificate->getExtensions()->get(\SetaPDF_Signer_X509_Extension_TimeStamp::OID); - if ($ts && $ts->getVersion() === 1 && $ts->requiresAuth() === false) { - $_SESSION['tsUrl'] = $ts->getLocation(); - $signer->setSignatureContentLength($signatureContentLength + 6000); - } - } // you may use an own temporary file handler - $tempPath = \SetaPDF_Core_Writer_TempFile::createTempPath(); // prepare the PDF - $_SESSION['tmpDocument'] = $signer->preSign( + } + $signer->setSignatureContentLength($signatureContentLength); + + $ts = $certificate->getExtensions()->get(\SetaPDF_Signer_X509_Extension_TimeStamp::OID); + if ($ts && $ts->getVersion() === 1 && $ts->requiresAuth() === false) { + $signer->setSignatureContentLength($signatureContentLength + 6000); + } + + $tempPath = \SetaPDF_Core_Writer_TempFile::createTempPath(); + $tmpDocument = $signer->preSign( new \SetaPDF_Core_Writer_File($tempPath), $module - ); $_SESSION['module'] = $module; // prepare the response - $responseData = [ - 'dataToSign' => \SetaPDF_Core_Type_HexString::str2hex( - $module->getDataToSign($_SESSION['tmpDocument']->getHashFile()) - ), - 'extraCerts' => array_map(function (\SetaPDF_Signer_X509_Certificate $cert) { - return $cert->get(\SetaPDF_Signer_X509_Format::PEM); - }, $extraCerts->getAll()), - 'tsUrl' => isset($_SESSION['tsUrl']) ? $_SESSION['tsUrl'] : false - ]; // send it -// header('Content-Type: application/json; charset=utf-8'); -// echo json_encode($response); - return $response->withJson($responseData); - break; // This action embeddeds the signature in the CMS container - // and optionally requests and embeds the timestamp } + ); + + return [ + 'dataToSign' => \SetaPDF_Core_Type_HexString::str2hex($module->getDataToSign($tmpDocument->getHashFile())), + 'signatureContentLength' => $signatureContentLength + ]; + } } diff --git a/src/app/document/controllers/DocumentController.php b/src/app/document/controllers/DocumentController.php index 834c35155cc91a7520b926fa62f960d426ff85b9..44611742e75155812694ca76de0095ce575c5dc3 100755 --- a/src/app/document/controllers/DocumentController.php +++ b/src/app/document/controllers/DocumentController.php @@ -660,7 +660,8 @@ class DocumentController } if ($workflow['signature_mode'] == 'rgs_2stars' ) { - + $hashInformations = CertificateSignatureController::getHashedCertificate(['document' => $fileContent, 'certificate' => $body['certificate']]); + return $response->withJson($hashInformations); } }