Ліцензування

Можливості, рівні ліцензій та сервіс ліцензування

Ця сторінка є довідником під час виконання щодо того, як ліцензія формує поведінку Doconut: що дозволяє кожен стан ліцензії, як надаються можливості та як перевірити все це з коду. (Для завантаження ліцензії дивіться «Початок роботи → Налаштування ліцензії».)

Стан ліцензії та їх функції

СтанВідкриває документи?Водяний знакМожливості
Повна (платна) ліцензія (в межах її вікна підписки/оновлення)ТакНемаєТі, що придбано (Has* flags)
Тимчасова ліцензія (Developer/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‑legacy не є правом — його розглядають як неліцензований: водяний знак, нічого не надано.)

Тимчасові ліцензії

Звичайний пошук і анотація використовують свої існуючі можливості безпосередньо.

Тимчасові (Developer/NFR) ліцензії позначаються тегом ExpiryNote і мають жорстку дату закінчення терміну:

ЧленЗначення
IsTemporaryТег ExpiryNote присутній (виявлення за наявністю тегу — ніколи не порівнювати текст нотатки, це динамічно)
ExpiryNoteІнформаційний текст, вбудований у ліцензію
LicenseExpiryЖорстка дата закінчення (DateTime?)

Семантика закінчення терміну відрізняється за рівнем: тимчасова ліцензія закінчується лише на дату LicenseExpiry (тільки дата) (вікно підписки ігнорується; тимчасова ліцензія без дати розглядається як прострочена, безпечний режим). Всі інші ліцензії закінчуються на дату їхнього вікна підписки/оновлення.

Довідник IDoconutLicenseService

Впровадьте IDoconutLicenseService (простір імен Doconut.Core.Interfaces; зареєстровано як singleton — ліцензія аналізується один раз під час запуску):

ЧленЗначення
LicenseПовний знімок DoconutLicenseInfo (нижче)
IsTrialФайл типу TRIAL‑legacy (розглядається як неліцензований — не право)
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() завантажив нову ліцензію.

Чи була ця сторінка корисною?