Merge pull request #14572 from nextcloud/techdebt/noid/cleanup-legacy-share.php-from-unused-code
Cleanup legacy Share.php from unused code
This commit is contained in:
commit
9f9b89fcc7
|
@ -105,11 +105,13 @@ class Share extends Constants {
|
||||||
* @param int $limit Number of items to return (optional) Returns all by default
|
* @param int $limit Number of items to return (optional) Returns all by default
|
||||||
* @param boolean $includeCollections (optional)
|
* @param boolean $includeCollections (optional)
|
||||||
* @return mixed Return depends on format
|
* @return mixed Return depends on format
|
||||||
|
* @deprecated TESTS ONLY - this methods is only used by tests
|
||||||
|
* called like this:
|
||||||
|
* \OC\Share\Share::getItemsSharedWith('folder'); (apps/files_sharing/tests/UpdaterTest.php)
|
||||||
*/
|
*/
|
||||||
public static function getItemsSharedWith($itemType, $format = self::FORMAT_NONE,
|
public static function getItemsSharedWith() {
|
||||||
$parameters = null, $limit = -1, $includeCollections = false) {
|
return self::getItems('folder', null, self::$shareTypeUserAndGroups, \OC_User::getUser(), null, self::FORMAT_NONE,
|
||||||
return self::getItems($itemType, null, self::$shareTypeUserAndGroups, \OC_User::getUser(), null, $format,
|
null, -1, false);
|
||||||
$parameters, $limit, $includeCollections);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -321,124 +323,33 @@ class Share extends Constants {
|
||||||
* @param int $permissions CRUDS
|
* @param int $permissions CRUDS
|
||||||
* @param string $itemSourceName
|
* @param string $itemSourceName
|
||||||
* @param \DateTime|null $expirationDate
|
* @param \DateTime|null $expirationDate
|
||||||
* @param bool|null $passwordChanged
|
|
||||||
* @return boolean|string Returns true on success or false on failure, Returns token on success for links
|
* @return boolean|string Returns true on success or false on failure, Returns token on success for links
|
||||||
* @throws \OC\HintException when the share type is remote and the shareWith is invalid
|
* @throws \OC\HintException when the share type is remote and the shareWith is invalid
|
||||||
* @throws \Exception
|
* @throws \Exception
|
||||||
* @since 5.0.0 - parameter $itemSourceName was added in 6.0.0, parameter $expirationDate was added in 7.0.0, parameter $passwordChanged added in 9.0.0
|
* @since 5.0.0 - parameter $itemSourceName was added in 6.0.0, parameter $expirationDate was added in 7.0.0, parameter $passwordChanged added in 9.0.0
|
||||||
* @deprecated 14.0.0 TESTS ONLY - this methods is as of 2018-06 only used by tests
|
* @deprecated 14.0.0 TESTS ONLY - this methods is as of 2018-06 only used by tests
|
||||||
|
* called like this:
|
||||||
|
* \OC\Share\Share::shareItem('test', 1, \OCP\Share::SHARE_TYPE_USER, $otherUserId, \OCP\Constants::PERMISSION_READ);
|
||||||
*/
|
*/
|
||||||
public static function shareItem($itemType, $itemSource, $shareType, $shareWith, $permissions, $itemSourceName = null, \DateTime $expirationDate = null, $passwordChanged = null) {
|
public static function shareItem($itemType, $itemSource, $shareType, $shareWith, $permissions) {
|
||||||
|
|
||||||
$backend = self::getBackend($itemType);
|
$backend = self::getBackend($itemType);
|
||||||
$l = \OC::$server->getL10N('lib');
|
|
||||||
|
|
||||||
if ($backend->isShareTypeAllowed($shareType) === false) {
|
if ($backend->isShareTypeAllowed($shareType) === false) {
|
||||||
$message = 'Sharing %s failed, because the backend does not allow shares from type %i';
|
$message = 'Sharing failed, because the backend does not allow shares from type %i';
|
||||||
$message_t = $l->t('Sharing %s failed, because the backend does not allow shares from type %i', array($itemSourceName, $shareType));
|
throw new \Exception(sprintf($message, $shareType));
|
||||||
\OCP\Util::writeLog('OCP\Share', sprintf($message, $itemSourceName, $shareType), ILogger::DEBUG);
|
|
||||||
throw new \Exception($message_t);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$uidOwner = \OC_User::getUser();
|
$uidOwner = \OC_User::getUser();
|
||||||
$shareWithinGroupOnly = \OC::$server->getConfig()->getAppValue('core', 'shareapi_only_share_with_group_members', 'no') === 'yes';
|
|
||||||
|
|
||||||
if (is_null($itemSourceName)) {
|
|
||||||
$itemSourceName = $itemSource;
|
|
||||||
}
|
|
||||||
$itemName = $itemSourceName;
|
|
||||||
|
|
||||||
// check if file can be shared
|
|
||||||
if ($itemType === 'file' or $itemType === 'folder') {
|
|
||||||
$path = \OC\Files\Filesystem::getPath($itemSource);
|
|
||||||
$itemName = $path;
|
|
||||||
|
|
||||||
// verify that the file exists before we try to share it
|
|
||||||
if (!$path) {
|
|
||||||
$message = 'Sharing %s failed, because the file does not exist';
|
|
||||||
$message_t = $l->t('Sharing %s failed, because the file does not exist', array($itemSourceName));
|
|
||||||
\OCP\Util::writeLog('OCP\Share', sprintf($message, $itemSourceName), ILogger::DEBUG);
|
|
||||||
throw new \Exception($message_t);
|
|
||||||
}
|
|
||||||
// verify that the user has share permission
|
|
||||||
if (!\OC\Files\Filesystem::isSharable($path) || \OCP\Util::isSharingDisabledForUser()) {
|
|
||||||
$message = 'You are not allowed to share %s';
|
|
||||||
$message_t = $l->t('You are not allowed to share %s', [$path]);
|
|
||||||
\OCP\Util::writeLog('OCP\Share', sprintf($message, $path), ILogger::DEBUG);
|
|
||||||
throw new \Exception($message_t);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//verify that we don't share a folder which already contains a share mount point
|
|
||||||
if ($itemType === 'folder') {
|
|
||||||
$path = '/' . $uidOwner . '/files' . \OC\Files\Filesystem::getPath($itemSource) . '/';
|
|
||||||
$mountManager = \OC\Files\Filesystem::getMountManager();
|
|
||||||
$mounts = $mountManager->findIn($path);
|
|
||||||
foreach ($mounts as $mount) {
|
|
||||||
if ($mount->getStorage()->instanceOfStorage('\OCA\Files_Sharing\ISharedStorage')) {
|
|
||||||
$message = 'Sharing "' . $itemSourceName . '" failed, because it contains files shared with you!';
|
|
||||||
\OCP\Util::writeLog('OCP\Share', $message, ILogger::DEBUG);
|
|
||||||
throw new \Exception($message);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// single file shares should never have delete permissions
|
|
||||||
if ($itemType === 'file') {
|
|
||||||
$permissions = (int)$permissions & ~\OCP\Constants::PERMISSION_DELETE;
|
|
||||||
}
|
|
||||||
|
|
||||||
//Validate expirationDate
|
|
||||||
if ($expirationDate !== null) {
|
|
||||||
try {
|
|
||||||
/*
|
|
||||||
* Reuse the validateExpireDate.
|
|
||||||
* We have to pass time() since the second arg is the time
|
|
||||||
* the file was shared, since it is not shared yet we just use
|
|
||||||
* the current time.
|
|
||||||
*/
|
|
||||||
$expirationDate = self::validateExpireDate($expirationDate->format('Y-m-d'), time(), $itemType, $itemSource);
|
|
||||||
} catch (\Exception $e) {
|
|
||||||
throw new \OC\HintException($e->getMessage(), $e->getMessage(), 404);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Verify share type and sharing conditions are met
|
// Verify share type and sharing conditions are met
|
||||||
if ($shareType === self::SHARE_TYPE_USER) {
|
if ($shareType === self::SHARE_TYPE_USER) {
|
||||||
if ($shareWith == $uidOwner) {
|
if ($shareWith == $uidOwner) {
|
||||||
$message = 'Sharing %s failed, because you can not share with yourself';
|
$message = 'Sharing failed, because you can not share with yourself';
|
||||||
$message_t = $l->t('Sharing %s failed, because you can not share with yourself', [$itemName]);
|
throw new \Exception($message);
|
||||||
\OCP\Util::writeLog('OCP\Share', sprintf($message, $itemSourceName), ILogger::DEBUG);
|
|
||||||
throw new \Exception($message_t);
|
|
||||||
}
|
}
|
||||||
if (!\OC::$server->getUserManager()->userExists($shareWith)) {
|
if (!\OC::$server->getUserManager()->userExists($shareWith)) {
|
||||||
$message = 'Sharing %1$s failed, because the user %2$s does not exist';
|
$message = 'Sharing failed, because the user %s does not exist';
|
||||||
$message_t = $l->t('Sharing %1$s failed, because the user %2$s does not exist', array($itemSourceName, $shareWith));
|
throw new \Exception(sprintf($message, $shareWith));
|
||||||
\OCP\Util::writeLog('OCP\Share', sprintf($message, $itemSourceName, $shareWith), ILogger::DEBUG);
|
|
||||||
throw new \Exception($message_t);
|
|
||||||
}
|
|
||||||
if ($shareWithinGroupOnly) {
|
|
||||||
$userManager = \OC::$server->getUserManager();
|
|
||||||
$groupManager = \OC::$server->getGroupManager();
|
|
||||||
$userOwner = $userManager->get($uidOwner);
|
|
||||||
$userShareWith = $userManager->get($shareWith);
|
|
||||||
$groupsOwner = [];
|
|
||||||
$groupsShareWith = [];
|
|
||||||
if ($userOwner) {
|
|
||||||
$groupsOwner = $groupManager->getUserGroupIds($userOwner);
|
|
||||||
}
|
|
||||||
if ($userShareWith) {
|
|
||||||
$groupsShareWith = $groupManager->getUserGroupIds($userShareWith);
|
|
||||||
}
|
|
||||||
$inGroup = array_intersect($groupsOwner, $groupsShareWith);
|
|
||||||
if (empty($inGroup)) {
|
|
||||||
$message = 'Sharing %1$s failed, because the user '
|
|
||||||
.'%2$s is not a member of any groups that %3$s is a member of';
|
|
||||||
$message_t = $l->t('Sharing %1$s failed, because the user %2$s is not a member of any groups that %3$s is a member of', array($itemName, $shareWith, $uidOwner));
|
|
||||||
\OCP\Util::writeLog('OCP\Share', sprintf($message, $itemName, $shareWith, $uidOwner), ILogger::DEBUG);
|
|
||||||
throw new \Exception($message_t);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
// Check if the item source is already shared with the user, either from the same owner or a different user
|
// Check if the item source is already shared with the user, either from the same owner or a different user
|
||||||
if ($checkExists = self::getItems($itemType, $itemSource, self::$shareTypeUserAndGroups,
|
if ($checkExists = self::getItems($itemType, $itemSource, self::$shareTypeUserAndGroups,
|
||||||
|
@ -447,10 +358,8 @@ class Share extends Constants {
|
||||||
// owner and is not a user share, this use case is for increasing
|
// owner and is not a user share, this use case is for increasing
|
||||||
// permissions for a specific user
|
// permissions for a specific user
|
||||||
if ($checkExists['uid_owner'] != $uidOwner || $checkExists['share_type'] == $shareType) {
|
if ($checkExists['uid_owner'] != $uidOwner || $checkExists['share_type'] == $shareType) {
|
||||||
$message = 'Sharing %1$s failed, because this item is already shared with %2$s';
|
$message = 'Sharing failed, because this item is already shared with %s';
|
||||||
$message_t = $l->t('Sharing %1$s failed, because this item is already shared with %2$s', array($itemSourceName, $shareWith));
|
throw new \Exception(sprintf($message, $shareWith));
|
||||||
\OCP\Util::writeLog('OCP\Share', sprintf($message, $itemSourceName, $shareWith), ILogger::DEBUG);
|
|
||||||
throw new \Exception($message_t);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ($checkExists = self::getItems($itemType, $itemSource, self::SHARE_TYPE_USER,
|
if ($checkExists = self::getItems($itemType, $itemSource, self::SHARE_TYPE_USER,
|
||||||
|
@ -459,188 +368,14 @@ class Share extends Constants {
|
||||||
// owner and is not a user share, this use case is for increasing
|
// owner and is not a user share, this use case is for increasing
|
||||||
// permissions for a specific user
|
// permissions for a specific user
|
||||||
if ($checkExists['uid_owner'] != $uidOwner || $checkExists['share_type'] == $shareType) {
|
if ($checkExists['uid_owner'] != $uidOwner || $checkExists['share_type'] == $shareType) {
|
||||||
$message = 'Sharing %1$s failed, because this item is already shared with user %2$s';
|
$message = 'Sharing failed, because this item is already shared with user %s';
|
||||||
$message_t = $l->t('Sharing %1$s failed, because this item is already shared with user %2$s', array($itemSourceName, $shareWith));
|
throw new \Exception(sprintf($message, $shareWith));
|
||||||
\OCP\Util::writeLog('OCP\Share', sprintf($message, $itemSourceName, $shareWith), ILogger::ERROR);
|
|
||||||
throw new \Exception($message_t);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if ($shareType === self::SHARE_TYPE_GROUP) {
|
|
||||||
if (!\OC::$server->getGroupManager()->groupExists($shareWith)) {
|
|
||||||
$message = 'Sharing %1$s failed, because the group %2$s does not exist';
|
|
||||||
$message_t = $l->t('Sharing %1$s failed, because the group %2$s does not exist', array($itemSourceName, $shareWith));
|
|
||||||
\OCP\Util::writeLog('OCP\Share', sprintf($message, $itemSourceName, $shareWith), ILogger::DEBUG);
|
|
||||||
throw new \Exception($message_t);
|
|
||||||
}
|
|
||||||
if ($shareWithinGroupOnly) {
|
|
||||||
$group = \OC::$server->getGroupManager()->get($shareWith);
|
|
||||||
$user = \OC::$server->getUserManager()->get($uidOwner);
|
|
||||||
if (!$group || !$user || !$group->inGroup($user)) {
|
|
||||||
$message = 'Sharing %1$s failed, because '
|
|
||||||
. '%2$s is not a member of the group %3$s';
|
|
||||||
$message_t = $l->t('Sharing %1$s failed, because %2$s is not a member of the group %3$s', array($itemSourceName, $uidOwner, $shareWith));
|
|
||||||
\OCP\Util::writeLog('OCP\Share', sprintf($message, $itemSourceName, $uidOwner, $shareWith), ILogger::DEBUG);
|
|
||||||
throw new \Exception($message_t);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Check if the item source is already shared with the group, either from the same owner or a different user
|
|
||||||
// The check for each user in the group is done inside the put() function
|
|
||||||
if ($checkExists = self::getItems($itemType, $itemSource, self::SHARE_TYPE_GROUP, $shareWith,
|
|
||||||
null, self::FORMAT_NONE, null, 1, true, true)) {
|
|
||||||
|
|
||||||
if ($checkExists['share_with'] === $shareWith && $checkExists['share_type'] === \OCP\Share::SHARE_TYPE_GROUP) {
|
|
||||||
$message = 'Sharing %1$s failed, because this item is already shared with %2$s';
|
|
||||||
$message_t = $l->t('Sharing %1$s failed, because this item is already shared with %2$s', array($itemSourceName, $shareWith));
|
|
||||||
\OCP\Util::writeLog('OCP\Share', sprintf($message, $itemSourceName, $shareWith), ILogger::DEBUG);
|
|
||||||
throw new \Exception($message_t);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Convert share with into an array with the keys group and users
|
|
||||||
$group = $shareWith;
|
|
||||||
$shareWith = array();
|
|
||||||
$shareWith['group'] = $group;
|
|
||||||
|
|
||||||
|
|
||||||
$groupObject = \OC::$server->getGroupManager()->get($group);
|
|
||||||
$userIds = [];
|
|
||||||
if ($groupObject) {
|
|
||||||
$users = $groupObject->searchUsers('', -1, 0);
|
|
||||||
foreach ($users as $user) {
|
|
||||||
$userIds[] = $user->getUID();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$shareWith['users'] = array_diff($userIds, array($uidOwner));
|
|
||||||
} else if ($shareType === self::SHARE_TYPE_LINK) {
|
|
||||||
$updateExistingShare = false;
|
|
||||||
if (\OC::$server->getConfig()->getAppValue('core', 'shareapi_allow_links', 'yes') == 'yes') {
|
|
||||||
|
|
||||||
// IF the password is changed via the old ajax endpoint verify it before deleting the old share
|
|
||||||
if ($passwordChanged === true) {
|
|
||||||
self::verifyPassword($shareWith);
|
|
||||||
}
|
|
||||||
|
|
||||||
// when updating a link share
|
|
||||||
// FIXME Don't delete link if we update it
|
|
||||||
if ($checkExists = self::getItems($itemType, $itemSource, self::SHARE_TYPE_LINK, null,
|
|
||||||
$uidOwner, self::FORMAT_NONE, null, 1)) {
|
|
||||||
// remember old token
|
|
||||||
$oldToken = $checkExists['token'];
|
|
||||||
$oldPermissions = $checkExists['permissions'];
|
|
||||||
//delete the old share
|
|
||||||
Helper::delete($checkExists['id']);
|
|
||||||
$updateExistingShare = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($passwordChanged === null) {
|
|
||||||
// Generate hash of password - same method as user passwords
|
|
||||||
if (is_string($shareWith) && $shareWith !== '') {
|
|
||||||
self::verifyPassword($shareWith);
|
|
||||||
$shareWith = \OC::$server->getHasher()->hash($shareWith);
|
|
||||||
} else {
|
|
||||||
// reuse the already set password, but only if we change permissions
|
|
||||||
// otherwise the user disabled the password protection
|
|
||||||
if ($checkExists && (int)$permissions !== (int)$oldPermissions) {
|
|
||||||
$shareWith = $checkExists['share_with'];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if ($passwordChanged === true) {
|
|
||||||
if (is_string($shareWith) && $shareWith !== '') {
|
|
||||||
self::verifyPassword($shareWith);
|
|
||||||
$shareWith = \OC::$server->getHasher()->hash($shareWith);
|
|
||||||
}
|
|
||||||
} else if ($updateExistingShare) {
|
|
||||||
$shareWith = $checkExists['share_with'];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (\OCP\Util::isPublicLinkPasswordRequired() && empty($shareWith)) {
|
|
||||||
$message = 'You need to provide a password to create a public link, only protected links are allowed';
|
|
||||||
$message_t = $l->t('You need to provide a password to create a public link, only protected links are allowed');
|
|
||||||
\OCP\Util::writeLog('OCP\Share', $message, ILogger::DEBUG);
|
|
||||||
throw new \Exception($message_t);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($updateExistingShare === false &&
|
|
||||||
self::isDefaultExpireDateEnabled() &&
|
|
||||||
empty($expirationDate)) {
|
|
||||||
$expirationDate = Helper::calcExpireDate();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Generate token
|
|
||||||
if (isset($oldToken)) {
|
|
||||||
$token = $oldToken;
|
|
||||||
} else {
|
|
||||||
$token = \OC::$server->getSecureRandom()->generate(self::TOKEN_LENGTH,
|
|
||||||
\OCP\Security\ISecureRandom::CHAR_HUMAN_READABLE
|
|
||||||
);
|
|
||||||
}
|
|
||||||
$result = self::put($itemType, $itemSource, $shareType, $shareWith, $uidOwner, $permissions,
|
|
||||||
null, $token, $itemSourceName, $expirationDate);
|
|
||||||
if ($result) {
|
|
||||||
return $token;
|
|
||||||
} else {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
$message = 'Sharing %s failed, because sharing with links is not allowed';
|
|
||||||
$message_t = $l->t('Sharing %s failed, because sharing with links is not allowed', array($itemSourceName));
|
|
||||||
\OCP\Util::writeLog('OCP\Share', sprintf($message, $itemSourceName), ILogger::DEBUG);
|
|
||||||
throw new \Exception($message_t);
|
|
||||||
} else if ($shareType === self::SHARE_TYPE_REMOTE) {
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Check if file is not already shared with the remote user
|
|
||||||
*/
|
|
||||||
if ($checkExists = self::getItems($itemType, $itemSource, self::SHARE_TYPE_REMOTE,
|
|
||||||
$shareWith, $uidOwner, self::FORMAT_NONE, null, 1, true, true)) {
|
|
||||||
$message = 'Sharing %1$s failed, because this item is already shared with %2$s';
|
|
||||||
$message_t = $l->t('Sharing %1$s failed, because this item is already shared with %2$s', array($itemSourceName, $shareWith));
|
|
||||||
\OCP\Util::writeLog('OCP\Share', sprintf($message, $itemSourceName, $shareWith), ILogger::DEBUG);
|
|
||||||
throw new \Exception($message_t);
|
|
||||||
}
|
|
||||||
|
|
||||||
// don't allow federated shares if source and target server are the same
|
|
||||||
list($user, $remote) = Helper::splitUserRemote($shareWith);
|
|
||||||
$currentServer = self::removeProtocolFromUrl(\OC::$server->getURLGenerator()->getAbsoluteURL('/'));
|
|
||||||
$currentUser = \OC::$server->getUserSession()->getUser()->getUID();
|
|
||||||
if (Helper::isSameUserOnSameServer($user, $remote, $currentUser, $currentServer)) {
|
|
||||||
$message = 'Not allowed to create a federated share with the same user.';
|
|
||||||
$message_t = $l->t('Not allowed to create a federated share with the same user');
|
|
||||||
\OCP\Util::writeLog('OCP\Share', $message, ILogger::DEBUG);
|
|
||||||
throw new \Exception($message_t);
|
|
||||||
}
|
|
||||||
|
|
||||||
$token = \OC::$server->getSecureRandom()->generate(self::TOKEN_LENGTH, \OCP\Security\ISecureRandom::CHAR_LOWER . \OCP\Security\ISecureRandom::CHAR_UPPER .
|
|
||||||
\OCP\Security\ISecureRandom::CHAR_DIGITS);
|
|
||||||
|
|
||||||
$shareWith = $user . '@' . $remote;
|
|
||||||
$shareId = self::put($itemType, $itemSource, $shareType, $shareWith, $uidOwner, $permissions, null, $token, $itemSourceName);
|
|
||||||
|
|
||||||
$send = false;
|
|
||||||
if ($shareId) {
|
|
||||||
$send = self::sendRemoteShare($token, $shareWith, $itemSourceName, $shareId, $uidOwner);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($send === false) {
|
|
||||||
$currentUser = \OC::$server->getUserSession()->getUser()->getUID();
|
|
||||||
self::unshare($itemType, $itemSource, $shareType, $shareWith, $currentUser);
|
|
||||||
$message_t = $l->t('Sharing %1$s failed, could not find %2$s, maybe the server is currently unreachable.', array($itemSourceName, $shareWith));
|
|
||||||
throw new \Exception($message_t);
|
|
||||||
}
|
|
||||||
|
|
||||||
return $send;
|
|
||||||
} else {
|
|
||||||
// Future share types need to include their own conditions
|
|
||||||
$message = 'Share type %1$s is not valid for %2$s';
|
|
||||||
$message_t = $l->t('Share type %1$s is not valid for %2$s', array($shareType, $itemSource));
|
|
||||||
\OCP\Util::writeLog('OCP\Share', sprintf($message, $shareType, $itemSource), ILogger::DEBUG);
|
|
||||||
throw new \Exception($message_t);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Put the item into the database
|
// Put the item into the database
|
||||||
$result = self::put($itemType, $itemSource, $shareType, $shareWith, $uidOwner, $permissions, null, null, $itemSourceName, $expirationDate);
|
$result = self::put('test', $itemSource, self::SHARE_TYPE_USER, $shareWith, $uidOwner, $permissions);
|
||||||
|
|
||||||
return $result ? true : false;
|
return $result ? true : false;
|
||||||
}
|
}
|
||||||
|
@ -708,54 +443,6 @@ class Share extends Constants {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* validate expiration date if it meets all constraints
|
|
||||||
*
|
|
||||||
* @param string $expireDate well formatted date string, e.g. "DD-MM-YYYY"
|
|
||||||
* @param string $shareTime timestamp when the file was shared
|
|
||||||
* @param string $itemType
|
|
||||||
* @param string $itemSource
|
|
||||||
* @return \DateTime validated date
|
|
||||||
* @throws \Exception when the expire date is in the past or further in the future then the enforced date
|
|
||||||
*/
|
|
||||||
private static function validateExpireDate($expireDate, $shareTime, $itemType, $itemSource) {
|
|
||||||
$l = \OC::$server->getL10N('lib');
|
|
||||||
$date = new \DateTime($expireDate);
|
|
||||||
$today = new \DateTime('now');
|
|
||||||
|
|
||||||
// if the user doesn't provide a share time we need to get it from the database
|
|
||||||
// fall-back mode to keep API stable, because the $shareTime parameter was added later
|
|
||||||
$defaultExpireDateEnforced = \OCP\Util::isDefaultExpireDateEnforced();
|
|
||||||
if ($defaultExpireDateEnforced && $shareTime === null) {
|
|
||||||
$items = self::getItemShared($itemType, $itemSource);
|
|
||||||
$firstItem = reset($items);
|
|
||||||
$shareTime = (int)$firstItem['stime'];
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($defaultExpireDateEnforced) {
|
|
||||||
// initialize max date with share time
|
|
||||||
$maxDate = new \DateTime();
|
|
||||||
$maxDate->setTimestamp($shareTime);
|
|
||||||
$maxDays = \OC::$server->getConfig()->getAppValue('core', 'shareapi_expire_after_n_days', '7');
|
|
||||||
$maxDate->add(new \DateInterval('P' . $maxDays . 'D'));
|
|
||||||
if ($date > $maxDate) {
|
|
||||||
$warning = 'Cannot set expiration date. Shares cannot expire later than ' . $maxDays . ' after they have been shared';
|
|
||||||
$warning_t = $l->t('Cannot set expiration date. Shares cannot expire later than %s after they have been shared', array($maxDays));
|
|
||||||
\OCP\Util::writeLog('OCP\Share', $warning, ILogger::WARN);
|
|
||||||
throw new \Exception($warning_t);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($date < $today) {
|
|
||||||
$message = 'Cannot set expiration date. Expiration date is in the past';
|
|
||||||
$message_t = $l->t('Cannot set expiration date. Expiration date is in the past');
|
|
||||||
\OCP\Util::writeLog('OCP\Share', $message, ILogger::WARN);
|
|
||||||
throw new \Exception($message_t);
|
|
||||||
}
|
|
||||||
|
|
||||||
return $date;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Checks whether a share has expired, calls unshareItem() if yes.
|
* Checks whether a share has expired, calls unshareItem() if yes.
|
||||||
* @param array $item Share data (usually database row)
|
* @param array $item Share data (usually database row)
|
||||||
|
@ -916,6 +603,9 @@ class Share extends Constants {
|
||||||
* @param boolean $includeCollections Include collection item types (optional)
|
* @param boolean $includeCollections Include collection item types (optional)
|
||||||
* @param boolean $includeOwner include owner in the list of users the item is shared with (optional)
|
* @param boolean $includeOwner include owner in the list of users the item is shared with (optional)
|
||||||
* @return array
|
* @return array
|
||||||
|
* @deprecated TESTS ONLY - this methods is only used by tests
|
||||||
|
* called like this:
|
||||||
|
* \OC\Share\Share::getSharedItemsOwners($this->user, $this->type, true)
|
||||||
*/
|
*/
|
||||||
public static function getSharedItemsOwners($user, $type, $includeCollections = false, $includeOwner = false) {
|
public static function getSharedItemsOwners($user, $type, $includeCollections = false, $includeOwner = false) {
|
||||||
// First, we find out if $type is part of a collection (and if that collection is part of
|
// First, we find out if $type is part of a collection (and if that collection is part of
|
||||||
|
@ -1431,22 +1121,21 @@ class Share extends Constants {
|
||||||
* @param string $shareWith User or group the item is being shared with
|
* @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 $uidOwner User that is the owner of shared item
|
||||||
* @param int $permissions CRUDS permissions
|
* @param int $permissions CRUDS permissions
|
||||||
* @param boolean|array $parentFolder Parent folder target (optional)
|
|
||||||
* @param string $token (optional)
|
|
||||||
* @param string $itemSourceName name of the source item (optional)
|
|
||||||
* @param \DateTime $expirationDate (optional)
|
|
||||||
* @throws \Exception
|
* @throws \Exception
|
||||||
* @return mixed id of the new share or false
|
* @return mixed id of the new share or false
|
||||||
|
* @deprecated TESTS ONLY - this methods is only used by tests
|
||||||
|
* called like this:
|
||||||
|
* self::put('test', $itemSource, self::SHARE_TYPE_USER, $shareWith, $uidOwner, $permissions);
|
||||||
*/
|
*/
|
||||||
private static function put($itemType, $itemSource, $shareType, $shareWith, $uidOwner,
|
private static function put($itemType, $itemSource, $shareType, $shareWith, $uidOwner,
|
||||||
$permissions, $parentFolder = null, $token = null, $itemSourceName = null, \DateTime $expirationDate = null) {
|
$permissions) {
|
||||||
|
|
||||||
$queriesToExecute = array();
|
$queriesToExecute = array();
|
||||||
$suggestedItemTarget = null;
|
$suggestedItemTarget = null;
|
||||||
$groupFileTarget = $fileTarget = $suggestedFileTarget = $filePath = '';
|
$groupFileTarget = $fileTarget = $suggestedFileTarget = $filePath = '';
|
||||||
$groupItemTarget = $itemTarget = $fileSource = $parent = 0;
|
$groupItemTarget = $itemTarget = $fileSource = $parent = 0;
|
||||||
|
|
||||||
$result = self::checkReshare($itemType, $itemSource, $shareType, $shareWith, $uidOwner, $permissions, $itemSourceName, $expirationDate);
|
$result = self::checkReshare('test', $itemSource, self::SHARE_TYPE_USER, $shareWith, $uidOwner, $permissions, null, null);
|
||||||
if(!empty($result)) {
|
if(!empty($result)) {
|
||||||
$parent = $result['parent'];
|
$parent = $result['parent'];
|
||||||
$itemSource = $result['itemSource'];
|
$itemSource = $result['itemSource'];
|
||||||
|
@ -1457,54 +1146,9 @@ class Share extends Constants {
|
||||||
}
|
}
|
||||||
|
|
||||||
$isGroupShare = false;
|
$isGroupShare = false;
|
||||||
if ($shareType == self::SHARE_TYPE_GROUP) {
|
|
||||||
$isGroupShare = true;
|
|
||||||
if (isset($shareWith['users'])) {
|
|
||||||
$users = $shareWith['users'];
|
|
||||||
} else {
|
|
||||||
$group = \OC::$server->getGroupManager()->get($shareWith['group']);
|
|
||||||
if ($group) {
|
|
||||||
$users = $group->searchUsers('', -1, 0);
|
|
||||||
$userIds = [];
|
|
||||||
foreach ($users as $user) {
|
|
||||||
$userIds[] = $user->getUID();
|
|
||||||
}
|
|
||||||
$users = $userIds;
|
|
||||||
} else {
|
|
||||||
$users = [];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// remove current user from list
|
|
||||||
if (in_array(\OCP\User::getUser(), $users)) {
|
|
||||||
unset($users[array_search(\OCP\User::getUser(), $users)]);
|
|
||||||
}
|
|
||||||
$groupItemTarget = Helper::generateTarget($itemType, $itemSource,
|
|
||||||
$shareType, $shareWith['group'], $uidOwner, $suggestedItemTarget);
|
|
||||||
$groupFileTarget = Helper::generateTarget($itemType, $itemSource,
|
|
||||||
$shareType, $shareWith['group'], $uidOwner, $filePath);
|
|
||||||
|
|
||||||
// add group share to table and remember the id as parent
|
|
||||||
$queriesToExecute['groupShare'] = array(
|
|
||||||
'itemType' => $itemType,
|
|
||||||
'itemSource' => $itemSource,
|
|
||||||
'itemTarget' => $groupItemTarget,
|
|
||||||
'shareType' => $shareType,
|
|
||||||
'shareWith' => $shareWith['group'],
|
|
||||||
'uidOwner' => $uidOwner,
|
|
||||||
'permissions' => $permissions,
|
|
||||||
'shareTime' => time(),
|
|
||||||
'fileSource' => $fileSource,
|
|
||||||
'fileTarget' => $groupFileTarget,
|
|
||||||
'token' => $token,
|
|
||||||
'parent' => $parent,
|
|
||||||
'expiration' => $expirationDate,
|
|
||||||
);
|
|
||||||
|
|
||||||
} else {
|
|
||||||
$users = array($shareWith);
|
$users = array($shareWith);
|
||||||
$itemTarget = Helper::generateTarget($itemType, $itemSource, $shareType, $shareWith, $uidOwner,
|
$itemTarget = Helper::generateTarget($itemType, $itemSource, $shareType, $shareWith, $uidOwner,
|
||||||
$suggestedItemTarget);
|
$suggestedItemTarget);
|
||||||
}
|
|
||||||
|
|
||||||
$run = true;
|
$run = true;
|
||||||
$error = '';
|
$error = '';
|
||||||
|
@ -1515,14 +1159,14 @@ class Share extends Constants {
|
||||||
'uidOwner' => $uidOwner,
|
'uidOwner' => $uidOwner,
|
||||||
'permissions' => $permissions,
|
'permissions' => $permissions,
|
||||||
'fileSource' => $fileSource,
|
'fileSource' => $fileSource,
|
||||||
'expiration' => $expirationDate,
|
'expiration' => null,
|
||||||
'token' => $token,
|
'token' => null,
|
||||||
'run' => &$run,
|
'run' => &$run,
|
||||||
'error' => &$error
|
'error' => &$error
|
||||||
);
|
);
|
||||||
|
|
||||||
$preHookData['itemTarget'] = $isGroupShare ? $groupItemTarget : $itemTarget;
|
$preHookData['itemTarget'] = $itemTarget;
|
||||||
$preHookData['shareWith'] = $isGroupShare ? $shareWith['group'] : $shareWith;
|
$preHookData['shareWith'] = $shareWith;
|
||||||
|
|
||||||
\OC_Hook::emit(\OCP\Share::class, 'pre_shared', $preHookData);
|
\OC_Hook::emit(\OCP\Share::class, 'pre_shared', $preHookData);
|
||||||
|
|
||||||
|
@ -1534,37 +1178,19 @@ class Share extends Constants {
|
||||||
$sourceId = ($itemType === 'file' || $itemType === 'folder') ? $fileSource : $itemSource;
|
$sourceId = ($itemType === 'file' || $itemType === 'folder') ? $fileSource : $itemSource;
|
||||||
$sourceExists = self::getItemSharedWithBySource($itemType, $sourceId, self::FORMAT_NONE, null, true, $user);
|
$sourceExists = self::getItemSharedWithBySource($itemType, $sourceId, self::FORMAT_NONE, null, true, $user);
|
||||||
|
|
||||||
$userShareType = $isGroupShare ? self::$shareTypeGroupUserUnique : $shareType;
|
$userShareType = $shareType;
|
||||||
|
|
||||||
if ($sourceExists && $sourceExists['item_source'] === $itemSource) {
|
if ($sourceExists && $sourceExists['item_source'] === $itemSource) {
|
||||||
$fileTarget = $sourceExists['file_target'];
|
$fileTarget = $sourceExists['file_target'];
|
||||||
$itemTarget = $sourceExists['item_target'];
|
$itemTarget = $sourceExists['item_target'];
|
||||||
|
|
||||||
// for group shares we don't need a additional entry if the target is the same
|
} elseif(!$sourceExists) {
|
||||||
if($isGroupShare && $groupItemTarget === $itemTarget) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
} elseif(!$sourceExists && !$isGroupShare) {
|
|
||||||
|
|
||||||
$itemTarget = Helper::generateTarget($itemType, $itemSource, $userShareType, $user,
|
$itemTarget = Helper::generateTarget($itemType, $itemSource, $userShareType, $user,
|
||||||
$uidOwner, $suggestedItemTarget, $parent);
|
$uidOwner, $suggestedItemTarget, $parent);
|
||||||
if (isset($fileSource)) {
|
if (isset($fileSource)) {
|
||||||
if ($parentFolder) {
|
|
||||||
if ($parentFolder === true) {
|
|
||||||
$fileTarget = Helper::generateTarget('file', $filePath, $userShareType, $user,
|
|
||||||
$uidOwner, $suggestedFileTarget, $parent);
|
|
||||||
if ($fileTarget != $groupFileTarget) {
|
|
||||||
$parentFolders[$user]['folder'] = $fileTarget;
|
|
||||||
}
|
|
||||||
} else if (isset($parentFolder[$user])) {
|
|
||||||
$fileTarget = $parentFolder[$user]['folder'].$itemSource;
|
|
||||||
$parent = $parentFolder[$user]['id'];
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
$fileTarget = Helper::generateTarget('file', $filePath, $userShareType,
|
$fileTarget = Helper::generateTarget('file', $filePath, $userShareType,
|
||||||
$user, $uidOwner, $suggestedFileTarget, $parent);
|
$user, $uidOwner, $suggestedFileTarget, $parent);
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
$fileTarget = null;
|
$fileTarget = null;
|
||||||
}
|
}
|
||||||
|
@ -1601,20 +1227,14 @@ class Share extends Constants {
|
||||||
'shareTime' => time(),
|
'shareTime' => time(),
|
||||||
'fileSource' => $fileSource,
|
'fileSource' => $fileSource,
|
||||||
'fileTarget' => $fileTarget,
|
'fileTarget' => $fileTarget,
|
||||||
'token' => $token,
|
'token' => null,
|
||||||
'parent' => $parent,
|
'parent' => $parent,
|
||||||
'expiration' => $expirationDate,
|
'expiration' => null,
|
||||||
);
|
);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$id = false;
|
$id = false;
|
||||||
if ($isGroupShare) {
|
|
||||||
$id = self::insertShare($queriesToExecute['groupShare']);
|
|
||||||
// Save this id, any extra rows for this group share will need to reference it
|
|
||||||
$parent = \OC::$server->getDatabaseConnection()->lastInsertId('*PREFIX*share');
|
|
||||||
unset($queriesToExecute['groupShare']);
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach ($queriesToExecute as $shareQuery) {
|
foreach ($queriesToExecute as $shareQuery) {
|
||||||
$shareQuery['parent'] = $parent;
|
$shareQuery['parent'] = $parent;
|
||||||
|
@ -1630,8 +1250,8 @@ class Share extends Constants {
|
||||||
'permissions' => $permissions,
|
'permissions' => $permissions,
|
||||||
'fileSource' => $fileSource,
|
'fileSource' => $fileSource,
|
||||||
'id' => $parent,
|
'id' => $parent,
|
||||||
'token' => $token,
|
'token' => null,
|
||||||
'expirationDate' => $expirationDate,
|
'expirationDate' => null,
|
||||||
);
|
);
|
||||||
|
|
||||||
$postHookData['shareWith'] = $isGroupShare ? $shareWith['group'] : $shareWith;
|
$postHookData['shareWith'] = $isGroupShare ? $shareWith['group'] : $shareWith;
|
||||||
|
@ -1653,11 +1273,13 @@ class Share extends Constants {
|
||||||
* @param int $permissions
|
* @param int $permissions
|
||||||
* @param string|null $itemSourceName
|
* @param string|null $itemSourceName
|
||||||
* @param null|\DateTime $expirationDate
|
* @param null|\DateTime $expirationDate
|
||||||
|
* @deprecated TESTS ONLY - this methods is only used by tests
|
||||||
|
* called like this:
|
||||||
|
* self::checkReshare('test', $itemSource, self::SHARE_TYPE_USER, $shareWith, $uidOwner, $permissions, null, null);
|
||||||
*/
|
*/
|
||||||
private static function checkReshare($itemType, $itemSource, $shareType, $shareWith, $uidOwner, $permissions, $itemSourceName, $expirationDate) {
|
private static function checkReshare($itemType, $itemSource, $shareType, $shareWith, $uidOwner, $permissions, $itemSourceName, $expirationDate) {
|
||||||
$backend = self::getBackend($itemType);
|
$backend = self::getBackend($itemType);
|
||||||
|
|
||||||
$l = \OC::$server->getL10N('lib');
|
|
||||||
$result = array();
|
$result = array();
|
||||||
|
|
||||||
$column = ($itemType === 'file' || $itemType === 'folder') ? 'file_source' : 'item_source';
|
$column = ($itemType === 'file' || $itemType === 'folder') ? 'file_source' : 'item_source';
|
||||||
|
@ -1665,12 +1287,9 @@ class Share extends Constants {
|
||||||
$checkReshare = self::getItemSharedWithBySource($itemType, $itemSource, self::FORMAT_NONE, null, true);
|
$checkReshare = self::getItemSharedWithBySource($itemType, $itemSource, self::FORMAT_NONE, null, true);
|
||||||
if ($checkReshare) {
|
if ($checkReshare) {
|
||||||
// Check if attempting to share back to owner
|
// Check if attempting to share back to owner
|
||||||
if ($checkReshare['uid_owner'] == $shareWith && $shareType == self::SHARE_TYPE_USER) {
|
if ($checkReshare['uid_owner'] == $shareWith) {
|
||||||
$message = 'Sharing %1$s failed, because the user %2$s is the original sharer';
|
$message = 'Sharing %1$s failed, because the user %2$s is the original sharer';
|
||||||
$message_t = $l->t('Sharing failed, because the user %s is the original sharer', [$shareWith]);
|
throw new \Exception(sprintf($message, $itemSourceName, $shareWith));
|
||||||
|
|
||||||
\OCP\Util::writeLog('OCP\Share', sprintf($message, $itemSourceName, $shareWith), ILogger::DEBUG);
|
|
||||||
throw new \Exception($message_t);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1679,10 +1298,7 @@ class Share extends Constants {
|
||||||
if (self::isResharingAllowed() && (int)$checkReshare['permissions'] & \OCP\Constants::PERMISSION_SHARE) {
|
if (self::isResharingAllowed() && (int)$checkReshare['permissions'] & \OCP\Constants::PERMISSION_SHARE) {
|
||||||
if (~(int)$checkReshare['permissions'] & $permissions) {
|
if (~(int)$checkReshare['permissions'] & $permissions) {
|
||||||
$message = 'Sharing %1$s failed, because the permissions exceed permissions granted to %2$s';
|
$message = 'Sharing %1$s failed, because the permissions exceed permissions granted to %2$s';
|
||||||
$message_t = $l->t('Sharing %1$s failed, because the permissions exceed permissions granted to %2$s', array($itemSourceName, $uidOwner));
|
throw new \Exception(sprintf($message, $itemSourceName, $uidOwner));
|
||||||
|
|
||||||
\OCP\Util::writeLog('OCP\Share', sprintf($message, $itemSourceName, $uidOwner), ILogger::DEBUG);
|
|
||||||
throw new \Exception($message_t);
|
|
||||||
} else {
|
} else {
|
||||||
// TODO Don't check if inside folder
|
// TODO Don't check if inside folder
|
||||||
$result['parent'] = $checkReshare['id'];
|
$result['parent'] = $checkReshare['id'];
|
||||||
|
@ -1711,10 +1327,7 @@ class Share extends Constants {
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
$message = 'Sharing %s failed, because resharing is not allowed';
|
$message = 'Sharing %s failed, because resharing is not allowed';
|
||||||
$message_t = $l->t('Sharing %s failed, because resharing is not allowed', array($itemSourceName));
|
throw new \Exception(sprintf($message, $itemSourceName));
|
||||||
|
|
||||||
\OCP\Util::writeLog('OCP\Share', sprintf($message, $itemSourceName), ILogger::DEBUG);
|
|
||||||
throw new \Exception($message_t);
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
$result['parent'] = null;
|
$result['parent'] = null;
|
||||||
|
@ -1725,24 +1338,15 @@ class Share extends Constants {
|
||||||
if (!$backend->isValidSource($itemSource, $uidOwner)) {
|
if (!$backend->isValidSource($itemSource, $uidOwner)) {
|
||||||
$message = 'Sharing %1$s failed, because the sharing backend for '
|
$message = 'Sharing %1$s failed, because the sharing backend for '
|
||||||
.'%2$s could not find its source';
|
.'%2$s could not find its source';
|
||||||
$message_t = $l->t('Sharing %1$s failed, because the sharing backend for %2$s could not find its source', array($itemSource, $itemType));
|
throw new \Exception(sprintf($message, $itemSource, $itemType));
|
||||||
\OCP\Util::writeLog('OCP\Share', sprintf($message, $itemSource, $itemType), ILogger::DEBUG);
|
|
||||||
throw new \Exception($message_t);
|
|
||||||
}
|
}
|
||||||
if ($backend instanceof \OCP\Share_Backend_File_Dependent) {
|
if ($backend instanceof \OCP\Share_Backend_File_Dependent) {
|
||||||
$result['filePath'] = $backend->getFilePath($itemSource, $uidOwner);
|
$result['filePath'] = $backend->getFilePath($itemSource, $uidOwner);
|
||||||
if ($itemType == 'file' || $itemType == 'folder') {
|
|
||||||
$result['fileSource'] = $itemSource;
|
|
||||||
} else {
|
|
||||||
$meta = \OC\Files\Filesystem::getFileInfo($result['filePath']);
|
$meta = \OC\Files\Filesystem::getFileInfo($result['filePath']);
|
||||||
$result['fileSource'] = $meta['fileid'];
|
$result['fileSource'] = $meta['fileid'];
|
||||||
}
|
|
||||||
if ($result['fileSource'] == -1) {
|
if ($result['fileSource'] == -1) {
|
||||||
$message = 'Sharing %s failed, because the file could not be found in the file cache';
|
$message = 'Sharing %s failed, because the file could not be found in the file cache';
|
||||||
$message_t = $l->t('Sharing %s failed, because the file could not be found in the file cache', array($itemSource));
|
throw new \Exception(sprintf($message, $itemSource));
|
||||||
|
|
||||||
\OCP\Util::writeLog('OCP\Share', sprintf($message, $itemSource), ILogger::DEBUG);
|
|
||||||
throw new \Exception($message_t);
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
$result['filePath'] = null;
|
$result['filePath'] = null;
|
||||||
|
@ -1994,48 +1598,6 @@ class Share extends Constants {
|
||||||
return $result;
|
return $result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* send server-to-server share to remote server
|
|
||||||
*
|
|
||||||
* @param string $token
|
|
||||||
* @param string $shareWith
|
|
||||||
* @param string $name
|
|
||||||
* @param int $remote_id
|
|
||||||
* @param string $owner
|
|
||||||
* @return bool
|
|
||||||
*/
|
|
||||||
private static function sendRemoteShare($token, $shareWith, $name, $remote_id, $owner) {
|
|
||||||
|
|
||||||
list($user, $remote) = Helper::splitUserRemote($shareWith);
|
|
||||||
|
|
||||||
if ($user && $remote) {
|
|
||||||
$url = $remote;
|
|
||||||
|
|
||||||
$local = \OC::$server->getURLGenerator()->getAbsoluteURL('/');
|
|
||||||
|
|
||||||
$fields = array(
|
|
||||||
'shareWith' => $user,
|
|
||||||
'token' => $token,
|
|
||||||
'name' => $name,
|
|
||||||
'remoteId' => $remote_id,
|
|
||||||
'owner' => $owner,
|
|
||||||
'remote' => $local,
|
|
||||||
);
|
|
||||||
|
|
||||||
$url = self::removeProtocolFromUrl($url);
|
|
||||||
$result = self::tryHttpPostToShareEndpoint($url, '', $fields);
|
|
||||||
$status = json_decode($result['result'], true);
|
|
||||||
|
|
||||||
if ($result['success'] && ($status['ocs']['meta']['statuscode'] === 100 || $status['ocs']['meta']['statuscode'] === 200)) {
|
|
||||||
\OC_Hook::emit(\OCP\Share::class, 'federated_share_added', ['server' => $remote]);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* send server-to-server unshare to remote server
|
* send server-to-server unshare to remote server
|
||||||
*
|
*
|
||||||
|
@ -2093,23 +1655,4 @@ class Share extends Constants {
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @param string $password
|
|
||||||
* @throws \Exception
|
|
||||||
*/
|
|
||||||
private static function verifyPassword($password) {
|
|
||||||
|
|
||||||
$accepted = true;
|
|
||||||
$message = '';
|
|
||||||
\OCP\Util::emitHook('\OC\Share', 'verifyPassword', [
|
|
||||||
'password' => $password,
|
|
||||||
'accepted' => &$accepted,
|
|
||||||
'message' => &$message
|
|
||||||
]);
|
|
||||||
|
|
||||||
if (!$accepted) {
|
|
||||||
throw new \Exception($message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue