package service import ( "io" "net/http" "net/http/httptest" "testing" "github.com/QuantumNous/new-api/common" "github.com/QuantumNous/new-api/dto" "github.com/QuantumNous/new-api/setting/system_setting" "github.com/stretchr/testify/require" ) func TestGenerateSignatureIsStableAndSecretBound(t *testing.T) { payload := []byte(`{"event":"quota_exceed"}`) require.Equal(t, "e8c1ac446d1fab782a3587e16b8dae9b42afd915f6c56a25702806f35db4ecaf", generateSignature("webhook-secret", payload)) require.NotEqual(t, generateSignature("other-secret", payload), generateSignature("webhook-secret", payload)) require.NotEqual(t, generateSignature("webhook-secret", []byte(`{"event":"other"}`)), generateSignature("webhook-secret", payload)) } func TestSendWebhookNotifyReplacesValuePlaceholdersBeforeSigningAndSending(t *testing.T) { var received WebhookPayload var signature string server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { body, err := io.ReadAll(r.Body) require.NoError(t, err) require.NoError(t, common.Unmarshal(body, &received)) signature = r.Header.Get("X-Webhook-Signature") w.WriteHeader(http.StatusNoContent) })) defer server.Close() oldClient := httpClient httpClient = server.Client() t.Cleanup(func() { httpClient = oldClient }) setting := system_setting.GetFetchSetting() oldSetting := *setting *setting = system_setting.FetchSetting{EnableSSRFProtection: false} t.Cleanup(func() { *setting = oldSetting }) err := SendWebhookNotify(server.URL, "secret", dto.NewNotify("quota", "Quota", "remaining: {{value}}, used: {{value}}", []interface{}{12, 3})) require.NoError(t, err) require.Equal(t, "remaining: 12, used: 3", received.Content) require.NotEmpty(t, signature) }