diff --git a/activitypub.go b/activitypub.go
index f6f8792..0bbeecd 100644
--- a/activitypub.go
+++ b/activitypub.go
@@ -971,6 +971,24 @@ func getRemoteUserFromHandle(app *App, handle string) (*RemoteUser, error) {
return &u, nil
}
+// getRemoteUserFromURL retrieves the profile page of a remote user
+// from the @user@server.tld handle
+func getRemoteUserFromURL(app *App, urlStr string) (*RemoteUser, error) {
+ u := RemoteUser{URL: urlStr}
+ var urlVal, handle sql.NullString
+ err := app.db.QueryRow("SELECT id, actor_id, inbox, shared_inbox, url, handle FROM remoteusers WHERE url = ?", urlStr).Scan(&u.ID, &u.ActorID, &u.Inbox, &u.SharedInbox, &urlVal, &handle)
+ switch {
+ case err == sql.ErrNoRows:
+ return nil, ErrRemoteUserNotFound
+ case err != nil:
+ log.Error("Couldn't get remote user from URL %s: %v", urlStr, err)
+ return nil, err
+ }
+ u.URL = urlVal.String
+ u.Handle = handle.String
+ return &u, nil
+}
+
func getActor(app *App, actorIRI string) (*activitystreams.Person, *RemoteUser, error) {
log.Info("Fetching actor %s locally", actorIRI)
actor := &activitystreams.Person{}
diff --git a/collections.go b/collections.go
index 90e02ba..8ce6474 100644
--- a/collections.go
+++ b/collections.go
@@ -630,18 +630,19 @@ func fetchCollectionPosts(app *App, w http.ResponseWriter, r *http.Request) erro
type CollectionPage struct {
page.StaticPage
*DisplayCollection
- IsCustomDomain bool
- IsWelcome bool
- IsOwner bool
- IsCollLoggedIn bool
- Honeypot string
- IsSubscriber bool
- CanPin bool
- Username string
- Monetization string
- Flash template.HTML
- Collections *[]Collection
- PinnedPosts *[]PublicPost
+ IsCustomDomain bool
+ IsWelcome bool
+ IsOwner bool
+ IsCollLoggedIn bool
+ Honeypot string
+ IsSubscriber bool
+ CanPin bool
+ Username string
+ Monetization string
+ FediverseAuthor string
+ Flash template.HTML
+ Collections *[]Collection
+ PinnedPosts *[]PublicPost
IsAdmin bool
CanInvite bool
diff --git a/posts.go b/posts.go
index f4ab8b1..06861cd 100644
--- a/posts.go
+++ b/posts.go
@@ -144,16 +144,17 @@ type (
CollectionPostPage struct {
*PublicPost
page.StaticPage
- IsOwner bool
- IsPinned bool
- IsCustomDomain bool
- Monetization string
- Verification string
- PinnedPosts *[]PublicPost
- IsFound bool
- IsAdmin bool
- CanInvite bool
- Silenced bool
+ IsOwner bool
+ IsPinned bool
+ IsCustomDomain bool
+ Monetization string
+ Verification string
+ FediverseAuthor string
+ PinnedPosts *[]PublicPost
+ IsFound bool
+ IsAdmin bool
+ CanInvite bool
+ Silenced bool
// Helper field for Chorus mode
CollAlias string
@@ -1614,6 +1615,18 @@ Are you sure it was ever here?`,
tp.IsPinned = len(*tp.PinnedPosts) > 0 && PostsContains(tp.PinnedPosts, p)
tp.Monetization = coll.Monetization
tp.Verification = coll.Verification
+ if tp.Verification != "" {
+ // Fetch info for fediverse:creator tag
+ ru, err := getRemoteUserFromURL(app, coll.Verification)
+ if err != nil {
+ if debugging {
+ log.Info("showing rel=me tag, but no local handle for %s", coll.Verification)
+ }
+ } else {
+ // Though we don't store handles with leading @, strip it here just in case
+ tp.FediverseAuthor = "@" + strings.TrimLeft(ru.Handle, "@")
+ }
+ }
if !postFound {
w.WriteHeader(http.StatusNotFound)
diff --git a/templates/include/post-render.tmpl b/templates/include/post-render.tmpl
index 4e98d80..e425e25 100644
--- a/templates/include/post-render.tmpl
+++ b/templates/include/post-render.tmpl
@@ -4,6 +4,7 @@
{{- end}}
{{if .Verification -}}
+ {{if .FediverseAuthor}}{{end}}
{{- end}}
{{end}}
@@ -129,4 +130,4 @@
{{end}}
{{end}}
-{{end}}
\ No newline at end of file
+{{end}}