From 1ed51859b09e17964e7b31aea8804c26328f2741 Mon Sep 17 00:00:00 2001 From: Jerin Thomas Date: Thu, 1 Jun 2023 00:06:41 +0530 Subject: [PATCH] Extending webfinger response (issue:2851) (#3053) * Extending webfinger response #2851 1. Added Logo - rel: avatar as there wasn't any appropriate value in [Link relations registry](https://www.iana.org/assignments/link-relations/) - type: default value image/png or else it is determined file type extension 2. Added Stream - rel: stream as there wasn't appropriate value in [Link relations registry](https://www.iana.org/assignments/link-relations/) - type: video/H264 based on [IANA media types](https://www.iana.org/assignments/media-types/media-types.xhtml#video) Changes after review: 1. Updated the rel type for avatar based on webfinger rel. 2. Updated the rel type for stream link and href value that closely associates to it. * adding period after comments * updating typo --- activitypub/apmodels/utils.go | 48 +++++++++++++++++++++++++++++++ activitypub/apmodels/webfinger.go | 14 ++++++++- 2 files changed, 61 insertions(+), 1 deletion(-) diff --git a/activitypub/apmodels/utils.go b/activitypub/apmodels/utils.go index 056d527b0..b5fcaf687 100644 --- a/activitypub/apmodels/utils.go +++ b/activitypub/apmodels/utils.go @@ -4,6 +4,7 @@ import ( "encoding/json" "net/url" "path" + "path/filepath" "github.com/go-fed/activity/streams" "github.com/go-fed/activity/streams/vocab" @@ -60,3 +61,50 @@ func Serialize(obj vocab.Type) ([]byte, error) { return b, err } + +// MakeLocalIRIForStreamURL will return a full IRI for the local server stream url. +func MakeLocalIRIForStreamURL() *url.URL { + host := data.GetServerURL() + u, err := url.Parse(host) + if err != nil { + log.Errorln("unable to parse local IRI stream url", err) + return nil + } + + u.Path = path.Join(u.Path, "/hls/stream.m3u8") + + return u +} + +// MakeLocalIRIforLogo will return a full IRI for the local server logo. +func MakeLocalIRIforLogo() *url.URL { + host := data.GetServerURL() + u, err := url.Parse(host) + if err != nil { + log.Errorln("unable to parse local IRI stream url", err) + return nil + } + + u.Path = path.Join(u.Path, "/logo/external") + + return u +} + +// GetLogoType will return the rel value for the webfinger response and +// the default static image is of type png. +func GetLogoType() string { + imageFilename := data.GetLogoPath() + if imageFilename == "" { + return "image/png" + } + + logoType := "image/jpeg" + if filepath.Ext(imageFilename) == ".svg" { + logoType = "image/svg+xml" + } else if filepath.Ext(imageFilename) == ".gif" { + logoType = "image/gif" + } else if filepath.Ext(imageFilename) == ".png" { + logoType = "image/png" + } + return logoType +} diff --git a/activitypub/apmodels/webfinger.go b/activitypub/apmodels/webfinger.go index 316cbe894..f8151ca9d 100644 --- a/activitypub/apmodels/webfinger.go +++ b/activitypub/apmodels/webfinger.go @@ -26,7 +26,9 @@ type Link struct { // MakeWebfingerResponse will create a new Webfinger response. func MakeWebfingerResponse(account string, inbox string, host string) WebfingerResponse { accountIRI := MakeLocalIRIForAccount(account) - + streamIRI := MakeLocalIRIForStreamURL() + logoIRI := MakeLocalIRIforLogo() + logoType := GetLogoType() return WebfingerResponse{ Subject: fmt.Sprintf("acct:%s@%s", account, host), Aliases: []string{ @@ -43,6 +45,16 @@ func MakeWebfingerResponse(account string, inbox string, host string) WebfingerR Type: "text/html", Href: accountIRI.String(), }, + { + Rel: "http://webfinger.net/rel/avatar", + Type: logoType, + Href: logoIRI.String(), + }, + { + Rel: "alternate", + Type: "application/x-mpegURL", + Href: streamIRI.String(), + }, }, } }