Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
26 / 26
100.00% covered (success)
100.00%
2 / 2
CRAP
100.00% covered (success)
100.00%
1 / 1
RevokeClickToSignCertificateListener
100.00% covered (success)
100.00%
26 / 26
100.00% covered (success)
100.00%
2 / 2
7
100.00% covered (success)
100.00%
1 / 1
 __construct
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 handle
100.00% covered (success)
100.00%
25 / 25
100.00% covered (success)
100.00%
1 / 1
6
1<?php
2
3declare(strict_types=1);
4
5/**
6 * SPDX-FileCopyrightText: 2026 LibreCode coop and LibreCode contributors
7 * SPDX-License-Identifier: AGPL-3.0-or-later
8 */
9
10namespace OCA\Libresign\Listener;
11
12use DateTime;
13use OCA\Libresign\Enum\CRLReason;
14use OCA\Libresign\Events\SignedEvent;
15use OCA\Libresign\Service\Crl\CrlService;
16use OCP\EventDispatcher\Event;
17use OCP\EventDispatcher\IEventListener;
18use Override;
19use Psr\Log\LoggerInterface;
20
21/**
22 * @template-implements IEventListener<SignedEvent>
23 */
24class RevokeClickToSignCertificateListener implements IEventListener {
25    public function __construct(
26        private CrlService $crlService,
27        private LoggerInterface $logger,
28    ) {
29    }
30
31    #[Override]
32    public function handle(Event $event): void {
33        if (!($event instanceof SignedEvent)) {
34            return;
35        }
36
37        if (!$event->wasSignedWithoutPassword()) {
38            return;
39        }
40
41        $serialNumber = $event->getCertificateSerialNumber();
42        if ($serialNumber === null || $serialNumber === '') {
43            $this->logger->warning('Unable to revoke click-to-sign certificate: serial number not found');
44            return;
45        }
46
47        $success = $this->crlService->revokeCertificate(
48            $serialNumber,
49            CRLReason::SUPERSEDED,
50            'Temporary certificate issued for click-to-sign. Automatically revoked after document signing.',
51            'system',
52            null,
53            new DateTime('+1 second'),
54        );
55
56        if ($success) {
57            $this->logger->debug('Successfully revoked click-to-sign certificate', [
58                'serial' => $serialNumber,
59                'signRequestId' => $event->getSignRequest()->getId(),
60            ]);
61        } else {
62            $this->logger->warning('Failed to revoke click-to-sign certificate', [
63                'serial' => $serialNumber,
64                'signRequestId' => $event->getSignRequest()->getId(),
65            ]);
66        }
67    }
68}