Skip to content
Snippets Groups Projects
Commit 8c1aa3cd authored by Stephan Bosch's avatar Stephan Bosch Committed by Timo Sirainen
Browse files

plugins: settings: Expand settings plugin to collect all settings infos from lib-sieve and plugins

parent 7c4dde69
No related branches found
No related tags found
No related merge requests found
......@@ -58,6 +58,8 @@ doc/man/sieve-filter.1
doc/man/pigeonhole.7
doc/stamp-man
src/plugins/settings/pigeonhole-settings-dynamic.c
src/sieve-tools/sievec
src/sieve-tools/sieve-dump
src/sieve-tools/sieve-test
......
......@@ -153,6 +153,77 @@ else
fi
AM_CONDITIONAL(LDAP_PLUGIN, test "$have_ldap_plugin" = "yes")
dnl **
dnl ** Settings
dnl **
libsieve_setting_dirs="\
$srcdir/src/lib-sieve/storage/data \
$srcdir/src/lib-sieve/storage/file \
$srcdir/src/lib-sieve/storage/dict \
$srcdir/src/lib-sieve/plugins/vacation \
$srcdir/src/lib-sieve/plugins/subaddress \
$srcdir/src/lib-sieve/plugins/comparator-i-ascii-numeric \
$srcdir/src/lib-sieve/plugins/relational \
$srcdir/src/lib-sieve/plugins/regex \
$srcdir/src/lib-sieve/plugins/copy \
$srcdir/src/lib-sieve/plugins/imap4flags \
$srcdir/src/lib-sieve/plugins/include \
$srcdir/src/lib-sieve/plugins/body \
$srcdir/src/lib-sieve/plugins/variables \
$srcdir/src/lib-sieve/plugins/enotify \
$srcdir/src/lib-sieve/plugins/environment \
$srcdir/src/lib-sieve/plugins/mailbox \
$srcdir/src/lib-sieve/plugins/date \
$srcdir/src/lib-sieve/plugins/spamvirustest \
$srcdir/src/lib-sieve/plugins/ihave \
$srcdir/src/lib-sieve/plugins/editheader \
$srcdir/src/lib-sieve/plugins/duplicate \
$srcdir/src/lib-sieve/plugins/index \
$srcdir/src/lib-sieve/plugins/metadata \
$srcdir/src/lib-sieve/plugins/mime \
$srcdir/src/lib-sieve/plugins/special-use \
$srcdir/src/lib-sieve/plugins/vnd.dovecot/debug \
$srcdir/src/lib-sieve/plugins/vnd.dovecot/environment \
$srcdir/src/lib-sieve/plugins/vnd.dovecot/report"
if test $want_ldap != plugin; then
libsieve_setting_dirs="$libsieve_setting_dirs \
$srcdir/src/lib-sieve/storage/ldap"
fi
libsieve_headers=
libsieve_c_files=
non_libsieve_headers=
non_libsieve_c_files=
all_files=`find $srcdir/src -name '*.[[ch]]' | grep -v '/src/plugins/settings/' | grep -v '/src/managesieve' | grep -v '/test-' | xargs grep '\\(struct setting_parser_info [[a-z]]\\)\\|\\(struct service_settings [[a-z]]\\)\\|\\(<settings checks>\\)' | sed 's/:.*//' | sort | uniq`
for file in $all_files; do
dir=`echo "$file" | sed 's:/[[^/]]*$::'`
if echo "$libsieve_setting_dirs" | grep "$dir" >/dev/null; then
dnl lib-sieve
if echo "$file" | grep '\.h$' >/dev/null; then
libsieve_headers="$libsieve_headers $file"
else
libsieve_c_files="$libsieve_c_files $file"
fi
else
dnl not lib-sieve
if echo "$file" | grep '\.h$' >/dev/null; then
non_libsieve_headers="$non_libsieve_headers $file"
else
non_libsieve_c_files="$non_libsieve_c_files $file"
fi
fi
done
dnl libsieve is linked to pigeonhole-settings plugin, so don't duplicate the .c
dnl file contents. However, we still need to scan the .c files for any
dnl setting_parser_infos that aren't elsewhere.
# list headers first, C files last
SETTING_FILES=`echo $libsieve_headers $non_libsieve_headers $non_libsieve_c_files | sed -e s,$srcdir/src,./src,g -e 's,./src,$(top_srcdir)/src,g'`
SETTING_LINKED_FILES=`echo $libsieve_c_files | sed -e s,$srcdir/src,./src,g -e 's,./src,$(top_srcdir)/src,g'`
AC_SUBST(SETTING_FILES)
AC_SUBST(SETTING_LINKED_FILES)
CFLAGS="$CFLAGS $EXTRA_CFLAGS"
LDFLAGS="$LDFLAGS $EXTRA_LDFLAGS"
......
settingsdir = $(dovecot_moduledir)/settings
AM_CPPFLAGS = \
$(LIBDOVECOT_INCLUDE)
$(LIBDOVECOT_INCLUDE) \
-I$(top_srcdir) \
-I$(top_srcdir)/src/lib-sieve \
-DSETTINGS_PLUGIN
libpigeonhole_settings_la_LDFLAGS = -module -avoid-version
......@@ -9,4 +12,20 @@ settings_LTLIBRARIES = \
libpigeonhole_settings.la
libpigeonhole_settings_la_SOURCES = \
pigeonhole-settings-dynamic.c \
pigeonhole-settings.c
libpigeonhole_settings_la_LIBADD = \
$(top_builddir)/src/lib-sieve/libdovecot-sieve.la
libpigeonhole_settings_la_DEPENDENCIES = \
$(top_builddir)/src/lib-sieve/libdovecot-sieve.la
noinst_HEADERS = \
pigeonhole-settings.h
pigeonhole-settings-dynamic.c: $(SETTING_FILES) $(SETTING_LINKED_FILES) $(top_srcdir)/src/plugins/settings/settings-get.pl
$(AM_V_GEN)$(top_srcdir)/src/plugins/settings/settings-get.pl \
$(SETTING_FILES) -- $(SETTING_LINKED_FILES) > pigeonhole-settings-dynamic.c || \
rm -f pigeonhole-settings-dynamic.c
EXTRA_DIST = \
settings-get.pl
/* WARNING: THIS FILE IS GENERATED - DO NOT PATCH!
It's not enough alone in any case, because the defaults may be
coming from the individual *-settings.c in some situations. If you
wish to modify defaults, change the other *-settings.c files and
just delete this file. This file will be automatically regenerated
by make. (This file is distributed in the tarball only because some
systems might not have Perl installed.) */
#include "lib.h"
#include "array.h"
#include "str.h"
#include "ipwd.h"
#include "var-expand.h"
#include "file-lock.h"
#include "fsync-mode.h"
#include "hash-format.h"
#include "net.h"
#include "unichar.h"
#include "hash-method.h"
#include "settings.h"
#include "message-header-parser.h"
#include "sieve-common.h"
#include "sieve-limits.h"
#include "sieve-address-source.h"
#include "managesieve-url.h"
#include "pigeonhole-settings.h"
#include <unistd.h>
#define CONFIG_BINARY
/* ../../../src/lib-sieve/sieve-settings.h */
struct sieve_settings {
pool_t pool;
bool enabled;
size_t max_script_size;
unsigned int max_actions;
unsigned int max_redirects;
unsigned int max_cpu_time;
unsigned int resource_usage_timeout;
const char* redirect_envelope_from;
unsigned int redirect_duplicate_period;
const char *user_email;
const char *user_log;
const char *trace_dir;
const char *trace_level;
bool trace_debug;
bool trace_addresses;
struct {
struct sieve_address_source redirect_envelope_from;
const struct smtp_address *user_email;
} parsed;
};
/* ../../../src/lib-sieve/sieve-storage-settings.h */
struct sieve_storage_settings {
pool_t pool;
const char *script_storage;
const char *script_type;
ARRAY_TYPE(const_string) script_cause;
const char *script_driver;
const char *script_name;
const char *script_bin_path;
uoff_t quota_max_storage;
unsigned int quota_max_scripts;
ARRAY_TYPE(const_string) storages;
};
/* ../../../src/lib-sieve/storage/file/sieve-file-storage-settings.h */
#define SIEVE_FILE_DEFAULT_ACTIVE_PATH "~/.dovecot."SIEVE_SCRIPT_FILEEXT
struct sieve_file_storage_settings {
pool_t pool;
const char *script_path;
const char *script_active_path;
};
/* ../../../src/lib-sieve/storage/ldap/sieve-ldap-storage-settings.h */
struct sieve_ldap_settings {
pool_t pool;
const char *hosts;
const char *uris;
const char *dn;
const char *dnpass;
bool tls;
bool sasl_bind;
const char *sasl_mech;
const char *sasl_realm;
const char *sasl_authz_id;
const char *tls_ca_cert_file;
const char *tls_ca_cert_dir;
const char *tls_cert_file;
const char *tls_key_file;
const char *tls_cipher_suite;
const char *tls_require_cert;
const char *deref;
const char *scope;
const char *base;
unsigned int ldap_version;
const char *ldaprc_path;
const char *debug_level;
/* parsed */
int parsed_deref, parsed_scope, parsed_tls_require_cert;
};
struct sieve_ldap_storage_settings {
pool_t pool;
const char *script_attr;
const char *mod_attr;
const char *filter;
};
/* ../../../src/plugins/imapsieve/imap-sieve-settings.h */
struct imap_sieve_settings {
pool_t pool;
const char *url;
bool expunge_discarded;
};
/* ../../../src/plugins/imapsieve/imap-sieve-settings.c */
extern const struct setting_parser_info imap_sieve_setting_parser_info;
/* <settings checks> */
static bool
imap_sieve_settings_check(void *_set, pool_t pool ATTR_UNUSED,
const char **error_r)
{
struct imap_sieve_settings *set = _set;
const char *error;
if (*set->url != '\0' &&
managesieve_url_parse(set->url, 0, pool_datastack_create(),
NULL, &error) < 0) {
*error_r = t_strdup_printf(
"Invalid URL for imapsieve_url setting: %s",
set->url);
return FALSE;
}
return TRUE;
}
/* </settings checks> */
#undef DEF
#define DEF(type, name) \
SETTING_DEFINE_STRUCT_##type("imapsieve_"#name, name, \
struct imap_sieve_settings)
static const struct setting_define imap_sieve_setting_defines[] = {
{ .type = SET_FILTER_EXTRA, .key = "imapsieve_from",
.filter_array_field_name = "sieve_script_imapsieve_from" },
DEF(STR, url),
DEF(BOOL, expunge_discarded),
SETTING_DEFINE_LIST_END,
};
static const struct imap_sieve_settings imap_sieve_default_settings = {
.url = "",
.expunge_discarded = FALSE,
};
const struct setting_parser_info imap_sieve_setting_parser_info = {
.name = "imapsieve",
.defines = imap_sieve_setting_defines,
.defaults = &imap_sieve_default_settings,
.struct_size = sizeof(struct imap_sieve_settings),
.check_func = imap_sieve_settings_check,
.pool_offset1 = 1 + offsetof(struct imap_sieve_settings, pool),
};
/* ../../../src/lib-sieve/sieve-settings.c */
extern const struct setting_parser_info sieve_setting_parser_info;
/* ../../../src/lib-sieve/sieve-storage-settings.c */
extern const struct setting_parser_info sieve_storage_setting_parser_info;
/* ../../../src/lib-sieve/storage/file/sieve-file-storage-settings.c */
extern const struct setting_parser_info sieve_file_storage_setting_parser_info;
/* ../../../src/lib-sieve/storage/ldap/sieve-ldap-storage-settings.c */
extern const struct setting_parser_info sieve_ldap_setting_parser_info;
extern const struct setting_parser_info sieve_ldap_storage_setting_parser_info;
const struct setting_parser_info *pigeonhole_settings_set_infos[] = {
&imap_sieve_setting_parser_info,
&sieve_file_storage_setting_parser_info,
#if defined(SIEVE_BUILTIN_LDAP) || defined(PLUGIN_BUILD)
&sieve_ldap_setting_parser_info,
#endif
#if defined(SIEVE_BUILTIN_LDAP) || defined(PLUGIN_BUILD)
&sieve_ldap_storage_setting_parser_info,
#endif
&sieve_setting_parser_info,
&sieve_storage_setting_parser_info,
NULL
};
......@@ -5,8 +5,9 @@
#include "pigeonhole-config.h"
#include "pigeonhole-version.h"
/* This is currently just a dummy plugin that adds a Pigeonhole version banner
the doveconf output.
#include "pigeonhole-settings.h"
/* This adds a Pigeonhole version banner the doveconf output.
*/
const char *pigeonhole_settings_version = DOVECOT_ABI_VERSION;
......
#ifndef PIGEONHOLE_SETTINGS_H
#define PIGEONHOLE_SETTINGS_H
extern const char *pigeonhole_settings_version;
extern const char *pigeonhole_settings_doveconf_banner;
extern const struct setting_parser_info *pigeonhole_settings_set_infos[];
#endif
#!/usr/bin/env perl
use strict;
use warnings;
use 5.008;
print "/* WARNING: THIS FILE IS GENERATED - DO NOT PATCH!\n";
print " It's not enough alone in any case, because the defaults may be\n";
print " coming from the individual *-settings.c in some situations. If you\n";
print " wish to modify defaults, change the other *-settings.c files and\n";
print " just delete this file. This file will be automatically regenerated\n";
print " by make. (This file is distributed in the tarball only because some\n";
print " systems might not have Perl installed.) */\n";
print '#include "lib.h"'."\n";
print '#include "array.h"'."\n";
print '#include "str.h"'."\n";
print '#include "ipwd.h"'."\n";
print '#include "var-expand.h"'."\n";
print '#include "file-lock.h"'."\n";
print '#include "fsync-mode.h"'."\n";
print '#include "hash-format.h"'."\n";
print '#include "net.h"'."\n";
print '#include "unichar.h"'."\n";
print '#include "hash-method.h"'."\n";
print '#include "settings.h"'."\n";
print '#include "message-header-parser.h"'."\n";
print '#include "sieve-common.h"'."\n";
print '#include "sieve-limits.h"'."\n";
print '#include "sieve-address-source.h"'."\n";
print '#include "pigeonhole-settings.h"'."\n";
print '#include <unistd.h>'."\n";
print '#define CONFIG_BINARY'."\n";
my @services = ();
my %service_defaults = ();
my %infos = ();
my $linked_file = 0;
foreach my $file (@ARGV) {
if ($file eq "--") {
$linked_file = 1;
next;
}
my $f;
open($f, $file) || die "Can't open $file: $@";
my $state = "root";
my $file_contents = "";
my $externs = "";
my $code = "";
my @ifdefs = ();
my $ifdefs_open = 0;
while (<$f>) {
my $write = 0;
if ($state eq "root") {
if (/(^#ifdef .*)$/ || /^(#if .*)$/) {
push @ifdefs, $1;
} elsif (/^#endif/) {
pop @ifdefs;
}
if (/struct .*_settings \{/ ||
/struct setting_define.*\{/ ||
/struct .*_default_settings = \{/ ||
/struct setting_keyvalue.*_default_settings_keyvalue\[\] = \{/) {
# settings-related structure - copy.
$state = "copy-to-end-of-block";
} elsif (/^struct service_settings (.*) = \{/) {
# service settings - copy and add to list of services.
$state = "copy-to-end-of-block";
push @services, $1;
} elsif (/^const struct setting_keyvalue (.*_defaults)\[\] = \{/) {
# service's default settings as keyvalues - copy and add to list of
# defaults.
$service_defaults{$1} = 1;
$state = "copy-to-end-of-block";
} elsif (/^const struct setting_parser_info (.*) = \{/) {
# info structure for settings
my $cur_name = $1;
$infos{$cur_name} = join("\n", @ifdefs)."\n\t&$cur_name,\n"."#endif\n" x scalar(@ifdefs);
# Add forward declaration for the info struct. This may be needed by
# the ext_check() functions.
$externs .= "extern const struct setting_parser_info $cur_name;\n";
$state = "copy-to-end-of-block";
} elsif (/\/\* <settings checks> \*\//) {
# Anything inside <settings check> ... </settings check> is copied.
$state = "copy-to-end-of-settings-checks";
$code .= join("\n", @ifdefs)."\n";
$ifdefs_open = scalar @ifdefs;
$code .= $_;
}
if (/#define.*DEF/ || /^#undef.*DEF/ || /ARRAY_DEFINE_TYPE.*_settings/) {
# macro for setting_define { ... } - copy.
$write = 1;
if (/\\$/) {
# multi-line macro
$state = "copy-to-end-of-macro";
}
}
} elsif ($state eq "copy-to-end-of-macro") {
# Continue copying macro until the line doesn't end with '\'
$write = 1;
$state = "root" if (!/\\$/);
} elsif ($state eq "copy-to-end-of-settings-checks") {
$code .= $_;
if (/\/\* <\/settings checks> \*\//) {
$state = "root";
$code .= "#endif\n" x $ifdefs_open;
$ifdefs_open = 0;
}
}
if ($state eq "copy-to-end-of-block") {
$write = 1;
if (/};/) {
$state = "root";
}
}
if ($write) {
if (scalar @ifdefs > 0 && $ifdefs_open == 0) {
$file_contents .= join("\n", @ifdefs)."\n";
$ifdefs_open = scalar @ifdefs;
}
$file_contents .= $_;
if ($state eq "root" && $ifdefs_open > 0) {
$file_contents .= "#endif\n" x $ifdefs_open;
$ifdefs_open = 0;
}
}
}
print "/* $file */\n";
print $externs;
if ($linked_file) {
# The code and contents are already linked via libdovecot.so. Don't add
# them again.
} else {
print $code;
print $file_contents;
}
close $f;
}
# Write a list of all settings infos.
print "const struct setting_parser_info *pigeonhole_settings_set_infos[] = {\n";
foreach my $name (sort(keys %infos)) {
print $infos{$name};
}
print "\tNULL\n";
print "};\n";
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment

Consent

On this website, we use the web analytics service Matomo to analyze and review the use of our website. Through the collected statistics, we can improve our offerings and make them more appealing for you. Here, you can decide whether to allow us to process your data and set corresponding cookies for these purposes, in addition to technically necessary cookies. Further information on data protection—especially regarding "cookies" and "Matomo"—can be found in our privacy policy. You can withdraw your consent at any time.