# Copyright 1999-2022 Gentoo Authors
# Distributed under the terms of the GNU General Public License v2

EAPI=7

inherit flag-o-matic toolchain-funcs

DESCRIPTION="A security oriented POP3 server"
HOMEPAGE="http://www.openwall.com/popa3d/"
SRC_URI="
	http://www.openwall.com/popa3d/${P}.tar.gz
	mirror://gentoo/popa3d-0.6.3-vname-2.diff.gz
	maildir? ( mirror://gentoo/popa3d-0.5.9-maildir-2.diff.gz )"

LICENSE="Openwall"
SLOT="0"
KEYWORDS="amd64 ppc sparc x86"
IUSE="pam mbox +maildir"
REQUIRED_USE="^^ ( maildir mbox )"

DEPEND="
	acct-group/popa3d
	acct-user/popa3d
	virtual/libcrypt:=
	pam? (
		>=sys-libs/pam-0.72
		>=net-mail/mailbase-0.00-r8[pam]
	)"
RDEPEND="${DEPEND}"

# Mailbox format is determined by the 'mbox' and 'maildir'
# system USE flags.
#
# Mailbox path configuration denoted by the system USE
# flags.
#
# USE flag 'maildir' denotes ~/.maildir
# USE flag 'mbox' denotes /var/mail/username
#
# You can overwrite this by setting the POPA3D_HOME_MAILBOX
# environmental variable (see below) before emerge.
#
# Environmental variables.
#
# POPA3D_HOME_MAILBOX
#
# Overwrite the local user mailbox path. For example
# if you want qmail-styled ~/Mailbox you can set it
# to "Mailbox". For the traditional (although not in
# gentoo Maildir) set it to "Maildir".
#
# POPA3D_VIRTUAL_ONLY
#
# Set this field to "YES" if you dont want local users
# to have POP access. Setting this makes the POPA3D_HOME_MAILBOX
# variable effectively useless.
#
# POPA3D_VIRTUAL_HOME_PATH
#
# Set this field to the base virtual home path. For more information
# read the virtual guide here: https://forums.gentoo.org/viewtopic.php?t=82386
#
######
# 12/07/2005 - port001
# Version 1.0 introduced some increased default values for a number of
# configuration paramaters. These values are way too high for most systems.
MAX_SESSIONS=100 # Default is 500
MAX_SESSIONS_PER_SOURCE=10 # Default is 50

MAX_MAILBOX_MESSAGES=100000 # Default is 2097152
MAX_MAILBOX_OPEN_BYTES=100000000 # Default is 2147483647
MAX_MAILBOX_WORK_BYTES=150000000 # Default is 2147483647
######

pkg_setup() {
	einfo "You can customize this ebuild with environmental variables."
	einfo "If you don't set any I'll assume sensible defaults."
	einfo
	einfo "See inside this ebuild for details."
}

src_prepare() {
	eapply "${WORKDIR}"/popa3d-0.6.3-vname-2.diff
	use maildir && eapply "${WORKDIR}"/popa3d-0.5.9-maildir-2.diff
	eapply_user
}

src_configure() {
	sed -i \
		-e "s:^\(#define MAX_SESSIONS\) .*$:\1 ${MAX_SESSIONS}:" \
		-e "s:^\(#define MAX_SESSIONS_PER_SOURCE\).*$:\1 ${MAX_SESSIONS_PER_SOURCE}:" \
		-e "s:^\(#define MAX_MAILBOX_MESSAGES\).*$:\1 ${MAX_MAILBOX_MESSAGES}:" \
		-e "s:^\(#define MAX_MAILBOX_OPEN_BYTES\).*$:\1 ${MAX_MAILBOX_OPEN_BYTES}:" \
		-e "s:^\(#define MAX_MAILBOX_WORK_BYTES\).*$:\1 ${MAX_MAILBOX_WORK_BYTES}:" \
			params.h || die "sed on params.h failed (1)"

	if use maildir ; then
		einfo "Mailbox format is: MAILDIR."
		if [[ -z ${POPA3D_HOME_MAILBOX} ]] ; then
			POPA3D_HOME_MAILBOX=".maildir"
		fi
	else
		einfo "Mailbox format is: MAILBOX."
	fi

	if [[ -n ${POPA3D_HOME_MAILBOX} ]] ; then
		einfo "Mailbox path: ~/${POPA3D_HOME_MAILBOX}"
		sed -i \
			-e "s:^\(#define MAIL_SPOOL_PATH.*\)$://\1:" \
			-e "s:^\(#define HOME_MAILBOX_NAME\).*$:\1 \"${POPA3D_HOME_MAILBOX}\":" \
				params.h || die "sed on params.h failed (2)"
	else
		einfo "Mailbox path: /var/mail/username"
	fi

	if [[ ${POPA3D_VIRTUAL_ONLY} = "YES" ]] ; then
		einfo "Virtual only, no local system users"
		sed -i -e "s:^\(#define VIRTUAL_ONLY\).*$:\1 1:" \
			params.h || die "sed on param.h failed (2.5)"
	fi

	if [[ -n ${POPA3D_VIRTUAL_HOME_PATH} ]] ; then
		einfo "Virtual home path set to: ${POPA3D_VIRTUAL_HOME_PATH}"
		sed -i \
			-e "s:^\(#define VIRTUAL_HOME_PATH\).*$:\1 \"$POPA3D_VIRTUAL_HOME_PATH\":" \
				params.h || die "sed on params.h failed (3)"
	fi

	if [[ ${POPA3D_VIRTUAL_ONLY} = "YES" ]] ; then
		einfo "Authentication method: Virtual."
	elif use pam ; then
		einfo "Authentication method: PAM."
		append-libs -lpam
		sed -i \
			-e "s:^\(#define AUTH_SHADOW\)[[:blank:]].*$:\1 0:" \
			-e "s:^\(#define AUTH_PAM\)[[:blank:]].*$:\1 1:" \
				params.h || die "sed on params.h failed (4)"
	else
		einfo "Authentication method: Shadow."
	fi

	sed -i \
		-e "s:^\(#define POP_STANDALONE\).*$:\1 1:" \
		-e "s:^\(#define POP_VIRTUAL\).*$:\1 1:" \
		-e "s:^\(#define VIRTUAL_VNAME\).*$:\1 1:" \
			params.h || die "sed on params.h failed (5)"

	sed -i \
		-e '/^CC =/d' \
		-e '/^CFLAGS =/d' \
		-e '/^LDFLAGS =/d' \
			Makefile || die "Makefile cleaning failed"
}

src_compile() {
	emake LIBS="${LIBS} -lcrypt" \
		CFLAGS="${CFLAGS}" \
		LDFLAGS="${LDFLAGS}" \
		CC="$(tc-getCC)"
}

src_install() {
	dosbin popa3d
	doman popa3d.8
	dodoc DESIGN INSTALL CHANGES VIRTUAL CONTACT

	diropts -m 755
	dodir /var/empty
	keepdir /var/empty

	newinitd "${FILESDIR}"/popa3d-initrc popa3d

	if use pam ; then
		dodir /etc/pam.d/
		dosym pop /etc/pam.d/popa3d
	fi
}