from django.shortcuts import render, get_object_or_404 from django.http import HttpResponseRedirect, Http404 from django.contrib.auth.decorators import login_required from django.contrib import messages from django.db import transaction from .models import * from .forms import * def log(user, what): l = Log() l.user = user l.what = what l.save() def noaccess(request): return HttpResponse("Access to this site is only for pre-approved users") @login_required def home(request): admperm = request.user.is_superuser or \ VirtualUser.objects.extra(where=["EXISTS (SELECT 1 FROM mailmgr_userpermissions p WHERE p.user_id=%s AND p.domain_id = local_domain_id AND local_part ~* ('^'||p.pattern||'$'))" % request.user.id]).exists() or \ Forwarder.objects.extra(where=["EXISTS (SELECT 1 FROM mailmgr_userpermissions p WHERE p.user_id=%s AND p.domain_id = local_domain_id AND local_part ~* ('^'||p.pattern||'$'))" % request.user.id]).exists() mailboxes = VirtualUser.objects.filter(account=request.user.id) return render(request, 'home.html', { 'admperm': admperm, 'mailboxes': mailboxes, }) @login_required def mailbox(request, virtualid): mailbox = get_object_or_404(VirtualUser, virtual_user_id=virtualid, account=request.user.id) if request.method == 'POST': form = PasswordChangeForm(data=request.POST, mailbox=mailbox) if form.is_valid(): with transaction.atomic(): curs = connection.cursor() curs.execute("UPDATE mail.virtual_user SET passwd=public.crypt(%(pwd)s, public.gen_salt('md5')) WHERE virtual_user_id=%(id)s", { 'id': mailbox.virtual_user_id, 'pwd': form.cleaned_data['password'], }) log(request.user, "Changed password for own mailbox {}".format(mailbox.fulladdr)) messages.info(request, "Changed password of {}".format(mailbox.fulladdr)) return HttpResponseRedirect('/') else: form = PasswordChangeForm(mailbox=mailbox) return render(request, 'mailbox.html', { 'mailbox': mailbox, 'form': form, 'extrabuttons': [ ('Cancel', '/'), ], }) @login_required def adm_home(request): if request.user.is_superuser: users = VirtualUser.objects.all() forwards = Forwarder.objects.all() else: users = VirtualUser.objects.extra(where=["EXISTS (SELECT 1 FROM mailmgr_userpermissions p WHERE p.user_id=%s AND p.domain_id = local_domain_id AND local_part ~* ('^'||p.pattern||'$'))" % request.user.id]) forwards = Forwarder.objects.extra(where=["EXISTS (SELECT 1 FROM mailmgr_userpermissions p WHERE p.user_id=%s AND p.domain_id = local_domain_id AND local_part ~* ('^'||p.pattern||'$'))" % request.user.id]) if not forwards and not users: return render(request, 'noadm.html', { }) return render(request, 'adm.html', { 'users': users, 'forwarders': forwards, }) def _get_virtualuser(request, userparam): if request.user.is_superuser: return get_object_or_404(VirtualUser, pk=userparam) else: vulist = VirtualUser.objects.filter(pk=userparam).extra(where=["EXISTS (SELECT 1 FROM mailmgr_userpermissions p WHERE p.user_id=%s AND p.domain_id = local_domain_id AND local_part ~* ('^'||p.pattern||'$'))" % request.user.id]) if len(vulist) != 1: raise Http404("Not found or no permissions!") return vulist[0] @transaction.atomic @login_required def userform(request, userparam): if userparam == 'add': vu = VirtualUser() else: vu = _get_virtualuser(request, userparam) if request.method == 'POST': form = VirtualUserForm(data=request.POST, instance=vu, user=request.user) if request.POST['passwd'] != vu.passwd: password_changed = True else: password_changed = False if form.is_valid(): form.save() messages.add_message(request, messages.INFO, 'User %s updated' % vu) if password_changed: messages.add_message(request, messages.INFO, 'Password changed for user %s' % vu) log(request.user, "%s user %s, including changing the password" % (userparam == 'add' and 'Added' or 'Updated', vu)) else: log(request.user, "%s user %s, without changing the password" % (userparam == 'add' and 'Added' or 'Updated', vu)) return HttpResponseRedirect('/adm/') else: # Generate a new form form = VirtualUserForm(instance=vu, user=request.user) return render(request, 'form.html', { 'form': form, 'savebutton': (userparam == 'new') and "New" or "Save", 'extrabuttons': [ ('Cancel', '/adm/'), ], }) def _get_forwarder(request, userparam): if request.user.is_superuser: return get_object_or_404(Forwarder, pk=userparam) else: fwdlist = Forwarder.objects.filter(pk=userparam).extra(where=["EXISTS (SELECT 1 FROM mailmgr_userpermissions p WHERE p.user_id=%s AND p.domain_id = local_domain_id AND local_part ~* ('^'||p.pattern||'$'))" % request.user.id]) if len(fwdlist) != 1: raise Http404("Not found or no permissions!") return fwdlist[0] @transaction.atomic @login_required def forwarderform(request, userparam): if userparam == 'add': fwd = Forwarder() else: fwd = _get_forwarder(request, userparam) if request.method == 'POST': form = ForwarderForm(data=request.POST, instance=fwd, user=request.user) if form.is_valid(): form.save() log(request.user, "%s forwarding %s -> %s" % (userparam == 'add' and 'Added' or 'Updated', fwd, fwd.remote_name)) messages.add_message(request, messages.INFO, 'Forwarder %s updated' % fwd) return HttpResponseRedirect('/adm/') else: # Generate a new form form = ForwarderForm(instance=fwd, user=request.user) extrabuttons = [ ('Cancel', '/adm/'), ] if userparam != 'add': extrabuttons.append(('Delete', 'delete/')) return render(request, 'form.html', { 'form': form, 'savebutton': (userparam == 'new') and "New" or "Save", 'extrabuttons': extrabuttons, }) @transaction.atomic @login_required def deleteforwarder(request, userparam): fwd = _get_forwarder(request, userparam) if request.method == 'POST': form = ConfirmForm(data=request.POST) if form.is_valid(): fwdname = str(fwd) fwd.delete() log(request.user, "Deleted forwarder {}".format(fwdname)) messages.info(request, "Deleted forwarder {}".format(fwdname)) return HttpResponseRedirect("/adm/") else: form = ConfirmForm() return render(request, 'confirm.html', { 'form': form, 'object': 'forwarder', 'what': 'delete', 'name': fwd, 'savebutton': 'Delete', 'extrabuttons': [ ('Cancel', '../'), ], })