mirror of
https://github.com/owncast/owncast.git
synced 2024-11-21 12:18:02 +03:00
0b5d7c8a4d
* WIP * fix(test): fix ap test failing * fix: fix unkeyed fields being used * chore(tests): clean up browser tests by splitting out federation UI tests
64 lines
1.9 KiB
Go
64 lines
1.9 KiB
Go
package handlers
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"net/http"
|
|
"net/url"
|
|
"strings"
|
|
|
|
"github.com/owncast/owncast/activitypub/webfinger"
|
|
"github.com/owncast/owncast/persistence/configrepository"
|
|
"github.com/owncast/owncast/webserver/handlers/generated"
|
|
webutils "github.com/owncast/owncast/webserver/utils"
|
|
)
|
|
|
|
// RemoteFollow handles a request to begin the remote follow redirect flow.
|
|
func RemoteFollow(w http.ResponseWriter, r *http.Request) {
|
|
type followResponse struct {
|
|
RedirectURL string `json:"redirectUrl"`
|
|
}
|
|
|
|
var request generated.RemoteFollowJSONRequestBody
|
|
decoder := json.NewDecoder(r.Body)
|
|
if err := decoder.Decode(&request); err != nil {
|
|
webutils.WriteSimpleResponse(w, false, "unable to parse request")
|
|
return
|
|
}
|
|
|
|
if request.Account != nil && *request.Account == "" {
|
|
webutils.WriteSimpleResponse(w, false, "Remote Fediverse account is required to follow.")
|
|
return
|
|
}
|
|
|
|
configRepository := configrepository.Get()
|
|
localActorPath, _ := url.Parse(configRepository.GetServerURL())
|
|
localActorPath.Path = fmt.Sprintf("/federation/user/%s", configRepository.GetDefaultFederationUsername())
|
|
var template string
|
|
links, err := webfinger.GetWebfingerLinks(*request.Account)
|
|
if err != nil {
|
|
webutils.WriteSimpleResponse(w, false, err.Error())
|
|
return
|
|
}
|
|
|
|
// Acquire the remote follow redirect template.
|
|
for _, link := range links {
|
|
for k, v := range link {
|
|
if k == "rel" && v == "http://ostatus.org/schema/1.0/subscribe" && link["template"] != nil {
|
|
template = link["template"].(string)
|
|
}
|
|
}
|
|
}
|
|
|
|
if localActorPath.String() == "" || template == "" {
|
|
webutils.WriteSimpleResponse(w, false, "unable to determine remote follow information for "+*request.Account)
|
|
return
|
|
}
|
|
|
|
redirectURL := strings.Replace(template, "{uri}", localActorPath.String(), 1)
|
|
response := followResponse{
|
|
RedirectURL: redirectURL,
|
|
}
|
|
|
|
webutils.WriteResponse(w, response)
|
|
}
|