Lisensi
Kemampuan, tingkatan lisensi, dan layanan lisensi
Halaman ini adalah referensi waktu berjalan tentang bagaimana lisensi membentuk perilaku Doconut: apa yang diizinkan oleh setiap status lisensi, bagaimana kemampuan diberikan, dan cara memeriksa semuanya dari kode. (Untuk memuat lisensi, lihat Memulai → Penyiapan Lisensi.)
Status lisensi dan apa yang mereka lakukan
| Status | Membuka dokumen? | Watermark | Kemampuan |
|---|---|---|---|
| Lisensi penuh (berbayar) (dalam jendela langganan/pembaruan) | Ya | Tidak ada | Yang dibeli (Has* flags) |
| Lisensi sementara (Developer/NFR — lisensi evaluasi, sebelum tanggal kedaluwarsanya) | Ya | Tidak ada | Semua — pemberian menyeluruh (saluran evaluasi) |
| Kedaluwarsa (lisensi sementara setelah tanggal kedaluwarsa, atau langganan berbayar setelah tanggal perpanjangannya) | Ya | Watermark evaluasi | Tidak ada yang diberikan |
| Tidak ada berkas lisensi sama sekali | Ya | Watermark evaluasi | Tidak ada yang diberikan |
| Ditemukan tetapi ditolak (tanda tangan tidak valid, diubah, masuk daftar hitam, atau build lebih baru daripada jendela versi lisensi) | Tidak — LicenseException pada setiap pembukaan | — | — |
Dua konsekuensi yang patut dipahami:
- Lisensi yang hilang bukan lisensi sementara. Tanpa berkas lisensi, halaman ditampilkan dengan watermark dan tidak ada kemampuan (pencarian, anotasi, plugin) yang aktif. Pengalaman lengkap tanpa watermark memerlukan Lisensi sementara yang sebenarnya (dapatkan satu).
- Hanya lisensi yang ditolak yang memblokir pembukaan. Kedaluwarsa kalender/langganan menurunkan tampilan menjadi ber-watermark; tetapi menyebarkan build lebih baru daripada jendela versi lisensi ditolak dan gagal cepat dengan
LicenseException, sehingga Anda menanganinya saat penyebaran — bukan dengan diam-diam mengirim output ber-watermark. Pengecualian itu (dariOpenDocumentAsync) membawa alasan dariLicense.RejectionMessage.
Kemampuan
Doconut mengatur fungsi opsional dengan kemampuan. Saat ini yang ada adalah plugin Converter dan DICOM yang dapat dipilih serta fitur bawaan Search dan Annotation, masing‑masing diberikan oleh lisensi Anda. Penampil dasar bukanlah sebuah kemampuan — ia adalah prasyarat, ditampilkan sebagai IsViewerLicensed:
bool viewerLicensed = lic.IsViewerLicensed; // non-TRIAL license present AND covering this build's versionGerbang tunggal yang digunakan seluruh pipeline adalah IsCapabilityGranted:
bool searchGranted = lic.IsCapabilityGranted(LicenseCapability.Search);Logikanya, persis dari implementasi: lisensi Sementara yang aktif (tidak kedaluwarsa) memberikan setiap kemampuan — termasuk kemampuan yang belum memiliki bendera pembelian khusus; lisensi berbayar yang sebenarnya memberikan tepat bendera Has*‑nya dan bersifat default‑deny untuk apa pun yang tidak dipetakan. (Berkas tipe TRIAL warisan bukan hak — ia diperlakukan sebagai tidak berlisensi: ber-watermark, tidak ada yang diberikan.)
Lisensi sementara
Pencarian dan Anotasi normal menggunakan kemampuan yang ada secara langsung.
Lisensi sementara (Developer/NFR) ditandai dengan tag ExpiryNote dan memiliki tanggal kedaluwarsa keras:
| Anggota | Makna |
|---|---|
IsTemporary | Tag ExpiryNote ada (deteksi dilakukan berdasarkan keberadaan tag — tidak pernah mencocokkan teks catatan, bersifat dinamis) |
ExpiryNote | Teks informasional yang disematkan dalam lisensi |
LicenseExpiry | Tanggal kedaluwarsa keras (DateTime?) |
Semantik kedaluwarsa berbeda menurut tingkatan: lisensi sementara kedaluwarsa pada tanggal LicenseExpiry saja (jendela langganannya diabaikan; lisensi sementara yang tidak memiliki tanggal diperlakukan sebagai kedaluwarsa, aman). Semua lisensi lain kedaluwarsa pada tanggal jendela langganan/pembaruan.
Referensi IDoconutLicenseService
Suntikkan IDoconutLicenseService (namespace Doconut.Core.Interfaces; terdaftar sebagai singleton — lisensi diurai sekali saat startup):
| Anggota | Makna |
|---|---|
License | Snapshot lengkap DoconutLicenseInfo (di bawah) |
IsTrial | Berkas tipe TRIAL warisan (diperlakukan sebagai tidak berlisensi — bukan hak) |
IsTemporary / ExpiryNote / LicenseExpiry | Penanda lisensi sementara |
IsExpired | Kedaluwarsa sesuai aturan tingkatan di atas |
IsVersionValid | Build ini berada dalam jendela dukungan lisensi |
IsViewerLicensed | Berkas non-TRIAL ditemukan dan versi tercakup — prasyarat dasar |
IsCapabilityGranted(cap) | Gerbang kemampuan tunggal |
HasSearch HasAnnotation HasConverter HasDicom | Bendera pembelian per kemampuan yang dirilis — gunakan IsCapabilityGranted untuk jawaban yang memperhitungkan lisensi sementara |
IsValidForDomain(host) | Cakupan host; lisensi V4 menggunakan wildcard *.* |
LicenseRejectionReason | Tidak kosong ⇒ pembukaan diblokir dengan pesan ini |
DoconutLicenseInfo menampilkan snapshot yang ramah tampilan untuk panel admin: Owner, Email, LicenseType, Domain, IsLicenseFileFound, IsVersionValid, IsTrial, IsExpired, bendera Has*, bidang lisensi sementara, dan 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,
}));Pemeriksaan kesehatan
AddDoconut() mendaftarkan pemeriksaan kesehatan "doconut" yang melaporkan status lisensi/kedaluwarsa melalui mekanisme standar ASP.NET Core:
app.MapHealthChecks("/health");Hubungkan ke sistem pemantauan Anda dan langganan yang kedaluwarsa menjadi peringatan alih-alih tiket dukungan.
Peningkatan versi
Sebuah lisensi mencakup jendela versi. Memperbarui paket NuGet ke build lebih baru daripada jendela tersebut membuat lisensi tidak valid untuk build ini: IsVersionValid menjadi false dan pembukaan diblokir dengan LicenseException (alasan ada di License.RejectionMessage) — sengaja gagal cepat, sehingga build yang usang atau tidak berlisensi terdeteksi saat penyebaran alih-alih secara diam-diam menambahkan watermark pada output produksi. Perpanjang langganan, ganti berkas .lic, dan restart aplikasi sehingga AddDoconut() memuat lisensi baru.
Apakah halaman ini membantu?