From 196cd88b1c7c44a337ca12f6a804f1bb7fa83c4a Mon Sep 17 00:00:00 2001 From: tobi <31960611+tsmethurst@users.noreply.github.com> Date: Tue, 14 Mar 2023 17:11:04 +0100 Subject: [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 --- internal/processing/admin/admin.go | 5 +++- internal/processing/admin/email.go | 61 ++++++++++++++++++++++++++++++++++++++ internal/processing/processor.go | 2 +- 3 files changed, 66 insertions(+), 2 deletions(-) create mode 100644 internal/processing/admin/email.go (limited to 'internal/processing') 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 . + +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) -- cgit v1.2.3