mail-mta/postfix: migrate to sys-libs/pam
[gentoo.git] / mail-mta / postfix / postfix-3.4.5-r1.ebuild
1 # Copyright 1999-2019 Gentoo Authors
2 # Distributed under the terms of the GNU General Public License v2
3
4 EAPI=7
5
6 inherit flag-o-matic pam systemd toolchain-funcs user
7
8 MY_PV="${PV/_rc/-RC}"
9 MY_SRC="${PN}-${MY_PV}"
10 MY_URI="ftp://ftp.porcupine.org/mirrors/postfix-release/official"
11 RC_VER="2.7"
12
13 DESCRIPTION="A fast and secure drop-in replacement for sendmail"
14 HOMEPAGE="http://www.postfix.org/"
15 SRC_URI="${MY_URI}/${MY_SRC}.tar.gz"
16
17 LICENSE="|| ( IBM EPL-2.0 )"
18 SLOT="0"
19 KEYWORDS="alpha amd64 arm hppa ia64 ~mips ppc ppc64 ~sh sparc x86"
20 IUSE="+berkdb cdb dovecot-sasl +eai hardened ldap ldap-bind libressl lmdb memcached mbox mysql nis pam postgres sasl selinux sqlite ssl"
21
22 DEPEND=">=dev-libs/libpcre-3.4
23         dev-lang/perl
24         berkdb? ( >=sys-libs/db-3.2:* )
25         cdb? ( || ( >=dev-db/tinycdb-0.76 >=dev-db/cdb-0.75-r4 ) )
26         eai? ( dev-libs/icu:= )
27         ldap? ( net-nds/openldap )
28         ldap-bind? ( net-nds/openldap[sasl] )
29         lmdb? ( >=dev-db/lmdb-0.9.11 )
30         mysql? ( dev-db/mysql-connector-c:0= )
31         nis? ( net-libs/libnsl )
32         pam? ( sys-libs/pam )
33         postgres? ( dev-db/postgresql:* )
34         sasl? (  >=dev-libs/cyrus-sasl-2 )
35         sqlite? ( dev-db/sqlite:3 )
36         ssl? (
37                 !libressl? ( dev-libs/openssl:0= )
38                 libressl? ( >=dev-libs/libressl-2.9.1:0= )
39         )"
40
41 RDEPEND="${DEPEND}
42         memcached? ( net-misc/memcached )
43         net-mail/mailbase
44         !mail-mta/courier
45         !mail-mta/esmtp
46         !mail-mta/exim
47         !mail-mta/mini-qmail
48         !mail-mta/msmtp[mta]
49         !mail-mta/netqmail
50         !mail-mta/nullmailer
51         !mail-mta/qmail-ldap
52         !mail-mta/sendmail
53         !mail-mta/opensmtpd
54         !<mail-mta/ssmtp-2.64-r2
55         !>=mail-mta/ssmtp-2.64-r2[mta]
56         !net-mail/fastforward
57         selinux? ( sec-policy/selinux-postfix )"
58
59 REQUIRED_USE="ldap-bind? ( ldap sasl )"
60
61 S="${WORKDIR}/${MY_SRC}"
62
63 PATCHES=(
64         "${FILESDIR}/${PN}-libressl-certkey.patch"
65         "${FILESDIR}/${PN}-libressl-server.patch"
66 )
67
68 pkg_setup() {
69         # Add postfix, postdrop user/group (bug #77565)
70         enewgroup postfix 207
71         enewgroup postdrop 208
72         enewuser postfix 207 -1 /var/spool/postfix postfix,mail
73 }
74
75 src_prepare() {
76         default
77         sed -i -e "/^#define ALIAS_DB_MAP/s|:/etc/aliases|:/etc/mail/aliases|" \
78                 src/util/sys_defs.h || die "sed failed"
79         # change default paths to better comply with portage standard paths
80         sed -i -e "s:/usr/local/:/usr/:g" conf/master.cf || die "sed failed"
81 }
82
83 src_configure() {
84         for name in CDB LDAP LMDB MYSQL PCRE PGSQL SDBM SQLITE
85         do
86                 local AUXLIBS_${name}=""
87         done
88
89         # Make sure LDFLAGS get passed down to the executables.
90         local mycc="-DHAS_PCRE" mylibs="${LDFLAGS} -ldl"
91         AUXLIBS_PCRE="$(pcre-config --libs)"
92
93         use pam && mylibs="${mylibs} -lpam"
94
95         if use ldap; then
96                 mycc="${mycc} -DHAS_LDAP"
97                 AUXLIBS_LDAP="-lldap -llber"
98         fi
99
100         if use mysql; then
101                 mycc="${mycc} -DHAS_MYSQL $(mysql_config --include)"
102                 AUXLIBS_MYSQL="$(mysql_config --libs)"
103         fi
104
105         if use postgres; then
106                 mycc="${mycc} -DHAS_PGSQL -I$(pg_config --includedir)"
107                 AUXLIBS_PGSQL="-L$(pg_config --libdir) -lpq"
108         fi
109
110         if use sqlite; then
111                 mycc="${mycc} -DHAS_SQLITE"
112                 AUXLIBS_SQLITE="-lsqlite3 -lpthread"
113         fi
114
115         if use ssl; then
116                 mycc="${mycc} -DUSE_TLS"
117                 mylibs="${mylibs} -lssl -lcrypto"
118         fi
119
120         if use lmdb; then
121                 mycc="${mycc} -DHAS_LMDB"
122                 AUXLIBS_LMDB="-llmdb -lpthread"
123         fi
124
125         if ! use eai; then
126                 mycc="${mycc} -DNO_EAI"
127         fi
128
129         # broken. and "in other words, not supported" by upstream.
130         # Use inet_protocols setting in main.cf
131         #if ! use ipv6; then
132         #       mycc="${mycc} -DNO_IPV6"
133         #fi
134
135         if use sasl; then
136                 if use dovecot-sasl; then
137                         # Set dovecot as default.
138                         mycc="${mycc} -DDEF_SASL_SERVER=\\\"dovecot\\\""
139                 fi
140                 if use ldap-bind; then
141                         mycc="${mycc} -DUSE_LDAP_SASL"
142                 fi
143                 mycc="${mycc} -DUSE_SASL_AUTH -DUSE_CYRUS_SASL -I/usr/include/sasl"
144                 mylibs="${mylibs} -lsasl2"
145         elif use dovecot-sasl; then
146                 mycc="${mycc} -DUSE_SASL_AUTH -DDEF_SERVER_SASL_TYPE=\\\"dovecot\\\""
147         fi
148
149         if ! use nis; then
150                 mycc="${mycc} -DNO_NIS"
151         fi
152
153         if ! use berkdb; then
154                 mycc="${mycc} -DNO_DB"
155                 if use cdb; then
156                         # change default hash format from Berkeley DB to cdb
157                         mycc="${mycc} -DDEF_DB_TYPE=\\\"cdb\\\""
158                 fi
159         fi
160
161         if use cdb; then
162                 mycc="${mycc} -DHAS_CDB -I/usr/include/cdb"
163                 # Tinycdb is preferred.
164                 if has_version dev-db/tinycdb ; then
165                         einfo "Building with dev-db/tinycdb"
166                         AUXLIBS_CDB="-lcdb"
167                 else
168                         einfo "Building with dev-db/cdb"
169                         CDB_PATH="/usr/$(get_libdir)"
170                         for i in cdb.a alloc.a buffer.a unix.a byte.a ; do
171                                 AUXLIBS_CDB="${AUXLIBS_CDB} ${CDB_PATH}/${i}"
172                         done
173                 fi
174         fi
175
176         # Robin H. Johnson <robbat2@gentoo.org> 17/Nov/2006
177         # Fix because infra boxes hit 2Gb .db files that fail a 32-bit fstat signed check.
178         mycc="${mycc} -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE"
179         filter-lfs-flags
180
181         # Workaround for bug #76512
182         if use hardened; then
183                 [[ "$(gcc-version)" == "3.4" ]] && replace-flags -O? -Os
184         fi
185
186         # Remove annoying C++ comment style warnings - bug #378099
187         append-flags -Wno-comment
188
189         sed -i -e "/^RANLIB/s/ranlib/$(tc-getRANLIB)/g" "${S}"/makedefs
190         sed -i -e "/^AR/s/ar/$(tc-getAR)/g" "${S}"/makedefs
191
192         emake makefiles shared=yes dynamicmaps=no pie=yes \
193                 shlib_directory="/usr/$(get_libdir)/postfix/MAIL_VERSION" \
194                 DEBUG="" CC="$(tc-getCC)" OPT="${CFLAGS}" CCARGS="${mycc}" AUXLIBS="${mylibs}" \
195                 AUXLIBS_CDB="${AUXLIBS_CDB}" AUXLIBS_LDAP="${AUXLIBS_LDAP}" \
196                 AUXLIBS_LMDB="${AUXLIBS_LMDB}" AUXLIBS_MYSQL="${AUXLIBS_MYSQL}" \
197                 AUXLIBS_PCRE="${AUXLIBS_PCRE}" AUXLIBS_PGSQL="${AUXLIBS_PGSQL}" \
198                 AUXLIBS_SQLITE="${AUXLIBS_SQLITE}"
199 }
200
201 src_install () {
202         LD_LIBRARY_PATH="${S}/lib" \
203         /bin/sh postfix-install \
204                 -non-interactive \
205                 install_root="${D}" \
206                 config_directory="/etc/postfix" \
207                 manpage_directory="/usr/share/man" \
208                 command_directory="/usr/sbin" \
209                 mailq_path="/usr/bin/mailq" \
210                 newaliases_path="/usr/bin/newaliases" \
211                 sendmail_path="/usr/sbin/sendmail" \
212                 || die "postfix-install failed"
213
214         # Fix spool removal on upgrade
215         rm -Rf "${D}"/var
216         keepdir /var/spool/postfix
217
218         # Install rmail for UUCP, closes bug #19127
219         dobin auxiliary/rmail/rmail
220
221         # Provide another link for legacy FSH
222         dosym ../sbin/sendmail /usr/$(get_libdir)/sendmail
223
224         # Install qshape, posttls-finger and collate
225         dobin auxiliary/qshape/qshape.pl
226         doman man/man1/qshape.1
227         dobin bin/posttls-finger
228         doman man/man1/posttls-finger.1
229         dobin auxiliary/collate/collate.pl
230         newdoc auxiliary/collate/README README.collate
231
232         # Performance tuning tools and their manuals
233         dosbin bin/smtp-{source,sink} bin/qmqp-{source,sink}
234         doman man/man1/smtp-{source,sink}.1 man/man1/qmqp-{source,sink}.1
235
236         # Set proper permissions on required files/directories
237         keepdir /var/lib/postfix
238         fowners -R postfix:postfix /var/lib/postfix
239         fperms 0750 /var/lib/postfix
240         fowners root:postdrop /usr/sbin/post{drop,queue}
241         fperms 02755 /usr/sbin/post{drop,queue}
242
243         keepdir /etc/postfix
244         keepdir /etc/postfix/postfix-files.d
245         if use mbox; then
246                 mypostconf="mail_spool_directory=/var/spool/mail"
247         else
248                 mypostconf="home_mailbox=.maildir/"
249         fi
250         LD_LIBRARY_PATH="${S}/lib" \
251         "${D}"/usr/sbin/postconf -c "${D}"/etc/postfix \
252                 -e ${mypostconf} || die "postconf failed"
253
254         insinto /etc/postfix
255         newins "${FILESDIR}"/smtp.pass saslpass
256         fperms 600 /etc/postfix/saslpass
257
258         newinitd "${FILESDIR}"/postfix.rc6.${RC_VER} postfix
259         # do not start mysql/postgres unnecessarily - bug #359913
260         use mysql || sed -i -e "s/mysql //" "${D}/etc/init.d/postfix"
261         use postgres || sed -i -e "s/postgresql //" "${D}/etc/init.d/postfix"
262
263         dodoc *README COMPATIBILITY HISTORY PORTING RELEASE_NOTES*
264         mv "${S}"/examples "${D}"/usr/share/doc/${PF}/
265         # postfix set-permissions expects uncompressed man files
266         docompress -x /usr/share/man
267
268         pamd_mimic_system smtp auth account
269
270         if use sasl; then
271                 insinto /etc/sasl2
272                 newins "${FILESDIR}"/smtp.sasl smtpd.conf
273         fi
274
275         # header files
276         insinto /usr/include/postfix
277         doins include/*.h
278
279         if has_version mail-mta/postfix; then
280                 # let the sysadmin decide when to change the compatibility_level
281                 sed -i -e /^compatibility_level/"s/^/#/" "${D}"/etc/postfix/main.cf || die
282         fi
283
284         systemd_dounit "${FILESDIR}/${PN}.service"
285 }
286
287 pkg_preinst() {
288         if has_version '<mail-mta/postfix-3.4'; then
289                 elog
290                 elog "Postfix-3.4 introduces a new master.cf service 'postlog'"
291                 elog "with type 'unix-dgram' that is used by the new postlogd(8) daemon."
292                 elog "Before backing out to an older Postfix version, edit the master.cf"
293                 elog "file and remove the postlog entry."
294                 elog
295         fi
296 }
297
298 pkg_postinst() {
299         if [[ ! -e /etc/mail/aliases.db ]] ; then
300                 ewarn
301                 ewarn "You must edit /etc/mail/aliases to suit your needs"
302                 ewarn "and then run /usr/bin/newaliases. Postfix will not"
303                 ewarn "work correctly without it."
304                 ewarn
305         fi
306
307         # check and fix file permissions
308         "${EROOT}"/usr/sbin/postfix set-permissions
309
310         # configure tls
311         if use ssl ; then
312                 if "${EROOT}"/usr/sbin/postfix tls all-default-client; then
313                         elog "To configure client side TLS settings:"
314                         elog "${EROOT}"/usr/sbin/postfix tls enable-client
315                 fi
316                 if "${EROOT}"/usr/sbin/postfix tls all-default-server; then
317                         elog "To configure server side TLS settings:"
318                         elog "${EROOT}"/usr/sbin/postfix tls enable-server
319                 fi
320         fi
321 }