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
<?php
2

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

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

    
11
define('LDAP_TEST_QUERY_CONTEXT', 999);
12

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

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

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

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

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

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

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

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

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

    
60
define('LDAP_SERVER_GROUPS_RECURSE_DEPTH', 20);
61

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
241
  return $items;
242
}
243

    
244

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

    
278

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

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

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

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

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

    
344

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

    
349
function ldap_servers_ldap_user_attrs_list_alter(&$available_user_attrs, &$params) {
350
  //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
  //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
  // 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
        !empty($drupal_user->ldap_user_puid_sid[LANGUAGE_NONE][0]['value'])
705
      ) {
706
      $sid = $drupal_user->ldap_user_puid_sid[LANGUAGE_NONE][0]['value'];
707
    }
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
  if (variable_get('ldap_servers_require_ssl_for_credentials', 0) == 1 && @$_SERVER['HTTPS'] != 'on') {
818

    
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
}