/** * 删除群组 * 删除群组时,对应的group_privilege 和 user_group_relations的内容也一并删除 */ public function delete($groupId) { MiniGroup::getInstance()->deleteByGroupId($groupId); //删除群组 MiniGroupPrivilege::getInstance()->deleteRelatedPrivilegeById($groupId); //删除群组对应group_privilege的所有信息 MiniUserGroupRelation::getInstance()->deleteRelatedRelations($groupId); return array('success' => true); // return MiniGroup::getInstance()->delete($groupName,$userId); }
/** * 删除部门 */ public function delete($departmentId) { $userId = $this->userId; $result = MiniGroup::getInstance()->deleteByDepartmentId($departmentId, $userId); if ($result['success'] == true) { $result = MiniGroupRelation::getInstance()->getByGroupId($departmentId); if (!empty($result)) { MiniGroupPrivilege::getInstance()->deleteRelatedPrivilegeById($departmentId); $result = MiniGroupRelation::getInstance()->delete($departmentId); } } return $result; }
/** * 根据groupId,filePath一级一级往上查,查询groupId最小数据 * @param $filePath * @param $groupId * @return null */ private function searchPermission($filePath, $groupId) { $relation = MiniGroupRelation::getInstance()->getByGroupId($groupId); if (empty($relation)) { return NULL; } if ($relation['parent_group_id'] != -1) { $permission = MiniGroupPrivilege::getInstance()->getSpecifyPrivilege($relation['parent_group_id'], $filePath); if (empty($permission)) { return $this->searchPermission($filePath, $relation['parent_group_id']); } else { return $permission; } } else { return NULL; } }
public function getPermission($path, $userId) { $privilegeLength = 9; //权限长度 后期更改则做相应调整 $userInGroups = MiniUserGroupRelation::getInstance()->getByUserId($userId); //用户所在的部门列表,查表user_group_relation if (count($userInGroups) > 0) { //说明该用户被其他用户分配到其群组中 //寻找该用户所在的组有无权限,有权限则说明对应的权限有共享文件 $privilegeArr = array(); //一个用户同一个被共享文件对应多个群组权限集合 foreach ($userInGroups as $userInGroup) { $groupId = $userInGroup['group_id']; $group = MiniGroup::getInstance()->getById($groupId); if ($group['user_id'] != -1) { //表示该组为群组 $groupPrivilege = MiniGroupPrivilege::getInstance()->getSpecifyPrivilege($groupId, $path); if (!empty($groupPrivilege)) { array_push($privilegeArr, $groupPrivilege); } } } if (count($privilegeArr) > 0) { $permission = ''; for ($i = 0; $i < $privilegeLength; $i++) { foreach ($privilegeArr as $privilege) { $can = false; $value = substr($privilege['permission'], $i, 1); if ($value == '1') { $can = true; break; } } if ($can) { $permission .= '1'; } else { $permission .= '0'; } } return $permission; } } return null; }
/** * 获的共享父目录的权限 */ public function getPermission($userId, $path) { $publicPrivilege = MiniGroupPrivilege::getInstance()->getSpecifyPrivilege(-1, $path); if (!empty($publicPrivilege)) { $permission = $publicPrivilege['permission']; return $permission; } $privilegeLength = 9; $userPrivilege = MiniUserPrivilege::getInstance()->getSpecifyPrivilege($userId, $path); if (empty($userPrivilege)) { //如果不存在user_privilege,则向上查找group_privilege和department_privilege $groupPermission = GroupPermissionBiz::getInstance()->getPermission($path, $userId); $departmentPrivilege = new DepartmentPermissionBiz(); $departmentPermission = $departmentPrivilege->getPermission($userId, $path); if (empty($groupPermission)) { $permission = $departmentPermission; } if (empty($departmentPermission)) { $permission = $groupPermission; } if (!empty($groupPermission) && !empty($departmentPermission)) { $permission = ''; $total = $groupPermission + $departmentPermission; for ($i = 0; $i < $privilegeLength; $i++) { $value = substr($total, $i, 1); if ($value == '1' || $value == '2') { $permission .= '1'; } else { $permission .= '0'; } } } } else { $permission = $userPrivilege['permission']; } return $permission; }
/** * 根据groupId,filePath一级一级往上查,查询groupId最小数据 * @param $filePath * @param $groupId * @return null */ public function getGroupPrivilege($filePath, $groupId) { $groupRelation = MiniGroupRelation::getInstance()->getByGroupId($groupId); if (empty($groupRelation)) { return null; } if ($groupRelation['parent_group_id'] != -1) { $privilege = MiniGroupPrivilege::getInstance()->getSpecifyPrivilege($groupRelation['parent_group_id'], $filePath); if (empty($privilege)) { return $this->getGroupPrivilege($filePath, $groupRelation['parent_group_id']); } else { return $privilege; } } else { return null; } }
/** * 取消共享,删除权限 */ public function delete($filePath) { $arr = explode('/', $filePath); $isRoot = false; $isMine = false; if (count($arr) == 3) { $isRoot = true; } $fileOwnerId = $arr[1]; $currentUser = $this->user; $currentUserId = $currentUser['user_id']; if ($fileOwnerId == $currentUserId) { $isMine = true; } if ($isRoot && !$isMine) { //如果是在根目录下且不是自己的目录 则后台控制不准取消共享 throw new MFileopsException(Yii::t('api', 'Internal Server Error'), MConst::HTTP_CODE_409); } $this->share_filter = MSharesFilter::init(); $device = MUserManager::getInstance()->getCurrentDevice(); $userDeviceId = $device["device_id"]; $this->share_filter->slaves = $this->getSlaveIdsByPath($filePath); MiniUserPrivilege::getInstance()->deleteByFilePath($filePath); MiniGroupPrivilege::getInstance()->deleteByFilePath($filePath); MiniFile::getInstance()->cancelPublic($filePath); $eventAction = MConst::CANCEL_SHARED; MiniEvent::getInstance()->createEvent($this->user['id'], $userDeviceId, $eventAction, $filePath, $filePath, MiniUtil::getEventRandomString(MConst::LEN_EVENT_UUID), $this->share_filter->type); $this->share_filter->is_shared = true; //把共享目录下的共享目录设置记录删除 MiniFileMeta::getInstance()->deleteFileMetaByPath($filePath, "share_model"); // 为每个共享用户创建事件 $this->share_filter->handlerAction($eventAction, $userDeviceId, $filePath, $filePath); return true; }
/** * 获取根目录下文件夹 */ public function getFolders() { $userId = $this->user['id']; $folders = MiniFile::getInstance()->getChildrenFolderByParentId($userId, 0, 0); $folderArr = array(); foreach ($folders as $folder) { $publicFolderPrivilege = MiniGroupPrivilege::getInstance()->getByPublicPath($folder['file_path']); $folder['privilege'] = $publicFolderPrivilege; array_push($folderArr, $folder); } return $folderArr; }
/** * 获取公共目录权限 */ public function getPublicPermission($path) { return $permission = MiniGroupPrivilege::getInstance()->getPublicPermission($path); }
/** * 控制器执行主逻辑函数, 处理移动文件或者文件夹 * * @return mixed $value 返回最终需要执行完的结果 */ public function invoke($uri = null) { // 调用父类初始化函数,注册自定义的异常和错误处理逻辑 parent::init(); $this->setAction(MConst::MOVE); $params = $_REQUEST; // 检查参数 if (isset($params) === false) { throw new MException(Yii::t('api', 'Bad Request 7')); } // // 获取用户数据,如user_id $user = MUserManager::getInstance()->getCurrentUser(); $device = MUserManager::getInstance()->getCurrentDevice(); $this->_userId = $user["user_id"]; $this->master = $user["user_id"]; $user_nick = $user["user_name"]; $user_device_id = $device["device_id"]; $this->_user_device_name = $device["user_device_name"]; // 文件大小格式化参数 $this->_locale = "bytes"; if (isset($params["locale"])) { $this->_locale = $params["locale"]; } if (isset($params["root"]) === false || isset($params["from_path"]) === false || isset($params["to_path"]) === false) { throw new MFileopsException(Yii::t('api', 'Bad Request'), MConst::HTTP_CODE_400); } $this->_root = $params["root"]; $from_path = $params["from_path"]; $to_path = $params["to_path"]; $arr = explode('/', $from_path); $isRoot = false; $isMine = false; if (count($arr) == 3) { $isRoot = true; } $fileOwnerId = $arr[1]; $currentUserId = $this->_userId; if ($fileOwnerId == $currentUserId) { $isMine = true; } if ($isRoot && !$isMine) { //如果是在根目录下且不是自己的目录 则后台控制不准取消共享 throw new MFileopsException(Yii::t('api', 'Internal Server Error'), MConst::HTTP_CODE_409); } $to_parts = explode('/', $to_path); $from_parts = explode('/', $from_path); if (count($to_parts) == 2) { $to_path = '/' . $this->_userId . $to_path; } $to_parts = explode('/', $to_path); $file = MiniFile::getInstance()->getByPath($from_path); $isSelfFile = false; if (!empty($file) && $file['user_id'] == $this->_userId) { $isSelfFile = true; } // 转换路径分隔符,便于以后跨平台,如:将 "\"=>"/" $from_path = MUtils::convertStandardPath($from_path); $to_path = MUtils::convertStandardPath($to_path); if ($to_path[strlen($to_path) - 1] == "/") { // 目标文件无效,403 error throw new MFileopsException(Yii::t('api', 'The file or folder name is invalid'), MConst::HTTP_CODE_403); } // 检查共享 $this->from_share_filter = MSharesFilter::init(); $this->to_share_filter = MSharesFilter::init(); $isSharedPath = true; $this->rename = false; // 检查移动方式 if ($this->rename == true) { // 先copy再删除,如果是移动共享文件夹则只copy,再执行shareManager取消共享 $copy_handler = new MCopyController(); $copy_handler->isOutput = false; $response = $copy_handler->invoke(); $_REQUEST['path'] = $params["from_path"]; $delete_handler = new MDeleteController(); $delete_handler->isOutput = false; $delete_handler->completely_remove = true; $delete_handler->invoke(); if (MUserManager::getInstance()->isWeb() === true) { $this->buildWebResponse(); exit; return; } echo json_encode($response); return; } $file_name = MUtils::get_basename($to_path); // 检查文件名是否有效 $is_invalid = MUtils::checkNameInvalid($file_name); if ($is_invalid) { throw new MFileopsException(Yii::t('api', 'The file or folder name is invalid'), MConst::HTTP_CODE_400); } // 检查是否移动到其子目录下 if (strpos($to_path, $from_path . "/") === 0) { throw new MFileopsException(Yii::t('api', 'Can not be moved to the subdirectory'), MConst::HTTP_CODE_403); } if ($to_path == "/{$this->_userId}" || $to_path == "/{$this->_userId}/") { throw new MFileopsException(Yii::t('api', 'Can not be moved to the error directory'), MConst::HTTP_CODE_403); } $from_parent = CUtils::pathinfo_utf($from_path); $to_parent = CUtils::pathinfo_utf($to_path); $privilegeModel = new PrivilegeBiz(); if (!(count($to_parts) == 3)) { $isSharedPath = false; $toPathArr = explode('/', $to_path); $masterId = $toPathArr[1]; if ($masterId != $this->_userId) { $isSharedPath = true; } else { $model = new GeneralFolderPermissionBiz($to_parent['dirname']); if ($model->isParentShared($to_parent['dirname'])) { //如果是父目录被共享 $isSharedPath = true; } } if ($isSharedPath) { $toPrivilege = UserPermissionBiz::getInstance()->getPermission($to_parent['dirname'], $this->_userId); if (empty($toPrivilege)) { $toPrivilege['permission'] = MConst::SUPREME_PERMISSION; } else { $this->to_share_filter->slaves = $privilegeModel->getSlaveIdsByPath($toPrivilege['share_root_path']); $this->to_share_filter->is_shared = true; } } else { $toPrivilege['permission'] = MConst::SUPREME_PERMISSION; } $toFilter = new MiniPermission($toPrivilege['permission']); } else { if ($to_parent['dirname'] == $from_parent['dirname']) { $isSharedPath = false; $fromPathArr = explode('/', $from_path); $masterId = $fromPathArr[1]; if ($masterId != $this->_userId) { $isSharedPath = true; } else { $model = new GeneralFolderPermissionBiz($from_path); if ($model->isParentShared($from_path)) { //如果是父目录被共享 $isSharedPath = true; } } if ($isSharedPath) { $toPrivilege = UserPermissionBiz::getInstance()->getPermission($from_path, $this->_userId); if (!empty($toPrivilege)) { $this->to_share_filter->slaves = $privilegeModel->getSlaveIdsByPath($toPrivilege['share_root_path']); $this->to_share_filter->is_shared = true; } else { $toPrivilege['permission'] = MConst::SUPREME_PERMISSION; } } else { $toPrivilege['permission'] = MConst::SUPREME_PERMISSION; } } $toFilter = new MiniPermission(MConst::SUPREME_PERMISSION); } $isSharedPath = false; $fromPathArr = explode('/', $from_path); $masterId = $fromPathArr[1]; if ($masterId != $this->_userId) { $isSharedPath = true; } else { $model = new GeneralFolderPermissionBiz($from_path); if ($model->isParentShared($from_path)) { //如果是父目录被共享 $isSharedPath = true; } } if ($isSharedPath) { $fromPrivilege = UserPermissionBiz::getInstance()->getPermission($from_path, $this->_userId); if (empty($fromPrivilege)) { $fromPrivilege['permission'] = MConst::SUPREME_PERMISSION; } else { $this->from_share_filter->slaves = $privilegeModel->getSlaveIdsByPath($fromPrivilege['share_root_path']); $this->from_share_filter->is_shared = true; } } else { $fromPrivilege['permission'] = MConst::SUPREME_PERMISSION; } $fromFilter = new MiniPermission($fromPrivilege['permission']); if ($to_parent['dirname'] == $from_parent['dirname']) { $this->setAction(MConst::RENAME); $this->isRename = true; $canRenameFile = $fromFilter->canModifyFileName(); $canRenameFolder = $fromFilter->canModifyFolderName(); $canRenameFile2 = $toFilter->canModifyFileName(); $canRenameFolder2 = $toFilter->canModifyFolderName(); if ($file['file_type'] > 0 && !$canRenameFolder && !$isSelfFile) { //如果目标是目录,则当其不为己文件,且无更名权限时 exception throw new MFileopsException(Yii::t('api', 'have no permission to rename folder'), MConst::HTTP_CODE_409); } if ($file['file_type'] == 0 && !$canRenameFile && !$isSelfFile) { //如果目标是文件,则当其不为己文件,且无更名权限时 exception throw new MFileopsException(Yii::t('api', 'have no permission to rename file'), MConst::HTTP_CODE_409); } if ($file['file_type'] > 0 && !$canRenameFolder2 && !$isSelfFile) { //如果目标是目录,则当其不为己文件,且无更名权限时 exception throw new MFileopsException(Yii::t('api', 'have no permission to rename folder'), MConst::HTTP_CODE_409); } if ($file['file_type'] == 0 && !$canRenameFile2 && !$isSelfFile) { //如果目标是文件,则当其不为己文件,且无更名权限时 exception throw new MFileopsException(Yii::t('api', 'have no permission to rename file'), MConst::HTTP_CODE_409); } } else { $canDeleteFile = $fromFilter->canDeleteFile(); $canDeleteFile2 = $toFilter->canDeleteFile(); if (!$canDeleteFile || !$canDeleteFile2) { throw new MFileopsException(Yii::t('api', 'have no permission to move file'), MConst::HTTP_CODE_409); } } // 先检查源目录是否存在,如果不存在抛出404错误 // $query_db_file = MFiles::queryFilesByPath($from_path); if ($query_db_file === false || empty($query_db_file)) { throw new MFileopsException(Yii::t('api', 'The source file was not found at the specified path'), MConst::HTTP_CODE_404); } // // 检查目标是否存在(包括已被删除的状态) // $deleted = null; $query_db_goal_file = MFiles::queryAllFilesByPath($to_path); if ($query_db_goal_file) { if ($from_path !== $to_path && $query_db_goal_file[0]["is_deleted"] == false) { throw new MFileopsException(Yii::t('api', 'There is already a item at the given destination'), MConst::HTTP_CODE_403); } // 已删除文件的处理 if ($query_db_goal_file[0]["is_deleted"] == 1) { MFiles::deleteById($query_db_goal_file[0]["id"]); if ($query_db_goal_file[0]["file_type"] != 0) { // 文件则直接删除 $deleted = $query_db_goal_file[0]["id"]; } } } $query_db_file = MFiles::queryFilesByPath($from_path); if ($query_db_file === false || empty($query_db_file)) { throw new MFileopsException(Yii::t('api', 'Not found the source files of the specified path'), MConst::HTTP_CODE_404); } // // 检查移动原路径与目标路径是否一致,一致则则返回其文件信息 // if ($from_path === $to_path) { $this->buildResult($query_db_file[0]); return; } // // 查询目标路径父目录信息 // $pathInfo = MUtils::pathinfo_utf($to_path); $parent_path = $pathInfo["dirname"]; $create_folder = new MCreateFolderController(); $create_folder->_user_device_id = $user_device_id; $create_folder->_user_id = $this->_userId; if (count(explode('/', $parent_path)) == 2) { $parent_file_id = 0; } else { $parent_file_id = $create_folder->handlerParentFolder($parent_path); } $fromUserId = $from_parts[1]; $toUserId = $to_parts[1]; // // 组装对象信息 // $file_detail = new MFiles(); $file_detail->file_name = $file_name; $file_detail->file_path = $to_path; $file_detail->file_type = $query_db_file[0]["file_type"]; $file_detail->id = $query_db_file[0]["id"]; $file_detail->from_path = $from_path; $file_detail->parent_file_id = $parent_file_id; $file_detail->user_id = $toUserId; $file_detail->mime_type = NULL; $create_array = array(); // // 判断操作的是文件夹,还是文件 // if ($file_detail->file_type > MConst::OBJECT_TYPE_FILE) { if ($file['user_id'] != $this->_userId) { $updateUserId = $query_db_file[0]["user_id"]; } else { $updateUserId = $this->master; } // // 文件夹,将会对其子文件做进一步处理 // $ret_value = MFiles::updateMoveChildrenFileDetail($updateUserId, $file_detail); if ($ret_value === false) { throw new MFileopsException(Yii::t('api', 'Not found the source files of the specified path'), MConst::HTTP_CODE_404); } // // 针对文件夹下的文件,组装需要添加版本信息的文件 // $create_array = $this->handleChildrenVersions($create_array, $this->_userId, $user_nick, $from_path, $to_path, $query_db_file[0]["id"], $this->_user_device_name, $query_db_file[0]["file_size"]); } else { $file_detail->mime_type = MiniUtil::getMimeType($file_name); $file_meta = new MFileMetas(); $file_meta->version_id = $query_db_file[0]["version_id"]; // // 查询之前是否包含其版本 // $file_version = MFileMetas::queryFileMeta($to_path, MConst::VERSION); if ($file_version) { $meta_value = MUtils::getFileVersions($this->_user_device_name, $query_db_file[0]['file_size'], $file_meta->version_id, MConst::CREATE_FILE, $this->_userId, $user_nick, $file_version[0]["meta_value"]); $file_meta->is_add = false; } else { $meta_value = MUtils::getFileVersions($this->_user_device_name, $query_db_file[0]['file_size'], $file_meta->version_id, MConst::CREATE_FILE, $this->_userId, $user_nick); $file_meta->is_add = true; } $file_meta->meta_value = $meta_value; $file_meta->file_path = $to_path; $create_array[$to_path] = $file_meta; // // 添加到需要更新的版本ref // array_push($this->versions, $file_meta->version_id); } if ($file['file_type'] == 2 || $file['file_type'] == 4) { MiniUserPrivilege::getInstance()->updateByPath($from_path, $to_path); MiniGroupPrivilege::getInstance()->updateByPath($from_path, $to_path); if ($to_parent['dirname'] != $from_parent['dirname']) { MiniUserPrivilege::getInstance()->deleteByFilePath($to_path); MiniGroupPrivilege::getInstance()->deleteByFilePath($to_path); } } // // 创建版本信息 // $ret = MFileMetas::batchCreateFileMetas($create_array, MConst::VERSION); // if ($ret === false) // { // throw new MFileopsException( // Yii::t('api','Internal Server Error'), // MConst::HTTP_CODE_500); // } // // 更新版本 // foreach ($create_array as $file_meta) { if ($file_meta->is_add === true) { // 不存在记录,不需要更新 continue; } MFileMetas::updateFileMeta($file_meta->file_path, MConst::VERSION, $file_meta->meta_value); } // // 更新版本引用次数 // foreach ($this->versions as $vid) { MiniVersion::getInstance()->updateRefCount($vid); } // // 更新该对象元数据 // $file_detail->event_uuid = MiniUtil::getEventRandomString(MConst::LEN_EVENT_UUID); $ret_value = MFiles::updateMoveFileDetail($file_detail); // 移动目录 or 文件 if ($ret_value === false) { throw new MFileopsException(Yii::t('api', 'Internal Server Error'), MConst::HTTP_CODE_500); } $updates = array(); if ($file['file_type'] == 2 || $file['file_type'] == 4) { if ($to_parent['dirname'] != $from_parent['dirname']) { $updates['file_type'] = 1; $updates['user_id'] = $this->_userId; } } if ($fromUserId != $toUserId) { $updates['user_id'] = $toUserId; } MiniFile::getInstance()->updateByPath($to_path, $updates); //被共享者更改文件名更新file_meta记录 MiniFileMeta::getInstance()->modifyFilePath($from_path, 'create_id', $to_path, $file['file_type']); // // 保存移动事件 // by Kindac; // $event_action = $this->getGroupMove($file_detail->from_path, $file_detail->file_path); $ret_value = MiniEvent::getInstance()->createEvent($this->_userId, $user_device_id, $event_action, $file_detail->from_path, $file_detail->file_path, $file_detail->event_uuid, $this->to_share_filter->type); if ($ret_value === false) { throw new MFileopsException(Yii::t('api', 'Internal Server Error'), MConst::HTTP_CODE_500); } if ($file['type'] != 0) { $eventAction = MConst::CREATE_DIRECTORY; } else { $eventAction = MConst::CREATE_FILE; } if ($to_parent['dirname'] == $from_parent['dirname']) { $this->to_share_filter->handlerAction($event_action, $user_device_id, $file_detail->from_path, $file_detail->file_path); } else { if ($this->to_share_filter->is_shared) { $this->to_share_filter->handlerAction($eventAction, $user_device_id, $file_detail->file_path, $file_detail->file_path); } if ($this->from_share_filter->is_shared) { $this->from_share_filter->handlerAction(MConst::DELETE, $user_device_id, $file_detail->from_path, $file_detail->from_path); } } $query_db_file[0]["file_path"] = $file_detail->file_path; $query_db_file[0]["event_uuid"] = $file_detail->event_uuid; if (!empty($deleted)) { MFiles::updateParentId($deleted, $file_detail->id); } //进行扩展操作 $this->extend($from_path, $to_path); //执行完删除操作后执行的额外事物 $after = new MMoveAfter(); $after->action = self::$scene; // $after->from_share_filter = $from_share_filter; $after->to_share_filter = $this->to_share_filter; $after->from_path = $from_path; $after->to_path = $to_path; $after->file_detail = $file_detail; $after->execute(); $this->buildResult($query_db_file[0], $to_path); }
/** * 判断目录是否可发起共享 * 递归查询父目录file_type情况,file_type=1时返回false,file_type==2||3时返回true */ public function getFolderPrivilege($currentUserId, $file) { $filePath = $file['file_path']; $fileType = (int) $file['file_type']; //被共享目录本身可以修改和删除 $privilege = array('resource.read' => 1, 'folder.create' => 1, 'folder.rename' => 1, 'folder.delete' => 1, 'file.create' => 1, 'file.modify' => 1, 'file.rename' => 1, 'file.delete' => 1, 'permission.grant' => 1, 'can_set_share' => 1); if ($fileType == 3) { $parentPath = $file['file_path']; //当用户,群组与部门中的用户权限出现重复时,获取最小部门的权限,顺序为用户,群组,部门 $userPrivilege = MiniUserPrivilege::getInstance()->getSpecifyPrivilege($currentUserId, $parentPath); if (empty($userPrivilege)) { $userGroupRelations = MiniUserGroupRelation::getInstance()->getByUserId($currentUserId); if (count($userGroupRelations) > 1) { //说明用户对应了群组和部门, $groupIdsArr = array(); //获取群组id foreach ($userGroupRelations as $userGroupRelation) { $group = MiniGroup::getInstance()->findById($userGroupRelation['group_id']); if ($group['user_id'] != -1) { array_push($groupIdsArr, $userGroupRelation['group_id']); } else { $departmentId = $userGroupRelation['group_id']; } } //将所有群组的权限放入数组 $permissionArr = array(); foreach ($groupIdsArr as $groupId) { $privilege_0 = MiniGroupPrivilege::getInstance()->getSpecifyPrivilege($groupId, $parentPath); if (!empty($privilege_0)) { array_push($permissionArr, $privilege_0['permission']); } } //拼接群组中权限的最大值,如果为空则为空字符串 $permission = ""; if (count($permissionArr) > 0) { for ($j = 0; $j < 10; $j++) { $isHighestAuthority = false; foreach ($permissionArr as $per) { if ($per[$j] == 1) { $isHighestAuthority = true; break; } } if ($isHighestAuthority) { $permission .= "1"; } else { $permission .= "0"; } } } if ($permission == "") { $groupPrivilege = MiniGroupPrivilege::getInstance()->getSpecifyPrivilege($departmentId, $parentPath); if (empty($groupPrivilege)) { $groupPrivilege = MiniGroupPrivilege::getInstance()->getGroupPrivilege($filePath, $departmentId); } $permission = $groupPrivilege['permission']; } } else { $groupId = $userGroupRelations[0]['group_id']; $groupPrivilege = MiniGroupPrivilege::getInstance()->getSpecifyPrivilege($groupId, $parentPath); if (empty($groupPrivilege)) { $groupPrivilege = MiniGroupPrivilege::getInstance()->getGroupPrivilege($filePath, $groupId); } $permission = $groupPrivilege['permission']; } } else { $permission = $userPrivilege['permission']; } for ($i = 0; $i < strlen($permission); $i++) { $privilege['resource.read'] = (int) $permission[0]; $privilege['folder.create'] = (int) $permission[1]; $privilege['folder.rename'] = (int) $permission[2]; $privilege['folder.delete'] = (int) $permission[3]; $privilege['file.create'] = (int) $permission[4]; $privilege['file.modify'] = (int) $permission[5]; $privilege['file.rename'] = (int) $permission[6]; $privilege['file.delete'] = (int) $permission[7]; $privilege['permission.grant'] = (int) $permission[8]; $privilege["can_set_share"] = 0; } } if ($fileType == 1) { $isShared = false; $userId = $file['user_id']; //判断下级目录是否有共享目录 $filePath = $file['file_path']; $children = MiniFile::getInstance()->getShowChildrenByPath($currentUserId, $filePath); $userGroupRelation = MiniUserGroupRelation::getInstance()->getByUserId($userId); $groupId = $userGroupRelation['group_id']; $arr = array(); array_push($arr, $groupId); foreach ($children as $child) { $childFilePath = $child['file_path']; if ($childFilePath == $filePath) { continue; } $file = MiniFile::getInstance()->getByFilePath($childFilePath); if ($file['file_type'] == 2) { $isShared = true; break; } } if ($isShared) { //子目录已经共享则不能二次共享 $privilege["can_set_share"] = 0; } else { //判断上级目录是否有共享目录 $arr = explode('/', $filePath); $parentPath = "/" . $userId; for ($i = 2; $i < count($arr); $i++) { $parentPath = $parentPath . "/" . $arr[$i]; $file = MiniFile::getInstance()->getByFilePath($parentPath); if ($file['file_type'] == 2) { $privilege["can_set_share"] = 0; } } } } return $privilege; }
/** * 控制器执行主逻辑函数, 处理删除文件或者文件夹 */ public function invoke($uri = null) { $this->setAction(MConst::DELETE); // 调用父类初始化函数,注册自定义的异常和错误处理逻辑 parent::init(); $params = $_REQUEST; // 检查参数 if (isset($params) === false) { throw new MFileopsException(Yii::t('api', 'Bad Request 8'), MConst::HTTP_CODE_400); } // // 获取用户数据,如user_id $user = MUserManager::getInstance()->getCurrentUser(); $device = MUserManager::getInstance()->getCurrentDevice(); $this->_user_id = $user["user_id"]; $user_nick = $user["user_name"]; $user_device_id = $device["device_id"]; $this->_user_device_name = $device["user_device_name"]; // 文件大小格式化参数 $locale = "bytes"; if (isset($params["locale"])) { $locale = $params["locale"]; } if (isset($params["root"]) === false || isset($params["path"]) === false) { throw new MFileopsException(Yii::t('api', 'Bad Request 9'), MConst::HTTP_CODE_400); } $root = $params["root"]; $path = $params["path"]; $isDir = $params["is_dir"]; $pathArr = explode('/', $path); if ($path == '/' || empty($pathArr[2]) || empty($pathArr[1])) { return; } if ($isDir) { //避免人为添加删除目录 $arr = explode('/', $path); $isRoot = false; $isMine = false; if (count($arr) == 3) { $isRoot = true; } $fileOwnerId = $arr[1]; $currentUserId = $this->_user_id; if ($fileOwnerId == $currentUserId) { $isMine = true; } if ($isRoot && !$isMine) { //如果是在根目录下且不是自己的目录 则后台控制不准取消共享 throw new MFileopsException(Yii::t('api', 'Internal Server Error'), MConst::HTTP_CODE_409); } } // // 转换路径分隔符,便于以后跨平台,如:将 "\"=>"/" // $path = MUtils::convertStandardPath($path); if ($path == "" || $path == "/" || $path === false) { throw new MFileopsException(Yii::t('api', 'Bad request 10'), MConst::HTTP_CODE_400); } // 检查是否是共享目录 $share_filter = MSharesFilter::init(); if ($share_filter->handlerCheck($this->_user_id, $path)) { $this->_user_id = $share_filter->master; $path = $share_filter->_path; } // // 如果删除的是共享目录,则转到ShareManager处理 // if ($share_filter->_is_shared_path && $share_filter->operator != $share_filter->master) { $file = MFiles::queryFilesByPath("/" . $share_filter->operator . $share_filter->src_path); if (!$file) { throw new MFileopsException(Yii::t('api', 'Internal Server Error'), MConst::HTTP_CODE_500); } $id = $file[0]["id"]; $handler = new ShareManager(); $handler->_userId = $share_filter->operator; $handler->_id = $id; try { $handler->invoke(ShareManager::CANCEL_SHARED); } catch (Exception $e) { throw new MFileopsException(Yii::t('api', 'Internal Server Error'), MConst::HTTP_CODE_500); } // 输出返回值 $path = MUtils::convertStandardPath($share_filter->src_path); $this->buildResult($root, $path, $handler->_file["version_id"], $handler->_file["file_update_time"], true); return; } if ($share_filter->_is_shared_path && $share_filter->operator != $share_filter->master) { throw new MException(Yii::t('api', 'You do not have permission to perform the delete operation.'), MConst::HTTP_CODE_409); } // // 组装对象信息 // $file_name = MUtils::get_basename($path); $file_detail = new MFiles(); $file_detail->file_name = $file_name; $file_detail->file_path = $path; // // 查询其目录信息,是否存在 // $query_db_file = MFiles::queryFilesByPath($file_detail->file_path); //数据已不存在 if (count($query_db_file) <= 0) { throw new MFileopsException(Yii::t('api', 'Not found the source files of the specified path'), MConst::HTTP_CODE_404); } $data = array("obj" => $this, "share_filter" => $share_filter, "query_db_file" => $query_db_file[0]); //在共享文件夹中进行删除权限判断 if ($share_filter->is_shared && $query_db_file[0]["file_type"] != MConst::OBJECT_TYPE_BESHARED) { if ($query_db_file[0]["file_type"] == 0) { //文件删除 $share_filter->hasPermissionExecute($query_db_file[0]["file_path"], MPrivilege::FILE_DELETE); } else { //文件夹删除 $share_filter->hasPermissionExecute($query_db_file[0]["file_path"], MPrivilege::FOLDER_DELETE); } } // // 可以删除包含子文件的目录 // 检查其是否为文件夹 // $files = array(); $file_detail->is_dir = false; $file_detail->id = $query_db_file[0]["id"]; $file_detail->file_size = $query_db_file[0]["file_size"]; $file_detail->file_type = $query_db_file[0]["file_type"]; if ($query_db_file[0]["file_type"] > MConst::OBJECT_TYPE_FILE) { $file_detail->is_dir = true; $files = $this->handleChildrenFile($file_detail->file_path, $files); } else { // 处理加入版本历史 $this->handleFileMeta($file_detail->file_path, $query_db_file[0]["version_id"], $this->_user_id, $user_nick, $this->_user_device_name, $file_detail->file_size); } $isSharedPath = false; $pathArr = explode('/', $file_detail->file_path); $masterId = $pathArr[1]; if ($masterId != $this->_user_id) { $isSharedPath = true; } else { $model = new GeneralFolderPermissionBiz($file_detail->file_path); if ($model->isParentShared($file_detail->file_path)) { //如果是父目录被共享 $isSharedPath = true; } } if ($isSharedPath) { $permissionArr = UserPermissionBiz::getInstance()->getPermission($file_detail->file_path, $user["user_id"]); $permission = $permissionArr['permission']; if (!empty($permission)) { $privilegeModel = new PrivilegeBiz(); $share_filter->slaves = $privilegeModel->getSlaveIdsByPath($permissionArr['share_root_path']); $share_filter->is_shared = true; if ($file_detail->file_type == 0) { //删除文件 $can_file_delete = substr($permission, 7, 1); if ($can_file_delete == 0) { throw new MFileopsException(Yii::t('api', 'no permission'), MConst::HTTP_CODE_409); } } if ($file_detail->file_type == 1 || $file_detail->file_type == 2 || $file_detail->file_type == 4) { $can_folder_delete = substr($permission, 3, 1); if ($can_folder_delete == 0) { throw new MFileopsException(Yii::t('api', 'no permission'), MConst::HTTP_CODE_409); } } } } // // 更新文件元数据的为删除数据 // $this->assembleFileDetail($file_detail, $query_db_file[0]); $ret_value = MFiles::updateRemoveFileDetail($file_detail); if ($ret_value === false) { throw new MFileopsException(Yii::t('api', 'Internal Server Error'), MConst::HTTP_CODE_500); } // // 将删除目录加入数组 // array_push($files, $file_detail); // // 保存事件 // $ret_value = MiniEvent::getInstance()->createEvents($this->_user_id, $user_device_id, $files, $share_filter->type); if ($ret_value === false) { throw new MFileopsException(Yii::t('api', 'Internal Server Error'), MConst::HTTP_CODE_500); } // // // if ($share_filter->is_shared) { foreach ($files as $file) { $share_filter->handlerAction($file->event_action, $user_device_id, $file->from_path, $file->context); } } // // 删除共享目录(删除共享目录,对应的权限也一起删除) // //首先判断用户有无删除权限 $userPrivilegeList = MiniUserPrivilege::getInstance()->getPrivilegeList($file_detail->file_path); $groupPrivilegeList = MiniGroupPrivilege::getInstance()->getPrivilegeList($file_detail->file_path); if (!empty($userPrivilegeList)) { MiniUserPrivilege::getInstance()->deleteByFilePath($file_detail->file_path); } if (!empty($groupPrivilegeList)) { MiniGroupPrivilege::getInstance()->deleteByFilePath($file_detail->file_path); } //并且将file_type改为1 if ($file_detail->file_type == 0) { MiniFile::getInstance()->togetherShareFile($file_detail->file_path, Mconst::OBJECT_TYPE_FILE); } else { MiniFile::getInstance()->togetherShareFile($file_detail->file_path, Mconst::OBJECT_TYPE_DIRECTORY); } if ($filter !== true && $share_filter->_is_shared_path && $share_filter->operator == $share_filter->master) { $file = MFiles::queryFilesByPath("/" . $share_filter->operator . $path, true); if (!$file) { throw new MFileopsException(Yii::t('api', 'Internal Server Error'), MConst::HTTP_CODE_500); } $id = $file[0]["id"]; $handler = new ShareManager(); $handler->_userId = $share_filter->operator; $handler->_id = $id; try { $handler->invoke(ShareManager::CANCEL_SHARED); } catch (Exception $e) { throw new MFileopsException(Yii::t('api', 'Internal Server Error'), MConst::HTTP_CODE_500); } } // 如果彻底删除,则调用回收站 if ($this->completely_remove) { $trash = new Trash(); $trash->_userId = $this->_user_id; $trash->fromIds = $file_detail->id; try { $trash->invoke(Trash::DELETE); } catch (Exception $e) { throw new MFileopsException(Yii::t('api', 'Internal Server Error'), MConst::HTTP_CODE_500); } //执行的额外操作 $this->extend($share_filter, $query_db_file, $file_detail); return; } $path = CUtils::removeUserFromPath($query_db_file[0]["file_path"]); $path_info = MUtils::pathinfo_utf($path); $path_info_out = MUtils::pathinfo_utf($share_filter->src_path); $path = MUtils::convertStandardPath($path_info_out['dirname'] . "/" . $path_info['basename']); //执行的额外操作 $this->extend($share_filter, $query_db_file, $file_detail); $this->buildResult($root, $path, $query_db_file[0]["version_id"], $query_db_file[0]["file_update_time"], $file_detail->is_dir); }
/** * 搜索公共目录,共享目录 */ public function handleSearchRoot($path, $query) { $user = MUserManager::getInstance()->getCurrentUser(); $sharedpaths = array(); $publicFiles = MiniFile::getInstance()->getPublics(); $groupShareFiles = MiniGroupPrivilege::getInstance()->getAllGroups(); $userShareFiles = MiniUserPrivilege::getInstance()->getAllUserPrivilege($user["id"]); $shareFiles = array_merge($publicFiles, $groupShareFiles, $userShareFiles); foreach ($shareFiles as $shareFile) { $sharedpaths[] = $shareFile['file_path']; } $sharedpaths = array_unique($sharedpaths); // // 搜索共享目录,根目录查询 // if ($path != '/' . $this->_user_id) { return array(); } $query = str_replace("%", "\\%", $query); // $sql = ' file_name like "%' . $query . '%"'; $sql = ''; $retval = array(); foreach ($sharedpaths as $sharedpath) { $condition = $sql . 'parent_file_id=0 and file_path="' . $sharedpath . '" '; $files = MFiles::findAll($condition); if (empty($files)) { continue; } $retval = array_merge($retval, $files); } return $retval; }
public function getAllSharedPath($userId) { $userPrivileges = MiniUserPrivilege::getInstance()->getByUserId($userId); $filePaths = array(); foreach ($userPrivileges as $userPrivilege) { array_push($filePaths, $userPrivilege['file_path']); } $groupPrivileges = MiniGroupPrivilege::getInstance()->getAllGroups(); $publicPrivileges = MiniGroupPrivilege::getInstance()->getPublic(); foreach ($publicPrivileges as $publicPrivilege) { array_push($filePaths, $publicPrivilege['file_path']); } $groupIds = array(); foreach ($groupPrivileges as $groupPrivilege) { array_push($groupIds, $groupPrivilege['group_id']); } $groupIdsArr = array(); $userGroupRelations = MiniUserGroupRelation::getInstance()->findUserGroup($userId); if (isset($userGroupRelations)) { foreach ($userGroupRelations as $userRelation) { $groupId = $userRelation['id']; $arr = array(); array_push($arr, $groupId); $result = MiniGroup::getInstance()->findById($groupId); if ($result['user_id'] > 0) { array_push($groupIdsArr, $groupId); } else { $ids = $this->getGroupIds($groupId, $arr); } } array_splice($groupIdsArr, 0, 0, $ids); $commonGroupIds = array_merge($groupIdsArr, $groupIds); foreach ($commonGroupIds as $commonGroupId) { $groupInfos = MiniGroupPrivilege::getInstance()->getByGroupId($commonGroupId); foreach ($groupInfos as $groupInfo) { $paths[] = $groupInfo['file_path']; } } if ($paths) { array_splice($filePaths, 0, 0, $paths); } } $paths = array(); $filePaths = array_unique($filePaths); foreach ($filePaths as $filePath) { $result = MiniFile::getInstance()->getByPath($filePath); if (count($result) == 0) { continue; } //当共享文件为共享者的时候进行过滤 $arr = explode("/", $filePath); $userId = $this->user['id']; $slaveId = $arr[1]; if ($slaveId == $userId) { continue; } $fileBiz = new FileBiz(); $canRead = $fileBiz->privilege($filePath); if (!$canRead) { continue; } $paths[] = $filePath; } return $paths; }
/** * 处理根目录下文件查询 * @param $includeDeleted * @return array */ private function handleRootPath($includeDeleted) { $response = array(); $response["size"] = MUtils::getSizeByLocale($this->locale, 0); $response["bytes"] = 0; $response["path"] = "/"; $response["modified"] = MUtils::formatIntTime(time()); $response["revision"] = 0; $response["rev"] = "0"; $response["root"] = $this->root; $response["is_deleted"] = false; $response["is_dir"] = true; $response["hash"] = ""; $contents = array(); $user = MUserManager::getInstance()->getCurrentUser(); $publicFiles = MiniFile::getInstance()->getPublics(); $groupShareFiles = MiniGroupPrivilege::getInstance()->getAllGroups(); $userShareFiles = MiniUserPrivilege::getInstance()->getAllUserPrivilege($user["id"]); $filePaths = array(); $shareFiles = array_merge($publicFiles, $groupShareFiles, $userShareFiles); $userFiles = MiniFile::getInstance()->getChildrenByFileID($parentFileId = 0, $includeDeleted, $user, $this->userId); $fileData = array_merge($shareFiles, $userFiles); //如果没有文件记录 if (empty($publicFiles) && empty($shareFiles) && empty($userFiles)) { $response["contents"] = $contents; return $response; } foreach ($fileData as $file) { $file = MiniFile::getInstance()->getByPath($file['file_path']); if (!empty($file)) { if ($file['parent_file_id'] == 0 && $file['is_deleted'] == 0 || $file['file_type'] == 2 && $file['user_id'] != $this->userId) { $filePaths[] = $file['file_path']; } } } $filePaths = array_unique($filePaths); $userMetaData = MiniUserMeta::getInstance()->getUserMetas($this->userId); $userHidePaths = ''; if (!empty($userMetaData['user_hide_path'])) { $userHidePaths = unserialize($userMetaData['user_hide_path']); } // 组装子文件数据 foreach ($filePaths as $filePath) { $file = MiniFile::getInstance()->getByFilePath($filePath); $item = array(); $version = MiniVersion::getInstance()->getVersion($file["version_id"]); $mimeType = null; $signature = null; if ($version != NULL) { $mimeType = $version["mime_type"]; $signature = $version["file_signature"]; $file["signature"] = $signature; } $item = $this->assembleResponse($item, $file, $mimeType); if (!empty($item)) { if (in_array($filePath, $userHidePaths)) { $item['is_hide_path'] = true; } else { $item['is_hide_path'] = false; } array_push($contents, $item); } } $response["contents"] = $contents; return $response; }