Esempio n. 1
0
    ShowError(GetMessage("WD_ERROR_ELEMENT_NOT_FOUND"));
    return 0;
} elseif ($arParams["CHECK_CREATOR"] == "Y" && $res["CREATED_BY"] != $GLOBALS['USER']->GetId()) {
    ShowError(GetMessage("WD_ACCESS_DENIED"));
    return 0;
}
$res["FILE_EXTENTION"] = strtolower(strrchr($res['NAME'], '.'));
$res["~WF_STATUS_TITLE"] = CIBlockElement::WF_GetStatusTitle($res["WF_STATUS_ID"]);
$res["WF_STATUS_TITLE"] = htmlspecialcharsEx($res["~WF_STATUS_TITLE"]);
/************** Paths **********************************************/
$res["URL"] = array("DOWNLOAD" => CComponentEngine::MakePathFromTemplate($arParams["ELEMENT_HISTORY_GET_URL"], array("ELEMENT_ID" => $res["ID"], "ELEMENT_NAME" => $res["ELEMENT_NAME"])), "~DOWNLOAD" => CComponentEngine::MakePathFromTemplate($arParams["~ELEMENT_HISTORY_GET_URL"], array("ELEMENT_ID" => $res["ID"], "ELEMENT_NAME" => $res["ELEMENT_NAME"])), "VIEW" => CComponentEngine::MakePathFromTemplate($arParams["ELEMENT_URL"], array("ELEMENT_ID" => $res["ID"], "ELEMENT_NAME" => $res["ELEMENT_NAME"])), "~VIEW" => CComponentEngine::MakePathFromTemplate($arParams["~ELEMENT_URL"], array("ELEMENT_ID" => $res["ID"], "ELEMENT_NAME" => $res["ELEMENT_NAME"])), "EDIT" => CComponentEngine::MakePathFromTemplate($arParams["ELEMENT_EDIT_URL"], array("ELEMENT_ID" => $res["ID"], "ACTION" => "EDIT")), "~EDIT" => CComponentEngine::MakePathFromTemplate($arParams["~ELEMENT_EDIT_URL"], array("ELEMENT_ID" => $res["ID"], "ACTION" => "EDIT")), "DELETE" => CComponentEngine::MakePathFromTemplate($arParams["ELEMENT_EDIT_URL"], array("ELEMENT_ID" => $res["ID"], "ACTION" => "DELETE")), "~DELETE" => CComponentEngine::MakePathFromTemplate($arParams["~ELEMENT_EDIT_URL"], array("ELEMENT_ID" => $res["ID"], "ACTION" => "DELETE")));
$res["URL"]["DELETE"] = WDAddPageParams($res["URL"]["DELETE"], array("edit" => "y", "sessid" => bitrix_sessid(), 'back_url' => urlencode($APPLICATION->GetCurPageParam())));
$res["URL"]["~DELETE"] = WDAddPageParams($res["URL"]["~DELETE"], array("edit" => "y", "sessid" => bitrix_sessid(), 'back_url' => urlencode($APPLICATION->GetCurPageParam())));
/************** Permission *****************************************/
$arResult["ELEMENT"] = $res;
$arResult["ELEMENT"]["PERMISSION"] = CIBlockDocumentWebdav::GetIBRights('ELEMENT', $arParams["IBLOCK_ID"], $arParams["ELEMENT_ID"]);
if (CWebDavIblock::CheckRight($arResult["ELEMENT"]["PERMISSION"], "element_read") < "R") {
    ShowError(GetMessage("WD_ACCESS_DENIED"));
    return 0;
}
$res = array("UNLOCK" => "N", "EDIT" => CWebDavIblock::CheckRight($arResult["ELEMENT"]["PERMISSION"], "element_edit") >= "W" ? "Y" : "N", "DELETE" => CWebDavIblock::CheckRight($arResult["ELEMENT"]["PERMISSION"], "element_edit") >= "W" ? "Y" : "N", "HISTORY" => "Y");
if ($arResult["ELEMENT"]["LOCK_STATUS"] == "yellow" || $arResult["ELEMENT"]["LOCK_STATUS"] == "red" && (CWorkflow::IsAdmin() || $USER->CanDoOperation('webdav_change_settings'))) {
    $res["UNLOCK"] = "Y";
}
if ($arResult["ELEMENT"]["LOCK_STATUS"] == "red") {
    $res["EDIT"] = "N";
} elseif (CWebDavIblock::CheckRight($arResult["ELEMENT"]["PERMISSION"], "element_bizproc_start") == "U") {
    $res["EDIT"] = $arResult["ELEMENT"]["WF_STATUS_ID"] > 1 && $arResult["WF_STATUSES_PERMISSION"][$arResult["ELEMENT"]["WF_STATUS_ID"]] < 2 ? "N" : "Y";
}
$arResult["ELEMENT"]["SHOW"] = $res;
/************** Last element ***************************************/
Esempio n. 2
0
 /**
  * Метод проверяет права на выполнение операций над документами заданного 
  * типа. Проверяются операции 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));
     }
     $iblockId = intval(substr($documentType, strlen("iblock_")));
     if ($iblockId <= 0) {
         throw new CBPArgumentOutOfRangeException("documentType", $documentType);
     }
     $arParameters["IBlockId"] = intval(substr($documentType, strlen("iblock_")));
     // Если нам явно не сказали, то узнаем инфоблочные права
     if (!array_key_exists("IBlockPermission", $arParameters)) {
         if (isset($arParameters['SectionId'])) {
             $arParameters['SectionId'] = intval($arParameters['SectionId']);
             $arParameters["IBlockPermission"] = CIBlockDocumentWebdav::GetIBRights('SECTION', $arParameters["IBlockId"], $arParameters['SectionId']);
         } else {
             $arParameters["IBlockPermission"] = CIBlockDocumentWebdav::GetIBRights('IBLOCK', $arParameters["IBlockId"]);
         }
     }
     if (CWebDavIblock::CheckRight($arParameters["IBlockPermission"], "element_read") < "R") {
         return false;
     } elseif (CWebDavIblock::CheckRight($arParameters["IBlockPermission"], "element_edit") >= "W") {
         return true;
     }
     // Если мы тут, то инфоблочные права равны U
     // Если нам явно не сказали, то узнаем группы пользователя
     $userId = intval($userId);
     if (!array_key_exists("AllUserGroups", $arParameters)) {
         if (!array_key_exists("UserGroups", $arParameters)) {
             $arParameters["UserGroups"] = CUser::GetUserGroup($userId);
         }
         $arParameters["AllUserGroups"] = $arParameters["UserGroups"];
         $arParameters["AllUserGroups"][] = "Author";
     }
     // Если нам явно не сказали, то узнаем текущие статусы документа
     if (!array_key_exists("DocumentStates", $arParameters)) {
         $arParameters["DocumentStates"] = CBPDocument::GetDocumentStates(array("webdav", "CIBlockDocumentWebdav", "iblock_" . $arParameters["IBlockId"]), null);
     }
     // Если нужно проверить только для одного рабочего потока
     if (array_key_exists("WorkflowId", $arParameters) && !empty($arParameters["WorkflowId"])) {
         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 = CWebDavIblock::CheckRight($arParameters["IBlockPermission"], "element_read") > "U" || in_array("read", $arAllowableOperations);
             break;
         case CBPCanUserOperateOperation::StartWorkflow:
             // право на запуск бизнес-процесса есть у имеющих право "W",
             $r = CWebDavIblock::CheckRight($arParameters["IBlockPermission"], "element_bizproc_start") > "U" || in_array("write", $arAllowableOperations);
             // если задан конкретный шаблон потока, то проверяем его
             if ($r && CWebDavIblock::CheckRight($arParameters["IBlockPermission"], "element_bizproc_start") <= "U" && $arParameters["WorkflowTemplateId"] > 0) {
                 // Выбираем все шаблоны для того, чтобы определить тип шаблона
                 // так как для последовательных процессов мы даем право на запуск
                 // бизнес-процесса без проверки прав на запись.
                 if (!array_key_exists("WorkflowTemplateList" . $arParameters["IBlockId"], $GLOBALS["WEBDAV"]["CACHE"])) {
                     if (array_key_exists("WorkflowTemplateList", $arParameters)) {
                         $GLOBALS["WEBDAV"]["CACHE"]["WorkflowTemplateList" . $arParameters["IBlockId"]] = array();
                         foreach ($arParameters["WorkflowTemplateList"] as $res) {
                             $GLOBALS["WEBDAV"]["CACHE"]["WorkflowTemplateList" . $arParameters["IBlockId"]][$res["ID"]] = $res;
                         }
                     } else {
                         $res = array();
                         $db_res = CBPWorkflowTemplateLoader::GetList(array(), array("DOCUMENT_TYPE" => array("webdav", "CIBlockDocumentWebdav", "iblock_" . $arParameters["IBlockId"]), "ACTIVE" => "Y"), false, false, array("ID", "NAME", "DESCRIPTION", "TEMPLATE", "PARAMETERS"));
                         while ($arWorkflowTemplate = $db_res->GetNext()) {
                             $res[$arWorkflowTemplate["ID"]] = $arWorkflowTemplate;
                         }
                         $GLOBALS["WEBDAV"]["CACHE"]["WorkflowTemplateList" . $arParameters["IBlockId"]] = $res;
                     }
                 }
                 $arWorkflowTemplateList = $GLOBALS["WEBDAV"]["CACHE"]["WorkflowTemplateList" . $arParameters["IBlockId"]];
                 if (array_key_exists($arParameters["WorkflowTemplateId"], $arWorkflowTemplateList)) {
                     $arTemplate = $arWorkflowTemplateList[$arParameters["WorkflowTemplateId"]];
                     // Если это машина состояний, то проверяем первое состояние
                     if ($arTemplate["TEMPLATE"][0]["Type"] == "StateMachineWorkflowActivity") {
                         // Выбираем парметры конкретного шаблона рабочего потока
                         if (array_key_exists($arParameters["WorkflowTemplateId"], $arParameters["DocumentStates"])) {
                             $arDocumentStates = $arParameters["DocumentStates"][$arParameters["WorkflowTemplateId"]];
                         } else {
                             if (!array_key_exists("WorkflowTemplate" . $arParameters["WorkflowTemplateId"], $GLOBALS["WEBDAV"]["CACHE"])) {
                                 $GLOBALS["WEBDAV"]["CACHE"]["WorkflowTemplate" . $arParameters["WorkflowTemplateId"]] = CBPWorkflowTemplateLoader::GetTemplateState($arParameters["WorkflowTemplateId"]);
                             }
                             $arDocumentStates = $GLOBALS["WEBDAV"]["CACHE"]["WorkflowTemplate" . $arParameters["WorkflowTemplateId"]];
                         }
                         $arAllowableOperations = CBPDocument::GetAllowableOperations($userId, $arParameters["AllUserGroups"], array($arParameters["WorkflowTemplateId"] => $arDocumentStates));
                         $r = is_array($arAllowableOperations) && in_array("write", $arAllowableOperations);
                     }
                 }
             }
             break;
         case CBPCanUserOperateOperation::CreateWorkflow:
             $r = CWebDavIblock::CheckRight($arParameters["IBlockPermission"], "element_edit") > "U";
             break;
         case CBPCanUserOperateOperation::WriteDocument:
             $r = CWebDavIblock::CheckRight($arParameters["IBlockPermission"], "element_edit") > "U" || in_array("write", $arAllowableOperations);
             break;
         case CBPWebDavCanUserOperateOperation::ReadDocument:
             $r = CWebDavIblock::CheckRight($arParameters["IBlockPermission"], "element_edit") > "U" || in_array("read", $arAllowableOperations);
             break;
         default:
             $r = false;
     }
     return $r;
 }