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

    
335
  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
  }
353
  
354
}
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
}