fix: Corrige controle de acesso a campos do perfil

- Retorna neutral() quando $items e NULL (contexto sem entidade),
  evitando forbidden() prematuro que escondia campos no formulario
- Retorna neutral() para o proprio usuario sem a permissao explicita,
  deferindo ao comportamento padrao do Drupal em vez de negar acesso
- Retorna forbidden() apenas quando ha entidade e o usuario esta
  editando o perfil de outro (sem permissao 'edit any')
- A permissao 'edit own user profile fields' passa a funcionar como
  controle refinado via config: se presente, aplica restricoes por
  campo; se ausente, o modulo nao interfere no acesso padrao

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-23 14:49:33 -03:00
parent 5eca037739
commit e9f4cdcfb4

View File

@@ -95,24 +95,32 @@ function site_users_check_profile_field_access($operation, AccountInterface $acc
}
if ($operation === 'view') {
// Pode ver qualquer perfil.
if ($account->hasPermission('view any user profile fields')) {
return AccessResult::allowed()->cachePerPermissions();
}
// Pode ver apenas o próprio perfil.
// Sem entidade disponível, defer.
if (!$items) {
return AccessResult::neutral();
}
if ($is_own && $account->hasPermission('view own user profile fields')) {
return AccessResult::allowed()->cachePerPermissions()->cachePerUser();
}
return AccessResult::forbidden()->cachePerPermissions()->cachePerUser();
if (!$is_own) {
return AccessResult::forbidden()->cachePerPermissions()->cachePerUser();
}
return AccessResult::neutral()->cachePerUser();
}
if ($operation === 'edit') {
// Pode editar qualquer perfil.
if ($account->hasPermission('edit any user profile fields')) {
return AccessResult::allowed()->cachePerPermissions();
}
// Pode editar apenas o próprio perfil, se o campo estiver habilitado na config.
// Sem entidade disponível, defer.
if (!$items) {
return AccessResult::neutral();
}
if ($is_own && $account->hasPermission('edit own user profile fields')) {
// Campo habilitado na config?
$config = \Drupal::config('site_users.settings');
$field_enabled = $config->get('user_editable_fields.' . $field_name) ?? TRUE;
if ($field_enabled) {
@@ -120,7 +128,11 @@ function site_users_check_profile_field_access($operation, AccountInterface $acc
}
return AccessResult::forbidden()->cachePerPermissions()->cachePerUser()->addCacheTags(['config:site_users.settings']);
}
return AccessResult::forbidden()->cachePerPermissions()->cachePerUser();
if (!$is_own) {
return AccessResult::forbidden()->cachePerPermissions()->cachePerUser();
}
// Próprio usuário sem a permissão explícita: defer ao comportamento padrão do Drupal.
return AccessResult::neutral()->cachePerUser();
}
return AccessResult::neutral();
@@ -143,22 +155,28 @@ function site_users_check_photo_field_access($operation, AccountInterface $accou
}
if ($operation === 'view') {
// Fotos seguem a mesma regra dos campos de perfil para visualização.
if ($account->hasPermission('view any user profile fields')) {
return AccessResult::allowed()->cachePerPermissions();
}
if (!$items) {
return AccessResult::neutral();
}
if ($is_own && $account->hasPermission('view own user profile fields')) {
return AccessResult::allowed()->cachePerPermissions()->cachePerUser();
}
return AccessResult::forbidden()->cachePerPermissions()->cachePerUser();
if (!$is_own) {
return AccessResult::forbidden()->cachePerPermissions()->cachePerUser();
}
return AccessResult::neutral()->cachePerUser();
}
if ($operation === 'edit') {
// Pode gerenciar fotos de qualquer usuário.
if ($account->hasPermission('manage user photos')) {
return AccessResult::allowed()->cachePerPermissions();
}
// Pode gerenciar apenas as próprias fotos, se o campo estiver habilitado na config.
if (!$items) {
return AccessResult::neutral();
}
if ($is_own && $account->hasPermission('manage own user photos')) {
$config = \Drupal::config('site_users.settings');
$field_enabled = $config->get('user_editable_fields.' . $field_name) ?? TRUE;
@@ -167,7 +185,10 @@ function site_users_check_photo_field_access($operation, AccountInterface $accou
}
return AccessResult::forbidden()->cachePerPermissions()->cachePerUser()->addCacheTags(['config:site_users.settings']);
}
return AccessResult::forbidden()->cachePerPermissions()->cachePerUser();
if (!$is_own) {
return AccessResult::forbidden()->cachePerPermissions()->cachePerUser();
}
return AccessResult::neutral()->cachePerUser();
}
return AccessResult::neutral();