Installing NPM package from different namespace with CI_JOB_TOKEN fails with 404
### Summary If you pull/install an NPM package from a public project with the `CI_JOB_TOKEN`, then it will fail with `404`. Without that token, it will succeed. ### Steps to reproduce `user2` tries to download/install the `@root/somepackage`, which is a public project. ``` # this line would suffice, since the project is public @root:registry=https://<gitlab-url>/api/v4/packages/npm/ # but, by adding the following line, you'll a 404 error when you try to install //<gitlab-url>/api/v4/packages/npm/:_authToken=${CI_JOB_TOKEN} ``` And then install in a job, i.e. `npm install @root/somepackage` ### What is the expected *correct* behavior? You should be able to pull it, especially since that works when you do not specify an authToken. ### Root cause Users can consume packages from the GitLab package registry in their CI pipelines. Packages belong to projects. It is common for users to authenticate using a CI_JOB_TOKEN when working in CI jobs. Currently, if a user consumes/installs a package from a public project in a pipeline for a different project, the package is successfully installed because the request is anonymous, and the code will check `Ability.allowed?(nil, :read_package, public_project)` and `Ability.allowed?(nil, :read_project, public_project)`. Anonymous users have both `:read_package` and `:read_project` permissions for public projects, so both will return `true` and the CI job will succeed. However, if a job is authenticated using the CI_JOB_TOKEN, the code will check `Ability.allowed?(ci_job_token, :build_read_project, public_project)`, which will return `false`, and despite being a public project, the package installation will fail. So why are we checking `:build_read_project` instead of `:read_project` (which will return true for the ci_job_token)? In the `find_project!` helper, when dealing with CI job token authentication, we try to limit the permissions of the job user. This happens here: https://gitlab.com/gitlab-org/gitlab/-/blob/572bb8c0fe055eb32030a8b48764113d8fe2aa6f/ee/lib/ee/api/helpers.rb#L93. You can see that when a user is present, we check `:read_project`, but when a CI_JOB_TOKEN is present, we check `:build_read_project`. ### The Fix Update the permissions to also allow `:build_read_project` for public projects.
issue