Skip to content
Snippets Groups Projects
Verified Commit 1fef9503 authored by nd's avatar nd
Browse files

always try to subscribe a user because the mailman api is inconsistent

parent 833fa6cc
Branches
No related tags found
No related merge requests found
...@@ -6,6 +6,8 @@ from django.core.management.base import BaseCommand ...@@ -6,6 +6,8 @@ from django.core.management.base import BaseCommand
from django_auth_ldap.config import LDAPSearch from django_auth_ldap.config import LDAPSearch
import django.conf import django.conf
from urllib.error import HTTPError
from postorius.models import List, MailmanUser from postorius.models import List, MailmanUser
from postorius.utils import get_mailman_client from postorius.utils import get_mailman_client
...@@ -30,6 +32,7 @@ class Command(BaseCommand): ...@@ -30,6 +32,7 @@ class Command(BaseCommand):
results = user_search.execute(conn) results = user_search.execute(conn)
ldap_users = [list(attr.values())[0][0] for dn, attr in results ] ldap_users = [list(attr.values())[0][0] for dn, attr in results ]
django_users = get_user_model().objects.all() django_users = get_user_model().objects.all()
backref_mapping = {'member': 'members', 'moderator': 'moderators', 'owner': 'owners'}
mm_users = {} mm_users = {}
membership_settings = getattr(django.conf.settings, 'LDAP_MEMBERSHIP_SYNC', {}) membership_settings = getattr(django.conf.settings, 'LDAP_MEMBERSHIP_SYNC', {})
...@@ -42,6 +45,8 @@ class Command(BaseCommand): ...@@ -42,6 +45,8 @@ class Command(BaseCommand):
mm_users[user.username].display_name = user.get_full_name() mm_users[user.username].display_name = user.get_full_name()
mm_users[user.username].save() mm_users[user.username].save()
mailman_id2username = {mm_users[i].user_id: i for i in mm_users}
for list_name in membership_settings: for list_name in membership_settings:
ldap_setting = membership_settings[list_name].get('ldap', {}) ldap_setting = membership_settings[list_name].get('ldap', {})
for membership_type in ldap_setting: for membership_type in ldap_setting:
...@@ -56,9 +61,6 @@ class Command(BaseCommand): ...@@ -56,9 +61,6 @@ class Command(BaseCommand):
# we refetch the mm_list each time because of wired caching problems # we refetch the mm_list each time because of wired caching problems
mm_list = client.get_list(list_name) mm_list = client.get_list(list_name)
backref_mapping = {'member': 'members', 'moderator': 'moderators', 'owner': 'owners'}
mailman_id2username = {mm_users[i].user_id: i for i in mm_users}
mm_members = getattr(mm_list, backref_mapping[membership_type], []) mm_members = getattr(mm_list, backref_mapping[membership_type], [])
for mm_member in mm_members: for mm_member in mm_members:
try: try:
...@@ -77,14 +79,11 @@ class Command(BaseCommand): ...@@ -77,14 +79,11 @@ class Command(BaseCommand):
try: try:
mm_user = mm_users[username] mm_user = mm_users[username]
displayname = mm_users[username].display_name or username displayname = mm_users[username].display_name or username
for mm_subscription in mm_user.subscriptions: try:
if mm_subscription.role == membership_type: # user might not be subscribed but should be subscribed -> subscribe
# user is already subscribed # we do not test if he is subscibed already because the mailman api is inconsistent and reports wrong state information for this...
break # instead we always try to subscribe and catch the error if we are subscribed already
else:
# user is not subscribed but should be subscribed -> subscribe
user_mail = mm_user.addresses[0].email user_mail = mm_user.addresses[0].email
logger.warning("subscribe {} ( {} ) as {} on {}".format(username, user_mail, membership_type, list_name))
if membership_type == 'member': if membership_type == 'member':
mm_list.subscribe(user_mail, mm_list.subscribe(user_mail,
display_name=displayname, display_name=displayname,
...@@ -97,6 +96,12 @@ class Command(BaseCommand): ...@@ -97,6 +96,12 @@ class Command(BaseCommand):
elif membership_type == 'owner': elif membership_type == 'owner':
mm_list.add_moderator(user_mail, mm_list.add_moderator(user_mail,
display_name=displayname) display_name=displayname)
logger.warning("subscribe {} ( {} ) as {} on {}".format(username, user_mail, membership_type, list_name))
except HTTPError as e:
# We get a http error if the user is already subscribed.
# It is silently ignored
if e.code == 409 and e.reason == b'Member already subscribed':
continue
except Exception as e: except Exception as e:
logger.exception(e) logger.exception(e)
continue continue
from setuptools import setup, find_packages from setuptools import setup, find_packages
setup(name='postorius_ldap_membership_management', setup(name='postorius_ldap_membership_management',
version='1.0', version='1.1',
description='Sync subscriptions from ldap', description='Sync subscriptions from ldap',
url='https://git.cccv.de:infra/uffd/postorius-ldap-membership-management', url='https://git.cccv.de:infra/uffd/postorius-ldap-membership-management',
author='Andreas Valder', author='Andreas Valder',
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment