Skip to content

Commit 80d3806

Browse files
committed
Unify health methods
1 parent 60e5f68 commit 80d3806

4 files changed

Lines changed: 68 additions & 39 deletions

File tree

‎src/Core/SecureFolderFS.Core.FileSystem/Helpers/Health/HealthHelpers.Directory.cs‎

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,23 @@
1-
using OwlCore.Storage;
1+
using System;
2+
using System.IO;
3+
using System.Threading;
4+
using System.Threading.Tasks;
5+
using OwlCore.Storage;
26
using SecureFolderFS.Core.Cryptography;
37
using SecureFolderFS.Core.FileSystem.Helpers.Paths;
8+
using SecureFolderFS.Core.FileSystem.Helpers.Paths.Abstract;
49
using SecureFolderFS.Shared.ComponentModel;
510
using SecureFolderFS.Shared.Models;
611
using SecureFolderFS.Storage.Extensions;
712
using SecureFolderFS.Storage.Renamable;
8-
using System;
9-
using System.IO;
10-
using System.Threading;
11-
using System.Threading.Tasks;
1213

1314
namespace SecureFolderFS.Core.FileSystem.Helpers.Health
1415
{
1516
public static partial class HealthHelpers
1617
{
1718
public static async Task<IResult> RepairDirectoryAsync(IFolder affected, Security security, CancellationToken cancellationToken)
1819
{
19-
// Return success, if no encryption is used
20+
// Return success if no encryption is used
2021
if (security.NameCrypt is null)
2122
return Result.Success;
2223

@@ -38,11 +39,8 @@ public static async Task<IResult> RepairDirectoryAsync(IFolder affected, Securit
3839
if (PathHelpers.IsCoreName(item.Name))
3940
continue;
4041

41-
// Encrypt a new name
42-
var encryptedName = security.NameCrypt.EncryptName(item.Name, directoryId);
43-
encryptedName = $"{encryptedName}{Constants.Names.ENCRYPTED_FILE_EXTENSION}";
44-
45-
// Rename
42+
// Encrypt a new name and rename
43+
var encryptedName = await AbstractPathHelpers.EncryptNewNameAsync(item.Name, directoryId, security, cancellationToken);
4644
_ = await renamableFolder.RenameAsync(item, encryptedName, cancellationToken);
4745
}
4846

‎src/Core/SecureFolderFS.Core.FileSystem/Helpers/Health/HealthHelpers.Name.cs‎

Lines changed: 8 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,13 @@
1-
using OwlCore.Storage;
2-
using SecureFolderFS.Core.Cryptography;
3-
using SecureFolderFS.Shared.ComponentModel;
4-
using SecureFolderFS.Shared.Models;
5-
using SecureFolderFS.Storage.Extensions;
6-
using SecureFolderFS.Storage.Renamable;
7-
using System;
8-
using System.IO;
1+
using System;
92
using System.Threading;
103
using System.Threading.Tasks;
4+
using OwlCore.Storage;
5+
using SecureFolderFS.Core.Cryptography;
116
using SecureFolderFS.Core.FileSystem.Helpers.Paths.Abstract;
7+
using SecureFolderFS.Shared.ComponentModel;
128
using SecureFolderFS.Shared.Helpers;
9+
using SecureFolderFS.Shared.Models;
10+
using SecureFolderFS.Storage.Renamable;
1311

1412
namespace SecureFolderFS.Core.FileSystem.Helpers.Health
1513
{
@@ -49,26 +47,8 @@ private static async Task<IResult> RepairNameAsync(IStorableChild affected, Secu
4947
if (parentFolder is not IRenamableFolder renamableFolder)
5048
return Result.Failure(FolderNotRenamable);
5149

52-
byte[] directoryId;
53-
if (parentFolder.Id != contentFolder.Id) // TODO: Remove code duplication with AbstractPathHelpers
54-
{
55-
var directoryIdFile = await parentFolder.GetFileByNameAsync(Constants.Names.DIRECTORY_ID_FILENAME, cancellationToken);
56-
await using var directoryIdStream = await directoryIdFile.OpenStreamAsync(FileAccess.Read, FileShare.Read, cancellationToken);
57-
58-
directoryId = new byte[Constants.DIRECTORY_ID_SIZE];
59-
var read = await directoryIdStream.ReadAsync(directoryId, cancellationToken);
60-
61-
if (read < Constants.DIRECTORY_ID_SIZE)
62-
throw new IOException($"The data inside Directory ID file is of incorrect size: {read}.");
63-
}
64-
else
65-
directoryId = Array.Empty<byte>();
66-
67-
// Encrypt new name
68-
var encryptedName = security.NameCrypt.EncryptName(newName, directoryId);
69-
encryptedName = $"{encryptedName}{Constants.Names.ENCRYPTED_FILE_EXTENSION}";
70-
71-
// Rename
50+
// Encrypt new name and rename
51+
var encryptedName = await AbstractPathHelpers.EncryptNameAsync(newName, parentFolder, contentFolder, security, cancellationToken);
7252
_ = await renamableFolder.RenameAsync(affected, encryptedName, cancellationToken);
7353
}
7454
catch (Exception ex)

‎src/Core/SecureFolderFS.Core.FileSystem/Helpers/Paths/Abstract/AbstractPathHelpers.Directory.cs‎

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,26 @@ namespace SecureFolderFS.Core.FileSystem.Helpers.Paths.Abstract
1010
{
1111
public static partial class AbstractPathHelpers
1212
{
13+
public static async Task<bool> GetDirectoryIdAsync(
14+
IFolder folderOfDirectoryId,
15+
IFolder contentFolder,
16+
Memory<byte> directoryId,
17+
CancellationToken cancellationToken)
18+
{
19+
if (folderOfDirectoryId.Id == contentFolder.Id)
20+
return false;
21+
22+
var directoryIdFile = await folderOfDirectoryId.GetFileByNameAsync(Constants.Names.DIRECTORY_ID_FILENAME, cancellationToken).ConfigureAwait(false);
23+
await using var directoryIdStream = await directoryIdFile.OpenStreamAsync(FileAccess.Read, FileShare.Read, cancellationToken).ConfigureAwait(false);
24+
25+
var read = await directoryIdStream.ReadAsync(directoryId, cancellationToken).ConfigureAwait(false);
26+
if (read < Constants.DIRECTORY_ID_SIZE)
27+
throw new IOException($"The data inside Directory ID file is of incorrect size: {read}.");
28+
29+
// The Directory ID is not empty - return true
30+
return true;
31+
}
32+
1333
public static async Task<bool> GetDirectoryIdAsync(
1434
IFolder folderOfDirectoryId,
1535
FileSystemSpecifics specifics,

‎src/Core/SecureFolderFS.Core.FileSystem/Helpers/Paths/Abstract/AbstractPathHelpers.Names.cs‎

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using System.Threading;
33
using System.Threading.Tasks;
44
using OwlCore.Storage;
5+
using SecureFolderFS.Core.Cryptography;
56
using SecureFolderFS.Core.FileSystem.FileNames;
67

78
namespace SecureFolderFS.Core.FileSystem.Helpers.Paths.Abstract
@@ -40,6 +41,36 @@ public static async Task<string> EncryptNameAsync(string plaintextName, IFolder
4041
return specifics.Security.NameCrypt.EncryptName(plaintextName, result ? expendableDirectoryId : ReadOnlySpan<byte>.Empty) + Constants.Names.ENCRYPTED_FILE_EXTENSION;
4142
}
4243

44+
/// <summary>
45+
/// Encrypts the provided <paramref name="plaintextName"/>.
46+
/// </summary>
47+
/// <param name="plaintextName">The name to encrypt.</param>
48+
/// <param name="ciphertextParentFolder">The ciphertext parent folder.</param>
49+
/// <param name="contentFolder">The content folder.</param>
50+
/// <param name="security">The <see cref="Security"/> instance associated with the item.</param>
51+
/// <param name="cancellationToken">A <see cref="CancellationToken"/> that cancels this action.</param>
52+
/// <returns>A <see cref="Task"/> that represents the asynchronous operation. Value is an encrypted name.</returns>
53+
public static async Task<string> EncryptNameAsync(string plaintextName, IFolder ciphertextParentFolder, IFolder contentFolder,
54+
Security security, CancellationToken cancellationToken = default)
55+
{
56+
if (security.NameCrypt is null)
57+
return plaintextName;
58+
59+
var directoryId = AllocateDirectoryId(security, plaintextName);
60+
var result = await GetDirectoryIdAsync(ciphertextParentFolder, contentFolder, directoryId, cancellationToken);
61+
62+
return security.NameCrypt.EncryptName(plaintextName, result ? directoryId : ReadOnlySpan<byte>.Empty) + Constants.Names.ENCRYPTED_FILE_EXTENSION;
63+
}
64+
65+
public static async Task<string> EncryptNewNameAsync(string plaintextName, byte[] newDirectoryId,
66+
Security security, CancellationToken cancellationToken = default)
67+
{
68+
if (security.NameCrypt is null)
69+
return plaintextName;
70+
71+
return security.NameCrypt.EncryptName(plaintextName, newDirectoryId) + Constants.Names.ENCRYPTED_FILE_EXTENSION;
72+
}
73+
4374
/// <inheritdoc cref="DecryptNameAsync(string,OwlCore.Storage.IFolder,SecureFolderFS.Core.FileSystem.FileSystemSpecifics,System.Byte[],System.Threading.CancellationToken)"/>
4475
public static async Task<string?> DecryptNameAsync(string ciphertextName, IFolder ciphertextParentFolder,
4576
FileSystemSpecifics specifics, CancellationToken cancellationToken = default)

0 commit comments

Comments
 (0)