U
    ânldÖ  ã                   @   s`   d dl Z d dlZd dlZd dlZd dlmZ d dlmZ ed Z	G dd„ dƒZ
G dd„ dƒZdS )	é    N)ÚExpiringDict)ÚDEFAULT_ARGUMENTSÚAPI_KEYS_DB_PATHc                   @   s>   e Zd Zeddfdd„Zdd„ Zddd	„Zd
d„ Zdd„ ZdS )ÚDatabaseéè  é   c              
   C   sÂ   t j d¡rdt j d¡sdtdd ƒ zt  dd¡ W n. tk
rb } ztt|ƒƒ W 5 d }~X Y nX t j |¡}|dksŽt j |¡sŽt  	|¡ || _
t||d�| _tj|dd�| _| j d	¡ d S )
Núapi_keys.dbúdb/api_keys.dbzMigrating %s to %s)r   r	   Ú ©Úmax_lenZmax_age_secondsF)Zcheck_same_threadz¢CREATE TABLE IF NOT EXISTS api_keys (
            "api_key"	TEXT NOT NULL,
            "req_limit"	INTEGER NOT NULL,
            PRIMARY KEY("api_key")
        );)ÚosÚpathÚisfileÚprintÚrenameÚ	ExceptionÚstrÚdirnameÚexistsÚmakedirsÚdb_pathr   ÚcacheÚsqlite3ÚconnectÚcÚexecute)Úselfr   Úmax_cache_lenÚmax_cache_ageÚeZdb_dir© r!   ú7/var/www/html/LibreTranslate/libretranslate/api_keys.pyÚ__init__   s    
ÿzDatabase.__init__c                 C   sl   | j  |¡}|d krZ| j d|f¡}| ¡ }|d k	rL|d | j |< |d }nd| j |< d}t|tƒrhd }|S )Nz0SELECT req_limit FROM api_keys WHERE api_key = ?r   F)r   Úgetr   r   ZfetchoneÚ
isinstanceÚbool)r   Úapi_keyÚ	req_limitÚstmtÚrowr!   r!   r"   Úlookup%   s     ÿ


zDatabase.lookupÚautoc                 C   sB   |dkrt t ¡ ƒ}|  |¡ | j d||f¡ | j ¡  ||fS )Nr,   z7INSERT INTO api_keys (api_key, req_limit) VALUES (?, ?))r   ÚuuidÚuuid4Úremover   r   Úcommit)r   r(   r'   r!   r!   r"   Úadd9   s    
þ
zDatabase.addc                 C   s   | j  d|f¡ | j  ¡  |S )Nz&DELETE FROM api_keys WHERE api_key = ?)r   r   r0   )r   r'   r!   r!   r"   r/   E   s    
zDatabase.removec                 C   s   | j  d¡}| ¡ S )Nz'SELECT api_key, req_limit FROM api_keys)r   r   Zfetchall)r   r*   r!   r!   r"   ÚallJ   s    zDatabase.allN)r,   )	Ú__name__Ú
__module__Ú__qualname__ÚDEFAULT_DB_PATHr#   r+   r1   r/   r2   r!   r!   r!   r"   r      s
   
r   c                   @   s   e Zd Zddd„Zdd„ ZdS )	ÚRemoteDatabaser   éX  c                 C   s   || _ t||d�| _d S )Nr   )Úurlr   r   )r   r9   r   r   r!   r!   r"   r#   P   s    zRemoteDatabase.__init__c              
   C   sž   | j  |¡}|d kršz tj| jd|id�}| ¡ }W n8 tk
rl } ztdt|ƒ ƒ W Y ¢d S d }~X Y nX | dd ¡d krŒ| dd ¡}nd }|| j |< |S )Nr'   )ÚdatazCannot authenticate API key: Úerrorr(   )	r   r$   ÚrequestsÚpostr9   Újsonr   r   r   )r   r'   r(   ÚrÚresr    r!   r!   r"   r+   T   s    
zRemoteDatabase.lookupN)r   r8   )r3   r4   r5   r#   r+   r!   r!   r!   r"   r7   O   s   
r7   )r   r   r-   r<   Zexpiringdictr   Úlibretranslate.default_valuesr   ÚDEFARGSr6   r   r7   r!   r!   r!   r"   Ú<module>   s   D