From c8d1b5caada2075c87540dc60e041667a00547cc Mon Sep 17 00:00:00 2001 From: Ambulance Clerc Date: Wed, 31 May 2023 14:54:28 +0200 Subject: [PATCH] Module sync users/groups nextcloud --- nextcloud/models/__init__.py | 4 -- nextcloud/models/alerts.py | 29 ---------- nextcloud/settings.py | 2 - nextcloud/signals.py | 103 +++++++++++++++++++++++++++++------ 4 files changed, 86 insertions(+), 52 deletions(-) delete mode 100644 nextcloud/models/__init__.py delete mode 100644 nextcloud/models/alerts.py diff --git a/nextcloud/models/__init__.py b/nextcloud/models/__init__.py deleted file mode 100644 index c6c1c92..0000000 --- a/nextcloud/models/__init__.py +++ /dev/null @@ -1,4 +0,0 @@ -from nextcloud.models.alerts import * - -# User too for good measure -from django.contrib.auth.models import User diff --git a/nextcloud/models/alerts.py b/nextcloud/models/alerts.py deleted file mode 100644 index d289894..0000000 --- a/nextcloud/models/alerts.py +++ /dev/null @@ -1,29 +0,0 @@ -import logging - -from django.dispatch import Signal - -logger = logging.getLogger(__name__) - -new_membership = Signal(Signal("user")) -ending_membership = Signal(Signal("user")) -updating_membership = Signal(["user"]) - -from django.db.models.signals import post_save, post_delete -from django.contrib.auth.models import User - - -def my_callback(sender,created,instance, **kwargs): - if created: - new_membership.send(sender=sender, user=instance) - else: - updating_membership.send(sender=sender, user=instance) - -def del_callback(sender, instance, **kwargs): - ending_membership.send(sender=sender, user=instance) - - - - -post_save.connect(my_callback, sender=User) -post_delete.connect(del_callback, sender=User) - diff --git a/nextcloud/settings.py b/nextcloud/settings.py index c0b2c41..5179ad0 100644 --- a/nextcloud/settings.py +++ b/nextcloud/settings.py @@ -1,7 +1,5 @@ from django.conf import settings -from .models.alerts import new_membership, ending_membership, updating_membership - NEXTCLOUD_HOST = getattr(settings, 'NEXTCLOUD_HOST', 'test.ambulance-clerc.ch') NEXTCLOUD_ADMIN = getattr(settings, 'NEXTCLOUD_ADMIN', 'admin') NEXTCLOUD_PASSWORD = getattr(settings, 'NEXTCLOUD_SECRET', 'Mc33*144') diff --git a/nextcloud/signals.py b/nextcloud/signals.py index 70c48ca..724b4a8 100644 --- a/nextcloud/signals.py +++ b/nextcloud/signals.py @@ -7,6 +7,8 @@ import owncloud as NextCloudCLI from django.dispatch import receiver +from django.db.models.signals import post_save, post_delete +from django.contrib.auth.models import User, Group from .settings import * @@ -17,18 +19,10 @@ def log(msg): print(msg) - -def randomStringDigits(stringLength=8): - # Generate a random string of letters and digits - lettersAndDigits = string.ascii_letters + string.digits - return ''.join(random.choice(lettersAndDigits) for i in range(stringLength)) - - -@receiver(new_membership) -def adding_nexcloud_user(sender, **kwargs): +def adding_nexcloud_user(_user, **kwargs): print("pass add nextcloud user") # Add new member on the nextcloud server - _user = kwargs['user'] + _pass = NEXTCLOUD_USER_DEFAULT_PASSWORD _admin = NEXTCLOUD_ADMIN @@ -71,10 +65,10 @@ def adding_nexcloud_user(sender, **kwargs): log('Adding user %s success' % _user.username) -@receiver(ending_membership) -def deactivating_nexcloud_user(sender, **kwargs): +@receiver(post_delete, sender= User) +def deactivating_nexcloud_user(instance, **kwargs): # Remove member on the nextcloud server - _user = kwargs['user'] + _user = instance _admin = NEXTCLOUD_ADMIN _admin_key = NEXTCLOUD_PASSWORD @@ -101,10 +95,10 @@ def deactivating_nexcloud_user(sender, **kwargs): -@receiver(updating_membership) -def update_nexcloud_user(sender, **kwargs): +def update_nexcloud_user(_user, **kwargs): + log(f"User edited {_user}") # Change user password on the nextcloud server - _user = kwargs['user'] + _admin = NEXTCLOUD_ADMIN _admin_key = NEXTCLOUD_PASSWORD @@ -139,4 +133,79 @@ def get_pseudonyme_from_user(username): if "mc" in username: return " (" + username.split("@")[0].replace("mc","MC") + ")" else: - return "" \ No newline at end of file + return "" + +@receiver(post_save, sender= User) +def post_save_User_handler(created,instance, **kwargs): + _user = instance + if created: + adding_nexcloud_user(_user=_user) + else: + update_nexcloud_user(_user=_user) +@receiver(post_save, sender= Group) +def adding_nexcloud_group(sender,instance,created, **kwargs): + if not created: + log(f"group Edited {instance.name}") + return False + # Add new member on the nextcloud server + _group = instance + + + _admin = NEXTCLOUD_ADMIN + _admin_key = NEXTCLOUD_PASSWORD + + _url = '%s://%s' % (('http', 'https')[NEXTCLOUD_USE_HTTPS is True], NEXTCLOUD_HOST) + + nc = NextCloudCLI.Client(_url, verify_certs=NEXTCLOUD_SSL_IS_SIGNED) + _err = ['login', 'create_group', 'enable_group'] + try: + nc.login(_admin, _admin_key) + print("pass logged") + _err.pop(0) + try: + nc.create_group(_group.name) + _err.pop(0) + except NextCloudCLI.OCSResponseError as e: + if e.status_code == 102: + _err.pop(0) + else: + raise e + _err.pop(0) + nc.logout() + + except NextCloudCLI.HTTPResponseError as e: + log('adding_nexcloug_group: %s HTTP Error %d' % (_err[0], e.status_code)) + except requests.exceptions.ConnectionError as e: + log('adding_nexcloug_group: %s Connection Error: %s' % (_err[0], e)) + except NextCloudCLI.OCSResponseError as e: + log('adding_nexcloug_group: %s OCSResponse Error %d' % (_err[0], e.status_code)) + else: + log('Adding group %s success' % _group.name) + +@receiver(post_delete, sender= Group) +def delete_nexcloud_group(sender,instance, **kwargs): + print("Remove group") + # Remove member on the nextcloud server + _group = instance + + _admin = NEXTCLOUD_ADMIN + _admin_key = NEXTCLOUD_PASSWORD + + _url = ('http', 'https')[NEXTCLOUD_USE_HTTPS is True] + '://' + NEXTCLOUD_HOST + + nc = NextCloudCLI.Client(_url, verify_certs=NEXTCLOUD_SSL_IS_SIGNED) + _err = ['login', 'deactivate_user'] + try: + nc.login(_admin, _admin_key) + _err.pop(0) + nc.delete_group(_group.name) + nc.logout() + + except NextCloudCLI.HTTPResponseError as e: + log('removing_nexcloug_group: %s HTTP Error %d' % (_err[0], e.status_code)) + except requests.exceptions.ConnectionError as e: + log('removing_nexcloug_group: %s Connection Error: %s' % (_err[0], e)) + except NextCloudCLI.OCSResponseError as e: + log('removing_nexcloug_group: %s OCSResponse Error %d' % (_err[0], e.status_code)) + else: + log('Removing group %s success' % _group.name)