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