annotate src/lda/main.c @ 10509:50364f04cf13 HEAD

lib-storage: Changed mailbox_sync() and mailbox_sync_deinit() APIs. Although we're already in beta stage, this is simple enough of a change that it shouldn't matter much. Having syncing also return status information made the API ugly and the status information wasn't even wanted all that often.
author Timo Sirainen <tss@iki.fi>
date Wed, 16 Dec 2009 19:27:57 -0500
parents 28a14e2fe5d6
children 615eef3139c2
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
9092
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1 /* Copyright (c) 2005-2009 Dovecot authors, see the included COPYING file */
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3 #include "lib.h"
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
4 #include "lib-signals.h"
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
5 #include "env-util.h"
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
6 #include "fd-set-nonblock.h"
9370
8fa79cdb2ef3 istream-seekable: Changed API to use a callback function to create the temp file.
Timo Sirainen <tss@iki.fi>
parents: 9348
diff changeset
7 #include "close-keep-errno.h"
9092
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
8 #include "istream.h"
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
9 #include "istream-seekable.h"
10501
28a14e2fe5d6 Use t_abspath() instead of duplicating code.
Timo Sirainen <tss@iki.fi>
parents: 10308
diff changeset
10 #include "abspath.h"
9370
8fa79cdb2ef3 istream-seekable: Changed API to use a callback function to create the temp file.
Timo Sirainen <tss@iki.fi>
parents: 9348
diff changeset
11 #include "safe-mkstemp.h"
9372
b1c584654a0e lda: If temp file can't be created because home dir doesn't exist, create it.
timo@timo-desktop
parents: 9371
diff changeset
12 #include "eacces-error.h"
b1c584654a0e lda: If temp file can't be created because home dir doesn't exist, create it.
timo@timo-desktop
parents: 9371
diff changeset
13 #include "mkdir-parents.h"
9092
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
14 #include "str.h"
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
15 #include "str-sanitize.h"
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
16 #include "strescape.h"
10308
05d94015d0ef mail_deliver_save() now takes mailbox name as UTF-8 and internally converts to mUTF-7.
Timo Sirainen <tss@iki.fi>
parents: 10209
diff changeset
17 #include "unichar.h"
9092
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
18 #include "rfc822-parser.h"
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
19 #include "message-address.h"
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
20 #include "imap-utf7.h"
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
21 #include "settings-parser.h"
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
22 #include "master-service.h"
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
23 #include "master-service-settings.h"
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
24 #include "mail-storage-service.h"
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
25 #include "mail-namespace.h"
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
26 #include "raw-storage.h"
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
27 #include "mail-deliver.h"
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
28 #include "mail-send.h"
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
29 #include "mbox-from.h"
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
30 #include "lda-settings.h"
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
31
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
32 #include <stdio.h>
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
33 #include <stdlib.h>
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
34 #include <pwd.h>
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
35 #include <sysexits.h>
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
36
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
37 #define DEFAULT_ENVELOPE_SENDER "MAILER-DAEMON"
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
38
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
39 /* After buffer grows larger than this, create a temporary file to /tmp
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
40 where to read the mail. */
10209
b470c03b7164 lda: Removed accidentally committed debug change.
Timo Sirainen <tss@iki.fi>
parents: 10205
diff changeset
41 #define MAIL_MAX_MEMORY_BUFFER (1024*128)
9092
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
42
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
43 static const char *wanted_headers[] = {
9117
a9f61b63dc3d lmtp: Minor cleanup.
Timo Sirainen <tss@iki.fi>
parents: 9106
diff changeset
44 "From", "To", "Message-ID", "Subject", "Return-Path",
9092
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
45 NULL
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
46 };
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
47
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
48 static const char *escape_local_part(const char *local_part)
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
49 {
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
50 const char *p;
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
51
10058
b81f4a4076de lda: Escape local-part if it begins/ends with '.'.
Timo Sirainen <tss@iki.fi>
parents: 10036
diff changeset
52 /* if local_part isn't dot-atom-text, we need to return quoted-string
b81f4a4076de lda: Escape local-part if it begins/ends with '.'.
Timo Sirainen <tss@iki.fi>
parents: 10036
diff changeset
53 dot-atom-text = 1*atext *("." 1*atext) */
9092
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
54 for (p = local_part; *p != '\0'; p++) {
10058
b81f4a4076de lda: Escape local-part if it begins/ends with '.'.
Timo Sirainen <tss@iki.fi>
parents: 10036
diff changeset
55 if (!IS_ATEXT(*p) && *p != '.')
b81f4a4076de lda: Escape local-part if it begins/ends with '.'.
Timo Sirainen <tss@iki.fi>
parents: 10036
diff changeset
56 break;
9092
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
57 }
10058
b81f4a4076de lda: Escape local-part if it begins/ends with '.'.
Timo Sirainen <tss@iki.fi>
parents: 10036
diff changeset
58 if (*p != '\0' || *local_part == '.' ||
b81f4a4076de lda: Escape local-part if it begins/ends with '.'.
Timo Sirainen <tss@iki.fi>
parents: 10036
diff changeset
59 (p != local_part && p[-1] == '.'))
b81f4a4076de lda: Escape local-part if it begins/ends with '.'.
Timo Sirainen <tss@iki.fi>
parents: 10036
diff changeset
60 local_part = t_strdup_printf("\"%s\"", str_escape(local_part));
9092
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
61 return local_part;
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
62 }
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
63
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
64 static const char *address_sanitize(const char *address)
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
65 {
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
66 struct message_address *addr;
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
67 const char *ret, *mailbox;
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
68 pool_t pool;
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
69
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
70 pool = pool_alloconly_create("address sanitizer", 256);
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
71 addr = message_address_parse(pool, (const unsigned char *)address,
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
72 strlen(address), 1, FALSE);
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
73
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
74 if (addr == NULL || addr->mailbox == NULL || addr->domain == NULL ||
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
75 *addr->mailbox == '\0')
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
76 ret = DEFAULT_ENVELOPE_SENDER;
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
77 else {
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
78 mailbox = escape_local_part(addr->mailbox);
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
79 if (*addr->domain == '\0')
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
80 ret = t_strdup(mailbox);
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
81 else
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
82 ret = t_strdup_printf("%s@%s", mailbox, addr->domain);
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
83 }
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
84 pool_unref(&pool);
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
85 return ret;
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
86 }
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
87
9372
b1c584654a0e lda: If temp file can't be created because home dir doesn't exist, create it.
timo@timo-desktop
parents: 9371
diff changeset
88 static int deliver_create_dir(struct mail_user *user, const char *dir)
b1c584654a0e lda: If temp file can't be created because home dir doesn't exist, create it.
timo@timo-desktop
parents: 9371
diff changeset
89 {
b1c584654a0e lda: If temp file can't be created because home dir doesn't exist, create it.
timo@timo-desktop
parents: 9371
diff changeset
90 struct mail_namespace *ns;
9537
b373de4973cd Whenever file's group changing fails, show the group origin in the error message.
Timo Sirainen <tss@iki.fi>
parents: 9468
diff changeset
91 const char *origin;
9372
b1c584654a0e lda: If temp file can't be created because home dir doesn't exist, create it.
timo@timo-desktop
parents: 9371
diff changeset
92 mode_t mode;
b1c584654a0e lda: If temp file can't be created because home dir doesn't exist, create it.
timo@timo-desktop
parents: 9371
diff changeset
93 gid_t gid;
b1c584654a0e lda: If temp file can't be created because home dir doesn't exist, create it.
timo@timo-desktop
parents: 9371
diff changeset
94
b1c584654a0e lda: If temp file can't be created because home dir doesn't exist, create it.
timo@timo-desktop
parents: 9371
diff changeset
95 ns = mail_namespace_find_inbox(user->namespaces);
b1c584654a0e lda: If temp file can't be created because home dir doesn't exist, create it.
timo@timo-desktop
parents: 9371
diff changeset
96 if (ns == NULL)
b1c584654a0e lda: If temp file can't be created because home dir doesn't exist, create it.
timo@timo-desktop
parents: 9371
diff changeset
97 ns = user->namespaces;
b1c584654a0e lda: If temp file can't be created because home dir doesn't exist, create it.
timo@timo-desktop
parents: 9371
diff changeset
98
9537
b373de4973cd Whenever file's group changing fails, show the group origin in the error message.
Timo Sirainen <tss@iki.fi>
parents: 9468
diff changeset
99 mailbox_list_get_dir_permissions(ns->list, NULL, &mode, &gid, &origin);
b373de4973cd Whenever file's group changing fails, show the group origin in the error message.
Timo Sirainen <tss@iki.fi>
parents: 9468
diff changeset
100 if (mkdir_parents_chgrp(dir, mode, gid, origin) == 0) {
9372
b1c584654a0e lda: If temp file can't be created because home dir doesn't exist, create it.
timo@timo-desktop
parents: 9371
diff changeset
101 return 0;
b1c584654a0e lda: If temp file can't be created because home dir doesn't exist, create it.
timo@timo-desktop
parents: 9371
diff changeset
102 } else if (errno == EACCES) {
b1c584654a0e lda: If temp file can't be created because home dir doesn't exist, create it.
timo@timo-desktop
parents: 9371
diff changeset
103 i_error("%s", eacces_error_get_creating("mkdir_parents_chown",
b1c584654a0e lda: If temp file can't be created because home dir doesn't exist, create it.
timo@timo-desktop
parents: 9371
diff changeset
104 dir));
b1c584654a0e lda: If temp file can't be created because home dir doesn't exist, create it.
timo@timo-desktop
parents: 9371
diff changeset
105 return -1;
b1c584654a0e lda: If temp file can't be created because home dir doesn't exist, create it.
timo@timo-desktop
parents: 9371
diff changeset
106 } else {
b1c584654a0e lda: If temp file can't be created because home dir doesn't exist, create it.
timo@timo-desktop
parents: 9371
diff changeset
107 i_error("mkdir_parents_chown(%s, gid=%s) failed: %m",
b1c584654a0e lda: If temp file can't be created because home dir doesn't exist, create it.
timo@timo-desktop
parents: 9371
diff changeset
108 dir, dec2str(gid));
b1c584654a0e lda: If temp file can't be created because home dir doesn't exist, create it.
timo@timo-desktop
parents: 9371
diff changeset
109 return -1;
b1c584654a0e lda: If temp file can't be created because home dir doesn't exist, create it.
timo@timo-desktop
parents: 9371
diff changeset
110 }
b1c584654a0e lda: If temp file can't be created because home dir doesn't exist, create it.
timo@timo-desktop
parents: 9371
diff changeset
111 }
b1c584654a0e lda: If temp file can't be created because home dir doesn't exist, create it.
timo@timo-desktop
parents: 9371
diff changeset
112
9370
8fa79cdb2ef3 istream-seekable: Changed API to use a callback function to create the temp file.
Timo Sirainen <tss@iki.fi>
parents: 9348
diff changeset
113 static int seekable_fd_callback(const char **path_r, void *context)
8fa79cdb2ef3 istream-seekable: Changed API to use a callback function to create the temp file.
Timo Sirainen <tss@iki.fi>
parents: 9348
diff changeset
114 {
8fa79cdb2ef3 istream-seekable: Changed API to use a callback function to create the temp file.
Timo Sirainen <tss@iki.fi>
parents: 9348
diff changeset
115 struct mail_deliver_context *ctx = context;
9372
b1c584654a0e lda: If temp file can't be created because home dir doesn't exist, create it.
timo@timo-desktop
parents: 9371
diff changeset
116 const char *dir, *p;
9370
8fa79cdb2ef3 istream-seekable: Changed API to use a callback function to create the temp file.
Timo Sirainen <tss@iki.fi>
parents: 9348
diff changeset
117 string_t *path;
8fa79cdb2ef3 istream-seekable: Changed API to use a callback function to create the temp file.
Timo Sirainen <tss@iki.fi>
parents: 9348
diff changeset
118 int fd;
8fa79cdb2ef3 istream-seekable: Changed API to use a callback function to create the temp file.
Timo Sirainen <tss@iki.fi>
parents: 9348
diff changeset
119
8fa79cdb2ef3 istream-seekable: Changed API to use a callback function to create the temp file.
Timo Sirainen <tss@iki.fi>
parents: 9348
diff changeset
120 path = t_str_new(128);
8fa79cdb2ef3 istream-seekable: Changed API to use a callback function to create the temp file.
Timo Sirainen <tss@iki.fi>
parents: 9348
diff changeset
121 str_append(path, mail_user_get_temp_prefix(ctx->dest_user));
8fa79cdb2ef3 istream-seekable: Changed API to use a callback function to create the temp file.
Timo Sirainen <tss@iki.fi>
parents: 9348
diff changeset
122 fd = safe_mkstemp(path, 0600, (uid_t)-1, (gid_t)-1);
9372
b1c584654a0e lda: If temp file can't be created because home dir doesn't exist, create it.
timo@timo-desktop
parents: 9371
diff changeset
123 if (fd == -1 && errno == ENOENT) {
b1c584654a0e lda: If temp file can't be created because home dir doesn't exist, create it.
timo@timo-desktop
parents: 9371
diff changeset
124 dir = str_c(path);
b1c584654a0e lda: If temp file can't be created because home dir doesn't exist, create it.
timo@timo-desktop
parents: 9371
diff changeset
125 p = strrchr(dir, '/');
b1c584654a0e lda: If temp file can't be created because home dir doesn't exist, create it.
timo@timo-desktop
parents: 9371
diff changeset
126 if (p != NULL) {
b1c584654a0e lda: If temp file can't be created because home dir doesn't exist, create it.
timo@timo-desktop
parents: 9371
diff changeset
127 dir = t_strdup_until(dir, p);
b1c584654a0e lda: If temp file can't be created because home dir doesn't exist, create it.
timo@timo-desktop
parents: 9371
diff changeset
128 if (deliver_create_dir(ctx->dest_user, dir) < 0)
b1c584654a0e lda: If temp file can't be created because home dir doesn't exist, create it.
timo@timo-desktop
parents: 9371
diff changeset
129 return -1;
b1c584654a0e lda: If temp file can't be created because home dir doesn't exist, create it.
timo@timo-desktop
parents: 9371
diff changeset
130 fd = safe_mkstemp(path, 0600, (uid_t)-1, (gid_t)-1);
b1c584654a0e lda: If temp file can't be created because home dir doesn't exist, create it.
timo@timo-desktop
parents: 9371
diff changeset
131 }
b1c584654a0e lda: If temp file can't be created because home dir doesn't exist, create it.
timo@timo-desktop
parents: 9371
diff changeset
132 }
9370
8fa79cdb2ef3 istream-seekable: Changed API to use a callback function to create the temp file.
Timo Sirainen <tss@iki.fi>
parents: 9348
diff changeset
133 if (fd == -1) {
8fa79cdb2ef3 istream-seekable: Changed API to use a callback function to create the temp file.
Timo Sirainen <tss@iki.fi>
parents: 9348
diff changeset
134 i_error("safe_mkstemp(%s) failed: %m", str_c(path));
8fa79cdb2ef3 istream-seekable: Changed API to use a callback function to create the temp file.
Timo Sirainen <tss@iki.fi>
parents: 9348
diff changeset
135 return -1;
8fa79cdb2ef3 istream-seekable: Changed API to use a callback function to create the temp file.
Timo Sirainen <tss@iki.fi>
parents: 9348
diff changeset
136 }
8fa79cdb2ef3 istream-seekable: Changed API to use a callback function to create the temp file.
Timo Sirainen <tss@iki.fi>
parents: 9348
diff changeset
137
8fa79cdb2ef3 istream-seekable: Changed API to use a callback function to create the temp file.
Timo Sirainen <tss@iki.fi>
parents: 9348
diff changeset
138 /* we just want the fd, unlink it */
8fa79cdb2ef3 istream-seekable: Changed API to use a callback function to create the temp file.
Timo Sirainen <tss@iki.fi>
parents: 9348
diff changeset
139 if (unlink(str_c(path)) < 0) {
8fa79cdb2ef3 istream-seekable: Changed API to use a callback function to create the temp file.
Timo Sirainen <tss@iki.fi>
parents: 9348
diff changeset
140 /* shouldn't happen.. */
8fa79cdb2ef3 istream-seekable: Changed API to use a callback function to create the temp file.
Timo Sirainen <tss@iki.fi>
parents: 9348
diff changeset
141 i_error("unlink(%s) failed: %m", str_c(path));
8fa79cdb2ef3 istream-seekable: Changed API to use a callback function to create the temp file.
Timo Sirainen <tss@iki.fi>
parents: 9348
diff changeset
142 close_keep_errno(fd);
8fa79cdb2ef3 istream-seekable: Changed API to use a callback function to create the temp file.
Timo Sirainen <tss@iki.fi>
parents: 9348
diff changeset
143 return -1;
8fa79cdb2ef3 istream-seekable: Changed API to use a callback function to create the temp file.
Timo Sirainen <tss@iki.fi>
parents: 9348
diff changeset
144 }
8fa79cdb2ef3 istream-seekable: Changed API to use a callback function to create the temp file.
Timo Sirainen <tss@iki.fi>
parents: 9348
diff changeset
145
8fa79cdb2ef3 istream-seekable: Changed API to use a callback function to create the temp file.
Timo Sirainen <tss@iki.fi>
parents: 9348
diff changeset
146 *path_r = str_c(path);
8fa79cdb2ef3 istream-seekable: Changed API to use a callback function to create the temp file.
Timo Sirainen <tss@iki.fi>
parents: 9348
diff changeset
147 return fd;
8fa79cdb2ef3 istream-seekable: Changed API to use a callback function to create the temp file.
Timo Sirainen <tss@iki.fi>
parents: 9348
diff changeset
148 }
9092
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
149
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
150 static struct istream *
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
151 create_raw_stream(struct mail_deliver_context *ctx,
9370
8fa79cdb2ef3 istream-seekable: Changed API to use a callback function to create the temp file.
Timo Sirainen <tss@iki.fi>
parents: 9348
diff changeset
152 int fd, time_t *mtime_r)
9092
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
153 {
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
154 struct istream *input, *input2, *input_list[2];
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
155 const unsigned char *data;
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
156 char *sender = NULL;
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
157 size_t i, size;
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
158 int ret, tz;
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
159
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
160 *mtime_r = (time_t)-1;
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
161 fd_set_nonblock(fd, FALSE);
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
162
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
163 input = i_stream_create_fd(fd, 4096, FALSE);
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
164 input->blocking = TRUE;
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
165 /* If input begins with a From-line, drop it */
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
166 ret = i_stream_read_data(input, &data, &size, 5);
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
167 if (ret > 0 && size >= 5 && memcmp(data, "From ", 5) == 0) {
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
168 /* skip until the first LF */
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
169 i_stream_skip(input, 5);
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
170 while ((ret = i_stream_read_data(input, &data, &size, 0)) > 0) {
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
171 for (i = 0; i < size; i++) {
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
172 if (data[i] == '\n')
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
173 break;
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
174 }
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
175 if (i != size) {
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
176 (void)mbox_from_parse(data, i, mtime_r, &tz,
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
177 &sender);
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
178 i_stream_skip(input, i + 1);
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
179 break;
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
180 }
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
181 i_stream_skip(input, size);
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
182 }
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
183 }
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
184
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
185 if (sender != NULL && ctx->src_envelope_sender == NULL) {
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
186 /* use the envelope sender from From_-line, but only if it
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
187 hasn't been specified with -f already. */
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
188 ctx->src_envelope_sender = p_strdup(ctx->pool, sender);
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
189 }
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
190 i_free(sender);
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
191
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
192 if (input->v_offset == 0) {
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
193 input2 = input;
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
194 i_stream_ref(input2);
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
195 } else {
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
196 input2 = i_stream_create_limit(input, (uoff_t)-1);
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
197 }
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
198 i_stream_unref(&input);
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
199
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
200 input_list[0] = input2; input_list[1] = NULL;
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
201 input = i_stream_create_seekable(input_list, MAIL_MAX_MEMORY_BUFFER,
9370
8fa79cdb2ef3 istream-seekable: Changed API to use a callback function to create the temp file.
Timo Sirainen <tss@iki.fi>
parents: 9348
diff changeset
202 seekable_fd_callback, ctx);
9092
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
203 i_stream_unref(&input2);
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
204 return input;
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
205 }
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
206
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
207 static void failure_exit_callback(int *status)
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
208 {
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
209 /* we want all our exit codes to be sysexits.h compatible.
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
210 if we failed because of a logging related error, we most likely
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
211 aren't writing to stderr, so try writing there to give some kind of
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
212 a clue what's wrong. FATAL_LOGOPEN failure already wrote to
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
213 stderr, so don't duplicate it. */
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
214 switch (*status) {
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
215 case FATAL_LOGWRITE:
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
216 fputs("Failed to write to log file", stderr);
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
217 break;
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
218 case FATAL_LOGERROR:
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
219 fputs("Internal logging error", stderr);
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
220 break;
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
221 case FATAL_LOGOPEN:
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
222 case FATAL_OUTOFMEM:
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
223 case FATAL_EXEC:
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
224 case FATAL_DEFAULT:
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
225 break;
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
226 default:
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
227 return;
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
228 }
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
229 *status = EX_TEMPFAIL;
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
230 }
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
231
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
232 static void print_help(void)
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
233 {
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
234 printf(
9103
5c12eac2c3ca s/deliver/lda/
Timo Sirainen <tss@iki.fi>
parents: 9092
diff changeset
235 "Usage: dovecot-lda [-c <config file>] [-a <address>] [-d <username>] [-p <path>]\n"
5c12eac2c3ca s/deliver/lda/
Timo Sirainen <tss@iki.fi>
parents: 9092
diff changeset
236 " [-f <envelope sender>] [-m <mailbox>] [-e] [-k]\n");
9092
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
237 }
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
238
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
239 int main(int argc, char *argv[])
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
240 {
9106
fce3926fe910 mail_storage_service_init*() can now take multiple set_roots.
Timo Sirainen <tss@iki.fi>
parents: 9103
diff changeset
241 const struct setting_parser_info *set_roots[] = {
fce3926fe910 mail_storage_service_init*() can now take multiple set_roots.
Timo Sirainen <tss@iki.fi>
parents: 9103
diff changeset
242 &lda_setting_parser_info,
fce3926fe910 mail_storage_service_init*() can now take multiple set_roots.
Timo Sirainen <tss@iki.fi>
parents: 9103
diff changeset
243 NULL
fce3926fe910 mail_storage_service_init*() can now take multiple set_roots.
Timo Sirainen <tss@iki.fi>
parents: 9103
diff changeset
244 };
9092
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
245 struct mail_deliver_context ctx;
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
246 enum mail_storage_service_flags service_flags = 0;
10119
1e63221f5c83 Moved most of getopt() handling to lib-master.
Timo Sirainen <tss@iki.fi>
parents: 10101
diff changeset
247 const char *user, *errstr, *path;
10130
d1384c2b08e5 Merged single and multi mail_storage_service_*() functions.
Timo Sirainen <tss@iki.fi>
parents: 10125
diff changeset
248 struct mail_storage_service_ctx *storage_service;
d1384c2b08e5 Merged single and multi mail_storage_service_*() functions.
Timo Sirainen <tss@iki.fi>
parents: 10125
diff changeset
249 struct mail_storage_service_user *service_user;
9147
bf448752f6c4 Pass remote/local IPs to mail_users. Standalone mail programs now log with mail_log_prefix.
Timo Sirainen <tss@iki.fi>
parents: 9117
diff changeset
250 struct mail_storage_service_input service_input;
9092
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
251 struct mail_user *raw_mail_user;
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
252 struct mail_namespace *raw_ns;
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
253 struct mail_namespace_settings raw_ns_set;
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
254 struct mail_storage *storage;
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
255 struct mailbox *box;
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
256 struct raw_mailbox *raw_box;
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
257 struct istream *input;
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
258 struct mailbox_transaction_context *t;
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
259 struct mailbox_header_lookup_ctx *headers_ctx;
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
260 void **sets;
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
261 uid_t process_euid;
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
262 bool stderr_rejection = FALSE;
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
263 time_t mtime;
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
264 int ret, c;
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
265 enum mail_error error;
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
266
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
267 if (getuid() != geteuid() && geteuid() == 0) {
9103
5c12eac2c3ca s/deliver/lda/
Timo Sirainen <tss@iki.fi>
parents: 9092
diff changeset
268 /* running setuid - don't allow this if the binary is
9092
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
269 executable by anyone */
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
270 struct stat st;
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
271
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
272 if (stat(argv[0], &st) < 0) {
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
273 fprintf(stderr, "stat(%s) failed: %s\n",
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
274 argv[0], strerror(errno));
9948
8342893350b2 deliver: Changed all EX_CONFIGs to EX_TEMPFAILs to avoid bounces.
Timo Sirainen <tss@iki.fi>
parents: 9537
diff changeset
275 return EX_TEMPFAIL;
10205
13b3a3ce892c lda: Fixed binary setuid-checking.
Timo Sirainen <tss@iki.fi>
parents: 10156
diff changeset
276 } else if ((st.st_mode & 1) != 0 && (st.st_mode & 04000) != 0) {
9092
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
277 fprintf(stderr, "%s must not be both world-executable "
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
278 "and setuid-root. This allows root exploits. "
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
279 "See http://wiki.dovecot.org/LDA#multipleuids\n",
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
280 argv[0]);
9948
8342893350b2 deliver: Changed all EX_CONFIGs to EX_TEMPFAILs to avoid bounces.
Timo Sirainen <tss@iki.fi>
parents: 9537
diff changeset
281 return EX_TEMPFAIL;
9092
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
282 }
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
283 }
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
284
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
285 i_set_failure_exit_callback(failure_exit_callback);
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
286
9348
0c587f108916 lib-master has now a global master_service variable that all binaries use.
Timo Sirainen <tss@iki.fi>
parents: 9263
diff changeset
287 master_service = master_service_init("lda",
9371
ad0b052aef5e lda: Log to specified log file, not to stderr.
Timo Sirainen <tss@iki.fi>
parents: 9370
diff changeset
288 MASTER_SERVICE_FLAG_STANDALONE |
ad0b052aef5e lda: Log to specified log file, not to stderr.
Timo Sirainen <tss@iki.fi>
parents: 9370
diff changeset
289 MASTER_SERVICE_FLAG_DONT_LOG_TO_STDERR,
10125
e248c1e53e00 lda: Cleaned up parameter handling.
Timo Sirainen <tss@iki.fi>
parents: 10120
diff changeset
290 &argc, &argv, "a:d:ef:km:p:");
9092
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
291
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
292 memset(&ctx, 0, sizeof(ctx));
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
293 ctx.pool = pool_alloconly_create("mail deliver context", 256);
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
294 ctx.dest_mailbox_name = "INBOX";
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
295 path = NULL;
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
296
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
297 user = getenv("USER");
10119
1e63221f5c83 Moved most of getopt() handling to lib-master.
Timo Sirainen <tss@iki.fi>
parents: 10101
diff changeset
298 while ((c = master_getopt(master_service)) > 0) {
9092
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
299 switch (c) {
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
300 case 'a':
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
301 /* destination address */
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
302 ctx.dest_addr = optarg;
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
303 break;
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
304 case 'd':
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
305 /* destination user */
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
306 user = optarg;
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
307 service_flags |= MAIL_STORAGE_SERVICE_FLAG_USERDB_LOOKUP;
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
308 break;
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
309 case 'e':
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
310 stderr_rejection = TRUE;
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
311 break;
10125
e248c1e53e00 lda: Cleaned up parameter handling.
Timo Sirainen <tss@iki.fi>
parents: 10120
diff changeset
312 case 'f':
e248c1e53e00 lda: Cleaned up parameter handling.
Timo Sirainen <tss@iki.fi>
parents: 10120
diff changeset
313 /* envelope sender address */
e248c1e53e00 lda: Cleaned up parameter handling.
Timo Sirainen <tss@iki.fi>
parents: 10120
diff changeset
314 ctx.src_envelope_sender =
e248c1e53e00 lda: Cleaned up parameter handling.
Timo Sirainen <tss@iki.fi>
parents: 10120
diff changeset
315 p_strdup(ctx.pool, address_sanitize(optarg));
e248c1e53e00 lda: Cleaned up parameter handling.
Timo Sirainen <tss@iki.fi>
parents: 10120
diff changeset
316 break;
9092
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
317 case 'm':
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
318 /* destination mailbox.
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
319 Ignore -m "". This allows doing -m ${extension}
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
320 in Postfix to handle user+mailbox */
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
321 if (*optarg != '\0') T_BEGIN {
10308
05d94015d0ef mail_deliver_save() now takes mailbox name as UTF-8 and internally converts to mUTF-7.
Timo Sirainen <tss@iki.fi>
parents: 10209
diff changeset
322 if (uni_utf8_str_is_valid(optarg) < 0) {
9092
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
323 i_fatal("Mailbox name not UTF-8: %s",
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
324 optarg);
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
325 }
10308
05d94015d0ef mail_deliver_save() now takes mailbox name as UTF-8 and internally converts to mUTF-7.
Timo Sirainen <tss@iki.fi>
parents: 10209
diff changeset
326 ctx.dest_mailbox_name = optarg;
9092
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
327 } T_END;
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
328 break;
10125
e248c1e53e00 lda: Cleaned up parameter handling.
Timo Sirainen <tss@iki.fi>
parents: 10120
diff changeset
329 case 'p':
e248c1e53e00 lda: Cleaned up parameter handling.
Timo Sirainen <tss@iki.fi>
parents: 10120
diff changeset
330 /* input path */
10501
28a14e2fe5d6 Use t_abspath() instead of duplicating code.
Timo Sirainen <tss@iki.fi>
parents: 10308
diff changeset
331 path = t_abspath(optarg);
9092
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
332 break;
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
333 default:
10119
1e63221f5c83 Moved most of getopt() handling to lib-master.
Timo Sirainen <tss@iki.fi>
parents: 10101
diff changeset
334 print_help();
1e63221f5c83 Moved most of getopt() handling to lib-master.
Timo Sirainen <tss@iki.fi>
parents: 10101
diff changeset
335 return EX_USAGE;
9092
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
336 }
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
337 }
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
338 if (optind != argc) {
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
339 print_help();
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
340 i_fatal_status(EX_USAGE, "Unknown argument: %s", argv[optind]);
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
341 }
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
342
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
343 process_euid = geteuid();
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
344 if ((service_flags & MAIL_STORAGE_SERVICE_FLAG_USERDB_LOOKUP) != 0)
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
345 ;
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
346 else if (process_euid != 0) {
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
347 /* we're non-root. get our username and possibly our home. */
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
348 struct passwd *pw;
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
349 const char *home;
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
350
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
351 home = getenv("HOME");
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
352 if (user != NULL && home != NULL) {
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
353 /* no need for a pw lookup */
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
354 } else if ((pw = getpwuid(process_euid)) != NULL) {
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
355 user = t_strdup(pw->pw_name);
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
356 if (home == NULL)
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
357 env_put(t_strconcat("HOME=", pw->pw_dir, NULL));
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
358 } else if (user == NULL) {
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
359 i_fatal_status(EX_USAGE,
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
360 "Couldn't lookup our username (uid=%s)",
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
361 dec2str(process_euid));
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
362 }
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
363 } else {
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
364 i_fatal_status(EX_USAGE,
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
365 "destination user parameter (-d user) not given");
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
366 }
10101
4fe8c4382712 Redesigned how login process passes connections to mail processes and changed related APIs.
Timo Sirainen <tss@iki.fi>
parents: 10058
diff changeset
367 master_service_init_finish(master_service);
9092
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
368
9147
bf448752f6c4 Pass remote/local IPs to mail_users. Standalone mail programs now log with mail_log_prefix.
Timo Sirainen <tss@iki.fi>
parents: 9117
diff changeset
369 memset(&service_input, 0, sizeof(service_input));
9263
5d0a69504867 config handling fixes and improvements. Separated module/service lookups. Added support for per-lip/rip settings.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
370 service_input.module = "lda";
5d0a69504867 config handling fixes and improvements. Separated module/service lookups. Added support for per-lip/rip settings.
Timo Sirainen <tss@iki.fi>
parents: 9159
diff changeset
371 service_input.service = "lda";
9147
bf448752f6c4 Pass remote/local IPs to mail_users. Standalone mail programs now log with mail_log_prefix.
Timo Sirainen <tss@iki.fi>
parents: 9117
diff changeset
372 service_input.username = user;
bf448752f6c4 Pass remote/local IPs to mail_users. Standalone mail programs now log with mail_log_prefix.
Timo Sirainen <tss@iki.fi>
parents: 9117
diff changeset
373
9092
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
374 service_flags |= MAIL_STORAGE_SERVICE_FLAG_DISALLOW_ROOT;
10130
d1384c2b08e5 Merged single and multi mail_storage_service_*() functions.
Timo Sirainen <tss@iki.fi>
parents: 10125
diff changeset
375 storage_service = mail_storage_service_init(master_service, set_roots,
d1384c2b08e5 Merged single and multi mail_storage_service_*() functions.
Timo Sirainen <tss@iki.fi>
parents: 10125
diff changeset
376 service_flags);
d1384c2b08e5 Merged single and multi mail_storage_service_*() functions.
Timo Sirainen <tss@iki.fi>
parents: 10125
diff changeset
377 if (mail_storage_service_lookup_next(storage_service, &service_input,
d1384c2b08e5 Merged single and multi mail_storage_service_*() functions.
Timo Sirainen <tss@iki.fi>
parents: 10125
diff changeset
378 &service_user, &ctx.dest_user,
d1384c2b08e5 Merged single and multi mail_storage_service_*() functions.
Timo Sirainen <tss@iki.fi>
parents: 10125
diff changeset
379 &errstr) <= 0)
d1384c2b08e5 Merged single and multi mail_storage_service_*() functions.
Timo Sirainen <tss@iki.fi>
parents: 10125
diff changeset
380 i_fatal("%s", errstr);
d1384c2b08e5 Merged single and multi mail_storage_service_*() functions.
Timo Sirainen <tss@iki.fi>
parents: 10125
diff changeset
381
9159
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9147
diff changeset
382 #ifdef SIGXFSZ
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9147
diff changeset
383 lib_signals_ignore(SIGXFSZ, TRUE);
6324a79d3ee1 Initial commit for v2.0 master rewrite. Several features are still missing.
Timo Sirainen <tss@iki.fi>
parents: 9147
diff changeset
384 #endif
10130
d1384c2b08e5 Merged single and multi mail_storage_service_*() functions.
Timo Sirainen <tss@iki.fi>
parents: 10125
diff changeset
385 ctx.set = mail_storage_service_user_get_set(service_user)[1];
9092
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
386
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
387 /* create a separate mail user for the internal namespace */
9348
0c587f108916 lib-master has now a global master_service variable that all binaries use.
Timo Sirainen <tss@iki.fi>
parents: 9263
diff changeset
388 if (master_service_set(master_service,
0c587f108916 lib-master has now a global master_service variable that all binaries use.
Timo Sirainen <tss@iki.fi>
parents: 9263
diff changeset
389 "mail_full_filesystem_access=yes") < 0)
9092
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
390 i_unreached();
9348
0c587f108916 lib-master has now a global master_service variable that all binaries use.
Timo Sirainen <tss@iki.fi>
parents: 9263
diff changeset
391 sets = master_service_settings_get_others(master_service);
10134
545bdb7670d2 lib-storage: Changed APIs to fix reading settings for multiple users.
Timo Sirainen <tss@iki.fi>
parents: 10130
diff changeset
392 raw_mail_user = mail_user_alloc(user, ctx.dest_user->set_info, sets[0]);
9092
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
393 mail_user_set_home(raw_mail_user, "/");
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
394 if (mail_user_init(raw_mail_user, &errstr) < 0)
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
395 i_fatal("Raw user initialization failed: %s", errstr);
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
396
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
397 memset(&raw_ns_set, 0, sizeof(raw_ns_set));
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
398 raw_ns_set.location = "/tmp";
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
399
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
400 raw_ns = mail_namespaces_init_empty(raw_mail_user);
9374
e4429faabf59 Split NAMESPACE_FLAG_INTERNAL into distinct _NOQUOTA and _NOACL flags.
Timo Sirainen <tss@iki.fi>
parents: 9372
diff changeset
401 raw_ns->flags |= NAMESPACE_FLAG_NOQUOTA | NAMESPACE_FLAG_NOACL;
9092
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
402 raw_ns->set = &raw_ns_set;
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
403 if (mail_storage_create(raw_ns, "raw", 0, &errstr) < 0)
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
404 i_fatal("Couldn't create internal raw storage: %s", errstr);
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
405 if (path == NULL) {
9370
8fa79cdb2ef3 istream-seekable: Changed API to use a callback function to create the temp file.
Timo Sirainen <tss@iki.fi>
parents: 9348
diff changeset
406 input = create_raw_stream(&ctx, 0, &mtime);
9468
653183a81b6c Mailbox opening and closing APIs changed.
Timo Sirainen <tss@iki.fi>
parents: 9434
diff changeset
407 box = mailbox_alloc(raw_ns->list, "Dovecot Delivery Mail",
653183a81b6c Mailbox opening and closing APIs changed.
Timo Sirainen <tss@iki.fi>
parents: 9434
diff changeset
408 input, MAILBOX_FLAG_NO_INDEX_FILES);
9092
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
409 i_stream_unref(&input);
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
410 } else {
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
411 mtime = (time_t)-1;
9468
653183a81b6c Mailbox opening and closing APIs changed.
Timo Sirainen <tss@iki.fi>
parents: 9434
diff changeset
412 box = mailbox_alloc(raw_ns->list, path, NULL,
653183a81b6c Mailbox opening and closing APIs changed.
Timo Sirainen <tss@iki.fi>
parents: 9434
diff changeset
413 MAILBOX_FLAG_NO_INDEX_FILES);
9092
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
414 }
9468
653183a81b6c Mailbox opening and closing APIs changed.
Timo Sirainen <tss@iki.fi>
parents: 9434
diff changeset
415 if (mailbox_open(box) < 0) {
9092
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
416 i_fatal("Can't open delivery mail as raw: %s",
9468
653183a81b6c Mailbox opening and closing APIs changed.
Timo Sirainen <tss@iki.fi>
parents: 9434
diff changeset
417 mail_storage_get_last_error(box->storage, &error));
9092
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
418 }
10509
50364f04cf13 lib-storage: Changed mailbox_sync() and mailbox_sync_deinit() APIs.
Timo Sirainen <tss@iki.fi>
parents: 10501
diff changeset
419 if (mailbox_sync(box, 0) < 0) {
9092
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
420 i_fatal("Can't sync delivery mail: %s",
9434
e374a365521d Initial commit for making mail_storage:mailbox_list to be from 1:1 to n:n.
Timo Sirainen <tss@iki.fi>
parents: 9374
diff changeset
421 mail_storage_get_last_error(box->storage, &error));
9092
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
422 }
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
423 raw_box = (struct raw_mailbox *)box;
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
424 raw_box->envelope_sender = ctx.src_envelope_sender != NULL ?
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
425 ctx.src_envelope_sender : DEFAULT_ENVELOPE_SENDER;
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
426 raw_box->mtime = mtime;
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
427
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
428 t = mailbox_transaction_begin(box, 0);
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
429 headers_ctx = mailbox_header_lookup_init(box, wanted_headers);
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
430 ctx.src_mail = mail_alloc(t, 0, headers_ctx);
9117
a9f61b63dc3d lmtp: Minor cleanup.
Timo Sirainen <tss@iki.fi>
parents: 9106
diff changeset
431 mailbox_header_lookup_unref(&headers_ctx);
9092
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
432 mail_set_seq(ctx.src_mail, 1);
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
433
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
434 if (ctx.dest_addr == NULL) {
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
435 ctx.dest_addr = mail_deliver_get_address(&ctx, "Envelope-To");
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
436 if (ctx.dest_addr == NULL) {
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
437 ctx.dest_addr = strchr(user, '@') != NULL ? user :
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
438 t_strconcat(user, "@", ctx.set->hostname, NULL);
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
439 }
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
440 }
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
441
9117
a9f61b63dc3d lmtp: Minor cleanup.
Timo Sirainen <tss@iki.fi>
parents: 9106
diff changeset
442 if (mail_deliver(&ctx, &storage) < 0) {
9092
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
443 if (storage == NULL) {
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
444 /* This shouldn't happen */
9117
a9f61b63dc3d lmtp: Minor cleanup.
Timo Sirainen <tss@iki.fi>
parents: 9106
diff changeset
445 i_error("BUG: Saving failed to unknown storage");
9092
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
446 return EX_TEMPFAIL;
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
447 }
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
448
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
449 errstr = mail_storage_get_last_error(storage, &error);
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
450
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
451 if (stderr_rejection) {
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
452 /* write to stderr also for tempfails so that MTA
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
453 can log the reason if it wants to. */
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
454 fprintf(stderr, "%s\n", errstr);
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
455 }
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
456
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
457 if (error != MAIL_ERROR_NOSPACE ||
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
458 ctx.set->quota_full_tempfail) {
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
459 /* Saving to INBOX should always work unless
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
460 we're over quota. If it didn't, it's probably a
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
461 configuration problem. */
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
462 return EX_TEMPFAIL;
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
463 }
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
464
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
465 /* we'll have to reply with permanent failure */
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
466 mail_deliver_log(&ctx, "rejected: %s",
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
467 str_sanitize(errstr, 512));
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
468
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
469 if (stderr_rejection)
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
470 return EX_NOPERM;
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
471 ret = mail_send_rejection(&ctx, user, errstr);
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
472 if (ret != 0)
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
473 return ret < 0 ? EX_TEMPFAIL : ret;
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
474 /* ok, rejection sent */
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
475 }
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
476
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
477 mail_free(&ctx.src_mail);
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
478 mailbox_transaction_rollback(&t);
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
479 mailbox_close(&box);
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
480
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
481 mail_user_unref(&ctx.dest_user);
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
482 mail_user_unref(&raw_mail_user);
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
483 pool_unref(&ctx.pool);
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
484
10130
d1384c2b08e5 Merged single and multi mail_storage_service_*() functions.
Timo Sirainen <tss@iki.fi>
parents: 10125
diff changeset
485 mail_storage_service_user_free(&service_user);
d1384c2b08e5 Merged single and multi mail_storage_service_*() functions.
Timo Sirainen <tss@iki.fi>
parents: 10125
diff changeset
486 mail_storage_service_deinit(&storage_service);
9348
0c587f108916 lib-master has now a global master_service variable that all binaries use.
Timo Sirainen <tss@iki.fi>
parents: 9263
diff changeset
487 master_service_deinit(&master_service);
9092
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
488 return EX_OK;
e4832f128738 Renamed deliver to dovecot-lda and moved most of its code to lib-lda.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
489 }