experimental_capabilities=""
have_mail_utf8=no
+have_imap4rev2=no
AC_ARG_ENABLE(experimental-mail-utf8,
AS_HELP_STRING([--enable-experimental-mail-utf8], [Enable experimental support for SMTPUTF8 and UTF8=ACCEPT]),
AC_SUBST([DOVECOT_HAVE_MAIL_UTF8], $have_mail_utf8)
+AC_ARG_ENABLE(experimental-imap4rev2,
+AS_HELP_STRING([--enable-experimental-imap4rev2], [Enable experimental support for IMAP4REV2]),
+ AS_IF([test x$enableval = xyes], [
+ AC_DEFINE([EXPERIMENTAL_IMAP4REV2],, [Build with IMAP4REV2 support])
+ experimental_capabilities="${experimental_capabilities} IMAP4REV2"
+ have_imap4rev2=yes
+ ])
+)
+
+AC_SUBST([DOVECOT_HAVE_IMAP4REV2], $have_imap4rev2)
+
AC_ARG_WITH(shared-libs,
AS_HELP_STRING([--with-shared-libs], [Link binaries using shared Dovecot libraries (default)]),
want_shared_libs=$withval,
settings_override(set_instance,
"imap_capability/LITERAL-",
"no", SETTINGS_OVERRIDE_TYPE_CODE);
+ if (!imap_client->set->imap4rev2_enable)
+ settings_override(set_instance, "imap_capability/IMAP4rev2",
+ "no", SETTINGS_OVERRIDE_TYPE_CODE);
+
if (imap_client_reload_config(client, &error) < 0) {
e_error(client->event, "%s", error);
return -1;
DEF(BOOLLIST, imap_capability),
DEF(BOOL, imap_literal_minus),
DEF(BOOL, imap_id_retain),
+ DEF(BOOL, imap4rev2_enable),
{ .type = SET_STRLIST, .key = "imap_id_send",
.offset = offsetof(struct imap_login_settings, imap_id_send) },
.imap_id_send = ARRAY_INIT,
.imap_literal_minus = FALSE,
.imap_id_retain = FALSE,
+ .imap4rev2_enable = FALSE,
};
static const struct setting_keyvalue imap_login_default_settings_keyvalue[] = {
{"service/imap-login/imap_capability/IMAP4rev1", "yes"},
+ {"service/imap-login/imap_capability/IMAP4rev2", "yes"},
{"service/imap-login/imap_capability/LOGIN-REFERRALS", "yes"},
{"service/imap-login/imap_capability/ID", "yes"},
{"service/imap-login/imap_capability/ENABLE", "yes"},
ARRAY_TYPE(const_string) imap_id_send;
bool imap_literal_minus;
bool imap_id_retain;
+ bool imap4rev2_enable;
};
extern const struct setting_parser_info imap_login_setting_parser_info;
unsigned int imap_feature_condstore = UINT_MAX;
unsigned int imap_feature_qresync = UINT_MAX;
unsigned int imap_feature_utf8accept = UINT_MAX;
+unsigned int imap_feature_imap4rev2 = UINT_MAX;
static const char *client_command_state_names[] = {
"wait-input",
imap_unset_capability(set_instance, "METADATA");
if (!client->set->mail_utf8_extensions)
imap_unset_capability(set_instance, "UTF8=ACCEPT");
+ if (!client->set->imap4rev2_enable)
+ imap_unset_capability(set_instance, "IMAP4rev2");
const struct imap_settings *modified_set;
if (settings_get(client->user->event, &imap_setting_parser_info,
}
#endif
+#ifdef EXPERIMENTAL_IMAP4REV2
+static bool imap_client_enable_imap4rev2(struct client *client)
+{
+ if (!client->set->imap4rev2_enable) {
+ e_debug(client->event, "Client attempted to enable IMAP4rev2 while it's disabled on the server.");
+ return FALSE;
+ }
+
+ if (client->mailbox != NULL)
+ mailbox_enable(client->mailbox, MAILBOX_FEATURE_IMAP4REV2);
+ return TRUE;
+}
+#endif
+
enum mailbox_feature client_enabled_mailbox_features(struct client *client)
{
enum mailbox_feature mailbox_features = 0;
imap_feature_register("UTF8=ACCEPT", MAILBOX_FEATURE_UTF8ACCEPT,
imap_client_enable_utf8accept);
#endif
+#ifdef EXPERIMENTAL_IMAP4REV2
+ imap_feature_imap4rev2 =
+ imap_feature_register("IMAP4rev2", MAILBOX_FEATURE_UTF8ACCEPT,
+ imap_client_enable_imap4rev2);
+
+#endif
}
void client_kick(struct client *client, bool shutdown)
DEF(BOOL, imap_metadata),
DEF(BOOL, imap_literal_minus),
DEF(BOOL, mail_utf8_extensions),
+ DEF(BOOL, imap4rev2_enable),
#ifdef BUILD_IMAP_HIBERNATE
DEF(TIME, imap_hibernate_timeout),
#endif
.imap_metadata = FALSE,
.imap_literal_minus = FALSE,
.mail_utf8_extensions = FALSE,
+ .imap4rev2_enable = FALSE,
#ifdef DOVECOT_PRO_EDITION
.imap_hibernate_timeout = 30,
#else
static const struct setting_keyvalue imap_default_settings_keyvalue[] = {
{ "service/imap/imap_capability/IMAP4rev1", "yes" },
+ { "service/imap/imap_capability/IMAP4rev2", "yes" },
{ "service/imap/imap_capability/SASL-IR", "yes" },
{ "service/imap/imap_capability/LOGIN-REFERRALS", "yes" },
{ "service/imap/imap_capability/ID", "yes" },
return FALSE;
}
#endif
+#ifndef EXPERIMENTAL_IMAP4REV2
+ if (set->imap4rev2_enable) {
+ *error_r = "Dovecot not built with --enable-experimental-imap4rev2.";
+ return FALSE;
+ }
+#endif
if (imap_settings_parse_workarounds(set, error_r) < 0)
return FALSE;
const char *imap_fetch_failure;
bool imap_metadata;
bool imap_literal_minus;
+ bool imap4rev2_enable;
bool mail_utf8_extensions;
unsigned int imap_hibernate_timeout;
ARRAY_TYPE(const_string) imap_id_send;
/* Enable tracking modsequences */
MAILBOX_FEATURE_CONDSTORE = 0x01,
MAILBOX_FEATURE_UTF8ACCEPT = 0x02,
+ MAILBOX_FEATURE_IMAP4REV2 = 0x04,
};
enum mailbox_existence {
#endif
#ifdef DOVECOT_PRO_EDITION
" pro"
+#endif
+#ifdef EXPERIMENTAL_IMAP4REV2
+ " experimental-imap4rev2"
#endif
" openssl"
" io_block_size=%u"