Files
shadowsocks-windows/shadowsocks-csharp/Model/Server.cs
T
Syrone Wong 3b5d38658f Minor bugfixes (#647)
* Drop unused variable to suppress warning in LogForm

Signed-off-by: Syrone Wong <wong.syrone@gmail.com>

* Fix IPv6 displaying

It is a little ugly, send a PR if you can find a better way.

Signed-off-by: Syrone Wong <wong.syrone@gmail.com>
2016-08-08 18:49:24 +08:00

95 lines
3.2 KiB
C#
Executable File

using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
using System.Text.RegularExpressions;
using Shadowsocks.Controller;
namespace Shadowsocks.Model
{
[Serializable]
public class Server
{
public static readonly Regex
UrlFinder = new Regex("^ss://((?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?)$",
RegexOptions.Compiled | RegexOptions.IgnoreCase),
DetailsParser = new Regex("^((?<method>.+?)(?<auth>-auth)??:(?<password>.*)@(?<hostname>.+?)" +
":(?<port>\\d+?))$", RegexOptions.Compiled | RegexOptions.IgnoreCase);
public string server;
public int server_port;
public string password;
public string method;
public string remarks;
public bool auth;
public override int GetHashCode()
{
return server.GetHashCode() ^ server_port;
}
public override bool Equals(object obj)
{
Server o2 = (Server)obj;
return server == o2.server && server_port == o2.server_port;
}
public string FriendlyName()
{
if (server.IsNullOrEmpty())
{
return I18N.GetString("New server");
}
IPAddress addr;
IPAddress.TryParse( server, out addr );
if ( remarks.IsNullOrEmpty() ) {
switch ( addr.AddressFamily ) {
case AddressFamily.InterNetwork:
return $"{server}:{server_port}";
case AddressFamily.InterNetworkV6:
return $"[{server}]:{server_port}";
}
} else {
switch ( addr.AddressFamily ) {
case AddressFamily.InterNetwork:
return $"{remarks} ({server}:{server_port})";
case AddressFamily.InterNetworkV6:
return $"{remarks} ([{server}]:{server_port})";
}
}
// This should not happen, user should check the input instead of blaming
return null;
}
public Server()
{
server = "";
server_port = 8388;
method = "aes-256-cfb";
password = "";
remarks = "";
auth = false;
}
public Server(string ssURL) : this()
{
var match = UrlFinder.Match(ssURL);
if (!match.Success) throw new FormatException();
var base64 = match.Groups[1].Value;
match = DetailsParser.Match(Encoding.UTF8.GetString(Convert.FromBase64String(
base64.PadRight(base64.Length + (4 - base64.Length % 4) % 4, '='))));
method = match.Groups["method"].Value;
auth = match.Groups["auth"].Success;
password = match.Groups["password"].Value;
server = match.Groups["hostname"].Value;
server_port = int.Parse(match.Groups["port"].Value);
}
public string Identifier()
{
return server + ':' + server_port;
}
}
}