From da0a2d4e08f899087ada1e9d95988c7d1c5378bc Mon Sep 17 00:00:00 2001 From: Simon Hamp Date: Thu, 5 Sep 2024 01:49:28 +0100 Subject: [PATCH 1/7] Boot from the obfuscated bundle if available --- dist/server/php.js | 6 +++++- src/server/php.ts | 8 +++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/dist/server/php.js b/dist/server/php.js index 2717c6a..d4be281 100644 --- a/dist/server/php.js +++ b/dist/server/php.js @@ -187,7 +187,11 @@ function serveApp(secret, apiPort, phpIniSettings) { console.log('You may migrate manually by running: php artisan native:migrate'); } const phpPort = yield getPhpPort(); - const serverPath = (0, path_1.join)(appPath, 'vendor', 'laravel', 'framework', 'src', 'Illuminate', 'Foundation', 'resources', 'server.php'); + let serverPath = (0, path_1.join)(appPath, 'build', '__nativephp_app_bundle'); + if (process.env.NODE_ENV !== 'production' || !(0, fs_1.existsSync)(serverPath)) { + console.log('* * * Building with source * * *'); + serverPath = (0, path_1.join)(appPath, 'vendor', 'laravel', 'framework', 'src', 'Illuminate', 'Foundation', 'resources', 'server.php'); + } const phpServer = callPhp(['-S', `127.0.0.1:${phpPort}`, serverPath], { cwd: (0, path_1.join)(appPath, 'public'), env diff --git a/src/server/php.ts b/src/server/php.ts index 4f55f0d..971b6aa 100644 --- a/src/server/php.ts +++ b/src/server/php.ts @@ -217,7 +217,13 @@ function serveApp(secret, apiPort, phpIniSettings): Promise { const phpPort = await getPhpPort(); - const serverPath = join(appPath, 'vendor', 'laravel', 'framework', 'src', 'Illuminate', 'Foundation', 'resources', 'server.php') + let serverPath = join(appPath, 'build', '__nativephp_app_bundle'); + + if (process.env.NODE_ENV !== 'production' || ! existsSync(serverPath)) { + console.log('* * * Building with source * * *'); + serverPath = join(appPath, 'vendor', 'laravel', 'framework', 'src', 'Illuminate', 'Foundation', 'resources', 'server.php'); + } + const phpServer = callPhp(['-S', `127.0.0.1:${phpPort}`, serverPath], { cwd: join(appPath, 'public'), env From e549b24a168e195cc6b772683ed2d8a0fc5d7b9e Mon Sep 17 00:00:00 2001 From: Simon Hamp Date: Sat, 7 Sep 2024 02:30:19 +0100 Subject: [PATCH 2/7] wip --- dist/server/php.js | 10 +++++----- src/server/php.ts | 18 +++++++++++++----- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/dist/server/php.js b/dist/server/php.js index d4be281..606e1f6 100644 --- a/dist/server/php.js +++ b/dist/server/php.js @@ -75,6 +75,9 @@ function callPhp(args, options, phpIniSettings = {}) { Object.keys(iniSettings).forEach(key => { args.unshift('-d', `${key}=${iniSettings[key]}`); }); + if (parseInt(process.env.SHELL_VERBOSITY) > 0) { + console.log('Calling PHP', state_1.default.php, args); + } return (0, child_process_1.spawn)(state_1.default.php, args, { cwd: options.cwd, env: Object.assign(Object.assign({}, process.env), options.env), @@ -164,6 +167,8 @@ function getDefaultEnvironmentVariables(secret, apiPort) { NATIVEPHP_RECENT_PATH: getPath('recent'), }; } +function runningSecureBuild() { +} function serveApp(secret, apiPort, phpIniSettings) { return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () { const appPath = getAppPath(); @@ -176,7 +181,6 @@ function serveApp(secret, apiPort, phpIniSettings) { env }; const store = new electron_store_1.default(); - callPhp(['artisan', 'storage:link', '--force'], phpOptions, phpIniSettings); if (store.get('migrated_version') !== electron_1.app.getVersion() && process.env.NODE_ENV !== 'development') { console.log('Migrating database...'); callPhp(['artisan', 'migrate', '--force'], phpOptions, phpIniSettings); @@ -188,10 +192,6 @@ function serveApp(secret, apiPort, phpIniSettings) { } const phpPort = yield getPhpPort(); let serverPath = (0, path_1.join)(appPath, 'build', '__nativephp_app_bundle'); - if (process.env.NODE_ENV !== 'production' || !(0, fs_1.existsSync)(serverPath)) { - console.log('* * * Building with source * * *'); - serverPath = (0, path_1.join)(appPath, 'vendor', 'laravel', 'framework', 'src', 'Illuminate', 'Foundation', 'resources', 'server.php'); - } const phpServer = callPhp(['-S', `127.0.0.1:${phpPort}`, serverPath], { cwd: (0, path_1.join)(appPath, 'public'), env diff --git a/src/server/php.ts b/src/server/php.ts index 971b6aa..129eaf5 100644 --- a/src/server/php.ts +++ b/src/server/php.ts @@ -65,6 +65,10 @@ function callPhp(args, options, phpIniSettings = {}) { args.unshift('-d', `${key}=${iniSettings[key]}`); }); + if (parseInt(process.env.SHELL_VERBOSITY) > 0) { + console.log('Calling PHP', state.php, args) + } + return spawn( state.php, args, @@ -180,6 +184,10 @@ function getDefaultEnvironmentVariables(secret, apiPort) { }; } +function runningSecureBuild() { + +} + function serveApp(secret, apiPort, phpIniSettings): Promise { return new Promise(async (resolve, reject) => { const appPath = getAppPath(); @@ -201,7 +209,7 @@ function serveApp(secret, apiPort, phpIniSettings): Promise { // Make sure the storage path is linked - as people can move the app around, we // need to run this every time the app starts - callPhp(['artisan', 'storage:link', '--force'], phpOptions, phpIniSettings) + // callPhp(['artisan', 'storage:link', '--force'], phpOptions, phpIniSettings) // Migrate the database if (store.get('migrated_version') !== app.getVersion() && process.env.NODE_ENV !== 'development') { @@ -219,10 +227,10 @@ function serveApp(secret, apiPort, phpIniSettings): Promise { let serverPath = join(appPath, 'build', '__nativephp_app_bundle'); - if (process.env.NODE_ENV !== 'production' || ! existsSync(serverPath)) { - console.log('* * * Building with source * * *'); - serverPath = join(appPath, 'vendor', 'laravel', 'framework', 'src', 'Illuminate', 'Foundation', 'resources', 'server.php'); - } + // if (process.env.NODE_ENV !== 'production' || ! existsSync(serverPath)) { + // console.log('* * * Running from source * * *'); + // serverPath = join(appPath, 'vendor', 'laravel', 'framework', 'src', 'Illuminate', 'Foundation', 'resources', 'server.php'); + // } const phpServer = callPhp(['-S', `127.0.0.1:${phpPort}`, serverPath], { cwd: join(appPath, 'public'), From 3e51313eee87fa0dd41b309e8a3c3caf65d37234 Mon Sep 17 00:00:00 2001 From: Simon Hamp Date: Sat, 7 Sep 2024 02:57:37 +0100 Subject: [PATCH 3/7] wip --- src/server/php.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/server/php.ts b/src/server/php.ts index 129eaf5..4a5761c 100644 --- a/src/server/php.ts +++ b/src/server/php.ts @@ -166,6 +166,7 @@ function getDefaultEnvironmentVariables(secret, apiPort) { return { APP_ENV: process.env.NODE_ENV === 'development' ? 'local' : 'production', APP_DEBUG: process.env.NODE_ENV === 'development' ? 'true' : 'false', + LARAVEL_STORAGE_PATH: storagePath, NATIVEPHP_STORAGE_PATH: storagePath, NATIVEPHP_DATABASE_PATH: databaseFile, NATIVEPHP_API_URL: `http://localhost:${apiPort}/api/`, @@ -209,7 +210,9 @@ function serveApp(secret, apiPort, phpIniSettings): Promise { // Make sure the storage path is linked - as people can move the app around, we // need to run this every time the app starts - // callPhp(['artisan', 'storage:link', '--force'], phpOptions, phpIniSettings) + // if (! runningSecureBuild()) { + // callPhp(['artisan', 'storage:link', '--force'], phpOptions, phpIniSettings) + // } // Migrate the database if (store.get('migrated_version') !== app.getVersion() && process.env.NODE_ENV !== 'development') { From 24289d9deee92ba27a9b44bf7f800a307c81f219 Mon Sep 17 00:00:00 2001 From: Simon Hamp Date: Sat, 7 Sep 2024 03:55:58 +0100 Subject: [PATCH 4/7] wip --- dist/server/php.js | 8 ++++++++ src/server/php.ts | 14 +++++++++----- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/dist/server/php.js b/dist/server/php.js index 606e1f6..f26f989 100644 --- a/dist/server/php.js +++ b/dist/server/php.js @@ -66,6 +66,9 @@ function retrieveNativePHPConfig() { } exports.retrieveNativePHPConfig = retrieveNativePHPConfig; function callPhp(args, options, phpIniSettings = {}) { + if (args[0] === 'artisan' && runningSecureBuild()) { + args.unshift((0, path_1.join)(appPath, 'build', '__nativephp_app_bundle')); + } let defaultIniSettings = { 'memory_limit': '512M', 'curl.cainfo': state_1.default.caCert, @@ -150,6 +153,7 @@ function getDefaultEnvironmentVariables(secret, apiPort) { return { APP_ENV: process.env.NODE_ENV === 'development' ? 'local' : 'production', APP_DEBUG: process.env.NODE_ENV === 'development' ? 'true' : 'false', + LARAVEL_STORAGE_PATH: storagePath, NATIVEPHP_STORAGE_PATH: storagePath, NATIVEPHP_DATABASE_PATH: databaseFile, NATIVEPHP_API_URL: `http://localhost:${apiPort}/api/`, @@ -168,6 +172,7 @@ function getDefaultEnvironmentVariables(secret, apiPort) { }; } function runningSecureBuild() { + return (0, fs_1.existsSync)((0, path_1.join)(appPath, 'build', '__nativephp_app_bundle')); } function serveApp(secret, apiPort, phpIniSettings) { return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () { @@ -181,6 +186,9 @@ function serveApp(secret, apiPort, phpIniSettings) { env }; const store = new electron_store_1.default(); + if (!runningSecureBuild()) { + callPhp(['artisan', 'storage:link', '--force'], phpOptions, phpIniSettings); + } if (store.get('migrated_version') !== electron_1.app.getVersion() && process.env.NODE_ENV !== 'development') { console.log('Migrating database...'); callPhp(['artisan', 'migrate', '--force'], phpOptions, phpIniSettings); diff --git a/src/server/php.ts b/src/server/php.ts index 4a5761c..4095b4c 100644 --- a/src/server/php.ts +++ b/src/server/php.ts @@ -53,6 +53,10 @@ async function retrieveNativePHPConfig() { } function callPhp(args, options, phpIniSettings = {}) { + if (args[0] === 'artisan' && runningSecureBuild()) { + args.unshift(join(appPath, 'build', '__nativephp_app_bundle')); + } + let defaultIniSettings = { 'memory_limit': '512M', 'curl.cainfo': state.caCert, @@ -186,7 +190,7 @@ function getDefaultEnvironmentVariables(secret, apiPort) { } function runningSecureBuild() { - + return existsSync(join(appPath, 'build', '__nativephp_app_bundle')) } function serveApp(secret, apiPort, phpIniSettings): Promise { @@ -210,9 +214,9 @@ function serveApp(secret, apiPort, phpIniSettings): Promise { // Make sure the storage path is linked - as people can move the app around, we // need to run this every time the app starts - // if (! runningSecureBuild()) { - // callPhp(['artisan', 'storage:link', '--force'], phpOptions, phpIniSettings) - // } + if (! runningSecureBuild()) { + callPhp(['artisan', 'storage:link', '--force'], phpOptions, phpIniSettings) + } // Migrate the database if (store.get('migrated_version') !== app.getVersion() && process.env.NODE_ENV !== 'development') { @@ -230,7 +234,7 @@ function serveApp(secret, apiPort, phpIniSettings): Promise { let serverPath = join(appPath, 'build', '__nativephp_app_bundle'); - // if (process.env.NODE_ENV !== 'production' || ! existsSync(serverPath)) { + // if (process.env.NODE_ENV !== 'production' || ! runningSecureBuild()) { // console.log('* * * Running from source * * *'); // serverPath = join(appPath, 'vendor', 'laravel', 'framework', 'src', 'Illuminate', 'Foundation', 'resources', 'server.php'); // } From 446d4cacbd3f8f5f4e9851e0956f9d3a68d50629 Mon Sep 17 00:00:00 2001 From: Simon Hamp Date: Sat, 7 Sep 2024 04:03:24 +0100 Subject: [PATCH 5/7] wip --- dist/server/php.js | 12 ++++++++++-- src/server/php.ts | 34 +++++++++++++++++++++++----------- 2 files changed, 33 insertions(+), 13 deletions(-) diff --git a/dist/server/php.js b/dist/server/php.js index f26f989..3b9d8f8 100644 --- a/dist/server/php.js +++ b/dist/server/php.js @@ -46,7 +46,11 @@ function retrievePhpIniSettings() { cwd: appPath, env }; - return yield (0, util_1.promisify)(child_process_1.execFile)(state_1.default.php, ['artisan', 'native:php-ini'], phpOptions); + let command = ['artisan', 'native:php-ini']; + if (runningSecureBuild()) { + command.unshift((0, path_1.join)(appPath, 'build', '__nativephp_app_bundle')); + } + return yield (0, util_1.promisify)(child_process_1.execFile)(state_1.default.php, command, phpOptions); }); } exports.retrievePhpIniSettings = retrievePhpIniSettings; @@ -61,7 +65,11 @@ function retrieveNativePHPConfig() { cwd: appPath, env }; - return yield (0, util_1.promisify)(child_process_1.execFile)(state_1.default.php, ['artisan', 'native:config'], phpOptions); + let command = ['artisan', 'native:config']; + if (runningSecureBuild()) { + command.unshift((0, path_1.join)(appPath, 'build', '__nativephp_app_bundle')); + } + return yield (0, util_1.promisify)(child_process_1.execFile)(state_1.default.php, command, phpOptions); }); } exports.retrieveNativePHPConfig = retrieveNativePHPConfig; diff --git a/src/server/php.ts b/src/server/php.ts index 4095b4c..a0ef326 100644 --- a/src/server/php.ts +++ b/src/server/php.ts @@ -23,18 +23,24 @@ async function getPhpPort() { } async function retrievePhpIniSettings() { - const env = { - NATIVEPHP_RUNNING: 'true', - NATIVEPHP_STORAGE_PATH: storagePath, - NATIVEPHP_DATABASE_PATH: databaseFile, - }; + const env = { + NATIVEPHP_RUNNING: 'true', + NATIVEPHP_STORAGE_PATH: storagePath, + NATIVEPHP_DATABASE_PATH: databaseFile, + }; - const phpOptions = { - cwd: appPath, - env - }; + const phpOptions = { + cwd: appPath, + env + }; - return await promisify(execFile)(state.php, ['artisan', 'native:php-ini'], phpOptions); + let command = ['artisan', 'native:php-ini']; + + if (runningSecureBuild()) { + command.unshift(join(appPath, 'build', '__nativephp_app_bundle')); + } + + return await promisify(execFile)(state.php, command, phpOptions); } async function retrieveNativePHPConfig() { @@ -49,7 +55,13 @@ async function retrieveNativePHPConfig() { env }; - return await promisify(execFile)(state.php, ['artisan', 'native:config'], phpOptions); + let command = ['artisan', 'native:config']; + + if (runningSecureBuild()) { + command.unshift(join(appPath, 'build', '__nativephp_app_bundle')); + } + + return await promisify(execFile)(state.php, command, phpOptions); } function callPhp(args, options, phpIniSettings = {}) { From e5b9283582148e33bd1c493e78fdfc9944dea1a6 Mon Sep 17 00:00:00 2001 From: Simon Hamp Date: Sat, 7 Sep 2024 04:55:10 +0100 Subject: [PATCH 6/7] wip --- dist/server/php.js | 2 -- src/server/php.ts | 4 ++-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/dist/server/php.js b/dist/server/php.js index 3b9d8f8..724ba71 100644 --- a/dist/server/php.js +++ b/dist/server/php.js @@ -126,7 +126,6 @@ function ensureAppFoldersAreAvailable() { function startQueueWorker(secret, apiPort, phpIniSettings = {}) { const env = { APP_ENV: process.env.NODE_ENV === 'development' ? 'local' : 'production', - APP_DEBUG: process.env.NODE_ENV === 'development' ? 'true' : 'false', NATIVEPHP_STORAGE_PATH: storagePath, NATIVEPHP_DATABASE_PATH: databaseFile, NATIVEPHP_API_URL: `http://localhost:${apiPort}/api/`, @@ -160,7 +159,6 @@ function getPath(name) { function getDefaultEnvironmentVariables(secret, apiPort) { return { APP_ENV: process.env.NODE_ENV === 'development' ? 'local' : 'production', - APP_DEBUG: process.env.NODE_ENV === 'development' ? 'true' : 'false', LARAVEL_STORAGE_PATH: storagePath, NATIVEPHP_STORAGE_PATH: storagePath, NATIVEPHP_DATABASE_PATH: databaseFile, diff --git a/src/server/php.ts b/src/server/php.ts index a0ef326..642fa7f 100644 --- a/src/server/php.ts +++ b/src/server/php.ts @@ -142,7 +142,7 @@ function ensureAppFoldersAreAvailable() { function startQueueWorker(secret, apiPort, phpIniSettings = {}) { const env = { APP_ENV: process.env.NODE_ENV === 'development' ? 'local' : 'production', - APP_DEBUG: process.env.NODE_ENV === 'development' ? 'true' : 'false', + // APP_DEBUG: process.env.NODE_ENV === 'development' ? 'true' : 'false', NATIVEPHP_STORAGE_PATH: storagePath, NATIVEPHP_DATABASE_PATH: databaseFile, NATIVEPHP_API_URL: `http://localhost:${apiPort}/api/`, @@ -181,7 +181,7 @@ function getPath(name: string) { function getDefaultEnvironmentVariables(secret, apiPort) { return { APP_ENV: process.env.NODE_ENV === 'development' ? 'local' : 'production', - APP_DEBUG: process.env.NODE_ENV === 'development' ? 'true' : 'false', + // APP_DEBUG: process.env.NODE_ENV === 'development' ? 'true' : 'false', LARAVEL_STORAGE_PATH: storagePath, NATIVEPHP_STORAGE_PATH: storagePath, NATIVEPHP_DATABASE_PATH: databaseFile, From 81618f7689c9fa27196f58f72291dbc6b0f5c4fa Mon Sep 17 00:00:00 2001 From: Simon Hamp Date: Sat, 7 Sep 2024 05:07:17 +0100 Subject: [PATCH 7/7] wip --- dist/server/php.js | 4 ++-- src/server/php.ts | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/dist/server/php.js b/dist/server/php.js index 724ba71..a011d08 100644 --- a/dist/server/php.js +++ b/dist/server/php.js @@ -195,12 +195,12 @@ function serveApp(secret, apiPort, phpIniSettings) { if (!runningSecureBuild()) { callPhp(['artisan', 'storage:link', '--force'], phpOptions, phpIniSettings); } - if (store.get('migrated_version') !== electron_1.app.getVersion() && process.env.NODE_ENV !== 'development') { + if (store.get('migrated_version') !== electron_1.app.getVersion() && (process.env.NODE_ENV !== 'development' || runningSecureBuild())) { console.log('Migrating database...'); callPhp(['artisan', 'migrate', '--force'], phpOptions, phpIniSettings); store.set('migrated_version', electron_1.app.getVersion()); } - if (process.env.NODE_ENV === 'development') { + if (process.env.NODE_ENV === 'development' && !runningSecureBuild()) { console.log('Skipping Database migration while in development.'); console.log('You may migrate manually by running: php artisan native:migrate'); } diff --git a/src/server/php.ts b/src/server/php.ts index 642fa7f..3a918bc 100644 --- a/src/server/php.ts +++ b/src/server/php.ts @@ -231,13 +231,13 @@ function serveApp(secret, apiPort, phpIniSettings): Promise { } // Migrate the database - if (store.get('migrated_version') !== app.getVersion() && process.env.NODE_ENV !== 'development') { + if (store.get('migrated_version') !== app.getVersion() && (process.env.NODE_ENV !== 'development' || runningSecureBuild())) { console.log('Migrating database...') callPhp(['artisan', 'migrate', '--force'], phpOptions, phpIniSettings) store.set('migrated_version', app.getVersion()) } - if (process.env.NODE_ENV === 'development') { + if (process.env.NODE_ENV === 'development' && ! runningSecureBuild()) { console.log('Skipping Database migration while in development.') console.log('You may migrate manually by running: php artisan native:migrate') }