@ -1,6 +1,8 @@
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					"""  Mailu admin app utilities 
 
					 
					 
					 
					"""  Mailu admin app utilities 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					""" 
 
					 
					 
					 
					""" 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					from  datetime  import  datetime 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					from  mailu  import  limiter 
 
					 
					 
					 
					from  mailu  import  limiter 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					import  flask 
 
					 
					 
					 
					import  flask 
 
				
			 
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
							 
						
					 
					 
					@ -22,6 +24,7 @@ login.login_view = "ui.login"
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					@login.unauthorized_handler 
 
					 
					 
					 
					@login.unauthorized_handler 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					def  handle_needs_login ( ) : 
 
					 
					 
					 
					def  handle_needs_login ( ) : 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					    """  redirect unauthorized requests to login page  """ 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    return  flask . redirect ( 
 
					 
					 
					 
					    return  flask . redirect ( 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					        flask . url_for ( ' ui.login ' ,  next = flask . request . endpoint ) 
 
					 
					 
					 
					        flask . url_for ( ' ui.login ' ,  next = flask . request . endpoint ) 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    ) 
 
					 
					 
					 
					    ) 
 
				
			 
			
		
	
	
		
		
			
				
					
						
						
						
							
								 
							 
						
					 
					 
					@ -34,7 +37,8 @@ babel = flask_babel.Babel()
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					@babel.localeselector 
 
					 
					 
					 
					@babel.localeselector 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					def  get_locale ( ) : 
 
					 
					 
					 
					def  get_locale ( ) : 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    translations  =  list ( map ( str ,  babel . list_translations ( ) ) ) 
 
					 
					 
					 
					    """  selects locale for translation  """ 
 
				
			 
			
				
				
			
		
	
		
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					    translations  =  [ str ( translation )  for  translation  in  babel . list_translations ( ) ] 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    return  flask . request . accept_languages . best_match ( translations ) 
 
					 
					 
					 
					    return  flask . request . accept_languages . best_match ( translations ) 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
	
		
		
			
				
					
						
							
								 
							 
						
						
							
								 
							 
						
						
					 
					 
					@ -101,6 +105,32 @@ class KVSessionExt(flask_kvsession.KVSessionExtension):
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					        else : 
 
					 
					 
					 
					        else : 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					            self . default_kvstore  =  DictStore ( ) 
 
					 
					 
					 
					            self . default_kvstore  =  DictStore ( ) 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					
 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					    def  cleanup_sessions ( self ,  app = None ,  dkey = None ,  dvalue = None ) : 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					        """  Remove sessions from the store.  """ 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					        if  not  app : 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					            app  =  flask . current_app 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					        if  dkey  is  None  and  dvalue  is  None : 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					            now  =  datetime . utcnow ( ) 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					            for  key  in  app . kvsession_store . keys ( ) : 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					                try : 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					                    sid  =  flask_kvsession . SessionID . unserialize ( key ) 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					                except  ValueError : 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					                    pass 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					                else : 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					                    if  sid . has_expired ( 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					                        app . config [ ' PERMANENT_SESSION_LIFETIME ' ] , 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					                        now 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					                    ) : 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					                        app . kvsession_store . delete ( key ) 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					        elif  dkey  is  not  None  and  dvalue  is  not  None : 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					            for  key  in  app . kvsession_store . keys ( ) : 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					                if  app . session_interface . serialization_method . loads ( 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					                    app . kvsession_store . get ( key ) 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					                ) . get ( dkey ,  None )  ==  dvalue : 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					                    app . kvsession_store . delete ( key ) 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					        else : 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					            raise  ValueError ( ' Need dkey and dvalue. ' ) 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					 
					 
					 
					 
					
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					    def  init_app ( self ,  app ,  session_kvstore = None ) : 
 
					 
					 
					 
					    def  init_app ( self ,  app ,  session_kvstore = None ) : 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					        """  Initialize application and KVSession.  """ 
 
					 
					 
					 
					        """  Initialize application and KVSession.  """ 
 
				
			 
			
		
	
		
		
			
				
					
					 
					 
					 
					        super ( ) . init_app ( app ,  session_kvstore ) 
 
					 
					 
					 
					        super ( ) . init_app ( app ,  session_kvstore )