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 @ 27370441

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
    list($has_errors, $more_results, $ldap_user) = ldap_servers_test_user_mapping($values['testing_drupal_username'], $ldap_server);
334
335
    $tokens = ($ldap_user && isset($ldap_user['attr'])) ? ldap_servers_token_tokenize_entry($ldap_user['attr'], 'all') : array();
336
    foreach ($tokens as $key => $value) {
337
      $results_tables['tokens'][] = array($key, $value);
338
    }
339
    $form_state['ldap_server_test_data'] = array(
340
      'username' => $values['testing_drupal_username'],
341
      'group_entry' => $group_entry,
342
      'results_tables' => $results_tables,
343
    );
344
    if (isset($ldap_user)) {
345
      $form_state['ldap_server_test_data']['ldap_user'] = $ldap_user;
346
    }
347
  }
348
}
349
350
/**
351
 * Submit hook for the LDAP server form.
352
 */
353
354
355
function ldap_servers_test_binding_credentials(&$ldap_server, $bindpw, &$results_tables) {
356
357
  $errors = FALSE;
358
  $results = array();
359
360
  $ldap_result = $ldap_server->connect();
361
  if ($ldap_result != LDAP_SUCCESS) {
362
    $results_tables['basic'][] = array(t('Failed to connect to LDAP server.  See watchdog error logs for details.') .
363
                                    $ldap_server->errorMsg('ldap'));
364
    $errors = TRUE;
365
  }
366
367
  if (!$errors) {
368
    $bind_result = $ldap_server->bind($ldap_server->binddn, $bindpw, FALSE);
369
    if ($bind_result == LDAP_SUCCESS) {
370
      $results_tables['basic'][] =  array(t('Successfully bound to server'));
371
    }
372
    else {
373
      $results_tables['basic'][] = array(t('Failed to bind to server. ldap error #') . $bind_result . ' ' . $ldap_server->errorMsg('ldap')) ;
374
      $errors = TRUE;
375
    }
376
  }
377
  return array($errors, $results);
378
}
379
380
function ldap_servers_test_user_mapping($drupal_username, &$ldap_server, $ldap_context = NULL) {
381
382
  $ldap_user = $ldap_server->userUserNameToExistingLdapEntry($drupal_username, $ldap_context);
383
  $errors = FALSE;
384
  if (!$ldap_user ) {
385
    $results[] = t('Failed to find test user %username by searching on  %user_attr = %username.',
386
      array(
387
        '%username' => $drupal_username,
388
        '%user_attr' => $ldap_server->user_attr )
389
      )
390
      . ' ' . t('Error Message:') . ' ' . $ldap_server->errorMsg('ldap');
391
    $errors = TRUE;
392
  }
393
  else {
394
    $results[] = t('Found test user %username by searching on  %user_attr = %username.',
395
      array('%username' => $drupal_username, '%user_attr' => $ldap_server->user_attr ));
396
  }
397
  return array($errors, $results, $ldap_user);
398
}