annotate src/auth/main.c @ 9608:f30e6a345d73 HEAD

Added tag 1.2.14 for changeset eb04e2b13e3d
author Timo Sirainen <tss@iki.fi>
date Tue, 24 Aug 2010 18:10:29 +0100
parents 00cd9aacd03c
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
9532
00cd9aacd03c Updated copyright notices to include year 2010.
Timo Sirainen <tss@iki.fi>
parents: 8889
diff changeset
1 /* Copyright (c) 2002-2010 Dovecot authors, see the included COPYING file */
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3 #include "common.h"
2075
5138b14889a6 dovecot-auth can now be run by itself, it listens in UNIX sockets specified
Timo Sirainen <tss@iki.fi>
parents: 2000
diff changeset
4 #include "buffer.h"
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
5 #include "ioloop.h"
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
6 #include "network.h"
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
7 #include "lib-signals.h"
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
8 #include "restrict-access.h"
727
8dd8ebe6bcac We use close-on-exec flag now to make sure that master process closes the
Timo Sirainen <tss@iki.fi>
parents: 699
diff changeset
9 #include "fd-close-on-exec.h"
8317
62e134c25a5e The new checkpassword code was still missing a bit to actually work.
Timo Sirainen <tss@iki.fi>
parents: 8219
diff changeset
10 #include "child-wait.h"
3943
cbe5c6772e0d Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
11 #include "sql-api.h"
6189
968430741daf Changed plugin handling. We'll just load and call _init() functions for all
Timo Sirainen <tss@iki.fi>
parents: 6187
diff changeset
12 #include "module-dir.h"
432
250a30e3cf70 Initialize random generator before chrooting so it can open /dev/urandom
Timo Sirainen <tss@iki.fi>
parents: 389
diff changeset
13 #include "randgen.h"
3065
29d83a8bb50d Reorganized the code to have less global/static variables.
Timo Sirainen <tss@iki.fi>
parents: 3064
diff changeset
14 #include "password-scheme.h"
1035
fe49ece0f3ea We have now separate "userdb" and "passdb". They aren't tied to each others
Timo Sirainen <tss@iki.fi>
parents: 998
diff changeset
15 #include "mech.h"
3065
29d83a8bb50d Reorganized the code to have less global/static variables.
Timo Sirainen <tss@iki.fi>
parents: 3064
diff changeset
16 #include "auth.h"
3074
3feb38ff17f5 Moving code around.
Timo Sirainen <tss@iki.fi>
parents: 3073
diff changeset
17 #include "auth-request-handler.h"
3166
e6a487d80288 Restructuring of auth code. Balancer auth processes were a bad idea. Usually
Timo Sirainen <tss@iki.fi>
parents: 3078
diff changeset
18 #include "auth-worker-server.h"
e6a487d80288 Restructuring of auth code. Balancer auth processes were a bad idea. Usually
Timo Sirainen <tss@iki.fi>
parents: 3078
diff changeset
19 #include "auth-worker-client.h"
3077
eb46a5dee02d Changed the way multiple auth processes are handled. It no longer uses a pid
Timo Sirainen <tss@iki.fi>
parents: 3075
diff changeset
20 #include "auth-master-interface.h"
3308
3f090bcaffcc Allow multiple master connections for a single listener.
Timo Sirainen <tss@iki.fi>
parents: 3307
diff changeset
21 #include "auth-master-listener.h"
1702
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents: 1499
diff changeset
22 #include "auth-master-connection.h"
43815588dd6b Moved client side code for auth process handling to lib-auth. Some other login process cleanups.
Timo Sirainen <tss@iki.fi>
parents: 1499
diff changeset
23 #include "auth-client-connection.h"
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
24
2236
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
25 #include <stdio.h>
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
26 #include <stdlib.h>
2075
5138b14889a6 dovecot-auth can now be run by itself, it listens in UNIX sockets specified
Timo Sirainen <tss@iki.fi>
parents: 2000
diff changeset
27 #include <unistd.h>
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
28 #include <syslog.h>
2236
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
29 #include <pwd.h>
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
30 #include <grp.h>
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
31 #include <sys/stat.h>
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
32
903
fd8888f6f037 Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents: 811
diff changeset
33 struct ioloop *ioloop;
8560
b6a7bc10c19a Replaced auth_worker_max_request_count setting with passdb pam { args = max_requests=n }
Timo Sirainen <tss@iki.fi>
parents: 8317
diff changeset
34 bool standalone = FALSE, worker = FALSE, shutdown_request = FALSE;
3073
7e0caae73c59 Require a valid timestamp in APOP challenge.
Timo Sirainen <tss@iki.fi>
parents: 3069
diff changeset
35 time_t process_start_time;
998
d0845dca7eca auth_verbose = yes logs now all authentication failures and some other
Timo Sirainen <tss@iki.fi>
parents: 925
diff changeset
36
6189
968430741daf Changed plugin handling. We'll just load and call _init() functions for all
Timo Sirainen <tss@iki.fi>
parents: 6187
diff changeset
37 static struct module *modules = NULL;
3065
29d83a8bb50d Reorganized the code to have less global/static variables.
Timo Sirainen <tss@iki.fi>
parents: 3064
diff changeset
38 static struct auth *auth;
3166
e6a487d80288 Restructuring of auth code. Balancer auth processes were a bad idea. Usually
Timo Sirainen <tss@iki.fi>
parents: 3078
diff changeset
39 static struct auth_worker_client *worker_client;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
40
8882
9f3968f49ceb lib-signals: Changed callback API to return siginfo_t.
Timo Sirainen <tss@iki.fi>
parents: 8830
diff changeset
41 static void sig_die(const siginfo_t *si, void *context ATTR_UNUSED)
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
42 {
3620
3360cc019737 Implemented new signal handling framework, which makes handling signals much
Timo Sirainen <tss@iki.fi>
parents: 3597
diff changeset
43 /* warn about being killed because of some signal, except SIGINT (^C)
3360cc019737 Implemented new signal handling framework, which makes handling signals much
Timo Sirainen <tss@iki.fi>
parents: 3597
diff changeset
44 which is too common at least while testing :) */
8883
5361cb6afe9e When a process is killed, show the signal code and the sending process's pid and uid.
Timo Sirainen <tss@iki.fi>
parents: 8882
diff changeset
45 if (si->si_signo != SIGINT) {
5361cb6afe9e When a process is killed, show the signal code and the sending process's pid and uid.
Timo Sirainen <tss@iki.fi>
parents: 8882
diff changeset
46 i_warning("Killed with signal %d (by pid=%s uid=%s code=%s)",
5361cb6afe9e When a process is killed, show the signal code and the sending process's pid and uid.
Timo Sirainen <tss@iki.fi>
parents: 8882
diff changeset
47 si->si_signo, dec2str(si->si_pid),
5361cb6afe9e When a process is killed, show the signal code and the sending process's pid and uid.
Timo Sirainen <tss@iki.fi>
parents: 8882
diff changeset
48 dec2str(si->si_uid),
5361cb6afe9e When a process is killed, show the signal code and the sending process's pid and uid.
Timo Sirainen <tss@iki.fi>
parents: 8882
diff changeset
49 lib_signal_code_to_str(si->si_signo, si->si_code));
5361cb6afe9e When a process is killed, show the signal code and the sending process's pid and uid.
Timo Sirainen <tss@iki.fi>
parents: 8882
diff changeset
50 }
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
51 io_loop_stop(ioloop);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
52 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
53
2075
5138b14889a6 dovecot-auth can now be run by itself, it listens in UNIX sockets specified
Timo Sirainen <tss@iki.fi>
parents: 2000
diff changeset
54 static void open_logfile(void)
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
55 {
3724
d22c883021da Added syslog_facility setting to config file.
Timo Sirainen <tss@iki.fi>
parents: 3689
diff changeset
56 const char *env;
d22c883021da Added syslog_facility setting to config file.
Timo Sirainen <tss@iki.fi>
parents: 3689
diff changeset
57
2075
5138b14889a6 dovecot-auth can now be run by itself, it listens in UNIX sockets specified
Timo Sirainen <tss@iki.fi>
parents: 2000
diff changeset
58 if (getenv("LOG_TO_MASTER") != NULL) {
5138b14889a6 dovecot-auth can now be run by itself, it listens in UNIX sockets specified
Timo Sirainen <tss@iki.fi>
parents: 2000
diff changeset
59 i_set_failure_internal();
5138b14889a6 dovecot-auth can now be run by itself, it listens in UNIX sockets specified
Timo Sirainen <tss@iki.fi>
parents: 2000
diff changeset
60 return;
5138b14889a6 dovecot-auth can now be run by itself, it listens in UNIX sockets specified
Timo Sirainen <tss@iki.fi>
parents: 2000
diff changeset
61 }
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
62
3724
d22c883021da Added syslog_facility setting to config file.
Timo Sirainen <tss@iki.fi>
parents: 3689
diff changeset
63 if (getenv("USE_SYSLOG") != NULL) {
d22c883021da Added syslog_facility setting to config file.
Timo Sirainen <tss@iki.fi>
parents: 3689
diff changeset
64 env = getenv("SYSLOG_FACILITY");
d22c883021da Added syslog_facility setting to config file.
Timo Sirainen <tss@iki.fi>
parents: 3689
diff changeset
65 i_set_failure_syslog("dovecot-auth", LOG_NDELAY,
d22c883021da Added syslog_facility setting to config file.
Timo Sirainen <tss@iki.fi>
parents: 3689
diff changeset
66 env == NULL ? LOG_MAIL : atoi(env));
d22c883021da Added syslog_facility setting to config file.
Timo Sirainen <tss@iki.fi>
parents: 3689
diff changeset
67 } else {
2075
5138b14889a6 dovecot-auth can now be run by itself, it listens in UNIX sockets specified
Timo Sirainen <tss@iki.fi>
parents: 2000
diff changeset
68 /* log to file or stderr */
5333
55260092b094 Fixes to handling log prefixes. imap/pop3 processes now log the
Timo Sirainen <tss@iki.fi>
parents: 5249
diff changeset
69 i_set_failure_file(getenv("LOGFILE"), "dovecot-auth: ");
680
84e398270f7f net_accept() returns now -2 for fatal failures.
Timo Sirainen <tss@iki.fi>
parents: 432
diff changeset
70 }
2075
5138b14889a6 dovecot-auth can now be run by itself, it listens in UNIX sockets specified
Timo Sirainen <tss@iki.fi>
parents: 2000
diff changeset
71
5138b14889a6 dovecot-auth can now be run by itself, it listens in UNIX sockets specified
Timo Sirainen <tss@iki.fi>
parents: 2000
diff changeset
72 if (getenv("INFOLOGFILE") != NULL)
5138b14889a6 dovecot-auth can now be run by itself, it listens in UNIX sockets specified
Timo Sirainen <tss@iki.fi>
parents: 2000
diff changeset
73 i_set_info_file(getenv("INFOLOGFILE"));
5138b14889a6 dovecot-auth can now be run by itself, it listens in UNIX sockets specified
Timo Sirainen <tss@iki.fi>
parents: 2000
diff changeset
74
5138b14889a6 dovecot-auth can now be run by itself, it listens in UNIX sockets specified
Timo Sirainen <tss@iki.fi>
parents: 2000
diff changeset
75 i_set_failure_timestamp_format(getenv("LOGSTAMP"));
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
76 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
77
2236
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
78 static uid_t get_uid(const char *user)
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
79 {
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
80 struct passwd *pw;
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
81
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
82 if (user == NULL)
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
83 return (uid_t)-1;
8618
8bda844b1ee5 Auth sockets: Allow specifying user and group with numbers.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
84 if (is_numeric(user, '\0'))
8bda844b1ee5 Auth sockets: Allow specifying user and group with numbers.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
85 return strtoul(user, NULL, 10);
2236
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
86
8830
d6acde4e9fe0 auth: Improved getpwnam() and getgrnam() error handling.
Timo Sirainen <tss@iki.fi>
parents: 8618
diff changeset
87 errno = 0;
d6acde4e9fe0 auth: Improved getpwnam() and getgrnam() error handling.
Timo Sirainen <tss@iki.fi>
parents: 8618
diff changeset
88 if ((pw = getpwnam(user)) == NULL) {
d6acde4e9fe0 auth: Improved getpwnam() and getgrnam() error handling.
Timo Sirainen <tss@iki.fi>
parents: 8618
diff changeset
89 if (errno != 0)
d6acde4e9fe0 auth: Improved getpwnam() and getgrnam() error handling.
Timo Sirainen <tss@iki.fi>
parents: 8618
diff changeset
90 i_fatal("User '%s' lookup failed: %m", user);
d6acde4e9fe0 auth: Improved getpwnam() and getgrnam() error handling.
Timo Sirainen <tss@iki.fi>
parents: 8618
diff changeset
91 setpwent();
d6acde4e9fe0 auth: Improved getpwnam() and getgrnam() error handling.
Timo Sirainen <tss@iki.fi>
parents: 8618
diff changeset
92 if (getpwent() == NULL) {
d6acde4e9fe0 auth: Improved getpwnam() and getgrnam() error handling.
Timo Sirainen <tss@iki.fi>
parents: 8618
diff changeset
93 if (errno != 0)
d6acde4e9fe0 auth: Improved getpwnam() and getgrnam() error handling.
Timo Sirainen <tss@iki.fi>
parents: 8618
diff changeset
94 i_fatal("getpwent() failed: %m");
d6acde4e9fe0 auth: Improved getpwnam() and getgrnam() error handling.
Timo Sirainen <tss@iki.fi>
parents: 8618
diff changeset
95 i_fatal("getpwnam() failed for some reason. "
d6acde4e9fe0 auth: Improved getpwnam() and getgrnam() error handling.
Timo Sirainen <tss@iki.fi>
parents: 8618
diff changeset
96 "Is auth_process_size set to too low?");
d6acde4e9fe0 auth: Improved getpwnam() and getgrnam() error handling.
Timo Sirainen <tss@iki.fi>
parents: 8618
diff changeset
97 }
2236
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
98 i_fatal("User doesn't exist: %s", user);
8830
d6acde4e9fe0 auth: Improved getpwnam() and getgrnam() error handling.
Timo Sirainen <tss@iki.fi>
parents: 8618
diff changeset
99 }
2236
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
100 return pw->pw_uid;
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
101 }
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
102
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
103 static gid_t get_gid(const char *group)
2075
5138b14889a6 dovecot-auth can now be run by itself, it listens in UNIX sockets specified
Timo Sirainen <tss@iki.fi>
parents: 2000
diff changeset
104 {
2236
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
105 struct group *gr;
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
106
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
107 if (group == NULL)
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
108 return (gid_t)-1;
8618
8bda844b1ee5 Auth sockets: Allow specifying user and group with numbers.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
109 if (is_numeric(group, '\0'))
8bda844b1ee5 Auth sockets: Allow specifying user and group with numbers.
Timo Sirainen <tss@iki.fi>
parents: 8593
diff changeset
110 return strtoul(group, NULL, 10);
2236
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
111
8830
d6acde4e9fe0 auth: Improved getpwnam() and getgrnam() error handling.
Timo Sirainen <tss@iki.fi>
parents: 8618
diff changeset
112 errno = 0;
d6acde4e9fe0 auth: Improved getpwnam() and getgrnam() error handling.
Timo Sirainen <tss@iki.fi>
parents: 8618
diff changeset
113 if ((gr = getgrnam(group)) == NULL) {
d6acde4e9fe0 auth: Improved getpwnam() and getgrnam() error handling.
Timo Sirainen <tss@iki.fi>
parents: 8618
diff changeset
114 if (errno != 0)
d6acde4e9fe0 auth: Improved getpwnam() and getgrnam() error handling.
Timo Sirainen <tss@iki.fi>
parents: 8618
diff changeset
115 i_fatal("Group '%s' lookup failed: %m", group);
d6acde4e9fe0 auth: Improved getpwnam() and getgrnam() error handling.
Timo Sirainen <tss@iki.fi>
parents: 8618
diff changeset
116 else
d6acde4e9fe0 auth: Improved getpwnam() and getgrnam() error handling.
Timo Sirainen <tss@iki.fi>
parents: 8618
diff changeset
117 i_fatal("Group doesn't exist: %s", group);
d6acde4e9fe0 auth: Improved getpwnam() and getgrnam() error handling.
Timo Sirainen <tss@iki.fi>
parents: 8618
diff changeset
118 }
2236
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
119 return gr->gr_gid;
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
120 }
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
121
3075
9cb91ed5a110 Added backlog parameter for net_listen*().
Timo Sirainen <tss@iki.fi>
parents: 3074
diff changeset
122 static int create_unix_listener(const char *env, int backlog)
2236
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
123 {
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
124 const char *path, *mode, *user, *group;
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
125 mode_t old_umask;
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
126 unsigned int mask;
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
127 uid_t uid;
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
128 gid_t gid;
8219
ec83f6dcb585 Added net_listen_unix_unlink_stale() and use it where needed to avoid code duplication.
Timo Sirainen <tss@iki.fi>
parents: 8069
diff changeset
129 int fd;
2236
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
130
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
131 path = getenv(env);
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
132 if (path == NULL)
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
133 return -1;
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
134
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
135 mode = getenv(t_strdup_printf("%s_MODE", env));
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
136 if (mode == NULL)
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
137 mask = 0177; /* default to 0600 */
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
138 else {
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
139 if (sscanf(mode, "%o", &mask) != 1)
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
140 i_fatal("%s: Invalid mode %s", env, mode);
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
141 mask = (mask ^ 0777) & 0777;
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
142 }
2075
5138b14889a6 dovecot-auth can now be run by itself, it listens in UNIX sockets specified
Timo Sirainen <tss@iki.fi>
parents: 2000
diff changeset
143
2236
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
144 old_umask = umask(mask);
8219
ec83f6dcb585 Added net_listen_unix_unlink_stale() and use it where needed to avoid code duplication.
Timo Sirainen <tss@iki.fi>
parents: 8069
diff changeset
145 fd = net_listen_unix_unlink_stale(path, backlog);
ec83f6dcb585 Added net_listen_unix_unlink_stale() and use it where needed to avoid code duplication.
Timo Sirainen <tss@iki.fi>
parents: 8069
diff changeset
146 umask(old_umask);
ec83f6dcb585 Added net_listen_unix_unlink_stale() and use it where needed to avoid code duplication.
Timo Sirainen <tss@iki.fi>
parents: 8069
diff changeset
147 if (fd == -1) {
ec83f6dcb585 Added net_listen_unix_unlink_stale() and use it where needed to avoid code duplication.
Timo Sirainen <tss@iki.fi>
parents: 8069
diff changeset
148 if (errno == EADDRINUSE)
ec83f6dcb585 Added net_listen_unix_unlink_stale() and use it where needed to avoid code duplication.
Timo Sirainen <tss@iki.fi>
parents: 8069
diff changeset
149 i_fatal("Socket already exists: %s", path);
ec83f6dcb585 Added net_listen_unix_unlink_stale() and use it where needed to avoid code duplication.
Timo Sirainen <tss@iki.fi>
parents: 8069
diff changeset
150 else
2236
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
151 i_fatal("net_listen_unix(%s) failed: %m", path);
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
152 }
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
153
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
154 user = getenv(t_strdup_printf("%s_USER", env));
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
155 group = getenv(t_strdup_printf("%s_GROUP", env));
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
156
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
157 uid = get_uid(user); gid = get_gid(group);
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
158 if (chown(path, uid, gid) < 0) {
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
159 i_fatal("chown(%s, %s, %s) failed: %m",
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
160 path, dec2str(uid), dec2str(gid));
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
161 }
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
162
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
163 return fd;
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
164 }
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
165
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
166 static void add_extra_listeners(void)
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
167 {
3308
3f090bcaffcc Allow multiple master connections for a single listener.
Timo Sirainen <tss@iki.fi>
parents: 3307
diff changeset
168 struct auth_master_listener *listener;
2236
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
169 const char *str, *client_path, *master_path;
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
170 int client_fd, master_fd;
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
171 unsigned int i;
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
172
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
173 for (i = 1;; i++) {
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
174 client_path = getenv(t_strdup_printf("AUTH_%u", i));
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
175 master_path = getenv(t_strdup_printf("AUTH_%u_MASTER", i));
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
176 if (client_path == NULL && master_path == NULL)
2236
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
177 break;
2075
5138b14889a6 dovecot-auth can now be run by itself, it listens in UNIX sockets specified
Timo Sirainen <tss@iki.fi>
parents: 2000
diff changeset
178
2236
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
179 str = t_strdup_printf("AUTH_%u", i);
8593
3cccf56e802a Increase listen queues to handle high loads better.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
180 client_fd = create_unix_listener(str, 128);
2236
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
181 str = t_strdup_printf("AUTH_%u_MASTER", i);
8593
3cccf56e802a Increase listen queues to handle high loads better.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
182 master_fd = create_unix_listener(str, 128);
2236
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
183
3308
3f090bcaffcc Allow multiple master connections for a single listener.
Timo Sirainen <tss@iki.fi>
parents: 3307
diff changeset
184 listener = auth_master_listener_create(auth);
2236
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
185 if (master_fd != -1) {
3308
3f090bcaffcc Allow multiple master connections for a single listener.
Timo Sirainen <tss@iki.fi>
parents: 3307
diff changeset
186 auth_master_listener_add(listener, master_fd,
3f090bcaffcc Allow multiple master connections for a single listener.
Timo Sirainen <tss@iki.fi>
parents: 3307
diff changeset
187 master_path, LISTENER_MASTER);
2236
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
188 }
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
189 if (client_fd != -1) {
3308
3f090bcaffcc Allow multiple master connections for a single listener.
Timo Sirainen <tss@iki.fi>
parents: 3307
diff changeset
190 auth_master_listener_add(listener, client_fd,
3f090bcaffcc Allow multiple master connections for a single listener.
Timo Sirainen <tss@iki.fi>
parents: 3307
diff changeset
191 client_path, LISTENER_CLIENT);
2236
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
192 }
2075
5138b14889a6 dovecot-auth can now be run by itself, it listens in UNIX sockets specified
Timo Sirainen <tss@iki.fi>
parents: 2000
diff changeset
193 }
5138b14889a6 dovecot-auth can now be run by itself, it listens in UNIX sockets specified
Timo Sirainen <tss@iki.fi>
parents: 2000
diff changeset
194 }
5138b14889a6 dovecot-auth can now be run by itself, it listens in UNIX sockets specified
Timo Sirainen <tss@iki.fi>
parents: 2000
diff changeset
195
3011
ea37520d92e3 Fixes for using socket listen { .. } in auth sections.
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
196 static void drop_privileges(void)
ea37520d92e3 Fixes for using socket listen { .. } in auth sections.
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
197 {
6190
141c3abcac56 If version_ignore=yes, ignore plugin versions also.
Timo Sirainen <tss@iki.fi>
parents: 6189
diff changeset
198 const char *version;
141c3abcac56 If version_ignore=yes, ignore plugin versions also.
Timo Sirainen <tss@iki.fi>
parents: 6189
diff changeset
199
141c3abcac56 If version_ignore=yes, ignore plugin versions also.
Timo Sirainen <tss@iki.fi>
parents: 6189
diff changeset
200 version = getenv("DOVECOT_VERSION");
141c3abcac56 If version_ignore=yes, ignore plugin versions also.
Timo Sirainen <tss@iki.fi>
parents: 6189
diff changeset
201 if (version != NULL && strcmp(version, PACKAGE_VERSION) != 0) {
141c3abcac56 If version_ignore=yes, ignore plugin versions also.
Timo Sirainen <tss@iki.fi>
parents: 6189
diff changeset
202 i_fatal("Dovecot version mismatch: "
141c3abcac56 If version_ignore=yes, ignore plugin versions also.
Timo Sirainen <tss@iki.fi>
parents: 6189
diff changeset
203 "Master is v%s, dovecot-auth is v"PACKAGE_VERSION" "
141c3abcac56 If version_ignore=yes, ignore plugin versions also.
Timo Sirainen <tss@iki.fi>
parents: 6189
diff changeset
204 "(if you don't care, set version_ignore=yes)", version);
141c3abcac56 If version_ignore=yes, ignore plugin versions also.
Timo Sirainen <tss@iki.fi>
parents: 6189
diff changeset
205 }
141c3abcac56 If version_ignore=yes, ignore plugin versions also.
Timo Sirainen <tss@iki.fi>
parents: 6189
diff changeset
206
8069
6396a64b0fcb dovecot-auth: Give a nice error message if you try to run it manually.
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
207 standalone = getenv("DOVECOT_MASTER") == NULL;
6396a64b0fcb dovecot-auth: Give a nice error message if you try to run it manually.
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
208 if (standalone && getenv("AUTH_1") == NULL) {
6396a64b0fcb dovecot-auth: Give a nice error message if you try to run it manually.
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
209 i_fatal("dovecot-auth is usually started through "
6396a64b0fcb dovecot-auth: Give a nice error message if you try to run it manually.
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
210 "dovecot master process. If you wish to run "
6396a64b0fcb dovecot-auth: Give a nice error message if you try to run it manually.
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
211 "it standalone, you'll need to set AUTH_* "
6396a64b0fcb dovecot-auth: Give a nice error message if you try to run it manually.
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
212 "environment variables (AUTH_1 isn't set).");
6396a64b0fcb dovecot-auth: Give a nice error message if you try to run it manually.
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
213 }
6396a64b0fcb dovecot-auth: Give a nice error message if you try to run it manually.
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
214
3011
ea37520d92e3 Fixes for using socket listen { .. } in auth sections.
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
215 open_logfile();
ea37520d92e3 Fixes for using socket listen { .. } in auth sections.
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
216
ea37520d92e3 Fixes for using socket listen { .. } in auth sections.
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
217 /* Open /dev/urandom before chrooting */
ea37520d92e3 Fixes for using socket listen { .. } in auth sections.
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
218 random_init();
ea37520d92e3 Fixes for using socket listen { .. } in auth sections.
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
219
3943
cbe5c6772e0d Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
220 /* Load built-in SQL drivers (if any) */
cbe5c6772e0d Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
221 sql_drivers_init();
cbe5c6772e0d Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
222 sql_drivers_register_all();
cbe5c6772e0d Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
223
3011
ea37520d92e3 Fixes for using socket listen { .. } in auth sections.
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
224 /* Initialize databases so their configuration files can be readable
ea37520d92e3 Fixes for using socket listen { .. } in auth sections.
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
225 only by root. Also load all modules here. */
6187
7c81e6d848f6 Added pass/userdb_register_module() functions and used them to register the
Timo Sirainen <tss@iki.fi>
parents: 5333
diff changeset
226 passdbs_init();
7c81e6d848f6 Added pass/userdb_register_module() functions and used them to register the
Timo Sirainen <tss@iki.fi>
parents: 5333
diff changeset
227 userdbs_init();
6190
141c3abcac56 If version_ignore=yes, ignore plugin versions also.
Timo Sirainen <tss@iki.fi>
parents: 6189
diff changeset
228 modules = module_dir_load(AUTH_MODULE_DIR, NULL, TRUE, version);
6197
a2891c9296ee Plugin handling fixes.
Timo Sirainen <tss@iki.fi>
parents: 6190
diff changeset
229 module_dir_init(modules);
3065
29d83a8bb50d Reorganized the code to have less global/static variables.
Timo Sirainen <tss@iki.fi>
parents: 3064
diff changeset
230 auth = auth_preinit();
3308
3f090bcaffcc Allow multiple master connections for a single listener.
Timo Sirainen <tss@iki.fi>
parents: 3307
diff changeset
231 auth_master_listeners_init();
3166
e6a487d80288 Restructuring of auth code. Balancer auth processes were a bad idea. Usually
Timo Sirainen <tss@iki.fi>
parents: 3078
diff changeset
232 if (!worker)
3077
eb46a5dee02d Changed the way multiple auth processes are handled. It no longer uses a pid
Timo Sirainen <tss@iki.fi>
parents: 3075
diff changeset
233 add_extra_listeners();
3011
ea37520d92e3 Fixes for using socket listen { .. } in auth sections.
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
234
ea37520d92e3 Fixes for using socket listen { .. } in auth sections.
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
235 /* Password lookups etc. may require roots, allow it. */
7109
e6823d781317 Reverted "environment array" changes. It broke overriding imap/pop3 settings
Timo Sirainen <tss@iki.fi>
parents: 7091
diff changeset
236 restrict_access_by_env(FALSE);
8889
c5cb1f27caea Try to make sure auth process can dump core, and if it can't try to find why.
Timo Sirainen <tss@iki.fi>
parents: 8883
diff changeset
237 restrict_access_allow_coredumps(TRUE);
3011
ea37520d92e3 Fixes for using socket listen { .. } in auth sections.
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
238 }
ea37520d92e3 Fixes for using socket listen { .. } in auth sections.
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
239
3863
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 3729
diff changeset
240 static void main_init(bool nodaemon)
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
241 {
3308
3f090bcaffcc Allow multiple master connections for a single listener.
Timo Sirainen <tss@iki.fi>
parents: 3307
diff changeset
242 struct auth_master_listener *listener;
3074
3feb38ff17f5 Moving code around.
Timo Sirainen <tss@iki.fi>
parents: 3073
diff changeset
243
3077
eb46a5dee02d Changed the way multiple auth processes are handled. It no longer uses a pid
Timo Sirainen <tss@iki.fi>
parents: 3075
diff changeset
244 process_start_time = ioloop_time;
3620
3360cc019737 Implemented new signal handling framework, which makes handling signals much
Timo Sirainen <tss@iki.fi>
parents: 3597
diff changeset
245
3360cc019737 Implemented new signal handling framework, which makes handling signals much
Timo Sirainen <tss@iki.fi>
parents: 3597
diff changeset
246 lib_signals_init();
3360cc019737 Implemented new signal handling framework, which makes handling signals much
Timo Sirainen <tss@iki.fi>
parents: 3597
diff changeset
247 lib_signals_set_handler(SIGINT, TRUE, sig_die, NULL);
3360cc019737 Implemented new signal handling framework, which makes handling signals much
Timo Sirainen <tss@iki.fi>
parents: 3597
diff changeset
248 lib_signals_set_handler(SIGTERM, TRUE, sig_die, NULL);
4903
204d7edc7cdc Added context parameter type safety checks for most callback APIs.
Timo Sirainen <tss@iki.fi>
parents: 4553
diff changeset
249 lib_signals_ignore(SIGPIPE, TRUE);
204d7edc7cdc Added context parameter type safety checks for most callback APIs.
Timo Sirainen <tss@iki.fi>
parents: 4553
diff changeset
250 lib_signals_ignore(SIGALRM, FALSE);
3073
7e0caae73c59 Require a valid timestamp in APOP challenge.
Timo Sirainen <tss@iki.fi>
parents: 3069
diff changeset
251
3643
5207179e47de Don't crash with SIGHUP/SIGUSR2 if auth_cache isn't used
Timo Sirainen <tss@iki.fi>
parents: 3620
diff changeset
252 /* If auth caches aren't used, just ignore these signals */
4903
204d7edc7cdc Added context parameter type safety checks for most callback APIs.
Timo Sirainen <tss@iki.fi>
parents: 4553
diff changeset
253 lib_signals_ignore(SIGHUP, TRUE);
204d7edc7cdc Added context parameter type safety checks for most callback APIs.
Timo Sirainen <tss@iki.fi>
parents: 4553
diff changeset
254 lib_signals_ignore(SIGUSR2, TRUE);
3643
5207179e47de Don't crash with SIGHUP/SIGUSR2 if auth_cache isn't used
Timo Sirainen <tss@iki.fi>
parents: 3620
diff changeset
255
8317
62e134c25a5e The new checkpassword code was still missing a bit to actually work.
Timo Sirainen <tss@iki.fi>
parents: 8219
diff changeset
256 child_wait_init();
3065
29d83a8bb50d Reorganized the code to have less global/static variables.
Timo Sirainen <tss@iki.fi>
parents: 3064
diff changeset
257 mech_init();
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
258 password_schemes_init();
3065
29d83a8bb50d Reorganized the code to have less global/static variables.
Timo Sirainen <tss@iki.fi>
parents: 3064
diff changeset
259 auth_init(auth);
3166
e6a487d80288 Restructuring of auth code. Balancer auth processes were a bad idea. Usually
Timo Sirainen <tss@iki.fi>
parents: 3078
diff changeset
260 auth_request_handler_init();
2649
ec268f32e69e finish the preinit change..
Timo Sirainen <tss@iki.fi>
parents: 2516
diff changeset
261
3166
e6a487d80288 Restructuring of auth code. Balancer auth processes were a bad idea. Usually
Timo Sirainen <tss@iki.fi>
parents: 3078
diff changeset
262 if (worker) {
e6a487d80288 Restructuring of auth code. Balancer auth processes were a bad idea. Usually
Timo Sirainen <tss@iki.fi>
parents: 3078
diff changeset
263 worker_client =
e6a487d80288 Restructuring of auth code. Balancer auth processes were a bad idea. Usually
Timo Sirainen <tss@iki.fi>
parents: 3078
diff changeset
264 auth_worker_client_create(auth, WORKER_SERVER_FD);
e6a487d80288 Restructuring of auth code. Balancer auth processes were a bad idea. Usually
Timo Sirainen <tss@iki.fi>
parents: 3078
diff changeset
265 return;
e6a487d80288 Restructuring of auth code. Balancer auth processes were a bad idea. Usually
Timo Sirainen <tss@iki.fi>
parents: 3078
diff changeset
266 }
1035
fe49ece0f3ea We have now separate "userdb" and "passdb". They aren't tied to each others
Timo Sirainen <tss@iki.fi>
parents: 998
diff changeset
267
8069
6396a64b0fcb dovecot-auth: Give a nice error message if you try to run it manually.
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
268 if (getenv("DOVECOT_MASTER") == NULL) {
2075
5138b14889a6 dovecot-auth can now be run by itself, it listens in UNIX sockets specified
Timo Sirainen <tss@iki.fi>
parents: 2000
diff changeset
269 /* starting standalone */
2236
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
270 if (!nodaemon) {
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
271 switch (fork()) {
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
272 case -1:
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
273 i_fatal("fork() failed: %m");
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
274 case 0:
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
275 break;
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
276 default:
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
277 exit(0);
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
278 }
925
2e649dec0f09 Auth and login processes send an "we're ok" reply at the end of
Timo Sirainen <tss@iki.fi>
parents: 903
diff changeset
279
2236
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
280 if (setsid() < 0)
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
281 i_fatal("setsid() failed: %m");
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
282
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
283 if (chdir("/") < 0)
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
284 i_fatal("chdir(/) failed: %m");
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
285 }
3166
e6a487d80288 Restructuring of auth code. Balancer auth processes were a bad idea. Usually
Timo Sirainen <tss@iki.fi>
parents: 3078
diff changeset
286 } else {
3308
3f090bcaffcc Allow multiple master connections for a single listener.
Timo Sirainen <tss@iki.fi>
parents: 3307
diff changeset
287 listener = auth_master_listener_create(auth);
3f090bcaffcc Allow multiple master connections for a single listener.
Timo Sirainen <tss@iki.fi>
parents: 3307
diff changeset
288 (void)auth_master_connection_create(listener, MASTER_SOCKET_FD);
3f090bcaffcc Allow multiple master connections for a single listener.
Timo Sirainen <tss@iki.fi>
parents: 3307
diff changeset
289 auth_master_listener_add(listener, CLIENT_LISTEN_FD,
3f090bcaffcc Allow multiple master connections for a single listener.
Timo Sirainen <tss@iki.fi>
parents: 3307
diff changeset
290 NULL, LISTENER_CLIENT);
2075
5138b14889a6 dovecot-auth can now be run by itself, it listens in UNIX sockets specified
Timo Sirainen <tss@iki.fi>
parents: 2000
diff changeset
291 }
5138b14889a6 dovecot-auth can now be run by itself, it listens in UNIX sockets specified
Timo Sirainen <tss@iki.fi>
parents: 2000
diff changeset
292
5138b14889a6 dovecot-auth can now be run by itself, it listens in UNIX sockets specified
Timo Sirainen <tss@iki.fi>
parents: 2000
diff changeset
293 /* everything initialized, notify masters that all is well */
3308
3f090bcaffcc Allow multiple master connections for a single listener.
Timo Sirainen <tss@iki.fi>
parents: 3307
diff changeset
294 auth_master_listeners_send_handshake();
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
295 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
296
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
297 static void main_deinit(void)
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
298 {
3166
e6a487d80288 Restructuring of auth code. Balancer auth processes were a bad idea. Usually
Timo Sirainen <tss@iki.fi>
parents: 3078
diff changeset
299 if (worker_client != NULL)
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
300 auth_worker_client_unref(&worker_client);
3307
38754475d3b6 Exit only if all master connections are lost, not only if one of them is.
Timo Sirainen <tss@iki.fi>
parents: 3183
diff changeset
301 else
7088
958500009336 Make sure failed auth requests stay in failure buffer for at least a second.
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
302 auth_request_handler_flush_failures(TRUE);
3077
eb46a5dee02d Changed the way multiple auth processes are handled. It no longer uses a pid
Timo Sirainen <tss@iki.fi>
parents: 3075
diff changeset
303
3414
c2497d4c60c9 Auth workers were leaking memory for each request. Fixed also a few invalid
Timo Sirainen <tss@iki.fi>
parents: 3308
diff changeset
304 auth_worker_server_deinit();
3308
3f090bcaffcc Allow multiple master connections for a single listener.
Timo Sirainen <tss@iki.fi>
parents: 3307
diff changeset
305 auth_master_listeners_deinit();
6189
968430741daf Changed plugin handling. We'll just load and call _init() functions for all
Timo Sirainen <tss@iki.fi>
parents: 6187
diff changeset
306
6197
a2891c9296ee Plugin handling fixes.
Timo Sirainen <tss@iki.fi>
parents: 6190
diff changeset
307 auth_deinit(&auth);
6189
968430741daf Changed plugin handling. We'll just load and call _init() functions for all
Timo Sirainen <tss@iki.fi>
parents: 6187
diff changeset
308 module_dir_unload(&modules);
6187
7c81e6d848f6 Added pass/userdb_register_module() functions and used them to register the
Timo Sirainen <tss@iki.fi>
parents: 5333
diff changeset
309 userdbs_deinit();
7c81e6d848f6 Added pass/userdb_register_module() functions and used them to register the
Timo Sirainen <tss@iki.fi>
parents: 5333
diff changeset
310 passdbs_deinit();
1035
fe49ece0f3ea We have now separate "userdb" and "passdb". They aren't tied to each others
Timo Sirainen <tss@iki.fi>
parents: 998
diff changeset
311 mech_deinit();
fe49ece0f3ea We have now separate "userdb" and "passdb". They aren't tied to each others
Timo Sirainen <tss@iki.fi>
parents: 998
diff changeset
312
3166
e6a487d80288 Restructuring of auth code. Balancer auth processes were a bad idea. Usually
Timo Sirainen <tss@iki.fi>
parents: 3078
diff changeset
313 password_schemes_deinit();
3943
cbe5c6772e0d Added support for dynamically building SQL drivers.
Timo Sirainen <tss@iki.fi>
parents: 3879
diff changeset
314 sql_drivers_deinit();
432
250a30e3cf70 Initialize random generator before chrooting so it can open /dev/urandom
Timo Sirainen <tss@iki.fi>
parents: 389
diff changeset
315 random_deinit();
250a30e3cf70 Initialize random generator before chrooting so it can open /dev/urandom
Timo Sirainen <tss@iki.fi>
parents: 389
diff changeset
316
8317
62e134c25a5e The new checkpassword code was still missing a bit to actually work.
Timo Sirainen <tss@iki.fi>
parents: 8219
diff changeset
317 child_wait_deinit();
3620
3360cc019737 Implemented new signal handling framework, which makes handling signals much
Timo Sirainen <tss@iki.fi>
parents: 3597
diff changeset
318 lib_signals_deinit();
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
319 closelog();
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
320 }
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
321
6411
6a64e64fa3a3 Renamed __attr_*__ to ATTR_*. Renamed __attrs_used__ to ATTRS_DEFINED.
Timo Sirainen <tss@iki.fi>
parents: 6197
diff changeset
322 int main(int argc ATTR_UNUSED, char *argv[])
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
323 {
3863
55df57c028d4 Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents: 3729
diff changeset
324 bool foreground = FALSE;
3077
eb46a5dee02d Changed the way multiple auth processes are handled. It no longer uses a pid
Timo Sirainen <tss@iki.fi>
parents: 3075
diff changeset
325
727
8dd8ebe6bcac We use close-on-exec flag now to make sure that master process closes the
Timo Sirainen <tss@iki.fi>
parents: 699
diff changeset
326 #ifdef DEBUG
2236
43b82a35888d Dovecot can now connect to externally running dovecot-auth.
Timo Sirainen <tss@iki.fi>
parents: 2102
diff changeset
327 if (getenv("GDB") == NULL)
3166
e6a487d80288 Restructuring of auth code. Balancer auth processes were a bad idea. Usually
Timo Sirainen <tss@iki.fi>
parents: 3078
diff changeset
328 fd_debug_verify_leaks(WORKER_SERVER_FD + 1, 1024);
727
8dd8ebe6bcac We use close-on-exec flag now to make sure that master process closes the
Timo Sirainen <tss@iki.fi>
parents: 699
diff changeset
329 #endif
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
330 /* NOTE: we start rooted, so keep the code minimal until
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
331 restrict_access_by_env() is called */
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
332 lib_init();
5249
784dc7224718 Removed pool parameter from io_loop_create()
Timo Sirainen <tss@iki.fi>
parents: 5038
diff changeset
333 ioloop = io_loop_create();
801
86224ff16bf6 Drop root privileges earlier. Close syslog more later in imap-master when
Timo Sirainen <tss@iki.fi>
parents: 727
diff changeset
334
3077
eb46a5dee02d Changed the way multiple auth processes are handled. It no longer uses a pid
Timo Sirainen <tss@iki.fi>
parents: 3075
diff changeset
335 while (argv[1] != NULL) {
eb46a5dee02d Changed the way multiple auth processes are handled. It no longer uses a pid
Timo Sirainen <tss@iki.fi>
parents: 3075
diff changeset
336 if (strcmp(argv[1], "-F") == 0)
eb46a5dee02d Changed the way multiple auth processes are handled. It no longer uses a pid
Timo Sirainen <tss@iki.fi>
parents: 3075
diff changeset
337 foreground = TRUE;
3166
e6a487d80288 Restructuring of auth code. Balancer auth processes were a bad idea. Usually
Timo Sirainen <tss@iki.fi>
parents: 3078
diff changeset
338 else if (strcmp(argv[1], "-w") == 0)
e6a487d80288 Restructuring of auth code. Balancer auth processes were a bad idea. Usually
Timo Sirainen <tss@iki.fi>
parents: 3078
diff changeset
339 worker = TRUE;
3077
eb46a5dee02d Changed the way multiple auth processes are handled. It no longer uses a pid
Timo Sirainen <tss@iki.fi>
parents: 3075
diff changeset
340 argv++;
eb46a5dee02d Changed the way multiple auth processes are handled. It no longer uses a pid
Timo Sirainen <tss@iki.fi>
parents: 3075
diff changeset
341 }
eb46a5dee02d Changed the way multiple auth processes are handled. It no longer uses a pid
Timo Sirainen <tss@iki.fi>
parents: 3075
diff changeset
342
7226
e6693a0ec8e1 Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents: 7109
diff changeset
343 T_BEGIN {
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
344 drop_privileges();
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
345 main_init(foreground);
7226
e6693a0ec8e1 Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents: 7109
diff changeset
346 } T_END;
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
347 io_loop_run(ioloop);
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
348 main_deinit();
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
349
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
350 io_loop_destroy(&ioloop);
0
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
351 lib_deinit();
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
352
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
353 return 0;
3b1985cbc908 Initial revision
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
354 }