using System; using Windows.Storage; using Windows.UI.Xaml; using ModernKeePass.ViewModels; using ModernKeePassLib; using ModernKeePassLib.Interfaces; using ModernKeePassLib.Keys; using ModernKeePassLib.Serialization; namespace ModernKeePass.Common { public class DatabaseHelper { public enum DatabaseStatus { Closed = 0, Opening = 1, Opened = 2 } private readonly PwDatabase _pwDatabase = new PwDatabase(); private StorageFile _databaseFile; private GroupVm _recycleBin; public GroupVm RootGroup { get; set; } public GroupVm RecycleBin { get { return _recycleBin; } set { _recycleBin = value; _pwDatabase.RecycleBinUuid = _recycleBin.IdUuid; } } public DatabaseStatus Status { get; private set; } = DatabaseStatus.Closed; public string Name => DatabaseFile?.Name; public bool RecycleBinEnabled { get { return _pwDatabase.RecycleBinEnabled; } set { _pwDatabase.RecycleBinEnabled = value; } } public StorageFile DatabaseFile { get { return _databaseFile; } set { _databaseFile = value; Status = DatabaseStatus.Opening; } } /// /// Open a KeePass database /// /// The database password /// True to create a new database before opening it /// An error message, if any public string Open(string password, bool createNew = false) { var key = new CompositeKey(); try { key.AddUserKey(new KcpPassword(password)); var ioConnection = IOConnectionInfo.FromFile(DatabaseFile); if (createNew) _pwDatabase.New(ioConnection, key); else _pwDatabase.Open(ioConnection, key, new NullStatusLogger()); if (_pwDatabase.IsOpen) { Status = DatabaseStatus.Opened; RootGroup = new GroupVm(_pwDatabase.RootGroup, null, RecycleBinEnabled ? _pwDatabase.RecycleBinUuid : null); } } catch (ArgumentNullException) { return "Password cannot be empty"; } catch (InvalidCompositeKeyException) { return "Wrong password"; } catch (Exception ex) { return ex.Message; } return string.Empty; } /// /// Save the current database to another file and open it /// /// The new database file internal void Save(StorageFile file) { DatabaseFile = file; _pwDatabase.SaveAs(IOConnectionInfo.FromFile(DatabaseFile), true, new NullStatusLogger()); Status = DatabaseStatus.Opened; } /// /// Commit the changes to the currently opened database to file /// public void Save() { if (_pwDatabase == null || !_pwDatabase.IsOpen) return; // Commit real changes to DB /*var app = (App) Application.Current; foreach (var entity in app.PendingDeleteEntities) { entity.Value.CommitDelete(); } app.PendingDeleteEntities.Clear();*/ _pwDatabase.Save(new NullStatusLogger()); } /// /// Close the currently opened database /// public void Close() { _pwDatabase?.Close(); Status = DatabaseStatus.Closed; } public void AddDeletedItem(PwUuid id) { _pwDatabase.DeletedObjects.Add(new PwDeletedObject(id, DateTime.UtcNow)); } } }