История изменений
Исправление firkax, (текущая версия) :
Это такая штука для «безопасности». Все строки, полученные по сети от посторонних хостов, считаются потенциально вредоносными (tainted). Если ты используешь tainted строку в каком-то выражении - результат тоже tainted. tainted строки нельзя использовать в качестве каких-либо путей в файловой системе. Сообщить exim-у «я знаю что эта переменная взята из сети, но я сделал все нужные проверки и уверен что она безопасная» невозможно.
Ругается он у тебя не на $local_part а на $domain (до $local_part видимо не успел дойти).
Способов обхода два:
1) тупо склонировать строку, но так чтобы exim это не понял, способа в целом примерно два:
$domain
-> ${perl{untaint}{$domain}}
$domain
-> ${run{/bin/echo ${quote:$domain}}{$value}}
(я их не проверял, ни первый ни второй, они костыльные и некрасивые, кроме того для первого нужен какой-то перл-модуль к exim-у которого дефолтно нет, а второй создаёт лишние процессы чтобы копировать строки)
2) честно «вычислять» безопасные строки с помощью поиска (lsearch) по файлам-таблицам сначала доменов а потом юзеров доменов (или можно сделать одну плоскую таблицу всех юзеров на всех доменах)
$domain_data и $local_part_data - это не просто «безопасные клоны» $domain и $local_part, а какая-то весьма муть. Чтобы их заполнить (иначе они пустые), нужно использовать директивы domains (для первого) и local_parts/check_local_user (для второго). При этом check_local_user проверяешь $local_part в системных таблицах типа /etc/passwd, так что он обычно не годится.
https://exim.org/exim-html-current/doc/html/spec_html/ch-generic_options_for_...
domains Use: routers‡ Type: domain list† Default: unset
If this option is set, the router is skipped unless the current domain matches the list. If the match is achieved by means of a file lookup, the data that the lookup returned for the domain is placed in $domain_data for use in string expansions of the driver’s private options and in the transport. See section 3.12 for a list of the order in which preconditions are evaluated.
local_parts Use: routers‡ Type: local part list† Default: unset
The router is run only if the local part of the address matches the list. See section 3.12 for a list of the order in which preconditions are evaluated, and section 10.22 for a discussion of local part lists. Because the string is expanded, it is possible to make it depend on the domain, for example:
local_parts = dbm;/usr/local/specials/$domain_data
If the match is achieved by a lookup, the data that the lookup returned for the local part is placed in the variable $local_part_data for use in expansions of the router’s private options or in the transport. You might use this option, for example, if you have a large number of local virtual domains, and you want to send all postmaster mail to the same place without having to set up an alias in each virtual domain:
postmaster:
driver = redirect
local_parts = postmaster
data = postmaster@real.domain.example
Описания этих опций, как и весь остальной мануал по exim-у, чрезвычайно мутные, но при желании можно разобраться.
Исправление firkax, :
Это такая штука для «безопасности». Все строки, полученные по сети от посторонних хостов, считаются потенциально вредоносными (tainted). Если ты используешь tainted строку в каком-то выражении - результат тоже tainted. tainted строки нельзя использовать в качестве каких-либо путей в файловой системе. Сообщить exim-у «я знаю что эта переменная взята из сети, но я сделал все нужные проверки и уверен что она безопасная» невозможно.
Ругается он у тебя не на $local_part а на $domain (до $local_part видимо не успел дойти).
Способов обхода два:
1) тупо склонировать строку, но так чтобы exim это не понял, способа в целом примерно два:
$domain
-> ${perl{untaint}{$domain}}
$domain
-> ${run{/bin/echo $local_part}{$value}}
(я их не проверял, ни первый ни второй, они костыльные и некрасивые, кроме того для первого нужен какой-то перл-модуль к exim-у которого дефолтно нет, а второй создаёт лишние процессы чтобы копировать строки)
2) честно «вычислять» безопасные строки с помощью поиска (lsearch) по файлам-таблицам сначала доменов а потом юзеров доменов (или можно сделать одну плоскую таблицу всех юзеров на всех доменах)
$domain_data и $local_part_data - это не просто «безопасные клоны» $domain и $local_part, а какая-то весьма муть. Чтобы их заполнить (иначе они пустые), нужно использовать директивы domains (для первого) и local_parts/check_local_user (для второго). При этом check_local_user проверяешь $local_part в системных таблицах типа /etc/passwd, так что он обычно не годится.
https://exim.org/exim-html-current/doc/html/spec_html/ch-generic_options_for_...
domains Use: routers‡ Type: domain list† Default: unset
If this option is set, the router is skipped unless the current domain matches the list. If the match is achieved by means of a file lookup, the data that the lookup returned for the domain is placed in $domain_data for use in string expansions of the driver’s private options and in the transport. See section 3.12 for a list of the order in which preconditions are evaluated.
local_parts Use: routers‡ Type: local part list† Default: unset
The router is run only if the local part of the address matches the list. See section 3.12 for a list of the order in which preconditions are evaluated, and section 10.22 for a discussion of local part lists. Because the string is expanded, it is possible to make it depend on the domain, for example:
local_parts = dbm;/usr/local/specials/$domain_data
If the match is achieved by a lookup, the data that the lookup returned for the local part is placed in the variable $local_part_data for use in expansions of the router’s private options or in the transport. You might use this option, for example, if you have a large number of local virtual domains, and you want to send all postmaster mail to the same place without having to set up an alias in each virtual domain:
postmaster:
driver = redirect
local_parts = postmaster
data = postmaster@real.domain.example
Описания этих опций, как и весь остальной мануал по exim-у, чрезвычайно мутные, но при желании можно разобраться.
Исходная версия firkax, :
Это такая штука для «безопасности». Все строки, полученные по сети от посторонних хостов, считаются потенциально вредоносными (tainted). Если ты используешь tainted строку в каком-то выражении - результат тоже tainted. tainted строки нельзя использовать в качестве каких-либо путей в файловой системе. Сообщить exim-у «я знаю что эта переменная взята из сети, но я сделал все нужные проверки и уверен что она безопасная» невозможно.
Ругается он у тебя не на $local_part а на $domain (до $local_part видимо не успел дойти).
Способов обхода два:
1) тупо склонировать строку, но так чтобы exim это не понял, способа в целом примерно два:
$domain
-> ${perl{untaint}{$domain}}
$domain
-> ${run{/bin/echo $local_part}{$value}}
(я их не проверял, ни первый ни второй, они костыльные и некрасивые, кроме того для первого нужен какой-то перл-модуль к exim-у которого дефолтно нет, а второй создаёт лишние процессы чтобы копировать строки)
2) честно «вычислять» безопасные строки с помощью поиска (lsearch) по файлам-таблицам сначала доменов а потом юзеров доменов (или можно сделать одну плоскую таблицу всех юзеров на всех доменах)
$domain_data и $local_part_data - это не просто «безопасные клоны» $domain и $local_part, а какая-то весьма муть. Чтобы их заполнить (иначе они пустые), нужно использовать директивы domains (для первого) и local_parts/check_local_user (для второго). При этом check_local_user проверяешь $local_part в системных таблицах типа /etc/passwd, так что он обычно не годится.
https://exim.org/exim-html-current/doc/html/spec_html/ch-generic_options_for_...
domains Use: routers‡ Type: domain list† Default: unset
If this option is set, the router is skipped unless the current domain matches the list. If the match is achieved by means of a file lookup, the data that the lookup returned for the domain is placed in $domain_data for use in string expansions of the driver’s private options and in the transport. See section 3.12 for a list of the order in which preconditions are evaluated.
local_parts Use: routers‡ Type: local part list† Default: unset
The router is run only if the local part of the address matches the list. See section 3.12 for a list of the order in which preconditions are evaluated, and section 10.22 for a discussion of local part lists. Because the string is expanded, it is possible to make it depend on the domain, for example:
local_parts = dbm;/usr/local/specials/$domain_data
If the match is achieved by a lookup, the data that the lookup returned for the local part is placed in the variable $local_part_data for use in expansions of the router’s private options or in the transport. You might use this option, for example, if you have a large number of local virtual domains, and you want to send all postmaster mail to the same place without having to set up an alias in each virtual domain:
postmaster:
driver = redirect
local_parts = postmaster
data = postmaster@real.domain.example