You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

api_activitypub_person_test.go 3.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. // Copyright 2022 The Gitea Authors. All rights reserved.
  2. // Use of this source code is governed by a MIT-style
  3. // license that can be found in the LICENSE file.
  4. package integrations
  5. import (
  6. "context"
  7. "fmt"
  8. "net/http"
  9. "net/http/httptest"
  10. "net/url"
  11. "testing"
  12. user_model "code.gitea.io/gitea/models/user"
  13. "code.gitea.io/gitea/modules/activitypub"
  14. "code.gitea.io/gitea/modules/setting"
  15. "code.gitea.io/gitea/routers"
  16. ap "github.com/go-ap/activitypub"
  17. "github.com/stretchr/testify/assert"
  18. )
  19. func TestActivityPubPerson(t *testing.T) {
  20. setting.Federation.Enabled = true
  21. c = routers.NormalRoutes()
  22. defer func() {
  23. setting.Federation.Enabled = false
  24. c = routers.NormalRoutes()
  25. }()
  26. onGiteaRun(t, func(*testing.T, *url.URL) {
  27. username := "user2"
  28. req := NewRequestf(t, "GET", fmt.Sprintf("/api/v1/activitypub/user/%s", username))
  29. resp := MakeRequest(t, req, http.StatusOK)
  30. body := resp.Body.Bytes()
  31. assert.Contains(t, string(body), "@context")
  32. var person ap.Person
  33. err := person.UnmarshalJSON(body)
  34. assert.NoError(t, err)
  35. assert.Equal(t, ap.PersonType, person.Type)
  36. assert.Equal(t, username, person.PreferredUsername.String())
  37. keyID := person.GetID().String()
  38. assert.Regexp(t, fmt.Sprintf("activitypub/user/%s$", username), keyID)
  39. assert.Regexp(t, fmt.Sprintf("activitypub/user/%s/outbox$", username), person.Outbox.GetID().String())
  40. assert.Regexp(t, fmt.Sprintf("activitypub/user/%s/inbox$", username), person.Inbox.GetID().String())
  41. pubKey := person.PublicKey
  42. assert.NotNil(t, pubKey)
  43. publicKeyID := keyID + "#main-key"
  44. assert.Equal(t, pubKey.ID.String(), publicKeyID)
  45. pubKeyPem := pubKey.PublicKeyPem
  46. assert.NotNil(t, pubKeyPem)
  47. assert.Regexp(t, "^-----BEGIN PUBLIC KEY-----", pubKeyPem)
  48. })
  49. }
  50. func TestActivityPubMissingPerson(t *testing.T) {
  51. setting.Federation.Enabled = true
  52. c = routers.NormalRoutes()
  53. defer func() {
  54. setting.Federation.Enabled = false
  55. c = routers.NormalRoutes()
  56. }()
  57. onGiteaRun(t, func(*testing.T, *url.URL) {
  58. req := NewRequestf(t, "GET", "/api/v1/activitypub/user/nonexistentuser")
  59. resp := MakeRequest(t, req, http.StatusNotFound)
  60. assert.Contains(t, resp.Body.String(), "user redirect does not exist")
  61. })
  62. }
  63. func TestActivityPubPersonInbox(t *testing.T) {
  64. setting.Federation.Enabled = true
  65. c = routers.NormalRoutes()
  66. defer func() {
  67. setting.Federation.Enabled = false
  68. c = routers.NormalRoutes()
  69. }()
  70. srv := httptest.NewServer(c)
  71. defer srv.Close()
  72. onGiteaRun(t, func(*testing.T, *url.URL) {
  73. appURL := setting.AppURL
  74. setting.AppURL = srv.URL
  75. defer func() {
  76. setting.Database.LogSQL = false
  77. setting.AppURL = appURL
  78. }()
  79. username1 := "user1"
  80. ctx := context.Background()
  81. user1, err := user_model.GetUserByName(ctx, username1)
  82. assert.NoError(t, err)
  83. user1url := fmt.Sprintf("%s/api/v1/activitypub/user/%s#main-key", srv.URL, username1)
  84. c, err := activitypub.NewClient(user1, user1url)
  85. assert.NoError(t, err)
  86. username2 := "user2"
  87. user2inboxurl := fmt.Sprintf("%s/api/v1/activitypub/user/%s/inbox", srv.URL, username2)
  88. // Signed request succeeds
  89. resp, err := c.Post([]byte{}, user2inboxurl)
  90. assert.NoError(t, err)
  91. assert.Equal(t, http.StatusNoContent, resp.StatusCode)
  92. // Unsigned request fails
  93. req := NewRequest(t, "POST", user2inboxurl)
  94. MakeRequest(t, req, http.StatusInternalServerError)
  95. })
  96. }