ó
H()Qc           @  s"  d  d l  m Z d  d l Z d  d l m Z m Z y d  d l m Z Wn e k
 re d  d l Z n Xd  d l	 Z	 d  d l
 m Z d  d l m Z d  d l m Z d  d l m Z d  d	 l m Z d  d
 l m Z d  d l m Z e	 j e	 j Z d e f d „  ƒ  YZ d e f d „  ƒ  YZ d S(   iÿÿÿÿ(   t   unicode_literalsN(   t   datetimet	   timedelta(   t   cPickle(   t   settings(   t   SuspiciousOperation(   t   constant_time_compare(   t   get_random_string(   t   salted_hmac(   t   timezone(   t   force_bytest   CreateErrorc           B  s   e  Z d  Z RS(   u‡   
    Used internally as a consistent exception type to catch from save (see the
    docstring for SessionBase.save() for details).
    (   t   __name__t
   __module__t   __doc__(    (    (    s>   ../Django//lib/python/django/contrib/sessions/backends/base.pyR      s   t   SessionBasec           B  s¦  e  Z d  Z d Z d Z d* d „ Z d „  Z d „  Z d „  Z	 d „  Z
 d* d „ Z d	 „  Z d
 „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z e  e ƒ Z! e" d „ Z# e  e# ƒ Z$ d „  Z% d „  Z& d  „  Z' d! „  Z( d" „  Z) d# „  Z* d$ „  Z+ d% „  Z, e" d& „ Z- d* d' „ Z. d( „  Z/ e0 d) „  ƒ Z1 RS(+   u-   
    Base class for all Session classes.
    u
   testcookieu   workedc         C  s   | |  _  t |  _ t |  _ d  S(   N(   t   _session_keyt   Falset   accessedt   modified(   t   selft   session_key(    (    s>   ../Django//lib/python/django/contrib/sessions/backends/base.pyt   __init__%   s    		c         C  s   | |  j  k S(   N(   t   _session(   R   t   key(    (    s>   ../Django//lib/python/django/contrib/sessions/backends/base.pyt   __contains__*   s    c         C  s   |  j  | S(   N(   R   (   R   R   (    (    s>   ../Django//lib/python/django/contrib/sessions/backends/base.pyt   __getitem__-   s    c         C  s   | |  j  | <t |  _ d  S(   N(   R   t   TrueR   (   R   R   t   value(    (    s>   ../Django//lib/python/django/contrib/sessions/backends/base.pyt   __setitem__0   s    c         C  s   |  j  | =t |  _ d  S(   N(   R   R   R   (   R   R   (    (    s>   ../Django//lib/python/django/contrib/sessions/backends/base.pyt   __delitem__4   s    
c         C  s   |  j  j | | ƒ S(   N(   R   t   get(   R   R   t   default(    (    s>   ../Django//lib/python/django/contrib/sessions/backends/base.pyR   8   s    c         G  s.   |  j  p | |  j k |  _  |  j j | | Œ S(   N(   R   R   t   pop(   R   R   t   args(    (    s>   ../Django//lib/python/django/contrib/sessions/backends/base.pyR!   ;   s    c         C  s8   | |  j  k r |  j  | St |  _ | |  j  | <| Sd  S(   N(   R   R   R   (   R   R   R   (    (    s>   ../Django//lib/python/django/contrib/sessions/backends/base.pyt
   setdefault?   s
    	c         C  s   |  j  |  |  j <d  S(   N(   t   TEST_COOKIE_VALUEt   TEST_COOKIE_NAME(   R   (    (    s>   ../Django//lib/python/django/contrib/sessions/backends/base.pyt   set_test_cookieG   s    c         C  s   |  j  |  j ƒ |  j k S(   N(   R   R%   R$   (   R   (    (    s>   ../Django//lib/python/django/contrib/sessions/backends/base.pyt   test_cookie_workedJ   s    c         C  s   |  |  j  =d  S(   N(   R%   (   R   (    (    s>   ../Django//lib/python/django/contrib/sessions/backends/base.pyt   delete_test_cookieM   s    c         C  s#   d |  j  j } t | | ƒ j ƒ  S(   Nu   django.contrib.sessions(   t	   __class__R   R   t	   hexdigest(   R   R   t   key_salt(    (    s>   ../Django//lib/python/django/contrib/sessions/backends/base.pyt   _hashP   s    c         C  sH   t  j | t  j ƒ } |  j | ƒ } t j | j ƒ  d | ƒ j d ƒ S(   uE   Returns the given session dictionary pickled and encoded as a string.t   :u   ascii(   t   picklet   dumpst   HIGHEST_PROTOCOLR,   t   base64t	   b64encodet   encodet   decode(   R   t   session_dictt   pickledt   hash(    (    s>   ../Django//lib/python/django/contrib/sessions/backends/base.pyR3   T   s    c         C  sŠ   t  j t | ƒ ƒ } y\ | j d d ƒ \ } } |  j | ƒ } t | j ƒ  | ƒ sc t d ƒ ‚ n t j	 | ƒ SWn t
 k
 r… i  SXd  S(   NR-   i   u   Session data corrupted(   R1   t	   b64decodeR
   t   splitR,   R   R4   R   R.   t   loadst	   Exception(   R   t   session_datat   encoded_dataR7   R6   t   expected_hash(    (    s>   ../Django//lib/python/django/contrib/sessions/backends/base.pyR4   Z   s    c         C  s   |  j  j | ƒ t |  _ d  S(   N(   R   t   updateR   R   (   R   t   dict_(    (    s>   ../Django//lib/python/django/contrib/sessions/backends/base.pyR?   i   s    c         C  s   | |  j  k S(   N(   R   (   R   R   (    (    s>   ../Django//lib/python/django/contrib/sessions/backends/base.pyt   has_keym   s    c         C  s   |  j  j ƒ  S(   N(   R   t   keys(   R   (    (    s>   ../Django//lib/python/django/contrib/sessions/backends/base.pyRB   p   s    c         C  s   |  j  j ƒ  S(   N(   R   t   values(   R   (    (    s>   ../Django//lib/python/django/contrib/sessions/backends/base.pyRC   s   s    c         C  s   |  j  j ƒ  S(   N(   R   t   items(   R   (    (    s>   ../Django//lib/python/django/contrib/sessions/backends/base.pyRD   v   s    c         C  s   |  j  j ƒ  S(   N(   R   t   iterkeys(   R   (    (    s>   ../Django//lib/python/django/contrib/sessions/backends/base.pyRE   y   s    c         C  s   |  j  j ƒ  S(   N(   R   t
   itervalues(   R   (    (    s>   ../Django//lib/python/django/contrib/sessions/backends/base.pyRF   |   s    c         C  s   |  j  j ƒ  S(   N(   R   t	   iteritems(   R   (    (    s>   ../Django//lib/python/django/contrib/sessions/backends/base.pyRG      s    c         C  s   i  |  _  t |  _ t |  _ d  S(   N(   t   _session_cacheR   R   R   (   R   (    (    s>   ../Django//lib/python/django/contrib/sessions/backends/base.pyt   clear‚   s    		c         C  s3   x, t  r. t d t ƒ } |  j | ƒ s Pq q W| S(   u*   Returns session key that isn't being used.i    (   R   R   t   VALID_KEY_CHARSt   exists(   R   R   (    (    s>   ../Django//lib/python/django/contrib/sessions/backends/base.pyt   _get_new_session_keyŠ   s
    	c         C  s(   |  j  d  k r! |  j ƒ  |  _  n  |  j  S(   N(   R   t   NoneRL   (   R   (    (    s>   ../Django//lib/python/django/contrib/sessions/backends/base.pyt   _get_or_create_session_key’   s    c         C  s   |  j  S(   N(   R   (   R   (    (    s>   ../Django//lib/python/django/contrib/sessions/backends/base.pyt   _get_session_key—   s    c         C  s_   t  |  _ y |  j SWnA t k
 rW |  j d k s9 | rE i  |  _ qX |  j ƒ  |  _ n X|  j S(   u    
        Lazily loads session from storage (unless "no_load" is True, when only
        an empty dict is stored) and stores it in the current instance.
        N(   R   R   RH   t   AttributeErrorR   RM   t   load(   R   t   no_load(    (    s>   ../Django//lib/python/django/contrib/sessions/backends/base.pyt   _get_sessionœ   s    	c         K  s›   y | d } Wn t  k
 r- t j ƒ  } n Xy | d } Wn  t  k
 r^ |  j d ƒ } n X| sl t j St | t ƒ s | S| | } | j d | j	 S(   uÕ   Get the number of seconds until the session expires.

        Optionally, this function accepts `modification` and `expiry` keyword
        arguments specifying the modification and expiry of the session.
        u   modificationu   expiryu   _session_expiryi€Q (
   t   KeyErrorR	   t   nowR   R   t   SESSION_COOKIE_AGEt
   isinstanceR   t   dayst   seconds(   R   t   kwargst   modificationt   expiryt   delta(    (    s>   ../Django//lib/python/django/contrib/sessions/backends/base.pyt   get_expiry_age­   s    
c         K  s•   y | d } Wn t  k
 r- t j ƒ  } n Xy | d } Wn  t  k
 r^ |  j d ƒ } n Xt | t ƒ rr | S| s„ t j } n  | t d | ƒ S(   uÔ   Get session the expiry date (as a datetime object).

        Optionally, this function accepts `modification` and `expiry` keyword
        arguments specifying the modification and expiry of the session.
        u   modificationu   expiryu   _session_expiryRY   (	   RT   R	   RU   R   RW   R   R   RV   R   (   R   RZ   R[   R\   (    (    s>   ../Django//lib/python/django/contrib/sessions/backends/base.pyt   get_expiry_dateÆ   s    c         C  s_   | d k r/ y |  d =Wn t k
 r* n Xd St | t ƒ rQ t j ƒ  | } n  | |  d <d S(   u+  
        Sets a custom expiration for the session. ``value`` can be an integer,
        a Python ``datetime`` or ``timedelta`` object or ``None``.

        If ``value`` is an integer, the session will expire after that many
        seconds of inactivity. If set to ``0`` then the session will expire on
        browser close.

        If ``value`` is a ``datetime`` or ``timedelta`` object, the session
        will expire at that specific future time.

        If ``value`` is ``None``, the session uses the global session expiry
        policy.
        u   _session_expiryN(   RM   RT   RW   R   R	   RU   (   R   R   (    (    s>   ../Django//lib/python/django/contrib/sessions/backends/base.pyt
   set_expiryÜ   s    c         C  s/   |  j  d ƒ d k r t j S|  j  d ƒ d k S(   u  
        Returns ``True`` if the session is set to expire when the browser
        closes, and ``False`` if there's an expiry date. Use
        ``get_expiry_date()`` or ``get_expiry_age()`` to find the actual expiry
        date/age, if there is one.
        u   _session_expiryi    N(   R   RM   R   t   SESSION_EXPIRE_AT_BROWSER_CLOSE(   R   (    (    s>   ../Django//lib/python/django/contrib/sessions/backends/base.pyt   get_expire_at_browser_closeö   s    c         C  s"   |  j  ƒ  |  j ƒ  |  j ƒ  d S(   ue   
        Removes the current session data from the database and regenerates the
        key.
        N(   RI   t   deletet   create(   R   (    (    s>   ../Django//lib/python/django/contrib/sessions/backends/base.pyt   flush  s    

c         C  s6   |  j  } |  j } |  j ƒ  | |  _  |  j | ƒ d S(   uW   
        Creates a new session key, whilst retaining the current session data.
        N(   RH   R   Rd   Rc   (   R   t   dataR   (    (    s>   ../Django//lib/python/django/contrib/sessions/backends/base.pyt	   cycle_key
  s
    		
	c         C  s
   t  ‚ d S(   uG   
        Returns True if the given session_key already exists.
        N(   t   NotImplementedError(   R   R   (    (    s>   ../Django//lib/python/django/contrib/sessions/backends/base.pyRK     s    c         C  s
   t  ‚ d S(   uÆ   
        Creates a new session instance. Guaranteed to create a new object with
        a unique key and will have saved the result once (with empty data)
        before the method returns.
        N(   Rh   (   R   (    (    s>   ../Django//lib/python/django/contrib/sessions/backends/base.pyRd     s    c         C  s
   t  ‚ d S(   uå   
        Saves the session data. If 'must_create' is True, a new session object
        is created (otherwise a CreateError exception is raised). Otherwise,
        save() can update an existing object with the same key.
        N(   Rh   (   R   t   must_create(    (    s>   ../Django//lib/python/django/contrib/sessions/backends/base.pyt   save$  s    c         C  s
   t  ‚ d S(   u}   
        Deletes the session data under this key. If the key is None, the
        current session key value is used.
        N(   Rh   (   R   R   (    (    s>   ../Django//lib/python/django/contrib/sessions/backends/base.pyRc   ,  s    c         C  s
   t  ‚ d S(   uB   
        Loads the session data and returns a dictionary.
        N(   Rh   (   R   (    (    s>   ../Django//lib/python/django/contrib/sessions/backends/base.pyRQ   3  s    c         C  s
   t  ‚ d S(   u  
        Remove expired sessions from the session store.

        If this operation isn't possible on a given backend, it should raise
        NotImplementedError. If it isn't necessary, because the backend has
        a built-in expiration mechanism, it should be a no-op.
        N(   Rh   (   t   cls(    (    s>   ../Django//lib/python/django/contrib/sessions/backends/base.pyt   clear_expired9  s    	N(2   R   R   R   R%   R$   RM   R   R   R   R   R   R   R!   R#   R&   R'   R(   R,   R3   R4   R?   RA   RB   RC   RD   RE   RF   RG   RI   RL   RN   RO   t   propertyR   R   RS   R   R^   R_   R`   Rb   Re   Rg   RK   Rd   Rj   Rc   RQ   t   classmethodRl   (    (    (    s>   ../Django//lib/python/django/contrib/sessions/backends/base.pyR      sX   																																		(   t
   __future__R    R1   R   R   t   django.utils.six.movesR   R.   t   ImportErrort   stringt   django.confR   t   django.core.exceptionsR   t   django.utils.cryptoR   R   R   t   django.utilsR	   t   django.utils.encodingR
   t   ascii_lowercaset   digitsRJ   R;   R   t   objectR   (    (    (    s>   ../Django//lib/python/django/contrib/sessions/backends/base.pyt   <module>   s"   