Projet

Général

Profil

Paste
Télécharger (16,8 ko) Statistiques
| Branche: | Révision:

root / drupal7 / sites / all / modules / ldap / ldap_servers / ldap_servers.test_form.inc @ 91af538d

1
<?php
2

    
3
/**
4
 * @file
5
 */
6

    
7
module_load_include('inc', 'ldap_servers', 'ldap_servers.functions');
8

    
9
/**
10
 * @file
11
 */
12

    
13
/**
14
 * Implements the LDAP server test page.
15
 *
16
 * @param $form_state
17
 *   A form state array.
18
 * @param $op
19
 *   An operatin - add or edit.
20
 * @param $sid
21
 *   A LDAP server ID.
22
 *
23
 * @return
24
 *   The form structure.
25
 */
26
function ldap_servers_test_form($form, &$form_state, $op = NULL, $sid = NULL) {
27

    
28
  $ldap_server = ldap_servers_get_servers($sid, 'all', TRUE);
29

    
30
  drupal_set_title(t('Test LDAP Server Configuration: !server', ['!server' => $ldap_server->name]));
31

    
32
  $form['#prefix'] = t('This form tests an LDAP configuration to see if
33
    it can bind and basic user and group functions.  It also shows token examples
34
    and a sample user.  The only data this function will modify is the test LDAP group, which will be deleted and added');
35

    
36
  $variables = [
37
    'ldap_server' => $ldap_server,
38
    'actions' => FALSE,
39
    'type' => 'detail',
40
  ];
41

    
42
  $form['server_variables'] = [
43
    '#markup' => theme('ldap_servers_server', $variables),
44
  ];
45

    
46
  $form['sid'] = [
47
    '#type' => 'hidden',
48
    '#default_value' => $sid,
49
  ];
50

    
51
  $form['binding']['bindpw'] = [
52
    '#type' => 'password',
53
    '#title' => t('Password for non-anonymous search'),
54
    '#size' => 20,
55
    '#maxlength' => 255,
56
    '#description' => t('Leave empty to test with currently stored password.'),
57
  ];
58

    
59
  $form['testing_drupal_username'] = [
60
    '#type' => 'textfield',
61
    '#title' => t('Testing Drupal Username'),
62
    '#default_value' => $ldap_server->testingDrupalUsername,
63
    '#size' => 30,
64
    '#maxlength' => 255,
65
    '#description' => t('This is optional and used for testing this server\'s configuration against an actual username.  The user need not exist in Drupal and testing will not affect the user\'s LDAP or Drupal Account.'),
66
  ];
67

    
68
  $form['testingDrupalUserDn'] = [
69
    '#type' => 'textfield',
70
    '#title' => t('Testing Drupal DN'),
71
    '#default_value' => $ldap_server->testingDrupalUserDn,
72
    '#size' => 120,
73
    '#maxlength' => 255,
74
    '#description' => t('This is optional and used for testing this server\'s configuration against an actual username.  The user need not exist in Drupal and testing will not affect the user\'s LDAP or Drupal Account.'),
75
  ];
76

    
77
  $form['grp_test_grp_dn'] = [
78
    '#type' => 'textfield',
79
    '#title' => t('Testing Group DN'),
80
    '#default_value' => $ldap_server->groupTestGroupDn,
81
    '#size' => 120,
82
    '#maxlength' => 255,
83
    '#description' => t('This is optional and used for testing this server\'s group configuration.'),
84
  ];
85

    
86
  $form['grp_test_grp_dn_writeable'] = [
87
    '#type' => 'textfield',
88
    '#title' => t('Testing Group DN that is writeable. Warning!  In test, this group will be deleted, created, have members added to it!'),
89
    '#default_value' => $ldap_server->groupTestGroupDnWriteable,
90
    '#size' => 120,
91
    '#maxlength' => 255,
92
    '#description' => t('This is optional and used for testing this server\'s group configuration.'),
93
  ];
94

    
95
  if ($ldap_server->bind_method == LDAP_SERVERS_BIND_METHOD_ANON_USER) {
96
    $form['testing_drupal_userpw'] = [
97
      '#type' => 'password',
98
      '#title' => t('Testing Drupal User Password'),
99
      '#size' => 30,
100
      '#maxlength' => 255,
101
      '#description' => t('This is optional and used for testing this server\'s configuration against the username above.'),
102
    ];
103
  }
104

    
105
  $form['submit'] = [
106
    '#type' => 'submit',
107
    '#value' => 'Test',
108
    '#weight' => 100,
109
  ];
110

    
111
  if (!empty($form_state['ldap_server_test_data'])) {
112
    $test_data = $form_state['ldap_server_test_data'];
113

    
114
    if (isset($test_data['username']) && isset($test_data['ldap_user'])) {
115
      $form['#prefix'] = theme('ldap_server_ldap_entry_table',
116
        [
117
          'entry' => $test_data['ldap_user']['attr'],
118
          'username' => $test_data['username'],
119
          'dn' => $test_data['ldap_user']['dn'],
120
        ]);
121
    }
122

    
123
    $titles = [
124
      'basic' => 'Test Results',
125
      'group1' => 'Group Create, Delete, Add Member, Remove Member Tests',
126
      'group2' => 'User Group Membership Functions Test',
127
      'tokens' => 'User Token Samples',
128
      'groupfromDN' => 'Groups Derived From User DN',
129
    ];
130
    foreach ($test_data['results_tables'] as $table_name => $table_data) {
131
      $form['#prefix'] .= '<h2>' . $titles[$table_name] . '</h2>' . theme('table', ['header' => ['Test', 'Result'], 'rows' => $table_data]);
132
    }
133

    
134
    if (function_exists('dpm') && !empty($test_data['username'])) {
135
      $user_name = $test_data['username'];
136
      if ($user = user_load_by_name($user_name)) {
137
        dpm("Corresponding Drupal user object for: $user_name");
138
        dpm($user);
139
        if (function_exists('entity_load_single')) {
140
          $user_entity = entity_load_single('user', $user->uid);
141
          dpm("Drupal user entity for: $user_name");
142
          dpm($user_entity);
143
        }
144
        if (isset($test_data['group_entry'][0])) {
145
          dpm("Test Group LDAP Entry");
146
          dpm($test_data['group_entry'][0]);
147
        }
148
      }
149
    }
150
  }
151
  return $form;
152
}
153

    
154
/**
155
 *
156
 */
157
function ldap_servers_string_binary_check($input) {
158
  if (preg_match('~[^\x20-\x7E\t\r\n]~', $input) > 0) {
159
    $truncatedString = truncate_utf8($input, 200);
160
    return t('Binary (excerpt): @excerpt', ['@excerpt' => $truncatedString]);
161
  }
162
  else {
163
    return $input;
164
  }
165
}
166

    
167
/**
168
 * Validate hook for the LDAP server form.
169
 */
170
function ldap_servers_test_form_validate($form, &$form_state) {
171
  $values = $form_state['values'];
172
  if (!$values['sid']) {
173
    form_set_error(NULL, t('No server id found in form'));
174
  }
175
  elseif (!$ldap_server = ldap_servers_get_servers($values['sid'], 'all', TRUE)) {
176
    form_set_error(NULL, t('Failed to create server object for server with server id=%sid', ['%sid' => $values['sid']]));
177
  }
178
}
179

    
180
/**
181
 * Submit hook for the LDAP server form.
182
 */
183
function ldap_servers_test_form_submit($form, &$form_state) {
184

    
185
  // Pass data back to form builder.
186
  $form_state['rebuild'] = TRUE;
187

    
188
  ldap_servers_module_load_include('inc', 'ldap_servers', 'ldap_servers.functions');
189
  $errors = FALSE;
190
  $has_errors = FALSE;
191
  $values = $form_state['values'];
192
  $sid = $values['sid'];
193
  $ldap_server = ldap_servers_get_servers($sid, 'all', TRUE);
194

    
195
  $results = [];
196
  $results_tables = [];
197
  if ($values['bindpw']) {
198
    $bindpw = $values['bindpw'];
199
    $bindpw_type = t('entered in form.');
200
  }
201
  else {
202
    $bindpw = NULL;
203
    $bindpw_type = t('stored in configuration');
204
  }
205

    
206
  if ($ldap_server->bind_method == LDAP_SERVERS_BIND_METHOD_SERVICE_ACCT) {
207
    $results_tables['basic'][] = [
208
      t('Binding with DN for non-anonymous search (%bind_dn).  Using password ',
209
      ['%bind_dn' => $ldap_server->binddn]) . ' ' . $bindpw_type,
210
    ];
211
  }
212
  else {
213
    $results_tables['basic'][] = [t('Binding with null DN for anonymous search.')];
214
  }
215

    
216
  if (@$values['grp_test_grp_dn_writeable'] && @$values['grp_test_grp_dn']) {
217
    $user_test_dn = @$values['grp_test_grp_dn'];
218
    $group_create_test_dn = $values['grp_test_grp_dn_writeable'];
219
    $group_create_test_attr = [
220
      'objectClass' => [$ldap_server->groupObjectClass, 'top'],
221
    ];
222

    
223
    // 1. delete test group if it exists.
224
    if ($ldap_server->dnExists($group_create_test_dn, 'ldap_entry', ['cn', 'member'])) {
225
      $result = $ldap_server->groupRemoveGroup($group_create_test_dn, FALSE);
226
    }
227

    
228
    $group_exists = $ldap_server->dnExists($group_create_test_dn, 'ldap_entry', ['cn', 'member']);
229
    $result = ($group_exists === FALSE) ? "PASS" : "FAIL";
230
    $results_tables['group1'][] = ["Starting test without group: $group_create_test_dn ", $result];
231

    
232
    // 2. make sure call to members in empty group returns false.
233
    $result = $ldap_server->groupAllMembers($group_create_test_dn);
234
    $result = ($result === FALSE) ? "PASS" : 'FAIL';
235
    $results_tables['group1'][] = ["LdapServer::groupAllMembers($group_create_test_dn) call on nonexistent group returns FALSE", $result];
236

    
237
    // 3. add group.
238
    $result = $ldap_server->groupAddGroup($group_create_test_dn, $group_create_test_attr);
239
    $result = ($result) ? "PASS" : 'FAIL';
240
    $attr = serialize($group_create_test_attr);
241
    $results_tables['group1'][] = ["LdapServer::groupAddGroup($group_create_test_dn, $attr)", $result];
242

    
243
    // 4. call to all members in an empty group returns emtpy array, not FALSE.
244
    $result = $ldap_server->groupAllMembers($group_create_test_dn);
245
    $result = (is_array($result) && count($result) == 0) ? 'PASS' : 'FAIL';
246
    $results_tables['group1'][] = ["LdapServer::groupAllMembers($group_create_test_dn) returns empty array for empty group ", $result];
247

    
248
    // 5. add member to group.
249
    $result = $ldap_server->groupAddMember($group_create_test_dn, $user_test_dn);
250
    $result = is_array($ldap_server->groupAllMembers($group_create_test_dn)) ? 'PASS' : 'FAIL';
251
    $results_tables['group1'][] = ["LdapServer::groupAddMember($group_create_test_dn, $user_test_dn)", $result];
252

    
253
    // 6. try to remove group with member in it.
254
    $only_if_group_empty = TRUE;
255
    $result = $ldap_server->groupRemoveGroup($group_create_test_dn, $only_if_group_empty);
256
    $result = ($result) ? 'FAIL' : 'PASS';
257
    $results_tables['group1'][] = ["LdapServer::groupRemoveGroup($group_create_test_dn, $only_if_group_empty)", $result];
258

    
259
    // 7. remove group member.
260
    $result = $ldap_server->groupRemoveMember($group_create_test_dn, $user_test_dn);
261
    $result = $ldap_server->groupAllMembers($group_create_test_dn);
262
    $result = (is_array($result) && count($result) == 0) ? 'PASS' : 'FAIL';
263
    $results_tables['group1'][] = ["LdapServer::groupRemoveMember($group_create_test_dn, $user_test_dn)", $result];
264

    
265
    $only_if_group_empty = TRUE;
266
    $result = $ldap_server->groupRemoveGroup($group_create_test_dn, $only_if_group_empty);
267
    $result = ($ldap_server->dnExists($group_create_test_dn, 'ldap_entry', ['cn', 'member'])) ? "FAIL" : 'PASS';
268
    $results_tables['group1'][] = ["LdapServer::groupRemoveGroup($group_create_test_dn, $only_if_group_empty)", $result];
269
  }
270

    
271
  // Connect to ldap.
272
  list($has_errors, $more_results) = ldap_servers_test_binding_credentials($ldap_server, $bindpw, $results_tables);
273
  $results = array_merge($results, $more_results);
274
  if ($ldap_server->bind_method == LDAP_SERVERS_BIND_METHOD_ANON_USER) {
275
    list($has_errors, $more_results, $ldap_user) = ldap_servers_test_user_mapping($values['testing_drupal_username'], $ldap_server);
276
    $results = array_merge($results, $more_results);
277
    if (!$has_errors) {
278
      $mapping[] = "dn = " . $ldap_user['dn'];
279
      foreach ($ldap_user['attr'] as $key => $value) {
280
        if (is_array($value)) {
281
          $mapping[] = "$key = " . $value[0];
282
        }
283
      }
284
      $results_tables['basic'][] = [theme_item_list(['items' => $mapping, 'title' => t('Attributes available to anonymous search', ['%bind_dn' => $ldap_server->binddn]), 'type' => 'ul', 'attributes' => []])];
285
    }
286
    $results_tables['basic'][] = [
287
      t('Binding with DN (%bind_dn).  Using supplied password ',
288
      ['%bind_dn' => $ldap_user['dn']]),
289
    ];
290
    $result = $ldap_server->bind($ldap_user['dn'], $values['testing_drupal_userpw'], FALSE);
291
    if ($result == LDAP_SUCCESS) {
292
      $results_tables['basic'][] = [t('Successfully bound to server'), 'PASS'];
293
    }
294
    else {
295
      $results_tables['basic'][] = [t('Failed to bind to server. ldap error #') . $result . ' ' . $ldap_server->errorMsg('ldap'), 'FAIL'];
296
    }
297
  }
298

    
299
  if (!$has_errors && isset($values['grp_test_grp_dn'])) {
300
    $group_dn = $values['grp_test_grp_dn'];
301

    
302
    $result = @ldap_read($ldap_server->connection, $group_dn, 'objectClass=*');
303
    if (is_array($result)) {
304
      $group_entry = ldap_get_entries($ldap_server->connection, $result);
305
    }
306
    $user = isset($values['testing_drupal_username']) ? $values['testing_drupal_username'] : NULL;
307

    
308
    // FALSE.
309
    foreach ([FALSE, TRUE] as $nested) {
310
      $nested_display = ($nested) ? 'Yes' : 'No';
311
      if ($user) {
312
        // This is the parent function that will call FromUserAttr or FromEntry.
313
        $memberships = $ldap_server->groupMembershipsFromUser($user, 'group_dns', $nested);
314
        $result = theme('item_list', ['items' => $memberships, 'type' => 'ul']);
315
        $results_tables['group2'][] = ["ldap_server->groupMembershipsFromUser($user, 'group_dns', nested=$nested_display)<br/>count=" . count($memberships), $result];
316

    
317
        $result = ($ldap_server->groupIsMember($group_dn, $user, $nested)) ? 'Yes' : 'No';
318
        $group_results[] = ["ldap_server->groupIsMember($group_dn, $user, nested=$nested_display)", $result];
319

    
320
        if ($ldap_server->groupUserMembershipsConfigured) {
321
          $groupusermembershipsfromuserattr = $ldap_server->groupUserMembershipsFromUserAttr($user, $nested);
322
          $count = count($groupusermembershipsfromuserattr);
323
          $result = theme('item_list', ['items' => $groupusermembershipsfromuserattr, 'type' => 'ul']);
324
        }
325
        else {
326
          $groupusermembershipsfromuserattr = [];
327
          $result = "'A user LDAP attribute such as memberOf exists that contains a list of their group' is not configured.";
328
        }
329
        $results_tables['group2'][] = [
330
          "ldap_server->groupUserMembershipsFromUserAttr($user, nested=$nested_display)<br/> count=" .
331
          count($groupusermembershipsfromuserattr), $result,
332
        ];
333

    
334
        if ($ldap_server->groupGroupEntryMembershipsConfigured) {
335
          $groupusermembershipsfromentry = $ldap_server->groupUserMembershipsFromEntry($user, $nested);
336
          $result = theme('item_list', ['items' => $groupusermembershipsfromentry, 'type' => 'ul']);
337
        }
338
        else {
339
          $groupusermembershipsfromentry = [];
340
          $result = "Groups by entry not configured.";
341
        }
342
        $results_tables['group2'][] = [
343
          "ldap_server->groupUserMembershipsFromEntry($user, nested=$nested_display)<br/>count=" .
344
          count($groupusermembershipsfromentry), $result,
345
        ];
346

    
347
        if (count($groupusermembershipsfromentry) && count($groupusermembershipsfromuserattr)) {
348
          $diff1 = array_diff($groupusermembershipsfromuserattr, $groupusermembershipsfromentry);
349
          $diff2 = array_diff($groupusermembershipsfromentry, $groupusermembershipsfromuserattr);
350
          $result1 = theme('item_list', ['items' => $diff1, 'type' => 'ul']);
351
          $result2 = theme('item_list', ['items' => $diff2, 'type' => 'ul']);
352
          $results_tables['group2'][] = ["groupUserMembershipsFromEntry and FromUserAttr Diff)", $result1];
353
          $results_tables['group2'][] = ["FromUserAttr and groupUserMembershipsFromEntry Diff)", $result2];
354
        }
355
      }
356
    }
357

    
358
    if ($groups_from_dn = $ldap_server->groupUserMembershipsFromDn($user)) {
359
      $results_tables['groupfromDN'][] = ["Groups from DN", theme('item_list', ['items' => $groups_from_dn, 'type' => 'ul'])];
360
    }
361

    
362
  }
363

    
364
  list($has_errors, $more_results, $ldap_user) = ldap_servers_test_user_mapping($values['testing_drupal_username'], $ldap_server);
365

    
366
  $tokens = ($ldap_user && isset($ldap_user['attr'])) ? ldap_servers_token_tokenize_entry($ldap_user['attr'], 'all') : [];
367
  foreach ($tokens as $key => $value) {
368
    $results_tables['tokens'][] = [$key, ldap_servers_string_binary_check($value)];
369
  }
370
  $form_state['ldap_server_test_data'] = [
371
    'username' => $values['testing_drupal_username'],
372
    'results_tables' => $results_tables,
373
  ];
374

    
375
  if (isset($ldap_user)) {
376
    $form_state['ldap_server_test_data']['ldap_user'] = $ldap_user;
377
  }
378

    
379
  if (isset($group_entry)) {
380
    $form_state['ldap_server_test_data']['group_entry'] = $group_entry;
381
  }
382

    
383
}
384

    
385
/**
386
 * Submit hook for the LDAP server form.
387
 */
388
function ldap_servers_test_binding_credentials(&$ldap_server, $bindpw, &$results_tables) {
389

    
390
  $errors = FALSE;
391
  $results = [];
392

    
393
  $ldap_result = $ldap_server->connect();
394
  if ($ldap_result != LDAP_SUCCESS) {
395
    $results_tables['basic'][] = [
396
      t('Failed to connect to LDAP server.  See watchdog error logs for details.') .
397
      $ldap_server->errorMsg('ldap'),
398
    ];
399
    $errors = TRUE;
400
  }
401

    
402
  if (!$errors) {
403
    $bind_result = $ldap_server->bind($ldap_server->binddn, $bindpw, FALSE);
404
    if ($bind_result == LDAP_SUCCESS) {
405
      $results_tables['basic'][] = [t('Successfully bound to server')];
406
    }
407
    else {
408
      $results_tables['basic'][] = [t('Failed to bind to server. ldap error #') . $bind_result . ' ' . $ldap_server->errorMsg('ldap')];
409
      $errors = TRUE;
410
    }
411
  }
412
  return [$errors, $results];
413
}
414

    
415
/**
416
 *
417
 */
418
function ldap_servers_test_user_mapping($drupal_username, &$ldap_server, $ldap_context = NULL) {
419

    
420
  $ldap_user = $ldap_server->userUserNameToExistingLdapEntry($drupal_username, $ldap_context);
421
  $errors = FALSE;
422
  if (!$ldap_user) {
423
    $results[] = t('Failed to find test user %username by searching on  %user_attr = %username.',
424
      [
425
        '%username' => $drupal_username,
426
        '%user_attr' => $ldap_server->user_attr,
427
      ]
428
      )
429
      . ' ' . t('Error Message:') . ' ' . $ldap_server->errorMsg('ldap');
430
    $errors = TRUE;
431
  }
432
  else {
433
    $results[] = t('Found test user %username by searching on  %user_attr = %username.',
434
      ['%username' => $drupal_username, '%user_attr' => $ldap_server->user_attr]);
435
  }
436
  return [$errors, $results, $ldap_user];
437
}