openrat-cms

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

commit f79b822d96f9a0273d0e589b393642c157bcbf48
parent 8b70421bee71d8188c870ec191b03c100918918e
Author: Jan Dankert <devnull@localhost>
Date:   Tue,  6 Nov 2012 21:52:01 +0100

Fix: Gruppen nach Login synchronisieren. Fix: Diverse Fehler in Auth-Modulen.

Diffstat:
action/LoginAction.class.php | 108+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------
auth/DatabaseAuth.class.php | 9+++++++--
auth/InternalAuth.class.php | 6+++---
auth/LdapAuth.class.php | 50+-------------------------------------------------
config/config-default.php | 2++
model/Group.class.php | 26+++++++++++++++++++++++++-
model/User.class.php | 18++++++++++++++----
7 files changed, 150 insertions(+), 69 deletions(-)

diff --git a/action/LoginAction.class.php b/action/LoginAction.class.php @@ -762,6 +762,50 @@ class LoginAction extends Action } + /** + * Synchronisiert die bisherigen Gruppen des Benutzers mit den Gruppen, die sich aus der Authentifzierung ergeben haben. + * + * @param unknown_type $groups Einfaches Array von Gruppennamen. + */ + private function checkGroups($user, $groups) + { + if ( $groups == null ) + return; + + $oldGroups = $user->getGroups(); + + foreach( $oldGroups as $id=>$name) + { + if ( !in_array($name,$groups) ) + $user->delGroup($id); + } + + foreach( $groups as $name) + { + if ( ! in_array($name,$oldGroups)) + { + try + { + $group = Group::loadWithName( $name ); + $user->addGroup($group->groupid); + } + catch (ObjectNotFoundException $e) + { + // Gruppe fehlt. Anlegen? + if ( $conf['ldap']['authorize']['auto_add'] ) + { + // Die Gruppe in der OpenRat-Datenbank hinzufuegen. + $g = new Group(); + $g->name = $group; + $g->add(); // Gruppe hinzufuegen + $user->addGroup($g->groupid); // Und Gruppe dem Benutzer hinzufuegen. + } + + } + } + } + } + /** * Login. @@ -789,27 +833,66 @@ class LoginAction extends Action // Authentifzierung. $modules = explode(',',$conf['security']['modules']['authenticate']); - $loginOk = false; + $loginOk = false; + $groups = null; foreach( $modules as $module) { $moduleClass = $module.'Auth'; - $auth = new $moduleClass; - Logger::info('Trying a login with module '.$moduleClass); + $auth = new $moduleClass; + Logger::info('Trying to login with module '.$moduleClass); $loginOk = $auth->login( $loginName,$loginPassword ); if ( $loginOk ) { - Logger::info('Login successful for '.$loginName); - break; // Login erfolgreich. + Logger::info('Login successful for '.$loginName); + + if ( isset($auth->groups ) ) + $groups = $auth->groups; + + break; // Login erfolgreich, erstes Modul gewinnt. } } - + /* $loginOk = $this->checkLogin( $loginName, $loginPassword, $newPassword1, $newPassword2 ); - */ + */ + + + if ( $loginOk ) + { + try + { + // Benutzer über den Benutzernamen laden. + $user = User::loadWithName($loginName); + Session::setUser($user); + } + catch( ObjectNotFoundException $ex ) + { + // Benutzer wurde zwar authentifiziert, ist aber in der + // internen Datenbank nicht vorhanden + if ( $conf['security']['newuser']['autoadd'] ) + { + // Neue Benutzer in die interne Datenbank uebernehmen. + $user = new User(); + $user->name = $loginName; + $user->fullname = $loginName; + $user->add(); + $user->save(); + } + else + { + // Benutzer soll nicht angelegt werden. + // Daher ist die Anmeldung hier gescheitert. + $loginOk = false; + } + } + } + + + if ( !$loginOk ) { // Anmeldung nicht erfolgreich @@ -838,9 +921,8 @@ class LoginAction extends Action else { Logger::debug("Login successful for user '$loginName'"); - - $user = User::loadWithName($loginName); - Session::setUser($user); + + $this->checkGroups( $user, $groups ); // Anmeldung erfolgreich. if ( config('security','renew_session_login') ) @@ -927,6 +1009,12 @@ class LoginAction extends Action $this->setPerspective('normal'); } + else + { + // Benutzer hat noch nie eine Änderung durchgefuehrt. + // Erstmal die Startseite anzeigen. + $this->setPerspective('start'); + } } else diff --git a/auth/DatabaseAuth.class.php b/auth/DatabaseAuth.class.php @@ -14,11 +14,16 @@ class DatabaseAuth implements Auth public function login( $user, $password ) { global $conf; + + $authDbConf = $conf['security']['authdb']; + + if ( ! $authDbConf['enable'] ) + return false; - $authdb = new DB( $conf['security']['authdb'] ); + $authdb = new DB( $authDbConf ); $sql = new Sql( $conf['security']['authdb']['sql'] ); - $sql->setString('username',$this->name); + $sql->setString('username',$user ); $sql->setString('password',$password); $row = $authdb->getRow( $sql ); $ok = !empty($row); diff --git a/auth/InternalAuth.class.php b/auth/InternalAuth.class.php @@ -20,7 +20,7 @@ SELECT * FROM {t_user} WHERE name={name} SQL ); - $sql->setString('name',$this->name); + $sql->setString('name',$username); $row_user = $db->getRow( $sql ); @@ -34,9 +34,9 @@ SQL // Login nicht erfolgreich return false; } - elseif ( $row_user['password'] == md5( $this->saltPassword($password) ) ) + elseif ( $row_user['password'] == md5( User::saltPassword($password) ) ) { - // Die Kennwort-Pr�fsumme stimmt mit dem aus der Datenbank �berein. + // Die Kennwort-Pruefsumme stimmt mit dem aus der Datenbank �berein. // Juchuu, Login ist erfolgreich. return true; } diff --git a/auth/LdapAuth.class.php b/auth/LdapAuth.class.php @@ -52,62 +52,14 @@ SQL $sucheAttribut = $conf['ldap']['authorize']['group_name']; $sucheFilter = str_replace('{dn}',$dn,$conf['ldap']['authorize']['group_filter']); - $ldap_groups = $ldap->searchAttribute( $sucheFilter, $sucheAttribut ); - $sql_ldap_groups = "'".implode("','",$ldap_groups)."'"; - - $sql = new Sql( <<<SQL -SELECT id,name FROM {t_group} - WHERE name IN($sql_ldap_groups) - ORDER BY name ASC -SQL - ); - + $this->groups = $ldap->searchAttribute( $sucheFilter, $sucheAttribut ); $user = new User( $userid ); - $oldGroups = $user->getGroupIds(); - $groups = $db->getAssoc( $sql ); - - foreach( $groups as $groupid=>$groupname) - { - if ( ! in_array($groupid,$oldGroups)) - $this->addGroup($groupid); - } - foreach( $oldGroups as $groupid) - { - if ( !isset($groups[$groupid]) ) - $this->delGroup($groupid); - } - - // Pr�fen, ob Gruppen fehlen. Diese dann ggf. in der OpenRat-Datenbank hinzuf�gen. - if ( $conf['ldap']['authorize']['auto_add'] ) - { - foreach( $ldap_groups as $group ) - { - if ( !in_array($group,$this->groups) ) // Gruppe schon da? - { - $g = new Group(); - $g->name = $group; - $g->add(); // Gruppe hinzuf�gen - - $this->groups[$g->groupid] = $group; - } - } - } // Html::debug($this->groups,'Gruppen/Ids des Benutzers'); // Verbindung zum LDAP-Server brav beenden $ldap->close(); - if ( $autoAdd ) - { - // Falls die Authentifizierung geklappt hat, wird der - // LDAP-Account in die Datenbank �bernommen. - $this->ldap_dn = $dn; - $this->fullname = $this->name; - $this->add(); - $this->save(); - } - return true; } diff --git a/config/config-default.php b/config/config-default.php @@ -748,12 +748,14 @@ $conf['security']['password']['salt_text']= "somerandomtext"; $conf['security']['http'] = array(); $conf['security']['http']['url']= "http://example.net/restricted-area"; $conf['security']['authdb'] = array(); +$conf['security']['authdb']['enable'] = false; $conf['security']['authdb']['type']='postgresql'; $conf['security']['authdb']['user']='dbuser'; $conf['security']['authdb']['password']='dbpassword'; $conf['security']['authdb']['host']= '127.0.0.1'; $conf['security']['authdb']['database']='dbname'; $conf['security']['authdb']['persistent']=false; +$conf['security']['authdb']['prepare']=false; $conf['security']['authdb']['sql']= "select 1 from table where user={username} and password=md5({password})"; $conf['security']['authdb']['add']=true; $conf['security']['ssl'] = array(); diff --git a/model/Group.class.php b/model/Group.class.php @@ -60,7 +60,7 @@ class Group } - // Lesen Benutzer aus der Datenbank + // Lesen Gruppe aus der Datenbank function load() { $db = db_connection(); @@ -77,6 +77,30 @@ class Group } + // Lesen einer Gruppe aus der Datenbank + public static function loadWithName( $name ) + { + $db = db_connection(); + + $sql = new Sql( 'SELECT * FROM {t_group}'. + ' WHERE name={name}' ); + $sql->setString('name',$name ); + + $row = $db->getRow( $sql ); + if ( count($row) > 0 ) + { + $group = new Group( $row['id'] ); + $group->load(); + + return $group; + } + else + { + throw new ObjectNotFoundException( "Group does not exist: ".$name); + } + } + + // Speichern Benutzer in der Datenbank function save() { diff --git a/model/User.class.php b/model/User.class.php @@ -38,7 +38,7 @@ class User var $desc; var $style; var $isAdmin; - var $projects; + var $projects = array(); var $rights; var $loginDate = 0; @@ -822,7 +822,12 @@ SQL } - // Benutzer einer Gruppe hinzufuegen + + /** + * Benutzer zu einer Gruppe hinzufuegen. + * + * @param groupid die Gruppen-Id + */ function addGroup( $groupid ) { $db = db_connection(); @@ -842,7 +847,12 @@ SQL } - // Benutzer aus Gruppe entfernen + + /** + * Benutzer aus Gruppe entfernen. + * + * @param groupid die Gruppen-Id + */ function delGroup( $groupid ) { $db = db_connection(); @@ -1081,7 +1091,7 @@ SQL * @param Kennwort * @return Das gesalzene Kennwort */ - function saltPassword( $pass ) + public function saltPassword( $pass ) { switch( config('security','password','salt') ) {