From e6bdd287c91c796f0a087e8043d10f36df2f542a Mon Sep 17 00:00:00 2001 From: root Date: Thu, 5 Dec 2024 21:12:36 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=B5=81=E5=BC=8F=E6=96=87?= =?UTF-8?q?=E4=BB=B6=E4=B8=8B=E8=BD=BD=E4=BD=93=E9=AA=8C,=20=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E7=A6=81=E6=AD=A2=E6=B3=A8=E5=86=8C=E9=80=89=E9=A1=B9?= =?UTF-8?q?,=20=E6=9B=B4=E6=96=B0sql?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Config/AppConfig.cs | 2 ++ src/Controllers/UserController.cs | 6 ++++-- src/Controllers/iProxyController.cs | 4 ++-- src/Helpers/MasterHelper.cs | 10 ++++++++++ src/Models/Task.cs | 4 ++++ src/Services/DatabaseGateService.cs | 4 ++-- src/Services/TaskManager.cs | 19 +++++++++++++++++-- src/document/iFileProxy.sql | 24 ++++++++++++------------ src/iFileProxy.json | 7 ++++--- 9 files changed, 57 insertions(+), 23 deletions(-) diff --git a/src/Config/AppConfig.cs b/src/Config/AppConfig.cs index 8727135..02a4862 100644 --- a/src/Config/AppConfig.cs +++ b/src/Config/AppConfig.cs @@ -91,6 +91,8 @@ namespace iFileProxy.Config public List RoutesToTrack { get; set; } = []; public int DailyRequestLimitPerIP { get; set; } = -1; public bool AllowDifferentIPsForDownload { get; set; } = true; + public bool AllowStreamTransferOrZeroSize { get; set; } = false; + public bool EnableUserRegister { get; set; } = true; } public partial class Database diff --git a/src/Controllers/UserController.cs b/src/Controllers/UserController.cs index 59915d4..dce388c 100644 --- a/src/Controllers/UserController.cs +++ b/src/Controllers/UserController.cs @@ -1,15 +1,15 @@ using iFileProxy.Attributes; +using iFileProxy.Config; using iFileProxy.Helpers; using iFileProxy.Models; using iFileProxy.Services; using Microsoft.AspNetCore.Mvc; -using System.Linq; namespace iFileProxy.Controllers { [Route("[controller]")] [ApiController] - public class UserController(AuthService authService, ILogger logger) : ControllerBase + public class UserController(AuthService authService, ILogger logger, AppConfig appConfig) : ControllerBase { private readonly AuthService _authService = authService; private readonly ILogger _logger = logger; @@ -20,6 +20,8 @@ namespace iFileProxy.Controllers [HttpPost("register")] public async Task> Register([FromBody] RegisterRequest request) { + if (!appConfig.SecurityOptions.EnableUserRegister) + return BadRequest(new CommonRsp { Message = "管理员设置了禁止注册新用户", Retcode = -1 }); try { var ip = MasterHelper.GetClientIPAddr(HttpContext); diff --git a/src/Controllers/iProxyController.cs b/src/Controllers/iProxyController.cs index 563d025..f534b04 100644 --- a/src/Controllers/iProxyController.cs +++ b/src/Controllers/iProxyController.cs @@ -32,14 +32,14 @@ namespace iFileProxy.Controllers TaskAddState.ErrUrlInvalid => (ActionResult)Ok(new CommonRsp() { Retcode = (int)TaskAddState.ErrUrlInvalid, Message = "非法Url" }), TaskAddState.ErrDbFail => (ActionResult)Ok(new CommonRsp() { Retcode = (int)TaskAddState.ErrDbFail, Message = "数据库数据提交失败!" }), TaskAddState.ErrMaxParallelTasksLimit => (ActionResult)Ok(new CommonRsp() { Retcode = (int)TaskAddState.ErrMaxParallelTasksLimit, Message = "服务端并行数量达到上限!" }), - TaskAddState.ErrFileSizeLimit => (ActionResult)Ok(new CommonRsp() { Retcode = (int)TaskAddState.ErrFileSizeLimit, Message = "指定的文件大小超过系统最大限制!" }), + TaskAddState.ErrFileSizeLimit => (ActionResult)Ok(new CommonRsp() { Retcode = (int)TaskAddState.ErrFileSizeLimit, Message = "文件大小无效!" }), TaskAddState.ErrFileNameForbidden => (ActionResult)Ok(new CommonRsp() { Retcode = (int)TaskAddState.ErrFileNameForbidden, Message = "文件名非法!" }), TaskAddState.ErrIPForbidden => (ActionResult)Ok(new CommonRsp() { Retcode = (int)TaskAddState.ErrIPForbidden, Message = "请求次数超过限制!" }), TaskAddState.ErrTargetHostForbidden => (ActionResult)Ok(new CommonRsp() { Retcode = (int)TaskAddState.ErrTargetHostForbidden, Message = "目标主机不在服务白名单内!" }), TaskAddState.ErrGetFileInfo => (ActionResult)Ok(new CommonRsp() { Retcode = (int)TaskAddState.ErrGetFileInfo, Message = "目标文件信息获取失败!" }), TaskAddState.ErrQueueLengthLimit => (ActionResult)Ok(new CommonRsp() { Retcode = (int)TaskAddState.ErrQueueLengthLimit, Message = "服务器任务队列已满 请稍候重试!" }), TaskAddState.Pending => (ActionResult)Ok(new CommonRsp() { Retcode = (int)TaskAddState.Pending, Message = "已经添加到任务队列!" }), - + TaskAddState.ErrDisabledStreamTransferOrZeroSize => (ActionResult)Ok(new CommonRsp() { Retcode = (int)TaskAddState.ErrDisabledStreamTransferOrZeroSize, Message = "禁止0大小文件或者流式传输!" }), _ => (ActionResult)Ok(new CommonRsp() { Retcode = (int)TaskAddState.Success, Message = "succ default" }), }; } diff --git a/src/Helpers/MasterHelper.cs b/src/Helpers/MasterHelper.cs index 6a3a7bc..7b6836b 100644 --- a/src/Helpers/MasterHelper.cs +++ b/src/Helpers/MasterHelper.cs @@ -85,6 +85,16 @@ namespace iFileProxy.Helpers 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; + } + /// /// 删除指定的已下载文件 /// diff --git a/src/Models/Task.cs b/src/Models/Task.cs index fcab32f..d09a2ff 100644 --- a/src/Models/Task.cs +++ b/src/Models/Task.cs @@ -101,6 +101,10 @@ /// 队列大小达到设定最大值 /// ErrQueueLengthLimit = 13, + /// + /// 文件不允许0大小或者流式(动态大小)传输 + /// + ErrDisabledStreamTransferOrZeroSize = 14, } public class DownloadFileInfo { /// diff --git a/src/Services/DatabaseGateService.cs b/src/Services/DatabaseGateService.cs index 28923ae..20c9463 100644 --- a/src/Services/DatabaseGateService.cs +++ b/src/Services/DatabaseGateService.cs @@ -375,7 +375,7 @@ namespace iFileProxy.Services } 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"; MySqlConnection conn = GetAndOpenDBConn("iFileProxy_Db"); @@ -383,7 +383,7 @@ namespace iFileProxy.Services { using MySqlCommand sqlCmd = new(sql, conn); sqlCmd.Parameters.AddWithValue("@Data",val); - sqlCmd.Parameters.AddWithValue("@tid",key); + sqlCmd.Parameters.AddWithValue("@tid",taskUUID); if (sqlCmd.ExecuteNonQuery() == 1) { return true; diff --git a/src/Services/TaskManager.cs b/src/Services/TaskManager.cs index 1751310..bc26ffa 100644 --- a/src/Services/TaskManager.cs +++ b/src/Services/TaskManager.cs @@ -25,10 +25,22 @@ namespace iFileProxy.Services // 事件处理程序:任务完成后调度下一任务 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($"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) { @@ -106,9 +118,12 @@ namespace iFileProxy.Services if (fileInfo == null) return TaskAddState.ErrGetFileInfo; - if (fileInfo.Size == 0 || fileInfo.Size > _appConfig.DownloadOptions.MaxAllowedFileSize) + if (fileInfo.Size > _appConfig.DownloadOptions.MaxAllowedFileSize) return TaskAddState.ErrFileSizeLimit; + if (fileInfo.Size <= 0 && !_appConfig.SecurityOptions.AllowStreamTransferOrZeroSize) + return TaskAddState.ErrDisabledStreamTransferOrZeroSize; + if (_appConfig.SecurityOptions.BlockedFileName.IndexOf(fileInfo.FileName) != -1) return TaskAddState.ErrFileNameForbidden; diff --git a/src/document/iFileProxy.sql b/src/document/iFileProxy.sql index f928e15..73b08b0 100644 --- a/src/document/iFileProxy.sql +++ b/src/document/iFileProxy.sql @@ -1,17 +1,17 @@ /* Navicat Premium Data Transfer - Source Server : 香港轻量应用_阿里云 + Source Server : 美国VPS Source Server Type : MySQL Source Server Version : 50743 - Source Host : 127.0.0.1:3306 - Source Schema : iFileProxy + Source Host : localhost:3306 + Source Schema : ifileproxy Target Server Type : MySQL Target Server Version : 50743 File Encoding : 65001 - Date: 04/12/2024 00:13:59 + Date: 05/12/2024 21:11:55 */ SET NAMES utf8mb4; @@ -31,7 +31,7 @@ CREATE TABLE `t_system_logs` ( PRIMARY KEY (`log_id`) USING BTREE, INDEX `idx_timestamp`(`timestamp`) 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 @@ -40,18 +40,18 @@ DROP TABLE IF EXISTS `t_tasks_info`; CREATE TABLE `t_tasks_info` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增键', `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', `add_time` datetime NOT NULL COMMENT '任务在何时被添加', `update_time` datetime NOT NULL COMMENT '任务状态更新时间', `status` int(1) NULL DEFAULT NULL COMMENT '任务状态', - `url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '文件url', - `size` bigint(11) NULL DEFAULT NULL COMMENT '文件大小', + `url` varchar(8192) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '文件url', + `size` bigint(32) NULL DEFAULT NULL COMMENT '文件大小', `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, 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 @@ -67,7 +67,7 @@ CREATE TABLE `t_user_events` ( PRIMARY KEY (`event_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 -) 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 @@ -87,6 +87,6 @@ CREATE TABLE `t_users` ( PRIMARY KEY (`user_id`) USING BTREE, UNIQUE INDEX `username`(`username`) 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; diff --git a/src/iFileProxy.json b/src/iFileProxy.json index 2b41bf4..edee1ad 100644 --- a/src/iFileProxy.json +++ b/src/iFileProxy.json @@ -28,7 +28,6 @@ "github.com" ], "BlockedFileName": [ // 禁止代理的文件名 - "a.txt" ], "BlockedClientIP": [ // 禁止使用服务的客户端IP "127.0.0.1" @@ -38,10 +37,12 @@ "/Download", "/AddOfflineTask" ], - "AllowDifferentIPsForDownload": true // 下载者与任务数据提交者IP不同是否允许下载文件 + "AllowDifferentIPsForDownload": true, // 下载者与任务数据提交者IP不同是否允许下载文件 + "AllowStreamTransferOrZeroSize": true, // 是否允许0大小文件或者动态大小文件下载 + "EnableUserRegister": true // 是否开放用户注册 }, "GithubProxy": { - "SizeLimit": 1073741824, + "SizeLimit": 10000000000, "Blacklist": [ "blockedUser1", "blockedUser2/blockedRepo",