diff options
Diffstat (limited to '')
-rw-r--r-- | src/lib-smtp/smtp-params.h | 233 |
1 files changed, 233 insertions, 0 deletions
diff --git a/src/lib-smtp/smtp-params.h b/src/lib-smtp/smtp-params.h new file mode 100644 index 0000000..34568ce --- /dev/null +++ b/src/lib-smtp/smtp-params.h @@ -0,0 +1,233 @@ +#ifndef SMTP_PARAMS_H +#define SMTP_PARAMS_H + +#include "array-decl.h" + +#include "smtp-common.h" + +struct smtp_param; + +ARRAY_DEFINE_TYPE(smtp_param, struct smtp_param); + +enum smtp_param_mail_body_type { + SMTP_PARAM_MAIL_BODY_TYPE_UNSPECIFIED = 0, + SMTP_PARAM_MAIL_BODY_TYPE_7BIT, + SMTP_PARAM_MAIL_BODY_TYPE_8BITMIME, + SMTP_PARAM_MAIL_BODY_TYPE_BINARYMIME, + SMTP_PARAM_MAIL_BODY_TYPE_EXTENSION +}; + +enum smtp_param_mail_ret { + SMTP_PARAM_MAIL_RET_UNSPECIFIED = 0, + SMTP_PARAM_MAIL_RET_HDRS, + SMTP_PARAM_MAIL_RET_FULL, +}; + +enum smtp_param_rcpt_notify { + SMTP_PARAM_RCPT_NOTIFY_UNSPECIFIED = 0x00, + SMTP_PARAM_RCPT_NOTIFY_SUCCESS = 0x01, + SMTP_PARAM_RCPT_NOTIFY_FAILURE = 0x02, + SMTP_PARAM_RCPT_NOTIFY_DELAY = 0x04, + SMTP_PARAM_RCPT_NOTIFY_NEVER = 0x80 +}; + +struct smtp_param { + const char *keyword; + const char *value; +}; + +struct smtp_params_mail { + /* AUTH: RFC 4954 */ + const struct smtp_address *auth; + /* BODY: RFC 6152 */ + struct { + enum smtp_param_mail_body_type type; + const char *ext; + } body; + /* ENVID: RFC 3461, Section 4.4 */ + const char *envid; + /* RET: RFC 3461, Section 4.3 */ + enum smtp_param_mail_ret ret; + /* SIZE: RFC 1870 */ + uoff_t size; + /* extra parameters */ + ARRAY_TYPE(smtp_param) extra_params; +}; + +struct smtp_params_rcpt { + /* ORCPT: RFC 3461, Section 4.2 */ + struct { + const char *addr_type; + /* addr_type=rfc822 */ + const struct smtp_address *addr; + /* raw value */ + const char *addr_raw; + } orcpt; + /* NOTIFY: RFC 3461, Section 4.1 */ + enum smtp_param_rcpt_notify notify; + /* extra parameters */ + ARRAY_TYPE(smtp_param) extra_params; +}; + +enum smtp_param_parse_error { + SMTP_PARAM_PARSE_ERROR_BAD_SYNTAX = 0, + SMTP_PARAM_PARSE_ERROR_NOT_SUPPORTED +}; + +/* + * Common + */ + +/* parse */ + +int smtp_param_parse(pool_t pool, const char *text, + struct smtp_param *param_r, const char **error_r); + +/* manipulate */ + +void smtp_params_copy(pool_t pool, ARRAY_TYPE(smtp_param) *dst, + const ARRAY_TYPE(smtp_param) *src) ATTR_NULL(3); + +void smtp_params_add_one(ARRAY_TYPE(smtp_param) *params, pool_t pool, + const char *keyword, const char *value); +void smtp_params_add_encoded(ARRAY_TYPE(smtp_param) *params, pool_t pool, + const char *keyword, const unsigned char *value, + size_t value_len); + +bool smtp_params_drop_one(ARRAY_TYPE(smtp_param) *params, const char *keyword, + const char **value_r); + +/* write */ + +void smtp_param_write(string_t *out, const struct smtp_param *param); + +/* evaluate */ + +const struct smtp_param * +smtp_params_get_param(const ARRAY_TYPE(smtp_param) *params, + const char *keyword); +int smtp_params_decode_param(const ARRAY_TYPE(smtp_param) *params, + const char *keyword, string_t **value_r, + bool allow_nul, const char **error_r); + +bool smtp_params_equal(const ARRAY_TYPE(smtp_param) *params1, + const ARRAY_TYPE(smtp_param) *params2); + +/* + * MAIL parameters + */ + +/* parse */ + +int smtp_params_mail_parse(pool_t pool, const char *args, + enum smtp_capability caps, + const char *const *param_extensions, + const char *const *body_param_extensions, + struct smtp_params_mail *params_r, + enum smtp_param_parse_error *error_code_r, + const char **error_r) ATTR_NULL(4, 5); + +/* manipulate */ + +void smtp_params_mail_copy(pool_t pool, struct smtp_params_mail *dst, + const struct smtp_params_mail *src); + +void smtp_params_mail_add_extra(struct smtp_params_mail *params, pool_t pool, + const char *keyword, const char *value) + ATTR_NULL(4); +void smtp_params_mail_encode_extra(struct smtp_params_mail *params, pool_t pool, + const char *keyword, + const unsigned char *value, + size_t value_len); +bool smtp_params_mail_drop_extra(struct smtp_params_mail *params, + const char *keyword, const char **value_r) + ATTR_NULL(3); + +/* write */ + +void smtp_params_mail_write(string_t *buffer, enum smtp_capability caps, + const char *const *extra_params, + const struct smtp_params_mail *params) ATTR_NULL(3); + +/* evaluate */ + +const struct smtp_param * +smtp_params_mail_get_extra(const struct smtp_params_mail *params, + const char *keyword); +int smtp_params_mail_decode_extra(const struct smtp_params_mail *params, + const char *keyword, string_t **value_r, + bool allow_nul, const char **error_r); + +/* events */ + +void smtp_params_mail_add_to_event(const struct smtp_params_mail *params, + struct event *event); + +/* + * RCPT parameters + */ + +/* parse */ + +enum smtp_param_rcpt_parse_flags { + /* Allow address values without a domain part */ + SMTP_PARAM_RCPT_FLAG_ORCPT_ALLOW_LOCALPART = BIT(0), +}; + +int smtp_params_rcpt_parse(pool_t pool, const char *args, + enum smtp_param_rcpt_parse_flags flags, + enum smtp_capability caps, + const char *const *param_extensions, + struct smtp_params_rcpt *params_r, + enum smtp_param_parse_error *error_code_r, + const char **error_r) ATTR_NULL(4); + +/* manipulate */ + +void smtp_params_rcpt_copy(pool_t pool, struct smtp_params_rcpt *dst, + const struct smtp_params_rcpt *src) ATTR_NULL(3); + +void smtp_params_rcpt_add_extra(struct smtp_params_rcpt *params, pool_t pool, + const char *keyword, const char *value) + ATTR_NULL(4); +void smtp_params_rcpt_encode_extra(struct smtp_params_rcpt *params, pool_t pool, + const char *keyword, + const unsigned char *value, + size_t value_len); +bool smtp_params_rcpt_drop_extra(struct smtp_params_rcpt *params, + const char *keyword, const char **value_r) + ATTR_NULL(3); + +void smtp_params_rcpt_set_orcpt(struct smtp_params_rcpt *params, pool_t pool, + struct smtp_address *rcpt); + +/* write */ + +void smtp_params_rcpt_write(string_t *buffer, enum smtp_capability caps, + const char *const *extra_params, + const struct smtp_params_rcpt *params) ATTR_NULL(3); + +/* evaluate */ + +const struct smtp_param * +smtp_params_rcpt_get_extra(const struct smtp_params_rcpt *params, + const char *keyword); +int smtp_params_rcpt_decode_extra(const struct smtp_params_rcpt *params, + const char *keyword, string_t **value_r, + bool allow_nul, const char **error_r); + +bool smtp_params_rcpt_equal(const struct smtp_params_rcpt *params1, + const struct smtp_params_rcpt *params2); + +static inline bool +smtp_params_rcpt_has_orcpt(const struct smtp_params_rcpt *params) +{ + return (params->orcpt.addr_type != NULL); +} + +/* events */ + +void smtp_params_rcpt_add_to_event(const struct smtp_params_rcpt *params, + struct event *event); + +#endif |