mirror of
https://github.com/bitwarden/browser
synced 2025-12-11 22:03:36 +00:00
[BEEEP] [EC-141] Rust - Windows hello (#2635)
This commit is contained in:
110
.github/workflows/build-desktop.yml
vendored
110
.github/workflows/build-desktop.yml
vendored
@@ -159,7 +159,7 @@ jobs:
|
|||||||
- name: Set up environment
|
- name: Set up environment
|
||||||
run: |
|
run: |
|
||||||
sudo apt-get update
|
sudo apt-get update
|
||||||
sudo apt-get -y install pkg-config libxss-dev libsecret-1-dev rpm
|
sudo apt-get -y install pkg-config libxss-dev libsecret-1-dev rpm musl-dev musl-tools
|
||||||
|
|
||||||
- name: Set up Snap
|
- name: Set up Snap
|
||||||
run: sudo snap install snapcraft --classic
|
run: sudo snap install snapcraft --classic
|
||||||
@@ -175,6 +175,27 @@ jobs:
|
|||||||
run: npm ci
|
run: npm ci
|
||||||
working-directory: ./
|
working-directory: ./
|
||||||
|
|
||||||
|
- name: Cache Native Module
|
||||||
|
uses: actions/cache@48af2dc4a9e8278b89d7fa154b955c30c6aaab09 # v3.0.2
|
||||||
|
id: cache
|
||||||
|
with:
|
||||||
|
path: |
|
||||||
|
apps/desktop/desktop_native/*.node
|
||||||
|
${{ env.RUNNER_TEMP }}/.cargo/registry
|
||||||
|
${{ env.RUNNER_TEMP }}/.cargo/git
|
||||||
|
key: rust-${{ runner.os }}-${{ hashFiles('apps/desktop/desktop_native/**/*') }}
|
||||||
|
|
||||||
|
- name: Build Native Module
|
||||||
|
if: steps.cache.outputs.cache-hit != 'true'
|
||||||
|
working-directory: apps/desktop/desktop_native
|
||||||
|
env:
|
||||||
|
PKG_CONFIG_ALLOW_CROSS: true
|
||||||
|
PKG_CONFIG_ALL_STATIC: true
|
||||||
|
TARGET: musl
|
||||||
|
run: |
|
||||||
|
rustup target add x86_64-unknown-linux-musl
|
||||||
|
npm run build:cross-platform
|
||||||
|
|
||||||
- name: Build application
|
- name: Build application
|
||||||
run: npm run dist:lin
|
run: npm run dist:lin
|
||||||
|
|
||||||
@@ -256,11 +277,18 @@ jobs:
|
|||||||
- name: Set up environment
|
- name: Set up environment
|
||||||
run: choco install checksum --no-progress
|
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
|
- name: Print environment
|
||||||
run: |
|
run: |
|
||||||
node --version
|
node --version
|
||||||
npm --version
|
npm --version
|
||||||
choco --version
|
choco --version
|
||||||
|
rustup show
|
||||||
|
|
||||||
- name: Login to Azure
|
- name: Login to Azure
|
||||||
uses: Azure/login@1f63701bf3e6892515f1b7ce2d2bf1708b46beaf
|
uses: Azure/login@1f63701bf3e6892515f1b7ce2d2bf1708b46beaf
|
||||||
@@ -282,6 +310,19 @@ jobs:
|
|||||||
run: npm ci
|
run: npm ci
|
||||||
working-directory: ./
|
working-directory: ./
|
||||||
|
|
||||||
|
- name: Cache Native Module
|
||||||
|
uses: actions/cache@48af2dc4a9e8278b89d7fa154b955c30c6aaab09 # v3.0.2
|
||||||
|
id: cache
|
||||||
|
with:
|
||||||
|
path: apps/desktop/desktop_native/*.node
|
||||||
|
key: rust-${{ runner.os }}-${{ hashFiles('apps/desktop/desktop_native/**/*') }}
|
||||||
|
|
||||||
|
- name: Build Native Module
|
||||||
|
if: steps.cache.outputs.cache-hit != 'true'
|
||||||
|
working-directory: apps/desktop/desktop_native
|
||||||
|
run: |
|
||||||
|
npm run build:cross-platform
|
||||||
|
|
||||||
- name: Build & Sign (dev)
|
- name: Build & Sign (dev)
|
||||||
env:
|
env:
|
||||||
ELECTRON_BUILDER_SIGN: 1
|
ELECTRON_BUILDER_SIGN: 1
|
||||||
@@ -443,10 +484,15 @@ jobs:
|
|||||||
npm install -g node-gyp
|
npm install -g node-gyp
|
||||||
node-gyp install $(node -v)
|
node-gyp install $(node -v)
|
||||||
|
|
||||||
|
- name: Rust
|
||||||
|
shell: pwsh
|
||||||
|
run: rustup target install aarch64-apple-darwin
|
||||||
|
|
||||||
- name: Print environment
|
- name: Print environment
|
||||||
run: |
|
run: |
|
||||||
node --version
|
node --version
|
||||||
npm --version
|
npm --version
|
||||||
|
rustup show
|
||||||
echo "GitHub ref: $GITHUB_REF"
|
echo "GitHub ref: $GITHUB_REF"
|
||||||
echo "GitHub event: $GITHUB_EVENT"
|
echo "GitHub event: $GITHUB_EVENT"
|
||||||
|
|
||||||
@@ -536,6 +582,19 @@ jobs:
|
|||||||
run: npm ci
|
run: npm ci
|
||||||
working-directory: ./
|
working-directory: ./
|
||||||
|
|
||||||
|
- name: Cache Native Module
|
||||||
|
uses: actions/cache@48af2dc4a9e8278b89d7fa154b955c30c6aaab09 # v3.0.2
|
||||||
|
id: cache
|
||||||
|
with:
|
||||||
|
path: apps/desktop/desktop_native/*.node
|
||||||
|
key: rust-${{ runner.os }}-${{ hashFiles('apps/desktop/desktop_native/**/*') }}
|
||||||
|
|
||||||
|
- name: Build Native Module
|
||||||
|
if: steps.cache.outputs.cache-hit != 'true'
|
||||||
|
working-directory: apps/desktop/desktop_native
|
||||||
|
run: |
|
||||||
|
npm run build:cross-platform
|
||||||
|
|
||||||
- name: Build application (dev)
|
- name: Build application (dev)
|
||||||
run: npm run build
|
run: npm run build
|
||||||
|
|
||||||
@@ -570,10 +629,15 @@ jobs:
|
|||||||
npm install -g node-gyp
|
npm install -g node-gyp
|
||||||
node-gyp install $(node -v)
|
node-gyp install $(node -v)
|
||||||
|
|
||||||
|
- name: Rust
|
||||||
|
shell: pwsh
|
||||||
|
run: rustup target install aarch64-apple-darwin
|
||||||
|
|
||||||
- name: Print environment
|
- name: Print environment
|
||||||
run: |
|
run: |
|
||||||
node --version
|
node --version
|
||||||
npm --version
|
npm --version
|
||||||
|
rustup show
|
||||||
echo "GitHub ref: $GITHUB_REF"
|
echo "GitHub ref: $GITHUB_REF"
|
||||||
echo "GitHub event: $GITHUB_EVENT"
|
echo "GitHub event: $GITHUB_EVENT"
|
||||||
|
|
||||||
@@ -663,6 +727,19 @@ jobs:
|
|||||||
run: npm ci
|
run: npm ci
|
||||||
working-directory: ./
|
working-directory: ./
|
||||||
|
|
||||||
|
- name: Cache Native Module
|
||||||
|
uses: actions/cache@48af2dc4a9e8278b89d7fa154b955c30c6aaab09 # v3.0.2
|
||||||
|
id: cache
|
||||||
|
with:
|
||||||
|
path: apps/desktop/desktop_native/*.node
|
||||||
|
key: rust-${{ runner.os }}-${{ hashFiles('apps/desktop/desktop_native/**/*') }}
|
||||||
|
|
||||||
|
- name: Build Native Module
|
||||||
|
if: steps.cache.outputs.cache-hit != 'true'
|
||||||
|
working-directory: apps/desktop/desktop_native
|
||||||
|
run: |
|
||||||
|
npm run build:cross-platform
|
||||||
|
|
||||||
- name: Build
|
- name: Build
|
||||||
if: steps.build-cache.outputs.cache-hit != 'true'
|
if: steps.build-cache.outputs.cache-hit != 'true'
|
||||||
run: npm run build
|
run: npm run build
|
||||||
@@ -776,10 +853,15 @@ jobs:
|
|||||||
npm install -g node-gyp
|
npm install -g node-gyp
|
||||||
node-gyp install $(node -v)
|
node-gyp install $(node -v)
|
||||||
|
|
||||||
|
- name: Rust
|
||||||
|
shell: pwsh
|
||||||
|
run: rustup target install aarch64-apple-darwin
|
||||||
|
|
||||||
- name: Print environment
|
- name: Print environment
|
||||||
run: |
|
run: |
|
||||||
node --version
|
node --version
|
||||||
npm --version
|
npm --version
|
||||||
|
rustup show
|
||||||
echo "GitHub ref: $GITHUB_REF"
|
echo "GitHub ref: $GITHUB_REF"
|
||||||
echo "GitHub event: $GITHUB_EVENT"
|
echo "GitHub event: $GITHUB_EVENT"
|
||||||
|
|
||||||
@@ -869,6 +951,19 @@ jobs:
|
|||||||
run: npm ci
|
run: npm ci
|
||||||
working-directory: ./
|
working-directory: ./
|
||||||
|
|
||||||
|
- name: Cache Native Module
|
||||||
|
uses: actions/cache@48af2dc4a9e8278b89d7fa154b955c30c6aaab09 # v3.0.2
|
||||||
|
id: cache
|
||||||
|
with:
|
||||||
|
path: apps/desktop/desktop_native/*.node
|
||||||
|
key: rust-${{ runner.os }}-${{ hashFiles('apps/desktop/desktop_native/**/*') }}
|
||||||
|
|
||||||
|
- name: Build Native Module
|
||||||
|
if: steps.cache.outputs.cache-hit != 'true'
|
||||||
|
working-directory: apps/desktop/desktop_native
|
||||||
|
run: |
|
||||||
|
npm run build:cross-platform
|
||||||
|
|
||||||
- name: Build
|
- name: Build
|
||||||
if: steps.build-cache.outputs.cache-hit != 'true'
|
if: steps.build-cache.outputs.cache-hit != 'true'
|
||||||
run: npm run build
|
run: npm run build
|
||||||
@@ -1067,6 +1162,19 @@ jobs:
|
|||||||
run: npm ci
|
run: npm ci
|
||||||
working-directory: ./
|
working-directory: ./
|
||||||
|
|
||||||
|
- name: Cache Native Module
|
||||||
|
uses: actions/cache@48af2dc4a9e8278b89d7fa154b955c30c6aaab09 # v3.0.2
|
||||||
|
id: cache
|
||||||
|
with:
|
||||||
|
path: apps/desktop/desktop_native/*.node
|
||||||
|
key: rust-${{ runner.os }}-${{ hashFiles('apps/desktop/desktop_native/**/*') }}
|
||||||
|
|
||||||
|
- name: Build Native Module
|
||||||
|
if: steps.cache.outputs.cache-hit != 'true'
|
||||||
|
working-directory: apps/desktop/desktop_native
|
||||||
|
run: |
|
||||||
|
npm run build:cross-platform
|
||||||
|
|
||||||
- name: Build
|
- name: Build
|
||||||
if: steps.build-cache.outputs.cache-hit != 'true'
|
if: steps.build-cache.outputs.cache-hit != 'true'
|
||||||
run: npm run build
|
run: npm run build
|
||||||
|
|||||||
8
apps/desktop/desktop_native/.cargo/config
Normal file
8
apps/desktop/desktop_native/.cargo/config
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
[target.x86_64-pc-windows-msvc]
|
||||||
|
rustflags = ["-Ctarget-feature=+crt-static"]
|
||||||
|
|
||||||
|
[target.i686-pc-windows-msvc]
|
||||||
|
rustflags = ["-Ctarget-feature=+crt-static"]
|
||||||
|
|
||||||
|
[target.aarch64-pc-windows-msvc]
|
||||||
|
rustflags = ["-Ctarget-feature=+crt-static"]
|
||||||
@@ -25,9 +25,11 @@ widestring = "0.5.1"
|
|||||||
windows = {version = "0.32.0", features = [
|
windows = {version = "0.32.0", features = [
|
||||||
"alloc",
|
"alloc",
|
||||||
"Foundation",
|
"Foundation",
|
||||||
|
"Security_Credentials_UI",
|
||||||
"Storage_Streams",
|
"Storage_Streams",
|
||||||
"Win32_Foundation",
|
"Win32_Foundation",
|
||||||
"Win32_Security_Credentials",
|
"Win32_Security_Credentials",
|
||||||
|
"Win32_System_WinRT",
|
||||||
]}
|
]}
|
||||||
|
|
||||||
[target.'cfg(windows)'.dev-dependencies]
|
[target.'cfg(windows)'.dev-dependencies]
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ switch (process.platform) {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
targets = ['x86_64-unknown-linux-gnu'];
|
targets = ['x86_64-unknown-linux-musl'];
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
4
apps/desktop/desktop_native/index.d.ts
vendored
4
apps/desktop/desktop_native/index.d.ts
vendored
@@ -13,3 +13,7 @@ export namespace passwords {
|
|||||||
/** Delete the stored password from the keychain. */
|
/** Delete the stored password from the keychain. */
|
||||||
export function deletePassword(service: string, account: string): Promise<void>
|
export function deletePassword(service: string, account: string): Promise<void>
|
||||||
}
|
}
|
||||||
|
export namespace biometrics {
|
||||||
|
export function prompt(hwnd: Buffer, message: string): Promise<boolean>
|
||||||
|
export function available(): Promise<boolean>
|
||||||
|
}
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ switch (platform) {
|
|||||||
if (localFileExisted) {
|
if (localFileExisted) {
|
||||||
nativeBinding = require('./desktop_native.android-arm64.node')
|
nativeBinding = require('./desktop_native.android-arm64.node')
|
||||||
} else {
|
} else {
|
||||||
nativeBinding = require('@bitwarden/desktop_native-android-arm64')
|
nativeBinding = require('@bitwarden/desktop-native-android-arm64')
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
loadError = e
|
loadError = e
|
||||||
@@ -42,7 +42,7 @@ switch (platform) {
|
|||||||
if (localFileExisted) {
|
if (localFileExisted) {
|
||||||
nativeBinding = require('./desktop_native.android-arm-eabi.node')
|
nativeBinding = require('./desktop_native.android-arm-eabi.node')
|
||||||
} else {
|
} else {
|
||||||
nativeBinding = require('@bitwarden/desktop_native-android-arm-eabi')
|
nativeBinding = require('@bitwarden/desktop-native-android-arm-eabi')
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
loadError = e
|
loadError = e
|
||||||
@@ -62,7 +62,7 @@ switch (platform) {
|
|||||||
if (localFileExisted) {
|
if (localFileExisted) {
|
||||||
nativeBinding = require('./desktop_native.win32-x64-msvc.node')
|
nativeBinding = require('./desktop_native.win32-x64-msvc.node')
|
||||||
} else {
|
} else {
|
||||||
nativeBinding = require('@bitwarden/desktop_native-win32-x64-msvc')
|
nativeBinding = require('@bitwarden/desktop-native-win32-x64-msvc')
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
loadError = e
|
loadError = e
|
||||||
@@ -76,7 +76,7 @@ switch (platform) {
|
|||||||
if (localFileExisted) {
|
if (localFileExisted) {
|
||||||
nativeBinding = require('./desktop_native.win32-ia32-msvc.node')
|
nativeBinding = require('./desktop_native.win32-ia32-msvc.node')
|
||||||
} else {
|
} else {
|
||||||
nativeBinding = require('@bitwarden/desktop_native-win32-ia32-msvc')
|
nativeBinding = require('@bitwarden/desktop-native-win32-ia32-msvc')
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
loadError = e
|
loadError = e
|
||||||
@@ -90,7 +90,7 @@ switch (platform) {
|
|||||||
if (localFileExisted) {
|
if (localFileExisted) {
|
||||||
nativeBinding = require('./desktop_native.win32-arm64-msvc.node')
|
nativeBinding = require('./desktop_native.win32-arm64-msvc.node')
|
||||||
} else {
|
} else {
|
||||||
nativeBinding = require('@bitwarden/desktop_native-win32-arm64-msvc')
|
nativeBinding = require('@bitwarden/desktop-native-win32-arm64-msvc')
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
loadError = e
|
loadError = e
|
||||||
@@ -108,7 +108,7 @@ switch (platform) {
|
|||||||
if (localFileExisted) {
|
if (localFileExisted) {
|
||||||
nativeBinding = require('./desktop_native.darwin-x64.node')
|
nativeBinding = require('./desktop_native.darwin-x64.node')
|
||||||
} else {
|
} else {
|
||||||
nativeBinding = require('@bitwarden/desktop_native-darwin-x64')
|
nativeBinding = require('@bitwarden/desktop-native-darwin-x64')
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
loadError = e
|
loadError = e
|
||||||
@@ -122,7 +122,7 @@ switch (platform) {
|
|||||||
if (localFileExisted) {
|
if (localFileExisted) {
|
||||||
nativeBinding = require('./desktop_native.darwin-arm64.node')
|
nativeBinding = require('./desktop_native.darwin-arm64.node')
|
||||||
} else {
|
} else {
|
||||||
nativeBinding = require('@bitwarden/desktop_native-darwin-arm64')
|
nativeBinding = require('@bitwarden/desktop-native-darwin-arm64')
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
loadError = e
|
loadError = e
|
||||||
@@ -141,7 +141,7 @@ switch (platform) {
|
|||||||
if (localFileExisted) {
|
if (localFileExisted) {
|
||||||
nativeBinding = require('./desktop_native.freebsd-x64.node')
|
nativeBinding = require('./desktop_native.freebsd-x64.node')
|
||||||
} else {
|
} else {
|
||||||
nativeBinding = require('@bitwarden/desktop_native-freebsd-x64')
|
nativeBinding = require('@bitwarden/desktop-native-freebsd-x64')
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
loadError = e
|
loadError = e
|
||||||
@@ -150,7 +150,6 @@ switch (platform) {
|
|||||||
case 'linux':
|
case 'linux':
|
||||||
switch (arch) {
|
switch (arch) {
|
||||||
case 'x64':
|
case 'x64':
|
||||||
if (isMusl()) {
|
|
||||||
localFileExisted = existsSync(
|
localFileExisted = existsSync(
|
||||||
join(__dirname, 'desktop_native.linux-x64-musl.node')
|
join(__dirname, 'desktop_native.linux-x64-musl.node')
|
||||||
)
|
)
|
||||||
@@ -158,28 +157,13 @@ switch (platform) {
|
|||||||
if (localFileExisted) {
|
if (localFileExisted) {
|
||||||
nativeBinding = require('./desktop_native.linux-x64-musl.node')
|
nativeBinding = require('./desktop_native.linux-x64-musl.node')
|
||||||
} else {
|
} else {
|
||||||
nativeBinding = require('@bitwarden/desktop_native-linux-x64-musl')
|
nativeBinding = require('@bitwarden/desktop-native-linux-x64-musl')
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
loadError = e
|
loadError = e
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
localFileExisted = existsSync(
|
|
||||||
join(__dirname, 'desktop_native.linux-x64-gnu.node')
|
|
||||||
)
|
|
||||||
try {
|
|
||||||
if (localFileExisted) {
|
|
||||||
nativeBinding = require('./desktop_native.linux-x64-gnu.node')
|
|
||||||
} else {
|
|
||||||
nativeBinding = require('@bitwarden/desktop_native-linux-x64-gnu')
|
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
loadError = e
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break
|
break
|
||||||
case 'arm64':
|
case 'arm64':
|
||||||
if (isMusl()) {
|
|
||||||
localFileExisted = existsSync(
|
localFileExisted = existsSync(
|
||||||
join(__dirname, 'desktop_native.linux-arm64-musl.node')
|
join(__dirname, 'desktop_native.linux-arm64-musl.node')
|
||||||
)
|
)
|
||||||
@@ -187,25 +171,11 @@ switch (platform) {
|
|||||||
if (localFileExisted) {
|
if (localFileExisted) {
|
||||||
nativeBinding = require('./desktop_native.linux-arm64-musl.node')
|
nativeBinding = require('./desktop_native.linux-arm64-musl.node')
|
||||||
} else {
|
} else {
|
||||||
nativeBinding = require('@bitwarden/desktop_native-linux-arm64-musl')
|
nativeBinding = require('@bitwarden/desktop-native-linux-arm64-musl')
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
loadError = e
|
loadError = e
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
localFileExisted = existsSync(
|
|
||||||
join(__dirname, 'desktop_native.linux-arm64-gnu.node')
|
|
||||||
)
|
|
||||||
try {
|
|
||||||
if (localFileExisted) {
|
|
||||||
nativeBinding = require('./desktop_native.linux-arm64-gnu.node')
|
|
||||||
} else {
|
|
||||||
nativeBinding = require('@bitwarden/desktop_native-linux-arm64-gnu')
|
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
loadError = e
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break
|
break
|
||||||
case 'arm':
|
case 'arm':
|
||||||
localFileExisted = existsSync(
|
localFileExisted = existsSync(
|
||||||
@@ -215,7 +185,7 @@ switch (platform) {
|
|||||||
if (localFileExisted) {
|
if (localFileExisted) {
|
||||||
nativeBinding = require('./desktop_native.linux-arm-gnueabihf.node')
|
nativeBinding = require('./desktop_native.linux-arm-gnueabihf.node')
|
||||||
} else {
|
} else {
|
||||||
nativeBinding = require('@bitwarden/desktop_native-linux-arm-gnueabihf')
|
nativeBinding = require('@bitwarden/desktop-native-linux-arm-gnueabihf')
|
||||||
}
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
loadError = e
|
loadError = e
|
||||||
@@ -236,6 +206,7 @@ if (!nativeBinding) {
|
|||||||
throw new Error(`Failed to load native binding`)
|
throw new Error(`Failed to load native binding`)
|
||||||
}
|
}
|
||||||
|
|
||||||
const { passwords } = nativeBinding
|
const { passwords, biometrics } = nativeBinding
|
||||||
|
|
||||||
module.exports.passwords = passwords
|
module.exports.passwords = passwords
|
||||||
|
module.exports.biometrics = biometrics
|
||||||
|
|||||||
41
apps/desktop/desktop_native/package-lock.json
generated
41
apps/desktop/desktop_native/package-lock.json
generated
@@ -1,41 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "@bitwarden/desktop_native",
|
|
||||||
"version": "0.1.0",
|
|
||||||
"lockfileVersion": 2,
|
|
||||||
"requires": true,
|
|
||||||
"packages": {
|
|
||||||
"": {
|
|
||||||
"name": "@bitwarden/desktop_native",
|
|
||||||
"version": "0.1.0",
|
|
||||||
"hasInstallScript": true,
|
|
||||||
"license": "GPL-3.0",
|
|
||||||
"devDependencies": {
|
|
||||||
"@napi-rs/cli": "^2.6.2"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@napi-rs/cli": {
|
|
||||||
"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"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">= 10"
|
|
||||||
},
|
|
||||||
"funding": {
|
|
||||||
"type": "github",
|
|
||||||
"url": "https://github.com/sponsors/Brooooooklyn"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"@napi-rs/cli": {
|
|
||||||
"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
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,11 +1,10 @@
|
|||||||
{
|
{
|
||||||
"name": "@bitwarden/desktop_native",
|
"name": "@bitwarden/desktop-native",
|
||||||
"version": "0.1.0",
|
"version": "0.1.0",
|
||||||
"description": "",
|
"description": "",
|
||||||
"main": "index.node",
|
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"build": "napi build --release --platform",
|
"build": "napi build --release --platform --js false",
|
||||||
"build:debug": "napi build --platform",
|
"build:debug": "napi build --platform --js false",
|
||||||
"build:cross-platform": "node build.js",
|
"build:cross-platform": "node build.js",
|
||||||
"test": "cargo test"
|
"test": "cargo test"
|
||||||
},
|
},
|
||||||
|
|||||||
9
apps/desktop/desktop_native/src/biometric/macos.rs
Normal file
9
apps/desktop/desktop_native/src/biometric/macos.rs
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
use anyhow::{Result, bail};
|
||||||
|
|
||||||
|
pub fn prompt(_hwnd: Vec<u8>, _message: String) -> Result<bool> {
|
||||||
|
bail!("platform not supported");
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn available() -> Result<bool> {
|
||||||
|
bail!("platform not supported");
|
||||||
|
}
|
||||||
5
apps/desktop/desktop_native/src/biometric/mod.rs
Normal file
5
apps/desktop/desktop_native/src/biometric/mod.rs
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
#[cfg_attr(target_os = "linux", path = "unix.rs")]
|
||||||
|
#[cfg_attr(target_os = "windows", path = "windows.rs")]
|
||||||
|
#[cfg_attr(target_os = "macos", path = "macos.rs")]
|
||||||
|
mod biometric;
|
||||||
|
pub use biometric::*;
|
||||||
9
apps/desktop/desktop_native/src/biometric/unix.rs
Normal file
9
apps/desktop/desktop_native/src/biometric/unix.rs
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
use anyhow::{Result, bail};
|
||||||
|
|
||||||
|
pub fn prompt(_hwnd: Vec<u8>, _message: String) -> Result<bool> {
|
||||||
|
bail!("platform not supported");
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn available() -> Result<bool> {
|
||||||
|
bail!("platform not supported");
|
||||||
|
}
|
||||||
51
apps/desktop/desktop_native/src/biometric/windows.rs
Normal file
51
apps/desktop/desktop_native/src/biometric/windows.rs
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
use anyhow::Result;
|
||||||
|
use windows::{
|
||||||
|
core::factory, Foundation::IAsyncOperation, Security::Credentials::UI::*,
|
||||||
|
Win32::Foundation::HWND, Win32::System::WinRT::IUserConsentVerifierInterop,
|
||||||
|
};
|
||||||
|
|
||||||
|
pub fn prompt(hwnd: Vec<u8>, message: String) -> Result<bool> {
|
||||||
|
let interop = factory::<UserConsentVerifier, IUserConsentVerifierInterop>()?;
|
||||||
|
|
||||||
|
let h = isize::from_le_bytes(hwnd.try_into().unwrap());
|
||||||
|
let window = HWND(h);
|
||||||
|
|
||||||
|
let operation: IAsyncOperation<UserConsentVerificationResult> =
|
||||||
|
unsafe { interop.RequestVerificationForWindowAsync(window, message)? };
|
||||||
|
|
||||||
|
let result: UserConsentVerificationResult = operation.get()?;
|
||||||
|
|
||||||
|
match result {
|
||||||
|
UserConsentVerificationResult::Verified => Ok(true),
|
||||||
|
_ => Ok(false),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn available() -> Result<bool> {
|
||||||
|
let ucv_available = UserConsentVerifier::CheckAvailabilityAsync()?.get()?;
|
||||||
|
|
||||||
|
match ucv_available {
|
||||||
|
UserConsentVerifierAvailability::Available => Ok(true),
|
||||||
|
UserConsentVerifierAvailability::DeviceBusy => Ok(true), // TODO: Look into removing this and making the check more ad-hoc
|
||||||
|
_ => Ok(false),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::*;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_prompt() {
|
||||||
|
prompt(
|
||||||
|
vec![0, 0, 0, 0, 0, 0, 0, 0],
|
||||||
|
String::from("Hello from Rust"),
|
||||||
|
)
|
||||||
|
.unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_available() {
|
||||||
|
assert!(available().unwrap())
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate napi_derive;
|
extern crate napi_derive;
|
||||||
|
|
||||||
|
mod biometric;
|
||||||
mod password;
|
mod password;
|
||||||
|
|
||||||
#[napi]
|
#[napi]
|
||||||
@@ -37,3 +38,21 @@ pub mod passwords {
|
|||||||
.map_err(|e| napi::Error::from_reason(e.to_string()))
|
.map_err(|e| napi::Error::from_reason(e.to_string()))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[napi]
|
||||||
|
pub mod biometrics {
|
||||||
|
// Prompt for biometric confirmation
|
||||||
|
#[napi]
|
||||||
|
pub async fn prompt(
|
||||||
|
hwnd: napi::bindgen_prelude::Buffer,
|
||||||
|
message: String,
|
||||||
|
) -> napi::Result<bool> {
|
||||||
|
super::biometric::prompt(hwnd.into(), message)
|
||||||
|
.map_err(|e| napi::Error::from_reason(e.to_string()))
|
||||||
|
}
|
||||||
|
|
||||||
|
#[napi]
|
||||||
|
pub async fn available() -> napi::Result<bool> {
|
||||||
|
super::biometric::available().map_err(|e| napi::Error::from_reason(e.to_string()))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -13,7 +13,12 @@
|
|||||||
},
|
},
|
||||||
"afterSign": "scripts/after-sign.js",
|
"afterSign": "scripts/after-sign.js",
|
||||||
"asarUnpack": ["**/*.node"],
|
"asarUnpack": ["**/*.node"],
|
||||||
"files": ["**/*", "!**/node_modules/@bitwarden/desktop-native/**/*"],
|
"files": [
|
||||||
|
"**/*",
|
||||||
|
"!**/node_modules/@bitwarden/desktop-native/**/*",
|
||||||
|
"**/node_modules/@bitwarden/desktop-native/index.js",
|
||||||
|
"**/node_modules/@bitwarden/desktop-native/desktop_native.${platform}-${arch}*.node"
|
||||||
|
],
|
||||||
"electronVersion": "19.0.8",
|
"electronVersion": "19.0.8",
|
||||||
"generateUpdatesFilesForAllChannels": true,
|
"generateUpdatesFilesForAllChannels": true,
|
||||||
"publish": {
|
"publish": {
|
||||||
|
|||||||
@@ -6,8 +6,6 @@ import { StateService } from "@bitwarden/common/abstractions/state.service";
|
|||||||
import { BiometricMain } from "../biometric/biometric.main";
|
import { BiometricMain } from "../biometric/biometric.main";
|
||||||
|
|
||||||
export default class BiometricDarwinMain implements BiometricMain {
|
export default class BiometricDarwinMain implements BiometricMain {
|
||||||
isError = false;
|
|
||||||
|
|
||||||
constructor(private i18nservice: I18nService, private stateService: StateService) {}
|
constructor(private i18nservice: I18nService, private stateService: StateService) {}
|
||||||
|
|
||||||
async init() {
|
async init() {
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
export abstract class BiometricMain {
|
export abstract class BiometricMain {
|
||||||
isError: boolean;
|
|
||||||
init: () => Promise<void>;
|
init: () => Promise<void>;
|
||||||
supportsBiometric: () => Promise<boolean>;
|
supportsBiometric: () => Promise<boolean>;
|
||||||
authenticateBiometric: () => Promise<boolean>;
|
authenticateBiometric: () => Promise<boolean>;
|
||||||
|
|||||||
@@ -1,18 +1,14 @@
|
|||||||
import { ipcMain } from "electron";
|
import { ipcMain } from "electron";
|
||||||
import forceFocus from "forcefocus";
|
|
||||||
|
|
||||||
import { I18nService } from "@bitwarden/common/abstractions/i18n.service";
|
import { I18nService } from "@bitwarden/common/abstractions/i18n.service";
|
||||||
import { LogService } from "@bitwarden/common/abstractions/log.service";
|
import { LogService } from "@bitwarden/common/abstractions/log.service";
|
||||||
import { StateService } from "@bitwarden/common/abstractions/state.service";
|
import { StateService } from "@bitwarden/common/abstractions/state.service";
|
||||||
|
import { biometrics } from "@bitwarden/desktop-native";
|
||||||
import { WindowMain } from "@bitwarden/electron/window.main";
|
import { WindowMain } from "@bitwarden/electron/window.main";
|
||||||
|
|
||||||
import { BiometricMain } from "src/main/biometric/biometric.main";
|
import { BiometricMain } from "src/main/biometric/biometric.main";
|
||||||
|
|
||||||
export default class BiometricWindowsMain implements BiometricMain {
|
export default class BiometricWindowsMain implements BiometricMain {
|
||||||
isError = false;
|
|
||||||
|
|
||||||
private windowsSecurityCredentialsUiModule: any;
|
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
private i18nservice: I18nService,
|
private i18nservice: I18nService,
|
||||||
private windowMain: WindowMain,
|
private windowMain: WindowMain,
|
||||||
@@ -21,126 +17,31 @@ export default class BiometricWindowsMain implements BiometricMain {
|
|||||||
) {}
|
) {}
|
||||||
|
|
||||||
async init() {
|
async init() {
|
||||||
this.windowsSecurityCredentialsUiModule = this.getWindowsSecurityCredentialsUiModule();
|
|
||||||
let supportsBiometric = false;
|
let supportsBiometric = false;
|
||||||
try {
|
try {
|
||||||
supportsBiometric = await this.supportsBiometric();
|
supportsBiometric = await this.supportsBiometric();
|
||||||
} catch {
|
} catch (e) {
|
||||||
// store error state so we can let the user know on the settings page
|
this.logService.error(e);
|
||||||
this.isError = true;
|
|
||||||
}
|
}
|
||||||
await this.stateService.setEnableBiometric(supportsBiometric);
|
await this.stateService.setEnableBiometric(supportsBiometric);
|
||||||
await this.stateService.setBiometricText("unlockWithWindowsHello");
|
await this.stateService.setBiometricText("unlockWithWindowsHello");
|
||||||
await this.stateService.setNoAutoPromptBiometricsText("autoPromptWindowsHello");
|
await this.stateService.setNoAutoPromptBiometricsText("autoPromptWindowsHello");
|
||||||
|
|
||||||
ipcMain.on("biometric", async (event: any, message: any) => {
|
ipcMain.handle("biometric", async () => {
|
||||||
event.returnValue = await this.authenticateBiometric();
|
return await this.authenticateBiometric();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
async supportsBiometric(): Promise<boolean> {
|
async supportsBiometric(): Promise<boolean> {
|
||||||
const availability = await this.checkAvailabilityAsync();
|
try {
|
||||||
|
return await biometrics.available();
|
||||||
return this.getAllowedAvailabilities().includes(availability);
|
} catch {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async authenticateBiometric(): Promise<boolean> {
|
async authenticateBiometric(): Promise<boolean> {
|
||||||
const module = this.getWindowsSecurityCredentialsUiModule();
|
const hwnd = this.windowMain.win.getNativeWindowHandle();
|
||||||
if (module == null) {
|
return await biometrics.prompt(hwnd, this.i18nservice.t("windowsHelloConsentMessage"));
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
const verification = await this.requestVerificationAsync(
|
|
||||||
this.i18nservice.t("windowsHelloConsentMessage")
|
|
||||||
);
|
|
||||||
|
|
||||||
return verification === module.UserConsentVerificationResult.verified;
|
|
||||||
}
|
|
||||||
|
|
||||||
getWindowsSecurityCredentialsUiModule(): any {
|
|
||||||
try {
|
|
||||||
if (this.windowsSecurityCredentialsUiModule == null && this.getWindowsMajorVersion() >= 10) {
|
|
||||||
this.windowsSecurityCredentialsUiModule = require("@nodert-win10-rs4/windows.security.credentials.ui");
|
|
||||||
}
|
|
||||||
return this.windowsSecurityCredentialsUiModule;
|
|
||||||
} catch {
|
|
||||||
this.isError = true;
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
async checkAvailabilityAsync(): Promise<any> {
|
|
||||||
const module = this.getWindowsSecurityCredentialsUiModule();
|
|
||||||
if (module != null) {
|
|
||||||
// eslint-disable-next-line
|
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
try {
|
|
||||||
module.UserConsentVerifier.checkAvailabilityAsync((error: Error, result: any) => {
|
|
||||||
if (error) {
|
|
||||||
return resolve(null);
|
|
||||||
}
|
|
||||||
return resolve(result);
|
|
||||||
});
|
|
||||||
} catch {
|
|
||||||
this.isError = true;
|
|
||||||
return resolve(null);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
return Promise.resolve(null);
|
|
||||||
}
|
|
||||||
|
|
||||||
async requestVerificationAsync(message: string): Promise<any> {
|
|
||||||
const module = this.getWindowsSecurityCredentialsUiModule();
|
|
||||||
if (module != null) {
|
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
try {
|
|
||||||
module.UserConsentVerifier.requestVerificationAsync(
|
|
||||||
message,
|
|
||||||
(error: Error, result: any) => {
|
|
||||||
if (error) {
|
|
||||||
return resolve(null);
|
|
||||||
}
|
|
||||||
return resolve(result);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
forceFocus.focusWindow(this.windowMain.win);
|
|
||||||
} catch (error) {
|
|
||||||
this.isError = true;
|
|
||||||
return reject(error);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
return Promise.resolve(null);
|
|
||||||
}
|
|
||||||
|
|
||||||
getAllowedAvailabilities(): any[] {
|
|
||||||
try {
|
|
||||||
const module = this.getWindowsSecurityCredentialsUiModule();
|
|
||||||
if (module != null) {
|
|
||||||
return [
|
|
||||||
module.UserConsentVerifierAvailability.available,
|
|
||||||
module.UserConsentVerifierAvailability.deviceBusy,
|
|
||||||
];
|
|
||||||
}
|
|
||||||
} catch {
|
|
||||||
/*Ignore error*/
|
|
||||||
}
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
getWindowsMajorVersion(): number {
|
|
||||||
if (process.platform !== "win32") {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
// eslint-disable-next-line
|
|
||||||
const version = require("os").release();
|
|
||||||
return Number.parseInt(version.split(".")[0], 10);
|
|
||||||
} catch {
|
|
||||||
this.logService.error("Unable to resolve windows major version number");
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
import { ipcMain } from "electron";
|
import { ipcMain } from "electron";
|
||||||
import { deletePassword, getPassword, setPassword } from "keytar";
|
|
||||||
|
import { passwords } from "@bitwarden/desktop-native";
|
||||||
|
|
||||||
import { BiometricMain } from "./biometric/biometric.main";
|
import { BiometricMain } from "./biometric/biometric.main";
|
||||||
|
|
||||||
@@ -10,7 +11,7 @@ export class DesktopCredentialStorageListener {
|
|||||||
constructor(private serviceName: string, private biometricService: BiometricMain) {}
|
constructor(private serviceName: string, private biometricService: BiometricMain) {}
|
||||||
|
|
||||||
init() {
|
init() {
|
||||||
ipcMain.on("keytar", async (event: any, message: any) => {
|
ipcMain.handle("keytar", async (event: any, message: any) => {
|
||||||
try {
|
try {
|
||||||
let serviceName = this.serviceName;
|
let serviceName = this.serviceName;
|
||||||
message.keySuffix = "_" + (message.keySuffix ?? "");
|
message.keySuffix = "_" + (message.keySuffix ?? "");
|
||||||
@@ -25,23 +26,35 @@ export class DesktopCredentialStorageListener {
|
|||||||
let val: string | boolean = null;
|
let val: string | boolean = null;
|
||||||
if (authenticated && message.action && message.key) {
|
if (authenticated && message.action && message.key) {
|
||||||
if (message.action === "getPassword") {
|
if (message.action === "getPassword") {
|
||||||
val = await getPassword(serviceName, message.key);
|
val = await this.getPassword(serviceName, message.key);
|
||||||
} else if (message.action === "hasPassword") {
|
} else if (message.action === "hasPassword") {
|
||||||
const result = await getPassword(serviceName, message.key);
|
const result = await this.getPassword(serviceName, message.key);
|
||||||
val = result != null;
|
val = result != null;
|
||||||
} else if (message.action === "setPassword" && message.value) {
|
} else if (message.action === "setPassword" && message.value) {
|
||||||
await setPassword(serviceName, message.key, message.value);
|
await passwords.setPassword(serviceName, message.key, message.value);
|
||||||
} else if (message.action === "deletePassword") {
|
} else if (message.action === "deletePassword") {
|
||||||
await deletePassword(serviceName, message.key);
|
await passwords.deletePassword(serviceName, message.key);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
event.returnValue = val;
|
return val;
|
||||||
} catch {
|
} catch {
|
||||||
event.returnValue = null;
|
return null;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Gracefully handle old keytar values, and if detected updated the entry to the proper format
|
||||||
|
private async getPassword(serviceName: string, key: string) {
|
||||||
|
let val = await passwords.getPassword(serviceName, key);
|
||||||
|
try {
|
||||||
|
JSON.parse(val);
|
||||||
|
} catch (e) {
|
||||||
|
val = await passwords.getPasswordKeytar(serviceName, key);
|
||||||
|
await passwords.setPassword(serviceName, key, val);
|
||||||
|
}
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
|
||||||
private async authenticateBiometric(): Promise<boolean> {
|
private async authenticateBiometric(): Promise<boolean> {
|
||||||
if (this.biometricService) {
|
if (this.biometricService) {
|
||||||
return await this.biometricService.authenticateBiometric();
|
return await this.biometricService.authenticateBiometric();
|
||||||
|
|||||||
1286
apps/desktop/src/package-lock.json
generated
1286
apps/desktop/src/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -12,8 +12,6 @@
|
|||||||
"url": "git+https://github.com/bitwarden/clients.git"
|
"url": "git+https://github.com/bitwarden/clients.git"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@nodert-win10-rs4/windows.security.credentials.ui": "^0.4.4",
|
"@bitwarden/desktop-native": "file:../desktop_native"
|
||||||
"forcefocus": "^1.1.0",
|
|
||||||
"keytar": "^7.9.0"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -72,10 +72,7 @@ const main = {
|
|||||||
],
|
],
|
||||||
externals: {
|
externals: {
|
||||||
"electron-reload": "commonjs2 electron-reload",
|
"electron-reload": "commonjs2 electron-reload",
|
||||||
"@nodert-win10-rs4/windows.security.credentials.ui":
|
"@bitwarden/desktop-native": "commonjs2 @bitwarden/desktop-native",
|
||||||
"commonjs2 @nodert-win10-rs4/windows.security.credentials.ui",
|
|
||||||
forcefocus: "commonjs2 forcefocus",
|
|
||||||
keytar: "commonjs2 keytar",
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -169,13 +169,12 @@ export class ElectronPlatformUtilsService implements PlatformUtilsService {
|
|||||||
return await this.stateService.getEnableBiometric();
|
return await this.stateService.getEnableBiometric();
|
||||||
}
|
}
|
||||||
|
|
||||||
authenticateBiometric(): Promise<boolean> {
|
async authenticateBiometric(): Promise<boolean> {
|
||||||
return new Promise((resolve) => {
|
const val = await ipcRenderer.invoke("biometric", {
|
||||||
const val = ipcRenderer.sendSync("biometric", {
|
|
||||||
action: "authenticate",
|
action: "authenticate",
|
||||||
});
|
});
|
||||||
resolve(val);
|
|
||||||
});
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
supportsSecureStorage(): boolean {
|
supportsSecureStorage(): boolean {
|
||||||
|
|||||||
@@ -5,39 +5,37 @@ import { StorageOptions } from "@bitwarden/common/models/domain/storageOptions";
|
|||||||
|
|
||||||
export class ElectronRendererSecureStorageService implements AbstractStorageService {
|
export class ElectronRendererSecureStorageService implements AbstractStorageService {
|
||||||
async get<T>(key: string, options?: StorageOptions): Promise<T> {
|
async get<T>(key: string, options?: StorageOptions): Promise<T> {
|
||||||
const val = ipcRenderer.sendSync("keytar", {
|
const val = await ipcRenderer.invoke("keytar", {
|
||||||
action: "getPassword",
|
action: "getPassword",
|
||||||
key: key,
|
key: key,
|
||||||
keySuffix: options?.keySuffix ?? "",
|
keySuffix: options?.keySuffix ?? "",
|
||||||
});
|
});
|
||||||
return Promise.resolve(val != null ? (JSON.parse(val) as T) : null);
|
return val != null ? (JSON.parse(val) as T) : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
async has(key: string, options?: StorageOptions): Promise<boolean> {
|
async has(key: string, options?: StorageOptions): Promise<boolean> {
|
||||||
const val = ipcRenderer.sendSync("keytar", {
|
const val = await ipcRenderer.invoke("keytar", {
|
||||||
action: "hasPassword",
|
action: "hasPassword",
|
||||||
key: key,
|
key: key,
|
||||||
keySuffix: options?.keySuffix ?? "",
|
keySuffix: options?.keySuffix ?? "",
|
||||||
});
|
});
|
||||||
return Promise.resolve(!!val);
|
return !!val;
|
||||||
}
|
}
|
||||||
|
|
||||||
async save(key: string, obj: any, options?: StorageOptions): Promise<any> {
|
async save(key: string, obj: any, options?: StorageOptions): Promise<any> {
|
||||||
ipcRenderer.sendSync("keytar", {
|
await ipcRenderer.invoke("keytar", {
|
||||||
action: "setPassword",
|
action: "setPassword",
|
||||||
key: key,
|
key: key,
|
||||||
keySuffix: options?.keySuffix ?? "",
|
keySuffix: options?.keySuffix ?? "",
|
||||||
value: JSON.stringify(obj),
|
value: JSON.stringify(obj),
|
||||||
});
|
});
|
||||||
return Promise.resolve();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async remove(key: string, options?: StorageOptions): Promise<any> {
|
async remove(key: string, options?: StorageOptions): Promise<any> {
|
||||||
ipcRenderer.sendSync("keytar", {
|
await ipcRenderer.invoke("keytar", {
|
||||||
action: "deletePassword",
|
action: "deletePassword",
|
||||||
key: key,
|
key: key,
|
||||||
keySuffix: options?.keySuffix ?? "",
|
keySuffix: options?.keySuffix ?? "",
|
||||||
});
|
});
|
||||||
return Promise.resolve();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
559
package-lock.json
generated
559
package-lock.json
generated
@@ -10,6 +10,7 @@
|
|||||||
"license": "GPL-3.0",
|
"license": "GPL-3.0",
|
||||||
"workspaces": [
|
"workspaces": [
|
||||||
"apps/*",
|
"apps/*",
|
||||||
|
"apps/desktop/desktop_native",
|
||||||
"libs/*"
|
"libs/*"
|
||||||
],
|
],
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@@ -76,7 +77,6 @@
|
|||||||
"@compodoc/compodoc": "^1.1.19",
|
"@compodoc/compodoc": "^1.1.19",
|
||||||
"@fluffy-spoon/substitute": "^1.208.0",
|
"@fluffy-spoon/substitute": "^1.208.0",
|
||||||
"@ngtools/webpack": "^12.2.13",
|
"@ngtools/webpack": "^12.2.13",
|
||||||
"@nodert-win10-rs4/windows.security.credentials.ui": "^0.4.4",
|
|
||||||
"@storybook/addon-a11y": "^6.5.7",
|
"@storybook/addon-a11y": "^6.5.7",
|
||||||
"@storybook/addon-actions": "^6.5.7",
|
"@storybook/addon-actions": "^6.5.7",
|
||||||
"@storybook/addon-essentials": "^6.5.7",
|
"@storybook/addon-essentials": "^6.5.7",
|
||||||
@@ -133,7 +133,6 @@
|
|||||||
"eslint-config-prettier": "^8.5.0",
|
"eslint-config-prettier": "^8.5.0",
|
||||||
"eslint-import-resolver-typescript": "^2.7.1",
|
"eslint-import-resolver-typescript": "^2.7.1",
|
||||||
"eslint-plugin-import": "^2.26.0",
|
"eslint-plugin-import": "^2.26.0",
|
||||||
"forcefocus": "^1.1.0",
|
|
||||||
"gulp": "^4.0.2",
|
"gulp": "^4.0.2",
|
||||||
"gulp-filter": "^7.0.0",
|
"gulp-filter": "^7.0.0",
|
||||||
"gulp-if": "^3.0.0",
|
"gulp-if": "^3.0.0",
|
||||||
@@ -147,7 +146,6 @@
|
|||||||
"jasmine-core": "^3.7.1",
|
"jasmine-core": "^3.7.1",
|
||||||
"jasmine-spec-reporter": "^7.0.0",
|
"jasmine-spec-reporter": "^7.0.0",
|
||||||
"jest-preset-angular": "^10.1.0",
|
"jest-preset-angular": "^10.1.0",
|
||||||
"keytar": "^7.9.0",
|
|
||||||
"lint-staged": "^12.4.1",
|
"lint-staged": "^12.4.1",
|
||||||
"mini-css-extract-plugin": "^2.4.5",
|
"mini-css-extract-plugin": "^2.4.5",
|
||||||
"node-ipc": "^9.2.1",
|
"node-ipc": "^9.2.1",
|
||||||
@@ -225,6 +223,14 @@
|
|||||||
"hasInstallScript": true,
|
"hasInstallScript": true,
|
||||||
"license": "GPL-3.0"
|
"license": "GPL-3.0"
|
||||||
},
|
},
|
||||||
|
"apps/desktop/desktop_native": {
|
||||||
|
"name": "@bitwarden/desktop-native",
|
||||||
|
"version": "0.1.0",
|
||||||
|
"license": "GPL-3.0",
|
||||||
|
"devDependencies": {
|
||||||
|
"@napi-rs/cli": "^2.6.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
"apps/web": {
|
"apps/web": {
|
||||||
"name": "@bitwarden/web-vault",
|
"name": "@bitwarden/web-vault",
|
||||||
"version": "2022.6.1"
|
"version": "2022.6.1"
|
||||||
@@ -5041,6 +5047,10 @@
|
|||||||
"resolved": "apps/desktop",
|
"resolved": "apps/desktop",
|
||||||
"link": true
|
"link": true
|
||||||
},
|
},
|
||||||
|
"node_modules/@bitwarden/desktop-native": {
|
||||||
|
"resolved": "apps/desktop/desktop_native",
|
||||||
|
"link": true
|
||||||
|
},
|
||||||
"node_modules/@bitwarden/electron": {
|
"node_modules/@bitwarden/electron": {
|
||||||
"resolved": "libs/electron",
|
"resolved": "libs/electron",
|
||||||
"link": true
|
"link": true
|
||||||
@@ -7179,6 +7189,22 @@
|
|||||||
"integrity": "sha512-Iozmtbqv0noj0uDDqoL0zNq0VBEfK2YFoMAZoxJe4cwphvLR+JskfF30QhXHOR4m3KrE6NLRYw+U9MRXvifyig==",
|
"integrity": "sha512-Iozmtbqv0noj0uDDqoL0zNq0VBEfK2YFoMAZoxJe4cwphvLR+JskfF30QhXHOR4m3KrE6NLRYw+U9MRXvifyig==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"node_modules/@napi-rs/cli": {
|
||||||
|
"version": "2.10.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@napi-rs/cli/-/cli-2.10.0.tgz",
|
||||||
|
"integrity": "sha512-pK/VLOdo690FEItPJ9T5PLEfzmDTHgXjzuVChnsKvqI9vPg+rH12iyoxOrux6PAqg/pImJTd4CCabRqEfLt/sA==",
|
||||||
|
"dev": true,
|
||||||
|
"bin": {
|
||||||
|
"napi": "scripts/index.js"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">= 10"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"type": "github",
|
||||||
|
"url": "https://github.com/sponsors/Brooooooklyn"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@ngtools/webpack": {
|
"node_modules/@ngtools/webpack": {
|
||||||
"version": "12.2.17",
|
"version": "12.2.17",
|
||||||
"resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-12.2.17.tgz",
|
"resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-12.2.17.tgz",
|
||||||
@@ -7230,16 +7256,6 @@
|
|||||||
"node": ">= 8"
|
"node": ">= 8"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"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",
|
|
||||||
"integrity": "sha512-P+EsJw5MCQXTxp7mwXfNDvIzIYsB6ple+HNg01QjPWg/PJfAodPuxL6XM7l0sPtYHsDYnfnvoefZMdZRa2Z1ig==",
|
|
||||||
"dev": true,
|
|
||||||
"hasInstallScript": true,
|
|
||||||
"dependencies": {
|
|
||||||
"nan": "latest"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/@npmcli/git": {
|
"node_modules/@npmcli/git": {
|
||||||
"version": "2.1.0",
|
"version": "2.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/@npmcli/git/-/git-2.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/@npmcli/git/-/git-2.1.0.tgz",
|
||||||
@@ -17116,6 +17132,7 @@
|
|||||||
"resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz",
|
"resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz",
|
||||||
"integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
|
"integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"optional": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"file-uri-to-path": "1.0.0"
|
"file-uri-to-path": "1.0.0"
|
||||||
}
|
}
|
||||||
@@ -24308,7 +24325,8 @@
|
|||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
|
||||||
"integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==",
|
"integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==",
|
||||||
"dev": true
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
},
|
},
|
||||||
"node_modules/filelist": {
|
"node_modules/filelist": {
|
||||||
"version": "1.0.4",
|
"version": "1.0.4",
|
||||||
@@ -24798,20 +24816,6 @@
|
|||||||
"node": ">=0.10.0"
|
"node": ">=0.10.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/forcefocus": {
|
|
||||||
"version": "1.1.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/forcefocus/-/forcefocus-1.1.0.tgz",
|
|
||||||
"integrity": "sha512-bnY7rul5kBLyNoCn0FHNiFAF+GGUZx6TvxWhurUS4PlmOzF+FMixGIigHH5UcyM3w1gp2TxAtP6MOUSXA15Sgw==",
|
|
||||||
"dev": true,
|
|
||||||
"hasInstallScript": true,
|
|
||||||
"dependencies": {
|
|
||||||
"bindings": "^1.3.0",
|
|
||||||
"prebuild-install": "^5.0.0"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=4"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/fork-stream": {
|
"node_modules/fork-stream": {
|
||||||
"version": "0.0.4",
|
"version": "0.0.4",
|
||||||
"resolved": "https://registry.npmjs.org/fork-stream/-/fork-stream-0.0.4.tgz",
|
"resolved": "https://registry.npmjs.org/fork-stream/-/fork-stream-0.0.4.tgz",
|
||||||
@@ -30946,110 +30950,6 @@
|
|||||||
"node": ">= 0.6"
|
"node": ">= 0.6"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/keytar": {
|
|
||||||
"version": "7.9.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/keytar/-/keytar-7.9.0.tgz",
|
|
||||||
"integrity": "sha512-VPD8mtVtm5JNtA2AErl6Chp06JBfy7diFQ7TQQhdpWOl6MrCRB+eRbvAZUsbGQS9kiMq0coJsy0W0vHpDCkWsQ==",
|
|
||||||
"dev": true,
|
|
||||||
"hasInstallScript": true,
|
|
||||||
"dependencies": {
|
|
||||||
"node-addon-api": "^4.3.0",
|
|
||||||
"prebuild-install": "^7.0.1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/keytar/node_modules/decompress-response": {
|
|
||||||
"version": "6.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
|
|
||||||
"integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
|
|
||||||
"dev": true,
|
|
||||||
"dependencies": {
|
|
||||||
"mimic-response": "^3.1.0"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=10"
|
|
||||||
},
|
|
||||||
"funding": {
|
|
||||||
"url": "https://github.com/sponsors/sindresorhus"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/keytar/node_modules/detect-libc": {
|
|
||||||
"version": "2.0.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz",
|
|
||||||
"integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==",
|
|
||||||
"dev": true,
|
|
||||||
"engines": {
|
|
||||||
"node": ">=8"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/keytar/node_modules/mimic-response": {
|
|
||||||
"version": "3.1.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
|
|
||||||
"integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
|
|
||||||
"dev": true,
|
|
||||||
"engines": {
|
|
||||||
"node": ">=10"
|
|
||||||
},
|
|
||||||
"funding": {
|
|
||||||
"url": "https://github.com/sponsors/sindresorhus"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/keytar/node_modules/node-addon-api": {
|
|
||||||
"version": "4.3.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz",
|
|
||||||
"integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"node_modules/keytar/node_modules/prebuild-install": {
|
|
||||||
"version": "7.1.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz",
|
|
||||||
"integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==",
|
|
||||||
"dev": true,
|
|
||||||
"dependencies": {
|
|
||||||
"detect-libc": "^2.0.0",
|
|
||||||
"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": "^3.3.0",
|
|
||||||
"pump": "^3.0.0",
|
|
||||||
"rc": "^1.2.7",
|
|
||||||
"simple-get": "^4.0.0",
|
|
||||||
"tar-fs": "^2.0.0",
|
|
||||||
"tunnel-agent": "^0.6.0"
|
|
||||||
},
|
|
||||||
"bin": {
|
|
||||||
"prebuild-install": "bin.js"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=10"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/keytar/node_modules/simple-get": {
|
|
||||||
"version": "4.0.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz",
|
|
||||||
"integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==",
|
|
||||||
"dev": true,
|
|
||||||
"funding": [
|
|
||||||
{
|
|
||||||
"type": "github",
|
|
||||||
"url": "https://github.com/sponsors/feross"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "patreon",
|
|
||||||
"url": "https://www.patreon.com/feross"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "consulting",
|
|
||||||
"url": "https://feross.org/support"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"dependencies": {
|
|
||||||
"decompress-response": "^6.0.0",
|
|
||||||
"once": "^1.3.1",
|
|
||||||
"simple-concat": "^1.0.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/keyv": {
|
"node_modules/keyv": {
|
||||||
"version": "3.1.0",
|
"version": "3.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz",
|
||||||
@@ -33236,7 +33136,8 @@
|
|||||||
"version": "2.16.0",
|
"version": "2.16.0",
|
||||||
"resolved": "https://registry.npmjs.org/nan/-/nan-2.16.0.tgz",
|
"resolved": "https://registry.npmjs.org/nan/-/nan-2.16.0.tgz",
|
||||||
"integrity": "sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA==",
|
"integrity": "sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA==",
|
||||||
"dev": true
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
},
|
},
|
||||||
"node_modules/nanoid": {
|
"node_modules/nanoid": {
|
||||||
"version": "3.3.4",
|
"version": "3.3.4",
|
||||||
@@ -33676,12 +33577,6 @@
|
|||||||
"integrity": "sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==",
|
"integrity": "sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/noop-logger": {
|
|
||||||
"version": "0.1.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz",
|
|
||||||
"integrity": "sha512-6kM8CLXvuW5crTxsAtva2YLrRrDaiTIkIePWs9moLHqbFWT94WpNFjwS/5dfLfECg5i/lkmw3aoqVidxt23TEQ==",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"node_modules/nopt": {
|
"node_modules/nopt": {
|
||||||
"version": "5.0.0",
|
"version": "5.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz",
|
||||||
@@ -37819,144 +37714,6 @@
|
|||||||
"node": ">=6.14.4"
|
"node": ">=6.14.4"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/prebuild-install": {
|
|
||||||
"version": "5.3.6",
|
|
||||||
"resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-5.3.6.tgz",
|
|
||||||
"integrity": "sha512-s8Aai8++QQGi4sSbs/M1Qku62PFK49Jm1CbgXklGz4nmHveDq0wzJkg7Na5QbnO1uNH8K7iqx2EQ/mV0MZEmOg==",
|
|
||||||
"dev": true,
|
|
||||||
"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.7.0",
|
|
||||||
"noop-logger": "^0.1.1",
|
|
||||||
"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",
|
|
||||||
"which-pm-runs": "^1.0.0"
|
|
||||||
},
|
|
||||||
"bin": {
|
|
||||||
"prebuild-install": "bin.js"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=6"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/prebuild-install/node_modules/ansi-regex": {
|
|
||||||
"version": "2.1.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
|
|
||||||
"integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==",
|
|
||||||
"dev": true,
|
|
||||||
"engines": {
|
|
||||||
"node": ">=0.10.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/prebuild-install/node_modules/aproba": {
|
|
||||||
"version": "1.2.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
|
|
||||||
"integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"node_modules/prebuild-install/node_modules/are-we-there-yet": {
|
|
||||||
"version": "1.1.7",
|
|
||||||
"resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz",
|
|
||||||
"integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==",
|
|
||||||
"dev": true,
|
|
||||||
"dependencies": {
|
|
||||||
"delegates": "^1.0.0",
|
|
||||||
"readable-stream": "^2.0.6"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/prebuild-install/node_modules/gauge": {
|
|
||||||
"version": "2.7.4",
|
|
||||||
"resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
|
|
||||||
"integrity": "sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg==",
|
|
||||||
"dev": true,
|
|
||||||
"dependencies": {
|
|
||||||
"aproba": "^1.0.3",
|
|
||||||
"console-control-strings": "^1.0.0",
|
|
||||||
"has-unicode": "^2.0.0",
|
|
||||||
"object-assign": "^4.1.0",
|
|
||||||
"signal-exit": "^3.0.0",
|
|
||||||
"string-width": "^1.0.1",
|
|
||||||
"strip-ansi": "^3.0.1",
|
|
||||||
"wide-align": "^1.1.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/prebuild-install/node_modules/is-fullwidth-code-point": {
|
|
||||||
"version": "1.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
|
|
||||||
"integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==",
|
|
||||||
"dev": true,
|
|
||||||
"dependencies": {
|
|
||||||
"number-is-nan": "^1.0.0"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=0.10.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/prebuild-install/node_modules/node-abi": {
|
|
||||||
"version": "2.30.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.30.1.tgz",
|
|
||||||
"integrity": "sha512-/2D0wOQPgaUWzVSVgRMx+trKJRC2UG4SUc4oCJoXx9Uxjtp0Vy3/kt7zcbxHF8+Z/pK3UloLWzBISg72brfy1w==",
|
|
||||||
"dev": true,
|
|
||||||
"dependencies": {
|
|
||||||
"semver": "^5.4.1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/prebuild-install/node_modules/npmlog": {
|
|
||||||
"version": "4.1.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
|
|
||||||
"integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
|
|
||||||
"dev": true,
|
|
||||||
"dependencies": {
|
|
||||||
"are-we-there-yet": "~1.1.2",
|
|
||||||
"console-control-strings": "~1.1.0",
|
|
||||||
"gauge": "~2.7.3",
|
|
||||||
"set-blocking": "~2.0.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/prebuild-install/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/prebuild-install/node_modules/string-width": {
|
|
||||||
"version": "1.0.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
|
|
||||||
"integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==",
|
|
||||||
"dev": true,
|
|
||||||
"dependencies": {
|
|
||||||
"code-point-at": "^1.0.0",
|
|
||||||
"is-fullwidth-code-point": "^1.0.0",
|
|
||||||
"strip-ansi": "^3.0.0"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=0.10.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/prebuild-install/node_modules/strip-ansi": {
|
|
||||||
"version": "3.0.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
|
|
||||||
"integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==",
|
|
||||||
"dev": true,
|
|
||||||
"dependencies": {
|
|
||||||
"ansi-regex": "^2.0.0"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=0.10.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/prelude-ls": {
|
"node_modules/prelude-ls": {
|
||||||
"version": "1.2.1",
|
"version": "1.2.1",
|
||||||
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
|
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
|
||||||
@@ -45541,15 +45298,6 @@
|
|||||||
"integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==",
|
"integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/which-pm-runs": {
|
|
||||||
"version": "1.1.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.1.0.tgz",
|
|
||||||
"integrity": "sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==",
|
|
||||||
"dev": true,
|
|
||||||
"engines": {
|
|
||||||
"node": ">=4"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/which-typed-array": {
|
"node_modules/which-typed-array": {
|
||||||
"version": "1.1.8",
|
"version": "1.1.8",
|
||||||
"resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.8.tgz",
|
"resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.8.tgz",
|
||||||
@@ -49427,6 +49175,12 @@
|
|||||||
"@bitwarden/desktop": {
|
"@bitwarden/desktop": {
|
||||||
"version": "file:apps/desktop"
|
"version": "file:apps/desktop"
|
||||||
},
|
},
|
||||||
|
"@bitwarden/desktop-native": {
|
||||||
|
"version": "file:apps/desktop/desktop_native",
|
||||||
|
"requires": {
|
||||||
|
"@napi-rs/cli": "^2.6.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
"@bitwarden/electron": {
|
"@bitwarden/electron": {
|
||||||
"version": "file:libs/electron",
|
"version": "file:libs/electron",
|
||||||
"requires": {
|
"requires": {
|
||||||
@@ -51203,6 +50957,12 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"@napi-rs/cli": {
|
||||||
|
"version": "2.10.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@napi-rs/cli/-/cli-2.10.0.tgz",
|
||||||
|
"integrity": "sha512-pK/VLOdo690FEItPJ9T5PLEfzmDTHgXjzuVChnsKvqI9vPg+rH12iyoxOrux6PAqg/pImJTd4CCabRqEfLt/sA==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"@ngtools/webpack": {
|
"@ngtools/webpack": {
|
||||||
"version": "12.2.17",
|
"version": "12.2.17",
|
||||||
"resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-12.2.17.tgz",
|
"resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-12.2.17.tgz",
|
||||||
@@ -51236,15 +50996,6 @@
|
|||||||
"fastq": "^1.6.0"
|
"fastq": "^1.6.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@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",
|
|
||||||
"integrity": "sha512-P+EsJw5MCQXTxp7mwXfNDvIzIYsB6ple+HNg01QjPWg/PJfAodPuxL6XM7l0sPtYHsDYnfnvoefZMdZRa2Z1ig==",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"nan": "latest"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"@npmcli/git": {
|
"@npmcli/git": {
|
||||||
"version": "2.1.0",
|
"version": "2.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/@npmcli/git/-/git-2.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/@npmcli/git/-/git-2.1.0.tgz",
|
||||||
@@ -59004,6 +58755,7 @@
|
|||||||
"resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz",
|
"resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz",
|
||||||
"integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
|
"integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
|
"optional": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"file-uri-to-path": "1.0.0"
|
"file-uri-to-path": "1.0.0"
|
||||||
}
|
}
|
||||||
@@ -64659,7 +64411,8 @@
|
|||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
|
||||||
"integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==",
|
"integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==",
|
||||||
"dev": true
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
},
|
},
|
||||||
"filelist": {
|
"filelist": {
|
||||||
"version": "1.0.4",
|
"version": "1.0.4",
|
||||||
@@ -65046,16 +64799,6 @@
|
|||||||
"for-in": "^1.0.1"
|
"for-in": "^1.0.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"forcefocus": {
|
|
||||||
"version": "1.1.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/forcefocus/-/forcefocus-1.1.0.tgz",
|
|
||||||
"integrity": "sha512-bnY7rul5kBLyNoCn0FHNiFAF+GGUZx6TvxWhurUS4PlmOzF+FMixGIigHH5UcyM3w1gp2TxAtP6MOUSXA15Sgw==",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"bindings": "^1.3.0",
|
|
||||||
"prebuild-install": "^5.0.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"fork-stream": {
|
"fork-stream": {
|
||||||
"version": "0.0.4",
|
"version": "0.0.4",
|
||||||
"resolved": "https://registry.npmjs.org/fork-stream/-/fork-stream-0.0.4.tgz",
|
"resolved": "https://registry.npmjs.org/fork-stream/-/fork-stream-0.0.4.tgz",
|
||||||
@@ -69862,76 +69605,6 @@
|
|||||||
"tsscmp": "1.0.6"
|
"tsscmp": "1.0.6"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"keytar": {
|
|
||||||
"version": "7.9.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/keytar/-/keytar-7.9.0.tgz",
|
|
||||||
"integrity": "sha512-VPD8mtVtm5JNtA2AErl6Chp06JBfy7diFQ7TQQhdpWOl6MrCRB+eRbvAZUsbGQS9kiMq0coJsy0W0vHpDCkWsQ==",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"node-addon-api": "^4.3.0",
|
|
||||||
"prebuild-install": "^7.0.1"
|
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"decompress-response": {
|
|
||||||
"version": "6.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
|
|
||||||
"integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"mimic-response": "^3.1.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"detect-libc": {
|
|
||||||
"version": "2.0.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz",
|
|
||||||
"integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"mimic-response": {
|
|
||||||
"version": "3.1.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
|
|
||||||
"integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"node-addon-api": {
|
|
||||||
"version": "4.3.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz",
|
|
||||||
"integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"prebuild-install": {
|
|
||||||
"version": "7.1.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz",
|
|
||||||
"integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"detect-libc": "^2.0.0",
|
|
||||||
"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": "^3.3.0",
|
|
||||||
"pump": "^3.0.0",
|
|
||||||
"rc": "^1.2.7",
|
|
||||||
"simple-get": "^4.0.0",
|
|
||||||
"tar-fs": "^2.0.0",
|
|
||||||
"tunnel-agent": "^0.6.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"simple-get": {
|
|
||||||
"version": "4.0.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz",
|
|
||||||
"integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"decompress-response": "^6.0.0",
|
|
||||||
"once": "^1.3.1",
|
|
||||||
"simple-concat": "^1.0.0"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"keyv": {
|
"keyv": {
|
||||||
"version": "3.1.0",
|
"version": "3.1.0",
|
||||||
"resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz",
|
||||||
@@ -71642,7 +71315,8 @@
|
|||||||
"version": "2.16.0",
|
"version": "2.16.0",
|
||||||
"resolved": "https://registry.npmjs.org/nan/-/nan-2.16.0.tgz",
|
"resolved": "https://registry.npmjs.org/nan/-/nan-2.16.0.tgz",
|
||||||
"integrity": "sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA==",
|
"integrity": "sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA==",
|
||||||
"dev": true
|
"dev": true,
|
||||||
|
"optional": true
|
||||||
},
|
},
|
||||||
"nanoid": {
|
"nanoid": {
|
||||||
"version": "3.3.4",
|
"version": "3.3.4",
|
||||||
@@ -72018,12 +71692,6 @@
|
|||||||
"integrity": "sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==",
|
"integrity": "sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"noop-logger": {
|
|
||||||
"version": "0.1.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/noop-logger/-/noop-logger-0.1.1.tgz",
|
|
||||||
"integrity": "sha512-6kM8CLXvuW5crTxsAtva2YLrRrDaiTIkIePWs9moLHqbFWT94WpNFjwS/5dfLfECg5i/lkmw3aoqVidxt23TEQ==",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"nopt": {
|
"nopt": {
|
||||||
"version": "5.0.0",
|
"version": "5.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz",
|
||||||
@@ -75109,125 +74777,6 @@
|
|||||||
"uniq": "^1.0.1"
|
"uniq": "^1.0.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"prebuild-install": {
|
|
||||||
"version": "5.3.6",
|
|
||||||
"resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-5.3.6.tgz",
|
|
||||||
"integrity": "sha512-s8Aai8++QQGi4sSbs/M1Qku62PFK49Jm1CbgXklGz4nmHveDq0wzJkg7Na5QbnO1uNH8K7iqx2EQ/mV0MZEmOg==",
|
|
||||||
"dev": true,
|
|
||||||
"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.7.0",
|
|
||||||
"noop-logger": "^0.1.1",
|
|
||||||
"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",
|
|
||||||
"which-pm-runs": "^1.0.0"
|
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"ansi-regex": {
|
|
||||||
"version": "2.1.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
|
|
||||||
"integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"aproba": {
|
|
||||||
"version": "1.2.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz",
|
|
||||||
"integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"are-we-there-yet": {
|
|
||||||
"version": "1.1.7",
|
|
||||||
"resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz",
|
|
||||||
"integrity": "sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"delegates": "^1.0.0",
|
|
||||||
"readable-stream": "^2.0.6"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"gauge": {
|
|
||||||
"version": "2.7.4",
|
|
||||||
"resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz",
|
|
||||||
"integrity": "sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg==",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"aproba": "^1.0.3",
|
|
||||||
"console-control-strings": "^1.0.0",
|
|
||||||
"has-unicode": "^2.0.0",
|
|
||||||
"object-assign": "^4.1.0",
|
|
||||||
"signal-exit": "^3.0.0",
|
|
||||||
"string-width": "^1.0.1",
|
|
||||||
"strip-ansi": "^3.0.1",
|
|
||||||
"wide-align": "^1.1.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"is-fullwidth-code-point": {
|
|
||||||
"version": "1.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
|
|
||||||
"integrity": "sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"number-is-nan": "^1.0.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node-abi": {
|
|
||||||
"version": "2.30.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/node-abi/-/node-abi-2.30.1.tgz",
|
|
||||||
"integrity": "sha512-/2D0wOQPgaUWzVSVgRMx+trKJRC2UG4SUc4oCJoXx9Uxjtp0Vy3/kt7zcbxHF8+Z/pK3UloLWzBISg72brfy1w==",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"semver": "^5.4.1"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"npmlog": {
|
|
||||||
"version": "4.1.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz",
|
|
||||||
"integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"are-we-there-yet": "~1.1.2",
|
|
||||||
"console-control-strings": "~1.1.0",
|
|
||||||
"gauge": "~2.7.3",
|
|
||||||
"set-blocking": "~2.0.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"semver": {
|
|
||||||
"version": "5.7.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
|
|
||||||
"integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"string-width": {
|
|
||||||
"version": "1.0.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
|
|
||||||
"integrity": "sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"code-point-at": "^1.0.0",
|
|
||||||
"is-fullwidth-code-point": "^1.0.0",
|
|
||||||
"strip-ansi": "^3.0.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"strip-ansi": {
|
|
||||||
"version": "3.0.1",
|
|
||||||
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
|
|
||||||
"integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==",
|
|
||||||
"dev": true,
|
|
||||||
"requires": {
|
|
||||||
"ansi-regex": "^2.0.0"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"prelude-ls": {
|
"prelude-ls": {
|
||||||
"version": "1.2.1",
|
"version": "1.2.1",
|
||||||
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
|
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
|
||||||
@@ -81234,12 +80783,6 @@
|
|||||||
"integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==",
|
"integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"which-pm-runs": {
|
|
||||||
"version": "1.1.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/which-pm-runs/-/which-pm-runs-1.1.0.tgz",
|
|
||||||
"integrity": "sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==",
|
|
||||||
"dev": true
|
|
||||||
},
|
|
||||||
"which-typed-array": {
|
"which-typed-array": {
|
||||||
"version": "1.1.8",
|
"version": "1.1.8",
|
||||||
"resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.8.tgz",
|
"resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.8.tgz",
|
||||||
|
|||||||
@@ -27,6 +27,7 @@
|
|||||||
},
|
},
|
||||||
"workspaces": [
|
"workspaces": [
|
||||||
"apps/*",
|
"apps/*",
|
||||||
|
"apps/desktop/desktop_native",
|
||||||
"libs/*"
|
"libs/*"
|
||||||
],
|
],
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
@@ -37,7 +38,6 @@
|
|||||||
"@compodoc/compodoc": "^1.1.19",
|
"@compodoc/compodoc": "^1.1.19",
|
||||||
"@fluffy-spoon/substitute": "^1.208.0",
|
"@fluffy-spoon/substitute": "^1.208.0",
|
||||||
"@ngtools/webpack": "^12.2.13",
|
"@ngtools/webpack": "^12.2.13",
|
||||||
"@nodert-win10-rs4/windows.security.credentials.ui": "^0.4.4",
|
|
||||||
"@storybook/addon-a11y": "^6.5.7",
|
"@storybook/addon-a11y": "^6.5.7",
|
||||||
"@storybook/addon-actions": "^6.5.7",
|
"@storybook/addon-actions": "^6.5.7",
|
||||||
"@storybook/addon-essentials": "^6.5.7",
|
"@storybook/addon-essentials": "^6.5.7",
|
||||||
@@ -94,7 +94,6 @@
|
|||||||
"eslint-config-prettier": "^8.5.0",
|
"eslint-config-prettier": "^8.5.0",
|
||||||
"eslint-import-resolver-typescript": "^2.7.1",
|
"eslint-import-resolver-typescript": "^2.7.1",
|
||||||
"eslint-plugin-import": "^2.26.0",
|
"eslint-plugin-import": "^2.26.0",
|
||||||
"forcefocus": "^1.1.0",
|
|
||||||
"gulp": "^4.0.2",
|
"gulp": "^4.0.2",
|
||||||
"gulp-filter": "^7.0.0",
|
"gulp-filter": "^7.0.0",
|
||||||
"gulp-if": "^3.0.0",
|
"gulp-if": "^3.0.0",
|
||||||
@@ -108,7 +107,6 @@
|
|||||||
"jasmine-core": "^3.7.1",
|
"jasmine-core": "^3.7.1",
|
||||||
"jasmine-spec-reporter": "^7.0.0",
|
"jasmine-spec-reporter": "^7.0.0",
|
||||||
"jest-preset-angular": "^10.1.0",
|
"jest-preset-angular": "^10.1.0",
|
||||||
"keytar": "^7.9.0",
|
|
||||||
"lint-staged": "^12.4.1",
|
"lint-staged": "^12.4.1",
|
||||||
"mini-css-extract-plugin": "^2.4.5",
|
"mini-css-extract-plugin": "^2.4.5",
|
||||||
"node-ipc": "^9.2.1",
|
"node-ipc": "^9.2.1",
|
||||||
|
|||||||
Reference in New Issue
Block a user