Seditio Source
Root |
./othercms/xenForo 2.2.8/src/XF/Permission/TreeContentPermissions.php
<?php

namespace XF\Permission;

use
XF\Mvc\Entity\Entity;

abstract class
TreeContentPermissions extends AbstractContentPermissions
{
   
/**
     * @var \XF\Tree
     */
   
protected $tree;

    abstract public function
getContentTree();

    abstract public function
getContentTitle(Entity $entity);

    abstract protected function
getFinalPerms($contentId, array $calculated, array &$childPerms);
    abstract protected function
getFinalAnalysisPerms($contentId, array $calculated, array &$childPerms);

    protected function
setupBuildTypeData()
    {
       
$this->tree = $this->getContentTree();
    }

    public function
getAnalysisContentPairs()
    {
       
$pairs = [];
        foreach (
$this->tree->getFlattened() AS $id => $value)
        {
           
$prefix = $value['depth'] ? str_repeat('--', $value['depth']) . ' ' : '';
           
$pairs[$id] = $prefix . $this->getContentTitle($value['record']);
        }

        return
$pairs;
    }

    public function
rebuildCombination(\XF\Entity\PermissionCombination $combination, array $basePerms)
    {
       
$built = $this->buildForChildrenOf(null, $combination->user_group_list, $combination->user_id, $basePerms);
       
$this->writeBuiltCombination($combination, $built);
    }

    public function
analyzeCombination(
        \
XF\Entity\PermissionCombination $combination, $contentId, array $basePerms, array $baseIntermediates
   
)
    {
       
$parents = $this->tree->getPathTo($contentId);
        if (
$parents === null)
        {
           
// content ID isn't in the tree
           
return [];
        }

       
$groupIds = $combination->user_group_list;
       
$userId = $combination->user_id;

       
$intermediates = $baseIntermediates;
       
$permissions = $basePerms;
       
$finalPerms = [];
       
$dependChanges = [];

       
$treePath = array_keys($parents);
       
$treePath[] = $contentId;

       
$titles = $this->getAnalysisContentPairs();

        foreach (
$treePath AS $treeId)
        {
           
$permissions = $this->adjustBasePermissionAllows($permissions);

           
$sets = $this->getApplicablePermissionSets($treeId, $groupIds, $userId);
           
$permissions = $this->builder->calculatePermissions($sets, $this->permissionsGrouped, $permissions);

           
$calculated = $this->builder->applyPermissionDependencies(
               
$permissions, $this->permissionsGrouped, $dependChanges
           
);
           
$finalPerms = $this->getFinalAnalysisPerms($contentId, $calculated, $permissions);

           
$thisIntermediates = $this->builder->collectIntermediates(
               
$combination, $permissions, $sets, $treeId, $titles[$treeId]
            );
           
$intermediates = $this->builder->pushIntermediates($intermediates, $thisIntermediates);
        }

        return
$this->builder->getFinalAnalysis($finalPerms, $intermediates, $dependChanges);
    }

    protected function
buildForChildrenOf($contentId, array $userGroupIds, $userId, array $basePerms)
    {
       
$childIds = $this->tree->childIds($contentId);
        if (!
$childIds)
        {
            return [];
        }

       
$basePerms = $this->adjustBasePermissionAllows($basePerms);

       
$output = [];
        foreach (
$childIds AS $childId)
        {
           
$output += $this->buildForContent($childId, $userGroupIds, $userId, $basePerms);
        }

        return
$output;
    }

    protected function
buildForContent($contentId, array $userGroupIds, $userId, array $basePerms)
    {
       
$sets = $this->getApplicablePermissionSets($contentId, $userGroupIds, $userId);
       
$childPerms = $this->builder->calculatePermissions($sets, $this->permissionsGrouped, $basePerms);

       
$calculated = $this->builder->applyPermissionDependencies($childPerms, $this->permissionsGrouped);
       
$finalPerms = $this->getFinalPerms($contentId, $calculated, $childPerms);

       
$output = [];
       
$output[$contentId] = $finalPerms;
       
$output += $this->buildForChildrenOf($contentId, $userGroupIds, $userId, $childPerms);

        return
$output;
    }
}