remoteFollow.go 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. package controllers
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "net/http"
  6. "net/url"
  7. "strings"
  8. "github.com/owncast/owncast/activitypub/webfinger"
  9. "github.com/owncast/owncast/core/data"
  10. )
  11. // RemoteFollow handles a request to begin the remote follow redirect flow.
  12. func RemoteFollow(w http.ResponseWriter, r *http.Request) {
  13. type followRequest struct {
  14. Account string `json:"account"`
  15. }
  16. type followResponse struct {
  17. RedirectURL string `json:"redirectUrl"`
  18. }
  19. var request followRequest
  20. decoder := json.NewDecoder(r.Body)
  21. if err := decoder.Decode(&request); err != nil {
  22. WriteSimpleResponse(w, false, "unable to parse request")
  23. return
  24. }
  25. if request.Account == "" {
  26. WriteSimpleResponse(w, false, "Remote Fediverse account is required to follow.")
  27. return
  28. }
  29. localActorPath, _ := url.Parse(data.GetServerURL())
  30. localActorPath.Path = fmt.Sprintf("/federation/user/%s", data.GetDefaultFederationUsername())
  31. var template string
  32. links, err := webfinger.GetWebfingerLinks(request.Account)
  33. if err != nil {
  34. WriteSimpleResponse(w, false, err.Error())
  35. return
  36. }
  37. // Acquire the remote follow redirect template.
  38. for _, link := range links {
  39. for k, v := range link {
  40. if k == "rel" && v == "http://ostatus.org/schema/1.0/subscribe" && link["template"] != nil {
  41. template = link["template"].(string)
  42. }
  43. }
  44. }
  45. if localActorPath.String() == "" || template == "" {
  46. WriteSimpleResponse(w, false, "unable to determine remote follow information for "+request.Account)
  47. return
  48. }
  49. redirectURL := strings.Replace(template, "{uri}", localActorPath.String(), 1)
  50. response := followResponse{
  51. RedirectURL: redirectURL,
  52. }
  53. WriteResponse(w, response)
  54. }