using System; using System.Drawing; using System.Globalization; using System.IO; using System.Text; using ModernKeePassLib.Keys; using ModernKeePassLib.Security; using ModernKeePassLib.Serialization; using ModernKeePassLib.Collections; using NUnit.Framework; namespace ModernKeePassLib.Test.Serialization { [TestFixture] public class KdbxFileTests { private const string TestLocalizedAppName = "My Localized App Name"; private const string TestDatabaseName = "My Database Name"; private const string TestDatabaseDescription = "My Database Description"; private const string TestDefaultUserName = "My Default User Name"; private const string TestColor = "#FF0000"; // Red private const string TestRootGroupName = "My Root Group Name"; private const string TestRootGroupNotes = "My Root Group Notes"; private const string TestRootGroupDefaultAutoTypeSequence = "My Root Group Default Auto Type Sequence"; private 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\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" + ""; private 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.True(database.CustomIcons.Count == 0); } [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, 0, buffer.Length).Replace("\0", ""); if (typeof(KdbxFile).Namespace.StartsWith("KeePassLib.")) { // Upstream KeePassLib does not specify line endings for XmlTextWriter, // so it uses native line endings. fileContents = fileContents.Replace("\n", "\r\n"); } Assert.That(TestDatabase, Is.EqualTo(fileContents)); } [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.That(listStorage.UCount, Is.EqualTo(0U)); 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.That(listStorage.UCount, Is.EqualTo(1U)); } } }