openrat-cms

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

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:
action/LoginAction.class.php | 28+++++++++++++++++++---------
auth/RememberAuth.class.php | 45+++++++++++++++++++++++++++++++++++++++++++++
config/config-default.php | 2+-
language/de.ini.php | 1+
language/en.ini.php | 1+
model/User.class.php | 21+++++++++++++++++++++
themes/default/templates/login/login.tpl.src.xml | 18++++++++++++++++++
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>