6 files changed,
31 insertions(+),
18 deletions(-)
Author:
Oleksandr Smirnov
olexsmir@gmail.com
Committed at:
2026-02-24 17:51:49 +0200
Change ID:
vlnyqplsrowyznxmulrynvqpwnonxoup
Parent:
75fc9d1
M
internal/handlers/git.go
@@ -65,7 +65,7 @@ }
} func (h *handlers) archiveHandler(w http.ResponseWriter, r *http.Request) { - ref := r.PathValue("ref") + ref := h.parseRef(r.PathValue("ref")) name := r.PathValue("name") path, err := h.checkRepoPublicityAndGetPath(name) if err != nil {
M
internal/handlers/handlers.go
@@ -3,6 +3,7 @@
import ( "html/template" "net/http" + "net/url" "path/filepath" "strings" "time"@@ -59,9 +60,20 @@ f := filepath.Clean(r.PathValue("file"))
http.ServeFileFS(w, r, web.StaticFS, f) } +// parseRef parses url encoded ref name. +// If it fails it falls back to raw provided value. +func (h handlers) parseRef(name string) string { + ref, err := url.PathUnescape(name) + if err != nil { + return name + } + return ref +} + var templateFuncs = template.FuncMap{ "humanizeRelTime": func(t time.Time) string { return humanize.Time(t) }, "humanizeTime": func(t time.Time) string { return t.Format("2006-01-02 15:04:05 MST") }, + "urlencode": func(s string) string { return url.PathEscape(s) }, "commitSummary": func(s string) string { before, after, found := strings.Cut(s, "\n") first := strings.TrimSuffix(before, "\r")
M
internal/handlers/repo.go
@@ -124,7 +124,7 @@ }
func (h *handlers) repoTreeHandler(w http.ResponseWriter, r *http.Request) { name := r.PathValue("name") - ref := r.PathValue("ref") + ref := h.parseRef(r.PathValue("ref")) treePath := r.PathValue("rest") repo, err := h.openPublicRepo(name, ref)@@ -175,7 +175,7 @@ }
func (h *handlers) fileContentsHandler(w http.ResponseWriter, r *http.Request) { name := r.PathValue("name") - ref := r.PathValue("ref") + ref := h.parseRef(r.PathValue("ref")) treePath := r.PathValue("rest") var raw bool@@ -246,7 +246,7 @@ }
func (h *handlers) logHandler(w http.ResponseWriter, r *http.Request) { name := r.PathValue("name") - ref := r.PathValue("ref") + ref := h.parseRef(r.PathValue("ref")) repo, err := h.openPublicRepo(name, ref) if err != nil {@@ -281,7 +281,8 @@ }
func (h *handlers) commitHandler(w http.ResponseWriter, r *http.Request) { name := r.PathValue("name") - ref := r.PathValue("ref") + ref := h.parseRef(r.PathValue("ref")) + repo, err := h.openPublicRepo(name, ref) if err != nil { h.write404(w, err)
M
web/templates/_repo_header.html
@@ -18,8 +18,8 @@ <nav class="repo-nav">
<ul> <li><a href="/{{ .RepoName }}">summary</a></li> <li><a href="/{{ .RepoName }}/refs">refs</a></li> - <li><a href="/{{ .RepoName }}/tree/{{ .P.Ref }}/">tree</a></li> - <li><a href="/{{ .RepoName }}/log/{{ .P.Ref }}">log</a></li> + <li><a href="/{{ .RepoName }}/tree/{{ urlencode .P.Ref }}/">tree</a></li> + <li><a href="/{{ .RepoName }}/log/{{ urlencode .P.Ref }}">log</a></li> </ul> </nav> {{- end }}
M
web/templates/repo_refs.html
@@ -13,9 +13,9 @@ <div class="refs">
{{ range .P.Branches }} <div> <strong>{{ .Name }}</strong> - <a class="link" href="/{{ $repo }}/tree/{{ .Name }}/">browse</a> - <a class="link" href="/{{ $repo }}/log/{{ .Name }}">log</a> - <a class="link" href="/{{ $repo }}/archive/{{ .Name }}">tar.gz</a> + <a class="link" href="/{{ $repo }}/tree/{{ urlencode .Name }}/">browse</a> + <a class="link" href="/{{ $repo }}/log/{{ urlencode .Name }}">log</a> + <a class="link" href="/{{ $repo }}/archive/{{ urlencode .Name }}">tar.gz</a> </div> {{ end }} </div>@@ -25,9 +25,9 @@ <div class="refs">
{{ range .P.Tags }} <div> <strong>{{ .Name }}</strong> - <a class="link" href="/{{ $repo }}/tree/{{ .Name }}/">browse</a> - <a class="link" href="/{{ $repo }}/log/{{ .Name }}">log</a> - <a class="link" href="/{{ $repo }}/archive/{{ .Name }}">tar.gz</a> + <a class="link" href="/{{ $repo }}/tree/{{ urlencode .Name }}/">browse</a> + <a class="link" href="/{{ $repo }}/log/{{ urlencode .Name }}">log</a> + <a class="link" href="/{{ $repo }}/archive/{{ urlencode .Name }}">tar.gz</a> {{ if .Message }} <details class="tag-message"> <summary>{{ .Name }} message </summary>
M
web/templates/repo_tree.html
@@ -24,7 +24,7 @@ {{ if $parent }}
<tr> <td class="mode nowrap"></td> <td class="size nowrap"></td> - <td class="fill"><a href="/{{ $name }}/tree/{{ $ref }}/{{ .P.DotDot }}">..</a></td> + <td class="fill"><a href="/{{ $name }}/tree/{{ urlencode $ref }}/{{ .P.DotDot }}">..</a></td> </tr> {{ end }}@@ -35,9 +35,9 @@ <td class="mode nowrap">{{ .Mode }}</td>
<td class="size nowrap">{{ .Size }}</td> <td class="fill"> {{ if $parent }} - <a href="/{{ $name}}/tree/{{ $ref }}/{{ $parent }}/{{ .Name }}">{{ .Name }}/</a> + <a href="/{{ $name}}/tree/{{ urlencode $ref }}/{{ $parent }}/{{ .Name }}">{{ .Name }}/</a> {{ else }} - <a href="/{{ $name }}/tree/{{ $ref }}/{{ .Name }}">{{ .Name }}/</a> + <a href="/{{ $name }}/tree/{{ urlencode $ref }}/{{ .Name }}">{{ .Name }}/</a> {{ end }} </td> </tr>@@ -51,9 +51,9 @@ <td class="mode nowrap">{{ .Mode }}</td>
<td class="size nowrap">{{ .Size }}</td> <td class="fill"> {{ if $parent }} - <a href="/{{ $name }}/blob/{{ $ref }}/{{ $parent }}/{{ .Name }}">{{ .Name }}</a> + <a href="/{{ $name }}/blob/{{ urlencode $ref }}/{{ $parent }}/{{ .Name }}">{{ .Name }}</a> {{ else }} - <a href="/{{ $name }}/blob/{{ $ref }}/{{ .Name }}">{{ .Name }}</a> + <a href="/{{ $name }}/blob/{{ urlencode $ref }}/{{ .Name }}">{{ .Name }}</a> {{ end }} </td> </tr>