diff --git a/admin/models.py b/admin/models.py index cfe48be91..75b659b38 100644 --- a/admin/models.py +++ b/admin/models.py @@ -10,6 +10,12 @@ class Domain(models.Model): quota = models.IntegerField() enabled = models.BooleanField(_('enabled')) + class Meta: + permissions = ( + ("view_domain", "View domain"), + ("view_domains", "View domains"), + ) + def create_dir(self): code, output = exec_pipe("sudo -u %s mkdir %s/%s" \ % (settings.VIRTUAL_UID, @@ -55,6 +61,11 @@ class Mailbox(models.Model): user = models.ForeignKey(User) path = models.CharField(max_length=255) + class Meta: + permissions = ( + ("view_mailboxes", "View mailboxes"), + ) + def __str__(self): return "%s" % (self.address) @@ -92,3 +103,8 @@ class Alias(models.Model): full_address = models.CharField(max_length=150) mbox = models.ForeignKey(Mailbox, verbose_name=_('mailbox')) enabled = models.BooleanField(_('enabled')) + + class Meta: + permissions = ( + ("view_aliases", "View aliases"), + ) diff --git a/admin/views.py b/admin/views.py index cb4e1586c..e7c4628ed 100644 --- a/admin/views.py +++ b/admin/views.py @@ -6,7 +6,8 @@ from django.utils import simplejson from django.utils.translation import ugettext as _ from django.core import serializers from django.core.urlresolvers import reverse -from django.contrib.auth.decorators import login_required +from django.contrib.auth.decorators \ + import login_required, permission_required, user_passes_test from django.contrib.auth.models import User, Group from mailng import admin from mailng.admin.models import Domain, Mailbox, Alias @@ -23,8 +24,18 @@ def _render(request, tpl, user_context): return render_to_response(tpl, user_context, context_instance=RequestContext(request)) +def is_superuser(user): + if not user.is_superuser: + user.message_set.create(message=_("Permission denied.")) + return False + return True + @login_required def domains(request): + if not request.user.has_perm("admin.view_domains"): + mb = Mailbox.objects.get(user=request.user.id) + return mailboxes(request, dom_id=mb.domain.id) + domains = Domain.objects.all() counters = {} for dom in domains: @@ -34,7 +45,10 @@ def domains(request): }) @login_required +@permission_required("admin.add_mailbox") def newdomain(request): + if not is_superuser(request.user): + return mailboxes(request, dom_id) if request.method == "POST": form = DomainForm(request.POST) error = None @@ -59,8 +73,11 @@ def newdomain(request): "form" : form }) -@login_required +@login_required +@permission_required("admin.change_mailbox") def editdomain(request, dom_id): + if not is_superuser(request.user): + return mailboxes(request, dom_id) domain = Domain.objects.get(pk=dom_id) if request.method == "POST": form = DomainForm(request.POST, instance=domain) @@ -87,13 +104,17 @@ def editdomain(request, dom_id): }) @login_required +@permission_required("admin.delete_domain") def deldomain(request, dom_id): + if not is_superuser(request.user): + return mailboxes(request, dom_id) domain = Domain.objects.get(pk=dom_id) domain.delete_dir() domain.delete() return HttpResponseRedirect('/mailng/admin/') @login_required +@permission_required("admin.view_mailboxes") def mailboxes(request, dom_id=None): domain = Domain.objects.get(pk=dom_id) mailboxes = Mailbox.objects.filter(domain=dom_id) @@ -102,6 +123,7 @@ def mailboxes(request, dom_id=None): }) @login_required +@permission_required("admin.view_mailboxes") def mailboxes_raw(request, dom_id=None): mailboxes = Mailbox.objects.filter(domain=dom_id) return _render(request, 'admin/mailboxes_raw.html', { @@ -109,6 +131,7 @@ def mailboxes_raw(request, dom_id=None): }) @login_required +@permission_required("admin.add_mailbox") def newmailbox(request, dom_id=None): domain = Domain.objects.get(pk=dom_id) if request.method == "POST": @@ -123,7 +146,6 @@ def newmailbox(request, dom_id=None): if mb.create_dir(domain): user = User() user.username = user.email = "%s@%s" % (mb.address, domain.name) -# user.set_password(request.POST["password1"]) user.set_unusable_password() user.is_active = request.POST.has_key("enabled") \ and True or False @@ -156,6 +178,7 @@ def newmailbox(request, dom_id=None): }) @login_required +@permission_required("admin.change_mailbox") def editmailbox(request, dom_id, mbox_id=None): mb = Mailbox.objects.get(pk=mbox_id) if request.method == "POST": @@ -201,6 +224,7 @@ def editmailbox(request, dom_id, mbox_id=None): }) @login_required +@permission_required("admin.delete_mailbox") def delmailbox(request, dom_id, mbox_id=None): mb = Mailbox.objects.get(pk=mbox_id) mb.delete_dir() @@ -210,6 +234,7 @@ def delmailbox(request, dom_id, mbox_id=None): args=[dom_id])) @login_required +@permission_required("admin.view_aliases") def aliases(request, dom_id=None, mbox_id=None): domain = Domain.objects.get(pk=dom_id) if not mbox_id: @@ -224,6 +249,7 @@ def aliases(request, dom_id=None, mbox_id=None): }) @login_required +@permission_required("admin.add_alias") def newalias(request, dom_id, mbox_id): mbox = Mailbox.objects.get(pk=mbox_id) if request.method == "POST": @@ -251,6 +277,7 @@ def newalias(request, dom_id, mbox_id): }) @login_required +@permission_required("admin.change_alias") def editalias(request, dom_id, alias_id): alias = Alias.objects.get(pk=alias_id) if request.method == "POST": @@ -279,6 +306,7 @@ def editalias(request, dom_id, alias_id): }) @login_required +@permission_required("admin.delete_alias") def delalias(request, dom_id, alias_id): alias = Alias.objects.get(pk=alias_id) alias.delete() @@ -286,14 +314,16 @@ def delalias(request, dom_id, alias_id): args=[dom_id])) @login_required +@user_passes_test(lambda u: u.is_superuser) def settings(request): admins = User.objects.filter(is_superuser=True) - domadmins = User.objects.filter(groups__name="DomainAdmins") + domadmins = Mailbox.objects.filter(user__groups__name="DomainAdmins") return _render(request, 'admin/permissions.html', { "admins" : admins, "domadmins" : domadmins }) @login_required +@user_passes_test(lambda u: u.is_superuser) def addpermission(request): if request.method == "POST": form = PermissionForm(request.POST) @@ -304,7 +334,7 @@ def addpermission(request): if form.is_valid(): mb = Mailbox.objects.get(pk=request.POST["user"]) if request.POST["role"] == "SuperAdmins": - mb.user.is_superadmin = True + mb.user.is_superuser = True else: mb.user.groups.add(Group.objects.get(name=request.POST["role"])) mb.user.save() diff --git a/scripts/populate.py b/scripts/populate.py index 6b7c4c772..e816b0860 100755 --- a/scripts/populate.py +++ b/scripts/populate.py @@ -1,10 +1,15 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- -from django.contrib.auth.models import Group +from django.contrib.auth.models import Group, Permission if __name__ == "__main__": - for gname in ["DomainAdmins", "Users"]: - grp = Group() - grp.name = gname - grp.save() + grp = Group() + grp.name = "DomainAdmins" + grp.save() + + for pcode in ["add_mailbox", "change_mailbox", "delete_mailbox", "add_alias", + "change_alias", "delete_alias", "view_domain", "view_mailboxes", + "view_aliases"]: + grp.permissions.add(Permission.objects.get(codename=pcode)) + grp.save() diff --git a/templates/admin/domain_menu.html b/templates/admin/domain_menu.html index 41771b7a1..85c92c440 100644 --- a/templates/admin/domain_menu.html +++ b/templates/admin/domain_menu.html @@ -20,9 +20,11 @@ {% trans "Aliases" %} + {% if perms.admin.change_domain %}
  • {% trans "Properties" %}
  • + {% endif %} diff --git a/templates/admin/layout.html b/templates/admin/layout.html index 3548d4a99..ac2c338a3 100644 --- a/templates/admin/layout.html +++ b/templates/admin/layout.html @@ -18,6 +18,7 @@
    + {% if user.is_superuser %} + {% endif %}
    {%block mainframe %}{% endblock %} diff --git a/templates/admin/mailboxes.html b/templates/admin/mailboxes.html index c73a0e05e..1edf11088 100644 --- a/templates/admin/mailboxes.html +++ b/templates/admin/mailboxes.html @@ -6,6 +6,16 @@ {% block domcontent %} {% load i18n %} +{% if messages %} +
    + +
    +{% endif %} + {% if not mailboxes %}

    {% trans "No mailbox defined." %}

    {% else %} diff --git a/templates/admin/permissions.html b/templates/admin/permissions.html index 5d4edf157..f36413b3a 100644 --- a/templates/admin/permissions.html +++ b/templates/admin/permissions.html @@ -12,9 +12,9 @@ - + - + {% for admin in admins %} @@ -36,9 +36,9 @@
    {% trans "Actions" %}{% trans "Full name" %}{% trans "Full name" %} {% trans "User name" %}{% trans "Enabled" %}{% trans "Enabled" %}
    - + - + {% for admin in domadmins %} @@ -46,7 +46,7 @@ - + {% endfor %}
    {% trans "Actions" %}{% trans "Domain" %}{% trans "Domain" %} {% trans "Name" %}{% trans "Enabled" %}{% trans "Enabled" %}
    {{ admin.domain.name }}{{ admin.first_name }} {{ admin.last_name }}{{ admin.name }} {{ admin.is_active|yesno }}