protected function processActionMoveTo() { if (!$this->checkRequiredPostParams(array('objectId', 'targetObjectId'))) { $this->sendJsonErrorResponse(); } /** @var \Bitrix\Disk\File|\Bitrix\Disk\Folder $object */ $object = BaseObject::loadById((int) $this->request->getPost('objectId'), array('STORAGE')); if (!$object) { $this->errorCollection->addOne(new Error(Loc::getMessage('DISK_BREADCRUMBS_TREE_ERROR_COULD_NOT_FIND_OBJECT'), self::ERROR_COULD_NOT_FIND_OBJECT)); $this->sendJsonErrorResponse(); } $securityContext = $object->getStorage()->getCurrentUserSecurityContext(); if (!$object->canRead($securityContext)) { $this->sendJsonAccessDeniedResponse(); } /** @var \Bitrix\Disk\Folder $targetObject */ $targetObject = Folder::loadById((int) $this->request->getPost('targetObjectId'), array('STORAGE')); if (!$targetObject) { $this->errorCollection->addOne(new Error(Loc::getMessage('DISK_BREADCRUMBS_TREE_ERROR_COULD_NOT_FIND_OBJECT'), self::ERROR_COULD_NOT_FIND_OBJECT)); $this->sendJsonErrorResponse(); } if (!$object->canMove($securityContext, $targetObject)) { $this->sendJsonAccessDeniedResponse(); } if (!$object->moveTo($targetObject, $this->getUser()->getId(), true)) { $this->errorCollection->addOne(new Error(Loc::getMessage('DISK_BREADCRUMBS_TREE_ERROR_COULD_NOT_MOVE_OBJECT'), self::ERROR_COULD_NOT_MOVE_OBJECT)); $this->sendJsonErrorResponse(); } $this->sendJsonSuccessResponse(array('id' => $object->getId(), 'name' => $object->getName())); }
/** * @return BaseObject */ public function getObject() { if (!$this->objectId) { return null; } if (isset($this->object) && $this->objectId == $this->object->getId()) { return $this->object; } $this->object = BaseObject::loadById($this->objectId); return $this->object; }
protected function processActionShowObjectInGrid() { if (!$this->checkRequiredGetParams(array('objectId'))) { $this->sendJsonErrorResponse(); } /** @var Folder|File $object */ $object = BaseObject::loadById((int) $this->request->getQuery('objectId'), array('STORAGE')); if (!$object) { $this->errorCollection->addOne(new Error('Could not find file or folder', self::ERROR_COULD_NOT_FIND_FILE)); $this->sendJsonErrorResponse(); } $storage = $object->getStorage(); $securityContext = $storage->getCurrentUserSecurityContext(); if (!$object->canRead($securityContext)) { $this->errorCollection->addOne(new Error('Could not find file or folder', self::ERROR_COULD_NOT_READ_FILE)); $this->sendJsonErrorResponse(); } $gridOptions = new Internals\Grid\FolderListOptions($storage); $pageSize = $gridOptions->getPageSize(); $parameters = array('select' => array('ID'), 'filter' => array('PARENT_ID' => $object->getParentId(), 'DELETED_TYPE' => ObjectTable::DELETED_TYPE_NONE), 'order' => $gridOptions->getOrderForOrm(), 'limit' => $pageSize); $countQuery = new Query(ObjectTable::getEntity()); $countQuery->addSelect(new ExpressionField('CNT', 'COUNT(1)')); $countQuery->setFilter($parameters['filter']); $totalCount = $countQuery->setLimit(null)->setOffset(null)->exec()->fetch(); $totalCount = $totalCount['CNT']; $pageCount = ceil($totalCount / $pageSize); $driver = Driver::getInstance(); $finalPage = null; for ($pageNumber = 1; $pageNumber <= $pageCount; $pageNumber++) { $fullParameters = $driver->getRightsManager()->addRightsCheck($securityContext, $parameters, array('ID', 'CREATED_BY')); $fullParameters['offset'] = $pageSize * ($pageNumber - 1); $query = ObjectTable::getList($fullParameters); while ($row = $query->fetch()) { if ($row['ID'] == $object->getId()) { $finalPage = $pageNumber; break; } } if ($finalPage !== null) { break; } } $finalPage = $finalPage ?: 1; $command = $this->request->getQuery('cmd') ?: ''; if ($command) { $command = '!' . $command; } LocalRedirect($driver->getUrlManager()->getPathInListing($object) . "?&pageNumber={$finalPage}#hl-" . $object->getId() . $command); }
private function processGridActions($gridId) { $postAction = 'action_button_' . $gridId; if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST[$postAction]) && check_bitrix_sessid()) { $userId = $this->getUser()->getID(); if ($_POST[$postAction] == 'restore') { if (empty($_POST['ID'])) { return; } foreach ($_POST['ID'] as $targetId) { /** @var Folder|File $object */ $object = BaseObject::loadById($targetId); if (!$object) { continue; } if (!$object->canRestore($object->getStorage()->getCurrentUserSecurityContext())) { continue; } $object->restore($userId); } } elseif ($_POST[$postAction] == 'delete' || $_POST[$postAction] == 'destroy') { if (empty($_POST['ID'])) { return; } foreach ($_POST['ID'] as $targetId) { /** @var Folder|File $object */ $object = BaseObject::loadById($targetId); if (!$object) { continue; } if (!$object->canDelete($object->getStorage()->getCurrentUserSecurityContext())) { continue; } if ($object instanceof Folder) { $object->deleteTree($userId); } else { $object->delete($userId); } } } } }
private function processGridActions($gridId) { $postAction = 'action_button_' . $gridId; if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST[$postAction]) && check_bitrix_sessid()) { $userId = $this->getUser()->getID(); if ($_POST[$postAction] == 'edit') { if (empty($_POST['FIELDS'])) { return; } foreach ($_POST['FIELDS'] as $id => $sourceData) { if (empty($sourceData['NAME'])) { //inline edit for name only continue; } /** @var Folder|File $object */ $object = BaseObject::loadById($id); if (!$object) { continue; } if (!$object->canRename($object->getStorage()->getCurrentUserSecurityContext())) { continue; } if (!$object->rename($sourceData['NAME'])) { $this->errorCollection->add($object->getErrors()); } } unset($id, $sourceData); } elseif ($_POST[$postAction] == 'delete') { if (empty($_POST['ID'])) { return; } foreach ($_POST['ID'] as $targetId) { /** @var Folder|File $object */ $object = BaseObject::loadById($targetId); if (!$object) { continue; } if (!$object->canMarkDeleted($object->getStorage()->getCurrentUserSecurityContext())) { continue; } $object->markDeleted($userId); } } elseif ($_POST[$postAction] == 'move' && !empty($_POST['grid_group_action_target_object'])) { /** @var Folder $targetFolder */ $targetFolder = Folder::loadById((int) $_POST['grid_group_action_target_object'], array('STORAGE')); if (!$targetFolder) { return; } if (empty($_POST['ID'])) { return; } $ids = array(); foreach ($_POST['ID'] as $targetId) { /** @var Folder|File $object */ $object = BaseObject::loadById((int) $targetId); if (!$object) { continue; } $securityContext = $object->getStorage()->getCurrentUserSecurityContext(); if (!$object->canMove($securityContext, $targetFolder)) { continue; } if ($object->moveTo($targetFolder, $userId, true)) { $ids[] = 'hl-' . $object->getId(); } } $targetName = ''; if ($targetFolder->getId() != $targetFolder->getStorage()->getRootObjectId()) { $targetName = $targetFolder->getName(); } LocalRedirect(Driver::getInstance()->getUrlManager()->getPathInListing($targetFolder) . $targetName . '#' . implode(',', $ids)); } elseif ($_POST[$postAction] == 'copy' && !empty($_POST['grid_group_action_target_object'])) { /** @var Folder $targetFolder */ $targetFolder = Folder::loadById((int) $_POST['grid_group_action_target_object'], array('STORAGE')); if (!$targetFolder) { return; } if (empty($_POST['ID'])) { return; } $ids = array(); foreach ($_POST['ID'] as $targetId) { /** @var Folder|File $object */ $object = BaseObject::loadById((int) $targetId, array('STORAGE')); if (!$object) { continue; } if (!$object->canRead($object->getStorage()->getCurrentUserSecurityContext())) { continue; } if (!$targetFolder->canAdd($targetFolder->getStorage()->getCurrentUserSecurityContext())) { continue; } $newObject = $object->copyTo($targetFolder, $userId, true); if ($newObject) { $ids[] = 'hl-' . $newObject->getId(); } } $targetName = ''; if ($targetFolder->getId() != $targetFolder->getStorage()->getRootObjectId()) { $targetName = $targetFolder->getName(); } LocalRedirect(Driver::getInstance()->getUrlManager()->getPathInListing($targetFolder) . $targetName . '#' . implode(',', $ids)); } } }
/** * Event listener which return url for resource by fields. * @param array $fields Fields from search module. * @return string */ public static function onSearchGetUrl($fields) { if (!is_array($fields)) { return ''; } if ($fields["MODULE_ID"] !== "disk" || substr($fields["URL"], 0, 1) !== "=") { return $fields["URL"]; } parse_str(ltrim($fields["URL"], "="), $data); if (empty($data['ID'])) { return ''; } $object = BaseObject::loadById($data['ID']); if (!$object) { return ''; } $pathFileDetail = self::getDetailUrl($object); \CSearch::update($fields['ID'], array('URL' => $pathFileDetail)); return $pathFileDetail; }
protected function processActionDelete() { $this->checkRequiredPostParams(array('objectId')); if ($this->errorCollection->hasErrors()) { $this->sendJsonErrorResponse(); } /** @var Folder|File $object */ $object = BaseObject::loadById((int) $this->request->getPost('objectId'), array('STORAGE')); if (!$object) { $this->errorCollection->add(array(new Error(Loc::getMessage('DISK_FOLDER_LIST_ERROR_COULD_NOT_FIND_OBJECT'), self::ERROR_COULD_NOT_FIND_OBJECT))); $this->sendJsonErrorResponse(); } if (!$object->canDelete($object->getStorage()->getCurrentUserSecurityContext())) { $this->sendJsonAccessDeniedResponse(); } if ($object instanceof Folder) { if (!$object->deleteTree($this->getUser()->getId())) { $this->errorCollection->add($object->getErrors()); $this->sendJsonErrorResponse(); } $this->sendJsonSuccessResponse(array('message' => Loc::getMessage('DISK_FOLDER_ACTION_MESSAGE_FOLDER_DELETED'))); } if (!$object->delete($this->getUser()->getId())) { $this->errorCollection->add($object->getErrors()); $this->sendJsonErrorResponse(); } $this->sendJsonSuccessResponse(array('message' => Loc::getMessage('DISK_FOLDER_ACTION_MESSAGE_FILE_DELETED'))); }
/** * Returns real object of object. * * For example if object is link (@see FolderLink, @see FileLink), then method returns original object. * @return BaseObject|Folder|File */ public function getRealObject() { if (!$this->isLink()) { return $this; } if (isset($this->realObject) && $this->realObjectId === $this->realObject->getId()) { return $this->realObject; } $this->realObject = BaseObject::loadById($this->realObjectId); return $this->realObject; }
protected function COPY($dest, $httpDestination, $overwrite, $delete = false) { /** @var CDavRequest $request */ $request = $this->request; $v = $request->GetParameter('CONTENT_LENGTH'); if (!empty($v)) { return "415 Unsupported media type"; } //if (isset($httpDestination)) //{ // return "502 bad gateway"; //} $requestDocument = $request->GetXmlDocument(); //todo откуда мы узнаем хранилище относительно которого вести поиск? /** @var Storage $storage */ list($storage, $path) = $this->parsePath($request->getPath()); $objectId = Driver::getInstance()->getUrlManager()->resolveObjectIdFromPath($storage, $path); if (!$objectId) { return '404 Not Found'; } /** @var File|Folder $object */ $object = BaseObject::loadById($objectId); if (!$object) { return '404 Not Found'; } $securityContext = $object->getStorage()->getCurrentUserSecurityContext(); if (!$object->canRead($securityContext)) { return '403 Forbidden'; } list($destStorage, $poludest) = $this->parsePath($dest); if (!$destStorage) { return '404 Not Found'; } $srcPath = GetDirPath(rtrim($path, '/')); $destPath = GetDirPath($poludest); if ($srcPath == $destPath) { if (!$object->canRename($securityContext)) { return '403 Forbidden'; } if (!$object->rename(GetFileName($poludest))) { return '400 Bad Request'; } return "201 Created"; } // $ret = $this->createFolderPath($destStorage, $poludest); // if ($ret !== true) // return $ret; $poludestExploded = explode('/', $poludest); $poludestFolderName = array_pop($poludestExploded); $targetObjectId = Driver::getInstance()->getUrlManager()->resolveObjectIdFromPath($destStorage, implode('/', $poludestExploded)); if (!$targetObjectId) { return '404 Not Found'; } /** @var File|Folder $folder */ $folder = Folder::loadById($targetObjectId); if (!$targetObjectId) { return '404 Not Found'; } if ($delete) { if (!$object->canMove($securityContext, $folder)) { return '403 Forbidden'; } } else { if (!$folder->canAdd($folder->getStorage()->getCurrentUserSecurityContext())) { return '403 Forbidden'; } } $opponent = false; if ($overwrite) { $opponent = BaseObject::getList(array('select' => array('ID'), 'filter' => array('NAME' => GetFileName($poludest), 'PARENT_ID' => $folder->getRealObjectId()), 'limit' => 1))->fetch(); if ($opponent) { /** @var File|Folder $opponentObject */ $opponentObject = BaseObject::loadById($opponent['ID']); if (!$opponentObject->canMarkDeleted($opponentObject->getStorage()->getCurrentUserSecurityContext())) { return '403 Forbidden'; } if (!$opponentObject->markDeleted($this->getUser()->getId())) { return '400 Bad Request'; } } } if ($delete) { if (!$object->moveTo($folder, $this->getUser()->getId(), true)) { return '400 Bad Request'; } } else { if (!$object->copyTo($folder, $this->getUser()->getId(), true)) { return '400 Bad Request'; } } if (GetFileName($poludest) != $object->getName()) { $object->rename(GetFileName($poludest)); } return $opponent ? "201 Created" : "204 No Content"; }