fix(deps): resolve the quick-xml advisories, unyank deep-link and spin #321
No reviewers
Labels
No labels
autopilot:pending-human
source:analyste
source:defenseur
source:human
source:medic
status:approved
status:blocked
status:in-progress
status:needs-clarification
status:needs-fix
status:ready
status:review
status:triage
type:bug
type:feature
type:infra
type:refactor
type:schema
type:security
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: maximus/Simpl-Resultat#321
Loading…
Reference in a new issue
No description provided.
Delete branch "issue-312-313-drop-quickxml-suppressions"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Resolves #312
Resolves #313
#312 — le declencheur avait deja saute
J'ai ecrit #312 hier en supposant qu'il fallait attendre un bump amont, sans verifier s'il existait un
plistplus recent. Il en existait un :0.41.0est exactement la version corrigee, et elle tient dans la borne actuelle detauri— aucun changement de manifeste. RUSTSEC-2026-0194 et -0195 sont donc resolues, pas acceptees, et quittent.cargo/audit.tomlle jour meme ou elles y sont entrees.C'est le cycle de vie prevu par l'ADR 0018 : une entree part quand un correctif devient atteignable. Elle valide au passage la raison d'etre de #312 — le pendant du garde-fou, qui attrape la suppression devenue injustifiee mais pas celle devenue inutile. Ici c'est bien la seconde qui s'est produite, et sans l'issue personne ne l'aurait vue.
rsadevient la seule entree, doncCRATES="rsa"dans le garde-fou. Son commentaire de justification etait redige entierement autour dequick-xml/plist— il est re-pointe, sinon il decrirait un crate qui n'est plus dans la liste.#313 — pourquoi 2.4.8 avait ete yankee
Le CHANGELOG amont le donne indirectement : la 2.4.9 ne contient qu'un seul commit, « Fix broken iOS custom URL schemes » (#3396).
Le defaut derriere le yank est donc iOS uniquement. Trois consequences :
deep_link().on_open_url->simpl-resultat://auth/callback), qu'aucun des 106 tests Rust n'exerce : la preuve vient du contenu du diff amont, pas d'un aller-retour manuel que je ne peux pas lancer d'ici.Security(un crate yanked n'est pas une advisory), niFixed(rien ne change pour l'utilisateur). C'est de l'hygiene de lock.spin0.9.8 -> 0.9.9 suit : toutes les 0.9.0 a 0.9.8 sont yankees, ce qui ressemble a un yank en masse plutot qu'a un signal de defaut.Les crates yanked remontent en
warninget ne comptent pas dans le code de sortie decargo audit— ce bump ne change donc pas l'etat du gate, il fait passer les warnings de 23 a 21.Le bullet CHANGELOG de #310 est corrige, pas contredit
Les deux PR atterrissent dans le meme bloc
[Unreleased]et partiront dans les memes notes de v0.15.0. Ajouter un bullet disant l'inverse du precedent aurait livre la contradiction aux utilisateurs. Le bloc n'etant pas publie, l'amender n'est pas une reecriture d'historique.Deux affirmations y etaient fausses :
rsa).tar... de vrais chemins de code du produit livre » -> faux.tarest bien compile, mais son chemin vulnerable (unpack_in) n'est atteint que parinstall_appimageet la branche macOS.app.tar.gz. Nos bundles ne passent pas par la : le.debfaitpkexec dpkg -i, le NSIS ecrit le.exedans un temp et le lance. La moitierustls-webpkide la phrase, elle, est correcte — TLS travaille a chaque verification de mise a jour.Le correctif
tarreste le bon geste (on ne raisonne pas autour d'une advisory quand un patch trivial existe), mais la formulation promettait une atteignabilite qu'elle n'avait pas.ADR 0018
La decision et ses trois regles sont inchangees — seules les entrees ont bouge. Un bloc d'amendement en tete marque les passages devenus historiques, dont l'alternative « override /
[patch.crates-io]impossible carplistexige^0.38», queplist1.10.0 a rendue fausse le jour meme. Le principe qu'elle illustrait ([patch.crates-io]ne franchit pas une frontiere semver-incompatible) reste juste, seul le cas d'espece a disparu.La regle du pendant est aussi durcie : toute entree doit avoir une issue portant sa condition de retrait.
rsan'en avait pas — #312 ferme, la liste serait devenue 100 % non suivie de ce cote -> #319.Verifications
La seconde n'est pas une regression :
.cargo/audit.tomlvit a la racine et n'est lu que de la, ce qui est aussi la facon dontaudit.ymll'invoque. Piege a connaitre pour quiconque relance l'audit a la main.bash -e:ok: rsa absent from x86_64-unknown-linux-gnu, idem windows, canaritartrouve,Suppression guard: 2 checks, exit 0cargo check --all-targetsvertcargo test --all-targets: 106 passed, 0 failedReleve au passage, pas traite ici
#320 — on bundle
nsis,debetrpm, maislatest.jsonne construit son entreelinux-x86_64qu'a partir du.deb(release.yml:104-122). Un utilisateur installe en rpm recoit des octets deb queInstaller::Rpmrejette : il n'a aucun chemin de mise a jour automatique, alors que la mise a jour auto est une fonctionnalite Base+. Les notes de release annoncent en plus «.debou.AppImage» alors qu'aucun AppImage n'est construit.#319 — declencheur de retrait pour
rsa, la derniere entree de la liste.Note de process
Le plan checker a tourne deux fois sur cette PR. Le premier tour a bloque sur l'absence d'enquete sur le motif du yank — qui s'est revelee porteuse, puisqu'elle a decide du traitement CHANGELOG. Le second a attrape la contradiction
tarentre ce bullet et la doc QA de #315. Les deux items etaient invisibles depuis le diff seul.Verdict : APPROVE
Changement de lock uniquement, sans modification de manifeste. J'ai re-vérifié chaque affirmation portante de façon indépendante — base d'advisories, manifestes crates.io, sources amont, et le log du run CI 338 — et elles tiennent toutes. Aucun point bloquant. Huit remarques suivent, dont une (n° 1) mérite une action avant de tagger v0.15.0.
Ce que j'ai vérifié plutôt que cru sur parole
quick-xml0.41.0 porte le correctifadvisory-db/crates/quick-xml/RUSTSEC-2026-019{4,5}.mdpatched = [">= 0.41.0"]sur les deux — résolues, pas contournéesplist1.10.0 tient dans la borneplist/1.10.0/dependenciesquick-xml req=^0.41.0— la formulation de l'amendement ADR est exacte au caractère prèsrsan'a aucun correctifadvisory-db/crates/rsa/RUSTSEC-2023-0071.mdpatched = []— l'entrée qualifie bien par la seconde moitié de la règle 1, pas par l'atteignabilitéquick-xmlétait fondéetauri-plugin-deep-link/Cargo.toml[target.'cfg(target_os = "macos")'.build-dependencies.plist]—plistest bien Apple-only malgré un parent en dépendance directe ;cargo tree -i quick-xml --target x86_64-unknown-linux-gnuvide2.4.8 yanked=true,2.4.9 yanked=falsespin= yank en massepatched = [">= 0.9.8"], donc déjà satisfaite avant le bump : hygiène pure, confirmé[[package]]sur les deux locksok: rsa absent from x86_64-unknown-linux-gnu, idem windows,ok: canary 'tar' found,Suppression guard: 2 checks, exit 0— il s'exécute, il n'est pas seulement vert666 crate dependencies,21 allowed warnings found, zéro ligneyanked, 106 tests Rust vertsmaind'aujourd'huigit merge-treevs89149d0maina bougé de 62 fichiers depuis le merge-base81804bbmais n'a touché nisrc-tauri/, ni.cargo/, ni.forgejo/— la CI du 28 juillet reste représentative du côté RustLe raisonnement de l'ADR sur le cycle de vie d'une entrée est juste, et le fait que
plistdéclare littéralement^0.41.0rend l'alternative «[patch.crates-io]impossible » caduque exactement comme l'amendement le dit.Suggestions (aucune ne bloque)
1. Le diff de lock n'est pas de 4 paquets — il est de 4 bumps plus 7 réaiguillages
windows-sys, sur du code non compilé par la CI.Le corps annonce « diff de lock : 4 paquets ». Mesuré en comparant les arêtes de dépendance des deux locks, il y en a 7 de plus :
C'est la même dérive de re-résolution que #310 avait rencontrée, et elle est bénigne pour les mêmes raisons : les 6 versions de
windows-sysétaient déjà toutes dans le lock avant comme après (aucun paquet ajouté ni retiré, d'où les 666 constants), ce sont des depscfg(windows), etcargo check --lockeden CI prouve que la résolution est valide.Ce qui mérite d'être dit quand même, c'est où ça tombe :
rustls-platform-verifierettempfilesont précisément sur le chemin updater/TLS que cette PR décrit comme vivant. Or aucun job de CI ne compile Windows —check-rust.ymltourne dans un conteneurubuntu:22.04. Cette moitié du diff n'est donc prouvée par rien avant querelease.ymlne construise la cible Windows au tag. Le mode d'échec est franc (erreur de compilation, pas un bug silencieux), donc ce n'est pas bloquant, mais ça vaut un build Windows avant de tagger v0.15.0 plutôt qu'au moment du tag.La différence de traitement avec #310 est ce qui m'a fait regarder : cette PR-là avait explicitement borné sa dérive (« 7 pointeurs repointés vers des versions déjà présentes, 666 paquets avant/après »), celle-ci n'en parle pas.
2. L'argument de risque pour #313 est plus faible que sa conclusion — laquelle est correcte.
Le corps dit : « Le diff 2.4.8 -> 2.4.9 ne peut pas toucher nos chemins Linux/Windows », et s'appuie dessus pour se passer de couverture de test sur le chemin OAuth. J'ai diffé les deux crates dans le registre local. La conclusion tient, mais pas par ce chemin :
src/**est identique octet pour octet entre 2.4.8 et 2.4.9. C'est le fait le plus fort du dossier, et il n'est pas dans la PR.build.rsa changé — un prédicat inversé,.filter(|domain| domain.is_app_link())→.filter(|domain| !domain.is_app_link()). Mais il est à l'intérieur d'un#[cfg(any(target_os = "macos", target_os = "ios"))], donc pas compilé sur nos hôtes de build ; ettauri.conf.jsonne déclare quedeep-link.desktop.schemes, doncconfig.mobileest vide de toute façon.api-iife.jsa changé, et celui-là part sur toutes les plateformes — c'est le bundle JS injecté dans la webview. Delta réel : deux constantes ajoutées à l'énum d'événements (WINDOW_SUSPENDED,WINDOW_RESUMED). Purement additif ;onOpenUrl,register,getCurrentsont inchangés.Donc le diff atteint bien nos plateformes, il ne fait juste rien d'observable. Formulation qui se défend mieux : « le seul delta qui atteint le desktop est l'ajout de deux constantes d'événement dans le bundle JS injecté ; le
src/Rust est identique octet pour octet et la retouchebuild.rsestcfg-gatée Apple. » Le CHANGELOG amont confirme par ailleurs le commit unique #3396.3. L'entrée
rsane nomme pas #319, alors que c'est cette PR qui crée la règle l'exigeant.L'ADR gagne ici : « Toute entrée de la liste doit en avoir une ». Mais dans
.cargo/audit.toml, l'entrée restante s'arrête à « Removal trigger: a fixed rsa release, or sqlx dropping the crate from the graph » — sans référence d'issue, là où l'entréequick-xmlsupprimée par cette même PR portait « see #312 ». Quelqu'un qui lit le fichier ne peut pas retrouver #319. Ajouter— see #319, et étendre l'avertissement d'en-tête (« ADDING AN ENTRY HERE REQUIRES ADDING ITS CRATE TO THAT GUARD'S CRATE LIST ») pour couvrir aussi l'exigence d'issue, sinon la nouvelle règle ne vit que dans l'ADR.4. L'amendement annonce « trois passages » historiques ; il y en a quatre.
Le corps de la règle 3 dit encore : « Un bump
tauri/plistrendantquick-xmlinconditionnel laisserait la suppression cacher une advisory devenue vivante ». Le commentaire équivalent danscheck-rust.ymla bien été re-pointé surrsa, l'ADR ne l'a pas été — c'est le seul endroit où les deux divergent maintenant. Au passage, la ligne de front-matterIssues:liste toujours #310/#312/#314 seuls, alors que la section Références du bas a gagné #313 et #319.5. Sur
tar, le nommage de fonction est imprécis (conclusion inchangée).Le corps parle du « chemin vulnérable (
unpack_in) ». RUSTSEC-2026-0067 déclare[affected.functions]=tar::Entry::unpackettar::Entry::unpack_in— et le site d'appel visé,install_appimage(updater.rs:1016), utiliseunpack, pasunpack_in. RUSTSEC-2026-0068 (en-têtes PAX), elle, ne déclare aucune fonction affectée : c'est un écart d'analyse syntaxique qui touche tout parsing d'archive. Les deux sites d'appel identifiés sont les bons, seule l'étiquette de fonction est à corriger.6. Nuance sur « only reached by installer formats this app does not ship » (CHANGELOG).
Exact pour tout artefact livré, donc le texte peut rester. Mais
install_appimageest le bras_ =>deinstall_inner, pas la branche AppImage : il attrape aussibundle_type() == None. Etbundle_type()lit__TAURI_BUNDLE_TYPE, un placeholder que le bundler tamponne — non tamponné, il rendNonesur Linux et l'on retombe sur le chemintar. Nos.deb/.rpm/NSIS sont tamponnés, donc aucun utilisateur n'est concerné ; seul un build non bundlé le serait. Ça n'appelle pas un changement de texte, mais c'est exactement le genre de détail qui a sa place dans la doc QA de #315.7. Le glob
src-tauri/**reste non prouvé.Le point de suivi ouvert depuis #232. Cette PR touche
.forgejo/workflows/check-rust.yml, qui est une entrée chemin exact despaths:— le run 338 ne permet donc toujours pas d'isoler le glob, même s'il modifiesrc-tauri/Cargo.lock. Le prochain candidat serait une PR touchant uniquement un fichier soussrc-tauri/.8. Fraîcheur.
La CI date du 2026-07-28 et l'audit y a chargé la base RustSec de ce jour-là. Comme #314 fait que
audit.ymln'a jamais démarré, rien n'a audité ce lock depuis 17 jours ; la première chose qui le fera est la prochaine PR Rust. Rien à corriger ici, mais à savoir avant de considérer le vert comme une garantie à jour.Conformité
fix(deps): …✓ —Resolves #312/Resolves #313✓CRATESdu garde-fou) est exercé en vrai par la CI, log à l'appui[Unreleased]n'est pas publié, et deux bullets contradictoires seraient partis ensemble dans les notes de v0.15.0Addendum à la revue ci-dessus — verdict inchangé (APPROVE)
Seconde passe indépendante. Je ne redouble pas la revue précédente, qui est plus complète que ce que j'aurais produit et dont je confirme le verdict : le garde-fou s'exécute pour de vrai (run 338, quatre lignes imprimées sur le commit de tête
108cc38), la rétractationtarest exacte —tar::Archive+entry.unpackn'existent qu'enupdater.rs:1011/1016(install_appimage) et1228/1241(macOS), quandinstall_debpart surdpkg -i,install_rpmsurrpm -Uet Windows surzip— ettauri.conf.json:26ne déclare que["nsis", "deb", "rpm"].Deux points seulement à ajouter, dont un qui retourne la suggestion n° 1.
La dérive
windows-sysva dans le sens inverse de ce qui est supposé — cette PR restaure une configuration déjà éprouvée sous WindowsLa suggestion n° 1 lit les 7 réaiguillages comme « la même dérive de re-résolution que #310 » et en conclut qu'il faut un build Windows avant de tagger v0.15.0, parce que
rustls-platform-verifierettempfilesont sur le chemin updater/TLS et que la CI ne compile pas Windows. Le constat sur la CI est exact, mais le sens du mouvement est l'inverse de ce qui est supposé.#310(f4b09b0) a fait descendre ces 7 crates depuis0.61.2:Cette PR les remonte à
0.61.2. Et c'est exactement l'état du tagv0.14.0— les 7, vérifiés un par un dansgit show v0.14.0:src-tauri/Cargo.lock, y pointent tous verswindows-sys 0.61.2.La chronologie tranche : v0.14.0 taggée le 07-18, #310 mergée le 07-27. Le build NSIS Windows de v0.14.0 a donc réellement compilé
colored,dirs-sys,errno,rustix,rustls-platform-verifier,tempfileetwinapi-utilcontrewindows-sys 0.61.2.Conséquences, dans l'ordre inverse de l'intuition :
mainporte aujourd'hui — la descente de #310, mergée après le dernier tag et jamais passée par un build Windows ;Le silence du corps sur ces 7 lignes reste un vrai manque, comme le dit la suggestion n° 1. Simplement, une fois nommées, elles jouent en faveur de la PR.
Le « 106 passed » sera périmé au merge
Le run 338 date du 07-28, sur une base antérieure au chantier import.
src-tauri/src/lib.rspasse de 50 à 55#[test]entre la branche etmain, ce qui recoupe le 106 → 111 de STATE.md. Le merge est propre etmainn'a touché aucun fichier de dépendance, donc le risque reste faible — mais rejouercargo check+cargo testsur le résultat du merge avant de pousser, et ne pas réaffirmer 106 dans le commit de merge ou les notes.Vérifié aussi
Les dates du texte commité sont littéralement vraies, ce qui n'allait pas de soi :
.cargo/audit.tomlest arrivé surmainenf4b09b0à 19:45 -0400, ce commit est daté 21:30 -0400 le même jour. « le jour même » et « pendant quelques heures » ne sont pas des arrondis rhétoriques.108cc3801cto2d4caecae8Mergée dans
mainen ff-only :2d4caec(89149d0..97d376b). Forgejo ne détecte pas un merge local comme merged — d'où cette fermeture manuelle.Branche rebasée sur
mainavant merge (elle avait 15 commits de retard). Le rebase laisse.cargo/,.forgejo/etsrc-tauri/Cargo.lockidentiques au byte près au commit validé par la CI run 338, et aucun commit demainn'avait touché ces chemins.CI re-jouée sur le commit rebasé — run 370 vert, garde-fou d'audit réellement exécuté et tracé :
cargo audit: 0 vulnérabilité, 22 warnings autorisés.cargo test: 111 passed, 0 failed (le « 106 » de la description était périmé — le chantier import a ajouté 5 tests).#312 et #313 fermées automatiquement par les
Resolvesdu message de commit.Pull request closed