diff --git a/tests/integration/activitypub_client_test.go b/tests/integration/activitypub_client_test.go index afafca52ae..2adb8304c2 100644 --- a/tests/integration/activitypub_client_test.go +++ b/tests/integration/activitypub_client_test.go @@ -29,7 +29,7 @@ func TestActivityPubClientBodySize(t *testing.T) { clientFactory, err := activitypub.GetClientFactory(db.DefaultContext) require.NoError(t, err) - apClient, err := clientFactory.WithKeys(db.DefaultContext, user1, user1.APActorKeyID()) + apClient, err := clientFactory.WithKeys(db.DefaultContext, user1, user1.KeyID()) require.NoError(t, err) url := u.JoinPath("/api/v1/nodeinfo").String() diff --git a/tests/integration/api_activitypub_actor_test.go b/tests/integration/api_activitypub_actor_test.go index 778a34d785..42232bd640 100644 --- a/tests/integration/api_activitypub_actor_test.go +++ b/tests/integration/api_activitypub_actor_test.go @@ -4,12 +4,18 @@ package integration import ( + "fmt" "net/http" + "net/url" + "strconv" "testing" + "forgejo.org/modules/forgefed" "forgejo.org/modules/setting" "forgejo.org/modules/test" "forgejo.org/routers" + "forgejo.org/services/contexttest" + "forgejo.org/services/federation" "forgejo.org/tests" ap "github.com/go-ap/activitypub" @@ -31,10 +37,9 @@ func TestActivityPubActor(t *testing.T) { require.NoError(t, err) assert.Equal(t, ap.ApplicationType, actor.Type) - assert.Equal(t, setting.Domain, actor.PreferredUsername.String()) + assert.Equal(t, "ghost", actor.PreferredUsername.String()) keyID := actor.GetID().String() assert.Regexp(t, "activitypub/actor$", keyID) - assert.Regexp(t, "activitypub/actor/outbox$", actor.Outbox.GetID().String()) assert.Regexp(t, "activitypub/actor/inbox$", actor.Inbox.GetID().String()) pubKey := actor.PublicKey @@ -46,3 +51,27 @@ func TestActivityPubActor(t *testing.T) { assert.NotNil(t, pubKeyPem) assert.Regexp(t, "^-----BEGIN PUBLIC KEY-----", pubKeyPem) } + +func TestActorNewFromKeyId(t *testing.T) { + defer test.MockVariableValue(&setting.Federation.Enabled, true)() + defer test.MockVariableValue(&testWebRoutes, routers.NormalRoutes())() + + onGiteaRun(t, func(t *testing.T, u *url.URL) { + ctx, _ := contexttest.MockAPIContext(t, "/api/v1/activitypub/actor") + sut, err := federation.NewActorIDFromKeyID(ctx.Base, fmt.Sprintf("%sapi/v1/activitypub/actor#main-key", u)) + require.NoError(t, err) + + port, err := strconv.ParseUint(u.Port(), 10, 16) + require.NoError(t, err) + + assert.Equal(t, forgefed.ActorID{ + ID: "actor", + HostSchema: "http", + Path: "api/v1/activitypub", + Host: setting.Domain, + HostPort: uint16(port), + UnvalidatedInput: fmt.Sprintf("http://%s:%d/api/v1/activitypub/actor", setting.Domain, port), + IsPortSupplemented: false, + }, sut) + }) +} diff --git a/tests/integration/api_activitypub_person_test.go b/tests/integration/api_activitypub_person_test.go index c89951ecf1..958cc35484 100644 --- a/tests/integration/api_activitypub_person_test.go +++ b/tests/integration/api_activitypub_person_test.go @@ -24,30 +24,40 @@ import ( ) func TestActivityPubPerson(t *testing.T) { + defer tests.PrepareTestEnv(t)() defer test.MockVariableValue(&setting.Federation.Enabled, true)() defer test.MockVariableValue(&testWebRoutes, routers.NormalRoutes())() - onGiteaRun(t, func(t *testing.T, u *url.URL) { - userID := 2 - username := "user2" - userURL := fmt.Sprintf("%sapi/v1/activitypub/user-id/%d", u, userID) - user1 := unittest.AssertExistsAndLoadBean(t, &user_model.User{ID: 1}) + mock := test.NewFederationServerMock() + federatedSrv := mock.DistantServer(t) + defer federatedSrv.Close() - clientFactory, err := activitypub.GetClientFactory(db.DefaultContext) + onGiteaRun(t, func(t *testing.T, localUrl *url.URL) { + defer test.MockVariableValue(&setting.AppURL, localUrl.String())() + + localUserID := 2 + localUserName := "user2" + localUserURL := fmt.Sprintf("%sapi/v1/activitypub/user-id/%d", localUrl, localUserID) + + // distantURL := federatedSrv.URL + // distantUser15URL := fmt.Sprintf("%s/api/v1/activitypub/user-id/15", distantURL) + + cf, err := activitypub.GetClientFactory(db.DefaultContext) require.NoError(t, err) - apClient, err := clientFactory.WithKeys(db.DefaultContext, user1, user1.APActorKeyID()) + c, err := cf.WithKeysDirect(db.DefaultContext, mock.Persons[0].PrivKey, + mock.Persons[0].KeyID(federatedSrv.URL)) require.NoError(t, err) // Unsigned request t.Run("UnsignedRequest", func(t *testing.T) { - req := NewRequest(t, "GET", userURL) + req := NewRequest(t, "GET", localUserURL) MakeRequest(t, req, http.StatusBadRequest) }) t.Run("SignedRequestValidation", func(t *testing.T) { // Signed request - resp, err := apClient.GetBody(userURL) + resp, err := c.GetBody(localUserURL) require.NoError(t, err) var person ap.Person @@ -55,13 +65,12 @@ func TestActivityPubPerson(t *testing.T) { require.NoError(t, err) assert.Equal(t, ap.PersonType, person.Type) - assert.Equal(t, username, person.PreferredUsername.String()) - assert.Regexp(t, fmt.Sprintf("activitypub/user-id/%d$", userID), person.GetID()) - assert.Regexp(t, fmt.Sprintf("activitypub/user-id/%d/outbox$", userID), person.Outbox.GetID().String()) - assert.Regexp(t, fmt.Sprintf("activitypub/user-id/%d/inbox$", userID), person.Inbox.GetID().String()) + assert.Equal(t, localUserName, person.PreferredUsername.String()) + assert.Regexp(t, fmt.Sprintf("activitypub/user-id/%d$", localUserID), person.GetID()) + assert.Regexp(t, fmt.Sprintf("activitypub/user-id/%d/inbox$", localUserID), person.Inbox.GetID().String()) assert.NotNil(t, person.PublicKey) - assert.Regexp(t, fmt.Sprintf("activitypub/user-id/%d#main-key$", userID), person.PublicKey.ID) + assert.Regexp(t, fmt.Sprintf("activitypub/user-id/%d#main-key$", localUserID), person.PublicKey.ID) assert.NotNil(t, person.PublicKey.PublicKeyPem) assert.Regexp(t, "^-----BEGIN PUBLIC KEY-----", person.PublicKey.PublicKeyPem) diff --git a/tests/integration/api_activitypub_repository_test.go b/tests/integration/api_activitypub_repository_test.go index fd19b4ce33..36a60c4174 100644 --- a/tests/integration/api_activitypub_repository_test.go +++ b/tests/integration/api_activitypub_repository_test.go @@ -26,18 +26,22 @@ import ( ) func TestActivityPubRepository(t *testing.T) { + defer tests.PrepareTestEnv(t)() defer test.MockVariableValue(&setting.Federation.Enabled, true)() defer test.MockVariableValue(&testWebRoutes, routers.NormalRoutes())() + mock := test.NewFederationServerMock() + federatedSrv := mock.DistantServer(t) + defer federatedSrv.Close() + onGiteaRun(t, func(t *testing.T, u *url.URL) { repositoryID := 2 - apServerActor := user.NewAPServerActor() - cf, err := activitypub.GetClientFactory(db.DefaultContext) require.NoError(t, err) - c, err := cf.WithKeys(db.DefaultContext, apServerActor, apServerActor.APActorKeyID()) + c, err := cf.WithKeysDirect(db.DefaultContext, mock.Persons[0].PrivKey, + mock.Persons[0].KeyID(federatedSrv.URL)) require.NoError(t, err) resp, err := c.GetBody(fmt.Sprintf("%sapi/v1/activitypub/repository-id/%d", u, repositoryID)) @@ -53,9 +57,10 @@ func TestActivityPubRepository(t *testing.T) { } func TestActivityPubMissingRepository(t *testing.T) { - defer test.MockVariableValue(&setting.Federation.Enabled, true)() - defer test.MockVariableValue(&testWebRoutes, routers.NormalRoutes())() defer tests.PrepareTestEnv(t)() + defer test.MockVariableValue(&setting.Federation.Enabled, true)() + defer test.MockVariableValue(&setting.Federation.SignatureEnforced, false)() + defer test.MockVariableValue(&testWebRoutes, routers.NormalRoutes())() repositoryID := 9999999 req := NewRequest(t, "GET", fmt.Sprintf("/api/v1/activitypub/repository-id/%d", repositoryID)) @@ -72,14 +77,14 @@ func TestActivityPubRepositoryInboxValid(t *testing.T) { defer federatedSrv.Close() onGiteaRun(t, func(t *testing.T, u *url.URL) { - apServerActor := user.NewAPServerActor() repositoryID := 2 timeNow := time.Now().UTC() cf, err := activitypub.GetClientFactory(db.DefaultContext) require.NoError(t, err) - c, err := cf.WithKeys(db.DefaultContext, apServerActor, apServerActor.APActorKeyID()) + c, err := cf.WithKeysDirect(db.DefaultContext, mock.Persons[0].PrivKey, + mock.Persons[0].KeyID(federatedSrv.URL)) require.NoError(t, err) repoInboxURL := u.JoinPath(fmt.Sprintf("/api/v1/activitypub/repository-id/%d/inbox", repositoryID)).String() @@ -148,6 +153,7 @@ func TestActivityPubRepositoryInboxValid(t *testing.T) { func TestActivityPubRepositoryInboxInvalid(t *testing.T) { defer test.MockVariableValue(&setting.Federation.Enabled, true)() + defer test.MockVariableValue(&setting.Federation.SignatureEnforced, false)() defer test.MockVariableValue(&testWebRoutes, routers.NormalRoutes())() onGiteaRun(t, func(t *testing.T, u *url.URL) { @@ -157,7 +163,7 @@ func TestActivityPubRepositoryInboxInvalid(t *testing.T) { cf, err := activitypub.GetClientFactory(db.DefaultContext) require.NoError(t, err) - c, err := cf.WithKeys(db.DefaultContext, apServerActor, apServerActor.APActorKeyID()) + c, err := cf.WithKeys(db.DefaultContext, apServerActor, apServerActor.KeyID()) require.NoError(t, err) repoInboxURL := u.JoinPath(fmt.Sprintf("/api/v1/activitypub/repository-id/%d/inbox", repositoryID)).String() diff --git a/tests/integration/api_federation_httpsig_test.go b/tests/integration/api_federation_httpsig_test.go index a7a5ae26ed..a8deaa315f 100644 --- a/tests/integration/api_federation_httpsig_test.go +++ b/tests/integration/api_federation_httpsig_test.go @@ -35,7 +35,7 @@ func TestFederationHttpSigValidation(t *testing.T) { clientFactory, err := activitypub.GetClientFactory(db.DefaultContext) require.NoError(t, err) - apClient, err := clientFactory.WithKeys(db.DefaultContext, user1, user1.APActorKeyID()) + apClient, err := clientFactory.WithKeys(db.DefaultContext, user1, user1.KeyID()) require.NoError(t, err) // Unsigned request