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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�tq 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 z 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�nkEAN3Wu@}jRx&pf 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. + +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 }}