summaryrefslogtreecommitdiff
path: root/main.go
diff options
context:
space:
mode:
Diffstat (limited to 'main.go')
-rw-r--r--main.go24
1 files changed, 22 insertions, 2 deletions
diff --git a/main.go b/main.go
index 565f23c..d80ba6a 100644
--- a/main.go
+++ b/main.go
@@ -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)
}