Commit b45e92646e3f91c60e25197d68f72f50b1754c99
1 parent
cdc4d64d
Exists in
master
and in
4 other branches
Added Gitlab::OAuth::User class
Authenticate or create users from OAuth providers
Showing
1 changed file
with
85 additions
and
0 deletions
Show diff stats
| @@ -0,0 +1,85 @@ | @@ -0,0 +1,85 @@ | ||
| 1 | +# OAuth extension for User model | ||
| 2 | +# | ||
| 3 | +# * Find GitLab user based on omniauth uid and provider | ||
| 4 | +# * Create new user from omniauth data | ||
| 5 | +# | ||
| 6 | +module Gitlab | ||
| 7 | + module OAuth | ||
| 8 | + class User | ||
| 9 | + class << self | ||
| 10 | + attr_reader :auth | ||
| 11 | + | ||
| 12 | + def find(auth) | ||
| 13 | + @auth = auth | ||
| 14 | + find_by_uid_and_provider | ||
| 15 | + end | ||
| 16 | + | ||
| 17 | + def create(auth) | ||
| 18 | + @auth = auth | ||
| 19 | + password = Devise.friendly_token[0, 8].downcase | ||
| 20 | + opts = { | ||
| 21 | + extern_uid: uid, | ||
| 22 | + provider: provider, | ||
| 23 | + name: name, | ||
| 24 | + username: username, | ||
| 25 | + email: email, | ||
| 26 | + password: password, | ||
| 27 | + password_confirmation: password, | ||
| 28 | + } | ||
| 29 | + | ||
| 30 | + user = model.new(opts, as: :admin).with_defaults | ||
| 31 | + user.save! | ||
| 32 | + log.info "(OAuth) Creating user #{email} from login with extern_uid => #{uid}" | ||
| 33 | + | ||
| 34 | + if Gitlab.config.omniauth['block_auto_created_users'] && !ldap? | ||
| 35 | + user.block | ||
| 36 | + end | ||
| 37 | + | ||
| 38 | + user | ||
| 39 | + end | ||
| 40 | + | ||
| 41 | + private | ||
| 42 | + | ||
| 43 | + def find_by_uid_and_provider | ||
| 44 | + model.where(provider: provider, extern_uid: uid).last | ||
| 45 | + end | ||
| 46 | + | ||
| 47 | + def uid | ||
| 48 | + auth.info.uid || auth.uid | ||
| 49 | + end | ||
| 50 | + | ||
| 51 | + def email | ||
| 52 | + auth.info.email.downcase unless auth.info.email.nil? | ||
| 53 | + end | ||
| 54 | + | ||
| 55 | + def name | ||
| 56 | + auth.info.name.to_s.force_encoding("utf-8") | ||
| 57 | + end | ||
| 58 | + | ||
| 59 | + def username | ||
| 60 | + email.match(/^[^@]*/)[0] | ||
| 61 | + end | ||
| 62 | + | ||
| 63 | + def provider | ||
| 64 | + auth.provider | ||
| 65 | + end | ||
| 66 | + | ||
| 67 | + def log | ||
| 68 | + Gitlab::AppLogger | ||
| 69 | + end | ||
| 70 | + | ||
| 71 | + def model | ||
| 72 | + ::User | ||
| 73 | + end | ||
| 74 | + | ||
| 75 | + def raise_error(message) | ||
| 76 | + raise OmniAuth::Error, "(OAuth) " + message | ||
| 77 | + end | ||
| 78 | + | ||
| 79 | + def ldap? | ||
| 80 | + provider == 'ldap' | ||
| 81 | + end | ||
| 82 | + end | ||
| 83 | + end | ||
| 84 | + end | ||
| 85 | +end |