diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..2b8b560 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,42 @@ +version: 2 +updates: + - package-ecosystem: maven + directory: "/" + schedule: + interval: weekly + day: monday + time: "06:00" + timezone: Etc/UTC + open-pull-requests-limit: 10 + groups: + jackson: + patterns: ["com.fasterxml.jackson*"] + twelvemonkeys: + patterns: ["com.twelvemonkeys*"] + jetty: + patterns: ["org.eclipse.jetty*"] + ignore: + # pdfbox 3.x is a breaking migration (PDF rendering is the core product + # path) — majors are deliberate work, not a Monday PR. + - dependency-name: "org.apache.pdfbox:pdfbox" + update-types: ["version-update:semver-major"] + # Jetty 12 moves package namespaces (ee9/ee10) — same reasoning. + - dependency-name: "org.eclipse.jetty:*" + update-types: ["version-update:semver-major"] + # slf4j 2.x changes the binding mechanism; stay on 1.7.x until chosen. + - dependency-name: "org.slf4j:*" + update-types: ["version-update:semver-major"] + # JUnit 5 is a rewrite of the test framework, not a bump. + - dependency-name: "junit:junit" + update-types: ["version-update:semver-major"] + # Internal artifact resolved from the checked-in libs/ file repo; + # Dependabot cannot see it. + - dependency-name: "com.applitools.eyesutilities:EyesUtilities" + + - package-ecosystem: github-actions + directory: "/" + schedule: + interval: weekly + day: monday + time: "06:00" + timezone: Etc/UTC diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9042564..d46a786 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,5 +1,8 @@ name: CI +permissions: + contents: read + on: push: branches: [main] @@ -15,7 +18,7 @@ jobs: pii-guard: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4 - name: Scan tracked files for customer data run: bash .githooks/pii-guard.sh --all @@ -23,9 +26,9 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4 - - uses: actions/setup-java@v4 + - uses: actions/setup-java@c1e323688fd81a25caa38c78aa6df2d33d3e20d9 # v4 with: distribution: temurin java-version: 11 @@ -40,9 +43,9 @@ jobs: if: github.event_name == 'push' || !github.event.pull_request.head.repo.fork steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4 - - uses: actions/setup-java@v4 + - uses: actions/setup-java@c1e323688fd81a25caa38c78aa6df2d33d3e20d9 # v4 with: distribution: temurin java-version: 11 @@ -63,15 +66,15 @@ jobs: runs-on: ${{ matrix.os }} steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4 - - uses: actions/setup-java@v4 + - uses: actions/setup-java@c1e323688fd81a25caa38c78aa6df2d33d3e20d9 # v4 with: distribution: temurin java-version: 17 cache: maven - - uses: actions/setup-node@v4 + - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4 with: node-version: 20 @@ -81,7 +84,7 @@ jobs: run: mvn -Pgui-installers -DskipTests -Dowasp.skip=true clean verify --batch-mode - name: Upload installer - uses: actions/upload-artifact@v4 + uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 with: name: imagetester-installer-${{ matrix.os }} path: target/installers/* diff --git a/.github/workflows/multi-format.yml b/.github/workflows/multi-format.yml index 4f4b18a..6f26df6 100644 --- a/.github/workflows/multi-format.yml +++ b/.github/workflows/multi-format.yml @@ -1,5 +1,8 @@ name: multi-format-tests +permissions: + contents: read + on: push: branches: [main] @@ -10,10 +13,10 @@ jobs: multi-format: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4 - name: Set up JDK 11 - uses: actions/setup-java@v4 + uses: actions/setup-java@c1e323688fd81a25caa38c78aa6df2d33d3e20d9 # v4 with: distribution: temurin java-version: '11' diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 85087c0..f45147a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,5 +1,8 @@ name: Release +permissions: + contents: read + on: push: tags: ['v*'] @@ -16,9 +19,9 @@ jobs: version: ${{ steps.ver.outputs.version }} tag: ${{ steps.ver.outputs.tag }} steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4 - - uses: actions/setup-java@v4 + - uses: actions/setup-java@c1e323688fd81a25caa38c78aa6df2d33d3e20d9 # v4 with: distribution: temurin java-version: 17 @@ -75,15 +78,15 @@ jobs: HAS_WINDOWS_SIGNING: ${{ secrets.WINDOWS_SIGNING_CERT != '' }} HAS_APPLE_SIGNING: ${{ secrets.APPLE_SIGNING_CERT != '' }} steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4 - - uses: actions/setup-java@v4 + - uses: actions/setup-java@c1e323688fd81a25caa38c78aa6df2d33d3e20d9 # v4 with: distribution: temurin java-version: 17 cache: maven - - uses: actions/setup-node@v4 + - uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4 with: node-version: 20 @@ -125,7 +128,7 @@ jobs: mv "$file" "ImageTester-${{ needs.validate.outputs.version }}-${{ matrix.label }}.${ext}" ls - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 with: name: installer-${{ matrix.label }} path: target/installers/* @@ -135,9 +138,9 @@ jobs: needs: validate runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4 - - uses: actions/setup-java@v4 + - uses: actions/setup-java@c1e323688fd81a25caa38c78aa6df2d33d3e20d9 # v4 with: distribution: temurin java-version: 11 @@ -166,7 +169,7 @@ jobs: done ls -la ImageTester_*.jar - - uses: actions/upload-artifact@v4 + - uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4 with: name: cli-jars path: jars/ImageTester_*.jar @@ -179,9 +182,9 @@ jobs: permissions: contents: write steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4 - - uses: actions/download-artifact@v4 + - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4 with: path: dist merge-multiple: true diff --git a/.github/workflows/security.yml b/.github/workflows/security.yml new file mode 100644 index 0000000..9c3f661 --- /dev/null +++ b/.github/workflows/security.yml @@ -0,0 +1,74 @@ +name: Security + +on: + pull_request: + schedule: + # Monday 05:00 UTC — one hour before Dependabot opens bump PRs, so the + # Security tab reflects reality when the PRs arrive. + - cron: "0 5 * * 1" + workflow_dispatch: + +permissions: + contents: read + +jobs: + # ---- PR gate: blocks CRITICAL/HIGH introduced by the PR ---- + + dependency-review: + if: github.event_name == 'pull_request' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4 + - uses: actions/dependency-review-action@2031cfc080254a8a887f58cffee85186f0e49e48 # v4 + with: + fail-on-severity: high + + osv-pr: + if: github.event_name == 'pull_request' + permissions: + actions: read + contents: read + security-events: write + uses: google/osv-scanner-action/.github/workflows/osv-scanner-reusable-pr.yml@9a498708959aeaef5ef730655706c5a1df1edbc2 # v2.3.8 + + trivy-pr: + if: github.event_name == 'pull_request' + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4 + - uses: aquasecurity/trivy-action@ed142fd0673e97e23eac54620cfb913e5ce36c25 # v0.36.0 + with: + scan-type: fs + scan-ref: . + severity: CRITICAL,HIGH + ignore-unfixed: true + exit-code: "1" + + # ---- Weekly audit: full scans, all severities, SARIF to Security tab ---- + + osv-audit: + if: github.event_name == 'schedule' || github.event_name == 'workflow_dispatch' + permissions: + actions: read + contents: read + security-events: write + uses: google/osv-scanner-action/.github/workflows/osv-scanner-reusable.yml@9a498708959aeaef5ef730655706c5a1df1edbc2 # v2.3.8 + + trivy-audit: + if: github.event_name == 'schedule' || github.event_name == 'workflow_dispatch' + runs-on: ubuntu-latest + permissions: + contents: read + security-events: write + steps: + - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4 + - uses: aquasecurity/trivy-action@ed142fd0673e97e23eac54620cfb913e5ce36c25 # v0.36.0 + with: + scan-type: fs + scan-ref: . + format: sarif + output: trivy-results.sarif + - uses: github/codeql-action/upload-sarif@4187e74d05793876e9989daffde9c3e66b4acd07 # v3 + with: + sarif_file: trivy-results.sarif + category: trivy diff --git a/pom.xml b/pom.xml index 689c87a..076291d 100644 --- a/pom.xml +++ b/pom.xml @@ -76,6 +76,19 @@ 4.11.0 test + + + com.fasterxml.jackson.core + jackson-core + 2.22.1 + + + com.fasterxml.jackson.dataformat + jackson-dataformat-csv + 2.22.1 + com.applitools.eyesutilities EyesUtilities @@ -84,7 +97,7 @@ org.apache.pdfbox pdfbox - 2.0.29 + 2.0.37 com.applitools @@ -109,33 +122,23 @@ commons-io commons-io - 2.11.0 + 2.22.0 compile - - com.fasterxml.jackson.core - jackson-core - 2.13.4 - org.apache.pdfbox jbig2-imageio - 3.0.4 + 3.0.5 com.opencsv opencsv - 5.8 - - - com.fasterxml.jackson.dataformat - jackson-dataformat-csv - 2.13.4 + 5.12.0 org.slf4j slf4j-simple - 1.7.32 + 1.7.36 compile @@ -166,12 +169,12 @@ org.eclipse.jetty jetty-server - 11.0.20 + 11.0.26 org.eclipse.jetty jetty-servlet - 11.0.20 + 11.0.26 com.github.javakeyring