2025-07-08 10:25:59 -04:00
|
|
|
|
// FIXME: Update this file to be null safe and then delete the line below
|
|
|
|
|
|
#nullable disable
|
|
|
|
|
|
|
|
|
|
|
|
using System.Reflection;
|
2023-03-10 08:11:11 -05:00
|
|
|
|
|
|
|
|
|
|
namespace Bit.Core;
|
2022-08-29 16:06:55 -04:00
|
|
|
|
|
2018-08-15 10:54:15 -04:00
|
|
|
|
public static class Constants
|
|
|
|
|
|
{
|
|
|
|
|
|
public const int BypassFiltersEventId = 12482444;
|
2023-10-30 08:40:06 -05:00
|
|
|
|
public const int FailedSecretVerificationDelay = 2000;
|
2021-08-04 09:00:30 +10:00
|
|
|
|
|
2025-09-10 10:08:22 -05:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Self-hosted max storage limit in GB (10 TB).
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public const short SelfHostedMaxStorageGb = 10240;
|
|
|
|
|
|
|
2021-08-04 09:00:30 +10:00
|
|
|
|
// File size limits - give 1 MB extra for cushion.
|
|
|
|
|
|
// Note: if request size limits are changed, 'client_max_body_size'
|
|
|
|
|
|
// in nginx/proxy.conf may also need to be updated accordingly.
|
|
|
|
|
|
public const long FileSize101mb = 101L * 1024L * 1024L;
|
|
|
|
|
|
public const long FileSize501mb = 501L * 1024L * 1024L;
|
2023-01-18 13:16:57 -05:00
|
|
|
|
public const string DatabaseFieldProtectorPurpose = "DatabaseFieldProtection";
|
|
|
|
|
|
public const string DatabaseFieldProtectedPrefix = "P|";
|
2023-05-15 07:38:41 -07:00
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Default number of days an organization has to apply an updated license to their self-hosted installation after
|
|
|
|
|
|
/// their subscription has expired.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public const int OrganizationSelfHostSubscriptionGracePeriodDays = 60;
|
2023-09-28 08:45:13 -04:00
|
|
|
|
|
2023-10-17 18:17:13 +02:00
|
|
|
|
public const string Fido2KeyCipherMinimumVersion = "2023.10.0";
|
2024-11-05 20:25:06 +01:00
|
|
|
|
public const string SSHKeyCipherMinimumVersion = "2024.12.0";
|
2025-06-02 22:04:01 +02:00
|
|
|
|
public const string DenyLegacyUserMinimumVersion = "2025.6.0";
|
2023-10-17 18:17:13 +02:00
|
|
|
|
|
2023-11-20 15:55:31 +01:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Used by IdentityServer to identify our own provider.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public const string IdentityProvider = "bitwarden";
|
2023-12-20 22:54:45 +01:00
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Date identifier used in ProviderService to determine if a provider was created before Nov 6, 2023.
|
|
|
|
|
|
/// If true, the organization plan assigned to that provider is updated to a 2020 plan.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public static readonly DateTime ProviderCreatedPriorNov62023 = new DateTime(2023, 11, 6);
|
2024-02-13 20:28:14 +01:00
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// When you set the ProrationBehavior to create_prorations,
|
|
|
|
|
|
/// Stripe will automatically create prorations for any changes made to the subscription,
|
|
|
|
|
|
/// such as changing the plan, adding or removing quantities, or applying discounts.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public const string CreateProrations = "create_prorations";
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// When you set the ProrationBehavior to always_invoice,
|
|
|
|
|
|
/// Stripe will always generate an invoice when a subscription update occurs,
|
|
|
|
|
|
/// regardless of whether there is a proration or not.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public const string AlwaysInvoice = "always_invoice";
|
2025-09-03 10:03:49 -05:00
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Used primarily to determine whether a customer's business is inside or outside the United States
|
|
|
|
|
|
/// for billing purposes.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public static class CountryAbbreviations
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// Abbreviation for The United States.
|
|
|
|
|
|
/// This value must match what Stripe uses for the `Country` field value for the United States.
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
public const string UnitedStates = "US";
|
|
|
|
|
|
}
|
2018-08-15 10:54:15 -04:00
|
|
|
|
}
|
2020-08-26 14:12:04 -04:00
|
|
|
|
|
2023-12-05 17:21:46 +01:00
|
|
|
|
public static class AuthConstants
|
|
|
|
|
|
{
|
|
|
|
|
|
public static readonly RangeConstant PBKDF2_ITERATIONS = new(600_000, 2_000_000, 600_000);
|
|
|
|
|
|
|
|
|
|
|
|
public static readonly RangeConstant ARGON2_ITERATIONS = new(2, 10, 3);
|
|
|
|
|
|
public static readonly RangeConstant ARGON2_MEMORY = new(15, 1024, 64);
|
|
|
|
|
|
public static readonly RangeConstant ARGON2_PARALLELISM = new(1, 16, 4);
|
2024-12-17 08:59:39 -08:00
|
|
|
|
public static readonly string NewDeviceVerificationExceptionCacheKeyFormat = "NewDeviceVerificationException_{0}";
|
2023-12-05 17:21:46 +01:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public class RangeConstant
|
|
|
|
|
|
{
|
|
|
|
|
|
public int Default { get; }
|
|
|
|
|
|
public int Min { get; }
|
|
|
|
|
|
public int Max { get; }
|
|
|
|
|
|
|
|
|
|
|
|
public RangeConstant(int min, int max, int defaultValue)
|
|
|
|
|
|
{
|
|
|
|
|
|
Default = defaultValue;
|
|
|
|
|
|
Min = min;
|
|
|
|
|
|
Max = max;
|
|
|
|
|
|
|
|
|
|
|
|
if (Min > Max)
|
|
|
|
|
|
{
|
|
|
|
|
|
throw new ArgumentOutOfRangeException($"{Min} is larger than {Max}.");
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (!InsideRange(defaultValue))
|
|
|
|
|
|
{
|
|
|
|
|
|
throw new ArgumentOutOfRangeException($"{Default} is outside allowed range of {Min}-{Max}.");
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public bool InsideRange(int number)
|
|
|
|
|
|
{
|
|
|
|
|
|
return Min <= number && number <= Max;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2020-08-26 14:12:04 -04:00
|
|
|
|
public static class TokenPurposes
|
|
|
|
|
|
{
|
|
|
|
|
|
public const string LinkSso = "LinkSso";
|
|
|
|
|
|
}
|
2021-01-11 11:03:46 -05:00
|
|
|
|
|
|
|
|
|
|
public static class AuthenticationSchemes
|
|
|
|
|
|
{
|
|
|
|
|
|
public const string BitwardenExternalCookieAuthenticationScheme = "bw.external";
|
2018-08-15 10:54:15 -04:00
|
|
|
|
}
|
2023-03-07 13:46:52 -05:00
|
|
|
|
|
|
|
|
|
|
public static class FeatureFlagKeys
|
|
|
|
|
|
{
|
2025-01-23 00:04:08 +10:00
|
|
|
|
/* Admin Console Team */
|
|
|
|
|
|
public const string VerifiedSsoDomainEndpoint = "pm-12337-refactor-sso-details-endpoint";
|
2025-01-31 12:18:10 -06:00
|
|
|
|
public const string LimitItemDeletion = "pm-15493-restrict-item-deletion-to-can-manage-permission";
|
2025-02-14 21:05:49 +10:00
|
|
|
|
public const string PolicyRequirements = "pm-14439-policy-requirements";
|
2025-04-07 09:14:10 -05:00
|
|
|
|
public const string ScimInviteUserOptimization = "pm-16811-optimize-invite-user-flow-to-fail-fast";
|
2025-04-28 08:20:47 -04:00
|
|
|
|
public const string EventBasedOrganizationIntegrations = "event-based-organization-integrations";
|
2025-05-29 10:57:50 -04:00
|
|
|
|
public const string SeparateCustomRolePermissions = "pm-19917-separate-custom-role-permissions";
|
2025-06-17 12:20:22 +01:00
|
|
|
|
public const string CreateDefaultLocation = "pm-19467-create-default-location";
|
[PM-24233] Use BulkResourceCreationService in CipherRepository (#6201)
* Add constant for CipherRepositoryBulkResourceCreation in FeatureFlagKeys
* Add bulk creation methods for Ciphers, Folders, and CollectionCiphers in BulkResourceCreationService
- Implemented CreateCiphersAsync, CreateFoldersAsync, CreateCollectionCiphersAsync, and CreateTempCiphersAsync methods for bulk insertion.
- Added helper methods to build DataTables for Ciphers, Folders, and CollectionCiphers.
- Enhanced error handling for empty collections during bulk operations.
* Refactor CipherRepository to utilize BulkResourceCreationService
- Introduced IFeatureService to manage feature flag checks for bulk operations.
- Updated methods to conditionally use BulkResourceCreationService for creating Ciphers, Folders, and CollectionCiphers based on feature flag status.
- Enhanced existing bulk copy logic to maintain functionality while integrating feature flag checks.
* Add InlineFeatureService to DatabaseDataAttribute for feature flag management
- Introduced EnabledFeatureFlags property to DatabaseDataAttribute for configuring feature flags.
- Integrated InlineFeatureService to provide feature flag checks within the service collection.
- Enhanced GetData method to utilize feature flags for conditional service registration.
* Add tests for bulk creation of Ciphers in CipherRepositoryTests
- Implemented tests for bulk creation of Ciphers, Folders, and Collections with feature flag checks.
- Added test cases for updating multiple Ciphers to validate bulk update functionality.
- Enhanced existing test structure to ensure comprehensive coverage of bulk operations in the CipherRepository.
* Refactor BulkResourceCreationService to use dynamic types for DataColumns
- Updated DataColumn definitions in BulkResourceCreationService to utilize the actual types of properties from the cipher object instead of hardcoded types.
- Simplified the assignment of nullable properties to directly use their values, improving code readability and maintainability.
* Update BulkResourceCreationService to use specific types for DataColumns
- Changed DataColumn definitions to use specific types (short and string) instead of dynamic types based on cipher properties.
- Improved handling of nullable properties when assigning values to DataTable rows, ensuring proper handling of DBNull for null values.
* Refactor CipherRepositoryTests for improved clarity and consistency
- Renamed test methods to better reflect their purpose and improve readability.
- Updated test data to use more descriptive names for users, folders, and collections.
- Enhanced test structure with clear Arrange, Act, and Assert sections for better understanding of test flow.
- Ensured all tests validate the expected outcomes for bulk operations with feature flag checks.
* Update CipherRepositoryBulkResourceCreation feature flag key
* Refactor DatabaseDataAttribute usage in CipherRepositoryTests to use array syntax for EnabledFeatureFlags
* Update CipherRepositoryTests to use GenerateComb for generating unique IDs
* Refactor CipherRepository methods to accept a boolean parameter for enabling bulk resource creation based on feature flags. Update tests to verify functionality with and without the feature flag enabled.
* Refactor CipherRepository and related services to support new methods for bulk resource creation without boolean parameters.
2025-09-03 14:57:53 +01:00
|
|
|
|
public const string CipherRepositoryBulkResourceCreation = "pm-24951-cipher-repository-bulk-resource-creation-service";
|
2025-09-04 12:23:14 -04:00
|
|
|
|
public const string CollectionVaultRefactor = "pm-25030-resolve-ts-upgrade-errors";
|
2025-09-11 13:58:32 +10:00
|
|
|
|
public const string DeleteClaimedUserAccountRefactor = "pm-25094-refactor-delete-managed-organization-user-command";
|
2025-09-12 10:41:53 -05:00
|
|
|
|
public const string InviteEmailImprovements = "pm-25644-update-join-organization-subject-line";
|
2025-01-23 00:04:08 +10:00
|
|
|
|
|
2025-03-19 15:27:51 -04:00
|
|
|
|
/* Auth Team */
|
2025-03-31 14:27:09 -04:00
|
|
|
|
public const string TwoFactorExtensionDataPersistence = "pm-9115-two-factor-extension-data-persistence";
|
2024-04-30 12:43:12 -04:00
|
|
|
|
public const string EmailVerification = "email-verification";
|
2025-05-16 09:50:32 -04:00
|
|
|
|
public const string BrowserExtensionLoginApproval = "pm-14938-browser-extension-login-approvals";
|
2025-03-30 16:03:09 -04:00
|
|
|
|
public const string SetInitialPasswordRefactor = "pm-16117-set-initial-password-refactor";
|
|
|
|
|
|
public const string ChangeExistingPasswordRefactor = "pm-16117-change-existing-password-refactor";
|
2025-07-14 10:23:30 -04:00
|
|
|
|
public const string Otp6Digits = "pm-18612-otp-6-digits";
|
2025-08-11 16:39:43 -04:00
|
|
|
|
public const string FailedTwoFactorEmail = "pm-24425-send-2fa-failed-email";
|
2025-03-30 16:03:09 -04:00
|
|
|
|
|
|
|
|
|
|
/* Autofill Team */
|
|
|
|
|
|
public const string IdpAutoSubmitLogin = "idp-auto-submit-login";
|
|
|
|
|
|
public const string UseTreeWalkerApiForPageDetailsCollection = "use-tree-walker-api-for-page-details-collection";
|
|
|
|
|
|
public const string InlineMenuFieldQualification = "inline-menu-field-qualification";
|
|
|
|
|
|
public const string InlineMenuPositioningImprovements = "inline-menu-positioning-improvements";
|
|
|
|
|
|
public const string SSHAgent = "ssh-agent";
|
|
|
|
|
|
public const string SSHVersionCheckQAOverride = "ssh-version-check-qa-override";
|
2024-08-05 12:04:23 -05:00
|
|
|
|
public const string GenerateIdentityFillScriptRefactor = "generate-identity-fill-script-refactor";
|
2024-08-07 10:42:00 -05:00
|
|
|
|
public const string DelayFido2PageScriptInitWithinMv2 = "delay-fido2-page-script-init-within-mv2";
|
2024-08-21 22:04:08 -05:00
|
|
|
|
public const string NotificationBarAddLoginImprovements = "notification-bar-add-login-improvements";
|
2025-01-08 18:36:18 -05:00
|
|
|
|
public const string BlockBrowserInjectionsByDomain = "block-browser-injections-by-domain";
|
2025-01-14 15:47:35 -05:00
|
|
|
|
public const string NotificationRefresh = "notification-refresh";
|
2024-09-04 13:43:59 -04:00
|
|
|
|
public const string EnableNewCardCombinedExpiryAutofill = "enable-new-card-combined-expiry-autofill";
|
2024-11-28 09:49:09 +01:00
|
|
|
|
public const string MacOsNativeCredentialSync = "macos-native-credential-sync";
|
2024-12-04 14:42:12 -05:00
|
|
|
|
public const string InlineMenuTotp = "inline-menu-totp";
|
2025-06-20 14:02:48 -04:00
|
|
|
|
public const string WindowsDesktopAutotype = "windows-desktop-autotype";
|
2025-03-30 16:03:09 -04:00
|
|
|
|
|
|
|
|
|
|
/* Billing Team */
|
|
|
|
|
|
public const string AC2101UpdateTrialInitiationEmail = "AC-2101-update-trial-initiation-email";
|
|
|
|
|
|
public const string TrialPayment = "PM-8163-trial-payment";
|
2025-04-16 17:27:58 +02:00
|
|
|
|
public const string PM17772_AdminInitiatedSponsorships = "pm-17772-admin-initiated-sponsorships";
|
2025-01-03 09:14:07 -06:00
|
|
|
|
public const string UsePricingService = "use-pricing-service";
|
2025-04-02 19:47:48 +02:00
|
|
|
|
public const string PM19422_AllowAutomaticTaxUpdates = "pm-19422-allow-automatic-tax-updates";
|
2025-05-01 17:13:10 -04:00
|
|
|
|
public const string UseOrganizationWarningsService = "use-organization-warnings-service";
|
2025-07-10 08:32:25 -05:00
|
|
|
|
public const string PM21881_ManagePaymentDetailsOutsideCheckout = "pm-21881-manage-payment-details-outside-checkout";
|
2025-07-23 08:25:37 -05:00
|
|
|
|
public const string PM21821_ProviderPortalTakeover = "pm-21821-provider-portal-takeover";
|
2025-08-18 09:42:51 -05:00
|
|
|
|
public const string PM22415_TaxIDWarnings = "pm-22415-tax-id-warnings";
|
2025-09-10 10:08:22 -05:00
|
|
|
|
public const string PM23385_UseNewPremiumFlow = "pm-23385-use-new-premium-flow";
|
2025-03-30 16:03:09 -04:00
|
|
|
|
|
|
|
|
|
|
/* Key Management Team */
|
|
|
|
|
|
public const string ReturnErrorOnExistingKeypair = "return-error-on-existing-keypair";
|
|
|
|
|
|
public const string PM4154BulkEncryptionService = "PM-4154-bulk-encryption-service";
|
|
|
|
|
|
public const string PrivateKeyRegeneration = "pm-12241-private-key-regeneration";
|
|
|
|
|
|
public const string Argon2Default = "argon2-default";
|
|
|
|
|
|
public const string UserkeyRotationV2 = "userkey-rotation-v2";
|
|
|
|
|
|
public const string SSHKeyItemVaultItem = "ssh-key-vault-item";
|
2025-04-15 12:03:06 -07:00
|
|
|
|
public const string UserSdkForDecryption = "use-sdk-for-decryption";
|
2025-04-14 12:48:52 -05:00
|
|
|
|
public const string PM17987_BlockType0 = "pm-17987-block-type-0";
|
2025-07-15 16:12:09 +02:00
|
|
|
|
public const string ForceUpdateKDFSettings = "pm-18021-force-update-kdf-settings";
|
2025-09-02 15:02:02 -05:00
|
|
|
|
public const string UnlockWithMasterPasswordUnlockData = "pm-23246-unlock-with-master-password-unlock-data";
|
2025-03-30 16:03:09 -04:00
|
|
|
|
|
|
|
|
|
|
/* Mobile Team */
|
|
|
|
|
|
public const string NativeCarouselFlow = "native-carousel-flow";
|
|
|
|
|
|
public const string NativeCreateAccountFlow = "native-create-account-flow";
|
|
|
|
|
|
public const string AndroidImportLoginsFlow = "import-logins-flow";
|
|
|
|
|
|
public const string AppReviewPrompt = "app-review-prompt";
|
|
|
|
|
|
public const string AndroidMutualTls = "mutual-tls";
|
2025-01-28 13:39:19 -05:00
|
|
|
|
public const string SingleTapPasskeyCreation = "single-tap-passkey-creation";
|
|
|
|
|
|
public const string SingleTapPasskeyAuthentication = "single-tap-passkey-authentication";
|
2025-02-03 09:35:38 -05:00
|
|
|
|
public const string EnablePMAuthenticatorSync = "enable-pm-bwa-sync";
|
2025-02-12 10:21:12 -05:00
|
|
|
|
public const string PM3503_MobileAnonAddySelfHostAlias = "anon-addy-self-host-alias";
|
2025-03-14 13:22:22 -04:00
|
|
|
|
public const string PM3553_MobileSimpleLoginSelfHostAlias = "simple-login-self-host-alias";
|
2025-04-09 12:17:04 -04:00
|
|
|
|
public const string EnablePMFlightRecorder = "enable-pm-flight-recorder";
|
|
|
|
|
|
public const string MobileErrorReporting = "mobile-error-reporting";
|
2025-04-18 12:47:54 -04:00
|
|
|
|
public const string AndroidChromeAutofill = "android-chrome-autofill";
|
2025-06-17 10:48:11 -04:00
|
|
|
|
public const string UserManagedPrivilegedApps = "pm-18970-user-managed-privileged-apps";
|
2025-06-10 15:50:22 -04:00
|
|
|
|
public const string EnablePMPreloginSettings = "enable-pm-prelogin-settings";
|
2025-06-10 17:27:51 -03:00
|
|
|
|
public const string AppIntents = "app-intents";
|
2025-08-13 18:38:00 -04:00
|
|
|
|
public const string SendAccess = "pm-19394-send-access-control";
|
2025-03-30 16:03:09 -04:00
|
|
|
|
|
|
|
|
|
|
/* Platform Team */
|
2025-04-09 09:14:57 +02:00
|
|
|
|
public const string IpcChannelFramework = "ipc-channel-framework";
|
2025-07-10 20:07:57 -04:00
|
|
|
|
public const string PushNotificationsWhenLocked = "pm-19388-push-notifications-when-locked";
|
2025-09-02 12:44:28 -04:00
|
|
|
|
public const string PushNotificationsWhenInactive = "pm-25130-receive-push-notifications-for-inactive-users";
|
2025-03-30 16:03:09 -04:00
|
|
|
|
|
|
|
|
|
|
/* Tools Team */
|
|
|
|
|
|
public const string DesktopSendUIRefresh = "desktop-send-ui-refresh";
|
2025-07-15 07:38:14 -04:00
|
|
|
|
public const string UseSdkPasswordGenerators = "pm-19976-use-sdk-password-generators";
|
2025-08-14 16:43:30 +02:00
|
|
|
|
public const string UseChromiumImporter = "pm-23982-chromium-importer";
|
2025-03-30 16:03:09 -04:00
|
|
|
|
|
|
|
|
|
|
/* Vault Team */
|
|
|
|
|
|
public const string PM8851_BrowserOnboardingNudge = "pm-8851-browser-onboarding-nudge";
|
|
|
|
|
|
public const string PM9111ExtensionPersistAddEditForm = "pm-9111-extension-persist-add-edit-form";
|
|
|
|
|
|
public const string SecurityTasks = "security-tasks";
|
|
|
|
|
|
public const string CipherKeyEncryption = "cipher-key-encryption";
|
2025-04-10 16:24:16 -04:00
|
|
|
|
public const string DesktopCipherForms = "pm-18520-desktop-cipher-forms";
|
2025-04-10 14:55:40 -04:00
|
|
|
|
public const string PM19941MigrateCipherDomainToSdk = "pm-19941-migrate-cipher-domain-to-sdk";
|
2025-04-16 15:38:09 -07:00
|
|
|
|
public const string EndUserNotifications = "pm-10609-end-user-notifications";
|
2025-04-30 11:03:59 -04:00
|
|
|
|
public const string PhishingDetection = "phishing-detection";
|
2025-05-28 10:37:10 -04:00
|
|
|
|
public const string RemoveCardItemTypePolicy = "pm-16442-remove-card-item-type-policy";
|
2025-06-18 09:29:48 -05:00
|
|
|
|
public const string PM22134SdkCipherListView = "pm-22134-sdk-cipher-list-view";
|
2025-06-24 13:02:07 -05:00
|
|
|
|
public const string PM19315EndUserActivationMvp = "pm-19315-end-user-activation-mvp";
|
2025-07-09 08:26:49 -07:00
|
|
|
|
public const string PM22136_SdkCipherEncryption = "pm-22136-sdk-cipher-encryption";
|
2024-08-30 16:45:38 -04:00
|
|
|
|
|
2025-09-12 13:24:30 -04:00
|
|
|
|
/* Innovation Team */
|
|
|
|
|
|
public const string ArchiveVaultItems = "pm-19148-innovation-archive";
|
|
|
|
|
|
|
2023-03-10 08:11:11 -05:00
|
|
|
|
public static List<string> GetAllKeys()
|
|
|
|
|
|
{
|
|
|
|
|
|
return typeof(FeatureFlagKeys).GetFields(BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy)
|
|
|
|
|
|
.Where(fi => fi.IsLiteral && !fi.IsInitOnly && fi.FieldType == typeof(string))
|
|
|
|
|
|
.Select(x => (string)x.GetRawConstantValue())
|
|
|
|
|
|
.ToList();
|
|
|
|
|
|
}
|
2023-09-01 07:06:21 -04:00
|
|
|
|
|
|
|
|
|
|
public static Dictionary<string, string> GetLocalOverrideFlagValues()
|
|
|
|
|
|
{
|
|
|
|
|
|
// place overriding values when needed locally (offline), or return null
|
2025-04-21 12:36:38 -04:00
|
|
|
|
return null;
|
2023-09-01 07:06:21 -04:00
|
|
|
|
}
|
2023-03-07 13:46:52 -05:00
|
|
|
|
}
|