file in the root directory that references ./src directory as the file source for `ep_etherpad-lite`. Remove --legacy-peer-deps and --no-save when invoking npm. There is no need for them anymore, as we are bumping npm now to v8. ./src/package.json contains all dependencies of Etherpad core (package name ep_etherpad-lite) as before. The root directory's package.json file references ep_etherpad-lite and also contains references to any installed plugins. Remove npm from package.json as we depend on a recent version now; PATH is still updated as before, so in the future we may install a custom npm version again lint package-lock: update exception for sqlite3 remove node_modules and package.json during installDeps.sh update Dockerfile adapt minify windows build Fixed installOnWindows.bat remove node_modules from git bump minimal node/npm version in src/bin/functions.sh add changelog notes update installdeps fix dockerfile docker: test npm prefix set to the etherpad directory workflow: upgrade-from-latest-release needs to be adapted until next release is out Revert "docker: test npm prefix set to the etherpad directory" This reverts commit b856a2488c9dbfb2acf35309cd1ee83016b631ad. use npm link --bin-links=false to prevent it from copying bin files temp fix for scripts as they are not installed to bin directory anymore adjust bin paths in Dockerfile Dockerfile add hint for npm link, dockerfile update dockerfile Revert "Fixed installOnWindows.bat" This reverts commit 70d0716bbedc4c0c1043155fcc5d157f01775c61. try installOnWindows; still TODO: no difference between production and development; no warning like in installDeps.sh before update - it just removes package* and node_modules so admins must be aware of the plugins they want to reinstall later update installOnWindows.bat update package-lock.json Dockerfile Dockerfile add file: scheme for lint check - needed as long as we have the plugin compatibility symlinks in ./src/node_modules fix installOnWindows upgrade-from-latest-release workflow: adapt cypress installation src/package.json: test-container fix path to _mocha; maybe revert this in case we enable bin-links again src/package.json: add test-on-windows script another try with test-on-windows, without using bin-links use bin-links on windows Revert "use bin-links on windows" This reverts commit f50ec2a9fabe3098d48e8f412b73c01edbe2140e. invoke mocha binary on windows run npm i once on windows, to make bin files available - why? remove supertest on windows production builds add symlink for mocha debug Revert "debug" This reverts commit 8916a0515ca2897c57ca65fef49fd0b3610d2989. Revert "add symlink for mocha" This reverts commit 3c60bef77d2a120d24fce14421fe638598cd849d. windows workflow: adapt cypress path frontend admin tests
61 KiB
Next release
Note for admins
Etherpad does no longer store it's dependencies in ./src/node_modules by default. Also, Etherpad now
stores installed plugins in a package.json file in the root directory and no longer requires quirks
like --legacy-peer-deps or --no-save when invoking npm during plugin installation.
When you're updating, it's best to use the ./src/bin/installDeps.sh script. It will npm link the
src directory, using the package.json file in ./src. This will create the well-known symlink ep_etherpad-lite
in ./node_modules, that we've been using for years. However, this will also add a dependency in ./package.json.
./src/bin/installDeps.sh will fail, if you have no ./package.json or ./package-lock.json and your
./node_modules directory is not empty, as this is an indicator of installed plugins. You need to remove
./node_modules and install all your plugins in the next step.
./src/bin/installDeps.sh will remove any existing directories in ./src/node_modules.
After running ./src/bin/installDeps.sh, install your plugins with npm i ep_plugin1 ep_plugin2... or via
/admin/plugins.
Note for plugin authors
You can no longer depend on core's dependencies via require('ep_etherpad-lite/node_modules/$dep').
Please run src/bin/checkPlugins.sh or manually change to require('$dep'). We don't recommend
that you rely on Etherpad to include specific dependencies in the future. So it's best if you add
the dependency in your package.json.
For convenience we have added symlinks in ./src/node_modules for the following dependencies:
async, cheerio, express, formidable, log4js and supertest.
Please note that those symlinks will be removed in a future version, so we strongly recommend that
you adapt your require statements.
1.9.1
Notable enhancements and fixes
-
Security
- Limit requested revisions in timeslider and export to head revision. (affects v1.9.0)
-
Bugfixes
- revisions in
CHANGESET_REQ(timeslider) and export (txt, html, custom) are now checked to be numbers. - bump sql for audit fix
- revisions in
-
Enhancements
- Add keybinding meta-backspace to delete to beginning of line
- Fix automatic Windows build via GitHub Actions
- Enable docs to be build cross platform thanks to asciidoctor
Compatibility changes
- tests: drop windows 7 test coverage & use chrome latest for admin tests
- Require Node 16 for Etherpad and target Node 20 for testing
1.9.0
Notable enhancements and fixes
- Windows build:
- The bundled
node.exewas upgraded from v12 to v16. - The bundled
node.exeis now a 64-bit executable. If you need the 32-bit version you must download and install Node.js yourself.
- The bundled
- Improvements to login session management:
express_sidcookies andsessionstorage:*database records are no longer created unlessrequireAuthenticationistrue(or a plugin causes them to be created).- Login sessions now have a finite lifetime by default (10 days after leaving).
sessionstorage:*database records are automatically deleted when the login session expires (with some exceptions that will be fixed in the future).- Requests for static content (e.g.,
/robots.txt) and special pages (e.g., the HTTP API,/stats) no longer create login session state. - The secret used to sign the
express_sidcookie is now automatically regenerated every day (called key rotation) by default. If key rotation is enabled, the now-deprecatedSESSIONKEY.txtfile can be safely deleted after Etherpad starts up (its content is read and saved to the database and used to validate signatures from old cookies until they expire).
- The following settings from
settings.jsonare now applied as expected (they were unintentionally ignored before):padOptions.langpadOptions.showChatpadOptions.userColorpadOptions.userName
- HTTP API:
- Fixed the return value of
getTextwhen called with a specific revision. - Fixed a potential attribute pool corruption bug with
copyPadWithoutHistory. - Mappings created by
createGroupIfNotExistsForare now removed from the database when the group is deleted. - Fixed race conditions in the
setText,appendText, andrestoreRevisionfunctions. - Added an optional
authorIdparameter toappendText,copyPadWithoutHistory,createGroupPad,createPad,restoreRevision,setHTML, andsetText, and bumped the latest API version to 1.3.0.
- Fixed the return value of
- Fixed a crash if the database is busy enough to cause a query timeout.
- New
/healthendpoint for getting information about Etherpad's health (see draft-inadarei-api-health-check-06). - Docker now uses the new
/healthendpoint for health checks, which avoids issues when authentication is enabled. It also avoids the unnecessary creation of database records for managing browser sessions. - When copying a pad, the pad's records are copied in batches to avoid database timeouts with large pads.
- Exporting a large pad to
.etherpadformat should be faster thanks to bulk database record fetches. - When importing an
.etherpadfile, records are now saved to the database in batches to avoid database timeouts with large pads.
For plugin authors
- New
expressPreSessionserver-side hook. - Pad server-side hook changes:
padCheck: New hook.padCopy: NewsrcPadanddstPadcontext properties.padDefaultContent: New hook.padRemove: Newpadcontext property.
- The
dbproperty on Pad objects is now public. - New
getAuthorIdserver-side hook. - New APIs for processing attributes:
ep_etherpad-lite/static/js/attributes(low-level API) andep_etherpad-lite/static/js/AttributeMap(high-level API). - The
importserver-side hook has a newImportErrorcontext property. - New
exportEtherpadandimportEtherpadserver-side hooks. - The
handleMessageSecurityandhandleMessageserver-side hooks have a newsessionInfocontext property that includes the user's author ID, the pad ID, and whether the user only has read-only access. - The
handleMessageSecurityserver-side hook can now be used to grant write access for the current message only. - The
init_<pluginName>server-side hooks have a newloggercontext property that plugins can use to log messages. - Prevent infinite loop when exiting the server
- Bump dependencies
Compatibility changes
- Node.js v14.15.0 or later is now required.
- The default login session expiration (applicable if
requireAuthenticationistrue) changed from never to 10 days after the user leaves.
For plugin authors
- The
clientcontext property for thehandleMessageSecurityandhandleMessageserver-side hooks is deprecated; use thesocketcontext property instead. - Pad server-side hook changes:
padCopy:- The
originalPadcontext property is deprecated; usesrcPadinstead. - The
destinationIDcontext property is deprecated; usedstPad.idinstead.
- The
padCreate: Theauthorcontext property is deprecated; use the newauthorIdcontext property instead. Also, the hook now runs asynchronously.padLoad: Now runs when a temporary Pad object is created during import. Also, it now runs asynchronously.padRemove: ThepadIDcontext property is deprecated; usepad.idinstead.padUpdate: Theauthorcontext property is deprecated; use the newauthorIdcontext property instead. Also, the hook now runs asynchronously.
- Returning
truefrom ahandleMessageSecurityhook function is deprecated; return'permitOnce'instead. - Changes to the
src/static/js/Changeset.jslibrary:- The following attribute processing functions are deprecated (use the new
attribute APIs instead):
attribsAttributeValue()eachAttribNumber()makeAttribsString()opAttributeValue()
opIterator(): Deprecated in favor of the newdeserializeOps()generator function.appendATextToAssembler(): Deprecated in favor of the newopsFromAText()generator function.newOp(): Deprecated in favor of the newOpclass.
- The following attribute processing functions are deprecated (use the new
attribute APIs instead):
- The
AuthorManager.getAuthor4Token()function is deprecated; use the newAuthorManager.getAuthorId()function instead. - The exported database records covered by the
exportEtherpadAdditionalContentserver-side hook now include keys like${customPrefix}:${padId}:*, not just${customPrefix}:${padId}. - Plugin locales should overwrite core's locales Stale
- Plugin locales overwrite core locales
1.8.18
Released: 2022-05-05
Notable enhancements and fixes
- Upgraded ueberDB to fix a regression with CouchDB.
1.8.17
Released: 2022-02-23
Security fixes
- Fixed a vunlerability in the
CHANGESET_REQmessage handler that allowed a user with any access to read any pad if the pad ID is known.
Notable enhancements and fixes
- Fixed a bug that caused all pad edit messages received at the server to go through a single queue. Now there is a separate queue per pad as intended, which should reduce message processing latency when many pads are active at the same time.
1.8.16
Security fixes
If you cannot upgrade to v1.8.16 for some reason, you are encouraged to try cherry-picking the fixes to the version you are running:
git cherry-pick b7065eb9a0ec..77bcb507b30e
- Maliciously crafted
.etherpadfiles can no longer overwrite arbitrary non-pad database records when imported. - Imported
.etherpadfiles are now subject to numerous consistency checks before any records are written to the database. This should help avoid denial-of-service attacks via imports of malformed.etherpadfiles.
Notable enhancements and fixes
- Fixed several
.etherpadimport bugs. - Improved support for large
.etherpadimports.
1.8.15
Security fixes
- Fixed leak of the writable pad ID when exporting from the pad's read-only ID. This only matters if you treat the writeable pad IDs as secret (e.g., you are not using ep_padlist2) and you share the pad's read-only ID with untrusted users. Instead of treating writeable pad IDs as secret, you are encouraged to take advantage of Etherpad's authentication and authorization mechanisms (e.g., use ep_openid_connect with ep_readonly_guest, or write your own authentication and authorization plugins).
- Updated dependencies.
Compatibility changes
- The
logconfigsetting is deprecated.
For plugin authors
- Etherpad now uses jsdom instead of
cheerio for processing HTML imports. There are two
consequences of this change:
require('ep_etherpad-lite/node_modules/cheerio')no longer works. To fix, your plugin should directly depend oncheerioand dorequire('cheerio').- The
collectContentImagehook'snodecontext property is now anHTMLImageElementobject rather than a Cheerio Node-like object, so the API is slightly different. See citizenos/ep_image_upload#49 for an example fix.
- The
clientReadyserver-side hook is deprecated; use the newuserJoinhook instead. - The
init_<pluginName>server-side hooks are now run every time Etherpad starts up, not just the first time after the named plugin is installed. - The
userLeaveserver-side hook's context properties have changed:auth: Deprecated.author: Deprecated; use the newauthorIdproperty instead.readonly: Deprecated; use the newreadOnlyproperty instead.rev: Deprecated.
- Changes to the
src/static/js/Changeset.jslibrary:opIterator(): The unused start index parameter has been removed, as has the unusedlastIndex()method on the returned object.smartOpAssembler(): The returned object'sappendOpWithText()method is deprecated without a replacement available to plugins (if you need one, let us know and we can make the privateopsFromText()function public).- Several functions that should have never been public are no longer exported:
applyZip(),assert(),clearOp(),cloneOp(),copyOp(),error(),followAttributes(),opString(),stringOp(),textLinesMutator(),toBaseTen(),toSplices().
Notable enhancements and fixes
- Accessibility fix for JAWS screen readers.
- Fixed "clear authorship" error (see issue #5128).
- Etherpad now considers square brackets to be valid URL characters.
- The server no longer crashes if an exception is thrown while processing a message from a client.
- The
useMonospaceFontGlobalsetting now works (thanks @Lastpixl!). - Chat improvements:
- The message input field is now a text area, allowing multi-line messages (use shift-enter to insert a newline).
- Whitespace in chat messages is now preserved.
- Docker improvements:
- New
HEALTHCHECKinstruction (thanks @Gared!). - New
settings.jsonvariables:DB_COLLECTION,DB_URL,SOCKETIO_MAX_HTTP_BUFFER_SIZE,DUMP_ON_UNCLEAN_EXIT(thanks @JustAnotherArchivist!). .ep_initializedfiles are no longer created.
- New
- Worked around a Firefox Content Security Policy
bug that caused CSP
failures when
'self'was in the CSP header. See issue #4975 for details. - UeberDB upgraded from v1.4.10 to v1.4.18. For details, see the ueberDB
changelog.
Highlights:
- The
postgrespooldriver was renamed topostgres, replacing the old driver of that name. If you used the oldpostgresdriver, you may see an increase in the number of database connections. - For
postgres, you can now set thedbSettingsvalue insettings.jsonto a connection string (e.g.,"postgres://user:password@host/dbname") instead of an object. - For
mongodb, thedbNamesetting was renamed todatabase(butdbNamestill works for backwards compatibility) and is now optional (if unset, the database name inurlis used).
- The
/admin/settingsnow honors the--settingscommand-line argument.- Fixed "Author X tried to submit changes as author Y" detection.
- Error message display improvements.
- Simplified pad reload after importing an
.etherpadfile.
For plugin authors
clientVarswas added to the context for thepostAceInitclient-side hook. Plugins should use this instead of theclientVarsglobal variable.- New
userJoinserver-side hook. - The
userLeaveserver-side hook has a newsocketcontext property. - The
helper.aNewPad()function (accessible to client-side tests) now accepts hook functions to inject when opening a pad. This can be used to test any new client-side hooks your plugin provides. - Chat improvements:
- The
chatNewMessageclient-side hook context has new properties:message: Provides access to the raw message object so that plugins can see the original unprocessed message text and any added metadata.rendered: Allows plugins to completely override how the message is rendered in the UI.
- New
chatSendMessageclient-side hook that enables plugins to process the text before sending it to the server or augment the message object with custom metadata. - New
chatNewMessageserver-side hook to process new chat messages before they are saved to the database and relayed to users.
- The
- Readability improvements to browser-side error stack traces.
- Added support for socket.io message acknowledgments.
1.8.14
Security fixes
- Fixed a persistent XSS vulnerability in the Chat component. In case you can't
update to 1.8.14 directly, we strongly recommend to cherry-pick
a796811558. Thanks to sonarsource for the professional disclosure.
Compatibility changes
- Node.js v12.13.0 or later is now required.
- The
faviconsetting is now interpreted as a pathname to a favicon file, not a URL. Please see the documentation comment insettings.json.template. - The undocumented
faviconPadandfaviconTimeslidersettings have been removed. - MySQL/MariaDB now uses connection pooling, which means you will see up to 10 connections to the MySQL/MariaDB server (by default) instead of 1. This might cause Etherpad to crash with a "ER_CON_COUNT_ERROR: Too many connections" error if your server is configured with a low connection limit.
- Changes to environment variable substitution in
settings.json(see the documentation comments insettings.json.templatefor details):- An environment variable set to the string "null" now becomes
nullinstead of the string "null". Similarly, if the environment variable is unset and the default value is "null" (e.g.,"${UNSET_VAR:null}"), the value now becomesnullinstead of the string "null". It is no longer possible to produce the string "null" via environment variable substitution. - An environment variable set to the string "undefined" now causes the setting
to be removed instead of set to the string "undefined". Similarly, if the
environment variable is unset and the default value is "undefined" (e.g.,
"${UNSET_VAR:undefined}"), the setting is now removed instead of set to the string "undefined". It is no longer possible to produce the string "undefined" via environment variable substitution. - Support for unset variables without a default value is now deprecated.
Please change all instances of
"${FOO}"in yoursettings.jsonto${FOO:null}to keep the current behavior. - The
DB_*variable substitutions insettings.json.dockerthat previously defaulted tonullnow default to "undefined".
- An environment variable set to the string "null" now becomes
- Calling
nextwithout argument when usingChangeset.opIteratordoes always return a new Op. Seeb9753dcc71for details.
Notable enhancements and fixes
- MySQL/MariaDB now uses connection pooling, which should improve stability and reduce latency.
- Bulk database writes are now retried individually on write failure.
- Minify: Avoid crash due to unhandled Promise rejection if stat fails.
- padIds are now included in /socket.io query string, e.g.
https://video.etherpad.com/socket.io/?padId=AWESOME&EIO=3&transport=websocket&t=...&sid=.... This is useful for directing pads to separate socket.io nodes.