Cyrus 3.0.4 - Over quota returns 550-Mailbox unknown

ellie timoney ellie at fastmail.com
Tue Nov 7 22:05:29 EST 2017


This is now merged, and will be in the next Cyrus release.  Thanks all!
Cheers,

ellie


On Fri, Nov 3, 2017, at 11:18 AM, Bron Gondwana wrote:
> I have created https://github.com/cyrusimap/cyrus-imapd/issues/2191 to
> track this.  Thanks for the patch!> 
> Cheers,
> 
> Bron.
> 
> 
> On Fri, 3 Nov 2017, at 00:38, Edda wrote:
>> Hi,
>> 
>> that's surprising and the same here.
>> 
>> I think there is a bug in imap/lmtpengine.c, function
>> process_recipient:>> 
>> verify_user returns the correct error code as we can see with
>> LOG_DEBUG>> "on":
>> 
>> Nov  2 14:10:50 popc lmtp[2092]: verify_user(test at sendmaid.org)
>> failed:>> Over quota
>> 
>> but this return code is not used in process_recipient
>> 
>> There we have:
>> [...]
>>     if (sl) {
>>         char *rcpt = xstrndup(addr, sl);
>>         mbname = mbname_from_recipient(rcpt, msg->ns);
>>         free(rcpt);
>> 
>>         int forcedowncase =
>>         config_getswitch(IMAPOPT_LMTP_DOWNCASE_RCPT);>>         if (forcedowncase) mbname_downcaseuser(mbname);
>> 
>>         /* strip username if postuser */
>>         if (!strcmpsafe(mbname_localpart(mbname),
>> config_getstring(IMAPOPT_POSTUSER))) {
>>             mbname_set_localpart(mbname, NULL);
>>             if (!config_virtdomains ||
>> !strcmpsafe(mbname_domain(mbname), config_defdomain))
>>                 mbname_set_domain(mbname, NULL);
>>         }
>> 
>>         if (verify_user(mbname,
>>                         (quota_t) (ignorequota ? -1 : msg->size),
>>                         ignorequota ? -1 : 1, msg->authstate)) {
>>             mbname_free(&mbname);
>>         }
>>     }
>> 
>>     if (!mbname) {
>>         const char *catchall =
>> config_getstring(IMAPOPT_LMTP_CATCHALL_MAILBOX);
>>         if (catchall) {
>>             mbname = mbname_from_userid(catchall);
>>             if (verify_user(mbname,
>>                             ignorequota ? -1 : msg->size,
>>                             ignorequota ? -1 : 1, msg->authstate)) {>>                 mbname_free(&mbname);
>>             }
>>         }
>>     }
>> 
>>     if (!mbname) {
>>         /* we lost */
>>         return IMAP_MAILBOX_NONEXISTENT;
>>     }
>> [...]
>> 
>> means as far as I understand: if verify_user returns its error (for
>> example IMAP_QUOTA_EXCEEDED), mbname is freed and process_recipient
>> always returns IMAP_MAILBOX_NONEXISTENT.
>> 
>> Below is a patch that works for me. But I don't know if this
>> is a good>> way to fix it.
>> Hopefully one of the developers helps :)
>> 
>> Regards, Edda
>> 
>> 
>> diff -Naur cyrus-imapd-3.0.4.orig/imap/lmtpengine.c
>> cyrus-imapd-3.0.4/imap/lmtpengine.c
>> --- cyrus-imapd-3.0.4.orig/imap/lmtpengine.c    2017-09-04
>> 02:09:46.000000000 +0200
>> +++ cyrus-imapd-3.0.4/imap/lmtpengine.c    2017-11-02
>> 13:59:56.764175245>> +0100
>> @@ -830,6 +830,7 @@
>>      }
>> 
>>      mbname_t *mbname = NULL;
>> +    int r = 0;
>> 
>>      size_t sl = strlen(addr);
>>      if (addr[sl-1] == '>') sl--;
>> @@ -849,7 +850,7 @@
>>                  mbname_set_domain(mbname, NULL);
>>          }
>> 
>> -        if (verify_user(mbname,
>> +        if (r = verify_user(mbname,
>>                          (quota_t) (ignorequota ? -1 : msg->size),
>>                          ignorequota ? -1 : 1, msg->authstate)) {
>>              mbname_free(&mbname);
>> @@ -860,7 +861,7 @@
>>          const char *catchall =
>> config_getstring(IMAPOPT_LMTP_CATCHALL_MAILBOX);
>>          if (catchall) {
>>              mbname = mbname_from_userid(catchall);
>> -            if (verify_user(mbname,
>> +            if (r = verify_user(mbname,
>>                              ignorequota ? -1 : msg->size,
>>                              ignorequota ? -1 : 1, msg->authstate)) {>>                  mbname_free(&mbname);
>> @@ -870,6 +871,9 @@
>> 
>>      if (!mbname) {
>>          /* we lost */
>> +    if (r) {
>> +        return r;
>> +        }
>>          return IMAP_MAILBOX_NONEXISTENT;
>>      }
>> 
>> 
>> 
>> Am 02.11.17 um 09:27 schrieb Maros Vegh:
>>> Hello,
>>> 
>>> i'm using compiled cyrus version 3.0.4 on Debian 9.2.
>>> 
>>> When the Postfix server is trying to deliver a message via lmtp to
>>> cyrus mailbox which is over quota, it receives the 550-Mailbox
>>> unknown>>> return code and not the 452 or 552 Over quota.
>>> 
>>> In the previous version 2.5.10 it worked fine with default values in>>> imapd.conf
>>> 
>>> Is it a bug or my fault?
>>> 
>>> Thanks
>>> 
>>> Maros Vegh
>>> 
>>> 
>> 
>> ----
>> Cyrus Home Page: http://www.cyrusimap.org/
>> List Archives/Info: http://lists.andrew.cmu.edu/pipermail/info-cyrus/>> To Unsubscribe:
>> https://lists.andrew.cmu.edu/mailman/listinfo/info-cyrus
> 
> --
>   Bron Gondwana, CEO, FastMail Pty Ltd
>   brong at fastmailteam.com
> 
> 
> ----
> Cyrus Home Page: http://www.cyrusimap.org/
> List Archives/Info: http://lists.andrew.cmu.edu/pipermail/info-cyrus/> To Unsubscribe:
> https://lists.andrew.cmu.edu/mailman/listinfo/info-cyrus

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.andrew.cmu.edu/pipermail/info-cyrus/attachments/20171108/aae7b625/attachment.html>


More information about the Info-cyrus mailing list