فهرست منبع

优化获取IP信息

懒得勤快 4 سال پیش
والد
کامیت
6ad869f804

+ 43 - 14
src/Masuit.MyBlogs.Core/Common/CommonHelper.cs

@@ -125,8 +125,8 @@ namespace Masuit.MyBlogs.Core.Common
             {
                 foreach (var item in ips.Split(','))
                 {
-                    string pos = GetIPLocation(IPAddress.Parse(item));
-                    return pos.Contains(denyAreas) || denyAreas.Intersect(pos.Split("|")).Any();
+                    var (location, network, pos) = GetIPLocation(IPAddress.Parse(item));
+                    return string.IsNullOrWhiteSpace(location) || string.IsNullOrWhiteSpace(network) || pos.Contains(denyAreas) || denyAreas.Intersect(pos.Split("|")).Any(); // 未知地区的,未知网络的,禁区的
                 }
             }
 
@@ -149,9 +149,19 @@ namespace Masuit.MyBlogs.Core.Common
 
         public static AsnResponse GetIPAsn(this IPAddress ip)
         {
+            if (ip.IsPrivateIP())
+            {
+                return new AsnResponse();
+            }
+
             return Policy<AsnResponse>.Handle<AddressNotFoundException>().Fallback(new AsnResponse()).Execute(() => MaxmindAsnReader.Asn(ip));
         }
 
+        private static CityResponse GetCityResp(IPAddress ip)
+        {
+            return Policy<CityResponse>.Handle<AddressNotFoundException>().Fallback(new CityResponse()).Execute(() => MaxmindReader.City(ip));
+        }
+
         public static string GetIPLocation(this string ips)
         {
             return GetIPLocation(IPAddress.Parse(ips));
@@ -159,11 +169,12 @@ namespace Masuit.MyBlogs.Core.Common
 
         public static IPLocation GetIPLocation(this IPAddress ip)
         {
+            if (ip.IsPrivateIP())
+            {
+                return new IPLocation("内网", null, null, "内网IP", null);
+            }
             switch (ip.AddressFamily)
             {
-                case AddressFamily.InterNetwork when ip.IsPrivateIP():
-                case AddressFamily.InterNetworkV6 when ip.IsPrivateIP():
-                    return new IPLocation("内网", null, null, "内网IP", null);
                 case AddressFamily.InterNetworkV6 when ip.IsIPv4MappedToIPv6:
                     ip = ip.MapToIPv4();
                     goto case AddressFamily.InterNetwork;
@@ -173,12 +184,15 @@ namespace Masuit.MyBlogs.Core.Common
                     {
                         var asn = GetIPAsn(ip);
                         var network = parts[^1] == "0" ? asn.AutonomousSystemOrganization : parts[^1] + "(" + asn.AutonomousSystemOrganization + ")";
+                        var city = new Lazy<CityResponse>(() => GetCityResp(ip));
+                        parts[0] = parts[0] != "0" ? parts[0] : city.Value.Country.Names.GetValueOrDefault("zh-CN");
+                        parts[3] = parts[3] != "0" ? parts[3] : city.Value.City.Names.GetValueOrDefault("zh-CN");
                         return new IPLocation(parts[0], parts[2], parts[3], network, asn.AutonomousSystemNumber);
                     }
 
                     goto default;
                 default:
-                    var cityResp = Policy<CityResponse>.Handle<AddressNotFoundException>().Fallback(new CityResponse()).Execute(() => MaxmindReader.City(ip));
+                    var cityResp = GetCityResp(ip);
                     var asnResp = GetIPAsn(ip);
                     return new IPLocation(cityResp.Country.Names.GetValueOrDefault("zh-CN"), null, cityResp.City.Names.GetValueOrDefault("zh-CN"), asnResp.AutonomousSystemOrganization, asnResp.AutonomousSystemNumber);
             }
@@ -191,15 +205,12 @@ namespace Masuit.MyBlogs.Core.Common
         /// <returns></returns>
         public static string GetClientTimeZone(this IPAddress ip)
         {
-            switch (ip.AddressFamily)
+            if (ip.IsPrivateIP())
             {
-                case AddressFamily.InterNetwork when ip.IsPrivateIP():
-                case AddressFamily.InterNetworkV6 when ip.IsPrivateIP():
-                    return "Asia/Shanghai";
-                default:
-                    var resp = Policy<CityResponse>.Handle<AddressNotFoundException>().Fallback(new CityResponse()).Execute(() => MaxmindReader.City(ip));
-                    return resp.Location.TimeZone ?? "Asia/Shanghai";
+                return "Asia/Shanghai";
             }
+
+            return GetCityResp(ip).Location.TimeZone ?? "Asia/Shanghai";
         }
 
         /// <summary>
@@ -379,7 +390,19 @@ namespace Masuit.MyBlogs.Core.Common
 
         public override string ToString()
         {
-            return Location + "|" + Network;
+            string location = Location;
+            string network = Network;
+            if (string.IsNullOrWhiteSpace(location))
+            {
+                location = string.Intern("未知地区");
+            }
+
+            if (string.IsNullOrWhiteSpace(network))
+            {
+                network = string.Intern("未知网络");
+            }
+
+            return location + "|" + network;
         }
 
         public static implicit operator string(IPLocation entry)
@@ -387,5 +410,11 @@ namespace Masuit.MyBlogs.Core.Common
             return entry.ToString();
         }
 
+        public void Deconstruct(out string location, out string network, out string info)
+        {
+            location = Location;
+            network = Network;
+            info = ToString();
+        }
     }
 }

+ 1 - 1
src/Masuit.MyBlogs.Core/Extensions/Firewall/FirewallAttribute.cs

@@ -57,7 +57,7 @@ namespace Masuit.MyBlogs.Core.Extensions.Firewall
                 };
                 return;
             }
-            if (ip.IsInDenyArea() && !tokenValid)
+            if (ip.IsInDenyArea())
             {
                 AccessDeny(ip, request, "访问地区限制");
                 throw new AccessDenyException("访问地区限制");

+ 6 - 3
src/Masuit.MyBlogs.Core/Infrastructure/Drive/DriveService.cs

@@ -1,6 +1,7 @@
 using Masuit.MyBlogs.Core.Extensions.DriveHelpers;
 using Masuit.MyBlogs.Core.Models.Drive;
 using Microsoft.Graph;
+using System;
 using System.Collections.Generic;
 using System.IO;
 using System.Linq;
@@ -46,6 +47,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Drive
             var files = await GetItems(result, siteName, showHiddenFolders);
             return files;
         }
+
         /// <summary>
         /// 根据路径获取项目
         /// </summary>
@@ -99,7 +101,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Drive
                 //可能是文件夹
                 if (result.AdditionalData.TryGetValue("@microsoft.graph.downloadUrl", out var downloadUrl))
                 {
-                    file.DownloadUrl = ReplaceCDNUrls((string)downloadUrl);
+                    file.DownloadUrl = ReplaceCDNUrls(downloadUrl.ToString());
                 }
             }
 
@@ -136,7 +138,7 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Drive
                     //可能是文件夹
                     if (item.AdditionalData.TryGetValue("@microsoft.graph.downloadUrl", out var downloadUrl))
                     {
-                        file.DownloadUrl = ReplaceCDNUrls((string)downloadUrl);
+                        file.DownloadUrl = ReplaceCDNUrls(downloadUrl.ToString());
                     }
                 }
                 files.Add(file);
@@ -164,8 +166,9 @@ namespace Masuit.MyBlogs.Core.Infrastructure.Drive
         {
             if (OneDriveConfiguration.CDNUrls.Length != 0)
             {
-                return OneDriveConfiguration.CDNUrls.Select(item => item.Split(";")).Aggregate(downloadUrl, (current, a) => current.Replace(a[0], a[1]));
+                return OneDriveConfiguration.CDNUrls.Select(item => item.Split(";")).Where(strings => strings.Length > 1).Aggregate(downloadUrl, (current, strings) => current.Replace(strings[0], strings[1..].OrderBy(_ => Guid.NewGuid()).First()));
             }
+
             return downloadUrl;
         }
         #endregion

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

@@ -45,7 +45,7 @@
         <PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="5.0.8" />
         <PackageReference Include="Microsoft.EntityFrameworkCore.Proxies" Version="5.0.8" />
         <PackageReference Include="Microsoft.Extensions.Http.Polly" Version="5.0.1" />
-        <PackageReference Include="Microsoft.Graph" Version="3.35.0" />
+        <PackageReference Include="Microsoft.Graph" Version="4.0.0" />
         <PackageReference Include="Microsoft.Graph.Auth" Version="1.0.0-preview.6" />
         <PackageReference Include="MiniProfiler.AspNetCore.Mvc" Version="4.2.22" />
         <PackageReference Include="OpenXmlPowerTools-NetStandard" Version="4.4.21" />