Ліцензування
Можливості, рівні ліцензій та сервіс ліцензування
Ця сторінка є довідником під час виконання щодо того, як ліцензія формує поведінку 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() завантажив нову ліцензію.
Чи була ця сторінка корисною?