U
    8ÄT_<  ã                   @   sˆ   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 d dlmZm	Z	m
Z
mZ d dlmZ d dlmZmZ d dlmZ G dd„ de
ƒZdS )	é    N)Úsettings)ÚVALID_KEY_CHARSÚCreateErrorÚSessionBaseÚUpdateError)ÚInvalidSessionKey)ÚImproperlyConfiguredÚSuspiciousOperation)Útimezonec                       sˆ   e Zd ZdZd‡ fdd„	Zedd„ ƒZddd„Zd	d
„ Zdd„ Z	dd„ Z
dd„ Zddd„Zdd„ Zddd„Zdd„ Zedd„ ƒZ‡  ZS ) ÚSessionStorez/
    Implement a file based session store.
    Nc                    s"   |   ¡ | _tj| _tƒ  |¡ d S ©N)Ú_get_storage_pathÚstorage_pathr   ÚSESSION_COOKIE_NAMEÚfile_prefixÚsuperÚ__init__©ÚselfÚsession_key©Ú	__class__© úI/tmp/pip-unpacked-wheel-dv63caxw/django/contrib/sessions/backends/file.pyr      s    
zSessionStore.__init__c                 C   sX   z| j W S  tk
rR   ttdd ƒp*t ¡ }tj |¡sDt	d| ƒ‚|| _ | Y S X d S )NZSESSION_FILE_PATHz•The session storage path %r doesn't exist. Please set your SESSION_FILE_PATH setting to an existing directory in which Django can store session data.)
Z_storage_pathÚAttributeErrorÚgetattrr   ÚtempfileÚ
gettempdirÚosÚpathÚisdirr   )Úclsr   r   r   r   r      s    þÿzSessionStore._get_storage_pathc                 C   s<   |dkr|   ¡ }t|ƒ t¡s&tdƒ‚tj | j| j	| ¡S )z@
        Get the file associated with this session key.
        Nz!Invalid characters in session key)
Z_get_or_create_session_keyÚsetÚissubsetr   r   r   r   Újoinr   r   r   r   r   r   Ú_key_to_file)   s    ÿzSessionStore._key_to_filec                 C   s<   t  |  ¡ ¡j}tjr0tj |¡}|jt	j
d�S tj |¡S )zY
        Return the modification time of the file storing the session's content.
        )Útzinfo)r   Ústatr%   Úst_mtimer   ZUSE_TZÚdatetimeÚutcfromtimestampÚreplacer
   ÚutcÚfromtimestamp)r   Zmodificationr   r   r   Ú_last_modification9   s
    zSessionStore._last_modificationc                 C   s"   |  d¡p |  ¡ tj|  ¡ d� S )zS
        Return the expiry time of the file storing the session's content.
        Z_session_expiry)Úseconds)Úgetr.   r)   Ú	timedeltaZget_session_cookie_age)r   Úsession_datar   r   r   Ú_expiry_dateC   s    
ÿzSessionStore._expiry_datec              
   C   sê   i }zÂt |  ¡ dd��}| ¡ }W 5 Q R X |rÄz|  |¡}W nX ttfk
r” } z6t|tƒr|t d|j	j
 ¡}| t|ƒ¡ |  ¡  W 5 d }~X Y nX | j|  |¡d�}|dkrÄi }|  ¡  |  ¡  W n ttfk
rä   d | _Y nX |S )NÚascii)Úencodingzdjango.security.%s)Zexpiryr   )Úopenr%   ÚreadÚdecodeÚEOFErrorr	   Ú
isinstanceÚloggingÚ	getLoggerr   Ú__name__ÚwarningÚstrÚcreateZget_expiry_ager3   ÚdeleteÚOSErrorÚ_session_key)r   r2   Úsession_fileZ	file_dataÚeÚloggerZ
expiry_ager   r   r   ÚloadK   s(    
zSessionStore.loadc                 C   s>   |   ¡ | _z| jdd� W n tk
r2   Y q Y nX d| _d S )NT)Úmust_create)Z_get_new_session_keyrC   Úsaver   Úmodified©r   r   r   r   r@   e   s    

zSessionStore.createFc              	   C   s<  | j d kr|  ¡ S | j|d�}|  ¡ }z@tjttddƒB }|rN|tjtjB O }t 	||¡}t 
|¡ W n6 tk
r‚   |s~t‚Y n tk
rœ   |r˜t‚Y nX tj |¡\}}zntj||d d�\}}	d}
z<zt ||  |¡ ¡ ¡ W 5 t 
|¡ X t |	|¡ d}
W 5 |
�st |	¡ X W n ttfk
�r6   Y nX d S )N)Zno_loadÚO_BINARYr   Z_out_)ÚdirÚprefixFT)r   r@   Z_get_sessionr%   r   ÚO_WRONLYr   ÚO_EXCLÚO_CREATr6   ÚcloseÚFileNotFoundErrorr   ÚFileExistsErrorr   r   Úsplitr   ÚmkstempÚunlinkÚwriteÚencodeÚshutilÚmover9   rB   )r   rH   r2   Zsession_file_nameÚflagsÚfdrM   rN   Zoutput_file_fdZoutput_file_nameZrenamedr   r   r   rI   o   s<    

zSessionStore.savec                 C   s   t j |  |¡¡S r   )r   r   Úexistsr%   r   r   r   r   r^   ¬   s    zSessionStore.existsc                 C   sJ   |d kr| j d krd S | j }zt |  |¡¡ W n tk
rD   Y nX d S r   )r   r   rW   r%   rB   r   r   r   r   rA   ¯   s    
zSessionStore.deletec                 C   s   d S r   r   rK   r   r   r   Úclean¹   s    zSessionStore.cleanc                 C   sX   |   ¡ }tj}t |¡D ]:}| |¡s(q|t|ƒd … }| |ƒ}dd„ |_| ¡  qd S )Nc                   S   s   d S r   r   r   r   r   r   Ú<lambda>É   ó    z,SessionStore.clear_expired.<locals>.<lambda>)	r   r   r   r   ÚlistdirÚ
startswithÚlenr@   rG   )r!   r   r   rD   r   Úsessionr   r   r   Úclear_expired¼   s    

zSessionStore.clear_expired)N)N)F)N)r=   Ú
__module__Ú__qualname__Ú__doc__r   Úclassmethodr   r%   r.   r3   rG   r@   rI   r^   rA   r_   rf   Ú__classcell__r   r   r   r   r      s   




=

r   )r)   r;   r   rZ   r   Zdjango.confr   Z%django.contrib.sessions.backends.baser   r   r   r   Z"django.contrib.sessions.exceptionsr   Zdjango.core.exceptionsr   r	   Zdjango.utilsr
   r   r   r   r   r   Ú<module>   s   