Issues (4868)

api/src/Ldap/ServerInfo.php (1 issue)

Labels
Severity
1
<?php
2
/**
3
 * EGroupware API - LDAP server information
4
 *
5
 * @link http://www.egroupware.org
6
 * @author Lars Kneschke <[email protected]>
7
 *
8
 * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
9
 * @package api
10
 * @subpackage ldap
11
 */
12
13
namespace EGroupware\Api\Ldap;
14
15
/**
16
 * Class to store and retrieve information (eg. supported object classes) of a connected ldap server
17
 */
18
class ServerInfo
19
{
20
	/**
21
	 * Unknown LDAP server
22
	 */
23
	const UNKNOWN = 0;
24
	/**
25
	 * OpenLDAP server
26
	 */
27
	const OPENLDAP = 1;
28
	/**
29
	 * Samba4 LDAP server
30
	 */
31
	const SAMBA4 = 2;
32
33
	/**
34
	* @var array $namingContext holds the supported namingcontexts
35
	*/
36
	var $namingContext = array();
37
38
	/**
39
	* @var string $version holds the LDAP server version
40
	*/
41
	var $version = 2;
42
43
	/**
44
	* @var integer $serverType holds the type of LDAP server(OpenLDAP, ADS, NDS, ...)
45
	*/
46
	var $serverType = 0;
47
48
	/**
49
	* @var string $_subSchemaEntry the subschema entry DN
50
	*/
51
	var $subSchemaEntry = '';
52
53
	/**
54
	* @var array $supportedObjectClasses the supported objectclasses
55
	*/
56
	var $supportedObjectClasses = array();
57
58
	/**
59
	* @var array $supportedOIDs the supported OIDs
60
	*/
61
	var $supportedOIDs = array();
62
63
	/**
64
	 * Name of host
65
	 *
66
	 * @var string
67
	 */
68
	var $host;
69
70
	/**
71
	 * Constructor
72
	 *
73
	 * @param string $host
74
	 */
75
	function __construct($host)
76
	{
77
		$this->host = $host;
78
	}
79
80
	/**
81
	* gets the version
82
	*
83
	* @return integer the supported ldap version
84
	*/
85
	function getVersion()
86
	{
87
		return $this->version;
88
	}
89
90
	/**
91
	* sets the namingcontexts
92
	*
93
	* @param array $_namingContext the supported namingcontexts
94
	*/
95
	function setNamingContexts($_namingContext)
96
	{
97
		$this->namingContext = $_namingContext;
98
	}
99
100
	/**
101
	* sets the type of the ldap server(OpenLDAP, ADS, NDS, ...)
102
	*
103
	* @param integer $_serverType the type of ldap server
104
	*/
105
	function setServerType($_serverType)
106
	{
107
		$this->serverType = $_serverType;
108
	}
109
110
	/**
111
	* sets the DN for the subschema entry
112
	*
113
	* @param string $_subSchemaEntry the subschema entry DN
114
	*/
115
	function setSubSchemaEntry($_subSchemaEntry)
116
	{
117
		$this->subSchemaEntry = $_subSchemaEntry;
118
	}
119
120
	/**
121
	* sets the supported objectclasses
122
	*
123
	* @param array $_supportedObjectClasses the supported objectclasses
124
	*/
125
	function setSupportedObjectClasses($_supportedObjectClasses)
126
	{
127
		$this->supportedOIDs = $_supportedObjectClasses;
128
		$this->supportedObjectClasses = array_flip($_supportedObjectClasses);
129
	}
130
131
	/**
132
	* sets the version
133
	*
134
	* @param integer $_version the supported ldap version
135
	*/
136
	function setVersion($_version)
137
	{
138
		$this->version = $_version;
139
	}
140
141
	/**
142
	* checks for supported objectclasses
143
	*
144
	* @return bool returns true if the ldap server supports this objectclass
145
	*/
146
	function supportsObjectClass($_objectClass)
147
	{
148
		if($this->supportedObjectClasses[strtolower($_objectClass)])
149
		{
150
			return true;
151
		}
152
		return false;
153
	}
154
155
	/**
156
	 * Query given ldap connection for available information
157
	 *
158
	 * @param resource $ds
159
	 * @param string $host
160
	 * @param int $version 2 or 3
161
	 * @return ldapserverinfo
0 ignored issues
show
The type EGroupware\Api\Ldap\ldapserverinfo was not found. Maybe you did not declare it correctly or list all dependencies?

The issue could also be caused by a filter entry in the build configuration. If the path has been excluded in your configuration, e.g. excluded_paths: ["lib/*"], you can move it to the dependency path list as follows:

filter:
    dependency_paths: ["lib/*"]

For further information see https://scrutinizer-ci.com/docs/tools/php/php-scrutinizer/#list-dependency-paths

Loading history...
162
	 */
163
	public static function get($ds, $host, $version=3)
164
	{
165
		$filter='(objectclass=*)';
166
		$justthese = array('structuralObjectClass','namingContexts','supportedLDAPVersion','subschemaSubentry','vendorname');
167
		if(($sr = @ldap_read($ds, '', $filter, $justthese)))
168
		{
169
			if(($info = ldap_get_entries($ds, $sr)))
170
			{
171
				$ldapServerInfo = new ServerInfo($host);
172
				$ldapServerInfo->setVersion($version);
173
174
				// check for naming contexts
175
				if($info[0]['namingcontexts'])
176
				{
177
					for($i=0; $i<$info[0]['namingcontexts']['count']; $i++)
178
					{
179
						$namingcontexts[] = $info[0]['namingcontexts'][$i];
180
					}
181
					$ldapServerInfo->setNamingContexts($namingcontexts);
182
				}
183
184
				// check for ldap server type
185
				if($info[0]['structuralobjectclass'])
186
				{
187
					switch($info[0]['structuralobjectclass'][0])
188
					{
189
						case 'OpenLDAProotDSE':
190
							$ldapServerType = self::OPENLDAP;
191
							break;
192
						default:
193
							$ldapServerType = self::UNKNOWN;
194
							break;
195
					}
196
					$ldapServerInfo->setServerType($ldapServerType);
197
				}
198
				if ($info[0]['vendorname'] && stripos($info[0]['vendorname'][0], 'samba') !== false)
199
				{
200
					$ldapServerInfo->setServerType(self::SAMBA4);
201
				}
202
203
				// check for subschema entry dn
204
				if($info[0]['subschemasubentry'])
205
				{
206
					$subschemasubentry = $info[0]['subschemasubentry'][0];
207
					$ldapServerInfo->setSubSchemaEntry($subschemasubentry);
208
				}
209
210
				// create list of supported objetclasses
211
				if(!empty($subschemasubentry))
212
				{
213
					$filter='(objectclass=*)';
214
					$justthese = array('objectClasses');
215
216
					if(($sr = ldap_read($ds, $subschemasubentry, $filter, $justthese)))
217
					{
218
						if(($info = ldap_get_entries($ds, $sr)))
219
						{
220
							if($info[0]['objectclasses']) {
221
								for($i=0; $i<$info[0]['objectclasses']['count']; $i++)
222
								{
223
									$matches = null;
224
									if(preg_match('/^\( (.*) NAME \'(\w*)\' /', $info[0]['objectclasses'][$i], $matches))
225
									{
226
										#_debug_array($matches);
227
										if(count($matches) == 3)
228
										{
229
											$supportedObjectClasses[$matches[1]] = strtolower($matches[2]);
230
										}
231
									}
232
								}
233
								$ldapServerInfo->setSupportedObjectClasses($supportedObjectClasses);
234
							}
235
						}
236
					}
237
				}
238
			}
239
		}
240
		return $ldapServerInfo;
241
	}
242
}
243