api: add encryption verifier

encryption verifier is used for verifying the encryption key during password resets. It can be any encrypted item.
This commit is contained in:
Abdullah Atta
2026-08-18 08:36:02 +05:00
parent 768384011d
commit 0a3ee07b95
4 changed files with 41 additions and 0 deletions
@@ -127,6 +127,24 @@ namespace Notesnook.API.Controllers
}
}
[HttpGet("verifier")]
public async Task<IActionResult> GetEncryptionVerifier()
{
var userId = User.GetUserId();
try
{
var response = await UserService.GetEncryptionVerifier(userId);
if (response == null) return NotFound();
return Ok(response);
}
catch (Exception ex)
{
logger.LogError(ex, "Failed to get encryption verifier for user id: {UserId}", userId);
return BadRequest(new { error = ex.Message });
}
}
[HttpPost("reset")]
public async Task<IActionResult> Reset([FromForm] bool removeAttachments)
{
+1
View File
@@ -31,6 +31,7 @@ namespace Notesnook.API.Interfaces
Task DeleteUserAsync(string userId, string? jti, string password);
Task<bool> ResetUserAsync(string userId, bool removeAttachments);
Task<UserResponse> GetUserAsync(string userId);
Task<EncryptedData?> GetEncryptionVerifier(string userId);
Task SetUserKeysAsync(string userId, UserKeys keys);
}
}
@@ -36,6 +36,7 @@ using Streetwriters.Common;
using Streetwriters.Data.DbContexts;
using Streetwriters.Data.Interfaces;
using Streetwriters.Data.Repositories;
using AspNetCore.Identity.Mongo.Mongo;
namespace Notesnook.API.Repositories
{
+21
View File
@@ -30,6 +30,7 @@ using Notesnook.API.Helpers;
using Notesnook.API.Interfaces;
using Notesnook.API.Models;
using Notesnook.API.Models.Responses;
using Notesnook.API.Repositories;
using Streetwriters.Common;
using Streetwriters.Common.Accessors;
using Streetwriters.Common.Enums;
@@ -192,6 +193,26 @@ namespace Notesnook.API.Services
await Repositories.UsersSettings.UpdateAsync(userSettings.Id, userSettings);
}
public async Task<EncryptedData?> GetEncryptionVerifier(string userId)
{
SyncItemsRepository[] repositories = [Repositories.Notes, Repositories.Notebooks, Repositories.Shortcuts, Repositories.Contents, Repositories.Settings, Repositories.LegacySettings, Repositories.Attachments, Repositories.Reminders, Repositories.Relations, Repositories.Colors, Repositories.Tags, Repositories.Vaults, Repositories.InboxItemsHistory];
foreach (var repo in repositories)
{
var item = await repo.FindOneAsync((s) => s.UserId == userId && (s.KeyVersion == null || s.KeyVersion == 0));
if (item != null)
{
return new EncryptedData
{
Cipher = item.Cipher,
IV = item.IV,
Salt = "",
Length = item.Length
};
}
}
return null;
}
public async Task DeleteUserAsync(string userId)
{
logger.LogInformation("Deleting user {UserId}", userId);