From a36a9a71ad6cc30deb52b4d6e4f987ac919e16ce Mon Sep 17 00:00:00 2001
From: nd <git@notandy.de>
Date: Sun, 7 Mar 2021 00:46:10 +0100
Subject: [PATCH] Add user sync command

---
 .../management/__init__.py                    |  0
 .../management/commands/__init__.py           |  0
 .../management/commands/syncldap.py           | 32 +++++++++++++++++++
 setup.py                                      |  6 ++--
 4 files changed, 35 insertions(+), 3 deletions(-)
 create mode 100644 django_auth_ldap_remoteuser/management/__init__.py
 create mode 100644 django_auth_ldap_remoteuser/management/commands/__init__.py
 create mode 100644 django_auth_ldap_remoteuser/management/commands/syncldap.py

diff --git a/django_auth_ldap_remoteuser/management/__init__.py b/django_auth_ldap_remoteuser/management/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/django_auth_ldap_remoteuser/management/commands/__init__.py b/django_auth_ldap_remoteuser/management/commands/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/django_auth_ldap_remoteuser/management/commands/syncldap.py b/django_auth_ldap_remoteuser/management/commands/syncldap.py
new file mode 100644
index 0000000..5541bb6
--- /dev/null
+++ b/django_auth_ldap_remoteuser/management/commands/syncldap.py
@@ -0,0 +1,32 @@
+import logging
+
+from django.core.management.base import BaseCommand
+from django.contrib.auth import load_backend, login
+from django.contrib.auth.backends import RemoteUserBackend
+from django.contrib.auth import get_user_model
+import django.conf
+
+
+class Command(BaseCommand):
+	can_import_settings = True
+	help = 'Synchronize users from a LDAP server'
+
+	def handle(self, *args, **options):
+		ldap_backend = load_backend('django_auth_ldap.backend.LDAPBackend')
+		conn = ldap_backend.ldap.initialize(ldap_backend.settings.SERVER_URI, bytes_mode=False)
+		for opt, value in ldap_backend.settings.CONNECTION_OPTIONS.items():
+			conn.set_option(opt, value)
+		if ldap_backend.settings.START_TLS:
+			conn.start_tls_s()
+		conn.simple_bind_s(ldap_backend.settings.BIND_DN, ldap_backend.settings.BIND_PASSWORD)
+
+		user_search = django.conf.settings.AUTH_LDAP_USER_SEARCH_ALL_NAME
+		results = user_search.execute(conn)
+		ldap_users = [list(attr.values())[0][0] for dn, attr in results ]
+		django_users = get_user_model().objects.all()
+
+		for user in ldap_users:
+			ldap_backend.populate_user(user).save()
+		for user in django_users:
+			if not user.username in ldap_users:
+				user.delete()
diff --git a/setup.py b/setup.py
index 692cb13..d0ba93f 100644
--- a/setup.py
+++ b/setup.py
@@ -1,12 +1,12 @@
-from setuptools import setup
+from setuptools import setup, find_packages
 
 setup(name='django_auth_ldap_remoteuser',
-	version='1.0',
+	version='2.0',
 	description='Combine the RemoteUser and django-auth-ldap backends for django',
 	url='https://git.cccv.de/infra/uffd/django-auth-ldap-remoteuser',
 	author='Andreas Valder',
 	author_email='nd@cccv.de',
 	license='AGPL3',
-	packages=['django_auth_ldap_remoteuser'],
+	packages=find_packages(),
 	zip_safe=False)
 
-- 
GitLab