public function testReverseTransform()
 {
     $username = "******";
     $data = array();
     $data["cn"] = $username;
     $data["uid"] = $username;
     $data["objectClass"] = array();
     $data["objectClass"][] = "inetOrgPerson";
     $data["objectClass"][] = "posixAccount";
     $data["objectClass"][] = "shadowAccount";
     $data["uid"] = $username;
     $data["homeDirectory"] = "/var/vhome/" . $username;
     $data["givenName"] = $username;
     $data["sn"] = $username;
     $data["displayName"] = $username;
     $data["mail"] = $username . "@example.com";
     $data['uidNumber'] = 1337;
     // @TODO: probably take a autoincrement id
     $data['gidNumber'] = 1337;
     $data["loginShell"] = "/bin/false";
     $data['userPassword'] = array();
     $data['userPassword']['0'] = '{crypt}$6$rounds=60000$test=IbklOGzurN6$FOl9R8bgP4GVtXKeKTil2uMpJfSlEfcBM.1JJWKnrUgdA8Hxve4qONQLh9TprJviNb9TpeoMZdGGt8YnPu/uv.';
     $data['userPassword']['count'] = 1;
     $reader = new AnnotationReader();
     $transformer = new LdapArrayToObjectTransformer($reader);
     $entity = $transformer->reverseTransform($data);
     $this->assertNotNull($entity->getObject(PosixAccount::class));
     $this->assertEquals($entity->getObject(PosixAccount::class)->getUid(), $username);
     /*$this->assertCount(1, $user->getPasswords());
       $this->assertNotNull($user->getPassword("test"));
       $this->assertEquals($user->getPassword("test")->getHash(),$data["userPassword"]['0']);*/
 }
 /**
  * {@inheritDoc}
  * @return User
  */
 public function loadUserByUsername($username)
 {
     $username = $this->ldap->escape($username, '', LDAP_ESCAPE_FILTER);
     $query = str_replace('{username}', $username, str_replace('{uid_key}', $this->uidKey, $this->filter));
     $filter = array('createTimestamp', 'modifyTimestamp', '*');
     $dn = "ou=Users," . $this->baseDn;
     try {
         $search = $this->ldap->find($dn, $query, $filter);
     } catch (ConnectionException $e) {
         throw new UsernameNotFoundException(sprintf('User "%s" not found.', $username), 0, $e);
     }
     if (!$search) {
         throw new UsernameNotFoundException(sprintf('User "%s" not found.', $username));
     }
     if ($search['count'] > 1) {
         throw new UsernameNotFoundException('More than one user found');
     }
     $transformer = new LdapArrayToObjectTransformer($this->reader);
     $user = $transformer->reverseTransform($search[0], new User(null), $dn);
     foreach ($this->getServices() as $serviceName => $service) {
         $class = $service['object_class'];
         $serviceObject = new $class($serviceName);
         $dn = "ou=Users,dc=" . $serviceName . "," . $this->baseDn;
         $search = $this->ldap->find($dn, $query, $filter);
         if ($search !== null) {
             $serviceObject = $transformer->reverseTransform($search[0], $serviceObject, $dn);
         }
         $user->addService($serviceObject);
     }
     return $user;
 }
 public function update(User $user)
 {
     $errors = $this->validator->validate($user);
     if (count($errors) > 0) {
         throw new InvalidArgumentException((string) $errors);
     }
     // rehash changed passwords
     if ($user->getPasswordObject()->getPasswordPlain() !== null) {
         $this->encodePassword($user->getEncoder(), $user->getPasswordObject());
     }
     // validate ldap schemas
     foreach ($user->getObjects() as $object) {
         $errors = $this->validator->validate($object);
         if (count($errors) > 0) {
             throw new InvalidArgumentException($this->getUsername() . '(User):' . (string) $errors);
         }
     }
     $transformer = new LdapArrayToObjectTransformer(null);
     $this->client->replace('uid=' . $user->getUsername() . ',ou=users,' . $this->baseDn, $transformer->transform($user));
     foreach ($user->getServices() as $service) {
         $dn = 'uid=' . $user->getUsername() . ',ou=users,dc=' . $service->getName() . ',' . $this->baseDn;
         if ($service->isEnabled()) {
             foreach ($service->getPasswords() as $password) {
                 if ($password->getPasswordPlain() !== null) {
                     $this->encodePassword($service->getEncoder(), $password);
                 }
             }
             // validate ldap schemas
             foreach ($service->getObjects() as $object) {
                 $errors = $this->validator->validate($object);
                 if (count($errors) > 0) {
                     throw new InvalidArgumentException($service->getName() . "(Service): " . (string) $errors);
                 }
             }
             if ($this->client->isEntityExist($dn)) {
                 $this->client->replace($dn, $transformer->transform($service));
             } else {
                 $this->client->add($dn, $transformer->transform($service));
             }
             //add groups
             foreach ($service->getGroups() as $group) {
                 $dnGroup = 'uid=' . $user->getUsername() . ',ou=groups,dc=' . $service->getName() . ',' . $this->baseDn;
                 $errors = $this->validator->validate($group);
                 if (count($errors) > 0) {
                     throw new InvalidArgumentException($group->getName() . "(Group): " . (string) $errors);
                 }
                 if ($group->isEnabled()) {
                     if ($this->client->isEntityExist($dnGroup)) {
                         $this->client->replace($dnGroup, $transformer->transform($service));
                     } else {
                         $this->client->add($dnGroup, $transformer->transform($service));
                     }
                 } else {
                     if ($this->client->isEntityExist($dnGroup)) {
                         $this->client->delete($dnGroup);
                     }
                 }
             }
         } else {
             // !$service->isEnabled()
             if ($this->client->isEntityExist($dn)) {
                 $this->client->delete($dn);
             }
         }
     }
 }