You are here

function cas_logout in CAS 6.2

Same name and namespace in other branches
  1. 5.4 cas.module \cas_logout()
  2. 5 cas.module \cas_logout()
  3. 5.3 cas.module \cas_logout()
  4. 6.3 cas.module \cas_logout()
  5. 6 cas.module \cas_logout()
  6. 7 cas.module \cas_logout()

Logs a user out of drupal and then out of cas

1 string reference to 'cas_logout'
cas_menu in ./cas.module
Implements hook_menu.

File

./cas.module, line 816

Code

function cas_logout() {
  global $user, $base_url;
  watchdog('user', 'Session closed for %name.', array(
    '%name' => $user->name,
  ));

  // Destroy the current session:
  session_destroy();
  $edit = array();
  user_module_invoke('logout', $edit, $user);

  // We have to use $GLOBALS to unset a global variable:
  $user = user_load(array(
    'uid' => 0,
  ));
  $port = variable_get('cas_port', '443');
  $server = variable_get('cas_server', 'cas');
  $uri = variable_get('cas_uri', '');

  // Begin constructing logout destination
  $logout_destination = 'https://' . $server;

  // Add abnormal port
  if ($port != '443') {
    $logout_destination .= ':' . $port;
  }

  // Add logout
  if ($uri) {
    $logout_destination .= '/' . trim($uri, '/');
  }
  $logout_destination .= '/logout';

  // Add destination override so that a destination can be specified on the logout link
  // e.g. caslogout?desination=http://foo.bar.com/foobar
  // do not accept caslogout as a valid destination, since that may cause a redirect loop
  $destination = preg_replace("/(destination=|caslogout)/", "", drupal_get_destination());

  // If there was no override and admin has set and enabled a logout destination, look for it
  if (empty($destination) && variable_get('cas_logout_redirect', 0)) {
    $destination = variable_get('cas_logout_destination', '');

    // redirecti is enabled but no url is given - default to baseurl
    if (empty($destination)) {
      $destination = $base_url;
    }
  }

  //Make it an absolute url.  This will also convert <front> to the front page.
  if ($destination) {
    $destination = url($destination, array(
      'absolute' => TRUE,
    ));
  }

  // Add the log out destination if we have one
  // The three variables are a hack because cas server implementations don't seem to be consistent with
  // its use.
  if ($destination) {
    $logout_destination .= '?destination=' . $destination . '&service=' . $destination . '&url=' . $destination;
  }

  // Remove our original destination from the request array so that it won't cause
  // drupal_goto to re-write the url.
  unset($_REQUEST['destination']);

  // Go to the constructed logout destination
  drupal_goto($logout_destination);
}