diff --git a/routers/api/v1/activitypub/repository.go b/routers/api/v1/activitypub/repository.go index 670b8b150e..2568156a84 100644 --- a/routers/api/v1/activitypub/repository.go +++ b/routers/api/v1/activitypub/repository.go @@ -6,6 +6,7 @@ package activitypub import ( "fmt" "net/http" + "net/url" "strings" "code.gitea.io/gitea/modules/context" @@ -18,6 +19,13 @@ import ( //f3 "lab.forgefriends.org/friendlyforgeformat/gof3" ) +type ( + Schema string + UserID string + Host string + Port string +) + // Repository function returns the Repository actor for a repo func Repository(ctx *context.APIContext) { // swagger:operation GET /activitypub/repository-id/{repository-id} activitypub activitypubRepository @@ -75,8 +83,16 @@ func RepositoryInbox(ctx *context.APIContext) { log.Info("RepositoryInbox: Activity.Source %v", opt.Source) log.Info("RepositoryInbox: Activity.Actor %v", opt.Actor) - // assume actor is: "actor": "https://codeberg.org/api/activitypub/user-id/12345" + // assume actor is: "actor": "https://codeberg.org/api/v1/activitypub/user-id/12345" // parse actor + actor, err := parseActor(opt.Actor.GetID().String()) + + if err != nil { + panic(err) + } + + log.Info("RepositoryInbox: Actor parsed. %v", actor) + // if not actor.isValid() then exit_with_error // get_person_by_rest // create_user_from_person (if not alreaydy present) @@ -86,3 +102,37 @@ func RepositoryInbox(ctx *context.APIContext) { ctx.Status(http.StatusNoContent) } + +type ActorData struct { + schema string + userId string + host string + port string +} + +func parseActor(actor string) (ActorData, error) { + u, err := url.Parse(actor) + + // check if userID IRI is well formed url + if err != nil { + return ActorData{}, fmt.Errorf("the actor ID was not valid: %v", err) + } + + if u.Scheme == "" || u.Host == "" { + return ActorData{}, fmt.Errorf("the actor ID was not valid: Invalid Schema or Host") + } + + if !strings.Contains(u.Path, "api/v1/activitypub/user-id") { + return ActorData{}, fmt.Errorf("the Path to the API was invalid: %v\n the full URL is: %v\n", u.Path, actor) + } + + pathWithUserID := strings.Split(u.Path, "/") + userId := pathWithUserID[len(pathWithUserID)-1] + + return ActorData{ + schema: u.Scheme, + userId: userId, + host: u.Host, + port: u.Port(), + }, nil +}