From 94a300622813d425d5146267bdfc079a4afcf0ed Mon Sep 17 00:00:00 2001 From: Mwikala Kangwa <39342367+mwikala@users.noreply.github.com> Date: Sat, 18 Jul 2026 23:44:50 +0000 Subject: [PATCH] fix: support Linode Object Storage ACL limitations --- CHANGELOG.md | 9 + README.md | 81 +++++--- composer.json | 13 +- src/Fs.php | 178 ++++++++-------- src/LinodeS3Bundle.php | 6 +- src/LinodeS3V3Adapter.php | 196 ++++++++++++++++++ src/Plugin.php | 8 +- ...900_update_linode_volume_to_filesystem.php | 9 +- src/templates/fsSettings.html | 127 ++++++++---- 9 files changed, 457 insertions(+), 170 deletions(-) create mode 100644 src/LinodeS3V3Adapter.php diff --git a/CHANGELOG.md b/CHANGELOG.md index 76bbf8f..964f9c0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,14 @@ # Changelog +## 2.1.0 - 2026-07-18 +- Added Craft CMS 5 compatibility updates while retaining Craft CMS 4 support. +- Updated dependency constraints to stable Craft CMS 4/5 and Craft Flysystem releases. +- Updated the filesystem implementation to use strict types, typed properties, and the current AWS SDK Guzzle handler when available. +- Added a Linode-aware S3 adapter that omits unsupported object ACL operations while preserving multipart uploads and MIME type detection. +- Added the missing Content-Disposition setting field to the filesystem settings UI. +- Improved Linode-specific setup guidance and endpoint examples in the control panel and README. +- Fixed the Craft 3 volume-to-filesystem migration schema-version lookup to use the plugin handle. + ## 2.0.1 - 2022-08-10 - Fixed bug where a call was made to Fs::getSubFolder (Method was removed in 2.0.0) diff --git a/README.md b/README.md index 4df5a4f..0dbe69f 100644 --- a/README.md +++ b/README.md @@ -2,65 +2,96 @@
+++ In Linode Cloud Manager, open your Object Storage bucket and copy the bucket URL.
+
+ The URL will look something like this:
-{{ forms.autosuggestField({ - label: "Access Secret"|t('linode-s3'), - id: 'secret', - class: 'ltr', - name: 'secret', - suggestEnvVars: true, - suggestAliases: true, - value: (fs is defined ? fs.secret : null), - errors: (fs is defined ? fs.getErrors('secret') : null), - required: true, -}) }} + https://[bucket-name].[region].linodeobjects.com
+ + The API Endpoint is this URL without the bucket name, like this:
+ + https://[region].linodeobjects.com
+ + The “Region” and “Bucket” settings below are the corresponding [region] and [bucket-name] values.
+ + To set the “Base URL” above, enable the “Files in this filesystem have public URLs” lightswitch. + The value should be the whole bucket URL. Do not add the subfolder from the “Subfolder” setting below if you’ve configured one. +
+++ Access Key ID and Secret Access Key can be created from Linode Cloud Manager under Object Storage → Access Keys. +
+