ModSecret.vb 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  1. '由于包含加解密等安全信息,本文件中的部分代码已被删除
  2. Imports System.Security.Cryptography
  3. Friend Module ModSecret
  4. '标注 PCL 的不同分支,仅用于替换标记
  5. Public Const VersionBranchMain As String = "OpenSource"
  6. '在开源版的注册表与常规版的注册表隔离,以防数据冲突
  7. Public Const RegFolder As String = "PCLDebug"
  8. '用于微软登录的 ClientId
  9. Public OAuthClientId As String = If(Environment.GetEnvironmentVariable("PCL_MS_CLIENT_ID"), "")
  10. 'CurseForge API Key
  11. Public CurseForgeAPIKey As String = If(Environment.GetEnvironmentVariable("PCL_CURSEFORGE_API_KEY"), "")
  12. '用于匿名数据收集的腾讯云日志服务上报 URL,形如 https://{region}.cls.tencentcs.com/track?topic_id={topic_id}
  13. Public Const ClsBaseUrl As String = ""
  14. #Region "网络鉴权"
  15. Friend Function SecretCdnSign(UrlWithMark As String) As String
  16. If Not UrlWithMark.EndsWithF("{CDN}") Then Return UrlWithMark
  17. Return UrlWithMark.Replace("{CDN}", "").Replace(" ", "%20")
  18. End Function
  19. ''' <summary>
  20. ''' 设置 Headers 的 UA、Referer。
  21. ''' </summary>
  22. Friend Sub SecretHeadersSign(Url As String, ByRef Req As HttpRequestMessage, Optional SimulateBrowserHeaders As Boolean = False)
  23. If Not Req.Headers.UserAgent.Any Then
  24. If Url.Contains("baidupcs.com") OrElse Url.Contains("baidu.com") Then
  25. Req.Headers.Add("User-Agent", "LogStatistic") '#4951
  26. ElseIf SimulateBrowserHeaders Then
  27. Req.Headers.Add("User-Agent", $"PCL2/{VersionBaseName}.{CInt(BuildType)} Mozilla/5.0 AppleWebKit/537.36 Chrome/63.0.3239.132 Safari/537.36")
  28. Else
  29. Req.Headers.Add("User-Agent", $"PCL2/{VersionBaseName}.{CInt(BuildType)}")
  30. End If
  31. End If
  32. If Not SimulateBrowserHeaders Then Req.Headers.Add("Referer", $"http://{VersionCode}.open.pcl2.server/")
  33. If Url.Contains("api.curseforge.com") Then Req.Headers.Add("x-api-key", CurseForgeAPIKey)
  34. End Sub
  35. #End Region
  36. #Region "字符串加解密"
  37. ''' <summary>
  38. ''' 获取八位密钥。
  39. ''' </summary>
  40. Private Function SecretKeyGet(Key As String) As String
  41. Return "00000000"
  42. End Function
  43. ''' <summary>
  44. ''' 加密字符串。
  45. ''' </summary>
  46. Friend Function SecretEncrypt(SourceString As String, Optional Key As String = "") As String
  47. Key = SecretKeyGet(Key)
  48. Dim btKey As Byte() = Encoding.UTF8.GetBytes(Key)
  49. Dim btIV As Byte() = Encoding.UTF8.GetBytes("87160295")
  50. Dim des As New DESCryptoServiceProvider
  51. Using MS As New MemoryStream
  52. Dim inData As Byte() = Encoding.UTF8.GetBytes(SourceString)
  53. Using cs As New CryptoStream(MS, des.CreateEncryptor(btKey, btIV), CryptoStreamMode.Write)
  54. cs.Write(inData, 0, inData.Length)
  55. cs.FlushFinalBlock()
  56. Return Convert.ToBase64String(MS.ToArray())
  57. End Using
  58. End Using
  59. End Function
  60. ''' <summary>
  61. ''' 解密字符串。
  62. ''' </summary>
  63. Friend Function SecretDecrypt(SourceString As String, Optional Key As String = "") As String
  64. Key = SecretKeyGet(Key)
  65. Dim btKey As Byte() = Encoding.UTF8.GetBytes(Key)
  66. Dim btIV As Byte() = Encoding.UTF8.GetBytes("87160295")
  67. Dim des As New DESCryptoServiceProvider
  68. Using MS As New MemoryStream
  69. Dim inData As Byte() = Convert.FromBase64String(SourceString)
  70. Using cs As New CryptoStream(MS, des.CreateDecryptor(btKey, btIV), CryptoStreamMode.Write)
  71. cs.Write(inData, 0, inData.Length)
  72. cs.FlushFinalBlock()
  73. Return Encoding.UTF8.GetString(MS.ToArray())
  74. End Using
  75. End Using
  76. End Function
  77. #End Region
  78. #Region "主题"
  79. Public Color1 As New MyColor(52, 61, 74)
  80. Public Color2 As New MyColor(11, 91, 203)
  81. Public Color3 As New MyColor(19, 112, 243)
  82. Public Color4 As New MyColor(72, 144, 245)
  83. Public Color5 As New MyColor(150, 192, 249)
  84. Public Color6 As New MyColor(213, 230, 253)
  85. Public Color7 As New MyColor(222, 236, 253)
  86. Public Color8 As New MyColor(234, 242, 254)
  87. Public ColorBg0 As New MyColor(150, 192, 249)
  88. Public ColorBg1 As New MyColor(190, Color7)
  89. Public ColorGray1 As New MyColor(64, 64, 64)
  90. Public ColorGray2 As New MyColor(115, 115, 115)
  91. Public ColorGray3 As New MyColor(140, 140, 140)
  92. Public ColorGray4 As New MyColor(166, 166, 166)
  93. Public ColorGray5 As New MyColor(204, 204, 204)
  94. Public ColorGray6 As New MyColor(235, 235, 235)
  95. Public ColorGray7 As New MyColor(240, 240, 240)
  96. Public ColorGray8 As New MyColor(245, 245, 245)
  97. Public ColorSemiTransparent As New MyColor(1, Color8)
  98. Public ThemeNow As Integer = -1
  99. Public ColorHue As Integer = 210, ColorSat As Integer = 85, ColorLightAdjust As Integer = 0, ColorHueTopbarDelta As OneOf(Of Integer, Integer()) = 0
  100. Public ThemeDontClick As Integer = 0
  101. Public Sub ThemeRefresh(Optional NewTheme As Integer = -1)
  102. Try
  103. If ThemeNow = NewTheme AndAlso NewTheme >= 0 Then Return
  104. If NewTheme >= 0 Then ThemeNow = NewTheme
  105. Color1 = New MyColor().FromHSL2(ColorHue, ColorSat * 0.2, 25 + ColorLightAdjust * 0.3)
  106. Color2 = New MyColor().FromHSL2(ColorHue, ColorSat, 45 + ColorLightAdjust)
  107. Color3 = New MyColor().FromHSL2(ColorHue, ColorSat, 55 + ColorLightAdjust)
  108. Color4 = New MyColor().FromHSL2(ColorHue, ColorSat, 65 + ColorLightAdjust)
  109. Color5 = New MyColor().FromHSL2(ColorHue, ColorSat, 80 + ColorLightAdjust * 0.4)
  110. Color6 = New MyColor().FromHSL2(ColorHue, ColorSat, 91 + ColorLightAdjust * 0.1)
  111. Color7 = New MyColor().FromHSL2(ColorHue, ColorSat, 95)
  112. Color8 = New MyColor().FromHSL2(ColorHue, ColorSat, 97)
  113. ColorBg0 = Color4 * 0.4 + Color5 * 0.4 + ColorGray4 * 0.2
  114. ColorBg1 = New MyColor(190, Color7)
  115. ColorSemiTransparent = New MyColor(1, Color8)
  116. Application.Current.Resources("ColorBrush1") = New SolidColorBrush(Color1)
  117. Application.Current.Resources("ColorBrush2") = New SolidColorBrush(Color2)
  118. Application.Current.Resources("ColorBrush3") = New SolidColorBrush(Color3)
  119. Application.Current.Resources("ColorBrush4") = New SolidColorBrush(Color4)
  120. Application.Current.Resources("ColorBrush5") = New SolidColorBrush(Color5)
  121. Application.Current.Resources("ColorBrush6") = New SolidColorBrush(Color6)
  122. Application.Current.Resources("ColorBrush7") = New SolidColorBrush(Color7)
  123. Application.Current.Resources("ColorBrush8") = New SolidColorBrush(Color8)
  124. Application.Current.Resources("ColorBrushBg0") = New SolidColorBrush(ColorBg0)
  125. Application.Current.Resources("ColorBrushBg1") = New SolidColorBrush(ColorBg1)
  126. Application.Current.Resources("ColorObject1") = CType(Color1, Color)
  127. Application.Current.Resources("ColorObject2") = CType(Color2, Color)
  128. Application.Current.Resources("ColorObject3") = CType(Color3, Color)
  129. Application.Current.Resources("ColorObject4") = CType(Color4, Color)
  130. Application.Current.Resources("ColorObject5") = CType(Color5, Color)
  131. Application.Current.Resources("ColorObject6") = CType(Color6, Color)
  132. Application.Current.Resources("ColorObject7") = CType(Color7, Color)
  133. Application.Current.Resources("ColorObject8") = CType(Color8, Color)
  134. Application.Current.Resources("ColorObjectBg0") = CType(ColorBg0, Color)
  135. Application.Current.Resources("ColorObjectBg1") = CType(ColorBg1, Color)
  136. ThemeRefreshMain()
  137. Catch ex As Exception
  138. Logger.Warn(ex, "刷新主题颜色失败", NotifyLevel.AllUsers)
  139. End Try
  140. End Sub
  141. Public Sub ThemeRefreshMain()
  142. RunInUi(
  143. Sub()
  144. If Not FrmMain.IsLoaded Then Return
  145. '顶部条背景
  146. Dim Brush = New LinearGradientBrush With {.EndPoint = New Point(1, 0), .StartPoint = New Point(0, 0)}
  147. Dim Deltas = ColorHueTopbarDelta.Switch(Function(d) New Integer() {-d, 0, d}, Function(d) d)
  148. Brush.GradientStops.Add(New GradientStop With {.Offset = 0, .Color = New MyColor().FromHSL2(ColorHue + Deltas(0), ColorSat, 48 + ColorLightAdjust)})
  149. Brush.GradientStops.Add(New GradientStop With {.Offset = 0.5, .Color = New MyColor().FromHSL2(ColorHue + Deltas(1), ColorSat, 54 + ColorLightAdjust)})
  150. Brush.GradientStops.Add(New GradientStop With {.Offset = 1, .Color = New MyColor().FromHSL2(ColorHue + Deltas(2), ColorSat, 48 + ColorLightAdjust)})
  151. FrmMain.PanTitle.Background = Brush
  152. FrmMain.PanTitle.Background.Freeze()
  153. '主页面背景
  154. If Settings.Get(Of Boolean)("UiBackgroundColorful") Then
  155. Brush = New LinearGradientBrush With {.EndPoint = New Point(0.1, 1), .StartPoint = New Point(0.9, 0)}
  156. Brush.GradientStops.Add(New GradientStop With {.Offset = -0.1, .Color = New MyColor().FromHSL2(ColorHue - 15, ColorSat * 0.8, 91)})
  157. Brush.GradientStops.Add(New GradientStop With {.Offset = 0.4, .Color = New MyColor().FromHSL2(ColorHue, ColorSat * 0.8, 91)})
  158. Brush.GradientStops.Add(New GradientStop With {.Offset = 1.1, .Color = New MyColor().FromHSL2(ColorHue + 15, ColorSat * 0.8, 91)})
  159. FrmMain.PanForm.Background = Brush
  160. Else
  161. FrmMain.PanForm.Background = New MyColor(245, 245, 245)
  162. End If
  163. FrmMain.PanForm.Background.Freeze()
  164. End Sub)
  165. End Sub
  166. Friend Sub ThemeCheckAll(EffectSetup As Boolean)
  167. End Sub
  168. Friend Function ThemeCheckOne(Id As Integer) As Boolean
  169. Return True
  170. End Function
  171. Friend Function ThemeUnlock(Id As Integer, Optional ShowDoubleHint As Boolean = True, Optional UnlockHint As String = Nothing) As Boolean
  172. Return False
  173. End Function
  174. #End Region
  175. #Region "更新"
  176. Friend Sub UpdateCheckByButton()
  177. Hint("该版本中不包含更新功能……")
  178. End Sub
  179. Friend IsUpdateWaitingRestart As Boolean = False
  180. Public Sub UpdateRestart(TriggerRestartAndByEnd As Boolean)
  181. End Sub
  182. Public Sub UpdateReplace(ProcessId As Integer, OldFileName As String, NewFileName As String, TriggerRestart As Boolean)
  183. End Sub
  184. ''' <summary>
  185. ''' 确保 PathTemp/Latest.exe 是最新正式版的 PCL,它会被用于整合包打包。
  186. ''' 如果不是,则下载一个。
  187. ''' </summary>
  188. Friend Sub DownloadLatestPCL(Optional LoaderToSyncProgress As LoaderBase = Nothing)
  189. '注意:如果要自行实现这个功能,请换用另一个文件路径,以免与官方版本冲突
  190. End Sub
  191. #End Region
  192. #Region "联网配置"
  193. ''' <summary>
  194. ''' 联网获取的配置信息。
  195. ''' 若获取失败或仍在获取中,可能为 Nothing。
  196. ''' </summary>
  197. Public ServerConfig As JObject
  198. Public ServerLoader As New LoaderTask(Of Integer, Integer)("PCL 配置更新", Sub() Logger.Info("该版本中不包含更新通知功能……"), Priority:=ThreadPriority.BelowNormal) With
  199. {.ReloadTimeout = 1000 * 60 * 60} '超时 1 小时
  200. #End Region
  201. #Region "赞助等级"
  202. Public ReadOnly Property CurrentRank As DonationRank
  203. Get
  204. Return DonationRank.None
  205. End Get
  206. End Property
  207. Public Sub InputPotatoCode(IsUpdating As Boolean)
  208. End Sub
  209. Friend Sub GeneratePotatoCode()
  210. End Sub
  211. ''' <summary>
  212. ''' 获取设备识别码。
  213. ''' </summary>
  214. Friend Function GetIdentify() As String
  215. Return "0000-0000-0000-0000"
  216. End Function
  217. #End Region
  218. End Module