mastodon/app/models
ThibG 5524258da9
Fix “Email changed” notification sometimes having wrong e-mail (#13475)
* Fix “Email changed” notification sometimes having wrong e-mail

Fixes #6778

The root of the issue is that `send_devise_notification` was called before
the changes were properly commited to the database, causing the mailer to
pick previous values if running too early.

Devise's documentation provides guidance on how to handle that[1][2], however,
I have found it to not be working, as the following happens, in that order:
- `send_devise_notification` is called for the `email_changed` notification.
  In that case, `changed?` is false and `saved_changes?` is true, so
  if we use the former, we have the same issue.
- the `after_commit` hook is called
- `send_devise_notification` is called for the `confirmation_instructions`
  notification.
  In that case, `changed?` is still false, and `saved_changes?` still true,
  so if we use the latter, that second notification email is simply not
  going to be sent (as we would be queuing the notification *after*
  executing the after_commit hook).

This is because it may be called from either an `after_update` or
`after_commit` hook, the difference not being a call to `save` but the
transaction actually being committed to the database. This may arguably
be a bug in Devise, or Devise's notification.

The proposed workaround is inspired by Devise's documentation but checks
whether a transaction is open to make the call whether to immediately
send the notification or defer it to the `after_commit` hook.

[1]: https://www.rubydoc.info/github/plataformatec/devise/Devise%2FModels%2FAuthenticatable:send_devise_notification
[2]: 406915cb78/lib/devise/models/authenticatable.rb (L133-L194)

* Fix cases when sending notifications without changing the model

* Defer sending if and only if in transaction including current record
2020-04-15 16:13:44 +02:00
..
admin Add ability to filter audit log in admin UI (#13381) 2020-04-03 13:06:34 +02:00
concerns Change local media attachments to perform heavy processing asynchronously (#13210) 2020-03-08 23:56:18 +01:00
form Fix custom emoji category creation silently erroring out on duplicate category (#12647) 2019-12-18 16:56:59 +01:00
web Validate Web::PushSubscription (#11971) 2019-09-27 15:24:13 +02:00
account.rb Add federation support for the "hide network" preference (#11673) 2020-03-09 00:10:29 +01:00
account_alias.rb Fix account aliases page (#13452) 2020-04-13 06:41:43 +02:00
account_conversation.rb Fix crash when conversations have no valid participants (#10078) 2019-02-19 20:00:41 +01:00
account_domain_block.rb Fix crash when saving invalid domain name (#11528) 2019-08-08 23:04:19 +02:00
account_filter.rb Add sorting by username, creation and last activity in moderation view (#13076) 2020-03-08 15:39:13 +01:00
account_identity_proof.rb Fix Keybase verification using wrong domain for remote accounts (#10547) 2019-04-10 20:28:43 +02:00
account_migration.rb Add (back) option to set redirect notice on account without moving followers (#11994) 2019-09-29 05:03:19 +02:00
account_moderation_note.rb
account_pin.rb
account_stat.rb Fix account counters being overwritten by parallel writes (#12045) 2019-10-02 04:59:37 +02:00
account_tag_stat.rb
account_warning.rb
account_warning_preset.rb Add titles to warning presets in admin UI (#13252) 2020-03-12 17:57:59 +01:00
admin.rb
announcement.rb Fix PostgreSQL load when linking in announcements (#13250) 2020-04-05 12:51:22 +02:00
announcement_filter.rb Add announcements (#12662) 2020-01-23 22:00:13 +01:00
announcement_mute.rb Add announcements (#12662) 2020-01-23 22:00:13 +01:00
announcement_reaction.rb Add announcements (#12662) 2020-01-23 22:00:13 +01:00
application_record.rb Fix records not being indexed sometimes (#12024) 2019-10-01 01:19:11 +02:00
backup.rb Add announcements (#12662) 2020-01-23 22:00:13 +01:00
block.rb
bookmark.rb Add announcements (#12662) 2020-01-23 22:00:13 +01:00
context.rb
conversation.rb Revert "Remove conversation URI (#11423)" (#11424) 2019-07-28 17:47:37 +02:00
conversation_mute.rb
custom_emoji.rb Add announcements (#12662) 2020-01-23 22:00:13 +01:00
custom_emoji_category.rb Add batch actions and categories to admin UI for custom emojis (#11793) 2019-09-09 22:44:17 +02:00
custom_emoji_filter.rb Various fixes and improvements (#12878) 2020-01-20 15:55:03 +01:00
custom_filter.rb Add “account timeline” filter category (#12918) 2020-01-23 21:32:00 +01:00
domain_allow.rb Fix crash when saving invalid domain name (#11528) 2019-08-08 23:04:19 +02:00
domain_block.rb Allow blocking TLDs, and fix TLD blocks not being editable (#12805) 2020-01-08 22:42:05 +01:00
email_domain_block.rb Add option to include resolved DNS records when blacklisting e-mail domains in admin UI (#13254) 2020-03-12 22:35:20 +01:00
export.rb Export and import show_reblogs together with following list (#10495) 2019-04-08 07:28:27 +02:00
favourite.rb Fix records not being indexed sometimes (#12024) 2019-10-01 01:19:11 +02:00
featured_tag.rb Fix featured tags not finding the right tag on save (#11504) 2019-08-07 10:00:58 +02:00
feed.rb Fix non-numbers being passed to Redis and causing an error (#11697) 2019-08-30 02:49:54 +02:00
follow.rb Add specific rate limits for posting and following (#13172) 2020-03-08 15:17:39 +01:00
follow_request.rb Add specific rate limits for posting and following (#13172) 2020-03-08 15:17:39 +01:00
home_feed.rb Fix performance of home feed regeneration (#12084) 2019-10-06 22:11:17 +02:00
identity.rb
import.rb Add option to overwrite imported data (#9962) 2019-02-03 03:59:51 +01:00
instance.rb Add whitelist mode (#11291) 2019-07-30 11:10:46 +02:00
instance_filter.rb Various fixes and improvements (#12878) 2020-01-20 15:55:03 +01:00
invite.rb Add invite comments (#10465) 2019-08-19 11:40:42 +02:00
invite_filter.rb Various fixes and improvements (#12878) 2020-01-20 15:55:03 +01:00
list.rb
list_account.rb Add abilityto add oneself to lists (#12271) 2019-11-04 13:02:01 +01:00
list_feed.rb
marker.rb Add timeline read markers API (#11762) 2019-09-06 13:55:51 +02:00
media_attachment.rb Change tootctl media remove-orphans to work for all classes (#13316) 2020-03-26 01:56:41 +01:00
mention.rb
mute.rb
notification.rb Add follow_request notification type (#12198) 2019-12-01 17:25:29 +01:00
poll.rb Only normalize local polls (#12515) 2019-12-01 17:24:33 +01:00
poll_vote.rb Add optimistic lock to avoid race conditions when handling votes (#10196) 2019-03-06 19:53:57 +01:00
preview_card.rb Fix preview card image not being re-fetched even if link is re-posted (#11981) 2019-09-28 01:33:16 +02:00
relationship_filter.rb Fix relationships page not showing results in admin UI (#12934) 2020-01-24 00:20:23 +01:00
relay.rb Fix relays UI being available in whitelist/secure mode (#11963) 2019-09-27 02:13:34 +02:00
remote_follow.rb Add account migration UI (#11846) 2019-09-19 20:58:19 +02:00
report.rb Add rate limit for reporting (#13390) 2020-04-05 14:40:08 +02:00
report_filter.rb Various fixes and improvements (#12878) 2020-01-20 15:55:03 +01:00
report_note.rb
scheduled_status.rb Fix deleting a scheduled status immediately deleting media attachments (#9728) 2019-01-06 16:38:40 +01:00
search.rb
session_activation.rb
setting.rb
site_upload.rb Improvements to image upload validation and creation (#10431) 2019-04-01 07:30:46 +02:00
status.rb Fix PostgreSQL load when linking in announcements (#13250) 2020-04-05 12:51:22 +02:00
status_pin.rb
status_stat.rb
tag.rb Fixes featured hashtag setting page erroring out instead of rejecting invalid tags (#12436) 2019-12-17 13:31:56 +01:00
tag_filter.rb Various fixes and improvements (#12878) 2020-01-20 15:55:03 +01:00
tombstone.rb Record deleted(by mod) status to prevent re-appear (#10732) 2019-05-09 22:03:02 +02:00
trending_tags.rb Fix admin setting to auto-approve hashtags not affecting query (#12130) 2019-10-10 02:22:04 +02:00
user.rb Fix “Email changed” notification sometimes having wrong e-mail (#13475) 2020-04-15 16:13:44 +02:00
user_invite_request.rb Add "why do you want to join" field to invite requests (#10524) 2019-04-09 23:06:30 +09:00
web.rb