diff --git a/v2rayN/ServiceLib/Handler/ConfigHandler.cs b/v2rayN/ServiceLib/Handler/ConfigHandler.cs index 84fc0fc4..0ea515ec 100644 --- a/v2rayN/ServiceLib/Handler/ConfigHandler.cs +++ b/v2rayN/ServiceLib/Handler/ConfigHandler.cs @@ -745,11 +745,8 @@ public static class ConfigHandler profileItem.CoreType = ECoreType.sing_box; profileItem.Address = profileItem.Address.TrimEx(); + profileItem.Username = profileItem.Username.TrimEx(); profileItem.Password = profileItem.Password.TrimEx(); - profileItem.SetProtocolExtra(profileItem.GetProtocolExtra() with - { - Username = profileItem.GetProtocolExtra().Username?.TrimEx() - }); profileItem.Network = string.Empty; if (!Global.TuicCongestionControls.Contains(profileItem.HeaderType)) diff --git a/v2rayN/ServiceLib/Handler/Fmt/SocksFmt.cs b/v2rayN/ServiceLib/Handler/Fmt/SocksFmt.cs index be996aba..b3a54301 100644 --- a/v2rayN/ServiceLib/Handler/Fmt/SocksFmt.cs +++ b/v2rayN/ServiceLib/Handler/Fmt/SocksFmt.cs @@ -33,7 +33,7 @@ public class SocksFmt : BaseFmt remark = "#" + Utils.UrlEncode(item.Remarks); } //new - var pw = Utils.Base64Encode($"{item.GetProtocolExtra().Username}:{item.Password}", true); + var pw = Utils.Base64Encode($"{item.Username}:{item.Password}", true); return ToUri(EConfigType.SOCKS, item.Address, item.Port, pw, null, remark); } @@ -78,7 +78,7 @@ public class SocksFmt : BaseFmt } item.Address = arr1[1][..indexPort]; item.Port = arr1[1][(indexPort + 1)..].ToInt(); - item.SetProtocolExtra(item.GetProtocolExtra() with { Username = arr21.First() }); + item.Username = arr21.First(); item.Password = arr21[1]; return item; } @@ -103,7 +103,7 @@ public class SocksFmt : BaseFmt var userInfoParts = userInfo.Split([':'], 2); if (userInfoParts.Length == 2) { - item.SetProtocolExtra(item.GetProtocolExtra() with { Username = userInfoParts.First() }); + item.Username = userInfoParts.First(); item.Password = userInfoParts[1]; } diff --git a/v2rayN/ServiceLib/Handler/Fmt/TuicFmt.cs b/v2rayN/ServiceLib/Handler/Fmt/TuicFmt.cs index ec38c501..56f78ea9 100644 --- a/v2rayN/ServiceLib/Handler/Fmt/TuicFmt.cs +++ b/v2rayN/ServiceLib/Handler/Fmt/TuicFmt.cs @@ -24,7 +24,7 @@ public class TuicFmt : BaseFmt var userInfoParts = rawUserInfo.Split(new[] { ':' }, 2); if (userInfoParts.Length == 2) { - item.SetProtocolExtra(item.GetProtocolExtra() with { Username = userInfoParts.First() }); + item.Username = userInfoParts.First(); item.Password = userInfoParts.Last(); } @@ -53,6 +53,6 @@ public class TuicFmt : BaseFmt dicQuery.Add("congestion_control", item.HeaderType); - return ToUri(EConfigType.TUIC, item.Address, item.Port, $"{item.GetProtocolExtra().Username ?? ""}:{item.Password}", dicQuery, remark); + return ToUri(EConfigType.TUIC, item.Address, item.Port, $"{item.Username ?? ""}:{item.Password}", dicQuery, remark); } } diff --git a/v2rayN/ServiceLib/Manager/AppManager.cs b/v2rayN/ServiceLib/Manager/AppManager.cs index 6c05f155..576af0d0 100644 --- a/v2rayN/ServiceLib/Manager/AppManager.cs +++ b/v2rayN/ServiceLib/Manager/AppManager.cs @@ -333,13 +333,14 @@ public sealed class AppManager }; break; case EConfigType.TUIC: - extra = extra with - { - Username = item.Id, - }; + item.Username = item.Id; item.Id = item.Security; item.Password = item.Security; break; + case EConfigType.HTTP: + case EConfigType.SOCKS: + item.Username = item.Security; + break; case EConfigType.WireGuard: extra = extra with { @@ -349,8 +350,6 @@ public sealed class AppManager WgMtu = int.TryParse(item.ShortId, out var mtu) ? mtu : 1280 }; break; - default: - break; } item.SetProtocolExtra(extra); diff --git a/v2rayN/ServiceLib/Models/ProfileItem.cs b/v2rayN/ServiceLib/Models/ProfileItem.cs index f8be1cfe..a43b6d18 100644 --- a/v2rayN/ServiceLib/Models/ProfileItem.cs +++ b/v2rayN/ServiceLib/Models/ProfileItem.cs @@ -13,6 +13,7 @@ public class ProfileItem : ReactiveObject Address = string.Empty; Port = 0; Password = string.Empty; + Username = string.Empty; Network = string.Empty; Remarks = string.Empty; HeaderType = string.Empty; @@ -151,6 +152,7 @@ public class ProfileItem : ReactiveObject public string Address { get; set; } public int Port { get; set; } public string Password { get; set; } + public string Username { get; set; } public string Network { get; set; } public string Remarks { get; set; } public string HeaderType { get; set; } diff --git a/v2rayN/ServiceLib/Models/ProtocolExtraItem.cs b/v2rayN/ServiceLib/Models/ProtocolExtraItem.cs index 4cb95c8b..a768ba80 100644 --- a/v2rayN/ServiceLib/Models/ProtocolExtraItem.cs +++ b/v2rayN/ServiceLib/Models/ProtocolExtraItem.cs @@ -15,9 +15,6 @@ public record ProtocolExtraItem //public string? PluginArgs { get; init; } public string? SsMethod { get; init; } - // socks and http - public string? Username { get; init; } - // wireguard public string? WgPublicKey { get; init; } public string? WgPresharedKey { get; init; } diff --git a/v2rayN/ServiceLib/Services/CoreConfig/Singbox/SingboxOutboundService.cs b/v2rayN/ServiceLib/Services/CoreConfig/Singbox/SingboxOutboundService.cs index b5988187..178350b3 100644 --- a/v2rayN/ServiceLib/Services/CoreConfig/Singbox/SingboxOutboundService.cs +++ b/v2rayN/ServiceLib/Services/CoreConfig/Singbox/SingboxOutboundService.cs @@ -90,20 +90,20 @@ public partial class CoreConfigSingboxService case EConfigType.SOCKS: { outbound.version = "5"; - if (protocolExtra.Username.IsNotEmpty() + if (node.Username.IsNotEmpty() && node.Password.IsNotEmpty()) { - outbound.username = protocolExtra.Username; + outbound.username = node.Username; outbound.password = node.Password; } break; } case EConfigType.HTTP: { - if (protocolExtra.Username.IsNotEmpty() + if (node.Username.IsNotEmpty() && node.Password.IsNotEmpty()) { - outbound.username = protocolExtra.Username; + outbound.username = node.Username; outbound.password = node.Password; } break; @@ -190,7 +190,7 @@ public partial class CoreConfigSingboxService } case EConfigType.TUIC: { - outbound.uuid = protocolExtra.Username; + outbound.uuid = node.Username; outbound.password = node.Password; outbound.congestion_control = node.HeaderType; break; diff --git a/v2rayN/ServiceLib/Services/CoreConfig/V2ray/V2rayOutboundService.cs b/v2rayN/ServiceLib/Services/CoreConfig/V2ray/V2rayOutboundService.cs index e409f806..7f9c26ca 100644 --- a/v2rayN/ServiceLib/Services/CoreConfig/V2ray/V2rayOutboundService.cs +++ b/v2rayN/ServiceLib/Services/CoreConfig/V2ray/V2rayOutboundService.cs @@ -97,12 +97,12 @@ public partial class CoreConfigV2rayService serversItem.method = null; serversItem.password = null; - if (protocolExtra.Username.IsNotEmpty() + if (node.Username.IsNotEmpty() && node.Password.IsNotEmpty()) { SocksUsersItem4Ray socksUsersItem = new() { - user = protocolExtra.Username ?? "", + user = node.Username ?? "", pass = node.Password, level = 1 }; diff --git a/v2rayN/ServiceLib/ViewModels/AddServerViewModel.cs b/v2rayN/ServiceLib/ViewModels/AddServerViewModel.cs index acaa5511..914705c8 100644 --- a/v2rayN/ServiceLib/ViewModels/AddServerViewModel.cs +++ b/v2rayN/ServiceLib/ViewModels/AddServerViewModel.cs @@ -47,9 +47,6 @@ public class AddServerViewModel : MyReactiveObject [Reactive] public string SsMethod { get; set; } - [Reactive] - public string Username { get; set; } - [Reactive] public string WgPublicKey { get; set; } //[Reactive] @@ -119,7 +116,6 @@ public class AddServerViewModel : MyReactiveObject VmessSecurity = protocolExtra?.VmessSecurity?.IsNullOrEmpty() == false ? protocolExtra.VmessSecurity : Global.DefaultSecurity; VlessEncryption = protocolExtra?.VlessEncryption.IsNullOrEmpty() == false ? protocolExtra.VlessEncryption : Global.None; SsMethod = protocolExtra?.SsMethod ?? string.Empty; - Username = protocolExtra?.Username ?? string.Empty; WgPublicKey = protocolExtra?.WgPublicKey ?? string.Empty; WgInterfaceAddress = protocolExtra?.WgInterfaceAddress ?? string.Empty; WgReserved = protocolExtra?.WgReserved ?? string.Empty; @@ -182,7 +178,6 @@ public class AddServerViewModel : MyReactiveObject VmessSecurity = VmessSecurity.NullIfEmpty(), VlessEncryption = VlessEncryption.NullIfEmpty(), SsMethod = SsMethod.NullIfEmpty(), - Username = Username.NullIfEmpty(), WgPublicKey = WgPublicKey.NullIfEmpty(), WgInterfaceAddress = WgInterfaceAddress.NullIfEmpty(), WgReserved = WgReserved.NullIfEmpty(), diff --git a/v2rayN/v2rayN.Desktop/Views/AddServerWindow.axaml.cs b/v2rayN/v2rayN.Desktop/Views/AddServerWindow.axaml.cs index e5f96a10..250bbe78 100644 --- a/v2rayN/v2rayN.Desktop/Views/AddServerWindow.axaml.cs +++ b/v2rayN/v2rayN.Desktop/Views/AddServerWindow.axaml.cs @@ -126,7 +126,7 @@ public partial class AddServerWindow : WindowBase case EConfigType.SOCKS: case EConfigType.HTTP: this.Bind(ViewModel, vm => vm.SelectedSource.Password, v => v.txtId4.Text).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.Username, v => v.txtSecurity4.Text).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.SelectedSource.Username, v => v.txtSecurity4.Text).DisposeWith(disposables); break; case EConfigType.VLESS: @@ -152,7 +152,7 @@ public partial class AddServerWindow : WindowBase break; case EConfigType.TUIC: - this.Bind(ViewModel, vm => vm.Username, v => v.txtId8.Text).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.SelectedSource.Username, v => v.txtId8.Text).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.SelectedSource.Password, v => v.txtSecurity8.Text).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.SelectedSource.HeaderType, v => v.cmbHeaderType8.SelectedValue).DisposeWith(disposables); break; diff --git a/v2rayN/v2rayN/Views/AddServerWindow.xaml.cs b/v2rayN/v2rayN/Views/AddServerWindow.xaml.cs index c3c403c0..86d9cac1 100644 --- a/v2rayN/v2rayN/Views/AddServerWindow.xaml.cs +++ b/v2rayN/v2rayN/Views/AddServerWindow.xaml.cs @@ -121,7 +121,7 @@ public partial class AddServerWindow case EConfigType.SOCKS: case EConfigType.HTTP: this.Bind(ViewModel, vm => vm.SelectedSource.Password, v => v.txtId4.Text).DisposeWith(disposables); - this.Bind(ViewModel, vm => vm.Username, v => v.txtSecurity4.Text).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.SelectedSource.Username, v => v.txtSecurity4.Text).DisposeWith(disposables); break; case EConfigType.VLESS: @@ -147,7 +147,7 @@ public partial class AddServerWindow break; case EConfigType.TUIC: - this.Bind(ViewModel, vm => vm.Username, v => v.txtId8.Text).DisposeWith(disposables); + this.Bind(ViewModel, vm => vm.SelectedSource.Username, v => v.txtId8.Text).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.SelectedSource.Password, v => v.txtSecurity8.Text).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.SelectedSource.HeaderType, v => v.cmbHeaderType8.Text).DisposeWith(disposables); break;