1 /* Copyright (c) 2011-2018 Dovecot authors, see the included COPYING file */
2 
3 #include "lib.h"
4 #include "settings-parser.h"
5 #include "mail-storage-settings.h"
6 #include "pop3c-settings.h"
7 
8 #include <stddef.h>
9 
10 #undef DEF
11 #define DEF(type, name) \
12 	SETTING_DEFINE_STRUCT_##type(#name, name, struct pop3c_settings)
13 
14 static const struct setting_define pop3c_setting_defines[] = {
15 	DEF(STR, pop3c_host),
16 	DEF(IN_PORT, pop3c_port),
17 
18 	DEF(STR_VARS, pop3c_user),
19 	DEF(STR_VARS, pop3c_master_user),
20 	DEF(STR, pop3c_password),
21 
22 	DEF(ENUM, pop3c_ssl),
23 	DEF(BOOL, pop3c_ssl_verify),
24 
25 	DEF(STR, pop3c_rawlog_dir),
26 	DEF(BOOL, pop3c_quick_received_date),
27 
28 	DEF(STR, pop3c_features),
29 
30 	SETTING_DEFINE_LIST_END
31 };
32 
33 static const struct pop3c_settings pop3c_default_settings = {
34 	.pop3c_host = "",
35 	.pop3c_port = 110,
36 
37 	.pop3c_user = "%u",
38 	.pop3c_master_user = "",
39 	.pop3c_password = "",
40 
41 	.pop3c_ssl = "no:pop3s:starttls",
42 	.pop3c_ssl_verify = TRUE,
43 
44 	.pop3c_rawlog_dir = "",
45 	.pop3c_quick_received_date = FALSE,
46 
47 	.pop3c_features = ""
48 };
49 
50 /* <settings checks> */
51 struct pop3c_feature_list {
52 	const char *name;
53 	enum pop3c_features num;
54 };
55 
56 static const struct pop3c_feature_list pop3c_feature_list[] = {
57 	{ "no-pipelining", POP3C_FEATURE_NO_PIPELINING },
58 	{ NULL, 0 }
59 };
60 
61 static int
pop3c_settings_parse_features(struct pop3c_settings * set,const char ** error_r)62 pop3c_settings_parse_features(struct pop3c_settings *set,
63 			      const char **error_r)
64 {
65 	enum pop3c_features features = 0;
66 	const struct pop3c_feature_list *list;
67 	const char *const *str;
68 
69 	str = t_strsplit_spaces(set->pop3c_features, " ,");
70 	for (; *str != NULL; str++) {
71 		list = pop3c_feature_list;
72 		for (; list->name != NULL; list++) {
73 			if (strcasecmp(*str, list->name) == 0) {
74 				features |= list->num;
75 				break;
76 			}
77 		}
78 		if (list->name == NULL) {
79 			*error_r = t_strdup_printf("pop3c_features: "
80 				"Unknown feature: %s", *str);
81 			return -1;
82 		}
83 	}
84 	set->parsed_features = features;
85 	return 0;
86 }
87 
pop3c_settings_check(void * _set,pool_t pool ATTR_UNUSED,const char ** error_r)88 static bool pop3c_settings_check(void *_set, pool_t pool ATTR_UNUSED,
89 				 const char **error_r)
90 {
91 	struct pop3c_settings *set = _set;
92 
93 	if (pop3c_settings_parse_features(set, error_r) < 0)
94 		return FALSE;
95 	return TRUE;
96 }
97 /* </settings checks> */
98 
99 static const struct setting_parser_info pop3c_setting_parser_info = {
100 	.module_name = "pop3c",
101 	.defines = pop3c_setting_defines,
102 	.defaults = &pop3c_default_settings,
103 
104 	.type_offset = SIZE_MAX,
105 	.struct_size = sizeof(struct pop3c_settings),
106 
107 	.parent_offset = SIZE_MAX,
108 	.parent = &mail_user_setting_parser_info,
109 
110         .check_func = pop3c_settings_check
111 };
112 
pop3c_get_setting_parser_info(void)113 const struct setting_parser_info *pop3c_get_setting_parser_info(void)
114 {
115 	return &pop3c_setting_parser_info;
116 }
117