Skip to content

Commit

Permalink
Exports: Improved PDF command temp file cleanup
Browse files Browse the repository at this point in the history
  • Loading branch information
ssddanbrown committed Jan 1, 2025
1 parent 6d7ff59 commit 7e31725
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 2 deletions.
12 changes: 11 additions & 1 deletion app/Exports/PdfGenerator.php
Original file line number Diff line number Diff line change
Expand Up @@ -90,18 +90,28 @@ protected function renderUsingCommand(string $html): string
$process = Process::fromShellCommandline($command);
$process->setTimeout($timeout);

$cleanup = function () use ($inputHtml, $outputPdf) {
foreach ([$inputHtml, $outputPdf] as $file) {
if (file_exists($file)) {
unlink($file);
}
}
};

try {
$process->run();
} catch (ProcessTimedOutException $e) {
$cleanup();
throw new PdfExportException("PDF Export via command failed due to timeout at {$timeout} second(s)");
}

if (!$process->isSuccessful()) {
$cleanup();
throw new PdfExportException("PDF Export via command failed with exit code {$process->getExitCode()}, stdout: {$process->getOutput()}, stderr: {$process->getErrorOutput()}");
}

$pdfContents = file_get_contents($outputPdf);
unlink($outputPdf);
$cleanup();

if ($pdfContents === false) {
throw new PdfExportException("PDF Export via command failed, unable to read PDF output file");
Expand Down
18 changes: 17 additions & 1 deletion tests/Exports/PdfExportTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
use BookStack\Entities\Models\Page;
use BookStack\Exceptions\PdfExportException;
use BookStack\Exports\PdfGenerator;
use FilesystemIterator;
use Tests\TestCase;

class PdfExportTest extends TestCase
Expand Down Expand Up @@ -128,7 +129,7 @@ public function test_pdf_command_option_errors_if_command_returns_error_status()
}, PdfExportException::class);
}

public function test_pdf_command_timout_option_limits_export_time()
public function test_pdf_command_timeout_option_limits_export_time()
{
$page = $this->entities->page();
$command = 'php -r \'sleep(4);\'';
Expand All @@ -143,4 +144,19 @@ public function test_pdf_command_timout_option_limits_export_time()
}, PdfExportException::class,
"PDF Export via command failed due to timeout at 1 second(s)");
}

public function test_pdf_command_option_does_not_leave_temp_files()
{
$tempDir = sys_get_temp_dir();
$startTempFileCount = iterator_count((new FileSystemIterator($tempDir, FilesystemIterator::SKIP_DOTS)));

$page = $this->entities->page();
$command = 'cp {input_html_path} {output_pdf_path}';
config()->set('exports.pdf_command', $command);

$this->asEditor()->get($page->getUrl('/export/pdf'));

$afterTempFileCount = iterator_count((new FileSystemIterator($tempDir, FilesystemIterator::SKIP_DOTS)));
$this->assertEquals($startTempFileCount, $afterTempFileCount);
}
}

0 comments on commit 7e31725

Please sign in to comment.