Skip to content

Commit 502159a

Browse files
committed
feat(signing): enforce fail-closed CRL revocation check
Replaces the old string comparison with a CrlValidationStatus enum switch. VALID and DISABLED pass through; REVOKED raises the existing 'Certificate has been revoked' error; every other status (urls_inaccessible, validation_failed, …) raises 'Certificate revocation status could not be verified' – fail-closed to prevent signing with an unverifiable certificate. Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
1 parent 4629bbe commit 502159a

1 file changed

Lines changed: 19 additions & 1 deletion

File tree

lib/Service/IdentifyMethod/SignatureMethod/Password.php

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
namespace OCA\Libresign\Service\IdentifyMethod\SignatureMethod;
1010

11+
use OCA\Libresign\Enum\CrlValidationStatus;
1112
use OCA\Libresign\Exception\InvalidPasswordException;
1213
use OCA\Libresign\Exception\LibresignException;
1314
use OCA\Libresign\Handler\SignEngine\Pkcs12Handler;
@@ -44,9 +45,26 @@ public function validateToSign(): void {
4445
}
4546

4647
private function validateCertificateRevocation(array $certificateData): void {
47-
if (array_key_exists('crl_validation', $certificateData) && $certificateData['crl_validation'] !== 'valid') {
48+
if (!array_key_exists('crl_validation', $certificateData)) {
49+
return;
50+
}
51+
$status = $certificateData['crl_validation'];
52+
if ($status === CrlValidationStatus::VALID) {
53+
return;
54+
}
55+
if ($status === CrlValidationStatus::REVOKED) {
4856
throw new LibresignException($this->identifyService->getL10n()->t('Certificate has been revoked'), 400);
4957
}
58+
// Admin explicitly disabled external CRL validation – allow signing.
59+
if ($status === CrlValidationStatus::DISABLED) {
60+
return;
61+
}
62+
// Any other status (urls_inaccessible, validation_failed, validation_error, etc.):
63+
// fail-closed – we cannot confirm the certificate is not revoked.
64+
throw new LibresignException(
65+
$this->identifyService->getL10n()->t('Certificate revocation status could not be verified'),
66+
400
67+
);
5068
}
5169

5270
private function validateCertificateExpiration(array $certificateData): void {

0 commit comments

Comments
 (0)