diff --git a/VaultCommander/Migrations/20250310143909_KeeperSdk110.Designer.cs b/VaultCommander/Migrations/20250310143909_KeeperSdk110.Designer.cs
new file mode 100644
index 0000000..63f1cb9
--- /dev/null
+++ b/VaultCommander/Migrations/20250310143909_KeeperSdk110.Designer.cs
@@ -0,0 +1,350 @@
+//
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using VaultCommander.Vaults;
+
+#nullable disable
+
+namespace VaultCommander.Migrations
+{
+ [DbContext(typeof(KeeperVault.KeeperStorage))]
+ [Migration("20250310143909_KeeperSdk110")]
+ partial class KeeperSdk110
+ {
+ ///
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder.HasAnnotation("ProductVersion", "8.0.13");
+
+ modelBuilder.Entity("VaultCommander.Vaults.KeeperVault+KeeperStorage+EnterpriseTeamEntity", b =>
+ {
+ b.Property("PersonalScopeUid")
+ .HasColumnType("TEXT");
+
+ b.Property("Uid")
+ .HasColumnType("TEXT");
+
+ b.Property("KeyType")
+ .HasColumnType("INTEGER");
+
+ b.Property("Name")
+ .HasColumnType("TEXT");
+
+ b.Property("RestrictEdit")
+ .HasColumnType("INTEGER");
+
+ b.Property("RestrictShare")
+ .HasColumnType("INTEGER");
+
+ b.Property("RestrictView")
+ .HasColumnType("INTEGER");
+
+ b.Property("TeamEcPrivateKey")
+ .HasColumnType("TEXT");
+
+ b.Property("TeamKey")
+ .HasColumnType("TEXT");
+
+ b.Property("TeamRsaPrivateKey")
+ .HasColumnType("TEXT");
+
+ b.HasKey("PersonalScopeUid", "Uid");
+
+ b.ToTable("teams");
+ });
+
+ modelBuilder.Entity("VaultCommander.Vaults.KeeperVault+KeeperStorage+FolderEntity", b =>
+ {
+ b.Property("PersonalScopeUid")
+ .HasColumnType("TEXT");
+
+ b.Property("Uid")
+ .HasColumnType("TEXT");
+
+ b.Property("Data")
+ .HasColumnType("TEXT");
+
+ b.Property("FolderKey")
+ .HasColumnType("TEXT");
+
+ b.Property("FolderType")
+ .HasColumnType("TEXT");
+
+ b.Property("ParentUid")
+ .HasColumnType("TEXT");
+
+ b.Property("Revision")
+ .HasColumnType("INTEGER");
+
+ b.Property("SharedFolderUid")
+ .HasColumnType("TEXT");
+
+ b.HasKey("PersonalScopeUid", "Uid");
+
+ b.ToTable("folders");
+ });
+
+ modelBuilder.Entity("VaultCommander.Vaults.KeeperVault+KeeperStorage+FolderRecordLinkEntity", b =>
+ {
+ b.Property("PersonalScopeUid")
+ .HasColumnType("TEXT");
+
+ b.Property("SubjectUid")
+ .HasColumnType("TEXT");
+
+ b.Property("ObjectUid")
+ .HasColumnType("TEXT");
+
+ b.HasKey("PersonalScopeUid", "SubjectUid", "ObjectUid");
+
+ b.ToTable("folderRecords");
+ });
+
+ modelBuilder.Entity("VaultCommander.Vaults.KeeperVault+KeeperStorage+NonSharedDataEntity", b =>
+ {
+ b.Property("PersonalScopeUid")
+ .HasColumnType("TEXT");
+
+ b.Property("Uid")
+ .HasColumnType("TEXT");
+
+ b.Property("Data")
+ .HasColumnType("TEXT");
+
+ b.HasKey("PersonalScopeUid", "Uid");
+
+ b.ToTable("nonSharedData");
+ });
+
+ modelBuilder.Entity("VaultCommander.Vaults.KeeperVault+KeeperStorage+RecordEntity", b =>
+ {
+ b.Property("PersonalScopeUid")
+ .HasColumnType("TEXT");
+
+ b.Property("Uid")
+ .HasColumnType("TEXT");
+
+ b.Property("ClientModifiedTime")
+ .HasColumnType("INTEGER");
+
+ b.Property("Data")
+ .HasColumnType("TEXT");
+
+ b.Property("Extra")
+ .HasColumnType("TEXT");
+
+ b.Property("Revision")
+ .HasColumnType("INTEGER");
+
+ b.Property("Shared")
+ .HasColumnType("INTEGER");
+
+ b.Property("Udata")
+ .HasColumnType("TEXT");
+
+ b.Property("Version")
+ .HasColumnType("INTEGER");
+
+ b.HasKey("PersonalScopeUid", "Uid");
+
+ b.ToTable("records");
+ });
+
+ modelBuilder.Entity("VaultCommander.Vaults.KeeperVault+KeeperStorage+RecordMetadataEntity", b =>
+ {
+ b.Property("PersonalScopeUid")
+ .HasColumnType("TEXT");
+
+ b.Property("SubjectUid")
+ .HasColumnType("TEXT");
+
+ b.Property("ObjectUid")
+ .HasColumnType("TEXT");
+
+ b.Property("CanEdit")
+ .HasColumnType("INTEGER");
+
+ b.Property("CanShare")
+ .HasColumnType("INTEGER");
+
+ b.Property("Expiration")
+ .HasColumnType("INTEGER");
+
+ b.Property("Owner")
+ .HasColumnType("INTEGER");
+
+ b.Property("OwnerAccountUid")
+ .HasColumnType("TEXT");
+
+ b.Property("RecordKey")
+ .HasColumnType("TEXT");
+
+ b.Property("RecordKeyType")
+ .HasColumnType("INTEGER");
+
+ b.HasKey("PersonalScopeUid", "SubjectUid", "ObjectUid");
+
+ b.ToTable("recordKeys");
+ });
+
+ modelBuilder.Entity("VaultCommander.Vaults.KeeperVault+KeeperStorage+RecordTypeEntity", b =>
+ {
+ b.Property("PersonalScopeUid")
+ .HasColumnType("TEXT");
+
+ b.Property("Uid")
+ .HasColumnType("TEXT");
+
+ b.Property("Content")
+ .HasColumnType("TEXT");
+
+ b.Property("Name")
+ .HasColumnType("TEXT");
+
+ b.Property("RecordTypeId")
+ .HasColumnType("INTEGER");
+
+ b.Property("Scope")
+ .HasColumnType("INTEGER");
+
+ b.HasKey("PersonalScopeUid", "Uid");
+
+ b.ToTable("recordTypes");
+ });
+
+ modelBuilder.Entity("VaultCommander.Vaults.KeeperVault+KeeperStorage+SharedFolderEntity", b =>
+ {
+ b.Property("PersonalScopeUid")
+ .HasColumnType("TEXT");
+
+ b.Property("Uid")
+ .HasColumnType("TEXT");
+
+ b.Property("Data")
+ .HasColumnType("TEXT");
+
+ b.Property("DefaultCanEdit")
+ .HasColumnType("INTEGER");
+
+ b.Property("DefaultCanShare")
+ .HasColumnType("INTEGER");
+
+ b.Property("DefaultManageRecords")
+ .HasColumnType("INTEGER");
+
+ b.Property("DefaultManageUsers")
+ .HasColumnType("INTEGER");
+
+ b.Property("Name")
+ .HasColumnType("TEXT");
+
+ b.Property("OwnerAccountUid")
+ .HasColumnType("TEXT");
+
+ b.Property("Revision")
+ .HasColumnType("INTEGER");
+
+ b.HasKey("PersonalScopeUid", "Uid");
+
+ b.ToTable("sharedFolders");
+ });
+
+ modelBuilder.Entity("VaultCommander.Vaults.KeeperVault+KeeperStorage+SharedFolderKeyEntity", b =>
+ {
+ b.Property("PersonalScopeUid")
+ .HasColumnType("TEXT");
+
+ b.Property("SubjectUid")
+ .HasColumnType("TEXT");
+
+ b.Property("ObjectUid")
+ .HasColumnType("TEXT");
+
+ b.Property("KeyType")
+ .HasColumnType("INTEGER");
+
+ b.Property("SharedFolderKey")
+ .HasColumnType("TEXT");
+
+ b.HasKey("PersonalScopeUid", "SubjectUid", "ObjectUid");
+
+ b.ToTable("sharedFolderKeys");
+ });
+
+ modelBuilder.Entity("VaultCommander.Vaults.KeeperVault+KeeperStorage+SharedFolderPermissionEntity", b =>
+ {
+ b.Property("PersonalScopeUid")
+ .HasColumnType("TEXT");
+
+ b.Property("SubjectUid")
+ .HasColumnType("TEXT");
+
+ b.Property("ObjectUid")
+ .HasColumnType("TEXT");
+
+ b.Property("Expiration")
+ .HasColumnType("INTEGER");
+
+ b.Property("ManageRecords")
+ .HasColumnType("INTEGER");
+
+ b.Property("ManageUsers")
+ .HasColumnType("INTEGER");
+
+ b.Property("UserType")
+ .HasColumnType("INTEGER");
+
+ b.HasKey("PersonalScopeUid", "SubjectUid", "ObjectUid");
+
+ b.ToTable("sharedFolderPermissions");
+ });
+
+ modelBuilder.Entity("VaultCommander.Vaults.KeeperVault+KeeperStorage+StorageUserEmailEntity", b =>
+ {
+ b.Property("PersonalScopeUid")
+ .HasColumnType("TEXT");
+
+ b.Property("SubjectUid")
+ .HasColumnType("TEXT");
+
+ b.Property("ObjectUid")
+ .HasColumnType("TEXT");
+
+ b.HasKey("PersonalScopeUid", "SubjectUid", "ObjectUid");
+
+ b.ToTable("userEmails");
+ });
+
+ modelBuilder.Entity("VaultCommander.Vaults.KeeperVault+KeeperStorage+UserStorage", b =>
+ {
+ b.Property("PersonalScopeUid")
+ .HasColumnType("TEXT");
+
+ b.Property("Revision")
+ .HasColumnType("INTEGER");
+
+ b.HasKey("PersonalScopeUid");
+
+ b.ToTable("userStorage");
+ });
+
+ modelBuilder.Entity("VaultCommander.Vaults.KeeperVault+KeeperStorage+VaultSettingsEntity", b =>
+ {
+ b.Property("PersonalScopeUid")
+ .HasColumnType("TEXT");
+
+ b.Property("SyncDownToken")
+ .IsRequired()
+ .HasColumnType("BLOB");
+
+ b.HasKey("PersonalScopeUid");
+
+ b.ToTable("vaultSettings");
+ });
+#pragma warning restore 612, 618
+ }
+ }
+}
diff --git a/VaultCommander/Migrations/20250310143909_KeeperSdk110.cs b/VaultCommander/Migrations/20250310143909_KeeperSdk110.cs
new file mode 100644
index 0000000..675b68b
--- /dev/null
+++ b/VaultCommander/Migrations/20250310143909_KeeperSdk110.cs
@@ -0,0 +1,298 @@
+using Microsoft.EntityFrameworkCore.Migrations;
+
+#nullable disable
+
+namespace VaultCommander.Migrations
+{
+ ///
+ public partial class KeeperSdk110 : Migration
+ {
+ ///
+ protected override void Up(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.DropTable(
+ name: "folderRecords");
+
+ migrationBuilder.DropTable(
+ name: "folders");
+
+ migrationBuilder.DropTable(
+ name: "nonSharedData");
+
+ migrationBuilder.DropTable(
+ name: "recordKeys");
+
+ migrationBuilder.DropTable(
+ name: "records");
+
+ migrationBuilder.DropTable(
+ name: "recordTypes");
+
+ migrationBuilder.DropTable(
+ name: "sharedFolderKeys");
+
+ migrationBuilder.DropTable(
+ name: "sharedFolderPermissions");
+
+ migrationBuilder.DropTable(
+ name: "sharedFolders");
+
+ migrationBuilder.DropTable(
+ name: "teams");
+
+ migrationBuilder.DropTable(
+ name: "userStorage");
+
+ migrationBuilder.CreateTable(
+ name: "folderRecords",
+ columns: table => new
+ {
+ PersonalScopeUid = table.Column(type: "TEXT", nullable: false),
+ SubjectUid = table.Column(type: "TEXT", nullable: false),
+ ObjectUid = table.Column(type: "TEXT", nullable: false)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_folderRecords", x => new { x.PersonalScopeUid, x.SubjectUid, x.ObjectUid });
+ });
+
+ migrationBuilder.CreateTable(
+ name: "folders",
+ columns: table => new
+ {
+ PersonalScopeUid = table.Column(type: "TEXT", nullable: false),
+ Uid = table.Column(type: "TEXT", nullable: false),
+ ParentUid = table.Column(type: "TEXT", nullable: true),
+ FolderType = table.Column(type: "TEXT", nullable: true),
+ FolderKey = table.Column(type: "TEXT", nullable: true),
+ SharedFolderUid = table.Column(type: "TEXT", nullable: true),
+ Revision = table.Column(type: "INTEGER", nullable: false),
+ Data = table.Column(type: "TEXT", nullable: true)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_folders", x => new { x.PersonalScopeUid, x.Uid });
+ });
+
+ migrationBuilder.CreateTable(
+ name: "nonSharedData",
+ columns: table => new
+ {
+ PersonalScopeUid = table.Column(type: "TEXT", nullable: false),
+ Uid = table.Column(type: "TEXT", nullable: false),
+ Data = table.Column(type: "TEXT", nullable: true)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_nonSharedData", x => new { x.PersonalScopeUid, x.Uid });
+ });
+
+ migrationBuilder.CreateTable(
+ name: "recordKeys",
+ columns: table => new
+ {
+ PersonalScopeUid = table.Column(type: "TEXT", nullable: false),
+ SubjectUid = table.Column(type: "TEXT", nullable: false),
+ ObjectUid = table.Column(type: "TEXT", nullable: false),
+ RecordKey = table.Column(type: "TEXT", nullable: true),
+ RecordKeyType = table.Column(type: "INTEGER", nullable: false),
+ CanShare = table.Column(type: "INTEGER", nullable: false),
+ CanEdit = table.Column(type: "INTEGER", nullable: false),
+ Owner = table.Column(type: "INTEGER", nullable: false),
+ OwnerAccountUid = table.Column(type: "TEXT", nullable: true),
+ Expiration = table.Column(type: "INTEGER", nullable: false)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_recordKeys", x => new { x.PersonalScopeUid, x.SubjectUid, x.ObjectUid });
+ });
+
+ migrationBuilder.CreateTable(
+ name: "records",
+ columns: table => new
+ {
+ PersonalScopeUid = table.Column(type: "TEXT", nullable: false),
+ Uid = table.Column(type: "TEXT", nullable: false),
+ Revision = table.Column(type: "INTEGER", nullable: false),
+ Version = table.Column(type: "INTEGER", nullable: false),
+ ClientModifiedTime = table.Column(type: "INTEGER", nullable: false),
+ Data = table.Column(type: "TEXT", nullable: true),
+ Extra = table.Column(type: "TEXT", nullable: true),
+ Udata = table.Column(type: "TEXT", nullable: true),
+ Shared = table.Column(type: "INTEGER", nullable: false)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_records", x => new { x.PersonalScopeUid, x.Uid });
+ });
+
+ migrationBuilder.CreateTable(
+ name: "recordTypes",
+ columns: table => new
+ {
+ PersonalScopeUid = table.Column(type: "TEXT", nullable: false),
+ Uid = table.Column(type: "TEXT", nullable: false),
+ Name = table.Column(type: "TEXT", nullable: true),
+ RecordTypeId = table.Column(type: "INTEGER", nullable: false),
+ Scope = table.Column(type: "INTEGER", nullable: false),
+ Content = table.Column(type: "TEXT", nullable: true)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_recordTypes", x => new { x.PersonalScopeUid, x.Uid });
+ });
+
+ migrationBuilder.CreateTable(
+ name: "sharedFolderKeys",
+ columns: table => new
+ {
+ PersonalScopeUid = table.Column(type: "TEXT", nullable: false),
+ SubjectUid = table.Column(type: "TEXT", nullable: false),
+ ObjectUid = table.Column(type: "TEXT", nullable: false),
+ KeyType = table.Column(type: "INTEGER", nullable: false),
+ SharedFolderKey = table.Column(type: "TEXT", nullable: true)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_sharedFolderKeys", x => new { x.PersonalScopeUid, x.SubjectUid, x.ObjectUid });
+ });
+
+ migrationBuilder.CreateTable(
+ name: "sharedFolderPermissions",
+ columns: table => new
+ {
+ PersonalScopeUid = table.Column(type: "TEXT", nullable: false),
+ SubjectUid = table.Column(type: "TEXT", nullable: false),
+ ObjectUid = table.Column(type: "TEXT", nullable: false),
+ UserType = table.Column(type: "INTEGER", nullable: false),
+ ManageRecords = table.Column(type: "INTEGER", nullable: false),
+ ManageUsers = table.Column(type: "INTEGER", nullable: false),
+ Expiration = table.Column(type: "INTEGER", nullable: false)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_sharedFolderPermissions", x => new { x.PersonalScopeUid, x.SubjectUid, x.ObjectUid });
+ });
+
+ migrationBuilder.CreateTable(
+ name: "sharedFolders",
+ columns: table => new
+ {
+ PersonalScopeUid = table.Column(type: "TEXT", nullable: false),
+ Uid = table.Column(type: "TEXT", nullable: false),
+ Revision = table.Column(type: "INTEGER", nullable: false),
+ Name = table.Column(type: "TEXT", nullable: true),
+ Data = table.Column(type: "TEXT", nullable: true),
+ DefaultManageRecords = table.Column(type: "INTEGER", nullable: false),
+ DefaultManageUsers = table.Column(type: "INTEGER", nullable: false),
+ DefaultCanEdit = table.Column(type: "INTEGER", nullable: false),
+ DefaultCanShare = table.Column(type: "INTEGER", nullable: false),
+ OwnerAccountUid = table.Column(type: "TEXT", nullable: true)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_sharedFolders", x => new { x.PersonalScopeUid, x.Uid });
+ });
+
+ migrationBuilder.CreateTable(
+ name: "teams",
+ columns: table => new
+ {
+ PersonalScopeUid = table.Column(type: "TEXT", nullable: false),
+ Uid = table.Column(type: "TEXT", nullable: false),
+ Name = table.Column(type: "TEXT", nullable: true),
+ TeamKey = table.Column(type: "TEXT", nullable: true),
+ KeyType = table.Column(type: "INTEGER", nullable: false),
+ TeamRsaPrivateKey = table.Column(type: "TEXT", nullable: true),
+ TeamEcPrivateKey = table.Column(type: "TEXT", nullable: true),
+ RestrictEdit = table.Column(type: "INTEGER", nullable: false),
+ RestrictShare = table.Column(type: "INTEGER", nullable: false),
+ RestrictView = table.Column(type: "INTEGER", nullable: false)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_teams", x => new { x.PersonalScopeUid, x.Uid });
+ });
+
+ migrationBuilder.CreateTable(
+ name: "userEmails",
+ columns: table => new
+ {
+ PersonalScopeUid = table.Column(type: "TEXT", nullable: false),
+ SubjectUid = table.Column(type: "TEXT", nullable: false),
+ ObjectUid = table.Column(type: "TEXT", nullable: false)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_userEmails", x => new { x.PersonalScopeUid, x.SubjectUid, x.ObjectUid });
+ });
+
+ migrationBuilder.CreateTable(
+ name: "userStorage",
+ columns: table => new
+ {
+ PersonalScopeUid = table.Column(type: "TEXT", nullable: false),
+ Revision = table.Column(type: "INTEGER", nullable: false)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_userStorage", x => x.PersonalScopeUid);
+ });
+
+ migrationBuilder.CreateTable(
+ name: "vaultSettings",
+ columns: table => new
+ {
+ PersonalScopeUid = table.Column(type: "TEXT", nullable: false),
+ SyncDownToken = table.Column(type: "BLOB", nullable: false)
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_vaultSettings", x => x.PersonalScopeUid);
+ });
+ }
+
+ ///
+ protected override void Down(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.DropTable(
+ name: "folderRecords");
+
+ migrationBuilder.DropTable(
+ name: "folders");
+
+ migrationBuilder.DropTable(
+ name: "nonSharedData");
+
+ migrationBuilder.DropTable(
+ name: "recordKeys");
+
+ migrationBuilder.DropTable(
+ name: "records");
+
+ migrationBuilder.DropTable(
+ name: "recordTypes");
+
+ migrationBuilder.DropTable(
+ name: "sharedFolderKeys");
+
+ migrationBuilder.DropTable(
+ name: "sharedFolderPermissions");
+
+ migrationBuilder.DropTable(
+ name: "sharedFolders");
+
+ migrationBuilder.DropTable(
+ name: "teams");
+
+ migrationBuilder.DropTable(
+ name: "userEmails");
+
+ migrationBuilder.DropTable(
+ name: "userStorage");
+
+ migrationBuilder.DropTable(
+ name: "vaultSettings");
+ }
+ }
+}
diff --git a/VaultCommander/Migrations/KeeperStorageModelSnapshot.cs b/VaultCommander/Migrations/KeeperStorageModelSnapshot.cs
new file mode 100644
index 0000000..9ab0a30
--- /dev/null
+++ b/VaultCommander/Migrations/KeeperStorageModelSnapshot.cs
@@ -0,0 +1,347 @@
+//
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using VaultCommander.Vaults;
+
+#nullable disable
+
+namespace VaultCommander.Migrations
+{
+ [DbContext(typeof(KeeperVault.KeeperStorage))]
+ partial class KeeperStorageModelSnapshot : ModelSnapshot
+ {
+ protected override void BuildModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder.HasAnnotation("ProductVersion", "8.0.13");
+
+ modelBuilder.Entity("VaultCommander.Vaults.KeeperVault+KeeperStorage+EnterpriseTeamEntity", b =>
+ {
+ b.Property("PersonalScopeUid")
+ .HasColumnType("TEXT");
+
+ b.Property("Uid")
+ .HasColumnType("TEXT");
+
+ b.Property("KeyType")
+ .HasColumnType("INTEGER");
+
+ b.Property("Name")
+ .HasColumnType("TEXT");
+
+ b.Property("RestrictEdit")
+ .HasColumnType("INTEGER");
+
+ b.Property("RestrictShare")
+ .HasColumnType("INTEGER");
+
+ b.Property("RestrictView")
+ .HasColumnType("INTEGER");
+
+ b.Property("TeamEcPrivateKey")
+ .HasColumnType("TEXT");
+
+ b.Property("TeamKey")
+ .HasColumnType("TEXT");
+
+ b.Property("TeamRsaPrivateKey")
+ .HasColumnType("TEXT");
+
+ b.HasKey("PersonalScopeUid", "Uid");
+
+ b.ToTable("teams");
+ });
+
+ modelBuilder.Entity("VaultCommander.Vaults.KeeperVault+KeeperStorage+FolderEntity", b =>
+ {
+ b.Property("PersonalScopeUid")
+ .HasColumnType("TEXT");
+
+ b.Property("Uid")
+ .HasColumnType("TEXT");
+
+ b.Property("Data")
+ .HasColumnType("TEXT");
+
+ b.Property("FolderKey")
+ .HasColumnType("TEXT");
+
+ b.Property("FolderType")
+ .HasColumnType("TEXT");
+
+ b.Property("ParentUid")
+ .HasColumnType("TEXT");
+
+ b.Property("Revision")
+ .HasColumnType("INTEGER");
+
+ b.Property("SharedFolderUid")
+ .HasColumnType("TEXT");
+
+ b.HasKey("PersonalScopeUid", "Uid");
+
+ b.ToTable("folders");
+ });
+
+ modelBuilder.Entity("VaultCommander.Vaults.KeeperVault+KeeperStorage+FolderRecordLinkEntity", b =>
+ {
+ b.Property("PersonalScopeUid")
+ .HasColumnType("TEXT");
+
+ b.Property("SubjectUid")
+ .HasColumnType("TEXT");
+
+ b.Property("ObjectUid")
+ .HasColumnType("TEXT");
+
+ b.HasKey("PersonalScopeUid", "SubjectUid", "ObjectUid");
+
+ b.ToTable("folderRecords");
+ });
+
+ modelBuilder.Entity("VaultCommander.Vaults.KeeperVault+KeeperStorage+NonSharedDataEntity", b =>
+ {
+ b.Property("PersonalScopeUid")
+ .HasColumnType("TEXT");
+
+ b.Property("Uid")
+ .HasColumnType("TEXT");
+
+ b.Property("Data")
+ .HasColumnType("TEXT");
+
+ b.HasKey("PersonalScopeUid", "Uid");
+
+ b.ToTable("nonSharedData");
+ });
+
+ modelBuilder.Entity("VaultCommander.Vaults.KeeperVault+KeeperStorage+RecordEntity", b =>
+ {
+ b.Property("PersonalScopeUid")
+ .HasColumnType("TEXT");
+
+ b.Property("Uid")
+ .HasColumnType("TEXT");
+
+ b.Property("ClientModifiedTime")
+ .HasColumnType("INTEGER");
+
+ b.Property("Data")
+ .HasColumnType("TEXT");
+
+ b.Property("Extra")
+ .HasColumnType("TEXT");
+
+ b.Property("Revision")
+ .HasColumnType("INTEGER");
+
+ b.Property("Shared")
+ .HasColumnType("INTEGER");
+
+ b.Property("Udata")
+ .HasColumnType("TEXT");
+
+ b.Property("Version")
+ .HasColumnType("INTEGER");
+
+ b.HasKey("PersonalScopeUid", "Uid");
+
+ b.ToTable("records");
+ });
+
+ modelBuilder.Entity("VaultCommander.Vaults.KeeperVault+KeeperStorage+RecordMetadataEntity", b =>
+ {
+ b.Property("PersonalScopeUid")
+ .HasColumnType("TEXT");
+
+ b.Property("SubjectUid")
+ .HasColumnType("TEXT");
+
+ b.Property("ObjectUid")
+ .HasColumnType("TEXT");
+
+ b.Property("CanEdit")
+ .HasColumnType("INTEGER");
+
+ b.Property("CanShare")
+ .HasColumnType("INTEGER");
+
+ b.Property("Expiration")
+ .HasColumnType("INTEGER");
+
+ b.Property("Owner")
+ .HasColumnType("INTEGER");
+
+ b.Property("OwnerAccountUid")
+ .HasColumnType("TEXT");
+
+ b.Property("RecordKey")
+ .HasColumnType("TEXT");
+
+ b.Property("RecordKeyType")
+ .HasColumnType("INTEGER");
+
+ b.HasKey("PersonalScopeUid", "SubjectUid", "ObjectUid");
+
+ b.ToTable("recordKeys");
+ });
+
+ modelBuilder.Entity("VaultCommander.Vaults.KeeperVault+KeeperStorage+RecordTypeEntity", b =>
+ {
+ b.Property("PersonalScopeUid")
+ .HasColumnType("TEXT");
+
+ b.Property("Uid")
+ .HasColumnType("TEXT");
+
+ b.Property("Content")
+ .HasColumnType("TEXT");
+
+ b.Property("Name")
+ .HasColumnType("TEXT");
+
+ b.Property("RecordTypeId")
+ .HasColumnType("INTEGER");
+
+ b.Property("Scope")
+ .HasColumnType("INTEGER");
+
+ b.HasKey("PersonalScopeUid", "Uid");
+
+ b.ToTable("recordTypes");
+ });
+
+ modelBuilder.Entity("VaultCommander.Vaults.KeeperVault+KeeperStorage+SharedFolderEntity", b =>
+ {
+ b.Property("PersonalScopeUid")
+ .HasColumnType("TEXT");
+
+ b.Property("Uid")
+ .HasColumnType("TEXT");
+
+ b.Property("Data")
+ .HasColumnType("TEXT");
+
+ b.Property("DefaultCanEdit")
+ .HasColumnType("INTEGER");
+
+ b.Property("DefaultCanShare")
+ .HasColumnType("INTEGER");
+
+ b.Property("DefaultManageRecords")
+ .HasColumnType("INTEGER");
+
+ b.Property("DefaultManageUsers")
+ .HasColumnType("INTEGER");
+
+ b.Property("Name")
+ .HasColumnType("TEXT");
+
+ b.Property("OwnerAccountUid")
+ .HasColumnType("TEXT");
+
+ b.Property("Revision")
+ .HasColumnType("INTEGER");
+
+ b.HasKey("PersonalScopeUid", "Uid");
+
+ b.ToTable("sharedFolders");
+ });
+
+ modelBuilder.Entity("VaultCommander.Vaults.KeeperVault+KeeperStorage+SharedFolderKeyEntity", b =>
+ {
+ b.Property("PersonalScopeUid")
+ .HasColumnType("TEXT");
+
+ b.Property("SubjectUid")
+ .HasColumnType("TEXT");
+
+ b.Property("ObjectUid")
+ .HasColumnType("TEXT");
+
+ b.Property("KeyType")
+ .HasColumnType("INTEGER");
+
+ b.Property("SharedFolderKey")
+ .HasColumnType("TEXT");
+
+ b.HasKey("PersonalScopeUid", "SubjectUid", "ObjectUid");
+
+ b.ToTable("sharedFolderKeys");
+ });
+
+ modelBuilder.Entity("VaultCommander.Vaults.KeeperVault+KeeperStorage+SharedFolderPermissionEntity", b =>
+ {
+ b.Property("PersonalScopeUid")
+ .HasColumnType("TEXT");
+
+ b.Property("SubjectUid")
+ .HasColumnType("TEXT");
+
+ b.Property("ObjectUid")
+ .HasColumnType("TEXT");
+
+ b.Property("Expiration")
+ .HasColumnType("INTEGER");
+
+ b.Property("ManageRecords")
+ .HasColumnType("INTEGER");
+
+ b.Property("ManageUsers")
+ .HasColumnType("INTEGER");
+
+ b.Property("UserType")
+ .HasColumnType("INTEGER");
+
+ b.HasKey("PersonalScopeUid", "SubjectUid", "ObjectUid");
+
+ b.ToTable("sharedFolderPermissions");
+ });
+
+ modelBuilder.Entity("VaultCommander.Vaults.KeeperVault+KeeperStorage+StorageUserEmailEntity", b =>
+ {
+ b.Property("PersonalScopeUid")
+ .HasColumnType("TEXT");
+
+ b.Property("SubjectUid")
+ .HasColumnType("TEXT");
+
+ b.Property("ObjectUid")
+ .HasColumnType("TEXT");
+
+ b.HasKey("PersonalScopeUid", "SubjectUid", "ObjectUid");
+
+ b.ToTable("userEmails");
+ });
+
+ modelBuilder.Entity("VaultCommander.Vaults.KeeperVault+KeeperStorage+UserStorage", b =>
+ {
+ b.Property("PersonalScopeUid")
+ .HasColumnType("TEXT");
+
+ b.Property("Revision")
+ .HasColumnType("INTEGER");
+
+ b.HasKey("PersonalScopeUid");
+
+ b.ToTable("userStorage");
+ });
+
+ modelBuilder.Entity("VaultCommander.Vaults.KeeperVault+KeeperStorage+VaultSettingsEntity", b =>
+ {
+ b.Property("PersonalScopeUid")
+ .HasColumnType("TEXT");
+
+ b.Property("SyncDownToken")
+ .IsRequired()
+ .HasColumnType("BLOB");
+
+ b.HasKey("PersonalScopeUid");
+
+ b.ToTable("vaultSettings");
+ });
+#pragma warning restore 612, 618
+ }
+ }
+}
diff --git a/VaultCommander/VaultCommander.csproj b/VaultCommander/VaultCommander.csproj
index d756410..bad6995 100644
--- a/VaultCommander/VaultCommander.csproj
+++ b/VaultCommander/VaultCommander.csproj
@@ -17,11 +17,15 @@
-
-
-
-
-
+
+
+
+ all
+ runtime; build; native; contentfiles; analyzers; buildtransitive
+
+
+
+
all
runtime; build; native; contentfiles; analyzers; buildtransitive
diff --git a/VaultCommander/Vaults/KeeperVault.KeeperStorage.cs b/VaultCommander/Vaults/KeeperVault.KeeperStorage.cs
index 2d78c0b..f1e2f5b 100644
--- a/VaultCommander/Vaults/KeeperVault.KeeperStorage.cs
+++ b/VaultCommander/Vaults/KeeperVault.KeeperStorage.cs
@@ -1,16 +1,23 @@
-using KeeperSecurity.Vault;
+using Google.Protobuf.WellKnownTypes;
+using KeeperSecurity.Storage;
+using KeeperSecurity.Vault;
using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Design;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
+using Records;
using System;
using System.Collections.Generic;
+using System.Data;
using System.Diagnostics.CodeAnalysis;
using System.Linq;
+using System.Security.Cryptography;
+using System.Xml.Linq;
namespace VaultCommander.Vaults;
sealed partial class KeeperVault
{
- sealed class KeeperStorage : DbContext, IKeeperStorage
+ internal sealed class KeeperStorage : DbContext, IKeeperStorage
{
private DbSet userStorage { get; init; } = null!;
private Lazy _userStorage;
@@ -46,31 +53,37 @@ public long Revision
public IEntityStorage Records { get; }
private DbSet sharedFolders { get; init; } = null!;
- public IEntityStorage SharedFolders { get; }
+ public IEntityStorage SharedFolders { get; }
private DbSet teams { get; init; } = null!;
- public IEntityStorage Teams { get; }
+ public IEntityStorage Teams { get; }
private DbSet nonSharedData { get; init; } = null!;
- public IEntityStorage NonSharedData { get; }
+ public IEntityStorage NonSharedData { get; }
private DbSet recordKeys { get; init; } = null!;
- public IPredicateStorage RecordKeys { get; }
+ public ILinkStorage RecordKeys { get; }
- private DbSet sharedFolderKeys { get;init; } = null!;
- public IPredicateStorage SharedFolderKeys { get; }
+ private DbSet sharedFolderKeys { get; init; } = null!;
+ public ILinkStorage