[Tiki-devel] Permission inheritance

Jonny Bradley via TikiWiki-devel <[email protected]>
Newsgroups gmane.comp.cms.tiki.devel
Message-ID <[email protected]>
Hi all, almost certainly something for Victor but others may know and/or benefit from sharing :)

A couple of Tikis ago you added a "layer" to the Permissions system so that child objects could inherit the permission on their parents, like files in file galleries, and blog posts in blogs etc.

We are deploying a tiki for a client that needs category permissions to work on forums, which we assumed they would but it seems not. A user can see how many "topics" (a.k.a. threads) there are in a forum, on tiki-forums.php, but not see the actual posts in tiki-view_forum.php or tiki-view_forum_thread.php.

So i worked out the patch below, which gets the relevant parent forumId into the Perms::get function and hoped the Victor Magic would take over and all would be well... but it seems not. And stepping through the code i get lost, as usual, in \Perms_ResolverFactory_ObjectFactory::bulk and so on.

What did i miss?

Thanks in advance

jonny
----

Index: lib/comments/commentslib.php
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/lib/comments/commentslib.php b/lib/comments/commentslib.php
--- a/lib/comments/commentslib.php	(revision bc819256788b13decea7e53e9cb4a5920646b95b)
+++ b/lib/comments/commentslib.php	(date 1611684287040)
@@ -921,7 +921,7 @@
 		$query .= $info['query'];
 
 		$ret = $this->fetchAll($query, $info['bindvars'], $max, $offset);
-		$ret = $this->filter_topic_perms($ret);
+		$ret = $this->filter_topic_perms($ret, $forumId);
 
 		foreach ($ret as &$res) {
 			$tid = $res['threadId'];
@@ -960,7 +960,7 @@
 		return $this->getOne($query, $info['bindvars']);
 	}
 
-	private function filter_topic_perms($topics) {
+	private function filter_topic_perms($topics, $forumId = null) {
 		$topic_ids = array_map(function($row){
 			return $row['parentId'] > 0 ? $row['parentId'] : $row['threadId'];
 		}, $topics);
@@ -970,7 +970,7 @@
 		$ret = [];
 		foreach ($topics as $row) {
 			$topic_id = $row['parentId'] > 0 ? $row['parentId'] : $row['threadId'];
-			$perms = Perms::get(['type' => 'thread', 'object' => $topic_id]);
+			$perms = Perms::get(['type' => 'thread', 'object' => $topic_id, 'parentId' => $forumId]);
 			if ($perms->forum_read) {
 				$ret[] = $row;
 			}
Index: lib/tikilib.php
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/lib/tikilib.php b/lib/tikilib.php
--- a/lib/tikilib.php	(revision bc819256788b13decea7e53e9cb4a5920646b95b)
+++ b/lib/tikilib.php	(date 1611676561491)
@@ -4051,13 +4051,13 @@
 	 * @param bool $global
 	 * @return array|bool
 	 */
-	function get_perm_object($objectId, $objectType, $info = '', $global = true)
+	function get_perm_object($objectId, $objectType, $info = '', $global = true, $parentId = null)
 	{
 		global $user;
 		$smarty = TikiLib::lib('smarty');
 		$userlib = TikiLib::lib('user');
 
-		$perms = Perms::get([ 'type' => $objectType, 'object' => $objectId ]);
+		$perms = Perms::get([ 'type' => $objectType, 'object' => $objectId, 'parentId' => $parentId ]);
 		if (empty($perms->getGroups())) {
 			$perms->setGroups($this->get_user_groups($user));
 		}
Index: tiki-view_forum_thread.php
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
diff --git a/tiki-view_forum_thread.php b/tiki-view_forum_thread.php
--- a/tiki-view_forum_thread.php	(revision bc819256788b13decea7e53e9cb4a5920646b95b)
+++ b/tiki-view_forum_thread.php	(date 1611682683787)
@@ -145,7 +145,7 @@
 $commentslib->comment_add_hit($_REQUEST["comments_parentId"]);
 $commentslib->mark_comment($user, $forumId, $_REQUEST["comments_parentId"]);
 
-$tikilib->get_perm_object($_REQUEST['comments_parentId'], 'thread');
+$tikilib->get_perm_object($_REQUEST['comments_parentId'], 'thread', '', true, $forumId);
 
 if ($user) {
 	if ($forum_info["moderator"] == $user) {
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.