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 @ 7547bb19

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 (!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->user_dn_expression) {
330
        ldap_servers_token_extract_attributes($attributes, $ldap_server->user_dn_expression, TRUE);
331
      }
332
      if ($ldap_server->mail_template) {
333
        ldap_servers_token_extract_attributes($attributes, $ldap_server->mail_template);
334
      }
335
      if (!isset($attributes[$ldap_server->user_attr])) {
336
        $attributes[$ldap_server->user_attr] = ldap_servers_set_attribute_map();
337
      }
338
    }
339
  }
340

    
341

    
342
/**
343
 * Implements hook_ldap_user_attrs_list_alter().
344
 */
345

    
346
function ldap_servers_ldap_user_attrs_list_alter(&$available_user_attrs, &$params) {
347
  //debug('ldap_servers_ldap_user_attrs_list_alter'); debug($available_user_attrs); debug($params);
348

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

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

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

    
365
  if ($direction == LDAP_USER_PROV_DIRECTION_TO_DRUPAL_USER) {
366

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

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

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

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

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

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

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

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

    
471
      if ($ldap_server->picture_attr) {
472
        if (!isset($available_user_attrs['[property.picture]']) || !is_array($available_user_attrs['[property.picture]'])) {
473
          $available_user_attrs['[property.picture]'] = array();
474
        }
475
        $available_user_attrs['[property.picture]'] = array(
476
            'name' => 'Property: Picture',
477
            'source' => '[' . $ldap_server->picture_attr . ']',
478
            'direction' => LDAP_USER_PROV_DIRECTION_TO_DRUPAL_USER,
479
            'enabled' => TRUE,
480
            'prov_events' => array(LDAP_USER_EVENT_CREATE_DRUPAL_USER, LDAP_USER_EVENT_SYNCH_TO_DRUPAL_USER),
481
            'config_module' => 'ldap_servers',
482
            'prov_module' => 'ldap_user',
483
        ) + $available_user_attrs['[property.picture]'];
484
      }
485
    }
486
  }
487
 // debug('available_user_attrs2'); debug($available_user_attrs);
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
 // dpm('_ldap_servers_get_servers params'); dpm(array($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

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

    
814
  if (variable_get('ldap_servers_require_ssl_for_credentials', 0) == 1 && @$_SERVER['HTTPS'] != 'on') {
815

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

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

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

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

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

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

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

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

    
854

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

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

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

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

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

    
922

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

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

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

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

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

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

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

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

    
963
}
964

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

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

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

    
980
}
981

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

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

    
1029

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

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

    
1041
}
1042

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

    
1073

    
1074
function ldap_servers_no_enabled_servers_msg($action) {
1075

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

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

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