$documentType = explode("_", $_REQUEST["DOCUMENT_ID"]); $arParams = array(); $arParams["IBLOCK_ID"] = $IBLOCK_ID = intval($documentType[1]); $object = trim($documentType[2]); $object_id = intval($documentType[3]); $popupWindow = new CJSPopup('', ''); if (!CModule::IncludeModule("iblock")) { $popupWindow->ShowError(GetMessage("SONET_IB_MODULE_IS_NOT_INSTALLED")); } elseif (!CModule::IncludeModule("webdav")) { $popupWindow->ShowError(GetMessage("SONET_WD_MODULE_IS_NOT_INSTALLED")); } elseif ($IBLOCK_ID <= 0) { $popupWindow->ShowError(GetMessage("SONET_IBLOCK_ID_EMPTY")); } elseif ($object_id <= 0 && ($object != "user" && $object != "group")) { $popupWindow->ShowError(GetMessage("SONET_GROUP_NOT_EXISTS")); } $res = CIBlockWebdavSocnet::GetUserMaxPermission($object, $object_id, $USER->GetID(), $IBLOCK_ID); $arParams["PERMISSION"] = $res["PERMISSION"]; $arParams["CHECK_CREATOR"] = $res["CHECK_CREATOR"]; if ($arParams["PERMISSION"] < "W" || $arParams["CHECK_CREATOR"] == "Y") { $popupWindow->ShowError($object == "user" ? GetMessage("SONET_USER_FILES_ACCESS_DENIED") : GetMessage("SONET_GROUP_FILES_ACCESS_DENIED")); } $arFilter = array("IBLOCK_ID" => $arParams["IBLOCK_ID"], "SOCNET_GROUP_ID" => false, "CHECK_PERMISSIONS" => "N", "SECTION_ID" => 0); if ($object == "user") { $arFilter["CREATED_BY"] = $object_id; } else { $arFilter["SOCNET_GROUP_ID"] = $object_id; } $arLibrary = array(); $db_res = CIBlockSection::GetList(array(), $arFilter, false, array("ID", "UF_USE_BP", 'UF_USE_EXT_SERVICES')); if (!($db_res && ($arLibrary = $db_res->GetNext()))) { $popupWindow->ShowError(GetMessage("SONET_WEBDAV_NOT_EXISTS"));
/** * Метод проверяет права на выполнение операций над документами заданного типа. Проверяются операции 4 - право изменять шаблоны рабочий потоков для данного типа документа. * * @param int $operation - операция. * @param int $userId - код пользователя, для которого проверяется право на выполнение операции. * @param string $documentId - код типа документа, к которому применяется операция. * @param array $arParameters - ассициативный массив вспомогательных параметров. Используется для того, чтобы не рассчитывать заново те вычисляемые значения, которые уже известны на момент вызова метода. Стандартными являются ключи массива DocumentStates - массив состояний рабочих потоков данного документа, WorkflowId - код рабочего потока (если требуется проверить операцию на одном рабочем потоке). Массив может быть дополнен другими произвольными ключами. * @return bool */ function CanUserOperateDocumentType($operation, $userId, $documentType, $arParameters = array()) { $documentType = trim($documentType); if (strlen($documentType) <= 0) { return false; } if ($storage = self::needProxyToDiskByDocType($documentType)) { return self::proxyToDisk(__FUNCTION__, array($operation, $userId, \Bitrix\Disk\BizProcDocumentCompatible::generateDocumentType($storage->getId()), $arParameters)); } $userId = intval($userId); global $USER; // Если пользователь является администратором модуля соц. сети, то возвращаем true if ($USER->IsAuthorized() && $USER->GetID() == $userId && CSocNetUser::IsCurrentUserModuleAdmin()) { return true; } $res = explode("_", $documentType); if (count($res) != 4) { return false; } $arParameters["IBlockId"] = intval($res[1]); $arParameters["OwnerType"] = $res[2]; $arParameters["OwnerId"] = intval($res[3]); // Если нет необходимых параметров, то возвращаем false if (!in_array($arParameters["OwnerType"], array("user", "group")) || $arParameters["OwnerId"] <= 0 || $arParameters["IBlockId"] <= 0) { return false; } elseif ($arParameters["OwnerType"] == "user" && $arParameters["OwnerId"] == $userId) { return true; } // Если нам явно не сказали, то узнаем права пользователя на хранилище if (!array_key_exists("IBlockPermission", $arParameters)) { $res = CIBlockWebdavSocnet::GetUserMaxPermission($arParameters["OwnerType"], $arParameters["OwnerId"], $userId, $arParameters["IBlockId"]); $arParameters["IBlockPermission"] = $res["PERMISSION"]; } if ($arParameters["IBlockPermission"] < "R") { return false; } elseif ($arParameters["IBlockPermission"] >= "W") { return true; } // Если мы тут, то инфоблочные права равны U // Если нам явно не сказали, то узнаем группы пользователя if (!array_key_exists("AllUserGroups", $arParameters)) { $arParameters["AllUserGroups"] = CIBlockDocumentWebdavSocnet::GetUserGroups($documentType, null, $userId); } // Если нам явно не сказали, то узнаем текущие статусы документа if (!array_key_exists("DocumentStates", $arParameters)) { $arParameters["DocumentStates"] = CBPDocument::GetDocumentStates(array("webdav", "CIBlockDocumentWebdavSocnet", "x"), null); } // Если нужно проверить только для одного рабочего потока if (array_key_exists("WorkflowId", $arParameters)) { if (array_key_exists($arParameters["WorkflowId"], $arParameters["DocumentStates"])) { $arParameters["DocumentStates"] = array($arParameters["WorkflowId"] => $arParameters["DocumentStates"][$arParameters["WorkflowId"]]); } else { return false; } } $arAllowableOperations = CBPDocument::GetAllowableOperations($userId, $arParameters["AllUserGroups"], $arParameters["DocumentStates"]); // $arAllowableOperations == null - поток не является автоматом // $arAllowableOperations == array() - в автомате нет допустимых операций // $arAllowableOperations == array("read", ...) - допустимые операции if (!is_array($arAllowableOperations)) { return false; } $r = false; switch ($operation) { case CBPCanUserOperateOperation::ViewWorkflow: $r = false; break; case CBPCanUserOperateOperation::StartWorkflow: $r = false; break; case CBPCanUserOperateOperation::CreateWorkflow: $r = in_array("write", $arAllowableOperations); break; case CBPCanUserOperateOperation::WriteDocument: $r = in_array("write", $arAllowableOperations); break; case CBPCanUserOperateOperation::ReadDocument: $r = false; break; default: $r = false; } return $r; }
$arParams['USE_AUTH'] = $arParams['FILES_USE_AUTH'] == "Y" ? "Y" : "N"; $arParams["NAME_FILE_PROPERTY"] = strToupper(trim(empty($arParams["FILE_NAME_FILE_PROPERTY"]) ? "FILE" : $arParams["FILE_NAME_FILE_PROPERTY"])); $arParams["FILES_PATH_TO_SMILE"] = !empty($arParams["PATH_TO_FORUM_SMILE"]) ? $arParams["PATH_TO_FORUM_SMILE"] : "/bitrix/images/forum/smile/"; $arResult['BASE_URL'] = $object == "user" ? $arParams["FILES_USER_BASE_URL"] : $arParams["FILES_GROUP_BASE_URL"]; if ($arParams["SEF_MODE"] == "Y") { $arResult['BASE_URL'] = $object == "user" ? $arResult["PATH_TO_USER_FILES"] : $arResult["PATH_TO_GROUP_FILES"]; } $arResult['BASE_URL'] = rtrim(str_replace(array("#user_id#", "#group_id#", "#path#"), array($arResult["VARIABLES"]["user_id"], $arResult["VARIABLES"]["group_id"], ""), $arResult['BASE_URL']), '/'); /***************** ADDITIONAL **************************************/ $arParams["SET_NAV_CHAIN"] = $arParams["SET_NAV_CHAIN"] == "N" ? "N" : "Y"; if ($object == 'user') { CIBlockWebdavSocnet::UserERights($arParams['IBLOCK_ID']); } elseif ($object == 'group') { CIBlockWebdavSocnet::GroupERights($arParams['IBLOCK_ID']); } $res = CIBlockWebdavSocnet::GetUserMaxPermission($object, $object == "user" ? $arResult["VARIABLES"]["user_id"] : $arResult["VARIABLES"]["group_id"], $USER->GetID(), $arParams['IBLOCK_ID']); $arParams["PERMISSION"] = $res["PERMISSION"]; $arParams["CHECK_CREATOR"] = $res["CHECK_CREATOR"]; $arParams["STR_TITLE"] = GetMessage("SONET_FILES"); $arParams["SHOW_WEBDAV"] = "Y"; /******************************************************************** /Input params ********************************************************************/ $arError = array(); /******************************************************************** Check Socnet Permission and Main Data ********************************************************************/ /************** Can View *******************************************/ if ($arParams["PERMISSION"] < "R") { $arError[] = array("id" => "access_denied", "text" => GetMessage("SONET_ACCESS_DENIED")); /************** Active Feature *************************************/
// user list $userTree = array(); $CACHE_ID = SITE_ID . '|' . $requestURL . '|' . $currentUserID . '|' . (CWebDavBase::IsDavHeaders('check_all') ? 'D' : 'W') . '|USERLIST'; $userCache = new CPHPCache(); if ($userCache->InitCache($arParams["CACHE_TIME"], $CACHE_ID, $cachePath)) { $vars = $userCache->GetVars(); $userTree = $vars['USER_TREE']; } else { $arFilter = array("IBLOCK_ID" => $arParams["IBLOCK_USER_ID"], "SOCNET_GROUP_ID" => false, "CHECK_PERMISSIONS" => "N", "SECTION_ID" => 0); $dbSection = CIBlockSection::GetList(array(), $arFilter); while ($arSection = $dbSection->Fetch()) { $userID = $arSection['CREATED_BY']; if (!CSocNetFeatures::IsActiveFeature(SONET_ENTITY_USER, $userID, "files")) { continue; } $userPerms = CIBlockWebdavSocnet::GetUserMaxPermission('user', $userID, $currentUserID, $arParams['IBLOCK_USER_ID']); if ($userPerms["PERMISSION"] < "R") { continue; } $dbUser = CUser::GetByID($userID); if ($dbUser && ($arUser = $dbUser->Fetch())) { if ($arUser['ACTIVE'] != 'Y') { continue; } } if (empty($arUser)) { continue; } $iDocCount = $USER->IsAdmin() ? _getIBlockItemsCount($arParams["IBLOCK_USER_ID"], $arSection["ID"], 'user', $userID) : false; //if ($iDocCount <= 0) continue; $tpl = preg_replace(array("/#NOBR#/", "/#\\/NOBR#/"), array("", ""), $arParams['NAME_TEMPLATE']);