コード例 #1
0
        /// <summary>
        /// Call this at the end of any thread execution
        /// if theres an exception it will warn the user otherwise it will indicate success
        /// </summary>
        /// <param name="ex"></param>
        protected void ThreadFinished(Exception ex)
        {
            if (this.InvokeRequired)
            {
                this.Invoke(new ThreadFinishedDeligate(ThreadFinished), new object[] { ex });
            }
            else
            {
                buttonGenerate.Text      = "Start";
                _Thread                  = null;
                this.tabControl1.Enabled = true;

                if (ex == null)
                {
                    // success
                    MessageBox.Show("KeePass file successfully created", "Converted", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }
                else
                {
                    if (ex is ThreadAbortException)
                    {
                        MessageBox.Show("Stopped", "Converting", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                    }
                    else
                    {
                        ErrorMessage.ShowErrorMessage("Convertor", "Converting Failed", ex);
                        //	MessageBox.Show(ex.Message, "Converting Failed", MessageBoxButtons.OK, MessageBoxIcon.Error);

                        KeePassUtilities.LogException(ex);
                    }
                }
            }
        }
コード例 #2
0
        /// <summary>
        /// use NSS to decode and decrypt a string
        /// </summary>
        /// <param name="base64EncryptedData">data that is encrypted and then base64 encoded</param>
        /// <param name="result">clear text result</param>
        /// <returns>success status</returns>
        private static SECStatus Decrypt(string base64EncryptedData, ref string result)
        {
            SECStatus status        = SECStatus.Success;
            SECItem   decodedItem   = new SECItem();
            IntPtr    decodedObject = IntPtr.Zero;

            result = string.Empty;

            decodedItem.Data   = IntPtr.Zero;
            decodedItem.Length = 0;

            try
            {
                decodedObject = NSS3.NSSBase64_DecodeBuffer(IntPtr.Zero, IntPtr.Zero, base64EncryptedData, base64EncryptedData.Length);

                if (decodedObject == IntPtr.Zero)
                {
                    status = SECStatus.Failure;
                }
                else
                {
                    status = NSS3.PK11SDR_Decrypt(decodedObject, ref decodedItem, IntPtr.Zero);

                    if (status != SECStatus.Success)
                    {
                        Int32  error     = NSPR4.PR_GetError();
                        string errorName = NSPR4.PR_ErrorToName(error);
                        throw new Exception("Failed to decrypt data: " + errorName);
                    }

                    try
                    {
                        result = Marshal.PtrToStringAnsi(decodedItem.Data, decodedItem.Length);
                    }
                    finally
                    {
                        NSS3.SECITEM_FreeItem(ref decodedItem, 0);
                    }
                }
            }
            catch (Exception ex)
            {
                status = SECStatus.Failure;
                KeePassUtilities.LogException(ex);
            }
            finally
            {
                if (decodedObject != IntPtr.Zero)
                {
                    NSS3.SECITEM_FreeItem(decodedObject, 1);
                }

                if (decodedItem.Data != IntPtr.Zero)
                {
                    Marshal.FreeHGlobal(decodedItem.Data);
                }
            }

            return(status);
        }
コード例 #3
0
        /// <summary>
        /// use NSS to decode a string
        /// </summary>
        /// <param name="base64Data">data that is base64 encoded</param>
        /// <param name="result">clear text result</param>
        /// <returns>success status</returns>
        private static SECStatus Decode(string base64Data, ref string result)
        {
            SECStatus status        = SECStatus.Success;
            SECItem   decodedItem   = new SECItem();
            IntPtr    decodedObject = IntPtr.Zero;

            result = string.Empty;

            try
            {
                decodedObject = NSS3.NSSBase64_DecodeBuffer(IntPtr.Zero, IntPtr.Zero, base64Data, base64Data.Length);

                if (decodedObject == IntPtr.Zero)
                {
                    status = SECStatus.Failure;
                }
                else
                {
                    try
                    {
                        decodedItem = (SECItem)Marshal.PtrToStructure(decodedObject, typeof(SECItem));

                        result = Marshal.PtrToStringAnsi(decodedItem.Data, decodedItem.Length);
                    }
                    finally
                    {
                        NSS3.SECITEM_FreeItem(decodedObject, 1);
                    }
                }
            }
            catch (Exception ex)
            {
                status = SECStatus.Failure;
                KeePassUtilities.LogException(ex);
            }
            finally
            {
                if (decodedObject != IntPtr.Zero)
                {
                    NSS3.SECITEM_FreeItem(decodedObject, 1);
                }

                if (decodedItem.Data != IntPtr.Zero)
                {
                    Marshal.FreeHGlobal(decodedItem.Data);
                }
            }

            return(status);
        }
コード例 #4
0
        /// <summary>
        /// Create the keepass file using an exported firefox file
        /// </summary>
        private void GenerateUsingExport()
        {
            try
            {
                InternetAccessor internetAccessor = new InternetAccessor();

                // load in the firefox xml document
                XmlDocument fireFoxDocument = new XmlDocument();
                FileStream  fileStream      = File.Open(FirefoxFile, FileMode.Open, FileAccess.Read);
                try
                {
                    XmlReaderSettings settings = new XmlReaderSettings();
                    settings.CheckCharacters = false;
                    settings.ValidationType  = ValidationType.None;

                    XmlReader reader = XmlTextReader.Create(fileStream, settings);

                    try
                    {
                        fireFoxDocument.Load(reader);
                    }
                    finally
                    {
                        reader.Close();
                    }
                }
                catch (Exception ex)
                {
                    throw new Exception("Failed to load the password file. " + Environment.NewLine +
                                        "This may be due to the presence of foreign characters in the data. " + Environment.NewLine +
                                        "Please check the website for help" + Environment.NewLine + Environment.NewLine + ex.Message, ex);
                }
                finally
                {
                    fileStream.Close();
                }


                // get a list of each password node
                XmlNodeList fireFoxEntryNodes = fireFoxDocument.SelectNodes("xml/entries/entry");

                // the output xml document
                XmlDocument keePassDocument = new XmlDocument();

                XmlElement keePassRootElement = keePassDocument.CreateElement("pwlist");
                keePassDocument.AppendChild(keePassRootElement);


                int current = 0;
                int max     = fireFoxEntryNodes.Count;
                // loop each input password and generate the output password
                foreach (XmlElement fireFoxEntryElement in fireFoxEntryNodes)
                {
                    current++;

                    string title = fireFoxEntryElement.SelectSingleNode("@host").InnerText;

                    string url = title;

                    string formSubmitURL = fireFoxEntryElement.SelectSingleNode("@formSubmitURL").InnerText;

                    if (!String.IsNullOrEmpty(formSubmitURL))
                    {
                        url = formSubmitURL;
                    }

                    string host = url;
                    try
                    {
                        Uri uri = new Uri(url);
                        host = uri.Host;
                    }
                    catch { }

                    string internetTitle = null;

                    if (GetTitles)
                    {
                        // get the pages title
                        try
                        {
                            internetTitle = internetAccessor.ScrapeTitle(url);

                            if (!String.IsNullOrEmpty(internetTitle))
                            {
                                title = internetTitle;
                            }
                        }
                        catch (Exception ex)
                        {
                            // some issue!
                            KeePassUtilities.LogException(ex);
                        }
                    }

                    string notes = String.Empty;

                    if (checkBoxIncludeImportNotes.Checked)
                    {
                        notes +=
                            "Imported from FireFox by the Web Site Advantage Firefox To KeePass Importer" + Environment.NewLine + Environment.NewLine +
                            "UserNameField=" + fireFoxEntryElement.SelectSingleNode("@userFieldName").InnerText + System.Environment.NewLine +
                            "PasswordField=" + fireFoxEntryElement.SelectSingleNode("@passFieldName").InnerText + System.Environment.NewLine +
                            "LoginFormDomain=" + fireFoxEntryElement.SelectSingleNode("@formSubmitURL").InnerText + System.Environment.NewLine;
                    }

                    if (GenerateAutoType)
                    {
                        if (!String.IsNullOrEmpty(internetTitle))
                        {
                            notes += Environment.NewLine +
                                     "Auto-Type: " + KeePassUtilities.AutoTypeSequence() + Environment.NewLine +
                                     "Auto-Type-Window: *" + host + "*" + Environment.NewLine +
                                     "Auto-Type-Window: " + KeePassUtilities.AutoTypeWindow(internetTitle) + Environment.NewLine;
                        }
                        else
                        {
                            notes += Environment.NewLine +
                                     "Auto-Type: " + KeePassUtilities.AutoTypeSequence() + Environment.NewLine +
                                     "Auto-Type-Window: *" + host + "*" + Environment.NewLine;
                        }
                    }

                    string now = XmlConvert.ToString(DateTime.Now, "yyyy-MM-ddTHH:mm:ss");

                    // create the xml

                    XmlElement keePassEntryElement = keePassDocument.CreateElement("pwentry");
                    keePassRootElement.AppendChild(keePassEntryElement);

                    XmlElement keePassGroupElement = keePassDocument.CreateElement("group");
                    keePassEntryElement.AppendChild(keePassGroupElement);
                    keePassGroupElement.InnerText = GroupName;

                    // set the group the password gets stored in
                    if (!String.IsNullOrEmpty(GroupName))
                    {
                        keePassGroupElement.SetAttribute("tree", GroupName);
                    }

                    XmlElement keePassTitleElement = keePassDocument.CreateElement("title");
                    keePassEntryElement.AppendChild(keePassTitleElement);
                    keePassTitleElement.InnerText = title;

                    XmlElement keePassUserNameElement = keePassDocument.CreateElement("username");
                    keePassEntryElement.AppendChild(keePassUserNameElement);
                    keePassUserNameElement.InnerText = fireFoxEntryElement.SelectSingleNode("@user").InnerText;

                    XmlElement keePassURLElement = keePassDocument.CreateElement("url");
                    keePassEntryElement.AppendChild(keePassURLElement);
                    keePassURLElement.InnerText = fireFoxEntryElement.SelectSingleNode("@host").InnerText;


                    XmlElement keePassPasswordElement = keePassDocument.CreateElement("password");
                    keePassEntryElement.AppendChild(keePassPasswordElement);
                    keePassPasswordElement.InnerText = fireFoxEntryElement.SelectSingleNode("@password").InnerText;

                    // put other stuff in the notes
                    if (!String.IsNullOrEmpty(notes))
                    {
                        XmlElement keePassNotesElement = keePassDocument.CreateElement("notes");
                        keePassEntryElement.AppendChild(keePassNotesElement);

                        XmlCDataSection cd = keePassDocument.CreateCDataSection(notes);
                        keePassNotesElement.AppendChild(cd);
                    }

                    XmlElement keePassUuidElement = keePassDocument.CreateElement("uuid");
                    keePassEntryElement.AppendChild(keePassUuidElement);
                    keePassUuidElement.InnerText = Guid.NewGuid().ToString().Replace("-", "").ToLower();                     // condensed guid

                    XmlElement keePassImageElement = keePassDocument.CreateElement("image");
                    keePassEntryElement.AppendChild(keePassImageElement);
                    keePassImageElement.InnerText = IconId.ToString();

                    XmlElement keePassCreatedElement = keePassDocument.CreateElement("creationtime");
                    keePassEntryElement.AppendChild(keePassCreatedElement);
                    keePassCreatedElement.InnerText = now;

                    XmlElement keePassModifiedElement = keePassDocument.CreateElement("lastmodtime");
                    keePassEntryElement.AppendChild(keePassModifiedElement);
                    keePassModifiedElement.InnerText = now;

                    XmlElement keePassAccessedElement = keePassDocument.CreateElement("lastaccesstime");
                    keePassEntryElement.AppendChild(keePassAccessedElement);
                    keePassAccessedElement.InnerText = now;

                    // so it does not expire
                    XmlElement keePassExpiresElement = keePassDocument.CreateElement("expiretime");
                    keePassEntryElement.AppendChild(keePassExpiresElement);
                    keePassExpiresElement.SetAttribute("expires", "false");
                    keePassExpiresElement.InnerText = "2999-12-28T23:59:59";

                    LogProgress((int)((double)(current) * 100 / (double)max));
                }

                XmlTextWriter writer = new XmlTextWriter(KeePassFile, Encoding.UTF8);
                try
                {
                    writer.Formatting = Formatting.Indented;
                    keePassDocument.Save(writer);
                }
                finally
                {
                    writer.Close();
                }

                this.ThreadFinished(null);
            }
            catch (Exception ex)
            {
                this.ThreadFinished(ex);
            }
        }