From 2e3c89269dcc3c8af14f5852e8972ad7ed0c3524 Mon Sep 17 00:00:00 2001 From: Oscar Hinton Date: Mon, 11 Apr 2022 19:53:16 +0200 Subject: [PATCH 01/19] Resolve cross-compile for rust (#1481) --- .github/workflows/build.yml | 106 +++++++++++++++++++++ desktop_native/build.js | 22 +++++ desktop_native/index.js | 114 ++++++++++++++++++++++ desktop_native/package-lock.json | 34 ++----- desktop_native/package.json | 27 ++++-- package-lock.json | 29 +++--- package.json | 4 +- src/package-lock.json | 157 ++++++++++--------------------- webpack.main.js | 2 +- 9 files changed, 343 insertions(+), 152 deletions(-) create mode 100644 desktop_native/build.js create mode 100644 desktop_native/index.js diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 2ef3d73e..53fe40b3 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -149,6 +149,20 @@ jobs: - name: Install Node dependencies run: npm ci + - name: Cache Native Module + uses: actions/cache@48af2dc4a9e8278b89d7fa154b955c30c6aaab09 # v3.0.2 + id: cache + with: + path: desktop_native/dist + key: rust-${{ runner.os }}-${{ hashFiles('desktop_native/**/*') }} + + - name: Build Native Module + if: steps.cache.outputs.cache-hit != 'true' + working-directory: './desktop_native' + run: | + npm ci + npm run build:cross-platform + - name: Build application run: npm run dist:lin @@ -228,11 +242,18 @@ jobs: shell: pwsh run: choco install checksum --no-progress + - name: Rust + shell: pwsh + run: | + rustup target install i686-pc-windows-msvc + rustup target install aarch64-pc-windows-msvc + - name: Print environment run: | node --version npm --version choco --version + rustup show - name: Login to Azure uses: Azure/login@1f63701bf3e6892515f1b7ce2d2bf1708b46beaf @@ -253,6 +274,20 @@ jobs: - name: Install Node dependencies run: npm ci + - name: Cache Native Module + uses: actions/cache@48af2dc4a9e8278b89d7fa154b955c30c6aaab09 # v3.0.2 + id: cache + with: + path: desktop_native/dist + key: rust-${{ runner.os }}-${{ hashFiles('desktop_native/**/*') }} + + - name: Build Native Module + if: steps.cache.outputs.cache-hit != 'true' + working-directory: './desktop_native' + run: | + npm ci + npm run build:cross-platform + - name: Build & Sign (dev) env: ELECTRON_BUILDER_SIGN: 1 @@ -404,10 +439,15 @@ jobs: npm install -g node-gyp node-gyp install $(node -v) + - name: Rust + shell: pwsh + run: rustup target install aarch64-apple-darwin + - name: Print environment run: | node --version npm --version + rustup show echo "GitHub ref: $GITHUB_REF" echo "GitHub event: $GITHUB_EVENT" @@ -496,6 +536,20 @@ jobs: $package.build | Add-Member -MemberType NoteProperty -Name buildVersion -Value "$env:BUILD_NUMBER"; $package | ConvertTo-Json -Depth 32 | Set-Content $env:GITHUB_WORKSPACE\package.json; + - name: Cache Native Module + uses: actions/cache@48af2dc4a9e8278b89d7fa154b955c30c6aaab09 # v3.0.2 + id: cache + with: + path: desktop_native/dist + key: rust-${{ runner.os }}-${{ hashFiles('desktop_native/**/*') }} + + - name: Build Native Module + if: steps.cache.outputs.cache-hit != 'true' + working-directory: './desktop_native' + run: | + npm ci + npm run build:cross-platform + - name: Install Node dependencies run: npm ci @@ -548,10 +602,15 @@ jobs: npm install -g node-gyp node-gyp install $(node -v) + - name: Rust + shell: pwsh + run: rustup target install aarch64-apple-darwin + - name: Print environment run: | node --version npm --version + rustup show echo "GitHub ref: $GITHUB_REF" echo "GitHub event: $GITHUB_EVENT" @@ -640,6 +699,20 @@ jobs: $package.build | Add-Member -MemberType NoteProperty -Name buildVersion -Value "$env:BUILD_NUMBER"; $package | ConvertTo-Json -Depth 32 | Set-Content $env:GITHUB_WORKSPACE\package.json; + - name: Cache Native Module + uses: actions/cache@48af2dc4a9e8278b89d7fa154b955c30c6aaab09 # v3.0.2 + id: cache + with: + path: desktop_native/dist + key: rust-${{ runner.os }}-${{ hashFiles('desktop_native/**/*') }} + + - name: Build Native Module + if: steps.cache.outputs.cache-hit != 'true' + working-directory: './desktop_native' + run: | + npm ci + npm run build:cross-platform + - name: NPM install run: npm ci @@ -735,10 +808,15 @@ jobs: npm install -g node-gyp node-gyp install $(node -v) + - name: Rust + shell: pwsh + run: rustup target install aarch64-apple-darwin + - name: Print environment run: | node --version npm --version + rustup show echo "GitHub ref: $GITHUB_REF" echo "GitHub event: $GITHUB_EVENT" @@ -827,6 +905,20 @@ jobs: $package.build | Add-Member -MemberType NoteProperty -Name buildVersion -Value "$env:BUILD_NUMBER"; $package | ConvertTo-Json -Depth 32 | Set-Content $env:GITHUB_WORKSPACE\package.json; + - name: Cache Native Module + uses: actions/cache@48af2dc4a9e8278b89d7fa154b955c30c6aaab09 # v3.0.2 + id: cache + with: + path: desktop_native/dist + key: rust-${{ runner.os }}-${{ hashFiles('desktop_native/**/*') }} + + - name: Build Native Module + if: steps.cache.outputs.cache-hit != 'true' + working-directory: './desktop_native' + run: | + npm ci + npm run build:cross-platform + - name: NPM install run: npm ci @@ -1006,6 +1098,20 @@ jobs: $package.build | Add-Member -MemberType NoteProperty -Name buildVersion -Value "$env:BUILD_NUMBER"; $package | ConvertTo-Json -Depth 32 | Set-Content $env:GITHUB_WORKSPACE\package.json; + - name: Cache Native Module + uses: actions/cache@48af2dc4a9e8278b89d7fa154b955c30c6aaab09 # v3.0.2 + id: cache + with: + path: desktop_native/dist + key: rust-${{ runner.os }}-${{ hashFiles('desktop_native/**/*') }} + + - name: Build Native Module + if: steps.cache.outputs.cache-hit != 'true' + working-directory: './desktop_native' + run: | + npm ci + npm run build:cross-platform + - name: NPM install run: npm ci diff --git a/desktop_native/build.js b/desktop_native/build.js new file mode 100644 index 00000000..ca42f7b0 --- /dev/null +++ b/desktop_native/build.js @@ -0,0 +1,22 @@ +/* eslint-disable @typescript-eslint/no-var-requires */ +const child_process = require("child_process"); +const process = require("process"); + +let targets = []; +switch (process.platform) { + case "win32": + targets = ["i686-pc-windows-msvc", "x86_64-pc-windows-msvc", "aarch64-pc-windows-msvc"]; + break; + + case "darwin": + targets = ["x86_64-apple-darwin", "aarch64-apple-darwin"]; + break; + + default: + targets = ['x86_64-unknown-linux-gnu']; + break; +} + +targets.forEach(target => { + child_process.execSync(`npm run build -- --target ${target}`, {stdio: 'inherit'}); +}); diff --git a/desktop_native/index.js b/desktop_native/index.js new file mode 100644 index 00000000..572f3d60 --- /dev/null +++ b/desktop_native/index.js @@ -0,0 +1,114 @@ +/* eslint-disable @typescript-eslint/no-var-requires */ +const { readFileSync } = require('fs') + +const { platform, arch } = process + +let nativeBinding = null +let isMusl = false +let loadError = null + +switch (platform) { + case 'win32': + switch (arch) { + case 'x64': + try { + nativeBinding = require('./dist/desktop_native.win32-x64-msvc') + } catch (e) { + loadError = e + } + break + case 'ia32': + try { + nativeBinding = require('./dist/desktop_native.win32-ia32-msvc') + } catch (e) { + loadError = e + } + break + case 'arm64': + try { + nativeBinding = require('./dist/desktop_native.win32-arm64-msvc') + } catch (e) { + loadError = e + } + break + default: + throw new Error(`Unsupported architecture on Windows: ${arch}`) + } + break + case 'darwin': + switch (arch) { + case 'x64': + try { + nativeBinding = require('./dist/desktop_native.darwin-x64') + } catch (e) { + loadError = e + } + break + case 'arm64': + try { + nativeBinding = require('./dist/desktop_native.darwin-arm64') + } catch (e) { + loadError = e + } + break + default: + throw new Error(`Unsupported architecture on macOS: ${arch}`) + } + break + case 'linux': + switch (arch) { + case 'x64': + isMusl = readFileSync('/usr/bin/ldd', 'utf8').includes('musl') + if (isMusl) { + try { + nativeBinding = require('./dist/desktop_native.linux-x64-musl') + } catch (e) { + loadError = e + } + } else { + try { + nativeBinding = require('./dist/desktop_native.linux-x64-gnu') + } catch (e) { + loadError = e + } + } + break + case 'arm64': + isMusl = readFileSync('/usr/bin/ldd', 'utf8').includes('musl') + if (isMusl) { + try { + nativeBinding = require('./dist/desktop_native.linux-arm64-musl') + } catch (e) { + loadError = e + } + } else { + try { + nativeBinding = require('./dist/desktop_native.linux-arm64-gnu') + } catch (e) { + loadError = e + } + } + break + case 'arm': + try { + nativeBinding = require('./dist/desktop_native.linux-arm-gnueabihf') + } catch (e) { + loadError = e + } + break + default: + throw new Error(`Unsupported architecture on Linux: ${arch}`) + } + break + default: + throw new Error(`Unsupported OS: ${platform}, architecture: ${arch}`) +} + +if (!nativeBinding) { + if (loadError) { + throw loadError + } + throw new Error(`Failed to load native binding`) +} + +module.exports.nativeBinding diff --git a/desktop_native/package-lock.json b/desktop_native/package-lock.json index b72bb80c..70e590de 100644 --- a/desktop_native/package-lock.json +++ b/desktop_native/package-lock.json @@ -1,23 +1,22 @@ { - "name": "desktop_native", + "name": "@bitwarden/desktop_native", "version": "0.1.0", "lockfileVersion": 2, "requires": true, "packages": { "": { - "name": "desktop_native", + "name": "@bitwarden/desktop_native", "version": "0.1.0", "hasInstallScript": true, "license": "GPL-3.0", "devDependencies": { - "@napi-rs/cli": "^2.4.4", - "cargo-cp-artifact": "^0.1" + "@napi-rs/cli": "^2.6.2" } }, "node_modules/@napi-rs/cli": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@napi-rs/cli/-/cli-2.4.4.tgz", - "integrity": "sha512-f+tvwCv1ka24dBqI2DgBhR7Oxl3DKHOp4onxLXwyBFt6iCADnr3YZIr1/2Iq5r3uqxFgaf01bfPsRQZPkEp0kQ==", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@napi-rs/cli/-/cli-2.6.2.tgz", + "integrity": "sha512-EmH+DQDEBUIoqMim0cc+X96ImtcIZLFjgW5WWORpzYnA9Ug7zNPO7jCLMhIQRd/p5AdWaXrT4SVXc/aip09rKQ==", "dev": true, "bin": { "napi": "scripts/index.js" @@ -29,28 +28,13 @@ "type": "github", "url": "https://github.com/sponsors/Brooooooklyn" } - }, - "node_modules/cargo-cp-artifact": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/cargo-cp-artifact/-/cargo-cp-artifact-0.1.6.tgz", - "integrity": "sha512-CQw0doK/aaF7j041666XzuilHxqMxaKkn+I5vmBsd8SAwS0cO5CqVEVp0xJwOKstyqWZ6WK4Ww3O6p26x/Goyg==", - "dev": true, - "bin": { - "cargo-cp-artifact": "bin/cargo-cp-artifact.js" - } } }, "dependencies": { "@napi-rs/cli": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/@napi-rs/cli/-/cli-2.4.4.tgz", - "integrity": "sha512-f+tvwCv1ka24dBqI2DgBhR7Oxl3DKHOp4onxLXwyBFt6iCADnr3YZIr1/2Iq5r3uqxFgaf01bfPsRQZPkEp0kQ==", - "dev": true - }, - "cargo-cp-artifact": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/cargo-cp-artifact/-/cargo-cp-artifact-0.1.6.tgz", - "integrity": "sha512-CQw0doK/aaF7j041666XzuilHxqMxaKkn+I5vmBsd8SAwS0cO5CqVEVp0xJwOKstyqWZ6WK4Ww3O6p26x/Goyg==", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@napi-rs/cli/-/cli-2.6.2.tgz", + "integrity": "sha512-EmH+DQDEBUIoqMim0cc+X96ImtcIZLFjgW5WWORpzYnA9Ug7zNPO7jCLMhIQRd/p5AdWaXrT4SVXc/aip09rKQ==", "dev": true } } diff --git a/desktop_native/package.json b/desktop_native/package.json index 4ddb2758..7fe4c970 100644 --- a/desktop_native/package.json +++ b/desktop_native/package.json @@ -1,19 +1,32 @@ { - "name": "desktop_native", + "name": "@bitwarden/desktop_native", "version": "0.1.0", "description": "", "main": "index.node", "scripts": { - "build": "napi build --release --js true", - "build-debug": "npm run build --", - "build-release": "npm run build -- --release", - "install": "npm run build-release", + "build": "napi build dist --platform --release --js true", + "build:debug": "napi build dist --platform --js true", + "build:cross-platform": "node build.js", "test": "cargo test" }, "author": "", "license": "GPL-3.0", "devDependencies": { - "@napi-rs/cli": "^2.4.4", - "cargo-cp-artifact": "^0.1" + "@napi-rs/cli": "^2.6.2" + }, + "napi": { + "name": "desktop_native", + "triples": { + "defaults": true, + "additional": [ + "x86_64-unknown-linux-musl", + "aarch64-unknown-linux-gnu", + "i686-pc-windows-msvc", + "armv7-unknown-linux-gnueabihf", + "aarch64-apple-darwin", + "aarch64-unknown-linux-musl", + "aarch64-pc-windows-msvc" + ] + } } } diff --git a/package-lock.json b/package-lock.json index 134babd1..fe7887aa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -77,7 +77,7 @@ } }, "desktop_native": { - "name": "desktop_native", + "name": "@bitwarden/desktop_native", "version": "0.1.0", "hasInstallScript": true, "license": "GPL-3.0", @@ -87,6 +87,7 @@ } }, "jslib/angular": { + "name": "@bitwarden/jslib-angular", "version": "0.0.0", "license": "GPL-3.0", "dependencies": { @@ -112,6 +113,7 @@ } }, "jslib/common": { + "name": "@bitwarden/jslib-common", "version": "0.0.0", "license": "GPL-3.0", "dependencies": { @@ -138,6 +140,7 @@ } }, "jslib/electron": { + "name": "@bitwarden/jslib-electron", "version": "0.0.0", "license": "GPL-3.0", "dependencies": { @@ -2748,9 +2751,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001325", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001325.tgz", - "integrity": "sha512-sB1bZHjseSjDtijV1Hb7PB2Zd58Kyx+n/9EotvZ4Qcz2K3d0lWB8dB4nb8wN/TsOGFq3UuAm0zQZNQ4SoR7TrQ==", + "version": "1.0.30001327", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001327.tgz", + "integrity": "sha512-1/Cg4jlD9qjZzhbzkzEaAC2JHsP0WrOc8Rd/3a3LuajGzGWR/hD7TVyvq99VqmTy99eVh8Zkmdq213OgvgXx7w==", "dev": true, "funding": [ { @@ -9678,9 +9681,9 @@ } }, "node_modules/semver/node_modules/lru-cache": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.7.3.tgz", - "integrity": "sha512-WY9wjJNQt9+PZilnLbuFKM+SwDull9+6IAguOrarOMoOHTcJ9GnXSO11+Gw6c7xtDkBkthR57OZMtZKYr+1CEw==", + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.8.0.tgz", + "integrity": "sha512-AmXqneQZL3KZMIgBpaPTeI6pfwh+xQ2vutMsyqOu1TBdEXFZgpG/80wuJ531w2ZN7TI0/oc8CPxzh/DKQudZqg==", "engines": { "node": ">=12" } @@ -13422,9 +13425,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001325", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001325.tgz", - "integrity": "sha512-sB1bZHjseSjDtijV1Hb7PB2Zd58Kyx+n/9EotvZ4Qcz2K3d0lWB8dB4nb8wN/TsOGFq3UuAm0zQZNQ4SoR7TrQ==", + "version": "1.0.30001327", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001327.tgz", + "integrity": "sha512-1/Cg4jlD9qjZzhbzkzEaAC2JHsP0WrOc8Rd/3a3LuajGzGWR/hD7TVyvq99VqmTy99eVh8Zkmdq213OgvgXx7w==", "dev": true }, "canonical-path": { @@ -18533,9 +18536,9 @@ }, "dependencies": { "lru-cache": { - "version": "7.7.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.7.3.tgz", - "integrity": "sha512-WY9wjJNQt9+PZilnLbuFKM+SwDull9+6IAguOrarOMoOHTcJ9GnXSO11+Gw6c7xtDkBkthR57OZMtZKYr+1CEw==" + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.8.0.tgz", + "integrity": "sha512-AmXqneQZL3KZMIgBpaPTeI6pfwh+xQ2vutMsyqOu1TBdEXFZgpG/80wuJ531w2ZN7TI0/oc8CPxzh/DKQudZqg==" } } }, diff --git a/package.json b/package.json index 6c1b1909..54fa7625 100644 --- a/package.json +++ b/package.json @@ -82,7 +82,9 @@ ], "files": [ "**/*", - "!**/node_modules/@bitwarden/desktop-native/**/*" + "!**/node_modules/@bitwarden/desktop-native/**/*", + "**/node_modules/@bitwarden/desktop-native/index.js", + "**/node_modules/@bitwarden/desktop-native/dist/desktop_native.${platform}-${arch}.node" ], "mac": { "electronUpdaterCompatibility": ">=0.0.1", diff --git a/src/package-lock.json b/src/package-lock.json index 3bb3927f..a34fc70f 100644 --- a/src/package-lock.json +++ b/src/package-lock.json @@ -1,19 +1,33 @@ { "name": "@bitwarden/desktop", - "version": "1.30.1", + "version": "1.32.2", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@bitwarden/desktop", - "version": "1.30.1", + "version": "1.32.2", "license": "GPL-3.0", "dependencies": { + "@bitwarden/desktop-native": "file:../desktop_native", "@nodert-win10-rs4/windows.security.credentials.ui": "^0.4.4", - "forcefocus": "^1.1.0", - "keytar": "7.7.0" + "forcefocus": "^1.1.0" } }, + "../desktop_native": { + "name": "@bitwarden/desktop_native", + "version": "0.1.0", + "hasInstallScript": true, + "license": "GPL-3.0", + "devDependencies": { + "@napi-rs/cli": "^2.4.4", + "cargo-cp-artifact": "^0.1" + } + }, + "node_modules/@bitwarden/desktop-native": { + "resolved": "../desktop_native", + "link": true + }, "node_modules/@nodert-win10-rs4/windows.security.credentials.ui": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/@nodert-win10-rs4/windows.security.credentials.ui/-/windows.security.credentials.ui-0.4.4.tgz", @@ -285,42 +299,6 @@ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, - "node_modules/keytar": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/keytar/-/keytar-7.7.0.tgz", - "integrity": "sha512-YEY9HWqThQc5q5xbXbRwsZTh2PJ36OSYRjSv3NN2xf5s5dpLTjEZnC2YikR29OaVybf9nQ0dJ/80i40RS97t/A==", - "hasInstallScript": true, - "dependencies": { - "node-addon-api": "^3.0.0", - "prebuild-install": "^6.0.0" - } - }, - "node_modules/keytar/node_modules/prebuild-install": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-6.1.4.tgz", - "integrity": "sha512-Z4vpywnK1lBg+zdPCVCsKq0xO66eEV9rWo2zrROGGiRS4JtueBOdlB1FnY8lcy7JsUud/Q3ijUxyWN26Ika0vQ==", - "dependencies": { - "detect-libc": "^1.0.3", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^1.0.1", - "node-abi": "^2.21.0", - "npmlog": "^4.0.1", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^3.0.3", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - }, - "bin": { - "prebuild-install": "bin.js" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/mimic-response": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", @@ -333,9 +311,9 @@ } }, "node_modules/minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" }, "node_modules/mkdirp-classic": { "version": "0.5.3", @@ -360,11 +338,6 @@ "semver": "^5.4.1" } }, - "node_modules/node-addon-api": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", - "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==" - }, "node_modules/noop-logger": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz", @@ -494,9 +467,9 @@ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" }, "node_modules/signal-exit": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", - "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==" + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, "node_modules/simple-concat": { "version": "1.0.1", @@ -518,9 +491,9 @@ ] }, "node_modules/simple-get": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz", - "integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.1.tgz", + "integrity": "sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==", "dependencies": { "decompress-response": "^4.2.0", "once": "^1.3.1", @@ -623,9 +596,12 @@ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "node_modules/which-pm-runs": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", - "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.1.0.tgz", + "integrity": "sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==", + "engines": { + "node": ">=4" + } }, "node_modules/wide-align": { "version": "1.1.5", @@ -642,6 +618,13 @@ } }, "dependencies": { + "@bitwarden/desktop-native": { + "version": "file:../desktop_native", + "requires": { + "@napi-rs/cli": "^2.4.4", + "cargo-cp-artifact": "^0.1" + } + }, "@nodert-win10-rs4/windows.security.credentials.ui": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/@nodert-win10-rs4/windows.security.credentials.ui/-/windows.security.credentials.ui-0.4.4.tgz", @@ -841,46 +824,15 @@ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" }, - "keytar": { - "version": "7.7.0", - "resolved": "https://registry.npmjs.org/keytar/-/keytar-7.7.0.tgz", - "integrity": "sha512-YEY9HWqThQc5q5xbXbRwsZTh2PJ36OSYRjSv3NN2xf5s5dpLTjEZnC2YikR29OaVybf9nQ0dJ/80i40RS97t/A==", - "requires": { - "node-addon-api": "^3.0.0", - "prebuild-install": "^6.0.0" - }, - "dependencies": { - "prebuild-install": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-6.1.4.tgz", - "integrity": "sha512-Z4vpywnK1lBg+zdPCVCsKq0xO66eEV9rWo2zrROGGiRS4JtueBOdlB1FnY8lcy7JsUud/Q3ijUxyWN26Ika0vQ==", - "requires": { - "detect-libc": "^1.0.3", - "expand-template": "^2.0.3", - "github-from-package": "0.0.0", - "minimist": "^1.2.3", - "mkdirp-classic": "^0.5.3", - "napi-build-utils": "^1.0.1", - "node-abi": "^2.21.0", - "npmlog": "^4.0.1", - "pump": "^3.0.0", - "rc": "^1.2.7", - "simple-get": "^3.0.3", - "tar-fs": "^2.0.0", - "tunnel-agent": "^0.6.0" - } - } - } - }, "mimic-response": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==" }, "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" }, "mkdirp-classic": { "version": "0.5.3", @@ -905,11 +857,6 @@ "semver": "^5.4.1" } }, - "node-addon-api": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", - "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==" - }, "noop-logger": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz", @@ -1021,9 +968,9 @@ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" }, "signal-exit": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", - "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==" + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, "simple-concat": { "version": "1.0.1", @@ -1031,9 +978,9 @@ "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==" }, "simple-get": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.0.tgz", - "integrity": "sha512-bCR6cP+aTdScaQCnQKbPKtJOKDp/hj9EDLJo3Nw4y1QksqaovlW/bnptB6/c1e+qmNIDHRK+oXFDdEqBT8WzUA==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-3.1.1.tgz", + "integrity": "sha512-CQ5LTKGfCpvE1K0n2us+kuMPbk/q0EKl82s4aheV9oXjFEz6W/Y7oQFVJuU6QG77hRT4Ghb5RURteF5vnWjupA==", "requires": { "decompress-response": "^4.2.0", "once": "^1.3.1", @@ -1120,9 +1067,9 @@ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "which-pm-runs": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.0.0.tgz", - "integrity": "sha1-Zws6+8VS4LVd9rd4DKdGFfI60cs=" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.1.0.tgz", + "integrity": "sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==" }, "wide-align": { "version": "1.1.5", diff --git a/webpack.main.js b/webpack.main.js index 85a95ad9..0984e77b 100644 --- a/webpack.main.js +++ b/webpack.main.js @@ -75,7 +75,7 @@ const main = { "@nodert-win10-rs4/windows.security.credentials.ui": "commonjs2 @nodert-win10-rs4/windows.security.credentials.ui", forcefocus: "commonjs2 forcefocus", - keytar: "commonjs2 keytar", + "@bitwarden/desktop-native": "commonjs2 @bitwarden/desktop-native", }, }; From 70db11e6593504817ff2a142f92c812125015105 Mon Sep 17 00:00:00 2001 From: Oscar Hinton Date: Tue, 12 Apr 2022 08:24:09 +0200 Subject: [PATCH 02/19] Update readme with rust instructions (#1482) --- README.md | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 9020d9e4..440b085a 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ The Bitwarden desktop app is written using Electron and Angular. The application # Build/Run -**Requirements** +## Requirements - [Node.js](https://nodejs.org) v16.13.1 (LTS) or greater - NPM v8 @@ -22,14 +22,24 @@ The Bitwarden desktop app is written using Electron and Angular. The application - Linux: - The following packages `build-essential libsecret-1-dev libglib2.0-dev` -**Run the app** +## Build native module + +The desktop application relies on native code written in rust, which needs to be compiled first. ```bash -npm install +cd desktop_native +npm ci +npm run build +``` + +## Run the app + +```bash +npm ci npm run electron ``` -**Debug Native Messaging** +### Debug Native Messaging Native Messaging (communication with the browser extension) works by having the browser start a lightweight proxy application baked into our desktop binary. To setup an environment which allows for easy debugging you will need to build the application for distribution, i.e. `npm run dist:`, start the dist version and enable desktop integration. This will write some manifests From e0d7d2b43a94f634c06d0bf66717d2bad0b4c9b2 Mon Sep 17 00:00:00 2001 From: Matt Gibson Date: Tue, 12 Apr 2022 09:36:25 -0400 Subject: [PATCH 03/19] Add descriptions to vague messages (#1476) * Add descriptions to vague messages * Fix typo --- src/locales/en/messages.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/locales/en/messages.json b/src/locales/en/messages.json index 5c2ed68d..ea39579c 100644 --- a/src/locales/en/messages.json +++ b/src/locales/en/messages.json @@ -1587,7 +1587,8 @@ "description": "'Send' is a noun and the name of a feature called 'Bitwarden Send'. It should not be translated." }, "maxAccessCount": { - "message": "Maximum Access Count" + "message": "Maximum Access Count", + "description": "This text will be displayed after a Send has been accessed the maximum amount of times." }, "maxAccessCountDesc": { "message": "If set, users will no longer be able to access this Send once the maximum access count is reached.", @@ -1859,7 +1860,8 @@ "message": "Username Type" }, "plusAddressedEmail": { - "message": "Plus Addressed Email" + "message": "Plus Addressed Email", + "description": "Username generator option that appends a random sub-address to the username. For example: address+subaddress@email.com" }, "plusAddressedEmailDesc": { "message": "Use your email provider's sub-addressing capabilities." From 2b0d7ac72ca2aefe694eec3610091ed9e2e919e2 Mon Sep 17 00:00:00 2001 From: Oscar Hinton Date: Wed, 13 Apr 2022 15:04:48 +0200 Subject: [PATCH 04/19] Bump libsecret for rust (#1480) --- desktop_native/Cargo.lock | 4 ++-- desktop_native/Cargo.toml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/desktop_native/Cargo.lock b/desktop_native/Cargo.lock index 0382ada8..aec92d25 100644 --- a/desktop_native/Cargo.lock +++ b/desktop_native/Cargo.lock @@ -343,9 +343,9 @@ checksum = "1bf2e165bb3457c8e098ea76f3e3bc9db55f87aa90d52d0e6be741470916aaa4" [[package]] name = "libsecret" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b8d814edb0cb306ffded3f1bfe72d6689529f95f7313a718331802723a73e5a" +checksum = "d4af5a2342942fa42d706a424e9f9914287fb8317132750fd73a241140ac38c1" dependencies = [ "bitflags", "gio", diff --git a/desktop_native/Cargo.toml b/desktop_native/Cargo.toml index 13f0bacb..dbc27602 100644 --- a/desktop_native/Cargo.toml +++ b/desktop_native/Cargo.toml @@ -40,4 +40,4 @@ security-framework-sys = "2.6.1" [target.'cfg(target_os = "linux")'.dependencies] gio = "0.15.6" -libsecret = "0.1.3" +libsecret = "0.1.4" From 8be88a731ccd16c122d606a735bcf3028ca9a153 Mon Sep 17 00:00:00 2001 From: Oscar Hinton Date: Wed, 13 Apr 2022 16:32:08 +0200 Subject: [PATCH 05/19] Resolve rust for windows and linux (#1485) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 54fa7625..aa36b148 100644 --- a/package.json +++ b/package.json @@ -84,7 +84,7 @@ "**/*", "!**/node_modules/@bitwarden/desktop-native/**/*", "**/node_modules/@bitwarden/desktop-native/index.js", - "**/node_modules/@bitwarden/desktop-native/dist/desktop_native.${platform}-${arch}.node" + "**/node_modules/@bitwarden/desktop-native/dist/desktop_native.${platform}-${arch}*.node" ], "mac": { "electronUpdaterCompatibility": ">=0.0.1", From 3862a19571b10899ebb8c97c0b4bd3bc175f0070 Mon Sep 17 00:00:00 2001 From: Joseph Flinn <58369717+joseph-flinn@users.noreply.github.com> Date: Mon, 18 Apr 2022 14:28:49 -0700 Subject: [PATCH 06/19] Bumping pinned commit of the download-artifact action to bypass the broken GitHub api (#1488) --- .github/workflows/release.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 7e978b16..8d8bb965 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -63,7 +63,7 @@ jobs: echo "::set-output name=branch-name::$BRANCH_NAME" - name: Download all artifacts - uses: bitwarden/gh-actions/download-artifacts@23433be15ed6fd046ce12b6889c5184a8d9c8783 + uses: bitwarden/gh-actions/download-artifacts@c1fa8e09871a860862d6bbe36184b06d2c7e35a8 with: workflow: build.yml workflow_conclusion: success @@ -142,7 +142,7 @@ jobs: run: mkdir dist - name: Download Snap artifact - uses: bitwarden/gh-actions/download-artifacts@23433be15ed6fd046ce12b6889c5184a8d9c8783 + uses: bitwarden/gh-actions/download-artifacts@c1fa8e09871a860862d6bbe36184b06d2c7e35a8 with: workflow: build.yml workflow_conclusion: success @@ -179,7 +179,7 @@ jobs: run: New-Item -ItemType directory -Path ./dist - name: Download choco artifact - uses: bitwarden/gh-actions/download-artifacts@23433be15ed6fd046ce12b6889c5184a8d9c8783 + uses: bitwarden/gh-actions/download-artifacts@c1fa8e09871a860862d6bbe36184b06d2c7e35a8 with: workflow: build.yml workflow_conclusion: success From a4ca9bf64cc821454759d3e59a6c420fcd3b5338 Mon Sep 17 00:00:00 2001 From: Thomas Rittson <31796059+eliykat@users.noreply.github.com> Date: Wed, 20 Apr 2022 01:29:43 +1000 Subject: [PATCH 07/19] Update jslib (#1490) * Update jslib * Update name of UserVerificationComponent --- jslib | 2 +- src/app/app.module.ts | 4 ++-- ...component.html => user-verification.component.html} | 0 ...ord.component.ts => user-verification.component.ts} | 10 +++++----- src/app/vault/export.component.html | 4 ++-- 5 files changed, 10 insertions(+), 10 deletions(-) rename src/app/components/{verify-master-password.component.html => user-verification.component.html} (100%) rename src/app/components/{verify-master-password.component.ts => user-verification.component.ts} (55%) diff --git a/jslib b/jslib index f3a4fde5..6bcadc4f 160000 --- a/jslib +++ b/jslib @@ -1 +1 @@ -Subproject commit f3a4fde513dc16779e85597bd00027b160671db7 +Subproject commit 6bcadc4f408db2c150753f53a07d6f8888b6e9ff diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 037117f4..3cd8197d 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -83,7 +83,7 @@ import { AppRoutingModule } from "./app-routing.module"; import { AppComponent } from "./app.component"; import { PasswordRepromptComponent } from "./components/password-reprompt.component"; import { SetPinComponent } from "./components/set-pin.component"; -import { VerifyMasterPasswordComponent } from "./components/verify-master-password.component"; +import { UserVerificationComponent } from "./components/user-verification.component"; import { AccountSwitcherComponent } from "./layout/account-switcher.component"; import { HeaderComponent } from "./layout/header.component"; import { NavComponent } from "./layout/nav.component"; @@ -212,9 +212,9 @@ registerLocaleData(localeZhTw, "zh-TW"); TwoFactorComponent, TwoFactorOptionsComponent, UpdateTempPasswordComponent, + UserVerificationComponent, VaultComponent, VaultTimeoutInputComponent, - VerifyMasterPasswordComponent, ViewComponent, ViewCustomFieldsComponent, ], diff --git a/src/app/components/verify-master-password.component.html b/src/app/components/user-verification.component.html similarity index 100% rename from src/app/components/verify-master-password.component.html rename to src/app/components/user-verification.component.html diff --git a/src/app/components/verify-master-password.component.ts b/src/app/components/user-verification.component.ts similarity index 55% rename from src/app/components/verify-master-password.component.ts rename to src/app/components/user-verification.component.ts index 56b36505..dc12c94a 100644 --- a/src/app/components/verify-master-password.component.ts +++ b/src/app/components/user-verification.component.ts @@ -2,16 +2,16 @@ import { animate, style, transition, trigger } from "@angular/animations"; import { Component } from "@angular/core"; import { NG_VALUE_ACCESSOR } from "@angular/forms"; -import { VerifyMasterPasswordComponent as BaseComponent } from "jslib-angular/components/verify-master-password.component"; +import { UserVerificationComponent as BaseComponent } from "jslib-angular/components/user-verification.component"; @Component({ - selector: "app-verify-master-password", - templateUrl: "verify-master-password.component.html", + selector: "app-user-verification", + templateUrl: "user-verification.component.html", providers: [ { provide: NG_VALUE_ACCESSOR, multi: true, - useExisting: VerifyMasterPasswordComponent, + useExisting: UserVerificationComponent, }, ], animations: [ @@ -20,4 +20,4 @@ import { VerifyMasterPasswordComponent as BaseComponent } from "jslib-angular/co ]), ], }) -export class VerifyMasterPasswordComponent extends BaseComponent {} +export class UserVerificationComponent extends BaseComponent {} diff --git a/src/app/vault/export.component.html b/src/app/vault/export.component.html index f733a845..26325a02 100644 --- a/src/app/vault/export.component.html +++ b/src/app/vault/export.component.html @@ -21,8 +21,8 @@ - - + +
-
- +
+
-
- +
+
-
-