الترخيص
القدرات، مستويات الترخيص، وخدمة الترخيص
هذه الصفحة هي مرجع وقت التشغيل لكيفية تشكيل الترخيص لسلوك Doconut: ما يسمح به كل حالة ترخيص، كيف تُمنح القدرات، وكيفية فحص كل ذلك من الشيفرة. (لـ تحميل ترخيص، راجع البدء → إعداد الترخيص.)
حالات الترخيص وما تقوم به
| الحالة | يفتح المستندات؟ | علامة مائية | القدرات |
|---|---|---|---|
| الترخيص الكامل (مدفوع) (ضمن نافذة الاشتراك/التحديث الخاصة به) | نعم | لا شيء | التي تم شراؤها (Has* flags) |
| ترخيص مؤقت (المطور/NFR — ترخيص التقييم، قبل تاريخ انتهاء صلاحيته) | نعم | لا شيء | الكل — منحة شاملة (قمع التقييم) |
| منتهي (ترخيص مؤقت بعد تاريخ انتهاء صلاحيته، أو اشتراك مدفوع بعد تاريخ تجديده) | نعم | علامة مائية للتقييم | لا شيء ممنوح |
| لا ملف ترخيص على الإطلاق | نعم | علامة مائية للتقييم | لا شيء ممنوح |
| تم العثور عليه لكن تم رفضه (توقيع غير صالح، تم العبث به، مدرج في القائمة السوداء، أو بناء أحدث من نافذة إصدار الترخيص) | لا — LicenseException عند كل فتح | — | — |
نتيجتان تستحقان الفهم العميق:
- غياب الترخيص ليس ترخيصًا مؤقتًا. عند عدم وجود ملف ترخيص، تُظهر الصفحات علامة مائية ولا تُفعَّل أي قدرة (بحث، تعليقات، إضافات). التجربة الكاملة غير المائية تتطلب ترخيصًا مؤقتًا فعليًا (احصل على واحدة).
- فقط الترخيص المرفوض يمنع الفتح. انتهاء صلاحية التقويم/الاشتراك يؤدي إلى عرض مائي؛ ولكن نشر بناء أحدث من نافذة إصدار الترخيص يُرفض ويُـيفشل بسرعة مع
LicenseException، لذا تلتقطه عند النشر — لا عن طريق إرسال مخرجات مائية صامتة. هذا الاستثناء (منOpenDocumentAsync) يحمل السبب منLicense.RejectionMessage.
القدرات
Doconut يتحكم في الوظائف الاختيارية عبر القدرة. اليوم هذه هي الإضافات القابلة للاختيار Converter و DICOM بالإضافة إلى ميزات Search و Annotation المدمجة، كل منها يُمنح حسب ترخيصك. عارض الأساس ليس قدرة — إنه المتطلب الأساسي، يُظهر كـ IsViewerLicensed:
bool viewerLicensed = lic.IsViewerLicensed; // non-TRIAL license present AND covering this build's versionالبوابة الوحيدة التي يستخدمها كامل خط الأنابيب هي IsCapabilityGranted:
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.
// 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 القياسية:
app.MapHealthChecks("/health");اربطه بمراقبتك وسيصبح الاشتراك القريب من الانتهاء تنبيهًا بدلاً من تذكرة دعم.
ترقيات الإصدار
يغطي الترخيص نافذة الإصدار. تحديث حزمة NuGet إلى بناء أحدث من تلك النافذة يجعل الترخيص غير صالح لهذا البناء: IsVersionValid يتحول إلى false ويُحظر الفتح مع LicenseException (السبب في License.RejectionMessage) — فشل سريع مقصود، بحيث يُكتشف بناء قديم أو غير مرخص عند النشر بدلاً من وضع علامة مائية صامتة على مخرجات الإنتاج. جدد الاشتراك، استبدل ملف .lic، وأعد تشغيل التطبيق حتى يقوم AddDoconut() بتحميل الترخيص الجديد.
هل كانت هذه الصفحة مفيدة؟