diff options
Diffstat (limited to 'internal')
29 files changed, 167 insertions, 192 deletions
diff --git a/internal/api/client/account/account_test.go b/internal/api/client/account/account_test.go index 39d942ee3..ceb15c7a2 100644 --- a/internal/api/client/account/account_test.go +++ b/internal/api/client/account/account_test.go @@ -82,7 +82,7 @@ func (suite *AccountStandardTestSuite) TearDownTest() { } func (suite *AccountStandardTestSuite) newContext(recorder *httptest.ResponseRecorder, requestMethod string, requestBody []byte, requestPath string, bodyContentType string) *gin.Context { - ctx, _ := gin.CreateTestContext(recorder) + ctx, _ := testrig.CreateGinTestContext(recorder, nil) ctx.Set(oauth.SessionAuthorizedAccount, suite.testAccounts["local_account_1"]) ctx.Set(oauth.SessionAuthorizedToken, oauth.DBTokenToToken(suite.testTokens["local_account_1"])) diff --git a/internal/api/client/account/block_test.go b/internal/api/client/account/block_test.go index fcbe1ec39..9c75330aa 100644 --- a/internal/api/client/account/block_test.go +++ b/internal/api/client/account/block_test.go @@ -31,6 +31,7 @@ import ( "github.com/stretchr/testify/suite" "github.com/superseriousbusiness/gotosocial/internal/api/client/account" "github.com/superseriousbusiness/gotosocial/internal/oauth" + "github.com/superseriousbusiness/gotosocial/testrig" ) type BlockTestSuite struct { @@ -40,7 +41,7 @@ type BlockTestSuite struct { func (suite *BlockTestSuite) TestBlockSelf() { testAcct := suite.testAccounts["local_account_1"] recorder := httptest.NewRecorder() - ctx, _ := gin.CreateTestContext(recorder) + ctx, _ := testrig.CreateGinTestContext(recorder, nil) ctx.Set(oauth.SessionAuthorizedAccount, testAcct) ctx.Set(oauth.SessionAuthorizedToken, oauth.DBTokenToToken(suite.testTokens["local_account_1"])) ctx.Set(oauth.SessionAuthorizedApplication, suite.testApplications["application_1"]) diff --git a/internal/api/client/account/follow_test.go b/internal/api/client/account/follow_test.go index 478330c83..fad67b185 100644 --- a/internal/api/client/account/follow_test.go +++ b/internal/api/client/account/follow_test.go @@ -31,6 +31,7 @@ import ( "github.com/stretchr/testify/suite" "github.com/superseriousbusiness/gotosocial/internal/api/client/account" "github.com/superseriousbusiness/gotosocial/internal/oauth" + "github.com/superseriousbusiness/gotosocial/testrig" ) type FollowTestSuite struct { @@ -40,7 +41,7 @@ type FollowTestSuite struct { func (suite *FollowTestSuite) TestFollowSelf() { testAcct := suite.testAccounts["local_account_1"] recorder := httptest.NewRecorder() - ctx, _ := gin.CreateTestContext(recorder) + ctx, _ := testrig.CreateGinTestContext(recorder, nil) ctx.Set(oauth.SessionAuthorizedAccount, testAcct) ctx.Set(oauth.SessionAuthorizedToken, oauth.DBTokenToToken(suite.testTokens["local_account_1"])) ctx.Set(oauth.SessionAuthorizedApplication, suite.testApplications["application_1"]) diff --git a/internal/api/client/admin/admin_test.go b/internal/api/client/admin/admin_test.go index c5035c798..5017afd05 100644 --- a/internal/api/client/admin/admin_test.go +++ b/internal/api/client/admin/admin_test.go @@ -100,7 +100,7 @@ func (suite *AdminStandardTestSuite) TearDownTest() { } func (suite *AdminStandardTestSuite) newContext(recorder *httptest.ResponseRecorder, requestMethod string, requestBody []byte, requestPath string, bodyContentType string) *gin.Context { - ctx, _ := gin.CreateTestContext(recorder) + ctx, _ := testrig.CreateGinTestContext(recorder, nil) ctx.Set(oauth.SessionAuthorizedAccount, suite.testAccounts["admin_account"]) ctx.Set(oauth.SessionAuthorizedToken, oauth.DBTokenToToken(suite.testTokens["admin_account"])) diff --git a/internal/api/client/auth/auth_test.go b/internal/api/client/auth/auth_test.go index 188c40b3a..d84db058a 100644 --- a/internal/api/client/auth/auth_test.go +++ b/internal/api/client/auth/auth_test.go @@ -111,7 +111,7 @@ func (suite *AuthStandardTestSuite) TearDownTest() { func (suite *AuthStandardTestSuite) newContext(requestMethod string, requestPath string, requestBody []byte, bodyContentType string) (*gin.Context, *httptest.ResponseRecorder) { // create the recorder and gin test context recorder := httptest.NewRecorder() - ctx, engine := gin.CreateTestContext(recorder) + ctx, engine := testrig.CreateGinTestContext(recorder, nil) // load templates into the engine testrig.ConfigureTemplatesWithGin(engine, "../../../../web/template") diff --git a/internal/api/client/fileserver/servefile_test.go b/internal/api/client/fileserver/servefile_test.go index a36a79a58..e918a9026 100644 --- a/internal/api/client/fileserver/servefile_test.go +++ b/internal/api/client/fileserver/servefile_test.go @@ -126,7 +126,7 @@ func (suite *ServeFileTestSuite) TestServeOriginalFileSuccessful() { suite.NotNil(targetAttachment) recorder := httptest.NewRecorder() - ctx, _ := gin.CreateTestContext(recorder) + ctx, _ := testrig.CreateGinTestContext(recorder, nil) ctx.Request = httptest.NewRequest(http.MethodGet, targetAttachment.URL, nil) ctx.Request.Header.Set("accept", "*/*") @@ -172,7 +172,7 @@ func (suite *ServeFileTestSuite) TestServeSmallFileSuccessful() { suite.NotNil(targetAttachment) recorder := httptest.NewRecorder() - ctx, _ := gin.CreateTestContext(recorder) + ctx, _ := testrig.CreateGinTestContext(recorder, nil) ctx.Request = httptest.NewRequest(http.MethodGet, targetAttachment.Thumbnail.URL, nil) ctx.Request.Header.Set("accept", "*/*") diff --git a/internal/api/client/followrequest/followrequest_test.go b/internal/api/client/followrequest/followrequest_test.go index e98d75c77..f9a14d261 100644 --- a/internal/api/client/followrequest/followrequest_test.go +++ b/internal/api/client/followrequest/followrequest_test.go @@ -96,7 +96,7 @@ func (suite *FollowRequestStandardTestSuite) TearDownTest() { } func (suite *FollowRequestStandardTestSuite) newContext(recorder *httptest.ResponseRecorder, requestMethod string, requestBody []byte, requestPath string, bodyContentType string) *gin.Context { - ctx, _ := gin.CreateTestContext(recorder) + ctx, _ := testrig.CreateGinTestContext(recorder, nil) ctx.Set(oauth.SessionAuthorizedAccount, suite.testAccounts["local_account_1"]) ctx.Set(oauth.SessionAuthorizedToken, oauth.DBTokenToToken(suite.testTokens["local_account_1"])) diff --git a/internal/api/client/instance/instance_test.go b/internal/api/client/instance/instance_test.go index 645e70474..efdf86523 100644 --- a/internal/api/client/instance/instance_test.go +++ b/internal/api/client/instance/instance_test.go @@ -98,27 +98,29 @@ func (suite *InstanceStandardTestSuite) TearDownTest() { testrig.StandardStorageTeardown(suite.storage) } -func (suite *InstanceStandardTestSuite) newContext(recorder *httptest.ResponseRecorder, requestMethod string, requestBody []byte, requestPath string, bodyContentType string) *gin.Context { - ctx, _ := gin.CreateTestContext(recorder) - - ctx.Set(oauth.SessionAuthorizedAccount, suite.testAccounts["admin_account"]) - ctx.Set(oauth.SessionAuthorizedToken, oauth.DBTokenToToken(suite.testTokens["admin_account"])) - ctx.Set(oauth.SessionAuthorizedApplication, suite.testApplications["admin_account"]) - ctx.Set(oauth.SessionAuthorizedUser, suite.testUsers["admin_account"]) - +func (suite *InstanceStandardTestSuite) newContext(recorder *httptest.ResponseRecorder, method string, path string, body []byte, contentType string, auth bool) *gin.Context { protocol := config.GetProtocol() host := config.GetHost() baseURI := fmt.Sprintf("%s://%s", protocol, host) - requestURI := fmt.Sprintf("%s/%s", baseURI, requestPath) + requestURI := fmt.Sprintf("%s/%s", baseURI, path) - ctx.Request = httptest.NewRequest(requestMethod, requestURI, bytes.NewReader(requestBody)) // the endpoint we're hitting + req := httptest.NewRequest(method, requestURI, bytes.NewReader(body)) // the endpoint we're hitting - if bodyContentType != "" { - ctx.Request.Header.Set("Content-Type", bodyContentType) + if contentType != "" { + req.Header.Set("Content-Type", contentType) } - ctx.Request.Header.Set("accept", "application/json") + req.Header.Set("accept", "application/json") + + ctx, _ := testrig.CreateGinTestContext(recorder, req) + + if auth { + ctx.Set(oauth.SessionAuthorizedAccount, suite.testAccounts["admin_account"]) + ctx.Set(oauth.SessionAuthorizedToken, oauth.DBTokenToToken(suite.testTokens["admin_account"])) + ctx.Set(oauth.SessionAuthorizedApplication, suite.testApplications["admin_account"]) + ctx.Set(oauth.SessionAuthorizedUser, suite.testUsers["admin_account"]) + } return ctx } diff --git a/internal/api/client/instance/instancepatch_test.go b/internal/api/client/instance/instancepatch_test.go index 1aec421e1..864eb9965 100644 --- a/internal/api/client/instance/instancepatch_test.go +++ b/internal/api/client/instance/instancepatch_test.go @@ -49,7 +49,7 @@ func (suite *InstancePatchTestSuite) TestInstancePatch1() { // set up the request recorder := httptest.NewRecorder() - ctx := suite.newContext(recorder, http.MethodPatch, bodyBytes, instance.InstanceInformationPath, w.FormDataContentType()) + ctx := suite.newContext(recorder, http.MethodPatch, instance.InstanceInformationPath, bodyBytes, w.FormDataContentType(), true) // call the handler suite.instanceModule.InstanceUpdatePATCHHandler(ctx) @@ -79,7 +79,7 @@ func (suite *InstancePatchTestSuite) TestInstancePatch2() { // set up the request recorder := httptest.NewRecorder() - ctx := suite.newContext(recorder, http.MethodPatch, bodyBytes, instance.InstanceInformationPath, w.FormDataContentType()) + ctx := suite.newContext(recorder, http.MethodPatch, instance.InstanceInformationPath, bodyBytes, w.FormDataContentType(), true) // call the handler suite.instanceModule.InstanceUpdatePATCHHandler(ctx) @@ -109,7 +109,7 @@ func (suite *InstancePatchTestSuite) TestInstancePatch3() { // set up the request recorder := httptest.NewRecorder() - ctx := suite.newContext(recorder, http.MethodPatch, bodyBytes, instance.InstanceInformationPath, w.FormDataContentType()) + ctx := suite.newContext(recorder, http.MethodPatch, instance.InstanceInformationPath, bodyBytes, w.FormDataContentType(), true) // call the handler suite.instanceModule.InstanceUpdatePATCHHandler(ctx) @@ -137,7 +137,7 @@ func (suite *InstancePatchTestSuite) TestInstancePatch4() { // set up the request recorder := httptest.NewRecorder() - ctx := suite.newContext(recorder, http.MethodPatch, bodyBytes, instance.InstanceInformationPath, w.FormDataContentType()) + ctx := suite.newContext(recorder, http.MethodPatch, instance.InstanceInformationPath, bodyBytes, w.FormDataContentType(), true) // call the handler suite.instanceModule.InstanceUpdatePATCHHandler(ctx) @@ -166,7 +166,7 @@ func (suite *InstancePatchTestSuite) TestInstancePatch5() { // set up the request recorder := httptest.NewRecorder() - ctx := suite.newContext(recorder, http.MethodPatch, bodyBytes, instance.InstanceInformationPath, w.FormDataContentType()) + ctx := suite.newContext(recorder, http.MethodPatch, instance.InstanceInformationPath, bodyBytes, w.FormDataContentType(), true) ctx.Set(oauth.SessionAuthorizedAccount, suite.testAccounts["local_account_1"]) ctx.Set(oauth.SessionAuthorizedToken, oauth.DBTokenToToken(suite.testTokens["local_account_1"])) @@ -200,7 +200,7 @@ func (suite *InstancePatchTestSuite) TestInstancePatch6() { // set up the request recorder := httptest.NewRecorder() - ctx := suite.newContext(recorder, http.MethodPatch, bodyBytes, instance.InstanceInformationPath, w.FormDataContentType()) + ctx := suite.newContext(recorder, http.MethodPatch, instance.InstanceInformationPath, bodyBytes, w.FormDataContentType(), true) // call the handler suite.instanceModule.InstanceUpdatePATCHHandler(ctx) @@ -230,7 +230,7 @@ func (suite *InstancePatchTestSuite) TestInstancePatch7() { // set up the request recorder := httptest.NewRecorder() - ctx := suite.newContext(recorder, http.MethodPatch, bodyBytes, instance.InstanceInformationPath, w.FormDataContentType()) + ctx := suite.newContext(recorder, http.MethodPatch, instance.InstanceInformationPath, bodyBytes, w.FormDataContentType(), true) // call the handler suite.instanceModule.InstanceUpdatePATCHHandler(ctx) diff --git a/internal/api/client/instance/instancepeersget_test.go b/internal/api/client/instance/instancepeersget_test.go index cb35a9e50..48fb42a73 100644 --- a/internal/api/client/instance/instancepeersget_test.go +++ b/internal/api/client/instance/instancepeersget_test.go @@ -26,7 +26,7 @@ import ( "net/http/httptest" "testing" - "github.com/gin-gonic/gin" + "github.com/gin-gonic/gin/render" "github.com/stretchr/testify/suite" "github.com/superseriousbusiness/gotosocial/internal/api/client/instance" "github.com/superseriousbusiness/gotosocial/internal/config" @@ -40,7 +40,8 @@ type InstancePeersGetTestSuite struct { func (suite *InstancePeersGetTestSuite) TestInstancePeersGetNoParams() { recorder := httptest.NewRecorder() - ctx, _ := gin.CreateTestContext(recorder) + ctx, r := testrig.CreateGinTestContext(recorder, nil) + r.HTMLRender = render.HTMLDebug{} baseURI := fmt.Sprintf("%s://%s", config.GetProtocol(), config.GetHost()) requestURI := fmt.Sprintf("%s/%s", baseURI, instance.InstancePeersPath) @@ -63,11 +64,9 @@ func (suite *InstancePeersGetTestSuite) TestInstancePeersGetNoParamsUnauthorized config.SetInstanceExposePeers(false) recorder := httptest.NewRecorder() - ctx, _ := gin.CreateTestContext(recorder) - baseURI := fmt.Sprintf("%s://%s", config.GetProtocol(), config.GetHost()) requestURI := fmt.Sprintf("%s/%s", baseURI, instance.InstancePeersPath) - ctx.Request = httptest.NewRequest(http.MethodGet, requestURI, nil) + ctx := suite.newContext(recorder, http.MethodGet, requestURI, nil, "", false) suite.instanceModule.InstancePeersGETHandler(ctx) @@ -88,7 +87,7 @@ func (suite *InstancePeersGetTestSuite) TestInstancePeersGetNoParamsAuthorized() recorder := httptest.NewRecorder() baseURI := fmt.Sprintf("%s://%s", config.GetProtocol(), config.GetHost()) requestURI := fmt.Sprintf("%s/%s", baseURI, instance.InstancePeersPath) - ctx := suite.newContext(recorder, http.MethodGet, []byte{}, requestURI, "") + ctx := suite.newContext(recorder, http.MethodGet, requestURI, nil, "", true) suite.instanceModule.InstancePeersGETHandler(ctx) @@ -105,11 +104,9 @@ func (suite *InstancePeersGetTestSuite) TestInstancePeersGetNoParamsAuthorized() func (suite *InstancePeersGetTestSuite) TestInstancePeersGetOnlySuspended() { recorder := httptest.NewRecorder() - ctx, _ := gin.CreateTestContext(recorder) - baseURI := fmt.Sprintf("%s://%s", config.GetProtocol(), config.GetHost()) requestURI := fmt.Sprintf("%s/%s?filter=suspended", baseURI, instance.InstancePeersPath) - ctx.Request = httptest.NewRequest(http.MethodGet, requestURI, nil) + ctx := suite.newContext(recorder, http.MethodGet, requestURI, nil, "", false) suite.instanceModule.InstancePeersGETHandler(ctx) @@ -128,11 +125,9 @@ func (suite *InstancePeersGetTestSuite) TestInstancePeersGetOnlySuspendedUnautho config.SetInstanceExposeSuspended(false) recorder := httptest.NewRecorder() - ctx, _ := gin.CreateTestContext(recorder) - baseURI := fmt.Sprintf("%s://%s", config.GetProtocol(), config.GetHost()) requestURI := fmt.Sprintf("%s/%s?filter=suspended", baseURI, instance.InstancePeersPath) - ctx.Request = httptest.NewRequest(http.MethodGet, requestURI, nil) + ctx := suite.newContext(recorder, http.MethodGet, requestURI, nil, "", false) suite.instanceModule.InstancePeersGETHandler(ctx) @@ -153,7 +148,7 @@ func (suite *InstancePeersGetTestSuite) TestInstancePeersGetOnlySuspendedAuthori recorder := httptest.NewRecorder() baseURI := fmt.Sprintf("%s://%s", config.GetProtocol(), config.GetHost()) requestURI := fmt.Sprintf("%s/%s?filter=suspended", baseURI, instance.InstancePeersPath) - ctx := suite.newContext(recorder, http.MethodGet, []byte{}, requestURI, "") + ctx := suite.newContext(recorder, http.MethodGet, requestURI, nil, "", true) suite.instanceModule.InstancePeersGETHandler(ctx) @@ -170,11 +165,9 @@ func (suite *InstancePeersGetTestSuite) TestInstancePeersGetOnlySuspendedAuthori func (suite *InstancePeersGetTestSuite) TestInstancePeersGetAll() { recorder := httptest.NewRecorder() - ctx, _ := gin.CreateTestContext(recorder) - baseURI := fmt.Sprintf("%s://%s", config.GetProtocol(), config.GetHost()) requestURI := fmt.Sprintf("%s/%s?filter=suspended,open", baseURI, instance.InstancePeersPath) - ctx.Request = httptest.NewRequest(http.MethodGet, requestURI, nil) + ctx := suite.newContext(recorder, http.MethodGet, requestURI, nil, "", false) suite.instanceModule.InstancePeersGETHandler(ctx) @@ -202,11 +195,9 @@ func (suite *InstancePeersGetTestSuite) TestInstancePeersGetAllWithObfuscated() suite.NoError(err) recorder := httptest.NewRecorder() - ctx, _ := gin.CreateTestContext(recorder) - baseURI := fmt.Sprintf("%s://%s", config.GetProtocol(), config.GetHost()) requestURI := fmt.Sprintf("%s/%s?filter=suspended,open", baseURI, instance.InstancePeersPath) - ctx.Request = httptest.NewRequest(http.MethodGet, requestURI, nil) + ctx := suite.newContext(recorder, http.MethodGet, requestURI, nil, "", false) suite.instanceModule.InstancePeersGETHandler(ctx) @@ -223,11 +214,9 @@ func (suite *InstancePeersGetTestSuite) TestInstancePeersGetAllWithObfuscated() func (suite *InstancePeersGetTestSuite) TestInstancePeersGetFunkyParams() { recorder := httptest.NewRecorder() - ctx, _ := gin.CreateTestContext(recorder) - baseURI := fmt.Sprintf("%s://%s", config.GetProtocol(), config.GetHost()) requestURI := fmt.Sprintf("%s/%s?filter=aaaaaaaaaaaaaaaaa,open", baseURI, instance.InstancePeersPath) - ctx.Request = httptest.NewRequest(http.MethodGet, requestURI, nil) + ctx := suite.newContext(recorder, http.MethodGet, requestURI, nil, "", true) suite.instanceModule.InstancePeersGETHandler(ctx) diff --git a/internal/api/client/media/mediacreate_test.go b/internal/api/client/media/mediacreate_test.go index 153cde90f..935fc2970 100644 --- a/internal/api/client/media/mediacreate_test.go +++ b/internal/api/client/media/mediacreate_test.go @@ -30,7 +30,6 @@ import ( "net/http/httptest" "testing" - "github.com/gin-gonic/gin" "github.com/sirupsen/logrus" "github.com/stretchr/testify/suite" mediamodule "github.com/superseriousbusiness/gotosocial/internal/api/client/media" @@ -130,7 +129,7 @@ func (suite *MediaCreateTestSuite) TestMediaCreateSuccessful() { t := suite.testTokens["local_account_1"] oauthToken := oauth.DBTokenToToken(t) recorder := httptest.NewRecorder() - ctx, _ := gin.CreateTestContext(recorder) + ctx, _ := testrig.CreateGinTestContext(recorder, nil) ctx.Set(oauth.SessionAuthorizedApplication, suite.testApplications["application_1"]) ctx.Set(oauth.SessionAuthorizedToken, oauthToken) ctx.Set(oauth.SessionAuthorizedUser, suite.testUsers["local_account_1"]) @@ -218,7 +217,7 @@ func (suite *MediaCreateTestSuite) TestMediaCreateLongDescription() { t := suite.testTokens["local_account_1"] oauthToken := oauth.DBTokenToToken(t) recorder := httptest.NewRecorder() - ctx, _ := gin.CreateTestContext(recorder) + ctx, _ := testrig.CreateGinTestContext(recorder, nil) ctx.Set(oauth.SessionAuthorizedApplication, suite.testApplications["application_1"]) ctx.Set(oauth.SessionAuthorizedToken, oauthToken) ctx.Set(oauth.SessionAuthorizedUser, suite.testUsers["local_account_1"]) @@ -265,7 +264,7 @@ func (suite *MediaCreateTestSuite) TestMediaCreateTooShortDescription() { t := suite.testTokens["local_account_1"] oauthToken := oauth.DBTokenToToken(t) recorder := httptest.NewRecorder() - ctx, _ := gin.CreateTestContext(recorder) + ctx, _ := testrig.CreateGinTestContext(recorder, nil) ctx.Set(oauth.SessionAuthorizedApplication, suite.testApplications["application_1"]) ctx.Set(oauth.SessionAuthorizedToken, oauthToken) ctx.Set(oauth.SessionAuthorizedUser, suite.testUsers["local_account_1"]) diff --git a/internal/api/client/media/mediaupdate_test.go b/internal/api/client/media/mediaupdate_test.go index 4457426de..deb93d83c 100644 --- a/internal/api/client/media/mediaupdate_test.go +++ b/internal/api/client/media/mediaupdate_test.go @@ -130,7 +130,7 @@ func (suite *MediaUpdateTestSuite) TestUpdateImage() { t := suite.testTokens["local_account_1"] oauthToken := oauth.DBTokenToToken(t) recorder := httptest.NewRecorder() - ctx, _ := gin.CreateTestContext(recorder) + ctx, _ := testrig.CreateGinTestContext(recorder, nil) ctx.Set(oauth.SessionAuthorizedApplication, suite.testApplications["application_1"]) ctx.Set(oauth.SessionAuthorizedToken, oauthToken) ctx.Set(oauth.SessionAuthorizedUser, suite.testUsers["local_account_1"]) @@ -195,7 +195,7 @@ func (suite *MediaUpdateTestSuite) TestUpdateImageShortDescription() { t := suite.testTokens["local_account_1"] oauthToken := oauth.DBTokenToToken(t) recorder := httptest.NewRecorder() - ctx, _ := gin.CreateTestContext(recorder) + ctx, _ := testrig.CreateGinTestContext(recorder, nil) ctx.Set(oauth.SessionAuthorizedApplication, suite.testApplications["application_1"]) ctx.Set(oauth.SessionAuthorizedToken, oauthToken) ctx.Set(oauth.SessionAuthorizedUser, suite.testUsers["local_account_1"]) diff --git a/internal/api/client/status/statusboost_test.go b/internal/api/client/status/statusboost_test.go index c8d33f0f8..5b4b1b3cd 100644 --- a/internal/api/client/status/statusboost_test.go +++ b/internal/api/client/status/statusboost_test.go @@ -31,6 +31,7 @@ import ( "github.com/superseriousbusiness/gotosocial/internal/api/model" "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" "github.com/superseriousbusiness/gotosocial/internal/oauth" + "github.com/superseriousbusiness/gotosocial/testrig" ) type StatusBoostTestSuite struct { @@ -38,7 +39,6 @@ type StatusBoostTestSuite struct { } func (suite *StatusBoostTestSuite) TestPostBoost() { - t := suite.testTokens["local_account_1"] oauthToken := oauth.DBTokenToToken(t) @@ -46,7 +46,7 @@ func (suite *StatusBoostTestSuite) TestPostBoost() { // setup recorder := httptest.NewRecorder() - ctx, _ := gin.CreateTestContext(recorder) + ctx, _ := testrig.CreateGinTestContext(recorder, nil) ctx.Set(oauth.SessionAuthorizedApplication, suite.testApplications["application_1"]) ctx.Set(oauth.SessionAuthorizedToken, oauthToken) ctx.Set(oauth.SessionAuthorizedUser, suite.testUsers["local_account_1"]) @@ -112,7 +112,7 @@ func (suite *StatusBoostTestSuite) TestPostBoostOwnFollowersOnly() { testUser := suite.testUsers["local_account_1"] recorder := httptest.NewRecorder() - ctx, _ := gin.CreateTestContext(recorder) + ctx, _ := testrig.CreateGinTestContext(recorder, nil) ctx.Set(oauth.SessionAuthorizedApplication, suite.testApplications["application_1"]) ctx.Set(oauth.SessionAuthorizedToken, oauthToken) ctx.Set(oauth.SessionAuthorizedUser, testUser) @@ -170,7 +170,6 @@ func (suite *StatusBoostTestSuite) TestPostBoostOwnFollowersOnly() { // try to boost a status that's not boostable func (suite *StatusBoostTestSuite) TestPostUnboostable() { - t := suite.testTokens["local_account_1"] oauthToken := oauth.DBTokenToToken(t) @@ -178,7 +177,7 @@ func (suite *StatusBoostTestSuite) TestPostUnboostable() { // setup recorder := httptest.NewRecorder() - ctx, _ := gin.CreateTestContext(recorder) + ctx, _ := testrig.CreateGinTestContext(recorder, nil) ctx.Set(oauth.SessionAuthorizedApplication, suite.testApplications["application_1"]) ctx.Set(oauth.SessionAuthorizedToken, oauthToken) ctx.Set(oauth.SessionAuthorizedUser, suite.testUsers["local_account_1"]) @@ -209,7 +208,6 @@ func (suite *StatusBoostTestSuite) TestPostUnboostable() { // try to boost a status that's not visible to the user func (suite *StatusBoostTestSuite) TestPostNotVisible() { - // stop local_account_2 following zork err := suite.db.DeleteByID(context.Background(), suite.testFollows["local_account_2_local_account_1"].ID, >smodel.Follow{}) suite.NoError(err) @@ -221,7 +219,7 @@ func (suite *StatusBoostTestSuite) TestPostNotVisible() { // setup recorder := httptest.NewRecorder() - ctx, _ := gin.CreateTestContext(recorder) + ctx, _ := testrig.CreateGinTestContext(recorder, nil) ctx.Set(oauth.SessionAuthorizedApplication, suite.testApplications["application_1"]) ctx.Set(oauth.SessionAuthorizedToken, oauthToken) ctx.Set(oauth.SessionAuthorizedUser, suite.testUsers["local_account_2"]) diff --git a/internal/api/client/status/statuscreate_test.go b/internal/api/client/status/statuscreate_test.go index 206dc5cfc..c6c9b4dab 100644 --- a/internal/api/client/status/statuscreate_test.go +++ b/internal/api/client/status/statuscreate_test.go @@ -28,7 +28,6 @@ import ( "net/url" "testing" - "github.com/gin-gonic/gin" "github.com/stretchr/testify/suite" "github.com/superseriousbusiness/gotosocial/internal/api/client/status" "github.com/superseriousbusiness/gotosocial/internal/api/model" @@ -52,13 +51,12 @@ https://docs.gotosocial.org/en/latest/user_guide/posts/#links // Post a new status with some custom visibility settings func (suite *StatusCreateTestSuite) TestPostNewStatus() { - t := suite.testTokens["local_account_1"] oauthToken := oauth.DBTokenToToken(t) // setup recorder := httptest.NewRecorder() - ctx, _ := gin.CreateTestContext(recorder) + ctx, _ := testrig.CreateGinTestContext(recorder, nil) ctx.Set(oauth.SessionAuthorizedApplication, suite.testApplications["application_1"]) ctx.Set(oauth.SessionAuthorizedToken, oauthToken) ctx.Set(oauth.SessionAuthorizedUser, suite.testUsers["local_account_1"]) @@ -108,7 +106,6 @@ func (suite *StatusCreateTestSuite) TestPostNewStatus() { // mention an account that is not yet known to the instance -- it should be looked up and put in the db func (suite *StatusCreateTestSuite) TestMentionUnknownAccount() { - // first remove remote account 1 from the database so it gets looked up again remoteAccount := suite.testAccounts["remote_account_1"] if err := suite.db.DeleteByID(context.Background(), remoteAccount.ID, >smodel.Account{}); err != nil { @@ -120,7 +117,7 @@ func (suite *StatusCreateTestSuite) TestMentionUnknownAccount() { // setup recorder := httptest.NewRecorder() - ctx, _ := gin.CreateTestContext(recorder) + ctx, _ := testrig.CreateGinTestContext(recorder, nil) ctx.Set(oauth.SessionAuthorizedApplication, suite.testApplications["application_1"]) ctx.Set(oauth.SessionAuthorizedToken, oauthToken) ctx.Set(oauth.SessionAuthorizedUser, suite.testUsers["local_account_1"]) @@ -150,13 +147,12 @@ func (suite *StatusCreateTestSuite) TestMentionUnknownAccount() { } func (suite *StatusCreateTestSuite) TestPostAnotherNewStatus() { - t := suite.testTokens["local_account_1"] oauthToken := oauth.DBTokenToToken(t) // setup recorder := httptest.NewRecorder() - ctx, _ := gin.CreateTestContext(recorder) + ctx, _ := testrig.CreateGinTestContext(recorder, nil) ctx.Set(oauth.SessionAuthorizedApplication, suite.testApplications["application_1"]) ctx.Set(oauth.SessionAuthorizedToken, oauthToken) ctx.Set(oauth.SessionAuthorizedUser, suite.testUsers["local_account_1"]) @@ -186,13 +182,12 @@ func (suite *StatusCreateTestSuite) TestPostAnotherNewStatus() { } func (suite *StatusCreateTestSuite) TestPostNewStatusWithEmoji() { - t := suite.testTokens["local_account_1"] oauthToken := oauth.DBTokenToToken(t) // setup recorder := httptest.NewRecorder() - ctx, _ := gin.CreateTestContext(recorder) + ctx, _ := testrig.CreateGinTestContext(recorder, nil) ctx.Set(oauth.SessionAuthorizedApplication, suite.testApplications["application_1"]) ctx.Set(oauth.SessionAuthorizedToken, oauthToken) ctx.Set(oauth.SessionAuthorizedUser, suite.testUsers["local_account_1"]) @@ -234,7 +229,7 @@ func (suite *StatusCreateTestSuite) TestReplyToNonexistentStatus() { // setup recorder := httptest.NewRecorder() - ctx, _ := gin.CreateTestContext(recorder) + ctx, _ := testrig.CreateGinTestContext(recorder, nil) ctx.Set(oauth.SessionAuthorizedApplication, suite.testApplications["application_1"]) ctx.Set(oauth.SessionAuthorizedToken, oauthToken) ctx.Set(oauth.SessionAuthorizedUser, suite.testUsers["local_account_1"]) @@ -266,7 +261,7 @@ func (suite *StatusCreateTestSuite) TestReplyToLocalStatus() { // setup recorder := httptest.NewRecorder() - ctx, _ := gin.CreateTestContext(recorder) + ctx, _ := testrig.CreateGinTestContext(recorder, nil) ctx.Set(oauth.SessionAuthorizedApplication, suite.testApplications["application_1"]) ctx.Set(oauth.SessionAuthorizedToken, oauthToken) ctx.Set(oauth.SessionAuthorizedUser, suite.testUsers["local_account_1"]) @@ -309,7 +304,7 @@ func (suite *StatusCreateTestSuite) TestAttachNewMediaSuccess() { // setup recorder := httptest.NewRecorder() - ctx, _ := gin.CreateTestContext(recorder) + ctx, _ := testrig.CreateGinTestContext(recorder, nil) ctx.Set(oauth.SessionAuthorizedApplication, suite.testApplications["application_1"]) ctx.Set(oauth.SessionAuthorizedToken, oauthToken) ctx.Set(oauth.SessionAuthorizedUser, suite.testUsers["local_account_1"]) diff --git a/internal/api/client/status/statusfave_test.go b/internal/api/client/status/statusfave_test.go index 5b10ba9b3..da5d2a48a 100644 --- a/internal/api/client/status/statusfave_test.go +++ b/internal/api/client/status/statusfave_test.go @@ -33,6 +33,7 @@ import ( "github.com/superseriousbusiness/gotosocial/internal/api/client/status" "github.com/superseriousbusiness/gotosocial/internal/api/model" "github.com/superseriousbusiness/gotosocial/internal/oauth" + "github.com/superseriousbusiness/gotosocial/testrig" ) type StatusFaveTestSuite struct { @@ -41,7 +42,6 @@ type StatusFaveTestSuite struct { // fave a status func (suite *StatusFaveTestSuite) TestPostFave() { - t := suite.testTokens["local_account_1"] oauthToken := oauth.DBTokenToToken(t) @@ -49,7 +49,7 @@ func (suite *StatusFaveTestSuite) TestPostFave() { // setup recorder := httptest.NewRecorder() - ctx, _ := gin.CreateTestContext(recorder) + ctx, _ := testrig.CreateGinTestContext(recorder, nil) ctx.Set(oauth.SessionAuthorizedApplication, suite.testApplications["application_1"]) ctx.Set(oauth.SessionAuthorizedToken, oauthToken) ctx.Set(oauth.SessionAuthorizedUser, suite.testUsers["local_account_1"]) @@ -90,7 +90,6 @@ func (suite *StatusFaveTestSuite) TestPostFave() { // try to fave a status that's not faveable func (suite *StatusFaveTestSuite) TestPostUnfaveable() { - t := suite.testTokens["local_account_1"] oauthToken := oauth.DBTokenToToken(t) @@ -98,7 +97,7 @@ func (suite *StatusFaveTestSuite) TestPostUnfaveable() { // setup recorder := httptest.NewRecorder() - ctx, _ := gin.CreateTestContext(recorder) + ctx, _ := testrig.CreateGinTestContext(recorder, nil) ctx.Set(oauth.SessionAuthorizedApplication, suite.testApplications["application_1"]) ctx.Set(oauth.SessionAuthorizedToken, oauthToken) ctx.Set(oauth.SessionAuthorizedUser, suite.testUsers["local_account_1"]) diff --git a/internal/api/client/status/statusfavedby_test.go b/internal/api/client/status/statusfavedby_test.go index 08749275b..e704fa724 100644 --- a/internal/api/client/status/statusfavedby_test.go +++ b/internal/api/client/status/statusfavedby_test.go @@ -33,6 +33,7 @@ import ( "github.com/superseriousbusiness/gotosocial/internal/api/client/status" "github.com/superseriousbusiness/gotosocial/internal/api/model" "github.com/superseriousbusiness/gotosocial/internal/oauth" + "github.com/superseriousbusiness/gotosocial/testrig" ) type StatusFavedByTestSuite struct { @@ -47,7 +48,7 @@ func (suite *StatusFavedByTestSuite) TestGetFavedBy() { // setup recorder := httptest.NewRecorder() - ctx, _ := gin.CreateTestContext(recorder) + ctx, _ := testrig.CreateGinTestContext(recorder, nil) ctx.Set(oauth.SessionAuthorizedApplication, suite.testApplications["application_2"]) ctx.Set(oauth.SessionAuthorizedToken, oauthToken) ctx.Set(oauth.SessionAuthorizedUser, suite.testUsers["local_account_2"]) diff --git a/internal/api/client/status/statusunfave_test.go b/internal/api/client/status/statusunfave_test.go index 641668391..b8448d657 100644 --- a/internal/api/client/status/statusunfave_test.go +++ b/internal/api/client/status/statusunfave_test.go @@ -33,6 +33,7 @@ import ( "github.com/superseriousbusiness/gotosocial/internal/api/client/status" "github.com/superseriousbusiness/gotosocial/internal/api/model" "github.com/superseriousbusiness/gotosocial/internal/oauth" + "github.com/superseriousbusiness/gotosocial/testrig" ) type StatusUnfaveTestSuite struct { @@ -41,7 +42,6 @@ type StatusUnfaveTestSuite struct { // unfave a status func (suite *StatusUnfaveTestSuite) TestPostUnfave() { - t := suite.testTokens["local_account_1"] oauthToken := oauth.DBTokenToToken(t) @@ -50,7 +50,7 @@ func (suite *StatusUnfaveTestSuite) TestPostUnfave() { // setup recorder := httptest.NewRecorder() - ctx, _ := gin.CreateTestContext(recorder) + ctx, _ := testrig.CreateGinTestContext(recorder, nil) ctx.Set(oauth.SessionAuthorizedApplication, suite.testApplications["application_1"]) ctx.Set(oauth.SessionAuthorizedToken, oauthToken) ctx.Set(oauth.SessionAuthorizedUser, suite.testUsers["local_account_1"]) @@ -91,7 +91,6 @@ func (suite *StatusUnfaveTestSuite) TestPostUnfave() { // try to unfave a status that's already not faved func (suite *StatusUnfaveTestSuite) TestPostAlreadyNotFaved() { - t := suite.testTokens["local_account_1"] oauthToken := oauth.DBTokenToToken(t) @@ -100,7 +99,7 @@ func (suite *StatusUnfaveTestSuite) TestPostAlreadyNotFaved() { // setup recorder := httptest.NewRecorder() - ctx, _ := gin.CreateTestContext(recorder) + ctx, _ := testrig.CreateGinTestContext(recorder, nil) ctx.Set(oauth.SessionAuthorizedApplication, suite.testApplications["application_1"]) ctx.Set(oauth.SessionAuthorizedToken, oauthToken) ctx.Set(oauth.SessionAuthorizedUser, suite.testUsers["local_account_1"]) diff --git a/internal/api/client/user/passwordchange_test.go b/internal/api/client/user/passwordchange_test.go index 11df161e2..31b59b2ce 100644 --- a/internal/api/client/user/passwordchange_test.go +++ b/internal/api/client/user/passwordchange_test.go @@ -27,11 +27,11 @@ import ( "net/url" "testing" - "github.com/gin-gonic/gin" "github.com/stretchr/testify/suite" "github.com/superseriousbusiness/gotosocial/internal/api/client/user" "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" "github.com/superseriousbusiness/gotosocial/internal/oauth" + "github.com/superseriousbusiness/gotosocial/testrig" "golang.org/x/crypto/bcrypt" ) @@ -44,7 +44,7 @@ func (suite *PasswordChangeTestSuite) TestPasswordChangePOST() { oauthToken := oauth.DBTokenToToken(t) recorder := httptest.NewRecorder() - ctx, _ := gin.CreateTestContext(recorder) + ctx, _ := testrig.CreateGinTestContext(recorder, nil) ctx.Set(oauth.SessionAuthorizedApplication, suite.testApplications["application_1"]) ctx.Set(oauth.SessionAuthorizedToken, oauthToken) ctx.Set(oauth.SessionAuthorizedUser, suite.testUsers["local_account_1"]) @@ -78,7 +78,7 @@ func (suite *PasswordChangeTestSuite) TestPasswordMissingOldPassword() { oauthToken := oauth.DBTokenToToken(t) recorder := httptest.NewRecorder() - ctx, _ := gin.CreateTestContext(recorder) + ctx, _ := testrig.CreateGinTestContext(recorder, nil) ctx.Set(oauth.SessionAuthorizedApplication, suite.testApplications["application_1"]) ctx.Set(oauth.SessionAuthorizedToken, oauthToken) ctx.Set(oauth.SessionAuthorizedUser, suite.testUsers["local_account_1"]) @@ -105,7 +105,7 @@ func (suite *PasswordChangeTestSuite) TestPasswordIncorrectOldPassword() { oauthToken := oauth.DBTokenToToken(t) recorder := httptest.NewRecorder() - ctx, _ := gin.CreateTestContext(recorder) + ctx, _ := testrig.CreateGinTestContext(recorder, nil) ctx.Set(oauth.SessionAuthorizedApplication, suite.testApplications["application_1"]) ctx.Set(oauth.SessionAuthorizedToken, oauthToken) ctx.Set(oauth.SessionAuthorizedUser, suite.testUsers["local_account_1"]) @@ -133,7 +133,7 @@ func (suite *PasswordChangeTestSuite) TestPasswordWeakNewPassword() { oauthToken := oauth.DBTokenToToken(t) recorder := httptest.NewRecorder() - ctx, _ := gin.CreateTestContext(recorder) + ctx, _ := testrig.CreateGinTestContext(recorder, nil) ctx.Set(oauth.SessionAuthorizedApplication, suite.testApplications["application_1"]) ctx.Set(oauth.SessionAuthorizedToken, oauthToken) ctx.Set(oauth.SessionAuthorizedUser, suite.testUsers["local_account_1"]) diff --git a/internal/api/errorhandling.go b/internal/api/errorhandling.go index 834f49ee8..32699fe36 100644 --- a/internal/api/errorhandling.go +++ b/internal/api/errorhandling.go @@ -22,7 +22,6 @@ import ( "context" "net/http" - "codeberg.org/gruf/go-errors/v2" "github.com/gin-gonic/gin" "github.com/sirupsen/logrus" apimodel "github.com/superseriousbusiness/gotosocial/internal/api/model" @@ -86,47 +85,13 @@ func genericErrorHandler(c *gin.Context, instanceGet func(ctx context.Context, d // if something goes wrong during the function, it will recover and just try to serve // an appropriate application/json content-type error. func ErrorHandler(c *gin.Context, errWithCode gtserror.WithCode, instanceGet func(ctx context.Context, domain string) (*apimodel.Instance, gtserror.WithCode)) { - path := c.Request.URL.Path - if raw := c.Request.URL.RawQuery; raw != "" { - path = path + "?" + raw - } - - l := logrus.WithFields(logrus.Fields{ - "path": path, - "error": errWithCode.Error(), - }) - - statusCode := errWithCode.Code() - - if statusCode == http.StatusInternalServerError { - l.Error("Internal Server Error") - } else { - l.Debug("handling error") - } - - // if we panic for any reason during error handling, - // we should still try to return a basic code - defer func() { - if p := recover(); p != nil { - // Fetch stacktrace up to this point - callers := errors.GetCallers(3, 10) - - // Log this panic to the standard log - l = l.WithField("stacktrace", callers) - l.Errorf("recovered from panic: %v", p) - - // Respond with determined error code - c.JSON(statusCode, gin.H{"error": errWithCode.Safe()}) - } - }() - // discover if we're allowed to serve a nice html error page, // or if we should just use a json. Normally we would want to // check for a returned error, but if an error occurs here we // can just fall back to default behavior (serve json error). accept, _ := NegotiateAccept(c, HTMLOrJSONAcceptHeaders...) - if statusCode == http.StatusNotFound { + if errWithCode.Code() == http.StatusNotFound { // use our special not found handler with useful status text NotFoundHandler(c, instanceGet, accept) } else { diff --git a/internal/api/s2s/user/inboxpost_test.go b/internal/api/s2s/user/inboxpost_test.go index 3a6ddbcfa..b8fe73909 100644 --- a/internal/api/s2s/user/inboxpost_test.go +++ b/internal/api/s2s/user/inboxpost_test.go @@ -96,7 +96,7 @@ func (suite *InboxPostTestSuite) TestPostBlock() { // setup request recorder := httptest.NewRecorder() - ctx, _ := gin.CreateTestContext(recorder) + ctx, _ := testrig.CreateGinTestContext(recorder, nil) ctx.Request = httptest.NewRequest(http.MethodPost, targetURI.String(), body) // the endpoint we're hitting ctx.Request.Header.Set("Signature", signature) ctx.Request.Header.Set("Date", dateHeader) @@ -199,7 +199,7 @@ func (suite *InboxPostTestSuite) TestPostUnblock() { // setup request recorder := httptest.NewRecorder() - ctx, _ := gin.CreateTestContext(recorder) + ctx, _ := testrig.CreateGinTestContext(recorder, nil) ctx.Request = httptest.NewRequest(http.MethodPost, targetURI.String(), body) // the endpoint we're hitting ctx.Request.Header.Set("Signature", signature) ctx.Request.Header.Set("Date", dateHeader) @@ -292,7 +292,7 @@ func (suite *InboxPostTestSuite) TestPostUpdate() { // setup request recorder := httptest.NewRecorder() - ctx, _ := gin.CreateTestContext(recorder) + ctx, _ := testrig.CreateGinTestContext(recorder, nil) ctx.Request = httptest.NewRequest(http.MethodPost, targetURI.String(), body) // the endpoint we're hitting ctx.Request.Header.Set("Signature", signature) ctx.Request.Header.Set("Date", dateHeader) @@ -416,7 +416,7 @@ func (suite *InboxPostTestSuite) TestPostDelete() { // setup request recorder := httptest.NewRecorder() - ctx, _ := gin.CreateTestContext(recorder) + ctx, _ := testrig.CreateGinTestContext(recorder, nil) ctx.Request = httptest.NewRequest(http.MethodPost, targetURI.String(), body) // the endpoint we're hitting ctx.Request.Header.Set("Signature", signature) ctx.Request.Header.Set("Date", dateHeader) diff --git a/internal/api/s2s/user/outboxget_test.go b/internal/api/s2s/user/outboxget_test.go index c5fb9e6ed..58b57954c 100644 --- a/internal/api/s2s/user/outboxget_test.go +++ b/internal/api/s2s/user/outboxget_test.go @@ -57,7 +57,7 @@ func (suite *OutboxGetTestSuite) TestGetOutbox() { // setup request recorder := httptest.NewRecorder() - ctx, _ := gin.CreateTestContext(recorder) + ctx, _ := testrig.CreateGinTestContext(recorder, nil) ctx.Request = httptest.NewRequest(http.MethodGet, targetAccount.OutboxURI, nil) // the endpoint we're hitting ctx.Request.Header.Set("accept", "application/activity+json") ctx.Request.Header.Set("Signature", signedRequest.SignatureHeader) @@ -115,7 +115,7 @@ func (suite *OutboxGetTestSuite) TestGetOutboxFirstPage() { // setup request recorder := httptest.NewRecorder() - ctx, _ := gin.CreateTestContext(recorder) + ctx, _ := testrig.CreateGinTestContext(recorder, nil) ctx.Request = httptest.NewRequest(http.MethodGet, targetAccount.OutboxURI+"?page=true", nil) // the endpoint we're hitting ctx.Request.Header.Set("accept", "application/activity+json") ctx.Request.Header.Set("Signature", signedRequest.SignatureHeader) @@ -173,7 +173,7 @@ func (suite *OutboxGetTestSuite) TestGetOutboxNextPage() { // setup request recorder := httptest.NewRecorder() - ctx, _ := gin.CreateTestContext(recorder) + ctx, _ := testrig.CreateGinTestContext(recorder, nil) ctx.Request = httptest.NewRequest(http.MethodGet, targetAccount.OutboxURI+"?page=true&max_id=01F8MHAMCHF6Y650WCRSCP4WMY", nil) // the endpoint we're hitting ctx.Request.Header.Set("accept", "application/activity+json") ctx.Request.Header.Set("Signature", signedRequest.SignatureHeader) diff --git a/internal/api/s2s/user/repliesget_test.go b/internal/api/s2s/user/repliesget_test.go index 6c2913057..07a3f2788 100644 --- a/internal/api/s2s/user/repliesget_test.go +++ b/internal/api/s2s/user/repliesget_test.go @@ -60,7 +60,7 @@ func (suite *RepliesGetTestSuite) TestGetReplies() { // setup request recorder := httptest.NewRecorder() - ctx, _ := gin.CreateTestContext(recorder) + ctx, _ := testrig.CreateGinTestContext(recorder, nil) ctx.Request = httptest.NewRequest(http.MethodGet, targetStatus.URI+"/replies", nil) // the endpoint we're hitting ctx.Request.Header.Set("accept", "application/activity+json") ctx.Request.Header.Set("Signature", signedRequest.SignatureHeader) @@ -124,7 +124,7 @@ func (suite *RepliesGetTestSuite) TestGetRepliesNext() { // setup request recorder := httptest.NewRecorder() - ctx, _ := gin.CreateTestContext(recorder) + ctx, _ := testrig.CreateGinTestContext(recorder, nil) ctx.Request = httptest.NewRequest(http.MethodGet, targetStatus.URI+"/replies?only_other_accounts=false&page=true", nil) // the endpoint we're hitting ctx.Request.Header.Set("accept", "application/activity+json") ctx.Request.Header.Set("Signature", signedRequest.SignatureHeader) @@ -191,7 +191,7 @@ func (suite *RepliesGetTestSuite) TestGetRepliesLast() { // setup request recorder := httptest.NewRecorder() - ctx, _ := gin.CreateTestContext(recorder) + ctx, _ := testrig.CreateGinTestContext(recorder, nil) ctx.Request = httptest.NewRequest(http.MethodGet, targetStatus.URI+"/replies?only_other_accounts=false&page=true&min_id=01FF25D5Q0DH7CHD57CTRS6WK0", nil) // the endpoint we're hitting ctx.Request.Header.Set("accept", "application/activity+json") ctx.Request.Header.Set("Signature", signedRequest.SignatureHeader) diff --git a/internal/api/s2s/user/statusget_test.go b/internal/api/s2s/user/statusget_test.go index 29f93fd71..26fb71818 100644 --- a/internal/api/s2s/user/statusget_test.go +++ b/internal/api/s2s/user/statusget_test.go @@ -59,7 +59,7 @@ func (suite *StatusGetTestSuite) TestGetStatus() { // setup request recorder := httptest.NewRecorder() - ctx, _ := gin.CreateTestContext(recorder) + ctx, _ := testrig.CreateGinTestContext(recorder, nil) ctx.Request = httptest.NewRequest(http.MethodGet, targetStatus.URI, nil) // the endpoint we're hitting ctx.Request.Header.Set("accept", "application/activity+json") ctx.Request.Header.Set("Signature", signedRequest.SignatureHeader) @@ -127,7 +127,7 @@ func (suite *StatusGetTestSuite) TestGetStatusLowercase() { // setup request recorder := httptest.NewRecorder() - ctx, _ := gin.CreateTestContext(recorder) + ctx, _ := testrig.CreateGinTestContext(recorder, nil) ctx.Request = httptest.NewRequest(http.MethodGet, strings.ToLower(targetStatus.URI), nil) // the endpoint we're hitting ctx.Request.Header.Set("accept", "application/activity+json") ctx.Request.Header.Set("Signature", signedRequest.SignatureHeader) diff --git a/internal/api/s2s/user/userget_test.go b/internal/api/s2s/user/userget_test.go index f5b15a390..0b242432c 100644 --- a/internal/api/s2s/user/userget_test.go +++ b/internal/api/s2s/user/userget_test.go @@ -60,7 +60,7 @@ func (suite *UserGetTestSuite) TestGetUser() { // setup request recorder := httptest.NewRecorder() - ctx, _ := gin.CreateTestContext(recorder) + ctx, _ := testrig.CreateGinTestContext(recorder, nil) ctx.Request = httptest.NewRequest(http.MethodGet, targetAccount.URI, nil) // the endpoint we're hitting ctx.Request.Header.Set("accept", "application/activity+json") ctx.Request.Header.Set("Signature", signedRequest.SignatureHeader) @@ -141,7 +141,7 @@ func (suite *UserGetTestSuite) TestGetUserPublicKeyDeleted() { // setup request recorder := httptest.NewRecorder() - ctx, _ := gin.CreateTestContext(recorder) + ctx, _ := testrig.CreateGinTestContext(recorder, nil) ctx.Request = httptest.NewRequest(http.MethodGet, targetAccount.PublicKeyURI, nil) // the endpoint we're hitting ctx.Request.Header.Set("accept", "application/activity+json") ctx.Request.Header.Set("Signature", signedRequest.SignatureHeader) diff --git a/internal/api/s2s/webfinger/webfingerget_test.go b/internal/api/s2s/webfinger/webfingerget_test.go index 781fad027..3e91b8f6a 100644 --- a/internal/api/s2s/webfinger/webfingerget_test.go +++ b/internal/api/s2s/webfinger/webfingerget_test.go @@ -26,7 +26,6 @@ import ( "net/http/httptest" "testing" - "github.com/gin-gonic/gin" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/suite" "github.com/superseriousbusiness/gotosocial/internal/api/s2s/webfinger" @@ -49,7 +48,7 @@ func (suite *WebfingerGetTestSuite) TestFingerUser() { requestPath := fmt.Sprintf("/%s?resource=acct:%s@%s", webfinger.WebfingerBasePath, targetAccount.Username, host) recorder := httptest.NewRecorder() - ctx, _ := gin.CreateTestContext(recorder) + ctx, _ := testrig.CreateGinTestContext(recorder, nil) ctx.Request = httptest.NewRequest(http.MethodGet, requestPath, nil) // the endpoint we're hitting ctx.Request.Header.Set("accept", "application/json") @@ -86,7 +85,7 @@ func (suite *WebfingerGetTestSuite) TestFingerUserWithDifferentAccountDomainByHo requestPath := fmt.Sprintf("/%s?resource=acct:%s@%s", webfinger.WebfingerBasePath, targetAccount.Username, host) recorder := httptest.NewRecorder() - ctx, _ := gin.CreateTestContext(recorder) + ctx, _ := testrig.CreateGinTestContext(recorder, nil) ctx.Request = httptest.NewRequest(http.MethodGet, requestPath, nil) // the endpoint we're hitting ctx.Request.Header.Set("accept", "application/json") @@ -123,7 +122,7 @@ func (suite *WebfingerGetTestSuite) TestFingerUserWithDifferentAccountDomainByAc requestPath := fmt.Sprintf("/%s?resource=acct:%s@%s", webfinger.WebfingerBasePath, targetAccount.Username, accountDomain) recorder := httptest.NewRecorder() - ctx, _ := gin.CreateTestContext(recorder) + ctx, _ := testrig.CreateGinTestContext(recorder, nil) ctx.Request = httptest.NewRequest(http.MethodGet, requestPath, nil) // the endpoint we're hitting ctx.Request.Header.Set("accept", "application/json") @@ -149,7 +148,7 @@ func (suite *WebfingerGetTestSuite) TestFingerUserWithoutAcct() { requestPath := fmt.Sprintf("/%s?resource=%s@%s", webfinger.WebfingerBasePath, targetAccount.Username, host) recorder := httptest.NewRecorder() - ctx, _ := gin.CreateTestContext(recorder) + ctx, _ := testrig.CreateGinTestContext(recorder, nil) ctx.Request = httptest.NewRequest(http.MethodGet, requestPath, nil) // the endpoint we're hitting ctx.Request.Header.Set("accept", "application/json") diff --git a/internal/log/log.go b/internal/log/log.go index 7ffa31c99..67dd03606 100644 --- a/internal/log/log.go +++ b/internal/log/log.go @@ -41,12 +41,6 @@ func Initialize() error { out := SplitErrOutputs(os.Stdout, os.Stderr) logrus.SetOutput(out) - logrus.SetFormatter(&logrus.TextFormatter{ - DisableColors: true, - DisableQuote: true, - FullTimestamp: true, - }) - // check if a desired log level has been set if lvl := config.GetLogLevel(); lvl != "" { level, err := logrus.ParseLevel(lvl) @@ -60,6 +54,18 @@ func Initialize() error { } } + // set our custom formatter options + logrus.SetFormatter(&logrus.TextFormatter{ + DisableColors: true, + FullTimestamp: true, + + // By default, quoting is enabled to help differentiate key-value + // fields in log lines. But when debug (or higher, e.g. trace) logging + // is enabled, we disable this. This allows easier copy-pasting of + // entry fields without worrying about escaped quotes. + DisableQuote: logrus.GetLevel() >= logrus.DebugLevel, + }) + // check if syslog has been enabled, and configure it if so if config.GetSyslogEnabled() { protocol := config.GetSyslogProtocol() diff --git a/internal/router/logger.go b/internal/router/logger.go index 7a92da8f1..692a616a4 100644 --- a/internal/router/logger.go +++ b/internal/router/logger.go @@ -19,55 +19,78 @@ package router import ( + "fmt" "net/http" + "os" "time" + "codeberg.org/gruf/go-bytesize" + "codeberg.org/gruf/go-errors/v2" "github.com/gin-gonic/gin" "github.com/sirupsen/logrus" ) -var skipPaths = map[string]interface{}{ - "/api/v1/streaming": nil, -} +// loggingMiddleware provides a request logging and panic recovery gin handler. +func loggingMiddleware(c *gin.Context) { + // Initialize the logging fields + fields := make(logrus.Fields, 7) + + // Determine pre-handler time + before := time.Now() -func loggingMiddleware() gin.HandlerFunc { - logHandler := func(c *gin.Context) { - start := time.Now() + defer func() { + code := c.Writer.Status() path := c.Request.URL.Path - raw := c.Request.URL.RawQuery - - // Process request - c.Next() - - // Log only when path is not being skipped - if _, ok := skipPaths[path]; !ok { - latency := time.Since(start) - clientIP := c.ClientIP() - userAgent := c.Request.UserAgent() - method := c.Request.Method - statusCode := c.Writer.Status() - errorMessage := c.Errors.ByType(gin.ErrorTypePrivate).String() - bodySize := c.Writer.Size() - if raw != "" { - path = path + "?" + raw + + if r := recover(); r != nil { + if c.Writer.Status() == 0 { + // No response was written, send a generic Internal Error + c.Writer.WriteHeader(http.StatusInternalServerError) } - l := logrus.WithFields(logrus.Fields{ - "latency": latency, - "clientIP": clientIP, - "userAgent": userAgent, - "method": method, - "statusCode": statusCode, - "path": path, - }) - - if errorMessage == "" { - l.Infof("[%s] %s: wrote %d bytes", latency, http.StatusText(statusCode), bodySize) - } else { - l.Errorf("[%s] %s: %s", latency, http.StatusText(statusCode), errorMessage) + // Append panic information to the request ctx + _ = c.Error(fmt.Errorf("recovered panic: %v", r)) + + // Dump a stacktrace to stderr + callers := errors.GetCallers(3, 10) + fmt.Fprintf(os.Stderr, "recovered panic: %v\n%s", r, callers) + } + + // NOTE: + // It is very important here that we are ONLY logging + // the request path, and none of the query parameters. + // Query parameters can contain sensitive information + // and could lead to storing plaintext API keys in logs + + // Set request logging fields + fields["latency"] = time.Since(before) + fields["clientIP"] = c.ClientIP() + fields["userAgent"] = c.Request.UserAgent() + fields["method"] = c.Request.Method + fields["statusCode"] = code + fields["path"] = path + + // Create a log entry with fields + l := logrus.WithFields(fields) + l.Level = logrus.InfoLevel + + if code >= 500 { + // This is a server error + l.Level = logrus.ErrorLevel + + if len(c.Errors) > 0 { + // Add an error string log field + fields["error"] = c.Errors.String() } } - } - return logHandler + // Generate a nicer looking bytecount + size := bytesize.Size(c.Writer.Size()) + + // Finally, write log entry with status text body size + l.Logf(l.Level, "%s: wrote %s", http.StatusText(code), size) + }() + + // Process request + c.Next() } diff --git a/internal/router/router.go b/internal/router/router.go index ee7024cd1..3917de314 100644 --- a/internal/router/router.go +++ b/internal/router/router.go @@ -143,9 +143,7 @@ func New(ctx context.Context, db db.DB) (Router, error) { // create the actual engine here -- this is the core request routing handler for gts engine := gin.New() - - engine.Use(gin.RecoveryWithWriter(logrus.StandardLogger().Writer())) - engine.Use(loggingMiddleware()) + engine.Use(loggingMiddleware) // 8 MiB engine.MaxMultipartMemory = 8 << 20 @@ -175,7 +173,7 @@ func New(ctx context.Context, db db.DB) (Router, error) { LoadTemplateFunctions(engine) // load templates onto the engine - if err := loadTemplates(engine); err != nil { + if err := LoadTemplates(engine); err != nil { return nil, err } diff --git a/internal/router/template.go b/internal/router/template.go index c033c8f07..ebd8629e8 100644 --- a/internal/router/template.go +++ b/internal/router/template.go @@ -31,7 +31,7 @@ import ( ) // LoadTemplates loads html templates for use by the given engine -func loadTemplates(engine *gin.Engine) error { +func LoadTemplates(engine *gin.Engine) error { templateBaseDir := config.GetWebTemplateBaseDir() if templateBaseDir == "" { return fmt.Errorf("%s cannot be empty and must be a relative or absolute path", config.WebTemplateBaseDirFlag()) |