1
0
mirror of https://github.com/bitwarden/server.git synced 2025-05-20 19:14:32 -05:00

Revert TwoFactorProviders to be saved with numerical value (#1828)

* Add enum key resolver

* Change tests to reflect changes
This commit is contained in:
Justin Baur 2022-02-02 14:21:11 -05:00 committed by GitHub
parent 8ce4d56a91
commit 9e074bca49
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 26 additions and 6 deletions

View File

@ -133,7 +133,7 @@ namespace Bit.Core.Entities
public void SetTwoFactorProviders(Dictionary<TwoFactorProviderType, TwoFactorProvider> providers) public void SetTwoFactorProviders(Dictionary<TwoFactorProviderType, TwoFactorProvider> providers)
{ {
// When replacing with system.text remember to remove the extra serialization in WebAuthnTokenProvider. // When replacing with system.text remember to remove the extra serialization in WebAuthnTokenProvider.
TwoFactorProviders = JsonHelpers.LegacySerialize(providers); TwoFactorProviders = JsonHelpers.LegacySerialize(providers, JsonHelpers.LegacyEnumKeyResolver);
_twoFactorProviders = providers; _twoFactorProviders = providers;
} }

View File

@ -66,22 +66,42 @@ namespace Bit.Core.Utilities
private const string LegacyMessage = "Usage of Newtonsoft.Json should be kept to a minimum and will further be removed when we move to .NET 6"; private const string LegacyMessage = "Usage of Newtonsoft.Json should be kept to a minimum and will further be removed when we move to .NET 6";
[Obsolete(LegacyMessage)] [Obsolete(LegacyMessage)]
public static NS.JsonSerializerSettings LegacyDefault { get; } = new NS.JsonSerializerSettings(); public static NS.JsonSerializerSettings LegacyEnumKeyResolver { get; } = new NS.JsonSerializerSettings
{
ContractResolver = new EnumKeyResolver<byte>(),
};
[Obsolete(LegacyMessage)] [Obsolete(LegacyMessage)]
public static string LegacySerialize(object value, NS.JsonSerializerSettings settings = null) public static string LegacySerialize(object value, NS.JsonSerializerSettings settings = null)
{ {
return NS.JsonConvert.SerializeObject(value, settings ?? LegacyDefault); return NS.JsonConvert.SerializeObject(value, settings);
} }
[Obsolete(LegacyMessage)] [Obsolete(LegacyMessage)]
public static T LegacyDeserialize<T>(string value, NS.JsonSerializerSettings settings = null) public static T LegacyDeserialize<T>(string value, NS.JsonSerializerSettings settings = null)
{ {
return NS.JsonConvert.DeserializeObject<T>(value, settings ?? LegacyDefault); return NS.JsonConvert.DeserializeObject<T>(value, settings);
} }
#endregion #endregion
} }
public class EnumKeyResolver<T> : NS.Serialization.DefaultContractResolver
where T : struct
{
protected override NS.Serialization.JsonDictionaryContract CreateDictionaryContract(Type objectType)
{
var contract = base.CreateDictionaryContract(objectType);
var keyType = contract.DictionaryKeyType;
if (keyType.BaseType == typeof(Enum))
{
contract.DictionaryKeyResolver = propName => ((T)Enum.Parse(keyType, propName)).ToString();
}
return contract;
}
}
public class MsEpochConverter : JsonConverter<DateTime?> public class MsEpochConverter : JsonConverter<DateTime?>
{ {
public override DateTime? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) public override DateTime? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)

View File

@ -72,12 +72,12 @@ namespace Bit.Core.Test.Models.Tables
using var jsonDocument = JsonDocument.Parse(user.TwoFactorProviders); using var jsonDocument = JsonDocument.Parse(user.TwoFactorProviders);
var root = jsonDocument.RootElement; var root = jsonDocument.RootElement;
var webAuthn = AssertHelper.AssertJsonProperty(root, "WebAuthn", JsonValueKind.Object); var webAuthn = AssertHelper.AssertJsonProperty(root, "7", JsonValueKind.Object);
AssertHelper.AssertJsonProperty(webAuthn, "Enabled", JsonValueKind.True); AssertHelper.AssertJsonProperty(webAuthn, "Enabled", JsonValueKind.True);
var webMetaData = AssertHelper.AssertJsonProperty(webAuthn, "MetaData", JsonValueKind.Object); var webMetaData = AssertHelper.AssertJsonProperty(webAuthn, "MetaData", JsonValueKind.Object);
AssertHelper.AssertJsonProperty(webMetaData, "Item", JsonValueKind.String); AssertHelper.AssertJsonProperty(webMetaData, "Item", JsonValueKind.String);
var email = AssertHelper.AssertJsonProperty(root, "Email", JsonValueKind.Object); var email = AssertHelper.AssertJsonProperty(root, "1", JsonValueKind.Object);
AssertHelper.AssertJsonProperty(email, "Enabled", JsonValueKind.False); AssertHelper.AssertJsonProperty(email, "Enabled", JsonValueKind.False);
var emailMetaData = AssertHelper.AssertJsonProperty(email, "MetaData", JsonValueKind.Object); var emailMetaData = AssertHelper.AssertJsonProperty(email, "MetaData", JsonValueKind.Object);
AssertHelper.AssertJsonProperty(emailMetaData, "Email", JsonValueKind.String); AssertHelper.AssertJsonProperty(emailMetaData, "Email", JsonValueKind.String);