3
(hb                 @   s   d dl 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 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 d dlmZ G dd	 d	eZdS )
    N)settings)VALID_KEY_CHARSCreateErrorSessionBaseUpdateError)InvalidSessionKey)ImproperlyConfiguredSuspiciousOperation)timezone)
force_textc                   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 ) SessionStorez0
    Implements a file based session store.
    Nc                s*   t | j | _tj| _tt| j| d S )N)	type_get_storage_pathstorage_pathr   SESSION_COOKIE_NAMEfile_prefixsuperr   __init__)selfsession_key)	__class__ I/tmp/pip-install-q3hcpn_q/Django/django/contrib/sessions/backends/file.pyr      s    zSessionStore.__init__c             C   sV   y| j S  tk
rP   ttdd }|s.tj }tjj|sFt	d| || _ |S X d S )NZSESSION_FILE_PATHzThe 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| j  }t|jtts*tdtj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   r   _key_to_file.   s    zSessionStore._key_to_filec             C   sB   t j| j j}tjr2tjj|}|jt	j
d}ntj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_modification>   s    zSessionStore._last_modificationc             C   s(   |j d}|s$| j tjtjd }|S )zS
        Return the expiry time of the file storing the session's content.
        Z_session_expiry)seconds)getr-   r(   	timedeltar   ZSESSION_COOKIE_AGE)r   session_dataexpiryr   r   r   _expiry_dateJ   s    
zSessionStore._expiry_datec             C   s   i }yt | j d}|j }W d Q R X |ry| j|}W nX ttfk
r } z8t|trztjd|j	j
 }|jt| | j  W Y d d }~X nX | j| j|d}|dkri }| j  | j  W n ttfk
r   d | _Y nX |S )Nrbzdjango.security.%s)r2   r   )openr$   readdecodeEOFErrorr	   
isinstancelogging	getLoggerr   __name__warningr   createZget_expiry_ager3   deleteIOError_session_key)r   r1   session_fileZ	file_dataeloggerZ
expiry_ager   r   r   loadS   s(    
zSessionStore.loadc             C   sB   x<| j  | _y| jdd W n tk
r2   wY nX d| _d S d S )NT)must_create)Z_get_new_session_keyrA   saver   modified)r   r   r   r   r>   m   s    
zSessionStore.createFc          %   C   sV  | j d kr| j S | j|d}| j }y@tjttddB }|rN|tjtjB O }tj	||}tj
| W nN tk
r } z2|r|jtjkrt| r|jtjkrt W Y d d }~X nX tjj|\}}yntj||d d\}	}
d}z<ztj|	| j|j  W d tj
|	 X tj|
| d}W d |s0tj|
 X W n tttfk
rP   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_CREATr5   closeOSErrorerrnoEEXISTr   ENOENTr   r   splitr   mkstempwriteencodeshutilmoveunlinkr@   r8   )r   rF   r1   Zsession_file_nameflagsfdrC   rJ   rK   Zoutput_file_fdZoutput_file_nameZrenamedr   r   r   rG   w   s<    
zSessionStore.savec             C   s   t jj| j|S )N)r   r   existsr$   )r   r   r   r   r   r]      s    zSessionStore.existsc             C   sJ   |d kr| j d krd S | j }ytj| j| W n tk
rD   Y nX d S )N)r   r   rZ   r$   rP   )r   r   r   r   r   r?      s    
zSessionStore.deletec             C   s   d S )Nr   )r   r   r   r   clean   s    zSessionStore.cleanc             C   s\   | j  }tj}xHtj|D ]:}|j|s*q|t|d  }| |}dd |_|j  qW d S )Nc               S   s   d S )Nr   r   r   r   r   <lambda>   s    z,SessionStore.clear_expired.<locals>.<lambda>)	r   r   r   r   listdir
startswithlenr>   rE   )r    r   r   rB   r   sessionr   r   r   clear_expired   s    

zSessionStore.clear_expired)N)N)F)N)r<   
__module____qualname____doc__r   classmethodr   r$   r-   r3   rE   r>   rG   r]   r?   r^   rd   __classcell__r   r   )r   r   r      s   
	

?

r   )r(   rQ   r:   r   rX   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
   Zdjango.utils.encodingr   r   r   r   r   r   <module>   s   