1 /* Copyright (c) 2002-2018 Pigeonhole authors, see the included COPYING file
2  */
3 
4 #include "lib.h"
5 #include "buffer.h"
6 #include "settings-parser.h"
7 #include "service-settings.h"
8 #include "mail-storage-settings.h"
9 
10 #include "pigeonhole-config.h"
11 
12 #include "managesieve-settings.h"
13 
14 #include <stddef.h>
15 #include <unistd.h>
16 
17 static bool managesieve_settings_verify(void *_set, pool_t pool,
18 				 const char **error_r);
19 
20 /* <settings checks> */
21 static struct file_listener_settings managesieve_unix_listeners_array[] = {
22 	{ "login/sieve", 0666, "", "" }
23 };
24 static struct file_listener_settings *managesieve_unix_listeners[] = {
25 	&managesieve_unix_listeners_array[0]
26 };
27 static buffer_t managesieve_unix_listeners_buf = {
28 	{ { managesieve_unix_listeners, sizeof(managesieve_unix_listeners) } }
29 };
30 /* </settings checks> */
31 
32 struct service_settings managesieve_settings_service_settings = {
33 	.name = "managesieve",
34 	.protocol = "sieve",
35 	.type = "",
36 	.executable = "managesieve",
37 	.user = "",
38 	.group = "",
39 	.privileged_group = "",
40 	.extra_groups = "",
41 	.chroot = "",
42 
43 	.drop_priv_before_exec = FALSE,
44 
45 	.process_min_avail = 0,
46 	.process_limit = 0,
47 	.client_limit = 1,
48 	.service_count = 1,
49 	.idle_kill = 0,
50 	.vsz_limit = (uoff_t)-1,
51 
52 	.unix_listeners = { { &managesieve_unix_listeners_buf,
53 				   sizeof(managesieve_unix_listeners[0]) } },
54 	.fifo_listeners = ARRAY_INIT,
55 	.inet_listeners = ARRAY_INIT
56 };
57 
58 #undef DEF
59 #define DEF(type, name) \
60 	SETTING_DEFINE_STRUCT_##type(#name, name, struct managesieve_settings)
61 
62 static struct setting_define managesieve_setting_defines[] = {
63 	DEF(BOOL, mail_debug),
64 	DEF(BOOL, verbose_proctitle),
65 	DEF(STR_VARS, rawlog_dir),
66 
67 	DEF(SIZE, managesieve_max_line_length),
68 	DEF(STR, managesieve_implementation_string),
69 	DEF(STR, managesieve_client_workarounds),
70 	DEF(STR, managesieve_logout_format),
71 	DEF(UINT, managesieve_max_compile_errors),
72 
73 
74 	SETTING_DEFINE_LIST_END
75 };
76 
77 static struct managesieve_settings managesieve_default_settings = {
78 	.mail_debug = FALSE,
79 	.verbose_proctitle = FALSE,
80 	.rawlog_dir = "",
81 
82 	/* RFC-2683 recommends at least 8000 bytes. Some clients however don't
83 	   break large message sets to multiple commands, so we're pretty
84 	   liberal by default. */
85 	.managesieve_max_line_length = 65536,
86 	.managesieve_implementation_string = DOVECOT_NAME " " PIGEONHOLE_NAME,
87 	.managesieve_client_workarounds = "",
88 	.managesieve_logout_format = "bytes=%i/%o",
89 	.managesieve_max_compile_errors = 5
90 };
91 
92 static const struct setting_parser_info *managesieve_setting_dependencies[] = {
93 	&mail_user_setting_parser_info,
94 	NULL
95 };
96 
97 const struct setting_parser_info managesieve_setting_parser_info = {
98 	.module_name = "managesieve",
99 	.defines = managesieve_setting_defines,
100 	.defaults = &managesieve_default_settings,
101 
102 	.type_offset = (size_t)-1,
103 	.struct_size = sizeof(struct managesieve_settings),
104 
105 	.parent_offset = (size_t)-1,
106 	.parent = NULL,
107 
108 	.check_func = managesieve_settings_verify,
109 	.dependencies = managesieve_setting_dependencies
110 };
111 
112 const struct setting_parser_info *managesieve_settings_set_roots[] = {
113 	&managesieve_setting_parser_info,
114 	NULL
115 };
116 
117 /* <settings checks> */
118 struct managesieve_client_workaround_list {
119 	const char *name;
120 	enum managesieve_client_workarounds num;
121 };
122 
123 static const struct managesieve_client_workaround_list
124 managesieve_client_workaround_list[] = {
125 	{ NULL, 0 }
126 };
127 
128 static int
managesieve_settings_parse_workarounds(struct managesieve_settings * set,const char ** error_r)129 managesieve_settings_parse_workarounds(struct managesieve_settings *set,
130 				       const char **error_r)
131 {
132 	enum managesieve_client_workarounds client_workarounds = 0;
133 	const struct managesieve_client_workaround_list *list;
134 	const char *const *str;
135 
136 	str = t_strsplit_spaces(set->managesieve_client_workarounds, " ,");
137 	for (; *str != NULL; str++) {
138 		list = managesieve_client_workaround_list;
139 		for (; list->name != NULL; list++) {
140 			if (strcasecmp(*str, list->name) == 0) {
141 				client_workarounds |= list->num;
142 				break;
143 			}
144 		}
145 		if (list->name == NULL) {
146 			*error_r = t_strdup_printf(
147 				"managesieve_client_workarounds: "
148 				"Unknown workaround: %s", *str);
149 			return -1;
150 		}
151 	}
152 	set->parsed_workarounds = client_workarounds;
153 	return 0;
154 }
155 
156 
157 static bool
managesieve_settings_verify(void * _set,pool_t pool ATTR_UNUSED,const char ** error_r)158 managesieve_settings_verify(void *_set, pool_t pool ATTR_UNUSED,
159 			    const char **error_r)
160 {
161 	struct managesieve_settings *set = _set;
162 
163 	if (managesieve_settings_parse_workarounds(set, error_r) < 0)
164 		return FALSE;
165 	return TRUE;
166 }
167 
168 /* </settings checks> */
169 
170 const char *managesieve_settings_version = DOVECOT_ABI_VERSION;
171