Build the download address from the plugin header, not from the forge
The v1.4.0 release went out and the feed came back readable, with this in it:
"browser_download_url":
"http://57.129.89.117:25001/kw/woocommerce-email-discount-manager/..."
That field is filled from the forge's own configured root URL, which is not
necessarily the address the outside world reaches it on. A shop handed that
would be downloading plugin code over plain HTTP from a raw IP on a
non-standard port, bypassing the Cloudflare tunnel in front of gitea.nolimit.dk
and breaking the day that address changes.
parse_release() now rebuilds both the package and the release-page address from
the repository address in the plugin header, which is the one place that
already had to be right for any of this to work. tests/smoke.php pins it with
the exact response the live feed returned.
The release check had the same bug from the other end, and a worse version of
it: it verified the address the API reported rather than the one the plugin
builds, so it was a green check on a URL no shop ever uses. It now downloads
the package the plugin would download and opens the zip to confirm it is the
plugin and not an error page with a 200 on it.
And it only runs on the forge named in "Update URI". The other one is a mirror;
requiring a mirror to be anonymously readable failed the GitHub half of the
v1.4.0 release for a repository that is private on purpose.
ci/update-smoke.sh is the check none of the above can stand in for: install the
previous version into a throwaway shop and let WordPress find, download and
install the new one by itself. Every piece can be individually correct and the
update still not arrive.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
daa72f8f32
commit
8d0fa8c9d2
@@ -233,6 +233,44 @@ wc_edm_is(
|
||||
$derive->invoke( new WC_EDM_Updater(), 'https://gitea.nolimit.dk/kw/demo' )
|
||||
);
|
||||
|
||||
// The forge builds browser_download_url from its own configured root URL,
|
||||
// which is not necessarily the address the outside world reaches it on. This
|
||||
// is the real response gitea.nolimit.dk returned for v1.4.0: a plain-HTTP raw
|
||||
// IP that bypasses the Cloudflare tunnel in front of it. A shop handed that
|
||||
// would be fetching plugin code over an unencrypted connection to an address
|
||||
// that is free to change, so the download address is rebuilt from the
|
||||
// repository address in the plugin header instead.
|
||||
$parse = new ReflectionMethod( 'WC_EDM_Updater', 'parse_release' );
|
||||
$parse->setAccessible( true );
|
||||
$parsed = $parse->invoke(
|
||||
new WC_EDM_Updater(),
|
||||
array(
|
||||
'tag_name' => 'v1.4.0',
|
||||
'body' => "notes\n\nTested up to: 7.1\nWC tested up to: 11.1.0\n",
|
||||
'html_url' => 'http://57.129.89.117:25001/kw/woocommerce-email-discount-manager/releases/tag/v1.4.0',
|
||||
'assets' => array(
|
||||
array(
|
||||
'name' => 'woocommerce-email-discount-manager.zip',
|
||||
'browser_download_url' => 'http://57.129.89.117:25001/kw/woocommerce-email-discount-manager/releases/download/v1.4.0/woocommerce-email-discount-manager.zip',
|
||||
),
|
||||
),
|
||||
)
|
||||
);
|
||||
|
||||
wc_edm_is( 'the version comes from the tag, without the v', '1.4.0', $parsed['version'] );
|
||||
wc_edm_is(
|
||||
'the download address is rebuilt on the host in the plugin header',
|
||||
$update_uri . '/releases/download/v1.4.0/woocommerce-email-discount-manager.zip',
|
||||
$parsed['package']
|
||||
);
|
||||
wc_edm_ok(
|
||||
'so it is never the raw address the forge happened to report',
|
||||
false === strpos( $parsed['package'], '57.129.89.117' ) && 0 === strpos( $parsed['package'], 'https://' ),
|
||||
'got ' . $parsed['package']
|
||||
);
|
||||
wc_edm_is( 'and the tested-up-to line is read out of the release notes', '7.1', $parsed['tested'] );
|
||||
wc_edm_ok( 'a release with no zip attached is not offered at all', null === $parse->invoke( new WC_EDM_Updater(), array( 'tag_name' => 'v9.9.9', 'assets' => array() ) ) );
|
||||
|
||||
// Feed the updater a known release through its own cache instead of the
|
||||
// network: what matters here is the shape handed to WordPress, and a test
|
||||
// that needs the internet fails for reasons that have nothing to do with it.
|
||||
|
||||
Reference in New Issue
Block a user