Coverage Report

Created: 2026-07-16 07:09

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/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
}