2018-07-25 05:30:33 -04:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
2019-03-28 09:17:42 -04:00
|
|
|
class ApplicationSetting < ApplicationRecord
|
2018-05-04 13:23:50 -04:00
|
|
|
include CacheableAttributes
|
2016-10-06 17:17:11 -04:00
|
|
|
include CacheMarkdownField
|
2015-12-10 04:48:37 -05:00
|
|
|
include TokenAuthenticatable
|
2018-10-23 06:58:41 -04:00
|
|
|
include ChronicDurationAttribute
|
2021-07-26 05:09:00 -04:00
|
|
|
include IgnorableColumns
|
2021-09-08 02:10:46 -04:00
|
|
|
include Sanitizable
|
2021-07-26 05:09:00 -04:00
|
|
|
|
|
|
|
ignore_columns %i[elasticsearch_shards elasticsearch_replicas], remove_with: '14.4', remove_after: '2021-09-22'
|
2022-01-06 10:16:10 -05:00
|
|
|
ignore_columns %i[static_objects_external_storage_auth_token], remove_with: '14.9', remove_after: '2022-03-22'
|
2022-02-03 19:13:53 -05:00
|
|
|
ignore_column %i[max_package_files_for_package_destruction], remove_with: '14.9', remove_after: '2022-03-22'
|
2019-11-12 13:06:57 -05:00
|
|
|
|
2020-10-13 02:09:09 -04:00
|
|
|
INSTANCE_REVIEW_MIN_USERS = 50
|
2020-03-04 16:07:54 -05:00
|
|
|
GRAFANA_URL_ERROR_MESSAGE = 'Please check your Grafana URL setting in ' \
|
|
|
|
'Admin Area > Settings > Metrics and profiling > Metrics - Grafana'
|
|
|
|
|
2020-11-28 16:09:37 -05:00
|
|
|
KROKI_URL_ERROR_MESSAGE = 'Please check your Kroki URL setting in ' \
|
|
|
|
'Admin Area > Settings > General > Kroki'
|
|
|
|
|
2021-04-27 11:09:52 -04:00
|
|
|
enum whats_new_variant: { all_tiers: 0, current_tier: 1, disabled: 2 }, _prefix: true
|
|
|
|
|
2020-07-20 14:09:27 -04:00
|
|
|
add_authentication_token_field :runners_registration_token, encrypted: -> { Feature.enabled?(:application_settings_tokens_optional_encryption) ? :optional : :required }
|
2016-05-09 19:21:22 -04:00
|
|
|
add_authentication_token_field :health_check_access_token
|
2022-01-06 10:16:10 -05:00
|
|
|
add_authentication_token_field :static_objects_external_storage_auth_token, encrypted: :required
|
2015-12-10 04:48:37 -05:00
|
|
|
|
2020-01-28 10:08:36 -05:00
|
|
|
belongs_to :self_monitoring_project, class_name: "Project", foreign_key: 'instance_administration_project_id'
|
2020-04-15 14:09:36 -04:00
|
|
|
belongs_to :push_rule
|
2020-01-28 10:08:36 -05:00
|
|
|
alias_attribute :self_monitoring_project_id, :instance_administration_project_id
|
|
|
|
|
2020-09-14 11:09:28 -04:00
|
|
|
belongs_to :instance_group, class_name: "Group", foreign_key: 'instance_administrators_group_id'
|
|
|
|
alias_attribute :instance_group_id, :instance_administrators_group_id
|
|
|
|
alias_attribute :instance_administrators_group, :instance_group
|
2019-08-07 14:40:36 -04:00
|
|
|
|
2021-09-08 02:10:46 -04:00
|
|
|
sanitizes! :default_branch_name
|
|
|
|
|
2021-02-16 22:08:59 -05:00
|
|
|
def self.kroki_formats_attributes
|
|
|
|
{
|
|
|
|
blockdiag: {
|
2021-07-20 11:10:07 -04:00
|
|
|
label: 'BlockDiag (includes BlockDiag, SeqDiag, ActDiag, NwDiag, PacketDiag, and RackDiag)'
|
2021-02-16 22:08:59 -05:00
|
|
|
},
|
|
|
|
bpmn: {
|
|
|
|
label: 'BPMN'
|
|
|
|
},
|
|
|
|
excalidraw: {
|
|
|
|
label: 'Excalidraw'
|
|
|
|
}
|
|
|
|
}
|
|
|
|
end
|
|
|
|
|
|
|
|
store_accessor :kroki_formats, *ApplicationSetting.kroki_formats_attributes.keys, prefix: true
|
2020-05-25 20:08:21 -04:00
|
|
|
|
2019-03-08 10:28:59 -05:00
|
|
|
# Include here so it can override methods from
|
|
|
|
# `add_authentication_token_field`
|
|
|
|
# We don't prepend for now because otherwise we'll need to
|
|
|
|
# fix a lot of tests using allow_any_instance_of
|
|
|
|
include ApplicationSettingImplementation
|
|
|
|
|
2017-07-03 10:01:41 -04:00
|
|
|
serialize :restricted_visibility_levels # rubocop:disable Cop/ActiveRecordSerialize
|
|
|
|
serialize :import_sources # rubocop:disable Cop/ActiveRecordSerialize
|
|
|
|
serialize :disabled_oauth_sign_in_sources, Array # rubocop:disable Cop/ActiveRecordSerialize
|
2020-11-10 07:08:57 -05:00
|
|
|
serialize :domain_allowlist, Array # rubocop:disable Cop/ActiveRecordSerialize
|
|
|
|
serialize :domain_denylist, Array # rubocop:disable Cop/ActiveRecordSerialize
|
2017-07-03 10:01:41 -04:00
|
|
|
serialize :repository_storages # rubocop:disable Cop/ActiveRecordSerialize
|
2021-03-03 10:10:53 -05:00
|
|
|
|
2021-02-03 13:09:25 -05:00
|
|
|
# See https://gitlab.com/gitlab-org/gitlab/-/issues/300916
|
2021-03-03 10:10:53 -05:00
|
|
|
serialize :asset_proxy_allowlist, Array # rubocop:disable Cop/ActiveRecordSerialize
|
2021-02-03 13:09:25 -05:00
|
|
|
serialize :asset_proxy_whitelist, Array # rubocop:disable Cop/ActiveRecordSerialize
|
2016-07-14 14:19:40 -04:00
|
|
|
|
2016-10-06 17:17:11 -04:00
|
|
|
cache_markdown_field :sign_in_text
|
|
|
|
cache_markdown_field :help_page_text
|
|
|
|
cache_markdown_field :shared_runners_text, pipeline: :plain_markdown
|
|
|
|
cache_markdown_field :after_sign_up_text
|
|
|
|
|
2017-10-05 15:56:23 -04:00
|
|
|
default_value_for :id, 1
|
2020-05-25 20:08:21 -04:00
|
|
|
default_value_for :repository_storages_weighted, {}
|
2021-02-16 22:08:59 -05:00
|
|
|
default_value_for :kroki_formats, {}
|
2017-10-05 15:56:23 -04:00
|
|
|
|
2018-10-23 06:58:41 -04:00
|
|
|
chronic_duration_attr_writer :archive_builds_in_human_readable, :archive_builds_in_seconds
|
|
|
|
|
2022-01-19 07:17:41 -05:00
|
|
|
chronic_duration_attr :runner_token_expiration_interval_human_readable, :runner_token_expiration_interval
|
|
|
|
chronic_duration_attr :group_runner_token_expiration_interval_human_readable, :group_runner_token_expiration_interval
|
|
|
|
chronic_duration_attr :project_runner_token_expiration_interval_human_readable, :project_runner_token_expiration_interval
|
|
|
|
|
2020-03-04 16:07:54 -05:00
|
|
|
validates :grafana_url,
|
|
|
|
system_hook_url: {
|
|
|
|
blocked_message: "is blocked: %{exception_message}. " + GRAFANA_URL_ERROR_MESSAGE
|
|
|
|
},
|
|
|
|
if: :grafana_url_absolute?
|
|
|
|
|
|
|
|
validate :validate_grafana_url
|
|
|
|
|
2017-04-24 15:12:05 -04:00
|
|
|
validates :uuid, presence: true
|
|
|
|
|
2019-07-24 13:59:38 -04:00
|
|
|
validates :outbound_local_requests_whitelist,
|
2019-07-31 02:54:03 -04:00
|
|
|
length: { maximum: 1_000, message: N_('is too long (maximum is 1000 entries)') },
|
|
|
|
allow_nil: false,
|
|
|
|
qualified_domain_array: true
|
2019-07-24 13:59:38 -04:00
|
|
|
|
2015-06-13 00:22:55 -04:00
|
|
|
validates :session_expire_delay,
|
2015-12-28 15:21:34 -05:00
|
|
|
presence: true,
|
|
|
|
numericality: { only_integer: true, greater_than_or_equal_to: 0 }
|
2015-03-01 10:06:46 -05:00
|
|
|
|
2019-12-16 07:07:43 -05:00
|
|
|
validates :minimum_password_length,
|
|
|
|
presence: true,
|
|
|
|
numericality: { only_integer: true,
|
|
|
|
greater_than_or_equal_to: DEFAULT_MINIMUM_PASSWORD_LENGTH,
|
|
|
|
less_than_or_equal_to: Devise.password_length.max }
|
|
|
|
|
2015-02-03 00:15:44 -05:00
|
|
|
validates :home_page_url,
|
2015-12-28 15:21:34 -05:00
|
|
|
allow_blank: true,
|
2019-04-11 02:29:07 -04:00
|
|
|
addressable_url: true,
|
2017-06-13 12:46:02 -04:00
|
|
|
if: :home_page_url_column_exists?
|
|
|
|
|
|
|
|
validates :help_page_support_url,
|
|
|
|
allow_blank: true,
|
2019-04-11 02:29:07 -04:00
|
|
|
addressable_url: true,
|
2017-06-13 12:46:02 -04:00
|
|
|
if: :help_page_support_url_column_exists?
|
2015-01-16 19:01:15 -05:00
|
|
|
|
2020-10-05 14:08:51 -04:00
|
|
|
validates :help_page_documentation_base_url,
|
|
|
|
length: { maximum: 255, message: _("is too long (maximum is %{count} characters)") },
|
|
|
|
allow_blank: true,
|
|
|
|
addressable_url: true
|
|
|
|
|
2015-05-29 11:42:27 -04:00
|
|
|
validates :after_sign_out_path,
|
2015-12-28 15:21:34 -05:00
|
|
|
allow_blank: true,
|
2019-04-11 02:29:07 -04:00
|
|
|
addressable_url: true
|
2015-05-29 11:42:27 -04:00
|
|
|
|
2020-09-25 20:09:35 -04:00
|
|
|
validates :abuse_notification_email,
|
2018-10-26 18:39:00 -04:00
|
|
|
devise_email: true,
|
2016-02-09 09:51:06 -05:00
|
|
|
allow_blank: true
|
2015-10-18 05:58:59 -04:00
|
|
|
|
2015-12-18 15:29:13 -05:00
|
|
|
validates :two_factor_grace_period,
|
2015-12-28 15:21:34 -05:00
|
|
|
numericality: { greater_than_or_equal_to: 0 }
|
|
|
|
|
|
|
|
validates :recaptcha_site_key,
|
|
|
|
presence: true,
|
2019-07-18 04:27:02 -04:00
|
|
|
if: :recaptcha_or_login_protection_enabled
|
2015-12-28 15:21:34 -05:00
|
|
|
|
|
|
|
validates :recaptcha_private_key,
|
|
|
|
presence: true,
|
2019-07-18 04:27:02 -04:00
|
|
|
if: :recaptcha_or_login_protection_enabled
|
2015-12-18 15:29:13 -05:00
|
|
|
|
2016-01-09 14:30:34 -05:00
|
|
|
validates :akismet_api_key,
|
|
|
|
presence: true,
|
|
|
|
if: :akismet_enabled
|
|
|
|
|
2021-04-30 14:10:09 -04:00
|
|
|
validates :spam_check_api_key,
|
|
|
|
length: { maximum: 2000, message: _('is too long (maximum is %{count} characters)') },
|
|
|
|
allow_blank: true
|
|
|
|
|
2017-02-17 08:04:10 -05:00
|
|
|
validates :unique_ips_limit_per_user,
|
|
|
|
numericality: { greater_than_or_equal_to: 1 },
|
|
|
|
presence: true,
|
|
|
|
if: :unique_ips_limit_enabled
|
|
|
|
|
|
|
|
validates :unique_ips_limit_time_window,
|
|
|
|
numericality: { greater_than_or_equal_to: 0 },
|
|
|
|
presence: true,
|
|
|
|
if: :unique_ips_limit_enabled
|
|
|
|
|
2020-11-28 16:09:37 -05:00
|
|
|
validates :kroki_url,
|
|
|
|
presence: { if: :kroki_enabled }
|
|
|
|
|
|
|
|
validate :validate_kroki_url, if: :kroki_enabled
|
|
|
|
|
2021-02-16 22:08:59 -05:00
|
|
|
validates :kroki_formats, json_schema: { filename: 'application_setting_kroki_formats' }
|
|
|
|
|
2016-11-28 12:41:29 -05:00
|
|
|
validates :plantuml_url,
|
|
|
|
presence: true,
|
|
|
|
if: :plantuml_enabled
|
|
|
|
|
2019-11-15 13:06:24 -05:00
|
|
|
validates :sourcegraph_url,
|
|
|
|
presence: true,
|
|
|
|
if: :sourcegraph_enabled
|
|
|
|
|
2020-09-16 14:09:47 -04:00
|
|
|
validates :gitpod_url,
|
|
|
|
presence: true,
|
|
|
|
addressable_url: { enforce_sanitization: true },
|
|
|
|
if: :gitpod_enabled
|
|
|
|
|
2021-06-29 14:07:04 -04:00
|
|
|
validates :mailgun_signing_key,
|
|
|
|
presence: true,
|
|
|
|
length: { maximum: 255 },
|
|
|
|
if: :mailgun_events_enabled
|
|
|
|
|
2019-08-14 15:21:58 -04:00
|
|
|
validates :snowplow_collector_hostname,
|
|
|
|
presence: true,
|
|
|
|
hostname: true,
|
|
|
|
if: :snowplow_enabled
|
|
|
|
|
2016-02-05 04:12:36 -05:00
|
|
|
validates :max_attachment_size,
|
|
|
|
presence: true,
|
|
|
|
numericality: { only_integer: true, greater_than: 0 }
|
|
|
|
|
2017-02-14 05:00:37 -05:00
|
|
|
validates :max_artifacts_size,
|
|
|
|
presence: true,
|
|
|
|
numericality: { only_integer: true, greater_than: 0 }
|
|
|
|
|
2020-06-09 11:08:05 -04:00
|
|
|
validates :max_import_size,
|
|
|
|
presence: true,
|
|
|
|
numericality: { only_integer: true, greater_than_or_equal_to: 0 }
|
|
|
|
|
2019-12-20 04:24:38 -05:00
|
|
|
validates :max_pages_size,
|
|
|
|
presence: true,
|
2020-03-26 17:07:52 -04:00
|
|
|
numericality: { only_integer: true, greater_than_or_equal_to: 0,
|
2019-12-20 04:24:38 -05:00
|
|
|
less_than: ::Gitlab::Pages::MAX_SIZE / 1.megabyte }
|
|
|
|
|
2021-09-16 14:11:32 -04:00
|
|
|
validates :jobs_per_stage_page_size,
|
|
|
|
presence: true,
|
|
|
|
numericality: { only_integer: true, greater_than_or_equal_to: 0 }
|
|
|
|
|
2017-02-24 04:28:24 -05:00
|
|
|
validates :default_artifacts_expire_in, presence: true, duration: true
|
2017-02-14 05:00:37 -05:00
|
|
|
|
2020-04-08 05:09:43 -04:00
|
|
|
validates :container_expiration_policies_enable_historic_entries,
|
2021-01-12 10:10:37 -05:00
|
|
|
inclusion: { in: [true, false], message: _('must be a boolean value') }
|
2020-04-08 05:09:43 -04:00
|
|
|
|
2016-05-30 11:12:50 -04:00
|
|
|
validates :container_registry_token_expire_delay,
|
|
|
|
presence: true,
|
|
|
|
numericality: { only_integer: true, greater_than: 0 }
|
|
|
|
|
2016-11-03 10:12:20 -04:00
|
|
|
validates :repository_storages, presence: true
|
|
|
|
validate :check_repository_storages
|
2020-05-25 20:08:21 -04:00
|
|
|
validate :check_repository_storages_weighted
|
2016-06-29 23:35:00 -04:00
|
|
|
|
2018-01-22 13:29:15 -05:00
|
|
|
validates :auto_devops_domain,
|
|
|
|
allow_blank: true,
|
|
|
|
hostname: { allow_numeric_hostname: true, require_valid_tld: true },
|
|
|
|
if: :auto_devops_enabled?
|
|
|
|
|
2016-06-29 15:30:27 -04:00
|
|
|
validates :enabled_git_access_protocol,
|
2020-01-27 16:08:47 -05:00
|
|
|
inclusion: { in: %w(ssh http), allow_blank: true }
|
2016-06-15 18:30:55 -04:00
|
|
|
|
2020-11-10 07:08:57 -05:00
|
|
|
validates :domain_denylist,
|
|
|
|
presence: { message: 'Domain denylist cannot be empty if denylist is enabled.' },
|
|
|
|
if: :domain_denylist_enabled?
|
2016-07-14 14:19:40 -04:00
|
|
|
|
2016-10-27 08:59:52 -04:00
|
|
|
validates :housekeeping_incremental_repack_period,
|
|
|
|
presence: true,
|
|
|
|
numericality: { only_integer: true, greater_than: 0 }
|
|
|
|
|
|
|
|
validates :housekeeping_full_repack_period,
|
|
|
|
presence: true,
|
2017-08-21 05:51:45 -04:00
|
|
|
numericality: { only_integer: true, greater_than_or_equal_to: :housekeeping_incremental_repack_period }
|
2016-10-27 08:59:52 -04:00
|
|
|
|
|
|
|
validates :housekeeping_gc_period,
|
|
|
|
presence: true,
|
2017-08-21 05:51:45 -04:00
|
|
|
numericality: { only_integer: true, greater_than_or_equal_to: :housekeeping_full_repack_period }
|
2016-10-27 08:59:52 -04:00
|
|
|
|
2017-01-26 13:16:50 -05:00
|
|
|
validates :terminal_max_session_time,
|
|
|
|
presence: true,
|
|
|
|
numericality: { only_integer: true, greater_than_or_equal_to: 0 }
|
|
|
|
|
2017-04-03 09:17:04 -04:00
|
|
|
validates :polling_interval_multiplier,
|
|
|
|
presence: true,
|
|
|
|
numericality: { greater_than_or_equal_to: 0 }
|
|
|
|
|
2017-11-29 04:12:12 -05:00
|
|
|
validates :gitaly_timeout_default,
|
|
|
|
presence: true,
|
2020-03-03 10:08:08 -05:00
|
|
|
if: :gitaly_timeout_default_changed?,
|
2020-01-13 10:07:53 -05:00
|
|
|
numericality: {
|
|
|
|
only_integer: true,
|
|
|
|
greater_than_or_equal_to: 0,
|
|
|
|
less_than_or_equal_to: Settings.gitlab.max_request_duration_seconds
|
|
|
|
}
|
2017-11-29 04:12:12 -05:00
|
|
|
|
|
|
|
validates :gitaly_timeout_medium,
|
|
|
|
presence: true,
|
2020-03-03 10:08:08 -05:00
|
|
|
if: :gitaly_timeout_medium_changed?,
|
2017-11-29 04:12:12 -05:00
|
|
|
numericality: { only_integer: true, greater_than_or_equal_to: 0 }
|
|
|
|
validates :gitaly_timeout_medium,
|
|
|
|
numericality: { less_than_or_equal_to: :gitaly_timeout_default },
|
|
|
|
if: :gitaly_timeout_default
|
|
|
|
validates :gitaly_timeout_medium,
|
|
|
|
numericality: { greater_than_or_equal_to: :gitaly_timeout_fast },
|
|
|
|
if: :gitaly_timeout_fast
|
|
|
|
|
|
|
|
validates :gitaly_timeout_fast,
|
|
|
|
presence: true,
|
2020-03-03 10:08:08 -05:00
|
|
|
if: :gitaly_timeout_fast_changed?,
|
2017-11-29 04:12:12 -05:00
|
|
|
numericality: { only_integer: true, greater_than_or_equal_to: 0 }
|
|
|
|
validates :gitaly_timeout_fast,
|
|
|
|
numericality: { less_than_or_equal_to: :gitaly_timeout_default },
|
|
|
|
if: :gitaly_timeout_default
|
|
|
|
|
2018-09-24 11:30:49 -04:00
|
|
|
validates :diff_max_patch_bytes,
|
|
|
|
presence: true,
|
|
|
|
numericality: { only_integer: true,
|
|
|
|
greater_than_or_equal_to: Gitlab::Git::Diff::DEFAULT_MAX_PATCH_BYTES,
|
|
|
|
less_than_or_equal_to: Gitlab::Git::Diff::MAX_PATCH_BYTES_UPPER_BOUND }
|
|
|
|
|
2021-06-15 02:10:17 -04:00
|
|
|
validates :diff_max_files,
|
|
|
|
presence: true,
|
|
|
|
numericality: { only_integer: true,
|
|
|
|
greater_than_or_equal_to: Commit::DEFAULT_MAX_DIFF_FILES_SETTING,
|
|
|
|
less_than_or_equal_to: Commit::MAX_DIFF_FILES_SETTING_UPPER_BOUND }
|
|
|
|
|
|
|
|
validates :diff_max_lines,
|
|
|
|
presence: true,
|
|
|
|
numericality: { only_integer: true,
|
|
|
|
greater_than_or_equal_to: Commit::DEFAULT_MAX_DIFF_LINES_SETTING,
|
|
|
|
less_than_or_equal_to: Commit::MAX_DIFF_LINES_SETTING_UPPER_BOUND }
|
|
|
|
|
2018-08-30 08:53:06 -04:00
|
|
|
validates :user_default_internal_regex, js_regex: true, allow_nil: true
|
|
|
|
|
2020-12-15 10:09:59 -05:00
|
|
|
validates :personal_access_token_prefix,
|
2021-07-14 14:08:31 -04:00
|
|
|
format: { with: %r{\A[a-zA-Z0-9_+=/@:.-]+\z},
|
2020-12-15 10:09:59 -05:00
|
|
|
message: _("can contain only letters of the Base64 alphabet (RFC4648) with the addition of '@', ':' and '.'") },
|
|
|
|
length: { maximum: 20, message: _('is too long (maximum is %{count} characters)') },
|
|
|
|
allow_blank: true
|
|
|
|
|
2018-11-07 06:00:21 -05:00
|
|
|
validates :commit_email_hostname, format: { with: /\A[^@]+\z/ }
|
|
|
|
|
2018-10-23 06:58:41 -04:00
|
|
|
validates :archive_builds_in_seconds,
|
|
|
|
allow_nil: true,
|
|
|
|
numericality: { only_integer: true, greater_than_or_equal_to: 1.day.seconds }
|
|
|
|
|
2019-01-31 06:28:31 -05:00
|
|
|
validates :local_markdown_version,
|
|
|
|
allow_nil: true,
|
|
|
|
numericality: { only_integer: true, greater_than_or_equal_to: 0, less_than: 65536 }
|
|
|
|
|
2019-02-20 18:51:55 -05:00
|
|
|
validates :asset_proxy_url,
|
|
|
|
presence: true,
|
|
|
|
allow_blank: false,
|
|
|
|
url: true,
|
|
|
|
if: :asset_proxy_enabled?
|
|
|
|
|
|
|
|
validates :asset_proxy_secret_key,
|
|
|
|
presence: true,
|
|
|
|
allow_blank: false,
|
|
|
|
if: :asset_proxy_enabled?
|
|
|
|
|
2019-07-22 10:56:40 -04:00
|
|
|
validates :static_objects_external_storage_url,
|
|
|
|
addressable_url: true, allow_blank: true
|
|
|
|
|
|
|
|
validates :static_objects_external_storage_auth_token,
|
|
|
|
presence: true,
|
|
|
|
if: :static_objects_external_storage_url?
|
|
|
|
|
2019-09-26 17:06:29 -04:00
|
|
|
validates :protected_paths,
|
|
|
|
length: { maximum: 100, message: N_('is too long (maximum is 100 entries)') },
|
|
|
|
allow_nil: false
|
|
|
|
|
2019-10-16 14:08:01 -04:00
|
|
|
validates :push_event_hooks_limit,
|
|
|
|
numericality: { greater_than_or_equal_to: 0 }
|
|
|
|
|
2019-10-17 08:07:33 -04:00
|
|
|
validates :push_event_activities_limit,
|
|
|
|
numericality: { greater_than_or_equal_to: 0 }
|
|
|
|
|
2019-12-02 07:06:45 -05:00
|
|
|
validates :snippet_size_limit, numericality: { only_integer: true, greater_than: 0 }
|
2020-08-14 02:10:12 -04:00
|
|
|
validates :wiki_page_max_content_bytes, numericality: { only_integer: true, greater_than_or_equal_to: 1.kilobytes }
|
2021-08-31 23:11:03 -04:00
|
|
|
validates :max_yaml_size_bytes, numericality: { only_integer: true, greater_than: 0 }, presence: true
|
|
|
|
validates :max_yaml_depth, numericality: { only_integer: true, greater_than: 0 }, presence: true
|
2019-12-02 07:06:45 -05:00
|
|
|
|
2020-03-23 20:09:24 -04:00
|
|
|
validates :email_restrictions, untrusted_regexp: true
|
2020-02-19 22:08:57 -05:00
|
|
|
|
2020-05-15 17:08:21 -04:00
|
|
|
validates :hashed_storage_enabled, inclusion: { in: [true], message: _("Hashed storage can't be disabled anymore for new projects") }
|
|
|
|
|
2020-09-02 05:10:23 -04:00
|
|
|
validates :container_registry_delete_tags_service_timeout,
|
2022-01-19 13:14:01 -05:00
|
|
|
:container_registry_cleanup_tags_service_max_list_size,
|
|
|
|
:container_registry_expiration_policies_worker_capacity,
|
2020-09-02 05:10:23 -04:00
|
|
|
numericality: { only_integer: true, greater_than_or_equal_to: 0 }
|
|
|
|
|
2022-01-19 13:14:01 -05:00
|
|
|
validates :container_registry_import_max_tags_count,
|
|
|
|
:container_registry_import_max_retries,
|
|
|
|
:container_registry_import_start_max_retries,
|
|
|
|
:container_registry_import_max_step_duration,
|
|
|
|
allow_nil: false,
|
2021-01-11 10:10:32 -05:00
|
|
|
numericality: { only_integer: true, greater_than_or_equal_to: 0 }
|
|
|
|
|
2022-01-19 13:14:01 -05:00
|
|
|
validates :container_registry_import_target_plan, presence: true
|
|
|
|
validates :container_registry_import_created_before, presence: true
|
2021-09-29 14:12:42 -04:00
|
|
|
|
|
|
|
validates :dependency_proxy_ttl_group_policy_worker_capacity,
|
|
|
|
allow_nil: false,
|
|
|
|
numericality: { only_integer: true, greater_than_or_equal_to: 0 }
|
2020-10-26 14:08:27 -04:00
|
|
|
|
2022-01-18 10:14:54 -05:00
|
|
|
validates :packages_cleanup_package_file_worker_capacity,
|
|
|
|
allow_nil: false,
|
|
|
|
numericality: { only_integer: true, greater_than_or_equal_to: 0 }
|
|
|
|
|
2021-01-12 10:10:37 -05:00
|
|
|
validates :invisible_captcha_enabled,
|
|
|
|
inclusion: { in: [true, false], message: _('must be a boolean value') }
|
|
|
|
|
2017-08-25 09:08:48 -04:00
|
|
|
SUPPORTED_KEY_TYPES.each do |type|
|
2017-08-28 16:58:36 -04:00
|
|
|
validates :"#{type}_key_restriction", presence: true, key_restriction: { type: type }
|
2017-08-25 09:08:48 -04:00
|
|
|
end
|
2017-08-21 06:30:03 -04:00
|
|
|
|
2017-08-30 16:20:00 -04:00
|
|
|
validates :allowed_key_types, presence: true
|
|
|
|
|
2015-03-01 10:06:46 -05:00
|
|
|
validates_each :restricted_visibility_levels do |record, attr, value|
|
2017-02-07 09:16:46 -05:00
|
|
|
value&.each do |level|
|
2017-06-02 13:11:26 -04:00
|
|
|
unless Gitlab::VisibilityLevel.options.value?(level)
|
2019-04-12 08:28:07 -04:00
|
|
|
record.errors.add(attr, _("'%{level}' is not a valid visibility level") % { level: level })
|
2015-03-01 10:06:46 -05:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2015-08-12 02:13:20 -04:00
|
|
|
validates_each :import_sources do |record, attr, value|
|
2017-02-07 09:16:46 -05:00
|
|
|
value&.each do |source|
|
2017-06-02 13:11:26 -04:00
|
|
|
unless Gitlab::ImportSources.options.value?(source)
|
2019-04-12 08:28:07 -04:00
|
|
|
record.errors.add(attr, _("'%{source}' is not a import source") % { source: source })
|
2015-08-12 02:13:20 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2021-06-21 17:08:33 -04:00
|
|
|
validate :check_valid_runner_registrars
|
|
|
|
|
2018-04-24 12:28:04 -04:00
|
|
|
validate :terms_exist, if: :enforce_terms?
|
|
|
|
|
2019-04-09 11:38:58 -04:00
|
|
|
validates :external_authorization_service_default_label,
|
|
|
|
presence: true,
|
|
|
|
if: :external_authorization_service_enabled
|
|
|
|
|
|
|
|
validates :external_authorization_service_url,
|
2019-04-11 02:29:07 -04:00
|
|
|
addressable_url: true, allow_blank: true,
|
2019-04-09 11:38:58 -04:00
|
|
|
if: :external_authorization_service_enabled
|
|
|
|
|
|
|
|
validates :external_authorization_service_timeout,
|
|
|
|
numericality: { greater_than: 0, less_than_or_equal_to: 10 },
|
|
|
|
if: :external_authorization_service_enabled
|
|
|
|
|
2020-05-22 05:08:09 -04:00
|
|
|
validates :spam_check_endpoint_url,
|
2021-12-10 19:15:10 -05:00
|
|
|
addressable_url: { schemes: %w(tls grpc) }, allow_blank: true
|
2020-05-22 05:08:09 -04:00
|
|
|
|
|
|
|
validates :spam_check_endpoint_url,
|
|
|
|
presence: true,
|
|
|
|
if: :spam_check_endpoint_enabled
|
|
|
|
|
2019-04-09 11:38:58 -04:00
|
|
|
validates :external_auth_client_key,
|
|
|
|
presence: true,
|
|
|
|
if: -> (setting) { setting.external_auth_client_cert.present? }
|
|
|
|
|
2019-04-27 00:38:01 -04:00
|
|
|
validates :lets_encrypt_notification_email,
|
|
|
|
devise_email: true,
|
|
|
|
format: { without: /@example\.(com|org|net)\z/,
|
|
|
|
message: N_("Let's Encrypt does not accept emails on example.com") },
|
|
|
|
allow_blank: true
|
|
|
|
|
|
|
|
validates :lets_encrypt_notification_email,
|
|
|
|
presence: true,
|
|
|
|
if: :lets_encrypt_terms_of_service_accepted?
|
|
|
|
|
2019-11-08 01:06:24 -05:00
|
|
|
validates :eks_integration_enabled,
|
|
|
|
inclusion: { in: [true, false] }
|
|
|
|
|
|
|
|
validates :eks_account_id,
|
|
|
|
format: { with: Gitlab::Regex.aws_account_id_regex,
|
|
|
|
message: Gitlab::Regex.aws_account_id_message },
|
|
|
|
if: :eks_integration_enabled?
|
|
|
|
|
|
|
|
validates :eks_access_key_id,
|
|
|
|
length: { in: 16..128 },
|
2020-12-09 16:09:43 -05:00
|
|
|
if: -> (setting) { setting.eks_integration_enabled? && setting.eks_access_key_id.present? }
|
2019-11-08 01:06:24 -05:00
|
|
|
|
|
|
|
validates :eks_secret_access_key,
|
|
|
|
presence: true,
|
2020-12-09 16:09:43 -05:00
|
|
|
if: -> (setting) { setting.eks_integration_enabled? && setting.eks_access_key_id.present? }
|
2019-11-08 01:06:24 -05:00
|
|
|
|
2019-04-09 11:38:58 -04:00
|
|
|
validates_with X509CertificateCredentialsValidator,
|
|
|
|
certificate: :external_auth_client_cert,
|
|
|
|
pkey: :external_auth_client_key,
|
|
|
|
pass: :external_auth_client_key_pass,
|
|
|
|
if: -> (setting) { setting.external_auth_client_cert.present? }
|
|
|
|
|
2019-11-13 10:07:29 -05:00
|
|
|
validates :default_ci_config_path,
|
|
|
|
format: { without: %r{(\.{2}|\A/)},
|
|
|
|
message: N_('cannot include leading slash or directory traversal.') },
|
|
|
|
length: { maximum: 255 },
|
|
|
|
allow_blank: true
|
|
|
|
|
2020-04-22 05:09:36 -04:00
|
|
|
validates :issues_create_limit,
|
2020-04-28 20:09:38 -04:00
|
|
|
numericality: { only_integer: true, greater_than_or_equal_to: 0 }
|
|
|
|
|
|
|
|
validates :raw_blob_request_limit,
|
|
|
|
numericality: { only_integer: true, greater_than_or_equal_to: 0 }
|
2020-04-22 05:09:36 -04:00
|
|
|
|
2020-10-22 08:08:41 -04:00
|
|
|
validates :ci_jwt_signing_key,
|
|
|
|
rsa_key: true, allow_nil: true
|
|
|
|
|
2021-08-02 23:08:59 -04:00
|
|
|
validates :customers_dot_jwt_signing_key,
|
|
|
|
rsa_key: true, allow_nil: true
|
|
|
|
|
2021-01-04 07:10:44 -05:00
|
|
|
validates :rate_limiting_response_text,
|
|
|
|
length: { maximum: 255, message: _('is too long (maximum is %{count} characters)') },
|
|
|
|
allow_blank: true
|
|
|
|
|
2021-09-14 14:12:06 -04:00
|
|
|
with_options(presence: true, numericality: { only_integer: true, greater_than: 0 }) do
|
|
|
|
validates :throttle_unauthenticated_api_requests_per_period
|
|
|
|
validates :throttle_unauthenticated_api_period_in_seconds
|
|
|
|
validates :throttle_unauthenticated_requests_per_period
|
|
|
|
validates :throttle_unauthenticated_period_in_seconds
|
|
|
|
validates :throttle_unauthenticated_packages_api_requests_per_period
|
|
|
|
validates :throttle_unauthenticated_packages_api_period_in_seconds
|
|
|
|
validates :throttle_unauthenticated_files_api_requests_per_period
|
|
|
|
validates :throttle_unauthenticated_files_api_period_in_seconds
|
2021-09-28 08:11:10 -04:00
|
|
|
validates :throttle_unauthenticated_deprecated_api_requests_per_period
|
|
|
|
validates :throttle_unauthenticated_deprecated_api_period_in_seconds
|
2021-09-14 14:12:06 -04:00
|
|
|
validates :throttle_authenticated_api_requests_per_period
|
|
|
|
validates :throttle_authenticated_api_period_in_seconds
|
|
|
|
validates :throttle_authenticated_git_lfs_requests_per_period
|
|
|
|
validates :throttle_authenticated_git_lfs_period_in_seconds
|
|
|
|
validates :throttle_authenticated_web_requests_per_period
|
|
|
|
validates :throttle_authenticated_web_period_in_seconds
|
|
|
|
validates :throttle_authenticated_packages_api_requests_per_period
|
|
|
|
validates :throttle_authenticated_packages_api_period_in_seconds
|
|
|
|
validates :throttle_authenticated_files_api_requests_per_period
|
|
|
|
validates :throttle_authenticated_files_api_period_in_seconds
|
2021-09-28 08:11:10 -04:00
|
|
|
validates :throttle_authenticated_deprecated_api_requests_per_period
|
|
|
|
validates :throttle_authenticated_deprecated_api_period_in_seconds
|
2021-09-14 14:12:06 -04:00
|
|
|
validates :throttle_protected_paths_requests_per_period
|
|
|
|
validates :throttle_protected_paths_period_in_seconds
|
|
|
|
end
|
2021-01-07 16:10:18 -05:00
|
|
|
|
2021-02-09 16:09:19 -05:00
|
|
|
validates :notes_create_limit,
|
|
|
|
numericality: { only_integer: true, greater_than_or_equal_to: 0 }
|
|
|
|
|
2021-12-20 13:13:27 -05:00
|
|
|
validates :user_email_lookup_limit,
|
|
|
|
numericality: { only_integer: true, greater_than_or_equal_to: 0 }
|
|
|
|
|
2021-02-11 07:08:52 -05:00
|
|
|
validates :notes_create_limit_allowlist,
|
|
|
|
length: { maximum: 100, message: N_('is too long (maximum is 100 entries)') },
|
|
|
|
allow_nil: false
|
|
|
|
|
2021-03-17 20:08:58 -04:00
|
|
|
validates :admin_mode,
|
|
|
|
inclusion: { in: [true, false], message: _('must be a boolean value') }
|
|
|
|
|
2021-04-15 20:09:09 -04:00
|
|
|
validates :external_pipeline_validation_service_url,
|
|
|
|
addressable_url: true, allow_blank: true
|
|
|
|
|
|
|
|
validates :external_pipeline_validation_service_timeout,
|
|
|
|
allow_nil: true,
|
|
|
|
numericality: { only_integer: true, greater_than: 0 }
|
|
|
|
|
2021-04-27 11:09:52 -04:00
|
|
|
validates :whats_new_variant,
|
|
|
|
inclusion: { in: ApplicationSetting.whats_new_variants.keys }
|
|
|
|
|
2021-05-07 05:10:27 -04:00
|
|
|
validates :floc_enabled,
|
|
|
|
inclusion: { in: [true, false], message: _('must be a boolean value') }
|
|
|
|
|
2021-09-13 14:11:46 -04:00
|
|
|
enum sidekiq_job_limiter_mode: {
|
|
|
|
Gitlab::SidekiqMiddleware::SizeLimiter::Validator::TRACK_MODE => 0,
|
|
|
|
Gitlab::SidekiqMiddleware::SizeLimiter::Validator::COMPRESS_MODE => 1 # The default
|
|
|
|
}
|
|
|
|
|
|
|
|
validates :sidekiq_job_limiter_mode,
|
|
|
|
inclusion: { in: self.sidekiq_job_limiter_modes }
|
|
|
|
validates :sidekiq_job_limiter_compression_threshold_bytes,
|
|
|
|
numericality: { only_integer: true, greater_than_or_equal_to: 0 }
|
|
|
|
validates :sidekiq_job_limiter_limit_bytes,
|
|
|
|
numericality: { only_integer: true, greater_than_or_equal_to: 0 }
|
|
|
|
|
2021-11-08 13:09:52 -05:00
|
|
|
validates :sentry_enabled,
|
|
|
|
inclusion: { in: [true, false], message: _('must be a boolean value') }
|
|
|
|
validates :sentry_dsn,
|
|
|
|
addressable_url: true, presence: true, length: { maximum: 255 },
|
|
|
|
if: :sentry_enabled?
|
|
|
|
validates :sentry_clientside_dsn,
|
|
|
|
addressable_url: true, allow_blank: true, length: { maximum: 255 },
|
|
|
|
if: :sentry_enabled?
|
|
|
|
validates :sentry_environment,
|
|
|
|
presence: true, length: { maximum: 255 },
|
|
|
|
if: :sentry_enabled?
|
|
|
|
|
2022-02-08 13:16:03 -05:00
|
|
|
validates :users_get_by_id_limit,
|
|
|
|
numericality: { only_integer: true, greater_than_or_equal_to: 0 }
|
|
|
|
validates :users_get_by_id_limit_allowlist,
|
|
|
|
length: { maximum: 100, message: N_('is too long (maximum is 100 entries)') },
|
|
|
|
allow_nil: false
|
|
|
|
|
2019-11-04 07:06:19 -05:00
|
|
|
attr_encrypted :asset_proxy_secret_key,
|
|
|
|
mode: :per_attribute_iv,
|
|
|
|
key: Settings.attr_encrypted_db_key_base_truncated,
|
|
|
|
algorithm: 'aes-256-cbc',
|
|
|
|
insecure_mode: true
|
|
|
|
|
2021-04-22 17:09:53 -04:00
|
|
|
private_class_method def self.encryption_options_base_32_aes_256_gcm
|
2019-11-05 05:08:31 -05:00
|
|
|
{
|
|
|
|
mode: :per_attribute_iv,
|
2021-04-22 17:09:53 -04:00
|
|
|
key: Settings.attr_encrypted_db_key_base_32,
|
2019-11-05 05:08:31 -05:00
|
|
|
algorithm: 'aes-256-gcm',
|
|
|
|
encode: true
|
|
|
|
}
|
|
|
|
end
|
2019-11-08 01:06:24 -05:00
|
|
|
|
2021-04-22 17:09:53 -04:00
|
|
|
attr_encrypted :external_auth_client_key, encryption_options_base_32_aes_256_gcm
|
|
|
|
attr_encrypted :external_auth_client_key_pass, encryption_options_base_32_aes_256_gcm
|
|
|
|
attr_encrypted :lets_encrypt_private_key, encryption_options_base_32_aes_256_gcm
|
|
|
|
attr_encrypted :eks_secret_access_key, encryption_options_base_32_aes_256_gcm
|
|
|
|
attr_encrypted :akismet_api_key, encryption_options_base_32_aes_256_gcm
|
2021-04-30 20:10:00 -04:00
|
|
|
attr_encrypted :spam_check_api_key, encryption_options_base_32_aes_256_gcm.merge(encode: false)
|
2021-04-22 17:09:53 -04:00
|
|
|
attr_encrypted :elasticsearch_aws_secret_access_key, encryption_options_base_32_aes_256_gcm
|
2021-05-12 23:10:19 -04:00
|
|
|
attr_encrypted :elasticsearch_password, encryption_options_base_32_aes_256_gcm.merge(encode: false)
|
2021-04-22 17:09:53 -04:00
|
|
|
attr_encrypted :recaptcha_private_key, encryption_options_base_32_aes_256_gcm
|
|
|
|
attr_encrypted :recaptcha_site_key, encryption_options_base_32_aes_256_gcm
|
|
|
|
attr_encrypted :slack_app_secret, encryption_options_base_32_aes_256_gcm
|
|
|
|
attr_encrypted :slack_app_verification_token, encryption_options_base_32_aes_256_gcm
|
|
|
|
attr_encrypted :ci_jwt_signing_key, encryption_options_base_32_aes_256_gcm
|
2021-08-02 23:08:59 -04:00
|
|
|
attr_encrypted :customers_dot_jwt_signing_key, encryption_options_base_32_aes_256_gcm
|
2021-04-22 17:09:53 -04:00
|
|
|
attr_encrypted :secret_detection_token_revocation_token, encryption_options_base_32_aes_256_gcm
|
|
|
|
attr_encrypted :cloud_license_auth_token, encryption_options_base_32_aes_256_gcm
|
|
|
|
attr_encrypted :external_pipeline_validation_service_token, encryption_options_base_32_aes_256_gcm
|
2021-06-29 14:07:04 -04:00
|
|
|
attr_encrypted :mailgun_signing_key, encryption_options_base_32_aes_256_gcm.merge(encode: false)
|
2019-05-28 00:47:34 -04:00
|
|
|
|
2020-12-06 22:09:49 -05:00
|
|
|
validates :disable_feed_token,
|
2021-01-12 10:10:37 -05:00
|
|
|
inclusion: { in: [true, false], message: _('must be a boolean value') }
|
2020-12-06 22:09:49 -05:00
|
|
|
|
2017-04-24 15:12:05 -04:00
|
|
|
before_validation :ensure_uuid!
|
2021-03-11 10:09:10 -05:00
|
|
|
before_validation :coerce_repository_storages_weighted, if: :repository_storages_weighted_changed?
|
2021-09-08 02:10:46 -04:00
|
|
|
before_validation :normalize_default_branch_name
|
2017-08-21 06:30:03 -04:00
|
|
|
|
2015-12-10 07:05:59 -05:00
|
|
|
before_save :ensure_runners_registration_token
|
2016-05-09 19:21:22 -04:00
|
|
|
before_save :ensure_health_check_access_token
|
2015-12-10 07:05:59 -05:00
|
|
|
|
2015-11-12 04:19:03 -05:00
|
|
|
after_commit do
|
2018-04-24 12:28:04 -04:00
|
|
|
reset_memoized_terms
|
2017-03-18 05:29:25 -04:00
|
|
|
end
|
2018-05-25 12:44:15 -04:00
|
|
|
after_commit :expire_performance_bar_allowed_user_ids_cache, if: -> { previous_changes.key?('performance_bar_allowed_group_id') }
|
2019-03-18 09:32:26 -04:00
|
|
|
|
2020-03-04 16:07:54 -05:00
|
|
|
def validate_grafana_url
|
2020-11-28 16:09:37 -05:00
|
|
|
validate_url(parsed_grafana_url, :grafana_url, GRAFANA_URL_ERROR_MESSAGE)
|
2020-03-04 16:07:54 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
def grafana_url_absolute?
|
|
|
|
parsed_grafana_url&.absolute?
|
|
|
|
end
|
|
|
|
|
2020-11-28 16:09:37 -05:00
|
|
|
def validate_kroki_url
|
|
|
|
validate_url(parsed_kroki_url, :kroki_url, KROKI_URL_ERROR_MESSAGE)
|
|
|
|
end
|
|
|
|
|
|
|
|
def kroki_url_absolute?
|
|
|
|
parsed_kroki_url&.absolute?
|
|
|
|
end
|
|
|
|
|
2019-11-15 13:06:24 -05:00
|
|
|
def sourcegraph_url_is_com?
|
2021-07-14 14:08:31 -04:00
|
|
|
!!(sourcegraph_url =~ %r{\Ahttps://(www\.)?sourcegraph\.com})
|
2019-11-15 13:06:24 -05:00
|
|
|
end
|
|
|
|
|
2021-09-08 02:10:46 -04:00
|
|
|
def normalize_default_branch_name
|
|
|
|
self.default_branch_name = default_branch_name.presence
|
2021-08-05 05:08:56 -04:00
|
|
|
end
|
|
|
|
|
2020-10-13 02:09:09 -04:00
|
|
|
def instance_review_permitted?
|
|
|
|
users_count = Rails.cache.fetch('limited_users_count', expires_in: 1.day) do
|
|
|
|
::User.limit(INSTANCE_REVIEW_MIN_USERS + 1).count(:all)
|
|
|
|
end
|
|
|
|
|
|
|
|
users_count >= INSTANCE_REVIEW_MIN_USERS
|
|
|
|
end
|
|
|
|
|
2019-03-18 09:32:26 -04:00
|
|
|
def self.create_from_defaults
|
2020-09-01 11:10:39 -04:00
|
|
|
check_schema!
|
|
|
|
|
2021-08-23 14:11:07 -04:00
|
|
|
transaction(requires_new: true) do # rubocop:disable Performance/ActiveRecordSubtransactions
|
2019-04-10 06:03:37 -04:00
|
|
|
super
|
|
|
|
end
|
2019-03-18 09:32:26 -04:00
|
|
|
rescue ActiveRecord::RecordNotUnique
|
|
|
|
# We already have an ApplicationSetting record, so just return it.
|
|
|
|
current_without_cache
|
|
|
|
end
|
2021-02-09 04:09:19 -05:00
|
|
|
|
|
|
|
def self.find_or_create_without_cache
|
|
|
|
current_without_cache || create_from_defaults
|
|
|
|
end
|
2019-07-01 15:17:37 -04:00
|
|
|
|
2020-09-01 11:10:39 -04:00
|
|
|
# Due to the frequency with which settings are accessed, it is
|
|
|
|
# likely that during a backup restore a running GitLab process
|
|
|
|
# will insert a new `application_settings` row before the
|
|
|
|
# constraints have been added to the table. This would add an
|
|
|
|
# extra row with ID 1 and prevent the primary key constraint from
|
|
|
|
# being added, which made ActiveRecord throw a
|
|
|
|
# IrreversibleOrderError anytime the settings were accessed
|
|
|
|
# (https://gitlab.com/gitlab-org/gitlab/-/issues/36405). To
|
|
|
|
# prevent this from happening, we do a sanity check that the
|
|
|
|
# primary key constraint is present before inserting a new entry.
|
|
|
|
def self.check_schema!
|
2021-07-23 08:09:05 -04:00
|
|
|
return if connection.primary_key(self.table_name).present?
|
2020-09-01 11:10:39 -04:00
|
|
|
|
|
|
|
raise "The `#{self.table_name}` table is missing a primary key constraint in the database schema"
|
|
|
|
end
|
|
|
|
|
2019-07-01 15:17:37 -04:00
|
|
|
# By default, the backend is Rails.cache, which uses
|
|
|
|
# ActiveSupport::Cache::RedisStore. Since loading ApplicationSetting
|
|
|
|
# can cause a significant amount of load on Redis, let's cache it in
|
|
|
|
# memory.
|
|
|
|
def self.cache_backend
|
2020-05-06 17:10:00 -04:00
|
|
|
Gitlab::ProcessMemoryCache.cache_backend
|
2019-07-01 15:17:37 -04:00
|
|
|
end
|
2019-07-18 04:27:02 -04:00
|
|
|
|
|
|
|
def recaptcha_or_login_protection_enabled
|
|
|
|
recaptcha_enabled || login_recaptcha_protection_enabled
|
|
|
|
end
|
2020-02-19 22:08:57 -05:00
|
|
|
|
2021-02-16 22:08:59 -05:00
|
|
|
kroki_formats_attributes.keys.each do |key|
|
|
|
|
define_method :"kroki_formats_#{key}=" do |value|
|
|
|
|
super(::Gitlab::Utils.to_boolean(value))
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def kroki_format_supported?(diagram_type)
|
|
|
|
case diagram_type
|
|
|
|
when 'excalidraw'
|
|
|
|
return kroki_formats_excalidraw
|
|
|
|
when 'bpmn'
|
|
|
|
return kroki_formats_bpmn
|
|
|
|
end
|
|
|
|
|
|
|
|
return kroki_formats_blockdiag if ::Gitlab::Kroki::BLOCKDIAG_FORMATS.include?(diagram_type)
|
|
|
|
|
|
|
|
::AsciidoctorExtensions::Kroki::SUPPORTED_DIAGRAM_NAMES.include?(diagram_type)
|
|
|
|
end
|
|
|
|
|
2020-03-04 16:07:54 -05:00
|
|
|
private
|
|
|
|
|
|
|
|
def parsed_grafana_url
|
|
|
|
@parsed_grafana_url ||= Gitlab::Utils.parse_url(grafana_url)
|
|
|
|
end
|
2020-11-28 16:09:37 -05:00
|
|
|
|
|
|
|
def parsed_kroki_url
|
|
|
|
@parsed_kroki_url ||= Gitlab::UrlBlocker.validate!(kroki_url, schemes: %w(http https), enforce_sanitization: true)[0]
|
|
|
|
rescue Gitlab::UrlBlocker::BlockedUrlError => error
|
|
|
|
self.errors.add(
|
|
|
|
:kroki_url,
|
|
|
|
"is not valid. #{error}"
|
|
|
|
)
|
|
|
|
end
|
|
|
|
|
|
|
|
def validate_url(parsed_url, name, error_message)
|
|
|
|
unless parsed_url
|
|
|
|
self.errors.add(
|
|
|
|
name,
|
|
|
|
"must be a valid relative or absolute URL. #{error_message}"
|
|
|
|
)
|
|
|
|
end
|
|
|
|
end
|
2015-01-08 03:22:50 -05:00
|
|
|
end
|
2019-09-13 09:26:31 -04:00
|
|
|
|
2021-05-11 17:10:21 -04:00
|
|
|
ApplicationSetting.prepend_mod_with('ApplicationSetting')
|