Subject: [PATCH links] Strip tags from link description input. Also use <br /> tags when displaying newlines to fix formatting issues.

From: Peter Sanchez <[email-masked]>
Date: Mon, 10 Feb 2025 07:55:28 -0600

Fixes: Formatting issues when displaying notes.
Signed-off-by: Peter Sanchez <[email-masked]>
---
Depends on the gobwebs bump patch sent previously

 api/graph/schema.resolvers.go | 7 ++++---
 cmd/links/main.go             | 3 +++
 cmd/test/helpers.go           | 3 +++
 templates/link_detail.html    | 2 +-
 4 files changed, 11 insertions(+), 4 deletions(-)

diff --git a/api/graph/schema.resolvers.go b/api/graph/schema.resolvers.go
index 12a40c4..8e7f7d0 100644
--- a/api/graph/schema.resolvers.go
+++ b/api/graph/schema.resolvers.go
@@ -41,6 +41,7 @@ import (
 	"netlandish.com/x/gobwebs"
 	oauth2 "netlandish.com/x/gobwebs-oauth2"
 	gaccounts "netlandish.com/x/gobwebs/accounts"
+	gcore "netlandish.com/x/gobwebs/core"
 	"netlandish.com/x/gobwebs/crypto"
 	"netlandish.com/x/gobwebs/database"
 	"netlandish.com/x/gobwebs/email"
@@ -319,7 +320,7 @@ func (r *mutationResolver) AddLink(ctx context.Context, input *model.LinkInput)
 		Hash:       ksuid.New().String(),
 	}
 	if input.Description != nil {
-		OrgLink.Description = *input.Description
+		OrgLink.Description = gcore.StripHtmlTags(*input.Description)
 	}
 
 	err = OrgLink.Store(ctx)
@@ -490,7 +491,7 @@ func (r *mutationResolver) UpdateLink(ctx context.Context, input *model.UpdateLi
 		orgLink.Title = *input.Title
 	}
 	if input.Description != nil {
-		orgLink.Description = *input.Description
+		orgLink.Description = gcore.StripHtmlTags(*input.Description)
 	}
 
 	if input.Unread != nil {
@@ -736,7 +737,7 @@ func (r *mutationResolver) AddNote(ctx context.Context, input *model.NoteInput)
 	OrgLinkNote := &models.OrgLink{
 		Title:       input.Title,
 		OrgID:       org.ID,
-		Description: input.Description,
+		Description: gcore.StripHtmlTags(input.Description),
 		BaseURLID:   sql.NullInt64{Valid: BaseURL.ID > 0, Int64: int64(BaseURL.ID)},
 		Visibility:  string(input.Visibility),
 		Starred:     input.Starred,
diff --git a/cmd/links/main.go b/cmd/links/main.go
index 57bc96d..c911962 100644
--- a/cmd/links/main.go
+++ b/cmd/links/main.go
@@ -292,6 +292,9 @@ func run() error {
 		},
 		"addQueryElement": links.AddQueryElement,
 		"getAddLinkURL":   links.GetAddLinkURL,
+		"newlinebr": func(blob string) string {
+			return strings.ReplaceAll(blob, "\n", "<br />\n")
+		},
 	})
 	srv.TemplateAllowOverride(
 		"seoData",
diff --git a/cmd/test/helpers.go b/cmd/test/helpers.go
index 382ecf6..3f2651c 100644
--- a/cmd/test/helpers.go
+++ b/cmd/test/helpers.go
@@ -132,6 +132,9 @@ func NewWebTestServer(t *testing.T) (*server.Server, *echo.Echo) {
 		},
 		"addQueryElement": links.AddQueryElement,
 		"getAddLinkURL":   links.GetAddLinkURL,
+		"newlinebr": func(blob string) string {
+			return strings.ReplaceAll(blob, "\n", "<br />\n")
+		},
 	})
 	err = srv.LoadTemplatesFS(links.TemplateFS, "templates/*.html", "templates/*.txt")
 	if err != nil {
diff --git a/templates/link_detail.html b/templates/link_detail.html
index ea3002b..08ca228 100644
--- a/templates/link_detail.html
+++ b/templates/link_detail.html
@@ -31,7 +31,7 @@
   {{ if eq .link.Type "LINK" }}
   <p><a href="{{reverse "core:link_redirect" .link.Hash}}" target="_blank">{{stripCommonProtocol .link.URL}}</a></p>
   {{end}}
-  <p>{{.link.Description}}</p>
+  <p>{{ htmlSafe (newlinebr .link.Description) }}</p>
   {{if .link.Tags}}
   <p>{{.pd.Data.tags}}:</p>
   <div class="link-tag">
-- 
2.47.2