]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-smtp: smtp-params - Add support for xtext-encoding/decoding extra parameters.
authorStephan Bosch <stephan.bosch@open-xchange.com>
Wed, 22 Apr 2020 00:27:05 +0000 (02:27 +0200)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Wed, 27 May 2020 05:32:15 +0000 (05:32 +0000)
src/lib-smtp/smtp-params.c
src/lib-smtp/smtp-params.h

index 2592955857201bf0d8936181b60a79be0b21b0cc..ea6b2654b347fc4c3aa2119d0efe408d14487064 100644 (file)
@@ -124,6 +124,16 @@ void smtp_params_add_one(ARRAY_TYPE(smtp_param) *params, pool_t pool,
        array_push_back(params, &param);
 }
 
+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(&params->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(&params->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(&params->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(&params->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(&params->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(&params->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(&params->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(&params->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)
 {
index 777ec8a99fb622dfa7b555b325d2774e7bb8a415..b1aefc6503926e62bbceb942f4dda33b3f23ccc3 100644 (file)
@@ -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);