R49257 - /trunk/phpgwapi/inc/class.accounts_ldap.inc.php

Author: ralfbecker
New Revision: 49257

URL: http://svn.stylite.de/viewvc/egroupware?rev=49257&view=rev
Log:
support for Univention LDAP schemas

Modified:
trunk/phpgwapi/inc/class.accounts_ldap.inc.php

Modified: trunk/phpgwapi/inc/class.accounts_ldap.inc.php
URL: http://svn.stylite.de/viewvc/egroupware/trunk/phpgwapi/inc/class.accounts_ldap.inc.php?rev=49257&r1=49256&r2=49257&view=diff

— trunk/phpgwapi/inc/class.accounts_ldap.inc.php (original)
+++ trunk/phpgwapi/inc/class.accounts_ldap.inc.php Thu Oct 30 16:21:39 2014
@@ -53,7 +53,7 @@
/
var $user_context;
/
*

    • LDAP search filter for user accounts, eg. (uid=%name)
    • LDAP search filter for user accounts, eg. (uid=%user)
    • @var string
      */
      @@ -82,15 +82,25 @@
      ‘user’ => array(
      ‘top’,‘person’,‘organizationalperson’,‘inetorgperson’,‘posixaccount’,‘shadowaccount’
      ),
  •   'user-if-supported' => array(	// these classes get added, only if the server supports them
    
  •   	'mozillaabpersonalpha','mozillaorgperson','evolutionperson'
    
  •   'user-if-supported' => array(	// these classes get added, if server supports them
    
  •   	'mozillaabpersonalpha','mozillaorgperson','evolutionperson','univentionperson'
      ),
      'group' => array(
      	'top','posixgroup','groupofnames'
    
  •   ),
    
  •   'group-if-supported' => array(	// these classes get added, if servers supports them
    
  •   	'univentiongroup',
      )
    

    );
    /**

    • Classes allowing to set a mail-address for a group and specify the memberaddresses as forwarding addresses
    • $objectclass => $forward
    • $objectclass => [$forward, $extra_attr, $mail_attr, $keep_objectclass]
    • $forward : name of attribute to set forwards for members mail addresses, false if not used/required
    • $extra_attr : required attribute (eg. ‘uid’), which need to be set, default none
    • $mail_attr : name of attribute for mail-address, if not ‘mail’
    • $keep_objectclass : true to not remove objectclass, if not mail set
    • @var array
      */
      @@ -99,6 +109,7 @@
      ‘dbmailuser’ => array(‘mailforwardingaddress’,‘uid’),
      ‘qmailuser’ => array(‘mailforwardingaddress’,‘uid’),
      ‘mailaccount’ => ‘mailalias’,
  •   'univentiongroup' => array(false, false, 'mailprimaryaddress', true),
    

    );

    /**
    @@ -200,10 +211,7 @@
    else
    {
    $old = ldap::result2array($old[0]);

  •   		foreach($old['objectclass'] as $n => $class)
    
  •   		{
    
  •   			$old['objectclass'][$n] = strtolower($class);
    
  •   		}
    
  •   		$old['objectclass'] = array_map('strtolower', $old['objectclass']);
      		$key = false;
      		if ($is_group && ($key = array_search('namedobject',$old['objectclass'])) !== false ||
      			$is_group && ($old['cn'] != $data_utf8['account_lid'] || substr($old['dn'],0,3) != 'cn=') ||
    

@@ -243,9 +251,9 @@
{
$to_write[‘objectclass’] = $old ? $old[‘objectclass’] : array();
}

  •   	if (!$old && !$is_group)	// for new accounts add additional addressbook object classes, if supported by server
    
  •   	if (!$old)	// for new accounts add additional addressbook object classes, if supported by server
      	{			// as setting them later might loose eg. password, if we are not allowed to read them
    
  •   		foreach($this->requiredObjectClasses['user-if-supported'] as $additional)
    
  •   		foreach($this->requiredObjectClasses[$is_group?'group-if-supported':'user-if-supported'] as $additional)
      		{
      			if ($this->ldapServerInfo->supportsObjectClass($additional))
      			{
    

@@ -269,20 +277,22 @@
$to_write = $this->_merge_group($to_write,$data_utf8);
$data[‘account_type’] = ‘g’;

  •   	$groupOfNames = in_array('groupofnames',$old ? $old['objectclass'] : $to_write['objectclass']);
    
  •   	if (!$old && $groupOfNames || $members)
    
  •   	{
    
  •   		$to_write = array_merge($to_write,$this->set_members($members,
    
  •   			$data['account_id'],$groupOfNames,$dn));
    
  •   	$objectclass = $old ? $old['objectclass'] : $to_write['objectclass'];
    
  •   	if ($members || !$old && array_intersect(array('groupofnames','groupofuniquenames','univentiongroup'), $objectclass))
    
  •   	{
    
  •   		$to_write = array_merge($to_write, $this->set_members($members, $data['account_id'], $objectclass, $dn));
      	}
      	// check if we should set a mail address and forwards for each member
      	foreach($this->group_mail_classes as $objectclass => $forward)
      	{
    
  •   		$extra_attr = false;
    
  •   		$mail_attr = 'mail';
    
  •   		$keep_objectclass = false;
    
  •   		if (is_array($forward)) list($forward,$extra_attr,$mail_attr,$keep_objectclass) = $forward;
    
  •   		if ($this->ldapServerInfo->supportsObjectClass($objectclass) &&
    
  •   			($old && in_array($objectclass,$old['objectclass']) || $data_utf8['account_email'] || $old['mail']))
    
  •   		{
    
  •   			$extra_attr = false;
    
  •   			if (is_array($forward)) list($forward,$extra_attr) = $forward;
    
  •   			($old && in_array($objectclass,$old['objectclass']) || $data_utf8['account_email'] || $old[$mail_attr]))
    
  •   		{
      			if ($data_utf8['account_email'])	// setting an email
      			{
      				if (!in_array($objectclass,$old ? $old['objectclass'] : $to_write['objectclass']))
    

@@ -291,23 +301,27 @@
$to_write[‘objectclass’][] = $objectclass;
}
if ($extra_attr) $to_write[$extra_attr] = $data_utf8[‘account_lid’];

  •   				$to_write['mail'] = $data_utf8['account_email'];
    
  •   				if (!$members) $members = $this->members($data['account_id']);
    
  •   				$to_write[$forward] = array();
    
  •   				foreach (array_keys($members) as $member)
    
  •   				$to_write[$mail_attr] = $data_utf8['account_email'];
    
  •   				if ($forward)
      				{
    
  •   					if (($email = $this->id2name($member,'account_email')))
    
  •   					if (!$members) $members = $this->members($data['account_id']);
    
  •   					$to_write[$forward] = array();
    
  •   					foreach (array_keys($members) as $member)
      					{
    
  •   						$to_write[$forward][] = $email;
    
  •   						if (($email = $this->id2name($member,'account_email')))
    
  •   						{
    
  •   							$to_write[$forward][] = $email;
    
  •   						}
      					}
      				}
      			}
      			elseif($old)	// remove the mail and forwards only for existing entries
      			{
    
  •   				$to_write['mail'] = $to_write[$forward] = array();
    
  •   				$to_write[$mail_attr] = array();
    
  •   				if ($forward) $to_write[$forward] = array();
      				if ($extra_attr) $to_write[$extra_attr] = array();
    
  •   				if (($key = array_search($objectclass,$old['objectclass'])))
    
  •   				if (!$keep_objectclass && ($key = array_search($objectclass,$old['objectclass'])))
      				{
      					$to_write['objectclass'] = $old['objectclass'];
      					unset($to_write['objectclass'][$key]);
    

@@ -360,8 +374,6 @@
if ($err)
{
error_log(METHOD."() ldap_".($old ? ‘modify’ : ‘add’)."(,’$dn’,".array2string($to_write).") --> ldap_error()=".ldap_error($this->ds));

  •   		echo "ldap_".($old ? 'modify' : 'add')."(,$dn,".print_r($to_write,true).")\n";
    
  •   		echo ldap_error($this->ds);
      		return false;
      	}
      }
    

@@ -410,8 +422,23 @@
*/
protected function _read_group($account_id)
{

  •   $mail_attr = 'mail';
    
  •   $group = array();
    
  •   if (!is_object($this->ldapServerInfo))
    
  •   {
    
  •   	$this->ldapServerInfo = $this->ldap->getLDAPServerInfo($this->frontend->config['ldap_host']);
    
  •   }
    
  •   foreach($this->group_mail_classes as $objectclass => $attrs)
    
  •   {
    
  •   	if ($this->ldapServerInfo->supportsObjectClass($objectclass))
    
  •   	{
    
  •   		$group['mailAllowed'] = $objectclass;
    
  •   		if (is_array($attrs) && $attrs[2]) $mail_attr = $attrs[2];
    
  •   		break;
    
  •   	}
    
  •   }
      $sri = ldap_search($this->ds, $this->group_context,'(&(objectClass=posixGroup)(gidnumber=' . abs($account_id).'))',
    
  •   	array('dn','gidnumber','cn','objectclass','mail'));
    
  •   	array('dn', 'gidnumber', 'cn', 'objectclass', $mail_attr, 'memberuid'));
    
      $ldap_data = ldap_get_entries($this->ds, $sri);
      if (!$ldap_data['count'])
    

@@ -419,8 +446,9 @@
return false; // group not found
}
$data = translation::convert($ldap_data[0],‘utf-8’);

  •   $group = array(
    
  •   unset($data['objectclass']['count']);
    
  •   $group += array(
      	'account_dn'        => $data['dn'],
      	'account_id'        => -$data['gidnumber'][0],
      	'account_lid'       => $data['cn'][0],
    

@@ -428,21 +456,24 @@
‘account_firstname’ => $data[‘cn’][0],
‘account_lastname’ => lang(‘Group’),
‘account_fullname’ => lang(‘Group’).’ '.$data[‘cn’][0],

  •   	'groupOfNames'      => in_array('groupOfNames',$data['objectclass']),
    
  •   	'account_email'     => $data['mail'][0],
    
  •   	'objectclass'       => array_map('strtolower', $data['objectclass']),
    
  •   	'account_email'     => $data[$mail_attr][0],
    
  •   	'members'           => array(),
      );
    
  •   if (!is_object($this->ldapServerInfo))
    
  •   {
    
  •   	$this->ldapServerInfo = $this->ldap->getLDAPServerInfo($this->frontend->config['ldap_host']);
    
  •   }
    
  •   foreach(array_keys($this->group_mail_classes) as $objectclass)
    
  •   {
    
  •   	if ($this->ldapServerInfo->supportsObjectClass($objectclass))
    
  •   	{
    
  •   		$group['mailAllowed'] = $objectclass;
    
  •   		break;
    
  •   	}
    
  •   }
    
  •   if (isset($data['memberuid']))
    
  •   {
    
  •   	unset($data['memberuid']['count']);
    
  •   	foreach($data['memberuid'] as $lid)
    
  •   	{
    
  •   		if (($id = $this->name2id($lid, 'account_lid', 'u')))
    
  •   		{
    
  •   			$group['members'][$id] = $lid;
    
  •   		}
    
  •   	}
    
  •   }
    
  •   return $group;
    
    }

@@ -745,7 +776,7 @@
‘account_modified’ => isset($allVals[‘modifytimestamp’][0]) ? self::accounts_ldap2ts($allVals[‘modifytimestamp’][0]) : null,
‘account_primary_group’ => (string)-$allVals[‘gidnumber’][0],
);

  •   				error_log(__METHOD__."() ldap=".array2string($allVals)." --> account=".array2string($account));
    
  •   				//error_log(__METHOD__."() ldap=".array2string($allVals)." --> account=".array2string($account));
      				if ($param['active'] && !$this->frontend->is_active($account))
      				{
      					if (isset($totalcount)) --$totalcount;
    

@@ -755,7 +786,7 @@
// return objectclass(es)
if ($param[‘objectclass’])
{

  •   					$account['objectclass'] = $allVals['objectclass'];
    
  •   					$account['objectclass'] = array_map('strtolower', $allVals['objectclass']);
      					unset($account['objectclass']['count']);
      				}
      				$accounts[$account['account_id']] = $account;
    

@@ -1005,9 +1036,11 @@
$members = array();
if (isset($group[0][‘memberuid’]))
{

  •   	unset($group[0]['memberuid']['count']);
    
  •   	foreach($group[0]['memberuid'] as $lid)
      	{
    
  •   		if (($id = $this->name2id($lid)))
    
  •   		if (($id = $this->name2id($lid, 'account_lid', 'u')))
      		{
      			$members[$id] = $lid;
      		}
    

@@ -1054,33 +1087,46 @@
*
* @param array $members array with uidnumber or uid’s
* @param int $gid gidnumber of group to set

    • @param boolean $groupOfNames =null should we set the member attribute of groupOfNames (default detect it)
    • @param array $objectclass =null should we set the member and uniqueMember attributes (groupOf(Unique)Names|univentionGroup) (default detect it)
    • @param string $use_cn =null if set $cn is used instead $gid and the attributes are returned, not written to ldap
    • @param boolean $uniqueMember =null should we set the uniqueMember attribute (default detect it)
    • @return boolean/array false on failure, array or true otherwise
      */
  • function set_members($members,$gid,$groupOfNames=null,$use_cn=null)
  • function set_members($members, $gid, array $objectclass=null, $use_cn=null)
    {
    //echo “

    accounts_ldap::set_members(”.print_r($members,true).",$gid)

    \n";
    if (!($cn = $use_cn) && !($cn = $this->id2name($gid))) return false;
  •   // do that group is a groupOfNames?
    
  •   if (is_null($groupOfNames)) $groupOfNames = $this->id2name($gid,'groupOfNames');
    
  •   // do that group is a groupOf(Unique)Names or univentionGroup?
    
  •   if (is_null($objectclass)) $objectclass = $this->id2name($gid,'objectclass');
    
      $to_write = array('memberuid' => array());
      foreach((array)$members as $key => $member)
      {
    
  •   	$member_dn = $this->id2name($member, 'account_dn');
      	if (is_numeric($member)) $member = $this->id2name($member);
    
      	if ($member)
      	{
      		$to_write['memberuid'][] = $member;
    
  •   		if ($groupOfNames) $to_write['member'][] = 'uid='.$member.','.$this->user_context;
    
  •   	}
    
  •   }
    
  •   if ($groupOfNames && !$to_write['member'])
    
  •   {
    
  •   	// hack as groupOfNames requires the member attribute
    
  •   		if (in_array('groupofnames', $objectclass))
    
  •   		{
    
  •   			$to_write['member'][] = $member_dn;
    
  •   		}
    
  •   		if (array_intersect(array('groupofuniquenames','univentiongroup'), $objectclass))
    
  •   		{
    
  •   			$to_write['uniquemember'][] = $member_dn;
    
  •   		}
    
  •   	}
    
  •   }
    
  •   // hack as groupOfNames requires the member attribute
    
  •   if (in_array('groupofnames', $objectclass) && !$to_write['member'])
    
  •   {
      	$to_write['member'][] = 'uid=dummy'.','.$this->user_context;
    
  •   }
    
  •   if (array_intersect(array('groupofuniquenames','univentiongroup'), $objectclass) && !$to_write['uniquemember'])
    
  •   {
    
  •   	$to_write['uniquemember'][] = 'uid=dummy'.','.$this->user_context;
      }
      if ($use_cn) return $to_write;
    

@@ -1091,10 +1137,13 @@
if (is_array($forward)) list($forward,$extra_attr) = $forward;
if ($extra_attr && ($uid = $this->id2name($gid))) $to_write[$extra_attr] = $uid;

  •   	$to_write[$forward] = array();
    
  •   	foreach($members as $key => $member)
    
  •   	{
    
  •   		if (($email = $this->id2name($member,'account_email')))	$to_write[$forward][] = $email;
    
  •   	if ($forward)
    
  •   	{
    
  •   		$to_write[$forward] = array();
    
  •   		foreach($members as $key => $member)
    
  •   		{
    
  •   			if (($email = $this->id2name($member,'account_email')))	$to_write[$forward][] = $email;
    
  •   		}
      	}
      }
      if (!ldap_modify($this->ds,'cn='.ldap::quote($cn).','.$this->group_context,$to_write))
    


eGroupWare-cvs mailing list
eGroupWare-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/egroupware-cvs