diff --git a/pkg/display/scheme.go b/pkg/display/scheme.go index 54acc8d3..fe13e56a 100644 --- a/pkg/display/scheme.go +++ b/pkg/display/scheme.go @@ -420,8 +420,8 @@ func (s *Service) renderKeyValuePage(title, key string, value any, snapshot any) } func (s *Service) renderStoreEntryPage(entry StorageEntry) string { - return "core://store
core://store
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("
") - 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("
    Updated ") items.WriteString(html.EscapeString(item.UpdatedAt.Format(time.RFC3339))) + items.WriteString(" ยท ") + items.WriteString(anchorHTML(safeOriginHref(item.Origin), "open source app")) items.WriteString("
  • ") } 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}