Dav endpoint returns proper data

Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
This commit is contained in:
Roeland Jago Douma 2018-04-13 17:11:25 +02:00
parent 5c6d3b4f41
commit b3e7865d9b
No known key found for this signature in database
GPG Key ID: F941078878347C0C
5 changed files with 90 additions and 15 deletions

View File

@ -34,6 +34,11 @@ ignore_user_abort(true);
$requestUri = \OC::$server->getRequest()->getRequestUri(); $requestUri = \OC::$server->getRequest()->getRequestUri();
$serverFactory = new \OCA\DAV\Direct\ServerFactory(\OC::$server->getConfig()); $serverFactory = new \OCA\DAV\Direct\ServerFactory(\OC::$server->getConfig());
$server = $serverFactory->createServer($baseuri, $requestUri); $server = $serverFactory->createServer(
$baseuri,
$requestUri,
\OC::$server->getRootFolder(),
\OC::$server->query(\OCA\DAV\Db\DirectMapper::class)
);
$server->exec(); $server->exec();

View File

@ -24,6 +24,7 @@ declare(strict_types=1);
namespace OCA\DAV\Db; namespace OCA\DAV\Db;
use OCP\AppFramework\Db\DoesNotExistException;
use OCP\AppFramework\Db\Mapper; use OCP\AppFramework\Db\Mapper;
use OCP\IDBConnection; use OCP\IDBConnection;
@ -32,4 +33,24 @@ class DirectMapper extends Mapper {
public function __construct(IDBConnection $db) { public function __construct(IDBConnection $db) {
parent::__construct($db, 'directlink', Direct::class); parent::__construct($db, 'directlink', Direct::class);
} }
public function getByToken(string $token): Direct {
$qb = $this->db->getQueryBuilder();
$qb->select('*')
->from('directlink')
->where(
$qb->expr()->eq('token', $qb->createNamedParameter($token))
);
$cursor = $qb->execute();
$data = $cursor->fetch();
$cursor->closeCursor();
if ($data === false) {
throw new DoesNotExistException();
}
return Direct::fromRow($data);
}
} }

View File

@ -24,16 +24,26 @@ declare(strict_types=1);
namespace OCA\DAV\Direct; namespace OCA\DAV\Direct;
use OCA\DAV\Db\Direct;
use OCP\Files\File; use OCP\Files\File;
use OCP\Files\IRootFolder;
use Sabre\DAV\Exception\Forbidden; use Sabre\DAV\Exception\Forbidden;
use Sabre\DAV\Exception\NotFound;
use Sabre\DAV\IFile; use Sabre\DAV\IFile;
class DirectFile implements IFile { class DirectFile implements IFile {
/** @var Direct */
private $direct;
/** @var IRootFolder */
private $rootFolder;
/** @var File */ /** @var File */
private $file; private $file;
public function __construct(File $file) { public function __construct(Direct $direct, IRootFolder $rootFolder) {
$this->file = $file; $this->direct = $direct;
$this->rootFolder = $rootFolder;
} }
function put($data) { function put($data) {
@ -41,30 +51,35 @@ class DirectFile implements IFile {
} }
function get() { function get() {
// TODO: Implement get() method. $this->getFile();
return $this->file->fopen('rb');
} }
function getContentType() { function getContentType() {
// TODO: Implement getContentType() method. $this->getFile();
return $this->file->getMimeType();
} }
function getETag() { function getETag() {
$this->getFile();
return $this->file->getEtag(); return $this->file->getEtag();
// TODO: Implement getETag() method.
} }
function getSize() { function getSize() {
$this->getFile();
return $this->file->getSize(); return $this->file->getSize();
// TODO: Implement getSize() method.
} }
function delete() { function delete() {
throw new Forbidden(); throw new Forbidden();
// TODO: Implement delete() method.
} }
function getName() { function getName() {
return $this->file->getName(); return $this->direct->getToken();
} }
function setName($name) { function setName($name) {
@ -72,8 +87,26 @@ class DirectFile implements IFile {
} }
function getLastModified() { function getLastModified() {
$this->getFile();
return $this->file->getMTime(); return $this->file->getMTime();
// TODO: Implement getLastModified() method. }
private function getFile() {
if ($this->file === null) {
$userFolder = $this->rootFolder->getUserFolder($this->direct->getUserId());
$files = $userFolder->getById($this->direct->getFileId());
//TODO check expiration
if ($files === []) {
throw new NotFound();
}
$this->file = array_shift($files);
}
return $this->file;
} }
} }

View File

@ -24,6 +24,8 @@ declare(strict_types=1);
namespace OCA\DAV\Direct; namespace OCA\DAV\Direct;
use OCA\DAV\Db\DirectMapper;
use OCP\AppFramework\Db\DoesNotExistException;
use OCP\Files\File; use OCP\Files\File;
use OCP\Files\IRootFolder; use OCP\Files\IRootFolder;
use Sabre\DAV\Exception\Forbidden; use Sabre\DAV\Exception\Forbidden;
@ -35,8 +37,12 @@ class DirectHome implements ICollection {
/** @var IRootFolder */ /** @var IRootFolder */
private $rootFolder; private $rootFolder;
public function __construct(IRootFolder $rootFolder) { /** @var DirectMapper */
private $mapper;
public function __construct(IRootFolder $rootFolder, DirectMapper $mapper) {
$this->rootFolder = $rootFolder; $this->rootFolder = $rootFolder;
$this->mapper = $mapper;
} }
function createFile($name, $data = null) { function createFile($name, $data = null) {
@ -47,8 +53,14 @@ class DirectHome implements ICollection {
throw new Forbidden(); throw new Forbidden();
} }
function getChild($name) { public function getChild($name) {
throw new NotFound(); try {
$direct = $this->mapper->getByToken($name);
return new DirectFile($direct, $this->rootFolder);
} catch (DoesNotExistException $e) {
throw new NotFound();
}
} }
function getChildren() { function getChildren() {

View File

@ -24,6 +24,8 @@ declare(strict_types=1);
namespace OCA\DAV\Direct; namespace OCA\DAV\Direct;
use OCA\DAV\Db\DirectMapper;
use OCP\Files\IRootFolder;
use OCP\IConfig; use OCP\IConfig;
class ServerFactory { class ServerFactory {
@ -35,8 +37,10 @@ class ServerFactory {
} }
public function createServer(string $baseURI, public function createServer(string $baseURI,
string $requestURI) { string $requestURI,
$home = new DirectHome(\OC::$server->getRootFolder()); IRootFolder $rootFolder,
DirectMapper $mapper) {
$home = new DirectHome($rootFolder, $mapper);
$server = new Server($home); $server = new Server($home);
$server->httpRequest->setUrl($requestURI); $server->httpRequest->setUrl($requestURI);