From 220df29888b921c75e8db61f230bf9be05c2965e Mon Sep 17 00:00:00 2001 From: infosave2007 Date: Tue, 30 Jun 2026 14:56:54 +0300 Subject: [PATCH] ci: build Windows binaries; add cross-platform CI test matrix - release.yml: add x86_64-pc-windows-msvc target, OS-aware packaging (.exe + .zip) - ci.yml: split into lint (fmt/clippy) + test matrix (ubuntu/windows/macos) - use getrandom for the admin/key token CSPRNG (secure on Windows too) Co-Authored-By: Claude Opus 4.8 (1M context) --- .github/workflows/ci.yml | 16 ++++++++++++++-- .github/workflows/release.yml | 15 ++++++++++++--- Cargo.lock | 1 + Cargo.toml | 3 +++ src/admin/mod.rs | 7 +++---- 5 files changed, 33 insertions(+), 9 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 8ac1ea5..6dd68fa 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -2,11 +2,11 @@ name: CI on: push: - branches: [ main, master ] + branches: [main, master] pull_request: jobs: - build: + lint: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 @@ -18,6 +18,18 @@ jobs: run: cargo fmt --all -- --check - name: Clippy run: cargo clippy --all-targets -- -D warnings + + test: + name: test (${{ matrix.os }}) + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, windows-latest, macos-14] + steps: + - uses: actions/checkout@v4 + - uses: dtolnay/rust-toolchain@stable + - uses: Swatinem/rust-cache@v2 - name: Build run: cargo build --release - name: Test diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index fa8ffed..5a5b1e3 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -36,6 +36,8 @@ jobs: target: x86_64-unknown-linux-gnu - os: macos-14 target: aarch64-apple-darwin + - os: windows-latest + target: x86_64-pc-windows-msvc steps: - uses: actions/checkout@v4 - uses: dtolnay/rust-toolchain@stable @@ -47,12 +49,19 @@ jobs: - name: Package shell: bash run: | + bin=cortiq-gateway + [ "${{ runner.os }}" = "Windows" ] && bin=cortiq-gateway.exe staging="cortiq-gateway-${{ github.ref_name }}-${{ matrix.target }}" mkdir "$staging" - cp "target/${{ matrix.target }}/release/cortiq-gateway" "$staging"/ + cp "target/${{ matrix.target }}/release/$bin" "$staging"/ cp README.md LICENSE config/gateway.example.toml "$staging"/ - tar czf "$staging.tar.gz" "$staging" - echo "ASSET=$staging.tar.gz" >> "$GITHUB_ENV" + if [ "${{ runner.os }}" = "Windows" ]; then + 7z a "$staging.zip" "$staging" >/dev/null + echo "ASSET=$staging.zip" >> "$GITHUB_ENV" + else + tar czf "$staging.tar.gz" "$staging" + echo "ASSET=$staging.tar.gz" >> "$GITHUB_ENV" + fi - name: Release uses: softprops/action-gh-release@v2 with: diff --git a/Cargo.lock b/Cargo.lock index 4cbb0bd..7dda80a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -272,6 +272,7 @@ dependencies = [ "bytes", "clap", "futures", + "getrandom 0.2.17", "mime_guess", "reqwest", "rust-embed", diff --git a/Cargo.toml b/Cargo.toml index a3edc98..21941be 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -42,6 +42,9 @@ arc-swap = "1" rust-embed = "8" mime_guess = "2" +# cross-platform CSPRNG for admin/key token generation (Linux/macOS/Windows) +getrandom = "0.2" + # streaming / async utils futures = "0.3" async-trait = "0.1" diff --git a/src/admin/mod.rs b/src/admin/mod.rs index d8d3aa0..50f8166 100644 --- a/src/admin/mod.rs +++ b/src/admin/mod.rs @@ -73,12 +73,11 @@ fn current_cfg(state: &SharedState) -> Config { } /// Random hex token from `n_bytes` bytes of cryptographic randomness. +/// Uses the OS CSPRNG via `getrandom` (works on Linux/macOS/Windows); falls back +/// to a time-based generator only in the extremely unlikely event that fails. pub fn random_token(n_bytes: usize) -> String { let mut buf = vec![0u8; n_bytes]; - if let Ok(mut f) = std::fs::File::open("/dev/urandom") { - use std::io::Read; - let _ = f.read_exact(&mut buf); - } else { + if getrandom::getrandom(&mut buf).is_err() { let t = std::time::SystemTime::now() .duration_since(std::time::UNIX_EPOCH) .unwrap_or_default()