1<?php
2/**
3 * PHP LDAP CLASS FOR MANIPULATING ACTIVE DIRECTORY
4 * Version 4.0.4
5 *
6 * PHP Version 5 with SSL and LDAP support
7 *
8 * Written by Scott Barnett, Richard Hyland
9 *   email: scott@wiggumworld.com, adldap@richardhyland.com
10 *   http://adldap.sourceforge.net/
11 *
12 * Copyright (c) 2006-2012 Scott Barnett, Richard Hyland
13 *
14 * We'd appreciate any improvements or additions to be submitted back
15 * to benefit the entire community :)
16 *
17 * This library is free software; you can redistribute it and/or
18 * modify it under the terms of the GNU Lesser General Public
19 * License as published by the Free Software Foundation; either
20 * version 2.1 of the License.
21 *
22 * This library is distributed in the hope that it will be useful,
23 * but WITHOUT ANY WARRANTY; without even the implied warranty of
24 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
25 * Lesser General Public License for more details.
26 *
27 * @category ToolsAndUtilities
28 * @package adLDAP
29 * @subpackage Folders
30 * @author Scott Barnett, Richard Hyland
31 * @copyright (c) 2006-2012 Scott Barnett, Richard Hyland
32 * @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html LGPLv2.1
33 * @revision $Revision: 97 $
34 * @version 4.0.4
35 * @link http://adldap.sourceforge.net/
36 */
37require_once(dirname(__FILE__) . '/../adLDAP.php');
38
39/**
40* FOLDER / OU MANAGEMENT FUNCTIONS
41*/
42class adLDAPFolders {
43    /**
44    * The current adLDAP connection via dependency injection
45    *
46    * @var adLDAP
47    */
48    protected $adldap;
49
50    public function __construct(adLDAP $adldap) {
51        $this->adldap = $adldap;
52    }
53
54    /**
55    * Delete a distinguished name from Active Directory
56    * You should never need to call this yourself, just use the wrapper functions user_delete and contact_delete
57    *
58    * @param string $dn The distinguished name to delete
59    * @return bool
60    */
61    public function delete($dn){
62        $result = ldap_delete($this->adldap->getLdapConnection(), $dn);
63        if ($result != true) {
64            return false;
65        }
66        return true;
67    }
68
69    /**
70    * Returns a folder listing for a specific OU
71    * See http://adldap.sourceforge.net/wiki/doku.php?id=api_folder_functions
72    *
73    * @param array $folderName An array to the OU you wish to list.
74    *                           If set to NULL will list the root, strongly recommended to set
75    *                           $recursive to false in that instance!
76    * @param string $dnType The type of record to list.  This can be ADLDAP_FOLDER or ADLDAP_CONTAINER.
77    * @param bool $recursive Recursively search sub folders
78    * @param bool $type Specify a type of object to search for
79    * @return array
80    */
81    public function listing($folderName = NULL, $dnType = adLDAP::ADLDAP_FOLDER, $recursive = NULL, $type = NULL)
82    {
83        if ($recursive === NULL) { $recursive = $this->adldap->getRecursiveGroups(); } //use the default option if they haven't set it
84        if (!$this->adldap->getLdapBind()) { return false; }
85
86        $filter = '(&';
87        if ($type !== NULL) {
88            switch ($type) {
89                case 'contact':
90                    $filter .= '(objectClass=contact)';
91                    break;
92                case 'computer':
93                    $filter .= '(objectClass=computer)';
94                    break;
95                case 'group':
96                    $filter .= '(objectClass=group)';
97                    break;
98                case 'folder':
99                    $filter .= '(objectClass=organizationalUnit)';
100                    break;
101                case 'container':
102                    $filter .= '(objectClass=container)';
103                    break;
104                case 'domain':
105                    $filter .= '(objectClass=builtinDomain)';
106                    break;
107                default:
108                    $filter .= '(objectClass=user)';
109                    break;
110            }
111        }
112        else {
113            $filter .= '(objectClass=*)';
114        }
115        // If the folder name is null then we will search the root level of AD
116        // This requires us to not have an OU= part, just the base_dn
117        $searchOu = $this->adldap->getBaseDn();
118        if (is_array($folderName)) {
119            $ou = $dnType . "=" . implode("," . $dnType . "=", $folderName);
120            $filter .= '(!(distinguishedname=' . $ou . ',' . $this->adldap->getBaseDn() . ')))';
121            $searchOu = $ou . ',' . $this->adldap->getBaseDn();
122        }
123        else {
124            $filter .= '(!(distinguishedname=' . $this->adldap->getBaseDn() . ')))';
125        }
126
127        if ($recursive === true) {
128            $sr = ldap_search($this->adldap->getLdapConnection(), $searchOu, $filter, array('objectclass', 'distinguishedname', 'samaccountname'));
129            $entries = @ldap_get_entries($this->adldap->getLdapConnection(), $sr);
130            if (is_array($entries)) {
131                return $entries;
132            }
133        }
134        else {
135            $sr = ldap_list($this->adldap->getLdapConnection(), $searchOu, $filter, array('objectclass', 'distinguishedname', 'samaccountname'));
136            $entries = @ldap_get_entries($this->adldap->getLdapConnection(), $sr);
137            if (is_array($entries)) {
138                return $entries;
139            }
140        }
141
142        return false;
143    }
144
145    /**
146    * Create an organizational unit
147    *
148    * @param array $attributes Default attributes of the ou
149    * @return bool
150    */
151    public function create($attributes)
152    {
153        if (!is_array($attributes)){ return "Attributes must be an array"; }
154        if (!is_array($attributes["container"])) { return "Container attribute must be an array."; }
155        if (!array_key_exists("ou_name",$attributes)) { return "Missing compulsory field [ou_name]"; }
156        if (!array_key_exists("container",$attributes)) { return "Missing compulsory field [container]"; }
157
158        $attributes["container"] = array_reverse($attributes["container"]);
159
160        $add=array();
161        $add["objectClass"] = "organizationalUnit";
162        $add["OU"] = $attributes['ou_name'];
163        $containers = "";
164        if (count($attributes['container']) > 0) {
165            $containers = "OU=" . implode(",OU=", $attributes["container"]) . ",";
166        }
167
168        $containers = "OU=" . implode(",OU=", $attributes["container"]);
169        $result = ldap_add($this->adldap->getLdapConnection(), "OU=" . $add["OU"] . ", " . $containers . $this->adldap->getBaseDn(), $add);
170        if ($result != true) {
171            return false;
172        }
173
174        return true;
175    }
176
177}
178
179?>