/src/pigeonhole/src/lib-sieve/sieve-address-source.c
Line | Count | Source |
1 | | /* Copyright (c) Pigeonhole authors, see top-level COPYING file */ |
2 | | |
3 | | #include "lib.h" |
4 | | |
5 | | #include "sieve-common.h" |
6 | | #include "sieve-error.h" |
7 | | #include "sieve-address.h" |
8 | | #include "sieve-message.h" |
9 | | |
10 | | #include "sieve-address-source.h" |
11 | | |
12 | | bool sieve_address_source_parse(pool_t pool, const char *value, |
13 | | struct sieve_address_source *asrc) |
14 | 0 | { |
15 | 0 | struct smtp_address *address; |
16 | 0 | const char *error; |
17 | 0 | size_t val_len; |
18 | |
|
19 | 0 | i_zero(asrc); |
20 | |
|
21 | 0 | value = t_str_trim(value, "\t "); |
22 | 0 | value = t_str_lcase(value); |
23 | 0 | val_len = strlen(value); |
24 | 0 | if (val_len > 0) { |
25 | 0 | if (strcmp(value, "default") == 0) { |
26 | 0 | asrc->type = SIEVE_ADDRESS_SOURCE_DEFAULT; |
27 | 0 | } else if (strcmp(value, "sender") == 0) { |
28 | 0 | asrc->type = SIEVE_ADDRESS_SOURCE_SENDER; |
29 | 0 | } else if (strcmp(value, "recipient") == 0) { |
30 | 0 | asrc->type = SIEVE_ADDRESS_SOURCE_RECIPIENT; |
31 | 0 | } else if (strcmp(value, "orig_recipient") == 0) { |
32 | 0 | asrc->type = SIEVE_ADDRESS_SOURCE_ORIG_RECIPIENT; |
33 | 0 | } else if (strcmp(value, "user_email") == 0) { |
34 | 0 | asrc->type = SIEVE_ADDRESS_SOURCE_USER_EMAIL; |
35 | 0 | } else if (strcmp(value, "postmaster") == 0) { |
36 | 0 | asrc->type = SIEVE_ADDRESS_SOURCE_POSTMASTER; |
37 | 0 | } else if (smtp_address_parse_path( |
38 | 0 | pool_datastack_create(), value, |
39 | 0 | SMTP_ADDRESS_PARSE_FLAG_ALLOW_EMPTY, |
40 | 0 | &address, &error) >= 0) { |
41 | 0 | asrc->type = SIEVE_ADDRESS_SOURCE_EXPLICIT; |
42 | 0 | asrc->address = smtp_address_clone(pool, address); |
43 | 0 | } else { |
44 | 0 | return FALSE; |
45 | 0 | } |
46 | 0 | } |
47 | 0 | return TRUE; |
48 | 0 | } |
49 | | |
50 | | int sieve_address_source_get_address(struct sieve_address_source *asrc, |
51 | | struct sieve_instance *svinst, |
52 | | const struct sieve_script_env *senv, |
53 | | struct sieve_message_context *msgctx, |
54 | | enum sieve_execute_flags flags, |
55 | | const struct smtp_address **addr_r) |
56 | 0 | { |
57 | 0 | enum sieve_address_source_type type = asrc->type; |
58 | |
|
59 | 0 | if (type == SIEVE_ADDRESS_SOURCE_USER_EMAIL && |
60 | 0 | svinst->set->parsed.user_email == NULL) |
61 | 0 | type = SIEVE_ADDRESS_SOURCE_RECIPIENT; |
62 | |
|
63 | 0 | if ((flags & SIEVE_EXECUTE_FLAG_NO_ENVELOPE) != 0) { |
64 | 0 | switch (type) { |
65 | 0 | case SIEVE_ADDRESS_SOURCE_SENDER: |
66 | 0 | case SIEVE_ADDRESS_SOURCE_RECIPIENT: |
67 | 0 | case SIEVE_ADDRESS_SOURCE_ORIG_RECIPIENT: |
68 | | /* We have no envelope */ |
69 | 0 | type = SIEVE_ADDRESS_SOURCE_DEFAULT; |
70 | 0 | break; |
71 | 0 | default: |
72 | 0 | break; |
73 | 0 | } |
74 | 0 | } |
75 | | |
76 | 0 | switch (type) { |
77 | 0 | case SIEVE_ADDRESS_SOURCE_SENDER: |
78 | 0 | *addr_r = sieve_message_get_sender(msgctx); |
79 | 0 | return 1; |
80 | 0 | case SIEVE_ADDRESS_SOURCE_RECIPIENT: |
81 | 0 | *addr_r = sieve_message_get_final_recipient(msgctx); |
82 | 0 | return 1; |
83 | 0 | case SIEVE_ADDRESS_SOURCE_ORIG_RECIPIENT: |
84 | 0 | *addr_r = sieve_message_get_orig_recipient(msgctx); |
85 | 0 | return 1; |
86 | 0 | case SIEVE_ADDRESS_SOURCE_USER_EMAIL: |
87 | 0 | *addr_r = svinst->set->parsed.user_email; |
88 | 0 | return 1; |
89 | 0 | case SIEVE_ADDRESS_SOURCE_POSTMASTER: |
90 | 0 | *addr_r = sieve_get_postmaster_smtp(senv); |
91 | 0 | return 1; |
92 | 0 | case SIEVE_ADDRESS_SOURCE_EXPLICIT: |
93 | 0 | *addr_r = asrc->address; |
94 | 0 | return 1; |
95 | 0 | case SIEVE_ADDRESS_SOURCE_DEFAULT: |
96 | 0 | break; |
97 | 0 | } |
98 | 0 | return 0; |
99 | 0 | } |