Roundcube Community Forum

 

Ajax Login und Logout Weiterleitung?

Started by rundkubus, December 08, 2009, 03:22:42 PM

Previous topic - Next topic

rundkubus

@ rosali
Frohes Neues! :)

Danke fuer die Info. Ist es den moeglich die Funktion login_page() nur auszufuehren,
wenn zuvor mit $_POST[ajax] eingeloggt wurde?
Also das wir eine entspr. Session Var benutzen um das zu checken?

rosali

Mit einer Session Variable dürfte es nicht gehen, da die Session ja nicht mehr zur Verfügung steht, wenn ein Timeout erfolgte. Es müsste aber mit einem Cookie gehen.
Regards,
Rosali

rosali


<?php
/**
 * Redirect on logout / optionally lock login page
 *
 * @version 1.0 - 31.12.2009
 * @author 'rosali'
 * @website http://myroundcube.googlecode.com
 * @licence GNU GPL
 *
 **/
 
/** USAGE
 *
 * #1- Copy "logout_redirect/config/config.inc.php.dist" to "config.inc.php"
 * #2- Configure "logout_redirect/config/config.inc.php".
 * #3- Register plugin ("./config/main.inc.php ::: $rcmail_config['plugins']").
 *
 **/
 
class logout_redirect extends rcube_plugin
{
  private 
$msg 'loggedout';

  function 
init()
  {
    if(
file_exists("./plugins/logout_redirect/config/config.inc.php"))
      
$this->load_config('config/config.inc.php');
    else
      
$this->load_config('config/config.inc.php.dist');         
  
    
$this->add_hook('render_page', array($this'login_page'));
    
$this->add_hook('login_after', array($this,'login_after'));
    
$this->add_hook('logout_after', array($this,'logout_after'));
  }
  
  function 
login_after($args)
  {
    if(!empty(
$_POST['ajax']))
      
setcookie ('ajax_login',1,time()+60*60*24*365);
    else
      
setcookie ('ajax_login','',time()-3600);
    return 
$args;
  }
  
  function 
login_page($p)
  {
    
$rcmail rcmail::get_instance();  
    if(
$p['template'] == 'login' && $rcmail->config->get('lock_login_page') == TRUE && $_COOKIE['ajax_login'] == 1){
      
$this->msg 'sessionerror';
      
header("Location: " $rcmail->config->get('logout_redirect_url') . "?msg=" urlencode(rcube_label($this->msg)));
      exit;
    }
    
setcookie ('ajax_login','',time()-3600);
    return 
$p;
  }

  function 
logout_after($args)
  {
    
$rcmail rcmail::get_instance();  
    
header("Location: " $rcmail->config->get('logout_redirect_url') . "?msg=" urlencode(rcube_label($this->msg)));
    return 
$args;
  }
}
?>
Regards,
Rosali

rundkubus

#18
@ Rosali

NACHTRAG:
--------------------------
ich hätte erstmal richtig testen sollen. :) ... es funktioniert fast:
Denn bei einem manuellen Ajax Logout greift "login_page()=>auto" zuerst statt "logout_after()=>user",
was ja in meinem Fall falsch ist, da login_page() _nur_ bei einem Timeout greifen soll.
--------------------------

VIELEN HERZLICHEN DANK fuer Deinen Code, es funktioniert! :)

Ich habe das wie folgt fuer mich geaendert...
- $msg entfernt und user/auto direkt in header() gesetzt
- login_page() if abfrage um !$_POST['ajax'] erweitert
- logout_after() if abfrage mit $_COOKIE['ajax_login']==1 hinzugefuegt
- login_page() "lock_login_page==true" auf if abfrage auskommentiert


<?php 
/** 
 * Redirect on logout / optionally lock login page 
 * 
 * @version 1.0 - 31.12.2009 
 * @author 'rosali' 
 * @website http://myroundcube.googlecode.com 
 * @licence GNU GPL 
 * 
 **/ 
  
/** USAGE 
 * 
 * #1- Copy "logout_redirect/config/config.inc.php.dist" to "config.inc.php" 
 * #2- Configure "logout_redirect/config/config.inc.php". 
 * #3- Register plugin ("./config/main.inc.php ::: $rcmail_config['plugins']"). 
 * 
 **/ 
  
class logout_redirect extends rcube_plugin 

  function 
init() 
  { 
    if(
file_exists("./plugins/logout_redirect/config/config.inc.php"))
      
$this->load_config('config/config.inc.php');
    else 
      
$this->load_config('config/config.inc.php.dist');
    
    
$this->add_hook('render_page', array($this'login_page')); 
    
$this->add_hook('login_after', array($this,'login_after')); 
    
$this->add_hook('logout_after', array($this,'logout_after'));
  } 
   
  function 
login_after($args
  { 
    if(!empty(
$_POST['ajax'])) 
      
setcookie ('ajax_login',1,time()+60*60*24*365); 
    else 
      
setcookie ('ajax_login','',time()-3600); 
    return 
$args
  } 
   
  function 
login_page($p
  { 
    
$rcmail rcmail::get_instance();   
    if(
$p['template'] == 'login' && !$_POST['ajax'] && $_COOKIE['ajax_login'] == 1){ // && $rcmail->config->get('lock_login_page') == TRUE
	
	
setcookie ('ajax_login','',time()-3600); 
	
	
header("Location: " $rcmail->config->get('logout_redirect_url') . 'auto'); 
      exit; 
    } 
    return 
$p
  } 

  function 
logout_after($args
  { 
    
$rcmail rcmail::get_instance();
    if (
$_COOKIE['ajax_login'] == 1)
    
	
header("Location: " $rcmail->config->get('logout_redirect_url') . 'user'); 
    return 
$args
  } 

?>

rosali

Was meinst Du mit "manuellem AJAX Logout"?
Regards,
Rosali

rundkubus

Wenn man sich via Ajax Form eingelogt (mit cookie[ajax_login]) und in Roundcube oben rechts auf den Logout-Link klickt, erfolgt der Logout ja "manuell" (statt automatisch aufgrund eines Inaktivitaet Timeouts).

rosali

OK ...

Dann geht das eben alles innerhalb 'login_page' mit einem Check $rcmail->task == "logout" ... Probier ich morgen ... außer Du bist scheller ;)
Regards,
Rosali

rosali

Hoffentlich diesesmal ...


<?php
/**
 * Redirect on logout / optionally lock login page
 *
 * @version 1.0 - 31.12.2009
 * @author Roland 'rosali' Liebl
 * @website http://myroundcube.googlecode.com
 * @licence GNU GPL
 *
 **/
 
/** USAGE
 *
 * #1- Copy "logout_redirect/config/config.inc.php.dist" to "config.inc.php"
 * #2- Configure "logout_redirect/config/config.inc.php".
 * #3- Register plugin ("./config/main.inc.php ::: $rcmail_config['plugins']").
 *
 **/
 
class logout_redirect extends rcube_plugin
{
  private 
$msg 'sessionerror';

  function 
init()
  {
    if(
file_exists("./plugins/logout_redirect/config/config.inc.php"))
      
$this->load_config('config/config.inc.php');
    else
      
$this->load_config('config/config.inc.php.dist');         
  
    
$this->add_hook('render_page', array($this'login_page'));
    
$this->add_hook('login_after', array($this,'login_after'));
    
$this->add_hook('kill_session', array($this,'kill_session'));
  }
  
  function 
login_after($args)
  {
    if(!empty(
$_POST['ajax']))
      
setcookie ('ajax_login',1,time()+60*60*24*365);
    else
      
setcookie ('ajax_login','',time()-3600);
    return 
$args;
  }
  
  function 
kill_session($args)
  {      
    if(
$_COOKIE['ajax_login'] == 1){
      
setcookie ('ajax_login','',time()-3600);    
      
$this->msg 'loggedout';
      
$rcmail rcmail::get_instance();
      
header("Location: " $rcmail->config->get('logout_redirect_url') . "msg=" urlencode(rcube_label($this->msg)));
      exit;    
    }
        
    return 
$args;
  }
  
  function 
login_page($p)
  {   
    if(
$p['template'] == 'login' && $_COOKIE['ajax_login'] == 1){  
      
setcookie ('ajax_login','',time()-3600);
      
$rcmail rcmail::get_instance();           
      
header("Location: " $rcmail->config->get('logout_redirect_url') . "msg=" urlencode(rcube_label($this->msg)));
      exit;
    }

    return 
$p;
  }
}
?>
Regards,
Rosali

rundkubus

#23
@ rosali

WOW, Du bist der Hammer. Nach ersten Tests sieht das super aus. Danke!
Ich kann mich via eigenem-Ajax und normalem-Loginform einloggen und alles leitet nun genauso zurueck wie es gedacht war.
Ich hätte das allein nie hinbekommen. ;)

NACHTRAG: Hier meine Version...
(hoffe Du bist nicht boese wegen meiner Reduktion aufs wesentliche)

<?php 
/** 
 * Redirect on logout (if ajax login)
 * 
 * @version 1.1 - 02.01.2010 
 * @author Roland 'rosali' Liebl 
 * @website http://myroundcube.googlecode.com 
 * @licence GNU GPL 
 * 
 **/ 
  
class logout_redirect extends rcube_plugin 
{
	
function 
init()
	
{
	
	
$this->add_hook('render_page', array($this,'login_page')); 
	
	
$this->add_hook('login_after', array($this,'login_after')); 
	
	
$this->add_hook('kill_session', array($this,'kill_session')); 
	

	

	
function 
goto_url($v)
	

	
	
setcookie ('ajax_login','',time()-3600);
	
	
header('Location: http://domain123.net?log=' $v);
	
	
exit;
	

	

	
// ajax cookie
	
function 
login_after($args
	

	
	
if (!empty(
$_POST['ajax'])) 
	
	
	
setcookie ('ajax_login',1,time()+60*60*24*365); 
	
	
else 
	
	
	
setcookie ('ajax_login','',time()-3600); 
	
	
return 
$args
	

	

	
// user logout
	
function 
kill_session($args
	
{       
	
	
if (
$_COOKIE['ajax_login'] == 1)
	
	
	
$this->goto_url('user');
	
	
return 
$args;
	
}
	

	
// auto logout (session errror)
	
function 
login_page($p
	
{    
	
	
if (
$_COOKIE['ajax_login'] == && $p['template'] == 'login')
	
	
	
$this->goto_url('auto');
	
	
return 
$p;
	
}

?>

rosali

Bis auf die hart kodierte URL werde ich Deine Änderungen übernehmen. Die Benutzer meiner Plugins sind es nicht gewöhnt in der plugin.php zu editieren.
Regards,
Rosali