commit e6e1000da152f5c569cd32556e2317bf1eb38dd9
parent 1fe712426180b66293bbc8853cd266b33b78ad77
Author: Jan Dankert <devnull@localhost>
Date: Wed, 27 Feb 2013 19:36:44 +0100
Merken des Benutzer-Logins im Cookie über einen Login-Cookie.
Diffstat:
7 files changed, 106 insertions(+), 10 deletions(-)
diff --git a/action/LoginAction.class.php b/action/LoginAction.class.php
@@ -863,6 +863,7 @@ class LoginAction extends Action
if ( $loginOk )
{
+
try
{
// Benutzer über den Benutzernamen laden.
@@ -923,7 +924,14 @@ class LoginAction extends Action
Logger::debug("Login successful for user '$loginName'");
$this->checkGroups( $user, $groups );
-
+
+ if ( $this->hasRequestVar('remember') )
+ {
+ // Cookie setzen
+ setcookie('or_username',$user->name ,time()+(60*60*24*30*12*2) );
+ setcookie('or_token' ,$user->loginToken(),time()+(60*60*24*30*12*2) );
+ }
+
// Anmeldung erfolgreich.
if ( config('security','renew_session_login') )
$this->recreateSession();
@@ -1095,21 +1103,23 @@ class LoginAction extends Action
}
}
}
+
+ // Login-Token löschen:
+ // Wenn der Benutzer sich abmelden will, dann soll auch die automatische
+ // Anmeldung deaktiviert werden.
+ setcookie('or_token' ,'',0 );
// Umleiten auf eine definierte URL.s
$redirect_url = @$conf['security']['logout']['redirect_url'];
if ( !empty($redirect_url) )
{
- header('Location: '.$redirect_url);
- exit;
- }
- else
- {
- Session::set('perspective','login');
- $this->setStyle('default');
- $this->refresh();
+ $this->redirect($redirect_url);
}
+
+ Session::set('perspective','login');
+ $this->setStyle('default');
+ $this->refresh();
}
diff --git a/auth/RememberAuth.class.php b/auth/RememberAuth.class.php
@@ -0,0 +1,44 @@
+<?php
+
+/**
+ * Authentifizierung mit einem Login-Token.
+ *
+ * @author dankert
+ */
+class CookieAuth implements Auth
+{
+ public function username()
+ {
+ if ( isset($_COOKIE['or_username']) )
+ {
+ $name = $_COOKIE['or_username'];
+ try
+ {
+ $user = User::loadWithName($name);
+ $token = $user->loginToken();
+
+ // Stimmt der Token?
+ if ( $_COOKIE['or_token'] == $token )
+ // Token stimmt, Benutzer ist damit angemeldet.
+ return $name;
+ }
+ catch( ObjectNotFoundException $e )
+ {
+ // Benutzer nicht gefunden.
+ }
+ }
+
+ return null;
+ }
+
+
+ /**
+ * Ueberpruefen des Kennwortes ist über den Cookie nicht möglich.
+ */
+ public function login( $user, $password )
+ {
+ return false;
+ }
+}
+
+?>+
\ No newline at end of file
diff --git a/config/config-default.php b/config/config-default.php
@@ -731,7 +731,7 @@ $conf['security']['authorize']['type']='database';
$conf['security']['authorize']['type']='ldap';
$conf['security']['modules'] = array();
-$conf['security']['modules']['autologin']='Guest,SingleSignon';
+$conf['security']['modules']['autologin']='Remember,Guest,SingleSignon';
$conf['security']['modules']['preselect']='Ident,SSL,Cookie';
$conf['security']['modules']['authenticate']='LdapUserDN,Database,Internal';
diff --git a/language/de.ini.php b/language/de.ini.php
@@ -1170,3 +1170,4 @@ MENU_USERTIMELINE_DESC="Meine letzten Änderungen"
MENU_OPENID_DESC="Anmeldung über Ihre Open-Id-Kennung"
PAGEELEMENT_RELEASED="Der Inhalt wurde freigegeben."
PAGEELEMENT_USE_FROM_ARCHIVE="Der Inhalt wurde wieder hergestellt."
+REMEMBER_ME="Angemeldet bleiben"
diff --git a/language/en.ini.php b/language/en.ini.php
@@ -1212,3 +1212,4 @@ USER_YOURPROFILE = "My settings"
VALUE = Content
WEEK="Week"
WINDOW_FULLSCREEN="Fullscreen"
+REMEMBER_ME="Stay logged in"
diff --git a/model/User.class.php b/model/User.class.php
@@ -199,6 +199,27 @@ SQL
/**
+ * Ermittelt zu diesem Benutzer den Login-Token.
+ */
+ function loginToken()
+ {
+ global $conf;
+ $db = db_connection();
+
+ $sql = new Sql( 'SELECT id,mail,name,password FROM {t_user}'.
+ ' WHERE id={userid}' );
+ $sql->setInt( 'userid',$this->userid );
+ $row = $db->getRow( $sql );
+
+ if ( count($row) == 0 )
+ throw new ObjectNotFoundException();
+
+ // Zusammensetzen des Tokens
+ return sha1( $row['password'].$row['name'].$row['id'].$row['mail'] );
+ }
+
+
+ /**
* Lesen Benutzer aus der Datenbank.
*/
function load()
diff --git a/themes/default/templates/login/login.tpl.src.xml b/themes/default/templates/login/login.tpl.src.xml
@@ -66,6 +66,24 @@
size="20"></password>
</part>
</part>
+
+
+
+
+
+
+
+ <part class="line">
+ <part class="label">
+ </part>
+ <part class="input">
+ <checkbox name="remember" default="false"></checkbox>
+ <label for="remember">
+ <text key="REMEMBER_ME"></text>
+ </label>
+ </part>
+ </part>
+
</if>