Skip to content

Commit 0cbde01

Browse files
committed
fix(cel): add nil checks to prevent panics in webhook parsers
Add comprehensive nil pointer checks in PopulateEvent methods for webhook parsers to prevent panics when accessing nested fields that may be nil or missing from webhook payloads. Jira: https://issues.redhat.com/browse/SRVKP-9396 Signed-off-by: Akshay Pant <[email protected]>
1 parent 9572f3b commit 0cbde01

File tree

2 files changed

+547
-52
lines changed

2 files changed

+547
-52
lines changed

pkg/cmd/tknpac/cel/parser.go

Lines changed: 99 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -150,8 +150,10 @@ func (p *GitHubParser) PopulateEvent(event *info.Event, parsedEvent any) error {
150150
event.DefaultBranch = gitEvent.GetRepo().GetDefaultBranch()
151151
event.PullRequestNumber = gitEvent.GetPullRequest().GetNumber()
152152
event.TriggerTarget = triggertype.PullRequest
153-
for _, label := range gitEvent.GetPullRequest().Labels {
154-
event.PullRequestLabel = append(event.PullRequestLabel, label.GetName())
153+
if gitEvent.GetPullRequest() != nil {
154+
for _, label := range gitEvent.GetPullRequest().Labels {
155+
event.PullRequestLabel = append(event.PullRequestLabel, label.GetName())
156+
}
155157
}
156158
case *github.PushEvent:
157159
event.Organization = gitEvent.GetRepo().GetOwner().GetLogin()
@@ -242,8 +244,11 @@ func (p *GitLabParser) PopulateEvent(event *info.Event, parsedEvent any) error {
242244
case *gitlab.MergeEvent:
243245
event.Organization = extractOrgFromPath(gitEvent.Project.PathWithNamespace)
244246
event.Repository = extractRepoFromPath(gitEvent.Project.PathWithNamespace)
245-
event.Sender = gitEvent.User.Username
246247
event.URL = gitEvent.Project.WebURL
248+
event.DefaultBranch = gitEvent.Project.DefaultBranch
249+
if gitEvent.User != nil {
250+
event.Sender = gitEvent.User.Username
251+
}
247252
event.SHA = gitEvent.ObjectAttributes.LastCommit.ID
248253
event.SHAURL = gitEvent.ObjectAttributes.LastCommit.URL
249254
event.SHATitle = gitEvent.ObjectAttributes.LastCommit.Title
@@ -257,7 +262,6 @@ func (p *GitLabParser) PopulateEvent(event *info.Event, parsedEvent any) error {
257262
}
258263
event.PullRequestNumber = gitEvent.ObjectAttributes.IID
259264
event.PullRequestTitle = gitEvent.ObjectAttributes.Title
260-
event.DefaultBranch = gitEvent.Project.DefaultBranch
261265
event.TriggerTarget = triggertype.PullRequest
262266
if gitEvent.ObjectAttributes.Action == "close" {
263267
event.TriggerTarget = triggertype.PullRequestClosed
@@ -272,34 +276,38 @@ func (p *GitLabParser) PopulateEvent(event *info.Event, parsedEvent any) error {
272276
lastCommitIdx := len(gitEvent.Commits) - 1
273277
event.Organization = extractOrgFromPath(gitEvent.Project.PathWithNamespace)
274278
event.Repository = extractRepoFromPath(gitEvent.Project.PathWithNamespace)
275-
event.Sender = gitEvent.UserUsername
276279
event.URL = gitEvent.Project.WebURL
277-
event.SHA = gitEvent.Commits[lastCommitIdx].ID
278-
event.SHAURL = gitEvent.Commits[lastCommitIdx].URL
279-
event.SHATitle = gitEvent.Commits[lastCommitIdx].Title
280-
event.HeadBranch = gitEvent.Ref
281-
event.BaseBranch = gitEvent.Ref
282280
event.HeadURL = gitEvent.Project.WebURL
283281
event.BaseURL = gitEvent.Project.WebURL
284282
event.DefaultBranch = gitEvent.Project.DefaultBranch
283+
event.Sender = gitEvent.UserUsername
284+
if gitEvent.Commits[lastCommitIdx] != nil {
285+
event.SHA = gitEvent.Commits[lastCommitIdx].ID
286+
event.SHAURL = gitEvent.Commits[lastCommitIdx].URL
287+
event.SHATitle = gitEvent.Commits[lastCommitIdx].Title
288+
}
289+
event.HeadBranch = gitEvent.Ref
290+
event.BaseBranch = gitEvent.Ref
285291
event.TriggerTarget = triggertype.Push
286292
case *gitlab.TagEvent:
287293
if len(gitEvent.Commits) == 0 {
288294
return fmt.Errorf("no commits attached to this tag event")
289295
}
290296
lastCommitIdx := len(gitEvent.Commits) - 1
297+
event.Sender = gitEvent.UserUsername
291298
event.Organization = extractOrgFromPath(gitEvent.Project.PathWithNamespace)
292299
event.Repository = extractRepoFromPath(gitEvent.Project.PathWithNamespace)
293-
event.Sender = gitEvent.UserUsername
300+
event.DefaultBranch = gitEvent.Project.DefaultBranch
294301
event.URL = gitEvent.Project.WebURL
295-
event.SHA = gitEvent.Commits[lastCommitIdx].ID
296-
event.SHAURL = gitEvent.Commits[lastCommitIdx].URL
297-
event.SHATitle = gitEvent.Commits[lastCommitIdx].Title
298-
event.HeadBranch = gitEvent.Ref
299-
event.BaseBranch = gitEvent.Ref
300302
event.HeadURL = gitEvent.Project.WebURL
301303
event.BaseURL = gitEvent.Project.WebURL
302-
event.DefaultBranch = gitEvent.Project.DefaultBranch
304+
event.HeadBranch = gitEvent.Ref
305+
event.BaseBranch = gitEvent.Ref
306+
if gitEvent.Commits[lastCommitIdx] != nil {
307+
event.SHA = gitEvent.Commits[lastCommitIdx].ID
308+
event.SHAURL = gitEvent.Commits[lastCommitIdx].URL
309+
event.SHATitle = gitEvent.Commits[lastCommitIdx].Title
310+
}
303311
event.TriggerTarget = triggertype.Push
304312
default:
305313
return fmt.Errorf("unsupported GitLab event type: %T", gitEvent)
@@ -578,55 +586,94 @@ func (p *GiteaParser) ParsePayload(eventType string, body []byte) (any, error) {
578586
func (p *GiteaParser) PopulateEvent(event *info.Event, parsedEvent any) error {
579587
switch gitEvent := parsedEvent.(type) {
580588
case *giteaStructs.PullRequestPayload:
581-
event.Organization = gitEvent.Repository.Owner.UserName
582-
event.Repository = gitEvent.Repository.Name
583-
event.Sender = gitEvent.Sender.UserName
584-
event.URL = gitEvent.Repository.HTMLURL
585-
event.SHA = gitEvent.PullRequest.Head.Sha
586-
event.SHAURL = fmt.Sprintf("%s/commit/%s", gitEvent.PullRequest.HTMLURL, gitEvent.PullRequest.Head.Sha)
587-
event.HeadBranch = gitEvent.PullRequest.Head.Ref
588-
event.BaseBranch = gitEvent.PullRequest.Base.Ref
589-
event.HeadURL = gitEvent.PullRequest.Head.Repository.HTMLURL
590-
event.BaseURL = gitEvent.PullRequest.Base.Repository.HTMLURL
591-
event.PullRequestNumber = int(gitEvent.Index)
592-
event.PullRequestTitle = gitEvent.PullRequest.Title
593-
event.DefaultBranch = gitEvent.Repository.DefaultBranch
589+
if gitEvent.Repository != nil {
590+
if gitEvent.Repository.Owner != nil {
591+
event.Organization = gitEvent.Repository.Owner.UserName
592+
}
593+
event.Repository = gitEvent.Repository.Name
594+
event.URL = gitEvent.Repository.HTMLURL
595+
event.DefaultBranch = gitEvent.Repository.DefaultBranch
596+
}
597+
if gitEvent.Sender != nil {
598+
event.Sender = gitEvent.Sender.UserName
599+
}
600+
if gitEvent.PullRequest != nil {
601+
if gitEvent.PullRequest.Head != nil {
602+
event.SHA = gitEvent.PullRequest.Head.Sha
603+
if gitEvent.PullRequest.HTMLURL != "" && gitEvent.PullRequest.Head.Sha != "" {
604+
event.SHAURL = fmt.Sprintf("%s/commit/%s", gitEvent.PullRequest.HTMLURL, gitEvent.PullRequest.Head.Sha)
605+
}
606+
event.HeadBranch = gitEvent.PullRequest.Head.Ref
607+
if gitEvent.PullRequest.Head.Repository != nil {
608+
event.HeadURL = gitEvent.PullRequest.Head.Repository.HTMLURL
609+
}
610+
}
611+
if gitEvent.PullRequest.Base != nil {
612+
event.BaseBranch = gitEvent.PullRequest.Base.Ref
613+
if gitEvent.PullRequest.Base.Repository != nil {
614+
event.BaseURL = gitEvent.PullRequest.Base.Repository.HTMLURL
615+
}
616+
}
617+
event.PullRequestNumber = int(gitEvent.Index)
618+
event.PullRequestTitle = gitEvent.PullRequest.Title
619+
for _, label := range gitEvent.PullRequest.Labels {
620+
if label != nil {
621+
event.PullRequestLabel = append(event.PullRequestLabel, label.Name)
622+
}
623+
}
624+
}
594625
event.TriggerTarget = triggertype.PullRequest
595626
if gitEvent.Action == giteaStructs.HookIssueClosed {
596627
event.TriggerTarget = triggertype.PullRequestClosed
597628
}
598-
for _, label := range gitEvent.PullRequest.Labels {
599-
event.PullRequestLabel = append(event.PullRequestLabel, label.Name)
600-
}
601629
case *giteaStructs.PushPayload:
602-
event.Organization = gitEvent.Repo.Owner.UserName
603-
event.Repository = gitEvent.Repo.Name
604-
event.Sender = gitEvent.Sender.UserName
605-
event.URL = gitEvent.Repo.HTMLURL
606-
event.SHA = gitEvent.HeadCommit.ID
607-
if event.SHA == "" {
630+
if gitEvent.Repo != nil {
631+
if gitEvent.Repo.Owner != nil {
632+
event.Organization = gitEvent.Repo.Owner.UserName
633+
}
634+
event.Repository = gitEvent.Repo.Name
635+
event.URL = gitEvent.Repo.HTMLURL
636+
event.HeadURL = gitEvent.Repo.HTMLURL
637+
event.BaseURL = gitEvent.Repo.HTMLURL
638+
event.DefaultBranch = gitEvent.Repo.DefaultBranch
639+
}
640+
if gitEvent.Sender != nil {
641+
event.Sender = gitEvent.Sender.UserName
642+
}
643+
if gitEvent.HeadCommit != nil {
644+
event.SHA = gitEvent.HeadCommit.ID
645+
if event.SHA == "" {
646+
event.SHA = gitEvent.Before
647+
}
648+
event.SHAURL = gitEvent.HeadCommit.URL
649+
event.SHATitle = gitEvent.HeadCommit.Message
650+
} else if gitEvent.Before != "" {
608651
event.SHA = gitEvent.Before
609652
}
610-
event.SHAURL = gitEvent.HeadCommit.URL
611-
event.SHATitle = gitEvent.HeadCommit.Message
612653
event.HeadBranch = gitEvent.Ref
613654
event.BaseBranch = gitEvent.Ref
614-
event.HeadURL = gitEvent.Repo.HTMLURL
615-
event.BaseURL = gitEvent.Repo.HTMLURL
616-
event.DefaultBranch = gitEvent.Repo.DefaultBranch
617655
event.TriggerTarget = triggertype.Push
618656
case *giteaStructs.IssueCommentPayload:
619-
if gitEvent.Issue.PullRequest == nil {
657+
issue := gitEvent.Issue
658+
if issue == nil || issue.PullRequest == nil {
620659
return fmt.Errorf("issue comment is not from a pull request")
621660
}
622-
event.Organization = gitEvent.Repository.Owner.UserName
623-
event.Repository = gitEvent.Repository.Name
624-
event.Sender = gitEvent.Sender.UserName
625-
event.URL = gitEvent.Repository.HTMLURL
626-
event.DefaultBranch = gitEvent.Repository.DefaultBranch
661+
if gitEvent.Repository != nil {
662+
if gitEvent.Repository.Owner != nil {
663+
event.Organization = gitEvent.Repository.Owner.UserName
664+
}
665+
event.Repository = gitEvent.Repository.Name
666+
event.URL = gitEvent.Repository.HTMLURL
667+
event.DefaultBranch = gitEvent.Repository.DefaultBranch
668+
}
669+
if gitEvent.Sender != nil {
670+
event.Sender = gitEvent.Sender.UserName
671+
}
627672
event.TriggerTarget = triggertype.PullRequest
628-
event.TriggerComment = gitEvent.Comment.Body
629-
event.PullRequestNumber = extractPullRequestNumber(gitEvent.Issue.URL)
673+
if gitEvent.Comment != nil {
674+
event.TriggerComment = gitEvent.Comment.Body
675+
}
676+
event.PullRequestNumber = extractPullRequestNumber(issue.URL)
630677
default:
631678
return fmt.Errorf("unsupported Gitea event type: %T", gitEvent)
632679
}

0 commit comments

Comments
 (0)