Origin: " +
- html.EscapeString(entry.Origin) +
+ return "core://store core://store
Origin: " +
+ anchorHTML(safeOriginHref(entry.Origin), entry.Origin) +
"
Bucket: " +
html.EscapeString(entry.Bucket) +
"
Key: " +
@@ -486,7 +486,7 @@ func (s *Service) renderStoreSearchPage(query string, results []StorageEntry) st
} else {
for _, group := range groups {
items.WriteString(" ")
@@ -574,6 +576,31 @@ func coreRouteURL(segment string, parts ...string) string {
return route
}
+func safeOriginHref(origin string) string {
+ trimmed := strings.TrimSpace(origin)
+ if trimmed == "" {
+ return "#"
+ }
+ parsed, err := url.Parse(trimmed)
+ if err != nil {
+ return "#"
+ }
+ switch strings.ToLower(parsed.Scheme) {
+ case "http", "https", "file", "core":
+ return parsed.String()
+ default:
+ return "#"
+ }
+}
+
+func anchorHTML(href, text string) string {
+ escapedHref := html.EscapeString(strings.TrimSpace(href))
+ if escapedHref == "" {
+ escapedHref = "#"
+ }
+ return "" + html.EscapeString(text) + ""
+}
+
func (s *Service) AssetMiddleware() application.Middleware {
return func(next application.Handler) application.Handler {
return assetMiddlewareHandler{service: s, next: next}
")
- items.WriteString(html.EscapeString(group.Origin))
+ items.WriteString(anchorHTML(safeOriginHref(group.Origin), group.Origin))
items.WriteString("
- ")
for _, item := range group.Entries {
items.WriteString("
- ") @@ -497,6 +497,8 @@ func (s *Service) renderStoreSearchPage(query string, results []StorageEntry) st items.WriteString(html.EscapeString(item.Value)) items.WriteString("")
}
items.WriteString("