优化流式文件下载体验, 新增禁止注册选项, 更新sql
This commit is contained in:
parent
f1e43edde7
commit
e6bdd287c9
9 changed files with 57 additions and 23 deletions
|
@ -91,6 +91,8 @@ namespace iFileProxy.Config
|
||||||
public List<string> RoutesToTrack { get; set; } = [];
|
public List<string> RoutesToTrack { get; set; } = [];
|
||||||
public int DailyRequestLimitPerIP { get; set; } = -1;
|
public int DailyRequestLimitPerIP { get; set; } = -1;
|
||||||
public bool AllowDifferentIPsForDownload { get; set; } = true;
|
public bool AllowDifferentIPsForDownload { get; set; } = true;
|
||||||
|
public bool AllowStreamTransferOrZeroSize { get; set; } = false;
|
||||||
|
public bool EnableUserRegister { get; set; } = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
public partial class Database
|
public partial class Database
|
||||||
|
|
|
@ -1,15 +1,15 @@
|
||||||
using iFileProxy.Attributes;
|
using iFileProxy.Attributes;
|
||||||
|
using iFileProxy.Config;
|
||||||
using iFileProxy.Helpers;
|
using iFileProxy.Helpers;
|
||||||
using iFileProxy.Models;
|
using iFileProxy.Models;
|
||||||
using iFileProxy.Services;
|
using iFileProxy.Services;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using System.Linq;
|
|
||||||
|
|
||||||
namespace iFileProxy.Controllers
|
namespace iFileProxy.Controllers
|
||||||
{
|
{
|
||||||
[Route("[controller]")]
|
[Route("[controller]")]
|
||||||
[ApiController]
|
[ApiController]
|
||||||
public class UserController(AuthService authService, ILogger<UserController> logger) : ControllerBase
|
public class UserController(AuthService authService, ILogger<UserController> logger, AppConfig appConfig) : ControllerBase
|
||||||
{
|
{
|
||||||
private readonly AuthService _authService = authService;
|
private readonly AuthService _authService = authService;
|
||||||
private readonly ILogger<UserController> _logger = logger;
|
private readonly ILogger<UserController> _logger = logger;
|
||||||
|
@ -20,6 +20,8 @@ namespace iFileProxy.Controllers
|
||||||
[HttpPost("register")]
|
[HttpPost("register")]
|
||||||
public async Task<ActionResult<CommonRsp>> Register([FromBody] RegisterRequest request)
|
public async Task<ActionResult<CommonRsp>> Register([FromBody] RegisterRequest request)
|
||||||
{
|
{
|
||||||
|
if (!appConfig.SecurityOptions.EnableUserRegister)
|
||||||
|
return BadRequest(new CommonRsp { Message = "管理员设置了禁止注册新用户", Retcode = -1 });
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var ip = MasterHelper.GetClientIPAddr(HttpContext);
|
var ip = MasterHelper.GetClientIPAddr(HttpContext);
|
||||||
|
|
|
@ -32,14 +32,14 @@ namespace iFileProxy.Controllers
|
||||||
TaskAddState.ErrUrlInvalid => (ActionResult<CommonRsp>)Ok(new CommonRsp() { Retcode = (int)TaskAddState.ErrUrlInvalid, Message = "非法Url" }),
|
TaskAddState.ErrUrlInvalid => (ActionResult<CommonRsp>)Ok(new CommonRsp() { Retcode = (int)TaskAddState.ErrUrlInvalid, Message = "非法Url" }),
|
||||||
TaskAddState.ErrDbFail => (ActionResult<CommonRsp>)Ok(new CommonRsp() { Retcode = (int)TaskAddState.ErrDbFail, Message = "数据库数据提交失败!" }),
|
TaskAddState.ErrDbFail => (ActionResult<CommonRsp>)Ok(new CommonRsp() { Retcode = (int)TaskAddState.ErrDbFail, Message = "数据库数据提交失败!" }),
|
||||||
TaskAddState.ErrMaxParallelTasksLimit => (ActionResult<CommonRsp>)Ok(new CommonRsp() { Retcode = (int)TaskAddState.ErrMaxParallelTasksLimit, Message = "服务端并行数量达到上限!" }),
|
TaskAddState.ErrMaxParallelTasksLimit => (ActionResult<CommonRsp>)Ok(new CommonRsp() { Retcode = (int)TaskAddState.ErrMaxParallelTasksLimit, Message = "服务端并行数量达到上限!" }),
|
||||||
TaskAddState.ErrFileSizeLimit => (ActionResult<CommonRsp>)Ok(new CommonRsp() { Retcode = (int)TaskAddState.ErrFileSizeLimit, Message = "指定的文件大小超过系统最大限制!" }),
|
TaskAddState.ErrFileSizeLimit => (ActionResult<CommonRsp>)Ok(new CommonRsp() { Retcode = (int)TaskAddState.ErrFileSizeLimit, Message = "文件大小无效!" }),
|
||||||
TaskAddState.ErrFileNameForbidden => (ActionResult<CommonRsp>)Ok(new CommonRsp() { Retcode = (int)TaskAddState.ErrFileNameForbidden, Message = "文件名非法!" }),
|
TaskAddState.ErrFileNameForbidden => (ActionResult<CommonRsp>)Ok(new CommonRsp() { Retcode = (int)TaskAddState.ErrFileNameForbidden, Message = "文件名非法!" }),
|
||||||
TaskAddState.ErrIPForbidden => (ActionResult<CommonRsp>)Ok(new CommonRsp() { Retcode = (int)TaskAddState.ErrIPForbidden, Message = "请求次数超过限制!" }),
|
TaskAddState.ErrIPForbidden => (ActionResult<CommonRsp>)Ok(new CommonRsp() { Retcode = (int)TaskAddState.ErrIPForbidden, Message = "请求次数超过限制!" }),
|
||||||
TaskAddState.ErrTargetHostForbidden => (ActionResult<CommonRsp>)Ok(new CommonRsp() { Retcode = (int)TaskAddState.ErrTargetHostForbidden, Message = "目标主机不在服务白名单内!" }),
|
TaskAddState.ErrTargetHostForbidden => (ActionResult<CommonRsp>)Ok(new CommonRsp() { Retcode = (int)TaskAddState.ErrTargetHostForbidden, Message = "目标主机不在服务白名单内!" }),
|
||||||
TaskAddState.ErrGetFileInfo => (ActionResult<CommonRsp>)Ok(new CommonRsp() { Retcode = (int)TaskAddState.ErrGetFileInfo, Message = "目标文件信息获取失败!" }),
|
TaskAddState.ErrGetFileInfo => (ActionResult<CommonRsp>)Ok(new CommonRsp() { Retcode = (int)TaskAddState.ErrGetFileInfo, Message = "目标文件信息获取失败!" }),
|
||||||
TaskAddState.ErrQueueLengthLimit => (ActionResult<CommonRsp>)Ok(new CommonRsp() { Retcode = (int)TaskAddState.ErrQueueLengthLimit, Message = "服务器任务队列已满 请稍候重试!" }),
|
TaskAddState.ErrQueueLengthLimit => (ActionResult<CommonRsp>)Ok(new CommonRsp() { Retcode = (int)TaskAddState.ErrQueueLengthLimit, Message = "服务器任务队列已满 请稍候重试!" }),
|
||||||
TaskAddState.Pending => (ActionResult<CommonRsp>)Ok(new CommonRsp() { Retcode = (int)TaskAddState.Pending, Message = "已经添加到任务队列!" }),
|
TaskAddState.Pending => (ActionResult<CommonRsp>)Ok(new CommonRsp() { Retcode = (int)TaskAddState.Pending, Message = "已经添加到任务队列!" }),
|
||||||
|
TaskAddState.ErrDisabledStreamTransferOrZeroSize => (ActionResult<CommonRsp>)Ok(new CommonRsp() { Retcode = (int)TaskAddState.ErrDisabledStreamTransferOrZeroSize, Message = "禁止0大小文件或者流式传输!" }),
|
||||||
_ => (ActionResult<CommonRsp>)Ok(new CommonRsp() { Retcode = (int)TaskAddState.Success, Message = "succ default" }),
|
_ => (ActionResult<CommonRsp>)Ok(new CommonRsp() { Retcode = (int)TaskAddState.Success, Message = "succ default" }),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -85,6 +85,16 @@ namespace iFileProxy.Helpers
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static long GetDownloadFileSize(string fileName)
|
||||||
|
{
|
||||||
|
if (CheckDownloadFileExists(fileName))
|
||||||
|
{
|
||||||
|
return new FileInfo(Path.Combine(AppConfig.GetCurrConfig().DownloadOptions.SavePath, fileName)).Length;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 删除指定的已下载文件
|
/// 删除指定的已下载文件
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
@ -101,6 +101,10 @@
|
||||||
/// 队列大小达到设定最大值
|
/// 队列大小达到设定最大值
|
||||||
/// </summary>
|
/// </summary>
|
||||||
ErrQueueLengthLimit = 13,
|
ErrQueueLengthLimit = 13,
|
||||||
|
/// <summary>
|
||||||
|
/// 文件不允许0大小或者流式(动态大小)传输
|
||||||
|
/// </summary>
|
||||||
|
ErrDisabledStreamTransferOrZeroSize = 14,
|
||||||
}
|
}
|
||||||
public class DownloadFileInfo {
|
public class DownloadFileInfo {
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
|
@ -375,7 +375,7 @@ namespace iFileProxy.Services
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
public bool UpdateFieldsData(string fieldsName, string key,string val)
|
public bool UpdateFieldsData(string fieldsName, string taskUUID,object val)
|
||||||
{
|
{
|
||||||
string sql = $"UPDATE t_tasks_info set `{fieldsName}` = @Data WHERE `tid` = @tid";
|
string sql = $"UPDATE t_tasks_info set `{fieldsName}` = @Data WHERE `tid` = @tid";
|
||||||
MySqlConnection conn = GetAndOpenDBConn("iFileProxy_Db");
|
MySqlConnection conn = GetAndOpenDBConn("iFileProxy_Db");
|
||||||
|
@ -383,7 +383,7 @@ namespace iFileProxy.Services
|
||||||
{
|
{
|
||||||
using MySqlCommand sqlCmd = new(sql, conn);
|
using MySqlCommand sqlCmd = new(sql, conn);
|
||||||
sqlCmd.Parameters.AddWithValue("@Data",val);
|
sqlCmd.Parameters.AddWithValue("@Data",val);
|
||||||
sqlCmd.Parameters.AddWithValue("@tid",key);
|
sqlCmd.Parameters.AddWithValue("@tid",taskUUID);
|
||||||
if (sqlCmd.ExecuteNonQuery() == 1)
|
if (sqlCmd.ExecuteNonQuery() == 1)
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
|
|
|
@ -25,10 +25,22 @@ namespace iFileProxy.Services
|
||||||
// 事件处理程序:任务完成后调度下一任务
|
// 事件处理程序:任务完成后调度下一任务
|
||||||
private void HandleTaskCompleted(object? sender, TaskInfo taskInfo)
|
private void HandleTaskCompleted(object? sender, TaskInfo taskInfo)
|
||||||
{
|
{
|
||||||
_logger.Debug($"[TaskId: {taskInfo.TaskId}] End.");
|
_logger.Debug($"[TaskId: {taskInfo.TaskId}] Download Successful.");
|
||||||
_logger.Information($"Running Task Num: {_runningTasks.Count}");
|
_logger.Information($"Running Task Num: {_runningTasks.Count}");
|
||||||
_logger.Information($"Queue Task Num: {_pendingTasks.Count}");
|
_logger.Information($"Queue Task Num: {_pendingTasks.Count}");
|
||||||
|
|
||||||
|
// 如果先前获取的大小不正确 则现在更新文件大小
|
||||||
|
if (taskInfo.Size <= 0)
|
||||||
|
{
|
||||||
|
if (MasterHelper.CheckDownloadFileExists(taskInfo.FileName))
|
||||||
|
{
|
||||||
|
taskInfo.Size =MasterHelper.GetDownloadFileSize(taskInfo.FileName);
|
||||||
|
|
||||||
|
_dbGateService.UpdateFieldsData("size", taskInfo.TaskId, taskInfo.Size);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// 等待队列中有内容并且当前正在运行的任务小于最大并行任务
|
// 等待队列中有内容并且当前正在运行的任务小于最大并行任务
|
||||||
if (_pendingTasks.Count > 0 && _runningTasks.Count < _appConfig.DownloadOptions.MaxParallelTasks)
|
if (_pendingTasks.Count > 0 && _runningTasks.Count < _appConfig.DownloadOptions.MaxParallelTasks)
|
||||||
{
|
{
|
||||||
|
@ -106,9 +118,12 @@ namespace iFileProxy.Services
|
||||||
if (fileInfo == null)
|
if (fileInfo == null)
|
||||||
return TaskAddState.ErrGetFileInfo;
|
return TaskAddState.ErrGetFileInfo;
|
||||||
|
|
||||||
if (fileInfo.Size == 0 || fileInfo.Size > _appConfig.DownloadOptions.MaxAllowedFileSize)
|
if (fileInfo.Size > _appConfig.DownloadOptions.MaxAllowedFileSize)
|
||||||
return TaskAddState.ErrFileSizeLimit;
|
return TaskAddState.ErrFileSizeLimit;
|
||||||
|
|
||||||
|
if (fileInfo.Size <= 0 && !_appConfig.SecurityOptions.AllowStreamTransferOrZeroSize)
|
||||||
|
return TaskAddState.ErrDisabledStreamTransferOrZeroSize;
|
||||||
|
|
||||||
if (_appConfig.SecurityOptions.BlockedFileName.IndexOf(fileInfo.FileName) != -1)
|
if (_appConfig.SecurityOptions.BlockedFileName.IndexOf(fileInfo.FileName) != -1)
|
||||||
return TaskAddState.ErrFileNameForbidden;
|
return TaskAddState.ErrFileNameForbidden;
|
||||||
|
|
||||||
|
|
|
@ -1,17 +1,17 @@
|
||||||
/*
|
/*
|
||||||
Navicat Premium Data Transfer
|
Navicat Premium Data Transfer
|
||||||
|
|
||||||
Source Server : 香港轻量应用_阿里云
|
Source Server : 美国VPS
|
||||||
Source Server Type : MySQL
|
Source Server Type : MySQL
|
||||||
Source Server Version : 50743
|
Source Server Version : 50743
|
||||||
Source Host : 127.0.0.1:3306
|
Source Host : localhost:3306
|
||||||
Source Schema : iFileProxy
|
Source Schema : ifileproxy
|
||||||
|
|
||||||
Target Server Type : MySQL
|
Target Server Type : MySQL
|
||||||
Target Server Version : 50743
|
Target Server Version : 50743
|
||||||
File Encoding : 65001
|
File Encoding : 65001
|
||||||
|
|
||||||
Date: 04/12/2024 00:13:59
|
Date: 05/12/2024 21:11:55
|
||||||
*/
|
*/
|
||||||
|
|
||||||
SET NAMES utf8mb4;
|
SET NAMES utf8mb4;
|
||||||
|
@ -31,7 +31,7 @@ CREATE TABLE `t_system_logs` (
|
||||||
PRIMARY KEY (`log_id`) USING BTREE,
|
PRIMARY KEY (`log_id`) USING BTREE,
|
||||||
INDEX `idx_timestamp`(`timestamp`) USING BTREE,
|
INDEX `idx_timestamp`(`timestamp`) USING BTREE,
|
||||||
INDEX `idx_level`(`level`) USING BTREE
|
INDEX `idx_level`(`level`) USING BTREE
|
||||||
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
|
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC;
|
||||||
|
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
-- Table structure for t_tasks_info
|
-- Table structure for t_tasks_info
|
||||||
|
@ -40,18 +40,18 @@ DROP TABLE IF EXISTS `t_tasks_info`;
|
||||||
CREATE TABLE `t_tasks_info` (
|
CREATE TABLE `t_tasks_info` (
|
||||||
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增键',
|
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增键',
|
||||||
`tid` varchar(48) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '任务id',
|
`tid` varchar(48) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '任务id',
|
||||||
`file_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '文件名',
|
`file_name` varchar(1024) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '文件名',
|
||||||
`client_ip` varchar(46) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '客户端IP',
|
`client_ip` varchar(46) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '客户端IP',
|
||||||
`add_time` datetime NOT NULL COMMENT '任务在何时被添加',
|
`add_time` datetime NOT NULL COMMENT '任务在何时被添加',
|
||||||
`update_time` datetime NOT NULL COMMENT '任务状态更新时间',
|
`update_time` datetime NOT NULL COMMENT '任务状态更新时间',
|
||||||
`status` int(1) NULL DEFAULT NULL COMMENT '任务状态',
|
`status` int(1) NULL DEFAULT NULL COMMENT '任务状态',
|
||||||
`url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '文件url',
|
`url` varchar(8192) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '文件url',
|
||||||
`size` bigint(11) NULL DEFAULT NULL COMMENT '文件大小',
|
`size` bigint(32) NULL DEFAULT NULL COMMENT '文件大小',
|
||||||
`hash` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '文件hash',
|
`hash` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '文件hash',
|
||||||
`tag` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '标记',
|
`tag` varchar(512) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '标记',
|
||||||
PRIMARY KEY (`id`) USING BTREE,
|
PRIMARY KEY (`id`) USING BTREE,
|
||||||
UNIQUE INDEX `tid`(`tid`) USING BTREE
|
UNIQUE INDEX `tid`(`tid`) USING BTREE
|
||||||
) ENGINE = InnoDB AUTO_INCREMENT = 111135 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
|
) ENGINE = InnoDB AUTO_INCREMENT = 111151 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC;
|
||||||
|
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
-- Table structure for t_user_events
|
-- Table structure for t_user_events
|
||||||
|
@ -67,7 +67,7 @@ CREATE TABLE `t_user_events` (
|
||||||
PRIMARY KEY (`event_id`) USING BTREE,
|
PRIMARY KEY (`event_id`) USING BTREE,
|
||||||
INDEX `user_id`(`user_id`) USING BTREE,
|
INDEX `user_id`(`user_id`) USING BTREE,
|
||||||
CONSTRAINT `t_user_events_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `t_users` (`user_id`) ON DELETE RESTRICT ON UPDATE RESTRICT
|
CONSTRAINT `t_user_events_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `t_users` (`user_id`) ON DELETE RESTRICT ON UPDATE RESTRICT
|
||||||
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
|
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC;
|
||||||
|
|
||||||
-- ----------------------------
|
-- ----------------------------
|
||||||
-- Table structure for t_users
|
-- Table structure for t_users
|
||||||
|
@ -87,6 +87,6 @@ CREATE TABLE `t_users` (
|
||||||
PRIMARY KEY (`user_id`) USING BTREE,
|
PRIMARY KEY (`user_id`) USING BTREE,
|
||||||
UNIQUE INDEX `username`(`username`) USING BTREE,
|
UNIQUE INDEX `username`(`username`) USING BTREE,
|
||||||
UNIQUE INDEX `email`(`email`) USING BTREE
|
UNIQUE INDEX `email`(`email`) USING BTREE
|
||||||
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
|
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC;
|
||||||
|
|
||||||
SET FOREIGN_KEY_CHECKS = 1;
|
SET FOREIGN_KEY_CHECKS = 1;
|
||||||
|
|
|
@ -28,7 +28,6 @@
|
||||||
"github.com"
|
"github.com"
|
||||||
],
|
],
|
||||||
"BlockedFileName": [ // 禁止代理的文件名
|
"BlockedFileName": [ // 禁止代理的文件名
|
||||||
"a.txt"
|
|
||||||
],
|
],
|
||||||
"BlockedClientIP": [ // 禁止使用服务的客户端IP
|
"BlockedClientIP": [ // 禁止使用服务的客户端IP
|
||||||
"127.0.0.1"
|
"127.0.0.1"
|
||||||
|
@ -38,10 +37,12 @@
|
||||||
"/Download",
|
"/Download",
|
||||||
"/AddOfflineTask"
|
"/AddOfflineTask"
|
||||||
],
|
],
|
||||||
"AllowDifferentIPsForDownload": true // 下载者与任务数据提交者IP不同是否允许下载文件
|
"AllowDifferentIPsForDownload": true, // 下载者与任务数据提交者IP不同是否允许下载文件
|
||||||
|
"AllowStreamTransferOrZeroSize": true, // 是否允许0大小文件或者动态大小文件下载
|
||||||
|
"EnableUserRegister": true // 是否开放用户注册
|
||||||
},
|
},
|
||||||
"GithubProxy": {
|
"GithubProxy": {
|
||||||
"SizeLimit": 1073741824,
|
"SizeLimit": 10000000000,
|
||||||
"Blacklist": [
|
"Blacklist": [
|
||||||
"blockedUser1",
|
"blockedUser1",
|
||||||
"blockedUser2/blockedRepo",
|
"blockedUser2/blockedRepo",
|
||||||
|
|
Loading…
Reference in a new issue