]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-smtp: params: Add function that allows checking whether RCPT parameters are equal.
authorStephan Bosch <stephan.bosch@dovecot.fi>
Sat, 13 Jan 2018 10:52:31 +0000 (11:52 +0100)
committerAki Tuomi <aki.tuomi@open-xchange.com>
Thu, 18 Jan 2018 07:10:12 +0000 (09:10 +0200)
src/lib-smtp/smtp-params.c
src/lib-smtp/smtp-params.h

index 201f56908ff40a62d90edc625036424dece1d28a..7f28be79fe773eb31c932bc9384b56d706dfc162 100644 (file)
@@ -1022,3 +1022,48 @@ smtp_params_rcpt_get_extra(const struct smtp_params_rcpt *params,
        }
        return NULL;
 }
+
+bool smtp_params_rcpt_equals(const struct smtp_params_rcpt *params1,
+                            const struct smtp_params_rcpt *params2)
+{
+       if (params1 == NULL || params2 == NULL)
+               return (params1 == params2);
+
+       /* NOTIFY: RFC 3461, Section 4.1 */
+       if (params1->notify != params2->notify)
+               return FALSE;
+
+       /* ORCPT: RFC 3461, Section 4.2 */
+       if (null_strcasecmp(params1->orcpt.addr_type,
+                           params2->orcpt.addr_type) != 0)
+               return FALSE;
+       if (null_strcasecmp(params1->orcpt.addr_type, "rfc822") == 0) {
+               if (!smtp_address_equals(params1->orcpt.addr,
+                                        params2->orcpt.addr))
+                       return FALSE;
+       } else {
+               if (null_strcmp(params1->orcpt.addr_raw,
+                               params2->orcpt.addr_raw) != 0)
+                       return FALSE;
+       }
+
+       /* extra parameters */
+       if (array_is_created(&params1->extra_params) !=
+           array_is_created(&params2->extra_params))
+               return FALSE;
+       if (array_is_created(&params1->extra_params)) {
+               const struct smtp_param *param1, *param2;
+       
+               if (array_count(&params1->extra_params) !=
+                   array_count(&params2->extra_params))
+                       return FALSE;
+               array_foreach(&params1->extra_params, param1) {
+                       param2 = smtp_params_rcpt_get_extra(params2, param1->keyword);
+                       if (param2 == NULL)
+                               return FALSE;
+                       if (null_strcmp(param1->value, param2->value) != 0)
+                               return FALSE;
+               }
+       }
+       return TRUE;
+}
index 301d25895ca0e4d9240d356e5ad12c54046d25d6..fe9d77938802b698388c6e6194a123c40ef2343d 100644 (file)
@@ -126,4 +126,7 @@ const struct smtp_param *
 smtp_params_rcpt_get_extra(const struct smtp_params_rcpt *params,
                           const char *keyword);
 
+bool smtp_params_rcpt_equals(const struct smtp_params_rcpt *params1,
+                            const struct smtp_params_rcpt *params2);
+
 #endif