98bb435f42
Migrations shouldn't fail RuboCop checks - especially lint checks, such as the nested method check. To avoid changing code in existing migrations, add the magic comment to the top of each of them to skip that file.
46 lines
2 KiB
Ruby
46 lines
2 KiB
Ruby
# rubocop:disable all
|
|
class FixIdentities < ActiveRecord::Migration
|
|
def up
|
|
# Up until now, legacy 'ldap' references in the database were charitably
|
|
# interpreted to point to the first LDAP server specified in the GitLab
|
|
# configuration. So if the database said 'provider: ldap' but the first
|
|
# LDAP server was called 'ldapmain', then we would try to interpret
|
|
# 'provider: ldap' as if it said 'provider: ldapmain'. This migration (and
|
|
# accompanying changes in the GitLab LDAP code) get rid of this complicated
|
|
# behavior. Any database references to 'provider: ldap' get rewritten to
|
|
# whatever the code would have interpreted it as, i.e. as a reference to
|
|
# the first LDAP server specified in gitlab.yml / gitlab.rb.
|
|
new_provider = if Gitlab.config.ldap.enabled
|
|
first_ldap_server = Gitlab.config.ldap.servers.values.first
|
|
first_ldap_server['provider_name']
|
|
else
|
|
'ldapmain'
|
|
end
|
|
|
|
# Delete duplicate identities
|
|
# We use a sort of self-join to find rows in identities which match on
|
|
# user_id but where one has provider 'ldap'. We delete the duplicate row
|
|
# with provider 'ldap'.
|
|
delete_statement = ''
|
|
case adapter_name.downcase
|
|
when /^mysql/
|
|
delete_statement << 'DELETE FROM id1 USING identities AS id1, identities AS id2'
|
|
when 'postgresql'
|
|
delete_statement << 'DELETE FROM identities AS id1 USING identities AS id2'
|
|
else
|
|
raise "Unknown DB adapter: #{adapter_name}"
|
|
end
|
|
delete_statement << " WHERE id1.user_id = id2.user_id AND id1.provider = 'ldap' AND id2.provider = '#{new_provider}'"
|
|
execute delete_statement
|
|
|
|
# Update legacy identities
|
|
execute "UPDATE identities SET provider = '#{new_provider}' WHERE provider = 'ldap'"
|
|
|
|
if table_exists?('ldap_group_links')
|
|
execute "UPDATE ldap_group_links SET provider = '#{new_provider}' WHERE provider IS NULL OR provider = 'ldap'"
|
|
end
|
|
end
|
|
|
|
def down
|
|
end
|
|
end
|