تسبب رسالة بريد واردة في انهيار التطبيق عند وجود ترويسة Authentication-Results تحتوي على "no result" (authserv-id; none) وفقاً للمواصفة RFC 8601

عند ضبط email_in_authserv_id وحمل البريد الوارد رأس Authentication-Results مطابقًا بلا نتيجة (Authentication-Results: ``mx.example.com``; none، وهو شكل “لا نتيجة” وفقًا للقسم 2.2 من RFC 8601)، يفشل إنشاء المنشور مع ظهور الخطأ التالي:

NoMethodError: undefined method 'each' for nil
lib/email/authentication_results.rb:45:in 'block in Email::AuthenticationResults#calc_dmarc'

يُفقد المنشور، ولا يتلقى المرسل أي بريد رفض.

السبب: في parse_header، يتطابق فرع no_result من authres_payload، لذا تكون resinfo_val فارغة (nil) ولا يتم تعيين parsed_resinfo أبدًا. النتيجة هي { authserv_id: "``mx.example.com``", resinfo: nil }، ثم يستدعي calc_dmarc الأمر result[:resinfo].each.

متى يحدث ذلك: تضيف بعض خوادم البريد (MTAs) شكل “لا نتيجة” عندما لا تجري أي فحوصات. يقوم rspamd بذلك على سبيل المثال للبريد غير المصادق عليه من عناوين local_addrs الخاصة به، مثل البريد المُعاد توجيهه من داخل الشبكة. لا يظهر الانهيار إلا عند إنشاء منشور (Email::Receiver#create_post → auth_res_action). البريد المرفوض مبكرًا، مثل ذلك القادم من شخص غريب، لا يصل إلى هذه النقطة أبدًا.

التكرار (عبر rails console):

SiteSetting.email_in_authserv_id = "mx.example.com"
Email::AuthenticationResults.new(["mx.example.com; none"]).verdict
# => NoMethodError: undefined method 'each' for nil

الإصلاح المقترح: في calc_dmarc، استخدم Array(result[:resinfo]).each do |resinfo|، أو اضبط parsed_resinfo = [] في parse_header. في هذه الحالة، يُحتسب رأس “لا نتيجة” كرمادي، وهو ما يتوافق مع معناه.

رُصد هذا في ESR v2026.7.3، وما زال السطر نفسه موجودًا في فرع main.

إعجابَين (2)

شكرًا لك على الإبلاغ @murphsmurf :+1:

سيتم إصلاحه عبر FIX: Don't crash on a no-result `Authentication-Results` header - Pull Request #44264 - discourse/discourse - GitHub

إعجاب واحد (1)