diff --git a/admin/configuration.php b/admin/configuration.php index 53fe66a..b56879e 100644 --- a/admin/configuration.php +++ b/admin/configuration.php @@ -53,7 +53,7 @@ if (isset($_POST['check_ldap'])){ $error=$me->check_ldap(); if($error==1 && $username) { if ($me->ldap_bind_as($username,$_POST['PASSWORD'])){ - if($me->check_ldap_group_membership($username,$me->config['ld_group'])){ + if($me->check_ldap_group_membership($username,$_POST['USERNAME'])){ $template->assign('LD_CHECK_LDAP','<p style="color:green;">Configuration LDAP OK : '.$username.'</p>'); } else { $template->assign('LD_CHECK_LDAP','<p style="color:orange;">Credentials OK, Check GroupMembership for: '.$username.'</p>'); diff --git a/class.ldap.php b/class.ldap.php index 0113d4b..efe6192 100644 --- a/class.ldap.php +++ b/class.ldap.php @@ -125,11 +125,6 @@ class Ldap { return ldap_err2str(ldap_errno($this->cnx)); } - // return the name ldap understand - public function ldap_name($name){ - return $this->config['ld_attr'].'='.$name.','.$this->config['basedn']; - } - // authentication public public function ldap_bind_as($user,$user_passwd){ $this->write_log("[function]> ldap_bind_as"); @@ -152,18 +147,20 @@ class Ldap { return false; } - public function ldap_mail($name){ - //echo $this->cnx; - //echo $this->ldap_name($name); - $sr=@ldap_read($this->cnx, $this->ldap_name($name), "(objectclass=*)", array('mail')); + public function ldap_get_email($user_dn){ + $sr=@ldap_read($this->cnx, $user_dn, "(objectclass=*)", array('mail')); $entry = @ldap_get_entries($this->cnx, $sr); if (!empty($entry[0]['mail'])) { return $entry[0]['mail'][0]; - } - return False; + } + return null; } + public function ldap_get_user_email($username) { + return $this->ldap_email($this->ldap_get_dn($username)); + } + // return userdn (and username) for authentication public function ldap_search_dn($value_to_search){ $this->write_log("[function]> ldap_search_dn(".$value_to_search.")"); @@ -205,8 +202,9 @@ class Ldap { } // look for LDAP group membership - public function check_ldap_group_membership($user_dn,$group_dn){ - $this->write_log("[function]> check_ldap_group_membership(".$user_dn." , ".$group_dn.")"); + public function check_ldap_group_membership($user_dn, $user_login){ + $group_dn = $this->config['ld_group']; + $this->write_log("[function]> check_ldap_group_membership('$user_dn', '$group_dn', '$user_login')"); //if no group specified return true if(!$group_dn){ return true; @@ -219,22 +217,17 @@ class Ldap { $this->write_log("[check_ldap_group_membership]> Cannot bind to server!"); return false; } - // search for all memberOf-attributes for a given user_dn - $this->write_log("[check_ldap_group_membership]> @ldap_search(\$this->cnx,\"".$user_dn."\",\"(objectClass=*)\", array(\"memberOf\"),0,1)"); - if($search = @ldap_search($this->cnx, $user_dn, "(objectClass=*)", array("memberOf"),0,1)){ + // search for all member and memberUid attributes for a group_dn + $search_filter = "(|(&(objectClass=posixGroup)(memberUid=$user_login))(&(objectClass=group)(member=$user_dn)))"; + $this->write_log("[check_ldap_group_membership]> @ldap_search(\$this->cnx,'$group_dn', '$search_filter', array('memberOf'),0,1)"); + if($search = @ldap_search($this->cnx, $group_dn, $search_filter, array("dn"),0,1)){ $entry = @ldap_get_entries($this->cnx, $search); - //check if there are memberof-attributes - if(isset($entry[0]["memberof"])){ - $this->write_log("[check_ldap_group_membership]> Found ". $entry[0]["memberof"]["count"] ." memberOf-attributes"); - for($i=0; $i < $entry["0"]["memberof"]["count"]; $i++){ - $this->write_log("[check_ldap_group_membership]> checking: ". $entry["0"]["memberof"][$i]); - if(strcmp($group_dn,$entry["0"]["memberof"][$i]) == 0){ - $this->write_log("[check_ldap_group_membership]> Match found for \"". $group_dn ."\" AND \"".$entry["0"]["memberof"][$i]."\""); - return true; - } - } + //check if there are dn-attributes + if (!empty($entry[0]["dn"])) { + $this->write_log("[check_ldap_group_membership]> match found: ".$entry[0]["dn"]); + return true; } else { - $this->write_log("[check_ldap_group_membership]> No groups found for given user, check on ldap side"); + $this->write_log("[check_ldap_group_membership]> no group membership for user found for given group and user, check on ldap side"); } } else { $this->write_log("[check_ldap_group_membership]> ldap_search NOT successfull: " .$this->getErrorString()); diff --git a/main.inc.php b/main.inc.php index 090afe4..b8b62dd 100644 --- a/main.inc.php +++ b/main.inc.php @@ -61,10 +61,13 @@ function login($success, $username, $password, $remember_me){ $obj->load_config(); $obj->ldap_conn() or die("Unable to connect LDAP server : ".$ldap->getErrorString()); - //if (!$obj->ldap_bind_as($username,$password)){ // bind with userdn - if (!$obj->ldap_search_dn($username) || !$obj->ldap_bind_as($obj->ldap_search_dn($username),$password)){ // bind with userdn + $user_dn = $obj->ldap_search_dn($username); // retrieve the userdn + + // If we have userdn, attempt to login an check user's group access + if (!($user_dn && !$obj->ldap_bind_as($user_dn,$password) && + check_ldap_group_membership($user_dn, $username))) { trigger_notify('login_failure', stripslashes($username)); - return false; // wrong password + return false; // wrong user/password or no group access } // search user in piwigo database @@ -84,24 +87,19 @@ function login($success, $username, $password, $remember_me){ // this is where we check we are allowed to create new users upon that. if ($obj->config['allow_newusers']) { - // we got the email address - if ($obj->ldap_mail($username)) { - $mail = $obj->ldap_mail($username); - } - else { - $mail = NULL; - } - - // we actually register the new user + // retrieve LDAP e-mail address and create a new user + $mail = $obj->ldap_get_email($user_dn); $new_id = register_user($username,random_password(8),$mail); - - // now we fetch again his id in the piwigo db, and we get them, as we just created him ! - //$query = 'SELECT '.$conf['user_fields']['id'].' AS id FROM '.USERS_TABLE.' WHERE '.$conf['user_fields']['username'].' = \''.pwg_db_real_escape_string($username).'\' ;'; - //$row = pwg_db_fetch_assoc(pwg_query($query)); + // Login user log_user($new_id, False); trigger_notify('login_success', stripslashes($username)); - redirect('profile.php'); + + // in case the e-mail address is empty, redirect to profile page + if($mail==NULL) { + redirect('profile.php'); + } + return true; } // else : this is the normal behavior ! user is not created.