gitea源码

api_activitypub_person_test.go 2.9KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. // Copyright 2022 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package integration
  4. import (
  5. "fmt"
  6. "net/http"
  7. "net/http/httptest"
  8. "testing"
  9. user_model "code.gitea.io/gitea/models/user"
  10. "code.gitea.io/gitea/modules/activitypub"
  11. "code.gitea.io/gitea/modules/setting"
  12. "code.gitea.io/gitea/modules/test"
  13. "code.gitea.io/gitea/routers"
  14. "code.gitea.io/gitea/tests"
  15. ap "github.com/go-ap/activitypub"
  16. "github.com/stretchr/testify/assert"
  17. )
  18. func TestActivityPubPerson(t *testing.T) {
  19. defer tests.PrepareTestEnv(t)()
  20. defer test.MockVariableValue(&setting.Federation.Enabled, true)()
  21. defer test.MockVariableValue(&testWebRoutes, routers.NormalRoutes())()
  22. t.Run("ExistingPerson", func(t *testing.T) {
  23. defer tests.PrintCurrentTest(t)()
  24. userID := 2
  25. username := "user2"
  26. req := NewRequest(t, "GET", fmt.Sprintf("/api/v1/activitypub/user-id/%v", userID))
  27. resp := MakeRequest(t, req, http.StatusOK)
  28. body := resp.Body.Bytes()
  29. assert.Contains(t, string(body), "@context")
  30. var person ap.Person
  31. err := person.UnmarshalJSON(body)
  32. assert.NoError(t, err)
  33. assert.Equal(t, ap.PersonType, person.Type)
  34. assert.Equal(t, username, person.PreferredUsername.String())
  35. keyID := person.GetID().String()
  36. assert.Regexp(t, fmt.Sprintf("activitypub/user-id/%v$", userID), keyID)
  37. assert.Regexp(t, fmt.Sprintf("activitypub/user-id/%v/outbox$", userID), person.Outbox.GetID().String())
  38. assert.Regexp(t, fmt.Sprintf("activitypub/user-id/%v/inbox$", userID), person.Inbox.GetID().String())
  39. pubKey := person.PublicKey
  40. assert.NotNil(t, pubKey)
  41. publicKeyID := keyID + "#main-key"
  42. assert.Equal(t, pubKey.ID.String(), publicKeyID)
  43. pubKeyPem := pubKey.PublicKeyPem
  44. assert.NotNil(t, pubKeyPem)
  45. assert.Regexp(t, "^-----BEGIN PUBLIC KEY-----", pubKeyPem)
  46. })
  47. t.Run("MissingPerson", func(t *testing.T) {
  48. defer tests.PrintCurrentTest(t)()
  49. req := NewRequest(t, "GET", "/api/v1/activitypub/user-id/999999999")
  50. resp := MakeRequest(t, req, http.StatusNotFound)
  51. assert.Contains(t, resp.Body.String(), "user does not exist")
  52. })
  53. t.Run("MissingPersonInbox", func(t *testing.T) {
  54. defer tests.PrintCurrentTest(t)()
  55. srv := httptest.NewServer(testWebRoutes)
  56. defer srv.Close()
  57. defer test.MockVariableValue(&setting.AppURL, srv.URL+"/")()
  58. username1 := "user1"
  59. ctx := t.Context()
  60. user1, err := user_model.GetUserByName(ctx, username1)
  61. assert.NoError(t, err)
  62. user1url := srv.URL + "/api/v1/activitypub/user-id/1#main-key"
  63. c, err := activitypub.NewClient(t.Context(), user1, user1url)
  64. assert.NoError(t, err)
  65. user2inboxurl := srv.URL + "/api/v1/activitypub/user-id/2/inbox"
  66. // Signed request succeeds
  67. resp, err := c.Post([]byte{}, user2inboxurl)
  68. assert.NoError(t, err)
  69. assert.Equal(t, http.StatusNoContent, resp.StatusCode)
  70. // Unsigned request fails
  71. req := NewRequest(t, "POST", user2inboxurl)
  72. MakeRequest(t, req, http.StatusInternalServerError)
  73. })
  74. }