%PDF- %PDF-
| Direktori : /home/bitrix/www/bitrix/modules/socialnetwork/classes/general/ |
| Current File : //home/bitrix/www/bitrix/modules/socialnetwork/classes/general/group_features_perms.php |
<?
IncludeModuleLangFile(__FILE__);
$GLOBALS["arSonetFeaturesPermsCache"] = array();
class CAllSocNetFeaturesPerms
{
/***************************************/
/******** DATA MODIFICATION **********/
/***************************************/
public static function CheckFields($ACTION, &$arFields, $ID = 0)
{
global $APPLICATION, $arSocNetAllowedRolesForFeaturesPerms, $arSocNetAllowedEntityTypes, $arSocNetAllowedRelationsType;
$arSocNetFeaturesSettings = CSocNetAllowed::GetAllowedFeatures();
if ($ACTION != "ADD" && IntVal($ID) <= 0)
{
$APPLICATION->ThrowException("System error 870164", "ERROR");
return false;
}
if ((is_set($arFields, "FEATURE_ID") || $ACTION=="ADD") && IntVal($arFields["FEATURE_ID"]) <= 0)
{
$APPLICATION->ThrowException(GetMessage("SONET_GFP_EMPTY_GROUP_FEATURE_ID"), "EMPTY_FEATURE_ID");
return false;
}
elseif (is_set($arFields, "FEATURE_ID"))
{
$arResult = CSocNetFeatures::GetByID($arFields["FEATURE_ID"]);
if ($arResult == false)
{
$APPLICATION->ThrowException(str_replace("#ID#", $arFields["FEATURE_ID"], GetMessage("SONET_GFP_ERROR_NO_GROUP_FEATURE_ID")), "ERROR_NO_FEATURE_ID");
return false;
}
}
$groupFeature = "";
$groupFeatureType = "";
if ((is_set($arFields, "OPERATION_ID") || $ACTION=="ADD") && StrLen($arFields["OPERATION_ID"]) <= 0)
{
$APPLICATION->ThrowException(GetMessage("SONET_GFP_EMPTY_OPERATION_ID"), "EMPTY_OPERATION_ID");
return false;
}
elseif (is_set($arFields, "OPERATION_ID"))
{
$arFields["OPERATION_ID"] = strtolower($arFields["OPERATION_ID"]);
if (is_set($arFields, "FEATURE_ID"))
{
$arGroupFeature = CSocNetFeatures::GetByID($arFields["FEATURE_ID"]);
if ($arGroupFeature != false)
{
$groupFeature = $arGroupFeature["FEATURE"];
$groupFeatureType = $arGroupFeature["ENTITY_TYPE"];
}
}
elseif ($ACTION != "ADD" && IntVal($ID) > 0)
{
$dbGroupFeature = CSocNetFeaturesPerms::GetList(
array(),
array("ID" => $ID),
false,
false,
array("FEATURE_FEATURE", "FEATURE_ENTITY_TYPE")
);
if ($arGroupFeature = $dbGroupFeature->Fetch())
{
$groupFeature = $arGroupFeature["FEATURE_FEATURE"];
$groupFeatureType = $arGroupFeature["FEATURE_ENTITY_TYPE"];
}
}
if (
StrLen($groupFeature) <= 0
|| !array_key_exists($groupFeature, $arSocNetFeaturesSettings)
)
{
$APPLICATION->ThrowException(GetMessage("SONET_GFP_BAD_OPERATION_ID"), "BAD_OPERATION_ID");
return false;
}
if (!array_key_exists($arFields["OPERATION_ID"], $arSocNetFeaturesSettings[$groupFeature]["operations"]))
{
$APPLICATION->ThrowException(GetMessage("SONET_GFP_NO_OPERATION_ID"), "NO_OPERATION_ID");
return false;
}
}
if ((is_set($arFields, "ROLE") || $ACTION=="ADD") && strlen($arFields["ROLE"]) <= 0)
{
$APPLICATION->ThrowException(GetMessage("SONET_GFP_EMPTY_ROLE"), "EMPTY_ROLE");
return false;
}
elseif (is_set($arFields, "ROLE"))
{
if (StrLen($groupFeatureType) <= 0)
{
if (is_set($arFields, "FEATURE_ID"))
{
$arGroupFeature = CSocNetFeatures::GetByID($arFields["FEATURE_ID"]);
if ($arGroupFeature != false)
{
$groupFeatureType = $arGroupFeature["ENTITY_TYPE"];
}
}
elseif ($ACTION != "ADD" && IntVal($ID) > 0)
{
$dbGroupFeature = CSocNetFeaturesPerms::GetList(
array(),
array("ID" => $ID),
false,
false,
array("FEATURE_FEATURE", "FEATURE_ENTITY_TYPE")
);
if ($arGroupFeature = $dbGroupFeature->Fetch())
{
$groupFeatureType = $arGroupFeature["FEATURE_ENTITY_TYPE"];
}
}
}
if (StrLen($groupFeatureType) <= 0 || !in_array($groupFeatureType, $arSocNetAllowedEntityTypes))
{
$APPLICATION->ThrowException(GetMessage("SONET_GF_EMPTY_ENTITY_TYPE"), "BAD_TYPE");
return false;
}
if ($groupFeatureType == SONET_ENTITY_GROUP)
{
if (!in_array($arFields["ROLE"], $arSocNetAllowedRolesForFeaturesPerms))
{
$APPLICATION->ThrowException(str_replace("#ID#", $arFields["ROLE"], GetMessage("SONET_GFP_ERROR_NO_ROLE")), "ERROR_NO_SITE");
return false;
}
}
else
{
if (!in_array($arFields["ROLE"], $arSocNetAllowedRelationsType))
{
$APPLICATION->ThrowException(str_replace("#ID#", $arFields["ROLE"], GetMessage("SONET_GFP_ERROR_NO_ROLE")), "ERROR_NO_SITE");
return false;
}
elseif($arFields["ROLE"] == SONET_RELATIONS_TYPE_FRIENDS2)
{
$arFields["ROLE"] = SONET_RELATIONS_TYPE_FRIENDS;
}
}
}
return True;
}
public static function Delete($ID)
{
global $DB, $CACHE_MANAGER;
if (!CSocNetGroup::__ValidateID($ID))
return false;
$ID = IntVal($ID);
$bSuccess = True;
$db_events = GetModuleEvents("socialnetwork", "OnBeforeSocNetFeaturesPermsDelete");
while ($arEvent = $db_events->Fetch())
if (ExecuteModuleEventEx($arEvent, array($ID))===false)
return false;
$events = GetModuleEvents("socialnetwork", "OnSocNetFeaturesPermsDelete");
while ($arEvent = $events->Fetch())
ExecuteModuleEventEx($arEvent, array($ID));
if ($bSuccess)
{
$bSuccess = $DB->Query("DELETE FROM b_sonet_features2perms WHERE ID = ".$ID."", true);
if ($bSuccess)
{
if (defined("BX_COMP_MANAGED_CACHE"))
{
$CACHE_MANAGER->ClearByTag("sonet_features2perms_".$ID);
}
else
{
$dbGroupFeaturePerm = CSocNetFeaturesPerms::GetList(
array(),
array("ID" => $ID),
false,
false,
array("FEATURE_ENTITY_TYPE", "FEATURE_ENTITY_ID")
);
if ($arGroupFeaturePerm = $dbGroupFeaturePerm->Fetch())
{
$cache = new CPHPCache;
$cache->CleanDir("/sonet/features_perms/".$arGroupFeaturePerm["FEATURE_ENTITY_TYPE"]."/".intval($arGroupFeaturePerm["FEATURE_ENTITY_ID"] / 1000)."/".$arGroupFeaturePerm["FEATURE_ENTITY_ID"]."/");
}
}
}
}
return $bSuccess;
}
public static function Update($ID, $arFields)
{
global $DB, $CACHE_MANAGER;
if (!CSocNetGroup::__ValidateID($ID))
return false;
$ID = IntVal($ID);
$arFields1 = \Bitrix\Socialnetwork\Util::getEqualityFields($arFields);
if (!CSocNetFeaturesPerms::CheckFields("UPDATE", $arFields, $ID))
return false;
$db_events = GetModuleEvents("socialnetwork", "OnBeforeSocNetFeaturesPermsUpdate");
while ($arEvent = $db_events->Fetch())
{
if (ExecuteModuleEventEx($arEvent, array($ID, $arFields)) === false)
{
return false;
}
}
$strUpdate = $DB->PrepareUpdate("b_sonet_features2perms", $arFields);
\Bitrix\Socialnetwork\Util::processEqualityFieldsToUpdate($arFields1, $strUpdate);
if (strlen($strUpdate) > 0)
{
$strSql =
"UPDATE b_sonet_features2perms SET ".
" ".$strUpdate." ".
"WHERE ID = ".$ID." ";
$DB->Query($strSql, False, "File: ".__FILE__."<br>Line: ".__LINE__);
$events = GetModuleEvents("socialnetwork", "OnSocNetFeaturesPermsUpdate");
while ($arEvent = $events->Fetch())
{
ExecuteModuleEventEx($arEvent, array($ID, $arFields));
}
if (defined("BX_COMP_MANAGED_CACHE"))
{
$CACHE_MANAGER->ClearByTag("sonet_features2perms_".$ID);
}
else
{
$dbGroupFeaturePerm = CSocNetFeaturesPerms::GetList(
array(),
array("ID" => $ID),
false,
false,
array("FEATURE_ENTITY_TYPE", "FEATURE_ENTITY_ID")
);
if ($arGroupFeaturePerm = $dbGroupFeaturePerm->Fetch())
{
$cache = new CPHPCache;
$cache->CleanDir("/sonet/features_perms/".$arGroupFeaturePerm["FEATURE_ENTITY_TYPE"]."/".intval($arGroupFeaturePerm["FEATURE_ENTITY_ID"] / 1000)."/".$arGroupFeaturePerm["FEATURE_ENTITY_ID"]."/");
}
}
}
else
{
$ID = False;
}
return $ID;
}
public static function SetPerm($featureID, $operation, $perm)
{
global $APPLICATION;
$arSocNetFeaturesSettings = CSocNetAllowed::GetAllowedFeatures();
$featureID = IntVal($featureID);
$operation = Trim($operation);
$perm = Trim($perm);
$dbResult = CSocNetFeaturesPerms::GetList(
array(),
array(
"FEATURE_ID" => $featureID,
"OPERATION_ID" => $operation,
),
false,
false,
array("ID", "FEATURE_ENTITY_TYPE", "FEATURE_ENTITY_ID", "FEATURE_FEATURE", "OPERATION_ID", "ROLE")
);
if ($arResult = $dbResult->Fetch())
$r = CSocNetFeaturesPerms::Update($arResult["ID"], array("ROLE" => $perm));
else
$r = CSocNetFeaturesPerms::Add(array("FEATURE_ID" => $featureID, "OPERATION_ID" => $operation, "ROLE" => $perm));
if (!$r)
{
$errorMessage = "";
if ($e = $APPLICATION->GetException())
$errorMessage = $e->GetString();
if (StrLen($errorMessage) <= 0)
$errorMessage = GetMessage("SONET_GF_ERROR_SET").".";
$GLOBALS["APPLICATION"]->ThrowException($errorMessage, "ERROR_SET_RECORD");
return false;
}
else
{
if (!$arResult)
{
$arFeature = CSocNetFeatures::GetByID($featureID);
$entity_type = $arFeature["ENTITY_TYPE"];
$entity_id = $arFeature["ENTITY_ID"];
$feature = $arFeature["FEATURE"];
}
else
{
$entity_type = $arResult["FEATURE_ENTITY_TYPE"];
$entity_id = $arResult["FEATURE_ENTITY_ID"];
$feature = $arResult["FEATURE_FEATURE"];
}
if(empty($arResult) || $arResult["ROLE"] != $perm)
{
CSocNetSearch::SetFeaturePermissions(
$entity_type,
$entity_id,
$feature,
(
$arResult
&& $arResult["ROLE"] != $perm
? $arResult["OPERATION_ID"]
: $operation
),
$perm
);
}
if (
!in_array($feature, array("tasks", "files", "blog"))
&& is_array($arSocNetFeaturesSettings[$feature]["subscribe_events"]))
{
$arEventsTmp = array_keys($arSocNetFeaturesSettings[$feature]["subscribe_events"]);
$rsLog = CSocNetLog::GetList(
array(),
array(
"ENTITY_TYPE" => $entity_type,
"ENTITY_ID" => $entity_id,
"EVENT_ID" => $arEventsTmp
),
false,
false,
array("ID", "EVENT_ID")
);
while($arLog = $rsLog->Fetch())
{
CSocNetLogRights::DeleteByLogID($arLog["ID"]);
CSocNetLogRights::SetForSonet(
$arLog["ID"],
$entity_type,
$entity_id,
$feature,
$arSocNetFeaturesSettings[$feature]["subscribe_events"][$arLog["EVENT_ID"]]["OPERATION"]
);
}
}
}
return $r;
}
/***************************************/
/********** DATA SELECTION ***********/
/***************************************/
public static function GetByID($ID)
{
if (!CSocNetGroup::__ValidateID($ID))
return false;
$ID = IntVal($ID);
$dbResult = CSocNetFeaturesPerms::GetList(Array(), Array("ID" => $ID));
if ($arResult = $dbResult->GetNext())
{
return $arResult;
}
return False;
}
/***************************************/
/********** COMMON METHODS ***********/
/***************************************/
public static function CurrentUserCanPerformOperation($type, $id, $feature, $operation, $site_id = SITE_ID)
{
$userID = 0;
if (is_object($GLOBALS["USER"]) && $GLOBALS["USER"]->IsAuthorized())
$userID = IntVal($GLOBALS["USER"]->GetID());
$bCurrentUserIsAdmin = CSocNetUser::IsCurrentUserModuleAdmin($site_id);
return CSocNetFeaturesPerms::CanPerformOperation($userID, $type, $id, $feature, $operation, $bCurrentUserIsAdmin);
}
public static function CanPerformOperation($userID, $type, $id, $feature, $operation, $bCurrentUserIsAdmin = false)
{
global $arSocNetAllowedEntityTypes;
$arSocNetFeaturesSettings = CSocNetAllowed::GetAllowedFeatures();
$userID = IntVal($userID);
if ((is_array($id) && count($id) <= 0) || (!is_array($id) && $id <= 0))
{
$GLOBALS["APPLICATION"]->ThrowException(GetMessage("SONET_GF_EMPTY_ENTITY_ID"), "ERROR_EMPTY_ENTITY_ID");
return false;
}
$type = Trim($type);
if ((StrLen($type) <= 0) || !in_array($type, $arSocNetAllowedEntityTypes))
{
$GLOBALS["APPLICATION"]->ThrowException(GetMessage("SONET_GF_ERROR_NO_ENTITY_TYPE"), "ERROR_EMPTY_TYPE");
return false;
}
$featureOperationPerms = CSocNetFeaturesPerms::GetOperationPerm($type, $id, $feature, $operation);
if ($type == SONET_ENTITY_GROUP)
{
$bWorkWithClosedGroups = (COption::GetOptionString("socialnetwork", "work_with_closed_groups", "N") == "Y");
if (is_array($id))
{
$arGroupToGet = array();
foreach($id as $group_id)
{
if ($featureOperationPerms[$group_id] == false)
{
$arReturn[$group_id] = false;
}
else
{
$arGroupToGet[] = $group_id;
}
}
$arGroupToGet = array_unique($arGroupToGet);
$userRoleInGroup = CSocNetUserToGroup::GetUserRole($userID, $arGroupToGet);
$arGroupToGet = array();
if (is_array($userRoleInGroup))
{
foreach($userRoleInGroup as $group_id => $role)
{
if ($userRoleInGroup[$group_id] == SONET_ROLES_BAN)
{
$arReturn[$group_id] = false;
}
else
{
$arGroupToGet[] = $group_id;
}
}
}
$arGroupToGet = array_unique($arGroupToGet);
if (
(is_array($arGroupToGet) && count($arGroupToGet) <= 0)
|| (!is_array($arGroupToGet) && intval($arGroupToGet) <= 0)
)
{
$arReturn = array();
foreach($id as $group_id)
{
$arReturn[$group_id] = false;
}
return $arReturn;
}
$resGroupTmp = CSocNetGroup::GetList(
array("ID" => "ASC"),
array("@ID" => $arGroupToGet),
false,
false,
array('ID', 'VISIBLE', 'CLOSED')
);
while ($arGroupTmp = $resGroupTmp->Fetch())
{
if (
$arGroupTmp["CLOSED"] == "Y"
&& !in_array($operation, $arSocNetFeaturesSettings[$feature]["minoperation"])
)
{
if (!$bWorkWithClosedGroups)
{
$arReturn[$arGroupTmp["ID"]] = false;
continue;
}
else
{
$featureOperationPerms[$arGroupTmp["ID"]] = SONET_ROLES_OWNER;
}
}
if ($bCurrentUserIsAdmin)
{
$arReturn[$arGroupTmp["ID"]] = true;
continue;
}
if ($featureOperationPerms[$arGroupTmp["ID"]] == SONET_ROLES_ALL)
{
if ($arGroupTmp["VISIBLE"] == "N")
{
$featureOperationPerms[$arGroupTmp["ID"]] = SONET_ROLES_USER;
}
else
{
$arReturn[$arGroupTmp["ID"]] = true;
continue;
}
}
if ($featureOperationPerms[$arGroupTmp["ID"]] == SONET_ROLES_AUTHORIZED)
{
if ($userID > 0)
{
$arReturn[$arGroupTmp["ID"]] = true;
continue;
}
else
{
$arReturn[$arGroupTmp["ID"]] = false;
continue;
}
}
if ($userRoleInGroup[$arGroupTmp["ID"]] == false)
{
$arReturn[$arGroupTmp["ID"]] = false;
continue;
}
if ($featureOperationPerms[$arGroupTmp["ID"]] == SONET_ROLES_MODERATOR)
{
if ($userRoleInGroup[$arGroupTmp["ID"]] == SONET_ROLES_MODERATOR || $userRoleInGroup[$arGroupTmp["ID"]] == SONET_ROLES_OWNER)
{
$arReturn[$arGroupTmp["ID"]] = true;
continue;
}
else
{
$arReturn[$arGroupTmp["ID"]] = false;
continue;
}
}
elseif ($featureOperationPerms[$arGroupTmp["ID"]] == SONET_ROLES_USER)
{
if ($userRoleInGroup[$arGroupTmp["ID"]] == SONET_ROLES_MODERATOR || $userRoleInGroup[$arGroupTmp["ID"]] == SONET_ROLES_OWNER || $userRoleInGroup[$arGroupTmp["ID"]] == SONET_ROLES_USER)
{
$arReturn[$arGroupTmp["ID"]] = true;
continue;
}
else
{
$arReturn[$arGroupTmp["ID"]] = false;
continue;
}
}
elseif ($featureOperationPerms[$arGroupTmp["ID"]] == SONET_ROLES_OWNER)
{
if ($userRoleInGroup[$arGroupTmp["ID"]] == SONET_ROLES_OWNER)
{
$arReturn[$arGroupTmp["ID"]] = true;
continue;
}
else
{
$arReturn[$arGroupTmp["ID"]] = false;
continue;
}
}
}
return $arReturn;
}
else // not array of groups
{
$id = IntVal($id);
if ($featureOperationPerms == false)
{
return false;
}
$userRoleInGroup = CSocNetUserToGroup::GetUserRole($userID, $id);
if ($userRoleInGroup == SONET_ROLES_BAN)
{
return false;
}
$arGroupTmp = CSocNetGroup::GetByID($id);
if (
$arGroupTmp["CLOSED"] == "Y"
&& !in_array($operation, $arSocNetFeaturesSettings[$feature]["minoperation"])
)
{
if (!$bWorkWithClosedGroups)
{
return false;
}
else
{
$featureOperationPerms = SONET_ROLES_OWNER;
}
}
if ($bCurrentUserIsAdmin)
{
return true;
}
if ($featureOperationPerms == SONET_ROLES_ALL)
{
if ($arGroupTmp["VISIBLE"] == "N")
{
$featureOperationPerms = SONET_ROLES_USER;
}
else
{
return true;
}
}
if ($featureOperationPerms == SONET_ROLES_AUTHORIZED)
{
return ($userID > 0);
}
if ($userRoleInGroup == false)
{
return false;
}
if ($featureOperationPerms == SONET_ROLES_MODERATOR)
{
return (in_array($userRoleInGroup, array(SONET_ROLES_MODERATOR, SONET_ROLES_OWNER)));
}
elseif ($featureOperationPerms == SONET_ROLES_USER)
{
return (in_array($userRoleInGroup, array(SONET_ROLES_MODERATOR, SONET_ROLES_OWNER, SONET_ROLES_USER)));
}
elseif ($featureOperationPerms == SONET_ROLES_OWNER)
{
return ($userRoleInGroup == SONET_ROLES_OWNER);
}
}
}
else // user
{
if (is_array($id))
{
foreach($id as $entity_id)
{
if ($featureOperationPerms[$entity_id] == false)
{
$arReturn[$entity_id] = false;
continue;
}
$usersRelation = CSocNetUserRelations::GetRelation($userID, $entity_id);
if ($type == SONET_ENTITY_USER && $userID == $entity_id)
{
$arReturn[$entity_id] = true;
continue;
}
if ($bCurrentUserIsAdmin)
{
$arReturn[$entity_id] = true;
continue;
}
if ($userID == $entity_id)
{
$arReturn[$entity_id] = true;
continue;
}
if ($usersRelation == SONET_RELATIONS_BAN)
{
if (!IsModuleInstalled("im"))
{
$arReturn[$entity_id] = false;
continue;
}
}
if ($featureOperationPerms[$entity_id] == SONET_RELATIONS_TYPE_NONE)
{
$arReturn[$entity_id] = false;
continue;
}
if ($featureOperationPerms[$entity_id] == SONET_RELATIONS_TYPE_ALL)
{
$arReturn[$entity_id] = true;
continue;
}
if ($featureOperationPerms[$entity_id] == SONET_RELATIONS_TYPE_AUTHORIZED)
{
$arReturn[$entity_id] = ($userID > 0);
continue;
}
if (
$featureOperationPerms[$entity_id] == SONET_RELATIONS_TYPE_FRIENDS
|| $featureOperationPerms[$entity_id] == SONET_RELATIONS_TYPE_FRIENDS2
)
{
$arReturn[$entity_id] = CSocNetUserRelations::IsFriends($userID, $entity_id);
continue;
}
}
return $arReturn;
}
else // not array
{
if ($featureOperationPerms == false)
return false;
if ($type == SONET_ENTITY_USER && $userID == $id)
return true;
if ($bCurrentUserIsAdmin)
return true;
if ($userID == $id)
return true;
$usersRelation = CSocNetUserRelations::GetRelation($userID, $id);
if ($usersRelation == SONET_RELATIONS_BAN && !IsModuleInstalled("im"))
return false;
if ($featureOperationPerms == SONET_RELATIONS_TYPE_NONE)
return false;
if ($featureOperationPerms == SONET_RELATIONS_TYPE_ALL)
return true;
if ($featureOperationPerms == SONET_RELATIONS_TYPE_AUTHORIZED)
{
return ($userID > 0);
}
if (
$featureOperationPerms == SONET_RELATIONS_TYPE_FRIENDS
|| $featureOperationPerms == SONET_RELATIONS_TYPE_FRIENDS2
)
{
return CSocNetUserRelations::IsFriends($userID, $id);
}
}
}
return false;
}
public static function GetOperationPerm($type, $id, $feature, $operation)
{
global $arSocNetAllowedEntityTypes, $APPLICATION, $CACHE_MANAGER;
static $arSonetGroupCache = array();
$arSocNetFeaturesSettings = CSocNetAllowed::GetAllowedFeatures();
$type = Trim($type);
if (
(strlen($type) <= 0)
|| !in_array($type, $arSocNetAllowedEntityTypes)
)
{
$APPLICATION->ThrowException(GetMessage("SONET_GF_ERROR_NO_ENTITY_TYPE"), "ERROR_EMPTY_TYPE");
if (is_array($id))
{
$arReturn = array();
foreach($id as $TmpGroupID)
{
$arReturn[$TmpGroupID] = false;
}
return $arReturn;
}
else
{
return false;
}
}
$feature = strtolower(trim($feature));
if (strlen($feature) <= 0)
{
$APPLICATION->ThrowException(GetMessage("SONET_GF_EMPTY_FEATURE_ID"), "ERROR_EMPTY_FEATURE_ID");
if (is_array($id))
{
$arReturn = array();
foreach($id as $TmpGroupID)
{
$arReturn[$TmpGroupID] = false;
}
return $arReturn;
}
else
{
return false;
}
}
if (
!array_key_exists($feature, $arSocNetFeaturesSettings)
|| !array_key_exists("allowed", $arSocNetFeaturesSettings[$feature])
|| !in_array($type, $arSocNetFeaturesSettings[$feature]["allowed"])
)
{
$APPLICATION->ThrowException(GetMessage("SONET_GF_ERROR_NO_FEATURE_ID"), "ERROR_NO_FEATURE_ID");
if (is_array($id))
{
$arReturn = array();
foreach($id as $TmpGroupID)
{
$arReturn[$TmpGroupID] = false;
}
return $arReturn;
}
else
{
return false;
}
}
$operation = StrToLower(Trim($operation));
if (
!array_key_exists("operations", $arSocNetFeaturesSettings[$feature])
|| !array_key_exists($operation, $arSocNetFeaturesSettings[$feature]["operations"])
)
{
if (is_array($id))
{
$arReturn = array();
foreach($id as $TmpGroupID)
{
$arReturn[$TmpGroupID] = false;
}
return $arReturn;
}
else
{
return false;
}
}
global $arSonetFeaturesPermsCache;
if (!isset($arSonetFeaturesPermsCache) || !is_array($arSonetFeaturesPermsCache))
{
$arSonetFeaturesPermsCache = array();
}
if (is_array($id))
{
$arFeaturesPerms = array();
$arGroupToGet = array();
foreach($id as $TmpGroupID)
{
$arFeaturesPerms[$TmpGroupID] = array();
if (!array_key_exists($type."_".$TmpGroupID, $arSonetFeaturesPermsCache))
{
$arGroupToGet[] = $TmpGroupID;
}
else
{
$arFeaturesPerms[$TmpGroupID] = $arSonetFeaturesPermsCache[$type."_".$TmpGroupID];
}
}
$arGroupToGet = array_unique($arGroupToGet);
if (!empty($arGroupToGet))
{
$rsSonetGroup = CSocNetGroup::GetList(
array(),
array('@ID' => $arGroupToGet),
false,
false,
array('ID', 'VISIBLE', 'OPENED')
);
while ($arSonetGroup = $rsSonetGroup->Fetch())
{
if (!isset($arSonetGroupCache[$arSonetGroup['ID']]))
{
$arSonetGroupCache[$arSonetGroup['ID']] = array(
'VISIBLE' => $arSonetGroup['VISIBLE'],
'OPENED' => $arSonetGroup['OPENED']
);
}
}
$dbResult = CSocNetFeaturesPerms::GetList(
Array(),
Array(
"@FEATURE_ENTITY_ID" => $arGroupToGet,
"FEATURE_ENTITY_TYPE" => $type,
"FEATURE_ACTIVE" => "Y"
),
false,
false,
array("OPERATION_ID", "FEATURE_ENTITY_ID", "FEATURE_FEATURE", "ROLE")
);
while ($arResult = $dbResult->Fetch())
{
if (
!array_key_exists($arResult["FEATURE_ENTITY_ID"], $arFeaturesPerms)
|| !array_key_exists($arResult["FEATURE_FEATURE"], $arFeaturesPerms[$arResult["FEATURE_ENTITY_ID"]])
)
{
$arFeaturesPerms[$arResult["FEATURE_ENTITY_ID"]][$arResult["FEATURE_FEATURE"]] = array();
}
$arFeaturesPerms[$arResult["FEATURE_ENTITY_ID"]][$arResult["FEATURE_FEATURE"]][$arResult["OPERATION_ID"]] = $arResult["ROLE"];
}
}
$arReturn = array();
foreach($id as $TmpEntityID)
{
$arSonetFeaturesPermsCache[$type."_".$TmpEntityID] = $arFeaturesPerms[$TmpEntityID];
if ($type == SONET_ENTITY_GROUP)
{
if (
!array_key_exists($feature, $arFeaturesPerms[$TmpEntityID])
|| !array_key_exists($operation, $arFeaturesPerms[$TmpEntityID][$feature])
)
{
$perm = $arSocNetFeaturesSettings[$feature]["operations"][$operation][SONET_ENTITY_GROUP];
if (
isset($arSonetGroupCache[$TmpEntityID])
&& $arSonetGroupCache[$TmpEntityID]['OPENED'] == 'Y'
&& $arSonetGroupCache[$TmpEntityID]['VISIBLE'] == 'Y'
// && in_array($feature, array("blog", "tasks", "photo"))
&& in_array($feature, array("blog"))
&& ($perm == SONET_ROLES_USER)
&& !empty($arSocNetFeaturesSettings[$feature]["minoperation"])
&& (
(
is_array($arSocNetFeaturesSettings[$feature]["minoperation"])
&& in_array($operation, $arSocNetFeaturesSettings[$feature]["minoperation"])
)
|| (
!is_array($arSocNetFeaturesSettings[$feature]["minoperation"])
&& $operation == $arSocNetFeaturesSettings[$feature]["minoperation"]
)
)
)
{
$featureOperationPerms = SONET_ROLES_AUTHORIZED;
}
else
{
$featureOperationPerms = $perm;
}
}
else
{
$featureOperationPerms = $arFeaturesPerms[$TmpEntityID][$feature][$operation];
}
}
else
{
if (!array_key_exists($feature, $arFeaturesPerms[$TmpEntityID]))
{
$featureOperationPerms = $arSocNetFeaturesSettings[$feature]["operations"][$operation][SONET_ENTITY_USER];
}
elseif (!array_key_exists($operation, $arFeaturesPerms[$TmpEntityID][$feature]))
{
$featureOperationPerms = $arSocNetFeaturesSettings[$feature]["operations"][$operation][SONET_ENTITY_USER];
}
else
{
$featureOperationPerms = $arFeaturesPerms[$TmpEntityID][$feature][$operation];
}
if ($featureOperationPerms == SONET_RELATIONS_TYPE_FRIENDS2)
{
$featureOperationPerms = SONET_RELATIONS_TYPE_FRIENDS;
}
}
$arReturn[$TmpEntityID] = $featureOperationPerms;
}
return $arReturn;
}
else // not array
{
$id = IntVal($id);
if ($id <= 0)
{
$APPLICATION->ThrowException(GetMessage("SONET_GF_EMPTY_ENTITY_ID"), "ERROR_EMPTY_ENTITY_ID");
return false;
}
$arFeaturesPerms = array();
if (array_key_exists($type."_".$id, $arSonetFeaturesPermsCache))
{
$arFeaturesPerms = $arSonetFeaturesPermsCache[$type."_".$id];
}
else
{
$cache = new CPHPCache;
$cache_time = 31536000;
$cache_id = "entity_"."_".$type."_".$id;
$cache_path = "/sonet/features_perms/".$type."/".intval($id / 1000)."/".$id."/";
$arTmp = array();
if ($cache->InitCache($cache_time, $cache_id, $cache_path))
{
$arCacheVars = $cache->GetVars();
$arTmp = $arCacheVars["RESULT"];
}
else
{
$cache->StartDataCache($cache_time, $cache_id, $cache_path);
if (defined("BX_COMP_MANAGED_CACHE"))
{
$CACHE_MANAGER->StartTagCache($cache_path);
}
$dbResult = CSocNetFeaturesPerms::GetList(
Array(),
Array(
"FEATURE_ENTITY_ID" => $id,
"FEATURE_ENTITY_TYPE" => $type,
"FEATURE_ACTIVE" => "Y"
),
false,
false,
array("ID", "OPERATION_ID", "FEATURE_ID", "FEATURE_FEATURE", "ROLE")
);
while ($arResult = $dbResult->Fetch())
{
if (defined("BX_COMP_MANAGED_CACHE"))
{
$CACHE_MANAGER->RegisterTag("sonet_features2perms_".$arResult["ID"]);
}
$arTmp[] = $arResult;
}
if (defined("BX_COMP_MANAGED_CACHE"))
{
$dbResult = CSocNetFeatures::GetList(
Array(),
Array("ENTITY_ID" => $id, "ENTITY_TYPE" => $type),
false,
false,
array("ID")
);
while ($arResult = $dbResult->Fetch())
{
$CACHE_MANAGER->RegisterTag("sonet_feature_".$arResult["ID"]);
}
}
if (defined("BX_COMP_MANAGED_CACHE"))
{
if ($type == SONET_ENTITY_GROUP)
{
$CACHE_MANAGER->RegisterTag("sonet_group_".$id);
$CACHE_MANAGER->RegisterTag("sonet_group");
}
elseif ($type == SONET_ENTITY_USER)
{
$CACHE_MANAGER->RegisterTag("USER_CARD_".intval($id / TAGGED_user_card_size));
}
$CACHE_MANAGER->RegisterTag("sonet_features_".$type."_".$id);
}
$arCacheData = Array(
"RESULT" => $arTmp
);
if(defined("BX_COMP_MANAGED_CACHE"))
{
$CACHE_MANAGER->EndTagCache();
}
$cache->EndDataCache($arCacheData);
}
foreach($arTmp as $arResult)
{
if (!array_key_exists($arResult["FEATURE_FEATURE"], $arFeaturesPerms))
{
$arFeaturesPerms[$arResult["FEATURE_FEATURE"]] = array();
}
$arFeaturesPerms[$arResult["FEATURE_FEATURE"]][$arResult["OPERATION_ID"]] = $arResult["ROLE"];
}
$arSonetFeaturesPermsCache[$type."_".$id] = $arFeaturesPerms;
}
if ($type == SONET_ENTITY_GROUP)
{
if (
!array_key_exists($feature, $arFeaturesPerms)
|| !array_key_exists($operation, $arFeaturesPerms[$feature])
)
{
if (
!isset($arSonetGroupCache[$id])
&& ($arSonetGroup = CSocNetGroup::GetByID($id))
)
{
$arSonetGroupCache[$id] = array(
'OPENED' => $arSonetGroup['OPENED'],
'VISIBLE' => $arSonetGroup['VISIBLE']
);
}
$perm = $arSocNetFeaturesSettings[$feature]["operations"][$operation][SONET_ENTITY_GROUP];
if (
isset($arSonetGroupCache[$id])
&& $arSonetGroupCache[$id]['OPENED'] == 'Y'
&& $arSonetGroupCache[$id]['VISIBLE'] == 'Y'
// && in_array($feature, array("blog", "tasks", "photo"))
&& in_array($feature, array("blog"))
&& ($perm == SONET_ROLES_USER)
&& !empty($arSocNetFeaturesSettings[$feature]["minoperation"])
&& (
(
is_array($arSocNetFeaturesSettings[$feature]["minoperation"])
&& in_array($operation, $arSocNetFeaturesSettings[$feature]["minoperation"])
)
|| (
!is_array($arSocNetFeaturesSettings[$feature]["minoperation"])
&& $operation == $arSocNetFeaturesSettings[$feature]["minoperation"]
)
)
)
{
$featureOperationPerms = SONET_ROLES_AUTHORIZED;
}
else
{
$featureOperationPerms = $perm;
}
}
else
{
$featureOperationPerms = $arFeaturesPerms[$feature][$operation];
}
}
else
{
if (!array_key_exists($feature, $arFeaturesPerms))
{
$featureOperationPerms = $arSocNetFeaturesSettings[$feature]["operations"][$operation][SONET_ENTITY_USER];
}
elseif (!array_key_exists($operation, $arFeaturesPerms[$feature]))
{
$featureOperationPerms = $arSocNetFeaturesSettings[$feature]["operations"][$operation][SONET_ENTITY_USER];
}
else
{
$featureOperationPerms = $arFeaturesPerms[$feature][$operation];
}
if ($featureOperationPerms == SONET_RELATIONS_TYPE_FRIENDS2)
{
$featureOperationPerms = SONET_RELATIONS_TYPE_FRIENDS;
}
}
return $featureOperationPerms;
}
}
}