Skip to content

Commit

Permalink
submission: Move generic part of DATA command to submission-commands.c.
Browse files Browse the repository at this point in the history
  • Loading branch information
stephanbosch authored and villesavolainen committed Feb 12, 2019
1 parent 353f551 commit d616e0e
Show file tree
Hide file tree
Showing 2 changed files with 77 additions and 72 deletions.
72 changes: 0 additions & 72 deletions src/submission/cmd-data.c
Expand Up @@ -3,9 +3,6 @@
#include "submission-common.h"
#include "str.h"
#include "str-sanitize.h"
#include "istream.h"
#include "istream-concat.h"
#include "istream-seekable.h"
#include "mail-storage.h"
#include "imap-url.h"
#include "imap-msgpart.h"
Expand Down Expand Up @@ -82,75 +79,6 @@ int cmd_data_relay(struct client *client, struct smtp_server_cmd_ctx *cmd,
return 0;
}

int cmd_data_continue(void *conn_ctx, struct smtp_server_cmd_ctx *cmd,
struct smtp_server_transaction *trans)
{
struct client *client = conn_ctx;
struct istream *data_input = client->state.data_input;
struct istream *inputs[3];
string_t *added_headers;
const unsigned char *data;
size_t size;
int ret;

while ((ret = i_stream_read_more(data_input, &data, &size)) > 0) {
i_stream_skip(data_input, size);
if (!smtp_server_cmd_data_check_size(cmd))
return -1;
}

if (ret == 0)
return 0;
if (ret < 0 && data_input->stream_errno != 0)
return -1;

/* Done reading DATA stream; remove it from state and continue with
local variable. */
client->state.data_input = NULL;

ret = i_stream_get_size(data_input, TRUE,
&client->state.data_size);
i_assert(ret > 0); // FIXME

/* prepend our own headers */
added_headers = t_str_new(200);
smtp_server_transaction_write_trace_record(added_headers, trans);

i_stream_seek(data_input, 0);
inputs[0] = i_stream_create_copy_from_data(
str_data(added_headers), str_len(added_headers));
inputs[1] = data_input;
inputs[2] = NULL;

data_input = i_stream_create_concat(inputs);
i_stream_unref(&inputs[0]);
i_stream_unref(&inputs[1]);

ret = cmd_data_relay(client, cmd, trans, data_input);

i_stream_unref(&data_input);
return ret;
}

int cmd_data_begin(void *conn_ctx,
struct smtp_server_cmd_ctx *cmd ATTR_UNUSED,
struct smtp_server_transaction *trans ATTR_UNUSED,
struct istream *data_input)
{
struct client *client = conn_ctx;
struct istream *inputs[2];
string_t *path;

inputs[0] = data_input;
inputs[1] = NULL;

path = t_str_new(256);
mail_user_set_get_temp_prefix(path, client->user->set);
client->state.data_input = i_stream_create_seekable_path(inputs,
SUBMISSION_MAIL_DATA_MAX_INMEMORY_SIZE, str_c(path));
return 0;
}

/*
* BURL command
*/
Expand Down
77 changes: 77 additions & 0 deletions src/submission/submission-commands.c
Expand Up @@ -2,6 +2,10 @@

#include "submission-common.h"
#include "str.h"
#include "istream.h"
#include "istream-concat.h"
#include "istream-seekable.h"
#include "mail-storage.h"
#include "smtp-client.h"
#include "smtp-client-connection.h"

Expand Down Expand Up @@ -118,3 +122,76 @@ int cmd_rset(void *conn_ctx, struct smtp_server_cmd_ctx *cmd)
return cmd_rset_relay(client, cmd);
}

/*
* DATA/BDAT commands
*/

int cmd_data_continue(void *conn_ctx, struct smtp_server_cmd_ctx *cmd,
struct smtp_server_transaction *trans)
{
struct client *client = conn_ctx;
struct istream *data_input = client->state.data_input;
struct istream *inputs[3];
string_t *added_headers;
const unsigned char *data;
size_t size;
int ret;

while ((ret = i_stream_read_more(data_input, &data, &size)) > 0) {
i_stream_skip(data_input, size);
if (!smtp_server_cmd_data_check_size(cmd))
return -1;
}

if (ret == 0)
return 0;
if (ret < 0 && data_input->stream_errno != 0)
return -1;

/* Done reading DATA stream; remove it from state and continue with
local variable. */
client->state.data_input = NULL;

ret = i_stream_get_size(data_input, TRUE,
&client->state.data_size);
i_assert(ret > 0); // FIXME

/* prepend our own headers */
added_headers = t_str_new(200);
smtp_server_transaction_write_trace_record(added_headers, trans);

i_stream_seek(data_input, 0);
inputs[0] = i_stream_create_copy_from_data(
str_data(added_headers), str_len(added_headers));
inputs[1] = data_input;
inputs[2] = NULL;

data_input = i_stream_create_concat(inputs);
i_stream_unref(&inputs[0]);
i_stream_unref(&inputs[1]);

ret = cmd_data_relay(client, cmd, trans, data_input);

i_stream_unref(&data_input);
return ret;
}

int cmd_data_begin(void *conn_ctx,
struct smtp_server_cmd_ctx *cmd ATTR_UNUSED,
struct smtp_server_transaction *trans ATTR_UNUSED,
struct istream *data_input)
{
struct client *client = conn_ctx;
struct istream *inputs[2];
string_t *path;

inputs[0] = data_input;
inputs[1] = NULL;

path = t_str_new(256);
mail_user_set_get_temp_prefix(path, client->user->set);
client->state.data_input = i_stream_create_seekable_path(inputs,
SUBMISSION_MAIL_DATA_MAX_INMEMORY_SIZE, str_c(path));
return 0;
}

0 comments on commit d616e0e

Please sign in to comment.