Example #1
0
 /**
  * Update a share
  *
  * @param \OCP\Share\IShare $share
  * @return \OCP\Share\IShare The share object
  * @throws \InvalidArgumentException
  */
 public function updateShare(\OCP\Share\IShare $share)
 {
     $expirationDateUpdated = false;
     if (!$this->canShare($share)) {
         throw new \Exception('The Share API is disabled');
     }
     $originalShare = $this->getShareById($share->getFullId());
     // We can't change the share type!
     if ($share->getShareType() !== $originalShare->getShareType()) {
         throw new \InvalidArgumentException('Can\'t change share type');
     }
     // We can only change the recipient on user shares
     if ($share->getSharedWith() !== $originalShare->getSharedWith() && $share->getShareType() !== \OCP\Share::SHARE_TYPE_USER) {
         throw new \InvalidArgumentException('Can only update recipient on user shares');
     }
     // Cannot share with the owner
     if ($share->getShareType() === \OCP\Share::SHARE_TYPE_USER && $share->getSharedWith() === $share->getShareOwner()) {
         throw new \InvalidArgumentException('Can\'t share with the share owner');
     }
     $this->generalCreateChecks($share);
     if ($share->getShareType() === \OCP\Share::SHARE_TYPE_USER) {
         $this->userCreateChecks($share);
     } else {
         if ($share->getShareType() === \OCP\Share::SHARE_TYPE_GROUP) {
             $this->groupCreateChecks($share);
         } else {
             if ($share->getShareType() === \OCP\Share::SHARE_TYPE_LINK) {
                 $this->linkCreateChecks($share);
                 // Password updated.
                 if ($share->getPassword() !== $originalShare->getPassword()) {
                     //Verify the password
                     $this->verifyPassword($share->getPassword());
                     // If a password is set. Hash it!
                     if ($share->getPassword() !== null) {
                         $share->setPassword($this->hasher->hash($share->getPassword()));
                     }
                 }
                 if ($share->getExpirationDate() !== $originalShare->getExpirationDate()) {
                     //Verify the expiration date
                     $this->validateExpirationDate($share);
                     $expirationDateUpdated = true;
                 }
             }
         }
     }
     $this->pathCreateChecks($share->getNode());
     // Now update the share!
     $provider = $this->factory->getProviderForType($share->getShareType());
     $share = $provider->update($share);
     if ($expirationDateUpdated === true) {
         \OC_Hook::emit('OCP\\Share', 'post_set_expiration_date', ['itemType' => $share->getNode() instanceof \OCP\Files\File ? 'file' : 'folder', 'itemSource' => $share->getNode()->getId(), 'date' => $share->getExpirationDate(), 'uidOwner' => $share->getSharedBy()]);
     }
     if ($share->getPermissions() !== $originalShare->getPermissions()) {
         $userFolder = $this->rootFolder->getUserFolder($share->getShareOwner());
         \OC_Hook::emit('OCP\\Share', 'post_update_permissions', array('itemType' => $share->getNode() instanceof \OCP\Files\File ? 'file' : 'folder', 'itemSource' => $share->getNode()->getId(), 'shareType' => $share->getShareType(), 'shareWith' => $share->getSharedWith(), 'uidOwner' => $share->getSharedBy(), 'permissions' => $share->getPermissions(), 'path' => $userFolder->getRelativePath($share->getNode()->getPath())));
     }
     return $share;
 }
Example #2
0
 /**
  * Share a path
  *
  * @param IShare $share
  * @return Share The share object
  * @throws \Exception
  *
  * TODO: handle link share permissions or check them
  */
 public function createShare(IShare $share)
 {
     if (!$this->canShare($share)) {
         throw new \Exception('The Share API is disabled');
     }
     $this->generalCreateChecks($share);
     //Verify share type
     if ($share->getShareType() === \OCP\Share::SHARE_TYPE_USER) {
         $this->userCreateChecks($share);
     } else {
         if ($share->getShareType() === \OCP\Share::SHARE_TYPE_GROUP) {
             $this->groupCreateChecks($share);
         } else {
             if ($share->getShareType() === \OCP\Share::SHARE_TYPE_LINK) {
                 $this->linkCreateChecks($share);
                 /*
                  * For now ignore a set token.
                  */
                 $share->setToken($this->secureRandom->generate(\OC\Share\Constants::TOKEN_LENGTH, \OCP\Security\ISecureRandom::CHAR_LOWER . \OCP\Security\ISecureRandom::CHAR_UPPER . \OCP\Security\ISecureRandom::CHAR_DIGITS));
                 //Verify the expiration date
                 $share->setExpirationDate($this->validateExpiredate($share->getExpirationDate()));
                 //Verify the password
                 $this->verifyPassword($share->getPassword());
                 // If a password is set. Hash it!
                 if ($share->getPassword() !== null) {
                     $share->setPassword($this->hasher->hash($share->getPassword()));
                 }
             }
         }
     }
     // Verify if there are any issues with the path
     $this->pathCreateChecks($share->getPath());
     // On creation of a share the owner is always the owner of the path
     $share->setShareOwner($share->getPath()->getOwner());
     // Generate the target
     $target = $this->config->getSystemValue('share_folder', '/') . '/' . $share->getPath()->getName();
     $target = \OC\Files\Filesystem::normalizePath($target);
     $share->setTarget($target);
     // Pre share hook
     $run = true;
     $error = '';
     $preHookData = ['itemType' => $share->getPath() instanceof \OCP\Files\File ? 'file' : 'folder', 'itemSource' => $share->getPath()->getId(), 'shareType' => $share->getShareType(), 'uidOwner' => $share->getSharedBy()->getUID(), 'permissions' => $share->getPermissions(), 'fileSource' => $share->getPath()->getId(), 'expiration' => $share->getExpirationDate(), 'token' => $share->getToken(), 'run' => &$run, 'error' => &$error];
     \OC_Hook::emit('OCP\\Share', 'pre_shared', $preHookData);
     if ($run === false) {
         throw new \Exception($error);
     }
     $provider = $this->factory->getProviderForType($share->getShareType());
     $share = $provider->create($share);
     $share->setProviderId($provider->identifier());
     // Post share hook
     $postHookData = ['itemType' => $share->getPath() instanceof \OCP\Files\File ? 'file' : 'folder', 'itemSource' => $share->getPath()->getId(), 'shareType' => $share->getShareType(), 'uidOwner' => $share->getSharedBy()->getUID(), 'permissions' => $share->getPermissions(), 'fileSource' => $share->getPath()->getId(), 'expiration' => $share->getExpirationDate(), 'token' => $share->getToken(), 'id' => $share->getId()];
     \OC_Hook::emit('OCP\\Share', 'post_shared', $postHookData);
     return $share;
 }