Files
v2rayN/v2rayN/v2rayN/Mode/Config.cs
2020-04-18 21:52:42 +08:00

552 lines
14 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System;
using System.Collections.Generic;
using v2rayN.Base;
using v2rayN.HttpProxyHandler;
namespace v2rayN.Mode
{
/// <summary>
/// 本软件配置文件实体类
/// </summary>
[Serializable]
public class Config
{
/// <summary>
/// 本地监听
/// </summary>
public List<InItem> inbound { get; set; }
/// <summary>
/// 允许日志
/// </summary>
public bool logEnabled { get; set; }
/// <summary>
/// 日志等级
/// </summary>
public string loglevel { get; set; }
/// <summary>
/// 活动配置序号
/// </summary>
public int index { get; set; }
/// <summary>
/// vmess服务器信息
/// </summary>
public List<VmessItem> vmess { get; set; }
/// <summary>
/// 允许Mux多路复用
/// </summary>
public bool muxEnabled { get; set; }
/// <summary>
/// 域名解析策略
/// </summary>
public string domainStrategy { get; set; }
/// <summary>
/// 路由模式
/// </summary>
public int routingMode { get; set; }
/// <summary>
/// 用户自定义需代理的网址或ip
/// </summary>
public List<string> useragent { get; set; }
/// <summary>
/// 用户自定义直连的网址或ip
/// </summary>
public List<string> userdirect { get; set; }
/// <summary>
/// 用户自定义阻止的网址或ip
/// </summary>
public List<string> userblock { get; set; }
/// <summary>
/// KcpItem
/// </summary>
public KcpItem kcpItem { get; set; }
/// <summary>
/// 监听状态
/// </summary>
public ListenerType listenerType { get; set; }
/// <summary>
/// 自定义服务器下载测速url
/// </summary>
public string speedTestUrl { get; set; }
/// <summary>
/// 自定义“服务器真连接延迟”测试url
/// </summary>
public string speedPingTestUrl { get; set; }
/// <summary>
/// 自定义GFWList url
/// </summary>
public string urlGFWList { get; set; }
/// <summary>
/// 允许来自局域网的连接
/// </summary>
public bool allowLANConn { get; set; }
/// <summary>
/// 启用实时网速和流量统计
/// </summary>
public bool enableStatistics { get; set; }
/// <summary>
/// 去重时优先保留较旧(顶部)节点
/// </summary>
public bool keepOlderDedupl { get; set; }
/// <summary>
/// 服务器列表隔行着色
/// </summary>
public bool interlaceColoring { get; set; }
/// <summary>
/// 视图刷新率
/// </summary>
public int statisticsFreshRate { get; set; }
/// <summary>
/// 自定义远程DNS
/// </summary>
public string remoteDNS { get; set; }
/// <summary>
/// 是否允许不安全连接
/// </summary>
public string defaultAllowInsecure { get; set; }
/// <summary>
/// 订阅
/// </summary>
public List<SubItem> subItem { get; set; }
/// <summary>
/// UI
/// </summary>
public UIItem uiItem { get; set; }
public List<string> userPacRule { get; set; }
#region
public string address()
{
if (index < 0)
{
return string.Empty;
}
return vmess[index].address.TrimEx();
}
public int port()
{
if (index < 0)
{
return 10808;
}
return vmess[index].port;
}
public string id()
{
if (index < 0)
{
return string.Empty;
}
return vmess[index].id.TrimEx();
}
public int alterId()
{
if (index < 0)
{
return 0;
}
return vmess[index].alterId;
}
public string security()
{
if (index < 0)
{
return string.Empty;
}
return vmess[index].security.TrimEx();
}
public string remarks()
{
if (index < 0)
{
return string.Empty;
}
return vmess[index].remarks.TrimEx();
}
public string network()
{
if (index < 0 || Utils.IsNullOrEmpty(vmess[index].network))
{
return Global.DefaultNetwork;
}
return vmess[index].network.TrimEx();
}
public string headerType()
{
if (index < 0 || Utils.IsNullOrEmpty(vmess[index].headerType))
{
return Global.None;
}
return vmess[index].headerType.Replace(" ", "").TrimEx();
}
public string requestHost()
{
if (index < 0 || Utils.IsNullOrEmpty(vmess[index].requestHost))
{
return string.Empty;
}
return vmess[index].requestHost.Replace(" ", "").TrimEx();
}
public string path()
{
if (index < 0 || Utils.IsNullOrEmpty(vmess[index].path))
{
return string.Empty;
}
return vmess[index].path.Replace(" ", "").TrimEx();
}
public string streamSecurity()
{
if (index < 0 || Utils.IsNullOrEmpty(vmess[index].streamSecurity))
{
return string.Empty;
}
return vmess[index].streamSecurity;
}
public bool allowInsecure()
{
if (index < 0 || Utils.IsNullOrEmpty(vmess[index].allowInsecure))
{
return Convert.ToBoolean(defaultAllowInsecure);
}
return Convert.ToBoolean(vmess[index].allowInsecure);
}
public int GetLocalPort(string protocol)
{
if (protocol == Global.InboundHttp)
{
return GetLocalPort(Global.InboundSocks) + 1;
}
else if (protocol == "pac")
{
return GetLocalPort(Global.InboundSocks) + 2;
}
else if (protocol == "speedtest")
{
return GetLocalPort(Global.InboundSocks) + 103;
}
int localPort = 0;
foreach (InItem inItem in inbound)
{
if (inItem.protocol.Equals(protocol))
{
localPort = inItem.localPort;
break;
}
}
return localPort;
}
public int configType()
{
if (index < 0)
{
return 0;
}
return vmess[index].configType;
}
public string getSummary()
{
if (index < 0)
{
return string.Empty;
}
return vmess[index].getSummary();
}
public string getItemId()
{
if (index < 0)
{
return string.Empty;
}
return vmess[index].getItemId();
}
#endregion
}
[Serializable]
public class VmessItem
{
public VmessItem()
{
configVersion = 1;
address = string.Empty;
port = 0;
id = string.Empty;
alterId = 0;
security = string.Empty;
network = string.Empty;
remarks = string.Empty;
headerType = string.Empty;
requestHost = string.Empty;
path = string.Empty;
streamSecurity = string.Empty;
allowInsecure = string.Empty;
configType = (int)EConfigType.Vmess;
testResult = string.Empty;
subid = string.Empty;
}
public string getSummary()
{
string summary = string.Format("{0}-", ((EConfigType)configType).ToString());
string[] arrAddr = address.Split('.');
string addr;
if (arrAddr.Length > 2)
{
addr = $"{arrAddr[0]}***{arrAddr[arrAddr.Length - 1]}";
}
else if (arrAddr.Length > 1)
{
addr = $"***{arrAddr[arrAddr.Length - 1]}";
}
else
{
addr = address;
}
if (configType == (int)EConfigType.Vmess)
{
summary += string.Format("{0}({1}:{2})", remarks, addr, port);
}
else if (configType == (int)EConfigType.Shadowsocks)
{
summary += string.Format("{0}({1}:{2})", remarks, addr, port);
}
else if (configType == (int)EConfigType.Socks)
{
summary += string.Format("{0}({1}:{2})", remarks, addr, port);
}
else
{
summary += string.Format("{0}", remarks);
}
return summary;
}
public string getSubRemarks(Config config)
{
string subRemarks = string.Empty;
if (Utils.IsNullOrEmpty(subid))
{
return subRemarks;
}
foreach (SubItem sub in config.subItem)
{
if (sub.id.EndsWith(subid))
{
return sub.remarks;
}
}
if (subid.Length <= 4)
{
return subid;
}
return subid.Substring(0, 4);
}
public string getItemId()
{
string itemId = $"{address}{port}{requestHost}{path}";
itemId = Utils.Base64Encode(itemId);
return itemId;
}
/// <summary>
/// 版本(现在=2)
/// </summary>
public int configVersion { get; set; }
/// <summary>
/// 远程服务器地址
/// </summary>
public string address { get; set; }
/// <summary>
/// 远程服务器端口
/// </summary>
public int port { get; set; }
/// <summary>
/// 远程服务器ID
/// </summary>
public string id { get; set; }
/// <summary>
/// 远程服务器额外ID
/// </summary>
public int alterId { get; set; }
/// <summary>
/// 本地安全策略
/// </summary>
public string security { get; set; }
/// <summary>
/// tcp,kcp,ws,h2,quic
/// </summary>
public string network { get; set; }
/// <summary>
/// 备注或别名
/// </summary>
public string remarks { get; set; }
/// <summary>
/// 伪装类型
/// </summary>
public string headerType { get; set; }
/// <summary>
/// 伪装的域名
/// </summary>
public string requestHost { get; set; }
/// <summary>
/// ws h2 path
/// </summary>
public string path { get; set; }
/// <summary>
/// 底层传输安全
/// </summary>
public string streamSecurity { get; set; }
/// <summary>
/// 是否允许不安全连接(用于客户端)
/// </summary>
public string allowInsecure { get; set; }
/// <summary>
/// config type(1=normal,2=custom)
/// </summary>
public int configType { get; set; }
/// <summary>
///
/// </summary>
public string testResult { get; set; }
/// <summary>
/// SubItem id
/// </summary>
public string subid { get; set; }
}
[Serializable]
public class InItem
{
/// <summary>
/// 本地监听端口
/// </summary>
public int localPort { get; set; }
/// <summary>
/// 协议默认为socks
/// </summary>
public string protocol { get; set; }
/// <summary>
/// 允许udp
/// </summary>
public bool udpEnabled { get; set; }
/// <summary>
/// 开启流量探测
/// </summary>
public bool sniffingEnabled { get; set; } = true;
}
[Serializable]
public class KcpItem
{
/// <summary>
///
/// </summary>
public int mtu { get; set; }
/// <summary>
///
/// </summary>
public int tti { get; set; }
/// <summary>
///
/// </summary>
public int uplinkCapacity { get; set; }
/// <summary>
///
/// </summary>
public int downlinkCapacity { get; set; }
/// <summary>
///
/// </summary>
public bool congestion { get; set; }
/// <summary>
///
/// </summary>
public int readBufferSize { get; set; }
/// <summary>
///
/// </summary>
public int writeBufferSize { get; set; }
}
[Serializable]
public class SubItem
{
/// <summary>
///
/// </summary>
public string id { get; set; }
/// <summary>
/// 备注
/// </summary>
public string remarks { get; set; }
/// <summary>
/// url
/// </summary>
public string url { get; set; }
/// <summary>
/// enable
/// </summary>
public bool enabled { get; set; } = true;
}
[Serializable]
public class UIItem
{
public System.Drawing.Size mainSize { get; set; }
public Dictionary<string, int> mainLvColWidth { get; set; }
public List<string> mainLvColLayout { get; set; }
}
}