Fix Error 500 when application settings are saved

Due to a Rails bug, fetching the application settings from Redis
may prevent the attribute methods from being loaded for the `ApplicationSetting`
model. More details here: https://github.com/rails/rails/issues/27348

There was also a secondary problem introduced by overriding these
association methods which caused all default visibility levels to be
set to `nil`. Before, the previous implementation allowed the string
"20" to be saved as an integer, while now a table lookup happens
before that. We fix this by enforcing the integer value in the
controller and default to PRIVATE.

Closes #29674
This commit is contained in:
Stan Hu 2017-03-18 02:29:25 -07:00
parent 5d71d9fb9d
commit 681af5bc4f
3 changed files with 29 additions and 0 deletions

View file

@ -45,6 +45,18 @@ class Admin::ApplicationSettingsController < Admin::ApplicationController
end
def application_setting_params
default_visibilities = [:default_project_visibility, :default_snippet_visibility, :default_group_visibility]
default_visibilities.each do |visibility|
value = params[:application_setting][visibility]
params[:application_setting][visibility] =
if value.present?
value.to_i
else
Gitlab::VisibilityLevel::PRIVATE
end
end
restricted_levels = params[:application_setting][:restricted_visibility_levels]
if restricted_levels.nil?
params[:application_setting][:restricted_visibility_levels] = []

View file

@ -163,6 +163,8 @@ class ApplicationSetting < ActiveRecord::Base
end
def self.current
ensure_cache_setup
Rails.cache.fetch(CACHE_KEY) do
ApplicationSetting.last
end
@ -176,9 +178,16 @@ class ApplicationSetting < ActiveRecord::Base
end
def self.cached
ensure_cache_setup
Rails.cache.fetch(CACHE_KEY)
end
def self.ensure_cache_setup
# This is a workaround for a Rails bug that causes attribute methods not
# to be loaded when read from cache: https://github.com/rails/rails/issues/27348
ApplicationSetting.define_attribute_methods
end
def self.defaults_ce
{
after_sign_up_text: nil,

View file

@ -9,6 +9,14 @@ feature 'Admin updates settings', feature: true do
visit admin_application_settings_path
end
scenario 'Change visibility settings' do
first(:radio_button, 'Public').set(true)
click_button 'Save'
expect(page).to have_content "Application settings saved successfully"
expect(ApplicationSetting.current.default_project_visibility).to eq(Gitlab::VisibilityLevel::PUBLIC)
end
scenario 'Change application settings' do
uncheck 'Gravatar enabled'
fill_in 'Home page URL', with: 'https://about.gitlab.com/'