blob: 73e702dd3248ebd5ccc231b39b6dc6a0145cf4e0 [file] [log] [blame] [view]
# First-Party Code
When run, `cargo vet` invokes the `cargo metadata` subcommand to learn about the
crate graph. When traversing the graph, `cargo vet` enforces audits for all
crates.io dependencies.
Generally speaking, all other nodes in the graph are considered trusted and
therefore non-auditable. This includes root crates, path dependencies, git
dependencies, and custom (non-crates.io) registry dependencies.
However, there are some situations which blur the line between first- and
third-party code. This can occur, for example, when the `[patch]` table is used
to replace the contents of a crates.io package with a locally-modified version.
Sometimes the replacement is rewritten from scratch, but often it's derived from
the original, sometimes just with a single modification. Insofar as the package
you're using is still primarily third-party code, you'll want to audit it like
anything else — but cargo-vet has no foolproof way to mechanically deduce whether
the replacement is a derived work.
To ensure the right thing happens, cargo-vet detects these ambiguous situations
and requires the user to specify the intended behavior. Specifically, if there
exists a public crate with the same name and version as a given first-party
crate, cargo-vet will require a policy entry for that crate specifying
`audit-as-crates-io` as either true or false[^1]. If it's set to true, cargo-vet
will perform audit enforcement.
When enabled for a git dependency, this enforcement is precise. It requires an
audit for the base published version that exists on crates.io, and then one or
more delta audits from that base version to the specific git commit used by the
build graph. Git commits are identified with an extended `x.y.z@git:SHA` syntax.
They may only appear in delta audits and should be performed relative to the
nearest published version, which ensures that audit information is recorded in
terms of published versions wherever possible for the sake of reusability by
others.
When enabled for a path dependency, this enforcement is not precise, because
cargo-vet lacks a hash by which to uniquely identify the actual package
contents. In this case, only an audit for the base published version is required.
It's important to note that any audits for such crates always correspond to the
original crates.io version. This is what `inspect` and `certify` will display,
and this is what you should review before certifying, since others in the
ecosystem may rely on your audits when using the original crate without your
particular modifications.
If audit-as-crates-io is enabled for a path dependency with a version which has
not been published on crates.io, cargo-vet will instead require an audit of the
latest published version before the local version, ensuring all audits
correspond to a crate on crates.io[^2]. If the local version is later published,
`cargo vet` will warn you, allowing you to update your audits.
## Footnotes
[^1]: To enable an easy setup experience, `cargo vet init` will attempt to guess the
value of `audit-as-crates-io` for pre-existing packages during initialization, and
generate exemptions for the packages for which the generated value is `true`. At
present it will guess `true` if either the `description` or `repository` fields in
`Cargo.toml` are non-empty and match the current values on crates.io. This behavior
can also be triggered for newly-added dependencies with `cargo vet regenerate
audit-as-crates-io`, but you should verify the results.
[^2]: Which version is used for an unpublished crate will be recorded in
imports.lock to ensure that `cargo vet` will continue to pass as new versions
are published. Stale `unpublished` entries will be cleaned up by `prune` when
they are no longer required for `cargo vet` to pass, and can also be regenerated
using `cargo vet regenerate unpublished`, though this may cause `cargo vet` to
start failing.