using System; using System.Collections.Generic; using System.IO; using Shadowsocks.Controller; using Newtonsoft.Json; namespace Shadowsocks.Model { [Serializable] public class Configuration { public List configs; // when strategy is set, index is ignored public string strategy; public int index; public bool global; public bool enabled; public bool shareOverLan; public bool isDefault; public int localPort; public string pacUrl; public bool useOnlinePac; public bool availabilityStatistics; public bool autoCheckUpdate; public bool isVerboseLogging; public LogViewerConfig logViewer; public ProxyConfig proxy; public HotkeyConfig hotkey; private static string CONFIG_FILE = "gui-config.json"; public Server GetCurrentServer() { if (index >= 0 && index < configs.Count) return configs[index]; else return GetDefaultServer(); } public static void CheckServer(Server server) { CheckPort(server.server_port); CheckPassword(server.password); CheckServer(server.server); CheckTimeout(server.timeout, Server.MaxServerTimeoutSec); } public static Configuration Load() { try { string configContent = File.ReadAllText(CONFIG_FILE); Configuration config = JsonConvert.DeserializeObject(configContent); config.isDefault = false; if (config.localPort == 0) config.localPort = 1080; if (config.index == -1 && config.strategy == null) config.index = 0; if (config.logViewer == null) config.logViewer = new LogViewerConfig(); if (config.proxy == null) config.proxy = new ProxyConfig(); if (config.hotkey == null) config.hotkey = new HotkeyConfig(); if (config.proxy.proxyType < ProxyConfig.PROXY_SOCKS5 || config.proxy.proxyType > ProxyConfig.PROXY_HTTP) { config.proxy.proxyType = ProxyConfig.PROXY_SOCKS5; } return config; } catch (Exception e) { if (!(e is FileNotFoundException)) Logging.LogUsefulException(e); return new Configuration { index = 0, isDefault = true, localPort = 1080, autoCheckUpdate = true, configs = new List() { GetDefaultServer() } }; } } public static void Save(Configuration config) { if (config.index >= config.configs.Count) config.index = config.configs.Count - 1; if (config.index < -1) config.index = -1; if (config.index == -1 && config.strategy == null) config.index = 0; config.isDefault = false; try { using (StreamWriter sw = new StreamWriter(File.Open(CONFIG_FILE, FileMode.Create))) { string jsonString = JsonConvert.SerializeObject(config, Formatting.Indented); sw.Write(jsonString); sw.Flush(); } } catch (IOException e) { Logging.LogUsefulException(e); } } public static Server GetDefaultServer() { return new Server(); } private static void Assert(bool condition) { if (!condition) throw new Exception(I18N.GetString("assertion failure")); } public static void CheckPort(int port) { if (port <= 0 || port > 65535) throw new ArgumentException(I18N.GetString("Port out of range")); } public static void CheckLocalPort(int port) { CheckPort(port); if (port == 8123) throw new ArgumentException(I18N.GetString("Port can't be 8123")); } private static void CheckPassword(string password) { if (password.IsNullOrEmpty()) throw new ArgumentException(I18N.GetString("Password can not be blank")); } public static void CheckServer(string server) { if (server.IsNullOrEmpty()) throw new ArgumentException(I18N.GetString("Server IP can not be blank")); } public static void CheckTimeout(int timeout, int maxTimeout) { if (timeout <= 0 || timeout > maxTimeout) throw new ArgumentException(string.Format( I18N.GetString("Timeout is invalid, it should not exceed {0}"), maxTimeout)); } } }