优化流式文件下载体验, 新增禁止注册选项, 更新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 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
|
||||
|
|
|
@ -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<UserController> logger) : ControllerBase
|
||||
public class UserController(AuthService authService, ILogger<UserController> logger, AppConfig appConfig) : ControllerBase
|
||||
{
|
||||
private readonly AuthService _authService = authService;
|
||||
private readonly ILogger<UserController> _logger = logger;
|
||||
|
@ -20,6 +20,8 @@ namespace iFileProxy.Controllers
|
|||
[HttpPost("register")]
|
||||
public async Task<ActionResult<CommonRsp>> Register([FromBody] RegisterRequest request)
|
||||
{
|
||||
if (!appConfig.SecurityOptions.EnableUserRegister)
|
||||
return BadRequest(new CommonRsp { Message = "管理员设置了禁止注册新用户", Retcode = -1 });
|
||||
try
|
||||
{
|
||||
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.ErrDbFail => (ActionResult<CommonRsp>)Ok(new CommonRsp() { Retcode = (int)TaskAddState.ErrDbFail, 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.ErrIPForbidden => (ActionResult<CommonRsp>)Ok(new CommonRsp() { Retcode = (int)TaskAddState.ErrIPForbidden, 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.ErrQueueLengthLimit => (ActionResult<CommonRsp>)Ok(new CommonRsp() { Retcode = (int)TaskAddState.ErrQueueLengthLimit, 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" }),
|
||||
};
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 删除指定的已下载文件
|
||||
/// </summary>
|
||||
|
|
|
@ -101,6 +101,10 @@
|
|||
/// 队列大小达到设定最大值
|
||||
/// </summary>
|
||||
ErrQueueLengthLimit = 13,
|
||||
/// <summary>
|
||||
/// 文件不允许0大小或者流式(动态大小)传输
|
||||
/// </summary>
|
||||
ErrDisabledStreamTransferOrZeroSize = 14,
|
||||
}
|
||||
public class DownloadFileInfo {
|
||||
/// <summary>
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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",
|
||||
|
|
Loading…
Reference in a new issue