# Make domain control validation hijacking a little harder to mess up by
# Make domain control validation hijacking a little harder to mess up by
# requiring aliases for email addresses typically used in DCV to forward
# requiring aliases for email addresses typically used in DCV to forward
# only to accounts that are administrators on this system.
# only to accounts that are administrators on this system.
return("This alias can only have administrators of this system as destinations because the address is frequently used for domain control validation.",400)
return("This alias can only have administrators of this system as destinations because the address is frequently used for domain control validation.",400)
<p>Aliases are email forwarders. An alias can forward email to a <ahref="javascript:show_panel('users')">mail user</a> or to any email address.</p>
<p>An alias can forward email to a <ahref="javascript:show_panel('users')">mail user</a> or to any email address. You can separately grant permission to one or more users to send as an alias.</p>
echo"CREATE TABLE users (id INTEGER PRIMARY KEY AUTOINCREMENT, email TEXT NOT NULL UNIQUE, password TEXT NOT NULL, extra, privileges TEXT NOT NULL DEFAULT '');" | sqlite3 $db_path;
echo"CREATE TABLE users (id INTEGER PRIMARY KEY AUTOINCREMENT, email TEXT NOT NULL UNIQUE, password TEXT NOT NULL, extra, privileges TEXT NOT NULL DEFAULT '');" | sqlite3 $db_path;
echo"CREATE TABLE aliases (id INTEGER PRIMARY KEY AUTOINCREMENT, source TEXT NOT NULL UNIQUE, destination TEXT NOT NULL, applies_inbound INTEGER NOT NULL DEFAULT 1, applies_outbound INTEGER NOT NULL DEFAULT 1);" | sqlite3 $db_path;
echo"CREATE TABLE aliases (id INTEGER PRIMARY KEY AUTOINCREMENT, address TEXT NOT NULL UNIQUE, receivers TEXT NOT NULL, senders TEXT NOT NULL);" | sqlite3 $db_path;
# Matches from the users table take priority over (direct) aliases.
# Matches from the users table take priority over (direct) aliases.
cat> /etc/postfix/sender-login-maps.cf <<EOF;
cat> /etc/postfix/sender-login-maps.cf <<EOF;
dbpath=$db_path
dbpath=$db_path
query = SELECT destination from (SELECT destination, 0 as priority FROM aliases WHERE source='%s' AND applies_outbound=1 UNION SELECT email as destination, 1 as priority FROM users WHERE email='%s') ORDER BY priority LIMIT 1;
query = SELECT senders from (SELECT senders, 0 as priority FROM aliases WHERE address='%s' UNION SELECT email as senders, 1 as priority FROM users WHERE email='%s') ORDER BY priority LIMIT 1;
query = SELECT 1 FROM users WHERE email LIKE '%%@%s' UNION SELECT 1 FROM aliases WHERE source LIKE '%%@%s' AND applies_inbound=1
query = SELECT 1 FROM users WHERE email LIKE '%%@%s' UNION SELECT 1 FROM aliases WHERE address LIKE '%%@%s'
EOF
EOF
# SQL statement to check if we handle mail for a user.
# SQL statement to check if we handle mail for a user.
...
@@ -129,7 +129,7 @@ EOF
...
@@ -129,7 +129,7 @@ EOF
# postfix's preference for aliases for whole email addresses.
# postfix's preference for aliases for whole email addresses.
cat> /etc/postfix/virtual-alias-maps.cf <<EOF;
cat> /etc/postfix/virtual-alias-maps.cf <<EOF;
dbpath=$db_path
dbpath=$db_path
query = SELECT destination from (SELECT destination, 0 as priority FROM aliases WHERE source='%s' AND applies_inbound=1 UNION SELECT email as destination, 1 as priority FROM users WHERE email='%s') ORDER BY priority LIMIT 1;
query = SELECT receivers from (SELECT receivers, 0 as priority FROM aliases WHERE address='%s' UNION SELECT email as receivers, 1 as priority FROM users WHERE email='%s') ORDER BY priority LIMIT 1;
shell("check_call",["sqlite3",db,"ALTER TABLE aliases RENAME TO aliases_8"])
# Create the new aliases table, initially empty.
shell("check_call",["sqlite3",db,"CREATE TABLE aliases (id INTEGER PRIMARY KEY AUTOINCREMENT, address TEXT NOT NULL UNIQUE, receivers TEXT NOT NULL, senders TEXT NOT NULL)"])