要約

  • RFC 9661では、スクリプト内容のアップロード、検証、SieveScriptの保存、アカウントで一つだけの有効スクリプトへの切替が別々の行為として扱われる。
  • SieveScript/setの成功とisActive=trueはオブジェクト状態の遷移を示すが、全ワーカーへのロードや特定メッセージの処理結果までは示さない。
  • 防御可能な証跡は、blobハッシュ、検証時の能力、条件付き状態、有効化応答、別インターフェースからの再読込、ワーカー世代、テストメールの追跡、最終結果を結ぶ。

変更作業は成功として終了した。新しいblobを送り、検証し、スクリプトを作り、onSuccessActivateScriptで有効化した。応答には新旧双方の状態が正しく記録されている。ところが直後のテストメールは、旧スクリプトが指定したフォルダーに入った。

ここでAPIの応答を誤りと断定するのは早い。制御面の取引は完了していても、実行面の収束が終わっていない可能性があるからだ。

RFC 9661はJMAPでSieveスクリプトを管理するデータモデルを定める。SieveScriptにはサーバー設定のid、アカウント内で一意の名前、内容を指すblobId、そしてサーバー設定のisActiveがある。仕様が標準化するのは、この論理状態とAPI操作である。メール配送システム内部の複製方式やコンパイル済みルールの更新方法ではない。

検証・保存・有効化を混同しない

blobのアップロードは、サーバーがバイト列を受領した証拠にすぎない。SieveScript/validateは保存せずに文法と必要拡張を検査する。RFC 5228が区別するように、実行時エラーは実メールを処理するまで現れないことがある。構文が正しいことは、配送時に成功することと同義ではない。

次にオブジェクトを変更する。RFC 8620のifInStateを使えば、読み取り後に状態が変わった場合に書き込みを中止できる。これは同時更新を守る重要な仕組みだが、状態文字列は不透明な同期値であり、ワーカーのメモリーにあるコードを証明する署名ではない。

有効化では、作成・更新・削除がすべて成功した場合にだけ切替を行える。新たに有効になったスクリプトと無効になったスクリプトも応答に現れる。この原子性はJMAP取引内の中途半端な状態を防ぐ。一方、遅延したレプリカ、滞留した無効化キュー、長寿命のコンパイルキャッシュ、段階展開までは消せない。

管理面が一致しても、配送面は割れ得る

RFC 9661はJMAPとManageSieveから同じスクリプトへ一貫してアクセスできるよう設計されている。有効化後に両方から名前と内容を読み直すのは、最低限の確認になる。

しかし二つの管理インターフェースが同じデータベースを読んでいても、配送ワーカーが旧世代を保持することはある。定期更新、イベント通知、リードレプリカ、プロセス内キャッシュのどれを使うかは実装次第だ。したがって「Sieve有効」という一つの指標では足りない。アカウント、スクリプトid、blobハッシュ、有効世代、ワーカーid、メッセージ追跡子、処理結果を一組として残す必要がある。

メッセージが見つからないことも、ただちにdiscardの証明にはならない。上流拒否、遅延、迷惑メール処理、経路障害、ストレージ障害が同じ見た目を作る。実際の入口から一意なテストメールを送り、受理記録、最終配送ワーカー、ロード世代、フォルダー・転送・破棄の決定を結ぶべきだ。

VacationResponseが示す所有権の境界

RFC 8621のVacationResponseをSieveスクリプトとして実装する場合、RFC 9661は取得と有効化を許す一方、SieveScript/setによる内容更新と削除を禁じる。内容変更の権限はVacationResponse/set側にある。

これは、同じ対象を見られる二つのインターフェースが同じ編集権限を持つとは限らないことを示す。blobには、通常のSieve編集、休暇応答からの生成、バックアップ復元、ManageSieve、運用自動化といった由来も必要だ。正しいオブジェクトを誤った権限経路で更新すれば、技術的成功が統制上の失敗になる。

RFC 9404はblob管理を、RFC 9425はクォータの可視性を拡張する。IANAのJMAPレジストリは能力名とエラーコードを調整する。いずれも重要だが、個別メールの実行結果を観測するものではない。

結果から逆向きに証跡を組む

テストメールに期待する動作を決め、実際に処理したワーカーとロード世代を記録する。その世代を有効スクリプトidとblobハッシュへ解決し、有効化応答、変更前後の状態、ifInState、検証結果、能力スナップショットへ遡る。最後にJMAPとManageSieveから同じ内容を再読込する。

失敗系も保存する。存在しないidの有効化で現在の設定が変わらないこと、有効スクリプトの削除がsieveIsActiveで拒否されること、構文上は正しいが実行時に失敗するテストを分類できること、休暇応答所有のスクリプトが誤った面からの更新を拒むことを確認する。

Heng Luの最小初期仕様は、共有契約を小さく監査可能に保ち、ローカル実装には証拠責任を残す。現実の層は「有効」という表示が「実行済み」の権威を借りることを防ぎ、動いているコードの優先は判断を実際の配送地点へ戻す。

RFC 9661は管理状態を整える。運用者は、その状態が実行へ届いた証拠を別途整えなければならない。

情報源