diff options
author | 2023-03-14 17:11:04 +0100 | |
---|---|---|
committer | 2023-03-14 16:11:04 +0000 | |
commit | 196cd88b1c7c44a337ca12f6a804f1bb7fa83c4a (patch) | |
tree | 9607d95b3f4f55a1ebfeded2f7aa9a3c8866bd0a /internal/processing | |
parent | [chore] fix + update swagger docs (#1622) (diff) | |
download | gotosocial-196cd88b1c7c44a337ca12f6a804f1bb7fa83c4a.tar.xz |
[feature] Allow admins to send test emails (#1620)
* [feature] Allow admins to send test emails
* implement unwrap on new error type
* add + use gtserror types
* GoToSocial Email Test -> GoToSocial Test Email
* add + use getInstance db call
* removed unused "unknown" error type
Diffstat (limited to 'internal/processing')
-rw-r--r-- | internal/processing/admin/admin.go | 5 | ||||
-rw-r--r-- | internal/processing/admin/email.go | 61 | ||||
-rw-r--r-- | internal/processing/processor.go | 2 |
3 files changed, 66 insertions, 2 deletions
diff --git a/internal/processing/admin/admin.go b/internal/processing/admin/admin.go index 83dbc5f5b..ad0279dbf 100644 --- a/internal/processing/admin/admin.go +++ b/internal/processing/admin/admin.go @@ -18,6 +18,7 @@ package admin import ( + "github.com/superseriousbusiness/gotosocial/internal/email" "github.com/superseriousbusiness/gotosocial/internal/media" "github.com/superseriousbusiness/gotosocial/internal/state" "github.com/superseriousbusiness/gotosocial/internal/transport" @@ -29,14 +30,16 @@ type Processor struct { tc typeutils.TypeConverter mediaManager media.Manager transportController transport.Controller + emailSender email.Sender } // New returns a new admin processor. -func New(state *state.State, tc typeutils.TypeConverter, mediaManager media.Manager, transportController transport.Controller) Processor { +func New(state *state.State, tc typeutils.TypeConverter, mediaManager media.Manager, transportController transport.Controller, emailSender email.Sender) Processor { return Processor{ state: state, tc: tc, mediaManager: mediaManager, transportController: transportController, + emailSender: emailSender, } } diff --git a/internal/processing/admin/email.go b/internal/processing/admin/email.go new file mode 100644 index 000000000..88396db76 --- /dev/null +++ b/internal/processing/admin/email.go @@ -0,0 +1,61 @@ +// 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 <http://www.gnu.org/licenses/>. + +package admin + +import ( + "context" + "fmt" + + "github.com/superseriousbusiness/gotosocial/internal/config" + "github.com/superseriousbusiness/gotosocial/internal/email" + "github.com/superseriousbusiness/gotosocial/internal/gtserror" + "github.com/superseriousbusiness/gotosocial/internal/gtsmodel" +) + +// EmailTest sends a generic test email to the given toAddress (which +// should be a valid email address). To help callers differentiate between +// proper errors and the smtp errors they're likely fishing for, will return +// 422 + help text on an SMTP error, or error 500 otherwise. +func (p *Processor) EmailTest(ctx context.Context, account *gtsmodel.Account, toAddress string) gtserror.WithCode { + // Pull our instance entry from the database, + // so we can greet the email recipient nicely. + instance, err := p.state.DB.GetInstance(ctx, config.GetHost()) + if err != nil { + err = fmt.Errorf("SendConfirmEmail: error getting instance: %s", err) + return gtserror.NewErrorInternalError(err) + } + + testData := email.TestData{ + SendingUsername: account.Username, + InstanceURL: instance.URI, + InstanceName: instance.Title, + } + + if err := p.emailSender.SendTestEmail(toAddress, testData); err != nil { + if errorType := gtserror.Type(err); errorType == gtserror.TypeSMTP { + // An error occurred during the SMTP part. + // We should indicate this to the caller, as + // it will likely help them debug the issue. + return gtserror.NewErrorUnprocessableEntity(err, err.Error()) + } + // An actual error has occurred. + return gtserror.NewErrorInternalError(err) + } + + return nil +} diff --git a/internal/processing/processor.go b/internal/processing/processor.go index 6f5e7a124..98b417ba3 100644 --- a/internal/processing/processor.go +++ b/internal/processing/processor.go @@ -125,7 +125,7 @@ func NewProcessor( // sub processors processor.account = account.New(state, tc, mediaManager, oauthServer, federator, parseMentionFunc) - processor.admin = admin.New(state, tc, mediaManager, federator.TransportController()) + processor.admin = admin.New(state, tc, mediaManager, federator.TransportController(), emailSender) processor.fedi = fedi.New(state, tc, federator) processor.media = media.New(state, tc, mediaManager, federator.TransportController()) processor.report = report.New(state, tc) |