public IActionResult DeleteFile([FromBody] FileDeleteRequestModel requestModel) { if (!(HttpContext.Items["actor"] is User loginUser)) { throw new UnexpectedException(); } var result = _databaseService.Files.AsQueryable(); // 过滤掉未确认的文件 result = result.Where(s => s.Status == EntityFile.FileStatus.Confirmed); // 注入用户权限 if (loginUser.HasPermission(PermissionBank.StoragePermission("root", "root", "delete")) != true) { List <string> filter = new List <string>(); filter.Add("everyone"); if (loginUser.HasPermission(PermissionBank.StoragePermission("users", loginUser.Username, "delete")) != false) { filter.Add($"users.{loginUser.Username}"); } foreach (var groupToUser in loginUser.GroupToUser) { var groupName = groupToUser.Group.GroupName; if (loginUser.HasPermission(PermissionBank.StoragePermission("groups", groupName, "delete")) != false) { filter.Add($"groups.{groupName}"); } } var groups = loginUser.GroupToUser; foreach (var groupToUser in groups) { var group = groupToUser.Group; var permissions = group.GroupToPermission; foreach (var groupToPermission in permissions) { var permission = groupToPermission.Permission; var permissionNode = permission.Split("."); // storage.file.operation.{type}.{name}.{operation} if ((permissionNode.Length == 6) && (permissionNode[0] == "storage") && (permissionNode[1] == "file") && (permissionNode[2] == "operation")) { var type = permissionNode[3]; var name = permissionNode[4]; var operation = permissionNode[5]; if (operation != "list") { continue; } switch (type) { case "users": filter.Add($"users.{name}"); break; case "groups": filter.Add($"groups.{name}"); break; } } } } result = result.Where(s => filter.Contains(s.Permission)); } // 按文件夹查找 if (!string.IsNullOrEmpty(requestModel.Folder)) { requestModel.Folder = requestModel.Folder.Replace("\\", "/"); result = result.Where(s => s.Folder == requestModel.Folder); } // 按路径前缀查找 if (!string.IsNullOrEmpty(requestModel.PathPrefix)) { requestModel.PathPrefix = requestModel.PathPrefix.Replace("\\", "/"); result = result.Where(s => s.Folder.StartsWith(requestModel.PathPrefix)); } // 按路径包含内容查找 if (requestModel.PathContains?.Length > 0) { result = requestModel.PathContains.Aggregate(result, (current, t) => current.Where(s => s.Path.Contains(t))); } // 按文件名包含内容查找 if (requestModel.NameContains?.Length > 0) { result = requestModel.NameContains.Aggregate(result, (current, t) => current.Where(s => s.Name.Contains(t))); } // 按照文件类型查找 if (requestModel.Type?.Length > 0) { result = result.Where(s => requestModel.Type.Contains(s.Type)); } // 按照路径全字匹配 if (requestModel.Path?.Length > 0) { result = result.Where(s => requestModel.Path.Contains(s.Path)); } // 按照 ID 匹配 if (requestModel.Id?.Length > 0) { result = result.Where(s => requestModel.Id.Contains(s.Id)); } // 按照 Guid 匹配 if (requestModel.Guid?.Length > 0) { result = result.Where(s => requestModel.Guid.Contains(s.Guid)); } // TODO 按照用户权限添加筛选 // 添加其他的搜索条件 result = result.Skip(requestModel.Offset); result = result.Take(requestModel.Amount); var count = 0L; var nonDirectory = result.Where(s => s.Type != "text/directory"); count += nonDirectory.Count(); _databaseService.Files.RemoveRange(nonDirectory); _databaseService.SaveChanges(); var directorys = result.Where(s => s.Type == "text/directory").ToList(); foreach (var s in directorys) { var p = s.Path; p = Path.EndsInDirectorySeparator(p) ? p : p + "/"; var delete = _databaseService.Files.Where(s => s.Path.StartsWith(p)); count += delete.Count(); _databaseService.Files.RemoveRange(delete); _databaseService.SaveChanges(); p = p.Remove(p.Length - 1); delete = _databaseService.Files.Where(s => s.Path == p); count += delete.Count(); _databaseService.Files.RemoveRange(delete); _databaseService.SaveChanges(); } return(Ok(new FileDeleteResultModel(count))); }
public IActionResult ListFile([FromQuery] FileListRequestModel requestModel) { if (!(HttpContext.Items["actor"] is User loginUser)) { throw new UnexpectedException(); } var result = _databaseService.Files.AsQueryable(); // 过滤掉未确认的文件 result = result.Where(s => s.Status == EntityFile.FileStatus.Confirmed); // 注入用户权限 if (loginUser.HasPermission(PermissionBank.StoragePermission("root", "root", "list")) != true) { List <string> filter = new List <string>(); filter.Add("everyone"); if (loginUser.HasPermission(PermissionBank.StoragePermission("users", loginUser.Username, "list")) != false) { filter.Add($"users.{loginUser.Username}"); } foreach (var groupToUser in loginUser.GroupToUser) { var groupName = groupToUser.Group.GroupName; if (loginUser.HasPermission(PermissionBank.StoragePermission("groups", groupName, "list")) != false) { filter.Add($"groups.{groupName}"); } } var groups = loginUser.GroupToUser; foreach (var groupToUser in groups) { var group = groupToUser.Group; var permissions = group.GroupToPermission; foreach (var groupToPermission in permissions) { var permission = groupToPermission.Permission; var permissionNode = permission.Split("."); // storage.file.operation.{type}.{name}.{operation} if ((permissionNode.Length == 6) && (permissionNode[0] == "storage") && (permissionNode[1] == "file") && (permissionNode[2] == "operation")) { var type = permissionNode[3]; var name = permissionNode[4]; var operation = permissionNode[5]; if (operation != "list") { continue; } switch (type) { case "users": filter.Add($"users.{name}"); break; case "groups": filter.Add($"groups.{name}"); break; } } } } result = result.Where(s => filter.Contains(s.Permission)); } // 按文件夹查找 if (!string.IsNullOrEmpty(requestModel.Folder)) { requestModel.Folder = requestModel.Folder.Replace("\\", "/"); result = result.Where(s => s.Folder == requestModel.Folder); } // 按路径前缀查找 if (!string.IsNullOrEmpty(requestModel.PathPrefix)) { requestModel.PathPrefix = requestModel.PathPrefix.Replace("\\", "/"); result = result.Where(s => s.Folder.StartsWith(requestModel.PathPrefix)); } // 按路径包含内容查找 if (requestModel.PathContains?.Length > 0) { result = requestModel.PathContains.Aggregate(result, (current, t) => current.Where(s => s.Path.Contains(t))); } // 按文件名包含内容查找 if (requestModel.NameContains?.Length > 0) { result = requestModel.NameContains.Aggregate(result, (current, t) => current.Where(s => s.Name.Contains(t))); } // 按照文件类型查找 if (requestModel.Type?.Length > 0) { result = result.Where(s => requestModel.Type.Contains(s.Type)); } // 按照路径全字匹配 if (requestModel.Path?.Length > 0) { result = result.Where(s => requestModel.Path.Contains(s.Path)); } // 按照 ID 匹配 if (requestModel.Id?.Length > 0) { result = result.Where(s => requestModel.Id.Contains(s.Id)); } // 按照 Guid 匹配 if (requestModel.Guid?.Length > 0) { result = result.Where(s => requestModel.Guid.Contains(s.Guid)); } // 添加其他的搜索条件 result = result.Skip(requestModel.Offset); result = result.Take(requestModel.Amount); Dictionary <string, object> token = null; if (requestModel.Download == true) { List <string> resourcesList = new List <string>(); foreach (var file in result) { if (file.Type != "text/directory") { resourcesList.Add(file.StorageName); } } try { token = _tencentCos.GetDownloadToken(resourcesList); } catch (Exception e) { _logger.LogError(e, e.Message, e.Data); throw new UnexpectedException(e.Message); } } return(Ok(new FileListResultModel(result, requestModel.Amount, requestModel.Offset, token, _tencentCosManagement))); }
public void RequirePermission(string path, string uploadType, User loginUser, string operation) { string type; string name; var splitsPath = path.Split("/"); // "/分类/名字/扩展" => ["", "分类", "名字", "扩展"] if ((uploadType == "text/directory" && splitsPath.Length >= 3) || (splitsPath.Length >= 4)) { // 获取上传路径的第一季第二级目录名 type = splitsPath[1]; name = splitsPath[2]; switch (type) { case "users": case "groups": break; default: type = "root"; break; } } else { // 如果是非 root 的状态 type = "root"; name = ""; } // 检查用户权限 var ret = loginUser.HasPermission(PermissionBank.StoragePermission(type, name, operation)); if (ret == null) { // 检查用户默认 if (type == "users" && name == loginUser.Username) { ret = true; } else if (type == "groups") { foreach (var groupToUser in loginUser.GroupToUser) { if (groupToUser.Group.GroupName == name) { ret = true; } } } else { ret = false; } } if (ret != true) { throw new AuthenticateFailedException(); } }