Projet

Général

Profil

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

root / drupal7 / sites / all / modules / ldap / ldap_servers / ldap_servers.module @ 59ae487e

1
<?php
2

    
3
define('LDAP_SERVER_LDAP_QUERY_CHUNK', 50);
4
define('LDAP_SERVERS_MAXFILTER_ORS', 30);
5
define('LDAP_SERVER_LDAP_QUERY_RECURSION_LIMIT', 10);
6

    
7
define('LDAP_SCOPE_BASE', 1);
8
define('LDAP_SCOPE_ONELEVEL', 2);
9
define('LDAP_SCOPE_SUBTREE', 3);
10

    
11
define('LDAP_TEST_QUERY_CONTEXT', 999);
12

    
13
define('LDAP_SERVERS_PROJECT_TAG', 'ldap');
14
define('LDAP_SERVERS_MENU_BASE_PATH', 'admin/config/people/ldap');
15
define('LDAP_SERVERS_INDEX_BASE_PATH', 'admin/config/people/ldap/servers');
16
define('LDAP_SERVERS_MENU_BASE_PATH_PARTS', 4); // for argument offsets
17
define('LDAP_SERVERS_DRUPAL_HELP_URL', 'http://drupal.org/node/997082');
18

    
19
define('LDAP_SERVERS_TOKEN_PRE', '[');
20
define('LDAP_SERVERS_TOKEN_POST', ']');
21
define('LDAP_SERVERS_TOKEN_DEL', ':');
22
define('LDAP_SERVERS_TOKEN_MODIFIER_DEL', ';');
23

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

    
35
define('LDAP_SERVERS_CYPHER_MODE', 'cfb');
36

    
37
define('LDAP_SERVERS_BIND_METHOD_SERVICE_ACCT', 1);
38
define('LDAP_SERVERS_BIND_METHOD_USER', 2);
39
define('LDAP_SERVERS_BIND_METHOD_ANON', 3);
40
define('LDAP_SERVERS_BIND_METHOD_ANON_USER', 4);
41
define('LDAP_SERVERS_BIND_METHOD_DEFAULT', 1);
42

    
43
define('LDAP_SERVERS_DERIVE_GROUP_FROM_DN', 1);
44
define('LDAP_SERVERS_DERIVE_GROUP_FROM_ATTRIBUTE', 2);
45
define('LDAP_SERVERS_DERIVE_GROUP_FROM_ENTRY', 4);
46

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

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

    
55
define('LDAP_SERVER_MASSAGE_STORE_LDAP', 13); // ...value is about to be stored in ldap entry
56
define('LDAP_SERVER_MASSAGE_STORE_DB', 14); // ...value is about to be stored in db
57
define('LDAP_SERVER_MASSAGE_STORE_ARRAY', 15); // ...value is about to be stored in array
58
define('LDAP_SERVER_MASSAGE_STORE_PROPERTY', 16); // ...value is about to be stored in object property
59

    
60
define('LDAP_SERVER_GROUPS_RECURSE_DEPTH', 20);
61

    
62
define('LDAP_FAIL', -1);
63

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

    
76
//Next5newinLDAPv3);
77
define('LDAP_REFERRAL', 0x0a);
78
define('LDAP_ADMINLIMIT_EXCEEDED', 0x0b);
79
define('LDAP_UNAVAILABLE_CRITICAL_EXTENSION', 0x0c);
80
define('LDAP_CONFIDENTIALITY_REQUIRED', 0x0d);
81
define('LDAP_SASL_BIND_INPROGRESS', 0x0e);
82

    
83
define('LDAP_NO_SUCH_ATTRIBUTE', 0x10);
84
define('LDAP_UNDEFINED_TYPE', 0x11);
85
define('LDAP_INAPPROPRIATE_MATCHING', 0x12);
86
define('LDAP_CONSTRAINT_VIOLATION', 0x13);
87
define('LDAP_TYPE_OR_VALUE_EXISTS', 0x14);
88
define('LDAP_INVALID_SYNTAX', 0x15);
89

    
90
define('LDAP_NO_SUCH_OBJECT', 0x20);
91
define('LDAP_ALIAS_PROBLEM', 0x21);
92
define('LDAP_INVALID_DN_SYNTAX', 0x22);
93

    
94
define('LDAP_IS_LEAF', 0x23);
95
define('LDAP_ALIAS_DEREF_PROBLEM', 0x24);
96
if ( ! defined('LDAP_DEREF_NEVER') )
97
  define('LDAP_DEREF_NEVER', 0x25);
98

    
99
define('LDAP_INAPPROPRIATE_AUTH', 0x30);
100
define('LDAP_INVALID_CREDENTIALS', 0x31);
101
define('LDAP_INSUFFICIENT_ACCESS', 0x32);
102
define('LDAP_BUSY', 0x33);
103
define('LDAP_UNAVAILABLE', 0x34);
104
define('LDAP_UNWILLING_TO_PERFORM', 0x35);
105
define('LDAP_LOOP_DETECT', 0x36);
106

    
107
define('LDAP_SORT_CONTROL_MISSING', 0x3C);
108
define('LDAP_INDEX_RANGE_ERROR', 0x3D);
109

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

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

    
133
//PreliminaryLDAPv3codes);
134
define('LDAP_CONNECT_ERROR', 0x5b);
135
define('LDAP_NOT_SUPPORTED', 0x5c);
136
define('LDAP_CONTROL_NOT_FOUND', 0x5d);
137
define('LDAP_NO_RESULTS_RETURNED', 0x5e);
138
define('LDAP_MORE_RESULTS_TO_RETURN', 0x5f);
139
define('LDAP_CLIENT_LOOP', 0x60);
140
define('LDAP_REFERRAL_LIMIT_EXCEEDED', 0x61);
141

    
142
require_once('ldap_servers.functions.inc');
143
require_once('ldap_servers.tokens.inc');
144

    
145
/**
146
 * Implements hook_init().
147
 */
148
function ldap_servers_init() {
149
  drupal_add_css(drupal_get_path('module', 'ldap_servers') . '/ldap_servers.admin.css', 'module');
150
}
151

    
152
/**
153
 * Advertise the current ldap api version
154
 */
155
function ldap_api_version() {
156
  return '2.0';
157
}
158

    
159
function ldap_servers_menu() {
160
  $menu_offset = 4;
161

    
162
  $items['admin/config/people/ldap'] = array(
163
    'title' => 'LDAP Configuration',
164
    'description' => 'LDAP authentication, authorization, provisioning, etc.',
165
    'page callback' => 'drupal_get_form',
166
    'page arguments' => array('ldap_servers_settings'),
167
    'access arguments' => array('administer site configuration'),
168
    'file' => 'ldap_servers.settings.inc',
169
  );
170

    
171
  $items['admin/config/people/ldap/settings'] = array(
172
    'title' => '1. Settings',
173
    'weight' => -2,
174
    'type' => MENU_DEFAULT_LOCAL_TASK,
175
  );
176

    
177
  $items['admin/config/people/ldap/servers'] = array(
178
    'title' => '2. Servers',
179
    'page callback' => 'ldap_servers_edit_index',
180
    'weight' => -1,
181
    'type' => MENU_LOCAL_TASK,
182
    'access arguments' => array('administer site configuration'),
183
    'file' => 'ldap_servers.admin.inc',
184
  );
185

    
186
  $items['admin/config/people/ldap/servers/list'] = array(
187
    'title' => 'List',
188
    'type' => MENU_DEFAULT_LOCAL_TASK,
189
  );
190

    
191
  $items['admin/config/people/ldap/servers/add'] = array(
192
    'title' => 'Add LDAP Server Configuration',
193
    'page callback' => 'drupal_get_form',
194
    'page arguments' => array('ldap_servers_admin_form', 'add'),
195
    'type' => MENU_LOCAL_TASK + MENU_CONTEXT_INLINE,
196
    'weight' => 3,
197
    'access arguments' => array('administer site configuration'),
198
    'file' => 'ldap_servers.admin.inc',
199
  );
200

    
201
  $items['admin/config/people/ldap/servers/edit/%'] = array(
202
    'title' => 'Edit LDAP Server Configuration',
203
    'page callback' => 'drupal_get_form',
204
    'page arguments' => array('ldap_servers_admin_form', 'edit', $menu_offset + 2),
205
    'access arguments' => array('administer site configuration'),
206
    'file' => 'ldap_servers.admin.inc',
207
  );
208

    
209
  $items['admin/config/people/ldap/servers/test/%'] = array(
210
    'title' => 'Test LDAP Server Configuration',
211
    'page callback' => 'drupal_get_form',
212
    'page arguments' => array('ldap_servers_test_form', $menu_offset + 1, $menu_offset + 2),
213
    'access arguments' => array('administer site configuration'),
214
    'file' => 'ldap_servers.test_form.inc',
215
  );
216

    
217
  $items['admin/config/people/ldap/servers/delete/%'] = array(
218
    'title' => 'Delete LDAP Server',
219
    'page callback' => 'drupal_get_form',
220
    'page arguments' => array('ldap_servers_admin_delete', $menu_offset + 1, $menu_offset + 2),
221
    'access arguments' => array('administer site configuration'),
222
    'file' => 'ldap_servers.admin.inc',
223
  );
224

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

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

    
241
  return $items;
242
}
243

    
244

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

    
278

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

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

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

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

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

    
344

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

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

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

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

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

    
367
  if ($direction == LDAP_USER_PROV_DIRECTION_TO_DRUPAL_USER) {
368

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

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

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

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

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

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

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

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

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

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

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

    
499

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

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

    
533

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

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

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

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

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

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

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

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

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

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

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

    
629
  return $value;
630
}
631

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

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

    
653
  return $match;
654
}
655

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

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

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

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

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

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

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

    
734
  return $ldap_user;
735
}
736

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

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

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

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

    
776
      if ($conversion) {
777

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

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

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

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

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

    
800
      }
801

    
802
  return $value;
803
}
804

    
805

    
806
/**
807
 * disable a logon form if ldap preferences exclude http logon forms
808
 *
809
 * @param drupal logon form array $form
810
 */
811
function ldap_servers_disable_http_check(&$form) {
812

    
813
  if (variable_get('ldap_servers_require_ssl_for_credentials', 0) == 1 && !drupal_is_https()) {
814

    
815
    $tokens = array(
816
      'site_name' => variable_get('site_name', 'this site'),
817
      'site_mail' =>  variable_get('site_mail', ''),
818
      );
819

    
820
    drupal_set_message(t(theme('ldap_servers_https_required', $tokens)), 'error');
821
    $form['#disabled'] = TRUE;
822
  }
823
}
824

    
825
function ldap_servers_ldap_extension_summary($op = 'data') {
826
  ldap_servers_module_load_include('inc', 'ldap_servers', 'ldap_servers.status');
827
  return _ldap_servers_ldap_extension_summary($op);
828
}
829

    
830
function ldap_servers_ldap_extension_loaded() {
831
  return extension_loaded('ldap');
832
}
833

    
834
function ldap_servers_encrypt($text, $encryption = NULL) {
835
  ldap_servers_module_load_include('inc', 'ldap_servers', 'ldap_servers.encryption');
836
  return _ldap_servers_encrypt($text, $encryption);
837
}
838

    
839
function ldap_servers_encrypt_types($category = 'all') {
840
  ldap_servers_module_load_include('inc', 'ldap_servers', 'ldap_servers.encryption');
841
  return _ldap_servers_encrypt_types($category);
842
}
843

    
844
function ldap_servers_decrypt($encrypted, $encryption = NULL) {
845
  ldap_servers_module_load_include('inc', 'ldap_servers', 'ldap_servers.encryption');
846
  return _ldap_servers_decrypt($encrypted, $encryption);
847
}
848

    
849
function ldap_servers_php_supports_pagination() {
850
  return (boolean)(function_exists('ldap_control_paged_result_response') && function_exists('ldap_control_paged_result'));
851
}
852

    
853

    
854
function ldap_servers_help($path, $arg) {
855

    
856
  $servers_help = '<p>' . t('LDAP Servers store "LDAP server configurations" so other modules can connect to them and leverage their data.') . ' ';
857
  $servers_help .= t('LDAP Authentication and LDAP Authorization are two such modules. Generally, only one LDAP Server configuration is needed.') . ' ' . '</p>';
858
  $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>';
859

    
860
  switch ($path) {
861
    case 'admin/config/people/ldap/servers':
862
      return $servers_help;
863

    
864
   case 'admin/help#ldap_servers':
865
      $servers_help .= '<h3>' . t('Configuration - Settings') . '</h3>';
866
      $servers_help .= '<dl>';
867
      $servers_help .= '<dt>' . t('REQUIRE HTTPS ON CREDENTIAL PAGES') . '</dt>';
868
      $servers_help .= '<dd>' . t('If checked, modules using LDAP will not allow credentials to be entered on or submitted to HTTP pages, only HTTPS. This option should be used with an approach to get all logon forms to be HTTPS.') . '</dd>';
869
      $servers_help .= '<dt>' . t('ENCRYPTION') . '</dt>';
870
      $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>';
871
      $servers_help .= '<dt>' . t('LOG DETAILED LDAP ACTIONS') . '</dt>';
872
      $servers_help .= '<dd>' . t('Enables LDAP logging to the Drupal Watchdog system') . '</dd>';
873
      $servers_help .= '</dl>';
874
      $servers_help .= '<h3>' . t('Configuration - Servers (List)') . '</h3>';
875
      $servers_help .= '<dl>';
876
      $servers_help .= '<dt>' . t('Configuration Table') . '</dt>';
877
      $servers_help .= '<dd>' . t('Provides a list of currently stored LDAP server configuratins.') . '</dd>';
878
      $servers_help .= '<h3>' . t('Configuration - Servers (Add LDAP Server Configuration)') . '</h3>';
879
      $servers_help .= '<dl>';
880
      $servers_help .= '<dt>' . t('CONNECTION SETTINGS') . '</dt>';
881
      $servers_help .= '<dd>' . t('Machine name -') . ' </dd>';
882
      $servers_help .= '<dd>' . t('Name -') . ' </dd>';
883
      $servers_help .= '<dd>' . t('Enabled -') . ' </dd>';
884
      $servers_help .= '<dd>' . t('LDAP Server Type') . ' </dd>';
885
      $servers_help .= '<dd>' . t('LDAP Server -') . ' </dd>';
886
      $servers_help .= '<dd>' . t('LDAP port -') . ' </dd>';
887
      $servers_help .= '<dd>' . t('Use Start-TLS -') . ' </dd>';
888
      $servers_help .= '<dd>' . t('Follow LDAP Referrals -') . ' </dd>';
889
      $servers_help .= '</dl>';
890
      $servers_help .= '<dl>';
891
      $servers_help .= '<dt>' . t('BINDING METHOD') . '</dt>';
892
      $servers_help .= '<dd>' . t('Binding Method for searches -') . ' </dd>';
893
      $servers_help .= '<dd>' . t('Service Account -') . ' </dd>';
894
      $servers_help .= '<dd>' . t('DN for non-anonymous search -') . ' </dd>';
895
      $servers_help .= '<dd>' . t('Password for non-anonymous search -') . ' </dd>';
896
      $servers_help .= '<dd>' . t('Clear existing password from database -') . ' </dd>';
897
      $servers_help .= '</dl>';
898
      $servers_help .= '<dl>';
899
      $servers_help .= '<dt>' . t('LDAP USER TO DRUPAL USER RELATIONSHIP') . '</dt>';
900
      $servers_help .= '<dd>' . t('Base DNs for LDAP Users, Groups, and Other Entries -') . ' </dd>';
901
      $servers_help .= '<dd>' . t('AuthName Attribute -') . ' </dd>';
902
      $servers_help .= '<dd>' . t('AccountName Attribute -') . ' </dd>';
903
      $servers_help .= '<dd>' . t('Email Attribute -') . ' </dd>';
904
      $servers_help .= '<dd>' . t('Email Template -') . ' </dd>';
905
      $servers_help .= '<dd>' . t('Persistant and Unique User ID Attribute -') . ' </dd>';
906
      $servers_help .= '<dd>' . t('Does PUID hold a binary value? -') . ' </dd>';
907
      $servers_help .= '<dd>' . t('Expression for User DN -') . ' </dd>';
908
      $servers_help .= '<dd>' . t('PHP to Transform Drupal Login Username to LDAP UserName Attribute -') . ' </dd>';
909
      $servers_help .= '<dd>' . t('Testing Drupal Username -') . ' </dd>';
910
      $servers_help .= '<dd>' . t('DN of Testing Username -') . ' </dd>';
911
      $servers_help .= '</dl>';
912
      return $servers_help;
913

    
914
    case 'admin/config/people/ldap/servers/add':
915
      $output = '<p>' . t('Setup an LDAP server configuration to be used by other modules such as LDAP Authentication, LDAP Authorization, etc.') . '</p>';
916
      $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>';
917
      return $output;
918
  }
919
}
920

    
921

    
922
/**
923
 * @return list of ldap configuration classes and names
924
 */
925
function ldap_servers_ldap_servers_types() {
926

    
927
  $path = drupal_get_path('module', 'ldap_servers') . '/ldap_types';
928

    
929
  $types['default'] =  array(
930
    'class' => t('LdapTypeDefault'),
931
    'directory_path' => $path,
932
    'name' => 'Default LDAP',
933
  );
934

    
935
  $types['ad'] =  array(
936
    'class' => t('LdapTypeActiveDirectory'),
937
    'directory_path' => $path,
938
    'name' => 'Active Directory',
939
  );
940

    
941
  $types['novell_edir'] =  array(
942
    'class' => t('LdapTypeNovell'),
943
    'directory_path' => $path,
944
    'name' => 'Novell',
945
  );
946

    
947
  $types['openldap'] =  array(
948
    'class' => t('LdapTypeOpenLdap'),
949
    'directory_path' => $path,
950
    'name' => 'Open LDAP',
951
  );
952

    
953
  $types['opendir'] =  array(
954
    'class' => t('LdapTypeOpenDirectory'),
955
    'directory_path' => $path,
956
    'name' => 'Apple Open Directory',
957
  );
958

    
959
  drupal_alter('ldap_servers_ldap_types', $types);
960
  return $types;
961

    
962
}
963

    
964
/**
965
 * @param string or array ldap type id or conf array
966
 * @return options for ldap type pulldown
967
 */
968
function ldap_servers_get_ldap_type_object($ldap_conf) {
969

    
970
  if (!is_array($ldap_conf)) {
971
    $ldap_confs = ldap_servers_ldap_servers_types();
972
    $ldap_conf = $ldap_confs[$ldap_conf];
973
  }
974

    
975
  require_once($ldap_conf['directory_path'] . '/' . $ldap_conf['class'] . 'class.php');
976
  $ldap_type_class = new $ldap_conf['class']();
977
  return $ldap_type_class;
978

    
979
}
980

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

    
1005
/**
1006
 * given a dn (such as cn=jdoe,ou=people)
1007
 * and an rdn (such as cn)
1008
 * determine that rdn value (such as jdoe)
1009
 *
1010
 * @param string $dn
1011
 * @param string $rdn
1012
 * @return array of all values of rdn
1013
 */
1014
function ldap_servers_get_all_rdn_values_from_dn($dn, $rdn) {
1015
  $pairs = ldap_explode_dn($dn, 0); // escapes attribute values, need to be unescaped later
1016
  $count = array_shift($pairs);
1017
  $rdn = drupal_strtolower($rdn);
1018
  $rdn_values = array();
1019
  foreach ($pairs as $p) {
1020
    $pair = explode('=', $p);
1021
    if (drupal_strtolower(trim($pair[0])) == $rdn) {
1022
      $rdn_values[] = ldap_pear_unescape_dn_value(trim($pair[1]));
1023
    }
1024
  }
1025
  return $rdn_values;
1026
}
1027

    
1028

    
1029
/**
1030
 * @return options for ldap type pulldown
1031
 */
1032
function ldap_servers_ldaps_option_array() {
1033

    
1034
  $options = array();
1035
  foreach (ldap_servers_ldap_servers_types() as $ldap_id => $conf) {
1036
    $options[$ldap_id] = $conf['name'];
1037
  }
1038
  return $options;
1039

    
1040
}
1041

    
1042
/**
1043
 * @param string $ldap_type indicating ldap type 'default','ad','novell_edir', 'openldap'
1044
 * @param boolean $reset clear static array
1045
 * @param boolean $flatted indicating if only one ldap type returned, skip top level array key
1046
 *
1047
 * @return one or more ldap type objects
1048
 */
1049
function ldap_servers_get_types($ldap_type = NULL, $reset = FALSE, $flatten = FALSE) {
1050
  static $ldap_types;
1051
  if ($reset || !is_array($ldap_types)) {
1052
    $ldap_types = module_invoke_all('ldap_servers_type');
1053
    if ($ldap_type) {
1054
      require_once($ldap_types[$ldap_type]['directory_path'] . '/' . $ldap_types[$ldap_type]['class'] . '.class.php');
1055
      $ldap_types[$ldap_type] = new $ldap_types[$ldap_type]['class'] . '.class.php';
1056
    }
1057
    else {
1058
      foreach ($ldap_types as $ldap_type_id => $ldap_class_info) {
1059
        require_once($ldap_class_info['directory_path'] . '/' . $ldap_class_info['class'] . '.class.php');
1060
        $ldap_types[$ldap_type_id] = new $ldap_class_info['class'];
1061
      }
1062
    }
1063
  }
1064
  if ($flatten && $ldap_type) {
1065
    return $ldap_types[$ldap_type];
1066
  }
1067
  else {
1068
    return $ldap_types;
1069
  }
1070
}
1071

    
1072

    
1073
function ldap_servers_no_enabled_servers_msg($action) {
1074

    
1075
  $servers = ldap_servers_get_servers(NULL, 'enabled');
1076
  if (count($servers) == 0) {
1077

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

    
1081
    drupal_set_message($message, 'warning');
1082
    return $message;
1083
  }
1084
}