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

    
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
  if ($ldap_server->bind_method == LDAP_SERVERS_BIND_METHOD_ANON_USER) {
95
    $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
        if (isset($test_data['group_entry'][0])) {
144
          dpm("Test Group LDAP Entry");
145
          dpm($test_data['group_entry'][0]);
146
        }
147
      }
148
    }
149
  }
150
  return $form;
151
}
152

    
153
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
/**
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
      array('%bind_dn' => $ldap_server->binddn)) . ' ' . $bindpw_type);
206
  }
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
    $result = ($result) ? "PASS" : 'FAIL';
235
    $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
    $result = (is_array($result) && count($result) == 0) ? 'PASS' : 'FAIL';
241
    $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
    $result = ($ldap_server->dnExists($group_create_test_dn, 'ldap_entry', array('cn', 'member'))) ? "FAIL" : 'PASS';
263
    $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
      $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
    }
281
    $results_tables['basic'][] = array(t('Binding with DN (%bind_dn).  Using supplied password ',
282
      array('%bind_dn' => $ldap_user['dn'])));
283
    $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
    if (is_array($result)) {
297
      $group_entry = ldap_get_entries($ldap_server->connection, $result);
298
    }
299
    $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
          $count = count($groupusermembershipsfromuserattr);
315
          $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
  }
352

    
353
  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
    $results_tables['tokens'][] = array($key, ldap_servers_string_binary_check($value));
358
  }
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
  if (isset($group_entry) ) {
369
    $form_state['ldap_server_test_data']['group_entry'] = $group_entry;
370
  }
371

    
372
}
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
      $results_tables['basic'][] = array(t('Successfully bound to server'));
395
    }
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
}