Beispiel #1
0
        // 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"));
            }
        }
Beispiel #2
0
        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));
                }
            }
        }