Skip to content

chore: added release notes for 2.7.2#7604

Merged
SamTV12345 merged 2 commits intodevelopfrom
feat/add-changelog-v272
Apr 26, 2026
Merged

chore: added release notes for 2.7.2#7604
SamTV12345 merged 2 commits intodevelopfrom
feat/add-changelog-v272

Conversation

@SamTV12345
Copy link
Copy Markdown
Member

No description provided.

@qodo-free-for-open-source-projects
Copy link
Copy Markdown

Review Summary by Qodo

Migrate CI/CD workflows from gnpm to pnpm and update to v10.33.2

✨ Enhancement 📦 Other

Grey Divider

Walkthroughs

Description
• Replaced deprecated gnpm package manager with native pnpm across all CI/CD workflows
• Simplified Node.js version matrix from semantic ranges to major version numbers (20, 22, 24)
• Restructured caching strategy to separately cache pnpm store and node_modules directories
• Updated pnpm version to 10.33.2 and replaced custom gnpm setup action with official pnpm action
• Added release notes for version 2.7.2 with accessibility and feature improvements
Diagram
flowchart LR
  gnpm["gnpm package manager<br/>v0.0.12"]
  pnpm["pnpm package manager<br/>v10.33.2"]
  oldCache["Single gnpm cache<br/>with multiple paths"]
  newCache["Separate pnpm store<br/>and node_modules caches"]
  nodeVersions["Node version ranges<br/>>=20.0.0, >=22.0.0, etc"]
  nodeVersionsNew["Node major versions<br/>20, 22, 24"]
  
  gnpm -->|"Replace with"| pnpm
  oldCache -->|"Restructure to"| newCache
  nodeVersions -->|"Simplify to"| nodeVersionsNew
Loading

Grey Divider

File Changes

1. .github/workflows/backend-tests.yml ⚙️ Configuration changes +124/-66

Migrate to pnpm and restructure caching

.github/workflows/backend-tests.yml


2. .github/workflows/build-and-deploy-docs.yml ⚙️ Configuration changes +29/-13

Update pnpm setup and caching strategy

.github/workflows/build-and-deploy-docs.yml


3. .github/workflows/docker.yml ⚙️ Configuration changes +21/-12

Replace gnpm with pnpm in Docker workflow

.github/workflows/docker.yml


View more (11)
4. .github/workflows/frontend-admin-tests.yml ⚙️ Configuration changes +29/-15

Migrate to pnpm with improved caching

.github/workflows/frontend-admin-tests.yml


5. .github/workflows/frontend-tests.yml ⚙️ Configuration changes +62/-32

Update to pnpm and separate cache layers

.github/workflows/frontend-tests.yml


6. .github/workflows/handleRelease.yml ⚙️ Configuration changes +27/-16

Migrate release workflow to pnpm

.github/workflows/handleRelease.yml


7. .github/workflows/load-test.yml ⚙️ Configuration changes +67/-55

Replace gnpm with pnpm in load tests

.github/workflows/load-test.yml


8. .github/workflows/perform-type-check.yml ⚙️ Configuration changes +23/-16

Update type check workflow to pnpm

.github/workflows/perform-type-check.yml


9. .github/workflows/rate-limit.yml ⚙️ Configuration changes +21/-13

Migrate rate limit tests to pnpm

.github/workflows/rate-limit.yml


10. .github/workflows/release.yml ⚙️ Configuration changes +25/-16

Update release workflow with pnpm setup

.github/workflows/release.yml


11. .github/workflows/releaseEtherpad.yml ⚙️ Configuration changes +23/-18

Replace gnpm with pnpm in npm release

.github/workflows/releaseEtherpad.yml


12. .github/workflows/update-plugins.yml ⚙️ Configuration changes +1/-1

Update pnpm version to 10.33.2

.github/workflows/update-plugins.yml


13. .github/workflows/upgrade-from-latest-release.yml ⚙️ Configuration changes +32/-19

Migrate upgrade workflow to pnpm

.github/workflows/upgrade-from-latest-release.yml


14. CHANGELOG.md 📝 Documentation +12/-0

Add release notes for version 2.7.2

CHANGELOG.md


Grey Divider

Qodo Logo

@qodo-free-for-open-source-projects
Copy link
Copy Markdown

qodo-free-for-open-source-projects Bot commented Apr 26, 2026

Code Review by Qodo

🐞 Bugs (2) 📘 Rule violations (0)

Grey Divider


Action required

1. Plugin cache key mismatch 🐞 Bug ☼ Reliability
Description
Workflows install plugins via pnpm add -w (changing the runtime dependency set) but the
restored/saved node_modules cache key is still derived only from the pre-step pnpm-lock.yaml
hash, so with-plugins jobs can save a cache that later restores into jobs that were intended to run
without plugins. Etherpad enumerates installed plugins on startup (and will migrate plugins found in
node_modules), so restoring a cache with unexpected plugin packages can change test behavior and
cause flakiness.
Code

.github/workflows/backend-tests.yml[R149-153]

        name: Install Etherpad plugins
        run: >
-          gnpm install --workspace-root
+          pnpm add -w
          ep_align
          ep_author_hover
Evidence
backend-tests.yml caches node_modules under a key based on hashFiles('**/pnpm-lock.yaml'),
then later installs plugins using pnpm add -w without the cache key reflecting the plugin set.
Etherpad startup explicitly migrates plugins from node_modules (if needed) and logs the installed
plugin list, meaning leftover plugin packages in node_modules can affect what gets loaded during
tests. The repo already provides an install-plugins script that installs plugins without modifying
the workspace dependency graph via pnpm add, which avoids this cache/key inconsistency.

.github/workflows/backend-tests.yml[43-55]
.github/workflows/backend-tests.yml[149-163]
src/static/js/pluginfw/installer.ts[56-90]
src/node/server.ts[173-180]
package.json[15-34]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### Issue description
CI caches `node_modules` using a key that does not encode the plugin set, but plugin jobs change dependencies at runtime via `pnpm add -w`. This can cause caches produced by with-plugins jobs to be restored in jobs intended to run without plugins, changing which plugins Etherpad loads during tests.

### Issue Context
Etherpad migrates plugins from `node_modules` and logs installed plugins at startup, so unexpected plugin packages present in `node_modules` can affect test execution.

### Fix Focus Areas
- Replace `pnpm add -w ...` with the repo-supported plugin installer (does not mutate workspace deps/lockfile in the same way):
 - .github/workflows/backend-tests.yml[149-163]
 - .github/workflows/load-test.yml[104-118]
 - .github/workflows/frontend-admin-tests.yml[85-105] (if plugins are added similarly elsewhere)
- And/or ensure caches cannot be shared between with-plugins and without-plugins jobs by making cache keys job-variant-specific:
 - .github/workflows/backend-tests.yml[43-56]
 - .github/workflows/backend-tests.yml[113-126]

(Option examples: use `pnpm run install-plugins <list>`; or add a `-withplugins` suffix to cache keys for plugin jobs; or drop `node_modules` caching and rely on pnpm store caching.)

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools



Remediation recommended

2. Changelog version mismatch 🐞 Bug ⚙ Maintainability
Description
CHANGELOG.md now starts with a 2.7.2 section even though the repo/package version is still 2.7.1,
which is inconsistent with the PR’s stated intent and can confuse the release process about what
version these notes belong to.
Code

CHANGELOG.md[R1-3]

+# 2.7.2
+
+### Notable enhancements and fixes
Evidence
The changelog prepends a new top-level header for 2.7.2, while package.json still declares version
2.7.1. This is a concrete mismatch between the documented release notes and the software version in
the repo.

CHANGELOG.md[1-13]
package.json[44-53]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### Issue description
CHANGELOG.md documents 2.7.2 at the top, but the repo still reports version 2.7.1. This mismatch can cause confusion and mistakes during release preparation.

### Issue Context
Release tooling and humans often expect CHANGELOG headers and `package.json` versions to align.

### Fix Focus Areas
- Decide whether this PR is for 2.7.1 or 2.7.2 and align accordingly:
 - CHANGELOG.md[1-13]
 - package.json[44-53]

(If the notes are meant for 2.7.1, rename the header to 2.7.1 or move content under the existing 2.7.1 section; if they are meant for 2.7.2, bump versions consistently where required.)

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Grey Divider

Qodo Logo

Comment on lines 149 to 153
name: Install Etherpad plugins
run: >
gnpm install --workspace-root
pnpm add -w
ep_align
ep_author_hover
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Action required

1. Plugin cache key mismatch 🐞 Bug ☼ Reliability

Workflows install plugins via pnpm add -w (changing the runtime dependency set) but the
restored/saved node_modules cache key is still derived only from the pre-step pnpm-lock.yaml
hash, so with-plugins jobs can save a cache that later restores into jobs that were intended to run
without plugins. Etherpad enumerates installed plugins on startup (and will migrate plugins found in
node_modules), so restoring a cache with unexpected plugin packages can change test behavior and
cause flakiness.
Agent Prompt
### Issue description
CI caches `node_modules` using a key that does not encode the plugin set, but plugin jobs change dependencies at runtime via `pnpm add -w`. This can cause caches produced by with-plugins jobs to be restored in jobs intended to run without plugins, changing which plugins Etherpad loads during tests.

### Issue Context
Etherpad migrates plugins from `node_modules` and logs installed plugins at startup, so unexpected plugin packages present in `node_modules` can affect test execution.

### Fix Focus Areas
- Replace `pnpm add -w ...` with the repo-supported plugin installer (does not mutate workspace deps/lockfile in the same way):
  - .github/workflows/backend-tests.yml[149-163]
  - .github/workflows/load-test.yml[104-118]
  - .github/workflows/frontend-admin-tests.yml[85-105] (if plugins are added similarly elsewhere)
- And/or ensure caches cannot be shared between with-plugins and without-plugins jobs by making cache keys job-variant-specific:
  - .github/workflows/backend-tests.yml[43-56]
  - .github/workflows/backend-tests.yml[113-126]

(Option examples: use `pnpm run install-plugins <list>`; or add a `-withplugins` suffix to cache keys for plugin jobs; or drop `node_modules` caching and rely on pnpm store caching.)

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

@SamTV12345 SamTV12345 merged commit a05bb7d into develop Apr 26, 2026
33 of 36 checks passed
@SamTV12345 SamTV12345 deleted the feat/add-changelog-v272 branch April 26, 2026 09:30
@SamTV12345 SamTV12345 changed the title chore: added release notes for 2.7.1 chore: added release notes for 2.7.2 Apr 26, 2026
@qodo-free-for-open-source-projects
Copy link
Copy Markdown

CI Feedback 🧐

A test triggered by this PR failed. Here is an AI-generated analysis of the failure:

Action: Linux with Plugins (24)

Failed stage: Run the backend tests [❌]

Failed test name: get external expiration update is picked up

Failure summary:

The action failed because the backend test suite reported 1 failing Mocha test and exited with
status 1 (ERR_PNPM_RECURSIVE_RUN_FIRST_FAIL).
The specific failure is in
tests/backend/specs/SessionStore.ts:136:14 for the test case get external expiration update is
picked up, where a strict equality assertion failed because the session value returned was the
string null instead of the expected JSON string:
- actual: null (string)
- expected:
{"foo":"bar","cookie":{"expires":"2026-04-26T09:30:11.278Z"}}

Relevant error logs:
1:  ##[group]Runner Image Provisioner
2:  Hosted Compute Agent
...

172:  [command]/home/runner/setup-pnpm/node_modules/.bin/bin/pnpm store path --silent
173:  /home/runner/setup-pnpm/node_modules/.bin/store/v10
174:  Cache hit for: node-cache-Linux-x64-pnpm-5407ec0a246f82f9dd82b202f805f822f3f1e63635d9f4fdef894e3f4fe49e92
175:  Received 0 of 150972709 (0.0%), 0.0 MBs/sec
176:  Received 134217728 of 150972709 (88.9%), 63.9 MBs/sec
177:  Received 150972709 of 150972709 (100.0%), 65.4 MBs/sec
178:  Cache Size: ~144 MB (150972709 B)
179:  [command]/usr/bin/tar -xf /home/runner/work/_temp/23e74e64-c53b-4a68-93e9-546628c7a086/cache.tzst -P -C /home/runner/work/etherpad/etherpad --use-compress-program unzstd
180:  Cache restored successfully
181:  Cache restored from key: node-cache-Linux-x64-pnpm-5407ec0a246f82f9dd82b202f805f822f3f1e63635d9f4fdef894e3f4fe49e92
182:  ##[group]Run awalsh128/cache-apt-pkgs-action@v1.6.0
183:  with:
184:  packages: libreoffice libreoffice-pdfimport
185:  version: 1
186:  execute_install_scripts: false
187:  empty_packages_behavior: error
188:  debug: false
...

195:  �[36;1m  "$VERSION" \�[0m
196:  �[36;1m  "$EXEC_INSTALL_SCRIPTS" \�[0m
197:  �[36;1m  "$DEBUG" \�[0m
198:  �[36;1m  "$ADD_REPOSITORY" \�[0m
199:  �[36;1m  "$PACKAGES"�[0m
200:  �[36;1mif [ -f ~/cache-apt-pkgs/cache_key.md5 ]; then�[0m
201:  �[36;1m  echo "CACHE_KEY=$(cat ~/cache-apt-pkgs/cache_key.md5)" >> $GITHUB_ENV�[0m
202:  �[36;1melse�[0m
203:  �[36;1m  echo "CACHE_KEY=" >> $GITHUB_ENV�[0m
204:  �[36;1mfi�[0m
205:  shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0}
206:  env:
207:  PNPM_HOME: /home/runner/setup-pnpm/node_modules/.bin
208:  VERSION: 1
209:  EXEC_INSTALL_SCRIPTS: false
210:  EMPTY_PACKAGES_BEHAVIOR: error
211:  DEBUG: false
...

510:  �[32m[2026-04-26T09:30:07.942] [INFO] plugins - �[39mLoading plugin ep_set_title_on_pad...
511:  �[32m[2026-04-26T09:30:07.942] [INFO] plugins - �[39mLoading plugin ep_spellcheck...
512:  �[32m[2026-04-26T09:30:07.942] [INFO] plugins - �[39mLoading plugin ep_subscript_and_superscript...
513:  �[32m[2026-04-26T09:30:07.942] [INFO] plugins - �[39mLoading plugin ep_table_of_contents...
514:  �[32m[2026-04-26T09:30:07.942] [INFO] plugins - �[39mLoading plugin ep_etherpad-lite...
515:  �[32m[2026-04-26T09:30:07.943] [INFO] plugins - �[39mLoaded 14 plugins
516:  �[32m[2026-04-26T09:30:08.170] [INFO] settings - �[39mNote: bcrypt library could not be found. bcrypt support will be disabled.
517:  �[32m[2026-04-26T09:30:08.170] [INFO] settings - �[39mRun "npm install bcrypt" to enable bcrypt
518:  �[32m[2026-04-26T09:30:08.171] [INFO] settings - �[39mNote: scrypt library could not be found. scrypt support will be disabled.
519:  �[32m[2026-04-26T09:30:08.171] [INFO] settings - �[39mRun "npm install scrypt" to enable scrypt
520:  �[32m[2026-04-26T09:30:08.172] [INFO] settings - �[39mNote: argon2 library could not be found. argon2 support will be disabled.
521:  �[32m[2026-04-26T09:30:08.172] [INFO] settings - �[39mRun "npm install argon2" to enable argon2
522:  �[32m[2026-04-26T09:30:08.180] [INFO] server - �[39mInstalled plugins: ep_align@11.0.18, ep_author_hover@11.0.15, ep_cursortrace@3.1.48, ep_plugin_helpers@0.2.8, ep_font_size@0.4.103, ep_hash_auth@11.0.16, ep_headings2@0.2.110, ep_markdown@11.0.15, ep_readonly_guest@1.0.53, ep_set_title_on_pad@0.6.40, ep_subscript_and_superscript@0.3.51, ep_table_of_contents@0.3.135, ep_spellcheck@0.0.90
523:  �[32m[2026-04-26T09:30:08.181] [INFO] settings - �[39mReport bugs at https://github.com/ether/etherpad/issues
524:  �[32m[2026-04-26T09:30:08.182] [INFO] settings - �[39mYour Etherpad version is 2.7.1 (cd79329)
525:  �[91m[2026-04-26T09:30:08.194] [ERROR] settings - �[39mCan not perform Etherpad update check: AggregateError
526:  ▲ [WARNING] Duplicate key "types" in object literal [duplicate-object-key]
...

568:  ✔ author already exists, no pads
569:  ✔ author already exists, on different pad
570:  ✔ author already exists, on same pad
571:  enforces consistent pad ID
572:  ✔ pad record has different pad ID
573:  ✔ globalAuthor record has different pad ID
574:  ✔ pad rev record has different pad ID
575:  order of records does not matter
576:  ✔ [0,1,2] (168ms)
577:  ✔ [0,2,1]
578:  ✔ [1,0,2]
579:  ✔ [1,2,0]
580:  ✔ [2,0,1]
581:  ✔ [2,1,0]
582:  old .etherpad imports without author metadata
583:  ✔ imports without error when revision lacks meta.author
584:  ✔ getRevisionAuthor returns empty string for missing author
585:  exportEtherpadAdditionalContent
586:  ✔ imports from custom prefix
587:  ✔ rejects records for pad with similar ID
588:  /home/runner/work/etherpad/etherpad/src/tests/backend/specs/LinkInstaller.ts
589:  readFileSync with plain paths (bug fix)
590:  ✔ reads a plugin package.json using a plain file path and utf-8
591:  ✔ path.join produces a plain string path, not a URL object
592:  addSubDependency-style resolution
593:  ✔ recursively resolves nested dependencies from package.json files
594:  error handling when package.json is missing
595:  ✔ logs an error instead of crashing when package.json does not exist
596:  /home/runner/work/etherpad/etherpad/src/tests/backend/specs/Pad.ts
...

823:  ✔ text matches
824:  ✔ alines match
825:  ✔ attributes are sorted in canonical order
826:  A single completely empty line break within an ol should reset count if OL is closed off..
827:  ✔ text matches
828:  ✔ alines match
829:  ✔ attributes are sorted in canonical order
830:  A single <p></p> should create a new line
831:  ✔ text matches
832:  ✔ alines match
833:  ✔ attributes are sorted in canonical order
834:  Tests if ols properly get line numbers when in a normal OL #2
835:  ✔ text matches
836:  ✔ alines match
837:  ✔ attributes are sorted in canonical order
838:  First item being an UL then subsequent being OL will fail
839:  - text matches
...

1005:  at Object.opAttributeValue (/home/runner/work/etherpad/etherpad/src/static/js/Changeset.ts:1187:12)
1006:  at Object.getLineHTMLForExport [as hook_fn] (/home/runner/work/etherpad/etherpad/src/plugin_packages/.versions/ep_plugin_helpers@0.2.8/attributes-server.js:18:28)
1007:  at <anonymous> (/home/runner/work/etherpad/etherpad/src/static/js/pluginfw/hooks.ts:273:18)
1008:  at new Promise (<anonymous>)
1009:  at callHookFnAsync (/home/runner/work/etherpad/etherpad/src/static/js/pluginfw/hooks.ts:236:16)
1010:  at <anonymous> (/home/runner/work/etherpad/etherpad/src/static/js/pluginfw/hooks.ts:351:54)
1011:  at Array.map (<anonymous>)
1012:  at Object.exports.aCallAll (/home/runner/work/etherpad/etherpad/src/static/js/pluginfw/hooks.ts:351:13)
1013:  at getHTMLFromAtext (/home/runner/work/etherpad/etherpad/src/node/utils/ExportHtml.ts:504:19)
1014:  at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
1015:  at async getPadHTML (/home/runner/work/etherpad/etherpad/src/node/utils/ExportHtml.ts:43:10)
1016:  at async Object.exports.getPadHTMLDocument (/home/runner/work/etherpad/etherpad/src/node/utils/ExportHtml.ts:522:14)
1017:  at async Object.exports.doExport (/home/runner/work/etherpad/etherpad/src/node/handler/ExportHandler.ts:80:16)
1018:  at async <anonymous> (/home/runner/work/etherpad/etherpad/src/node/hooks/express/importexport.ts:68:9)
1019:  �[32m[2026-04-26T09:30:15.921] [INFO] LibreOffice - �[39m[2838] Converting /tmp/etherpad_export_3695987270.html to odt in /tmp
1020:  �[91m[2026-04-26T09:30:15.922] [ERROR] LibreOffice - �[39m[2838] Conversion failed: Error: Command exited with code 1: false --headless --invisible --nologo --nolockcheck --writer --convert-to odt /tmp/etherpad_export_3695987270.html --outdir /tmp
1021:  at exports (/home/runner/work/etherpad/etherpad/src/node/utils/run_cmd.ts:124:48)
1022:  at doConvertTask (/home/runner/work/etherpad/etherpad/src/node/utils/LibreOffice.ts:38:13)
1023:  at /home/runner/work/etherpad/etherpad/node_modules/.pnpm/async@3.2.6/node_modules/async/dist/async.js:151:38
1024:  at /home/runner/work/etherpad/etherpad/node_modules/.pnpm/async@3.2.6/node_modules/async/dist/async.js:4017:13
1025:  at Object.process (/home/runner/work/etherpad/etherpad/node_modules/.pnpm/async@3.2.6/node_modules/async/dist/async.js:1680:21)
1026:  at /home/runner/work/etherpad/etherpad/node_modules/.pnpm/async@3.2.6/node_modules/async/dist/async.js:1532:23
1027:  at /home/runner/work/etherpad/etherpad/node_modules/.pnpm/async@3.2.6/node_modules/async/dist/async.js:74:45
1028:  �[91m[2026-04-26T09:30:15.923] [ERROR] settings - �[39mError: Command exited with code 1: false --headless --invisible --nologo --nolockcheck --writer --convert-to odt /tmp/etherpad_export_3695987270.html --outdir /tmp
1029:  at exports (/home/runner/work/etherpad/etherpad/src/node/utils/run_cmd.ts:124:48)
1030:  at doConvertTask (/home/runner/work/etherpad/etherpad/src/node/utils/LibreOffice.ts:38:13)
1031:  at /home/runner/work/etherpad/etherpad/node_modules/.pnpm/async@3.2.6/node_modules/async/dist/async.js:151:38
1032:  at /home/runner/work/etherpad/etherpad/node_modules/.pnpm/async@3.2.6/node_modules/async/dist/async.js:4017:13
1033:  at Object.process (/home/runner/work/etherpad/etherpad/node_modules/.pnpm/async@3.2.6/node_modules/async/dist/async.js:1680:21)
1034:  at /home/runner/work/etherpad/etherpad/node_modules/.pnpm/async@3.2.6/node_modules/async/dist/async.js:1532:23
1035:  at /home/runner/work/etherpad/etherpad/node_modules/.pnpm/async@3.2.6/node_modules/async/dist/async.js:74:45
1036:  ✔ returns 500 on export error
1037:  /home/runner/work/etherpad/etherpad/src/tests/backend/specs/export_list.ts
...

1534:  at new Promise (<anonymous>)
1535:  at callHookFnAsync (/home/runner/work/etherpad/etherpad/src/static/js/pluginfw/hooks.ts:236:16)
1536:  at <anonymous> (/home/runner/work/etherpad/etherpad/src/static/js/pluginfw/hooks.ts:351:54)
1537:  at Array.map (<anonymous>)
1538:  at Object.exports.aCallAll (/home/runner/work/etherpad/etherpad/src/static/js/pluginfw/hooks.ts:351:13)
1539:  at getHTMLFromAtext (/home/runner/work/etherpad/etherpad/src/node/utils/ExportHtml.ts:504:19)
1540:  at async Object.getPadHTML (/home/runner/work/etherpad/etherpad/src/node/utils/ExportHtml.ts:43:10)
1541:  at async Context.<anonymous> (/home/runner/work/etherpad/etherpad/src/tests/backend/specs/export_list.ts:128:18)
1542:  ✔ nested ordered list counters reset when closing levels (104ms)
1543:  /home/runner/work/etherpad/etherpad/src/tests/backend/specs/favicon.ts
1544:  ✔ uses custom favicon if set (relative pathname)
1545:  ✔ uses custom favicon from url
1546:  ✔ uses custom favicon if set (absolute pathname)
1547:  ✔ falls back if custom favicon is missing
1548:  ✔ uses skin favicon if present
1549:  �[91m[2026-04-26T09:30:16.202] [ERROR] settings - �[39m(node:2785) [DEP0147] DeprecationWarning: In future versions of Node.js, fs.rmdir(path, { recursive: true }) will be removed. Use fs.rm(path, { recursive: true }) instead
1550:  (Use `node --trace-deprecation ...` to show where the warning was created)
...

1895:  ✔ defer call cb(unrejectedPromise) then defer call to cb(resolvedPromise) (diff. outcomes) -> log+throw
1896:  ✔ defer call cb(unrejectedPromise) then defer call to cb(rejectedPromise) (diff. outcomes) -> log+throw
1897:  ✔ defer call cb(unrejectedPromise) then defer call to cb(rejectedPromise) (same outcome) -> only log
1898:  ✔ defer call cb(unrejectedPromise) then defer call to cb(unresolvedPromise) (diff. outcomes) -> log+throw
1899:  ✔ defer call cb(unrejectedPromise) then defer call cb(unrejectedPromise) (diff. outcomes) -> log+throw
1900:  ✔ defer call cb(unrejectedPromise) then defer call cb(unrejectedPromise) (same outcome) -> only log
1901:  hooks.aCallAll
1902:  basic behavior
1903:  ✔ calls all asynchronously, returns values in order
1904:  ✔ passes hook name
1905:  ✔ undefined context -> {}
1906:  ✔ null context -> {}
1907:  ✔ context unmodified
1908:  aCallAll callback
1909:  ✔ exception in callback rejects
1910:  ✔ propagates error on exception
1911:  ✔ propagages null error on success
1912:  ✔ propagages results on success
...

1964:  ✔ lowercase pad ids
1965:  �[32m[2026-04-26T09:30:17.155] [INFO] access - �[39m[CREATE] pad:ALREADYexistingPad socket:1Njm_Gtwa1JGgM4PAAAP IP:::1 authorID:a.DiUnhea0jCS6Kkk2
1966:  �[32m[2026-04-26T09:30:17.190] [INFO] access - �[39m[CREATE] pad:alreadyexistingpad socket:8P8ADuz3q-pqruhlAAAR IP:::1 authorID:a.JOILpGHIMs4KWWy2
1967:  ✔ keeps old pads accessible (50ms)
1968:  �[32m[2026-04-26T09:30:17.207] [INFO] access - �[39m[CREATE] pad:maliciousattempt socket:yUjx0FfJ4dcvGQZtAAAT IP:::1 authorID:a.85fW7dpSV23B1HqJ
1969:  ✔ disallow creation of different case pad-name via socket connection
1970:  /home/runner/work/etherpad/etherpad/src/tests/backend/specs/messages.ts
1971:  CHANGESET_REQ
1972:  �[32m[2026-04-26T09:30:17.222] [INFO] access - �[39m[ENTER] pad:SCi58Woo4O socket:ltu7-SE3th1xTW21AAAV IP:::1 authorID:a.RNcR5pm7M2DxYn5e
1973:  �[32m[2026-04-26T09:30:17.234] [INFO] access - �[39m[ENTER] pad:SCi58Woo4O socket:VZEV36VXzGO1ZuTgAAAX IP:::1 authorID:a.n23j5Qa4Utu81r41
1974:  ✔ users are unable to read changesets from other pads (50ms)
1975:  �[32m[2026-04-26T09:30:18.287] [INFO] access - �[39m[LEAVE] pad:SCi58Woo4O socket:ltu7-SE3th1xTW21AAAV IP:::1 authorID:a.RNcR5pm7M2DxYn5e
1976:  �[32m[2026-04-26T09:30:18.288] [INFO] access - �[39m[LEAVE] pad:SCi58Woo4O socket:VZEV36VXzGO1ZuTgAAAX IP:::1 authorID:a.n23j5Qa4Utu81r41
1977:  �[32m[2026-04-26T09:30:18.301] [INFO] access - �[39m[ENTER] pad:85gMQrjNV7 socket:o3FvxqMpvoBQ9_r1AAAZ IP:::1 authorID:a.6hofZQVI2wA5AIWv
1978:  �[32m[2026-04-26T09:30:18.312] [INFO] access - �[39m[ENTER] pad:85gMQrjNV7 socket:MMMrk6WECV5XHac6AAAb IP:::1 authorID:a.scRQv4w7fbB5sZ0P
1979:  �[91m[2026-04-26T09:30:19.317] [ERROR] socket.io - �[39mError handling pad message from MMMrk6WECV5XHac6AAAb: Error: CHANGESET_REQ: rev is not a number
1980:  at Object.exports.handleMessage (/home/runner/work/etherpad/etherpad/src/node/handler/PadMessageHandler.ts:501:11)
...

1989:  �[32m[2026-04-26T09:30:20.420] [INFO] access - �[39m[LEAVE] pad:UdkpxO279t socket:EfRl0H8mrfhCW2FPAAAd IP:::1 authorID:a.1m81KFXcjjDycKuU
1990:  �[32m[2026-04-26T09:30:20.420] [INFO] access - �[39m[LEAVE] pad:UdkpxO279t socket:5filJQP2PmAhXQt7AAAf IP:::1 authorID:a.ZSOYBsRd3K7nkCNw
1991:  �[32m[2026-04-26T09:30:20.435] [INFO] access - �[39m[ENTER] pad:mrGA8KAMcf socket:lt3S3Nm7YSthHcLgAAAh IP:::1 authorID:a.PCvh3L2pd4i1D25T
1992:  �[32m[2026-04-26T09:30:20.448] [INFO] access - �[39m[ENTER] pad:mrGA8KAMcf socket:CmSYvNQVNJrHKNBxAAAj IP:::1 authorID:a.WCMXvQyMtB72HCPr
1993:  ✔ CHANGESET_REQ: revNum 2 is converted to head rev 1 (regression) (46ms)
1994:  �[32m[2026-04-26T09:30:21.498] [INFO] access - �[39m[LEAVE] pad:mrGA8KAMcf socket:lt3S3Nm7YSthHcLgAAAh IP:::1 authorID:a.PCvh3L2pd4i1D25T
1995:  �[32m[2026-04-26T09:30:21.498] [INFO] access - �[39m[LEAVE] pad:mrGA8KAMcf socket:CmSYvNQVNJrHKNBxAAAj IP:::1 authorID:a.WCMXvQyMtB72HCPr
1996:  USER_CHANGES
1997:  �[32m[2026-04-26T09:30:21.511] [INFO] access - �[39m[ENTER] pad:CpTsUlTtFa socket:pcQiRsXAR48Xc4g2AAAl IP:::1 authorID:a.0T0TyjOGRDVf5Ypz
1998:  �[32m[2026-04-26T09:30:21.523] [INFO] access - �[39m[ENTER] pad:CpTsUlTtFa socket:stTpwuUBKYeVfDZpAAAn IP:::1 authorID:a.HKNCb56AwoUCZvpL
1999:  ✔ changes are applied
2000:  �[32m[2026-04-26T09:30:22.529] [INFO] access - �[39m[LEAVE] pad:CpTsUlTtFa socket:pcQiRsXAR48Xc4g2AAAl IP:::1 authorID:a.0T0TyjOGRDVf5Ypz
2001:  �[32m[2026-04-26T09:30:22.530] [INFO] access - �[39m[LEAVE] pad:CpTsUlTtFa socket:stTpwuUBKYeVfDZpAAAn IP:::1 authorID:a.HKNCb56AwoUCZvpL
2002:  �[32m[2026-04-26T09:30:22.541] [INFO] access - �[39m[ENTER] pad:vNt0ORitFO socket:GtN9-IolheFWPW2yAAAp IP:::1 authorID:a.kFdQ8rstfOUIikZV
2003:  �[32m[2026-04-26T09:30:22.551] [INFO] access - �[39m[ENTER] pad:vNt0ORitFO socket:hGY7_21nfJ0pzfWyAAAr IP:::1 authorID:a.p4zD2luLGKKCz4Pd
2004:  �[33m[2026-04-26T09:30:23.553] [WARN] message - �[39mFailed to apply USER_CHANGES from author a.kFdQ8rstfOUIikZV (socket GtN9-IolheFWPW2yAAAp) on pad vNt0ORitFO: Error: Not a changeset: this is not a valid changeset
2005:  at error (/home/runner/work/etherpad/etherpad/src/static/js/Changeset.ts:64:13)
2006:  at unpack (/home/runner/work/etherpad/etherpad/src/static/js/Changeset.ts:363:44)
...

2015:  ✔ retransmission is accepted, has no effect (115ms)
2016:  �[32m[2026-04-26T09:30:24.844] [INFO] access - �[39m[LEAVE] pad:yFQ2apgEpI socket:4KBgZnzIS_twNU57AAAt IP:::1 authorID:a.8N7XgjyFHxX8Hal3
2017:  �[32m[2026-04-26T09:30:24.844] [INFO] access - �[39m[LEAVE] pad:yFQ2apgEpI socket:3FuS82EcnDdlNVKiAAAv IP:::1 authorID:a.k9Aj00zDfuGE2rKG
2018:  �[32m[2026-04-26T09:30:24.979] [INFO] access - �[39m[ENTER] pad:8dnqp2VzwV socket:eUWzwJ8C3Ti3M_e6AAAx IP:::1 authorID:a.LPzdbLrLwkQej42o
2019:  �[32m[2026-04-26T09:30:24.990] [INFO] access - �[39m[ENTER] pad:8dnqp2VzwV socket:xQFnau-oxjmykgToAAAz IP:::1 authorID:a.h4QiWDSHqlL1ssgA
2020:  ✔ identity changeset is accepted, has no effect (109ms)
2021:  �[32m[2026-04-26T09:30:26.101] [INFO] access - �[39m[LEAVE] pad:8dnqp2VzwV socket:eUWzwJ8C3Ti3M_e6AAAx IP:::1 authorID:a.LPzdbLrLwkQej42o
2022:  �[32m[2026-04-26T09:30:26.101] [INFO] access - �[39m[LEAVE] pad:8dnqp2VzwV socket:xQFnau-oxjmykgToAAAz IP:::1 authorID:a.h4QiWDSHqlL1ssgA
2023:  �[32m[2026-04-26T09:30:26.113] [INFO] access - �[39m[ENTER] pad:LiivRCzbmd socket:ciT3Saey0y9HoVNrAAA1 IP:::1 authorID:a.nPnqft5Wh4YwkjO0
2024:  �[32m[2026-04-26T09:30:26.122] [INFO] access - �[39m[ENTER] pad:LiivRCzbmd socket:kz-23Zr5h-HOHzVsAAA3 IP:::1 authorID:a.fLDfhYENd4WWRX5M
2025:  ✔ non-identity changeset with no net change is accepted, has no effect
2026:  �[32m[2026-04-26T09:30:27.165] [INFO] access - �[39m[LEAVE] pad:LiivRCzbmd socket:ciT3Saey0y9HoVNrAAA1 IP:::1 authorID:a.nPnqft5Wh4YwkjO0
2027:  �[32m[2026-04-26T09:30:27.166] [INFO] access - �[39m[LEAVE] pad:LiivRCzbmd socket:kz-23Zr5h-HOHzVsAAA3 IP:::1 authorID:a.fLDfhYENd4WWRX5M
2028:  �[32m[2026-04-26T09:30:27.179] [INFO] access - �[39m[ENTER] pad:6VnHtUO4Zk socket:QHvQZ2mZ5h_FICseAAA5 IP:::1 authorID:a.KdbSaqR0xKh3QqWo
2029:  �[32m[2026-04-26T09:30:27.188] [INFO] access - �[39m[ENTER] pad:6VnHtUO4Zk socket:bzDgouhc3XV3AMn2AAA7 IP:::1 authorID:a.h9tOx26pCTlSt5ju
2030:  �[91m[2026-04-26T09:30:28.192] [ERROR] socket.io - �[39mError handling pad message from bzDgouhc3XV3AMn2AAA7: Error: COLLABROOM: write attempt on read-only pad
2031:  at Object.exports.handleMessage (/home/runner/work/etherpad/etherpad/src/node/handler/PadMessageHandler.ts:501:11)
2032:  at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
2033:  at async <anonymous> (/home/runner/work/etherpad/etherpad/src/node/handler/SocketIORouter.ts:84:14)
2034:  �[91m[2026-04-26T09:30:28.345] [ERROR] socket.io - �[39mError handling pad message from bzDgouhc3XV3AMn2AAA7: Error: COLLABROOM: write attempt on read-only pad
2035:  at Object.exports.handleMessage (/home/runner/work/etherpad/etherpad/src/node/handler/PadMessageHandler.ts:501:11)
...

2122:  �[32m[2026-04-26T09:30:29.839] [INFO] access - �[39m[CREATE] pad:pad socket:LyG7aZxZk2navT6GAABJ IP:::1 authorID:a.9RaNGmKbz4l1TMIr username:user
2123:  �[32m[2026-04-26T09:30:29.840] [INFO] access - �[39m[LEAVE] pad:pad socket:LyG7aZxZk2navT6GAABJ IP:::1 authorID:a.9RaNGmKbz4l1TMIr username:user
2124:  �[32m[2026-04-26T09:30:29.841] [INFO] http - �[39mSuccessful authentication from IP ::1 for user user
2125:  �[32m[2026-04-26T09:30:29.885] [INFO] access - �[39m[CREATE] pad:pad socket:HtCdvFQ31_ssOhG1AABL IP:::1 authorID:a.cbITbF7NMDeIocai username:user
2126:  ✔ authn user read-only /p/pad -> 200, ok (59ms)
2127:  �[32m[2026-04-26T09:30:29.889] [INFO] access - �[39m[LEAVE] pad:pad socket:HtCdvFQ31_ssOhG1AABL IP:::1 authorID:a.cbITbF7NMDeIocai username:user
2128:  �[32m[2026-04-26T09:30:29.891] [INFO] http - �[39mSuccessful authentication from IP ::1 for user user
2129:  �[32m[2026-04-26T09:30:29.901] [INFO] access - �[39m[CREATE] pad:pad socket:LmPnCTORd3Qd_6xZAABN IP:::1 authorID:a.7RfZGzsx8cPlhKcI username:user
2130:  ✔ authz user /p/pad -> 200, ok
2131:  �[32m[2026-04-26T09:30:29.904] [INFO] access - �[39m[LEAVE] pad:pad socket:LmPnCTORd3Qd_6xZAABN IP:::1 authorID:a.7RfZGzsx8cPlhKcI username:user
2132:  �[32m[2026-04-26T09:30:29.905] [INFO] http - �[39mSuccessful authentication from IP ::1 for user user
2133:  �[32m[2026-04-26T09:30:29.928] [INFO] access - �[39m[CREATE] pad:päd socket:Z4l1kLCLdUvVhWnoAABP IP:::1 authorID:a.UfBKvJpr4speht0I username:user
2134:  ✔ supports pad names with characters that must be percent-encoded
2135:  �[32m[2026-04-26T09:30:29.930] [INFO] access - �[39m[LEAVE] pad:päd socket:Z4l1kLCLdUvVhWnoAABP IP:::1 authorID:a.UfBKvJpr4speht0I username:user
2136:  Abnormal access attempts
2137:  �[32m[2026-04-26T09:30:29.932] [INFO] http - �[39mFailed authentication from IP ::1
2138:  �[91m[2026-04-26T09:30:29.943] [ERROR] socket.io - �[39mError handling pad message from THkdPwIDVYqV4cqVAABR: Error: access denied
2139:  at Object.exports.handleMessage (/home/runner/work/etherpad/etherpad/src/node/handler/PadMessageHandler.ts:397:11)
2140:  at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
2141:  at async <anonymous> (/home/runner/work/etherpad/etherpad/src/node/handler/SocketIORouter.ts:84:14)
2142:  ✔ authn anonymous /p/pad -> 401, error
2143:  �[32m[2026-04-26T09:30:29.945] [INFO] http - �[39mSuccessful authentication from IP ::1 for user user
2144:  �[32m[2026-04-26T09:30:29.958] [INFO] access - �[39m[CREATE] pad:pad socket:5SYpzTP2uGhcHqopAABT IP:::1 authorID:a.29VlFCFTwCVJ86Eo username:user
2145:  �[32m[2026-04-26T09:30:29.959] [INFO] access - �[39m[LEAVE] pad:pad socket:5SYpzTP2uGhcHqopAABT IP:::1 authorID:a.29VlFCFTwCVJ86Eo username:user
2146:  �[32m[2026-04-26T09:30:29.960] [INFO] http - �[39mFailed authentication from IP ::1
2147:  �[91m[2026-04-26T09:30:29.967] [ERROR] socket.io - �[39mError handling pad message from wRFj5yo1qL9TOXn0AABV: Error: access denied
2148:  at Object.exports.handleMessage (/home/runner/work/etherpad/etherpad/src/node/handler/PadMessageHandler.ts:397:11)
2149:  at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
2150:  at async <anonymous> (/home/runner/work/etherpad/etherpad/src/node/handler/SocketIORouter.ts:84:14)
2151:  ✔ authn anonymous read-only /p/pad -> 401, error
2152:  �[91m[2026-04-26T09:30:29.974] [ERROR] socket.io - �[39mError handling pad message from C4rBpm08M3hDM7KIAABX: Error: access denied
2153:  at Object.exports.handleMessage (/home/runner/work/etherpad/etherpad/src/node/handler/PadMessageHandler.ts:397:11)
2154:  at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
2155:  at async <anonymous> (/home/runner/work/etherpad/etherpad/src/node/handler/SocketIORouter.ts:84:14)
2156:  ✔ authn !cookie -> error
2157:  �[32m[2026-04-26T09:30:29.976] [INFO] http - �[39mSuccessful authentication from IP ::1 for user user
2158:  �[91m[2026-04-26T09:30:29.991] [ERROR] socket.io - �[39mError handling pad message from SIEzl_3u2KshQhtkAABZ: Error: access denied
2159:  at Object.exports.handleMessage (/home/runner/work/etherpad/etherpad/src/node/handler/PadMessageHandler.ts:397:11)
2160:  at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
2161:  at async <anonymous> (/home/runner/work/etherpad/etherpad/src/node/handler/SocketIORouter.ts:84:14)
2162:  ✔ authorization bypass attempt -> error
2163:  Authorization levels via authorize hook
2164:  �[32m[2026-04-26T09:30:29.992] [INFO] http - �[39mSuccessful authentication from IP ::1 for user user
2165:  �[32m[2026-04-26T09:30:30.006] [INFO] access - �[39m[CREATE] pad:pad socket:rK8Wu4ZRfrLv-66BAABb IP:::1 authorID:a.h69qDakB5yikG9xF username:user
2166:  ✔ level='create' -> can create
2167:  �[32m[2026-04-26T09:30:30.010] [INFO] access - �[39m[LEAVE] pad:pad socket:rK8Wu4ZRfrLv-66BAABb IP:::1 authorID:a.h69qDakB5yikG9xF username:user
2168:  �[32m[2026-04-26T09:30:30.011] [INFO] http - �[39mSuccessful authentication from IP ::1 for user user
2169:  �[32m[2026-04-26T09:30:30.022] [INFO] access - �[39m[CREATE] pad:pad socket:UPQ6DU_u1gRrqPNhAABd IP:::1 authorID:a.EkqOi9HjtMAqEVcy username:user
2170:  ✔ level=true -> can create
2171:  �[32m[2026-04-26T09:30:30.024] [INFO] access - �[39m[LEAVE] pad:pad socket:UPQ6DU_u1gRrqPNhAABd IP:::1 authorID:a.EkqOi9HjtMAqEVcy username:user
2172:  �[32m[2026-04-26T09:30:30.026] [INFO] http - �[39mSuccessful authentication from IP ::1 for user user
2173:  �[32m[2026-04-26T09:30:30.052] [INFO] access - �[39m[CREATE] pad:pad socket:z29UR2p25lwK2SAJAABf IP:::1 authorID:a.0wT47dyRviTlMdNA username:user
2174:  ✔ level='modify' -> can modify
2175:  �[32m[2026-04-26T09:30:30.056] [INFO] access - �[39m[LEAVE] pad:pad socket:z29UR2p25lwK2SAJAABf IP:::1 authorID:a.0wT47dyRviTlMdNA username:user
2176:  �[32m[2026-04-26T09:30:30.057] [INFO] http - �[39mSuccessful authentication from IP ::1 for user user
2177:  �[91m[2026-04-26T09:30:30.085] [ERROR] socket.io - �[39mError handling pad message from qo3ePooEBCTfmvk_AABh: Error: access denied
2178:  at Object.exports.handleMessage (/home/runner/work/etherpad/etherpad/src/node/handler/PadMessageHandler.ts:397:11)
2179:  at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
2180:  at async <anonymous> (/home/runner/work/etherpad/etherpad/src/node/handler/SocketIORouter.ts:84:14)
2181:  ✔ level='create' settings.editOnly=true -> unable to create
2182:  �[32m[2026-04-26T09:30:30.087] [INFO] http - �[39mSuccessful authentication from IP ::1 for user user
2183:  �[91m[2026-04-26T09:30:30.096] [ERROR] socket.io - �[39mError handling pad message from OmxpRiTy9HQgkNZIAABj: Error: access denied
2184:  at Object.exports.handleMessage (/home/runner/work/etherpad/etherpad/src/node/handler/PadMessageHandler.ts:397:11)
2185:  at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
2186:  at async <anonymous> (/home/runner/work/etherpad/etherpad/src/node/handler/SocketIORouter.ts:84:14)
2187:  ✔ level='modify' settings.editOnly=false -> unable to create
2188:  �[32m[2026-04-26T09:30:30.097] [INFO] http - �[39mSuccessful authentication from IP ::1 for user user
2189:  �[91m[2026-04-26T09:30:30.109] [ERROR] socket.io - �[39mError handling pad message from iRZ3OgSPF49lZIPLAABl: Error: access denied
2190:  at Object.exports.handleMessage (/home/runner/work/etherpad/etherpad/src/node/handler/PadMessageHandler.ts:397:11)
2191:  at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
2192:  at async <anonymous> (/home/runner/work/etherpad/etherpad/src/node/handler/SocketIORouter.ts:84:14)
2193:  ✔ level='readOnly' -> unable to create
2194:  �[32m[2026-04-26T09:30:30.112] [INFO] http - �[39mSuccessful authentication from IP ::1 for user user
2195:  �[32m[2026-04-26T09:30:30.120] [INFO] access - �[39m[CREATE] pad:pad socket:TGs-t9auX1hkxX0CAABn IP:::1 authorID:a.b7J884jmdJDoZTz6 username:user
2196:  ✔ level='readOnly' -> unable to modify
2197:  �[32m[2026-04-26T09:30:30.124] [INFO] access - �[39m[LEAVE] pad:pad socket:TGs-t9auX1hkxX0CAABn IP:::1 authorID:a.b7J884jmdJDoZTz6 username:user
2198:  Authorization levels via user settings
2199:  �[32m[2026-04-26T09:30:30.125] [INFO] http - �[39mSuccessful authentication from IP ::1 for user user
2200:  �[32m[2026-04-26T09:30:30.135] [INFO] access - �[39m[CREATE] pad:pad socket:D0lU99RJqmBY_Bu1AABp IP:::1 authorID:a.OU1tA5J3uxWze7Av username:user
2201:  ✔ user.canCreate = true -> can create and modify
2202:  �[32m[2026-04-26T09:30:30.138] [INFO] access - �[39m[LEAVE] pad:pad socket:D0lU99RJqmBY_Bu1AABp IP:::1 authorID:a.OU1tA5J3uxWze7Av username:user
2203:  �[32m[2026-04-26T09:30:30.139] [INFO] http - �[39mSuccessful authentication from IP ::1 for user user
2204:  �[91m[2026-04-26T09:30:30.287] [ERROR] socket.io - �[39mError handling pad message from RMWEADXQMctavw0NAABr: Error: access denied
2205:  at Object.exports.handleMessage (/home/runner/work/etherpad/etherpad/src/node/handler/PadMessageHandler.ts:397:11)
2206:  at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
2207:  at async <anonymous> (/home/runner/work/etherpad/etherpad/src/node/handler/SocketIORouter.ts:84:14)
2208:  ✔ user.canCreate = false -> unable to create (149ms)
2209:  �[32m[2026-04-26T09:30:30.289] [INFO] http - �[39mSuccessful authentication from IP ::1 for user user
2210:  �[91m[2026-04-26T09:30:30.297] [ERROR] socket.io - �[39mError handling pad message from IcLYiCnkNSO6xsHZAABt: Error: access denied
2211:  at Object.exports.handleMessage (/home/runner/work/etherpad/etherpad/src/node/handler/PadMessageHandler.ts:397:11)
2212:  at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
2213:  at async <anonymous> (/home/runner/work/etherpad/etherpad/src/node/handler/SocketIORouter.ts:84:14)
2214:  ✔ user.readOnly = true -> unable to create
2215:  �[32m[2026-04-26T09:30:30.299] [INFO] http - �[39mSuccessful authentication from IP ::1 for user user
2216:  �[32m[2026-04-26T09:30:30.308] [INFO] access - �[39m[CREATE] pad:pad socket:1oowQTfAtziAGEyDAABv IP:::1 authorID:a.RXtm3pigeOQPtiKr username:user
2217:  ✔ user.readOnly = true -> unable to modify
2218:  �[32m[2026-04-26T09:30:30.311] [INFO] access - �[39m[LEAVE] pad:pad socket:1oowQTfAtziAGEyDAABv IP:::1 authorID:a.RXtm3pigeOQPtiKr username:user
2219:  �[32m[2026-04-26T09:30:30.312] [INFO] http - �[39mSuccessful authentication from IP ::1 for user user
2220:  �[32m[2026-04-26T09:30:30.322] [INFO] access - �[39m[CREATE] pad:pad socket:R1LU0mSYqyfJdhXtAABx IP:::1 authorID:a.Mjo3SzZKOTXMM6JZ username:user
2221:  ✔ user.readOnly = false -> can create and modify
2222:  �[32m[2026-04-26T09:30:30.325] [INFO] access - �[39m[LEAVE] pad:pad socket:R1LU0mSYqyfJdhXtAABx IP:::1 authorID:a.Mjo3SzZKOTXMM6JZ username:user
2223:  �[32m[2026-04-26T09:30:30.326] [INFO] http - �[39mSuccessful authentication from IP ::1 for user user
2224:  �[91m[2026-04-26T09:30:30.335] [ERROR] socket.io - �[39mError handling pad message from wJoWB9yf9EsgZ6X8AABz: Error: access denied
2225:  at Object.exports.handleMessage (/home/runner/work/etherpad/etherpad/src/node/handler/PadMessageHandler.ts:397:11)
2226:  at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
2227:  at async <anonymous> (/home/runner/work/etherpad/etherpad/src/node/handler/SocketIORouter.ts:84:14)
2228:  ✔ user.readOnly = true, user.canCreate = true -> unable to create
2229:  Authorization level interaction between authorize hook and user settings
2230:  �[32m[2026-04-26T09:30:30.336] [INFO] http - �[39mSuccessful authentication from IP ::1 for user user
2231:  �[91m[2026-04-26T09:30:30.348] [ERROR] socket.io - �[39mError handling pad message from zb3yUv5AjSiQueBKAAB1: Error: access denied
2232:  at Object.exports.handleMessage (/home/runner/work/etherpad/etherpad/src/node/handler/PadMessageHandler.ts:397:11)
2233:  at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
2234:  at async <anonymous> (/home/runner/work/etherpad/etherpad/src/node/handler/SocketIORouter.ts:84:14)
2235:  ✔ authorize hook does not elevate level from user settings
2236:  �[32m[2026-04-26T09:30:30.351] [INFO] http - �[39mSuccessful authentication from IP ::1 for user user
2237:  �[91m[2026-04-26T09:30:30.359] [ERROR] socket.io - �[39mError handling pad message from 6tPmKdx-i9tVNAzeAAB3: Error: access denied
2238:  at Object.exports.handleMessage (/home/runner/work/etherpad/etherpad/src/node/handler/PadMessageHandler.ts:397:11)
2239:  at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
2240:  at async <anonymous> (/home/runner/work/etherpad/etherpad/src/node/handler/SocketIORouter.ts:84:14)
2241:  ✔ user settings does not elevate level from authorize hook
2242:  SocketIORouter.js
2243:  ✔ setSocketIO
2244:  ✔ handleConnect
2245:  ✔ handleDisconnect
2246:  ✔ handleMessage (success)
2247:  ✔ handleMessage with ack (success)
2248:  �[91m[2026-04-26T09:30:30.389] [ERROR] socket.io - �[39mError handling /home/runner/work/etherpad/etherpad/src/tests/backend/specs/socketio.ts SocketIORouter.js handleMessage with ack (error) message from ra1l1WdEJYS5j9H1AACB: InjectedError: injected test error
2249:  at Module.handleMessage (/home/runner/work/etherpad/etherpad/src/tests/backend/specs/socketio.ts:429:52)
2250:  at <anonymous> (/home/runner/work/etherpad/etherpad/src/node/handler/SocketIORouter.ts:84:50)
2251:  at Socket.<anonymous> (/home/runner/work/etherpad/etherpad/src/node/handler/SocketIORouter.ts:85:5)
2252:  at Socket.emit (node:events:508:28)
2253:  at Socket.emitUntyped (/home/runner/work/etherpad/etherpad/node_modules/.pnpm/socket.io@4.8.3/node_modules/socket.io/dist/typed-events.js:69:22)
2254:  at /home/runner/work/etherpad/etherpad/node_modules/.pnpm/socket.io@4.8.3/node_modules/socket.io/dist/socket.js:697:39
2255:  at process.processTicksAndRejections (node:internal/process/task_queues:85:11)
2256:  ✔ handleMessage with ack (error)
2257:  /home/runner/work/etherpad/etherpad/src/tests/backend/specs/specialpages.ts
...

2264:  /home/runner/work/etherpad/etherpad/src/tests/backend/specs/undo_clear_authorship.ts
2265:  undo of clear authorship colors (bug #2802)
2266:  �[32m[2026-04-26T09:30:30.681] [INFO] access - �[39m[CREATE] pad:ZyOWiKXHlP socket:ZkapRW_-WaKasvspAACD IP:::1 authorID:a.l2da3fhhe9JVNeZ1
2267:  �[32m[2026-04-26T09:30:30.694] [INFO] access - �[39m[ENTER] pad:ZyOWiKXHlP socket:ORVTxk5wg-dTpiZDAACF IP:::1 authorID:a.yB9Pv7xxywiUqM7x
2268:  ✔ should not disconnect when undoing clear authorship with multiple authors (299ms)
2269:  �[32m[2026-04-26T09:30:30.703] [INFO] access - �[39m[LEAVE] pad:ZyOWiKXHlP socket:ZkapRW_-WaKasvspAACD IP:::1 authorID:a.l2da3fhhe9JVNeZ1
2270:  �[32m[2026-04-26T09:30:30.704] [INFO] access - �[39m[LEAVE] pad:ZyOWiKXHlP socket:ORVTxk5wg-dTpiZDAACF IP:::1 authorID:a.yB9Pv7xxywiUqM7x
2271:  �[32m[2026-04-26T09:30:30.715] [INFO] access - �[39m[CREATE] pad:pk9grRT9rl socket:zqezd7L-lag6TRxAAACH IP:::1 authorID:a.RLbkPk8Il3XFaDML
2272:  ✔ should allow clear authorship changeset with empty author from any user
2273:  �[32m[2026-04-26T09:30:30.876] [INFO] access - �[39m[LEAVE] pad:pk9grRT9rl socket:zqezd7L-lag6TRxAAACH IP:::1 authorID:a.RLbkPk8Il3XFaDML
2274:  �[32m[2026-04-26T09:30:31.018] [INFO] access - �[39m[CREATE] pad:r9nIfvJi97 socket:GUDzG1WYygep18VlAACJ IP:::1 authorID:a.cA66e6tWezr840VH
2275:  ✔ changeset restoring own author after clear should be accepted (147ms)
2276:  �[32m[2026-04-26T09:30:31.027] [INFO] access - �[39m[LEAVE] pad:r9nIfvJi97 socket:GUDzG1WYygep18VlAACJ IP:::1 authorID:a.cA66e6tWezr840VH
2277:  �[32m[2026-04-26T09:30:31.157] [INFO] access - �[39m[CREATE] pad:yTesfiuiCo socket:LGcXmOizAoeZuqfKAACL IP:::1 authorID:a.tOmxhtXMEnHB3uSR
2278:  �[32m[2026-04-26T09:30:31.276] [INFO] access - �[39m[CREATE] pad:yTesfiuiCo socket:sGF3QSyyfKEezByTAACN IP:::1 authorID:a.qrn8GY3YYyvaKRCy
2279:  �[33m[2026-04-26T09:30:31.516] [WARN] message - �[39mFailed to apply USER_CHANGES from author a.qrn8GY3YYyvaKRCy (socket sGF3QSyyfKEezByTAACN) on pad yTesfiuiCo: Error: Author a.qrn8GY3YYyvaKRCy tried to submit changes as author a.tOmxhtXMEnHB3uSR in changeset Z:1>5*0+5$hello
2280:  at handleUserChanges (/home/runner/work/etherpad/etherpad/src/node/handler/PadMessageHandler.ts:754:17)
2281:  at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
2282:  ✔ changeset impersonating another author for new text should still be rejected (488ms)
2283:  �[32m[2026-04-26T09:30:32.433] [INFO] access - �[39m[LEAVE] pad:yTesfiuiCo socket:LGcXmOizAoeZuqfKAACL IP:::1 authorID:a.tOmxhtXMEnHB3uSR
2284:  �[32m[2026-04-26T09:30:32.433] [INFO] access - �[39m[LEAVE] pad:yTesfiuiCo socket:sGF3QSyyfKEezByTAACN IP:::1 authorID:a.qrn8GY3YYyvaKRCy
2285:  �[32m[2026-04-26T09:30:33.257] [INFO] access - �[39m[CREATE] pad:HrGfQytLXt socket:3rhHVIlpIQk2xYxpAACP IP:::1 authorID:a.SOfuGMjfWT5R6Fkm
2286:  �[33m[2026-04-26T09:30:33.444] [WARN] message - �[39mFailed to apply USER_CHANGES from author a.SOfuGMjfWT5R6Fkm (socket 3rhHVIlpIQk2xYxpAACP) on pad HrGfQytLXt: Error: Author a.SOfuGMjfWT5R6Fkm tried to set unknown author a.fabricatedAuthorId on existing text in changeset Z:6>0*0=5$
2287:  at handleUserChanges (/home/runner/work/etherpad/etherpad/src/node/handler/PadMessageHandler.ts:745:19)
2288:  at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
2289:  ✔ should reject = op with fabricated author who never contributed to the pad (621ms)
2290:  �[32m[2026-04-26T09:30:33.772] [INFO] access - �[39m[LEAVE] pad:HrGfQytLXt socket:3rhHVIlpIQk2xYxpAACP IP:::1 authorID:a.SOfuGMjfWT5R6Fkm
2291:  �[32m[2026-04-26T09:30:33.783] [INFO] access - �[39m[CREATE] pad:1eIQEZFBWP socket:nPNXnX8x4AyrTrBJAACR IP:::1 authorID:a.rMiuhW93hGIONwIU
2292:  �[33m[2026-04-26T09:30:33.786] [WARN] message - �[39mFailed to apply USER_CHANGES from author a.rMiuhW93hGIONwIU (socket nPNXnX8x4AyrTrBJAACR) on pad 1eIQEZFBWP: Error: Author a.rMiuhW93hGIONwIU tried to submit changes as author a.fabricatedAuthorId in changeset Z:6<1*0-1$
2293:  at handleUserChanges (/home/runner/work/etherpad/etherpad/src/node/handler/PadMessageHandler.ts:754:17)
2294:  at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
2295:  ✔ should reject - op with foreign author to prevent pool injection
2296:  �[32m[2026-04-26T09:30:33.788] [INFO] access - �[39m[LEAVE] pad:1eIQEZFBWP socket:nPNXnX8x4AyrTrBJAACR IP:::1 authorID:a.rMiuhW93hGIONwIU
2297:  /home/runner/work/etherpad/etherpad/src/tests/backend/specs/webaccess.ts
2298:  webaccess: without plugins
2299:  ✔ !authn !authz anonymous / -> 200
2300:  �[32m[2026-04-26T09:30:33.792] [INFO] http - �[39mFailed authentication from IP ::1
2301:  ✔ !authn !authz anonymous /admin-auth// -> 401
2302:  �[32m[2026-04-26T09:30:33.794] [INFO] http - �[39mFailed authentication from IP ::1
2303:  ✔ authn !authz anonymous / -> 401
...

2306:  �[32m[2026-04-26T09:30:33.797] [INFO] http - �[39mSuccessful authentication from IP ::1 for user user
2307:  ✔ authn !authz user //admin-auth// -> 403
2308:  �[32m[2026-04-26T09:30:33.799] [INFO] http - �[39mSuccessful authentication from IP ::1 for user admin
2309:  ✔ authn !authz admin / -> 200
2310:  �[32m[2026-04-26T09:30:33.800] [INFO] http - �[39mSuccessful authentication from IP ::1 for user admin
2311:  ✔ authn !authz admin /admin-auth/ -> 200
2312:  ✔ authn authz anonymous /robots.txt -> 200
2313:  �[32m[2026-04-26T09:30:33.803] [INFO] http - �[39mSuccessful authentication from IP ::1 for user user
2314:  ✔ authn authz user / -> 403
2315:  �[32m[2026-04-26T09:30:33.805] [INFO] http - �[39mSuccessful authentication from IP ::1 for user user
2316:  ✔ authn authz user //admin-auth// -> 403 (164ms)
2317:  �[32m[2026-04-26T09:30:33.969] [INFO] http - �[39mSuccessful authentication from IP ::1 for user admin
2318:  ✔ authn authz admin / -> 200
2319:  �[32m[2026-04-26T09:30:33.971] [INFO] http - �[39mSuccessful authentication from IP ::1 for user admin
2320:  ✔ authn authz admin /admin-auth/ -> 200
2321:  login fails if password is nullish
2322:  �[32m[2026-04-26T09:30:33.981] [INFO] http - �[39mFailed authentication from IP ::1
2323:  ✔ admin password: undefined credentials: admin
2324:  �[32m[2026-04-26T09:30:33.983] [INFO] http - �[39mFailed authentication from IP ::1
2325:  ✔ admin password: undefined credentials: admin:
2326:  �[32m[2026-04-26T09:30:33.985] [INFO] http - �[39mFailed authentication from IP ::1
2327:  ✔ admin password: null credentials: admin
2328:  �[32m[2026-04-26T09:30:33.987] [INFO] http - �[39mFailed authentication from IP ::1
2329:  ✔ admin password: null credentials: admin:
2330:  webaccess: preAuthorize, authenticate, and authorize hooks
2331:  preAuthorize
2332:  ✔ defers if it returns []
2333:  ✔ bypasses authenticate and authorize hooks when true is returned
2334:  ✔ bypasses authenticate and authorize hooks when false is returned
2335:  ✔ bypasses authenticate and authorize hooks when next is called
2336:  ✔ static content (expressPreSession) bypasses all auth checks
2337:  �[32m[2026-04-26T09:30:33.996] [INFO] http - �[39mFailed authentication from IP ::1
2338:  ✔ cannot grant access to /admin
2339:  ✔ can deny access to /admin-auth/
2340:  ✔ runs preAuthzFailure hook when access is denied
2341:  �[91m[2026-04-26T09:30:34.001] [ERROR] http - �[39mError in preAuthorize hook: Error: exception test
2342:  at Handler.handlers.preAuthorize.<computed>.innerHandle (/home/runner/work/etherpad/etherpad/src/tests/backend/specs/webaccess.ts:267:62)
...

2392:  at trimPrefix (/home/runner/work/etherpad/etherpad/node_modules/.pnpm/router@2.2.0/node_modules/router/index.js:342:13)
2393:  at /home/runner/work/etherpad/etherpad/node_modules/.pnpm/router@2.2.0/node_modules/router/index.js:297:9
2394:  at processParams (/home/runner/work/etherpad/etherpad/node_modules/.pnpm/router@2.2.0/node_modules/router/index.js:582:12)
2395:  at next (/home/runner/work/etherpad/etherpad/node_modules/.pnpm/router@2.2.0/node_modules/router/index.js:291:5)
2396:  at router.handle (/home/runner/work/etherpad/etherpad/node_modules/.pnpm/router@2.2.0/node_modules/router/index.js:186:3)
2397:  at app.handle (/home/runner/work/etherpad/etherpad/node_modules/.pnpm/express@5.2.1/node_modules/express/lib/application.js:177:15)
2398:  at Server.app (/home/runner/work/etherpad/etherpad/node_modules/.pnpm/express@5.2.1/node_modules/express/lib/express.js:38:9)
2399:  at Server.<anonymous> (/home/runner/work/etherpad/etherpad/node_modules/.pnpm/engine.io@6.6.5/node_modules/engine.io/build/server.js:648:34)
2400:  at Server.<anonymous> (/home/runner/work/etherpad/etherpad/node_modules/.pnpm/socket.io@4.8.3/node_modules/socket.io/dist/index.js:330:28)
2401:  at Server.emit (node:events:508:28)
2402:  at parserOnIncoming (node:_http_server:1210:12)
2403:  at HTTPParser.parserOnHeadersComplete (node:_http_common:125:17)
2404:  ✔ returns 500 if an exception is thrown
2405:  authenticate
2406:  ✔ is not called if !requireAuthentication and not /admin-auth/*
2407:  �[32m[2026-04-26T09:30:34.004] [INFO] http - �[39mFailed authentication from IP ::1
2408:  ✔ is called if !requireAuthentication and /admin-auth//*
2409:  �[32m[2026-04-26T09:30:34.006] [INFO] http - �[39mFailed authentication from IP ::1
2410:  ✔ defers if empty list returned
2411:  �[32m[2026-04-26T09:30:34.008] [INFO] http - �[39mSuccessful authentication from IP ::1 for user <no username>
2412:  ✔ does not defer if return [true], 200
2413:  �[32m[2026-04-26T09:30:34.010] [INFO] http - �[39mFailed authentication from IP ::1
2414:  ✔ does not defer if return [false], 401
2415:  �[32m[2026-04-26T09:30:34.012] [INFO] http - �[39mSuccessful authentication from IP ::1 for user user
2416:  ✔ falls back to HTTP basic auth (131ms)
2417:  �[32m[2026-04-26T09:30:34.143] [INFO] http - �[39mFailed authentication from IP ::1
2418:  ✔ passes settings.users in context
2419:  �[32m[2026-04-26T09:30:34.146] [INFO] http - �[39mSuccessful authentication from IP ::1 for user user
2420:  ✔ passes user, password in context if provided
2421:  �[32m[2026-04-26T09:30:34.148] [INFO] http - �[39mFailed authentication from IP ::1
2422:  ✔ does not pass user, password in context if not provided
2423:  �[91m[2026-04-26T09:30:34.150] [ERROR] http - �[39mauthenticate hook failed to add user settings to session
2424:  ✔ errors if req.session.user is not created
2425:  �[91m[2026-04-26T09:30:34.152] [ERROR] settings - �[39mError: exception test
2426:  at Handler.handlers.authenticate.<computed>.innerHandle (/home/runner/work/etherpad/etherpad/src/tests/backend/specs/webaccess.ts:374:62)
...

2439:  ✔ returns 500 if an exception is thrown
2440:  authorize
2441:  �[32m[2026-04-26T09:30:34.153] [INFO] http - �[39mSuccessful authentication from IP ::1 for user user
2442:  ✔ is not called if !requireAuthorization (non-/admin)
2443:  �[32m[2026-04-26T09:30:34.154] [INFO] http - �[39mSuccessful authentication from IP ::1 for user admin
2444:  ✔ is not called if !requireAuthorization (/admin)
2445:  �[32m[2026-04-26T09:30:34.156] [INFO] http - �[39mSuccessful authentication from IP ::1 for user user
2446:  ✔ defers if empty list returned
2447:  �[32m[2026-04-26T09:30:34.158] [INFO] http - �[39mSuccessful authentication from IP ::1 for user user
2448:  ✔ does not defer if return [true], 200
2449:  �[32m[2026-04-26T09:30:34.160] [INFO] http - �[39mSuccessful authentication from IP ::1 for user user
2450:  ✔ does not defer if return [false], 403
2451:  �[32m[2026-04-26T09:30:34.162] [INFO] http - �[39mSuccessful authentication from IP ::1 for user user
2452:  ✔ passes req.path in context
2453:  �[32m[2026-04-26T09:30:34.164] [INFO] http - �[39mSuccessful authentication from IP ::1 for user user
2454:  �[91m[2026-04-26T09:30:34.164] [ERROR] settings - �[39mError: exception test
2455:  at Handler.handlers.authorize.<computed>.innerHandle (/home/runner/work/etherpad/etherpad/src/tests/backend/specs/webaccess.ts:452:59)
2456:  at Handler.handle (/home/runner/work/etherpad/etherpad/src/tests/backend/specs/webaccess.ts:166:24)
2457:  at <anonymous> (/home/runner/work/etherpad/etherpad/src/static/js/pluginfw/hooks.ts:273:18)
2458:  at new Promise (<anonymous>)
2459:  at callHookFnAsync (/home/runner/work/etherpad/etherpad/src/static/js/pluginfw/hooks.ts:236:16)
2460:  at Object.exports.aCallFirst (/home/runner/work/etherpad/etherpad/src/static/js/pluginfw/hooks.ts:411:38)
2461:  at Object.exports.aCallFirst (/home/runner/work/etherpad/etherpad/src/static/js/pluginfw/hooks.ts:405:41)
2462:  at <anonymous> (/home/runner/work/etherpad/etherpad/src/node/hooks/express/webaccess.ts:17:9)
2463:  at new Promise (<anonymous>)
2464:  at aCallFirst (/home/runner/work/etherpad/etherpad/src/node/hooks/express/webaccess.ts:16:68)
2465:  at aCallFirst0 (/home/runner/work/etherpad/etherpad/src/node/hooks/express/webaccess.ts:22:66)
2466:  at authorize (/home/runner/work/etherpad/etherpad/src/node/hooks/express/webaccess.ts:134:30)
2467:  at checkAccess (/home/runner/work/etherpad/etherpad/src/node/hooks/express/webaccess.ts:216:22)
2468:  at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
2469:  ✔ returns 500 if an exception is thrown
2470:  webaccess: authnFailure, authzFailure, authFailure hooks
2471:  �[32m[2026-04-26T09:30:34.165] [INFO] http - �[39mFailed authentication from IP ::1
2472:  �[33m[2026-04-26T09:30:34.166] [WARN] settings - �[39mauthFailure hook used by the fake_plugin plugin (fake_plugin/authFailure) is deprecated: use the authnFailure and authzFailure hooks instead
2473:  ✔ authn fail, no hooks handle -> 401
2474:  �[32m[2026-04-26T09:30:34.168] [INFO] http - �[39mFailed authentication from IP ::1
2475:  ✔ authn fail, authnFailure handles
2476:  �[32m[2026-04-26T09:30:34.169] [INFO] http - �[39mFailed authentication from IP ::1
2477:  ✔ authn fail, authFailure handles
2478:  �[32m[2026-04-26T09:30:34.170] [INFO] http - �[39mFailed authentication from IP ::1
2479:  ✔ authnFailure trumps authFailure
2480:  �[32m[2026-04-26T09:30:34.171] [INFO] http - �[39mSuccessful authentication from IP ::1 for user user
2481:  ✔ authz fail, no hooks handle -> 403
2482:  �[32m[2026-04-26T09:30:34.172] [INFO] http - �[39mSuccessful authentication from IP ::1 for user user
2483:  ✔ authz fail, authzFailure handles
2484:  �[32m[2026-04-26T09:30:34.174] [INFO] http - �[39mSuccessful authentication from IP ::1 for user user
2485:  ✔ authz fail, authFailure handles
2486:  �[32m[2026-04-26T09:30:34.175] [INFO] http - �[39mSuccessful authentication from IP ::1 for user user
...

2488:  �[32m[2026-04-26T09:30:34.201] [INFO] server - �[39mExiting...
2489:  �[32m[2026-04-26T09:30:34.201] [INFO] server - �[39mStopping Etherpad...
2490:  �[32m[2026-04-26T09:30:34.201] [INFO] http - �[39mClosing HTTP server...
2491:  �[32m[2026-04-26T09:30:34.201] [INFO] socket.io - �[39mClosing socket.io engine...
2492:  �[32m[2026-04-26T09:30:34.202] [INFO] access - �[39m[LEAVE] pad:ALREADYexistingPad socket:1Njm_Gtwa1JGgM4PAAAP IP:::1 authorID:a.DiUnhea0jCS6Kkk2
2493:  �[32m[2026-04-26T09:30:34.202] [INFO] access - �[39m[LEAVE] pad:alreadyexistingpad socket:8P8ADuz3q-pqruhlAAAR IP:::1 authorID:a.JOILpGHIMs4KWWy2
2494:  �[32m[2026-04-26T09:30:34.202] [INFO] access - �[39m[LEAVE] pad:maliciousattempt socket:yUjx0FfJ4dcvGQZtAAAT IP:::1 authorID:a.85fW7dpSV23B1HqJ
2495:  �[32m[2026-04-26T09:30:34.202] [INFO] socket.io - �[39mAll socket.io clients have disconnected
2496:  �[32m[2026-04-26T09:30:34.205] [INFO] ueberDB - �[39mDatabase closed
2497:  �[32m[2026-04-26T09:30:34.205] [INFO] http - �[39mWaiting for 3 HTTP clients to disconnect...
2498:  �[32m[2026-04-26T09:30:34.206] [INFO] http - �[39mHTTP server closed
2499:  �[32m[2026-04-26T09:30:34.206] [INFO] server - �[39mEtherpad stopped
2500:  �[32m[2026-04-26T09:30:34.206] [INFO] server - �[39mWaiting for Node.js to exit...
2501:  804 passing (27s)
2502:  6 pending
2503:  1 failing
2504:  1) /home/runner/work/etherpad/etherpad/src/tests/backend/specs/SessionStore.ts
2505:  get
2506:  external expiration update is picked up:
2507:  AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
2508:  + actual - expected
2509:  + 'null'
2510:  - '{"foo":"bar","cookie":{"expires":"2026-04-26T09:30:11.278Z"}}'
2511:  + expected - actual
2512:  -null
2513:  +{"foo":"bar","cookie":{"expires":"2026-04-26T09:30:11.278Z"}}
2514:  at Context.<anonymous> (tests/backend/specs/SessionStore.ts:136:14)
2515:  at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
2516:  �[91m[2026-04-26T09:30:39.206] [ERROR] server - �[39mSomething that should have been cleaned up during the shutdown hook (such as a timer, worker thread, or open connection) is preventing Node.js from exiting
2517:  �[91m[2026-04-26T09:30:39.207] [ERROR] server - �[39mEnable `dumpOnUncleanExit` setting to get a dump of objects preventing a clean exit
2518:  �[91m[2026-04-26T09:30:39.207] [ERROR] server - �[39mForcing an unclean exit...
2519:  /home/runner/work/etherpad/etherpad/src:
2520:  ERR_PNPM_RECURSIVE_RUN_FIRST_FAIL  ep_etherpad-lite@2.7.1 test: `cross-env NODE_ENV=production mocha --import=tsx --timeout 120000 --recursive tests/backend/specs/**.ts ../node_modules/ep_*/static/tests/backend/specs/**`
2521:  Exit status 1
2522:  ELIFECYCLE  Test failed. See above for more details.
2523:  ##[error]Process completed with exit code 1.
2524:  Post job cleanup.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant