Fixes re permissions
This commit is contained in:
1 parent
e6f76ec523
commit
c7ee107e99
2 files changed
+31
-28
No files matched your search
+17
-24
@@ -1,44 +1,37 @@
|
|||||||
from rest_framework import permissions
|
from rest_framework import permissions
|
||||||
from mailadmin.models import OrgUnit
|
|
||||||
import re
|
import re
|
||||||
|
|
||||||
from mailadmin.serializers import AliasSerializer
|
from mailadmin.serializers import AliasSerializer
|
||||||
|
|
||||||
|
|
||||||
class SourcePrefixOwner(permissions.BasePermission):
|
class SourcePrefixOwner(permissions.BasePermission):
|
||||||
# Ref: http://www.django-rest-framework.org/api-guide/permissions
|
""" Ref: http://www.django-rest-framework.org/api-guide/permissions """
|
||||||
# TODO have no idea if this works
|
|
||||||
def has_permission(self, request, view):
|
def has_permission(self, request, view):
|
||||||
|
assert hasattr(view, 'get_user_prefixes')
|
||||||
|
|
||||||
# Read permissions (GET, HEAD or OPTIONS) are allowed for all authenticated request
|
# Read permissions (GET, HEAD or OPTIONS) are allowed for all authenticated request
|
||||||
if request.method in permissions.SAFE_METHODS and request.user and request.user.is_authenticated():
|
if request.method in permissions.SAFE_METHODS or request.method not in ['DELETE', 'POST']:
|
||||||
return True
|
return True
|
||||||
|
|
||||||
# TODO test handling the DELETE requests
|
|
||||||
if request.user.is_superuser:
|
if request.user.is_superuser:
|
||||||
return True
|
return True
|
||||||
|
|
||||||
if request.method in ['DELETE', 'POST']:
|
serializer = AliasSerializer(data=request.data, many=True)
|
||||||
print view
|
|
||||||
print view.kwargs
|
|
||||||
forwarder = view.kwargs['forwarder'] # TODO you are here
|
|
||||||
invalid_forwarder = {'error': 'Invalid forwarder: {0}'.format(forwarder)}
|
|
||||||
if '=' not in forwarder:
|
|
||||||
return True
|
|
||||||
|
|
||||||
fwd_data = forwarder.split("=")
|
if not serializer.is_valid():
|
||||||
fw = AliasSerializer(data={'dest': fwd_data[0], 'forward': fwd_data[1]})
|
|
||||||
else:
|
|
||||||
fw = AliasSerializer(data=request.DATA)
|
|
||||||
|
|
||||||
if not fw.is_valid():
|
|
||||||
return True # Skip auth if not valid data
|
return True # Skip auth if not valid data
|
||||||
|
|
||||||
my_groups = request.user.groups.all()
|
my_prefixes = view.get_user_prefixes(request)
|
||||||
# Look for mailinglist prefixes
|
|
||||||
my_prefixes = OrgUnit.objects.filter(admin_groups__in=my_groups).distinct().exclude(prefix__isnull=True).exclude(is_active=False).values_list('prefix', flat=True)
|
|
||||||
if len(my_prefixes) == 0:
|
if len(my_prefixes) == 0:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
# Prepare regular expression
|
# Prepare regular expression
|
||||||
regexp = '|'.join(['^{0}-'.format(p) for p in my_prefixes])
|
regexp = '|'.join(['^{0}-|^{0}@'.format(p) for p in my_prefixes])
|
||||||
# The destination should have at least one match with the prefix regexp
|
# All source-adresses should match the prefix regexp
|
||||||
return re.search(regexp, fw.data['dest']) is not None
|
for alias in serializer.initial_data:
|
||||||
|
print alias, re.search(regexp, alias.get('source', ''))
|
||||||
|
if re.search(regexp, alias.get('source', '')) is None:
|
||||||
|
return False
|
||||||
|
|
||||||
|
return True
|
||||||
+14
-4
@@ -5,7 +5,6 @@ from django.contrib.auth.forms import AuthenticationForm
|
|||||||
from django.contrib.auth.models import User
|
from django.contrib.auth.models import User
|
||||||
from django.shortcuts import render, redirect
|
from django.shortcuts import render, redirect
|
||||||
import logging
|
import logging
|
||||||
from requests import exceptions
|
|
||||||
from rest_framework import viewsets, views
|
from rest_framework import viewsets, views
|
||||||
from rest_framework.decorators import api_view
|
from rest_framework.decorators import api_view
|
||||||
from rest_framework.permissions import IsAuthenticated
|
from rest_framework.permissions import IsAuthenticated
|
||||||
@@ -50,9 +49,9 @@ def logout(request):
|
|||||||
class AliasesView(views.APIView):
|
class AliasesView(views.APIView):
|
||||||
""" List, create and delete aliases from django-postfix-dovecot-api """
|
""" List, create and delete aliases from django-postfix-dovecot-api """
|
||||||
_api = DjangoPostfixDovecotAPI()
|
_api = DjangoPostfixDovecotAPI()
|
||||||
permission_classes = (SourcePrefixOwner,)
|
permission_classes = (IsAuthenticated, SourcePrefixOwner,)
|
||||||
|
|
||||||
def get(self, request):
|
def get_groups(self, request):
|
||||||
group_filter = request.QUERY_PARAMS.get('groups', None)
|
group_filter = request.QUERY_PARAMS.get('groups', None)
|
||||||
if group_filter is None:
|
if group_filter is None:
|
||||||
my_groups = request.user.groups.all()
|
my_groups = request.user.groups.all()
|
||||||
@@ -64,13 +63,24 @@ class AliasesView(views.APIView):
|
|||||||
group_filter = [group_filter]
|
group_filter = [group_filter]
|
||||||
my_groups = request.user.groups.filter(pk__in=group_filter)
|
my_groups = request.user.groups.filter(pk__in=group_filter)
|
||||||
|
|
||||||
|
return my_groups
|
||||||
|
|
||||||
|
def get_user_prefixes(self, request):
|
||||||
|
my_groups = self.get_groups(request)
|
||||||
|
|
||||||
# Look for mailinglist prefixes
|
# Look for mailinglist prefixes
|
||||||
orgunits = OrgUnit.objects.exclude(prefix__isnull=True).exclude(is_active=False).distinct()
|
orgunits = OrgUnit.objects.exclude(prefix__isnull=True).exclude(is_active=False).distinct()
|
||||||
if not request.user.is_superuser:
|
if not request.user.is_superuser:
|
||||||
orgunits = orgunits.filter(admin_groups__in=my_groups)
|
orgunits = orgunits.filter(admin_groups__in=my_groups)
|
||||||
|
|
||||||
my_prefixes = orgunits.values_list('prefix', flat=True)
|
my_prefixes = orgunits.values_list('prefix', flat=True)
|
||||||
|
|
||||||
|
return my_prefixes
|
||||||
|
|
||||||
|
def get(self, request):
|
||||||
|
my_prefixes = self.get_user_prefixes(request)
|
||||||
|
|
||||||
# Prepare regular expression
|
# Prepare regular expression
|
||||||
|
# FIXME: Move to method on orgunit manager
|
||||||
regexp = '|'.join(['^{0}-|^{0}@'.format(p) for p in my_prefixes])
|
regexp = '|'.join(['^{0}-|^{0}@'.format(p) for p in my_prefixes])
|
||||||
if len(my_prefixes) == 0:
|
if len(my_prefixes) == 0:
|
||||||
return Response({'result': 'No results'}) # Need at least one
|
return Response({'result': 'No results'}) # Need at least one
|
||||||
|
|||||||
Reference in new issue
Block a user