Post::getSonetPerms

  1. Bitrix24 API (v. 23.675.0)
  2. blog
  3. Post
  4. getSonetPerms
  • Модуль: blog
  • Путь к файлу: ~/bitrix/modules/blog/lib/item/post.php
  • Класс: BitrixBlogItemPost
  • Вызов: Post::getSonetPerms
public function getSonetPerms($params = array())
{
	global $USER;

	static $cache, $userAccessCodeCache;

	if (!Loader::includeModule('socialnetwork'))
	{
		throw new MainSystemException('Socialnetwork module not installed.');
	}

	$fields = $this->getFields();
	if (
		empty($fields)
		|| empty($fields['ID'])
		|| intval($fields['ID']) <= 0
	)
	{
		throw new MainSystemException('Empty post.');
	}

	$cacheId = md5($fields['ID'].serialize($params));

	if (!empty($cache[$cacheId]))
	{
		return $cache[$cacheId];
	}

	$currentUser = false;
	$userId = (isset($params["USER_ID"]) ? intval($params["USER_ID"]) : 0);
	if($userId <= 0)
	{
		$userId = intval($USER->getId());
		$currentUser = true;
	}

	$perms = Permissions::DENY;
	$permsAvailable = array_keys($GLOBALS["AR_BLOG_PERMS"]);

	if($currentUser)
	{
		if (CSocNetUser::isCurrentUserModuleAdmin())
		{
			$perms = $permsAvailable[count($permsAvailable) - 1];
		}
	}
	elseif(CSocNetUser::isUserModuleAdmin($userId))
	{
		$perms = $permsAvailable[count($permsAvailable) - 1];
	}

	if(
		isset($fields["AUTHOR_ID"])
		&& $fields["AUTHOR_ID"] == $userId
	)
	{
		$perms = Permissions::FULL;
	}

	$openedWorkgroupsList = [];
	$readByOpenSonetGroup = false;
	$alreadyFound = false;

	if ($perms <= Permissions::DENY)
	{
		$permsList = CBlogPost::getSocNetPerms($fields['ID']);

		if (
			$userId > 0
			&& MainModuleManager::isModuleInstalled('mail')
		) // check for email authorization users
		{
			$select = array("ID", "EXTERNAL_AUTH_ID");
			if (MainModuleManager::isModuleInstalled('intranet'))
			{
				$select[] = "UF_DEPARTMENT";
			}
			$res = MainUserTable::getList(array(
				'filter' => array(
					"=ID" => $userId
				),
				'select' => $select
			));

			if($userFields = $res->fetch())
			{
				if ($userFields["EXTERNAL_AUTH_ID"] == 'email')
				{
					$alreadyFound = true;
					$perms = (isset($permsList["U"]) && isset($permsList["U"][$userId]) ? Permissions::READ : Permissions::DENY);
				}
				elseif (
					isset($params['PUBLIC']) && $params['PUBLIC']
					&& isset($userFields["UF_DEPARTMENT"]) // intranet installed
					&& (
						!is_array($userFields["UF_DEPARTMENT"])
						|| empty($userFields["UF_DEPARTMENT"])
						|| intval($userFields["UF_DEPARTMENT"][0]) <= 0
					)
					&& Loader::includeModule('extranet')
					&& ($extranetSiteId = CExtranet::getExtranetSiteID()) // for extranet users in public section
				)
				{
					if (isset($params['LOG_ID']) && intval($params['LOG_ID']) > 0)
					{
						$postSiteList = array();
						$res = CSocNetLog::getSite(intval($params['LOG_ID']));
						while ($logSite = $res->fetch())
						{
							$postSiteList[] = $logSite["LID"];
						}

						if (!in_array($extranetSiteId, $postSiteList))
						{
							$alreadyFound = true;
							$perms = Permissions::DENY;
						}
					}
					else
					{
						$alreadyFound = true;
						$perms = Permissions::DENY;
					}
				}
			}
			else
			{
				$alreadyFound = true;
				$perms = Permissions::DENY;
			}
		}

		$entityList = array();

		if (!$alreadyFound)
		{
			if (!empty($userAccessCodeCache[$userId]))
			{
				$entityList = $userAccessCodeCache[$userId];
			}
			else
			{
				$codeList = CAccess::getUserCodesArray($userId);
				foreach($codeList as $code)
				{
					if (
						preg_match('/^DR([0-9]+)/', $code, $match)
						|| preg_match('/^D([0-9]+)/', $code, $match)
						|| preg_match('/^IU([0-9]+)/', $code, $match)
					)
					{
						$entityList["DR"][$code] = $code;
					}
					elseif (preg_match('/^SG([0-9]+)_([A-Z])/', $code, $match))
					{
						$entityList["SG"][$match[1]][$match[2]] = $match[2];
					}
				}
				$userAccessCodeCache[$userId] = $entityList;
			}

			foreach($permsList as $key => $value)
			{
				foreach($value as $id => $p)
				{
					if(!is_array($p))
					{
						$p = array();
					}

					if($userId > 0 && $key == "U" && $userId == $id)
					{
						$perms = (
							in_array("US".$userId, $p) // author
								? Permissions::FULL
								: Permissions::WRITE
						);
						break;
					}

					if(in_array("G2", $p))
					{
						$perms = Permissions::WRITE;
						break;
					}

					if($userId > 0 && in_array("AU", $p))
					{
						$perms = Permissions::WRITE;
						break;
					}

					if($key == "SG")
					{
						if(!empty($entityList["SG"][$id]))
						{
							foreach($entityList["SG"][$id] as $sonetGroupId)
							{
								if(in_array("SG".$id."_".$sonetGroupId, $p))
								{
									$perms = Permissions::READ;
									break;
								}
							}
						}
					}

					if($key == "DR" && !empty($entityList["DR"]))
					{
						if(in_array("DR".$id, $entityList["DR"]))
						{
							$perms = Permissions::WRITE;
							break;
						}
					}
				}

				if($perms > Permissions::DENY)
				{
					break;
				}
			}

			if (
				$perms <= Permissions::READ
				&& !empty($permsList['SG'])
			) // check open sonet groups
			{
				foreach ($permsList['SG'] as $sonetGroupPermList)
				{
					if (empty($sonetGroupPermList))
					{
						continue;
					}

					foreach ($sonetGroupPermList as $sonetGroupPerm)
					{
						if (!preg_match('/^OSG(d+)_'.(!$userId ? SONET_ROLES_ALL : SONET_ROLES_AUTHORIZED).'$/', $sonetGroupPerm, $matches))
						{
							continue;
						}
						$openedWorkgroupsList[] = (int)$matches[1];
					}
				}

				if (
					!empty($openedWorkgroupsList)
					&& Loader::includeModule('socialnetwork')
					&& BitrixSocialnetworkHelperWorkgroup::checkAnyOpened($openedWorkgroupsList)
				)
				{
					$perms = Permissions::READ;
					$readByOpenSonetGroup = true;
				}
			}

			if (
				isset($params['CHECK_FULL_PERMS'])
				&& $params['CHECK_FULL_PERMS']
				&& $perms < Permissions::FULL
			)
			{
				$sonetGroupIdList = Array();
				if(!empty($permsList["SG"]))
				{
					foreach($permsList["SG"] as $groupId => $val)
					{
						if(!empty($entityList["SG"][$groupId]))
						{
							$sonetGroupIdList[] = $groupId;
						}
					}
				}

				if(!empty($sonetGroupIdList))
				{
					$operationList = array("full_post", "moderate_post", "write_post", "premoderate_post");
					foreach($operationList as $operation)
					{
						if($perms > Permissions::READ)
						{
							break;
						}

						$sonetGroupPermList = CSocNetFeaturesPerms::getOperationPerm(SONET_ENTITY_GROUP, $sonetGroupIdList, "blog", $operation);
						if(is_array($sonetGroupPermList))
						{
							foreach($sonetGroupPermList as $groupId => $role)
							{
								if (in_array($role, $entityList["SG"][$groupId]))
								{
									switch($operation)
									{
										case "full_post":
											$perms = Permissions::FULL;
											break;
										case "moderate_post":
											$perms = Permissions::MODERATE;
											break;
										case "write_post":
											$perms = Permissions::WRITE;
											break;
										case "premoderate_post":
											$perms = Permissions::PREMODERATE;
											break;
									}
								}
							}
						}
					}
				}
			}
		}
	}

	$cache[$cacheId] = $result = [
		'PERM' => $perms,
		'READ_BY_OSG' => $readByOpenSonetGroup,
	];

	return $result;
}

Добавить комментарий