Skip to content

Commit 5634d96

Browse files
Copilotbzimmer
andauthored
fix: correct webhook validation logic, unsafe type assertion, and non-idiomatic loops
Agent-Logs-Url: https://github.com/bzimmer/activity/sessions/d5f3dece-c858-4a4b-99da-c3fe36d74b01 Co-authored-by: bzimmer <12852+bzimmer@users.noreply.github.com>
1 parent 1b41a82 commit 5634d96

5 files changed

Lines changed: 47 additions & 17 deletions

File tree

cyclinganalytics/rides.go

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@ import (
66
"errors"
77
"fmt"
88
"io"
9-
"math"
109
"mime/multipart"
1110
"net/http"
1211
"net/url"
@@ -57,8 +56,7 @@ func WithRideOptions(r RideOptions) APIOption {
5756
func (s *RidesService) Ride(ctx context.Context, rideID int64, opts ...APIOption) (*Ride, error) {
5857
uri := fmt.Sprintf("ride/%d", rideID)
5958
v := url.Values{}
60-
for i := range opts {
61-
f := opts[i]
59+
for _, f := range opts {
6260
if f != nil {
6361
if err := f(v); err != nil {
6462
return nil, err
@@ -95,9 +93,8 @@ func (s *RidesService) Rides(ctx context.Context, userID UserID, spec activity.P
9593
if err != nil {
9694
return nil, err
9795
}
98-
if spec.Total > 0 {
99-
n := math.Min(float64(len(res.Rides)), float64(spec.Total))
100-
res.Rides = res.Rides[:int(n)]
96+
if spec.Total > 0 && len(res.Rides) > spec.Total {
97+
res.Rides = res.Rides[:spec.Total]
10198
}
10299
return res.Rides, nil
103100
}
@@ -179,10 +176,9 @@ func (s *RidesService) StreamSets() map[string]string {
179176

180177
func validateStreams(streams []string) error {
181178
x := streamsets()
182-
for i := range streams {
183-
_, ok := x[streams[i]]
184-
if !ok {
185-
return fmt.Errorf("invalid stream '%s'", streams[i])
179+
for _, stream := range streams {
180+
if _, ok := x[stream]; !ok {
181+
return fmt.Errorf("invalid stream '%s'", stream)
186182
}
187183
}
188184
return nil

strava/activity.go

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -267,10 +267,9 @@ func (s *ActivityService) StreamSets() map[string]string {
267267

268268
func (s *ActivityService) validateStreams(streams []string) error {
269269
x := streamsets()
270-
for i := range streams {
271-
_, ok := x[streams[i]]
272-
if !ok {
273-
return fmt.Errorf("invalid stream '%s'", streams[i])
270+
for _, stream := range streams {
271+
if _, ok := x[stream]; !ok {
272+
return fmt.Errorf("invalid stream '%s'", stream)
274273
}
275274
}
276275
return nil

strava/strava_with.go

Lines changed: 2 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

strava/webhook.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,12 +98,12 @@ func webhookSubscriptionHandler(subscriber WebhookSubscriber) http.HandlerFunc {
9898
return func(w http.ResponseWriter, r *http.Request) {
9999
q := r.URL.Query()
100100
verify, ok := q["hub.verify_token"]
101-
if !ok && len(verify) == 1 {
101+
if !ok || len(verify) != 1 {
102102
w.WriteHeader(http.StatusInternalServerError)
103103
return
104104
}
105105
challenge, ok := q["hub.challenge"]
106-
if !ok && len(challenge) == 1 {
106+
if !ok || len(challenge) != 1 {
107107
w.WriteHeader(http.StatusInternalServerError)
108108
return
109109
}
@@ -112,6 +112,7 @@ func webhookSubscriptionHandler(subscriber WebhookSubscriber) http.HandlerFunc {
112112
err := subscriber.SubscriptionRequest(challenge[0], verify[0])
113113
if err != nil {
114114
w.WriteHeader(http.StatusInternalServerError)
115+
return
115116
}
116117
}
117118
w.Header().Set("Content-Type", "application/json")

strava/webhook_test.go

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,3 +232,36 @@ func TestWebhookSubscriptionHandler(t *testing.T) {
232232

233233
a.Equal(500, w.Code)
234234
}
235+
236+
func TestWebhookSubscriptionHandlerMissingParams(t *testing.T) {
237+
t.Parallel()
238+
a := assert.New(t)
239+
240+
tests := []struct {
241+
name string
242+
url string
243+
}{
244+
{
245+
name: "missing verify_token",
246+
url: "/webhook?hub.challenge=baz",
247+
},
248+
{
249+
name: "missing challenge",
250+
url: "/webhook?hub.verify_token=bar",
251+
},
252+
{
253+
name: "missing both params",
254+
url: "/webhook",
255+
},
256+
}
257+
for _, tt := range tests {
258+
t.Run(tt.name, func(t *testing.T) {
259+
t.Parallel()
260+
_, router := setupTestRouter()
261+
w := httptest.NewRecorder()
262+
req, _ := http.NewRequestWithContext(context.TODO(), http.MethodGet, tt.url, nil)
263+
router.ServeHTTP(w, req)
264+
a.Equal(500, w.Code)
265+
})
266+
}
267+
}

0 commit comments

Comments
 (0)