diff --git a/services/forgefed/actor.go b/services/forgefed/actor.go new file mode 100644 index 000000000..e6b0eb8a8 --- /dev/null +++ b/services/forgefed/actor.go @@ -0,0 +1,96 @@ +package forgefed + +import ( + "context" + "encoding/json" + "fmt" + "io" + "net/http" + + "code.gitea.io/gitea/models/federation" + "code.gitea.io/gitea/models/user" + + ap "github.com/go-ap/activitypub" +) + +func GetActor(id string) (*ap.Actor, error) { + client := http.Client{} + req, err := http.NewRequest("GET", id, nil) + if err != nil { + //Handle Error + } + + req.Header = http.Header{ + "Content-Type": {"application/activity+json"}, + } + r, err := client.Do(req) + if err != nil { + return nil, err + } + defer r.Body.Close() + body, err := io.ReadAll(r.Body) + if err != nil { + return nil, err + } + actorObj := new(ap.Actor) + err = json.Unmarshal(body, &actorObj) + if err != nil { + return nil, err + } + return actorObj, nil +} + +func SavePerson(ctx context.Context, person *ap.Person) (*user.User, error) { + + fmt.Println(person.ID.String()) + hostname, err := GetHostnameFromResource(person.ID.String()) + + exists, err := federation.FederatedHostExists(ctx, hostname) + if err != nil { + return nil, err + } + + var federatedHost federation.FederatedHost + if exists { + x, err := federation.GetFederatdHost(ctx, hostname) + federatedHost = *x + if err != nil { + return nil, err + } + } else { + federatedHost := new(federation.FederatedHost) + federatedHost.HostFqdn = hostname + if err = federatedHost.Save(ctx); err != nil { + return nil, err + } + } + + if err != nil { + return nil, err + } + + u := new(user.User) + u.Name = "@" + person.PreferredUsername.String() + "@" + hostname + //panic(u.Name) + u.Email = person.PreferredUsername.String() + "@" + hostname + u.Website = person.URL.GetID().String() + u.KeepEmailPrivate = true + + exist, err := user.GetUser(ctx, u) + if err != nil { + return nil, err + } + if exist { + return u, nil // TODO: must also check for federatedUser existence + } + + if err = federation.CreatUser(ctx, u); err != nil { + return nil, err + } + + if err = federation.CreateFederatedUser(ctx, u, &federatedHost); err != nil { + return nil, err + } + + return u, nil +}