login-connection.c revision 9de5eb9e1ac3a07c4197a60fdefd412d6cc78eb2
816bf6f8088b162b681101d93fd450127a0e586fJulian Kornberger/* Copyright (c) 2010-2015 Dovecot authors, see the included COPYING file */
23f0ab4a423943eb59109df37074ef0c330d07c0Tim Reddehasestatic struct login_connection *login_connections;
db8aaeeeb3b24f487a5d02c60d18e96e55f6ba85Tim Reddehasestatic void auth_input_line(const char *line, void *context);
db8aaeeeb3b24f487a5d02c60d18e96e55f6ba85Tim Reddehasestatic void login_connection_unref(struct login_connection **_conn);
23f0ab4a423943eb59109df37074ef0c330d07c0Tim Reddehasestatic void login_connection_input(struct login_connection *conn)
23f0ab4a423943eb59109df37074ef0c330d07c0Tim Reddehase output = auth_connection_get_output(conn->auth);
4949048bda09e116ee3627383e831455954cbe41Tim Reddehasestatic void login_connection_authreply_input(struct login_connection *conn)
4949048bda09e116ee3627383e831455954cbe41Tim Reddehase while ((line = i_stream_read_next_line(conn->input)) != NULL) T_BEGIN {
23f0ab4a423943eb59109df37074ef0c330d07c0Tim Reddehase if (!version_string_verify(line, "director-authreply-client",
23f0ab4a423943eb59109df37074ef0c330d07c0Tim Reddehase i_error("authreply client sent invalid handshake: %s", line);
1f3a52128a4c9a5830936e25b071ce6a81fec1beEugen Kuksa i_error("read(authreply connection) failed: %s",
1f3a52128a4c9a5830936e25b071ce6a81fec1beEugen Kuksalogin_connection_send_line(struct login_connection *conn, const char *line)
9ade3006d75c25cfa77d51526e4a6cdd2370be5cEugen Kuksa o_stream_nsendv(conn->output, iov, N_ELEMENTS(iov));
9ade3006d75c25cfa77d51526e4a6cdd2370be5cEugen Kuksastatic bool login_host_request_is_self(struct login_host_request *request,
9ade3006d75c25cfa77d51526e4a6cdd2370be5cEugen Kuksa if (!net_ip_compare(dest_ip, &request->local_ip))
9ade3006d75c25cfa77d51526e4a6cdd2370be5cEugen Kuksa if (request->dest_port != 0 && request->local_port != 0 &&
b7fe8f3179594e2ebccf6ee9f562e9c2e17aab96Eugen Kuksalogin_host_callback(const struct ip_addr *ip, const char *hostname,
b7fe8f3179594e2ebccf6ee9f562e9c2e17aab96Eugen Kuksa unsigned int secs;
503ccb65bd740225668eb51be966d60fb4ae29e1Tim Reddehase else if (strncmp(request->line, "PASS\t", 5) == 0)
503ccb65bd740225668eb51be966d60fb4ae29e1Tim Reddehase i_panic("BUG: Unexpected line: %s", request->line);
7c0f71e3e6e26af2cc91112fdbe3905879bfd893Tim Reddehase i_error("director: User %s host lookup failed: %s",
1f3a52128a4c9a5830936e25b071ce6a81fec1beEugen Kuksa line = t_strconcat("FAIL\t", t_strcut(line_params, '\t'),
7c0f71e3e6e26af2cc91112fdbe3905879bfd893Tim Reddehase str_printfa(str, "%s\tproxy_refresh=%u\t", request->line, secs);
7c0f71e3e6e26af2cc91112fdbe3905879bfd893Tim Reddehase login_connection_send_line(request->conn, line);
503ccb65bd740225668eb51be966d60fb4ae29e1Tim Reddehasestatic void auth_input_line(const char *line, void *context)
503ccb65bd740225668eb51be966d60fb4ae29e1Tim Reddehase struct login_host_request *request, temp_request;
503ccb65bd740225668eb51be966d60fb4ae29e1Tim Reddehase const char *const *args, *line_params, *username = NULL, *tag = "";
503ccb65bd740225668eb51be966d60fb4ae29e1Tim Reddehase /* auth connection died -> kill also this login connection */
575f7ed30e509f1a650d73927f607e7b5b11a6dbEugen Kuksa if (conn->type != LOGIN_CONNECTION_TYPE_USERDB &&
575f7ed30e509f1a650d73927f607e7b5b11a6dbEugen Kuksa else if (conn->type == LOGIN_CONNECTION_TYPE_USERDB &&
81a6387a4ab56a24194ecbabd6609c6bcca568b7Tim Reddehase /* OK <id> [<parameters>] */
98ba1c38b1cce99ecc61117259f2ae05ffe98469Tim Reddehase /* we should always get here, but in case we don't just
98ba1c38b1cce99ecc61117259f2ae05ffe98469Tim Reddehase forward as-is and let login process handle the error. */
db8aaeeeb3b24f487a5d02c60d18e96e55f6ba85Tim Reddehase memset(&temp_request, 0, sizeof(temp_request));
23f0ab4a423943eb59109df37074ef0c330d07c0Tim Reddehase if (net_addr2ip((*args) + 4, &temp_request.local_ip) < 0)
5ec1c6ff5da427d945d7fb708567ce3526c4c741Tim Reddehase i_error("auth sent invalid lip field: %s", (*args) + 6);
7dadc1a5aa3845c2ce19ad1daa2c63dfd7b59979Tim Reddehase } else if (strncmp(*args, "lport=", 6) == 0) {
7dadc1a5aa3845c2ce19ad1daa2c63dfd7b59979Tim Reddehase if (net_str2port((*args) + 6, &temp_request.local_port) < 0)
7dadc1a5aa3845c2ce19ad1daa2c63dfd7b59979Tim Reddehase i_error("auth sent invalid lport field: %s", (*args) + 6);
23f0ab4a423943eb59109df37074ef0c330d07c0Tim Reddehase if (net_str2port((*args) + 5, &temp_request.dest_port) < 0)
23f0ab4a423943eb59109df37074ef0c330d07c0Tim Reddehase i_error("auth sent invalid port field: %s", (*args) + 6);
db8aaeeeb3b24f487a5d02c60d18e96e55f6ba85Tim Reddehase } else if (strncmp(*args, "destuser=", 9) == 0)
23f0ab4a423943eb59109df37074ef0c330d07c0Tim Reddehase else if (strncmp(*args, "director_tag=", 13) == 0)
23f0ab4a423943eb59109df37074ef0c330d07c0Tim Reddehase else if (strncmp(*args, "director_proxy_maybe", 20) == 0 &&
772288cf17d57e84a4799c56949263f7ff098773Tim Reddehase if ((!proxy && !temp_request.director_proxy_maybe) ||
23f0ab4a423943eb59109df37074ef0c330d07c0Tim Reddehase if (*conn->dir->set->master_user_separator != '\0') {
23f0ab4a423943eb59109df37074ef0c330d07c0Tim Reddehase /* with master user logins we still want to use only the
23f0ab4a423943eb59109df37074ef0c330d07c0Tim Reddehase login username */
653f8d7c88abc38a2c42f12b80b3e3efd882e039Tim Reddehase /* we need to add the host. the lookup might be asynchronous */
a3bd54a5482d637ac89bbddbc27796d303544d4dEugen Kuksa director_request(conn->dir, username, tag, login_host_callback, request);
a3bd54a5482d637ac89bbddbc27796d303544d4dEugen Kuksalogin_connection_init(struct director *dir, int fd,
dfc7323cf206c044e128ffc866be9d3c777be8b7Eugen Kuksa conn->output = o_stream_create_fd(conn->fd, (size_t)-1, FALSE);
dfc7323cf206c044e128ffc866be9d3c777be8b7Eugen Kuksa o_stream_set_no_error_handling(conn->output, TRUE);
dfc7323cf206c044e128ffc866be9d3c777be8b7Eugen Kuksa auth_connection_set_callback(conn->auth, auth_input_line, conn);
dfc7323cf206c044e128ffc866be9d3c777be8b7Eugen Kuksa conn->input = i_stream_create_fd(conn->fd, IO_BLOCK_SIZE, FALSE);
c67b096189612bb816b4306ef88080b795b5cf41Eugen Kuksa o_stream_nsend_str(conn->output, t_strdup_printf(
c67b096189612bb816b4306ef88080b795b5cf41Eugen Kuksa "VERSION\tdirector-authreply-server\t%d\t%d\n",
c67b096189612bb816b4306ef88080b795b5cf41Eugen Kuksavoid login_connection_deinit(struct login_connection **_conn)
1d39ed6dd0248b5b0c969926bae5f6f66ff4d082Eugen Kuksa master_service_client_connection_destroyed(master_service);
1d39ed6dd0248b5b0c969926bae5f6f66ff4d082Eugen Kuksastatic void login_connection_unref(struct login_connection **_conn)