Changes
7 changed files (+72/-89)
-
-
@@ -5,6 +5,7 @@ package repoimport ( "context" "errors" "fmt" "html/template" "net"
-
@@ -669,6 +670,28 @@ } else if !has {return nil, ErrRepoNotExist{id, 0, "", ""} } return repo, nil } // GetRepositoryByIRI returns the repository by given IRI if exists. func GetRepositoryByIRI(ctx context.Context, iri string) (*Repository, error) { iriSplit := strings.Split(iri, "/") if len(iriSplit) < 5 { return nil, errors.New("not a Repository actor IRI") } if iriSplit[2] == setting.Domain { // Local repository return GetRepositoryByOwnerAndName(ctx, iriSplit[len(iriSplit)-2], iriSplit[len(iriSplit)-1]) } repo := &Repository{ OriginalURL: iri, } has, err := db.GetEngine(db.DefaultContext).Get(repo) if err != nil { return nil, err } else if !has { return nil, ErrRepoNotExist{0, 0, "", ""} } return repo, err } // GetRepositoriesMapByIDs returns the repositories by given id slice.
-
-
-
@@ -5,10 +5,10 @@ package activitypubimport ( "net/http" "net/url" "strconv" user_model "code.gitea.io/gitea/models/user" repo_model "code.gitea.io/gitea/models/repo" "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/forgefed" "code.gitea.io/gitea/modules/setting"
-
@@ -19,12 +19,7 @@ )// Fetch and load a remote object func AuthorizeInteraction(ctx *context.Context) { uri, err := url.Parse(ctx.Req.URL.Query().Get("uri")) if err != nil { ctx.ServerError("Parse URI", err) return } resp, err := activitypub.Fetch(uri) resp, err := activitypub.Fetch(ctx.Req.URL.Query().Get("uri")) if err != nil { ctx.ServerError("Fetch", err) return
-
@@ -67,12 +62,12 @@ if err != nil {ctx.ServerError("FederatedRepoNew", err) return } username, reponame, err := activitypub.RepositoryIRIToName(object.GetLink()) repo, err := repo_model.GetRepositoryByIRI(ctx, object.GetLink().String()) if err != nil { ctx.ServerError("RepositoryIRIToName", err) return } ctx.Redirect(setting.AppURL + username + "/" + reponame) ctx.Redirect(setting.AppURL + repo.OwnerName + "/" + repo.Name) case forgefed.TicketType: // Federated issue or pull request err = forgefed.OnTicket(object, func(t *forgefed.Ticket) error {
-
-
-
@@ -6,7 +6,6 @@import ( "context" "errors" "net/url" "strconv" "strings"
-
@@ -48,11 +47,7 @@ return nil} // Send a WebFinger request to get the username uri, err := url.Parse("https://" + instance + "/.well-known/webfinger?resource=" + person.GetLink().String()) if err != nil { return err } resp, err := activitypub.Fetch(uri) resp, err := activitypub.Fetch("https://" + instance + "/.well-known/webfinger?resource=" + person.GetLink().String()) if err != nil { return err }
-
@@ -100,11 +95,7 @@ icon, err := ap.ToObject(person.Icon)if err != nil { return err } iconURL, err := icon.URL.GetLink().URL() if err != nil { return err } body, err := activitypub.Fetch(iconURL) body, err := activitypub.Fetch(icon.URL.GetLink().String()) if err != nil { return err }
-
@@ -122,8 +113,23 @@ // Set public keyreturn user_model.SetUserSetting(user.ID, user_model.UserActivityPubPubPem, person.PublicKey.PublicKeyPem) } // Create a new federated user from a Person IRI func createPersonFromIRI(ctx context.Context, personIRI ap.IRI) error { object, err := activitypub.FetchObject(personIRI.String()) if err != nil { return err } return ap.On(object, func(p *ap.Person) error { return createPerson(ctx, p) }) } // Create a new federated repo from a Repository object func createRepository(ctx context.Context, repository *forgefed.Repository) error { err := createPersonFromIRI(ctx, repository.AttributedTo.GetLink()) if err != nil { return err } user, err := user_model.GetUserByIRI(ctx, repository.AttributedTo.GetLink().String()) if err != nil { return err
-
@@ -131,8 +137,8 @@ }// Check if repo exists _, err = repo_model.GetRepositoryByOwnerAndName(ctx, user.Name, repository.Name.String()) if err == nil { return nil if !repo_model.IsErrRepoNotExist(err) { return err } repo, err := repo_service.CreateRepository(user, user, repo_module.CreateRepoOptions{
-
@@ -145,7 +151,7 @@ }if repository.ForkedFrom != nil { repo.IsFork = true forkedFrom, err := activitypub.RepositoryIRIToRepository(ctx, repository.ForkedFrom.GetLink()) forkedFrom, err := repo_model.GetRepositoryByIRI(ctx, repository.ForkedFrom.GetLink().String()) if err != nil { return err }
-
@@ -154,27 +160,12 @@ }return nil } // Create a new federated repo from a Repository IRI func createRepositoryFromIRI(ctx context.Context, repoIRI ap.IRI) error { repoURL, err := url.Parse(repoIRI.String()) if err != nil { return err } // Fetch repository object resp, err := activitypub.Fetch(repoURL) if err != nil { return err } // Parse repository object ap.ItemTyperFunc = forgefed.GetItemByType ap.JSONItemUnmarshal = forgefed.JSONUnmarshalerFn ap.NotEmptyChecker = forgefed.NotEmpty object, err := ap.UnmarshalJSON(resp) object, err := activitypub.FetchObject(repoIRI.String()) if err != nil { return err } // Create federated repo return forgefed.OnRepository(object, func(r *forgefed.Repository) error { return createRepository(ctx, r) })
-
@@ -200,7 +191,7 @@ user, err := user_model.GetUserByIRI(ctx, ticket.AttributedTo.GetLink().String())if err != nil { return err } repo, err := activitypub.RepositoryIRIToRepository(ctx, ap.IRI(ticket.Context.GetLink().String())) repo, err := repo_model.GetRepositoryByIRI(ctx, ticket.Context.GetLink().String()) if err != nil { return err }
-
@@ -228,7 +219,6 @@ err := createRepositoryFromIRI(ctx, ticket.Context.GetLink())if err != nil { return err } user, err := user_model.GetUserByIRI(ctx, ticket.AttributedTo.GetLink().String()) if err != nil { return err
-
-
-
@@ -10,7 +10,6 @@ "encoding/pem""errors" "fmt" "net/http" "net/url" gitea_context "code.gitea.io/gitea/modules/context" "code.gitea.io/gitea/modules/setting"
-
@@ -20,15 +19,15 @@ ap "github.com/go-ap/activitypub""github.com/go-fed/httpsig" ) func getPublicKeyFromResponse(b []byte, keyID *url.URL) (p crypto.PublicKey, err error) { person := ap.PersonNew(ap.IRI(keyID.String())) func getPublicKeyFromResponse(b []byte, keyID string) (p crypto.PublicKey, err error) { person := ap.PersonNew(ap.IRI(keyID)) err = person.UnmarshalJSON(b) if err != nil { err = fmt.Errorf("ActivityStreams type cannot be converted to one known to have publicKey property: %w", err) return } pubKey := person.PublicKey if pubKey.ID.String() != keyID.String() { if pubKey.ID.String() != keyID { err = fmt.Errorf("cannot find publicKey with id: %s in %s", keyID, string(b)) return }
-
@@ -58,16 +57,12 @@ v, ID, err := getKeyID(r)if err != nil { return } idIRI, err := url.Parse(ID) if err != nil { return } // 2. Fetch the public key of the other actor b, err := activitypub.Fetch(idIRI) b, err := activitypub.Fetch(ID) if err != nil { return } pubKey, err := getPublicKeyFromResponse(b, idIRI) pubKey, err := getPublicKeyFromResponse(b, ID) if err != nil { return }
-
-
-
@@ -10,7 +10,6 @@ "strings"repo_model "code.gitea.io/gitea/models/repo" user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/services/activitypub" ap "github.com/go-ap/activitypub" )
-
@@ -21,7 +20,7 @@ user, err := user_model.GetUserByIRI(ctx, like.Actor.GetLink().String())if err != nil { return } repo, err := activitypub.RepositoryIRIToRepository(ctx, like.Object.GetLink()) repo, err := repo_model.GetRepositoryByIRI(ctx, like.Object.GetLink().String()) if err != nil || strings.Contains(repo.Name, "@") || repo.IsPrivate { return }
-
@@ -38,7 +37,7 @@ user, err := user_model.GetUserByIRI(ctx, like.Actor.GetLink().String())if err != nil { return } repo, err := activitypub.RepositoryIRIToRepository(ctx, like.Object.GetLink()) repo, err := repo_model.GetRepositoryByIRI(ctx, like.Object.GetLink().String()) if err != nil || strings.Contains(repo.Name, "@") || repo.IsPrivate { return }
-
-
-
@@ -4,44 +4,14 @@package activitypub import ( "context" "errors" "strconv" "strings" repo_model "code.gitea.io/gitea/models/repo" "code.gitea.io/gitea/modules/setting" ap "github.com/go-ap/activitypub" ) // Returns the owner and name corresponding to a Repository actor IRI func RepositoryIRIToName(repoIRI ap.IRI) (string, string, error) { repoIRISplit := strings.Split(repoIRI.String(), "/") if len(repoIRISplit) < 5 { return "", "", errors.New("not a Repository actor IRI") } instance := repoIRISplit[2] username := repoIRISplit[len(repoIRISplit)-2] reponame := repoIRISplit[len(repoIRISplit)-1] if instance == setting.Domain { // Local repo return username, reponame, nil } // Remote repo return username + "@" + instance, reponame, nil } // Returns the repository corresponding to a Repository actor IRI func RepositoryIRIToRepository(ctx context.Context, repoIRI ap.IRI) (*repo_model.Repository, error) { username, reponame, err := RepositoryIRIToName(repoIRI) if err != nil { return nil, err } return repo_model.GetRepositoryByOwnerAndName(ctx, username, reponame) } // Returns the owner, repo name, and idx of a Ticket object IRI func TicketIRIToName(ticketIRI ap.IRI) (string, string, int64, error) {
-
-
-
@@ -7,7 +7,6 @@ import ("fmt" "io" "net/http" "net/url" user_model "code.gitea.io/gitea/models/user" "code.gitea.io/gitea/modules/forgefed"
-
@@ -19,9 +18,9 @@ ap "github.com/go-ap/activitypub""github.com/go-ap/jsonld" ) // Fetch a remote ActivityStreams object func Fetch(iri *url.URL) (b []byte, err error) { req := httplib.NewRequest(iri.String(), http.MethodGet) // Fetch a URL as binary func Fetch(iri string) (b []byte, err error) { req := httplib.NewRequest(iri, http.MethodGet) req.Header("Accept", ActivityStreamsContentType) req.Header("User-Agent", "Gitea/"+setting.AppVer) resp, err := req.Response()
-
@@ -36,6 +35,18 @@ return} b, err = io.ReadAll(io.LimitReader(resp.Body, setting.Federation.MaxSize)) return b, err } // Fetch a remote ActivityStreams object as an object func FetchObject(iri string) (ap.ObjectOrLink, error) { resp, err := Fetch(iri) if err != nil { return nil, err } ap.ItemTyperFunc = forgefed.GetItemByType ap.JSONItemUnmarshal = forgefed.JSONUnmarshalerFn ap.NotEmptyChecker = forgefed.NotEmpty return ap.UnmarshalJSON(resp) } // Send an activity
-