using NUnit.Framework; using System; using System.Drawing; using System.IO; using System.Text; using System.Text.RegularExpressions; using Windows.UI; #if KeePassLib using KeePassLib; using KeePassLib.Keys; using KeePassLib.Security; using KeePassLib.Serialization; using KeePassLib.Collections; #else using ModernKeePassLibPCL; using ModernKeePassLibPCL.Keys; using ModernKeePassLibPCL.Security; using ModernKeePassLibPCL.Serialization; using ModernKeePassLibPCL.Collections; #endif namespace ModernKeePassLib.Test.Shared.Serialization { [TestFixture()] public class KdbxFileTests { const string testLocalizedAppName = "My Localized App Name"; const string testDatabaseName = "My Database Name"; const string testDatabaseDescription = "My Database Description"; const string testDefaultUserName = "My Default User Name"; const string testColor = "#FF0000"; // Red const string testRootGroupName = "My Root Group Name"; const string testRootGroupNotes = "My Root Group Notes"; const string testRootGroupDefaultAutoTypeSequence = "My Root Group Default Auto Type Sequence"; const string testDatabase = "\r\n" + "\r\n" + "\t\r\n" + "\t\t" + testLocalizedAppName + "\r\n" + "\t\t" + testDatabaseName + "\r\n" + "\t\t2015-03-14T03:15:26Z\r\n" + "\t\t" + testDatabaseDescription + "\r\n" + "\t\t2015-03-14T03:15:26Z\r\n" + "\t\t" + testDefaultUserName + "\r\n" + "\t\t2015-03-14T03:15:26Z\r\n" + "\t\t365\r\n" + //"\t\t" + testColor + "\r\n" + "\t\t\r\n" + "\t\t2015-03-14T03:15:26Z\r\n" + "\t\t-1\r\n" + "\t\t-1\r\n" + "\t\t\r\n" + "\t\t\tFalse\r\n" + "\t\t\tFalse\r\n" + "\t\t\tTrue\r\n" + "\t\t\tFalse\r\n" + "\t\t\tFalse\r\n" + "\t\t\r\n" + "\t\tTrue\r\n" + "\t\tAAAAAAAAAAAAAAAAAAAAAA==\r\n" + "\t\t2015-03-14T03:15:26Z\r\n" + "\t\tAAAAAAAAAAAAAAAAAAAAAA==\r\n" + "\t\t2015-03-14T03:15:26Z\r\n" + "\t\t10\r\n" + "\t\t6291456\r\n" + "\t\tAAAAAAAAAAAAAAAAAAAAAA==\r\n" + "\t\tAAAAAAAAAAAAAAAAAAAAAA==\r\n" + "\t\t\r\n" + "\t\t\r\n" + "\t\r\n" + "\t\r\n" + "\t\t\r\n" + "\t\t\tAAAAAAAAAAAAAAAAAAAAAA==\r\n" + "\t\t\t" + testRootGroupName + "\r\n" + "\t\t\t" + testRootGroupNotes + "\r\n" + "\t\t\t49\r\n" + "\t\t\t\r\n" + "\t\t\t\t2015-03-14T03:15:26Z\r\n" + "\t\t\t\t2015-03-14T03:15:26Z\r\n" + "\t\t\t\t2015-03-14T03:15:26Z\r\n" + "\t\t\t\t2015-03-14T03:15:26Z\r\n" + "\t\t\t\tFalse\r\n" + "\t\t\t\t0\r\n" + "\t\t\t\t2015-03-14T03:15:26Z\r\n" + "\t\t\t\r\n" + "\t\t\tTrue\r\n" + "\t\t\t" + testRootGroupDefaultAutoTypeSequence + "\r\n" + "\t\t\tnull\r\n" + "\t\t\tnull\r\n" + "\t\t\tAAAAAAAAAAAAAAAAAAAAAA==\r\n" + "\t\t\r\n" + "\t\t\r\n" + "\t\r\n" + ""; const string testDate = "2015-03-14T03:15:26Z"; [Test()] public void TestLoad() { var database = new PwDatabase(); using (var ms = new MemoryStream(Encoding.UTF8.GetBytes(testDatabase))) { var file = new KdbxFile(database); file.Load(ms, KdbxFormat.PlainXml, null); } //Assert.That(database.Color.ToArgb(), Is.EqualTo(Color.Red.ToArgb())); Assert.That(database.Compression, Is.EqualTo(PwCompressionAlgorithm.GZip)); //Assert.That (database.CustomData, Is.EqualTo ()); Assert.That(database.CustomIcons, Is.Empty); } [Test()] public void TestSave() { var buffer = new byte[4096]; using (var ms = new MemoryStream(buffer)) { var database = new PwDatabase(); database.New(new IOConnectionInfo(), new CompositeKey()); var date = DateTime.Parse(testDate); PwDatabase.LocalizedAppName = testLocalizedAppName; database.Name = testDatabaseName; database.NameChanged = date; database.Description = testDatabaseDescription; database.DescriptionChanged = date; database.DefaultUserName = testDefaultUserName; database.DefaultUserNameChanged = date; //database.Color = Color.Red; database.MasterKeyChanged = date; database.RecycleBinChanged = date; database.EntryTemplatesGroupChanged = date; database.RootGroup.Uuid = PwUuid.Zero; database.RootGroup.Name = testRootGroupName; database.RootGroup.Notes = testRootGroupNotes; database.RootGroup.DefaultAutoTypeSequence = testRootGroupDefaultAutoTypeSequence; database.RootGroup.CreationTime = date; database.RootGroup.LastModificationTime = date; database.RootGroup.LastAccessTime = date; database.RootGroup.ExpiryTime = date; database.RootGroup.LocationChanged = date; var file = new KdbxFile(database); file.Save(ms, null, KdbxFormat.PlainXml, null); } var fileContents = Encoding.UTF8.GetString(buffer).Replace("\0", ""); if (typeof(KdbxFile).Namespace.StartsWith("KeePassLib.") && Environment.OSVersion.Platform != PlatformID.Win32NT) { // Upstream KeePassLib does not specify line endings for XmlTextWriter, // so it uses native line endings. fileContents = fileContents.Replace("\n", "\r\n"); } Assert.That(fileContents, Is.EqualTo(testDatabase)); } [Test] public void TestSearch() { var database = new PwDatabase(); using (var ms = new MemoryStream(Encoding.UTF8.GetBytes(testDatabase))) { var file = new KdbxFile(database); file.Load(ms, KdbxFormat.PlainXml, null); } var sp = new SearchParameters() { SearchString = "sfsoiwsefsi" }; var listStorage = new PwObjectList(); database.RootGroup.SearchEntries(sp, listStorage); Assert.AreEqual(0U, listStorage.UCount); var entry = new PwEntry(true, true); entry.Strings.Set("Title", new ProtectedString(false, "NaMe")); database.RootGroup.AddEntry(entry, true); sp.SearchString = "name"; database.RootGroup.SearchEntries(sp, listStorage); Assert.AreEqual(1U, listStorage.UCount); } } }