mirror of
https://github.com/jwinterm/modoboa.git
synced 2026-10-18 05:51:26 +02:00
fixed #96
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:
+8
-13
@@ -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
@@ -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
@@ -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
|
||||
})
|
||||
|
||||
|
||||
@@ -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");
|
||||
|
||||
|
||||
@@ -16,6 +16,7 @@ events = ["CreateDomain",
|
||||
"AdminMenuDisplay",
|
||||
|
||||
"PermsGetTables",
|
||||
"PermsGetClass",
|
||||
|
||||
"UserLogin",
|
||||
"UserLogout"]
|
||||
|
||||
@@ -349,7 +349,7 @@ div.row {
|
||||
|
||||
div.row label {
|
||||
float: left;
|
||||
width: 200px;
|
||||
width: 300px;
|
||||
padding: 3px 0;
|
||||
}
|
||||
|
||||
|
||||
+6
-1
@@ -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);
|
||||
|
||||
@@ -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 %}
|
||||
|
||||
@@ -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 %}
|
||||
|
||||
Reference in New Issue
Block a user