You are here

function legal_user in Legal 6.8

Same name and namespace in other branches
  1. 5 legal.module \legal_user()
  2. 6.7 legal.module \legal_user()

Implementation of hook_user().

File

./legal.module, line 213
Displays Terms & Conditions, and makes sure they are accepted before registration is accepted.

Code

function legal_user($op, &$edit, &$account, $category = FALSE) {
  global $user;
  global $language;
  switch ($op) {
    case 'register':
      $conditions = legal_get_conditions($language->language);

      // Do nothing if no Terms and Conditions text set.
      if (empty($conditions['conditions'])) {
        return;
      }
      $form_fields = legal_display_fields($conditions);

      /**
       * Disable checkbox if:
       * - user is already registered (administer users)
       * - users with 'administer users' can access
       *   registration on admin/user/user/create.
       */
      if (!empty($user->uid)) {
        $form_fields['legal']['legal_accept']['#attributes'] = array(
          'disabled' => 'disabled',
        );
        $form_fields['legal']['legal_accept']['#required'] = FALSE;
        if (is_array($conditions['extras'])) {
          foreach ($conditions['extras'] as $key => $label) {
            if (!empty($label)) {
              $form_fields['legal'][$key]['#attributes'] = array(
                'disabled' => 'disabled',
              );
              $form_fields['legal'][$key]['#required'] = FALSE;
            }
          }
        }
      }
      else {
        $form_fields['legal']['legal_accept']['#default_value'] = $edit['legal_accept'];
      }
      $form = theme('legal_display', $form_fields);
      return $form;
    case 'login':
      if ($user->uid == 1) {
        break;
      }

      // Get last accepted version for this account.
      $legal_account = legal_get_accept($user->uid);

      // If no version has been accepted yet,
      // get version with current language revision.
      if (empty($legal_account['version'])) {
        $conditions = legal_get_conditions($language->language);

        // No conditions set yet.
        if (empty($conditions['conditions'])) {
          return;
        }
      }
      else {

        // Get version/revision of last accepted language.
        $conditions = legal_get_conditions($legal_account['language']);

        // No conditions set yet.
        if (empty($conditions['conditions'])) {
          return;
        }

        // Check latest version of T&C has been accepted.
        $accepted = legal_version_check($user->uid, $conditions['version'], $conditions['revision'], $legal_account);
        if ($accepted) {
          return;
        }
      }
      $uid = $user->uid;

      // Destroy the current session.
      session_destroy();
      session_set_save_handler('sess_open', 'sess_close', 'sess_read', 'sess_write', 'sess_destroy_sid', 'sess_gc');
      $null = NULL;
      user_module_invoke('logout', $null, $user);

      // We have to use $GLOBALS to unset a global variable.
      $user = user_load(array(
        'uid' => 0,
      ));
      $query = NULL;

      // Deal with destination from password reset one time login link.
      if (arg(0) == 'user' && arg(1) == 'reset') {
        $query = array(
          'destination' => "user/{$uid}/edit",
        );
      }
      if (!empty($_REQUEST['destination'])) {
        $query = array(
          'destination' => $_REQUEST['destination'],
        );
      }
      unset($_REQUEST['destination']);
      $signatory = db_fetch_object(db_query_range('SELECT * FROM {users} WHERE uid = %d', $uid, 0, 1));
      drupal_goto('legal_accept/' . $signatory->uid . '/' . md5($signatory->name . $signatory->pass . $signatory->login), $query);
      break;
    case 'form':
      if ($category != 'account') {
        return;
      }

      // Get last accepted version for this account.
      $legal_account = legal_get_accept($account->uid);

      // If no version has been accepted yet,
      // get version with current language revision.
      if (empty($legal_account['version'])) {
        $conditions = legal_get_conditions($language->language);

        // No conditions set yet.
        if (empty($conditions['conditions'])) {
          return;
        }
      }
      else {

        // Get version/revision last accepted language.
        $conditions = legal_get_conditions($legal_account['language']);

        // No conditions set yet.
        if (empty($conditions['conditions'])) {
          return;
        }

        // Check latest version of T&C has been accepted.
        $accepted = legal_version_check($account->uid, $conditions['version'], $conditions['revision'], $legal_account);

        // Enable language switching if version
        // accepted and revision up to date.
        if ($accepted && $legal_account['language'] != $language->language) {
          $conditions = legal_get_conditions($language->language);
        }
      }
      $form_fields = legal_display_fields($conditions);
      if ($accepted === TRUE) {
        $form_fields['legal']['legal_accept']['#value'] = 1;
        if (!empty($conditions['extras'])) {
          foreach ($conditions['extras'] as $key => $label) {
            if (!empty($label)) {
              $form_fields['legal'][$key]['#value'] = 1;
            }
          }
        }
      }

      // Disable checkbox if:
      //  - user is not account owner;
      //  - latest T&C has already been accepted.
      if ($account->uid != $user->uid || $accepted == TRUE) {
        $form_fields['legal']['legal_accept']['#attributes'] = array(
          'disabled' => 'disabled',
        );
        if (!empty($conditions['extras'])) {
          reset($conditions['extras']);
          foreach ($conditions['extras'] as $key => $label) {
            if (!empty($label)) {
              $form_fields['legal'][$key]['#attributes'] = array(
                'disabled' => 'disabled',
              );
            }
          }
        }
      }

      // Not required if user is not account owner.
      if ($account->uid != $user->uid) {
        $form_fields['legal']['legal_accept']['#required'] = FALSE;
        if (!empty($conditions['extras'])) {
          reset($conditions['extras']);
          foreach ($conditions['extras'] as $key => $label) {
            if (!empty($label)) {
              $form_fields['legal'][$key]['#required'] = FALSE;
            }
          }
        }
      }

      // Enable account owner to accept.
      if ($account->uid == $user->uid && $accepted != TRUE) {
        $form_fields['legal']['legal_accept']['#default_value'] = isset($edit['legal_accept']) ? $edit['legal_accept'] : '';
        $form_fields['legal']['legal_accept']['#required'] = TRUE;
        if (!empty($conditions['extras'])) {
          reset($conditions['extras']);
          foreach ($conditions['extras'] as $key => $label) {
            if (!empty($label)) {
              $form_fields['legal'][$key]['#default_value'] = isset($edit[$key]) ? $edit[$key] : '';
              $form_fields['legal'][$key]['#required'] = TRUE;
            }
          }
        }
      }
      $form = theme('legal_display', $form_fields);
      return $form;
      break;
    case 'insert':
      $conditions = legal_get_conditions($language->language);
      if (empty($conditions['conditions'])) {
        return;
      }

      // Record the accepted state before removing legal_accept from $edit.
      $accepted = $edit['legal_accept'];
      $edit['legal_accept'] = NULL;
      $edit['conditions'] = NULL;
      foreach ($conditions['extras'] as $key => $label) {
        $edit[$key] = NULL;
      }

      // Don't insert if user is already registered (administrator).
      if (!empty($user->uid)) {
        break;
      }
      if ($accepted) {
        legal_save_accept($conditions['version'], $conditions['revision'], $conditions['language'], $account->uid);
      }
      break;
    case 'update':
      $conditions = legal_get_conditions($language->language);
      if (empty($conditions['conditions'])) {
        return;
      }

      // Record the accepted state before removing legal_accept from $edit.
      $accepted = $edit['legal_accept'];
      $edit['legal_accept'] = NULL;
      $edit['conditions'] = NULL;
      foreach ($conditions['extras'] as $key => $label) {
        $edit[$key] = NULL;
      }
      if ($account->uid != $user->uid) {
        break;
      }

      // If already accepted skip data entry.
      $previously_accepted = legal_version_check($account->uid, $conditions['version'], $conditions['revision']);
      if ($previously_accepted === TRUE) {
        break;
      }
      if ($accepted) {
        legal_save_accept($conditions['version'], $conditions['revision'], $conditions['language'], $account->uid);
      }
      break;
  }
}