Projet

Général

Profil

Paste
Télécharger (39 ko) Statistiques
| Branche: | Révision:

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

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 be58a50c Assos Assos
      if ($ldap_server->picture_attr && !isset($attributes[$ldap_server->picture_attr])) {
324 85ad3d82 Assos Assos
        $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 be58a50c Assos Assos
      if ($ldap_server->groupUserMembershipsAttr && !isset($attributes[$ldap_server->groupUserMembershipsAttr])) {
330
        $attributes[$ldap_server->groupUserMembershipsAttr] = ldap_servers_set_attribute_map();
331
      }
332 85ad3d82 Assos Assos
      if ($ldap_server->user_dn_expression) {
333
        ldap_servers_token_extract_attributes($attributes, $ldap_server->user_dn_expression, TRUE);
334
      }
335
      if ($ldap_server->mail_template) {
336
        ldap_servers_token_extract_attributes($attributes, $ldap_server->mail_template);
337
      }
338
      if (!isset($attributes[$ldap_server->user_attr])) {
339
        $attributes[$ldap_server->user_attr] = ldap_servers_set_attribute_map();
340
      }
341
    }
342
  }
343
344
345
/**
346
 * Implements hook_ldap_user_attrs_list_alter().
347
 */
348
349
function ldap_servers_ldap_user_attrs_list_alter(&$available_user_attrs, &$params) {
350
  //debug('ldap_servers_ldap_user_attrs_list_alter'); debug($available_user_attrs); debug($params);
351
352
  if (isset($params['ldap_server']) && $params['ldap_server']) {
353
    $ldap_server = $params['ldap_server'];
354
  }
355
  else {
356
    return; // without a server id, ldap_servers module has nothing to offer
357
  }
358
  $ldap_user_conf  = $params['ldap_user_conf'];
359
  $direction = $params['direction'];
360
361
  $tokens = array(
362
    '!edit_link' => l($ldap_server->editPath, $ldap_server->editPath),
363
    '!sid' => $ldap_server->sid,
364
  );
365
366
  $server_edit_path = 'admin/config/people/ldap/servers/edit/' . $ldap_server->sid;
367
368
  if ($direction == LDAP_USER_PROV_DIRECTION_TO_DRUPAL_USER) {
369
370
    /** these 4 user fields indentify where in ldap and which ldap server they are associated with.
371
     they are required for a Drupal account to be "ldap associated" regardless of if any other
372
     fields/properties are provisioned or synched
373
    */
374
375
    if ($ldap_server->unique_persistent_attr) {
376
      foreach (array(
377
        'field.ldap_user_puid_sid',
378
        'field.ldap_user_puid',
379
        'field.ldap_user_puid_property',
380
        ) as $i => $property_id) {
381
        $property_token = '[' . $property_id . ']';
382
        if (!isset($available_user_attrs[$property_token]) || !is_array($available_user_attrs[$property_token])) {
383
          $available_user_attrs[$property_token] = array();
384
        }
385
      }
386
387
      $available_user_attrs['[field.ldap_user_puid_sid]'] =  array(
388
        'name' => t('Field: sid providing PUID'),
389
        'configurable_to_drupal' => 0,
390
        'configurable_to_ldap' => 1,
391
        'source' => t('!sid', $tokens),
392
        'notes' => 'not configurable',
393
        'direction' => LDAP_USER_PROV_DIRECTION_TO_DRUPAL_USER,
394
        'enabled' => TRUE,
395
        'prov_events' => array(LDAP_USER_EVENT_CREATE_DRUPAL_USER),
396
        'config_module' => 'ldap_servers',
397
        'prov_module' => 'ldap_user',
398
      ) + $available_user_attrs['[field.ldap_user_puid_sid]'];
399
400
      $available_user_attrs['[field.ldap_user_puid]'] =  array(
401
        'name' => t('Field: PUID', $tokens),
402
        'configurable_to_drupal' => 0,
403
        'configurable_to_ldap' => 1,
404
        'source' => '[' . $ldap_server->unique_persistent_attr . ']',
405
        'notes' => 'configure at ' . $server_edit_path,
406
        'convert' => $ldap_server->unique_persistent_attr_binary,
407
        'direction' => LDAP_USER_PROV_DIRECTION_TO_DRUPAL_USER,
408
        'enabled' => TRUE,
409
        'prov_events' => array(LDAP_USER_EVENT_CREATE_DRUPAL_USER),
410
        'config_module' => 'ldap_servers',
411
        'prov_module' => 'ldap_user',
412
      ) + $available_user_attrs['[field.ldap_user_puid]'];
413
414
      $available_user_attrs['[field.ldap_user_puid_property]'] =
415
      array(
416
        'name' => t('Field: PUID Attribute', $tokens),
417
        'configurable_to_drupal' => 0,
418
        'configurable_to_ldap' => 1,
419
        'source' =>  $ldap_server->unique_persistent_attr ,
420
        'notes' => 'configure at ' . $server_edit_path,
421
        'direction' => LDAP_USER_PROV_DIRECTION_TO_DRUPAL_USER,
422
        'enabled' => TRUE,
423
        'prov_events' => array(LDAP_USER_EVENT_CREATE_DRUPAL_USER),
424
        'config_module' => 'ldap_servers',
425
        'prov_module' => 'ldap_user',
426
      ) + $available_user_attrs['[field.ldap_user_puid_property]'];
427
    }
428
429
    $token = '[field.ldap_user_current_dn]';
430
    if (!isset($available_user_attrs[$token]) || !is_array($available_user_attrs[$token])) {
431
      $available_user_attrs[$token] = array();
432
    }
433
    $available_user_attrs[$token] =
434
    array(
435
      'name' => t('Field: Most Recent DN', $tokens),
436
      'configurable_to_drupal' => 0,
437
      'configurable_to_ldap' => 0,
438
      'source' => '[dn]',
439
      'notes' => 'not configurable',
440
      'direction' => LDAP_USER_PROV_DIRECTION_TO_DRUPAL_USER,
441
      'enabled' => TRUE,
442
      'prov_events' => array(LDAP_USER_EVENT_CREATE_DRUPAL_USER, LDAP_USER_EVENT_SYNCH_TO_DRUPAL_USER),
443
      'config_module' => 'ldap_servers',
444
      'prov_module' => 'ldap_user',
445
    ) + $available_user_attrs[$token];
446
447
    if ($ldap_user_conf->provisionsDrupalAccountsFromLdap) {
448
      if (!isset($available_user_attrs['[property.name]']) || !is_array($available_user_attrs['[property.name]'])) {
449
        $available_user_attrs['[property.name]'] = array();
450
      }
451
      $available_user_attrs['[property.name]'] = array(
452
        'name' => 'Property: Username',
453
        'source' => '[' . $ldap_server->user_attr . ']',
454
        'direction' => LDAP_USER_PROV_DIRECTION_TO_DRUPAL_USER,
455
        'enabled' => TRUE,
456
        'prov_events' => array(LDAP_USER_EVENT_CREATE_DRUPAL_USER, LDAP_USER_EVENT_SYNCH_TO_DRUPAL_USER),
457
        'config_module' => 'ldap_servers',
458
        'prov_module' => 'ldap_user',
459
      ) + $available_user_attrs['[property.name]'];
460
461
      if (!isset($available_user_attrs['[property.mail]']) || !is_array($available_user_attrs['[property.mail]'])) {
462
        $available_user_attrs['[property.mail]'] = array();
463
      }
464
      $available_user_attrs['[property.mail]'] =  array(
465
        'name' => 'Property: Email',
466
        'source' => ($ldap_server->mail_template) ? $ldap_server->mail_template : '[' . $ldap_server->mail_attr . ']',
467
        'direction' => LDAP_USER_PROV_DIRECTION_TO_DRUPAL_USER,
468
        'enabled' => TRUE,
469
        'prov_events' => array(LDAP_USER_EVENT_CREATE_DRUPAL_USER, LDAP_USER_EVENT_SYNCH_TO_DRUPAL_USER),
470
        'config_module' => 'ldap_servers',
471
        'prov_module' => 'ldap_user',
472
      ) + $available_user_attrs['[property.mail]'];
473
474
      if ($ldap_server->picture_attr) {
475
        if (!isset($available_user_attrs['[property.picture]']) || !is_array($available_user_attrs['[property.picture]'])) {
476
          $available_user_attrs['[property.picture]'] = array();
477
        }
478
        $available_user_attrs['[property.picture]'] = array(
479
            'name' => 'Property: Picture',
480
            'source' => '[' . $ldap_server->picture_attr . ']',
481
            'direction' => LDAP_USER_PROV_DIRECTION_TO_DRUPAL_USER,
482
            'enabled' => TRUE,
483
            'prov_events' => array(LDAP_USER_EVENT_CREATE_DRUPAL_USER, LDAP_USER_EVENT_SYNCH_TO_DRUPAL_USER),
484
            'config_module' => 'ldap_servers',
485
            'prov_module' => 'ldap_user',
486
        ) + $available_user_attrs['[property.picture]'];
487
      }
488
    }
489
  }
490
 // debug('available_user_attrs2'); debug($available_user_attrs);
491
492
}
493
494
/**
495
 * flush server static cache
496
 */
497
498
function ldap_servers_flush_server_cache() {
499
  $discard = ldap_servers_get_servers(NULL, 'all', FALSE, TRUE); // flush server cache
500
}
501
502
503
/**
504
 * function to replace module_load_include such that when
505
 * something is not included, drupal will exit instead
506
 * of attempting something half baked.
507
 */
508
function ldap_servers_module_load_include($type, $module, $name = NULL) {
509
  $result = module_load_include($type, $module, $name);
510
  if ($result === FALSE) {
511
    print "Failed to load file $name.$type in module $module";
512
    drupal_exit();
513
  }
514
}
515
516
/**
517
 *
518
 * return ldap server conf objects
519
 *
520
 * @param alphanum $sid
521
 * @param enum $type 'all', 'enabled',
522
 * @param boolean $flatten signifies if array or single object returned.  Only works if sid is specified
523
 * @param boolean $reset do not use cached or static result
524
 * @return - array of server conf object keyed on sid
525
 *         - single server conf object (if flatten == TRUE)
526
 */
527
function ldap_servers_get_servers($sid = NULL, $type = NULL, $flatten = FALSE, $reset = FALSE) {
528
  if (variable_get('ldap_simpletest', FALSE)) {
529
    return _ldap_servers_get_simpletest_servers($sid, $type, $flatten, $reset);
530
  }
531
  else {
532
    return _ldap_servers_get_servers($sid, $type, $flatten, $reset);
533
  }
534
}
535
536
537
/**
538
 * see ldap_servers_get_servers()
539
 */
540
function _ldap_servers_get_servers($sid, $type, $flatten, $reset) {
541
 // dpm('_ldap_servers_get_servers params'); dpm(array($sid, $type, $flatten, $reset));
542
  ldap_servers_module_load_include('php', 'ldap_servers', 'LdapServerAdmin.class');
543
  static $servers;
544
  $type = ($type) ? $type : 'all';
545
  if ($reset) {
546
    $servers = array();
547
  }
548
  if (!isset($servers['all'])) {
549
    $servers['all'] = LdapServerAdmin::getLdapServerObjects('all', NULL, 'LdapServer', $reset);
550
  }
551
552
  if (!isset($servers['enabled'])) {
553
    $servers['enabled'] = array();
554
    foreach ($servers['all'] as $_sid => $ldap_server) {
555
      if ($ldap_server->status == 1) {
556
        $servers['enabled'][$_sid] = $ldap_server;
557
      }
558
    }
559
  }
560
561
  if ($sid) {
562
    if (!isset($servers[$type][$sid])) {
563
      return FALSE;
564
    }
565
    return ($flatten) ? $servers[$type][$sid] : array($sid => $servers[$type][$sid]);
566
  }
567
568
  if (isset($servers[$type])) {
569
    return $servers[$type];
570
  }
571
}
572
573
/**
574
 * see ldap_servers_get_servers()
575
 */
576
function _ldap_servers_get_simpletest_servers($sid, $type = NULL, $flatten, $reset = TRUE) {
577
578
  if (!$type) {
579
    $type = 'all';
580
  }
581
582
  //two flavors of mock servers exist.  ultimately v2 will be used in all simpletests
583
  if (variable_get('ldap_simpletest', 0) == 2) {
584
    ldap_servers_module_load_include('php', 'ldap_test', 'LdapServerTest.class');
585
    $servers['all'] = LdapServerTest::getLdapServerObjects(NULL, 'all', FALSE);
586
    foreach ($servers['all'] as $_sid => $ldap_server) {
587
      if ($ldap_server->status == 1) {
588
        $servers['enabled'][$_sid] = $ldap_server;
589
      }
590
    }
591
  }
592
593
  if ($sid) {
594
    if (!isset($servers[$type][$sid])) {
595
      return FALSE;
596
    }
597
    return ($flatten) ? $servers[$type][$sid] : array($sid => $servers[$type][$sid]);
598
  }
599
600
  if (isset($servers[$type])) {
601
    return $servers[$type];
602
  }
603
}
604
function ldap_servers_debug($variable) {
605
  if (variable_get('ldap_simpletest', FALSE) && function_exists('dpm')) {
606
    dpm($variable);
607
  }
608
  else {
609
    debug($variable);
610
  }
611
}
612
function ldap_servers_cache_clear() {
613
  $discard = ldap_servers_get_servers(NULL, 'all', FALSE, TRUE);
614
  if (module_exists('ctools')) {
615
    ctools_export_load_object_reset('ldap_servers');
616
  }
617
}
618
619
/**
620
 * function to convert microsoft style guids to strings
621
 */
622
function ldap_servers_msguid($value) {
623
624
  $hex_string = bin2hex($value);
625
  // (MS?) GUID are displayed with first three GUID parts as "big endian"
626
  // Doing this so String value matches what other LDAP tool displays for AD.
627
  $value = strtoupper(substr( $hex_string, 6, 2) . substr( $hex_string, 4, 2) .
628
  substr( $hex_string, 2, 2) . substr( $hex_string, 0, 2) . '-' .
629
  substr( $hex_string, 10, 2) . substr( $hex_string, 8, 2) . '-' .
630
  substr( $hex_string, 14, 2) . substr( $hex_string, 12, 2) . '-' .
631
  substr( $hex_string, 16, 4) . '-' . substr( $hex_string, 20, 12));
632
633
  return $value;
634
}
635
636
 /**
637
 * Create a "binary safe" string for use in LDAP filters
638
 * @param $value
639
 * @return string
640
 */
641
function ldap_servers_binary_filter($value) {
642
  $match = '';
643
  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)) {
644
    // Reconstruct proper "memory" order from (MS?) GUID string.
645
    $hex_string = str_replace('-', '', $value);
646
    $value = substr($hex_string, 6, 2) . substr($hex_string, 4, 2) .
647
      substr($hex_string, 2, 2) . substr($hex_string, 0, 2) .
648
      substr($hex_string, 10, 2) . substr($hex_string, 8, 2) .
649
      substr($hex_string, 14, 2) . substr($hex_string, 12, 2) .
650
      substr($hex_string, 16, 4) . substr($hex_string, 20, 12);
651
  }
652
653
  for ($i = 0; $i < strlen($value); $i = $i + 2 ) {
654
    $match .= '\\' . substr($value, $i, 2);
655
  }
656
657
  return $match;
658
}
659
660
/**
661
 * general binary conversion function for guids
662
 * tries to determine which approach based on length
663
 * of string
664
 */
665
function ldap_servers_binary($value) {
666
  if (strlen($value) == 16) {
667
    $value = ldap_servers_msguid($value);
668
  }
669
  else {
670
    $value = bin2hex($value);
671
  }
672
  return $value;
673
}
674
675
/**
676
 * @todo needs caching element.  several modules could potentially call this in the same
677
 * page request.
678
 *
679
 * @param std object $drupal_user is drupal $user object
680
 * @param string $sid is a server id
681
 * @param scalar $ldap_context
682
 */
683
684
function ldap_servers_get_user_ldap_data($drupal_user, $sid = NULL, $ldap_context = NULL) {
685
  if (is_object($drupal_user) && property_exists($drupal_user, 'uid') &&
686
      function_exists('ldap_user_get_authname') && ($authname = ldap_user_get_authname($drupal_user))) {
687
    $drupal_username = $authname;
688
  }
689
  else {
690
    $drupal_username = (is_object($drupal_user)) ? $drupal_user->name : $drupal_user;
691
  }
692 dd54aff9 Assos Assos
  //Sometimes we have username instead of a drupal user object
693
  //For example, when using LDAP user test form (admin/config/people/ldap/user/test)
694
  //But we can still load the user by using $drupal_username  if $drupal_user is not an object
695
  if ( !(is_object($drupal_user)) ) {
696
    $user_object = user_load_by_name($drupal_username);
697
    if (is_object($user_object) && property_exists($user_object, 'uid')) {
698
      $drupal_user = $user_object;
699
    }
700
  }
701 85ad3d82 Assos Assos
  // if no explicit $sid, find most appropriate one
702
  if (module_exists('ldap_user') && (!$sid || $sid == LDAP_USER_AUTH_SERVER_SID)) {
703
    if (property_exists($drupal_user, 'ldap_user_puid_sid') &&
704 7547bb19 Assos Assos
        !empty($drupal_user->ldap_user_puid_sid[LANGUAGE_NONE][0]['value'])
705 85ad3d82 Assos Assos
      ) {
706 7547bb19 Assos Assos
      $sid = $drupal_user->ldap_user_puid_sid[LANGUAGE_NONE][0]['value'];
707 85ad3d82 Assos Assos
    }
708
    else {
709
      $ldap_user_conf = ldap_user_conf();
710
      ldap_user_reset_provision_server($ldap_user_conf, $drupal_user);
711
      $sid = $ldap_user_conf->drupalAcctProvisionServer;
712
    }
713
  }
714
  elseif (!$sid) {
715
    $ldap_servers = ldap_servers_get_servers(NULL, 'enabled');
716
    if (count($ldap_servers) == 1) {
717
      $sids = array_keys($ldap_servers);
718
      $sid = $sids[0];
719
    }
720
  }
721
722
  $ldap_server = ($sid) ? ldap_servers_get_servers($sid, 'enabled', TRUE) : FALSE;
723
724
  if ($ldap_server === FALSE) {
725
    watchdog('ldap_servers', 'Failed to load server object %sid in _ldap_servers_get_user_ldap_data', array('%sid' => $sid), WATCHDOG_ERROR);
726
    return FALSE;
727
  }
728
729
  $ldap_user = $ldap_server->userUserNameToExistingLdapEntry($drupal_username, $ldap_context);
730
731
  if ($ldap_user) {
732
    $ldap_user['sid'] = $sid;
733
  }
734
  else {
735
    $ldap_user = FALSE;
736
  }
737
738
  return $ldap_user;
739
}
740
741
/**
742
 * @param array $attribute_map for a given attribute in form array('values' => array(), 'data_type' => NULL) as outlined in ldap_user/README.developers.txt
743
 * @param enum string $conversion as type of conversion to do @see ldap_servers_convert_attribute().  e.g. base64_encode, bin2hex, msguid, md5
744
 * @param array $values in form array(<ordinal> => <value> | NULL) where NULL indicates value is needed for provisioning or other operations.
745
 *
746
 * @return array $attribute_map with converted values.  If nothing passed in create empty array in proper structure.
747
 *   array('values' => array(
748
 *      0 => 'john',
749
 *      1 => 'johnny'
750
 *      )
751
 *   );
752
 ))
753
 */
754
755
function ldap_servers_set_attribute_map($attribute = NULL, $conversion = NULL, $values = NULL) {
756
757
  $attribute = (is_array($attribute)) ? $attribute : array();
758
  $attribute['conversion'] = $conversion;
759
  if (!$values && (!isset($attribute['values']) || !is_array($attribute['values']))) {
760
    $attribute['values'] = array(0 => NULL);
761
  }
762
  elseif (is_array($values)) { //merge into array overwriting ordinals
763
    foreach ($values as $ordinal => $value) {
764
      if ($conversion) {
765
        $value = ldap_servers_convert_attribute($value, $conversion);
766
      }
767
      $attribute['values'][(int)$ordinal] = $value;
768
    }
769
  }
770
  return $attribute;
771
}
772
773
/**
774
 * @param string $value as value to be converted
775
 * @param string $conversion such as base64_encode, bin2hex, msguid, md5
776
 * @return converted $value
777
 */
778
function ldap_servers_convert_attribute($value, $conversion = NULL) {
779
780
      if ($conversion) {
781
782
        switch ($conversion) {
783
          case 'base64_encode':
784
            $value = base64_encode($value);
785
            break;
786
787
          case 'bin2hex':
788
            $value = bin2hex($value);
789
            break;
790
791
          case 'msguid':
792
            $value = ldap_servers_msguid($value);
793
            break;
794
795
          case 'binary':
796
            $value = ldap_servers_binary($value);
797
            break;
798
799
          case 'md5':
800
            $value = '{md5}' . base64_encode(pack('H*', md5($value)));
801
            break;
802
        }
803
804
      }
805
806
  return $value;
807
}
808
809
810
/**
811
 * disable a logon form if ldap preferences exclude http logon forms
812
 *
813
 * @param drupal logon form array $form
814
 */
815
function ldap_servers_disable_http_check(&$form) {
816
817 7547bb19 Assos Assos
  if (variable_get('ldap_servers_require_ssl_for_credentials', 0) == 1 && @$_SERVER['HTTPS'] != 'on') {
818 85ad3d82 Assos Assos
819
    $tokens = array(
820
      'site_name' => variable_get('site_name', 'this site'),
821
      'site_mail' =>  variable_get('site_mail', ''),
822
      );
823
824
    drupal_set_message(t(theme('ldap_servers_https_required', $tokens)), 'error');
825
    $form['#disabled'] = TRUE;
826
  }
827
}
828
829
function ldap_servers_ldap_extension_summary($op = 'data') {
830
  ldap_servers_module_load_include('inc', 'ldap_servers', 'ldap_servers.status');
831
  return _ldap_servers_ldap_extension_summary($op);
832
}
833
834
function ldap_servers_ldap_extension_loaded() {
835
  return extension_loaded('ldap');
836
}
837
838
function ldap_servers_encrypt($text, $encryption = NULL) {
839
  ldap_servers_module_load_include('inc', 'ldap_servers', 'ldap_servers.encryption');
840
  return _ldap_servers_encrypt($text, $encryption);
841
}
842
843
function ldap_servers_encrypt_types($category = 'all') {
844
  ldap_servers_module_load_include('inc', 'ldap_servers', 'ldap_servers.encryption');
845
  return _ldap_servers_encrypt_types($category);
846
}
847
848
function ldap_servers_decrypt($encrypted, $encryption = NULL) {
849
  ldap_servers_module_load_include('inc', 'ldap_servers', 'ldap_servers.encryption');
850
  return _ldap_servers_decrypt($encrypted, $encryption);
851
}
852
853
function ldap_servers_php_supports_pagination() {
854
  return (boolean)(function_exists('ldap_control_paged_result_response') && function_exists('ldap_control_paged_result'));
855
}
856
857
858
function ldap_servers_help($path, $arg) {
859
860
  $servers_help = '<p>' . t('LDAP Servers store "LDAP server configurations" so other modules can connect to them and leverage their data.') . ' ';
861
  $servers_help .= t('LDAP Authentication and LDAP Authorization are two such modules. Generally, only one LDAP Server configuration is needed.') . ' ' . '</p>';
862
  $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>';
863
864
  switch ($path) {
865
    case 'admin/config/people/ldap/servers':
866
      return $servers_help;
867
868
   case 'admin/help#ldap_servers':
869
      $servers_help .= '<h3>' . t('Configuration - Settings') . '</h3>';
870
      $servers_help .= '<dl>';
871
      $servers_help .= '<dt>' . t('REQUIRE HTTPS ON CREDENTIAL PAGES') . '</dt>';
872
      $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>';
873
      $servers_help .= '<dt>' . t('ENCRYPTION') . '</dt>';
874
      $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>';
875
      $servers_help .= '<dt>' . t('LOG DETAILED LDAP ACTIONS') . '</dt>';
876
      $servers_help .= '<dd>' . t('Enables LDAP logging to the Drupal Watchdog system') . '</dd>';
877
      $servers_help .= '</dl>';
878
      $servers_help .= '<h3>' . t('Configuration - Servers (List)') . '</h3>';
879
      $servers_help .= '<dl>';
880
      $servers_help .= '<dt>' . t('Configuration Table') . '</dt>';
881
      $servers_help .= '<dd>' . t('Provides a list of currently stored LDAP server configuratins.') . '</dd>';
882
      $servers_help .= '<h3>' . t('Configuration - Servers (Add LDAP Server Configuration)') . '</h3>';
883
      $servers_help .= '<dl>';
884
      $servers_help .= '<dt>' . t('CONNECTION SETTINGS') . '</dt>';
885
      $servers_help .= '<dd>' . t('Machine name -') . ' </dd>';
886
      $servers_help .= '<dd>' . t('Name -') . ' </dd>';
887
      $servers_help .= '<dd>' . t('Enabled -') . ' </dd>';
888
      $servers_help .= '<dd>' . t('LDAP Server Type') . ' </dd>';
889
      $servers_help .= '<dd>' . t('LDAP Server -') . ' </dd>';
890
      $servers_help .= '<dd>' . t('LDAP port -') . ' </dd>';
891
      $servers_help .= '<dd>' . t('Use Start-TLS -') . ' </dd>';
892
      $servers_help .= '<dd>' . t('Follow LDAP Referrals -') . ' </dd>';
893
      $servers_help .= '</dl>';
894
      $servers_help .= '<dl>';
895
      $servers_help .= '<dt>' . t('BINDING METHOD') . '</dt>';
896
      $servers_help .= '<dd>' . t('Binding Method for searches -') . ' </dd>';
897
      $servers_help .= '<dd>' . t('Service Account -') . ' </dd>';
898
      $servers_help .= '<dd>' . t('DN for non-anonymous search -') . ' </dd>';
899
      $servers_help .= '<dd>' . t('Password for non-anonymous search -') . ' </dd>';
900
      $servers_help .= '<dd>' . t('Clear existing password from database -') . ' </dd>';
901
      $servers_help .= '</dl>';
902
      $servers_help .= '<dl>';
903
      $servers_help .= '<dt>' . t('LDAP USER TO DRUPAL USER RELATIONSHIP') . '</dt>';
904
      $servers_help .= '<dd>' . t('Base DNs for LDAP Users, Groups, and Other Entries -') . ' </dd>';
905
      $servers_help .= '<dd>' . t('AuthName Attribute -') . ' </dd>';
906
      $servers_help .= '<dd>' . t('AccountName Attribute -') . ' </dd>';
907
      $servers_help .= '<dd>' . t('Email Attribute -') . ' </dd>';
908
      $servers_help .= '<dd>' . t('Email Template -') . ' </dd>';
909
      $servers_help .= '<dd>' . t('Persistant and Unique User ID Attribute -') . ' </dd>';
910
      $servers_help .= '<dd>' . t('Does PUID hold a binary value? -') . ' </dd>';
911
      $servers_help .= '<dd>' . t('Expression for User DN -') . ' </dd>';
912
      $servers_help .= '<dd>' . t('PHP to Transform Drupal Login Username to LDAP UserName Attribute -') . ' </dd>';
913
      $servers_help .= '<dd>' . t('Testing Drupal Username -') . ' </dd>';
914
      $servers_help .= '<dd>' . t('DN of Testing Username -') . ' </dd>';
915
      $servers_help .= '</dl>';
916
      return $servers_help;
917
918
    case 'admin/config/people/ldap/servers/add':
919
      $output = '<p>' . t('Setup an LDAP server configuration to be used by other modules such as LDAP Authentication, LDAP Authorization, etc.') . '</p>';
920
      $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>';
921
      return $output;
922
  }
923
}
924
925
926
/**
927
 * @return list of ldap configuration classes and names
928
 */
929
function ldap_servers_ldap_servers_types() {
930
931
  $path = drupal_get_path('module', 'ldap_servers') . '/ldap_types';
932
933
  $types['default'] =  array(
934
    'class' => t('LdapTypeDefault'),
935
    'directory_path' => $path,
936
    'name' => 'Default LDAP',
937
  );
938
939
  $types['ad'] =  array(
940
    'class' => t('LdapTypeActiveDirectory'),
941
    'directory_path' => $path,
942
    'name' => 'Active Directory',
943
  );
944
945
  $types['novell_edir'] =  array(
946
    'class' => t('LdapTypeNovell'),
947
    'directory_path' => $path,
948
    'name' => 'Novell',
949
  );
950
951
  $types['openldap'] =  array(
952
    'class' => t('LdapTypeOpenLdap'),
953
    'directory_path' => $path,
954
    'name' => 'Open LDAP',
955
  );
956
957
  $types['opendir'] =  array(
958
    'class' => t('LdapTypeOpenDirectory'),
959
    'directory_path' => $path,
960
    'name' => 'Apple Open Directory',
961
  );
962
963
  drupal_alter('ldap_servers_ldap_types', $types);
964
  return $types;
965
966
}
967
968
/**
969
 * @param string or array ldap type id or conf array
970
 * @return options for ldap type pulldown
971
 */
972
function ldap_servers_get_ldap_type_object($ldap_conf) {
973
974
  if (!is_array($ldap_conf)) {
975
    $ldap_confs = ldap_servers_ldap_servers_types();
976
    $ldap_conf = $ldap_confs[$ldap_conf];
977
  }
978
979
  require_once($ldap_conf['directory_path'] . '/' . $ldap_conf['class'] . 'class.php');
980
  $ldap_type_class = new $ldap_conf['class']();
981
  return $ldap_type_class;
982
983
}
984
985
/**
986
 * given a dn (such as cn=jdoe,ou=people)
987
 * and an rdn (such as cn)
988
 * determine that rdn value (such as jdoe)
989
 *
990
 * @param string $dn
991
 * @param string $rdn
992
 * @return string value of rdn
993
 */
994
function ldap_servers_get_first_rdn_value_from_dn($dn, $rdn) {
995
  $pairs = ldap_explode_dn($dn, 0); // escapes attribute values, need to be unescaped later
996
  $count = array_shift($pairs);
997
  $rdn = drupal_strtolower($rdn);
998
  $rdn_value = FALSE;
999
  foreach ($pairs as $p) {
1000
    $pair = explode('=', $p);
1001
    if (drupal_strtolower(trim($pair[0])) == $rdn) {
1002
      $rdn_value = ldap_pear_unescape_dn_value(trim($pair[1]));
1003
      break;
1004
    }
1005
  }
1006
  return $rdn_value;
1007
}
1008
1009
/**
1010
 * given a dn (such as cn=jdoe,ou=people)
1011
 * and an rdn (such as cn)
1012
 * determine that rdn value (such as jdoe)
1013
 *
1014
 * @param string $dn
1015
 * @param string $rdn
1016
 * @return array of all values of rdn
1017
 */
1018
function ldap_servers_get_all_rdn_values_from_dn($dn, $rdn) {
1019
  $pairs = ldap_explode_dn($dn, 0); // escapes attribute values, need to be unescaped later
1020
  $count = array_shift($pairs);
1021
  $rdn = drupal_strtolower($rdn);
1022
  $rdn_values = array();
1023
  foreach ($pairs as $p) {
1024
    $pair = explode('=', $p);
1025
    if (drupal_strtolower(trim($pair[0])) == $rdn) {
1026
      $rdn_values[] = ldap_pear_unescape_dn_value(trim($pair[1]));
1027
    }
1028
  }
1029
  return $rdn_values;
1030
}
1031
1032
1033
/**
1034
 * @return options for ldap type pulldown
1035
 */
1036
function ldap_servers_ldaps_option_array() {
1037
1038
  $options = array();
1039
  foreach (ldap_servers_ldap_servers_types() as $ldap_id => $conf) {
1040
    $options[$ldap_id] = $conf['name'];
1041
  }
1042
  return $options;
1043
1044
}
1045
1046
/**
1047
 * @param string $ldap_type indicating ldap type 'default','ad','novell_edir', 'openldap'
1048
 * @param boolean $reset clear static array
1049
 * @param boolean $flatted indicating if only one ldap type returned, skip top level array key
1050
 *
1051
 * @return one or more ldap type objects
1052
 */
1053
function ldap_servers_get_types($ldap_type = NULL, $reset = FALSE, $flatten = FALSE) {
1054
  static $ldap_types;
1055
  if ($reset || !is_array($ldap_types)) {
1056
    $ldap_types = module_invoke_all('ldap_servers_type');
1057
    if ($ldap_type) {
1058
      require_once($ldap_types[$ldap_type]['directory_path'] . '/' . $ldap_types[$ldap_type]['class'] . '.class.php');
1059
      $ldap_types[$ldap_type] = new $ldap_types[$ldap_type]['class'] . '.class.php';
1060
    }
1061
    else {
1062
      foreach ($ldap_types as $ldap_type_id => $ldap_class_info) {
1063
        require_once($ldap_class_info['directory_path'] . '/' . $ldap_class_info['class'] . '.class.php');
1064
        $ldap_types[$ldap_type_id] = new $ldap_class_info['class'];
1065
      }
1066
    }
1067
  }
1068
  if ($flatten && $ldap_type) {
1069
    return $ldap_types[$ldap_type];
1070
  }
1071
  else {
1072
    return $ldap_types;
1073
  }
1074
}
1075
1076
1077
function ldap_servers_no_enabled_servers_msg($action) {
1078
1079
  $servers = ldap_servers_get_servers(NULL, 'enabled');
1080
  if (count($servers) == 0) {
1081
1082
    $message = t('At least one ldap server must configured and <em>enabled</em> before') .
1083
      $action . '. ' . t('Please go to') . ' ' . l('admin/config/people/ldap/servers', 'admin/config/people/ldap/servers') . ' to configure an LDAP server';
1084
1085
    drupal_set_message($message, 'warning');
1086
    return $message;
1087
  }
1088
}