libresign/lib/Handler/PdfTk/Pdf.php
Vitor Mattos 07a231aea2
fix: isolate PHP-pdftk dependency
I identified some issues with the follow log:

```
[PHP] Warning: include(): Failed opening '<redacted>/apps/richdocuments/vendor/composer/../mikehaertl/php-pdftk/src/Pdf.php' for inclusion (include_path='<redacted>/3rdparty/pear/archive_tar:/<redacted>/3rdparty/pear/console_getopt:<redacted>/3rdparty/pear/pear-core-minimal/src:/<redacted>/3rdparty/pear/pear_exception:/<redacted>/apps') at /<redacted>/lib/composer/composer/ClassLoader.php#576
	GET /ocs/v2.php/apps/libresign/api/v1/file/validate/file_id/2556
```

It's only occurr when use the app richdocuments, I saw that the package
mikehaertl/php-pdftk also is used by this app and because this the
autoload was mixed.

To solve this issue I used the package humbug/php-scoper that isolate
the dependency into a different namespace.

I also followed this article:

https://arthur-schiwon.de/isolating-nextcloud-app-dependencies-php-scoper

And the follow search results to see implementation examples:

https://github.com/search?q=OCA+path%3Ascoper.inc.php&type=code
https://github.com/search?q=org%3Anextcloud+path%3Ascoper.inc.php&type=code

Considering that we already have tests to cover the usage of pdftk,
isn't necessary to add new tests, if the test pass, this change worked
fine because loaded the isolated packages and the isolated packages made
the necessary.

Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
2025-09-03 09:55:55 -03:00

66 lines
1.7 KiB
PHP

<?php
declare(strict_types=1);
/**
* SPDX-FileCopyrightText: 2020-2024 LibreCode coop and contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OCA\Libresign\Handler\PdfTk;
use OCA\Libresign\AppInfo\Application;
use OCA\Libresign\Exception\LibresignException;
use OCA\Libresign\Helper\JavaHelper;
use OCA\Libresign\Vendor\mikehaertl\pdftk\Command;
use OCA\Libresign\Vendor\mikehaertl\pdftk\Pdf as BasePdf;
use OCP\IAppConfig;
use OCP\IL10N;
use RuntimeException;
class Pdf extends BasePdf {
private string $javaPath = '';
private string $pdftkPath = '';
public function __construct(
private JavaHelper $javaHelper,
private IAppConfig $appConfig,
private IL10N $l10n,
) {
}
public function applyStamp(string $input, string $stamp): string {
$this->configureCommand();
$this->addFile($input);
$buffer = $this->multiStamp($stamp)->toString();
if (!is_string($buffer)) {
throw new RuntimeException('Failed to merge the PDF with the footer.');
}
return $buffer;
}
protected function configureCommand(): void {
$this->javaPath = $this->javaHelper->getJavaPath();
if ($this->javaPath === '') {
throw new RuntimeException('Java path not set.');
}
$this->pdftkPath = $this->appConfig->getValueString(Application::APP_ID, 'pdftk_path');
if ($this->pdftkPath === '') {
throw new RuntimeException('PDFtk path not set.');
}
if (!file_exists($this->javaPath) || !file_exists($this->pdftkPath)) {
throw new LibresignException($this->l10n->t('The admin hasn\'t set up LibreSign yet, please wait.'));
}
$cmd = sprintf('%s -jar %s', escapeshellcmd($this->javaPath), escapeshellarg($this->pdftkPath));
$this->_command = new Command();
$this->_command->setCommand($cmd);
}
}