Lines Matching refs:conn

36 void smtp_server_connection_debug(struct smtp_server_connection *conn,
41 if (conn->set.debug) {
43 i_debug("%s-server: conn %s: %s",
44 smtp_protocol_name(conn->set.protocol),
45 smtp_server_connection_label(conn),
51 void smtp_server_connection_error(struct smtp_server_connection *conn,
57 i_error("%s-server: conn %s: %s",
58 smtp_protocol_name(conn->set.protocol),
59 smtp_server_connection_label(conn),
71 smtp_server_connection_output(struct smtp_server_connection *conn);
73 smtp_server_connection_disconnect(struct smtp_server_connection *conn,
77 smtp_server_connection_update_stats(struct smtp_server_connection *conn)
79 if (conn->conn.input != NULL)
80 conn->stats.input = conn->conn.input->v_offset;
81 if (conn->conn.output != NULL)
82 conn->stats.output = conn->conn.output->offset;
86 smtp_server_connection_get_stats(struct smtp_server_connection *conn)
88 smtp_server_connection_update_stats(conn);
89 return &conn->stats;
92 void smtp_server_connection_input_halt(struct smtp_server_connection *conn)
94 connection_input_halt(&conn->conn);
97 void smtp_server_connection_input_resume(struct smtp_server_connection *conn)
102 if (conn->conn.io == NULL) {
104 if (conn->input_locked || conn->input_broken ||
105 conn->disconnected)
107 if (conn->command_queue_count >
108 conn->server->set.max_pipelined_commands)
112 cmd = conn->command_queue_head;
124 connection_input_resume(&conn->conn);
127 if (conn->conn.io != NULL &&
128 i_stream_have_bytes_left(conn->conn.input)) {
129 io_set_pending(conn->conn.io);
133 void smtp_server_connection_input_lock(struct smtp_server_connection *conn)
135 conn->input_locked = TRUE;
136 smtp_server_connection_input_halt(conn);
139 void smtp_server_connection_input_unlock(struct smtp_server_connection *conn)
141 conn->input_locked = FALSE;
142 smtp_server_connection_input_resume(conn);
146 void smtp_server_connection_input_capture(struct smtp_server_connection *conn,
149 i_assert(!conn->input_broken && !conn->disconnected);
150 connection_input_halt(&conn->conn);
151 conn->conn.io = io_add_istream(conn->conn.input, *callback, context);
155 smtp_server_connection_update_rawlog(struct smtp_server_connection *conn)
159 if (conn->set.rawlog_dir == NULL)
162 if (!conn->rawlog_checked) {
163 conn->rawlog_checked = TRUE;
164 if (stat(conn->set.rawlog_dir, &st) == 0)
165 conn->rawlog_enabled = TRUE;
167 if (conn->rawlog_enabled) {
168 iostream_rawlog_create(conn->set.rawlog_dir,
169 &conn->conn.input, &conn->conn.output);
174 smtp_server_connection_streams_changed(struct smtp_server_connection *conn)
176 smtp_server_connection_update_rawlog(conn);
177 smtp_command_parser_set_stream(conn->smtp_parser, conn->conn.input);
179 o_stream_set_flush_callback(conn->conn.output,
180 smtp_server_connection_output, conn);
181 o_stream_set_flush_pending(conn->conn.output, TRUE);
184 void smtp_server_connection_set_streams(struct smtp_server_connection *conn,
187 struct istream *old_input = conn->conn.input;
188 struct ostream *old_output = conn->conn.output;
190 i_assert(conn->created_from_streams);
192 conn->conn.input = input;
193 i_stream_ref(conn->conn.input);
195 conn->conn.output = output;
196 o_stream_ref(conn->conn.output);
197 o_stream_set_no_error_handling(conn->conn.output, TRUE);
202 smtp_server_connection_streams_changed(conn);
205 void smtp_server_connection_set_ssl_streams(struct smtp_server_connection *conn,
208 conn->ssl_secured = TRUE;
209 conn->set.capabilities &= ~SMTP_CAPABILITY_STARTTLS;
211 smtp_server_connection_set_streams(conn, input, output);
215 smtp_server_connection_idle_timeout(struct smtp_server_connection *conn)
217 smtp_server_connection_terminate(&conn,
221 void smtp_server_connection_timeout_stop(struct smtp_server_connection *conn)
223 if (conn->to_idle != NULL) {
224 smtp_server_connection_debug(conn, "Timeout stop");
226 timeout_remove(&conn->to_idle);
230 void smtp_server_connection_timeout_start(struct smtp_server_connection *conn)
232 if (conn->disconnected)
235 if (conn->to_idle == NULL &&
236 conn->set.max_client_idle_time_msecs > 0) {
237 smtp_server_connection_debug(conn, "Timeout start");
239 conn->to_idle = timeout_add(
240 conn->set.max_client_idle_time_msecs,
241 smtp_server_connection_idle_timeout, conn);
245 void smtp_server_connection_timeout_reset(struct smtp_server_connection *conn)
247 if (conn->to_idle != NULL)
248 timeout_reset(conn->to_idle);
252 smtp_server_connection_timeout_update(struct smtp_server_connection *conn)
254 struct smtp_server_command *cmd = conn->command_queue_head;
257 smtp_server_connection_timeout_start(conn);
263 smtp_server_connection_timeout_start(conn);
270 smtp_server_connection_timeout_stop(conn);
274 smtp_server_connection_timeout_stop(conn);
283 smtp_server_connection_ready(struct smtp_server_connection *conn)
285 conn->raw_input = conn->conn.input;
286 conn->raw_output = conn->conn.output;
288 smtp_server_connection_update_rawlog(conn);
290 conn->smtp_parser = smtp_command_parser_init(conn->conn.input,
291 &conn->server->set.command_limits);
292 o_stream_set_flush_callback(conn->conn.output,
293 smtp_server_connection_output, conn);
295 o_stream_cork(conn->conn.output);
296 if (conn->authenticated) {
300 smtp_server_connection_send_line(conn,
303 smtp_server_connection_send_line(conn,
304 "220 %s %s", conn->set.hostname,
305 conn->set.login_greeting);
307 if (!conn->corked)
308 o_stream_uncork(conn->conn.output);
313 struct smtp_server_connection *conn =
316 smtp_server_connection_disconnect(conn, NULL);
317 smtp_server_connection_unref(&conn);
321 smtp_server_connection_handle_command(struct smtp_server_connection *conn,
324 struct smtp_server_connection *tmp_conn = conn;
335 if (cmd != NULL && conn->command_queue_head == cmd)
338 smtp_server_connection_timeout_update(conn);
342 int smtp_server_connection_ssl_init(struct smtp_server_connection *conn)
346 smtp_server_connection_debug(conn, "Starting SSL handshake");
348 if (conn->raw_input != conn->conn.input) {
350 i_stream_ref(conn->raw_input);
351 o_stream_ref(conn->raw_output);
352 i_stream_destroy(&conn->conn.input);
353 o_stream_destroy(&conn->conn.output);
354 conn->conn.input = conn->raw_input;
355 conn->conn.output = conn->raw_output;
358 smtp_server_connection_input_halt(conn);
360 &conn->conn.input, &conn->conn.output,
361 &conn->ssl_iostream, &error) < 0) {
362 smtp_server_connection_error(conn,
364 conn->conn.name, error);
367 smtp_server_connection_input_resume(conn);
369 if (ssl_iostream_handshake(conn->ssl_iostream) < 0) {
370 smtp_server_connection_error(conn,
372 ssl_iostream_get_last_error(conn->ssl_iostream));
376 conn->ssl_secured = TRUE;
377 conn->set.capabilities &= ~SMTP_CAPABILITY_STARTTLS;
379 if (conn->ssl_start)
380 smtp_server_connection_ready(conn);
382 smtp_server_connection_streams_changed(conn);
387 smtp_server_connection_handle_input(struct smtp_server_connection *conn)
396 if (conn->command_queue_tail != NULL) {
397 pending_command = (conn->command_queue_tail->state ==
399 conn->command_queue_tail : NULL);
402 smtp_server_connection_timeout_reset(conn);
406 while (!conn->closing && ret != 0) {
407 while ((ret = smtp_command_parse_next(conn->smtp_parser,
417 smtp_server_connection_debug(conn,
421 conn->stats.command_count++;
425 if (!smtp_server_connection_handle_command(conn,
429 if (conn->disconnected)
433 if (conn->closing)
436 if (conn->command_queue_count >=
437 conn->server->set.max_pipelined_commands) {
438 smtp_server_connection_input_halt(conn);
442 if (conn->command_queue_tail != NULL) {
443 pending_command = (conn->command_queue_tail->state ==
445 conn->command_queue_tail : NULL);
449 if (ret < 0 && conn->conn.input->eof) {
450 int stream_errno = conn->conn.input->stream_errno;
453 smtp_server_connection_error(conn,
455 i_stream_get_name(conn->conn.input),
456 i_stream_get_error(conn->conn.input));
457 smtp_server_connection_close(&conn,
460 smtp_server_connection_debug(conn,
463 if (conn->command_queue_head == NULL) {
465 smtp_server_connection_close(&conn,
467 } else if (conn->command_queue_head->state <
470 smtp_server_connection_close(&conn,
475 conn->input_broken = TRUE;
476 smtp_server_connection_input_halt(conn);
485 smtp_server_connection_debug(conn,
490 conn->input_broken = TRUE;
493 cmd = smtp_server_command_alloc(conn);
498 cmd = smtp_server_command_alloc(conn);
508 smtp_server_connection_close(&conn,
512 smtp_server_connection_close(&conn,
520 if (conn->disconnected)
522 if (conn->input_broken || conn->closing) {
523 smtp_server_connection_input_halt(conn);
528 !smtp_command_parser_pending_data(conn->smtp_parser)) {
538 struct smtp_server_connection *conn =
541 i_assert(!conn->input_broken);
543 if (conn->handling_input)
546 smtp_server_connection_timeout_reset(conn);
548 if (conn->ssl_start && conn->ssl_iostream == NULL) {
549 if (smtp_server_connection_ssl_init(conn) < 0) {
550 smtp_server_connection_close(&conn,
554 if (conn->halted) {
555 smtp_server_connection_input_lock(conn);
559 i_assert(!conn->halted);
562 if (conn->command_queue_count >
563 conn->server->set.max_pipelined_commands) {
564 smtp_server_connection_input_halt(conn);
568 smtp_server_connection_ref(conn);
569 conn->handling_input = TRUE;
570 if (conn->callbacks != NULL &&
571 conn->callbacks->conn_cmd_input_pre != NULL) {
572 conn->callbacks->conn_cmd_input_pre(conn->context);
574 smtp_server_connection_handle_input(conn);
575 if (conn->callbacks != NULL &&
576 conn->callbacks->conn_cmd_input_post != NULL) {
577 conn->callbacks->conn_cmd_input_post(conn->context);
579 conn->handling_input = FALSE;
580 smtp_server_connection_unref(&conn);
584 struct smtp_server_connection *conn)
586 if (conn->smtp_parser == NULL)
588 return smtp_command_parser_pending_data(conn->smtp_parser);
596 struct smtp_server_connection *conn)
598 struct ostream *output = conn->conn.output;
602 smtp_server_connection_error(conn,
606 smtp_server_connection_close(&conn,
609 smtp_server_connection_debug(conn,
611 smtp_server_connection_close(&conn,
617 smtp_server_connection_next_reply(struct smtp_server_connection *conn)
622 cmd = conn->command_queue_head;
625 smtp_server_connection_debug(conn,
663 void smtp_server_connection_cork(struct smtp_server_connection *conn)
665 conn->corked = TRUE;
666 if (conn->conn.output != NULL)
667 o_stream_cork(conn->conn.output);
670 void smtp_server_connection_uncork(struct smtp_server_connection *conn)
672 conn->corked = FALSE;
673 if (conn->conn.output != NULL) {
674 if (o_stream_uncork_flush(conn->conn.output) < 0) {
675 smtp_server_connection_handle_output_error(conn);
678 smtp_server_connection_trigger_output(conn);
683 smtp_server_connection_send_replies(struct smtp_server_connection *conn)
687 while (!conn->disconnected && smtp_server_connection_next_reply(conn));
689 smtp_server_connection_timeout_update(conn);
692 smtp_server_connection_input_resume(conn);
695 int smtp_server_connection_flush(struct smtp_server_connection *conn)
697 struct ostream *output = conn->conn.output;
702 smtp_server_connection_handle_output_error(conn);
709 smtp_server_connection_output(struct smtp_server_connection *conn)
713 smtp_server_connection_debug(conn,
716 smtp_server_connection_ref(conn);
717 o_stream_cork(conn->conn.output);
718 if ((ret=smtp_server_connection_flush(conn)) > 0) {
719 smtp_server_connection_timeout_reset(conn);
720 smtp_server_connection_send_replies(conn);
722 if (ret >= 0 && !conn->corked && conn->conn.output != NULL) {
723 if ((ret=o_stream_uncork_flush(conn->conn.output)) < 0)
724 smtp_server_connection_handle_output_error(conn);
726 smtp_server_connection_unref(&conn);
731 struct smtp_server_connection *conn)
733 if (conn->conn.output != NULL) {
734 smtp_server_connection_debug(conn,
736 o_stream_set_flush_pending(conn->conn.output, TRUE);
770 struct smtp_server_connection *conn;
774 conn = p_new(pool, struct smtp_server_connection, 1);
775 conn->pool = pool;
776 conn->refcount = 1;
777 conn->id = id++;
778 conn->server = server;
779 conn->callbacks = callbacks;
780 conn->context = context;
783 conn->set = server->set;
785 conn->set.protocol = server->set.protocol;
787 conn->set.rawlog_dir = p_strdup(pool, set->rawlog_dir);
789 conn->set.hostname = p_strdup(pool, set->hostname);
792 conn->set.login_greeting =
796 conn->set.capabilities = set->capabilities;
798 conn->set.max_client_idle_time_msecs =
802 conn->set.max_pipelined_commands =
806 conn->set.max_bad_commands = set->max_bad_commands;
809 conn->set.max_recipients = set->max_recipients;
810 smtp_command_limits_merge(&conn->set.command_limits,
819 conn->set.socket_send_buffer_size =
823 conn->set.socket_recv_buffer_size =
827 conn->set.tls_required =
828 conn->set.tls_required || set->tls_required;
829 conn->set.auth_optional =
830 conn->set.auth_optional || set->auth_optional;
831 conn->set.rcpt_domain_optional =
832 conn->set.rcpt_domain_optional ||
834 conn->set.param_extensions =
835 conn->set.param_extensions || set->param_extensions;
836 conn->set.debug = conn->set.debug || set->debug;
839 conn->remote_pid = (pid_t)-1;
840 conn->remote_uid = (uid_t)-1;
842 conn->remote_ip = *remote_ip;
843 conn->remote_port = remote_port;
844 conn->socket_family = conn->remote_ip.family;
846 &conn->remote_ip, &conn->remote_port) < 0) {
849 if (conn->remote_ip.family == 0) {
853 conn->socket_family = AF_UNIX;
855 conn->remote_pid = cred.pid;
856 conn->remote_uid = cred.uid;
860 conn->socket_family = conn->remote_ip.family;
869 set = &conn->set;
883 return conn;
887 smtp_server_connection_get_name(struct smtp_server_connection *conn)
892 switch (conn->socket_family) {
894 name = t_strdup_printf("[%u]", conn->id);
897 if (conn->remote_uid == (uid_t)-1) {
898 name = t_strdup_printf("unix [%u]", conn->id);
899 } else if (conn->remote_pid == (pid_t)-1) {
901 conn->remote_uid, conn->id);
904 conn->remote_pid, conn->remote_uid, conn->id);
909 net_ip2addr(&conn->remote_ip), conn->remote_port, conn->id);
913 net_ip2addr(&conn->remote_ip), conn->remote_port, conn->id);
929 struct smtp_server_connection *conn;
932 conn = smtp_server_connection_alloc(server,
935 name = smtp_server_connection_get_name(conn);
937 &conn->conn, name, fd_in, fd_out);
939 conn->ssl_start = ssl_start;
941 conn->set.capabilities &= ~SMTP_CAPABILITY_STARTTLS;
944 smtp_server_connection_halt(conn);
946 smtp_server_connection_debug(conn, "Connection created");
948 return conn;
958 struct smtp_server_connection *conn;
967 conn = smtp_server_connection_alloc(server, set,
970 name = smtp_server_connection_get_name(conn);
972 &conn->conn, name, input, output);
973 conn->created_from_streams = TRUE;
976 smtp_server_connection_halt(conn);
978 smtp_server_connection_debug(conn, "Connection created");
980 return conn;
983 void smtp_server_connection_ref(struct smtp_server_connection *conn)
985 conn->refcount++;
990 struct smtp_server_connection *conn)
994 if (conn->ssl_iostream != NULL &&
995 !ssl_iostream_is_handshaked(conn->ssl_iostream)) {
996 err = ssl_iostream_get_last_error(conn->ssl_iostream);
1003 return io_stream_get_disconnect_reason(conn->conn.input,
1004 conn->conn.output);
1008 smtp_server_connection_disconnect(struct smtp_server_connection *conn,
1011 if (conn->disconnected)
1013 conn->disconnected = TRUE;
1016 reason = smtp_server_connection_get_disconnect_reason(conn);
1017 smtp_server_connection_debug(conn, "Disconnected: %s", reason);
1018 conn->disconnect_reason = i_strdup(reason);
1021 smtp_server_connection_update_stats(conn);
1023 smtp_server_connection_timeout_stop(conn);
1024 if (conn->conn.output != NULL)
1025 o_stream_uncork(conn->conn.output);
1026 if (conn->smtp_parser != NULL)
1027 smtp_command_parser_deinit(&conn->smtp_parser);
1028 ssl_iostream_destroy(&conn->ssl_iostream);
1030 if (conn->callbacks != NULL &&
1031 conn->callbacks->conn_disconnect != NULL) {
1033 io_remove(&conn->conn.io);
1034 conn->callbacks->conn_disconnect(conn->context,
1038 if (!conn->created_from_streams)
1039 connection_disconnect(&conn->conn);
1041 conn->conn.fd_in = conn->conn.fd_out = -1;
1042 io_remove(&conn->conn.io);
1043 i_stream_unref(&conn->conn.input);
1044 o_stream_unref(&conn->conn.output);
1050 struct smtp_server_connection *conn = *_conn;
1055 i_assert(conn->refcount > 0);
1056 if (--conn->refcount > 0)
1059 smtp_server_connection_disconnect(conn, NULL);
1061 smtp_server_connection_debug(conn, "Connection destroy");
1064 smtp_server_connection_reset_state(conn);
1067 cmd = conn->command_queue_head;
1074 if (conn->callbacks != NULL &&
1075 conn->callbacks->conn_destroy != NULL)
1076 conn->callbacks->conn_destroy(conn->context);
1078 connection_deinit(&conn->conn);
1080 i_free(conn->helo_domain);
1081 i_free(conn->helo_login);
1082 i_free(conn->username);
1083 i_free(conn->disconnect_reason);
1084 pool_unref(&conn->pool);
1088 void smtp_server_connection_send_line(struct smtp_server_connection *conn,
1100 o_stream_nsend(conn->conn.output, str_data(str), str_len(str));
1106 struct smtp_server_connection *conn,
1119 o_stream_nsend(conn->conn.output, str_data(str), str_len(str));
1124 if (o_stream_is_corked(conn->conn.output)) {
1125 o_stream_uncork(conn->conn.output);
1126 o_stream_cork(conn->conn.output);
1130 void smtp_server_connection_login(struct smtp_server_connection *conn,
1135 i_assert(!conn->started);
1136 i_assert(conn->username == NULL);
1138 conn->set.capabilities &= ~SMTP_CAPABILITY_STARTTLS;
1139 conn->username = i_strdup(username);
1140 conn->helo_login = i_strdup(helo);
1141 conn->authenticated = TRUE;
1142 conn->ssl_secured = ssl_secured;
1145 if (!i_stream_add_data(conn->conn.input, pdata, pdata_len))
1150 void smtp_server_connection_start_pending(struct smtp_server_connection *conn)
1152 i_assert(!conn->started);
1153 conn->started = TRUE;
1155 conn->raw_input = conn->conn.input;
1156 conn->raw_output = conn->conn.output;
1158 if (!conn->ssl_start)
1159 smtp_server_connection_ready(conn);
1160 else if (conn->ssl_iostream == NULL)
1161 smtp_server_connection_input_unlock(conn);
1164 void smtp_server_connection_start(struct smtp_server_connection *conn)
1166 smtp_server_connection_start_pending(conn);
1167 smtp_server_connection_resume(conn);
1170 void smtp_server_connection_halt(struct smtp_server_connection *conn)
1172 conn->halted = TRUE;
1173 smtp_server_connection_timeout_stop(conn);
1174 if (!conn->started || !conn->ssl_start || conn->ssl_iostream != NULL)
1175 smtp_server_connection_input_lock(conn);
1178 void smtp_server_connection_resume(struct smtp_server_connection *conn)
1180 smtp_server_connection_input_unlock(conn);
1181 smtp_server_connection_timeout_update(conn);
1182 conn->halted = FALSE;
1188 struct smtp_server_connection *conn = *_conn;
1192 if (conn->closed)
1194 conn->closed = TRUE;
1196 smtp_server_connection_disconnect(conn, reason);
1197 smtp_server_connection_unref(&conn);
1203 struct smtp_server_connection *conn = *_conn;
1207 if (conn->closed)
1212 smtp_server_connection_send_line(conn,
1213 "421 %s %s %s", enh_code, conn->set.hostname, reason);
1215 smtp_server_connection_close(&conn, reason);
1219 smtp_server_connection_get_helo_data(struct smtp_server_connection *conn)
1221 return &conn->helo;
1225 smtp_server_connection_get_state(struct smtp_server_connection *conn)
1227 return conn->state.state;
1230 void smtp_server_connection_set_state(struct smtp_server_connection *conn,
1233 if (conn->state.state != state) {
1234 conn->state.state = state;
1236 if (conn->callbacks != NULL &&
1237 conn->callbacks->conn_state_changed != NULL) {
1238 conn->callbacks->conn_state_changed(conn->context, state);
1244 smtp_server_connection_get_security_string(struct smtp_server_connection *conn)
1246 if (conn->ssl_iostream == NULL)
1248 return ssl_iostream_get_security_string(conn->ssl_iostream);
1251 void smtp_server_connection_reset_state(struct smtp_server_connection *conn)
1253 smtp_server_connection_debug(conn, "Connection state reset");
1255 if (conn->state.trans != NULL) {
1256 if (conn->callbacks != NULL &&
1257 conn->callbacks->conn_trans_free != NULL) {
1258 conn->callbacks->conn_trans_free(conn->context,
1259 conn->state.trans);
1261 smtp_server_transaction_free(&conn->state.trans);
1269 if (conn->state.data_input != NULL)
1270 i_stream_destroy(&conn->state.data_input);
1271 conn->state.data_chain = NULL;
1274 i_zero(&conn->state);
1275 smtp_server_connection_set_state(conn, SMTP_SERVER_STATE_READY);
1278 void smtp_server_connection_clear(struct smtp_server_connection *conn)
1280 smtp_server_connection_debug(conn, "Connection clear");
1282 i_free(conn->helo_domain);
1283 i_free(conn->helo_login);
1284 i_zero(&conn->helo);
1285 smtp_server_connection_reset_state(conn);
1289 struct smtp_server_connection *conn, enum smtp_capability capabilities)
1291 conn->set.capabilities = capabilities;
1294 void *smtp_server_connection_get_context(struct smtp_server_connection *conn)
1296 return conn->context;
1299 bool smtp_server_connection_is_ssl_secured(struct smtp_server_connection *conn)
1301 return conn->ssl_secured;
1304 bool smtp_server_connection_is_trusted(struct smtp_server_connection *conn)
1306 if (conn->callbacks == NULL || conn->callbacks->conn_is_trusted == NULL)
1308 return conn->callbacks->conn_is_trusted(conn->context);
1312 smtp_server_connection_get_protocol(struct smtp_server_connection *conn)
1314 return conn->set.protocol;
1318 smtp_server_connection_get_protocol_name(struct smtp_server_connection *conn)
1322 switch (conn->set.protocol) {
1324 if (conn->helo.old_smtp)
1335 if (conn->ssl_secured)
1337 if (conn->authenticated)
1343 smtp_server_connection_get_transaction(struct smtp_server_connection *conn)
1345 return conn->state.trans;
1349 smtp_server_connection_get_transaction_id(struct smtp_server_connection *conn)
1351 if (conn->state.trans == NULL)
1353 return conn->state.trans->id;
1356 void smtp_server_connection_get_proxy_data(struct smtp_server_connection *conn,
1360 proxy_data->source_ip = conn->remote_ip;
1361 proxy_data->source_port = conn->remote_port;
1362 if (conn->helo.domain_valid)
1363 proxy_data->helo = conn->helo.domain;
1364 proxy_data->login = conn->username;
1366 if (conn->proxy_proto != SMTP_PROXY_PROTOCOL_UNKNOWN)
1367 proxy_data->proto = conn->proxy_proto;
1368 else if (conn->set.protocol == SMTP_PROTOCOL_LMTP)
1370 else if (conn->helo.old_smtp)
1375 proxy_data->ttl_plus_1 = conn->proxy_ttl_plus_1;
1376 proxy_data->timeout_secs = conn->proxy_timeout_secs;
1379 void smtp_server_connection_set_proxy_data(struct smtp_server_connection *conn,
1383 conn->remote_ip = proxy_data->source_ip;
1385 conn->remote_port = proxy_data->source_port;
1387 i_free(conn->helo_domain);
1388 conn->helo_domain = i_strdup(proxy_data->helo);
1389 conn->helo.domain = conn->helo_domain;
1390 conn->helo.domain_valid = TRUE;
1393 i_free(conn->username);
1394 conn->username = i_strdup(proxy_data->login);
1397 conn->proxy_proto = proxy_data->proto;
1400 conn->proxy_ttl_plus_1 = proxy_data->ttl_plus_1;
1401 if (conn->proxy_timeout_secs > 0)
1402 conn->proxy_timeout_secs = proxy_data->timeout_secs;
1404 if (conn->callbacks != NULL &&
1405 conn->callbacks->conn_proxy_data_updated != NULL) {
1406 conn->callbacks->
1407 conn_proxy_data_updated(conn->context, proxy_data);
1411 void smtp_server_connection_switch_ioloop(struct smtp_server_connection *conn)
1413 if (conn->to_idle != NULL)
1414 conn->to_idle = io_loop_move_timeout(&conn->to_idle);
1415 connection_switch_ioloop(&conn->conn);