
    Zj                        d Z ddlZddlZddlZddlZddlZddlmZmZ ddl	m
Z
 ddlmZmZ ddlmZmZ edz  Zed	z  Zed
z  Zedz  Zedz  Zedz  Zedz  ZdZ eddd      ZdefdZdededefdZdededefdZdedefdZ dedede!fdZ"d Z#defdZ$ded ed!ed"efd#Z%d$ Z&defd%Z'de!fd&Z(d'e!fd(Z)defd)Z*y)*zZLicenciamento offline (machine-bound) e armazenamento criptografado de credenciais locais.    N)date	timedelta)Path)FernetInvalidToken   )INSTANCE_DIRDEFAULT_SYNC_INTERVAL_MINUTESz
secret.keyzlicense.jsonzbloqueado.flagzgeotab_credentials.enczsettings.jsonzclock_floor.jsonzsession_secret.keys8   frota-trucks-license-v1-8f3a1c9d6e2b4f7a0c5d8e1b3f6a9c2di  returnc                  z   t        j                         j                         } d}t        j	                         r9	 t        j                  t        j                  d            j                  d      }|r| |k  ry| |k7  r,t        j                  t        j                  d| i      d       y# t        $ r d}Y Gw xY w)uC  
    Anti-rollback simples: guarda a maior data ja vista rodando o programa.
    Retorna False se a data atual do sistema for ANTERIOR a esse piso — sinal de
    que o relogio foi atrasado de proposito pra burlar validade/tolerancia offline.
    Sempre que a data atual for igual ou posterior ao piso, o piso avanca.
    Nutf-8encoding
floor_dateFT)r   today	isoformatCLOCK_FLOOR_FILEexistsjsonloads	read_textget	Exception
write_textdumps)	today_str	floor_strs     BD:\Nextcloud\SISTEMAS WINDOWS\frota-trucks-cliente\app\security.pycheck_and_update_clock_floorr      s     

&&(II 	

#3#=#=w#=#OPTTUabI Y*I##DJJi/H$IT[#\  	I	s   8B, ,B:9B:
machine_idexpires_codec                     |  d| }t        j                  t        |j                         t        j
                        j                         }t        |d      dz  S )N|   l    J))hmacnewLICENSE_SIGNING_SECRETencodehashlibsha256	hexdigestint)r    r!   payloaddigests       r   _signr/   6   sJ    Al^,GXX,gnn.>OYY[Fvr?h''    expires_epochc           	          |dk(  rdn/t        t        j                  |      t        z
  j                  d      }t        | |      }|d|ddj                  fdt        dt              d      D              S )zx
    Gera uma chave curta so com digitos, formato XXXX-XXXX-XXXX-XXXX.
    expires_epoch=0 significa sem expiracao.
    r   i'  04d012d-c              3   .   K   | ]  }||d z      yw)   N ).0iraws     r   	<genexpr>z#generate_license.<locals>.<genexpr>D   s     @*?QC!a%L*?s   r7   )	minr   fromtimestampLICENSE_EPOCHdaysr/   joinrangelen)r    r1   r!   sigr;   s       @r   generate_licenserE   <   ss    
 &*1T5G5G5VYf5f4l4lnr0sL

L
)C#s4j
)C88@%3s8Q*?@@@r0   license_keyc                    t               sy|j                         j                  dd      j                  dd      }t        |      dk7  s|j	                         syt        |dd       }t        |dd       }t        | |      }||k7  ry	|d
k7  rXt        t        |      z   }t        j                         |kD  ryt        t        j                  |j                                     }nd
}d| |dfS )z@Retorna (ok, info_ou_erro). info contem expires_epoch quando ok.)Fz\A data do sistema parece ter sido atrasada. Ajuste a data/hora do Windows e tente novamente.r5     r$   )Fu0   Chave de licença inválida (formato incorreto).Nr7   )Fu=   Chave de licença inválida (não confere com esta máquina).r   )r@   )Fu   Chave de licença expirada.T)r    r1   )r   stripreplacerC   isdigitr,   r/   r?   r   r   r   timemktime	timetuple)r    rF   r;   r!   	sig_givenexpected_sigexpires_dater1   s           r   validate_license_keyrS   G   s    ')t




%
%c2
.
6
6sB
?C
3x2~S[[]Hs2Aw<LCGI\2LL Uq$yl'CC::<,&7DKK(>(>(@AB
]KKKr0   companyinfoc                 h    t         j                  t        j                  | |d|dd      d       y )N)rF   rT   F   ensure_asciiindentr   r   )LICENSE_FILEr   r   r   )rF   rT   rU   s      r   save_licenser\   b   s4    

;7KdKZ_hij  r0   c                  `   t         j                         ryt        j                         sy	 t        j                  t        j                  d            } | j                  dd      }t        || j                  dd            \  }}|syi |d| j                  dd      iS # t        $ r Y yw xY w)zULe a licenca salva e revalida. Retorna info dict (com company) se valida, senao None.Nr   r   r    rH   rF   rT   )	BLOCK_FLAG_FILEr   r[   r   r   r   r   r   rS   )datar    okrU   s       r   load_active_licensera   i   s     zz,00'0BC ,+J#J0KLHB7d7Itxx	2677  s   )B! !	B-,B-c                      t         j                         rt         j                         } t        |       S t        j                         } t         j                  |        t        |       S N)SECRET_KEY_FILEr   
read_bytesr   generate_keywrite_bytes)keys    r   _get_or_create_fernetri   z   sP    ((* #; !!###C(#;r0   usernamepassworddatabaseserverc                     t               }t        j                  | |||d      j                         }t        j                  |j                  |             y )N)rj   rk   rl   rm   )ri   r   r   r(   CREDENTIALS_FILErg   encrypt)rj   rk   rl   rm   fernetr-   s         r   save_geotab_credentialsrr      sL    "$Fjj(  vx    !89r0   c                      t         j                         sy t               } 	 | j                  t         j	                               }t        j                  |      S # t        $ r Y y w xY wrc   )ro   r   ri   decryptre   r   r   r   )rq   r-   s     r   load_geotab_credentialsru      sW    ""$"$F..!1!<!<!>?zz'"" s   7A 	A%$A%c                  *    t         j                         S rc   )ro   r   r8   r0   r   has_geotab_credentialsrw      s    ""$$r0   c                      dt         i} t        j                         s| S 	 | j                  t	        j
                  t        j                  d                   | S # t        $ r Y | S w xY w)Nsync_interval_minutesr   r   )r
   SETTINGS_FILEr   updater   r   r   r   )defaultss    r   load_settingsr}      sf    ')FGH!

=#:#:G#:#LMN O  Os   8A 	A'&A'settingsc                 ^    t         j                  t        j                  | dd      d       y )NFrW   rX   r   r   )rz   r   r   r   )r~   s    r   save_settingsr      s#    TZZuQOZabr0   c                      t         j                         rt         j                  d      S t        j                  d      } t         j                  | d       | S )Nr   r       )SESSION_SECRET_FILEr   r   secrets	token_hexr   )secrets    r   get_session_secretr      sJ    !!#",,g,>>r"F""6G"<Mr0   )+__doc__r)   r%   r   r   rM   datetimer   r   pathlibr   cryptography.fernetr   r   configr	   r
   rd   r[   r^   ro   rz   r   r   r'   r?   boolr   strr,   r/   rE   rS   dictr\   ra   ri   rr   ru   rw   r}   r   r   r8   r0   r   <module>r      sg   `      $  4 ?-n,!11":: ."44 "%99 
 U  T1a d .(c ( ( (A AS AS ALS Ls L6c C t 8"v :c :S :C :QT :% %t cD cC r0   