# Maintainer: David Runge <dvzrv@archlinux.org>
# Maintainer: Robin Candau <antiz@archlinux.org>
# Contributor: Gaetan Bisson <bisson@archlinux.org>
# Contributor: Jeff Brodnax <tullyarcher@bellsouth.net>
# Contributor: Paul Mattal <paul@archlinux.org>

pkgbase=postfix
pkgname=(
  postfix
  postfix-{cdb,ldap,lmdb,mongodb,mysql,pcre,pgsql,sqlite}
)
pkgver=3.10.5
pkgrel=2
pkgdesc="Fast, easy to administer, secure mail server"
arch=(x86_64 aarch64)
url="https://www.postfix.org/"
license=(
  'EPL-2.0 OR IPL-1.0'
  BSD-4-Clause-UC
)
depends=(glibc)
makedepends=(
  icu
  libldap
  libnsl
  libsasl
  libtlsrpt
  lmdb
  mariadb-libs
  mongo-c-driver
  openssl
  pcre2
  postgresql-libs
  sqlite
  tinycdb
)
source=(
  https://de.postfix.org/ftpmirror/official/$pkgbase-$pkgver.tar.gz
  $pkgbase-$pkgver.tar.gz.sig::https://de.postfix.org/ftpmirror/official/$pkgbase-$pkgver.tar.gz.gpg2
  $pkgbase-3.5.8-main_defaults.patch
  $pkgbase-3.9.0-mail_params.patch
  $pkgbase.service
  $pkgbase.sysusers
  $pkgbase.tmpfiles
)
sha512sums=('3bec6185f1311f9726c5dc3a902f7e7b9a2e80488bf544805118d212bc1e6496668b60414485331dd0fc807dc1714d0bda6a219e710cdd6c56270a33e1aacabc'
            'SKIP'
            '4630bb84206e0534723f50e4fb0e6f83a47cfd33187801eede052962d332b2754af8761a8d2b81f52cba9d07a7a0335eef06e22347ec7bc69b86f561685bd575'
            '6ff26a9e2330c6a930b15953c1dd7cc730318e80bef47667c0271ddb8132e64005e0d075e84d9d7a970eed789694093626ebd9053b9499333c6d526b57b0ea4c'
            '27f54747ad480d65b560c9dbc97e12c6353e4bceca0ffe3e358e31de56db0ad79928164c9f8790c73a9f791daa378253d2ee29b5a766661778553ec889b2cf97'
            '4094996d0bc9820feaae098524c6b45bd39a71b0ad9342afb301339a176efe1f5b205829be43f9b10bdf220371450fe1db0461e19e7f6edb8ed9c9ed15ae8572'
            'd08574a6acd595fc146513c92dc1bb341c3432d67de1e93ab73a7ce60e385dd34f3a55e3d3d7aec5f358ac4aae260f028599ac47650ebc663cea3043a760a7bc')
b2sums=('054a2b1c57a1ea6a3f43bc8ec156165c66bb5c9f1bbff1c3a8bd423b229a00202fd46052de07b6b5bd356aa1ee9965883ffaa63552bcb5264593df8668853f20'
        'SKIP'
        'e101c31ff9b68ec025183cbb199109d5bc94135d247c06fa903b97ccea6d3255b39b2780f3d1e3848ea68109ba91cdde5886d0a18d547b2f41d9643d2ac5bf5f'
        'e41d07edb0d2098deda9bf5c5e3a9c3f34f858579b7aedb72a3488828e1def993c8557fa477eab6df59bb9c6175984e1bac1213d29cef710c5a46b3b3faff015'
        '02dd441cf6e4a7c2bc0de876f020b0784d811f77a5c6102dd075d67b07158dbc53c8b4d62bc8035283d4f349008574b1c3fac03f4519d56ffd809cb5bcfb7bea'
        'd2605f8720a4cb9b666ac70f1f060840d66c848ae2f884ac5288aed0c80b69f22a799d187fd899c2064cc24cf33c1baf94ceb13192eb3c6fc932d3128111da4d'
        'de31693cea5f452a9c8c0d1cf5210a6e67c0176f8b1a4d74106f2e803911569e9fdbb2301b3b5dc7ad6a6da285026b1a3ed3de52117d216b030cf0d92348909d')
validpgpkeys=('622C7C012254C186677469C50C0B590E80CA15A7') # Wietse Venema <wietse@porcupine.org>

_pick() {
  local p="$1" f d; shift
  for f; do
    d="$srcdir/$p/${f#$pkgdir/}"
    mkdir -p "$(dirname "$d")"
    mv "$f" "$d"
    rmdir -p --ignore-fail-on-non-empty "$(dirname "$f")"
  done
}

prepare() {
  # add distribution defaults to main.cf (alias_maps and alias_database)
  patch -Np1 -d $pkgbase-$pkgver -i ../$pkgbase-3.5.8-main_defaults.patch
  patch -Np1 -d $pkgbase-$pkgver -i ../$pkgbase-3.9.0-mail_params.patch
}

build() {
  # set a fixed seed for the internal random order for Postfix hash tables
  # this is to avoid non-deterministric order for parameters in `main.cf` with `postconf`,
  # otherwise it triggers repetitive pacnew and may prevent reproducible builds
  # see https://marc.info/?l=postfix-users&m=175829178027668&w=2
  # and https://gitlab.archlinux.org/archlinux/packaging/packages/postfix/-/issues/13
  export NORANDOMIZE=""

  local ccargs=(
    '-fPIC' '-fcommon'
    '-DUSE_SASL_AUTH'
    '-DUSE_CYRUS_SASL' '-I/usr/include/sasl'
    '-DHAS_LDAP'
    '-DUSE_LDAP_SASL'
    '-DHAS_LMDB'
    '-DUSE_TLS'
    '-DHAS_MONGODB' '-I/usr/include/libmongoc-1.0' '-I/usr/include/libbson-1.0'
    '-DHAS_MYSQL' '-I/usr/include/mysql'
    '-DUSE_TLSRPT'
    '-DHAS_PCRE=2'
    '-DHAS_PGSQL' '-I/usr/include/postgresql'
    '-DHAS_SQLITE'
    '-DHAS_CDB'
    '-DNO_DB'
    '-DDEF_DB_TYPE=\"lmdb\"'
    '-DDEF_COMMAND_DIR=\"/usr/bin\"'
    '-DDEF_DAEMON_DIR=\"/usr/lib/postfix/bin\"'
    '-DDEF_SENDMAIL_PATH=\"/usr/bin/sendmail\"'
    '-DDEF_README_DIR=\"/usr/share/doc/postfix\"'
    '-DDEF_MANPAGE_DIR=\"/usr/share/man\"'
    '-std=gnu17' # https://gitlab.archlinux.org/archlinux/packaging/packages/postfix/-/issues/10
  )
  # NOTE: descriptions of options in makedefs
  local make_options=(
    DEBUG=''
    pie=yes
    shared=yes
    dynamicmaps=yes
    CCARGS="${ccargs[*]}"
    AUXLIBS="$(pkgconf --libs openssl libsasl2 libtlsrpt) -lnsl"
    AUXLIBS_LDAP='-lldap -llber'
    AUXLIBS_LMDB="$(pkgconf --libs lmdb)"
    AUXLIBS_PCRE="$(pcre2-config --libs8)"
    AUXLIBS_MONGODB="$(pkgconf --libs libmongoc-1.0)"
    AUXLIBS_MYSQL="$(pkgconf --libs mariadb)"
    AUXLIBS_PGSQL="$(pkgconf --libs libpq)"
    AUXLIBS_SQLITE="$(pkgconf --libs sqlite3)"
    AUXLIBS_CDB='-lcdb'
    SHLIB_RPATH="-Wl,-rpath,/usr/lib/postfix $LDFLAGS"
    OPT="$CFLAGS $CPPFLAGS $LDFLAGS"
  )

  make makefiles "${make_options[@]}" -C $pkgbase-$pkgver
  make -C $pkgbase-$pkgver
}

package_postfix() {
  local _name _feature

  local _dynamicmaps_file="$pkgdir/etc/$pkgbase/dynamicmaps.cf"
  local _dynamicmaps_dir="$pkgdir/etc/$pkgbase/dynamicmaps.cf.d"
  local _files_file="$pkgdir/etc/$pkgbase/$pkgbase-files"
  local _files_dir="$pkgdir/etc/$pkgbase/$pkgbase-files.d"

  depends+=(
    icu libicuuc.so
    libnsl libnsl.so
    libsasl libsasl2.so
    libtlsrpt libtlsrpt.so
    openssl libcrypto.so libssl.so
    postfix-lmdb
    sh
  )
  optdepends=(
    'perl: for postfix-collate.pl, postfix-tlstype.pl and qshape'
    'postfix-cdb: for CDB integration'
    'postfix-ldap: for LDAP integration'
    'postfix-lmdb: for LMDB integration'
    'postfix-mongodb: for MongoDB integration'
    'postfix-mysql: for MySQL integration'
    'postfix-pcre: for PCRE integration'
    'postfix-pgsql: for PostgreSQL integration'
    'postfix-sqlite: for SQLite integration'
  )
  conflicts=(smtp-server smtp-forwarder)
  provides=(smtp-server smtp-forwarder)
  backup=(etc/postfix/{access,aliases,canonical,generic,header_checks,main.cf,master.cf,relocated,transport,virtual})
  install=$pkgbase.install

  cd $pkgname-$pkgver
  LD_LIBRARY_PATH="lib:$LD_LIBRARY_PATH" \
  sh postfix-install -non-interactive install_root="$pkgdir"

  # additional man pages and scripts
  for _name in posttls-finger {smtp,qmqp}-{sink,source}; do
    install -vDm 644 man/man1/$_name.1 -t "$pkgdir/usr/share/man/man1/"
    install -vDm 755 bin/$_name -t "$pkgdir/usr/bin/"
  done
  install -vDm 644 man/man1/qshape.1 -t "$pkgdir/usr/share/man/man1/"
  install -vDm 755 auxiliary/qshape/qshape.pl "$pkgdir/usr/bin/qshape"
  install -vDm 755 auxiliary/collate/collate.pl "$pkgdir/usr/bin/postfix-collate.pl"
  install -vDm 755 auxiliary/collate/tlstype.pl "$pkgdir/usr/bin/postfix-tlstype.pl"
  install -vDm 644 auxiliary/collate/README* -t "$pkgdir/usr/share/doc/$pkgname/collate/"
  # licenses
  install -vDm 644 LICENSE COPYRIGHT -t "$pkgdir/usr/share/licenses/$pkgname/"
  # systemd service
  install -vDm 644 ../$pkgname.service -t "$pkgdir/usr/lib/systemd/system/"
  # sysusers.d
  install -vDm 644 ../$pkgname.sysusers "$pkgdir/usr/lib/sysusers.d/$pkgname.conf"
  # tmpfiles.d
  # NOTE: follows setup in conf/postfix-files
  install -vDm 644 ../$pkgname.tmpfiles "$pkgdir/usr/lib/tmpfiles.d/$pkgname.conf"

  # create dynamicmaps.cf.d and postfix-files.d entries for split packages
  # remove targetted files from main configuration files
  for _feature in {cdb,ldap,lmdb,mongodb,mysql,pcre,pgsql,sqlite}; do
    printf "Split out dynamicmaps file for %s\n" $pkgbase-$_feature
    grep "$pkgbase-$_feature" "$_dynamicmaps_file" > "$_dynamicmaps_dir/$pkgbase-$_feature.cf"
    sed -e "/$pkgbase-$_feature/d" -i "$_dynamicmaps_file"
    (
      cd "$pkgdir"
      _pick $pkgbase-$_feature etc/$pkgbase/dynamicmaps.cf.d/$pkgbase-$_feature.cf
    )

    printf "Split out %s from %s-files.d\n" $pkgbase-$_feature $pkgbase
    grep "$pkgbase-$_feature" "$_files_file" > "$_files_dir/$pkgbase-$_feature.cf"
    sed -e "/$pkgbase-$_feature/d" -i "$_files_file"

    printf "Split %s from %s-files\n" ${_feature^^}_README $pkgbase
    grep "${_feature^^}_README:" "$_files_file" >> "$_files_dir/$pkgbase-$_feature.cf"
    sed -e "/${_feature^^}_README:/d" -i "$_files_file"

    if [[ "$_feature" != cdb ]]; then
      printf "Split %s from %s-files\n" ${_feature}_table.5 $pkgbase
      grep "${_feature}_table.5:" "$_files_file" >> "$_files_dir/$pkgbase-$_feature.cf"
      sed -e "/${_feature}_table.5:/d" -i "$_files_file"
      (
        cd "$pkgdir"
        _pick $pkgbase-$_feature usr/share/man/man5/${_feature}_table.5
      )
    fi
    (
      cd "$pkgdir"
      _pick $pkgbase-$_feature etc/$pkgbase/$pkgbase-files.d/$pkgbase-$_feature.cf
      _pick $pkgbase-$_feature usr/lib/$pkgbase/$pkgbase-$_feature.so
      _pick $pkgbase-$_feature usr/share/doc/$pkgbase/${_feature^^}_README
    )
    # install directories that are otherwise cleared by calls to _pick()
    install -vdm 755 "$_dynamicmaps_dir"
    install -vdm 755 "$_files_dir"
  done

  # remove non-reproducible file, that only lists what the build circumstances were
  rm -v "$pkgdir/etc/$pkgname/makedefs.out"
  sed -e '/makedefs/d' -i "$pkgdir/etc/$pkgname/$pkgname-files"
}

package_postfix-cdb() {
  depends+=(
    postfix
    tinycdb libcdb.so
  )
  pkgdesc+=' (CDB integration)'

  mv -v $pkgname/* "$pkgdir"
  install -vDm 644 $pkgbase-$pkgver/{LICENSE,COPYRIGHT} -t "$pkgdir/usr/share/licenses/$pkgname/"
}

package_postfix-ldap() {
  depends+=(
    libldap
    postfix
  )
  pkgdesc+=' (LDAP integration)'

  mv -v $pkgname/* "$pkgdir"
  install -vDm 644 $pkgbase-$pkgver/{LICENSE,COPYRIGHT} -t "$pkgdir/usr/share/licenses/$pkgname/"
}

package_postfix-lmdb() {
  depends+=(
    lmdb
    postfix
  )
  pkgdesc+=' (LMDB integration)'

  mv -v $pkgname/* "$pkgdir"
  install -vDm 644 $pkgbase-$pkgver/{LICENSE,COPYRIGHT} -t "$pkgdir/usr/share/licenses/$pkgname/"
}

package_postfix-mongodb() {
  depends+=(
    mongo-c-driver
    postfix
  )
  pkgdesc+=' (MongoDB integration)'

  mv -v $pkgname/* "$pkgdir"
  install -vDm 644 $pkgbase-$pkgver/{LICENSE,COPYRIGHT} -t "$pkgdir/usr/share/licenses/$pkgname/"
}

package_postfix-mysql() {
  depends+=(
    mariadb-libs libmariadb.so
    postfix
  )
  pkgdesc+=' (MySQL integration)'

  mv -v $pkgname/* "$pkgdir"
  install -vDm 644 $pkgbase-$pkgver/{LICENSE,COPYRIGHT} -t "$pkgdir/usr/share/licenses/$pkgname/"
}

package_postfix-pcre() {
  depends+=(
    pcre2 libpcre2-8.so
    postfix
  )
  pkgdesc+=' (PCRE integration)'

  mv -v $pkgname/* "$pkgdir"
  install -vDm 644 $pkgbase-$pkgver/{LICENSE,COPYRIGHT} -t "$pkgdir/usr/share/licenses/$pkgname/"
}

package_postfix-pgsql() {
  depends+=(
    postfix
    postgresql-libs libpq.so
  )
  pkgdesc+=' (PostgreSQL integration)'

  mv -v $pkgname/* "$pkgdir"
  install -vDm 644 $pkgbase-$pkgver/{LICENSE,COPYRIGHT} -t "$pkgdir/usr/share/licenses/$pkgname/"
}

package_postfix-sqlite() {
  depends+=(
    postfix
    sqlite libsqlite3.so
  )
  pkgdesc+=' (SQLite integration)'

  mv -v $pkgname/* "$pkgdir"
  install -vDm 644 $pkgbase-$pkgver/{LICENSE,COPYRIGHT} -t "$pkgdir/usr/share/licenses/$pkgname/"
}
