[Exim-users] Проверка квоты ящика.

49 views
Skip to first unread message

Volodymyr Rybak

unread,
Apr 11, 2021, 1:29:46 PM4/11/21
to exim-...@mailground.net
Здравствуйте.
Была рабочая схема проверка квоты ящика на этапе rcpt to: Работала до обновления exim 4.94

configure:

GET_QUOTA=${lookup mysql{SELECT quota FROM mailbox \
        WHERE username='${local_part}'}{${value}M}}
MAILDIR_SIZE=${eval:${sg{${sg{${readfile{/var/mail/exim/$local_part/maildirsize}{\n}}}{\N^.+?\n\N}{}}}{\N(?s)\s+-?\d+\n\N}{+}}0+600K}

begin routers

virtual_user_quota_defer:
    driver          = redirect
    domains         = +local_domains
    condition       = ${if and{\
                       {exists{/var/mail/exim/$local_part}}\
                       {exists{/var/mail/exim/$local_part/maildirsize}}\
                       {>{GET_QUOTA}{0}}\
                       {>={MAILDIR_SIZE}{GET_QUOTA}}\
                      } }
    data            = :fail: Over quota!
    verify_sender = false
    allow_fail

Сыплет в лог ошибки, изменения прав на файл не помогает.

Tainted filename '/var/mail/exim/USER/maildirsize'
failed to expand condition "${if and{{exists{/var/mail/exim/$local_part}}{exists{/var/mail/exim/$local_part/maildirsize}}{>{${lookup mysql{SELECT quota FROM mailbox WHERE username='${local_part}'}{${value}M}}}{0}}{>={${eval:${sg{${sg{${readfile{/var/mail/exim/$local_part/maildirsize}{\n}}}{\N^.+?\n\N}{}}}{\N(?s)\s+-?\d+\n\N}{+}}0+600K}}{${lookup mysql{SELECT quota FROM mailbox WHERE username='${local_part}'}{${value}M}}}}} }" for virtual_user_quota_defer router: failed to open /var/mail/exim/USER/maildirsize: Permission denied (euid=26 egid=6) inside "and{...}" condition


Не подскажете, что нужно изменить, чтоб схема заработала?
Спасибо.

Alexander Sheiko

unread,
Apr 11, 2021, 5:42:15 PM4/11/21
to Exim MTA на русском
2021-04-11 12:35 GMT+03:00, Volodymyr Rybak <vo...@rybak.kiev.ua>:

> Не подскажете, что нужно изменить, чтоб схема заработала?

Вести квоты через Dovecot в базе и смотреть их Exim-ом уже там. Я
тоже, при смене версии, хотел как-то это чинить, потом забил и выбрал
более прямой путь.

P.S. Сервис рассылки периодически отбивает письма, отправленные с
серверов Гугла - не знаю, дойдёт ли в рассылку.

--
Alexander Sheiko
_______________________________________________
Exim-users mailing list
Exim-...@mailground.net
http://mailground.net/mailman/listinfo/exim-users

Viktor Cheburkin

unread,
Apr 12, 2021, 4:38:34 AM4/12/21
to Exim MTA на русском
Hi!

11 апр. 2021 г., в 12:35, Volodymyr Rybak <vo...@rybak.kiev.ua> написал(а):

$local_part поменять на $local_part_data?

Спасибо.
_______________________________________________
Exim-users mailing list
Exim-...@mailground.net
http://mailground.net/mailman/listinfo/exim-users


-- 
Viktor Cheburkin
VC319-RIPE, VC1-UANIC

Volodymyr Rybak

unread,
Apr 12, 2021, 6:11:03 AM4/12/21
to Exim MTA на русском
Hello.
Поменял в этих блоках, ошибок в логе нет, но и не работает.

пн, 12 квіт. 2021 о 11:39 Viktor Cheburkin <v...@vc.org.ua> пише:

Viktor Cheburkin

unread,
Apr 12, 2021, 8:32:02 AM4/12/21
to Exim MTA на русском
Hi!

12 апр. 2021 г., в 13:10, Volodymyr Rybak <vo...@rybak.kiev.ua> написал(а):

Hello.
Поменял в этих блоках, ошибок в логе нет, но и не работает.

Тогда воспользуйтесь debug_print, чтобы проверить как формируется запрос в базу. Надеюсь, что права на весь путь к файлам корректные.
debug_print можно вставить перед condition. С $local_part и $local_part_data есть моменты, когда работает одно, когда другое.

Le...@lena.kiev.ua

unread,
Apr 12, 2021, 8:52:30 AM4/12/21
to Exim MTA на русском
> >> condition = ${if and{\
> >> {exists{/var/mail/exim/$local_part}}\
> >> {exists{/var/mail/exim/$local_part/maildirsize}}\
> >> {>{GET_QUOTA}{0}}\
> >> {>={MAILDIR_SIZE}{GET_QUOTA}}\
> >> } }

> >> Tainted filename '/var/mail/exim/USER/maildirsize'

> > $local_part поменять на $local_part_data?

Чтобы заполнялась переменная $local_part_data,
перед этим проверка существования пользователя должна быть не по exists,
а по check_local_user
или поиском:

local_parts = dsearch;/var/mail/exim

Сообщение о permissions в данном случае вводит в заблуждение.
Проблема не в permissions, а в taint.

А вот как мне быть, если у меня поиск в файле не по $domain
и не по $local_part, а по полному email адресу $domain@$local_part,
я не еще не придумала.

Viktor Cheburkin

unread,
Apr 12, 2021, 8:58:33 AM4/12/21
to Exim MTA на русском
Hi!

12 апр. 2021 г., в 15:51, Le...@lena.kiev.ua написал(а):

   condition       = ${if and{\
                      {exists{/var/mail/exim/$local_part}}\
                      {exists{/var/mail/exim/$local_part/maildirsize}}\
                      {>{GET_QUOTA}{0}}\
                      {>={MAILDIR_SIZE}{GET_QUOTA}}\
                     } }

Tainted filename '/var/mail/exim/USER/maildirsize'

$local_part поменять на $local_part_data?

Чтобы заполнялась переменная $local_part_data,
перед этим проверка существования пользователя должна быть не по exists,
а по check_local_user
или поиском:

 local_parts = dsearch;/var/mail/exim

Сообщение о permissions в данном случае вводит в заблуждение.
Проблема не в permissions, а в taint.

А вот как мне быть, если у меня поиск в файле не по $domain
и не по $local_part, а по полному email адресу $domain@$local_part,
я не еще не придумала.

Я использовал ${sha1:${lc:${domain:$h_from:}}} для ключей dkim, но это может быть несколько неудобно.

_______________________________________________
Exim-users mailing list
Exim-...@mailground.net
http://mailground.net/mailman/listinfo/exim-users

Volodymyr Rybak

unread,
Apr 12, 2021, 11:08:38 AM4/12/21
to Exim MTA на русском
Добавил в роут 
local_parts     = dsearch;/var/mail/exim
Он уже срабатывает, но письмо всеравно полностью проходит, и формируется рикошет с текстом Over quota! , а не обрывается на этапе smtp.

пн, 12 квіт. 2021 о 15:58 Viktor Cheburkin <v...@vc.org.ua> пише:

Le...@lena.kiev.ua

unread,
Apr 12, 2021, 11:15:56 AM4/12/21
to Exim MTA на русском
> Добавил в роут
> local_parts = dsearch;/var/mail/exim
> Он уже срабатывает, но письмо всеравно полностью проходит, и формируется
> рикошет с текстом Over quota! , а не обрывается на этапе smtp.

Добавьте это в ACL вместо роутера.
Роутер выполняется по verify=recipient, а это наверно у вас позже.

Volodymyr Rybak

unread,
Apr 12, 2021, 11:51:01 AM4/12/21
to Exim MTA на русском
Добавил в acl_check_rcpt:
 deny    domains         = +local_domains
         local_parts     = dsearch;/var/mail/exim

         condition       = ${if and{\
                              {exists{/var/mail/exim/$local_part_data}}\
                              {exists{/var/mail/exim/$local_part_data/maildirsize}}\

                              {>{GET_QUOTA}{0}}\
                              {>={MAILDIR_SIZE}{GET_QUOTA}}\
                             } }
         message         = Over quota!

Все работает.
Спасибо.

пн, 12 квіт. 2021 о 18:16 <Le...@lena.kiev.ua> пише:
Reply all
Reply to author
Forward
0 new messages