RedPolicy.vb 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. '仅保留下载(包括下载所需的版本/依赖元数据)与微软正版登录。
  2. Public Module RedPolicy
  3. Public Const DefaultTheme As Integer = 15
  4. Private ReadOnly MetadataHosts As New HashSet(Of String)(StringComparer.OrdinalIgnoreCase) From {
  5. "launchermeta.mojang.com", "piston-meta.mojang.com", "launcher.mojang.com",
  6. "bmclapi2.bangbang93.com", "optifine.net", "files.minecraftforge.net",
  7. "maven.minecraftforge.net", "maven.neoforged.net", "meta.fabricmc.net",
  8. "dl.liteloader.com", "jenkins.liteloader.com", "api.modrinth.com",
  9. "api.curseforge.com", "mod.mcimirror.top", "files.mcimirror.top"
  10. }
  11. Public Function IsNetworkAllowed(Url As String, Method As HttpMethod, Optional IsFileDownload As Boolean = False) As Boolean
  12. Dim Address As Uri = Nothing
  13. If Not Uri.TryCreate(Url.Replace("{CDN}", ""), UriKind.Absolute, Address) Then Return False
  14. If Address.Scheme <> Uri.UriSchemeHttps AndAlso Address.Scheme <> Uri.UriSchemeHttp Then Return False
  15. Dim Host = Address.IdnHost
  16. Dim RequestMethod = If(Method, HttpMethod.Get).Method.ToUpperInvariant()
  17. Dim ReadOnlyRequest = RequestMethod = "GET" OrElse RequestMethod = "HEAD"
  18. '即使被当作文件下载,也不允许访问旧的公告、更新、遥测服务。
  19. If Host = "pcl2-server-1253424809.file.myqcloud.com" OrElse
  20. Host.EndsWith(".cls.tencentcs.com", StringComparison.OrdinalIgnoreCase) OrElse
  21. Host = "cls.tencentcs.com" Then Return False
  22. If IsFileDownload Then Return ReadOnlyRequest
  23. If Address.Scheme <> Uri.UriSchemeHttps Then Return False
  24. Select Case Host.ToLowerInvariant()
  25. Case "login.microsoftonline.com"
  26. Return RequestMethod = "POST" AndAlso
  27. (Address.AbsolutePath = "/consumers/oauth2/v2.0/devicecode" OrElse Address.AbsolutePath = "/consumers/oauth2/v2.0/token")
  28. Case "login.live.com"
  29. Return RequestMethod = "POST" AndAlso Address.AbsolutePath = "/oauth20_token.srf"
  30. Case "user.auth.xboxlive.com"
  31. Return RequestMethod = "POST" AndAlso Address.AbsolutePath = "/user/authenticate"
  32. Case "xsts.auth.xboxlive.com"
  33. Return RequestMethod = "POST" AndAlso Address.AbsolutePath = "/xsts/authorize"
  34. Case "api.minecraftservices.com"
  35. Return (RequestMethod = "POST" AndAlso Address.AbsolutePath = "/authentication/login_with_xbox") OrElse
  36. (ReadOnlyRequest AndAlso (Address.AbsolutePath = "/entitlements/mcstore" OrElse Address.AbsolutePath = "/minecraft/profile"))
  37. End Select
  38. If Not MetadataHosts.Contains(Host) Then Return False
  39. '资源平台使用 POST 批量查询文件哈希、依赖和下载版本。
  40. Return ReadOnlyRequest OrElse (RequestMethod = "POST" AndAlso
  41. (Host = "api.modrinth.com" OrElse Host = "api.curseforge.com" OrElse Host = "mod.mcimirror.top"))
  42. End Function
  43. Public Sub EnsureNetworkAllowed(Url As String, Method As HttpMethod, Optional IsFileDownload As Boolean = False)
  44. If Not IsNetworkAllowed(Url, Method, IsFileDownload) Then
  45. Throw New NotSupportedException("此修改版仅允许下载及微软正版登录,已禁用此联网功能。")
  46. End If
  47. End Sub
  48. End Module