承認キュー内の全ユーザーに60日以上にわたり誤ったメール通知を送信するリグレッションが発生

Discourse では、サインアップ時にユーザーアカウントが作成されるが、スタッフの承認が必要になるまでアカウントが有効化されないモードを指定できます。これは、例えばサブスクリプションベースのサイトなどで一般的に用いられています。

この仕組みには、以下の 2 つの重要な側面がありました。

  1. スタッフがアカウントを却下した場合、否定的な通知は一切送信されず、承認された場合にのみ単一の肯定的な通知が送信されていました。
  2. 審査キュー内のアイテム(投稿であれアカウントであれ)は、モデレーターが 60 日以内にアクションを起こさない場合、デフォルトで却下されます。これは「デフォルトで安全」であるという方針に基づき、Discourse の多くの過去のバージョンで採用されてきた仕組みです。

残念ながら、ユーザーに却下の理由を伝える新しいリクエスト機能 を追加した際、上記の #1#2 の組み合わせが、60 日以上審査キューに滞留していた すべての ユーザーに対して個別の否定的な通知を送信してしまうという結果を招くとは思いもよりませんでした!

送信されたメール通知は以下のようでした。

また、顧客のブランド名の下に以下の文言が含まれていました。

スタッフが {brand} であなたのアカウントを却下しました。

これほど多くの「却下された」アカウントに対してこのメッセージが送信されたことで、ホスト提供中の顧客に問題が生じました。この過ちは完全に Discourse の責任であり、すべての非難は私たちに向けられるべきです。深くお詫び申し上げます。

現在、顧客と連携し、できる限りの対応を行って事態を正すよう努めています。

明確にしておきたいのは、これは私たちのバグであり、多くの顧客に対して非常に混乱を招く、不適切な表現のメールを送信してしまったという点です。その結果、顧客のサブスクリプションのキャンセルなどにより、相当な混乱や収益の損失が生じた可能性があります。これについて心よりお詫び申し上げます。私たちにできる最低限のことは、これは Discourse の問題であり、Discourse が誤ってその否定的なメールを送信したことを皆様に伝えることです。このバグとその結果に対して、私たちは完全に責任を負います。もしそのメールを受け取った方がいらっしゃれば、それは私たち Discourse 以外の誰のせいでもありません。

この問題の深刻さを理解しています。私たちは引き続き、メンバーシッププロバイダーおよび影響を受けた顧客と緊密に連携し、自らの行動に対する責任を果たし、再発防止に向けた改善を進めています。

また、私たちが引き起こした問題に対する補償として、この顧客のホスティング料を来月分無料とさせていただきます。このエラーと、それが顧客に与えた影響について心よりお詫び申し上げます。今後、同様の問題が発生しにくいよう、プロセスの見直しを確実に行います。

ジェフ・アトウッド
Discourse CEO

「いいね!」 28

この問題を解決し、再発を防ぐために実施した対応は以下の通りです。

このコミットは 3 つの課題を同時に解決する「3-in-1」の内容です。これらがバグの原因となっており、根本原因の特定を妨げていました。

  1. ユーザーアカウントが削除されても「メールログ」が削除されないようにしました。削除されたユーザーのメールログがあれば、送信されたすべての拒否メールをすぐに確認できたはずです。

  2. コード内でユーザーを削除するすべての箇所で、「コンテキスト」を適切に設定するようにしました。これにより、ユーザーがいつ、なぜ削除されたかを明確に特定できます。以前はコンテキストが設定されていない箇所が複数あり、なぜユーザーが削除されたのか不明で、原因を特定するためにコードを詳しく調査する必要がありました。

  3. 実際のバグを修正し、自動削除されたレビュー対象ユーザーに対して拒否メールを送信しないようにしました。

これらの変更にはすべてテストが追加されており、回帰を防ぐことが確実です。

「いいね!」 18