2026-07-03 18:19:31 +05:30
|
|
|
package interceptors
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"encoding/json"
|
|
|
|
|
"net/http"
|
|
|
|
|
"net/http/httptest"
|
|
|
|
|
"testing"
|
|
|
|
|
"time"
|
|
|
|
|
|
2026-07-10 17:42:26 +05:30
|
|
|
packagev1 "buf.build/gen/go/safedep/api/protocolbuffers/go/safedep/messages/package/v1"
|
2026-07-03 18:19:31 +05:30
|
|
|
"github.com/safedep/pmg/proxy"
|
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
|
|
|
"github.com/stretchr/testify/require"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
func TestGoCooldownCheckZipDownloadSideFetch(t *testing.T) {
|
|
|
|
|
publishTime := time.Now().Add(-24 * time.Hour)
|
|
|
|
|
|
|
|
|
|
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) {
|
|
|
|
|
switch req.URL.Path {
|
|
|
|
|
case "/example.com/fresh/@v/v1.1.0.info":
|
|
|
|
|
w.Header().Set("Content-Type", "application/json")
|
|
|
|
|
err := json.NewEncoder(w).Encode(map[string]string{
|
|
|
|
|
"Version": "v1.1.0",
|
|
|
|
|
"Time": publishTime.UTC().Format(time.RFC3339),
|
|
|
|
|
})
|
|
|
|
|
require.NoError(t, err)
|
|
|
|
|
default:
|
|
|
|
|
http.NotFound(w, req)
|
|
|
|
|
}
|
|
|
|
|
}))
|
|
|
|
|
defer server.Close()
|
|
|
|
|
|
|
|
|
|
ctx := &proxy.RequestContext{RequestID: "test"}
|
|
|
|
|
|
|
|
|
|
t.Run("blocks using out-of-band publish time on cache miss", func(t *testing.T) {
|
|
|
|
|
h := newGoCooldownHandler(NewAnalysisStatsCollector())
|
|
|
|
|
|
|
|
|
|
resp, handled := h.CheckZipDownload(ctx, server.URL, "example.com/fresh", "v1.1.0", 7)
|
|
|
|
|
require.True(t, handled)
|
|
|
|
|
assert.Equal(t, proxy.ActionBlock, resp.Action)
|
|
|
|
|
assert.Equal(t, http.StatusForbidden, resp.BlockCode)
|
2026-07-10 17:42:26 +05:30
|
|
|
assert.Equal(t, proxy.BlockReasonDependencyCooldown, resp.BlockReason)
|
|
|
|
|
|
|
|
|
|
require.NotNil(t, resp.BlockContext)
|
|
|
|
|
assert.Equal(t, packagev1.Ecosystem_ECOSYSTEM_GO, resp.BlockContext.Ecosystem)
|
|
|
|
|
assert.Equal(t, "example.com/fresh", resp.BlockContext.PackageName)
|
|
|
|
|
assert.Equal(t, "v1.1.0", resp.BlockContext.PackageVersion)
|
|
|
|
|
assert.Equal(t, 7, resp.BlockContext.CooldownDays)
|
|
|
|
|
assert.Equal(t, 1, resp.BlockContext.CooldownDaysAgo)
|
|
|
|
|
assert.Equal(t, 6, resp.BlockContext.CooldownDaysLeft)
|
2026-07-03 18:19:31 +05:30
|
|
|
})
|
|
|
|
|
|
|
|
|
|
t.Run("fails open when the out-of-band fetch fails", func(t *testing.T) {
|
|
|
|
|
h := newGoCooldownHandler(NewAnalysisStatsCollector())
|
|
|
|
|
|
|
|
|
|
_, handled := h.CheckZipDownload(ctx, server.URL, "example.com/unknown", "v9.9.9", 7)
|
|
|
|
|
assert.False(t, handled)
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
t.Run("fails open without a base URL", func(t *testing.T) {
|
|
|
|
|
h := newGoCooldownHandler(NewAnalysisStatsCollector())
|
|
|
|
|
|
|
|
|
|
_, handled := h.CheckZipDownload(ctx, "", "example.com/fresh", "v1.1.0", 7)
|
|
|
|
|
assert.False(t, handled)
|
|
|
|
|
})
|
|
|
|
|
}
|