Respect the accepted flag for group and user shares

Signed-off-by: Joas Schilling <coding@schilljs.com>
This commit is contained in:
Joas Schilling 2019-08-21 16:15:23 +02:00
parent 6f8c7885b6
commit dcdbea54e6
No known key found for this signature in database
GPG Key ID: 7076EA9751AACDDA
5 changed files with 67 additions and 2 deletions

View File

@ -44,6 +44,7 @@ use OCP\IUserManager;
use OCP\Notification\IManager; use OCP\Notification\IManager;
use OCP\OCS\IDiscoveryService; use OCP\OCS\IDiscoveryService;
use OCP\Share; use OCP\Share;
use OCP\Share\IShare;
class Manager { class Manager {
const STORAGE = '\OCA\Files_Sharing\External\Storage'; const STORAGE = '\OCA\Files_Sharing\External\Storage';
@ -151,7 +152,7 @@ class Manager {
public function addShare($remote, $token, $password, $name, $owner, $shareType, $accepted=false, $user = null, $remoteId = -1, $parent = -1) { public function addShare($remote, $token, $password, $name, $owner, $shareType, $accepted=false, $user = null, $remoteId = -1, $parent = -1) {
$user = $user ? $user : $this->uid; $user = $user ? $user : $this->uid;
$accepted = $accepted ? 1 : 0; $accepted = $accepted ? IShare::STATUS_ACCEPTED : IShare::STATUS_PENDING;
$name = Filesystem::normalizePath('/' . $name); $name = Filesystem::normalizePath('/' . $name);
if (!$accepted) { if (!$accepted) {

View File

@ -35,6 +35,7 @@ use OCP\IConfig;
use OCP\ILogger; use OCP\ILogger;
use OCP\IUser; use OCP\IUser;
use OCP\Share\IManager; use OCP\Share\IManager;
use OCP\Share\IShare;
class MountProvider implements IMountProvider { class MountProvider implements IMountProvider {
/** /**
@ -94,6 +95,11 @@ class MountProvider implements IMountProvider {
try { try {
/** @var \OCP\Share\IShare $parentShare */ /** @var \OCP\Share\IShare $parentShare */
$parentShare = $share[0]; $parentShare = $share[0];
if ($parentShare->getStatus() !== IShare::STATUS_ACCEPTED) {
continue;
}
$owner = $parentShare->getShareOwner(); $owner = $parentShare->getShareOwner();
if (!isset($ownerViews[$owner])) { if (!isset($ownerViews[$owner])) {
$ownerViews[$owner] = new View('/' . $parentShare->getShareOwner() . '/files'); $ownerViews[$owner] = new View('/' . $parentShare->getShareOwner() . '/files');
@ -188,8 +194,11 @@ class MountProvider implements IMountProvider {
// use most permissive permissions // use most permissive permissions
$permissions = 0; $permissions = 0;
$status = IShare::STATUS_PENDING;
foreach ($shares as $share) { foreach ($shares as $share) {
$permissions |= $share->getPermissions(); $permissions |= $share->getPermissions();
$status = max($status, $share->getStatus());
if ($share->getTarget() !== $superShare->getTarget()) { if ($share->getTarget() !== $superShare->getTarget()) {
// adjust target, for database consistency // adjust target, for database consistency
$share->setTarget($superShare->getTarget()); $share->setTarget($superShare->getTarget());
@ -216,7 +225,8 @@ class MountProvider implements IMountProvider {
} }
} }
$superShare->setPermissions($permissions); $superShare->setPermissions($permissions)
->setStatus($status);
$result[] = [$superShare, $shares]; $result[] = [$superShare, $shares];
} }

View File

@ -142,6 +142,7 @@ class DefaultShareProvider implements IShareProvider {
if ($share->getShareType() === \OCP\Share::SHARE_TYPE_USER) { if ($share->getShareType() === \OCP\Share::SHARE_TYPE_USER) {
//Set the UID of the user we share with //Set the UID of the user we share with
$qb->setValue('share_with', $qb->createNamedParameter($share->getSharedWith())); $qb->setValue('share_with', $qb->createNamedParameter($share->getSharedWith()));
$qb->setValue('accepted', $qb->createNamedParameter(IShare::STATUS_PENDING));
} else if ($share->getShareType() === \OCP\Share::SHARE_TYPE_GROUP) { } else if ($share->getShareType() === \OCP\Share::SHARE_TYPE_GROUP) {
//Set the GID of the group we share with //Set the GID of the group we share with
$qb->setValue('share_with', $qb->createNamedParameter($share->getSharedWith())); $qb->setValue('share_with', $qb->createNamedParameter($share->getSharedWith()));
@ -932,6 +933,7 @@ class DefaultShareProvider implements IShareProvider {
->setTarget($data['file_target']) ->setTarget($data['file_target'])
->setNote($data['note']) ->setNote($data['note'])
->setMailSend((bool)$data['mail_send']) ->setMailSend((bool)$data['mail_send'])
->setStatus((int)$data['accepted'])
->setLabel($data['label']); ->setLabel($data['label']);
$shareTime = new \DateTime(); $shareTime = new \DateTime();
@ -1020,6 +1022,7 @@ class DefaultShareProvider implements IShareProvider {
while($data = $stmt->fetch()) { while($data = $stmt->fetch()) {
$shareMap[$data['parent']]->setPermissions((int)$data['permissions']); $shareMap[$data['parent']]->setPermissions((int)$data['permissions']);
$shareMap[$data['parent']]->setStatus((int)$data['accepted']);
$shareMap[$data['parent']]->setTarget($data['file_target']); $shareMap[$data['parent']]->setTarget($data['file_target']);
$shareMap[$data['parent']]->setParent($data['parent']); $shareMap[$data['parent']]->setParent($data['parent']);
} }

View File

@ -58,6 +58,8 @@ class Share implements \OCP\Share\IShare {
private $shareOwner; private $shareOwner;
/** @var int */ /** @var int */
private $permissions; private $permissions;
/** @var int */
private $status;
/** @var string */ /** @var string */
private $note = ''; private $note = '';
/** @var \DateTime */ /** @var \DateTime */
@ -318,6 +320,21 @@ class Share implements \OCP\Share\IShare {
return $this->permissions; return $this->permissions;
} }
/**
* @inheritdoc
*/
public function setStatus(int $status): IShare {
$this->status = $status;
return $this;
}
/**
* @inheritdoc
*/
public function getStatus(): int {
return $this->status;
}
/** /**
* @inheritdoc * @inheritdoc
*/ */

View File

@ -96,6 +96,21 @@ interface IShare {
*/ */
// const TYPE_USERROOM = 11; // const TYPE_USERROOM = 11;
/**
* @since 18.0.0
*/
public const STATUS_PENDING = 0;
/**
* @since 18.0.0
*/
public const STATUS_ACCEPTED = 1;
/**
* @since 18.0.0
*/
public const STATUS_REJECTED = 2;
/** /**
* Set the internal id of the share * Set the internal id of the share
* It is only allowed to set the internal id of a share once. * It is only allowed to set the internal id of a share once.
@ -279,6 +294,25 @@ interface IShare {
*/ */
public function getPermissions(); public function getPermissions();
/**
* Set the accepted status
* See self::STATUS_*
*
* @param int $status
* @return IShare The modified object
* @since 18.0.0
*/
public function setStatus(int $status): IShare;
/**
* Get the accepted status
* See self::STATUS_*
*
* @return int
* @since 18.0.0
*/
public function getStatus(): int;
/** /**
* Attach a note to a share * Attach a note to a share
* *