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/plugins/mime/ext-extracttext.c
Line
Count
Source
1
/* Copyright (c) Pigeonhole authors, see top-level COPYING file */
2
3
/* Extension extracttext
4
 * ---------------------
5
 *
6
 * Authors: Stephan Bosch
7
 * Specification: RFC 5703, Section 7
8
 * Implementation: full
9
 * Status: experimental
10
 *
11
 */
12
13
#include "sieve-common.h"
14
15
#include "sieve-code.h"
16
#include "sieve-extensions.h"
17
#include "sieve-actions.h"
18
#include "sieve-commands.h"
19
#include "sieve-validator.h"
20
#include "sieve-generator.h"
21
#include "sieve-interpreter.h"
22
#include "sieve-result.h"
23
24
#include "sieve-ext-variables.h"
25
26
#include "ext-mime-common.h"
27
28
/*
29
 * Extension
30
 */
31
32
static int
33
ext_extracttext_load(const struct sieve_extension *ext, void **context_r);
34
static void
35
ext_extracttext_unload(const struct sieve_extension *ext);
36
static bool
37
ext_extracttext_validator_load(const struct sieve_extension *ext,
38
             struct sieve_validator *valdtr);
39
40
const struct sieve_extension_def extracttext_extension = {
41
  .name = "extracttext",
42
  .load = ext_extracttext_load,
43
  .unload = ext_extracttext_unload,
44
  .validator_load = ext_extracttext_validator_load,
45
  SIEVE_EXT_DEFINE_OPERATION(extracttext_operation),
46
};
47
48
static int
49
ext_extracttext_load(const struct sieve_extension *ext, void **context_r)
50
0
{
51
0
  struct sieve_instance *svinst = ext->svinst;
52
0
  const struct sieve_extension *var_ext;
53
0
  const struct sieve_extension *fep_ext;
54
0
  struct ext_extracttext_context *extctx;
55
56
0
  if (sieve_ext_variables_get_extension(ext->svinst, &var_ext) < 0)
57
0
    return -1;
58
0
  if (sieve_extension_register(svinst, &foreverypart_extension, FALSE,
59
0
             &fep_ext) < 0)
60
0
    return -1;
61
62
0
  extctx = i_new(struct ext_extracttext_context, 1);
63
0
  extctx->var_ext = var_ext;
64
0
  extctx->fep_ext = fep_ext;
65
66
0
  *context_r = extctx;
67
0
  return 0;
68
0
}
69
70
static void ext_extracttext_unload(const struct sieve_extension *ext)
71
0
{
72
0
  struct ext_extracttext_context *extctx = ext->context;
73
74
0
  i_free(extctx);
75
0
}
76
77
/*
78
 * Extension validation
79
 */
80
81
static bool
82
ext_extracttext_validator_validate(
83
  const struct sieve_extension *ext, struct sieve_validator *valdtr,
84
  void *context, struct sieve_ast_argument *require_arg, bool required);
85
86
const struct sieve_validator_extension
87
extracttext_validator_extension = {
88
  .ext = &extracttext_extension,
89
  .validate = ext_extracttext_validator_validate,
90
};
91
92
static bool
93
ext_extracttext_validator_load(const struct sieve_extension *ext,
94
             struct sieve_validator *valdtr)
95
0
{
96
  /* Register validator extension to check for conflict with eextracttext.
97
   */
98
0
  sieve_validator_extension_register(
99
0
    valdtr, ext, &extracttext_validator_extension, NULL);
100
101
  /* Register new commands */
102
0
  sieve_validator_register_command(valdtr, ext, &cmd_extracttext);
103
104
0
  return TRUE;
105
0
}
106
107
static bool
108
ext_extracttext_validator_validate(const struct sieve_extension *ext,
109
           struct sieve_validator *valdtr,
110
           void *context ATTR_UNUSED,
111
           struct sieve_ast_argument *require_arg,
112
           bool required ATTR_UNUSED)
113
0
{
114
0
  struct ext_extracttext_context *extctx = ext->context;
115
116
0
  if (extctx->var_ext == NULL ||
117
0
      !sieve_ext_variables_is_active(extctx->var_ext, valdtr) ) {
118
0
    sieve_argument_validate_error(
119
0
      valdtr, require_arg,
120
0
      "extracttext extension cannot be used "
121
0
      "without variables extension");
122
0
    return FALSE;
123
0
  }
124
0
  if (extctx->fep_ext == NULL ||
125
0
      !sieve_validator_extension_loaded(valdtr, extctx->fep_ext) ) {
126
0
    sieve_argument_validate_error(
127
0
      valdtr, require_arg,
128
0
      "extracttext extension cannot be used "
129
0
      "without foreverypart extension");
130
0
    return FALSE;
131
0
  }
132
0
  return TRUE;
133
0
}