summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorDouwe Maan <douwe@gitlab.com>2015-08-17 18:09:45 +0200
committerDouwe Maan <douwe@gitlab.com>2015-08-17 16:39:22 -0700
commitc16b1651f5e20caffdbb716ff52857c47326a9b6 (patch)
tree50ea90dcbefca492399526b3dacf135df41f6c50 /lib
parent9f7c7c857b97c8124ed9af36218c3cad2c6a7fc3 (diff)
downloadgitlab-ce-c16b1651f5e20caffdbb716ff52857c47326a9b6.tar.gz
Fix infinite loop when SAML was incorrectly configured.fix-authhash-infinite-loop
Diffstat (limited to 'lib')
-rw-r--r--lib/gitlab/o_auth/auth_hash.rb46
1 files changed, 30 insertions, 16 deletions
diff --git a/lib/gitlab/o_auth/auth_hash.rb b/lib/gitlab/o_auth/auth_hash.rb
index 0f16c925900..9b8e783d16c 100644
--- a/lib/gitlab/o_auth/auth_hash.rb
+++ b/lib/gitlab/o_auth/auth_hash.rb
@@ -9,49 +9,63 @@ module Gitlab
end
def uid
- Gitlab::Utils.force_utf8(auth_hash.uid.to_s)
+ @uid ||= Gitlab::Utils.force_utf8(auth_hash.uid.to_s)
end
def provider
- Gitlab::Utils.force_utf8(auth_hash.provider.to_s)
+ @provider ||= Gitlab::Utils.force_utf8(auth_hash.provider.to_s)
end
def info
auth_hash.info
end
- def name
- Gitlab::Utils.force_utf8((info.try(:name) || full_name).to_s)
+ def get_info(key)
+ value = info.try(key)
+ Gitlab::Utils.force_utf8(value) if value
+ value
end
- def full_name
- Gitlab::Utils.force_utf8("#{info.first_name} #{info.last_name}")
+ def name
+ @name ||= get_info(:name) || "#{get_info(:first_name)} #{get_info(:last_name)}"
end
def username
- Gitlab::Utils.force_utf8(
- (info.try(:nickname) || generate_username).to_s
- )
+ @username ||= username_and_email[:username].to_s
end
def email
- Gitlab::Utils.force_utf8(
- (info.try(:email) || generate_temporarily_email).downcase
- )
+ @email ||= username_and_email[:email].to_s
end
def password
- devise_friendly_token = Devise.friendly_token[0, 8].downcase
- @password ||= Gitlab::Utils.force_utf8(devise_friendly_token)
+ @password ||= Gitlab::Utils.force_utf8(Devise.friendly_token[0, 8].downcase)
+ end
+
+ private
+
+ def username_and_email
+ @username_and_email ||= begin
+ username = get_info(:nickname) || get_info(:username)
+ email = get_info(:email)
+
+ username ||= generate_username(email) if email
+ email ||= generate_temporarily_email(username) if username
+
+ {
+ username: username,
+ email: email
+ }
+ end
end
# Get the first part of the email address (before @)
# In addtion in removes illegal characters
- def generate_username
+ def generate_username(email)
email.match(/^[^@]*/)[0].parameterize
end
- def generate_temporarily_email
+ def generate_temporarily_email(username)
"temp-email-for-oauth-#{username}@gitlab.localhost"
end
end