diff options
author | Magnus Hagander | 2019-02-24 11:11:46 +0000 |
---|---|---|
committer | Magnus Hagander | 2019-02-24 11:11:46 +0000 |
commit | f4640e320a126ee58d713a026fa7c09e01c2b00d (patch) | |
tree | 547eef410830ecd414a7f73d2f1d029fe26013c1 | |
parent | 7c131bc5755c0f52a99ac47c7f6d79aecbca679b (diff) |
Change tabs to spaces
-rw-r--r-- | pgmailmgr/auth.py | 142 | ||||
-rw-r--r-- | pgmailmgr/mailmgr/forms.py | 224 | ||||
-rw-r--r-- | pgmailmgr/mailmgr/models.py | 98 | ||||
-rw-r--r-- | pgmailmgr/mailmgr/views.py | 120 | ||||
-rw-r--r-- | pgmailmgr/settings.py | 34 |
5 files changed, 309 insertions, 309 deletions
diff --git a/pgmailmgr/auth.py b/pgmailmgr/auth.py index c3118d5..0a7101e 100644 --- a/pgmailmgr/auth.py +++ b/pgmailmgr/auth.py @@ -32,10 +32,10 @@ from Crypto.Cipher import AES import time class AuthBackend(ModelBackend): - # We declare a fake backend that always fails direct authentication - - # since we should never be using direct authentication in the first place! - def authenticate(self, username=None, password=None): - raise Exception("Direct authentication not supported") + # We declare a fake backend that always fails direct authentication - + # since we should never be using direct authentication in the first place! + def authenticate(self, username=None, password=None): + raise Exception("Direct authentication not supported") #### @@ -44,85 +44,85 @@ class AuthBackend(ModelBackend): # Handle login requests by sending them off to the main site def login(request): - if request.GET.has_key('next'): - return HttpResponseRedirect("%s?su=%s" % ( - settings.PGAUTH_REDIRECT, - quote_plus(request.GET['next']), - )) - else: - return HttpResponseRedirect(settings.PGAUTH_REDIRECT) + if request.GET.has_key('next'): + return HttpResponseRedirect("%s?su=%s" % ( + settings.PGAUTH_REDIRECT, + quote_plus(request.GET['next']), + )) + else: + return HttpResponseRedirect(settings.PGAUTH_REDIRECT) # Handle logout requests by logging out of this site and then # redirecting to log out from the main site as well. def logout(request): - if request.user.is_authenticated(): - django_logout(request) - return HttpResponseRedirect("%slogout/" % settings.PGAUTH_REDIRECT) + if request.user.is_authenticated(): + django_logout(request) + return HttpResponseRedirect("%slogout/" % settings.PGAUTH_REDIRECT) # Receive an authentication response from the main website and try # to log the user in. def auth_receive(request): - if request.GET.has_key('s') and request.GET['s'] == "logout": - # This was a logout request - return HttpResponseRedirect('/') + if request.GET.has_key('s') and request.GET['s'] == "logout": + # This was a logout request + return HttpResponseRedirect('/') - if not request.GET.has_key('i'): - raise Exception("Missing IV") - if not request.GET.has_key('d'): - raise Exception("Missing data!") + if not request.GET.has_key('i'): + raise Exception("Missing IV") + if not request.GET.has_key('d'): + raise Exception("Missing data!") - # Set up an AES object and decrypt the data we received - decryptor = AES.new(base64.b64decode(settings.PGAUTH_KEY), - AES.MODE_CBC, - base64.b64decode(str(request.GET['i']), "-_")) - s = decryptor.decrypt(base64.b64decode(str(request.GET['d']), "-_")).rstrip(' ') + # Set up an AES object and decrypt the data we received + decryptor = AES.new(base64.b64decode(settings.PGAUTH_KEY), + AES.MODE_CBC, + base64.b64decode(str(request.GET['i']), "-_")) + s = decryptor.decrypt(base64.b64decode(str(request.GET['d']), "-_")).rstrip(' ') - # Now un-urlencode it - try: - data = urlparse.parse_qs(s, strict_parsing=True) - except ValueError, e: - raise Exception("Invalid encrypted data received.") + # Now un-urlencode it + try: + data = urlparse.parse_qs(s, strict_parsing=True) + except ValueError, e: + raise Exception("Invalid encrypted data received.") - # Check the timestamp in the authentication - if (int(data['t'][0]) < time.time() - 10): - raise Exception("Authentication token too old.") + # Check the timestamp in the authentication + if (int(data['t'][0]) < time.time() - 10): + raise Exception("Authentication token too old.") - # Update the user record (if any) - try: - user = User.objects.get(username=data['u'][0]) - # User found, let's see if any important fields have changed - changed = False - if user.first_name != data['f'][0]: - user.first_name = data['f'][0] - changed = True - if user.last_name != data['l'][0]: - user.last_name = data['l'][0] - changed = True - if user.email != data['e'][0]: - user.email = data['e'][0] - changed= True - if changed: - user.save() - except User.DoesNotExist, e: - # User not found, create it! - user = User(username=data['u'][0], - first_name=data['f'][0], - last_name=data['l'][0], - email=data['e'][0], - password='setbypluginnotasha1', - ) - user.save() + # Update the user record (if any) + try: + user = User.objects.get(username=data['u'][0]) + # User found, let's see if any important fields have changed + changed = False + if user.first_name != data['f'][0]: + user.first_name = data['f'][0] + changed = True + if user.last_name != data['l'][0]: + user.last_name = data['l'][0] + changed = True + if user.email != data['e'][0]: + user.email = data['e'][0] + changed= True + if changed: + user.save() + except User.DoesNotExist, e: + # User not found, create it! + user = User(username=data['u'][0], + first_name=data['f'][0], + last_name=data['l'][0], + email=data['e'][0], + password='setbypluginnotasha1', + ) + user.save() - # Ok, we have a proper user record. Now tell django that - # we're authenticated so it persists it in the session. Before - # we do that, we have to annotate it with the backend information. - user.backend = "%s.%s" % (AuthBackend.__module__, AuthBackend.__name__) - django_login(request, user) + # Ok, we have a proper user record. Now tell django that + # we're authenticated so it persists it in the session. Before + # we do that, we have to annotate it with the backend information. + user.backend = "%s.%s" % (AuthBackend.__module__, AuthBackend.__name__) + django_login(request, user) - # Finally, redirect the user - if data.has_key('su'): - return HttpResponseRedirect(data['su'][0]) - # No redirect specified, see if we have it in our settings - if hasattr(settings, 'PGAUTH_REDIRECT_SUCCESS'): - return HttpResponseRedirect(settings.PGAUTH_REDIRECT_SUCCESS) - raise Exception("Authentication successful, but don't know where to redirect!") + # Finally, redirect the user + if data.has_key('su'): + return HttpResponseRedirect(data['su'][0]) + # No redirect specified, see if we have it in our settings + if hasattr(settings, 'PGAUTH_REDIRECT_SUCCESS'): + return HttpResponseRedirect(settings.PGAUTH_REDIRECT_SUCCESS) + raise Exception("Authentication successful, but don't know where to redirect!") diff --git a/pgmailmgr/mailmgr/forms.py b/pgmailmgr/mailmgr/forms.py index 0514ee8..bc957ec 100644 --- a/pgmailmgr/mailmgr/forms.py +++ b/pgmailmgr/mailmgr/forms.py @@ -5,119 +5,119 @@ from django.db import connection from models import * class VirtualUserForm(forms.ModelForm): - class Meta: - model = VirtualUser - fields = ('local_domain', 'local_part', 'mail_quota', 'passwd', 'full_name') - - def __init__(self, data=None, instance=None, user=None): - super(VirtualUserForm, self).__init__(data=data, instance=instance) - self.user = user - - def clean_local_domain(self): - if not self.instance.pk: return self.cleaned_data['local_domain'] - if self.cleaned_data['local_domain'] != self.instance.local_domain: - raise ValidationError("Can't change local domain!") - return self.cleaned_data['local_domain'] - - def clean_local_part(self): - if not self.instance.pk: return self.cleaned_data['local_part'] - if self.cleaned_data['local_part'] != self.instance.local_part: - raise ValidationError("Renaming accounts is not possible - you have to delete and add!") - return self.cleaned_data['local_part'] - - def clean_mail_quota(self): - if self.cleaned_data['mail_quota'] <= 1: - raise ValidationError("Mail quota must be set") - return self.cleaned_data['mail_quota'] - - def clean_passwd(self): - if self.cleaned_data['passwd'] != self.instance.passwd: - # Changing password requires calling pgcrypto. So let's do that... - curs = connection.cursor() - curs.execute("SELECT public.crypt(%(pwd)s, public.gen_salt('md5'))", { - 'pwd': self.cleaned_data['passwd'] - }) - return curs.fetchall()[0][0] - - return self.cleaned_data['passwd'] - - def clean(self): - if not self.cleaned_data.has_key('local_part'): - return {} - - # Validate that the pattern is allowed - curs = connection.cursor() - curs.execute("SELECT 1 FROM mailmgr_userpermissions WHERE user_id=%(uid)s AND domain_id=%(domain)s AND %(lp)s ~* ('^'||pattern||'$')", { - 'uid': self.user.pk, - 'domain': self.cleaned_data['local_domain'].pk, - 'lp': self.cleaned_data['local_part'], - }) - perms = curs.fetchall() - - if len(perms) < 1: - raise ValidationError("Permission denied to create that user for that domain!") - - # If it's a new user, also check against if it already exists - if not self.instance.pk: - old = VirtualUser.objects.filter(local_part=self.cleaned_data['local_part'], local_domain=self.cleaned_data['local_domain']) - if len(old): - raise ValidationError("A user with that name already exists in that domain!") - - # Make sure we can't get a collision with a forwarding - forwarders = Forwarder.objects.filter(local_part=self.cleaned_data['local_part'], local_domain=self.cleaned_data['local_domain']) - if len(forwarders): - raise ValidationError("A forwarder with that name already exists in that domain!") - - return self.cleaned_data + class Meta: + model = VirtualUser + fields = ('local_domain', 'local_part', 'mail_quota', 'passwd', 'full_name') + + def __init__(self, data=None, instance=None, user=None): + super(VirtualUserForm, self).__init__(data=data, instance=instance) + self.user = user + + def clean_local_domain(self): + if not self.instance.pk: return self.cleaned_data['local_domain'] + if self.cleaned_data['local_domain'] != self.instance.local_domain: + raise ValidationError("Can't change local domain!") + return self.cleaned_data['local_domain'] + + def clean_local_part(self): + if not self.instance.pk: return self.cleaned_data['local_part'] + if self.cleaned_data['local_part'] != self.instance.local_part: + raise ValidationError("Renaming accounts is not possible - you have to delete and add!") + return self.cleaned_data['local_part'] + + def clean_mail_quota(self): + if self.cleaned_data['mail_quota'] <= 1: + raise ValidationError("Mail quota must be set") + return self.cleaned_data['mail_quota'] + + def clean_passwd(self): + if self.cleaned_data['passwd'] != self.instance.passwd: + # Changing password requires calling pgcrypto. So let's do that... + curs = connection.cursor() + curs.execute("SELECT public.crypt(%(pwd)s, public.gen_salt('md5'))", { + 'pwd': self.cleaned_data['passwd'] + }) + return curs.fetchall()[0][0] + + return self.cleaned_data['passwd'] + + def clean(self): + if not self.cleaned_data.has_key('local_part'): + return {} + + # Validate that the pattern is allowed + curs = connection.cursor() + curs.execute("SELECT 1 FROM mailmgr_userpermissions WHERE user_id=%(uid)s AND domain_id=%(domain)s AND %(lp)s ~* ('^'||pattern||'$')", { + 'uid': self.user.pk, + 'domain': self.cleaned_data['local_domain'].pk, + 'lp': self.cleaned_data['local_part'], + }) + perms = curs.fetchall() + + if len(perms) < 1: + raise ValidationError("Permission denied to create that user for that domain!") + + # If it's a new user, also check against if it already exists + if not self.instance.pk: + old = VirtualUser.objects.filter(local_part=self.cleaned_data['local_part'], local_domain=self.cleaned_data['local_domain']) + if len(old): + raise ValidationError("A user with that name already exists in that domain!") + + # Make sure we can't get a collision with a forwarding + forwarders = Forwarder.objects.filter(local_part=self.cleaned_data['local_part'], local_domain=self.cleaned_data['local_domain']) + if len(forwarders): + raise ValidationError("A forwarder with that name already exists in that domain!") + + return self.cleaned_data class ForwarderForm(forms.ModelForm): - class Meta: - model = Forwarder - fields = ('local_part', 'local_domain', 'remote_name') - - def __init__(self, data=None, instance=None, user=None): - super(ForwarderForm, self).__init__(data=data, instance=instance) - self.user = user - - def clean_local_domain(self): - if not self.instance.pk: return self.cleaned_data['local_domain'] - if self.cleaned_data['local_domain'] != self.instance.local_domain: - raise ValidationError("Can't change local domain!") - return self.cleaned_data['local_domain'] - - def clean_local_part(self): - if not self.instance.pk: return self.cleaned_data['local_part'] - if self.cleaned_data['local_part'] != self.instance.local_part: - raise ValidationError("Renaming forwarders is not possible - you have to delete and add!") - return self.cleaned_data['local_part'] - - def clean(self): - if not self.cleaned_data.has_key('local_part'): - return {} - - # Validate that the pattern is allowed - curs = connection.cursor() - curs.execute("SELECT 1 FROM mailmgr_userpermissions WHERE user_id=%(uid)s AND domain_id=%(domain)s AND %(lp)s ~* ('^'||pattern||'$')", { - 'uid': self.user.pk, - 'domain': self.cleaned_data['local_domain'].pk, - 'lp': self.cleaned_data['local_part'], - }) - perms = curs.fetchall() - - if len(perms) < 1: - raise ValidationError("Permission denied to create that forwarder for that domain!") - - # If it's a new user, also check against if it already exists - if not self.instance.pk: - old = Forwarder.objects.filter(local_part=self.cleaned_data['local_part'], local_domain=self.cleaned_data['local_domain']) - if len(old): - raise ValidationError("A forwarder with that name already exists in that domain!") - - # Make sure we can't get a collision with a user - users = VirtualUser.objects.filter(local_part=self.cleaned_data['local_part'], local_domain=self.cleaned_data['local_domain']) - if len(users): - raise ValidationError("A user with that name already exists in that domain!") - - return self.cleaned_data + class Meta: + model = Forwarder + fields = ('local_part', 'local_domain', 'remote_name') + + def __init__(self, data=None, instance=None, user=None): + super(ForwarderForm, self).__init__(data=data, instance=instance) + self.user = user + + def clean_local_domain(self): + if not self.instance.pk: return self.cleaned_data['local_domain'] + if self.cleaned_data['local_domain'] != self.instance.local_domain: + raise ValidationError("Can't change local domain!") + return self.cleaned_data['local_domain'] + + def clean_local_part(self): + if not self.instance.pk: return self.cleaned_data['local_part'] + if self.cleaned_data['local_part'] != self.instance.local_part: + raise ValidationError("Renaming forwarders is not possible - you have to delete and add!") + return self.cleaned_data['local_part'] + + def clean(self): + if not self.cleaned_data.has_key('local_part'): + return {} + + # Validate that the pattern is allowed + curs = connection.cursor() + curs.execute("SELECT 1 FROM mailmgr_userpermissions WHERE user_id=%(uid)s AND domain_id=%(domain)s AND %(lp)s ~* ('^'||pattern||'$')", { + 'uid': self.user.pk, + 'domain': self.cleaned_data['local_domain'].pk, + 'lp': self.cleaned_data['local_part'], + }) + perms = curs.fetchall() + + if len(perms) < 1: + raise ValidationError("Permission denied to create that forwarder for that domain!") + + # If it's a new user, also check against if it already exists + if not self.instance.pk: + old = Forwarder.objects.filter(local_part=self.cleaned_data['local_part'], local_domain=self.cleaned_data['local_domain']) + if len(old): + raise ValidationError("A forwarder with that name already exists in that domain!") + + # Make sure we can't get a collision with a user + users = VirtualUser.objects.filter(local_part=self.cleaned_data['local_part'], local_domain=self.cleaned_data['local_domain']) + if len(users): + raise ValidationError("A user with that name already exists in that domain!") + + return self.cleaned_data diff --git a/pgmailmgr/mailmgr/models.py b/pgmailmgr/mailmgr/models.py index 3f2cb07..86100b4 100644 --- a/pgmailmgr/mailmgr/models.py +++ b/pgmailmgr/mailmgr/models.py @@ -3,73 +3,73 @@ from django.contrib.auth.models import User from django.db.models import signals class LocalDomain(models.Model): - local_domain_id = models.AutoField(null=False, primary_key=True) - domain_name = models.CharField(max_length=100, null=False, blank=False) - path = models.CharField(max_length=512, null=False, blank=False) - unix_user = models.IntegerField(null=False, blank=False, default=0) - unix_group = models.IntegerField(null=False, blank=False, default=0) + local_domain_id = models.AutoField(null=False, primary_key=True) + domain_name = models.CharField(max_length=100, null=False, blank=False) + path = models.CharField(max_length=512, null=False, blank=False) + unix_user = models.IntegerField(null=False, blank=False, default=0) + unix_group = models.IntegerField(null=False, blank=False, default=0) - def __unicode__(self): - return self.domain_name + def __unicode__(self): + return self.domain_name - trigger_update = True - class Meta: - ordering=('domain_name',) - db_table='mail"."local_domains' - managed=False + trigger_update = True + class Meta: + ordering=('domain_name',) + db_table='mail"."local_domains' + managed=False class Forwarder(models.Model): - forwarder_id = models.AutoField(null=False, primary_key=True) - local_part = models.CharField(max_length=100, null=False, blank=False) - local_domain = models.ForeignKey(LocalDomain, null=False, blank=False, db_column='local_domain_id') - remote_name = models.CharField(max_length=200, null=False, blank=False) + forwarder_id = models.AutoField(null=False, primary_key=True) + local_part = models.CharField(max_length=100, null=False, blank=False) + local_domain = models.ForeignKey(LocalDomain, null=False, blank=False, db_column='local_domain_id') + remote_name = models.CharField(max_length=200, null=False, blank=False) - def __unicode__(self): - return "%s@%s -> %s" % (self.local_part, self.local_domain.domain_name, self.remote_name) + def __unicode__(self): + return "%s@%s -> %s" % (self.local_part, self.local_domain.domain_name, self.remote_name) - trigger_update = True - class Meta: - ordering=('local_part',) - db_table='mail"."forwarder' - managed=False + trigger_update = True + class Meta: + ordering=('local_part',) + db_table='mail"."forwarder' + managed=False class VirtualUser(models.Model): - virtual_user_id = models.AutoField(null=False, primary_key=True) - local_domain = models.ForeignKey(LocalDomain, null=False, blank=False, db_column='local_domain_id') - local_part = models.CharField(max_length=100, null=False, blank=False) - mail_quota = models.IntegerField(null=False) - passwd = models.CharField(max_length=100, null=False, blank=False, verbose_name="Password") - full_name = models.CharField(max_length=200, null=False, blank=True) + virtual_user_id = models.AutoField(null=False, primary_key=True) + local_domain = models.ForeignKey(LocalDomain, null=False, blank=False, db_column='local_domain_id') + local_part = models.CharField(max_length=100, null=False, blank=False) + mail_quota = models.IntegerField(null=False) + passwd = models.CharField(max_length=100, null=False, blank=False, verbose_name="Password") + full_name = models.CharField(max_length=200, null=False, blank=True) - def __unicode__(self): - return "%s@%s (%s)" % (self.local_part, self.local_domain.domain_name, self.full_name or '') + def __unicode__(self): + return "%s@%s (%s)" % (self.local_part, self.local_domain.domain_name, self.full_name or '') - trigger_update = True - class Meta: - ordering=('local_part',) - db_table='mail"."virtual_user' - managed=False - unique_together=('local_domain', 'local_part', ) + trigger_update = True + class Meta: + ordering=('local_part',) + db_table='mail"."virtual_user' + managed=False + unique_together=('local_domain', 'local_part', ) class UserPermissions(models.Model): - user = models.ForeignKey(User, null=False) - domain = models.ForeignKey(LocalDomain, null=False) - pattern = models.CharField(max_length=100, null=False, blank=False) + user = models.ForeignKey(User, null=False) + domain = models.ForeignKey(LocalDomain, null=False) + pattern = models.CharField(max_length=100, null=False, blank=False) - def __unicode__(self): - return "%s -> %s pattern '%s'" % (self.user, self.domain, self.pattern) + def __unicode__(self): + return "%s -> %s pattern '%s'" % (self.user, self.domain, self.pattern) class Log(models.Model): - user = models.ForeignKey(User, null=False) - when = models.DateTimeField(null=False, auto_now=True) - what = models.CharField(max_length=2048, null=False, blank=False) + user = models.ForeignKey(User, null=False) + when = models.DateTimeField(null=False, auto_now=True) + what = models.CharField(max_length=2048, null=False, blank=False) - def __unicode__(self): - return "%s (%s): %s" % (self.when, self.user, self.what) + def __unicode__(self): + return "%s (%s): %s" % (self.when, self.user, self.what) - class Meta: - ordering=('-when',) + class Meta: + ordering=('-when',) def pgmail_save_handler(sender, **kwargs): if hasattr(sender, 'trigger_update') and sender.trigger_update: diff --git a/pgmailmgr/mailmgr/views.py b/pgmailmgr/mailmgr/views.py index 421e067..958f85b 100644 --- a/pgmailmgr/mailmgr/views.py +++ b/pgmailmgr/mailmgr/views.py @@ -9,80 +9,80 @@ from models import * from forms import * def log(user, what): - l = Log() - l.user = user - l.what = what - l.save() + l = Log() + l.user = user + l.what = what + l.save() @login_required def home(request): - 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]) + 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]) - return render(request, 'home.html', { - 'users': users, - 'forwarders': forwards, - }) + return render(request, 'home.html', { + 'users': users, + 'forwarders': forwards, + }) @transaction.atomic @login_required def userform(request, userparam): - if userparam == 'add': - vu = VirtualUser() - 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!") - vu = vulist[0] + if userparam == 'add': + vu = VirtualUser() + 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!") + vu = vulist[0] - 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('/') - else: - # Generate a new form - form = VirtualUserForm(instance=vu, user=request.user) + 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('/') + 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" - }) + return render(request,'form.html', { + 'form': form, + 'savebutton': (userparam == 'new') and "New" or "Save" + }) @transaction.atomic @login_required def forwarderform(request, userparam): - if userparam == 'add': - fwd = Forwarder() - 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!") - fwd = fwdlist[0] + if userparam == 'add': + fwd = Forwarder() + 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!") + fwd = fwdlist[0] - 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('/') - else: - # Generate a new form - form = ForwarderForm(instance=fwd, user=request.user) + 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('/') + else: + # Generate a new form + form = ForwarderForm(instance=fwd, user=request.user) - return render(request, 'form.html', { - 'form': form, - 'savebutton': (userparam == 'new') and "New" or "Save" - }) + return render(request, 'form.html', { + 'form': form, + 'savebutton': (userparam == 'new') and "New" or "Save" + }) diff --git a/pgmailmgr/settings.py b/pgmailmgr/settings.py index 12d67bc..279319c 100644 --- a/pgmailmgr/settings.py +++ b/pgmailmgr/settings.py @@ -7,7 +7,7 @@ BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) ADMINS = ( - ('PostgreSQL webmaster', '[email protected]'), + ('PostgreSQL webmaster', '[email protected]'), ) MANAGERS = ADMINS @@ -100,23 +100,23 @@ MIDDLEWARE_CLASSES = ( ROOT_URLCONF = 'pgmailmgr.urls' TEMPLATES = [{ - 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'OPTIONS': { - 'context_processors': [ - 'django.template.context_processors.request', - 'django.contrib.auth.context_processors.auth', - 'django.contrib.messages.context_processors.messages', - ], - 'loaders': [ - 'django.template.loaders.filesystem.Loader', - 'django.template.loaders.app_directories.Loader', - ], - }, + 'BACKEND': 'django.template.backends.django.DjangoTemplates', + 'OPTIONS': { + 'context_processors': [ + 'django.template.context_processors.request', + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', + ], + 'loaders': [ + 'django.template.loaders.filesystem.Loader', + 'django.template.loaders.app_directories.Loader', + ], + }, }] TEMPLATE_CONTEXT_PROCESSORS = ( - 'django.contrib.auth.context_processors.auth', - 'django.contrib.messages.context_processors.messages', + 'django.contrib.auth.context_processors.auth', + 'django.contrib.messages.context_processors.messages', ) INSTALLED_APPS = ( @@ -124,8 +124,8 @@ INSTALLED_APPS = ( 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', - # Need to load our app before admin, to override template - 'pgmailmgr.mailmgr', + # Need to load our app before admin, to override template + 'pgmailmgr.mailmgr', # Uncomment the next line to enable the admin: 'django.contrib.admin', # Uncomment the next line to enable admin documentation: |