2025-04-02 03:44:23 +00:00
|
|
|
namespace ServiceLib.Models;
|
|
|
|
|
|
|
|
|
|
[Serializable]
|
2026-02-06 05:50:47 +00:00
|
|
|
public class ProfileItem
|
2023-01-01 11:42:01 +00:00
|
|
|
{
|
2026-02-05 11:48:33 +00:00
|
|
|
private ProtocolExtraItem? _protocolExtraCache;
|
2026-04-16 12:21:10 +00:00
|
|
|
private TransportExtraItem? _transportExtraCache;
|
2026-02-05 11:48:33 +00:00
|
|
|
|
2025-04-02 03:44:23 +00:00
|
|
|
public ProfileItem()
|
2023-01-01 11:42:01 +00:00
|
|
|
{
|
2025-04-02 03:44:23 +00:00
|
|
|
IndexId = string.Empty;
|
|
|
|
|
ConfigType = EConfigType.VMess;
|
2026-04-16 12:21:10 +00:00
|
|
|
ConfigVersion = 4;
|
2026-02-06 05:50:47 +00:00
|
|
|
Subid = string.Empty;
|
2025-04-02 03:44:23 +00:00
|
|
|
Address = string.Empty;
|
|
|
|
|
Port = 0;
|
2026-02-05 11:48:33 +00:00
|
|
|
Password = string.Empty;
|
|
|
|
|
Username = string.Empty;
|
2025-04-02 03:44:23 +00:00
|
|
|
Network = string.Empty;
|
|
|
|
|
Remarks = string.Empty;
|
|
|
|
|
StreamSecurity = string.Empty;
|
|
|
|
|
AllowInsecure = string.Empty;
|
|
|
|
|
}
|
2023-01-01 11:42:01 +00:00
|
|
|
|
2025-04-02 03:44:23 +00:00
|
|
|
#region function
|
2023-04-14 12:49:36 +00:00
|
|
|
|
2025-04-02 03:44:23 +00:00
|
|
|
public string GetSummary()
|
|
|
|
|
{
|
2025-10-31 12:25:45 +00:00
|
|
|
var summary = $"[{ConfigType.ToString()}] ";
|
2025-10-05 08:27:34 +00:00
|
|
|
if (IsComplex())
|
2023-01-01 11:42:01 +00:00
|
|
|
{
|
2025-10-05 08:27:34 +00:00
|
|
|
summary += $"[{CoreType.ToString()}]{Remarks}";
|
|
|
|
|
}
|
|
|
|
|
else
|
2023-01-01 11:42:01 +00:00
|
|
|
{
|
2025-10-05 08:27:34 +00:00
|
|
|
var arrAddr = Address.Contains(':') ? Address.Split(':') : Address.Split('.');
|
|
|
|
|
var addr = arrAddr.Length switch
|
|
|
|
|
{
|
|
|
|
|
> 2 => $"{arrAddr.First()}***{arrAddr.Last()}",
|
|
|
|
|
> 1 => $"***{arrAddr.Last()}",
|
|
|
|
|
_ => Address
|
|
|
|
|
};
|
|
|
|
|
summary += $"{Remarks}({addr}:{Port})";
|
|
|
|
|
}
|
2025-04-02 03:44:23 +00:00
|
|
|
return summary;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public List<string>? GetAlpn()
|
|
|
|
|
{
|
|
|
|
|
return Alpn.IsNullOrEmpty() ? null : Utils.String2List(Alpn);
|
|
|
|
|
}
|
2023-01-01 11:42:01 +00:00
|
|
|
|
2025-04-02 03:44:23 +00:00
|
|
|
public string GetNetwork()
|
|
|
|
|
{
|
|
|
|
|
if (Network.IsNullOrEmpty() || !Global.Networks.Contains(Network))
|
2023-01-01 11:42:01 +00:00
|
|
|
{
|
2025-04-02 03:44:23 +00:00
|
|
|
return Global.DefaultNetwork;
|
2023-01-01 11:42:01 +00:00
|
|
|
}
|
2025-04-02 03:44:23 +00:00
|
|
|
return Network.TrimEx();
|
|
|
|
|
}
|
2023-01-01 11:42:01 +00:00
|
|
|
|
2025-10-05 08:27:34 +00:00
|
|
|
public bool IsComplex()
|
|
|
|
|
{
|
2025-10-08 09:13:54 +00:00
|
|
|
return ConfigType.IsComplexType();
|
2025-10-05 08:27:34 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public bool IsValid()
|
|
|
|
|
{
|
|
|
|
|
if (IsComplex())
|
2025-11-02 07:25:41 +00:00
|
|
|
{
|
2025-10-05 08:27:34 +00:00
|
|
|
return true;
|
2025-11-02 07:25:41 +00:00
|
|
|
}
|
2025-10-05 08:27:34 +00:00
|
|
|
|
|
|
|
|
if (Address.IsNullOrEmpty() || Port is <= 0 or >= 65536)
|
2025-11-02 07:25:41 +00:00
|
|
|
{
|
2025-10-05 08:27:34 +00:00
|
|
|
return false;
|
2025-11-02 07:25:41 +00:00
|
|
|
}
|
2025-10-05 08:27:34 +00:00
|
|
|
|
|
|
|
|
switch (ConfigType)
|
|
|
|
|
{
|
|
|
|
|
case EConfigType.VMess:
|
2026-02-05 11:48:33 +00:00
|
|
|
if (Password.IsNullOrEmpty() || !Utils.IsGuidByParse(Password))
|
2025-11-02 07:25:41 +00:00
|
|
|
{
|
2025-10-05 08:27:34 +00:00
|
|
|
return false;
|
2025-11-02 07:25:41 +00:00
|
|
|
}
|
|
|
|
|
|
2025-10-05 08:27:34 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case EConfigType.VLESS:
|
2026-02-05 11:48:33 +00:00
|
|
|
if (Password.IsNullOrEmpty() || (!Utils.IsGuidByParse(Password) && Password.Length > 30))
|
2025-11-02 07:25:41 +00:00
|
|
|
{
|
2025-10-05 08:27:34 +00:00
|
|
|
return false;
|
2025-11-02 07:25:41 +00:00
|
|
|
}
|
|
|
|
|
|
2026-02-05 11:48:33 +00:00
|
|
|
if (!Global.Flows.Contains(GetProtocolExtra().Flow ?? string.Empty))
|
2025-11-02 07:25:41 +00:00
|
|
|
{
|
2025-10-05 08:27:34 +00:00
|
|
|
return false;
|
2025-11-02 07:25:41 +00:00
|
|
|
}
|
|
|
|
|
|
2025-10-05 08:27:34 +00:00
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case EConfigType.Shadowsocks:
|
2026-02-05 11:48:33 +00:00
|
|
|
if (Password.IsNullOrEmpty())
|
2025-11-02 07:25:41 +00:00
|
|
|
{
|
2025-10-05 08:27:34 +00:00
|
|
|
return false;
|
2025-11-02 07:25:41 +00:00
|
|
|
}
|
|
|
|
|
|
2026-02-05 11:48:33 +00:00
|
|
|
if (string.IsNullOrEmpty(GetProtocolExtra().SsMethod)
|
|
|
|
|
|| !Global.SsSecuritiesInSingbox.Contains(GetProtocolExtra().SsMethod))
|
2025-11-02 07:25:41 +00:00
|
|
|
{
|
2025-10-05 08:27:34 +00:00
|
|
|
return false;
|
2025-11-02 07:25:41 +00:00
|
|
|
}
|
|
|
|
|
|
2025-10-05 08:27:34 +00:00
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if ((ConfigType is EConfigType.VLESS or EConfigType.Trojan)
|
|
|
|
|
&& StreamSecurity == Global.StreamSecurityReality
|
|
|
|
|
&& PublicKey.IsNullOrEmpty())
|
|
|
|
|
{
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-16 12:21:10 +00:00
|
|
|
public ProtocolExtraItem GetProtocolExtra()
|
|
|
|
|
{
|
|
|
|
|
return _protocolExtraCache ??= JsonUtils.Deserialize<ProtocolExtraItem>(ProtoExtra) ?? new ProtocolExtraItem();
|
|
|
|
|
}
|
|
|
|
|
|
2026-02-05 11:48:33 +00:00
|
|
|
public void SetProtocolExtra(ProtocolExtraItem extraItem)
|
|
|
|
|
{
|
|
|
|
|
_protocolExtraCache = extraItem;
|
|
|
|
|
ProtoExtra = JsonUtils.Serialize(extraItem, false);
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-16 12:21:10 +00:00
|
|
|
public TransportExtraItem GetTransportExtra()
|
2026-02-05 11:48:33 +00:00
|
|
|
{
|
2026-04-16 12:21:10 +00:00
|
|
|
return _transportExtraCache ??= JsonUtils.Deserialize<TransportExtraItem>(TransportExtra) ?? new TransportExtraItem();
|
2026-02-05 11:48:33 +00:00
|
|
|
}
|
|
|
|
|
|
2026-04-16 12:21:10 +00:00
|
|
|
public void SetTransportExtra(TransportExtraItem transportExtra)
|
2026-02-05 11:48:33 +00:00
|
|
|
{
|
2026-04-16 12:21:10 +00:00
|
|
|
_transportExtraCache = transportExtra;
|
|
|
|
|
TransportExtra = JsonUtils.Serialize(transportExtra, false);
|
2026-02-05 11:48:33 +00:00
|
|
|
}
|
|
|
|
|
|
2025-04-02 03:44:23 +00:00
|
|
|
#endregion function
|
2023-01-01 11:42:01 +00:00
|
|
|
|
2025-04-02 03:44:23 +00:00
|
|
|
[PrimaryKey]
|
|
|
|
|
public string IndexId { get; set; }
|
|
|
|
|
|
|
|
|
|
public EConfigType ConfigType { get; set; }
|
2026-02-06 05:50:47 +00:00
|
|
|
public ECoreType? CoreType { get; set; }
|
2025-04-02 03:44:23 +00:00
|
|
|
public int ConfigVersion { get; set; }
|
2026-02-06 05:50:47 +00:00
|
|
|
public string Subid { get; set; }
|
|
|
|
|
public bool IsSub { get; set; } = true;
|
|
|
|
|
public int? PreSocksPort { get; set; }
|
|
|
|
|
public bool DisplayLog { get; set; } = true;
|
|
|
|
|
public string Remarks { get; set; }
|
2025-04-02 03:44:23 +00:00
|
|
|
public string Address { get; set; }
|
|
|
|
|
public int Port { get; set; }
|
2026-02-05 11:48:33 +00:00
|
|
|
public string Password { get; set; }
|
|
|
|
|
public string Username { get; set; }
|
2025-04-02 03:44:23 +00:00
|
|
|
public string Network { get; set; }
|
2026-04-16 12:21:10 +00:00
|
|
|
|
|
|
|
|
[Obsolete("Use TransportExtra.RawHeaderType/XhttpMode/GrpcMode/KcpHeaderType instead.")]
|
2025-04-02 03:44:23 +00:00
|
|
|
public string HeaderType { get; set; }
|
2026-04-16 12:21:10 +00:00
|
|
|
|
|
|
|
|
[Obsolete("Use TransportExtra.Host/GrpcAuthority instead.")]
|
2025-04-02 03:44:23 +00:00
|
|
|
public string RequestHost { get; set; }
|
2026-04-16 12:21:10 +00:00
|
|
|
|
|
|
|
|
[Obsolete("Use TransportExtra.Path/GrpcServiceName/KcpSeed instead.")]
|
2025-04-02 03:44:23 +00:00
|
|
|
public string Path { get; set; }
|
2026-04-16 12:21:10 +00:00
|
|
|
|
2025-04-02 03:44:23 +00:00
|
|
|
public string StreamSecurity { get; set; }
|
|
|
|
|
public string AllowInsecure { get; set; }
|
|
|
|
|
public string Sni { get; set; }
|
|
|
|
|
public string Alpn { get; set; } = string.Empty;
|
|
|
|
|
public string Fingerprint { get; set; }
|
|
|
|
|
public string PublicKey { get; set; }
|
|
|
|
|
public string ShortId { get; set; }
|
|
|
|
|
public string SpiderX { get; set; }
|
2025-08-03 02:34:21 +00:00
|
|
|
public string Mldsa65Verify { get; set; }
|
2026-04-16 12:21:10 +00:00
|
|
|
|
|
|
|
|
[Obsolete("Use TransportExtra.XhttpExtra instead.")]
|
2025-04-02 03:44:23 +00:00
|
|
|
public string Extra { get; set; }
|
2026-04-16 12:21:10 +00:00
|
|
|
|
2025-06-29 07:06:02 +00:00
|
|
|
public bool? MuxEnabled { get; set; }
|
2025-11-02 07:17:47 +00:00
|
|
|
public string Cert { get; set; }
|
2026-01-17 07:42:40 +00:00
|
|
|
public string CertSha { get; set; }
|
2026-01-07 03:34:13 +00:00
|
|
|
public string EchConfigList { get; set; }
|
|
|
|
|
public string EchForceQuery { get; set; }
|
2026-02-24 13:09:17 +00:00
|
|
|
public string Finalmask { get; set; }
|
2026-02-05 11:48:33 +00:00
|
|
|
|
|
|
|
|
public string ProtoExtra { get; set; }
|
2026-04-16 12:21:10 +00:00
|
|
|
public string TransportExtra { get; set; }
|
2026-02-05 11:48:33 +00:00
|
|
|
|
|
|
|
|
[Obsolete("Use ProtocolExtraItem.Ports instead.")]
|
|
|
|
|
public string Ports { get; set; }
|
|
|
|
|
|
|
|
|
|
[Obsolete("Use ProtocolExtraItem.AlterId instead.")]
|
|
|
|
|
public int AlterId { get; set; }
|
|
|
|
|
|
|
|
|
|
[Obsolete("Use ProtocolExtraItem.Flow instead.")]
|
|
|
|
|
public string Flow { get; set; }
|
|
|
|
|
|
|
|
|
|
[Obsolete("Use ProfileItem.Password instead.")]
|
|
|
|
|
public string Id { get; set; }
|
|
|
|
|
|
|
|
|
|
[Obsolete("Use ProtocolExtraItem.xxx instead.")]
|
|
|
|
|
public string Security { get; set; }
|
2025-03-01 13:13:37 +00:00
|
|
|
}
|