Projet

Général

Profil

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

root / htmltest / sites / all / modules / ldap / ldap_servers / ldap_servers.module @ dd54aff9

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', 12);
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

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

    
105
define('LDAP_SORT_CONTROL_MISSING', 0x3C);
106
define('LDAP_INDEX_RANGE_ERROR', 0x3D);
107

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

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

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

    
140
require_once('ldap_servers.functions.inc');
141
require_once('ldap_servers.tokens.inc');
142

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

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

    
157
function ldap_servers_menu() {
158
  $menu_offset = 4;
159

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

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

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

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

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

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

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

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

    
223
  $items['admin/config/people/ldap/servers/enable/%'] = array(
224
    'title' => 'Enable LDAP Server',
225
    'page callback' => 'drupal_get_form',
226
    'page arguments' => array('ldap_servers_admin_enable_disable', $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/disable/%'] = 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
  return $items;
240
}
241

    
242

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

    
276

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

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

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

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

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

    
339

    
340
/**
341
 * Implements hook_ldap_user_attrs_list_alter().
342
 */
343

    
344
function ldap_servers_ldap_user_attrs_list_alter(&$available_user_attrs, &$params) {
345
  //debug('ldap_servers_ldap_user_attrs_list_alter'); debug($available_user_attrs); debug($params);
346

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

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

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

    
363
  if ($direction == LDAP_USER_PROV_DIRECTION_TO_DRUPAL_USER) {
364

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

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

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

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

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

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

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

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

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

    
487
}
488

    
489
/**
490
 * flush server static cache
491
 */
492

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

    
497

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

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

    
531

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

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

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

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

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

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

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

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

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

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

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

    
628
  return $value;
629
}
630

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

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

    
652
  return $match;
653
}
654

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

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

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

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

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

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

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

    
733
  return $ldap_user;
734
}
735

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

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

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

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

    
775
      if ($conversion) {
776

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

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

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

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

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

    
799
      }
800

    
801
  return $value;
802
}
803

    
804

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

    
812
  if (variable_get('ldap_servers_require_ssl_for_credentails', 0) == 1 && @$_SERVER['HTTPS'] != 'on') {
813

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

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

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

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

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

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

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

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

    
852

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

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

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

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

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

    
920

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

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

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

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

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

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

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

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

    
961
}
962

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

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

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

    
978
}
979

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

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

    
1027

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

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

    
1039
}
1040

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

    
1071

    
1072
function ldap_servers_no_enabled_servers_msg($action) {
1073

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

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

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