From 89e0cfd8741b6763ca04e90558bccf4c3c380cfa Mon Sep 17 00:00:00 2001 From: tobi <31960611+tsmethurst@users.noreply.github.com> Date: Sat, 13 Apr 2024 13:25:10 +0200 Subject: [PATCH] [feature] Admin accounts endpoints; approve/reject sign-ups (#2826) * update settings panels, add pending overview + approve/deny functions * add admin accounts get, approve, reject * send approved/rejected emails * use signup URL * docs! * email * swagger * web linting * fix email tests * wee lil fixerinos * use new paging logic for GetAccounts() series of admin endpoints, small changes to query building * shuffle useAccountIDIn check *before* adding to query * fix parse from toot react error * use `netip.Addr` * put valid slices in globals * optimistic updates for account state --------- Co-authored-by: kim --- docs/admin/signups.md | 59 +++ docs/api/swagger.yaml | 343 +++++++++++++++++ docs/assets/signup-account.png | Bin 0 -> 77617 bytes docs/assets/signup-form.png | Bin 0 -> 112173 bytes docs/assets/signup-pending.png | Bin 0 -> 73581 bytes internal/api/client/admin/accountapprove.go | 105 ++++++ internal/api/client/admin/accountget.go | 101 +++++ internal/api/client/admin/accountreject.go | 136 +++++++ internal/api/client/admin/accountsgetv1.go | 348 ++++++++++++++++++ internal/api/client/admin/accountsgetv2.go | 212 +++++++++++ internal/api/client/admin/admin.go | 12 +- internal/api/model/admin.go | 49 +++ internal/api/util/parsequery.go | 98 ++++- internal/db/account.go | 21 ++ internal/db/bundb/account.go | 254 +++++++++++++ internal/db/bundb/account_test.go | 185 ++++++++++ internal/db/bundb/user.go | 20 + internal/db/user.go | 6 + internal/email/email_test.go | 8 +- internal/email/noopsender.go | 8 + internal/email/sender.go | 8 + internal/email/signup.go | 36 ++ .../admin/{account.go => accountaction.go} | 0 internal/processing/admin/accountapprove.go | 79 ++++ .../processing/admin/accountapprove_test.go | 75 ++++ internal/processing/admin/accountget.go | 49 +++ internal/processing/admin/accountreject.go | 113 ++++++ .../processing/admin/accountreject_test.go | 142 +++++++ internal/processing/admin/accounts.go | 272 ++++++++++++++ internal/processing/workers/fromclientapi.go | 72 ++++ internal/processing/workers/surfaceemail.go | 65 +++- internal/web/customcss.go | 2 +- internal/web/profile.go | 2 +- internal/web/rss.go | 2 +- internal/web/thread.go | 2 +- mkdocs.yml | 1 + web/source/css/base.css | 5 +- web/source/settings/admin/accounts/detail.jsx | 112 ------ .../admin/accounts/detail/actions.tsx | 89 +++++ .../admin/accounts/detail/handlesignup.tsx | 118 ++++++ .../settings/admin/accounts/detail/index.tsx | 179 +++++++++ web/source/settings/admin/accounts/index.jsx | 138 ------- web/source/settings/admin/accounts/index.tsx | 49 +++ .../settings/admin/accounts/pending/index.tsx | 40 ++ .../settings/admin/accounts/search/index.tsx | 125 +++++++ .../{expireremote.jsx => expireremote.tsx} | 22 +- .../actions/keys/{index.jsx => index.tsx} | 8 +- .../media/{cleanup.jsx => cleanup.tsx} | 24 +- .../actions/media/{index.jsx => index.tsx} | 8 +- .../admin/domain-permissions/form.tsx | 9 +- .../settings/admin/emoji/local/detail.js | 36 +- .../admin/emoji/local/{index.js => index.tsx} | 12 +- .../local/{new-emoji.js => new-emoji.tsx} | 48 +-- .../settings/admin/emoji/local/overview.js | 2 +- .../emoji/remote/{index.js => index.tsx} | 18 +- ...parse-from-toot.js => parse-from-toot.tsx} | 71 ++-- .../admin/reports/{detail.jsx => detail.tsx} | 54 +-- .../admin/reports/{index.jsx => index.tsx} | 20 +- .../reports/{username.jsx => username.tsx} | 12 +- .../admin/settings/{rules.jsx => rules.tsx} | 45 ++- .../settings/components/account-list.tsx | 82 +++++ .../components/form/mutation-button.jsx | 48 --- .../components/form/mutation-button.tsx | 72 ++++ web/source/settings/index.js | 29 +- .../lib/navigation/{util.js => util.ts} | 21 +- web/source/settings/lib/query/admin/index.ts | 65 +++- .../settings/lib/query/admin/reports/index.ts | 2 +- web/source/settings/lib/types/account.ts | 88 +++++ web/source/settings/style.css | 41 ++- web/template/email_confirm.tmpl | 2 + web/template/email_report_closed.tmpl | 4 + web/template/email_reset.tmpl | 2 + web/template/email_signup_approved.tmpl | 34 ++ web/template/email_signup_rejected.tmpl | 28 ++ 74 files changed, 4102 insertions(+), 545 deletions(-) create mode 100644 docs/admin/signups.md create mode 100644 docs/assets/signup-account.png create mode 100644 docs/assets/signup-form.png create mode 100644 docs/assets/signup-pending.png create mode 100644 internal/api/client/admin/accountapprove.go create mode 100644 internal/api/client/admin/accountget.go create mode 100644 internal/api/client/admin/accountreject.go create mode 100644 internal/api/client/admin/accountsgetv1.go create mode 100644 internal/api/client/admin/accountsgetv2.go rename internal/processing/admin/{account.go => accountaction.go} (100%) create mode 100644 internal/processing/admin/accountapprove.go create mode 100644 internal/processing/admin/accountapprove_test.go create mode 100644 internal/processing/admin/accountget.go create mode 100644 internal/processing/admin/accountreject.go create mode 100644 internal/processing/admin/accountreject_test.go create mode 100644 internal/processing/admin/accounts.go delete mode 100644 web/source/settings/admin/accounts/detail.jsx create mode 100644 web/source/settings/admin/accounts/detail/actions.tsx create mode 100644 web/source/settings/admin/accounts/detail/handlesignup.tsx create mode 100644 web/source/settings/admin/accounts/detail/index.tsx delete mode 100644 web/source/settings/admin/accounts/index.jsx create mode 100644 web/source/settings/admin/accounts/index.tsx create mode 100644 web/source/settings/admin/accounts/pending/index.tsx create mode 100644 web/source/settings/admin/accounts/search/index.tsx rename web/source/settings/admin/actions/keys/{expireremote.jsx => expireremote.tsx} (76%) rename web/source/settings/admin/actions/keys/{index.jsx => index.tsx} (87%) rename web/source/settings/admin/actions/media/{cleanup.jsx => cleanup.tsx} (69%) rename web/source/settings/admin/actions/media/{index.jsx => index.tsx} (88%) rename web/source/settings/admin/emoji/local/{index.js => index.tsx} (80%) rename web/source/settings/admin/emoji/local/{new-emoji.js => new-emoji.tsx} (67%) rename web/source/settings/admin/emoji/remote/{index.js => index.tsx} (73%) rename web/source/settings/admin/emoji/remote/{parse-from-toot.js => parse-from-toot.tsx} (77%) rename web/source/settings/admin/reports/{detail.jsx => detail.tsx} (84%) rename web/source/settings/admin/reports/{index.jsx => index.tsx} (84%) rename web/source/settings/admin/reports/{username.jsx => username.tsx} (89%) rename web/source/settings/admin/settings/{rules.jsx => rules.tsx} (72%) create mode 100644 web/source/settings/components/account-list.tsx delete mode 100644 web/source/settings/components/form/mutation-button.jsx create mode 100644 web/source/settings/components/form/mutation-button.tsx rename web/source/settings/lib/navigation/{util.js => util.ts} (80%) create mode 100644 web/source/settings/lib/types/account.ts create mode 100644 web/template/email_signup_approved.tmpl create mode 100644 web/template/email_signup_rejected.tmpl diff --git a/docs/admin/signups.md b/docs/admin/signups.md new file mode 100644 index 000000000..db2010cf7 --- /dev/null +++ b/docs/admin/signups.md @@ -0,0 +1,59 @@ +# New Account Sign-Ups + +If you want to allow more people than just you to have an account on your instance, you can open your instance to new account sign-ups / registrations. + +Be wary that as instance admin, like it or not, you are responsible for what people post on your instance. If users on your instance harass or annoy other people on the fediverse, you may find your instance gets a bad reputation and becomes blocked by others. Moderating a space properly takes work. As such, you should carefully consider whether or not you are willing and able to do moderation, and consider accepting sign-ups on your instance only from friends and people that you really trust. + +!!! warning + For the sign-up flow to work as intended, your instance [should be configured to send emails](../configuration/smtp.md). + + As mentioned below, several emails are sent during the sign-up flow, both to you (as admin/moderator) and to the applicant, including an email asking them to confirm their email address. + + If they cannot receive this email (because your instance is not configured to send emails), you will have to manually confirm the account by [using the CLI tool](../admin/cli.md#gotosocial-admin-account-confirm). + +## Opening Sign-Ups + +You can open new account sign-ups for your instance by changing the variable `accounts-registration-open` to `true` in your [configuration](../configuration/accounts.md), and restarting your GoToSocial instance. + +A sign-up form for your instance will be available at the `/signup` endpoint. For example, `https://your-instance.example.org/signup`. + +![Sign-up form, showing email, password, username, and reason fields.](../assets/signup-form.png) + +Also, your instance homepage and "about" pages will be updated to reflect that registrations are open. + +When someone submits a new sign-up, they'll receive an email at the provided email address, giving them a link to confirm that the address really belongs to them. + +In the meantime, admins and moderators on your instance will receive an email and a notification that a new sign-up has been submitted. + +## Handling Sign-Ups + +Instance admins and moderators can handle a new sign-up by either approving or rejecting it via the "accounts" -> "pending" section in the admin panel. + +![Admin settings panel open to "accounts" -> "pending", showing one account in a list.](../assets/signup-pending.png) + +If you have no sign-ups, the list pictured above will be empty. If you have a pending account sign-up, however, you can click on it to open that account in the account details screen: + +![Details of a new pending account, giving options to approve or reject the sign-up.](../assets/signup-account.png) + +At the bottom, you will find actions that let you approve or reject the sign-up. + +If you **approve** the sign-up, the account will be marked as "approved", and an email will be sent to the applicant informing them their sign-up has been approved, and reminding them to confirm their email address if they haven't already done so. If they have already confirmed their email address, they will be able to log in and start using their account. + +If you **reject** the sign-up, you may wish to inform the applicant that their sign-up has been rejected, which you can do by ticking the "send email" checkbox. This will send a short email to the applicant informing them of the rejection. If you wish, you can add a custom message, which will be added at the bottom of the email. You can also add a private note that will be visible to other admins only. + +!!! warning + You may want to hold off on approving a sign-up until they have confirmed their email address, in case the applicant made a typo when submitting, or the email address they provided does not actually belong to them. If they cannot confirm their email address, they will not be able to log in and use their account. + +## Sign-Up Limits + +To avoid sign-up backlogs overwhelming admins and moderators, GoToSocial limits the sign-up pending backlog to 20 accounts. Once there are 20 accounts pending in the backlog waiting to be handled by an admin or moderator, new sign-ups will not be accepted via the form. + +New sign-ups will also not be accepted via the form if 10 or more new account sign-ups have been approved in the last 24 hours, to avoid instances rapidly expanding beyond the capabilities of moderators. + +In both cases, applicants will be shown an error message explaining why they could not submit the form, and inviting them to try again later. + +To combat spam accounts, GoToSocial account sign-ups **always** require manual approval by an administrator, and applicants must **always** confirm their email address before they are able to log in and post. + +## Sign-Up Via Invite + +NOT IMPLEMENTED YET: in a future update, admins and moderators will be able to create and send invites that allow accounts to be created even when public sign-up is closed, and to pre-approve accounts created via invitation, and/or allow them to override the sign-up limits described above. diff --git a/docs/api/swagger.yaml b/docs/api/swagger.yaml index 2215bddc6..d636b7586 100644 --- a/docs/api/swagger.yaml +++ b/docs/api/swagger.yaml @@ -3680,6 +3680,166 @@ paths: summary: Verify a token by returning account details pertaining to it. tags: - accounts + /api/v1/admin/accounts: + get: + description: |- + The next and previous queries can be parsed from the returned Link header. + Example: + + ``` + ; rel="next", ; rel="prev" + ```` + operationId: adminAccountsGetV1 + parameters: + - default: false + description: Filter for local accounts. + in: query + name: local + type: boolean + - default: false + description: Filter for remote accounts. + in: query + name: remote + type: boolean + - default: false + description: Filter for currently active accounts. + in: query + name: active + type: boolean + - default: false + description: Filter for currently pending accounts. + in: query + name: pending + type: boolean + - default: false + description: Filter for currently disabled accounts. + in: query + name: disabled + type: boolean + - default: false + description: Filter for currently silenced accounts. + in: query + name: silenced + type: boolean + - default: false + description: Filter for currently suspended accounts. + in: query + name: suspended + type: boolean + - default: false + description: Filter for accounts force-marked as sensitive. + in: query + name: sensitized + type: boolean + - description: Search for the given username. + in: query + name: username + type: string + - description: Search for the given display name. + in: query + name: display_name + type: string + - description: Filter by the given domain. + in: query + name: by_domain + type: string + - description: Lookup a user with this email. + in: query + name: email + type: string + - description: Lookup users with this IP address. + in: query + name: ip + type: string + - default: false + description: Filter for staff accounts. + in: query + name: staff + type: boolean + - description: All results returned will be older than the item with this ID. + in: query + name: max_id + type: string + - description: All results returned will be newer than the item with this ID. + in: query + name: since_id + type: string + - description: Returns results immediately newer than the item with this ID. + in: query + name: min_id + type: string + - default: 100 + description: Maximum number of results to return. + in: query + maximum: 200 + minimum: 1 + name: limit + type: integer + produces: + - application/json + responses: + "200": + description: "" + headers: + Link: + description: Links to the next and previous queries. + type: string + schema: + items: + $ref: '#/definitions/adminAccountInfo' + type: array + "400": + description: bad request + "401": + description: unauthorized + "403": + description: forbidden + "404": + description: not found + "406": + description: not acceptable + "500": + description: internal server error + security: + - OAuth2 Bearer: + - admin + summary: View + page through known accounts according to given filters. + tags: + - admin + /api/v1/admin/accounts/{id}: + get: + operationId: adminAccountGet + parameters: + - description: ID of the account. + in: path + name: id + required: true + type: string + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/adminAccountInfo' + "400": + description: bad request + "401": + description: unauthorized + "403": + description: forbidden + "404": + description: not found + "406": + description: not acceptable + "500": + description: internal server error + security: + - OAuth2 Bearer: + - admin + summary: View one account. + tags: + - admin /api/v1/admin/accounts/{id}/action: post: consumes: @@ -3725,6 +3885,86 @@ paths: summary: Perform an admin action on an account. tags: - admin + /api/v1/admin/accounts/{id}/approve: + post: + operationId: adminAccountApprove + parameters: + - description: ID of the account. + in: path + name: id + required: true + type: string + produces: + - application/json + responses: + "200": + description: The now-approved account. + schema: + $ref: '#/definitions/adminAccountInfo' + "400": + description: bad request + "401": + description: unauthorized + "403": + description: forbidden + "404": + description: not found + "406": + description: not acceptable + "500": + description: internal server error + security: + - OAuth2 Bearer: + - admin + summary: Approve pending account. + tags: + - admin + /api/v1/admin/accounts/{id}/reject: + post: + operationId: adminAccountReject + parameters: + - description: ID of the account. + in: path + name: id + required: true + type: string + - description: Comment to leave on why the account was denied. The comment will be visible to admins only. + in: formData + name: private_comment + type: string + - description: Message to include in email to applicant. Will be included only if send_email is true. + in: formData + name: message + type: string + - description: Send an email to the applicant informing them that their sign-up has been rejected. + in: formData + name: send_email + type: boolean + produces: + - application/json + responses: + "200": + description: The now-rejected account. + schema: + $ref: '#/definitions/adminAccountInfo' + "400": + description: bad request + "401": + description: unauthorized + "403": + description: forbidden + "404": + description: not found + "406": + description: not acceptable + "500": + description: internal server error + security: + - OAuth2 Bearer: + - admin + summary: Reject pending account. + tags: + - admin /api/v1/admin/custom_emojis: get: description: |- @@ -7934,6 +8174,109 @@ paths: summary: Change the password of authenticated user. tags: - user + /api/v2/admin/accounts: + get: + description: |- + The next and previous queries can be parsed from the returned Link header. + Example: + + ``` + ; rel="next", ; rel="prev" + ```` + operationId: adminAccountsGetV2 + parameters: + - description: Filter for `local` or `remote` accounts. + in: query + name: origin + type: string + - description: Filter for `active`, `pending`, `disabled`, `silenced`, or `suspended` accounts. + in: query + name: status + type: string + - description: Filter for accounts with staff permissions (users that can manage reports). + in: query + name: permissions + type: string + - description: Filter for users with these roles. + in: query + items: + type: string + name: role_ids[] + type: array + - description: Lookup users invited by the account with this ID. + in: query + name: invited_by + type: string + - description: Search for the given username. + in: query + name: username + type: string + - description: Search for the given display name. + in: query + name: display_name + type: string + - description: Filter by the given domain. + in: query + name: by_domain + type: string + - description: Lookup a user with this email. + in: query + name: email + type: string + - description: Lookup users with this IP address. + in: query + name: ip + type: string + - description: All results returned will be older than the item with this ID. + in: query + name: max_id + type: string + - description: All results returned will be newer than the item with this ID. + in: query + name: since_id + type: string + - description: Returns results immediately newer than the item with this ID. + in: query + name: min_id + type: string + - default: 100 + description: Maximum number of results to return. + in: query + maximum: 200 + minimum: 1 + name: limit + type: integer + produces: + - application/json + responses: + "200": + description: "" + headers: + Link: + description: Links to the next and previous queries. + type: string + schema: + items: + $ref: '#/definitions/adminAccountInfo' + type: array + "400": + description: bad request + "401": + description: unauthorized + "403": + description: forbidden + "404": + description: not found + "406": + description: not acceptable + "500": + description: internal server error + security: + - OAuth2 Bearer: + - admin + summary: View + page through known accounts according to given filters. + tags: + - admin /api/v2/instance: get: operationId: instanceGetV2 diff --git a/docs/assets/signup-account.png b/docs/assets/signup-account.png new file mode 100644 index 0000000000000000000000000000000000000000..ca0e9269f46ff6776ae99e0f2071f8e4c4f080e3 GIT binary patch literal 77617 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 VjvrCAh6Mo9p$9V3F27+H`5&9JBG>=` literal 0 HcmV?d00001 diff --git a/docs/assets/signup-form.png b/docs/assets/signup-form.png new file mode 100644 index 0000000000000000000000000000000000000000..405798bc2c21dc622852f8fd021dc55960e59b75 GIT binary patch literal 112173 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

-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 FzX2Mm-VXo( literal 0 HcmV?d00001 diff --git a/docs/assets/signup-pending.png b/docs/assets/signup-pending.png new file mode 100644 index 0000000000000000000000000000000000000000..a48a0b7263a02464ad6e7d9f9f3530824cdec2e8 GIT binary patch literal 73581 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 literal 0 HcmV?d00001 diff --git a/internal/api/client/admin/accountapprove.go b/internal/api/client/admin/accountapprove.go new file mode 100644 index 000000000..ff6474adb --- /dev/null +++ b/internal/api/client/admin/accountapprove.go @@ -0,0 +1,105 @@ +// 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 admin + +import ( + "fmt" + "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" +) + +// AccountApprovePOSTHandler swagger:operation POST /api/v1/admin/accounts/{id}/approve adminAccountApprove +// +// Approve pending account. +// +// --- +// tags: +// - admin +// +// produces: +// - application/json +// +// parameters: +// - +// name: id +// required: true +// in: path +// description: ID of the account. +// type: string +// +// security: +// - OAuth2 Bearer: +// - admin +// +// responses: +// '200': +// description: The now-approved account. +// schema: +// "$ref": "#/definitions/adminAccountInfo" +// '400': +// description: bad request +// '401': +// description: unauthorized +// '403': +// description: forbidden +// '404': +// description: not found +// '406': +// description: not acceptable +// '500': +// description: internal server error +func (m *Module) AccountApprovePOSTHandler(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 !*authed.User.Admin { + err := fmt.Errorf("user %s not an admin", authed.User.ID) + apiutil.ErrorHandler(c, gtserror.NewErrorForbidden(err, err.Error()), m.processor.InstanceGetV1) + return + } + + if authed.Account.IsMoving() { + apiutil.ForbiddenAfterMove(c) + return + } + + targetAcctID, errWithCode := apiutil.ParseID(c.Param(apiutil.IDKey)) + if errWithCode != nil { + apiutil.ErrorHandler(c, errWithCode, m.processor.InstanceGetV1) + return + } + + account, errWithCode := m.processor.Admin().AccountApprove( + c.Request.Context(), + authed.Account, + targetAcctID, + ) + if errWithCode != nil { + apiutil.ErrorHandler(c, errWithCode, m.processor.InstanceGetV1) + return + } + + apiutil.JSON(c, http.StatusOK, account) +} diff --git a/internal/api/client/admin/accountget.go b/internal/api/client/admin/accountget.go new file mode 100644 index 000000000..3a656fecc --- /dev/null +++ b/internal/api/client/admin/accountget.go @@ -0,0 +1,101 @@ +// 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 admin + +import ( + "fmt" + "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" +) + +// AccountGETHandler swagger:operation GET /api/v1/admin/accounts/{id} adminAccountGet +// +// View one account. +// +// --- +// tags: +// - admin +// +// produces: +// - application/json +// +// parameters: +// - +// name: id +// required: true +// in: path +// description: ID of the account. +// type: string +// +// security: +// - OAuth2 Bearer: +// - admin +// +// responses: +// '200': +// description: OK +// schema: +// "$ref": "#/definitions/adminAccountInfo" +// '400': +// description: bad request +// '401': +// description: unauthorized +// '403': +// description: forbidden +// '404': +// description: not found +// '406': +// description: not acceptable +// '500': +// description: internal server error +func (m *Module) AccountGETHandler(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 !*authed.User.Admin { + err := fmt.Errorf("user %s not an admin", authed.User.ID) + apiutil.ErrorHandler(c, gtserror.NewErrorForbidden(err, err.Error()), m.processor.InstanceGetV1) + return + } + + if authed.Account.IsMoving() { + apiutil.ForbiddenAfterMove(c) + return + } + + targetAcctID, errWithCode := apiutil.ParseID(c.Param(apiutil.IDKey)) + if errWithCode != nil { + apiutil.ErrorHandler(c, errWithCode, m.processor.InstanceGetV1) + return + } + + account, errWithCode := m.processor.Admin().AccountGet(c.Request.Context(), targetAcctID) + if errWithCode != nil { + apiutil.ErrorHandler(c, errWithCode, m.processor.InstanceGetV1) + return + } + + apiutil.JSON(c, http.StatusOK, account) +} diff --git a/internal/api/client/admin/accountreject.go b/internal/api/client/admin/accountreject.go new file mode 100644 index 000000000..1e909b508 --- /dev/null +++ b/internal/api/client/admin/accountreject.go @@ -0,0 +1,136 @@ +// 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 admin + +import ( + "fmt" + "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" +) + +// AccountRejectPOSTHandler swagger:operation POST /api/v1/admin/accounts/{id}/reject adminAccountReject +// +// Reject pending account. +// +// --- +// tags: +// - admin +// +// produces: +// - application/json +// +// parameters: +// - +// name: id +// required: true +// in: path +// description: ID of the account. +// type: string +// - +// name: private_comment +// in: formData +// description: >- +// Comment to leave on why the account was denied. +// The comment will be visible to admins only. +// type: string +// - +// name: message +// in: formData +// description: >- +// Message to include in email to applicant. +// Will be included only if send_email is true. +// type: string +// - +// name: send_email +// in: formData +// description: >- +// Send an email to the applicant informing +// them that their sign-up has been rejected. +// type: boolean +// +// security: +// - OAuth2 Bearer: +// - admin +// +// responses: +// '200': +// description: The now-rejected account. +// schema: +// "$ref": "#/definitions/adminAccountInfo" +// '400': +// description: bad request +// '401': +// description: unauthorized +// '403': +// description: forbidden +// '404': +// description: not found +// '406': +// description: not acceptable +// '500': +// description: internal server error +func (m *Module) AccountRejectPOSTHandler(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 !*authed.User.Admin { + err := fmt.Errorf("user %s not an admin", authed.User.ID) + apiutil.ErrorHandler(c, gtserror.NewErrorForbidden(err, err.Error()), m.processor.InstanceGetV1) + return + } + + if authed.Account.IsMoving() { + apiutil.ForbiddenAfterMove(c) + return + } + + targetAcctID, errWithCode := apiutil.ParseID(c.Param(apiutil.IDKey)) + if errWithCode != nil { + apiutil.ErrorHandler(c, errWithCode, m.processor.InstanceGetV1) + return + } + + form := new(apimodel.AdminAccountRejectRequest) + if err := c.ShouldBind(form); err != nil { + apiutil.ErrorHandler(c, gtserror.NewErrorBadRequest(err, err.Error()), m.processor.InstanceGetV1) + return + } + + account, errWithCode := m.processor.Admin().AccountReject( + c.Request.Context(), + authed.Account, + targetAcctID, + form.PrivateComment, + form.SendEmail, + form.Message, + ) + if errWithCode != nil { + apiutil.ErrorHandler(c, errWithCode, m.processor.InstanceGetV1) + return + } + + apiutil.JSON(c, http.StatusOK, account) +} diff --git a/internal/api/client/admin/accountsgetv1.go b/internal/api/client/admin/accountsgetv1.go new file mode 100644 index 000000000..604d74992 --- /dev/null +++ b/internal/api/client/admin/accountsgetv1.go @@ -0,0 +1,348 @@ +// 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 . + +// AccountsGETHandlerV1 swagger:operation GET /api/v1/admin/accounts adminAccountsGetV1 +// +// View + page through known accounts according to given filters. +// +// The next and previous queries can be parsed from the returned Link header. +// Example: +// +// ``` +// ; rel="next", ; rel="prev" +// ```` +// +// --- +// tags: +// - admin +// +// produces: +// - application/json +// +// parameters: +// - +// name: local +// in: query +// type: boolean +// description: Filter for local accounts. +// default: false +// - +// name: remote +// in: query +// type: boolean +// description: Filter for remote accounts. +// default: false +// - +// name: active +// in: query +// type: boolean +// description: Filter for currently active accounts. +// default: false +// - +// name: pending +// in: query +// type: boolean +// description: Filter for currently pending accounts. +// default: false +// - +// name: disabled +// in: query +// type: boolean +// description: Filter for currently disabled accounts. +// default: false +// - +// name: silenced +// in: query +// type: boolean +// description: Filter for currently silenced accounts. +// default: false +// - +// name: suspended +// in: query +// type: boolean +// description: Filter for currently suspended accounts. +// default: false +// - +// name: sensitized +// in: query +// type: boolean +// description: Filter for accounts force-marked as sensitive. +// default: false +// - +// name: username +// in: query +// type: string +// description: Search for the given username. +// - +// name: display_name +// in: query +// type: string +// description: Search for the given display name. +// - +// name: by_domain +// in: query +// type: string +// description: Filter by the given domain. +// - +// name: email +// in: query +// type: string +// description: Lookup a user with this email. +// - +// name: ip +// in: query +// type: string +// description: Lookup users with this IP address. +// - +// name: staff +// in: query +// type: boolean +// description: Filter for staff accounts. +// default: false +// - +// name: max_id +// in: query +// type: string +// description: All results returned will be older than the item with this ID. +// - +// name: since_id +// in: query +// type: string +// description: All results returned will be newer than the item with this ID. +// - +// name: min_id +// in: query +// type: string +// description: Returns results immediately newer than the item with this ID. +// - +// name: limit +// in: query +// type: integer +// description: Maximum number of results to return. +// default: 100 +// maximum: 200 +// minimum: 1 +// +// security: +// - OAuth2 Bearer: +// - admin +// +// responses: +// '200': +// headers: +// Link: +// type: string +// description: Links to the next and previous queries. +// schema: +// type: array +// items: +// "$ref": "#/definitions/adminAccountInfo" +// '400': +// description: bad request +// '401': +// description: unauthorized +// '403': +// description: forbidden +// '404': +// description: not found +// '406': +// description: not acceptable +// '500': +// description: internal server error +package admin + +import ( + "fmt" + "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" + "github.com/superseriousbusiness/gotosocial/internal/paging" +) + +func (m *Module) AccountsGETV1Handler(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 !*authed.User.Admin { + err := fmt.Errorf("user %s not an admin", authed.User.ID) + apiutil.ErrorHandler(c, gtserror.NewErrorForbidden(err, err.Error()), m.processor.InstanceGetV1) + return + } + + if authed.Account.IsMoving() { + apiutil.ForbiddenAfterMove(c) + return + } + + if _, err := apiutil.NegotiateAccept(c, apiutil.JSONAcceptHeaders...); err != nil { + apiutil.ErrorHandler(c, gtserror.NewErrorNotAcceptable(err, err.Error()), m.processor.InstanceGetV1) + return + } + + page, errWithCode := paging.ParseIDPage(c, 1, 200, 100) + if errWithCode != nil { + apiutil.ErrorHandler(c, errWithCode, m.processor.InstanceGetV1) + return + } + + /* Translate to v2 `origin` query param */ + + local, errWithCode := apiutil.ParseLocal(c.Query(apiutil.LocalKey), false) + if errWithCode != nil { + apiutil.ErrorHandler(c, errWithCode, m.processor.InstanceGetV1) + return + } + + remote, errWithCode := apiutil.ParseAdminRemote(c.Query(apiutil.AdminRemoteKey), false) + if errWithCode != nil { + apiutil.ErrorHandler(c, errWithCode, m.processor.InstanceGetV1) + return + } + + if local && remote { + keys := []string{apiutil.LocalKey, apiutil.AdminRemoteKey} + err := fmt.Errorf("only one of %+v can be true", keys) + apiutil.ErrorHandler(c, gtserror.NewErrorBadRequest(err, err.Error()), m.processor.InstanceGetV1) + return + } + + var origin string + if local { + origin = "local" + } else if remote { + origin = "remote" + } + + /* Translate to v2 `status` query param */ + + active, errWithCode := apiutil.ParseAdminActive(c.Query(apiutil.AdminActiveKey), false) + if errWithCode != nil { + apiutil.ErrorHandler(c, errWithCode, m.processor.InstanceGetV1) + return + } + + pending, errWithCode := apiutil.ParseAdminPending(c.Query(apiutil.AdminPendingKey), false) + if errWithCode != nil { + apiutil.ErrorHandler(c, errWithCode, m.processor.InstanceGetV1) + return + } + + disabled, errWithCode := apiutil.ParseAdminDisabled(c.Query(apiutil.AdminDisabledKey), false) + if errWithCode != nil { + apiutil.ErrorHandler(c, errWithCode, m.processor.InstanceGetV1) + return + } + + silenced, errWithCode := apiutil.ParseAdminSilenced(c.Query(apiutil.AdminSilencedKey), false) + if errWithCode != nil { + apiutil.ErrorHandler(c, errWithCode, m.processor.InstanceGetV1) + return + } + + suspended, errWithCode := apiutil.ParseAdminSuspended(c.Query(apiutil.AdminSuspendedKey), false) + if errWithCode != nil { + apiutil.ErrorHandler(c, errWithCode, m.processor.InstanceGetV1) + return + } + + // Ensure only one `status` query param set. + var status string + states := map[string]bool{ + apiutil.AdminActiveKey: active, + apiutil.AdminPendingKey: pending, + apiutil.AdminDisabledKey: disabled, + apiutil.AdminSilencedKey: silenced, + apiutil.AdminSuspendedKey: suspended, + } + for k, v := range states { + if !v { + // False status, + // so irrelevant. + continue + } + + if status != "" { + // Status was already set by another + // query param, this is an error. + keys := []string{ + apiutil.AdminActiveKey, + apiutil.AdminPendingKey, + apiutil.AdminDisabledKey, + apiutil.AdminSilencedKey, + apiutil.AdminSuspendedKey, + } + err := fmt.Errorf("only one of %+v can be true", keys) + apiutil.ErrorHandler(c, gtserror.NewErrorBadRequest(err, err.Error()), m.processor.InstanceGetV1) + return + } + + // Use this + // account status. + status = k + } + + /* Translate to v2 `permissions` query param */ + + staff, errWithCode := apiutil.ParseAdminStaff(c.Query(apiutil.AdminStaffKey), false) + if errWithCode != nil { + apiutil.ErrorHandler(c, errWithCode, m.processor.InstanceGetV1) + return + } + + var permissions string + if staff { + permissions = "staff" + } + + // Parse out all optional params from the query. + params := &apimodel.AdminGetAccountsRequest{ + Origin: origin, + Status: status, + Permissions: permissions, + RoleIDs: nil, // Can't do in V1. + InvitedBy: "", // Can't do in V1. + Username: c.Query(apiutil.UsernameKey), + DisplayName: c.Query(apiutil.AdminDisplayNameKey), + ByDomain: c.Query(apiutil.AdminByDomainKey), + Email: c.Query(apiutil.AdminEmailKey), + IP: c.Query(apiutil.AdminIPKey), + APIVersion: 1, + } + + resp, errWithCode := m.processor.Admin().AccountsGet( + c.Request.Context(), + params, + page, + ) + if errWithCode != nil { + apiutil.ErrorHandler(c, errWithCode, m.processor.InstanceGetV1) + return + } + + if resp.LinkHeader != "" { + c.Header("Link", resp.LinkHeader) + } + + apiutil.JSON(c, http.StatusOK, resp.Items) +} diff --git a/internal/api/client/admin/accountsgetv2.go b/internal/api/client/admin/accountsgetv2.go new file mode 100644 index 000000000..ca32b9e7f --- /dev/null +++ b/internal/api/client/admin/accountsgetv2.go @@ -0,0 +1,212 @@ +// 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 . + +// AccountsGETHandlerV2 swagger:operation GET /api/v2/admin/accounts adminAccountsGetV2 +// +// View + page through known accounts according to given filters. +// +// The next and previous queries can be parsed from the returned Link header. +// Example: +// +// ``` +// ; rel="next", ; rel="prev" +// ```` +// +// --- +// tags: +// - admin +// +// produces: +// - application/json +// +// parameters: +// - +// name: origin +// in: query +// type: string +// description: Filter for `local` or `remote` accounts. +// - +// name: status +// in: query +// type: string +// description: Filter for `active`, `pending`, `disabled`, `silenced`, or `suspended` accounts. +// - +// name: permissions +// in: query +// type: string +// description: Filter for accounts with staff permissions (users that can manage reports). +// - +// name: role_ids[] +// in: query +// type: array +// items: +// type: string +// description: Filter for users with these roles. +// - +// name: invited_by +// in: query +// type: string +// description: Lookup users invited by the account with this ID. +// - +// name: username +// in: query +// type: string +// description: Search for the given username. +// - +// name: display_name +// in: query +// type: string +// description: Search for the given display name. +// - +// name: by_domain +// in: query +// type: string +// description: Filter by the given domain. +// - +// name: email +// in: query +// type: string +// description: Lookup a user with this email. +// - +// name: ip +// in: query +// type: string +// description: Lookup users with this IP address. +// - +// name: max_id +// in: query +// type: string +// description: All results returned will be older than the item with this ID. +// - +// name: since_id +// in: query +// type: string +// description: All results returned will be newer than the item with this ID. +// - +// name: min_id +// in: query +// type: string +// description: Returns results immediately newer than the item with this ID. +// - +// name: limit +// in: query +// type: integer +// description: Maximum number of results to return. +// default: 100 +// maximum: 200 +// minimum: 1 +// +// security: +// - OAuth2 Bearer: +// - admin +// +// responses: +// '200': +// headers: +// Link: +// type: string +// description: Links to the next and previous queries. +// schema: +// type: array +// items: +// "$ref": "#/definitions/adminAccountInfo" +// '400': +// description: bad request +// '401': +// description: unauthorized +// '403': +// description: forbidden +// '404': +// description: not found +// '406': +// description: not acceptable +// '500': +// description: internal server error +package admin + +import ( + "fmt" + "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" + "github.com/superseriousbusiness/gotosocial/internal/paging" +) + +func (m *Module) AccountsGETV2Handler(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 !*authed.User.Admin { + err := fmt.Errorf("user %s not an admin", authed.User.ID) + apiutil.ErrorHandler(c, gtserror.NewErrorForbidden(err, err.Error()), m.processor.InstanceGetV1) + return + } + + if authed.Account.IsMoving() { + apiutil.ForbiddenAfterMove(c) + return + } + + if _, err := apiutil.NegotiateAccept(c, apiutil.JSONAcceptHeaders...); err != nil { + apiutil.ErrorHandler(c, gtserror.NewErrorNotAcceptable(err, err.Error()), m.processor.InstanceGetV1) + return + } + + page, errWithCode := paging.ParseIDPage(c, 1, 200, 100) + if errWithCode != nil { + apiutil.ErrorHandler(c, errWithCode, m.processor.InstanceGetV1) + return + } + + // Parse out all optional params from the query. + params := &apimodel.AdminGetAccountsRequest{ + Origin: c.Query(apiutil.AdminOriginKey), + Status: c.Query(apiutil.AdminStatusKey), + Permissions: c.Query(apiutil.AdminPermissionsKey), + RoleIDs: c.QueryArray(apiutil.AdminRoleIDsKey), + InvitedBy: c.Query(apiutil.AdminInvitedByKey), + Username: c.Query(apiutil.UsernameKey), + DisplayName: c.Query(apiutil.AdminDisplayNameKey), + ByDomain: c.Query(apiutil.AdminByDomainKey), + Email: c.Query(apiutil.AdminEmailKey), + IP: c.Query(apiutil.AdminIPKey), + APIVersion: 2, + } + + resp, errWithCode := m.processor.Admin().AccountsGet( + c.Request.Context(), + params, + page, + ) + if errWithCode != nil { + apiutil.ErrorHandler(c, errWithCode, m.processor.InstanceGetV1) + return + } + + if resp.LinkHeader != "" { + c.Header("Link", resp.LinkHeader) + } + + apiutil.JSON(c, http.StatusOK, resp.Items) +} diff --git a/internal/api/client/admin/admin.go b/internal/api/client/admin/admin.go index f247d7ce9..e898bca46 100644 --- a/internal/api/client/admin/admin.go +++ b/internal/api/client/admin/admin.go @@ -39,9 +39,12 @@ const ( HeaderAllowsPathWithID = HeaderAllowsPath + "/:" + IDKey HeaderBlocksPath = BasePath + "/header_blocks" HeaderBlocksPathWithID = HeaderBlocksPath + "/:" + IDKey - AccountsPath = BasePath + "/accounts" - AccountsPathWithID = AccountsPath + "/:" + IDKey + AccountsV1Path = BasePath + "/accounts" + AccountsV2Path = "/v2/admin/accounts" + AccountsPathWithID = AccountsV1Path + "/:" + IDKey AccountsActionPath = AccountsPathWithID + "/action" + AccountsApprovePath = AccountsPathWithID + "/approve" + AccountsRejectPath = AccountsPathWithID + "/reject" MediaCleanupPath = BasePath + "/media_cleanup" MediaRefetchPath = BasePath + "/media_refetch" ReportsPath = BasePath + "/reports" @@ -113,7 +116,12 @@ func (m *Module) Route(attachHandler func(method string, path string, f ...gin.H attachHandler(http.MethodPost, DomainKeysExpirePath, m.DomainKeysExpirePOSTHandler) // accounts stuff + attachHandler(http.MethodGet, AccountsV1Path, m.AccountsGETV1Handler) + attachHandler(http.MethodGet, AccountsV2Path, m.AccountsGETV2Handler) + attachHandler(http.MethodGet, AccountsPathWithID, m.AccountGETHandler) attachHandler(http.MethodPost, AccountsActionPath, m.AccountActionPOSTHandler) + attachHandler(http.MethodPost, AccountsApprovePath, m.AccountApprovePOSTHandler) + attachHandler(http.MethodPost, AccountsRejectPath, m.AccountRejectPOSTHandler) // media stuff attachHandler(http.MethodPost, MediaCleanupPath, m.MediaCleanupPOSTHandler) diff --git a/internal/api/model/admin.go b/internal/api/model/admin.go index ca84ffd88..637ab0ed7 100644 --- a/internal/api/model/admin.go +++ b/internal/api/model/admin.go @@ -229,3 +229,52 @@ type DebugAPUrlResponse struct { // may be an error, may be both! ResponseBody string `json:"response_body"` } + +// AdminGetAccountsRequest models a request +// to get an admin view of one or more +// accounts using given parameters. +// +// swagger:ignore +type AdminGetAccountsRequest struct { + // Filter for `local` or `remote` accounts. + Origin string + // Filter for `active`, `pending`, `disabled`, + // `silenced`, or `suspended` accounts. + Status string + // Filter for accounts with staff perms + // (users that can manage reports). + Permissions string + // Filter for users with these roles. + RoleIDs []string + // Lookup users invited by the account with this ID. + InvitedBy string + // Search for the given username. + Username string + // Search for the given display name. + DisplayName string + // Filter by the given domain. + ByDomain string + // Lookup a user with this email. + Email string + // Lookup users with this IP address. + IP string + // API version to use for this request (1 or 2). + // Set internally, not by callers. + APIVersion int +} + +// AdminAccountRejectRequest models a +// request to deny a new account sign-up. +// +// swagger:ignore +type AdminAccountRejectRequest struct { + // Comment to leave on why the account was denied. + // The comment will be visible to admins only. + PrivateComment string `form:"private_comment" json:"private_comment"` + // Message to include in email to applicant. + // Will be included only if send_email is true. + Message string `form:"message" json:"message"` + // Send an email to the applicant informing + // them that their sign-up has been rejected. + SendEmail bool `form:"send_email" json:"send_email"` +} diff --git a/internal/api/util/parsequery.go b/internal/api/util/parsequery.go index da6320b67..54cb4c466 100644 --- a/internal/api/util/parsequery.go +++ b/internal/api/util/parsequery.go @@ -34,12 +34,13 @@ const ( /* Common keys */ - IDKey = "id" - LimitKey = "limit" - LocalKey = "local" - MaxIDKey = "max_id" - SinceIDKey = "since_id" - MinIDKey = "min_id" + IDKey = "id" + LimitKey = "limit" + LocalKey = "local" + MaxIDKey = "max_id" + SinceIDKey = "since_id" + MinIDKey = "min_id" + UsernameKey = "username" /* AP endpoint keys */ @@ -61,19 +62,62 @@ const ( /* Web endpoint keys */ - WebUsernameKey = "username" WebStatusIDKey = "status" /* Domain permission keys */ DomainPermissionExportKey = "export" DomainPermissionImportKey = "import" + + /* Admin query keys */ + + AdminRemoteKey = "remote" + AdminActiveKey = "active" + AdminPendingKey = "pending" + AdminDisabledKey = "disabled" + AdminSilencedKey = "silenced" + AdminSuspendedKey = "suspended" + AdminSensitizedKey = "sensitized" + AdminDisplayNameKey = "display_name" + AdminByDomainKey = "by_domain" + AdminEmailKey = "email" + AdminIPKey = "ip" + AdminStaffKey = "staff" + AdminOriginKey = "origin" + AdminStatusKey = "status" + AdminPermissionsKey = "permissions" + AdminRoleIDsKey = "role_ids[]" + AdminInvitedByKey = "invited_by" ) /* Parse functions for *OPTIONAL* parameters with default values. */ +func ParseMaxID(value string, defaultValue string) string { + if value == "" { + return defaultValue + } + + return value +} + +func ParseSinceID(value string, defaultValue string) string { + if value == "" { + return defaultValue + } + + return value +} + +func ParseMinID(value string, defaultValue string) string { + if value == "" { + return defaultValue + } + + return value +} + func ParseLimit(value string, defaultValue int, max, min int) (int, gtserror.WithCode) { i, err := parseInt(value, defaultValue, max, min, LimitKey) if err != nil { @@ -87,14 +131,6 @@ func ParseLocal(value string, defaultValue bool) (bool, gtserror.WithCode) { return parseBool(value, defaultValue, LocalKey) } -func ParseMaxID(value string, defaultValue string) string { - if value == "" { - return defaultValue - } - - return value -} - func ParseSearchExcludeUnreviewed(value string, defaultValue bool) (bool, gtserror.WithCode) { return parseBool(value, defaultValue, SearchExcludeUnreviewedKey) } @@ -123,6 +159,34 @@ func ParseOnlyOtherAccounts(value string, defaultValue bool) (bool, gtserror.Wit return parseBool(value, defaultValue, OnlyOtherAccountsKey) } +func ParseAdminRemote(value string, defaultValue bool) (bool, gtserror.WithCode) { + return parseBool(value, defaultValue, AdminRemoteKey) +} + +func ParseAdminActive(value string, defaultValue bool) (bool, gtserror.WithCode) { + return parseBool(value, defaultValue, AdminActiveKey) +} + +func ParseAdminPending(value string, defaultValue bool) (bool, gtserror.WithCode) { + return parseBool(value, defaultValue, AdminPendingKey) +} + +func ParseAdminDisabled(value string, defaultValue bool) (bool, gtserror.WithCode) { + return parseBool(value, defaultValue, AdminDisabledKey) +} + +func ParseAdminSilenced(value string, defaultValue bool) (bool, gtserror.WithCode) { + return parseBool(value, defaultValue, AdminSilencedKey) +} + +func ParseAdminSuspended(value string, defaultValue bool) (bool, gtserror.WithCode) { + return parseBool(value, defaultValue, AdminSuspendedKey) +} + +func ParseAdminStaff(value string, defaultValue bool) (bool, gtserror.WithCode) { + return parseBool(value, defaultValue, AdminStaffKey) +} + /* Parse functions for *REQUIRED* parameters. */ @@ -187,8 +251,8 @@ func ParseTagName(value string) (string, gtserror.WithCode) { return value, nil } -func ParseWebUsername(value string) (string, gtserror.WithCode) { - key := WebUsernameKey +func ParseUsername(value string) (string, gtserror.WithCode) { + key := UsernameKey if value == "" { return "", requiredError(key) diff --git a/internal/db/account.go b/internal/db/account.go index 45276f41f..7cdf7b57f 100644 --- a/internal/db/account.go +++ b/internal/db/account.go @@ -19,9 +19,11 @@ package db import ( "context" + "net/netip" "time" "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" + "github.com/superseriousbusiness/gotosocial/internal/paging" ) // Account contains functions related to account getting/setting/creation. @@ -56,6 +58,25 @@ type Account interface { // GetAccountByFollowersURI returns one account with the given followers_uri, or an error if something goes wrong. GetAccountByFollowersURI(ctx context.Context, uri string) (*gtsmodel.Account, error) + // GetAccounts returns accounts + // with the given parameters. + GetAccounts( + ctx context.Context, + origin string, + status string, + mods bool, + invitedBy string, + username string, + displayName string, + domain string, + email string, + ip netip.Addr, + page *paging.Page, + ) ( + []*gtsmodel.Account, + error, + ) + // PopulateAccount ensures that all sub-models of an account are populated (e.g. avatar, header etc). PopulateAccount(ctx context.Context, account *gtsmodel.Account) error diff --git a/internal/db/bundb/account.go b/internal/db/bundb/account.go index 1ecf28e42..45e67c10b 100644 --- a/internal/db/bundb/account.go +++ b/internal/db/bundb/account.go @@ -20,6 +20,8 @@ package bundb import ( "context" "errors" + "fmt" + "net/netip" "slices" "strings" "time" @@ -31,6 +33,7 @@ import ( "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" "github.com/superseriousbusiness/gotosocial/internal/id" "github.com/superseriousbusiness/gotosocial/internal/log" + "github.com/superseriousbusiness/gotosocial/internal/paging" "github.com/superseriousbusiness/gotosocial/internal/state" "github.com/superseriousbusiness/gotosocial/internal/util" "github.com/uptrace/bun" @@ -249,6 +252,257 @@ func (a *accountDB) GetInstanceAccount(ctx context.Context, domain string) (*gts return a.GetAccountByUsernameDomain(ctx, username, domain) } +func (a *accountDB) GetAccounts( + ctx context.Context, + origin string, + status string, + mods bool, + invitedBy string, + username string, + displayName string, + domain string, + email string, + ip netip.Addr, + page *paging.Page, +) ( + []*gtsmodel.Account, + error, +) { + var ( + // local users lists, + // required for some + // limiting parameters. + users []*gtsmodel.User + + // lazyLoadUsers only loads the users + // slice if it's required by params. + lazyLoadUsers = func() (err error) { + if users == nil { + users, err = a.state.DB.GetAllUsers(gtscontext.SetBarebones(ctx)) + if err != nil { + return fmt.Errorf("error getting users: %w", err) + } + } + return nil + } + + // Get paging params. + // + // Note this may be min_id OR since_id + // from the API, this gets handled below + // when checking order to reverse slice. + minID = page.GetMin() + maxID = page.GetMax() + limit = page.GetLimit() + order = page.GetOrder() + + // Make educated guess for slice size + accountIDs = make([]string, 0, limit) + accountIDIn []string + + useAccountIDIn bool + ) + + q := a.db. + NewSelect(). + TableExpr("? AS ?", bun.Ident("accounts"), bun.Ident("account")). + // Select only IDs from table + Column("account.id") + + // Return only accounts OLDER + // than account with maxID. + if maxID != "" { + maxIDAcct, err := a.GetAccountByID( + gtscontext.SetBarebones(ctx), + maxID, + ) + if err != nil { + return nil, fmt.Errorf("error getting maxID account %s: %w", maxID, err) + } + + q = q.Where("? < ?", bun.Ident("account.created_at"), maxIDAcct.CreatedAt) + } + + // Return only accounts NEWER + // than account with minID. + if minID != "" { + minIDAcct, err := a.GetAccountByID( + gtscontext.SetBarebones(ctx), + minID, + ) + if err != nil { + return nil, fmt.Errorf("error getting minID account %s: %w", minID, err) + } + + q = q.Where("? > ?", bun.Ident("account.created_at"), minIDAcct.CreatedAt) + } + + switch status { + + case "active": + // Get only enabled accounts. + if err := lazyLoadUsers(); err != nil { + return nil, err + } + for _, user := range users { + if !*user.Disabled { + accountIDIn = append(accountIDIn, user.AccountID) + } + } + useAccountIDIn = true + + case "pending": + // Get only unapproved accounts. + if err := lazyLoadUsers(); err != nil { + return nil, err + } + for _, user := range users { + if !*user.Approved { + accountIDIn = append(accountIDIn, user.AccountID) + } + } + useAccountIDIn = true + + case "disabled": + // Get only disabled accounts. + if err := lazyLoadUsers(); err != nil { + return nil, err + } + for _, user := range users { + if *user.Disabled { + accountIDIn = append(accountIDIn, user.AccountID) + } + } + useAccountIDIn = true + + case "silenced": + // Get only silenced accounts. + q = q.Where("? IS NOT NULL", bun.Ident("account.silenced_at")) + + case "suspended": + // Get only suspended accounts. + q = q.Where("? IS NOT NULL", bun.Ident("account.suspended_at")) + } + + if mods { + // Get only mod accounts. + if err := lazyLoadUsers(); err != nil { + return nil, err + } + for _, user := range users { + if *user.Moderator || *user.Admin { + accountIDIn = append(accountIDIn, user.AccountID) + } + } + useAccountIDIn = true + } + + // TODO: invitedBy + + if username != "" { + q = q.Where("? = ?", bun.Ident("account.username"), username) + } + + if displayName != "" { + q = q.Where("? = ?", bun.Ident("account.display_name"), displayName) + } + + if domain != "" { + q = q.Where("? = ?", bun.Ident("account.domain"), domain) + } + + if email != "" { + if err := lazyLoadUsers(); err != nil { + return nil, err + } + for _, user := range users { + if user.Email == email || user.UnconfirmedEmail == email { + accountIDIn = append(accountIDIn, user.AccountID) + } + } + useAccountIDIn = true + } + + // Use ip if not zero value. + if ip.IsValid() { + if err := lazyLoadUsers(); err != nil { + return nil, err + } + for _, user := range users { + if user.SignUpIP.String() == ip.String() { + accountIDIn = append(accountIDIn, user.AccountID) + } + } + useAccountIDIn = true + } + + if origin == "local" && !useAccountIDIn { + // In the case we're not already limiting + // by specific subset of account IDs, just + // use existing list of user.AccountIDs + // instead of adding WHERE to the query. + if err := lazyLoadUsers(); err != nil { + return nil, err + } + for _, user := range users { + accountIDIn = append(accountIDIn, user.AccountID) + } + useAccountIDIn = true + + } else if origin == "remote" { + if useAccountIDIn { + // useAccountIDIn specifically indicates + // a parameter that limits querying to + // local accounts, there will be none. + return nil, nil + } + + // Get only remote accounts. + q = q.Where("? IS NOT NULL", bun.Ident("account.domain")) + } + + if useAccountIDIn { + if len(accountIDIn) == 0 { + // There will be no + // possible answer. + return nil, nil + } + + q = q.Where("? IN (?)", bun.Ident("account.id"), bun.In(accountIDIn)) + } + + if limit > 0 { + // Limit amount of + // accounts returned. + q = q.Limit(limit) + } + + if order == paging.OrderAscending { + // Page up. + q = q.Order("account.created_at ASC") + } else { + // Page down. + q = q.Order("account.created_at DESC") + } + + if err := q.Scan(ctx, &accountIDs); err != nil { + return nil, err + } + + if len(accountIDs) == 0 { + return nil, nil + } + + // If we're paging up, we still want accounts + // to be sorted by createdAt desc, so reverse ids slice. + if order == paging.OrderAscending { + slices.Reverse(accountIDs) + } + + // Return account IDs loaded from cache + db. + return a.state.DB.GetAccountsByIDs(ctx, accountIDs) +} + func (a *accountDB) getAccount(ctx context.Context, lookup string, dbQuery func(*gtsmodel.Account) error, keyParts ...any) (*gtsmodel.Account, error) { // Fetch account from database cache with loader callback account, err := a.state.Caches.GTS.Account.LoadOne(lookup, func() (*gtsmodel.Account, error) { diff --git a/internal/db/bundb/account_test.go b/internal/db/bundb/account_test.go index 21e04dedc..dd96543b6 100644 --- a/internal/db/bundb/account_test.go +++ b/internal/db/bundb/account_test.go @@ -23,6 +23,7 @@ import ( "crypto/rsa" "errors" "fmt" + "net/netip" "reflect" "strings" "testing" @@ -33,6 +34,7 @@ import ( "github.com/superseriousbusiness/gotosocial/internal/db" "github.com/superseriousbusiness/gotosocial/internal/db/bundb" "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" + "github.com/superseriousbusiness/gotosocial/internal/paging" "github.com/superseriousbusiness/gotosocial/internal/util" "github.com/uptrace/bun" ) @@ -491,6 +493,189 @@ func (suite *AccountTestSuite) TestPopulateAccountWithUnknownMovedToURI() { suite.NoError(err) } +func (suite *AccountTestSuite) TestGetAccountsAll() { + var ( + ctx = context.Background() + origin = "" + status = "" + mods = false + invitedBy = "" + username = "" + displayName = "" + domain = "" + email = "" + ip netip.Addr + page *paging.Page = nil + ) + + accounts, err := suite.db.GetAccounts( + ctx, + origin, + status, + mods, + invitedBy, + username, + displayName, + domain, + email, + ip, + page, + ) + if err != nil { + suite.FailNow(err.Error()) + } + + suite.Len(accounts, 9) +} + +func (suite *AccountTestSuite) TestGetAccountsModsOnly() { + var ( + ctx = context.Background() + origin = "" + status = "" + mods = true + invitedBy = "" + username = "" + displayName = "" + domain = "" + email = "" + ip netip.Addr + page = &paging.Page{ + Limit: 100, + } + ) + + accounts, err := suite.db.GetAccounts( + ctx, + origin, + status, + mods, + invitedBy, + username, + displayName, + domain, + email, + ip, + page, + ) + if err != nil { + suite.FailNow(err.Error()) + } + + suite.Len(accounts, 1) +} + +func (suite *AccountTestSuite) TestGetAccountsLocalWithEmail() { + var ( + ctx = context.Background() + origin = "local" + status = "" + mods = false + invitedBy = "" + username = "" + displayName = "" + domain = "" + email = "tortle.dude@example.org" + ip netip.Addr + page = &paging.Page{ + Limit: 100, + } + ) + + accounts, err := suite.db.GetAccounts( + ctx, + origin, + status, + mods, + invitedBy, + username, + displayName, + domain, + email, + ip, + page, + ) + if err != nil { + suite.FailNow(err.Error()) + } + + suite.Len(accounts, 1) +} + +func (suite *AccountTestSuite) TestGetAccountsWithIP() { + var ( + ctx = context.Background() + origin = "" + status = "" + mods = false + invitedBy = "" + username = "" + displayName = "" + domain = "" + email = "" + ip = netip.MustParseAddr("199.222.111.89") + page = &paging.Page{ + Limit: 100, + } + ) + + accounts, err := suite.db.GetAccounts( + ctx, + origin, + status, + mods, + invitedBy, + username, + displayName, + domain, + email, + ip, + page, + ) + if err != nil { + suite.FailNow(err.Error()) + } + + suite.Len(accounts, 1) +} + +func (suite *AccountTestSuite) TestGetPendingAccounts() { + var ( + ctx = context.Background() + origin = "" + status = "pending" + mods = false + invitedBy = "" + username = "" + displayName = "" + domain = "" + email = "" + ip netip.Addr + page = &paging.Page{ + Limit: 100, + } + ) + + accounts, err := suite.db.GetAccounts( + ctx, + origin, + status, + mods, + invitedBy, + username, + displayName, + domain, + email, + ip, + page, + ) + if err != nil { + suite.FailNow(err.Error()) + } + + suite.Len(accounts, 1) +} + func TestAccountTestSuite(t *testing.T) { suite.Run(t, new(AccountTestSuite)) } diff --git a/internal/db/bundb/user.go b/internal/db/bundb/user.go index 2854c0caa..f0221eeb1 100644 --- a/internal/db/bundb/user.go +++ b/internal/db/bundb/user.go @@ -230,3 +230,23 @@ func (u *userDB) DeleteUserByID(ctx context.Context, userID string) error { Exec(ctx) return err } + +func (u *userDB) PutDeniedUser(ctx context.Context, deniedUser *gtsmodel.DeniedUser) error { + _, err := u.db.NewInsert(). + Model(deniedUser). + Exec(ctx) + return err +} + +func (u *userDB) GetDeniedUserByID(ctx context.Context, id string) (*gtsmodel.DeniedUser, error) { + deniedUser := new(gtsmodel.DeniedUser) + if err := u.db. + NewSelect(). + Model(deniedUser). + Where("? = ?", bun.Ident("denied_user.id"), id). + Scan(ctx); err != nil { + return nil, err + } + + return deniedUser, nil +} diff --git a/internal/db/user.go b/internal/db/user.go index c762ef2b3..28fa59130 100644 --- a/internal/db/user.go +++ b/internal/db/user.go @@ -54,4 +54,10 @@ type User interface { // DeleteUserByID deletes one user by its ID. DeleteUserByID(ctx context.Context, userID string) error + + // PutDeniedUser inserts the given deniedUser into the db. + PutDeniedUser(ctx context.Context, deniedUser *gtsmodel.DeniedUser) error + + // GetDeniedUserByID returns one denied user with the given ID. + GetDeniedUserByID(ctx context.Context, id string) (*gtsmodel.DeniedUser, error) } diff --git a/internal/email/email_test.go b/internal/email/email_test.go index 34d0d1c2f..b57562cb5 100644 --- a/internal/email/email_test.go +++ b/internal/email/email_test.go @@ -50,7 +50,7 @@ func (suite *EmailTestSuite) TestTemplateConfirm() { 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\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 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) TestTemplateReset() { @@ -63,7 +63,7 @@ func (suite *EmailTestSuite) TestTemplateReset() { suite.sender.SendResetEmail("user@example.org", resetData) suite.Len(suite.sentEmails, 1) - suite.Equal("To: user@example.org\r\nFrom: test@example.org\r\nSubject: GoToSocial Password Reset\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 a password reset has been requested for your account on https://example.org.\r\n\r\nTo reset your password, paste the following in your browser's address bar:\r\n\r\nhttps://example.org/reset_email?token=ee24f71d-e615-43f9-afae-385c0799b7fa\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 Password Reset\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 a password reset has been requested for your account on https://example.org.\r\n\r\nTo reset your password, paste the following in your browser's address bar:\r\n\r\nhttps://example.org/reset_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) TestTemplateReportRemoteToLocal() { @@ -166,7 +166,7 @@ func (suite *EmailTestSuite) TestTemplateReportClosedOK() { suite.FailNow(err.Error()) } suite.Len(suite.sentEmails, 1) - suite.Equal("To: user@example.org\r\nFrom: test@example.org\r\nSubject: GoToSocial Report Closed\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 8bit\r\nContent-Type: text/plain; charset=\"UTF-8\"\r\n\r\nHello !\r\n\r\nYou recently reported the account @foss_satan@fossbros-anonymous.io to the moderator(s) of Test Instance (https://example.org).\r\n\r\nThe report you submitted has now been closed.\r\n\r\nThe moderator who closed the report left the following comment: User was yeeted. Thank you for reporting!\r\n\r\n", suite.sentEmails["user@example.org"]) + suite.Equal("To: user@example.org\r\nFrom: test@example.org\r\nSubject: GoToSocial Report Closed\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 8bit\r\nContent-Type: text/plain; charset=\"UTF-8\"\r\n\r\nHello !\r\n\r\nYou recently reported the account @foss_satan@fossbros-anonymous.io to the moderator(s) of Test Instance (https://example.org).\r\n\r\nThe report you submitted has now been closed.\r\n\r\nThe moderator who closed the report left the following comment: User was yeeted. Thank you for reporting!\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) TestTemplateReportClosedLocalAccountNoComment() { @@ -182,7 +182,7 @@ func (suite *EmailTestSuite) TestTemplateReportClosedLocalAccountNoComment() { suite.FailNow(err.Error()) } suite.Len(suite.sentEmails, 1) - suite.Equal("To: user@example.org\r\nFrom: test@example.org\r\nSubject: GoToSocial Report Closed\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 8bit\r\nContent-Type: text/plain; charset=\"UTF-8\"\r\n\r\nHello !\r\n\r\nYou recently reported the account @1happyturtle to the moderator(s) of Test Instance (https://example.org).\r\n\r\nThe report you submitted has now been closed.\r\n\r\nThe moderator who closed the report did not leave a comment.\r\n\r\n", suite.sentEmails["user@example.org"]) + suite.Equal("To: user@example.org\r\nFrom: test@example.org\r\nSubject: GoToSocial Report Closed\r\nMIME-Version: 1.0\r\nContent-Transfer-Encoding: 8bit\r\nContent-Type: text/plain; charset=\"UTF-8\"\r\n\r\nHello !\r\n\r\nYou recently reported the account @1happyturtle to the moderator(s) of Test Instance (https://example.org).\r\n\r\nThe report you submitted has now been closed.\r\n\r\nThe moderator who closed the report did not leave a comment.\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 TestEmailTestSuite(t *testing.T) { diff --git a/internal/email/noopsender.go b/internal/email/noopsender.go index 44aa86dba..20d7df2eb 100644 --- a/internal/email/noopsender.go +++ b/internal/email/noopsender.go @@ -72,6 +72,14 @@ func (s *noopSender) SendNewSignupEmail(toAddresses []string, data NewSignupData return s.sendTemplate(newSignupTemplate, newSignupSubject, data, toAddresses...) } +func (s *noopSender) SendSignupApprovedEmail(toAddress string, data SignupApprovedData) error { + return s.sendTemplate(signupApprovedTemplate, signupApprovedSubject, data, toAddress) +} + +func (s *noopSender) SendSignupRejectedEmail(toAddress string, data SignupRejectedData) error { + return s.sendTemplate(signupRejectedTemplate, signupRejectedSubject, data, toAddress) +} + func (s *noopSender) sendTemplate(template string, subject string, data any, toAddresses ...string) error { buf := &bytes.Buffer{} if err := s.template.ExecuteTemplate(buf, template, data); err != nil { diff --git a/internal/email/sender.go b/internal/email/sender.go index 78338a0dd..a3efa6124 100644 --- a/internal/email/sender.go +++ b/internal/email/sender.go @@ -53,6 +53,14 @@ type Sender interface { // It is expected that the toAddresses have already been filtered to ensure // that they all belong to active admins + moderators. SendNewSignupEmail(toAddress []string, data NewSignupData) error + + // SendSignupApprovedEmail sends an email to the given address + // that their sign-up request has been approved by a moderator. + SendSignupApprovedEmail(toAddress string, data SignupApprovedData) error + + // SendSignupRejectedEmail sends an email to the given address + // that their sign-up request has been rejected by a moderator. + SendSignupRejectedEmail(toAddress string, data SignupRejectedData) error } // NewSender returns a new email Sender interface with the given configuration, or an error if something goes wrong. diff --git a/internal/email/signup.go b/internal/email/signup.go index 84162c21e..2eaffc8a9 100644 --- a/internal/email/signup.go +++ b/internal/email/signup.go @@ -40,3 +40,39 @@ type NewSignupData struct { func (s *sender) SendNewSignupEmail(toAddresses []string, data NewSignupData) error { return s.sendTemplate(newSignupTemplate, newSignupSubject, data, toAddresses...) } + +var ( + signupApprovedTemplate = "email_signup_approved.tmpl" + signupApprovedSubject = "GoToSocial Sign-Up Approved" +) + +type SignupApprovedData struct { + // Username to be addressed. + Username string + // URL of the instance to present to the receiver. + InstanceURL string + // Name of the instance to present to the receiver. + InstanceName string +} + +func (s *sender) SendSignupApprovedEmail(toAddress string, data SignupApprovedData) error { + return s.sendTemplate(signupApprovedTemplate, signupApprovedSubject, data, toAddress) +} + +var ( + signupRejectedTemplate = "email_signup_rejected.tmpl" + signupRejectedSubject = "GoToSocial Sign-Up Rejected" +) + +type SignupRejectedData struct { + // Message to the rejected applicant. + Message string + // URL of the instance to present to the receiver. + InstanceURL string + // Name of the instance to present to the receiver. + InstanceName string +} + +func (s *sender) SendSignupRejectedEmail(toAddress string, data SignupRejectedData) error { + return s.sendTemplate(signupRejectedTemplate, signupRejectedSubject, data, toAddress) +} diff --git a/internal/processing/admin/account.go b/internal/processing/admin/accountaction.go similarity index 100% rename from internal/processing/admin/account.go rename to internal/processing/admin/accountaction.go diff --git a/internal/processing/admin/accountapprove.go b/internal/processing/admin/accountapprove.go new file mode 100644 index 000000000..e34cb18e3 --- /dev/null +++ b/internal/processing/admin/accountapprove.go @@ -0,0 +1,79 @@ +// 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 admin + +import ( + "context" + "errors" + "fmt" + + "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" +) + +func (p *Processor) AccountApprove( + ctx context.Context, + adminAcct *gtsmodel.Account, + accountID string, +) (*apimodel.AdminAccountInfo, gtserror.WithCode) { + user, err := p.state.DB.GetUserByAccountID(ctx, accountID) + if err != nil && !errors.Is(err, db.ErrNoEntries) { + err := gtserror.Newf("db error getting user for account id %s: %w", accountID, err) + return nil, gtserror.NewErrorInternalError(err) + } + + if user == nil { + err := fmt.Errorf("user for account %s not found", accountID) + return nil, gtserror.NewErrorNotFound(err, err.Error()) + } + + // Get a lock on the account URI, + // to ensure it's not also being + // rejected at the same time! + unlock := p.state.ClientLocks.Lock(user.Account.URI) + defer unlock() + + if !*user.Approved { + // Process approval side effects asynschronously. + p.state.Workers.EnqueueClientAPI(ctx, messages.FromClientAPI{ + APObjectType: ap.ActorPerson, + APActivityType: ap.ActivityAccept, + GTSModel: user, + OriginAccount: adminAcct, + TargetAccount: user.Account, + }) + } + + apiAccount, err := p.converter.AccountToAdminAPIAccount(ctx, user.Account) + if err != nil { + err := gtserror.Newf("error converting account %s to admin api model: %w", accountID, err) + return nil, gtserror.NewErrorInternalError(err) + } + + // Optimistically set approved to true and + // clear sign-up IP to reflect state that + // will be produced by side effects. + apiAccount.Approved = true + apiAccount.IP = nil + + return apiAccount, nil +} diff --git a/internal/processing/admin/accountapprove_test.go b/internal/processing/admin/accountapprove_test.go new file mode 100644 index 000000000..b6ca1ed32 --- /dev/null +++ b/internal/processing/admin/accountapprove_test.go @@ -0,0 +1,75 @@ +// 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 admin_test + +import ( + "context" + "testing" + + "github.com/stretchr/testify/suite" + "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" + "github.com/superseriousbusiness/gotosocial/testrig" +) + +type AdminApproveTestSuite struct { + AdminStandardTestSuite +} + +func (suite *AdminApproveTestSuite) TestApprove() { + var ( + ctx = context.Background() + adminAcct = suite.testAccounts["admin_account"] + targetAcct = suite.testAccounts["unconfirmed_account"] + targetUser = new(gtsmodel.User) + ) + + // Copy user since we're modifying it. + *targetUser = *suite.testUsers["unconfirmed_account"] + + // Approve the sign-up. + acct, errWithCode := suite.adminProcessor.AccountApprove( + ctx, + adminAcct, + targetAcct.ID, + ) + if errWithCode != nil { + suite.FailNow(errWithCode.Error()) + } + + // Account should be approved. + suite.NotNil(acct) + suite.True(acct.Approved) + suite.Nil(acct.IP) + + // Wait for processor to + // handle side effects. + var ( + dbUser *gtsmodel.User + err error + ) + if !testrig.WaitFor(func() bool { + dbUser, err = suite.state.DB.GetUserByID(ctx, targetUser.ID) + return err == nil && dbUser != nil && *dbUser.Approved + }) { + suite.FailNow("waiting for approved user") + } +} + +func TestAdminApproveTestSuite(t *testing.T) { + suite.Run(t, new(AdminApproveTestSuite)) +} diff --git a/internal/processing/admin/accountget.go b/internal/processing/admin/accountget.go new file mode 100644 index 000000000..5a3c34c62 --- /dev/null +++ b/internal/processing/admin/accountget.go @@ -0,0 +1,49 @@ +// 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 admin + +import ( + "context" + "errors" + "fmt" + + apimodel "github.com/superseriousbusiness/gotosocial/internal/api/model" + "github.com/superseriousbusiness/gotosocial/internal/db" + "github.com/superseriousbusiness/gotosocial/internal/gtserror" +) + +func (p *Processor) AccountGet(ctx context.Context, accountID string) (*apimodel.AdminAccountInfo, gtserror.WithCode) { + account, err := p.state.DB.GetAccountByID(ctx, accountID) + if err != nil && !errors.Is(err, db.ErrNoEntries) { + err := gtserror.Newf("db error getting account %s: %w", accountID, err) + return nil, gtserror.NewErrorInternalError(err) + } + + if account == nil { + err := fmt.Errorf("account %s not found", accountID) + return nil, gtserror.NewErrorNotFound(err, err.Error()) + } + + apiAccount, err := p.converter.AccountToAdminAPIAccount(ctx, account) + if err != nil { + err := gtserror.Newf("error converting account %s to admin api model: %w", accountID, err) + return nil, gtserror.NewErrorInternalError(err) + } + + return apiAccount, nil +} diff --git a/internal/processing/admin/accountreject.go b/internal/processing/admin/accountreject.go new file mode 100644 index 000000000..bc7a1c20a --- /dev/null +++ b/internal/processing/admin/accountreject.go @@ -0,0 +1,113 @@ +// 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 admin + +import ( + "context" + "errors" + "fmt" + + "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" +) + +func (p *Processor) AccountReject( + ctx context.Context, + adminAcct *gtsmodel.Account, + accountID string, + privateComment string, + sendEmail bool, + message string, +) (*apimodel.AdminAccountInfo, gtserror.WithCode) { + user, err := p.state.DB.GetUserByAccountID(ctx, accountID) + if err != nil && !errors.Is(err, db.ErrNoEntries) { + err := gtserror.Newf("db error getting user for account id %s: %w", accountID, err) + return nil, gtserror.NewErrorInternalError(err) + } + + if user == nil { + err := fmt.Errorf("user for account %s not found", accountID) + return nil, gtserror.NewErrorNotFound(err, err.Error()) + } + + // Get a lock on the account URI, + // since we're going to be deleting + // it and its associated user. + unlock := p.state.ClientLocks.Lock(user.Account.URI) + defer unlock() + + // Can't reject an account with a + // user that's already been approved. + if *user.Approved { + err := fmt.Errorf("account %s has already been approved", accountID) + return nil, gtserror.NewErrorUnprocessableEntity(err, err.Error()) + } + + // Convert to API account *before* doing the + // rejection, since the rejection will cause + // the user and account to be removed. + apiAccount, err := p.converter.AccountToAdminAPIAccount(ctx, user.Account) + if err != nil { + err := gtserror.Newf("error converting account %s to admin api model: %w", accountID, err) + return nil, gtserror.NewErrorInternalError(err) + } + + // Set approved to false on the API model, to + // reflect the changes that will occur + // asynchronously in the processor. + apiAccount.Approved = false + + // Ensure we an email address. + var email string + if user.Email != "" { + email = user.Email + } else { + email = user.UnconfirmedEmail + } + + // Create a denied user entry for + // the worker to process + store. + deniedUser := >smodel.DeniedUser{ + ID: user.ID, + Email: email, + Username: user.Account.Username, + SignUpIP: user.SignUpIP, + InviteID: user.InviteID, + Locale: user.Locale, + CreatedByApplicationID: user.CreatedByApplicationID, + SignUpReason: user.Reason, + PrivateComment: privateComment, + SendEmail: &sendEmail, + Message: message, + } + + // Process rejection side effects asynschronously. + p.state.Workers.EnqueueClientAPI(ctx, messages.FromClientAPI{ + APObjectType: ap.ActorPerson, + APActivityType: ap.ActivityReject, + GTSModel: deniedUser, + OriginAccount: adminAcct, + TargetAccount: user.Account, + }) + + return apiAccount, nil +} diff --git a/internal/processing/admin/accountreject_test.go b/internal/processing/admin/accountreject_test.go new file mode 100644 index 000000000..071401afc --- /dev/null +++ b/internal/processing/admin/accountreject_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 admin_test + +import ( + "context" + "testing" + + "github.com/stretchr/testify/suite" + "github.com/superseriousbusiness/gotosocial/internal/db" + "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" + "github.com/superseriousbusiness/gotosocial/testrig" +) + +type AdminRejectTestSuite struct { + AdminStandardTestSuite +} + +func (suite *AdminRejectTestSuite) TestReject() { + var ( + ctx = context.Background() + adminAcct = suite.testAccounts["admin_account"] + targetAcct = suite.testAccounts["unconfirmed_account"] + targetUser = suite.testUsers["unconfirmed_account"] + privateComment = "It's a no from me chief." + sendEmail = true + message = "Too stinky." + ) + + acct, errWithCode := suite.adminProcessor.AccountReject( + ctx, + adminAcct, + targetAcct.ID, + privateComment, + sendEmail, + message, + ) + if errWithCode != nil { + suite.FailNow(errWithCode.Error()) + } + suite.NotNil(acct) + suite.False(acct.Approved) + + // Wait for processor to + // handle side effects. + var ( + deniedUser *gtsmodel.DeniedUser + err error + ) + if !testrig.WaitFor(func() bool { + deniedUser, err = suite.state.DB.GetDeniedUserByID(ctx, targetUser.ID) + return deniedUser != nil && err == nil + }) { + suite.FailNow("waiting for denied user") + } + + // Ensure fields as expected. + suite.Equal(targetUser.ID, deniedUser.ID) + suite.Equal(targetUser.UnconfirmedEmail, deniedUser.Email) + suite.Equal(targetAcct.Username, deniedUser.Username) + suite.Equal(targetUser.SignUpIP, deniedUser.SignUpIP) + suite.Equal(targetUser.InviteID, deniedUser.InviteID) + suite.Equal(targetUser.Locale, deniedUser.Locale) + suite.Equal(targetUser.CreatedByApplicationID, deniedUser.CreatedByApplicationID) + suite.Equal(targetUser.Reason, deniedUser.SignUpReason) + suite.Equal(privateComment, deniedUser.PrivateComment) + suite.Equal(sendEmail, *deniedUser.SendEmail) + suite.Equal(message, deniedUser.Message) + + // Should be no user entry for + // this denied request now. + _, err = suite.state.DB.GetUserByID(ctx, targetUser.ID) + suite.ErrorIs(db.ErrNoEntries, err) + + // Should be no account entry for + // this denied request now. + _, err = suite.state.DB.GetAccountByID(ctx, targetAcct.ID) + suite.ErrorIs(db.ErrNoEntries, err) +} + +func (suite *AdminRejectTestSuite) TestRejectRemote() { + var ( + ctx = context.Background() + adminAcct = suite.testAccounts["admin_account"] + targetAcct = suite.testAccounts["remote_account_1"] + privateComment = "It's a no from me chief." + sendEmail = true + message = "Too stinky." + ) + + // Try to reject a remote account. + _, err := suite.adminProcessor.AccountReject( + ctx, + adminAcct, + targetAcct.ID, + privateComment, + sendEmail, + message, + ) + suite.EqualError(err, "user for account 01F8MH5ZK5VRH73AKHQM6Y9VNX not found") +} + +func (suite *AdminRejectTestSuite) TestRejectApproved() { + var ( + ctx = context.Background() + adminAcct = suite.testAccounts["admin_account"] + targetAcct = suite.testAccounts["local_account_1"] + privateComment = "It's a no from me chief." + sendEmail = true + message = "Too stinky." + ) + + // Try to reject an already-approved account. + _, err := suite.adminProcessor.AccountReject( + ctx, + adminAcct, + targetAcct.ID, + privateComment, + sendEmail, + message, + ) + suite.EqualError(err, "account 01F8MH1H7YV1Z7D2C8K2730QBF has already been approved") +} + +func TestAdminRejectTestSuite(t *testing.T) { + suite.Run(t, new(AdminRejectTestSuite)) +} diff --git a/internal/processing/admin/accounts.go b/internal/processing/admin/accounts.go new file mode 100644 index 000000000..ca35b0a30 --- /dev/null +++ b/internal/processing/admin/accounts.go @@ -0,0 +1,272 @@ +// 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 admin + +import ( + "context" + "errors" + "fmt" + "net/netip" + "net/url" + "slices" + + apimodel "github.com/superseriousbusiness/gotosocial/internal/api/model" + apiutil "github.com/superseriousbusiness/gotosocial/internal/api/util" + "github.com/superseriousbusiness/gotosocial/internal/db" + "github.com/superseriousbusiness/gotosocial/internal/gtserror" + "github.com/superseriousbusiness/gotosocial/internal/log" + "github.com/superseriousbusiness/gotosocial/internal/paging" +) + +var ( + accountsValidOrigins = []string{"local", "remote"} + accountsValidStatuses = []string{"active", "pending", "disabled", "silenced", "suspended"} + accountsValidPermissions = []string{"staff"} +) + +func (p *Processor) AccountsGet( + ctx context.Context, + request *apimodel.AdminGetAccountsRequest, + page *paging.Page, +) ( + *apimodel.PageableResponse, + gtserror.WithCode, +) { + // Validate "origin". + if v := request.Origin; v != "" { + if !slices.Contains(accountsValidOrigins, v) { + err := fmt.Errorf( + "origin %s not recognized; valid choices are %+v", + v, accountsValidOrigins, + ) + return nil, gtserror.NewErrorBadRequest(err, err.Error()) + } + } + + // Validate "status". + if v := request.Status; v != "" { + if !slices.Contains(accountsValidStatuses, v) { + err := fmt.Errorf( + "status %s not recognized; valid choices are %+v", + v, accountsValidStatuses, + ) + return nil, gtserror.NewErrorBadRequest(err, err.Error()) + } + } + + // Validate "permissions". + if v := request.Permissions; v != "" { + if !slices.Contains(accountsValidPermissions, v) { + err := fmt.Errorf( + "permissions %s not recognized; valid choices are %+v", + v, accountsValidPermissions, + ) + return nil, gtserror.NewErrorBadRequest(err, err.Error()) + } + } + + // Validate/parse IP. + var ip netip.Addr + if v := request.IP; v != "" { + var err error + ip, err = netip.ParseAddr(request.IP) + if err != nil { + err := fmt.Errorf("invalid ip provided: %w", err) + return nil, gtserror.NewErrorBadRequest(err, err.Error()) + } + } + + // Get accounts with the given params. + accounts, err := p.state.DB.GetAccounts( + ctx, + request.Origin, + request.Status, + func() bool { return request.Permissions == "staff" }(), + request.InvitedBy, + request.Username, + request.DisplayName, + request.ByDomain, + request.Email, + ip, + page, + ) + if err != nil && !errors.Is(err, db.ErrNoEntries) { + err = gtserror.Newf("db error getting accounts: %w", err) + return nil, gtserror.NewErrorInternalError(err) + } + + count := len(accounts) + if count == 0 { + return paging.EmptyResponse(), nil + } + + hi := accounts[count-1].ID + lo := accounts[0].ID + + items := make([]interface{}, 0, count) + for _, account := range accounts { + apiAccount, err := p.converter.AccountToAdminAPIAccount(ctx, account) + if err != nil { + log.Errorf(ctx, "error converting to api account: %v", err) + continue + } + items = append(items, apiAccount) + } + + // Return packaging + paging appropriate for + // the API version used to call this function. + switch request.APIVersion { + case 1: + return packageAccountsV1(items, lo, hi, request, page) + + case 2: + return packageAccountsV2(items, lo, hi, request, page) + + default: + log.Panic(ctx, "api version was neither 1 nor 2") + return nil, nil + } +} + +func packageAccountsV1( + items []interface{}, + loID, hiID string, + request *apimodel.AdminGetAccountsRequest, + page *paging.Page, +) (*apimodel.PageableResponse, gtserror.WithCode) { + queryParams := make(url.Values, 8) + + // Translate origin to v1. + if v := request.Origin; v != "" { + var k string + + if v == "local" { + k = apiutil.LocalKey + } else { + k = apiutil.AdminRemoteKey + } + + queryParams.Add(k, "true") + } + + // Translate status to v1. + if v := request.Status; v != "" { + var k string + + switch v { + case "active": + k = apiutil.AdminActiveKey + case "pending": + k = apiutil.AdminPendingKey + case "disabled": + k = apiutil.AdminDisabledKey + case "silenced": + k = apiutil.AdminSilencedKey + case "suspended": + k = apiutil.AdminSuspendedKey + } + + queryParams.Add(k, "true") + } + + if v := request.Username; v != "" { + queryParams.Add(apiutil.UsernameKey, v) + } + + if v := request.DisplayName; v != "" { + queryParams.Add(apiutil.AdminDisplayNameKey, v) + } + + if v := request.ByDomain; v != "" { + queryParams.Add(apiutil.AdminByDomainKey, v) + } + + if v := request.Email; v != "" { + queryParams.Add(apiutil.AdminEmailKey, v) + } + + if v := request.IP; v != "" { + queryParams.Add(apiutil.AdminIPKey, v) + } + + // Translate permissions to v1. + if v := request.Permissions; v != "" { + queryParams.Add(apiutil.AdminStaffKey, v) + } + + return paging.PackageResponse(paging.ResponseParams{ + Items: items, + Path: "/api/v1/admin/accounts", + Next: page.Next(loID, hiID), + Prev: page.Prev(loID, hiID), + Query: queryParams, + }), nil +} + +func packageAccountsV2( + items []interface{}, + loID, hiID string, + request *apimodel.AdminGetAccountsRequest, + page *paging.Page, +) (*apimodel.PageableResponse, gtserror.WithCode) { + queryParams := make(url.Values, 9) + + if v := request.Origin; v != "" { + queryParams.Add(apiutil.AdminOriginKey, v) + } + + if v := request.Status; v != "" { + queryParams.Add(apiutil.AdminStatusKey, v) + } + + if v := request.Permissions; v != "" { + queryParams.Add(apiutil.AdminPermissionsKey, v) + } + + if v := request.InvitedBy; v != "" { + queryParams.Add(apiutil.AdminInvitedByKey, v) + } + + if v := request.Username; v != "" { + queryParams.Add(apiutil.UsernameKey, v) + } + + if v := request.DisplayName; v != "" { + queryParams.Add(apiutil.AdminDisplayNameKey, v) + } + + if v := request.ByDomain; v != "" { + queryParams.Add(apiutil.AdminByDomainKey, v) + } + + if v := request.Email; v != "" { + queryParams.Add(apiutil.AdminEmailKey, v) + } + + if v := request.IP; v != "" { + queryParams.Add(apiutil.AdminIPKey, v) + } + + return paging.PackageResponse(paging.ResponseParams{ + Items: items, + Path: "/api/v2/admin/accounts", + Next: page.Next(loID, hiID), + Prev: page.Prev(loID, hiID), + Query: queryParams, + }), nil +} diff --git a/internal/processing/workers/fromclientapi.go b/internal/processing/workers/fromclientapi.go index ed513c331..37c330cf0 100644 --- a/internal/processing/workers/fromclientapi.go +++ b/internal/processing/workers/fromclientapi.go @@ -33,6 +33,7 @@ import ( "github.com/superseriousbusiness/gotosocial/internal/processing/account" "github.com/superseriousbusiness/gotosocial/internal/state" "github.com/superseriousbusiness/gotosocial/internal/typeutils" + "github.com/superseriousbusiness/gotosocial/internal/util" ) // clientAPI wraps processing functions @@ -141,6 +142,10 @@ func (p *Processor) ProcessFromClientAPI(ctx context.Context, cMsg messages.From // ACCEPT FOLLOW (request) 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) } // REJECT SOMETHING @@ -150,6 +155,10 @@ func (p *Processor) ProcessFromClientAPI(ctx context.Context, cMsg messages.From // REJECT FOLLOW (request) 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) } // UNDO SOMETHING @@ -685,3 +694,66 @@ func (p *clientAPI) MoveAccount(ctx context.Context, cMsg messages.FromClientAPI return nil } + +func (p *clientAPI) AcceptAccount(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) + } + + // Mark user as approved + clear sign-up IP. + newUser.Approved = util.Ptr(true) + newUser.SignUpIP = nil + if err := p.state.DB.UpdateUser(ctx, newUser, "approved", "sign_up_ip"); err != nil { + // Error now means we should return without + // sending email + let admin try to approve again. + return gtserror.Newf("db error updating user %s: %w", newUser.ID, err) + } + + // Send "your sign-up has been approved" email to the new user. + if err := p.surface.emailUserSignupApproved(ctx, newUser); err != nil { + log.Errorf(ctx, "error emailing: %v", err) + } + + return nil +} + +func (p *clientAPI) RejectAccount(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) + } + + // Remove the account. + if err := p.state.DB.DeleteAccount(ctx, cMsg.TargetAccount.ID); err != nil { + log.Errorf(ctx, + "db error deleting account %s: %v", + cMsg.TargetAccount.ID, err, + ) + } + + // Remove the user. + if err := p.state.DB.DeleteUserByID(ctx, deniedUser.ID); err != nil { + log.Errorf(ctx, + "db error deleting user %s: %v", + deniedUser.ID, err, + ) + } + + // Store the deniedUser entry. + if err := p.state.DB.PutDeniedUser(ctx, deniedUser); err != nil { + log.Errorf(ctx, + "db error putting denied user %s: %v", + deniedUser.ID, err, + ) + } + + if *deniedUser.SendEmail { + // Send "your sign-up has been rejected" email to the denied user. + if err := p.surface.emailUserSignupRejected(ctx, deniedUser); err != nil { + log.Errorf(ctx, "error emailing: %v", err) + } + } + + return nil +} diff --git a/internal/processing/workers/surfaceemail.go b/internal/processing/workers/surfaceemail.go index c00b22c86..3a5b5e7f4 100644 --- a/internal/processing/workers/surfaceemail.go +++ b/internal/processing/workers/surfaceemail.go @@ -129,6 +129,69 @@ func (s *surface) emailUserPleaseConfirm(ctx context.Context, user *gtsmodel.Use return nil } +// emailUserSignupApproved emails the given user +// to inform them their sign-up has been approved. +func (s *surface) emailUserSignupApproved(ctx context.Context, user *gtsmodel.User) error { + // User may have been approved without + // their email address being confirmed + // yet. Just send to whatever we have. + emailAddr := user.Email + if emailAddr == "" { + emailAddr = user.UnconfirmedEmail + } + + instance, err := s.state.DB.GetInstance(ctx, config.GetHost()) + if err != nil { + return gtserror.Newf("db error getting instance: %w", err) + } + + // Assemble email contents and send the email. + if err := s.emailSender.SendSignupApprovedEmail( + emailAddr, + email.SignupApprovedData{ + Username: user.Account.Username, + InstanceURL: instance.URI, + InstanceName: instance.Title, + }, + ); err != nil { + return err + } + + // Email sent, update the user + // entry with the emailed time. + now := time.Now() + user.LastEmailedAt = now + + if err := s.state.DB.UpdateUser( + ctx, + user, + "last_emailed_at", + ); err != nil { + return gtserror.Newf("error updating user entry after email sent: %w", err) + } + + return nil +} + +// emailUserSignupApproved emails the given user +// to inform them their sign-up has been approved. +func (s *surface) emailUserSignupRejected(ctx context.Context, deniedUser *gtsmodel.DeniedUser) error { + instance, err := s.state.DB.GetInstance(ctx, config.GetHost()) + if err != nil { + return gtserror.Newf("db error getting instance: %w", err) + } + + // Assemble email contents and send the email. + return s.emailSender.SendSignupRejectedEmail( + deniedUser.Email, + email.SignupRejectedData{ + Message: deniedUser.Message, + InstanceURL: instance.URI, + InstanceName: instance.Title, + }, + ) +} + // emailAdminReportOpened emails all active moderators/admins // of this instance that a new report has been created. func (s *surface) emailAdminReportOpened(ctx context.Context, report *gtsmodel.Report) error { @@ -193,7 +256,7 @@ func (s *surface) emailAdminNewSignup(ctx context.Context, newUser *gtsmodel.Use SignupEmail: newUser.UnconfirmedEmail, SignupUsername: newUser.Account.Username, SignupReason: newUser.Reason, - SignupURL: "TODO", + SignupURL: instance.URI + "/settings/admin/accounts/" + newUser.AccountID, } if err := s.emailSender.SendNewSignupEmail(toAddresses, newSignupData); err != nil { diff --git a/internal/web/customcss.go b/internal/web/customcss.go index b23ebce8e..b4072f2a7 100644 --- a/internal/web/customcss.go +++ b/internal/web/customcss.go @@ -34,7 +34,7 @@ func (m *Module) customCSSGETHandler(c *gin.Context) { return } - targetUsername, errWithCode := apiutil.ParseWebUsername(c.Param(apiutil.WebUsernameKey)) + targetUsername, errWithCode := apiutil.ParseUsername(c.Param(apiutil.UsernameKey)) if errWithCode != nil { apiutil.WebErrorHandler(c, errWithCode, m.processor.InstanceGetV1) return diff --git a/internal/web/profile.go b/internal/web/profile.go index a4809a72d..1dbf5c73d 100644 --- a/internal/web/profile.go +++ b/internal/web/profile.go @@ -49,7 +49,7 @@ func (m *Module) profileGETHandler(c *gin.Context) { } // Parse account targetUsername from the URL. - targetUsername, errWithCode := apiutil.ParseWebUsername(c.Param(apiutil.WebUsernameKey)) + targetUsername, errWithCode := apiutil.ParseUsername(c.Param(apiutil.UsernameKey)) if errWithCode != nil { apiutil.WebErrorHandler(c, errWithCode, instanceGet) return diff --git a/internal/web/rss.go b/internal/web/rss.go index 2d98efcb3..ced74ed6b 100644 --- a/internal/web/rss.go +++ b/internal/web/rss.go @@ -38,7 +38,7 @@ func (m *Module) rssFeedGETHandler(c *gin.Context) { } // Fetch + normalize username from URL. - username, errWithCode := apiutil.ParseWebUsername(c.Param(apiutil.WebUsernameKey)) + username, errWithCode := apiutil.ParseUsername(c.Param(apiutil.UsernameKey)) if errWithCode != nil { apiutil.WebErrorHandler(c, errWithCode, m.processor.InstanceGetV1) return diff --git a/internal/web/thread.go b/internal/web/thread.go index ffec565e6..05bd63ebe 100644 --- a/internal/web/thread.go +++ b/internal/web/thread.go @@ -50,7 +50,7 @@ func (m *Module) threadGETHandler(c *gin.Context) { } // Parse account targetUsername and status ID from the URL. - targetUsername, errWithCode := apiutil.ParseWebUsername(c.Param(apiutil.WebUsernameKey)) + targetUsername, errWithCode := apiutil.ParseUsername(c.Param(apiutil.UsernameKey)) if errWithCode != nil { apiutil.WebErrorHandler(c, errWithCode, instanceGet) return diff --git a/mkdocs.yml b/mkdocs.yml index b2eb019ab..737e23a75 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -115,6 +115,7 @@ nav: - "Admin": - "admin/settings.md" + - "admin/signups.md" - "admin/federation_modes.md" - "admin/domain_blocks.md" - "admin/cli.md" diff --git a/web/source/css/base.css b/web/source/css/base.css index ae9724661..522820f15 100644 --- a/web/source/css/base.css +++ b/web/source/css/base.css @@ -130,10 +130,11 @@ main { } } - &:disabled { + &:disabled, + &.disabled { color: $white2; background: $gray2; - cursor: auto; + cursor: not-allowed; &:hover { background: $gray3; diff --git a/web/source/settings/admin/accounts/detail.jsx b/web/source/settings/admin/accounts/detail.jsx deleted file mode 100644 index 63049c149..000000000 --- a/web/source/settings/admin/accounts/detail.jsx +++ /dev/null @@ -1,112 +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 . -*/ - -const React = require("react"); -const { useRoute, Redirect } = require("wouter"); - -const query = require("../../lib/query"); - -const FormWithData = require("../../lib/form/form-with-data").default; - -const { useBaseUrl } = require("../../lib/navigation/util"); -const FakeProfile = require("../../components/fake-profile"); -const MutationButton = require("../../components/form/mutation-button"); - -const useFormSubmit = require("../../lib/form/submit").default; -const { useValue, useTextInput } = require("../../lib/form"); -const { TextInput } = require("../../components/form/inputs"); - -module.exports = function AccountDetail({ }) { - const baseUrl = useBaseUrl(); - - let [_match, params] = useRoute(`${baseUrl}/:accountId`); - - if (params?.accountId == undefined) { - return ; - } else { - return ( -

-

- Account Details -

- -
- ); - } -}; - -function AccountDetailForm({ data: account }) { - let content; - if (account.suspended) { - content = ( -

Account is suspended.

- ); - } else { - content = ; - } - - return ( - <> - - - {content} - - ); -} - -function ModifyAccount({ account }) { - const form = { - id: useValue("id", account.id), - reason: useTextInput("text") - }; - - const [modifyAccount, result] = useFormSubmit(form, query.useActionAccountMutation()); - - return ( -
-

Actions

- - -
- {/* - */} - -
- - ); -} \ No newline at end of file diff --git a/web/source/settings/admin/accounts/detail/actions.tsx b/web/source/settings/admin/accounts/detail/actions.tsx new file mode 100644 index 000000000..75ab8db6e --- /dev/null +++ b/web/source/settings/admin/accounts/detail/actions.tsx @@ -0,0 +1,89 @@ +/* + 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 . +*/ + +import React from "react"; + +import { useActionAccountMutation } from "../../../lib/query"; + +import MutationButton from "../../../components/form/mutation-button"; + +import useFormSubmit from "../../../lib/form/submit"; +import { + useValue, + useTextInput, + useBoolInput, +} from "../../../lib/form"; + +import { Checkbox, TextInput } from "../../../components/form/inputs"; +import { AdminAccount } from "../../../lib/types/account"; + +export interface AccountActionsProps { + account: AdminAccount, +} + +export function AccountActions({ account }: AccountActionsProps) { + const form = { + id: useValue("id", account.id), + reason: useTextInput("text") + }; + + const reallySuspend = useBoolInput("reallySuspend"); + const [accountAction, result] = useFormSubmit(form, useActionAccountMutation()); + + return ( +
+

Account Moderation Actions

+
+ Currently only the "suspend" action is implemented.
+ Suspending an account will delete it from your server, and remove all of its media, posts, relationships, etc.
+ If the suspended account is local, suspending will also send out a "delete" message to other servers, requesting them to remove its data from their instance as well.
+ Account suspension cannot be reversed. +
+ +
+ {/* + */} + + +
+ + ); +} diff --git a/web/source/settings/admin/accounts/detail/handlesignup.tsx b/web/source/settings/admin/accounts/detail/handlesignup.tsx new file mode 100644 index 000000000..a61145a22 --- /dev/null +++ b/web/source/settings/admin/accounts/detail/handlesignup.tsx @@ -0,0 +1,118 @@ +/* + 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 . +*/ + +import React from "react"; +import { useLocation } from "wouter"; + +import { useHandleSignupMutation } from "../../../lib/query"; + +import MutationButton from "../../../components/form/mutation-button"; + +import useFormSubmit from "../../../lib/form/submit"; +import { + useValue, + useTextInput, + useBoolInput, +} from "../../../lib/form"; + +import { Checkbox, Select, TextInput } from "../../../components/form/inputs"; +import { AdminAccount } from "../../../lib/types/account"; + +export interface HandleSignupProps { + account: AdminAccount, + accountsBaseUrl: string, +} + +export function HandleSignup({account, accountsBaseUrl}: HandleSignupProps) { + const form = { + id: useValue("id", account.id), + approveOrReject: useTextInput("approve_or_reject", { defaultValue: "approve" }), + privateComment: useTextInput("private_comment"), + message: useTextInput("message"), + sendEmail: useBoolInput("send_email"), + }; + + const [_location, setLocation] = useLocation(); + + const [handleSignup, result] = useFormSubmit(form, useHandleSignupMutation(), { + changedOnly: false, + // After submitting the form, redirect back to + // /settings/admin/accounts if rejecting, since + // account will no longer be available at + // /settings/admin/accounts/:accountID endpoint. + onFinish: (res) => { + if (form.approveOrReject.value === "approve") { + // An approve request: + // stay on this page and + // serve updated details. + return; + } + + if (res.data) { + // "reject" successful, + // redirect to accounts page. + setLocation(accountsBaseUrl); + } + } + }); + + return ( +
+

Handle Account Sign-Up

+ + { form.approveOrReject.value === "reject" && + // Only show form fields relevant + // to "reject" if rejecting. + // On "approve" these fields will + // be ignored anyway. + <> + + + + } + + + ); +} diff --git a/web/source/settings/admin/accounts/detail/index.tsx b/web/source/settings/admin/accounts/detail/index.tsx new file mode 100644 index 000000000..79eb493de --- /dev/null +++ b/web/source/settings/admin/accounts/detail/index.tsx @@ -0,0 +1,179 @@ +/* + 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 . +*/ + +import React from "react"; +import { useRoute, Redirect } from "wouter"; + +import { useGetAccountQuery } from "../../../lib/query"; + +import FormWithData from "../../../lib/form/form-with-data"; + +import { useBaseUrl } from "../../../lib/navigation/util"; +import FakeProfile from "../../../components/fake-profile"; + +import { AdminAccount } from "../../../lib/types/account"; +import { HandleSignup } from "./handlesignup"; +import { AccountActions } from "./actions"; +import BackButton from "../../../components/back-button"; + +export default function AccountDetail() { + // /settings/admin/accounts + const accountsBaseUrl = useBaseUrl(); + + let [_match, params] = useRoute(`${accountsBaseUrl}/:accountId`); + + if (params?.accountId == undefined) { + return ; + } else { + return ( +
+

+ Account Details +

+ +
+ ); + } +} + +interface AccountDetailFormProps { + accountsBaseUrl: string, + data: AdminAccount, +} + +function AccountDetailForm({ data: adminAcct, accountsBaseUrl }: AccountDetailFormProps) { + let yesOrNo = (b: boolean) => { + return b ? "yes" : "no"; + }; + + let created = new Date(adminAcct.created_at).toDateString(); + let lastPosted = "never"; + if (adminAcct.account.last_status_at) { + lastPosted = new Date(adminAcct.account.last_status_at).toDateString(); + } + const local = !adminAcct.domain; + + return ( + <> + +

General Account Details

+ { adminAcct.suspended && +
+ + Account is suspended. +
+ } +
+ { !local && +
+
Domain
+
{adminAcct.domain}
+
} +
+
Created
+
+
+
+
Last posted
+
{lastPosted}
+
+
+
Suspended
+
{yesOrNo(adminAcct.suspended)}
+
+
+
Silenced
+
{yesOrNo(adminAcct.silenced)}
+
+
+
Statuses
+
{adminAcct.account.statuses_count}
+
+
+
Followers
+
{adminAcct.account.followers_count}
+
+
+
Following
+
{adminAcct.account.following_count}
+
+
+ { local && + // Only show local account details + // if this is a local account! + <> +

Local Account Details

+ { !adminAcct.approved && +
+ + Account is pending. +
+ } + { !adminAcct.confirmed && +
+ + Account email not yet confirmed. +
+ } +
+
+
Email
+
{adminAcct.email} {{adminAcct.confirmed ? "(confirmed)" : "(not confirmed)"} }
+
+
+
Disabled
+
{yesOrNo(adminAcct.disabled)}
+
+
+
Approved
+
{yesOrNo(adminAcct.approved)}
+
+
+
Sign-Up Reason
+
{adminAcct.invite_request ?? none provided}
+
+ { (adminAcct.ip && adminAcct.ip !== "0.0.0.0") && +
+
Sign-Up IP
+
{adminAcct.ip}
+
} + { adminAcct.locale && +
+
Locale
+
{adminAcct.locale}
+
} +
+ } + { local && !adminAcct.approved + ? + + : + + } + + ); +} diff --git a/web/source/settings/admin/accounts/index.jsx b/web/source/settings/admin/accounts/index.jsx deleted file mode 100644 index c642d903e..000000000 --- a/web/source/settings/admin/accounts/index.jsx +++ /dev/null @@ -1,138 +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 . -*/ - -const React = require("react"); -const { Switch, Route, Link } = require("wouter"); - -const query = require("../../lib/query"); -const { useTextInput } = require("../../lib/form"); - -const AccountDetail = require("./detail"); -const { useBaseUrl } = require("../../lib/navigation/util"); -const { Error } = require("../../components/error"); - -module.exports = function Accounts({ baseUrl }) { - return ( -
- - - - - - -
- ); -}; - -function AccountOverview({ }) { - return ( - <> -

Accounts

-
- Pending #581, - there is currently no way to list accounts.
- You can perform actions on reported accounts by clicking their name in the report, or searching for a username below. -
- - - - ); -} - -function AccountSearchForm() { - const [searchAccount, result] = query.useSearchAccountMutation(); - - const [onAccountChange, _resetAccount, { account }] = useTextInput("account"); - - function submitSearch(e) { - e.preventDefault(); - if (account.trim().length != 0) { - searchAccount(account); - } - } - - return ( -
-
-
- -
- -