aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--http/router.go14
-rw-r--r--registry/registry.go41
-rw-r--r--views/webfinger.go14
3 files changed, 41 insertions, 28 deletions
diff --git a/http/router.go b/http/router.go
index f763c79..d5d0de5 100644
--- a/http/router.go
+++ b/http/router.go
@@ -37,28 +37,30 @@ func (s *Router) Start(zapWriter io.Writer) {
// Webfinger
router.GET("/.well-known/webfinger", func(c *gin.Context) {
resourceParam := c.Query("resource")
- resource, _ := s.registry.WebfingerResource(resourceParam)
+ resource, _ := s.registry.Webfinger(resourceParam)
if resource != nil {
c.JSON(http.StatusOK, resource)
} else {
- c.JSON(http.StatusNotFound, nil)
+ c.JSON(http.StatusNotFound, map[string]interface{}{})
}
})
- // "User" endpoint
+ // Actor
router.GET("/actors/:actor", func(c *gin.Context) {
actorParam := c.Param("actor")
resource, err := s.registry.Actor(actorParam)
render(c, resource, err)
})
+ // Actor Followers
router.GET("/actors/:actor/followers", func(c *gin.Context) {
actorParam := c.Param("actor")
resource, err := s.registry.Followers(actorParam)
render(c, resource, err)
})
+ // Actor Following
router.GET("/actors/:actor/following", func(c *gin.Context) {
actorParam := c.Param("actor")
resource, err := s.registry.Following(actorParam)
@@ -77,7 +79,7 @@ func (s *Router) Start(zapWriter io.Writer) {
// })
- // Outbox
+ // Actor Outbox
router.GET("/actors/:actor/outbox", func(c *gin.Context) {
actorParam := c.Param("actor")
var resource map[string]interface{}
@@ -90,7 +92,7 @@ func (s *Router) Start(zapWriter io.Writer) {
render(c, resource, err)
})
- // Single activity
+ // Actor Activity
router.GET("/actors/:actor/activity/:id", func(c *gin.Context) {
actorParam := c.Param("actor")
idParam := c.Param("id")
@@ -98,7 +100,7 @@ func (s *Router) Start(zapWriter io.Writer) {
render(c, resource, err)
})
- // Single note
+ // Activity Note
router.GET("/actors/:actor/activity/:id/note", func(c *gin.Context) {
actorParam := c.Param("actor")
idParam := c.Param("id")
diff --git a/registry/registry.go b/registry/registry.go
index a24d2d7..451704e 100644
--- a/registry/registry.go
+++ b/registry/registry.go
@@ -3,7 +3,8 @@ package registry
import (
"bytes"
"encoding/gob"
- "fmt"
+ "net/url"
+ "strings"
"git.capotej.com/capotej/communique/config"
"git.capotej.com/capotej/communique/models"
@@ -26,7 +27,7 @@ func NewRegistry(cfg config.Config, persister *models.Persister) *Registry {
reg := Registry{cfg: cfg, persister: persister}
reg.handlerMap = make(map[string]Handler)
for _, v := range cfg.Handlers {
- reg.handlerMap[fqn(v.Name, cfg.Domain)] = Handler{handlerCfg: v}
+ reg.handlerMap[v.Name] = Handler{handlerCfg: v}
}
return &reg
}
@@ -148,29 +149,35 @@ func (r *Registry) ActivityOrNote(activityOrNote, name, id string) (map[string]i
return views.RenderNote(handler.handlerCfg.Name, r.cfg.Domain, outboxItem)
}
-func (r *Registry) WebfingerResource(fqn string) (*views.WebfingerResource, error) {
- handler := r.findByFQN(fqn)
- if handler == nil {
- handler = r.findByFQN("acct:" + fqn)
+// This has to handle various lookup formats:
+// ?resource=acct:actor@domain
+// ?resource=actor@domain
+// ?resource=actor
+// ?resource=acct:actor
+func (r *Registry) Webfinger(fqn string) (*views.WebfingerResource, error) {
+ // Strip away acct: prefix, if found
+ fqn = strings.TrimPrefix(fqn, "acct:")
+
+ // Strip away @domain suffix, if found
+ domainUrl, err := url.Parse(r.cfg.Domain)
+ if err != nil {
+ return nil, err
}
+ hostname := "@" + domainUrl.Hostname()
+ fqn = strings.TrimSuffix(fqn, hostname)
+
+ // We should just have $actor left
+ handler := r.findByName(fqn)
if handler == nil {
return nil, nil
}
- return views.RenderWebfingerResource(handler.handlerCfg.Name, r.cfg.Domain)
+ return views.RenderWebfinger(handler.handlerCfg.Name, r.cfg.Domain, hostname)
}
-func fqn(name, domain string) string {
- return fmt.Sprintf("acct:%s@%s", name, domain)
-}
-
-func (r *Registry) findByFQN(fqn string) *Handler {
- handler, ok := r.handlerMap[fqn]
+func (r *Registry) findByName(name string) *Handler {
+ handler, ok := r.handlerMap[name]
if !ok {
return nil
}
return &handler
}
-
-func (r *Registry) findByName(name string) *Handler {
- return r.findByFQN(fqn(name, r.cfg.Domain))
-}
diff --git a/views/webfinger.go b/views/webfinger.go
index 4252bae..5af6308 100644
--- a/views/webfinger.go
+++ b/views/webfinger.go
@@ -2,7 +2,8 @@ package views
import (
"fmt"
- "path"
+
+ "git.capotej.com/capotej/communique/urls"
)
type Link struct {
@@ -17,14 +18,17 @@ type WebfingerResource struct {
Links []Link `json:"links"`
}
-func RenderWebfingerResource(name, domain string) (*WebfingerResource, error) {
+func RenderWebfinger(name, domain, hostname string) (*WebfingerResource, error) {
+ actorUrl, err := urls.UrlProfile(name, domain)
+ if err != nil {
+ return nil, err
+ }
rs := WebfingerResource{
- // TODO clean up
- Subject: fmt.Sprintf("acct:%s@%s", name, domain),
+ Subject: fmt.Sprintf("acct:%s%s", name, hostname), //hostname contains @
Aliases: []string{},
Links: []Link{{
Rel: "self",
- Href: path.Join("https://", domain, "actors", name),
+ Href: actorUrl.String(),
Type: "application/activity+json",
}},
}