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 85ad3d82 Assos Assos
<?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 dd54aff9 Assos Assos
define('LDAP_SERVERS_ENC_TYPE_BLOWFISH', 6);
30 85ad3d82 Assos Assos
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 dd54aff9 Assos Assos
35 5136ce55 Assos Assos
define('LDAP_SERVERS_CYPHER_MODE', 'cfb');
36 85ad3d82 Assos Assos
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 5136ce55 Assos Assos
if ( ! defined('LDAP_DEREF_NEVER') )
97
  define('LDAP_DEREF_NEVER', 0x25);
98 85ad3d82 Assos Assos
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 dd54aff9 Assos Assos
  //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 85ad3d82 Assos Assos
  // 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 7547bb19 Assos Assos
        !empty($drupal_user->ldap_user_puid_sid[LANGUAGE_NONE][0]['value'])
702 85ad3d82 Assos Assos
      ) {
703 7547bb19 Assos Assos
      $sid = $drupal_user->ldap_user_puid_sid[LANGUAGE_NONE][0]['value'];
704 85ad3d82 Assos Assos
    }
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 7547bb19 Assos Assos
  if (variable_get('ldap_servers_require_ssl_for_credentials', 0) == 1 && @$_SERVER['HTTPS'] != 'on') {
815 85ad3d82 Assos Assos
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
}