Skip to content

test(backend): fix Windows ENOENT in backend-tests-glob regression check#7794

Merged
JohnMcLear merged 2 commits into
developfrom
fix/backend-tests-glob-windows
May 17, 2026
Merged

test(backend): fix Windows ENOENT in backend-tests-glob regression check#7794
JohnMcLear merged 2 commits into
developfrom
fix/backend-tests-glob-windows

Conversation

@JohnMcLear
Copy link
Copy Markdown
Member

Summary

The backend-tests glob regression check added in #7789 (src/tests/backend-new/specs/backend-tests-glob.test.ts) called execFileSync('npx', ...). Node's child_process.spawn does not auto-resolve .cmd/.bat shims, so on Windows runners the call fails with spawnSync npx ENOENT. develop's CI went red on "Windows without plugins (24)" after #7789 merged; Linux passed.

Fix

Resolve mocha's JS entry via require.resolve('mocha/bin/mocha.js') and run it under the current node process. No shell, no platform-specific shim, identical behaviour everywhere.

Also normalise the absolute paths mocha prints to POSIX-relative form so the toContain() assertions match on both Linux (forward slashes) and Windows (backslashes).

Test plan

  • Local run on Linux: passes.
  • Verified the test still fails when the package.json glob is reverted to the broken tests/backend/specs/**.ts pattern.
  • CI "Windows without plugins (24)" goes green.

🤖 Generated with Claude Code

The previous version called execFileSync('npx', ...). On Windows
runners (and any Windows host where npx is installed as npx.cmd),
node's child_process.spawn does not auto-pick the .cmd shim, so
the call fails with spawnSync npx ENOENT. CI on develop went red
for "Windows without plugins" because of this — Linux passed.

Resolve mocha's JS entry directly via require.resolve and run it
under the current node process. No shell, no .cmd resolution,
identical behaviour on every platform.

Also normalise the absolute paths mocha prints to POSIX-relative
form so the toContain() assertions match on both Linux (which
emits forward slashes) and Windows (backslashes).

Verified locally that the test still fails when the package.json
glob is reverted to the broken tests/backend/specs/**.ts pattern.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@qodo-code-review
Copy link
Copy Markdown

Qodo reviews are paused for this user.

Troubleshooting steps vary by plan Learn more →

On a Teams plan?
Reviews resume once this user has a paid seat and their Git account is linked in Qodo.
Link Git account →

Using GitHub Enterprise Server, GitLab Self-Managed, or Bitbucket Data Center?
These require an Enterprise plan - Contact us
Contact us →

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

Review Summary by Qodo

Fix Windows ENOENT in backend tests glob regression check

🐞 Bug fix 🧪 Tests

Grey Divider

Walkthroughs

Description
• Fix Windows ENOENT error in backend tests glob regression check
• Replace npx mocha with direct node invocation using require.resolve()
• Normalize absolute paths to POSIX-relative form for cross-platform assertions
• Handle both Unix and Windows line endings in mocha output
Diagram
flowchart LR
  A["execFileSync npx"] -->|Windows fails| B["ENOENT error"]
  C["require.resolve mocha"] -->|Direct invocation| D["process.execPath"]
  D -->|Cross-platform| E["Success on all OS"]
  F["Absolute paths"] -->|Normalize| G["POSIX-relative paths"]
  G -->|Match assertions| H["Linux and Windows"]
Loading

Grey Divider

File Changes

1. src/tests/backend-new/specs/backend-tests-glob.test.ts 🐞 Bug fix +14/-7

Make glob regression check Windows-safe

• Replace execFileSync('npx', ['mocha', ...]) with `execFileSync(process.execPath, [mochaBin,
 ...]) to avoid Windows .cmd` shim resolution issues
• Resolve mocha binary directly via require.resolve('mocha/bin/mocha.js') instead of relying on
 npx
• Normalize absolute paths to POSIX-relative form by handling platform separators and converting
 backslashes to forward slashes
• Update line splitting regex to handle both Unix (\n) and Windows (\r\n) line endings

src/tests/backend-new/specs/backend-tests-glob.test.ts


Grey Divider

Qodo Logo

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

qodo-free-for-open-source-projects Bot commented May 17, 2026

Code Review by Qodo

🐞 Bugs (0) 📘 Rule violations (0) 📎 Requirement gaps (0)

Grey Divider


Remediation recommended

1. Brittle path stripping ✓ Resolved 🐞 Bug ☼ Reliability
Description
seen is derived by stripping ${srcRoot}${sep} via startsWith() and then replacing only the
current platform separator, so if Mocha prints paths with different separators or drive-letter
casing on Windows, the prefix will not be removed and the test will fail with absolute paths in
seen. This undermines the PR’s goal of making the assertions stable across Linux/Windows runners.
Code

src/tests/backend-new/specs/backend-tests-glob.test.ts[R51-56]

+    const prefix = `${srcRoot}${sep}`;
+    const seen = out.split(/\r?\n/)
      .map((l) => l.trim())
      .filter(Boolean)
-        .map((l) => l.replace(`${srcRoot}/`, ''));
+        .map((l) => (l.startsWith(prefix) ? l.slice(prefix.length) : l))
+        .map((l) => l.split(sep).join('/'));
Evidence
The current normalization relies on a case-sensitive startsWith() prefix match and only replaces
path.sep, so any mismatch in the printed path format will skip prefix stripping and keep absolute
paths.

src/tests/backend-new/specs/backend-tests-glob.test.ts[51-56]

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

## Issue description
The test normalizes Mocha’s `--list-files` output by doing a string `startsWith(prefix)` check and then replacing only `path.sep`. This can fail on Windows if the output uses different separators (e.g., `/`) or if drive-letter casing differs, leaving absolute paths that break the `toContain()` assertions.
### Issue Context
The logic currently does:
- build `prefix = `${srcRoot}${sep}`
- strip prefix with `startsWith(prefix)`
- convert separators with `split(sep).join('/')`
### Fix Focus Areas
- src/tests/backend-new/specs/backend-tests-glob.test.ts[51-56]
### Suggested implementation direction
- Normalize each line with `path.normalize(l)`.
- Convert to repo-relative using `path.relative(srcRoot, normalized)` when the path is absolute.
- Finally convert to POSIX separators (e.g., `rel.split(path.sep).join('/')`).
This avoids depending on exact string prefix/casing/separator matches.

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


Grey Divider

Qodo Logo

Qodo flagged the prefix-strip + sep-split approach as brittle. On
Windows runners mocha can emit paths with mixed separators or
different drive-letter casing, in which case startsWith() misses
the prefix and the assertions fail against absolute paths.

path.relative(srcRoot, abs) handles drive-letter casing and mixed
separators consistently, then a final replace([\\/]) -> '/' yields
POSIX-relative paths regardless of how mocha printed them.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@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: /home/runner/work/etherpad/etherpad/src/tests/backend/specs/admin/anonymizeAuthorSocket.ts

Failure summary:

The GitHub Action failed because the backend test suite exited with failures (Mocha exit status 7),
triggered by multiple test timeouts.
- In
/home/runner/work/etherpad/etherpad/src/tests/backend/specs/admin/anonymizeAuthorSocket.ts, 7 tests
timed out after 120000ms each (Mocha reported: “Timeout of 120000ms exceeded… ensure done() is
called; if returning a Promise, ensure it resolves”).
- These timeouts caused the pnpm test command
to fail: ep_etherpad-lite@3.0.0 test running mocha ... --timeout 120000 ..., ending with
[ERR_PNPM_RECURSIVE_RUN_FIRST_FAIL] and Process completed with exit code 7.

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

92:  Removing includeIf entries pointing to credentials config files
93:  [command]/usr/bin/git config --local --name-only --get-regexp ^includeIf\.gitdir:
94:  [command]/usr/bin/git submodule foreach --recursive git config --local --show-origin --name-only --get-regexp remote.origin.url
95:  [command]/usr/bin/git config --file /home/runner/work/_temp/git-credentials-eb4f3487-a0f7-46ea-a94c-9c40a00d8114.config http.https://github.com/.extraheader AUTHORIZATION: basic ***
96:  [command]/usr/bin/git config --local includeIf.gitdir:/home/runner/work/etherpad/etherpad/.git.path /home/runner/work/_temp/git-credentials-eb4f3487-a0f7-46ea-a94c-9c40a00d8114.config
97:  [command]/usr/bin/git config --local includeIf.gitdir:/home/runner/work/etherpad/etherpad/.git/worktrees/*.path /home/runner/work/_temp/git-credentials-eb4f3487-a0f7-46ea-a94c-9c40a00d8114.config
98:  [command]/usr/bin/git config --local includeIf.gitdir:/github/workspace/.git.path /github/runner_temp/git-credentials-eb4f3487-a0f7-46ea-a94c-9c40a00d8114.config
99:  [command]/usr/bin/git config --local includeIf.gitdir:/github/workspace/.git/worktrees/*.path /github/runner_temp/git-credentials-eb4f3487-a0f7-46ea-a94c-9c40a00d8114.config
100:  ##[endgroup]
101:  ##[group]Fetching the repository
102:  [command]/usr/bin/git -c protocol.version=2 fetch --no-tags --prune --no-recurse-submodules origin +refs/heads/*:refs/remotes/origin/* +refs/tags/*:refs/tags/*
103:  From https://github.com/ether/etherpad
104:  * [new branch]          3227-tests              -> origin/3227-tests
105:  * [new branch]          5718-consecutive-numbering-fails -> origin/5718-consecutive-numbering-fails
106:  * [new branch]          6245-installing-etherpad-plugins-from-github-repos-is-broken -> origin/6245-installing-etherpad-plugins-from-github-repos-is-broken
107:  * [new branch]          6627-error-when-using-window_-localization-in-documentready-hook -> origin/6627-error-when-using-window_-localization-in-documentready-hook
108:  * [new branch]          Gared-robots.txt        -> origin/Gared-robots.txt
...

191:  * [new branch]          feature/recent-pads     -> origin/feature/recent-pads
192:  * [new branch]          feature/rollup          -> origin/feature/rollup
193:  * [new branch]          feature/show-author-colors-default -> origin/feature/show-author-colors-default
194:  * [new branch]          feature/test_ctrl_z     -> origin/feature/test_ctrl_z
195:  * [new branch]          feature/typescript      -> origin/feature/typescript
196:  * [new branch]          feature/ueberdb-rs      -> origin/feature/ueberdb-rs
197:  * [new branch]          feature/ultimate-express -> origin/feature/ultimate-express
198:  * [new branch]          fix-#3157               -> origin/fix-#3157
199:  * [new branch]          fix-admintests          -> origin/fix-admintests
200:  * [new branch]          fix-admintests-rebased  -> origin/fix-admintests-rebased
201:  * [new branch]          fix-adminupdateplugins  -> origin/fix-adminupdateplugins
202:  * [new branch]          fix-connection-diagnostics -> origin/fix-connection-diagnostics
203:  * [new branch]          fix-copy-bold           -> origin/fix-copy-bold
204:  * [new branch]          fix-css-inlining        -> origin/fix-css-inlining
205:  * [new branch]          fix-export-regressions  -> origin/fix-export-regressions
206:  * [new branch]          fix-express-errorhandling -> origin/fix-express-errorhandling
207:  * [new branch]          fix-flaky-adminsettings-test -> origin/fix-flaky-adminsettings-test
208:  * [new branch]          fix-import-error        -> origin/fix-import-error
209:  * [new branch]          fix-lost-spaces         -> origin/fix-lost-spaces
...

576:  ##[endgroup]
577:  [command]/home/runner/setup-pnpm/node_modules/.bin/bin/pnpm store path --silent
578:  /home/runner/setup-pnpm/node_modules/.bin/store/v11
579:  Cache hit for: node-cache-Linux-x64-pnpm-69bce3630d8e140abc2b647fe8bdbbe78750f8d416bc72242c5e9034d8cec9ea
580:  Received 134217728 of 175179674 (76.6%), 127.9 MBs/sec
581:  Received 175179674 of 175179674 (100.0%), 144.6 MBs/sec
582:  Cache Size: ~167 MB (175179674 B)
583:  [command]/usr/bin/tar -xf /home/runner/work/_temp/960634e7-e5ae-4c13-bc4b-f189f061fc0b/cache.tzst -P -C /home/runner/work/etherpad/etherpad --use-compress-program unzstd
584:  Cache restored successfully
585:  Cache restored from key: node-cache-Linux-x64-pnpm-69bce3630d8e140abc2b647fe8bdbbe78750f8d416bc72242c5e9034d8cec9ea
586:  ##[group]Run awalsh128/cache-apt-pkgs-action@v1.6.0
587:  with:
588:  packages: libreoffice libreoffice-pdfimport
589:  version: 1
590:  execute_install_scripts: false
591:  empty_packages_behavior: error
592:  debug: false
...

599:  �[36;1m  "$VERSION" \�[0m
600:  �[36;1m  "$EXEC_INSTALL_SCRIPTS" \�[0m
601:  �[36;1m  "$DEBUG" \�[0m
602:  �[36;1m  "$ADD_REPOSITORY" \�[0m
603:  �[36;1m  "$PACKAGES"�[0m
604:  �[36;1mif [ -f ~/cache-apt-pkgs/cache_key.md5 ]; then�[0m
605:  �[36;1m  echo "CACHE_KEY=$(cat ~/cache-apt-pkgs/cache_key.md5)" >> $GITHUB_ENV�[0m
606:  �[36;1melse�[0m
607:  �[36;1m  echo "CACHE_KEY=" >> $GITHUB_ENV�[0m
608:  �[36;1mfi�[0m
609:  shell: /usr/bin/bash --noprofile --norc -e -o pipefail {0}
610:  env:
611:  PNPM_HOME: /home/runner/setup-pnpm/node_modules/.bin
612:  VERSION: 1
613:  EXEC_INSTALL_SCRIPTS: false
614:  EMPTY_PACKAGES_BEHAVIOR: error
615:  DEBUG: false
...

958:  ✔ author already exists, no pads
959:  ✔ author already exists, on different pad
960:  ✔ author already exists, on same pad
961:  enforces consistent pad ID
962:  ✔ pad record has different pad ID
963:  ✔ globalAuthor record has different pad ID
964:  ✔ pad rev record has different pad ID
965:  order of records does not matter
966:  ✔ [0,1,2]
967:  ✔ [0,2,1]
968:  ✔ [1,0,2]
969:  ✔ [1,2,0]
970:  ✔ [2,0,1]
971:  ✔ [2,1,0]
972:  old .etherpad imports without author metadata
973:  ✔ imports without error when revision lacks meta.author
974:  ✔ getRevisionAuthor returns empty string for missing author
975:  exportEtherpadAdditionalContent
976:  ✔ imports from custom prefix
977:  ✔ rejects records for pad with similar ID
978:  /home/runner/work/etherpad/etherpad/src/tests/backend/specs/LinkInstaller.ts
979:  readFileSync with plain paths (bug fix)
980:  ✔ reads a plugin package.json using a plain file path and utf-8
981:  ✔ path.join produces a plain string path, not a URL object
982:  addSubDependency-style resolution
983:  ✔ recursively resolves nested dependencies from package.json files
984:  error handling when package.json is missing
985:  ✔ logs an error instead of crashing when package.json does not exist
986:  /home/runner/work/etherpad/etherpad/src/tests/backend/specs/Pad.ts
...

1143:  ✔ does not start until needed
1144:  ✔ fewer than buffer size
1145:  ✔ exactly buffer size
1146:  ✔ more than buffer size
1147:  ✔ buffered Promise rejections are suppressed while iterating (102ms)
1148:  ✔ buffered Promise rejections are unsuppressed when iteration completes (100ms)
1149:  map
1150:  ✔ empty
1151:  ✔ does not start until needed
1152:  ✔ works
1153:  /home/runner/work/etherpad/etherpad/src/tests/backend/specs/anonymizeAuthor.ts
1154:  ✔ zeroes the display identity on globalAuthor:<id>
1155:  ✔ drops token2author and mapper2author mappings pointing at the author
1156:  ✔ is idempotent — second call returns zero counters
1157:  ✔ returns zero counters for an unknown authorID
1158:  ✔ re-runs the sweep when a prior call errored before setting erased=true
1159:  ✔ dryRun returns the same counter shape but does not mutate the record
...

1208:  �[32m[2026-05-17T13:04:38.075] [INFO] access - �[39m[LEAVE] pad:testChatPad socket:v-7r1zai1gf2hcBxAAAB IP:ANONYMOUS authorID:a.2LVlasTSGaaJORlJ
1209:  �[33m[2026-05-17T13:04:38.086] [WARN] message - �[39mclient sent author token via CLIENT_READY message; cookie migration will take effect on next HTTP response. See docs/superpowers/specs/2026-04-19-gdpr-pr3-anon-identity-design.md
1210:  �[32m[2026-05-17T13:04:38.089] [INFO] access - �[39m[CREATE] pad:testChatPad socket:DANqwJMNJfSM-SgVAAAD IP:ANONYMOUS authorID:a.XVZlnWgkFILR9Rev
1211:  ✔ pad
1212:  �[32m[2026-05-17T13:04:38.093] [INFO] access - �[39m[LEAVE] pad:testChatPad socket:DANqwJMNJfSM-SgVAAAD IP:ANONYMOUS authorID:a.XVZlnWgkFILR9Rev
1213:  �[33m[2026-05-17T13:04:38.103] [WARN] message - �[39mclient sent author token via CLIENT_READY message; cookie migration will take effect on next HTTP response. See docs/superpowers/specs/2026-04-19-gdpr-pr3-anon-identity-design.md
1214:  �[32m[2026-05-17T13:04:38.105] [INFO] access - �[39m[CREATE] pad:testChatPad socket:lHrMA2fJqlGmXG3dAAAF IP:ANONYMOUS authorID:a.lPHvnxP1xCCBhAgf
1215:  ✔ padId
1216:  �[32m[2026-05-17T13:04:38.110] [INFO] access - �[39m[LEAVE] pad:testChatPad socket:lHrMA2fJqlGmXG3dAAAF IP:ANONYMOUS authorID:a.lPHvnxP1xCCBhAgf
1217:  �[33m[2026-05-17T13:04:38.120] [WARN] message - �[39mclient sent author token via CLIENT_READY message; cookie migration will take effect on next HTTP response. See docs/superpowers/specs/2026-04-19-gdpr-pr3-anon-identity-design.md
1218:  �[32m[2026-05-17T13:04:38.123] [INFO] access - �[39m[CREATE] pad:testChatPad socket:TDO0Qi0hE73MM6EJAAAH IP:ANONYMOUS authorID:a.N1tokaDVdEJDVBLa
1219:  ✔ mutations propagate
1220:  �[32m[2026-05-17T13:04:38.128] [INFO] access - �[39m[LEAVE] pad:testChatPad socket:TDO0Qi0hE73MM6EJAAAH IP:ANONYMOUS authorID:a.N1tokaDVdEJDVBLa
1221:  /home/runner/work/etherpad/etherpad/src/tests/backend/specs/clientvar_rev_consistency.ts
1222:  �[33m[2026-05-17T13:04:38.148] [WARN] settings - �[39mbypassing socket.io authentication and authorization checks due to settings.loadTest
1223:  �[91m[2026-05-17T13:04:38.150] [ERROR] message - �[39mThere is no author for authorId: a.etherpad-system. This is possibly related to https://github.com/ether/etherpad-lite/issues/2802
1224:  �[32m[2026-05-17T13:04:38.150] [INFO] access - �[39m[ENTER] pad:hDJqKEg3C6 socket:qCQFIWUKa7K1dRRfAAAJ IP:ANONYMOUS authorID:a.F6doKzpCEbCi2uBG
1225:  ✔ CLIENT_VARS rev matches initialAttributedText state at that exact rev
1226:  �[32m[2026-05-17T13:04:38.154] [INFO] access - �[39m[LEAVE] pad:hDJqKEg3C6 socket:qCQFIWUKa7K1dRRfAAAJ IP:ANONYMOUS authorID:a.F6doKzpCEbCi2uBG
1227:  �[33m[2026-05-17T13:04:38.186] [WARN] settings - �[39mbypassing socket.io authentication and authorization checks due to settings.loadTest
1228:  �[91m[2026-05-17T13:04:38.187] [ERROR] message - �[39mThere is no author for authorId: a.etherpad-system. This is possibly related to https://github.com/ether/etherpad-lite/issues/2802
1229:  �[32m[2026-05-17T13:04:38.187] [INFO] access - �[39m[ENTER] pad:25zJLr9pXL socket:APLFATR8skqwn13UAAAL IP:ANONYMOUS authorID:a.kP9WFq5uo2Y20HhF
...

1260:  textColorFromBackgroundColor — invariant
1261:  ✔ always picks whichever of black/white gives the higher contrast
1262:  /home/runner/work/etherpad/etherpad/src/tests/backend/specs/compactPad.ts
1263:  API.compactPad()
1264:  ✔ collapses all history when keepRevisions is omitted
1265:  ✔ keeps only the last N revisions when keepRevisions is a number
1266:  ✔ rejects negative keepRevisions
1267:  ✔ rejects non-numeric keepRevisions
1268:  ✔ rejects fractional keepRevisions
1269:  ✔ refuses to run when cleanup.enabled is false
1270:  HTTP API dispatch (1.3.1)
1271:  ✔ passes keepRevisions from query string into compactPad
1272:  ✔ collapses all history when keepRevisions is absent from URL
1273:  runCompactAll (bin/compactAllPads loop)
1274:  ✔ parses --keep / --dry-run / no args
1275:  �[91m[2026-05-17T13:04:39.712] [ERROR] settings - �[39m--keep expects a non-negative integer; got abc
1276:  �[91m[2026-05-17T13:04:39.712] [ERROR] settings - �[39m--keep expects a non-negative integer; got -1
1277:  ✔ rejects --keep with non-integer / negative / unknown args
1278:  ✔ compacts every pad and tallies before/after revisions
1279:  ✔ honours --keep N by passing it through to compactPad
1280:  ✔ --dry-run does not call compactPad
1281:  ✔ keeps going when one pad fails to compact
1282:  ✔ keeps going when one pad fails the pre-flight count
1283:  ✔ reports listAllPads failure without iterating
1284:  ✔ handles an empty instance
1285:  ✔ end-to-end against the real HTTP handler (38ms)
1286:  runCompactStale (bin/compactStalePads loop)
1287:  ✔ parses --older-than / --keep / --dry-run
1288:  �[91m[2026-05-17T13:04:39.754] [ERROR] settings - �[39m--older-than is required
1289:  �[91m[2026-05-17T13:04:39.754] [ERROR] settings - �[39m--older-than is required
1290:  �[91m[2026-05-17T13:04:39.754] [ERROR] settings - �[39m--older-than expects a non-negative integer; got abc
1291:  �[91m[2026-05-17T13:04:39.754] [ERROR] settings - �[39m--older-than expects a non-negative integer; got -1
1292:  ✔ rejects missing / invalid --older-than and unknown args
1293:  ✔ only compacts pads older than the cutoff
1294:  ✔ honours --keep N for stale pads
1295:  ✔ --dry-run does not call compactPad on stale pads
1296:  ✔ keeps going when one stale pad fails to compact
1297:  ✔ counts a getLastEdited failure as a failure but keeps going
1298:  ✔ reports listAllPads failure without iterating
1299:  ✔ handles an empty instance
1300:  ✔ handles an instance where every pad is fresh
1301:  ✔ skips a pad that gets edited between selection and compaction
1302:  ✔ counts a getLastEdited recheck failure as a failure
1303:  ✔ --older-than 0 treats every pad as stale
...

1331:  ✔ text matches
1332:  ✔ alines match
1333:  ✔ attributes are sorted in canonical order
1334:  A single completely empty line break within an ol should reset count if OL is closed off..
1335:  ✔ text matches
1336:  ✔ alines match
1337:  ✔ attributes are sorted in canonical order
1338:  A single <p></p> should create a new line
1339:  ✔ text matches
1340:  ✔ alines match
1341:  ✔ attributes are sorted in canonical order
1342:  Tests if ols properly get line numbers when in a normal OL #2
1343:  ✔ text matches
1344:  ✔ alines match
1345:  ✔ attributes are sorted in canonical order
1346:  First item being an UL then subsequent being OL will fail
1347:  - text matches
...

1518:  at Object.opAttributeValue (/home/runner/work/etherpad/etherpad/src/static/js/Changeset.ts:1187:12)
1519:  at Object.getLineHTMLForExport [as hook_fn] (/home/runner/work/etherpad/etherpad/src/plugin_packages/.versions/ep_plugin_helpers@0.5.3/attributes-server.js:18:28)
1520:  at <anonymous> (/home/runner/work/etherpad/etherpad/src/static/js/pluginfw/hooks.ts:273:18)
1521:  at new Promise (<anonymous>)
1522:  at callHookFnAsync (/home/runner/work/etherpad/etherpad/src/static/js/pluginfw/hooks.ts:236:16)
1523:  at <anonymous> (/home/runner/work/etherpad/etherpad/src/static/js/pluginfw/hooks.ts:351:54)
1524:  at Array.map (<anonymous>)
1525:  at Object.exports.aCallAll (/home/runner/work/etherpad/etherpad/src/static/js/pluginfw/hooks.ts:351:13)
1526:  at getHTMLFromAtext (/home/runner/work/etherpad/etherpad/src/node/utils/ExportHtml.ts:504:19)
1527:  at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
1528:  at async getPadHTML (/home/runner/work/etherpad/etherpad/src/node/utils/ExportHtml.ts:43:10)
1529:  at async Object.exports.getPadHTMLDocument (/home/runner/work/etherpad/etherpad/src/node/utils/ExportHtml.ts:522:14)
1530:  at async Object.exports.doExport (/home/runner/work/etherpad/etherpad/src/node/handler/ExportHandler.ts:80:16)
1531:  at async <anonymous> (/home/runner/work/etherpad/etherpad/src/node/hooks/express/importexport.ts:72:9)
1532:  �[32m[2026-05-17T13:04:40.204] [INFO] LibreOffice - �[39m[2958] Converting /tmp/etherpad_export_2703100098.html to odt in /tmp
1533:  �[91m[2026-05-17T13:04:40.206] [ERROR] LibreOffice - �[39m[2958] Conversion failed: Error: Command exited with code 1: /bin/false --headless --invisible --nologo --nolockcheck --writer --convert-to odt /tmp/etherpad_export_2703100098.html --outdir /tmp
1534:  at exports (/home/runner/work/etherpad/etherpad/src/node/utils/run_cmd.ts:124:48)
1535:  at doConvertTask (/home/runner/work/etherpad/etherpad/src/node/utils/LibreOffice.ts:38:13)
1536:  at /home/runner/work/etherpad/etherpad/node_modules/.pnpm/async@3.2.6/node_modules/async/dist/async.js:151:38
1537:  at /home/runner/work/etherpad/etherpad/node_modules/.pnpm/async@3.2.6/node_modules/async/dist/async.js:4017:13
1538:  at Object.process (/home/runner/work/etherpad/etherpad/node_modules/.pnpm/async@3.2.6/node_modules/async/dist/async.js:1680:21)
1539:  at /home/runner/work/etherpad/etherpad/node_modules/.pnpm/async@3.2.6/node_modules/async/dist/async.js:1532:23
1540:  at /home/runner/work/etherpad/etherpad/node_modules/.pnpm/async@3.2.6/node_modules/async/dist/async.js:74:45
1541:  �[91m[2026-05-17T13:04:40.208] [ERROR] settings - �[39mError: Command exited with code 1: /bin/false --headless --invisible --nologo --nolockcheck --writer --convert-to odt /tmp/etherpad_export_2703100098.html --outdir /tmp
1542:  at exports (/home/runner/work/etherpad/etherpad/src/node/utils/run_cmd.ts:124:48)
1543:  at doConvertTask (/home/runner/work/etherpad/etherpad/src/node/utils/LibreOffice.ts:38:13)
1544:  at /home/runner/work/etherpad/etherpad/node_modules/.pnpm/async@3.2.6/node_modules/async/dist/async.js:151:38
1545:  at /home/runner/work/etherpad/etherpad/node_modules/.pnpm/async@3.2.6/node_modules/async/dist/async.js:4017:13
1546:  at Object.process (/home/runner/work/etherpad/etherpad/node_modules/.pnpm/async@3.2.6/node_modules/async/dist/async.js:1680:21)
1547:  at /home/runner/work/etherpad/etherpad/node_modules/.pnpm/async@3.2.6/node_modules/async/dist/async.js:1532:23
1548:  at /home/runner/work/etherpad/etherpad/node_modules/.pnpm/async@3.2.6/node_modules/async/dist/async.js:74:45
1549:  ✔ returns 500 on export error
1550:  native DOCX export (#7538)
1551:  �[32m[2026-05-17T13:04:40.212] [INFO] settings - �[39mExporting pad "testExportPad" in docx format
1552:  ✔ returns a valid DOCX archive (PK zip signature) (218ms)
1553:  �[32m[2026-05-17T13:04:40.430] [INFO] settings - �[39mExporting pad "testExportPad" in docx format
1554:  ✔ sends the Word-processing-ml content-type
1555:  native PDF export (#7538)
1556:  �[32m[2026-05-17T13:04:40.446] [INFO] settings - �[39mExporting pad "testExportPad" in pdf format
1557:  ✔ returns a valid %PDF- document (107ms)
1558:  �[32m[2026-05-17T13:04:40.555] [INFO] settings - �[39mExporting pad "testExportPad" in pdf format
1559:  ✔ sends application/pdf content-type
1560:  odt without soffice (#7538)
1561:  �[91m[2026-05-17T13:04:40.580] [ERROR] settings - �[39mImpossible to export pad "testExportPad" in odt format. There is no converter configured
1562:  ✔ returns the "not enabled" message for odt
...

2116:  at new Promise (<anonymous>)
2117:  at callHookFnAsync (/home/runner/work/etherpad/etherpad/src/static/js/pluginfw/hooks.ts:236:16)
2118:  at <anonymous> (/home/runner/work/etherpad/etherpad/src/static/js/pluginfw/hooks.ts:351:54)
2119:  at Array.map (<anonymous>)
2120:  at Object.exports.aCallAll (/home/runner/work/etherpad/etherpad/src/static/js/pluginfw/hooks.ts:351:13)
2121:  at getHTMLFromAtext (/home/runner/work/etherpad/etherpad/src/node/utils/ExportHtml.ts:504:19)
2122:  at async Object.getPadHTML (/home/runner/work/etherpad/etherpad/src/node/utils/ExportHtml.ts:43:10)
2123:  at async Context.<anonymous> (/home/runner/work/etherpad/etherpad/src/tests/backend/specs/export_list.ts:128:18)
2124:  ✔ nested ordered list counters reset when closing levels
2125:  /home/runner/work/etherpad/etherpad/src/tests/backend/specs/favicon.ts
2126:  ✔ uses custom favicon if set (relative pathname)
2127:  ✔ uses custom favicon from url
2128:  ✔ uses custom favicon if set (absolute pathname)
2129:  ✔ falls back if custom favicon is missing
2130:  ✔ uses skin favicon if present
2131:  �[91m[2026-05-17T13:04:40.838] [ERROR] settings - �[39m(node:2919) [DEP0147] DeprecationWarning: In future versions of Node.js, fs.rmdir(path, { recursive: true }) will be removed. Use fs.rm(path, { recursive: true }) instead
2132:  (Use `node --trace-deprecation ...` to show where the warning was created)
...

2485:  ✔ defer call cb(unrejectedPromise) then defer call to cb(resolvedPromise) (diff. outcomes) -> log+throw
2486:  ✔ defer call cb(unrejectedPromise) then defer call to cb(rejectedPromise) (diff. outcomes) -> log+throw
2487:  ✔ defer call cb(unrejectedPromise) then defer call to cb(rejectedPromise) (same outcome) -> only log
2488:  ✔ defer call cb(unrejectedPromise) then defer call to cb(unresolvedPromise) (diff. outcomes) -> log+throw
2489:  ✔ defer call cb(unrejectedPromise) then defer call cb(unrejectedPromise) (diff. outcomes) -> log+throw
2490:  ✔ defer call cb(unrejectedPromise) then defer call cb(unrejectedPromise) (same outcome) -> only log
2491:  hooks.aCallAll
2492:  basic behavior
2493:  ✔ calls all asynchronously, returns values in order
2494:  ✔ passes hook name
2495:  ✔ undefined context -> {}
2496:  ✔ null context -> {}
2497:  ✔ context unmodified
2498:  aCallAll callback
2499:  ✔ exception in callback rejects
2500:  ✔ propagates error on exception
2501:  ✔ propagages null error on success
2502:  ✔ propagages results on success
...

2599:  /home/runner/work/etherpad/etherpad/src/tests/backend/specs/lowerCasePadIds.ts
2600:  not activated
2601:  ✔ do nothing
2602:  activated
2603:  ✔ lowercase pad ids
2604:  �[32m[2026-05-17T13:04:41.718] [INFO] access - �[39m[CREATE] pad:ALREADYexistingPad socket:zVapTH7zpzSvJ_WzAAAP IP:ANONYMOUS authorID:a.NuAbrrjCqMAWNldh
2605:  �[32m[2026-05-17T13:04:41.734] [INFO] access - �[39m[CREATE] pad:alreadyexistingpad socket:F_nTvx8CgWOc6D-7AAAR IP:ANONYMOUS authorID:a.LEm6YBB9Z3W9FTH1
2606:  ✔ keeps old pads accessible
2607:  �[32m[2026-05-17T13:04:41.744] [INFO] access - �[39m[LEAVE] pad:alreadyexistingpad socket:F_nTvx8CgWOc6D-7AAAR IP:ANONYMOUS authorID:a.LEm6YBB9Z3W9FTH1
2608:  �[32m[2026-05-17T13:04:41.744] [INFO] access - �[39m[LEAVE] pad:ALREADYexistingPad socket:zVapTH7zpzSvJ_WzAAAP IP:ANONYMOUS authorID:a.NuAbrrjCqMAWNldh
2609:  �[32m[2026-05-17T13:04:41.759] [INFO] access - �[39m[CREATE] pad:maliciousattempt socket:are9N-W_mOo2LsaAAAAT IP:ANONYMOUS authorID:a.SaZaFIyDAyrhBj1Y
2610:  ✔ disallow creation of different case pad-name via socket connection
2611:  �[32m[2026-05-17T13:04:41.761] [INFO] access - �[39m[LEAVE] pad:maliciousattempt socket:are9N-W_mOo2LsaAAAAT IP:ANONYMOUS authorID:a.SaZaFIyDAyrhBj1Y
2612:  /home/runner/work/etherpad/etherpad/src/tests/backend/specs/messages.ts
2613:  CHANGESET_REQ
2614:  �[91m[2026-05-17T13:04:41.776] [ERROR] message - �[39mThere is no author for authorId: a.etherpad-system. This is possibly related to https://github.com/ether/etherpad-lite/issues/2802
2615:  �[32m[2026-05-17T13:04:41.776] [INFO] access - �[39m[ENTER] pad:zeS2SGgzpk socket:4ek6_hWn_QP7IncwAAAV IP:ANONYMOUS authorID:a.utqled6c1yRxTnAX
2616:  �[91m[2026-05-17T13:04:41.790] [ERROR] message - �[39mThere is no author for authorId: a.etherpad-system. This is possibly related to https://github.com/ether/etherpad-lite/issues/2802
2617:  �[32m[2026-05-17T13:04:41.790] [INFO] access - �[39m[ENTER] pad:zeS2SGgzpk socket:V506TtAvFCSFnidoAAAX IP:ANONYMOUS authorID:a.8WiI3CfIEYFtP1rb
2618:  ✔ users are unable to read changesets from other pads
2619:  �[32m[2026-05-17T13:04:42.800] [INFO] access - �[39m[LEAVE] pad:zeS2SGgzpk socket:4ek6_hWn_QP7IncwAAAV IP:ANONYMOUS authorID:a.utqled6c1yRxTnAX
2620:  �[32m[2026-05-17T13:04:42.800] [INFO] access - �[39m[LEAVE] pad:zeS2SGgzpk socket:V506TtAvFCSFnidoAAAX IP:ANONYMOUS authorID:a.8WiI3CfIEYFtP1rb
2621:  �[91m[2026-05-17T13:04:42.815] [ERROR] message - �[39mThere is no author for authorId: a.etherpad-system. This is possibly related to https://github.com/ether/etherpad-lite/issues/2802
2622:  �[32m[2026-05-17T13:04:42.815] [INFO] access - �[39m[ENTER] pad:iAKe6M8fL0 socket:97I6hkXaY5KraSkrAAAZ IP:ANONYMOUS authorID:a.b14JAdizu0Cgwz24
2623:  �[91m[2026-05-17T13:04:42.828] [ERROR] message - �[39mThere is no author for authorId: a.etherpad-system. This is possibly related to https://github.com/ether/etherpad-lite/issues/2802
2624:  �[32m[2026-05-17T13:04:42.828] [INFO] access - �[39m[ENTER] pad:iAKe6M8fL0 socket:XykGlxbIFfIjk7xsAAAb IP:ANONYMOUS authorID:a.pK5aXfbBq4sN1pUU
2625:  �[91m[2026-05-17T13:04:43.833] [ERROR] socket.io - �[39mError handling pad message from XykGlxbIFfIjk7xsAAAb: Error: CHANGESET_REQ: rev is not a number
2626:  at Object.exports.handleMessage (/home/runner/work/etherpad/etherpad/src/node/handler/PadMessageHandler.ts:612:11)
2627:  at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
2628:  at async <anonymous> (/home/runner/work/etherpad/etherpad/src/node/handler/SocketIORouter.ts:85:14)
2629:  ✔ CHANGESET_REQ: verify revNum is a number (regression)
2630:  �[32m[2026-05-17T13:04:43.837] [INFO] access - �[39m[LEAVE] pad:iAKe6M8fL0 socket:97I6hkXaY5KraSkrAAAZ IP:ANONYMOUS authorID:a.b14JAdizu0Cgwz24
2631:  �[32m[2026-05-17T13:04:43.837] [INFO] access - �[39m[LEAVE] pad:iAKe6M8fL0 socket:XykGlxbIFfIjk7xsAAAb IP:ANONYMOUS authorID:a.pK5aXfbBq4sN1pUU
2632:  �[91m[2026-05-17T13:04:43.852] [ERROR] message - �[39mThere is no author for authorId: a.etherpad-system. This is possibly related to https://github.com/ether/etherpad-lite/issues/2802
2633:  �[32m[2026-05-17T13:04:43.852] [INFO] access - �[39m[ENTER] pad:fnaeGb52D8 socket:wx-YpEHhO9l9OKg6AAAd IP:ANONYMOUS authorID:a.UnOfxEjgXyQYJzmh
2634:  �[91m[2026-05-17T13:04:43.864] [ERROR] message - �[39mThere is no author for authorId: a.etherpad-system. This is possibly related to https://github.com/ether/etherpad-lite/issues/2802
2635:  �[32m[2026-05-17T13:04:43.864] [INFO] access - �[39m[ENTER] pad:fnaeGb52D8 socket:4B1NYsJ11XqZzepYAAAf IP:ANONYMOUS authorID:a.yvwKMynhu4XRqnVo
2636:  ✔ CHANGESET_REQ: revNum is converted to number if possible (regression)
2637:  �[32m[2026-05-17T13:04:44.872] [INFO] access - �[39m[LEAVE] pad:fnaeGb52D8 socket:wx-YpEHhO9l9OKg6AAAd IP:ANONYMOUS authorID:a.UnOfxEjgXyQYJzmh
2638:  �[32m[2026-05-17T13:04:44.872] [INFO] access - �[39m[LEAVE] pad:fnaeGb52D8 socket:4B1NYsJ11XqZzepYAAAf IP:ANONYMOUS authorID:a.yvwKMynhu4XRqnVo
2639:  �[91m[2026-05-17T13:04:44.887] [ERROR] message - �[39mThere is no author for authorId: a.etherpad-system. This is possibly related to https://github.com/ether/etherpad-lite/issues/2802
2640:  �[32m[2026-05-17T13:04:44.887] [INFO] access - �[39m[ENTER] pad:JExXDFXw8A socket:N3C3bYdN38Biq6RmAAAh IP:ANONYMOUS authorID:a.O88lgDAYqzSMhNV7
2641:  �[91m[2026-05-17T13:04:44.899] [ERROR] message - �[39mThere is no author for authorId: a.etherpad-system. This is possibly related to https://github.com/ether/etherpad-lite/issues/2802
2642:  �[32m[2026-05-17T13:04:44.900] [INFO] access - �[39m[ENTER] pad:JExXDFXw8A socket:AzQo4Xtxtqq1dIzeAAAj IP:ANONYMOUS authorID:a.iJkIvIt6mTqZLfIU
2643:  ✔ CHANGESET_REQ: revNum 2 is converted to head rev 1 (regression)
2644:  �[32m[2026-05-17T13:04:45.908] [INFO] access - �[39m[LEAVE] pad:JExXDFXw8A socket:N3C3bYdN38Biq6RmAAAh IP:ANONYMOUS authorID:a.O88lgDAYqzSMhNV7
2645:  �[32m[2026-05-17T13:04:45.908] [INFO] access - �[39m[LEAVE] pad:JExXDFXw8A socket:AzQo4Xtxtqq1dIzeAAAj IP:ANONYMOUS authorID:a.iJkIvIt6mTqZLfIU
2646:  USER_CHANGES
2647:  �[91m[2026-05-17T13:04:45.922] [ERROR] message - �[39mThere is no author for authorId: a.etherpad-system. This is possibly related to https://github.com/ether/etherpad-lite/issues/2802
2648:  �[32m[2026-05-17T13:04:45.922] [INFO] access - �[39m[ENTER] pad:m6twWc0d2d socket:1tixT8UIbl0FetCPAAAl IP:ANONYMOUS authorID:a.KlD4d7E0kG4X9whj
2649:  �[91m[2026-05-17T13:04:45.934] [ERROR] message - �[39mThere is no author for authorId: a.etherpad-system. This is possibly related to https://github.com/ether/etherpad-lite/issues/2802
2650:  �[32m[2026-05-17T13:04:45.934] [INFO] access - �[39m[ENTER] pad:m6twWc0d2d socket:rDC2abxL8DQmZ3osAAAn IP:ANONYMOUS authorID:a.DIZCAN7wel3uxiFl
2651:  ✔ changes are applied
2652:  �[32m[2026-05-17T13:04:46.941] [INFO] access - �[39m[LEAVE] pad:m6twWc0d2d socket:1tixT8UIbl0FetCPAAAl IP:ANONYMOUS authorID:a.KlD4d7E0kG4X9whj
2653:  �[32m[2026-05-17T13:04:46.942] [INFO] access - �[39m[LEAVE] pad:m6twWc0d2d socket:rDC2abxL8DQmZ3osAAAn IP:ANONYMOUS authorID:a.DIZCAN7wel3uxiFl
2654:  �[91m[2026-05-17T13:04:46.957] [ERROR] message - �[39mThere is no author for authorId: a.etherpad-system. This is possibly related to https://github.com/ether/etherpad-lite/issues/2802
2655:  �[32m[2026-05-17T13:04:46.957] [INFO] access - �[39m[ENTER] pad:93wHXYwgO7 socket:w6st2BZ_slxK-COHAAAp IP:ANONYMOUS authorID:a.APrzRP8FxxhS0NMv
2656:  �[91m[2026-05-17T13:04:46.969] [ERROR] message - �[39mThere is no author for authorId: a.etherpad-system. This is possibly related to https://github.com/ether/etherpad-lite/issues/2802
2657:  �[32m[2026-05-17T13:04:46.969] [INFO] access - �[39m[ENTER] pad:93wHXYwgO7 socket:95F2DOp1IH_QwLGIAAAr IP:ANONYMOUS authorID:a.HDDKmciBLh58838B
2658:  �[33m[2026-05-17T13:04:47.971] [WARN] message - �[39mFailed to apply USER_CHANGES from author a.APrzRP8FxxhS0NMv (socket w6st2BZ_slxK-COHAAAp) on pad 93wHXYwgO7: Error: Not a changeset: this is not a valid changeset
2659:  at error (/home/runner/work/etherpad/etherpad/src/static/js/Changeset.ts:64:13)
2660:  at unpack (/home/runner/work/etherpad/etherpad/src/static/js/Changeset.ts:363:44)
2661:  at checkRep (/home/runner/work/etherpad/etherpad/src/static/js/Changeset.ts:246:20)
2662:  at handleUserChanges (/home/runner/work/etherpad/etherpad/src/node/handler/PadMessageHandler.ts:840:5)
2663:  at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
2664:  ✔ bad changeset is rejected
2665:  �[32m[2026-05-17T13:04:47.974] [INFO] access - �[39m[LEAVE] pad:93wHXYwgO7 socket:w6st2BZ_slxK-COHAAAp IP:ANONYMOUS authorID:a.APrzRP8FxxhS0NMv
2666:  �[32m[2026-05-17T13:04:47.974] [INFO] access - �[39m[LEAVE] pad:93wHXYwgO7 socket:95F2DOp1IH_QwLGIAAAr IP:ANONYMOUS authorID:a.HDDKmciBLh58838B
2667:  �[91m[2026-05-17T13:04:47.993] [ERROR] message - �[39mThere is no author for authorId: a.etherpad-system. This is possibly related to https://github.com/ether/etherpad-lite/issues/2802
2668:  �[32m[2026-05-17T13:04:47.993] [INFO] access - �[39m[ENTER] pad:GcE17DBW6i socket:TB_wNm0IUDhe56ImAAAt IP:ANONYMOUS authorID:a.YtKKH4hzSYW2SOvL
2669:  �[91m[2026-05-17T13:04:48.005] [ERROR] message - �[39mThere is no author for authorId: a.etherpad-system. This is possibly related to https://github.com/ether/etherpad-lite/issues/2802
2670:  �[32m[2026-05-17T13:04:48.005] [INFO] access - �[39m[ENTER] pad:GcE17DBW6i socket:Eh_vVHWTEmwDmD1cAAAv IP:ANONYMOUS authorID:a.9MnfXOYNktWrvBMZ
2671:  �[33m[2026-05-17T13:04:49.008] [WARN] message - �[39mFailed to apply USER_CHANGES from author a.YtKKH4hzSYW2SOvL (socket TB_wNm0IUDhe56ImAAAt) on pad GcE17DBW6i: Error: Author a.YtKKH4hzSYW2SOvL submitted an insert without an author attribute in changeset Z:1>5+5$hello
2672:  at handleUserChanges (/home/runner/work/etherpad/etherpad/src/node/handler/PadMessageHandler.ts:887:15)
2673:  at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
2674:  ✔ insert without author attribute is rejected
2675:  �[32m[2026-05-17T13:04:49.010] [INFO] access - �[39m[LEAVE] pad:GcE17DBW6i socket:TB_wNm0IUDhe56ImAAAt IP:ANONYMOUS authorID:a.YtKKH4hzSYW2SOvL
2676:  �[32m[2026-05-17T13:04:49.011] [INFO] access - �[39m[LEAVE] pad:GcE17DBW6i socket:Eh_vVHWTEmwDmD1cAAAv IP:ANONYMOUS authorID:a.9MnfXOYNktWrvBMZ
2677:  �[91m[2026-05-17T13:04:49.025] [ERROR] message - �[39mThere is no author for authorId: a.etherpad-system. This is possibly related to https://github.com/ether/etherpad-lite/issues/2802
2678:  �[32m[2026-05-17T13:04:49.025] [INFO] access - �[39m[ENTER] pad:w3kt8OTDUa socket:T28oezsknreIbMBJAAAx IP:ANONYMOUS authorID:a.C4wQzulFrXVySZjs
2679:  �[91m[2026-05-17T13:04:49.037] [ERROR] message - �[39mThere is no author for authorId: a.etherpad-system. This is possibly related to https://github.com/ether/etherpad-lite/issues/2802
2680:  �[32m[2026-05-17T13:04:49.037] [INFO] access - �[39m[ENTER] pad:w3kt8OTDUa socket:LxoqgGO81nMoGCJPAAAz IP:ANONYMOUS authorID:a.ZZ8d44YWaPlMk41S
2681:  �[33m[2026-05-17T13:04:50.040] [WARN] message - �[39mFailed to apply USER_CHANGES from author a.C4wQzulFrXVySZjs (socket T28oezsknreIbMBJAAAx) on pad w3kt8OTDUa: Error: Author a.C4wQzulFrXVySZjs tried to submit changes as author a.etherpad-system in changeset Z:1>5*0+5$hello
2682:  at handleUserChanges (/home/runner/work/etherpad/etherpad/src/node/handler/PadMessageHandler.ts:874:17)
2683:  at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
2684:  ✔ insert claiming the reserved system author is rejected
2685:  �[32m[2026-05-17T13:04:50.042] [INFO] access - �[39m[LEAVE] pad:w3kt8OTDUa socket:T28oezsknreIbMBJAAAx IP:ANONYMOUS authorID:a.C4wQzulFrXVySZjs
2686:  �[32m[2026-05-17T13:04:50.043] [INFO] access - �[39m[LEAVE] pad:w3kt8OTDUa socket:LxoqgGO81nMoGCJPAAAz IP:ANONYMOUS authorID:a.ZZ8d44YWaPlMk41S
2687:  �[91m[2026-05-17T13:04:50.058] [ERROR] message - �[39mThere is no author for authorId: a.etherpad-system. This is possibly related to https://github.com/ether/etherpad-lite/issues/2802
2688:  �[32m[2026-05-17T13:04:50.058] [INFO] access - �[39m[ENTER] pad:MBDxTMVSSj socket:kY5spQeG0Zo1OPvrAAA1 IP:ANONYMOUS authorID:a.ZlulnY7EysJryMCx
2689:  �[91m[2026-05-17T13:04:50.068] [ERROR] message - �[39mThere is no author for authorId: a.etherpad-system. This is possibly related to https://github.com/ether/etherpad-lite/issues/2802
2690:  �[32m[2026-05-17T13:04:50.069] [INFO] access - �[39m[ENTER] pad:MBDxTMVSSj socket:jWC9HrMUXHLhNndaAAA3 IP:ANONYMOUS authorID:a.X8gk5oH3QWaNK1iO
2691:  �[33m[2026-05-17T13:04:51.073] [WARN] message - �[39mFailed to apply USER_CHANGES from author a.ZlulnY7EysJryMCx (socket kY5spQeG0Zo1OPvrAAA1) on pad MBDxTMVSSj: Error: Rejected USER_CHANGES whose application would leave the pad without a trailing '\n' (length 7). Every USER_CHANGES must preserve the "doc ends with \n" invariant.
2692:  at handleUserChanges (/home/runner/work/etherpad/etherpad/src/node/handler/PadMessageHandler.ts:960:13)
2693:  at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
2694:  ✔ changeset that would strand the trailing \n is rejected
2695:  �[32m[2026-05-17T13:04:51.076] [INFO] access - �[39m[LEAVE] pad:MBDxTMVSSj socket:kY5spQeG0Zo1OPvrAAA1 IP:ANONYMOUS authorID:a.ZlulnY7EysJryMCx
2696:  �[32m[2026-05-17T13:04:51.077] [INFO] access - �[39m[LEAVE] pad:MBDxTMVSSj socket:jWC9HrMUXHLhNndaAAA3 IP:ANONYMOUS authorID:a.X8gk5oH3QWaNK1iO
2697:  �[91m[2026-05-17T13:04:51.091] [ERROR] message - �[39mThere is no author for authorId: a.etherpad-system. This is possibly related to https://github.com/ether/etherpad-lite/issues/2802
2698:  �[32m[2026-05-17T13:04:51.091] [INFO] access - �[39m[ENTER] pad:QbpLytCD1P socket:Q2Evx_Zgk9BKSrj0AAA5 IP:ANONYMOUS authorID:a.iEFdfGRwXk9bVnki
2699:  �[91m[2026-05-17T13:04:51.102] [ERROR] message - �[39mThere is no author for authorId: a.etherpad-system. This is possibly related to https://github.com/ether/etherpad-lite/issues/2802
2700:  �[32m[2026-05-17T13:04:51.102] [INFO] access - �[39m[ENTER] pad:QbpLytCD1P socket:qhOb_PIpxAme-ji_AAA7 IP:ANONYMOUS authorID:a.VO5WqTZrjUmzZLFj
2701:  ✔ retransmission is accepted, has no effect
2702:  �[32m[2026-05-17T13:04:52.110] [INFO] access - �[39m[LEAVE] pad:QbpLytCD1P socket:Q2Evx_Zgk9BKSrj0AAA5 IP:ANONYMOUS authorID:a.iEFdfGRwXk9bVnki
2703:  �[32m[2026-05-17T13:04:52.110] [INFO] access - �[39m[LEAVE] pad:QbpLytCD1P socket:qhOb_PIpxAme-ji_AAA7 IP:ANONYMOUS authorID:a.VO5WqTZrjUmzZLFj
2704:  �[91m[2026-05-17T13:04:52.124] [ERROR] message - �[39mThere is no author for authorId: a.etherpad-system. This is possibly related to https://github.com/ether/etherpad-lite/issues/2802
2705:  �[32m[2026-05-17T13:04:52.124] [INFO] access - �[39m[ENTER] pad:jWMCXECgvx socket:jrJbLe9_8y_9WhNCAAA9 IP:ANONYMOUS authorID:a.HnT3qLWpLY23bm1s
2706:  �[91m[2026-05-17T13:04:52.136] [ERROR] message - �[39mThere is no author for authorId: a.etherpad-system. This is possibly related to https://github.com/ether/etherpad-lite/issues/2802
2707:  �[32m[2026-05-17T13:04:52.136] [INFO] access - �[39m[ENTER] pad:jWMCXECgvx socket:LPs_v8l2VIXROA0zAAA_ IP:ANONYMOUS authorID:a.11nmGl89p6sqAlAH
2708:  ✔ identity changeset is accepted, has no effect
2709:  �[32m[2026-05-17T13:04:53.143] [INFO] access - �[39m[LEAVE] pad:jWMCXECgvx socket:jrJbLe9_8y_9WhNCAAA9 IP:ANONYMOUS authorID:a.HnT3qLWpLY23bm1s
2710:  �[32m[2026-05-17T13:04:53.144] [INFO] access - �[39m[LEAVE] pad:jWMCXECgvx socket:LPs_v8l2VIXROA0zAAA_ IP:ANONYMOUS authorID:a.11nmGl89p6sqAlAH
2711:  �[91m[2026-05-17T13:04:53.158] [ERROR] message - �[39mThere is no author for authorId: a.etherpad-system. This is possibly related to https://github.com/ether/etherpad-lite/issues/2802
2712:  �[32m[2026-05-17T13:04:53.158] [INFO] access - �[39m[ENTER] pad:wTnuqQkt9H socket:9X2AiXYaYOpvLOlsAABB IP:ANONYMOUS authorID:a.613TmrwkfrjnIFct
2713:  �[91m[2026-05-17T13:04:53.169] [ERROR] message - �[39mThere is no author for authorId: a.etherpad-system. This is possibly related to https://github.com/ether/etherpad-lite/issues/2802
2714:  �[32m[2026-05-17T13:04:53.169] [INFO] access - �[39m[ENTER] pad:wTnuqQkt9H socket:UUa2Z-F6sUgutcUOAABD IP:ANONYMOUS authorID:a.AjkH4amti8JaM0uA
2715:  ✔ non-identity changeset with no net change is accepted, has no effect
2716:  �[32m[2026-05-17T13:04:54.177] [INFO] access - �[39m[LEAVE] pad:wTnuqQkt9H socket:9X2AiXYaYOpvLOlsAABB IP:ANONYMOUS authorID:a.613TmrwkfrjnIFct
2717:  �[32m[2026-05-17T13:04:54.177] [INFO] access - �[39m[LEAVE] pad:wTnuqQkt9H socket:UUa2Z-F6sUgutcUOAABD IP:ANONYMOUS authorID:a.AjkH4amti8JaM0uA
2718:  �[91m[2026-05-17T13:04:54.191] [ERROR] message - �[39mThere is no author for authorId: a.etherpad-system. This is possibly related to https://github.com/ether/etherpad-lite/issues/2802
2719:  �[32m[2026-05-17T13:04:54.191] [INFO] access - �[39m[ENTER] pad:553nB3r0Mp socket:6ilqahlLc58SSFTNAABF IP:ANONYMOUS authorID:a.9rYuMxlGgXumpkwK
2720:  �[91m[2026-05-17T13:04:54.202] [ERROR] message - �[39mThere is no author for authorId: a.etherpad-system. This is possibly related to https://github.com/ether/etherpad-lite/issues/2802
2721:  �[32m[2026-05-17T13:04:54.203] [INFO] access - �[39m[ENTER] pad:553nB3r0Mp socket:1BxE2Vpb9PNQV1DsAABH IP:ANONYMOUS authorID:a.5LOz3n4qC7srIg4e
2722:  �[91m[2026-05-17T13:04:55.205] [ERROR] socket.io - �[39mError handling pad message from 1BxE2Vpb9PNQV1DsAABH: Error: COLLABROOM: write attempt on read-only pad
2723:  at Object.exports.handleMessage (/home/runner/work/etherpad/etherpad/src/node/handler/PadMessageHandler.ts:612:11)
2724:  at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
2725:  at async <anonymous> (/home/runner/work/etherpad/etherpad/src/node/handler/SocketIORouter.ts:85:14)
2726:  �[91m[2026-05-17T13:04:55.209] [ERROR] socket.io - �[39mError handling pad message from 1BxE2Vpb9PNQV1DsAABH: Error: COLLABROOM: write attempt on read-only pad
2727:  at Object.exports.handleMessage (/home/runner/work/etherpad/etherpad/src/node/handler/PadMessageHandler.ts:612:11)
...

2975:  �[32m[2026-05-17T13:04:56.191] [INFO] access - �[39m[CREATE] pad:pad socket:KzkFW_4YCesOLo-XAABh IP:ANONYMOUS authorID:a.GSeEhKAgLyCRQP3H username:user
2976:  �[32m[2026-05-17T13:04:56.193] [INFO] access - �[39m[LEAVE] pad:pad socket:KzkFW_4YCesOLo-XAABh IP:ANONYMOUS authorID:a.GSeEhKAgLyCRQP3H username:user
2977:  �[32m[2026-05-17T13:04:56.194] [INFO] http - �[39mSuccessful authentication from IP ANONYMOUS for user user
2978:  �[32m[2026-05-17T13:04:56.204] [INFO] access - �[39m[CREATE] pad:pad socket:ruk-2sIKZrhaJ_EuAABj IP:ANONYMOUS authorID:a.dXFBsXtmv30nBKGo username:user
2979:  ✔ authn user read-only /p/pad -> 200, ok
2980:  �[32m[2026-05-17T13:04:56.209] [INFO] access - �[39m[LEAVE] pad:pad socket:ruk-2sIKZrhaJ_EuAABj IP:ANONYMOUS authorID:a.dXFBsXtmv30nBKGo username:user
2981:  �[32m[2026-05-17T13:04:56.211] [INFO] http - �[39mSuccessful authentication from IP ANONYMOUS for user user
2982:  �[32m[2026-05-17T13:04:56.223] [INFO] access - �[39m[CREATE] pad:pad socket:jsbWt9vesH35KhAeAABl IP:ANONYMOUS authorID:a.92bBOZKrRSs0Om0t username:user
2983:  ✔ authz user /p/pad -> 200, ok
2984:  �[32m[2026-05-17T13:04:56.225] [INFO] access - �[39m[LEAVE] pad:pad socket:jsbWt9vesH35KhAeAABl IP:ANONYMOUS authorID:a.92bBOZKrRSs0Om0t username:user
2985:  �[32m[2026-05-17T13:04:56.227] [INFO] http - �[39mSuccessful authentication from IP ANONYMOUS for user user
2986:  �[32m[2026-05-17T13:04:56.239] [INFO] access - �[39m[CREATE] pad:päd socket:snzAsMcj32K1BEdJAABn IP:ANONYMOUS authorID:a.vNFtdcZU0t0ZUXVk username:user
2987:  ✔ supports pad names with characters that must be percent-encoded
2988:  �[32m[2026-05-17T13:04:56.242] [INFO] access - �[39m[LEAVE] pad:päd socket:snzAsMcj32K1BEdJAABn IP:ANONYMOUS authorID:a.vNFtdcZU0t0ZUXVk username:user
2989:  Abnormal access attempts
2990:  �[32m[2026-05-17T13:04:56.244] [INFO] http - �[39mFailed authentication from IP ANONYMOUS
2991:  �[33m[2026-05-17T13:04:56.251] [WARN] message - �[39mclient sent author token via CLIENT_READY message; cookie migration will take effect on next HTTP response. See docs/superpowers/specs/2026-04-19-gdpr-pr3-anon-identity-design.md
2992:  �[91m[2026-05-17T13:04:56.252] [ERROR] socket.io - �[39mError handling pad message from pknkMSAP1j_0KQQ4AABp: Error: access denied
2993:  at Object.exports.handleMessage (/home/runner/work/etherpad/etherpad/src/node/handler/PadMessageHandler.ts:508:11)
2994:  at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
2995:  at async <anonymous> (/home/runner/work/etherpad/etherpad/src/node/handler/SocketIORouter.ts:85:14)
2996:  ✔ authn anonymous /p/pad -> 401, error
2997:  �[32m[2026-05-17T13:04:56.254] [INFO] http - �[39mSuccessful authentication from IP ANONYMOUS for user user
2998:  �[32m[2026-05-17T13:04:56.265] [INFO] access - �[39m[CREATE] pad:pad socket:25HzrUvQE9xffNe_AABr IP:ANONYMOUS authorID:a.Yd80EOcqbQ2Gep2s username:user
2999:  �[32m[2026-05-17T13:04:56.267] [INFO] access - �[39m[LEAVE] pad:pad socket:25HzrUvQE9xffNe_AABr IP:ANONYMOUS authorID:a.Yd80EOcqbQ2Gep2s username:user
3000:  �[32m[2026-05-17T13:04:56.268] [INFO] http - �[39mFailed authentication from IP ANONYMOUS
3001:  �[33m[2026-05-17T13:04:56.275] [WARN] message - �[39mclient sent author token via CLIENT_READY message; cookie migration will take effect on next HTTP response. See docs/superpowers/specs/2026-04-19-gdpr-pr3-anon-identity-design.md
3002:  �[91m[2026-05-17T13:04:56.276] [ERROR] socket.io - �[39mError handling pad message from lcsEzB6trCiZcSPGAABt: Error: access denied
3003:  at Object.exports.handleMessage (/home/runner/work/etherpad/etherpad/src/node/handler/PadMessageHandler.ts:508:11)
3004:  at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
3005:  at async <anonymous> (/home/runner/work/etherpad/etherpad/src/node/handler/SocketIORouter.ts:85:14)
3006:  ✔ authn anonymous read-only /p/pad -> 401, error
3007:  �[33m[2026-05-17T13:04:56.284] [WARN] message - �[39mclient sent author token via CLIENT_READY message; cookie migration will take effect on next HTTP response. See docs/superpowers/specs/2026-04-19-gdpr-pr3-anon-identity-design.md
3008:  �[91m[2026-05-17T13:04:56.284] [ERROR] socket.io - �[39mError handling pad message from ZPogMnHQylHa8Q3FAABv: Error: access denied
3009:  at Object.exports.handleMessage (/home/runner/work/etherpad/etherpad/src/node/handler/PadMessageHandler.ts:508:11)
3010:  at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
3011:  at async <anonymous> (/home/runner/work/etherpad/etherpad/src/node/handler/SocketIORouter.ts:85:14)
3012:  ✔ authn !cookie -> error
3013:  �[32m[2026-05-17T13:04:56.293] [INFO] http - �[39mSuccessful authentication from IP ANONYMOUS for user user
3014:  �[91m[2026-05-17T13:04:56.313] [ERROR] socket.io - �[39mError handling pad message from aAH1H014sRGsMXJ6AABx: Error: access denied
3015:  at Object.exports.handleMessage (/home/runner/work/etherpad/etherpad/src/node/handler/PadMessageHandler.ts:508:11)
3016:  at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
3017:  at async <anonymous> (/home/runner/work/etherpad/etherpad/src/node/handler/SocketIORouter.ts:85:14)
3018:  ✔ authorization bypass attempt -> error
3019:  Authorization levels via authorize hook
3020:  �[32m[2026-05-17T13:04:56.319] [INFO] http - �[39mSuccessful authentication from IP ANONYMOUS for user user
3021:  �[32m[2026-05-17T13:04:56.348] [INFO] access - �[39m[CREATE] pad:pad socket:i_jrOmjkCoyDBbliAABz IP:ANONYMOUS authorID:a.7xVR7lVlcr387mav username:user
3022:  ✔ level='create' -> can create
3023:  �[32m[2026-05-17T13:04:56.362] [INFO] access - �[39m[LEAVE] pad:pad socket:i_jrOmjkCoyDBbliAABz IP:ANONYMOUS authorID:a.7xVR7lVlcr387mav username:user
3024:  �[32m[2026-05-17T13:04:56.365] [INFO] http - �[39mSuccessful authentication from IP ANONYMOUS for user user
3025:  �[32m[2026-05-17T13:04:56.380] [INFO] access - �[39m[CREATE] pad:pad socket:wvPRl0iPU1GgkvxTAAB1 IP:ANONYMOUS authorID:a.1r0hGWhUY25qoOI9 username:user
3026:  ✔ level=true -> can create
3027:  �[32m[2026-05-17T13:04:56.383] [INFO] access - �[39m[LEAVE] pad:pad socket:wvPRl0iPU1GgkvxTAAB1 IP:ANONYMOUS authorID:a.1r0hGWhUY25qoOI9 username:user
3028:  �[32m[2026-05-17T13:04:56.385] [INFO] http - �[39mSuccessful authentication from IP ANONYMOUS for user user
3029:  �[32m[2026-05-17T13:04:56.395] [INFO] access - �[39m[CREATE] pad:pad socket:DQ4frImlk8NjqpidAAB3 IP:ANONYMOUS authorID:a.Y0Ic0sePYxmnAqs9 username:user
3030:  ✔ level='modify' -> can modify
3031:  �[32m[2026-05-17T13:04:56.398] [INFO] access - �[39m[LEAVE] pad:pad socket:DQ4frImlk8NjqpidAAB3 IP:ANONYMOUS authorID:a.Y0Ic0sePYxmnAqs9 username:user
3032:  �[32m[2026-05-17T13:04:56.399] [INFO] http - �[39mSuccessful authentication from IP ANONYMOUS for user user
3033:  �[91m[2026-05-17T13:04:56.409] [ERROR] socket.io - �[39mError handling pad message from 1NTdG18qLCBbhbdIAAB5: Error: access denied
3034:  at Object.exports.handleMessage (/home/runner/work/etherpad/etherpad/src/node/handler/PadMessageHandler.ts:508:11)
3035:  at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
3036:  at async <anonymous> (/home/runner/work/etherpad/etherpad/src/node/handler/SocketIORouter.ts:85:14)
3037:  ✔ level='create' settings.editOnly=true -> unable to create
3038:  �[32m[2026-05-17T13:04:56.411] [INFO] http - �[39mSuccessful authentication from IP ANONYMOUS for user user
3039:  �[91m[2026-05-17T13:04:56.420] [ERROR] socket.io - �[39mError handling pad message from GgcbBBZ50qmudvgZAAB7: Error: access denied
3040:  at Object.exports.handleMessage (/home/runner/work/etherpad/etherpad/src/node/handler/PadMessageHandler.ts:508:11)
3041:  at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
3042:  at async <anonymous> (/home/runner/work/etherpad/etherpad/src/node/handler/SocketIORouter.ts:85:14)
3043:  ✔ level='modify' settings.editOnly=false -> unable to create
3044:  �[32m[2026-05-17T13:04:56.422] [INFO] http - �[39mSuccessful authentication from IP ANONYMOUS for user user
3045:  �[91m[2026-05-17T13:04:56.432] [ERROR] socket.io - �[39mError handling pad message from _hD-6kM8zyC9PPYrAAB9: Error: access denied
3046:  at Object.exports.handleMessage (/home/runner/work/etherpad/etherpad/src/node/handler/PadMessageHandler.ts:508:11)
3047:  at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
3048:  at async <anonymous> (/home/runner/work/etherpad/etherpad/src/node/handler/SocketIORouter.ts:85:14)
3049:  ✔ level='readOnly' -> unable to create
3050:  �[32m[2026-05-17T13:04:56.434] [INFO] http - �[39mSuccessful authentication from IP ANONYMOUS for user user
3051:  �[32m[2026-05-17T13:04:56.444] [INFO] access - �[39m[CREATE] pad:pad socket:DTcLoKxHhClb-lI0AAB_ IP:ANONYMOUS authorID:a.jOwBpO0bdmCG8woP username:user
3052:  ✔ level='readOnly' -> unable to modify
3053:  �[32m[2026-05-17T13:04:56.447] [INFO] access - �[39m[LEAVE] pad:pad socket:DTcLoKxHhClb-lI0AAB_ IP:ANONYMOUS authorID:a.jOwBpO0bdmCG8woP username:user
3054:  Authorization levels via user settings
3055:  �[32m[2026-05-17T13:04:56.448] [INFO] http - �[39mSuccessful authentication from IP ANONYMOUS for user user
3056:  �[32m[2026-05-17T13:04:56.458] [INFO] access - �[39m[CREATE] pad:pad socket:v9EYv9g4TxAEj5riAACB IP:ANONYMOUS authorID:a.ZtETYsteFmAR18BH username:user
3057:  ✔ user.canCreate = true -> can create and modify
3058:  �[32m[2026-05-17T13:04:56.461] [INFO] access - �[39m[LEAVE] pad:pad socket:v9EYv9g4TxAEj5riAACB IP:ANONYMOUS authorID:a.ZtETYsteFmAR18BH username:user
3059:  �[32m[2026-05-17T13:04:56.462] [INFO] http - �[39mSuccessful authentication from IP ANONYMOUS for user user
3060:  �[91m[2026-05-17T13:04:56.473] [ERROR] socket.io - �[39mError handling pad message from 3ichIuiBpBAreW2mAACD: Error: access denied
3061:  at Object.exports.handleMessage (/home/runner/work/etherpad/etherpad/src/node/handler/PadMessageHandler.ts:508:11)
3062:  at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
3063:  at async <anonymous> (/home/runner/work/etherpad/etherpad/src/node/handler/SocketIORouter.ts:85:14)
3064:  ✔ user.canCreate = false -> unable to create
3065:  �[32m[2026-05-17T13:04:56.475] [INFO] http - �[39mSuccessful authentication from IP ANONYMOUS for user user
3066:  �[91m[2026-05-17T13:04:56.485] [ERROR] socket.io - �[39mError handling pad message from slTxjOhLePpwwO3fAACF: Error: access denied
3067:  at Object.exports.handleMessage (/home/runner/work/etherpad/etherpad/src/node/handler/PadMessageHandler.ts:508:11)
3068:  at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
3069:  at async <anonymous> (/home/runner/work/etherpad/etherpad/src/node/handler/SocketIORouter.ts:85:14)
3070:  ✔ user.readOnly = true -> unable to create
3071:  �[32m[2026-05-17T13:04:56.487] [INFO] http - �[39mSuccessful authentication from IP ANONYMOUS for user user
3072:  �[32m[2026-05-17T13:04:56.497] [INFO] access - �[39m[CREATE] pad:pad socket:RikrT2ulnCMZBBY3AACH IP:ANONYMOUS authorID:a.emkQLSjy5G3Llj4G username:user
3073:  ✔ user.readOnly = true -> unable to modify
3074:  �[32m[2026-05-17T13:04:56.500] [INFO] access - �[39m[LEAVE] pad:pad socket:RikrT2ulnCMZBBY3AACH IP:ANONYMOUS authorID:a.emkQLSjy5G3Llj4G username:user
3075:  �[32m[2026-05-17T13:04:56.501] [INFO] http - �[39mSuccessful authentication from IP ANONYMOUS for user user
3076:  �[32m[2026-05-17T13:04:56.512] [INFO] access - �[39m[CREATE] pad:pad socket:bvRv4ylu0Cb-rf6FAACJ IP:ANONYMOUS authorID:a.FV9BeED2iAgILk5h username:user
3077:  ✔ user.readOnly = false -> can create and modify
3078:  �[32m[2026-05-17T13:04:56.515] [INFO] access - �[39m[LEAVE] pad:pad socket:bvRv4ylu0Cb-rf6FAACJ IP:ANONYMOUS authorID:a.FV9BeED2iAgILk5h username:user
3079:  �[32m[2026-05-17T13:04:56.516] [INFO] http - �[39mSuccessful authentication from IP ANONYMOUS for user user
3080:  �[91m[2026-05-17T13:04:56.525] [ERROR] socket.io - �[39mError handling pad message from -Mbf44UWS54KathqAACL: Error: access denied
3081:  at Object.exports.handleMessage (/home/runner/work/etherpad/etherpad/src/node/handler/PadMessageHandler.ts:508:11)
3082:  at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
3083:  at async <anonymous> (/home/runner/work/etherpad/etherpad/src/node/handler/SocketIORouter.ts:85:14)
3084:  ✔ user.readOnly = true, user.canCreate = true -> unable to create
3085:  Authorization level interaction between authorize hook and user settings
3086:  �[32m[2026-05-17T13:04:56.527] [INFO] http - �[39mSuccessful authentication from IP ANONYMOUS for user user
3087:  �[91m[2026-05-17T13:04:56.535] [ERROR] socket.io - �[39mError handling pad message from Cr11heoA0ndsiBk8AACN: Error: access denied
3088:  at Object.exports.handleMessage (/home/runner/work/etherpad/etherpad/src/node/handler/PadMessageHandler.ts:508:11)
3089:  at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
3090:  at async <anonymous> (/home/runner/work/etherpad/etherpad/src/node/handler/SocketIORouter.ts:85:14)
3091:  ✔ authorize hook does not elevate level from user settings
3092:  �[32m[2026-05-17T13:04:56.537] [INFO] http - �[39mSuccessful authentication from IP ANONYMOUS for user user
3093:  �[91m[2026-05-17T13:04:56.546] [ERROR] socket.io - �[39mError handling pad message from IhlQNPY0lENRxLzpAACP: Error: access denied
3094:  at Object.exports.handleMessage (/home/runner/work/etherpad/etherpad/src/node/handler/PadMessageHandler.ts:508:11)
...

3121:  �[32m[2026-05-17T13:04:57.661] [INFO] access - �[39m[CREATE] pad:foo socket:yMwHos8WQhdsI5XNAACh IP:ANONYMOUS authorID:a.KlrExGF4k8vBfs0p
3122:  �[32m[2026-05-17T13:04:57.673] [INFO] access - �[39m[CREATE] pad:foo socket:VYx7rUIHNyP9GaeaAACj IP:ANONYMOUS authorID:a.ONuViL8JROhT0ZmQ
3123:  ✔ different browsers (separate cookie jars): only the creator gets canEditPadSettings
3124:  �[32m[2026-05-17T13:04:57.676] [INFO] access - �[39m[LEAVE] pad:foo socket:yMwHos8WQhdsI5XNAACh IP:ANONYMOUS authorID:a.KlrExGF4k8vBfs0p
3125:  �[32m[2026-05-17T13:04:57.676] [INFO] access - �[39m[LEAVE] pad:foo socket:VYx7rUIHNyP9GaeaAACj IP:ANONYMOUS authorID:a.ONuViL8JROhT0ZmQ
3126:  �[32m[2026-05-17T13:04:57.688] [INFO] access - �[39m[CREATE] pad:foo socket:v8Z-64zZKmvO64kwAACl IP:ANONYMOUS authorID:a.OjHOXfJPsglaQzjW
3127:  �[32m[2026-05-17T13:04:57.697] [INFO] access - �[39m[CREATE] pad:foo socket:ypCKCqMFNMiuAoLxAACn IP:ANONYMOUS authorID:a.OjHOXfJPsglaQzjW
3128:  ✔ same browser two tabs (shared cookie jar): BOTH get canEditPadSettings=true
3129:  �[32m[2026-05-17T13:04:57.699] [INFO] access - �[39m[LEAVE] pad:foo socket:ypCKCqMFNMiuAoLxAACn IP:ANONYMOUS authorID:a.OjHOXfJPsglaQzjW
3130:  SocketIORouter.js
3131:  ✔ setSocketIO
3132:  ✔ handleConnect
3133:  ✔ handleDisconnect
3134:  ✔ handleMessage (success)
3135:  ✔ handleMessage with ack (success)
3136:  �[91m[2026-05-17T13:04:57.733] [ERROR] socket.io - �[39mError handling /home/runner/work/etherpad/etherpad/src/tests/backend/specs/socketio.ts SocketIORouter.js handleMessage with ack (error) message from aKw4iIbu2H8Lso7XAACx: InjectedError: injected test error
3137:  at Module.handleMessage (/home/runner/work/etherpad/etherpad/src/tests/backend/specs/socketio.ts:597:52)
3138:  at <anonymous> (/home/runner/work/etherpad/etherpad/src/node/handler/SocketIORouter.ts:85:50)
3139:  at Socket.<anonymous> (/home/runner/work/etherpad/etherpad/src/node/handler/SocketIORouter.ts:86:5)
3140:  at Socket.emit (node:events:509:28)
3141:  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)
3142:  at /home/runner/work/etherpad/etherpad/node_modules/.pnpm/socket.io@4.8.3/node_modules/socket.io/dist/socket.js:697:39
3143:  at process.processTicksAndRejections (node:internal/process/task_queues:85:11)
3144:  ✔ handleMessage with ack (error)
3145:  /home/runner/work/etherpad/etherpad/src/tests/backend/specs/specialpages.ts
...

3150:  ✔ index page loads with x-proxy-path header
3151:  ✔ pad page loads with x-proxy-path header
3152:  theme-color meta
3153:  ✔ pad page emits theme-color matching the configured colibris toolbar
3154:  ✔ pad page tracks an explicit dark toolbar variant
3155:  ✔ pad page omits theme-color for non-colibris skins
3156:  ✔ timeslider page emits theme-color matching the configured toolbar
3157:  ✔ timeslider page omits theme-color for non-colibris skins
3158:  /home/runner/work/etherpad/etherpad/src/tests/backend/specs/timesliderRedirect.ts
3159:  /p/:pad/timeslider
3160:  ✔ redirects (302) direct visits to the pad page
3161:  ✔ preserves the pad name in the redirect target
3162:  ✔ serves the timeslider HTML when embed=1 (iframe path)
3163:  /home/runner/work/etherpad/etherpad/src/tests/backend/specs/undo_clear_authorship.ts
3164:  undo of clear authorship colors (bug #2802)
3165:  �[91m[2026-05-17T13:04:57.782] [ERROR] message - �[39mThere is no author for authorId: a.etherpad-system. This is possibly related to https://github.com/ether/etherpad-lite/issues/2802
3166:  �[32m[2026-05-17T13:04:57.782] [INFO] access - �[39m[ENTER] pad:S3OXfI26Ox socket:uqgTkaUVHpdPr02DAACz IP:ANONYMOUS authorID:a.Kf3glrFZOphYB4y1
3167:  �[91m[2026-05-17T13:04:57.796] [ERROR] message - �[39mThere is no author for authorId: a.etherpad-system. This is possibly related to https://github.com/ether/etherpad-lite/issues/2802
3168:  �[32m[2026-05-17T13:04:57.796] [INFO] access - �[39m[ENTER] pad:S3OXfI26Ox socket:msCp26zfH0w1GP-hAAC1 IP:ANONYMOUS authorID:a.xp6htBVpE51dIkOJ
3169:  ✔ should not disconnect when undoing clear authorship with multiple authors
3170:  �[32m[2026-05-17T13:04:57.811] [INFO] access - �[39m[LEAVE] pad:S3OXfI26Ox socket:uqgTkaUVHpdPr02DAACz IP:ANONYMOUS authorID:a.Kf3glrFZOphYB4y1
3171:  �[32m[2026-05-17T13:04:57.812] [INFO] access - �[39m[LEAVE] pad:S3OXfI26Ox socket:msCp26zfH0w1GP-hAAC1 IP:ANONYMOUS authorID:a.xp6htBVpE51dIkOJ
3172:  �[91m[2026-05-17T13:04:57.824] [ERROR] message - �[39mThere is no author for authorId: a.etherpad-system. This is possibly related to https://github.com/ether/etherpad-lite/issues/2802
3173:  �[32m[2026-05-17T13:04:57.824] [INFO] access - �[39m[ENTER] pad:X1S6gnpFtp socket:W60Ty1DTKcQ4lY-iAAC3 IP:ANONYMOUS authorID:a.bY1m4GqyMb8E1MO0
3174:  ✔ should allow clear authorship changeset with empty author from any user
3175:  �[32m[2026-05-17T13:04:57.833] [INFO] access - �[39m[LEAVE] pad:X1S6gnpFtp socket:W60Ty1DTKcQ4lY-iAAC3 IP:ANONYMOUS authorID:a.bY1m4GqyMb8E1MO0
3176:  �[91m[2026-05-17T13:04:57.846] [ERROR] message - �[39mThere is no author for authorId: a.etherpad-system. This is possibly related to https://github.com/ether/etherpad-lite/issues/2802
3177:  �[32m[2026-05-17T13:04:57.846] [INFO] access - �[39m[ENTER] pad:JNr0qmP4om socket:PHPKyKBAJpy1XsGiAAC5 IP:ANONYMOUS authorID:a.j3GL2jKco9FrBjHO
3178:  ✔ changeset restoring own author after clear should be accepted
3179:  �[32m[2026-05-17T13:04:57.855] [INFO] access - �[39m[LEAVE] pad:JNr0qmP4om socket:PHPKyKBAJpy1XsGiAAC5 IP:ANONYMOUS authorID:a.j3GL2jKco9FrBjHO
3180:  �[91m[2026-05-17T13:04:57.866] [ERROR] message - �[39mThere is no author for authorId: a.etherpad-system. This is possibly related to https://github.com/ether/etherpad-lite/issues/2802
3181:  �[32m[2026-05-17T13:04:57.867] [INFO] access - �[39m[ENTER] pad:bx1SVd69mf socket:XeDoNHq5ISuAsRAhAAC7 IP:ANONYMOUS authorID:a.FgqQQgWkT3sYUeln
3182:  �[91m[2026-05-17T13:04:57.877] [ERROR] message - �[39mThere is no author for authorId: a.etherpad-system. This is possibly related to https://github.com/ether/etherpad-lite/issues/2802
3183:  �[32m[2026-05-17T13:04:57.877] [INFO] access - �[39m[ENTER] pad:bx1SVd69mf socket:ydpNvIQtX2n1j2QWAAC9 IP:ANONYMOUS authorID:a.31QZupYSOcLrsVdp
3184:  �[33m[2026-05-17T13:04:57.879] [WARN] message - �[39mFailed to apply USER_CHANGES from author a.31QZupYSOcLrsVdp (socket ydpNvIQtX2n1j2QWAAC9) on pad bx1SVd69mf: Error: Author a.31QZupYSOcLrsVdp tried to submit changes as author a.FgqQQgWkT3sYUeln in changeset Z:1>5*0+5$hello
3185:  at handleUserChanges (/home/runner/work/etherpad/etherpad/src/node/handler/PadMessageHandler.ts:874:17)
3186:  at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
3187:  ✔ changeset impersonating another author for new text should still be rejected
3188:  �[32m[2026-05-17T13:04:57.881] [INFO] access - �[39m[LEAVE] pad:bx1SVd69mf socket:XeDoNHq5ISuAsRAhAAC7 IP:ANONYMOUS authorID:a.FgqQQgWkT3sYUeln
3189:  �[32m[2026-05-17T13:04:57.881] [INFO] access - �[39m[LEAVE] pad:bx1SVd69mf socket:ydpNvIQtX2n1j2QWAAC9 IP:ANONYMOUS authorID:a.31QZupYSOcLrsVdp
3190:  �[91m[2026-05-17T13:04:57.894] [ERROR] message - �[39mThere is no author for authorId: a.etherpad-system. This is possibly related to https://github.com/ether/etherpad-lite/issues/2802
3191:  �[32m[2026-05-17T13:04:57.894] [INFO] access - �[39m[ENTER] pad:2oXiBkfqAA socket:d-MQtoTsoKNdLJ0PAAC_ IP:ANONYMOUS authorID:a.b8wGQKzzIXYSLvnb
3192:  �[33m[2026-05-17T13:04:57.898] [WARN] message - �[39mFailed to apply USER_CHANGES from author a.b8wGQKzzIXYSLvnb (socket d-MQtoTsoKNdLJ0PAAC_) on pad 2oXiBkfqAA: Error: Author a.b8wGQKzzIXYSLvnb tried to set unknown author a.fabricatedAuthorId on existing text in changeset Z:6>0*0=5$
3193:  at handleUserChanges (/home/runner/work/etherpad/etherpad/src/node/handler/PadMessageHandler.ts:865:19)
3194:  at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
3195:  ✔ should reject = op with fabricated author who never contributed to the pad
3196:  �[32m[2026-05-17T13:04:57.900] [INFO] access - �[39m[LEAVE] pad:2oXiBkfqAA socket:d-MQtoTsoKNdLJ0PAAC_ IP:ANONYMOUS authorID:a.b8wGQKzzIXYSLvnb
3197:  �[91m[2026-05-17T13:04:57.912] [ERROR] message - �[39mThere is no author for authorId: a.etherpad-system. This is possibly related to https://github.com/ether/etherpad-lite/issues/2802
3198:  �[32m[2026-05-17T13:04:57.912] [INFO] access - �[39m[ENTER] pad:iqoSQ8zGPW socket:A59knDAgej_5TA-FAADB IP:ANONYMOUS authorID:a.sBFb4Rq6dIfXNBt1
3199:  �[33m[2026-05-17T13:04:57.917] [WARN] message - �[39mFailed to apply USER_CHANGES from author a.sBFb4Rq6dIfXNBt1 (socket A59knDAgej_5TA-FAADB) on pad iqoSQ8zGPW: Error: Author a.sBFb4Rq6dIfXNBt1 tried to submit changes as author a.fabricatedAuthorId in changeset Z:6<1*0-1$
3200:  at handleUserChanges (/home/runner/work/etherpad/etherpad/src/node/handler/PadMessageHandler.ts:874:17)
...

3208:  ✔ returns 409 with no-known-latest when state has no latest release
3209:  ✔ returns 404 when tier is "notify" (action endpoints disabled)
3210:  �[32m[2026-05-17T13:04:57.932] [INFO] http - �[39mSuccessful authentication from IP ANONYMOUS for user <no username>
3211:  ✔ rejects when execution is already in flight (409)
3212:  POST /admin/update/cancel
3213:  ✔ rejects unauthenticated
3214:  �[32m[2026-05-17T13:04:57.936] [INFO] http - �[39mSuccessful authentication from IP ANONYMOUS for user <no username>
3215:  ✔ returns 409 when nothing is in flight
3216:  �[32m[2026-05-17T13:04:57.939] [INFO] http - �[39mSuccessful authentication from IP ANONYMOUS for user <no username>
3217:  �[32m[2026-05-17T13:04:57.942] [INFO] http - �[39mSuccessful authentication from IP ANONYMOUS for user <no username>
3218:  ✔ cancels a Tier 3 scheduled update and returns the state to idle
3219:  POST /admin/update/acknowledge
3220:  ✔ rejects unauthenticated
3221:  �[32m[2026-05-17T13:04:57.947] [INFO] http - �[39mSuccessful authentication from IP ANONYMOUS for user <no username>
3222:  �[32m[2026-05-17T13:04:57.949] [INFO] http - �[39mSuccessful authentication from IP ANONYMOUS for user <no username>
3223:  ✔ clears a terminal rollback-failed state to idle
3224:  �[32m[2026-05-17T13:04:57.952] [INFO] http - �[39mSuccessful authentication from IP ANONYMOUS for user <no username>
3225:  ✔ clears a preflight-failed state to idle
3226:  �[32m[2026-05-17T13:04:57.955] [INFO] http - �[39mSuccessful authentication from IP ANONYMOUS for user <no username>
...

3245:  ✔ admits authenticated admin sessions
3246:  admin auth (without requireAdminForStatus)
3247:  �[32m[2026-05-17T13:04:57.977] [INFO] http - �[39mSuccessful authentication from IP ANONYMOUS for user <no username>
3248:  ✔ returns full diagnostic payload to authed admin sessions
3249:  /home/runner/work/etherpad/etherpad/src/tests/backend/specs/updater-integration.ts
3250:  �[33m[2026-...

@JohnMcLear JohnMcLear merged commit 662637d into develop May 17, 2026
28 of 31 checks passed
@JohnMcLear JohnMcLear deleted the fix/backend-tests-glob-windows branch May 17, 2026 13:26
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