• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

LibreSign / libresign / 20070678290

09 Dec 2025 04:24PM UTC coverage: 43.947%. First build
20070678290

Pull #6060

github

web-flow
Merge 6955ae2e9 into abd1a97d1
Pull Request #6060: feat: improve java encoding check

0 of 25 new or added lines in 1 file covered. (0.0%)

5688 of 12943 relevant lines covered (43.95%)

5.11 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

2.7
/lib/Service/Install/ConfigureCheckService.php
1
<?php
2

3
declare(strict_types=1);
4
/**
5
 * SPDX-FileCopyrightText: 2020-2024 LibreCode coop and contributors
6
 * SPDX-License-Identifier: AGPL-3.0-or-later
7
 */
8

9
namespace OCA\Libresign\Service\Install;
10

11
use OC\AppConfig;
12
use OC\SystemConfig;
13
use OCA\Libresign\AppInfo\Application;
14
use OCA\Libresign\Handler\CertificateEngine\CertificateEngineFactory;
15
use OCA\Libresign\Handler\SignEngine\JSignPdfHandler;
16
use OCA\Libresign\Helper\ConfigureCheckHelper;
17
use OCA\Libresign\Helper\JavaHelper;
18
use OCP\App\IAppManager;
19
use OCP\IAppConfig;
20
use OCP\IURLGenerator;
21
use Psr\Log\LoggerInterface;
22

23
class ConfigureCheckService {
24
        private string $architecture;
25
        private bool $isCacheDisabled = false;
26
        private array $result = [];
27
        public function __construct(
28
                private IAppConfig $appConfig,
29
                private SystemConfig $systemConfig,
30
                private AppConfig $ocAppConfig,
31
                protected IAppManager $appManager,
32
                protected IURLGenerator $urlGenerator,
33
                private JSignPdfHandler $jSignPdfHandler,
34
                private CertificateEngineFactory $certificateEngineFactory,
35
                private SignSetupService $signSetupService,
36
                private LoggerInterface $logger,
37
                protected JavaHelper $javaHelper,
38
        ) {
39
                $this->architecture = php_uname('m');
7✔
40
        }
41

42
        public function disableCache(): void {
43
                $this->isCacheDisabled = true;
×
44
        }
45

46
        /**
47
         * Get result of all checks
48
         *
49
         * @return ConfigureCheckHelper[]
50
         */
51
        public function checkAll(): array {
52
                if ($this->isCacheDisabled) {
×
53
                        $this->ocAppConfig->clearCache();
×
54
                }
55
                $result = [];
×
56
                $result = array_merge($result, $this->checkSign());
×
57
                $result = array_merge($result, $this->checkCertificate());
×
58
                return $result;
×
59
        }
60

61
        /**
62
         * Check all requirements to sign
63
         *
64
         * @return ConfigureCheckHelper[]
65
         */
66
        public function checkSign(): array {
67
                $return = [];
×
68
                $return = array_merge($return, $this->checkJava());
×
69
                $return = array_merge($return, $this->checkPdftk());
×
70
                $return = array_merge($return, $this->checkJSignPdf());
×
71
                $return = array_merge($return, $this->checkPoppler());
×
72
                $return = array_merge($return, $this->checkImagick());
×
73
                return $return;
×
74
        }
75

76
        public function checkPoppler(): array {
77
                $return = $this->checkPdfSig();
×
78
                $return = array_merge($return, $this->checkPdfinfo());
×
79
                return $return;
×
80
        }
81

82
        public function checkPdfSig(): array {
83
                if (!empty($this->result['poppler'])) {
×
84
                        return $this->result['poppler'];
×
85
                }
86
                // The output of this command go to STDERR and exec get the STDOUT
87
                // With 2>&1 the STRERR is redirected to STDOUT
88
                exec('pdfsig -v 2>&1', $version, $retval);
×
89
                if ($retval !== 0) {
×
90
                        return $this->result['poppler'] = [
×
91
                                (new ConfigureCheckHelper())
×
92
                                        ->setInfoMessage('Poppler utils not installed')
×
93
                                        ->setResource('pdfsig')
×
94
                                        ->setTip('Install the package poppler-utils at your operational system to be possible get more details about validation of signatures.'),
×
95
                        ];
×
96
                }
97
                if (!$version) {
×
98
                        return $this->result['poppler'] = [
×
99
                                (new ConfigureCheckHelper())
×
100
                                        ->setErrorMessage('Fail to retrieve pdfsig version')
×
101
                                        ->setResource('pdfsig')
×
102
                                        ->setTip("The command <pdfsig -v> executed by PHP haven't any output."),
×
103
                        ];
×
104
                }
105
                $returnValue = preg_match('/pdfsig version (?<version>.*)/', implode(PHP_EOL, $version), $matches);
×
106
                if ($returnValue !== 1) {
×
107
                        return $this->result['poppler'] = [
×
108
                                (new ConfigureCheckHelper())
×
109
                                        ->setErrorMessage('Fail to retrieve pdfsig version')
×
110
                                        ->setResource('pdfsig')
×
111
                                        ->setTip("This is a poppler-utils dependency and wasn't possible to parse the output of command pdfsig -v"),
×
112
                        ];
×
113
                }
114
                return $this->result['poppler'] = [(new ConfigureCheckHelper())
×
115
                        ->setSuccessMessage('pdfsig version: ' . $matches['version'])
×
116
                        ->setResource('pdfsig')
×
117
                ];
×
118
        }
119

120
        public function checkPdfinfo(): array {
121
                if (!empty($this->result['pdfinfo'])) {
×
122
                        return $this->result['pdfinfo'];
×
123
                }
124
                // The output of this command go to STDERR and exec get the STDOUT
125
                // With 2>&1 the STRERR is redirected to STDOUT
126
                exec('pdfinfo -v 2>&1', $version, $retval);
×
127
                if ($retval !== 0) {
×
128
                        return $this->result['pdfinfo'] = [
×
129
                                (new ConfigureCheckHelper())
×
130
                                        ->setInfoMessage('Poppler utils not installed')
×
131
                                        ->setResource('pdfinfo')
×
132
                                        ->setTip('Install the package poppler-utils at your operational system have a fallback to fetch page dimensions.'),
×
133
                        ];
×
134
                }
135
                if (!$version) {
×
136
                        return $this->result['pdfinfo'] = [
×
137
                                (new ConfigureCheckHelper())
×
138
                                        ->setErrorMessage('Fail to retrieve pdfinfo version')
×
139
                                        ->setResource('pdfinfo')
×
140
                                        ->setTip("The command <pdfinfo -v> executed by PHP haven't any output."),
×
141
                        ];
×
142
                }
143
                $returnValue = preg_match('/pdfinfo version (?<version>.*)/', implode(PHP_EOL, $version), $matches);
×
144
                if (!$returnValue) {
×
145
                        return $this->result['pdfinfo'] = [
×
146
                                (new ConfigureCheckHelper())
×
147
                                        ->setErrorMessage('Fail to retrieve pdfinfo version')
×
148
                                        ->setResource('pdfinfo')
×
149
                                        ->setTip("This is a poppler-utils dependency and wasn't possible to parse the output of command pdfinfo -v"),
×
150
                        ];
×
151
                }
152
                return $this->result['pdfinfo'] = [(new ConfigureCheckHelper())
×
153
                        ->setSuccessMessage('pdfinfo version: ' . $matches['version'])
×
154
                        ->setResource('pdfinfo')
×
155
                ];
×
156
        }
157

158
        /**
159
         * Check all requirements to use JSignPdf
160
         *
161
         * @return ConfigureCheckHelper[]
162
         */
163
        public function checkJSignPdf(): array {
164
                if (!empty($this->result['jsignpdf'])) {
×
165
                        return $this->result['jsignpdf'];
×
166
                }
167
                $jsignpdJarPath = $this->appConfig->getValueString(Application::APP_ID, 'jsignpdf_jar_path');
×
168
                if ($jsignpdJarPath) {
×
169
                        $resultOfVerify = $this->verify('jsignpdf');
×
170
                        if (count($resultOfVerify)) {
×
171
                                [$errorMessage, $tip] = $this->getErrorAndTipToResultOfVerify($resultOfVerify, 'jsignpdf');
×
172
                                return $this->result['jsignpdf'] = [
×
173
                                        (new ConfigureCheckHelper())
×
174
                                                ->setErrorMessage($errorMessage)
×
175
                                                ->setResource('jsignpdf')
×
176
                                                ->setTip($tip),
×
177
                                ];
×
178
                        }
179
                        if (file_exists($jsignpdJarPath)) {
×
180
                                if (!$this->isJavaOk()) {
×
181
                                        return $this->result['jsignpdf'] = [
×
182
                                                (new ConfigureCheckHelper())
×
183
                                                        ->setErrorMessage('Necessary Java to run JSignPdf')
×
184
                                                        ->setResource('jsignpdf')
×
185
                                                        ->setTip('Run occ libresign:install --java'),
×
186
                                        ];
×
187
                                }
188
                                $jsignPdf = $this->jSignPdfHandler->getJSignPdf();
×
189
                                $jsignPdf->setParam($this->jSignPdfHandler->getJSignParam());
×
190
                                $currentVersion = $jsignPdf->getVersion();
×
191
                                $return = [];
×
192
                                if ($currentVersion < InstallService::JSIGNPDF_VERSION) {
×
193
                                        if (!$currentVersion) {
×
194
                                                $message = 'Necessary install the version ' . InstallService::JSIGNPDF_VERSION;
×
195
                                        } else {
196
                                                $message = 'Necessary bump JSignPdf versin from ' . $currentVersion . ' to ' . InstallService::JSIGNPDF_VERSION;
×
197
                                        }
198
                                        $return[] = (new ConfigureCheckHelper())
×
199
                                                ->setErrorMessage($message)
×
200
                                                ->setResource('jsignpdf')
×
201
                                                ->setTip('Run occ libresign:install --jsignpdf');
×
202
                                }
203
                                if ($currentVersion > InstallService::JSIGNPDF_VERSION) {
×
204
                                        $return[] = (new ConfigureCheckHelper())
×
205
                                                ->setErrorMessage('Necessary downgrade JSignPdf versin from ' . $currentVersion . ' to ' . InstallService::JSIGNPDF_VERSION)
×
206
                                                ->setResource('jsignpdf')
×
207
                                                ->setTip('Run occ libresign:install --jsignpdf');
×
208
                                }
209
                                $return[] = (new ConfigureCheckHelper())
×
210
                                        ->setSuccessMessage('JSignPdf version: ' . $currentVersion)
×
211
                                        ->setResource('jsignpdf');
×
212
                                $return[] = (new ConfigureCheckHelper())
×
213
                                        ->setSuccessMessage('JSignPdf path: ' . $jsignpdJarPath)
×
214
                                        ->setResource('jsignpdf');
×
215
                                return $return;
×
216
                        }
217
                        return $this->result['jsignpdf'] = [
×
218
                                (new ConfigureCheckHelper())
×
219
                                        ->setErrorMessage('JSignPdf binary not found: ' . $jsignpdJarPath)
×
220
                                        ->setResource('jsignpdf')
×
221
                                        ->setTip('Run occ libresign:install --jsignpdf'),
×
222
                        ];
×
223
                }
224
                return $this->result['jsignpdf'] = [
×
225
                        (new ConfigureCheckHelper())
×
226
                                ->setErrorMessage('JSignPdf not found')
×
227
                                ->setResource('jsignpdf')
×
228
                                ->setTip('Run occ libresign:install --jsignpdf'),
×
229
                ];
×
230
        }
231

232
        /**
233
         * Check all requirements to use PDFtk
234
         *
235
         * @return ConfigureCheckHelper[]
236
         */
237
        public function checkPdftk(): array {
238
                if (!empty($this->result['pdftk'])) {
×
239
                        return $this->result['pdftk'];
×
240
                }
241
                $pdftkPath = $this->appConfig->getValueString(Application::APP_ID, 'pdftk_path');
×
242
                if ($pdftkPath) {
×
243
                        $resultOfVerify = $this->verify('pdftk');
×
244
                        if (count($resultOfVerify)) {
×
245
                                [$errorMessage, $tip] = $this->getErrorAndTipToResultOfVerify($resultOfVerify, 'pdftk');
×
246
                                return $this->result['pdftk'] = [
×
247
                                        (new ConfigureCheckHelper())
×
248
                                                ->setErrorMessage($errorMessage)
×
249
                                                ->setResource('pdftk')
×
250
                                                ->setTip($tip),
×
251
                                ];
×
252
                        }
253
                        if (file_exists($pdftkPath)) {
×
254
                                if (!$this->isJavaOk()) {
×
255
                                        return $this->result['pdftk'] = [
×
256
                                                (new ConfigureCheckHelper())
×
257
                                                        ->setErrorMessage('Necessary Java to run PDFtk')
×
258
                                                        ->setResource('jsignpdf')
×
259
                                                        ->setTip('Run occ libresign:install --java'),
×
260
                                        ];
×
261
                                }
262
                                $javaPath = $this->javaHelper->getJavaPath();
×
263
                                $version = [];
×
264
                                \exec($javaPath . ' -jar ' . $pdftkPath . ' --version 2>&1', $version, $resultCode);
×
265
                                if ($resultCode !== 0) {
×
266
                                        return $this->result['pdftk'] = [
×
267
                                                (new ConfigureCheckHelper())
×
268
                                                        ->setErrorMessage('Failure to check PDFtk version.')
×
269
                                                        ->setResource('java')
×
270
                                                        ->setTip('Run occ libresign:install --pdftk'),
×
271
                                        ];
×
272
                                }
273
                                if (isset($version[0])) {
×
274
                                        preg_match('/pdftk port to java (?<version>.*) a Handy Tool/', $version[0], $matches);
×
275
                                        if (isset($matches['version'])) {
×
276
                                                if ($matches['version'] === InstallService::PDFTK_VERSION) {
×
277
                                                        return $this->result['pdftk'] = [
×
278
                                                                $this->result['pdftk'][] = (new ConfigureCheckHelper())
×
279
                                                                        ->setSuccessMessage('PDFtk version: ' . InstallService::PDFTK_VERSION)
×
280
                                                                        ->setResource('pdftk'),
×
281
                                                                $this->result['pdftk'][] = (new ConfigureCheckHelper())
×
282
                                                                        ->setSuccessMessage('PDFtk path: ' . $pdftkPath)
×
283
                                                                        ->setResource('pdftk'),
×
284
                                                        ];
×
285
                                                }
286
                                                $message = 'Necessary install the version ' . InstallService::PDFTK_VERSION;
×
287
                                                return $this->result['pdftk'] = [
×
288
                                                        (new ConfigureCheckHelper())
×
289
                                                                ->setErrorMessage($message)
×
290
                                                                ->setResource('jsignpdf')
×
291
                                                                ->setTip('Run occ libresign:install --jsignpdf')
×
292
                                                ];
×
293
                                        }
294
                                }
295
                                return $this->result['pdftk'] = [
×
296
                                        (new ConfigureCheckHelper())
×
297
                                                ->setErrorMessage('PDFtk binary is invalid: ' . $pdftkPath)
×
298
                                                ->setResource('pdftk')
×
299
                                                ->setTip('Run occ libresign:install --pdftk'),
×
300
                                ];
×
301
                        }
302
                        return $this->result['pdftk'] = [
×
303
                                (new ConfigureCheckHelper())
×
304
                                        ->setErrorMessage('PDFtk binary not found: ' . $pdftkPath)
×
305
                                        ->setResource('pdftk')
×
306
                                        ->setTip('Run occ libresign:install --pdftk'),
×
307
                        ];
×
308
                }
309
                return $this->result['pdftk'] = [
×
310
                        (new ConfigureCheckHelper())
×
311
                                ->setErrorMessage('PDFtk not found')
×
312
                                ->setResource('pdftk')
×
313
                                ->setTip('Run occ libresign:install --pdftk'),
×
314
                ];
×
315
        }
316

317
        public function isDebugEnabled(): bool {
318
                return $this->systemConfig->getValue('debug', false) === true;
×
319
        }
320

321
        private function verify(string $resource): array {
322
                $this->signSetupService->willUseLocalCert($this->isDebugEnabled());
×
323
                $result = $this->signSetupService->verify($this->architecture, $resource);
×
324
                if (count($result) === 1 && $this->isDebugEnabled()) {
×
325
                        if (isset($result['SIGNATURE_DATA_NOT_FOUND'])) {
×
326
                                return [];
×
327
                        }
328
                        if (isset($result['EMPTY_SIGNATURE_DATA'])) {
×
329
                                return [];
×
330
                        }
331
                }
332
                return $result;
×
333
        }
334

335
        private function getErrorAndTipToResultOfVerify(array $result, string $resource): array {
336
                if (count($result) === 1 && !$this->isDebugEnabled()) {
×
337
                        if (isset($result['SIGNATURE_DATA_NOT_FOUND'])) {
×
338
                                return [
×
339
                                        'Signature data not found.',
×
340
                                        "Sounds that you are running from source code of LibreSign.\nEnable debug mode by: occ config:system:set debug --value true --type boolean",
×
341
                                ];
×
342
                        }
343
                        if (isset($result['EMPTY_SIGNATURE_DATA'])) {
×
344
                                return [
×
345
                                        'Your signature data is empty.',
×
346
                                        "Sounds that you are running from source code of LibreSign.\nEnable debug mode by: occ config:system:set debug --value true --type boolean",
×
347
                                ];
×
348
                        }
349
                }
350
                if (isset($result['HASH_FILE_ERROR'])) {
×
351
                        if ($this->isDebugEnabled()) {
×
352
                                return [
×
353
                                        'Invalid hash of binaries files.',
×
354
                                        'Debug mode is enabled at your config.php and your LibreSign app was signed using a production signature. If you are not working at development of LibreSign, disable your debug mode or run the command: occ libresign install --' . $resource . ' --use-local-cert',
×
355
                                ];
×
356
                        }
357
                }
358
                $this->logger->error('Invalid hash of binaries files', ['result' => $result]);
×
359
                if ($this->appManager->isEnabledForUser('logreader')) {
×
360
                        return [
×
361
                                'Invalid hash of binaries files.',
×
362
                                'Check your nextcloud.log file on '
×
363
                                . $this->urlGenerator->linkToRouteAbsolute('settings.adminsettings.form', ['section' => 'logging'])
×
364
                                . ' and run occ libresign:install --all',
×
365
                        ];
×
366
                }
367
                return [
×
368
                        'Invalid hash of binaries files.',
×
369
                        'Check your nextcloud.log file and run occ libresign:install --all',
×
370
                ];
×
371
        }
372

373
        /**
374
         * Check all requirements to use Java
375
         *
376
         * @return ConfigureCheckHelper[]
377
         */
378
        private function checkJava(): array {
379
                if (!empty($this->result['java'])) {
×
380
                        return $this->result['java'];
×
381
                }
382
                $javaPath = $this->javaHelper->getJavaPath();
×
383
                if ($javaPath) {
×
384
                        $resultOfVerify = $this->verify('java');
×
385
                        if (count($resultOfVerify)) {
×
386
                                [$errorMessage, $tip] = $this->getErrorAndTipToResultOfVerify($resultOfVerify, 'java');
×
387
                                return $this->result['java'] = [
×
388
                                        (new ConfigureCheckHelper())
×
389
                                                ->setErrorMessage($errorMessage)
×
390
                                                ->setResource('java')
×
391
                                                ->setTip($tip),
×
392
                                ];
×
393
                        }
394
                        if (file_exists($javaPath)) {
×
395
                                \exec($javaPath . ' -version 2>&1', $javaVersion, $resultCode);
×
396
                                if (empty($javaVersion)) {
×
397
                                        return $this->result['java'] = [
×
398
                                                (new ConfigureCheckHelper())
×
399
                                                        ->setErrorMessage(
×
400
                                                                'Failed to execute Java. Sounds that your operational system is blocking the JVM.'
×
401
                                                        )
×
402
                                                        ->setResource('java')
×
403
                                                        ->setTip('https://github.com/LibreSign/libresign/issues/2327#issuecomment-1961988790'),
×
404
                                        ];
×
405
                                }
406
                                if ($resultCode !== 0) {
×
407
                                        return $this->result['java'] = [
×
408
                                                (new ConfigureCheckHelper())
×
409
                                                        ->setErrorMessage('Failure to check Java version.')
×
410
                                                        ->setResource('java')
×
411
                                                        ->setTip('Run occ libresign:install --java'),
×
412
                                        ];
×
413
                                }
414
                                $javaVersion = current($javaVersion);
×
415
                                if ($javaVersion !== InstallService::JAVA_VERSION) {
×
416
                                        return $this->result['java'] = [
×
417
                                                (new ConfigureCheckHelper())
×
418
                                                        ->setErrorMessage(
×
419
                                                                sprintf(
×
420
                                                                        'Invalid java version. Found: %s expected: %s',
×
421
                                                                        $javaVersion,
×
422
                                                                        InstallService::JAVA_VERSION
×
423
                                                                )
×
424
                                                        )
×
425
                                                        ->setResource('java')
×
426
                                                        ->setTip('Run occ libresign:install --java'),
×
427
                                        ];
×
428
                                }
429
                                \exec($javaPath . ' -XshowSettings:properties -version 2>&1', $output, $resultCode);
×
430
                                preg_match('/native.encoding = (?<encoding>.*)\n/', implode("\n", $output), $matches);
×
431
                                if (!isset($matches['encoding'])) {
×
432
                                        return $this->result['java'] = [
×
433
                                                (new ConfigureCheckHelper())
×
434
                                                        ->setErrorMessage('Java encoding not found.')
×
435
                                                        ->setResource('java')
×
436
                                                        ->setTip(sprintf('The command %s need to have native.encoding', $javaPath . ' -XshowSettings:properties -version')),
×
437
                                        ];
×
438
                                }
439
                                if (!str_contains($matches['encoding'], 'UTF-8')) {
×
NEW
440
                                        $detectedEncoding = trim($matches['encoding']);
×
NEW
441
                                        $phpLocale = setlocale(LC_CTYPE, 0);
×
NEW
442
                                        $phpLcAll = getenv('LC_ALL');
×
NEW
443
                                        $phpLang = getenv('LANG');
×
444

NEW
445
                                        $tip = sprintf(
×
NEW
446
                                                "Java detected encoding \"%s\" but UTF-8 is required.\n\n"
×
NEW
447
                                                . "**Current PHP environment:**\n"
×
NEW
448
                                                . "- LC_CTYPE: %s\n"
×
NEW
449
                                                . "- LC_ALL: %s\n"
×
NEW
450
                                                . "- LANG: %s\n\n"
×
NEW
451
                                                . "**To fix this issue:**\n"
×
NEW
452
                                                . "1. Set LC_ALL and LANG environment variables (e.g., LC_ALL=en_US.UTF-8) for your web server user\n"
×
NEW
453
                                                . "2. Restart your web server after making changes\n"
×
NEW
454
                                                . "3. Verify with command: `locale charmap` (should return UTF-8)\n\n"
×
NEW
455
                                                . 'For more details, see: [Issue #4872](https://github.com/LibreSign/libresign/issues/4872)',
×
NEW
456
                                                $detectedEncoding,
×
NEW
457
                                                $phpLocale ?: 'not set',
×
NEW
458
                                                $phpLcAll ?: 'not set',
×
NEW
459
                                                $phpLang ?: 'not set'
×
NEW
460
                                        );
×
461
                                        return $this->result['java'] = [
×
462
                                                (new ConfigureCheckHelper())
×
NEW
463
                                                        ->setInfoMessage(sprintf(
×
NEW
464
                                                                'Non-UTF-8 encoding detected: %s. This may cause issues with accented or special characters',
×
NEW
465
                                                                $detectedEncoding
×
NEW
466
                                                        ))
×
467
                                                        ->setResource('java')
×
NEW
468
                                                        ->setTip($tip),
×
469
                                        ];
×
470
                                }
471
                                return $this->result['java'] = [
×
472
                                        (new ConfigureCheckHelper())
×
473
                                                ->setSuccessMessage('Java version: ' . $javaVersion)
×
474
                                                ->setResource('java'),
×
475
                                        (new ConfigureCheckHelper())
×
476
                                                ->setSuccessMessage('Java binary: ' . $javaPath)
×
477
                                                ->setResource('java'),
×
478
                                ];
×
479
                        }
480
                        return $this->result['java'] = [
×
481
                                (new ConfigureCheckHelper())
×
482
                                        ->setErrorMessage('Java binary not found: ' . $javaPath)
×
483
                                        ->setResource('java')
×
484
                                        ->setTip('Run occ libresign:install --java'),
×
485
                        ];
×
486
                }
487
                return $this->result['java'] = [
×
488
                        (new ConfigureCheckHelper())
×
489
                                ->setErrorMessage('Java not installed')
×
490
                                ->setResource('java')
×
491
                                ->setTip('Run occ libresign:install --java'),
×
492
                ];
×
493
        }
494

495
        private function isJavaOk() : bool {
496
                $checkJava = $this->checkJava();
×
497
                $error = array_filter(
×
498
                        $checkJava,
×
499
                        fn (ConfigureCheckHelper $config) => $config->getStatus() === 'error'
×
500
                );
×
501
                return empty($error);
×
502
        }
503

504

505
        /**
506
         * Check all requirements to use certificate
507
         *
508
         * @return ConfigureCheckHelper[]
509
         */
510
        public function checkCertificate(): array {
511
                try {
512
                        $return = $this->certificateEngineFactory->getEngine()->configureCheck();
×
513
                } catch (\Throwable) {
×
514
                        $return = [
×
515
                                (new ConfigureCheckHelper())
×
516
                                        ->setErrorMessage('Define the certificate engine to use')
×
517
                                        ->setResource('certificate-engine')
×
518
                                        ->setTip(sprintf('Run occ libresign:configure:%s --help',
×
519
                                                $this->certificateEngineFactory->getEngine()->getName()
×
520
                                        )),
×
521
                        ];
×
522
                }
523
                return $return;
×
524
        }
525

526
        /**
527
         * Check if Imagick extension is loaded
528
         *
529
         * @return ConfigureCheckHelper[]
530
         */
531
        public function checkImagick(): array {
532
                if (!empty($this->result['imagick'])) {
2✔
533
                        return $this->result['imagick'];
×
534
                }
535
                if (!extension_loaded('imagick')) {
2✔
536
                        return $this->result['imagick'] = [
1✔
537
                                (new ConfigureCheckHelper())
1✔
538
                                        ->setInfoMessage('Imagick extension is not loaded')
1✔
539
                                        ->setResource('imagick')
1✔
540
                                        ->setTip('Install php-imagick to enable visible signatures, background images, and signature element rendering.'),
1✔
541
                        ];
1✔
542
                }
543
                return $this->result['imagick'] = [];
1✔
544
        }
545
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc