From dc32686ce71118e80b99d2398d77f4b79643aa1a Mon Sep 17 00:00:00 2001 From: Willem Leuverink Date: Fri, 28 Feb 2025 17:10:54 +0100 Subject: [PATCH 1/3] Skip errors when copying files during build (#176) * skip copy errors * Fix styling --------- Co-authored-by: gwleuverink <17123491+gwleuverink@users.noreply.github.com> --- src/Traits/CopiesToBuildDirectory.php | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/Traits/CopiesToBuildDirectory.php b/src/Traits/CopiesToBuildDirectory.php index ccd7df47..f9627934 100644 --- a/src/Traits/CopiesToBuildDirectory.php +++ b/src/Traits/CopiesToBuildDirectory.php @@ -13,6 +13,9 @@ use RecursiveDirectoryIterator; use RecursiveIteratorIterator; use Symfony\Component\Filesystem\Filesystem; +use Throwable; + +use function Laravel\Prompts\warning; trait CopiesToBuildDirectory { @@ -98,7 +101,11 @@ public function copyToBuildDirectory() continue; } - copy($item->getPathname(), $target); + try { + copy($item->getPathname(), $target); + } catch (Throwable $e) { + warning('[WARNING] '.$e->getMessage()); + } } $this->keepRequiredDirectories(); From fa21cfe49eb92ce6ab1ea56079d66d82b9618d95 Mon Sep 17 00:00:00 2001 From: Willem Leuverink Date: Fri, 28 Feb 2025 17:58:12 +0100 Subject: [PATCH 2/3] Copy latest certificate on before build (#177) * copy certificate over * fix issue after moving code --- src/Commands/BuildCommand.php | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/Commands/BuildCommand.php b/src/Commands/BuildCommand.php index cba960d6..a631d018 100644 --- a/src/Commands/BuildCommand.php +++ b/src/Commands/BuildCommand.php @@ -14,6 +14,7 @@ use Native\Electron\Traits\OsAndArch; use Native\Electron\Traits\PrunesVendorDirectory; use Native\Electron\Traits\SetsAppName; +use Symfony\Component\Filesystem\Path; use Symfony\Component\Process\Process as SymfonyProcess; use function Laravel\Prompts\intro; @@ -79,6 +80,13 @@ public function handle(): void intro('Copying App to build directory...'); $this->copyToBuildDirectory(); + $this->newLine(); + intro('Copying latest CA Certificate...'); + copy( + Path::join($this->sourcePath(), 'vendor', 'nativephp', 'php-bin', 'cacert.pem'), + Path::join($this->sourcePath(), 'vendor', 'nativephp', 'electron', 'resources', 'js', 'resources', 'cacert.pem') + ); + $this->newLine(); intro('Cleaning .env file...'); $this->cleanEnvFile(); From 258cbc334b7ddecb00089a0947d3fed1de9ab96c Mon Sep 17 00:00:00 2001 From: Peter Bishop <9081809+PeteBishwhip@users.noreply.github.com> Date: Sat, 1 Mar 2025 13:06:06 +0000 Subject: [PATCH 3/3] Basic Build Command cleanup (#178) --- resources/js/php.js | 11 ---- src/Commands/BuildCommand.php | 10 +--- src/Commands/DevelopCommand.php | 8 ++- src/Traits/CopiesCertificateAuthority.php | 48 ++++++++++++++++ src/Traits/ExecuteCommand.php | 2 - .../Traits/CopiesCertificateAuthorityTest.php | 55 +++++++++++++++++++ 6 files changed, 113 insertions(+), 21 deletions(-) create mode 100644 src/Traits/CopiesCertificateAuthority.php create mode 100644 tests/Unit/Traits/CopiesCertificateAuthorityTest.php diff --git a/resources/js/php.js b/resources/js/php.js index f91f48f7..39c53350 100644 --- a/resources/js/php.js +++ b/resources/js/php.js @@ -8,7 +8,6 @@ import unzip from "yauzl"; const isBuilding = Boolean(process.env.NATIVEPHP_BUILDING); const phpBinaryPath = process.env.NATIVEPHP_PHP_BINARY_PATH; const phpVersion = process.env.NATIVEPHP_PHP_BINARY_VERSION; -const certificatePath = process.env.NATIVEPHP_CERTIFICATE_FILE_PATH; // Differentiates for Serving and Building const isArm64 = isBuilding ? process.argv.includes('--arm64') : process.arch.includes('arm64'); @@ -98,13 +97,3 @@ if (platform.phpBinary) { console.error('Error copying PHP binary', e); } } - -if (certificatePath) { - try { - let certDest = join(import.meta.dirname, 'resources', 'cacert.pem'); - copySync(certificatePath, certDest); - console.log('Copied certificate file from ' + certificatePath + ' to ' + certDest); - } catch (e) { - console.error('Error copying certificate file', e); - } -} diff --git a/src/Commands/BuildCommand.php b/src/Commands/BuildCommand.php index a631d018..20d6fd62 100644 --- a/src/Commands/BuildCommand.php +++ b/src/Commands/BuildCommand.php @@ -7,6 +7,7 @@ use Illuminate\Support\Str; use Native\Electron\Facades\Updater; use Native\Electron\Traits\CleansEnvFile; +use Native\Electron\Traits\CopiesCertificateAuthority; use Native\Electron\Traits\CopiesToBuildDirectory; use Native\Electron\Traits\HasPreAndPostProcessing; use Native\Electron\Traits\InstallsAppIcon; @@ -14,7 +15,6 @@ use Native\Electron\Traits\OsAndArch; use Native\Electron\Traits\PrunesVendorDirectory; use Native\Electron\Traits\SetsAppName; -use Symfony\Component\Filesystem\Path; use Symfony\Component\Process\Process as SymfonyProcess; use function Laravel\Prompts\intro; @@ -22,6 +22,7 @@ class BuildCommand extends Command { use CleansEnvFile; + use CopiesCertificateAuthority; use CopiesToBuildDirectory; use HasPreAndPostProcessing; use InstallsAppIcon; @@ -81,11 +82,7 @@ public function handle(): void $this->copyToBuildDirectory(); $this->newLine(); - intro('Copying latest CA Certificate...'); - copy( - Path::join($this->sourcePath(), 'vendor', 'nativephp', 'php-bin', 'cacert.pem'), - Path::join($this->sourcePath(), 'vendor', 'nativephp', 'electron', 'resources', 'js', 'resources', 'cacert.pem') - ); + $this->copyCertificateAuthorityCertificate(); $this->newLine(); intro('Cleaning .env file...'); @@ -121,7 +118,6 @@ protected function getEnvironmentVariables(): array 'NATIVEPHP_BUILDING' => true, 'NATIVEPHP_PHP_BINARY_VERSION' => PHP_MAJOR_VERSION.'.'.PHP_MINOR_VERSION, 'NATIVEPHP_PHP_BINARY_PATH' => $this->sourcePath($this->phpBinaryPath()), - 'NATIVEPHP_CERTIFICATE_FILE_PATH' => $this->sourcePath($this->binaryPackageDirectory().'cacert.pem'), 'NATIVEPHP_APP_NAME' => config('app.name'), 'NATIVEPHP_APP_ID' => config('nativephp.app_id'), 'NATIVEPHP_APP_VERSION' => config('nativephp.version'), diff --git a/src/Commands/DevelopCommand.php b/src/Commands/DevelopCommand.php index 4a0abc14..f855cfa6 100644 --- a/src/Commands/DevelopCommand.php +++ b/src/Commands/DevelopCommand.php @@ -3,6 +3,7 @@ namespace Native\Electron\Commands; use Illuminate\Console\Command; +use Native\Electron\Traits\CopiesCertificateAuthority; use Native\Electron\Traits\Developer; use Native\Electron\Traits\Installer; use Native\Electron\Traits\InstallsAppIcon; @@ -12,7 +13,10 @@ class DevelopCommand extends Command { - use Developer, Installer, InstallsAppIcon; + use CopiesCertificateAuthority; + use Developer; + use Installer; + use InstallsAppIcon; protected $signature = 'native:serve {--no-queue} {--D|no-dependencies} {--installer=npm}'; @@ -40,6 +44,8 @@ public function handle(): void $this->installIcon(); + $this->copyCertificateAuthorityCertificate(); + $this->runDeveloper( installer: $this->option('installer'), skip_queue: $this->option('no-queue'), diff --git a/src/Traits/CopiesCertificateAuthority.php b/src/Traits/CopiesCertificateAuthority.php new file mode 100644 index 00000000..b8ed6486 --- /dev/null +++ b/src/Traits/CopiesCertificateAuthority.php @@ -0,0 +1,48 @@ +phpBinaryPath())); + } + + $certificateFileName = 'cacert.pem'; + $certFilePath = Path::join($phpBinaryDirectory, $certificateFileName); + + if (! file_exists($certFilePath)) { + warning('CA Certificate not found at '.$certFilePath.'. Skipping copy.'); + + return; + } + + $copied = copy( + $certFilePath, + Path::join(base_path('vendor/nativephp/electron/resources/js/resources'), $certificateFileName) + ); + + if (! $copied) { + // It returned false, but doesn't give a reason why. + throw new \Exception('copy() failed for an unknown reason.'); + } + } catch (\Throwable $e) { + error('Failed to copy CA Certificate: '.$e->getMessage()); + } + } +} diff --git a/src/Traits/ExecuteCommand.php b/src/Traits/ExecuteCommand.php index 26e98c06..a25b3bfb 100644 --- a/src/Traits/ExecuteCommand.php +++ b/src/Traits/ExecuteCommand.php @@ -20,13 +20,11 @@ protected function executeCommand( 'install' => [ 'NATIVEPHP_PHP_BINARY_VERSION' => PHP_MAJOR_VERSION.'.'.PHP_MINOR_VERSION, 'NATIVEPHP_PHP_BINARY_PATH' => base_path($this->phpBinaryPath()), - 'NATIVEPHP_CERTIFICATE_FILE_PATH' => base_path($this->binaryPackageDirectory().'cacert.pem'), ], 'serve' => [ 'APP_PATH' => base_path(), 'NATIVEPHP_PHP_BINARY_VERSION' => PHP_MAJOR_VERSION.'.'.PHP_MINOR_VERSION, 'NATIVEPHP_PHP_BINARY_PATH' => base_path($this->phpBinaryPath()), - 'NATIVEPHP_CERTIFICATE_FILE_PATH' => base_path($this->binaryPackageDirectory().'cacert.pem'), 'NATIVE_PHP_SKIP_QUEUE' => $skip_queue, 'NATIVEPHP_BUILDING' => false, ], diff --git a/tests/Unit/Traits/CopiesCertificateAuthorityTest.php b/tests/Unit/Traits/CopiesCertificateAuthorityTest.php new file mode 100644 index 00000000..495211f7 --- /dev/null +++ b/tests/Unit/Traits/CopiesCertificateAuthorityTest.php @@ -0,0 +1,55 @@ +setBasePath(realpath(__DIR__.'/../../../')); + + // / Make directory temporarily + mkdir(base_path('vendor/nativephp/electron/resources/js/resources'), 0777, true); + + // Test + expect(file_exists(base_path('vendor/nativephp/electron/resources/js/resources/cacert.pem')))->toBeFalse(); + + $mock->run(); + + expect(file_exists(base_path('vendor/nativephp/electron/resources/js/resources/cacert.pem')))->toBeTrue(); + + // Cleanup + // Delete the vendor/nativephp/electron directory, recursively including directories and then files + $files = new RecursiveIteratorIterator( + new RecursiveCallbackFilterIterator( + new RecursiveDirectoryIterator(base_path('vendor/nativephp/electron'), RecursiveDirectoryIterator::SKIP_DOTS), + fn ($current, $key, $iterator) => $current->isDir() || $current->isFile() + ), + RecursiveIteratorIterator::CHILD_FIRST + ); + + foreach ($files as $file) { + if ($file->isDir()) { + rmdir($file->getRealPath()); + } else { + unlink($file->getRealPath()); + } + } + + rmdir(base_path('vendor/nativephp/electron')); + +})->with([ + // Empty class with the CopiesCertificateAuthority trait + new class + { + use CopiesCertificateAuthority; + + public function run() + { + $this->copyCertificateAuthorityCertificate(); + } + }, +]);