You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
58 lines
1.6 KiB
58 lines
1.6 KiB
package controllers |
|
|
|
import ( |
|
"net/http" |
|
"strings" |
|
|
|
log "github.com/sirupsen/logrus" |
|
|
|
"github.com/owncast/owncast/activitypub/apmodels" |
|
"github.com/owncast/owncast/activitypub/crypto" |
|
"github.com/owncast/owncast/activitypub/requests" |
|
"github.com/owncast/owncast/core/data" |
|
) |
|
|
|
// ActorHandler handles requests for a single actor. |
|
func ActorHandler(w http.ResponseWriter, r *http.Request) { |
|
if !data.GetFederationEnabled() { |
|
w.WriteHeader(http.StatusMethodNotAllowed) |
|
return |
|
} |
|
|
|
pathComponents := strings.Split(r.URL.Path, "/") |
|
accountName := pathComponents[3] |
|
|
|
if _, valid := data.GetFederatedInboxMap()[accountName]; !valid { |
|
// User is not valid |
|
w.WriteHeader(http.StatusNotFound) |
|
return |
|
} |
|
|
|
// If this request is for an actor's inbox then pass |
|
// the request to the inbox controller. |
|
if len(pathComponents) == 5 && pathComponents[4] == "inbox" { |
|
InboxHandler(w, r) |
|
return |
|
} else if len(pathComponents) == 5 && pathComponents[4] == "outbox" { |
|
OutboxHandler(w, r) |
|
return |
|
} else if len(pathComponents) == 5 && pathComponents[4] == "followers" { |
|
// followers list |
|
FollowersHandler(w, r) |
|
return |
|
} else if len(pathComponents) == 5 && pathComponents[4] == "following" { |
|
// following list (none) |
|
w.WriteHeader(http.StatusNotFound) |
|
return |
|
} |
|
|
|
actorIRI := apmodels.MakeLocalIRIForAccount(accountName) |
|
publicKey := crypto.GetPublicKey(actorIRI) |
|
person := apmodels.MakeServiceForAccount(accountName) |
|
|
|
if err := requests.WriteStreamResponse(person, w, publicKey); err != nil { |
|
log.Errorln("unable to write stream response for actor handler", err) |
|
w.WriteHeader(http.StatusInternalServerError) |
|
return |
|
} |
|
}
|
|
|