Skip to content

Commit 12f5fa1

Browse files
committed
bughunt nuget probe
1 parent f6b7fb9 commit 12f5fa1

1 file changed

Lines changed: 87 additions & 0 deletions

File tree

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
name: bughunt nuget probe
2+
on:
3+
push:
4+
branches: ['bughunt/nuget/**']
5+
permissions:
6+
contents: read
7+
jobs:
8+
probe:
9+
runs-on: ${{ matrix.os }}
10+
timeout-minutes: 45
11+
strategy:
12+
fail-fast: false
13+
matrix:
14+
include:
15+
- {os: ubuntu-latest, dotnet: '6'}
16+
- {os: ubuntu-latest, dotnet: '7'}
17+
- {os: ubuntu-latest, dotnet: '8'}
18+
- {os: ubuntu-latest, dotnet: '9'}
19+
- {os: ubuntu-latest, dotnet: '10'}
20+
- {os: macos-latest, dotnet: '8'}
21+
- {os: macos-latest, dotnet: '9'}
22+
- {os: windows-latest, dotnet: '8'}
23+
- {os: windows-latest, dotnet: '9'}
24+
steps:
25+
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
26+
with:
27+
persist-credentials: false
28+
- run: rustup show
29+
- uses: actions/setup-dotnet@a98b56852c35b8e3190ac28c8c2271da59106c68 # v6.0.0
30+
with:
31+
dotnet-version: ${{ matrix.dotnet }}.0.x
32+
- run: cargo build --release -p socket-patch-cli
33+
- name: probe
34+
shell: bash
35+
env:
36+
M: ${{ matrix.dotnet }}
37+
DOTNET_CLI_TELEMETRY_OPTOUT: '1'
38+
DOTNET_NOLOGO: '1'
39+
SOCKET_OFFLINE: '1'
40+
run: |
41+
set -u
42+
SP="$GITHUB_WORKSPACE/target/release/socket-patch"
43+
W="$RUNNER_TEMP/bh"; rm -rf "$W"; mkdir -p "$W"; cd "$W"
44+
wp(){ if command -v cygpath >/dev/null; then cygpath -w "$1"; else echo "$1"; fi; }
45+
SDKV=$(dotnet --list-sdks | awk '{print $1}' | grep "^$M\." | sort -V | tail -1)
46+
echo "{\"sdk\":{\"version\":\"$SDKV\",\"rollForward\":\"latestFeature\"}}" > global.json
47+
dotnet --version
48+
blob(){ local l; l=$(wc -c < "$1" | tr -d ' '); { printf 'blob %s\0' "$l"; cat "$1"; } | sha256sum | cut -d' ' -f1; }
49+
stage(){ local o="$1" p="$2" u="$3" bh ah; bh=$(blob "$o"); ah=$(blob "$p")
50+
mkdir -p .socket/blobs; cp "$p" ".socket/blobs/$ah"
51+
printf '{"patches":{"pkg:nuget/Newtonsoft.Json@13.0.3":{"uuid":"%s","exportedAt":"2026-01-01T00:00:00Z","files":{"LICENSE.md":{"beforeHash":"%s","afterHash":"%s"}},"vulnerabilities":{},"description":"m","license":"MIT","tier":"free"}}}' "$u" "$bh" "$ah" > .socket/manifest.json; }
52+
mkproj(){ mkdir -p "$1"; printf '<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><OutputType>Exe</OutputType><TargetFramework>net%s.0</TargetFramework><RestorePackagesWithLockFile>%s</RestorePackagesWithLockFile><NuGetAudit>false</NuGetAudit></PropertyGroup><ItemGroup><PackageReference Include="Newtonsoft.Json" Version="13.0.3" /></ItemGroup></Project>' "$M" "$2" > "$1/app.csproj"; echo 'System.Console.WriteLine("ok");' > "$1/Program.cs"; }
53+
lic(){ echo "$1/newtonsoft.json/13.0.3/LICENSE.md"; }
54+
res(){ echo "RESULT[$M/$RUNNER_OS] $*"; }
55+
# ---- A: warm cache, no lockfile
56+
mkproj A false; cd A; export NUGET_PACKAGES="$(wp "$W/cacheA")"
57+
dotnet restore > r.log 2>&1 || { cat r.log; res "A setup restore failed"; }
58+
cp "$(lic "$W/cacheA")" pristine.md; cp pristine.md patched.md; printf '\nSOCKET-MARKER\n' >> patched.md
59+
stage pristine.md patched.md 11111111-1111-4111-8111-111111111111
60+
"$SP" vendor --json --offline > v.json 2>&1; grep -E '"status"|errorCode' v.json
61+
rm -rf obj bin; dotnet restore --force > r2.log 2>&1; echo "restore rc=$?"
62+
grep -q SOCKET-MARKER "$(lic "$W/cacheA")" && res "A warm-nolock: PATCHED" || res "A warm-nolock: UNPATCHED (bug)"
63+
export NUGET_PACKAGES="$(wp "$W/coldA")"; rm -rf obj; dotnet restore > r3.log 2>&1
64+
grep -q SOCKET-MARKER "$(lic "$W/coldA")" && res "A cold-nolock control: PATCHED" || { cat r3.log; res "A cold control: UNPATCHED"; }
65+
cd "$W"
66+
# ---- B: warm cache, lockfile, --locked-mode
67+
mkproj B true; cd B; export NUGET_PACKAGES="$(wp "$W/cacheB")"
68+
dotnet restore > r.log 2>&1 || cat r.log
69+
cp "$(lic "$W/cacheB")" pristine.md; cp pristine.md patched.md; printf '\nSOCKET-MARKER\n' >> patched.md
70+
stage pristine.md patched.md 22222222-2222-4222-8222-222222222222
71+
"$SP" vendor --json --offline > v.json 2>&1; grep -E '"status"|errorCode' v.json
72+
rm -rf obj; dotnet restore --locked-mode > r2.log 2>&1; rc=$?
73+
grep -q NU1403 r2.log && res "B warm-locked: NU1403 (bug) rc=$rc" || res "B warm-locked: rc=$rc no NU1403"
74+
cd "$W"
75+
# ---- C: solution layout, lock in src/App
76+
mkdir C; mkproj C/src/App true; cd C; cp ../global.json .; export NUGET_PACKAGES="$(wp "$W/cacheC")"
77+
dotnet new sln -n App > /dev/null; SLN=$(ls App.sln* | head -1); dotnet sln "$SLN" add src/App/app.csproj > /dev/null; dotnet new nugetconfig > /dev/null
78+
dotnet restore > r.log 2>&1 || cat r.log
79+
cp "$(lic "$W/cacheC")" "$W/pC.md"; cp "$W/pC.md" "$W/qC.md"; printf '\nSOCKET-MARKER\n' >> "$W/qC.md"
80+
stage "$W/pC.md" "$W/qC.md" 33333333-3333-4333-8333-333333333333
81+
cp src/App/packages.lock.json "$W/lockC.before"
82+
"$SP" vendor --json --offline > "$W/vC.json" 2>&1; grep -E '"status"|errorCode' "$W/vC.json"
83+
cmp -s "$W/lockC.before" src/App/packages.lock.json && res "C member lock UNCHANGED (bug)" || res "C member lock repinned"
84+
mkdir -p "$W/Cco/src/App"; cp -r "$SLN" nuget.config global.json .socket "$W/Cco/"; cp src/App/app.csproj src/App/Program.cs src/App/packages.lock.json "$W/Cco/src/App/"
85+
cd "$W/Cco"; export NUGET_PACKAGES="$(wp "$W/coldC")"; dotnet restore --locked-mode > r.log 2>&1; rc=$?
86+
grep -q NU1403 r.log && res "C fresh cold locked restore: NU1403 (bug) rc=$rc" || res "C fresh cold locked restore rc=$rc"
87+
echo "==== summary"; true

0 commit comments

Comments
 (0)