* @author Daniel Kesselberg * @author Felix Nüsse * @author fnuesse * @author fnuesse * @author Joas Schilling * @author John Molakvoæ (skjnldsv) * @author Julius Härtl * @author Lukas Reschke * @author Max Kovalenko * @author Morris Jobke * @author Richard Steinmetz * @author Robin Appelman * @author Roeland Jago Douma * @author Tobias Kaminsky * @author Vincent Petry * * @license AGPL-3.0 * * This code is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License, version 3, * as published by the Free Software Foundation. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License, version 3, * along with this program. If not, see * */ namespace OCA\Files\Controller; use OC\Files\Node\Node; use OCA\Files\Service\TagService; use OCP\AppFramework\Controller; use OCP\AppFramework\Http; use OCP\AppFramework\Http\DataResponse; use OCP\AppFramework\Http\FileDisplayResponse; use OCP\AppFramework\Http\JSONResponse; use OCP\AppFramework\Http\Response; use OCP\Files\File; use OCP\Files\Folder; use OCP\Files\NotFoundException; use OCP\IConfig; use OCP\IPreview; use OCP\IRequest; use OCP\IUserSession; use OCP\Share\IManager; use OCP\Share\IShare; /** * Class ApiController * * @package OCA\Files\Controller */ class ApiController extends Controller { /** @var TagService */ private $tagService; /** @var IManager * */ private $shareManager; /** @var IPreview */ private $previewManager; /** IUserSession */ private $userSession; /** IConfig */ private $config; /** @var Folder */ private $userFolder; /** * @param string $appName * @param IRequest $request * @param IUserSession $userSession * @param TagService $tagService * @param IPreview $previewManager * @param IManager $shareManager * @param IConfig $config * @param Folder $userFolder */ public function __construct($appName, IRequest $request, IUserSession $userSession, TagService $tagService, IPreview $previewManager, IManager $shareManager, IConfig $config, Folder $userFolder) { parent::__construct($appName, $request); $this->userSession = $userSession; $this->tagService = $tagService; $this->previewManager = $previewManager; $this->shareManager = $shareManager; $this->config = $config; $this->userFolder = $userFolder; } /** * Gets a thumbnail of the specified file * * @since API version 1.0 * * @NoAdminRequired * @NoCSRFRequired * @StrictCookieRequired * * @param int $x * @param int $y * @param string $file URL-encoded filename * @return DataResponse|FileDisplayResponse */ public function getThumbnail($x, $y, $file) { if ($x < 1 || $y < 1) { return new DataResponse(['message' => 'Requested size must be numeric and a positive value.'], Http::STATUS_BAD_REQUEST); } try { $file = $this->userFolder->get($file); if ($file instanceof Folder) { throw new NotFoundException(); } /** @var File $file */ $preview = $this->previewManager->getPreview($file, $x, $y, true); return new FileDisplayResponse($preview, Http::STATUS_OK, ['Content-Type' => $preview->getMimeType()]); } catch (NotFoundException $e) { return new DataResponse(['message' => 'File not found.'], Http::STATUS_NOT_FOUND); } catch (\Exception $e) { return new DataResponse([], Http::STATUS_BAD_REQUEST); } } /** * Updates the info of the specified file path * The passed tags are absolute, which means they will * replace the actual tag selection. * * @NoAdminRequired * * @param string $path path * @param array|string $tags array of tags * @return DataResponse */ public function updateFileTags($path, $tags = null) { $result = []; // if tags specified or empty array, update tags if (!is_null($tags)) { try { $this->tagService->updateFileTags($path, $tags); } catch (\OCP\Files\NotFoundException $e) { return new DataResponse([ 'message' => $e->getMessage() ], Http::STATUS_NOT_FOUND); } catch (\OCP\Files\StorageNotAvailableException $e) { return new DataResponse([ 'message' => $e->getMessage() ], Http::STATUS_SERVICE_UNAVAILABLE); } catch (\Exception $e) { return new DataResponse([ 'message' => $e->getMessage() ], Http::STATUS_NOT_FOUND); } $result['tags'] = $tags; } return new DataResponse($result); } /** * @param \OCP\Files\Node[] $nodes * @return array */ private function formatNodes(array $nodes) { return array_values(array_map(function (Node $node) { /** @var \OC\Files\Node\Node $shareTypes */ $shareTypes = $this->getShareTypes($node); $file = \OCA\Files\Helper::formatFileInfo($node->getFileInfo()); $file['hasPreview'] = $this->previewManager->isAvailable($node); $parts = explode('/', dirname($node->getPath()), 4); if (isset($parts[3])) { $file['path'] = '/' . $parts[3]; } else { $file['path'] = '/'; } if (!empty($shareTypes)) { $file['shareTypes'] = $shareTypes; } return $file; }, $nodes)); } /** * Returns a list of recently modifed files. * * @NoAdminRequired * * @return DataResponse */ public function getRecentFiles() { $nodes = $this->userFolder->getRecent(100); $files = $this->formatNodes($nodes); return new DataResponse(['files' => $files]); } /** * Return a list of share types for outgoing shares * * @param Node $node file node * * @return int[] array of share types */ private function getShareTypes(Node $node) { $userId = $this->userSession->getUser()->getUID(); $shareTypes = []; $requestedShareTypes = [ IShare::TYPE_USER, IShare::TYPE_GROUP, IShare::TYPE_LINK, IShare::TYPE_REMOTE, IShare::TYPE_EMAIL, IShare::TYPE_ROOM, IShare::TYPE_DECK, ]; foreach ($requestedShareTypes as $requestedShareType) { // one of each type is enough to find out about the types $shares = $this->shareManager->getSharesBy( $userId, $requestedShareType, $node, false, 1 ); if (!empty($shares)) { $shareTypes[] = $requestedShareType; } } return $shareTypes; } /** * Change the default sort mode * * @NoAdminRequired * * @param string $mode * @param string $direction * @return Response * @throws \OCP\PreConditionNotMetException */ public function updateFileSorting($mode, $direction) { $allowedMode = ['name', 'size', 'mtime']; $allowedDirection = ['asc', 'desc']; if (!in_array($mode, $allowedMode) || !in_array($direction, $allowedDirection)) { $response = new Response(); $response->setStatus(Http::STATUS_UNPROCESSABLE_ENTITY); return $response; } $this->config->setUserValue($this->userSession->getUser()->getUID(), 'files', 'file_sorting', $mode); $this->config->setUserValue($this->userSession->getUser()->getUID(), 'files', 'file_sorting_direction', $direction); return new Response(); } /** * Toggle default for showing/hiding hidden files * * @NoAdminRequired * * @param bool $show * @return Response * @throws \OCP\PreConditionNotMetException */ public function showHiddenFiles($show) { $this->config->setUserValue($this->userSession->getUser()->getUID(), 'files', 'show_hidden', (int)$show); return new Response(); } /** * Toggle default for files grid view * * @NoAdminRequired * * @param bool $show * @return Response * @throws \OCP\PreConditionNotMetException */ public function showGridView($show) { $this->config->setUserValue($this->userSession->getUser()->getUID(), 'files', 'show_grid', (int)$show); return new Response(); } /** * Get default settings for the grid view * * @NoAdminRequired */ public function getGridView() { $status = $this->config->getUserValue($this->userSession->getUser()->getUID(), 'files', 'show_grid', '0') === '1'; return new JSONResponse(['gridview' => $status]); } /** * Toggle default for showing/hiding xxx folder * * @NoAdminRequired * * @param int $show * @param string $key the key of the folder * * @return Response * @throws \OCP\PreConditionNotMetException */ public function toggleShowFolder(int $show, string $key) { // ensure the edited key exists $navItems = \OCA\Files\App::getNavigationManager()->getAll(); foreach ($navItems as $item) { // check if data is valid if (($show === 0 || $show === 1) && isset($item['expandedState']) && $key === $item['expandedState']) { $this->config->setUserValue($this->userSession->getUser()->getUID(), 'files', $key, (int)$show); return new Response(); } } $response = new Response(); $response->setStatus(Http::STATUS_FORBIDDEN); return $response; } /** * Get sorting-order for custom sorting * * @NoAdminRequired * * @param string $folderpath * @return string * @throws \OCP\Files\NotFoundException */ public function getNodeType($folderpath) { $node = $this->userFolder->get($folderpath); return $node->getType(); } } option> Nextcloud server, a safe home for all your data: https://github.com/nextcloud/serverwww-data
aboutsummaryrefslogtreecommitdiffstats
blob: 6444dbb8a3661690b094fd8834563f6de34a4c57 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
<?php
/**
 * @copyright Copyright (c) 2016, ownCloud, Inc.
 *
 * @author Christopher Schäpers <kondou@ts.unde.re>
 * @author Jörn Friedrich Dreyer <jfd@butonic.de>
 * @author Michael Gapczynski <GapczynskiM@gmail.com>
 * @author Morris Jobke <hey@morrisjobke.de>
 * @author Robin Appelman <robin@icewind.nl>
 * @author Roeland Jago Douma <roeland@famdouma.nl>
 *
 * @license AGPL-3.0
 *
 * This code is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License, version 3,
 * as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
 * GNU Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License, version 3,
 * along with this program.  If not, see <http://www.gnu.org/licenses/>
 *
 */

namespace OCA\Files_Sharing;

use OC\Files\Cache\Wrapper\CacheJail;
use OCP\Files\Cache\ICacheEntry;
use OCP\Files\Storage\IStorage;

/**
 * Metadata cache for shared files
 *
 * don't use this class directly if you need to get metadata, use \OC\Files\Filesystem::getFileInfo instead
 */
class Cache extends CacheJail {
	/**
	 * @var \OCA\Files_Sharing\SharedStorage
	 */
	private $storage;

	/**
	 * @var IStorage
	 */
	private $sourceStorage;

	/**
	 * @var ICacheEntry
	 */
	private $sourceRootInfo;

	/**
	 * @var \OCP\Files\Cache\ICache
	 */
	private $sourceCache;

	/**
	 * @param \OCA\Files_Sharing\SharedStorage $storage
	 * @param IStorage $sourceStorage
	 * @param ICacheEntry $sourceRootInfo
	 */
	public function __construct($storage, IStorage $sourceStorage, ICacheEntry $sourceRootInfo) {
		$this->storage = $storage;
		$this->sourceStorage = $sourceStorage;
		$this->sourceRootInfo = $sourceRootInfo;
		$this->sourceCache = $sourceStorage->getCache();
		parent::__construct(
			$this->sourceCache,
			$this->sourceRootInfo->getPath()
		);
	}

	public function getNumericStorageId() {
		if (isset($this->numericId)) {
			return $this->numericId;
		} else {
			return false;
		}
	}

	protected function formatCacheEntry($entry) {
		$path = isset($entry['path']) ? $entry['path'] : '';
		$entry = parent::formatCacheEntry($entry);
		$sharePermissions = $this->storage->getPermissions($path);
		if (isset($entry['permissions'])) {
			$entry['permissions'] &= $sharePermissions;
		} else {
			$entry['permissions'] = $sharePermissions;
		}
		$entry['uid_owner'] = $this->storage->getOwner($path);
		$entry['displayname_owner'] = \OC_User::getDisplayName($entry['uid_owner']);
		if ($path === '') {
			$entry['is_share_mount_point'] = true;
		}
		return $entry;
	}

	/**
	 * remove all entries for files that are stored on the storage from the cache
	 */
	public function clear() {
		// Not a valid action for Shared Cache
	}
}