/// <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); } } } }
/// <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); }
/// <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); }
/// <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); } }