@@ -15,6 +15,7 @@ import (
1515 "code.gitea.io/gitea/modules/setting"
1616 api "code.gitea.io/gitea/modules/structs"
1717 "code.gitea.io/gitea/modules/util"
18+ "code.gitea.io/gitea/modules/validation"
1819 webhook_module "code.gitea.io/gitea/modules/webhook"
1920 "code.gitea.io/gitea/services/context"
2021 webhook_service "code.gitea.io/gitea/services/webhook"
@@ -92,6 +93,10 @@ func checkCreateHookOption(ctx *context.APIContext, form *api.CreateHookOption)
9293 ctx .APIError (http .StatusUnprocessableEntity , "Invalid content type" )
9394 return false
9495 }
96+ if ! validation .IsValidURL (form .Config ["url" ]) {
97+ ctx .APIError (http .StatusUnprocessableEntity , "Invalid url" )
98+ return false
99+ }
95100 return true
96101}
97102
@@ -154,6 +159,41 @@ func pullHook(events []string, event string) bool {
154159 return util .SliceContainsString (events , event , true ) || util .SliceContainsString (events , string (webhook_module .HookEventPullRequest ), true )
155160}
156161
162+ func updateHookEvents (events []string ) webhook_module.HookEvents {
163+ if len (events ) == 0 {
164+ events = []string {"push" }
165+ }
166+ hookEvents := make (webhook_module.HookEvents )
167+ hookEvents [webhook_module .HookEventCreate ] = util .SliceContainsString (events , string (webhook_module .HookEventCreate ), true )
168+ hookEvents [webhook_module .HookEventPush ] = util .SliceContainsString (events , string (webhook_module .HookEventPush ), true )
169+ hookEvents [webhook_module .HookEventDelete ] = util .SliceContainsString (events , string (webhook_module .HookEventDelete ), true )
170+ hookEvents [webhook_module .HookEventFork ] = util .SliceContainsString (events , string (webhook_module .HookEventFork ), true )
171+ hookEvents [webhook_module .HookEventRepository ] = util .SliceContainsString (events , string (webhook_module .HookEventRepository ), true )
172+ hookEvents [webhook_module .HookEventWiki ] = util .SliceContainsString (events , string (webhook_module .HookEventWiki ), true )
173+ hookEvents [webhook_module .HookEventRelease ] = util .SliceContainsString (events , string (webhook_module .HookEventRelease ), true )
174+ hookEvents [webhook_module .HookEventPackage ] = util .SliceContainsString (events , string (webhook_module .HookEventPackage ), true )
175+ hookEvents [webhook_module .HookEventStatus ] = util .SliceContainsString (events , string (webhook_module .HookEventStatus ), true )
176+ hookEvents [webhook_module .HookEventWorkflowJob ] = util .SliceContainsString (events , string (webhook_module .HookEventWorkflowJob ), true )
177+
178+ // Issues
179+ hookEvents [webhook_module .HookEventIssues ] = issuesHook (events , "issues_only" )
180+ hookEvents [webhook_module .HookEventIssueAssign ] = issuesHook (events , string (webhook_module .HookEventIssueAssign ))
181+ hookEvents [webhook_module .HookEventIssueLabel ] = issuesHook (events , string (webhook_module .HookEventIssueLabel ))
182+ hookEvents [webhook_module .HookEventIssueMilestone ] = issuesHook (events , string (webhook_module .HookEventIssueMilestone ))
183+ hookEvents [webhook_module .HookEventIssueComment ] = issuesHook (events , string (webhook_module .HookEventIssueComment ))
184+
185+ // Pull requests
186+ hookEvents [webhook_module .HookEventPullRequest ] = pullHook (events , "pull_request_only" )
187+ hookEvents [webhook_module .HookEventPullRequestAssign ] = pullHook (events , string (webhook_module .HookEventPullRequestAssign ))
188+ hookEvents [webhook_module .HookEventPullRequestLabel ] = pullHook (events , string (webhook_module .HookEventPullRequestLabel ))
189+ hookEvents [webhook_module .HookEventPullRequestMilestone ] = pullHook (events , string (webhook_module .HookEventPullRequestMilestone ))
190+ hookEvents [webhook_module .HookEventPullRequestComment ] = pullHook (events , string (webhook_module .HookEventPullRequestComment ))
191+ hookEvents [webhook_module .HookEventPullRequestReview ] = pullHook (events , "pull_request_review" )
192+ hookEvents [webhook_module .HookEventPullRequestReviewRequest ] = pullHook (events , string (webhook_module .HookEventPullRequestReviewRequest ))
193+ hookEvents [webhook_module .HookEventPullRequestSync ] = pullHook (events , string (webhook_module .HookEventPullRequestSync ))
194+ return hookEvents
195+ }
196+
157197// addHook add the hook specified by `form`, `ownerID` and `repoID`. If there is
158198// an error, write to `ctx` accordingly. Return (webhook, ok)
159199func addHook (ctx * context.APIContext , form * api.CreateHookOption , ownerID , repoID int64 ) (* webhook.Webhook , bool ) {
@@ -162,9 +202,6 @@ func addHook(ctx *context.APIContext, form *api.CreateHookOption, ownerID, repoI
162202 return nil , false
163203 }
164204
165- if len (form .Events ) == 0 {
166- form .Events = []string {"push" }
167- }
168205 if form .Config ["is_system_webhook" ] != "" {
169206 sw , err := strconv .ParseBool (form .Config ["is_system_webhook" ])
170207 if err != nil {
@@ -183,31 +220,7 @@ func addHook(ctx *context.APIContext, form *api.CreateHookOption, ownerID, repoI
183220 IsSystemWebhook : isSystemWebhook ,
184221 HookEvent : & webhook_module.HookEvent {
185222 ChooseEvents : true ,
186- HookEvents : webhook_module.HookEvents {
187- webhook_module .HookEventCreate : util .SliceContainsString (form .Events , string (webhook_module .HookEventCreate ), true ),
188- webhook_module .HookEventDelete : util .SliceContainsString (form .Events , string (webhook_module .HookEventDelete ), true ),
189- webhook_module .HookEventFork : util .SliceContainsString (form .Events , string (webhook_module .HookEventFork ), true ),
190- webhook_module .HookEventIssues : issuesHook (form .Events , "issues_only" ),
191- webhook_module .HookEventIssueAssign : issuesHook (form .Events , string (webhook_module .HookEventIssueAssign )),
192- webhook_module .HookEventIssueLabel : issuesHook (form .Events , string (webhook_module .HookEventIssueLabel )),
193- webhook_module .HookEventIssueMilestone : issuesHook (form .Events , string (webhook_module .HookEventIssueMilestone )),
194- webhook_module .HookEventIssueComment : issuesHook (form .Events , string (webhook_module .HookEventIssueComment )),
195- webhook_module .HookEventPush : util .SliceContainsString (form .Events , string (webhook_module .HookEventPush ), true ),
196- webhook_module .HookEventPullRequest : pullHook (form .Events , "pull_request_only" ),
197- webhook_module .HookEventPullRequestAssign : pullHook (form .Events , string (webhook_module .HookEventPullRequestAssign )),
198- webhook_module .HookEventPullRequestLabel : pullHook (form .Events , string (webhook_module .HookEventPullRequestLabel )),
199- webhook_module .HookEventPullRequestMilestone : pullHook (form .Events , string (webhook_module .HookEventPullRequestMilestone )),
200- webhook_module .HookEventPullRequestComment : pullHook (form .Events , string (webhook_module .HookEventPullRequestComment )),
201- webhook_module .HookEventPullRequestReview : pullHook (form .Events , "pull_request_review" ),
202- webhook_module .HookEventPullRequestReviewRequest : pullHook (form .Events , string (webhook_module .HookEventPullRequestReviewRequest )),
203- webhook_module .HookEventPullRequestSync : pullHook (form .Events , string (webhook_module .HookEventPullRequestSync )),
204- webhook_module .HookEventWiki : util .SliceContainsString (form .Events , string (webhook_module .HookEventWiki ), true ),
205- webhook_module .HookEventRepository : util .SliceContainsString (form .Events , string (webhook_module .HookEventRepository ), true ),
206- webhook_module .HookEventRelease : util .SliceContainsString (form .Events , string (webhook_module .HookEventRelease ), true ),
207- webhook_module .HookEventPackage : util .SliceContainsString (form .Events , string (webhook_module .HookEventPackage ), true ),
208- webhook_module .HookEventStatus : util .SliceContainsString (form .Events , string (webhook_module .HookEventStatus ), true ),
209- webhook_module .HookEventWorkflowJob : util .SliceContainsString (form .Events , string (webhook_module .HookEventWorkflowJob ), true ),
210- },
223+ HookEvents : updateHookEvents (form .Events ),
211224 BranchFilter : form .BranchFilter ,
212225 },
213226 IsActive : form .Active ,
@@ -324,6 +337,10 @@ func EditRepoHook(ctx *context.APIContext, form *api.EditHookOption, hookID int6
324337func editHook (ctx * context.APIContext , form * api.EditHookOption , w * webhook.Webhook ) bool {
325338 if form .Config != nil {
326339 if url , ok := form .Config ["url" ]; ok {
340+ if ! validation .IsValidURL (url ) {
341+ ctx .APIError (http .StatusUnprocessableEntity , "Invalid url" )
342+ return false
343+ }
327344 w .URL = url
328345 }
329346 if ct , ok := form .Config ["content_type" ]; ok {
@@ -352,19 +369,10 @@ func editHook(ctx *context.APIContext, form *api.EditHookOption, w *webhook.Webh
352369 }
353370
354371 // Update events
355- if len (form .Events ) == 0 {
356- form .Events = []string {"push" }
357- }
372+ w .HookEvents = updateHookEvents (form .Events )
358373 w .PushOnly = false
359374 w .SendEverything = false
360375 w .ChooseEvents = true
361- w .HookEvents [webhook_module .HookEventCreate ] = util .SliceContainsString (form .Events , string (webhook_module .HookEventCreate ), true )
362- w .HookEvents [webhook_module .HookEventPush ] = util .SliceContainsString (form .Events , string (webhook_module .HookEventPush ), true )
363- w .HookEvents [webhook_module .HookEventDelete ] = util .SliceContainsString (form .Events , string (webhook_module .HookEventDelete ), true )
364- w .HookEvents [webhook_module .HookEventFork ] = util .SliceContainsString (form .Events , string (webhook_module .HookEventFork ), true )
365- w .HookEvents [webhook_module .HookEventRepository ] = util .SliceContainsString (form .Events , string (webhook_module .HookEventRepository ), true )
366- w .HookEvents [webhook_module .HookEventWiki ] = util .SliceContainsString (form .Events , string (webhook_module .HookEventWiki ), true )
367- w .HookEvents [webhook_module .HookEventRelease ] = util .SliceContainsString (form .Events , string (webhook_module .HookEventRelease ), true )
368376 w .BranchFilter = form .BranchFilter
369377
370378 err := w .SetHeaderAuthorization (form .AuthorizationHeader )
@@ -373,23 +381,6 @@ func editHook(ctx *context.APIContext, form *api.EditHookOption, w *webhook.Webh
373381 return false
374382 }
375383
376- // Issues
377- w .HookEvents [webhook_module .HookEventIssues ] = issuesHook (form .Events , "issues_only" )
378- w .HookEvents [webhook_module .HookEventIssueAssign ] = issuesHook (form .Events , string (webhook_module .HookEventIssueAssign ))
379- w .HookEvents [webhook_module .HookEventIssueLabel ] = issuesHook (form .Events , string (webhook_module .HookEventIssueLabel ))
380- w .HookEvents [webhook_module .HookEventIssueMilestone ] = issuesHook (form .Events , string (webhook_module .HookEventIssueMilestone ))
381- w .HookEvents [webhook_module .HookEventIssueComment ] = issuesHook (form .Events , string (webhook_module .HookEventIssueComment ))
382-
383- // Pull requests
384- w .HookEvents [webhook_module .HookEventPullRequest ] = pullHook (form .Events , "pull_request_only" )
385- w .HookEvents [webhook_module .HookEventPullRequestAssign ] = pullHook (form .Events , string (webhook_module .HookEventPullRequestAssign ))
386- w .HookEvents [webhook_module .HookEventPullRequestLabel ] = pullHook (form .Events , string (webhook_module .HookEventPullRequestLabel ))
387- w .HookEvents [webhook_module .HookEventPullRequestMilestone ] = pullHook (form .Events , string (webhook_module .HookEventPullRequestMilestone ))
388- w .HookEvents [webhook_module .HookEventPullRequestComment ] = pullHook (form .Events , string (webhook_module .HookEventPullRequestComment ))
389- w .HookEvents [webhook_module .HookEventPullRequestReview ] = pullHook (form .Events , "pull_request_review" )
390- w .HookEvents [webhook_module .HookEventPullRequestReviewRequest ] = pullHook (form .Events , string (webhook_module .HookEventPullRequestReviewRequest ))
391- w .HookEvents [webhook_module .HookEventPullRequestSync ] = pullHook (form .Events , string (webhook_module .HookEventPullRequestSync ))
392-
393384 if err := w .UpdateEvent (); err != nil {
394385 ctx .APIErrorInternal (err )
395386 return false
0 commit comments