// Rename AirVPN.xml (if exists) to Default.xml public static void FixOldProfilePath(string newPath) { if (Platform.Instance.FileExists(newPath)) { return; } if ((newPath.EndsWith("default.profile")) && (Platform.Instance.FileExists(newPath.Replace("default.profile", "AirVPN.xml")))) { Platform.Instance.FileMove(newPath.Replace("default.profile", "AirVPN.xml"), newPath.Replace("default.profile", "default.xml")); } if ((newPath.EndsWith("default.profile")) && (Platform.Instance.FileExists(newPath.Replace("default.profile", "default.xml")))) { byte[] content = Platform.Instance.FileContentsReadBytes(newPath.Replace("default.profile", "default.xml")); Platform.Instance.FileContentsWriteBytes(newPath, Storage.EncodeFormat("v2n", RandomGenerator.GetRandomId64(), content, Constants.PasswordIfEmpty)); Platform.Instance.FileDelete(newPath.Replace("default.profile", "default.xml")); } }
public void Save() { bool remember = GetBool("remember"); lock (this) { try { XmlDocument xmlDoc = new XmlDocument(); XmlDeclaration xmlDeclaration = xmlDoc.CreateXmlDeclaration("1.0", "utf-8", null); XmlElement rootNode = xmlDoc.CreateElement("eddie"); xmlDoc.InsertBefore(xmlDeclaration, xmlDoc.DocumentElement); XmlElement optionsNode = xmlDoc.CreateElement("options"); rootNode.AppendChild(optionsNode); xmlDoc.AppendChild(rootNode); foreach (Option option in Options.Values) { bool skip = false; if ((remember == false) && (option.Code == "login")) { skip = true; } if ((remember == false) && (option.Code == "password")) { skip = true; } if ((option.Value == "") || (option.Value == option.Default)) { skip = true; } if (skip == false) { XmlElement itemNode = xmlDoc.CreateElement("option"); itemNode.SetAttribute("name", option.Code); itemNode.SetAttribute("value", option.Value); optionsNode.AppendChild(itemNode); } } XmlElement providersNode = xmlDoc.CreateElement("providers"); rootNode.AppendChild(providersNode); foreach (Provider provider in Engine.Instance.ProvidersManager.Providers) { XmlNode providerNode = xmlDoc.ImportNode(provider.Storage.DocumentElement, true); providersNode.AppendChild(providerNode); } if (Engine.Instance.ProvidersManager.Providers.Count == 1) { if (Engine.Instance.ProvidersManager.Providers[0].Code == "AirVPN") { // Move providers->AirVPN to root. XmlElement xmlAirVPN = providersNode.GetFirstElementByTagName("AirVPN"); if (xmlAirVPN != null) { foreach (XmlElement xmlChild in xmlAirVPN.ChildNodes) { ExtensionsXml.XmlCopyElement(xmlChild, xmlDoc.DocumentElement); } providersNode.RemoveChild(xmlAirVPN); } if (providersNode.ChildNodes.Count == 0) { providersNode.ParentNode.RemoveChild(providersNode); } } } // Compute password if ((SaveFormat == "v2s") && (Platform.Instance.OsCredentialSystemName() == "")) { SaveFormat = "v2n"; } if ((Platform.Instance.OsCredentialSystemName() != "") && (m_loadFormat == "v2s") && (SaveFormat != "v2s")) { Platform.Instance.OsCredentialSystemDelete(Id); } if (SaveFormat == "v2n") { SavePassword = Constants.PasswordIfEmpty; } else if (SaveFormat == "v2s") { if ((m_loadFormat != "v2s") || (SavePassword == "") || (SavePassword != m_loadPassword)) { SavePassword = RandomGenerator.GetRandomPassword(); if (Platform.Instance.OsCredentialSystemWrite(Id, SavePassword) == false) { // User not authorize the OS keychain, or fail. Revert to plain mode. SaveFormat = "v2n"; SavePassword = Constants.PasswordIfEmpty; } } } byte[] plainData = Encoding.UTF8.GetBytes(xmlDoc.OuterXml); byte[] encrypted = Storage.EncodeFormat(SaveFormat, Id, plainData, SavePassword); Platform.Instance.FileContentsWriteBytes(SavePath, encrypted); Platform.Instance.FileEnsurePermission(SavePath, "600"); m_loadFormat = SaveFormat; m_loadPassword = SavePassword; } catch (Exception ex) { Engine.Instance.Logs.Log(LogType.Fatal, LanguageManager.GetText("OptionsWriteFailed", SavePath, ex.Message)); } } }