#!/bin/sh

. alterator-sh-functions
. alterator-service-functions
. shell-quote
. shell-config

CONF_PREFIX=/etc/postfix
MYDESTINATION=$CONF_PREFIX/mydestination
MYNETWORKS=$CONF_PREFIX/mynetworks
ACCESS_SUFFIX=_access
ALIASES=$CONF_PREFIX/aliases
DOVECOT_CONF=/etc/dovecot/dovecot.conf

DOVECOT_AUTH_CONF=/etc/dovecot/conf.d/10-auth.conf
DOVECOT_ALT_CONF=/etc/dovecot/conf.d/alterator.conf

network_file=/etc/sysconfig/network

### postfix main.cf list attributes like smtpd_client_restrictions
delim1_re='[[:space:]]\+'
delim2_re='[[:space:]]*,[[:space:]]*'
delim_re="\(^\|$delim1_re\|$delim2_re\)"
end_delim_re="\($delim1_re\|$delim2_re\|$\)"
value_re='[^[:space:],]\+'

postconf_read()
{
    /usr/sbin/postconf -h "$1"
}

postconf_write()
{
    /usr/sbin/postconf -e "$1=$2"
}

postconf_has()
{
    local name="$(quote_sed_regexp "$2")"
    postconf_read "$1"|
	grep -qs "${delim_re}$name${end_delim_re}"
}

postconf_cons()
{
    printf '%s %s, %s' "$1" "$2" "$3"
}

postconf_skip()
{
    local name="$(quote_sed_regexp "$2")"
    echo "$1" |
	sed -e "s/${delim_re}$name${end_delim_re}/\1/g" \
	    -e 's/^[[:space:]]*,[[:space:]]*//'
}

postconf_restrict_on()
{
    local args=

    local v="$(postconf_read smtpd_helo_restrictions)"
    postconf_has smtpd_helo_restrictions reject_non_fqdn_hostname ||
	v="$(echo "$v"|sed "s/${delim_re}permit${end_delim_re}/\1reject_non_fqdn_hostname, permit\2/")"
    postconf_has smtpd_helo_restrictions reject_invalid_hostname ||
	v="$(echo "$v"|sed "s/${delim_re}permit${end_delim_re}/\1reject_invalid_hostname, permit\2/")"
    args="$args \"$(quote_shell smtpd_helo_restrictions=$v)\""

    v="$(postconf_read smtpd_client_restrictions)"
    postconf_has smtpd_client_restrictions "reject_rbl_client zen.spamhaus.org" ||
	v="$(echo "$v"|sed "s/${delim_re}permit${end_delim_re}/\1reject_rbl_client zen.spamhaus.org, permit\2/")"
    args="$args \"$(quote_shell smtpd_client_restrictions=$v)\""

    v="$(postconf_read smtpd_sender_restrictions)"
    postconf_has smtpd_sender_restrictions reject_non_fqdn_sender ||
	v="$(echo "$v"|sed "s/${delim_re}permit${end_delim_re}/\1reject_non_fqdn_sender, permit\2/")"
    postconf_has smtpd_sender_restrictions reject_unknown_sender_domain ||
	v="$(echo "$v"|sed "s/${delim_re}permit${end_delim_re}/\1reject_unknown_sender_domain, permit\2/")"
    args="$args \"$(quote_shell smtpd_sender_restrictions=$v)\""

    v="$(postconf_read smtpd_recipient_restrictions)"
    postconf_has smtpd_recipient_restrictions reject_non_fqdn_recipient ||
	v="$(echo "$v"|sed "s/${delim_re}reject_unauth_destination${end_delim_re}/\1reject_non_fqdn_recipient, reject_unauth_destination\2/")"
    postconf_has smtpd_recipient_restrictions reject_unknown_recipient_domain ||
	v="$(echo "$v"|sed "s/${delim_re}reject_unauth_destination${end_delim_re}/\1reject_unknown_recipient_domain, reject_unauth_destination\2/")"
    args="$args \"$(quote_shell smtpd_recipient_restrictions=$v)\""

    eval /usr/sbin/postconf -e $args
}

postconf_restrict_off()
{
    local args=

    local v="$(postconf_read smtpd_helo_restrictions)"
    v="$(postconf_skip "$v" reject_non_fqdn_hostname)"
    v="$(postconf_skip "$v" reject_invalid_hostname)"
    args="$args \"$(quote_shell smtpd_helo_restrictions=$v)\""

    v="$(postconf_read smtpd_client_restrictions)"
    v="$(postconf_skip "$v" "reject_rbl_client zen.spamhaus.org")"
    args="$args \"$(quote_shell smtpd_client_restrictions=$v)\""

    v="$(postconf_read smtpd_sender_restrictions)"
    v="$(postconf_skip "$v" reject_non_fqdn_sender)"
    v="$(postconf_skip "$v" reject_unknown_sender_domain)"
    args="$args \"$(quote_shell smtpd_sender_restrictions=$v)\""

    v="$(postconf_read smtpd_recipient_restrictions)"
    v="$(postconf_skip "$v" reject_non_fqdn_recipient)"
    v="$(postconf_skip "$v" reject_unknown_recipient_domain)"
    args="$args \"$(quote_shell smtpd_recipient_restrictions=$v)\""

    eval /usr/sbin/postconf -e $args
}

postconf_list()
{
    test -n "$1" || return
    sed -e :a \
	-e '$!{N; s/\n[ \t]\+/ /; s/\n#.*$//; s/\n[ \t]*$//; ba}' \
	"$1"
}

list_name()
{
    test -n "$1" || return
    echo "$CONF_PREFIX/$1$ACCESS_SUFFIX"
}

reject_list()
{
    test -n "$1" || return
    postconf_list "$(list_name "$1")" |
	sed -e "/${delim_re}REJECT${end_delim_re}/!d" \
	    -e "s/^\([^[:space:]]\+\).*/\1/"
}

reject_has()
{
    grep -qs "^$2[[:space:]]\+REJECT\b" "$1"
}

reject_add()
{
    test -n "$1" -a -n "$2" || return
    echo -e "$2\tREJECT" >> "$1"
}

reject_clean()
{
    test -n "$1" || return
    sed -i \
	-e '/^#/b' \
	-e '/^[ \t]*$/b' \
	-e "/${delim_re}REJECT${end_delim_re}/d" \
	"$1"
}

dovecot_write()
{
    test -n "$1" -a -n "$2" || return
    if grep -qs "^[[:space:]]*#*[[:space:]]*$1\b" "$DOVECOT_CONF"; then
	sed -i \
	    -e "s/^[[:space:]]*#*[[:space:]]*$1[[:space:]]*=.*/$1 = $2/" \
	    "$DOVECOT_CONF"
    else
	echo "$1 = $2" >> "$DOVECOT_CONF"
    fi
}

dovecot_auth_write()
{
    test -n "$1" -a -n "$2" || return
    if grep -qs "^[[:space:]]*#*[[:space:]]*$1\b" "$DOVECOT_AUTH_CONF"; then
	sed -i \
	    -e "s/^[[:space:]]*#*[[:space:]]*$1[[:space:]]*=.*/$1 = $2/" \
	    "$DOVECOT_AUTH_CONF"
    else
	echo "$1 = $2" >> "$DOVECOT_AUTH_CONF"
    fi
}

dovecot_read()
{
    test -n "$1" || return
    sed -n \
	-e "s/^[[:space:]]*$1[[:space:]]*=[[:space:]]*\([^#]\+\)/\1/p" \
	"$DOVECOT_CONF"
}

dovecot_auth_read()
{
    test -n "$1" || return
    sed -n \
	-e "s/^[[:space:]]*$1[[:space:]]*=[[:space:]]*\([^#]\+\)/\1/p" \
	"$DOVECOT_AUTH_CONF"
}

rootmail_read()
{
	shell_config_get "$ALIASES" root ':[[:space:]]*' | head -n1
}

rootmail_write()
{
	test -n "$1" || return
	shell_config_set "$ALIASES" root "$1" ':[[:space:]]*' ': '
	/usr/bin/newaliases
}
