
    3~[j                        U d Z ddlZddlZddlmZ  ej
                  dd      ZdZdZd	e	d
e	dz  fdZ
d	e	de	d
efdZd
e	dz  fdZd
efdZd
edz  fdZd	e	d
edz  fdZddZddlZdaedz  ed<   daeed<   dZd
efdZy)uo  
Busca automatica de renovacao de licenca. Periodicamente (e a cada carregamento
da tela de ativacao/bloqueio), pergunta ao servidor se ha uma chave nova
publicada pro codigo deste cliente e adota sozinho se encontrar.

IMPORTANT: ajuste LICENSE_SERVER_URL para o endereço real onde
licencas_server/ foi publicado (ex: https://licencas.compucellinformatica.com.br).
    N   )securityLICENSE_SERVER_URLz,https://licencas.compucellinformatica.com.brzfrota-trucks   
machine_idreturnc                     	 t        j                  t         d|  dt        it              }|j
                  dk(  ry|j                          |j                         j                  d      S # t        $ r Y yw xY w)zWRetorna a chave publicada no servidor pro codigo, ou None (sem internet/nao publicada).z/api/chave/produtoparamstimeouti  Nchave)	requestsgetr   PRODUTOREQUEST_TIMEOUT_SECONDSstatus_coderaise_for_statusjson	Exceptionr   resps     HD:\Nextcloud\SISTEMAS WINDOWS\frota-trucks-cliente\app\license_online.pyfetch_published_keyr      su    ||!"+j\:w'+

 s"yy{w'' s   :A, .A, ,	A87A8nome_empresac                     t        |       }|rYt        j                         }|xr t               |k(  }|s2t        j                  | |      \  }}|rt        j
                  |||       t        j                         duS )z
    Busca a chave publicada pro codigo; se for diferente/mais nova que a atual
    e validar certinho pra esse codigo, adota e salva. Retorna True se a
    licenca ativa (apos a chamada) e valida.
    N)r   r   load_active_license_chave_atual_localvalidate_license_keysave_license)r   r   chave_remotaatualja_tem_essaokinfos          r   try_adopt_new_keyr&   $   st     'z2L,,.D 2 4 D44ZNHB%%lL$G'')55    c                      dd l } t        j                  j                         sy 	 | j	                  t        j                  j                  d            j                  d      S # t        $ r Y y w xY w)Nr   utf-8encodinglicense_keyr   r   LICENSE_FILEexistsloads	read_textr   r   )r   s    r   r   r   6   s`      '')zz(//9979KLPPQ^__ s   =A# #	A/.A/c                  j    t               } | st        j                         duS t        | d   | d         S )z
    Usado pelo scheduler em background e pelo botao 'verificar agora': tenta
    renovar usando o codigo/empresa ja conhecidos localmente (de uma ativacao
    anterior, mesmo que a chave atual ja tenha vencido).
    Nr   company)known_activation_datar   r   r&   )dadoss    r   refresh_from_serverr6   @   s:     "#E++-T99U<0%	2BCCr'   c                     ddl } t        j                  j                         sy	 | j	                  t        j                  j                  d            }|j                  d      r|d   |j                  dd      dS 	 y# t        $ r Y yw xY w)	zKLe codigo/empresa do license.json mesmo que a chave nele ja tenha expirado.r   Nr)   r*   r   r3    )r   r3   r-   )r   datas     r   r4   r4   L   s      '')zz(//9979KL88L!"&|"4)UWAXYY "   s   AA? ?	B
Bc                     	 t        j                  t         d|  dt        it              }|j                          t        |j                         j                  dd            S # t        $ r Y yw xY w)z
    Checa se o servidor considera este cliente ativo.
    Retorna True (ativo), False (bloqueado) ou None (sem conexao/erro).
    z/api/status/r
   r   ativoTN)	r   r   r   r   r   r   boolr   r   r   s     r   check_server_statusr=   Z   sk    
	||!",zl;w'+

 	DIIKOOGT233 s   A#A& &	A21A2c                      t               } | syt        | d         }|y|st        j                  j	                          yt        j                  j                         rt        j                  j                          yy)u   
    Chamado pelo scheduler a cada 5 min. Se o servidor disser bloqueado,
    cria o flag local — gate_middleware bloqueia na proxima request.
    Se disser ativo, remove o flag (desbloqueia). Se sem conexao, nao faz nada.
    Nr   )r4   r=   r   BLOCK_FLAG_FILEtouchr/   unlink)r5   r;   s     r   apply_server_statusrB   k   sg     "#El 34E}  &&(##**,$$++- -r'   _status_cacheg        _status_cache_ati,  c                      t        j                         } t        | t        z
  t        k  rt        du S t               }|syt        |d         }||a| at        du S )zURetorna True se o servidor confirmar bloqueio (cache 5 min). False em caso de duvida.Fr   )_time	monotonicrC   rD   _STATUS_CACHE_TTLr4   r=   )nowr5   	resultados      r   is_server_blockedrK      sh     //
C S+;%;>O%O%%!#E#E,$78I!E!!r'   )r   N)__doc__osr   r8   r   getenvr   r   r   strr   r<   r&   r   r6   dictr4   r=   rB   timerF   rC   __annotations__rD   floatrH   rK    r'   r   <module>rU      s    
  RYY35cd 
 C C$J  6# 6S 6T 6$C$J 	DT 	Dtd{ C D4K ".& !td{ ! %  "4 "r'   