diff --git a/extensions/amavis_quarantine/main.py b/extensions/amavis_quarantine/main.py index e4cba1b54..a6d17292d 100644 --- a/extensions/amavis_quarantine/main.py +++ b/extensions/amavis_quarantine/main.py @@ -2,15 +2,24 @@ """ """ +from django.http import HttpResponseRedirect from django.shortcuts import get_object_or_404, render_to_response +from django.template.loader import render_to_string +from django.template import Template from django.conf.urls.defaults import * from django.utils.translation import ugettext as _ from django.core.urlresolvers import reverse from django.core.paginator import Paginator +from django.contrib.auth.decorators \ + import login_required from mailng.lib import events -from mailng.lib import _render, _ctx_ok, _ctx_ko +from mailng.lib import _render, _ctx_ok, _ctx_ko, decode from mailng.lib import db from mailng.admin.models import Mailbox +from datetime import datetime +import email +import re +import os def init(): events.register("UserMenuDisplay", menu) @@ -26,33 +35,33 @@ def menu(**kwargs): "img" : "/static/pics/quarantine.png"} ] -def index(request): +@login_required +def index(request, message=None): if not request.user.is_superuser: mb = Mailbox.objects.get(user=request.user.id) filter = "AND maddr.email='%s'" % mb.full_address else: filter = "" - cursor = db.getconnection("amavis_quarantine").cursor() - cursor.execute(""" -SELECT msgs.from_addr, maddr.email, msgs.subject, msgs.content, quarantine.mail_id + conn = db.getconnection("amavis_quarantine") + status, cursor = db.execute(conn, """ +SELECT msgs.from_addr, maddr.email, msgs.subject, msgs.content, quarantine.mail_id, + msgs.time_num, msgs.content FROM quarantine, maddr, msgrcpt, msgs WHERE quarantine.mail_id=msgrcpt.mail_id AND msgrcpt.rid=maddr.id AND msgrcpt.mail_id=msgs.mail_id AND quarantine.chunk_ind=1 %s +ORDER BY msgs.time_num DESC """ % filter) emails = [] rows = cursor.fetchall() for row in rows: emails.append({"from" : row[0], "to" : row[1], "subject" : row[2], "content" : row[3], - "mailid" : row[4]}) + "mailid" : row[4], "time" : datetime.fromtimestamp(row[5]), + "type" : row[6]}) -# cursor.execute("SELECT count(*) AS cnt FROM quarantine") -# row = cursor.fetchone() -# cnt = row[0] - paginator = Paginator(emails, 10) try: pagenum = int(request.GET.get('page', '1')) @@ -62,3 +71,94 @@ AND quarantine.chunk_ind=1 return _render(request, 'amavis_quarantine/index.html', { "count" : len(rows), "emails" : page }) + +@login_required +def viewmail(request, mail_id): + conn = db.getconnection("amavis_quarantine") + status, cursor = db.execute(conn, """ +SELECT mail_text +FROM quarantine +WHERE quarantine.mail_id='%s' +""" % mail_id) + content = "" + for part in cursor.fetchall(): + content += part[0] + msg = email.message_from_string(content) + + html_body = "" + text_body = "" + for part in msg.walk(): + print part.get_content_type() + if part.get_content_maintype() == 'multipart': + continue + if part.get_content_type() in ("text/html"): + html_body += part.get_payload() + if part.get_content_type() in ("text/plain"): + text_body += part.get_payload(decode=True) + pre = None + if html_body != "": + html_body = email.utils.quote(html_body) + html_body = re.sub('(\n|\r|\r\n)', '\\\\n', html_body) + body = Template(decode(html_body)).render({}) + else: + text_body = email.utils.quote(text_body) + text_body = re.sub('(\n|\r|\r\n)', '\\\\n', text_body) + body = decode(text_body) + pre = True + + + return _render(request, 'amavis_quarantine/viewmail.html', { + "headers" : msg.items(), + "body" : body, + "pre" : pre + }) + +@login_required +def process(request): + if request.POST.has_key("deleteall"): + return + ids = "" + count = len(request.POST.getlist("selection")) + for id in request.POST.getlist("selection"): + if ids != "": + ids += "," + ids += "'%s'" % id + if ids == "": + return + conn = db.getconnection("amavis_quarantine") + if request.POST.has_key("release"): + status, cursor = db.execute(conn, """ +SELECT msgs.mail_id,secret_id,quar_type,maddr.email FROM msgs, maddr, msgrcpt +WHERE msgrcpt.mail_id=msgs.mail_id AND msgrcpt.rid=maddr.id AND msgs.mail_id IN (%s) +""" % (ids)) + emails = {} + for row in cursor.fetchall(): + if not emails.has_key(row[0]): + emails[row[0]] = {} + emails[row[0]]["rcpts"] = [] + emails[row[0]]["secret"] = row[1] + emails[row[0]]["rcpts"] += [row[3]] + count = 0 + for k, values in emails.iteritems(): + cmd = "/tmp/amavisd-release " + cmd += "%s %s" % (k, values["secret"]) + for rcpt in values["rcpts"]: + cmd += " %s" % rcpt + cmd += "\n" + result = os.system(cmd) +# if re.search("250 [^\s]+ Ok", result): + if not result: + count += 1 + message = _("%d message%s released successfully" \ + % (count, count > 1 and "s" or "")) + + if request.POST.has_key("delete"): + status, error = db.execute(conn, + "DELETE FROM msgs WHERE mail_id IN (%s)" % ids) + if status: + message = _("%d message%s deleted successfully" \ + % (count, count > 1 and "s" or "")) + else: + message = error + request.user.message_set.create(message=message) + return HttpResponseRedirect(reverse(index)) diff --git a/extensions/amavis_quarantine/release.py b/extensions/amavis_quarantine/release.py new file mode 100755 index 000000000..bbae5e83f --- /dev/null +++ b/extensions/amavis_quarantine/release.py @@ -0,0 +1,63 @@ +#!/usr/bin/env python +# -*- coding: utf-8 -*- +import socket +import sys +import re +import struct +from optparse import OptionParser + +def getsocket(options): + if options.mode == "net": + s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + s.connect((options.host, options.port)) + + return s + +def from_stdin(): + res = [] + for line in sys.stdin: + res += [line] + return res + +def decodevalue(val): + def pack(match): + return struct.pack('B', match.group(0)) + res = re.sub("%([0-9a-fA-F]{2})", pack, val) + +if __name__ == "__main__": + parser = OptionParser() + parser.add_option("-o", "--host", default="127.0.0.1", + help="") + parser.add_option("-p", "--port", default=9998, + help="") + parser.add_option("-s", "--socket", default="", + help="") + parser.add_option("-m", "--mode", default="unix", + help="") + (options, args) = parser.parse_args() + + if not len(args): + print "Nothing to do, exiting." + sys.exit(1) + + s = getsocket(options) +# if args[0] == '-': +# worklist = from_stdin() +# else: +# worklist = [args[0]] + +# for message in worklist: +# params = message.split() + params = ["k1URJIk76bKa", "k1URJIk76bKa", "antoine.nguyen@streamcore.com"] + cmd = """request=release +mail_id=%s +secret_id=%s +quar_type=Q +recipient=%s + +""" % (params[0], params[1], params[2]) + s.send(cmd) + answer = s.recv(1024) + print answer + + s.close() diff --git a/extensions/amavis_quarantine/templates/index.html b/extensions/amavis_quarantine/templates/index.html index 8c56b5e41..1c508073e 100644 --- a/extensions/amavis_quarantine/templates/index.html +++ b/extensions/amavis_quarantine/templates/index.html @@ -19,6 +19,11 @@ float: left; } +#listing { + margin: 0 auto; + width: 98%; +} + td { font-size: smaller; height: 40px; @@ -36,17 +41,19 @@ td { {% endif %} -