feat: Sincroniza foto LDAP para field_user_photos no login

Implementa hook_ldap_user_edit_user_alter() para capturar a foto do
atributo LDAP configurado e adicioná-la como primeira entrada em
field_user_photos, sem queries adicionais ao servidor.

Inclui LdapPhotoSyncService com detecção de tipo via exif_imagetype,
deduplicação por MD5 e reutilização de media entity existente.
Adiciona checkbox para ativar/desativar o sync no formulário de settings,
com visibilidade condicional do campo de atributo via #states.

Corrige acesso a mídias publicadas para usuários autenticados via
hook_media_access(), resolvendo "Acesso restrito" no widget e na
visualização do perfil.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-25 15:23:20 -03:00
parent 5cacb97f12
commit 6266b42e0e
5 changed files with 210 additions and 1 deletions

View File

@@ -17,6 +17,7 @@ use Drupal\field\FieldConfigInterface;
use Drupal\media\MediaInterface;
use Drupal\site_users\Plugin\Field\FieldType\SocialLinkItem;
use Drupal\user\UserInterface;
use Symfony\Component\Ldap\Entry;
/**
* Implements hook_theme().
@@ -331,6 +332,25 @@ function site_users_user_presave(UserInterface $user) {
}
}
/**
* Implements hook_ENTITY_TYPE_access() for media entities.
*/
function site_users_media_access(\Drupal\media\MediaInterface $entity, string $operation, AccountInterface $account): AccessResult {
if ($operation === 'view' && $entity->isPublished() && $account->isAuthenticated()) {
return AccessResult::allowed()
->cachePerUser()
->addCacheableDependency($entity);
}
return AccessResult::neutral();
}
/**
* Implements hook_ldap_user_edit_user_alter().
*/
function site_users_ldap_user_edit_user_alter(UserInterface &$account, Entry $ldapEntry, array $context): void {
\Drupal::service('site_users.ldap_photo_sync')->syncFromLdapEntry($account, $ldapEntry);
}
/**
* Implements hook_user_format_name_alter().
*/