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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
54ff30d93cab Compiler warning fixes
Timo Sirainen <tss@iki.fi>
parents: 8307
diff changeset
63 i_error("checkpassword: sighandler called for unknown child %s",
54ff30d93cab Compiler warning fixes
Timo Sirainen <tss@iki.fi>
parents: 8307
diff changeset
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