annotate src/deliver/deliver.c @ 3389:70c200deddf7 HEAD

Parse also pop3_uidl_format setting for %m case, so we know to save the MD5 sum while parsing mbox.
author Timo Sirainen <tss@iki.fi>
date Mon, 23 May 2005 22:51:38 +0300
parents e5ce49c8524a
children 3360cc019737
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3199
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1 /* Copyright (C) 2005 Timo Sirainen */
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3 /* FIXME: pretty ugly thing. */
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
4
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
5 #include "lib.h"
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
6 #include "lib-signals.h"
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
7 #include "ioloop.h"
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
8 #include "env-util.h"
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
9 #include "network.h"
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
10 #include "restrict-access.h"
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
11 #include "istream.h"
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
12 #include "ostream.h"
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
13 #include "str.h"
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
14 #include "var-expand.h"
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
15 #include "mail-storage.h"
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
16
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
17 #include <stdlib.h>
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
18 #include <unistd.h>
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
19 #include <fcntl.h>
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
20 #include <pwd.h>
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
21 #include <sysexits.h>
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
22
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
23 #define DEFAULT_CONFIG_FILE SYSCONFDIR"/dovecot-deliver.conf"
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
24 #define DEFAULT_AUTH_SOCKET_PATH "/var/run/dovecot/auth-master"
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
25
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
26 #define MAX_INBUF_SIZE 8192
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
27 #define MAX_OUTBUF_SIZE 512
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
28
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
29 struct auth_connection {
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
30 int fd;
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
31 struct io *io;
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
32 struct istream *input;
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
33 struct ostream *output;
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
34
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
35 unsigned int handshaked:1;
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
36 };
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
37
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
38 static struct ioloop *ioloop;
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
39 static int return_value = EX_SOFTWARE;
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
40
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
41 static void sig_quit(int signo __attr_unused__)
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
42 {
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
43 io_loop_stop(ioloop);
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
44 }
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
45
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
46 static int sync_quick(struct mailbox *box)
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
47 {
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
48 struct mailbox_sync_context *ctx;
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
49 struct mailbox_sync_rec sync_rec;
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
50 struct mailbox_status status;
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
51
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
52 ctx = mailbox_sync_init(box, 0);
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
53 while (mailbox_sync_next(ctx, &sync_rec) > 0)
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
54 ;
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
55 return mailbox_sync_deinit(ctx, &status);
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
56 }
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
57
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
58 struct save_mail_context {
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
59 struct mail_save_context *save_ctx;
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
60 struct istream *input;
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
61 int ret;
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
62 };
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
63
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
64 static void save_mail_input(void *context)
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
65 {
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
66 struct save_mail_context *ctx = context;
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
67
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
68 if (ctx->input->closed ||
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
69 mailbox_save_continue(ctx->save_ctx) < 0)
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
70 io_loop_stop(ioloop);
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
71 else if (ctx->input->eof) {
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
72 ctx->ret = 0;
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
73 io_loop_stop(ioloop);
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
74 }
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
75 }
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
76
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
77 static int save_mail(struct mail_storage *storage, const char *mailbox,
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
78 struct istream *input)
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
79 {
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
80 struct mailbox *box;
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
81 struct mailbox_transaction_context *t;
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
82 struct save_mail_context ctx;
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
83 struct io *io;
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
84 int ret = 0;
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
85
3255
c29326c157da Compile fix for recent mailbox_open() API change.
Timo Sirainen <tss@iki.fi>
parents: 3209
diff changeset
86 box = mailbox_open(storage, mailbox, NULL, MAILBOX_OPEN_FAST |
3199
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
87 MAILBOX_OPEN_KEEP_RECENT);
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
88 if (box == NULL)
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
89 return FALSE;
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
90
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
91 if (sync_quick(box) < 0) {
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
92 mailbox_close(box);
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
93 return FALSE;
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
94 }
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
95
3209
923ff19873d4 Major mail-storage API changes. It's now a bit cleaner and much more plugin
Timo Sirainen <tss@iki.fi>
parents: 3199
diff changeset
96 t = mailbox_transaction_begin(box, MAILBOX_TRANSACTION_FLAG_EXTERNAL);
3199
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
97
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
98 memset(&ctx, 0, sizeof(ctx));
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
99 ctx.ret = -1;
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
100 ctx.input = input;
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
101 ctx.save_ctx = mailbox_save_init(t, 0, NULL, (time_t)-1, 0, NULL,
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
102 input, FALSE);
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
103
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
104 io = io_add(i_stream_get_fd(input), IO_READ, save_mail_input, &ctx);
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
105 io_loop_run(ioloop);
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
106 io_remove(io);
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
107
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
108 ret = ctx.ret;
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
109 if (ret < 0)
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
110 mailbox_save_cancel(ctx.save_ctx);
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
111 else
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
112 ret = mailbox_save_finish(ctx.save_ctx, NULL);
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
113
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
114 if (ret < 0)
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
115 mailbox_transaction_rollback(t);
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
116 else
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
117 ret = mailbox_transaction_commit(t, 0);
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
118
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
119 mailbox_close(box);
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
120 return ret;
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
121 }
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
122
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
123 static void auth_connection_destroy(struct auth_connection *conn)
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
124 {
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
125 io_loop_stop(ioloop);
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
126
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
127 io_remove(conn->io);
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
128 i_stream_unref(conn->input);
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
129 o_stream_unref(conn->output);
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
130 i_free(conn);
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
131 }
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
132
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
133 static void auth_parse_input(const char *args)
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
134 {
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
135 const char *const *tmp;
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
136
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
137 for (tmp = t_strsplit(args, "\t"); *tmp != NULL; tmp++) {
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
138 if (strncmp(*tmp, "uid=", 4) == 0) {
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
139 env_put(t_strconcat("RESTRICT_SETUID=",
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
140 *tmp + 4, NULL));
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
141 } else if (strncmp(*tmp, "gid=", 4) == 0) {
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
142 env_put(t_strconcat("RESTRICT_SETGID=",
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
143 *tmp + 4, NULL));
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
144 } else if (strncmp(*tmp, "chroot=", 7) == 0) {
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
145 env_put(t_strconcat("RESTRICT_CHROOT=",
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
146 *tmp + 7, NULL));
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
147 } else if (strncmp(*tmp, "home=", 5) == 0)
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
148 env_put(t_strconcat("HOME=", *tmp + 5, NULL));
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
149 }
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
150
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
151 restrict_access_by_env(TRUE);
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
152 return_value = EX_OK;
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
153 }
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
154
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
155 static void auth_input(void *context)
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
156 {
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
157 struct auth_connection *conn = context;
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
158 const char *line;
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
159
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
160 switch (i_stream_read(conn->input)) {
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
161 case 0:
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
162 return;
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
163 case -1:
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
164 /* disconnected */
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
165 auth_connection_destroy(conn);
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
166 return;
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
167 case -2:
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
168 /* buffer full */
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
169 i_error("BUG: Auth master sent us more than %d bytes",
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
170 MAX_INBUF_SIZE);
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
171 auth_connection_destroy(conn);
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
172 return;
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
173 }
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
174
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
175 if (!conn->handshaked) {
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
176 while ((line = i_stream_next_line(conn->input)) != NULL) {
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
177 if (strncmp(line, "VERSION\t", 8) == 0) {
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
178 if (strncmp(line + 8, "1\t", 2) != 0) {
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
179 i_error("Auth master version mismatch");
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
180 auth_connection_destroy(conn);
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
181 return;
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
182 }
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
183 } else if (strncmp(line, "SPID\t", 5) == 0) {
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
184 conn->handshaked = TRUE;
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
185 break;
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
186 }
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
187 }
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
188 }
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
189
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
190 line = i_stream_next_line(conn->input);
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
191 if (line != NULL) {
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
192 if (strncmp(line, "USER\t1\t", 7) == 0) {
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
193 auth_parse_input(line + 7);
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
194 } else if (strcmp(line, "NOTFOUND\t1") == 0)
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
195 return_value = EX_NOUSER;
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
196 else if (strncmp(line, "FAIL\t1\t", 7) == 0)
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
197 return_value = EX_TEMPFAIL;
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
198 else {
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
199 i_error("BUG: Unexpected input from auth master: %s",
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
200 line);
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
201 }
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
202 auth_connection_destroy(conn);
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
203 }
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
204 }
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
205
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
206 static struct auth_connection *auth_connection_new(const char *auth_socket)
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
207 {
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
208 struct auth_connection *conn;
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
209 int fd;
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
210
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
211 fd = net_connect_unix(auth_socket);
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
212 if (fd < 0) {
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
213 i_error("net_connect(%s) failed: %m", auth_socket);
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
214 return NULL;
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
215 }
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
216
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
217 conn = i_new(struct auth_connection, 1);
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
218 conn->fd = fd;
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
219 conn->input =
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
220 i_stream_create_file(fd, default_pool, MAX_INBUF_SIZE, FALSE);
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
221 conn->output =
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
222 o_stream_create_file(fd, default_pool, MAX_OUTBUF_SIZE, FALSE);
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
223 conn->io = io_add(fd, IO_READ, auth_input, conn);
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
224 return conn;
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
225 }
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
226
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
227 static int user_init(const char *auth_socket, const char *destination)
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
228 {
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
229 struct auth_connection *conn;
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
230
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
231 conn = auth_connection_new(auth_socket);
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
232 if (conn == NULL)
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
233 return EX_TEMPFAIL;
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
234
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
235 o_stream_send_str(conn->output,
3338
e5ce49c8524a USER auth command requires now service parameter and supports also others
Timo Sirainen <tss@iki.fi>
parents: 3326
diff changeset
236 t_strconcat("VERSION\t1\t0\n"
e5ce49c8524a USER auth command requires now service parameter and supports also others
Timo Sirainen <tss@iki.fi>
parents: 3326
diff changeset
237 "USER\t1\t", destination, "\t"
e5ce49c8524a USER auth command requires now service parameter and supports also others
Timo Sirainen <tss@iki.fi>
parents: 3326
diff changeset
238 "service=deliver\n", NULL));
3199
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
239
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
240 io_loop_run(ioloop);
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
241 return return_value;
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
242 }
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
243
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
244 static void config_file_init(const char *path)
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
245 {
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
246 struct istream *input;
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
247 const char *line, *p, *key, *value;
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
248 int fd;
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
249
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
250 fd = open(path, O_RDONLY);
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
251 if (fd < 0)
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
252 i_fatal_status(EX_CONFIG, "open(%s) failed: %m", path);
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
253
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
254 t_push();
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
255 input = i_stream_create_file(fd, default_pool, 1024, TRUE);
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
256 while ((line = i_stream_read_next_line(input)) != NULL) {
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
257 while (*line == ' ') line++;
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
258 if (*line == '#')
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
259 continue;
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
260
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
261 value = p = strchr(line, '=');
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
262 if (value == NULL)
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
263 continue;
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
264
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
265 while (p > line && p[-1] == ' ') p--;
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
266 key = t_strdup_until(line, p);
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
267
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
268 do {
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
269 value++;
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
270 } while (*value == ' ');
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
271
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
272 env_put(t_strconcat(t_str_ucase(key), "=", value, NULL));
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
273 }
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
274 i_stream_unref(input);
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
275 t_pop();
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
276 }
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
277
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
278 static const struct var_expand_table *
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
279 get_var_expand_table(const char *user, const char *home)
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
280 {
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
281 static struct var_expand_table static_tab[] = {
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
282 { 'u', NULL },
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
283 { 'n', NULL },
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
284 { 'd', NULL },
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
285 { 's', NULL },
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
286 { 'h', NULL },
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
287 { 'l', NULL },
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
288 { 'r', NULL },
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
289 { 'p', NULL },
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
290 { '\0', NULL }
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
291 };
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
292 struct var_expand_table *tab;
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
293
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
294 tab = t_malloc(sizeof(static_tab));
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
295 memcpy(tab, static_tab, sizeof(static_tab));
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
296
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
297 tab[0].value = user;
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
298 tab[1].value = t_strcut(user, '@');
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
299 tab[2].value = strchr(user, '@');
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
300 if (tab[2].value != NULL) tab[2].value++;
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
301 tab[3].value = "DELIVER";
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
302 tab[4].value = home;
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
303 tab[5].value = NULL;
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
304 tab[6].value = NULL;
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
305 tab[7].value = dec2str(getpid());
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
306
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
307 return tab;
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
308 }
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
309
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
310 static const char *
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
311 expand_mail_env(const char *env, const struct var_expand_table *table)
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
312 {
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
313 string_t *str;
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
314 const char *p;
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
315
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
316 str = t_str_new(256);
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
317
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
318 /* it's either type:data or just data */
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
319 p = strchr(env, ':');
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
320 if (p != NULL) {
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
321 while (env != p) {
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
322 str_append_c(str, *env);
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
323 env++;
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
324 }
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
325
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
326 str_append_c(str, *env++);
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
327 }
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
328
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
329 if (env[0] == '~' && env[1] == '/') {
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
330 /* expand home */
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
331 env = t_strconcat("%h", env+1, NULL);
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
332 }
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
333
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
334 /* expand %vars */
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
335 var_expand(str, env, table);
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
336 return str_c(str);
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
337 }
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
338
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
339 int main(int argc, char *argv[])
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
340 {
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
341 const char *auth_socket = DEFAULT_AUTH_SOCKET_PATH;
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
342 const char *destination, *mail;
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
343 const struct var_expand_table *table;
3260
6a179bf1272e Moved several getenv()s from lib-storage to main code. deliver binary was
Timo Sirainen <tss@iki.fi>
parents: 3255
diff changeset
344 enum mail_storage_flags flags;
6a179bf1272e Moved several getenv()s from lib-storage to main code. deliver binary was
Timo Sirainen <tss@iki.fi>
parents: 3255
diff changeset
345 enum mail_storage_lock_method lock_method;
3199
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
346 struct mail_storage *storage;
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
347 struct istream *input;
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
348 int i, ret;
3260
6a179bf1272e Moved several getenv()s from lib-storage to main code. deliver binary was
Timo Sirainen <tss@iki.fi>
parents: 3255
diff changeset
349 const char *str;
3199
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
350
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
351 lib_init();
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
352 lib_init_signals(sig_quit);
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
353 ioloop = io_loop_create(default_pool);
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
354
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
355 destination = NULL;
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
356 for (i = 1; i < argc; i++) {
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
357 if (strcmp(argv[i], "-d") == 0) {
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
358 /* destination user */
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
359 i++;
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
360 if (i == argc) {
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
361 i_fatal_status(EX_USAGE,
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
362 "Missing destination argument");
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
363 }
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
364 destination = argv[i];
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
365 } else if (strcmp(argv[i], "-a") == 0) {
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
366 /* auth master socket path */
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
367 i++;
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
368 if (i == argc) {
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
369 i_fatal_status(EX_USAGE,
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
370 "Missing auth socket path argument");
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
371 }
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
372 auth_socket = argv[i];
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
373 } else {
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
374 i_fatal_status(EX_USAGE,
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
375 "Unknown argument: %s", argv[1]);
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
376 }
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
377 }
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
378
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
379 config_file_init(DEFAULT_CONFIG_FILE);
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
380
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
381 if (destination != NULL) {
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
382 ret = user_init(auth_socket, destination);
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
383 if (ret != 0)
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
384 return ret;
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
385 } else if (geteuid() != 0) {
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
386 /* we're non-root. get our username. */
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
387 struct passwd *pw;
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
388
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
389 pw = getpwuid(geteuid());
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
390 if (pw != NULL)
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
391 destination = t_strdup(pw->pw_name);
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
392 }
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
393
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
394 if (destination == NULL) {
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
395 i_fatal_status(EX_USAGE,
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
396 "destination user parameter (-d user) not given");
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
397 }
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
398
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
399 mail_storage_init();
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
400 mail_storage_register_all();
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
401
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
402 mail = getenv("MAIL");
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
403 if (mail == NULL)
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
404 i_fatal_status(EX_CONFIG, "mail setting not given");
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
405
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
406 table = get_var_expand_table(destination, getenv("HOME"));
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
407 mail = expand_mail_env(mail, table);
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
408
3260
6a179bf1272e Moved several getenv()s from lib-storage to main code. deliver binary was
Timo Sirainen <tss@iki.fi>
parents: 3255
diff changeset
409 flags = 0;
6a179bf1272e Moved several getenv()s from lib-storage to main code. deliver binary was
Timo Sirainen <tss@iki.fi>
parents: 3255
diff changeset
410 if (getenv("FULL_FILESYSTEM_ACCESS") != NULL)
6a179bf1272e Moved several getenv()s from lib-storage to main code. deliver binary was
Timo Sirainen <tss@iki.fi>
parents: 3255
diff changeset
411 flags |= MAIL_STORAGE_FLAG_FULL_FS_ACCESS;
6a179bf1272e Moved several getenv()s from lib-storage to main code. deliver binary was
Timo Sirainen <tss@iki.fi>
parents: 3255
diff changeset
412 if (getenv("DEBUG") != NULL)
6a179bf1272e Moved several getenv()s from lib-storage to main code. deliver binary was
Timo Sirainen <tss@iki.fi>
parents: 3255
diff changeset
413 flags |= MAIL_STORAGE_FLAG_DEBUG;
6a179bf1272e Moved several getenv()s from lib-storage to main code. deliver binary was
Timo Sirainen <tss@iki.fi>
parents: 3255
diff changeset
414 if (getenv("MMAP_DISABLE") != NULL)
6a179bf1272e Moved several getenv()s from lib-storage to main code. deliver binary was
Timo Sirainen <tss@iki.fi>
parents: 3255
diff changeset
415 flags |= MAIL_STORAGE_FLAG_MMAP_DISABLE;
6a179bf1272e Moved several getenv()s from lib-storage to main code. deliver binary was
Timo Sirainen <tss@iki.fi>
parents: 3255
diff changeset
416 if (getenv("MMAP_NO_WRITE") != NULL)
6a179bf1272e Moved several getenv()s from lib-storage to main code. deliver binary was
Timo Sirainen <tss@iki.fi>
parents: 3255
diff changeset
417 flags |= MAIL_STORAGE_FLAG_MMAP_NO_WRITE;
6a179bf1272e Moved several getenv()s from lib-storage to main code. deliver binary was
Timo Sirainen <tss@iki.fi>
parents: 3255
diff changeset
418 if (getenv("MAIL_READ_MMAPED") != NULL)
6a179bf1272e Moved several getenv()s from lib-storage to main code. deliver binary was
Timo Sirainen <tss@iki.fi>
parents: 3255
diff changeset
419 flags |= MAIL_STORAGE_FLAG_MMAP_MAILS;
6a179bf1272e Moved several getenv()s from lib-storage to main code. deliver binary was
Timo Sirainen <tss@iki.fi>
parents: 3255
diff changeset
420 if (getenv("MAIL_SAVE_CRLF") != NULL)
6a179bf1272e Moved several getenv()s from lib-storage to main code. deliver binary was
Timo Sirainen <tss@iki.fi>
parents: 3255
diff changeset
421 flags |= MAIL_STORAGE_FLAG_SAVE_CRLF;
3389
70c200deddf7 Parse also pop3_uidl_format setting for %m case, so we know to save the MD5
Timo Sirainen <tss@iki.fi>
parents: 3338
diff changeset
422
70c200deddf7 Parse also pop3_uidl_format setting for %m case, so we know to save the MD5
Timo Sirainen <tss@iki.fi>
parents: 3338
diff changeset
423 str = getenv("POP3_UIDL_FORMAT");
70c200deddf7 Parse also pop3_uidl_format setting for %m case, so we know to save the MD5
Timo Sirainen <tss@iki.fi>
parents: 3338
diff changeset
424 if (str != NULL && (str = strchr(str, '%')) != NULL &&
70c200deddf7 Parse also pop3_uidl_format setting for %m case, so we know to save the MD5
Timo Sirainen <tss@iki.fi>
parents: 3338
diff changeset
425 str != NULL && var_get_key(str + 1) == 'm')
70c200deddf7 Parse also pop3_uidl_format setting for %m case, so we know to save the MD5
Timo Sirainen <tss@iki.fi>
parents: 3338
diff changeset
426 flags |= MAIL_STORAGE_FLAG_KEEP_HEADER_MD5;
3260
6a179bf1272e Moved several getenv()s from lib-storage to main code. deliver binary was
Timo Sirainen <tss@iki.fi>
parents: 3255
diff changeset
427
6a179bf1272e Moved several getenv()s from lib-storage to main code. deliver binary was
Timo Sirainen <tss@iki.fi>
parents: 3255
diff changeset
428 str = getenv("LOCK_METHOD");
6a179bf1272e Moved several getenv()s from lib-storage to main code. deliver binary was
Timo Sirainen <tss@iki.fi>
parents: 3255
diff changeset
429 if (str == NULL || strcmp(str, "fcntl") == 0)
6a179bf1272e Moved several getenv()s from lib-storage to main code. deliver binary was
Timo Sirainen <tss@iki.fi>
parents: 3255
diff changeset
430 lock_method = MAIL_STORAGE_LOCK_FCNTL;
6a179bf1272e Moved several getenv()s from lib-storage to main code. deliver binary was
Timo Sirainen <tss@iki.fi>
parents: 3255
diff changeset
431 else if (strcmp(str, "flock") == 0)
6a179bf1272e Moved several getenv()s from lib-storage to main code. deliver binary was
Timo Sirainen <tss@iki.fi>
parents: 3255
diff changeset
432 lock_method = MAIL_STORAGE_LOCK_FLOCK;
6a179bf1272e Moved several getenv()s from lib-storage to main code. deliver binary was
Timo Sirainen <tss@iki.fi>
parents: 3255
diff changeset
433 else if (strcmp(str, "dotlock") == 0)
6a179bf1272e Moved several getenv()s from lib-storage to main code. deliver binary was
Timo Sirainen <tss@iki.fi>
parents: 3255
diff changeset
434 lock_method = MAIL_STORAGE_LOCK_DOTLOCK;
6a179bf1272e Moved several getenv()s from lib-storage to main code. deliver binary was
Timo Sirainen <tss@iki.fi>
parents: 3255
diff changeset
435 else
6a179bf1272e Moved several getenv()s from lib-storage to main code. deliver binary was
Timo Sirainen <tss@iki.fi>
parents: 3255
diff changeset
436 i_fatal("Unknown lock_method: %s", str);
6a179bf1272e Moved several getenv()s from lib-storage to main code. deliver binary was
Timo Sirainen <tss@iki.fi>
parents: 3255
diff changeset
437
3199
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
438 /* FIXME: how should we handle namespaces? */
3260
6a179bf1272e Moved several getenv()s from lib-storage to main code. deliver binary was
Timo Sirainen <tss@iki.fi>
parents: 3255
diff changeset
439 storage = mail_storage_create_with_data(mail, destination,
6a179bf1272e Moved several getenv()s from lib-storage to main code. deliver binary was
Timo Sirainen <tss@iki.fi>
parents: 3255
diff changeset
440 flags, lock_method);
3199
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
441 if (storage == NULL) {
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
442 i_fatal_status(EX_CONFIG,
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
443 "Failed to create storage for '%s' with mail '%s'",
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
444 destination, mail == NULL ? "(null)" : mail);
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
445 }
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
446
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
447 net_set_nonblock(0, TRUE);
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
448 input = i_stream_create_file(0, default_pool, 8192, FALSE);
3326
5949ce51755b save_mail() returns 0 if successful, not if failed..
Timo Sirainen <tss@iki.fi>
parents: 3260
diff changeset
449 if (save_mail(storage, "INBOX", input) < 0)
3199
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
450 return EX_TEMPFAIL;
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
451 i_stream_unref(input);
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
452
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
453 mail_storage_destroy(storage);
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
454 mail_storage_deinit();
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
455 io_loop_destroy(ioloop);
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
456 lib_deinit();
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
457
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
458 return EX_OK;
938f948651f1 Added initial version of Dovecot LDA.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
459 }