Skip to content

fix(arborist): apply registry-tarball allow-remote exemption in linked strategy#9495

Merged
owlstronaut merged 1 commit into
npm:latestfrom
manzoorwanijk:fix/linked-strategy-eallowremote-registry-tarball
Jun 5, 2026
Merged

fix(arborist): apply registry-tarball allow-remote exemption in linked strategy#9495
owlstronaut merged 1 commit into
npm:latestfrom
manzoorwanijk:fix/linked-strategy-eallowremote-registry-tarball

Conversation

@manzoorwanijk
Copy link
Copy Markdown
Contributor

@manzoorwanijk manzoorwanijk commented Jun 5, 2026

In continuation of our exploration of using install-strategy=linked in the Gutenberg monorepo, which powers the WordPress Block Editor.

Under install-strategy=linked, a fresh install fails with EALLOWREMOTE on ordinary registry dependencies whose lockfile resolved is a full registry tarball URL, even though allow-remote=none is meant to permit registry-mediated tarballs. The standard (hoisted) reifier installs the same dependency fine; only the linked strategy rejects it.

npm error code EALLOWREMOTE
npm error Fetching packages of type "remote" have been disabled
npm error Refusing to fetch "minimatch@https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz"

Why

Both strategies extract through the same pacote.extract in reify.js, which exempts registry tarballs from the allow-remote gate via #isRegistryResolvedTarball. That check first requires node.isRegistryDependency. In the linked strategy, store nodes are IsolatedNode instances — a standalone class that emulates lib/node.js but has no isRegistryDependency getter and no edges to recompute it from. So node.isRegistryDependency was undefined, the exemption short-circuited to false, the allowRemote: 'all' override was never applied, and pacote rejected the same-origin registry tarball.

This is the second half of the allow-remote registry-tarball handling: the URL-matching half was hardened previously (origin + registry-path-prefix); this fixes the isRegistryDependency half for the linked path. The origin/path security check still runs unchanged on the linked path — a tampered lockfile pointing at a foreign host is still blocked.

How

Carry the registry-dependency flag from the source tree node onto the store node, rather than weakening the guard:

  1. IsolatedNode gains an isRegistryDependency field (default false), settable from constructor options.
  2. #externalProxy copies node.isRegistryDependency from the real tree node onto the proxy.
  3. #generateChild passes it through to the store IsolatedNode.

This preserves exact parity with the hoisted reifier: registry deps are exempt, user-pinned off-registry URLs are not. It also makes the linked strategy's isScriptAllowed matching more accurate — store nodes now carry the trustworthy edge-based flag instead of falling back to guessing registry-ness from the resolved URL.

References

Fixes #9494

@manzoorwanijk manzoorwanijk marked this pull request as ready for review June 5, 2026 14:37
@manzoorwanijk manzoorwanijk requested review from a team as code owners June 5, 2026 14:37
@owlstronaut owlstronaut merged commit 4bcba54 into npm:latest Jun 5, 2026
19 checks passed
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Jun 5, 2026

🎉 Backport to release/v11 created: #9500

@manzoorwanijk manzoorwanijk deleted the fix/linked-strategy-eallowremote-registry-tarball branch June 5, 2026 17:29
owlstronaut pushed a commit that referenced this pull request Jun 5, 2026
…d strategy (#9500)

Backport of #9495 to `release/v11`.

Co-authored-by: Manzoor Wani <manzoorwani.jk@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[BUG] install-strategy=linked rejects registry-resolved tarball URLs with EALLOWREMOTE

2 participants