From c66ab865336ec77e25a3c40ba691f543bc503441 Mon Sep 17 00:00:00 2001 From: Shauren Date: Tue, 13 Sep 2022 02:09:17 +0200 Subject: [PATCH] Migrate to new more secure electron main-renderer ipc communication --- angular.json | 2 +- package-lock.json | 369 ------------------ package.json | 7 +- patches/ngx-electron+2.2.0.patch | 12 - src/app/account/account.component.ts | 17 +- src/app/app.module.ts | 6 +- src/app/argv.ts | 6 +- src/app/configuration.service.ts | 30 +- src/app/login-ticket.service.ts | 17 +- src/app/main/main.component.ts | 6 +- src/app/renderer-logger.ts | 7 +- .../settings-dialog.component.ts | 11 +- src/desktop-app/configuration.ts | 15 - src/desktop-app/crypto-result.ts | 6 - src/desktop-app/desktop-main.ts | 64 +-- src/desktop-app/package.json | 2 +- src/desktop-app/renderer-preload.ts | 44 +++ src/ipc/configuration.ts | 6 + src/ipc/crypto-result.ts | 4 + src/ipc/electron-api.d.ts | 24 ++ src/{desktop-app => ipc}/launch-args.ts | 2 +- src/ipc/log-event.ts | 4 + src/native/Win32Launcher.cpp | 3 +- 23 files changed, 168 insertions(+), 496 deletions(-) delete mode 100644 patches/ngx-electron+2.2.0.patch delete mode 100644 src/desktop-app/configuration.ts delete mode 100644 src/desktop-app/crypto-result.ts create mode 100644 src/desktop-app/renderer-preload.ts create mode 100644 src/ipc/configuration.ts create mode 100644 src/ipc/crypto-result.ts create mode 100644 src/ipc/electron-api.d.ts rename src/{desktop-app => ipc}/launch-args.ts (70%) create mode 100644 src/ipc/log-event.ts diff --git a/angular.json b/angular.json index 49da8a5..7c6c29f 100644 --- a/angular.json +++ b/angular.json @@ -13,7 +13,7 @@ "build": { "builder": "@angular-devkit/build-angular:browser", "options": { - "outputPath": "dist", + "outputPath": "dist/web-app", "index": "src/index.html", "main": "src/main.ts", "polyfills": "src/polyfills.ts", diff --git a/package-lock.json b/package-lock.json index dbd20b9..55b836d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20,7 +20,6 @@ "@angular/router": "^14.2.1", "command-line-args": "^5.2.1", "electron-settings": "^4.0.2", - "ngx-electron": "^2.2.0", "rxjs": "^6.6.7", "tslib": "^2.0.0", "zone.js": "~0.11.8" @@ -36,7 +35,6 @@ "electron": "^20.1.3", "electron-packager": "^16.0.0", "electron-rebuild": "^3.2.9", - "patch-package": "^6.4.7", "ts-node": "~7.0.0", "tslint": "~6.1.0", "typescript": "~4.6.4" @@ -4555,12 +4553,6 @@ "integrity": "sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==", "dev": true }, - "node_modules/ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true - }, "node_modules/clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", @@ -6688,15 +6680,6 @@ "node": ">=8" } }, - "node_modules/find-yarn-workspace-root": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz", - "integrity": "sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==", - "dev": true, - "dependencies": { - "micromatch": "^4.0.2" - } - }, "node_modules/flora-colossus": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/flora-colossus/-/flora-colossus-1.0.1.tgz", @@ -7669,18 +7652,6 @@ "node": ">=8" } }, - "node_modules/is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dev": true, - "dependencies": { - "ci-info": "^2.0.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, "node_modules/is-core-module": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", @@ -8064,15 +8035,6 @@ "node": ">=0.10.0" } }, - "node_modules/klaw-sync": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz", - "integrity": "sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.11" - } - }, "node_modules/klona": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz", @@ -9010,30 +8972,6 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, - "node_modules/ngx-electron": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ngx-electron/-/ngx-electron-2.2.0.tgz", - "integrity": "sha512-Yl7Dsnvp97k0XpIuiB54X7Ij2+zU5x0pCAYnN//VZ9tF7c6S3//OZ9dN9Et7p/zIjCV3Hg9vyw68dPJEZGk+LQ==", - "dependencies": { - "tslib": "^1.9.0" - }, - "peerDependencies": { - "@angular/core": ">=8.0.0", - "electron": ">=6.0.10", - "rxjs": ">=6.3.0" - } - }, - "node_modules/ngx-electron/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "node_modules/nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, "node_modules/node-abi": { "version": "3.24.0", "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.24.0.tgz", @@ -9811,151 +9749,6 @@ "node": ">= 0.8" } }, - "node_modules/patch-package": { - "version": "6.4.7", - "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-6.4.7.tgz", - "integrity": "sha512-S0vh/ZEafZ17hbhgqdnpunKDfzHQibQizx9g8yEf5dcVk3KOflOfdufRXQX8CSEkyOQwuM/bNz1GwKvFj54kaQ==", - "dev": true, - "dependencies": { - "@yarnpkg/lockfile": "^1.1.0", - "chalk": "^2.4.2", - "cross-spawn": "^6.0.5", - "find-yarn-workspace-root": "^2.0.0", - "fs-extra": "^7.0.1", - "is-ci": "^2.0.0", - "klaw-sync": "^6.0.0", - "minimist": "^1.2.0", - "open": "^7.4.2", - "rimraf": "^2.6.3", - "semver": "^5.6.0", - "slash": "^2.0.0", - "tmp": "^0.0.33" - }, - "bin": { - "patch-package": "index.js" - }, - "engines": { - "npm": ">5" - } - }, - "node_modules/patch-package/node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "engines": { - "node": ">=4.8" - } - }, - "node_modules/patch-package/node_modules/fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/patch-package/node_modules/open": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", - "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", - "dev": true, - "dependencies": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/patch-package/node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/patch-package/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/patch-package/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/patch-package/node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "dependencies": { - "shebang-regex": "^1.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/patch-package/node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/patch-package/node_modules/slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/patch-package/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "which": "bin/which" - } - }, "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -16707,12 +16500,6 @@ "integrity": "sha512-1R5Fho+jBq0DDydt+/vHWj5KJNJCKdARKOCwZUen84I5BreWoLqRLANH1U87eJy1tiASPtMnGqJJq0ZsLoRPOw==", "dev": true }, - "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true - }, "clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", @@ -18325,15 +18112,6 @@ } } }, - "find-yarn-workspace-root": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz", - "integrity": "sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==", - "dev": true, - "requires": { - "micromatch": "^4.0.2" - } - }, "flora-colossus": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/flora-colossus/-/flora-colossus-1.0.1.tgz", @@ -19085,15 +18863,6 @@ "binary-extensions": "^2.0.0" } }, - "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dev": true, - "requires": { - "ci-info": "^2.0.0" - } - }, "is-core-module": { "version": "2.10.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", @@ -19379,15 +19148,6 @@ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true }, - "klaw-sync": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/klaw-sync/-/klaw-sync-6.0.0.tgz", - "integrity": "sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.11" - } - }, "klona": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz", @@ -20092,27 +19852,6 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, - "ngx-electron": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ngx-electron/-/ngx-electron-2.2.0.tgz", - "integrity": "sha512-Yl7Dsnvp97k0XpIuiB54X7Ij2+zU5x0pCAYnN//VZ9tF7c6S3//OZ9dN9Et7p/zIjCV3Hg9vyw68dPJEZGk+LQ==", - "requires": { - "tslib": "^1.9.0" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - } - } - }, - "nice-try": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", - "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", - "dev": true - }, "node-abi": { "version": "3.24.0", "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.24.0.tgz", @@ -20706,114 +20445,6 @@ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", "dev": true }, - "patch-package": { - "version": "6.4.7", - "resolved": "https://registry.npmjs.org/patch-package/-/patch-package-6.4.7.tgz", - "integrity": "sha512-S0vh/ZEafZ17hbhgqdnpunKDfzHQibQizx9g8yEf5dcVk3KOflOfdufRXQX8CSEkyOQwuM/bNz1GwKvFj54kaQ==", - "dev": true, - "requires": { - "@yarnpkg/lockfile": "^1.1.0", - "chalk": "^2.4.2", - "cross-spawn": "^6.0.5", - "find-yarn-workspace-root": "^2.0.0", - "fs-extra": "^7.0.1", - "is-ci": "^2.0.0", - "klaw-sync": "^6.0.0", - "minimist": "^1.2.0", - "open": "^7.4.2", - "rimraf": "^2.6.3", - "semver": "^5.6.0", - "slash": "^2.0.0", - "tmp": "^0.0.33" - }, - "dependencies": { - "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "requires": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "fs-extra": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", - "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - } - }, - "open": { - "version": "7.4.2", - "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz", - "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==", - "dev": true, - "requires": { - "is-docker": "^2.0.0", - "is-wsl": "^2.1.1" - } - }, - "path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", - "dev": true - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", - "dev": true - }, - "slash": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } - } - }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", diff --git a/package.json b/package.json index 1e10c88..efcea3b 100644 --- a/package.json +++ b/package.json @@ -7,11 +7,10 @@ "build-electron": "tsc -p src/desktop-app --outDir dist/ && cp src/desktop-app/package.json dist/", "build-native": "electron-rebuild -f && cp build/Release/tc_launcher.node dist/", "build-all-dev": "npm run build && npm run build-electron && npm run build-native", - "electron": "electron --remote-debugging-port=9222 dist/desktop-main.js", + "electron": "electron --remote-debugging-port=9222 dist/desktop-app/desktop-main.js", "install-electron-deps": "pushd dist && cp ../src/desktop-app/package-lock.json ./ && npm install && popd", "build-package:mac": "ng build --configuration production && npm run build-native && npm run build-electron && npm run install-electron-deps && electron-packager dist trinitycore-launcher --asar --out=bin --overwrite --icon=src/assets/icon.icns", - "build-package:win": "ng build --configuration production && npm run build-native && npm run build-electron && npm run install-electron-deps && electron-packager dist trinitycore-launcher --asar --out=bin --overwrite --icon=src/assets/icon.ico --win32metadata.CompanyName=Shauren --win32metadata.ProductName=\"TrinityCore Client Launcher\"", - "postinstall": "patch-package" + "build-package:win": "ng build --configuration production && npm run build-native && npm run build-electron && npm run install-electron-deps && electron-packager dist trinitycore-launcher --asar --out=bin --overwrite --icon=src/assets/icon.ico --win32metadata.CompanyName=Shauren --win32metadata.ProductName=\"TrinityCore Client Launcher\"" }, "gypfile": true, "private": true, @@ -26,7 +25,6 @@ "@angular/router": "^14.2.1", "command-line-args": "^5.2.1", "electron-settings": "^4.0.2", - "ngx-electron": "^2.2.0", "rxjs": "^6.6.7", "tslib": "^2.0.0", "zone.js": "~0.11.8" @@ -42,7 +40,6 @@ "electron": "^20.1.3", "electron-packager": "^16.0.0", "electron-rebuild": "^3.2.9", - "patch-package": "^6.4.7", "ts-node": "~7.0.0", "tslint": "~6.1.0", "typescript": "~4.6.4" diff --git a/patches/ngx-electron+2.2.0.patch b/patches/ngx-electron+2.2.0.patch deleted file mode 100644 index 043f8ab..0000000 --- a/patches/ngx-electron+2.2.0.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff --git a/node_modules/ngx-electron/lib/electron.service.d.ts b/node_modules/ngx-electron/lib/electron.service.d.ts -index 15841b1..c8e90c3 100644 ---- a/node_modules/ngx-electron/lib/electron.service.d.ts -+++ b/node_modules/ngx-electron/lib/electron.service.d.ts -@@ -14,7 +14,6 @@ export declare class ElectronService { - readonly isArm: boolean; - readonly desktopCapturer: Electron.DesktopCapturer; - readonly ipcRenderer: Electron.IpcRenderer; -- readonly remote: Electron.Remote; - readonly webFrame: Electron.WebFrame; - readonly clipboard: Electron.Clipboard; - readonly crashReporter: Electron.CrashReporter; diff --git a/src/app/account/account.component.ts b/src/app/account/account.component.ts index a7e8312..a3eef56 100644 --- a/src/app/account/account.component.ts +++ b/src/app/account/account.component.ts @@ -1,10 +1,9 @@ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; -import { ElectronService } from 'ngx-electron'; import { timer, Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; -import { LaunchArgs } from '../../desktop-app/launch-args'; +import { LaunchArgs } from '../../ipc/launch-args'; import { Logger } from '../../desktop-app/logger'; import { ConfigurationService } from '../configuration.service'; import { LoginTicketService } from '../login-ticket.service'; @@ -50,7 +49,6 @@ export class AccountComponent implements OnInit, OnDestroy { constructor( private route: ActivatedRoute, private loginTicket: LoginTicketService, - private electronService: ElectronService, private configuration: ConfigurationService, private changeDetector: ChangeDetectorRef, private logger: Logger) { @@ -65,7 +63,7 @@ export class AccountComponent implements OnInit, OnDestroy { this.gameAccounts = [NO_GAME_ACCOUNT]; } this.selectedGameAccount = lastAccount || this.gameAccounts[0]; - this.electronService.ipcRenderer.send('login'); + window.electronAPI.login(); this.logger.log('Account | Initialized account view', this.gameAccounts.map(gameAccount => gameAccount.display_name), `last selected game account: ${lastAccount ? lastAccount.display_name : 'none'}`); } @@ -76,11 +74,12 @@ export class AccountComponent implements OnInit, OnDestroy { } launch(): void { - const launchArgs = new LaunchArgs(); - launchArgs.Portal = this.route.snapshot.data['portal']; - launchArgs.LoginTicket = this.loginTicket.getTicket(); - launchArgs.GameAccount = this.selectedGameAccount.display_name; - this.electronService.ipcRenderer.send('launcher', launchArgs); + const launchArgs: LaunchArgs = { + Portal: this.route.snapshot.data['portal'], + LoginTicket: this.loginTicket.getTicket(), + GameAccount: this.selectedGameAccount.display_name + }; + window.electronAPI.launchGame(launchArgs); this.configuration.LastGameAccount = this.selectedGameAccount.display_name; this.logger.log(`Account | Launching game with account ${launchArgs.GameAccount} and portal ${launchArgs.Portal}`); this.hasRecentlyLaunched = true; diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 3e2c99a..8690239 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -4,7 +4,6 @@ import { FormsModule } from '@angular/forms'; import { BrowserModule } from '@angular/platform-browser'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { RouterModule } from '@angular/router'; -import { ElectronService, NgxElectronModule } from 'ngx-electron'; import { Logger } from '../desktop-app/logger'; import { AccountComponent } from './account/account.component'; @@ -41,14 +40,13 @@ import { SettingsDialogComponent } from './settings-dialog/settings-dialog.compo HttpClientModule, BrowserModule, BrowserAnimationsModule, - RouterModule.forRoot(routes, { relativeLinkResolution: 'legacy' }), - NgxElectronModule + RouterModule.forRoot(routes, { relativeLinkResolution: 'legacy' }) ], providers: [ { provide: HTTP_INTERCEPTORS, useClass: BnetserverUrlHttpInterceptor, multi: true }, { provide: HTTP_INTERCEPTORS, useClass: LoggingHttpInterceptor, multi: true }, { provide: HTTP_INTERCEPTORS, useClass: AuthHttpInterceptor, multi: true }, - { provide: Argv, useFactory: argvFactory, deps: [ElectronService] }, + { provide: Argv, useFactory: argvFactory }, { provide: Logger, useClass: RendererLogger }, ConfigurationService, LoginService, diff --git a/src/app/argv.ts b/src/app/argv.ts index 79becc1..3bc188b 100644 --- a/src/app/argv.ts +++ b/src/app/argv.ts @@ -1,9 +1,7 @@ -import { ElectronService } from 'ngx-electron'; - export class Argv { [key: string]: any; } -export function argvFactory(electron: ElectronService) { - return electron.ipcRenderer.sendSync('get-argv'); +export function argvFactory() { + return window.electronAPI.getArgv(); } diff --git a/src/app/configuration.service.ts b/src/app/configuration.service.ts index f8a7560..46e0031 100644 --- a/src/app/configuration.service.ts +++ b/src/app/configuration.service.ts @@ -1,22 +1,14 @@ -import { Injectable, OnDestroy } from '@angular/core'; -import { ElectronService } from 'ngx-electron'; +import { Injectable } from '@angular/core'; -import { Configuration } from '../desktop-app/configuration'; +import { Configuration } from '../ipc/configuration'; @Injectable() -export class ConfigurationService implements OnDestroy { +export class ConfigurationService { private settingsCache: Configuration; - constructor(private electronService: ElectronService) { - this.settingsCache = this.electronService.ipcRenderer.sendSync('init-configuration'); - this.electronService.ipcRenderer.on('configuration-response', (event, args) => { - this.settingsCache = args; - }); - } - - ngOnDestroy(): void { - this.electronService.ipcRenderer.removeAllListeners('configuration-response'); + constructor() { + this.settingsCache = window.electronAPI.getConfiguration(); } get WowInstallDir(): string { @@ -24,7 +16,8 @@ export class ConfigurationService implements OnDestroy { } set WowInstallDir(wowInstallDir: string) { - this.electronService.ipcRenderer.send('configuration', ['WowInstallDir', wowInstallDir]); + window.electronAPI.setConfiguration(['WowInstallDir', wowInstallDir]) + .then(newConfiguration => this.settingsCache = newConfiguration); } get LoginServerUrl(): string { @@ -32,7 +25,8 @@ export class ConfigurationService implements OnDestroy { } set LoginServerUrl(loginServerUrl: string) { - this.electronService.ipcRenderer.send('configuration', ['LoginServerUrl', loginServerUrl]); + window.electronAPI.setConfiguration(['LoginServerUrl', loginServerUrl]) + .then(newConfiguration => this.settingsCache = newConfiguration); } get RememberLogin(): boolean { @@ -40,7 +34,8 @@ export class ConfigurationService implements OnDestroy { } set RememberLogin(rememberLogin: boolean) { - this.electronService.ipcRenderer.send('configuration', ['RememberLogin', rememberLogin]); + window.electronAPI.setConfiguration(['RememberLogin', rememberLogin]) + .then(newConfiguration => this.settingsCache = newConfiguration); } get LastGameAccount(): string { @@ -48,6 +43,7 @@ export class ConfigurationService implements OnDestroy { } set LastGameAccount(lastGameAccount: string) { - this.electronService.ipcRenderer.send('configuration', ['LastGameAccount', lastGameAccount]); + window.electronAPI.setConfiguration(['LastGameAccount', lastGameAccount]) + .then(newConfiguration => this.settingsCache = newConfiguration); } } diff --git a/src/app/login-ticket.service.ts b/src/app/login-ticket.service.ts index 2a9f5dc..26fbc48 100644 --- a/src/app/login-ticket.service.ts +++ b/src/app/login-ticket.service.ts @@ -1,10 +1,8 @@ import { HttpClient } from '@angular/common/http'; import { Injectable, NgZone, OnDestroy } from '@angular/core'; -import { ElectronService } from 'ngx-electron'; import { Observable, Subject, timer } from 'rxjs'; import { mergeMap, takeUntil } from 'rxjs/operators'; -import { CryptoResult } from '../desktop-app/crypto-result'; import { ConfigurationService } from './configuration.service'; import { LoginRefreshResult } from './login-refresh-result'; @@ -19,7 +17,6 @@ export class LoginTicketService implements OnDestroy { constructor( private configuration: ConfigurationService, - private electron: ElectronService, private zone: NgZone, private http: HttpClient) { } @@ -37,12 +34,11 @@ export class LoginTicketService implements OnDestroy { this.configuration.RememberLogin = rememberLogin; sessionStorage.setItem('ticket', loginTicket); if (rememberLogin) { - this.electron.ipcRenderer.once('encrypt', (event, args: CryptoResult) => { - if (args.success) { - localStorage.setItem('ticket', args.output); + window.electronAPI.encrypt(loginTicket).then(result => { + if (result.success) { + localStorage.setItem('ticket', result.output); } }); - this.electron.ipcRenderer.send('encrypt', loginTicket); } this.scheduleNextRefresh(new Date().getTime() / 1000 + 900); } @@ -76,10 +72,10 @@ export class LoginTicketService implements OnDestroy { restoreSavedTicket(): Observable { return new Observable(subscriber => { - this.electron.ipcRenderer.once('decrypt', (event: Electron.Event, args: CryptoResult) => { + window.electronAPI.decrypt(localStorage.getItem('ticket')).then(result => { this.zone.runGuarded(() => { - if (args.success) { - sessionStorage.setItem('ticket', args.output); + if (result.success) { + sessionStorage.setItem('ticket', result.output); subscriber.next(); subscriber.complete(); } else { @@ -87,7 +83,6 @@ export class LoginTicketService implements OnDestroy { } }); }); - this.electron.ipcRenderer.send('decrypt', localStorage.getItem('ticket')); }); } } diff --git a/src/app/main/main.component.ts b/src/app/main/main.component.ts index 77a2c45..09f1ca5 100644 --- a/src/app/main/main.component.ts +++ b/src/app/main/main.component.ts @@ -1,6 +1,5 @@ import { ChangeDetectionStrategy, ChangeDetectorRef, Component, NgZone, OnInit } from '@angular/core'; import { Router } from '@angular/router'; -import { ElectronService } from 'ngx-electron'; import { LoginTicketService } from '../login-ticket.service'; @@ -16,19 +15,18 @@ export class MainComponent implements OnInit { constructor( private zone: NgZone, private changeDetector: ChangeDetectorRef, - private electron: ElectronService, private router: Router, private loginTicket: LoginTicketService) { } ngOnInit(): void { - this.electron.ipcRenderer.on('open-settings', () => { + window.electronAPI.onOpenSettingsRequest(() => { this.zone.runGuarded(() => { this.openSettings = true; this.changeDetector.markForCheck(); }); }); - this.electron.ipcRenderer.on('logout', () => { + window.electronAPI.onLogoutRequest(() => { this.zone.runGuarded(() => { this.loginTicket.clear(); this.router.navigate(['/login']); diff --git a/src/app/renderer-logger.ts b/src/app/renderer-logger.ts index 4b100ca..5d055c9 100644 --- a/src/app/renderer-logger.ts +++ b/src/app/renderer-logger.ts @@ -1,5 +1,4 @@ import { Injectable } from '@angular/core'; -import { ElectronService } from 'ngx-electron'; import { LogEvent, Logger } from '../desktop-app/logger'; import { environment } from '../environments/environment'; @@ -11,7 +10,7 @@ export class RendererLogger extends Logger { private readonly logFn: (message?: any, ...optionalParams: any[]) => void; private readonly errorFn: (message?: any, ...optionalParams: any[]) => void; - constructor(private electron: ElectronService, private argv: Argv) { + constructor(private argv: Argv) { super(); this.logFn = this.resolveLogFunction('log'); this.errorFn = this.resolveLogFunction('error'); @@ -29,7 +28,7 @@ export class RendererLogger extends Logger { if (environment.production) { if (this.argv['logging-enabled']) { return function productionLogEvent() { - this.electron.ipcRenderer.send('logger', new LogEvent(fn, Array.prototype.slice.call(arguments))); + window.electronAPI.log(new LogEvent(fn, Array.prototype.slice.call(arguments))); }; } else { return function noopLogEvent() { }; @@ -38,7 +37,7 @@ export class RendererLogger extends Logger { if (this.argv['logging-enabled']) { return function devLogEvent() { const args = Array.prototype.slice.call(arguments); - this.electron.ipcRenderer.send('logger', new LogEvent(fn, args)); + window.electronAPI.log(new LogEvent(fn, args)); console[fn].apply(console, args); }; } diff --git a/src/app/settings-dialog/settings-dialog.component.ts b/src/app/settings-dialog/settings-dialog.component.ts index e1c3ba2..cf80667 100644 --- a/src/app/settings-dialog/settings-dialog.component.ts +++ b/src/app/settings-dialog/settings-dialog.component.ts @@ -12,7 +12,6 @@ import { ViewChild } from '@angular/core'; import { NgForm } from '@angular/forms'; -import { ElectronService } from 'ngx-electron'; import { Logger } from '../../desktop-app/logger'; import { ConfigurationService } from '../configuration.service'; @@ -46,7 +45,6 @@ export class SettingsDialogComponent implements OnChanges { constructor( private configurationService: ConfigurationService, - private electron: ElectronService, private zone: NgZone, private changeDetector: ChangeDetectorRef, private logger: Logger) { @@ -92,14 +90,13 @@ export class SettingsDialogComponent implements OnChanges { openDirectoryPicker(): void { this.logger.log('Settings | Opening directory picker for WowInstallDir'); - this.electron.ipcRenderer.once('directory-selected', (event: Electron.Event, dir: string[]) => { - if (dir != undefined) { - this.logger.log(`Settings | New WowInstallDir selected: ${dir[0]}.`); - this.zone.runGuarded(() => this.settingsForm.controls['gameInstallDir'].setValue(dir[0])); + window.electronAPI.selectDirectory().then(result => { + if (result.filePaths != undefined && !result.canceled) { + this.logger.log(`Settings | New WowInstallDir selected: ${result.filePaths[0]}.`); + this.zone.runGuarded(() => this.settingsForm.controls['gameInstallDir'].setValue(result.filePaths[0])); } else { this.logger.log('Settings | Closed directory picker without selection'); } }); - this.electron.ipcRenderer.send('open-directory-selection'); } } diff --git a/src/desktop-app/configuration.ts b/src/desktop-app/configuration.ts deleted file mode 100644 index 04a278d..0000000 --- a/src/desktop-app/configuration.ts +++ /dev/null @@ -1,15 +0,0 @@ -export class Configuration { - WowInstallDir: string; - LoginServerUrl: string; - RememberLogin: boolean; - LastGameAccount: string; -} - -export function getDefaultConfiguration(): Configuration { - return { - WowInstallDir: 'C:\\Program Files (x86)\\World of Warcraft', - LoginServerUrl: 'https://localhost:8081/bnetserver', - RememberLogin: false, - LastGameAccount: '' - }; -} diff --git a/src/desktop-app/crypto-result.ts b/src/desktop-app/crypto-result.ts deleted file mode 100644 index d59b10e..0000000 --- a/src/desktop-app/crypto-result.ts +++ /dev/null @@ -1,6 +0,0 @@ -export class CryptoResult { - constructor( - public success: boolean, - public output?: string) { - } -} diff --git a/src/desktop-app/desktop-main.ts b/src/desktop-app/desktop-main.ts index 54125d6..dfe2d4a 100644 --- a/src/desktop-app/desktop-main.ts +++ b/src/desktop-app/desktop-main.ts @@ -1,14 +1,15 @@ import * as commandLineArgs from 'command-line-args'; import { app, BrowserWindow, dialog, ipcMain, Menu } from 'electron'; import * as electronSettings from 'electron-settings'; +import * as path from 'path'; -import { Configuration, getDefaultConfiguration } from './configuration'; -import { CryptoResult } from './crypto-result'; -import { LaunchArgs } from './launch-args'; +import { Configuration } from '../ipc/configuration'; +import { CryptoResult } from '../ipc/crypto-result'; +import { LaunchArgs } from '../ipc/launch-args'; import { Logger } from './logger'; import { MainLogger } from './main-logger'; -const nativeLauncher: Launcher = require('./tc_launcher.node'); +const nativeLauncher: Launcher = require('../tc_launcher.node'); // Keep a global reference of the window object, if you don't, the window will // be closed automatically when the JavaScript object is garbage collected. @@ -37,23 +38,30 @@ function initializeLogging() { } } +function getDefaultConfiguration(): Configuration { + return { + WowInstallDir: 'C:\\Program Files (x86)\\World of Warcraft', + LoginServerUrl: 'https://localhost:8081/bnetserver', + RememberLogin: false, + LastGameAccount: '' + }; +} + function loadConfig() { configuration = Object.assign(getDefaultConfiguration(), electronSettings.getSync()); electronSettings.setSync(configuration); - ipcMain.on('init-configuration', (event) => { event.returnValue = configuration; }); - ipcMain.on('configuration', (event, args) => { + ipcMain.on('get-configuration', (event) => { event.returnValue = configuration; }); + ipcMain.handle('configuration', (event, args: [Key, Configuration[Key]]) => { if (args != undefined) { - for (let i = 0; i < args.length; i += 2) { - if (args[i + 1] == undefined) { - delete configuration[args[i]]; - } else { - configuration[args[i]] = args[i + 1]; - } + if (args[1] == undefined) { + delete configuration[args[0]]; + } else { + configuration[args[0]] = args[1]; } electronSettings.setSync(configuration); } - event.sender.send('configuration-response', configuration); + return configuration; }); } @@ -65,8 +73,7 @@ function createWindow() { backgroundColor: '#2D2D30', show: false, webPreferences: { - nodeIntegration: true, - contextIsolation: false + preload: path.join(__dirname, 'renderer-preload.js') } }); @@ -80,7 +87,7 @@ function createWindow() { }); // and load the index.html of the app. - applicationWindow.loadURL(`file://${__dirname}/index.html`); + applicationWindow.loadFile(path.join(__dirname, '../web-app/index.html')); // Emitted when the window is closed. applicationWindow.on('closed', () => { @@ -131,6 +138,13 @@ function createMenu() { applicationWindow.webContents.send('open-settings'); } }, + // { + // label: 'Reload', + // accelerator: 'CmdOrCtrl+R', + // click: () => { + // applicationWindow.webContents.reloadIgnoringCache(); + // } + // }, // { role: 'toggleDevTools' }, { type: 'separator' }, logoutMenuItem, @@ -190,22 +204,22 @@ function createMenu() { } function setupCrypto() { - ipcMain.on('encrypt', (event: Electron.IpcMainEvent, args: string) => { + ipcMain.handle('encrypt', (event: Electron.IpcMainInvokeEvent, args: string): CryptoResult => { try { const result = nativeLauncher.encryptString(args); - event.sender.send('encrypt', new CryptoResult(true, result.toString('base64'))); + return { success: true, output: result.toString('base64') }; } catch (e) { logger.error(`Crypto | Failed to encrypt string: ${(e as Error).message}`); - event.sender.send('encrypt', new CryptoResult(false)); + return { success: false }; } }); - ipcMain.on('decrypt', (event: Electron.IpcMainEvent, args: string) => { + ipcMain.handle('decrypt', (event: Electron.IpcMainInvokeEvent, args: string): CryptoResult => { try { const result = nativeLauncher.decryptString(Buffer.from(args, 'base64')); - event.sender.send('decrypt', new CryptoResult(true, result)); + return { success: true, output: result }; } catch (e) { logger.error(`Crypto | Failed to decrypt string: ${(e as Error).message}`); - event.sender.send('decrypt', new CryptoResult(false)); + return { success: false }; } }); } @@ -226,11 +240,11 @@ app.on('ready', () => { setupCrypto(); - ipcMain.on('open-directory-selection', (event: Electron.IpcMainEvent) => { - event.sender.send('directory-selected', dialog.showOpenDialog(applicationWindow, { properties: ['openDirectory'] })); + ipcMain.handle('select-directory', (event: Electron.IpcMainEvent) => { + return dialog.showOpenDialog(applicationWindow, { properties: ['openDirectory'] }); }); - ipcMain.on('launcher', (event: Electron.IpcMainEvent, args: LaunchArgs) => { + ipcMain.on('launch-game', (event: Electron.IpcMainEvent, args: LaunchArgs) => { nativeLauncher.launchGame( configuration.WowInstallDir, args.Portal, diff --git a/src/desktop-app/package.json b/src/desktop-app/package.json index 687b230..3388d0d 100644 --- a/src/desktop-app/package.json +++ b/src/desktop-app/package.json @@ -7,7 +7,7 @@ "type": "git", "url": "https://github.com/Shauren/tc-client-launcher.git" }, - "main": "desktop-main.js", + "main": "desktop-app/desktop-main.js", "dependencies": { "command-line-args": "^5.2.1", "electron-settings": "^4.0.2" diff --git a/src/desktop-app/renderer-preload.ts b/src/desktop-app/renderer-preload.ts new file mode 100644 index 0000000..0b8e39d --- /dev/null +++ b/src/desktop-app/renderer-preload.ts @@ -0,0 +1,44 @@ +import { contextBridge, ipcRenderer } from 'electron'; +import { ElectronApi } from '../ipc/electron-api'; +import { Configuration } from '../ipc/configuration'; +import { CryptoResult } from '../ipc/crypto-result'; +import { ILogEvent } from '../ipc/log-event'; +import { LaunchArgs } from '../ipc/launch-args'; + +const api: ElectronApi = { + getArgv(): { [p: string]: any } { + return ipcRenderer.sendSync('get-argv'); + }, + getConfiguration(): Configuration { + return ipcRenderer.sendSync('get-configuration'); + }, + setConfiguration(change: [Key, Configuration[Key]]): Promise { + return ipcRenderer.invoke('configuration', change); + }, + encrypt(data: string): Promise { + return ipcRenderer.invoke('encrypt', data); + }, + decrypt(data: string): Promise { + return ipcRenderer.invoke('decrypt', data); + }, + log(event: ILogEvent): void { + ipcRenderer.send('logger', event); + }, + login() { + ipcRenderer.send('login'); + }, + launchGame(args: LaunchArgs) { + ipcRenderer.send('launch-game', args); + }, + selectDirectory(): Promise<{ filePaths: string[]; canceled: boolean }> { + return ipcRenderer.invoke('select-directory'); + }, + onOpenSettingsRequest(callback: () => void) { + ipcRenderer.on('open-settings', callback); + }, + onLogoutRequest(callback: () => void) { + ipcRenderer.on('logout', callback); + } +}; + +contextBridge.exposeInMainWorld('electronAPI', api); diff --git a/src/ipc/configuration.ts b/src/ipc/configuration.ts new file mode 100644 index 0000000..33e7f08 --- /dev/null +++ b/src/ipc/configuration.ts @@ -0,0 +1,6 @@ +export interface Configuration { + WowInstallDir: string; + LoginServerUrl: string; + RememberLogin: boolean; + LastGameAccount: string; +} diff --git a/src/ipc/crypto-result.ts b/src/ipc/crypto-result.ts new file mode 100644 index 0000000..df031fe --- /dev/null +++ b/src/ipc/crypto-result.ts @@ -0,0 +1,4 @@ +export interface CryptoResult { + success: boolean; + output?: string; +} diff --git a/src/ipc/electron-api.d.ts b/src/ipc/electron-api.d.ts new file mode 100644 index 0000000..32514fc --- /dev/null +++ b/src/ipc/electron-api.d.ts @@ -0,0 +1,24 @@ +import { Configuration } from './configuration'; +import { CryptoResult } from './crypto-result'; +import { ILogEvent } from './log-event'; +import { LaunchArgs } from './launch-args'; + +export interface ElectronApi { + getArgv(): { [key: string]: any; }; + getConfiguration(): Configuration; + setConfiguration(change: [Key, Configuration[Key]]): Promise; + encrypt(data: string): Promise; + decrypt(data: string): Promise; + log(event: ILogEvent): void; + login(): void; + launchGame(args: LaunchArgs): void; + selectDirectory(): Promise<{ filePaths: string[], canceled: boolean }>; + onOpenSettingsRequest(callback: () => void): void; + onLogoutRequest(callback: () => void): void; +} + +declare global { + interface Window { + electronAPI: ElectronApi; + } +} diff --git a/src/desktop-app/launch-args.ts b/src/ipc/launch-args.ts similarity index 70% rename from src/desktop-app/launch-args.ts rename to src/ipc/launch-args.ts index d7b06f1..bde7a9c 100644 --- a/src/desktop-app/launch-args.ts +++ b/src/ipc/launch-args.ts @@ -1,4 +1,4 @@ -export class LaunchArgs { +export interface LaunchArgs { Portal: string; LoginTicket: string; GameAccount: string; diff --git a/src/ipc/log-event.ts b/src/ipc/log-event.ts new file mode 100644 index 0000000..e7222fd --- /dev/null +++ b/src/ipc/log-event.ts @@ -0,0 +1,4 @@ +export interface ILogEvent { + fn: keyof Console; + args: any[]; +} diff --git a/src/native/Win32Launcher.cpp b/src/native/Win32Launcher.cpp index 3d534e2..eb076c6 100644 --- a/src/native/Win32Launcher.cpp +++ b/src/native/Win32Launcher.cpp @@ -77,9 +77,10 @@ bool StoreLoginTicket(char const* portal, char const* loginTicket, char const* g bool LaunchGameWithLogin(char const* gameInstallDir) { char commandLine[32768] = {}; + strcat(commandLine, "\""); strcat(commandLine, gameInstallDir); strcat(commandLine, "\\"); - strcat(commandLine, R"("Arctium WoW Launcher.exe")"); + strcat(commandLine, "Arctium WoW Launcher.exe\""); strcat(commandLine, " -launcherlogin -Config Config2.wtf"); STARTUPINFOA startupInfo{sizeof(STARTUPINFOA)};