انتقل إلى المحتوى
العودة إلى وثائق Launch

تنزيل Markdownالوثيقة الأصلية على GitHub

إصلاح إعادة محاولة خروج حساب Launch SDK

التاريخ: 2026-10-24. أُصلحت AUTH-07 وزومنت مداخل دورة حياة الحساب لـ Go وJavaScript وPython وC# وJava وRuby وRust وC وC++. لم يُنشر SDK أو يُصدر، ولم يُلتزم Git أو يُدفع. لم تعدل هذه المهمة رمز أعمال خادم Launch أو Licentivo.

السلوك

يضع الخروج الصريح أولًا علامة «للإلغاء المعلق فقط» على سجل الحساب في التخزين الآمن، ثم يستدعي خروج SDK الرسمي ويرسل إلغاء جلسة الحساب إلى Launch. بغض النظر عن الشبكة أو حالة الإلغاء، تتوقف بيئة التشغيل المحلية ولا يُسمح بمواصلة الميزات المحمية.

عندما لا يؤكد Launch الإلغاء، يحتفظ SDK بالمهمة وبيانات الحساب الأصلية اللازمة لإعادة المحاولة، ولا يعاملها كحساب مسجل الدخول. تستعيد Logout أو Login أو Restore اللاحقة طلب الإلغاء؛ ولا تستخدم Restore المهمة لطلب الهوية أو بدء بيئة الترخيص. لا تُحذف مهمة الحساب إلا بعد استجابة ناجحة أو HTTP 401 يدل على أن الجلسة الأصلية لم تعد قابلة للمصادقة. وهكذا يمكن استعادة الاستجابة المفقودة أيضًا دون حالة «نجاح الخروج الثاني دون إعادة إرسال الإلغاء مطلقًا».

تظل سجلات الدخول العادية متوافقة مع v2. تستخدم سجلات الإلغاء المعلق تنسيق v3 خاصًا؛ وأزالت Java وRust أيضًا شكل حقول الاعتماد المطلوبة للدخول العادي لمنع SDK القديم من اعتبار المهمة دخولًا عاديًا. لا تحفظ المهمة تأكيدات هوية قصيرة الأجل أو مفاتيح ترخيص أو منحًا موقعة.

تستخدم مهمة الحساب Store الآمن المهيأ أصلًا. تتطلب الاستعادة بين العمليات تخزينًا آمنًا دائمًا، مثل Windows DPAPI أو التخزين المشفر المدعوم من SDK؛ ولا يحتفظ MemoryStore الافتراضي بالبيانات إلا في العملية الحالية. تُحفز إعادة المحاولة بعمليات الدخول أو الاستعادة أو الخروج اللاحقة دون مهمة خلفية مستقلة جديدة. يعيد التخزين أو الإلغاء غير المكتمل خطأ أو نتيجة معلقة ولا يبلغ بالنجاح.

تظل تذاكر خروج جهاز Licentivo SDK و.logout.json تحت إدارته؛ ولا يحذف Launch دليل ذاكرته المؤقتة ولا يقرر أذونات الأجهزة أو الميزات أو عدم الاتصال. حُدثت الأمثلة الأصلية ووثائق SDK لكل لغة أيضًا.

التحقق

النطاق النتيجة
حزم مصدر Launch Go 185 سجل اختبار ناجح، بما فيها الحالات الفرعية؛ دون فشل؛ ونجح go vet
Launch HTTP الفعلي وMySQL بعد انقطاع طلب الخروج حُفظت المهمة الآمنة؛ وبعد إعادة إنشاء SDK تعذرت استعادة الدخول؛ وبعد عودة الشبكة أُعيد إرسال الإلغاء ورفضت واجهتا مصادقة token القديم والهوية
JavaScript نجحت 10 اختبارات تشمل فشل الخروج والاستعادة بعد إعادة الإنشاء وتأكيد 401
Python نجحت 8 اختبارات تشمل تنظيف الحساب المحلي بعد الخروج والاستعادة بعد إعادة الإنشاء وWindows DPAPI
C# نجحت فحوص دورة الحياة واستعادة المهمة وحفظ سجل خروج SDK وDPAPI
Java نجحت 7 مجموعات اختبارات دورة الحياة والأمان، بما فيها إعادة محاولة الخروج دون اتصال
Ruby نجح انحدار دورة حياة الحساب واستعادة المهمة والتخزين المشفر
Rust نجحت جميع الاختبارات المحلية، بما فيها استعادة المهمة بعد إعادة الإنشاء وتشغيل SDK الفعلي
C / C++ نجح SDK الموقع الفعلي والاستعادة بعد إعادة الإنشاء مع انقطاع الشبكة وتأكيد 401 وDPAPI ومدخل تشغيل C++
إصلاح ترخيص Licentivo الحالي 45 سجل اختبار ناجح دون فشل أو تخطٍّ؛ تشمل الإشعار السلبي عند انحراف السياسة وتنسيق الأجهزة الأقل مواصفات والحد اليدوي للأجهزة وانحدار الترخيص الحالي
SDK الرسمي المضمن تطابقت تجزئات ملفات البيان الـ 115 كلها، ولم يُعدل تنفيذ الترخيص أو التشفير

في انحدار مصدر Launch، تم تخطي أربعة اختبارات تعتمد على قواعد بيانات مخصصة أخرى هي TestMySQLBaseline وTestProductUploadRoundTrip وTestInitialAdministratorMustChangePasswordBeforeAdministration وTestNewPaymentProvidersAndRegistrationWithoutMail ولم تُحسب ناجحة؛ وتحققت عمليات SDK وHTTP الحساب ومزامنة الشراء والتعيين باستخدام قواعد اختبار معزولة.

الاختبار المشترك للطرفين

باستخدام MySQL 8.0.32 محلي معزول وLaunch الحالي وخدمة Licentivo وعمالها وGo Launch SDK الفعلي وبيئة الترخيص الرسمية وتخزين حساب DPAPI، اكتملت 15 مرحلة أعمال.

أضيف تحقق من حالتي فشل للخروج:

  1. لم يصل الطلب إلى Launch: أعادت واجهة خروج الحساب مؤقتًا 503. أوقف SDK الميزات المحلية وحُرر ربط جهاز Licentivo الفعلي وحُفظت مهمة إلغاء الحساب. بعد إعادة إنشاء SDK استمر فقط في إعادة محاولة الخروج؛ وبعد استعادة الاتصال أُلغيت جلسة Launch الأصلية وأكد Licentivo استلام إشعار الجلسة المقابل.
  2. ألغى الخادم الجلسة لكن الاستجابة فُقدت: عالج Launch الخروج واستبدل وكيل الاختبار الاستجابة بـ 503. حُفظت المهمة عبر إعادة إنشاء SDK؛ وبعد استعادة الاتصال أكد HTTP 401 بطلان الجلسة الأصلية وحُذفت المهمة. لم تُستعد جلسة الدخول ولم يُعَد تفعيل الجهاز خلال العملية.

غطت المراحل الأخرى مزامنة الشراء الفعلية وتشغيل الميزات الموقعة والاستعادة بعد الإغلاق العادي والخروج الطبيعي وفك الربط عن بُعد والجيل القديم واسترداد التجديد وإلغاء الحساب والدخول مجددًا ورفض التشغيل بعد الاسترداد الكامل واستعادة الاسترداد ورد المبلغ وانحدار ترجمة المستندات الكبيرة. قدمت الجهة المسؤولة تحديثات Licentivo الثلاثة؛ واقتصرت هذه المهمة على البناء والتحقق.

استخدمت قنوات الدفع وDeepL خدمات محاكاة معزولة دون خصم أو استرداد أو ترجمة مدفوعة حقيقية. استخدم التحقق المشترك للخدمات الفعلية Go؛ وأكملت اللغات الأخرى انحدار SDK المحلي، دون ادعاء أن كل لغة من اللغات التسع أكملت قبول نشر خدمات فعلية منفصلًا.

لم يُزَر 192.168.2.177 في هذه الجولة. أُوقفت عمليتا MySQL وLicentivo المؤقتتان، مع الاحتفاظ بالخدمات السابقة وأدلة الاختبار. المواد الأصلية في .local/logout-retry-fix-20261024/؛ والملخص وتجزئات المصدر في أدلة التحقق.