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 @ 5136ce55

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
    $group_entry = ldap_get_entries($ldap_server->connection, $result);
281
    $user = isset($values['testing_drupal_username']) ? $values['testing_drupal_username'] : NULL;
282
283
    foreach (array(FALSE, TRUE) as $nested) { //FALSE
284
      $nested_display = ($nested) ? 'Yes' : 'No';
285
      if ($user) {
286
        // this is the parent function that will call FromUserAttr or FromEntry
287
        $memberships = $ldap_server->groupMembershipsFromUser($user, 'group_dns', $nested);
288
        $result = theme('item_list', array('items' => $memberships, 'type' => 'ul'));
289
        $results_tables['group2'][] = array("ldap_server->groupMembershipsFromUser($user, 'group_dns', nested=$nested_display)<br/>count=" . count($memberships), $result);
290
291
        $result = ($ldap_server->groupIsMember($group_dn, $user, $nested)) ? 'Yes' : 'No';
292
        $group_results[] = array("ldap_server->groupIsMember($group_dn, $user, nested=$nested_display)", $result);
293
294
        if ($ldap_server->groupUserMembershipsConfigured) {
295
          $groupusermembershipsfromuserattr = $ldap_server->groupUserMembershipsFromUserAttr($user, $nested);
296
          $count =  count($groupusermembershipsfromuserattr);
297
          $result = theme('item_list', array('items' => $groupusermembershipsfromuserattr, 'type' => 'ul'));
298
        }
299
        else {
300
          $groupusermembershipsfromuserattr = array();
301
          $result = "'A user LDAP attribute such as memberOf exists that contains a list of their group' is not configured.";
302
        }
303
        $results_tables['group2'][] = array("ldap_server->groupUserMembershipsFromUserAttr($user, nested=$nested_display)<br/> count=" .
304
            count($groupusermembershipsfromuserattr) , $result);
305
306
        if ($ldap_server->groupGroupEntryMembershipsConfigured) {
307
          $groupusermembershipsfromentry = $ldap_server->groupUserMembershipsFromEntry($user, $nested);
308
          $result = theme('item_list', array('items' => $groupusermembershipsfromentry, 'type' => 'ul'));
309
        }
310
        else {
311
          $groupusermembershipsfromentry = array();
312
          $result = "Groups by entry not configured.";
313
        }
314
        $results_tables['group2'][] = array("ldap_server->groupUserMembershipsFromEntry($user, nested=$nested_display)<br/>count=" .
315
          count($groupusermembershipsfromentry) , $result);
316
317
        if (count($groupusermembershipsfromentry) && count($groupusermembershipsfromuserattr)) {
318
          $diff1 = array_diff($groupusermembershipsfromuserattr, $groupusermembershipsfromentry);
319
          $diff2 = array_diff($groupusermembershipsfromentry, $groupusermembershipsfromuserattr);
320
          $result1 = theme('item_list', array('items' => $diff1, 'type' => 'ul'));
321
          $result2 = theme('item_list', array('items' => $diff2, 'type' => 'ul'));
322
          $results_tables['group2'][] = array("groupUserMembershipsFromEntry and FromUserAttr Diff)", $result1);
323
          $results_tables['group2'][] = array("FromUserAttr and groupUserMembershipsFromEntry Diff)", $result2);
324
        }
325
      }
326
    }
327
328
329
    if ($groups_from_dn = $ldap_server->groupUserMembershipsFromDn($user)) {
330
      $results_tables['groupfromDN'][] = array("Groups from DN", theme('item_list', array('items' => $groups_from_dn, 'type' => 'ul')));
331
    }
332
333 5136ce55 Assos Assos
  }
334 85ad3d82 Assos Assos
335 5136ce55 Assos Assos
  list($has_errors, $more_results, $ldap_user) = ldap_servers_test_user_mapping($values['testing_drupal_username'], $ldap_server);
336
337
  $tokens = ($ldap_user && isset($ldap_user['attr'])) ? ldap_servers_token_tokenize_entry($ldap_user['attr'], 'all') : array();
338
  foreach ($tokens as $key => $value) {
339
    $results_tables['tokens'][] = array($key, $value);
340
  }
341
  $form_state['ldap_server_test_data'] = array(
342
    'username' => $values['testing_drupal_username'],
343
    'results_tables' => $results_tables,
344
  );
345
346
  if (isset($ldap_user)) {
347
    $form_state['ldap_server_test_data']['ldap_user'] = $ldap_user;
348
  }
349
350
  if ( isset($group_entry) ) {
351
    $form_state['ldap_server_test_data']['group_entry'] = $group_entry;
352 85ad3d82 Assos Assos
  }
353 5136ce55 Assos Assos
  
354 85ad3d82 Assos Assos
}
355
356
/**
357
 * Submit hook for the LDAP server form.
358
 */
359
360
361
function ldap_servers_test_binding_credentials(&$ldap_server, $bindpw, &$results_tables) {
362
363
  $errors = FALSE;
364
  $results = array();
365
366
  $ldap_result = $ldap_server->connect();
367
  if ($ldap_result != LDAP_SUCCESS) {
368
    $results_tables['basic'][] = array(t('Failed to connect to LDAP server.  See watchdog error logs for details.') .
369
                                    $ldap_server->errorMsg('ldap'));
370
    $errors = TRUE;
371
  }
372
373
  if (!$errors) {
374
    $bind_result = $ldap_server->bind($ldap_server->binddn, $bindpw, FALSE);
375
    if ($bind_result == LDAP_SUCCESS) {
376
      $results_tables['basic'][] =  array(t('Successfully bound to server'));
377
    }
378
    else {
379
      $results_tables['basic'][] = array(t('Failed to bind to server. ldap error #') . $bind_result . ' ' . $ldap_server->errorMsg('ldap')) ;
380
      $errors = TRUE;
381
    }
382
  }
383
  return array($errors, $results);
384
}
385
386
function ldap_servers_test_user_mapping($drupal_username, &$ldap_server, $ldap_context = NULL) {
387
388
  $ldap_user = $ldap_server->userUserNameToExistingLdapEntry($drupal_username, $ldap_context);
389
  $errors = FALSE;
390
  if (!$ldap_user ) {
391
    $results[] = t('Failed to find test user %username by searching on  %user_attr = %username.',
392
      array(
393
        '%username' => $drupal_username,
394
        '%user_attr' => $ldap_server->user_attr )
395
      )
396
      . ' ' . t('Error Message:') . ' ' . $ldap_server->errorMsg('ldap');
397
    $errors = TRUE;
398
  }
399
  else {
400
    $results[] = t('Found test user %username by searching on  %user_attr = %username.',
401
      array('%username' => $drupal_username, '%user_attr' => $ldap_server->user_attr ));
402
  }
403
  return array($errors, $results, $ldap_user);
404
}