ModSecret.vb 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288
  1. '由于包含加解密等安全信息,本文件中的部分代码已被删除
  2. Imports System.Security.Cryptography
  3. Friend Module ModSecret
  4. #Region "杂项"
  5. '标注 PCL 的不同分支,仅用于替换标记
  6. Public Const VersionBranchMain As String = "OpenSource"
  7. '在开源版的注册表与常规版的注册表隔离,以防数据冲突
  8. Public Const RegFolder As String = "PCLDebug"
  9. '用于微软登录的 ClientId
  10. Public OAuthClientId As String = If(Environment.GetEnvironmentVariable("PCL_MS_CLIENT_ID"), "")
  11. 'CurseForge API Key
  12. Public CurseForgeAPIKey As String = If(Environment.GetEnvironmentVariable("PCL_CURSEFORGE_API_KEY"), "")
  13. '用于匿名数据收集的腾讯云日志服务上报 URL,形如 https://{region}.cls.tencentcs.com/track?topic_id={topic_id}
  14. Public Const ClsBaseUrl As String = ""
  15. Friend Sub SecretOnApplicationStart()
  16. '提升 UI 线程优先级
  17. Thread.CurrentThread.Priority = ThreadPriority.Highest
  18. '确保 .NET Framework 版本
  19. Try
  20. Dim VersionTest As New FormattedText("", Globalization.CultureInfo.CurrentCulture, FlowDirection.LeftToRight, Fonts.SystemTypefaces.First, 96, New MyColor, DPI)
  21. Catch ex As UriFormatException '修复 #3555
  22. Environment.SetEnvironmentVariable("windir", Environment.GetEnvironmentVariable("SystemRoot"), EnvironmentVariableTarget.User)
  23. Dim VersionTest As New FormattedText("", Globalization.CultureInfo.CurrentCulture, FlowDirection.LeftToRight, Fonts.SystemTypefaces.First, 96, New MyColor, DPI)
  24. End Try
  25. '检测当前文件夹权限
  26. Try
  27. Directory.CreateDirectory(Path & "PCL")
  28. Catch ex As Exception
  29. MsgBox($"PCL 无法创建 PCL 文件夹({Path & "PCL"}),请尝试:" & vbCrLf &
  30. "1. 将 PCL 移动到其他文件夹" & If(Path.StartsWithF("C:", True), ",例如 C 盘和桌面以外的其他位置。", "。") & vbCrLf &
  31. "2. 删除当前目录中的 PCL 文件夹,然后再试。" & vbCrLf &
  32. "3. 右键 PCL 选择属性,打开 兼容性 中的 以管理员身份运行此程序。",
  33. MsgBoxStyle.Critical, "运行环境错误")
  34. Environment.[Exit](ProcessReturnValues.Cancel)
  35. End Try
  36. If Not CheckPermission(Path & "PCL") Then
  37. MsgBox("PCL 没有对当前文件夹的写入权限,请尝试:" & vbCrLf &
  38. "1. 将 PCL 移动到其他文件夹" & If(Path.StartsWithF("C:", True), ",例如 C 盘和桌面以外的其他位置。", "。") & vbCrLf &
  39. "2. 删除当前目录中的 PCL 文件夹,然后再试。" & vbCrLf &
  40. "3. 右键 PCL 选择属性,打开 兼容性 中的 以管理员身份运行此程序。",
  41. MsgBoxStyle.Critical, "运行环境错误")
  42. Environment.[Exit](ProcessReturnValues.Cancel)
  43. End If
  44. '开源版本提示
  45. MyMsgBox($"该版本中无法使用以下特性:
  46. - CurseForge API 调用:需要你自行申请 API Key,然后添加到 ModSecret.vb 的开头
  47. - 正版登录:需要你自行申请 Client ID,然后添加到 ModSecret.vb 的开头
  48. - 更新与联网通知:避免滥用隐患
  49. - 主题切换:这是需要赞助解锁的纪念性质的功能,别让赞助者太伤心啦……
  50. - 百宝箱:开发早期往里面塞了些开发工具,整理起来太麻烦了", "开源版本说明")
  51. End Sub
  52. ''' <summary>
  53. ''' 获取设备标识码。
  54. ''' </summary>
  55. Friend Function SecretGetIdentify() As String
  56. Return "0000-0000-0000-0000"
  57. End Function
  58. #End Region
  59. #Region "网络鉴权"
  60. Friend Function SecretCdnSign(UrlWithMark As String) As String
  61. If Not UrlWithMark.EndsWithF("{CDN}") Then Return UrlWithMark
  62. Return UrlWithMark.Replace("{CDN}", "").Replace(" ", "%20")
  63. End Function
  64. ''' <summary>
  65. ''' 设置 Headers 的 UA、Referer。
  66. ''' </summary>
  67. Friend Sub SecretHeadersSign(Url As String, ByRef Req As HttpRequestMessage, Optional SimulateBrowserHeaders As Boolean = False)
  68. If Not Req.Headers.UserAgent.Any Then
  69. If Url.Contains("baidupcs.com") OrElse Url.Contains("baidu.com") Then
  70. Req.Headers.Add("User-Agent", "LogStatistic") '#4951
  71. ElseIf SimulateBrowserHeaders Then
  72. Req.Headers.Add("User-Agent", $"PCL2/{VersionBaseName}.{VersionBranchCode} Mozilla/5.0 AppleWebKit/537.36 Chrome/63.0.3239.132 Safari/537.36")
  73. Else
  74. Req.Headers.Add("User-Agent", $"PCL2/{VersionBaseName}.{VersionBranchCode}")
  75. End If
  76. End If
  77. If Not SimulateBrowserHeaders Then Req.Headers.Add("Referer", $"http://{VersionCode}.open.pcl2.server/")
  78. If Url.Contains("api.curseforge.com") Then Req.Headers.Add("x-api-key", CurseForgeAPIKey)
  79. End Sub
  80. #End Region
  81. #Region "字符串加解密"
  82. ''' <summary>
  83. ''' 获取八位密钥。
  84. ''' </summary>
  85. Private Function SecretKeyGet(Key As String) As String
  86. Return "00000000"
  87. End Function
  88. ''' <summary>
  89. ''' 加密字符串。
  90. ''' </summary>
  91. Friend Function SecretEncrypt(SourceString As String, Optional Key As String = "") As String
  92. Key = SecretKeyGet(Key)
  93. Dim btKey As Byte() = Encoding.UTF8.GetBytes(Key)
  94. Dim btIV As Byte() = Encoding.UTF8.GetBytes("87160295")
  95. Dim des As New DESCryptoServiceProvider
  96. Using MS As New MemoryStream
  97. Dim inData As Byte() = Encoding.UTF8.GetBytes(SourceString)
  98. Using cs As New CryptoStream(MS, des.CreateEncryptor(btKey, btIV), CryptoStreamMode.Write)
  99. cs.Write(inData, 0, inData.Length)
  100. cs.FlushFinalBlock()
  101. Return Convert.ToBase64String(MS.ToArray())
  102. End Using
  103. End Using
  104. End Function
  105. ''' <summary>
  106. ''' 解密字符串。
  107. ''' </summary>
  108. Friend Function SecretDecrypt(SourceString As String, Optional Key As String = "") As String
  109. Key = SecretKeyGet(Key)
  110. Dim btKey As Byte() = Encoding.UTF8.GetBytes(Key)
  111. Dim btIV As Byte() = Encoding.UTF8.GetBytes("87160295")
  112. Dim des As New DESCryptoServiceProvider
  113. Using MS As New MemoryStream
  114. Dim inData As Byte() = Convert.FromBase64String(SourceString)
  115. Using cs As New CryptoStream(MS, des.CreateDecryptor(btKey, btIV), CryptoStreamMode.Write)
  116. cs.Write(inData, 0, inData.Length)
  117. cs.FlushFinalBlock()
  118. Return Encoding.UTF8.GetString(MS.ToArray())
  119. End Using
  120. End Using
  121. End Function
  122. #End Region
  123. #Region "主题"
  124. Public Color1 As New MyColor(52, 61, 74)
  125. Public Color2 As New MyColor(11, 91, 203)
  126. Public Color3 As New MyColor(19, 112, 243)
  127. Public Color4 As New MyColor(72, 144, 245)
  128. Public Color5 As New MyColor(150, 192, 249)
  129. Public Color6 As New MyColor(213, 230, 253)
  130. Public Color7 As New MyColor(222, 236, 253)
  131. Public Color8 As New MyColor(234, 242, 254)
  132. Public ColorBg0 As New MyColor(150, 192, 249)
  133. Public ColorBg1 As New MyColor(190, Color7)
  134. Public ColorGray1 As New MyColor(64, 64, 64)
  135. Public ColorGray2 As New MyColor(115, 115, 115)
  136. Public ColorGray3 As New MyColor(140, 140, 140)
  137. Public ColorGray4 As New MyColor(166, 166, 166)
  138. Public ColorGray5 As New MyColor(204, 204, 204)
  139. Public ColorGray6 As New MyColor(235, 235, 235)
  140. Public ColorGray7 As New MyColor(240, 240, 240)
  141. Public ColorGray8 As New MyColor(245, 245, 245)
  142. Public ColorSemiTransparent As New MyColor(1, Color8)
  143. Public ThemeNow As Integer = -1
  144. Public ColorHue As Integer = 210, ColorSat As Integer = 85, ColorLightAdjust As Integer = 0, ColorHueTopbarDelta As Object = 0
  145. Public ThemeDontClick As Integer = 0
  146. Public Sub ThemeRefresh(Optional NewTheme As Integer = -1)
  147. Try
  148. If ThemeNow = NewTheme AndAlso NewTheme >= 0 Then Return
  149. If NewTheme >= 0 Then ThemeNow = NewTheme
  150. Color1 = New MyColor().FromHSL2(ColorHue, ColorSat * 0.2, 25 + ColorLightAdjust * 0.3)
  151. Color2 = New MyColor().FromHSL2(ColorHue, ColorSat, 45 + ColorLightAdjust)
  152. Color3 = New MyColor().FromHSL2(ColorHue, ColorSat, 55 + ColorLightAdjust)
  153. Color4 = New MyColor().FromHSL2(ColorHue, ColorSat, 65 + ColorLightAdjust)
  154. Color5 = New MyColor().FromHSL2(ColorHue, ColorSat, 80 + ColorLightAdjust * 0.4)
  155. Color6 = New MyColor().FromHSL2(ColorHue, ColorSat, 91 + ColorLightAdjust * 0.1)
  156. Color7 = New MyColor().FromHSL2(ColorHue, ColorSat, 95)
  157. Color8 = New MyColor().FromHSL2(ColorHue, ColorSat, 97)
  158. ColorBg0 = Color4 * 0.4 + Color5 * 0.4 + ColorGray4 * 0.2
  159. ColorBg1 = New MyColor(190, Color7)
  160. ColorSemiTransparent = New MyColor(1, Color8)
  161. Application.Current.Resources("ColorBrush1") = New SolidColorBrush(Color1)
  162. Application.Current.Resources("ColorBrush2") = New SolidColorBrush(Color2)
  163. Application.Current.Resources("ColorBrush3") = New SolidColorBrush(Color3)
  164. Application.Current.Resources("ColorBrush4") = New SolidColorBrush(Color4)
  165. Application.Current.Resources("ColorBrush5") = New SolidColorBrush(Color5)
  166. Application.Current.Resources("ColorBrush6") = New SolidColorBrush(Color6)
  167. Application.Current.Resources("ColorBrush7") = New SolidColorBrush(Color7)
  168. Application.Current.Resources("ColorBrush8") = New SolidColorBrush(Color8)
  169. Application.Current.Resources("ColorBrushBg0") = New SolidColorBrush(ColorBg0)
  170. Application.Current.Resources("ColorBrushBg1") = New SolidColorBrush(ColorBg1)
  171. Application.Current.Resources("ColorObject1") = CType(Color1, Color)
  172. Application.Current.Resources("ColorObject2") = CType(Color2, Color)
  173. Application.Current.Resources("ColorObject3") = CType(Color3, Color)
  174. Application.Current.Resources("ColorObject4") = CType(Color4, Color)
  175. Application.Current.Resources("ColorObject5") = CType(Color5, Color)
  176. Application.Current.Resources("ColorObject6") = CType(Color6, Color)
  177. Application.Current.Resources("ColorObject7") = CType(Color7, Color)
  178. Application.Current.Resources("ColorObject8") = CType(Color8, Color)
  179. Application.Current.Resources("ColorObjectBg0") = CType(ColorBg0, Color)
  180. Application.Current.Resources("ColorObjectBg1") = CType(ColorBg1, Color)
  181. ThemeRefreshMain()
  182. Catch ex As Exception
  183. Log(ex, "刷新主题颜色失败", LogLevel.Hint)
  184. End Try
  185. End Sub
  186. Public Sub ThemeRefreshMain()
  187. RunInUi(
  188. Sub()
  189. If Not FrmMain.IsLoaded Then Return
  190. '顶部条背景
  191. Dim Brush = New LinearGradientBrush With {.EndPoint = New Point(1, 0), .StartPoint = New Point(0, 0)}
  192. If TypeOf ColorHueTopbarDelta Is Integer Then
  193. Brush.GradientStops.Add(New GradientStop With {.Offset = 0, .Color = New MyColor().FromHSL2(ColorHue - ColorHueTopbarDelta, ColorSat, 48 + ColorLightAdjust)})
  194. Brush.GradientStops.Add(New GradientStop With {.Offset = 0.5, .Color = New MyColor().FromHSL2(ColorHue, ColorSat, 54 + ColorLightAdjust)})
  195. Brush.GradientStops.Add(New GradientStop With {.Offset = 1, .Color = New MyColor().FromHSL2(ColorHue + ColorHueTopbarDelta, ColorSat, 48 + ColorLightAdjust)})
  196. Else
  197. Brush.GradientStops.Add(New GradientStop With {.Offset = 0, .Color = New MyColor().FromHSL2(ColorHue + ColorHueTopbarDelta(0), ColorSat, 48 + ColorLightAdjust)})
  198. Brush.GradientStops.Add(New GradientStop With {.Offset = 0.5, .Color = New MyColor().FromHSL2(ColorHue + ColorHueTopbarDelta(1), ColorSat, 54 + ColorLightAdjust)})
  199. Brush.GradientStops.Add(New GradientStop With {.Offset = 1, .Color = New MyColor().FromHSL2(ColorHue + ColorHueTopbarDelta(2), ColorSat, 48 + ColorLightAdjust)})
  200. End If
  201. FrmMain.PanTitle.Background = Brush
  202. FrmMain.PanTitle.Background.Freeze()
  203. '主页面背景
  204. If Settings.Get("UiBackgroundColorful") Then
  205. Brush = New LinearGradientBrush With {.EndPoint = New Point(0.1, 1), .StartPoint = New Point(0.9, 0)}
  206. Brush.GradientStops.Add(New GradientStop With {.Offset = -0.1, .Color = New MyColor().FromHSL2(ColorHue - 15, ColorSat * 0.8, 91)})
  207. Brush.GradientStops.Add(New GradientStop With {.Offset = 0.4, .Color = New MyColor().FromHSL2(ColorHue, ColorSat * 0.8, 91)})
  208. Brush.GradientStops.Add(New GradientStop With {.Offset = 1.1, .Color = New MyColor().FromHSL2(ColorHue + 15, ColorSat * 0.8, 91)})
  209. FrmMain.PanForm.Background = Brush
  210. Else
  211. FrmMain.PanForm.Background = New MyColor(245, 245, 245)
  212. End If
  213. FrmMain.PanForm.Background.Freeze()
  214. End Sub)
  215. End Sub
  216. Friend Sub ThemeCheckAll(EffectSetup As Boolean)
  217. End Sub
  218. Friend Function ThemeCheckOne(Id As Integer) As Boolean
  219. Return True
  220. End Function
  221. Friend Function ThemeUnlock(Id As Integer, Optional ShowDoubleHint As Boolean = True, Optional UnlockHint As String = Nothing) As Boolean
  222. Return False
  223. End Function
  224. Friend Function ThemeCheckGold(Optional Code As String = Nothing) As Boolean
  225. Return False
  226. End Function
  227. Friend Function DonateCodeInput() As Boolean?
  228. Return Nothing
  229. End Function
  230. #End Region
  231. #Region "更新"
  232. Public IsUpdateStarted As Boolean = False
  233. Public IsUpdateWaitingRestart As Boolean = False
  234. Public Sub UpdateCheckByButton()
  235. Hint("该版本中不包含更新功能……")
  236. End Sub
  237. Public Sub UpdateStart(BaseUrl As String, Slient As Boolean, Optional ReceivedKey As String = Nothing, Optional ForceValidated As Boolean = False)
  238. End Sub
  239. Public Sub UpdateRestart(TriggerRestartAndByEnd As Boolean)
  240. End Sub
  241. Public Sub UpdateReplace(ProcessId As Integer, OldFileName As String, NewFileName As String, TriggerRestart As Boolean)
  242. End Sub
  243. ''' <summary>
  244. ''' 确保 PathTemp 下的 Latest.exe 是最新正式版的 PCL,它会被用于整合包打包。
  245. ''' 如果不是,则下载一个。
  246. ''' </summary>
  247. Friend Sub DownloadLatestPCL(Optional LoaderToSyncProgress As LoaderBase = Nothing)
  248. '注意:如果要自行实现这个功能,请换用另一个文件路径,以免与官方版本冲突
  249. End Sub
  250. #End Region
  251. #Region "联网配置"
  252. ''' <summary>
  253. ''' 联网获取的配置信息。
  254. ''' 若获取失败或仍在获取中,可能为 Nothing。
  255. ''' </summary>
  256. Public ServerConfig As JObject
  257. Public ServerLoader As New LoaderTask(Of Integer, Integer)("PCL 配置更新", Sub() Log("[Server] 该版本中不包含更新通知功能……"), Priority:=ThreadPriority.BelowNormal) With
  258. {.ReloadTimeout = 1000 * 60 * 60} '超时 1 小时
  259. #End Region
  260. End Module