B
    CVvg<                 @   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-install-o3oxmrkh/Django/django/contrib/sessions/backends/file.pyr      s    
zSessionStore.__init__c             C   sR   y| j S  tk
rL   ttdd p(t }tj|sBt	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|   }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   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 }yt |  dd}| }W d Q R X |ry| |}W nX ttfk
r } z6t|tr|td|j	j
 }|t| |   W d d }~X Y nX | j| |d}|dkri }|   |   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_ager0   deleteOSError_session_key)r   r/   session_fileZ	file_dataeloggerZ
expiry_ager   r   r   loadK   s(    
zSessionStore.loadc             C   sB   x<|   | _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_keyr@   saver   modified)r   r   r   r   r=   e   s    
zSessionStore.createFc          	   C   s<  | j d kr|  S | j|d}|  }y@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   |rtY nX tj|\}}yntj||d d\}}	d}
z<zt|| |  W d t
| X t|	| d}
W d |
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_CREATr3   closeFileNotFoundErrorr   FileExistsErrorr   r   splitr   mkstempwriteencodeshutilmoveunlinkr6   r?   )r   rE   r/   Zsession_file_nameflagsfdrI   rJ   Zoutput_file_fdZoutput_file_nameZrenamedr   r   r   rF   o   s<    

zSessionStore.savec             C   s   t j| |S )N)r   r   existsr"   )r   r   r   r   r   rZ      s    zSessionStore.existsc             C   sJ   |d kr| j d krd S | j }yt| | W n tk
rD   Y nX d S )N)r   r   rW   r"   r?   )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\   |   }tj}xHt|D ]:}||s*q|t|d  }| |}dd |_|  qW d S )Nc               S   s   d S )Nr   r   r   r   r   <lambda>       z,SessionStore.clear_expired.<locals>.<lambda>)	r   r   r   r   listdir
startswithlenr=   rD   )r   r   r   rA   r   sessionr   r   r   clear_expired   s    

zSessionStore.clear_expired)N)N)F)N)r:   
__module____qualname____doc__r   classmethodr   r"   r+   r0   rD   r=   rF   rZ   r>   r[   rb   __classcell__r   r   )r   r   r      s   



=

r   )r&   r8   r   rU   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   