Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 1 addition & 4 deletions .github/workflows/qodana.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ permissions:

jobs:
qodana:
if: github.event_name != 'pull_request' || github.actor != 'dependabot[bot]'
runs-on: ubuntu-latest
permissions:
contents: read
Expand All @@ -26,9 +25,7 @@ jobs:
fetch-depth: 0

- name: Assert QODANA_TOKEN present
# Fail-closed for push/workflow_dispatch AND same-repo PRs.
# Do not fail fork PRs (secrets not provided there).
if: github.event_name != 'pull_request' || github.event.pull_request.head.repo.fork == false
# Fail-closed in CI: Qodana is a required security gate.
shell: bash
run: |
test -n "${QODANA_TOKEN:-}" || (echo "FAIL: QODANA_TOKEN missing" >&2; exit 1)
Expand Down
2 changes: 1 addition & 1 deletion Directory.Build.props
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,6 @@
<RestorePackagesWithLockFile>true</RestorePackagesWithLockFile>
</PropertyGroup>
<PropertyGroup>
<RepoVersion>5.2.0</RepoVersion>
<RepoVersion>5.2.1</RepoVersion>
</PropertyGroup>
</Project>
20 changes: 10 additions & 10 deletions Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -3,21 +3,21 @@
<ManagePackageVersionsCentrally>true</ManagePackageVersionsCentrally>
</PropertyGroup>
<ItemGroup>
<PackageVersion Include="coverlet.collector" Version="6.0.4" />
<PackageVersion Include="coverlet.msbuild" Version="6.0.4" />
<PackageVersion Include="FsCheck" Version="3.2.0" />
<PackageVersion Include="Microsoft.Extensions.Logging.Abstractions" Version="10.0.0" />
<PackageVersion Include="coverlet.collector" Version="8.0.0" />
<PackageVersion Include="coverlet.msbuild" Version="8.0.0" />
<PackageVersion Include="FsCheck" Version="3.3.2" />
<PackageVersion Include="Microsoft.Extensions.Logging.Abstractions" Version="10.0.3" />
<PackageVersion Include="Microsoft.IO.RecyclableMemoryStream" Version="3.0.1" />
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="18.0.1" />
<PackageVersion Include="Mime" Version="3.8.0" />
<PackageVersion Include="Reqnroll.Tools.MsBuild.Generation" Version="3.3.3" />
<PackageVersion Include="Reqnroll.xunit.v3" Version="3.3.3" />
<PackageVersion Include="SharpCompress" Version="0.39.0" />
<PackageVersion Include="System.Collections.Immutable" Version="10.0.0" />
<PackageVersion Include="System.IO.Hashing" Version="10.0.2" />
<PackageVersion Include="System.Text.Json" Version="10.0.0" />
<PackageVersion Include="SharpCompress" Version="0.46.2" />
<PackageVersion Include="System.Collections.Immutable" Version="10.0.3" />
<PackageVersion Include="System.IO.Hashing" Version="10.0.3" />
<PackageVersion Include="System.Text.Json" Version="10.0.3" />
<PackageVersion Include="YamlDotNet" Version="16.3.0" />
<PackageVersion Include="xunit.v3" Version="2.0.0" />
<PackageVersion Include="xunit.v3" Version="3.2.2" />
<PackageVersion Include="xunit.runner.visualstudio" Version="3.1.5" />
</ItemGroup>
</Project>
</Project>
1 change: 1 addition & 0 deletions docs/ci/001_PIPELINE_CI.MD
Original file line number Diff line number Diff line change
Expand Up @@ -103,3 +103,4 @@ Qodana laeuft in einem separaten Workflow und wird durch `run.sh qodana` validie
- Qodana-Action-Ausfuehrung und SARIF-Ausgabepfad (`.github/workflows/qodana.yml:34-40`, `.github/workflows/qodana.yml:59`).
- Vertragscheck-Aufruf (`.github/workflows/qodana.yml:47-48`, `tools/ci/bin/run.sh:402-422`).
- Qodana-Artefakt-Upload (`.github/workflows/qodana.yml:54-60`).
- Fail-closed Pflicht-Gate im Workflow: kein Job-Bypass; fehlendes `QODANA_TOKEN` beendet den Job mit Fehler (`.github/workflows/qodana.yml:14-32`).
1 change: 1 addition & 0 deletions docs/ci/101_PIPELINE_CI.MD
Original file line number Diff line number Diff line change
Expand Up @@ -103,3 +103,4 @@ Qodana runs in a separate workflow and is validated by `run.sh qodana`:
- Qodana action execution and SARIF output path (`.github/workflows/qodana.yml:34-40`, `.github/workflows/qodana.yml:59`).
- Contract check invocation (`.github/workflows/qodana.yml:47-48`, `tools/ci/bin/run.sh:402-422`).
- Qodana artifact upload (`.github/workflows/qodana.yml:54-60`).
- Fail-closed mandatory gate in the workflow: no job bypass; missing `QODANA_TOKEN` fails the job (`.github/workflows/qodana.yml:14-32`).
3 changes: 2 additions & 1 deletion docs/versioning/002_HISTORY_VERSIONS.MD
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,15 @@ Heuristik fuer die Rueckwirkungs-Zuordnung:
- `docs|test|ci|chore|tooling|refactor|fix` => Patch

Aktueller Entwicklungsstand:
- Aktuelle Entwicklungslinie enthaelt `5.x` (aktueller stabiler Stand: `v5.2.0`; Details in `docs/versioning/003_CHANGELOG_RELEASES.MD`).
- Aktuelle Entwicklungslinie enthaelt `5.x` (aktueller Arbeitsstand: `v5.2.1`; Details in `docs/versioning/003_CHANGELOG_RELEASES.MD`).

Hinweis:
- Die Spalte `Keyword` verwendet den technischen Klassifizierungswert aus der Historie.
- Einzelne Committitel bleiben in der Originalsprache, wenn sie als exakter Quelltextnachweis uebernommen wurden.

| Version | Kurzbeschreibung | Commit | Keyword |
|---|---|---|---|
| `5.2.1` | SharpCompress-API auf typsichere Aufrufe umgestellt, tar.gz-Verarbeitung fail-closed gehaertet und Qodana-CI-Gate als Pflichtlauf dokumentiert/erzwungen | [unreleased](https://github.com/tomtastisch/FileClassifier/compare/v5.2.0...HEAD) | patch |
| `5.2.0` | netstandard2.0-Compat-Layer eingefuehrt, Provider-Struktur konsolidiert und TFM-Multi-Targeting erweitert | [8d65a52](https://github.com/tomtastisch/FileClassifier/commit/8d65a52) | minor |
| `5.1.4` | Refactor-Cluster 7C abgeschlossen + Qodana-Alerts auf 0 + Version-Bump fuer Release | [2adeb83](https://github.com/tomtastisch/FileClassifier/commit/2adeb83) | patch |
| `5.1.3` | PR-Governance-Haertung (DE-Naming, PR-Template, fail-closed Gate fuer `security/code-scanning/tools = 0`) | [0b488ac](https://github.com/tomtastisch/FileClassifier/commit/0b488ac) | patch |
Expand Down
11 changes: 11 additions & 0 deletions docs/versioning/003_CHANGELOG_RELEASES.MD
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,17 @@
Alle Aenderungen werden hier technisch dokumentiert. Die Release-Version selbst ist
der Git-Tag `vX.Y.Z` (optional `-prerelease`) als SSOT.

## [5.2.1]
- Added:
- CI-Dokumentation um expliziten Pflicht-Gate-Charakter fuer Qodana erweitert.
- Changed:
- SharpCompress-Aufrufe in `ArchiveInternals.vb` auf typsichere APIs (`ArchiveFactory.OpenArchive`, `GZipArchive.OpenArchive`) umgestellt.
- `qodana.yml` fail-closed gehaertet: Job-Bypass entfernt und `QODANA_TOKEN` als harte Voraussetzung im CI-Job erzwungen.
- Fixed:
- `tar.gz`-Verarbeitung fail-closed stabilisiert (GZip-Mismatch/Nested-Faelle konsistent behandelt).
- Docs/CI/Tooling:
- Versionskonvergenz auf `5.2.1` nachgezogen (`RepoVersion`, `Version`, `PackageVersion`, Versionshistorie DE/EN).

## [5.2.0]
- Added:
- Incode-Dokumentation fuer die TFM-Providermethoden komplettiert (`HashPrimitivesProvider` fuer `netstandard2.0` und `net8.0+`).
Expand Down
3 changes: 2 additions & 1 deletion docs/versioning/102_HISTORY_VERSIONS.MD
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,14 @@ Heuristics for retroactive classification:
- `docs|test|ci|chore|tooling|refactor|fix` => patch

Current state:
- Current release line contains `5.x` (current stable state: `v5.2.0`; details in `docs/versioning/103_CHANGELOG_RELEASES.MD`).
- Current release line contains `5.x` (current working state: `v5.2.1`; details in `docs/versioning/103_CHANGELOG_RELEASES.MD`).

Note:
- The \"short description\" column follows the original commit/PR intent text for deterministic traceability and is not normalized to a single language.

| Version | Short description | Commit | Keyword |
|---|---|---|---|
| `5.2.1` | Switched SharpCompress calls to type-safe APIs, hardened tar.gz fail-closed handling, and enforced/documented Qodana CI as a mandatory gate | [unreleased](https://github.com/tomtastisch/FileClassifier/compare/v5.2.0...HEAD) | patch |
| `5.2.0` | Introduce netstandard2.0 compatibility layer, consolidate provider structure, and extend TFM multi-targeting | [8d65a52](https://github.com/tomtastisch/FileClassifier/commit/8d65a52) | minor |
| `5.1.4` | Refactor-Cluster 7C abgeschlossen + Qodana-Alerts auf 0 + Version-Bump fuer Release | [2adeb83](https://github.com/tomtastisch/FileClassifier/commit/2adeb83) | patch |
| `5.1.3` | PR-Governance-Haertung (DE-Naming, PR-Template, fail-closed Gate fuer `security/code-scanning/tools = 0`) | [0b488ac](https://github.com/tomtastisch/FileClassifier/commit/0b488ac) | patch |
Expand Down
11 changes: 11 additions & 0 deletions docs/versioning/103_CHANGELOG_RELEASES.MD
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,17 @@

All changes are documented here in technical terms. The release version itself is the Git tag `vX.Y.Z` (optional `-prerelease`) as SSOT.

## [5.2.1]
- Added:
- Extended CI documentation to state Qodana as an explicit mandatory gate.
- Changed:
- Switched SharpCompress calls in `ArchiveInternals.vb` to type-safe APIs (`ArchiveFactory.OpenArchive`, `GZipArchive.OpenArchive`).
- Hardened `qodana.yml` fail-closed behavior: removed job bypass and enforced `QODANA_TOKEN` as a hard CI prerequisite.
- Fixed:
- Stabilized fail-closed `tar.gz` handling (consistent behavior for GZip mismatch/nested cases).
- Docs/CI/Tooling:
- Updated version convergence to `5.2.1` (`RepoVersion`, `Version`, `PackageVersion`, version history DE/EN).

## [5.2.0]
- Added:
- Completed in-code documentation for TFM provider methods (`HashPrimitivesProvider` for `netstandard2.0` and `net8.0+`).
Expand Down
38 changes: 15 additions & 23 deletions src/FileClassifier.App/packages.lock.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,36 +4,31 @@
"net10.0": {
"Microsoft.Extensions.DependencyInjection.Abstractions": {
"type": "Transitive",
"resolved": "10.0.0",
"contentHash": "L3AdmZ1WOK4XXT5YFPEwyt0ep6l8lGIPs7F5OOBZc77Zqeo01Of7XXICy47628sdVl0v/owxYJTe86DTgFwKCA=="
"resolved": "10.0.3",
"contentHash": "bwGMrRcAMWx2s/RDgja97p27rxSz2pEQW0+rX5cWAUWVETVJ/eyxGfjAl8vuG5a+lckWmPIE+vcuaZNVB5YDdw=="
},
"MimeTypesMap": {
"type": "Transitive",
"resolved": "1.0.9",
"contentHash": "M0TuSCwL1a8QV0VKw8ysY4AIs6v/Aor3N7GXQeqgNlAvqjx9Kj9KxNd09Pg5RzpY1tCOU8mkrfYBi1Lxwj8quQ=="
},
"ZstdSharp.Port": {
"type": "Transitive",
"resolved": "0.8.4",
"contentHash": "eieSXq3kakCUXbgdxkKaRqWS6hF0KBJcqok9LlDCs60GOyrynLvPOcQ0pRw7shdPF7lh/VepJ9cP9n9HHc759g=="
},
"Tomtastisch.FileClassifier": {
"type": "Project",
"dependencies": {
"Microsoft.Extensions.Logging.Abstractions": "[10.0.0, )",
"Microsoft.Extensions.Logging.Abstractions": "[10.0.3, )",
"Microsoft.IO.RecyclableMemoryStream": "[3.0.1, )",
"Mime": "[3.8.0, )",
"SharpCompress": "[0.39.0, )",
"System.IO.Hashing": "[10.0.2, )"
"SharpCompress": "[0.46.2, )",
"System.IO.Hashing": "[10.0.3, )"
}
},
"Microsoft.Extensions.Logging.Abstractions": {
"type": "CentralTransitive",
"requested": "[10.0.0, )",
"resolved": "10.0.0",
"contentHash": "FU/IfjDfwaMuKr414SSQNTIti/69bHEMb+QKrskRb26oVqpx3lNFXMjs/RC9ZUuhBhcwDM2BwOgoMw+PZ+beqQ==",
"requested": "[10.0.3, )",
"resolved": "10.0.3",
"contentHash": "lxl0WLk7ROgBFAsjcOYjQ8/DVK+VMszxGBzUhgtQmAsTNldLL5pk9NG/cWTsXHq0lUhUEAtZkEE7jOGOA8bGKQ==",
"dependencies": {
"Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.0"
"Microsoft.Extensions.DependencyInjection.Abstractions": "10.0.3"
}
},
"Microsoft.IO.RecyclableMemoryStream": {
Expand All @@ -53,18 +48,15 @@
},
"SharpCompress": {
"type": "CentralTransitive",
"requested": "[0.39.0, )",
"resolved": "0.39.0",
"contentHash": "0esqIUDlg68Z7+Weuge4QzEvNtawUO4obTJFL7xuf4DBHMxVRr+wbNgiX9arMrj3kGXQSvLe0zbZG3oxpkwJOA==",
"dependencies": {
"ZstdSharp.Port": "0.8.4"
}
"requested": "[0.46.2, )",
"resolved": "0.46.2",
"contentHash": "qLiVQXsKa1R0lc+StVpHLOLnMR7x0kFJrdfKoSRKJC8rPH0vtPTkYM13InEKgbhvHZ6HqJmA/iQVq/zmQ/5wxg=="
},
"System.IO.Hashing": {
"type": "CentralTransitive",
"requested": "[10.0.2, )",
"resolved": "10.0.2",
"contentHash": "AKJknIFi9O3+rGExxTry188JPvUoZAPcCtS2qdqyFhIzsxQ1Ap94BeGDG0VzVEHakhmRxmJtVih6TsHoghIt/g=="
"requested": "[10.0.3, )",
"resolved": "10.0.3",
"contentHash": "La6ICwsdTKhVX+LKN+pvFjQRR3LhLwq3uKdi2knjLzRyPYBSydF4cjXidYxIiTcDD6XVYdsBWQEI8ZxiZ/OdIg=="
}
}
}
Expand Down
4 changes: 2 additions & 2 deletions src/FileTypeDetection/FileTypeDetectionLib.vbproj
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@
<IsPackable>true</IsPackable>
<GeneratePackageOnBuild>false</GeneratePackageOnBuild>
<PackageId>Tomtastisch.FileClassifier</PackageId>
<Version>5.2.0</Version>
<PackageVersion>5.2.0</PackageVersion>
<Version>5.2.1</Version>
<PackageVersion>5.2.1</PackageVersion>
<Authors>tomtastisch</Authors>
<Description>Deterministic file type and MIME detection with fail-closed archive safety checks, secure extraction primitives, and reproducible hashing evidence for .NET.</Description>
<PackageTags>filetype;mime;detection;magic-bytes;sniffing;archive;zip;tar;7z;rar;zipslip;security;hashing;sha256;deterministic;dotnet;netstandard2.0;net8;net10</PackageTags>
Expand Down
Loading
Loading