diff --git a/resources/js/php.js b/resources/js/php.js index f91f48f..39c5335 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 cba960d..20d6fd6 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; @@ -21,6 +22,7 @@ class BuildCommand extends Command { use CleansEnvFile; + use CopiesCertificateAuthority; use CopiesToBuildDirectory; use HasPreAndPostProcessing; use InstallsAppIcon; @@ -79,6 +81,9 @@ public function handle(): void intro('Copying App to build directory...'); $this->copyToBuildDirectory(); + $this->newLine(); + $this->copyCertificateAuthorityCertificate(); + $this->newLine(); intro('Cleaning .env file...'); $this->cleanEnvFile(); @@ -113,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 4a0abc1..f855cfa 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 0000000..b8ed648 --- /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/CopiesToBuildDirectory.php b/src/Traits/CopiesToBuildDirectory.php index ccd7df4..f962793 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(); diff --git a/src/Traits/ExecuteCommand.php b/src/Traits/ExecuteCommand.php index 26e98c0..a25b3bf 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 0000000..495211f --- /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(); + } + }, +]);