Grav CMS - Package Updates
-
[1.10.17]
- Update grav to 2.0.18
- Full Changelog
- [security] Updated the bundled DOM sanitizer to 1.0.14, which closes two further ways a crafted stylesheet could hide an external image reference from the checks added in the previous release (GHSA-ww22-4mqv-x5w3).
- [security] Modular pages are now checked for cross-site scripting when they are saved, closing a way for a page editor to store a script that ran for every visitor (GHSA-fg8g-663r-f366).
- [security] The Twig
sortandfindfilters no longer run a plain function name as a callable inside the content sandbox, closing a way for a page editor to execute arbitrary PHP (GHSA-p6qj-p5m7-f62h). - A blueprint that builds on another one can again fill dropdowns from its own PHP, which mostly affected themes because their page blueprints nearly always extend the default one (getgrav/grav-plugin-email#193).
- The Scheduler no longer fails outright on hosts that disable PHP's
proc_open, so scheduled jobs can still be viewed and edited there getgrav/grav-admin-next#16 - A scheduled job that cannot be started on such a host is now reported as failed with an explanation, instead of stopping the whole scheduler run
- Grav now works out who the site runs as without starting a shell, so that detail still appears when external commands are unavailable
- The record of when the scheduler last ran is now written to a fixed location rather than one relative to wherever the trigger happened to run from
- Grav now decides whether the scheduler is being triggered by checking that each job has run when its own schedule says it should have, instead of requiring a run in the last two minutes, so a sparse crontab, a webhook or a scheduled task on Windows all count
-
[1.10.18]
- Update grav to 2.0.19
- Full Changelog
- You can now tighten the Twig content sandbox below its built-in defaults with new
denied_*settings insecurity.yaml. - The "Twig in Content" report can show the effective sandbox policy, so you can see exactly what page content is allowed to do.
- A theme or plugin that ships its own
.htaccesscan no longer switch off the protection on its own folder, which used to leave its configuration and template files downloadable #4236 - Twig in page content now renders on new installs by default, instead of appearing as raw text until the setting was turned on.
- The long Twig sandbox allowlists now ship built into Grav, so
security.yamlonly records your own additions and future security updates to the defaults reach every site. - Existing sites that had trimmed those allowlists to tighten them keep exactly that policy after upgrading, now recorded as explicit
denied_*entries. - Removed two rarely-used Twig sandbox switches (
loggingandadmin_hint); both behaviours are now always on. - The content cross-site scripting check no longer objects to harmless
<option>and<select>markup, whose original issue is fixed in the form field that actually rendered it. - Sites running with the Twig 2 compatibility setting no longer crash with a server error on every page once an update clears the template cache #4235
-
[1.10.19]
- Update grav to 2.0.20
- Full Changelog
- Updated the bundled Twig fork to the current 3.x, picking up the correctness and sandbox improvements from the 3.27 and 3.28 releases.
- Grav now runs on Twig 3.28 and newer, which tightened the escaping method that Grav's compatibility shim replaces and would otherwise stop the site with a server error.
- [security] Page content can no longer register a script or stylesheet through the Twig content sandbox, and asset URLs are now escaped where the tag is built, closing a way to inject markup into a rendered page.
- [security] The
read_filecapability no longer includes the user data folder by default, so page content can no longer be used to publish form submissions and other stored data. - [security] A proxy address that carries a username and password is now hidden from sandboxed page content, matching the other credentials already redacted there.
- [security] Custom Twig sandbox denial rules now take effect regardless of how the class name is capitalised, and can no longer be silently bypassed through a parent class or interface.
- A damaged page cache file is now rebuilt from the original page instead of stopping the site with a server error #4239
- Images and links in page content now work when the file name contains a colon, such as a screenshot named after a timestamp #3933
- A page that sets a full web address as its canonical route now uses that address on its own, instead of joining it onto the site's own address and breaking sitemaps and canonical links #4023
- Turning on asset timestamps now gives each stylesheet and script its own marker taken from when that file last changed, so editing one file no longer waits on an unrelated change before visitors see it #4049
-
[1.10.20]
- Update grav to 2.0.21
- Full Changelog
- Form fields no longer print their HTML attributes as text above the field, a problem the Twig update in 2.0.20 introduced on every form #4256
- A custom text escaper registered by a plugin now works again, instead of stopping the page with an error the first time a template used it
-
[2.0.0]
- Switch to admin2 plugin
-
[2.0.1]
- Update grav to 2.0.24
- Full Changelog
- A dependency can now name the generation of Grav it is for. A plugin that supports both 1.7 and 2.0 often needs a different version of the same dependency on each, so a
dependenciesentry takes an optionalgravkey:- { name: form, version: '>=9.1.0', grav: '2.0' }. Entries without it apply everywhere, so existing blueprints are unchanged. See Plugin Compatibility - A new
system.images.progressive_jpegsetting, on by default, controls whether resized and cached JPEGs are saved as progressive - An image default such as
resizeset insystem.images.defaultsworks again. Every image manipulation was being skipped since 2.0.22, leaving only the loading and decoding hints #4282 - Resized and cached JPEGs are saved as progressive again, so a photo appears as a whole blurry image that sharpens instead of filling in one line at a time. It has been Grav's default since 2014 but silently stopped working in 1.4.6 #4284
-
[2.0.2]
- Update grav to 2.0.26
- Full Changelog
- Plain text that happens to contain a word ending in
data,feedor another URI scheme name no longer blocks a page from saving with "Potential XSS issues detected". The check matched the scheme anywhere inside a word, so a Hungarian sentence ending in "mondata:" or an English one mentioning "metadata:" was read as adata:URI. Thanks to @csbrny #619 - A new
pages.media_route_urlssetting insystem.yaml, off by default, links a page's media by its page route instead of its path on disk, so plugins can apply the page'saccessrules to media requests. Resized images keep serving from the image cache - Every web server config now carries a commented rule for denying direct access to
user/pages, which only becomes safe to enable oncepages.media_route_urlsis on - Now depends on a released
rockettheme/toolbox2.0 rather than tracking its development branch, so a build always resolves to the same code - An operator who manages users can no longer give themselves full admin rights. Permission fields that only a super admin may write were guarded by name, and writing the same field under its flattened name slipped past that guard. Thanks to @movon-ava
- Twig in page content can no longer read the site's configuration through the
arrayfilter. The|arraycast was the one conversion that never asked the sandbox whether it was allowed, so it could turn Grav's internal service registry into a plain list and read the settings the sandbox exists to keep out of page content, including plugin passwords and API keys. Thanks to @1diot9 and @AlpetGexha - A page can no longer capture the session of an administrator who views it. Page content could read the visitor's cookies, and the finished page was stored in a cache shared by everyone, so an administrator's session could be handed to the next visitor. Cookie reading is no longer available to page content, and pages that run editor-written code are no longer cached after that code runs. Thanks to @canhieu
- The bundled IIS and lighttpd configs now block sensitive files whatever the capitalisation of the request. Only the Apache and PHP rules were corrected when this was last fixed. Anyone serving Grav with the bundled
web.configorlighttpd.confshould re-copy the sample, as the updater only heals.htaccess. Thanks to @movon-ava onShutdownnow fires after a request that ended throughclose()orredirect(), not only after a rendered page. Those requests echoed their response and exited before the shutdown handler was registered, so a plugin doing slow work after the response (sending queued mail, warming a cache) never ran on a form submit that redirected. The non-FastCGI fallback also stops trying to set headers once they have been sent- A page dated with an unquoted
date: 2022-01-06header no longer lands in the year 7200. The YAML parser reads an unquoted date as a date and hands over a timestamp rather than a string, which the date parsing then misread. Thanks to @wakqasahmed #3812
-
[2.0.3]
- Update grav to 2.0.27
- Full Changelog
- Grav 2.0 sites can update to 2.1.
bin/gpm selfupgradetreated each minor release as a separate line, the way 1.7 and 1.8 were, so a 2.0 site was told it was up to date while 2.1.0 was out. Only a new major version now needs a manual move #4299 - When a new major version of Grav is out,
bin/gpm selfupgradesays so and links to the migration guide instead of only reporting that the site is up to date - Licence keys from other stores are accepted. The key format check only knew the Grav Premium format, so a KahunaCart key such as
KC-XXXX-XXXX-XXXX-XXXXwas refused by the API plugin's install endpoint and by License Manager. The check now only turns away what no store could have issued - When getgrav.org refuses a premium download for a reason the person can act on, such as an updates window that has ended,
bin/gpm installprints the store's explanation instead of only "Unauthorized Premium License Key". The API plugin bundled with this release relies on it
-
[2.1.1]
- Update grav to 2.1.3
- Full Changelog
- Asking a template for an image caption or credit that was never set no longer changes the image address. Reading a
.meta.yamlfield that is missing, such as{{ image.copyright }}, added the field name to the end of the image URL for every visitor instead of simply returning nothing. Thanks @phmg701 #4301 - The debug bar is back on pages that swap in a different page while the request runs. A form that failed validation, or an error page served by the Error plugin, rendered without the bar because Grav no longer recognised the replacement page as one it had already loaded. Thanks @hughbris #4300
- The Clockwork debug badge now appears when the JavaScript pipeline is enabled. Its script was being merged into the combined file, which dropped the attributes it needs to find itself. Thanks @wakqasahmed #3871
- AVIF images now honour the quality setting when the Imagick adapter is in use. The value was being written to a field the AVIF encoder never reads, so every AVIF came out at the encoder's own default regardless of the setting. Thanks @sridharkalaibala and @Rotzbua #4059
- Saving a page or a Flex object no longer fails with
Invalid input in "Date"on a date the author never touched. Adate:written the ordinary unquoted way comes back out of YAML as a number, and the date validator only accepted text, so editing any other field and saving was refused outright in Admin Next and through the API. Classic admin was never affected because it reformatted the date before submitting it #4304
-
[2.1.2]
- Update grav to 2.1.5
- Full Changelog
- Avatars and files uploaded to
user/dataare served again, and the rest of theuser/.htaccessfix from 2.1.4 now reaches the folders it missed. 2.1.4 restated the site root's folder blocks without the two exceptions the root makes, so profile avatars and Flex Object image uploads came back as "forbidden" on Apache. The separate files inuser/accounts,user/configanduser/dataalso still used the directive that takes a site offline on a host with a restrictedAllowOverride, so those three folders kept failing where 2.1.4 had fixed the rest. All four files now work the same way, and an upgrade replaces any of them a previous Grav wrote a file you edited yourself is left alone. Thanks @onetrev #4311 - A premium package covered by a licence you already hold now installs, instead of being refused as unlicensed. A store can sell one licence that carries several packages a shop plugin whose payment providers come with it, say and the repository entry says so with
premium.license_product. The download proxy has always honoured that, but GPM only ever looked for a key filed under the package's own name, so a customer holding one key had to paste it once per package, andbin/gpm installfailed on every package they had not pasted it against. The key filed under the product a package belongs to now counts for that package, and a key filed under the package's own name still wins wherever there is one. - Sites on hosts with a restricted
AllowOverrideare no longer taken offline by theuser/.htaccessfile added in 2.0.19. That file used an Apache directive many shared hosts do not permit in.htaccess, and where it was not permitted Apache returned an error for everything insideuser/so the admin went blank, the theme's styles and scripts stopped loading, and the front end broke too. It kept happening after a rollback, because rolling back Grav never replacesuser/. The file now does the same job with directives every host running Grav already allows. Thanks @elanorpam #4309
-
[2.1.3]
- Update grav to 2.1.6
- Full Changelog
- A package that ships its own
.htaccesscan no longer opt out of the protections arounduser/. Those rules are pushed down into every folder beneathuser/and run first, which is what stops a plugin or theme from replacing them. A folder can still ask Apache to run them last and then stop before they are reached. That takes a deliberate line in the package's own file rather than the accidental case this guards against, but the protection Grav shipped before 2.1.4 held against it, so this restores that. A second set of rules now backs up the first using a different Apache module, one that a folder underneath cannot switch off. #4236 - The compiled cache is written in one piece, so a busy site no longer logs
Corrupt compiled cachewarnings after an install or a cache clear. Every request includes the compiled copy of a YAML or markdown file without taking a lock, while the process rebuilding it truncated the file first and filled it afterwards. A request landing in between saw a syntax error, and since 2.0.20 each one wrote a warning tograv.log, which on a cold cache with the admin's parallel requests meant a burst of them for a problem that had already healed itself. The compiled file is now written next to its target and renamed over it, so a reader only ever sees a complete file. The warning stays for a file that really is broken, but no longer fires when another process is in the middle of writing it, and a corrupt file is reported once per request rather than once per read path. A compiled file that cannot be written is now a cache miss instead of a server error. user/dataanswers correctly on a restricted host too, on sites an earlier update had put beyond the reach of 2.1.5's repair. An update in June widened that folder's file in place rather than replacing it, which produced two versions that exist only on disk in no release and in no checkout so the sweep behind 2.1.5 could not find them to list. A site carrying either one kept the directive that returns a server error for the whole folder on a host with a restrictedAllowOverride, which is every image and file uploaded touser/data. Both are now recognised and replaced. #4311- A number field accepts every value that sits on its step, instead of refusing some of them. Checking a value against a step was done in binary floating point, where a decimal like
0.0000001has no exact representation, so a perfectly valid entry could be rejected with no way for the person filling the form to tell why a latitude of81.96on a field stepping by0.0000001was refused. The check is now done on the digits as typed, which has an exact answer. Thanks @TheoAcker12 #3585 - A number, range or select field no longer takes the site down when its step is
any, zero, or not a number.anyis the standard way to say a field has no step at all, and it was being read as zero and then divided by, which is a fatal error rather than a failed validation the same for a step left empty or set to something that is not a number. Multi-value select and checkbox fields had the same fault a few lines away. All of them now treat a step that is not a positive number as no step, which is what browsers do. Thanks @sridharkalaibala #4308 - The last folder under
user/that could answer with a server error on a host with a restrictedAllowOverridenow answers correctly. 2.1.5 fixed the four files Grav ships, but a site with auser/envfolder also has a file there that an earlier update wrote, and Grav has never shipped that one so it kept the directive the rest were moved off. Nothing is served from that folder, so no site was broken by it; it is a stray error page where a "forbidden" belongs. An upgrade replaces the file if it is the one Grav wrote, and leaves a file you edited alone. #4311
Hello! It looks like you're interested in this conversation, but you don't have an account yet.
Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.
With your input, this post could be even better 💗
Register Login