Skip to content

Commit a72049a

Browse files
committed
Rewrite GitLab Link headers safely
1 parent ecb1591 commit a72049a

File tree

1 file changed

+24
-6
lines changed

1 file changed

+24
-6
lines changed

api/gitlab.go

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -122,14 +122,32 @@ func (gl *GitLabGateway) authenticate(w http.ResponseWriter, r *http.Request) er
122122
var gitlabLinkRegex = regexp.MustCompile("<(.*?)>")
123123
var gitlabLinkRelRegex = regexp.MustCompile("rel=\"(.*?)\"")
124124

125+
func rewriteGitlabLinkEntry(linkEntry, endpointAPIURL, proxyAPIURL string) string {
126+
linkAndRel := strings.Split(strings.TrimSpace(linkEntry), ";")
127+
if len(linkAndRel) != 2 {
128+
return linkEntry
129+
}
130+
131+
linkMatch := gitlabLinkRegex.FindStringSubmatch(linkAndRel[0])
132+
if len(linkMatch) < 2 {
133+
return linkEntry
134+
}
135+
136+
relMatch := gitlabLinkRelRegex.FindStringSubmatch(linkAndRel[1])
137+
if len(relMatch) < 2 {
138+
return linkEntry
139+
}
140+
141+
proxiedLink := proxyAPIURL + strings.TrimPrefix(linkMatch[1], endpointAPIURL)
142+
rel := relMatch[1]
143+
return "<" + proxiedLink + ">; rel=\"" + rel + "\""
144+
}
145+
125146
func rewriteGitlabLinks(linkHeader, endpointAPIURL, proxyAPIURL string) string {
126147
linkEntries := strings.Split(linkHeader, ",")
127-
finalLinkEntries := []string{}
128-
for _, linkEntry := range linkEntries {
129-
linkAndRel := strings.Split(strings.TrimSpace(linkEntry), ";")
130-
link := proxyAPIURL + strings.TrimPrefix(gitlabLinkRegex.FindStringSubmatch(linkAndRel[0])[1], endpointAPIURL)
131-
rel := gitlabLinkRelRegex.FindStringSubmatch(linkAndRel[1])[1]
132-
finalLinkEntries = append(finalLinkEntries, "<"+link+">; rel=\""+rel+"\"")
148+
finalLinkEntries := make([]string, len(linkEntries), len(linkEntries))
149+
for i, linkEntry := range linkEntries {
150+
finalLinkEntries[i] = rewriteGitlabLinkEntry(linkEntry, endpointAPIURL, proxyAPIURL)
133151
}
134152
finalLinkHeader := strings.Join(finalLinkEntries, ",")
135153
return finalLinkHeader

0 commit comments

Comments
 (0)