For the ML archives, I just wanted to document what I had to do to get authentication working where the username and domain are stored in two seperate tables linked by foreign keys. On my servers, I have an email table and a domain table linked with a foreign key, with data as below. Additionally, to login to our system, there is a user table which holds an md5 crypt hashed password that is linked with a foreign key. On a normal account, the email username 'info' with domain 'example.org' has a real user account named 'i...@domain.org'. My original query expected that. However in the special case shown below, the user account is named something totally different, "bigtreehouse". That causes a problem because the user account name doesn't match the full email address, so PLAIN ($auth2) and LOGIN ($auth1) email addresses don't equal what's in the database. So I modified the query to split the username and domain parts of the email address and query directly on that.
Here is some sample data to visualize this: domain table: id, name values: 13091, example.org email table: id, name, domain_id values: 45508, info, 13091 user table: id, name, password, email_id values: 83001, bigtreehouse, $1$l51C7d7h$AjwikCnRyHYqq1umMWgXZ0, 45508 (md5 crypted hash of "password") I apologize in advance for how badly the following lines are going to be wrapped. Pay attention to the long query line that will probably get wrapped 3 or 4 times. If the password is stored in the user table (my configuration), the auth configurations are: plain: driver = plaintext public_name = PLAIN server_prompts = : server_condition = ${if and { \ {!eq{$auth2}{}} \ {!eq{$auth3}{}} \ { crypteq{$auth3}{\{crypt\}${lookup mysql{SELECT u.password FROM user u JOIN email e ON u.email_id=e.id JOIN domain d ON e.domain_id=d.id WHERE e.name=substring_index('${quote_mysql:$auth2}','@',1) AND d.name=substring_index('${quote_mysql:$auth2}','@',-1) AND e.active=1 and d.active=1;}{$value}fail}} } \ } {1}{0}} server_set_id = $auth2 login: driver = plaintext public_name = LOGIN server_prompts = Username:: : Password:: server_condition = ${if and { \ {!eq{$auth1}{}} \ {!eq{$auth2}{}} \ { crypteq{$auth2}{\{crypt\}${lookup mysql{SELECT u.password FROM user u JOIN email e ON u.email_id=e.id JOIN domain d ON e.domain_id=d.id WHERE e.name=substring_index('${quote_mysql:$auth1}','@',1) AND d.name=substring_index('${quote_mysql:$auth1}','@',-1) AND e.active=1 and d.active=1;}{$value}fail}} } \ } {1}{0}} server_set_id = $auth1 If the password was only stored in the email table (i.e. user table doesn't exist is isn't related to the mailboxes) the auth configurations are: plain: driver = plaintext public_name = PLAIN server_prompts = : server_condition = ${if and { \ {!eq{$auth2}{}} \ {!eq{$auth3}{}} \ { crypteq{$auth3}{\{crypt\}${lookup mysql{SELECT e.password FROM email e JOIN domain d ON e.domain_id=d.id WHERE e.name=substring_index('${quote_mysql:$auth2}','@',1) AND d.name=substring_index('${quote_mysql:$auth2}','@',-1) AND e.active=1 and d.active=1;}{$value}fail}} } \ } {1}{0}} server_set_id = $auth2 login: driver = plaintext public_name = LOGIN server_prompts = Username:: : Password:: server_condition = ${if and { \ {!eq{$auth1}{}} \ {!eq{$auth2}{}} \ { crypteq{$auth2}{\{crypt\}${lookup mysql{SELECT e.password FROM email e JOIN domain d ON e.domain_id=d.id WHERE e.name=substring_index('${quote_mysql:$auth1}','@',1) AND d.name=substring_index('${quote_mysql:$auth1}','@',-1) AND e.active=1 and d.active=1;}{$value}fail}} } \ } {1}{0}} server_set_id = $auth1 Hopefully this will help someone down the road who has a similar issue. -- Regards... Todd I seek the truth...it is only persistence in self-delusion and ignorance that does harm. -- Marcus Aurealius -- ## List details at http://lists.exim.org/mailman/listinfo/exim-users ## Exim details at http://www.exim.org/ ## Please use the Wiki with this list - http://wiki.exim.org/