# -*- 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 <http://www.gnu.org/licenses/>. """Postorius view decorators.""" from django.contrib.auth import logout, authenticate, login from django.core.exceptions import PermissionDenied from postorius.models import (Domain, List, Member, MailmanUser, MailmanApiError, Mailman404Error) def basic_auth_login(fn): def wrapper(*args, **kwargs): request = args[0] if request.user.is_authenticated(): print 'already logged in' if not request.user.is_authenticated(): if request.META.has_key('HTTP_AUTHORIZATION'): authmeth, auth = request.META['HTTP_AUTHORIZATION'].split(' ', 1) if authmeth.lower() == 'basic': auth = auth.strip().decode('base64') username, password = auth.split(':', 1) user = authenticate(username=username, password=password) if user: login(request, user) return fn(request, **kwargs) return wrapper def list_owner_required(fn): """Check if the logged in user is the list owner of the given list. Assumes that the request object is the first arg and that fqdn_listname is present in kwargs. """ def wrapper(*args, **kwargs): user = args[0].user list_id = kwargs['list_id'] if not user.is_authenticated(): raise PermissionDenied if user.is_superuser: return fn(*args, **kwargs) if getattr(user, 'is_list_owner', None): return fn(*args, **kwargs) mlist = List.objects.get_or_404(fqdn_listname=list_id) if user.email not in mlist.owners: raise PermissionDenied else: user.is_list_owner = True return fn(*args, **kwargs) return wrapper def list_moderator_required(fn): """Check if the logged in user is a moderator of the given list. Assumes that the request object is the first arg and that list_id is present in kwargs. """ def wrapper(*args, **kwargs): user = args[0].user list_id = kwargs['list_id'] if not user.is_authenticated(): raise PermissionDenied if user.is_superuser: return fn(*args, **kwargs) if getattr(user, 'is_list_owner', None): return fn(*args, **kwargs) if getattr(user, 'is_list_moderator', None): return fn(*args, **kwargs) mlist = List.objects.get_or_404(fqdn_listname=list_id) if user.email not in mlist.moderators and \ user.email not in mlist.owners: raise PermissionDenied else: user.is_list_moderator = True return fn(*args, **kwargs) return wrapper def superuser_or_403(fn): """Make sure that the logged in user is a superuser or otherwise raise PermissionDenied. Assumes the request object to be the first arg.""" def wrapper(*args, **kwargs): user = args[0].user if not user.is_superuser: raise PermissionDenied return fn(*args, **kwargs) return wrapper def loggedin_or_403(fn): """Make sure that the logged in user is not anonymous or otherwise raise PermissionDenied. Assumes the request object to be the first arg.""" def wrapper(*args, **kwargs): user = args[0].user if not user.is_authenticated(): raise PermissionDenied return fn(*args, **kwargs) return wrapper