summaryrefslogtreecommitdiffstats
path: root/hyperkitty/lib/mailman.py
diff options
context:
space:
mode:
authorAurélien Bompard <aurelien@bompard.org>2013-10-18 16:15:40 +0200
committerAurélien Bompard <aurelien@bompard.org>2013-10-18 16:15:40 +0200
commitf1a0a71d971ffa4c01a88b92aa4869dd3a12a3fa (patch)
tree8289deaa33daafde6572e5e6abc6a8df11475ab1 /hyperkitty/lib/mailman.py
parent5b0796d955930ff953f503c9f1966dfbbe876fec (diff)
downloadhyperkitty-f1a0a71d971ffa4c01a88b92aa4869dd3a12a3fa.tar.gz
hyperkitty-f1a0a71d971ffa4c01a88b92aa4869dd3a12a3fa.tar.xz
hyperkitty-f1a0a71d971ffa4c01a88b92aa4869dd3a12a3fa.zip
Handle permissions on private mailing-lists
Diffstat (limited to 'hyperkitty/lib/mailman.py')
-rw-r--r--hyperkitty/lib/mailman.py41
1 files changed, 41 insertions, 0 deletions
diff --git a/hyperkitty/lib/mailman.py b/hyperkitty/lib/mailman.py
index f0c970f..090902b 100644
--- a/hyperkitty/lib/mailman.py
+++ b/hyperkitty/lib/mailman.py
@@ -19,12 +19,21 @@
# Author: Aurelien Bompard <abompard@fedoraproject.org>
#
+from __future__ import absolute_import
+
+from functools import wraps
+
from django.conf import settings
from django.core.urlresolvers import reverse
from django.utils.http import urlquote
+from django.utils.decorators import available_attrs
+from django.shortcuts import redirect, render
+from django.http import Http404
+from mailman.interfaces.archiver import ArchivePolicy
from mailmanclient import Client
from hyperkitty.models import Rating
+from hyperkitty.lib import get_store
def subscribe(list_address, user):
@@ -80,3 +89,35 @@ def get_subscriptions(store, client, mm_user):
"posts_count": len(email_hashes),
})
return subscriptions
+
+
+# View decorator: check that the list is authorized
+def check_mlist_private(func):
+ @wraps(func, assigned=available_attrs(func))
+ def inner(request, *args, **kwargs):
+ if "mlist_fqdn" in kwargs:
+ mlist_fqdn = kwargs["mlist_fqdn"]
+ else:
+ mlist_fqdn = args[0]
+ try:
+ store = get_store(request)
+ except KeyError:
+ return func(request, *args, **kwargs) # Unittesting?
+ mlist = store.get_list(mlist_fqdn)
+ if mlist is None:
+ raise Http404("No archived mailing-list by that name.")
+ #return HttpResponse(request.session.get("subscribed", "NO KEY"), content_type="text/plain")
+ if not is_mlist_authorized(request, mlist):
+ return render(request, "error-private.html", {
+ "mlist": mlist,
+ }, status=403)
+ return func(request, *args, **kwargs)
+ return inner
+
+def is_mlist_authorized(request, mlist):
+ if mlist.archive_policy == ArchivePolicy.private and \
+ not (request.user.is_authenticated() and
+ hasattr(request, "session") and
+ mlist.name in request.session.get("subscribed", [])):
+ return False
+ return True