70 lines
7.2 KiB
Markdown
70 lines
7.2 KiB
Markdown
# Fixturi Maven (Proof of Software 1.6.0, `sbom-maven`)
|
|
|
|
Fisiere REALE scrise de pluginul maven-lockfile (`io.github.chains-project:maven-lockfile`), extrase cu `git show` (octetii COMISI, fara
|
|
conversia de checkout) din depozitul public https://github.com/chains-project/maven-lockfile la commitul
|
|
`083b879a2202189aea2b29b47c52ef649b5e4289` (2026-10-16T23:15:34+02:00), pe 2026-10-18. Clona sta in afara depozitului nostru, numai de
|
|
citit; nimic nu a rulat din ea (nici `mvn`, nici alt interpretor). Amprentele de mai jos sunt ale octetilor extrasi si sunt identice cu ale
|
|
bloburilor din git (verificat cu `git show ... | sha256sum`). Dosarul e marcat `-text` in `.gitattributes`, ca un checkout cu
|
|
`core.autocrlf=true` sa nu le schimbe octetii (proba compara SHA-256 al `pom.xml` de pe disc cu `pom.checksum` din lockfile).
|
|
|
|
| fixtura | calea in depozitul sursa | pluginul care a scris-o (`metaData.config`) | sha256 | octeti |
|
|
|---|---|---|---|---|
|
|
| `maven-lockfile/lockfile.json` | `lockfile.json` (radacina: lockfile-ul propriu al pluginului) | 5.18.6, `checksumMode: remote`, `hermetic: true`, `includeBoms`, `includeParentPom` | `f94e6a78e9680d93089342dd5a922cf89508a7c921433ba75695e34ccc97acf1` | 1453087 |
|
|
| `maven-lockfile/pom.xml` | `pom.xml` | | `da144afab3256a91113eeca080f9b0836b7615c43327bdcdf40f2db1460a53ce` | 18006 |
|
|
| `reactor/pom.xml` | `src/test/resources-its/it/IntegrationTestsIT/reactorSnapshotSiblingShouldSucceed/pom.xml` (agregator, `<modules>`) | | `2c5e3529a91fa1289e348d7e7dbb7d2bcea6998882b163c474382a75f4b3daca` | 516 |
|
|
| `reactor/module-a/pom.xml` | `.../reactorSnapshotSiblingShouldSucceed/module-a/pom.xml` | | `fe5fd57c834ef8943fc6903fe2343708c920ee9e796de245c92e880bfe42be2b` | 1028 |
|
|
| `reactor/module-a/lockfile.json` | `.../reactorSnapshotSiblingShouldSucceed/module-a/lockfile.json` (dependinta de modul-frate din acelasi reactor, checksum gol) | 5.17.1-SNAPSHOT, `local` | `41de249b2fc9c6fc18777f2b0d589e6462da07040590806c5a17ba3efabcb233` | 2007 |
|
|
| `reactor/module-b/pom.xml` | `.../reactorSnapshotSiblingShouldSucceed/module-b/pom.xml` (fara lockfile comis) | | `ff80de0e2f3e3f4cb108ba102e51e927f33ee4bf7c57de7de9e9fa814355b32c` | 288 |
|
|
| `classifier/lockfile.json` | `.../classifierDependencyCheckCorrect/lockfile.json` (acelasi artefact simplu, `sources` si `javadoc`) | 5.14.3-SNAPSHOT, `local` | `b21155db575cdeca577889e8ed18421d0f7b13041ada4f7ad4a57b9aade3a672` | 11527 |
|
|
| `classifier/pom.xml` | `.../classifierDependencyCheckCorrect/pom.xml` | | `ffb0ec623d40e3b9655330aa563e8c17ca14b4e33bf3f1ac3803c6a02fdd3dee` | 1506 |
|
|
|
|
Ce contine fixtura mare, numarat cu o parcurgere INDEPENDENTA a lockfile-ului (in `test/sbom-maven.test.mjs`, alt cod decat `pos.mjs`):
|
|
986 de noduri in arborele proiectului si in cei 17 arbori de plugin; 325 de artefacte distincte (318 incluse + 7 inregistrate dinamic in
|
|
modul hermetic, furnizorii surefire, scrise de plugin cu `included: false` si FARA `selectedVersion`); 528 de noduri scoase de mediere
|
|
(159 pentru conflict, 369 pentru duplicat); 2 cu clasificator (`guice:classes`, `sisu-guice:noaop`); 2 cu `type: pom`; 17 pluginuri; 232 de
|
|
pom-uri parinte si 43 de BOM-uri; 617 componente in SBOM, toate cu SHA-256; 4 scope-uri (compile, provided, runtime, test); 13 coordonate
|
|
care apar si in arborele proiectului si intr-un arbore de plugin; 23 cu doua scope-uri.
|
|
|
|
## Semantica citita din sursa pluginului (nu din memorie)
|
|
|
|
`src/main/java/io/github/chains_project/maven_lockfile/graph/DependencyGraph.java`, `LockFileFacade.java`, `data/*.java`, la acelasi commit:
|
|
|
|
- `included = winnerVersion.isEmpty()` (nu exista marcaj de conflict in arborele verbose al lui Maven); `selectedVersion` = versiunea
|
|
castigatoare cand exista marcaj, altfel chiar versiunea nodului. Deci `included: false` cu `selectedVersion == version` e "omis pentru
|
|
duplicat", cu alta versiune e "omis pentru conflict"; niciunul nu ajunge pe classpath, parintele primeste versiunea aleasa.
|
|
- artefactele inregistrate dinamic (`addDynamicDependency`, modul hermetic) se construiesc cu `DependencyNode.of(...)` fara
|
|
`setIncluded`/`setSelectedVersion`: in JSON `included: false` si fara `selectedVersion`. Sunt rezolvate, nu mediate.
|
|
- `ArtifactType.of("jar")` si `Classifier.of("")` dau null, deci `type` si `classifier` lipsesc din JSON cand sunt jar, respectiv goale.
|
|
- checksum-ul e gol pentru radacina si pentru modulele SNAPSHOT din acelasi reactor (`reactorGavs`), altfel e hash-ul fisierului:
|
|
`remote` il citeste din depozitul de artefacte, `local` il calculeaza pe fisier (`FileSystemChecksumCalculator`, implicit SHA-256).
|
|
- `pom.checksum` e hash-ul fisierului `pom.xml` din care s-a generat lockfile-ul.
|
|
|
|
## Controale pozitive ale metodei, masurate 2026-10-18
|
|
|
|
- `pom.checksum` din `maven-lockfile/lockfile.json` == SHA-256 al `pom.xml` COMIS (`da144afa...`): deci `aere:maven-pom-matches-lockfile`
|
|
masoara ceva real. Proba o recalculeaza in test, independent de `pos.mjs`.
|
|
- checksum-ul din lockfile == sidecar-ul `.sha256` publicat de Maven Central (citit ca text, nu descarcat): `gson-2.14.0.jar`
|
|
`2cbd119bf1961c28788310963dc80ba65f58cdeec1dd139c8bdb1240faa2c36f`, `guava-33.5.0-jre.jar`
|
|
`1e301f0c52ac248b0b14fdc3d12283c77252d4d6f48521d572e7d8c4c2cc4ac7`, `gson-parent-2.14.0.pom`
|
|
`82b0f6694c5758ab8bb07e05630208d50f589d4b5e04fd0a046d59cdf7ba3d1d`. Deci checksum-ul e hash-ul FISIERULUI si intra in `hashes` CycloneDX.
|
|
- Masina de lucru nu are `~/.m2/repository`, deci proba cu jar-urile din memoria locala Maven e SARITA aici si ruleaza unde exista.
|
|
|
|
## Dogfood pe depozitul public, 2026-10-18
|
|
|
|
Pe clona 1 (`083b879a`, checkout superficial) si pe o a DOUA clona proaspata a aceluiasi depozit, FARA checkout (numai obiecte git, 44 MB),
|
|
cu `sbomMavenFromTree` / `attest` / `verify` din `pos.mjs` chemate dintr-un script din afara clonelor (in clone a intrat numai git):
|
|
|
|
- SBOM din clona 1, `--source-path .` (lockfile-ul e la radacina depozitului): 617 componente (71 dependinte, 17 pluginuri, 267 dependinte de
|
|
plugin, 232 pom-uri parinte, 43 BOM-uri), 617 cu SHA-256, 218 inregistrari de graf, 4 scope-uri, 159/369 noduri omise pentru
|
|
conflict/duplicat, 7 dinamice, `pom.xml matches lockfile: true`, 452.104 octeti; 131 ms (a doua rulare 119 ms, aceiasi octeti).
|
|
- Din clona 2: aceiasi octeti, 117 ms. Serialul `urn:uuid:125f2369-0208-518b-84a9-37538ef0fd9a` e derivat din continut.
|
|
- Atestare cu `source.path "."`, arborele `79b9c003543c`; `verify --rebuild-from <clona 2>`: VALID in 487 ms ("the attested SBOM says what the
|
|
committed lockfile.json (maven-lockfile) resolves (617 components)"); artefactul e un stand-in declarat (nu a rulat niciun build Maven),
|
|
deci "rebuild: artifacts" e ABSENT, nu fals.
|
|
- Control negativ: componentele numite `gson` scoase de mana din SBOM-ul atestat (sunt doua: 2.13.2 si 2.14.0): VALID pe digest, INVALID
|
|
la reconstructie ("0 component(s) only in the attested SBOM, 2 only in the lockfile; graph same; root same").
|
|
|
|
NEMASURAT: un lockfile scris cu `reduced: true` (fara noduri mediate) si unul cu `mavenExtensions` nevid; cititorul le accepta dupa
|
|
aceeasi schema, dar nicio fixtura reala de aici nu le are. Niciun alt depozit public decat al pluginului nu a fost gasit cu `lockfile.json`
|
|
comis (cautare web, 2026-10-18), deci un lockfile scris de alt proiect, cu alte optiuni, nu a fost citit.
|