示例#1
0
 /**
  * Create a new user. The created user is published by this method
  *
  * @param \eZ\Publish\API\Repository\Values\User\UserCreateStruct $userCreateStruct the data used for creating the user
  * @param \eZ\Publish\API\Repository\Values\User\UserGroup[] $parentGroups the groups which are assigned to the user after creation
  *
  * @return \eZ\Publish\API\Repository\Values\User\User
  *
  * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to move the user group
  * @throws \eZ\Publish\API\Repository\Exceptions\ContentFieldValidationException if a field in the $userCreateStruct is not valid
  * @throws \eZ\Publish\API\Repository\Exceptions\ContentValidationException if a required field is missing or set to an empty value
  * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if a user with provided login already exists
  */
 public function createUser(APIUserCreateStruct $userCreateStruct, array $parentGroups)
 {
     if (empty($parentGroups)) {
         throw new InvalidArgumentValue("parentGroups", $parentGroups);
     }
     if (!is_string($userCreateStruct->login) || empty($userCreateStruct->login)) {
         throw new InvalidArgumentValue("login", $userCreateStruct->login, "UserCreateStruct");
     }
     if (!is_string($userCreateStruct->email) || empty($userCreateStruct->email)) {
         throw new InvalidArgumentValue("email", $userCreateStruct->email, "UserCreateStruct");
     }
     if (!ezcMailTools::validateEmailAddress($userCreateStruct->email)) {
         throw new InvalidArgumentValue("email", $userCreateStruct->email, "UserCreateStruct");
     }
     if (!is_string($userCreateStruct->password) || empty($userCreateStruct->password)) {
         throw new InvalidArgumentValue("password", $userCreateStruct->password, "UserCreateStruct");
     }
     if (!is_bool($userCreateStruct->enabled)) {
         throw new InvalidArgumentValue("enabled", $userCreateStruct->enabled, "UserCreateStruct");
     }
     try {
         $this->userHandler->loadByLogin($userCreateStruct->login);
         throw new InvalidArgumentException("userCreateStruct", "User with provided login already exists");
     } catch (NotFoundException $e) {
         // Do nothing
     }
     $contentService = $this->repository->getContentService();
     $locationService = $this->repository->getLocationService();
     $contentTypeService = $this->repository->getContentTypeService();
     if ($userCreateStruct->contentType === null) {
         $userContentType = $contentTypeService->loadContentType($this->settings['userClassID']);
         $userCreateStruct->contentType = $userContentType;
     }
     $locationCreateStructs = array();
     foreach ($parentGroups as $parentGroup) {
         $parentGroup = $this->loadUserGroup($parentGroup->id);
         if ($parentGroup->getVersionInfo()->getContentInfo()->mainLocationId !== null) {
             $locationCreateStructs[] = $locationService->newLocationCreateStruct($parentGroup->getVersionInfo()->getContentInfo()->mainLocationId);
         }
     }
     // Search for the first ezuser field type in content type
     $userFieldDefinition = null;
     foreach ($userCreateStruct->contentType->getFieldDefinitions() as $fieldDefinition) {
         if ($fieldDefinition->fieldTypeIdentifier == 'ezuser') {
             $userFieldDefinition = $fieldDefinition;
             break;
         }
     }
     if ($userFieldDefinition === null) {
         throw new ContentValidationException("Provided content type does not contain ezuser field type");
     }
     $fixUserFieldType = true;
     foreach ($userCreateStruct->fields as $index => $field) {
         if ($field->fieldDefIdentifier == $userFieldDefinition->identifier) {
             if ($field->value instanceof UserValue) {
                 $userCreateStruct->fields[$index]->value->login = $userCreateStruct->login;
             } else {
                 $userCreateStruct->fields[$index]->value = new UserValue(array('login' => $userCreateStruct->login));
             }
             $fixUserFieldType = false;
         }
     }
     if ($fixUserFieldType) {
         $userCreateStruct->setField($userFieldDefinition->identifier, new UserValue(array('login' => $userCreateStruct->login)));
     }
     $this->repository->beginTransaction();
     try {
         $contentDraft = $contentService->createContent($userCreateStruct, $locationCreateStructs);
         // Create user before publishing, so that external data can be returned
         $spiUser = $this->userHandler->create(new SPIUser(array('id' => $contentDraft->id, 'login' => $userCreateStruct->login, 'email' => $userCreateStruct->email, 'passwordHash' => $this->createPasswordHash($userCreateStruct->login, $userCreateStruct->password, $this->settings['siteName'], $this->settings['hashType']), 'hashAlgorithm' => $this->settings['hashType'], 'isEnabled' => $userCreateStruct->enabled, 'maxLogin' => 0)));
         $publishedContent = $contentService->publishVersion($contentDraft->getVersionInfo());
         $this->repository->commit();
     } catch (Exception $e) {
         $this->repository->rollback();
         throw $e;
     }
     return $this->buildDomainUserObject($spiUser, $publishedContent);
 }
 /**
  * Create a new user. The created user is published by this method
  *
  * @param \eZ\Publish\API\Repository\Values\User\UserCreateStruct $userCreateStruct the data used for creating the user
  * @param array $parentGroups the groups of type {@link \eZ\Publish\API\Repository\Values\User\UserGroup} which are assigned to the user after creation
  *
  * @return \eZ\Publish\API\Repository\Values\User\User
  *
  * @throws \eZ\Publish\API\Repository\Exceptions\UnauthorizedException if the authenticated user is not allowed to move the user group
  * @throws \eZ\Publish\API\Repository\Exceptions\NotFoundException if a user group was not found
  * @throws \eZ\Publish\API\Repository\Exceptions\ContentFieldValidationException if a field in the $userCreateStruct is not valid
  * @throws \eZ\Publish\API\Repository\Exceptions\ContentValidationException if a required field is missing
  * @throws \eZ\Publish\API\Repository\Exceptions\InvalidArgumentException if a user with provided login already exists
  */
 public function createUser(UserCreateStruct $userCreateStruct, array $parentGroups)
 {
     if (false === $this->repository->hasAccess('content', 'create')) {
         throw new UnauthorizedExceptionStub('What error code should be used?');
     }
     foreach ($this->users as $user) {
         if ($user->login == $userCreateStruct->login) {
             throw new InvalidArgumentExceptionStub('What error code should be used?');
         }
     }
     $contentService = $this->repository->getContentService();
     $locationService = $this->repository->getLocationService();
     $locationCreateStruts = array();
     foreach ($parentGroups as $parentGroup) {
         if (false === $this->repository->canUser('content', 'edit', $parentGroup)) {
             throw new UnauthorizedExceptionStub('What error code should be used?');
         }
         $locationCreateStruts[] = $locationService->newLocationCreateStruct($parentGroup->contentInfo->mainLocationId);
     }
     // Seems the is a back reference in the content object
     $userCreateStruct->setField('user_account', new UserStub());
     $draft = $contentService->createContent($userCreateStruct, $locationCreateStruts);
     $content = $contentService->publishVersion($draft->getVersionInfo());
     $user = new UserStub(array('login' => $userCreateStruct->login, 'email' => $userCreateStruct->email, 'passwordHash' => $this->createHash($userCreateStruct->login, $userCreateStruct->password, 2), 'hashAlgorithm' => 2, 'enabled' => $userCreateStruct->enabled, 'content' => $content));
     $this->users[$user->id] = $user;
     foreach ($parentGroups as $parentGroup) {
         $this->assignUserToUserGroup($user, $parentGroup);
     }
     return $user;
 }