Allow comments on comments

This commit is contained in:
Jan-Lukas Else 2021-02-14 14:15:01 +01:00
parent 66ada4c0ae
commit e434103fc1
6 changed files with 31 additions and 30 deletions

View File

@ -4,7 +4,9 @@ import (
"database/sql" "database/sql"
"fmt" "fmt"
"net/http" "net/http"
"net/url"
"strconv" "strconv"
"strings"
"github.com/go-chi/chi" "github.com/go-chi/chi"
"github.com/microcosm-cc/bluemonday" "github.com/microcosm-cc/bluemonday"
@ -41,6 +43,7 @@ func serveComment(blog string) func(http.ResponseWriter, *http.Request) {
w.Header().Set("X-Robots-Tag", "noindex") w.Header().Set("X-Robots-Tag", "noindex")
render(w, templateComment, &renderData{ render(w, templateComment, &renderData{
BlogString: blog, BlogString: blog,
Canonical: appConfig.Server.PublicAddress + appConfig.Blogs[blog].getRelativePath(fmt.Sprintf("/comment/%d", id)),
Data: comment, Data: comment,
}) })
} }
@ -93,22 +96,16 @@ func checkCommentTarget(w http.ResponseWriter, r *http.Request) string {
if target == "" { if target == "" {
serveError(w, r, "No target specified", http.StatusBadRequest) serveError(w, r, "No target specified", http.StatusBadRequest)
return "" return ""
} else if !strings.HasPrefix(target, appConfig.Server.PublicAddress) {
serveError(w, r, "Bad target", http.StatusBadRequest)
return ""
} }
postExists := 0 targetURL, err := url.Parse(target)
row, err := appDbQueryRow("select exists(select 1 from posts where path = @path)", sql.Named("path", target))
if err != nil { if err != nil {
serveError(w, r, err.Error(), http.StatusInternalServerError) serveError(w, r, err.Error(), http.StatusBadRequest)
return "" return ""
} }
if err = row.Scan(&postExists); err != nil { return targetURL.Path
serveError(w, r, err.Error(), http.StatusInternalServerError)
return ""
}
if postExists != 1 {
serveError(w, r, "Post does not exist", http.StatusBadRequest)
return ""
}
return target
} }
func commentsAdmin(w http.ResponseWriter, r *http.Request) { func commentsAdmin(w http.ResponseWriter, r *http.Request) {

3
go.mod
View File

@ -10,7 +10,7 @@ require (
github.com/caddyserver/certmagic v0.12.0 github.com/caddyserver/certmagic v0.12.0
github.com/dchest/captcha v0.0.0-20200903113550-03f5f0333e1f github.com/dchest/captcha v0.0.0-20200903113550-03f5f0333e1f
github.com/dgrijalva/jwt-go v3.2.0+incompatible github.com/dgrijalva/jwt-go v3.2.0+incompatible
github.com/go-chi/chi v1.5.1 github.com/go-chi/chi v1.5.2
github.com/go-fed/httpsig v1.1.0 github.com/go-fed/httpsig v1.1.0
github.com/go-sql-driver/mysql v1.5.0 // indirect github.com/go-sql-driver/mysql v1.5.0 // indirect
github.com/gofrs/flock v0.8.0 // indirect github.com/gofrs/flock v0.8.0 // indirect
@ -44,6 +44,7 @@ require (
github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect
github.com/spf13/viper v1.7.1 github.com/spf13/viper v1.7.1
github.com/tdewolff/minify/v2 v2.9.12 github.com/tdewolff/minify/v2 v2.9.12
github.com/tdewolff/parse/v2 v2.5.10 // indirect
github.com/tomnomnom/linkheader v0.0.0-20180905144013-02ca5825eb80 github.com/tomnomnom/linkheader v0.0.0-20180905144013-02ca5825eb80
github.com/vcraescu/go-paginator v1.0.1-0.20201114172518-2cfc59fe05c2 github.com/vcraescu/go-paginator v1.0.1-0.20201114172518-2cfc59fe05c2
github.com/yuin/goldmark v1.3.2 github.com/yuin/goldmark v1.3.2

6
go.sum
View File

@ -66,8 +66,8 @@ github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMo
github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
github.com/go-chi/chi v1.5.1 h1:kfTK3Cxd/dkMu/rKs5ZceWYp+t5CtiE7vmaTv3LjC6w= github.com/go-chi/chi v1.5.2 h1:YcLIBANL4OTaAOcTdp//sskGa0yGACQMCtbnr7YEn0Q=
github.com/go-chi/chi v1.5.1/go.mod h1:REp24E+25iKvxgeTfHmdUoL5x15kBiDBlnIl5bCwe2k= github.com/go-chi/chi v1.5.2/go.mod h1:REp24E+25iKvxgeTfHmdUoL5x15kBiDBlnIl5bCwe2k=
github.com/go-fed/httpsig v1.1.0 h1:9M+hb0jkEICD8/cAiNqEB66R87tTINszBRTjwjQzWcI= github.com/go-fed/httpsig v1.1.0 h1:9M+hb0jkEICD8/cAiNqEB66R87tTINszBRTjwjQzWcI=
github.com/go-fed/httpsig v1.1.0/go.mod h1:RCMrTZvN1bJYtofsG4rd5NaO5obxQ5xBkdiS7xsT7bM= github.com/go-fed/httpsig v1.1.0/go.mod h1:RCMrTZvN1bJYtofsG4rd5NaO5obxQ5xBkdiS7xsT7bM=
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
@ -288,6 +288,8 @@ github.com/tdewolff/minify/v2 v2.9.12 h1:BKnbg3kcAuTLAhDeF3vSUxjvyj5lBRxaBvgxGCV
github.com/tdewolff/minify/v2 v2.9.12/go.mod h1:yuntVVAFuGyi9VmiRoUqAYEQnFCGO929ytj2ITMZuB8= github.com/tdewolff/minify/v2 v2.9.12/go.mod h1:yuntVVAFuGyi9VmiRoUqAYEQnFCGO929ytj2ITMZuB8=
github.com/tdewolff/parse/v2 v2.5.9 h1:9wCXRT3OcgYDNatgU+HUTOoGhE9WcnY5UxLNoJUe1yw= github.com/tdewolff/parse/v2 v2.5.9 h1:9wCXRT3OcgYDNatgU+HUTOoGhE9WcnY5UxLNoJUe1yw=
github.com/tdewolff/parse/v2 v2.5.9/go.mod h1:WzaJpRSbwq++EIQHYIRTpbYKNA3gn9it1Ik++q4zyho= github.com/tdewolff/parse/v2 v2.5.9/go.mod h1:WzaJpRSbwq++EIQHYIRTpbYKNA3gn9it1Ik++q4zyho=
github.com/tdewolff/parse/v2 v2.5.10 h1:vj35n+ljq8LuYUx436s4qB18wuwP7thrLv+t1syE39M=
github.com/tdewolff/parse/v2 v2.5.10/go.mod h1:WzaJpRSbwq++EIQHYIRTpbYKNA3gn9it1Ik++q4zyho=
github.com/tdewolff/test v1.0.6 h1:76mzYJQ83Op284kMT+63iCNCI7NEERsIN8dLM+RiKr4= github.com/tdewolff/test v1.0.6 h1:76mzYJQ83Op284kMT+63iCNCI7NEERsIN8dLM+RiKr4=
github.com/tdewolff/test v1.0.6/go.mod h1:6DAvZliBAAnD7rhVgwaM7DE5/d9NMOAJ09SqYqeK4QE= github.com/tdewolff/test v1.0.6/go.mod h1:6DAvZliBAAnD7rhVgwaM7DE5/d9NMOAJ09SqYqeK4QE=
github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=

View File

@ -86,14 +86,6 @@ func initRendering() error {
"translations": func(p *post) []*post { "translations": func(p *post) []*post {
return p.translations() return p.translations()
}, },
"postmentions": func(p *post) []*mention {
mentions, _ := getWebmentions(&webmentionsRequestConfig{
target: p.fullURL(),
status: webmentionStatusApproved,
asc: true,
})
return mentions
},
"shorturl": func(p *post) string { "shorturl": func(p *post) string {
return p.shortURL() return p.shortURL()
}, },
@ -208,6 +200,14 @@ func initRendering() error {
"commentsenabled": func(blog *configBlog) bool { "commentsenabled": func(blog *configBlog) bool {
return blog.Comments != nil && blog.Comments.Enabled return blog.Comments != nil && blog.Comments.Enabled
}, },
"mentions": func(absolute string) []*mention {
mentions, _ := getWebmentions(&webmentionsRequestConfig{
target: absolute,
status: webmentionStatusApproved,
asc: true,
})
return mentions
},
} }
templates = map[string]*template.Template{} templates = map[string]*template.Template{}

View File

@ -1,5 +1,5 @@
{{ define "title" }} {{ define "title" }}
<title>{{ string .Blog.Lang "acommentby" }} {{ .Data.Name }} - {{ .Blog.Title }}</title> <title>{{ string .Blog.Lang "acommentby" }} {{ .Data.Name }}</title>
{{ end }} {{ end }}
{{ define "main" }} {{ define "main" }}
@ -13,6 +13,9 @@
{{ html .Data.Comment }} {{ html .Data.Comment }}
</div> </div>
</main> </main>
{{ if commentsenabled .Blog }}
{{ include "interactions" . }}
{{ end }}
{{ end }} {{ end }}
{{ define "comment" }} {{ define "comment" }}

View File

@ -1,11 +1,9 @@
{{ define "interactions" }} {{ define "interactions" }}
<details class="p" id="interactions"> <details class="p" id="interactions">
<summary><b>{{ string .Blog.Lang "interactions" }}</b></summary> <summary><b>{{ string .Blog.Lang "interactions" }}</b></summary>
{{ $postperma := ( absolute .Data.Path ) }} {{ with ( mentions .Canonical ) }}
{{ $mentions := ( postmentions .Data ) }}
{{ if $mentions }}
<ul> <ul>
{{ range $i, $mention := $mentions }} {{ range $i, $mention := . }}
<li><a href="{{$mention.Source}}" target="_blank" rel="nofollow noopener noreferrer ugc"> <li><a href="{{$mention.Source}}" target="_blank" rel="nofollow noopener noreferrer ugc">
{{ if $mention.Author }} {{ if $mention.Author }}
{{ $mention.Author }} {{ $mention.Author }}
@ -19,11 +17,11 @@
<form class="fw-form p" method="post" action="/webmention"> <form class="fw-form p" method="post" action="/webmention">
<label for="wm-source" class="p">{{ string .Blog.Lang "interactionslabel" }}</label> <label for="wm-source" class="p">{{ string .Blog.Lang "interactionslabel" }}</label>
<input id="wm-source" type="url" name="source" placeholder="URL" required> <input id="wm-source" type="url" name="source" placeholder="URL" required>
<input type="hidden" name="target" value="{{ $postperma }}"> <input type="hidden" name="target" value="{{ .Canonical }}">
<input class="fw" type="submit" value="{{ string .Blog.Lang "send" }}"> <input class="fw" type="submit" value="{{ string .Blog.Lang "send" }}">
</form> </form>
<form class="fw-form p" method="post" action="{{ blogrelative .Blog "/comment" }}"> <form class="fw-form p" method="post" action="{{ blogrelative .Blog "/comment" }}">
<input type="hidden" name="target" value="{{ .Data.Path }}"> <input type="hidden" name="target" value="{{ .Canonical }}">
<input type="text" name="name" placeholder="{{ string .Blog.Lang "nameopt" }}"> <input type="text" name="name" placeholder="{{ string .Blog.Lang "nameopt" }}">
<input type="url" name="website" placeholder="{{ string .Blog.Lang "websiteopt" }}"> <input type="url" name="website" placeholder="{{ string .Blog.Lang "websiteopt" }}">
<textarea name="comment" required placeholder="{{ string .Blog.Lang "comment" }}"></textarea> <textarea name="comment" required placeholder="{{ string .Blog.Lang "comment" }}"></textarea>