3 namespace Wallabag\UserBundle
;
5 use FR3D\LdapBundle\Hydrator\HydratorInterface
;
6 use FOS\UserBundle\FOSUserEvents
;
7 use FOS\UserBundle\Event\UserEvent
;
9 class LdapHydrator
implements HydratorInterface
12 private $eventDispatcher;
13 private $attributesMap;
14 private $enabledAttribute;
16 private $ldapAdminFilter;
19 public function __construct(
22 array $attributes_map,
27 $this->userManager
= $user_manager;
28 $this->eventDispatcher
= $event_dispatcher;
30 $this->attributesMap
= array(
31 'setUsername' => $attributes_map[0],
32 'setEmail' => $attributes_map[1],
33 'setName' => $attributes_map[2],
35 $this->enabledAttribute
= $attributes_map[3];
37 $this->ldapBaseDn
= $ldap_base_dn;
38 $this->ldapAdminFilter
= $ldap_admin_filter;
39 $this->ldapDriver
= $ldap_driver;
42 public function hydrate(array $ldapEntry)
44 $user = $this->userManager
->findUserBy(array('dn' => $ldapEntry['dn']));
47 $user = $this->userManager
->createUser();
48 $user->setDn($ldapEntry['dn']);
49 $user->setPassword('');
51 $this->updateUserFields($user, $ldapEntry);
53 $event = new UserEvent($user);
54 $this->eventDispatcher
->dispatch(FOSUserEvents
::USER_CREATED
, $event);
56 $this->userManager
->reloadUser($user);
58 $this->updateUserFields($user, $ldapEntry);
64 private function updateUserFields($user, $ldapEntry)
66 foreach ($this->attributesMap
as $key => $value) {
67 if (is_array($ldapEntry[$value])) {
68 $ldap_value = $ldapEntry[$value][0];
70 $ldap_value = $ldapEntry[$value];
73 call_user_func([$user, $key], $ldap_value);
76 if ($this->enabledAttribute
!== null) {
77 $user->setEnabled($ldapEntry[$this->enabledAttribute
]);
79 $user->setEnabled(true);
82 if ($this->isAdmin($user)) {
83 $user->addRole('ROLE_SUPER_ADMIN');
85 $user->removeRole('ROLE_SUPER_ADMIN');
88 $this->userManager
->updateUser($user, true);
91 private function isAdmin($user)
93 if ($this->ldapAdminFilter
=== null) {
97 $escaped_username = ldap_escape($user->getUsername(), '', LDAP_ESCAPE_FILTER
);
98 $filter = sprintf($this->ldapAdminFilter
, $escaped_username);
99 $entries = $this->ldapDriver
->search($this->ldapBaseDn
, $filter);
101 return $entries['count'] == 1;