mirror of
https://github.com/2dust/v2rayN.git
synced 2026-02-28 13:13:04 +00:00
Compare commits
3 commits
fe33c0e0e6
...
06677431a0
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
06677431a0 | ||
|
|
6810483c8f | ||
|
|
e47dc40488 |
12 changed files with 96 additions and 73 deletions
|
|
@ -722,7 +722,7 @@ public static class ConfigHandler
|
|||
SalamanderPass = profileItem.GetProtocolExtra().SalamanderPass?.TrimEx(),
|
||||
UpMbps = profileItem.GetProtocolExtra().UpMbps is null or < 0 ? config.HysteriaItem.UpMbps : profileItem.GetProtocolExtra().UpMbps,
|
||||
DownMbps = profileItem.GetProtocolExtra().DownMbps is null or < 0 ? config.HysteriaItem.DownMbps : profileItem.GetProtocolExtra().DownMbps,
|
||||
HopInterval = profileItem.GetProtocolExtra().HopInterval is null or <= 5 ? Global.Hysteria2DefaultHopInt : profileItem.GetProtocolExtra().HopInterval,
|
||||
HopInterval = profileItem.GetProtocolExtra().HopInterval?.TrimEx(),
|
||||
});
|
||||
|
||||
await AddServerCommon(config, profileItem, toFile);
|
||||
|
|
@ -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))
|
||||
|
|
|
|||
|
|
@ -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];
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -96,7 +96,10 @@ public sealed class AppManager
|
|||
_ = StatePort;
|
||||
_ = StatePort2;
|
||||
|
||||
_ = MigrateProfileExtra();
|
||||
Task.Run(async () =>
|
||||
{
|
||||
await MigrateProfileExtra();
|
||||
}).Wait();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
|
@ -277,29 +280,33 @@ public sealed class AppManager
|
|||
break;
|
||||
}
|
||||
|
||||
var batchSuccessCount = 0;
|
||||
foreach (var item in batch)
|
||||
{
|
||||
var extra = item.GetProtocolExtra();
|
||||
|
||||
if (item.ConfigType is EConfigType.PolicyGroup or EConfigType.ProxyChain)
|
||||
try
|
||||
{
|
||||
extra = extra with { GroupType = nameof(item.ConfigType) };
|
||||
groupItems.TryGetValue(item.IndexId, out var groupItem);
|
||||
if (groupItem != null && !groupItem.NotHasChild())
|
||||
var extra = item.GetProtocolExtra();
|
||||
|
||||
if (item.ConfigType is EConfigType.PolicyGroup or EConfigType.ProxyChain)
|
||||
{
|
||||
extra = extra with
|
||||
extra = extra with { GroupType = nameof(item.ConfigType) };
|
||||
groupItems.TryGetValue(item.IndexId, out var groupItem);
|
||||
if (groupItem != null && !groupItem.NotHasChild())
|
||||
{
|
||||
ChildItems = groupItem.ChildItems,
|
||||
SubChildItems = groupItem.SubChildItems,
|
||||
Filter = groupItem.Filter,
|
||||
MultipleLoad = groupItem.MultipleLoad,
|
||||
};
|
||||
extra = extra with
|
||||
{
|
||||
ChildItems = groupItem.ChildItems,
|
||||
SubChildItems = groupItem.SubChildItems,
|
||||
Filter = groupItem.Filter,
|
||||
MultipleLoad = groupItem.MultipleLoad,
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
switch (item.ConfigType)
|
||||
{
|
||||
case EConfigType.Shadowsocks:
|
||||
extra = extra with {SsMethod = item.Security.NullIfEmpty() };
|
||||
extra = extra with { SsMethod = item.Security.NullIfEmpty() };
|
||||
break;
|
||||
case EConfigType.VMess:
|
||||
extra = extra with
|
||||
|
|
@ -312,6 +319,7 @@ public sealed class AppManager
|
|||
extra = extra with
|
||||
{
|
||||
Flow = item.Flow.NullIfEmpty(),
|
||||
VlessEncryption = item.Security,
|
||||
};
|
||||
break;
|
||||
case EConfigType.Hysteria2:
|
||||
|
|
@ -321,17 +329,18 @@ public sealed class AppManager
|
|||
Ports = item.Ports.NullIfEmpty(),
|
||||
UpMbps = _config.HysteriaItem.UpMbps,
|
||||
DownMbps = _config.HysteriaItem.DownMbps,
|
||||
HopInterval = _config.HysteriaItem.HopInterval
|
||||
HopInterval = _config.HysteriaItem.HopInterval.ToString(),
|
||||
};
|
||||
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
|
||||
{
|
||||
|
|
@ -342,17 +351,24 @@ public sealed class AppManager
|
|||
};
|
||||
break;
|
||||
}
|
||||
|
||||
item.SetProtocolExtra(extra);
|
||||
|
||||
item.Password = item.Id;
|
||||
|
||||
item.ConfigVersion = 3;
|
||||
await SQLiteHelper.Instance.UpdateAsync(item);
|
||||
batchSuccessCount++;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logging.SaveLog($"MigrateProfileExtra Error: {ex}");
|
||||
}
|
||||
|
||||
item.SetProtocolExtra(extra);
|
||||
|
||||
item.Password = item.Id;
|
||||
|
||||
item.ConfigVersion = 3;
|
||||
await SQLiteHelper.Instance.UpdateAsync(item);
|
||||
}
|
||||
|
||||
offset += pageSize;
|
||||
// Only increment offset by the number of failed items that remain in the result set
|
||||
// Successfully updated items are automatically excluded from future queries due to ConfigVersion = 3
|
||||
offset += batch.Count - batchSuccessCount;
|
||||
}
|
||||
|
||||
//await ProfileGroupItemManager.Instance.ClearAll();
|
||||
|
|
|
|||
|
|
@ -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; }
|
||||
|
|
|
|||
|
|
@ -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; }
|
||||
|
|
@ -30,7 +27,7 @@ public record ProtocolExtraItem
|
|||
public int? UpMbps { get; init; }
|
||||
public int? DownMbps { get; init; }
|
||||
public string? Ports { get; init; }
|
||||
public int? HopInterval { get; init; }
|
||||
public string? HopInterval { get; init; }
|
||||
|
||||
// group profile
|
||||
public string? GroupType { get; init; }
|
||||
|
|
|
|||
|
|
@ -473,7 +473,7 @@ public class HysteriaSettings4Ray
|
|||
public class HysteriaUdpHop4Ray
|
||||
{
|
||||
public string? ports { get; set; }
|
||||
public int? interval { get; set; }
|
||||
public string? interval { get; set; }
|
||||
}
|
||||
|
||||
public class FinalMask4Ray
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
@ -114,13 +114,13 @@ public partial class CoreConfigSingboxService
|
|||
|
||||
outbound.packet_encoding = "xudp";
|
||||
|
||||
if (protocolExtra.Flow.IsNullOrEmpty())
|
||||
if (!protocolExtra.Flow.IsNullOrEmpty())
|
||||
{
|
||||
await GenOutboundMux(node, outbound);
|
||||
outbound.flow = protocolExtra.Flow;
|
||||
}
|
||||
else
|
||||
{
|
||||
outbound.flow = protocolExtra.Flow;
|
||||
await GenOutboundMux(node, outbound);
|
||||
}
|
||||
|
||||
await GenOutboundTransport(node, outbound);
|
||||
|
|
@ -166,16 +166,31 @@ public partial class CoreConfigSingboxService
|
|||
return port.Contains(':') ? port : $"{port}:{port}";
|
||||
})
|
||||
.ToList();
|
||||
outbound.hop_interval = protocolExtra?.HopInterval is { } hi and >= 5
|
||||
? $"{hi}s"
|
||||
: _config.HysteriaItem.HopInterval >= 5 ? $"{_config.HysteriaItem.HopInterval}s" : $"{Global.Hysteria2DefaultHopInt}s";
|
||||
outbound.hop_interval = _config.HysteriaItem.HopInterval >= 5
|
||||
? $"{_config.HysteriaItem.HopInterval}s"
|
||||
: $"{Global.Hysteria2DefaultHopInt}s";
|
||||
if (int.TryParse(protocolExtra.HopInterval, out var hiResult))
|
||||
{
|
||||
outbound.hop_interval = hiResult >= 5 ? $"{hiResult}s" : outbound.hop_interval;
|
||||
}
|
||||
else if (protocolExtra.HopInterval?.Contains('-') ?? false)
|
||||
{
|
||||
// may be a range like 5-10
|
||||
var parts = protocolExtra.HopInterval.Split('-');
|
||||
if (parts.Length == 2 && int.TryParse(parts[0], out var hiL) &&
|
||||
int.TryParse(parts[0], out var hiH))
|
||||
{
|
||||
var hi = (hiL + hiH) / 2;
|
||||
outbound.hop_interval = hi >= 5 ? $"{hi}s" : outbound.hop_interval;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
case EConfigType.TUIC:
|
||||
{
|
||||
outbound.uuid = protocolExtra.Username;
|
||||
outbound.uuid = node.Username;
|
||||
outbound.password = node.Password;
|
||||
outbound.congestion_control = node.HeaderType;
|
||||
break;
|
||||
|
|
|
|||
|
|
@ -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
|
||||
};
|
||||
|
|
@ -144,13 +144,12 @@ public partial class CoreConfigV2rayService
|
|||
usersItem.email = Global.UserEMail;
|
||||
usersItem.encryption = protocolExtra.VlessEncryption;
|
||||
|
||||
if (protocolExtra.Flow.IsNullOrEmpty())
|
||||
if (!protocolExtra.Flow.IsNullOrEmpty())
|
||||
{
|
||||
await GenOutboundMux(node, outbound, muxEnabled, muxEnabled);
|
||||
usersItem.flow = protocolExtra.Flow;
|
||||
}
|
||||
else
|
||||
{
|
||||
usersItem.flow = protocolExtra.Flow;
|
||||
await GenOutboundMux(node, outbound, false, muxEnabled);
|
||||
}
|
||||
outbound.settings.servers = null;
|
||||
|
|
@ -519,9 +518,11 @@ public partial class CoreConfigV2rayService
|
|||
int? downMbps = protocolExtra?.DownMbps is { } sd and >= 0
|
||||
? sd
|
||||
: _config.HysteriaItem.UpMbps;
|
||||
var hopInterval = protocolExtra?.HopInterval is { } hi and >= 5
|
||||
? hi
|
||||
: _config.HysteriaItem.HopInterval >= 5 ? _config.HysteriaItem.HopInterval : Global.Hysteria2DefaultHopInt;
|
||||
var hopInterval = !protocolExtra.HopInterval.IsNullOrEmpty()
|
||||
? protocolExtra.HopInterval
|
||||
: (_config.HysteriaItem.HopInterval >= 5
|
||||
? _config.HysteriaItem.HopInterval
|
||||
: Global.Hysteria2DefaultHopInt).ToString();
|
||||
HysteriaUdpHop4Ray? udpHop = null;
|
||||
if (!ports.IsNullOrEmpty() &&
|
||||
(ports.Contains(':') || ports.Contains('-') || ports.Contains(',')))
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@ public class AddServerViewModel : MyReactiveObject
|
|||
public int DownMbps { get; set; }
|
||||
|
||||
[Reactive]
|
||||
public int HopInterval { get; set; }
|
||||
public string HopInterval { get; set; }
|
||||
|
||||
[Reactive]
|
||||
public string Flow { get; set; }
|
||||
|
|
@ -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]
|
||||
|
|
@ -115,11 +112,10 @@ public class AddServerViewModel : MyReactiveObject
|
|||
SalamanderPass = protocolExtra?.SalamanderPass ?? string.Empty;
|
||||
UpMbps = protocolExtra?.UpMbps ?? _config.HysteriaItem.UpMbps;
|
||||
DownMbps = protocolExtra?.DownMbps ?? _config.HysteriaItem.DownMbps;
|
||||
HopInterval = protocolExtra?.HopInterval ?? Global.Hysteria2DefaultHopInt;
|
||||
HopInterval = protocolExtra?.HopInterval.IsNullOrEmpty() ?? true ? Global.Hysteria2DefaultHopInt.ToString() : protocolExtra.HopInterval;
|
||||
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;
|
||||
|
|
@ -178,11 +174,10 @@ public class AddServerViewModel : MyReactiveObject
|
|||
SalamanderPass = SalamanderPass.NullIfEmpty(),
|
||||
UpMbps = UpMbps >= 0 ? UpMbps : null,
|
||||
DownMbps = DownMbps >= 0 ? DownMbps : null,
|
||||
HopInterval = HopInterval >= 5 ? HopInterval : null,
|
||||
HopInterval = HopInterval.NullIfEmpty(),
|
||||
VmessSecurity = VmessSecurity.NullIfEmpty(),
|
||||
VlessEncryption = VlessEncryption.NullIfEmpty(),
|
||||
SsMethod = SsMethod.NullIfEmpty(),
|
||||
Username = Username.NullIfEmpty(),
|
||||
WgPublicKey = WgPublicKey.NullIfEmpty(),
|
||||
WgInterfaceAddress = WgInterfaceAddress.NullIfEmpty(),
|
||||
WgReserved = WgReserved.NullIfEmpty(),
|
||||
|
|
|
|||
|
|
@ -126,7 +126,7 @@ public partial class AddServerWindow : WindowBase<AddServerViewModel>
|
|||
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<AddServerViewModel>
|
|||
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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Reference in a new issue