diff --git a/src/postorius/auth/decorators.py b/src/postorius/auth/decorators.py index e6fa531..3dd51e5 100644 --- a/src/postorius/auth/decorators.py +++ b/src/postorius/auth/decorators.py @@ -23,7 +23,8 @@ from postorius.models import (Domain, List, Member, MailmanUser, MailmanApiError, Mailman404Error) -from postorius.utils import user_is_in_list_roster + +from .utils import set_user_access_props def basic_auth_login(fn): @@ -57,9 +58,7 @@ raise PermissionDenied if user.is_superuser: return fn(*args, **kwargs) - if not hasattr(user, 'is_list_owner'): - mlist = List.objects.get_or_404(fqdn_listname=list_id) - user.is_list_owner = user_is_in_list_roster(user, mlist, "owners") + set_user_access_props(user, list_id) if user.is_list_owner: return fn(*args, **kwargs) else: @@ -79,15 +78,7 @@ raise PermissionDenied if user.is_superuser: return fn(*args, **kwargs) - if (not hasattr(user, 'is_list_owner') - or not hasattr(user, 'is_list_moderator')): - mlist = List.objects.get_or_404(fqdn_listname=list_id) - if not hasattr(user, 'is_list_owner'): - user.is_list_owner = user_is_in_list_roster( - user, mlist, "owners") - if not hasattr(user, 'is_list_moderator'): - user.is_list_moderator = user_is_in_list_roster( - user, mlist, "moderators") + set_user_access_props(user, list_id) if user.is_list_owner or user.is_list_moderator: return fn(*args, **kwargs) else: diff --git a/src/postorius/auth/utils.py b/src/postorius/auth/utils.py new file mode 100644 index 0000000..fc23c18 --- /dev/null +++ b/src/postorius/auth/utils.py @@ -0,0 +1,42 @@ +# -*- coding: utf-8 -*- +# Copyright (C) 1998-2015 by the Free Software Foundation, Inc. +# +# This file is part of Postorius. +# +# Postorius is free software: you can redistribute it and/or modify it under +# the terms of the GNU General Public License as published by the Free +# Software Foundation, either version 3 of the License, or (at your option) +# any later version. +# +# Postorius is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +# more details. +# +# You should have received a copy of the GNU General Public License along with +# Postorius. If not, see . + +""" +Authentication and authorization-related utilities. +""" + +def user_is_in_list_roster(user, mailing_list, roster): + if not user.is_authenticated(): + return False + if not hasattr(user, 'other_emails'): + set_other_emails(user) + addresses = set([user.email]) | set(user.other_emails) + if addresses & set(getattr(mailing_list, roster)): + return True # At least one address is in the roster + return False + + +def set_user_access_props(user, mlist): + if not isinstance(mlist, List): + mlist = List.objects.get_or_404(mlist) + if not hasattr(user, 'is_list_owner'): + user.is_list_owner = user_is_in_list_roster( + user, mlist, "owners") + if not hasattr(user, 'is_list_moderator'): + user.is_list_moderator = user_is_in_list_roster( + user, mlist, "moderators") diff --git a/src/postorius/utils.py b/src/postorius/utils.py index 63a2564..00f7c00 100644 --- a/src/postorius/utils.py +++ b/src/postorius/utils.py @@ -115,13 +115,3 @@ return if user.email in user.other_emails: user.other_emails.remove(user.email) - -def user_is_in_list_roster(user, mailing_list, roster): - if not user.is_authenticated(): - return False - if not hasattr(user, 'other_emails'): - set_other_emails(user) - addresses = set([user.email]) | set(user.other_emails) - if addresses & set(getattr(mailing_list, roster)): - return True # At least one address is in the roster - return False diff --git a/src/postorius/views/generic.py b/src/postorius/views/generic.py index e12e846..3b18d66 100644 --- a/src/postorius/views/generic.py +++ b/src/postorius/views/generic.py @@ -22,6 +22,7 @@ from postorius.models import List, MailmanUser, MailmanApiError, Mailman404Error from postorius import utils +from postorius.auth.utils import set_user_access_props class MailmanClientMixin(object): @@ -48,16 +49,10 @@ def dispatch(self, request, *args, **kwargs): # get the list object. if 'list_id' in kwargs: - try: - self.mailing_list = self._get_list(kwargs['list_id'], - int(kwargs.get('page', 1))) - except MailmanApiError: - return utils.render_api_error(request) + self.mailing_list = self._get_list(kwargs['list_id'], + int(kwargs.get('page', 1))) utils.set_other_emails(request.user) - request.user.is_list_owner = utils.user_is_in_list_roster( - request.user, self.mailing_list, "owners") - request.user.is_list_moderator = utils.user_is_in_list_roster( - request.user, self.mailing_list, "moderators") + set_user_access_props(request.user) # set the template if 'template' in kwargs: self.template = kwargs['template']