home *** CD-ROM | disk | FTP | other *** search
/ Cricao de Sites - 650 Layouts Prontos / WebMasters.iso / CMS / drupal-6.0.exe / drupal-6.0 / modules / user / user.pages.inc < prev   
Encoding:
Text File  |  2008-01-08  |  13.6 KB  |  366 lines

  1. <?php
  2. // $Id: user.pages.inc,v 1.11 2008/01/08 10:35:43 goba Exp $
  3.  
  4. /**
  5.  * @file
  6.  * User page callback file for the user module.
  7.  */
  8.  
  9. /**
  10.  * Menu callback; Retrieve a JSON object containing autocomplete suggestions for existing users.
  11.  */
  12. function user_autocomplete($string = '') {
  13.   $matches = array();
  14.   if ($string) {
  15.     $result = db_query_range("SELECT name FROM {users} WHERE LOWER(name) LIKE LOWER('%s%%')", $string, 0, 10);
  16.     while ($user = db_fetch_object($result)) {
  17.       $matches[$user->name] = check_plain($user->name);
  18.     }
  19.   }
  20.  
  21.   drupal_json($matches);
  22. }
  23.  
  24. /**
  25.  * Form builder; Request a password reset.
  26.  *
  27.  * @ingroup forms
  28.  * @see user_pass_validate()
  29.  * @see user_pass_submit()
  30.  */
  31. function user_pass() {
  32.   $form['name'] = array(
  33.     '#type' => 'textfield',
  34.     '#title' => t('Username or e-mail address'),
  35.     '#size' => 60,
  36.     '#maxlength' => max(USERNAME_MAX_LENGTH, EMAIL_MAX_LENGTH),
  37.     '#required' => TRUE,
  38.   );
  39.   $form['submit'] = array('#type' => 'submit', '#value' => t('E-mail new password'));
  40.  
  41.   return $form;
  42. }
  43.  
  44. function user_pass_validate($form, &$form_state) {
  45.   $name = trim($form_state['values']['name']);
  46.   // Try to load by email.
  47.   $account = user_load(array('mail' => $name, 'status' => 1));
  48.   if (!$account) {
  49.     // No success, try to load by name.
  50.     $account = user_load(array('name' => $name, 'status' => 1));
  51.   }
  52.   if (isset($account->uid)) {
  53.     form_set_value(array('#parents' => array('account')), $account, $form_state);
  54.   }
  55.   else {
  56.     form_set_error('name', t('Sorry, %name is not recognized as a user name or an e-mail address.', array('%name' => $name)));
  57.   }
  58. }
  59.  
  60. function user_pass_submit($form, &$form_state) {
  61.   global $language;
  62.  
  63.   $account = $form_state['values']['account'];
  64.   // Mail one time login URL and instructions using current language.
  65.   _user_mail_notify('password_reset', $account, $language);
  66.   watchdog('user', 'Password reset instructions mailed to %name at %email.', array('%name' => $account->name, '%email' => $account->mail));
  67.   drupal_set_message(t('Further instructions have been sent to your e-mail address.'));
  68.  
  69.   $form_state['redirect'] = 'user';
  70.   return;
  71. }
  72.  
  73. /**
  74.  * Menu callback; process one time login link and redirects to the user page on success.
  75.  */
  76. function user_pass_reset(&$form_state, $uid, $timestamp, $hashed_pass, $action = NULL) {
  77.   global $user;
  78.  
  79.   // Check if the user is already logged in. The back button is often the culprit here.
  80.   if ($user->uid) {
  81.     drupal_set_message(t('You have already used this one-time login link. It is not necessary to use this link to login anymore. You are already logged in.'));
  82.     drupal_goto();
  83.   }
  84.   else {
  85.     // Time out, in seconds, until login URL expires. 24 hours = 86400 seconds.
  86.     $timeout = 86400;
  87.     $current = time();
  88.     // Some redundant checks for extra security ?
  89.     if ($timestamp < $current && $account = user_load(array('uid' => $uid, 'status' => 1)) ) {
  90.       // No time out for first time login.
  91.       if ($account->login && $current - $timestamp > $timeout) {
  92.         drupal_set_message(t('You have tried to use a one-time login link that has expired. Please request a new one using the form below.'));
  93.         drupal_goto('user/password');
  94.       }
  95.       else if ($account->uid && $timestamp > $account->login && $timestamp < $current && $hashed_pass == user_pass_rehash($account->pass, $timestamp, $account->login)) {
  96.         // First stage is a confirmation form, then login
  97.         if ($action == 'login') {
  98.           watchdog('user', 'User %name used one-time login link at time %timestamp.', array('%name' => $account->name, '%timestamp' => $timestamp));
  99.           // Set the new user.
  100.           $user = $account;
  101.           // user_authenticate_finalize() also updates the login timestamp of the
  102.           // user, which invalidates further use of the one-time login link.
  103.           user_authenticate_finalize($form_state['values']);
  104.           drupal_set_message(t('You have just used your one-time login link. It is no longer necessary to use this link to login. Please change your password.'));
  105.           drupal_goto('user/'. $user->uid .'/edit');
  106.         }
  107.         else {
  108.           $form['message'] = array('#value' => t('<p>This is a one-time login for %user_name and will expire on %expiration_date.</p><p>Click on this button to login to the site and change your password.</p>', array('%user_name' => $account->name, '%expiration_date' => format_date($timestamp + $timeout))));
  109.           $form['help'] = array('#value' => '<p>'. t('This login can be used only once.') .'</p>');
  110.           $form['submit'] = array('#type' => 'submit', '#value' => t('Log in'));
  111.           $form['#action'] = url("user/reset/$uid/$timestamp/$hashed_pass/login");
  112.           return $form;
  113.         }
  114.       }
  115.       else {
  116.         drupal_set_message(t('You have tried to use a one-time login link which has either been used or is no longer valid. Please request a new one using the form below.'));
  117.         drupal_goto('user/password');
  118.       }
  119.     }
  120.     else {
  121.       // Deny access, no more clues.
  122.       // Everything will be in the watchdog's URL for the administrator to check.
  123.       drupal_access_denied();
  124.     }
  125.   }
  126. }
  127.  
  128. /**
  129.  * Menu callback; logs the current user out, and redirects to the home page.
  130.  */
  131. function user_logout() {
  132.   global $user;
  133.  
  134.   watchdog('user', 'Session closed for %name.', array('%name' => $user->name));
  135.  
  136.   // Destroy the current session:
  137.   session_destroy();
  138.   module_invoke_all('user', 'logout', NULL, $user);
  139.  
  140.   // Load the anonymous user
  141.   $user = drupal_anonymous_user();
  142.  
  143.   drupal_goto();
  144. }
  145.  
  146. /**
  147.  * Menu callback; Displays a user or user profile page.
  148.  */
  149. function user_view($account) {
  150.   drupal_set_title(check_plain($account->name));
  151.   // Retrieve all profile fields and attach to $account->content.
  152.   user_build_content($account);
  153.  
  154.   // To theme user profiles, copy modules/user/user_profile.tpl.php
  155.   // to your theme directory, and edit it as instructed in that file's comments.
  156.   return theme('user_profile', $account);
  157. }
  158.  
  159. /**
  160.  * Process variables for user-profile.tpl.php.
  161.  *
  162.  * The $variables array contains the following arguments:
  163.  * - $account
  164.  *
  165.  * @see user-picture.tpl.php
  166.  */
  167. function template_preprocess_user_profile(&$variables) {
  168.   $variables['profile'] = array();
  169.   // Sort sections by weight
  170.   uasort($variables['account']->content, 'element_sort');
  171.   // Provide keyed variables so themers can print each section independantly.
  172.   foreach (element_children($variables['account']->content) as $key) {
  173.     $variables['profile'][$key] = drupal_render($variables['account']->content[$key]);
  174.   }
  175.   // Collect all profiles to make it easier to print all items at once.
  176.   $variables['user_profile'] = implode($variables['profile']);
  177. }
  178.  
  179. /**
  180.  * Process variables for user-profile-item.tpl.php.
  181.  *
  182.  * The $variables array contains the following arguments:
  183.  * - $element
  184.  *
  185.  * @see user-profile-item.tpl.php
  186.  */
  187. function template_preprocess_user_profile_item(&$variables) {
  188.   $variables['title'] = $variables['element']['#title'];
  189.   $variables['value'] = $variables['element']['#value'];
  190.   $variables['attributes'] = '';
  191.   if (isset($variables['element']['#attributes'])) {
  192.     $variables['attributes'] = drupal_attributes($variables['element']['#attributes']);
  193.   }
  194. }
  195.  
  196. /**
  197.  * Process variables for user-profile-category.tpl.php.
  198.  *
  199.  * The $variables array contains the following arguments:
  200.  * - $element
  201.  *
  202.  * @see user-profile-category.tpl.php
  203.  */
  204. function template_preprocess_user_profile_category(&$variables) {
  205.   $variables['title'] = check_plain($variables['element']['#title']);
  206.   $variables['profile_items'] = $variables['element']['#children'];
  207.   $variables['attributes'] = '';
  208.   if (isset($variables['element']['#attributes'])) {
  209.     $variables['attributes'] = drupal_attributes($variables['element']['#attributes']);
  210.   }
  211. }
  212.  
  213. /**
  214.  * Form builder; Present the form to edit a given user or profile category.
  215.  *
  216.  * @ingroup forms
  217.  * @see user_edit_validate()
  218.  * @see user_edit_submit()
  219.  */
  220. function user_edit($account, $category = 'account') {
  221.   drupal_set_title(check_plain($account->name));
  222.   return drupal_get_form('user_profile_form', $account, $category);
  223. }
  224.  
  225. /**
  226.  * Form builder; edit a user account or one of their profile categories.
  227.  *
  228.  * @ingroup forms
  229.  * @see user_profile_form_validate()
  230.  * @see user_profile_form_submit()
  231.  * @see user_edit_delete_submit()
  232.  */
  233. function user_profile_form($form_state, $account, $category = 'account') {
  234.  
  235.   $edit = (empty($form_state['values'])) ? (array)$account : $form_state['values'];
  236.  
  237.   $form = _user_forms($edit, $account, $category);
  238.   $form['_category'] = array('#type' => 'value', '#value' => $category);
  239.   $form['_account'] = array('#type' => 'value', '#value' => $account);
  240.   $form['submit'] = array('#type' => 'submit', '#value' => t('Save'), '#weight' => 30);
  241.   if (user_access('administer users')) {
  242.     $form['delete'] = array(
  243.       '#type' => 'submit',
  244.       '#value' => t('Delete'),
  245.       '#weight' => 31,
  246.       '#submit' => array('user_edit_delete_submit'),
  247.     );
  248.   }
  249.   $form['#attributes']['enctype'] = 'multipart/form-data';
  250.  
  251.   return $form;
  252. }
  253.  
  254. /**
  255.  * Validation function for the user account and profile editing form.
  256.  */
  257. function user_profile_form_validate($form, &$form_state) {
  258.   user_module_invoke('validate', $form_state['values'], $form_state['values']['_account'], $form_state['values']['_category']);
  259.   // Validate input to ensure that non-privileged users can't alter protected data.
  260.   if ((!user_access('administer users') && array_intersect(array_keys($form_state['values']), array('uid', 'init', 'session'))) || (!user_access('administer permissions') && isset($form_state['values']['roles']))) {
  261.     watchdog('security', 'Detected malicious attempt to alter protected user fields.', array(), WATCHDOG_WARNING);
  262.     // set this to a value type field
  263.     form_set_error('category', t('Detected malicious attempt to alter protected user fields.'));
  264.   }
  265. }
  266.  
  267. /**
  268.  * Submit function for the user account and profile editing form.
  269.  */
  270. function user_profile_form_submit($form, &$form_state) {
  271.   $account = $form_state['values']['_account'];
  272.   $category = $form_state['values']['_category'];
  273.   unset($form_state['values']['_account'], $form_state['values']['op'], $form_state['values']['submit'], $form_state['values']['delete'], $form_state['values']['form_token'], $form_state['values']['form_id'], $form_state['values']['_category']);
  274.   user_module_invoke('submit', $form_state['values'], $account, $category);
  275.   user_save($account, $form_state['values'], $category);
  276.  
  277.   // Clear the page cache because pages can contain usernames and/or profile information:
  278.   cache_clear_all();
  279.  
  280.   drupal_set_message(t('The changes have been saved.'));
  281.   return;
  282. }
  283.  
  284. /**
  285.  * Submit function for the 'Delete' button on the user edit form.
  286.  */
  287. function user_edit_delete_submit($form, &$form_state) {
  288.   $destination = '';
  289.   if (isset($_REQUEST['destination'])) {
  290.     $destination = drupal_get_destination();
  291.     unset($_REQUEST['destination']);
  292.   }
  293.   // Note: We redirect from user/uid/edit to user/uid/delete to make the tabs disappear.
  294.   $form_state['redirect'] = array("user/". $form_state['values']['_account']->uid ."/delete", $destination);
  295. }
  296.  
  297. /**
  298.  * Form builder; confirm form for user deletion.
  299.  *
  300.  * @ingroup forms
  301.  * @see user_confirm_delete_submit()
  302.  */
  303. function user_confirm_delete(&$form_state, $account) {
  304.  
  305.   $form['_account'] = array('#type' => 'value', '#value' => $account);
  306.  
  307.   return confirm_form($form,
  308.     t('Are you sure you want to delete the account %name?', array('%name' => $account->name)),
  309.     'user/'. $account->uid,
  310.     t('All submissions made by this user will be attributed to the anonymous account. This action cannot be undone.'),
  311.     t('Delete'), t('Cancel'));
  312. }
  313.  
  314. /**
  315.  * Submit function for the confirm form for user deletion.
  316.  */
  317. function user_confirm_delete_submit($form, &$form_state) {
  318.   user_delete($form_state['values'], $form_state['values']['_account']->uid);
  319.   drupal_set_message(t('%name has been deleted.', array('%name' => $form_state['values']['_account']->name)));
  320.  
  321.   if (!isset($_REQUEST['destination'])) {
  322.     $form_state['redirect'] = 'admin/user/user';
  323.   }
  324. }
  325.  
  326. function user_edit_validate($form, &$form_state) {
  327.   user_module_invoke('validate', $form_state['values'], $form_state['values']['_account'], $form_state['values']['_category']);
  328.   // Validate input to ensure that non-privileged users can't alter protected data.
  329.   if ((!user_access('administer users') && array_intersect(array_keys($form_state['values']), array('uid', 'init', 'session'))) || (!user_access('administer permissions') && isset($form_state['values']['roles']))) {
  330.     watchdog('security', 'Detected malicious attempt to alter protected user fields.', array(), WATCHDOG_WARNING);
  331.     // set this to a value type field
  332.     form_set_error('category', t('Detected malicious attempt to alter protected user fields.'));
  333.   }
  334. }
  335.  
  336. function user_edit_submit($form, &$form_state) {
  337.   $account = $form_state['values']['_account'];
  338.   $category = $form_state['values']['_category'];
  339.   unset($form_state['values']['_account'], $form_state['values']['op'], $form_state['values']['submit'], $form_state['values']['delete'], $form_state['values']['form_token'], $form_state['values']['form_id'], $form_state['values']['_category']);
  340.   user_module_invoke('submit', $form_state['values'], $account, $category);
  341.   user_save($account, $form_state['values'], $category);
  342.  
  343.   // Clear the page cache because pages can contain usernames and/or profile information:
  344.   cache_clear_all();
  345.  
  346.   drupal_set_message(t('The changes have been saved.'));
  347.   return;
  348. }
  349.  
  350. /**
  351.  * Access callback for path /user.
  352.  *
  353.  * Displays user profile if user is logged in, or login form for anonymous
  354.  * users.
  355.  */
  356. function user_page() {
  357.   global $user;
  358.   if ($user->uid) {
  359.     menu_set_active_item('user/'. $user->uid);
  360.     return menu_execute_active_handler();
  361.   }
  362.   else {
  363.     return drupal_get_form('user_login');
  364.   }
  365. }
  366.