client.c revision 9249c80276766fdc4d31fc3eebc22fba7d53d77c
5a580c3a38ced62d4bcc95b8ac7c4f2935b5d294Timo Sirainen/* Copyright (c) 2013-2017 Dovecot authors, see the included COPYING file */
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen
9f627b360ed38fdc54cb02ec5e67246c3f0d5b0fTimo Sirainen#include "login-common.h"
46552a931924c2d743f045e95b08c3ce6beda91aTimo Sirainen#include "base64.h"
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen#include "buffer.h"
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen#include "ioloop.h"
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen#include "istream.h"
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen#include "ostream.h"
9f627b360ed38fdc54cb02ec5e67246c3f0d5b0fTimo Sirainen#include "randgen.h"
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen#include "hostpid.h"
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen#include "safe-memset.h"
de754cb78f75e8b3b994cddafe41c9ed1467c33dTimo Sirainen#include "str.h"
f29756821a4c6b12b73e4a2a3e1c230117a43773Timo Sirainen#include "strescape.h"
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen#include "master-service.h"
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen#include "master-service-ssl-settings.h"
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen#include "client.h"
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen#include "client-authenticate.h"
53dfcefa9440a49d703e49193819a79be99c9ba6Timo Sirainen#include "auth-client.h"
f0d93763f210ecdb85a115fdd0210a16cfc5ff5cTimo Sirainen#include "submission-proxy.h"
53dfcefa9440a49d703e49193819a79be99c9ba6Timo Sirainen#include "submission-login-settings.h"
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen/* Disconnect client when it sends too many bad commands */
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen#define CLIENT_MAX_BAD_COMMANDS 10
9f627b360ed38fdc54cb02ec5e67246c3f0d5b0fTimo Sirainen
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainenstatic const struct smtp_server_callbacks smtp_callbacks;
9f627b360ed38fdc54cb02ec5e67246c3f0d5b0fTimo Sirainen
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainenstatic struct smtp_server *smtp_server = NULL;
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen
2e78f05b11df23ec2731afaf8f19d5b5240cb29fTimo Sirainenstatic int submission_login_start_tls(void *conn_ctx,
2e78f05b11df23ec2731afaf8f19d5b5240cb29fTimo Sirainen struct istream **input, struct ostream **output)
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen{
d1e7425048c61d71f41f737ba947687198842dc2Timo Sirainen struct submission_client *subm_client = conn_ctx;
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen struct client *client = &subm_client->common;
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen client->starttls = TRUE;
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen if (client_init_ssl(client) < 0) {
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen client_notify_disconnect(client,
660b99a7059824676b2b8d6f79b8e15d47df25a2Timo Sirainen CLIENT_DISCONNECT_INTERNAL_ERROR,
660b99a7059824676b2b8d6f79b8e15d47df25a2Timo Sirainen "TLS initialization failed.");
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen client_destroy(client,
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen "Disconnected: TLS initialization failed.");
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen return -1;
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen }
9f627b360ed38fdc54cb02ec5e67246c3f0d5b0fTimo Sirainen login_refresh_proctitle();
b9c76fe9d9ca194816606342da1ddbd9be6bc8abTimo Sirainen
9f627b360ed38fdc54cb02ec5e67246c3f0d5b0fTimo Sirainen *input = client->input;
b9c76fe9d9ca194816606342da1ddbd9be6bc8abTimo Sirainen *output = client->output;
9f627b360ed38fdc54cb02ec5e67246c3f0d5b0fTimo Sirainen return 0;
9f627b360ed38fdc54cb02ec5e67246c3f0d5b0fTimo Sirainen}
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainenstatic struct client *submission_client_alloc(pool_t pool)
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen{
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen struct submission_client *subm_client;
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen subm_client = p_new(pool, struct submission_client, 1);
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen return &subm_client->common;
9f627b360ed38fdc54cb02ec5e67246c3f0d5b0fTimo Sirainen}
9f627b360ed38fdc54cb02ec5e67246c3f0d5b0fTimo Sirainen
b9c76fe9d9ca194816606342da1ddbd9be6bc8abTimo Sirainenstatic void submission_client_create(struct client *client,
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen void **other_sets)
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen{
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen static const char *const xclient_extensions[] =
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen { "SESSION", "FORWARD", NULL };
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen struct submission_client *subm_client =
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen container_of(client, struct submission_client, common);
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen struct smtp_server_settings smtp_set;
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen subm_client->set = other_sets[0];
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen i_zero(&smtp_set);
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen smtp_set.capabilities = SMTP_CAPABILITY_SIZE |
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen SMTP_CAPABILITY_ENHANCEDSTATUSCODES | SMTP_CAPABILITY_AUTH;
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen if (client_is_tls_enabled(client))
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 smtp_set.debug = client->set->auth_debug;
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen subm_client->conn = smtp_server_connection_create_from_streams(
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen smtp_server, client->input, client->output,
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen &client->real_remote_ip, client->real_remote_port,
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen &smtp_set, &smtp_callbacks, subm_client);
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen}
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainenstatic void submission_client_destroy(struct client *client)
ca843e046e98b12f4730f4b87ee2e1a659c26e78Timo Sirainen{
ca843e046e98b12f4730f4b87ee2e1a659c26e78Timo Sirainen struct submission_client *subm_client =
ca843e046e98b12f4730f4b87ee2e1a659c26e78Timo Sirainen container_of(client, struct submission_client, common);
ca843e046e98b12f4730f4b87ee2e1a659c26e78Timo Sirainen
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen if (subm_client->conn != NULL)
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen smtp_server_connection_close(&subm_client->conn, NULL);
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen i_free_and_null(subm_client->proxy_xclient);
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen}
e7dd5065d21c569e5e6ddd713bd345dadd1cf51dTimo Sirainen
e7dd5065d21c569e5e6ddd713bd345dadd1cf51dTimo Sirainenstatic void submission_client_notify_auth_ready(struct client *client)
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen{
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen struct submission_client *subm_client =
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen container_of(client, struct submission_client, common);
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen smtp_server_connection_start(subm_client->conn, FALSE);
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen}
2598b2f36365b52d9754b9348a5be29569293e46Timo Sirainen
2598b2f36365b52d9754b9348a5be29569293e46Timo Sirainenstatic void
6303191abcb37164f435ccdc56e9dbddf1288851Timo Sirainensubmission_client_notify_disconnect(struct client *_client,
6303191abcb37164f435ccdc56e9dbddf1288851Timo Sirainen enum client_disconnect_reason reason,
1093de32efb2a231949566d4bd8aa55a8f43fb70Timo Sirainen const char *text)
1093de32efb2a231949566d4bd8aa55a8f43fb70Timo Sirainen{
ab281fc992907b6cf6c730f672dc3aa4c6685015Timo Sirainen struct submission_client *client =
ab281fc992907b6cf6c730f672dc3aa4c6685015Timo Sirainen container_of(_client, struct submission_client, common);
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen struct smtp_server_connection *conn;
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen conn = client->conn;
1bf5c6c20f3d51f13d3240cfb46e471074c86276Timo Sirainen client->conn = NULL;
1bf5c6c20f3d51f13d3240cfb46e471074c86276Timo Sirainen if (conn != NULL) {
1bf5c6c20f3d51f13d3240cfb46e471074c86276Timo Sirainen switch (reason) {
1bf5c6c20f3d51f13d3240cfb46e471074c86276Timo Sirainen case CLIENT_DISCONNECT_TIMEOUT:
5a250816ffc4cc5db203f9410ea99b6601c7b91aTimo Sirainen smtp_server_connection_terminate(&conn, "4.4.2", text);
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen break;
1bf5c6c20f3d51f13d3240cfb46e471074c86276Timo Sirainen case CLIENT_DISCONNECT_SYSTEM_SHUTDOWN:
1bf5c6c20f3d51f13d3240cfb46e471074c86276Timo Sirainen smtp_server_connection_terminate(&conn, "4.3.2", text);
1bf5c6c20f3d51f13d3240cfb46e471074c86276Timo Sirainen break;
1bf5c6c20f3d51f13d3240cfb46e471074c86276Timo Sirainen case CLIENT_DISCONNECT_INTERNAL_ERROR:
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen default:
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen smtp_server_connection_terminate(&conn, "4.0.0", text);
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen break;
e5acc283bf030b0b5c79ca4e52d315c516a299faPascal Volk }
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen }
2e2a1d720ed53490e8e5c5031e773d395bd5683dTimo Sirainen}
5a250816ffc4cc5db203f9410ea99b6601c7b91aTimo Sirainen
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainenstatic void
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainenclient_connection_cmd_xclient(void *context,
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen struct smtp_server_cmd_ctx *cmd,
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen struct smtp_proxy_data *data)
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen{
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen unsigned int i;
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen struct submission_client *client = context;
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen client->common.ip = data->source_ip;
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen client->common.remote_port = data->source_port;
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen client->common.proxy_ttl = data->ttl_plus_1;
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen
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;
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen
b8afdaa1bffe2f27cd4b02bf3bfbd2d297c8e648Timo Sirainen if (strcasecmp(name, "FORWARD") == 0) {
b8afdaa1bffe2f27cd4b02bf3bfbd2d297c8e648Timo Sirainen size_t value_len = strlen(value);
b8afdaa1bffe2f27cd4b02bf3bfbd2d297c8e648Timo Sirainen if (client->common.forward_fields != NULL) {
b8afdaa1bffe2f27cd4b02bf3bfbd2d297c8e648Timo Sirainen str_truncate(client->common.forward_fields, 0);
b8afdaa1bffe2f27cd4b02bf3bfbd2d297c8e648Timo Sirainen } else {
b8afdaa1bffe2f27cd4b02bf3bfbd2d297c8e648Timo Sirainen client->common.forward_fields = str_new(
b8afdaa1bffe2f27cd4b02bf3bfbd2d297c8e648Timo Sirainen client->common.preproxy_pool,
b8afdaa1bffe2f27cd4b02bf3bfbd2d297c8e648Timo Sirainen MAX_BASE64_DECODED_SIZE(value_len));
b8afdaa1bffe2f27cd4b02bf3bfbd2d297c8e648Timo Sirainen if (base64_decode(value, value_len, NULL,
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen client->common.forward_fields) < 0) {
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen smtp_server_reply(cmd, 501, "5.5.4",
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen "Invalid FORWARD parameter");
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen }
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen }
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen } else if (strcasecmp(name, "SESSION") == 0) {
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen if (client->common.session_id != NULL)
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen continue;
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen client->common.session_id =
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen p_strdup(client->common.pool, value);
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen }
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen }
ec23e16ed879e289d12c6e1a5f9745dd3979004aTimo Sirainen}
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainenstatic void client_connection_disconnect(void *context, const char *reason)
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen{
9f627b360ed38fdc54cb02ec5e67246c3f0d5b0fTimo Sirainen struct submission_client *client = context;
9f627b360ed38fdc54cb02ec5e67246c3f0d5b0fTimo Sirainen
9f627b360ed38fdc54cb02ec5e67246c3f0d5b0fTimo Sirainen client_disconnect(&client->common, reason);
9f627b360ed38fdc54cb02ec5e67246c3f0d5b0fTimo Sirainen}
9f627b360ed38fdc54cb02ec5e67246c3f0d5b0fTimo Sirainen
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainenstatic void client_connection_destroy(void *context)
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen{
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen struct submission_client *client = context;
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen if (client->conn == NULL)
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen return;
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen client->conn = NULL;
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen client_destroy(&client->common, NULL);
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen}
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainenstatic bool client_connection_is_trusted(void *context)
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen{
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen struct submission_client *client = context;
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen return client->common.trusted;
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen}
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainenstatic void submission_login_die(void)
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen{
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen /* do nothing. submission connections typically die pretty quick anyway.
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen */
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen}
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen
9f627b360ed38fdc54cb02ec5e67246c3f0d5b0fTimo Sirainenstatic void submission_login_preinit(void)
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen{
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen login_set_roots = submission_login_setting_roots;
1093de32efb2a231949566d4bd8aa55a8f43fb70Timo Sirainen}
de754cb78f75e8b3b994cddafe41c9ed1467c33dTimo Sirainen
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainenstatic void submission_login_init(void)
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen{
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen struct smtp_server_settings smtp_server_set;
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen /* override the default login_die() */
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen master_service_set_die_callback(master_service, submission_login_die);
660b99a7059824676b2b8d6f79b8e15d47df25a2Timo Sirainen
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen /* initialize SMTP server */
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen i_zero(&smtp_server_set);
75e46142d8fbac811df8f2ca58d9a2f48a75d65fTimo Sirainen smtp_server_set.protocol = SMTP_PROTOCOL_SMTP;
75e46142d8fbac811df8f2ca58d9a2f48a75d65fTimo Sirainen smtp_server_set.max_pipelined_commands = 5;
75e46142d8fbac811df8f2ca58d9a2f48a75d65fTimo Sirainen smtp_server_set.max_bad_commands = CLIENT_MAX_BAD_COMMANDS;
75e46142d8fbac811df8f2ca58d9a2f48a75d65fTimo Sirainen smtp_server = smtp_server_init(&smtp_server_set);
75e46142d8fbac811df8f2ca58d9a2f48a75d65fTimo Sirainen}
75e46142d8fbac811df8f2ca58d9a2f48a75d65fTimo Sirainen
75e46142d8fbac811df8f2ca58d9a2f48a75d65fTimo Sirainenstatic void submission_login_deinit(void)
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen{
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen clients_destroy_all();
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen
e911b23f3e05308df9b98b1a3fdaf72e4302d8fdTimo Sirainen smtp_server_deinit(&smtp_server);
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen}
77f1da4b5e2b800197d8db548235497d5e9d6a4fTimo Sirainen
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainenstatic const struct smtp_server_callbacks smtp_callbacks = {
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen .conn_cmd_helo = cmd_helo,
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen .conn_start_tls = submission_login_start_tls,
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen .conn_cmd_auth = cmd_auth,
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen .conn_cmd_auth_continue = cmd_auth_continue,
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen .conn_cmd_xclient = client_connection_cmd_xclient,
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen .conn_disconnect = client_connection_disconnect,
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen .conn_destroy = client_connection_destroy,
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen .conn_is_trusted = client_connection_is_trusted
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen};
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainenstatic struct client_vfuncs submission_client_vfuncs = {
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen submission_client_alloc,
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen submission_client_create,
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen submission_client_destroy,
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen submission_client_notify_auth_ready,
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen submission_client_notify_disconnect,
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen NULL,
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen NULL,
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen NULL,
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen NULL,
18f1bbf05980d3c53ecae81b62574212f0891522Timo Sirainen submission_client_auth_send_challenge,
77f1da4b5e2b800197d8db548235497d5e9d6a4fTimo Sirainen NULL,
75e46142d8fbac811df8f2ca58d9a2f48a75d65fTimo Sirainen submission_client_auth_result,
77f1da4b5e2b800197d8db548235497d5e9d6a4fTimo Sirainen submission_proxy_reset,
18f1bbf05980d3c53ecae81b62574212f0891522Timo Sirainen submission_proxy_parse_line,
75e46142d8fbac811df8f2ca58d9a2f48a75d65fTimo Sirainen submission_proxy_error,
75e46142d8fbac811df8f2ca58d9a2f48a75d65fTimo Sirainen submission_proxy_get_state,
77f1da4b5e2b800197d8db548235497d5e9d6a4fTimo Sirainen NULL,
18f1bbf05980d3c53ecae81b62574212f0891522Timo Sirainen NULL,
18f1bbf05980d3c53ecae81b62574212f0891522Timo Sirainen NULL
18f1bbf05980d3c53ecae81b62574212f0891522Timo Sirainen};
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainenstatic const struct login_binary submission_login_binary = {
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen .protocol = "submission",
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen .process_name = "submission-login",
e911b23f3e05308df9b98b1a3fdaf72e4302d8fdTimo Sirainen .default_port = 587,
e911b23f3e05308df9b98b1a3fdaf72e4302d8fdTimo Sirainen
e911b23f3e05308df9b98b1a3fdaf72e4302d8fdTimo Sirainen .client_vfuncs = &submission_client_vfuncs,
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen .preinit = submission_login_preinit,
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen .init = submission_login_init,
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen .deinit = submission_login_deinit,
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen
e911b23f3e05308df9b98b1a3fdaf72e4302d8fdTimo Sirainen .sasl_support_final_reply = FALSE
e911b23f3e05308df9b98b1a3fdaf72e4302d8fdTimo Sirainen};
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainenint main(int argc, char *argv[])
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen{
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen return login_binary_run(&submission_login_binary, argc, argv);
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen}
2598b2f36365b52d9754b9348a5be29569293e46Timo Sirainen