dnl ** capabilities
dnl **
-capability="IMAP4rev1 SASL-IR SORT THREAD=REFERENCES MULTIAPPEND UNSELECT LITERAL+ IDLE CHILDREN NAMESPACE LOGIN-REFERRALS UIDPLUS LIST-EXTENDED I18NLEVEL=1 ENABLE CONDSTORE QRESYNC ESEARCH SEARCHRES WITHIN CONTEXT=SEARCH ID"
+capability_banner="IMAP4rev1 LITERAL+ SASL-IR LOGIN-REFERRALS ID"
+capability="$capability_banner SORT THREAD=REFERENCES MULTIAPPEND UNSELECT IDLE CHILDREN NAMESPACE UIDPLUS LIST-EXTENDED I18NLEVEL=1 ENABLE CONDSTORE QRESYNC ESEARCH SEARCHRES WITHIN CONTEXT=SEARCH"
AC_DEFINE_UNQUOTED(CAPABILITY_STRING, "$capability", IMAP capabilities)
+AC_DEFINE_UNQUOTED(CAPABILITY_BANNER_STRING, "$capability_banner", IMAP capabilities advertised in banner)
CFLAGS="$CFLAGS $EXTRA_CFLAGS"
break;
}
- client_send_tagline(client, "OK Logged in.");
+ if (client->full_capability_sent)
+ client_send_tagline(client, "OK Logged in.");
+ else {
+ client_send_tagline(client, t_strdup_printf(
+ "OK [CAPABILITY %s] Logged in.",
+ capability_string));
+ }
client_destroy_success(client, "Login");
break;
case SASL_SERVER_REPLY_AUTH_FAILED:
return FALSE;
}
-static const char *get_capability(struct imap_client *client)
+static const char *get_capability(struct imap_client *client, bool full)
{
const char *auths;
auths = client_authenticate_get_capabilities(client->common.secured);
- return t_strconcat(capability_string,
+ return t_strconcat(full ? capability_string : CAPABILITY_BANNER_STRING,
(ssl_initialized && !client->common.tls) ?
" STARTTLS" : "",
disable_plaintext_auth && !client->common.secured ?
static int cmd_capability(struct imap_client *client)
{
- client_send_line(client, t_strconcat("* CAPABILITY ",
- get_capability(client), NULL));
+ client->full_capability_sent = TRUE;
+ client_send_line(client, t_strconcat(
+ "* CAPABILITY ", get_capability(client, TRUE), NULL));
client_send_tagline(client, "OK Capability completed.");
return 1;
}
greet = t_str_new(128);
str_append(greet, "* OK ");
- if (greeting_capability) {
- i_assert(auth_client_is_connected(auth_client));
- str_printfa(greet, "[CAPABILITY %s] ", get_capability(client));
- }
+ str_printfa(greet, "[CAPABILITY %s] ", get_capability(client, FALSE));
str_append(greet, greeting);
client_send_line(client, str_c(greet));
main_ref();
- if (!greeting_capability || auth_client_is_connected(auth_client))
+ if (auth_client_is_connected(auth_client))
client_send_greeting(client);
else
client_set_auth_waiting(client);
unsigned int destroyed:1;
unsigned int greeting_sent:1;
unsigned int id_logged:1;
+ unsigned int full_capability_sent:1;
};
void client_destroy(struct imap_client *client, const char *reason);
extern const char *login_protocol;
-extern bool disable_plaintext_auth, process_per_connection, greeting_capability;
+extern bool disable_plaintext_auth, process_per_connection;
extern bool verbose_proctitle, verbose_ssl, verbose_auth;
extern const char *greeting, *log_format;
extern const char *const *log_format_elements;
#include <unistd.h>
#include <syslog.h>
-bool disable_plaintext_auth, process_per_connection, greeting_capability;
+bool disable_plaintext_auth, process_per_connection;
bool verbose_proctitle, verbose_ssl, verbose_auth;
const char *greeting, *log_format;
const char *const *log_format_elements;
greeting = getenv("GREETING");
if (greeting == NULL)
greeting = PACKAGE" ready.";
- greeting_capability = getenv("GREETING_CAPABILITY") != NULL;
value = getenv("LOG_FORMAT_ELEMENTS");
if (value == NULL)
env_put(t_strconcat("LOG_FORMAT=", set->login_log_format, NULL));
env_put(t_strconcat("IMAP_ID_SEND=", set->imap_id_send, NULL));
env_put(t_strconcat("IMAP_ID_LOG=", set->imap_id_log, NULL));
- if (set->login_greeting_capability)
- env_put("GREETING_CAPABILITY=1");
if (group->mail_process_type == PROCESS_TYPE_IMAP) {
env_put(t_strconcat("CAPABILITY_STRING=",
DEF_BOOL(login_process_per_connection),
DEF_BOOL(login_chroot),
- DEF_BOOL(login_greeting_capability),
DEF_STR(login_trusted_networks),
DEF_INT(login_process_size),
MEMBER(login_process_per_connection) TRUE,
MEMBER(login_chroot) TRUE,
- MEMBER(login_greeting_capability) FALSE,
MEMBER(login_trusted_networks) "",
MEMBER(login_process_size) 64,
bool login_process_per_connection;
bool login_chroot;
- bool login_greeting_capability;
const char *login_trusted_networks;
unsigned int login_process_size;