الترخيص

القدرات، مستويات الترخيص، وخدمة الترخيص

هذه الصفحة هي مرجع وقت التشغيل لكيفية تشكيل الترخيص لسلوك Doconut: ما يسمح به كل حالة ترخيص، كيف تُمنح القدرات، وكيفية فحص كل ذلك من الشيفرة. (لـ تحميل ترخيص، راجع البدء → إعداد الترخيص.)

حالات الترخيص وما تقوم به

الحالةيفتح المستندات؟علامة مائيةالقدرات
الترخيص الكامل (مدفوع) (ضمن نافذة الاشتراك/التحديث الخاصة به)نعملا شيءالتي تم شراؤها (Has* flags)
ترخيص مؤقت (المطور/NFR — ترخيص التقييم، قبل تاريخ انتهاء صلاحيته)نعملا شيءالكل — منحة شاملة (قمع التقييم)
منتهي (ترخيص مؤقت بعد تاريخ انتهاء صلاحيته، أو اشتراك مدفوع بعد تاريخ تجديده)نعمعلامة مائية للتقييملا شيء ممنوح
لا ملف ترخيص على الإطلاقنعمعلامة مائية للتقييملا شيء ممنوح
تم العثور عليه لكن تم رفضه (توقيع غير صالح، تم العبث به، مدرج في القائمة السوداء، أو بناء أحدث من نافذة إصدار الترخيص)لا — LicenseException عند كل فتح

نتيجتان تستحقان الفهم العميق:

  • غياب الترخيص ليس ترخيصًا مؤقتًا. عند عدم وجود ملف ترخيص، تُظهر الصفحات علامة مائية ولا تُفعَّل أي قدرة (بحث، تعليقات، إضافات). التجربة الكاملة غير المائية تتطلب ترخيصًا مؤقتًا فعليًا (احصل على واحدة).
  • فقط الترخيص المرفوض يمنع الفتح. انتهاء صلاحية التقويم/الاشتراك يؤدي إلى عرض مائي؛ ولكن نشر بناء أحدث من نافذة إصدار الترخيص يُرفض ويُـيفشل بسرعة مع LicenseException، لذا تلتقطه عند النشر — لا عن طريق إرسال مخرجات مائية صامتة. هذا الاستثناء (من OpenDocumentAsync) يحمل السبب من License.RejectionMessage.

القدرات

Doconut يتحكم في الوظائف الاختيارية عبر القدرة. اليوم هذه هي الإضافات القابلة للاختيار Converter و DICOM بالإضافة إلى ميزات Search و Annotation المدمجة، كل منها يُمنح حسب ترخيصك. عارض الأساس ليس قدرة — إنه المتطلب الأساسي، يُظهر كـ IsViewerLicensed:

csharp
bool viewerLicensed = lic.IsViewerLicensed; // non-TRIAL license present AND covering this build's version

البوابة الوحيدة التي يستخدمها كامل خط الأنابيب هي IsCapabilityGranted:

csharp
bool searchGranted = lic.IsCapabilityGranted(LicenseCapability.Search);

منطقه، كما هو في التنفيذ: الترخيص المؤقت النشط (غير منتهي) يمنح كل قدرة — بما في ذلك القدرات التي لا تملك علم شراء مخصص بعد؛ الترخيص المدفوع الحقيقي يمنح بالضبط أعلام Has* الخاصة به ويكون default‑deny لأي شيء غير مُعرَّف. (ملف TRIAL‑type التراثي ليس استحقاقًا — يُعامل كغير مرخص: علامة مائية، لا شيء ممنوح.)

تراخيص مؤقتة

يستخدم البحث والتعليق العاديان قدراتهما الحالية مباشرةً.

يتم تمييز تراخيص (المطور/NFR) المؤقتة بوسم ExpiryNote وتحمل تاريخ انتهاء صلب:

العضوالمعنى
IsTemporaryوجود وسم ExpiryNote (الكشف يتم بوجود الوسم — لا تطابق نص الملاحظة، فهو ديناميكي)
ExpiryNoteنص معلوماتي مدمج في الترخيص
LicenseExpiryتاريخ الانتهاء الصلب (DateTime?)

تختلف دلالات الانتهاء حسب المستوى: الترخيص المؤقت ينتهي في التاريخ فقط LicenseExpiry (يُتجاهل نافذة الاشتراك؛ الترخيص المؤقت الذي يفتقد التاريخ يُعامل كمنتهي، كإجراء أمان). كل ترخيص آخر ينتهي في تاريخ نافذة الاشتراك/التحديث الخاصة به.

مرجع IDoconutLicenseService

حقن IDoconutLicenseService (المساحة Doconut.Core.Interfaces; مسجل ككائن مفرد — يُحلل الترخيص مرة واحدة عند بدء التشغيل):

العضوالمعنى
Licenseلقطة كاملة من DoconutLicenseInfo (أدناه)
IsTrialملف TRIAL‑type تراثي (يُعامل كغير مرخص — ليس استحقاقًا)
IsTemporary / ExpiryNote / LicenseExpiryعلامات الترخيص المؤقت
IsExpiredمنتهي وفقًا لقواعد المستوى أعلاه
IsVersionValidهذا البناء يقع ضمن نافذة دعم الترخيص
IsViewerLicensedتم العثور على ملف غير TRIAL و تغطي النسخة — المتطلب الأساسي
IsCapabilityGranted(cap)بوابة القدرة الوحيدة
HasSearch HasAnnotation HasConverter HasDicomأعلام شراء لكل قدرة — استخدم IsCapabilityGranted للحصول على إجابة تدرك الترخيص المؤقت
IsValidForDomain(host)تغطية المضيف؛ تراخيص V4 تستخدم البدل *.*
LicenseRejectionReasonغير فارغ ⇒ يتم حظر الفتح بهذه الرسالة

DoconutLicenseInfo يُظهر لقطة صديقة للعرض للوحة الإدارة: Owner، Email، LicenseType، Domain، IsLicenseFileFound، IsVersionValid، IsTrial، IsExpired، أعلام Has*، حقول الترخيص المؤقت، وRejectionMessage.

csharp
// Feature-flag your UI from the same source of truth the SDK uses
app.MapGet("/api/features", (IDoconutLicenseService lic) => Results.Ok(new
{
    viewer     = lic.IsViewerLicensed || lic.IsTemporary,
    search     = lic.IsCapabilityGranted(LicenseCapability.Search),
    annotation = lic.IsCapabilityGranted(LicenseCapability.Annotation),
    conversion = lic.HasConverter,
    dicom      = lic.HasDicom,
}));

فحص الصحة

AddDoconut() يسجل فحص صحة "doconut" يُبلغ عن حالة الترخيص/الانتهاء عبر آلية ASP.NET Core القياسية:

csharp
app.MapHealthChecks("/health");

اربطه بمراقبتك وسيصبح الاشتراك القريب من الانتهاء تنبيهًا بدلاً من تذكرة دعم.

ترقيات الإصدار

يغطي الترخيص نافذة الإصدار. تحديث حزمة NuGet إلى بناء أحدث من تلك النافذة يجعل الترخيص غير صالح لهذا البناء: IsVersionValid يتحول إلى false ويُحظر الفتح مع LicenseException (السبب في License.RejectionMessage) — فشل سريع مقصود، بحيث يُكتشف بناء قديم أو غير مرخص عند النشر بدلاً من وضع علامة مائية صامتة على مخرجات الإنتاج. جدد الاشتراك، استبدل ملف .lic، وأعد تشغيل التطبيق حتى يقوم AddDoconut() بتحميل الترخيص الجديد.

هل كانت هذه الصفحة مفيدة؟