Changelog
2.4.1
- Fixed: the TYPO3 version constraint now targets the v14 LTS.
typo3/cms-corewas declared as^13.4 || ^14.0andext_asemconf. php 13.4.0-14.4.99, which also covered the 14.0--14.2 sprint releases. Both now target 14.3 (^13.4 || ^14.3,13.4.0-14.3.99). See pull request #139. - Fixed: the version metadata published to Packagist matches the
release again. The
v2.4.0tag was first pushed against a commit whoseext_still reademconf. php 2.3.1. Packagist recorded that reference for2.4.0and, under its immutable-version policy, kept it when the tag was moved -- so2.4.0installed via Composer reports2.3.1to the Extension Manager. Installs from 2.4.1 on carry the matching version. The2.4.0release on TER is unaffected.
2.4.0
- Added:
Environment::getVarPath()(the composer-modevar/directory, a sibling ofpublic/rather than nested under it) is now an allowed root for path validation, so TYPO3-internal generated assets (cache, lock, transient, log) are accepted. - Added:
additionalTrustedRootsextension configuration -- per-instance, opt-in, comma-separated list of absolute filesystem paths that are realpath-resolved and added directly to the path-validation allow-list. Closes the gap for integrator-trusted locations that are neither a FAL storage base path nor one of the hardcoded TYPO3-internal locations. See Additional trusted roots. - Added: configurable WebP/AVIF output quality via the new
qualityWebp(default 75) andqualityAvif(default 60) extension-configuration settings. Previously both variants were encoded at the same numeric quality as the primary image; AVIF's steeper quality scale made AVIF variants larger than WebP at matching numbers, so format negotiation ended up serving the biggest file. The lower AVIF default keeps AVIF variants genuinely smaller than WebP while staying visually comparable. See WebP/AVIF output quality. Changing either setting requires clearing processed images, since per-format quality is not part of the cache filename. Reported in issue #132. - Fixed:
clear-processed-images(Maintenance module) failed on symlinked deployments. The action validated the target path withrealpath(), which resolves aprocessedsymlink (shared-directory deployment layouts, e.g. Deployer) to its target and never matched<public>/-- so clearing failed on every symlinked deployment. The directory is now emptied in place instead ofprocessed rmdir()+mkdir(), preserving the symlink. Reported in issue #131.
2.3.1
- Fixed: the backend module icon and Maintenance module templates
were not TYPO3 v14 theme-aware. The module icon
(
module-) and extension icon (image- optimize. svg Extension.) were flat, hard-coded tiles that did not adapt to the v14 backend light/dark colour scheme. The Maintenance module's Fluid templates also used Bootstrap utility classes with fixed light values (svg bg-light,table-light,text-dark), causing card headers, table heads, and code chips to render as light boxes on a dark backend. The module icon is now theme-aware viafill="currentColor"(TYPO3 v14+, with a legacy full-colour tile kept for v13), and the templates use adaptivebg-body-tertiarytokens instead.
2.3.0
- Added:
additionalTrustedStorageSymlinksextension configuration -- per-instance, opt-in, comma-separated list of directory names that, when found as a symlink directly inside a Local FAL storage's own base path (e.g.fileadmin/_), are resolved and added to the path-validation allow-list. Closes the gap where deployments relocate TYPO3 core's ownprocessed_ _processed_image cache onto local/ephemeral storage to keep it off shared/NFS storage, leaving a symlink behind that the FAL-storage basePath lookup cannot see. Default empty; keeps today's behaviour for every installation that doesn't opt in. See Trusted storage symlinks. Reported in issue #120. - Fixed: images published via
public/_symlinks (extensionassets/<hash> Resources/assets) were rejected with HTTP 400. TYPO3 core publishes each extension'sPublic/ Resources/directory by symlinkingPublic/ public/_to a location outside the public webroot.assets/<hash>/ getAllowedRoots()did not resolve these symlinks, so variant requests for e.g. an extension's default/fallback image failed even though the file is a legitimate part of the deployed application. Every immediate child of_assetsis now resolved individually. Reported in issue #117.
2.2.4
- Fixed: the
sourceSetViewHelper passes absolute URLs (http://,https://,//),data:URIs, and URLs carrying a query string through unchanged and renders them as a plain<img>tag. Previously such paths — e.g. the tokenizedeID=dumpFileURLs fal_securedownload generates for files in non-public storages — were mangled into broken/processed/...variant paths. The access control of the generating extension stays intact; see Public images only: absolute URLs are passed through for the trade-off. - Fixed: backend module labels are resolved via array format.
2.2.3
- Fixed: processed image requests no longer return
HTTP 400 when
fileadmin(or any other Local FAL storage) is a symlink to an external location such as an NFS/EFS mount.isPathWithinAllowedRootsnow accepts any realpath-resolved path that lies within the TYPO3 public root or the realpath of any configured Local storage'sbasePath. Symlinks placed inside a storage that escape every allowed root -- e.g.fileadmin/->evil /etc-- continue to be rejected. Reported in issue #70. - Hardened: paths containing NUL bytes are rejected outright, closing a minor realpath-bypass via the not-yet-existing-path parent-walk branch.
- Changed (BC for subclasses and manual instantiators):
Netresearch\\gains a new requiredNr Image Optimize\\ Processor StorageRepositoryconstructor parameter. Consumers that autowire the service (the default in TYPO3 12+) are unaffected; any code that extends the class or constructs it by hand must forward the new dependency.
2.2.2
- Added
OptimizeOnUploadListener-- PSR-14 listener that runsoptipng/gifsicle/jpegoptimonAfterFileAddedEventandAfterFileReplacedEvent. Keyed bystorageUid . ':' . identifierto avoid cross-storage re-entrancy collisions; restoressetEvaluatePermissionsin afinallyblock. - Added
nr:image:optimize-- bulk optimization command with--dry-run,--storages,--jpeg-quality, and--strip-metadataoptions. Uses a streaming Generator oversys_fileso large installations don't load the full index into memory. - Added
nr:image:analyze-- heuristic analysis command that estimates optimization potential without invoking any binary. Fast even on large installations. - Added
ImageOptimizerservice -- shared backend used by the listener and both CLI commands. Env overrides (OPTIPNG_BIN,GIFSICLE_BIN,JPEGOPTIM_BIN) are authoritative: a set-but-invalid override is reported as unavailable rather than silently falling back to$PATH.$PATHlookups also verifyis_executable().
2.2.1
- Adjusted author information in
ext_.emconf. php
2.2.0
- Fixed: always render
altattribute on generated<img>tags. - Expanded unit test coverage for Processor and SourceSetViewHelper.
2.1.0
New in version 2.1.0
Width-based responsive srcset with sizes
attribute, configurable width variants, and
fetchpriority support.
- Added responsive width-based
srcsetgeneration as opt-in feature. - Added
widthVariantsparameter for custom breakpoints. - Added
sizesparameter for responsive image sizing. - Added
fetchpriorityattribute for resource hints. - Optimized default
sizesattribute values.
2.0.1
- Fixed
declarestatement issue preventing TER publishing via GitHub Actions.
2.0.0
New in version 2.0.0
TYPO3 13 compatibility with PHP 8.2--8.4 support.
- Added TYPO3 13 compatibility.
- Added PHP 8.2, 8.3, and 8.4 support.
- Dropped support for older TYPO3 versions.
- Switched to Intervention Image 3.x.
- Removed obsolete system binary checks.
1.0.1
- Added
ext_for classic installation.emconf. php
1.0.0
- Initial stable release.
- GitHub Actions CI workflows.
0.1.5
- Fixed
strtolower()null argument error. - Fixed array offset access on boolean value.
- Allowed numeric characters in file extensions.
- Added extension icon.
- Corrected crop variant examples.
- Improved lazy loading behavior.