I will soon lock down the b2evolution.net site. It will become read only and neither you nor me will be able to post new content to it.
Original post blogged on b2evolution.
The fourth feature release of Drupal 11 is another performance breakthrough. Using only a third of the database and cache lookups compared to Drupal 11.0 and 10.6 for the same requests. It also comes with 15-25% better compression of JS and CSS, much faster translation file handling, a new native command line interface, improved password hashing and a lot more.

With Drupal 11.3, we announced that it was the biggest performance improvement of the decade. Drupal 11.4 is arguably the biggest performance improvement of the decade again!
Drupal 11.4 reduces database queries by half compared to 11.3 across a wide range of requests due to optimizations in how entity fields are loaded.
Now, on a completely cold cache, Drupal 11.4 will execute just over 1/3rd of the database and cache lookups compared to Drupal 11.0 or 10.6, representing hundreds of milliseconds saved.
As well as entity loading, entity listing queries have also been significantly improved via reducing the number of table joins, leading to fewer slow queries. This should particularly benefit sites using JSON:API.
To reduce the cost of rendering menus and improve render cache hit rates, menu blocks now have a configuration option to not generate CSS classes for ancestor menu links.
We have made recipe-based site installation twice as fast. This significantly improves the UX of installing Drupal CMS and other site recipes. Installing individual recipes is also markedly faster.
Importing translations during the installer or during site operation is now much faster. On a test site with 66 projects and 38 languages, checking for translation updates was 87% faster on Drupal 11.4 compared to 11.3.
The APIs handling translation files and import have undergone an extensive modernization effort. All .inc files and several important APIs in locale.module have been deprecated and updated to OOP with special attention paid to performance and organization.
Drupal now supports Brotli compression for aggregated CSS and JavaScript files in addition to the existing gzip compression. Brotli typically provides 15-25% better compression ratios than gzip, resulting in faster page loads for browsers that support it. The feature relies on the PHP Brotli extension: ext-brotli.
The drupal/core-recommended package no longer pins minor versions for dependencies like Guzzle, Twig, and Symfony Polyfills. In the past, stricter version rules and Composer 2.9's blocking behaviour forced sites to wait for a new Drupal release to get important security fixes. Now, you can install these security fixes immediately. Since the updated dependencies at that time may not have been tested with Drupal core yet, site owners should ensure adequate quality assurance occurs before deploying to production.
A new extensible ./vendor/bin/dr command line interface was added. While Drupal already includes a CLI script with hardcoded commands, it is not extensible. This new interface was built by a team which included the maintainers of the Drush utility. Drush has been a mainstay for people using Drupal with the command line. Now a transitional period starts as Drush is gradually replaced with the core dr CLI over time. Learn how to make your existing Drush commands compatible.
The default installation, the Standard profile, is now leaner. It no longer includes the Article and Page content types, and commenting is disabled by default. Further core startup simplifications are planned for upcoming releases.
The Navigation module is now enabled in the standard administrative interface. The legacy Toolbar module remains available but is scheduled for removal in Drupal 12.
A new overview page has been added under the "Manage display" tab for content entity bundles. Previously, this tab led to the form editing the default view mode. Now, it lists all display modes for the bundle with their label and description and allows one to toggle the enabled/disabled status. The listing makes it easier to integrate tools such as Drupal Canvas.
Text formats using CKEditor can now be configured to include the FullScreen plugin. This plugin lets users expand the editor to the whole browser viewport, giving more space to comfortably edit content in a distraction-free environment.
The password hashing algorithm is now configurable. The new argon2id option provides much stronger hashing compared to the old bcrypt method. Drupal 12 will default to argon2id, but your site can already start to adopt it. If you update the setting, users' passwords will be rehashed on their next login.
You can now use attributes on your controllers to specify the routes the controller is used for. Any class in a module's Controller namespace (for example, Drupal\example\Controller) that have the Symfony\Component\Routing\Attribute\Route attribute will be picked up as route definitions. Even multiple routes can be defined on one class. This supplements the existing .routing.yml based declarations.
It is now possible to use the Drupal\Core\Entity\Attribute\Bundle attribute to define bundle classes, when in need of specific logic for an entity subtype. This previously required an entity_type_info or entity_type_info_alter implementation.
All .theme and .theme-settings.php files in core have moved to PHP classes. Support for .theme files is still planned to be retained in Drupal 12 to ease the transition, but will be removed in Drupal 13.
Most .module files have been converted too: 32 modules are fully converted to PHP classes, with 11 modules remaining (4 of which are deprecated for removal in Drupal 12).
A team of 26 key contributors worked on 57 issues since January 2026 to get here, making Drupal's code more consistent. Also thanks to the dozens of users that worked on the many decades old issues that this initiative built upon.
Drupal now integrates the Symfony Runtime component to separate bootstrapping logic from request handling. This provides a clear separation of concerns between preparing the environment (runtime) and handling a request, which will also later enable better integration with FrankenPHP.
A new trait for kernel tests, HttpKernelUiHelperTrait, allows kernel tests to make HTTP requests to the test site and make assertions against the returned content. This has the potential for many browser tests to be converted to kernel tests, which are much faster to run because unlike browser tests, they don't fully set up a test site by running the Drupal installer.
The Gin administrative theme has been added to Drupal core as the "Default Admin" experimental theme. The theme includes a new dark mode option.
While it is not yet actually the default admin theme, when it becomes stable it will replace Claro as the look of Drupal's backend. We encourage module maintainers to test their module's UIs and provide feedback!

Since Drupal 11.3 Andrei Mateescu was appointed as a provisional general core committer and is now a Content Moderation and the Workflows module maintainer too. Also Edward Wu was appointed as provisional release manager.
Various wonderful contributors also took our call for subsystem maintainership:
We also thank maintainers that stepped down in this period:
If you are looking to make the leap from Drupal user to Drupal contributor, or you want to share resources with your team as part of their professional development, there are many opportunities to deepen your Drupal skill set and give back to the community. Check out the Drupal contributor guide.
You would be more than welcome to join us at DrupalCon Rotterdam in September 2026 to attend sessions, network, and enjoy mentorship for your first contributions.
Drupal 12 will be released with the upcoming Drupal 11.5 at the beginning of December this year. Drupal 11.5 will be a Long Term Support release with version 11 support expected until the end of 2028.
Caution
v2.3.13 is a security release for sites on v2.3.12 or earlier. Upgrade from any 2.x at or below v2.3.12. If your site tracks the master branch, update from master instead: installing v2.3.13 would be a downgrade. v2.4.x is planned to be the next forward step.
Important
Upgrade PHP first, now. PHP 8.5.12, 8.4.27, 8.3.36, and 8.2.35 fix two critical vulnerabilities in PHP itself, CVE-2026-109618 and CVE-2026-109619, that can let an unauthenticated request run code on the server. Every PHP that serves web requests is at risk, whether it runs as PHP-FPM, mod_php, or php-cgi. Upgrade PHP to one of these releases right away, even before you upgrade e107.
PHP 8.1 and older no longer get updates from PHP itself. If your PHP comes from a provider of extended support, such as Freexian or Ondřej Surý, follow that provider's guidance for your PHP version. If you use Remi Collet's repository, PHP's announcement says it will not have updates today, and recommends distribution packages or building from source instead. Until you can update, the announcement lists settings that narrow the exposure. e107 v2.3.13 runs on PHP 5.6 and later.
Then upgrade e107 promptly. This release closes 114 security advisories: 29 Critical, 37 High, 39 Medium, and 9 Low. Security below lists them by area.
Most advisories name a way to narrow the exposure until you can upgrade, such as a setting, a permission to withdraw, or a web-server rule. None of those is a fix.
Before upgrading:
e107_config.php sets $mySQLport, check that your database server listens on it. e107 now connects on that port, where it used to ignore the line.index.php follows the request. The settings are under Site address and database below./~user/ address serves the site from a folder whose name holds anything but ASCII letters, digits, and - . _ ~, rename it to keep e107's cookies to the site. e107 now sets them on the folder above, the whole host when that folder is at the root, where other applications receive them. Visitors signed in before the update sign in once more.After upgrading:
e107_plugins/faqs/controllers/ if it is still on disk, then run the FAQs update in Admin » Plugin Manager. Run its other updates too, such as the PM plugin's 3.2.e_HTTP_STATIC, clear your CDN's cache.e107_config.php has no site_path and files saved since v2.3.4 are missing, merge the folder marked Known bad, as For Administrators » Fixed » Site address and database describes.javascript:;{ in their name, description, or author website or email, where a shortcode still runs.Warning
Some of these fixes change behavior you may be relying on. All but the last group close a way to attack a site. For Administrators » Changed has the details under each area's name; plugin and theme items are under For Developers » Changed.
For site owners:
data- attributes when next saved, so a page relying on data-toggle stops working. If you trust the author, let them post script in Admin » Preferences.{ as entities, so a key=value reader such as {URL=search|q=O'Brien} gets its value cut at the quote. Shortcodes in templates are unaffected.javascript:, vbscript:, or data: address, or one starting with a shortcode other than an {e_…} folder, unless you may post script. A heading that goes nowhere takes #.comment.php now sends its answers as application/json, so a theme or plugin script that parses them itself stops posting or moderating comments until that theme or plugin is updated.order setting must name columns, such as n.news_datestamp DESC; any other value sorts newest first.e107_images and e107_files. Remove those by hand if you meant to.%, +, or / to the front page after sign-in.[hide] block now opens to a signed-in member who can view the forum and has posted in its thread; none ever opened before.[img] of a site file outside the Media Manager is resized to the Default Image Sizes, 300 by 300 on a new install, where it used to arrive full size. Change them in Admin » Media Manager » Preferences.For plugin and theme authors, any row of the Behavior changes table under For Developers » Changed may matter; these most:
GuzzleHttp\Psr7\* functions and bbcode_shortcodes::renderEmotes() are gone, and on PHP 8 front-end code that relied on e_pref::save() defining admin phrases hits undefined constants.site_path are back on their own media and system folders. They saved uploads, backups, and logs under a stray folder; the dashboard links to the merge. (#6498)& stays an &. Since 2.2.0, text saved by anyone outside "Class which can post HTML" showed & for a typed & (older text until re-saved), and a bbcode link or image to ?a=1&b=2 lost its second parameter. (#6791, 94ef3d1ae4, 73227b2392)LinkedInOpenID, OktaOIDC, and X. (#6372)/faqs could open the admin area instead. (#6502)An "HTML author" below may post HTML but not script: on a new install, any administrator.
| Advisory | Severity | What it was |
|---|---|---|
| GHSA-j4jr-2rjm-rmpq | 9.9 Critical | A member's [video] could run script for every reader with no click, administrators included. |
| GHSA-948v-m8j8-77vm | 9.9 Critical | A member's [glyph] could run script for every reader with no click, administrators included. |
| GHSA-x3h8-x4r6-mc6x | 9.0 Critical | A member's comment or forum post could run script for forum topic visitors, or for an administrator opening the admin comment list. |
| GHSA-pggp-3p94-5mpc | 9.0 Critical | A member's bbcode inside a [table], [hide], or [html] block, such as in a signature, could run script for every reader. |
| GHSA-m88q-h57q-w28x | 9.0 Critical | A forum member's image caption could run script for a moderator or administrator who opened the post to edit it. |
| GHSA-9jr4-3wxc-m2cm | 9.0 Critical | A member's [file] could carry a script link that ran for whoever clicked it. |
| GHSA-x2x3-xr6p-4xc2 | 9.0 Critical | A member's [url] or [link] could get a script address past the link check through an e107 path constant. |
| GHSA-frc7-3r8j-5pw3 | 9.0 Critical | A member's [img] thumbnail could carry a script link that ran when clicked in comments paged in with Next. |
| GHSA-pr63-vf44-2whp | 9.0 Critical | A forum member could run script for every reader of a thread with a quote in its title, through {e_PAGETITLE}. |
| GHSA-hgqv-65ww-wq7p | 8.5 High | Under a Turkish or Azerbaijani locale, an HTML author could keep a script address in a link or frame. |
| GHSA-cmcq-6m83-2w77 | 8.4 High | An HTML author could turn a quote inside an attribute into an event handler that ran for every reader. |
| GHSA-28qc-h8v2-55rf | 8.4 High | An HTML author could put a bbcode inside an HTML attribute that added script for every reader. |
| GHSA-x3v9-7pgp-6c4f | 8.4 High | An HTML author could make a tag inside an [scode] block, or a malformed [code] block, run script for every reader. |
| GHSA-8j93-fv53-8498 | 8.4 High | An HTML author could hide markup in an HTML comment that escaped the cleaning and ran for every reader. |
| GHSA-fhp6-g58h-v9w3 | 8.4 High | On libxml2 before 2.15, an HTML author could hide markup in a processing instruction, running for every reader. |
| GHSA-vj2h-r54v-2533 | 8.4 High | On libxml2 2.14 or later, an HTML author could hide tags in an iframe's text, running for every reader. |
| GHSA-xj8c-p924-m7pq | 8.4 High | An HTML author could end a bbcode tag inside an HTML tag or comment, turning the text after it into script. |
| GHSA-53pg-w64x-rch7 | 8.4 High | An HTML author could hide markup in an editor-inserted bbcode element, running for every reader. |
| GHSA-rqf5-2crw-v646 | 8.0 High | With clickable links opening in the same window (not the default), a member's plain-text script address became a link that ran when clicked. |
| GHSA-46mx-667v-9hwp | 8.0 High | On PHP before 8.2 under a Turkish or Azerbaijani locale, a member's [url] or [link] could get a script address past the check. |
| GHSA-2x4v-8xq6-mp82 | 8.0 High | An HTML author, or a member whose news submission was approved, could run script through a shortcode inside an HTML attribute. |
| GHSA-wpp9-c4vh-p9fq | 6.8 Medium | A member's bbcode image or link could send each reader's security token to another site, enabling token-protected admin actions. |
| GHSA-j5mj-c54p-ccw8 | 5.0 Medium | A member's [img] could make the server list any folder it could read, outside the website included, or an FTP server's. |
| GHSA-33g6-fqff-2w9p | 4.4 Medium | A member not allowed to post HTML could get working HTML into RSS feeds and forum subscription emails. |
| Advisory | Severity | What it was |
|---|---|---|
| GHSA-7w79-c68w-m3hq | 9.1 Critical | An HTML author could run script in readers' browsers through data- attributes, some needing no click. |
| GHSA-x99q-r9j9-wr88 | 8.4 High | An HTML author could make a show-more link run script for whoever clicked it. |
| GHSA-4chr-7w3m-mqq3 | 8.4 High | An HTML author could make a pop-up link run script for whoever clicked it. |
| GHSA-8cw5-vrrm-639v | 8.4 High | An HTML author could make a comment edit button run script for whoever clicked it. |
| GHSA-8698-q2q9-x4xm | 8.4 High | An HTML author could make a rating run script when a signed-in reader hovered over it. |
| GHSA-5hp5-4669-q626 | 8.4 High | An HTML author could write a link that fetched script from another site and ran it on one click. |
| Advisory | Severity | What it was |
|---|---|---|
| GHSA-39qm-9c2q-qvwp | 9.6 Critical | A forum post's attachment list could be read back naming files its poster never uploaded, so a guest could make the forum serve another guest's attachment. |
| GHSA-m95h-mp65-826r | 9.6 Critical | A visitor posting without an account could give a name that ran script for everyone shown it. |
| GHSA-6m74-6r8m-92wx | 9.0 Critical | A forum poster could name an attachment so that it ran script for the topic's readers. |
| GHSA-c32r-5vgh-pxmg | 9.0 Critical | A thread's starter could edit its title to run script for everyone shown it. |
| GHSA-x3x6-97h2-7xp4 | 9.0 Critical | A member could name a thread so that it ran script when an administrator opened its report. |
| GHSA-hj5v-m79p-4cjq | 9.0 Critical | A member could edit their own post to run script for everyone who opened the topic. |
| GHSA-4h6f-79jg-c8fw | 9.0 Critical | A member's post could run script in the editor of an administrator who quoted or edited it. |
| GHSA-cr4j-g226-94fx | 9.0 Critical | A code in a thread's name could run script for everyone who opened its forum. |
| GHSA-gmxq-j944-84rf | 6.5 Medium | A moderator of one forum could act as one in other forums. |
| GHSA-h763-2g75-85x2 | 6.5 Medium | A member who may post in a forum but not view it could read its posts. |
| GHSA-3qc7-83pq-gf73 | 5.4 Medium | A member who could start a thread could overwrite any poll on the site. |
| GHSA-6qr8-c9rm-jc72 | 5.3 Medium | A visitor allowed to view no forum was shown the whole forum index. |
| GHSA-cj4m-q95v-98c6 | 5.3 Medium | Anyone could learn the titles of threads in forums closed to them. |
| GHSA-3w6f-q2fp-3qcm | 5.3 Medium | A forum's page named the sub-forums in it that were closed to the visitor. |
| GHSA-f6wf-9rgv-v6m5 | 5.3 Medium | The forum search named every forum to any visitor, admin-only ones included. |
| GHSA-835r-q7wf-499j | 5.3 Medium | A forum moderated by a class in a class tree gave moderator powers to the wrong users. |
| GHSA-9qxp-m7jg-9xwf | 4.3 Medium | A member could quote a post into any open thread, even one in a forum hidden from them. |
| GHSA-xj38-4v6m-2c83 | 4.3 Medium | The author of any reply could rename its thread and unpin it. |
| GHSA-pg3x-w47r-26c2 | 4.3 Medium | Members could start topics in forums where only staff may start them. |
| GHSA-hg7j-grmq-hwwv | 4.3 Medium | A moderator could split posts into a forum they do not moderate. |
| GHSA-fr3x-g52f-pg45 | 3.1 Low | A member could save a post to a forum or thread their permission was not checked against. |
| Advisory | Severity | What it was |
|---|---|---|
| GHSA-vfc3-x99c-2j47 | 9.6 Critical | Anyone could craft a comment.php link that ran script for whoever opened it while signed in. |
| GHSA-g7rc-4jvq-27m9 | 9.6 Critical | Anyone could send a link that ran script, through the advanced search's Author field, for whoever opened it, administrators included. |
| GHSA-7232-gr39-h92m | 9.0 Critical | A member's thread name, comment subject, or chatbox message could run script on List New Items and its menus. |
| GHSA-96vv-8fmj-6xfq | 5.3 Medium | comment.php showed visitors the titles and comments of items their own pages withheld. |
| GHSA-c3hr-jgwg-r7xv | 5.3 Medium | The latest comments menu showed comments left on password-protected pages. |
| GHSA-58j5-4h2g-fh4c | 5.3 Medium | The comments search showed anyone comments, with the item's title, on news items and downloads they could not read. |
| GHSA-xpgr-mpvw-m63w | 5.3 Medium | The comments search showed comments an administrator had blocked or not yet approved. |
| GHSA-2rfr-36m8-hjc2 | 4.3 Medium | A member could page through the comments of items they may not read. |
| GHSA-xf8f-w5mv-hcg3 | 4.3 Medium | A member could post comments onto items they may not read. |
| Advisory | Severity | What it was |
|---|---|---|
| GHSA-ff9g-2q9w-43gh | 9.6 Critical | Anyone could send a link to an admin list or a search whose page links ran script for whoever opened it. |
| GHSA-prf8-95f7-7q86 | 9.0 Critical | A member's news submission approved unedited, or any page, news item, or FAQ question, could run script for readers through shortcode parameters. |
| GHSA-xpfc-85q6-4659 | 8.0 High | A page or FAQ question naming {IMAGESELECTOR} could run script when a reader picked an image. |
| GHSA-hxpw-337x-cj7g | 8.0 High | A page or FAQ question naming {IMAGESELECTOR} could make its preview link run script on a click. |
| GHSA-6r9c-6jvj-5wrp | 8.0 High | Another website could run script in an administrator's browser through any page whose text names {IMAGEPREVIEW}. |
| GHSA-mc79-4frh-x2p7 | 8.0 High | A page or FAQ question naming {UPLOADFILE} could run script when a reader clicked Add Another File. |
| GHSA-994c-jv82-j79r | 5.9 Medium | A member's news submission, once published, could send each reader's security token to another site. |
| GHSA-55xx-wjmc-63jc | 5.4 Medium | A page or FAQ question naming {BREADCRUMB=...} could print markup from a crafted link, running its script. |
| Advisory | Severity | What it was |
|---|---|---|
| GHSA-r42m-hch3-vg4g | 9.6 Critical | A crafted link could run script in a signed-in administrator's browser through the PHP Errors debug panel, even with debugging off. |
| GHSA-fmrc-cg23-8fmv | 9.6 Critical | A crafted link to the news page could run script in a signed-in administrator's browser through its debug table, even with debugging off. |
| GHSA-q899-38jg-q5hm | 9.6 Critical | A crafted link could run script in a signed-in administrator's browser through the Shortcodes / BBCode debug panel, even with debugging off. |
| GHSA-pwhr-95w9-f629 | 9.0 Critical | A member's comment, signature, or submitted news could run script for an administrator who opened it for editing. |
| GHSA-v773-ph53-fmx6 | 8.4 High | An administrator limited to pages could run script for the main administrator through a page title in an admin list. |
| GHSA-p622-mg4c-fpc6 | 6.8 Medium | An administrator who may manage users could read every account's password hash from the user list's search suggestions. |
| GHSA-g676-96h8-qgv5 | 6.0 Medium | A delegated administrator could make an admin form write a row it never loaded, such as the main administrator's account. |
| GHSA-r7xc-wvxg-23j5 | 5.5 Medium | Any administrator, whatever permissions they held, could change any site preference through an admin page's options. |
| GHSA-h657-rx62-qm6j | 4.9 Medium | An administrator holding any news permission could rewrite news items inline and reorder every news category. |
| GHSA-ccrh-5wjq-72mq | 4.4 Medium | An administrator holding only the news category permission could rewrite any news item by front-end inline editing. |
| GHSA-78j8-h8ww-p8wf | 3.3 Low | On PHP before 8.2 under a Turkish locale, a delegated administrator could reach an admin route its permission refused. |
| GHSA-3cjg-6rq3-m3qr | 2.7 Low | An administrator allowed only to manage bans could change the ban messages and durations reserved to the main administrator. |
| Advisory | Severity | What it was |
|---|---|---|
| GHSA-2vhc-52q2-2j5f | 8.4 High | An administrator limited to one area, such as Navigation, could save a javascript: link that ran for whoever clicked it. |
| GHSA-fm7r-8pvc-x36q | 8.4 High | An administrator limited to Navigation could add a popup link whose address ran script for whoever clicked it. |
| GHSA-8wmw-xrxv-hvrm | 8.4 High | An administrator limited to pages could put script in a chapter's custom field settings, run when the main administrator edits one of its pages. |
| GHSA-fhcg-cf34-cg8h | 8.4 High | An administrator limited to the hero plugin could put script in a slide's bullets or buttons, run for every home page visitor. |
| GHSA-c8wm-82cq-3qj2 | 8.4 High | An HTML author could plant a menu link that, clicked in the Menu Manager, ran another site's script as the administrator. |
| GHSA-chxg-8grm-hpmq | 8.0 High | With screentips on, a link description could run script for every visitor of a theme using the older {SITELINKS} menu. |
| GHSA-86rc-hq8m-mwwr | 7.6 High | An administrator limited to pages could put script in a custom page field, run for anyone viewing a layout that prints it. |
| Advisory | Severity | What it was |
|---|---|---|
| GHSA-3gqj-7q5v-m8wg | 9.6 Critical | On sites with public uploads switched on, an uploader could run script in the browser of an administrator reviewing Admin > Uploads. |
| GHSA-7xc8-m3cv-mq65 | 7.2 High | An administrator could store a Media Manager upload under a file type the site does not allow to be uploaded. |
| GHSA-v6mf-xx46-236j | 3.8 Low | An administrator with Media Manager access could move a file from elsewhere on the server into the public media folder. |
| GHSA-3c5x-q658-vx68 | 3.8 Low | An administrator with Media Manager access could delete or overwrite files outside the media folder. |
| GHSA-69r3-7r4c-6gmw | 3.8 Low | An administrator with Media Manager access could delete files outside the avatars folder. |
| GHSA-w39w-6mq9-p36q | 2.7 Low | An administrator with Media Manager access could import a file into folders outside the media folder. |
| GHSA-768c-62jm-23j8 | 2.7 Low | An administrator with Media Manager access could change a database query with a quote in a file's name. |
| Advisory | Severity | What it was |
|---|---|---|
| GHSA-cx6q-399j-w6fw | 9.0 Critical | A download's name, set by a downloads administrator or an accepted public upload, could run script for an administrator opening its edit page. |
| GHSA-hhh4-9hgp-84w8 | 8.4 High | An administrator who manages downloads could give a mirror an address that ran script for any administrator opening that download's edit page. |
| GHSA-7hgq-9836-h28c | 8.0 High | Where members may ask FAQ questions, an answered question could run script, through its share buttons, for everyone opening the FAQ page. |
| GHSA-x33v-p7mw-q88f | 5.7 Medium | Anyone who could get a {MENU} shortcode into displayed text, such as an answered FAQ question, could read the database through a news menu. |
| Advisory | Severity | What it was |
|---|---|---|
| GHSA-45hh-fwg8-24j2 | 8.4 High | An administrator holding only the social plugin's permission could run script on every page through a social page address. |
| GHSA-2vgc-f528-4vvf | 8.4 High | An administrator holding only the social plugin's permission could run script in other administrators' sessions, the main administrator's included, through a stored provider or file name. |
| GHSA-gg38-5hqf-7h6r | 7.6 High | An administrator holding only the social plugin's permission could run script through the Facebook app id on pages that load Facebook's SDK. |
| GHSA-q9p8-h9h3-r5v5 | 6.1 Medium | When social login has an OpenID provider enabled, anyone could write a sign-in link that put their script on the page a visitor lands on. |
| GHSA-p4fv-hmmr-38p8 | 4.9 Medium | An administrator holding only the social plugin's permission could make social login read files on the server, e107's configuration file included. |
| GHSA-mg3f-xg6g-g3pc | 3.8 Low | An administrator holding only the social plugin's permission could choose the classes, files, and servers social login uses, and what it unserializes. |
| Advisory | Severity | What it was |
|---|---|---|
| GHSA-6mxv-9x4j-8rhr | 8.3 High | On some nginx and PHP-FPM setups, a crafted link could rewrite the link and stylesheet addresses on a page and run script for whoever opened it. |
| GHSA-g2gx-997c-mc67 | 7.1 High | Any page an administrator visited could make the plugin manager install, repair, or upgrade a plugin by hiding a made-up token from e107's check. |
| GHSA-wjmf-r4mf-m9vg | 6.5 Medium | On a site at the root of its host, a crafted link could make the navbar sign-in form send a visitor's username and password to another host. |
| GHSA-cvhc-885w-mm2m | 6.5 Medium | Where the signup form's Password field was set to Hide, anyone could replace the password of an account still awaiting activation. |
| GHSA-93ff-wc89-mhjf | 6.3 Medium | On an HTTPS site, any member could set a profile picture that made an administrator's browser carry out admin actions, such as installing a plugin. |
| GHSA-6wf7-qwj9-hr3r | 5.9 Medium | A page on a neighboring subdomain could make an administrator's browser carry out admin actions, such as installing a plugin. |
| GHSA-hq36-v99x-77g4 | 5.9 Medium | A neighboring subdomain could choose the page an administrator landed on after signing in, and make that page carry out an admin action. |
| GHSA-9mrp-hhpm-ph93 | 5.3 Medium | The activation resend form showed anyone the email address of an account awaiting activation, given only its user name. |
| GHSA-p8q2-x72j-8mvj | 4.3 Medium | With friendly URLs on, a link from another site could make a signed-in member carry out a front-end action, such as blocking a message sender. |
| GHSA-9f6g-4wp7-whmj | 4.3 Medium | A link from another site could make a member who then signed in on that page carry out its action, such as blocking a message sender. |
index.php?logout&e-token={E_TOKEN}: e107 fills in each visitor's token, in navigation links only. (#6303){.{ as entities. Pages, news, and other stored text are covered; templates are not. A shortcode reading key=value pairs, such as {URL=search|q=O'Brien}, now gets its value cut at the quote. (GHSA-prf8-95f7-7q86)data- attributes. A page or news item relying on data-toggle stops working when next saved; stored content is not changed. Since 2.3.0 a new install lets no one post script, main administrators included; choose who may in Admin » Preferences. (GHSA-7w79-c68w-m3hq)[code], [scode], [table], [html], or [php] block shows as typed, and another bbcode shows its HTML as text.[hide] block that opens inside an HTML tag and closes outside it shows, as typed, to every reader.] falls inside an HTML tag or comment shows as text, and such a [hide hides nothing.[img] of a site file outside the Media Manager asked for its thumbnail with a broken size, so it got the full-size file. It now follows the Default Image Sizes (300 by 300 on a new install). (73227b2392)After updating, run the forum plugin's update when the admin area offers it. It changes no post, but counts edited posts holding markup their author or last editor may not post; some may be legitimate HTML. Check those whose post_user or post_edit_user may not post HTML, without viewing them on the forum as an administrator. If the author may not post HTML, saving the post from Edit strips it; fix the rest in the database. (GHSA-hj5v-m79p-4cjq)
This read-only query lists every edited post holding <; the posts to check are among them (adjust the e107_ prefix):
SELECT post_id, post_thread, post_user, post_edit_user FROM e107_forum_post WHERE post_edit_datestamp > 0 AND post_entry LIKE '%<%';
Forum moderators are the users who hold the moderator class, including members of the classes that inherit it. On the tree "Set a default user hierarchy" builds, a forum moderated by Admins and Mods is now moderated by its members and the main administrators, no longer by every administrator; add an administrator to Admins and Mods to keep them moderating it. A forum moderated by Main Admin is now moderated by main administrators alone, who moderate every forum. (GHSA-835r-q7wf-499j)
A new topic needs Thread Creation Class and Post Permission both. (GHSA-pg3x-w47r-26c2)
A forum a member may post in but not view takes no posts from them. (GHSA-h763-2g75-85x2)
Only an opening post's edit renames a thread, and a non-moderator's edit no longer unpins it. (GHSA-xj38-4v6m-2c83)
Split and move list only forums the moderator moderates and can view. (GHSA-hg7j-grmq-hwwv)
"Enable polls for" refuses a poll, not just its form. It ships set to No One. (GHSA-3qc7-83pq-gf73)
A sub-forum is closed to whoever its forum is closed to, whatever its own Visibility says. Clear the Sub-forum setting of one meant for a wider audience. (bf9538c730)
A [hide] block opens for a signed-in member who can view the forum and has posted in its thread. None ever opened before, so every stored block now opens to them. Hidden text also stays out of the RSS feed and the latest forum posts menu. (#6782, f28d0802aa)
Thread names render only inline bbcode, such as bold, color, and size; other bbcode keeps only its text, and HTML stored in a name shows as typed. (GHSA-c32r-5vgh-pxmg)
Where uploads allow SVG, an SVG attached to a forum post is offered as a download, not shown as a picture. (#6748)
application/json. Sites defining e_HTTP_STATIC should clear their CDN's cache. (GHSA-vfc3-x99c-2j47)5 covers pages and chapters, J menus; deletes need J1, page options the main administrator.Link fields refuse a javascript:, vbscript:, or data: address, or one starting with a shortcode other than an {e_…} folder, unless you may post script: Navigation, social links, Custom Button URL, custom page URL fields, Linkwords, download mirrors, feature box images, hero buttons, and public uploads. Stored addresses are kept, so review yours; a heading that goes nowhere takes #. (GHSA-2vhc-52q2-2j5f)
Custom page fields and hero slides no longer run script their author may not post. Field values and hero bullets saved before 2.3.13 keep their formatting but lose script and event handlers, with no re-save, except icon, tag, checkbox, and progress-bar values, which show HTML only when saved by someone who may post script. Where you narrowed who may post HTML, kept formatting can include some their author may not post. Old field labels and hero buttons show HTML as text until changed. (GHSA-86rc-hq8m-mwwr, GHSA-fhcg-cf34-cg8h)
With caching on, a fragment holding a visitor's security token is not cached, so the comment form is built fresh. Clear Admin Area » Settings » Cache once after upgrading. (#6307)
_ . , : = & -. The address remembered for after sign-in now comes only from the session, so a members-only site sends a visitor whose remembered query held %, +, or / to the front page. (GHSA-9f6g-4wp7-whmj, GHSA-hq36-v99x-77g4)Social login now ignores stored provider settings that only a site's own code should set. The social plugin saves provider settings only under names Hybridauth supports. Telegram's form no longer offers a callback field. Nothing stored is rewritten; a social sign-in in progress during the upgrade may have to start over. (GHSA-mg3f-xg6g-g3pc, GHSA-p4fv-hmmr-38p8)
Social login checks the provider's TLS certificate, except for OpenID 2.0 providers such as Steam, and offers LinkedInOpenID, OktaOIDC, and X. The bundled Hybridauth is now 3.13.0. A host without a usable CA bundle, which already fails plugin downloads, now fails social login too. (#6372)
Signed-in pages no longer load the social login library just to ask whether social login is on. Answering used to parse every bundled provider file on every signed-in page, even with social login off. (#6514)
order setting must name columns. The latest-news and news-grid menus accept only a list of columns, each optionally followed by ASC or DESC. Any other value now sorts newest first. (GHSA-x33v-p7mw-q88f)fastcgi_split_path_info with PATH_INFO, add try_files $uri =404;, or set cgi.fix_pathinfo=0; in a named location that hands unknown addresses to index.php, add fastcgi_param SCRIPT_NAME /index.php;, with the site's folder in front if it has one./~user/ address, a web folder whose name holds anything but ASCII letters, digits, and - . _ ~ is percent-encoded in the site's address, and the site's cookies are set on the folder above it. Every application under that folder receives them. Where the name holds a comma, a sign-in from before the update survives signing out until its cookie expires, within a day by default.e107_config.php. A $mySQLport line was ignored. If yours sets one, check that your database server listens on it. (#6663)& in a [link], [url], [file], [email], [img], [flash], or [stream] address was encoded too often, so ?a=1&b=2 lost its second parameter. An apostrophe in an [img] alt text or caption no longer shows as an entity. (94ef3d1ae4, 73227b2392)& is stored once. Since 2.2.0, text from anyone outside "Class which can post HTML" showed & for a typed &. Older text loses the extra level when next saved, except inside [code], where you remove it by hand. (#6791)[color=#ff0000] stays as typed, not a bare [color]. (#6444)[size2]hello[b]world[/size] no longer vanishes. (#6573)[scode] keep the quotes around their attribute values.+ in a field after an editor field, such as a page's meta title, is no longer saved as %2B.[sanitised] block no longer fails; it shows ##Sanitised##.a < b beside markup keeps its < on hosts with libxml2 2.9.10 or older, which dropped it and what followed.[quote] block; one with bold text or a link was quoted as plain text. (#6782){UPLOADFILE} and upload.php stay closed while public uploads are switched off, as on a new install. (a7f86886a9)+. (#6330, #6313, #6357, #6439)# after a space finds matches on the default sort method. (#6478)/faqs could open the admin area for administrators and the admin login for everyone else. After upgrading, delete e107_plugins/faqs/controllers/ if it is still on disk, then run the FAQs update in Admin » Plugin Manager, which rebuilds the URL settings. (#6502)& in an author's name no longer breaks the feed. (#6473)login.php already closes with User Registration/Login disabled and no social login. (#6501)42, is no longer refused a link while that account has a reset outstanding.wget, curl -o, lwp-download, or onmouse no longer ends on a blank page. The request filter answered any posted value or query string holding them with an empty 400 error. (#6759)user_ban_failed_login, only when it adds one. (#6771)/ again. The Site Information tab silently refused to save it. Until it includes the site's host, the admin home warns main administrators that links in mail sent by scheduled tasks will be relative. (#6117)plugin.xml names comment types in <commentID> no longer deletes every comment on the site, nor fails with a single type on PHP 8. Its own comments are now removed only when its tables are, and kept when they are kept. No bundled plugin declares any. (#6780)e107_system is on another file system, such as a container volume of its own; it used to stop at "Couldn't Move". If the move into place fails during an update, the installed copy is put back. (#6713)stmp.jpg, whose second to fourth characters are tmp. (#6777)site_path in e107_config.php is back on its own media and system folders. From v2.3.4 every such site saved uploads, backups, and logs under the folder 5058f1af83. If files saved since are missing, follow the dashboard's link to Database Utilities » Multi-Site and merge the folder marked Known bad. (#6498)og:url links are full addresses again where the Site URL holds only a folder, as a subfolder install's does. (#6601)e_parse::toBBCodeUrlAttribute() and e_parse::bbcodeTextAsTyped() encode a bbcode's values once. Give toBBCodeUrlAttribute() a bbcode's stored address; it returns '' for a refused scheme. bbcodeTextAsTyped() gives back any other parameter as typed, for the bbcode to encode once. A bbcode encoding $parm as stored shows & for &. (GHSA-9jr4-3wxc-m2cm, GHSA-x2x3-xr6p-4xc2)
| Name | What it does |
|---|---|
e_parse::shortcodeModifiersForAuthor() | Adds scparse_off unless the author is an administrator. |
e_parse::toRssForAuthor(), notify::sendForAuthor() | The same for feeds and notifications; toRss() and send() are unchanged. |
e_parse::languageTerm($name) | Static. A defined language term's value, else null. |
e_parse::attributeValue() | Now public. Encodes a value for an attribute. |
e_bbcode::getRegistered(), isRegistered() | Every registered bbcode and who provides it; whether a tag names one. |
eShims::strtolower(), eShims::strtoupper() | Static. ASCII-only case folding. |
{E_TOKEN} | In a stored navigation link, filled with each visitor's security token. |
e_admin_controller_ui::$listScope | The rows of a shared table an admin list owns, applied to the list, edit load, inline editor, and sort; its array form also pins those columns. |
'linkAddress' => true | Field option. Refuses a script address on every save, inline included, from a saver outside post_script unless it is unchanged; the form shows the stored bytes, and a refused inline edit answers 400 with the reason. |
e_parse::maySaveLinkAddress() | Whether the current user may save a link address. |
e_admin_controller_ui::maySaveLinkAddresses() | Protected. Asks maySaveLinkAddress() for each of a save's link fields, and refuses the save with an error on each field that fails. |
e_parse::isUnchangedPost() | Tells an untouched post from a changed one. |
'search' => false | Field option. Keeps search, filters, and sorting off a field, as users.php does for the password; the ajax filter suggests only searched columns, matching the term as text. |
comment::canReadComments() | Whether the visitor may read an item's comments. |
FORLAN_HELP_IMAGE_DISPLAY, FORLAN_HELP_ICON_DISPLAY | New forum admin phrases. |
e_file::webOnlyCurlOptions() | Curl options limiting a request and its redirects to HTTP and HTTPS; throws RuntimeException where curl cannot be limited. |
e_file::currentUserMayUsePublicUploads() | Whether public uploads are on and the current user is in the upload class. |
e107.callbacks.isWebAddress(url) | JavaScript. True for an http, https, or page-relative address. |
e_search::authorId($author) | The user id an advanced author filter sent, or 0. |
e107\Database\IdentifierFilter | identifier(), direction(), orderBy(), and filterOrderBy() check SQL identifiers and sort fragments, answering false or a default outside the grammar. |
POLLAN_POST_POLL, BNRLAN_HELP_*, BNRLAN_PLACEHOLDER_*, BNRLAN_TITLE_REMOTE_IMAGE, BNRLAN_MENU_MANAGER_CONFIG | New phrases: the forum poll heading, replacing the undefined LAN_4, and the Banner admin texts, with English fallbacks. |
e107\Flood\SourceGate | Rations an action per source: isClosedTo(), record(), forget(). |
e107::invalidateOpcache($file) | Drops OPcache's copy of a PHP file e107 replaces or deletes. |
e107::cookiePath($path) | Static. A web path cut above its first folder holding a %; scope a plugin's own cookie with e107::cookiePath(e_HTTP). |
e_parse::toDBWithoutScript() | Converts as toDB() stores for an author who may post HTML but not script. |
e_parse::toJsUrl(), sitelinks::popupScript() | Build a javascript: address and a popup call. |
e_bbcode::hideBlocks(), hideBlockTree() | A text's [hide] blocks, and every one, nested ones included. |
sitelinks::fillToken() | Fills a stored navigation link's {E_TOKEN}. |
e107forum::threadNameHtml(), withoutHiddenBlocks(), canAttachPoll(), mayReadHidden() | The forum's thread-name renderer, [hide] stripper, and poll and [hide] checks. |
forum_attachments::label(), asServed(), isSvg(), fileName() | Static. |
e107\SocialLogin\SessionStorage | Social login's Hybridauth session storage, which never unserializes a value. |
media_admin_ui::mediaFolderPath() | An item's expanded address, '' when its folder is missing, or false when it lies outside the media folder. |
e107\Admin\AddonUpdateStatus, admin_shortcodes::renderAddonUpdateNotice() | The dashboard's add-on update answer, kept site-wide, and its notice. |
e_search::getCommentHandlerPath(), isCommentHandlerAvailable() | A comment search handler's path, and whether its plugin can serve it. |
e_plugin::isInstallRequired(array $meta) | Static. Whether parsed plugin.xml asks to be installed. |
e107\Database\TreeOrder::positions() | Depth-first sort keys and depths for an adjacency list; selectTree() uses it. |
private_message::QUEUE_TYPE, QUEUE_TYPE_RUNNING | gen_type of a queued bulk PM send, and of a claimed one. |
e_online::defineUnsampledState() | Defines the online constants as empty strings where goOnline() did not run. |
banlistManager::importBanlistCsv() | Imports a ban list CSV; returns counts and per-line errors. |
redirection::isSafeLanding() | Whether sign-in may land on an address, judged by its spelling, not its host. |
e107\Storage\SiteFolder, SiteFolderScan, SiteFolderMerge | Site folder pairs, the scan, and the merge. |
Vendored guzzlehttp/psr7 is 2.13.1, so the global GuzzleHttp\Psr7\* functions are gone and a plugin calling them fatals. Use the static methods on Message, Utils, Query, Header, and MimeType. psr7 and what it requires are downgraded to run on PHP 5.6; Hybridauth 3.13.0 needs no downgrade. (#6372)
e_HTTP is cut at the running script and percent-encodes all but letters, digits, and - . _ ~ / %, unless its folders are the install's own on disk. e_REQUEST_URI and e_REQUEST_HTTP start with one slash, never /\ or /&, and e_SELF and e_REQUEST_URI spell the site's folders as e_HTTP does. (GHSA-6mxv-9x4j-8rhr, GHSA-wjmf-r4mf-m9vg)
e107\User\LogoutConfirmation asks a member who opens a logout link without a token whether to log out. index.php serves it through e107\Routing\RouteTable with e107\Http\Request, Response, and e107\Theme\Page, from the new logout_template.php, which a theme can override. A customized index.php that does not set $_E107['route_table'] keeps the old refusal. (#6753)
Inside an HTML attribute, print a custom page field with mode=raw, as in alt="{CPAGEFIELD: name=x&mode=raw}", and never a rich text or text area field or a hero bullet's text: printed normally, a value can end the attribute and run script, whoever saved it. (GHSA-86rc-hq8m-mwwr, GHSA-fhcg-cf34-cg8h)
SHOW COLUMNS probe, and Who's Online classifies each user agent once.tmp table is pruned on one request in a hundred, and a database session close no longer collects expired sessions each time.strftime() shim reuses its IntlDateFormatter, and e_media::getGlyphs() builds each precompiled icon set once per request.| Name | What changed |
|---|---|
bbcode_shortcodes::renderEmotes() | Removed, so a theme or plugin calling it fails. r_emote() draws the emoticon panel. |
e_parse::toAttribute(), replaceConstants() | toAttribute() expands only web folder path constants, and encodes their values. replaceConstants() by default expands only web and server path constants; $all = true expands the rest. |
e_parse::toHTML() | A strip list that names hide strips [hide] blocks with the rest; they came back as the bbcode's box. |
e_parse::toDB() | A numeric fifth argument, a user id, only forced encoding; now that user's post_html and post_script decide what is kept. |
text_truncate(), toEmail(), toForm() | Keep < and > encoded where they used to decode them, and text_truncate() keeps every entity. |
| Shortcode parameters in content | Quotes, angle brackets, and { arrive as entities. |
| A field whose whole text names a constant | Converts only when the constant is a language term. |
toWYSIWYG() hook | Receives an admin UI bbarea field's text, and the news body's, encoded. |
e107Email {BODY} | Receives the body unparsed: render it first, or set mail_body_author on a bulk mail. |
{LAN=X} | Prints LAN_X, or X only when it is shaped like a language term: a capital first, word characters only, and either LAN inside or a final digit. Other constants print nothing. |
{NEXTPREV} | Re-encodes its address and drops a non-web one. pagetitle entries lose tags and shortcodes. bullet prints as text unless it is one <img> under THEME_ABS with only alt and class, like core's. |
{BREADCRUMB=name} | Reads only an array global with a plain variable name. |
{IMAGESELECTOR}, {IMAGEPREVIEW}, {UPLOADFILE} | Quote their values as JavaScript strings and refuse a non-web preview address. {IMAGESELECTOR} ignores undocumented parameters. |
{PLUGIN=}, {MENU=}, {PAGE_NAVIGATION: name=} | {PLUGIN=} and {MENU=} take only word characters and hyphens; name= takes only page_metatitle, or menu_title for the menu's class. |
{SEARCH_ADV_ID} | Binds the advanced search template's label; an overriding theme still on for="t" keeps the old binding. |
| Required-field marker | e107.css draws the asterisk. A theme that draws its own may show two; .required:empty::after { content: none } turns core's off. |
| Right-aligned dropdowns and floats | Core uses dropdown-menu dropdown-menu-right dropdown-menu-end, and right floats pull-right float-right float-end. Menus lost pull-right, so a theme bundling Bootstrap older than 3.1.0 loses their alignment. |
| bootstrap5 Font Awesome | Loads as CSS, not script, so CSS aimed at svg.svg-inline--fa stops matching there. |
e-expandit, e-comment-edit | Look their target up as a selector only. |
e-modal | Opens only an http, https, or relative address, and prints data-modal-caption as text. |
e-ajax | Fetches only from this site, and inserts an answer only if it ends there as text/html or application/json. data-loading-icon is applied as class names. |
.e-rate | Its status line and vote count must be its siblings, as core writes them. A rating without data-hint is skipped. |
comment::enter_comment() | Refuses items the poster may not read, and comment types core does not model, such as a plugin's own. |
| comment.php AJAX answers | application/json; read them with dataType: 'json', not $.parseJSON(). |
e107forum::forumGetForumList() | Returns false to a caller who may view no forum, and to an object built with new e107forum(true); forumGetForumList(true) returns every row. |
poll::submit_poll() | Mode 1 needs poll admin rights. |
e_list.php heading and info | Printed as built; a section that wants them rendered renders them itself. |
e107MailManager::sendEmails(), private_message::pm_send_notify() | Return false when the send fails. |
| Admin UI routes | Names fold case in ASCII; an unknown action falls back only to a granted default; an ajax page runs only on ajax; actions reach only action methods. |
| Admin UI saves | Follow the route: create inserts; edit and inline update the loaded row or refuse. Inline, sort, and a plugin's batch_<plugin>_<command> need the edit route. |
e_admin_ui::PrefsSaveTrigger() | Saves only keys $prefs declares; declare every option you post. |
e_front_model::getIfPosted() | Writes a posted string's & as &, so a form redrawn after a failed save shows what was posted, entities included. |
| Front-end inline editing | Refuses a map without perms; inline.php used to read perm. Maps are kept under a new session key, so inline editing works once a page is loaded after the upgrade. |
| Menu Manager options | A .e-menumanager-option link loads only from menus.php, and mode=conf redirects only to a config.php or *_menu_config.php. |
e107plugin::manage_comments('remove', ...) | Takes one type or a list; returns false for an empty list instead of deleting every comment. |
e_file::curlOptions() | Throws RuntimeException where curl cannot be limited to HTTP and HTTPS. |
e_user_provider | Builds Hybridauth on first use; its protected $hybridauth is null until then. Only stored settings are filtered, not a configuration passed to the constructor. |
e_user_provider::login() | A refused sign-up (code 5) throws with an empty message; its reasons go to the message stack. |
| Comment search handlers | Skipped unless one sets $comments_class[key] or $comments_where[key], saying who may read its items, as the poll plugin's does. Blocked comments are excluded. |
An addon's author search filter | Receives the picked member's user id. e_search::authorId() returns it, or 0 for typed text; the _blank plugin's e_search.php shows the pattern. |
e107_handlers/search/ | Six dead legacy handlers are deleted. An upgrade leaves the old copies on disk. |
e_pref::save() | No longer loads the admin language pack, which a front-end, cron, or CLI request saving a preference, such as a new most-online record, gained. Front-end code reading admin phrases must load them or use defset(). |
e_db_pdo | Instances share one connection per set of parameters, so session state set through one (temporary tables, SET SESSION, user variables, locks, transactions) is seen by the others. For a session of your own, call connect() with $newLink = true. |
| Preference cache files | JSON wherever JSON reads back the identical array. e107::unserialize() reads both forms. |
dbError() | Answers alike on both backends: null, or "$from :: $text". |
xmlClass::getLastErrorMessage() | Always a string, naming the parse errors or a failed fetch's HTTP status. |
selectTree() | Same _treesort and _depth; needs only SELECT; refuses bad identifiers. |
e_news_tree::loadJoin() | db_order must be columns with optional ASC/DESC, else newest first; db_limit is cast to integers. |
ecache::setMD5() | Hashes text with the site's web path. Code that builds an entry's file name from md5($text) should use retrieve() and clear() with its tag; setMD5($hash, false) is unchanged. |
e_array::unserialize() | Reads a row as written before trying it unslashed, so a value containing 0 => ' no longer empties its row. |
class_list() | Deprecated, because only its user-id form includes inherited classes. Use e_user_model::getClassList(). |
| CHAP | e107_web/js/chap_script.js is deleted, UserHandler::CheckCHAP() and e_core_session::challenge() are deprecated and unused by core, and userlogin::login() ignores $response. |
caption, html, or help no longer raises an undefined-key warning. (#6214){LOGO} no longer raises a diagnostic on a legacy theme whose logo file is missing or unreadable. (#6148)e107_db_debug::log() and dump() name a top-level caller {main} instead of warning, and stop printing ()(). (#6378)upload.php no longer reads form fields a first visit has not posted. (#6361)http_build_query() gets '', not null. (#6445)usubstr() and html_truncate() keep the text they should. usubstr() without a length returned '' below PHP 8; html_truncate() with $exact = false lost text that had no space. (#6464, #6475)parent::__construct(), or never calls it, no longer fatals on PHP 8, and keeps the value. (#6658)cleanHtml() no longer fatals on the call after a <pre> inside a stripped tag, nor e_form::uc_checkbox() on an array value. (#6801)optArray leaves the batch and filter menus with a debug line instead of breaking the list page. (#6403)defset(), so a pack missing one no longer stops the page on PHP 8. (#6526)selectTree() creates no stored functions, and siblings sharing an order no longer interleave. (#6297)isTable() sees tables the same instance creates, drops, or renames. (#6374)tables(), isTable(), and hasLanguage() no longer list another prefix's tables. (#6672)e_db_mysql::lastInsertId() answers for the instance's own last statement. (#6715)multi_row plugin or theme preference keeps its own cache file and object. (#6338)e107MailManager reads a queued email back as saveEmail() stored it; a raw apostrophe in its sender, copies, or attachment emptied all three. (34591e2243)e_file::copy() passes its options into subfolders and returns false at the first entry it cannot copy; the theme converter's clone stops there. (#6713)e_file::get_files()'s standard filter skips only names that start with .tmp. (#6777)goOnline() is skipped, as on AJAX, the online constants are empty strings, so online.php no longer fatals.MEMBERS_ONLINE is 0.{ONLINE_TABLE_MEMBERS_ONLINE} and {ONLINE_TABLE_GUESTS_ONLINE} were swapped.Thanks to
/ and the admin area an old language pack took down (#6101); towget and the pull request that removed it (#6759, #6762); and toFull changelog: v2.3.12...v2.3.13
SearchRank 1.4.0 is now available for Geeklog, bringing a redesigned dashboard, improved search statistics, better navigation, and additional privacy protections.
SearchRank helps website administrators understand what visitors are searching for on their sites. This information can help identify popular topics and opportunities to improve website content.
With version 1.4.0, I have focused on making these statistics easier to access and understand.
The main improvements include:
A redesigned dashboard with daily search activity charts.
Search statistics for 7, 28, 90, and 365 days, depending on data retention settings.
Improved reports with filters, historical comparisons, and pagination.
CSV export for further analysis.
Better mobile layouts and French translations.
Stronger protection against recording sensitive search expressions.
New read-only statistics services for integration with other Geeklog plugins.
Improved CSS cache management and compatibility fixes.
The update also simplifies administration by separating the dashboard, detailed reports, and search history.
SearchRank 1.4.0 supports MySQL-compatible databases and declares Geeklog 2.1.3 and PHP 5.6.40 as minimum requirements.
I have successfully upgraded an existing SearchRank 1.3.0 installation to 1.4.0 without losing search history.
As always, I recommend backing up your database before upgrading. Additional testing on older environments is still recommended.
The new version is available from the Geeklog Downloads section and the official GitHub repository.
Geeklog Downloads:
https://www.geeklog.net/downloads/index.php
GitHub:
https://github.com/Geeklog-Plugins/searchrank
I welcome feedback and bug reports to help improve future versions of SearchRank.
Posted November 9, 2026 | 1:52 amQuote from: Swoody on <strong>Today</strong> at 08:53:26 AMbut won't on default install have to delete board then recreate it???
Quote from: Aleksi "Lex" Kilpinen on <strong>Today</strong> at 10:35:56 AMNo, you can modify them.Posted November 9, 2026 | 3:23 pm
1) Admin -> Fo...