Projet

Général

Profil

Paste
Télécharger (15,8 ko) Statistiques
| Branche: | Révision:

root / drupal7 / sites / all / modules / ldap / ldap_authentication / ldap_authentication.module @ bc175c27

1 85ad3d82 Assos Assos
<?php
2
3
/**
4
 * @file
5
 * This module injects itself into Drupal's Authentication stack.
6
 */
7
8
/**
9
 * @todo fix advanced help for ../ldap/authentication settings page
10
 */
11
define('LDAP_AUTHENTICATION_PROJECT_TAG', 'ldap');
12
13 bc175c27 Assos Assos
define('LDAP_AUTHENTICATION_MIXED', 1);
14
define('LDAP_AUTHENTICATION_EXCLUSIVE', 2);
15 85ad3d82 Assos Assos
define('LDAP_AUTHENTICATION_MODE_DEFAULT', 1);
16
17
define('LDAP_AUTHENTICATION_EXCL_IF_NO_AUTHZ_DEFAULT', 0);
18 bc175c27 Assos Assos
define('LDAP_AUTHENTICATION_CONFLICT_LOG', 1);
19
define('LDAP_AUTHENTICATION_CONFLICT_RESOLVE', 2);
20 85ad3d82 Assos Assos
define('LDAP_AUTHENTICATION_CONFLICT_RESOLVE_DEFAULT', 2);
21
22 bc175c27 Assos Assos
define('LDAP_AUTHENTICATION_EMAIL_UPDATE_ON_LDAP_CHANGE_ENABLE_NOTIFY', 1);
23
define('LDAP_AUTHENTICATION_EMAIL_UPDATE_ON_LDAP_CHANGE_ENABLE', 2);
24
define('LDAP_AUTHENTICATION_EMAIL_UPDATE_ON_LDAP_CHANGE_DISABLE', 3);
25
define('LDAP_AUTHENTICATION_EMAIL_UPDATE_ON_LDAP_CHANGE_DEFAULT', 1);
26 85ad3d82 Assos Assos
27 bc175c27 Assos Assos
define('LDAP_AUTHENTICATION_EMAIL_FIELD_REMOVE', 2);
28
define('LDAP_AUTHENTICATION_EMAIL_FIELD_DISABLE', 3);
29
define('LDAP_AUTHENTICATION_EMAIL_FIELD_ALLOW', 4);
30
define('LDAP_AUTHENTICATION_EMAIL_FIELD_DEFAULT', 3);
31 85ad3d82 Assos Assos
32 bc175c27 Assos Assos
define('LDAP_AUTHENTICATION_EMAIL_TEMPLATE_NONE', 1);
33 dd54aff9 Assos Assos
define('LDAP_AUTHENTICATION_EMAIL_TEMPLATE_ALWAYS', 2);
34
define('LDAP_AUTHENTICATION_EMAIL_TEMPLATE_IF_EMPTY', 3);
35
define('LDAP_AUTHENTICATION_EMAIL_TEMPLATE_DEFAULT', 3);
36
37
define('LDAP_AUTHENTICATION_DEFAULT_TEMPLATE', '@username@fake-domain.com');
38
39
define('LDAP_AUTHENTICATION_DEFAULT_TEMPLATE_REGEX', '.*@fake-domain\\.com');
40
41
define('LDAP_AUTHENTICATION_TEMPLATE_USAGE_NEVER_UPDATE_DEFAULT', 0);
42
define('LDAP_AUTHENTICATION_TEMPLATE_USAGE_RESOLVE_CONFLICT_DEFAULT', 0);
43
define('LDAP_AUTHENTICATION_TEMPLATE_USAGE_PROMPT_USER_DEFAULT', 0);
44
45 bc175c27 Assos Assos
define('LDAP_AUTHENTICATION_PASSWORD_FIELD_SHOW', 2);
46
define('LDAP_AUTHENTICATION_PASSWORD_FIELD_HIDE', 3);
47
define('LDAP_AUTHENTICATION_PASSWORD_FIELD_ALLOW', 4);
48
define('LDAP_AUTHENTICATION_PASSWORD_FIELD_DEFAULT', 2);
49
50
define('LDAP_AUTHENTICATION_RESULT_FAIL_CONNECT', 1);
51
define('LDAP_AUTHENTICATION_RESULT_FAIL_BIND', 2);
52
define('LDAP_AUTHENTICATION_RESULT_FAIL_FIND', 3);
53
define('LDAP_AUTHENTICATION_RESULT_FAIL_DISALLOWED', 4);
54
define('LDAP_AUTHENTICATION_RESULT_FAIL_CREDENTIALS', 5);
55
define('LDAP_AUTHENTICATION_RESULT_SUCCESS', 6);
56
define('LDAP_AUTHENTICATION_RESULT_FAIL_GENERIC', 7);
57 85ad3d82 Assos Assos
define('LDAP_AUTHENTICATION_RESULT_FAIL_SERVER'      , 8);
58
59 bc175c27 Assos Assos
define('LDAP_AUTHENTICATION_ACCT_CREATION_DEFAULT', 4);
60 85ad3d82 Assos Assos
define('LDAP_AUTHENTICATION_ACCT_CREATION_USER_SETTINGS_FOR_LDAP', 1);
61 bc175c27 Assos Assos
define('LDAP_AUTHENTICATION_ACCT_CREATION_LDAP_BEHAVIOR', 4);
62 85ad3d82 Assos Assos
63
define('LDAP_AUTHENTICATION_HELP_LINK_TEXT_DEFAULT', 'Logon Help');
64
65
define('LDAP_AUTHENTICATION_DISABLED_FOR_BAD_CONF_MSG' , 'The site logon is currently not working due to a configuration error.  Please see logs for additional details.');
66
define('LDAP_AUTHENTICATION_COOKIE_EXPIRE', 0);
67
68 dd54aff9 Assos Assos
define('LDAP_AUTHENTICATION_REDIRECT_ON_LOGIN_DEFAULT', 0);
69
70 85ad3d82 Assos Assos
/**
71
 * Implements hook_menu().
72
 */
73
function ldap_authentication_menu() {
74
  $items = array();
75
76 dd54aff9 Assos Assos
  $items['user/ldap-profile-update'] = array(
77
    'title' => 'Update Profile',
78
    'page callback' => 'drupal_get_form',
79
    'page arguments' => array('ldap_authentication_profile_update_form'),
80
    'access callback' => TRUE,
81
    'type' => MENU_CALLBACK,
82
    'file' => 'ldap_authentication.pages.inc',
83
  );
84 7547bb19 Assos Assos
85 85ad3d82 Assos Assos
  $items['admin/config/people/ldap/authentication'] = array(
86
    'title' => 'Authentication',
87
    'description' => 'Configure LDAP Authentication',
88
    'page callback' => 'drupal_get_form',
89
    'page arguments' => array('ldap_authentication_admin_form'),
90
    'access arguments' => array('administer site configuration'),
91
    'type' => MENU_LOCAL_TASK,
92
    'weight' => 3,
93
    'file' => 'ldap_authentication.admin.inc',
94
  );
95
96
  return $items;
97
}
98
99
 /**
100
 * Implements hook_menu_alter().
101
 * since menu items are cached, only useful to add or alter callbacks
102
 * for ldap authentication driven menu items.
103
 *
104
 */
105
function ldap_authentication_menu_alter(&$items) {
106
  ldap_servers_module_load_include('inc', 'ldap_authentication', 'ldap_authentication');
107
  $items['user/password']['access callback'] = 'ldap_authentication_show_reset_pwd';
108
  $auth_conf = ldap_authentication_get_valid_conf();
109
  if (@$auth_conf->ldapUserHelpLinkUrl) {
110
    $items['user/ldaphelp'] = array(
111
      'title' => $auth_conf->ldapUserHelpLinkText,
112
      'page callback' => 'drupal_goto',
113
      'page arguments' => array($auth_conf->ldapUserHelpLinkUrl),
114
      'access callback' => 'ldap_authentication_show_ldap_help_link',
115
      'type' => MENU_LOCAL_TASK,
116
    );
117
  }
118
}
119
120
/**
121
 * Implements hook_theme().
122
 */
123
function ldap_authentication_theme() {
124
  return array(
125
    'ldap_authentication_user_login_block_links' => array(
126
      'variables' => array('ldap_user_help_link' => NULL, 'user_register' => TRUE),
127
      'render element' => 'element',
128
      'file' => 'ldap_authentication.theme.inc'
129
    ),
130
    'ldap_authentication_user_pass_message' => array(
131
      'variables' => array('show_reset_pwd' => NULL, 'auth_conf' => TRUE),
132
      'render element' => 'element',
133
      'file' => 'ldap_authentication.theme.inc'
134
    ),
135
    'ldap_authentication_user_pass_validate_ldap_authenticated' => array(
136
      'variables' => array('account' => NULL, 'auth_conf' => TRUE),
137
      'render element' => 'element',
138
      'file' => 'ldap_authentication.theme.inc'
139
    ),
140
    'ldap_authentication_login_message' => array(
141
      'render element' => 'element',
142
      'variables' => array('message' => NULL),
143
      'file' => 'ldap_authentication.theme.inc'
144
    ),
145
    'ldap_authentication_message_not_found' => array(
146
      'render element' => 'element',
147
      'variables' => array('message' => NULL),
148
      'file' => 'ldap_authentication.theme.inc'
149
    ),
150
    'ldap_authentication_message_not_authenticated' => array(
151
      'render element' => 'element',
152
      'variables' => array('message' => NULL),
153
      'file' => 'ldap_authentication.theme.inc'
154
    ),
155
  );
156
}
157
158
159
/**
160
 * Implements hook_help().
161
 */
162
163
function ldap_authentication_help($path, $arg) {
164
165
  $authentication_help = t('LDAP authentication allows authentication against an LDAP server.  It
166
        may be used alongside other authentication means such as built in Drupal authentication,
167
        open id, etc.  More detailed help is available on drupal.org at !helplink.',
168
          array(
169
            '!helplink' => l(LDAP_SERVERS_DRUPAL_HELP_URL, LDAP_SERVERS_DRUPAL_HELP_URL),
170
          ));
171
172
  switch ($path) {
173
    case 'admin/config/people/ldap/authentication':
174
      $output = '<p>' . $authentication_help . '</p>';
175
      return $output;
176
177
    case 'admin/help#ldap_authentication':
178
      $output = '<p>' . $authentication_help . '</p>';
179
      return $output;
180
  }
181
}
182
183 dd54aff9 Assos Assos
/**
184
 * Helper function that determines whether or not the user's profile
185
 * is valid or needs to be updated on login.
186 7547bb19 Assos Assos
 *
187 dd54aff9 Assos Assos
 * Currently this only checks if mail is valid or not according to the
188
 * authentication settings.
189 7547bb19 Assos Assos
 *
190 dd54aff9 Assos Assos
 * @return boolean
191
 *   TRUE if the user's profile is valid, otherwise FALSE.
192 7547bb19 Assos Assos
 *
193 dd54aff9 Assos Assos
 */
194
function _ldap_authentication_verify_user_profile() {
195
  global $user;
196
  $result = TRUE;
197
  // We only want non-anonymous and non-1 users.
198
  if ($user->uid > 1) {
199
    // we store the value in the session for speed.
200
    if (isset($_SESSION['ldap_authentication_template']) &&
201
            isset($_SESSION['ldap_authentication_template']['verify_user_profile'])) {
202
      return $_SESSION['ldap_authentication_template']['verify_user_profile'];
203
    }
204
    if (ldap_authentication_ldap_authenticated($user)) {
205
      $auth_conf = ldap_authentication_get_valid_conf();
206
      $regex = '`' . $auth_conf->templateUsagePromptRegex . '`i';
207
      if (preg_match($regex, $user->mail)) {
208
        $result = FALSE;
209
      }
210
      $_SESSION['ldap_authentication_template'] = array(
211
        'verify_user_profile' => $result,
212
      );
213
    }
214
  }
215 be58a50c Assos Assos
  return $result;
216 dd54aff9 Assos Assos
}
217
218
/**
219
 * Implements hook_init().
220
 */
221
function ldap_authentication_init() {
222
  $auth_conf = ldap_authentication_get_valid_conf();
223 5136ce55 Assos Assos
  if ($auth_conf && $auth_conf->templateUsagePromptUser) {
224 dd54aff9 Assos Assos
    ldap_authentication_check_for_email_template();
225
  }
226
}
227
228
/**
229
 * Form submit callback to check for an email template and redirect if needed.
230
 */
231
function ldap_authentication_check_for_email_template() {
232
  if (!_ldap_authentication_verify_user_profile()) {
233
    $url = 'user/ldap-profile-update';
234
    $cp = current_path();
235
    // avoid redirects on these two pages.
236
    if ($cp != $url && $cp != 'user/logout') {
237
      if (isset($_GET['destination'])) {
238
        unset($_GET['destination']);
239
      }
240
      drupal_goto($url, array(
241
        'query' => array(
242
          'next' => current_path(),
243
        ),
244
      ));
245
    }
246
  }
247
}
248
249 85ad3d82 Assos Assos
/**
250
 * Implements hook_info().
251
 */
252
function ldap_authentication_info($field = 0) {
253 bc175c27 Assos Assos
  $info['name'] = 'ldap_authentication';
254 85ad3d82 Assos Assos
  $info['protocol'] = 'LDAP';
255
256
  if ($field) {
257
    return $info[$field];
258
  }
259
260
  return $info;
261
}
262
263
264
/**
265 7547bb19 Assos Assos
 * Determines if the passed user has a valid authmap record.
266 85ad3d82 Assos Assos
 *
267
 * @param object $user
268 7547bb19 Assos Assos
 *   A drupal user account.
269
 *
270 85ad3d82 Assos Assos
 * @return boolean
271
 *    true if user is recorded as ldap authenticated and identified (ldap_authentified)
272
 */
273
function ldap_authentication_ldap_authenticated($user) {
274
  if (!is_object($user) || $user->uid == 0) {
275
    return FALSE;
276
  }
277
278
  $authname = ldap_user_get_authname($user);
279
  return !empty($authname);
280
281
}
282
283
/**
284
 * A user access callback for using the single sign-on URL, denying access to
285
 * authenticated users, and granting access to anonymous users and menu
286
 * administrators viewing the menu item.
287
 *
288
 */
289
function _ldap_authentication_user_access() {
290
  return (boolean)(!$GLOBALS['user']->uid || !empty($GLOBALS['menu_admin']));
291
}
292
293
294
295
/**
296
 * get LdapAuthenticationConf object
297
 *
298
 * @return object LdapAuthenticationConf object if configured, otherwise FALSE
299
 *
300
 */
301
302
function ldap_authentication_get_valid_conf($reset = FALSE) {
303
304
  static $auth_conf;
305
  if (!$reset && is_object($auth_conf)) {
306
    return $auth_conf;
307
  }
308
  ldap_servers_module_load_include('php', 'ldap_authentication', 'LdapAuthenticationConf.class');
309
310
  $auth_conf = new LdapAuthenticationConf();
311
  return ($auth_conf->inDatabase) ? $auth_conf : FALSE;
312
313
}
314
315
/**
316
 * Implements hook_ldap_ldap_server_in_use().
317
 */
318
function ldap_authentication_ldap_server_in_use($sid, $server_name) {
319
320
  $use_warnings = array();
321
  $auth_conf = ldap_authentication_get_valid_conf();
322 7547bb19 Assos Assos
  if ($auth_conf && in_array($sid, array_keys($auth_conf->sids)) && !empty($auth_conf->sids[$sid])) {
323 85ad3d82 Assos Assos
    $use_warnings[] = t('This server (%server_name) may not be deleted or
324
      disabled because it is being used for ldap authentication.',
325
      array('%server_name' => $server_name));
326
  }
327
  return $use_warnings;
328
}
329
330
function ldap_authentication_show_reset_pwd($user = NULL) {
331
332
  if (!$user) {
333
    global $user;
334
  }
335
  $auth_conf = ldap_authentication_get_valid_conf();
336 7547bb19 Assos Assos
  // Hide user/password form if ldap authentication is required and deny access
337
  // to users without ldap authorizations is enabled
338 be58a50c Assos Assos
  if ($user->uid == 1 || !$auth_conf || (current_path() == 'user/password' && $auth_conf->authenticationMode != LDAP_AUTHENTICATION_EXCLUSIVE)) {
339 85ad3d82 Assos Assos
    return TRUE;
340
   // always show at user/passwordurl. otherwise user 1 will not be able to reset password.
341
  }
342
343
  if ($user->uid == 0) {
344
    // hide reset password for anonymous users if ldap only authentication and password updates are disabled, otherwise show
345 5136ce55 Assos Assos
    if ($auth_conf->authenticationMode == LDAP_AUTHENTICATION_EXCLUSIVE) {
346 85ad3d82 Assos Assos
      if ($auth_conf->passwordOption == LDAP_AUTHENTICATION_PASSWORD_FIELD_ALLOW) {
347
        return TRUE;
348
      }
349
      return FALSE;
350
    }
351
    return TRUE;
352
  }
353
  else {
354
    // authenticated user.  hide if ldap authenticated and updating password is
355
    // not allowed, otherwise show.
356
    if (ldap_authentication_ldap_authenticated($user)) {
357
      if ($auth_conf->passwordOption == LDAP_AUTHENTICATION_PASSWORD_FIELD_ALLOW) {
358
        return TRUE;
359
      }
360
      return FALSE;
361
    }
362
    return TRUE;
363
  }
364
365
}
366
367
368
/**
369
 * Implements hook_form_FORM_ID_alter().
370
 */
371
372
function ldap_authentication_form_user_pass_alter(&$form, $form_state) {
373
  // the following could be in a theme preproces function
374
  $auth_conf = ldap_authentication_get_valid_conf();
375
  $form['ldap_warning'] = array(
376
     '#type' => 'item',
377
     '#markup' => theme('ldap_authentication_user_pass_message', array('auth_conf' => $auth_conf)),
378
     '#weight' => 10,
379
      );
380
381
  // need to insert before user_pass_validate
382
  array_unshift($form['#validate'], 'ldap_authentication_user_pass_validate');
383
}
384
385
386
/**
387
 * A validate handler on the login form. Check supplied username/password
388
 * against local users table. If successful, $form_state['uid']
389
 * is set to the matching user ID.
390
 */
391
function ldap_authentication_core_override_user_login_authenticate_validate($form, &$form_state) {
392
  // No additional validation of user credentials is needed when
393
  // $form_state['uid'] is set.
394
  if (!empty($form_state['uid'])) {
395
    return;
396
  }
397
  user_login_authenticate_validate($form, $form_state);
398
}
399
400
401
function ldap_authentication_user_pass_validate(&$form_state) {
402
  $name_or_mail = trim($form_state['name']['#value']);
403
  if ($account = user_load_by_mail($name_or_mail)) {
404
405
  }
406
  else {
407
    $account = user_load_by_name($name_or_mail);
408
  }
409
410
  if (ldap_authentication_ldap_authenticated($account)) {
411
    $vars = array(
412
      'account' => $account,
413
      'auth_conf' => ldap_authentication_get_valid_conf(),
414
    );
415
    $error = TRUE;
416
    if (is_object($vars['auth_conf'])) {
417
      if ($vars['auth_conf']->passwordOption == LDAP_AUTHENTICATION_PASSWORD_FIELD_ALLOW) {
418
        $error = FALSE;
419
      }
420
    }
421
    if (!empty($error)) {
422
      form_set_error('name', theme('ldap_authentication_user_pass_validate_ldap_authenticated', $vars));
423
    }
424
  }
425
}
426
427
428
/**
429
 * Implements hook_form_FORM_ID_alter(). for user_profile_form
430
 */
431
function ldap_authentication_form_user_profile_form_alter(&$form, $form_state) {
432
  ldap_servers_module_load_include('inc', 'ldap_authentication', 'ldap_authentication');
433
  _ldap_authentication_form_user_profile_form_alter($form, $form_state, 'user_login');
434
435
}
436
437
438
/**
439
 * Implements hook_form_FORM_ID_alter(). for user_login
440
 */
441
function ldap_authentication_form_user_login_alter(&$form, &$form_state) {
442
  ldap_servers_module_load_include('inc', 'ldap_authentication', 'ldap_authentication');
443
  _ldap_authentication_login_form_alter($form, $form_state, 'user_login');
444
445
}
446
447
/**
448
 * Implements hook_form_FORM_ID_alter(). for user_login_block
449
 */
450
function ldap_authentication_form_user_login_block_alter(&$form, &$form_state) {
451
  ldap_servers_module_load_include('inc', 'ldap_authentication', 'ldap_authentication');
452
  _ldap_authentication_login_form_alter($form, $form_state, 'user_login_block');
453
454
}
455
456
/**
457
 * validate function for user logon forms.
458
 */
459
function ldap_authentication_user_login_authenticate_validate($form, &$form_state, $return_user = FALSE) {
460
  ldap_servers_module_load_include('inc', 'ldap_authentication', 'ldap_authentication');
461
  return _ldap_authentication_user_login_authenticate_validate($form_state, $return_user);
462
}
463
464
465
/**
466
 * Implements hook_user_presave().
467
 *  A user account is about to be created or updated.
468
 */
469
470
function ldap_authentication_user_presave(&$edit, $account, $category = NULL) {
471
472
}
473
474
475
/**
476
 * Implements hook_user_insert().
477
 *
478
 * A user account was created.
479
 * The module should save its custom additions to the user object into the database.
480
 */
481
482
function ldap_authentication_user_insert(&$edit, $account, $category) {
483
484
}
485
486
487
/**
488
 * Implements hook_user_update().
489
 *
490
 *  A user account was updated.
491
 *  Modules may use this hook to update their user data in a custom storage after a user account has been updated.
492
 */
493
494
495
function ldap_authentication_user_update($edit, $user, $category) {
496
497
}
498
499
function ldap_authentication_show_ldap_help_link($user = NULL) {
500
  global $user;
501
502
  if (!$auth_conf = ldap_authentication_get_valid_conf()) {
503
    return FALSE;
504
  }
505
  elseif ($auth_conf->authenticationMode == LDAP_AUTHENTICATION_MIXED) {
506
    return (ldap_authentication_ldap_authenticated($user));
507
  }
508
  elseif ($auth_conf->authenticationMode == LDAP_AUTHENTICATION_EXCLUSIVE) {
509
    if ($user->uid == 0 || ldap_authentication_ldap_authenticated($user)) {
510
      return TRUE;
511
    }
512
    else {
513
      return FALSE;
514
    }
515
  }
516
}