diff --git a/core/modules/user/lib/Drupal/user/Access/RoleDeleteAccessCheck.php b/core/modules/user/lib/Drupal/user/Access/RoleDeleteAccessCheck.php index 1efc872..9e5dd22 100644 --- a/core/modules/user/lib/Drupal/user/Access/RoleDeleteAccessCheck.php +++ b/core/modules/user/lib/Drupal/user/Access/RoleDeleteAccessCheck.php @@ -17,14 +17,14 @@ class RoleDeleteAccessCheck implements AccessCheckInterface { /** - * Implements AccessCheckInterface::applies(). + * {@inheritdoc} */ public function applies(Route $route) { return array_key_exists('_access_role_delete', $route->getRequirements()); } /** - * Implements AccessCheckInterface::access(). + * {@inheritdoc} */ public function access(Route $route, Request $request) { if ($user_role = $request->attributes->get('user_role')) { diff --git a/core/modules/user/lib/Drupal/user/Form/UserRoleDelete.php b/core/modules/user/lib/Drupal/user/Form/UserRoleDelete.php index 969d89f..083cbe5 100644 --- a/core/modules/user/lib/Drupal/user/Form/UserRoleDelete.php +++ b/core/modules/user/lib/Drupal/user/Form/UserRoleDelete.php @@ -23,35 +23,35 @@ class UserRoleDelete extends ConfirmFormBase { protected $user_role; /** - * Implements \Drupal\Core\Form\FormInterface::getFormID(). + * {@inheritdoc} */ public function getFormID() { return 'user_role_delete_form'; } /** - * Implements \Drupal\Core\Form\ConfirmFormBase::getQuestion(). + * {@inheritdoc} */ protected function getQuestion() { return t('Are you sure you want to delete the role %name?', array('%name' => $this->user_role->label())); } /** - * Implements \Drupal\Core\Form\ConfirmFormBase::getCancelPath(). + * {@inheritdoc} */ protected function getCancelPath() { return 'admin/people/roles'; } /** - * Implements \Drupal\Core\Form\ConfirmFormBase::getConfirmText(). + * {@inheritdoc} */ protected function getConfirmText() { return t('Delete'); } /** - * Implements \Drupal\Core\Form\FormInterface::buildForm(). + * {@inheritdoc} */ public function buildForm(array $form, array &$form_state, Role $user_role = NULL) { $this->user_role = $user_role; @@ -59,7 +59,7 @@ public function buildForm(array $form, array &$form_state, Role $user_role = NUL } /** - * Implements \Drupal\Core\Form\FormInterface::submitForm(). + * {@inheritdoc} */ public function submitForm(array &$form, array &$form_state) { $this->user_role->delete(); diff --git a/core/modules/user/lib/Drupal/user/RoleAccessController.php b/core/modules/user/lib/Drupal/user/RoleAccessController.php index b09fe6c..a4dcdb7 100644 --- a/core/modules/user/lib/Drupal/user/RoleAccessController.php +++ b/core/modules/user/lib/Drupal/user/RoleAccessController.php @@ -18,7 +18,7 @@ class RoleAccessController extends EntityAccessController { /** - * Overrides \Drupal\Core\Entity\EntityAccessController::deleteAccess(). + * {@inheritdoc} */ public function deleteAccess(EntityInterface $entity, $langcode = LANGUAGE_DEFAULT, User $account = NULL) { // Prevent the system-defined roles from being removed. diff --git a/core/modules/user/user.admin.inc b/core/modules/user/user.admin.inc index 3403190..b7cd62d 100644 --- a/core/modules/user/user.admin.inc +++ b/core/modules/user/user.admin.inc @@ -5,6 +5,8 @@ * Admin page callback file for the user module. */ +use Drupal\user\Form\UserMultipleCancelConfirm; + /** * Page callback: Generates the appropriate user administration form. * @@ -31,7 +33,8 @@ function user_admin($callback_arg = '') { break; default: if (!empty($_POST['accounts']) && isset($_POST['operation']) && ($_POST['operation'] == 'cancel')) { - $build['user_multiple_cancel_confirm'] = drupal_get_form('user_multiple_cancel_confirm'); + $confirm_form = new UserMultipleCancelConfirm(); + $build['user_multiple_cancel_confirm'] = drupal_get_form($confirm_form); } else { $build['user_filter_form'] = drupal_get_form('user_filter_form'); diff --git a/core/modules/user/user.module b/core/modules/user/user.module index 4f308ca..21cced8 100644 --- a/core/modules/user/user.module +++ b/core/modules/user/user.module @@ -1027,11 +1027,7 @@ function user_menu() { ); $items['user/%user/cancel'] = array( 'title' => 'Cancel account', - 'page callback' => 'drupal_get_form', - 'page arguments' => array('user_cancel_confirm_form', 1), - 'access callback' => 'entity_page_access', - 'access arguments' => array(1, 'delete'), - 'file' => 'user.pages.inc', + 'route_name' => 'user_cancel_confirm', ); $items['user/%user/cancel/confirm/%/%'] = array( 'title' => 'Confirm account cancellation', @@ -2105,98 +2101,6 @@ function user_multiple_role_edit($accounts, $operation, $rid) { } } -function user_multiple_cancel_confirm($form, &$form_state) { - $edit = $form_state['input']; - - $form['accounts'] = array('#prefix' => '', '#tree' => TRUE); - $accounts = user_load_multiple(array_keys(array_filter($edit['accounts']))); - foreach ($accounts as $uid => $account) { - // Prevent user 1 from being canceled. - if ($uid <= 1) { - continue; - } - $form['accounts'][$uid] = array( - '#type' => 'hidden', - '#value' => $uid, - '#prefix' => '
  • ', - '#suffix' => check_plain($account->name) . "
  • \n", - ); - } - - // Output a notice that user 1 cannot be canceled. - if (isset($accounts[1])) { - $redirect = (count($accounts) == 1); - $message = t('The user account %name cannot be cancelled.', array('%name' => $accounts[1]->name)); - drupal_set_message($message, $redirect ? 'error' : 'warning'); - // If only user 1 was selected, redirect to the overview. - if ($redirect) { - drupal_goto('admin/people'); - } - } - - $form['operation'] = array('#type' => 'hidden', '#value' => 'cancel'); - - form_load_include($form_state, 'inc', 'user', 'user.pages'); - $form['user_cancel_method'] = array( - '#type' => 'radios', - '#title' => t('When cancelling these accounts'), - ); - $form['user_cancel_method'] += user_cancel_methods(); - - // Allow to send the account cancellation confirmation mail. - $form['user_cancel_confirm'] = array( - '#type' => 'checkbox', - '#title' => t('Require e-mail confirmation to cancel account.'), - '#default_value' => FALSE, - '#description' => t('When enabled, the user must confirm the account cancellation via e-mail.'), - ); - // Also allow to send account canceled notification mail, if enabled. - $form['user_cancel_notify'] = array( - '#type' => 'checkbox', - '#title' => t('Notify user when account is canceled.'), - '#default_value' => FALSE, - '#access' => config('user.settings')->get('notify.status_canceled'), - '#description' => t('When enabled, the user will receive an e-mail notification after the account has been cancelled.'), - ); - - return confirm_form($form, - t('Are you sure you want to cancel these user accounts?'), - 'admin/people', t('This action cannot be undone.'), - t('Cancel accounts'), t('Cancel')); -} - -/** - * Submit handler for mass-account cancellation form. - * - * @see user_multiple_cancel_confirm() - * @see user_cancel_confirm_form_submit() - */ -function user_multiple_cancel_confirm_submit($form, &$form_state) { - global $user; - - if ($form_state['values']['confirm']) { - foreach ($form_state['values']['accounts'] as $uid => $value) { - // Prevent programmatic form submissions from cancelling user 1. - if ($uid <= 1) { - continue; - } - // Prevent user administrators from deleting themselves without confirmation. - if ($uid == $user->uid) { - $admin_form_state = $form_state; - unset($admin_form_state['values']['user_cancel_confirm']); - // The $user global is not a complete user entity, so load the full - // entity. - $admin_form_state['values']['_account'] = user_load($user->uid); - user_cancel_confirm_form_submit(array(), $admin_form_state); - } - else { - user_cancel($form_state['values'], $uid, $form_state['values']['user_cancel_method']); - } - } - } - $form_state['redirect'] = 'admin/people'; -} - /** * List user administration filters that can be applied. */ diff --git a/core/modules/user/user.pages.inc b/core/modules/user/user.pages.inc index 140b767..b4db2d8 100644 --- a/core/modules/user/user.pages.inc +++ b/core/modules/user/user.pages.inc @@ -209,107 +209,6 @@ function user_edit_cancel_submit($form, &$form_state) { } /** - * Form builder; confirm form for cancelling user account. - * - * @ingroup forms - * @see user_edit_cancel_submit() - */ -function user_cancel_confirm_form($form, &$form_state, $account) { - global $user; - - $form['_account'] = array('#type' => 'value', '#value' => $account); - - // Display account cancellation method selection, if allowed. - $admin_access = user_access('administer users'); - $can_select_method = $admin_access || user_access('select account cancellation method'); - $form['user_cancel_method'] = array( - '#type' => 'radios', - '#title' => ($account->uid == $user->uid ? t('When cancelling your account') : t('When cancelling the account')), - '#access' => $can_select_method, - ); - $form['user_cancel_method'] += user_cancel_methods(); - - // Allow user administrators to skip the account cancellation confirmation - // mail (by default), as long as they do not attempt to cancel their own - // account. - $override_access = $admin_access && ($account->uid != $user->uid); - $form['user_cancel_confirm'] = array( - '#type' => 'checkbox', - '#title' => t('Require e-mail confirmation to cancel account.'), - '#default_value' => ($override_access ? FALSE : TRUE), - '#access' => $override_access, - '#description' => t('When enabled, the user must confirm the account cancellation via e-mail.'), - ); - // Also allow to send account canceled notification mail, if enabled. - $default_notify = config('user.settings')->get('notify.status_canceled'); - $form['user_cancel_notify'] = array( - '#type' => 'checkbox', - '#title' => t('Notify user when account is canceled.'), - '#default_value' => ($override_access ? FALSE : $default_notify), - '#access' => $override_access && $default_notify, - '#description' => t('When enabled, the user will receive an e-mail notification after the account has been cancelled.'), - ); - - // Prepare confirmation form page title and description. - if ($account->uid == $user->uid) { - $question = t('Are you sure you want to cancel your account?'); - } - else { - $question = t('Are you sure you want to cancel the account %name?', array('%name' => $account->name)); - } - $default_method = config('user.settings')->get('cancel_method'); - $description = NULL; - if ($can_select_method) { - $description = t('Select the method to cancel the account above.'); - } - // Options supplied via user_cancel_methods() can have a custom - // #confirm_description property for the confirmation form description. - elseif (isset($form['user_cancel_method'][$default_method]['#confirm_description'])) { - $description = $form['user_cancel_method'][$default_method]['#confirm_description']; - } - - // Always provide entity id in the same form key as in the entity edit form. - $form['uid'] = array('#type' => 'value', '#value' => $account->uid); - return confirm_form($form, - $question, - 'user/' . $account->uid, - $description . ' ' . t('This action cannot be undone.'), - t('Cancel account'), t('Cancel')); -} - -/** - * Submit handler for the account cancellation confirm form. - * - * @see user_cancel_confirm_form() - * @see user_multiple_cancel_confirm_submit() - */ -function user_cancel_confirm_form_submit($form, &$form_state) { - global $user; - $account = $form_state['values']['_account']; - - // Cancel account immediately, if the current user has administrative - // privileges, no confirmation mail shall be sent, and the user does not - // attempt to cancel the own account. - if (user_access('administer users') && empty($form_state['values']['user_cancel_confirm']) && $account->uid != $user->uid) { - user_cancel($form_state['values'], $account->uid, $form_state['values']['user_cancel_method']); - - $form_state['redirect'] = 'admin/people'; - } - else { - // Store cancelling method and whether to notify the user in $account for - // user_cancel_confirm(). - $account->user_cancel_method = $form_state['values']['user_cancel_method']; - $account->user_cancel_notify = $form_state['values']['user_cancel_notify']; - $account->save(); - _user_mail_notify('cancel_confirm', $account); - drupal_set_message(t('A confirmation request to cancel your account has been sent to your e-mail address.')); - watchdog('user', 'Sent account cancellation request to %name %email.', array('%name' => $account->name, '%email' => '<' . $account->mail . '>'), WATCHDOG_NOTICE); - - $form_state['redirect'] = "user/$account->uid"; - } -} - -/** * Helper function to return available account cancellation methods. * * See documentation of hook_user_cancel_methods_alter(). @@ -319,8 +218,6 @@ function user_cancel_confirm_form_submit($form, &$form_state) { * * @see hook_user_cancel_methods_alter() * @see user_admin_settings() - * @see user_cancel_confirm_form() - * @see user_multiple_cancel_confirm() */ function user_cancel_methods() { $anonymous_name = config('user.settings')->get('anonymous'); diff --git a/core/modules/user/user.routing.yml b/core/modules/user/user.routing.yml index b344244..43d65ab 100644 --- a/core/modules/user/user.routing.yml +++ b/core/modules/user/user.routing.yml @@ -32,3 +32,10 @@ user_role_delete: _form: '\Drupal\user\Form\UserRoleDelete' requirements: _access_role_delete: 'TRUE' + +user_cancel_confirm: + pattern: '/user/{user}/cancel' + defaults: + _form: '\Drupal\user\Form\UserCancelConfirm' + requirements: + _access_user_delete: 'TRUE' diff --git a/core/modules/user/user.services.yml b/core/modules/user/user.services.yml index 77a91f4..4ab2d5f 100644 --- a/core/modules/user/user.services.yml +++ b/core/modules/user/user.services.yml @@ -11,6 +11,10 @@ services: class: Drupal\user\Access\RoleDeleteAccessCheck tags: - { name: access_check } + access_check.user.delete: + class: Drupal\user\Access\UserDeleteAccessCheck + tags: + - { name: access_check } user.data: class: Drupal\user\UserData arguments: ['@database']