mirror of
https://github.com/BeyondDimension/SteamTools.git
synced 2026-10-26 12:09:32 +08:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
40b46966dc | ||
|
|
f2a3d9cab1 | ||
|
|
b68e4e062e | ||
|
|
4f9e6591dc | ||
|
|
b9e03e7ed1 | ||
|
|
b7606b2ec0 | ||
|
|
de01020f8b | ||
|
|
b9742c0514 | ||
|
|
4e1830bd75 | ||
|
|
d6bbb1bd3d | ||
|
|
22dd40d43b | ||
|
|
1d09ed185d | ||
|
|
81467c0a4f | ||
|
|
79982d7ee9 | ||
|
|
c97171cebb | ||
|
|
db66950499 | ||
|
|
8bbfd1dbc3 | ||
|
|
c9ae6f4fdf | ||
|
|
157319b69e | ||
|
|
456f9c13f5 | ||
|
|
055fe2a4d7 | ||
|
|
15c6f575bc | ||
|
|
5b5e5b031a | ||
|
|
faa981eb87 | ||
|
|
648300328c | ||
|
|
57d1c62770 | ||
|
|
14b1e19246 | ||
|
|
5478e1a31e | ||
|
|
a81f1d54f1 | ||
|
|
f9542f87b7 | ||
|
|
a7ce44495a | ||
|
|
d5650f77df | ||
|
|
0041ea7c23 | ||
|
|
dab382441f | ||
|
|
28fc2ee466 | ||
|
|
fe056c8e27 | ||
|
|
cbd2575ad5 | ||
|
|
04c2276c73 | ||
|
|
ea9ee6bda3 | ||
|
|
a0c7d26ee7 | ||
|
|
9002127836 | ||
|
|
42457873ee | ||
|
|
884b2f7244 | ||
|
|
4bedc0f702 | ||
|
|
505ef59c23 | ||
|
|
b1c41f9421 | ||
|
|
07385d0040 | ||
|
|
c9000b1653 | ||
|
|
09bd0f6b5b | ||
|
|
6a90230dbb | ||
|
|
ec70128239 | ||
|
|
f2048bc3e5 | ||
|
|
9000c3bf2a | ||
|
|
3725f9b62f | ||
|
|
2c92e3e6f8 | ||
|
|
f78271c2f5 | ||
|
|
f2bdc19d74 | ||
|
|
0fde0eccba | ||
|
|
5c55fa97e7 | ||
|
|
323c7eb6c3 | ||
|
|
42dea46260 | ||
|
|
1bf65820c0 | ||
|
|
ba1c5b6c8b | ||
|
|
deb6c4eaa1 | ||
|
|
af337a8fbd | ||
|
|
80d14c6c24 | ||
|
|
07d82be4c7 | ||
|
|
1e261f1125 | ||
|
|
8a1bde0773 | ||
|
|
617b99c39d | ||
|
|
8b4680fcee | ||
|
|
e27ae2b202 |
@@ -8,10 +8,10 @@ assignees: ''
|
||||
---
|
||||
|
||||
<!--
|
||||
发布前请先尝试在 Issuse 内搜索一下你的问题是否已经被提出过,
|
||||
发布前请先尝试在 Issues 内搜索一下你的问题是否已经被提出过,
|
||||
详细地描述 bug,让大家都能理解,请一定确定你所要发布的内容是一个 Bug,如果不确定请发 Question
|
||||
别忘了填写标题,标题要简短的描述问题
|
||||
Before posting, please try searching in Issuse to see if your question has already been asked,
|
||||
Before posting, please try searching in Issues to see if your question has already been asked,
|
||||
Describe the bug in detail so that everyone can understand it
|
||||
Don't forget to fill in the title, which should briefly describe the problem
|
||||
-->
|
||||
|
||||
@@ -29,7 +29,7 @@ jobs:
|
||||
submodules: recursive
|
||||
|
||||
- name: Setup .NET 6
|
||||
uses: actions/setup-dotnet@v2
|
||||
uses: actions/setup-dotnet@v3.0.2
|
||||
with:
|
||||
dotnet-version: 6.0.x
|
||||
|
||||
|
||||
@@ -28,7 +28,7 @@ jobs:
|
||||
submodules: recursive
|
||||
|
||||
- name: Setup .NET 6
|
||||
uses: actions/setup-dotnet@v2
|
||||
uses: actions/setup-dotnet@v3.0.2
|
||||
with:
|
||||
dotnet-version: 6.0.x
|
||||
|
||||
@@ -321,7 +321,7 @@ jobs:
|
||||
submodules: recursive
|
||||
|
||||
- name: Setup .NET 6
|
||||
uses: actions/setup-dotnet@v2
|
||||
uses: actions/setup-dotnet@v3.0.2
|
||||
with:
|
||||
dotnet-version: 6.0.x
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@ jobs:
|
||||
submodules: recursive
|
||||
|
||||
- name: Setup .NET 6
|
||||
uses: actions/setup-dotnet@v2
|
||||
uses: actions/setup-dotnet@v3.0.2
|
||||
with:
|
||||
dotnet-version: 6.0.x
|
||||
|
||||
@@ -63,7 +63,7 @@ jobs:
|
||||
# xcode-version: '12.x' # set the latest available Xcode 12
|
||||
|
||||
- name: Setup Android NDK
|
||||
uses: nttld/setup-ndk@v1.0.6
|
||||
uses: nttld/setup-ndk@v1.2.0
|
||||
id: setup-ndk
|
||||
with:
|
||||
ndk-version: r21e
|
||||
|
||||
+63
-61
@@ -5,18 +5,18 @@
|
||||
<PackageVersion Include="Microsoft.Extensions.Http" Version="6.0.0" />
|
||||
<PackageVersion Include="Microsoft.Extensions.Logging" Version="6.0.0" />
|
||||
<PackageVersion Include="Microsoft.Extensions.Configuration.Abstractions" Version="6.0.0" />
|
||||
<PackageVersion Include="Microsoft.Extensions.Logging.AzureAppServices" Version="6.0.8" />
|
||||
<PackageVersion Include="Microsoft.Extensions.Logging.AzureAppServices" Version="6.0.10" />
|
||||
<PackageVersion Include="Microsoft.Extensions.Caching.Memory" Version="6.0.1" />
|
||||
<PackageVersion Include="Microsoft.EntityFrameworkCore.Tools" Version="6.0.8" />
|
||||
<PackageVersion Include="Microsoft.EntityFrameworkCore" Version="6.0.8" />
|
||||
<PackageVersion Include="Microsoft.EntityFrameworkCore.Relational" Version="6.0.8" />
|
||||
<PackageVersion Include="Microsoft.EntityFrameworkCore.SqlServer" Version="6.0.8" />
|
||||
<PackageVersion Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="6.0.8" />
|
||||
<PackageVersion Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="6.0.8" />
|
||||
<PackageVersion Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="6.0.8" />
|
||||
<PackageVersion Include="Microsoft.AspNetCore.Authentication.MicrosoftAccount" Version="6.0.8" />
|
||||
<PackageVersion Include="Microsoft.AspNetCore.Authentication.OpenIdConnect" Version="6.0.8" />
|
||||
<PackageVersion Include="Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" Version="6.0.8" />
|
||||
<PackageVersion Include="Microsoft.EntityFrameworkCore.Tools" Version="6.0.10" />
|
||||
<PackageVersion Include="Microsoft.EntityFrameworkCore" Version="6.0.10" />
|
||||
<PackageVersion Include="Microsoft.EntityFrameworkCore.Relational" Version="6.0.10" />
|
||||
<PackageVersion Include="Microsoft.EntityFrameworkCore.SqlServer" Version="6.0.10" />
|
||||
<PackageVersion Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="6.0.10" />
|
||||
<PackageVersion Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="6.0.10" />
|
||||
<PackageVersion Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="6.0.10" />
|
||||
<PackageVersion Include="Microsoft.AspNetCore.Authentication.MicrosoftAccount" Version="6.0.10" />
|
||||
<PackageVersion Include="Microsoft.AspNetCore.Authentication.OpenIdConnect" Version="6.0.10" />
|
||||
<PackageVersion Include="Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" Version="6.0.10" />
|
||||
</ItemGroup>
|
||||
<ItemGroup Condition=" $(TargetFramework.StartsWith('netstandard')) Or $(TargetFramework.StartsWith('netcoreapp3.1'))">
|
||||
<!-- Microsoft.Extensions.* & AspNetCore & EntityFrameworkCore(NETCOREAPP31) -->
|
||||
@@ -24,7 +24,7 @@
|
||||
<PackageVersion Include="Microsoft.Extensions.Http" Version="3.1.27" />
|
||||
<PackageVersion Include="Microsoft.Extensions.Logging" Version="3.1.27" />
|
||||
<PackageVersion Include="Microsoft.Extensions.Configuration.Abstractions" Version="3.1.27" />
|
||||
<PackageVersion Include="Microsoft.Extensions.Logging.AzureAppServices" Version="3.1.27" />
|
||||
<PackageVersion Include="Microsoft.Extensions.Logging.AzureAppServices" Version="6.0.10" />
|
||||
<PackageVersion Include="Microsoft.Extensions.Caching.Memory" Version="3.1.27" />
|
||||
<PackageVersion Include="Microsoft.EntityFrameworkCore.Tools" Version="3.1.27" />
|
||||
<PackageVersion Include="Microsoft.EntityFrameworkCore" Version="3.1.27" />
|
||||
@@ -40,12 +40,12 @@
|
||||
<ItemGroup Condition=" $(TargetFramework.StartsWith('net6.0')) ">
|
||||
<!-- Entity Framework Plus -->
|
||||
<!-- A FREE & Open Source library to enhance EF6 and EF Core -->
|
||||
<PackageVersion Include="Z.EntityFramework.Plus.EFCore" Version="6.14.3" />
|
||||
<PackageVersion Include="Z.EntityFramework.Plus.EFCore" Version="6.15.2" />
|
||||
|
||||
<!-- AspNetCore 6 OpenId/OAuth -->
|
||||
<PackageVersion Include="AspNet.Security.OpenId.Steam" Version="6.0.0" />
|
||||
<PackageVersion Include="AspNet.Security.OAuth.QQ" Version="6.0.6" />
|
||||
<PackageVersion Include="AspNet.Security.OAuth.Apple" Version="6.0.6" />
|
||||
<PackageVersion Include="AspNet.Security.OAuth.QQ" Version="6.0.12" />
|
||||
<PackageVersion Include="AspNet.Security.OAuth.Apple" Version="6.0.12" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
</ItemGroup>
|
||||
@@ -74,11 +74,11 @@
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<!-- Microsoft.* -->
|
||||
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.2.0" />
|
||||
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="17.4.0" />
|
||||
<!--<PackageVersion Include="Microsoft.Windows.CsWinRT" Version="1.4.1" />-->
|
||||
<!--<PackageVersion Include="Microsoft.Windows.SDK.NET.Ref" Version="10.0.19041.22" />-->
|
||||
<!--<PackageVersion Include="Microsoft.Windows.SDK.Contracts" Version="10.0.19041.1" />-->
|
||||
<PackageVersion Include="Microsoft.Windows.SDK.BuildTools" Version="10.0.22621.1" />
|
||||
<PackageVersion Include="Microsoft.Windows.SDK.BuildTools" Version="10.0.22621.755" />
|
||||
<PackageVersion Include="Microsoft.Extensions.Primitives" Version="6.0.0" />
|
||||
<PackageVersion Include="Microsoft.Net.Http.Headers" Version="2.2.255.255" />
|
||||
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="6.0.0" />
|
||||
@@ -86,11 +86,11 @@
|
||||
<PackageVersion Include="System.Text.Encoding.CodePages" Version="6.0.0" />
|
||||
<PackageVersion Include="System.Diagnostics.PerformanceCounter" Version="6.0.1" />
|
||||
<PackageVersion Include="System.Net.Http.WinHttpHandler" Version="6.0.1" />
|
||||
|
||||
|
||||
<!-- AppCenter.* -->
|
||||
<PackageVersion Include="Microsoft.AppCenter" Version="4.5.3" />
|
||||
<PackageVersion Include="Microsoft.AppCenter.Analytics" Version="4.5.3" />
|
||||
<PackageVersion Include="Microsoft.AppCenter.Crashes" Version="4.5.3" />
|
||||
<PackageVersion Include="Microsoft.AppCenter" Version="5.0.1" />
|
||||
<PackageVersion Include="Microsoft.AppCenter.Analytics" Version="5.0.1" />
|
||||
<PackageVersion Include="Microsoft.AppCenter.Crashes" Version="5.0.1" />
|
||||
<PackageVersion Include="Aigio.Avalonia.AppCenter" Version="4.5.3" />
|
||||
<PackageVersion Include="Aigio.Avalonia.AppCenter.Analytics" Version="4.5.3" />
|
||||
<PackageVersion Include="Aigio.Avalonia.AppCenter.Crashes" Version="4.5.3" />
|
||||
@@ -108,43 +108,43 @@
|
||||
<PackageVersion Include="Xamarin.Forms" Version="5.0.0.2478" />
|
||||
<PackageVersion Include="Xamarin.Forms.Visual.Material" Version="5.0.0.2478" />
|
||||
<PackageVersion Include="Xam.Plugins.Forms.ImageCircle" Version="3.1.1.1-beta" />
|
||||
|
||||
|
||||
<!-- NUnit & NUnit.Xamarin & Moq -->
|
||||
<PackageVersion Include="NUnit" Version="3.13.3" />
|
||||
<PackageVersion Include="NUnit3TestAdapter" Version="4.2.1" />
|
||||
<PackageVersion Include="NUnit3TestAdapter" Version="4.3.1" />
|
||||
<PackageVersion Include="nunit.xamarin" Version="3.6.1" />
|
||||
<PackageVersion Include="PCLStorage" Version="1.0.2" />
|
||||
<PackageVersion Include="Moq" Version="4.18.2" />
|
||||
<PackageVersion Include="Moq" Version="4.18.3" />
|
||||
|
||||
<!-- NLog -->
|
||||
<PackageVersion Include="NLog" Version="5.0.1" />
|
||||
<PackageVersion Include="NLog.Extensions.Logging" Version="5.0.1" />
|
||||
<PackageVersion Include="NLog.Web.AspNetCore" Version="5.1.0" />
|
||||
<PackageVersion Include="NLog" Version="5.1.0" />
|
||||
<PackageVersion Include="NLog.Extensions.Logging" Version="5.2.0" />
|
||||
<PackageVersion Include="NLog.Web.AspNetCore" Version="5.2.0" />
|
||||
<PackageVersion Include="AspNetCore2.NETStandard.NLog.Web.AspNetCore" Version="5.0.0" />
|
||||
|
||||
<!-- ReactiveUI -->
|
||||
<PackageVersion Include="System.Reactive" Version="5.0.0" />
|
||||
<PackageVersion Include="Splat" Version="14.4.1" />
|
||||
<PackageVersion Include="DynamicData" Version="7.9.7" />
|
||||
<PackageVersion Include="ReactiveUI" Version="18.3.1" />
|
||||
<PackageVersion Include="ReactiveUI.Fody" Version="18.3.1" />
|
||||
<PackageVersion Include="ReactiveUI.XamForms" Version="18.3.1" />
|
||||
<PackageVersion Include="ReactiveUI.AndroidX" Version="18.3.1" />
|
||||
<PackageVersion Include="ReactiveUI.Maui" Version="18.3.1" />
|
||||
<PackageVersion Include="Splat" Version="14.6.1" />
|
||||
<PackageVersion Include="DynamicData" Version="7.12.11" />
|
||||
<PackageVersion Include="ReactiveUI" Version="18.4.1" />
|
||||
<PackageVersion Include="ReactiveUI.Fody" Version="18.4.1" />
|
||||
<PackageVersion Include="ReactiveUI.XamForms" Version="18.4.1" />
|
||||
<PackageVersion Include="ReactiveUI.AndroidX" Version="18.4.1" />
|
||||
<PackageVersion Include="ReactiveUI.Maui" Version="18.4.1" />
|
||||
<!-- SkiaSharp & HarfBuzzSharp -->
|
||||
<!-- https://github.com/AvaloniaUI/Avalonia/blob/master/build/HarfBuzzSharp.props -->
|
||||
<PackageVersion Include="HarfBuzzSharp" Version="2.8.2.1-preview.104" />
|
||||
<PackageVersion Include="HarfBuzzSharp.NativeAssets.Linux" Version="2.8.2.1-preview.104" />
|
||||
<PackageVersion Include="HarfBuzzSharp" Version="2.8.2.3" />
|
||||
<PackageVersion Include="HarfBuzzSharp.NativeAssets.Linux" Version="2.8.2.3" />
|
||||
<!-- https://github.com/AvaloniaUI/Avalonia/blob/master/build/SkiaSharp.props -->
|
||||
<PackageVersion Include="SkiaSharp" Version="2.88.1-preview.104" />
|
||||
<PackageVersion Include="SkiaSharp.NativeAssets.Linux" Version="2.88.1-preview.104" />
|
||||
<PackageVersion Include="SkiaSharp" Version="2.88.3" />
|
||||
<PackageVersion Include="SkiaSharp.NativeAssets.Linux" Version="2.88.3" />
|
||||
|
||||
<!-- AutoMapper -->
|
||||
<PackageVersion Include="AutoMapper" Version="11.0.1" />
|
||||
<PackageVersion Include="AutoMapper.Collection" Version="8.0.0" />
|
||||
<PackageVersion Include="AutoMapper" Version="12.0.0" />
|
||||
<PackageVersion Include="AutoMapper.Collection" Version="9.0.0" />
|
||||
<PackageVersion Include="AutoMapper.Collection.EntityFrameworkCore" Version="8.0.0" />
|
||||
<PackageVersion Include="AutoMapper.Extensions.ExpressionMapping" Version="5.1.0" />
|
||||
<PackageVersion Include="AutoMapper.Extensions.Microsoft.DependencyInjection" Version="11.0.0" />
|
||||
<PackageVersion Include="AutoMapper.Extensions.ExpressionMapping" Version="6.0.2" />
|
||||
<PackageVersion Include="AutoMapper.Extensions.Microsoft.DependencyInjection" Version="12.0.0" />
|
||||
|
||||
<!-- QRCode -->
|
||||
<!--<PackageVersion Include="QRCoder" Version="1.4.2" />-->
|
||||
@@ -158,14 +158,14 @@
|
||||
<!--<PackageVersion Include="GtkSharp" Version="3.24.24.38" />-->
|
||||
|
||||
<!-- Compression -->
|
||||
<PackageVersion Include="SharpZipLib" Version="1.3.3" />
|
||||
<PackageVersion Include="SharpZipLib" Version="1.4.1" />
|
||||
<PackageVersion Include="Squid-Box.SevenZipSharp.Lite" Version="1.5.0.366" />
|
||||
<PackageVersion Include="7-Zip.NativeAssets.Win32" Version="21.7.0-preview.1" />
|
||||
<PackageVersion Include="ZstdNet" Version="1.4.5" />
|
||||
|
||||
<!-- Algorithm -->
|
||||
<PackageVersion Include="Crc32.NET" Version="1.2.0" />
|
||||
<PackageVersion Include="gfoidl.Base64" Version="1.1.1" />
|
||||
<PackageVersion Include="gfoidl.Base64" Version="1.1.2" />
|
||||
|
||||
<!--Command Line Tools-->
|
||||
<PackageVersion Include="System.CommandLine" Version="2.0.0-beta4.22272.1" />
|
||||
@@ -190,31 +190,31 @@
|
||||
<!--<PackageVersion Include="AlipaySDKNet.Standard" Version="4.6.109" />-->
|
||||
|
||||
<!-- Excel -->
|
||||
<PackageVersion Include="NPOI" Version="2.5.6" />
|
||||
<PackageVersion Include="NPOI" Version="2.6.0" />
|
||||
|
||||
<!-- Github API -->
|
||||
<PackageVersion Include="Octokit" Version="2.0.0" />
|
||||
<PackageVersion Include="Octokit" Version="4.0.3" />
|
||||
|
||||
<!-- ORM -->
|
||||
<PackageVersion Include="sqlite-net-pcl" Version="1.8.116" />
|
||||
<PackageVersion Include="SQLitePCLRaw.bundle_green" Version="2.1.0" />
|
||||
<PackageVersion Include="SQLitePCLRaw.bundle_green" Version="2.1.3" />
|
||||
|
||||
<!-- MonoMac(NETSTANDARD) -->
|
||||
<PackageVersion Include="MonoMac.NetStandard" Version="0.0.4" />
|
||||
|
||||
<!-- .NET Compat -->
|
||||
<PackageVersion Include="OperatingSystem2" Version="2.0.0" />
|
||||
<PackageVersion Include="JustArchiNET.Madness" Version="3.7.0" />
|
||||
<PackageVersion Include="JustArchiNET.Madness" Version="3.8.0" />
|
||||
|
||||
<!-- Serialize -->
|
||||
<PackageVersion Include="MessagePack" Version="2.4.35" />
|
||||
<PackageVersion Include="Newtonsoft.Json" Version="13.0.1" />
|
||||
<PackageVersion Include="MessagePack" Version="2.4.59" />
|
||||
<PackageVersion Include="Newtonsoft.Json" Version="13.0.2" />
|
||||
|
||||
<!-- Html Parser -->
|
||||
<PackageVersion Include="HtmlAgilityPack" Version="1.11.43" />
|
||||
<PackageVersion Include="HtmlAgilityPack" Version="1.11.46" />
|
||||
|
||||
<!-- Clipboard -->
|
||||
<PackageVersion Include="TextCopy" Version="6.1.0" />
|
||||
<PackageVersion Include="TextCopy" Version="6.2.0" />
|
||||
|
||||
<!-- Nito.* -->
|
||||
<PackageVersion Include="Nito.Comparers" Version="6.2.2" />
|
||||
@@ -229,7 +229,9 @@
|
||||
<PackageVersion Include="Fleck" Version="1.2.0" />
|
||||
|
||||
<!-- DNS -->
|
||||
<PackageVersion Include="DnsClient" Version="1.6.1" />
|
||||
<PackageVersion Include="Ae.DNS.Client" Version="0.0.16" />
|
||||
<!--<PackageVersion Include="Ae.Dns.Protocol" Version="0.0.16" />-->
|
||||
<PackageVersion Include="DnsClient" Version="1.7.0" />
|
||||
<PackageVersion Include="DNS" Version="7.0.0" />
|
||||
|
||||
<!-- Cryptographic Algorithms & Protocols -->
|
||||
@@ -246,12 +248,12 @@
|
||||
<PackageVersion Include="Avalonia.ReactiveUI" Version="0.10.18" />
|
||||
<!--<PackageVersion Include="Avalonia.Direct2D1" Version="0.10.16" />-->
|
||||
<PackageVersion Include="Avalonia.Controls.DataGrid" Version="0.10.18" />
|
||||
<PackageVersion Include="Avalonia.Xaml.Behaviors" Version="0.10.17" />
|
||||
<PackageVersion Include="Avalonia.Xaml.Behaviors" Version="0.10.18" />
|
||||
<!--<PackageVersion Include="Avalonia.AvaloniaEdit" Version="0.10.12.2" />-->
|
||||
<!--<PackageVersion Include="CefNet.Avalonia" Version="93.1.21240.857" />-->
|
||||
<!--<PackageVersion Include="LibVLCSharp.Avalonia" Version="3.5.1" />-->
|
||||
<!--<PackageVersion Include="FluentAvaloniaUI" Version="1.4.1" />-->
|
||||
<PackageVersion Include="LiveChartsCore.SkiaSharpView.Avalonia" Version="2.0.0-beta.350" />
|
||||
<!--<PackageVersion Include="FluentAvaloniaUI" Version="1.4.4" />-->
|
||||
<PackageVersion Include="LiveChartsCore.SkiaSharpView.Avalonia" Version="2.0.0-beta.603" />
|
||||
<PackageVersion Include="JumpLists.Win32.Avalonia" Version="1.0.0" />
|
||||
<PackageVersion Include="Avalonia.Native" Version="0.10.18" />
|
||||
<PackageVersion Include="Avalonia.Win32" Version="0.10.18" />
|
||||
@@ -261,12 +263,12 @@
|
||||
<!--Avalonia End-->
|
||||
|
||||
<!-- Xamarin.Android -->
|
||||
<PackageVersion Include="Xamarin.Build.Download" Version="0.11.3" />
|
||||
<PackageVersion Include="Xamarin.Build.Download" Version="0.11.4" />
|
||||
<PackageVersion Include="Xamarin.Google.Dagger" Version="2.40.5" />
|
||||
<PackageVersion Include="Xamarin.Google.MLKit.BarcodeScanning" Version="116.1.2.5" />
|
||||
<PackageVersion Include="Plugin.CurrentActivity" Version="2.1.0.4" />
|
||||
<PackageVersion Include="de.hdodenhof.circleimageview" Version="3.1.0.4" />
|
||||
<PackageVersion Include="Square.OkHttp3" Version="4.9.3" />
|
||||
<PackageVersion Include="Square.OkHttp3" Version="4.9.3.2" />
|
||||
<PackageVersion Include="Square.Picasso" Version="2.71828.0" />
|
||||
<!--<PackageVersion Include="LeakCanaryBinding" Version="1.5.1.1" />-->
|
||||
<!--<PackageVersion Include="TencentOpenApiSDK.Android" Version="3.5.4.11" />-->
|
||||
@@ -306,14 +308,14 @@
|
||||
<PackageVersion Include="Toast.iOS" Version="1.2.0" />
|
||||
|
||||
<!-- UWP -->
|
||||
<PackageVersion Include="Microsoft.Toolkit.Uwp.Notifications" Version="7.1.2" />
|
||||
<PackageVersion Include="Microsoft.WindowsAppSDK" Version="1.1.3" />
|
||||
<PackageVersion Include="Microsoft.Toolkit.Uwp.Notifications" Version="7.1.3" />
|
||||
<PackageVersion Include="Microsoft.WindowsAppSDK" Version="1.2.221116.1" />
|
||||
|
||||
<!-- Code Style -->
|
||||
<PackageVersion Include="StyleCop.Analyzers" Version="1.2.0-beta.435" />
|
||||
|
||||
<!-- Quartz -->
|
||||
<PackageVersion Include="Quartz.AspNetCore" Version="3.4.0" />
|
||||
<PackageVersion Include="Quartz.AspNetCore" Version="3.5.0" />
|
||||
|
||||
<!-- Yet Another Reverse Proxy -->
|
||||
<PackageVersion Include="Yarp.ReverseProxy" Version="1.1.1" />
|
||||
|
||||
@@ -24,13 +24,9 @@
|
||||
"src\\Common.PinyinLib\\Common.PinyinLib.csproj",
|
||||
"src\\Common.PinyinLib.CFStringTransform\\Common.PinyinLib.CFStringTransform.csproj",
|
||||
"src\\Repositories.sqlite-net-pcl\\Repositories.sqlite-net-pcl.csproj",
|
||||
"src\\ST.Client.Android\\ST.Client.Android.csproj",
|
||||
"src\\ST.Client.Desktop.Mac\\ST.Client.Mac.csproj",
|
||||
"src\\ST.Client.Mobile.Droid.App\\ST.Client.Android.App.csproj",
|
||||
"src\\ST.Client.XamarinForms\\ST.Client.XamarinForms.csproj",
|
||||
"src\\ST.Client.Desktop.Avalonia\\ST.Client.Avalonia.csproj",
|
||||
"src\\ST.Client.Desktop.Avalonia.App\\ST.Client.Avalonia.App.csproj",
|
||||
"src\\ST.Client.iOS\\ST.Client.iOS.csproj",
|
||||
"src\\ST.Client\\ST.Client.csproj",
|
||||
"src\\ST.Services.CloudService.Models\\ST.Services.CloudService.Models.csproj",
|
||||
"src\\ST.Services.CloudService.ViewModels\\ST.Services.CloudService.ViewModels.csproj",
|
||||
@@ -42,11 +38,7 @@
|
||||
"src\\ST.Tools.Translate\\ST.Tools.Translate.csproj",
|
||||
"src\\ST\\ST.csproj",
|
||||
"src\\ST.Client.ResSecrets\\ST.Client.ResSecrets.csproj",
|
||||
"src\\ST.Client.iOS.ResSecrets\\ST.Client.iOS.ResSecrets.csproj",
|
||||
"src\\ST.Client.Android.ResSecrets\\ST.Client.Android.ResSecrets.csproj",
|
||||
"src\\ST.Client.Mac.ResSecrets\\ST.Client.Mac.ResSecrets.csproj",
|
||||
"tests\\Common.UnitTest.Droid.App\\ST.Client.UnitTest.Droid.App.csproj",
|
||||
"tests\\Common.UnitTest.Droid\\ST.Client.UnitTest.Droid.csproj",
|
||||
"tests\\Common.UnitTest\\Common.UnitTest.csproj",
|
||||
"tests\\ST.Client.Desktop.UnitTest\\ST.Client.Desktop.UnitTest.csproj",
|
||||
"tests\\ST.Client.UnitTest\\ST.Client.UnitTest.csproj"
|
||||
|
||||
+1
-350
@@ -115,14 +115,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "UI Framework", "UI Framewor
|
||||
EndProject
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Web API", "Web API", "{4E7DF449-F136-4B90-82CE-D1418CD5123C}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ST.Client.Android", "src\ST.Client.Android\ST.Client.Android.csproj", "{DEF239E4-AC40-4BD8-8D36-5AA6B36AB86B}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ST.Client.iOS", "src\ST.Client.iOS\ST.Client.iOS.csproj", "{7EE23547-B2AC-409D-991C-1FDAE122657C}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ST.Client.XamarinForms", "src\ST.Client.XamarinForms\ST.Client.XamarinForms.csproj", "{3763D6C4-82B7-4C13-9BB8-886FC1BD83B6}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ST.Client.Android.App", "src\ST.Client.Mobile.Droid.App\ST.Client.Android.App.csproj", "{B355E372-27D2-4217-A129-D3355573681F}"
|
||||
EndProject
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Avalonia.Ref", "Avalonia.Ref", "{910D6A0F-42AB-4B65-B532-852E864EC006}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.Native", "src\Avalonia.Native\Avalonia.Native.csproj", "{17FBD44D-D9AA-48C2-9A06-214E8405CF88}"
|
||||
@@ -154,10 +146,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "_Github", "_Github", "{B114
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Common.ClientLib.iOS", "src\Common.ClientLib.iOS\Common.ClientLib.iOS.csproj", "{4658B02A-CB1A-4561-AD9C-3B3FF969D7F0}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ST.Client.UnitTest.Droid", "tests\Common.UnitTest.Droid\ST.Client.UnitTest.Droid.csproj", "{80E6762E-AB43-41E2-BDB4-7A3E24713977}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ST.Client.UnitTest.Droid.App", "tests\Common.UnitTest.Droid.App\ST.Client.UnitTest.Droid.App.csproj", "{AD7B78B0-AE51-4FB7-9B11-4E22A2B538CA}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ST.Client.Desktop.UnitTest", "tests\ST.Client.Desktop.UnitTest\ST.Client.Desktop.UnitTest.csproj", "{5D9E0EAA-2419-426B-BAB4-EA496C1FF7E9}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ST.Client.UnitTest.Resources", "tests\ST.Client.UnitTest.Resources\ST.Client.UnitTest.Resources.csproj", "{FB2CA9B4-71F1-48E8-B9AE-FF4375F4FE43}"
|
||||
@@ -168,12 +156,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Avalonia.Skia.Internals", "
|
||||
EndProject
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Bindings", "Bindings", "{80EBD601-28AC-4840-B9B8-E6064816A443}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ST.Client.Android.V2Ray", "src\ST.Client.Android.V2Ray\ST.Client.Android.V2Ray.csproj", "{4A79264D-5BF5-4F89-8066-44E154BF557F}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Gameloop.Vdf", "references\Gameloop.Vdf\Gameloop.Vdf\Gameloop.Vdf.csproj", "{DFC341E8-5290-428C-8D2B-6DE2AA163FFE}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ST.Client.Android.Shadowsocks", "src\ST.Client.Android.Shadowsocks\ST.Client.Android.Shadowsocks.csproj", "{920EF29F-406F-43A9-B002-29DD6B0B4FBF}"
|
||||
EndProject
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ResSecrets", "ResSecrets", "{17667B53-1A09-45A6-855A-0F07F9AE044F}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ST.Client.Android.ResSecrets", "src\ST.Client.Android.ResSecrets\ST.Client.Android.ResSecrets.csproj", "{68DD3E9C-A96C-4128-8D95-DCD65D1FA277}"
|
||||
@@ -192,10 +176,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FDELauncher", "src\FDELaunc
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Net.Http.Headers", "src\Microsoft.Net.Http.Headers\Microsoft.Net.Http.Headers.csproj", "{C7F109B9-EA88-4B7E-ADB5-D6407686ADE0}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ST.Client.Maui.App", "src\ST.Client.Maui.App\ST.Client.Maui.App.csproj", "{73A9AB65-AF95-4F27-98E2-B3296F9BC198}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ST.Client.Maui", "src\ST.Client.Maui\ST.Client.Maui.csproj", "{48417EE3-BACB-4E04-B48D-B3781862AD81}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Common.Essentials", "src\Common.Essentials\Common.Essentials.csproj", "{41434AB5-48C3-47D4-8721-D118D87F472B}"
|
||||
EndProject
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Common.Essentials.Xamarin", "src\Common.Essentials.Xamarin\Common.Essentials.Xamarin.csproj", "{07C9AC06-5D84-41AB-A3C9-5C5B1A27F526}"
|
||||
@@ -1318,132 +1298,6 @@ Global
|
||||
{D30203AC-97AB-4A51-BFA5-826251C9A28E}.Release|x64.Build.0 = Release|Any CPU
|
||||
{D30203AC-97AB-4A51-BFA5-826251C9A28E}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{D30203AC-97AB-4A51-BFA5-826251C9A28E}.Release|x86.Build.0 = Release|Any CPU
|
||||
{DEF239E4-AC40-4BD8-8D36-5AA6B36AB86B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{DEF239E4-AC40-4BD8-8D36-5AA6B36AB86B}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{DEF239E4-AC40-4BD8-8D36-5AA6B36AB86B}.Debug|ARM.ActiveCfg = Debug|Any CPU
|
||||
{DEF239E4-AC40-4BD8-8D36-5AA6B36AB86B}.Debug|ARM.Build.0 = Debug|Any CPU
|
||||
{DEF239E4-AC40-4BD8-8D36-5AA6B36AB86B}.Debug|ARM64.ActiveCfg = Debug|Any CPU
|
||||
{DEF239E4-AC40-4BD8-8D36-5AA6B36AB86B}.Debug|ARM64.Build.0 = Debug|Any CPU
|
||||
{DEF239E4-AC40-4BD8-8D36-5AA6B36AB86B}.Debug|iPhone.ActiveCfg = Debug|Any CPU
|
||||
{DEF239E4-AC40-4BD8-8D36-5AA6B36AB86B}.Debug|iPhone.Build.0 = Debug|Any CPU
|
||||
{DEF239E4-AC40-4BD8-8D36-5AA6B36AB86B}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
|
||||
{DEF239E4-AC40-4BD8-8D36-5AA6B36AB86B}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
|
||||
{DEF239E4-AC40-4BD8-8D36-5AA6B36AB86B}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{DEF239E4-AC40-4BD8-8D36-5AA6B36AB86B}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{DEF239E4-AC40-4BD8-8D36-5AA6B36AB86B}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{DEF239E4-AC40-4BD8-8D36-5AA6B36AB86B}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{DEF239E4-AC40-4BD8-8D36-5AA6B36AB86B}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{DEF239E4-AC40-4BD8-8D36-5AA6B36AB86B}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{DEF239E4-AC40-4BD8-8D36-5AA6B36AB86B}.Release|ARM.ActiveCfg = Release|Any CPU
|
||||
{DEF239E4-AC40-4BD8-8D36-5AA6B36AB86B}.Release|ARM.Build.0 = Release|Any CPU
|
||||
{DEF239E4-AC40-4BD8-8D36-5AA6B36AB86B}.Release|ARM64.ActiveCfg = Release|Any CPU
|
||||
{DEF239E4-AC40-4BD8-8D36-5AA6B36AB86B}.Release|ARM64.Build.0 = Release|Any CPU
|
||||
{DEF239E4-AC40-4BD8-8D36-5AA6B36AB86B}.Release|iPhone.ActiveCfg = Release|Any CPU
|
||||
{DEF239E4-AC40-4BD8-8D36-5AA6B36AB86B}.Release|iPhone.Build.0 = Release|Any CPU
|
||||
{DEF239E4-AC40-4BD8-8D36-5AA6B36AB86B}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
|
||||
{DEF239E4-AC40-4BD8-8D36-5AA6B36AB86B}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
|
||||
{DEF239E4-AC40-4BD8-8D36-5AA6B36AB86B}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{DEF239E4-AC40-4BD8-8D36-5AA6B36AB86B}.Release|x64.Build.0 = Release|Any CPU
|
||||
{DEF239E4-AC40-4BD8-8D36-5AA6B36AB86B}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{DEF239E4-AC40-4BD8-8D36-5AA6B36AB86B}.Release|x86.Build.0 = Release|Any CPU
|
||||
{7EE23547-B2AC-409D-991C-1FDAE122657C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{7EE23547-B2AC-409D-991C-1FDAE122657C}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{7EE23547-B2AC-409D-991C-1FDAE122657C}.Debug|ARM.ActiveCfg = Debug|Any CPU
|
||||
{7EE23547-B2AC-409D-991C-1FDAE122657C}.Debug|ARM.Build.0 = Debug|Any CPU
|
||||
{7EE23547-B2AC-409D-991C-1FDAE122657C}.Debug|ARM64.ActiveCfg = Debug|Any CPU
|
||||
{7EE23547-B2AC-409D-991C-1FDAE122657C}.Debug|ARM64.Build.0 = Debug|Any CPU
|
||||
{7EE23547-B2AC-409D-991C-1FDAE122657C}.Debug|iPhone.ActiveCfg = Debug|Any CPU
|
||||
{7EE23547-B2AC-409D-991C-1FDAE122657C}.Debug|iPhone.Build.0 = Debug|Any CPU
|
||||
{7EE23547-B2AC-409D-991C-1FDAE122657C}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
|
||||
{7EE23547-B2AC-409D-991C-1FDAE122657C}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
|
||||
{7EE23547-B2AC-409D-991C-1FDAE122657C}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{7EE23547-B2AC-409D-991C-1FDAE122657C}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{7EE23547-B2AC-409D-991C-1FDAE122657C}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{7EE23547-B2AC-409D-991C-1FDAE122657C}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{7EE23547-B2AC-409D-991C-1FDAE122657C}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{7EE23547-B2AC-409D-991C-1FDAE122657C}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{7EE23547-B2AC-409D-991C-1FDAE122657C}.Release|ARM.ActiveCfg = Release|Any CPU
|
||||
{7EE23547-B2AC-409D-991C-1FDAE122657C}.Release|ARM.Build.0 = Release|Any CPU
|
||||
{7EE23547-B2AC-409D-991C-1FDAE122657C}.Release|ARM64.ActiveCfg = Release|Any CPU
|
||||
{7EE23547-B2AC-409D-991C-1FDAE122657C}.Release|ARM64.Build.0 = Release|Any CPU
|
||||
{7EE23547-B2AC-409D-991C-1FDAE122657C}.Release|iPhone.ActiveCfg = Release|Any CPU
|
||||
{7EE23547-B2AC-409D-991C-1FDAE122657C}.Release|iPhone.Build.0 = Release|Any CPU
|
||||
{7EE23547-B2AC-409D-991C-1FDAE122657C}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
|
||||
{7EE23547-B2AC-409D-991C-1FDAE122657C}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
|
||||
{7EE23547-B2AC-409D-991C-1FDAE122657C}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{7EE23547-B2AC-409D-991C-1FDAE122657C}.Release|x64.Build.0 = Release|Any CPU
|
||||
{7EE23547-B2AC-409D-991C-1FDAE122657C}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{7EE23547-B2AC-409D-991C-1FDAE122657C}.Release|x86.Build.0 = Release|Any CPU
|
||||
{3763D6C4-82B7-4C13-9BB8-886FC1BD83B6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{3763D6C4-82B7-4C13-9BB8-886FC1BD83B6}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{3763D6C4-82B7-4C13-9BB8-886FC1BD83B6}.Debug|ARM.ActiveCfg = Debug|Any CPU
|
||||
{3763D6C4-82B7-4C13-9BB8-886FC1BD83B6}.Debug|ARM.Build.0 = Debug|Any CPU
|
||||
{3763D6C4-82B7-4C13-9BB8-886FC1BD83B6}.Debug|ARM64.ActiveCfg = Debug|Any CPU
|
||||
{3763D6C4-82B7-4C13-9BB8-886FC1BD83B6}.Debug|ARM64.Build.0 = Debug|Any CPU
|
||||
{3763D6C4-82B7-4C13-9BB8-886FC1BD83B6}.Debug|iPhone.ActiveCfg = Debug|Any CPU
|
||||
{3763D6C4-82B7-4C13-9BB8-886FC1BD83B6}.Debug|iPhone.Build.0 = Debug|Any CPU
|
||||
{3763D6C4-82B7-4C13-9BB8-886FC1BD83B6}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
|
||||
{3763D6C4-82B7-4C13-9BB8-886FC1BD83B6}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
|
||||
{3763D6C4-82B7-4C13-9BB8-886FC1BD83B6}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{3763D6C4-82B7-4C13-9BB8-886FC1BD83B6}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{3763D6C4-82B7-4C13-9BB8-886FC1BD83B6}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{3763D6C4-82B7-4C13-9BB8-886FC1BD83B6}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{3763D6C4-82B7-4C13-9BB8-886FC1BD83B6}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{3763D6C4-82B7-4C13-9BB8-886FC1BD83B6}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{3763D6C4-82B7-4C13-9BB8-886FC1BD83B6}.Release|ARM.ActiveCfg = Release|Any CPU
|
||||
{3763D6C4-82B7-4C13-9BB8-886FC1BD83B6}.Release|ARM.Build.0 = Release|Any CPU
|
||||
{3763D6C4-82B7-4C13-9BB8-886FC1BD83B6}.Release|ARM64.ActiveCfg = Release|Any CPU
|
||||
{3763D6C4-82B7-4C13-9BB8-886FC1BD83B6}.Release|ARM64.Build.0 = Release|Any CPU
|
||||
{3763D6C4-82B7-4C13-9BB8-886FC1BD83B6}.Release|iPhone.ActiveCfg = Release|Any CPU
|
||||
{3763D6C4-82B7-4C13-9BB8-886FC1BD83B6}.Release|iPhone.Build.0 = Release|Any CPU
|
||||
{3763D6C4-82B7-4C13-9BB8-886FC1BD83B6}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
|
||||
{3763D6C4-82B7-4C13-9BB8-886FC1BD83B6}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
|
||||
{3763D6C4-82B7-4C13-9BB8-886FC1BD83B6}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{3763D6C4-82B7-4C13-9BB8-886FC1BD83B6}.Release|x64.Build.0 = Release|Any CPU
|
||||
{3763D6C4-82B7-4C13-9BB8-886FC1BD83B6}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{3763D6C4-82B7-4C13-9BB8-886FC1BD83B6}.Release|x86.Build.0 = Release|Any CPU
|
||||
{B355E372-27D2-4217-A129-D3355573681F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{B355E372-27D2-4217-A129-D3355573681F}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{B355E372-27D2-4217-A129-D3355573681F}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
|
||||
{B355E372-27D2-4217-A129-D3355573681F}.Debug|ARM.ActiveCfg = Debug|Any CPU
|
||||
{B355E372-27D2-4217-A129-D3355573681F}.Debug|ARM.Build.0 = Debug|Any CPU
|
||||
{B355E372-27D2-4217-A129-D3355573681F}.Debug|ARM.Deploy.0 = Debug|Any CPU
|
||||
{B355E372-27D2-4217-A129-D3355573681F}.Debug|ARM64.ActiveCfg = Debug|Any CPU
|
||||
{B355E372-27D2-4217-A129-D3355573681F}.Debug|ARM64.Build.0 = Debug|Any CPU
|
||||
{B355E372-27D2-4217-A129-D3355573681F}.Debug|ARM64.Deploy.0 = Debug|Any CPU
|
||||
{B355E372-27D2-4217-A129-D3355573681F}.Debug|iPhone.ActiveCfg = Debug|Any CPU
|
||||
{B355E372-27D2-4217-A129-D3355573681F}.Debug|iPhone.Build.0 = Debug|Any CPU
|
||||
{B355E372-27D2-4217-A129-D3355573681F}.Debug|iPhone.Deploy.0 = Debug|Any CPU
|
||||
{B355E372-27D2-4217-A129-D3355573681F}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
|
||||
{B355E372-27D2-4217-A129-D3355573681F}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
|
||||
{B355E372-27D2-4217-A129-D3355573681F}.Debug|iPhoneSimulator.Deploy.0 = Debug|Any CPU
|
||||
{B355E372-27D2-4217-A129-D3355573681F}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{B355E372-27D2-4217-A129-D3355573681F}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{B355E372-27D2-4217-A129-D3355573681F}.Debug|x64.Deploy.0 = Debug|Any CPU
|
||||
{B355E372-27D2-4217-A129-D3355573681F}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{B355E372-27D2-4217-A129-D3355573681F}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{B355E372-27D2-4217-A129-D3355573681F}.Debug|x86.Deploy.0 = Debug|Any CPU
|
||||
{B355E372-27D2-4217-A129-D3355573681F}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{B355E372-27D2-4217-A129-D3355573681F}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{B355E372-27D2-4217-A129-D3355573681F}.Release|Any CPU.Deploy.0 = Release|Any CPU
|
||||
{B355E372-27D2-4217-A129-D3355573681F}.Release|ARM.ActiveCfg = Release|Any CPU
|
||||
{B355E372-27D2-4217-A129-D3355573681F}.Release|ARM.Build.0 = Release|Any CPU
|
||||
{B355E372-27D2-4217-A129-D3355573681F}.Release|ARM.Deploy.0 = Release|Any CPU
|
||||
{B355E372-27D2-4217-A129-D3355573681F}.Release|ARM64.ActiveCfg = Release|Any CPU
|
||||
{B355E372-27D2-4217-A129-D3355573681F}.Release|ARM64.Build.0 = Release|Any CPU
|
||||
{B355E372-27D2-4217-A129-D3355573681F}.Release|ARM64.Deploy.0 = Release|Any CPU
|
||||
{B355E372-27D2-4217-A129-D3355573681F}.Release|iPhone.ActiveCfg = Release|Any CPU
|
||||
{B355E372-27D2-4217-A129-D3355573681F}.Release|iPhone.Build.0 = Release|Any CPU
|
||||
{B355E372-27D2-4217-A129-D3355573681F}.Release|iPhone.Deploy.0 = Release|Any CPU
|
||||
{B355E372-27D2-4217-A129-D3355573681F}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
|
||||
{B355E372-27D2-4217-A129-D3355573681F}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
|
||||
{B355E372-27D2-4217-A129-D3355573681F}.Release|iPhoneSimulator.Deploy.0 = Release|Any CPU
|
||||
{B355E372-27D2-4217-A129-D3355573681F}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{B355E372-27D2-4217-A129-D3355573681F}.Release|x64.Build.0 = Release|Any CPU
|
||||
{B355E372-27D2-4217-A129-D3355573681F}.Release|x64.Deploy.0 = Release|Any CPU
|
||||
{B355E372-27D2-4217-A129-D3355573681F}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{B355E372-27D2-4217-A129-D3355573681F}.Release|x86.Build.0 = Release|Any CPU
|
||||
{B355E372-27D2-4217-A129-D3355573681F}.Release|x86.Deploy.0 = Release|Any CPU
|
||||
{17FBD44D-D9AA-48C2-9A06-214E8405CF88}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{17FBD44D-D9AA-48C2-9A06-214E8405CF88}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{17FBD44D-D9AA-48C2-9A06-214E8405CF88}.Debug|ARM.ActiveCfg = Debug|Any CPU
|
||||
@@ -1668,76 +1522,6 @@ Global
|
||||
{4658B02A-CB1A-4561-AD9C-3B3FF969D7F0}.Release|x64.Build.0 = Release|Any CPU
|
||||
{4658B02A-CB1A-4561-AD9C-3B3FF969D7F0}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{4658B02A-CB1A-4561-AD9C-3B3FF969D7F0}.Release|x86.Build.0 = Release|Any CPU
|
||||
{80E6762E-AB43-41E2-BDB4-7A3E24713977}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{80E6762E-AB43-41E2-BDB4-7A3E24713977}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{80E6762E-AB43-41E2-BDB4-7A3E24713977}.Debug|ARM.ActiveCfg = Debug|Any CPU
|
||||
{80E6762E-AB43-41E2-BDB4-7A3E24713977}.Debug|ARM.Build.0 = Debug|Any CPU
|
||||
{80E6762E-AB43-41E2-BDB4-7A3E24713977}.Debug|ARM64.ActiveCfg = Debug|Any CPU
|
||||
{80E6762E-AB43-41E2-BDB4-7A3E24713977}.Debug|ARM64.Build.0 = Debug|Any CPU
|
||||
{80E6762E-AB43-41E2-BDB4-7A3E24713977}.Debug|iPhone.ActiveCfg = Debug|Any CPU
|
||||
{80E6762E-AB43-41E2-BDB4-7A3E24713977}.Debug|iPhone.Build.0 = Debug|Any CPU
|
||||
{80E6762E-AB43-41E2-BDB4-7A3E24713977}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
|
||||
{80E6762E-AB43-41E2-BDB4-7A3E24713977}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
|
||||
{80E6762E-AB43-41E2-BDB4-7A3E24713977}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{80E6762E-AB43-41E2-BDB4-7A3E24713977}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{80E6762E-AB43-41E2-BDB4-7A3E24713977}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{80E6762E-AB43-41E2-BDB4-7A3E24713977}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{80E6762E-AB43-41E2-BDB4-7A3E24713977}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{80E6762E-AB43-41E2-BDB4-7A3E24713977}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{80E6762E-AB43-41E2-BDB4-7A3E24713977}.Release|ARM.ActiveCfg = Release|Any CPU
|
||||
{80E6762E-AB43-41E2-BDB4-7A3E24713977}.Release|ARM.Build.0 = Release|Any CPU
|
||||
{80E6762E-AB43-41E2-BDB4-7A3E24713977}.Release|ARM64.ActiveCfg = Release|Any CPU
|
||||
{80E6762E-AB43-41E2-BDB4-7A3E24713977}.Release|ARM64.Build.0 = Release|Any CPU
|
||||
{80E6762E-AB43-41E2-BDB4-7A3E24713977}.Release|iPhone.ActiveCfg = Release|Any CPU
|
||||
{80E6762E-AB43-41E2-BDB4-7A3E24713977}.Release|iPhone.Build.0 = Release|Any CPU
|
||||
{80E6762E-AB43-41E2-BDB4-7A3E24713977}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
|
||||
{80E6762E-AB43-41E2-BDB4-7A3E24713977}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
|
||||
{80E6762E-AB43-41E2-BDB4-7A3E24713977}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{80E6762E-AB43-41E2-BDB4-7A3E24713977}.Release|x64.Build.0 = Release|Any CPU
|
||||
{80E6762E-AB43-41E2-BDB4-7A3E24713977}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{80E6762E-AB43-41E2-BDB4-7A3E24713977}.Release|x86.Build.0 = Release|Any CPU
|
||||
{AD7B78B0-AE51-4FB7-9B11-4E22A2B538CA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{AD7B78B0-AE51-4FB7-9B11-4E22A2B538CA}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{AD7B78B0-AE51-4FB7-9B11-4E22A2B538CA}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
|
||||
{AD7B78B0-AE51-4FB7-9B11-4E22A2B538CA}.Debug|ARM.ActiveCfg = Debug|Any CPU
|
||||
{AD7B78B0-AE51-4FB7-9B11-4E22A2B538CA}.Debug|ARM.Build.0 = Debug|Any CPU
|
||||
{AD7B78B0-AE51-4FB7-9B11-4E22A2B538CA}.Debug|ARM.Deploy.0 = Debug|Any CPU
|
||||
{AD7B78B0-AE51-4FB7-9B11-4E22A2B538CA}.Debug|ARM64.ActiveCfg = Debug|Any CPU
|
||||
{AD7B78B0-AE51-4FB7-9B11-4E22A2B538CA}.Debug|ARM64.Build.0 = Debug|Any CPU
|
||||
{AD7B78B0-AE51-4FB7-9B11-4E22A2B538CA}.Debug|ARM64.Deploy.0 = Debug|Any CPU
|
||||
{AD7B78B0-AE51-4FB7-9B11-4E22A2B538CA}.Debug|iPhone.ActiveCfg = Debug|Any CPU
|
||||
{AD7B78B0-AE51-4FB7-9B11-4E22A2B538CA}.Debug|iPhone.Build.0 = Debug|Any CPU
|
||||
{AD7B78B0-AE51-4FB7-9B11-4E22A2B538CA}.Debug|iPhone.Deploy.0 = Debug|Any CPU
|
||||
{AD7B78B0-AE51-4FB7-9B11-4E22A2B538CA}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
|
||||
{AD7B78B0-AE51-4FB7-9B11-4E22A2B538CA}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
|
||||
{AD7B78B0-AE51-4FB7-9B11-4E22A2B538CA}.Debug|iPhoneSimulator.Deploy.0 = Debug|Any CPU
|
||||
{AD7B78B0-AE51-4FB7-9B11-4E22A2B538CA}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{AD7B78B0-AE51-4FB7-9B11-4E22A2B538CA}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{AD7B78B0-AE51-4FB7-9B11-4E22A2B538CA}.Debug|x64.Deploy.0 = Debug|Any CPU
|
||||
{AD7B78B0-AE51-4FB7-9B11-4E22A2B538CA}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{AD7B78B0-AE51-4FB7-9B11-4E22A2B538CA}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{AD7B78B0-AE51-4FB7-9B11-4E22A2B538CA}.Debug|x86.Deploy.0 = Debug|Any CPU
|
||||
{AD7B78B0-AE51-4FB7-9B11-4E22A2B538CA}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{AD7B78B0-AE51-4FB7-9B11-4E22A2B538CA}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{AD7B78B0-AE51-4FB7-9B11-4E22A2B538CA}.Release|Any CPU.Deploy.0 = Release|Any CPU
|
||||
{AD7B78B0-AE51-4FB7-9B11-4E22A2B538CA}.Release|ARM.ActiveCfg = Release|Any CPU
|
||||
{AD7B78B0-AE51-4FB7-9B11-4E22A2B538CA}.Release|ARM.Build.0 = Release|Any CPU
|
||||
{AD7B78B0-AE51-4FB7-9B11-4E22A2B538CA}.Release|ARM.Deploy.0 = Release|Any CPU
|
||||
{AD7B78B0-AE51-4FB7-9B11-4E22A2B538CA}.Release|ARM64.ActiveCfg = Release|Any CPU
|
||||
{AD7B78B0-AE51-4FB7-9B11-4E22A2B538CA}.Release|ARM64.Build.0 = Release|Any CPU
|
||||
{AD7B78B0-AE51-4FB7-9B11-4E22A2B538CA}.Release|ARM64.Deploy.0 = Release|Any CPU
|
||||
{AD7B78B0-AE51-4FB7-9B11-4E22A2B538CA}.Release|iPhone.ActiveCfg = Release|Any CPU
|
||||
{AD7B78B0-AE51-4FB7-9B11-4E22A2B538CA}.Release|iPhone.Build.0 = Release|Any CPU
|
||||
{AD7B78B0-AE51-4FB7-9B11-4E22A2B538CA}.Release|iPhone.Deploy.0 = Release|Any CPU
|
||||
{AD7B78B0-AE51-4FB7-9B11-4E22A2B538CA}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
|
||||
{AD7B78B0-AE51-4FB7-9B11-4E22A2B538CA}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
|
||||
{AD7B78B0-AE51-4FB7-9B11-4E22A2B538CA}.Release|iPhoneSimulator.Deploy.0 = Release|Any CPU
|
||||
{AD7B78B0-AE51-4FB7-9B11-4E22A2B538CA}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{AD7B78B0-AE51-4FB7-9B11-4E22A2B538CA}.Release|x64.Build.0 = Release|Any CPU
|
||||
{AD7B78B0-AE51-4FB7-9B11-4E22A2B538CA}.Release|x64.Deploy.0 = Release|Any CPU
|
||||
{AD7B78B0-AE51-4FB7-9B11-4E22A2B538CA}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{AD7B78B0-AE51-4FB7-9B11-4E22A2B538CA}.Release|x86.Build.0 = Release|Any CPU
|
||||
{AD7B78B0-AE51-4FB7-9B11-4E22A2B538CA}.Release|x86.Deploy.0 = Release|Any CPU
|
||||
{5D9E0EAA-2419-426B-BAB4-EA496C1FF7E9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{5D9E0EAA-2419-426B-BAB4-EA496C1FF7E9}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{5D9E0EAA-2419-426B-BAB4-EA496C1FF7E9}.Debug|ARM.ActiveCfg = Debug|Any CPU
|
||||
@@ -1850,34 +1634,6 @@ Global
|
||||
{47C151DA-D2B1-43F4-A04E-B454E2134852}.Release|x64.Build.0 = Release|Any CPU
|
||||
{47C151DA-D2B1-43F4-A04E-B454E2134852}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{47C151DA-D2B1-43F4-A04E-B454E2134852}.Release|x86.Build.0 = Release|Any CPU
|
||||
{4A79264D-5BF5-4F89-8066-44E154BF557F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{4A79264D-5BF5-4F89-8066-44E154BF557F}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{4A79264D-5BF5-4F89-8066-44E154BF557F}.Debug|ARM.ActiveCfg = Debug|Any CPU
|
||||
{4A79264D-5BF5-4F89-8066-44E154BF557F}.Debug|ARM.Build.0 = Debug|Any CPU
|
||||
{4A79264D-5BF5-4F89-8066-44E154BF557F}.Debug|ARM64.ActiveCfg = Debug|Any CPU
|
||||
{4A79264D-5BF5-4F89-8066-44E154BF557F}.Debug|ARM64.Build.0 = Debug|Any CPU
|
||||
{4A79264D-5BF5-4F89-8066-44E154BF557F}.Debug|iPhone.ActiveCfg = Debug|Any CPU
|
||||
{4A79264D-5BF5-4F89-8066-44E154BF557F}.Debug|iPhone.Build.0 = Debug|Any CPU
|
||||
{4A79264D-5BF5-4F89-8066-44E154BF557F}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
|
||||
{4A79264D-5BF5-4F89-8066-44E154BF557F}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
|
||||
{4A79264D-5BF5-4F89-8066-44E154BF557F}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{4A79264D-5BF5-4F89-8066-44E154BF557F}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{4A79264D-5BF5-4F89-8066-44E154BF557F}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{4A79264D-5BF5-4F89-8066-44E154BF557F}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{4A79264D-5BF5-4F89-8066-44E154BF557F}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{4A79264D-5BF5-4F89-8066-44E154BF557F}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{4A79264D-5BF5-4F89-8066-44E154BF557F}.Release|ARM.ActiveCfg = Release|Any CPU
|
||||
{4A79264D-5BF5-4F89-8066-44E154BF557F}.Release|ARM.Build.0 = Release|Any CPU
|
||||
{4A79264D-5BF5-4F89-8066-44E154BF557F}.Release|ARM64.ActiveCfg = Release|Any CPU
|
||||
{4A79264D-5BF5-4F89-8066-44E154BF557F}.Release|ARM64.Build.0 = Release|Any CPU
|
||||
{4A79264D-5BF5-4F89-8066-44E154BF557F}.Release|iPhone.ActiveCfg = Release|Any CPU
|
||||
{4A79264D-5BF5-4F89-8066-44E154BF557F}.Release|iPhone.Build.0 = Release|Any CPU
|
||||
{4A79264D-5BF5-4F89-8066-44E154BF557F}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
|
||||
{4A79264D-5BF5-4F89-8066-44E154BF557F}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
|
||||
{4A79264D-5BF5-4F89-8066-44E154BF557F}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{4A79264D-5BF5-4F89-8066-44E154BF557F}.Release|x64.Build.0 = Release|Any CPU
|
||||
{4A79264D-5BF5-4F89-8066-44E154BF557F}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{4A79264D-5BF5-4F89-8066-44E154BF557F}.Release|x86.Build.0 = Release|Any CPU
|
||||
{DFC341E8-5290-428C-8D2B-6DE2AA163FFE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{DFC341E8-5290-428C-8D2B-6DE2AA163FFE}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{DFC341E8-5290-428C-8D2B-6DE2AA163FFE}.Debug|ARM.ActiveCfg = Debug|Any CPU
|
||||
@@ -1906,34 +1662,6 @@ Global
|
||||
{DFC341E8-5290-428C-8D2B-6DE2AA163FFE}.Release|x64.Build.0 = Release|Any CPU
|
||||
{DFC341E8-5290-428C-8D2B-6DE2AA163FFE}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{DFC341E8-5290-428C-8D2B-6DE2AA163FFE}.Release|x86.Build.0 = Release|Any CPU
|
||||
{920EF29F-406F-43A9-B002-29DD6B0B4FBF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{920EF29F-406F-43A9-B002-29DD6B0B4FBF}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{920EF29F-406F-43A9-B002-29DD6B0B4FBF}.Debug|ARM.ActiveCfg = Debug|Any CPU
|
||||
{920EF29F-406F-43A9-B002-29DD6B0B4FBF}.Debug|ARM.Build.0 = Debug|Any CPU
|
||||
{920EF29F-406F-43A9-B002-29DD6B0B4FBF}.Debug|ARM64.ActiveCfg = Debug|Any CPU
|
||||
{920EF29F-406F-43A9-B002-29DD6B0B4FBF}.Debug|ARM64.Build.0 = Debug|Any CPU
|
||||
{920EF29F-406F-43A9-B002-29DD6B0B4FBF}.Debug|iPhone.ActiveCfg = Debug|Any CPU
|
||||
{920EF29F-406F-43A9-B002-29DD6B0B4FBF}.Debug|iPhone.Build.0 = Debug|Any CPU
|
||||
{920EF29F-406F-43A9-B002-29DD6B0B4FBF}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
|
||||
{920EF29F-406F-43A9-B002-29DD6B0B4FBF}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
|
||||
{920EF29F-406F-43A9-B002-29DD6B0B4FBF}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{920EF29F-406F-43A9-B002-29DD6B0B4FBF}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{920EF29F-406F-43A9-B002-29DD6B0B4FBF}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{920EF29F-406F-43A9-B002-29DD6B0B4FBF}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{920EF29F-406F-43A9-B002-29DD6B0B4FBF}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{920EF29F-406F-43A9-B002-29DD6B0B4FBF}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{920EF29F-406F-43A9-B002-29DD6B0B4FBF}.Release|ARM.ActiveCfg = Release|Any CPU
|
||||
{920EF29F-406F-43A9-B002-29DD6B0B4FBF}.Release|ARM.Build.0 = Release|Any CPU
|
||||
{920EF29F-406F-43A9-B002-29DD6B0B4FBF}.Release|ARM64.ActiveCfg = Release|Any CPU
|
||||
{920EF29F-406F-43A9-B002-29DD6B0B4FBF}.Release|ARM64.Build.0 = Release|Any CPU
|
||||
{920EF29F-406F-43A9-B002-29DD6B0B4FBF}.Release|iPhone.ActiveCfg = Release|Any CPU
|
||||
{920EF29F-406F-43A9-B002-29DD6B0B4FBF}.Release|iPhone.Build.0 = Release|Any CPU
|
||||
{920EF29F-406F-43A9-B002-29DD6B0B4FBF}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
|
||||
{920EF29F-406F-43A9-B002-29DD6B0B4FBF}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
|
||||
{920EF29F-406F-43A9-B002-29DD6B0B4FBF}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{920EF29F-406F-43A9-B002-29DD6B0B4FBF}.Release|x64.Build.0 = Release|Any CPU
|
||||
{920EF29F-406F-43A9-B002-29DD6B0B4FBF}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{920EF29F-406F-43A9-B002-29DD6B0B4FBF}.Release|x86.Build.0 = Release|Any CPU
|
||||
{68DD3E9C-A96C-4128-8D95-DCD65D1FA277}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{68DD3E9C-A96C-4128-8D95-DCD65D1FA277}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{68DD3E9C-A96C-4128-8D95-DCD65D1FA277}.Debug|ARM.ActiveCfg = Debug|Any CPU
|
||||
@@ -2158,76 +1886,6 @@ Global
|
||||
{C7F109B9-EA88-4B7E-ADB5-D6407686ADE0}.Release|x64.Build.0 = Release|Any CPU
|
||||
{C7F109B9-EA88-4B7E-ADB5-D6407686ADE0}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{C7F109B9-EA88-4B7E-ADB5-D6407686ADE0}.Release|x86.Build.0 = Release|Any CPU
|
||||
{73A9AB65-AF95-4F27-98E2-B3296F9BC198}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{73A9AB65-AF95-4F27-98E2-B3296F9BC198}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{73A9AB65-AF95-4F27-98E2-B3296F9BC198}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
|
||||
{73A9AB65-AF95-4F27-98E2-B3296F9BC198}.Debug|ARM.ActiveCfg = Debug|Any CPU
|
||||
{73A9AB65-AF95-4F27-98E2-B3296F9BC198}.Debug|ARM.Build.0 = Debug|Any CPU
|
||||
{73A9AB65-AF95-4F27-98E2-B3296F9BC198}.Debug|ARM.Deploy.0 = Debug|Any CPU
|
||||
{73A9AB65-AF95-4F27-98E2-B3296F9BC198}.Debug|ARM64.ActiveCfg = Debug|Any CPU
|
||||
{73A9AB65-AF95-4F27-98E2-B3296F9BC198}.Debug|ARM64.Build.0 = Debug|Any CPU
|
||||
{73A9AB65-AF95-4F27-98E2-B3296F9BC198}.Debug|ARM64.Deploy.0 = Debug|Any CPU
|
||||
{73A9AB65-AF95-4F27-98E2-B3296F9BC198}.Debug|iPhone.ActiveCfg = Debug|Any CPU
|
||||
{73A9AB65-AF95-4F27-98E2-B3296F9BC198}.Debug|iPhone.Build.0 = Debug|Any CPU
|
||||
{73A9AB65-AF95-4F27-98E2-B3296F9BC198}.Debug|iPhone.Deploy.0 = Debug|Any CPU
|
||||
{73A9AB65-AF95-4F27-98E2-B3296F9BC198}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
|
||||
{73A9AB65-AF95-4F27-98E2-B3296F9BC198}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
|
||||
{73A9AB65-AF95-4F27-98E2-B3296F9BC198}.Debug|iPhoneSimulator.Deploy.0 = Debug|Any CPU
|
||||
{73A9AB65-AF95-4F27-98E2-B3296F9BC198}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{73A9AB65-AF95-4F27-98E2-B3296F9BC198}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{73A9AB65-AF95-4F27-98E2-B3296F9BC198}.Debug|x64.Deploy.0 = Debug|Any CPU
|
||||
{73A9AB65-AF95-4F27-98E2-B3296F9BC198}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{73A9AB65-AF95-4F27-98E2-B3296F9BC198}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{73A9AB65-AF95-4F27-98E2-B3296F9BC198}.Debug|x86.Deploy.0 = Debug|Any CPU
|
||||
{73A9AB65-AF95-4F27-98E2-B3296F9BC198}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{73A9AB65-AF95-4F27-98E2-B3296F9BC198}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{73A9AB65-AF95-4F27-98E2-B3296F9BC198}.Release|Any CPU.Deploy.0 = Release|Any CPU
|
||||
{73A9AB65-AF95-4F27-98E2-B3296F9BC198}.Release|ARM.ActiveCfg = Release|Any CPU
|
||||
{73A9AB65-AF95-4F27-98E2-B3296F9BC198}.Release|ARM.Build.0 = Release|Any CPU
|
||||
{73A9AB65-AF95-4F27-98E2-B3296F9BC198}.Release|ARM.Deploy.0 = Release|Any CPU
|
||||
{73A9AB65-AF95-4F27-98E2-B3296F9BC198}.Release|ARM64.ActiveCfg = Release|Any CPU
|
||||
{73A9AB65-AF95-4F27-98E2-B3296F9BC198}.Release|ARM64.Build.0 = Release|Any CPU
|
||||
{73A9AB65-AF95-4F27-98E2-B3296F9BC198}.Release|ARM64.Deploy.0 = Release|Any CPU
|
||||
{73A9AB65-AF95-4F27-98E2-B3296F9BC198}.Release|iPhone.ActiveCfg = Release|Any CPU
|
||||
{73A9AB65-AF95-4F27-98E2-B3296F9BC198}.Release|iPhone.Build.0 = Release|Any CPU
|
||||
{73A9AB65-AF95-4F27-98E2-B3296F9BC198}.Release|iPhone.Deploy.0 = Release|Any CPU
|
||||
{73A9AB65-AF95-4F27-98E2-B3296F9BC198}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
|
||||
{73A9AB65-AF95-4F27-98E2-B3296F9BC198}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
|
||||
{73A9AB65-AF95-4F27-98E2-B3296F9BC198}.Release|iPhoneSimulator.Deploy.0 = Release|Any CPU
|
||||
{73A9AB65-AF95-4F27-98E2-B3296F9BC198}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{73A9AB65-AF95-4F27-98E2-B3296F9BC198}.Release|x64.Build.0 = Release|Any CPU
|
||||
{73A9AB65-AF95-4F27-98E2-B3296F9BC198}.Release|x64.Deploy.0 = Release|Any CPU
|
||||
{73A9AB65-AF95-4F27-98E2-B3296F9BC198}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{73A9AB65-AF95-4F27-98E2-B3296F9BC198}.Release|x86.Build.0 = Release|Any CPU
|
||||
{73A9AB65-AF95-4F27-98E2-B3296F9BC198}.Release|x86.Deploy.0 = Release|Any CPU
|
||||
{48417EE3-BACB-4E04-B48D-B3781862AD81}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{48417EE3-BACB-4E04-B48D-B3781862AD81}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{48417EE3-BACB-4E04-B48D-B3781862AD81}.Debug|ARM.ActiveCfg = Debug|Any CPU
|
||||
{48417EE3-BACB-4E04-B48D-B3781862AD81}.Debug|ARM.Build.0 = Debug|Any CPU
|
||||
{48417EE3-BACB-4E04-B48D-B3781862AD81}.Debug|ARM64.ActiveCfg = Debug|Any CPU
|
||||
{48417EE3-BACB-4E04-B48D-B3781862AD81}.Debug|ARM64.Build.0 = Debug|Any CPU
|
||||
{48417EE3-BACB-4E04-B48D-B3781862AD81}.Debug|iPhone.ActiveCfg = Debug|Any CPU
|
||||
{48417EE3-BACB-4E04-B48D-B3781862AD81}.Debug|iPhone.Build.0 = Debug|Any CPU
|
||||
{48417EE3-BACB-4E04-B48D-B3781862AD81}.Debug|iPhoneSimulator.ActiveCfg = Debug|Any CPU
|
||||
{48417EE3-BACB-4E04-B48D-B3781862AD81}.Debug|iPhoneSimulator.Build.0 = Debug|Any CPU
|
||||
{48417EE3-BACB-4E04-B48D-B3781862AD81}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{48417EE3-BACB-4E04-B48D-B3781862AD81}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{48417EE3-BACB-4E04-B48D-B3781862AD81}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{48417EE3-BACB-4E04-B48D-B3781862AD81}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{48417EE3-BACB-4E04-B48D-B3781862AD81}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{48417EE3-BACB-4E04-B48D-B3781862AD81}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{48417EE3-BACB-4E04-B48D-B3781862AD81}.Release|ARM.ActiveCfg = Release|Any CPU
|
||||
{48417EE3-BACB-4E04-B48D-B3781862AD81}.Release|ARM.Build.0 = Release|Any CPU
|
||||
{48417EE3-BACB-4E04-B48D-B3781862AD81}.Release|ARM64.ActiveCfg = Release|Any CPU
|
||||
{48417EE3-BACB-4E04-B48D-B3781862AD81}.Release|ARM64.Build.0 = Release|Any CPU
|
||||
{48417EE3-BACB-4E04-B48D-B3781862AD81}.Release|iPhone.ActiveCfg = Release|Any CPU
|
||||
{48417EE3-BACB-4E04-B48D-B3781862AD81}.Release|iPhone.Build.0 = Release|Any CPU
|
||||
{48417EE3-BACB-4E04-B48D-B3781862AD81}.Release|iPhoneSimulator.ActiveCfg = Release|Any CPU
|
||||
{48417EE3-BACB-4E04-B48D-B3781862AD81}.Release|iPhoneSimulator.Build.0 = Release|Any CPU
|
||||
{48417EE3-BACB-4E04-B48D-B3781862AD81}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{48417EE3-BACB-4E04-B48D-B3781862AD81}.Release|x64.Build.0 = Release|Any CPU
|
||||
{48417EE3-BACB-4E04-B48D-B3781862AD81}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{48417EE3-BACB-4E04-B48D-B3781862AD81}.Release|x86.Build.0 = Release|Any CPU
|
||||
{41434AB5-48C3-47D4-8721-D118D87F472B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{41434AB5-48C3-47D4-8721-D118D87F472B}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{41434AB5-48C3-47D4-8721-D118D87F472B}.Debug|ARM.ActiveCfg = Debug|Any CPU
|
||||
@@ -2637,9 +2295,6 @@ Global
|
||||
{E50441E8-75F3-406E-9921-30BFC211B5CE} = {327FDEE7-C4C8-4AA4-A7B0-8BCE3D75346F}
|
||||
{8E38AAF2-8C7D-4B0D-AB25-AB37EECB4029} = {327FDEE7-C4C8-4AA4-A7B0-8BCE3D75346F}
|
||||
{4E7DF449-F136-4B90-82CE-D1418CD5123C} = {327FDEE7-C4C8-4AA4-A7B0-8BCE3D75346F}
|
||||
{DEF239E4-AC40-4BD8-8D36-5AA6B36AB86B} = {E50441E8-75F3-406E-9921-30BFC211B5CE}
|
||||
{7EE23547-B2AC-409D-991C-1FDAE122657C} = {E50441E8-75F3-406E-9921-30BFC211B5CE}
|
||||
{3763D6C4-82B7-4C13-9BB8-886FC1BD83B6} = {8E38AAF2-8C7D-4B0D-AB25-AB37EECB4029}
|
||||
{910D6A0F-42AB-4B65-B532-852E864EC006} = {E50441E8-75F3-406E-9921-30BFC211B5CE}
|
||||
{17FBD44D-D9AA-48C2-9A06-214E8405CF88} = {910D6A0F-42AB-4B65-B532-852E864EC006}
|
||||
{650572DD-E958-4E42-9B46-1510BA15E571} = {910D6A0F-42AB-4B65-B532-852E864EC006}
|
||||
@@ -2649,16 +2304,12 @@ Global
|
||||
{21C392C5-AE41-421A-A127-1A03C4ACA2AD} = {673FF8CD-9E85-4FA1-ABFC-D1149675E138}
|
||||
{29DE5086-0690-4AE7-9BA9-840F54B249DC} = {E448F863-4C9D-47A4-BC4A-4A1381B54DA4}
|
||||
{4658B02A-CB1A-4561-AD9C-3B3FF969D7F0} = {83186945-EC14-4B3F-8C6F-B205AA184CA4}
|
||||
{80E6762E-AB43-41E2-BDB4-7A3E24713977} = {CC46B486-00D7-49E6-ABA3-FDF8F4868D2B}
|
||||
{AD7B78B0-AE51-4FB7-9B11-4E22A2B538CA} = {CC46B486-00D7-49E6-ABA3-FDF8F4868D2B}
|
||||
{5D9E0EAA-2419-426B-BAB4-EA496C1FF7E9} = {CC46B486-00D7-49E6-ABA3-FDF8F4868D2B}
|
||||
{FB2CA9B4-71F1-48E8-B9AE-FF4375F4FE43} = {CC46B486-00D7-49E6-ABA3-FDF8F4868D2B}
|
||||
{E84FF7BC-FC2A-424E-8780-7DA9B487E23F} = {910D6A0F-42AB-4B65-B532-852E864EC006}
|
||||
{47C151DA-D2B1-43F4-A04E-B454E2134852} = {910D6A0F-42AB-4B65-B532-852E864EC006}
|
||||
{80EBD601-28AC-4840-B9B8-E6064816A443} = {327FDEE7-C4C8-4AA4-A7B0-8BCE3D75346F}
|
||||
{4A79264D-5BF5-4F89-8066-44E154BF557F} = {80EBD601-28AC-4840-B9B8-E6064816A443}
|
||||
{DFC341E8-5290-428C-8D2B-6DE2AA163FFE} = {673FF8CD-9E85-4FA1-ABFC-D1149675E138}
|
||||
{920EF29F-406F-43A9-B002-29DD6B0B4FBF} = {80EBD601-28AC-4840-B9B8-E6064816A443}
|
||||
{17667B53-1A09-45A6-855A-0F07F9AE044F} = {327FDEE7-C4C8-4AA4-A7B0-8BCE3D75346F}
|
||||
{68DD3E9C-A96C-4128-8D95-DCD65D1FA277} = {17667B53-1A09-45A6-855A-0F07F9AE044F}
|
||||
{089D4418-975B-455D-9AE1-B9DEC20FF4B1} = {17667B53-1A09-45A6-855A-0F07F9AE044F}
|
||||
@@ -2667,9 +2318,9 @@ Global
|
||||
{058F9955-8EFE-4BF3-A8F9-44C57B1F812E} = {17667B53-1A09-45A6-855A-0F07F9AE044F}
|
||||
{FA9F0E89-E410-400A-86F3-C603E51E62A8} = {910D6A0F-42AB-4B65-B532-852E864EC006}
|
||||
{C7F109B9-EA88-4B7E-ADB5-D6407686ADE0} = {673FF8CD-9E85-4FA1-ABFC-D1149675E138}
|
||||
{48417EE3-BACB-4E04-B48D-B3781862AD81} = {8E38AAF2-8C7D-4B0D-AB25-AB37EECB4029}
|
||||
{41434AB5-48C3-47D4-8721-D118D87F472B} = {83186945-EC14-4B3F-8C6F-B205AA184CA4}
|
||||
{07C9AC06-5D84-41AB-A3C9-5C5B1A27F526} = {83186945-EC14-4B3F-8C6F-B205AA184CA4}
|
||||
{5C440EC2-9251-4DB5-A14E-68FF37814F12} = {83186945-EC14-4B3F-8C6F-B205AA184CA4}
|
||||
{1891DD14-628D-4921-8A1E-279320312E95} = {327FDEE7-C4C8-4AA4-A7B0-8BCE3D75346F}
|
||||
{3381B512-7CCB-4211-87B0-273260531BFC} = {327FDEE7-C4C8-4AA4-A7B0-8BCE3D75346F}
|
||||
{CCB0CAEB-FEFC-4424-B6F4-53D3BB70154D} = {327FDEE7-C4C8-4AA4-A7B0-8BCE3D75346F}
|
||||
|
||||
Submodule references/ArchiSteamFarm updated: 1d900cc7b7...a427f628e1
Binary file not shown.
Submodule references/SteamAchievementManager updated: b39839a962...b84d4babe5
+40
-41
@@ -1,31 +1,30 @@
|
||||
### 公告
|
||||
1. 非简中语言将默认隐藏加速和脚本功能,仅能通过切换语言并重启程序的方式还原被隐藏的功能
|
||||
2. 因经济状况原因,现已停止短信服务节约开销,后续会推出邮箱注册登录,对于仅使用手机号登录的用户请绑定第三方快速登录,否则注销后将无法再次登录,需要等待至邮箱服务推出后支持会暂时在开放短信服务提供换绑邮箱。
|
||||
3. 自动更新目前仅 Windows 端可用,且由于下载渠道限速可能导致无法更新成功,推荐在官网链接的网盘或群文件中下载压缩包解压覆盖更新(应用商店版由商店更新不受此影响)
|
||||
4. 在 Android 上因系统限制,目前的加速功能无法正常使用,所以此功能已放弃继续开发,如仍想使用需要自行导入证书到系统目录,使用 adb 工具或 Magisk 之类的软件操作,未来会使用不需要证书的加速功能替换此功能
|
||||
5. fde 版本需要安装 [ASP.NET Core 运行时 6.0.8 (x64) 与 .NET Core 运行时 6.0.8 (x64)](https://dotnet.microsoft.com/zh-cn/download/dotnet/6.0)
|
||||
6. Windows x86 与 x64 版本令牌本机加密互不兼容,使用两者版本时注意令牌加密后的文件不能共用。
|
||||
7. 由于新版本加速功能重构,调整了部分加速项目,这会影响旧版本程序使用加速功能
|
||||
8. 为了能继续维持开发,从此版本开始将会添加程序内广告,赞助用户可以在设置中关闭所有广告
|
||||
这是一个修复目前累积问题的版本,也是最后一个.NET 6 的版本,
|
||||
之后桌面端程序将使用.NET 7 + Avalonia 11.0 重构发布新版本。
|
||||
届时也会放弃继续对 Win7/8.1 系统的支持,所以这也意味着这是最后一个支持 Win7/8.1 的版本。
|
||||
也请各位敬请期待之后的 3.0 版本吧~
|
||||
|
||||
<!--
|
||||
### 版本亮点
|
||||
1. .NET 运行时升级至 6.0.8,使用 fde 版本需要升级运行时
|
||||
2. ASF 升级至 V5.2.8.4
|
||||
1. .NET 运行时升级至 6.0.12,使用 fde 版本需要升级运行时
|
||||
2. ASF 升级至 V5.3.2.4
|
||||
-->
|
||||
|
||||
### 修复问题
|
||||
1. 修复 2.8.0 ~ 2.8.2 中 AppData/Config.mpo 文件大小为 0 时导致的程序无法正常启动
|
||||
2. 修复 Windows 上版本更新在 2.8.0 ~ 2.8.2 中非 FDE 版本识别为 FDE 版
|
||||
3. 改进 调整代理模式顺序,Hosts 模式置顶
|
||||
4. 修复 划词翻译等一些 JS 脚本
|
||||
5. 改进 macOS 上的证书安装
|
||||
6. 尝试修复 网络加速中能导致内存泄露的问题
|
||||
7. 改进 非简中默认隐藏加速与脚本仅在 Windows 上生效
|
||||
8. 改进 减少 Android 上的启动时间
|
||||
9. 修复 退出程序时可能引发的闪退
|
||||
10. 修复 macOS/Linux 上设置页面打不开的问题
|
||||
11. 修复 网络加速中网页上出现 Because https://... actually points to WattToolkit itself...
|
||||
12. 尝试修复 ASF 控制台中输入时卡死
|
||||
|
||||
1. 改进 Mac 安装证书的提示,显示执行命令
|
||||
2. 修复 Steam 启动参数在一些场景下无效
|
||||
3. 修复 网络加速 关闭 http 重定向到 https 依然监听 80 端口错误
|
||||
4. 修复 网络加速 仅启用脚本功能 导致代理网站无法访问的错误
|
||||
5. 修复 网络加速 开启系统代理和 PAC 代理后,非代理网站无法正常访问的错误
|
||||
6. 修改 证书安装路径 为本地计算机 而不在是 当前用户 以支持跨用户访问,这项改动可能导致大家需要重新安装一次证书
|
||||
7. 修复 库存游戏 因 Steam 客户端更新导致的加载游戏数据失败问题
|
||||
8. 修复 捐助列表金额显示错位问题
|
||||
9. 修复 Twitch 聊天连接失败问题
|
||||
10. 修复 discord.gg 无法访问导致无法加入频道分享链接问题
|
||||
11. 修复 Steam 没有正确识别 Steam 国服提示问题
|
||||
12. ASF 升级至 V5.3.2.4
|
||||
12. .NET 运行时升级至 6.0.12,使用 fde 版本需要升级运行时
|
||||
13. 新增 Steam 设置可设置 模拟蒸汽平台启动参数
|
||||
<!--
|
||||
|
||||
### 已知问题
|
||||
@@ -61,7 +60,7 @@
|
||||
|
||||
|
||||
[](https://steampp.net)
|
||||
[]()
|
||||
[]()
|
||||
|
||||
|
||||
##### [不知道该下载哪个文件?](./download-guide.md)
|
||||
@@ -70,28 +69,28 @@
|
||||
### 文件校验
|
||||
| File | Checksum (SHA256) |
|
||||
| ---- | ---- |
|
||||
| Steam++_win_x64_v2.8.3.7z | SHA256 |
|
||||
| Steam++_win_x64_fde_v2.8.3.7z | SHA256 |
|
||||
| Steam++_win_x64_v2.8.5.7z | SHA256 |
|
||||
| Steam++_win_x64_fde_v2.8.5.7z | SHA256 |
|
||||
| | |
|
||||
| Steam++_win_x64_v2.8.3.exe | SHA256 |
|
||||
| Steam++_win_x64_fde_v2.8.3.exe | SHA256 |
|
||||
| Steam++_win_x64_v2.8.5.exe | SHA256 |
|
||||
| Steam++_win_x64_fde_v2.8.5.exe | SHA256 |
|
||||
| | |
|
||||
| Steam++_win_x86_v2.8.3.7z | SHA256 |
|
||||
| Steam++_win_x86_fde_v2.8.3.7z | SHA256 |
|
||||
| Steam++_win_x86_v2.8.5.7z | SHA256 |
|
||||
| Steam++_win_x86_fde_v2.8.5.7z | SHA256 |
|
||||
| | |
|
||||
| Steam++_win_x86_v2.8.3.exe | SHA256 |
|
||||
| Steam++_win_x86_fde_v2.8.3.exe | SHA256 |
|
||||
| Steam++_win_x86_v2.8.5.exe | SHA256 |
|
||||
| Steam++_win_x86_fde_v2.8.5.exe | SHA256 |
|
||||
| | |
|
||||
| Steam++_linux_x64_v2.8.3.7z | SHA256 |
|
||||
| Steam++_linux_arm64_v2.8.3.7z | SHA256 |
|
||||
| Steam++_linux_x64_v2.8.5.7z | SHA256 |
|
||||
| Steam++_linux_arm64_v2.8.5.7z | SHA256 |
|
||||
| | |
|
||||
| Steam++_linux_x64_v2.8.3.deb | SHA256 |
|
||||
| Steam++_linux_arm64_v2.8.3.deb | SHA256 |
|
||||
| Steam++_linux_x64_v2.8.5.deb | SHA256 |
|
||||
| Steam++_linux_arm64_v2.8.5.deb | SHA256 |
|
||||
| | |
|
||||
| Steam++_linux_x64_v2.8.3.rpm | SHA256 |
|
||||
| Steam++_linux_arm64_v2.8.3.rpm | SHA256 |
|
||||
| Steam++_linux_x64_v2.8.5.rpm | SHA256 |
|
||||
| Steam++_linux_arm64_v2.8.5.rpm | SHA256 |
|
||||
| | |
|
||||
| Steam++_macos_x64_v2.8.3.dmg | SHA256 |
|
||||
| Steam++_macos_arm64_v2.8.3.dmg | SHA256 |
|
||||
| Steam++_macos_x64_v2.8.5.dmg | SHA256 |
|
||||
| Steam++_macos_arm64_v2.8.5.dmg | SHA256 |
|
||||
| | |
|
||||
| Steam++_android_v2.8.3.apk | SHA256 |
|
||||
| Steam++_android_v2.8.5.apk | SHA256 |
|
||||
|
||||
@@ -61,7 +61,7 @@ public sealed class FileSettingsProvider : ISerializationProvider
|
||||
|
||||
lock (_sync)
|
||||
{
|
||||
using var stream = new FileStream(_path, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite | FileShare.Delete);
|
||||
using var stream = OpenReadWrite(_path);
|
||||
if (stream.Position > 0)
|
||||
{
|
||||
stream.Position = 0;
|
||||
@@ -72,6 +72,28 @@ public sealed class FileSettingsProvider : ISerializationProvider
|
||||
}
|
||||
}
|
||||
|
||||
static FileStream OpenReadWrite(string path)
|
||||
{
|
||||
try
|
||||
{
|
||||
return OpenReadWrite();
|
||||
}
|
||||
catch (Exception)
|
||||
{
|
||||
if (File.Exists(path))
|
||||
{
|
||||
if (IOPath.FileTryDelete(path))
|
||||
{
|
||||
// 直接打开文件流失败,尝试删除后再打开一次
|
||||
return OpenReadWrite();
|
||||
}
|
||||
}
|
||||
throw;
|
||||
}
|
||||
|
||||
FileStream OpenReadWrite() => new(path, FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite | FileShare.Delete);
|
||||
}
|
||||
|
||||
public void Load()
|
||||
{
|
||||
if (File.Exists(_path))
|
||||
|
||||
@@ -8,10 +8,16 @@ public static partial class EnumExtensions
|
||||
/// <summary>
|
||||
/// 返回一个布尔值,该值指示给定的整数值或其名称字符串是否存在于指定的枚举中
|
||||
/// </summary>
|
||||
/// <typeparam name="TEnum"></typeparam>
|
||||
/// <param name="value"></param>
|
||||
/// <returns>如果 enumType 中的某个常量的值等于 value,则为 <see langword="true"/>;否则为 <see langword="false"/></returns>
|
||||
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
||||
public static bool IsDefined(this Enum value) => Enum.IsDefined(value.GetType(), value);
|
||||
public static bool IsDefined<TEnum>(this TEnum value) where TEnum : struct, Enum
|
||||
#if NET5_0_OR_GREATER
|
||||
=> Enum.IsDefined(value);
|
||||
#else
|
||||
=> Enum.IsDefined(typeof(TEnum), value);
|
||||
#endif
|
||||
|
||||
public static TEnum ConvertToEnum<TEnum>(this sbyte value)
|
||||
where TEnum : Enum
|
||||
|
||||
@@ -34,4 +34,23 @@ public static class ProcessExtensions
|
||||
process.Kill();
|
||||
#endif
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 尝试 Process 组件在指定的毫秒数内等待关联进程退出。
|
||||
/// </summary>
|
||||
/// <param name="process"></param>
|
||||
/// <param name="milliseconds"></param>
|
||||
/// <returns></returns>
|
||||
public static bool TryWaitForExit(this Process process, int milliseconds = 9000)
|
||||
{
|
||||
try
|
||||
{
|
||||
return process.WaitForExit(milliseconds);
|
||||
}
|
||||
catch
|
||||
{
|
||||
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -132,6 +132,11 @@ public static class FileEx
|
||||
public const string Qt = ".qt";
|
||||
public const string Wmv = ".wmv";
|
||||
|
||||
/// <summary>
|
||||
/// 导入注册条目 (.reg) 文件是 Regedit.exe 的功能,Regedt32.exe 不支持。您可以使用 Regedit.exe 对基于 Windows NT 4.0 或基于 Windows 2000 的计算机上注册表进行一些更改,但某些更改需要 Regedt32.exe。
|
||||
/// </summary>
|
||||
public const string Reg = ".reg";
|
||||
|
||||
public static readonly string[] ImageFileExtensions = new string[]
|
||||
{
|
||||
PNG,
|
||||
|
||||
@@ -153,6 +153,89 @@ public static class IOPath
|
||||
}
|
||||
}
|
||||
|
||||
static readonly object lock_GetCacheFilePath = new();
|
||||
|
||||
/// <summary>
|
||||
/// 根据缓存子文件夹名称与文件扩展名获取一个缓存文件路径
|
||||
/// </summary>
|
||||
/// <param name="dirName">缓存子文件夹名称</param>
|
||||
/// <param name="fileNamePrefix">文件名前缀</param>
|
||||
/// <param name="fileEx">文件扩展名</param>
|
||||
public static string GetCacheFilePath(string dirName, string fileNamePrefix, string fileEx)
|
||||
{
|
||||
lock (lock_GetCacheFilePath)
|
||||
{
|
||||
var cacheDirPath = Path.Combine(CacheDirectory, dirName);
|
||||
if (!Directory.Exists(cacheDirPath))
|
||||
{
|
||||
Directory.CreateDirectory(cacheDirPath);
|
||||
return GetCacheFilePath();
|
||||
}
|
||||
else
|
||||
{
|
||||
string cacheFilePath;
|
||||
do
|
||||
{
|
||||
cacheFilePath = GetCacheFilePath();
|
||||
} while (File.Exists(cacheFilePath));
|
||||
return cacheFilePath;
|
||||
}
|
||||
|
||||
string GetCacheFilePath() => Path.Combine(cacheDirPath, GetCacheFileName());
|
||||
string GetCacheFileName() => $"{fileNamePrefix}_{DateTimeOffset.Now.Ticks}{Random2.GenerateRandomString(4)}{fileEx}";
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 尝试延时一段时间后删除文件
|
||||
/// </summary>
|
||||
/// <param name="filePath">要删除的文件路径</param>
|
||||
/// <param name="millisecondsDelay">延时等待的毫秒数</param>
|
||||
public static async void TryDeleteInDelay(string filePath, int millisecondsDelay = 9000)
|
||||
{
|
||||
await Task.Delay(millisecondsDelay);
|
||||
FileTryDelete(filePath);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 启动进程后尝试延时一段时间后删除文件
|
||||
/// </summary>
|
||||
/// <param name="process">启动的进程</param>
|
||||
/// <param name="filePath">要删除的文件路径</param>
|
||||
/// <param name="millisecondsDelay">延时等待的毫秒数</param>
|
||||
/// <param name="processWaitMillisecondsDelay">启动的进程等待退出的毫秒数</param>
|
||||
public static void TryDeleteInDelay(Process? process, string filePath, int millisecondsDelay = 9000, int processWaitMillisecondsDelay = 9000)
|
||||
{
|
||||
if (process != null)
|
||||
{
|
||||
var waitForExitResult = process.TryWaitForExit(processWaitMillisecondsDelay);
|
||||
if (!waitForExitResult)
|
||||
{
|
||||
try
|
||||
{
|
||||
process.KillEntireProcessTree();
|
||||
}
|
||||
catch
|
||||
{
|
||||
|
||||
}
|
||||
TryDeleteInDelay(filePath, millisecondsDelay);
|
||||
return;
|
||||
}
|
||||
}
|
||||
FileTryDelete(filePath);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 尝试根据缓存子文件夹名称删除整个缓存子文件夹
|
||||
/// </summary>
|
||||
/// <param name="dirName">缓存子文件夹名称</param>
|
||||
public static void TryDeleteCacheSubDir(string dirName)
|
||||
{
|
||||
var cacheDirPath = Path.Combine(CacheDirectory, dirName);
|
||||
DirTryDelete(cacheDirPath);
|
||||
}
|
||||
|
||||
public abstract class FileSystemBase
|
||||
{
|
||||
protected FileSystemBase()
|
||||
|
||||
@@ -19,6 +19,9 @@ public abstract class HttpPlatformHelperService : IHttpPlatformHelperService
|
||||
ImageFormat.JPEG,
|
||||
ImageFormat.PNG,
|
||||
ImageFormat.GIF,
|
||||
ImageFormat.WebP,
|
||||
ImageFormat.BMP,
|
||||
ImageFormat.ICO,
|
||||
});
|
||||
|
||||
public virtual ImageFormat[] SupportedImageFormats => mSupportedImageFormats.Value;
|
||||
|
||||
@@ -12,7 +12,7 @@ namespace System.Properties
|
||||
/// <item> macOS:\packaging\build-osx-app.sh <CFBundleVersion> <CFBundleShortVersionString> </item>
|
||||
/// </list>
|
||||
/// </summary>
|
||||
public const string Version = "2.8.4";
|
||||
public const string Version = "2.8.5";
|
||||
|
||||
//public const string InfoVersion = Version + "-beta";
|
||||
}
|
||||
|
||||
@@ -190,6 +190,13 @@ namespace System
|
||||
|
||||
#endregion
|
||||
|
||||
// https://learn.microsoft.com/zh-cn/dotnet/standard/serialization/system-text-json/character-casing#case-insensitive-property-matching
|
||||
|
||||
static readonly SJsonSerializerOptions S_options = new()
|
||||
{
|
||||
PropertyNameCaseInsensitive = true,
|
||||
};
|
||||
|
||||
#region Deserialize(反序列化)
|
||||
|
||||
/// <summary>
|
||||
@@ -204,7 +211,7 @@ namespace System
|
||||
{
|
||||
return implType switch
|
||||
{
|
||||
JsonImplType.SystemTextJson => SJsonSerializer.Deserialize<T>(value),
|
||||
JsonImplType.SystemTextJson => SJsonSerializer.Deserialize<T>(value, S_options),
|
||||
_ =>
|
||||
#if NOT_NJSON
|
||||
throw new NotSupportedException(),
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
<PropertyGroup>
|
||||
<!--<TargetFrameworks>MonoAndroid12.0;netstandard2.1;net6.0-android</TargetFrameworks>-->
|
||||
<TargetFrameworks>MonoAndroid12.0;netstandard2.1</TargetFrameworks>
|
||||
<TargetFrameworks>netstandard2.1</TargetFrameworks>
|
||||
<RootNamespace>System</RootNamespace>
|
||||
<AssemblyName>System.Common.PinyinLib.TinyPinyin</AssemblyName>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
|
||||
@@ -20,6 +20,27 @@ public sealed class ReverseProxyHttpClientHandler : DelegatingHandler
|
||||
};
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 发送请求
|
||||
/// </summary>
|
||||
/// <param name="request"></param>
|
||||
/// <param name="cancellationToken"></param>
|
||||
/// <returns></returns>
|
||||
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
|
||||
{
|
||||
var uri = request.RequestUri;
|
||||
if (uri == null)
|
||||
{
|
||||
throw new ApplicationException("The requested URI must be specified.");
|
||||
}
|
||||
|
||||
// 设置请求头 host,修改协议为 http
|
||||
request.Headers.Host = uri.Host;
|
||||
request.RequestUri = new UriBuilder(uri) { Scheme = Uri.UriSchemeHttp }.Uri;
|
||||
|
||||
return await base.SendAsync(request, cancellationToken);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 连接回调
|
||||
/// </summary>
|
||||
|
||||
@@ -17,10 +17,10 @@ internal static class Program
|
||||
{
|
||||
const string ExecutiveName = "Steam++";
|
||||
static BundleArch matchArch;
|
||||
static readonly SemanticVersion runtimeVersion = new(6, 0, 8);
|
||||
static readonly SemanticVersion sdkVersion1 = new(6, 0, 108);
|
||||
static readonly SemanticVersion sdkVersion3 = new(6, 0, 303);
|
||||
static readonly SemanticVersion sdkVersion4 = new(6, 0, 400);
|
||||
static readonly SemanticVersion runtimeVersion = new(6, 0, 12);
|
||||
static readonly SemanticVersion sdkVersion1 = new(6, 0, 112);
|
||||
static readonly SemanticVersion sdkVersion3 = new(6, 0, 307);
|
||||
static readonly SemanticVersion sdkVersion4 = new(6, 0, 404);
|
||||
|
||||
/// <summary>
|
||||
/// 应用程序的主入口点。
|
||||
|
||||
@@ -5,6 +5,6 @@ namespace System.Properties
|
||||
/// <summary>
|
||||
/// 版本号
|
||||
/// </summary>
|
||||
public const string Version = "1.1.0";
|
||||
public const string Version = "1.1.11";
|
||||
}
|
||||
}
|
||||
@@ -2,7 +2,8 @@
|
||||
|
||||
<PropertyGroup>
|
||||
<!--<TargetFrameworks>MonoAndroid12.0;Xamarin.iOS10;net6.0-android;net6.0-windows</TargetFrameworks>-->
|
||||
<TargetFrameworks>MonoAndroid12.0;Xamarin.iOS10;net6.0-windows</TargetFrameworks>
|
||||
<!--<TargetFrameworks>MonoAndroid12.0;Xamarin.iOS10;net6.0-windows</TargetFrameworks>-->
|
||||
<TargetFrameworks>net6.0-windows</TargetFrameworks>
|
||||
<RootNamespace>System.Application.AppCenter</RootNamespace>
|
||||
<AssemblyName>System.Application.SteamTools.Client.AppCenter</AssemblyName>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
|
||||
@@ -245,7 +245,7 @@ public abstract class CommandLineHost : IDisposable
|
||||
// -clt steam -account
|
||||
var steamuser = new Command("steam", "Steam 相关操作");
|
||||
steamuser.AddOption(new Option<string>("-account", "指定对应 Steam 用户名"));
|
||||
steamuser.Handler = CommandHandler.Create(async (string account) =>
|
||||
steamuser.Handler = CommandHandler.Create((string account) =>
|
||||
{
|
||||
if (!string.IsNullOrEmpty(account))
|
||||
{
|
||||
@@ -257,7 +257,7 @@ public abstract class CommandLineHost : IDisposable
|
||||
|
||||
var currentuser = users.Where(s => s.AccountName == account).FirstOrDefault();
|
||||
|
||||
await steamService.ShutdownSteamAsync();
|
||||
steamService.TryKillSteamProcess();
|
||||
|
||||
if (currentuser != null)
|
||||
{
|
||||
@@ -266,7 +266,7 @@ public abstract class CommandLineHost : IDisposable
|
||||
steamService.SetCurrentUser(account);
|
||||
}
|
||||
|
||||
steamService.StartSteam();
|
||||
steamService.StartSteamWithParameter();
|
||||
}
|
||||
});
|
||||
rootCommand.AddCommand(steamuser);
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
<Identity
|
||||
Name="4651ED44255E.47979655102CE"
|
||||
Publisher="CN=A90E406B-B2D3-4A23-B061-0FA1D65C4F66"
|
||||
Version="2.8.3.0" />
|
||||
Version="2.8.5.0" />
|
||||
|
||||
<Properties>
|
||||
<DisplayName>Watt Toolkit</DisplayName>
|
||||
|
||||
@@ -10,6 +10,7 @@ using NLog;
|
||||
using Avalonia;
|
||||
using Avalonia.ReactiveUI;
|
||||
using Avalonia.Controls;
|
||||
using System.Net.Http;
|
||||
|
||||
#if WINDOWS || WINDOWS_DESKTOP_BRIDGE
|
||||
using WPFMessageBox = System.Windows.MessageBox;
|
||||
@@ -47,6 +48,10 @@ namespace System.Application.UI
|
||||
// fix The request was aborted: Could not create SSL/TLS secure channel
|
||||
TrySetSecurityProtocol();
|
||||
|
||||
#if WINDOWS || WINDOWS_DESKTOP_BRIDGE
|
||||
HttpClient.DefaultProxy = DynamicHttpWindowsProxy.Instance;
|
||||
#endif
|
||||
|
||||
#if WINDOWS_DESKTOP_BRIDGE
|
||||
if (!DesktopBridgeHelper.Init()) return 0;
|
||||
InitWithUWP(ref args);
|
||||
|
||||
@@ -32,14 +32,22 @@
|
||||
<DefineConstants>MAC;PUBLISH;$(DefineConstants)</DefineConstants>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition=" '$(ExtraDefineConstants)' == 'win-x64' Or '$(ExtraDefineConstants)' == 'dev-win-x64' ">
|
||||
<PropertyGroup Condition=" '$(ExtraDefineConstants)' == 'win-x64' Or '$(ExtraDefineConstants)' == 'dev-win-x64' Or '$(ExtraDefineConstants)' == 'win-x86' Or '$(ExtraDefineConstants)' == 'dev-win-x86' ">
|
||||
<DefineConstants>PUBLISH;PUBLISH_WIN7;WINDOWS;$(DefineConstants)</DefineConstants>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition=" '$(ExtraDefineConstants)' == 'fd-win-x64' Or '$(ExtraDefineConstants)' == 'dev-fd-win-x64' ">
|
||||
<PropertyGroup Condition=" '$(ExtraDefineConstants)' == 'win-arm64' Or '$(ExtraDefineConstants)' == 'dev-arm64' ">
|
||||
<DefineConstants>PUBLISH;WINDOWS;$(DefineConstants)</DefineConstants>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition=" '$(ExtraDefineConstants)' == 'fd-win-x64' Or '$(ExtraDefineConstants)' == 'dev-fd-win-x64' Or '$(ExtraDefineConstants)' == 'fd-win-x86' Or '$(ExtraDefineConstants)' == 'dev-fd-win-x86' ">
|
||||
<DefineConstants>FRAMEWORK_DEPENDENT;PUBLISH;PUBLISH_WIN7;WINDOWS;$(DefineConstants)</DefineConstants>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition=" '$(ExtraDefineConstants)' == 'fd-win-arm64' Or '$(ExtraDefineConstants)' == 'dev-fd-arm64' ">
|
||||
<DefineConstants>FRAMEWORK_DEPENDENT;PUBLISH;WINDOWS;$(DefineConstants)</DefineConstants>
|
||||
</PropertyGroup>
|
||||
|
||||
<PropertyGroup Condition=" $(RuntimeIdentifier.Contains(`win`)) Or $(ExtraDefineConstants.Contains(`win`)) Or ('$(OS)' == 'Windows_NT' And !$(DefineConstants.Contains(`PUBLISH`))) ">
|
||||
<DefineConstants>WINDOWS;$(DefineConstants)</DefineConstants>
|
||||
<ApplicationIcon>..\ST.Client.Desktop.Avalonia\Application\UI\Assets\Icon.ico</ApplicationIcon>
|
||||
|
||||
+3
-3
@@ -193,15 +193,15 @@
|
||||
Margin="10">
|
||||
<controls:ScrollingTextBlock Text="{Binding Name}" Classes="h6 semibold"/>
|
||||
<!--Foreground="#D22222"-->
|
||||
<!--<controls:ScrollingTextBlock Text="{Binding Amount,Converter={StaticResource StringFormatConverter},ConverterParameter={ReflectionBinding CurrencyCode}}"/>-->
|
||||
<controls:ScrollingTextBlock>
|
||||
<controls:ScrollingTextBlock Text="{Binding Amount,Converter={StaticResource StringFormatConverter},ConverterParameter={ReflectionBinding CurrencyCode}}"/>
|
||||
<!--<controls:ScrollingTextBlock>
|
||||
<controls:ScrollingTextBlock.Text>
|
||||
<MultiBinding Converter="{StaticResource StringFormatConverter}" ConverterParameter="money">
|
||||
<Binding Path="Amount"/>
|
||||
<Binding Path="CurrencyCode"/>
|
||||
</MultiBinding>
|
||||
</controls:ScrollingTextBlock.Text>
|
||||
</controls:ScrollingTextBlock>
|
||||
</controls:ScrollingTextBlock>-->
|
||||
</StackPanel>
|
||||
</DockPanel>
|
||||
</Border>
|
||||
|
||||
+7
@@ -39,6 +39,13 @@
|
||||
</DockPanel>
|
||||
</Border>
|
||||
|
||||
<Border Classes="Item">
|
||||
<DockPanel>
|
||||
<TextBlock Text="{ReflectionBinding Path=Res.Settings_Steam_RunSteamChina,Mode=OneWay,Source={x:Static resx:R.Current}}"/>
|
||||
<ToggleSwitch IsChecked="{ReflectionBinding Source={x:Static ms:SteamSettings.IsRunSteamChina},Path=Value, Mode=TwoWay}"/>
|
||||
</DockPanel>
|
||||
</Border>
|
||||
|
||||
<Border Classes="Item">
|
||||
<DockPanel>
|
||||
<TextBlock Text="{ReflectionBinding Path=Res.Settings_Steam_CheckSteamRuningNotification,Mode=OneWay,Source={x:Static resx:R.Current}}"/>
|
||||
|
||||
@@ -91,14 +91,14 @@ namespace System.Application.Services.Implementation
|
||||
|
||||
async ValueTask<bool?> IPlatformService.TrustRootCertificate(string filePath)
|
||||
{
|
||||
var script = $"security add-trusted-cert -d -r trustRoot -k /Users/{Environment.UserName}/Library/Keychains/login.keychain-db \\\"{filePath}\\\"";
|
||||
var script = $"security add-trusted-cert -d -r trustRoot -k /Users/{Environment.UserName}/Library/Keychains/login.keychain-db";
|
||||
TextBoxWindowViewModel vm = new()
|
||||
{
|
||||
Title = AppResources.MacTrustRootCertificateTips,
|
||||
InputType = TextBoxWindowViewModel.TextBoxInputType.ReadOnlyText,
|
||||
Description = AppResources.MacTrustRootCertificateTips,
|
||||
InputType = TextBoxWindowViewModel.TextBoxInputType.Password,
|
||||
Description = AppResources.MacSudoPasswordTips + $"\r\n sudo {script} \"{filePath}\"",
|
||||
};
|
||||
var scriptContent = $"osascript -e 'tell app \"Terminal\" to do script \"sudo -S {script}\"'";
|
||||
var scriptContent = $"osascript -e 'tell app \"Terminal\" to do script \"sudo -S {script} \\\"{filePath}\\\"\"'";
|
||||
var msg = UnixHelper.RunShell(scriptContent.ToString());
|
||||
if (await TextBoxWindowViewModel.ShowDialogAsync(vm) == null)
|
||||
return null;
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,5 +1,6 @@
|
||||
using DnsClient;
|
||||
using DnsClient.Protocol;
|
||||
using Microsoft.Extensions.DependencyInjection.Extensions;
|
||||
using System.Application.Services;
|
||||
using System.Application.Services.Implementation;
|
||||
using System.Collections.Generic;
|
||||
@@ -16,16 +17,16 @@ namespace System.Application.Services.Implementation
|
||||
{
|
||||
private static readonly LookupClient lookupClient = new();
|
||||
|
||||
public int AnalysisHostnameTime(string url)
|
||||
public async Task<int> AnalysisHostnameTime(string url, CancellationToken cancellationToken = default)
|
||||
{
|
||||
if (!string.IsNullOrEmpty(url))
|
||||
{
|
||||
var client = lookupClient;
|
||||
var result = client.Query(url, QueryType.A);
|
||||
var result = await client.QueryAsync(url, QueryType.A, QueryClass.IN, cancellationToken);
|
||||
if (result.Answers.Count > 0)
|
||||
{
|
||||
var value = result.Answers.ARecords().FirstOrDefault()?.InitialTimeToLive;
|
||||
if (value.HasValue) return value.Value;
|
||||
return value ?? 0;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
@@ -150,6 +151,7 @@ namespace Microsoft.Extensions.DependencyInjection
|
||||
{
|
||||
public static IServiceCollection AddDnsAnalysisService(this IServiceCollection services)
|
||||
{
|
||||
//services.AddSingleton<IDnsAnalysisService, DnsDohAnalysisService>();
|
||||
services.AddSingleton<IDnsAnalysisService, DnsAnalysisServiceImpl>();
|
||||
return services;
|
||||
}
|
||||
|
||||
@@ -8,10 +8,14 @@ using System.Application.Settings;
|
||||
using System.Application.UI;
|
||||
using System.Application.UI.Resx;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Diagnostics;
|
||||
using System.Globalization;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
#if WINDOWS
|
||||
using System.Management;
|
||||
#endif
|
||||
using System.Net;
|
||||
using System.Net.Http;
|
||||
using System.Runtime.Versioning;
|
||||
@@ -143,6 +147,41 @@ namespace System.Application.Services.Implementation
|
||||
/// <returns></returns>
|
||||
private Process? GetSteamProces() => GetSteamProcesses().FirstOrDefault();
|
||||
|
||||
public bool IsSteamChinaLauncher()
|
||||
{
|
||||
#if WINDOWS
|
||||
var process = GetSteamProces();
|
||||
if (process != null)
|
||||
{
|
||||
try
|
||||
{
|
||||
return GetCommandLineArgsCore().Contains("-steamchina", StringComparison.OrdinalIgnoreCase);
|
||||
}
|
||||
catch (Win32Exception ex) when ((uint)ex.ErrorCode == 0x80004005)
|
||||
{
|
||||
// 没有对该进程的安全访问权限。
|
||||
return false;
|
||||
}
|
||||
catch (InvalidOperationException)
|
||||
{
|
||||
// 进程已退出。
|
||||
return false;
|
||||
}
|
||||
}
|
||||
string GetCommandLineArgsCore()
|
||||
{
|
||||
using (var searcher = new ManagementObjectSearcher(
|
||||
"SELECT CommandLine FROM Win32_Process WHERE ProcessId = " + process.Id))
|
||||
using (var objects = searcher.Get())
|
||||
{
|
||||
var @object = objects.Cast<ManagementBaseObject>().SingleOrDefault();
|
||||
return @object?["CommandLine"]?.ToString() ?? "";
|
||||
}
|
||||
}
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
|
||||
public void StartSteam(string? arguments = null)
|
||||
{
|
||||
if (!string.IsNullOrWhiteSpace(SteamProgramPath) && File.Exists(SteamProgramPath))
|
||||
@@ -495,6 +534,7 @@ namespace System.Application.Services.Implementation
|
||||
|
||||
private uint univeseNumber;
|
||||
private const uint MagicNumber = 123094055U;
|
||||
private const uint MagicNumberV2 = 123094056U;
|
||||
|
||||
/// <summary>
|
||||
/// 从steam本地客户端缓存文件中读取游戏数据
|
||||
@@ -516,7 +556,7 @@ namespace System.Application.Services.Implementation
|
||||
}
|
||||
using BinaryReader binaryReader = new(stream);
|
||||
uint num = binaryReader.ReadUInt32();
|
||||
if (num != MagicNumber)
|
||||
if (num != MagicNumberV2 && num != MagicNumber)
|
||||
{
|
||||
Log.Error(nameof(GetAppInfos), string.Format("\"{0}\" magic code is not supported: 0x{1:X8}", Path.GetFileName(AppInfoPath), num));
|
||||
return apps;
|
||||
|
||||
+15
@@ -106,6 +106,21 @@ namespace System.Application.Services.Implementation
|
||||
return SteamClient.SteamUtils.IsSteamChinaLauncher();
|
||||
}
|
||||
|
||||
public bool IsSteamInBigPictureMode()
|
||||
{
|
||||
return SteamClient.SteamUtils.IsSteamInBigPictureMode();
|
||||
}
|
||||
|
||||
public uint GetSecondsSinceAppActive()
|
||||
{
|
||||
return SteamClient.SteamUtils.GetSecondsSinceAppActive();
|
||||
}
|
||||
|
||||
public uint GetServerRealTime()
|
||||
{
|
||||
return SteamClient.SteamUtils.GetServerRealTime();
|
||||
}
|
||||
|
||||
public bool IsAppInstalled(uint appid)
|
||||
{
|
||||
return SteamClient.SteamApps008.IsAppInstalled(appid);
|
||||
|
||||
+30
-1
@@ -31,11 +31,24 @@ namespace System.Application.Services.Implementation
|
||||
}
|
||||
|
||||
public async Task<byte[]> ProtectAsync(byte[] data)
|
||||
{
|
||||
try
|
||||
{
|
||||
return await ProtectCoreAsync(data);
|
||||
}
|
||||
catch
|
||||
{
|
||||
return await ProtectCore2Async(data);
|
||||
}
|
||||
}
|
||||
|
||||
static async Task<byte[]> ProtectCoreAsync(byte[] data)
|
||||
{
|
||||
// LOCAL=user and LOCAL=machine do not require enterprise auth capability
|
||||
var provider = GetDataProtectionProvider("LOCAL=user");
|
||||
|
||||
// https://appcenter.ms/orgs/BeyondDimension/apps/Steam/crashes/errors/842356268u/overview
|
||||
// https://appcenter.ms/orgs/BeyondDimension/apps/Steam/crashes/errors/1550045210u/overview
|
||||
// System.Runtime.InteropServices.COMException: 无法在设置线程模式后对其加以更改。 (0x80010106 (RPC_E_CHANGED_MODE))
|
||||
|
||||
var buffer = await provider.ProtectAsync(data.AsBuffer());
|
||||
@@ -45,7 +58,9 @@ namespace System.Application.Services.Implementation
|
||||
return encBytes;
|
||||
}
|
||||
|
||||
public async Task<byte[]> UnprotectAsync(byte[] data)
|
||||
static async Task<byte[]> ProtectCore2Async(byte[] data) => await await Task.Factory.StartNew(async () => await ProtectCoreAsync(data));
|
||||
|
||||
static async Task<byte[]> UnprotectCoreAsync(byte[] data)
|
||||
{
|
||||
var provider = GetDataProtectionProvider();
|
||||
|
||||
@@ -53,5 +68,19 @@ namespace System.Application.Services.Implementation
|
||||
|
||||
return buffer.ToArray();
|
||||
}
|
||||
|
||||
static async Task<byte[]> UnprotectCore2Async(byte[] data) => await await Task.Factory.StartNew(async () => await UnprotectCoreAsync(data));
|
||||
|
||||
public async Task<byte[]> UnprotectAsync(byte[] data)
|
||||
{
|
||||
try
|
||||
{
|
||||
return await UnprotectCoreAsync(data);
|
||||
}
|
||||
catch
|
||||
{
|
||||
return await UnprotectCore2Async(data);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+7
@@ -2,6 +2,11 @@ namespace System.Application.Services.Implementation
|
||||
{
|
||||
partial class WindowsPlatformServiceImpl : IDisposable
|
||||
{
|
||||
/// <summary>
|
||||
/// 用于 <see cref="IOPath.GetCacheFilePath(string, string, string)"/> 中 dirName,临时文件夹名称,在程序退出时将删除整个文件夹
|
||||
/// </summary>
|
||||
const string CacheTempDirName = "Temporary";
|
||||
|
||||
bool disposedValue;
|
||||
|
||||
private void Dispose(bool disposing)
|
||||
@@ -12,6 +17,8 @@ namespace System.Application.Services.Implementation
|
||||
{
|
||||
// TODO: 释放托管状态(托管对象)
|
||||
isLightOrDarkThemeWatch?.Dispose();
|
||||
|
||||
IOPath.TryDeleteCacheSubDir(CacheTempDirName);
|
||||
}
|
||||
|
||||
// TODO: 释放未托管的资源(未托管的对象)并重写终结器
|
||||
|
||||
+341
-331
@@ -1,6 +1,5 @@
|
||||
using Microsoft.Win32;
|
||||
using System.Application.Models;
|
||||
using System.Application.UI;
|
||||
using System.Application.UI.Resx;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
@@ -11,343 +10,354 @@ using System.IO;
|
||||
using System.Linq;
|
||||
using System.Management;
|
||||
using System.Net;
|
||||
using System.Net.Sockets;
|
||||
using System.Runtime.Versioning;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Security.Principal;
|
||||
using Windows.ApplicationModel;
|
||||
using System.Application.Properties;
|
||||
using System.Text;
|
||||
using _SR = System.Application.Properties.SR;
|
||||
|
||||
namespace System.Application.Services.Implementation
|
||||
namespace System.Application.Services.Implementation;
|
||||
|
||||
internal sealed partial class WindowsPlatformServiceImpl : IPlatformService
|
||||
{
|
||||
internal sealed partial class WindowsPlatformServiceImpl : IPlatformService
|
||||
const string TAG = "WindowsPlatformS";
|
||||
const string SteamRegistryPath = @"SOFTWARE\Valve\Steam";
|
||||
|
||||
public string? GetRegistryVdfPath() { return null; }
|
||||
|
||||
public string GetCommandLineArgs(Process process)
|
||||
{
|
||||
const string TAG = "WindowsPlatformS";
|
||||
const string SteamRegistryPath = @"SOFTWARE\Valve\Steam";
|
||||
|
||||
public string? GetRegistryVdfPath() { return null; }
|
||||
|
||||
public string GetCommandLineArgs(Process process)
|
||||
try
|
||||
{
|
||||
try
|
||||
{
|
||||
using var searcher = new ManagementObjectSearcher(
|
||||
"SELECT CommandLine FROM Win32_Process WHERE ProcessId = " + process.Id);
|
||||
using var objects = searcher.Get();
|
||||
var @object = objects.Cast<ManagementBaseObject>().SingleOrDefault();
|
||||
return @object?["CommandLine"]?.ToString() ?? "";
|
||||
}
|
||||
catch (Win32Exception ex) when ((uint)ex.ErrorCode == 0x80004005)
|
||||
{
|
||||
// 没有对该进程的安全访问权限。
|
||||
return string.Empty;
|
||||
}
|
||||
using var searcher = new ManagementObjectSearcher(
|
||||
"SELECT CommandLine FROM Win32_Process WHERE ProcessId = " + process.Id);
|
||||
using var objects = searcher.Get();
|
||||
var @object = objects.Cast<ManagementBaseObject>().SingleOrDefault();
|
||||
return @object?["CommandLine"]?.ToString() ?? "";
|
||||
}
|
||||
|
||||
static readonly Lazy<string> mHostsFilePath = new(() =>
|
||||
catch (Win32Exception ex) when ((uint)ex.ErrorCode == 0x80004005)
|
||||
{
|
||||
return Path.Combine(Environment.SystemDirectory, "drivers", "etc", "hosts");
|
||||
});
|
||||
|
||||
public string HostsFilePath => mHostsFilePath.Value;
|
||||
|
||||
public string DefaultHostsContent => _SR.hosts;
|
||||
|
||||
static string GetFolderPath(Environment.SpecialFolder folder)
|
||||
{
|
||||
switch (folder)
|
||||
{
|
||||
case Environment.SpecialFolder.ProgramFiles:
|
||||
var trimEndMark = " (x86)";
|
||||
var value = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles);
|
||||
if (value.EndsWith(trimEndMark, StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
var value2 = value.Substring(0, value.Length - trimEndMark.Length);
|
||||
if (Directory.Exists(value2))
|
||||
{
|
||||
return value2;
|
||||
}
|
||||
}
|
||||
return value;
|
||||
default:
|
||||
return Environment.GetFolderPath(folder);
|
||||
}
|
||||
// 没有对该进程的安全访问权限。
|
||||
return string.Empty;
|
||||
}
|
||||
|
||||
public void OpenFolderByDirectoryPath(DirectoryInfo info)
|
||||
{
|
||||
Process.Start(new ProcessStartInfo
|
||||
{
|
||||
FileName = Explorer,
|
||||
Arguments = $"\"{info.FullName}\"",
|
||||
UseShellExecute = false,
|
||||
});
|
||||
}
|
||||
|
||||
public void OpenFolderSelectFilePath(FileInfo info)
|
||||
{
|
||||
Process.Start(new ProcessStartInfo
|
||||
{
|
||||
FileName = Explorer,
|
||||
Arguments = $"/select,\"{info.FullName}\"",
|
||||
UseShellExecute = false,
|
||||
});
|
||||
}
|
||||
|
||||
public string? GetFileName(TextReaderProvider provider)
|
||||
{
|
||||
switch (provider)
|
||||
{
|
||||
case TextReaderProvider.VSCode:
|
||||
var vsCodePaths = new[] {
|
||||
GetFolderPath(Environment.SpecialFolder.ProgramFiles),
|
||||
GetFolderPath(Environment.SpecialFolder.ProgramFilesX86)
|
||||
}.Distinct().Select(x => Path.Combine(x, "Microsoft VS Code", "Code.exe"));
|
||||
|
||||
foreach (var vsCodePath in vsCodePaths)
|
||||
{
|
||||
if (File.Exists(vsCodePath))
|
||||
{
|
||||
return vsCodePath;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
case TextReaderProvider.Notepad:
|
||||
return "notepad";
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public void SetSystemSessionEnding(Action action)
|
||||
{
|
||||
SystemEvents.SessionEnding += (sender, e) =>
|
||||
{
|
||||
//IDesktopAppService.Instance.CompositeDisposable.Dispose();
|
||||
action.Invoke();
|
||||
};
|
||||
}
|
||||
|
||||
static string? GetFullPath(string s)
|
||||
{
|
||||
if (!string.IsNullOrWhiteSpace(s))
|
||||
{
|
||||
return Path.GetFullPath(s);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public string? GetSteamDirPath()
|
||||
=> GetFullPath(Registry.CurrentUser.Read(SteamRegistryPath, "SteamPath"));
|
||||
|
||||
public string? GetSteamProgramPath()
|
||||
=> GetFullPath(Registry.CurrentUser.Read(SteamRegistryPath, "SteamExe"));
|
||||
|
||||
public string GetLastSteamLoginUserName()
|
||||
=> Registry.CurrentUser.Read(SteamRegistryPath, "AutoLoginUser");
|
||||
|
||||
public void SetCurrentUser(string userName)
|
||||
{
|
||||
if (DesktopBridge.IsRunningAsUwp)
|
||||
{
|
||||
var reg = $"Windows Registry Editor Version 5.00{Environment.NewLine}[HKEY_CURRENT_USER\\Software\\Valve\\Steam]{Environment.NewLine}\"AutoLoginUser\"=\"{userName}\"";
|
||||
var path = Path.Combine(IOPath.CacheDirectory, "switchuser.reg");
|
||||
File.WriteAllText(path, reg, Text.Encoding.UTF8);
|
||||
var p = Process2.Start("regedit", $"/s \"{path}\"", true);
|
||||
p?.WaitForExit();
|
||||
}
|
||||
else
|
||||
{
|
||||
Registry.CurrentUser.AddOrUpdate(SteamRegistryPath, "AutoLoginUser", userName, RegistryValueKind.String);
|
||||
}
|
||||
}
|
||||
|
||||
static string GetMachineSecretKey()
|
||||
=> Registry.LocalMachine.Read(@"SOFTWARE\Microsoft\Cryptography", "MachineGuid");
|
||||
|
||||
static readonly Lazy<(byte[] key, byte[] iv)> mMachineSecretKey = IPlatformService.GetMachineSecretKey(GetMachineSecretKey);
|
||||
|
||||
public (byte[] key, byte[] iv) MachineSecretKey => mMachineSecretKey.Value;
|
||||
|
||||
//const string runas_exe = "runas.exe";
|
||||
//static Process? StartAsInvokerByRunas(string fileName, string? arguments = null)
|
||||
//{
|
||||
// // https://blog.lindexi.com/post/%E5%A6%82%E4%BD%95%E5%9C%A8-RunAs-%E5%90%AF%E5%8A%A8%E7%9A%84%E8%BD%AF%E4%BB%B6%E4%BC%A0%E5%85%A5%E5%B8%A6%E7%A9%BA%E6%A0%BC%E7%9A%84%E8%B7%AF%E5%BE%84%E5%B8%A6%E7%A9%BA%E6%A0%BC%E5%8F%82%E6%95%B0.html
|
||||
// string arguments_;
|
||||
// if (string.IsNullOrEmpty(arguments))
|
||||
// arguments_ = $"/trustlevel:0x20000 \"{fileName}\"";
|
||||
// else arguments_ = $"/trustlevel:0x20000 \"{fileName} \"{arguments}\"\"";
|
||||
// return Process.Start(runas_exe, arguments_);
|
||||
//}
|
||||
|
||||
static readonly Lazy<string> _explorer_exe = new(() => Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Windows), "explorer.exe"));
|
||||
|
||||
/// <summary>
|
||||
/// %windir%\explorer.exe
|
||||
/// </summary>
|
||||
static string Explorer => _explorer_exe.Value;
|
||||
|
||||
static Process? StartAsInvokerByExplorer(string fileName, string? arguments = null)
|
||||
{
|
||||
if (string.IsNullOrEmpty(arguments))
|
||||
return Process.Start(Explorer, $"\"{fileName}\"");
|
||||
var cacheCmdFile = Path.Combine(IOPath.CacheDirectory, "StartAsInvokerByExplorer" + FileEx.CMD);
|
||||
if (File.Exists(cacheCmdFile)) File.Delete(cacheCmdFile);
|
||||
File.WriteAllText(cacheCmdFile, $"@echo {Constants.HARDCODED_APP_NAME} StartAsInvokerByExplorer{Environment.NewLine}start \"\" \"{fileName}\" {arguments}{Environment.NewLine}exit 0");
|
||||
return Process.Start(Explorer, $"\"{cacheCmdFile}\"");
|
||||
}
|
||||
|
||||
public Process? StartAsInvoker(string fileName, string? arguments = null)
|
||||
{
|
||||
if (((IPlatformService)this).IsAdministrator)
|
||||
{
|
||||
// runas /trustlevel:0x20000 没有真正的降权,只是作为具有限制特权,使用 explorer 最好,但不接受参数,可以创建一个临时cmd脚本启动
|
||||
//return StartAsInvokerByRunas(fileName, arguments);
|
||||
return StartAsInvokerByExplorer(fileName, arguments);
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
return Process2.Start(fileName, arguments);
|
||||
}
|
||||
}
|
||||
|
||||
//public Process? StartAsInvoker(ProcessStartInfo startInfo)
|
||||
//{
|
||||
// startInfo.FileName = runas_exe;
|
||||
// startInfo.Arguments = $"/trustlevel:0x20000 \"{startInfo.FileName}\"";
|
||||
// return Process.Start(startInfo);
|
||||
//}
|
||||
|
||||
//public Process? GetProcessByPortOccupy(ushort port, bool isTCPorUDP = true)
|
||||
//{
|
||||
// if (isTCPorUDP)
|
||||
// {
|
||||
// return SocketHelper.GetProcessByTcpPort(port);
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// throw new NotSupportedException();
|
||||
// }
|
||||
// //try
|
||||
// //{
|
||||
// // using var p = new Process
|
||||
// // {
|
||||
// // StartInfo = new ProcessStartInfo
|
||||
// // {
|
||||
// // FileName = "cmd",
|
||||
// // UseShellExecute = false,
|
||||
// // RedirectStandardInput = true,
|
||||
// // RedirectStandardOutput = true,
|
||||
// // CreateNoWindow = true,
|
||||
// // },
|
||||
// // };
|
||||
// // p.Start();
|
||||
// // p.StandardInput.WriteLine($"netstat -ano|findstr \"{port}\"&exit");
|
||||
// // p.StandardInput.AutoFlush = true;
|
||||
// // var reader = p.StandardOutput;
|
||||
// // while (!reader.EndOfStream)
|
||||
// // {
|
||||
// // var line = reader.ReadLine();
|
||||
// // if (line == null) break;
|
||||
// // var lineArray = line.Split(' ', StringSplitOptions.RemoveEmptyEntries);
|
||||
// // if (lineArray.Length != 5) continue;
|
||||
// // if (!lineArray[0].Equals(isTCPorUDP ? "TCP" : "UDP", StringComparison.OrdinalIgnoreCase)) continue;
|
||||
// // if (!lineArray[3].Equals("LISTENING", StringComparison.OrdinalIgnoreCase)) continue;
|
||||
// // if (!lineArray[1].EndsWith($":{port}")) continue;
|
||||
// // if (!ushort.TryParse(lineArray[4], out var pid)) continue;
|
||||
// // p.Close();
|
||||
// // return Process.GetProcessById(pid);
|
||||
// // }
|
||||
// // _ = p.WaitForExit(550);
|
||||
// //}
|
||||
// //catch
|
||||
// //{
|
||||
// //}
|
||||
// //return default;
|
||||
//}
|
||||
|
||||
const string ProxyOverride = "\"ProxyOverride\"=\"localhost;127.*;10.*;172.16.*;172.17.*;172.18.*;172.19.*;172.20.*;172.21.*;172.22.*;172.23.*;172.24.*;172.25.*;172.26.*;172.27.*;172.28.*;172.29.*;172.30.*;172.31.*;192.168.*\"";
|
||||
|
||||
/// <summary>
|
||||
/// 设置启用或关闭系统代理
|
||||
/// </summary>
|
||||
/// <param name="state"></param>
|
||||
/// <param name="ip"></param>
|
||||
/// <param name="port"></param>
|
||||
/// <returns></returns>
|
||||
public bool SetAsSystemProxy(bool state, IPAddress? ip, int port)
|
||||
{
|
||||
try
|
||||
{
|
||||
var proxyEnable = $"\"ProxyEnable\"=dword:{(state ? "00000001" : "00000000")}";
|
||||
var hasIpAndProt = ip != null && port >= 0;
|
||||
var proxyServer = hasIpAndProt ? $"\"proxyServer\"=\"{ip}:{port}\"" : "";
|
||||
var reg = $"Windows Registry Editor Version 5.00{Environment.NewLine}[HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Internet Settings]{Environment.NewLine}{proxyEnable}{Environment.NewLine}{(state ? $"{ProxyOverride}{Environment.NewLine}" : "")}{proxyServer}";
|
||||
var path = Path.Combine(IOPath.CacheDirectory, "switchproxy.reg");
|
||||
File.WriteAllText(path, reg, Text.Encoding.UTF8);
|
||||
var p = Process2.Start("regedit", $"/s \"{path}\"", true);
|
||||
p?.WaitForExit();
|
||||
return true;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Toast.LogAndShowT(ex, TAG);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 设置启用或关闭PAC代理
|
||||
/// </summary>
|
||||
/// <param name="state"></param>
|
||||
/// <param name="url"></param>
|
||||
/// <returns></returns>
|
||||
public bool SetAsSystemPACProxy(bool state, string? url = null)
|
||||
{
|
||||
try
|
||||
{
|
||||
var regAutoConfigUrl = state ? $"\"AutoConfigURL\"=\"{url}\"" : "\"AutoConfigURL\"=\"\"";
|
||||
var reg = $"Windows Registry Editor Version 5.00{Environment.NewLine}[HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Internet Settings]{Environment.NewLine}{regAutoConfigUrl}";
|
||||
var path = Path.Combine(IOPath.CacheDirectory, "switchpacproxy.reg");
|
||||
File.WriteAllText(path, reg, Text.Encoding.UTF8);
|
||||
var p = Process2.Start("regedit", $"/s \"{path}\"", true);
|
||||
p?.WaitForExit();
|
||||
return true;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Toast.LogAndShowT(ex, TAG);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public IReadOnlyCollection<KeyValuePair<string, string>> GetFontsByGdiPlus()
|
||||
{
|
||||
// https://docs.microsoft.com/zh-cn/typography/font-list
|
||||
var culture = R.Culture;
|
||||
InstalledFontCollection ifc = new();
|
||||
var list = ifc.Families.Where(x => x.IsStyleAvailable(FontStyle.Regular)).Select(x => KeyValuePair.Create(x.GetName(culture.LCID), x.GetName(1033))).ToList();
|
||||
list.Insert(0, IFontManager.Default);
|
||||
return list;
|
||||
}
|
||||
|
||||
#region IsInstall
|
||||
|
||||
static readonly Lazy<bool> _IsInstall = new(() =>
|
||||
{
|
||||
using var reg32 = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32);
|
||||
var value = reg32.Read(@"SOFTWARE\Steam++", "InstPath").TrimEnd(Path.DirectorySeparatorChar);
|
||||
return string.Equals(IOPath.BaseDirectory.TrimEnd(Path.DirectorySeparatorChar), value, StringComparison.OrdinalIgnoreCase);
|
||||
});
|
||||
|
||||
/// <inheritdoc cref="IPlatformService.IsInstall"/>
|
||||
public static bool IsInstall => _IsInstall.Value;
|
||||
|
||||
bool IPlatformService.IsInstall => IsInstall;
|
||||
|
||||
#endregion
|
||||
}
|
||||
|
||||
static readonly Lazy<string> mHostsFilePath = new(() =>
|
||||
{
|
||||
return Path.Combine(Environment.SystemDirectory, "drivers", "etc", "hosts");
|
||||
});
|
||||
|
||||
public string HostsFilePath => mHostsFilePath.Value;
|
||||
|
||||
public string DefaultHostsContent => _SR.hosts;
|
||||
|
||||
static string GetFolderPath(Environment.SpecialFolder folder)
|
||||
{
|
||||
switch (folder)
|
||||
{
|
||||
case Environment.SpecialFolder.ProgramFiles:
|
||||
var trimEndMark = " (x86)";
|
||||
var value = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles);
|
||||
if (value.EndsWith(trimEndMark, StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
var value2 = value[..^trimEndMark.Length];
|
||||
if (Directory.Exists(value2))
|
||||
{
|
||||
return value2;
|
||||
}
|
||||
}
|
||||
return value;
|
||||
default:
|
||||
return Environment.GetFolderPath(folder);
|
||||
}
|
||||
}
|
||||
|
||||
public void OpenFolderByDirectoryPath(DirectoryInfo info)
|
||||
{
|
||||
StartProcessExplorer($"\"{info.FullName}\"");
|
||||
}
|
||||
|
||||
public void OpenFolderSelectFilePath(FileInfo info)
|
||||
{
|
||||
StartProcessExplorer($"/select,\"{info.FullName}\"");
|
||||
}
|
||||
|
||||
public string? GetFileName(TextReaderProvider provider)
|
||||
{
|
||||
switch (provider)
|
||||
{
|
||||
case TextReaderProvider.VSCode:
|
||||
var vsCodePaths = new[] {
|
||||
GetFolderPath(Environment.SpecialFolder.ProgramFiles),
|
||||
GetFolderPath(Environment.SpecialFolder.ProgramFilesX86)
|
||||
}.Distinct().Select(x => Path.Combine(x, "Microsoft VS Code", "Code.exe"));
|
||||
|
||||
foreach (var vsCodePath in vsCodePaths)
|
||||
{
|
||||
if (File.Exists(vsCodePath))
|
||||
{
|
||||
return vsCodePath;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
case TextReaderProvider.Notepad:
|
||||
return "notepad";
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public void SetSystemSessionEnding(Action action)
|
||||
{
|
||||
SystemEvents.SessionEnding += (sender, e) =>
|
||||
{
|
||||
//IDesktopAppService.Instance.CompositeDisposable.Dispose();
|
||||
action.Invoke();
|
||||
};
|
||||
}
|
||||
|
||||
static string? GetFullPath(string s)
|
||||
{
|
||||
if (!string.IsNullOrWhiteSpace(s))
|
||||
{
|
||||
return Path.GetFullPath(s);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public string? GetSteamDirPath()
|
||||
=> GetFullPath(Registry.CurrentUser.Read(SteamRegistryPath, "SteamPath"));
|
||||
|
||||
public string? GetSteamProgramPath()
|
||||
=> GetFullPath(Registry.CurrentUser.Read(SteamRegistryPath, "SteamExe"));
|
||||
|
||||
public string GetLastSteamLoginUserName()
|
||||
=> Registry.CurrentUser.Read(SteamRegistryPath, "AutoLoginUser");
|
||||
|
||||
public void SetCurrentUser(string userName)
|
||||
{
|
||||
if (DesktopBridge.IsRunningAsUwp)
|
||||
{
|
||||
var reg = $"Windows Registry Editor Version 5.00{Environment.NewLine}[HKEY_CURRENT_USER\\Software\\Valve\\Steam]{Environment.NewLine}\"AutoLoginUser\"=\"{userName}\"";
|
||||
var path = IOPath.GetCacheFilePath(CacheTempDirName, "SwitchSteamUser", FileEx.Reg);
|
||||
File.WriteAllText(path, reg, Encoding.UTF8);
|
||||
var p = StartProcessRegedit($"/s \"{path}\"");
|
||||
IOPath.TryDeleteInDelay(p, path);
|
||||
}
|
||||
else
|
||||
{
|
||||
Registry.CurrentUser.AddOrUpdate(SteamRegistryPath, "AutoLoginUser", userName, RegistryValueKind.String);
|
||||
}
|
||||
}
|
||||
|
||||
static string GetMachineSecretKey()
|
||||
=> Registry.LocalMachine.Read(@"SOFTWARE\Microsoft\Cryptography", "MachineGuid");
|
||||
|
||||
static readonly Lazy<(byte[] key, byte[] iv)> mMachineSecretKey = IPlatformService.GetMachineSecretKey(GetMachineSecretKey);
|
||||
|
||||
public (byte[] key, byte[] iv) MachineSecretKey => mMachineSecretKey.Value;
|
||||
|
||||
/// <summary>
|
||||
/// %windir%
|
||||
/// </summary>
|
||||
static readonly Lazy<string> _windir = new(() => Environment.GetFolderPath(Environment.SpecialFolder.Windows));
|
||||
|
||||
//const string runas_exe = "runas.exe";
|
||||
//static Process? StartAsInvokerByRunas(string fileName, string? arguments = null)
|
||||
//{
|
||||
// // https://blog.lindexi.com/post/%E5%A6%82%E4%BD%95%E5%9C%A8-RunAs-%E5%90%AF%E5%8A%A8%E7%9A%84%E8%BD%AF%E4%BB%B6%E4%BC%A0%E5%85%A5%E5%B8%A6%E7%A9%BA%E6%A0%BC%E7%9A%84%E8%B7%AF%E5%BE%84%E5%B8%A6%E7%A9%BA%E6%A0%BC%E5%8F%82%E6%95%B0.html
|
||||
// string arguments_;
|
||||
// if (string.IsNullOrEmpty(arguments))
|
||||
// arguments_ = $"/trustlevel:0x20000 \"{fileName}\"";
|
||||
// else arguments_ = $"/trustlevel:0x20000 \"{fileName} \"{arguments}\"\"";
|
||||
// return Process.Start(runas_exe, arguments_);
|
||||
//}
|
||||
|
||||
static readonly Lazy<string> _explorer_exe = new(() => Path.Combine(_windir.Value, "explorer.exe"));
|
||||
|
||||
/// <summary>
|
||||
/// %windir%\explorer.exe
|
||||
/// </summary>
|
||||
static string Explorer => _explorer_exe.Value;
|
||||
|
||||
/// <summary>
|
||||
/// 带参数(可选/null)启动 %windir%\explorer.exe
|
||||
/// </summary>
|
||||
/// <param name="args"></param>
|
||||
/// <returns></returns>
|
||||
static Process? StartProcessExplorer(string args) => Process2.Start(Explorer, args, workingDirectory: _windir.Value);
|
||||
|
||||
static readonly Lazy<string> _regedit_exe = new(() => Path.Combine(_windir.Value, "regedit.exe"));
|
||||
|
||||
/// <summary>
|
||||
/// %windir%\regedit.exe
|
||||
/// </summary>
|
||||
static string Regedit => _regedit_exe.Value;
|
||||
|
||||
/// <summary>
|
||||
/// 带参数(可选/null)启动 %windir%\regedit.exe
|
||||
/// </summary>
|
||||
/// <param name="args"></param>
|
||||
/// <returns></returns>
|
||||
static Process? StartProcessRegedit(string? args) => Process2.Start(Regedit, args, workingDirectory: _windir.Value);
|
||||
|
||||
static Process? StartAsInvokerByExplorer(string fileName, string? arguments = null)
|
||||
{
|
||||
if (string.IsNullOrEmpty(arguments))
|
||||
return StartProcessExplorer($"\"{fileName}\"");
|
||||
var cacheCmdFile = IOPath.GetCacheFilePath(CacheTempDirName, "StartAsInvokerByExplorer", FileEx.CMD);
|
||||
File.WriteAllText(cacheCmdFile, $"@echo {Constants.HARDCODED_APP_NAME} StartAsInvokerByExplorer{Environment.NewLine}start \"\" \"{fileName}\" {arguments}{Environment.NewLine}exit 0");
|
||||
var process = StartProcessExplorer($"\"{cacheCmdFile}\"");
|
||||
IOPath.TryDeleteInDelay(process, cacheCmdFile);
|
||||
return process;
|
||||
}
|
||||
|
||||
public Process? StartAsInvoker(string fileName, string? arguments = null)
|
||||
{
|
||||
if (((IPlatformService)this).IsAdministrator)
|
||||
{
|
||||
// runas /trustlevel:0x20000 没有真正的降权,只是作为具有限制特权,使用 explorer 最好,但不接受参数,可以创建一个临时cmd脚本启动
|
||||
//return StartAsInvokerByRunas(fileName, arguments);
|
||||
return StartAsInvokerByExplorer(fileName, arguments);
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
return Process2.Start(fileName, arguments);
|
||||
}
|
||||
}
|
||||
|
||||
//public Process? StartAsInvoker(ProcessStartInfo startInfo)
|
||||
//{
|
||||
// startInfo.FileName = runas_exe;
|
||||
// startInfo.Arguments = $"/trustlevel:0x20000 \"{startInfo.FileName}\"";
|
||||
// return Process.Start(startInfo);
|
||||
//}
|
||||
|
||||
//public Process? GetProcessByPortOccupy(ushort port, bool isTCPorUDP = true)
|
||||
//{
|
||||
// if (isTCPorUDP)
|
||||
// {
|
||||
// return SocketHelper.GetProcessByTcpPort(port);
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// throw new NotSupportedException();
|
||||
// }
|
||||
// //try
|
||||
// //{
|
||||
// // using var p = new Process
|
||||
// // {
|
||||
// // StartInfo = new ProcessStartInfo
|
||||
// // {
|
||||
// // FileName = "cmd",
|
||||
// // UseShellExecute = false,
|
||||
// // RedirectStandardInput = true,
|
||||
// // RedirectStandardOutput = true,
|
||||
// // CreateNoWindow = true,
|
||||
// // },
|
||||
// // };
|
||||
// // p.Start();
|
||||
// // p.StandardInput.WriteLine($"netstat -ano|findstr \"{port}\"&exit");
|
||||
// // p.StandardInput.AutoFlush = true;
|
||||
// // var reader = p.StandardOutput;
|
||||
// // while (!reader.EndOfStream)
|
||||
// // {
|
||||
// // var line = reader.ReadLine();
|
||||
// // if (line == null) break;
|
||||
// // var lineArray = line.Split(' ', StringSplitOptions.RemoveEmptyEntries);
|
||||
// // if (lineArray.Length != 5) continue;
|
||||
// // if (!lineArray[0].Equals(isTCPorUDP ? "TCP" : "UDP", StringComparison.OrdinalIgnoreCase)) continue;
|
||||
// // if (!lineArray[3].Equals("LISTENING", StringComparison.OrdinalIgnoreCase)) continue;
|
||||
// // if (!lineArray[1].EndsWith($":{port}")) continue;
|
||||
// // if (!ushort.TryParse(lineArray[4], out var pid)) continue;
|
||||
// // p.Close();
|
||||
// // return Process.GetProcessById(pid);
|
||||
// // }
|
||||
// // _ = p.WaitForExit(550);
|
||||
// //}
|
||||
// //catch
|
||||
// //{
|
||||
// //}
|
||||
// //return default;
|
||||
//}
|
||||
|
||||
const string ProxyOverride = "\"ProxyOverride\"=\"localhost;127.*;10.*;172.16.*;172.17.*;172.18.*;172.19.*;172.20.*;172.21.*;172.22.*;172.23.*;172.24.*;172.25.*;172.26.*;172.27.*;172.28.*;172.29.*;172.30.*;172.31.*;192.168.*\"";
|
||||
|
||||
/// <summary>
|
||||
/// 设置启用或关闭系统代理
|
||||
/// </summary>
|
||||
/// <param name="state"></param>
|
||||
/// <param name="ip"></param>
|
||||
/// <param name="port"></param>
|
||||
/// <returns></returns>
|
||||
public bool SetAsSystemProxy(bool state, IPAddress? ip, int port)
|
||||
{
|
||||
try
|
||||
{
|
||||
var proxyEnable = $"\"ProxyEnable\"=dword:{(state ? "00000001" : "00000000")}";
|
||||
var hasIpAndProt = ip != null && port >= 0;
|
||||
var proxyServer = hasIpAndProt ? $"\"proxyServer\"=\"{ip}:{port}\"" : "";
|
||||
var reg = $"Windows Registry Editor Version 5.00{Environment.NewLine}[HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Internet Settings]{Environment.NewLine}{proxyEnable}{Environment.NewLine}{(state ? $"{ProxyOverride}{Environment.NewLine}" : "")}{proxyServer}";
|
||||
var path = IOPath.GetCacheFilePath(CacheTempDirName, "SwitchProxy", FileEx.Reg);
|
||||
File.WriteAllText(path, reg, Encoding.UTF8);
|
||||
var p = StartProcessRegedit($"/s \"{path}\"");
|
||||
IOPath.TryDeleteInDelay(p, path);
|
||||
return true;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Toast.LogAndShowT(ex, TAG);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 设置启用或关闭PAC代理
|
||||
/// </summary>
|
||||
/// <param name="state"></param>
|
||||
/// <param name="url"></param>
|
||||
/// <returns></returns>
|
||||
public bool SetAsSystemPACProxy(bool state, string? url = null)
|
||||
{
|
||||
try
|
||||
{
|
||||
var regAutoConfigUrl = state ? $"\"AutoConfigURL\"=\"{url}\"" : "\"AutoConfigURL\"=\"\"";
|
||||
var reg = $"Windows Registry Editor Version 5.00{Environment.NewLine}[HKEY_CURRENT_USER\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Internet Settings]{Environment.NewLine}{regAutoConfigUrl}";
|
||||
var path = IOPath.GetCacheFilePath(CacheTempDirName, "SwitchPacProxy", FileEx.Reg);
|
||||
File.WriteAllText(path, reg, Encoding.UTF8);
|
||||
var p = StartProcessRegedit($"/s \"{path}\"");
|
||||
IOPath.TryDeleteInDelay(p, path);
|
||||
return true;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Toast.LogAndShowT(ex, TAG);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public IReadOnlyCollection<KeyValuePair<string, string>> GetFontsByGdiPlus()
|
||||
{
|
||||
// https://docs.microsoft.com/zh-cn/typography/font-list
|
||||
var culture = R.Culture;
|
||||
InstalledFontCollection ifc = new();
|
||||
var list = ifc.Families.Where(x => x.IsStyleAvailable(FontStyle.Regular)).Select(x => KeyValuePair.Create(x.GetName(culture.LCID), x.GetName(1033))).ToList();
|
||||
list.Insert(0, IFontManager.Default);
|
||||
return list;
|
||||
}
|
||||
|
||||
#region IsInstall
|
||||
|
||||
static readonly Lazy<bool> _IsInstall = new(() =>
|
||||
{
|
||||
using var reg32 = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32);
|
||||
var value = reg32.Read(@"SOFTWARE\Steam++", "InstPath").TrimEnd(Path.DirectorySeparatorChar);
|
||||
return string.Equals(IOPath.BaseDirectory.TrimEnd(Path.DirectorySeparatorChar), value, StringComparison.OrdinalIgnoreCase);
|
||||
});
|
||||
|
||||
/// <inheritdoc cref="IPlatformService.IsInstall"/>
|
||||
public static bool IsInstall => _IsInstall.Value;
|
||||
|
||||
bool IPlatformService.IsInstall => IsInstall;
|
||||
|
||||
#endregion
|
||||
}
|
||||
@@ -56,8 +56,8 @@ sealed partial class TitaniumCertificateManagerImpl : CertificateManagerImpl, IC
|
||||
=> manager.CreateRootCertificate(true);
|
||||
|
||||
protected override void SharedRemoveTrustedRootCertificate()
|
||||
=> manager.RemoveTrustedRootCertificate(false);
|
||||
=> manager.RemoveTrustedRootCertificate(true);
|
||||
|
||||
protected override void SharedTrustRootCertificate()
|
||||
=> manager.TrustRootCertificate(false);
|
||||
=> manager.TrustRootCertificate(true);
|
||||
}
|
||||
|
||||
+5
-8
@@ -64,14 +64,15 @@ sealed class HttpReverseProxyMiddleware
|
||||
return;
|
||||
}
|
||||
|
||||
if (domainConfig == defaultDomainConfig)
|
||||
if (domainConfig == defaultDomainConfig &&
|
||||
!reverseProxyConfig.Service.OnlyEnableProxyScript)
|
||||
{
|
||||
//部分运营商将奇怪的域名解析到127.0.0.1 再此排除这些不支持的代理域名
|
||||
var ip = await IDnsAnalysisService.Instance.AnalysisDomainIpAsync(url, IDnsAnalysisService.DNS_Alis).FirstOrDefaultAsync();
|
||||
var ip = await reverseProxyConfig.DnsAnalysis.AnalysisDomainIpAsync(context.Request.Host.Value, IDnsAnalysisService.DNS_Dnspods).FirstOrDefaultAsync();
|
||||
if (ip == null || IPAddress.IsLoopback(ip))
|
||||
{
|
||||
context.Response.StatusCode = StatusCodes.Status500InternalServerError;
|
||||
await context.Response.WriteAsync($"域名 {context.Request.Host.Host} 可能已经被 DNS 污染,如果域名为本机域名,请解析为非回环 IP。");
|
||||
await context.Response.WriteAsync($"域名 {context.Request.Host.Host} 可能已经被 DNS 污染,如果域名为本机域名,请解析为非回环 IP。", Encoding.UTF8);
|
||||
return;
|
||||
}
|
||||
}
|
||||
@@ -190,11 +191,7 @@ sealed class HttpReverseProxyMiddleware
|
||||
/// <returns></returns>
|
||||
static async Task HandleErrorAsync(HttpContext context, ForwarderError error)
|
||||
{
|
||||
await context.Response.WriteAsJsonAsync(new
|
||||
{
|
||||
error = error.ToString(),
|
||||
message = context.GetForwarderErrorFeature()?.Exception?.Message,
|
||||
});
|
||||
await context.Response.WriteAsync($"{error}:{context.GetForwarderErrorFeature()?.Exception?.Message}");
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
+3
-3
@@ -78,7 +78,7 @@ sealed partial class YarpCertificateManagerImpl : CertificateManagerImpl, ICerti
|
||||
"Could not remove certificate as it is null or empty.");
|
||||
}
|
||||
|
||||
using var x509Store = new X509Store(StoreName.Root, StoreLocation.CurrentUser);
|
||||
using var x509Store = new X509Store(StoreName.Root, StoreLocation.LocalMachine);
|
||||
|
||||
try
|
||||
{
|
||||
@@ -96,7 +96,7 @@ sealed partial class YarpCertificateManagerImpl : CertificateManagerImpl, ICerti
|
||||
catch (Exception e)
|
||||
{
|
||||
Log.Error(TAG, new ApplicationException(
|
||||
"Failed to remove root certificate trust for CurrentUser store location. You may need admin rights.", e), nameof(SharedRemoveTrustedRootCertificate));
|
||||
"Failed to remove root certificate trust for LocalMachine store location. You may need admin rights.", e), nameof(SharedRemoveTrustedRootCertificate));
|
||||
}
|
||||
finally
|
||||
{
|
||||
@@ -112,7 +112,7 @@ sealed partial class YarpCertificateManagerImpl : CertificateManagerImpl, ICerti
|
||||
"Could not install certificate as it is null or empty.");
|
||||
}
|
||||
|
||||
using var store = new X509Store(StoreName.Root, StoreLocation.CurrentUser);
|
||||
using var store = new X509Store(StoreName.Root, StoreLocation.LocalMachine);
|
||||
try
|
||||
{
|
||||
store.Open(OpenFlags.ReadWrite);
|
||||
|
||||
+2
-1
@@ -68,7 +68,8 @@ sealed partial class YarpReverseProxyServiceImpl : ReverseProxyServiceImpl, IRev
|
||||
else
|
||||
{
|
||||
options.ListenHttpsReverseProxy();
|
||||
options.ListenHttpReverseProxy();
|
||||
if (EnableHttpProxyToHttps)
|
||||
options.ListenHttpReverseProxy();
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -210,7 +210,7 @@ abstract partial class CertificateManagerImpl
|
||||
[SupportedOSPlatform("Linux")]
|
||||
void DeleteRootCertificateLinux()
|
||||
{
|
||||
using var store = new X509Store(StoreName.Root, StoreLocation.CurrentUser);
|
||||
using var store = new X509Store(StoreName.Root, StoreLocation.LocalMachine);
|
||||
store.Open(OpenFlags.ReadOnly);
|
||||
var collection = store.Certificates.Find(X509FindType.FindByIssuerName, IReverseProxyService.RootCertificateName, false);
|
||||
foreach (var item in collection)
|
||||
@@ -233,7 +233,7 @@ abstract partial class CertificateManagerImpl
|
||||
[SupportedOSPlatform("macOS")]
|
||||
async void DeleteRootCertificateMacOS()
|
||||
{
|
||||
using var store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
|
||||
using var store = new X509Store(StoreName.My, StoreLocation.LocalMachine);
|
||||
store.Open(OpenFlags.ReadOnly);
|
||||
var collection = store.Certificates.Find(X509FindType.FindByIssuerName, IReverseProxyService.RootCertificateName, false);
|
||||
foreach (var item in collection)
|
||||
@@ -287,7 +287,7 @@ abstract partial class CertificateManagerImpl
|
||||
}
|
||||
else
|
||||
{
|
||||
using var store = new X509Store(StoreName.Root, StoreLocation.CurrentUser);
|
||||
using var store = new X509Store(StoreName.Root, StoreLocation.LocalMachine);
|
||||
store.Open(OpenFlags.ReadOnly);
|
||||
return store.Certificates.Contains(certificate2);
|
||||
}
|
||||
|
||||
@@ -12,13 +12,13 @@ abstract class ReverseProxyServiceImpl
|
||||
|
||||
public ReverseProxyServiceImpl(
|
||||
IPlatformService platformService,
|
||||
IDnsAnalysisService dnsAnalysis)
|
||||
IDnsAnalysisService dnsAnalyses)
|
||||
{
|
||||
this.platformService = platformService;
|
||||
DnsAnalysis = dnsAnalysis;
|
||||
DnsAnalysis = dnsAnalyses;
|
||||
}
|
||||
|
||||
public IDnsAnalysisService DnsAnalysis { get; }
|
||||
public IDnsAnalysisService? DnsAnalysis { get; }
|
||||
|
||||
public abstract ICertificateManager CertificateManager { get; }
|
||||
|
||||
|
||||
@@ -41,6 +41,8 @@
|
||||
<!--<PackageReference Include="CommunityToolkit.Mvvm"/>-->
|
||||
<PackageReference Include="ReactiveUI.Fody" />
|
||||
<!--<PackageReference Include="ArchiSteamFarm.Library" />-->
|
||||
<PackageReference Include="Ae.DNS.Client" />
|
||||
<!--<PackageReference Include="Ae.Dns.Protocol" />-->
|
||||
</ItemGroup>
|
||||
<ItemGroup Condition=" $(TargetFramework.StartsWith('netstandard')) ">
|
||||
<PackageReference Include="JustArchiNET.Madness" />
|
||||
|
||||
@@ -12,9 +12,16 @@ namespace System.Application.Services
|
||||
/// </summary>
|
||||
public interface IDnsAnalysisService
|
||||
{
|
||||
protected const string TAG = "DnsAnalysisService";
|
||||
|
||||
static IDnsAnalysisService Instance => DI.Get<IDnsAnalysisService>();
|
||||
|
||||
#region DNS常量
|
||||
const string DNS_Ali_DohAddres = "https://dns.alidns.com";
|
||||
const string Dnspod_DohAddres = "https://1.12.12.12";
|
||||
const string Google_DohAddres = "https://dns.google";
|
||||
const string Cloudflare_DohAddres = "https://cloudflare-dns.com";
|
||||
|
||||
protected const string PrimaryDNS_IPV6_Ali = "2400:3200::1";
|
||||
|
||||
const string PrimaryDNS_Ali = "223.5.5.5";
|
||||
@@ -66,7 +73,7 @@ namespace System.Application.Services
|
||||
return r.RoundtripTime;
|
||||
}
|
||||
|
||||
int AnalysisHostnameTime(string url);
|
||||
Task<int> AnalysisHostnameTime(string url, CancellationToken cancellationToken = default);
|
||||
|
||||
/// <summary>
|
||||
/// 解析域名 IP 地址
|
||||
@@ -119,6 +126,19 @@ namespace System.Application.Services
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// DOH 解析域名 IP 地址
|
||||
/// </summary>
|
||||
/// <param name="hostNameOrAddress">要解析的主机名或 IP 地址</param>
|
||||
/// <param name="dnsServers">自定义 DNS 服务器,可选的值有 <see cref="DNS_Alis"/>, <see cref="DNS_114s"/>, <see cref="DNS_Cloudflares"/>, <see cref="DNS_Dnspods"/>, <see cref="DNS_Googles"/></param>
|
||||
/// <param name="isIPv6"></param>
|
||||
/// <param name="cancellationToken"></param>
|
||||
/// <returns></returns>
|
||||
IAsyncEnumerable<IPAddress>? DohAnalysisDomainIpAsync(string hostNameOrAddress, string? dnsServers, bool isIPv6, CancellationToken cancellationToken = default)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
async Task<string?> GetHostByIPAddress(IPAddress ip)
|
||||
{
|
||||
var hostEntry = await Dns.GetHostEntryAsync(ip);
|
||||
|
||||
@@ -0,0 +1,72 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Net;
|
||||
using System.Net.NetworkInformation;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace System.Application.Services
|
||||
{
|
||||
/// <summary>
|
||||
/// DNS 解析服务
|
||||
/// </summary>
|
||||
public interface IDnsDohAnalysisService
|
||||
{
|
||||
protected const string TAG = "DnsDohAnalysisService";
|
||||
|
||||
static IDnsDohAnalysisService Instance => DI.Get<IDnsDohAnalysisService>();
|
||||
|
||||
#region DNS常量
|
||||
const string DNS_Ali_DohAddres = "https://dns.alidns.com/dns-query";
|
||||
|
||||
const string Dnspod_DohAddres = "https://1.12.12.12/dns-query";
|
||||
|
||||
const string Google_DohAddres = "https://dns.google/dns-query";
|
||||
|
||||
const string Cloudflare_DohAddres = "https://cloudflare-dns.com/dns-query";
|
||||
#endregion
|
||||
|
||||
protected const string IPV6_TESTDOMAIN = "ipv6.rmbgame.net";
|
||||
|
||||
/// <summary>
|
||||
/// 解析域名 IP 地址
|
||||
/// </summary>
|
||||
/// <param name="hostNameOrAddress">要解析的主机名或 IP 地址</param>
|
||||
/// <param name="isIPv6"></param>
|
||||
/// <param name="cancellationToken"></param>
|
||||
/// <returns></returns>
|
||||
IAsyncEnumerable<IPAddress> AnalysisDomainIpAsync(string hostNameOrAddress, bool isIPv6, CancellationToken cancellationToken = default)
|
||||
=> AnalysisDomainIpAsync(hostNameOrAddress, default, isIPv6, cancellationToken);
|
||||
|
||||
/// <summary>
|
||||
/// 解析域名 IP 地址
|
||||
/// </summary>
|
||||
/// <param name="hostNameOrAddress">要解析的主机名或 IP 地址</param>
|
||||
/// <param name="cancellationToken"></param>
|
||||
/// <returns></returns>
|
||||
IAsyncEnumerable<IPAddress> AnalysisDomainIpAsync(string hostNameOrAddress, CancellationToken cancellationToken = default)
|
||||
=> AnalysisDomainIpAsync(hostNameOrAddress, default, default, cancellationToken);
|
||||
|
||||
/// <summary>
|
||||
/// 解析域名 IP 地址
|
||||
/// </summary>
|
||||
/// <param name="hostNameOrAddress">要解析的主机名或 IP 地址</param>
|
||||
/// <param name="dnsServers">自定义 DNS 服务器,可选的值有 <see cref="DNS_Alis"/>, <see cref="DNS_114s"/>, <see cref="DNS_Cloudflares"/>, <see cref="DNS_Dnspods"/>, <see cref="DNS_Googles"/></param>
|
||||
/// <param name="cancellationToken"></param>
|
||||
/// <returns></returns>
|
||||
IAsyncEnumerable<IPAddress> AnalysisDomainIpAsync(string hostNameOrAddress, string? dnsServers, CancellationToken cancellationToken = default)
|
||||
=> AnalysisDomainIpAsync(hostNameOrAddress, dnsServers, default, cancellationToken);
|
||||
|
||||
/// <summary>
|
||||
/// 解析域名 IP 地址
|
||||
/// </summary>
|
||||
/// <param name="hostNameOrAddress">要解析的主机名或 IP 地址</param>
|
||||
/// <param name="dnsServers">自定义 DNS 服务器,可选的值有 <see cref="DNS_Alis"/>, <see cref="DNS_114s"/>, <see cref="DNS_Cloudflares"/>, <see cref="DNS_Dnspods"/>, <see cref="DNS_Googles"/></param>
|
||||
/// <param name="isIPv6"></param>
|
||||
/// <param name="cancellationToken"></param>
|
||||
/// <returns></returns>
|
||||
IAsyncEnumerable<IPAddress> AnalysisDomainIpAsync(string hostNameOrAddress, string? dnsServers, bool isIPv6, CancellationToken cancellationToken = default);
|
||||
|
||||
Task<bool> GetIsIpv6Support() => Task.FromResult(false);
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,5 @@
|
||||
using System.Application.Models;
|
||||
using System.Application.Settings;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Text.RegularExpressions;
|
||||
@@ -49,12 +50,19 @@ namespace System.Application.Services
|
||||
/// <returns></returns>
|
||||
int GetSteamProcessPid();
|
||||
|
||||
bool IsSteamChinaLauncher();
|
||||
|
||||
/// <summary>
|
||||
/// 启动 Steam
|
||||
/// </summary>
|
||||
/// <param name="arguments"></param>
|
||||
void StartSteam(string? arguments = null);
|
||||
|
||||
/// <summary>
|
||||
/// 使用配置的参数启动 Steam
|
||||
/// </summary>
|
||||
void StartSteamWithParameter() => StartSteam(SteamSettings.SteamStratParameter.Value);
|
||||
|
||||
/// <summary>
|
||||
/// 安全退出 Steam(如果有修改Steam数据的操作请退出后在执行不然Steam安全退出会还原修改)
|
||||
/// </summary>
|
||||
|
||||
@@ -33,6 +33,12 @@ namespace System.Application.Services
|
||||
|
||||
bool IsSteamChinaLauncher();
|
||||
|
||||
bool IsSteamInBigPictureMode();
|
||||
|
||||
uint GetSecondsSinceAppActive();
|
||||
|
||||
uint GetServerRealTime();
|
||||
|
||||
bool IsAppInstalled(uint appid);
|
||||
|
||||
string GetAppInstallDir(uint appid);
|
||||
|
||||
@@ -0,0 +1,99 @@
|
||||
using System.Linq;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading;
|
||||
using System.Net;
|
||||
using System.Net.Http;
|
||||
using Ae.Dns.Client;
|
||||
using Ae.Dns.Protocol;
|
||||
using Microsoft.Extensions.Logging;
|
||||
using Ae.Dns.Protocol.Records;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace System.Application.Services;
|
||||
|
||||
public sealed class DnsDohAnalysisService : GeneralHttpClientFactory, IDnsAnalysisService
|
||||
{
|
||||
public DnsDohAnalysisService(
|
||||
ILoggerFactory loggerFactory,
|
||||
IHttpPlatformHelperService http_helper,
|
||||
IHttpClientFactory clientFactory)
|
||||
: base(loggerFactory.CreateLogger(IDnsAnalysisService.TAG), http_helper, clientFactory)
|
||||
{
|
||||
}
|
||||
|
||||
public async Task<int> AnalysisHostnameTime(string url, CancellationToken cancellationToken = default)
|
||||
{
|
||||
if (!string.IsNullOrEmpty(url))
|
||||
{
|
||||
var client = CreateClient();
|
||||
client.BaseAddress = new Uri(IDnsAnalysisService.Dnspod_DohAddres);
|
||||
IDnsClient dnsClient = new DnsHttpClient(client);
|
||||
|
||||
var queryType = Ae.Dns.Protocol.Enums.DnsQueryType.A;
|
||||
var query = DnsQueryFactory.CreateQuery(url, queryType);
|
||||
|
||||
var answer = await dnsClient.Query(query, cancellationToken);
|
||||
var value = answer.Answers.FirstOrDefault()?.TimeToLive;
|
||||
return (int)(value ?? 0);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 解析域名 IP 地址
|
||||
/// </summary>
|
||||
/// <param name="hostNameOrAddress">要解析的主机名或 IP 地址</param>
|
||||
/// <param name="isIPv6"></param>
|
||||
/// <param name="cancellationToken"></param>
|
||||
/// <returns></returns>
|
||||
public IAsyncEnumerable<IPAddress> AnalysisDomainIpAsync(string hostNameOrAddress, bool isIPv6, CancellationToken cancellationToken = default)
|
||||
=> DohAnalysisDomainIpAsync(hostNameOrAddress, default, isIPv6, cancellationToken);
|
||||
|
||||
/// <summary>
|
||||
/// 解析域名 IP 地址
|
||||
/// </summary>
|
||||
/// <param name="hostNameOrAddress">要解析的主机名或 IP 地址</param>
|
||||
/// <param name="cancellationToken"></param>
|
||||
/// <returns></returns>
|
||||
public IAsyncEnumerable<IPAddress> AnalysisDomainIpAsync(string hostNameOrAddress, CancellationToken cancellationToken = default)
|
||||
=> DohAnalysisDomainIpAsync(hostNameOrAddress, default, default, cancellationToken);
|
||||
|
||||
/// <summary>
|
||||
/// 解析域名 IP 地址
|
||||
/// </summary>
|
||||
/// <param name="hostNameOrAddress">要解析的主机名或 IP 地址</param>
|
||||
/// <param name="dnsServers">自定义 DNS 服务器,可选的值有 <see cref="DNS_Alis"/>, <see cref="DNS_114s"/>, <see cref="DNS_Cloudflares"/>, <see cref="DNS_Dnspods"/>, <see cref="DNS_Googles"/></param>
|
||||
/// <param name="cancellationToken"></param>
|
||||
/// <returns></returns>
|
||||
public IAsyncEnumerable<IPAddress> AnalysisDomainIpAsync(string hostNameOrAddress, string? dnsServers, CancellationToken cancellationToken = default)
|
||||
=> DohAnalysisDomainIpAsync(hostNameOrAddress, dnsServers, default, cancellationToken);
|
||||
|
||||
/// <summary>
|
||||
/// DOH 解析域名 IP 地址
|
||||
/// </summary>
|
||||
/// <param name="hostNameOrAddress">要解析的主机名或 IP 地址</param>
|
||||
/// <param name="dnsServers">自定义 DNS 服务器,可选的值有 <see cref="DNS_Alis"/>, <see cref="DNS_114s"/>, <see cref="DNS_Cloudflares"/>, <see cref="DNS_Dnspods"/>, <see cref="DNS_Googles"/></param>
|
||||
/// <param name="isIPv6"></param>
|
||||
/// <param name="cancellationToken"></param>
|
||||
/// <returns></returns>
|
||||
public async IAsyncEnumerable<IPAddress> DohAnalysisDomainIpAsync(string hostNameOrAddress, string? dnsServers, bool isIPv6, [EnumeratorCancellation] CancellationToken cancellationToken = default)
|
||||
{
|
||||
var client = CreateClient();
|
||||
client.BaseAddress = new Uri(string.IsNullOrEmpty(dnsServers) ? IDnsAnalysisService.Dnspod_DohAddres : dnsServers);
|
||||
IDnsClient dnsClient = new DnsHttpClient(client);
|
||||
|
||||
var queryType = isIPv6 ? Ae.Dns.Protocol.Enums.DnsQueryType.AAAA : Ae.Dns.Protocol.Enums.DnsQueryType.A;
|
||||
var query = DnsQueryFactory.CreateQuery(hostNameOrAddress, queryType);
|
||||
|
||||
var answer = await dnsClient.Query(query, cancellationToken);
|
||||
|
||||
foreach (var x in answer.Answers)
|
||||
{
|
||||
if (x.Resource is DnsIpAddressResource ipAddressResource)
|
||||
{
|
||||
yield return ipAddressResource.IPAddress;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
using System.Application.Models;
|
||||
using System.Application.Models;
|
||||
using System.Collections.Generic;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
|
||||
@@ -66,8 +66,7 @@ namespace System.Application.Services.Implementation
|
||||
url += "&dimensions=600x900";
|
||||
}
|
||||
|
||||
var rsp = await s.SendAsync<SteamGridItemData>
|
||||
(url, () =>
|
||||
var rsp = await s.SendAsync<SteamGridItemData>(url, () =>
|
||||
{
|
||||
var rq = new HttpRequestMessage(HttpMethod.Get, url);
|
||||
rq.Headers.Authorization = new Net.Http.Headers.AuthenticationHeaderValue("Bearer", ApiKey);
|
||||
|
||||
@@ -24,6 +24,12 @@ namespace System.Application.Services.Implementation
|
||||
|
||||
public bool IsSteamChinaLauncher() => default;
|
||||
|
||||
public bool IsSteamInBigPictureMode() => default;
|
||||
|
||||
public uint GetSecondsSinceAppActive() => default;
|
||||
|
||||
public uint GetServerRealTime() => default;
|
||||
|
||||
public bool IsAppInstalled(uint appid) => default;
|
||||
|
||||
public string GetAppInstallDir(uint appid) => string.Empty;
|
||||
|
||||
@@ -246,7 +246,7 @@ namespace System.Application.Services
|
||||
public void Initialize()
|
||||
{
|
||||
if (!stmService.IsRunningSteamProcess && SteamSettings.IsAutoRunSteam.Value)
|
||||
stmService.StartSteam(SteamSettings.SteamStratParameter.Value);
|
||||
stmService.StartSteamWithParameter();
|
||||
|
||||
Task.Factory.StartNew(async () =>
|
||||
{
|
||||
@@ -274,15 +274,16 @@ namespace System.Application.Services
|
||||
CurrentSteamUser = await swWebService.GetUserInfo(id);
|
||||
CurrentSteamUser.AvatarStream = httpService.GetImageAsync(CurrentSteamUser.AvatarFull, ImageChannelType.SteamAvatars);
|
||||
//AvatarPath = ImageSouce.TryParse(await CurrentSteamUser.AvatarStream, isCircle: true);
|
||||
|
||||
CurrentSteamUser.IPCountry = swLocalService.GetIPCountry();
|
||||
|
||||
IsSteamChinaLauncher = swLocalService.IsSteamChinaLauncher();
|
||||
IsSteamChinaLauncher = stmService.IsSteamChinaLauncher();
|
||||
var steamServerTime = ((long)swLocalService.GetServerRealTime()).ToDateTimeOffsetS();
|
||||
//var steamRunTime = swLocalService.GetSecondsSinceAppActive();
|
||||
|
||||
#region 初始化需要steam启动才能使用的功能
|
||||
if (SteamSettings.IsEnableSteamLaunchNotification.Value)
|
||||
{
|
||||
INotificationService.Instance.Notify($"{AppResources.Steam_CheckStarted}{(IsSteamChinaLauncher ? AppResources.Steam_SteamChina : AppResources.Steam_SteamWorld)}{Environment.NewLine}{AppResources.Steam_CurrentUser}{CurrentSteamUser.SteamNickName}{Environment.NewLine}{AppResources.Steam_CurrentIPCountry}{CurrentSteamUser.IPCountry}", NotificationType.Message);
|
||||
INotificationService.Instance.Notify($"{AppResources.Steam_CheckStarted}{(IsSteamChinaLauncher ? AppResources.Steam_SteamChina : AppResources.Steam_SteamWorld)}{Environment.NewLine}{AppResources.Steam_CurrentUser}{CurrentSteamUser.SteamNickName}{Environment.NewLine}{AppResources.Steam_CurrentIPCountry}{CurrentSteamUser.IPCountry}{Environment.NewLine}{AppResources.Steam_ServerTime}{steamServerTime:yyyy-MM-dd HH:mm:ss}", NotificationType.Message);
|
||||
}
|
||||
|
||||
if (GameLibrarySettings.IsAutoAFKApps.Value)
|
||||
@@ -447,7 +448,7 @@ namespace System.Application.Services
|
||||
IsDisposedClient = false;
|
||||
SteamApps.Clear();
|
||||
var apps = await ISteamService.Instance.GetAppInfos();
|
||||
if (apps.Any())
|
||||
if (apps != null)
|
||||
{
|
||||
var temps = swLocalService.OwnsApps(apps);
|
||||
LoadGames(temps);
|
||||
|
||||
@@ -14,6 +14,7 @@ public sealed class SteamSettings : SettingsHost2<SteamSettings>
|
||||
if (!IApplication.IsDesktopPlatform) return;
|
||||
IsRunSteamMinimized.ValueChanged += IsRunSteamMinimized_ValueChanged;
|
||||
IsRunSteamNoCheckUpdate.ValueChanged += IsRunSteamNoCheckUpdate_ValueChanged;
|
||||
IsRunSteamChina.ValueChanged += IsRunSteamChina_ValueChanged;
|
||||
}
|
||||
|
||||
static void IsRunSteamNoCheckUpdate_ValueChanged(object? sender, ValueChangedEventArgs<bool> e)
|
||||
@@ -32,6 +33,14 @@ public sealed class SteamSettings : SettingsHost2<SteamSettings>
|
||||
SteamStratParameter.Value = SteamStratParameter.Value.Replace("-silent", "").Trim();
|
||||
}
|
||||
|
||||
static void IsRunSteamChina_ValueChanged(object? sender, ValueChangedEventArgs<bool> e)
|
||||
{
|
||||
if (e.NewValue)
|
||||
SteamStratParameter.Value += " -steamchina";
|
||||
else if (SteamStratParameter.Value != null)
|
||||
SteamStratParameter.Value = SteamStratParameter.Value.Replace("-steamchina", "").Trim();
|
||||
}
|
||||
|
||||
static readonly SerializableProperty<string?>? _SteamStratParameter = IApplication.IsDesktopPlatform ?
|
||||
GetProperty<string?>(defaultValue: null) : null;
|
||||
|
||||
@@ -82,6 +91,16 @@ public sealed class SteamSettings : SettingsHost2<SteamSettings>
|
||||
[SupportedOSPlatform("Linux")]
|
||||
public static SerializableProperty<bool> IsRunSteamNoCheckUpdate => _IsRunSteamNoCheckUpdate ?? throw new PlatformNotSupportedException();
|
||||
|
||||
static readonly SerializableProperty<bool>? _IsRunSteamChina = IApplication.IsDesktopPlatform ? GetProperty(defaultValue: false) : null;
|
||||
|
||||
/// <summary>
|
||||
/// Steam 启动时模拟为蒸汽平台(Steam国服)启动
|
||||
/// </summary>
|
||||
[SupportedOSPlatform("Windows7.0")]
|
||||
[SupportedOSPlatform("macOS")]
|
||||
[SupportedOSPlatform("Linux")]
|
||||
public static SerializableProperty<bool> IsRunSteamChina => _IsRunSteamChina ?? throw new PlatformNotSupportedException();
|
||||
|
||||
static readonly SerializableProperty<bool>? _IsEnableSteamLaunchNotification = IApplication.IsDesktopPlatform ? GetProperty(defaultValue: true) : null;
|
||||
|
||||
/// <summary>
|
||||
|
||||
+18
@@ -5356,6 +5356,15 @@ namespace System.Application.UI.Resx {
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 Steam 启动时模拟为蒸汽平台(Steam国服)启动 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string Settings_Steam_RunSteamChina {
|
||||
get {
|
||||
return ResourceManager.GetString("Settings_Steam_RunSteamChina", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 Steam 启动参数 的本地化字符串。
|
||||
/// </summary>
|
||||
@@ -5672,6 +5681,15 @@ namespace System.Application.UI.Resx {
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 Steam 服务端时间: 的本地化字符串。
|
||||
/// </summary>
|
||||
public static string Steam_ServerTime {
|
||||
get {
|
||||
return ResourceManager.GetString("Steam_ServerTime", resourceCulture);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 查找类似 是否删除此家庭库共享。 的本地化字符串。
|
||||
/// </summary>
|
||||
|
||||
@@ -1230,6 +1230,9 @@ AAAAA-BBBBB-CCCC3</value>
|
||||
<data name="Settings_Steam_RuningMinimize" xml:space="preserve">
|
||||
<value>Steam 启动时最小化到托盘</value>
|
||||
</data>
|
||||
<data name="Settings_Steam_RunSteamChina" xml:space="preserve">
|
||||
<value>Steam 启动时模拟为蒸汽平台(Steam国服)启动</value>
|
||||
</data>
|
||||
<data name="Settings_Steam_RuningAdmin" xml:space="preserve">
|
||||
<value>以管理员权限运行 Steam</value>
|
||||
</data>
|
||||
@@ -1723,6 +1726,9 @@ AAAAA-BBBBB-CCCC3</value>
|
||||
<data name="Steam_CurrentUser" xml:space="preserve">
|
||||
<value>Steam 登录用户:</value>
|
||||
</data>
|
||||
<data name="Steam_ServerTime" xml:space="preserve">
|
||||
<value>Steam 服务端时间:</value>
|
||||
</data>
|
||||
<data name="Steam_SteamChina" xml:space="preserve">
|
||||
<value>Steam 国服</value>
|
||||
</data>
|
||||
|
||||
@@ -131,7 +131,7 @@ namespace System.Application.UI.ViewModels
|
||||
foreach (var item in SteamUsers.Where(x => x.MostRecent))
|
||||
item.MostRecent = false;
|
||||
|
||||
await steamService.ShutdownSteamAsync();
|
||||
steamService.TryKillSteamProcess();
|
||||
|
||||
if (user != null)
|
||||
{
|
||||
@@ -144,7 +144,7 @@ namespace System.Application.UI.ViewModels
|
||||
steamService.SetCurrentUser(string.Empty);
|
||||
}
|
||||
|
||||
steamService.StartSteam(SteamSettings.SteamStratParameter.Value);
|
||||
steamService.StartSteamWithParameter();
|
||||
}
|
||||
|
||||
public async void DeleteUserButton_Click(SteamUser user)
|
||||
|
||||
@@ -47,12 +47,13 @@ namespace System.Application.UI.ViewModels
|
||||
|
||||
public async Task SaveSteamEditedApps()
|
||||
{
|
||||
if (await ISteamService.Instance.SaveAppInfosToSteam())
|
||||
var stmService = ISteamService.Instance;
|
||||
if (await stmService.SaveAppInfosToSteam())
|
||||
{
|
||||
if (await MessageBox.ShowAsync(AppResources.SaveEditedAppInfo_RestartSteamTip, ThisAssembly.AssemblyTrademark, MessageBox.Button.OKCancel) == MessageBox.Result.OK)
|
||||
{
|
||||
await ISteamService.Instance.ShutdownSteamAsync();
|
||||
ISteamService.Instance.StartSteam();
|
||||
stmService.TryKillSteamProcess();
|
||||
stmService.StartSteamWithParameter();
|
||||
}
|
||||
Toast.Show(AppResources.SaveEditedAppInfo_SaveToSteamSuccess);
|
||||
}
|
||||
|
||||
@@ -277,7 +277,7 @@ namespace System.Application.UI.ViewModels
|
||||
|
||||
private bool _IsLogining;
|
||||
|
||||
public void LoginSteamImport()
|
||||
public async void LoginSteamImport()
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(UserName))
|
||||
{
|
||||
@@ -300,8 +300,7 @@ namespace System.Application.UI.ViewModels
|
||||
|
||||
_Enroll.Language = R.GetCurrentCultureSteamLanguageName();
|
||||
|
||||
bool result = false;
|
||||
Task.Run(() =>
|
||||
try
|
||||
{
|
||||
var isSupportedToastService = ToastService.IsSupported;
|
||||
if (isSupportedToastService)
|
||||
@@ -309,7 +308,7 @@ namespace System.Application.UI.ViewModels
|
||||
ToastService.Current.Set(AppResources.Logining);
|
||||
}
|
||||
LoginSteamLoadingText = AppResources.Logining;
|
||||
result = _SteamAuthenticator.Enroll(_Enroll);
|
||||
var result = await _SteamAuthenticator.Enroll(_Enroll);
|
||||
if (isSupportedToastService)
|
||||
{
|
||||
ToastService.Current.Set();
|
||||
@@ -393,11 +392,13 @@ namespace System.Application.UI.ViewModels
|
||||
|
||||
Toast.Show(AppResources.LocalAuth_SteamUserImportSuccess);
|
||||
}
|
||||
}).ContinueWith(s =>
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Log.Error(nameof(AddAuthWindowViewModel), s.Exception, nameof(LoginSteamImport));
|
||||
MessageBox.Show(s.Exception, "Error " + nameof(LoginSteamImport));
|
||||
}, TaskContinuationOptions.OnlyOnFaulted).ContinueWith(s =>
|
||||
Log.Error(nameof(AddAuthWindowViewModel), ex, nameof(LoginSteamImport));
|
||||
MessageBox.Show(ex, "Error " + nameof(LoginSteamImport));
|
||||
}
|
||||
finally
|
||||
{
|
||||
_IsLogining = false;
|
||||
if (ToastService.IsSupported)
|
||||
@@ -405,8 +406,18 @@ namespace System.Application.UI.ViewModels
|
||||
ToastService.Current.Set();
|
||||
}
|
||||
LoginSteamLoadingText = null;
|
||||
s.Dispose();
|
||||
});
|
||||
}
|
||||
//Task.Run(() =>
|
||||
//{
|
||||
|
||||
//}).ContinueWith(s =>
|
||||
//{
|
||||
|
||||
//}, TaskContinuationOptions.OnlyOnFaulted).ContinueWith(s =>
|
||||
//{
|
||||
|
||||
//s.Dispose();
|
||||
//});
|
||||
}
|
||||
|
||||
public void ImportWinAuth(string filePath)
|
||||
|
||||
@@ -173,7 +173,7 @@ namespace System.Application.UI.ViewModels
|
||||
var index = item.Index;
|
||||
if (up ? item.Index != 0 : item.Index != _AuthorizedSourceList.Count - 1)
|
||||
{
|
||||
var dest = AuthorizedList[(up ? index - 1 : index + 1)];
|
||||
var dest = AuthorizedList[up ? index - 1 : index + 1];
|
||||
|
||||
item.Index = dest.Index;
|
||||
dest.Index = index;
|
||||
@@ -198,7 +198,7 @@ namespace System.Application.UI.ViewModels
|
||||
if (result.IsOK())
|
||||
{
|
||||
steamService.TryKillSteamProcess();
|
||||
steamService.StartSteam();
|
||||
steamService.StartSteamWithParameter();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+26
-30
@@ -241,7 +241,7 @@ namespace System.Application.Models
|
||||
/// <param name="data">Name-data pairs</param>
|
||||
/// <param name="cookies">current cookie container</param>
|
||||
/// <returns>response body</returns>
|
||||
static string Request(string url, string method, NameValueCollection? data = null, CookieContainer? cookies = null, NameValueCollection? headers = null, int timeout = 0)
|
||||
static async Task<string> Request(string url, string method, NameValueCollection? data = null, CookieContainer? cookies = null, NameValueCollection? headers = null, int timeout = 0)
|
||||
{
|
||||
// create form-encoded data for query or body
|
||||
string query = data == null ? string.Empty : string.Join("&", Array.ConvertAll(data.AllKeys, key => string.Format("{0}={1}", HttpUtility.UrlEncode(key), HttpUtility.UrlEncode(data[key]))));
|
||||
@@ -281,31 +281,27 @@ namespace System.Application.Models
|
||||
request.ContentType = "application/x-www-form-urlencoded; charset=UTF-8";
|
||||
request.ContentLength = query.Length;
|
||||
|
||||
StreamWriter requestStream = new StreamWriter(request.GetRequestStream());
|
||||
using StreamWriter requestStream = new StreamWriter(await request.GetRequestStreamAsync());
|
||||
requestStream.Write(query);
|
||||
requestStream.Close();
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
|
||||
using HttpWebResponse response = (HttpWebResponse)await request.GetResponseAsync();
|
||||
LogRequest(method, url, cookies, data, response.StatusCode.ToString() + " " + response.StatusDescription);
|
||||
|
||||
// OK?
|
||||
if (response.StatusCode != HttpStatusCode.OK)
|
||||
{
|
||||
LogRequest(method, url, cookies, data, response.StatusCode.ToString() + " " + response.StatusDescription);
|
||||
|
||||
// OK?
|
||||
if (response.StatusCode != HttpStatusCode.OK)
|
||||
{
|
||||
throw new WinAuthInvalidRequestException(string.Format("{0}: {1}", (int)response.StatusCode, response.StatusDescription));
|
||||
}
|
||||
|
||||
// load the response
|
||||
using (StreamReader responseStream = new StreamReader(response.GetResponseStream()))
|
||||
{
|
||||
string responseData = responseStream.ReadToEnd();
|
||||
LogRequest(method, url, cookies, data, responseData);
|
||||
return responseData;
|
||||
}
|
||||
throw new WinAuthInvalidRequestException(string.Format("{0}: {1}", (int)response.StatusCode, response.StatusDescription));
|
||||
}
|
||||
|
||||
// load the response
|
||||
using StreamReader responseStream = new StreamReader(response.GetResponseStream());
|
||||
string responseData = responseStream.ReadToEnd();
|
||||
LogRequest(method, url, cookies, data, responseData);
|
||||
return responseData;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
@@ -329,7 +325,7 @@ namespace System.Application.Models
|
||||
/// <summary>
|
||||
/// Enroll the authenticator with the server
|
||||
/// </summary>
|
||||
public bool Enroll(EnrollState state)
|
||||
public async Task<bool> Enroll(EnrollState state)
|
||||
{
|
||||
// clear error
|
||||
state.Error = null;
|
||||
@@ -357,7 +353,7 @@ namespace System.Application.Models
|
||||
{ "X-Requested-With", "com.valvesoftware.android.steam.community" },
|
||||
};
|
||||
|
||||
response = Request("https://steamcommunity.com/login?oauth_client_id=DE45CD61&oauth_scope=read_profile%20write_profile%20read_client%20write_client", "GET", null, cookies, headers);
|
||||
response = await Request("https://steamcommunity.com/login?oauth_client_id=DE45CD61&oauth_scope=read_profile%20write_profile%20read_client%20write_client", "GET", null, cookies, headers);
|
||||
}
|
||||
|
||||
// Steam strips any non-ascii chars from username and password
|
||||
@@ -367,7 +363,7 @@ namespace System.Application.Models
|
||||
// get the user's RSA key
|
||||
data.Add("donotache", donotache_value);
|
||||
data.Add("username", state.Username);
|
||||
response = Request(COMMUNITY_BASE + "/login/getrsakey", "POST", data, cookies);
|
||||
response = await Request(COMMUNITY_BASE + "/login/getrsakey", "POST", data, cookies);
|
||||
var rsaresponse = JObject.Parse(response);
|
||||
if (rsaresponse.SelectToken("success")?.Value<bool>() != true)
|
||||
{
|
||||
@@ -406,7 +402,7 @@ namespace System.Application.Models
|
||||
{ "donotache", donotache_value },
|
||||
};
|
||||
const string url_login_dologin = "/login/dologin/";
|
||||
response = Request(COMMUNITY_BASE + url_login_dologin, "POST", data, cookies);
|
||||
response = await Request(COMMUNITY_BASE + url_login_dologin, "POST", data, cookies);
|
||||
var loginresponse = JsonConvert.DeserializeObject<Dictionary<string, object>>(response);
|
||||
if (loginresponse == null)
|
||||
{
|
||||
@@ -452,7 +448,7 @@ namespace System.Application.Models
|
||||
state.RequiresEmailAuth = false;
|
||||
}
|
||||
|
||||
// require email auth
|
||||
// require 2fa auth
|
||||
if (loginresponse.ContainsKey("requires_twofactor") == true && (bool)loginresponse["requires_twofactor"] == true)
|
||||
{
|
||||
state.Requires2FA = true;
|
||||
@@ -489,7 +485,7 @@ namespace System.Application.Models
|
||||
// login to webapi
|
||||
data.Clear();
|
||||
data.Add("access_token", state.OAuthToken);
|
||||
response = Request(WEBAPI_BASE + "/ISteamWebUserPresenceOAuth/Logon/v0001", "POST", data);
|
||||
response = await Request(WEBAPI_BASE + "/ISteamWebUserPresenceOAuth/Logon/v0001", "POST", data);
|
||||
|
||||
var sessionid = cookies.GetCookies(new Uri(COMMUNITY_BASE + "/"))?["sessionid"]?.Value;
|
||||
|
||||
@@ -500,7 +496,7 @@ namespace System.Application.Models
|
||||
data.Add("arg", "null");
|
||||
data.Add("sessionid", sessionid);
|
||||
|
||||
response = Request(COMMUNITY_BASE + "/steamguard/phoneajax", "POST", data, cookies);
|
||||
response = await Request(COMMUNITY_BASE + "/steamguard/phoneajax", "POST", data, cookies);
|
||||
var jsonresponse = JObject.Parse(response);
|
||||
var hasPhone = SelectTokenValueNotNull<bool>(response, jsonresponse, "has_phone");
|
||||
if (hasPhone == false)
|
||||
@@ -523,7 +519,7 @@ namespace System.Application.Models
|
||||
data.Add("device_identifier", deviceId);
|
||||
data.Add("sms_phone_id", "1");
|
||||
const string url_ITwoFactorService_AddAuthenticator_v0001 = "/ITwoFactorService/AddAuthenticator/v0001";
|
||||
response = Request(WEBAPI_BASE + url_ITwoFactorService_AddAuthenticator_v0001, "POST", data);
|
||||
response = await Request(WEBAPI_BASE + url_ITwoFactorService_AddAuthenticator_v0001, "POST", data);
|
||||
var tfaresponse = JObject.Parse(response);
|
||||
if (response.IndexOf("status") == -1 && SelectTokenValueNotNull<int>(response, tfaresponse, "response.status") == 84)
|
||||
{
|
||||
@@ -585,7 +581,7 @@ namespace System.Application.Models
|
||||
{
|
||||
data.Add("authenticator_code", CalculateCode(false));
|
||||
data.Add("authenticator_time", ServerTime.ToString());
|
||||
response = Request(WEBAPI_BASE + "/ITwoFactorService/FinalizeAddAuthenticator/v0001", "POST", data);
|
||||
response = await Request(WEBAPI_BASE + "/ITwoFactorService/FinalizeAddAuthenticator/v0001", "POST", data);
|
||||
var finalizeresponse = JObject.Parse(response);
|
||||
if (response.IndexOf("status") != -1 && SelectTokenValueNotNull<int>(response, finalizeresponse, "response.status") == INVALID_ACTIVATION_CODE)
|
||||
{
|
||||
@@ -632,7 +628,7 @@ namespace System.Application.Models
|
||||
data.Add("access_token", state.OAuthToken);
|
||||
data.Add("steamid", state.SteamId);
|
||||
data.Add("email_type", "2");
|
||||
response = Request(WEBAPI_BASE + "/ITwoFactorService/SendEmail/v0001", "POST", data);
|
||||
response = await Request(WEBAPI_BASE + "/ITwoFactorService/SendEmail/v0001", "POST", data);
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -657,7 +653,7 @@ namespace System.Application.Models
|
||||
/// <summary>
|
||||
/// Synchronise this authenticator's time with Steam.
|
||||
/// </summary>
|
||||
public override void Sync()
|
||||
public override async void Sync()
|
||||
{
|
||||
// check if data is protected
|
||||
if (SecretKey == null && EncryptedData != null)
|
||||
@@ -673,7 +669,7 @@ namespace System.Application.Models
|
||||
|
||||
try
|
||||
{
|
||||
var response = Request(SYNC_URL, "POST", null, null, null, SYNC_TIMEOUT);
|
||||
var response = await Request(SYNC_URL, "POST", null, null, null, SYNC_TIMEOUT);
|
||||
var json = JObject.Parse(response);
|
||||
|
||||
// get servertime in ms
|
||||
|
||||
@@ -1,14 +1,22 @@
|
||||
using System.Application;
|
||||
using System.Application.Models;
|
||||
|
||||
return _(args, "客户端发布命令行工具(Command Line Tools/CLT)", init: () =>
|
||||
try
|
||||
{
|
||||
if (args.FirstOrDefault() == "apphostpatcher")
|
||||
return _(args, "客户端发布命令行工具(Command Line Tools/CLT)", init: () =>
|
||||
{
|
||||
var args_ = args.Skip(1).ToArray();
|
||||
return AppHostPatcher.Program.M(args_);
|
||||
}
|
||||
if (args.FirstOrDefault() == "apphostpatcher")
|
||||
{
|
||||
var args_ = args.Skip(1).ToArray();
|
||||
return AppHostPatcher.Program.M(args_);
|
||||
}
|
||||
|
||||
FileSystem2.InitFileSystem();
|
||||
return null;
|
||||
}, action: ToolConfig.AddInitCommand);
|
||||
FileSystem2.InitFileSystem();
|
||||
return null;
|
||||
}, action: ToolConfig.AddInitCommand);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine(ex);
|
||||
return 500;
|
||||
}
|
||||
@@ -109,7 +109,7 @@ namespace System.Application.Steps
|
||||
#endif
|
||||
}
|
||||
|
||||
static async Task VerHandlerAsync(string token, bool use_last_skey, bool dev)
|
||||
public static async Task VerHandlerAsync(string token, bool use_last_skey, bool dev)
|
||||
{
|
||||
var desc = ReadVersionDesc();
|
||||
var request = new CreateVersionRequest
|
||||
@@ -124,7 +124,7 @@ namespace System.Application.Steps
|
||||
if (rsp.StatusCode == HttpStatusCode.InternalServerError)
|
||||
{
|
||||
var html = await rsp.Content.ReadAsStringAsync();
|
||||
throw new HttpRequestException(html);
|
||||
Console.WriteLine(html);
|
||||
}
|
||||
rsp.EnsureSuccessStatusCode();
|
||||
var apiResponse = await GetResponseAsync<AppIdWithPublicKey>(rsp);
|
||||
@@ -505,7 +505,7 @@ namespace System.Application.Steps
|
||||
//content.Headers.ContentType = new(MediaTypeNames.MessagePack);
|
||||
//return content;
|
||||
|
||||
var json = Serializable.SJSON_Original(request);
|
||||
var json = Serializable.SJSON(request);
|
||||
var content = new StringContent(json, Encoding.UTF8, MediaTypeNames.JSON);
|
||||
return content;
|
||||
}
|
||||
@@ -516,7 +516,7 @@ namespace System.Application.Steps
|
||||
//return await ApiResponse.DeserializeAsync<T>(stream, default);
|
||||
|
||||
var json = await responseMessage.Content.ReadAsStringAsync();
|
||||
return Serializable.DJSON_Original<ApiRsp<T>>(json)!;
|
||||
return Serializable.DJSON<ApiRsp<T>>(json)!;
|
||||
}
|
||||
|
||||
static async Task<IApiResponse> GetResponseAsync(HttpResponseMessage responseMessage)
|
||||
@@ -525,11 +525,11 @@ namespace System.Application.Steps
|
||||
//return await ApiResponse.DeserializeAsync<object>(stream, default);
|
||||
|
||||
var json = await responseMessage.Content.ReadAsStringAsync();
|
||||
return Serializable.DJSON_Original<ApiRsp>(json)!;
|
||||
return Serializable.DJSON<ApiRsp>(json)!;
|
||||
}
|
||||
|
||||
const string dev_api_base_url = "https://pan.mossimo.net:9911";
|
||||
const string api_base_url = "https://cycyadmin.steampp.net";
|
||||
const string api_base_url = "https://adminapi.steampp.net";
|
||||
const string api_version_create = "/api/version";
|
||||
|
||||
static string GetFullVersion(bool dev)
|
||||
|
||||
Generated
+1
-1
@@ -1,4 +1,4 @@
|
||||
//------------------------------------------------------------------------------
|
||||
//------------------------------------------------------------------------------
|
||||
// <auto-generated>
|
||||
// 此代码由工具生成。
|
||||
// 运行时版本:4.0.30319.42000
|
||||
|
||||
@@ -1,5 +1,11 @@
|
||||
using NUnit.Framework;
|
||||
using System.Security.Cryptography;
|
||||
using System.Text;
|
||||
#if WINDOWS
|
||||
using Windows.Security.Cryptography.DataProtection;
|
||||
using System.Runtime.InteropServices.WindowsRuntime;
|
||||
using System.Runtime.Versioning;
|
||||
#endif
|
||||
|
||||
namespace System;
|
||||
|
||||
@@ -81,4 +87,67 @@ public class ByteArrayTest
|
||||
|
||||
Assert.IsTrue(value1 == value3);
|
||||
}
|
||||
|
||||
#if WINDOWS
|
||||
/// <summary>
|
||||
/// Windows10DataProtectionProvider 的单元测试
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
[Test]
|
||||
public async Task DataProtection()
|
||||
{
|
||||
if (!OperatingSystem.IsWindowsVersionAtLeast(10, 0, 10240)) return;
|
||||
|
||||
var value = DateTime.Now.ToString() + " 🔮🎮";
|
||||
var bytes = Encoding.UTF8.GetBytes(value);
|
||||
|
||||
var e = await ProtectCore2Async(bytes);
|
||||
var d = await UnprotectCore2Async(e);
|
||||
|
||||
TestContext.WriteLine(Encoding.UTF8.GetString(d));
|
||||
|
||||
Assert.IsTrue(d.SequenceEqual(bytes));
|
||||
}
|
||||
#endif
|
||||
|
||||
#if WINDOWS
|
||||
[SupportedOSPlatform("Windows10.0.10240.0")]
|
||||
static DataProtectionProvider GetDataProtectionProvider(string? protectionDescriptor = null)
|
||||
{
|
||||
DataProtectionProvider provider = protectionDescriptor == null ? new() : new(protectionDescriptor);
|
||||
return provider;
|
||||
}
|
||||
|
||||
[SupportedOSPlatform("Windows10.0.10240.0")]
|
||||
static async Task<byte[]> ProtectCoreAsync(byte[] data)
|
||||
{
|
||||
// LOCAL=user and LOCAL=machine do not require enterprise auth capability
|
||||
var provider = GetDataProtectionProvider("LOCAL=user");
|
||||
|
||||
// https://appcenter.ms/orgs/BeyondDimension/apps/Steam/crashes/errors/842356268u/overview
|
||||
// System.Runtime.InteropServices.COMException: 无法在设置线程模式后对其加以更改。 (0x80010106 (RPC_E_CHANGED_MODE))
|
||||
|
||||
var buffer = await provider.ProtectAsync(data.AsBuffer());
|
||||
|
||||
var encBytes = buffer.ToArray();
|
||||
|
||||
return encBytes;
|
||||
}
|
||||
|
||||
[SupportedOSPlatform("Windows10.0.10240.0")]
|
||||
static async Task<byte[]> ProtectCore2Async(byte[] data) => await await Task.Factory.StartNew(async () => await ProtectCoreAsync(data));
|
||||
|
||||
[SupportedOSPlatform("Windows10.0.10240.0")]
|
||||
static async Task<byte[]> UnprotectCoreAsync(byte[] data)
|
||||
{
|
||||
var provider = GetDataProtectionProvider();
|
||||
|
||||
var buffer = await provider.UnprotectAsync(data.AsBuffer());
|
||||
|
||||
return buffer.ToArray();
|
||||
}
|
||||
|
||||
[SupportedOSPlatform("Windows10.0.10240.0")]
|
||||
static async Task<byte[]> UnprotectCore2Async(byte[] data) => await await Task.Factory.StartNew(async () => await UnprotectCoreAsync(data));
|
||||
#endif
|
||||
}
|
||||
@@ -1,7 +1,8 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net6.0</TargetFramework>
|
||||
<TargetFrameworks>net6.0</TargetFrameworks>
|
||||
<TargetFrameworks Condition=" '$(OS)' == 'Windows_NT' ">$(TargetFrameworks);net6.0-windows10.0.19041.0</TargetFrameworks>
|
||||
<RootNamespace>System</RootNamespace>
|
||||
<AssemblyName>System.Common.UnitTest</AssemblyName>
|
||||
<IsPackable>false</IsPackable>
|
||||
|
||||
Reference in New Issue
Block a user