mirror of
https://github.com/mail-in-a-box/mailinabox.git
synced 2024-11-24 02:37:05 +00:00
in the admin, group aliases by domain, fixes #211
This commit is contained in:
parent
990649af2d
commit
443b084a17
@ -7,9 +7,9 @@ from functools import wraps
|
|||||||
from flask import Flask, request, render_template, abort, Response
|
from flask import Flask, request, render_template, abort, Response
|
||||||
|
|
||||||
import auth, utils
|
import auth, utils
|
||||||
from mailconfig import get_mail_users_ex, get_admins, add_mail_user, set_mail_password, remove_mail_user
|
from mailconfig import get_mail_users, get_mail_users_ex, get_admins, add_mail_user, set_mail_password, remove_mail_user
|
||||||
from mailconfig import get_mail_user_privileges, add_remove_mail_user_privilege
|
from mailconfig import get_mail_user_privileges, add_remove_mail_user_privilege
|
||||||
from mailconfig import get_mail_aliases, get_mail_domains, add_mail_alias, remove_mail_alias
|
from mailconfig import get_mail_aliases, get_mail_aliases_ex, get_mail_domains, add_mail_alias, remove_mail_alias
|
||||||
|
|
||||||
env = utils.load_environment()
|
env = utils.load_environment()
|
||||||
|
|
||||||
@ -146,7 +146,7 @@ def mail_user_privs_remove():
|
|||||||
@authorized_personnel_only
|
@authorized_personnel_only
|
||||||
def mail_aliases():
|
def mail_aliases():
|
||||||
if request.args.get("format", "") == "json":
|
if request.args.get("format", "") == "json":
|
||||||
return json_response(get_mail_aliases(env, as_json=True))
|
return json_response(get_mail_aliases_ex(env))
|
||||||
else:
|
else:
|
||||||
return "".join(x+"\t"+y+"\n" for x, y in get_mail_aliases(env))
|
return "".join(x+"\t"+y+"\n" for x, y in get_mail_aliases(env))
|
||||||
|
|
||||||
|
@ -139,29 +139,62 @@ def get_admins(env):
|
|||||||
users.add(user["email"])
|
users.add(user["email"])
|
||||||
return users
|
return users
|
||||||
|
|
||||||
def get_mail_aliases(env, as_json=False):
|
def get_mail_aliases(env):
|
||||||
|
# Returns a sorted list of tuples of (alias, forward-to string).
|
||||||
c = open_database(env)
|
c = open_database(env)
|
||||||
c.execute('SELECT source, destination FROM aliases')
|
c.execute('SELECT source, destination FROM aliases')
|
||||||
aliases = { row[0]: row[1] for row in c.fetchall() } # make dict
|
aliases = { row[0]: row[1] for row in c.fetchall() } # make dict
|
||||||
|
|
||||||
# put in a canonical order: sort by domain, then by email address lexicographically
|
# put in a canonical order: sort by domain, then by email address lexicographically
|
||||||
aliases = [ (source, aliases[source]) for source in utils.sort_email_addresses(aliases.keys(), env) ] # sort
|
aliases = [ (source, aliases[source]) for source in utils.sort_email_addresses(aliases.keys(), env) ]
|
||||||
|
|
||||||
# but put automatic aliases to administrator@ last
|
|
||||||
aliases.sort(key = lambda x : x[1] == get_system_administrator(env))
|
|
||||||
|
|
||||||
if as_json:
|
|
||||||
required_aliases = get_required_aliases(env)
|
|
||||||
aliases = [
|
|
||||||
{
|
|
||||||
"source": alias[0],
|
|
||||||
"destination": [d.strip() for d in alias[1].split(",")],
|
|
||||||
"required": alias[0] in required_aliases or alias[0] == get_system_administrator(env),
|
|
||||||
}
|
|
||||||
for alias in aliases
|
|
||||||
]
|
|
||||||
return aliases
|
return aliases
|
||||||
|
|
||||||
|
def get_mail_aliases_ex(env):
|
||||||
|
# Returns a complex data structure of all mail aliases, similar
|
||||||
|
# to get_mail_users_ex.
|
||||||
|
#
|
||||||
|
# [
|
||||||
|
# {
|
||||||
|
# domain: "domain.tld",
|
||||||
|
# alias: [
|
||||||
|
# {
|
||||||
|
# source: "name@domain.tld",
|
||||||
|
# destination: ["target1@domain.com", "target2@domain.com", ...],
|
||||||
|
# required: True|False
|
||||||
|
# },
|
||||||
|
# ...
|
||||||
|
# ]
|
||||||
|
# },
|
||||||
|
# ...
|
||||||
|
# ]
|
||||||
|
|
||||||
|
required_aliases = get_required_aliases(env)
|
||||||
|
domains = {}
|
||||||
|
for source, destination in get_mail_aliases(env):
|
||||||
|
# get alias info
|
||||||
|
domain = get_domain(source)
|
||||||
|
required = ((source in required_aliases) or (source == get_system_administrator(env)))
|
||||||
|
|
||||||
|
# add to list
|
||||||
|
if not domain in domains:
|
||||||
|
domains[domain] = {
|
||||||
|
"domain": domain,
|
||||||
|
"aliases": [],
|
||||||
|
}
|
||||||
|
domains[domain]["aliases"].append({
|
||||||
|
"source": source,
|
||||||
|
"destination": [d.strip() for d in destination.split(",")],
|
||||||
|
"required": required,
|
||||||
|
})
|
||||||
|
|
||||||
|
# Sort domains.
|
||||||
|
domains = [domains[domain] for domain in utils.sort_domains(domains.keys(), env)]
|
||||||
|
|
||||||
|
# Sort aliases within each domain first by required-ness then lexicographically by source address.
|
||||||
|
for domain in domains:
|
||||||
|
domain["aliases"].sort(key = lambda alias : (alias["required"], alias["source"]))
|
||||||
|
return domains
|
||||||
|
|
||||||
def get_mail_alias_map(env):
|
def get_mail_alias_map(env):
|
||||||
aliases = { }
|
aliases = { }
|
||||||
for alias, targets in get_mail_aliases(env):
|
for alias, targets in get_mail_aliases(env):
|
||||||
|
@ -82,15 +82,23 @@ function show_aliases() {
|
|||||||
function(r) {
|
function(r) {
|
||||||
$('#alias_table tbody').html("");
|
$('#alias_table tbody').html("");
|
||||||
for (var i = 0; i < r.length; i++) {
|
for (var i = 0; i < r.length; i++) {
|
||||||
var n = $("#alias-template").clone();
|
var hdr = $("<tr><td colspan='3'><h4/></td></tr>");
|
||||||
n.attr('id', '');
|
hdr.find('h4').text(r[i].domain);
|
||||||
|
$('#alias_table tbody').append(hdr);
|
||||||
|
|
||||||
if (r[i].required) n.addClass('alias-required');
|
for (var k = 0; k < r[i].aliases.length; k++) {
|
||||||
n.attr('data-email', r[i].source);
|
var alias = r[i].aliases[k];
|
||||||
n.find('td.email').text(r[i].source)
|
|
||||||
for (var j = 0; j < r[i].destination.length; j++)
|
var n = $("#alias-template").clone();
|
||||||
n.find('td.target').append($("<div></div>").text(r[i].destination[j]))
|
n.attr('id', '');
|
||||||
$('#alias_table tbody').append(n);
|
|
||||||
|
if (alias.required) n.addClass('alias-required');
|
||||||
|
n.attr('data-email', alias.source);
|
||||||
|
n.find('td.email').text(alias.source)
|
||||||
|
for (var j = 0; j < alias.destination.length; j++)
|
||||||
|
n.find('td.target').append($("<div></div>").text(alias.destination[j]))
|
||||||
|
$('#alias_table tbody').append(n);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user