Roundcube Community Forum
Language Specific Support => Deutsch => Topic started 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
-
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'.
-
@ rosali
super, vielen Dank für Deine Tipps.
-
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.
-
@ rosali
ahh herrlich, werde ich so machen.
Besten Dank und schonmal angenehme Feiertage. :)
-
@ 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)...
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
-
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;
}
}
?>
-
@ 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
-
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
);
-
@ 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
-
@ 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"
-
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.
-
Könntest Du bitte Dein AJAX Login Script posten?
-
@ 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
-
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.
-
@ 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?
-
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.
-
/**
* 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;
}
}
?>
-
@ 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;
}
}
?>
-
Was meinst Du mit "manuellem AJAX Logout"?
-
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).
-
OK ...
Dann geht das eben alles innerhalb 'login_page' mit einem Check $rcmail->task == "logout" ... Probier ich morgen ... außer Du bist scheller ;)
-
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;
}
}
?>
-
@ 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;
}
}
?>
-
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.