mirror of
				https://github.com/2dust/v2rayN.git
				synced 2025-10-26 10:14:42 +00:00 
			
		
		
		
	Compare commits
	
		
			6 commits
		
	
	
		
			65b78ce6f9
			...
			377670eff8
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 377670eff8 | ||
|   | 18ac76e683 | ||
|   | 3e1e23a524 | ||
|   | 534c7ab444 | ||
|   | c2c13ad318 | ||
|   | 3a21596d95 | 
					 11 changed files with 140 additions and 46 deletions
				
			
		|  | @ -1,7 +1,7 @@ | |||
| <Project> | ||||
| 
 | ||||
|     <PropertyGroup> | ||||
|         <Version>7.14.11</Version> | ||||
|         <Version>7.14.12</Version> | ||||
|     </PropertyGroup> | ||||
| 
 | ||||
|     <PropertyGroup> | ||||
|  |  | |||
|  | @ -18,8 +18,8 @@ | |||
|     <PackageVersion Include="ReactiveUI" Version="20.4.1" /> | ||||
|     <PackageVersion Include="ReactiveUI.Fody" Version="19.5.41" /> | ||||
|     <PackageVersion Include="ReactiveUI.WPF" Version="20.4.1" /> | ||||
|     <PackageVersion Include="Semi.Avalonia" Version="11.2.1.9" /> | ||||
|     <PackageVersion Include="Semi.Avalonia.DataGrid" Version="11.2.1.9" /> | ||||
|     <PackageVersion Include="Semi.Avalonia" Version="11.2.1.10" /> | ||||
|     <PackageVersion Include="Semi.Avalonia.DataGrid" Version="11.2.1.10" /> | ||||
|     <PackageVersion Include="Splat.NLog" Version="16.2.1" /> | ||||
|     <PackageVersion Include="sqlite-net-pcl" Version="1.9.172" /> | ||||
|     <PackageVersion Include="TaskScheduler" Version="2.12.2" /> | ||||
|  |  | |||
|  | @ -1,4 +1,5 @@ | |||
| using QRCoder; | ||||
| using QRCoder.Exceptions; | ||||
| using SkiaSharp; | ||||
| using ZXing.SkiaSharp; | ||||
| 
 | ||||
|  | @ -8,10 +9,45 @@ public class QRCodeUtils | |||
| { | ||||
|     public static byte[]? GenQRCode(string? url) | ||||
|     { | ||||
|         if (url.IsNullOrEmpty()) | ||||
|         { | ||||
|             return null; | ||||
|         } | ||||
|         using QRCodeGenerator qrGenerator = new(); | ||||
|         using var qrCodeData = qrGenerator.CreateQrCode(url ?? string.Empty, QRCodeGenerator.ECCLevel.Q); | ||||
|         using PngByteQRCode qrCode = new(qrCodeData); | ||||
|         return qrCode.GetGraphic(20); | ||||
|         DataTooLongException? lastDtle = null; | ||||
| 
 | ||||
|         var levels = new[] | ||||
|         { | ||||
|             QRCodeGenerator.ECCLevel.H, | ||||
|             QRCodeGenerator.ECCLevel.Q, | ||||
|             QRCodeGenerator.ECCLevel.M, | ||||
|             QRCodeGenerator.ECCLevel.L | ||||
|         }; | ||||
|         foreach (var level in levels) | ||||
|         { | ||||
|             try | ||||
|             { | ||||
|                 using var qrCodeData = qrGenerator.CreateQrCode(url, level); | ||||
|                 using PngByteQRCode qrCode = new(qrCodeData); | ||||
|                 return qrCode.GetGraphic(20); | ||||
|             } | ||||
|             catch (DataTooLongException ex) | ||||
|             { | ||||
|                 lastDtle = ex; | ||||
|                 continue; | ||||
|             } | ||||
|             catch | ||||
|             { | ||||
|                 throw; | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         if (lastDtle != null) | ||||
|         { | ||||
|             throw lastDtle; | ||||
|         } | ||||
| 
 | ||||
|         return null; | ||||
|     } | ||||
| 
 | ||||
|     public static string? ParseBarcode(string? fileName) | ||||
|  |  | |||
|  | @ -598,6 +598,7 @@ public class Global | |||
|             { "cloudflare-dns.com", new List<string> { "104.16.249.249", "104.16.248.249", "2606:4700::6810:f8f9", "2606:4700::6810:f9f9" } }, | ||||
|             { "dns.cloudflare.com", new List<string> { "104.16.132.229", "104.16.133.229", "2606:4700::6810:84e5", "2606:4700::6810:85e5" } }, | ||||
|             { "dot.pub", new List<string> { "1.12.12.12", "120.53.53.53" } }, | ||||
|             { "doh.pub", new List<string> { "1.12.12.12", "120.53.53.53" } }, | ||||
|             { "dns.quad9.net", new List<string> { "9.9.9.9", "149.112.112.112", "2620:fe::fe", "2620:fe::9" } }, | ||||
|             { "dns.yandex.net", new List<string> { "77.88.8.8", "77.88.8.1", "2a02:6b8::feed:0ff", "2a02:6b8:0:1::feed:0ff" } }, | ||||
|             { "dns.sb", new List<string> { "185.222.222.222", "2a09::" } }, | ||||
|  |  | |||
|  | @ -1214,11 +1214,11 @@ public static class ConfigHandler | |||
|                 CoreType = ECoreType.sing_box, | ||||
|                 ConfigType = EConfigType.SOCKS, | ||||
|                 Address = Global.Loopback, | ||||
|                 Sni = node.Address, //Tun2SocksAddress | ||||
|                 SpiderX = node.Address, // Tun2SocksAddress | ||||
|                 Port = AppManager.Instance.GetLocalPort(EInboundProtocol.socks) | ||||
|             }; | ||||
|         } | ||||
|         else if ((node.ConfigType == EConfigType.Custom && node.PreSocksPort > 0)) | ||||
|         else if (node.ConfigType == EConfigType.Custom && node.PreSocksPort > 0) | ||||
|         { | ||||
|             var preCoreType = config.RunningCoreType = config.TunModeItem.EnableTun ? ECoreType.sing_box : ECoreType.Xray; | ||||
|             itemSocks = new ProfileItem() | ||||
|  |  | |||
|  | @ -43,16 +43,7 @@ public partial class CoreConfigSingboxService | |||
|                 }); | ||||
|             } | ||||
| 
 | ||||
|             // Tun2SocksAddress | ||||
|             if (node != null && Utils.IsDomain(node.Address)) | ||||
|             { | ||||
|                 singboxConfig.dns.rules ??= new List<Rule4Sbox>(); | ||||
|                 singboxConfig.dns.rules.Insert(0, new Rule4Sbox | ||||
|                 { | ||||
|                     server = Global.SingboxOutboundResolverTag, | ||||
|                     domain = [node.Address], | ||||
|                 }); | ||||
|             } | ||||
|             await GenOutboundDnsRule(node, singboxConfig, Global.SingboxOutboundResolverTag); | ||||
|         } | ||||
|         catch (Exception ex) | ||||
|         { | ||||
|  | @ -346,16 +337,7 @@ public partial class CoreConfigSingboxService | |||
|                 await GenDnsDomainsLegacyCompatible(singboxConfig, item); | ||||
|             } | ||||
| 
 | ||||
|             // Tun2SocksAddress | ||||
|             if (node != null && Utils.IsDomain(node.Address)) | ||||
|             { | ||||
|                 singboxConfig.dns.rules ??= new List<Rule4Sbox>(); | ||||
|                 singboxConfig.dns.rules.Insert(0, new Rule4Sbox | ||||
|                 { | ||||
|                     server = Global.SingboxFinalResolverTag, | ||||
|                     domain = [node.Address], | ||||
|                 }); | ||||
|             } | ||||
|             await GenOutboundDnsRule(node, singboxConfig, Global.SingboxFinalResolverTag); | ||||
|         } | ||||
|         catch (Exception ex) | ||||
|         { | ||||
|  | @ -425,6 +407,37 @@ public partial class CoreConfigSingboxService | |||
|         return await Task.FromResult(0); | ||||
|     } | ||||
| 
 | ||||
|     private async Task<int> GenOutboundDnsRule(ProfileItem? node, SingboxConfig singboxConfig, string? server) | ||||
|     { | ||||
|         if (node == null) | ||||
|         { | ||||
|             return 0; | ||||
|         } | ||||
| 
 | ||||
|         var domain = string.Empty; | ||||
|         if (Utils.IsDomain(node.Address)) // normal outbound | ||||
|         { | ||||
|             domain = node.Address; | ||||
|         } | ||||
|         else if (node.Address == Global.Loopback && node.SpiderX.IsNotEmpty() && Utils.IsDomain(node.SpiderX)) // Tun2SocksAddress | ||||
|         { | ||||
|             domain = node.SpiderX; | ||||
|         } | ||||
|         if (domain.IsNullOrEmpty()) | ||||
|         { | ||||
|             return 0; | ||||
|         } | ||||
| 
 | ||||
|         singboxConfig.dns.rules ??= new List<Rule4Sbox>(); | ||||
|         singboxConfig.dns.rules.Insert(0, new Rule4Sbox | ||||
|         { | ||||
|             server = server, | ||||
|             domain = [domain], | ||||
|         }); | ||||
| 
 | ||||
|         return await Task.FromResult(0); | ||||
|     } | ||||
| 
 | ||||
|     private static Server4Sbox? ParseDnsAddress(string address) | ||||
|     { | ||||
|         var addressFirst = address?.Split(address.Contains(',') ? ',' : ';').FirstOrDefault()?.Trim(); | ||||
|  |  | |||
|  | @ -4,19 +4,25 @@ | |||
|     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" | ||||
|     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" | ||||
|     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" | ||||
|     d:DesignHeight="480" | ||||
|     d:DesignWidth="400" | ||||
|     xmlns:sys="clr-namespace:System;assembly=netstandard" | ||||
|     d:DesignHeight="600" | ||||
|     d:DesignWidth="600" | ||||
|     mc:Ignorable="d"> | ||||
| 
 | ||||
|     <UserControl.Resources> | ||||
|         <sys:Double x:Key="QrcodeWidth">500</sys:Double> | ||||
|     </UserControl.Resources> | ||||
| 
 | ||||
|     <Grid Margin="32" RowDefinitions="Auto,Auto"> | ||||
|         <Image | ||||
|             Name="imgQrcode" | ||||
|             Width="300" | ||||
|             Height="300" /> | ||||
|             Width="{StaticResource QrcodeWidth}" | ||||
|             Height="{StaticResource QrcodeWidth}" /> | ||||
| 
 | ||||
|         <TextBox | ||||
|             x:Name="txtContent" | ||||
|             Grid.Row="1" | ||||
|             Width="300" | ||||
|             Width="{StaticResource QrcodeWidth}" | ||||
|             MaxHeight="100" | ||||
|             Margin="{StaticResource MarginTb8}" | ||||
|             VerticalAlignment="Center" | ||||
|  |  | |||
|  | @ -23,8 +23,16 @@ public partial class QrcodeView : UserControl | |||
| 
 | ||||
|     private Bitmap? GetQRCode(string? url) | ||||
|     { | ||||
|         var bytes = QRCodeUtils.GenQRCode(url); | ||||
|         return ByteToBitmap(bytes); | ||||
|         try | ||||
|         { | ||||
|             var bytes = QRCodeUtils.GenQRCode(url); | ||||
|             return ByteToBitmap(bytes); | ||||
|         } | ||||
|         catch (Exception ex) | ||||
|         { | ||||
|             Logging.SaveLog("GetQRCode", ex); | ||||
|             return null; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     private Bitmap? ByteToBitmap(byte[]? bytes) | ||||
|  |  | |||
							
								
								
									
										24
									
								
								v2rayN/v2rayN.slnx
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								v2rayN/v2rayN.slnx
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,24 @@ | |||
| <Solution> | ||||
|   <Folder Name="/GitHub Action/"> | ||||
|     <File Path="../.github/workflows/build-all.yml" /> | ||||
|     <File Path="../.github/workflows/build-linux.yml" /> | ||||
|     <File Path="../.github/workflows/build-osx.yml" /> | ||||
|     <File Path="../.github/workflows/build-windows-desktop.yml" /> | ||||
|     <File Path="../.github/workflows/build-windows.yml" /> | ||||
|     <File Path="../.github/workflows/winget-publish.yml" /> | ||||
|     <File Path="../package-appimage.sh" /> | ||||
|     <File Path="../package-debian.sh" /> | ||||
|     <File Path="../package-osx.sh" /> | ||||
|     <File Path="../package-release-zip.sh" /> | ||||
|     <File Path="../pkg2appimage.yml" /> | ||||
|   </Folder> | ||||
|   <Folder Name="/Solution Files/"> | ||||
|     <File Path="Directory.Build.props" /> | ||||
|     <File Path="Directory.Packages.props" /> | ||||
|   </Folder> | ||||
|   <Project Path="AmazTool/AmazTool.csproj" /> | ||||
|   <Project Path="GlobalHotKeys/src/GlobalHotKeys/GlobalHotKeys.csproj" /> | ||||
|   <Project Path="ServiceLib/ServiceLib.csproj" /> | ||||
|   <Project Path="v2rayN.Desktop/v2rayN.Desktop.csproj" /> | ||||
|   <Project Path="v2rayN/v2rayN.csproj" /> | ||||
| </Solution> | ||||
|  | @ -20,8 +20,9 @@ public class QRCodeUtils | |||
|             var qrCodeImage = ServiceLib.Common.QRCodeUtils.GenQRCode(strContent); | ||||
|             return qrCodeImage is null ? null : ByteToImage(qrCodeImage); | ||||
|         } | ||||
|         catch | ||||
|         catch (Exception ex) | ||||
|         { | ||||
|             Logging.SaveLog("GetQRCode", ex); | ||||
|             return null; | ||||
|         } | ||||
|     } | ||||
|  | @ -32,8 +33,8 @@ public class QRCodeUtils | |||
|         { | ||||
|             GetDpi(window, out var dpiX, out var dpiY); | ||||
| 
 | ||||
|             var left = (int)(SystemParameters.WorkArea.Left); | ||||
|             var top = (int)(SystemParameters.WorkArea.Top); | ||||
|             var left = (int)SystemParameters.WorkArea.Left; | ||||
|             var top = (int)SystemParameters.WorkArea.Top; | ||||
|             var width = (int)(SystemParameters.WorkArea.Width / dpiX); | ||||
|             var height = (int)(SystemParameters.WorkArea.Height / dpiY); | ||||
| 
 | ||||
|  |  | |||
|  | @ -1,4 +1,4 @@ | |||
| <UserControl | ||||
| <UserControl | ||||
|     x:Class="v2rayN.Views.QrcodeView" | ||||
|     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" | ||||
|     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" | ||||
|  | @ -6,28 +6,33 @@ | |||
|     xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes" | ||||
|     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" | ||||
|     xmlns:resx="clr-namespace:ServiceLib.Resx;assembly=ServiceLib" | ||||
|     d:DesignHeight="300" | ||||
|     d:DesignWidth="300" | ||||
|     xmlns:sys="clr-namespace:System;assembly=mscorlib" | ||||
|     d:DesignHeight="600" | ||||
|     d:DesignWidth="600" | ||||
|     Style="{StaticResource ViewGlobal}" | ||||
|     mc:Ignorable="d"> | ||||
|     <UserControl.Resources> | ||||
|         <sys:Double x:Key="QrcodeWidth">500</sys:Double> | ||||
|     </UserControl.Resources> | ||||
| 
 | ||||
|     <Grid Margin="32"> | ||||
|         <Grid.RowDefinitions> | ||||
|             <RowDefinition Height="Auto" /> | ||||
|             <RowDefinition Height="Auto" /> | ||||
|             <RowDefinition Height="60" /> | ||||
|             <RowDefinition Height="80" /> | ||||
|         </Grid.RowDefinitions> | ||||
| 
 | ||||
|         <Image | ||||
|             x:Name="imgQrcode" | ||||
|             Grid.Row="0" | ||||
|             Width="300" | ||||
|             Height="300" | ||||
|             Width="{StaticResource QrcodeWidth}" | ||||
|             Height="{StaticResource QrcodeWidth}" | ||||
|             Stretch="UniformToFill" /> | ||||
| 
 | ||||
|         <TextBox | ||||
|             x:Name="txtContent" | ||||
|             Grid.Row="1" | ||||
|             Width="300" | ||||
|             Width="{StaticResource QrcodeWidth}" | ||||
|             Margin="0,8" | ||||
|             VerticalAlignment="Center" | ||||
|             IsReadOnly="True" | ||||
|  | @ -46,4 +51,4 @@ | |||
|             IsDefault="True" | ||||
|             Style="{StaticResource DefButton}" /> | ||||
|     </Grid> | ||||
| </UserControl> | ||||
| </UserControl> | ||||
|  |  | |||
		Loading…
	
		Reference in a new issue