Querysets used to populate form fields are more filtered (ie. the default admin is ignored, as the current logged in user).

see #92

More protection against errors that can happen when defining new permissions.
This commit is contained in:
tonio
2010-11-27 17:49:55 +01:00
parent 0973e0f260
commit 5d425c8cbe
10 changed files with 86 additions and 57 deletions
+8 -13
View File
@@ -55,27 +55,22 @@ class AliasForm(forms.ModelForm):
model = Alias
fields = ('address', 'mboxes', 'enabled')
class PermissionForm(forms.Form):
domain = forms.ModelChoiceField(queryset=Domain.objects.all(), label=_("Domain"),
required=True,
help_text=_("Select a domain in the list"))
user = forms.ChoiceField(label=_("User"), required=True,
help_text=_("Select a user in the list"))
role = forms.ChoiceField(label=_("Role"), required=True,
choices=(("SuperAdmins", _("Super administrator")),
("DomainAdmins", _("Domain administrator"))),
help_text=_("Select the role you want this user to have"))
class SuperAdminForm(forms.Form):
user = forms.ModelChoiceField(queryset=User.objects.all(),
label=_("User"), required=True,
user = forms.ModelChoiceField([], label=_("User"), required=True,
empty_label=_("Select a user"),
help_text=_("Select a user in the list"))
def __init__(self, user, *args, **kwargs):
super(SuperAdminForm, self).__init__(*args, **kwargs)
self.fields["user"].queryset = User.objects.exclude(pk__in=[1, user.id])
class DomainAdminForm(forms.Form):
domain = forms.ModelChoiceField(queryset=Domain.objects.all(), label=_("Domain"),
required=True,
empty_label=_("Select a domain"),
help_text=_("Select a domain in the list"))
user = forms.ChoiceField(label=_("User"), required=True,
choices=[("", _("Empty"))],
help_text=_("Select a user in the list"))
class SuperAdminsTable(tables.Table):
+47 -20
View File
@@ -2,7 +2,7 @@
from django.utils.translation import ugettext as _
from django.contrib.auth.models import User, Group
from modoboa.lib import _render
from modoboa.lib import _render, getctx, _render_to_string
from forms import *
class Permissions(object):
@@ -23,20 +23,23 @@ class Permissions(object):
raise NotImplementedError
class SuperAdminsPerms(Permissions):
title = _("Add super administrator")
role = "super_admins"
@staticmethod
def is_auhorized(user):
return user.is_superuser
def get_add_form(self, request):
form = SuperAdminForm()
form = SuperAdminForm(request.user)
return _render(request, 'admin/add_permission.html', {
"form" : form,
"title" : _("Add super administrator"),
"role": "super_admins"
"title" : self.title,
"role": self.role
})
def add(self, request):
form = SuperAdminForm(request.POST)
form = SuperAdminForm(request.user, request.POST)
if form.is_valid():
user = User.objects.get(pk=request.POST["user"])
user.is_superuser = True
@@ -44,10 +47,12 @@ class SuperAdminsPerms(Permissions):
user.save()
return True, None
ctx = _ctx_ko("admin/add_superadmin.html", {
"form" : form
content = _render_to_string(request, "admin/add_permission.html", {
"form" : form,
"title" : self.title,
"role" : self.role
})
return False, ctx
return False, getctx("ko", content=content)
def delete(self, selection):
for s in selection:
@@ -69,32 +74,38 @@ class SuperAdminsPerms(Permissions):
class DomainAdminsPerms(Permissions):
title = _("Add domain administrator")
role = "domain_admins"
@staticmethod
def is_auhorized(user):
return True
def is_authorized(user):
return user.has_perm("admin.view_domains")
def get_add_form(self, request):
form = DomainAdminForm()
return _render(request, 'admin/add_domain_admin.html', {
"form" : form, "title" : _("Add domain administrator"),
"role" : "domain_admins"
"form" : form,
"title" : self.title,
"role" : self.role
})
def add(self, request):
form = DomainAdminForm(request.POST)
mboxid = request.POST['user']
form.fields["user"].choices = \
[(mboxid, Mailbox.objects.get(pk=mboxid)),]
if request.POST.has_key("user") and request.POST["user"] != "":
mboxid = request.POST['user']
mb = Mailbox.objects.get(pk=mboxid)
form.fields["user"].choices = [(mboxid, mb),]
if form.is_valid():
mb = Mailbox.objects.get(pk=request.POST["user"])
mb.user.is_superuser = False
mb.user.groups.add(Group.objects.get(name="DomainAdmins"))
mb.user.save()
return True, None
ctx = _ctx_ko("admin/add_domain_admin.html", {
"form" : form
content = _render_to_string(request, "admin/add_domain_admin.html", {
"form" : form,
"title" : self.title,
"role" : self.role
})
return False, ctx
return False, getctx("ko", content=content)
def delete(self, selection):
for s in selection:
@@ -111,6 +122,19 @@ class DomainAdminsPerms(Permissions):
return DomainAdminsTable(domadmins_list).render(request)
def get_perms_class(user, role):
"""Retrieves the class associated to a given role
The provided user must have the required permission to retrieve
this class.
If "role" is one of those provided by the admin component, its
class is directly returned. Otherwise, a "PermsGetClass" event is
raised to check if one of the active plugins provide the desired
class.
:param user: a User object
:param role: the role to look for
"""
parts = role.split("_")
cname = ""
for p in parts:
@@ -120,4 +144,7 @@ def get_perms_class(user, role):
if globals()[cname].is_auhorized(user):
return globals()[cname]
return None
# else raise event for plugins
res = events.raiseQueryEvent("PermsGetClass", role=role)
if not len(res):
return None
return res[0]
+3 -3
View File
@@ -115,7 +115,7 @@ def editdomain(request, dom_id):
return HttpResponse(simplejson.dumps(ctx), mimetype="application/json")
form = DomainForm(instance=domain)
return render_to_response('admin/editdomain.html', {
return _render(request, 'admin/editdomain.html', {
"domain" : domain, "form" : form
})
@@ -142,7 +142,7 @@ def mailboxes(request, dom_id=None):
@good_domain
@permission_required("admin.view_mailboxes")
def mailboxes_raw(request, dom_id=None):
mailboxes = Mailbox.objects.filter(domain=dom_id)
mailboxes = Mailbox.objects.filter(domain=dom_id).exclude(user__id=request.user.id)
return _render(request, 'admin/mailboxes_raw.html', {
"mailboxes" : mailboxes
})
@@ -310,7 +310,7 @@ def newalias(request, dom_id):
return HttpResponse(simplejson.dumps(ctx), mimetype="application/json")
form = AliasForm(domain=domain)
return render_to_response('admin/newalias.html', {
return _render(request, 'admin/newalias.html', {
"domain" : dom_id, "form" : form, "noerrors" : True
})
+1 -1
View File
@@ -44,7 +44,7 @@ html > body #listing {
border-bottom: 1px solid #C8D6E8;
user-select: none; /* CSS3 */
-moz-user-select: none; /* Gecko (Firefox) */
-khtml-user-select:none; /* Webkit (Safari, Chrome) */
-khtml-user-select: none; /* Webkit (Safari, Chrome) */
}
tr.selected {
@@ -211,12 +211,6 @@
var fromrow = -1;
var torow = -1;
$(document.body).addEvent("keydown", function(event) {
if (event.shift) {
event.stop();
}
});
/* The IE way for disabling default selection */
$$("tbody>tr").set("unselectable", "on");
+1
View File
@@ -16,6 +16,7 @@ events = ["CreateDomain",
"AdminMenuDisplay",
"PermsGetTables",
"PermsGetClass",
"UserLogin",
"UserLogout"]
+1 -1
View File
@@ -349,7 +349,7 @@ div.row {
div.row label {
float: left;
width: 200px;
width: 300px;
padding: 3px 0;
}
+6 -1
View File
@@ -33,7 +33,12 @@ window.addEvent("domready", function() {
generic_submit(this, event, "aliasform", alias_submit);
};
permission_submit = function(event) {
generic_submit(this, event, "permform", permission_submit);
generic_submit(this, event, "permform", permission_submit, function() {
if ($defined($("id_domain"))) {
$("id_domain").options[0].setProperty("selected", "selected");
domadminform_init();
}
});
};
chpassword_submit = function(event) {
generic_submit(this, event, "chpwdform", chpassword_submit);
+16 -11
View File
@@ -3,18 +3,23 @@
{{ block.super }}
<script type="text/javascript">
window.addEvent("domready", function() {
$("id_domain").addEvent("change", function(event) {
domid = this.value;
if (domid == "") {
$("id_user").set("html", "");
return;
}
{% url domains as doms_url %}
new Request({url: "{{ doms_url }}" + domid + "/raw/",
method: "get", onSuccess: function(data) {
$("id_user").set("html", data);
}}).send();
domadminform_init = function() {
$("id_domain").addEvent("change", function(event) {
var domid = this.value;
if (domid == "") {
$("id_user").set("html", "");
return;
}
{% url domains as doms_url %}
new Request({
url: "{{ doms_url }}" + domid + "/raw/",
method: "get", onSuccess: function(data) {
$("id_user").set("html", data);
}
}).send();
});
};
domadminform_init();
});
</script>
{% endblock %}
+3 -1
View File
@@ -1,3 +1,5 @@
{% load i18n %}
<option value="">{% trans "Choose a value" %}</option>
{% for mb in mailboxes %}
<option value='{{ mb.id }}'>{{ mb.name }}</option>
{% endfor %}
{% endfor %}