From: Stephan Bosch Date: Wed, 22 Apr 2020 00:27:05 +0000 (+0200) Subject: lib-smtp: smtp-params - Add support for xtext-encoding/decoding extra parameters. X-Git-Tag: 2.3.13~550 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=d0fb4283ec2bde52837814977c39a88a46854fe9;p=thirdparty%2Fdovecot%2Fcore.git lib-smtp: smtp-params - Add support for xtext-encoding/decoding extra parameters. --- diff --git a/src/lib-smtp/smtp-params.c b/src/lib-smtp/smtp-params.c index 2592955857..ea6b2654b3 100644 --- a/src/lib-smtp/smtp-params.c +++ b/src/lib-smtp/smtp-params.c @@ -124,6 +124,16 @@ void smtp_params_add_one(ARRAY_TYPE(smtp_param) *params, pool_t pool, array_push_back(params, ¶m); } +void smtp_params_add_encoded(ARRAY_TYPE(smtp_param) *params, pool_t pool, + const char *keyword, const unsigned char *value, + size_t value_len) +{ + string_t *value_enc = t_str_new(value_len * 2); + + smtp_xtext_encode(value_enc, value, value_len); + smtp_params_add_one(params, pool, keyword, str_c(value_enc)); +} + bool smtp_params_drop_one(ARRAY_TYPE(smtp_param) *params, const char *keyword, const char **value_r) { @@ -197,6 +207,22 @@ smtp_params_get_param(const ARRAY_TYPE(smtp_param) *params, return NULL; } +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) +{ + const struct smtp_param *param; + + param = smtp_params_get_param(params, keyword); + if (param == NULL) + return 0; + + *value_r = t_str_new(strlen(param->value) * 2); + if (smtp_xtext_decode(*value_r, param->value, allow_nul, error_r) <= 0) + return -1; + return 1; +} + bool smtp_params_equal(const ARRAY_TYPE(smtp_param) *params1, const ARRAY_TYPE(smtp_param) *params2) { @@ -569,6 +595,15 @@ void smtp_params_mail_add_extra(struct smtp_params_mail *params, pool_t pool, smtp_params_add_one(¶ms->extra_params, pool, keyword, value); } +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) +{ + smtp_params_add_encoded(¶ms->extra_params, pool, + keyword, value, value_len); +} + bool smtp_params_mail_drop_extra(struct smtp_params_mail *params, const char *keyword, const char **value_r) { @@ -713,6 +748,14 @@ smtp_params_mail_get_extra(const struct smtp_params_mail *params, return smtp_params_get_param(¶ms->extra_params, 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) +{ + return smtp_params_decode_param(¶ms->extra_params, + keyword, value_r, allow_nul, error_r); +} + /* events */ static void @@ -1119,6 +1162,15 @@ void smtp_params_rcpt_add_extra(struct smtp_params_rcpt *params, pool_t pool, smtp_params_add_one(¶ms->extra_params, pool, keyword, value); } +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) +{ + smtp_params_add_encoded(¶ms->extra_params, pool, + keyword, value, value_len); +} + bool smtp_params_rcpt_drop_extra(struct smtp_params_rcpt *params, const char *keyword, const char **value_r) { @@ -1221,6 +1273,14 @@ smtp_params_rcpt_get_extra(const struct smtp_params_rcpt *params, return smtp_params_get_param(¶ms->extra_params, 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) +{ + return smtp_params_decode_param(¶ms->extra_params, + keyword, value_r, allow_nul, error_r); +} + bool smtp_params_rcpt_equal(const struct smtp_params_rcpt *params1, const struct smtp_params_rcpt *params2) { diff --git a/src/lib-smtp/smtp-params.h b/src/lib-smtp/smtp-params.h index 777ec8a99f..b1aefc6503 100644 --- a/src/lib-smtp/smtp-params.h +++ b/src/lib-smtp/smtp-params.h @@ -90,6 +90,10 @@ void smtp_params_copy(pool_t pool, ARRAY_TYPE(smtp_param) *dst, 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); @@ -102,6 +106,9 @@ void smtp_param_write(string_t *out, const struct smtp_param *param); 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); @@ -128,6 +135,10 @@ void smtp_params_mail_copy(pool_t pool, struct smtp_params_mail *dst, 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); @@ -142,6 +153,9 @@ void smtp_params_mail_write(string_t *buffer, enum smtp_capability caps, 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 */ @@ -175,6 +189,10 @@ void smtp_params_rcpt_copy(pool_t pool, struct smtp_params_rcpt *dst, 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); @@ -192,6 +210,9 @@ void smtp_params_rcpt_write(string_t *buffer, enum smtp_capability caps, 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);