Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
G
gitlab-ce
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
1
Merge Requests
1
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
gitlab-ce
Commits
ad1c2f79
Commit
ad1c2f79
authored
Oct 01, 2014
by
Jan-Willem van der Meer
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Refactor Gitlab::LDAP::User to instance methods
parent
37e68cf8
Changes
4
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
66 additions
and
66 deletions
+66
-66
app/controllers/omniauth_callbacks_controller.rb
app/controllers/omniauth_callbacks_controller.rb
+15
-20
lib/gitlab/ldap/user.rb
lib/gitlab/ldap/user.rb
+41
-34
lib/gitlab/oauth/user.rb
lib/gitlab/oauth/user.rb
+1
-1
spec/lib/gitlab/ldap/user_spec.rb
spec/lib/gitlab/ldap/user_spec.rb
+9
-11
No files found.
app/controllers/omniauth_callbacks_controller.rb
View file @
ad1c2f79
...
...
@@ -15,15 +15,17 @@ class OmniauthCallbacksController < Devise::OmniauthCallbacksController
error
.
to_s
.
humanize
if
error
end
# We only find ourselves here
# if the authentication to LDAP was successful.
def
ldap
# We only find ourselves here
# if the authentication to LDAP was successful.
@user
=
Gitlab
::
LDAP
::
User
.
find_or_create
(
oauth
)
@
user
.
remember_me
=
true
if
@user
.
persisted?
@user
=
Gitlab
::
LDAP
::
User
.
new
(
oauth
)
@user
.
save
if
@user
.
changed?
# will also save new users
gl_user
=
@user
.
gl_user
gl_
user
.
remember_me
=
true
if
@user
.
persisted?
# Do additional LDAP checks for the user filter and EE features
if
Gitlab
::
LDAP
::
Access
.
allowed?
(
@
user
)
sign_in_and_redirect
(
@
user
)
if
Gitlab
::
LDAP
::
Access
.
allowed?
(
gl_
user
)
sign_in_and_redirect
(
gl_
user
)
else
flash
[
:alert
]
=
"Access denied for your LDAP account."
redirect_to
new_user_session_path
...
...
@@ -46,24 +48,17 @@ class OmniauthCallbacksController < Devise::OmniauthCallbacksController
current_user
.
save
redirect_to
profile_path
else
@user
=
Gitlab
::
OAuth
::
User
.
find
(
oauth
)
@user
=
Gitlab
::
OAuth
::
User
.
new
(
oauth
)
# Create user if does not exist
# and allow_single_sign_on is true
if
Gitlab
.
config
.
omniauth
[
'allow_single_sign_on'
]
&&
!
@user
@user
,
errors
=
Gitlab
::
OAuth
::
User
.
create
(
oauth
)
if
Gitlab
.
config
.
omniauth
[
'allow_single_sign_on'
]
&&
@user
.
new?
@user
.
save
end
if
@user
&&
!
errors
sign_in_and_redirect
(
@user
)
if
@user
.
valid?
sign_in_and_redirect
(
@user
.
gl_user
)
else
if
errors
error_message
=
errors
.
map
{
|
attribute
,
message
|
"
#{
attribute
}
#{
message
}
"
}.
join
(
", "
)
redirect_to
omniauth_error_path
(
oauth
[
'provider'
],
error:
error_message
)
and
return
else
flash
[
:notice
]
=
"There's no such user!"
end
redirect_to
new_user_session_path
error_message
=
@user
.
gl_user
.
errors
.
map
{
|
attribute
,
message
|
"
#{
attribute
}
#{
message
}
"
}.
join
(
", "
)
redirect_to
omniauth_error_path
(
oauth
[
'provider'
],
error:
error_message
)
and
return
end
end
end
...
...
lib/gitlab/ldap/user.rb
View file @
ad1c2f79
...
...
@@ -10,22 +10,6 @@ module Gitlab
module
LDAP
class
User
<
Gitlab
::
OAuth
::
User
class
<<
self
def
find_or_create
(
auth_hash
)
self
.
auth_hash
=
auth_hash
find
(
auth_hash
)
||
find_and_connect_by_email
(
auth_hash
)
||
create
(
auth_hash
)
end
def
find_and_connect_by_email
(
auth_hash
)
self
.
auth_hash
=
auth_hash
user
=
model
.
find_by
(
email:
self
.
auth_hash
.
email
)
if
user
user
.
update_attributes
(
extern_uid:
auth_hash
.
uid
,
provider:
auth_hash
.
provider
)
Gitlab
::
AppLogger
.
info
(
"(LDAP) Updating legacy LDAP user
#{
self
.
auth_hash
.
email
}
with extern_uid =>
#{
auth_hash
.
uid
}
"
)
return
user
end
end
def
authenticate
(
login
,
password
)
# Check user against LDAP backend if user is not authenticated
# Only check with valid login and password to prevent anonymous bind results
...
...
@@ -44,10 +28,18 @@ module Gitlab
@adapter
||=
OmniAuth
::
LDAP
::
Adaptor
.
new
(
ldap_conf
)
end
protected
def
user_filter
(
login
)
filter
=
Net
::
LDAP
::
Filter
.
eq
(
adapter
.
uid
,
login
)
# Apply LDAP user filter if present
if
ldap_conf
[
'user_filter'
].
present?
user_filter
=
Net
::
LDAP
::
Filter
.
construct
(
ldap_conf
[
'user_filter'
])
filter
=
Net
::
LDAP
::
Filter
.
join
(
filter
,
user_filter
)
end
filter
end
def
find_by_uid_and_provider
find_by_uid
(
auth_hash
.
uid
)
def
ldap_conf
Gitlab
.
config
.
ldap
end
def
find_by_uid
(
uid
)
...
...
@@ -58,24 +50,39 @@ module Gitlab
def
provider
'ldap'
end
end
def
raise_error
(
message
)
raise
OmniAuth
::
Error
,
"(LDAP) "
+
message
end
def
initialize
(
auth_hash
)
super
update_attributes
end
def
ldap_conf
Gitlab
.
config
.
ldap
end
# instance methods
def
gl_user
@gl_user
||=
find_by_uid_and_provider
||
find_by_email
||
build_new_user
end
def
user_filter
(
login
)
filter
=
Net
::
LDAP
::
Filter
.
eq
(
adapter
.
uid
,
login
)
# Apply LDAP user filter if present
if
ldap_conf
[
'user_filter'
].
present?
user_filter
=
Net
::
LDAP
::
Filter
.
construct
(
ldap_conf
[
'user_filter'
])
filter
=
Net
::
LDAP
::
Filter
.
join
(
filter
,
user_filter
)
end
filter
end
def
find_by_uid_and_provider
# LDAP distinguished name is case-insensitive
model
.
where
(
provider:
auth_hash
.
provider
).
where
(
'lower(extern_uid) = ?'
,
auth_hash
.
uid
.
downcase
).
last
end
def
find_by_email
model
.
find_by
(
email:
auth_hash
.
email
)
end
def
update_attributes
gl_user
.
attributes
=
{
extern_uid:
auth_hash
.
uid
,
provider:
auth_hash
.
provider
,
email:
auth_hash
.
email
}
end
def
changed?
gl_user
.
changed?
end
def
needs_blocking?
...
...
lib/gitlab/oauth/user.rb
View file @
ad1c2f79
...
...
@@ -26,7 +26,7 @@ module Gitlab
def
save
gl_user
.
save!
log
.
info
"(OAuth)
Creat
ing user
#{
auth_hash
.
email
}
from login with extern_uid =>
#{
auth_hash
.
uid
}
"
log
.
info
"(OAuth)
sav
ing user
#{
auth_hash
.
email
}
from login with extern_uid =>
#{
auth_hash
.
uid
}
"
gl_user
.
block
if
needs_blocking?
gl_user
...
...
spec/lib/gitlab/ldap/user_spec.rb
View file @
ad1c2f79
require
'spec_helper'
describe
Gitlab
::
LDAP
::
User
do
let
(
:gl_user
)
{
Gitlab
::
LDAP
::
User
}
let
(
:gl_user
)
{
Gitlab
::
LDAP
::
User
.
new
(
auth_hash
)
}
let
(
:info
)
do
double
(
{
name:
'John'
,
email:
'john@example.com'
,
nickname:
'john'
)
}
end
let
(
:auth_hash
)
do
double
(
uid:
'my-uid'
,
provider:
'ldap'
,
info:
double
(
info
))
end
before
{
Gitlab
.
config
.
stub
(
omniauth:
{})
}
describe
:find_or_create
do
let
(
:auth
)
do
double
(
info:
info
,
provider:
'ldap'
,
uid:
'my-uid'
)
end
it
"finds the user if already existing"
do
existing_user
=
create
(
:user
,
extern_uid:
'my-uid'
,
provider:
'ldap'
)
expect
{
gl_user
.
find_or_create
(
auth
)
}.
to_not
change
{
User
.
count
}
expect
{
gl_user
.
save
}.
to_not
change
{
User
.
count
}
end
it
"connects to existing non-ldap user if the email matches"
do
existing_user
=
create
(
:user
,
email:
'john@example.com'
)
expect
{
gl_user
.
find_or_create
(
auth
)
}.
to_not
change
{
User
.
count
}
expect
{
gl_user
.
save
}.
to_not
change
{
User
.
count
}
existing_user
.
reload
expect
(
existing_user
.
extern_uid
).
to
eql
'my-uid'
...
...
@@ -32,7 +30,7 @@ describe Gitlab::LDAP::User do
end
it
"creates a new user if not found"
do
expect
{
gl_user
.
find_or_create
(
auth
)
}.
to
change
{
User
.
count
}.
by
(
1
)
expect
{
gl_user
.
save
}.
to
change
{
User
.
count
}.
by
(
1
)
end
end
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment