diff --git a/.github/workflows/build_and_deploy.yaml b/.github/workflows/build_and_deploy.yaml index 0adc19cfa..49e4ee025 100644 --- a/.github/workflows/build_and_deploy.yaml +++ b/.github/workflows/build_and_deploy.yaml @@ -90,22 +90,37 @@ jobs: base-url: https://packages.element.io/${{ inputs.mode == 'release' && 'desktop' || 'nightly' }} version: ${{ needs.prepare.outputs.macos-version }} + # We do not put this call into deploy-mode as we do not want it to add to the packages.element.io artifact + # We ship this build via reprepro only linux: if: github.event_name != 'workflow_dispatch' || inputs.linux needs: prepare - name: Linux + name: Linux (sqlcipher system) uses: ./.github/workflows/build_linux.yaml with: config: element.io/${{ inputs.mode || 'nightly' }} sqlcipher: system version: ${{ needs.prepare.outputs.linux-version }} - # This deploy job only handles Windows & macOS as those are stateless and static. + # We ship the static build via static tarball only + linux_static: + if: github.event_name != 'workflow_dispatch' || inputs.linux + needs: prepare + name: Linux (sqlcipher static) + uses: ./.github/workflows/build_linux.yaml + with: + deploy-mode: true + config: element.io/${{ inputs.mode || 'nightly' }} + sqlcipher: static + version: ${{ needs.prepare.outputs.linux-version }} + + # This deploy job only handles Windows, macOS & linux_static as those are stateless and static. # Linux will be deployed via reprepro after it, but we list it as a dependency to abort if it fails. deploy: needs: - macos - linux + - linux_static - windows_32bit - windows_64bit runs-on: ubuntu-latest diff --git a/.github/workflows/build_and_test.yaml b/.github/workflows/build_and_test.yaml index 429be35db..fc09e0398 100644 --- a/.github/workflows/build_and_test.yaml +++ b/.github/workflows/build_and_test.yaml @@ -80,7 +80,7 @@ jobs: cache: "yarn" - name: Install Deps - run: "yarn install --pure-lockfile" + run: "yarn install --frozen-lockfile" - uses: actions/download-artifact@v3 with: diff --git a/.github/workflows/build_linux.yaml b/.github/workflows/build_linux.yaml index 16dce1234..f9285d355 100644 --- a/.github/workflows/build_linux.yaml +++ b/.github/workflows/build_linux.yaml @@ -16,11 +16,15 @@ on: type: string required: true description: "How to link sqlcipher, one of 'system' | 'static'" + deploy-mode: + type: boolean + required: false + description: "Whether to arrange artifacts in the arrangement needed for deployment, skipping unrelated ones" jobs: build: runs-on: ubuntu-latest container: - image: ghcr.io/vector-im/element-desktop-dockerbuild:t3chguy-dockerbuild + image: ghcr.io/vector-im/element-desktop-dockerbuild:${{ github.ref_name == 'master' && 'master' || 'develop' }} defaults: run: shell: bash @@ -35,7 +39,7 @@ jobs: id: cache uses: actions/cache@v3 with: - key: ${{ runner.os }}-${{ hashFiles('hakDependencies.json', 'electronVersion') }} + key: ${{ runner.os }}-${{ inputs.sqlcipher }}-${{ hashFiles('hakDependencies.json', 'electronVersion') }} path: | ./.hak @@ -48,7 +52,7 @@ jobs: # Does not need branch matching as only analyses this layer - name: Install Deps - run: "yarn install --pure-lockfile" + run: "yarn install --frozen-lockfile" - name: Build Natives if: steps.cache.outputs.cache-hit != 'true' @@ -68,7 +72,7 @@ jobs: if [ -f changelog.Debian ]; then echo "config-args=--deb-changelog changelog.Debian" >> $GITHUB_OUTPUT fi - + cp "$DIR/control.template" debcontrol VERSION=${INPUT_VERSION:-$(cat package.json | jq -r .version)} echo "Version: $VERSION" >> debcontrol @@ -78,12 +82,56 @@ jobs: - name: Build App run: | - npx ts-node scripts/generate-builder-config.ts ${{ steps.nightly.outputs.config-args }} --deb-custom-control=debcontrol + npx ts-node scripts/generate-builder-config.ts \ + ${{ steps.nightly.outputs.config-args }} \ + ${{ steps.debian.outputs.config-args }} \ + --deb-custom-control=debcontrol yarn build --publish never -l --config electron-builder.json + - name: Check ldd + run: | + ldd dist/linux-unpacked/resources/app.asar.unpacked/node_modules/matrix-seshat/native/index.node + if [ "$SQLCIPHER_STATIC" == "1" ]; then + ldd dist/linux-unpacked/resources/app.asar.unpacked/node_modules/matrix-seshat/native/index.node | grep -v libsqlcipher.so.0 + ldd dist/linux-unpacked/resources/app.asar.unpacked/node_modules/matrix-seshat/native/index.node | grep libcrypto.so.1.1 + else + ldd dist/linux-unpacked/resources/app.asar.unpacked/node_modules/matrix-seshat/native/index.node | grep libsqlcipher.so.0 + ldd dist/linux-unpacked/resources/app.asar.unpacked/node_modules/matrix-seshat/native/index.node | grep -v libcrypto.so.1.1 + fi + env: + SQLCIPHER_STATIC: ${{ inputs.sqlcipher == 'static' && '1' || '' }} + + - name: Stash deb package + if: inputs.deploy-mode + uses: actions/upload-artifact@v3 + with: + name: linux-sqlcipher-${{ inputs.sqlcipher }}-deb + path: dist/*.deb + retention-days: 1 + + - name: Prepare artifacts for deployment + if: inputs.deploy-mode + run: | + mv dist _dist + mkdir -p "dist/install/linux/glibc-x86-64/" + mv _dist/*.tar.gz "dist/install/linux/glibc-x86-64" + + # We don't wish to store the tarball for every nightly ever, so we only keep the latest + - name: "[Nightly] Strip version from tarball" + if: inputs.deploy-mode && inputs.version != '' + run: | + mv dist/install/linux/glibc-x86-64/*.tar.gz "dist/install/linux/glibc-x86-64/element-desktop-nightly.tar.gz" + + - name: "[Release] Prepare release latest symlink" + if: inputs.deploy-mode && inputs.version == '' + shell: bash + run: | + ln -s "$(find . -type f -iname "*.tar.gz" | xargs -0 -n1 -- basename)" "element-desktop.tar.gz" + working-directory: "dist/install/linux/glibc-x86-64" + - name: Upload Artifacts uses: actions/upload-artifact@v3 with: - name: linux-sqlcipher-${{ inputs.sqlcipher }} + name: ${{ inputs.deploy-mode && 'packages.element.io' || format('linux-sqlcipher-{0}', inputs.sqlcipher) }} path: dist retention-days: 1 diff --git a/.github/workflows/build_macos.yaml b/.github/workflows/build_macos.yaml index e032f1271..e57624374 100644 --- a/.github/workflows/build_macos.yaml +++ b/.github/workflows/build_macos.yaml @@ -24,7 +24,7 @@ on: required: false description: "Whether to sign & notarise the build, requires 'packages.element.io' environment" deploy-mode: - type: string + type: boolean required: false description: "Whether to arrange artifacts in the arrangement needed for deployment, skipping unrelated ones" base-url: @@ -64,7 +64,7 @@ jobs: # Does not need branch matching as only analyses this layer - name: Install Deps - run: "yarn install --pure-lockfile" + run: "yarn install --frozen-lockfile" - name: Build Natives if: steps.cache.outputs.cache-hit != 'true' diff --git a/.github/workflows/build_prepare.yaml b/.github/workflows/build_prepare.yaml index 65fec260e..b118aacc1 100644 --- a/.github/workflows/build_prepare.yaml +++ b/.github/workflows/build_prepare.yaml @@ -56,7 +56,7 @@ jobs: cache: "yarn" - name: Install Deps - run: "yarn install --pure-lockfile" + run: "yarn install --frozen-lockfile" - name: Fetch Element Web run: yarn run fetch --noverify -d ${{ inputs.config }} ${{ inputs.version }} @@ -108,8 +108,9 @@ jobs: echo "element-desktop ($VERSION) default; urgency=medium" >> changelog.Debian echo "$BODY" | sed 's/^##/\n */g;s/^\*/ */g' | perl -pe 's/\[.+?]\((.+?)\)/\1/g' >> changelog.Debian echo "" >> changelog.Debian - echo " -- ${{ github.actor }} $TIME" >> changelog.Debian + echo " -- $ACTOR $TIME" >> changelog.Debian env: + ACTOR: ${{ github.actor }} VERSION: v${{ steps.package.outputs.version }} BODY: ${{ steps.release.outputs.body }} PUBLISHED_AT: ${{ steps.release.outputs.published_at }} diff --git a/.github/workflows/build_windows.yaml b/.github/workflows/build_windows.yaml index 6acee52b5..f156081fd 100644 --- a/.github/workflows/build_windows.yaml +++ b/.github/workflows/build_windows.yaml @@ -24,7 +24,7 @@ on: required: false description: "Whether to sign & notarise the build, requires 'packages.element.io' environment" deploy-mode: - type: string + type: boolean required: false description: "Whether to arrange artifacts in the arrangement needed for deployment, skipping unrelated ones" jobs: @@ -107,7 +107,7 @@ jobs: # Does not need branch matching as only analyses this layer - name: Install Deps - run: "yarn install --pure-lockfile" + run: "yarn install --frozen-lockfile" - name: Build Natives if: steps.cache.outputs.cache-hit != 'true' diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml new file mode 100644 index 000000000..2435a03cf --- /dev/null +++ b/.github/workflows/codeql.yml @@ -0,0 +1,51 @@ +name: "CodeQL" + +on: + push: + branches: [ "develop", master, staging ] + pull_request: + # The branches below must be a subset of the branches above + branches: [ "develop" ] + schedule: + - cron: '19 9 * * 6' + +jobs: + analyze: + name: Analyze + runs-on: ubuntu-latest + permissions: + actions: read + contents: read + security-events: write + + strategy: + fail-fast: false + matrix: + # We have a single C file for the rebrand_stub which we don't want/need to analyse + # but it prevents us from using the built-in CodeQL scanner + language: [ 'javascript' ] + # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ] + # Use only 'java' to analyze code written in Java, Kotlin or both + # Use only 'javascript' to analyze code written in JavaScript, TypeScript or both + # Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@v2 + with: + languages: ${{ matrix.language }} + # If you wish to specify custom queries, you can do so here or in a config file. + # By default, queries listed here will override any specified in a config file. + # Prefix the list here with "+" to use these queries and those in the config file. + + # Details on CodeQL's query packs refer to : https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs + # queries: security-extended,security-and-quality + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v2 + with: + category: "/language:${{matrix.language}}" diff --git a/.github/workflows/dockerbuild.yaml b/.github/workflows/dockerbuild.yaml new file mode 100644 index 000000000..9911c9241 --- /dev/null +++ b/.github/workflows/dockerbuild.yaml @@ -0,0 +1,43 @@ +name: Dockerbuild +on: + workflow_dispatch: {} + push: + branches: [master, develop] + paths: + - "dockerbuild/**" +concurrency: ${{ github.workflow }}-${{ github.ref_name }} +env: + REGISTRY: ghcr.io + IMAGE_NAME: ${{ github.repository }}-dockerbuild +jobs: + build: + name: Docker Build + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + steps: + - uses: actions/checkout@v3 + + - name: Log in to the Container registry + uses: docker/login-action@f054a8b539a109f9f41c372932f1ae047eff08c9 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Extract metadata for Docker + id: meta + uses: docker/metadata-action@98669ae865ea3cffbcbaa878cf57c20bbf1c6c38 + with: + images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} + tags: | + type=ref,event=branch + + - name: Build and push Docker image + uses: docker/build-push-action@ad44023a93711e3deb337508980b4b5e9bcdc5dc + with: + context: dockerbuild + push: true + tags: ${{ steps.meta.outputs.tags }} + labels: ${{ steps.meta.outputs.labels }} diff --git a/.github/workflows/static_analysis.yaml b/.github/workflows/static_analysis.yaml index 25ece5074..56fab9ad8 100644 --- a/.github/workflows/static_analysis.yaml +++ b/.github/workflows/static_analysis.yaml @@ -16,7 +16,7 @@ jobs: # Does not need branch matching as only analyses this layer - name: Install Deps - run: "yarn install --pure-lockfile" + run: "yarn install --frozen-lockfile" - name: Typecheck run: "yarn run lint:types" @@ -37,7 +37,7 @@ jobs: # Does not need branch matching as only analyses this layer - name: Install Deps - run: "yarn install --pure-lockfile" + run: "yarn install --frozen-lockfile" - name: Run Linter run: "yarn run lint:js" diff --git a/CHANGELOG.md b/CHANGELOG.md index 6a0e01042..ae8dd342a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,90 @@ +Changes in [1.11.29](https://github.com/vector-im/element-desktop/releases/tag/v1.11.29) (2023-04-11) +===================================================================================================== + +## ✨ Features + * Ship linux tarball with static sqlcipher ([\#597](https://github.com/vector-im/element-desktop/pull/597)). Fixes vector-im/element-web#18486. + * Show recent room breadcrumbs on touchbar ([\#183](https://github.com/vector-im/element-desktop/pull/183)). Fixes vector-im/element-web#15998. + * Clear electron data when logging out ([\#578](https://github.com/vector-im/element-desktop/pull/578)). + * Send Electron crashpad reports to Sentry from Nightly ([\#579](https://github.com/vector-im/element-desktop/pull/579)). Fixes vector-im/element-web#18263. + * Recommend element-io-archive-keyring from our Debian package ([\#566](https://github.com/vector-im/element-desktop/pull/566)). + * Allow desktop app to expose recent rooms in UI integrations ([\#16940](https://github.com/vector-im/element-web/pull/16940)). + * Add API params to mute audio and/or video in Jitsi calls by default ([\#24820](https://github.com/vector-im/element-web/pull/24820)). Contributed by @dhenneke. + * Style mentions as pills in rich text editor ([\#10448](https://github.com/matrix-org/matrix-react-sdk/pull/10448)). Contributed by @alunturner. + * Show room create icon if "UIComponent.roomCreation" is enabled ([\#10364](https://github.com/matrix-org/matrix-react-sdk/pull/10364)). Contributed by @maheichyk. + * Mentions as links rte ([\#10463](https://github.com/matrix-org/matrix-react-sdk/pull/10463)). Contributed by @alunturner. + * Better error handling in jump to date ([\#10405](https://github.com/matrix-org/matrix-react-sdk/pull/10405)). Contributed by @MadLittleMods. + * Show "Invite" menu option if "UIComponent.sendInvites" is enabled. ([\#10363](https://github.com/matrix-org/matrix-react-sdk/pull/10363)). Contributed by @maheichyk. + * Added `UserProfilesStore`, `LruCache` and user permalink profile caching ([\#10425](https://github.com/matrix-org/matrix-react-sdk/pull/10425)). Fixes vector-im/element-web#10559. + * Mentions as links rte ([\#10422](https://github.com/matrix-org/matrix-react-sdk/pull/10422)). Contributed by @alunturner. + * Implement MSC3952: intentional mentions ([\#9983](https://github.com/matrix-org/matrix-react-sdk/pull/9983)). + * Implement MSC3973: Search users in the user directory with the Widget API ([\#10269](https://github.com/matrix-org/matrix-react-sdk/pull/10269)). Contributed by @dhenneke. + * Permalinks to message are now displayed as pills ([\#10392](https://github.com/matrix-org/matrix-react-sdk/pull/10392)). Fixes vector-im/element-web#24751 and vector-im/element-web#24706. + * Show search,dial,explore in filterContainer if "UIComponent.filterContainer" is enabled ([\#10381](https://github.com/matrix-org/matrix-react-sdk/pull/10381)). Contributed by @maheichyk. + * Increase space panel collapse clickable area ([\#6084](https://github.com/matrix-org/matrix-react-sdk/pull/6084)). Fixes vector-im/element-web#17379. Contributed by @jaiwanth-v. + * Add fallback for replies to Polls ([\#10380](https://github.com/matrix-org/matrix-react-sdk/pull/10380)). Fixes vector-im/element-web#24197. Contributed by @kerryarchibald. + * Permalinks to rooms and users are now pillified ([\#10388](https://github.com/matrix-org/matrix-react-sdk/pull/10388)). Fixes vector-im/element-web#24825. + * Poll history - access poll history from room settings ([\#10356](https://github.com/matrix-org/matrix-react-sdk/pull/10356)). Contributed by @kerryarchibald. + * Add API params to mute audio and/or video in Jitsi calls by default ([\#10376](https://github.com/matrix-org/matrix-react-sdk/pull/10376)). Contributed by @dhenneke. + * Notifications: inline error message on notifications saving error ([\#10288](https://github.com/matrix-org/matrix-react-sdk/pull/10288)). Contributed by @kerryarchibald. + * Support dynamic room predecessor in SpaceProvider ([\#10348](https://github.com/matrix-org/matrix-react-sdk/pull/10348)). Contributed by @andybalaam. + * Support dynamic room predecessors for RoomProvider ([\#10346](https://github.com/matrix-org/matrix-react-sdk/pull/10346)). Contributed by @andybalaam. + * Support dynamic room predecessors in OwnBeaconStore ([\#10339](https://github.com/matrix-org/matrix-react-sdk/pull/10339)). Contributed by @andybalaam. + * Support dynamic room predecessors in ForwardDialog ([\#10344](https://github.com/matrix-org/matrix-react-sdk/pull/10344)). Contributed by @andybalaam. + * Support dynamic room predecessors in SpaceHierarchy ([\#10341](https://github.com/matrix-org/matrix-react-sdk/pull/10341)). Contributed by @andybalaam. + * Support dynamic room predecessors in AddExistingToSpaceDialog ([\#10342](https://github.com/matrix-org/matrix-react-sdk/pull/10342)). Contributed by @andybalaam. + * Support dynamic room predecessors in leave-behaviour ([\#10340](https://github.com/matrix-org/matrix-react-sdk/pull/10340)). Contributed by @andybalaam. + * Support dynamic room predecessors in StopGapWidgetDriver ([\#10338](https://github.com/matrix-org/matrix-react-sdk/pull/10338)). Contributed by @andybalaam. + * Support dynamic room predecessors in WidgetLayoutStore ([\#10326](https://github.com/matrix-org/matrix-react-sdk/pull/10326)). Contributed by @andybalaam. + * Support dynamic room predecessors in SpaceStore ([\#10332](https://github.com/matrix-org/matrix-react-sdk/pull/10332)). Contributed by @andybalaam. + * Sync polls push rules on changes to account_data ([\#10287](https://github.com/matrix-org/matrix-react-sdk/pull/10287)). Contributed by @kerryarchibald. + * Support dynamic room predecessors in BreadcrumbsStore ([\#10295](https://github.com/matrix-org/matrix-react-sdk/pull/10295)). Contributed by @andybalaam. + * Improved a11y for Field feedback and Secure Phrase input ([\#10320](https://github.com/matrix-org/matrix-react-sdk/pull/10320)). Contributed by @Sebbones. + * Support dynamic room predecessors in RoomNotificationStateStore ([\#10297](https://github.com/matrix-org/matrix-react-sdk/pull/10297)). Contributed by @andybalaam. + +## 🐛 Bug Fixes + * Run build_linux in docker using an older glibc ([\#599](https://github.com/vector-im/element-desktop/pull/599)). Fixes vector-im/element-web#24981. + * Use a newly generated access_token while joining Jitsi ([\#24646](https://github.com/vector-im/element-web/pull/24646)). Fixes vector-im/element-web#24687. Contributed by @emrahcom. + * Fix cloudflare action pointing at commit hash instead of tag ([\#24777](https://github.com/vector-im/element-web/pull/24777)). Contributed by @justjanne. + * Allow editing with RTE to overflow for autocomplete visibility ([\#10499](https://github.com/matrix-org/matrix-react-sdk/pull/10499)). Contributed by @alunturner. + * Added auto focus to Github URL on opening of debug logs modal ([\#10479](https://github.com/matrix-org/matrix-react-sdk/pull/10479)). Contributed by @ShivamSpm. + * Fix detection of encryption for all users in a room ([\#10487](https://github.com/matrix-org/matrix-react-sdk/pull/10487)). Fixes vector-im/element-web#24995. + * Properly generate mentions when editing a reply with MSC3952 ([\#10486](https://github.com/matrix-org/matrix-react-sdk/pull/10486)). Fixes vector-im/element-web#24924. Contributed by @kerryarchibald. + * Improve performance of rendering a room with many hidden events ([\#10131](https://github.com/matrix-org/matrix-react-sdk/pull/10131)). Contributed by @andybalaam. + * Prevent future date selection in jump to date ([\#10419](https://github.com/matrix-org/matrix-react-sdk/pull/10419)). Fixes vector-im/element-web#20800. Contributed by @MadLittleMods. + * Add aria labels to message search bar to improve accessibility ([\#10476](https://github.com/matrix-org/matrix-react-sdk/pull/10476)). Fixes vector-im/element-web#24921. + * Fix decryption failure bar covering the timeline ([\#10360](https://github.com/matrix-org/matrix-react-sdk/pull/10360)). Fixes vector-im/element-web#24780 vector-im/element-web#24074 and vector-im/element-web#24183. Contributed by @luixxiul. + * Improve profile picture settings accessibility ([\#10470](https://github.com/matrix-org/matrix-react-sdk/pull/10470)). Fixes vector-im/element-web#24919. + * Handle group call redaction ([\#10465](https://github.com/matrix-org/matrix-react-sdk/pull/10465)). + * Display relative timestamp for threads on the same calendar day ([\#10399](https://github.com/matrix-org/matrix-react-sdk/pull/10399)). Fixes vector-im/element-web#24841. Contributed by @kerryarchibald. + * Fix timeline list and paragraph display issues ([\#10424](https://github.com/matrix-org/matrix-react-sdk/pull/10424)). Fixes vector-im/element-web#24602. Contributed by @alunturner. + * Use unique keys for voice broadcast pips ([\#10457](https://github.com/matrix-org/matrix-react-sdk/pull/10457)). Fixes vector-im/element-web#24959. + * Fix "show read receipts sent by other users" not applying to threads ([\#10445](https://github.com/matrix-org/matrix-react-sdk/pull/10445)). Fixes vector-im/element-web#24910. + * Fix joining public rooms without aliases in search dialog ([\#10437](https://github.com/matrix-org/matrix-react-sdk/pull/10437)). Fixes vector-im/element-web#23937. + * Add input validation for `m.direct` in `DMRoomMap` ([\#10436](https://github.com/matrix-org/matrix-react-sdk/pull/10436)). Fixes vector-im/element-web#24909. + * Reduce height reserved for "collapse" button's line on IRC layout ([\#10211](https://github.com/matrix-org/matrix-react-sdk/pull/10211)). Fixes vector-im/element-web#24605. Contributed by @luixxiul. + * Fix `creatorUserId is required` error when opening sticker picker ([\#10423](https://github.com/matrix-org/matrix-react-sdk/pull/10423)). + * Fix block/inline Element descendants error noise in `NewRoomIntro.tsx` ([\#10412](https://github.com/matrix-org/matrix-react-sdk/pull/10412)). Contributed by @MadLittleMods. + * Fix profile resizer to make first character of a line selectable in IRC layout ([\#10396](https://github.com/matrix-org/matrix-react-sdk/pull/10396)). Fixes vector-im/element-web#14764. Contributed by @luixxiul. + * Ensure space between wrapped lines of room name on IRC layout ([\#10188](https://github.com/matrix-org/matrix-react-sdk/pull/10188)). Fixes vector-im/element-web#24742. Contributed by @luixxiul. + * Remove unreadable alt attribute from the room status bar warning icon (nonsense to screenreaders) ([\#10402](https://github.com/matrix-org/matrix-react-sdk/pull/10402)). Contributed by @MadLittleMods. + * Fix big date separators when jump to date is enabled ([\#10404](https://github.com/matrix-org/matrix-react-sdk/pull/10404)). Fixes vector-im/element-web#22969. Contributed by @MadLittleMods. + * Fixes user authentication when registering via the module API ([\#10257](https://github.com/matrix-org/matrix-react-sdk/pull/10257)). Contributed by @maheichyk. + * Handle more edge cases in Space Hierarchy ([\#10280](https://github.com/matrix-org/matrix-react-sdk/pull/10280)). Contributed by @justjanne. + * Further improve performance with lots of hidden events ([\#10353](https://github.com/matrix-org/matrix-react-sdk/pull/10353)). Fixes vector-im/element-web#24480. Contributed by @andybalaam. + * Respect user cancelling upload flow by dismissing spinner ([\#10373](https://github.com/matrix-org/matrix-react-sdk/pull/10373)). Fixes vector-im/element-web#24667. + * When starting a DM, the end-to-end encryption status icon does now only appear if the DM can be encrypted ([\#10394](https://github.com/matrix-org/matrix-react-sdk/pull/10394)). Fixes vector-im/element-web#24397. + * Fix `[object Object]` in feedback metadata ([\#10390](https://github.com/matrix-org/matrix-react-sdk/pull/10390)). + * Fix pinned messages card saying nothing pinned while loading ([\#10385](https://github.com/matrix-org/matrix-react-sdk/pull/10385)). Fixes vector-im/element-web#24615. + * Fix import e2e key dialog staying disabled after paste ([\#10375](https://github.com/matrix-org/matrix-react-sdk/pull/10375)). Fixes vector-im/element-web#24818. + * Show all labs even if incompatible, with appropriate tooltip explaining requirements ([\#10369](https://github.com/matrix-org/matrix-react-sdk/pull/10369)). Fixes vector-im/element-web#24813. + * Fix UIFeature.Registration not applying to all paths ([\#10371](https://github.com/matrix-org/matrix-react-sdk/pull/10371)). Fixes vector-im/element-web#24814. + * Clicking on a user pill does now only open the profile in the right panel and no longer navigates to the home view. ([\#10359](https://github.com/matrix-org/matrix-react-sdk/pull/10359)). Fixes vector-im/element-web#24797. + * Fix start DM with pending third party invite ([\#10347](https://github.com/matrix-org/matrix-react-sdk/pull/10347)). Fixes vector-im/element-web#24781. + * Fix long display name overflowing reply tile on IRC layout ([\#10343](https://github.com/matrix-org/matrix-react-sdk/pull/10343)). Fixes vector-im/element-web#24738. Contributed by @luixxiul. + * Display redacted body on ThreadView in the same way as normal messages ([\#9016](https://github.com/matrix-org/matrix-react-sdk/pull/9016)). Fixes vector-im/element-web#24729. Contributed by @luixxiul. + * Handle more edge cases in ACL updates ([\#10279](https://github.com/matrix-org/matrix-react-sdk/pull/10279)). Contributed by @justjanne. + * Allow parsing png files to fail if thumbnailing is successful ([\#10308](https://github.com/matrix-org/matrix-react-sdk/pull/10308)). + Changes in [1.11.28](https://github.com/vector-im/element-desktop/releases/tag/v1.11.28) (2023-03-31) ===================================================================================================== diff --git a/dockerbuild/Dockerfile b/dockerbuild/Dockerfile index 02a821c31..bc4875db1 100644 --- a/dockerbuild/Dockerfile +++ b/dockerbuild/Dockerfile @@ -1,8 +1,9 @@ +# Docker image to facilitate building Element Desktop with native bits using a glibc version with broader compatibility FROM buildpack-deps:bionic-curl ENV DEBIAN_FRONTEND noninteractive -RUN curl -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 -qq dist-upgrade && \ # add repo for git-lfs curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | bash && \ @@ -14,6 +15,8 @@ RUN apt-get -qq update && apt-get -qq dist-upgrade && \ apt-get -qq install --no-install-recommends qtbase5-dev bsdtar build-essential autoconf libssl-dev gcc-multilib g++-multilib lzip rpm python libcurl4 git git-lfs ssh unzip tcl \ libsecret-1-dev libgnome-keyring-dev \ libopenjp2-tools \ + # Used by github actions \ + jq grep \ # Used by seshat (when not SQLCIPHER_STATIC) \ libsqlcipher-dev && \ # git-lfs @@ -34,7 +37,7 @@ ENV FORCE_COLOR true ENV NODE_VERSION 16.18.1 # this package is used for snapcraft and we should not clear apt list - to avoid apt-get update during snap build -RUN curl -L https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.gz | tar xz -C /usr/local --strip-components=1 && \ +RUN curl --proto "=https" -L https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.gz | tar xz -C /usr/local --strip-components=1 && \ unlink /usr/local/CHANGELOG.md && unlink /usr/local/LICENSE && unlink /usr/local/README.md && \ # https://github.com/npm/npm/issues/4531 npm config set unsafe-perm true diff --git a/docs/updates.md b/docs/updates.md index 8c5a35f4e..29b05dc45 100644 --- a/docs/updates.md +++ b/docs/updates.md @@ -2,7 +2,7 @@ The Desktop app is capable of self-updating on macOS and Windows. The update server base url is configurable as `update_base_url` in config.json and can be served by a static file host, CDN or object storage. -Currently all packaging & deployment is handled by https://github.com/vector-im/element-builder/ +Currently all packaging & deployment is handled by [Github actions](https://github.com/vector-im/element-desktop/blob/develop/.github/workflows/build_and_deploy.yaml) # Windows diff --git a/docs/windows-requirements.md b/docs/windows-requirements.md index 35fc2ecb2..fc3bb13c8 100644 --- a/docs/windows-requirements.md +++ b/docs/windows-requirements.md @@ -1,11 +1,14 @@ # Windows + ## Requirements to build native modules +We rely on Github Actions `windows-latest` plus a few extra utilities as per [the workflow](https://github.com/vector-im/element-desktop/blob/develop/.github/workflows/build_windows.yaml). + If you want to build native modules, make sure that the following tools are installed on your system. - [Git for Windows](https://git-scm.com/download/win) -- [Node 14](https://nodejs.org) +- [Node 16](https://nodejs.org) - [Python 3](https://www.python.org/downloads/) (if you type 'python' into command prompt it will offer to install it from the windows store) - [Strawberry Perl](https://strawberryperl.com/) - [Rustup](https://rustup.rs/) diff --git a/element.io/release/conf_distributions b/element.io/release/conf_distributions deleted file mode 100644 index 37ee09fae..000000000 --- a/element.io/release/conf_distributions +++ /dev/null @@ -1,81 +0,0 @@ -Origin: riot.im -Codename: default -Architectures: amd64 i386 source -Components: main -SignWith: D7B0B66941D01538 -Tracking: minimal - -Origin: riot.im -Suite: oldoldstable -Codename: jessie -Architectures: amd64 i386 source -Components: main -SignWith: D7B0B66941D01538 -Tracking: minimal - -Origin: riot.im -Suite: oldstable -Codename: stretch -Architectures: amd64 i386 source -Components: main -SignWith: D7B0B66941D01538 -Tracking: minimal - -Origin: riot.im -Suite: stable -Codename: buster -Architectures: amd64 i386 source -Components: main -SignWith: D7B0B66941D01538 -Tracking: minimal - -Origin: riot.im -Suite: testing -Codename: bullseye -Architectures: amd64 i386 source -Components: main -SignWith: D7B0B66941D01538 -Tracking: minimal - -Origin: riot.im -Suite: unstable -Codename: sid -Architectures: amd64 i386 source -Components: main -SignWith: D7B0B66941D01538 -Tracking: minimal - -Origin: riot.im -Codename: xenial -Architectures: amd64 i386 source -Components: main -SignWith: D7B0B66941D01538 -Tracking: minimal - -Origin: riot.im -Codename: bionic -Architectures: amd64 i386 source -Components: main -SignWith: D7B0B66941D01538 -Tracking: minimal - -Origin: riot.im -Codename: cosmic -Architectures: amd64 i386 source -Components: main -SignWith: D7B0B66941D01538 -Tracking: minimal - -Origin: riot.im -Codename: disco -Architectures: amd64 i386 source -Components: main -SignWith: D7B0B66941D01538 -Tracking: minimal - -Origin: riot.im -Codename: eoan -Architectures: amd64 i386 source -Components: main -SignWith: D7B0B66941D01538 -Tracking: minimal diff --git a/packages.element.io/debian/riot-im-archive-keyring.asc.bak b/packages.element.io/debian/riot-im-archive-keyring.asc.bak deleted file mode 100644 index c694ccb51..000000000 --- a/packages.element.io/debian/riot-im-archive-keyring.asc.bak +++ /dev/null @@ -1,65 +0,0 @@ ------BEGIN PGP PUBLIC KEY BLOCK----- - -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 -l91/+ZrRJQ== -=kDqh ------END PGP PUBLIC KEY BLOCK----- diff --git a/packages.element.io/debian/riot-im-archive-keyring.gpg.bak b/packages.element.io/debian/riot-im-archive-keyring.gpg.bak deleted file mode 100644 index 888764a5d..000000000 Binary files a/packages.element.io/debian/riot-im-archive-keyring.gpg.bak and /dev/null differ diff --git a/scripts/electron_afterSign.js b/scripts/electron_afterSign.js deleted file mode 100644 index f5ba340a8..000000000 --- a/scripts/electron_afterSign.js +++ /dev/null @@ -1,40 +0,0 @@ -const { notarize } = require("@electron/notarize"); - -let warned = false; -exports.default = async function (context) { - const { electronPlatformName, appOutDir } = context; - const appId = context.packager.info.appInfo.id; - - if (electronPlatformName === "darwin") { - const appName = context.packager.appInfo.productFilename; - - const notarizeToolCredentials = {}; - if (process.env.NOTARIZE_KEYCHAIN_PROFILE) { - notarizeToolCredentials.keychainProfile = process.env.NOTARIZE_KEYCHAIN_PROFILE; - notarizeToolCredentials.keychain = process.env.NOTARIZE_KEYCHAIN; - } else if (process.env.NOTARIZE_APPLE_ID && process.env.NOTARIZE_APPLE_ID_PASSWORD && process.env.NOTARIZE_TEAM_ID) { - notarizeToolCredentials.appleId = process.env.NOTARIZE_APPLE_ID; - notarizeToolCredentials.appleIdPassword = process.env.NOTARIZE_APPLE_ID_PASSWORD; - notarizeToolCredentials.teamId = process.env.NOTARIZE_TEAM_ID; - } else { - if (!warned) { - console.log("*****************************************"); - console.log("* This build will NOT be notarised. *"); - console.log("* Provide NOTARIZE_KEYCHAIN_PROFILE or *"); - console.log("* NOTARIZE_APPLE_ID, NOTARIZE_TEAM_ID *"); - console.log("* and NOTARIZE_APPLE_ID_PASSWORD *"); - console.log("*****************************************"); - warned = true; - } - return; - } - - console.log("Notarising macOS app. This may be some time."); - return await notarize({ - tool: "notarytool", - appBundleId: appId, - appPath: `${appOutDir}/${appName}.app`, - ...notarizeToolCredentials, - }); - } -}; diff --git a/scripts/electron_winSign.js b/scripts/electron_winSign.js deleted file mode 100644 index abacd95be..000000000 --- a/scripts/electron_winSign.js +++ /dev/null @@ -1,78 +0,0 @@ -const { execFile } = require("child_process"); - -// Loosely based on computeSignToolArgs from app-builder-lib/src/codeSign/windowsCodeSign.ts -function computeSignToolArgs(options, keyContainer) { - const args = []; - - if (process.env.ELECTRON_BUILDER_OFFLINE !== "true") { - const timestampingServiceUrl = options.options.timeStampServer || "http://timestamp.digicert.com"; - args.push( - options.isNest || options.hash === "sha256" ? "/tr" : "/t", - options.isNest || options.hash === "sha256" - ? options.options.rfc3161TimeStampServer || "http://timestamp.comodoca.com/rfc3161" - : timestampingServiceUrl, - ); - } - - args.push("/kc", keyContainer); - // To use the hardware token (this should probably be less hardcoded) - args.push("/csp", "eToken Base Cryptographic Provider"); - // The certificate file. Somehow this appears to be the only way to specify - // the cert that works. If you specify the subject name or hash, it will - // say it can't associate the private key to the certificate. - // TODO: Find a way to pass this through from the electron-builder config - // so we don't have to hard-code this here - // fwiw https://stackoverflow.com/questions/17927895/automate-extended-validation-ev-code-signing - // is about the most useful resource on automating code signing... - args.push("/f", "element.io\\New_Vector_Ltd.pem"); - - if (options.hash !== "sha1") { - args.push("/fd", options.hash); - if (process.env.ELECTRON_BUILDER_OFFLINE !== "true") { - args.push("/td", "sha256"); - } - } - - // msi does not support dual-signing - if (options.isNest) { - args.push("/as"); - } - - // https://github.com/electron-userland/electron-builder/issues/2875#issuecomment-387233610 - args.push("/debug"); - // must be last argument - args.push(options.path); - - return args; -} - -let warned = false; -exports.default = async function (options) { - const keyContainer = process.env.SIGNING_KEY_CONTAINER; - if (keyContainer === undefined) { - if (!warned) { - console.warn( - "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!\n" + - "! Skipping Windows signing. !\n" + - "! SIGNING_KEY_CONTAINER not defined. !\n" + - "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!", - ); - warned = true; - } - return; - } - - return new Promise((resolve, reject) => { - const args = ["sign"].concat(computeSignToolArgs(options, keyContainer)); - - execFile("signtool", args, {}, (error, stdout) => { - if (error) { - console.error("signtool failed with code " + error); - reject("signtool failed with code " + error); - console.log(stdout); - } else { - resolve(); - } - }); - }); -}; diff --git a/scripts/generate-builder-config.ts b/scripts/generate-builder-config.ts index 1ba707b92..7168fa7cf 100755 --- a/scripts/generate-builder-config.ts +++ b/scripts/generate-builder-config.ts @@ -8,7 +8,7 @@ * Prefixes the nightly version with `0.0.1-nightly.` as it breaks if it is not semver * * On macOS: - * Passes --notarytool-team-id to build.mac.notarize.notarize if specified and removes build.mac.afterSign + * Passes --notarytool-team-id to build.mac.notarize.notarize if specified * * On Linux: * Replaces spaces in the product name with dashes as spaces in paths can cause issues @@ -87,14 +87,12 @@ async function main(): Promise { } if (argv["signtool-thumbprint"] && argv["signtool-subject-name"]) { - delete cfg.win!.sign; cfg.win!.signingHashAlgorithms = ["sha256"]; cfg.win!.certificateSubjectName = argv["signtool-subject-name"]; cfg.win!.certificateSha1 = argv["signtool-thumbprint"]; } if (argv["notarytool-team-id"]) { - delete cfg.afterSign; cfg.mac!.notarize = { teamId: argv["notarytool-team-id"], }; diff --git a/src/electron-main.ts b/src/electron-main.ts index 455f0c104..dd0c475e8 100644 --- a/src/electron-main.ts +++ b/src/electron-main.ts @@ -19,7 +19,8 @@ limitations under the License. // Squirrel on windows starts the app with various flags as hooks to tell us when we've been installed/uninstalled etc. import "./squirrelhooks"; -import { app, BrowserWindow, Menu, autoUpdater, protocol, dialog, nativeTheme } from "electron"; +import { app, BrowserWindow, Menu, autoUpdater, protocol, dialog, nativeTheme, Input } from "electron"; +import * as Sentry from "@sentry/electron/main"; import AutoLaunch from "auto-launch"; import path from "path"; import windowStateKeeper from "electron-window-state"; @@ -38,18 +39,11 @@ import webContentsHandler from "./webcontents-handler"; import * as updater from "./updater"; import { getProfileFromDeeplink, protocolInit } from "./protocol"; import { _t, AppLocalization } from "./language-helper"; -import Input = Electron.Input; const argv = minimist(process.argv, { alias: { help: "h" }, }); -// Things we need throughout the file but need to be created -// async to are initialised in setupGlobals() -let asarPath: string; -let resPath: string; -let iconPath: string; - if (argv["help"]) { console.log("Options:"); console.log(" --profile-dir {path}: Path to where to store the profile."); @@ -119,28 +113,32 @@ async function tryPaths(name: string, root: string, rawPaths: string[]): Promise const homeserverProps = ["default_is_url", "default_hs_url", "default_server_name", "default_server_config"] as const; -// Find the webapp resources and set up things that require them -async function setupGlobals(): Promise { - // find the webapp asar. - asarPath = await tryPaths("webapp", __dirname, [ - // If run from the source checkout, this will be in the directory above - "../webapp.asar", - // but if run from a packaged application, electron-main.js will be in - // a different asar file so it will be two levels above - "../../webapp.asar", - // also try without the 'asar' suffix to allow symlinking in a directory - "../webapp", - // from a packaged application - "../../webapp", - ]); +let asarPathPromise: Promise | undefined; +// Get the webapp resource file path, memoizes result +function getAsarPath(): Promise { + if (!asarPathPromise) { + asarPathPromise = tryPaths("webapp", __dirname, [ + // If run from the source checkout, this will be in the directory above + "../webapp.asar", + // but if run from a packaged application, electron-main.js will be in + // a different asar file, so it will be two levels above + "../../webapp.asar", + // also try without the 'asar' suffix to allow symlinking in a directory + "../webapp", + // from a packaged application + "../../webapp", + ]); + } - // we assume the resources path is in the same place as the asar - resPath = await tryPaths("res", path.dirname(asarPath), [ - // If run from the source checkout - "res", - // if run from packaged application - "", - ]); + return asarPathPromise; +} + +// Loads the config from asar, and applies a config.json from userData atop if one exists +// Writes config to `global.vectorConfig`. Does nothing if `global.vectorConfig` is already set. +async function loadConfig(): Promise { + if (global.vectorConfig) return; + + const asarPath = await getAsarPath(); try { // eslint-disable-next-line @typescript-eslint/no-var-requires @@ -168,7 +166,7 @@ async function setupGlobals(): Promise { .reduce((obj, key) => { obj[key] = global.vectorConfig[key]; return obj; - }, {} as Omit, keyof typeof homeserverProps>); + }, {} as Omit, keyof typeof homeserverProps>); } global.vectorConfig = Object.assign(global.vectorConfig, localConfig); @@ -186,13 +184,41 @@ async function setupGlobals(): Promise { // Could not load local config, this is expected in most cases. } +} + +// Configure Electron Sentry and crashReporter using sentry.dsn in config.json if one is present. +async function configureSentry(): Promise { + await loadConfig(); + const { dsn, environment } = global.vectorConfig.sentry || {}; + if (dsn) { + console.log(`Enabling Sentry with dsn=${dsn} environment=${environment}`); + Sentry.init({ + dsn, + environment, + // We don't actually use this IPC, but we do not want Sentry injecting preloads + ipcMode: Sentry.IPCMode.Classic, + }); + } +} + +// Set up globals for Tray and AutoLaunch +async function setupGlobals(): Promise { + const asarPath = await getAsarPath(); + await loadConfig(); + + // we assume the resources path is in the same place as the asar + const resPath = await tryPaths("res", path.dirname(asarPath), [ + // If run from the source checkout + "res", + // if run from packaged application + "", + ]); // The tray icon // It's important to call `path.join` so we don't end up with the packaged asar in the final path. const iconFile = `element.${process.platform === "win32" ? "ico" : "png"}`; - iconPath = path.join(resPath, "img", iconFile); global.trayConfig = { - icon_path: iconPath, + icon_path: path.join(resPath, "img", iconFile), brand: global.vectorConfig.brand || "SchildiChat", }; @@ -206,9 +232,9 @@ async function setupGlobals(): Promise { }); } +// Look for an auto-launcher under 'Riot' and if we find one, +// port its enabled/disabled-ness over to the new 'Element' launcher // async function moveAutoLauncher(): Promise { -// // Look for an auto-launcher under 'Riot' and if we find one, port it's -// // enabled/disabled-ness over to the new 'Element' launcher // if (!global.vectorConfig.brand || global.vectorConfig.brand === "Element") { // const oldLauncher = new AutoLaunch({ // name: "Riot", @@ -261,6 +287,8 @@ const warnBeforeExit = (event: Event, input: Input): void => { } }; +configureSentry(); + // handle uncaught errors otherwise it displays // stack traces in popup dialogs, which is terrible (which // it will do any time the auto update poke fails, and there's @@ -325,7 +353,10 @@ if (global.store.get("disableHardwareAcceleration", false) === true) { } app.on("ready", async () => { + let asarPath: string; + try { + asarPath = await getAsarPath(); await setupGlobals(); // await moveAutoLauncher(); } catch (e) { @@ -433,7 +464,7 @@ app.on("ready", async () => { // https://www.electronjs.org/docs/faq#the-font-looks-blurry-what-is-this-and-what-can-i-do backgroundColor: "#fff", - icon: iconPath, + icon: global.trayConfig.icon_path, show: false, autoHideMenuBar: global.store.get("autoHideMenuBar", true), diff --git a/src/ipc.ts b/src/ipc.ts index 6eaf83dc2..a8d6f2847 100644 --- a/src/ipc.ts +++ b/src/ipc.ts @@ -14,7 +14,8 @@ See the License for the specific language governing permissions and limitations under the License. */ -import { app, autoUpdater, desktopCapturer, ipcMain, powerSaveBlocker } from "electron"; +import { app, autoUpdater, desktopCapturer, ipcMain, powerSaveBlocker, TouchBar, nativeImage } from "electron"; +import { relaunchApp } from "electron-clear-data"; import IpcMainEvent = Electron.IpcMainEvent; import { recordSSOSession } from "./protocol"; @@ -186,6 +187,63 @@ ipcMain.on("ipcCall", async function (_ev: IpcMainEvent, payload) { })); break; + case "clearStorage": + global.store.clear(); + global.mainWindow.webContents.session.flushStorageData(); + await global.mainWindow.webContents.session.clearStorageData(); + relaunchApp(); + break; + + case "breadcrumbs": { + if (process.platform === "darwin") { + const { TouchBarPopover, TouchBarButton } = TouchBar; + + const recentsBar = new TouchBar({ + items: args[0].map((r: { roomId: string; avatarUrl: string | null; initial: string }) => { + const defaultColors = ["#0DBD8B", "#368bd6", "#ac3ba8"]; + let total = 0; + for (let i = 0; i < r.roomId.length; ++i) { + total += r.roomId.charCodeAt(i); + } + + const button = new TouchBarButton({ + label: r.initial, + backgroundColor: defaultColors[total % defaultColors.length], + click: (): void => { + global.mainWindow?.loadURL(`vector://vector/webapp/#/room/${r.roomId}`); + }, + }); + if (r.avatarUrl) { + fetch(r.avatarUrl) + .then((resp) => { + if (!resp.ok) return; + return resp.arrayBuffer(); + }) + .then((arrayBuffer) => { + const buffer = Buffer.from(arrayBuffer!); + button.icon = nativeImage.createFromBuffer(buffer); + button.label = ""; + button.backgroundColor = ""; + }); + } + return button; + }), + }); + + const touchBar = new TouchBar({ + items: [ + new TouchBarPopover({ + label: "Recents", + showCloseButton: true, + items: recentsBar, + }), + ], + }); + global.mainWindow.setTouchBar(touchBar); + } + break; + } + default: global.mainWindow.webContents.send("ipcReply", { id: payload.id, diff --git a/test/launch-test.ts b/test/launch-test.ts index dcaf2e454..173413099 100644 --- a/test/launch-test.ts +++ b/test/launch-test.ts @@ -23,7 +23,7 @@ import { ElectronApplication, Page } from "playwright-core"; describe("App launch", () => { const artifactsPath = path.join(process.cwd(), "test_artifacts"); - fs.mkdirSync(artifactsPath); + if (!fs.existsSync(artifactsPath)) fs.mkdirSync(artifactsPath); const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "element-desktop-tests")); console.log("Using temp profile directory: ", tmpDir); diff --git a/yarn.lock b/yarn.lock index fd9cfd711..11e072733 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2131,16 +2131,16 @@ eslint-visitor-keys "^3.3.0" "@eslint-community/eslint-utils@^4.2.0": - version "4.2.0" - resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.2.0.tgz#a831e6e468b4b2b5ae42bf658bea015bf10bc518" - integrity sha512-gB8T4H4DEfX2IV9zGDJPOBgP1e/DbfCPDTtEqUMckpvzS1OYtva8JdFYBqMwYk7xAQ429WGF/UPqn8uQ//h2vQ== + version "4.4.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== dependencies: eslint-visitor-keys "^3.3.0" "@eslint-community/regexpp@^4.4.0": - version "4.4.0" - resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.4.0.tgz#3e61c564fcd6b921cb789838631c5ee44df09403" - integrity sha512-A9983Q0LnDGdLPjxyXQ00sbV+K+O+ko2Dr+CZigbHWtX9pNfxlaBkMR8X1CztI73zuEyEBXTVjx7CE+/VSwDiQ== + version "4.5.0" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.5.0.tgz#f6f729b02feee2c749f57e334b7a1b5f40a81724" + integrity sha512-vITaYzIcNmjn5tF5uxcZ/ft7/RXGrMUIS9HalWckEOF6ESiwXKoMzAQf2UW0aVd6rnOeExTJVd5hmWXucBKGXQ== "@eslint/eslintrc@^2.0.1": version "2.0.1" @@ -2962,10 +2962,10 @@ "@types/node" "*" form-data "^3.0.0" -"@types/node@*", "@types/node@16.18.12", "@types/node@^16.11.26", "@types/node@^17.0.36": - version "16.18.12" - resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.12.tgz#e3bfea80e31523fde4292a6118f19ffa24fd6f65" - integrity sha512-vzLe5NaNMjIE3mcddFVGlAXN1LEWueUsMsOJWaT6wWMJGyljHAWHznqfnKUQWGzu7TLPrGvWdNAsvQYW+C0xtw== +"@types/node@*", "@types/node@16.18.21", "@types/node@^16.11.26", "@types/node@^17.0.36": + version "16.18.21" + resolved "https://registry.yarnpkg.com/@types/node/-/node-16.18.21.tgz#061e3b51668f74bf3aaa44450dcf0acd625841f7" + integrity sha512-TassPGd0AEZWA10qcNnXnSNwHlLfSth8XwUaWc3gTSDmBz/rKb613Qw5qRf6o2fdRBrLbsgeC9PMZshobkuUqg== "@types/normalize-package-data@^2.4.0": version "2.4.1" @@ -3081,87 +3081,87 @@ "@types/node" "*" "@typescript-eslint/eslint-plugin@^5.42.0": - version "5.52.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.52.0.tgz#5fb0d43574c2411f16ea80f5fc335b8eaa7b28a8" - integrity sha512-lHazYdvYVsBokwCdKOppvYJKaJ4S41CgKBcPvyd0xjZNbvQdhn/pnJlGtQksQ/NhInzdaeaSarlBjDXHuclEbg== + version "5.57.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.57.0.tgz#52c8a7a4512f10e7249ca1e2e61f81c62c34365c" + integrity sha512-itag0qpN6q2UMM6Xgk6xoHa0D0/P+M17THnr4SVgqn9Rgam5k/He33MA7/D7QoJcdMxHFyX7U9imaBonAX/6qA== dependencies: - "@typescript-eslint/scope-manager" "5.52.0" - "@typescript-eslint/type-utils" "5.52.0" - "@typescript-eslint/utils" "5.52.0" + "@eslint-community/regexpp" "^4.4.0" + "@typescript-eslint/scope-manager" "5.57.0" + "@typescript-eslint/type-utils" "5.57.0" + "@typescript-eslint/utils" "5.57.0" debug "^4.3.4" grapheme-splitter "^1.0.4" ignore "^5.2.0" natural-compare-lite "^1.4.0" - regexpp "^3.2.0" semver "^7.3.7" tsutils "^3.21.0" "@typescript-eslint/parser@^5.42.0": - version "5.52.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.52.0.tgz#73c136df6c0133f1d7870de7131ccf356f5be5a4" - integrity sha512-e2KiLQOZRo4Y0D/b+3y08i3jsekoSkOYStROYmPUnGMEoA0h+k2qOH5H6tcjIc68WDvGwH+PaOrP1XRzLJ6QlA== + version "5.57.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.57.0.tgz#f675bf2cd1a838949fd0de5683834417b757e4fa" + integrity sha512-orrduvpWYkgLCyAdNtR1QIWovcNZlEm6yL8nwH/eTxWLd8gsP+25pdLHYzL2QdkqrieaDwLpytHqycncv0woUQ== dependencies: - "@typescript-eslint/scope-manager" "5.52.0" - "@typescript-eslint/types" "5.52.0" - "@typescript-eslint/typescript-estree" "5.52.0" + "@typescript-eslint/scope-manager" "5.57.0" + "@typescript-eslint/types" "5.57.0" + "@typescript-eslint/typescript-estree" "5.57.0" debug "^4.3.4" -"@typescript-eslint/scope-manager@5.52.0": - version "5.52.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.52.0.tgz#a993d89a0556ea16811db48eabd7c5b72dcb83d1" - integrity sha512-AR7sxxfBKiNV0FWBSARxM8DmNxrwgnYMPwmpkC1Pl1n+eT8/I2NAUPuwDy/FmDcC6F8pBfmOcaxcxRHspgOBMw== +"@typescript-eslint/scope-manager@5.57.0": + version "5.57.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.57.0.tgz#79ccd3fa7bde0758059172d44239e871e087ea36" + integrity sha512-NANBNOQvllPlizl9LatX8+MHi7bx7WGIWYjPHDmQe5Si/0YEYfxSljJpoTyTWFTgRy3X8gLYSE4xQ2U+aCozSw== dependencies: - "@typescript-eslint/types" "5.52.0" - "@typescript-eslint/visitor-keys" "5.52.0" + "@typescript-eslint/types" "5.57.0" + "@typescript-eslint/visitor-keys" "5.57.0" -"@typescript-eslint/type-utils@5.52.0": - version "5.52.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.52.0.tgz#9fd28cd02e6f21f5109e35496df41893f33167aa" - integrity sha512-tEKuUHfDOv852QGlpPtB3lHOoig5pyFQN/cUiZtpw99D93nEBjexRLre5sQZlkMoHry/lZr8qDAt2oAHLKA6Jw== +"@typescript-eslint/type-utils@5.57.0": + version "5.57.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.57.0.tgz#98e7531c4e927855d45bd362de922a619b4319f2" + integrity sha512-kxXoq9zOTbvqzLbdNKy1yFrxLC6GDJFE2Yuo3KqSwTmDOFjUGeWSakgoXT864WcK5/NAJkkONCiKb1ddsqhLXQ== dependencies: - "@typescript-eslint/typescript-estree" "5.52.0" - "@typescript-eslint/utils" "5.52.0" + "@typescript-eslint/typescript-estree" "5.57.0" + "@typescript-eslint/utils" "5.57.0" debug "^4.3.4" tsutils "^3.21.0" -"@typescript-eslint/types@5.52.0": - version "5.52.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.52.0.tgz#19e9abc6afb5bd37a1a9bea877a1a836c0b3241b" - integrity sha512-oV7XU4CHYfBhk78fS7tkum+/Dpgsfi91IIDy7fjCyq2k6KB63M6gMC0YIvy+iABzmXThCRI6xpCEyVObBdWSDQ== +"@typescript-eslint/types@5.57.0": + version "5.57.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.57.0.tgz#727bfa2b64c73a4376264379cf1f447998eaa132" + integrity sha512-mxsod+aZRSyLT+jiqHw1KK6xrANm19/+VFALVFP5qa/aiJnlP38qpyaTd0fEKhWvQk6YeNZ5LGwI1pDpBRBhtQ== -"@typescript-eslint/typescript-estree@5.52.0": - version "5.52.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.52.0.tgz#6408cb3c2ccc01c03c278cb201cf07e73347dfca" - integrity sha512-WeWnjanyEwt6+fVrSR0MYgEpUAuROxuAH516WPjUblIrClzYJj0kBbjdnbQXLpgAN8qbEuGywiQsXUVDiAoEuQ== +"@typescript-eslint/typescript-estree@5.57.0": + version "5.57.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.57.0.tgz#ebcd0ee3e1d6230e888d88cddf654252d41e2e40" + integrity sha512-LTzQ23TV82KpO8HPnWuxM2V7ieXW8O142I7hQTxWIHDcCEIjtkat6H96PFkYBQqGFLW/G/eVVOB9Z8rcvdY/Vw== dependencies: - "@typescript-eslint/types" "5.52.0" - "@typescript-eslint/visitor-keys" "5.52.0" + "@typescript-eslint/types" "5.57.0" + "@typescript-eslint/visitor-keys" "5.57.0" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/utils@5.52.0": - version "5.52.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.52.0.tgz#b260bb5a8f6b00a0ed51db66bdba4ed5e4845a72" - integrity sha512-As3lChhrbwWQLNk2HC8Ree96hldKIqk98EYvypd3It8Q1f8d5zWyIoaZEp2va5667M4ZyE7X8UUR+azXrFl+NA== +"@typescript-eslint/utils@5.57.0": + version "5.57.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.57.0.tgz#eab8f6563a2ac31f60f3e7024b91bf75f43ecef6" + integrity sha512-ps/4WohXV7C+LTSgAL5CApxvxbMkl9B9AUZRtnEFonpIxZDIT7wC1xfvuJONMidrkB9scs4zhtRyIwHh4+18kw== dependencies: + "@eslint-community/eslint-utils" "^4.2.0" "@types/json-schema" "^7.0.9" "@types/semver" "^7.3.12" - "@typescript-eslint/scope-manager" "5.52.0" - "@typescript-eslint/types" "5.52.0" - "@typescript-eslint/typescript-estree" "5.52.0" + "@typescript-eslint/scope-manager" "5.57.0" + "@typescript-eslint/types" "5.57.0" + "@typescript-eslint/typescript-estree" "5.57.0" eslint-scope "^5.1.1" - eslint-utils "^3.0.0" semver "^7.3.7" -"@typescript-eslint/visitor-keys@5.52.0": - version "5.52.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.52.0.tgz#e38c971259f44f80cfe49d97dbffa38e3e75030f" - integrity sha512-qMwpw6SU5VHCPr99y274xhbm+PRViK/NATY6qzt+Et7+mThGuFSl/ompj2/hrBlRP/kq+BFdgagnOSgw9TB0eA== +"@typescript-eslint/visitor-keys@5.57.0": + version "5.57.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.57.0.tgz#e2b2f4174aff1d15eef887ce3d019ecc2d7a8ac1" + integrity sha512-ery2g3k0hv5BLiKpPuwYt9KBkAp2ugT6VvyShXdLOkax895EC55sP0Tx5L0fZaQueiK3fBLvHVvEl3jFS5ia+g== dependencies: - "@typescript-eslint/types" "5.52.0" + "@typescript-eslint/types" "5.57.0" eslint-visitor-keys "^3.3.0" abbrev@1, abbrev@^1.0.0: @@ -4750,22 +4750,10 @@ eslint-scope@^7.1.1: esrecurse "^4.3.0" estraverse "^5.2.0" -eslint-utils@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" - integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== - dependencies: - eslint-visitor-keys "^2.0.0" - -eslint-visitor-keys@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" - integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== - eslint-visitor-keys@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" - integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== + version "3.4.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz#c7f0f956124ce677047ddbc192a68f999454dedc" + integrity sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ== eslint@^8.26.0: version "8.36.0" @@ -7665,11 +7653,6 @@ regexp.prototype.flags@^1.4.3: define-properties "^1.1.3" functions-have-names "^1.2.2" -regexpp@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" - integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== - regexpu-core@^5.2.1: version "5.3.0" resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.0.tgz#4d0d044b76fedbad6238703ae84bfdedee2cf074"