diff --git a/activitypub.go b/activitypub.go index e8b67d2..87f46f5 100644 --- a/activitypub.go +++ b/activitypub.go @@ -982,6 +982,23 @@ func getRemoteUserFromHandle(app *App, handle string) (*RemoteUser, error) { return &u, nil } +// getRemoteUserFromURL retrieves a RemoteUser from their public profile URL. +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 4887949..95503dd 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}}