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