bcb4e51a409d94ae670de96afb8483a4f7855294Stephan Bosch/* Copyright (c) 2013-2018 Dovecot authors, see the included COPYING file */
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch#include "test-lib.h"
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch#include "str.h"
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch#include "array.h"
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch#include "test-common.h"
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch#include "smtp-common.h"
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch#include "smtp-address.h"
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch#include "smtp-params.h"
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Boschstatic struct smtp_address test_address1 =
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch { .localpart = NULL, .domain = NULL };
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Boschstatic struct smtp_address test_address2 =
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch { .localpart = "user+detail", .domain = NULL };
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Boschstatic struct smtp_address test_address3 =
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch { .localpart = "e=mc2", .domain = "example.com" };
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Boschstatic struct smtp_param test_params1[] = {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch { .keyword = "FROP", .value = "friep" }
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch};
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Boschstatic struct smtp_param test_params2[] = {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch { .keyword = "FROP", .value = "friep" },
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch { .keyword = "FRUP", .value = "frml" }
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch};
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Boschstatic struct buffer test_params_buffer1 = {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .data = (void*)&test_params1,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .used = sizeof(test_params1)
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch};
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Boschstatic struct buffer test_params_buffer2 = {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .data = (void*)&test_params2,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .used = sizeof(test_params2)
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch};
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch/* Valid mail params tests */
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Boschstruct valid_mail_params_parse_test {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch const char *input, *output;
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch enum smtp_capability caps;
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch bool extensions;
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch struct smtp_params_mail params;
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch};
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Boschstatic const struct valid_mail_params_parse_test
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Boschvalid_mail_params_parse_tests[] = {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch /* AUTH */
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .input = "AUTH=<>",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .caps = SMTP_CAPABILITY_AUTH,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .params = {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .auth = &test_address1
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch }
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch },{
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .input = "AUTH=user+2Bdetail",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .caps = SMTP_CAPABILITY_AUTH,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .params = {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .auth = &test_address2
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch }
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch },{
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .input = "AUTH=e+3Dmc2@example.com",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .caps = SMTP_CAPABILITY_AUTH,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .params = {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .auth = &test_address3
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch }
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch /* BODY */
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch },{
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .input = "",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .caps = SMTP_CAPABILITY_8BITMIME,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .params = {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .body = {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .type = SMTP_PARAM_MAIL_BODY_TYPE_UNSPECIFIED,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch }
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch }
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch },{
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .input = "BODY=7BIT",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .caps = SMTP_CAPABILITY_8BITMIME,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .params = {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .body = {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .type = SMTP_PARAM_MAIL_BODY_TYPE_7BIT,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch }
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch }
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch },{
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .input = "BODY=8BITMIME",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .caps = SMTP_CAPABILITY_8BITMIME,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .params = {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .body = {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .type = SMTP_PARAM_MAIL_BODY_TYPE_8BITMIME,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch }
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch }
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch },{
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .input = "BODY=BINARYMIME",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .caps = SMTP_CAPABILITY_8BITMIME |
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch SMTP_CAPABILITY_BINARYMIME |
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch SMTP_CAPABILITY_CHUNKING,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .params = {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .body = {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .type = SMTP_PARAM_MAIL_BODY_TYPE_BINARYMIME,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch }
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch }
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch },{
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .input = "BODY=FROP",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .caps = SMTP_CAPABILITY_8BITMIME |
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch SMTP_CAPABILITY_BINARYMIME |
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch SMTP_CAPABILITY_CHUNKING,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .extensions = TRUE,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .params = {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .body = {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .type = SMTP_PARAM_MAIL_BODY_TYPE_EXTENSION,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .ext = "FROP"
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch }
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch }
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch /* ENVID */
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch },{
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .input = "",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .caps = SMTP_CAPABILITY_DSN,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .params = {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .envid = NULL,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch }
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch },{
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .input = "ENVID=",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .caps = SMTP_CAPABILITY_DSN,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .params = {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .envid = "",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch }
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch },{
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .input = "ENVID=AABBCCDD",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .caps = SMTP_CAPABILITY_DSN,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .params = {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .envid = "AABBCCDD",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch }
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch },{
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .input = "ENVID=AA+2BBB+3DCC+2BDD",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .caps = SMTP_CAPABILITY_DSN,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .params = {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .envid = "AA+BB=CC+DD",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch }
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch /* RET */
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch },{
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .input = "",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .caps = SMTP_CAPABILITY_DSN,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .params = {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .ret = SMTP_PARAM_MAIL_RET_UNSPECIFIED,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch }
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch },{
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .input = "RET=HDRS",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .caps = SMTP_CAPABILITY_DSN,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .params = {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .ret = SMTP_PARAM_MAIL_RET_HDRS,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch }
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch },{
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .input = "RET=FULL",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .caps = SMTP_CAPABILITY_DSN,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .params = {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .ret = SMTP_PARAM_MAIL_RET_FULL,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch }
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch /* SIZE */
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch },{
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .input = "",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .caps = SMTP_CAPABILITY_SIZE,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .params = {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .size = 0
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch }
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch },{
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .input = "SIZE=267914296",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .caps = SMTP_CAPABILITY_SIZE,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .params = {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .size = 267914296
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch }
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch /* <extensions> */
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch },{
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .input = "FROP=friep",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .caps = SMTP_CAPABILITY_SIZE,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .extensions = TRUE,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .params = {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .extra_params = {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .arr = {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .buffer = &test_params_buffer1,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .element_size = sizeof(struct smtp_param)
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch }
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch }
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch }
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch },{
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .input = "FROP=friep FRUP=frml",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .extensions = TRUE,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .params = {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .extra_params = {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .arr = {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .buffer = &test_params_buffer2,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .element_size = sizeof(struct smtp_param)
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch }
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch }
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch }
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch }
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch};
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Boschunsigned int valid_mail_params_parse_test_count =
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch N_ELEMENTS(valid_mail_params_parse_tests);
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Boschstatic void
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Boschtest_smtp_mail_params_auth(const struct smtp_params_mail *test,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch const struct smtp_params_mail *parsed)
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch{
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch if (parsed->auth->localpart == NULL ||
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test->auth->localpart == NULL) {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_out(t_strdup_printf("params.auth->localpart = %s",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch parsed->auth->localpart),
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch (parsed->auth->localpart == test->auth->localpart));
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch } else {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_out(t_strdup_printf("params.auth->localpart = \"%s\"",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch parsed->auth->localpart),
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch strcmp(parsed->auth->localpart,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test->auth->localpart) == 0);
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch }
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch if (parsed->auth->domain == NULL ||
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test->auth->domain == NULL) {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_out(t_strdup_printf("params.auth->domain = %s",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch parsed->auth->domain),
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch (parsed->auth->domain == test->auth->domain));
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch } else {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_out(t_strdup_printf("params.auth->domain = \"%s\"",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch parsed->auth->domain),
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch strcmp(parsed->auth->domain,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test->auth->domain) == 0);
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch }
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch}
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Boschstatic void
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Boschtest_smtp_mail_params_body(const struct smtp_params_mail *test,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch const struct smtp_params_mail *parsed)
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch{
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch const char *type_name = NULL;
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch switch (parsed->body.type) {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch case SMTP_PARAM_MAIL_BODY_TYPE_UNSPECIFIED:
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch type_name = "<UNSPECIFIED>";
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch break;
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch case SMTP_PARAM_MAIL_BODY_TYPE_7BIT:
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch type_name = "7BIT";
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch break;
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch case SMTP_PARAM_MAIL_BODY_TYPE_8BITMIME:
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch type_name = "8BITMIME";
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch break;
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch case SMTP_PARAM_MAIL_BODY_TYPE_BINARYMIME:
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch type_name = "BINARYMIME";
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch break;
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch case SMTP_PARAM_MAIL_BODY_TYPE_EXTENSION:
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch type_name = parsed->body.ext;
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch break;
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch default:
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch i_unreached();
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch }
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_out(t_strdup_printf("params.body.type = %s", type_name),
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch (parsed->body.type == test->body.type &&
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch (parsed->body.type != SMTP_PARAM_MAIL_BODY_TYPE_EXTENSION ||
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch (parsed->body.ext != NULL &&
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch strcmp(parsed->body.ext, test->body.ext) == 0))));
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch}
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Boschstatic void
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Boschtest_smtp_mail_params_envid(const struct smtp_params_mail *test,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch const struct smtp_params_mail *parsed)
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch{
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch if (parsed->envid == NULL ||
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test->envid == NULL) {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_out(t_strdup_printf("params.auth->localpart = %s",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch parsed->envid),
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch (parsed->envid == test->envid));
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch } else {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_out(t_strdup_printf("params.auth->localpart = \"%s\"",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch parsed->envid),
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch strcmp(parsed->envid, test->envid) == 0);
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch }
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch}
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Boschstatic void
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Boschtest_smtp_mail_params_ret(const struct smtp_params_mail *test,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch const struct smtp_params_mail *parsed)
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch{
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch const char *ret_name = NULL;
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch switch (parsed->ret) {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch case SMTP_PARAM_MAIL_RET_UNSPECIFIED:
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch ret_name = "<UNSPECIFIED>";
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch break;
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch case SMTP_PARAM_MAIL_RET_HDRS:
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch ret_name = "HDRS";
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch break;
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch case SMTP_PARAM_MAIL_RET_FULL:
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch ret_name = "FULL";
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch break;
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch default:
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch i_unreached();
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch }
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_out(t_strdup_printf("params.ret = %s", ret_name),
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch parsed->ret == test->ret);
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch}
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Boschstatic void
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Boschtest_smtp_mail_params_size(const struct smtp_params_mail *test,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch const struct smtp_params_mail *parsed)
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch{
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_out(t_strdup_printf("params.size = %"PRIuUOFF_T, parsed->size),
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch parsed->size == test->size);
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch}
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Boschstatic void
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Boschtest_smtp_mail_params_extensions(const struct smtp_params_mail *test,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch const struct smtp_params_mail *parsed)
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch{
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch const struct smtp_param *tparam, *pparam;
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch unsigned int i;
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch if (!array_is_created(&test->extra_params) ||
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch array_count(&test->extra_params) == 0) {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_out(t_strdup_printf("params.extra_params.count = %u",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch (!array_is_created(&parsed->extra_params) ? 0 :
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch array_count(&parsed->extra_params))),
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch (!array_is_created(&parsed->extra_params) ||
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch array_count(&parsed->extra_params) == 0));
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch return;
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch }
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch if (!array_is_created(&parsed->extra_params) ||
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch array_count(&parsed->extra_params) == 0) {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_out("params.extra_params.count = 0", FALSE);
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch return;
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch }
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch if (array_count(&test->extra_params) !=
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch array_count(&parsed->extra_params)) {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_out(t_strdup_printf("params.extra_params.count = %u",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch (!array_is_created(&parsed->extra_params) ? 0 :
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch array_count(&parsed->extra_params))), FALSE);
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch return;
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch }
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch for (i = 0; i < array_count(&test->extra_params); i++) {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch tparam = array_idx(&test->extra_params, i);
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch pparam = array_idx(&parsed->extra_params, i);
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_out(t_strdup_printf(
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch "params.extra_params[%u] = [\"%s\"=\"%s\"]", i,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch pparam->keyword, pparam->value),
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch strcmp(pparam->keyword, tparam->keyword) == 0 &&
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch ((pparam->value == NULL && tparam->value == NULL) ||
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch (pparam->value != NULL && tparam->value != NULL &&
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch strcmp(pparam->value, tparam->value) == 0)));
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch }
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch}
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Boschstatic void test_smtp_mail_params_parse_valid(void)
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch{
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch unsigned int i;
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch for (i = 0; i < valid_mail_params_parse_test_count; i++) T_BEGIN {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch const struct valid_mail_params_parse_test *test;
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch struct smtp_params_mail params;
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch enum smtp_param_parse_error error_code;
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch const char *error = NULL, *output;
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch int ret;
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test = &valid_mail_params_parse_tests[i];
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch ret = smtp_params_mail_parse(pool_datastack_create(),
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test->input, test->caps, test->extensions, &params,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch &error_code, &error);
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_begin(t_strdup_printf("smtp mail params valid [%d]", i));
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_out_reason(t_strdup_printf("parse(\"%s\")",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test->input), ret >= 0, error);
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch if (ret >= 0) {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch string_t *encoded;
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch /* AUTH */
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch if ((test->caps & SMTP_CAPABILITY_AUTH) != 0)
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_smtp_mail_params_auth(&test->params, &params);
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch /* BODY */
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch if ((test->caps & SMTP_CAPABILITY_8BITMIME) != 0 ||
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch (test->caps & SMTP_CAPABILITY_BINARYMIME) != 0)
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_smtp_mail_params_body(&test->params, &params);
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch /* ENVID */
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch if ((test->caps & SMTP_CAPABILITY_DSN) != 0)
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_smtp_mail_params_envid(&test->params, &params);
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch /* RET */
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch if ((test->caps & SMTP_CAPABILITY_DSN) != 0)
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_smtp_mail_params_ret(&test->params, &params);
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch /* SIZE */
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch if ((test->caps & SMTP_CAPABILITY_SIZE) != 0)
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_smtp_mail_params_size(&test->params, &params);
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch /* <extensions> */
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch if (test->extensions)
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_smtp_mail_params_extensions(&test->params, &params);
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch encoded = t_str_new(256);
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch smtp_params_mail_write(encoded, test->caps, &params);
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch output = (test->output == NULL ? test->input : test->output);
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_out(t_strdup_printf
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch ("encode() = \"%s\"", str_c(encoded)),
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch strcmp(str_c(encoded), output) == 0);
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch }
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_end();
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch } T_END;
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch}
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch/* Invalid mail params tests */
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Boschstruct invalid_mail_params_parse_test {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch const char *input;
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch enum smtp_capability caps;
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch bool extensions;
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch};
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Boschstatic const struct invalid_mail_params_parse_test
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Boschinvalid_mail_params_parse_tests[] = {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch /* AUTH */
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .input = "AUTH=<>",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch },{
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .input = "AUTH=++",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .caps = SMTP_CAPABILITY_AUTH
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch /* BODY */
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch },{
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .input = "BODY=8BITMIME",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch },{
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .input = "BODY=BINARYMIME",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch },{
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .input = "BODY=BINARYMIME",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .caps = SMTP_CAPABILITY_BINARYMIME
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch },{
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .input = "BODY=FROP",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .caps = SMTP_CAPABILITY_8BITMIME
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch /* ENVID */
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch },{
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .input = "ENVID=AABBCC",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch },{
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .input = "ENVID=++",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .caps = SMTP_CAPABILITY_DSN
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch /* RET */
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch },{
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .input = "RET=FULL",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch },{
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .input = "RET=HDR",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch },{
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .input = "RET=FROP",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .caps = SMTP_CAPABILITY_DSN
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch /* SIZE */
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch },{
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .input = "SIZE=13",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch },{
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .input = "SIZE=ABC",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .caps = SMTP_CAPABILITY_SIZE
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch }
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch};
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Boschunsigned int invalid_mail_params_parse_test_count =
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch N_ELEMENTS(invalid_mail_params_parse_tests);
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Boschstatic void test_smtp_mail_params_parse_invalid(void)
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch{
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch unsigned int i;
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch for (i = 0; i < invalid_mail_params_parse_test_count; i++) T_BEGIN {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch const struct invalid_mail_params_parse_test *test;
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch struct smtp_params_mail params;
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch enum smtp_param_parse_error error_code;
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch const char *error = NULL;
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch int ret;
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test = &invalid_mail_params_parse_tests[i];
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch ret = smtp_params_mail_parse(pool_datastack_create(),
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test->input, test->caps, test->extensions, &params,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch &error_code, &error);
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_begin(t_strdup_printf("smtp mail params invalid [%d]", i));
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_out_reason(t_strdup_printf("parse(\"%s\")",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test->input), ret < 0, error);
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_end();
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch } T_END;
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch}
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch/* Valid rcpt params tests */
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Boschstruct valid_rcpt_params_parse_test {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch const char *input, *output;
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch enum smtp_capability caps;
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch bool extensions;
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch struct smtp_params_rcpt params;
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch};
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Boschstatic const struct valid_rcpt_params_parse_test
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Boschvalid_rcpt_params_parse_tests[] = {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch /* AUTH */
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch#if 0 // FIXME: message_address_parser() does not allow bare localpart
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch // addresses.
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .input = "ORCPT=rfc822;user+2Bdetail",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .caps = SMTP_CAPABILITY_DSN,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .params = {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .orcpt = {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .addr = &test_address2
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch }
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch }
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch },{
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch#endif
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .input = "ORCPT=rfc822;e+3Dmc2@example.com",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .caps = SMTP_CAPABILITY_DSN,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .params = {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .orcpt = {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .addr = &test_address3
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch }
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch }
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch /* NOTIFY */
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch },{
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .input = "",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .caps = SMTP_CAPABILITY_DSN,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .params = {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .notify = SMTP_PARAM_RCPT_NOTIFY_UNSPECIFIED,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch }
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch },{
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .input = "NOTIFY=SUCCESS",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .caps = SMTP_CAPABILITY_DSN,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .params = {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .notify = SMTP_PARAM_RCPT_NOTIFY_SUCCESS,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch }
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch },{
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .input = "NOTIFY=FAILURE",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .caps = SMTP_CAPABILITY_DSN,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .params = {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .notify = SMTP_PARAM_RCPT_NOTIFY_FAILURE,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch }
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch },{
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .input = "NOTIFY=DELAY",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .caps = SMTP_CAPABILITY_DSN,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .params = {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .notify = SMTP_PARAM_RCPT_NOTIFY_DELAY,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch }
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch },{
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .input = "NOTIFY=NEVER",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .caps = SMTP_CAPABILITY_DSN,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .params = {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .notify = SMTP_PARAM_RCPT_NOTIFY_NEVER,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch }
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch },{
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .input = "NOTIFY=SUCCESS,FAILURE,DELAY",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .caps = SMTP_CAPABILITY_DSN,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .params = {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .notify = SMTP_PARAM_RCPT_NOTIFY_SUCCESS |
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch SMTP_PARAM_RCPT_NOTIFY_FAILURE |
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch SMTP_PARAM_RCPT_NOTIFY_DELAY,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch }
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch /* <extensions> */
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch },{
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .input = "FROP=friep",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .caps = SMTP_CAPABILITY_SIZE,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .extensions = TRUE,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .params = {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .extra_params = {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .arr = {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .buffer = &test_params_buffer1,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .element_size = sizeof(struct smtp_param)
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch }
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch }
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch }
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch },{
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .input = "FROP=friep FRUP=frml",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .extensions = TRUE,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .params = {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .extra_params = {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .arr = {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .buffer = &test_params_buffer2,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .element_size = sizeof(struct smtp_param)
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch }
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch }
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch }
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch }
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch};
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Boschunsigned int valid_rcpt_params_parse_test_count =
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch N_ELEMENTS(valid_rcpt_params_parse_tests);
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Boschstatic void
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Boschtest_smtp_rcpt_params_orcpt(const struct smtp_params_rcpt *test,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch const struct smtp_params_rcpt *parsed)
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch{
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch if (parsed->orcpt.addr == NULL) {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_out("params.orcpt.addr = NULL",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test->orcpt.addr == NULL);
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch return;
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch }
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch if (parsed->orcpt.addr->localpart == NULL ||
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test->orcpt.addr->localpart == NULL) {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_out(t_strdup_printf("params.orcpt.addr->localpart = %s",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch parsed->orcpt.addr->localpart),
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch (parsed->orcpt.addr->localpart ==
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test->orcpt.addr->localpart));
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch } else {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_out(t_strdup_printf("params.orcpt.addr->localpart = \"%s\"",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch parsed->orcpt.addr->localpart),
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch strcmp(parsed->orcpt.addr->localpart,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test->orcpt.addr->localpart) == 0);
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch }
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch if (parsed->orcpt.addr->domain == NULL ||
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test->orcpt.addr->domain == NULL) {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_out(t_strdup_printf("params.orcpt.addr->domain = %s",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch parsed->orcpt.addr->domain),
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch (parsed->orcpt.addr->domain ==
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test->orcpt.addr->domain));
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch } else {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_out(t_strdup_printf("params.orcpt.addr->domain = \"%s\"",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch parsed->orcpt.addr->domain),
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch strcmp(parsed->orcpt.addr->domain,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test->orcpt.addr->domain) == 0);
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch }
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch}
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Boschstatic void
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Boschtest_smtp_rcpt_params_notify(const struct smtp_params_rcpt *test,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch const struct smtp_params_rcpt *parsed)
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch{
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch string_t *notify_name;
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch notify_name = t_str_new(64);
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch if (parsed->notify == 0) {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch str_append(notify_name, "<UNSPECIFIED>");
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch } else if ((parsed->notify & SMTP_PARAM_RCPT_NOTIFY_NEVER) != 0) {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch i_assert((parsed->notify & SMTP_PARAM_RCPT_NOTIFY_SUCCESS) == 0);
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch i_assert((parsed->notify & SMTP_PARAM_RCPT_NOTIFY_FAILURE) == 0);
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch i_assert((parsed->notify & SMTP_PARAM_RCPT_NOTIFY_DELAY) == 0);
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch str_append(notify_name, "NEVER");
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch } else {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch if ((parsed->notify & SMTP_PARAM_RCPT_NOTIFY_SUCCESS) != 0)
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch str_append(notify_name, "SUCCESS");
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch if ((parsed->notify & SMTP_PARAM_RCPT_NOTIFY_FAILURE) != 0) {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch if (str_len(notify_name) > 0)
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch str_append_c(notify_name, ',');
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch str_append(notify_name, "FAILURE");
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch }
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch if ((parsed->notify & SMTP_PARAM_RCPT_NOTIFY_DELAY) != 0) {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch if (str_len(notify_name) > 0)
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch str_append_c(notify_name, ',');
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch str_append(notify_name, "DELAY");
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch }
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch }
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_out(t_strdup_printf("params.notify = %s", str_c(notify_name)),
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch parsed->notify == test->notify);
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch}
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Boschstatic void
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Boschtest_smtp_rcpt_params_extensions(const struct smtp_params_rcpt *test,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch const struct smtp_params_rcpt *parsed)
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch{
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch const struct smtp_param *tparam, *pparam;
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch unsigned int i;
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch if (!array_is_created(&test->extra_params) ||
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch array_count(&test->extra_params) == 0) {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_out(t_strdup_printf("params.extra_params.count = %u",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch (!array_is_created(&parsed->extra_params) ? 0 :
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch array_count(&parsed->extra_params))),
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch (!array_is_created(&parsed->extra_params) ||
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch array_count(&parsed->extra_params) == 0));
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch return;
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch }
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch if (!array_is_created(&parsed->extra_params) ||
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch array_count(&parsed->extra_params) == 0) {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_out("params.extra_params.count = 0", FALSE);
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch return;
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch }
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch if (array_count(&test->extra_params) !=
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch array_count(&parsed->extra_params)) {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_out(t_strdup_printf("params.extra_params.count = %u",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch (!array_is_created(&parsed->extra_params) ? 0 :
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch array_count(&parsed->extra_params))), FALSE);
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch return;
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch }
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch for (i = 0; i < array_count(&test->extra_params); i++) {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch tparam = array_idx(&test->extra_params, i);
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch pparam = array_idx(&parsed->extra_params, i);
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_out(t_strdup_printf(
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch "params.extra_params[%u] = [\"%s\"=\"%s\"]", i,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch pparam->keyword, pparam->value),
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch strcmp(pparam->keyword, tparam->keyword) == 0 &&
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch ((pparam->value == NULL && tparam->value == NULL) ||
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch (pparam->value != NULL && tparam->value != NULL &&
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch strcmp(pparam->value, tparam->value) == 0)));
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch }
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch}
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Boschstatic void test_smtp_rcpt_params_parse_valid(void)
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch{
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch unsigned int i;
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch for (i = 0; i < valid_rcpt_params_parse_test_count; i++) T_BEGIN {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch const struct valid_rcpt_params_parse_test *test;
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch struct smtp_params_rcpt params;
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch enum smtp_param_parse_error error_code;
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch const char *error = NULL, *output;
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch int ret;
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test = &valid_rcpt_params_parse_tests[i];
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch ret = smtp_params_rcpt_parse(pool_datastack_create(),
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test->input, test->caps, test->extensions, &params,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch &error_code, &error);
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_begin(t_strdup_printf("smtp rcpt params valid [%d]", i));
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_out_reason(t_strdup_printf("parse(\"%s\")",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test->input), ret >= 0, error);
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch if (ret >= 0) {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch string_t *encoded;
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch /* ORCPT */
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch if ((test->caps & SMTP_CAPABILITY_DSN) != 0)
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_smtp_rcpt_params_orcpt(&test->params, &params);
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch /* NOTIFY */
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch if ((test->caps & SMTP_CAPABILITY_DSN) != 0)
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_smtp_rcpt_params_notify(&test->params, &params);
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch /* <extensions> */
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch if (test->extensions)
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_smtp_rcpt_params_extensions(&test->params, &params);
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch encoded = t_str_new(256);
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch smtp_params_rcpt_write(encoded, test->caps, &params);
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch output = (test->output == NULL ? test->input : test->output);
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_out(t_strdup_printf("encode() = \"%s\"",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch str_c(encoded)),
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch strcmp(str_c(encoded), output) == 0);
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch }
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_end();
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch } T_END;
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch}
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch/* Invalid rcpt params tests */
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Boschstruct invalid_rcpt_params_parse_test {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch const char *input;
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch enum smtp_capability caps;
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch bool extensions;
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch};
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Boschstatic const struct invalid_rcpt_params_parse_test
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Boschinvalid_rcpt_params_parse_tests[] = {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch /* DSN */
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .input = "ORCPT=rfc822;frop@example.com",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch },{
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .input = "ORCPT=++",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .caps = SMTP_CAPABILITY_DSN
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch },{
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .input = "ORCPT=rfc822;++",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .caps = SMTP_CAPABILITY_DSN
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch },{
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .input = "NOTIFY=SUCCESS",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch },{
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .input = "NOTIFY=FROP",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .caps = SMTP_CAPABILITY_DSN
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch },{
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .input = "NOTIFY=NEVER,SUCCESS",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch .caps = SMTP_CAPABILITY_DSN
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch }
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch};
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Boschunsigned int invalid_rcpt_params_parse_test_count =
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch N_ELEMENTS(invalid_rcpt_params_parse_tests);
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Boschstatic void test_smtp_rcpt_params_parse_invalid(void)
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch{
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch unsigned int i;
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch for (i = 0; i < invalid_rcpt_params_parse_test_count; i++) T_BEGIN {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch const struct invalid_rcpt_params_parse_test *test;
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch struct smtp_params_rcpt params;
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch enum smtp_param_parse_error error_code;
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch const char *error = NULL;
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch int ret;
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test = &invalid_rcpt_params_parse_tests[i];
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch ret = smtp_params_rcpt_parse(pool_datastack_create(),
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test->input, test->caps, test->extensions, &params,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch &error_code, &error);
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_begin(t_strdup_printf("smtp rcpt params invalid [%d]", i));
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_out_reason(t_strdup_printf("parse(\"%s\")",
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test->input), ret < 0, error);
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_end();
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch } T_END;
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch}
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Boschint main(void)
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch{
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch static void (*test_functions[])(void) = {
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_smtp_mail_params_parse_valid,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_smtp_mail_params_parse_invalid,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_smtp_rcpt_params_parse_valid,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch test_smtp_rcpt_params_parse_invalid,
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch NULL
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch };
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch return test_run(test_functions);
39bf54004e8ef15baa4c18c7969e87c51b8f197bStephan Bosch}