Roundcube Community Forum

Language Specific Support => Deutsch => Topic started by: rundkubus on December 08, 2009, 03:22:42 PM

Title: Ajax Login und Logout Weiterleitung?
Post by: rundkubus on December 08, 2009, 03:22:42 PM
Hallo,

ich würde mich über Hilfe bei folgenden Fragen freuen...

1)
Wie kann man sich aus externer Seite via AJAX einloggen?
Ich möchte gerne via jQuery ein Form-Loginaufruf senden
und sowas wie true|false von Roundcube zurück erhalten.
Wenn "true" wird zur Roundcube URL weitergeleitet,
wenn "false" gebe ich in meinem externen Form einen Fehler aus.

2)
Wie kann man beim Logout direkt auf eine andere Seite umleiten,
statt zum Rundcube eigenem Loginfenster?
JavaScript window.location oder HTML hacks finde ich blöd. ;)

Besten Dank vorab,
Gruss Rundkubus
Title: Ajax Login und Logout Weiterleitung?
Post by: rosali on December 09, 2009, 12:06:48 AM
Zu 1)
true|false bekommst Du nicht zurück. Du kannst aber in [roundcube]/index.php posten und sehen was bei erfolgreichem bzw. nicht erfolgreichem Login als HTML-Output zurückgegeben wird. Erforderliche Values sind _user, _pass, _host.

Zu 2)
Das geht ganz leicht mit einem Plugin. Siehe Hook 'logout_after'.
Title: Ajax Login und Logout Weiterleitung?
Post by: rundkubus on December 09, 2009, 04:13:45 AM
@ rosali
super, vielen Dank für Deine Tipps.
Title: Ajax Login und Logout Weiterleitung?
Post by: rosali on December 09, 2009, 05:46:51 AM
Gern geschehen ... nochmal zu 1)

Natürlich kannst Du auch das gewünschte Return beim Login über einen Plugin Hook erzeugen, wenn Du dem AJAX Post z.B. ajax=1 mitgibst und dann im Hook 'login_after' über !empty($_POST['ajax']) verzweigst.

Es wäre auch möglich, den Hook 'login_failed' zu benutzen.
Title: Ajax Login und Logout Weiterleitung?
Post by: rundkubus on December 09, 2009, 06:16:58 AM
@ rosali
ahh herrlich, werde ich so machen.
Besten Dank und schonmal angenehme Feiertage. :)
Title: Ajax Login und Logout Weiterleitung?
Post by: rundkubus on December 30, 2009, 07:25:32 AM
@ rosali

Der Ajax Login klappt :), jedoch bin ich wohl zu bloed um den logout_after hook
zum laufen zu bekommen (das Plugin steht jedenfalls in /config/main.inc.php)...

Quote
class logout_redirect extends rcube_plugin
{
   public $task = 'logout';
   
   function init()
   {
      $this->add_hook('logout_after', array($this,'jumpto'));
   }
   
   function jumpto($args)
   {
      header("Location: http://domain.net");
      return null;
   }
}


...Roundcube loggt sich ganz normal aus, ohne obiges zu beachten.
Was mache ich denn falsch?

Danke vorab,
Gruss Rundkubus
Title: Ajax Login und Logout Weiterleitung?
Post by: rosali on December 30, 2009, 08:48:56 AM

class logout_redirect extends rcube_plugin
{
public $task = 'logout';

function init()
{
$this->add_hook('logout_after', array($this,'jumpto'));
}

function jumpto($args)
{
header("Location: http://google.com");
return $args;
}
}
?>
Title: Ajax Login und Logout Weiterleitung?
Post by: rundkubus on December 30, 2009, 09:10:02 AM
@ rosali

ich habe Deinen Code 1zu1 uebernommen (siehe http://www.ssl.mynetcologne.de/screen.png (http://www.ssl.mynetcologne.de/screen.png)) aber der logout leitet trotzdem zu!?...
/index.php?_task=logout

Ich benutze roundcube 0.31
Title: Ajax Login und Logout Weiterleitung?
Post by: rosali on December 30, 2009, 10:39:36 AM
Bei mir funzt es. Ich habe es gerade nochmal überprüft. Im Gegensatz zu Dir benutze ich die aktuelle SVN version (Roundcube Webmail (http://trac.roundcube.net)). Also liegt es m.E. entweder an der Version oder Du hast ein anderes Plugin aktiviert, das den logout_after hook benutzt.

Wenn ich das folgende frage, komme ich mir immer etwas blöd vor, da ich ja nicht weiss, ob ich einen Newbie, einen Semi-Professional oder einen Advanced User anspreche:

Hast Du das plugin wirklich auch richtig registriert?

$rcmail_config['plugins'] = array(
  "logout_redirect",
  ... alle anderen Plugins
);
Title: Ajax Login und Logout Weiterleitung?
Post by: rundkubus on December 30, 2009, 11:42:18 AM
@ rosali

oh man, weil ich nicht richtig nachgelesen habe, wusste ich nicht das plugin-ordner, start-script und class _identisch_ betitelt sein muessen! :|
Danke fuer den Hinweis, jetzt gehts super! :)

Sorry fuer den Heckmeck,
Gruss rundkubus
Title: Ajax Login und Logout Weiterleitung?
Post by: rundkubus on December 30, 2009, 12:45:39 PM
@ rosali

Besten Dank fuer Deinen super Einsatz! :)

Eine kleine Frage habe ich noch, wie kann ich feststellen ob der Logout vom User
manuell oder vom System automatisch (aufgrund eines Timeouts) vollzogen wurde?

Das wuerde ich gerne in der redirect-url domain/?log=xxx mitgeben.
xxx = "user" _oder_ "auto"
Title: logout_redirect
Post by: rosali on December 31, 2009, 02:04:48 AM
Ich gehe davon aus, dass Deine User die Roundcube Login Page niemals zu Gesicht bekommen sollen.

Wenn das richtig ist, dann benutze das anhängende Plugin.
Title: Ajax Login und Logout Weiterleitung?
Post by: rosali on December 31, 2009, 02:08:00 AM
Könntest Du bitte Dein AJAX Login Script posten?
Title: Ajax Login und Logout Weiterleitung?
Post by: rundkubus on December 31, 2009, 07:38:02 AM
@ rosali

Zuerst: Es sollte auch weiterhin moeglich sein, sich ueber das "normale" Loginform einzuloggen. Manche bevorzugen einen neutrales Loginform statt meine Portalseite.
Das ein Ajax Login via $_POST[ajax] in der Roundcube Session registriert und beim Logout entsprechend beachtet wird (ein Switch ob ein eigener Redirect greift oder nicht), fehlt aber noch.

Anbei eine Standalone Version des HTML/jQuery Login Scripts (muss nach .html umbenannt werden).

Frage:
Verstehe ich das richtig, das in Deinem logout_redirect.php Script bei einem Session Timeout die Funktion login_page() greift?

Gruss Rundkubus
Title: Ajax Login und Logout Weiterleitung?
Post by: rosali on January 01, 2010, 10:24:51 AM
Ich sehe keinen Hook, der bei einem Timeout benutzt werden könnte. Allerdings wird bei einem Timeout auf die Login Page umgeleitet. Insoweist ist die Antwort also "ja". Zu beachten ist aber, dass meine Methode die Login Page komplett sperrt.
Title: Ajax Login und Logout Weiterleitung?
Post by: rundkubus on January 01, 2010, 12:38:34 PM
@ 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?
Title: Ajax Login und Logout Weiterleitung?
Post by: rosali on January 02, 2010, 12:41:53 AM
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.
Title: Ajax Login und Logout Weiterleitung?
Post by: rosali on January 02, 2010, 12:48:18 AM

/**
 * 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;
  }
}
?>
Title: Ajax Login und Logout Weiterleitung?
Post by: rundkubus on January 02, 2010, 09:48:38 AM
@ 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


/**
 * 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;
  }
}
?>
Title: Ajax Login und Logout Weiterleitung?
Post by: rosali on January 02, 2010, 02:00:09 PM
Was meinst Du mit "manuellem AJAX Logout"?
Title: Ajax Login und Logout Weiterleitung?
Post by: rundkubus on January 02, 2010, 03:00:19 PM
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).
Title: Ajax Login und Logout Weiterleitung?
Post by: rosali on January 02, 2010, 03:13:49 PM
OK ...

Dann geht das eben alles innerhalb 'login_page' mit einem Check $rcmail->task == "logout" ... Probier ich morgen ... außer Du bist scheller ;)
Title: Ajax Login und Logout Weiterleitung?
Post by: rosali on January 02, 2010, 03:49:32 PM
Hoffentlich diesesmal ...


/**
 * 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;
  }
}
?>
Title: Ajax Login und Logout Weiterleitung?
Post by: rundkubus on January 02, 2010, 04:08:19 PM
@ 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)

/**
 * 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'] == 1 && $p['template'] == 'login')
$this->goto_url('auto');
return $p;
}
}
?>
Title: Ajax Login und Logout Weiterleitung?
Post by: rosali on January 03, 2010, 01:34:32 AM
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.