Provider functionality

Signed-off-by: Joas Schilling <coding@schilljs.com>
This commit is contained in:
Joas Schilling 2018-10-17 20:03:44 +02:00 committed by Julius Härtl
parent 65a9ab47ea
commit 136d2c39ac
No known key found for this signature in database
GPG Key ID: 4C614C6ED2CDE6DF
7 changed files with 160 additions and 5 deletions

View File

@ -31,19 +31,26 @@ use OCP\Collaboration\Resources\IManager;
use OCP\Collaboration\Resources\IResource; use OCP\Collaboration\Resources\IResource;
use OCP\Collaboration\Resources\ResourceException; use OCP\Collaboration\Resources\ResourceException;
use OCP\IRequest; use OCP\IRequest;
use OCP\IUserSession;
class CollaborationResourcesController extends OCSController { class CollaborationResourcesController extends OCSController {
/** @var IManager */ /** @var IManager */
private $manager; private $manager;
/** @var IUserSession */
private $userSession;
public function __construct( public function __construct(
$appName, string $appName,
IRequest $request, IRequest $request,
IManager $manager IManager $manager,
IUserSession $userSession
) { ) {
parent::__construct($appName, $request); parent::__construct($appName, $request);
$this->manager = $manager; $this->manager = $manager;
$this->userSession = $userSession;
} }
/** /**
@ -54,7 +61,7 @@ class CollaborationResourcesController extends OCSController {
protected function getCollection(int $collectionId): ICollection { protected function getCollection(int $collectionId): ICollection {
$collection = $this->manager->getCollection($collectionId); $collection = $this->manager->getCollection($collectionId);
if (false) { // TODO auth checking if (!$collection->canAccess($this->userSession->getUser())) {
throw new CollectionException('Not found'); throw new CollectionException('Not found');
} }
@ -141,12 +148,15 @@ class CollaborationResourcesController extends OCSController {
*/ */
public function getCollectionsByResource(string $resourceType, string $resourceId): DataResponse { public function getCollectionsByResource(string $resourceType, string $resourceId): DataResponse {
try { try {
// TODO auth checking
$resource = $this->manager->getResource($resourceType, $resourceId); $resource = $this->manager->getResource($resourceType, $resourceId);
} catch (CollectionException $e) { } catch (CollectionException $e) {
return new DataResponse([], Http::STATUS_NOT_FOUND); return new DataResponse([], Http::STATUS_NOT_FOUND);
} }
if (!$resource->canAccess($this->userSession->getUser())) {
return new DataResponse([], Http::STATUS_NOT_FOUND);
}
return new DataResponse(array_map([$this, 'prepareCollection'], $resource->getCollections())); return new DataResponse(array_map([$this, 'prepareCollection'], $resource->getCollections()));
} }
@ -157,7 +167,8 @@ class CollaborationResourcesController extends OCSController {
protected function prepareResources(IResource $resource): array { protected function prepareResources(IResource $resource): array {
return [ return [
'type' => $resource->getType(), 'type' => $resource->getType(),
'id' => $resource->getId() 'id' => $resource->getId(),
'name' => $resource->getName(),
]; ];
} }
} }

View File

@ -30,6 +30,7 @@ use OCP\Collaboration\Resources\ICollection;
use OCP\Collaboration\Resources\IResource; use OCP\Collaboration\Resources\IResource;
use OCP\DB\QueryBuilder\IQueryBuilder; use OCP\DB\QueryBuilder\IQueryBuilder;
use OCP\IDBConnection; use OCP\IDBConnection;
use OCP\IUser;
class Collection implements ICollection { class Collection implements ICollection {
@ -131,6 +132,23 @@ class Collection implements ICollection {
} }
} }
/**
* Can a user/guest access the collection
*
* @param IUser $user
* @return bool
* @since 15.0.0
*/
public function canAccess(IUser $user = null): bool {
foreach ($this->getResources() as $resource) {
if ($resource->canAccess($user)) {
return true;
}
}
return false;
}
protected function isSameResource(IResource $resource1, IResource $resource2): bool { protected function isSameResource(IResource $resource1, IResource $resource2): bool {
return $resource1->getType() === $resource2->getType() && return $resource1->getType() === $resource2->getType() &&
$resource1->getId() === $resource2->getId(); $resource1->getId() === $resource2->getId();

View File

@ -25,8 +25,11 @@ namespace OC\Collaboration\Resources;
use OCP\Collaboration\Resources\ICollection; use OCP\Collaboration\Resources\ICollection;
use OCP\Collaboration\Resources\IManager; use OCP\Collaboration\Resources\IManager;
use OCP\Collaboration\Resources\IProvider;
use OCP\Collaboration\Resources\IResource; use OCP\Collaboration\Resources\IResource;
use OCP\Collaboration\Resources\ResourceException;
use OCP\IDBConnection; use OCP\IDBConnection;
use OCP\IUser;
class Manager implements IManager { class Manager implements IManager {
@ -55,4 +58,51 @@ class Manager implements IManager {
public function getResource(string $type, string $id): IResource { public function getResource(string $type, string $id): IResource {
return new Resource($this, $this->connection, $type, $id); return new Resource($this, $this->connection, $type, $id);
} }
/**
* @return IProvider[]
* @since 15.0.0
*/
public function getProviders(): array {
return [];
}
/**
* Get the display name of a resource
*
* @param IResource $resource
* @return string
* @since 15.0.0
*/
public function getName(IResource $resource): string {
foreach ($this->getProviders() as $provider) {
try {
return $provider->getName($resource);
} catch (ResourceException $e) {
}
}
return '';
}
/**
* Can a user/guest access the collection
*
* @param IResource $resource
* @param IUser $user
* @return bool
* @since 15.0.0
*/
public function canAccess(IResource $resource, IUser $user = null): bool {
foreach ($this->getProviders() as $provider) {
try {
if ($provider->canAccess($resource, $user)) {
return true;
}
} catch (ResourceException $e) {
}
}
return false;
}
} }

View File

@ -26,7 +26,9 @@ namespace OC\Collaboration\Resources;
use OCP\Collaboration\Resources\ICollection; use OCP\Collaboration\Resources\ICollection;
use OCP\Collaboration\Resources\IManager; use OCP\Collaboration\Resources\IManager;
use OCP\Collaboration\Resources\IResource; use OCP\Collaboration\Resources\IResource;
use OCP\Collaboration\Resources\ResourceException;
use OCP\IDBConnection; use OCP\IDBConnection;
use OCP\IUser;
class Resource implements IResource { class Resource implements IResource {
@ -42,6 +44,9 @@ class Resource implements IResource {
/** @var string */ /** @var string */
protected $id; protected $id;
/** @var string|null */
protected $name;
public function __construct(IManager $manager, IDBConnection $connection, string $type, string $id) { public function __construct(IManager $manager, IDBConnection $connection, string $type, string $id) {
$this->manager = $manager; $this->manager = $manager;
$this->connection = $connection; $this->connection = $connection;
@ -65,6 +70,29 @@ class Resource implements IResource {
return $this->id; return $this->id;
} }
/**
* @return string
* @since 15.0.0
*/
public function getName(): string {
if ($this->name === null) {
$this->name = $this->manager->getName($this);
}
return $this->name;
}
/**
* Can a user/guest access the resource
*
* @param IUser $user
* @return bool
* @since 15.0.0
*/
public function canAccess(IUser $user = null): bool {
return $this->manager->canAccess($this, $user);
}
/** /**
* @return ICollection[] * @return ICollection[]
* @since 15.0.0 * @since 15.0.0

View File

@ -22,6 +22,8 @@ declare(strict_types=1);
namespace OCP\Collaboration\Resources; namespace OCP\Collaboration\Resources;
use OCP\IUser;
/** /**
* @since 15.0.0 * @since 15.0.0
*/ */
@ -49,4 +51,13 @@ interface ICollection {
* @since 15.0.0 * @since 15.0.0
*/ */
public function removeResource(IResource $resource); public function removeResource(IResource $resource);
/**
* Can a user/guest access the collection
*
* @param IUser $user
* @return bool
* @since 15.0.0
*/
public function canAccess(IUser $user = null): bool;
} }

View File

@ -22,7 +22,27 @@ declare(strict_types=1);
namespace OCP\Collaboration\Resources; namespace OCP\Collaboration\Resources;
use OCP\IUser;
interface IProvider { interface IProvider {
/**
* Get the display name of a resource
*
* @param IResource $resource
* @return string
* @since 15.0.0
*/
public function getName(IResource $resource): string;
/**
* Can a user/guest access the collection
*
* @param IResource $resource
* @param IUser $user
* @return bool
* @since 15.0.0
*/
public function canAccess(IResource $resource, IUser $user = null): bool;
} }

View File

@ -22,6 +22,8 @@ declare(strict_types=1);
namespace OCP\Collaboration\Resources; namespace OCP\Collaboration\Resources;
use OCP\IUser;
/** /**
* @since 15.0.0 * @since 15.0.0
*/ */
@ -39,6 +41,21 @@ interface IResource {
*/ */
public function getId(): string; public function getId(): string;
/**
* @return string
* @since 15.0.0
*/
public function getName(): string;
/**
* Can a user/guest access the resource
*
* @param IUser $user
* @return bool
* @since 15.0.0
*/
public function canAccess(IUser $user = null): bool;
/** /**
* @return ICollection[] * @return ICollection[]
* @since 15.0.0 * @since 15.0.0