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:
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') )
{