Implement FederatedRepoNew
parent
c94a891aad
commit
71b2b4d815
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
}
|
||||||
|
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
Loading…
Reference in New Issue