Projet

Général

Profil

Paste
Télécharger (17,1 ko) Statistiques
| Branche: | Révision:

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

1 85ad3d82 Assos Assos
<?php
2
3 bc175c27 Assos Assos
/**
4
 * @file
5
 */
6
7 85ad3d82 Assos Assos
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
27
function ldap_servers_test_form($form, &$form_state, $op = NULL, $sid = NULL) {
28
29
  $ldap_server = ldap_servers_get_servers($sid, 'all', TRUE);
30
31
  drupal_set_title(t('Test LDAP Server Configuration: !server', array('!server' => $ldap_server->name)));
32
33
  $form['#prefix'] = t('This form tests an LDAP configuration to see if
34
    it can bind and basic user and group functions.  It also shows token examples
35
    and a sample user.  The only data this function will modify is the test LDAP group, which will be deleted and added');
36
37
  $variables = array(
38
    'ldap_server' => $ldap_server, 'actions' => FALSE, 'type' => 'detail'
39
  );
40
41
  $form['server_variables'] = array(
42
    '#markup' => theme('ldap_servers_server', $variables),
43
  );
44
45
  $form['sid'] = array(
46
    '#type' => 'hidden',
47
    '#default_value' => $sid,
48
  );
49
50
  $form['binding']['bindpw'] = array(
51
    '#type' => 'password',
52
    '#title' => t('Password for non-anonymous search'),
53
    '#size' => 20,
54
    '#maxlength' => 255,
55
    '#description' => t('Leave empty to test with currently stored password.'),
56
  );
57
58
  $form['testing_drupal_username'] = array(
59
    '#type' => 'textfield',
60
    '#title' => t('Testing Drupal Username'),
61
    '#default_value' => $ldap_server->testingDrupalUsername,
62
    '#size' => 30,
63
    '#maxlength' => 255,
64
    '#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.'),
65
  );
66
67
  $form['testingDrupalUserDn'] = array(
68
    '#type' => 'textfield',
69
    '#title' => t('Testing Drupal DN'),
70
    '#default_value' => $ldap_server->testingDrupalUserDn,
71
    '#size' => 120,
72
    '#maxlength' => 255,
73
    '#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.'),
74
  );
75
76
  $form['grp_test_grp_dn'] = array(
77
    '#type' => 'textfield',
78
    '#title' => t('Testing Group DN'),
79
    '#default_value' => $ldap_server->groupTestGroupDn,
80
    '#size' => 120,
81
    '#maxlength' => 255,
82
    '#description' => t('This is optional and used for testing this server\'s group configuration.'),
83
  );
84
85
  $form['grp_test_grp_dn_writeable'] = array(
86
    '#type' => 'textfield',
87
    '#title' => t('Testing Group DN that is writeable. Warning!  In test, this group will be deleted, created, have members added to it!'),
88
    '#default_value' => $ldap_server->groupTestGroupDnWriteable,
89
    '#size' => 120,
90
    '#maxlength' => 255,
91
    '#description' => t('This is optional and used for testing this server\'s group configuration.'),
92
  );
93
94 bc175c27 Assos Assos
  if ($ldap_server->bind_method == LDAP_SERVERS_BIND_METHOD_ANON_USER) {
95 85ad3d82 Assos Assos
    $form['testing_drupal_userpw'] = array(
96
      '#type' => 'password',
97
      '#title' => t('Testing Drupal User Password'),
98
      '#size' => 30,
99
      '#maxlength' => 255,
100
      '#description' => t('This is optional and used for testing this server\'s configuration against the username above.'),
101
    );
102
  }
103
104
  $form['submit'] = array(
105
    '#type' => 'submit',
106
    '#value' => 'Test',
107
    '#weight' => 100,
108
  );
109
110
  if (!empty($form_state['ldap_server_test_data'])) {
111
    $test_data = $form_state['ldap_server_test_data'];
112
113
    if (isset($test_data['username']) && isset($test_data['ldap_user'])) {
114
      $form['#prefix'] = theme('ldap_server_ldap_entry_table',
115
        array(
116
          'entry' => $test_data['ldap_user']['attr'],
117
          'username' => $test_data['username'],
118
          'dn' => $test_data['ldap_user']['dn'],
119
        ));
120
    }
121
122
    $titles = array(
123
      'basic' => 'Test Results',
124
      'group1' => 'Group Create, Delete, Add Member, Remove Member Tests',
125
      'group2' => 'User Group Membership Functions Test',
126
      'tokens' => 'User Token Samples',
127
      'groupfromDN' => 'Groups Derived From User DN',
128
    );
129
    foreach ($test_data['results_tables'] as $table_name => $table_data) {
130
      $form['#prefix'] .= '<h2>' . $titles[$table_name] . '</h2>' . theme('table', array('header' => array('Test', 'Result'), 'rows' => $table_data));
131
    }
132
133
    if (function_exists('dpm') && !empty($test_data['username'])) {
134
      $user_name = $test_data['username'];
135
      if ($user = user_load_by_name($user_name)) {
136
        dpm("Corresponding Drupal user object for: $user_name");
137
        dpm($user);
138
        if (function_exists('entity_load_single')) {
139
          $user_entity = entity_load_single('user', $user->uid);
140
          dpm("Drupal user entity for: $user_name");
141
          dpm($user_entity);
142
        }
143 bc175c27 Assos Assos
        if (isset($test_data['group_entry'][0])) {
144
          dpm("Test Group LDAP Entry");
145
          dpm($test_data['group_entry'][0]);
146
        }
147 85ad3d82 Assos Assos
      }
148
    }
149
  }
150
  return $form;
151
}
152
153 bc175c27 Assos Assos
function ldap_servers_string_binary_check($input) {
154
  if (preg_match('~[^\x20-\x7E\t\r\n]~', $input) > 0) {
155
    $truncatedString = truncate_utf8($input, 200);
156
    return t('Binary (excerpt): @excerpt', ['@excerpt' => $truncatedString]);
157
  }
158
  else {
159
    return $input;
160
  }
161
}
162
163 85ad3d82 Assos Assos
/**
164
 * Validate hook for the LDAP server form.
165
 */
166
function ldap_servers_test_form_validate($form, &$form_state) {
167
  $values = $form_state['values'];
168
  if (!$values['sid']) {
169
    form_set_error(NULL, t('No server id found in form'));
170
  }
171
  elseif (!$ldap_server = ldap_servers_get_servers($values['sid'], 'all', TRUE)) {
172
    form_set_error(NULL, t('Failed to create server object for server with server id=%sid', array('%sid' => $values['sid'])));
173
  }
174
}
175
176
/**
177
 * Submit hook for the LDAP server form.
178
 */
179
function ldap_servers_test_form_submit($form, &$form_state) {
180
181
  //Pass data back to form builder
182
  $form_state['rebuild'] = TRUE;
183
184
  ldap_servers_module_load_include('inc', 'ldap_servers', 'ldap_servers.functions');
185
  $errors = FALSE;
186
  $has_errors = FALSE;
187
  $values = $form_state['values'];
188
  $sid = $values['sid'];
189
  $ldap_server = ldap_servers_get_servers($sid, 'all', TRUE);
190
191
  //$result = t('<h1>Test of name </h2>',$server_conf);
192
  $results = array();
193
  $results_tables = array();
194
  if ($values['bindpw']) {
195
    $bindpw = $values['bindpw'];
196
    $bindpw_type = t('entered in form.');
197
  }
198
  else {
199
    $bindpw = NULL;
200
    $bindpw_type = t('stored in configuration');
201
  }
202
203
  if ($ldap_server->bind_method == LDAP_SERVERS_BIND_METHOD_SERVICE_ACCT) {
204
    $results_tables['basic'][] = array(t('Binding with DN for non-anonymous search (%bind_dn).  Using password ',
205 bc175c27 Assos Assos
      array('%bind_dn' => $ldap_server->binddn)) . ' ' . $bindpw_type);
206 85ad3d82 Assos Assos
  }
207
  else {
208
    $results_tables['basic'][] = array(t('Binding with null DN for anonymous search.'));
209
  }
210
211
  if (@$values['grp_test_grp_dn_writeable'] && @$values['grp_test_grp_dn']) {
212
    $user_test_dn = @$values['grp_test_grp_dn'];
213
    $group_create_test_dn = $values['grp_test_grp_dn_writeable'];
214
    $group_create_test_attr = array(
215
      'objectClass' => array($ldap_server->groupObjectClass, 'top'),
216
    );
217
218
    // 1. delete test group if it exists
219
    if ($ldap_server->dnExists($group_create_test_dn, 'ldap_entry', array('cn', 'member'))) {
220
      $result = $ldap_server->groupRemoveGroup($group_create_test_dn, FALSE);
221
    }
222
223
    $group_exists = $ldap_server->dnExists($group_create_test_dn, 'ldap_entry', array('cn', 'member'));
224
    $result = ($group_exists === FALSE) ? "PASS" : "FAIL";
225
    $results_tables['group1'][] = array("Starting test without group: $group_create_test_dn ", $result);
226
227
    // 2. make sure call to members in empty group returns false
228
    $result = $ldap_server->groupAllMembers($group_create_test_dn);
229
    $result = ($result === FALSE) ? "PASS" : 'FAIL';
230
    $results_tables['group1'][] = array("LdapServer::groupAllMembers($group_create_test_dn) call on nonexistent group returns FALSE", $result);
231
232
    // 3. add group
233
    $result = $ldap_server->groupAddGroup($group_create_test_dn, $group_create_test_attr);
234 bc175c27 Assos Assos
    $result = ($result) ? "PASS" : 'FAIL';
235 85ad3d82 Assos Assos
    $attr = serialize($group_create_test_attr);
236
    $results_tables['group1'][] = array("LdapServer::groupAddGroup($group_create_test_dn, $attr)", $result);
237
238
    // 4. call to all members in an empty group returns emtpy array, not FALSE
239
    $result = $ldap_server->groupAllMembers($group_create_test_dn);
240 bc175c27 Assos Assos
    $result = (is_array($result) && count($result) == 0) ? 'PASS' : 'FAIL';
241 85ad3d82 Assos Assos
    $results_tables['group1'][] = array("LdapServer::groupAllMembers($group_create_test_dn) returns empty array for empty group ", $result);
242
243
    // 5. add member to group
244
    $result = $ldap_server->groupAddMember($group_create_test_dn, $user_test_dn);
245
    $result = is_array($ldap_server->groupAllMembers($group_create_test_dn)) ? 'PASS' : 'FAIL';
246
    $results_tables['group1'][] = array("LdapServer::groupAddMember($group_create_test_dn, $user_test_dn)", $result);
247
248
   // 6. try to remove group with member in it
249
    $only_if_group_empty = TRUE;
250
    $result = $ldap_server->groupRemoveGroup($group_create_test_dn, $only_if_group_empty);
251
    $result = ($result) ? 'FAIL' : 'PASS';
252
    $results_tables['group1'][] = array("LdapServer::groupRemoveGroup($group_create_test_dn, $only_if_group_empty)", $result);
253
254
   // 7. remove group member
255
    $result = $ldap_server->groupRemoveMember($group_create_test_dn, $user_test_dn);
256
    $result = $ldap_server->groupAllMembers($group_create_test_dn);
257
    $result = (is_array($result) && count($result) == 0) ? 'PASS' : 'FAIL';
258
    $results_tables['group1'][] = array("LdapServer::groupRemoveMember($group_create_test_dn, $user_test_dn)", $result);
259
260
    $only_if_group_empty = TRUE;
261
    $result = $ldap_server->groupRemoveGroup($group_create_test_dn, $only_if_group_empty);
262 bc175c27 Assos Assos
    $result = ($ldap_server->dnExists($group_create_test_dn, 'ldap_entry', array('cn', 'member'))) ? "FAIL" : 'PASS';
263 85ad3d82 Assos Assos
    $results_tables['group1'][] = array("LdapServer::groupRemoveGroup($group_create_test_dn, $only_if_group_empty)", $result);
264
  }
265
266
  // connect to ldap
267
  list($has_errors, $more_results) = ldap_servers_test_binding_credentials($ldap_server, $bindpw, $results_tables);
268
  $results = array_merge($results, $more_results);
269
  if ($ldap_server->bind_method == LDAP_SERVERS_BIND_METHOD_ANON_USER) {
270
    list($has_errors, $more_results, $ldap_user) = ldap_servers_test_user_mapping($values['testing_drupal_username'], $ldap_server);
271
    $results = array_merge($results, $more_results);
272
    if (!$has_errors) {
273
      $mapping[] = "dn = " . $ldap_user['dn'];
274
      foreach ($ldap_user['attr'] as $key => $value) {
275
        if (is_array($value)) {
276
          $mapping[] = "$key = " . $value[0];
277
        }
278
      }
279 bc175c27 Assos Assos
      $results_tables['basic'][] = array(theme_item_list(array('items' => $mapping, 'title' => t('Attributes available to anonymous search', array('%bind_dn' => $ldap_server->binddn)) , 'type' => 'ul', 'attributes' => array())));
280 85ad3d82 Assos Assos
    }
281
    $results_tables['basic'][] = array(t('Binding with DN (%bind_dn).  Using supplied password ',
282 bc175c27 Assos Assos
      array('%bind_dn' => $ldap_user['dn'])));
283 85ad3d82 Assos Assos
    $result = $ldap_server->bind($ldap_user['dn'], $values['testing_drupal_userpw'], FALSE);
284
    if ($result == LDAP_SUCCESS) {
285
      $results_tables['basic'][] = array(t('Successfully bound to server'), 'PASS');
286
    }
287
    else {
288
      $results_tables['basic'][] = array(t('Failed to bind to server. ldap error #') . $result . ' ' . $ldap_server->errorMsg('ldap'), 'FAIL') ;
289
    }
290
  }
291
292
  if (!$has_errors && isset($values['grp_test_grp_dn'])) {
293
    $group_dn = $values['grp_test_grp_dn'];
294
295
    $result = @ldap_read($ldap_server->connection, $group_dn, 'objectClass=*');
296 be58a50c Assos Assos
    if (is_array($result)) {
297
      $group_entry = ldap_get_entries($ldap_server->connection, $result);
298
    }
299 85ad3d82 Assos Assos
    $user = isset($values['testing_drupal_username']) ? $values['testing_drupal_username'] : NULL;
300
301
    foreach (array(FALSE, TRUE) as $nested) { //FALSE
302
      $nested_display = ($nested) ? 'Yes' : 'No';
303
      if ($user) {
304
        // this is the parent function that will call FromUserAttr or FromEntry
305
        $memberships = $ldap_server->groupMembershipsFromUser($user, 'group_dns', $nested);
306
        $result = theme('item_list', array('items' => $memberships, 'type' => 'ul'));
307
        $results_tables['group2'][] = array("ldap_server->groupMembershipsFromUser($user, 'group_dns', nested=$nested_display)<br/>count=" . count($memberships), $result);
308
309
        $result = ($ldap_server->groupIsMember($group_dn, $user, $nested)) ? 'Yes' : 'No';
310
        $group_results[] = array("ldap_server->groupIsMember($group_dn, $user, nested=$nested_display)", $result);
311
312
        if ($ldap_server->groupUserMembershipsConfigured) {
313
          $groupusermembershipsfromuserattr = $ldap_server->groupUserMembershipsFromUserAttr($user, $nested);
314 bc175c27 Assos Assos
          $count = count($groupusermembershipsfromuserattr);
315 85ad3d82 Assos Assos
          $result = theme('item_list', array('items' => $groupusermembershipsfromuserattr, 'type' => 'ul'));
316
        }
317
        else {
318
          $groupusermembershipsfromuserattr = array();
319
          $result = "'A user LDAP attribute such as memberOf exists that contains a list of their group' is not configured.";
320
        }
321
        $results_tables['group2'][] = array("ldap_server->groupUserMembershipsFromUserAttr($user, nested=$nested_display)<br/> count=" .
322
            count($groupusermembershipsfromuserattr) , $result);
323
324
        if ($ldap_server->groupGroupEntryMembershipsConfigured) {
325
          $groupusermembershipsfromentry = $ldap_server->groupUserMembershipsFromEntry($user, $nested);
326
          $result = theme('item_list', array('items' => $groupusermembershipsfromentry, 'type' => 'ul'));
327
        }
328
        else {
329
          $groupusermembershipsfromentry = array();
330
          $result = "Groups by entry not configured.";
331
        }
332
        $results_tables['group2'][] = array("ldap_server->groupUserMembershipsFromEntry($user, nested=$nested_display)<br/>count=" .
333
          count($groupusermembershipsfromentry) , $result);
334
335
        if (count($groupusermembershipsfromentry) && count($groupusermembershipsfromuserattr)) {
336
          $diff1 = array_diff($groupusermembershipsfromuserattr, $groupusermembershipsfromentry);
337
          $diff2 = array_diff($groupusermembershipsfromentry, $groupusermembershipsfromuserattr);
338
          $result1 = theme('item_list', array('items' => $diff1, 'type' => 'ul'));
339
          $result2 = theme('item_list', array('items' => $diff2, 'type' => 'ul'));
340
          $results_tables['group2'][] = array("groupUserMembershipsFromEntry and FromUserAttr Diff)", $result1);
341
          $results_tables['group2'][] = array("FromUserAttr and groupUserMembershipsFromEntry Diff)", $result2);
342
        }
343
      }
344
    }
345
346
347
    if ($groups_from_dn = $ldap_server->groupUserMembershipsFromDn($user)) {
348
      $results_tables['groupfromDN'][] = array("Groups from DN", theme('item_list', array('items' => $groups_from_dn, 'type' => 'ul')));
349
    }
350
351 5136ce55 Assos Assos
  }
352 85ad3d82 Assos Assos
353 5136ce55 Assos Assos
  list($has_errors, $more_results, $ldap_user) = ldap_servers_test_user_mapping($values['testing_drupal_username'], $ldap_server);
354
355
  $tokens = ($ldap_user && isset($ldap_user['attr'])) ? ldap_servers_token_tokenize_entry($ldap_user['attr'], 'all') : array();
356
  foreach ($tokens as $key => $value) {
357 bc175c27 Assos Assos
    $results_tables['tokens'][] = array($key, ldap_servers_string_binary_check($value));
358 5136ce55 Assos Assos
  }
359
  $form_state['ldap_server_test_data'] = array(
360
    'username' => $values['testing_drupal_username'],
361
    'results_tables' => $results_tables,
362
  );
363
364
  if (isset($ldap_user)) {
365
    $form_state['ldap_server_test_data']['ldap_user'] = $ldap_user;
366
  }
367
368 be58a50c Assos Assos
  if (isset($group_entry) ) {
369 5136ce55 Assos Assos
    $form_state['ldap_server_test_data']['group_entry'] = $group_entry;
370 85ad3d82 Assos Assos
  }
371 bc175c27 Assos Assos
372 85ad3d82 Assos Assos
}
373
374
/**
375
 * Submit hook for the LDAP server form.
376
 */
377
378
379
function ldap_servers_test_binding_credentials(&$ldap_server, $bindpw, &$results_tables) {
380
381
  $errors = FALSE;
382
  $results = array();
383
384
  $ldap_result = $ldap_server->connect();
385
  if ($ldap_result != LDAP_SUCCESS) {
386
    $results_tables['basic'][] = array(t('Failed to connect to LDAP server.  See watchdog error logs for details.') .
387
                                    $ldap_server->errorMsg('ldap'));
388
    $errors = TRUE;
389
  }
390
391
  if (!$errors) {
392
    $bind_result = $ldap_server->bind($ldap_server->binddn, $bindpw, FALSE);
393
    if ($bind_result == LDAP_SUCCESS) {
394 bc175c27 Assos Assos
      $results_tables['basic'][] = array(t('Successfully bound to server'));
395 85ad3d82 Assos Assos
    }
396
    else {
397
      $results_tables['basic'][] = array(t('Failed to bind to server. ldap error #') . $bind_result . ' ' . $ldap_server->errorMsg('ldap')) ;
398
      $errors = TRUE;
399
    }
400
  }
401
  return array($errors, $results);
402
}
403
404
function ldap_servers_test_user_mapping($drupal_username, &$ldap_server, $ldap_context = NULL) {
405
406
  $ldap_user = $ldap_server->userUserNameToExistingLdapEntry($drupal_username, $ldap_context);
407
  $errors = FALSE;
408
  if (!$ldap_user ) {
409
    $results[] = t('Failed to find test user %username by searching on  %user_attr = %username.',
410
      array(
411
        '%username' => $drupal_username,
412
        '%user_attr' => $ldap_server->user_attr )
413
      )
414
      . ' ' . t('Error Message:') . ' ' . $ldap_server->errorMsg('ldap');
415
    $errors = TRUE;
416
  }
417
  else {
418
    $results[] = t('Found test user %username by searching on  %user_attr = %username.',
419
      array('%username' => $drupal_username, '%user_attr' => $ldap_server->user_attr ));
420
  }
421
  return array($errors, $results, $ldap_user);
422
}