commands.c revision 4afd50dff16661684ad2acddad7284bcd8c564db
bcb4e51a409d94ae670de96afb8483a4f7855294Stephan Bosch/* Copyright (c) 2009-2010 Dovecot authors, see the included COPYING file */
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen#define ERRSTR_TEMP_MAILBOX_FAIL "451 4.3.0 <%s> Temporary internal error"
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen#define ERRSTR_TEMP_USERDB_FAIL_PREFIX "451 4.3.0 <%s> "
5c2d695acf9f95ae0dcdda89c4d2391ceda4d672Timo Sirainen ERRSTR_TEMP_USERDB_FAIL_PREFIX "Temporary user lookup failure"
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen#define LMTP_PROXY_DEFAULT_TIMEOUT_MSECS (1000*30)
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainenint cmd_lhlo(struct client *client, const char *args)
5c2d695acf9f95ae0dcdda89c4d2391ceda4d672Timo Sirainen const char *p;
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen client_send_line(client, "501 Missing hostname");
5c2d695acf9f95ae0dcdda89c4d2391ceda4d672Timo Sirainen /* domain / address-literal */
20b2d47ed762ca2c009aa37e360af6f223ac71bdTimo Sirainen rfc822_parser_init(&parser, (const unsigned char *)args, strlen(args),
c2fbbf7515aa419dc8b2d62a3c2bb0471d51a391Timo Sirainen client_send_line(client, "250-%s", client->my_domain);
20b2d47ed762ca2c009aa37e360af6f223ac71bdTimo Sirainen client_send_line(client, "250-ENHANCEDSTATUSCODES");
20b2d47ed762ca2c009aa37e360af6f223ac71bdTimo Sirainen client->state.lhlo = p_strdup(client->state_pool, str_c(domain));
5c2d695acf9f95ae0dcdda89c4d2391ceda4d672Timo Sirainenint cmd_mail(struct client *client, const char *args)
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen unsigned int len;
5c2d695acf9f95ae0dcdda89c4d2391ceda4d672Timo Sirainen client_send_line(client, "503 5.5.1 MAIL already given");
5c2d695acf9f95ae0dcdda89c4d2391ceda4d672Timo Sirainen if (strncasecmp(addr, "FROM:<", 6) != 0 || addr[len-1] != '>') {
5c2d695acf9f95ae0dcdda89c4d2391ceda4d672Timo Sirainen client_send_line(client, "501 5.5.4 Invalid parameters");
5c2d695acf9f95ae0dcdda89c4d2391ceda4d672Timo Sirainen else if (strcasecmp(*argv, "BODY=8BITMIME") == 0)
5c2d695acf9f95ae0dcdda89c4d2391ceda4d672Timo Sirainen "501 5.5.4 Unsupported options");
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen p_strndup(client->state_pool, addr + 6, len - 7);
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen p_array_init(&client->state.rcpt_to, client->state_pool, 64);
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainenclient_proxy_rcpt_parse_fields(struct lmtp_proxy_settings *set,
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainen const char *const *args, const char **address)
1176124297af5c56e932c0863c6637ff21d8a0efTimo Sirainen /* changing the username */
0a1ec0f2a38370e8a073a60023b4365491947f6fTimo Sirainen /* just ignore it */
4fc52b7b25c3d3f42348903e0154840f8761f306Timo Sirainenclient_proxy_is_ourself(const struct client *client,
c4b376dd6e0c423006d7ac83a39253bcaf8e7c47Timo Sirainenstatic const char *
1176124297af5c56e932c0863c6637ff21d8a0efTimo Sirainenaddress_add_detail(struct client *client, const char *username,
c4b376dd6e0c423006d7ac83a39253bcaf8e7c47Timo Sirainen const char *delim = client->set->recipient_delimiter;
55058d5f50f7e53bb22df4fa6ae951c8001416abTimo Sirainen return t_strconcat(username, delim, detail, NULL);
1176124297af5c56e932c0863c6637ff21d8a0efTimo Sirainen return t_strconcat(username, delim, detail, domain, NULL);
55058d5f50f7e53bb22df4fa6ae951c8001416abTimo Sirainenstatic bool client_proxy_rcpt(struct client *client, const char *address,
55058d5f50f7e53bb22df4fa6ae951c8001416abTimo Sirainen const char *args, *const *fields, *errstr, *orig_username = username;
c4b376dd6e0c423006d7ac83a39253bcaf8e7c47Timo Sirainen mail_storage_service_init_settings(storage_service, &input);
c4b376dd6e0c423006d7ac83a39253bcaf8e7c47Timo Sirainen info.service = master_service_get_name(master_service);
d798962a54c5cda054d57a0cfc7e5f47dfa20f6eTimo Sirainen pool = pool_alloconly_create("auth lookup", 1024);
13d58f3be3356c68ad4f53781f69bc6fe5623700Timo Sirainen auth_conn = mail_storage_service_get_auth_conn(storage_service);
13d58f3be3356c68ad4f53781f69bc6fe5623700Timo Sirainen ret = auth_master_pass_lookup(auth_conn, username, &info,
d798962a54c5cda054d57a0cfc7e5f47dfa20f6eTimo Sirainen errstr = ret < 0 && fields[0] != NULL ? t_strdup(fields[0]) :
d798962a54c5cda054d57a0cfc7e5f47dfa20f6eTimo Sirainen t_strdup_printf(ERRSTR_TEMP_USERDB_FAIL, address);
d798962a54c5cda054d57a0cfc7e5f47dfa20f6eTimo Sirainen /* user not found from passdb. try userdb also. */
d798962a54c5cda054d57a0cfc7e5f47dfa20f6eTimo Sirainen set.timeout_msecs = LMTP_PROXY_DEFAULT_TIMEOUT_MSECS;
d798962a54c5cda054d57a0cfc7e5f47dfa20f6eTimo Sirainen if (!client_proxy_rcpt_parse_fields(&set, fields, &username)) {
d798962a54c5cda054d57a0cfc7e5f47dfa20f6eTimo Sirainen /* not proxying this user */
d798962a54c5cda054d57a0cfc7e5f47dfa20f6eTimo Sirainen /* username changed. change the address as well */
return TRUE;
address);
return TRUE;
return TRUE;
return name;
return name;
return name;
return name;
return name;
const char *p, *p2;
if (p != NULL) {
unsigned int len;
int ret = 0;
argv++;
address);
if (ret < 0) {
username);
if (ret == 0) {
void **sets;
int ret;
ret = 0;
return ret;
unsigned int count;
int ret;
src_mail);
if (ret == 0)
return TRUE;
return FALSE;
FALSE);
return cinput;
static const char *wanted_headers[] = {
0, headers_ctx);
if (seteuid(0) < 0)
if (old_uid == 0) {
if (seteuid(0) < 0)
if (timeout) {
const char *detail;
return ret;
int fd;
const unsigned char *data;
if (ret == 0)