summaryrefslogtreecommitdiff
path: root/internal/processing/workers/surfaceemail.go
diff options
context:
space:
mode:
authorLibravatar tobi <31960611+tsmethurst@users.noreply.github.com>2023-08-09 19:14:33 +0200
committerLibravatar GitHub <noreply@github.com>2023-08-09 19:14:33 +0200
commit9770d54237bea828cab7e50aec7dff452c203138 (patch)
tree59c444a02e81925bab47d3656a489a8c7087d530 /internal/processing/workers/surfaceemail.go
parent[bugfix] Fix incorrect per-loop variable capture (#2092) (diff)
downloadgotosocial-9770d54237bea828cab7e50aec7dff452c203138.tar.xz
[feature] List replies policy, refactor async workers (#2087)
* Add/update some DB functions. * move async workers into subprocessor * rename FromFederator -> FromFediAPI * update home timeline check to include check for current status first before moving to parent status * change streamMap to pointer to mollify linter * update followtoas func signature * fix merge * remove errant debug log * don't use separate errs.Combine() check to wrap errs * wrap parts of workers functionality in sub-structs * populate report using new db funcs * embed federator (tiny bit tidier) * flesh out error msg, add continue(!) * fix other error messages to be more specific * better, nicer * give parseURI util function a bit more util * missing headers * use pointers for subprocessors
Diffstat (limited to 'internal/processing/workers/surfaceemail.go')
-rw-r--r--internal/processing/workers/surfaceemail.go160
1 files changed, 160 insertions, 0 deletions
diff --git a/internal/processing/workers/surfaceemail.go b/internal/processing/workers/surfaceemail.go
new file mode 100644
index 000000000..a6c97f48f
--- /dev/null
+++ b/internal/processing/workers/surfaceemail.go
@@ -0,0 +1,160 @@
+// 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 workers
+
+import (
+ "context"
+ "errors"
+ "time"
+
+ "github.com/google/uuid"
+ "github.com/superseriousbusiness/gotosocial/internal/config"
+ "github.com/superseriousbusiness/gotosocial/internal/db"
+ "github.com/superseriousbusiness/gotosocial/internal/email"
+ "github.com/superseriousbusiness/gotosocial/internal/gtserror"
+ "github.com/superseriousbusiness/gotosocial/internal/gtsmodel"
+ "github.com/superseriousbusiness/gotosocial/internal/uris"
+)
+
+func (s *surface) emailReportOpened(ctx context.Context, report *gtsmodel.Report) error {
+ instance, err := s.state.DB.GetInstance(ctx, config.GetHost())
+ if err != nil {
+ return gtserror.Newf("error getting instance: %w", err)
+ }
+
+ toAddresses, err := s.state.DB.GetInstanceModeratorAddresses(ctx)
+ if err != nil {
+ if errors.Is(err, db.ErrNoEntries) {
+ // No registered moderator addresses.
+ return nil
+ }
+ return gtserror.Newf("error getting instance moderator addresses: %w", err)
+ }
+
+ if err := s.state.DB.PopulateReport(ctx, report); err != nil {
+ return gtserror.Newf("error populating report: %w", err)
+ }
+
+ reportData := email.NewReportData{
+ InstanceURL: instance.URI,
+ InstanceName: instance.Title,
+ ReportURL: instance.URI + "/settings/admin/reports/" + report.ID,
+ ReportDomain: report.Account.Domain,
+ ReportTargetDomain: report.TargetAccount.Domain,
+ }
+
+ if err := s.emailSender.SendNewReportEmail(toAddresses, reportData); err != nil {
+ return gtserror.Newf("error emailing instance moderators: %w", err)
+ }
+
+ return nil
+}
+
+func (s *surface) emailReportClosed(ctx context.Context, report *gtsmodel.Report) error {
+ user, err := s.state.DB.GetUserByAccountID(ctx, report.Account.ID)
+ if err != nil {
+ return gtserror.Newf("db error getting user: %w", err)
+ }
+
+ if user.ConfirmedAt.IsZero() ||
+ !*user.Approved ||
+ *user.Disabled ||
+ user.Email == "" {
+ // Only email users who:
+ // - are confirmed
+ // - are approved
+ // - are not disabled
+ // - have an email address
+ return nil
+ }
+
+ instance, err := s.state.DB.GetInstance(ctx, config.GetHost())
+ if err != nil {
+ return gtserror.Newf("db error getting instance: %w", err)
+ }
+
+ if err := s.state.DB.PopulateReport(ctx, report); err != nil {
+ return gtserror.Newf("error populating report: %w", err)
+ }
+
+ reportClosedData := email.ReportClosedData{
+ Username: report.Account.Username,
+ InstanceURL: instance.URI,
+ InstanceName: instance.Title,
+ ReportTargetUsername: report.TargetAccount.Username,
+ ReportTargetDomain: report.TargetAccount.Domain,
+ ActionTakenComment: report.ActionTaken,
+ }
+
+ return s.emailSender.SendReportClosedEmail(user.Email, reportClosedData)
+}
+
+func (s *surface) emailPleaseConfirm(ctx context.Context, user *gtsmodel.User, username string) error {
+ if user.UnconfirmedEmail == "" ||
+ user.UnconfirmedEmail == user.Email {
+ // User has already confirmed this
+ // email address; nothing to do.
+ return nil
+ }
+
+ instance, err := s.state.DB.GetInstance(ctx, config.GetHost())
+ if err != nil {
+ return gtserror.Newf("db error getting instance: %w", err)
+ }
+
+ // We need a token and a link for the
+ // user to click on. We'll use a uuid
+ // as our token since it's secure enough
+ // for this purpose.
+ var (
+ confirmToken = uuid.NewString()
+ confirmLink = uris.GenerateURIForEmailConfirm(confirmToken)
+ )
+
+ // Assemble email contents and send the email.
+ if err := s.emailSender.SendConfirmEmail(
+ user.UnconfirmedEmail,
+ email.ConfirmData{
+ Username: username,
+ InstanceURL: instance.URI,
+ InstanceName: instance.Title,
+ ConfirmLink: confirmLink,
+ },
+ ); err != nil {
+ return err
+ }
+
+ // Email sent, update the user entry
+ // with the new confirmation token.
+ now := time.Now()
+ user.ConfirmationToken = confirmToken
+ user.ConfirmationSentAt = now
+ user.LastEmailedAt = now
+
+ if err := s.state.DB.UpdateUser(
+ ctx,
+ user,
+ "confirmation_token",
+ "confirmation_sent_at",
+ "last_emailed_at",
+ ); err != nil {
+ return gtserror.Newf("error updating user entry after email sent: %w", err)
+ }
+
+ return nil
+}