Esempio n. 1
0
 public static function saveRawFilesToUF($arAttachedFilesRaw, $ufCode, &$arFields)
 {
     static $isDiskEnabled = false;
     static $isWebDavEnabled = false;
     if ($isDiskEnabled === false) {
         $isDiskEnabled = \Bitrix\Main\Config\Option::get('disk', 'successfully_converted', false) && CModule::includeModule('disk') && ($storage = \Bitrix\Disk\Driver::getInstance()->getStorageByUserId($GLOBALS["USER"]->GetID())) && ($folder = $storage->getFolderForUploadedFiles($GLOBALS["USER"]->GetID())) ? "Y" : "N";
     }
     if ($isWebDavEnabled === false) {
         $isWebDavEnabled = IsModuleInstalled('webdav') ? "Y" : "N";
     }
     if (empty($arFields[$ufCode])) {
         $arFields[$ufCode] = array();
     }
     $arRelation = array();
     foreach ($arAttachedFilesRaw as $attachedFileRow) {
         if (!empty($attachedFileRow["base64"]) && !empty($attachedFileRow["url"])) {
             $fileContent = base64_decode($attachedFileRow["base64"]);
             $arUri = parse_url($attachedFileRow["url"]);
             if (!empty($arUri) && !empty($arUri["path"])) {
                 $fileName = $arUri["path"];
             }
             if (!empty($fileContent) && !empty($fileName)) {
                 $fileName = CTempFile::GetFileName($fileName);
                 if (CheckDirPath($fileName)) {
                     file_put_contents($fileName, $fileContent);
                     $arFile = CFile::MakeFileArray($fileName);
                     if (is_array($arFile)) {
                         $resultId = false;
                         if ($isDiskEnabled == "Y") {
                             $file = $folder->uploadFile($arFile, array('NAME' => $arFile["name"], 'CREATED_BY' => $GLOBALS["USER"]->GetID()), array(), true);
                             if ($file) {
                                 $resultId = \Bitrix\Disk\Uf\FileUserType::NEW_FILE_PREFIX . $file->getId();
                             }
                         } elseif ($isWebDavEnabled == "Y") {
                             $webDavData = CWebDavIblock::getRootSectionDataForUser($GLOBALS["USER"]->GetID());
                             if (is_array($webDavData)) {
                                 $webDavObject = new CWebDavIblock($webDavData["IBLOCK_ID"], "", array("ROOT_SECTION_ID" => $webDavData["SECTION_ID"], "DOCUMENT_TYPE" => array("webdav", 'CIBlockDocumentWebdavSocnet', 'iblock_' . $webDavData['SECTION_ID'] . '_user_' . intval($GLOBALS["USER"]->GetID()))));
                                 if ($webDavObject) {
                                     $arParent = $webDavObject->GetObject(array("section_id" => $webDavObject->GetMetaID("DROPPED")));
                                     if (!$arParent["not_found"]) {
                                         $path = $webDavObject->_get_path($arParent["item_id"], false);
                                         $tmpName = str_replace(array(":", ".", "/", "\\"), "_", ConvertTimeStamp(time(), "FULL"));
                                         $tmpOptions = array("path" => str_replace("//", "/", $path . "/" . $tmpName));
                                         $arParent = $webDavObject->GetObject($tmpOptions);
                                         if ($arParent["not_found"]) {
                                             $rMKCOL = $webDavObject->MKCOL($tmpOptions);
                                             if (intval($rMKCOL) == 201) {
                                                 $webDavData["SECTION_ID"] = $webDavObject->arParams["changed_element_id"];
                                             }
                                         } else {
                                             $webDavData["SECTION_ID"] = $arParent['item_id'];
                                             if (!$webDavObject->CheckUniqueName($tmpName, $webDavData["SECTION_ID"], $tmpRes)) {
                                                 $path = $webDavObject->_get_path($webDavData["SECTION_ID"], false);
                                                 $tmpName = randString(6);
                                                 $tmpOptions = array("path" => str_replace("//", "/", $path . "/" . $tmpName));
                                                 $rMKCOL = $webDavObject->MKCOL($tmpOptions);
                                                 if (intval($rMKCOL) == 201) {
                                                     $webDavData["SECTION_ID"] = $webDavData->arParams["changed_element_id"];
                                                 }
                                             }
                                         }
                                     }
                                     $options = array("new" => true, 'dropped' => true, "arFile" => $arFile, "arDocumentStates" => false, "arUserGroups" => array_merge($webDavObject->USER["GROUPS"], array("Author")), "FILE_NAME" => $arFile["name"], "IBLOCK_ID" => $webDavData["IBLOCK_ID"], "IBLOCK_SECTION_ID" => $webDavData["SECTION_ID"], "USER_FIELDS" => array());
                                     $GLOBALS['USER_FIELD_MANAGER']->EditFormAddFields($webDavObject->GetUfEntity(), $options['USER_FIELDS']);
                                     $GLOBALS["DB"]->StartTransaction();
                                     if (!$webDavObject->put_commit($options)) {
                                         $GLOBALS["DB"]->Rollback();
                                     } else {
                                         $GLOBALS["DB"]->Commit();
                                         $resultId = $options['ELEMENT_ID'];
                                     }
                                 }
                             }
                         } else {
                             $resultId = CFile::SaveFile($arFile, $arFile["MODULE_ID"]);
                         }
                         if ($resultId) {
                             $arFields[$ufCode][] = $resultId;
                         }
                         if (!empty($attachedFileRow["id"])) {
                             $arRelation[$attachedFileRow["id"]] = $resultId;
                         }
                     }
                 }
             }
         }
     }
     if (!empty($arRelation)) {
         $arFields["DETAIL_TEXT"] = preg_replace_callback("/\\[DISK\\s+FILE\\s+ID\\s*=\\s*pseudo@([\\d]+)\\]/is" . BX_UTF_PCRE_MODIFIER, function ($matches) use($arRelation, $isDiskEnabled, $isWebDavEnabled) {
             if (isset($arRelation[intval($matches[1])])) {
                 if ($isDiskEnabled == "Y") {
                     return "[DISK FILE ID=" . $arRelation[intval($matches[1])] . "]";
                 } elseif ($isWebDavEnabled == "Y") {
                     return "[DOCUMENT ID=" . intval($arRelation[intval($matches[1])]) . "]";
                 } else {
                     return "[DISK FILE ID=pseudo@" . $matches[1] . "]";
                 }
             } else {
                 return "[DISK FILE ID=pseudo@" . $matches[1] . "]";
             }
         }, $arFields["DETAIL_TEXT"]);
     }
 }
Esempio n. 2
0
 function _get_section_info_arr(&$arr)
 {
     $arr["SHOW"] = array("EDIT" => $this->permission > "U" && !$this->check_creator ? "Y" : "N", "DELETE" => $this->permission > "U" && !$this->check_creator ? "Y" : "N", "PERMISSIONS" => $this->permission > "W", "UNDELETE" => "N", "RIGHTS" => $this->e_rights ? "Y" : "N");
     $info = array();
     if (!isset($arr["~NAME"])) {
         $arr["~NAME"] = $arr["NAME"];
     }
     $arr["PATH"] = str_replace("//", "/", CWebDavIblock::_get_path($arr["IBLOCK_SECTION_ID"], false) . "/" . $arr["NAME"]);
     if ($_SERVER['REQUEST_METHOD'] == 'PROPFIND') {
         $info["path"] = $arr["PATH"];
         if (SITE_CHARSET != "UTF-8") {
             $info["path"] = $GLOBALS["APPLICATION"]->ConvertCharset($info["path"], SITE_CHARSET, "UTF-8");
         }
         $info["props"] = array();
         $info["props"][] = array('ns' => 'DAV:', 'name' => "resourcetype", 'val' => "collection");
         $info["props"][] = array('ns' => 'DAV:', 'name' => "getcontenttype", 'val' => "httpd/unix-directory");
         $info["props"][] = array('ns' => 'DAV:', 'name' => "creationdate", 'val' => isset($arr["DATE_CREATE_UNIX"]) ? $arr["DATE_CREATE_UNIX"] : MakeTimeStamp($arr["DATE_CREATE"]));
         $info["props"][] = array('ns' => 'DAV:', 'name' => "getlastmodified", 'val' => isset($arr["TIMESTAMP_X_UNIX"]) ? $arr["TIMESTAMP_X_UNIX"] : MakeTimeStamp($arr["TIMESTAMP_X"]));
         $info["props"][] = array('ns' => 'DAV:', 'name' => "iscollection", 1);
         $info["props"][] = $this->_get_lock_prop();
     }
     if ($this->_parse_webdav_info($arr) && is_array($arr["PROPS"])) {
         foreach ($arr["PROPS"] as $ns_name => $ns_props) {
             foreach ($ns_props as $prop_name => $prop_val) {
                 if (is_scalar($prop_val)) {
                     if ($ns_name == "BX:" && $prop_name == "UNDELETE") {
                         $arr["SHOW"]["EDIT"] = "N";
                         if ($this->permission > "W") {
                             $arr["SHOW"]["DELETE"] = "Y";
                             $arr["SHOW"]["UNDELETE"] = "Y";
                         } else {
                             $arr["SHOW"]["DELETE"] = "N";
                         }
                         $arr["UNDELETE"] = $prop_val;
                     }
                     $info["props"][] = CWebDavBase::_mkprop($ns_name, $prop_name, $prop_val);
                 }
             }
         }
     }
     if ($this->e_rights) {
         $bSuperUser = $GLOBALS['USER']->CanDoOperation('webdav_change_settings');
         $arShow = array('PERMISSIONS' => 'section_edit', 'EDIT' => 'section_edit', 'DELETE' => 'section_edit', 'UNDELETE' => 'section_delete', "RIGHTS" => "element_rights_edit");
         foreach ($arShow as $action => $right) {
             if (!isset($arr['E_RIGHTS'][$right]) && !$bSuperUser) {
                 $arr['SHOW'][$action] = 'N';
             }
         }
         $arr['SHOW']['SHARED'] = $arr['SHARED'];
     }
     return $info;
 }