diff options
author | Evgeny Kuznetsov <evgeny@kuznetsov.md> | 2023-03-23 12:30:08 +0300 |
---|---|---|
committer | Evgeny Kuznetsov <evgeny@kuznetsov.md> | 2023-03-23 12:30:08 +0300 |
commit | 4fdc39884f6d083e4266459b550a538c3229cae4 (patch) | |
tree | 2ed5b771c22cf289e1112103e39334d45343ee9d /main.go | |
parent | 9b620cf187d0cb19619e42d15b2c54e932aadc9d (diff) | |
download | static-wm-4fdc39884f6d083e4266459b550a538c3229cae4.tar.gz static-wm-4fdc39884f6d083e4266459b550a538c3229cae4.zip |
feat: add target check
Part of https://www.w3.org/TR/webmention/#request-verification
Diffstat (limited to 'main.go')
-rw-r--r-- | main.go | 24 |
1 files changed, 22 insertions, 2 deletions
@@ -3,15 +3,18 @@ package main import ( "net/http" "net/url" + "path" + "strings" ) const ( - errSrcInvalid = "source is not a parsable URL" + errSrcInvalid = "source is not a parsable URL" + errTgtNotAccepted = "can not process webmentions for this target" ) // endpoint is a webmention receiver. type endpoint struct { - allowPrefix string + allowPrefix string // host (or host:port) and path prefix for the targets served by this endpoint } // ServeHTTP is http.Handler implementation. @@ -21,4 +24,21 @@ func (ep endpoint) ServeHTTP(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusBadRequest) w.Write([]byte(errSrcInvalid)) } + target, err := url.Parse(r.PostFormValue("target")) + if err != nil || !ep.targetAllowed(target) { + w.WriteHeader(http.StatusBadRequest) + w.Write([]byte(errTgtNotAccepted)) + } +} + +// targetAllowed shows whether ep can accept a webmention for the target. +func (ep endpoint) targetAllowed(target *url.URL) bool { + if !strings.HasSuffix(ep.allowPrefix, "/") { + ep.allowPrefix = ep.allowPrefix + "/" + } + tgt := path.Join(target.Host, target.Path) + if !strings.HasSuffix(tgt, "/") { + tgt = tgt + "/" + } + return strings.HasPrefix(tgt, ep.allowPrefix) } |