@@ -856,7 +856,7 @@ it(`should support disabling the network accesses from the environment`, async (
856856
857857 await xfs . mktempPromise ( async cwd => {
858858 await xfs . writeJsonPromise ( ppath . join ( cwd , `package.json` as Filename ) , {
859- packageManager : `yarn@2.2.2` ,
859+ packageManager : `yarn@2.2.2+sha1.9aede2626b101719cbc1314d61def0742852ba11 ` ,
860860 } ) ;
861861
862862 await expect ( runCli ( cwd , [ `yarn` , `--version` ] ) ) . resolves . toMatchObject ( {
@@ -881,12 +881,12 @@ describe(`read-only and offline environment`, () => {
881881
882882 // Prepare fake project
883883 await xfs . writeJsonPromise ( ppath . join ( cwd , `package.json` as Filename ) , {
884- packageManager : `yarn@2.2.2` ,
884+ packageManager : `yarn@2.2.2+sha1.9aede2626b101719cbc1314d61def0742852ba11 ` ,
885885 } ) ;
886886
887887 // $ corepack install
888888 await expect ( runCli ( cwd , [ `install` ] ) ) . resolves . toMatchObject ( {
889- stdout : `Adding yarn@2.2.2 to the cache...\n` ,
889+ stdout : `Adding yarn@2.2.2+sha1.9aede2626b101719cbc1314d61def0742852ba11 to the cache...\n` ,
890890 stderr : `` ,
891891 exitCode : 0 ,
892892 } ) ;
@@ -1549,6 +1549,196 @@ describe(`should pick up COREPACK_INTEGRITY_KEYS from env`, () => {
15491549 } ) ;
15501550} ) ;
15511551
1552+ describe ( `unverified downloads` , ( ) => {
1553+ beforeEach ( ( ) => {
1554+ process . env . AUTH_TYPE = `COREPACK_NPM_TOKEN` ; // See `_registryServer.mjs`
1555+ process . env . COREPACK_DEFAULT_TO_LATEST = `1` ;
1556+ process . env . COREPACK_INTEGRITY_KEYS = `0` ;
1557+ } ) ;
1558+
1559+ it ( `from env variable` , async ( ) => {
1560+ await xfs . mktempPromise ( async cwd => {
1561+ await xfs . writeJsonPromise ( ppath . join ( cwd , `package.json` as Filename ) , { } ) ;
1562+
1563+ process . env . COREPACK_ON_UNVERIFIED_DOWNLOAD = `error` ;
1564+ await expect ( runCli ( cwd , [ `pnpm@1.x` , `--version` ] , true ) ) . resolves . toMatchObject ( {
1565+ exitCode : 1 ,
1566+ stdout : `` ,
1567+ stderr : expect . stringContaining ( `Downloading unverified versions is disabled by the COREPACK_ON_UNVERIFIED_DOWNLOAD env variable` ) ,
1568+ } ) ;
1569+ await expect ( runCli ( cwd , [ `yarn@1.x` , `--version` ] , true ) ) . resolves . toMatchObject ( {
1570+ exitCode : 1 ,
1571+ stdout : `` ,
1572+ stderr : expect . stringContaining ( `Downloading unverified versions is disabled by the COREPACK_ON_UNVERIFIED_DOWNLOAD env variable` ) ,
1573+ } ) ;
1574+
1575+ process . env . COREPACK_ON_UNVERIFIED_DOWNLOAD = `ignore` ;
1576+ await expect ( runCli ( cwd , [ `yarn@1.x` , `--version` ] , true ) ) . resolves . toMatchObject ( {
1577+ exitCode : 0 ,
1578+ stdout : `yarn: Hello from custom registry\n` ,
1579+ stderr : `` , // No warning expected
1580+ } ) ;
1581+
1582+ process . env . COREPACK_ON_UNVERIFIED_DOWNLOAD = `warn` ;
1583+ await expect ( runCli ( cwd , [ `pnpm@1.x` , `--version` ] , true ) ) . resolves . toMatchObject ( {
1584+ exitCode : 0 ,
1585+ stdout : `pnpm: Hello from custom registry\n` ,
1586+ stderr : expect . stringContaining ( `Integrity of pnpm@1.9998.9999 could not be verified.` ) ,
1587+ } ) ;
1588+ await expect ( runCli ( cwd , [ `yarn@1.x` , `--version` ] , true ) ) . resolves . toMatchObject ( {
1589+ exitCode : 0 ,
1590+ stdout : `yarn: Hello from custom registry\n` ,
1591+ stderr : `` , // Already cached, no warning expected
1592+ } ) ;
1593+ } ) ;
1594+ } ) ;
1595+
1596+ it ( `from .corepack.env file` , async ( ) => {
1597+ await xfs . mktempPromise ( async cwd => {
1598+ await xfs . writeJsonPromise ( ppath . join ( cwd , `package.json` as Filename ) , { } ) ;
1599+
1600+ await xfs . writeFilePromise ( ppath . join ( cwd , `.corepack.env` as Filename ) , `COREPACK_ON_UNVERIFIED_DOWNLOAD=error\n` ) ;
1601+ await expect ( runCli ( cwd , [ `pnpm@1.x` , `--version` ] , true ) ) . resolves . toMatchObject ( {
1602+ exitCode : 1 ,
1603+ stdout : `` ,
1604+ stderr : expect . stringContaining ( `Downloading unverified versions is disabled by the COREPACK_ON_UNVERIFIED_DOWNLOAD env variable` ) ,
1605+ } ) ;
1606+ await expect ( runCli ( cwd , [ `yarn@1.x` , `--version` ] , true ) ) . resolves . toMatchObject ( {
1607+ exitCode : 1 ,
1608+ stdout : `` ,
1609+ stderr : expect . stringContaining ( `Downloading unverified versions is disabled by the COREPACK_ON_UNVERIFIED_DOWNLOAD env variable` ) ,
1610+ } ) ;
1611+
1612+ await xfs . writeFilePromise ( ppath . join ( cwd , `.corepack.env` as Filename ) , `COREPACK_ON_UNVERIFIED_DOWNLOAD=ignore\n` ) ;
1613+ await expect ( runCli ( cwd , [ `yarn@1.x` , `--version` ] , true ) ) . resolves . toMatchObject ( {
1614+ exitCode : 0 ,
1615+ stdout : `yarn: Hello from custom registry\n` ,
1616+ stderr : `` , // No warning expected
1617+ } ) ;
1618+
1619+ await xfs . writeFilePromise ( ppath . join ( cwd , `.corepack.env` as Filename ) , `COREPACK_ON_UNVERIFIED_DOWNLOAD=warn\n` ) ;
1620+ await expect ( runCli ( cwd , [ `pnpm@1.x` , `--version` ] , true ) ) . resolves . toMatchObject ( {
1621+ exitCode : 0 ,
1622+ stdout : `pnpm: Hello from custom registry\n` ,
1623+ stderr : expect . stringContaining ( `Integrity of pnpm@1.9998.9999 could not be verified.` ) ,
1624+ } ) ;
1625+ await expect ( runCli ( cwd , [ `yarn@1.x` , `--version` ] , true ) ) . resolves . toMatchObject ( {
1626+ exitCode : 0 ,
1627+ stdout : `yarn: Hello from custom registry\n` ,
1628+ stderr : `` , // Already cached, no warning expected
1629+ } ) ;
1630+ } ) ;
1631+ } ) ;
1632+
1633+ it ( `from env file defined by COREPACK_ENV_FILE` , async ( ) => {
1634+ await xfs . mktempPromise ( async cwd => {
1635+ await xfs . writeJsonPromise ( ppath . join ( cwd , `package.json` as Filename ) , {
1636+ } ) ;
1637+
1638+ await xfs . writeFilePromise ( ppath . join ( cwd , `.corepack.env` as Filename ) , `COREPACK_ON_UNVERIFIED_DOWNLOAD=error\n` ) ;
1639+ await xfs . writeFilePromise ( ppath . join ( cwd , `.other.env` as Filename ) , `COREPACK_ON_UNVERIFIED_DOWNLOAD=warn\n` ) ;
1640+
1641+ // By default, Corepack should be using .corepack.env and fail.
1642+ await expect ( runCli ( cwd , [ `pnpm@1.x` , `--version` ] , true ) ) . resolves . toMatchObject ( {
1643+ exitCode : 1 ,
1644+ stdout : `` ,
1645+ stderr : expect . stringContaining ( `Downloading unverified versions is disabled by the COREPACK_ON_UNVERIFIED_DOWNLOAD env variable` ) ,
1646+ } ) ;
1647+
1648+ process . env . COREPACK_ENV_FILE = `.other.env` ;
1649+ await expect ( runCli ( cwd , [ `pnpm@1.x` , `--version` ] , true ) ) . resolves . toMatchObject ( {
1650+ exitCode : 0 ,
1651+ stdout : `pnpm: Hello from custom registry\n` ,
1652+ stderr : expect . stringContaining ( `Integrity of pnpm@1.9998.9999 could not be verified.` ) ,
1653+ } ) ;
1654+ } ) ;
1655+ } ) ;
1656+
1657+ it ( `from env even if there's a .corepack.env file` , async ( ) => {
1658+ await xfs . mktempPromise ( async cwd => {
1659+ await xfs . writeJsonPromise ( ppath . join ( cwd , `package.json` as Filename ) , { } ) ;
1660+
1661+ await xfs . writeFilePromise ( ppath . join ( cwd , `.corepack.env` as Filename ) , `COREPACK_ON_UNVERIFIED_DOWNLOAD=error\n` ) ;
1662+
1663+ // By default, Corepack should be using .corepack.env (or the built-in ones on Node.js 18.x) and fail.
1664+ await expect ( runCli ( cwd , [ `pnpm@1.x` , `--version` ] , true ) ) . resolves . toMatchObject ( {
1665+ exitCode : 1 ,
1666+ stdout : `` ,
1667+ stderr : expect . stringContaining ( `Downloading unverified versions is disabled by the COREPACK_ON_UNVERIFIED_DOWNLOAD env variable` ) ,
1668+ } ) ;
1669+
1670+ process . env . COREPACK_ON_UNVERIFIED_DOWNLOAD = `warn` ;
1671+ await expect ( runCli ( cwd , [ `pnpm@1.x` , `--version` ] , true ) ) . resolves . toMatchObject ( {
1672+ exitCode : 0 ,
1673+ stdout : `pnpm: Hello from custom registry\n` ,
1674+ stderr : expect . stringContaining ( `Integrity of pnpm@1.9998.9999 could not be verified` ) ,
1675+ } ) ;
1676+ } ) ;
1677+ } ) ;
1678+ } ) ;
1679+
1680+ describe ( `downloads not pinned by a hash` , ( ) => {
1681+ it ( `should not warn in non-strict mode when the signature can be verified` , async ( ) => {
1682+ await xfs . mktempPromise ( async cwd => {
1683+ await xfs . writeJsonPromise ( ppath . join ( cwd , `package.json` as Filename ) , {
1684+ packageManager : `yarn@1.22.4` ,
1685+ } ) ;
1686+
1687+ process . env . COREPACK_ON_UNVERIFIED_DOWNLOAD = `warn` ;
1688+ await expect ( runCli ( cwd , [ `yarn` , `--version` ] ) ) . resolves . toMatchObject ( {
1689+ exitCode : 0 ,
1690+ stdout : `1.22.4\n` ,
1691+ stderr : `` ,
1692+ } ) ;
1693+ } ) ;
1694+ } ) ;
1695+
1696+ it ( `should warn when COREPACK_ON_UNVERIFIED_DOWNLOAD is set to strict-warn` , async ( ) => {
1697+ await xfs . mktempPromise ( async cwd => {
1698+ await xfs . writeJsonPromise ( ppath . join ( cwd , `package.json` as Filename ) , {
1699+ packageManager : `yarn@1.22.4` ,
1700+ } ) ;
1701+
1702+ process . env . COREPACK_ON_UNVERIFIED_DOWNLOAD = `strict-warn` ;
1703+ await expect ( runCli ( cwd , [ `yarn` , `--version` ] ) ) . resolves . toMatchObject ( {
1704+ exitCode : 0 ,
1705+ stdout : `1.22.4\n` ,
1706+ stderr : `Integrity of yarn@1.22.4 is not pinned by a hash. Consider providing a hash. Set COREPACK_ON_UNVERIFIED_DOWNLOAD to 'ignore' to remove this warning.\n` ,
1707+ } ) ;
1708+ } ) ;
1709+ } ) ;
1710+
1711+ it ( `should fail when COREPACK_ON_UNVERIFIED_DOWNLOAD is set to STRICT-ERROR` , async ( ) => {
1712+ await xfs . mktempPromise ( async cwd => {
1713+ await xfs . writeJsonPromise ( ppath . join ( cwd , `package.json` as Filename ) , {
1714+ packageManager : `yarn@1.22.4` ,
1715+ } ) ;
1716+
1717+ process . env . COREPACK_ON_UNVERIFIED_DOWNLOAD = `STRICT-ERROR` ;
1718+ await expect ( runCli ( cwd , [ `yarn` , `--version` ] ) ) . resolves . toMatchObject ( {
1719+ exitCode : 1 ,
1720+ stdout : `` ,
1721+ stderr : expect . stringContaining ( `Integrity of yarn@1.22.4 is not pinned by a hash. Downloading unverified versions is disabled by the COREPACK_ON_UNVERIFIED_DOWNLOAD env variable.` ) ,
1722+ } ) ;
1723+ } ) ;
1724+ } ) ;
1725+
1726+ it ( `should not interfere with versions pinned by a hash in strict mode` , async ( ) => {
1727+ await xfs . mktempPromise ( async cwd => {
1728+ await xfs . writeJsonPromise ( ppath . join ( cwd , `package.json` as Filename ) , {
1729+ packageManager : `yarn@1.22.4+sha224.0d6eecaf4d82ec12566fdd97143794d0f0c317e0d652bd4d1b305430` ,
1730+ } ) ;
1731+
1732+ process . env . COREPACK_ON_UNVERIFIED_DOWNLOAD = `strict-error` ;
1733+ await expect ( runCli ( cwd , [ `yarn` , `--version` ] ) ) . resolves . toMatchObject ( {
1734+ exitCode : 0 ,
1735+ stdout : `1.22.4\n` ,
1736+ stderr : `` ,
1737+ } ) ;
1738+ } ) ;
1739+ } ) ;
1740+ } ) ;
1741+
15521742for ( const authType of [ `COREPACK_NPM_REGISTRY` , `COREPACK_NPM_TOKEN` , `COREPACK_NPM_PASSWORD` , `PROXY` ] ) {
15531743 describe ( `custom registry with auth ${ authType } ` , ( ) => {
15541744 beforeEach ( ( ) => {
@@ -1741,8 +1931,8 @@ describe(`handle integrity checks`, () => {
17411931 } ) ;
17421932 await expect ( runCli ( cwd , [ `use` , `pnpm` ] , true ) ) . resolves . toMatchObject ( {
17431933 exitCode : 1 ,
1744- stdout : expect . stringContaining ( `Signature does not match` ) ,
1745- stderr : `` ,
1934+ stderr : expect . stringContaining ( `Signature does not match` ) ,
1935+ stdout : `Installing pnpm@1.9998.9999 in the project...\n ` ,
17461936 } ) ;
17471937 } ) ;
17481938 } ) ;
@@ -1757,8 +1947,8 @@ describe(`handle integrity checks`, () => {
17571947 } ) ;
17581948 await expect ( runCli ( cwd , [ `use` , `yarn@1.9998.9999` ] , true ) ) . resolves . toMatchObject ( {
17591949 exitCode : 1 ,
1760- stdout : expect . stringContaining ( `Signature does not match` ) ,
1761- stderr : `` ,
1950+ stderr : expect . stringContaining ( `Signature does not match` ) ,
1951+ stdout : `Installing yarn@1.9998.9999 in the project...\n ` ,
17621952 } ) ;
17631953 } ) ;
17641954 } ) ;
0 commit comments