using NUnit.Framework; using System; using System.Globalization; using System.IO; using System.Text; using ModernKeePassLib.Keys; using ModernKeePassLib.Security; using ModernKeePassLib.Serialization; using ModernKeePassLib.Collections; namespace ModernKeePassLib.Test.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\t2017-10-23T08:03:55Z\r\n" + "\t\t" + TestDatabaseDescription + "\r\n" + "\t\t2017-10-23T08:03:55Z\r\n" + "\t\t" + TestDefaultUserName + "\r\n" + "\t\t2017-10-23T08:03:55Z\r\n" + "\t\t365\r\n" + //"\t\t" + testColor + "\r\n" + "\t\t\r\n" + "\t\t2017-10-23T08:03:55Z\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\t2017-10-23T08:03:55Z\r\n" + "\t\tAAAAAAAAAAAAAAAAAAAAAA==\r\n" + "\t\t2017-10-23T08:03:55Z\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\t2017-10-23T08:03:55Z\r\n" + "\t\t\t\t2017-10-23T08:03:55Z\r\n" + "\t\t\t\t2017-10-23T08:03:55Z\r\n" + "\t\t\t\t2017-10-23T08:03:55Z\r\n" + "\t\t\t\tFalse\r\n" + "\t\t\t\t0\r\n" + "\t\t\t\t2017-10-23T08:03:55Z\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 = "2017-10-23T08:03:55Z"; [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, CultureInfo.CurrentCulture, DateTimeStyles.AdjustToUniversal); //var date = DateTime.UtcNow; 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); } } }