浏览代码

修复bug

懒得勤快 4 年之前
父节点
当前提交
bbff11c95c

+ 31 - 25
src/Masuit.MyBlogs.Core/Common/CommonHelper.cs

@@ -19,7 +19,6 @@ using System.Linq;
 using System.Net;
 using System.Net.Sockets;
 using System.Text;
-using System.Threading;
 using TimeZoneConverter;
 
 namespace Masuit.MyBlogs.Core.Common
@@ -29,36 +28,43 @@ namespace Masuit.MyBlogs.Core.Common
     /// </summary>
     public static class CommonHelper
     {
+        private static readonly FileSystemWatcher _fileSystemWatcher = new(AppContext.BaseDirectory + "App_Data", "*.txt")
+        {
+            IncludeSubdirectories = true,
+            EnableRaisingEvents = true,
+            NotifyFilter = NotifyFilters.Attributes | NotifyFilters.CreationTime | NotifyFilters.DirectoryName | NotifyFilters.FileName | NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.Security | NotifyFilters.Size
+        };
+
         static CommonHelper()
         {
-            ThreadPool.QueueUserWorkItem(_ =>
+            Init();
+            _fileSystemWatcher.Changed += (_, _) =>
             {
-                while (true)
-                {
-                    BanRegex = File.ReadAllText(Path.Combine(AppContext.BaseDirectory + "App_Data", "ban.txt"), Encoding.UTF8);
-                    ModRegex = File.ReadAllText(Path.Combine(AppContext.BaseDirectory + "App_Data", "mod.txt"), Encoding.UTF8);
-                    DenyIP = File.ReadAllText(Path.Combine(AppContext.BaseDirectory + "App_Data", "denyip.txt"), Encoding.UTF8);
-                    string[] lines = File.ReadAllLines(Path.Combine(AppContext.BaseDirectory + "App_Data", "DenyIPRange.txt"), Encoding.UTF8);
-                    DenyIPRange = new Dictionary<string, string>();
-                    foreach (string line in lines)
-                    {
-                        try
-                        {
-                            var strs = line.Split(' ');
-                            DenyIPRange[strs[0]] = strs[1];
-                        }
-                        catch (IndexOutOfRangeException)
-                        {
-                        }
-                    }
+                Init();
+            };
+        }
 
-                    IPWhiteList = File.ReadAllText(Path.Combine(AppContext.BaseDirectory + "App_Data", "whitelist.txt")).Split(',', ',').ToList();
-                    Console.WriteLine("刷新公共数据...");
-                    Thread.Sleep(TimeSpan.FromMinutes(10));
+        private static void Init()
+        {
+            BanRegex = File.ReadAllText(Path.Combine(AppContext.BaseDirectory + "App_Data", "ban.txt"), Encoding.UTF8);
+            ModRegex = File.ReadAllText(Path.Combine(AppContext.BaseDirectory + "App_Data", "mod.txt"), Encoding.UTF8);
+            DenyIP = File.ReadAllText(Path.Combine(AppContext.BaseDirectory + "App_Data", "denyip.txt"), Encoding.UTF8);
+            var lines = File.ReadAllLines(Path.Combine(AppContext.BaseDirectory + "App_Data", "DenyIPRange.txt"), Encoding.UTF8);
+            DenyIPRange = new Dictionary<string, string>();
+            foreach (string line in lines)
+            {
+                try
+                {
+                    var strs = line.Split(' ');
+                    DenyIPRange[strs[0]] = strs[1];
                 }
-            });
-        }
+                catch (IndexOutOfRangeException)
+                {
+                }
+            }
 
+            IPWhiteList = File.ReadAllText(Path.Combine(AppContext.BaseDirectory + "App_Data", "whitelist.txt")).Split(',', ',').ToList();
+        }
         /// <summary>
         /// 敏感词
         /// </summary>

+ 16 - 5
src/Masuit.MyBlogs.Core/Controllers/ErrorController.cs

@@ -15,7 +15,10 @@ using Microsoft.AspNetCore.Mvc;
 using Microsoft.EntityFrameworkCore;
 using Microsoft.Net.Http.Headers;
 using System;
+using System.IO;
 using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
 using System.Web;
 using SameSiteMode = Microsoft.AspNetCore.Http.SameSiteMode;
 
@@ -48,7 +51,7 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// </summary>
         /// <returns></returns>
         [Route("ServiceUnavailable")]
-        public ActionResult ServiceUnavailable()
+        public async Task<ActionResult> ServiceUnavailable()
         {
             var feature = HttpContext.Features.Get<IExceptionHandlerPathFeature>();
             if (feature != null)
@@ -56,23 +59,31 @@ namespace Masuit.MyBlogs.Core.Controllers
                 string err;
                 var req = HttpContext.Request;
                 var ip = HttpContext.Connection.RemoteIpAddress;
+                req.EnableBuffering();
+                using var sr = new StreamReader(req.Body, Encoding.UTF8);
+                var body = await sr.ReadToEndAsync();
+                req.Body.Position = 0;
                 switch (feature.Error)
                 {
                     case DbUpdateConcurrencyException ex:
-                        err = $"数据库并发更新异常,更新表:{ex.Entries.Select(e => e.Metadata.Name)},\n请求路径:{req.Scheme}://{req.Host}{HttpUtility.UrlDecode(feature.Path)},客户端用户代理:{req.Headers[HeaderNames.UserAgent]},客户端IP:{ip}\t{ex.InnerException?.Message}\t";
+                        err = $"数据库并发更新异常,更新表:{ex.Entries.Select(e => e.Metadata.Name)},请求路径:{req.Scheme}://{req.Host}{HttpUtility.UrlDecode(feature.Path)}{req.QueryString},客户端用户代理:{req.Headers[HeaderNames.UserAgent]},客户端IP:{ip}\t{ex.InnerException?.Message},请求参数:\n{body}\n堆栈信息:";
                         LogManager.Error(err, ex);
                         break;
                     case DbUpdateException ex:
-                        err = $"数据库更新时异常,更新表:{ex.Entries.Select(e => e.Metadata.Name)},\n请求路径:{req.Scheme}://{req.Host}{HttpUtility.UrlDecode(feature.Path)},客户端用户代理:{req.Headers[HeaderNames.UserAgent]},客户端IP:{ip}\t{ex.InnerException?.Message}\t";
+                        err = $"数据库更新时异常,更新表:{ex.Entries.Select(e => e.Metadata.Name)},请求路径:{req.Scheme}://{req.Host}{HttpUtility.UrlDecode(feature.Path)}{req.QueryString} ,客户端用户代理:{req.Headers[HeaderNames.UserAgent]},客户端IP:{ip}\t{ex.InnerException?.Message},请求参数:\n{body}\n堆栈信息:";
                         LogManager.Error(err, ex);
                         break;
                     case AggregateException ex:
                         LogManager.Debug("↓↓↓" + ex.Message + "↓↓↓");
                         ex.Flatten().Handle(e =>
                         {
-                            LogManager.Error($"异常源:{e.Source},异常类型:{e.GetType().Name},\n请求路径:{req.Scheme}://{req.Host}{HttpUtility.UrlDecode(feature.Path)},客户端用户代理:{req.Headers[HeaderNames.UserAgent]},客户端IP:{ip}\t", e);
+                            LogManager.Error($"异常源:{e.Source},异常类型:{e.GetType().Name},请求路径:{req.Scheme}://{req.Host}{HttpUtility.UrlDecode(feature.Path)}{req.QueryString} ,客户端用户代理:{req.Headers[HeaderNames.UserAgent]},客户端IP:{ip}\t", e);
                             return true;
                         });
+                        if (!string.IsNullOrEmpty(body))
+                        {
+                            LogManager.Debug("↑↑↑请求参数:\n" + body);
+                        }
                         break;
                     case NotFoundException ex:
                         Response.StatusCode = 404;
@@ -92,7 +103,7 @@ namespace Masuit.MyBlogs.Core.Controllers
                         Response.StatusCode = 403;
                         return View("TempDeny");
                     default:
-                        LogManager.Error($"异常源:{feature.Error.Source},异常类型:{feature.Error.GetType().Name},\n请求路径:{req.Scheme}://{req.Host}{HttpUtility.UrlDecode(feature.Path)},客户端用户代理:{req.Headers[HeaderNames.UserAgent]},客户端IP:{ip}\t", feature.Error);
+                        LogManager.Error($"异常源:{feature.Error.Source},异常类型:{feature.Error.GetType().Name},请求路径:{req.Scheme}://{req.Host}{HttpUtility.UrlDecode(feature.Path)}{req.QueryString} ,客户端用户代理:{req.Headers[HeaderNames.UserAgent]},客户端IP:{ip},请求参数:\n{body}\n堆栈信息:", feature.Error);
                         break;
                 }
             }

+ 3 - 2
src/Masuit.MyBlogs.Core/Controllers/LinksController.cs

@@ -1,4 +1,5 @@
-using Masuit.MyBlogs.Core.Extensions;
+using Masuit.MyBlogs.Core.Common;
+using Masuit.MyBlogs.Core.Extensions;
 using Masuit.MyBlogs.Core.Models.DTO;
 using Masuit.MyBlogs.Core.Models.Entity;
 using Masuit.MyBlogs.Core.Models.Enum;
@@ -145,7 +146,7 @@ namespace Masuit.MyBlogs.Core.Controllers
 
                 using var httpContent = res.Content;
                 var s = httpContent.ReadAsStringAsync().Result;
-                return s.Contains(Request.Host.Host) ? ResultData(null, true, "友情链接正常!") : ResultData(null, false, link + " 对方似乎没有本站的友情链接!");
+                return s.Contains(CommonHelper.SystemSettings["Domain"].Split("|")) ? ResultData(null, true, "友情链接正常!") : ResultData(null, false, link + " 对方似乎没有本站的友情链接!");
             });
         }
 

+ 0 - 14
src/Masuit.MyBlogs.Core/Controllers/MiscController.cs

@@ -7,7 +7,6 @@ using Masuit.MyBlogs.Core.Models.Enum;
 using Masuit.MyBlogs.Core.Models.ViewModel;
 using Masuit.Tools;
 using Masuit.Tools.Core.Net;
-using Masuit.Tools.Html;
 using Microsoft.AspNetCore.Hosting;
 using Microsoft.AspNetCore.Mvc;
 using System;
@@ -134,19 +133,6 @@ namespace Masuit.MyBlogs.Core.Controllers
         [MyAuthorize]
         public async Task<ActionResult> Delete(int id)
         {
-            var post = await MiscService.GetByIdAsync(id) ?? throw new NotFoundException("杂项页已被删除!");
-            var srcs = post.Content.MatchImgSrcs().Where(s => s.StartsWith("/"));
-            foreach (var path in srcs)
-            {
-                try
-                {
-                    System.IO.File.Delete(Path.Combine(HostEnvironment.WebRootPath + path));
-                }
-                catch (IOException)
-                {
-                }
-            }
-
             bool b = await MiscService.DeleteByIdSavedAsync(id) > 0;
             return ResultData(null, b, b ? "删除成功" : "删除失败");
         }

+ 2 - 19
src/Masuit.MyBlogs.Core/Controllers/NoticeController.cs

@@ -7,13 +7,10 @@ using Masuit.MyBlogs.Core.Models.Entity;
 using Masuit.MyBlogs.Core.Models.Enum;
 using Masuit.MyBlogs.Core.Models.ViewModel;
 using Masuit.Tools.Core.Net;
-using Masuit.Tools.Html;
-using Microsoft.AspNetCore.Hosting;
 using Microsoft.AspNetCore.Http;
 using Microsoft.AspNetCore.Mvc;
 using System;
 using System.ComponentModel.DataAnnotations;
-using System.Linq;
 using System.Threading;
 using System.Threading.Tasks;
 
@@ -91,29 +88,15 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <summary>
         /// 删除公告
         /// </summary>
-        /// <param name="hostEnvironment"></param>
         /// <param name="id"></param>
         /// <returns></returns>
         [MyAuthorize]
-        public async Task<ActionResult> Delete([FromServices] IWebHostEnvironment hostEnvironment, int id)
+        public async Task<ActionResult> Delete(int id)
         {
-            var notice = await NoticeService.GetByIdAsync(id) ?? throw new NotFoundException("公告已经被删除!");
-            var srcs = notice.Content.MatchImgSrcs().Where(s => s.StartsWith("/"));
-            foreach (var path in srcs)
-            {
-                try
-                {
-                    System.IO.File.Delete(hostEnvironment.WebRootPath + path);
-                }
-                catch
-                {
-                }
-            }
-
             bool b = await NoticeService.DeleteByIdSavedAsync(id) > 0;
             return ResultData(null, b, b ? "删除成功" : "删除失败");
         }
-
+        
         /// <summary>
         /// 编辑公告
         /// </summary>

+ 1 - 18
src/Masuit.MyBlogs.Core/Controllers/PostController.cs

@@ -27,7 +27,6 @@ using Microsoft.AspNetCore.Mvc;
 using Microsoft.Net.Http.Headers;
 using System;
 using System.ComponentModel.DataAnnotations;
-using System.IO;
 using System.Linq;
 using System.Linq.Dynamic.Core;
 using System.Linq.Expressions;
@@ -621,24 +620,8 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <param name="id"></param>
         /// <returns></returns>
         [MyAuthorize]
-        public async Task<ActionResult> Truncate(int id)
+        public ActionResult Truncate(int id)
         {
-            var post = await PostService.GetByIdAsync(id) ?? throw new NotFoundException("文章未找到");
-            var srcs = post.Content.MatchImgSrcs();
-            foreach (var path in srcs)
-            {
-                if (path.StartsWith("/"))
-                {
-                    try
-                    {
-                        System.IO.File.Delete(HostEnvironment.WebRootPath + path);
-                    }
-                    catch (IOException)
-                    {
-                    }
-                }
-            }
-
             bool b = PostService - id;
             return ResultData(null, b, b ? "删除成功!" : "删除失败!");
         }

+ 2 - 7
src/Masuit.MyBlogs.Core/Controllers/ValidateController.cs

@@ -1,6 +1,6 @@
 using Hangfire;
 using Masuit.MyBlogs.Core.Common;
-using Masuit.Tools;
+using Masuit.Tools.Core.Validator;
 using Masuit.Tools.Systems;
 using Microsoft.AspNetCore.Mvc;
 using System.Threading.Tasks;
@@ -15,13 +15,8 @@ namespace Masuit.MyBlogs.Core.Controllers
         /// <param name="email"></param>
         /// <returns></returns>
         [HttpPost, ValidateAntiForgeryToken, ResponseCache(Duration = 115, VaryByQueryKeys = new[] { "email" })]
-        public async Task<ActionResult> SendCode(string email)
+        public async Task<ActionResult> SendCode([IsEmail] string email)
         {
-            if (string.IsNullOrEmpty(email) || !(await email.MatchEmailAsync(true)).isMatch)
-            {
-                return ResultData(null, false, "请输入正确的邮箱!");
-            }
-
             if (await RedisHelper.ExistsAsync("get:" + email))
             {
                 await RedisHelper.ExpireAsync("get:" + email, 120);

+ 1 - 1
src/Masuit.MyBlogs.Core/Extensions/Hangfire/HangfireBackJob.cs

@@ -193,7 +193,7 @@ namespace Masuit.MyBlogs.Core.Extensions.Hangfire
                     }
                     else
                     {
-                        link.Status = !t.Result.Contains(CommonHelper.SystemSettings["Domain"]) ? Status.Unavailable : Status.Available;
+                        link.Status = !t.Result.Contains(CommonHelper.SystemSettings["Domain"].Split("|")) ? Status.Unavailable : Status.Available;
                     }
 
                     if (link.Status != prev)

+ 1 - 1
src/Masuit.MyBlogs.Core/Masuit.MyBlogs.Core.csproj

@@ -72,7 +72,7 @@
         <PackageReference Include="TimeZoneConverter" Version="3.4.0" />
         <PackageReference Include="WilderMinds.RssSyndication" Version="1.7.0" />
         <PackageReference Include="WinInsider.System.Net.Http.Formatting" Version="1.0.14" />
-        <PackageReference Include="Z.EntityFramework.Plus.EFCore" Version="5.1.23" />
+        <PackageReference Include="Z.EntityFramework.Plus.EFCore" Version="5.1.24" />
     </ItemGroup>
     <ItemGroup>
         <Content Update="appsettings.json">

+ 0 - 5
src/Masuit.MyBlogs.Core/Views/Post/Details.cshtml

@@ -309,11 +309,6 @@
                                         <button type="submit" class="btn btn-info btn-lg">提交</button>
                                         <a class="text-red">评论框可粘贴网络图片</a>
                                     </div>
-                                    <div class="col-xs-6 text-right">
-                                        <a class="btn btn-danger btn-lg" asp-controller="Subscribe" asp-action="CommentsRss" asp-route-id="@Model.Id" target="_blank">
-                                            <i class="icon-rss4"></i><span>订阅本文评论更新</span>
-                                        </a>
-                                    </div>
                                 </div>
                             </form>
                         }

+ 2 - 2
src/Masuit.MyBlogs.Core/appsettings.json

@@ -14,8 +14,8 @@
     },
     "ConnString": "Server=127.0.0.1;Port=3306;Database=MyBlogs;Uid=root;Pwd=;Charset=utf8mb4", // 数据库连接字符串
     "Redis": "127.0.0.1:6379,allowadmin=true,connectTimeout=20000,connectRetry=1,responseTimeout=20000,syncTimeout=10000", // Redis连接字符串
-    "EmailDomainWhiteList": "\\d{6,12}@qq.com,\\w{6,32}@163.com,\\w{6,32}@gmail.com,\\w{6,36}@outlook.com", // 邮箱域名白名单,英文逗号分隔,支持正则表达式
-    "EmailDomainBlockList": "^\\D+.*@qq.com,^\\w{1,5}@163.com,^\\w{1,5}@gmail.com,^\\w{1,5}@outlook.com,bc.com,linshiyouxiang.net,ww.com,@q.com,^.{1,12}$", // 邮箱域名黑名单,英文逗号分隔,支持正则表达式
+    "EmailDomainWhiteList": "masuit.com,ldqk.org,[a-zA-z]{5,32}@qq.com,\\d{6,12}@qq.com,\\w{5,32}@163.com,\\w{5,32}@gmail.com,\\w{5,36}@outlook.com", // 邮箱域名白名单,英文逗号分隔,支持正则表达式
+    "EmailDomainBlockList": "^\\w{1,5}@163.com,^\\w{1,5}@gmail.com,^\\w{1,5}@outlook.com,bc.com,linshiyouxiang.net,ww.com,@q.com,^.{1,12}$", // 邮箱域名黑名单,英文逗号分隔,支持正则表达式
     "UseRewriter": "NonWww", //NonWww:重定向到不带www的域名,WWW:重定向到带www的域名
     "BaiduAK": "你的BaiduAK", // 百度开放平台AppKey,用于获取IP地址信息的api
     "TrueClientIPHeader": "CF-Connecting-IP",