diff -u b/core/modules/user/src/AccountForm.php b/core/modules/user/src/AccountForm.php --- b/core/modules/user/src/AccountForm.php +++ b/core/modules/user/src/AccountForm.php @@ -94,7 +94,7 @@ '#type' => 'email', '#title' => $this->t('Email address'), '#description' => $this->t('A valid email address. All emails from the system will be sent to this address. The email address is not made public and will only be used if you wish to receive a new password or wish to receive certain news or notifications by email.'), - '#required' => user_mail_required($account->getEmail()), + '#required' => !(!$account->getEmail() && $user->hasPermission('administer users')), '#default_value' => (!$register ? $account->getEmail() : ''), ]; @@ -112,7 +112,7 @@ 'spellcheck' => 'false', ], '#default_value' => (!$register ? $account->getAccountName() : ''), - '#access' => $account->name->access('edit', $user, TRUE), + '#access' => $account->name->access('edit'), ]; // Display password field only for existing users or when user is allowed to @@ -190,7 +190,7 @@ '#title' => $this->t('Status'), '#default_value' => $status, '#options' => [$this->t('Blocked'), $this->t('Active')], - '#access' => $account->status->access('edit', $user, TRUE), + '#access' => $account->status->access('edit'), ]; $roles = array_map(['\Drupal\Component\Utility\Html', 'escape'], user_role_names(TRUE)); diff -u b/core/modules/user/src/Form/UserMultipleCancelConfirm.php b/core/modules/user/src/Form/UserMultipleCancelConfirm.php --- b/core/modules/user/src/Form/UserMultipleCancelConfirm.php +++ b/core/modules/user/src/Form/UserMultipleCancelConfirm.php @@ -143,7 +143,6 @@ // Display account cancellation method selection, if allowed. $user = $this->currentUser(); - $cancelMethods = user_cancel_methods(); $selectCancel = $user->hasPermission('administer users') || $user->hasPermission('select account cancellation method'); $form['user_cancel_method'] = [ @@ -151,7 +150,8 @@ '#title' => $this->t('When cancelling these accounts'), '#access' => $selectCancel, ]; - $form['user_cancel_method'] += $cancelMethods; + + $form['user_cancel_method'] += user_cancel_methods(); if (!$selectCancel) { // Display an item to inform the user of the setting. @@ -159,7 +159,7 @@ $form['user_cancel_method_show'] = [ '#type' => 'item', '#title' => $this->t('When cancelling these accounts'), - '#plain_text' => $cancelMethods['#options'][$default_method], + '#plain_text' => $form['user_cancel_method']['#options'][$default_method], ]; } reverted: --- b/core/modules/user/src/Plugin/Validation/Constraint/UserMailRequiredValidator.php +++ a/core/modules/user/src/Plugin/Validation/Constraint/UserMailRequiredValidator.php @@ -29,7 +29,7 @@ $existing_value = $account_unchanged->getEmail(); } + $required = !(!$existing_value && \Drupal::currentUser()->hasPermission('administer users')); - $required = user_mail_required($existing_value); if ($required && (!isset($items) || $items->isEmpty())) { $this->context->addViolation($constraint->message, ['@name' => $account->getFieldDefinition('mail')->getLabel()]); diff -u b/core/modules/user/src/RegisterForm.php b/core/modules/user/src/RegisterForm.php --- b/core/modules/user/src/RegisterForm.php +++ b/core/modules/user/src/RegisterForm.php @@ -36,7 +36,7 @@ $form['#attached']['library'][] = 'core/drupal.form'; - // For users editing their own account, populate the form fields using data from the + // For non-admin users, populate the form fields using data from the // browser. if (!$admin) { $form['#attributes']['data-user-info-from-browser'] = TRUE; reverted: --- b/core/modules/user/src/Tests/Views/UserFieldsAccessChangeTest.php +++ /dev/null @@ -1,54 +0,0 @@ -drupalGet($path); - - // User has access to name and created date by default. - $this->assertText(t('Name')); - $this->assertText(t('Created')); - - // User does not by default have access to init, mail and status. - $this->assertNoText(t('Init')); - $this->assertNoText(t('Email')); - $this->assertNoText(t('Status')); - - // Assign sub-admin role to grant extra access. - $user = $this->drupalCreateUser(['sub-admin']); - $this->drupalLogin($user); - - $this->drupalGet($path); - - // Access for init, mail and status is added in hook_entity_field_access(). - $this->assertText(t('Init')); - $this->assertText(t('Email')); - $this->assertText(t('Status')); - } - -} reverted: --- b/core/modules/user/tests/modules/user_test_views/test_views/views.view.test_user_fields_access.yml +++ /dev/null @@ -1,478 +0,0 @@ -langcode: en -status: true -dependencies: - module: - - user -id: test_user_fields_access -label: '' -module: views -description: '' -tag: '' -base_table: users_field_data -base_field: uid -core: 8.x -display: - default: - display_plugin: default - id: default - display_title: Master - position: 0 - display_options: - access: - type: none - options: { } - cache: - type: tag - options: { } - query: - type: views_query - options: - disable_sql_rewrite: false - distinct: false - replica: false - query_comment: '' - query_tags: { } - exposed_form: - type: basic - options: - submit_button: Apply - reset_button: false - reset_button_label: Reset - exposed_sorts_label: 'Sort by' - expose_sort_order: true - sort_asc_label: Asc - sort_desc_label: Desc - pager: - type: mini - options: - items_per_page: 10 - offset: 0 - id: 0 - total_pages: null - expose: - items_per_page: false - items_per_page_label: 'Items per page' - items_per_page_options: '5, 10, 25, 50' - items_per_page_options_all: false - items_per_page_options_all_label: '- All -' - offset: false - offset_label: Offset - tags: - previous: ‹‹ - next: ›› - style: - type: table - options: - grouping: { } - row_class: '' - default_row_class: true - override: true - sticky: false - caption: '' - summary: '' - description: '' - columns: - name: name - status: status - mail: mail - init: init - created: created - info: - name: - sortable: false - default_sort_order: asc - align: '' - separator: '' - empty_column: false - responsive: '' - status: - sortable: false - default_sort_order: asc - align: '' - separator: '' - empty_column: false - responsive: '' - mail: - sortable: false - default_sort_order: asc - align: '' - separator: '' - empty_column: false - responsive: '' - init: - sortable: false - default_sort_order: asc - align: '' - separator: '' - empty_column: false - responsive: '' - created: - sortable: false - default_sort_order: asc - align: '' - separator: '' - empty_column: false - responsive: '' - default: '-1' - empty_table: false - row: - type: fields - fields: - name: - id: name - table: users_field_data - field: name - relationship: none - group_type: group - admin_label: '' - label: Name - exclude: false - alter: - alter_text: false - text: '' - make_link: false - path: '' - absolute: false - external: false - replace_spaces: false - path_case: none - trim_whitespace: false - alt: '' - rel: '' - link_class: '' - prefix: '' - suffix: '' - target: '' - nl2br: false - max_length: 0 - word_boundary: false - ellipsis: false - more_link: false - more_link_text: '' - more_link_path: '' - strip_tags: false - trim: false - preserve_tags: '' - html: false - element_type: '' - element_class: '' - element_label_type: '' - element_label_class: '' - element_label_colon: true - element_wrapper_type: '' - element_wrapper_class: '' - element_default_classes: true - empty: '' - hide_empty: false - empty_zero: false - hide_alter_empty: true - click_sort_column: value - type: user_name - settings: - link_to_entity: true - group_column: value - group_columns: { } - group_rows: true - delta_limit: 0 - delta_offset: 0 - delta_reversed: false - delta_first_last: false - multi_type: separator - separator: ', ' - field_api_classes: false - entity_type: user - entity_field: name - plugin_id: field - status: - id: status - table: users_field_data - field: status - relationship: none - group_type: group - admin_label: '' - label: Status - exclude: false - alter: - alter_text: false - text: '' - make_link: false - path: '' - absolute: false - external: false - replace_spaces: false - path_case: none - trim_whitespace: false - alt: '' - rel: '' - link_class: '' - prefix: '' - suffix: '' - target: '' - nl2br: false - max_length: 0 - word_boundary: true - ellipsis: true - more_link: false - more_link_text: '' - more_link_path: '' - strip_tags: false - trim: false - preserve_tags: '' - html: false - element_type: '' - element_class: '' - element_label_type: '' - element_label_class: '' - element_label_colon: true - element_wrapper_type: '' - element_wrapper_class: '' - element_default_classes: true - empty: '' - hide_empty: false - empty_zero: false - hide_alter_empty: true - click_sort_column: value - type: boolean - settings: - format: default - format_custom_true: '' - format_custom_false: '' - group_column: value - group_columns: { } - group_rows: true - delta_limit: 0 - delta_offset: 0 - delta_reversed: false - delta_first_last: false - multi_type: separator - separator: ', ' - field_api_classes: false - entity_type: user - entity_field: status - plugin_id: field - mail: - id: mail - table: users_field_data - field: mail - relationship: none - group_type: group - admin_label: '' - label: Email - exclude: false - alter: - alter_text: false - text: '' - make_link: false - path: '' - absolute: false - external: false - replace_spaces: false - path_case: none - trim_whitespace: false - alt: '' - rel: '' - link_class: '' - prefix: '' - suffix: '' - target: '' - nl2br: false - max_length: 0 - word_boundary: true - ellipsis: true - more_link: false - more_link_text: '' - more_link_path: '' - strip_tags: false - trim: false - preserve_tags: '' - html: false - element_type: '' - element_class: '' - element_label_type: '' - element_label_class: '' - element_label_colon: true - element_wrapper_type: '' - element_wrapper_class: '' - element_default_classes: true - empty: '' - hide_empty: false - empty_zero: false - hide_alter_empty: true - click_sort_column: value - type: basic_string - settings: { } - group_column: value - group_columns: { } - group_rows: true - delta_limit: 0 - delta_offset: 0 - delta_reversed: false - delta_first_last: false - multi_type: separator - separator: ', ' - field_api_classes: false - entity_type: user - entity_field: mail - plugin_id: field - init: - id: init - table: users_field_data - field: init - relationship: none - group_type: group - admin_label: '' - label: Init - exclude: false - alter: - alter_text: false - text: '' - make_link: false - path: '' - absolute: false - external: false - replace_spaces: false - path_case: none - trim_whitespace: false - alt: '' - rel: '' - link_class: '' - prefix: '' - suffix: '' - target: '' - nl2br: false - max_length: 0 - word_boundary: true - ellipsis: true - more_link: false - more_link_text: '' - more_link_path: '' - strip_tags: false - trim: false - preserve_tags: '' - html: false - element_type: '' - element_class: '' - element_label_type: '' - element_label_class: '' - element_label_colon: true - element_wrapper_type: '' - element_wrapper_class: '' - element_default_classes: true - empty: '' - hide_empty: false - empty_zero: false - hide_alter_empty: true - click_sort_column: value - type: basic_string - settings: { } - group_column: value - group_columns: { } - group_rows: true - delta_limit: 0 - delta_offset: 0 - delta_reversed: false - delta_first_last: false - multi_type: separator - separator: ', ' - field_api_classes: false - entity_type: user - entity_field: init - plugin_id: field - created: - id: created - table: users_field_data - field: created - relationship: none - group_type: group - admin_label: '' - label: Created - exclude: false - alter: - alter_text: false - text: '' - make_link: false - path: '' - absolute: false - external: false - replace_spaces: false - path_case: none - trim_whitespace: false - alt: '' - rel: '' - link_class: '' - prefix: '' - suffix: '' - target: '' - nl2br: false - max_length: 0 - word_boundary: true - ellipsis: true - more_link: false - more_link_text: '' - more_link_path: '' - strip_tags: false - trim: false - preserve_tags: '' - html: false - element_type: '' - element_class: '' - element_label_type: '' - element_label_class: '' - element_label_colon: true - element_wrapper_type: '' - element_wrapper_class: '' - element_default_classes: true - empty: '' - hide_empty: false - empty_zero: false - hide_alter_empty: true - click_sort_column: value - type: timestamp - settings: - date_format: medium - custom_date_format: '' - timezone: '' - group_column: value - group_columns: { } - group_rows: true - delta_limit: 0 - delta_offset: 0 - delta_reversed: false - delta_first_last: false - multi_type: separator - separator: ', ' - field_api_classes: false - entity_type: user - entity_field: created - plugin_id: field - filters: { } - sorts: { } - title: '' - header: { } - footer: { } - empty: { } - relationships: { } - arguments: { } - display_extenders: { } - cache_metadata: - max-age: 0 - contexts: - - 'languages:language_content' - - 'languages:language_interface' - - url.query_args - tags: { } - page_1: - display_plugin: page - id: page_1 - display_title: Page - position: 1 - display_options: - display_extenders: { } - path: test_user_fields_access - cache_metadata: - max-age: 0 - contexts: - - 'languages:language_content' - - 'languages:language_interface' - - url.query_args - tags: { } reverted: --- b/core/modules/user/user.module +++ a/core/modules/user/user.module @@ -1445,23 +1445,3 @@ $variables['content'][$key] = $variables['elements'][$key]; } } - -/** - * Determine if the user account 'mail' field is required. - * - * @param string $existing_value - * Existing mail value. - * - * @return boolean True if the mail field is required. - */ -function user_mail_required($existing_value) { - $required = TRUE; - - if (!$existing_value && \Drupal::currentUser()->hasPermission('administer users')) { - $required = FALSE; - } - - \Drupal::moduleHandler()->alter('user_mail_required', $required, $existing_value); - - return $required; -} diff -u b/core/modules/user/user.routing.yml b/core/modules/user/user.routing.yml --- b/core/modules/user/user.routing.yml +++ b/core/modules/user/user.routing.yml @@ -67,7 +67,7 @@ _form: '\Drupal\user\Form\UserMultipleCancelConfirm' _title: 'Cancel user' requirements: - _access: 'TRUE' + _permission: 'administer users' entity.user_role.collection: path: '/admin/people/roles'