Mercurial > dovecot > original-hg > dovecot-1.2
annotate src/auth/db-checkpassword.c @ 9266:cd29b745c8dd HEAD
configure: clock_gettime()'s -lrt adding dropped everything else from $LIBS.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Mon, 27 Jul 2009 06:32:42 -0400 |
parents | b9faf4db2a9f |
children | 00cd9aacd03c |
rev | line source |
---|---|
8590
b9faf4db2a9f
Updated copyright notices to include year 2009.
Timo Sirainen <tss@iki.fi>
parents:
8359
diff
changeset
|
1 /* Copyright (c) 2004-2009 Dovecot authors, see the included COPYING file */ |
8307
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2 |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
3 #include "common.h" |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
4 |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
5 #if defined(PASSDB_CHECKPASSWORD) || defined(USERDB_CHECKPASSWORD) |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
6 |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
7 #include "db-checkpassword.h" |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
8 |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
9 static void env_put_extra_fields(const char *extra_fields) |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
10 { |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
11 const char *const *tmp; |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
12 const char *key, *p; |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
13 |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
14 for (tmp = t_strsplit(extra_fields, "\t"); *tmp != NULL; tmp++) { |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
15 key = t_str_ucase(t_strcut(*tmp, '=')); |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
16 p = strchr(*tmp, '='); |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
17 if (p == NULL) |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
18 env_put(t_strconcat(key, "=1", NULL)); |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
19 else |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
20 env_put(t_strconcat(key, p, NULL)); |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
21 } |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
22 } |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
23 |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
24 static void checkpassword_request_close(struct chkpw_auth_request *request) |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
25 { |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
26 if (request->io_in != NULL) |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
27 io_remove(&request->io_in); |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
28 if (request->io_out != NULL) |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
29 io_remove(&request->io_out); |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
30 |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
31 if (request->fd_in != -1) { |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
32 if (close(request->fd_in) < 0) |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
33 i_error("checkpassword: close() failed: %m"); |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
34 request->fd_in = -1; |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
35 } |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
36 if (request->fd_out != -1) { |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
37 if (close(request->fd_out) < 0) |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
38 i_error("checkpassword: close() failed: %m"); |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
39 } |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
40 } |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
41 |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
42 void checkpassword_request_free(struct chkpw_auth_request *request) |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
43 { |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
44 checkpassword_request_close(request); |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
45 if (request->input_buf != NULL) |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
46 str_free(&request->input_buf); |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
47 |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
48 if (request->password != NULL) { |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
49 safe_memset(request->password, 0, strlen(request->password)); |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
50 i_free(request->password); |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
51 } |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
52 i_free(request); |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
53 } |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
54 |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
55 enum checkpassword_sigchld_handler_result |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
56 checkpassword_sigchld_handler(const struct child_wait_status *child_wait_status, |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
57 struct chkpw_auth_request *request) |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
58 { |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
59 int status = child_wait_status->status; |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
60 pid_t pid = child_wait_status->pid; |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
61 |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
62 if (request == NULL) { |
8359 | 63 i_error("checkpassword: sighandler called for unknown child %s", |
64 dec2str(pid)); | |
8307
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
65 return SIGCHLD_RESULT_UNKNOWN_CHILD; |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
66 } |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
67 |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
68 if (WIFSIGNALED(status)) { |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
69 i_error("checkpassword: Child %s died with signal %d", |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
70 dec2str(pid), WTERMSIG(status)); |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
71 return SIGCHLD_RESULT_DEAD_CHILD; |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
72 } else if (WIFEXITED(status)) { |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
73 request->exited = TRUE; |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
74 request->exit_status = WEXITSTATUS(status); |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
75 |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
76 auth_request_log_debug(request->request, |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
77 "checkpassword", "exit_status=%d", |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
78 request->exit_status); |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
79 return SIGCHLD_RESULT_OK; |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
80 } else { |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
81 /* shouldn't happen */ |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
82 auth_request_log_debug(request->request, "checkpassword", |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
83 "Child exited with status=%d", status); |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
84 return SIGCHLD_RESULT_UNKNOWN_ERROR; |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
85 } |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
86 } |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
87 |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
88 void checkpassword_setup_env(struct auth_request *request) |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
89 { |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
90 /* Besides passing the standard username and password in a |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
91 pipe, also pass some other possibly interesting information |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
92 via environment. Use UCSPI names for local/remote IPs. */ |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
93 env_put("PROTO=TCP"); /* UCSPI */ |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
94 env_put(t_strconcat("SERVICE=", request->service, NULL)); |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
95 if (request->local_ip.family != 0) { |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
96 env_put(t_strconcat("TCPLOCALIP=", |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
97 net_ip2addr(&request->local_ip), NULL)); |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
98 /* FIXME: for backwards compatibility only, |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
99 remove some day */ |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
100 env_put(t_strconcat("LOCAL_IP=", |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
101 net_ip2addr(&request->local_ip), NULL)); |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
102 } |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
103 if (request->remote_ip.family != 0) { |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
104 env_put(t_strconcat("TCPREMOTEIP=", |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
105 net_ip2addr(&request->remote_ip), NULL)); |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
106 /* FIXME: for backwards compatibility only, |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
107 remove some day */ |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
108 env_put(t_strconcat("REMOTE_IP=", |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
109 net_ip2addr(&request->remote_ip), NULL)); |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
110 } |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
111 if (request->local_port != 0) { |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
112 env_put(t_strdup_printf("TCPLOCALPORT=%u", |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
113 request->local_port)); |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
114 } |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
115 if (request->remote_port != 0) { |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
116 env_put(t_strdup_printf("TCPREMOTEPORT=%u", |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
117 request->remote_port)); |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
118 } |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
119 if (request->master_user != NULL) { |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
120 env_put(t_strconcat("MASTER_USER=", |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
121 request->master_user, NULL)); |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
122 } |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
123 if (request->extra_fields != NULL) { |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
124 const char *fields = |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
125 auth_stream_reply_export(request->extra_fields); |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
126 |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
127 /* extra fields could come from master db */ |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
128 env_put_extra_fields(fields); |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
129 } |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
130 } |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
131 |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
132 void checkpassword_child_input(struct chkpw_auth_request *request) |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
133 { |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
134 unsigned char buf[1024]; |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
135 ssize_t ret; |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
136 |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
137 ret = read(request->fd_in, buf, sizeof(buf)); |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
138 if (ret <= 0) { |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
139 if (ret < 0) { |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
140 auth_request_log_error(request->request, |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
141 "checkpassword", "read() failed: %m"); |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
142 } |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
143 |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
144 auth_request_log_debug(request->request, "checkpassword", |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
145 "Received no input"); |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
146 checkpassword_request_close(request); |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
147 request->half_finish_callback(request); |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
148 } else { |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
149 if (request->input_buf == NULL) |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
150 request->input_buf = str_new(default_pool, 512); |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
151 str_append_n(request->input_buf, buf, ret); |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
152 |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
153 auth_request_log_debug(request->request, "checkpassword", |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
154 "Received input: %s", str_c(request->input_buf)); |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
155 } |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
156 } |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
157 |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
158 void checkpassword_child_output(struct chkpw_auth_request *request) |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
159 { |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
160 /* Send: username \0 password \0 timestamp \0. |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
161 Must be 512 bytes or less. The "timestamp" parameter is actually |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
162 useful only for APOP authentication. We don't support it, so |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
163 keep it empty */ |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
164 struct auth_request *auth_request = request->request; |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
165 buffer_t *buf; |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
166 const unsigned char *data; |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
167 size_t size; |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
168 ssize_t ret; |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
169 |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
170 buf = buffer_create_dynamic(pool_datastack_create(), 512+1); |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
171 buffer_append(buf, auth_request->user, strlen(auth_request->user)+1); |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
172 if (request->password != NULL) |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
173 buffer_append(buf, request->password, strlen(request->password)+1); |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
174 else |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
175 buffer_append_c(buf, '\0'); |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
176 buffer_append_c(buf, '\0'); |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
177 data = buffer_get_data(buf, &size); |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
178 |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
179 if (size > 512) { |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
180 auth_request_log_error(request->request, "checkpassword", |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
181 "output larger than 512 bytes: %"PRIuSIZE_T, size); |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
182 request->finish_callback(request, |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
183 request->internal_failure_code); |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
184 return; |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
185 } |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
186 |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
187 ret = write(request->fd_out, data + request->write_pos, |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
188 size - request->write_pos); |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
189 if (ret <= 0) { |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
190 if (ret < 0) { |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
191 auth_request_log_error(request->request, |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
192 "checkpassword", "write() failed: %m"); |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
193 } |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
194 request->finish_callback(request, |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
195 request->internal_failure_code); |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
196 return; |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
197 } |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
198 |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
199 request->write_pos += ret; |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
200 if (request->write_pos < size) |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
201 return; |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
202 |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
203 io_remove(&request->io_out); |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
204 |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
205 if (close(request->fd_out) < 0) |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
206 i_error("checkpassword: close() failed: %m"); |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
207 request->fd_out = -1; |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
208 } |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
209 |
33eae1ca0be0
Added support for userdb checkpassword. Patch by Sascha Wilde.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
210 #endif |