Merge branch 'develop' into t3chguy/mac-asar-integrity

This commit is contained in:
Michael Telatynski 2025-03-13 08:46:37 +00:00 committed by GitHub
commit 6525798a1e
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
29 changed files with 681 additions and 625 deletions

View File

@ -92,7 +92,6 @@ jobs:
uses: ./.github/workflows/build_linux.yaml uses: ./.github/workflows/build_linux.yaml
with: with:
arch: ${{ matrix.arch }} arch: ${{ matrix.arch }}
config: ${{ needs.prepare.outputs.config }}
sqlcipher: ${{ matrix.sqlcipher }} sqlcipher: ${{ matrix.sqlcipher }}
version: ${{ needs.prepare.outputs.nightly-version }} version: ${{ needs.prepare.outputs.nightly-version }}

View File

@ -35,7 +35,6 @@ jobs:
sqlcipher: [system, static] sqlcipher: [system, static]
arch: [amd64, arm64] arch: [amd64, arm64]
with: with:
config: ${{ github.event.pull_request.base.ref == 'develop' && 'element.io/nightly' || 'element.io/release' }}
sqlcipher: ${{ matrix.sqlcipher }} sqlcipher: ${{ matrix.sqlcipher }}
arch: ${{ matrix.arch }} arch: ${{ matrix.arch }}
@ -97,7 +96,7 @@ jobs:
- uses: actions/setup-node@v4 - uses: actions/setup-node@v4
with: with:
node-version-file: package.json node-version-file: .node-version
cache: "yarn" cache: "yarn"
- name: Install Deps - name: Install Deps

View File

@ -8,10 +8,6 @@ on:
type: string type: string
required: true required: true
description: "The architecture to build for, one of 'amd64' | 'arm64'" description: "The architecture to build for, one of 'amd64' | 'arm64'"
config:
type: string
required: true
description: "The config directory to use"
version: version:
type: string type: string
required: false required: false
@ -76,7 +72,7 @@ jobs:
- uses: actions/setup-node@v4 - uses: actions/setup-node@v4
with: with:
node-version-file: package.json node-version-file: .node-version
cache: "yarn" cache: "yarn"
env: env:
# Workaround for https://github.com/actions/setup-node/issues/317 # Workaround for https://github.com/actions/setup-node/issues/317
@ -95,10 +91,10 @@ jobs:
# This allows contributors to test changes to the dockerbuild image within a pull request # This allows contributors to test changes to the dockerbuild image within a pull request
- name: Build docker image - name: Build docker image
uses: docker/build-push-action@ca877d9245402d1537745e0e356eab47c3520991 # v6 uses: docker/build-push-action@471d1dc4e07e5cdedd4c2171150001c434f0b7a4 # v6
if: steps.changed_files.outputs.any_modified == 'true' if: steps.changed_files.outputs.any_modified == 'true'
with: with:
context: dockerbuild file: dockerbuild/Dockerfile
load: true load: true
platforms: linux/${{ inputs.arch }} platforms: linux/${{ inputs.arch }}
tags: ${{ env.HAK_DOCKER_IMAGE }} tags: ${{ env.HAK_DOCKER_IMAGE }}

View File

@ -62,18 +62,19 @@ jobs:
- uses: actions/setup-node@v4 - uses: actions/setup-node@v4
with: with:
node-version-file: package.json node-version-file: .node-version
cache: "yarn" cache: "yarn"
- name: Install Deps - name: Install Deps
run: "yarn install --frozen-lockfile" run: "yarn install --frozen-lockfile"
# Python 3.12 drops distutils which keytar relies on
- name: Install setuptools
run: pip3 install setuptools
- name: Build Natives - name: Build Natives
if: steps.cache.outputs.cache-hit != 'true' if: steps.cache.outputs.cache-hit != 'true'
run: | run: yarn build:native:universal
# Python 3.12 drops distutils which keytar relies on
pip3 install setuptools
yarn build:native:universal
# We split these because electron-builder gets upset if we set CSC_LINK even to an empty string # We split these because electron-builder gets upset if we set CSC_LINK even to an empty string
- name: "[Signed] Build App" - name: "[Signed] Build App"

View File

@ -34,12 +34,9 @@ on:
packages-dir: packages-dir:
description: "The directory non-deb packages for this run should live in within packages.element.io" description: "The directory non-deb packages for this run should live in within packages.element.io"
value: ${{ inputs.nightly && 'nightly' || 'desktop' }} value: ${{ inputs.nightly && 'nightly' || 'desktop' }}
# These are just simple pass-throughs of the input to simplify reuse of complex inline conditions # This is just a simple pass-through of the input to simplify reuse of complex inline conditions
config:
description: "The relative path to the config file for this run"
value: ${{ inputs.config }}
deploy: deploy:
description: "The relative path to the config file for this run" description: "Whether the build should be deployed to production"
value: ${{ inputs.deploy }} value: ${{ inputs.deploy }}
permissions: {} permissions: {}
jobs: jobs:
@ -56,7 +53,7 @@ jobs:
- uses: actions/setup-node@v4 - uses: actions/setup-node@v4
with: with:
node-version-file: package.json node-version-file: .node-version
cache: "yarn" cache: "yarn"
- name: Install Deps - name: Install Deps

View File

@ -56,7 +56,8 @@ jobs:
"ia32": { "ia32": {
"target": "i686-pc-windows-msvc", "target": "i686-pc-windows-msvc",
"build-args": "--ia32", "build-args": "--ia32",
"arch": "x86" "arch": "x86",
"extra_config": "{\"user_notice\": {\"title\": \"Your desktop support ends soon\",\"description\": \"Support for 32-bit Windows installations will end soon, this impacts you. Transition to the web or mobile app for continued access.\"}}"
} }
} }
@ -99,14 +100,26 @@ jobs:
- uses: actions/setup-node@v4 - uses: actions/setup-node@v4
with: with:
# node-version-file: package.json node-version-file: .node-version
# For https://github.com/element-hq/element-desktop/issues/2161
node-version: 22.13.1
cache: "yarn" cache: "yarn"
- name: Install Deps - name: Install Deps
run: "yarn install --frozen-lockfile" run: "yarn install --frozen-lockfile"
- name: Insert config snippet
if: steps.config.outputs.extra_config != ''
shell: bash
run: |
mkdir config-edit
yarn asar extract webapp.asar config-edit
cd config-edit
mv config.json old-config.json
echo '${{ steps.config.outputs.extra_config }}' | jq -s '.[0] * .[1]' old-config.json - > config.json
rm old-config.json
cd ..
rm webapp.asar
yarn asar pack config-edit/ webapp.asar
- name: Set up sqlcipher macros - name: Set up sqlcipher macros
if: steps.cache.outputs.cache-hit != 'true' && contains(inputs.arch, 'arm') if: steps.cache.outputs.cache-hit != 'true' && contains(inputs.arch, 'arm')
shell: pwsh shell: pwsh

View File

@ -22,17 +22,17 @@ jobs:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- name: Set up QEMU - name: Set up QEMU
uses: docker/setup-qemu-action@4574d27a4764455b42196d70a065bc6853246a25 # v3 uses: docker/setup-qemu-action@29109295f81e9208d7d86ff1c6c12d2833863392 # v3
- name: Set up Docker Buildx - name: Set up Docker Buildx
uses: docker/setup-buildx-action@f7ce87c1d6bead3e36075b2ce75da1f6cc28aaca # v3 uses: docker/setup-buildx-action@b5ca514318bd6ebac0fb2aedd5d36ec1b5c232a2 # v3
with: with:
install: true install: true
- name: Build test image - name: Build test image
uses: docker/build-push-action@ca877d9245402d1537745e0e356eab47c3520991 # v6 uses: docker/build-push-action@471d1dc4e07e5cdedd4c2171150001c434f0b7a4 # v6
with: with:
context: dockerbuild file: dockerbuild/Dockerfile
push: false push: false
load: true load: true
tags: element-desktop-dockerbuild tags: element-desktop-dockerbuild
@ -52,7 +52,7 @@ jobs:
- name: Extract metadata for Docker - name: Extract metadata for Docker
id: meta id: meta
if: github.event_name != 'pull_request' if: github.event_name != 'pull_request'
uses: docker/metadata-action@369eb591f429131d6889c46b94e711f089e6ca96 # v5 uses: docker/metadata-action@902fa8ec7d6ecbf8d84d538b9b233a880e428804 # v5
with: with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
tags: | tags: |
@ -61,9 +61,9 @@ jobs:
- name: Build and push Docker image - name: Build and push Docker image
if: github.event_name != 'pull_request' if: github.event_name != 'pull_request'
uses: docker/build-push-action@ca877d9245402d1537745e0e356eab47c3520991 # v6 uses: docker/build-push-action@471d1dc4e07e5cdedd4c2171150001c434f0b7a4 # v6
with: with:
context: dockerbuild file: dockerbuild/Dockerfile
push: true push: true
tags: ${{ steps.meta.outputs.tags }} tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }} labels: ${{ steps.meta.outputs.labels }}

1
.node-version Normal file
View File

@ -0,0 +1 @@
v22.14.0

View File

@ -1,3 +1,31 @@
Changes in [1.11.95](https://github.com/element-hq/element-desktop/releases/tag/v1.11.95) (2025-03-11)
======================================================================================================
## ✨ Features
* Switch to shiftkey/node-keytar as it has NAPI 10 updates ([#2172](https://github.com/element-hq/element-desktop/pull/2172)). Contributed by @t3chguy.
* Add support for Windows arm64 ([#624](https://github.com/element-hq/element-desktop/pull/624)). Contributed by @t3chguy.
* Room List Store: Filter rooms by active space ([#29399](https://github.com/element-hq/element-web/pull/29399)). Contributed by @MidhunSureshR.
* Room List - Update the room list store on actions from the dispatcher ([#29397](https://github.com/element-hq/element-web/pull/29397)). Contributed by @MidhunSureshR.
* Room List - Implement a minimal view model ([#29357](https://github.com/element-hq/element-web/pull/29357)). Contributed by @MidhunSureshR.
* New room list: add space menu in room header ([#29352](https://github.com/element-hq/element-web/pull/29352)). Contributed by @florianduros.
* Room List - Store sorted rooms in skip list ([#29345](https://github.com/element-hq/element-web/pull/29345)). Contributed by @MidhunSureshR.
* New room list: add dial to search section ([#29359](https://github.com/element-hq/element-web/pull/29359)). Contributed by @florianduros.
* New room list: add compose menu for spaces in header ([#29347](https://github.com/element-hq/element-web/pull/29347)). Contributed by @florianduros.
* Use EditInPlace control for Identity Server picker to improve a11y ([#29280](https://github.com/element-hq/element-web/pull/29280)). Contributed by @Half-Shot.
* First step to add header to new room list ([#29320](https://github.com/element-hq/element-web/pull/29320)). Contributed by @florianduros.
* Add Windows 64-bit arm link and remove 32-bit link on compatibility page ([#29312](https://github.com/element-hq/element-web/pull/29312)). Contributed by @t3chguy.
* Honour the backup disable flag from Element X ([#29290](https://github.com/element-hq/element-web/pull/29290)). Contributed by @dbkr.
## 🐛 Bug Fixes
* Fix edited code block width ([#29394](https://github.com/element-hq/element-web/pull/29394)). Contributed by @florianduros.
* new room list: keep space name in one line in header ([#29369](https://github.com/element-hq/element-web/pull/29369)). Contributed by @florianduros.
* Dismiss "Key storage out of sync" toast when secrets received ([#29348](https://github.com/element-hq/element-web/pull/29348)). Contributed by @richvdh.
* Minor CSS fixes for the new room list ([#29334](https://github.com/element-hq/element-web/pull/29334)). Contributed by @florianduros.
* Add padding to room header icon ([#29271](https://github.com/element-hq/element-web/pull/29271)). Contributed by @langleyd.
Changes in [1.11.94](https://github.com/element-hq/element-desktop/releases/tag/v1.11.94) (2025-02-27) Changes in [1.11.94](https://github.com/element-hq/element-desktop/releases/tag/v1.11.94) (2025-02-27)
====================================================================================================== ======================================================================================================
* No changes * No changes

View File

@ -2,7 +2,7 @@
# with broader compatibility, down to Debian bullseye & Ubuntu focal. # with broader compatibility, down to Debian bullseye & Ubuntu focal.
FROM rust:bullseye FROM rust:bullseye
ENV DEBIAN_FRONTEND noninteractive ENV DEBIAN_FRONTEND=noninteractive
RUN curl --proto "=https" -L https://yarnpkg.com/latest.tar.gz | tar xvz && mv yarn-* /yarn && ln -s /yarn/bin/yarn /usr/bin/yarn RUN curl --proto "=https" -L https://yarnpkg.com/latest.tar.gz | tar xvz && mv yarn-* /yarn && ln -s /yarn/bin/yarn /usr/bin/yarn
RUN apt-get -qq update && apt-get -y -qq dist-upgrade && \ RUN apt-get -qq update && apt-get -y -qq dist-upgrade && \
@ -16,13 +16,12 @@ RUN apt-get -qq update && apt-get -y -qq dist-upgrade && \
apt-get purge -y --auto-remove && rm -rf /var/lib/apt/lists/* apt-get purge -y --auto-remove && rm -rf /var/lib/apt/lists/*
RUN ln -s /usr/bin/python3 /usr/bin/python & ln -s /usr/bin/pip3 /usr/bin/pip RUN ln -s /usr/bin/python3 /usr/bin/python & ln -s /usr/bin/pip3 /usr/bin/pip
ENV DEBUG_COLORS true ENV DEBUG_COLORS=true
ENV FORCE_COLOR true ENV FORCE_COLOR=true
WORKDIR /project WORKDIR /project
ENV NODE_VERSION 20.18.2
ARG TARGETOS ARG TARGETOS
ARG TARGETARCH ARG TARGETARCH
COPY setup.sh /setup.sh COPY .node-version dockerbuild/setup.sh /
RUN /setup.sh RUN /setup.sh

View File

@ -3,5 +3,6 @@
set -x set -x
declare -A archMap=(["amd64"]="x64" ["arm64"]="arm64") declare -A archMap=(["amd64"]="x64" ["arm64"]="arm64")
ARCH="${archMap["$TARGETARCH"]}" ARCH="${archMap["$TARGETARCH"]}"
curl --proto "=https" -L "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-$TARGETOS-$ARCH.tar.gz" | tar xz -C /usr/local --strip-components=1 && \ NODE_VERSION=$(cat /.node-version)
curl --proto "=https" -L "https://nodejs.org/dist/$NODE_VERSION/node-$NODE_VERSION-$TARGETOS-$ARCH.tar.gz" | tar xz -C /usr/local --strip-components=1 && \
unlink /usr/local/CHANGELOG.md && unlink /usr/local/LICENSE && unlink /usr/local/README.md unlink /usr/local/CHANGELOG.md && unlink /usr/local/LICENSE && unlink /usr/local/README.md

View File

@ -148,6 +148,9 @@ const config: Omit<Writable<Configuration>, "electronFuses"> & {
schemes: ["io.element.desktop", "element"], schemes: ["io.element.desktop", "element"],
}, },
], ],
nativeRebuilder: "sequential",
nodeGypRebuild: false,
npmRebuild: true,
}; };
/** /**

View File

@ -1,26 +0,0 @@
/*
Copyright 2024 New Vector Ltd.
Copyright 2020 The Matrix.org Foundation C.I.C.
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial
Please see LICENSE files in the repository root for full details.
*/
import path from "node:path";
import type HakEnv from "../../scripts/hak/hakEnv.js";
import type { DependencyInfo } from "../../scripts/hak/dep.js";
export default async function buildKeytar(hakEnv: HakEnv, moduleInfo: DependencyInfo): Promise<void> {
const env = hakEnv.makeGypEnv();
console.log("Running yarn with env", env);
await hakEnv.spawn(
path.join(moduleInfo.nodeModuleBinDir, "node-gyp"),
["rebuild", "--arch", hakEnv.getTargetArch()],
{
cwd: moduleInfo.moduleBuildDir,
env,
},
);
}

View File

@ -1,15 +0,0 @@
/*
Copyright 2024 New Vector Ltd.
Copyright 2020 The Matrix.org Foundation C.I.C.
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial
Please see LICENSE files in the repository root for full details.
*/
import type HakEnv from "../../scripts/hak/hakEnv.js";
import type { DependencyInfo } from "../../scripts/hak/dep.js";
export default async function (hakEnv: HakEnv, moduleInfo: DependencyInfo): Promise<void> {
// node-gyp uses python for reasons beyond comprehension
await hakEnv.checkTools([["python", "--version"]]);
}

View File

@ -1,10 +0,0 @@
{
"scripts": {
"check": "check.ts",
"build": "build.ts"
},
"copy": "build/Release/keytar.node",
"dependencies": {
"libsecret": "0.20.3"
}
}

View File

@ -5,7 +5,6 @@ export default {
project: ["**/*.{js,ts}"], project: ["**/*.{js,ts}"],
ignoreDependencies: [ ignoreDependencies: [
// Brought in via hak scripts // Brought in via hak scripts
"keytar",
"matrix-seshat", "matrix-seshat",
// Required for `action-validator` // Required for `action-validator`
"@action-validator/*", "@action-validator/*",

View File

@ -3,7 +3,7 @@
"productName": "Element", "productName": "Element",
"main": "lib/electron-main.js", "main": "lib/electron-main.js",
"exports": "./lib/electron-main.js", "exports": "./lib/electron-main.js",
"version": "1.11.94", "version": "1.11.95",
"description": "Element: the future of secure communication", "description": "Element: the future of secure communication",
"author": "Element", "author": "Element",
"homepage": "https://element.io", "homepage": "https://element.io",
@ -44,7 +44,7 @@
"build": "yarn run build:ts && yarn run build:res && electron-builder", "build": "yarn run build:ts && yarn run build:res && electron-builder",
"build:ts": "tsc", "build:ts": "tsc",
"build:res": "tsx scripts/copy-res.ts", "build:res": "tsx scripts/copy-res.ts",
"docker:setup": "docker build --platform linux/amd64 -t element-desktop-dockerbuild dockerbuild", "docker:setup": "docker build --platform linux/amd64 -t element-desktop-dockerbuild -f dockerbuild/Dockerfile .",
"docker:build:native": "scripts/in-docker.sh yarn run hak", "docker:build:native": "scripts/in-docker.sh yarn run hak",
"docker:build": "scripts/in-docker.sh yarn run build", "docker:build": "scripts/in-docker.sh yarn run build",
"docker:install": "scripts/in-docker.sh yarn install", "docker:install": "scripts/in-docker.sh yarn install",
@ -53,15 +53,17 @@
"test": "playwright test", "test": "playwright test",
"test:open": "yarn test --ui", "test:open": "yarn test --ui",
"test:screenshots:build": "docker build playwright -t element-desktop-playwright --platform linux/amd64", "test:screenshots:build": "docker build playwright -t element-desktop-playwright --platform linux/amd64",
"test:screenshots:run": "docker run --rm --network host -v $(pwd):/work/element-desktop -v /var/run/docker.sock:/var/run/docker.sock --platform linux/amd64 -it element-desktop-playwright" "test:screenshots:run": "docker run --rm --network host -v $(pwd):/work/element-desktop -v /var/run/docker.sock:/var/run/docker.sock --platform linux/amd64 -it element-desktop-playwright",
"postinstall": "electron-builder install-app-deps"
}, },
"dependencies": { "dependencies": {
"@sentry/electron": "^5.0.0", "@sentry/electron": "^6.0.0",
"@standardnotes/electron-clear-data": "^1.0.5", "@standardnotes/electron-clear-data": "^1.0.5",
"auto-launch": "^5.0.5", "auto-launch": "^5.0.5",
"counterpart": "^0.18.6", "counterpart": "^0.18.6",
"electron-store": "^10.0.0", "electron-store": "^10.0.0",
"electron-window-state": "^5.0.3", "electron-window-state": "^5.0.3",
"keytar-forked": "7.10.0",
"minimist": "^1.2.6", "minimist": "^1.2.6",
"png-to-ico": "^2.1.1", "png-to-ico": "^2.1.1",
"uuid": "^11.0.0" "uuid": "^11.0.0"
@ -73,21 +75,21 @@
"@babel/preset-env": "^7.18.10", "@babel/preset-env": "^7.18.10",
"@babel/preset-typescript": "^7.18.6", "@babel/preset-typescript": "^7.18.6",
"@electron/asar": "3.3.1", "@electron/asar": "3.3.1",
"@playwright/test": "1.50.1", "@playwright/test": "1.51.0",
"@stylistic/eslint-plugin": "^3.0.0", "@stylistic/eslint-plugin": "^3.0.0",
"@types/auto-launch": "^5.0.1", "@types/auto-launch": "^5.0.1",
"@types/counterpart": "^0.18.1", "@types/counterpart": "^0.18.1",
"@types/minimist": "^1.2.1", "@types/minimist": "^1.2.1",
"@types/node": "18.19.76", "@types/node": "18.19.79",
"@types/pacote": "^11.1.1", "@types/pacote": "^11.1.1",
"@typescript-eslint/eslint-plugin": "^8.0.0", "@typescript-eslint/eslint-plugin": "^8.0.0",
"@typescript-eslint/parser": "^8.0.0", "@typescript-eslint/parser": "^8.0.0",
"app-builder-lib": "26.0.8", "app-builder-lib": "26.0.11",
"chokidar": "^4.0.0", "chokidar": "^4.0.0",
"detect-libc": "^2.0.0", "detect-libc": "^2.0.0",
"electron": "34.2.0", "electron": "34.3.1",
"electron-builder": "26.0.8", "electron-builder": "26.0.11",
"electron-builder-squirrel-windows": "26.0.8", "electron-builder-squirrel-windows": "26.0.11",
"electron-devtools-installer": "^4.0.0", "electron-devtools-installer": "^4.0.0",
"eslint": "^8.26.0", "eslint": "^8.26.0",
"eslint-config-google": "^0.14.0", "eslint-config-google": "^0.14.0",
@ -107,15 +109,14 @@
"rimraf": "^6.0.0", "rimraf": "^6.0.0",
"tar": "^7.0.0", "tar": "^7.0.0",
"tsx": "^4.19.2", "tsx": "^4.19.2",
"typescript": "5.7.3" "typescript": "5.8.2"
}, },
"hakDependencies": { "hakDependencies": {
"matrix-seshat": "^4.0.1", "matrix-seshat": "^4.0.1"
"keytar": "^7.9.0"
}, },
"resolutions": { "resolutions": {
"@electron/universal": "2.0.2", "@electron/universal": "2.0.2",
"@types/node": "18.19.76", "@types/node": "18.19.79",
"config-file-ts": "0.2.8-rc1" "config-file-ts": "0.2.8-rc1"
} }
} }

View File

@ -1,4 +1,4 @@
FROM mcr.microsoft.com/playwright:v1.50.1-jammy FROM mcr.microsoft.com/playwright:v1.51.0-jammy
WORKDIR /work/element-desktop WORKDIR /work/element-desktop

View File

@ -67,14 +67,14 @@ Hak is divided into lifecycle stages, in order:
# hak.json # hak.json
The scripts section contains scripts used for lifecycle stages that need them (fetch, fetchDeps, build). The scripts section contains scripts used for lifecycle stages that need them (fetch, build).
It also contains 'prune' and 'copy' which are globs of files to delete from the output module directory It also contains 'prune' and 'copy' which are globs of files to delete from the output module directory
and copy over from the module build directory to the output module directory, respectively. and copy over from the module build directory to the output module directory, respectively.
# Shortcomings # Shortcomings
Hak doesn't know about dependencies between lifecycle stages, ie. it doesn't know that you need to Hak doesn't know about dependencies between lifecycle stages, ie. it doesn't know that you need to
'fetch' and 'fetchDeps' before you can 'build', etc. You get to run each individually, and remember 'fetch' before you can 'build', etc. You get to run each individually, and remember
the right order. the right order.
There is also a _lot_ of duplication in the command execution: we should abstract away There is also a _lot_ of duplication in the command execution: we should abstract away

View File

@ -10,7 +10,5 @@ import type { DependencyInfo } from "./dep.js";
import type HakEnv from "./hakEnv.js"; import type HakEnv from "./hakEnv.js";
export default async function check(hakEnv: HakEnv, moduleInfo: DependencyInfo): Promise<void> { export default async function check(hakEnv: HakEnv, moduleInfo: DependencyInfo): Promise<void> {
if (moduleInfo.scripts.check) { await moduleInfo.scripts.check?.(hakEnv, moduleInfo);
await moduleInfo.scripts.check(hakEnv, moduleInfo);
}
} }

View File

@ -9,7 +9,6 @@ Please see LICENSE files in the repository root for full details.
import path from "node:path"; import path from "node:path";
import fsProm from "node:fs/promises"; import fsProm from "node:fs/promises";
import childProcess from "node:child_process"; import childProcess from "node:child_process";
import { rimraf } from "rimraf";
import { glob } from "glob"; import { glob } from "glob";
import { mkdirp } from "mkdirp"; import { mkdirp } from "mkdirp";
@ -17,20 +16,6 @@ import type HakEnv from "./hakEnv.js";
import type { DependencyInfo } from "./dep.js"; import type { DependencyInfo } from "./dep.js";
export default async function copy(hakEnv: HakEnv, moduleInfo: DependencyInfo): Promise<void> { export default async function copy(hakEnv: HakEnv, moduleInfo: DependencyInfo): Promise<void> {
if (moduleInfo.cfg.prune) {
console.log("Removing " + moduleInfo.cfg.prune + " from " + moduleInfo.moduleOutDir);
// rimraf doesn't have a 'cwd' option: it always uses process.cwd()
// (and if you set glob.cwd it just breaks because it can't find the files)
const oldCwd = process.cwd();
try {
await mkdirp(moduleInfo.moduleOutDir);
process.chdir(moduleInfo.moduleOutDir);
await rimraf(moduleInfo.cfg.prune);
} finally {
process.chdir(oldCwd);
}
}
if (moduleInfo.cfg.copy) { if (moduleInfo.cfg.copy) {
// If there are multiple moduleBuildDirs, singular moduleBuildDir // If there are multiple moduleBuildDirs, singular moduleBuildDir
// is the same as moduleBuildDirs[0], so we're just listing the contents // is the same as moduleBuildDirs[0], so we're just listing the contents

View File

@ -1,19 +0,0 @@
/*
Copyright 2024 New Vector Ltd.
Copyright 2020 The Matrix.org Foundation C.I.C.
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial
Please see LICENSE files in the repository root for full details.
*/
import { mkdirp } from "mkdirp";
import type { DependencyInfo } from "./dep.js";
import type HakEnv from "./hakEnv.js";
export default async function fetchDeps(hakEnv: HakEnv, moduleInfo: DependencyInfo): Promise<void> {
await mkdirp(moduleInfo.moduleDotHakDir);
if (moduleInfo.scripts.fetchDeps) {
await moduleInfo.scripts.fetchDeps(hakEnv, moduleInfo);
}
}

View File

@ -19,7 +19,7 @@ import packageJson from "../../package.json";
const MODULECOMMANDS = ["check", "fetch", "link", "build", "copy", "clean"]; const MODULECOMMANDS = ["check", "fetch", "link", "build", "copy", "clean"];
// Shortcuts for multiple commands at once (useful for building universal binaries // Shortcuts for multiple commands at once (useful for building universal binaries
// because you can run the fetch/fetchDeps/build for each arch and then copy/link once) // because you can run the fetch/build for each arch and then copy/link once)
const METACOMMANDS: Record<string, string[]> = { const METACOMMANDS: Record<string, string[]> = {
fetchandbuild: ["check", "fetch", "build"], fetchandbuild: ["check", "fetch", "build"],
copyandlink: ["copy", "link"], copyandlink: ["copy", "link"],

View File

@ -1,54 +0,0 @@
// Based on https://github.com/atom/node-keytar/blob/master/keytar.d.ts because keytar is a hak-dependency and not a normal one
// Definitions by: Milan Burda <https://github.com/miniak>, Brendan Forster <https://github.com/shiftkey>, Hari Juturu <https://github.com/juturu>
// Adapted from DefinitelyTyped: https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/keytar/index.d.ts
declare module "keytar" {
/**
* Get the stored password for the service and account.
*
* @param service The string service name.
* @param account The string account name.
*
* @returns A promise for the password string.
*/
export function getPassword(service: string, account: string): Promise<string | null>;
/**
* Add the password for the service and account to the keychain.
*
* @param service The string service name.
* @param account The string account name.
* @param password The string password.
*
* @returns A promise for the set password completion.
*/
export function setPassword(service: string, account: string, password: string): Promise<void>;
/**
* Delete the stored password for the service and account.
*
* @param service The string service name.
* @param account The string account name.
*
* @returns A promise for the deletion status. True on success.
*/
export function deletePassword(service: string, account: string): Promise<boolean>;
/**
* Find a password for the service in the keychain.
*
* @param service The string service name.
*
* @returns A promise for the password string.
*/
export function findPassword(service: string): Promise<string | null>;
/**
* Find all accounts and passwords for `service` in the keychain.
*
* @param service The string service name.
*
* @returns A promise for the array of found credentials.
*/
export function findCredentials(service: string): Promise<Array<{ account: string; password: string }>>;
}

View File

@ -22,7 +22,6 @@ import { URL, fileURLToPath } from "node:url";
import minimist from "minimist"; import minimist from "minimist";
import "./ipc.js"; import "./ipc.js";
import "./keytar.js";
import "./seshat.js"; import "./seshat.js";
import "./settings.js"; import "./settings.js";
import * as tray from "./tray.js"; import * as tray from "./tray.js";

View File

@ -7,12 +7,12 @@ Please see LICENSE files in the repository root for full details.
import { app, autoUpdater, desktopCapturer, ipcMain, powerSaveBlocker, TouchBar, nativeImage } from "electron"; import { app, autoUpdater, desktopCapturer, ipcMain, powerSaveBlocker, TouchBar, nativeImage } from "electron";
import { relaunchApp } from "@standardnotes/electron-clear-data"; import { relaunchApp } from "@standardnotes/electron-clear-data";
import keytar from "keytar-forked";
import IpcMainEvent = Electron.IpcMainEvent; import IpcMainEvent = Electron.IpcMainEvent;
import { recordSSOSession } from "./protocol.js"; import { recordSSOSession } from "./protocol.js";
import { randomArray } from "./utils.js"; import { randomArray } from "./utils.js";
import { Settings } from "./settings.js"; import { Settings } from "./settings.js";
import { keytar } from "./keytar.js";
import { getDisplayMediaCallback, setDisplayMediaCallback } from "./displayMediaCallback.js"; import { getDisplayMediaCallback, setDisplayMediaCallback } from "./displayMediaCallback.js";
ipcMain.on("setBadgeCount", function (_ev: IpcMainEvent, count: number): void { ipcMain.on("setBadgeCount", function (_ev: IpcMainEvent, count: number): void {
@ -141,11 +141,11 @@ ipcMain.on("ipcCall", async function (_ev: IpcMainEvent, payload) {
case "getPickleKey": case "getPickleKey":
try { try {
ret = await keytar?.getPassword("element.io", `${args[0]}|${args[1]}`); ret = await keytar.getPassword("element.io", `${args[0]}|${args[1]}`);
// migrate from riot.im (remove once we think there will no longer be // migrate from riot.im (remove once we think there will no longer be
// logins from the time of riot.im) // logins from the time of riot.im)
if (ret === null) { if (ret === null) {
ret = await keytar?.getPassword("riot.im", `${args[0]}|${args[1]}`); ret = await keytar.getPassword("riot.im", `${args[0]}|${args[1]}`);
} }
} catch { } catch {
// if an error is thrown (e.g. keytar can't connect to the keychain), // if an error is thrown (e.g. keytar can't connect to the keychain),
@ -161,17 +161,18 @@ ipcMain.on("ipcCall", async function (_ev: IpcMainEvent, payload) {
// rather than sending them a pickle key we did not store on their behalf. // rather than sending them a pickle key we did not store on their behalf.
await keytar!.setPassword("element.io", `${args[0]}|${args[1]}`, pickleKey); await keytar!.setPassword("element.io", `${args[0]}|${args[1]}`, pickleKey);
ret = pickleKey; ret = pickleKey;
} catch { } catch (e) {
console.error("Failed to create pickle key", e);
ret = null; ret = null;
} }
break; break;
case "destroyPickleKey": case "destroyPickleKey":
try { try {
await keytar?.deletePassword("element.io", `${args[0]}|${args[1]}`); await keytar.deletePassword("element.io", `${args[0]}|${args[1]}`);
// migrate from riot.im (remove once we think there will no longer be // migrate from riot.im (remove once we think there will no longer be
// logins from the time of riot.im) // logins from the time of riot.im)
await keytar?.deletePassword("riot.im", `${args[0]}|${args[1]}`); await keytar.deletePassword("riot.im", `${args[0]}|${args[1]}`);
} catch {} } catch {}
break; break;
case "getDesktopCapturerSources": case "getDesktopCapturerSources":

View File

@ -1,21 +0,0 @@
/*
Copyright 2022-2024 New Vector Ltd.
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only OR LicenseRef-Element-Commercial
Please see LICENSE files in the repository root for full details.
*/
import type * as Keytar from "keytar"; // Hak dependency type
let keytar: typeof Keytar | undefined;
try {
({ default: keytar } = await import("keytar"));
} catch (e) {
if ((<NodeJS.ErrnoException>e).code === "MODULE_NOT_FOUND") {
console.log("Keytar isn't installed; secure key storage is disabled.");
} else {
console.warn("Keytar unexpected error:", e);
}
}
export { keytar };

View File

@ -8,6 +8,7 @@ Please see LICENSE files in the repository root for full details.
import { app, ipcMain } from "electron"; import { app, ipcMain } from "electron";
import { promises as afs } from "node:fs"; import { promises as afs } from "node:fs";
import path from "node:path"; import path from "node:path";
import keytar from "keytar-forked";
import type { import type {
Seshat as SeshatType, Seshat as SeshatType,
@ -16,7 +17,6 @@ import type {
} from "matrix-seshat"; // Hak dependency type } from "matrix-seshat"; // Hak dependency type
import IpcMainEvent = Electron.IpcMainEvent; import IpcMainEvent = Electron.IpcMainEvent;
import { randomArray } from "./utils.js"; import { randomArray } from "./utils.js";
import { keytar } from "./keytar.js";
let seshatSupported = false; let seshatSupported = false;
let Seshat: typeof SeshatType; let Seshat: typeof SeshatType;

975
yarn.lock

File diff suppressed because it is too large Load Diff