/** * Generate a unique target for the item * @param string $itemType * @param string $itemSource * @param int $shareType SHARE_TYPE_USER, SHARE_TYPE_GROUP, or SHARE_TYPE_LINK * @param string $shareWith User or group the item is being shared with * @param string $uidOwner User that is the owner of shared item * @param string $suggestedTarget The suggested target originating from a reshare (optional) * @param int $groupParent The id of the parent group share (optional) * @throws \Exception * @return string Item target */ public static function generateTarget($itemType, $itemSource, $shareType, $shareWith, $uidOwner, $suggestedTarget = null, $groupParent = null) { // FIXME: $uidOwner and $groupParent seems to be unused $backend = \OC\Share\Share::getBackend($itemType); if ($shareType === self::SHARE_TYPE_LINK || $shareType === self::SHARE_TYPE_REMOTE) { if (isset($suggestedTarget)) { return $suggestedTarget; } return $backend->generateTarget($itemSource, false); } else { if ($shareType == self::SHARE_TYPE_USER) { // Share with is a user, so set share type to user and groups $shareType = self::$shareTypeUserAndGroups; } // Check if suggested target exists first if (!isset($suggestedTarget)) { $suggestedTarget = $itemSource; } if ($shareType == self::SHARE_TYPE_GROUP) { $target = $backend->generateTarget($suggestedTarget, false); } else { $target = $backend->generateTarget($suggestedTarget, $shareWith); } return $target; } }
/** * Generate a unique target for the item * @param string $itemType * @param string $itemSource * @param int $shareType SHARE_TYPE_USER, SHARE_TYPE_GROUP, or SHARE_TYPE_LINK * @param string $shareWith User or group the item is being shared with * @param string $uidOwner User that is the owner of shared item * @param string $suggestedTarget The suggested target originating from a reshare (optional) * @param int $groupParent The id of the parent group share (optional) * @throws \Exception * @return string Item target */ public static function generateTarget($itemType, $itemSource, $shareType, $shareWith, $uidOwner, $suggestedTarget = null, $groupParent = null) { // FIXME: $uidOwner and $groupParent seems to be unused $backend = \OC\Share\Share::getBackend($itemType); if ($shareType == self::SHARE_TYPE_LINK) { if (isset($suggestedTarget)) { return $suggestedTarget; } return $backend->generateTarget($itemSource, false); } else { if ($itemType == 'file' || $itemType == 'folder') { $column = 'file_target'; $columnSource = 'file_source'; } else { $column = 'item_target'; $columnSource = 'item_source'; } if ($shareType == self::SHARE_TYPE_USER) { // Share with is a user, so set share type to user and groups $shareType = self::$shareTypeUserAndGroups; } $exclude = array(); $result = \OCP\Share::getItemsSharedWithUser($itemType, $shareWith); foreach ($result as $row) { if ($row['permissions'] > 0) { $exclude[] = $row[$column]; } } // Check if suggested target exists first if (!isset($suggestedTarget)) { $suggestedTarget = $itemSource; } if ($shareType == self::SHARE_TYPE_GROUP) { $target = $backend->generateTarget($suggestedTarget, false, $exclude); } else { $target = $backend->generateTarget($suggestedTarget, $shareWith, $exclude); } return $target; } }
/** * Get the backend class for the specified item type * @param string $itemType * @return Share_Backend */ public static function getBackend($itemType) { return \OC\Share\Share::getBackend($itemType); }
/** * Constructor. * * @param TagMapper $mapper Instance of the TagMapper abstraction layer. * @param string $user The user whose data the object will operate on. * @param string $type The type of items for which tags will be loaded. * @param array $defaultTags Tags that should be created at construction. * @param boolean $includeShared Whether to include tags for items shared with this user by others. */ public function __construct(TagMapper $mapper, $user, $type, $defaultTags = array(), $includeShared = false) { $this->mapper = $mapper; $this->user = $user; $this->type = $type; $this->includeShared = $includeShared; $this->owners = array($this->user); if ($this->includeShared) { $this->owners = array_merge($this->owners, \OC\Share\Share::getSharedItemsOwners($this->user, $this->type, true)); $this->backend = \OC\Share\Share::getBackend($this->type); } $this->tags = $this->mapper->loadTags($this->owners, $this->type); if (count($defaultTags) > 0 && count($this->tags) === 0) { $this->addMultiple($defaultTags, true); } \OCP\Util::writeLog('core', __METHOD__ . ', tags: ' . print_r($this->tags, true), \OCP\Util::DEBUG); }
/** * Generate a unique target for the item * @param string $itemType * @param string $itemSource * @param int $shareType SHARE_TYPE_USER, SHARE_TYPE_GROUP, or SHARE_TYPE_LINK * @param string $shareWith User or group the item is being shared with * @param string $uidOwner User that is the owner of shared item * @param string $suggestedTarget The suggested target originating from a reshare (optional) * @param int $groupParent The id of the parent group share (optional) * @throws \Exception * @return string Item target */ public static function generateTarget($itemType, $itemSource, $shareType, $shareWith, $uidOwner, $suggestedTarget = null, $groupParent = null) { $backend = \OC\Share\Share::getBackend($itemType); if ($shareType == self::SHARE_TYPE_LINK) { if (isset($suggestedTarget)) { return $suggestedTarget; } return $backend->generateTarget($itemSource, false); } else { if ($itemType == 'file' || $itemType == 'folder') { $column = 'file_target'; $columnSource = 'file_source'; } else { $column = 'item_target'; $columnSource = 'item_source'; } if ($shareType == self::SHARE_TYPE_USER) { // Share with is a user, so set share type to user and groups $shareType = self::$shareTypeUserAndGroups; $userAndGroups = array_merge(array($shareWith), \OC_Group::getUserGroups($shareWith)); } else { $userAndGroups = false; } $exclude = null; // Backend has 3 opportunities to generate a unique target for ($i = 0; $i < 2; $i++) { // Check if suggested target exists first if ($i == 0 && isset($suggestedTarget)) { $target = $suggestedTarget; } else { if ($shareType == self::SHARE_TYPE_GROUP) { $target = $backend->generateTarget($itemSource, false, $exclude); } else { $target = $backend->generateTarget($itemSource, $shareWith, $exclude); } if (is_array($exclude) && in_array($target, $exclude)) { break; } } // Check if target already exists $checkTarget = \OC\Share\Share::getItems($itemType, $target, $shareType, $shareWith); if (!empty($checkTarget)) { foreach ($checkTarget as $item) { // Skip item if it is the group parent row if (isset($groupParent) && $item['id'] == $groupParent) { if (count($checkTarget) == 1) { return $target; } else { continue; } } if ($item['uid_owner'] == $uidOwner) { if ($itemType == 'file' || $itemType == 'folder') { $meta = \OC\Files\Filesystem::getFileInfo($itemSource); if ($item['file_source'] == $meta['fileid']) { return $target; } } else { if ($item['item_source'] == $itemSource) { return $target; } } } } if (!isset($exclude)) { $exclude = array(); } // Find similar targets to improve backend's chances to generate a unqiue target if ($userAndGroups) { if ($column == 'file_target') { $checkTargets = \OC_DB::prepare('SELECT `' . $column . '` FROM `*PREFIX*share`' . ' WHERE `item_type` IN (\'file\', \'folder\')' . ' AND `share_type` IN (?,?,?)' . ' AND `share_with` IN (\'' . implode('\',\'', $userAndGroups) . '\')'); $result = $checkTargets->execute(array(self::SHARE_TYPE_USER, self::SHARE_TYPE_GROUP, self::$shareTypeGroupUserUnique)); } else { $checkTargets = \OC_DB::prepare('SELECT `' . $column . '` FROM `*PREFIX*share`' . ' WHERE `item_type` = ? AND `share_type` IN (?,?,?)' . ' AND `share_with` IN (\'' . implode('\',\'', $userAndGroups) . '\')'); $result = $checkTargets->execute(array($itemType, self::SHARE_TYPE_USER, self::SHARE_TYPE_GROUP, self::$shareTypeGroupUserUnique)); } } else { if ($column == 'file_target') { $checkTargets = \OC_DB::prepare('SELECT `' . $column . '` FROM `*PREFIX*share`' . ' WHERE `item_type` IN (\'file\', \'folder\')' . ' AND `share_type` = ? AND `share_with` = ?'); $result = $checkTargets->execute(array(self::SHARE_TYPE_GROUP, $shareWith)); } else { $checkTargets = \OC_DB::prepare('SELECT `' . $column . '` FROM `*PREFIX*share`' . ' WHERE `item_type` = ? AND `share_type` = ? AND `share_with` = ?'); $result = $checkTargets->execute(array($itemType, self::SHARE_TYPE_GROUP, $shareWith)); } } while ($row = $result->fetchRow()) { $exclude[] = $row[$column]; } } else { return $target; } } } $message = 'Sharing backend registered for ' . $itemType . ' did not generate a unique target for ' . $itemSource; \OC_Log::write('OCP\\Share', $message, \OC_Log::ERROR); throw new \Exception($message); }
/** * Constructor. * * @param TagMapper $mapper Instance of the TagMapper abstraction layer. * @param string $user The user whose data the object will operate on. * @param string $type The type of items for which tags will be loaded. * @param array $defaultTags Tags that should be created at construction. * @param boolean $includeShared Whether to include tags for items shared with this user by others. */ public function __construct(TagMapper $mapper, $user, $type, $defaultTags = array(), $includeShared = false) { $this->mapper = $mapper; $this->user = $user; $this->type = $type; $this->includeShared = $includeShared; $this->owners = array($this->user); if ($this->includeShared) { $this->owners = array_merge($this->owners, \OC\Share\Share::getSharedItemsOwners($this->user, $this->type, true)); $this->backend = \OC\Share\Share::getBackend($this->type); } $this->tags = $this->mapper->loadTags($this->owners, $this->type); if (count($defaultTags) > 0 && count($this->tags) === 0) { $this->addMultiple($defaultTags, true); } }