Projet

Général

Profil

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

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

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