Skip to content

Commit 4853369

Browse files
committed
fix: address native validator review feedback
Signed-off-by: Vitor Mattos <[email protected]>
1 parent 9ab4686 commit 4853369

4 files changed

Lines changed: 33 additions & 24 deletions

File tree

composer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@
6363
"require": {
6464
"cweagans/composer-patches": "^2.0",
6565
"jeidison/signer-php": "^1.0",
66-
"libresign/pdf-signature-validator": "0.2.0",
66+
"libresign/pdf-signature-validator": "^0.2.0",
6767
"phpseclib/phpseclib": "^3.0"
6868
}
6969
}

composer.lock

Lines changed: 7 additions & 7 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/Handler/SignEngine/Pkcs12Handler.php

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@
99
namespace OCA\Libresign\Handler\SignEngine;
1010

1111
use LibreSign\PdfSignatureValidator\Parser\PdfSignatureExtractor;
12+
use LibreSign\PdfSignatureValidator\Model\ValidationReason;
13+
use LibreSign\PdfSignatureValidator\Model\ValidationResult;
14+
use LibreSign\PdfSignatureValidator\Model\ValidationState;
1215
use OCA\Libresign\AppInfo\Application;
1316
use OCA\Libresign\Exception\LibresignException;
1417
use OCA\Libresign\Handler\CertificateEngine\CertificateEngineFactory;
@@ -93,27 +96,31 @@ public function setIsLibreSignFile(): void {
9396
public function getCertificateChain($resource): array {
9497
$certificates = [];
9598
$nativeMetadata = array_values($this->extractNativeSignatureMetadata($resource));
99+
rewind($resource);
96100
$nativeValidation = array_values($this->pdfSignatureValidationService->validateFromResource($resource));
97101
$index = 0;
98102

99103
foreach ($this->getSignatures($resource) as $signature) {
104+
$metadata = $nativeMetadata[$index] ?? [];
105+
$validation = $nativeValidation[$index] ?? [];
106+
$index++;
107+
100108
if (!$signature) {
101109
continue;
102110
}
103111

104112
$result = $this->processSignature(
105113
$resource,
106114
$signature,
107-
$nativeMetadata[$index] ?? ($nativeMetadata[0] ?? []),
108-
$nativeValidation[$index] ?? ($nativeValidation[0] ?? [])
115+
$metadata,
116+
$validation
109117
);
110118

111119
if (empty($result['chain'])) {
112120
continue;
113121
}
114122

115123
$certificates[] = $result;
116-
$index++;
117124
}
118125
return $certificates;
119126
}
@@ -304,7 +311,7 @@ private function enrichLeafWithNativeData(array $result, array $metadata, array
304311
$signatureValidation = $validation['signatureValidation'];
305312

306313
// Keep legacy OpenSSL result when native validator reports this known false-positive.
307-
if (!$this->isDigestMismatchSignatureValidation($signatureValidation)) {
314+
if (!$this->isDigestMismatchSignatureValidation($validation)) {
308315
$leaf['signature_validation'] = $signatureValidation;
309316
}
310317
}
@@ -327,9 +334,15 @@ private function enrichLeafWithNativeData(array $result, array $metadata, array
327334
* signer engines can produce signatures that the native validator currently flags as digest mismatch.
328335
* In this case we preserve the legacy validation computed from the PKCS#7 signature.
329336
*/
330-
private function isDigestMismatchSignatureValidation(array $signatureValidation): bool {
331-
return ($signatureValidation['id'] ?? null) === 3
332-
&& ($signatureValidation['label'] ?? '') === 'Digest mismatch.';
337+
private function isDigestMismatchSignatureValidation(array $validation): bool {
338+
$rawSignatureValidation = $validation['raw']['signature'] ?? null;
339+
if ($rawSignatureValidation instanceof ValidationResult) {
340+
return $rawSignatureValidation->reasonCode === ValidationReason::DIGEST_MISMATCH
341+
|| $rawSignatureValidation->state === ValidationState::DIGEST_MISMATCH;
342+
}
343+
344+
$signatureValidation = $validation['signatureValidation'] ?? null;
345+
return is_array($signatureValidation) && ($signatureValidation['id'] ?? null) === 3;
333346
}
334347

335348
/**

lib/Service/Signature/PdfSignatureValidationService.php

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88

99
namespace OCA\Libresign\Service\Signature;
1010

11-
use DateTime;
1211
use LibreSign\PdfSignatureValidator\Model\ValidationResult;
1312
use LibreSign\PdfSignatureValidator\Model\ValidationState;
1413
use LibreSign\PdfSignatureValidator\Parser\PdfSignatureValidator;
@@ -73,13 +72,12 @@ public function setTrustedRoots(array $certificates): void {
7372
* Validate PDF signatures from file resource.
7473
*
7574
* @param resource $resource PDF file resource
76-
* @param ?\DateTime $signatureTime Optional time to validate against (for historic validation)
7775
* @return list<array{signatureValidation: array, certificateValidation: array, raw: array{signature: ValidationResult, certificate: ValidationResult}}>
7876
*/
79-
public function validateFromResource($resource, ?DateTime $signatureTime = null): array {
77+
public function validateFromResource($resource): array {
8078
try {
8179
$results = $this->validator->validateFromResource($resource);
82-
return $this->mapValidationResults($results, $signatureTime);
80+
return $this->mapValidationResults($results);
8381
} catch (\Throwable $e) {
8482
$this->logger->warning('PDF signature validation failed', [
8583
'error' => $e->getMessage(),
@@ -93,13 +91,12 @@ public function validateFromResource($resource, ?DateTime $signatureTime = null)
9391
* Validate PDF signatures from binary content.
9492
*
9593
* @param string $pdfContent Binary PDF content
96-
* @param ?\DateTime $signatureTime Optional time to validate against (for historic validation)
9794
* @return list<array{signatureValidation: array, certificateValidation: array, raw: array{signature: ValidationResult, certificate: ValidationResult}}>
9895
*/
99-
public function validateFromString(string $pdfContent, ?DateTime $signatureTime = null): array {
96+
public function validateFromString(string $pdfContent): array {
10097
try {
10198
$results = $this->validator->validateFromString($pdfContent);
102-
return $this->mapValidationResults($results, $signatureTime);
99+
return $this->mapValidationResults($results);
103100
} catch (\Throwable $e) {
104101
$this->logger->warning('PDF signature validation failed', [
105102
'error' => $e->getMessage(),
@@ -113,10 +110,9 @@ public function validateFromString(string $pdfContent, ?DateTime $signatureTime
113110
* Map validation results from PdfSignatureValidator to LibreSign format.
114111
*
115112
* @param list<array> $results Results from PdfSignatureValidator
116-
* @param ?\DateTime $signatureTime
117113
* @return list<array{signatureValidation: array, certificateValidation: array, raw: array{signature: ValidationResult, certificate: ValidationResult}}>
118114
*/
119-
private function mapValidationResults(array $results, ?DateTime $signatureTime = null): array {
115+
private function mapValidationResults(array $results): array {
120116
$mapped = [];
121117

122118
foreach ($results as $result) {

0 commit comments

Comments
 (0)