client.c revision 9249c80276766fdc4d31fc3eebc22fba7d53d77c
5a580c3a38ced62d4bcc95b8ac7c4f2935b5d294Timo Sirainen/* Copyright (c) 2013-2017 Dovecot authors, see the included COPYING file */
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen/* Disconnect client when it sends too many bad commands */
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainenstatic const struct smtp_server_callbacks smtp_callbacks;
2e78f05b11df23ec2731afaf8f19d5b5240cb29fTimo Sirainenstatic int submission_login_start_tls(void *conn_ctx,
2e78f05b11df23ec2731afaf8f19d5b5240cb29fTimo Sirainen struct istream **input, struct ostream **output)
d1e7425048c61d71f41f737ba947687198842dc2Timo Sirainen struct submission_client *subm_client = conn_ctx;
660b99a7059824676b2b8d6f79b8e15d47df25a2Timo Sirainen "TLS initialization failed.");
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen "Disconnected: TLS initialization failed.");
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainenstatic struct client *submission_client_alloc(pool_t pool)
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen subm_client = p_new(pool, struct submission_client, 1);
b9c76fe9d9ca194816606342da1ddbd9be6bc8abTimo Sirainenstatic void submission_client_create(struct client *client,
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen static const char *const xclient_extensions[] =
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen container_of(client, struct submission_client, common);
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen smtp_set.capabilities = SMTP_CAPABILITY_SIZE |
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen SMTP_CAPABILITY_ENHANCEDSTATUSCODES | SMTP_CAPABILITY_AUTH;
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen smtp_set.capabilities |= SMTP_CAPABILITY_STARTTLS;
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen smtp_set.hostname = subm_client->set->hostname;
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen smtp_set.login_greeting = client->set->login_greeting;
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen smtp_set.tls_required = (strcmp(client->ssl_set->ssl, "required") == 0);
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen smtp_set.xclient_extensions = xclient_extensions;
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen subm_client->conn = smtp_server_connection_create_from_streams(
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen &client->real_remote_ip, client->real_remote_port,
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainenstatic void submission_client_destroy(struct client *client)
ca843e046e98b12f4730f4b87ee2e1a659c26e78Timo Sirainen container_of(client, struct submission_client, common);
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen smtp_server_connection_close(&subm_client->conn, NULL);
e7dd5065d21c569e5e6ddd713bd345dadd1cf51dTimo Sirainenstatic void submission_client_notify_auth_ready(struct client *client)
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen container_of(client, struct submission_client, common);
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen smtp_server_connection_start(subm_client->conn, FALSE);
6303191abcb37164f435ccdc56e9dbddf1288851Timo Sirainensubmission_client_notify_disconnect(struct client *_client,
ab281fc992907b6cf6c730f672dc3aa4c6685015Timo Sirainen container_of(_client, struct submission_client, common);
5a250816ffc4cc5db203f9410ea99b6601c7b91aTimo Sirainen smtp_server_connection_terminate(&conn, "4.4.2", text);
1bf5c6c20f3d51f13d3240cfb46e471074c86276Timo Sirainen smtp_server_connection_terminate(&conn, "4.3.2", text);
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen smtp_server_connection_terminate(&conn, "4.0.0", text);
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen unsigned int i;
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen client->common.remote_port = data->source_port;
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen for (i = 0; i < data->extra_fields_count; i++) {
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen const char *name = data->extra_fields[i].name;
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen const char *value = data->extra_fields[i].value;
b8afdaa1bffe2f27cd4b02bf3bfbd2d297c8e648Timo Sirainen str_truncate(client->common.forward_fields, 0);
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen "Invalid FORWARD parameter");
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen } else if (strcasecmp(name, "SESSION") == 0) {
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainenstatic void client_connection_disconnect(void *context, const char *reason)
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainenstatic void client_connection_destroy(void *context)
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainenstatic bool client_connection_is_trusted(void *context)
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen /* do nothing. submission connections typically die pretty quick anyway.
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen login_set_roots = submission_login_setting_roots;
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen /* override the default login_die() */
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen master_service_set_die_callback(master_service, submission_login_die);
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen /* initialize SMTP server */
75e46142d8fbac811df8f2ca58d9a2f48a75d65fTimo Sirainen smtp_server_set.protocol = SMTP_PROTOCOL_SMTP;
75e46142d8fbac811df8f2ca58d9a2f48a75d65fTimo Sirainen smtp_server_set.max_bad_commands = CLIENT_MAX_BAD_COMMANDS;
75e46142d8fbac811df8f2ca58d9a2f48a75d65fTimo Sirainen smtp_server = smtp_server_init(&smtp_server_set);
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainenstatic const struct smtp_server_callbacks smtp_callbacks = {
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen .conn_cmd_xclient = client_connection_cmd_xclient,
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen .conn_disconnect = client_connection_disconnect,
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen .conn_is_trusted = client_connection_is_trusted
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainenstatic struct client_vfuncs submission_client_vfuncs = {
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainenstatic const struct login_binary submission_login_binary = {