From 40cf53199711cb8b9b03ba04f0d1d13cb7a996ae Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 24 Mar 2026 22:37:53 +0000 Subject: [PATCH 1/5] chore(deps): bump github.com/projectdiscovery/utils from 0.9.0 to 0.10.0 Bumps [github.com/projectdiscovery/utils](https://github.com/projectdiscovery/utils) from 0.9.0 to 0.10.0. - [Release notes](https://github.com/projectdiscovery/utils/releases) - [Changelog](https://github.com/projectdiscovery/utils/blob/main/CHANGELOG.md) - [Commits](https://github.com/projectdiscovery/utils/compare/v0.9.0...v0.10.0) --- updated-dependencies: - dependency-name: github.com/projectdiscovery/utils dependency-version: 0.10.0 dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 97d5c9ad..49e1c357 100644 --- a/go.mod +++ b/go.mod @@ -22,7 +22,7 @@ require ( github.com/projectdiscovery/ldapserver v1.0.2-0.20240219154113-dcc758ebc0cb github.com/projectdiscovery/retryabledns v1.0.113 github.com/projectdiscovery/retryablehttp-go v1.3.6 - github.com/projectdiscovery/utils v0.9.0 + github.com/projectdiscovery/utils v0.10.0 github.com/remeh/sizedwaitgroup v1.0.0 github.com/rs/xid v1.6.0 github.com/stretchr/testify v1.11.1 diff --git a/go.sum b/go.sum index 2de73ec2..4396220e 100644 --- a/go.sum +++ b/go.sum @@ -308,8 +308,8 @@ github.com/projectdiscovery/retryabledns v1.0.113 h1:s+DAzdJ8XhLxRgt5636H0HG9OqH github.com/projectdiscovery/retryabledns v1.0.113/go.mod h1:+DyanDr8naxQ2dRO9c4Ezo3NHHXhz8L0tTSRYWhiwyA= github.com/projectdiscovery/retryablehttp-go v1.3.6 h1:dLb0/YVX+oX70gpWxN5GXT8pCKpn8fdXfwOq2TsXxNY= github.com/projectdiscovery/retryablehttp-go v1.3.6/go.mod h1:tKVxmL4ixWy1MjYk5GJvFL0Cp10fnQgSp2F6bSBEypI= -github.com/projectdiscovery/utils v0.9.0 h1:eu9vdbP0VYXI9nGSLfnOpUqBeW9/B/iSli7U8gPKZw8= -github.com/projectdiscovery/utils v0.9.0/go.mod h1:zcVu1QTlMi5763qCol/L3ROnbd/UPSBP8fI5PmcnF6s= +github.com/projectdiscovery/utils v0.10.0 h1:E3nMm0h3LWt2bbnpRd8Whyj/y0DrMJKYx2zV8gqFDF0= +github.com/projectdiscovery/utils v0.10.0/go.mod h1:FL0cQdg3oBMtJdmbBrfLd5i73syNxpkbKO9tivQ0+rI= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/refraction-networking/utls v1.8.2 h1:j4Q1gJj0xngdeH+Ox/qND11aEfhpgoEvV+S9iJ2IdQo= github.com/refraction-networking/utls v1.8.2/go.mod h1:jkSOEkLqn+S/jtpEHPOsVv/4V4EVnelwbMQl4vCWXAM= From f6fb2dc2eb01a9d9c1ba66352a839a683a823eab Mon Sep 17 00:00:00 2001 From: Mzack9999 Date: Wed, 25 Mar 2026 21:36:57 +0100 Subject: [PATCH 2/5] updating actions --- .github/workflows/auto-merge.yaml | 20 ++++++++++++++++++++ .github/workflows/build-test.yml | 20 ++++++-------------- .github/workflows/codeql-analysis.yml | 17 +++++------------ .github/workflows/compat-checks.yaml | 20 ++++++++++++++++++++ .github/workflows/dep-auto-merge.yml | 26 -------------------------- .github/workflows/dockerhub-client.yml | 12 ++++++------ .github/workflows/dockerhub-server.yml | 10 +++++----- .github/workflows/lint-test.yml | 13 ++++--------- .github/workflows/manual-deploy.yml | 4 ++-- .github/workflows/release-binary.yml | 21 ++++++++------------- .github/workflows/release-test.yml | 18 ++++++------------ 11 files changed, 82 insertions(+), 99 deletions(-) create mode 100644 .github/workflows/auto-merge.yaml create mode 100644 .github/workflows/compat-checks.yaml delete mode 100644 .github/workflows/dep-auto-merge.yml diff --git a/.github/workflows/auto-merge.yaml b/.github/workflows/auto-merge.yaml new file mode 100644 index 00000000..e73bcf69 --- /dev/null +++ b/.github/workflows/auto-merge.yaml @@ -0,0 +1,20 @@ +name: 🔀 Auto merge PR + +on: + workflow_run: + workflows: ["♾️ Compatibility Checks"] + types: [completed] + +permissions: + contents: write + pull-requests: write + +jobs: + auto-merge-dependabot: + runs-on: ubuntu-latest + if: ${{ github.event.workflow_run.conclusion == 'success' }} + steps: + - uses: projectdiscovery/actions/pr/approve@v1 + - uses: projectdiscovery/actions/pr/merge@v1 + with: + auto: "true" diff --git a/.github/workflows/build-test.yml b/.github/workflows/build-test.yml index 650b5c4d..769d9b6b 100644 --- a/.github/workflows/build-test.yml +++ b/.github/workflows/build-test.yml @@ -10,18 +10,17 @@ on: jobs: build: name: Test Builds + if: ${{ !endsWith(github.actor, '[bot]') }} runs-on: ${{ matrix.os }} strategy: matrix: os: [ubuntu-latest, windows-latest, macOS-latest] steps: - - name: Set up Go - uses: actions/setup-go@v4 - with: - go-version: 1.21.x - - name: Check out code - uses: actions/checkout@v3 + uses: actions/checkout@v6 + + - name: Set up Go + uses: projectdiscovery/actions/setup/go@v1 - name: Build run: go build ./... @@ -31,17 +30,10 @@ jobs: run: go test ./... working-directory: . - # Todo - # - name: Integration Tests - # env: - # GH_ACTION: true - # run: bash run.sh - # working-directory: integration_tests/ - - name: Race Condition Tests run: go build -race ./... working-directory: . - name: Example Code Tests run: go build . - working-directory: examples/ \ No newline at end of file + working-directory: examples/ diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 90c913a9..296253d1 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -18,24 +18,17 @@ jobs: contents: read security-events: write - strategy: - fail-fast: false - matrix: - language: [ 'go' ] - # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ] - steps: - name: Checkout repository - uses: actions/checkout@v3 + uses: actions/checkout@v6 - # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@v2 + uses: github/codeql-action/init@v4 with: - languages: ${{ matrix.language }} + languages: go - name: Autobuild - uses: github/codeql-action/autobuild@v2 + uses: github/codeql-action/autobuild@v4 - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v2 \ No newline at end of file + uses: github/codeql-action/analyze@v4 diff --git a/.github/workflows/compat-checks.yaml b/.github/workflows/compat-checks.yaml new file mode 100644 index 00000000..b75a634d --- /dev/null +++ b/.github/workflows/compat-checks.yaml @@ -0,0 +1,20 @@ +name: ♾️ Compatibility Checks + +on: + pull_request: + types: [opened, synchronize] + branches: + - dev + +jobs: + compat-checks: + if: ${{ github.actor == 'dependabot[bot]' }} + runs-on: ubuntu-latest + permissions: + contents: write + steps: + - uses: actions/checkout@v6 + - uses: projectdiscovery/actions/setup/go/compat-checks@v1 + with: + go-version: "stable" + release-test: true diff --git a/.github/workflows/dep-auto-merge.yml b/.github/workflows/dep-auto-merge.yml deleted file mode 100644 index 84b26e1f..00000000 --- a/.github/workflows/dep-auto-merge.yml +++ /dev/null @@ -1,26 +0,0 @@ -name: 🤖 dep auto merge - -on: - pull_request: - branches: - - dev - workflow_dispatch: - -permissions: - pull-requests: write - issues: write - repository-projects: write - -jobs: - automerge: - runs-on: ubuntu-latest - if: github.actor == 'dependabot[bot]' - steps: - - uses: actions/checkout@v3 - with: - token: ${{ secrets.DEPENDABOT_PAT }} - - - uses: ahmadnassri/action-dependabot-auto-merge@v2 - with: - github-token: ${{ secrets.DEPENDABOT_PAT }} - target: all \ No newline at end of file diff --git a/.github/workflows/dockerhub-client.yml b/.github/workflows/dockerhub-client.yml index 9f64c110..7f7a3b2e 100644 --- a/.github/workflows/dockerhub-client.yml +++ b/.github/workflows/dockerhub-client.yml @@ -13,7 +13,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v6 - name: Get Github tag id: meta @@ -21,22 +21,22 @@ jobs: curl --silent "https://api.github.com/repos/projectdiscovery/interactsh/releases/latest" | jq -r .tag_name | xargs -I {} echo TAG={} >> $GITHUB_OUTPUT - name: Set up QEMU - uses: docker/setup-qemu-action@v2 + uses: docker/setup-qemu-action@v3 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 + uses: docker/setup-buildx-action@v3 - name: Login to DockerHub - uses: docker/login-action@v2 + uses: docker/login-action@v3 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_TOKEN }} - name: Build and push client - uses: docker/build-push-action@v4 + uses: docker/build-push-action@v6 with: context: . file: .github/docker/client/Dockerfile platforms: linux/amd64,linux/arm64,linux/arm push: true - tags: projectdiscovery/interactsh-client:latest,projectdiscovery/interactsh-client:${{ steps.meta.outputs.TAG }} \ No newline at end of file + tags: projectdiscovery/interactsh-client:latest,projectdiscovery/interactsh-client:${{ steps.meta.outputs.TAG }} diff --git a/.github/workflows/dockerhub-server.yml b/.github/workflows/dockerhub-server.yml index 338ad81b..cffc1199 100644 --- a/.github/workflows/dockerhub-server.yml +++ b/.github/workflows/dockerhub-server.yml @@ -13,7 +13,7 @@ jobs: steps: - name: Checkout - uses: actions/checkout@v3 + uses: actions/checkout@v6 - name: Get Github tag id: meta @@ -21,19 +21,19 @@ jobs: curl --silent "https://api.github.com/repos/projectdiscovery/interactsh/releases/latest" | jq -r .tag_name | xargs -I {} echo TAG={} >> $GITHUB_OUTPUT - name: Set up QEMU - uses: docker/setup-qemu-action@v2 + uses: docker/setup-qemu-action@v3 - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v2 + uses: docker/setup-buildx-action@v3 - name: Login to DockerHub - uses: docker/login-action@v2 + uses: docker/login-action@v3 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_TOKEN }} - name: Build and push server - uses: docker/build-push-action@v4 + uses: docker/build-push-action@v6 with: context: . file: .github/docker/server/Dockerfile diff --git a/.github/workflows/lint-test.yml b/.github/workflows/lint-test.yml index 379fd149..eca052b4 100644 --- a/.github/workflows/lint-test.yml +++ b/.github/workflows/lint-test.yml @@ -10,17 +10,12 @@ on: jobs: lint: name: Lint Test + if: ${{ !endsWith(github.actor, '[bot]') }} runs-on: ubuntu-latest steps: - name: Checkout code - uses: actions/checkout@v3 + uses: actions/checkout@v6 - name: Set up Go - uses: actions/setup-go@v4 - with: - go-version: 1.21.x + uses: projectdiscovery/actions/setup/go@v1 - name: Run golangci-lint - uses: golangci/golangci-lint-action@v3.7.0 - with: - version: latest - args: --timeout 5m - working-directory: . \ No newline at end of file + uses: projectdiscovery/actions/golangci-lint/v2@v1 diff --git a/.github/workflows/manual-deploy.yml b/.github/workflows/manual-deploy.yml index 876c441e..e33cee8b 100644 --- a/.github/workflows/manual-deploy.yml +++ b/.github/workflows/manual-deploy.yml @@ -14,10 +14,10 @@ jobs: environment: oast steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v6 - name: Setup Python - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: 3.9 diff --git a/.github/workflows/release-binary.yml b/.github/workflows/release-binary.yml index 9b418c83..05542786 100644 --- a/.github/workflows/release-binary.yml +++ b/.github/workflows/release-binary.yml @@ -10,23 +10,18 @@ jobs: release: runs-on: ubuntu-latest-16-cores steps: - - name: "Check out code" - uses: actions/checkout@v3 + - name: Check out code + uses: actions/checkout@v6 with: fetch-depth: 0 - - name: "Set up Go" - uses: actions/setup-go@v4 - with: - go-version: 1.21.x - - name: "Create release on GitHub" - uses: goreleaser/goreleaser-action@v4 - with: - args: "release --clean" - version: latest - workdir: . + - name: Set up Go + uses: projectdiscovery/actions/setup/go@v1 + + - name: Create release on GitHub + uses: projectdiscovery/actions/goreleaser@v1 env: GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}" SLACK_WEBHOOK: "${{ secrets.RELEASE_SLACK_WEBHOOK }}" DISCORD_WEBHOOK_ID: "${{ secrets.DISCORD_WEBHOOK_ID }}" - DISCORD_WEBHOOK_TOKEN: "${{ secrets.DISCORD_WEBHOOK_TOKEN }}" \ No newline at end of file + DISCORD_WEBHOOK_TOKEN: "${{ secrets.DISCORD_WEBHOOK_TOKEN }}" diff --git a/.github/workflows/release-test.yml b/.github/workflows/release-test.yml index 3cc29090..8b16e4c3 100644 --- a/.github/workflows/release-test.yml +++ b/.github/workflows/release-test.yml @@ -12,19 +12,13 @@ jobs: release-test: runs-on: ubuntu-latest-16-cores steps: - - name: "Check out code" - uses: actions/checkout@v3 + - name: Check out code + uses: actions/checkout@v6 with: fetch-depth: 0 - name: Set up Go - uses: actions/setup-go@v4 - with: - go-version: 1.21.x - - - name: release test - uses: goreleaser/goreleaser-action@v4 - with: - args: "release --clean --snapshot" - version: latest - workdir: . \ No newline at end of file + uses: projectdiscovery/actions/setup/go@v1 + + - name: Release test + uses: projectdiscovery/actions/goreleaser@v1 From dbe252b4d79eb5db04767e89fec046ab00161bd0 Mon Sep 17 00:00:00 2001 From: Mzack9999 Date: Wed, 25 Mar 2026 21:42:01 +0100 Subject: [PATCH 3/5] lint --- internal/runner/healthcheck.go | 20 ++++++++--------- pkg/server/ldap_server.go | 2 +- pkg/storage/roundtrip_test.go | 32 ++++++++++++++++++++------- pkg/storage/storagedb_test.go | 40 +++++++++++++++++++++++++--------- 4 files changed, 65 insertions(+), 29 deletions(-) diff --git a/internal/runner/healthcheck.go b/internal/runner/healthcheck.go index 59667cd4..9f1cc7ea 100644 --- a/internal/runner/healthcheck.go +++ b/internal/runner/healthcheck.go @@ -14,11 +14,11 @@ import ( func DoHealthCheck(cfgFilePath string) string { // RW permissions on config file var test strings.Builder - test.WriteString(fmt.Sprintf("Version: %s\n", options.Version)) - test.WriteString(fmt.Sprintf("Operative System: %s\n", runtime.GOOS)) - test.WriteString(fmt.Sprintf("Architecture: %s\n", runtime.GOARCH)) - test.WriteString(fmt.Sprintf("Go Version: %s\n", runtime.Version())) - test.WriteString(fmt.Sprintf("Compiler: %s\n", runtime.Compiler)) + fmt.Fprintf(&test, "Version: %s\n", options.Version) + fmt.Fprintf(&test, "Operative System: %s\n", runtime.GOOS) + fmt.Fprintf(&test, "Architecture: %s\n", runtime.GOARCH) + fmt.Fprintf(&test, "Go Version: %s\n", runtime.Version()) + fmt.Fprintf(&test, "Compiler: %s\n", runtime.Compiler) var testResult string ok, err := fileutil.IsReadable(cfgFilePath) @@ -30,7 +30,7 @@ func DoHealthCheck(cfgFilePath string) string { if err != nil { testResult += fmt.Sprintf(" (%s)", err) } - test.WriteString(fmt.Sprintf("Config file \"%s\" Read => %s\n", cfgFilePath, testResult)) + fmt.Fprintf(&test, "Config file \"%s\" Read => %s\n", cfgFilePath, testResult) ok, err = fileutil.IsWriteable(cfgFilePath) if ok { testResult = "Ok" @@ -40,7 +40,7 @@ func DoHealthCheck(cfgFilePath string) string { if err != nil { testResult += fmt.Sprintf(" (%s)", err) } - test.WriteString(fmt.Sprintf("Config file \"%s\" Write => %s\n", cfgFilePath, testResult)) + fmt.Fprintf(&test, "Config file \"%s\" Write => %s\n", cfgFilePath, testResult) c3, err := net.Dial("udp", "scanme.sh:53") if err == nil && c3 != nil { _ = c3.Close() @@ -49,7 +49,7 @@ func DoHealthCheck(cfgFilePath string) string { if err != nil { testResult = fmt.Sprintf("Ko (%s)", err) } - test.WriteString(fmt.Sprintf("UDP connectivity to scanme.sh:53 => %s\n", testResult)) + fmt.Fprintf(&test, "UDP connectivity to scanme.sh:53 => %s\n", testResult) c4, err := net.Dial("tcp4", "scanme.sh:80") if err == nil && c4 != nil { _ = c4.Close() @@ -58,7 +58,7 @@ func DoHealthCheck(cfgFilePath string) string { if err != nil { testResult = fmt.Sprintf("Ko (%s)", err) } - test.WriteString(fmt.Sprintf("IPv4 connectivity to scanme.sh:80 => %s\n", testResult)) + fmt.Fprintf(&test, "IPv4 connectivity to scanme.sh:80 => %s\n", testResult) c6, err := net.Dial("tcp6", "scanme.sh:80") if err == nil && c6 != nil { _ = c6.Close() @@ -67,7 +67,7 @@ func DoHealthCheck(cfgFilePath string) string { if err != nil { testResult = fmt.Sprintf("Ko (%s)", err) } - test.WriteString(fmt.Sprintf("IPv6 connectivity to scanme.sh:80 => %s\n", testResult)) + fmt.Fprintf(&test, "IPv6 connectivity to scanme.sh:80 => %s\n", testResult) return test.String() } diff --git a/pkg/server/ldap_server.go b/pkg/server/ldap_server.go index 35d430b5..72a98f17 100644 --- a/pkg/server/ldap_server.go +++ b/pkg/server/ldap_server.go @@ -398,7 +398,7 @@ func (ldapServer *LDAPServer) handleLog(host string, f string, v ...interface{}) data.WriteString(fmt.Sprintf(f, v...)) } else { for _, vv := range v { - data.WriteString(fmt.Sprint(vv)) + fmt.Fprint(&data, vv) } } diff --git a/pkg/storage/roundtrip_test.go b/pkg/storage/roundtrip_test.go index 557a155b..7324c4cb 100644 --- a/pkg/storage/roundtrip_test.go +++ b/pkg/storage/roundtrip_test.go @@ -95,7 +95,9 @@ func clientDecrypt(t *testing.T, priv *rsa.PrivateKey, aesKeyEncrypted string, c func TestFullRoundTripInMemory(t *testing.T) { mem, err := New(&Options{EvictionTTL: 1 * time.Hour}) require.NoError(t, err) - defer mem.Close() + defer func() { + _ = mem.Close() + }() priv, pubKeyB64 := generateRSAKeyPair(t) secret := uuid.New().String() @@ -144,11 +146,15 @@ func TestFullRoundTripInMemory(t *testing.T) { func TestFullRoundTripDisk(t *testing.T) { tmpDir, err := os.MkdirTemp("", "interactsh-test-*") require.NoError(t, err) - defer os.RemoveAll(tmpDir) + defer func() { + _ = os.RemoveAll(tmpDir) + }() db, err := New(&Options{EvictionTTL: 1 * time.Hour, DbPath: tmpDir}) require.NoError(t, err) - defer db.Close() + defer func() { + _ = db.Close() + }() priv, pubKeyB64 := generateRSAKeyPair(t) secret := uuid.New().String() @@ -205,7 +211,9 @@ func TestPollResponseRoundTrip(t *testing.T) { mem, err := New(&Options{EvictionTTL: 1 * time.Hour}) require.NoError(t, err) - defer mem.Close() + defer func() { + _ = mem.Close() + }() priv, pubKeyB64 := generateRSAKeyPair(t) secret := uuid.New().String() @@ -319,12 +327,16 @@ func TestJsoniterControlCharacterEscaping(t *testing.T) { func TestStaleDataCleanupOnReRegistration(t *testing.T) { tmpDir, err := os.MkdirTemp("", "interactsh-stale-*") require.NoError(t, err) - defer os.RemoveAll(tmpDir) + defer func() { + _ = os.RemoveAll(tmpDir) + }() // Use a very short eviction TTL so the cache entry gets evicted quickly db, err := New(&Options{EvictionTTL: 100 * time.Millisecond, DbPath: tmpDir}) require.NoError(t, err) - defer db.Close() + defer func() { + _ = db.Close() + }() secret := uuid.New().String() correlationID := xid.New().String() @@ -396,11 +408,15 @@ func TestStaleDataCleanupOnReRegistration(t *testing.T) { func TestCacheEvictionCleansLevelDB(t *testing.T) { tmpDir, err := os.MkdirTemp("", "interactsh-eviction-*") require.NoError(t, err) - defer os.RemoveAll(tmpDir) + defer func() { + _ = os.RemoveAll(tmpDir) + }() db, err := New(&Options{EvictionTTL: 100 * time.Millisecond, DbPath: tmpDir}) require.NoError(t, err) - defer db.Close() + defer func() { + _ = db.Close() + }() secret := uuid.New().String() correlationID := xid.New().String() diff --git a/pkg/storage/storagedb_test.go b/pkg/storage/storagedb_test.go index 0daffdd7..b36f121d 100644 --- a/pkg/storage/storagedb_test.go +++ b/pkg/storage/storagedb_test.go @@ -138,7 +138,9 @@ func TestGetInteractionsWithIdForConsumer(t *testing.T) { t.Run("two consumers independently receive all interactions", func(t *testing.T) { mem, err := New(&Options{EvictionTTL: 1 * time.Hour}) require.NoError(t, err) - defer mem.Close() + defer func() { + _ = mem.Close() + }() require.NoError(t, mem.SetID("shared")) require.NoError(t, mem.AddInteractionWithId("shared", []byte("interaction-1"))) @@ -156,7 +158,9 @@ func TestGetInteractionsWithIdForConsumer(t *testing.T) { t.Run("subsequent poll returns only unseen data", func(t *testing.T) { mem, err := New(&Options{EvictionTTL: 1 * time.Hour}) require.NoError(t, err) - defer mem.Close() + defer func() { + _ = mem.Close() + }() require.NoError(t, mem.SetID("shared")) require.NoError(t, mem.AddInteractionWithId("shared", []byte("msg-1"))) @@ -182,7 +186,9 @@ func TestGetInteractionsWithIdForConsumer(t *testing.T) { t.Run("empty poll returns nil", func(t *testing.T) { mem, err := New(&Options{EvictionTTL: 1 * time.Hour}) require.NoError(t, err) - defer mem.Close() + defer func() { + _ = mem.Close() + }() require.NoError(t, mem.SetID("shared")) @@ -194,7 +200,9 @@ func TestGetInteractionsWithIdForConsumer(t *testing.T) { t.Run("RemoveConsumer compacts data read by remaining consumers", func(t *testing.T) { mem, err := New(&Options{EvictionTTL: 1 * time.Hour}) require.NoError(t, err) - defer mem.Close() + defer func() { + _ = mem.Close() + }() require.NoError(t, mem.SetID("shared")) require.NoError(t, mem.AddInteractionWithId("shared", []byte("msg-1"))) @@ -221,7 +229,9 @@ func TestGetInteractionsWithIdForConsumer(t *testing.T) { t.Run("RemoveConsumer partial compaction", func(t *testing.T) { mem, err := New(&Options{EvictionTTL: 1 * time.Hour}) require.NoError(t, err) - defer mem.Close() + defer func() { + _ = mem.Close() + }() require.NoError(t, mem.SetID("shared")) for i := range 5 { @@ -254,7 +264,9 @@ func TestGetInteractionsWithIdForConsumer(t *testing.T) { // Use long cache TTL but short consumer staleness check mem, err := New(&Options{EvictionTTL: 1 * time.Hour}) require.NoError(t, err) - defer mem.Close() + defer func() { + _ = mem.Close() + }() require.NoError(t, mem.SetID("shared")) require.NoError(t, mem.AddInteractionWithId("shared", []byte("msg-1"))) @@ -287,7 +299,9 @@ func TestGetInteractionsWithIdForConsumer(t *testing.T) { bufferCap := 100 mem, err := New(&Options{EvictionTTL: 1 * time.Hour, MaxSharedInteractions: bufferCap}) require.NoError(t, err) - defer mem.Close() + defer func() { + _ = mem.Close() + }() require.NoError(t, mem.SetID("shared")) @@ -311,7 +325,9 @@ func TestGetInteractionsWithIdForConsumer(t *testing.T) { t.Run("RemoveConsumer last consumer discards all data", func(t *testing.T) { mem, err := New(&Options{EvictionTTL: 1 * time.Hour}) require.NoError(t, err) - defer mem.Close() + defer func() { + _ = mem.Close() + }() require.NoError(t, mem.SetID("shared")) require.NoError(t, mem.AddInteractionWithId("shared", []byte("msg-1"))) @@ -336,7 +352,9 @@ func TestSlidingEvictionStrategy(t *testing.T) { smallDelay := 10 * time.Millisecond mem, err := New(&Options{EvictionTTL: testTTL, EvictionStrategy: EvictionStrategySliding}) require.Nil(t, err) - defer mem.Close() + defer func() { + _ = mem.Close() + }() err = mem.SetID("test-sliding") require.Nil(t, err) @@ -361,7 +379,9 @@ func TestFixedEvictionStrategy(t *testing.T) { testTTL := 100 * time.Millisecond mem, err := New(&Options{EvictionTTL: testTTL, EvictionStrategy: EvictionStrategyFixed}) require.Nil(t, err) - defer mem.Close() + defer func() { + _ = mem.Close() + }() err = mem.SetID("test-fixed") require.Nil(t, err) From 3d2438cf8ec42b99d2cb1d42c8a3fb605dfe7d0b Mon Sep 17 00:00:00 2001 From: Mzack9999 Date: Wed, 25 Mar 2026 21:51:17 +0100 Subject: [PATCH 4/5] fix lint --- cmd/interactsh-server/main.go | 2 +- pkg/server/acme/cert_reloader_test.go | 14 ++++++++++---- pkg/server/ldap_server.go | 4 ++-- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/cmd/interactsh-server/main.go b/cmd/interactsh-server/main.go index 1f99a40a..e7344f55 100644 --- a/cmd/interactsh-server/main.go +++ b/cmd/interactsh-server/main.go @@ -177,7 +177,7 @@ func main() { addressesStr = append(addressesStr, address.String()) } if len(addressesStr) > 0 { - addressesBuilder.WriteString(fmt.Sprintf("%s: %s\n", networkInterface.Name, strings.Join(addressesStr, ","))) + _, _ = fmt.Fprintf(&addressesBuilder, "%s: %s\n", networkInterface.Name, strings.Join(addressesStr, ",")) } } gologger.Fatal().Msgf("%s\nNo bindable address could be found for port %d\nPlease ensure to have proper privileges and/or choose the correct ip:\n%s\n", err, cliOptions.DnsPort, addressesBuilder.String()) diff --git a/pkg/server/acme/cert_reloader_test.go b/pkg/server/acme/cert_reloader_test.go index 411272f9..3569a714 100644 --- a/pkg/server/acme/cert_reloader_test.go +++ b/pkg/server/acme/cert_reloader_test.go @@ -230,12 +230,16 @@ func TestCertReloaderTLSHandshake(t *testing.T) { if err != nil { t.Fatalf("net.Listen: %v", err) } - defer ln.Close() + defer func() { + _ = ln.Close() + }() tlsLn := tls.NewListener(ln, &tls.Config{ GetCertificate: reloader.GetCertificate, }) - defer tlsLn.Close() + defer func() { + _ = tlsLn.Close() + }() go func() { for { @@ -247,7 +251,7 @@ func TestCertReloaderTLSHandshake(t *testing.T) { go func(c net.Conn) { buf := make([]byte, 1) _, _ = c.Read(buf) - c.Close() + _ = c.Close() }(conn) } }() @@ -288,7 +292,9 @@ func tlsHandshakeCN(t *testing.T, addr string) string { if err != nil { t.Fatalf("tls.Dial: %v", err) } - defer conn.Close() + defer func() { + _ = conn.Close() + }() certs := conn.ConnectionState().PeerCertificates if len(certs) == 0 { diff --git a/pkg/server/ldap_server.go b/pkg/server/ldap_server.go index 72a98f17..1d9b252d 100644 --- a/pkg/server/ldap_server.go +++ b/pkg/server/ldap_server.go @@ -72,8 +72,8 @@ func (ldapServer *LDAPServer) handleBind(w ldap.ResponseWriter, m *ldap.Message) res := ldap.NewBindResponse(ldap.LDAPResultSuccess) var message strings.Builder message.WriteString("Type=Bind\n") - message.WriteString(fmt.Sprintf("AuthenticationChoice=%s\n", r.AuthenticationChoice())) - message.WriteString(fmt.Sprintf("User=%s\n", r.Name())) + _, _ = fmt.Fprintf(&message, "AuthenticationChoice=%s\n", r.AuthenticationChoice()) + _, _ = fmt.Fprintf(&message, "User=%s\n", r.Name()) message.WriteString(fmt.Sprintf("Pass=%s\n", r.Authentication())) w.Write(res) From 9f80109977a4ace02d37ddcbe0945db69790e85d Mon Sep 17 00:00:00 2001 From: Mzack9999 Date: Wed, 25 Mar 2026 21:54:06 +0100 Subject: [PATCH 5/5] fix lint --- pkg/server/ldap_server.go | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/pkg/server/ldap_server.go b/pkg/server/ldap_server.go index 1d9b252d..8e3bfdb4 100644 --- a/pkg/server/ldap_server.go +++ b/pkg/server/ldap_server.go @@ -74,7 +74,7 @@ func (ldapServer *LDAPServer) handleBind(w ldap.ResponseWriter, m *ldap.Message) message.WriteString("Type=Bind\n") _, _ = fmt.Fprintf(&message, "AuthenticationChoice=%s\n", r.AuthenticationChoice()) _, _ = fmt.Fprintf(&message, "User=%s\n", r.Name()) - message.WriteString(fmt.Sprintf("Pass=%s\n", r.Authentication())) + _, _ = fmt.Fprintf(&message, "Pass=%s\n", r.Authentication()) w.Write(res) if ldapServer.WithLogger { @@ -98,11 +98,11 @@ func (ldapServer *LDAPServer) handleSearch(w ldap.ResponseWriter, m *ldap.Messag var message strings.Builder message.WriteString("Type=Search\n") baseObject := r.BaseObject() - message.WriteString(fmt.Sprintf("BaseDn=%s\n", baseObject)) - message.WriteString(fmt.Sprintf("Filter=%s\n", r.Filter())) - message.WriteString(fmt.Sprintf("FilterString=%s\n", r.FilterString())) - message.WriteString(fmt.Sprintf("Attributes=%s\n", r.Attributes())) - message.WriteString(fmt.Sprintf("TimeLimit=%d\n", r.TimeLimit().Int())) + _, _ = fmt.Fprintf(&message, "BaseDn=%s\n", baseObject) + _, _ = fmt.Fprintf(&message, "Filter=%s\n", r.Filter()) + _, _ = fmt.Fprintf(&message, "FilterString=%s\n", r.FilterString()) + _, _ = fmt.Fprintf(&message, "Attributes=%s\n", r.Attributes()) + _, _ = fmt.Fprintf(&message, "TimeLimit=%d\n", r.TimeLimit().Int()) e := ldap.NewSearchResultEntry("cn=interactsh, " + string(baseObject)) e.AddAttribute("mail", "interact@s.h", "interact@s.h") @@ -190,7 +190,7 @@ func (ldapServer *LDAPServer) handleNotFound(w ldap.ResponseWriter, m *ldap.Mess atomic.AddUint64(&ldapServer.options.Stats.Ldap, 1) var message strings.Builder - message.WriteString(fmt.Sprintf("Type=%s\n", m.String())) + _, _ = fmt.Fprintf(&message, "Type=%s\n", m.String()) switch m.ProtocolOpType() { case ldap.ApplicationBindRequest: @@ -218,8 +218,8 @@ func (ldapServer *LDAPServer) handleCompare(w ldap.ResponseWriter, m *ldap.Messa r := m.GetCompareRequest() var message strings.Builder message.WriteString("Type=Compare\n") - message.WriteString(fmt.Sprintf("Attribute name to compare=%s\n", r.Ava().AttributeDesc())) - message.WriteString(fmt.Sprintf("Attribute value expected=%s\n", r.Ava().AssertionValue())) + _, _ = fmt.Fprintf(&message, "Attribute name to compare=%s\n", r.Ava().AttributeDesc()) + _, _ = fmt.Fprintf(&message, "Attribute value expected=%s\n", r.Ava().AssertionValue()) res := ldap.NewCompareResponse(ldap.LDAPResultCompareTrue) w.Write(res) @@ -239,10 +239,10 @@ func (ldapServer *LDAPServer) handleAdd(w ldap.ResponseWriter, m *ldap.Message) r := m.GetAddRequest() var message strings.Builder message.WriteString("Type=Add\n") - message.WriteString(fmt.Sprintf("Entity=%s\n", r.Entry())) + _, _ = fmt.Fprintf(&message, "Entity=%s\n", r.Entry()) for _, attribute := range r.Attributes() { for _, attributeValue := range attribute.Vals() { - message.WriteString(fmt.Sprintf("Attribute Name=%s Attribute Value=%s\n", attribute.Type_(), attributeValue)) + _, _ = fmt.Fprintf(&message, "Attribute Name=%s Attribute Value=%s\n", attribute.Type_(), attributeValue) } } @@ -264,7 +264,7 @@ func (ldapServer *LDAPServer) handleDelete(w ldap.ResponseWriter, m *ldap.Messag r := m.GetDeleteRequest() var message strings.Builder message.WriteString("Type=Delete\n") - message.WriteString(fmt.Sprintf("Entity=%s\n", r)) + _, _ = fmt.Fprintf(&message, "Entity=%s\n", r) res := ldap.NewDeleteResponse(ldap.LDAPResultSuccess) w.Write(res) @@ -284,7 +284,7 @@ func (ldapServer *LDAPServer) handleModify(w ldap.ResponseWriter, m *ldap.Messag r := m.GetModifyRequest() var message strings.Builder message.WriteString("Type=Modify\n") - message.WriteString(fmt.Sprintf("Entity=%s\n", r.Object())) + _, _ = fmt.Fprintf(&message, "Entity=%s\n", r.Object()) for _, change := range r.Changes() { modification := change.Modification() @@ -302,7 +302,7 @@ func (ldapServer *LDAPServer) handleModify(w ldap.ResponseWriter, m *ldap.Messag for _, attributeValue := range modification.Vals() { vals = append(vals, fmt.Sprint(attributeValue)) } - message.WriteString(fmt.Sprintf("Operation=%s Attribute=%s Values=[%s]\n", operationString, modification.Type_(), strings.Join(vals, " - "))) + _, _ = fmt.Fprintf(&message, "Operation=%s Attribute=%s Values=[%s]\n", operationString, modification.Type_(), strings.Join(vals, " - ")) } res := ldap.NewModifyResponse(ldap.LDAPResultSuccess) @@ -330,7 +330,7 @@ func (ldapServer *LDAPServer) handleStartTLS(w ldap.ResponseWriter, m *ldap.Mess w.Write(res) if err := tlsConn.Handshake(); err != nil { - message.WriteString(fmt.Sprintf("Result=StartTLS Handshake error %s\n", err.Error())) + _, _ = fmt.Fprintf(&message, "Result=StartTLS Handshake error %s\n", err.Error()) res.SetDiagnosticMessage(fmt.Sprintf("StartTLS Handshake error : \"%s\"", err.Error())) res.SetResultCode(ldap.LDAPResultOperationsError) w.Write(res) @@ -373,8 +373,8 @@ func (ldapServer *LDAPServer) handleExtended(w ldap.ResponseWriter, m *ldap.Mess var message strings.Builder message.WriteString("Type=Extended\n") - message.WriteString(fmt.Sprintf("Name=%s\n", r.RequestName())) - message.WriteString(fmt.Sprintf("Value=%s\n", r.RequestValue())) + _, _ = fmt.Fprintf(&message, "Name=%s\n", r.RequestName()) + _, _ = fmt.Fprintf(&message, "Value=%s\n", r.RequestValue()) res := ldap.NewExtendedResponse(ldap.LDAPResultSuccess) w.Write(res) @@ -395,7 +395,7 @@ func (ldapServer *LDAPServer) handleLog(host string, f string, v ...interface{}) var data strings.Builder if f != "" { - data.WriteString(fmt.Sprintf(f, v...)) + _, _ = fmt.Fprintf(&data, f, v...) } else { for _, vv := range v { fmt.Fprint(&data, vv)