
    CfD5                        d Z ddlZddlmZ ddlmZ 	 ddlZn# e$ r ddlZY nw xY wddlm	Z	m
Z
 ddlmZ  G d dee
          Z G d	 d
e          Z G d de          Z G d de          Z G d de          Z G d de	          Z G d de	          Z G d de	          Z G d de	          Z G d de	          ZdS )z
    flaskext.session.sessions
    ~~~~~~~~~~~~~~~~~~~~~~~~~

    Server-side Sessions and SessionInterfaces.

    :copyright: (c) 2014 by Shipeng Feng.
    :license: BSD, see LICENSE for more details.
    N)datetime)uuid4)SessionInterfaceSessionMixin)CallbackDictc                       e Zd ZdZddZdS )ServerSideSessionz)Baseclass for server-side based sessions.Nc                 b    d }t          j        | ||           || _        d| _        d| _        d S )Nc                     d| _         d S )NT)modifiedselfs    K/var/www/piapp/venv/lib/python3.11/site-packages/flask_sessions/sessions.py	on_updatez-ServerSideSession.__init__.<locals>.on_update   s     DMMM    TF)r   __init__sid	permanentr   )r   initialr   r   s       r   r   zServerSideSession.__init__   s?    	! 	! 	!dGY777r   )NN)__name__
__module____qualname____doc__r    r   r   r	   r	      s.        33     r   r	   c                       e Zd ZdS )RedisSessionNr   r   r   r   r   r   r   r   #           Dr   r   c                       e Zd ZdS )MemcachedSessionNr   r   r   r   r    r    '   r   r   r    c                       e Zd ZdS )FileSystemSessionNr   r   r   r   r"   r"   +   r   r   r"   c                       e Zd ZdS )MongoDBSessionNr   r   r   r   r$   r$   /   r   r   r$   c                       e Zd ZdZd ZdS )NullSessionInterfacezAUsed to open a :class:`flask.sessions.NullSession` instance.
    c                     d S Nr   )r   apprequests      r   open_sessionz!NullSessionInterface.open_session7   s    tr   N)r   r   r   r   r+   r   r   r   r&   r&   3   s-             r   r&   c                   2    e Zd ZdZeZeZd Zd Z	d Z
d ZdS )RedisSessionInterfacezUses the Redis key-value store as a session backend.

    :param redis: A ``redis.Redis`` instance.
    :param key_prefix: A prefix that is added to all Redis store keys.
    c                 x    ddl m} | |            | _         n|                    |          | _         || _        d S )Nr   )Redis)redisr/   from_url
key_prefix)r   urlr2   r/   s       r   r   zRedisSessionInterface.__init__E   sF    ;DJJ,,DJ$r   c                 8    t          t                                S r(   strr   r   s    r   _generate_sidz#RedisSessionInterface._generate_sidM       577||r   c                    |j                             |j                  }|s*|                                 }|                     |          S | j                            | j        |z             }|O	 | j                            |          }|                     ||          S #  |                     |          cY S xY w|                     |          S Nr   )	cookiesgetsession_cookie_namer7   session_classr0   r2   
serializerloads)r   r)   r*   r   valdatas         r   r+   z"RedisSessionInterface.open_sessionP   s    o!!#"9:: 	/$$&&C%%#%...jnnT_s233?3,,S11))$C)8883))c)22222!!c!***s   10B" "B<c           	         |                      |          }|                     |          }|sM|j        rD| j                            | j        |j        z              |                    |j        ||           d S | 	                    |          }| 
                    |          }|                     ||          }| j                            t          |                    }	| j                            | j        |j        z   |	t!          |j                                                             |j        r(|                    |j        |j        |||||           d S d S NdomainpathexpireshttponlyrG   rH   secure)get_cookie_domainget_cookie_pathr   r0   deleter2   r   delete_cookier>   get_cookie_httponlyget_cookie_secureget_expiration_timer@   dumpsdictsetexintpermanent_session_lifetimetotal_seconds
set_cookie)
r   r)   sessionresponserG   rH   rK   rL   rJ   rB   s
             r   save_sessionz"RedisSessionInterface.save_session^   s   '',,##C(( 	 A
!!$/GK"?@@@&&s'>.44 ' A A AF ++C00'',,**388o##DMM22
7;6S;IIKKLL	N 	N 	N 	E 7$+h#)V   E E E E E	E 	Er   N)r   r   r   r   pickler@   r   r?   r   r7   r+   r]   r   r   r   r-   r-   ;   sk          J M% % %  + + +E E E E Er   r-   c                   >    e Zd ZdZeZeZd Zd Z	d Z
d Zd Zd ZdS )	MemcachedSessionInterfacezA Session interface that uses memcached as backend.

    :param client: A ``memcache.Client`` instance.
    :param key_prefix: A prefix that is added to all Memcached store keys.
    c                 p    |%|                                  }|t          d          || _        || _        d S )Nzno memcache module found)_get_preferred_memcache_clientRuntimeErrorclientr2   )r   rd   r2   s      r   r   z"MemcachedSessionInterface.__init__   s>    >88::F~"#=>>>$r   c                 8    t          t                                S r(   r5   r   s    r   r7   z'MemcachedSessionInterface._generate_sid   r8   r   c                     dg}	 dd l }|                    |          S # t          $ r Y nw xY w	 dd l}|                    |          S # t          $ r Y d S w xY w)Nz127.0.0.1:11211r   )pylibmcClientImportErrormemcache)r   serversrg   rj   s       r   rb   z8MemcachedSessionInterface._get_preferred_memcache_client   s    $%	+NNN >>'***  	 	 	D	
	,OOO ??7+++  	 	 	DD	s    
++A 
AAc                 X    |dk    r#|t          t          j                              z  }|S )z
        Memcached deals with long (> 30 days) timeouts in a special
        way. Call this function to obtain a safe value for your timeout.
        i ' )rW   time)r   timeouts     r   _get_memcache_timeoutz/MemcachedSessionInterface._get_memcache_timeout   s.    
 W s49;;'''Gr   c                    |j                             |j                  }|s*|                                 }|                     |          S | j        |z   }t          |t                    r|                    d          }| j	                            |          }|O	 | j
                            |          }|                     ||          S #  |                     |          cY S xY w|                     |          S )Nr;   utf-8)r<   r=   r>   r7   r?   r2   
isinstanceunicodeencoderd   r@   rA   )r   r)   r*   r   full_session_keyrB   rC   s          r   r+   z&MemcachedSessionInterface.open_session   s   o!!#"9:: 	/$$&&C%%#%...?S0&00 	@/66w??koo.//?3,,S11))$C)8883))c)22222!!c!***s   0C C(c           
      "   |                      |          }|                     |          }| j        |j        z   }t	          |t
                    r|                    d          }|s@|j        r7| j        	                    |           |
                    |j        ||           d S |                     |          }|                     |          }|                     ||          }	| j                            t#          |                    }
| j                            ||
|                     t)          |j                                                                       |j        r(|                    |j        |j        |	||||           d S d S )Nrq   rF   rI   )rM   rN   r2   r   rr   rs   rt   r   rd   rO   rP   r>   rQ   rR   rS   r@   rT   rU   setro   rW   rX   rY   rZ   )r   r)   r[   r\   rG   rH   ru   rK   rL   rJ   rB   s              r   r]   z&MemcachedSessionInterface.save_session   s   '',,##C((?W[8&00 	@/66w?? 	 A""#3444&&s'>.44 ' A A AF ++C00'',,**388o##DMM22(#t/I/IC:HHJJKK0M 0M 	N 	N 	N 	E 7$+h#)V   E E E E E	E 	Er   N)r   r   r   r   r^   r@   r    r?   r   r7   rb   ro   r+   r]   r   r   r   r`   r`   ~   s          J$M% % %  , , ,   + + +" E  E  E  E  Er   r`   c                   .    e Zd ZdZeZd Zd Zd Zd Z	dS )FileSystemSessionInterfacea  Uses the :class:`werkzeug.contrib.cache.FileSystemCache` as a session
    backend.

    :param cache_dir: the directory where session files are stored.
    :param threshold: the maximum number of items the session stores before it
                      starts deleting some.
    :param mode: the file mode wanted for the session files, default 0600
    :param key_prefix: A prefix that is added to FileSystemCache store keys.
    c                 F    ddl m}  ||||          | _        || _        d S )Nr   )FileSystemCache)	thresholdmode)werkzeug.contrib.cacher{   cacher2   )r   	cache_dirr|   r}   r2   r{   s         r   r   z#FileSystemSessionInterface.__init__   s7    ::::::$_Y)$OOO
$r   c                 8    t          t                                S r(   r5   r   s    r   r7   z(FileSystemSessionInterface._generate_sid   r8   r   c                 :   |j                             |j                  }|s*|                                 }|                     |          S | j                            | j        |z             }||                     ||          S |                     |          S r:   )r<   r=   r>   r7   r?   r   r2   )r   r)   r*   r   rC   s        r   r+   z'FileSystemSessionInterface.open_session   s    o!!#"9:: 	/$$&&C%%#%...z~~do344%%d%444!!c!***r   c           	         |                      |          }|                     |          }|sM|j        rD| j                            | j        |j        z              |                    |j        ||           d S | 	                    |          }| 
                    |          }|                     ||          }t          |          }	| j                            | j        |j        z   |	t          |j                                                             |j        r(|                    |j        |j        |||||           d S d S rE   )rM   rN   r   r   rO   r2   r   rP   r>   rQ   rR   rS   rU   rw   rW   rX   rY   rZ   )
r   r)   r[   r\   rG   rH   rK   rL   rJ   rC   s
             r   r]   z'FileSystemSessionInterface.save_session  sm   '',,##C(( 	 A
!!$/GK"?@@@&&s'>.44 ' A A AF ++C00'',,**388G}}
t4dS;IIKKLL	N 	N 	N 	E 7$+h#)V   E E E E E	E 	Er   N)
r   r   r   r   r"   r?   r   r7   r+   r]   r   r   r   ry   ry      sf          &M% % %
  + + +E E E E Er   ry   c                   2    e Zd ZdZeZeZd Zd Z	d Z
d ZdS )MongoDBSessionInterfacea  A Session interface that uses mongodb as backend.

    :param client: A ``pymongo.MongoClient`` instance.
    :param db: The database you want to use.
    :param collection: The collection you want to use.
    :param key_prefix: A prefix that is added to all MongoDB store keys.
    c                 l    |ddl m}  |            }|| _        ||         |         | _        || _        d S )Nr   )MongoClient)pymongor   rd   storer2   )r   rd   db
collectionr2   r   s         r   r   z MongoDBSessionInterface.__init__1  sF    >++++++ []]FBZ
+
$r   c                 8    t          t                                S r(   r5   r   s    r   r7   z%MongoDBSessionInterface._generate_sid9  r8   r   c                 8   |j                             |j                  }|s*|                                 }|                     |          S | j                            d| j        |z   i          }|r,|                    d          t          j	                    k    r|nd }|d	 |d         }| j
                            t          |                    }|                     ||          S #  |                     |          cY S xY w|                     |          S )Nr;   id
expirationrB   )r<   r=   r>   r7   r?   r   find_oner2   r   utcnowr@   rA   r6   )r   r)   r*   r   documentrB   rC   s          r   r+   z$MongoDBSessionInterface.open_session<  s'   o!!#"9:: 	/$$&&C%%#%...:&&do.C'DEE' N\\,//(/2C2CCC 8IM 	3uo,,SXX66))$C)8883))c)22222!!c!***s   #AC) )Dc           	      p   |                      |          }|                     |          }| j        |j        z   }|sB|j        r9| j                            d|i           |                    |j        ||           d S | 	                    |          }| 
                    |          }|                     ||          }	| j                            t          |                    }
| j                            d|i||
|	dd           |j        r(|                    |j        |j        |	||||           d S d S )Nr   rF   )r   rB   r   TrI   )rM   rN   r2   r   r   r   rO   rP   r>   rQ   rR   rS   r@   rT   rU   updaterZ   )r   r)   r[   r\   rG   rH   store_idrK   rL   rJ   rB   s              r   r]   z$MongoDBSessionInterface.save_sessionM  s~   '',,##C((?W[0 	 A
!!4"2333&&s'>.44 ' A A AF ++C00'',,**388o##DMM22
4*!)"%)02 237	9 	9 	9  	E 7$+h#)V   E E E E E	E 	Er   N)r   r   r   r   r^   r@   r$   r?   r   r7   r+   r]   r   r   r   r   r   %  sk          J"M% % %  + + +" E  E  E  E  Er   r   )r   rm   r   uuidr   cPickler^   ri   flask.sessionsr   r   werkzeug.datastructuresr   r	   r   r    r"   r$   r&   r-   r`   ry   r   r   r   r   <module>r      s                   MMMMM : 9 9 9 9 9 9 9 0 0 0 0 0 0	 	 	 	 	l 	 	 		 	 	 	 	$ 	 	 		 	 	 	 	( 	 	 		 	 	 	 	) 	 	 		 	 	 	 	& 	 	 	    +   @E @E @E @E @E, @E @E @EFeE eE eE eE eE 0 eE eE eEP<E <E <E <E <E!1 <E <E <E~HE HE HE HE HE. HE HE HE HE HEs    	%%