Conversation
c224839 to
e1ae327
Compare
|
Are you setting |
|
Yes — independently. That is the case this gates. In core So the failing path is a deployment that sets the service flag itself — project config committed to the repo and applied at deploy, with writes locked at runtime. If you would rather it keyed on |
|
@mvanhorn what is your use case for setting |
|
Sorry, you're right that I keyed this on the wrong property. To answer directly: I'm not setting Which means my guard is built on a property you're telling me isn't meant to stand alone, and I shouldn't have used it as the signal. The part I think holds independently of |
|
The fix doesn’t make any sense to me, because we only pass |
|
You're right about the mechanism, and I had the wrong model of it. But I don't think the throw needs a new key.
It can, without any key being issued, when the stored value is an env var reference:
That path is worth a look on its own merits, separately from this PR: with writes allowed it doesn't throw, it just silently rewrites the env var reference in project config to the literal key. The decisive question is one only you can answer: does the API echo back plugin license keys it did not issue? If it returns no For what it's worth #17750 is still open, from a plain Updates view on 5.8.15 in production, so something is reaching |
Description
Gate only the automatic plugin-license persistence block in
Api::processResponseHeaders()on the project config service’sreadOnlystate. Continue processing non-mutating response metadata, including license-domain and license-info cache updates, so read-only environments can still consume update responses. LeavePlugins::setPluginLicenseKey()and its explicit controller/install callers unchanged, preserving their current validation and read-only enforcement when a user directly requests a license change.Craftnet API responses can include
X-Craft-Plugin-Licenses, whichApi::processResponseHeaders()currently persists throughPlugins::setPluginLicenseKey(). When project config is read-only, a returned key that differs from the deployed config reachesProjectConfig::set()and throwsNotSupportedException, preventing the Updates utility from displaying otherwise valid update information. The thread’s stack trace identifies this automatic response-header path, and a missing plugin license key supplies a concrete reproduction. A later report about project-config writes during database migrations is a separate deployment flow and is outside this fix.Fixes #17750
Related issues
Not applicable to this change.