2019-10-11 16:14:38 +00:00
|
|
|
# THIS FILE IS CONTROLLED BY ANSIBLE - DO NOT CHANGE IN DEPLOYMENT!
|
|
|
|
|
2020-09-12 11:58:52 +00:00
|
|
|
# Rewrite envelope sender addresses:
|
|
|
|
# - if the sender address has a local domain, then add our verp_marker
|
|
|
|
# - else implement sender rewriting scheme (cf.
|
|
|
|
# https://en.wikipedia.org/wiki/Sender_Rewriting_Scheme,
|
|
|
|
# http://www.libsrs2.org/srs/srs.pdf
|
|
|
|
# ):
|
|
|
|
# * if the address does not begin with SRS0 or SRS1:
|
|
|
|
# rewrite address to srs0={random_bigint}@main_local_domain
|
|
|
|
# * if the address begins with SRS0:
|
|
|
|
# replace SRS0 with srs1={random_bigint}= and
|
|
|
|
# replace the domain with our main local domain
|
|
|
|
# * if the address begins with SRS0:
|
|
|
|
# replace the domain with our main local domain
|
|
|
|
# The main local domain is the first domain with a name
|
|
|
|
# that is not equal to 'role_specific'.
|
|
|
|
# The random_bigint has at not 15 decimal digits.
|
2019-10-11 16:14:38 +00:00
|
|
|
|
|
|
|
# man pgsql_table
|
|
|
|
|
|
|
|
user = {{ mailserver.postgresql.username }}
|
|
|
|
password = {{ mailserver.postgresql.password }}
|
|
|
|
dbname = {{ mailserver.postgresql.dbname }}
|
|
|
|
hosts = {{ mailserver.postgresql.host }}
|
2020-09-12 11:58:52 +00:00
|
|
|
query =
|
|
|
|
with
|
|
|
|
rnd as (select (random() * 1000000000000000)::bigint v),
|
|
|
|
mydomains as (select regexp_replace('%s', '.*@([^@]+)$', '\1') in (select name from domains) v),
|
|
|
|
srs0 as (select lower(substr('%s', 1, 4)) = 'srs0' v),
|
|
|
|
srs1 as (select lower(substr('%s', 1, 4)) = 'srs1' v),
|
|
|
|
new_row as (
|
|
|
|
select
|
|
|
|
nextval('mail_from_id_seq') new_id,
|
|
|
|
'%s' original,
|
|
|
|
case
|
|
|
|
when mydomains.v and not srs0.v and not srs1.v
|
|
|
|
then
|
|
|
|
case
|
|
|
|
when '%s'~*'\+{{ mailserver.postfix.verp_marker }}-\d+@'
|
|
|
|
then '%s'
|
|
|
|
else regexp_replace('%s', '^(.*)@[^@]+$', '\1') || '+{{ mailserver.postfix.verp_marker }}-'
|
|
|
|
|| lastval()::text || '@' || regexp_replace('%s', '.*@([^@]+)$', '\1')
|
|
|
|
end
|
|
|
|
else
|
|
|
|
case
|
|
|
|
when not mydomains.v and not srs0.v and not srs1.v
|
|
|
|
then 'SRS0=' || LPAD(rnd.v::text, 15 , '0') || '@' || (select name from domains where name<>'role_specific' order by id limit 1)
|
|
|
|
else
|
|
|
|
case
|
|
|
|
when srs0.v
|
|
|
|
then
|
|
|
|
case
|
|
|
|
when mydomains.v
|
|
|
|
then '%s'
|
|
|
|
else 'SRS1=' || LPAD(rnd.v::text, 15 , '0') || '='
|
|
|
|
|| regexp_replace(substr('%s', 5), '^(.*)@[^@]+$', '\1@'
|
|
|
|
|| (select name from domains where name<>'role_specific' order by id limit 1))
|
|
|
|
end
|
|
|
|
else regexp_replace('%s', '^(.*)@[^@]+$', '\1@' || (select name from domains where name<>'role_specific' order by id limit 1))
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end rewritten,
|
|
|
|
rnd.v srs_id
|
|
|
|
from rnd, mydomains, srs0, srs1
|
|
|
|
where '%s' <> '""'
|
|
|
|
),
|
|
|
|
ins_row as (insert into mail_from (id, original, rewritten, srs_id)
|
|
|
|
select new_row.new_id, new_row.original, new_row.rewritten, case when mydomains.v and not srs0.v and not srs1.v then null else new_row.srs_id end
|
|
|
|
from new_row, mydomains, srs0, srs1 where new_row.original<>new_row.rewritten),
|
|
|
|
orig(o) as (values('%s'))
|
|
|
|
select rewritten from new_row
|