<?php
/*******************************************************************************
 * Copyright (C) 2007 Easter-eggs
 * http://ldapsaisie.labs.libre-entreprise.org
 *
 * Author: See AUTHORS file in top-level directory.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License version 2
 * as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.

******************************************************************************/

/**
 * Objet Ldap eegroup
 *
 * @author Benjamin Renard <brenard@easter-eggs.com>
 */
class LSeegroup extends LSldapObject {

  /**
   * Constructeur
   *
   * Cette methode construit l'objet et définis la configuration.
   *
   * @author Benjamin Renard <brenard@easter-eggs.com>
   *
   * @param[in] $config array La configuration de l'objet
   *
   * @retval boolean true si l'objet a été construit, false sinon.
   *
   * @see LSldapObject::LSldapObject()
   */
  function LSeegroup ($config='auto') {
    $this -> LSldapObject('LSeegroup',$config);
  }

  /**
   * Retourne la liste des groupes d'un utilisateur
   * 
   * Retourne un tableau de LSeegroup correspondant aux groupes
   * auxquels appartient un utilisateur
   * 
   * @param[in] $userObject Un object LSeepeople
   * 
   * @retval Array of LSeegroup Les groupes de l'utilisateur
   **/
  function listUserGroups($userObject) {
    $dn = $userObject -> getDn();
    $filter = $this -> getObjectFilter();
    $filter = '(&'.$filter.'(uniqueMember='.$dn.'))';
    return $this -> listObjects($filter);
  }

  /**
   * Ajoute un utilisateur au groupe
   * 
   * @param[in] $object Un object LSeepeople : l'utilisateur à ajouter
   * 
   * @retval boolean true si l'utilisateur à été ajouté, False sinon
   **/  
  function addOneMember($object) {
    if ($object instanceof LSeepeople) {
      if ($this -> attrs['uniqueMember'] instanceof LSattribute) {
        $dn = $object -> getDn();
        $values = $this -> attrs['uniqueMember'] -> getValue();
        if (!is_array($values)) {
          $updateData = array($dn);
        }
        else if (!in_array($dn,$values)) {
          $values[]=$dn;
          $updateData = $values;
        }
        if (isset($updateData)) {
          return $GLOBALS['LSldap'] -> update($this -> getType(),$this -> getDn(), array('uniqueMember' => $updateData));
        }
        return true;
      }
    }
    return;
  }
  
  /**
   * Supprime un utilisateur du groupe
   * 
   * @param[in] $object Un object LSeepeople : l'utilisateur à supprimer
   * 
   * @retval boolean true si l'utilisateur à été supprimé, False sinon
   **/  
  function deleteOneMember($object) {
    if ($object instanceof LSeepeople) {
      if ($this -> attrs['uniqueMember'] instanceof LSattribute) {
        $dn = $object -> getDn();
        $values = $this -> attrs['uniqueMember'] -> getValue();
        if ((!is_array($values)) && (!empty($values))) {
          $values = array($values);
        }
        if (is_array($values)) {
          $updateData=array();
          foreach($values as $value) {
            if ($value!=$dn) {
              $updateData[]=$value;
            }
          }
          return $GLOBALS['LSldap'] -> update($this -> getType(),$this -> getDn(), array('uniqueMember' => $updateData));
        }
        return;
      }
    }
    return;
  }
  
  /**
   * Met à jour les groupes d'un utilisateur
   * 
   * @param[in] $userObject LSeepeople Un object LSeepeople : l'utilisateur
   * @param[in] $listDns Array(string) Un tableau des DNs des groupes de l'utilisateur
   * 
   * @retval boolean true si tout c'est bien passé, False sinon
   **/  
  function updateUserGroups($userObject,$listDns) {
    $currentGroups = $this -> listUserGroups($userObject);
    $type=$this -> getType();
    if(is_array($currentGroups)) {
      if (is_array($listDns)) {
        $dontDelete=array();
        $dontAdd=array();
        for ($i=0;$i<count($currentGroups);$i++) {
          $dn = $currentGroups[$i] -> getDn();
          if (in_array($dn, $listDns)) {
            $dontDelete[$i]=true;
            $dontAdd[]=$dn;
          }
        }
        
        for($i=0;$i<count($currentGroups);$i++) {
          if ($dontDelete[$i]) {
            continue;
          }
          else {
            if (!$currentGroups[$i] -> deleteOneMember($userObject)) {
              return;
            }
          }
        }
        
        foreach($listDns as $dn) {
          if (in_array($dn,$dontAdd)) {
            continue;
          }
          else {
            $object = new $type();
            if ($object -> loadData($dn)) {
              if (!$object -> addOneMember($userObject)) {
                return;
              }
            }
            else {
              return;
            }
          }
        }
        return true;
      }
    }
    else {
      if(!is_array($listDns)) {
        return true;
      }
      foreach($listDns as $dn) {
        $object = new $type();
        if ($object -> loadData($dn)) {
          if (!$object -> addOneMember($userObject)) {
            return;
          }
        }
        else {
          return;
        }
      }
    }
  }
}

?>