accept/decline group shares
Signed-off-by: Bjoern Schiessle <bjoern@schiessle.org>
This commit is contained in:
parent
7a48a85dca
commit
f5a816262c
|
@ -228,6 +228,8 @@ class CloudFederationProviderFiles implements ICloudFederationProvider {
|
||||||
\OC::$server->query(\OCP\OCS\IDiscoveryService::class),
|
\OC::$server->query(\OCP\OCS\IDiscoveryService::class),
|
||||||
\OC::$server->getCloudFederationProviderManager(),
|
\OC::$server->getCloudFederationProviderManager(),
|
||||||
\OC::$server->getCloudFederationFactory(),
|
\OC::$server->getCloudFederationFactory(),
|
||||||
|
\OC::$server->getGroupManager(),
|
||||||
|
\OC::$server->getUserManager(),
|
||||||
$shareWith
|
$shareWith
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
|
@ -105,6 +105,8 @@ class Application extends App {
|
||||||
$server->query(\OCP\OCS\IDiscoveryService::class),
|
$server->query(\OCP\OCS\IDiscoveryService::class),
|
||||||
$server->getCloudFederationProviderManager(),
|
$server->getCloudFederationProviderManager(),
|
||||||
$server->getCloudFederationFactory(),
|
$server->getCloudFederationFactory(),
|
||||||
|
$server->getGroupManager(),
|
||||||
|
$server->getUserManager(),
|
||||||
$uid
|
$uid
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
|
@ -39,6 +39,8 @@ use OCP\Files;
|
||||||
use OCP\Files\Storage\IStorageFactory;
|
use OCP\Files\Storage\IStorageFactory;
|
||||||
use OCP\Http\Client\IClientService;
|
use OCP\Http\Client\IClientService;
|
||||||
use OCP\IDBConnection;
|
use OCP\IDBConnection;
|
||||||
|
use OCP\IGroupManager;
|
||||||
|
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;
|
||||||
|
@ -87,6 +89,12 @@ class Manager {
|
||||||
/** @var ICloudFederationFactory */
|
/** @var ICloudFederationFactory */
|
||||||
private $cloudFederationFactory;
|
private $cloudFederationFactory;
|
||||||
|
|
||||||
|
/** @var IGroupManager */
|
||||||
|
private $groupManager;
|
||||||
|
|
||||||
|
/** @var IUserManager */
|
||||||
|
private $userManager;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param IDBConnection $connection
|
* @param IDBConnection $connection
|
||||||
* @param \OC\Files\Mount\Manager $mountManager
|
* @param \OC\Files\Mount\Manager $mountManager
|
||||||
|
@ -96,6 +104,8 @@ class Manager {
|
||||||
* @param IDiscoveryService $discoveryService
|
* @param IDiscoveryService $discoveryService
|
||||||
* @param ICloudFederationProviderManager $cloudFederationProviderManager
|
* @param ICloudFederationProviderManager $cloudFederationProviderManager
|
||||||
* @param ICloudFederationFactory $cloudFederationFactory
|
* @param ICloudFederationFactory $cloudFederationFactory
|
||||||
|
* @param IGroupManager $groupManager
|
||||||
|
* @param IUserManager $userManager
|
||||||
* @param string $uid
|
* @param string $uid
|
||||||
*/
|
*/
|
||||||
public function __construct(IDBConnection $connection,
|
public function __construct(IDBConnection $connection,
|
||||||
|
@ -106,6 +116,8 @@ class Manager {
|
||||||
IDiscoveryService $discoveryService,
|
IDiscoveryService $discoveryService,
|
||||||
ICloudFederationProviderManager $cloudFederationProviderManager,
|
ICloudFederationProviderManager $cloudFederationProviderManager,
|
||||||
ICloudFederationFactory $cloudFederationFactory,
|
ICloudFederationFactory $cloudFederationFactory,
|
||||||
|
IGroupManager $groupManager,
|
||||||
|
IUserManager $userManager,
|
||||||
$uid) {
|
$uid) {
|
||||||
$this->connection = $connection;
|
$this->connection = $connection;
|
||||||
$this->mountManager = $mountManager;
|
$this->mountManager = $mountManager;
|
||||||
|
@ -116,6 +128,8 @@ class Manager {
|
||||||
$this->discoveryService = $discoveryService;
|
$this->discoveryService = $discoveryService;
|
||||||
$this->cloudFederationProviderManager = $cloudFederationProviderManager;
|
$this->cloudFederationProviderManager = $cloudFederationProviderManager;
|
||||||
$this->cloudFederationFactory = $cloudFederationFactory;
|
$this->cloudFederationFactory = $cloudFederationFactory;
|
||||||
|
$this->groupManager = $groupManager;
|
||||||
|
$this->userManager = $userManager;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -176,12 +190,7 @@ class Manager {
|
||||||
$mountPoint = Filesystem::normalizePath('/' . $mountPoint);
|
$mountPoint = Filesystem::normalizePath('/' . $mountPoint);
|
||||||
$hash = md5($mountPoint);
|
$hash = md5($mountPoint);
|
||||||
|
|
||||||
$query = $this->connection->prepare('
|
$this->writeShareToDb($remote, $token, $password, $name, $owner, $user, $mountPoint, $hash, $accepted, $remoteId, $parent, $shareType);
|
||||||
INSERT INTO `*PREFIX*share_external`
|
|
||||||
(`remote`, `share_token`, `password`, `name`, `owner`, `user`, `mountpoint`, `mountpoint_hash`, `accepted`, `remote_id`, `parent`, `share_type`)
|
|
||||||
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
||||||
');
|
|
||||||
$query->execute(array($remote, $token, $password, $name, $owner, $user, $mountPoint, $hash, $accepted, $remoteId, $parent, $shareType));
|
|
||||||
|
|
||||||
$options = array(
|
$options = array(
|
||||||
'remote' => $remote,
|
'remote' => $remote,
|
||||||
|
@ -193,6 +202,32 @@ class Manager {
|
||||||
return $this->mountShare($options);
|
return $this->mountShare($options);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* write remote share to the database
|
||||||
|
*
|
||||||
|
* @param $remote
|
||||||
|
* @param $token
|
||||||
|
* @param $password
|
||||||
|
* @param $name
|
||||||
|
* @param $owner
|
||||||
|
* @param $user
|
||||||
|
* @param $mountPoint
|
||||||
|
* @param $hash
|
||||||
|
* @param $accepted
|
||||||
|
* @param $remoteId
|
||||||
|
* @param $parent
|
||||||
|
* @param $shareType
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
private function writeShareToDb($remote, $token, $password, $name, $owner, $user, $mountPoint, $hash, $accepted, $remoteId, $parent, $shareType) {
|
||||||
|
$query = $this->connection->prepare('
|
||||||
|
INSERT INTO `*PREFIX*share_external`
|
||||||
|
(`remote`, `share_token`, `password`, `name`, `owner`, `user`, `mountpoint`, `mountpoint_hash`, `accepted`, `remote_id`, `parent`, `share_type`)
|
||||||
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
||||||
|
');
|
||||||
|
return $query->execute(array($remote, $token, $password, $name, $owner, $user, $mountPoint, $hash, $accepted, $remoteId, $parent, $shareType));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* get share
|
* get share
|
||||||
*
|
*
|
||||||
|
@ -201,12 +236,27 @@ class Manager {
|
||||||
*/
|
*/
|
||||||
public function getShare($id) {
|
public function getShare($id) {
|
||||||
$getShare = $this->connection->prepare('
|
$getShare = $this->connection->prepare('
|
||||||
SELECT `id`, `remote`, `remote_id`, `share_token`, `name`, `owner`, `user`, `mountpoint`, `accepted`
|
SELECT `id`, `remote`, `remote_id`, `share_token`, `name`, `owner`, `user`, `mountpoint`, `accepted`, `parent`, `share_type`, `password`, `mountpoint_hash`
|
||||||
FROM `*PREFIX*share_external`
|
FROM `*PREFIX*share_external`
|
||||||
WHERE `id` = ? AND `user` = ?');
|
WHERE `id` = ?');
|
||||||
$result = $getShare->execute(array($id, $this->uid));
|
$result = $getShare->execute(array($id));
|
||||||
|
|
||||||
|
$share = $result ? $getShare->fetch() : [];
|
||||||
|
|
||||||
|
$validShare = is_array($share) && isset($share['share_type']) && isset($share['user']);
|
||||||
|
|
||||||
|
// check if the user is allowed to access it
|
||||||
|
if ($validShare && (int)$share['share_type'] === Share::SHARE_TYPE_USER && $share['user'] === $this->uid) {
|
||||||
|
return $share;
|
||||||
|
} else if ($validShare && (int)$share['share_type'] === Share::SHARE_TYPE_GROUP) {
|
||||||
|
$user = $this->userManager->get($this->uid);
|
||||||
|
if ($this->groupManager->get($share['user'])->inGroup($user)) {
|
||||||
|
return $share;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
|
||||||
return $result ? $getShare->fetch() : false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -227,7 +277,7 @@ class Manager {
|
||||||
$mountPoint = Filesystem::normalizePath($mountPoint);
|
$mountPoint = Filesystem::normalizePath($mountPoint);
|
||||||
$hash = md5($mountPoint);
|
$hash = md5($mountPoint);
|
||||||
|
|
||||||
if($share['share_type'] === \OCP\Share::SHARE_TYPE_USER) {
|
if($share['share_type'] === Share::SHARE_TYPE_USER) {
|
||||||
$acceptShare = $this->connection->prepare('
|
$acceptShare = $this->connection->prepare('
|
||||||
UPDATE `*PREFIX*share_external`
|
UPDATE `*PREFIX*share_external`
|
||||||
SET `accepted` = ?,
|
SET `accepted` = ?,
|
||||||
|
@ -236,6 +286,17 @@ class Manager {
|
||||||
WHERE `id` = ? AND `user` = ?');
|
WHERE `id` = ? AND `user` = ?');
|
||||||
$updated = $acceptShare->execute(array(1, $mountPoint, $hash, $id, $this->uid));
|
$updated = $acceptShare->execute(array(1, $mountPoint, $hash, $id, $this->uid));
|
||||||
} else {
|
} else {
|
||||||
|
$result = $this->writeShareToDb(
|
||||||
|
$share['remote'],
|
||||||
|
$share['share_token'],
|
||||||
|
$share['password'],
|
||||||
|
$share['name'],
|
||||||
|
$share['owner'],
|
||||||
|
$this->uid,
|
||||||
|
$mountPoint, $hash, 1,
|
||||||
|
$share['remote_id'],
|
||||||
|
$id,
|
||||||
|
$share['share_type']);
|
||||||
// TODO group share, add additional row for the user who accepted it
|
// TODO group share, add additional row for the user who accepted it
|
||||||
}
|
}
|
||||||
if ($updated === true) {
|
if ($updated === true) {
|
||||||
|
@ -260,18 +321,34 @@ class Manager {
|
||||||
public function declineShare($id) {
|
public function declineShare($id) {
|
||||||
|
|
||||||
$share = $this->getShare($id);
|
$share = $this->getShare($id);
|
||||||
|
$result = false;
|
||||||
|
|
||||||
if ($share) {
|
if ($share && (int)$share['share_type'] === Share::SHARE_TYPE_USER) {
|
||||||
$removeShare = $this->connection->prepare('
|
$removeShare = $this->connection->prepare('
|
||||||
DELETE FROM `*PREFIX*share_external` WHERE `id` = ? AND `user` = ?');
|
DELETE FROM `*PREFIX*share_external` WHERE `id` = ? AND `user` = ?');
|
||||||
$removeShare->execute(array($id, $this->uid));
|
$removeShare->execute(array($id, $this->uid));
|
||||||
$this->sendFeedbackToRemote($share['remote'], $share['share_token'], $share['remote_id'], 'decline');
|
$this->sendFeedbackToRemote($share['remote'], $share['share_token'], $share['remote_id'], 'decline');
|
||||||
|
|
||||||
$this->processNotification($id);
|
$this->processNotification($id);
|
||||||
return true;
|
$result = true;
|
||||||
|
} else if ($share && (int)$share['share_type'] === Share::SHARE_TYPE_GROUP) {
|
||||||
|
$result = $this->writeShareToDb(
|
||||||
|
$share['remote'],
|
||||||
|
$share['share_token'],
|
||||||
|
$share['password'],
|
||||||
|
$share['name'],
|
||||||
|
$share['owner'],
|
||||||
|
$this->uid,
|
||||||
|
$share['mountpoint'],
|
||||||
|
$share['mountpoint_hash'],
|
||||||
|
0,
|
||||||
|
$share['remote_id'],
|
||||||
|
$id,
|
||||||
|
$share['share_type']);
|
||||||
|
$this->processNotification($id);
|
||||||
}
|
}
|
||||||
|
|
||||||
return false;
|
return $result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -305,7 +382,7 @@ class Manager {
|
||||||
$federationEndpoints = $this->discoveryService->discover($remote, 'FEDERATED_SHARING');
|
$federationEndpoints = $this->discoveryService->discover($remote, 'FEDERATED_SHARING');
|
||||||
$endpoint = isset($federationEndpoints['share']) ? $federationEndpoints['share'] : '/ocs/v2.php/cloud/shares';
|
$endpoint = isset($federationEndpoints['share']) ? $federationEndpoints['share'] : '/ocs/v2.php/cloud/shares';
|
||||||
|
|
||||||
$url = rtrim($remote, '/') . $endpoint . '/' . $remoteId . '/' . $feedback . '?format=' . \OCP\Share::RESPONSE_FORMAT;
|
$url = rtrim($remote, '/') . $endpoint . '/' . $remoteId . '/' . $feedback . '?format=' . Share::RESPONSE_FORMAT;
|
||||||
$fields = array('token' => $token);
|
$fields = array('token' => $token);
|
||||||
|
|
||||||
$client = $this->clientService->newClient();
|
$client = $this->clientService->newClient();
|
||||||
|
|
|
@ -42,6 +42,8 @@ class Hooks {
|
||||||
\OC::$server->query(\OCP\OCS\IDiscoveryService::class),
|
\OC::$server->query(\OCP\OCS\IDiscoveryService::class),
|
||||||
\OC::$server->getCloudFederationProviderManager(),
|
\OC::$server->getCloudFederationProviderManager(),
|
||||||
\OC::$server->getCloudFederationFactory(),
|
\OC::$server->getCloudFederationFactory(),
|
||||||
|
\OC::$server->getGroupManager(),
|
||||||
|
\OC::$server->getUserManager(),
|
||||||
$params['uid']);
|
$params['uid']);
|
||||||
|
|
||||||
$manager->removeUserShares($params['uid']);
|
$manager->removeUserShares($params['uid']);
|
||||||
|
|
Loading…
Reference in New Issue