Ctrl K
ComunidadGuías…

deny.toml

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
# cargo-deny configuration — supply-chain advisory policy.
#
# Run: `cargo deny check advisories`
#
# This file exists to make Aivyx's supply-chain decisions durable and
# reviewable (backend-audit finding F5). The audit flagged three
# *unmaintained* (not vulnerable, zero CVEs) transitive crates. None is
# a direct Aivyx dependency — each is pulled deep under an upstream
# crate we don't control — so there is no code change that removes them
# until their parents update. Rather than let them sit as an unrecorded
# "known issue," they are listed here with rationale: the gate stays
# green on these three while still surfacing any *new* advisory.

# Build the dependency graph with all features so the optional
# local-LLM provider stacks (mistralrs → bm25/indicatif → fxhash /
# number_prefix) are actually evaluated — otherwise those two
# advisories are never encountered under default features and the
# ignores below read as stale.
[graph]
all-features = true

# License policy — Chapter Charter CR.1 (dependency license audit).
#
# Run: `cargo deny check licenses`
#
# Aivyx itself relicenses MIT → BUSL-1.1 (docs/LICENSING.md). For that to
# be lawful, NO dependency may impose copyleft (GPL/LGPL-only/AGPL/MPL/
# SSPL/EPL/CDDL) on the combined work. This allow-list is therefore
# permissive-only and deliberately omits every copyleft license: cargo-deny
# rejects anything not listed, so a future copyleft dep fails the gate
# loudly instead of silently poisoning the relicense.
#
# The list is the exact set of permissive SPDX ids present across the
# all-features build graph (verified green at CR.1). Notes:
#   - "BSL-1.0" = the Boost Software License (permissive) — NOT the
#     Business Source License (BUSL-1.1) Aivyx itself adopts; unrelated.
#   - LGPL-2.1-or-later is intentionally ABSENT. It appears only as one
#     option of r-efi's "MIT OR Apache-2.0 OR LGPL-2.1-or-later"; because
#     MIT/Apache are allowed, the OR resolves to a permissive choice and
#     the copyleft option is never taken. Proof the gate works as intended.
[licenses]
version = 2
# Skip Aivyx's OWN workspace crates: they relicense to BUSL-1.1 (this gate's
# whole purpose), so they must not be measured against the dependency
# allow-list below. This is scoped to first-party crates marked publish = false
# (see [workspace.package]); a THIRD-PARTY crate under BUSL/any copyleft still
# fails loudly, which is the point.
private = { ignore = true }
allow = [
    "MIT",
    "MIT-0",
    "Apache-2.0",
    "Apache-2.0 WITH LLVM-exception",
    "ISC",
    "BSD-2-Clause",
    "BSD-3-Clause",
    "Zlib",
    "BSL-1.0",
    "0BSD",
    "Unlicense",
    "WTFPL",
    "CC0-1.0",
    "Unicode-3.0",
    "Unicode-DFS-2016",
    "CDLA-Permissive-2.0",
    "NCSA",
    # MPL-2.0 is *file-level* (weak) copyleft: it never relicenses the larger
    # combined work — the only obligation is to share modifications to the
    # MPL-licensed files themselves, which we never touch (they are upstream
    # crates: the symphonia audio stack, the servo CSS stack pulled by Dioxus
    # — cssparser/selectors/dtoa-short — and option-ext via dirs). Fully
    # compatible with shipping Aivyx under BUSL-1.1.
    "MPL-2.0",
]

# No per-crate license exceptions. The lone exception — GPL-3.0-only
# `piper1-rs-sys` (Piper TTS → espeak-ng) — was eliminated in Chapter Timbre
# (docs/TIMBRE.md TB.3/TB.4): Piper was replaced by the permissive Kokoro stack
# (Kokoro-82M Apache-2.0 + `voice-g2p` MIT + `ort` Apache/MIT, espeak-free), so
# there is **zero GPL anywhere in the dependency graph**, including the optional
# `tts-kokoro` voice feature. `cargo deny check licenses` (all-features) is green
# with no exceptions — any future copyleft dep now fails the gate loudly.

[advisories]
version = 2
# Treat unmaintained advisories as findings (so new ones surface),
# except the three documented below.
unmaintained = "all"
yanked = "deny"
ignore = [
    # fxhash — RUSTSEC-2025-0057 (unmaintained). Pulled via
    #   fxhash → bm25 → mistralrs-core → mistralrs → aivyx-llm
    # i.e. only when an in-process mistralrs local-LLM provider feature
    # is enabled. Not a direct dep; removable only when bm25/mistralrs
    # drop it. Not vulnerable.
    { id = "RUSTSEC-2025-0057", reason = "unmaintained, not vulnerable; transitive under mistralrs (bm25); awaiting upstream" },

    # number_prefix — RUSTSEC-2025-0119 (unmaintained). Pulled via
    #   number_prefix → indicatif 0.17 → hf-hub → mistralrs-core
    # Same mistralrs local-LLM stack. Not a direct dep. Not vulnerable.
    { id = "RUSTSEC-2025-0119", reason = "unmaintained, not vulnerable; transitive under mistralrs (indicatif→hf-hub); awaiting upstream" },

    # paste — RUSTSEC-2024-0436 (unmaintained proc-macro). Pulled via
    #   paste → frankenstein (+ macro_rules_attribute) → aivyx-telegram
    #   paste → gemm → candle-core → candle-nn → mistralrs → aivyx-llm
    #     (all-features graph: the local-model stack)
    # frankenstein is our Telegram Bot API wrapper; a 0.50 bump may drop
    # it, deferred to the Channel Activation Milestone (Telegram can't be
    # live-verified outside it). Not vulnerable.
    { id = "RUSTSEC-2024-0436", reason = "unmaintained, not vulnerable; transitive under frankenstein (aivyx-telegram) and under gemm/candle-core (mistralrs → aivyx-llm); revisit when both frankenstein and candle drop paste" },

    # ── aivyx-desktop GTK3 webview stack ──────────────────────────────
    # The native desktop app (crates/aivyx-desktop) is a thin wry + tao
    # webview over the served Studio. On Linux that pulls webkit2gtk → the
    # gtk-rs GTK3 bindings, which upstream froze ("no longer maintained")
    # at glib 0.18: there is no glib >= 0.20 path while the webview is
    # GTK3-based, and the latest tao 0.35 / wry 0.55 still are (gtk 0.18.2
    # pins glib ^0.18). All transitive and desktop-build-only — the
    # daemon / core / CLI never link them — and none is a vulnerability.
    # Revisit when the webview ecosystem moves to GTK4. The glib entry is
    # the GitHub Dependabot alert #6 (GHSA-wrw7-89jp-8q8g); same disposition.
    # (The gtk-rs "no longer maintained" advisories RUSTSEC-2024-0411..0420
    # were withdrawn upstream on 2026-08-14 after the repository was
    # unarchived, so their ignore entries were removed 2026-10-28.)
    { id = "RUSTSEC-2024-0370", reason = "proc-macro-error unmaintained; transitive via glib-macros/gtk3-macros (aivyx-desktop GTK3); not vulnerable" },

    # ttf-parser — RUSTSEC-2026-0192 (unmaintained). Pulled via
    #   ttf-parser → pdf-extract → aivyx-dataread (data.pdf reader).
    # Arrived with the pdf-extract 0.9→0.12 upgrade that fixed the lopdf
    # stack-overflow DoS (RUSTSEC-2026-0187). Font parsing for PDF text
    # extraction; transitive, not a direct dep, and unmaintained (not
    # vulnerable). Removable only when pdf-extract drops/replaces it.
    { id = "RUSTSEC-2026-0192", reason = "ttf-parser unmaintained, not vulnerable; transitive under pdf-extract (data.pdf); arrived with the lopdf-DoS fix; awaiting upstream" },

    # libsqlite3-sys — RUSTSEC-2026-0459 (CVE-2026-119375, accepted
    # 2026-11-11). The bundled SQLite before 3.54.0 can return stale
    # page-cache memory when a database is opened with a crafted `-wal` file
    # of a different page size. The fix (libsqlite3-sys 0.39 / rusqlite
    # 0.41) is unreachable here: matrix-sdk-sqlite 0.19.1 (aivyx-matrix's
    # crypto store, the latest release) requires rusqlite ^0.40.2, and only
    # one libsqlite3-sys may be linked (`links = "sqlite3"`). For the same
    # reason aivyx-kvcache is pinned to its `pa-sqlite-0.40` branch
    # (dd6adc8: 4ec85e4, rusqlite 0.40, plus the no-proxy fix); master
    # moved to 0.41. Exposure: pa opens only its own SQLite files (the
    # kvcache manifest, the Matrix crypto store) inside its private data
    # directory; planting a crafted -wal there already needs write access
    # to pa's state. Remove this entry, and pin aivyx-kvcache back to
    # master, when matrix-sdk-sqlite accepts rusqlite 0.41.
    { id = "RUSTSEC-2026-0459", reason = "bundled SQLite -wal memory exposure; fix blocked by matrix-sdk-sqlite 0.19.1 (rusqlite ^0.40.2); pa opens only its own DB files in its data dir; revisit on the next matrix-sdk release" },
    # NOTE: glib RUSTSEC-2024-0429 (GHSA-wrw7-89jp-8q8g, GitHub Dependabot
    # alert #6) — a `glib::VariantStrIter` Iterator/DoubleEndedIterator
    # *unsoundness*, same aivyx-desktop GTK3 root cause (glib 0.18, patched
    # only in 0.20 which is unreachable via GTK3; not exercised by the thin
    # webview shell). Not listed as an `ignore` entry: cargo-deny 0.20 does
    # check `unsound` advisories, but its default scope is the workspace's
    # own direct dependencies, and glib is only transitive (via
    # wry/tao/tray-icon), so it is not flagged (an entry would be a
    # perpetual "unused ignore"; verified 2026-10-28). Recorded here as the
    # accepted disposition; mirror it by dismissing Dependabot #6 as
    # "tolerable risk". If a future cargo-deny flags it, add an entry with
    # this disposition.

    # ── 2026-10-28 additions (Chapter H) ─────────────────────────────
    # zip — RUSTSEC-2026-0367/0368/0369 (ZipArchive::extract / ZipStreamReader
    # ::extract). The workspace's own zip uses (aivyx-voice Kokoro npz,
    # aivyx-dataread via calamine/rust_xlsxwriter) were moved to zip 9 on this
    # date, which is fixed. One copy remains: zip 7.2.0 under candle-core
    # (mistralrs-core local-LLM stack), which only calls ZipArchive::new /
    # by_name to read .npz/.pth weights in memory and never calls extract.
    { id = "RUSTSEC-2026-0367", reason = "zip 7.2.0 via candle-core (mistralrs, aivyx-llm local provider); the advisory is about ZipArchive::extract, which candle never calls (it reads npz/pth archives in memory); fixed only in zip 9, revisit when candle-core/mistralrs move" },
    { id = "RUSTSEC-2026-0368", reason = "zip 7.2.0 via candle-core (mistralrs, aivyx-llm local provider); the advisory is about ZipArchive::extract, which candle never calls (it reads npz/pth archives in memory); fixed only in zip 9, revisit when candle-core/mistralrs move" },
    { id = "RUSTSEC-2026-0369", reason = "zip 7.2.0 via candle-core (mistralrs, aivyx-llm local provider); the advisory is about ZipArchive::extract, which candle never calls (it reads npz/pth archives in memory); fixed only in zip 9, revisit when candle-core/mistralrs move" },
    { id = "RUSTSEC-2026-0429", reason = "zip 7.2.0 via candle-core (mistralrs, aivyx-llm local provider); the advisory is about ZipArchive::extract sizing a symlink-target buffer, and candle never calls extract (it reads npz/pth archives in memory); fixed only in zip 9, revisit when candle-core/mistralrs move" },

    # anymap2 — RUSTSEC-2026-0319 (unmaintained). Pulled via
    #   anymap2 → matrix-sdk 0.19.1 → aivyx-matrix. Not a direct dep;
    # matrix-sdk 0.19.1 is the latest release. Not vulnerable.
    { id = "RUSTSEC-2026-0319", reason = "anymap2 unmaintained, not vulnerable; transitive under matrix-sdk 0.19.1 (aivyx-matrix), the latest release; revisit when matrix-sdk drops it" },

    # pin-utils — RUSTSEC-2026-0441 (unmaintained). Pulled via
    #   pin-utils → async-imap 0.11.3 → aivyx-proton (Proton Bridge preview).
    # No fixed version; async-imap 0.12 is an API change. Not vulnerable.
    { id = "RUSTSEC-2026-0441", reason = "pin-utils unmaintained, not vulnerable; transitive under async-imap 0.11.3 (aivyx-proton); revisit with async-imap 0.12" },

    # zbus 4.4.0 stack — RUSTSEC-2026-0370 (zvariant), 0371 (zbus_names),
    # 0372 (zvariant_derive), all unmaintained. Pulled via
    #   zbus 4.4.0 → keyring 3.6.3 / secret-service 4.0.0 → aivyx-channel
    # (Linux secret-service keyring). keyring 4's default Linux store still
    # uses zbus 5, so moving to keyring 4 is not the exit; the exits are a
    # zbus 6 based secret-service, or keyring's dbus/libdbus store. Not
    # vulnerable.
    { id = "RUSTSEC-2026-0370", reason = "zvariant unmaintained, not vulnerable; transitive under zbus 4.4.0 via keyring 3 (aivyx-channel); revisit when secret-service moves to zbus 6 or keyring uses its dbus (libdbus) store" },
    { id = "RUSTSEC-2026-0371", reason = "zbus_names unmaintained, not vulnerable; transitive under zbus 4.4.0 via keyring 3 (aivyx-channel); revisit when secret-service moves to zbus 6 or keyring uses its dbus (libdbus) store" },
    { id = "RUSTSEC-2026-0372", reason = "zvariant_derive unmaintained, not vulnerable; transitive under zbus 4.4.0 via keyring 3 (aivyx-channel); revisit when secret-service moves to zbus 6 or keyring uses its dbus (libdbus) store" },
]