application_setting.rb 7.7 KB
Newer Older
1 2
# frozen_string_literal: true

3
class ApplicationSetting < ActiveRecord::Base
4
  include CacheableAttributes
5
  include CacheMarkdownField
6
  include TokenAuthenticatable
Z
Zeger-Jan van de Weg 已提交
7
  include IgnorableColumn
8
  include ChronicDurationAttribute
9

10 11
  include ApplicationSettingImplementation

K
Kamil Trzciński 已提交
12
  add_authentication_token_field :runners_registration_token, encrypted: -> { Feature.enabled?(:application_settings_tokens_optional_encryption) ? :optional : :required }
13
  add_authentication_token_field :health_check_access_token
14

15 16 17 18 19 20
  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
  serialize :domain_whitelist, Array # rubocop:disable Cop/ActiveRecordSerialize
  serialize :domain_blacklist, Array # rubocop:disable Cop/ActiveRecordSerialize
  serialize :repository_storages # rubocop:disable Cop/ActiveRecordSerialize
21

Z
Zeger-Jan van de Weg 已提交
22 23 24 25 26
  ignore_column :circuitbreaker_failure_count_threshold
  ignore_column :circuitbreaker_failure_reset_time
  ignore_column :circuitbreaker_storage_timeout
  ignore_column :circuitbreaker_access_retries
  ignore_column :circuitbreaker_check_interval
27 28
  ignore_column :koding_url
  ignore_column :koding_enabled
Z
Zeger-Jan van de Weg 已提交
29

30 31 32 33 34
  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

35 36
  default_value_for :id, 1

37 38
  chronic_duration_attr_writer :archive_builds_in_human_readable, :archive_builds_in_seconds

39 40
  validates :uuid, presence: true

41
  validates :session_expire_delay,
42 43
            presence: true,
            numericality: { only_integer: true, greater_than_or_equal_to: 0 }
44

45
  validates :home_page_url,
46 47
            allow_blank: true,
            url: true,
R
Robin Bobbitt 已提交
48 49 50 51 52 53
            if: :home_page_url_column_exists?

  validates :help_page_support_url,
            allow_blank: true,
            url: true,
            if: :help_page_support_url_column_exists?
54

55
  validates :after_sign_out_path,
56 57
            allow_blank: true,
            url: true
58

D
Douwe Maan 已提交
59
  validates :admin_notification_email,
60
            devise_email: true,
61
            allow_blank: true
D
Douwe Maan 已提交
62

63
  validates :two_factor_grace_period,
64 65 66 67 68 69 70 71 72
            numericality: { greater_than_or_equal_to: 0 }

  validates :recaptcha_site_key,
            presence: true,
            if: :recaptcha_enabled

  validates :recaptcha_private_key,
            presence: true,
            if: :recaptcha_enabled
73

J
Jeroen Nijhof 已提交
74 75 76 77
  validates :sentry_dsn,
            presence: true,
            if: :sentry_enabled

78 79 80 81
  validates :clientside_sentry_dsn,
            presence: true,
            if: :clientside_sentry_enabled

82 83 84 85
  validates :akismet_api_key,
            presence: true,
            if: :akismet_enabled

P
Pawel Chojnacki 已提交
86 87 88 89 90 91 92 93 94 95
  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

96 97 98 99
  validates :plantuml_url,
            presence: true,
            if: :plantuml_enabled

100 101 102 103
  validates :max_attachment_size,
            presence: true,
            numericality: { only_integer: true, greater_than: 0 }

104 105 106 107
  validates :max_artifacts_size,
            presence: true,
            numericality: { only_integer: true, greater_than: 0 }

108
  validates :default_artifacts_expire_in, presence: true, duration: true
109

110 111 112 113
  validates :container_registry_token_expire_delay,
            presence: true,
            numericality: { only_integer: true, greater_than: 0 }

114 115
  validates :repository_storages, presence: true
  validate :check_repository_storages
116

117 118 119 120 121
  validates :auto_devops_domain,
            allow_blank: true,
            hostname: { allow_numeric_hostname: true, require_valid_tld: true },
            if: :auto_devops_enabled?

122
  validates :enabled_git_access_protocol,
123
            inclusion: { in: %w(ssh http), allow_blank: true, allow_nil: true }
124

125
  validates :domain_blacklist,
126
            presence: { message: 'Domain blacklist cannot be empty if Blacklist is enabled.' },
127 128
            if: :domain_blacklist_enabled?

J
Jacob Vosmaer 已提交
129 130 131 132 133 134
  validates :housekeeping_incremental_repack_period,
            presence: true,
            numericality: { only_integer: true, greater_than: 0 }

  validates :housekeeping_full_repack_period,
            presence: true,
135
            numericality: { only_integer: true, greater_than_or_equal_to: :housekeeping_incremental_repack_period }
J
Jacob Vosmaer 已提交
136 137 138

  validates :housekeeping_gc_period,
            presence: true,
139
            numericality: { only_integer: true, greater_than_or_equal_to: :housekeeping_full_repack_period }
J
Jacob Vosmaer 已提交
140

141 142 143 144
  validates :terminal_max_session_time,
            presence: true,
            numericality: { only_integer: true, greater_than_or_equal_to: 0 }

145 146 147 148
  validates :polling_interval_multiplier,
            presence: true,
            numericality: { greater_than_or_equal_to: 0 }

A
Andrew Newdigate 已提交
149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169
  validates :gitaly_timeout_default,
            presence: true,
            numericality: { only_integer: true, greater_than_or_equal_to: 0 }

  validates :gitaly_timeout_medium,
            presence: true,
            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,
            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

170 171 172 173 174 175
  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 }

176 177
  validates :user_default_internal_regex, js_regex: true, allow_nil: true

178 179
  validates :commit_email_hostname, format: { with: /\A[^@]+\z/ }

180 181 182 183
  validates :archive_builds_in_seconds,
            allow_nil: true,
            numericality: { only_integer: true, greater_than_or_equal_to: 1.day.seconds }

J
Jan Provaznik 已提交
184 185 186 187
  validates :local_markdown_version,
            allow_nil: true,
            numericality: { only_integer: true, greater_than_or_equal_to: 0, less_than: 65536 }

188
  SUPPORTED_KEY_TYPES.each do |type|
189
    validates :"#{type}_key_restriction", presence: true, key_restriction: { type: type }
190
  end
191

N
Nick Thomas 已提交
192 193
  validates :allowed_key_types, presence: true

194
  validates_each :restricted_visibility_levels do |record, attr, value|
Z
Z.J. van de Weg 已提交
195
    value&.each do |level|
196
      unless Gitlab::VisibilityLevel.options.value?(level)
Z
Z.J. van de Weg 已提交
197
        record.errors.add(attr, "'#{level}' is not a valid visibility level")
198 199 200 201
      end
    end
  end

202
  validates_each :import_sources do |record, attr, value|
Z
Z.J. van de Weg 已提交
203
    value&.each do |source|
204
      unless Gitlab::ImportSources.options.value?(source)
Z
Z.J. van de Weg 已提交
205
        record.errors.add(attr, "'#{source}' is not a import source")
206 207 208 209
      end
    end
  end

B
Bob Van Landuyt 已提交
210 211
  validate :terms_exist, if: :enforce_terms?

212
  before_validation :ensure_uuid!
S
Stan Hu 已提交
213
  before_validation :strip_sentry_values
214

215
  before_save :ensure_runners_registration_token
216
  before_save :ensure_health_check_access_token
217

218
  after_commit do
B
Bob Van Landuyt 已提交
219
    reset_memoized_terms
220
  end
221
  after_commit :expire_performance_bar_allowed_user_ids_cache, if: -> { previous_changes.key?('performance_bar_allowed_group_id') }
222
end