using System.Text.Json; using Bit.Core.AdminConsole.Enums; using Bit.Core.AdminConsole.Models.Data.Organizations.Policies; using Bit.Core.AdminConsole.OrganizationFeatures.Policies.Models; using Bit.Core.Exceptions; using Bit.Core.Utilities; namespace Bit.Core.AdminConsole.Utilities; public static class PolicyDataValidator { /// /// Validates and serializes policy data based on the policy type. /// /// The policy data to validate /// The type of policy /// Serialized JSON string if data is valid, null if data is null or empty /// Thrown when data validation fails public static string? ValidateAndSerialize(Dictionary? data, PolicyType policyType) { if (data == null || data.Count == 0) { return null; } try { var json = JsonSerializer.Serialize(data); switch (policyType) { case PolicyType.MasterPassword: CoreHelpers.LoadClassFromJsonData(json); break; case PolicyType.SendOptions: CoreHelpers.LoadClassFromJsonData(json); break; case PolicyType.ResetPassword: CoreHelpers.LoadClassFromJsonData(json); break; } return json; } catch (JsonException ex) { var fieldInfo = !string.IsNullOrEmpty(ex.Path) ? $": field '{ex.Path}' has invalid type" : ""; throw new BadRequestException($"Invalid data for {policyType} policy{fieldInfo}."); } } /// /// Validates and deserializes policy metadata based on the policy type. /// /// The policy metadata to validate /// The type of policy /// Deserialized metadata model, or EmptyMetadataModel if metadata is null, empty, or validation fails public static IPolicyMetadataModel ValidateAndDeserializeMetadata(Dictionary? metadata, PolicyType policyType) { if (metadata == null || metadata.Count == 0) { return new EmptyMetadataModel(); } try { var json = JsonSerializer.Serialize(metadata); return policyType switch { PolicyType.OrganizationDataOwnership => CoreHelpers.LoadClassFromJsonData(json), _ => new EmptyMetadataModel() }; } catch (JsonException) { return new EmptyMetadataModel(); } } }