Projet

Général

Profil

Paste
Télécharger (37,8 ko) Statistiques
| Branche: | Révision:

root / drupal7 / sites / all / modules / ldap / ldap_servers / ldap_servers.module @ bc175c27

1
<?php
2

    
3
/**
4
 * @file
5
 */
6

    
7
define('LDAP_SERVER_LDAP_QUERY_CHUNK', 50);
8
define('LDAP_SERVERS_MAXFILTER_ORS', 30);
9
define('LDAP_SERVER_LDAP_QUERY_RECURSION_LIMIT', 10);
10

    
11
define('LDAP_SCOPE_BASE', 1);
12
define('LDAP_SCOPE_ONELEVEL', 2);
13
define('LDAP_SCOPE_SUBTREE', 3);
14

    
15
define('LDAP_TEST_QUERY_CONTEXT', 999);
16

    
17
define('LDAP_SERVERS_PROJECT_TAG', 'ldap');
18
define('LDAP_SERVERS_MENU_BASE_PATH', 'admin/config/people/ldap');
19
define('LDAP_SERVERS_INDEX_BASE_PATH', 'admin/config/people/ldap/servers');
20
define('LDAP_SERVERS_MENU_BASE_PATH_PARTS', 4); // for argument offsets
21
define('LDAP_SERVERS_DRUPAL_HELP_URL', 'http://drupal.org/node/997082');
22

    
23
define('LDAP_SERVERS_TOKEN_PRE', '[');
24
define('LDAP_SERVERS_TOKEN_POST', ']');
25
define('LDAP_SERVERS_TOKEN_DEL', ':');
26
define('LDAP_SERVERS_TOKEN_MODIFIER_DEL', ';');
27

    
28
define('LDAP_SERVERS_ENC_TYPE_MD5', 1);
29
define('LDAP_SERVERS_ENC_TYPE_CRYPT', 2);
30
define('LDAP_SERVERS_ENC_TYPE_SALTED_CRYPT', 3);
31
define('LDAP_SERVERS_ENC_TYPE_EXTENDED_DES', 4);
32
define('LDAP_SERVERS_ENC_TYPE_MD5C', 5);
33
define('LDAP_SERVERS_ENC_TYPE_BLOWFISH', 6);
34
define('LDAP_SERVERS_ENC_TYPE_SALTED_MD5', 7);
35
define('LDAP_SERVERS_ENC_TYPE_SHA', 8);
36
define('LDAP_SERVERS_ENC_TYPE_SALTED_SHA', 9);
37
define('LDAP_SERVERS_ENC_TYPE_CLEARTEXT', 10);
38

    
39
define('LDAP_SERVERS_CYPHER_MODE', 'cfb');
40

    
41
define('LDAP_SERVERS_BIND_METHOD_SERVICE_ACCT', 1);
42
define('LDAP_SERVERS_BIND_METHOD_USER', 2);
43
define('LDAP_SERVERS_BIND_METHOD_ANON', 3);
44
define('LDAP_SERVERS_BIND_METHOD_ANON_USER', 4);
45
define('LDAP_SERVERS_BIND_METHOD_DEFAULT', 1);
46

    
47
define('LDAP_SERVERS_DERIVE_GROUP_FROM_DN', 1);
48
define('LDAP_SERVERS_DERIVE_GROUP_FROM_ATTRIBUTE', 2);
49
define('LDAP_SERVERS_DERIVE_GROUP_FROM_ENTRY', 4);
50

    
51
define('LDAP_SERVER_MASSAGE_DISPLAY', 1); //  ... value is being displayed in UI
52
define('LDAP_SERVER_MASSAGE_TOKEN_REPLACE', 2); // ... value is about to be used to generate token (e.g. [...] to be replaced
53

    
54
define('LDAP_SERVER_MASSAGE_QUERY_LDAP', 5); //  ...value is about to be used in ldap query
55
define('LDAP_SERVER_MASSAGE_QUERY_DB', 6); //  ...value is about to be in an sql query
56
define('LDAP_SERVER_MASSAGE_QUERY_ARRAY', 7); //  ...value is about to be found in array values
57
define('LDAP_SERVER_MASSAGE_QUERY_PROPERTY', 8); //  ...value is about to be found in object property values
58

    
59
define('LDAP_SERVER_MASSAGE_STORE_LDAP', 13); // ...value is about to be stored in ldap entry
60
define('LDAP_SERVER_MASSAGE_STORE_DB', 14); // ...value is about to be stored in db
61
define('LDAP_SERVER_MASSAGE_STORE_ARRAY', 15); // ...value is about to be stored in array
62
define('LDAP_SERVER_MASSAGE_STORE_PROPERTY', 16); // ...value is about to be stored in object property
63

    
64
define('LDAP_SERVER_GROUPS_RECURSE_DEPTH', 20);
65

    
66
define('LDAP_FAIL', -1);
67

    
68
define('LDAP_SUCCESS', 0x00);
69
define('LDAP_OPERATIONS_ERROR', 0x01);
70
define('LDAP_PROTOCOL_ERROR', 0x02);
71
define('LDAP_TIMELIMIT_EXCEEDED', 0x03);
72
define('LDAP_SIZELIMIT_EXCEEDED', 0x04);
73
define('LDAP_COMPARE_FALSE', 0x05);
74
define('LDAP_COMPARE_TRUE', 0x06);
75
define('LDAP_AUTH_METHOD_NOT_SUPPORTED', 0x07);
76
define('LDAP_STRONG_AUTH_REQUIRED', 0x08);
77
//NotusedinLDAPv3);
78
define('LDAP_PARTIAL_RESULTS', 0x09);
79

    
80
//Next5newinLDAPv3);
81
define('LDAP_REFERRAL', 0x0a);
82
define('LDAP_ADMINLIMIT_EXCEEDED', 0x0b);
83
define('LDAP_UNAVAILABLE_CRITICAL_EXTENSION', 0x0c);
84
define('LDAP_CONFIDENTIALITY_REQUIRED', 0x0d);
85
define('LDAP_SASL_BIND_INPROGRESS', 0x0e);
86

    
87
define('LDAP_NO_SUCH_ATTRIBUTE', 0x10);
88
define('LDAP_UNDEFINED_TYPE', 0x11);
89
define('LDAP_INAPPROPRIATE_MATCHING', 0x12);
90
define('LDAP_CONSTRAINT_VIOLATION', 0x13);
91
define('LDAP_TYPE_OR_VALUE_EXISTS', 0x14);
92
define('LDAP_INVALID_SYNTAX', 0x15);
93

    
94
define('LDAP_NO_SUCH_OBJECT', 0x20);
95
define('LDAP_ALIAS_PROBLEM', 0x21);
96
define('LDAP_INVALID_DN_SYNTAX', 0x22);
97

    
98
define('LDAP_IS_LEAF', 0x23);
99
define('LDAP_ALIAS_DEREF_PROBLEM', 0x24);
100
if ( ! defined('LDAP_DEREF_NEVER') )
101
  define('LDAP_DEREF_NEVER', 0x25);
102

    
103
define('LDAP_INAPPROPRIATE_AUTH', 0x30);
104
define('LDAP_INVALID_CREDENTIALS', 0x31);
105
define('LDAP_INSUFFICIENT_ACCESS', 0x32);
106
define('LDAP_BUSY', 0x33);
107
define('LDAP_UNAVAILABLE', 0x34);
108
define('LDAP_UNWILLING_TO_PERFORM', 0x35);
109
define('LDAP_LOOP_DETECT', 0x36);
110

    
111
define('LDAP_SORT_CONTROL_MISSING', 0x3C);
112
define('LDAP_INDEX_RANGE_ERROR', 0x3D);
113

    
114
define('LDAP_NAMING_VIOLATION', 0x40);
115
define('LDAP_OBJECT_CLASS_VIOLATION', 0x41);
116
define('LDAP_NOT_ALLOWED_ON_NONLEAF', 0x42);
117
define('LDAP_NOT_ALLOWED_ON_RDN', 0x43);
118
define('LDAP_ALREADY_EXISTS', 0x44);
119
define('LDAP_NO_OBJECT_CLASS_MODS', 0x45);
120
define('LDAP_RESULTS_TOO_LARGE', 0x46);
121
//NexttwoforLDAPv3);
122
define('LDAP_AFFECTS_MULTIPLE_DSAS', 0x47);
123
define('LDAP_OTHER', 0x50);
124

    
125
//UsedbysomeAPIs);
126
define('LDAP_SERVER_DOWN', 0x51);
127
define('LDAP_LOCAL_ERROR', 0x52);
128
define('LDAP_ENCODING_ERROR', 0x53);
129
define('LDAP_DECODING_ERROR', 0x54);
130
define('LDAP_TIMEOUT', 0x55);
131
define('LDAP_AUTH_UNKNOWN', 0x56);
132
define('LDAP_FILTER_ERROR', 0x57);
133
define('LDAP_USER_CANCELLED', 0x58);
134
define('LDAP_PARAM_ERROR', 0x59);
135
define('LDAP_NO_MEMORY', 0x5a);
136

    
137
//PreliminaryLDAPv3codes);
138
define('LDAP_CONNECT_ERROR', 0x5b);
139
define('LDAP_NOT_SUPPORTED', 0x5c);
140
define('LDAP_CONTROL_NOT_FOUND', 0x5d);
141
define('LDAP_NO_RESULTS_RETURNED', 0x5e);
142
define('LDAP_MORE_RESULTS_TO_RETURN', 0x5f);
143
define('LDAP_CLIENT_LOOP', 0x60);
144
define('LDAP_REFERRAL_LIMIT_EXCEEDED', 0x61);
145

    
146
module_load_include('inc', 'ldap_servers', 'ldap_servers.functions');
147
module_load_include('inc', 'ldap_servers', 'ldap_servers.tokens');
148

    
149
/**
150
 * Implements hook_init().
151
 */
152
function ldap_servers_init() {
153
  if (strpos(current_path(), 'admin/config/people/ldap') === 0) {
154
    drupal_add_css(drupal_get_path('module', 'ldap_servers') . '/ldap_servers.admin.css', 'module');
155
  }
156
}
157

    
158
/**
159
 * Advertise the current ldap api version
160
 */
161
function ldap_api_version() {
162
  return '2.0';
163
}
164

    
165
function ldap_servers_menu() {
166
  $menu_offset = 4;
167

    
168
  $items['admin/config/people/ldap'] = array(
169
    'title' => 'LDAP Configuration',
170
    'description' => 'LDAP authentication, authorization, provisioning, etc.',
171
    'page callback' => 'drupal_get_form',
172
    'page arguments' => array('ldap_servers_settings'),
173
    'access arguments' => array('administer site configuration'),
174
    'file' => 'ldap_servers.settings.inc',
175
  );
176

    
177
  $items['admin/config/people/ldap/settings'] = array(
178
    'title' => '1. Settings',
179
    'weight' => -2,
180
    'type' => MENU_DEFAULT_LOCAL_TASK,
181
  );
182

    
183
  $items['admin/config/people/ldap/servers'] = array(
184
    'title' => '2. Servers',
185
    'page callback' => 'ldap_servers_edit_index',
186
    'weight' => -1,
187
    'type' => MENU_LOCAL_TASK,
188
    'access arguments' => array('administer site configuration'),
189
    'file' => 'ldap_servers.admin.inc',
190
  );
191

    
192
  $items['admin/config/people/ldap/servers/list'] = array(
193
    'title' => 'List',
194
    'type' => MENU_DEFAULT_LOCAL_TASK,
195
  );
196

    
197
  $items['admin/config/people/ldap/servers/add'] = array(
198
    'title' => 'Add LDAP Server Configuration',
199
    'page callback' => 'drupal_get_form',
200
    'page arguments' => array('ldap_servers_admin_form', 'add'),
201
    'type' => MENU_LOCAL_TASK + MENU_CONTEXT_INLINE,
202
    'weight' => 3,
203
    'access arguments' => array('administer site configuration'),
204
    'file' => 'ldap_servers.admin.inc',
205
  );
206

    
207
  $items['admin/config/people/ldap/servers/edit/%'] = array(
208
    'title' => 'Edit LDAP Server Configuration',
209
    'page callback' => 'drupal_get_form',
210
    'page arguments' => array('ldap_servers_admin_form', 'edit', $menu_offset + 2),
211
    'access arguments' => array('administer site configuration'),
212
    'file' => 'ldap_servers.admin.inc',
213
  );
214

    
215
  $items['admin/config/people/ldap/servers/test/%'] = array(
216
    'title' => 'Test LDAP Server Configuration',
217
    'page callback' => 'drupal_get_form',
218
    'page arguments' => array('ldap_servers_test_form', $menu_offset + 1, $menu_offset + 2),
219
    'access arguments' => array('administer site configuration'),
220
    'file' => 'ldap_servers.test_form.inc',
221
  );
222

    
223
  $items['admin/config/people/ldap/servers/delete/%'] = array(
224
    'title' => 'Delete LDAP Server',
225
    'page callback' => 'drupal_get_form',
226
    'page arguments' => array('ldap_servers_admin_delete', $menu_offset + 1, $menu_offset + 2),
227
    'access arguments' => array('administer site configuration'),
228
    'file' => 'ldap_servers.admin.inc',
229
  );
230

    
231
  $items['admin/config/people/ldap/servers/enable/%'] = array(
232
    'title' => 'Enable LDAP Server',
233
    'page callback' => 'drupal_get_form',
234
    'page arguments' => array('ldap_servers_admin_enable_disable', $menu_offset + 1, $menu_offset + 2),
235
    'access arguments' => array('administer site configuration'),
236
    'file' => 'ldap_servers.admin.inc',
237
  );
238

    
239
  $items['admin/config/people/ldap/servers/disable/%'] = array(
240
    'title' => 'Enable LDAP Server',
241
    'page callback' => 'drupal_get_form',
242
    'page arguments' => array('ldap_servers_admin_enable_disable', $menu_offset + 1, $menu_offset + 2),
243
    'access arguments' => array('administer site configuration'),
244
    'file' => 'ldap_servers.admin.inc',
245
  );
246

    
247
  return $items;
248
}
249

    
250

    
251
/**
252
 * Implements hook_theme().
253
 */
254
function ldap_servers_theme() {
255
  return array(
256
    'ldap_servers_list' => array(
257
      'variables' => array('ldap_servers' => NULL, 'actions' => TRUE, 'type' => 'table'),
258
      'render element' => 'element',
259
      'file' => 'ldap_servers.theme.inc'
260
    ),
261
    'ldap_servers_server' => array(
262
      'variables' => array('ldap_server' => NULL, 'actions' => FALSE, 'type' => 'detail'),
263
      'render element' => 'element',
264
      'file' => 'ldap_servers.theme.inc'
265
    ),
266
    'ldap_server_token_table' => array(
267
      'variables' => array('tokens' => array()),
268
      'render element' => 'element',
269
      'file' => 'ldap_servers.theme.inc'
270
    ),
271
    'ldap_server_ldap_entry_table' => array(
272
      'variables' => array('entry' => array()),
273
      'render element' => 'element',
274
      'file' => 'ldap_servers.theme.inc'
275
    ),
276
  );
277
}
278

    
279

    
280
  /**
281
    * Implements hook_cron().
282
    */
283
  function ldap_servers_cron() {
284
    // if any modules implement hook_ldap_servers_user_cron().
285
    // user entity query to find most recent 100 entries that have not been processed
286
    // query for these and pass to modules implementing hook_ldap_server_maintenance()
287
    // update user field to have current date as date most recently checked
288
  }
289

    
290
  /** get mixed case match from case insensitive search
291
   *
292
   * @param string mixed case $key
293
   * @param array mixed case $array
294
   * @return string matching key in mixed case or FALSE
295
   */
296
  function ldap_server_find_key($key, $array) {
297
    $keys = array_combine(array_change_key_case($array), $array);
298
    if (isset($keys[drupal_strtolower($key)])) {
299
      return $keys[drupal_strtolower($key)];
300
    }
301
    else {
302
      return FALSE;
303
    }
304
  }
305

    
306
  /**
307
   * Implements hook_ldap_attributes_needed_alter().
308
   */
309
  function ldap_servers_ldap_attributes_needed_alter(&$attributes, $params) {
310

    
311
    $attributes['dn'] = ldap_servers_set_attribute_map(@$attributes['dn'], 'ldap_dn'); // force this data type
312

    
313
    if ($params['sid'] && $params['sid']) { // puid attributes are server specific
314
      if (is_scalar($params['sid'])) {
315
        $ldap_server = ldap_servers_get_servers($params['sid'], 'enabled', TRUE);
316
      }
317
      else {
318
        $ldap_server = $params['sid'];
319
      }
320
      // mail, unique_persistent_attr, user_attr, mail_template, and user_dn_expression are needed for all functionality
321
      if (!isset($attributes[$ldap_server->mail_attr])) {
322
        $attributes[$ldap_server->mail_attr] = ldap_servers_set_attribute_map();
323
      }
324
      if ($ldap_server->picture_attr && !isset($attributes[$ldap_server->picture_attr])) {
325
        $attributes[$ldap_server->picture_attr] = ldap_servers_set_attribute_map();
326
      }
327
      if ($ldap_server->unique_persistent_attr && !isset($attributes[$ldap_server->unique_persistent_attr])) {
328
        $attributes[$ldap_server->unique_persistent_attr] = ldap_servers_set_attribute_map();
329
      }
330
      if ($ldap_server->groupUserMembershipsAttr && !isset($attributes[$ldap_server->groupUserMembershipsAttr])) {
331
        $attributes[$ldap_server->groupUserMembershipsAttr] = ldap_servers_set_attribute_map();
332
      }
333
      if ($ldap_server->user_dn_expression) {
334
        ldap_servers_token_extract_attributes($attributes, $ldap_server->user_dn_expression, TRUE);
335
      }
336
      if ($ldap_server->mail_template) {
337
        ldap_servers_token_extract_attributes($attributes, $ldap_server->mail_template);
338
      }
339
      if (!isset($attributes[$ldap_server->user_attr])) {
340
        $attributes[$ldap_server->user_attr] = ldap_servers_set_attribute_map();
341
      }
342
    }
343
  }
344

    
345

    
346
/**
347
 * Implements hook_ldap_user_attrs_list_alter().
348
 */
349

    
350
function ldap_servers_ldap_user_attrs_list_alter(&$available_user_attrs, &$params) {
351

    
352
  if (isset($params['ldap_server']) && $params['ldap_server']) {
353
    $ldap_server = $params['ldap_server'];
354
  }
355
  else {
356
    return; // without a server id, ldap_servers module has nothing to offer
357
  }
358
  $ldap_user_conf  = $params['ldap_user_conf'];
359
  $direction = $params['direction'];
360

    
361
  $tokens = array(
362
    '!edit_link' => l($ldap_server->editPath, $ldap_server->editPath),
363
    '!sid' => $ldap_server->sid,
364
  );
365

    
366
  $server_edit_path = 'admin/config/people/ldap/servers/edit/' . $ldap_server->sid;
367

    
368
  if ($direction == LDAP_USER_PROV_DIRECTION_TO_DRUPAL_USER) {
369

    
370
    /** these 4 user fields indentify where in ldap and which ldap server they are associated with.
371
     they are required for a Drupal account to be "ldap associated" regardless of if any other
372
     fields/properties are provisioned or synched
373
    */
374

    
375
    if ($ldap_server->unique_persistent_attr) {
376
      foreach (array(
377
        'field.ldap_user_puid_sid',
378
        'field.ldap_user_puid',
379
        'field.ldap_user_puid_property',
380
        ) as $i => $property_id) {
381
        $property_token = '[' . $property_id . ']';
382
        if (!isset($available_user_attrs[$property_token]) || !is_array($available_user_attrs[$property_token])) {
383
          $available_user_attrs[$property_token] = array();
384
        }
385
      }
386

    
387
      $available_user_attrs['[field.ldap_user_puid_sid]'] = array(
388
        'name' => t('Field: sid providing PUID'),
389
        'configurable_to_drupal' => 0,
390
        'configurable_to_ldap' => 1,
391
        'source' => t('!sid', $tokens),
392
        'notes' => 'not configurable',
393
        'direction' => LDAP_USER_PROV_DIRECTION_TO_DRUPAL_USER,
394
        'enabled' => TRUE,
395
        'prov_events' => array(LDAP_USER_EVENT_CREATE_DRUPAL_USER),
396
        'config_module' => 'ldap_servers',
397
        'prov_module' => 'ldap_user',
398
      ) + $available_user_attrs['[field.ldap_user_puid_sid]'];
399

    
400
      $available_user_attrs['[field.ldap_user_puid]'] = array(
401
        'name' => t('Field: PUID', $tokens),
402
        'configurable_to_drupal' => 0,
403
        'configurable_to_ldap' => 1,
404
        'source' => '[' . $ldap_server->unique_persistent_attr . ']',
405
        'notes' => 'configure at ' . $server_edit_path,
406
        'convert' => $ldap_server->unique_persistent_attr_binary,
407
        'direction' => LDAP_USER_PROV_DIRECTION_TO_DRUPAL_USER,
408
        'enabled' => TRUE,
409
        'prov_events' => array(LDAP_USER_EVENT_CREATE_DRUPAL_USER),
410
        'config_module' => 'ldap_servers',
411
        'prov_module' => 'ldap_user',
412
      ) + $available_user_attrs['[field.ldap_user_puid]'];
413

    
414
      $available_user_attrs['[field.ldap_user_puid_property]'] =
415
      array(
416
        'name' => t('Field: PUID Attribute', $tokens),
417
        'configurable_to_drupal' => 0,
418
        'configurable_to_ldap' => 1,
419
        'source' => $ldap_server->unique_persistent_attr ,
420
        'notes' => 'configure at ' . $server_edit_path,
421
        'direction' => LDAP_USER_PROV_DIRECTION_TO_DRUPAL_USER,
422
        'enabled' => TRUE,
423
        'prov_events' => array(LDAP_USER_EVENT_CREATE_DRUPAL_USER),
424
        'config_module' => 'ldap_servers',
425
        'prov_module' => 'ldap_user',
426
      ) + $available_user_attrs['[field.ldap_user_puid_property]'];
427
    }
428

    
429
    $token = '[field.ldap_user_current_dn]';
430
    if (!isset($available_user_attrs[$token]) || !is_array($available_user_attrs[$token])) {
431
      $available_user_attrs[$token] = array();
432
    }
433
    $available_user_attrs[$token] =
434
    array(
435
      'name' => t('Field: Most Recent DN', $tokens),
436
      'configurable_to_drupal' => 0,
437
      'configurable_to_ldap' => 0,
438
      'source' => '[dn]',
439
      'notes' => 'not configurable',
440
      'direction' => LDAP_USER_PROV_DIRECTION_TO_DRUPAL_USER,
441
      'enabled' => TRUE,
442
      'prov_events' => array(LDAP_USER_EVENT_CREATE_DRUPAL_USER, LDAP_USER_EVENT_SYNCH_TO_DRUPAL_USER),
443
      'config_module' => 'ldap_servers',
444
      'prov_module' => 'ldap_user',
445
    ) + $available_user_attrs[$token];
446

    
447
    if ($ldap_user_conf->provisionsDrupalAccountsFromLdap) {
448
      if (!isset($available_user_attrs['[property.name]']) || !is_array($available_user_attrs['[property.name]'])) {
449
        $available_user_attrs['[property.name]'] = array();
450
      }
451
      $available_user_attrs['[property.name]'] = array(
452
        'name' => 'Property: Username',
453
        'source' => '[' . $ldap_server->user_attr . ']',
454
        'direction' => LDAP_USER_PROV_DIRECTION_TO_DRUPAL_USER,
455
        'enabled' => TRUE,
456
        'prov_events' => array(LDAP_USER_EVENT_CREATE_DRUPAL_USER, LDAP_USER_EVENT_SYNCH_TO_DRUPAL_USER),
457
        'config_module' => 'ldap_servers',
458
        'prov_module' => 'ldap_user',
459
      ) + $available_user_attrs['[property.name]'];
460

    
461
      if (!isset($available_user_attrs['[property.mail]']) || !is_array($available_user_attrs['[property.mail]'])) {
462
        $available_user_attrs['[property.mail]'] = array();
463
      }
464
      $available_user_attrs['[property.mail]'] = array(
465
        'name' => 'Property: Email',
466
        'source' => ($ldap_server->mail_template) ? $ldap_server->mail_template : '[' . $ldap_server->mail_attr . ']',
467
        'direction' => LDAP_USER_PROV_DIRECTION_TO_DRUPAL_USER,
468
        'enabled' => TRUE,
469
        'prov_events' => array(LDAP_USER_EVENT_CREATE_DRUPAL_USER, LDAP_USER_EVENT_SYNCH_TO_DRUPAL_USER),
470
        'config_module' => 'ldap_servers',
471
        'prov_module' => 'ldap_user',
472
      ) + $available_user_attrs['[property.mail]'];
473

    
474
      if ($ldap_server->picture_attr) {
475
        if (!isset($available_user_attrs['[property.picture]']) || !is_array($available_user_attrs['[property.picture]'])) {
476
          $available_user_attrs['[property.picture]'] = array();
477
        }
478
        $available_user_attrs['[property.picture]'] = array(
479
            'name' => 'Property: Picture',
480
            'source' => '[' . $ldap_server->picture_attr . ']',
481
            'direction' => LDAP_USER_PROV_DIRECTION_TO_DRUPAL_USER,
482
            'enabled' => TRUE,
483
            'prov_events' => array(LDAP_USER_EVENT_CREATE_DRUPAL_USER, LDAP_USER_EVENT_SYNCH_TO_DRUPAL_USER),
484
            'config_module' => 'ldap_servers',
485
            'prov_module' => 'ldap_user',
486
        ) + $available_user_attrs['[property.picture]'];
487
      }
488
    }
489
  }
490
}
491

    
492
/**
493
 * flush server static cache
494
 */
495

    
496
function ldap_servers_flush_server_cache() {
497
  $discard = ldap_servers_get_servers(NULL, 'all', FALSE, TRUE); // flush server cache
498
}
499

    
500

    
501
/**
502
 * function to replace module_load_include such that when
503
 * something is not included, drupal will exit instead
504
 * of attempting something half baked.
505
 */
506
function ldap_servers_module_load_include($type, $module, $name = NULL) {
507
  $result = module_load_include($type, $module, $name);
508
  if ($result === FALSE) {
509
    print "Failed to load file $name.$type in module $module";
510
    drupal_exit();
511
  }
512
}
513

    
514
/**
515
 *
516
 * return ldap server conf objects
517
 *
518
 * @param alphanum $sid
519
 * @param enum $type 'all', 'enabled',
520
 * @param boolean $flatten signifies if array or single object returned.  Only works if sid is specified
521
 * @param boolean $reset do not use cached or static result
522
 * @return - array of server conf object keyed on sid
523
 *         - single server conf object (if flatten == TRUE)
524
 */
525
function ldap_servers_get_servers($sid = NULL, $type = NULL, $flatten = FALSE, $reset = FALSE) {
526
  if (variable_get('ldap_simpletest', FALSE)) {
527
    return _ldap_servers_get_simpletest_servers($sid, $type, $flatten, $reset);
528
  }
529
  else {
530
    return _ldap_servers_get_servers($sid, $type, $flatten, $reset);
531
  }
532
}
533

    
534

    
535
/**
536
 * see ldap_servers_get_servers()
537
 */
538
function _ldap_servers_get_servers($sid, $type, $flatten, $reset) {
539
  ldap_servers_module_load_include('php', 'ldap_servers', 'LdapServerAdmin.class');
540
  static $servers;
541
  $type = ($type) ? $type : 'all';
542
  if ($reset) {
543
    $servers = array();
544
  }
545
  if (!isset($servers['all'])) {
546
    $servers['all'] = LdapServerAdmin::getLdapServerObjects('all', NULL, 'LdapServer', $reset);
547
  }
548

    
549
  if (!isset($servers['enabled'])) {
550
    $servers['enabled'] = array();
551
    foreach ($servers['all'] as $_sid => $ldap_server) {
552
      if ($ldap_server->status == 1) {
553
        $servers['enabled'][$_sid] = $ldap_server;
554
      }
555
    }
556
  }
557

    
558
  if ($sid) {
559
    if (!isset($servers[$type][$sid])) {
560
      return FALSE;
561
    }
562
    return ($flatten) ? $servers[$type][$sid] : array($sid => $servers[$type][$sid]);
563
  }
564

    
565
  if (isset($servers[$type])) {
566
    return $servers[$type];
567
  }
568
}
569

    
570
/**
571
 * see ldap_servers_get_servers()
572
 */
573
function _ldap_servers_get_simpletest_servers($sid, $type = NULL, $flatten, $reset = TRUE) {
574

    
575
  if (!$type) {
576
    $type = 'all';
577
  }
578

    
579
  //two flavors of mock servers exist.  ultimately v2 will be used in all simpletests
580
  if (variable_get('ldap_simpletest', 0) == 2) {
581
    ldap_servers_module_load_include('php', 'ldap_test', 'LdapServerTest.class');
582
    $servers['all'] = LdapServerTest::getLdapServerObjects(NULL, 'all', FALSE);
583
    foreach ($servers['all'] as $_sid => $ldap_server) {
584
      if ($ldap_server->status == 1) {
585
        $servers['enabled'][$_sid] = $ldap_server;
586
      }
587
    }
588
  }
589

    
590
  if ($sid) {
591
    if (!isset($servers[$type][$sid])) {
592
      return FALSE;
593
    }
594
    return ($flatten) ? $servers[$type][$sid] : array($sid => $servers[$type][$sid]);
595
  }
596

    
597
  if (isset($servers[$type])) {
598
    return $servers[$type];
599
  }
600
}
601
function ldap_servers_debug($variable) {
602
  if (variable_get('ldap_simpletest', FALSE) && function_exists('dpm')) {
603
    dpm($variable);
604
  }
605
  else {
606
    debug($variable);
607
  }
608
}
609
function ldap_servers_cache_clear() {
610
  $discard = ldap_servers_get_servers(NULL, 'all', FALSE, TRUE);
611
  if (module_exists('ctools')) {
612
    ctools_export_load_object_reset('ldap_servers');
613
  }
614
}
615

    
616
/**
617
 * function to convert microsoft style guids to strings
618
 */
619
function ldap_servers_msguid($value) {
620

    
621
  $hex_string = bin2hex($value);
622
  // (MS?) GUID are displayed with first three GUID parts as "big endian"
623
  // Doing this so String value matches what other LDAP tool displays for AD.
624
  $value = strtoupper(substr( $hex_string, 6, 2) . substr( $hex_string, 4, 2) .
625
  substr( $hex_string, 2, 2) . substr( $hex_string, 0, 2) . '-' .
626
  substr( $hex_string, 10, 2) . substr( $hex_string, 8, 2) . '-' .
627
  substr( $hex_string, 14, 2) . substr( $hex_string, 12, 2) . '-' .
628
  substr( $hex_string, 16, 4) . '-' . substr( $hex_string, 20, 12));
629

    
630
  return $value;
631
}
632

    
633
 /**
634
 * Create a "binary safe" string for use in LDAP filters
635
 * @param $value
636
 * @return string
637
 */
638
function ldap_servers_binary_filter($value) {
639
  $match = '';
640
  if (preg_match('/^[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12}$/i', $value)) {
641
    // Reconstruct proper "memory" order from (MS?) GUID string.
642
    $hex_string = str_replace('-', '', $value);
643
    $value = substr($hex_string, 6, 2) . substr($hex_string, 4, 2) .
644
      substr($hex_string, 2, 2) . substr($hex_string, 0, 2) .
645
      substr($hex_string, 10, 2) . substr($hex_string, 8, 2) .
646
      substr($hex_string, 14, 2) . substr($hex_string, 12, 2) .
647
      substr($hex_string, 16, 4) . substr($hex_string, 20, 12);
648
  }
649

    
650
  for ($i = 0; $i < strlen($value); $i = $i + 2 ) {
651
    $match .= '\\' . substr($value, $i, 2);
652
  }
653

    
654
  return $match;
655
}
656

    
657
/**
658
 * general binary conversion function for guids
659
 * tries to determine which approach based on length
660
 * of string
661
 */
662
function ldap_servers_binary($value) {
663
  if (strlen($value) == 16) {
664
    $value = ldap_servers_msguid($value);
665
  }
666
  else {
667
    $value = bin2hex($value);
668
  }
669
  return $value;
670
}
671

    
672
/**
673
 * @todo needs caching element.  several modules could potentially call this in the same
674
 * page request.
675
 *
676
 * @param std object $drupal_user is drupal $user object
677
 * @param string $sid is a server id
678
 * @param scalar $ldap_context
679
 */
680

    
681
function ldap_servers_get_user_ldap_data($drupal_user, $sid = NULL, $ldap_context = NULL) {
682
  if (is_object($drupal_user) && property_exists($drupal_user, 'uid') &&
683
      function_exists('ldap_user_get_authname') && ($authname = ldap_user_get_authname($drupal_user))) {
684
    $drupal_username = $authname;
685
  }
686
  else {
687
    $drupal_username = (is_object($drupal_user)) ? $drupal_user->name : $drupal_user;
688
  }
689
  //Sometimes we have username instead of a drupal user object
690
  //For example, when using LDAP user test form (admin/config/people/ldap/user/test)
691
  //But we can still load the user by using $drupal_username  if $drupal_user is not an object
692
  if ( !(is_object($drupal_user)) ) {
693
    $user_object = user_load_by_name($drupal_username);
694
    if (is_object($user_object) && property_exists($user_object, 'uid')) {
695
      $drupal_user = $user_object;
696
    }
697
  }
698
  // if no explicit $sid, find most appropriate one
699
  if (module_exists('ldap_user') && (!$sid || $sid == LDAP_USER_AUTH_SERVER_SID)) {
700
    if (property_exists($drupal_user, 'ldap_user_puid_sid') &&
701
        !empty($drupal_user->ldap_user_puid_sid[LANGUAGE_NONE][0]['value'])
702
      ) {
703
      $sid = $drupal_user->ldap_user_puid_sid[LANGUAGE_NONE][0]['value'];
704
    }
705
    else {
706
      $ldap_user_conf = ldap_user_conf();
707
      ldap_user_reset_provision_server($ldap_user_conf, $drupal_user);
708
      $sid = $ldap_user_conf->drupalAcctProvisionServer;
709
    }
710
  }
711
  elseif (!$sid) {
712
    $ldap_servers = ldap_servers_get_servers(NULL, 'enabled');
713
    if (count($ldap_servers) == 1) {
714
      $sids = array_keys($ldap_servers);
715
      $sid = $sids[0];
716
    }
717
  }
718

    
719
  $ldap_server = ($sid) ? ldap_servers_get_servers($sid, 'enabled', TRUE) : FALSE;
720

    
721
  if ($ldap_server === FALSE) {
722
    watchdog('ldap_servers', 'Failed to load server object %sid in _ldap_servers_get_user_ldap_data', array('%sid' => $sid), WATCHDOG_ERROR);
723
    return FALSE;
724
  }
725

    
726
  $ldap_user = $ldap_server->userUserNameToExistingLdapEntry($drupal_username, $ldap_context);
727

    
728
  if ($ldap_user) {
729
    $ldap_user['sid'] = $sid;
730
  }
731
  else {
732
    $ldap_user = FALSE;
733
  }
734

    
735
  return $ldap_user;
736
}
737

    
738
/**
739
 * @param array $attribute_map for a given attribute in form array('values' => array(), 'data_type' => NULL) as outlined in ldap_user/README.developers.txt
740
 * @param enum string $conversion as type of conversion to do @see ldap_servers_convert_attribute().  e.g. base64_encode, bin2hex, msguid, md5
741
 * @param array $values in form array(<ordinal> => <value> | NULL) where NULL indicates value is needed for provisioning or other operations.
742
 *
743
 * @return array $attribute_map with converted values.  If nothing passed in create empty array in proper structure.
744
 *   array('values' => array(
745
 *      0 => 'john',
746
 *      1 => 'johnny'
747
 *      )
748
 *   );
749
 ))
750
 */
751

    
752
function ldap_servers_set_attribute_map($attribute = NULL, $conversion = NULL, $values = NULL) {
753

    
754
  $attribute = (is_array($attribute)) ? $attribute : array();
755
  $attribute['conversion'] = $conversion;
756
  if (!$values && (!isset($attribute['values']) || !is_array($attribute['values']))) {
757
    $attribute['values'] = array(0 => NULL);
758
  }
759
  elseif (is_array($values)) { //merge into array overwriting ordinals
760
    foreach ($values as $ordinal => $value) {
761
      if ($conversion) {
762
        $value = ldap_servers_convert_attribute($value, $conversion);
763
      }
764
      $attribute['values'][(int)$ordinal] = $value;
765
    }
766
  }
767
  return $attribute;
768
}
769

    
770
/**
771
 * @param string $value as value to be converted
772
 * @param string $conversion such as base64_encode, bin2hex, msguid, md5
773
 * @return converted $value
774
 */
775
function ldap_servers_convert_attribute($value, $conversion = NULL) {
776

    
777
      if ($conversion) {
778

    
779
        switch ($conversion) {
780
          case 'base64_encode':
781
            $value = base64_encode($value);
782
            break;
783

    
784
          case 'bin2hex':
785
            $value = bin2hex($value);
786
            break;
787

    
788
          case 'msguid':
789
            $value = ldap_servers_msguid($value);
790
            break;
791

    
792
          case 'binary':
793
            $value = ldap_servers_binary($value);
794
            break;
795

    
796
          case 'md5':
797
            $value = '{md5}' . base64_encode(pack('H*', md5($value)));
798
            break;
799
        }
800

    
801
      }
802

    
803
  return $value;
804
}
805

    
806
function ldap_servers_ldap_extension_summary($op = 'data') {
807
  ldap_servers_module_load_include('inc', 'ldap_servers', 'ldap_servers.status');
808
  return _ldap_servers_ldap_extension_summary($op);
809
}
810

    
811
function ldap_servers_ldap_extension_loaded() {
812
  return extension_loaded('ldap');
813
}
814

    
815
function ldap_servers_encrypt($text, $encryption = NULL) {
816
  ldap_servers_module_load_include('inc', 'ldap_servers', 'ldap_servers.encryption');
817
  return _ldap_servers_encrypt($text, $encryption);
818
}
819

    
820
function ldap_servers_encrypt_types($category = 'all') {
821
  ldap_servers_module_load_include('inc', 'ldap_servers', 'ldap_servers.encryption');
822
  return _ldap_servers_encrypt_types($category);
823
}
824

    
825
function ldap_servers_decrypt($encrypted, $encryption = NULL) {
826
  ldap_servers_module_load_include('inc', 'ldap_servers', 'ldap_servers.encryption');
827
  return _ldap_servers_decrypt($encrypted, $encryption);
828
}
829

    
830
function ldap_servers_php_supports_pagination() {
831
  return (boolean)(function_exists('ldap_control_paged_result_response') && function_exists('ldap_control_paged_result'));
832
}
833

    
834

    
835
function ldap_servers_help($path, $arg) {
836

    
837
  $servers_help = '<p>' . t('LDAP Servers store "LDAP server configurations" so other modules can connect to them and leverage their data.') . ' ';
838
  $servers_help .= t('LDAP Authentication and LDAP Authorization are two such modules. Generally, only one LDAP Server configuration is needed.') . ' ' . '</p>';
839
  $servers_help .= '<p>' . t('When multiple LDAP server configurations are needed, each is not necessarily a separate physical LDAP server; they may have different binding users or some other configuration difference.') . ' </p>';
840

    
841
  switch ($path) {
842
    case 'admin/config/people/ldap/servers':
843
      return $servers_help;
844

    
845
   case 'admin/help#ldap_servers':
846
      $servers_help .= '<h3>' . t('Configuration - Settings') . '</h3>';
847
      $servers_help .= '<dl>';
848
      $servers_help .= '<dt>' . t('ENCRYPTION') . '</dt>';
849
      $servers_help .= '<dd>' . t('With encryption enabled, passwords will be stored in encrypted form. This is two way encryption because the actual password needs to used to bind to LDAP. So it offers minimal defense if someone gets in the filespace. It mainly helps avoid the accidental discovery of a clear text password.') . '</dd>';
850
      $servers_help .= '<dt>' . t('LOG DETAILED LDAP ACTIONS') . '</dt>';
851
      $servers_help .= '<dd>' . t('Enables LDAP logging to the Drupal Watchdog system') . '</dd>';
852
      $servers_help .= '</dl>';
853
      $servers_help .= '<h3>' . t('Configuration - Servers (List)') . '</h3>';
854
      $servers_help .= '<dl>';
855
      $servers_help .= '<dt>' . t('Configuration Table') . '</dt>';
856
      $servers_help .= '<dd>' . t('Provides a list of currently stored LDAP server configuratins.') . '</dd>';
857
      $servers_help .= '<h3>' . t('Configuration - Servers (Add LDAP Server Configuration)') . '</h3>';
858
      $servers_help .= '<dl>';
859
      $servers_help .= '<dt>' . t('CONNECTION SETTINGS') . '</dt>';
860
      $servers_help .= '<dd>' . t('Machine name -') . ' </dd>';
861
      $servers_help .= '<dd>' . t('Name -') . ' </dd>';
862
      $servers_help .= '<dd>' . t('Enabled -') . ' </dd>';
863
      $servers_help .= '<dd>' . t('LDAP Server Type') . ' </dd>';
864
      $servers_help .= '<dd>' . t('LDAP Server -') . ' </dd>';
865
      $servers_help .= '<dd>' . t('LDAP port -') . ' </dd>';
866
      $servers_help .= '<dd>' . t('Use Start-TLS -') . ' </dd>';
867
      $servers_help .= '<dd>' . t('Follow LDAP Referrals -') . ' </dd>';
868
      $servers_help .= '</dl>';
869
      $servers_help .= '<dl>';
870
      $servers_help .= '<dt>' . t('BINDING METHOD') . '</dt>';
871
      $servers_help .= '<dd>' . t('Binding Method for searches -') . ' </dd>';
872
      $servers_help .= '<dd>' . t('Service Account -') . ' </dd>';
873
      $servers_help .= '<dd>' . t('DN for non-anonymous search -') . ' </dd>';
874
      $servers_help .= '<dd>' . t('Password for non-anonymous search -') . ' </dd>';
875
      $servers_help .= '<dd>' . t('Clear existing password from database -') . ' </dd>';
876
      $servers_help .= '</dl>';
877
      $servers_help .= '<dl>';
878
      $servers_help .= '<dt>' . t('LDAP USER TO DRUPAL USER RELATIONSHIP') . '</dt>';
879
      $servers_help .= '<dd>' . t('Base DNs for LDAP Users, Groups, and Other Entries -') . ' </dd>';
880
      $servers_help .= '<dd>' . t('AuthName Attribute -') . ' </dd>';
881
      $servers_help .= '<dd>' . t('AccountName Attribute -') . ' </dd>';
882
      $servers_help .= '<dd>' . t('Email Attribute -') . ' </dd>';
883
      $servers_help .= '<dd>' . t('Email Template -') . ' </dd>';
884
      $servers_help .= '<dd>' . t('Persistant and Unique User ID Attribute -') . ' </dd>';
885
      $servers_help .= '<dd>' . t('Does PUID hold a binary value? -') . ' </dd>';
886
      $servers_help .= '<dd>' . t('Expression for User DN -') . ' </dd>';
887
      $servers_help .= '<dd>' . t('PHP to Transform Drupal Login Username to LDAP UserName Attribute -') . ' </dd>';
888
      $servers_help .= '<dd>' . t('Testing Drupal Username -') . ' </dd>';
889
      $servers_help .= '<dd>' . t('DN of Testing Username -') . ' </dd>';
890
      $servers_help .= '</dl>';
891
      return $servers_help;
892

    
893
    case 'admin/config/people/ldap/servers/add':
894
      $output = '<p>' . t('Setup an LDAP server configuration to be used by other modules such as LDAP Authentication, LDAP Authorization, etc.') . '</p>';
895
      $output .= '<p>' . t('More than one LDAP server configuration can exist for a physical LDAP server. Multiple configurations for the same physical ldap server are useful in cases such as: (1) different base dn\'s for authentication and authorization and (2) service accounts with different privileges for different purposes.') . '</p>';
896
      return $output;
897
  }
898
}
899

    
900

    
901
/**
902
 * @return list of ldap configuration classes and names
903
 */
904
function ldap_servers_ldap_servers_types() {
905

    
906
  $path = drupal_get_path('module', 'ldap_servers') . '/ldap_types';
907

    
908
  $types['default'] = array(
909
    'class' => t('LdapTypeDefault'),
910
    'directory_path' => $path,
911
    'name' => 'Default LDAP',
912
  );
913

    
914
  $types['ad'] = array(
915
    'class' => t('LdapTypeActiveDirectory'),
916
    'directory_path' => $path,
917
    'name' => 'Active Directory',
918
  );
919

    
920
  $types['novell_edir'] = array(
921
    'class' => t('LdapTypeNovell'),
922
    'directory_path' => $path,
923
    'name' => 'Novell',
924
  );
925

    
926
  $types['openldap'] = array(
927
    'class' => t('LdapTypeOpenLdap'),
928
    'directory_path' => $path,
929
    'name' => 'Open LDAP',
930
  );
931

    
932
  $types['opendir'] = array(
933
    'class' => t('LdapTypeOpenDirectory'),
934
    'directory_path' => $path,
935
    'name' => 'Apple Open Directory',
936
  );
937

    
938
  drupal_alter('ldap_servers_ldap_types', $types);
939
  return $types;
940

    
941
}
942

    
943
/**
944
 * @param string or array ldap type id or conf array
945
 * @return options for ldap type pulldown
946
 */
947
function ldap_servers_get_ldap_type_object($ldap_conf) {
948

    
949
  if (!is_array($ldap_conf)) {
950
    $ldap_confs = ldap_servers_ldap_servers_types();
951
    $ldap_conf = $ldap_confs[$ldap_conf];
952
  }
953

    
954
  require_once($ldap_conf['directory_path'] . '/' . $ldap_conf['class'] . 'class.php');
955
  $ldap_type_class = new $ldap_conf['class']();
956
  return $ldap_type_class;
957

    
958
}
959

    
960
/**
961
 * given a dn (such as cn=jdoe,ou=people)
962
 * and an rdn (such as cn)
963
 * determine that rdn value (such as jdoe)
964
 *
965
 * @param string $dn
966
 * @param string $rdn
967
 * @return string value of rdn
968
 */
969
function ldap_servers_get_first_rdn_value_from_dn($dn, $rdn) {
970
  $pairs = ldap_explode_dn($dn, 0); // escapes attribute values, need to be unescaped later
971
  $count = array_shift($pairs);
972
  $rdn = drupal_strtolower($rdn);
973
  $rdn_value = FALSE;
974
  foreach ($pairs as $p) {
975
    $pair = explode('=', $p);
976
    if (drupal_strtolower(trim($pair[0])) == $rdn) {
977
      $rdn_value = ldap_pear_unescape_dn_value(trim($pair[1]));
978
      break;
979
    }
980
  }
981
  return $rdn_value;
982
}
983

    
984
/**
985
 * given a dn (such as cn=jdoe,ou=people)
986
 * and an rdn (such as cn)
987
 * determine that rdn value (such as jdoe)
988
 *
989
 * @param string $dn
990
 * @param string $rdn
991
 * @return array of all values of rdn
992
 */
993
function ldap_servers_get_all_rdn_values_from_dn($dn, $rdn) {
994
  $pairs = ldap_explode_dn($dn, 0); // escapes attribute values, need to be unescaped later
995
  $count = array_shift($pairs);
996
  $rdn = drupal_strtolower($rdn);
997
  $rdn_values = array();
998
  foreach ($pairs as $p) {
999
    $pair = explode('=', $p);
1000
    if (drupal_strtolower(trim($pair[0])) == $rdn) {
1001
      $rdn_values[] = ldap_pear_unescape_dn_value(trim($pair[1]));
1002
    }
1003
  }
1004
  return $rdn_values;
1005
}
1006

    
1007

    
1008
/**
1009
 * @return options for ldap type pulldown
1010
 */
1011
function ldap_servers_ldaps_option_array() {
1012

    
1013
  $options = array();
1014
  foreach (ldap_servers_ldap_servers_types() as $ldap_id => $conf) {
1015
    $options[$ldap_id] = $conf['name'];
1016
  }
1017
  return $options;
1018

    
1019
}
1020

    
1021
/**
1022
 * @param string $ldap_type indicating ldap type 'default','ad','novell_edir', 'openldap'
1023
 * @param boolean $reset clear static array
1024
 * @param boolean $flatted indicating if only one ldap type returned, skip top level array key
1025
 *
1026
 * @return one or more ldap type objects
1027
 */
1028
function ldap_servers_get_types($ldap_type = NULL, $reset = FALSE, $flatten = FALSE) {
1029
  static $ldap_types;
1030
  if ($reset || !is_array($ldap_types)) {
1031
    $ldap_types = module_invoke_all('ldap_servers_type');
1032
    if ($ldap_type) {
1033
      require_once($ldap_types[$ldap_type]['directory_path'] . '/' . $ldap_types[$ldap_type]['class'] . '.class.php');
1034
      $ldap_types[$ldap_type] = new $ldap_types[$ldap_type]['class'] . '.class.php';
1035
    }
1036
    else {
1037
      foreach ($ldap_types as $ldap_type_id => $ldap_class_info) {
1038
        require_once($ldap_class_info['directory_path'] . '/' . $ldap_class_info['class'] . '.class.php');
1039
        $ldap_types[$ldap_type_id] = new $ldap_class_info['class'];
1040
      }
1041
    }
1042
  }
1043
  if ($flatten && $ldap_type) {
1044
    return $ldap_types[$ldap_type];
1045
  }
1046
  else {
1047
    return $ldap_types;
1048
  }
1049
}
1050

    
1051

    
1052
function ldap_servers_no_enabled_servers_msg($action) {
1053

    
1054
  $servers = ldap_servers_get_servers(NULL, 'enabled');
1055
  if (count($servers) == 0) {
1056

    
1057
    $message = t('At least one ldap server must configured and <em>enabled</em> before') .
1058
      $action . '. ' . t('Please go to') . ' ' . l('admin/config/people/ldap/servers', 'admin/config/people/ldap/servers') . ' to configure an LDAP server';
1059

    
1060
    drupal_set_message($message, 'warning');
1061
    return $message;
1062
  }
1063
}