< Summary

Information
Class: LOCKnet.Data.Repositories.MasterKeyRepository
Assembly: LOCKnet.Data
File(s): /home/runner/work/LOCKnet/LOCKnet/src/LOCKnet.Data/Repositories/MasterKeyRepository.cs
Line coverage
100%
Covered lines: 102
Uncovered lines: 0
Coverable lines: 102
Total lines: 139
Line coverage: 100%
Branch coverage
80%
Covered branches: 55
Total branches: 68
Branch coverage: 80.8%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.ctor(...)100%11100%
.ctor(...)100%11100%
Create(...)95%2020100%
Get()66.66%3030100%
Update(...)88.88%1818100%
Delete()100%11100%

File(s)

/home/runner/work/LOCKnet/LOCKnet/src/LOCKnet.Data/Repositories/MasterKeyRepository.cs

#LineLine coverage
 1using LOCKnet.Core.DataAbstractions;
 2using Microsoft.Data.Sqlite;
 3
 4namespace LOCKnet.Data.Repositories;
 5
 6/// <summary>
 7/// SQLite-Implementierung von <see cref="IMasterKeyRepository"/>.
 8/// Persistiert einen einzelnen Vault-Header in der bestehenden MasterKey-Tabelle (Id = 1).
 9/// </summary>
 10public class MasterKeyRepository : RepositoryBase, IMasterKeyRepository
 11{
 12  /// <summary>Initialisiert eine neue Instanz von <see cref="MasterKeyRepository"/>.</summary>
 13  /// <param name="connectionString">Der vollständige SQLite-Connection-String.</param>
 9914  public MasterKeyRepository(string connectionString) : base(connectionString) { }
 15
 16  /// <summary>Initialisiert eine neue Instanz von <see cref="MasterKeyRepository"/>.</summary>
 17  /// <param name="connectionFactory">Factory fuer Storage-spezifische SQLite-Verbindungen.</param>
 28218  public MasterKeyRepository(ISqliteConnectionFactory connectionFactory) : base(connectionFactory) { }
 19
 20  #region IMasterKeyRepository
 21
 22  /// <inheritdoc/>
 23  /// <exception cref="InvalidOperationException">Vault-Header existiert bereits.</exception>
 24  public void Create(VaultHeader header)
 8525  {
 8526    if (Get() != null)
 127      throw new InvalidOperationException("Vault header already exists.");
 28
 8429    using var conn = GetConnection();
 8430    using var cmd = conn.CreateCommand();
 8431    cmd.CommandText = @"
 8432              INSERT INTO MasterKey (Id, PasswordHash, FormatVersion, KdfIdentifier, KdfParameters, Salt, WrappedVaultKe
 8433              VALUES (1, $hash, $formatVersion, $kdfIdentifier, $kdfParameters, $salt, $wrappedVaultKey, $usesLegacyKeyM
 8434    cmd.Parameters.AddWithValue("$hash", header.LegacyPasswordHash);
 8435    cmd.Parameters.AddWithValue("$formatVersion", header.FormatVersion);
 8436    cmd.Parameters.AddWithValue("$kdfIdentifier", header.KdfIdentifier);
 8437    cmd.Parameters.AddWithValue("$kdfParameters", header.KdfParameters.Serialize());
 8438    cmd.Parameters.AddWithValue("$salt", header.Salt);
 8439    cmd.Parameters.AddWithValue("$wrappedVaultKey", (object?)header.WrappedVaultKey ?? DBNull.Value);
 8440    cmd.Parameters.AddWithValue("$usesLegacyKeyMaterial", header.UsesLegacyKeyMaterial ? 1 : 0);
 8441    cmd.Parameters.AddWithValue("$requiresStorageCompaction", header.RequiresStorageCompaction ? 1 : 0);
 8442    cmd.Parameters.AddWithValue("$lastStorageCompactionAttemptUtc", (object?)header.LastStorageCompactionAttemptUtc?.ToS
 8443    cmd.Parameters.AddWithValue("$lastStorageCompactionFailureKind", (int)header.LastStorageCompactionFailureKind);
 8444    cmd.Parameters.AddWithValue("$lastStorageCompactionError", (object?)header.LastStorageCompactionError ?? DBNull.Valu
 8445    cmd.Parameters.AddWithValue("$storageMigrationState", (int)header.StorageMigrationState);
 8446    cmd.Parameters.AddWithValue("$storageMigrationTargetMode", (int)header.StorageMigrationTargetMode);
 8447    cmd.Parameters.AddWithValue("$lastStorageMigrationAttemptUtc", (object?)header.LastStorageMigrationAttemptUtc?.ToStr
 8448    cmd.Parameters.AddWithValue("$lastStorageMigrationError", (object?)header.LastStorageMigrationError ?? DBNull.Value)
 8449    cmd.ExecuteNonQuery();
 16850  }
 51
 52  /// <inheritdoc/>
 53  public VaultHeader? Get()
 29254  {
 29255    using var conn = GetConnection();
 29256    using var cmd = conn.CreateCommand();
 29257    cmd.CommandText = "SELECT PasswordHash, FormatVersion, KdfIdentifier, KdfParameters, Salt, WrappedVaultKey, UsesLega
 58
 29259    using var reader = cmd.ExecuteReader();
 29260    if (!reader.Read())
 16661      return null;
 62
 12663    return new VaultHeader
 12664    {
 12665      LegacyPasswordHash = reader.IsDBNull(0) ? [] : (byte[])reader[0],
 12666      FormatVersion = reader.IsDBNull(1) ? 1 : reader.GetInt32(1),
 12667      KdfIdentifier = reader.IsDBNull(2) ? "PBKDF2-SHA256" : reader.GetString(2),
 12668      KdfParameters = reader.IsDBNull(3)
 12669        ? new VaultKdfParameters()
 12670        : VaultKdfParameters.Deserialize(reader.GetString(3)),
 12671      Salt = (byte[])reader[4],
 12672      WrappedVaultKey = reader.IsDBNull(5) ? [] : (byte[])reader[5],
 12673      UsesLegacyKeyMaterial = !reader.IsDBNull(6) && reader.GetInt32(6) != 0,
 12674      RequiresStorageCompaction = !reader.IsDBNull(7) && reader.GetInt32(7) != 0,
 12675      LastStorageCompactionAttemptUtc = reader.IsDBNull(8) ? null : DateTime.Parse(reader.GetString(8), null, System.Glo
 12676      LastStorageCompactionFailureKind = reader.IsDBNull(9) ? StorageCompactionFailureKind.None : (StorageCompactionFail
 12677      LastStorageCompactionError = reader.IsDBNull(10) ? null : reader.GetString(10),
 12678      StorageMigrationState = reader.IsDBNull(11) ? VaultStorageMigrationState.None : (VaultStorageMigrationState)reader
 12679      StorageMigrationTargetMode = reader.IsDBNull(12) ? VaultStorageMigrationTargetMode.None : (VaultStorageMigrationTa
 12680      LastStorageMigrationAttemptUtc = reader.IsDBNull(13) ? null : DateTime.Parse(reader.GetString(13), null, System.Gl
 12681      LastStorageMigrationError = reader.IsDBNull(14) ? null : reader.GetString(14),
 12682      CreatedAt = reader.GetDateTime(15),
 12683      UpdatedAt = reader.GetDateTime(16),
 12684    };
 29285  }
 86
 87  /// <inheritdoc/>
 88  public void Update(VaultHeader header)
 2389  {
 2390    using var conn = GetConnection();
 2391    using var cmd = conn.CreateCommand();
 2392    cmd.CommandText = @"
 2393              UPDATE MasterKey
 2394              SET PasswordHash = $hash,
 2395                  FormatVersion = $formatVersion,
 2396                  KdfIdentifier = $kdfIdentifier,
 2397                  KdfParameters = $kdfParameters,
 2398                  Salt = $salt,
 2399                  WrappedVaultKey = $wrappedVaultKey,
 23100                  UsesLegacyKeyMaterial = $usesLegacyKeyMaterial,
 23101                  RequiresStorageCompaction = $requiresStorageCompaction,
 23102                  LastStorageCompactionAttemptUtc = $lastStorageCompactionAttemptUtc,
 23103                  LastStorageCompactionFailureKind = $lastStorageCompactionFailureKind,
 23104                  LastStorageCompactionError = $lastStorageCompactionError,
 23105                  StorageMigrationState = $storageMigrationState,
 23106                  StorageMigrationTargetMode = $storageMigrationTargetMode,
 23107                  LastStorageMigrationAttemptUtc = $lastStorageMigrationAttemptUtc,
 23108                  LastStorageMigrationError = $lastStorageMigrationError,
 23109                  UpdatedAt = CURRENT_TIMESTAMP
 23110              WHERE Id = 1;";
 23111    cmd.Parameters.AddWithValue("$hash", header.LegacyPasswordHash);
 23112    cmd.Parameters.AddWithValue("$formatVersion", header.FormatVersion);
 23113    cmd.Parameters.AddWithValue("$kdfIdentifier", header.KdfIdentifier);
 23114    cmd.Parameters.AddWithValue("$kdfParameters", header.KdfParameters.Serialize());
 23115    cmd.Parameters.AddWithValue("$salt", header.Salt);
 23116    cmd.Parameters.AddWithValue("$wrappedVaultKey", (object?)header.WrappedVaultKey ?? DBNull.Value);
 23117    cmd.Parameters.AddWithValue("$usesLegacyKeyMaterial", header.UsesLegacyKeyMaterial ? 1 : 0);
 23118    cmd.Parameters.AddWithValue("$requiresStorageCompaction", header.RequiresStorageCompaction ? 1 : 0);
 23119    cmd.Parameters.AddWithValue("$lastStorageCompactionAttemptUtc", (object?)header.LastStorageCompactionAttemptUtc?.ToS
 23120    cmd.Parameters.AddWithValue("$lastStorageCompactionFailureKind", (int)header.LastStorageCompactionFailureKind);
 23121    cmd.Parameters.AddWithValue("$lastStorageCompactionError", (object?)header.LastStorageCompactionError ?? DBNull.Valu
 23122    cmd.Parameters.AddWithValue("$storageMigrationState", (int)header.StorageMigrationState);
 23123    cmd.Parameters.AddWithValue("$storageMigrationTargetMode", (int)header.StorageMigrationTargetMode);
 23124    cmd.Parameters.AddWithValue("$lastStorageMigrationAttemptUtc", (object?)header.LastStorageMigrationAttemptUtc?.ToStr
 23125    cmd.Parameters.AddWithValue("$lastStorageMigrationError", (object?)header.LastStorageMigrationError ?? DBNull.Value)
 23126    cmd.ExecuteNonQuery();
 46127  }
 128
 129  /// <inheritdoc/>
 130  public void Delete()
 3131  {
 3132    using var conn = GetConnection();
 3133    using var cmd = conn.CreateCommand();
 3134    cmd.CommandText = "DELETE FROM MasterKey WHERE Id = 1;";
 3135    cmd.ExecuteNonQuery();
 6136  }
 137
 138  #endregion
 139}