aere-proof-of-software/tools/proof-of-software/test/fixturi-maven/README.md

7.2 KiB

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.