Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
A
AlekSIS-App-LDAP
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Container Registry
Model registry
Operate
Environments
Monitor
Incidents
Service Desk
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Terms and privacy
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
AlekSIS®
Official
AlekSIS-App-LDAP
Commits
bad8d096
Verified
Commit
bad8d096
authored
4 years ago
by
Tom Teichler
Browse files
Options
Downloads
Patches
Plain Diff
Revert "[Reformat] Fix variables"
This reverts commit
1132fc11
.
parent
552febeb
No related branches found
No related tags found
No related merge requests found
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
aleksis/apps/ldap/apps.py
+3
-2
3 additions, 2 deletions
aleksis/apps/ldap/apps.py
aleksis/apps/ldap/util/ldap_sync.py
+28
-28
28 additions, 28 deletions
aleksis/apps/ldap/util/ldap_sync.py
with
31 additions
and
30 deletions
aleksis/apps/ldap/apps.py
+
3
−
2
View file @
bad8d096
...
...
@@ -25,5 +25,6 @@ class LDAPConfig(AppConfig):
update_dynamic_preferences
()
user
=
get_user_model
()
post_save
.
connect
(
ldap_sync_user_on_login
,
sender
=
user
)
User
=
get_user_model
()
if
get_site_preferences
()[
"
ldap__person_sync_on_login
"
]:
post_save
.
connect
(
ldap_sync_user_on_login
,
sender
=
User
)
This diff is collapsed.
Click to expand it.
aleksis/apps/ldap/util/ldap_sync.py
+
28
−
28
View file @
bad8d096
...
...
@@ -66,8 +66,8 @@ def from_ldap(value, instance, field, dn, ldap_field):
def
update_dynamic_preferences
():
"""
Auto-generate sync field settings from models.
"""
p
erson
=
apps
.
get_model
(
"
core
"
,
"
Person
"
)
for
model
in
(
p
erson
,):
P
erson
=
apps
.
get_model
(
"
core
"
,
"
Person
"
)
for
model
in
(
P
erson
,):
# Collect fields that are matchable
for
field
in
model
.
syncable_fields
():
setting_name
=
setting_name_from_field
(
model
,
field
)
...
...
@@ -132,7 +132,7 @@ def ldap_sync_user_on_login(sender, instance, created, **kwargs):
return
instance
.
_skip_signal
=
True
p
erson
=
apps
.
get_model
(
"
core
"
,
"
Person
"
)
P
erson
=
apps
.
get_model
(
"
core
"
,
"
Person
"
)
if
(
get_site_preferences
()[
"
ldap__enable_sync
"
]
...
...
@@ -144,10 +144,10 @@ def ldap_sync_user_on_login(sender, instance, created, **kwargs):
person
=
ldap_sync_from_user
(
instance
,
instance
.
ldap_user
.
dn
,
instance
.
ldap_user
.
attrs
.
data
)
except
p
erson
.
DoesNotExist
:
except
P
erson
.
DoesNotExist
:
logger
.
warn
(
f
"
No matching person for user
{
instance
.
username
}
"
)
return
except
p
erson
.
MultipleObjectsReturned
:
except
P
erson
.
MultipleObjectsReturned
:
logger
.
error
(
f
"
More than one matching person for user
{
instance
.
username
}
"
)
return
except
(
DataError
,
IntegrityError
,
ValueError
)
as
e
:
...
...
@@ -178,13 +178,13 @@ def ldap_sync_user_on_login(sender, instance, created, **kwargs):
@transaction.atomic
def
ldap_sync_from_user
(
user
,
dn
,
attrs
):
"""
Synchronise person information from a User object (with ldap_user) to Django.
"""
p
erson
=
apps
.
get_model
(
"
core
"
,
"
Person
"
)
P
erson
=
apps
.
get_model
(
"
core
"
,
"
Person
"
)
# Check if there is an existing person connected to the user.
if
Person
.
objects
.
filter
(
user__username
=
user
.
username
).
exists
():
person
_
=
user
.
person
person
=
user
.
person
created
=
False
logger
.
info
(
f
"
Existing person
{
person
_
}
already linked to user
{
user
.
username
}
"
)
logger
.
info
(
f
"
Existing person
{
person
}
already linked to user
{
user
.
username
}
"
)
# FIXME ALso account for existing person with DN here
else
:
# Build filter criteria depending on config
...
...
@@ -200,20 +200,20 @@ def ldap_sync_from_user(user, dn, attrs):
defaults
[
"
email
"
]
=
user
.
email
if
get_site_preferences
()[
"
ldap__create_missing_persons
"
]:
person
_
,
created
=
Person
.
objects
.
get_or_create
(
**
matches
,
defaults
=
defaults
)
person
,
created
=
Person
.
objects
.
get_or_create
(
**
matches
,
defaults
=
defaults
)
else
:
person
_
=
Person
.
objects
.
get
(
**
matches
)
person
=
Person
.
objects
.
get
(
**
matches
)
created
=
False
person
_
.
user
=
user
person
.
user
=
user
status
=
"
New
"
if
created
else
"
Existing
"
logger
.
info
(
f
"
{
status
}
person
{
person
_
}
linked to user
{
user
.
username
}
"
)
logger
.
info
(
f
"
{
status
}
person
{
person
}
linked to user
{
user
.
username
}
"
)
person
_
.
ldap_dn
=
dn
.
lower
()
person
.
ldap_dn
=
dn
.
lower
()
if
not
created
:
person
_
.
first_name
=
user
.
first_name
person
_
.
last_name
=
user
.
last_name
person
_
.
email
=
user
.
email
person
.
first_name
=
user
.
first_name
person
.
last_name
=
user
.
last_name
person
.
email
=
user
.
email
# Synchronise additional fields if enabled
for
field
in
Person
.
syncable_fields
():
...
...
@@ -230,19 +230,19 @@ def ldap_sync_from_user(user, dn, attrs):
value
=
apply_templates
(
value
,
patterns
,
templates
)
# Opportunistically convert LDAP string value to Python object
value
=
from_ldap
(
value
,
person
_
,
field
,
dn
,
ldap_field
)
value
=
from_ldap
(
value
,
person
,
field
,
dn
,
ldap_field
)
setattr
(
person
_
,
field
.
name
,
value
)
logger
.
debug
(
f
"
Field
{
field
.
name
}
set to
{
value
}
for
{
person
_
}
"
)
setattr
(
person
,
field
.
name
,
value
)
logger
.
debug
(
f
"
Field
{
field
.
name
}
set to
{
value
}
for
{
person
}
"
)
person
_
.
save
()
return
person
_
person
.
save
()
return
person
@transaction.atomic
def
ldap_sync_from_groups
(
group_infos
):
"""
Synchronise group information from LDAP results to Django.
"""
g
roup
=
apps
.
get_model
(
"
core
"
,
"
Group
"
)
G
roup
=
apps
.
get_model
(
"
core
"
,
"
Group
"
)
# Resolve Group objects from LDAP group objects
group_objects
=
[]
...
...
@@ -276,13 +276,13 @@ def ldap_sync_from_groups(group_infos):
)
# Shorten names to fit into model fields
short_name
=
short_name
[:
g
roup
.
_meta
.
get_field
(
"
short_name
"
).
max_length
]
name
=
name
[:
g
roup
.
_meta
.
get_field
(
"
name
"
).
max_length
]
short_name
=
short_name
[:
G
roup
.
_meta
.
get_field
(
"
short_name
"
).
max_length
]
name
=
name
[:
G
roup
.
_meta
.
get_field
(
"
name
"
).
max_length
]
# FIXME FInd a way to throw exceptions correctly but still continue import
try
:
with
transaction
.
atomic
():
group
,
created
=
g
roup
.
objects
.
update_or_create
(
group
,
created
=
G
roup
.
objects
.
update_or_create
(
ldap_dn
=
ldap_group
[
0
].
lower
(),
defaults
=
{
"
short_name
"
:
short_name
,
"
name
"
:
name
},
)
...
...
@@ -304,7 +304,7 @@ def mass_ldap_import():
"""
Add utility code for mass import from ldap.
"""
from
django_auth_ldap.backend
import
LDAPBackend
,
_LDAPUser
# noqa
p
erson
=
apps
.
get_model
(
"
core
"
,
"
Person
"
)
P
erson
=
apps
.
get_model
(
"
core
"
,
"
Person
"
)
# Abuse pre-configured search object as general LDAP interface
backend
=
LDAPBackend
()
...
...
@@ -342,11 +342,11 @@ def mass_ldap_import():
if
created
or
get_site_preferences
()[
"
ldap__sync_on_update
"
]:
try
:
with
transaction
.
atomic
():
person
_
=
ldap_sync_from_user
(
user
,
dn
,
attrs
)
person
=
ldap_sync_from_user
(
user
,
dn
,
attrs
)
except
Person
.
DoesNotExist
:
logger
.
warn
(
f
"
No matching person for user
{
user
.
username
}
"
)
continue
except
p
erson
_
.
MultipleObjectsReturned
:
except
P
erson
.
MultipleObjectsReturned
:
logger
.
error
(
f
"
More than one matching person for user
{
user
.
username
}
"
)
continue
except
(
DataError
,
IntegrityError
,
ValueError
)
as
e
:
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment