الخلاصة

  • يفصل RFC 9661 بين رفع محتوى البرنامج النصي والتحقق منه وتخزين كائن SieveScript وتنشيط برنامج واحد للحساب.
  • نجاح SieveScript/set وظهور isActive=true يثبتان انتقال حالة الكائن، لا تحميل جميع عمال التسليم للـblob ولا تطبيق النتيجة المقصودة على رسالة محددة.
  • الإيصال القابل للدفاع يربط بصمة blob والقدرات وحالة الشرط واستجابة التنشيط والقراءة عبر الواجهات وجيل العامل ومسار رسالة الاختبار والنتيجة النهائية.

يمكن أن تكون ثلاث عبارات صحيحة في الوقت نفسه: البرنامج النصي صالح، والكائن الجديد نشط، والرسالة وصلت إلى المجلد الذي حددته القاعدة القديمة. لا يوجد تناقض منطقي ما دامت كل عبارة تصف حدًا مختلفًا من النظام.

يعرّف RFC 9661 نموذجًا لإدارة برامج Sieve عبر JMAP. يحمل SieveScript معرفًا يضعه الخادم واسمًا فريدًا وblobId وحقل isActive، ولا يجوز أن يكون للحساب أكثر من برنامج نشط. هذه دقة مهمة في طبقة التحكم، لكنها لا تختار طريقة نسخ الحالة أو تجميع البرنامج أو تحديث عمال التسليم النهائي.

صلاحية المحتوى ليست إيصال تشغيل

رفع blob يعني أن الخادم استلم وحدات البايت. أما SieveScript/validate فيتحقق من المحتوى من دون تخزينه كبرنامج. يراجع البنية والامتدادات المطلوبة، لكن RFC 5228 يميز بين أخطاء يمكن اكتشافها قبل التشغيل وأخطاء لا تظهر إلا أثناء التنفيذ. لذلك لا تكفي نتيجة التحقق لتوقع نتيجة رسالة حقيقية.

تأتي بعد ذلك كتابة الكائن. يسمح RFC 8620 باستخدام ifInState لرفض الكتابة إذا تغيرت المجموعة بعد أن قرأها العميل. هذا يمنع السباق والكتابة فوق تعديل أحدث. إلا أن رمز الحالة قيمة مزامنة مبهمة، وليس شهادة تشفير على البايتات الموجودة في ذاكرة عامل التسليم.

ثم يأتي التنشيط. يربط onSuccessActivateScript التحويل بنجاح عمليات الإنشاء والتعديل والحذف كلها، ويجب أن تبلغ الاستجابة عن البرنامج الذي نُشّط والذي عُطّل. هذه ذرية داخل معاملة JMAP. خارجها قد تتأخر نسخة قراءة، أو تتكدس رسالة إبطال، أو يحتفظ عامل ببرنامج مجمّع قديم.

اتفاق JMAP وManageSieve لا يشمل العامل تلقائيًا

صُمم RFC 9661 كي تعرض JMAP وManageSieve البرامج نفسها بصورة متسقة. لذلك يجب إعادة قراءة الاسم النشط والمحتوى عبر المسارين. الاختلاف يكشف خللًا في التخزين أو العرض.

لكن الاتفاق قد يعني فقط أن الواجهتين تقرآن المصدر نفسه. يمكن لعمال التسليم أن يتحدثوا على مؤقت، أو عبر طابور، أو من نسخة متأخرة، أو يحتفظوا بذاكرة محلية. السجل المفيد لا يقول «Sieve مفعّل» وحسب؛ بل يحفظ الحساب ومعرف البرنامج وبصمة blob وجيل الحالة والعامل ومعرف الرسالة والقرار.

حتى النتيجة تحتاج إلى تفسير. وجود الرسالة في المجلد المتوقع دليل مباشر نسبيًا. غيابها لا يثبت discard، لأن الرفض السابق والتأخير ومكافحة الرسائل المزعجة وخطأ التوجيه وفشل التخزين تعطي المظهر نفسه. يجب إدخال رسالة اختبار ذات معرف فريد من المسار الحقيقي، وحفظ قبولها، وتحديد العامل والجيل، ثم مراقبة قرار الحفظ أو التحويل أو الإسقاط.

استجابة الإجازة تكشف حدود سلطة الكتابة

يعرّف RFC 8621 كائن VacationResponse. إذا مثّله الخادم ببرنامج Sieve، يسمح RFC 9661 بقراءته وتنشيطه عبر JMAP Sieve، لكنه يمنع تعديل محتواه أو حذفه بواسطة SieveScript/set. مالك التعديل هو VacationResponse/set.

يفصل ذلك بين القدرة على الرؤية والتشغيل وبين حق التأليف. ينبغي أن ترافق البصمةَ معلوماتُ المنشأ: محرر Sieve، أو استجابة إجازة، أو استعادة، أو ManageSieve، أو أتمتة. قد يكون الكائن صحيحًا تقنيًا ومع ذلك يصل عبر مسار سلطة خاطئ.

يوسع RFC 9404 إدارة blobs، ويعرض RFC 9425 معلومات الحصص، وينسق سجل JMAP لدى IANA أسماء القدرات والأنواع والأخطاء. لا تراقب أي من هذه الطبقات تنفيذ رسالة بعينها.

بناء الدليل من النتيجة إلى الخلف

يبدأ التحقيق بالفعل المتوقع لرسالة الاختبار. يسجل العامل الذي نفذ التسليم والجيل الذي حمّله، ثم يربط هذا الجيل بمعرف البرنامج النشط وبصمة blob الدقيقة. بعد ذلك تُحفظ استجابة التنشيط والحالتان القديمة والجديدة وشرط ifInState ونتيجة التحقق ولقطة القدرات، ويعاد قراءة المحتوى عبر JMAP وManageSieve.

يجب اختبار الفشل أيضًا: معرف غير موجود لا يغير البرنامج الحالي؛ حذف البرنامج النشط يعيد sieveIsActive؛ برنامج صالح البنية مع فشل تشغيل مضبوط ينتج تصنيفًا واضحًا؛ وبرنامج تملكه استجابة الإجازة يرفض الكتابة من الواجهة الخاطئة. كما ينبغي اختبار ضغط الحصة وإعادة تشغيل العمال.

تقدم المواصفة الأولية الدنيا لدى Heng Lu الحد الصحيح: عقد مشترك صغير يمكن تنفيذه ومراجعته، مع إبقاء البنية المحلية مسؤولة أمام الدليل. تمنع طبقات الواقع كلمة «نشط» من استعارة سلطة «نُفّذ»، وتعيد أولوية الشفرة العاملة الحكم إلى نقطة التسليم التي غيرت مصير الرسالة فعلًا.

ينظم RFC 9661 حالة التحكم. أما إثبات التنفيذ فيبقى واجب المشغّل.

المصادر