hi,
i'm not sure if i've discovered a bug or if i'm not following the IMAP specs correctly. observations: { echo -en "a1 login foo bar\r\na2 notify set (subscribed (FlagChange SubscriptionChange MessageNew MessageExpunge))\r\n"; cat - } | openssl s_client -connect [my_dovecot_server]:993 produces the following output (aside from the openssl s_client cert-inspection stuff): 2020-06-21 12:26:02 * OK [CAPABILITY IMAP4rev1 SASL-IR LOGIN-REFERRALS ID ENABLE IDLE LITERAL+ AUTH=PLAIN AUTH=LOGIN] Dovecot (Debian) ready. 2020-06-21 12:26:02 a1 OK [CAPABILITY IMAP4rev1 SASL-IR LOGIN-REFERRALS ID ENABLE IDLE SORT SORT=DISPLAY THREAD=REFERENCES THREAD=REFS THREAD=ORDEREDSUBJECT MULTIAPPEND URL-PARTIAL CATENATE UNSELECT CHILDREN NAMESPACE UIDPLUS LIST-EXTENDED I18NLEVEL=1 CONDSTORE QRESYNC ESEARCH ESORT SEARCHRES WITHIN CONTEXT=SEARCH LIST-STATUS BINARY MOVE SNIPPET=FUZZY LITERAL+ NOTIFY SPECIAL-USE] Logged in 2020-06-21 12:26:02 a2 OK NOTIFY completed (0.005 + 0.000 + 0.004 secs). 2020-06-21 12:26:02 a2 OK NOTIFY completed (0.002 + 0.000 + 0.001 secs). the first line is the pre-login welcome prompt, the second one the result of the "a1 login .." command and the third and fourth seem to be the answer to the "a2 notify set .." command, twice. from the different timings given, it seems the a2 command is actually executed twice. is this a case of "you're not allowed to pipeline commands like this" or a bug in dovecot (or both)? i attached the output of `dovecot -n`. best, dario
# dovecot -n # 2.3.4.1 (f79e8e7e4): /etc/dovecot/dovecot.conf # Pigeonhole version 0.5.4 () # OS: Linux 4.19.0-6-amd64 x86_64 Debian 10.4 # Hostname: hetzner.deaktualisierung.org doveconf: Warning: please set ssl_dh=</etc/dovecot/dh.pem doveconf: Warning: You can generate it with: dd if=/var/lib/dovecot/ssl-parameters.dat bs=1 skip=88 | openssl dhparam -inform der > /etc/dovecot/dh.pem auth_mechanisms = plain login auth_username_format = %n mail_home = /mail/%u mail_location = Maildir:~/mail mail_log_prefix = "%s(%u): " namespace inbox { inbox = yes list = yes location = mailbox Drafts { auto = subscribe special_use = \Drafts } mailbox Junk { auto = subscribe special_use = \Junk } mailbox Sent { auto = subscribe special_use = \Sent } mailbox "Sent Messages" { auto = subscribe special_use = \Sent } mailbox trash { auto = subscribe special_use = \Trash } prefix = separator = . subscriptions = yes type = private } passdb { args = scheme=SHA256-CRYPT username_format=%n /etc/dovecot/users driver = passwd-file } plugin { imapsieve_mailbox1_before = file:/etc/dovecot/sieve/report-spam.sieve imapsieve_mailbox1_causes = COPY imapsieve_mailbox1_name = Junk imapsieve_mailbox2_before = file:/etc/dovecot/sieve/report-ham.sieve imapsieve_mailbox2_causes = COPY imapsieve_mailbox2_from = Junk imapsieve_mailbox2_name = * mail_log_events = delete undelete expunge copy mailbox_delete mailbox_rename mail_log_fields = uid box msgid size sieve = file:~/.dovecot.sieve sieve_global_extensions = +vnd.dovecot.pipe +vnd.dovecot.debug sieve_pipe_bin_dir = /etc/dovecot/sieve/bin sieve_plugins = sieve_imapsieve sieve_extprograms sieve_user_log = ~/.dovecot.sieve.log } protocols = " imap lmtp" service auth { unix_listener /var/spool/postfix/private/auth { group = postfix mode = 0660 user = postfix } } service imap-login { inet_listener imaps { port = 993 ssl = yes } process_min_avail = 0 service_count = 1 } service imap { process_limit = 128 } service lmtp { unix_listener /var/spool/postfix/private/dovecot-lmtp { group = postfix mode = 0600 user = postfix } } ssl_cert = </etc/dovecot/letsencrypt-ssl-cert-and-key.pem ssl_cipher_list = EDH+CAMELLIA:EDH+aRSA:EECDH+aRSA+AESGCM:EECDH+aRSA+SHA384:EECDH+aRSA+SHA256:EECDH:+CAMELLIA256:+AES256:+CAMELLIA128:+AES128:+SSLv3:!aNULL:!eNULL:!LOW:-3DES:!MD5:!EXP:!PSK:!DSS:!RC4:!SEED:!ECDSA:CAMELLIA256-SHA:AES256-SHA:CAMELLIA128-SHA:AES128-SHA:EDH-RSA-DES-CBC3-SHA:DES-CBC3-SHA ssl_dh = # hidden, use -P to show it ssl_key = # hidden, use -P to show it userdb { args = username_format=%n /etc/dovecot/users default_fields = uid=vmail gid=vmail home=/mail/%u driver = passwd-file } protocol lmtp { mail_plugins = " sieve fts fts_lucene" plugin { fts = lucene fts_autoindex = yes } } protocol imap { imap_client_workarounds = tb-extra-mailbox-sep tb-lsub-flags imap_idle_notify_interval = 2 mins mail_max_userip_connections = 100 mail_plugins = " fts fts_lucene imap_sieve" }