-
Notifications
You must be signed in to change notification settings - Fork 19
Expand file tree
/
Copy pathVaultWriter.cs
More file actions
101 lines (85 loc) · 4.62 KB
/
VaultWriter.cs
File metadata and controls
101 lines (85 loc) · 4.62 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
using OwlCore.Storage;
using SecureFolderFS.Core.DataModels;
using SecureFolderFS.Shared.ComponentModel;
using SecureFolderFS.Shared.Extensions;
using System.IO;
using System.Threading;
using System.Threading.Tasks;
namespace SecureFolderFS.Core.VaultAccess
{
// TODO: Needs docs
public sealed class VaultWriter
{
private readonly IFolder _vaultFolder;
private readonly IAsyncSerializer<Stream> _serializer;
public VaultWriter(IFolder vaultFolder, IAsyncSerializer<Stream> serializer)
{
_vaultFolder = vaultFolder;
_serializer = serializer;
}
/// <summary>
/// Writes the keystore as the specified type.
/// </summary>
public async Task WriteKeystoreAsync<TKeystore>(TKeystore? keystoreDataModel, CancellationToken cancellationToken)
where TKeystore : class
{
var keystoreFile = keystoreDataModel is null ? null : _vaultFolder switch
{
IModifiableFolder modifiableFolder => await modifiableFolder.CreateFileAsync(Constants.Vault.Names.VAULT_KEYSTORE_FILENAME, true, cancellationToken),
_ => await _vaultFolder.GetFirstByNameAsync(Constants.Vault.Names.VAULT_KEYSTORE_FILENAME, cancellationToken) as IFile
};
await WriteDataAsync(keystoreFile, keystoreDataModel, cancellationToken);
}
public async Task WriteConfigurationAsync(VaultConfigurationDataModel? configDataModel, CancellationToken cancellationToken)
{
var configFile = configDataModel is null ? null : _vaultFolder switch
{
IModifiableFolder modifiableFolder => await modifiableFolder.CreateFileAsync(Constants.Vault.Names.VAULT_CONFIGURATION_FILENAME, true, cancellationToken),
_ => await _vaultFolder.GetFirstByNameAsync(Constants.Vault.Names.VAULT_CONFIGURATION_FILENAME, cancellationToken) as IFile
};
await WriteDataAsync(configFile, configDataModel, cancellationToken);
}
public async Task WriteV4ConfigurationAsync(V4VaultConfigurationDataModel? configDataModel, CancellationToken cancellationToken)
{
var configFile = configDataModel is null ? null : _vaultFolder switch
{
IModifiableFolder modifiableFolder => await modifiableFolder.CreateFileAsync(Constants.Vault.Names.VAULT_CONFIGURATION_FILENAME, true, cancellationToken),
_ => await _vaultFolder.GetFirstByNameAsync(Constants.Vault.Names.VAULT_CONFIGURATION_FILENAME, cancellationToken) as IFile
};
await WriteDataAsync(configFile, configDataModel, cancellationToken);
}
public async Task WriteComplementationAsync(VaultSharesDataModel? sharesDataModel, CancellationToken cancellationToken)
{
var complementFile = _vaultFolder switch
{
IModifiableFolder modifiableFolder when sharesDataModel is not null => await modifiableFolder.CreateFileAsync(Constants.Vault.Names.VAULT_COMPLEMENTATION_FILENAME, true, cancellationToken),
_ => await _vaultFolder.GetFirstByNameAsync(Constants.Vault.Names.VAULT_COMPLEMENTATION_FILENAME, cancellationToken) as IFile
};
await WriteDataAsync(complementFile, sharesDataModel, cancellationToken);
}
public async Task WriteAuthenticationAsync<TCapability>(string fileName, TCapability? authDataModel, CancellationToken cancellationToken)
where TCapability : VaultCapabilityDataModel
{
var authFile = authDataModel is null ? null : _vaultFolder switch
{
IModifiableFolder modifiableFolder => await modifiableFolder.CreateFileAsync(fileName, true, cancellationToken),
_ => await _vaultFolder.GetFirstByNameAsync(fileName, cancellationToken) as IFile
};
await WriteDataAsync(authFile, authDataModel, cancellationToken);
}
private async Task WriteDataAsync<TData>(IFile? file, TData? data, CancellationToken cancellationToken)
{
if (file is null)
return;
// Open a stream to the data file
await using var fileStream = await file.OpenStreamAsync(FileAccess.Write, cancellationToken);
// Clear contents if opened from an existing file
fileStream.TrySetLength(0L);
if (data is not null)
{
await using var serializedData = await _serializer.SerializeAsync(data, cancellationToken);
await serializedData.CopyToAsync(fileStream, cancellationToken);
}
}
}
}