Skip to content

Commit d8ea28b

Browse files
Merge pull request #44326 from nextcloud/backport/44309/stable23
[stable23] Forbid tagging readonly files
2 parents 3795d7e + a4473ce commit d8ea28b

File tree

7 files changed

+160
-189
lines changed

7 files changed

+160
-189
lines changed

apps/dav/lib/SystemTag/SystemTagMappingNode.php

Lines changed: 20 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -37,62 +37,37 @@
3737
* Mapping node for system tag to object id
3838
*/
3939
class SystemTagMappingNode implements \Sabre\DAV\INode {
40-
/**
41-
* @var ISystemTag
42-
*/
43-
protected $tag;
44-
45-
/**
46-
* @var string
47-
*/
40+
/** @var ISystemTag */
41+
private $tag;
42+
/** @var string */
4843
private $objectId;
49-
50-
/**
51-
* @var string
52-
*/
44+
/** @var string */
5345
private $objectType;
54-
55-
/**
56-
* User
57-
*
58-
* @var IUser
59-
*/
60-
protected $user;
61-
62-
/**
63-
* @var ISystemTagManager
64-
*/
65-
protected $tagManager;
66-
67-
/**
68-
* @var ISystemTagObjectMapper
69-
*/
46+
/** @var IUser */
47+
private $user;
48+
/** @var ISystemTagManager */
49+
private $tagManager;
50+
/** @var ISystemTagObjectMapper */
7051
private $tagMapper;
52+
/** @var \Closure */
53+
private $childWriteAccessFunction;
7154

72-
/**
73-
* Sets up the node, expects a full path name
74-
*
75-
* @param ISystemTag $tag system tag
76-
* @param string $objectId
77-
* @param string $objectType
78-
* @param IUser $user user
79-
* @param ISystemTagManager $tagManager
80-
* @param ISystemTagObjectMapper $tagMapper
81-
*/
8255
public function __construct(
8356
ISystemTag $tag,
84-
$objectId,
85-
$objectType,
57+
string $objectId,
58+
string $objectType,
8659
IUser $user,
8760
ISystemTagManager $tagManager,
88-
ISystemTagObjectMapper $tagMapper
61+
ISystemTagObjectMapper $tagMapper,
62+
\Closure $childWriteAccessFunction
8963
) {
9064
$this->tag = $tag;
9165
$this->objectId = $objectId;
9266
$this->objectType = $objectType;
9367
$this->user = $user;
9468
$this->tagManager = $tagManager;
9569
$this->tagMapper = $tagMapper;
70+
$this->childWriteAccessFunction = $childWriteAccessFunction;
9671
}
9772

9873
/**
@@ -161,6 +136,10 @@ public function delete() {
161136
if (!$this->tagManager->canUserAssignTag($this->tag, $this->user)) {
162137
throw new Forbidden('No permission to unassign tag ' . $this->tag->getId());
163138
}
139+
$writeAccessFunction = $this->childWriteAccessFunction;
140+
if (!$writeAccessFunction($this->objectId)) {
141+
throw new Forbidden('No permission to unassign tag to ' . $this->objectId);
142+
}
164143
$this->tagMapper->unassignTags($this->objectId, $this->objectType, $this->tag->getId());
165144
} catch (TagNotFoundException $e) {
166145
// can happen if concurrent deletion occurred

apps/dav/lib/SystemTag/SystemTagsObjectMappingCollection.php

Lines changed: 21 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -40,56 +40,33 @@
4040
* Collection containing tags by object id
4141
*/
4242
class SystemTagsObjectMappingCollection implements ICollection {
43-
44-
/**
45-
* @var string
46-
*/
43+
/** @var string */
4744
private $objectId;
48-
49-
/**
50-
* @var string
51-
*/
45+
/** @var string */
5246
private $objectType;
53-
54-
/**
55-
* @var ISystemTagManager
56-
*/
47+
/** @var IUser */
48+
private $user;
49+
/** @var ISystemTagManager */
5750
private $tagManager;
58-
59-
/**
60-
* @var ISystemTagObjectMapper
61-
*/
51+
/** @var ISystemTagObjectMapper */
6252
private $tagMapper;
53+
/** @var \Closure */
54+
protected $childWriteAccessFunction;
6355

64-
/**
65-
* User
66-
*
67-
* @var IUser
68-
*/
69-
private $user;
70-
71-
72-
/**
73-
* Constructor
74-
*
75-
* @param string $objectId object id
76-
* @param string $objectType object type
77-
* @param IUser $user user
78-
* @param ISystemTagManager $tagManager tag manager
79-
* @param ISystemTagObjectMapper $tagMapper tag mapper
80-
*/
8156
public function __construct(
82-
$objectId,
83-
$objectType,
57+
string $objectId,
58+
string $objectType,
8459
IUser $user,
8560
ISystemTagManager $tagManager,
86-
ISystemTagObjectMapper $tagMapper
61+
ISystemTagObjectMapper $tagMapper,
62+
\Closure $childWriteAccessFunction
8763
) {
88-
$this->tagManager = $tagManager;
89-
$this->tagMapper = $tagMapper;
9064
$this->objectId = $objectId;
9165
$this->objectType = $objectType;
9266
$this->user = $user;
67+
$this->tagManager = $tagManager;
68+
$this->tagMapper = $tagMapper;
69+
$this->childWriteAccessFunction = $childWriteAccessFunction;
9370
}
9471

9572
public function createFile($name, $data = null) {
@@ -103,7 +80,10 @@ public function createFile($name, $data = null) {
10380
if (!$this->tagManager->canUserAssignTag($tag, $this->user)) {
10481
throw new Forbidden('No permission to assign tag ' . $tagId);
10582
}
106-
83+
$writeAccessFunction = $this->childWriteAccessFunction;
84+
if (!$writeAccessFunction($this->objectId)) {
85+
throw new Forbidden('No permission to assign tag to ' . $this->objectId);
86+
}
10787
$this->tagMapper->assignTags($this->objectId, $this->objectType, $tagId);
10888
} catch (TagNotFoundException $e) {
10989
throw new PreconditionFailed('Tag with id ' . $tagId . ' does not exist, cannot assign');
@@ -204,7 +184,8 @@ private function makeNode(ISystemTag $tag) {
204184
$this->objectType,
205185
$this->user,
206186
$this->tagManager,
207-
$this->tagMapper
187+
$this->tagMapper,
188+
$this->childWriteAccessFunction,
208189
);
209190
}
210191
}

apps/dav/lib/SystemTag/SystemTagsObjectTypeCollection.php

Lines changed: 16 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -38,61 +38,37 @@
3838
* Collection containing object ids by object type
3939
*/
4040
class SystemTagsObjectTypeCollection implements ICollection {
41-
42-
/**
43-
* @var string
44-
*/
41+
/** @var string */
4542
private $objectType;
46-
47-
/**
48-
* @var ISystemTagManager
49-
*/
43+
/** @var ISystemTagManager */
5044
private $tagManager;
51-
52-
/**
53-
* @var ISystemTagObjectMapper
54-
*/
45+
/** @var ISystemTagObjectMapper */
5546
private $tagMapper;
56-
57-
/**
58-
* @var IGroupManager
59-
*/
60-
private $groupManager;
61-
62-
/**
63-
* @var IUserSession
64-
*/
47+
/** @var IUserSession */
6548
private $userSession;
66-
67-
/**
68-
* @var \Closure
69-
**/
49+
/** @var IGroupManager */
50+
private $groupManager;
51+
/** @var \Closure */
7052
protected $childExistsFunction;
53+
/** @var \Closure */
54+
protected $childWriteAccessFunction;
7155

72-
/**
73-
* Constructor
74-
*
75-
* @param string $objectType object type
76-
* @param ISystemTagManager $tagManager
77-
* @param ISystemTagObjectMapper $tagMapper
78-
* @param IUserSession $userSession
79-
* @param IGroupManager $groupManager
80-
* @param \Closure $childExistsFunction
81-
*/
8256
public function __construct(
83-
$objectType,
57+
string $objectType,
8458
ISystemTagManager $tagManager,
8559
ISystemTagObjectMapper $tagMapper,
8660
IUserSession $userSession,
8761
IGroupManager $groupManager,
88-
\Closure $childExistsFunction
62+
\Closure $childExistsFunction,
63+
\Closure $childWriteAccessFunction
8964
) {
65+
$this->objectType = $objectType;
9066
$this->tagManager = $tagManager;
9167
$this->tagMapper = $tagMapper;
92-
$this->objectType = $objectType;
9368
$this->userSession = $userSession;
9469
$this->groupManager = $groupManager;
9570
$this->childExistsFunction = $childExistsFunction;
71+
$this->childWriteAccessFunction = $childWriteAccessFunction;
9672
}
9773

9874
/**
@@ -129,7 +105,8 @@ public function getChild($objectName) {
129105
$this->objectType,
130106
$this->userSession->getUser(),
131107
$this->tagManager,
132-
$this->tagMapper
108+
$this->tagMapper,
109+
$this->childWriteAccessFunction,
133110
);
134111
}
135112

apps/dav/lib/SystemTag/SystemTagsRelationsCollection.php

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
*/
2727
namespace OCA\DAV\SystemTag;
2828

29+
use OCP\Constants;
2930
use OCP\IGroupManager;
3031
use OCP\IUserSession;
3132
use OCP\SystemTag\ISystemTagManager;
@@ -36,7 +37,6 @@
3637
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
3738

3839
class SystemTagsRelationsCollection extends SimpleCollection {
39-
4040
/**
4141
* SystemTagsRelationsCollection constructor.
4242
*
@@ -60,10 +60,19 @@ public function __construct(
6060
$tagMapper,
6161
$userSession,
6262
$groupManager,
63-
function ($name) {
63+
function ($name): bool {
6464
$nodes = \OC::$server->getUserFolder()->getById((int)$name);
6565
return !empty($nodes);
66-
}
66+
},
67+
function ($name): bool {
68+
$nodes = \OC::$server->getUserFolder()->getById((int)$name);
69+
foreach ($nodes as $node) {
70+
if (($node->getPermissions() & Constants::PERMISSION_UPDATE) === Constants::PERMISSION_UPDATE) {
71+
return true;
72+
}
73+
}
74+
return false;
75+
},
6776
),
6877
];
6978

@@ -77,7 +86,10 @@ function ($name) {
7786
$tagMapper,
7887
$userSession,
7988
$groupManager,
80-
$entityExistsFunction
89+
$entityExistsFunction,
90+
function ($name) {
91+
return true;
92+
},
8193
);
8294
}
8395

0 commit comments

Comments
 (0)