From bcda048eab799284fc46d74706334bf9ef76dc83 Mon Sep 17 00:00:00 2001 From: tobi <31960611+tsmethurst@users.noreply.github.com> Date: Thu, 6 Jun 2024 15:43:25 +0200 Subject: [PATCH] [feature] Self-serve email change for users (#2957) * [feature] Email change * frontend stuff for changing email * docs * tests etc * differentiate more clearly between local user+account and account * populate user --- docs/api/swagger.yaml | 142 ++++++++++++++++++ docs/assets/user-settings-post-settings.png | Bin 106948 -> 0 bytes docs/assets/user-settings-settings.png | Bin 0 -> 110058 bytes docs/user_guide/settings.md | 18 ++- .../api/activitypub/users/userget_test.go | 2 +- internal/api/client/accounts/accountcreate.go | 6 +- internal/api/client/accounts/accountdelete.go | 2 +- internal/api/client/admin/accountapprove.go | 2 +- internal/api/client/admin/accountreject.go | 2 +- internal/api/client/user/emailchange.go | 104 +++++++++++++ internal/api/client/user/emailchange_test.go | 142 ++++++++++++++++++ .../api/client/user/passwordchange_test.go | 122 +++++---------- internal/api/client/user/user.go | 4 + internal/api/client/user/user_test.go | 43 +++++- internal/api/client/user/userget.go | 78 ++++++++++ internal/api/model/user.go | 61 ++++++++ internal/email/confirm.go | 15 +- internal/email/email_test.go | 17 ++- internal/federation/federatingdb/delete.go | 2 +- internal/federation/federatingdb/move.go | 2 +- internal/federation/federatingdb/move_test.go | 6 +- internal/federation/federatingdb/update.go | 2 +- internal/processing/account/account.go | 4 - internal/processing/account/account_test.go | 5 +- internal/processing/account/delete.go | 17 --- internal/processing/account/update.go | 2 +- internal/processing/account/update_test.go | 10 +- internal/processing/account_test.go | 106 ------------- .../{accountapprove.go => signupapprove.go} | 7 +- ...tapprove_test.go => signupapprove_test.go} | 2 +- .../{accountreject.go => signupreject.go} | 7 +- ...untreject_test.go => signupreject_test.go} | 6 +- internal/processing/processor.go | 6 +- internal/processing/report/create.go | 2 +- .../processing/{account => user}/create.go | 12 +- internal/processing/user/delete.go | 48 ++++++ internal/processing/user/email.go | 81 ++++++++++ internal/processing/user/get.go | 32 ++++ internal/processing/user/user.go | 14 +- internal/processing/user/user_test.go | 3 +- internal/processing/workers/fromclientapi.go | 66 +++++--- internal/processing/workers/fromfediapi.go | 12 +- .../processing/workers/fromfediapi_test.go | 4 +- internal/processing/workers/surfaceemail.go | 6 +- internal/typeutils/internaltofrontend.go | 38 +++++ internal/web/signup.go | 4 +- web/source/settings/lib/query/user/index.ts | 14 ++ web/source/settings/lib/types/user.ts | 34 +++++ web/source/settings/views/user/settings.tsx | 107 ++++++++++++- web/template/email_confirm.tmpl | 6 +- 50 files changed, 1118 insertions(+), 309 deletions(-) delete mode 100644 docs/assets/user-settings-post-settings.png create mode 100644 docs/assets/user-settings-settings.png create mode 100644 internal/api/client/user/emailchange.go create mode 100644 internal/api/client/user/emailchange_test.go create mode 100644 internal/api/client/user/userget.go delete mode 100644 internal/processing/account_test.go rename internal/processing/admin/{accountapprove.go => signupapprove.go} (93%) rename internal/processing/admin/{accountapprove_test.go => signupapprove_test.go} (97%) rename internal/processing/admin/{accountreject.go => signupreject.go} (95%) rename internal/processing/admin/{accountreject_test.go => signupreject_test.go} (96%) rename internal/processing/{account => user}/create.go (94%) create mode 100644 internal/processing/user/delete.go create mode 100644 internal/processing/user/get.go create mode 100644 web/source/settings/lib/types/user.ts diff --git a/docs/api/swagger.yaml b/docs/api/swagger.yaml index 5d93b33b1..55e88b62c 100644 --- a/docs/api/swagger.yaml +++ b/docs/api/swagger.yaml @@ -2713,6 +2713,77 @@ definitions: type: object x-go-name: Theme x-go-package: github.com/superseriousbusiness/gotosocial/internal/api/model + user: + properties: + admin: + description: User is an admin. + example: false + type: boolean + x-go-name: Admin + approved: + description: User was approved by an admin. + example: true + type: boolean + x-go-name: Approved + confirmation_sent_at: + description: Time when the last "please confirm your email address" email was sent, if at all. (ISO 8601 Datetime) + example: "2021-07-30T09:20:25+00:00" + type: string + x-go-name: ConfirmationSentAt + confirmed_at: + description: Time at which the email given in the `email` field was confirmed, if at all. (ISO 8601 Datetime) + example: "2021-07-30T09:20:25+00:00" + type: string + x-go-name: ConfirmedAt + created_at: + description: Time this user was created. (ISO 8601 Datetime) + example: "2021-07-30T09:20:25+00:00" + type: string + x-go-name: CreatedAt + disabled: + description: User's account is disabled. + example: false + type: boolean + x-go-name: Disabled + email: + description: Confirmed email address of this user, if set. + example: someone@example.org + type: string + x-go-name: Email + id: + description: Database ID of this user. + example: 01FBVD42CQ3ZEEVMW180SBX03B + type: string + x-go-name: ID + last_emailed_at: + description: Time at which this user was last emailed, if at all. (ISO 8601 Datetime) + example: "2021-07-30T09:20:25+00:00" + type: string + x-go-name: LastEmailedAt + moderator: + description: User is a moderator. + example: false + type: boolean + x-go-name: Moderator + reason: + description: Reason for sign-up, if provided. + example: Please! Pretty please! + type: string + x-go-name: Reason + reset_password_sent_at: + description: Time when the last "please reset your password" email was sent, if at all. (ISO 8601 Datetime) + example: "2021-07-30T09:20:25+00:00" + type: string + x-go-name: ResetPasswordSentAt + unconfirmed_email: + description: Unconfirmed email address of this user, if set. + example: someone.else@somewhere.else.example.org + type: string + x-go-name: UnconfirmedEmail + title: User models fields relevant to one user. + type: object + x-go-name: User + x-go-package: github.com/superseriousbusiness/gotosocial/internal/api/model wellKnownResponse: description: See https://webfinger.net/ properties: @@ -8636,6 +8707,77 @@ paths: summary: See public statuses that use the given hashtag (case insensitive). tags: - timelines + /api/v1/user: + get: + operationId: getUser + produces: + - application/json + responses: + "200": + description: The requested user. + schema: + $ref: '#/definitions/user' + "400": + description: bad request + "401": + description: unauthorized + "403": + description: forbidden + "406": + description: not acceptable + "500": + description: internal error + security: + - OAuth2 Bearer: + - read:user + summary: Get your own user model. + tags: + - user + /api/v1/user/email_change: + post: + consumes: + - application/json + - application/xml + - application/x-www-form-urlencoded + operationId: userEmailChange + parameters: + - description: User's current password, for verification. + in: formData + name: password + required: true + type: string + x-go-name: Password + - description: Desired new email address. + in: formData + name: new_email + required: true + type: string + x-go-name: NewEmail + produces: + - application/json + responses: + "202": + description: 'Accepted: email change is processing; check your inbox to confirm new address.' + schema: + $ref: '#/definitions/user' + "400": + description: bad request + "401": + description: unauthorized + "403": + description: forbidden + "406": + description: not acceptable + "409": + description: 'Conflict: desired email address already in use' + "500": + description: internal error + security: + - OAuth2 Bearer: + - write:user + summary: Request changing the email address of authenticated user. + tags: + - user /api/v1/user/password_change: post: consumes: diff --git a/docs/assets/user-settings-post-settings.png b/docs/assets/user-settings-post-settings.png deleted file mode 100644 index 6d32f5d62fad747f79f600cfb4059ecd9ff79a96..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 106948 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 diff --git a/docs/assets/user-settings-settings.png b/docs/assets/user-settings-settings.png new file mode 100644 index 0000000000000000000000000000000000000000..29a9364ccf9e7e660d1da3fe5a9512ccd5424d09 GIT binary patch literal 110058 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 u2@. + +package user + +import ( + "errors" + "net/http" + + "github.com/gin-gonic/gin" + apimodel "github.com/superseriousbusiness/gotosocial/internal/api/model" + apiutil "github.com/superseriousbusiness/gotosocial/internal/api/util" + "github.com/superseriousbusiness/gotosocial/internal/gtserror" + "github.com/superseriousbusiness/gotosocial/internal/oauth" +) + +// EmailChangePOSTHandler swagger:operation POST /api/v1/user/email_change userEmailChange +// +// Request changing the email address of authenticated user. +// +// --- +// tags: +// - user +// +// consumes: +// - application/json +// - application/xml +// - application/x-www-form-urlencoded +// +// produces: +// - application/json +// +// security: +// - OAuth2 Bearer: +// - write:user +// +// responses: +// '202': +// description: "Accepted: email change is processing; check your inbox to confirm new address." +// schema: +// "$ref": "#/definitions/user" +// '400': +// description: bad request +// '401': +// description: unauthorized +// '403': +// description: forbidden +// '406': +// description: not acceptable +// '409': +// description: "Conflict: desired email address already in use" +// '500': +// description: internal error +func (m *Module) EmailChangePOSTHandler(c *gin.Context) { + authed, err := oauth.Authed(c, true, true, true, true) + if err != nil { + apiutil.ErrorHandler(c, gtserror.NewErrorUnauthorized(err, err.Error()), m.processor.InstanceGetV1) + return + } + + if _, err := apiutil.NegotiateAccept(c, apiutil.JSONAcceptHeaders...); err != nil { + apiutil.ErrorHandler(c, gtserror.NewErrorNotAcceptable(err, err.Error()), m.processor.InstanceGetV1) + return + } + + form := &apimodel.EmailChangeRequest{} + if err := c.ShouldBind(form); err != nil { + apiutil.ErrorHandler(c, gtserror.NewErrorBadRequest(err, err.Error()), m.processor.InstanceGetV1) + return + } + + if form.Password == "" { + err := errors.New("email change request missing field password") + apiutil.ErrorHandler(c, gtserror.NewErrorBadRequest(err, err.Error()), m.processor.InstanceGetV1) + return + } + + user, errWithCode := m.processor.User().EmailChange( + c.Request.Context(), + authed.User, + form.Password, + form.NewEmail, + ) + if errWithCode != nil { + apiutil.ErrorHandler(c, errWithCode, m.processor.InstanceGetV1) + return + } + + apiutil.JSON(c, http.StatusAccepted, user) +} diff --git a/internal/api/client/user/emailchange_test.go b/internal/api/client/user/emailchange_test.go new file mode 100644 index 000000000..fce96c144 --- /dev/null +++ b/internal/api/client/user/emailchange_test.go @@ -0,0 +1,142 @@ +// GoToSocial +// Copyright (C) GoToSocial Authors admin@gotosocial.org +// SPDX-License-Identifier: AGPL-3.0-or-later +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package user_test + +import ( + "encoding/json" + "io" + "net/http" + "testing" + + "github.com/stretchr/testify/suite" + "github.com/superseriousbusiness/gotosocial/internal/api/client/user" + apimodel "github.com/superseriousbusiness/gotosocial/internal/api/model" + "github.com/superseriousbusiness/gotosocial/internal/state" + "github.com/superseriousbusiness/gotosocial/testrig" +) + +type EmailChangeTestSuite struct { + UserStandardTestSuite +} + +func (suite *EmailChangeTestSuite) TestEmailChangePOST() { + // Get a new processor for this test, as + // we're expecting an email, and we don't + // want the other tests interfering if + // we're running them at the same time. + state := new(state.State) + state.DB = testrig.NewTestDB(&suite.state) + storage := testrig.NewInMemoryStorage() + sentEmails := make(map[string]string) + emailSender := testrig.NewEmailSender("../../../../web/template/", sentEmails) + processor := testrig.NewTestProcessor(state, suite.federator, emailSender, suite.mediaManager) + testrig.StartWorkers(state, processor.Workers()) + userModule := user.New(processor) + testrig.StandardDBSetup(state.DB, suite.testAccounts) + testrig.StandardStorageSetup(storage, "../../../../testrig/media") + + defer func() { + testrig.StandardDBTeardown(state.DB) + testrig.StandardStorageTeardown(storage) + testrig.StopWorkers(state) + }() + + response, code := suite.POST(user.EmailChangePath, map[string][]string{ + "password": {"password"}, + "new_email": {"someone@example.org"}, + }, userModule.EmailChangePOSTHandler) + defer response.Body.Close() + + // Check response + suite.EqualValues(http.StatusAccepted, code) + b, err := io.ReadAll(response.Body) + if err != nil { + suite.FailNow(err.Error()) + } + + apiUser := new(apimodel.User) + if err := json.Unmarshal(b, apiUser); err != nil { + suite.FailNow(err.Error()) + } + + // Unconfirmed email should be set now. + suite.Equal("someone@example.org", apiUser.UnconfirmedEmail) + + // Ensure unconfirmed address gets an email. + if !testrig.WaitFor(func() bool { + _, ok := sentEmails["someone@example.org"] + return ok + }) { + suite.FailNow("no email received") + } +} + +func (suite *EmailChangeTestSuite) TestEmailChangePOSTAddressInUse() { + response, code := suite.POST(user.EmailChangePath, map[string][]string{ + "password": {"password"}, + "new_email": {"admin@example.org"}, + }, suite.userModule.EmailChangePOSTHandler) + defer response.Body.Close() + + // Check response + suite.EqualValues(http.StatusConflict, code) + b, err := io.ReadAll(response.Body) + if err != nil { + suite.FailNow(err.Error()) + } + + suite.Equal(`{"error":"Conflict: new email address is already in use on this instance"}`, string(b)) +} + +func (suite *EmailChangeTestSuite) TestEmailChangePOSTSameEmail() { + response, code := suite.POST(user.EmailChangePath, map[string][]string{ + "password": {"password"}, + "new_email": {"zork@example.org"}, + }, suite.userModule.EmailChangePOSTHandler) + defer response.Body.Close() + + // Check response + suite.EqualValues(http.StatusBadRequest, code) + b, err := io.ReadAll(response.Body) + if err != nil { + suite.FailNow(err.Error()) + } + + suite.Equal(`{"error":"Bad Request: new email address cannot be the same as current email address"}`, string(b)) +} + +func (suite *EmailChangeTestSuite) TestEmailChangePOSTBadPassword() { + response, code := suite.POST(user.EmailChangePath, map[string][]string{ + "password": {"notmypassword"}, + "new_email": {"someone@example.org"}, + }, suite.userModule.EmailChangePOSTHandler) + defer response.Body.Close() + + // Check response + suite.EqualValues(http.StatusUnauthorized, code) + b, err := io.ReadAll(response.Body) + if err != nil { + suite.FailNow(err.Error()) + } + + suite.Equal(`{"error":"Unauthorized: password was incorrect"}`, string(b)) +} + +func TestEmailChangeTestSuite(t *testing.T) { + suite.Run(t, &EmailChangeTestSuite{}) +} diff --git a/internal/api/client/user/passwordchange_test.go b/internal/api/client/user/passwordchange_test.go index b820696b5..8a741f96c 100644 --- a/internal/api/client/user/passwordchange_test.go +++ b/internal/api/client/user/passwordchange_test.go @@ -19,18 +19,13 @@ package user_test import ( "context" - "fmt" - "io/ioutil" + "io" "net/http" - "net/http/httptest" - "net/url" "testing" "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" ) @@ -39,29 +34,20 @@ type PasswordChangeTestSuite struct { } func (suite *PasswordChangeTestSuite) TestPasswordChangePOST() { - t := suite.testTokens["local_account_1"] - oauthToken := oauth.DBTokenToToken(t) - - recorder := httptest.NewRecorder() - 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"]) - ctx.Set(oauth.SessionAuthorizedAccount, suite.testAccounts["local_account_1"]) - ctx.Request = httptest.NewRequest(http.MethodPost, fmt.Sprintf("http://localhost:8080%s", user.PasswordChangePath), nil) - ctx.Request.Header.Set("accept", "application/json") - ctx.Request.Form = url.Values{ + response, code := suite.POST(user.PasswordChangePath, map[string][]string{ "old_password": {"password"}, "new_password": {"peepeepoopoopassword"}, - } - suite.userModule.PasswordChangePOSTHandler(ctx) + }, suite.userModule.PasswordChangePOSTHandler) + defer response.Body.Close() - // check response - suite.EqualValues(http.StatusOK, recorder.Code) + // Check response + suite.EqualValues(http.StatusOK, code) dbUser := >smodel.User{} err := suite.db.GetByID(context.Background(), suite.testUsers["local_account_1"].ID, dbUser) - suite.NoError(err) + if err != nil { + suite.FailNow(err.Error()) + } // new password should pass err = bcrypt.CompareHashAndPassword([]byte(dbUser.EncryptedPassword), []byte("peepeepoopoopassword")) @@ -73,85 +59,49 @@ func (suite *PasswordChangeTestSuite) TestPasswordChangePOST() { } func (suite *PasswordChangeTestSuite) TestPasswordMissingOldPassword() { - t := suite.testTokens["local_account_1"] - oauthToken := oauth.DBTokenToToken(t) - - recorder := httptest.NewRecorder() - 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"]) - ctx.Set(oauth.SessionAuthorizedAccount, suite.testAccounts["local_account_1"]) - ctx.Request = httptest.NewRequest(http.MethodPost, fmt.Sprintf("http://localhost:8080%s", user.PasswordChangePath), nil) - ctx.Request.Header.Set("accept", "application/json") - ctx.Request.Form = url.Values{ + response, code := suite.POST(user.PasswordChangePath, map[string][]string{ "new_password": {"peepeepoopoopassword"}, + }, suite.userModule.PasswordChangePOSTHandler) + defer response.Body.Close() + + // Check response + suite.EqualValues(http.StatusBadRequest, code) + b, err := io.ReadAll(response.Body) + if err != nil { + suite.FailNow(err.Error()) } - suite.userModule.PasswordChangePOSTHandler(ctx) - - // check response - suite.EqualValues(http.StatusBadRequest, recorder.Code) - - result := recorder.Result() - defer result.Body.Close() - b, err := ioutil.ReadAll(result.Body) - suite.NoError(err) suite.Equal(`{"error":"Bad Request: password change request missing field old_password"}`, string(b)) } func (suite *PasswordChangeTestSuite) TestPasswordIncorrectOldPassword() { - t := suite.testTokens["local_account_1"] - oauthToken := oauth.DBTokenToToken(t) - - recorder := httptest.NewRecorder() - 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"]) - ctx.Set(oauth.SessionAuthorizedAccount, suite.testAccounts["local_account_1"]) - ctx.Request = httptest.NewRequest(http.MethodPost, fmt.Sprintf("http://localhost:8080%s", user.PasswordChangePath), nil) - ctx.Request.Header.Set("accept", "application/json") - ctx.Request.Form = url.Values{ + response, code := suite.POST(user.PasswordChangePath, map[string][]string{ "old_password": {"notright"}, "new_password": {"peepeepoopoopassword"}, + }, suite.userModule.PasswordChangePOSTHandler) + defer response.Body.Close() + + // Check response + suite.EqualValues(http.StatusUnauthorized, code) + b, err := io.ReadAll(response.Body) + if err != nil { + suite.FailNow(err.Error()) } - suite.userModule.PasswordChangePOSTHandler(ctx) - - // check response - suite.EqualValues(http.StatusUnauthorized, recorder.Code) - - result := recorder.Result() - defer result.Body.Close() - b, err := ioutil.ReadAll(result.Body) - suite.NoError(err) suite.Equal(`{"error":"Unauthorized: old password was incorrect"}`, string(b)) } func (suite *PasswordChangeTestSuite) TestPasswordWeakNewPassword() { - t := suite.testTokens["local_account_1"] - oauthToken := oauth.DBTokenToToken(t) - - recorder := httptest.NewRecorder() - 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"]) - ctx.Set(oauth.SessionAuthorizedAccount, suite.testAccounts["local_account_1"]) - ctx.Request = httptest.NewRequest(http.MethodPost, fmt.Sprintf("http://localhost:8080%s", user.PasswordChangePath), nil) - ctx.Request.Header.Set("accept", "application/json") - ctx.Request.Form = url.Values{ + response, code := suite.POST(user.PasswordChangePath, map[string][]string{ "old_password": {"password"}, "new_password": {"peepeepoopoo"}, + }, suite.userModule.PasswordChangePOSTHandler) + defer response.Body.Close() + + // Check response + suite.EqualValues(http.StatusBadRequest, code) + b, err := io.ReadAll(response.Body) + if err != nil { + suite.FailNow(err.Error()) } - suite.userModule.PasswordChangePOSTHandler(ctx) - - // check response - suite.EqualValues(http.StatusBadRequest, recorder.Code) - - result := recorder.Result() - defer result.Body.Close() - b, err := ioutil.ReadAll(result.Body) - suite.NoError(err) suite.Equal(`{"error":"Bad Request: password is only 94% strength, try including more special characters, using uppercase letters, using numbers or using a longer password"}`, string(b)) } diff --git a/internal/api/client/user/user.go b/internal/api/client/user/user.go index 487b9684c..6ad176a2e 100644 --- a/internal/api/client/user/user.go +++ b/internal/api/client/user/user.go @@ -29,6 +29,8 @@ const ( BasePath = "/v1/user" // PasswordChangePath is the path for POSTing a password change request. PasswordChangePath = BasePath + "/password_change" + // EmailChangePath is the path for POSTing an email address change request. + EmailChangePath = BasePath + "/email_change" ) type Module struct { @@ -42,5 +44,7 @@ func New(processor *processing.Processor) *Module { } func (m *Module) Route(attachHandler func(method string, path string, f ...gin.HandlerFunc) gin.IRoutes) { + attachHandler(http.MethodGet, BasePath, m.UserGETHandler) attachHandler(http.MethodPost, PasswordChangePath, m.PasswordChangePOSTHandler) + attachHandler(http.MethodPost, EmailChangePath, m.EmailChangePOSTHandler) } diff --git a/internal/api/client/user/user_test.go b/internal/api/client/user/user_test.go index efff89b13..808daf1a3 100644 --- a/internal/api/client/user/user_test.go +++ b/internal/api/client/user/user_test.go @@ -18,14 +18,19 @@ package user_test import ( + "net/http" + "net/http/httptest" + "net/url" + + "github.com/gin-gonic/gin" "github.com/stretchr/testify/suite" "github.com/superseriousbusiness/gotosocial/internal/api/client/user" "github.com/superseriousbusiness/gotosocial/internal/db" - "github.com/superseriousbusiness/gotosocial/internal/email" "github.com/superseriousbusiness/gotosocial/internal/federation" "github.com/superseriousbusiness/gotosocial/internal/filter/visibility" "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" "github.com/superseriousbusiness/gotosocial/internal/media" + "github.com/superseriousbusiness/gotosocial/internal/oauth" "github.com/superseriousbusiness/gotosocial/internal/processing" "github.com/superseriousbusiness/gotosocial/internal/state" "github.com/superseriousbusiness/gotosocial/internal/storage" @@ -39,7 +44,6 @@ type UserStandardTestSuite struct { tc *typeutils.Converter mediaManager *media.Manager federator *federation.Federator - emailSender email.Sender processor *processing.Processor storage *storage.Driver state state.State @@ -50,8 +54,6 @@ type UserStandardTestSuite struct { testUsers map[string]*gtsmodel.User testAccounts map[string]*gtsmodel.Account - sentEmails map[string]string - userModule *user.Module } @@ -83,9 +85,7 @@ func (suite *UserStandardTestSuite) SetupTest() { suite.mediaManager = testrig.NewTestMediaManager(&suite.state) suite.federator = testrig.NewTestFederator(&suite.state, testrig.NewTestTransportController(&suite.state, testrig.NewMockHTTPClient(nil, "../../../../testrig/media")), suite.mediaManager) - suite.sentEmails = make(map[string]string) - suite.emailSender = testrig.NewEmailSender("../../../../web/template/", suite.sentEmails) - suite.processor = testrig.NewTestProcessor(&suite.state, suite.federator, suite.emailSender, suite.mediaManager) + suite.processor = testrig.NewTestProcessor(&suite.state, suite.federator, testrig.NewEmailSender("../../../../web/template/", nil), suite.mediaManager) suite.userModule = user.New(suite.processor) testrig.StandardDBSetup(suite.db, suite.testAccounts) testrig.StandardStorageSetup(suite.storage, "../../../../testrig/media") @@ -96,3 +96,32 @@ func (suite *UserStandardTestSuite) TearDownTest() { testrig.StandardStorageTeardown(suite.storage) testrig.StopWorkers(&suite.state) } + +func (suite *UserStandardTestSuite) POST(path string, formValues map[string][]string, handler gin.HandlerFunc) (*http.Response, int) { + var ( + oauthToken = oauth.DBTokenToToken(suite.testTokens["local_account_1"]) + app = suite.testApplications["application_1"] + user = suite.testUsers["local_account_1"] + account = suite.testAccounts["local_account_1"] + target = "http://localhost:8080" + path + ) + + // Prepare context. + recorder := httptest.NewRecorder() + ctx, _ := testrig.CreateGinTestContext(recorder, nil) + ctx.Set(oauth.SessionAuthorizedApplication, app) + ctx.Set(oauth.SessionAuthorizedToken, oauthToken) + ctx.Set(oauth.SessionAuthorizedUser, user) + ctx.Set(oauth.SessionAuthorizedAccount, account) + + // Prepare request. + ctx.Request = httptest.NewRequest(http.MethodPost, target, nil) + ctx.Request.Header.Set("accept", "application/json") + ctx.Request.Form = url.Values(formValues) + + // Call the handler. + handler(ctx) + + // Return response. + return recorder.Result(), recorder.Code +} diff --git a/internal/api/client/user/userget.go b/internal/api/client/user/userget.go new file mode 100644 index 000000000..147c1dbd5 --- /dev/null +++ b/internal/api/client/user/userget.go @@ -0,0 +1,78 @@ +// GoToSocial +// Copyright (C) GoToSocial Authors admin@gotosocial.org +// SPDX-License-Identifier: AGPL-3.0-or-later +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package user + +import ( + "net/http" + + "github.com/gin-gonic/gin" + apiutil "github.com/superseriousbusiness/gotosocial/internal/api/util" + "github.com/superseriousbusiness/gotosocial/internal/gtserror" + "github.com/superseriousbusiness/gotosocial/internal/oauth" +) + +// UserGETHandler swagger:operation GET /api/v1/user getUser +// +// Get your own user model. +// +// --- +// tags: +// - user +// +// produces: +// - application/json +// +// security: +// - OAuth2 Bearer: +// - read:user +// +// responses: +// '200': +// description: The requested user. +// schema: +// "$ref": "#/definitions/user" +// '400': +// description: bad request +// '401': +// description: unauthorized +// '403': +// description: forbidden +// '406': +// description: not acceptable +// '500': +// description: internal error +func (m *Module) UserGETHandler(c *gin.Context) { + authed, err := oauth.Authed(c, true, true, true, true) + if err != nil { + apiutil.ErrorHandler(c, gtserror.NewErrorUnauthorized(err, err.Error()), m.processor.InstanceGetV1) + return + } + + if _, err := apiutil.NegotiateAccept(c, apiutil.JSONAcceptHeaders...); err != nil { + apiutil.ErrorHandler(c, gtserror.NewErrorNotAcceptable(err, err.Error()), m.processor.InstanceGetV1) + return + } + + user, errWithCode := m.processor.User().Get(c.Request.Context(), authed.User) + if errWithCode != nil { + apiutil.ErrorHandler(c, errWithCode, m.processor.InstanceGetV1) + return + } + + apiutil.JSON(c, http.StatusOK, user) +} diff --git a/internal/api/model/user.go b/internal/api/model/user.go index 1a70a90d7..9226406d6 100644 --- a/internal/api/model/user.go +++ b/internal/api/model/user.go @@ -17,6 +17,51 @@ package model +// User models fields relevant to one user. +// +// swagger:model user +type User struct { + // Database ID of this user. + // example: 01FBVD42CQ3ZEEVMW180SBX03B + ID string `json:"id"` + // Time this user was created. (ISO 8601 Datetime) + // example: 2021-07-30T09:20:25+00:00 + CreatedAt string `json:"created_at"` + // Confirmed email address of this user, if set. + // example: someone@example.org + Email string `json:"email,omitempty"` + // Unconfirmed email address of this user, if set. + // example: someone.else@somewhere.else.example.org + UnconfirmedEmail string `json:"unconfirmed_email,omitempty"` + // Reason for sign-up, if provided. + // example: Please! Pretty please! + Reason string `json:"reason,omitempty"` + // Time at which this user was last emailed, if at all. (ISO 8601 Datetime) + // example: 2021-07-30T09:20:25+00:00 + LastEmailedAt string `json:"last_emailed_at,omitempty"` + // Time at which the email given in the `email` field was confirmed, if at all. (ISO 8601 Datetime) + // example: 2021-07-30T09:20:25+00:00 + ConfirmedAt string `json:"confirmed_at,omitempty"` + // Time when the last "please confirm your email address" email was sent, if at all. (ISO 8601 Datetime) + // example: 2021-07-30T09:20:25+00:00 + ConfirmationSentAt string `json:"confirmation_sent_at,omitempty"` + // User is a moderator. + // example: false + Moderator bool `json:"moderator"` + // User is an admin. + // example: false + Admin bool `json:"admin"` + // User's account is disabled. + // example: false + Disabled bool `json:"disabled"` + // User was approved by an admin. + // example: true + Approved bool `json:"approved"` + // Time when the last "please reset your password" email was sent, if at all. (ISO 8601 Datetime) + // example: 2021-07-30T09:20:25+00:00 + ResetPasswordSentAt string `json:"reset_password_sent_at,omitempty"` +} + // PasswordChangeRequest models user password change parameters. // // swagger:parameters userPasswordChange @@ -34,3 +79,19 @@ type PasswordChangeRequest struct { // required: true NewPassword string `form:"new_password" json:"new_password" xml:"new_password" validation:"required"` } + +// EmailChangeRequest models user email change parameters. +// +// swagger:parameters userEmailChange +type EmailChangeRequest struct { + // User's current password, for verification. + // + // in: formData + // required: true + Password string `form:"password" json:"password" xml:"password" validation:"required"` + // Desired new email address. + // + // in: formData + // required: true + NewEmail string `form:"new_email" json:"new_email" xml:"new_email" validation:"required"` +} diff --git a/internal/email/confirm.go b/internal/email/confirm.go index 9f05a4f71..4fbe2a98f 100644 --- a/internal/email/confirm.go +++ b/internal/email/confirm.go @@ -26,13 +26,20 @@ const ( type ConfirmData struct { // Username to be addressed. Username string - // URL of the instance to present to the receiver. + // URL of the instance to + // present to the receiver. InstanceURL string - // Name of the instance to present to the receiver. + // Name of the instance to + // present to the receiver. InstanceName string - // Link to present to the receiver to click on and do the confirmation. - // Should be a full link with protocol eg., https://example.org/confirm_email?token=some-long-token + // Link to present to the receiver to + // click on and do the confirmation. + // Should be a full link with protocol + // eg., https://example.org/confirm_email?token=some-long-token ConfirmLink string + // Is this confirm email being sent + // because this is a new sign-up? + NewSignup bool } func (s *sender) SendConfirmEmail(toAddress string, data ConfirmData) error { diff --git a/internal/email/email_test.go b/internal/email/email_test.go index b57562cb5..aacca1b3d 100644 --- a/internal/email/email_test.go +++ b/internal/email/email_test.go @@ -40,17 +40,32 @@ func (suite *EmailTestSuite) SetupTest() { suite.sender = testrig.NewEmailSender("../../web/template/", suite.sentEmails) } +func (suite *EmailTestSuite) TestTemplateConfirmNewSignup() { + confirmData := email.ConfirmData{ + Username: "test", + InstanceURL: "https://example.org", + InstanceName: "Test Instance", + ConfirmLink: "https://example.org/confirm_email?token=ee24f71d-e615-43f9-afae-385c0799b7fa", + NewSignup: true, + } + + suite.sender.SendConfirmEmail("user@example.org", confirmData) + suite.Len(suite.sentEmails, 1) + suite.Equal("To: user@example.org\r\nFrom: test@example.org\r\nSubject: GoToSocial Email Confirmation\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 8bit\r\nContent-Type: text/plain; charset=\"UTF-8\"\r\n\r\nHello test!\r\n\r\nYou are receiving this mail because you've requested an account on https://example.org.\r\n\r\nTo use your account, you must confirm that this is your email address.\r\n\r\nTo confirm your email, paste the following in your browser's address bar:\r\n\r\nhttps://example.org/confirm_email?token=ee24f71d-e615-43f9-afae-385c0799b7fa\r\n\r\n---\r\n\r\nIf you believe you've been sent this email in error, feel free to ignore it, or contact the administrator of https://example.org.\r\n\r\n", suite.sentEmails["user@example.org"]) +} + func (suite *EmailTestSuite) TestTemplateConfirm() { confirmData := email.ConfirmData{ Username: "test", InstanceURL: "https://example.org", InstanceName: "Test Instance", ConfirmLink: "https://example.org/confirm_email?token=ee24f71d-e615-43f9-afae-385c0799b7fa", + NewSignup: false, } suite.sender.SendConfirmEmail("user@example.org", confirmData) suite.Len(suite.sentEmails, 1) - suite.Equal("To: user@example.org\r\nFrom: test@example.org\r\nSubject: GoToSocial Email Confirmation\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 8bit\r\nContent-Type: text/plain; charset=\"UTF-8\"\r\n\r\nHello test!\r\n\r\nYou are receiving this mail because you've requested an account on https://example.org.\r\n\r\nTo use your account, you must confirm that this is your email address.\r\n\r\nTo confirm your email, paste the following in your browser's address bar:\r\n\r\nhttps://example.org/confirm_email?token=ee24f71d-e615-43f9-afae-385c0799b7fa\r\n\r\n---\r\n\r\nIf you believe you've been sent this email in error, feel free to ignore it, or contact the administrator of https://example.org.\r\n\r\n", suite.sentEmails["user@example.org"]) + suite.Equal("To: user@example.org\r\nFrom: test@example.org\r\nSubject: GoToSocial Email Confirmation\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 8bit\r\nContent-Type: text/plain; charset=\"UTF-8\"\r\n\r\nHello test!\r\n\r\nYou are receiving this mail because you've requested an email address change on https://example.org.\r\n\r\nTo complete the change, you must confirm that this is your email address.\r\n\r\nTo confirm your email, paste the following in your browser's address bar:\r\n\r\nhttps://example.org/confirm_email?token=ee24f71d-e615-43f9-afae-385c0799b7fa\r\n\r\n---\r\n\r\nIf you believe you've been sent this email in error, feel free to ignore it, or contact the administrator of https://example.org.\r\n\r\n", suite.sentEmails["user@example.org"]) } func (suite *EmailTestSuite) TestTemplateReset() { diff --git a/internal/federation/federatingdb/delete.go b/internal/federation/federatingdb/delete.go index 7e9b66c5a..931320940 100644 --- a/internal/federation/federatingdb/delete.go +++ b/internal/federation/federatingdb/delete.go @@ -113,7 +113,7 @@ func (f *federatingDB) deleteAccount( log.Debugf(ctx, "deleting account: %s", account.URI) f.state.Workers.Federator.Queue.Push(&messages.FromFediAPI{ - APObjectType: ap.ObjectProfile, + APObjectType: ap.ActorPerson, APActivityType: ap.ActivityDelete, GTSModel: account, Receiving: receiving, diff --git a/internal/federation/federatingdb/move.go b/internal/federation/federatingdb/move.go index 59dc2529c..681a9cff2 100644 --- a/internal/federation/federatingdb/move.go +++ b/internal/federation/federatingdb/move.go @@ -171,7 +171,7 @@ func (f *federatingDB) Move(ctx context.Context, move vocab.ActivityStreamsMove) // We had a Move already or stored a new Move. // Pass back to a worker for async processing. f.state.Workers.Federator.Queue.Push(&messages.FromFediAPI{ - APObjectType: ap.ObjectProfile, + APObjectType: ap.ActorPerson, APActivityType: ap.ActivityMove, GTSModel: stubMove, Requesting: requestingAcct, diff --git a/internal/federation/federatingdb/move_test.go b/internal/federation/federatingdb/move_test.go index 3e35dc97a..e9689b1a7 100644 --- a/internal/federation/federatingdb/move_test.go +++ b/internal/federation/federatingdb/move_test.go @@ -78,7 +78,7 @@ func (suite *MoveTestSuite) TestMove() { // Should be a message heading to the processor. msg, _ := suite.getFederatorMsg(5 * time.Second) - suite.Equal(ap.ObjectProfile, msg.APObjectType) + suite.Equal(ap.ActorPerson, msg.APObjectType) suite.Equal(ap.ActivityMove, msg.APActivityType) // Stub Move should be on the message. @@ -95,7 +95,7 @@ func (suite *MoveTestSuite) TestMove() { // Should be a message heading to the processor // since this is just a straight up retry. msg, _ = suite.getFederatorMsg(5 * time.Second) - suite.Equal(ap.ObjectProfile, msg.APObjectType) + suite.Equal(ap.ActorPerson, msg.APObjectType) suite.Equal(ap.ActivityMove, msg.APActivityType) // Same as the first Move, but with a different ID. @@ -115,7 +115,7 @@ func (suite *MoveTestSuite) TestMove() { // Should be a message heading to the processor // since this is just a retry with a different ID. msg, _ = suite.getFederatorMsg(5 * time.Second) - suite.Equal(ap.ObjectProfile, msg.APObjectType) + suite.Equal(ap.ActorPerson, msg.APObjectType) suite.Equal(ap.ActivityMove, msg.APActivityType) } diff --git a/internal/federation/federatingdb/update.go b/internal/federation/federatingdb/update.go index 2f00e0867..16ecf3443 100644 --- a/internal/federation/federatingdb/update.go +++ b/internal/federation/federatingdb/update.go @@ -99,7 +99,7 @@ func (f *federatingDB) updateAccountable(ctx context.Context, receivingAcct *gts // updating of eg., avatar/header, emojis, etc. The actual db // inserts/updates will take place there. f.state.Workers.Federator.Queue.Push(&messages.FromFediAPI{ - APObjectType: ap.ObjectProfile, + APObjectType: ap.ActorPerson, APActivityType: ap.ActivityUpdate, GTSModel: requestingAcct, APObject: accountable, diff --git a/internal/processing/account/account.go b/internal/processing/account/account.go index dbcecdb0a..65bb40292 100644 --- a/internal/processing/account/account.go +++ b/internal/processing/account/account.go @@ -22,7 +22,6 @@ import ( "github.com/superseriousbusiness/gotosocial/internal/filter/visibility" "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" "github.com/superseriousbusiness/gotosocial/internal/media" - "github.com/superseriousbusiness/gotosocial/internal/oauth" "github.com/superseriousbusiness/gotosocial/internal/processing/common" "github.com/superseriousbusiness/gotosocial/internal/state" "github.com/superseriousbusiness/gotosocial/internal/text" @@ -39,7 +38,6 @@ type Processor struct { state *state.State converter *typeutils.Converter mediaManager *media.Manager - oauthServer oauth.Server filter *visibility.Filter formatter *text.Formatter federator *federation.Federator @@ -53,7 +51,6 @@ func New( state *state.State, converter *typeutils.Converter, mediaManager *media.Manager, - oauthServer oauth.Server, federator *federation.Federator, filter *visibility.Filter, parseMention gtsmodel.ParseMentionFunc, @@ -63,7 +60,6 @@ func New( state: state, converter: converter, mediaManager: mediaManager, - oauthServer: oauthServer, filter: filter, formatter: text.NewFormatter(state.DB), federator: federator, diff --git a/internal/processing/account/account_test.go b/internal/processing/account/account_test.go index 10d5f91e1..556f4d91f 100644 --- a/internal/processing/account/account_test.go +++ b/internal/processing/account/account_test.go @@ -29,7 +29,6 @@ import ( "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" "github.com/superseriousbusiness/gotosocial/internal/media" "github.com/superseriousbusiness/gotosocial/internal/messages" - "github.com/superseriousbusiness/gotosocial/internal/oauth" "github.com/superseriousbusiness/gotosocial/internal/processing" "github.com/superseriousbusiness/gotosocial/internal/processing/account" "github.com/superseriousbusiness/gotosocial/internal/processing/common" @@ -48,7 +47,6 @@ type AccountStandardTestSuite struct { storage *storage.Driver state state.State mediaManager *media.Manager - oauthServer oauth.Server transportController transport.Controller federator *federation.Federator emailSender email.Sender @@ -106,7 +104,6 @@ func (suite *AccountStandardTestSuite) SetupTest() { suite.storage = testrig.NewInMemoryStorage() suite.state.Storage = suite.storage suite.mediaManager = testrig.NewTestMediaManager(&suite.state) - suite.oauthServer = testrig.NewTestOauthServer(suite.db) suite.transportController = testrig.NewTestTransportController(&suite.state, testrig.NewMockHTTPClient(nil, "../../../testrig/media")) suite.federator = testrig.NewTestFederator(&suite.state, suite.transportController, suite.mediaManager) @@ -115,7 +112,7 @@ func (suite *AccountStandardTestSuite) SetupTest() { filter := visibility.NewFilter(&suite.state) common := common.New(&suite.state, suite.tc, suite.federator, filter) - suite.accountProcessor = account.New(&common, &suite.state, suite.tc, suite.mediaManager, suite.oauthServer, suite.federator, filter, processing.GetParseMentionFunc(&suite.state, suite.federator)) + suite.accountProcessor = account.New(&common, &suite.state, suite.tc, suite.mediaManager, suite.federator, filter, processing.GetParseMentionFunc(&suite.state, suite.federator)) testrig.StandardDBSetup(suite.db, nil) testrig.StandardStorageSetup(suite.storage, "../../../testrig/media") } diff --git a/internal/processing/account/delete.go b/internal/processing/account/delete.go index 3f051edf0..075e94544 100644 --- a/internal/processing/account/delete.go +++ b/internal/processing/account/delete.go @@ -95,23 +95,6 @@ func (p *Processor) Delete( return nil } -// DeleteSelf is like Delete, but specifically for local accounts deleting themselves. -// -// Calling DeleteSelf results in a delete message being enqueued in the processor, -// which causes side effects to occur: delete will be federated out to other instances, -// and the above Delete function will be called afterwards from the processor, to clear -// out the account's bits and bobs, and stubbify it. -func (p *Processor) DeleteSelf(ctx context.Context, account *gtsmodel.Account) gtserror.WithCode { - // Process the delete side effects asynchronously. - p.state.Workers.Client.Queue.Push(&messages.FromClientAPI{ - APObjectType: ap.ActorPerson, - APActivityType: ap.ActivityDelete, - Origin: account, - Target: account, - }) - return nil -} - // deleteUserAndTokensForAccount deletes the gtsmodel.User and // any OAuth tokens and applications for the given account. // diff --git a/internal/processing/account/update.go b/internal/processing/account/update.go index 7f2749503..ea6abed6e 100644 --- a/internal/processing/account/update.go +++ b/internal/processing/account/update.go @@ -297,7 +297,7 @@ func (p *Processor) Update(ctx context.Context, account *gtsmodel.Account, form } p.state.Workers.Client.Queue.Push(&messages.FromClientAPI{ - APObjectType: ap.ObjectProfile, + APObjectType: ap.ActorPerson, APActivityType: ap.ActivityUpdate, GTSModel: account, Origin: account, diff --git a/internal/processing/account/update_test.go b/internal/processing/account/update_test.go index ad09ff25c..a07562544 100644 --- a/internal/processing/account/update_test.go +++ b/internal/processing/account/update_test.go @@ -64,7 +64,7 @@ func (suite *AccountUpdateTestSuite) TestAccountUpdateSimple() { // Profile update. suite.Equal(ap.ActivityUpdate, msg.APActivityType) - suite.Equal(ap.ObjectProfile, msg.APObjectType) + suite.Equal(ap.ActorPerson, msg.APObjectType) // Correct account updated. if msg.Origin == nil { @@ -114,7 +114,7 @@ func (suite *AccountUpdateTestSuite) TestAccountUpdateWithMention() { // Profile update. suite.Equal(ap.ActivityUpdate, msg.APActivityType) - suite.Equal(ap.ObjectProfile, msg.APObjectType) + suite.Equal(ap.ActorPerson, msg.APObjectType) // Correct account updated. if msg.Origin == nil { @@ -170,7 +170,7 @@ func (suite *AccountUpdateTestSuite) TestAccountUpdateWithMarkdownNote() { // Profile update. suite.Equal(ap.ActivityUpdate, msg.APActivityType) - suite.Equal(ap.ObjectProfile, msg.APObjectType) + suite.Equal(ap.ActorPerson, msg.APObjectType) // Correct account updated. if msg.Origin == nil { @@ -255,7 +255,7 @@ func (suite *AccountUpdateTestSuite) TestAccountUpdateWithFields() { // Profile update. suite.Equal(ap.ActivityUpdate, msg.APActivityType) - suite.Equal(ap.ObjectProfile, msg.APObjectType) + suite.Equal(ap.ActorPerson, msg.APObjectType) // Correct account updated. if msg.Origin == nil { @@ -312,7 +312,7 @@ func (suite *AccountUpdateTestSuite) TestAccountUpdateNoteNotFields() { // Profile update. suite.Equal(ap.ActivityUpdate, msg.APActivityType) - suite.Equal(ap.ObjectProfile, msg.APObjectType) + suite.Equal(ap.ActorPerson, msg.APObjectType) // Correct account updated. if msg.Origin == nil { diff --git a/internal/processing/account_test.go b/internal/processing/account_test.go deleted file mode 100644 index 82c28115e..000000000 --- a/internal/processing/account_test.go +++ /dev/null @@ -1,106 +0,0 @@ -// GoToSocial -// Copyright (C) GoToSocial Authors admin@gotosocial.org -// SPDX-License-Identifier: AGPL-3.0-or-later -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with this program. If not, see . - -package processing_test - -import ( - "context" - "encoding/json" - "fmt" - "io" - "testing" - "time" - - "github.com/stretchr/testify/suite" - "github.com/superseriousbusiness/activity/pub" - "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" - "github.com/superseriousbusiness/gotosocial/testrig" -) - -type AccountTestSuite struct { - ProcessingStandardTestSuite -} - -func (suite *AccountTestSuite) TestAccountDeleteLocal() { - ctx := context.Background() - deletingAccount := suite.testAccounts["local_account_1"] - followingAccount := suite.testAccounts["remote_account_1"] - - // make the following account follow the deleting account so that a delete message will be sent to it via the federating API - follow := >smodel.Follow{ - ID: "01FJ1S8DX3STJJ6CEYPMZ1M0R3", - CreatedAt: time.Now(), - UpdatedAt: time.Now(), - URI: fmt.Sprintf("%s/follow/01FJ1S8DX3STJJ6CEYPMZ1M0R3", followingAccount.URI), - AccountID: followingAccount.ID, - TargetAccountID: deletingAccount.ID, - } - err := suite.db.Put(ctx, follow) - suite.NoError(err) - - errWithCode := suite.processor.Account().DeleteSelf(ctx, suite.testAccounts["local_account_1"]) - suite.NoError(errWithCode) - - // the delete should be federated outwards to the following account's inbox - var sent []byte - delete := new(struct { - Actor string `json:"actor"` - ID string `json:"id"` - Object string `json:"object"` - To string `json:"to"` - CC string `json:"cc"` - Type string `json:"type"` - }) - - if !testrig.WaitFor(func() bool { - delivery, ok := suite.state.Workers.Delivery.Queue.Pop() - if !ok { - return false - } - if !testrig.EqualRequestURIs(delivery.Request.URL, *followingAccount.SharedInboxURI) { - panic("differing request uris") - } - sent, err = io.ReadAll(delivery.Request.Body) - if err != nil { - panic("error reading body: " + err.Error()) - } - err = json.Unmarshal(sent, delete) - if err != nil { - panic("error unmarshaling json: " + err.Error()) - } - return true - }) { - suite.FailNow("timed out waiting for message") - } - - suite.Equal(deletingAccount.URI, delete.Actor) - suite.Equal(deletingAccount.URI, delete.Object) - suite.Equal(deletingAccount.FollowersURI, delete.To) - suite.Equal(pub.PublicActivityPubIRI, delete.CC) - suite.Equal("Delete", delete.Type) - - if !testrig.WaitFor(func() bool { - dbAccount, _ := suite.db.GetAccountByID(ctx, deletingAccount.ID) - return !dbAccount.SuspendedAt.IsZero() - }) { - suite.FailNow("timed out waiting for account to be deleted") - } -} - -func TestAccountTestSuite(t *testing.T) { - suite.Run(t, &AccountTestSuite{}) -} diff --git a/internal/processing/admin/accountapprove.go b/internal/processing/admin/signupapprove.go similarity index 93% rename from internal/processing/admin/accountapprove.go rename to internal/processing/admin/signupapprove.go index c3f6409c3..84e04fa8d 100644 --- a/internal/processing/admin/accountapprove.go +++ b/internal/processing/admin/signupapprove.go @@ -30,7 +30,7 @@ import ( "github.com/superseriousbusiness/gotosocial/internal/messages" ) -func (p *Processor) AccountApprove( +func (p *Processor) SignupApprove( ctx context.Context, adminAcct *gtsmodel.Account, accountID string, @@ -55,7 +55,10 @@ func (p *Processor) AccountApprove( if !*user.Approved { // Process approval side effects asynschronously. p.state.Workers.Client.Queue.Push(&messages.FromClientAPI{ - APObjectType: ap.ActorPerson, + // Use ap.ObjectProfile here to + // distinguish this message (user model) + // from ap.ActorPerson (account model). + APObjectType: ap.ObjectProfile, APActivityType: ap.ActivityAccept, GTSModel: user, Origin: adminAcct, diff --git a/internal/processing/admin/accountapprove_test.go b/internal/processing/admin/signupapprove_test.go similarity index 97% rename from internal/processing/admin/accountapprove_test.go rename to internal/processing/admin/signupapprove_test.go index b6ca1ed32..58b8fdade 100644 --- a/internal/processing/admin/accountapprove_test.go +++ b/internal/processing/admin/signupapprove_test.go @@ -42,7 +42,7 @@ func (suite *AdminApproveTestSuite) TestApprove() { *targetUser = *suite.testUsers["unconfirmed_account"] // Approve the sign-up. - acct, errWithCode := suite.adminProcessor.AccountApprove( + acct, errWithCode := suite.adminProcessor.SignupApprove( ctx, adminAcct, targetAcct.ID, diff --git a/internal/processing/admin/accountreject.go b/internal/processing/admin/signupreject.go similarity index 95% rename from internal/processing/admin/accountreject.go rename to internal/processing/admin/signupreject.go index 8cb54cad6..39eff0b87 100644 --- a/internal/processing/admin/accountreject.go +++ b/internal/processing/admin/signupreject.go @@ -30,7 +30,7 @@ import ( "github.com/superseriousbusiness/gotosocial/internal/messages" ) -func (p *Processor) AccountReject( +func (p *Processor) SignupReject( ctx context.Context, adminAcct *gtsmodel.Account, accountID string, @@ -102,7 +102,10 @@ func (p *Processor) AccountReject( // Process rejection side effects asynschronously. p.state.Workers.Client.Queue.Push(&messages.FromClientAPI{ - APObjectType: ap.ActorPerson, + // Use ap.ObjectProfile here to + // distinguish this message (user model) + // from ap.ActorPerson (account model). + APObjectType: ap.ObjectProfile, APActivityType: ap.ActivityReject, GTSModel: deniedUser, Origin: adminAcct, diff --git a/internal/processing/admin/accountreject_test.go b/internal/processing/admin/signupreject_test.go similarity index 96% rename from internal/processing/admin/accountreject_test.go rename to internal/processing/admin/signupreject_test.go index 071401afc..cb6a25eb3 100644 --- a/internal/processing/admin/accountreject_test.go +++ b/internal/processing/admin/signupreject_test.go @@ -42,7 +42,7 @@ func (suite *AdminRejectTestSuite) TestReject() { message = "Too stinky." ) - acct, errWithCode := suite.adminProcessor.AccountReject( + acct, errWithCode := suite.adminProcessor.SignupReject( ctx, adminAcct, targetAcct.ID, @@ -104,7 +104,7 @@ func (suite *AdminRejectTestSuite) TestRejectRemote() { ) // Try to reject a remote account. - _, err := suite.adminProcessor.AccountReject( + _, err := suite.adminProcessor.SignupReject( ctx, adminAcct, targetAcct.ID, @@ -126,7 +126,7 @@ func (suite *AdminRejectTestSuite) TestRejectApproved() { ) // Try to reject an already-approved account. - _, err := suite.adminProcessor.AccountReject( + _, err := suite.adminProcessor.SignupReject( ctx, adminAcct, targetAcct.ID, diff --git a/internal/processing/processor.go b/internal/processing/processor.go index 8a18bc45e..1e7997b8f 100644 --- a/internal/processing/processor.go +++ b/internal/processing/processor.go @@ -180,13 +180,13 @@ func NewProcessor( // Start with sub processors that will // be required by the workers processor. common := common.New(state, converter, federator, filter) - processor.account = account.New(&common, state, converter, mediaManager, oauthServer, federator, filter, parseMentionFunc) + processor.account = account.New(&common, state, converter, mediaManager, federator, filter, parseMentionFunc) processor.media = media.New(state, converter, mediaManager, federator.TransportController()) processor.stream = stream.New(state, oauthServer) // Instantiate the rest of the sub // processors + pin them to this struct. - processor.account = account.New(&common, state, converter, mediaManager, oauthServer, federator, filter, parseMentionFunc) + processor.account = account.New(&common, state, converter, mediaManager, federator, filter, parseMentionFunc) processor.admin = admin.New(state, cleaner, converter, mediaManager, federator.TransportController(), emailSender) processor.fedi = fedi.New(state, &common, converter, federator, filter) processor.filtersv1 = filtersv1.New(state, converter) @@ -198,7 +198,7 @@ func NewProcessor( processor.timeline = timeline.New(state, converter, filter) processor.search = search.New(state, federator, converter, filter) processor.status = status.New(state, &common, &processor.polls, federator, converter, filter, parseMentionFunc) - processor.user = user.New(state, emailSender) + processor.user = user.New(state, converter, oauthServer, emailSender) // Workers processor handles asynchronous // worker jobs; instantiate it separately diff --git a/internal/processing/report/create.go b/internal/processing/report/create.go index cac600006..dd31a8798 100644 --- a/internal/processing/report/create.go +++ b/internal/processing/report/create.go @@ -92,7 +92,7 @@ func (p *Processor) Create(ctx context.Context, account *gtsmodel.Account, form } p.state.Workers.Client.Queue.Push(&messages.FromClientAPI{ - APObjectType: ap.ObjectProfile, + APObjectType: ap.ActorPerson, APActivityType: ap.ActivityFlag, GTSModel: report, Origin: account, diff --git a/internal/processing/account/create.go b/internal/processing/user/create.go similarity index 94% rename from internal/processing/account/create.go rename to internal/processing/user/create.go index 761165356..0d848583e 100644 --- a/internal/processing/account/create.go +++ b/internal/processing/user/create.go @@ -15,7 +15,7 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -package account +package user import ( "context" @@ -32,10 +32,9 @@ import ( "github.com/superseriousbusiness/oauth2/v4" ) -// Create processes the given form for creating a new account, -// returning a new user (with attached account) if successful. +// Create processes the given form for creating a new user+account. // -// App should be the app used to create the account. +// App should be the app used to create the user+account. // If nil, the instance app will be used. // // Precondition: the form's fields should have already been @@ -124,9 +123,12 @@ func (p *Processor) Create( return nil, gtserror.NewErrorInternalError(err) } - // There are side effects for creating a new account + // There are side effects for creating a new user+account // (confirmation emails etc), perform these async. p.state.Workers.Client.Queue.Push(&messages.FromClientAPI{ + // Use ap.ObjectProfile here to + // distinguish this message (user model) + // from ap.ActorPerson (account model). APObjectType: ap.ObjectProfile, APActivityType: ap.ActivityCreate, GTSModel: user, diff --git a/internal/processing/user/delete.go b/internal/processing/user/delete.go new file mode 100644 index 000000000..9783010ef --- /dev/null +++ b/internal/processing/user/delete.go @@ -0,0 +1,48 @@ +// GoToSocial +// Copyright (C) GoToSocial Authors admin@gotosocial.org +// SPDX-License-Identifier: AGPL-3.0-or-later +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package user + +import ( + "context" + + "github.com/superseriousbusiness/gotosocial/internal/ap" + "github.com/superseriousbusiness/gotosocial/internal/gtserror" + "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" + "github.com/superseriousbusiness/gotosocial/internal/messages" +) + +// DeleteSelf is like Account.Delete, but specifically +// for local user+accounts deleting themselves. +// +// Calling DeleteSelf results in a delete message being enqueued in the processor, +// which causes side effects to occur: delete will be federated out to other instances, +// and the above Delete function will be called afterwards from the processor, to clear +// out the account's bits and bobs, and stubbify it. +func (p *Processor) DeleteSelf(ctx context.Context, account *gtsmodel.Account) gtserror.WithCode { + // Process the delete side effects asynchronously. + p.state.Workers.Client.Queue.Push(&messages.FromClientAPI{ + // Use ap.ObjectProfile here to + // distinguish this message (user model) + // from ap.ActorPerson (account model). + APObjectType: ap.ObjectProfile, + APActivityType: ap.ActivityDelete, + Origin: account, + Target: account, + }) + return nil +} diff --git a/internal/processing/user/email.go b/internal/processing/user/email.go index 2b27c6c92..ea9dbb64c 100644 --- a/internal/processing/user/email.go +++ b/internal/processing/user/email.go @@ -23,11 +23,92 @@ import ( "fmt" "time" + "github.com/superseriousbusiness/gotosocial/internal/ap" + apimodel "github.com/superseriousbusiness/gotosocial/internal/api/model" "github.com/superseriousbusiness/gotosocial/internal/db" "github.com/superseriousbusiness/gotosocial/internal/gtserror" "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" + "github.com/superseriousbusiness/gotosocial/internal/messages" + "github.com/superseriousbusiness/gotosocial/internal/validate" + "golang.org/x/crypto/bcrypt" ) +// EmailChange processes an email address change request for the given user. +func (p *Processor) EmailChange( + ctx context.Context, + user *gtsmodel.User, + password string, + newEmail string, +) (*apimodel.User, gtserror.WithCode) { + // Ensure provided password is correct. + if err := bcrypt.CompareHashAndPassword([]byte(user.EncryptedPassword), []byte(password)); err != nil { + err := gtserror.Newf("%w", err) + return nil, gtserror.NewErrorUnauthorized(err, "password was incorrect") + } + + // Ensure new email address is valid. + if err := validate.Email(newEmail); err != nil { + return nil, gtserror.NewErrorBadRequest(err, err.Error()) + } + + // Ensure new email address is different + // from current email address. + if newEmail == user.Email { + const help = "new email address cannot be the same as current email address" + err := gtserror.New(help) + return nil, gtserror.NewErrorBadRequest(err, help) + } + + if newEmail == user.UnconfirmedEmail { + const help = "you already have an email change request pending for given email address" + err := gtserror.New(help) + return nil, gtserror.NewErrorBadRequest(err, help) + } + + // Ensure this address isn't already used by another account. + emailAvailable, err := p.state.DB.IsEmailAvailable(ctx, newEmail) + if err != nil { + err := gtserror.Newf("db error checking email availability: %w", err) + return nil, gtserror.NewErrorInternalError(err) + } + + if !emailAvailable { + const help = "new email address is already in use on this instance" + err := gtserror.New(help) + return nil, gtserror.NewErrorConflict(err, help) + } + + // Set new email address on user. + user.UnconfirmedEmail = newEmail + if err := p.state.DB.UpdateUser( + ctx, user, + "unconfirmed_email", + ); err != nil { + err := gtserror.Newf("db error updating user: %w", err) + return nil, gtserror.NewErrorInternalError(err) + } + + // Ensure user populated (we need account). + if err := p.state.DB.PopulateUser(ctx, user); err != nil { + err := gtserror.Newf("db error populating user: %w", err) + return nil, gtserror.NewErrorInternalError(err) + } + + // Add email sending job to the queue. + p.state.Workers.Client.Queue.Push(&messages.FromClientAPI{ + // Use ap.ObjectProfile here to + // distinguish this message (user model) + // from ap.ActorPerson (account model). + APObjectType: ap.ObjectProfile, + APActivityType: ap.ActivityUpdate, + GTSModel: user, + Origin: user.Account, + Target: user.Account, + }) + + return p.converter.UserToAPIUser(ctx, user), nil +} + // EmailGetUserForConfirmToken retrieves the user (with account) from // the database for the given "confirm your email" token string. func (p *Processor) EmailGetUserForConfirmToken(ctx context.Context, token string) (*gtsmodel.User, gtserror.WithCode) { diff --git a/internal/processing/user/get.go b/internal/processing/user/get.go new file mode 100644 index 000000000..9b19189a8 --- /dev/null +++ b/internal/processing/user/get.go @@ -0,0 +1,32 @@ +// GoToSocial +// Copyright (C) GoToSocial Authors admin@gotosocial.org +// SPDX-License-Identifier: AGPL-3.0-or-later +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package user + +import ( + "context" + + apimodel "github.com/superseriousbusiness/gotosocial/internal/api/model" + "github.com/superseriousbusiness/gotosocial/internal/gtserror" + "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" +) + +// Get returns the API model of the given user. +// Should only be served if user == the user doing the request. +func (p *Processor) Get(ctx context.Context, user *gtsmodel.User) (*apimodel.User, gtserror.WithCode) { + return p.converter.UserToAPIUser(ctx, user), nil +} diff --git a/internal/processing/user/user.go b/internal/processing/user/user.go index 2fbb9c888..cd8ab9900 100644 --- a/internal/processing/user/user.go +++ b/internal/processing/user/user.go @@ -19,18 +19,28 @@ package user import ( "github.com/superseriousbusiness/gotosocial/internal/email" + "github.com/superseriousbusiness/gotosocial/internal/oauth" "github.com/superseriousbusiness/gotosocial/internal/state" + "github.com/superseriousbusiness/gotosocial/internal/typeutils" ) type Processor struct { state *state.State + converter *typeutils.Converter + oauthServer oauth.Server emailSender email.Sender } -// New returns a new user processor -func New(state *state.State, emailSender email.Sender) Processor { +// New returns a new user processor. +func New( + state *state.State, + converter *typeutils.Converter, + oauthServer oauth.Server, + emailSender email.Sender, +) Processor { return Processor{ state: state, + converter: converter, emailSender: emailSender, } } diff --git a/internal/processing/user/user_test.go b/internal/processing/user/user_test.go index 61e8f8b05..e473c5bb0 100644 --- a/internal/processing/user/user_test.go +++ b/internal/processing/user/user_test.go @@ -24,6 +24,7 @@ import ( "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" "github.com/superseriousbusiness/gotosocial/internal/processing/user" "github.com/superseriousbusiness/gotosocial/internal/state" + "github.com/superseriousbusiness/gotosocial/internal/typeutils" "github.com/superseriousbusiness/gotosocial/testrig" ) @@ -53,7 +54,7 @@ func (suite *UserStandardTestSuite) SetupTest() { suite.emailSender = testrig.NewEmailSender("../../../web/template/", suite.sentEmails) suite.testUsers = testrig.NewTestUsers() - suite.user = user.New(&suite.state, suite.emailSender) + suite.user = user.New(&suite.state, typeutils.NewConverter(&suite.state), testrig.NewTestOauthServer(suite.db), suite.emailSender) testrig.StandardDBSetup(suite.db, nil) } diff --git a/internal/processing/workers/fromclientapi.go b/internal/processing/workers/fromclientapi.go index a9e33892f..89b8f546f 100644 --- a/internal/processing/workers/fromclientapi.go +++ b/internal/processing/workers/fromclientapi.go @@ -71,9 +71,9 @@ func (p *Processor) ProcessFromClientAPI(ctx context.Context, cMsg *messages.Fro case ap.ActivityCreate: switch cMsg.APObjectType { - // CREATE PROFILE/ACCOUNT - case ap.ObjectProfile, ap.ActorPerson: - return p.clientAPI.CreateAccount(ctx, cMsg) + // CREATE USER (ie., new user+account sign-up) + case ap.ObjectProfile: + return p.clientAPI.CreateUser(ctx, cMsg) // CREATE NOTE/STATUS case ap.ObjectNote: @@ -111,13 +111,17 @@ func (p *Processor) ProcessFromClientAPI(ctx context.Context, cMsg *messages.Fro case ap.ObjectNote: return p.clientAPI.UpdateStatus(ctx, cMsg) - // UPDATE PROFILE/ACCOUNT - case ap.ObjectProfile, ap.ActorPerson: + // UPDATE ACCOUNT (ie., bio, settings, etc) + case ap.ActorPerson: return p.clientAPI.UpdateAccount(ctx, cMsg) // UPDATE A FLAG/REPORT (mark as resolved/closed) case ap.ActivityFlag: return p.clientAPI.UpdateReport(ctx, cMsg) + + // UPDATE USER (ie., email address) + case ap.ObjectProfile: + return p.clientAPI.UpdateUser(ctx, cMsg) } // ACCEPT SOMETHING @@ -128,9 +132,9 @@ func (p *Processor) ProcessFromClientAPI(ctx context.Context, cMsg *messages.Fro case ap.ActivityFollow: return p.clientAPI.AcceptFollow(ctx, cMsg) - // ACCEPT PROFILE/ACCOUNT (sign-up) - case ap.ObjectProfile, ap.ActorPerson: - return p.clientAPI.AcceptAccount(ctx, cMsg) + // ACCEPT USER (ie., new user+account sign-up) + case ap.ObjectProfile: + return p.clientAPI.AcceptUser(ctx, cMsg) } // REJECT SOMETHING @@ -141,9 +145,9 @@ func (p *Processor) ProcessFromClientAPI(ctx context.Context, cMsg *messages.Fro case ap.ActivityFollow: return p.clientAPI.RejectFollowRequest(ctx, cMsg) - // REJECT PROFILE/ACCOUNT (sign-up) - case ap.ObjectProfile, ap.ActorPerson: - return p.clientAPI.RejectAccount(ctx, cMsg) + // REJECT USER (ie., new user+account sign-up) + case ap.ObjectProfile: + return p.clientAPI.RejectUser(ctx, cMsg) } // UNDO SOMETHING @@ -175,17 +179,17 @@ func (p *Processor) ProcessFromClientAPI(ctx context.Context, cMsg *messages.Fro case ap.ObjectNote: return p.clientAPI.DeleteStatus(ctx, cMsg) - // DELETE PROFILE/ACCOUNT - case ap.ObjectProfile, ap.ActorPerson: - return p.clientAPI.DeleteAccount(ctx, cMsg) + // DELETE REMOTE ACCOUNT or LOCAL USER+ACCOUNT + case ap.ActorPerson, ap.ObjectProfile: + return p.clientAPI.DeleteAccountOrUser(ctx, cMsg) } // FLAG/REPORT SOMETHING case ap.ActivityFlag: switch cMsg.APObjectType { //nolint:gocritic - // FLAG/REPORT A PROFILE - case ap.ObjectProfile: + // FLAG/REPORT ACCOUNT + case ap.ActorPerson: return p.clientAPI.ReportAccount(ctx, cMsg) } @@ -193,8 +197,8 @@ func (p *Processor) ProcessFromClientAPI(ctx context.Context, cMsg *messages.Fro case ap.ActivityMove: switch cMsg.APObjectType { //nolint:gocritic - // MOVE PROFILE/ACCOUNT - case ap.ObjectProfile, ap.ActorPerson: + // MOVE ACCOUNT + case ap.ActorPerson: return p.clientAPI.MoveAccount(ctx, cMsg) } } @@ -202,7 +206,7 @@ func (p *Processor) ProcessFromClientAPI(ctx context.Context, cMsg *messages.Fro return gtserror.Newf("unhandled: %s %s", cMsg.APActivityType, cMsg.APObjectType) } -func (p *clientAPI) CreateAccount(ctx context.Context, cMsg *messages.FromClientAPI) error { +func (p *clientAPI) CreateUser(ctx context.Context, cMsg *messages.FromClientAPI) error { newUser, ok := cMsg.GTSModel.(*gtsmodel.User) if !ok { return gtserror.Newf("%T not parseable as *gtsmodel.User", cMsg.GTSModel) @@ -219,7 +223,7 @@ func (p *clientAPI) CreateAccount(ctx context.Context, cMsg *messages.FromClient } // Send "please confirm your address" email to the new user. - if err := p.surface.emailUserPleaseConfirm(ctx, newUser); err != nil { + if err := p.surface.emailUserPleaseConfirm(ctx, newUser, true); err != nil { log.Errorf(ctx, "error emailing confirm: %v", err) } @@ -479,6 +483,22 @@ func (p *clientAPI) UpdateReport(ctx context.Context, cMsg *messages.FromClientA return nil } +func (p *clientAPI) UpdateUser(ctx context.Context, cMsg *messages.FromClientAPI) error { + user, ok := cMsg.GTSModel.(*gtsmodel.User) + if !ok { + return gtserror.Newf("cannot cast %T -> *gtsmodel.User", cMsg.GTSModel) + } + + // The only possible "UpdateUser" action is to update the + // user's email address, so we can safely assume by this + // point that a new unconfirmed email address has been set. + if err := p.surface.emailUserPleaseConfirm(ctx, user, false); err != nil { + log.Errorf(ctx, "error emailing report closed: %v", err) + } + + return nil +} + func (p *clientAPI) AcceptFollow(ctx context.Context, cMsg *messages.FromClientAPI) error { follow, ok := cMsg.GTSModel.(*gtsmodel.Follow) if !ok { @@ -669,7 +689,7 @@ func (p *clientAPI) DeleteStatus(ctx context.Context, cMsg *messages.FromClientA return nil } -func (p *clientAPI) DeleteAccount(ctx context.Context, cMsg *messages.FromClientAPI) error { +func (p *clientAPI) DeleteAccountOrUser(ctx context.Context, cMsg *messages.FromClientAPI) error { // The originID of the delete, one of: // - ID of a domain block, for which // this account delete is a side effect. @@ -768,7 +788,7 @@ func (p *clientAPI) MoveAccount(ctx context.Context, cMsg *messages.FromClientAP return nil } -func (p *clientAPI) AcceptAccount(ctx context.Context, cMsg *messages.FromClientAPI) error { +func (p *clientAPI) AcceptUser(ctx context.Context, cMsg *messages.FromClientAPI) error { newUser, ok := cMsg.GTSModel.(*gtsmodel.User) if !ok { return gtserror.Newf("%T not parseable as *gtsmodel.User", cMsg.GTSModel) @@ -791,7 +811,7 @@ func (p *clientAPI) AcceptAccount(ctx context.Context, cMsg *messages.FromClient return nil } -func (p *clientAPI) RejectAccount(ctx context.Context, cMsg *messages.FromClientAPI) error { +func (p *clientAPI) RejectUser(ctx context.Context, cMsg *messages.FromClientAPI) error { deniedUser, ok := cMsg.GTSModel.(*gtsmodel.DeniedUser) if !ok { return gtserror.Newf("%T not parseable as *gtsmodel.DeniedUser", cMsg.GTSModel) diff --git a/internal/processing/workers/fromfediapi.go b/internal/processing/workers/fromfediapi.go index 49756a47a..ac4003f6a 100644 --- a/internal/processing/workers/fromfediapi.go +++ b/internal/processing/workers/fromfediapi.go @@ -115,8 +115,8 @@ func (p *Processor) ProcessFromFediAPI(ctx context.Context, fMsg *messages.FromF case ap.ObjectNote: return p.fediAPI.UpdateStatus(ctx, fMsg) - // UPDATE PROFILE/ACCOUNT - case ap.ObjectProfile: + // UPDATE ACCOUNT + case ap.ActorPerson: return p.fediAPI.UpdateAccount(ctx, fMsg) } @@ -137,17 +137,17 @@ func (p *Processor) ProcessFromFediAPI(ctx context.Context, fMsg *messages.FromF case ap.ObjectNote: return p.fediAPI.DeleteStatus(ctx, fMsg) - // DELETE PROFILE/ACCOUNT - case ap.ObjectProfile: + // DELETE ACCOUNT + case ap.ActorPerson: return p.fediAPI.DeleteAccount(ctx, fMsg) } // MOVE SOMETHING case ap.ActivityMove: - // MOVE PROFILE/ACCOUNT + // MOVE ACCOUNT // fromfediapi_move.go. - if fMsg.APObjectType == ap.ObjectProfile { + if fMsg.APObjectType == ap.ActorPerson { return p.fediAPI.MoveAccount(ctx, fMsg) } } diff --git a/internal/processing/workers/fromfediapi_test.go b/internal/processing/workers/fromfediapi_test.go index 8429fe17c..e69e2c7a8 100644 --- a/internal/processing/workers/fromfediapi_test.go +++ b/internal/processing/workers/fromfediapi_test.go @@ -337,7 +337,7 @@ func (suite *FromFediAPITestSuite) TestProcessAccountDelete() { // now they are mufos! err = testStructs.Processor.Workers().ProcessFromFediAPI(ctx, &messages.FromFediAPI{ - APObjectType: ap.ObjectProfile, + APObjectType: ap.ActorPerson, APActivityType: ap.ActivityDelete, GTSModel: deletedAccount, Receiving: receivingAccount, @@ -613,7 +613,7 @@ func (suite *FromFediAPITestSuite) TestMoveAccount() { // Process the Move. err := testStructs.Processor.Workers().ProcessFromFediAPI(ctx, &messages.FromFediAPI{ - APObjectType: ap.ObjectProfile, + APObjectType: ap.ActorPerson, APActivityType: ap.ActivityMove, GTSModel: >smodel.Move{ OriginURI: requestingAcct.URI, diff --git a/internal/processing/workers/surfaceemail.go b/internal/processing/workers/surfaceemail.go index 5f8ae1823..d0a40e6ba 100644 --- a/internal/processing/workers/surfaceemail.go +++ b/internal/processing/workers/surfaceemail.go @@ -74,7 +74,10 @@ func (s *Surface) emailUserReportClosed(ctx context.Context, report *gtsmodel.Re // emailUserPleaseConfirm emails the given user // to ask them to confirm their email address. -func (s *Surface) emailUserPleaseConfirm(ctx context.Context, user *gtsmodel.User) error { +// +// If newSignup is true, template will be geared +// towards someone who just created an account. +func (s *Surface) emailUserPleaseConfirm(ctx context.Context, user *gtsmodel.User, newSignup bool) error { if user.UnconfirmedEmail == "" || user.UnconfirmedEmail == user.Email { // User has already confirmed this @@ -104,6 +107,7 @@ func (s *Surface) emailUserPleaseConfirm(ctx context.Context, user *gtsmodel.Use InstanceURL: instance.URI, InstanceName: instance.Title, ConfirmLink: confirmLink, + NewSignup: newSignup, }, ); err != nil { return err diff --git a/internal/typeutils/internaltofrontend.go b/internal/typeutils/internaltofrontend.go index 68db61128..e1380fc9e 100644 --- a/internal/typeutils/internaltofrontend.go +++ b/internal/typeutils/internaltofrontend.go @@ -63,6 +63,44 @@ func toMastodonVersion(in string) string { return instanceMastodonVersion + "+" + strings.ReplaceAll(in, " ", "-") } +// UserToAPIUser converts a *gtsmodel.User to an API +// representation suitable for serving to that user. +// +// Contains sensitive info so should only +// ever be served to the user themself. +func (c *Converter) UserToAPIUser(ctx context.Context, u *gtsmodel.User) *apimodel.User { + user := &apimodel.User{ + ID: u.ID, + CreatedAt: util.FormatISO8601(u.CreatedAt), + Email: u.Email, + UnconfirmedEmail: u.UnconfirmedEmail, + Reason: u.Reason, + Moderator: *u.Moderator, + Admin: *u.Admin, + Disabled: *u.Disabled, + Approved: *u.Approved, + } + + // Zero-able dates. + if !u.LastEmailedAt.IsZero() { + user.LastEmailedAt = util.FormatISO8601(u.LastEmailedAt) + } + + if !u.ConfirmedAt.IsZero() { + user.ConfirmedAt = util.FormatISO8601(u.ConfirmedAt) + } + + if !u.ConfirmationSentAt.IsZero() { + user.ConfirmationSentAt = util.FormatISO8601(u.ConfirmationSentAt) + } + + if !u.ResetPasswordSentAt.IsZero() { + user.ResetPasswordSentAt = util.FormatISO8601(u.ResetPasswordSentAt) + } + + return user +} + // AppToAPIAppSensitive takes a db model application as a param, and returns a populated apitype application, or an error // if something goes wrong. The returned application should be ready to serialize on an API level, and may have sensitive fields // (such as client id and client secret), so serve it only to an authorized user who should have permission to see it. diff --git a/internal/web/signup.go b/internal/web/signup.go index 691469dff..bc30749f8 100644 --- a/internal/web/signup.go +++ b/internal/web/signup.go @@ -108,9 +108,9 @@ func (m *Module) signupPOSTHandler(c *gin.Context) { } form.IP = signUpIP - // We have all the info we need, call account create + // We have all the info we need, call user+account create // (this will also trigger side effects like sending emails etc). - user, errWithCode := m.processor.Account().Create( + user, errWithCode := m.processor.User().Create( c.Request.Context(), // nil to use // instance app. diff --git a/web/source/settings/lib/query/user/index.ts b/web/source/settings/lib/query/user/index.ts index 8c4e5215b..1f9070bfb 100644 --- a/web/source/settings/lib/query/user/index.ts +++ b/web/source/settings/lib/query/user/index.ts @@ -24,6 +24,7 @@ import type { UpdateAliasesFormData } from "../../types/migration"; import type { Theme } from "../../types/theme"; +import { User } from "../../types/user"; const extended = gtsApi.injectEndpoints({ endpoints: (build) => ({ @@ -37,6 +38,9 @@ const extended = gtsApi.injectEndpoints({ }), ...replaceCacheOnMutation("verifyCredentials") }), + user: build.query({ + query: () => ({url: `/api/v1/user`}) + }), passwordChange: build.mutation({ query: (data) => ({ method: "POST", @@ -44,6 +48,14 @@ const extended = gtsApi.injectEndpoints({ body: data }) }), + emailChange: build.mutation({ + query: (data) => ({ + method: "POST", + url: `/api/v1/user/email_change`, + body: data + }), + ...replaceCacheOnMutation("user") + }), aliasAccount: build.mutation({ async queryFn(formData, _api, _extraOpts, fetchWithBQ) { // Pull entries out from the hooked form. @@ -78,7 +90,9 @@ const extended = gtsApi.injectEndpoints({ export const { useUpdateCredentialsMutation, + useUserQuery, usePasswordChangeMutation, + useEmailChangeMutation, useAliasAccountMutation, useMoveAccountMutation, useAccountThemesQuery, diff --git a/web/source/settings/lib/types/user.ts b/web/source/settings/lib/types/user.ts new file mode 100644 index 000000000..92210d5d3 --- /dev/null +++ b/web/source/settings/lib/types/user.ts @@ -0,0 +1,34 @@ +/* + GoToSocial + Copyright (C) GoToSocial Authors admin@gotosocial.org + SPDX-License-Identifier: AGPL-3.0-or-later + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . +*/ + +export interface User { + id: string; + created_at: string; + email?: string; + unconfirmed_email?: string; + reason?: string; + last_emailed_at?: string; + confirmed_at?: string; + confirmation_sent_at?: string; + moderator: boolean; + admin: boolean; + disabled: boolean; + approved: boolean; + reset_password_sent_at?: string; +} diff --git a/web/source/settings/views/user/settings.tsx b/web/source/settings/views/user/settings.tsx index cbd973706..a27cc1ba3 100644 --- a/web/source/settings/views/user/settings.tsx +++ b/web/source/settings/views/user/settings.tsx @@ -25,7 +25,9 @@ import FormWithData from "../../lib/form/form-with-data"; import Languages from "../../components/languages"; import MutationButton from "../../components/form/mutation-button"; import { useVerifyCredentialsQuery } from "../../lib/query/oauth"; -import { usePasswordChangeMutation, useUpdateCredentialsMutation } from "../../lib/query/user"; +import { useEmailChangeMutation, usePasswordChangeMutation, useUpdateCredentialsMutation, useUserQuery } from "../../lib/query/user"; +import Loading from "../../components/loading"; +import { User } from "../../lib/types/user"; export default function UserSettings() { return ( @@ -98,6 +100,7 @@ function UserSettingsForm({ data }) { /> + ); } @@ -168,3 +171,105 @@ function PasswordChange() { ); } + +function EmailChange() { + // Load existing user data. + const { data: user, isFetching, isLoading } = useUserQuery(); + if (isFetching || isLoading) { + return ; + } + + if (user === undefined) { + throw "could not fetch user"; + } + + return ; +} + +function EmailChangeForm({user}: {user: User}) { + const form = { + currentEmail: useTextInput("current_email", { + defaultValue: user.email, + nosubmit: true + }), + newEmail: useTextInput("new_email", { + validator: (value: string | undefined) => { + if (!value) { + return ""; + } + + if (value.toLowerCase() === user.email?.toLowerCase()) { + return "cannot change to your existing address"; + } + + if (value.toLowerCase() === user.unconfirmed_email?.toLowerCase()) { + return "you already have a pending email address change to this address"; + } + + return ""; + }, + }), + password: useTextInput("password"), + }; + const [submitForm, result] = useFormSubmit(form, useEmailChangeMutation()); + + return ( +

+ + + { user.unconfirmed_email && <> +
+ + + You currently have a pending email address + change to the address: {user.unconfirmed_email} +
+ To confirm {user.unconfirmed_email} as your new + address for this account, please check your email inbox. +
+
+ } + + + + + + + + + + ); +} diff --git a/web/template/email_confirm.tmpl b/web/template/email_confirm.tmpl index b223e9e40..167ffcdf7 100644 --- a/web/template/email_confirm.tmpl +++ b/web/template/email_confirm.tmpl @@ -18,11 +18,15 @@ */ -}} Hello {{ .Username -}}! - +{{ if .NewSignup }} You are receiving this mail because you've requested an account on {{ .InstanceURL -}}. To use your account, you must confirm that this is your email address. +{{ else }} +You are receiving this mail because you've requested an email address change on {{ .InstanceURL -}}. +To complete the change, you must confirm that this is your email address. +{{ end }} To confirm your email, paste the following in your browser's address bar: {{ .ConfirmLink }}