Implement FederatedRepoNew

This commit is contained in:
Anthony Wang 2022-07-27 14:43:01 -05:00
parent c94a891aad
commit 71b2b4d815
No known key found for this signature in database
GPG Key ID: BC96B00AEC5F2D76
4 changed files with 54 additions and 24 deletions

View File

@ -14,45 +14,45 @@ import (
ap "github.com/go-ap/activitypub" ap "github.com/go-ap/activitypub"
) )
func AuthorizeInteraction(c *context.Context) { func AuthorizeInteraction(ctx *context.Context) {
uri, err := url.Parse(c.Req.URL.Query().Get("uri")) uri, err := url.Parse(ctx.Req.URL.Query().Get("uri"))
if err != nil { if err != nil {
c.ServerError("Could not parse URI", err) ctx.ServerError("Could not parse URI", err)
return return
} }
resp, err := Fetch(uri) resp, err := Fetch(uri)
if err != nil { if err != nil {
c.ServerError("Fetch", err) ctx.ServerError("Fetch", err)
return return
} }
ap.ItemTyperFunc = forgefed.GetItemByType ap.ItemTyperFunc = forgefed.GetItemByType
object, err := ap.UnmarshalJSON(resp) object, err := ap.UnmarshalJSON(resp)
if err != nil { if err != nil {
c.ServerError("UnmarshalJSON", err) ctx.ServerError("UnmarshalJSON", err)
return return
} }
switch object.GetType() { switch object.GetType() {
case ap.PersonType: case ap.PersonType:
if err != nil { if err != nil {
c.ServerError("UnmarshalJSON", err) ctx.ServerError("UnmarshalJSON", err)
return return
} }
err = FederatedUserNew(c, object.(ap.Person)) err = FederatedUserNew(ctx, object.(ap.Person))
if err != nil { if err != nil {
c.ServerError("FederatedUserNew", err) ctx.ServerError("FederatedUserNew", err)
return return
} }
name, err := personIRIToName(object.GetLink()) name, err := personIRIToName(object.GetLink())
if err != nil { if err != nil {
c.ServerError("personIRIToName", err) ctx.ServerError("personIRIToName", err)
return return
} }
c.Redirect(name) ctx.Redirect(name)
case forgefed.RepositoryType: case forgefed.RepositoryType:
err = FederatedRepoNew(object.(forgefed.Repository)) err = FederatedRepoNew(ctx, object.(forgefed.Repository))
} }
c.Status(http.StatusOK) ctx.Status(http.StatusOK)
} }

View File

@ -77,3 +77,15 @@ func repositoryIRIToRepository(ctx context.Context, repoIRI ap.IRI) (*repo_model
// TODO: create remote repo if not exists // TODO: create remote repo if not exists
return repo_model.GetRepositoryByOwnerAndName(username, reponame) return repo_model.GetRepositoryByOwnerAndName(username, reponame)
} }
// Returns the IRI of the owner of a Repository actor IRI
func repositoryIRIToOwnerIRI(repoIRI ap.IRI) (ap.IRI, error) {
r := repoIRI.String()
rSplit := strings.Split(r, "/")
if len(rSplit) < 5 {
return "", errors.New("Not a Repository actor IRI")
}
username := rSplit[len(rSplit)-2]
reponame := rSplit[len(rSplit)-1]
return ap.IRI(strings.TrimSuffix(r, "repo/"+username+"/"+reponame)+"user/"+username), nil
}

View File

@ -5,19 +5,36 @@
package activitypub package activitypub
import ( import (
//"code.gitea.io/gitea/models" "context"
"code.gitea.io/gitea/modules/forgefed"
/*repo_model "code.gitea.io/gitea/models/repo"
user_model "code.gitea.io/gitea/models/user"
"code.gitea.io/gitea/modules/repository"
ap "github.com/go-ap/activitypub"*/ "code.gitea.io/gitea/models"
repo_model "code.gitea.io/gitea/models/repo"
"code.gitea.io/gitea/modules/forgefed"
) )
func FederatedRepoNew(repo forgefed.Repository) error { // Create a new federated repo from a Repository object
// TODO: also handle forks func FederatedRepoNew(ctx context.Context, repository forgefed.Repository) error {
/*_, err := repository.CreateRepository(user, user, models.CreateRepoOptions{ ownerIRI, err := repositoryIRIToOwnerIRI(repository.GetLink())
Name: repo.Name.String(), if err != nil {
})*/ return err
return nil }
user, err := personIRIToUser(ctx, ownerIRI)
if err != nil {
return err
}
repo := repo_model.Repository{
Name: repository.Name.String(),
}
if repository.ForkedFrom != nil {
repo.IsFork = true
forkedFrom, err := repositoryIRIToRepository(ctx, repository.ForkedFrom.GetLink())
if err != nil {
return err
}
repo.ForkID = forkedFrom.ID
}
// TODO: Check if repo already exists
return models.CreateRepository(ctx, user, user, &repo, false)
} }

View File

@ -15,6 +15,7 @@ import (
ap "github.com/go-ap/activitypub" ap "github.com/go-ap/activitypub"
) )
// Create a new federated user from a Person object
func FederatedUserNew(ctx context.Context, person ap.Person) error { func FederatedUserNew(ctx context.Context, person ap.Person) error {
name, err := personIRIToName(person.GetLink()) name, err := personIRIToName(person.GetLink())
if err != nil { if err != nil {