diff --git a/configure.ac b/configure.ac index cf8a7e3e81..2246e93d15 100644 --- a/configure.ac +++ b/configure.ac @@ -667,6 +667,8 @@ AC_ARG_ENABLE(sieve, [AS_HELP_STRING([--disable-sieve], [disable Sieve support])],,[enable_sieve="yes";]) AC_ARG_ENABLE(pcre, [AS_HELP_STRING([--disable-pcre], [disable PCRE library])],[cyrus_cv_pcre_utf8="$enableval"]) +AC_ARG_ENABLE(pcre2, + [AS_HELP_STRING([--disable-pcre2], [disable PCRE2 library])],[cyrus_cv_pcre2_utf8="$enableval"]) if test "$enable_sieve" != "no"; then AC_DEFINE(USE_SIEVE,[],[Build in Sieve support?]) @@ -700,11 +702,29 @@ if test "$enable_pcre" != "no"; then fi fi +if test "$enable_pcre2" != "no"; then + AC_CHECK_HEADER(pcre2posix.h) + if test "$ac_cv_header_pcre2posix_h" = "yes"; then + AC_MSG_CHECKING(for utf8 enabled pcre2) + AC_CACHE_VAL(cyrus_cv_pcre2_utf8, AC_TRY_CPP([#include +#ifndef REG_UTF +#include +#endif],cyrus_cv_pcre2_utf8=yes,cyrus_cv_pcre2_utf8=no)) + AC_MSG_RESULT($cyrus_cv_pcre2_utf8) + else + cyrus_cv_pcre2_utf8="no" + fi +fi + LIB_REGEX= if test "$cyrus_cv_pcre_utf8" = "yes"; then LIB_REGEX="-lpcre -lpcreposix"; AC_DEFINE(ENABLE_REGEX, [], [Do we have a regex library?]) AC_DEFINE(HAVE_PCREPOSIX_H, [], [Do we have usable pcre library?]) +elif test "$cyrus_cv_pcre2_utf8" = "yes"; then + LIB_REGEX="-lpcre2-posix -lpcre2-8"; + AC_DEFINE(ENABLE_REGEX, [], [Do we have a regex library?]) + AC_DEFINE(HAVE_PCRE2POSIX_H, [], [Do we have usable pcre2 library?]) else AC_CHECK_HEADERS(rxposix.h) if test "$ac_cv_header_rxposix_h" = "yes"; then @@ -2469,6 +2489,7 @@ External dependencies: zlib: $with_zlib jansson: $with_jansson pcre: $cyrus_cv_pcre_utf8 + pcre2: $cyrus_cv_pcre2_utf8 clamav: $with_clamav ----------------------- caringo: $with_caringo diff --git a/docsrc/assets/cyrus-build-devpkg.rst b/docsrc/assets/cyrus-build-devpkg.rst index c1ae6e0426..6052a86843 100644 --- a/docsrc/assets/cyrus-build-devpkg.rst +++ b/docsrc/assets/cyrus-build-devpkg.rst @@ -8,7 +8,7 @@ automated test facility. debhelper flex g++ git gperf groff heimdal-dev libbsd-resource-perl libclone-perl libconfig-inifiles-perl \ libcunit1-dev libdatetime-perl libbsd-dev libdb-dev libdigest-sha-perl libencode-imaputf7-perl \ libfile-chdir-perl libglib2.0-dev libical-dev libio-socket-inet6-perl \ libio-stringy-perl libldap2-dev libmysqlclient-dev \ - libnet-server-perl libnews-nntpclient-perl libpam0g-dev libpcre3-dev libsasl2-dev \ + libnet-server-perl libnews-nntpclient-perl libpam0g-dev libpcre2-dev libsasl2-dev \ libsqlite3-dev libssl-dev libtest-unit-perl libtool libunix-syslog-perl liburi-perl \ libxapian-dev libxml-generator-perl libxml-xpath-perl libxml2-dev libwrap0-dev libzephyr-dev lsb-base \ net-tools perl php-cli php-curl pkg-config po-debconf tcl-dev \ diff --git a/docsrc/assets/cyrus-build-reqpkg.rst b/docsrc/assets/cyrus-build-reqpkg.rst index a3a530cc39..1c8bb45951 100644 --- a/docsrc/assets/cyrus-build-reqpkg.rst +++ b/docsrc/assets/cyrus-build-reqpkg.rst @@ -2,6 +2,6 @@ sudo apt-get install git build-essential autoconf automake libtool \ pkg-config bison flex libssl-dev libjansson-dev libxml2-dev \ - libsqlite3-dev libical-dev libsasl2-dev libpcre3-dev uuid-dev \ + libsqlite3-dev libical-dev libsasl2-dev libpcre2-dev uuid-dev \ libicu-dev sudo apt-get -t jessie-backports install libxapian-dev diff --git a/docsrc/imap/developer/compiling.rst b/docsrc/imap/developer/compiling.rst index e0bc9b32eb..71bf28da74 100644 --- a/docsrc/imap/developer/compiling.rst +++ b/docsrc/imap/developer/compiling.rst @@ -186,7 +186,7 @@ Other to enable **ptloader** to interface with LDAP directly, for canonification of login usernames to mailbox names, and verification of login usernames, ACL subjects and group membership. Configure option: ``--with-ldap``." - `pcre`_, libpcre3-dev, pcre-devel, "yes", "PCRE 1 (8.x) - for utf-8/unicode + `pcre2`_, libpcre2-dev, pcre2-devel, "yes", "PCRE 2 (10.x) - for utf-8/unicode regular expression matching. Could be replaced by something else in the future. See `issues/1731`_ for more information." `perl(Term::ReadLine)`_,,, "no", "Perl library needed by **cyradm**." @@ -211,6 +211,7 @@ Other .. _nghttp2: https://nghttp2.org/ .. _openldap: http://www.openldap.org/ .. _pcre: http://www.pcre.org/ +.. _pcre2: http://www.pcre.org/ .. _perl(Term::ReadLine): https://metacpan.org/pod/Term::ReadLine .. _perl(ExtUtils::MakeMaker): http://search.cpan.org/dist/ExtUtils-MakeMaker/ .. _perl(Pod::POM::View::Restructured): https://metacpan.org/pod/Pod::POM::View::Restructured diff --git a/docsrc/imap/download/upgrade.rst b/docsrc/imap/download/upgrade.rst index c7eeabc253..2188b9d179 100644 --- a/docsrc/imap/download/upgrade.rst +++ b/docsrc/imap/download/upgrade.rst @@ -132,7 +132,7 @@ packages) for Debian is:: debhelper flex g++ git gperf groff heimdal-dev libbsd-resource-perl libclone-perl libconfig-inifiles-perl \ libcunit1-dev libdatetime-perl libdb-dev libdigest-sha-perl libencode-imaputf7-perl libfile-chdir-perl \ libglib2.0-dev libical-dev libio-socket-inet6-perl libio-stringy-perl libjansson-dev libldap2-dev \ - libmysqlclient-dev libnet-server-perl libnews-nntpclient-perl libpam0g-dev libpcre3-dev libsasl2-dev \ + libmysqlclient-dev libnet-server-perl libnews-nntpclient-perl libpam0g-dev libpcre2-dev libsasl2-dev \ libsqlite3-dev libssl-dev libtest-unit-perl libtool libunix-syslog-perl liburi-perl \ libxapian-dev libxml-generator-perl libxml-xpath-perl libxml2-dev libwrap0-dev libzephyr-dev lsb-base \ net-tools perl php-cli php-curl pkg-config po-debconf tcl-dev \ diff --git a/imap/cyr_buildinfo.c b/imap/cyr_buildinfo.c index 56ee27bc4b..31e5a98cae 100644 --- a/imap/cyr_buildinfo.c +++ b/imap/cyr_buildinfo.c @@ -186,6 +186,11 @@ static json_t *buildinfo() #else json_object_set_new(dependency, "pcre", json_false()); #endif +#if defined(ENABLE_REGEX) && defined(HAVE_PCRE2POSIX_H) + json_object_set_new(dependency, "pcre2", json_true()); +#else + json_object_set_new(dependency, "pcre2", json_false()); +#endif #ifdef HAVE_CLAMAV json_object_set_new(dependency, "clamav", json_true()); #else diff --git a/lib/util.h b/lib/util.h index bf2e58e09a..7d97815946 100644 --- a/lib/util.h +++ b/lib/util.h @@ -71,17 +71,20 @@ extern const char CYRUS_VERSION[]; #ifdef ENABLE_REGEX -# ifdef HAVE_PCREPOSIX_H +# if defined HAVE_PCREPOSIX_H # include # include -# else /* !HAVE_PCREPOSIX_H */ -# ifdef HAVE_RXPOSIX_H -# include -# else /* !HAVE_RXPOSIX_H */ -# include -# endif /* HAVE_RXPOSIX_H */ -# endif /* HAVE_PCREPOSIX_H */ -#endif /* ENABLE_REGEX */ +# elif defined HAVE_PCRE2POSIX_H +# ifndef PCRE2POSIX_H_INCLUDED +# include +# define PCRE2POSIX_H_INCLUDED +# endif +# elif defined HAVE_RXPOSIX_H +# include +# else +# include +# endif +#endif #ifdef HAVE_LIBUUID #include diff --git a/ptclient/test3.c b/ptclient/test3.c index 0d61ff49d5..637c20eb3e 100644 --- a/ptclient/test3.c +++ b/ptclient/test3.c @@ -1,6 +1,6 @@ /* * test ptsmodule_standard_root_dn - * gcc -lz -lpcreposix -I.. -I ../lib ../lib/.libs/util.o ../lib/.libs/xmalloc.o ../lib/.libs/map_shared.o ../lib/.libs/retry.o ../lib/.libs/assert.o test3.c + * gcc -I.. -I ../lib ../lib/.libs/util.o ../lib/.libs/xmalloc.o ../lib/.libs/map_shared.o ../lib/.libs/retry.o ../lib/.libs/assert.o test3.c -lz -lpcre2-posix */ #include #include diff --git a/sieve/bc_eval.c b/sieve/bc_eval.c index 725a238332..561ba5921d 100644 --- a/sieve/bc_eval.c +++ b/sieve/bc_eval.c @@ -316,9 +316,11 @@ static int regcomp_flags(int comparator, int requires) { int cflags = REG_EXTENDED; -#ifdef HAVE_PCREPOSIX_H /* support UTF8 comparisons */ +#if defined HAVE_PCREPOSIX_H cflags |= REG_UTF8; +#elif defined HAVE_PCRE2POSIX_H + cflags |= REG_UTF; #endif if (comparator == B_ASCIICASEMAP) { diff --git a/sieve/comparator.h b/sieve/comparator.h index b043bc296b..8c58bd1e73 100644 --- a/sieve/comparator.h +++ b/sieve/comparator.h @@ -47,17 +47,20 @@ #include #ifdef ENABLE_REGEX -# ifdef HAVE_PCREPOSIX_H +# if defined HAVE_PCREPOSIX_H # include # include -# else /* !HAVE_PCREPOSIX_H */ -# ifdef HAVE_RXPOSIX_H -# include -# else /* !HAVE_RXPOSIX_H */ -# include -# endif /* HAVE_RXPOSIX_H */ -# endif /* HAVE_PCREPOSIX_H */ -#endif /* ENABLE_REGEX */ +# elif defined HAVE_PCRE2POSIX_H +# ifndef PCRE2POSIX_H_INCLUDED +# include +# define PCRE2POSIX_H_INCLUDED +# endif +# elif defined HAVE_RXPOSIX_H +# include +# else +# include +# endif +#endif #include "sieve_interface.h" #include "strarray.h" diff --git a/sieve/sieve.y b/sieve/sieve.y index e84b5c84cc..335c08dca8 100644 --- a/sieve/sieve.y +++ b/sieve/sieve.y @@ -2068,9 +2068,11 @@ static int verify_regexlist(sieve_script_t *sscript, regex_t reg; int cflags = REG_EXTENDED | REG_NOSUB; -#ifdef HAVE_PCREPOSIX_H /* support UTF8 comparisons */ +#if defined HAVE_PCREPOSIX_H cflags |= REG_UTF8; +#elif defined HAVE_PCRE2POSIX_H + cflags |= REG_UTF; #endif if (collation == B_ASCIICASEMAP) {