Licenciamento
Recursos, níveis de licença e o serviço de licença
Esta página é a referência em tempo de execução de como uma licença molda o comportamento do Doconut: o que cada estado de licença permite, como os recursos são concedidos e como inspecionar tudo isso a partir do código. (Para carregar uma licença, veja Introdução → Configuração de Licença.)
Estados de licença e o que eles fazem
| Estado | Abre documentos? | Marca d'água | Recursos |
|---|---|---|---|
| Licença completa (paga) (dentro da sua janela de assinatura/atualização) | Sim | Nenhum | As adquiridas (Has* flags) |
| Licença temporária (Desenvolvedor/NFR — a licença de avaliação, antes da data de expiração) | Sim | Nenhum | Todas — concessão total (o funil de avaliação) |
| Expirada (uma licença temporária após sua data de expiração, ou uma assinatura paga após sua data de renovação) | Sim | Marca d'água de avaliação | Nenhum concedido |
| Nenhum arquivo de licença | Sim | Marca d'água de avaliação | Nenhum concedido |
| Encontrada mas rejeitada (assinatura inválida, adulterada, na lista negra, ou uma compilação mais nova que a janela de versão da licença) | Não — LicenseException em cada abertura | — | — |
Dois efeitos importantes a internalizar:
- Uma licença ausente não é uma licença temporária. Sem arquivo de licença, as páginas são renderizadas com marca d'água e nenhum recurso (pesquisa, anotação, plugins) está ativo. A experiência completa, sem marca d'água, requer uma Licença temporária (obtenha um).
- Só uma licença rejeitada bloqueia a abertura. O vencimento do calendário/assinatura regride para renderização com marca d'água; mas implantar uma compilação mais nova que a janela de versão da licença é rejeitado e falha rapidamente com um
LicenseException, de modo que você o captura no deploy — não ao enviar silenciosamente saída com marca d'água. Essa exceção (deOpenDocumentAsync) traz o motivo deLicense.RejectionMessage.
Recursos
Doconut controla a funcionalidade opcional por recurso. Hoje são os plugins opt-in Converter e DICOM, além dos recursos embutidos Pesquisa e Anotação, cada um concedido pela sua licença. O visualizador base não é um recurso — ele é o pré-requisito, exposto como IsViewerLicensed:
bool viewerLicensed = lic.IsViewerLicensed; // licença non-TRIAL presente E cobrindo a versão desta buildO único ponto de controle que todo o pipeline usa é IsCapabilityGranted:
bool searchGranted = lic.IsCapabilityGranted(LicenseCapability.Search);Sua lógica, literalmente da implementação: uma licença temporária ativa (não expirada) concede todos os recursos — incluindo recursos que ainda não têm uma bandeira de compra dedicada; uma licença comprada real concede exatamente suas bandeiras Has* e tem negação padrão para qualquer coisa não mapeada. (Um arquivo legado do tipo TRIAL não é um direito — ele é tratado como não licenciado: com marca d'água, nada concedido.)
Licenças temporárias
Pesquisa e Anotação normais usam seus recursos existentes diretamente.
Licenças temporárias (Desenvolvedor/NFR) são marcadas por uma etiqueta ExpiryNote e possuem uma data de expiração rígida:
| Membro | Significado |
|---|---|
IsTemporary | Uma etiqueta ExpiryNote está presente (a detecção é por presença da etiqueta — nunca corresponde ao texto da nota, é dinâmica) |
ExpiryNote | Texto informativo incorporado na licença |
LicenseExpiry | A data de expiração rígida (DateTime?) |
A semântica de expiração difere por nível: uma licença temporária expira na sua LicenseExpiry apenas data (sua janela de assinatura é ignorada; uma licença temporária sem a data é tratada como expirada, à prova de falhas). Todas as demais licenças expiram na data da sua janela de assinatura/atualização.
Referência IDoconutLicenseService
Injete IDoconutLicenseService (namespace Doconut.Core.Interfaces; registrado como singleton — a licença é analisada uma vez na inicialização):
| Membro | Significado |
|---|---|
License | Instantâneo completo DoconutLicenseInfo (abaixo) |
IsTrial | Um arquivo legado do tipo TRIAL (tratado como não licenciado — não é um direito) |
IsTemporary / ExpiryNote / LicenseExpiry | Marcadores de licença temporária |
IsExpired | Expirada conforme as regras de nível acima |
IsVersionValid | Esta compilação está dentro da janela de suporte da licença |
IsViewerLicensed | Arquivo não-TRIAL encontrado e versão coberta — pré-requisito base |
IsCapabilityGranted(cap) | O único ponto de controle de recurso |
HasSearch HasAnnotation HasConverter HasDicom | Bandeiras de compra liberadas por recurso — use IsCapabilityGranted para a resposta consciente de temporária |
IsValidForDomain(host) | Cobertura de host; licenças V4 usam o curinga *.* |
LicenseRejectionReason | Não vazio ⇒ a abertura é bloqueada com esta mensagem |
DoconutLicenseInfo expõe o instantâneo amigável para exibição em painéis de administração: Owner, Email, LicenseType, Domain, IsLicenseFileFound, IsVersionValid, IsTrial, IsExpired, as bandeiras Has*, os campos de licença temporária, e RejectionMessage.
// Feature-flag sua UI a partir da mesma fonte de verdade que o SDK usa
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,
}));Verificação de saúde
AddDoconut() registra uma verificação de saúde "doconut" que relata o estado da licença/expiração através do mecanismo padrão do ASP.NET Core:
app.MapHealthChecks("/health");Integre-a ao seu monitoramento e uma assinatura que está expirando se torna um alerta em vez de um ticket de suporte.
Atualizações de versão
Uma licença cobre uma janela de versão. Atualizar o pacote NuGet para uma compilação mais nova que essa janela torna a licença inválida para essa compilação: IsVersionValid transforma false e a abertura é bloqueada com um LicenseException (o motivo está em License.RejectionMessage) — falha rápida deliberada, para que uma compilação obsoleta ou não licenciada seja detectada no deploy em vez de marcar silenciosamente a saída de produção. Renove a assinatura, substitua o .lic e reinicie a aplicação para que AddDoconut() carregue a nova licença.
Esta página foi útil?