diff --git a/extensions/postfix_autoreply/views.py b/extensions/postfix_autoreply/views.py index 9d182bc1e..56e821059 100644 --- a/extensions/postfix_autoreply/views.py +++ b/extensions/postfix_autoreply/views.py @@ -6,11 +6,12 @@ from django.contrib.auth.decorators \ import login_required from django.core.urlresolvers import reverse from django.utils.translation import ugettext as _ -from mailng.lib import _render, _ctx_ok, _ctx_ko +from mailng.lib import _render, _ctx_ok, _ctx_ko, is_not_localadmin from forms import * from models import * @login_required +@is_not_localadmin('boxerror') def autoreply(request): mb = Mailbox.objects.get(user=request.user.id) try: diff --git a/extensions/webmail/views.py b/extensions/webmail/views.py index e09c3fbce..b9609a94d 100644 --- a/extensions/webmail/views.py +++ b/extensions/webmail/views.py @@ -9,7 +9,7 @@ from django.utils.translation import ugettext as _ from django.core.urlresolvers import reverse from django.contrib.auth.decorators import login_required from mailng.admin.models import Mailbox -from mailng.lib import parameters, _render, _render_error, getctx +from mailng.lib import parameters, _render, _render_error, getctx, is_not_localadmin from imap_listing import * from forms import * from templatetags.webextras import * @@ -23,6 +23,7 @@ def __get_current_url(request): return res @login_required +@is_not_localadmin() def folder(request, name, updatenav=True): if not name: name = "INBOX" @@ -64,6 +65,7 @@ def folder(request, name, updatenav=True): return HttpResponse(simplejson.dumps(ctx), mimetype="application/json") @login_required +@is_not_localadmin() def index(request): try: navp = request.session.has_key("navparams") \ @@ -82,6 +84,7 @@ def fetchmail(request, folder, mail_id, all=False): return None @login_required +@is_not_localadmin() def viewmail(request, folder, mail_id=None): from templatetags.webextras import viewm_menu @@ -94,6 +97,7 @@ def viewmail(request, folder, mail_id=None): return HttpResponse(simplejson.dumps(ctx), mimetype="application/json") @login_required +@is_not_localadmin() def getmailcontent(request, folder, mail_id): msg = fetchmail(request, folder, mail_id, True) if "class" in msg.keys() and msg["class"] == "unseen": @@ -110,6 +114,7 @@ def getmailcontent(request, folder, mail_id): }) @login_required +@is_not_localadmin() def getattachment(request, folder, mail_id): msg = fetchmail(request, folder, mail_id, True) for part in msg.walk(): @@ -130,6 +135,7 @@ def getattachment(request, folder, mail_id): raise Http404 @login_required +@is_not_localadmin() def move(request): for arg in ["msgset", "to"]: if not request.GET.has_key(arg): @@ -139,12 +145,14 @@ def move(request): return folder(request, request.session["folder"], False) @login_required +@is_not_localadmin() def delete(request, fdname, mail_id): mbc = IMAPconnector(request) mbc.move(mail_id, fdname, "Trash") return folder(request, fdname, False) @login_required +@is_not_localadmin() def mark(request, name): if not request.GET.has_key("status") or not request.GET.has_key("ids"): return @@ -156,6 +164,7 @@ def mark(request, name): return folder(request, name, False) @login_required +@is_not_localadmin() def empty(request, name): if name == "Trash": mbc = IMAPconnector(request) @@ -163,6 +172,7 @@ def empty(request, name): return folder(request, name, False) @login_required +@is_not_localadmin() def compact(request, name): mbc = IMAPconnector(request) mbc.compact(name) @@ -221,6 +231,7 @@ def send_mail(request, withctx=False, origmsg=None): return ctx, HttpResponse(simplejson.dumps(ctx), mimetype="application/json") @login_required +@is_not_localadmin() def compose(request): if request.method == "POST": return send_mail(request) @@ -230,6 +241,7 @@ def compose(request): return render_compose(request, form, reverse(compose)) @login_required +@is_not_localadmin() def reply(request, folder, mail_id): msg = fetchmail(request, folder, mail_id, True) if request.method == "POST": @@ -272,6 +284,7 @@ def reply(request, folder, mail_id): textheader, body) @login_required +@is_not_localadmin() def forward(request, folder, mail_id): if request.method == "POST": ctx, response = send_mail(request, True) diff --git a/lib/__init__.py b/lib/__init__.py index cad017020..aec3a6e77 100644 --- a/lib/__init__.py +++ b/lib/__init__.py @@ -5,6 +5,7 @@ import time from django.template import RequestContext from django.shortcuts import render_to_response from django.template.loader import render_to_string +from django.utils.translation import ugettext as _ from mailng.lib import parameters def exec_cmd(cmd): @@ -18,8 +19,8 @@ def _render(request, tpl, user_context): return render_to_response(tpl, user_context, context_instance=RequestContext(request)) -def _render_error(request, user_context): - return render_to_response("common/error.html", user_context, +def _render_error(request, errortpl, user_context): + return render_to_response("common/%s.html" % errortpl, user_context, context_instance=RequestContext(request)) def exec_as_vuser(cmd): @@ -54,6 +55,18 @@ def decode(s, encodings=('utf8', 'latin1', 'windows-1252', 'ascii')): pass return s.decode('ascii', 'ignore') +def is_not_localadmin(errortpl="error"): + def dec(f): + def wrapped_f(request, **kwargs): + if request.user.id == 1: + return _render_error(request, errortpl, { + "error" : _("Invalid action, %s is a local user" \ + % request.user.username) + }) + return f(request, **kwargs) + return wrapped_f + return dec + class Singleton(type): def __init__(cls, name, bases, dict): super(Singleton, cls).__init__(name, bases, dict) diff --git a/scripts/populate.py b/scripts/populate.py deleted file mode 100755 index e816b0860..000000000 --- a/scripts/populate.py +++ /dev/null @@ -1,15 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -from django.contrib.auth.models import Group, Permission - -if __name__ == "__main__": - 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()